9

非常に単純なことで、私はそれを機能させることができません。dllをグローバル化したいので、リソースファイルとResourceManagerを使用しています。

私は次のようにresourcemanagerを呼び出します。

var p = new ResourceManager("Appname.Default", Assembly.GetExecutingAssembly());

このような文字列を取得します

System.Diagnostics.Debug.WriteLine(p.GetString("greeting"));
System.Diagnostics.Debug.WriteLine(p.GetString("greeting", new CultureInfo("nl")));
System.Diagnostics.Debug.WriteLine(p.GetString("greeting", new CultureInfo("nl-NL")));
System.Diagnostics.Debug.WriteLine(p.GetString("greeting", new CultureInfo("en")));

そして、同じ文字列の4倍を返します。私のファイルは

Default.resx 
Default.en.resx 
Default.nl.resx 
Default.nl-NL.resx

すべてのファイル設定は同じですが、前述のように、デフォルトファイルのリソースのみが使用されます。

私はここで何を見落としていますか?

4

1 に答える 1

12

リソースファイルを使用する方法はいくつかありますが、そのうちの1つは.resxファイルを使用することです。これらのファイルは、の値に基づいて自動的にローカライズされますThread.CurrentThread.CurrentUICulture。デフォルト.resxファイルは、その一部であるアセンブリ(たとえば、メインの実行可能ファイル)にDefault.nl-NL.resxコンパイルされますが、ローカライズされたリソース()は、独自のディレクトリ(nl-NLこの場合はカルチャ識別子に基づく)にコンパイルされて、と呼ばれるアセンブリになり<AssemblyName>.resources.dllます。

<ResourceName>.<KeyName>これらのリソースからの値のアドレス指定は、たとえば、と同じくらい簡単Default.Greetingです。それをテストするには、以下を使用してカルチャを変更します。

Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("en-US");
Console.WriteLine(Default.Greeting);

Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("nl-NL");
Console.WriteLine(Default.Greeting);

どちらが出力されます

Hello
Hallo

プログラムの起動時に、UIカルチャはそれが実行されているコンピュータのカルチャに設定されるため、ローカライズされたリソースを常に表示するために言語を自分で指定する必要はありません。したがって、.resxファイルは進むべき道のようです。

ResourceManagerfromを使用する場合は、ファイルvar p = new ResourceManager("Appname.Default", Assembly.GetExecutingAssembly());を読み取る必要があり.resourcesます。(あなたの場合)Appname.Default.resourcesファイルがない場合、p.GetStringは失敗します。したがって、以前に1つのファイルを作成したと思いますが.resources、ローカライズされた.resxファイルを.resourcesファイルに変換していません。

ResourceManagerを使用してカルチャを指定できるようにする場合は、次を使用できます。

Default.ResourceManager.GetString("Greeting", new CultureInfo("en-US"));
于 2012-06-30T16:52:59.680 に答える