2010-09-19 111 views
2

我正在构建我的第一个ASP.NET MVC站点,并且此站点需要使用2种语言。构建支持多种语言/文化的网站

当用户从菜单中选择一种语言时,该网站将以该语言呈现其自身。

内容可能会全部从资源文件中加载。我可以在运行时响应文化定义中的更改,以便加载正确的资源文件吗?

我想为这两种语言使用不同的URL。也许像mysite.com/en/home/index

这可能吗?用户应该能够转发和保存链接,并且该网站将以他们的语言加载。

这怎么能用ASP.NET MVC完成?

回答

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方法翻出缓存培养为当前用户。当然,你需要先设置它。

此外,该方法需要确保Session第一次被调用时(例如重置后)该会话尚未构建,因此您需要在此实例中返回默认语言。

之后很简单。使用上述意味着每个控件和每个页面都会为每个请求选择正确的文化。

如果您在后端使用文化相关代码(如日期分析),则您可能希望拥有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 
    ); 
} 
+0

我想为answear + 1.什么时候Application_AcquireRequestState被触发?现在,我知道如何设置好文化,我需要有人来回答我关于问题的第二部分,这就是我如何使用语言快捷方式来指导URL,例如mvc中的URL。 – 2010-09-20 20:11:51

+0

在分配的处理程序得到执行之前。这意味着它会在默认页面处理程序或除注册以外的其他任何处理程序执行之前进入。有关订单,请参阅http://msdn.microsoft.com/en-us/library/system.web.httpapplication.aspx。 – toxaq 2010-09-20 23:35:22