2012年8月20日 星期一

TUI 撰寫與 i18n(internationalization)

1. TUI


 TUI 全名為 Text-based_user_interface , 其示意圖如下圖般。
其目標旨於提供使用者,透過簡易的介面,便可將軟體設定或安裝。

2. i18n

 i18n 全名為 internationalization (國際化) 由於i至n中間有18個字母 所以簡稱i18n。由於軟體的推廣,最重要的除了宣傳外,當然親切的介面使用與當地語言的支持是相當重要的。
為了考慮這一點。 將軟體的使用者介面語言做重新打包,再將這些文件交由他人來翻譯,來提升使用者的使用經驗。


----

TUI


在純shell script 環境 使用的是 dialog
Ubuntu 預設會安裝,而最小安裝的CentOS則必須額外安裝此package。

yes_no


textbox


inputbox


MENU


yesno



 
#!/bin/bash
dialog --yesno "提示資訊這邊將會顯示於" 5 40
if [ $? -eq 0 ]; then
    echo "accpet"
else
    echo "cancel"
fi

=== textbox ===
 

#!/bin/bash
dialog --textbox /etc/hosts 5 40
if [ $? -eq 0 ]; then
    echo "accpet"
else
    echo "cancel"
fi


=== inputbox ===
 

#!/bin/bash
dialog --backtitle ezilla --inputbox "顯示資訊" 10 75 "預設文字編輯框內容" 2> $HOME/dialog_tmp
text=`cat $HOME/dialog_tmp`
echo You input "$text".
echo $text


=== MENU ===
 

#!/bin/bash
INPUT=$HOME/tmp_INPUT
dialog --clear --backtitle "ezilla" --title "[主選單]" --menu "你可以透過上下箭頭按鈕, 或是選單的第一個英文字母作為熱鍵 ,也可選用 數字鍵 1-9 去選擇所需的選項" 15 50 4 \
Client-Intsall "安裝Ezilla-Client" Uninstall "移除Ezilla專案" Exit "離開" \
2>"${INPUT}"
echo `cat $INPUT`



i18n


由於 自由軟體軟體推廣是件不容易的事情,為了要更多使用者來使用自由軟體。所以必須提供親切的介面外,
最好能提供多國語言體系,來讓使用者能夠快速上手其環境。

由於這樣的原因,所以GNU推出了gettext 來提供國際化與本地化使用。透過將gettext將程式中的文本額外獨立出一個檔案,
針對此檔案來做翻譯.來做到不需重新撰寫程式,甚至不需重新編譯便能支援多國語系。


該如何使用gettext呢
透過底下範例來做介紹。


首先先撰寫shell script 再需要多國語系的部份使用 gettext 作為關鍵指令
例如可以這樣寫
 

#!/bin/bash
TEXTDOMAIN=hello
TEXTDOMAINDIR=/home/jonathan/work/locale
export TEXTDOMAIN TEXTDOMAINDIR

str=`gettext "hello!"`
echo $str

將此script 存成hello.sh.
接下來則是製作翻譯檔
 
 xgettext -o hello.po hello.sh 
此為翻譯檔內容檔案
 

# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR , YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2012-01-05 16:48+0800\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME \n"
"Language-Team: LANGUAGE \n"
"Language: \n"
"MIME-Version: 1.0\n"
#注意此行需要新增字元集 "原先為CHARSET ->更改為 UTF-8"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"

#: hello.sh:5
msgid "hello!"
msgstr "您好!"
添加需本地化的翻譯內容後,則必須翻譯成二進位檔.
附檔名為.mo
 
msgfmt -o hello.mo hello.po

值得注意的是TEXTDOMAIN變數,若此變數為hello 則必須存hello.mo
最後將此二進位檔存於TEXTDOMAINDIR變數所設定的路徑下,
但必須新建相關目錄,若使用中文則必須新建zh_TW 資料夾,底下並再建立LS_MESSAGES,
在此案例中 , TEXTDOMAINDIR為 "/home/jonathan/work/locale"
 

mkdir -p /home/jonathan/work/locale/zh_TW/LC_MESSAGES
cp hello.mo /home/jonathan/work/locale/zh_TW/LC_MESSAGES
 
./LANG=EN.UTF8 ./hello.sh



 
./LANG=zh_TW.UTF8 ./hello.sh




TUI + i18n example
 
#!/bin/bash
TEXTDOMAIN=my_First
TEXTDOMAINDIR=/home/jonathan/work/locale

export TEXTDOMAIN TEXTDOMAINDIR

dialog --yesno "`gettext "This My First i18n Shell Script!!!"`"  10 60
if [ $? -eq 0 ]; then

        echo "accept"
else
        echo "cancel"

fi


----
[http://www.linuxjournal.com/article/2807]
[http://www.linuxtopia.org/online_books/advanced_bash_scripting_guide/localization.html]
[http://mywiki.wooledge.org/BashFAQ/098]
[http://bash.cyberciti.biz/guide/A_menu_box]
[http://phorum.study-area.org/index.php?topic=23568.0]
[http://blog.roodo.com/rocksaying/archives/15333309.html]
[http://fanqiang.chinaunix.net/a4/b8/20010527/110000258_b.html]

沒有留言:

張貼留言