2017-05-23 29 views
0

私はGlobalizationプロジェクトを解決していますが、別のMainProjectがあります。グローバリゼーションの下には、2つのリソースファイル、Resources.resxResources.ar.resxがあります。両方のファイルに同じキーがあります。モデル(API)で取得した言語入力に基づいて結果を出力したい。それから私は、モデルから言語入力をチェックし、それに応じてリソースファイルを選択します。この機能を持っている ResourceManager rm;同じソリューションの別のプロジェクトからリソースファイルにアクセスするC#

は、このグローバルとして宣言します。 API関数で

private void CheckResourceManager(string lang) 
{      
    if (lang =="EN") 
    { 
     rm = new ResourceManager(
      "Globalization.Resources", 
      Assembly.GetExecutingAssembly()); 
    } 
    else 
    { 
     rm = new ResourceManager(
      "Globalization.Resources.ar", 
      Assembly.GetExecutingAssembly()); 
    } 
} 

私は最初CheckResourceManager(model.Language); をチェックし、必要なメッセージがあるとき: throw new Exception(rm.GetString("WrongUserName"));

が今の問題は、機能的に"Globalization.Resources.ar"でそれができるように、リソースを読み込むされていない; tは探しファイル、私はここで何を使うべきですか?私は同じプロジェクトでリソースファイルを追加する場合、それは動作します。助けてください。ありがとう


適切なアプローチは以下の回答からですが、このメソッドはうまくいきます。宣言

private void CheckResourceManager(string lang) 
{ 
    if (lang =="EN") 
    { 
     System.Threading.Thread.CurrentThread.CurrentCulture = originalCulture; 
     rm = new ResourceManager("Globalization.Resources", localizeAssembly); 
    } 
    else 
    { 
     System.Threading.Thread.CurrentThread.CurrentCulture = new CultureInfo("ar"); 
     rm = new ResourceManager("Globalization.Resources", localizeAssembly); 
    } 
} 

、最終的に私はいくつかの値を取得する必要があります:

ResourceManager rm; 
CultureInfo originalCulture = CultureInfo.CurrentCulture; 
Assembly localizeAssembly = Assembly.Load("Globalization"); 

はに機能を変更

throw new Exception(rm.GetString("WrongUserName",CultureInfo.CurrentCulture)); 

はありがとうございました。

+0

私はエラーを次取得PartnerWebApplication.Globalization.Resources.ar' 'のようなソリューション名を追加したとき。 '指定された文化や中立的な文化に適したリソースを見つけることができませんでした。 「PartnerWebApplication.Globalization.Resources.ar」を確認してください。コンパイル時にアセンブリ "PartnerWebApplication"に正しく埋め込まれているか、または必要なすべてのサテライトアセンブリがロード可能で完全に署名されていることを確認してください。 ' –

+0

' .resx'ファイルを右クリックして 'Properties'を選択し、' Buildアクション 'を'埋め込みリソース 'に変更 – tchelidze

答えて

1

ResourceManagerの全体点は、現在のスレッドのUIカルチャに基づいて別のカルチャにスワップすることです。あなたはそれを行うために別の機能を作る必要はありません。ローカライズされた文化を明示的に読むことはありません。現在のスレッドのUIカルチャを制御するには、authorization filterで明示的に設定する必要があります。

System.Threading.Thread.CurrentThread.CurrentUICulture = new CultureInfo("ar") 

また、ExecutingAssemblyを渡すと、あなたが最も可能性が高いではないトップレベルアセンブリに渡していることを意味あなたのリソースがに配置されているアセンブリあなたはアセンブリインスタンスを取得するために、アセンブリ内の型を使用する必要があります。

new ResourceManager(
     "Globalization.Resources", 
     typeof(ClassWithinResourcesAssembly).Assembly) 

はこのResourceManagerを使用する方法の詳細については、次のドキュメントを参照してください今

+0

はい、これは正しい方法ですが、私はちょうどいくつかの値を必要とするので、UIカルチャーなどには入っていませんでした。' System.Threading.Thread.CurrentThread.CurrentCulture = new CultureInfo "ar"); rm = new ResourceManager( "Globalization.Resources"、localizeAssembly); '現在、英語とアラビア語の両方に対して、上質です。 –

関連する問題