LocBaml.exe是微軟官方提供的一款WPF本土化的解決方案,這款工具可以幫助開發者將自己的產品進行經濟而有效的本地化,支持多國語言,推薦有需要的用戶下載使用。
WPF全球化介紹:
當您將自己的產品限制為只能通過一種語言使用時,您便將潛在的客戶群限制為全球 65 億人口中的一小部分。 如果您想讓自己的應用程序被全球用戶所接受,那么對產品進行經濟而有效的本地化將是贏得更多客戶的最好、最經濟的方法。
本概述介紹 Windows Presentation Foundation (WPF) 中的全球化和本地化。 全球化是指設計和開發在多個地點執行的應用程序。 例如,全球化支持適用于不同區域性用戶的本地化用戶界面和區域數據。 WPF 提供全球化設計功能,包括自動布局、附屬程序集以及本地化特性和注釋。
本地化是針對應用程序所支持的特定區域性將應用程序資源轉換為本地化版本的過程。 在 WPF 中進行本地化時,可使用 System.Windows.Markup.Localizer 命名空間中的 API。這些 API 實現 LocBaml Tool Sample(LocBaml 工具示例)命令行工具。
WPF全球化解決方法:
1.設置默認語言環境
項目文件LocalizationDemo.csproj添加<UICulture>en-US</UICulture>,程序集信息AssemblyInfo.cs中把[assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.Satellite)]注釋去掉。
2.在xaml文件中添加Uid
打開Visual Studio 命令提示(2010)如下圖,進入項目文件.csproj所在目錄,運行命令:msbuild /t:updateuid LocalizationDemo.csproj;若要驗證是否缺少或重復Uid,運行命令:msbuild /t:checkuid LocalizationDemo.csproj。
3. 通過Localization.Attributes,設置本地化的特性(屬性)
如:<DataGridTextColumn x:Uid="DataGridTextColumn_1" Header="No." Width="auto" Binding="{Binding No}" Localization.Attributes="$Content(Ignore) Width(Ignore) Header(None Readable Modifiable)"/>,這里Width(Ignore)設置Width屬性不實現本地化,Header(None Readable Modifiable)設置Header屬性可讀可寫需要實現本地化,更多本地化特性細節請參見本地化特性和注釋。
4. 編譯項目,生成語言資源文件
生成的LocalizationDemo.resources.dll,在\bin\Debug\en-US\目錄下。
5. 將語言資源文件輸出存儲為 .csv 文件,以作進一步分析
將 LocBaml.exe 復制到應用程序的 bin\debug 文件夾,即創建主應用程序集的位置。打開Visual Studio 命令提示(2010),進入bin\debug目錄,運行命令:LocBaml.exe /parse en-US/LocalizationDemo.resources.dll /out:en-US.csv
6. 翻譯可本地化內容
注意此步應當使用兼容unicode的文本編輯器進行編輯翻譯?;蛘咧形南到y下將 .csv 文件在 Microsoft Excel 中進行查看,對最后一列(值)進行翻譯更改,另存為zh-CN.csv。
此時會彈出如下消息提示框,選擇"是(Y)",
然后用記事本打開zh-CN.csv文件,選擇"另存為",如下圖(初始編碼為"ANSI")選擇"UTF-8"保存。
7. 使用 LocBaml 生成新增語言的.resources.dll資源文件
運行下面命令根據翻譯的zh-CN.csv生成中文資源文件LocalizationDemo.resources.dll,可以在E:\目錄下找到,將生成的LocalizationDemo.resources.dll復制到項目\bin\Debug\zh-CN\目錄下即可。
LocBaml.exe /generate en-US/LocalizationDemo.resources.dll /trans:zh-CN.csv /out:E:\ /cul:zh-CN
8. 測試新增語言資源文件
更改操作系統的地區設置(“開始” | 控制面板 |“區域和語言選項”)。
代碼中控制
//中文為: "zh-CN"CultureInfo ci = new CultureInfo("en-US");
Thread.CurrentThread.CurrentCulture = ci;
Thread.CurrentThread.CurrentUICulture = ci;