國際化程式設計的注意點1.字符集(charset)
要支援國際化,最好的方案是支援unicode;非unicode也可以支援國際化,但是有小許的缺失。
unicode的好處,同一unicode編碼下同一編碼在不同區域和語言設定下都一致,且可同時顯示或編輯多國語言文字[必須輸入法支援,如微軟拼音輸入法支援unicode,而智慧型abc則不支援,個人認為拼音加加新版本使用.net做開發平台也有這個因素在]。
在大部分情況下,ansi+codepage就可以做到本地化,只有在涉及到unicode定義到而active codepage(acp)未定義的內容時才會有問題。
win9x不能完整支援unicode,只支援ansi+codepage;winnt4以上同一核心系統支援unicode(unicode16,ucs2),也支援ansi+codepage;linux支援unicode(unicode32,ucs4-ucs2的超集),似乎需要通重載入相關模組支援。
**頁定義檔案在%system%下的c_*.nls中,如簡體中文的**頁檔案在2000/xp等os下的檔案是c_936.nls。
vcl幾乎不支援unicode;clx支援unicode,但dbexpress等支援不好;vcl.net支援。ado與ado.net支援unicode。(vcl只是定義了widestring,widechar等支援unicode,且連最基本的sysutils單元提供的wideupper等函式在ansi環境下執行都會崩潰。)
vcl是基於ansi+codepage的,基於mbcs(sbcs混合dbcs)。
因為vcl對unicode的支援不好,所以幾乎所有的第三方元件也不支援unicode;甚至很多第三方的元件都不支援mbcs。
delphi的unicode庫有:
eldos的elpack,現已被lmd購買。
delphi-jedi的jcl,開源。
delphi-gems的unicode library,開源。
tnt元件tntcontrols,開源。
另外還有個別元件支援unicode,如delphi-gems的virtualtree等。
d9(delphi 2005)等內部使用的是twidecontrol,也是支援unicode的,但是不隨vcl發布。
使用mfc等開發程式時一般都採用編輯兩套程式的方法來同時支援ansi與unicode;如果定義了編譯器指示字unicode則開發出來的程式是unicode版本,否則是ansi版本的,unicode版本在ansi作業系統下可能會無法正常執行(基本的cstring類不支援ansi的os上相容unicode**)。
基於vcl的程式慘得多,vcl根本沒有提供這樣的方式,所以vcl的程式過渡到unicode比較複雜。
2.使用unicode的資源
delphi中無法直接正確使用unicode的資源。
有兩種方法使用unicode資源:
1. 編寫rc檔案編譯為res,再鏈結進exe或dll等等二進位制檔案中;然後**中使用loadstringw等api函式獲取。(rc檔案的格式:stringtable)
2. 引入tnt類庫,在程式執行前執行tntsystem.installtntsystemupdate([tswideresourcestrings]);然後就可以使用resourcestring了。
3.國際化支援還需要注意的方面
1. 定義快捷鍵時使用標準美式鍵盤才有的按鍵。[只有這些按鍵才基本上是通用的,但是符號之類的也不是通用的,所以建議只有標準的字母和功能鍵作快捷鍵]
2. 大多數的語言翻譯到其他語言時長度都比較英語要長,所以要注意介面布局留有足夠的翻譯空間(漢語是少數平均長度小於英語的語言)。
3. 最好能夠使用區域設定顯示,但在儲存時最好不要帶入區域設定格式化後的內容。
4. 圖示等設計時需要注意尊重各國習慣,盡量少涉及到宗教等等內容(如豬牛,某些抽象的符號等等)。
5. 預設的codepage和ime設定;最好不要在元件持久化中帶入ime資訊,除非必須這麼做。
其他:
1.關於ansi版本的程式本地化
一般情況下基於vcl的程式都應該支援本地化。如果不支援,我認為不是因為ansi與unicode的問題,而是因為控制項不能正確處理mbcs的原因引起的。支援mbcs並不是象網上一些人所用的方法來判斷,而要依據ansi+codepage來處理。雖然很多情況下似乎他們的方法是正確的,但那是因為大部分遠東語言的**頁都使用了c1控制碼+ascii來表示dbcs的;但是還是會有一些細節差別的。
2.關於已有程式從ansi轉移到unicode的困難
1.資料庫的設定[oracle:nvarchar2代替varchar2;mssql:nvarchar代替varchar(mssql還有一些其他的字段也分unicode版本與ansi版本)]
2.標準vcl元件(尤其是db,類庫等等:tdataset,tfield,string,tstrings…)
3.第三方元件(memtable,dxgrid等等)
4.介面設定(如因為2,3兩點原因而不完全過渡到unicode時tcustomedit.maxlength;如果設定了資料庫的雙倍長度則英文出錯,不然,則dbcs出錯)
5.如果照顧到系統相容性,還需要注意rtl庫和win32api的相容性
6.ime的相容性,在處理windows訊息時需要注意一些textmessage和ime訊息(wm_ime_char,wm_gettextlength等等)
7.編寫自定義元件時需要額外關注很多unicode相關的瑣節
8.即使**支援了,但是delphi的ide也不能完全支援,還需要通過很多複雜的方法才有可能真正使ide也支援(而且delphi7的編譯器也只支援utf8,不支援unicode)
3.其他
xp中引入了theme(style),也就是新的comctrls,一旦程式支援了theme,就要小心一些向系統獲取的資訊,如tcustomedit.sellength,tcustomedit.selstart等等,這些資訊的返回值與不支援theme時的返回值將會有差別[因為支援theme的window是comctrls6版本的元件,內部是使用unicode方式工作的]。
設計窗體時注意字型的設定,如果不小心使用了中文字型等非英文環境下的字型,則可能程式的窗體在中文環境下與英文環境下的表現不一樣(windows無法評估未知窗體的textheigh,也無法找到匹配的字型)。
windows選擇最匹配字型的方法在不同版本中也有不一樣,典型的是vclform用預設字型顯示的中文在9x和2000/xp下顯示的不一致[9x下字型很難看]。
wxWidgets 國際化程式設計
一 編譯工具 工欲善其事 必先利其器,想要實現國際化程式設計,必須具備gettext軟體,可以去http sourceforge.net projects gettext 二 生成mo檔案 此工作在wxwidgets提供的internat例子中都已經詳細說明,下面簡單敘述一下 先建立目錄,目錄名要用...
QRM國際化程式設計
1.確定qrm的web介面所在目錄,預設在 var www html openqrm 2.進入web根目錄 root hd openqrm pwd var www html openqrm root hd openqrm mkdir p locale zh cn lc messages root h...
qt國際化程式設計
下面說一下qt國際化程式設計的操作步驟 1 編寫源 2 在 pro檔案中新增translations ts 有多少中語言就新增多少個ts檔案。3 執行lupdate pro 生成ts檔案。lupdate會根據源 中的內容提取出待翻譯的字段,然後生成ts檔案,ts檔案是xml格式的。4 用qt lin...