[源码下载]

背水一战 Windows 10 (80) - 本地化

作者:webabcd

介绍
背水一战 Windows 10 之 本地化

  • Demo
  • 改变语言

示例
1、演示本地化的基本应用
Localization/LocalizationDemo.xaml

  1. <Page
  2. x:Class="Windows10.Localization.LocalizationDemo"
  3. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  4. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  5. xmlns:local="using:Windows10.Localization"
  6. xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
  7. xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
  8. mc:Ignorable="d">
  9.  
  10. <Grid Background="Transparent">
  11. <Grid.Resources>
  12. <ResourceDictionary>
  13. <local:LocalizedStrings x:Key="Localized"/>
  14. </ResourceDictionary>
  15. </Grid.Resources>
  16.  
  17. <StackPanel Margin="10 0 10 10">
  18.  
  19. <TextBlock>
  20. <Run>本地化资源文件,以下举例说明:</Run>
  21. <LineBreak />
  22. <Run>1、在 en 目录下的是英文资源文件,在 zh-hans 目录下的是简体中文(zh 代表中文,hans 代表简体中文)资源文件(关于限定符的详细说明请参见 /Resource/Qualifiers/)</Run>
  23. <LineBreak />
  24. <Run>2、Resources.lang-en.resw 代表英文资源文件,Resources.lang-zh-hans.resw 代表简体中文资源文件(关于限定符的详细说明请参见 /Resource/Qualifiers/)</Run>
  25. <LineBreak />
  26. <Run>3、Package.appxmanifest 中引用的字符串也支持本地化,引用方式:ms-resource:Hello 或 ms-resource:///Resources/Hello</Run>
  27. <LineBreak />
  28. <Run>4、Tile 和 Toast 中引用的字符串也支持本地化,引用方式:ms-resource:Hello 或 ms-resource:///Resources/Hello</Run>
  29. <LineBreak />
  30. <Run>5、当无法找到某语言对应的资源时,系统会自动使用 Package.appxmanifest 中设置的默认语言所对应的资源</Run>
  31. </TextBlock>
  32.  
  33. <!--
  34. 通过 x:Uid 本地化控件的各个属性,请参看资源文件中的 HelloTextBlock.FontSize 和 HelloTextBlock.Text
  35. -->
  36. <TextBlock x:Uid="HelloTextBlock" Margin="5" />
  37.  
  38. <!--
  39. 图片的本地化
  40. -->
  41. <Image Source="/Localization/Logo.png" Width="200" Height="100" Margin="5" HorizontalAlignment="Left" />
  42.  
  43. <!--
  44. code - behind 方式获取本地化资源
  45. -->
  46. <TextBlock x:Name="lblMsg1" Margin="5" />
  47.  
  48. <!--
  49. code - behind 方式获取本地化资源
  50. -->
  51. <TextBlock x:Name="lblMsg2" Margin="5" />
  52.  
  53. <!--
  54. code - behind 方式获取本地化资源
  55. -->
  56. <TextBlock x:Name="lblMsg3" Margin="5" />
  57.  
  58. <!--
  59. code - behind 方式获取本地化资源
  60. -->
  61. <TextBlock x:Name="lblMsg4" Margin="5" />
  62.  
  63. <!--
  64. code - behind 方式获取本地化资源
  65. -->
  66. <TextBlock x:Name="lblMsg5" Margin="5" />
  67.  
  68. <!--
  69. 绑定本地化资源
  70. -->
  71. <TextBlock x:Name="lblMsg6" Margin="5" Text="{Binding [Hello], Source={StaticResource Localized}}" />
  72.  
  73. </StackPanel>
  74. </Grid>
  75. </Page>

