文字列リソースのローカライズ

そもそも元々「埋め込みリソース」という分類があるのにResourceというのは何の目的に使うのだろう。

"Resource"というのは"Linked Resource"であり、埋め込みリソースがバイナリリソースになるのに対して、こちらはそのままの形でアセンブリ内に保存される。共有可能であり、そのままXAMLパーサーで処理できるので、プロジェクト-アセンブリ間で共有するXAMLはこの形式で保存するらしい。

一方、文字列のリソースに関しては昔ながらの方法(ビルドアクション=埋め込みリソース)でローカライズすることができそうだ。

ローカライズ(日本語のみ)の手順

1. リソース名.resxという名前でインバリアントな文字列リソースを生成する
例) Key="RequiredAttribute_ValidationError" Value="The {0} field is required."

2. リソース名.ja-JP.resxという名前で日本語カルチャのリソースを生成する
例) Key="RequiredAttribute_ValidationError" Value="{0}フィールドは必須です。"

3.プロジェクトファイル(csproj)にサポートするカルチャ(要素)を記述する
これが今回はまった部分。今までに例が無く、更にはVisual Studioでは操作できず、直接プロジェクトファイルを編集する必要があるのだ。しかも、これを忘れるといくらローカライズリソースを用意しても決してアクセスしてくれない。
例)DataBindApp1.csproj

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
     : 略
    <SilverlightApplication>true</SilverlightApplication>
    <SupportedCultures>ja-JP;</SupportedCultures>
     : 

これで生成されるリソースマネジャ(ResourceManager)を使用してリソースを取得することができる。

ただ、WPF/Silverlightの文字列リソースのローカライズのサンプルを見ているとその殆どが"Linked Resource"を使用しているのが気になる。埋め込みリソースは推奨されていないのかもしれない。

追記:
やはりSilverlightでは「埋め込みリソース」は使えないらしい。ただ、エミュレータと実機で動かしている限りではローカライズされたカルチャのリソースを上手く読めているのを確認しており、一体どうして駄目なのかが解らない。

注意 :
Visual Studio の [プロパティ] ウィンドウにある [ビルド アクション] ボックスの一覧に表示される値は他にもいくつかあります。ただし、Silverlight オブジェクトで使用できる値は上の 3 つだけです。特に、Silverlight 埋め込みリソースでは、Silverlight で認識できない書式が使用される [埋め込まれたリソース] ビルド アクションではなく、[リソース] ビルド アクションを必ず使用する必要があります。
参考:Silverlightのリソース