我正在构建我的第一个ASP.NET MVC站点,该站点需要使用2种语言。
当用户从菜单中选择一种语言时,该网站将以该语言显示。
可能会从资源文件中加载所有内容。我可以在运行时响应文化定义中的更改,以便加载正确的资源文件吗?
我想要两种语言的不同网址。也许像mysite.com/en/home/index
。
这可能吗?用户应该能够转发和保存链接,并且网站将以他们的语言加载。
如何使用ASP.NET MVC完成此操作?
答案 0 :(得分:2)
我在global.asax页面中切换文化,如下所示
protected void Application_AcquireRequestState(object sender, EventArgs e)
{
CultureInfo culture = Settings.UserCultureFromSession();
System.Threading.Thread.CurrentThread.CurrentUICulture = culture;
System.Threading.Thread.CurrentThread.CurrentCulture = culture;
}
静态UserCultureFromSession方法为当前用户提取缓存区域性。当然你需要先设置它。
此外,该方法需要确保会话在第一次调用站点时可用(例如,在重置之后)尚未构建会话,因此您需要在此实例中返回默认语言。
之后很简单。使用上述方法意味着每个控件和每个页面都会为每个请求选择正确的文化。
如果您在后端使用文化相关代码(例如日期解析),您可能希望拥有CurrentCulture的标准文化。但是,您应该真正编写您的代码,日期或其他方式,以使文化独立。
更新1
在书籍标记网站方面,您可以使用上述方法查看URL以查看是否存在语言代码。你选择这样做的方案真的取决于你。您可以使用国家/地区域'.co.uk, .co.nz, .co.jp'
并从中推断文化,或者您可以在网站底部标记标识符文件夹,例如
www.example.com/en-NZ
www.example.com/en-GB
www.example.com/ja-JP
此外,您可以设置子域名。有很多方法可以决定如何做到这一点。
更新2 就像你在mvc路由处理程序中获取路由变量一样,你只需为文化设置一个。如果您决定在最后一个示例中执行此操作,那么我就会开始这样的事情:
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"Default", // Route name
"{culture}/{controller}/{action}/{id}", // URL with parameters
new { culture = "en-NZ", controller = "Home", action = "Index", id = "" } // Parameter defaults
);
}