覆盖默认语言MVC4 resx文件

时间:2014-02-20 22:52:03

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

我正在尝试用3种语言制作页面。

英语,丹麦语,西班牙语。

我正在使用语言的resx文件并且我已经使它工作了所以我现在可以看到,如果我的系统设置为英语,我将获得英语语言或丹麦语将提供丹麦语。 但是我正在尝试实现覆盖功能,所以我可以通过按钮手动更改页面上的语言我想象它将是3个标志按钮来更改语言。但是,我似乎无法覆盖该语言。而且我遇到的问题不仅仅是坚持使用默认设置。

这是我如何设置我的一些东西:

我已经设置了这样的路线:

 routes.MapRoute(
            name: "DefaultLocalized",
            url: "{language}-{culture}/{controller}/{action}/{id}",
            defaults: new 
            { 
                controller = "Home",
                action = "Index",
                language = "da",
                culture = "DK",
                id = UrlParameter.Optional }
        );
        routes.MapRoute(
            name: "DefaultInternationalized",
            url: "{language}-{culture}/{controller}/{action}/{id}",
            defaults: new
            {
                controller = "Home",
                action = "Index",
                language = "en",
                culture = "UK",
                id = UrlParameter.Optional
            }
        );
        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );

当我尝试这个时,我似乎无法使用最后一个默认路由。 当我尝试覆盖默认设置为丹麦语的语言时,我可以看到英文页面,URL肯定会读取en-UK / Home但语言仍然是我的浏览器默认语言。

我尝试制作一个像这样的过滤器

 public class InternationalizationAttribute : ActionFilterAttribute 
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {

        string language = (string)filterContext.RouteData.Values["language"]; //?? "da";
        string culture = (string)filterContext.RouteData.Values["culture"];// ?? "DK";

        Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo(string.Format("{0}-{1}", language, culture));
        Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo(string.Format("{0}-{1}", language, culture));

    }

我的希望是,这会激活并决定语言,但它似乎永远不会。

我的resx文件在此路径中。

View/Languages/

有这些名字

Resources.resx
Resources.da-DK.resx
Resources.es-ES.resx

我想知道我在哪里或者我错过了什么。 我的想法是我可以访问

的正常页面
mydomain/Home  

以用户的默认语言进行本地化。 然后在以下位置访问被覆盖的语言:

mydomain/en-UK/Home
mydomain/da-DK/Home
mydomain/es-ES/Home
然而,它似乎没有这样的方式。我还没有添加,所以西班牙语可以工作,因为我想先用丹麦语和英语进行工作。

有人请告诉我我错过了什么。或者询问我是否没有就我的问题提供足够的细节。

1 个答案:

答案 0 :(得分:1)

routes.MapRoute(
        name: "DefaultInternationalized",
        url: "{language}-{culture}/{controller}/{action}/{id}",
        defaults: new
        {
            controller = "Home",
            action = "Index",
            language = "en",
            culture = "UK",
            id = UrlParameter.Optional
        }
    );

代码的第一个问题是en-UK对英国来说是错误的文化。它是en-GB。

第二,你没有在route.MapRoute中设置默认文化。 使用此代码

     routes.MapRoute(
          "DefaultLocalized",
          "{language}-{culture}/{controller}/{action}/{id}",
          new
          {
              controller = "Home",
              action = "Index",
              language = "da",
              culture = "DK",
              id = UrlParameter.Optional
          }
       );
        routes.MapRoute(
            "Default", // Route name
            "{controller}/{action}/{id}", // URL with parameters
            new
            {
                controller = "Home",
                action = "Index",
                language = "en",
                culture = "US",
                id = UrlParameter.Optional
            } // Parameter defaults
        );

或者您可以更改默认文化的过滤器,如下所示: -

public class InternationalizationAttribute : ActionFilterAttribute
{
  public override void OnActionExecuting(ActionExecutingContext filterContext)
    {

        string language = (string)filterContext.RouteData.Values["language"]; //?? "da";
        string culture = (string)filterContext.RouteData.Values["culture"];// ?? "DK";
        language = language == null ? "en" : language;
        culture = culture == null ? "US" : culture;

        Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo(string.Format("{0}-{1}", language, culture));
        Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo(string.Format("{0}-{1}", language, culture));

    }
}

了解文化信息请查看此link