重新想象 Windows 8 Store Apps (57) - 本地化和全球化

简介: 原文:重新想象 Windows 8 Store Apps (57) - 本地化和全球化[源码下载] 重新想象 Windows 8 Store Apps (57) - 本地化和全球化 作者:webabcd介绍重新想象 Windows 8 Store Apps 之 本地化和全球化 本地化 - ...
原文: 重新想象 Windows 8 Store Apps (57) - 本地化和全球化

[源码下载]


重新想象 Windows 8 Store Apps (57) - 本地化和全球化



作者:webabcd


介绍
重新想象 Windows 8 Store Apps 之 本地化和全球化

  • 本地化 - Demo
  • 本地化 - 改变语言
  • 全球化 - Demo
  • 全球化 - 格式化数字



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

<Page
    x:Class="XamlDemo.Localization.LocalizationDemo"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:XamlDemo.Localization"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d">

    <Grid Background="Transparent">
        <StackPanel Margin="120 0 0 0">
            
            <TextBlock FontSize="14.667">
                <Run>本地化资源文件,以下举例说明:</Run>
                <LineBreak />
                <Run>1、在 en 目录下的是英文资源文件,在 zh-CN 目录下的是简体中文(zh 代表语言,CN 代表国家或地区)资源文件</Run>
                <LineBreak />
                <Run>2、Resources.lang-en.resw 代表英文资源文件,Resources.lang-zh-CN.resw 代表简体中文资源文件</Run>
                <LineBreak />
                <Run>3、图片资源的本地化可以参照以上命名规则,同时可与 scale 和 high contrast 相结合</Run>
                <LineBreak />
                <Run>4、Package.appxmanifest 中引用的字符串也支持本地化,引用方式:ms-resource:Hello 或 ms-resource:///Resources/Hello</Run>
                <LineBreak />
                <Run>5、Tile 和 Toast 中引用的字符串也支持本地化,引用方式:ms-resource:Hello 或 ms-resource:///Resources/Hello</Run>
                <LineBreak />
                <Run>6、当无法找到某语言对应的资源时,系统会自动使用 Package.appxmanifest 中设置的默认语言所对应的资源</Run>
            </TextBlock>

            <!--
                通过 x:Uid 本地化控件的各个属性,请参看资源文件中的 HelloTextBlock.FontSize 和 HelloTextBlock.Text
            -->
            <TextBlock x:Uid="HelloTextBlock" Margin="0 10 0 0" />

            <!--
                code - behind 方式获取本地化资源
            -->
            <TextBlock x:Name="lblMsg" FontSize="14.667" Margin="0 10 0 0" />

            <!--
                图片的本地化
            -->
            <Image Source="/Localization/Logo.png" Width="200" Height="100" Margin="0 10 0 0" HorizontalAlignment="Left" />
            
        </StackPanel>
    </Grid>
</Page>

Localization/LocalizationDemo.xaml.cs

/*
 * 演示本地化的基本应用
 * 
 * 另:
 * Visual Studio 2012 的多语言应用程序工具包请参见:http://msdn.microsoft.com/zh-cn/windows/apps/hh848309
 */

using Windows.ApplicationModel.Resources;
using Windows.ApplicationModel.Resources.Core;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Navigation;

namespace XamlDemo.Localization
{
    public sealed partial class LocalizationDemo : Page
    {
        public LocalizationDemo()
        {
            this.InitializeComponent(); 
        }

        protected override void OnNavigatedTo(NavigationEventArgs e)
        {
            /*
             * ResourceLoader resourceLoader = new ResourceLoader(); - 获取默认的 ResourceLoader(Resources.resw 中的资源)
             * ResourceLoader resourceLoader = new ResourceLoader("MyResources"); - 获取指定的 ResourceLoader(MyResources.resw 中的资源)
             * ResourceLoader resourceLoader = new ResourceLoader("ClassLibrary/MyResources"); - 获取指定类库的指定的 ResourceLoader(ClassLibrary 类库中的 MyResources.resw 中的资源)
             */

            // 获取默认的 ResourceLoader(即 Resources.resw 中的资源)
            ResourceLoader resourceLoader = new ResourceLoader();

            // 通过资源标识,获取指定的资源
            lblMsg.Text = resourceLoader.GetString("Hello");
        }
    }
}


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

