2014-02-20 46 views
0

我试图做一个页面3种语言。覆盖默认语言MVC4 RESX文件

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

我使用的语言的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 /主页,但语言依然是我的浏览器默认语言。

我试图做一个过滤器这样

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 

但似乎工作方式不会。我还没有补充,所以西班牙语可以工作,因为我正在考虑首先使用丹麦语和英语。

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

+0

我想根据我的解决办法来纠正发布Akh制成。它确实解决了一些事情,现在网站总是出现。但是它总是以我的语言出现,而不是重写的语言。 以及默认路由,它应该是浏览器决定自动将其他页面指向da-DK网址,而不是停留在那里,如果页面自己决定它应该保持标准域url。如果用户想要覆盖它应该去da-DK或其他任何人。 还有一个问题,当我尝试用en-GB覆盖它时,它仍然显示为丹麦语 – Helbo

回答

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。

2你没有在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

+0

感谢您的回答。 现在看来它有点作用。 现在的问题是,我是选择默认语言的人,我希望浏览器选择默认语言,并且用户能够覆盖默认语言。 另一件事是该语言永远不会改变为EN-GB,即使网址发生变化,它也仅仅停留在丹麦语中。当我点击一个链接时,在默认路由中,它会在url中变成da-DK前缀,我只想让默认路由的行为保持原样。没有改变到任何其他的网址。 – Helbo

+0

我现在开始工作了,看起来我只是读了你的文章,以及我已经做了几次,然后才想出来。非常感谢。 – Helbo