1.工具簡介
1.1.關於i18n
i18n其來源是英文單詞 internationalization的首末字符i和n,18為中間的字符數是“國際化”的簡稱。
i10n為資源本地化,全稱為Localization,因為首字母I與末字母N之間共10個字母,又稱為I10N。資源本地化就是要讓這個軟件產品使用當地的環境,如語言、文化、使用習慣等
一般涉及到具體國家的語言文件,以i10n來表示,而多國語言相關的解決方案以i18n表示。
1.2.關於gnu.gettext
gnu.gettext軟件國際化的解決方案之一,類似的還有IBM的ICU4C。但ICU4C比較龐大。
gnu.gettext最早被使用在linux上,現在已經支持全面
下面是列舉一些相關文檔:
- oscchina的gnu.gettext頁面:http://www.oschina.net/p/gettext/?fromerr=sbwuxgXY
- gnu的gettext官方頁面:http://www.gnu.org/software/gettext/
- gnu.gettext.net(后面會用到):http://sourceforge.net/projects/gettextnet/
關於使用,網上有很多,這里不做介紹
和普通翻譯相比,你不需要再手動輸入一次Key,它可以自動進入源文件根據一定的規則提取key
1.3.關於POEdit
poedit依賴gnu.gettext,實現了圖形化的操作。分為免費版和pro版本,一般免費版功能足夠使用了
官方網站:http://poedit.net/
2.使用
下面將用僅有一個Hellow world的控制台項目講解其用法
class Program
{
static void Main(string[] args) { Console.WriteLine("Hellow Wolrd"); Console.Read(); } }
2.1在poedit中配置
首先運行POEdit,新建一個po翻譯文件並保存
此時是po文件打開狀態,即可設置編目(必須設置,否則會有編碼問題)
設置完成后才能保證打開cs文件時不報編碼錯誤
接下來設置配置查找路徑,它會去路徑下的目標文件中自動提取key
最后設置提取字符:
提取字符的規則如需自定義的話,可在文件-首選項-提取器中修改
但假如設定為_,那么代碼中就是
_("content")
其他以此類推
2.2轉出po文件
gnu.gettext提供了一套完整的解決方案,而poedit只是一個圖形化編輯工具。
c#需要使用gnu.gettext.net,下載地址:http://sourceforge.net/projects/gettextnet/
傳統的導出方法網上有很多,比較繁瑣
這里使用我寫的工具類進行導出,它使用gnu.gettext內部接口。
工具類GnuGetTextSeriHelper地址:http://git.oschina.net/Hont/GunGetTextSeriHelper
在Release目錄下找到編譯好的轉出工具,其中ReadMe包含使用說明
把po文件放入該目錄,填入參數運行批處理Execute.bat后會生成i10n文件,這個是已序列化好的本地化翻譯文件。和I18N.cs一起放入項目文件中
這里把i10n作為外部載入來操作,也可以包含在項目資源中
此時zh_CN.po的內容還是空的,現在修改一下代碼讓其可以被識別
並且初始化一下i18n,載入本地化文件
static void Main(string[] args)
{
I18N.DeserializeFromFile("zh_CN_i10n"); Console.WriteLine(I18N._("Hellow Wolrd")); Console.Read(); }
然后回到poedit,執行更新
此時有若干種可能更新失敗,需要檢查上面所說的配置步驟,還需要把.po文件放在項目根目錄中
最好是放在i18n文件夾中,它會自動識別相對路徑
翻譯好后,不用生成mo文件,選擇保存,然后直接按照上述步驟使用我的工具再生成一次i10n文件。
ok,國際化支持成功:
Tip:gnu.getText對wpf的xaml文件支持不是很好,谷歌了很多資料,都無法從xaml中提取字符,只能通過wpf動態鏈接到cs文件中,執行替換