<Page
    x:Class="XamlDemo.Localization.Language"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:XamlDemo.Localization"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d">

    <Grid Background="Transparent">
        <StackPanel Margin="120 0 0 0">
            
            <ComboBox Name="cmbLanguage" Width="800" HorizontalAlignment="Left" />

            <Button Name="btnGetEng" Content="获取英文资源" Margin="0 10 0 0" Click="btnGetEng_Click_1" />
            
            <TextBlock Name="lblMsg" FontSize="14.667" Margin="0 10 0 0" />
            
        </StackPanel>
    </Grid>
</Page>

Localization/Language.xaml.cs

/*
 * 演示与“改变语言”相关的一些应用
 * 
 * 1、演示如何改变当前的语言环境
 * 2、演示如何监测当前语言环境发生的变化
 * 3、演示如何获取指定语言环境下的资源
 */

using System;
using System.Collections.Generic;
using System.Text;
using Windows.ApplicationModel.Resources.Core;
using Windows.Globalization;
using Windows.UI.Core;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;

namespace XamlDemo.Localization
{
    public sealed partial class Language : Page
    {
        public Language()
        {
            this.InitializeComponent();

            this.Loaded += Language_Loaded;
        }

        void Language_Loaded(object sender, RoutedEventArgs e)
        {
            string currentLanguage;
            // 获取当前的语言
            ResourceManager.Current.DefaultContext.QualifierValues.TryGetValue("Language", out currentLanguage);
            lblMsg.Text = "current language: " + currentLanguage;
            lblMsg.Text += Environment.NewLine;

            // ApplicationLanguages.ManifestLanguages - 遍历 Package.appxmanifest 中的语言列表
            foreach (string strLang in ApplicationLanguages.ManifestLanguages)
            {
                // 关于 Language 的说明详见 GlobalizationDemo.xaml
                var lang = new Windows.Globalization.Language(strLang);
                cmbLanguage.Items.Add(string.Format("DisplayName:{0}, NativeName:{1}, LanguageTag:{2}, Script:{3}",
                    lang.DisplayName, lang.NativeName, lang.LanguageTag, lang.Script));
            }
            cmbLanguage.SelectionChanged += cmbLanguage_SelectionChanged;

            // 获取当前语言环境的指定资源
            lblMsg.Text += ResourceManager.Current.MainResourceMap.GetValue("Resources/Hello").ValueAsString;
            // 当前语言环境发生改变时所触发的事件(通过 API 更改或者通过“电脑设置 -> 常规 -> 语言首选项”更改都会触发此事件)
            ResourceManager.Current.DefaultContext.QualifierValues.MapChanged += async (s, m) =>
            {
                await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
                {
                    lblMsg.Text += Environment.NewLine;
                    lblMsg.Text += ResourceManager.Current.MainResourceMap.GetValue("Resources/Hello").ValueAsString;
                });
            };
        }

        void cmbLanguage_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            // ApplicationLanguages.PrimaryLanguageOverride - 设置或获取首选语言的 BCP-47 语言标记
            if (cmbLanguage.SelectedValue.ToString().Contains("LanguageTag:en"))
                Windows.Globalization.ApplicationLanguages.PrimaryLanguageOverride = "en";
            else if (cmbLanguage.SelectedValue.ToString().Contains("LanguageTag:zh-Hans-CN"))
                Windows.Globalization.ApplicationLanguages.PrimaryLanguageOverride = "zh-Hans-CN";

