Asp Mvc Resources Global 不工作
Asp Mvc Resources Global doesn't work
这是我的场景:我有一个多语言 Asp.Net Mvc 应用程序。
这是我本地化的默认路线:
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 }
我的控制器激活器:
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)));
}
}
问题:
在我的机器上工作得很好,但是当我使用我使用的外部主机时,我在全局资源文件中使用的词不起作用。
在我的主页我有语言选择:
<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 打开我的网站时,起始语言是英语,而不是我在代码中设置为默认语言的意大利语。
你知道吗,代码没有问题。逻辑有问题
您正在将 _DefaultLanguage
设置为 it
。
现在,当您从路由值中获得 lang
时,路由值也会以 it
的形式出现。所以它不会进入块 if (lang != _DefaultLanguage)
因为它们都是相同的并且 CurrentThread 的 CurrentCulture
和 CurrentUICulture
不会被改变。它将保持不变并设置为 en-US
.
所以你需要做的是删除 if
子句并在任何情况下将 'lang
分配给 CurrentThread 的 CurrentCulture
和 CurrentUICulture
。
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;
}
}
这应该可以解决问题。
这是我的场景:我有一个多语言 Asp.Net Mvc 应用程序。 这是我本地化的默认路线:
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 }
我的控制器激活器:
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)));
}
}
问题:
在我的机器上工作得很好,但是当我使用我使用的外部主机时,我在全局资源文件中使用的词不起作用。 在我的主页我有语言选择:
<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 打开我的网站时,起始语言是英语,而不是我在代码中设置为默认语言的意大利语。
你知道吗,代码没有问题。逻辑有问题
您正在将 _DefaultLanguage
设置为 it
。
现在,当您从路由值中获得 lang
时,路由值也会以 it
的形式出现。所以它不会进入块 if (lang != _DefaultLanguage)
因为它们都是相同的并且 CurrentThread 的 CurrentCulture
和 CurrentUICulture
不会被改变。它将保持不变并设置为 en-US
.
所以你需要做的是删除 if
子句并在任何情况下将 'lang
分配给 CurrentThread 的 CurrentCulture
和 CurrentUICulture
。
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;
}
}
这应该可以解决问题。