文字列の多言語化

 Metro スタイルアプリで表示文字列を多言語化する方法について試してみたいと思います。
 今回は“新しいアプリケーション”のテンプレートを使い、画面の中央に表示させた文字列を多言語化します。

 多言語化前の画面は以下のようになります。

<Grid Background="{StaticResource ApplicationPageBackgroundBrush}">
    <StackPanel HorizontalAlignment="Center" VerticalAlignment="Center" >
        <TextBlock Text="text1" FontSize="48"/>
        <TextBlock Text="text2" FontSize="48"/>
    </StackPanel>
</Grid>

デフォルト言語

 文字列を多言語化する場合、最初にデフォルト言語を決定する必要があります。
 デフォルト言語として指定した言語のリソースは、OSの使用言語に対応するリソースが存在しなかった場合にも使用されます。
 このため、多言語化する場合はデフォルト言語のリソースが必須となります。

 デフォルト言語はプロジェクトファイル(.csproj)に記述されています。UI 上から変更する方法が見つからなかったので、一旦 Visual Studio を閉じて、テキストエディタでプロジェクトファイルを開いて変更します。

 プロジェクトファイルの というタグにデフォルト言語が記述されています。
 日本語版の Visual Studio を使っている場合はデフォルトは日本語-日本(ja-JP)となっています。
 多言語化して日本以外にアプリを配布する事を考えると、デフォルト言語が日本語では問題があると思われますので、英語-米国(en-US)に変更しておきます。

 変更したら、Visual Studio を起動してプロジェクトファイルを読み込み直します。

デフォルト言語リソース追加

 今回はプロジェクトルートに Resources フォルダーを作成し、その下にリソースを追加していきます。
 最初にデフォルト言語のリソースを追加します。

 リソースを追加するためには、ます言語名-国名のフォルダーを作成します(言語名のみの指定も可能です)。
 英語-米国を追加するので en-US という名前になります。

 続いて作成したフォルダー内に、リソースファイルを追加します。

 追加すると、名前と値を入力する画面が表示されます。

 ここで、その言語の文字列を入力していきます。

 文字列の名前の付け方は2種類あります。

 ひとつは、{Uid}.{プロパティ名} という形式の物です。
 Uid は xaml 上でコントロールに指定する識別情報です。プロパティ名は文字列を設定する対象になります。
 例えば Uid として Title と指定した TextBlock に文字列を設定する場合は、リソースの名前を Title.Text とします。


<Grid Background="{StaticResource ApplicationPageBackgroundBrush}">
    <StackPanel HorizontalAlignment="Center" VerticalAlignment="Center" >
        <TextBlock Text="text1" FontSize="48" x:Uid="Title"/>
        <TextBlock Text="text2" FontSize="48"/>
    </StackPanel>
</Grid>

 ここまで追加した段階で実行すると、リソースとして指定した文字列が表示されます。

 なお、リソースで指定した文字列が表示されるのは実行時のみです。Visual Studio でデザインしている段階では、Text プロパティに指定した文字列がそのまま表示されます。


 もうひとつの名前の付け方は、プロパティに関係なく付ける物です。
 こちらは、xaml 上で直接指定するのではなく、ソース上で取得して使用します。

 例えば、Body という名前で文字列を追加します。

 この段階で文字列の取得は可能ですが、ソース上でコントロールに設定しますのでコントロールに名前を付けておきます。

<Grid Background="{StaticResource ApplicationPageBackgroundBrush}">
    <StackPanel HorizontalAlignment="Center" VerticalAlignment="Center" >
        <TextBlock Text="text1" FontSize="48" x:Uid="Title"/>
        <TextBlock Text="text2" FontSize="48" x:Name="bodyText"/>
    </StackPanel>
</Grid>

 ソース上で ResourceLoader を使って文字列を取得してコントロールに設定するようにします。

protected override void OnNavigatedTo(NavigationEventArgs e)
{
    var rl = new ResourceLoader();
    bodyText.Text = rl.GetString("Body");
}

 実行すると以下のようにリソースに指定した文字列が表示されます。

 なお、プロパティ名を指定する形式のリソースは ResourceLoader では読み込めませんので注意が必要です。

他の言語リソース追加

 今までの実行結果は日本語環境での物です(使用言語は日本語)。動作としては使用言語に対応するリソースがないのでデフォルト言語のリソースが使われている状態になります。

 日本語で表示できるように、日本語のリソースを追加します。
 Resource フォルダーに ja-JP フォルダーを作成し、リソースファイルを追加した上で、文字列リソースに同じ名前で日本語の文字列を追加します。

 実行すると、日本語で表示されます。

 もちろん、使用言語を追加して英語を優先に変えてから実行すれば、英語で表示されます。