2012-12-05 17 views
5

私は衛星アセンブリを使用するようにプロジェクトを変換しています。 私は新しいクラスライブラリ( "Resources"という名前)を作成しました。デフォルトのリソースはすべてルートレベル*.resxです。 次に、それぞれの文化のためのフォルダがあります。衛星アセンブリ、ASP.NET言語が変更されない

"EN /" *.en.resx

と エンGB/ *.en-GB.resx

と私は "公開" にの.resxファイルにAccess Modifierを変更し、これらの設定を変更しました。

BuildAction: EmbeddedResource 
CopyToOutputDirectory: CopyAlways 

私は.resxデザイナー*.Designer.csは、 "リソース" の名前空間を使用することを確認しました。

私は、ASP.NET MVCアプリケーションと、global.asax.csにクラスライブラリを追加しました。必要に応じて設定されたカルチャーを持っています。

System.Threading.Thread.CurrentThread.CurrentUICulture = new CultureInfo("en-GB"); 
System.Threading.Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("en-GB"); 

私は、リソースのクラスライブラリのビルド後のイベントにal.exeResgen.exeコマンドを追加してみました。

"C:\プログラムファイル\マイクロソフトのSDK \ WINDOWS \ V7.1 \ビン\ Resgen.exe" エンGB/MyResourceFile.en-GB.resx「C:\プログラムファイル\マイクロソフトのSDK \ Windows \ v7.1 \ Bin \ al.exe "/ t:lib /embed:en-GB/MyResourceFile.en-GB.resources/culture:ja-gb /out:Resources.resources.dll

3つのファイルと、言語ごとにフォルダがあるMVCのアプリbin/フォルダ内に探している相手:

は、

MyResources.en-GB.Designer.cs、MyResources.en-GB.resx、 Resources.resources.dll

ルートレベルはResources.dllResources.resources.dllを持っていますが、デフォルトの言語は正常に動作します。 2番目の*.resources.dllは、ビルド後のイベントによるものです。

CurrentUICultureを変更してもUI言語は変更されません。 App_GlobalResources/のリソースを外部アセンブリに移動する前に、正常に動作しました(剃刀の例)。

これらは違いがあり、.NETリフレクターを使用して、リソース .dllsを見てみると
@Resources.MyResources.StringIdentifier 

編集:

global.asax.csでのCurrentCultureとUICultureを設定した後、私は手動で実際に働いていたと予想される言語の文字列を取得しResourceManagerを取得しテストしました。

  System.Resources.ResourceManager gStrings = 
       new System.Resources.ResourceManager("Resources.MyResources", System.Reflection.Assembly.Load("Resources")); // Resources=Project Name 
      string test = gStrings.GetString("TestString"); // WORKS IN GLOBAL.ASAX.CS!!! 

MVCコントローラで同じテストを試みましたが、うまくいきません。したがって、ResourceManagerを取得できる唯一の場所はGlobal.asax.csです。

妙なことに、剃刀のUIレベルで同じテストを行うと、既定のカルチャのテキストのみが返されます。 cultureInfoは正しいですが、ResourceManagerはASP.NET MVC Razor UIのデフォルト言語のみを返します。

サテライトアセンブリにApp_GlobalResourcesからリソース(resxファイル)からの変換:

@{ 
     System.Globalization.CultureInfo ci = System.Threading.Thread.CurrentThread.CurrentUICulture; 
     System.Resources.ResourceManager gStrings = 
      new System.Resources.ResourceManager("Resources.MyResource", System.Reflection.Assembly.Load("Resources")); 
     string s = gStrings.GetString("Test"); // DOESN'T WORK IN UI 
    } 

TLDRバージョン(これはテストのために厳密です)。

手元に問題があります。

global.asaxでCurrentUICulture言語を使用して、衛星アセンブリのResourceManagerを手動で呼び出すことはできますが、期待通りに機能しますが、同じテストはUI側から失敗し、MVCコントローラでは失敗します。

デフォルトの言語で問題なく動作しますが、なぜUIの切り替え言語が正しくないのですか?

答えて

1

最近、内部統制が正しく機能するプロジェクトをあなたが説明したように設定した場合。

https://github.com/Jacco/Perpetuality

私はベースとして使用コントローラでOnAuthorizeでHTTPリクエストごとに言語を切り替える:

私のプロジェクトで
using Perpetuality.Data; 
using System; 
using System.Collections.Generic; 
using System.Globalization; 
using System.Linq; 
using System.Security.Principal; 
using System.Threading; 
using System.Web; 
using System.Web.Mvc; 
using System.Web.Routing; 


namespace Perpetuality.Controllers 
{ 
    public partial class BaseController : Controller 
    { 
     private CultureInfo GetCultureInfo(AuthorizationContext filterContext) 
     { 
      switch ((string)filterContext.RouteData.Values["language"]) 
      { 
       case "nl": 
        return CultureInfo.CreateSpecificCulture("nl-NL"); 
       case "en": 
        return CultureInfo.CreateSpecificCulture("en-US"); 
       case "pt": 
        return CultureInfo.CreateSpecificCulture("pt-PT"); 
       case "de": 
        return CultureInfo.CreateSpecificCulture("de-DE"); 
       case "es": 
        return CultureInfo.CreateSpecificCulture("es-ES"); 
       case "fr": 
        return CultureInfo.CreateSpecificCulture("fr-FR"); 
       case "it": 
        return CultureInfo.CreateSpecificCulture("it-IT"); 
       case "jp": 
        return CultureInfo.CreateSpecificCulture("ja-JP"); 
       default: 
        return CultureInfo.CreateSpecificCulture("en-US"); 
      } 
     } 

     protected override void OnAuthorization(AuthorizationContext filterContext) 
     { 
      Thread.CurrentThread.CurrentCulture = GetCultureInfo(filterContext); 
      Thread.CurrentThread.CurrentUICulture = GetCultureInfo(filterContext); 

      base.OnAuthorization(filterContext); 
     } 
    } 
} 

RESXファイルが異なっあなたよりも指定されています

BuildAction: EmbeddedResource 
CopyToOutputDirectory: DoNotCopy 

私の業界では、このような文字列にアクセスします:

@Resources.Home.Index.FacebookButtonCaption 

私はセットアップを行っていませんでした。

私のプロジェクトでは、言語は常にURLにあります。これは、適切な言語が最初に選択されなかった場合、ユーザーは言語を切り替えることができました。

+0

+1を共有します。私はその言語のためにクッキーを使用します。ログイン時にあなたのアプリケーションを詳細に調査する機会が得られるまで(そして実際に衛星リソースのために働くかどうか)、投稿のおかげでしばらく時間がかかります。彼らは少しトリッキーで、複数のプロジェクトで使用する場合、かなり退屈な細部を必要とします。 :) – lko

+0

私はあなたが来るすべての要求のための文化を設定する必要があると思う。クッキーからそれを得ることは良いです。私のリソースは別のライブラリにもあります(私はそれがあなたが衛星であると思いますか?) – Jacco

関連する問題