2010年10月25日 星期一

Qt多國語言機制

Qt原本就內建了一套多國語言的機制,可是需要用到Qt Linguist。另外如果要作到動態的話,使用Qt Designer建立的GUI才有提供,要不然只能手動設定(參考)。

所以我自己改寫了一個class Translator。
為了使用方便,我利用了Singleton Pattern
只要傳入物件的指標,還有屬性,以及字串標籤。其他的部份,Translator都幫你處理了。
使用範例如下:
    QMenu *menu = new QMenu;
    menuBar()->addMenu(menu);
    Translator::add(menu, "title", "FILE");
    QAction *action = new QAction(0);
    menu->addAction(action);
    Translator::add(action, "text", "EXIT");
當然還有語言清單
menuBar()->addMenu(Translator::menu);

在這裡說明一下,我是利用Qt的setProperty來達到這個效果的。
bool QObject::setProperty ( const char * name, const QVariant & value )
只要是繼承至QOject的元件,都可以用setProperty來設定屬性值。
widget->setProperty("windowTitle", QVariant("標題"));

另外語言表方面,我比較喜歡用table而不是跟Qt一樣用list。table格式我選用csv,因為可以直接用openoffice編輯。
以下是csv檔的內容
"LANGUAGE_COUNTRY","en","zh_TW","zh_CN","ja","es"
"LANGUAGE_COUNTRY","English","繁體中文","简体中文","日本語","español"
"LANGUAGE","Language","語系","语言","言語","Lenguaje"
"FILE","File","檔案","文件","ファイル","Archivo"
"NEW","New","開新檔案","新建","新規","Nuevo"
利用第二列產生QMenu,
至於第一列則因為當要判斷作業系統環境時,需要用到language_country code

為什麼不跟Qt一樣,用英文當key,要用第一行的tag呢?
其實原因很簡單。當你有一天,發現老闆總是同一段英文一直換寫法,你就知道為什麼了。。。

2 則留言:

匿名 提到...

你的連結都無法進入耶
這是正常的嗎??
我現在正在嘗試在介面上用下拉選單來變換語言
很想嘗試你的用法

阿勇 提到...

這一篇是在Qt還是nokia的子公司時寫的
所以很多連接都失效了

不過我想 Qt4和Qt5的邏輯 應該不會差太多