私は2つのリソースファイルを持っています。1つは英語で、もう1つは外国語です。電話すると
ResourceManager.GetString("Hello")
.Designer.csファイルから、常に英語の翻訳が返されます。ロケールや言語などを確認しましたが、すべて正しいです。
メインアセンブリから適切に翻訳された文字列を返しますが、ロードされたアセンブリからは常に英語を返します。
私は2つのリソースファイルを持っています。1つは英語で、もう1つは外国語です。電話すると
ResourceManager.GetString("Hello")
.Designer.csファイルから、常に英語の翻訳が返されます。ロケールや言語などを確認しましたが、すべて正しいです。
メインアセンブリから適切に翻訳された文字列を返しますが、ロードされたアセンブリからは常に英語を返します。
これが何が起こっていたかです。いくつかの翻訳リソースファイルを含むアセンブリがありました。これらはすべて組み込みリソースでした。
アセンブリをコンパイルすると、デフォルトの英語が.dll内に配置されていました。他の言語に関しては、の言語でフォルダ、fr、da、deなどを作成していました。
これらの他のすべてのアセンブリにロードされていたメインアプリケーションでそれらをピックアップしたい場合は、これらすべても移動する必要がありました。アセンブリにそれらはすべて埋め込みリソースファイルであると言ったので、実際にはそれらが埋め込まれると思いました!
現在AssemblyLoader
の場所から必要な.dllが見つからない場合に、必要なすべての.dllをロードするようになりました。パッケージ化すると、プロジェクトをビルドする前に、すべての言語を含めるか、必要な言語を選択するかが決まります。思っていたよりも多くの作業がありましたが、最終的には解決しました。
ご不明な点がございましたら、お気軽にお問い合わせください。
GetStringの最初のオーバーロードResourceManager.GetString(string)
は、現在のスレッドのCurrentUICulture(Thread.CurrentThread.CurrentUICulture
)を使用します。
MSDNを参照してください:-
返されるリソースは、CurrentUICultureプロパティで定義されているように、現在のスレッドのUIカルチャにローカライズされます。
バックグラウンドスレッドでは、スレッドのCurrentUICultureがメイン(またはUI)スレッドのCurrentUICultureと同じであると想定しないでください。
バックグラウンドスレッドからリソースにアクセスするためのより良い方法は、次のようなものを使用して正しいローカライズされた文字列を取得することです。
var localString = Properties.Resources.ResourceManager.GetString("ResourceKey", CultureInfo.CurrentCulture);
ResourceManagerをどのようにインスタンス化するかはわかりませんが、ResourceManager.GetString()を呼び出すときに、CultureInfoを指定できます。これは、正しいロケールで文字列をフェッチするのに役立ちます。したがって、次のようなことができます。
var string = ResourceManager.GetString("ResourceKey", new CUltureInfo("en-GB"));
これにより、文字列キーがen-GB固有のリソースファイルからのものであることが確認されます。
ビルドアクションを「埋め込みリソース」に変更してみてください最近、タミル語リソースを追加するときにこの問題に直面しました。数時間を費やした後、リソースファイルを追加した後、この簡単な手順が見落とされていることがわかりました。
私の場合、問題は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>
この問題を動的に解決するために私が見つけた最も簡単で迅速な方法は、アプリケーションが実行されているオペレーティングシステムで現在使用されている言語を取得し、適切なリソースを呼び出すことでした。これを実現するコードは次のとおりです。
string lg = CultureInfo.CurrentCulture.TwoLetterISOLanguageName;
return resourceManager.GetString(text, new CultureInfo(lg));