所以我自己改寫了一個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呢?
其實原因很簡單。當你有一天,發現老闆總是同一段英文一直換寫法,你就知道為什麼了。。。