當一個App需要推出多語言版本時,就需要使用到【全球化與本地化】服務。 原理及過程 資源文件中包含了所有的控制項信息,通過導出這些控制項信息,修改其對應的相關屬性(比如TextBlock的Text屬性)的字元串,即可實現多語言版本。在資源文件中,控制項通過x:uid進行標示。 設置預設的本地化區域。比如z
當一個App需要推出多語言版本時,就需要使用到【全球化與本地化】服務。
原理及過程
資源文件中包含了所有的控制項信息,通過導出這些控制項信息,修改其對應的相關屬性(比如TextBlock的Text屬性)的字元串,即可實現多語言版本。在資源文件中,控制項通過x:uid進行標示。
- 設置預設的本地化區域。比如zh-CN or en-US,取決於具體的App語言版本。
- 為所有的控制項自動添加x:uid,並檢查x:uid的唯一性。
- 重新生成工程。在bin/下可以看到特征語言版本的*.resource.dll。比如en-US/*.resource.dll。 (*為工程名字)
- 從*.resource.dll中提取出所有的控制項列表。提取可是為*.csv。
- 手動編輯*.csv,將其中的可翻譯屬性翻譯為目標語言。.csv可以使用excel類工具打開。
- 使用本地化後的*.csv生成特定語言的資源文件dll.比如保存為zh-CN/*.resource。
- 修改操作系統的區域或者自行設定屬性,改變App當前的區域(cultrue)信息。
WPF國際化的步驟如下:
1. 在*.csproj中增加語言/本地化信息,在重新生成工程之後,在bin目錄下會有en-US的目錄,裡面包含en-US的本地化資源信息 en-US*.resources.dll。
在*p.csproj文件里的<PropertyGroup>下添加<UICulture>en-US</UICulture>。
在AssemblyInfo.cs 中開啟 [assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.Satellite)]
重新生成項目。
2. 添加和檢查uid。
為XAML自動添加UID msbuild /t:updateuid HelloApp.csproj
若要驗證您沒有缺少或重覆的 UID,請運行 checkuid:msbuild /t:checkuid HelloApp.csproj
3.提取、修改並重新生成資源文件(dll)
工具:可以使用微軟的非生產工具 LocBaml.exe ,或者其他可視化工具。比如 Visual LocBaml。
提取:LocBaml.exe /parse en-US/HelloApp.resources.dll /out:Hello.csv
生成:LocBaml.exe /generate en-US/HelloApp.resources.dll /trans:Hello.csv /out:.\ /cul:zh-CN
4. 自行改變程式運行cultrue.
修改操作系統語言/區域。
或者通過參數在App動態設置區域。(需要重啟App)
var lan = HelloApp.Properties.Settings.Default["Language"] as string;
var cultrue = new CultureInfo(lan);
CurrentThread.CurrentCulture = cultrue;
CurrentThread.CurrentUICulture = cultrue;
還有其他幾種可以動態改變語言環境的方式,但以上方法有幾種好處:
- 源程式基本不用關心多語言。比如基於.xaml 的dynamic綁定, XMAL的dynamic綁定或者resource 的(k,v)都在開發層面限制了可翻譯的語言種類。
- 翻譯可以在程式開發完成後進行。
- UI確定後,可以外包給翻譯團隊,並行進行。
還有....
這隻作了簡單的文字翻譯,還包括使用習慣、格式化特性等,許多有意思的內容。
參考:
如何:對應用程式本地化, https://msdn.microsoft.com/zh-cn/library/ms746621.aspx