Sidebar |
ストアアプリ xaml 国際化 i18n の仕方
C# 2015 の内容です 2015以前のバージョンのVSではやり方が違うようです。 UWPアプリの国際化 (1) デフォルト言語の設定 Package.appxmanifestの既定のの言語(default language) ja-JPになっているので、en-USに変更します ※カルチャのリソースが存在しない場合、この言語が適用されます (2) リソースの作成 カルチャ名 ("ja-JP" など) と、それに続く既定のリソース名とリソース ファイルの拡張子 ("ko-kr\Resources.resw" など) を使用して、リソースを表します。 https://msdn.microsoft.com/ja-jp/library/hh694557.aspx カルチャ名より前の親フォルダの規定はないようなので、 i18nフォルダを作成しその下にローカライズされたものをいれることにします ソリューションエクスプローラーで追加をクリックし
リソース キー
UID名.プロパティ名 TextBlockでは、Contentとなります (2-2) i18n/ja-JP/Resources.resw リソース キー
(3) MainPage.xaml <TextBlock x:Uid="TextBlock_1"></TextBlock> コントロールに uidを割り当てます。 x:Uid="stringID" をコントロールに埋め込みます
リソースに複数同じUIDのプロパティ値が存在するとエラーになります x:Uid="open" としていて、Textblockとメニューにいれたとします
これらは、ContentとTextとそれぞれ違うプロパティになります
open.Content open.Text という値をリソースに埋めていると
型 'Windows.UI.Xaml.Markup.XamlParseException' の例外が
発生しましたが、ユーザー コード内ではハンドルされませんでした
となります。「stringID」と「リソースキー名.プロパティ値」は、一対一の関係でないといけません 以上の(1)~(3)だけで 国際化は完了です カレントカルチャもとづいて、勝手に切り替わります 海外に住んでいて日本語Windowsでない場合は、英語になってしまいます。 これでは困ります。ユーザーが切り替えれるようにする必要があります つづいて、動的に リソースを 変更する方法です リソース文字列の取得 var loader = new Windows.ApplicationModel.Resources.ResourceLoader.GetForCurrentView(); var text = loader.GetString("リソース名"); 起動時に en-USにする方法 App.xaml.cs を開き OnLaunched関数に以下の行を追加します protected override void OnLaunched(LaunchActivatedEventArgs e) { System.Globalization.CultureInfo.CurrentUICulture = new System.Globalization.CultureInfo("en-US"); こうすると、英語になります。 国際化した意味がないですけどね~。 確認したらコードを消すか、コメントアウトするといいです。 クリックしたら切り替える ChangeCulture関数を作りました。
ストアアプリにApplication.DoEventsがないため、ストップウォッチに回しています 1ms待ちでもリソース変更するようです。念のため10msにしています。 private void button_open1_Click(object sender, RoutedEventArgs e) { this.ChangeCulture("en-US"); //this.ChangeCulture("ja-JP", false); } public async void ChangeCulture(string CultureName, bool is_Permanence = true) { if (CultureName == "") { // reset PrimaryLanguageOverride Windows.Globalization.ApplicationLanguages.PrimaryLanguageOverride = ""; } else { System.Globalization.CultureInfo cn = new System.Globalization.CultureInfo(CultureName); if (is_Permanence) Windows.Globalization.ApplicationLanguages.PrimaryLanguageOverride = cn.Parent.Name; else System.Globalization.CultureInfo.CurrentUICulture = cn; } // clear resource cache Windows.ApplicationModel.Resources.Core.ResourceContext.GetForCurrentView().Reset(); Windows.ApplicationModel.Resources.Core.ResourceContext.GetForViewIndependentUse().Reset(); if (this.Frame != null) { // wait for resource change var stopwatch = System.Diagnostics.Stopwatch.StartNew(); await System.Threading.Tasks.Task.Delay(TimeSpan.FromMilliseconds(10)); stopwatch.Stop(); // refresh page this.Frame.Navigate(typeof(MainPage)); } } カテゴリー: ぷろぐらみんぐ/メモ
2016.06.13
|
Sidebar |