さまざまな言語に翻訳されたテキストを含むリソースアセンブリがあります。プロジェクトの種類は次のようになります。
次のような静的プロパティを使用してテキストを取得できます。
var value = FooBar.Hello;
または、次のような反射を使用します。
var value = resourceAssembly
.GetType("Namespace.FooBar")
.GetProperty("Hello")
.GetValue(null, null) as string;
どちらの方法でも、現在のスレッドの現在のUIカルチャに属する値を取得できます。これは問題なく、私が通常望んでいることです。
しかし、UIカルチャを変更せずに、たとえばスウェーデンの値を明示的に必要とする場合にできることはありますか?
VisualStudioが生成するFooBarクラスのCulture
プロパティを手動で変更できます。または、 ResourceManagerクラス を直接使用している場合は、目的のカルチャをパラメータとして受け取る GetString のオーバーロードを使用できます。
次のコードを試してください。少なくとも私にとってはうまくいきました:
FooBar.ResourceManager.GetString("Hello", CultureInfo.GetCultureInfo("sv-SE"))
カルチャ名でリソースファイルを取得するために使用したコードを次に示します。これはvb.netですが、わかります。
Dim reader As New System.Resources.ResXResourceReader(String.Format(Server.MapPath("/App_GlobalResources/{0}.{1}.resx"), resourceFileName, culture))
そして、それを辞書として返したい場合:
If reader IsNot Nothing Then
Dim d As New Dictionary(Of String, String)
Dim enumerator As System.Collections.IDictionaryEnumerator = reader.GetEnumerator()
While enumerator.MoveNext
d.Add(enumerator.Key, enumerator.Value)
End While
Return d
End If
リソースアクセスクラスのカルチャを手動で変更できます。しかし、これは他の多くの国際化の問題につながるため、やや推奨されません。
例えば。あなたがしなければならないでしょう:
したがって、可能であれば、現在のスレッドの現在のUIカルチャを変更してください。
GetValueの2番目のオーバーロードを使用します:-
.GetValue(null, BindingFlags.GetProperty, null, null, CultureInfo.GetCultureInfo("sv-SE"))