我的MVC项目中有以下两个文件:
我正在设置我的global.asax中的文化,如下所示:
Thread.CurrentThread.CurrentUICulture = new CultureInfo("de-DE");
我可以在Visual Studio的立即窗口中看到Thread.CurrentThread.CurrentUICulture
的值是" de-DE"在渲染视图时。
这让我想到了我的观点:
@Html.Raw(CurrentUICultureContent.ce_landingPage_welcomeText)
问题是,它只呈现来自 CurrentUICultureContent.resx 的文本,而不是来自 CurrentUICultureContent.de.resx 的文本,即使CurrentUICulture设置为&#34 DE-DE"
注意:我也尝试将文件名更改为 CurrentUiCultureContent.de-DE.resx ,但这似乎无效。
编辑:我在视图页面中放置了一个断点,并在立即窗口中检查了CurrentUICulture的值;但它仍然没有从" de-DE.resx"文件:
System.Threading.Thread.CurrentThread.CurrentUICulture {de-DE}
Calendar: {System.Globalization.GregorianCalendar}
CompareInfo: {CompareInfo - de-DE}
CultureTypes: SpecificCultures | InstalledWin32Cultures | FrameworkCultures
DateTimeFormat: {System.Globalization.DateTimeFormatInfo}
DisplayName: "German (Germany)"
EnglishName: "German (Germany)"
IetfLanguageTag: "de-DE"
IsNeutralCulture: false
IsReadOnly: false
KeyboardLayoutId: 1031
LCID: 1031
Name: "de-DE"
NativeName: "Deutsch (Deutschland)"
NumberFormat: {System.Globalization.NumberFormatInfo}
OptionalCalendars: {System.Globalization.Calendar[1]}
Parent: {de}
TextInfo: {TextInfo - de-DE}
ThreeLetterISOLanguageName: "deu"
ThreeLetterWindowsLanguageName: "DEU"
TwoLetterISOLanguageName: "de"
UseUserOverride: true
为什么它返回英语而不是预期的德语资源文件?
为了让它发挥作用,我还需要做些什么吗?
答案 0 :(得分:2)
对不起这个问题 - 这里的问题只是我们手动加载程序集(阴影复制它们)而现有逻辑没有将resource.DLL放在正确的文件夹中。 .NET期望将resource.DLL放在相应的culture文件夹中;即:
更新逻辑后,为文化创建卷影复制文件夹; .NET选择了正确的资源文件。
另外,我指定文化的方式有问题。显然,必须这样做:
Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture("de-DE");
答案 1 :(得分:1)
在MVC中应用多语言资源文件支持的一种方法是将资源文件标记为嵌入式资源。这样,您可以将资源文件用作简单类。
要将资源文件标记为嵌入式资源,您可以执行以下操作,如下图所示:
Public
。
请注意,这是一个旧代码,对我来说仍然有效,没有做任何根本不同的事情。希望这有点回答你的问题。
修改强> 正如我在这里的评论中提到的那样是全局动作过滤器。如果这符合您的目的,请告诉我。
public class PersonalizeAttribute:ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
string language = (string)(filterContext.RouteData.Values["language"] ?? "en");
string culture = (string)(filterContext.RouteData.Values["culture"] ?? "US");
CultureInfo ci = CultureInfo.GetCultureInfo(string.Format("{0}-{1}", language, culture));
Thread.CurrentThread.CurrentCulture = ci;
Thread.CurrentThread.CurrentUICulture = ci;
}
}
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorAttribute());
filters.Add(new PersonalizeAttribute());
}
是的,我从URL读取了文化信息(您也可以利用服务器变量来抓住用户的首选文化)。
routes.MapRoute(
name: "",
url: "{language}-{culture}/{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional, language = "en", culture = "US" }
);
答案 2 :(得分:1)
覆盖Controller的executeCore()并设置
Thread.CurrentThread.CurrentCulture and Thread.CurrentThread.CurrentUICulture
构建之后,请确保您的MVC项目的bin文件夹中有相应的资源文件,并确保您有一个安装程序脚本来获取此文件,以便您在测试环境中没有任何问题。
祝你好运......