web-dev-qa-db-ja.com

C#:特定のカルチャからリソース文字列を取得する方法

さまざまな言語に翻訳されたテキストを含むリソースアセンブリがあります。プロジェクトの種類は次のようになります。

  • FooBar.resx
  • FooBar.nb-NO.resx
  • FooBar.sv-SE.resx
  • .。

次のような静的プロパティを使用してテキストを取得できます。

var value = FooBar.Hello;

または、次のような反射を使用します。

var value = resourceAssembly
      .GetType("Namespace.FooBar")
      .GetProperty("Hello")
      .GetValue(null, null) as string;

どちらの方法でも、現在のスレッドの現在のUIカルチャに属する値を取得できます。これは問題なく、私が通常望んでいることです。

しかし、UIカルチャを変更せずに、たとえばスウェーデンの値を明示的に必要とする場合にできることはありますか?

20
Svish

VisualStudioが生成するFooBarクラスのCultureプロパティを手動で変更できます。または、 ResourceManagerクラス を直接使用している場合は、目的のカルチャをパラメータとして受け取る GetString のオーバーロードを使用できます。

19
Konamiman

次のコードを試してください。少なくとも私にとってはうまくいきました:

FooBar.ResourceManager.GetString("Hello", CultureInfo.GetCultureInfo("sv-SE"))
13
Himanshu Vohra

カルチャ名でリソースファイルを取得するために使用したコードを次に示します。これは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
1
ScottE

リソースアクセスクラスのカルチャを手動で変更できます。しかし、これは他の多くの国際化の問題につながるため、やや推奨されません。

例えば。あなたがしなければならないでしょう:

  • カルチャの過負荷ですべての数値フォーマットを処理する
  • 使用する他のライブラリが、使用しているのと同様のメカニズムを備えていることを確認してください
  • 上記が不可能な場合(BCLなど)、文化に固有である可能性のあるすべてのもの(およびそれは多くのもの)のラッパーを作成します。

したがって、可能であれば、現在のスレッドの現在のUIカルチャを変更してください。

0
Foxfire

GetValueの2番目のオーバーロードを使用します:-

 .GetValue(null, BindingFlags.GetProperty, null, null, CultureInfo.GetCultureInfo("sv-SE"))
0
AnthonyWJones