• WPF全球化与本地化


    当一个App需要推出多语言版本时,就需要使用到【全球化与本地化】服务。

    原理过程

    资源文件中包含了所有的控件信息,通过导出这些控件信息,修改其对应的相关属性(比如TextBlock的Text属性)的字符串,即可实现多语言版本。在资源文件中,控件通过x:uid进行标示。

    1. 设置默认的本地化区域。比如zh-CN or en-US,取决于具体的App语言版本。
    2. 为所有的控件自动添加x:uid,并检查x:uid的唯一性。
    3. 重新生成工程。在bin/下可以看到特征语言版本的*.resource.dll。比如en-US/*.resource.dll。 (*为工程名字)
    4. 从*.resource.dll中提取出所有的控件列表。提取可是为*.csv。
    5. 手动编辑*.csv,将其中的可翻译属性翻译为目标语言。.csv可以使用excel类工具打开。
    6. 使用本地化后的*.csv生成特定语言的资源文件dll.比如保存为zh-CN/*.resource。
    7. 修改操作系统的区域或者自行设定属性,改变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,请运行 checkuidmsbuild /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确定后,可以外包给翻译团队,并行进行。

     

    还有....

      这只作了简单的文字翻译,还包括使用习惯、格式化特性等,许多有意思的内容。资源(Resource)中的字符串翻译可以看看http://www.cnblogs.com/jjseen/p/5315722.html

    参考:

    如何:对应用程序本地化, https://msdn.microsoft.com/zh-cn/library/ms746621.aspx

  • 相关阅读:
    Win10解决RuntimeBroker.exe后台运行CPU占比高的方法
    easyexcel测试用例
    电脑Wlan不能上网的解决办法
    [LeetCode] Delete and Earn 删除与赚取
    [LeetCode] Daily Temperatures 日常温度
    [LeetCode] 738. Monotone Increasing Digits 单调递增数字
    [LeetCode] 737. Sentence Similarity II 句子相似度之二
    [LeetCode] Parse Lisp Expression 解析Lisp表达式
    [LeetCode] Asteroid Collision 行星碰撞
    [LeetCode] 644. Maximum Average Subarray II 子数组的最大平均值之二
  • 原文地址:https://www.cnblogs.com/jjseen/p/5242516.html
Copyright © 2020-2023  润新知