hyoromoのブログ

最近はVRSNS向けに作ったものについて書いています

WP8での国際化対応(ローカライズ化とか、多言語化とも言うよねー)


WindowsPhone7では面倒だった国際化対応も、WindowsPhone8では随分と楽になりました

WP7SDK から WP8SDK での変更点(WP7時代を知らない人は見なくていい)

Visual Studio 2012のWPテンプレートを作成すると、主に以下が変わっていました。

  • XAMLからRESXファイルへアクセスする為のクラス「LocalizedStrings.cs」が勝手に作られる
  • XAMLからRESXファイルへアクセスする為の定義がちゃんとApp.xamlへ追記されてる
  • ニュートラル言語用に「AppResources.resx」が用意されている
  • サポート言語を増やすと、対応した「AppResources.resx」ファイルが自動的に作成される

泥臭い対応がいらなくなり、スッキリしました。※アプリ外は除く

WP8での国際化対応の手順

本サイトでの説明はニュートラル言語を"英語(米国)"サポート言語を"日本語(日本)"にします*1

1.ニュートラル言語を決める


「Properties」を開き、「アプリケーション」タブの"アセンブリ情報"ボタンを押下します。「ニュートラル言語」が"日本語(日本)"になってますので、こちらを"英語(米国)"に変更します*2

2.サポート言語の追加


「Properties」を開き、「アプリケーション」タブ上の"サポートされているカルチャ"を変更します。※(1)を行ったあと、「アプリケーション」タブを一度リロードしなければ、(1)で行った内容が画面上に反映されていません。
初期値が"英語(米国) -既定"となっているので、"日本語(日本)"を追加します。そうすると、「Resources」ディレクトリに「AppResources.ja-JP.resx」ファイルが自動追加されます。

3.言語毎にテキストを用意


Key-Value形式でKey(定数)に対し、Value(ローカライズされた文章)をresxファイルに定義していきます。
テンプレート作成時にニュートラル言語用「AppResources.resxと、(2)でサポート言語用「AppResources.ja-JP.resxが追加されてますので、それぞれに追加していきます。
なお、Keyの"ResourceLanguage"は対応言語にあった値を設定します*3

4.XAML上で値を設定

XAML上で先ほど定義したValueを表示したいcontrolに対し、Keyを"{Binding Path=LocalizedResources.Key, Source={StaticResource LocalizedStrings}}" のように設定します*4
例えばKey「ApplicationTitle」をTextBlockに設定するXAMLは以下のようになります。

<TextBlock Text="{Binding Path=LocalizedResources.ApplicationTitle, Source={StaticResource LocalizedStrings}}" />
5.C#ソース上で値を設定

C#ソース上で国際化対応された値を取得するには、"AppResources.Key" と書くだけで良いです。
例えばKey「AppBarButtonText」をApplicationBarのButtonテキストへ追加するコードは以下のようになります。

// ApplicationBarは追加されている前提
ApplicationBarIconButton appBarButton = new ApplicationBarIconButton(new Uri("/Assets/AppBar/appbar.add.rest.png", UriKind.Relative));
appBarButton.Text = AppResources.AppBarButtonText;
ApplicationBar.Buttons.Add(appBarButton);

なお、XAML上にApplicationBarを定義すると国際化対応できません。そのためC#ソース上でApplicationBarを追加する事になります*5

実行してみよう

対応は完了したので動作確認してください。言語切り替えは「Settings > language+region」の"Phone language"を切り替えて端末再起動すればOKです。
もしテンプレートのコメント上にだいたい方法が書いてあるので、困ったら付近のコメントを読めばなんとかなるんじゃなかろうか。

アプリ外も対応したい人は!

Application名の国際化対応&LiveTile上に表記されるApplication名を国際化対応

WP7時代とやり方に変更は無いようだ...つまりメンドクサイ。

苦労は買ってでもする人向け

How to localize an app title for Windows Phone -Dev Center

楽したい人向け

WP8 Localize -Patricks Blog

素晴らしいToolをありがとう!って事で国際化対応のまとめは終わりです。

*1:WP SDKは日本語を想定して書いています

*2:ニュートラル言語はサポート言語に設定されていない言語で表示する際に使われる言語になる為

*3:日本なら"ja-JP"、米国なら"en-US"

*4:MainPage.xamlのコメント上にも書いてあるので、そこをコピペでOK

*5:MainPage.xaml.cs のコメント上に定義してあるので、そのまま使えばOK