没有得到.Resx基于CurrentUICulture

时间:2014-11-14 18:04:16

标签: c# asp.net-mvc localization internationalization resx

我的MVC项目中有以下两个文件:

enter image description here

我正在设置我的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

为什么它返回英语而不是预期的德语资源文件?

为了让它发挥作用,我还需要做些什么吗?

3 个答案:

答案 0 :(得分:2)

对不起这个问题 - 这里的问题只是我们手动加载程序集(阴影复制它们)而现有逻辑没有将resource.DLL放在正确的文件夹中。 .NET期望将resource.DLL放在相应的culture文件夹中;即:

  • / Shadow_copy_folder
    • / EN
      • /resource.dll

更新逻辑后,为文化创建卷影复制文件夹; .NET选择了正确的资源文件。

另外,我指定文化的方式有问题。显然,必须这样做:

Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture("de-DE");

答案 1 :(得分:1)

在MVC中应用多语言资源文件支持的一种方法是将资源文件标记为嵌入式资源。这样,您可以将资源文件用作简单类。

要将资源文件标记为嵌入式资源,您可以执行以下操作,如下图所示:

  1. 将资源文件的访问修饰符更改为Public
  2. Public Modifier

    1. 接下来更改资源文件的以下属性,如下所示。您可以根据自己的意愿自由选择自定义工具命名空间:
    2. Change Properties

      1. 现在在视图上使用自定义工具命名空间来获取当前特定于文化的文本。
      2. Using on the view

        请注意,这是一个旧代码,对我来说仍然有效,没有做任何根本不同的事情。希望这有点回答你的问题。

        修改 正如我在这里的评论中提到的那样是全局动作过滤器。如果这符合您的目的,请告诉我。

        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文件夹中有相应的资源文件,并确保您有一个安装程序脚本来获取此文件,以便您在测试环境中没有任何问题。

祝你好运......