文字列リソースのローカライズ
そもそも元々「埋め込みリソース」という分類があるのに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のリソース