我正在一个必须同时使用英语和西班牙语的网站上工作。我已经使用过resx文件,并且正在根据浏览器的语言设置来调整区域性设置,如下面的代码所示(位于global.asax.cs上):
protected void Application_AcquireRequestState(object sender, EventArgs e)
{
string culture = "en-US";
if (Request.UserLanguages != null)
{
culture = Request.UserLanguages[0];
}
Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo(culture);
Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo(culture);
}
这确实有效!但是,用户也应该能够更改语言。为此,我创建了一个CultureController,如下所示,该代码由站点通过链接使用:
public class CultureController : Controller
{
public ActionResult SetLanguage(string name)
{
Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo(name);
Thread.CurrentThread.CurrentUICulture = Thread.CurrentThread.CurrentCulture;
System.Web.HttpContext.Current.Session["culture"] = name;
return RedirectToAction("Index", "Home");
}
}
我的网站上有这些链接:
<li><a href="@Url.Action("SetLanguage", "Culture", new { @name = "es-ES" })">Español</a></li>
<li><a href="@Url.Action("SetLanguage", "Culture", new { @name = "en-US" })">English</a></li>
这不起作用。这很奇怪,因为当我调试它时,实际上已使用该方法,并且数据流似乎正确,它获取了name参数并进行了设置,但是在重定向之后,语言没有改变,并且请求显示为失败。您有什么建议我在做什么错了吗?
答案 0 :(得分:0)
语言使用的URL是否会不同?
我是在以前的雇主那里做的,所以我们不必为了测试不同的语言而更改浏览器的语言,并且如果该用户(在地理位置上)偏爱一种语言而不是另一种语言,但他们的浏览器是“如果配置正确,他们就可以控制。
示例:
http://example.com/en/home与http://example.com/es/home
我能够使用URL重写将其提取到querystring参数中(对于MVC,这是不必要的,因为您可以使用路由参数)
您可以很容易地添加一些代码来检测浏览器语言,并将用户重定向到正确的URL,并允许Cookie覆盖这些首选项。
我知道这是与您所寻找的答案完全不同的答案,但这使测试变得轻而易举(“ / en /”是我们实际上并未真正设置的hack;我只是做了它可以正常工作,以便我们可以调试页面而不必翻译文本。)
很容易将页面的6个版本放在不同的选项卡中,并检查所有内容是否正确。我们有德语和中文,并且这些语言都是很好的测试语言:德语名词长 long ,很容易确定您是否错过了用汉语翻译任何短语的机会。
答案 1 :(得分:0)
似乎您没有用于本地化的路由。首先,您必须定义如下所示的路由。
routes.MapRoute(
name: "LocalizedDefault",
url: "{lang}/{controller}/{action}",
defaults: new { controller = "Home", action = "Index"},
constraints: new {lang="es-ES|fr-FR|en-US"}
);
routes.MapRoute(
name: "Default",
url: "{controller}/{action}",
defaults: new { controller = "Home", action = "Index", lang = en-US }
);
设置线程语言后,必须使用如下所示的lang对其进行定向。
filterContext.HttpContext.Response.RedirectToRoute("LocalizedDefault",
new { lang=culture,
controller = filterContext.RouteData.Values["controller"],
action = filterContext.RouteData.Values["action"]
});
return;
有关完整实施的信息,请查看this文章。