プロジェクトを衛星アセンブリを使用するように変換しています。新しいクラスライブラリ(「リソース」という名前)を作成しました。デフォルトのリソースはすべてルートレベルにあります*.resx
。次に、カルチャごとにフォルダがあります。
「en/」と *.en.resx
en-GB/と*.en-GB.resx
.resxファイルAccess Modifier
を「パブリック」に変更し、これらの設定を変更しました。
BuildAction: EmbeddedResource
CopyToOutputDirectory: CopyAlways
.resx
デザイナー*.Designer.cs
が「Resources」名前名を使用するようにしました。
クラスライブラリをASP.NETMVCアプリに追加し、global.asax.cs
必要に応じてカルチャを設定しています。
System.Threading.Thread.CurrentThread.CurrentUICulture = new CultureInfo("en-GB");
System.Threading.Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("en-GB");
Resourcesクラスライブラリのビルド後のイベントにal.exe
andコマンドを追加してみました。Resgen.exe
"C:\ Program Files \ Microsoft SDKs \ Windows \ v7.1 \ Bin \ Resgen.exe" en-GB / MyResourceFile.en-GB.resx "C:\ Program Files \ Microsoft SDKs \ Windows \ v7.1 \ Bin \ al.exe "/ t:lib /embed:en-GB/MyResourceFile.en-GB.resources /culture:en-gb /out:Resources.resources.dll
MVCアプリbin/
フォルダー内を見ると、3つのファイルを含む各言語のフォルダーがあります。
MyResources.en-GB.Designer.cs、MyResources.en-GB.resx、Resources.resources.dll
ルートレベルにはがResources.dll
ありResources.resources.dll
ますが、デフォルトの言語は正常に機能します。2つ目*.resources.dll
は、ビルド後のイベントによるものです。
CurrentUICultureを変更しても、UI言語は変更されません。リソースをApp_GlobalResources/
外部アセンブリに移動する前は、正常に機能していました(Razorの例)。
@Resources.MyResources.StringIdentifier
.dlls
.NET Reflectorを使用してリソースを見ると、これらが違いです。
Satellite Resources: (Project: Resources)
Resources.en_GB.MyResources.en-GB.resources
App_GlobalResources: (Project MVCApp)
Namespace.MVCApp.App_GlobalResources.MyResources.en-GB.resources
編集:
でCurrentCultureとUICultureを設定した後、実際に機能global.asax.cs
するを手動で取得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 MVCRazorUIのデフォルト言語のみを返します。(これは厳密にテスト用です)
@{
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バージョン:
リソース(.resx)からApp_GlobalResourcesからサテライトアセンブリへの変換。
手元の問題。
CurrentUICulture言語を使用してサテライトアセンブリのResourceManagerを手動で呼び出すことができ、global.asax
期待どおりに機能しますが、同じテストがUI側から失敗し、MVCコントローラーで失敗します。
デフォルトの言語は正常に機能しますが、UIが言語を切り替えないのはなぜですか?