1

私はクラスライブラリを持っています-それをフレームワークと呼びます。assemblyinfo.csには、次のものがあります。

[assembly: NeutralResourcesLanguage("en-US")]

\ Resources \ディレクトリの下に、FrameworkResources.resxFrameworkResources.fr-FR.resxがあります。

ヘルパークラスでは、これをリソースマネージャーとして使用しています。

private static ResourceManager manager = new ResourceManager("Framework.Resources.FrameworkResources", Assembly.GetExecutingAssembly());

コードでは、私がこのようなことをすると:

String message = manager.GetString("ArgumentNullExceptionMessage", CultureInfo.CurrentCulture);

CurrentCultureにデバッグしてカーソルを合わせると、それ(およびUICulture)がfr-FRに設定されますが、これは常にデフォルトの英語メッセージを返します。fr-FRリソースファイルからのフランス語メッセージではありません。

ResourceManagerはそれを自動的に接続する必要がありますか、それとも現在のカルチャをクエリするコードを記述してから、適切なファイルを開く必要がありますか?それが現在の文化であるため、Resource Managerがfr-FR文字列を取得することを知っていると仮定するのは間違っていますか?

なぜこれが機能しないのかわかりません。

更新: 私は衛星アセンブリを持っているので、コンパイル部分はうまくいくと信じています。問題は私のリソースマネージャーにあると思います。ResourceSetsを使用し、ResourceManagerを次のように明示的に使用してみました。

ResourceManager manager =
    new ResourceManager("Framework.Resources.FrameworkResources",
        Assembly.GetExecutingAssembly());

Debug.WriteLine("de-DE : " + manager.GetString(resourceName, new CultureInfo("de-DE")));
Debug.WriteLine("el    : " + manager.GetString(resourceName, new CultureInfo("el")));
Debug.WriteLine("es-MX : " + manager.GetString(resourceName, new CultureInfo("es-MX")));
Debug.WriteLine("fr-FR : " + manager.GetString(resourceName, new CultureInfo("fr-FR")));
Debug.WriteLine("hi    : " + manager.GetString(resourceName, new CultureInfo("hi")));
Debug.WriteLine("zh-CN : " + manager.GetString(resourceName, new CultureInfo("zh-CN")));

その結果、次のようになります。

de-DE : Argument '%ArgumentName%' cannot be null or empty.
el    : Argument '%ArgumentName%' cannot be null or empty.
es-MX : Argument '%ArgumentName%' cannot be null or empty.
fr-FR : Argument '%ArgumentName%' cannot be null or empty.
hi    : Argument '%ArgumentName%' cannot be null or empty.
zh-CN : Argument '%ArgumentName%' cannot be null or empty.

したがって、すべてが整っていても、私のリソースマネージャーは単にそれらの衛星アセンブリを調べようとはしていません。そして明確にするために、これらのアセンブリには、上記の文字列の翻訳バージョンがあります。したがって、カルチャ固有のファイルではなく、デフォルトのFrameworkResources.resxファイルから確実に読み取っています。

4

1 に答える 1

4

私はそれを理解しました(インターウェブでのより多くの精練のおかげで)。単体テストからコードを実行していましたが、MSTestは衛星アセンブリを「デプロイ」していません。テスト設定に移動して「展開」をオフにすると、すべてが期待どおりに機能します。うーん!

于 2012-07-27T08:22:39.090 に答える