全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1578
推到 Plurk!
推到 Facebook!

有關 localization 的一些心得.

 
jessechan
版主


發表:109
回覆:394
積分:254
註冊:2002-04-05

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-02-10 16:30:20 IP:203.75.xxx.xxx 未訂閱
BCB 本身支援多國語言版本, 但是說真並不是十分好用, 它只能處理 visual components 的多國語言版本, 如果在程式中所出現的訊息及其它字串, 仍需個別做對應處理, 我想還是用 resource file 的字串表比較方便. 但是使用字串表仍有一些缺點, 如果要為每種語言都製作一份 resource file, 則在做翻譯對照時要同時開多個 resource file 一一比較, 十分麻煩, 萬一漏了其中一份, 可能造成牛頭不對馬嘴的情形, 而且不論是用 BCB 的多國語言支援或是 resource file, 皆需要個別編譯每個版本, 等於同時 maintain 好幾個程式, 又不能在程式執行中切換語言, 所以這也不是好方法. 在 VB6 中有一個叫資源編輯器的工具, 可以支援不同語系的字串表(如圖1),     只要在 增益集\增益功能管理員 中把 Visaul Basic 6 資源綿輯器載入即可使用, VC 也可以支援多語系相同 ID 的字串表, 但是使用上不如 VB 的方便, (如圖2) 可看到它把不同語系相同 ID 的字串放在同一列中以方便作對照及翻譯. 接下來就是使用這個字串表的方法. 在每個 unit 載入時使用 int LoadString(HINSTANCE hInstance, UINT uID, LPTSTR lpBuffer, int nBufferMax); 這個 API 來指定每個需要針對不同語系處理的元件或訊息. 程式自然會根據目前系統的 locale 設定找出合用的字串表來載入, 如果找不到相符的語系, 則會載入第一個字串表的內容, 如果想要在程式中切換不同語言的顯示, 例如原來是中文顯示, 現在想改成英文顯示則可使用 SetThreadLocale(MAKELCID(MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US),SORT_DEFAULT)); 來改變不同語系顯示, 有關以上參數使用方法請自行查閱 help, 這樣做就可以做到單一程式支援多國語系且可以自行切換的功能. 我在測試中發現了一個好玩的現象, 就是如果把 locale 設定成 Chinese(Taiwan) 系統會去找 English 的設定而不會找 Chinese, 同樣是中文, 我如果設成 Hong Kong 或是 PRC 則都可以正常顯示, 不知是不是我用的是英文版 Windows 2000 的原因. 目前這樣的切換方式只能針對字串來使用, 其實任何的 resource 都可以設定相同 ID 不同語系, 但在 BCB 中 build 時除了字串表外, 如果其它的 resource 有重覆的 ID 則 BCB 會產生警告並自動忽略. 在這裡順便提供我的做法. 因為 resource 的 ID 可以是一個字串, 所以我用 LCID 來當做是每個 resource 的 prefix, 如繁體中文的 LCID 為 1028 簡體中文的 LCID 為 2052, 我想要繁體中文及簡體中文中顯示不同的 icon, 則我會把一個 ID 命名為 "1028001" 另一個為 "2052001", 然後在 loadicon 時用以下的 code AnsiString asTemp; asTemp.sprintf("d001",MAKELCID(MAKELANGID(LANG_CHINESE,SUBLANG_CHINESE_TRADITIONAL); LoadIcon(HInstance, asTemp.c_str()); 就可以根據不同語系顯示不同的 resource. Jesse Chan
------
Jesse Chan
系統時間:2024-04-25 21:27:07
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!