18

私は2つのリソースファイルを持っています。1つは英語で、もう1つは外国語です。電話すると

ResourceManager.GetString("Hello") 

.Designer.csファイルから、常に英語の翻訳が返されます。ロケールや言語などを確認しましたが、すべて正しいです。

メインアセンブリから適切に翻訳された文字列を返しますが、ロードされたアセンブリからは常に英語を返します。

4

6 に答える 6

13

これが何が起こっていたかです。いくつかの翻訳リソースファイルを含むアセンブリがありました。これらはすべて組み込みリソースでした。

アセンブリをコンパイルすると、デフォルトの英語が.dll内に配置されていました。他の言語に関しては、の言語でフォルダ、fr、da、deなどを作成していました。

これらの他のすべてのアセンブリにロードされていたメインアプリケーションでそれらをピックアップしたい場合は、これらすべても移動する必要がありました。アセンブリにそれらはすべて埋め込みリソースファイルであると言ったので、実際にはそれらが埋め込まれると思いました!

現在AssemblyLoaderの場所から必要な.dllが見つからない場合に、必要なすべての.dllをロードするようになりました。パッケージ化すると、プロジェクトをビルドする前に、すべての言語を含めるか、必要な言語を選択するかが決まります。思っていたよりも多くの作業がありましたが、最終的には解決しました。

ご不明な点がございましたら、お気軽にお問い合わせください。

于 2012-10-05T16:11:53.663 に答える
4

GetStringの最初のオーバーロードResourceManager.GetString(string)は、現在のスレッドのCurrentUICulture(Thread.CurrentThread.CurrentUICulture)を使用します。

MSDNを参照してください:-

返されるリソースは、CurrentUICultureプロパティで定義されているように、現在のスレッドのUIカルチャにローカライズされます。

バックグラウンドスレッドでは、スレッドのCurrentUICultureがメイン(またはUI)スレッドのCurrentUICultureと同じであると想定しないでください。

バックグラウンドスレッドからリソースにアクセスするためのより良い方法は、次のようなものを使用して正しいローカライズされた文字列を取得することです。

var localString = Properties.Resources.ResourceManager.GetString("ResourceKey", CultureInfo.CurrentCulture);
于 2014-01-28T14:22:13.890 に答える
3

ResourceManagerをどのようにインスタンス化するかはわかりませんが、ResourceManager.GetString()を呼び出すときに、CultureInfoを指定できます。これは、正しいロケールで文字列をフェッチするのに役立ちます。したがって、次のようなことができます。

var string = ResourceManager.GetString("ResourceKey", new CUltureInfo("en-GB"));

これにより、文字列キーがen-GB固有のリソースファイルからのものであることが確認されます。

于 2012-10-04T15:58:35.413 に答える
1

ビルドアクションを「埋め込みリソース」に変更してみてください最近、タミル語リソースを追加するときにこの問題に直面しました。数時間を費やした後、リソースファイルを追加した後、この簡単な手順が見落とされていることがわかりました。

于 2019-06-27T13:49:47.057 に答える
0

私の場合、問題はresx-fileにありました。無効なリソース文字列のresxファイルの形式が正しくありませんでした。

<data name="HeaderColumnsCountGreaterThenDataColumnsCountTestData" xml:space="preserve">
  <settings>
    Month   Date    Department
    01.05.2015  01.05.2015  OIR
    01.05.2015  02.05.2015  OIR
  </settings>
</data>

正しい形式:

<data name="HeaderColumnsCountGreaterThenDataColumnsCountTestData" xml:space="preserve">
  <value>
    Month   Date    Department
    01.05.2015  01.05.2015  OIR
    01.05.2015  02.05.2015  OIR
  </value>
</data>
于 2015-08-04T10:22:24.380 に答える
0

この問題を動的に解決するために私が見つけた最も簡単で迅速な方法は、アプリケーションが実行されているオペレーティングシステムで現在使用されている言語を取得し、適切なリソースを呼び出すことでした。これを実現するコードは次のとおりです。

string lg = CultureInfo.CurrentCulture.TwoLetterISOLanguageName;
            return resourceManager.GetString(text, new CultureInfo(lg));
于 2018-12-01T13:58:25.480 に答える