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

来源:http://www.cnblogs.com/webabcd/archive/2017/12/21/8078431.html
-Advertisement-
Play Games

背水一戰 Windows 10 之 本地化: Demo, 改變語言 ...


[源碼下載]


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



作者:webabcd


介紹
背水一戰 Windows 10 之 本地化

  • Demo
  • 改變語言



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

<Page
    x:Class="Windows10.Localization.LocalizationDemo"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:Windows10.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">
        <Grid.Resources>
            <ResourceDictionary>
                <local:LocalizedStrings x:Key="Localized"/>
            </ResourceDictionary>
        </Grid.Resources>

        <StackPanel Margin="10 0 10 10">

            <TextBlock>
                <Run>本地化資源文件,以下舉例說明:</Run>
                <LineBreak />
                <Run>1、在 en 目錄下的是英文資源文件,在 zh-hans 目錄下的是簡體中文(zh 代表中文,hans 代表簡體中文)資源文件(關於限定符的詳細說明請參見 /Resource/Qualifiers/)</Run>
                <LineBreak />
                <Run>2、Resources.lang-en.resw 代表英文資源文件,Resources.lang-zh-hans.resw 代表簡體中文資源文件(關於限定符的詳細說明請參見 /Resource/Qualifiers/)</Run>
                <LineBreak />
                <Run>3、Package.appxmanifest 中引用的字元串也支持本地化,引用方式:ms-resource:Hello 或 ms-resource:///Resources/Hello</Run>
                <LineBreak />
                <Run>4、Tile 和 Toast 中引用的字元串也支持本地化,引用方式:ms-resource:Hello 或 ms-resource:///Resources/Hello</Run>
                <LineBreak />
                <Run>5、當無法找到某語言對應的資源時,系統會自動使用 Package.appxmanifest 中設置的預設語言所對應的資源</Run>
            </TextBlock>

            <!--
                通過 x:Uid 本地化控制項的各個屬性,請參看資源文件中的 HelloTextBlock.FontSize 和 HelloTextBlock.Text
            -->
            <TextBlock x:Uid="HelloTextBlock" Margin="5" />

            <!--
                圖片的本地化
            -->
            <Image Source="/Localization/Logo.png" Width="200" Height="100" Margin="5" HorizontalAlignment="Left" />

            <!--
                code - behind 方式獲取本地化資源
            -->
            <TextBlock x:Name="lblMsg1" Margin="5" />

            <!--
                code - behind 方式獲取本地化資源
            -->
            <TextBlock x:Name="lblMsg2" Margin="5" />

            <!--
                code - behind 方式獲取本地化資源
            -->
            <TextBlock x:Name="lblMsg3" Margin="5" />

            <!--
                code - behind 方式獲取本地化資源
            -->
            <TextBlock x:Name="lblMsg4" Margin="5" />

            <!--
                code - behind 方式獲取本地化資源
            -->
            <TextBlock x:Name="lblMsg5" Margin="5" />

            <!--
                綁定本地化資源
            -->
            <TextBlock x:Name="lblMsg6" Margin="5" Text="{Binding [Hello], Source={StaticResource Localized}}" />

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

Localization/LocalizationDemo.xaml.cs

