WPF で多言語アプリケーションを作成しています。私は静的リソース、.resx/res ファイルに格納された文字列を使用して、テキストをユーザーのカルチャに表示します。
プロジェクトのディレクトリ構造の一部を次に示します。
- 資力
- GreetingWindowRes.resx (en-US のデフォルト)
- GreetingsWindowRes.de-DE.resx
.csproj には、次のものがあります。<UICulture>en-US</UICulture>
AssemblyInfo.cs で:[assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.Satellite)]
コンパイル後、リソース ファイルが表示されます。
- en-US / MyApp.resources.dll
- de-DE / MyApp.resources.dll
そこで、GreetingWindow.xaml の静的文字列リソースにバインドします。
<windows:MyWindowBase x:Class="CommanderDotNET.MyApp.Windows.GreetingWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:windows="clr-namespace:MyApp.Windows"
xmlns:res="clr-namespace:MyApp.Resources">
<Label Content="{x:Static res:GreetingWindowRes.FirstGreetingText}" />
</windows:MyWindowBase>
結果は私には不可解です:
- UICulture が de-DE に設定されている場合、ラベル テキストはドイツ語で正しく表示されます。
- UICulture が en-US に設定されている場合、System.Windows.Markup.StaticExtension は XamlParseException をスローします。XAML で表示されるエラーが原因である必要があります。
指定されたカルチャまたはニュートラル カルチャに適したリソースが見つかりませんでした。コンパイル時に "MyApp.Resources.GreetingWindowRes.en-US.resources" がアセンブリ "MyApp" に正しく埋め込まれているかリンクされていること、または必要なすべてのサテライト アセンブリが読み込み可能で完全に署名されていることを確認してください。
私は何を間違っていますか?
解決:
多くの検索の後、ここで良い説明を見つけました: http://www.west-wind.com/weblog/posts/2009/Jun/04/Resx-and-BAML-Resources-in-WPF
UltimateResourceFallbackLocation.Satellite
+を使用する<UICulture>
場合は、メイン言語用に ResxResource.resx と GreetingWindowRes.en-US.resx ファイルの両方が必要になるようです (厄介な重複)。
しかし、Resx リソースのみを使用し、BAML ローカリゼーションを使用したくない場合、これは適切な方法ではなく、状況ははるかに良くなります。Resx リソースのみを使用する適切な方法:
- AssemblyInfo.cs:
[assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.MainAssembly)]
- .csproj: 追加しないでください
<UICulture>
- リソースの命名: ResxResource.resx (メイン言語) + ResxResource.de-DE.resx (追加言語)