私は衛星アセンブリを使用するようにプロジェクトを変換しています。 私は新しいクラスライブラリ( "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.exe
とResgen.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.dll
とResources.resources.dll
を持っていますが、デフォルトの言語は正常に動作します。 2番目の*.resources.dll
は、ビルド後のイベントによるものです。
CurrentUICultureを変更してもUI言語は変更されません。 App_GlobalResources/
のリソースを外部アセンブリに移動する前に、正常に動作しました(剃刀の例)。
.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を共有します。私はその言語のためにクッキーを使用します。ログイン時にあなたのアプリケーションを詳細に調査する機会が得られるまで(そして実際に衛星リソースのために働くかどうか)、投稿のおかげでしばらく時間がかかります。彼らは少しトリッキーで、複数のプロジェクトで使用する場合、かなり退屈な細部を必要とします。 :) – lko
私はあなたが来るすべての要求のための文化を設定する必要があると思う。クッキーからそれを得ることは良いです。私のリソースは別のライブラリにもあります(私はそれがあなたが衛星であると思いますか?) – Jacco