/*
 * 演示本地化的基本應用
 * 
 * 
 * 註:建議使用多語言應用工具包 https://developer.microsoft.com/zh-cn/windows/develop/multilingual-app-toolkit
 */

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

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

        protected override void OnNavigatedTo(NavigationEventArgs e)
        {
            /*
             * ResourceLoader resourceLoader = ResourceLoader.GetForViewIndependentUse(); - 獲取預設的 ResourceLoader(Resources.resw 中的資源)
             * ResourceLoader resourceLoader = ResourceLoader.GetForViewIndependentUse("MyResources"); - 獲取指定的 ResourceLoader(MyResources.resw 中的資源)
             * ResourceLoader resourceLoader = ResourceLoader.GetForViewIndependentUse("ClassLibrary/MyResources"); - 獲取指定類庫的指定的 ResourceLoader(ClassLibrary 類庫中的 MyResources.resw 中的資源)
             * resourceLoader.GetString(), resourceLoader.GetStringForUri() - 通過資源標識,獲取當前語言環境的指定的資源
             * 
             * GetForCurrentView() 和 GetForViewIndependentUse() 的區別如下:
             * 1、GetForCurrentView() - 在 UI 線程上執行
             * 2、GetForViewIndependentUse() - 在非 UI 線程上執行(註:Independent 這個詞在 uwp 中就時非 UI 線程的意思,比如 Independent Animation 就是不依賴 UI 線程的)
             */

            // 獲取預設的 ResourceLoader(即 Resources.resw 中的資源)
            ResourceLoader resourceLoader = ResourceLoader.GetForViewIndependentUse();

            // 通過資源標識,獲取當前語言環境的指定的資源(資源名:Hello)
            lblMsg1.Text = resourceLoader.GetString("Hello");

            // 通過資源標識,獲取當前語言環境的指定的資源(資源名:HelloTextBlock.Text)
            lblMsg2.Text = resourceLoader.GetString("HelloTextBlock/Text");

            // 通過資源標識,獲取當前語言環境的指定的資源(資源名:Hello)
            lblMsg3.Text = resourceLoader.GetStringForUri(new Uri("ms-resource:///Resources/Hello"));

            // 通過資源標識,獲取當前語言環境的指定的資源(資源名:HelloTextBlock.Text)
            lblMsg4.Text = resourceLoader.GetStringForUri(new Uri("ms-resource:///Resources/HelloTextBlock/Text"));

            // 獲取當前語言環境的指定的資源的另一種方式
            lblMsg5.Text = Windows.ApplicationModel.Resources.Core.ResourceManager.Current.MainResourceMap.GetValue("Resources/Hello", ResourceContext.GetForCurrentView()).ValueAsString;
        }
    }

    // 用於演示如何綁定本地化資源
    public class LocalizedStrings
    {
        public string this[string key]
        {
            get
            {
                return ResourceLoader.GetForCurrentView().GetString(key);
            }
        }
    }
}


2、演示與“改變語言”相關的一些應用
Localization/Language.xaml

<Page
    x:Class="Windows10.Localization.Language"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:Windows10.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 Name="root" Margin="10 0 10 10">

            <!--
                通過此種方式獲取本地化資源時,如果在頁面載入後修改了語言首選項的話是不會立即有效果的,需要重新載入頁面才行(懶的寫了,要看效果的話就先返回,然後再進來就好)
            -->
            <TextBlock x:Uid="HelloTextBlock" Margin="5" />

            <ComboBox Name="cmbLanguage" Width="800" HorizontalAlignment="Left" Margin="5" />

            <Button Name="btnGetEnglish" Content="獲取英文資源" Margin="5" Click="btnGetEnglish_Click" />
            <Button Name="btnGetChinese" Content="獲取簡體中文資源" Margin="5" Click="btnGetChinese_Click" />

            <TextBlock Name="lblMsg" Margin="5" />

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

Localization/Language.xaml.cs

