読者です 読者をやめる 読者になる 読者になる

酢ろぐ!

カレーが嫌いなスマートフォンアプリプログラマのブログ。

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

Windows Phone Advent Calendar "ひとり" 2011」第25日目です。(遅延実行中)

Windows Phoneの日本市場でのシェア率はあまり高くはありません。ですので自然と海外に目を向けることになります。

「日本語版」「英語版」「フランス語版」と言語毎にアプリケーションをリリースするのもアリですが、評価がバラけてしまうのとメンテナンスの付加が高くなってしまう為、あまりおススメ出来ません(かつ現在のMarketplaceの売り上げはアプリ毎に支払われる為、分散させるのはあまり美味しい話ではありません)。

そこで1つのアプリケーションを各言語にローカライズしてしてみましょう。

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

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

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

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

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

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

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

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

f:id:ch3cooh393:20150830125015p:plain

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

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

f:id:ch3cooh393:20150830125111p:plain

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

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

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

f:id:ch3cooh393:20150830125144p:plain

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

名前
Message hello world
LabelButtonContent click me

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

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

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

★ 注意:Visual Studio 2013ではこの方法が使えなくなっているようです。Visual Studio 2013でのサポート言語の追加の仕方について追記しました。

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

f:id:ch3cooh393:20150830125236p:plain

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

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

Windows Phoneでサポートされている言語は複数あります。「Windows Phoneでローカライズ(多言語対応)用の文言リソースを追加する - 酢ろぐ!」で書きました。

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);
}

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


f:id:ch3cooh393:20150830125332p:plain

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

f:id:ch3cooh393:20150830125347p:plain

Windows Phone Advent Calendar "ひとり" 2011、如何だったでしょうか。あなたのWindows Phoneアプリ開発に少しでもお役に立てれば幸いです。

(2014/2/15追記) Visual Studio 2013でのサポートする言語を追加する方法

Windows Phone 8.0 + Visual Studio 2013の場合、プロジェクト(csproj)ファイルを弄る必要はありません。ソリューションエクスプローラーからWMAppManifest.xmlをダブルクリックします。

f:id:ch3cooh393:20140215203931p:plain

マニフェストデザイナーが表示されますのでパッケージタブを選択します。アプリケーション情報の一覧が表示されていると思います。

f:id:ch3cooh393:20140215203854p:plain

一番下に「サポートされている言語」の項目があるので、対応したい日本語とドイツ語を選択します。