zoukankan      html  css  js  c++  java
  • 重新想象 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
    [源码下载]

  • 相关阅读:
    .NET CORE 3.1.5 跨域设置
    NET CORE WebAPI 搭建--基础搭建
    EF 表中中多次指定了列名解决办法
    .Net Core 3.1.2 区域路由配置【原创】
    浅谈DevOps
    阿里云服务器SQLSERVER 2019 远程服务器环境搭建【原创】【转载请注明出处】
    c# vs2019 Window服务搭建
    云服务器和域名的使用简历
    WAI-ARIA无障碍网页资料
    kendoUI toolbar kendoComboBox 使用
  • 原文地址:https://www.cnblogs.com/webabcd/p/3302488.html
Copyright © 2011-2022 走看看