2010年10月22日

U++ / i18n & L10n

身為一個亞洲人,寫程式不支援 unicode 應該吊起來打

U++ 雖然為了要 Moveable 而用的是自家的 String,不過它也沒忘記要打一份 WString 出來
而且還幫你做了一堆 charset tool,所以 i18n 算滿容易滿足的

L10n 的部分 U++ 其實也有支援機制,
方法大概如下:

1. 在 code 裡面所有需要 localize 的 string 都用 t_() 這個 macro 包起來,比如說像這樣
printf(t_("this string can be localized"));
2. 在 package 裡面新增一個 .t file,裡面列出所有需要被 replace 的 t_() string,像這樣
T_("this string can be localized")
T_("second line") 
    要注意的是這邊沒列出來的 string 就會被接下來的步驟忽略,
    而且這個 .t file 是 complie time 就被 reference 的東西,
    所以要是有問題就得重 build 了
    這大概是最不 make sense 也最容易出錯的步驟了,
    以後如果有需要應該寫個 parser 自動生才對

3. 回到 code 裡面,在適當的地方加入這兩行
#define TFILE <PACKAGE_NAME/T_FILE_NAME>
#include <Core/t.h>
    PACKAGE_NAME 跟 T_FILE_NAME 別忘了代換掉
    另外要設定 locale 的話可以這樣做
SetLanguage(SetLNGCharset(LNGFromText("zhtw"), CHARSET_UTF8));

4. 以上都弄好了就 build 吧,build 完以後去找執行檔
   (可以從主選單 Build -> Open output directory 叫 TheIDE 幫你找)
    假設你的執行檔叫 run.exe,
    那下 command "run.exe --export-tr zhtw_" 就會生出一個 zh-TW 而且是 utf-8 編碼的純文字檔案
    裡面會有你寫在 .t file 裡面的所有 string,好好翻譯吧
    command 最後一個參數是 language, locale, encoding 那些,詳細看這裡
    要注意的是這個 tr file 不吃 BOM 的 

5. 接下來...就沒有接下來了,剛剛那個 tr file 翻完去跑 run.exe 就會看到 L10n 了!

P.S. 這串方法作字串代換的時間點是在 object constructor,
       所以基本上是要重開程式才能切語言....
       嗯,用 pimp 把所有 ui object 包起來不知道有沒有搞頭....

沒有留言:

張貼留言