1.1 デフォルト言語用リソースファイルを追加する
- Visual Studio でプロジェクトを開く。
- Solution Explorer でプロジェクト名を右クリックし、Add → New Item... と進む。
- Add New Item ダイアログで Resources File を選択、適当なファイル名(例:AppResources.resx)を付けて Add ボタンをクリックする。
1.2 サポート対象言語用リソースファイルを追加する
- 上記と同じ方法でリソースファイルを追加する。ファイル名にはカルチャーとランゲージを含めておく。
日本語の例: AppResources.ja-JP.resx
1.3 リソースファイルをPublicアクセス可能にする
- Solution Explorer でリソースファイルを開く。
- AccessModifier リストボックスで Public を選択する。
- 同じ処理をすべてのリソースファイルに対しておこなう。
1.4 リソースファイルにエントリーを追加する
例:
AppResources.resx (en-US用) に次のエントリーを追加
Name=ApplicationDescriptionText
Value=This is an i18n-aware application.
AppResources.ja-JP.resx (ja-JP用) に次のエントリーを追加
Name=ApplicationDescriptionText
Value=これは国際化対応したアプリケーションです。
2. リソースの設定
2.1 デフォルトのカルチャーを定義する
- Solution Explorer でプロジェクト名を右クリックし、Properties を選ぶ。
- Application タブで、Assembly Information ボタンをクリックする。
- Neutral Language でデフォルトのカルチャー(例: English (United States))を選択し、OK ボタンをクリックする。
2.2 サポート対象言語を宣言する
- プロジェクトを閉じ、プロジェクトファイル(*.csproj)をテキストエディターで開く。
- <SupportedCultures> タグを見つけ、そこに、セミコロン区切りでサポート対象言語をリストアップする。
日本語の例: <SupportedCultures>ja-JP;</SupportedCultures>
3. リソースにアクセスするための準備
3.1 リソースクラスにアクセスするためのアクセッサークラスを作成する
namespace MyApplication
{
public class AppResourcesProvider
{
public AppResourcesProvider()
{
}
private static AppResources appResources_ = new AppResources();
public AppResources AppResources { get { return appResources_; } }
}
}
3.2 アクセッサークラスのインスタンスを生成し、参照できるよう、App.xaml を編集する
Application タグに xmlns:local を追加し、Application.Resources タグに local:AppResourcesProvider を追加する。
<Application
x:Class="MyApplication.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
xmlns:local="clr-namespace:MyApplication"
>
<!--Application Resources-->
<Application.Resources>
<local:AppResourcesProvider x:Key="AppResourcesProvider" />
</Application.Resources>
<Application.ApplicationLifetimeObjects>
<!--Required object that handles lifetime events for the application-->
<shell:PhoneApplicationService
Launching="Application_Launching" Closing="Application_Closing"
Activated="Application_Activated" Deactivated="Application_Deactivated"/>
</Application.ApplicationLifetimeObjects>
</Application>
4. リソースの利用
4.1 データバインディングを使い、アクセッサークラス経由でリソースを利用する
例:リソース ApplicationDescriptionText の値を TextBlock に設定する場合
<TextBlock Name="ApplicationDescription"
Text="{Binding Source={StaticResource AppResourcesProvider},
Path=AppResources.ApplicationDescriptionText}" />
以上でローカライズの作業は終了。詳細は How to: Build a Localized Application for Windows Phone を参照のこと。
なお、リソースファイルを自動生成するためのコマンド ResGen が、自動生成するクラスのコンストラクタを internal ではなく public にしてくれれば、リソースクラスにアクセスするためのアクセッサークラスをわざわざ作成する必要はない:
http://connect.microsoft.com/VisualStudio/feedback/details/628281/silverlight-wp7-resource-files-and-binding
しかし、この問題はまだ解消されていない。