            StringBuilder sb = new StringBuilder();
            // ApplicationLanguages.Languages - 运行时级别的语言列表
            foreach (string item in ApplicationLanguages.Languages)
            {
                sb.Append(item);
                sb.Append(",");
            }

            lblMsg.Text += Environment.NewLine;
            lblMsg.Text += "ApplicationLanguages.Languages: " + sb.ToString();
        }

        private void btnGetEng_Click_1(object sender, RoutedEventArgs e)
        {
            // 指定 ResourceContext 为 en 语言环境
            ResourceContext resourceContext = new ResourceContext();
            resourceContext.Languages = new List<string>() { "en" };

            // 获取 en 语言环境下的 Resources 映射
            ResourceMap resourceMap = ResourceManager.Current.MainResourceMap.GetSubtree("Resources");
            lblMsg.Text += Environment.NewLine;
            // 获取指定的语言环境下的指定标识的资源
            lblMsg.Text += "英语的 Hello: " + resourceMap.GetValue("Hello", resourceContext).ValueAsString;
        }
    }
}


3、演示全球化的基本应用
Localization/GlobalizationDemo.xaml

<Page
    x:Class="XamlDemo.Localization.GlobalizationDemo"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:XamlDemo.Localization"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d">

    <Grid Background="Transparent">
        <StackPanel Margin="120 0 0 0">

            <TextBlock Name="lblMsg" FontSize="14.667" />

        </StackPanel>
    </Grid>
</Page>

Localization/GlobalizationDemo.xaml.cs

/*
 * 演示全球化的基本应用
 * 
 * 注:本地化和全球化的区别
 * 1、全球化的产品应该适用于任何一个本地市场
 * 2、本地化通常会有 UI 的调整,语言的翻译,甚至是针对本地开发的一些特殊的功能
 * 3、一个全球化的产品做本地化时,一般只做语言翻译
 */

using System;
using Windows.Globalization;
using Windows.System.UserProfile;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Navigation;

namespace XamlDemo.Localization
{
    public sealed partial class GlobalizationDemo : Page
    {
        public GlobalizationDemo()
        {
            this.InitializeComponent();
        }

