首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >没有基于.Resx的CurrentUICulture

没有基于.Resx的CurrentUICulture
EN

Stack Overflow用户
提问于 2014-11-14 18:04:15
回答 3查看 2.3K关注 0票数 4

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

我在我的global.asax中设置了这样的文化:

代码语言:javascript
复制
Thread.CurrentThread.CurrentUICulture = new CultureInfo("de-DE");

在Visual的即时窗口中,我可以看到在呈现视图时,Thread.CurrentThread.CurrentUICulture的值是“DE”。

这让我想到了我的观点:

代码语言:javascript
复制
@Html.Raw(CurrentUICultureContent.ce_landingPage_welcomeText)

问题是,它只呈现来自CurrentUICultureContent.resx的文本,而不呈现来自CurrentUICultureContent.de.resx的文本,即使CurrentUICulture设置为“DE”。

注意:我也尝试过将文件名更改为CurrentUiCultureContent.de-DE.resx,但这似乎也不起作用。

编辑:--我在视图页面中放置了一个断点,并在即时窗口中检查了CurrentUICulture的值;但是它仍然没有从"de-DE.resx“文件中获取文本:

代码语言:javascript
复制
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

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

我还需要做点什么才能让这件事起作用吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-11-20 13:43:28

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

  • /Shadow_copy_folder
    • /en
      • /resource.dll

一旦我更新了逻辑以创建区域性的影子复制文件夹,.NET就会选择正确的资源文件。

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

代码语言:javascript
复制
Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture("de-DE");
票数 2
EN

Stack Overflow用户

发布于 2014-11-14 23:35:11

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

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

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

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

  1. 现在,使用视图上的自定义工具命名空间来获取当前区域性特定文本。

请注意,这是一个旧的代码,仍然为我工作,没有做任何根本的不同。希望这在一定程度上回答了您的疑问。

编辑:,如我在下面的评论中提到的,这里是全局操作过滤器。如果这符合你的目的,请告诉我。

代码语言:javascript
复制
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中读取了区域性信息(您也可以使用Server变量来掌握用户的首选区域性)。

代码语言:javascript
复制
routes.MapRoute(
            name: "",
            url: "{language}-{culture}/{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional, language = "en", culture = "US" }
        );
票数 2
EN

Stack Overflow用户

发布于 2014-11-20 10:04:38

重写控制器的executeCore()并设置这两个

代码语言:javascript
复制
Thread.CurrentThread.CurrentCulture and Thread.CurrentThread.CurrentUICulture

构建完成后,请确保MVC项目的bin文件夹中有相应的资源文件,并确保您有一个安装程序脚本来获取这些文件,这样您在测试环境中就不会有任何问题。

祝你好运。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26936210

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档