2017-02-10 6 views
2

これは私のシナリオです。私は、多言語Asp.Net Mvcアプリケーションを持っています。Asp Mvc Resourcesグローバルが動作しません

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::私はGlobal.asaxの中で初期化

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; 
    } 
} 

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))); 
    } 
} 

問題:私のマシン上で

は魔法のように動作しますが、私は私が仕事外部のホスティングに置いたとき、私はグローバルリソースファイルに使う言葉では、動作しません。私のホームページで 私は、言語の選択をしている:に含まれる

<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> 

言葉:私は、言語を変更した場合Resources.Global.contacts @ が翻訳されていません。おそらく、これは役に立ちます:abcxxx.itで私のウェブサイトを開くと、私のコードでデフォルトとして設定したイタリア語ではなく、開始言語が英語になります。

+0

ブラウズ中のサンプルURLを共有できますか?ローカリゼーションは行われていませんか? –

+0

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

+0

「ローカライズされたルートをリダイレクトするメソッド」は必要ありません。 [ルートとURLのASP.NET MVC 5のculture](http://stackoverflow.com/a/32839796/181087)を参照してください。 – NightOwl888

答えて

1

ご存じのように、コードに問題はありません。それはロジックの問題です。

_DefaultLanguageからitに設定しています。

langitというルート値から取得されたとき。したがって、ブロックif (lang != _DefaultLanguage)は両方とも同じで、CurrentThreadのCurrentCultureCurrentUICultureは変更されないため、ブロックif (lang != _DefaultLanguage)には入りません。それは変更されずに残り、en-USに設定されます。

したがって、if句を削除し、いずれにしてもCurrentThreadのCurrentCultureCurrentUICultureに「lang」を割り当ててください。

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

関連する問題