        protected override void OnNavigatedTo(NavigationEventArgs e)
        {
            // 首选语言
            lblMsg.Text = "Current Languages: " + string.Join(", ", GlobalizationPreferences.Languages);
            lblMsg.Text += Environment.NewLine;
            // 首选日历(比如:GregorianCalendar 提供了世界上大多数国家/地区使用的标准日历系统)
            lblMsg.Text += "Current Calendars: " + string.Join(", ", GlobalizationPreferences.Calendars); 
            lblMsg.Text += Environment.NewLine;
            // 时钟显示(比如:24HourClock)
            lblMsg.Text += "Current Clocks: " + string.Join(", ", GlobalizationPreferences.Clocks);
            lblMsg.Text += Environment.NewLine;
            // 区域(比如:CN)
            lblMsg.Text += "Current HomeGeographicRegion: " + GlobalizationPreferences.HomeGeographicRegion;
            lblMsg.Text += Environment.NewLine;
            // 一周的第一天是周几(比如:中国是 Monday)
            lblMsg.Text += "Current WeekStartsOn: " + GlobalizationPreferences.WeekStartsOn.ToString();
            lblMsg.Text += Environment.NewLine;
            lblMsg.Text += Environment.NewLine;


            // Language - 语言对象,通过指定 BCP-47 语言标记来实例化语言对象
            Windows.Globalization.Language language = new Windows.Globalization.Language("zh-Hans-CN");
            // 语言的本地化名称
            lblMsg.Text += "zh-Hans-CN Language DisplayName: " + language.DisplayName;
            lblMsg.Text += Environment.NewLine;
            // 语言本身的名称
            lblMsg.Text += "zh-Hans-CN Language NativeName: " + language.NativeName;
            lblMsg.Text += Environment.NewLine;
            // 语言的 BCP-47 语言标记
            lblMsg.Text += "zh-Hans-CN Language LanguageTag: " + language.LanguageTag;
            lblMsg.Text += Environment.NewLine;
            // 语言的 ISO 15924 脚本代码
            lblMsg.Text += "zh-Hans-CN Language Script: " + language.Script;
            lblMsg.Text += Environment.NewLine;
            // 获取当前输入法编辑器 (IME) 的 BCP-47 语言标记
            lblMsg.Text += "zh-Hans-CN Language CurrentInputMethodLanguageTag: " + Windows.Globalization.Language.CurrentInputMethodLanguageTag;
            lblMsg.Text += Environment.NewLine;
            lblMsg.Text += Environment.NewLine;


            // GeographicRegion - 区域对象(关于 ISO 3166-1 请参见:http://zh.wikipedia.org/zh-cn/ISO_3166-1
            GeographicRegion geographicRegion = new GeographicRegion(); // 获取当前的区域对象。
            // 区域的本地化名称
            lblMsg.Text += "Current Region DisplayName: " + geographicRegion.DisplayName;
            lblMsg.Text += Environment.NewLine;
            // 区域本身的名称
            lblMsg.Text += "Current Region NativeName: " + geographicRegion.NativeName;
            lblMsg.Text += Environment.NewLine;
            // 该区域内使用的货币类型
            lblMsg.Text += "Current Region CurrenciesInUse: " + string.Join(",", geographicRegion.CurrenciesInUse);
            lblMsg.Text += Environment.NewLine;
            // 该区域的 ISO 3166-1 二位字母标识
            lblMsg.Text += "Current Region CodeTwoLetter: " + geographicRegion.CodeTwoLetter;
            lblMsg.Text += Environment.NewLine;
            // 该区域的 ISO 3166-1 三位字母标识
            lblMsg.Text += "Current Region CodeThreeLetter: " + geographicRegion.CodeThreeLetter;
            // 该区域的 ISO 3166-1 数字标识
            lblMsg.Text += Environment.NewLine;
            lblMsg.Text += "Current Region CodeThreeDigit: " + geographicRegion.CodeThreeDigit;
            lblMsg.Text += Environment.NewLine;
            lblMsg.Text += Environment.NewLine;


            // Calendar - 日历对象,默认返回当前系统的默认日历
            Calendar calendarDefault = new Calendar();
            // 第一个参数:将日历转换为字符串时,优先使用的语言标识列表;第二个参数:指定日历的类型;第三个参数:指定是12小时制还是24小时制
            Calendar calendarHebrew = new Calendar(new[] { "zh-CN" }, CalendarIdentifiers.Hebrew, ClockIdentifiers.TwentyFourHour);
            lblMsg.Text += "Gregorian Day: " + calendarDefault.DayAsString(); // 公历的日期
            lblMsg.Text += Environment.NewLine;
            lblMsg.Text += "Hebrew Day: " + calendarHebrew.DayAsString(); // 希伯来历的日期
            // Calendar 还有很多属性和方法,不再一一介绍,需要时查 msdn
        }
    }
}


4、演示不同语言环境下对数字的格式化
Localization/NumberFormatting.xaml

<Page
    x:Class="XamlDemo.Localization.NumberFormatting"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:XamlDemo.Localization"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d">

    <Grid Background="Transparent">
        <StackPanel Margin="120 0 0 0">

            <TextBlock Name="lblMsg" FontSize="14.667" />

        </StackPanel>
    </Grid>
</Page>

Localization/NumberFormatting.xaml.cs

/*
 * 演示不同语言环境下对数字的格式化
 */

using System;
using Windows.Globalization.NumberFormatting;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Navigation;

namespace XamlDemo.Localization
{
    public sealed partial class NumberFormatting : Page
    {
        public NumberFormatting()
        {
            this.InitializeComponent();
        }

