我正在尝试用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
然而,它似乎没有这样的方式。我还没有添加,所以西班牙语可以工作,因为我想先用丹麦语和英语进行工作。
有人请告诉我我错过了什么。或者询问我是否没有就我的问题提供足够的细节。
答案 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