2009-12-01 10 views
16

私は様々な言語の翻訳されたテキストを持つリソースアセンブリを持っています。私はC#:特定の文化からリソース文字列を取得する方法

することができます...

  • FooBar.resx
  • FooBar.nb-NO.resx
  • FooBar.sv-SE.resx
:プロジェクトは一種の、このようになります。

var value = FooBar.Hello; 

または次のような反射を使用してテキストを取得します。 s:

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

どちらの方法でも、現在のスレッドの現在のUIカルチャに属する値が得られます。これは、私が通常好きであろう、罰金であり、完全にです。

しかし、UI文化を変更しなくてもスウェーデンの価値を明示的に求めたい場合は、何かできますか?

答えて

18

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

+0

ResourceManagersを簡単に作成して破棄することができますか、またはクリーンアップが必要か、一度だけ作成して大量に使用する必要がありますか? – Svish

+0

ResourceManagersを使用して終了しました:) – Svish

+0

ありがとう......! –

0

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

など。あなたはする必要があります:すべての数の書式文化では

  • をオーバーロード

    • ハンドルを使用する他のライブラリを使用すると、上記の例では
    • を持っている同様のメカニズムが不可能であることを確認してください(例:BCL)カルチャー固有のもの(そしてそれはたくさんあります)のためのラッパーを作成してください。

    可能であれば、現在のスレッドの現在のUIカルチャを変更します。

  • 0

    ここで私は文化名でリソースファイルを取得するために使用したコードです - それは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 
    
    0

    は、GetValueメソッドの2番目のオーバーロードを使用します - 次のコードを試してみてください

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

    ...私はこれを試しましたが、同じ値を返すように見えました。もう一度試してみる必要があります... – Svish

    +0

    私はそれがプロパティがどのように実装されているかに依存すると思いますが、実際にプロパティの実装を表示しません。 – AnthonyWJones

    +0

    私はそれを実装していないためです。これは、ビジュアルスタジオで生成されたデフォルトのものです。 – Svish

    12

    を。

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