        protected override void OnNavigatedTo(NavigationEventArgs e)
        {
            // 百分比格式化
            PercentFormatter percentFormatter = new PercentFormatter();
            // PercentFormatter percentFormatter = new PercentFormatter(new[] { "zh-Hans-CN" }, "CN");
            lblMsg.Text = percentFormatter.Format(3.1415926);
            lblMsg.Text += Environment.NewLine;

            // 千分比格式化
            PermilleFormatter permilleFormatter = new PermilleFormatter();
            //  PermilleFormatter permilleFormatter = new PermilleFormatter(new[] { "zh-Hans-CN" }, "CN");
            lblMsg.Text += permilleFormatter.Format(3.1415926);
            lblMsg.Text += Environment.NewLine;

            // 数字格式化
            DecimalFormatter decimalFormatter = new DecimalFormatter();
            // DecimalFormatter decimalFormatter = new DecimalFormatter(new[] { "zh-Hans-CN" }, "CN");
            lblMsg.Text += decimalFormatter.Format(3.1415926);
            lblMsg.Text += Environment.NewLine;

            // 货币格式化
            CurrencyFormatter currencyFormatter = new CurrencyFormatter("CNY");
            // CurrencyFormatter currencyFormatter = new CurrencyFormatter("CNY", new[] { "zh-Hans-CN" }, "CN");
            lblMsg.Text += currencyFormatter.Format(3.1415926);
        }
    }
}



OK
[源码下载]

目录
相关文章
|
5月前
|
Linux C++ Windows
【Azure 应用服务】Azure App Service(Windows)环境中如何让.NET应用调用SAP NetWeaver RFC函数
【Azure 应用服务】Azure App Service(Windows)环境中如何让.NET应用调用SAP NetWeaver RFC函数
【Azure 应用服务】Azure App Service(Windows)环境中如何让.NET应用调用SAP NetWeaver RFC函数
|
2月前
|
C# Windows
【Azure App Service】在App Service for Windows上验证能占用的内存最大值
根据以上测验,当使用App Service内存没有达到预期的值,且应用异常日志出现OutOfMemory时,就需要检查Platform的设置是否位64bit。
52 11
|
5月前
|
Java 应用服务中间件 开发工具
[App Service for Windows]通过 KUDU 查看 Tomcat 配置信息
[App Service for Windows]通过 KUDU 查看 Tomcat 配置信息
|
5月前
|
Java 应用服务中间件 Windows
【App Service for Windows】为 App Service 配置自定义 Tomcat 环境
【App Service for Windows】为 App Service 配置自定义 Tomcat 环境
|
5月前
|
PHP Windows
【Azure App Service for Windows】 PHP应用出现500 : The page cannot be displayed because an internal server error has occurred. 错误
【Azure App Service for Windows】 PHP应用出现500 : The page cannot be displayed because an internal server error has occurred. 错误
|
5月前
|
PHP 开发工具 git
【Azure 应用服务】在 App Service for Windows 中自定义 PHP 版本的方法
【Azure 应用服务】在 App Service for Windows 中自定义 PHP 版本的方法
|
5月前
|
网络安全 API 数据安全/隐私保护
【Azure App Service】.NET代码实验App Service应用中获取TLS/SSL 证书 (App Service Windows)
【Azure App Service】.NET代码实验App Service应用中获取TLS/SSL 证书 (App Service Windows)
|
5月前
|
Shell PHP Windows
【Azure App Service】Web Job 报错 UNC paths are not supported. Defaulting to Windows directory.
【Azure App Service】Web Job 报错 UNC paths are not supported. Defaulting to Windows directory.
|
5月前
|
存储 Linux Windows
【应用服务 App Service】App Service For Windows 如何挂载Storage Account File Share 示例
【应用服务 App Service】App Service For Windows 如何挂载Storage Account File Share 示例
|
5月前
|
应用服务中间件 nginx Windows
【Azure 应用服务】在App Service for Windows中实现反向代理
【Azure 应用服务】在App Service for Windows中实现反向代理