アプリケーション内部のテキストのローカライズ(多言語対応)を行う

Windows Phoneは、2011年12月末時点日本国内ではIS12Tが1台だけしか出ていませんが、世界に目を向けると市場規模はとても大きいです。日本語にしか対応しないアプリケーションを作るのは非常にもったいないです。

アプリケーション内部のテキストのローカライズ(多言語)対応したアプリケーションを作ってみましょう。

プロジェクトを新規作成します。プロジェクト名は「LocalizedFontTest」とします。

アプリケーションプロパティの自然語を英語に変更する

やはり国際語と言えば英語です。

言語のデフォルトを「英語」、それ以外の言語に関しては言語ファイルを用意するようにしましょう。言語ファイルが用意されている場合は言語ファイルの文字列を使って、用意されていない場合はデフォルトの英語を使用されるようにします。

例えば、英語・日本語をサポートしているアプリケーションの場合、言語設定が日本語であれば日本語表示、言語設定がスペイン語であれば英語表示というイメージです。

アプリケーションプロパティを開き、ニュートラル言語を英語にします。

リソースファイルを用意する

リソース ファイルを追加します。ソリューション エクスプローラーでプロジェクト名を右クリックし、[追加]、[新しい項目] の順に選択します。新しい項目の追加ダイアログ ボックスが表示されます。

今回は文字列の多言語対応をおこないたいので、リソースファイルの名前を「StringResources.resx」としました。

作成したリソースファイルを開いてください。これから各言語毎のリソースファイルを作成しますが、[名前]に関しては各言語共通で使用します。翻訳の対象となるのは[値]の部分です。

アクセス修飾子は、デフォルトで[Internal]になっていますが[Public]に変更しておいてください。

StringResources.resxの名前と値は以下の通り設定しています。

名前
Message hello world
LabelButtonContent click me

今回のアプリケーションでは日本語とドイツ語に対応させたいので、それぞれ「StringResources.ja-JP.resx」「StringResources.de-DE.resx」のリソースファイルを作成します。

名前
Message こんにちは世界
LabelButtonContent 私をクリック
名前
Message Hallo Welt
LabelButtonContent klick mich

プロジェクトファイルの編集

次にプロジェクトを閉じて、プロジェクトファイル(ここではLocalizedFontTest.csproj)をテキストエディターで開いて、SupportedCulturesタグを探します。

サポートする言語を、言語名をセミコロンで区切って入力します。

<SupportedCultures>de-DE;ja-JP;</SupportedCultures>

XAMLからアクセス可能なクラスを作成

XAMLからアクセス可能なクラスを作成します。

namespace LocalizedFontTest {
    public class LocalizedStrings {
        private static StringResources _localizedResources = new StringResources();
        public StringResources LocalizedResources {
            get { return _localizedResources; } 
        }
    }
}

次にApp.xamlファイルを開き、下記のXAML コードをApplication.Resourcesセクションに追加します。

    <Application.Resources>
        <local:LocalizedStrings xmlns:local="clr-namespace:LocalizedFontTest" x:Key="LocalizedStrings" />
    </Application.Resources>

アプリケーション側でローカライズしたテキストを利用する

ButtonコントロールのContentプロパティに言語ファイルの文字列定義をバインディングします。

    <Button Content="{Binding Path=LocalizedResources.LabelButtonContent, Source={StaticResource LocalizedStrings}}" />

メッセージボックスなどXAMLに記載出来ないものに関しては、StringResourcesから任意のプロパティを利用することが可能です。

private void button1_Click(object sender, RoutedEventArgs e) {
    MessageBox.Show(StringResources.Message);
}

実行結果を表示します。まずは言語設定が日本の場合。

こちらはドイツ語の場合です。

参照