/*
 * 演示與“改變語言”相關的一些應用
 * 
 * 1、演示如何改變當前的語言環境
 * 2、演示如何監測當前語言環境發生的變化
 * 3、演示如何獲取指定語言環境下的資源
 */

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

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

            this.Loaded += Language_Loaded;
        }

        void Language_Loaded(object sender, RoutedEventArgs e)
        {
            // 獲取當前的語言
            string currentLanguage;
            ResourceContext.GetForCurrentView().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;


            // 獲取當前語言環境的指定資源(更多用法請參見 LocalizationDemo.xaml)
            lblMsg.Text += ResourceLoader.GetForViewIndependentUse().GetString("Hello");


            // 當前語言環境發生改變時所觸發的事件(通過 API 更改或者通過“電腦設置 -> 常規 -> 語言首選項”更改都會觸發此事件)
            // 註:當通過 API(ApplicationLanguages.PrimaryLanguageOverride)修改語言環境時,如果監聽了 MapChanged 事件的話,則有很大的幾率會導致崩潰,本例就是這樣,原因未知
            ResourceContext.GetForCurrentView().QualifierValues.MapChanged += async (s, m) =>
            {
                await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
                {
                    lblMsg.Text += Environment.NewLine;
                    lblMsg.Text += ResourceLoader.GetForViewIndependentUse().GetString("Hello");
                });
            };
        }

        private void cmbLanguage_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            // ApplicationLanguages.PrimaryLanguageOverride - 設置或獲取首選語言(BCP-47 語言標記)
            if (cmbLanguage.SelectedValue.ToString().ToLower().Contains("en-us"))
                ApplicationLanguages.PrimaryLanguageOverride = "en-US";
            else if (cmbLanguage.SelectedValue.ToString().ToLower().Contains("zh-hans"))
                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 btnGetEnglish_Click(object sender, RoutedEventArgs e)
        {
            // 指定 ResourceContext 為 en-US 語言環境
            ResourceContext resourceContext = new ResourceContext();
            resourceContext.Languages = new List<string>() { "en-US" };

            // 獲取 en-US 語言環境下的 Resources 映射
            ResourceMap resourceMap = ResourceManager.Current.MainResourceMap.GetSubtree("Resources");
            lblMsg.Text += Environment.NewLine;
            // 獲取指定的語言環境下的指定標識的資源
            lblMsg.Text += "英語的 Hello: " + resourceMap.GetValue("Hello", resourceContext).ValueAsString;
        }

        private void btnGetChinese_Click(object sender, RoutedEventArgs e)
        {
            // 指定 ResourceContext 為 zh-Hans-CN 語言環境
            ResourceContext resourceContext = new ResourceContext();
            resourceContext.Languages = new List<string>() { "zh-Hans-CN" };

            // 獲取 zh-Hans 語言環境下的 Resources 映射
            ResourceMap resourceMap = ResourceManager.Current.MainResourceMap.GetSubtree("Resources");
            lblMsg.Text += Environment.NewLine;
            // 獲取指定的語言環境下的指定標識的資源
            lblMsg.Text += "簡體中文的 Hello: " + resourceMap.GetValue("Hello", resourceContext).ValueAsString;
        }
    }
}



OK
[源碼下載]


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 斐波那契數 由0和1開始,之後的費波那契繫數就是由之前的兩數相加而得出。 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233... 代碼實現 max為初始0,1後出現的數字最大個數 def fib(max): n, a, b = 0, 0, 1 whi ...
  • 如下圖: 按F5進入String.startsWith,如下: 點“Edit Source Lookup Path” 附加源代碼,如下圖: 附加上源代碼後如下: 可以看到,當滑鼠放在“prefix”上時,並不能看到prefix的值,解決方法如下: 1,找到JDK源代碼zip文件並解壓,如下圖: 2. ...
  • import numpy as np 數組與標量之間的運算作用於數組的每一個元素. ...
  • 登錄框消失語句 dispose(); 好友列表窗出現 使用new FriendsFrame(phone,s); 登陸對話框代碼修改如下: ...
  • 莫比烏斯反演 莫比烏斯函數$\mu$的定義: $$\begin{eqnarray}\mu(i)&=&0(i含有平方因數)\\&=&( 1)^{i的因數個數}(i不含有平方因數數)\end{eqnarray}$$ $\mu$的性質: 積性函數(不完全) 重要公式:$\sum_{d|n}\mu(d)=( ...
  • java學習筆記之eclipse下jar包導入 步驟: 1.在項目根目錄下新建lib文件夾 2.將jar包拷到lib目錄下 3.右鍵jar ,選擇Build Path 找到Add to build path 4.這就ok了 ...
  • 一、javaEEJavaSEJavaME用的同一個jar包嗎? javaEE JavaSE javaME 用的JDK是同一個,開發j2SE工程的話只要有JDK就可以了,開發J2EE工程和J2ME工程除了需要JDK還要有他們各自的一些jar包協助開發。 jdk-6u5-windows-i586-p.e ...
  • string s1 = "aaa\\bbb\nccc" ;string s2 = @"aaa\bbbccc" ;字元串 s2 等同於 s1 , @標示不會轉義字元串 ; 甚至換行頁可以 ;lxx__lxx__lxx__lxx__lxx_____ 結構體是特殊的類public struct Book ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...