c#開發之多國語言解決方案gun.gettext + poedit
1.工具簡介
1.1.關于i18n
i18n其來源是英文單詞 internationalization的首末字符i和n,18為中間的字符數是“國際化”的簡稱。
i10n為資源本地化,全稱為Localization,因為首字母I與末字母N之間共10個字母,又稱為I10N。資源本地化就是要讓這個軟件產品使用當地的環境,如語言、文化、使用習慣等
一般涉及到具體國家的語言文件,以i10n來表示,而多國語言相關的解決方案以i18n表示。
1.2.關于gun.gettext
gun.gettext軟件國際化的解決方案之一,類似的還有IBM的ICU4C。但ICU4C比較龐大。
gun.gettext最早被使用在linux上,現在已經支持全面
下面是列舉一些相關文檔:
- oscchina的gun.gettext頁面: http://www.oschina.net/p/gettext/?fromerr=sbwuxgXY
- gun的gettext官方頁面: http://www.gnu.org/software/gettext/
- gun.gettext.net(后面會用到): http://sourceforge.net/projects/gettextnet/
關于使用,網上有很多,這里不做介紹
和普通翻譯相比,你不需要再手動輸入一次Key,它可以自動進入源文件根據一定的規則提取key
1.3.關于POEdit
poedit依賴gun.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文件
gun.gettext提供了一套完整的解決方案,而poedit只是一個圖形化編輯工具。
c#需要使用gun.gettext.net,下載地址: http://sourceforge.net/projects/gettextnet/
傳統的導出方法網上有很多,比較繁瑣
這里使用我寫的工具類進行導出,它使用gun.gettext內部接口。
工具類GunGetTextSeriHelper地址: http://git.oschina.net/Hont/GunGetTextSeriHelper
在Release目錄下找到編譯好的轉出工具,其中ReadMe包含使用說明
運行批處理后會生成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:gun.getText對wpf的xaml文件支持不是很好,谷歌了很多資料,都無法從xaml中提取字符,只能通過wpf動態鏈接到cs文件中,執行替換