2017-02-10 19 views
2

這是我的場景:我有一個多語言Asp.Net Mvc應用程序。 這裏是我的本地化缺省路由Asp Mvc Resources Global不起作用

routes.MapRoute(
    name: "DefaultLocalized", 
    url: "{lang}/{controller}/{action}/{id}", 
    constraints: new { lang = @"(\w{2})|(\w{2}-\w{2})" }, // en or en-US 
    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } 

我ControllerActivator:

public class LocalizedControllerActivator : IControllerActivator 
{ 
    private string _DefaultLanguage = "it"; 

    public IController Create(System.Web.Routing.RequestContext requestContext, Type controllerType) 
    { 
     //Get the {language} parameter in the RouteData 
     string lang = (string)requestContext.RouteData.Values["lang"] ?? _DefaultLanguage; 

     if (lang != _DefaultLanguage) 
     { 
      try 
      { 
       System.Threading.Thread.CurrentThread.CurrentCulture = 
       System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo(lang); 
      } 
      catch (Exception e) 
      { 
       throw new NotSupportedException(String.Format("ERROR: Invalid language code '{0}'.", lang)); 
      } 
     } 
     return DependencyResolver.Current.GetService(controllerType) as IController; 
    } 
} 

那我初始化在Global.asax中:

ControllerBuilder.Current.SetControllerFactory(new DefaultControllerFactory(new App_Start.LocalizedControllerActivator())); 

這是重定向本地化路線的方法:

public ActionResult Language(string languageCode) 
{ 
    //ViewBag.lang = languageCode; 
    string basePath = string.Format("{0}://{1}{2}", Request.UrlReferrer.Scheme, Request.UrlReferrer.Authority, Url.Content("~")); 
    object lang; 
    if (!RouteData.Values.TryGetValue("lang", out lang)) 
     return Redirect(Request.UrlReferrer.ToString().Replace(basePath, string.Format("{0}{1}/", basePath, languageCode))); 
    else 
    { 
     string basePathWithLang = string.Format("{0}{1}", basePath, lang.ToString()); 
     return Redirect(Request.UrlReferrer.ToString().Replace(basePathWithLang, string.Format("{0}{1}", basePath, languageCode))); 
    } 
} 

問題:

我的機器上用得好好的,但是當我把對我的工作夥伴外部託管,我在全球資源文件中使用的話,不能正常工作。 在我的主頁上有我的語言選擇: @ Resources.Global.contacts 如果我改變語言沒有被翻譯:

<li><a href="@Url.Action("Language","Home",new { languageCode="it" })">Italiano</a></li> 
<li><a href="@Url.Action("Language","Home",new { languageCode="en" })">English</a></li> 

包含在這個詞。也許這可以幫助:當我在abcxxx.it打開我的網站時,開始語言是英語,而不是我在代碼中設置爲默認的意大利語。

+0

你能分享你正在瀏覽但本地化未發生的樣本網址嗎? –

+0

@ChetanRanpariya http://www.lanavenelbosco.it – SamDroid

+0

你不需要一個「重定向本地化路線的方法」。請參閱[ASP.NET MVC 5在路由和URL中的文化](http://stackoverflow.com/a/32839796/181087)。 – NightOwl888

回答

1

你知道嗎,代碼沒有問題。這是邏輯問題。

您在設置_DefaultLanguageit

現在,當您從的路由值獲得lang時。所以它不會進入塊if (lang != _DefaultLanguage),因爲它們都相同,並且CurrentThread的CurrentCultureCurrentUICulture不會被更改。它將保持不變並設置爲en-US

因此,您需要做的是刪除if子句並在任何情況下將「lang」分配給CurrentThread的CurrentCultureCurrentUICulture

public class LocalizedControllerActivator : IControllerActivator 
{ 
    private string _DefaultLanguage = "it"; 

    public IController Create(System.Web.Routing.RequestContext requestContext, Type controllerType) 
    { 
     //Get the {language} parameter in the RouteData 
     string lang = (string)requestContext.RouteData.Values["lang"] ?? _DefaultLanguage; 

     try 
     { 
      System.Threading.Thread.CurrentThread.CurrentCulture = 
      System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo(lang); 
     } 
     catch (Exception e) 
     { 
      throw new NotSupportedException(String.Format("ERROR: Invalid language code '{0}'.", lang)); 
     } 
     return DependencyResolver.Current.GetService(controllerType) as IController; 
    } 
} 

這應該可以解決問題。

+0

它的工作原理,謝謝@ChetanRanpariya! – SamDroid