読者です 読者をやめる 読者になる 読者になる

うさぎ駆動開発

UWP, Xamarin.Macを中心によしなしごとを書いていきます。

UWP アプリのローカライズをしよう (前編)

UWP VisualStudio Windows 10

アプリを公開すると半分くらいは海外ストアからダウンロードされてるようなのです。英語対応くらいはしておくと目に留まる機会が増えるかもです。審査はめんどくさいけど…

ということでまずはVisualStudio だけでできる仕組みで多言語化を試してみます。

新規にUWP BlankProject を作った状態で,プロジェクトにStringsフォルダと,言語毎のフォルダを掘っていきます。ここではen-USja-JPを用意しました。 f:id:ailen0ada:20160405220826p:plain

配下に置くResources.reswは新規追加ダイアログから。ファイル名はこれでなくてもかまいませんが,手間がちょっと増えます。 f:id:ailen0ada:20160405220945p:plain

先にMainPage.xamlを編集してしまいます。今回のサンプルはこんな感じ。

x:Uidディレクティブに注目してください。後述しますが,ここで指定した値はアプリケーションレベルで同一の範囲に存在することになります。x:Nameと揃える必要は特にありません。

ということでResources.reswにエントリを追加しましょう。 f:id:ailen0ada:20160405221759p:plain f:id:ailen0ada:20160405221807p:plain x:Uidで指定した値に続けて,そのx:Uid値を持つコントロールのプロパティに注入するリソース文字列を指定します。前述したとおりx:Uidはアプリケーションレベルで同一の範囲に存在しますが,唯一である必要はありません。

すなわち,アプリケーション内に同じx:Uidを持つコントロールがいくつ存在してもかまいません。別の画面で同じ文字列を表示したいときは同じx:Uidを持たせることができます。

コードビハインドから参照するときはこのように書きます。

もしもリソースファイル名をResources.resw以外にした場合はResourceLoaderの引数に与えます。例えばMessages.reswにしたときは,ResourceLoader.GetForCurrentView("Messages");とします。

では実行してみましょう。日本語環境ではこうなります。 f:id:ailen0ada:20160405223624p:plain

ふんふんなるほど。では英語に切り替えましょう…といっても地域設定変更からのサインアウトだとCortanaさんが面倒なことになるので,確認するだけならコードからカルチャを変更してしまいましょう。

// App.xaml.cs内
protected override void OnLaunched(LaunchActivatedEventArgs e)
{
    CultureInfo.CurrentUICulture = new CultureInfo("en-US");
// 以下略

これは起動時にしか使えません。実行中に変更したい場合はこちら。

ApplicationLanguages.PrimaryLanguageOverride = "en";
// このあとフレームをリロードする必要あり

f:id:ailen0ada:20160405224144p:plain 英語がひどいのは置いといても,閉じる(C)がそのまま残っています…。が,まあ表示はこれで確認できると。審査用にスクリーンショットを用意する用途ならこれで十分。

UIカルチャに適したリソースが見つからなかったときのデフォルト言語はPackage.appxmanifestで設定できます。 f:id:ailen0ada:20160405224403p:plain

次回予告

VisualStudio だけでここまでできますが,なんかめんどくさくないですか?ResourceLoader.GetForCurrentViewとかちょっと長いし…。というのを後編で解決していきたいと思っています。