2011年6月10日金曜日

Windows Phoneアプリをローカライズする

1. リソースの準備

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

しかし、この問題はまだ解消されていない。