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時代とやり方に変更は無いようだ...つまりメンドクサイ。