如何在 MVC 应用程序中处理多种语言?
How to handle multiple language in MVC application?
我已经设置了我的应用程序,以便根据路由器识别的模式从不同的 RESX 文件中读取内容。根据 URL.
的第一部分,每个页面都可以以某种语言访问
routes.MapRoute(
name: "Localization",
url: "{lang}/{controller}/{action}/{id}", ...
);
当我在没有规范的情况下进行测试时,我得到了我的 Lingo.REXS 的英文版本,当我输入 se 时,我得到了瑞典语版本,即 Lingo.se.RESX。到目前为止一切都很好。
但是,我不确定如何让用户控制语言的设置。我不希望它是自动的,也不希望它基于浏览器的设置、地理数据等来假设。我基本上想要三个标志(img 控件)以某种方式神奇地 设置该用户(或在至少那个浏览器会话)可以使用与所点击标志的语言相对应的前缀进行路由。
所以,我们有 /se/Home/About 和 /ge/Home/About。用户点击德国国旗 - 我们如何将他们路由到后者?如果他们点击瑞典国旗 - 我们如何将他们路由到前者?
我已经通过 this blog but it doesn't address the actual issue with how to route into a certain language depending on the clicked flag image. I've also found this blog 进行了验证,但我只是不明白他们是如何做到的。我看到一堆对数据库的调用,所以我怀疑它不是基于 RESX 文件(我的理解是这是正确的方法),尽管也有一些参考 @TestResource.
现在我很困惑和不确定。有什么建议或说明吗?
MVC 有一个有点不直观的特性,这使得这非常容易。 MVC automatically reuses any route values 来自请求。因此,您所有的 URL 都会自动 "inherit" 文化 - 无需在 ActionLink
.
中明确指定
唯一的例外是在选择语言时。但是您可以利用这种相同的路由行为在您的 _Layout.cshtml
中构建一个通用的页眉或页脚。当前页面具有的任何路由值都将被继承 - 您需要做的就是指定控制器、操作和文化。
@{
var routeValues = this.ViewContext.RouteData.Values;
var controller = routeValues["controller"] as string;
var action = routeValues["action"] as string;
}
<ul>
<li>@Html.ActionLink("Swedish", @action, @controller, new { lang = "se" }, new { rel = "alternate", hreflang = "se" })</li>
<li>@Html.ActionLink("English", @action, @controller, new { lang = "en" }, new { rel = "alternate", hreflang = "en" })</li>
</ul>
如前所述,页面上的所有其他 link 将自动从当前上下文传递一种文化,因此它们将自动保持在同一文化中。在这些情况下,没有理由明确传递文化。
@ActionLink("About", "About", "Home")
加上上面的link,如果当前的URL是/Home/Contact
,生成的link就是/Home/About
。如果当前 URL 是 /en/Home/Contact
,那么 link 将生成为 /en/Home/About
。
参考:
我已经设置了我的应用程序,以便根据路由器识别的模式从不同的 RESX 文件中读取内容。根据 URL.
的第一部分,每个页面都可以以某种语言访问routes.MapRoute(
name: "Localization",
url: "{lang}/{controller}/{action}/{id}", ...
);
当我在没有规范的情况下进行测试时,我得到了我的 Lingo.REXS 的英文版本,当我输入 se 时,我得到了瑞典语版本,即 Lingo.se.RESX。到目前为止一切都很好。
但是,我不确定如何让用户控制语言的设置。我不希望它是自动的,也不希望它基于浏览器的设置、地理数据等来假设。我基本上想要三个标志(img 控件)以某种方式神奇地 设置该用户(或在至少那个浏览器会话)可以使用与所点击标志的语言相对应的前缀进行路由。
所以,我们有 /se/Home/About 和 /ge/Home/About。用户点击德国国旗 - 我们如何将他们路由到后者?如果他们点击瑞典国旗 - 我们如何将他们路由到前者?
我已经通过 this blog but it doesn't address the actual issue with how to route into a certain language depending on the clicked flag image. I've also found this blog 进行了验证,但我只是不明白他们是如何做到的。我看到一堆对数据库的调用,所以我怀疑它不是基于 RESX 文件(我的理解是这是正确的方法),尽管也有一些参考 @TestResource.
现在我很困惑和不确定。有什么建议或说明吗?
MVC 有一个有点不直观的特性,这使得这非常容易。 MVC automatically reuses any route values 来自请求。因此,您所有的 URL 都会自动 "inherit" 文化 - 无需在 ActionLink
.
唯一的例外是在选择语言时。但是您可以利用这种相同的路由行为在您的 _Layout.cshtml
中构建一个通用的页眉或页脚。当前页面具有的任何路由值都将被继承 - 您需要做的就是指定控制器、操作和文化。
@{
var routeValues = this.ViewContext.RouteData.Values;
var controller = routeValues["controller"] as string;
var action = routeValues["action"] as string;
}
<ul>
<li>@Html.ActionLink("Swedish", @action, @controller, new { lang = "se" }, new { rel = "alternate", hreflang = "se" })</li>
<li>@Html.ActionLink("English", @action, @controller, new { lang = "en" }, new { rel = "alternate", hreflang = "en" })</li>
</ul>
如前所述,页面上的所有其他 link 将自动从当前上下文传递一种文化,因此它们将自动保持在同一文化中。在这些情况下,没有理由明确传递文化。
@ActionLink("About", "About", "Home")
加上上面的link,如果当前的URL是/Home/Contact
,生成的link就是/Home/About
。如果当前 URL 是 /en/Home/Contact
,那么 link 将生成为 /en/Home/About
。
参考: