*.resx
。
然后有每个文化的文件夹。“en /” 使用
*.en.resx
“en-GB /”
使用*.en-GB.resx
我更改了.resx
文件的访问修饰符为“Public”,并更改了这些设置。BuildAction: EmbeddedResource
CopyToOutputDirectory: CopyAlways
我确保了
.resx
设计者*.Designer.cs
使用"Resources"命名空间。我将类库添加到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\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
,但默认语言可以正常工作。第二个*.resources.dll
是由于后期生成事件引起的。
当我更改CurrentUICulture时,它并不会更改UI语言。在将资源从App_GlobalResources/
移动到外部程序集之前,它可以正常工作(例如Razor示例)。
@Resources.MyResources.StringIdentifier
使用.NET Reflector查看资源.dlls
,以下是它们的区别。
Satellite Resources: (Project: Resources)
Resources.en_GB.MyResources.en-GB.resources
App_GlobalResources: (Project MVCApp)
Namespace.MVCApp.App_GlobalResources.MyResources.en-GB.resources
编辑:
在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 Controller中尝试了相同的测试,但无法正常工作。因此,唯一可以检索ResourceManager的位置是Global.asax.cs。
奇怪的是,在Razor 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
}
简化版:
将从App_GlobalResources中的资源(.resx)转换为卫星程序集。
问题所在。
我可以手动在global.asax
中使用CurrentUICulture语言调用卫星程序集的ResourceManager,它按预期工作,但是相同的测试在UI侧失败,并且在MVC控制器中失败。
默认语言正常工作,那么为什么UI不能切换语言呢?