2011-12-10 17 views
5

カルチャニュートラルなXAMLファイル、一部のカルチャニュートラルアイコン、ローカライズされた文字列を含むローカライズされたプログラムで、すべて見つけることができますか?どのような手配をしても、自分のリソースタイプの1つにアクセスできないことがわかります。C#.NetでXAMLリソースとRESXリソースの両方をフェッチするときのメインアセンブリと衛星アセンブリの問題

私がいる問題は、次のとおりです。

  • MainWindow.xamlファイルは常にEN-USのサテライトアセンブリに構築します。 UltimateResourceFallbackLocationがMainAssemblyに設定されている場合、WindowのBAMLは検出されず、InitializeComponent()呼び出しで例外が発生します。ですから、私はUltimateResourceFallbackLocationを "Satellite"に設定することを余儀なくされています。

  • Resources.resxファイルに含まれるカルチャーニュートラルアイコンリソースは、常にメインEXEアセンブリに組み込まれ、UltimateResourceFallbackLocationがSatelliteに設定されている場合は見つかりません。これは、MainWindow.xamlファイルの要件と完全に互換性がないように見えます。

  • UICultureとNeutralResourcesLanguageを完全に削除すると、XAMLとRESXの両方のデータをMainAssemblyに強制的に組み込むと、カルチャ固有の文字列は機能しません。

問題は何ですか:私は間違っていますか?どのようにしてこれらの3つのタイプのリソースにすべてアクセスできるようにプロジェクトを構築するのですか?

編集(作業溶液が、それは間違っているようだ):

私は重複リソースの名前を変更し、それを完全に複製することにより、サテライトアセンブリに構築するために、私の文化ニュートラルRESXファイル、Resources.resxを得るために管理しています.en-US.resxを設定し、Resources.resxをBuild Action:Noneに設定します(Resources.resxはResources.Designer.csファイルの生成にのみ使用されますが、メインEXEアセンブリにデータを挿入しません)。

私のカルチャーニュートラルなリソースはすべてen-USアセンブリに入っているので、このプログラムは3つすべてのケース(ローカライズされた文字列、resxのローカライズされていないデータ、XAMLの非ローカライズデータ)で動作するようになりました。これを達成するための.resxファイルはかなりばかげているようです。

これは愚かですか?これを行うよりスマートな方法はありますか?

答えて

2

アセンブリーリンカー(Al.exe)を使用して.resourcesファイルをこのarticleに概説されているように衛星アセンブリにコンパイルすることは、任意の「スマートな」代替方法です。その記事で使用

** 更新 **

例:

このアセンブリリンカ(Al.exe)コマンドは、ファイルstrings.de.resourcesからアプリケーションmyappのためのサテライトアセンブリを作成し、 。

al /t:lib /embed:strings.de.resources /culture:de /out:MyApp.resources.dll 

このAssembly Linker(Al.exe)コマンドは、ファイルstrings.de.resourcesからアプリケーションMyAppのサテライトアセンブリも作成します。 /templateオプションを使用すると、サテライトアセンブリは親アセンブリMyApp.dllからアセンブリメタデータを継承します。

al /t:lib /embed:strings.de.resources /culture:de /out:MyApp.resources.dll 
/template:MyApp.dll 
+1

あなたは私に同様の問題の解決策を見つけるのを助けてくれました:http://www.mathewweaver.com/2013/11/internalgetsatelliteassembly-finding.html – mweaver

+0

喜んで助けてください:) – chridam

2

WPFによるローカライズは、不適切なドキュメントのため非常に面倒です。私はいくつかの洞察に時間を費やしました。

MainWindow.xamlファイルは、常にen-USサテライトアセンブリに組み込まれています。 UltimateResourceFallbackLocationがMainAssemblyに設定されている場合、WindowのBAMLは検出されず、InitializeComponent()呼び出しで例外が発生します。ですから、私はUltimateResourceFallbackLocationを "Satellite"に設定することを余儀なくされています。

これは、project.vcprojファイルにおそらく<UICulture>en-US</UICulture>が含まれているためです。これは本質的にVSにステライトアセンブリを生成するように指示します(en-USフォルダがその中の衛星と共に作成されているのがわかります)。

UltimateResourceFallbackLocation.MainAssemblyは、一致するディレクトリにあるものの代わりに埋め込まれたものを使用して、ローカリゼーション情報の検索を高速化します。あなたのシステムカルチャーがen-USの場合、この動作は完全に説明されます。

quoting Kim Hamilton

...その後、ResourceManagerが本体に直接 "EN-US" リソースを探し、代わりの「EN-US」フォルダ内に最初に検索します。リソースプローブは高価になる可能性があるため、この属性はパフォーマンスを改善するのに役立ちます。

1つだけ残っている2番目のbulletpointのためのソリューション見つけたので:私は完全にUICultureとNeutralResourcesLanguageを削除すると

が - の両方にXAMLとRESXデータを強制的に構築MainAssemblyの場合、私の文化固有の文字列は機能しません。

実際にWPFはまだローカライズを行います。あなたはまだSystem.Threading.Thread.CurrentThread.CurrentUICultureに一致する名前を持つディレクトリに衛星を見つけようとWPF .vcprojファイルに<UICulture>en-US</UICulture>のようなエントリを持っていないとき。それが見つかった、それは使用されています。ニュートラル言語がシステム言語に設定されていて、メインアセンブリのフォールバック戦略を使用している場合を除いて、もちろんです。 en-USシステムのローカリゼーションをテストするには、他の文化を選択する必要があります。 ja-JPを中立言語として使用しています。その後、en-USフォルダに衛星を提供します。

それでは、私はローカライズのために使用していますし、お勧めです:

  1. [assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.MainAssembly)]
  2. 使用
  3. .vcprojファイルに <UICulture>en-US</UICulture>を持っていけない一致する衛星と、すべてのターゲット・文化ディレクトリを提供しています。
関連する問題