Localization/LocalizationDemo.xaml.cs

  1. /*
  2. * 演示本地化的基本应用
  3. *
  4. *
  5. * 注:建议使用多语言应用工具包 https://developer.microsoft.com/zh-cn/windows/develop/multilingual-app-toolkit
  6. */
  7.  
  8. using System;
  9. using System.Resources;
  10. using Windows.ApplicationModel.Resources;
  11. using Windows.ApplicationModel.Resources.Core;
  12. using Windows.UI.Xaml.Controls;
  13. using Windows.UI.Xaml.Navigation;
  14.  
  15. namespace Windows10.Localization
  16. {
  17. public sealed partial class LocalizationDemo : Page
  18. {
  19. public LocalizationDemo()
  20. {
  21. this.InitializeComponent();
  22. }
  23.  
  24. protected override void OnNavigatedTo(NavigationEventArgs e)
  25. {
  26. /*
  27. * ResourceLoader resourceLoader = ResourceLoader.GetForViewIndependentUse(); - 获取默认的 ResourceLoader(Resources.resw 中的资源)
  28. * ResourceLoader resourceLoader = ResourceLoader.GetForViewIndependentUse("MyResources"); - 获取指定的 ResourceLoader(MyResources.resw 中的资源)
  29. * ResourceLoader resourceLoader = ResourceLoader.GetForViewIndependentUse("ClassLibrary/MyResources"); - 获取指定类库的指定的 ResourceLoader(ClassLibrary 类库中的 MyResources.resw 中的资源)
  30. * resourceLoader.GetString(), resourceLoader.GetStringForUri() - 通过资源标识,获取当前语言环境的指定的资源
  31. *
  32. * GetForCurrentView() 和 GetForViewIndependentUse() 的区别如下:
  33. * 1、GetForCurrentView() - 在 UI 线程上执行
  34. * 2、GetForViewIndependentUse() - 在非 UI 线程上执行(注:Independent 这个词在 uwp 中就时非 UI 线程的意思,比如 Independent Animation 就是不依赖 UI 线程的)
  35. */
  36.  
  37. // 获取默认的 ResourceLoader(即 Resources.resw 中的资源)
  38. ResourceLoader resourceLoader = ResourceLoader.GetForViewIndependentUse();
  39.  
  40. // 通过资源标识,获取当前语言环境的指定的资源(资源名:Hello)
  41. lblMsg1.Text = resourceLoader.GetString("Hello");
  42.  
  43. // 通过资源标识,获取当前语言环境的指定的资源(资源名:HelloTextBlock.Text)
  44. lblMsg2.Text = resourceLoader.GetString("HelloTextBlock/Text");
  45.  
  46. // 通过资源标识,获取当前语言环境的指定的资源(资源名:Hello)
  47. lblMsg3.Text = resourceLoader.GetStringForUri(new Uri("ms-resource:///Resources/Hello"));
  48.  
  49. // 通过资源标识,获取当前语言环境的指定的资源(资源名:HelloTextBlock.Text)
  50. lblMsg4.Text = resourceLoader.GetStringForUri(new Uri("ms-resource:///Resources/HelloTextBlock/Text"));
  51.  
  52. // 获取当前语言环境的指定的资源的另一种方式
  53. lblMsg5.Text = Windows.ApplicationModel.Resources.Core.ResourceManager.Current.MainResourceMap.GetValue("Resources/Hello", ResourceContext.GetForCurrentView()).ValueAsString;
  54. }
  55. }
  56.  
  57. // 用于演示如何绑定本地化资源
  58. public class LocalizedStrings
  59. {
  60. public string this[string key]
  61. {
  62. get
  63. {
  64. return ResourceLoader.GetForCurrentView().GetString(key);
  65. }
  66. }
  67. }
  68. }

