UWP アプリのローカライズをしよう (前編)
アプリを公開すると半分くらいは海外ストアからダウンロードされてるようなのです。英語対応くらいはしておくと目に留まる機会が増えるかもです。審査はめんどくさいけど…
ということでまずはVisualStudio だけでできる仕組みで多言語化を試してみます。
新規にUWP BlankProject を作った状態で,プロジェクトにStrings
フォルダと,言語毎のフォルダを掘っていきます。ここではen-US
とja-JP
を用意しました。
配下に置くResources.resw
は新規追加ダイアログから。ファイル名はこれでなくてもかまいませんが,手間がちょっと増えます。
先にMainPage.xaml
を編集してしまいます。今回のサンプルはこんな感じ。
x:Uid
ディレクティブに注目してください。後述しますが,ここで指定した値はアプリケーションレベルで同一の範囲に存在することになります。x:Name
と揃える必要は特にありません。
ということでResources.resw
にエントリを追加しましょう。
x:Uid
で指定した値に続けて,そのx:Uid
値を持つコントロールのプロパティに注入するリソース文字列を指定します。前述したとおりx:Uid
はアプリケーションレベルで同一の範囲に存在しますが,唯一である必要はありません。
すなわち,アプリケーション内に同じx:Uid
を持つコントロールがいくつ存在してもかまいません。別の画面で同じ文字列を表示したいときは同じx:Uid
を持たせることができます。
コードビハインドから参照するときはこのように書きます。
もしもリソースファイル名をResources.resw
以外にした場合はResourceLoader
の引数に与えます。例えばMessages.resw
にしたときは,ResourceLoader.GetForCurrentView("Messages");
とします。
では実行してみましょう。日本語環境ではこうなります。
ふんふんなるほど。では英語に切り替えましょう…といっても地域設定変更からのサインアウトだとCortanaさんが面倒なことになるので,確認するだけならコードからカルチャを変更してしまいましょう。
// App.xaml.cs内 protected override void OnLaunched(LaunchActivatedEventArgs e) { CultureInfo.CurrentUICulture = new CultureInfo("en-US"); // 以下略
これは起動時にしか使えません。実行中に変更したい場合はこちら。
ApplicationLanguages.PrimaryLanguageOverride = "en"; // このあとフレームをリロードする必要あり
英語がひどいのは置いといても,閉じる(C)
がそのまま残っています…。が,まあ表示はこれで確認できると。審査用にスクリーンショットを用意する用途ならこれで十分。
UIカルチャに適したリソースが見つからなかったときのデフォルト言語はPackage.appxmanifest
で設定できます。
次回予告
VisualStudio だけでここまでできますが,なんかめんどくさくないですか?ResourceLoader.GetForCurrentView
とかちょっと長いし…。というのを後編で解決していきたいと思っています。