我正在将项目转换为使用卫星组件。 我创建了一个新的类库(名为“Resources”)。所有的默认资源位于根级*.resx
。 然后每个文化都有一个文件夹。卫星组件,ASP.NET语言不变
“EN /” 与*.en.resx
EN-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:\ Program Files文件\微软的SDK \的Windows \ V7.1 \ BIN \ Resgen.exe” EN-GB/MyResourceFile.en-GB.resx“C:\ Program Files文件\微软的SDK \ Windows \ v7.1 \ Bin \ al.exe“/ t:lib /eed: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
但默认语言工作正常。第二个*.resources.dll
是由于生成后事件。
当我更改CurrentUICulture时,它不会更改UI语言。在将资源从App_GlobalResources/
移出到外部组件之前,它可以正常工作(Razor示例)。
@Resources.MyResources.StringIdentifier
使用.NET Reflector查看资源.dlls
这些是不同之处。
编辑:
设置的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 MVC Razor UI中的默认语言。 (这是严格的测试)
@{
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文件转换为附属程序集。
问题在眼前。
我可以使用global.asax
中的CurrentUICulture语言为卫星程序集手动调用ResourceManager,它按预期方式工作,但是相同的测试从UI端失败并在MVC控制器中失败。
默认语言工作正常,所以为什么不切换语言?
+1分享。我使用cookies作为语言,因此文化只能设置为登录时。在我有机会详细调查您的应用程序之前(以及它是否实际适用于卫星资源)还需要一段时间,谢谢发布。它们有点棘手,在多个项目中使用时需要非常繁琐的细节。 :) – lko
我认为你需要为每一个请求进入文化设置。从饼干中获取它没有问题。我的资源也在一个单独的图书馆(我认为这是你的意思是卫星?) – Jacco