2、演示与“改变语言”相关的一些应用
Localization/Language.xaml

  1. <Page
  2. x:Class="Windows10.Localization.Language"
  3. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  4. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  5. xmlns:local="using:Windows10.Localization"
  6. xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
  7. xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
  8. mc:Ignorable="d">
  9.  
  10. <Grid Background="Transparent">
  11. <StackPanel Name="root" Margin="10 0 10 10">
  12.  
  13. <!--
  14. 通过此种方式获取本地化资源时,如果在页面加载后修改了语言首选项的话是不会立即有效果的,需要重新加载页面才行(懒的写了,要看效果的话就先返回,然后再进来就好)
  15. -->
  16. <TextBlock x:Uid="HelloTextBlock" Margin="5" />
  17.  
  18. <ComboBox Name="cmbLanguage" Width="800" HorizontalAlignment="Left" Margin="5" />
  19.  
  20. <Button Name="btnGetEnglish" Content="获取英文资源" Margin="5" Click="btnGetEnglish_Click" />
  21. <Button Name="btnGetChinese" Content="获取简体中文资源" Margin="5" Click="btnGetChinese_Click" />
  22.  
  23. <TextBlock Name="lblMsg" Margin="5" />
  24.  
  25. </StackPanel>
  26. </Grid>
  27. </Page>

Localization/Language.xaml.cs

  1. /*
  2. * 演示与“改变语言”相关的一些应用
  3. *
  4. * 1、演示如何改变当前的语言环境
  5. * 2、演示如何监测当前语言环境发生的变化
  6. * 3、演示如何获取指定语言环境下的资源
  7. */
  8.  
  9. using System;
  10. using System.Collections.Generic;
  11. using System.Text;
  12. using Windows.ApplicationModel.Resources;
  13. using Windows.ApplicationModel.Resources.Core;
  14. using Windows.Globalization;
  15. using Windows.UI.Core;
  16. using Windows.UI.Xaml;
  17. using Windows.UI.Xaml.Controls;
  18.  
  19. namespace Windows10.Localization
  20. {
  21. public sealed partial class Language : Page
  22. {
  23. public Language()
  24. {
  25. this.InitializeComponent();
  26.  
  27. this.Loaded += Language_Loaded;
  28. }
  29.  
  30. void Language_Loaded(object sender, RoutedEventArgs e)
  31. {
  32. // 获取当前的语言
  33. string currentLanguage;
  34. ResourceContext.GetForCurrentView().QualifierValues.TryGetValue("Language", out currentLanguage);
  35. lblMsg.Text = "current language: " + currentLanguage;
  36. lblMsg.Text += Environment.NewLine;
  37.  
  38. // ApplicationLanguages.ManifestLanguages - 遍历 Package.appxmanifest 中的语言列表
  39. foreach (string strLang in ApplicationLanguages.ManifestLanguages)
  40. {
  41. // 关于 Language 的说明详见 GlobalizationDemo.xaml
  42. var lang = new Windows.Globalization.Language(strLang);
  43. cmbLanguage.Items.Add(string.Format("DisplayName:{0}, NativeName:{1}, LanguageTag:{2}, Script:{3}",
  44. lang.DisplayName, lang.NativeName, lang.LanguageTag, lang.Script));
  45. }
  46. cmbLanguage.SelectionChanged += cmbLanguage_SelectionChanged;
  47.  
  48. // 获取当前语言环境的指定资源(更多用法请参见 LocalizationDemo.xaml)
  49. lblMsg.Text += ResourceLoader.GetForViewIndependentUse().GetString("Hello");
  50.  
  51. // 当前语言环境发生改变时所触发的事件(通过 API 更改或者通过“电脑设置 -> 常规 -> 语言首选项”更改都会触发此事件)
  52. // 注:当通过 API(ApplicationLanguages.PrimaryLanguageOverride)修改语言环境时,如果监听了 MapChanged 事件的话,则有很大的几率会导致崩溃,本例就是这样,原因未知
  53. ResourceContext.GetForCurrentView().QualifierValues.MapChanged += async (s, m) =>
  54. {
  55. await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
  56. {
  57. lblMsg.Text += Environment.NewLine;
  58. lblMsg.Text += ResourceLoader.GetForViewIndependentUse().GetString("Hello");
  59. });
  60. };
  61. }
  62.  
  63. private void cmbLanguage_SelectionChanged(object sender, SelectionChangedEventArgs e)
  64. {
  65. // ApplicationLanguages.PrimaryLanguageOverride - 设置或获取首选语言(BCP-47 语言标记)
  66. if (cmbLanguage.SelectedValue.ToString().ToLower().Contains("en-us"))
  67. ApplicationLanguages.PrimaryLanguageOverride = "en-US";
  68. else if (cmbLanguage.SelectedValue.ToString().ToLower().Contains("zh-hans"))
  69. ApplicationLanguages.PrimaryLanguageOverride = "zh-Hans-CN";
  70.  
  71. StringBuilder sb = new StringBuilder();
  72. // ApplicationLanguages.Languages - 按语言级别排序,获取语言列表
  73. foreach (string item in ApplicationLanguages.Languages)
  74. {
  75. sb.Append(item);
  76. sb.Append(",");
  77. }
  78.  
  79. lblMsg.Text += Environment.NewLine;
  80. lblMsg.Text += "ApplicationLanguages.Languages: " + sb.ToString();
  81. }
  82.  
  83. private void btnGetEnglish_Click(object sender, RoutedEventArgs e)
  84. {
  85. // 指定 ResourceContext 为 en-US 语言环境
  86. ResourceContext resourceContext = new ResourceContext();
  87. resourceContext.Languages = new List<string>() { "en-US" };
  88.  
  89. // 获取 en-US 语言环境下的 Resources 映射
  90. ResourceMap resourceMap = ResourceManager.Current.MainResourceMap.GetSubtree("Resources");
  91. lblMsg.Text += Environment.NewLine;
  92. // 获取指定的语言环境下的指定标识的资源
  93. lblMsg.Text += "英语的 Hello: " + resourceMap.GetValue("Hello", resourceContext).ValueAsString;
  94. }
  95.  
  96. private void btnGetChinese_Click(object sender, RoutedEventArgs e)
  97. {
  98. // 指定 ResourceContext 为 zh-Hans-CN 语言环境
  99. ResourceContext resourceContext = new ResourceContext();
  100. resourceContext.Languages = new List<string>() { "zh-Hans-CN" };
  101.  
  102. // 获取 zh-Hans 语言环境下的 Resources 映射
  103. ResourceMap resourceMap = ResourceManager.Current.MainResourceMap.GetSubtree("Resources");
  104. lblMsg.Text += Environment.NewLine;
  105. // 获取指定的语言环境下的指定标识的资源
  106. lblMsg.Text += "简体中文的 Hello: " + resourceMap.GetValue("Hello", resourceContext).ValueAsString;
  107. }
  108. }
  109. }

OK
[源码下载]

背水一战 Windows 10 (80) - 本地化的更多相关文章

  1. 背水一战 Windows 10 (13) - 绘图: Stroke, Brush

    [源码下载] 背水一战 Windows 10 (13) - 绘图: Stroke, Brush 作者:webabcd 介绍背水一战 Windows 10 之 绘图 Stroke - 笔划 Brush ...

  2. 背水一战 Windows 10 (34) - 控件(进度类): RangeBase, Slider, ProgressBar, ProgressRing

    [源码下载] 背水一战 Windows 10 (34) - 控件(进度类): RangeBase, Slider, ProgressBar, ProgressRing 作者:webabcd 介绍背水一 ...

  3. 背水一战 Windows 10 (111) - 通知(Tile): secondary tile 模板之图片, secondary tile 模板之分组

    [源码下载] 背水一战 Windows 10 (111) - 通知(Tile): secondary tile 模板之图片, secondary tile 模板之分组 作者:webabcd 介绍背水一 ...

  4. 背水一战 Windows 10 (81) - 全球化

    [源码下载] 背水一战 Windows 10 (81) - 全球化 作者:webabcd 介绍背水一战 Windows 10 之 全球化 Demo 格式化数字 示例1.演示全球化的基本应用Locali ...

  5. 背水一战 Windows 10 (74) - 控件(控件基类): UIElement - 与 CanDrag 相关的事件, 与 AllowDrop 相关的事件

    [源码下载] 背水一战 Windows 10 (74) - 控件(控件基类): UIElement - 与 CanDrag 相关的事件, 与 AllowDrop 相关的事件 作者:webabcd 介绍 ...

  6. 背水一战 Windows 10 (57) - 控件(集合类): ListViewBase - 增量加载, 分步绘制

    [源码下载] 背水一战 Windows 10 (57) - 控件(集合类): ListViewBase - 增量加载, 分步绘制 作者:webabcd 介绍背水一战 Windows 10 之 控件(集 ...

  7. 背水一战 Windows 10 (11) - 资源: CustomResource, ResourceDictionary, 加载外部的 ResourceDictionary 文件

    [源码下载] 背水一战 Windows 10 (11) - 资源: CustomResource, ResourceDictionary, 加载外部的 ResourceDictionary 文件 作者 ...

  8. 背水一战 Windows 10 (12) - 绘图: Shape, Path

    [源码下载] 背水一战 Windows 10 (12) - 绘图: Shape, Path 作者:webabcd 介绍背水一战 Windows 10 之 绘图 Shape - 图形 Path - 路径 ...

  9. 背水一战 Windows 10 (37) - 控件(弹出类): MessageDialog, ContentDialog

    [源码下载] 背水一战 Windows 10 (37) - 控件(弹出类): MessageDialog, ContentDialog 作者:webabcd 介绍背水一战 Windows 10 之 控 ...

随机推荐

  1. Linq(高级查询)

    一.条件查 public List<Users> ss(string ids) { List<Users> ulist=new List<Users>(); 声明使 ...

  2. 无法启动 nexus 服务,错误1067:进程意外终止。java环境变量设置技巧。

    Nexus启动失败 wrapper.log记载: 无支持版本 51.0,版本51.0指的是Java1.7. 分析: nexus版本为2.14.8,适用JRE版本为1.7. 已配置JAVA_HOME为1 ...

  3. java学习--"==”和 equals

    ==  比较的是两个值是否相等 这里的值有可能是基础类型的值,也有可能是指向对象的引用 equals方法如何比较,要看这个类的equals方法是如何定义的 基类Object类的equals方法比较的是 ...

  4. 面向对象的css less 和sass

    Css 初始化   reset.css      或者  normalise .   Near.css兼容IE6以及现代浏览器. Oocss  也就是面向对象的css         面向对象是将cs ...

  5. js中子窗口调用父窗口中的变量、函数

  6. 写出良好风格的JS、CSS代码

    现在代码的格式都有 eslint.prettier.babel 这些来保证,但是技术手段再高端都不能解决代码可读性的问题. 因为这个只有个人才能解决.但是注意一下事项,可以显著提高代码的可读性.可识别 ...

  7. mongodb异常恢复

    构造mongdb异常 启动mongodb,bash mongodb.sh #!/bin/bash pid_file=/var/run/mongodb/mongod.pid pid_dir=/var/r ...

  8. Windows 10同步时间的方法

    今天在安装了Windows 10 1809(October 2018 update)之后发现时间不能同步,以前并没有出现这种情况. 1) 打开控制面板,找到时钟域地区 2) 选择日期和时间 3) 选择 ...

  9. linux 查找java程序、杀死、重启

    查看java进程 ps -ef|grep java杀死进程 kill -9 4834 (进程号)启动 java -jar xxx.jar & (后台会一直运行)

  10. Linux Ipv6地址配置

    Step1:启用IPV6网络配置 [root@node-1 ~]# vi /etc/sysconfig/network NETWORKING_IPV6=yes   //全局启用ipv6初始化IPV6_ ...