2012-01-19 25 views
1

我希望用户为整个应用程序选择一次首选语言。向我建议最简单的步骤。
这样,用户只需在登录后选择首选语言一次,然后使用选定的文化呈现所有应用的视图。
我发现与某人有关here使用ASP.Net MVC3进行国际化(用户选择所有视图的首选语言)


因为我是国际化的新手,我没有正确地得到它。
我创建了一个示例应用程序,它使用浏览器特定的文化工作正常,但在这里我希望用户选择首选语言。

回答

1

通常,.NET将使用与用户最匹配的CultureSetting,然后确定用于全球化的适当资源文件。

一旦你“保存”了用户适当的文化,就可以在数据库,会话或cookie中。

我要做的就是线程切换到适当的语言:

var language = "fr"; // Pull from your "saved" location (database, session, cookie, etc.) 

// This changes UI only 
Thread.CurrentThread.CurrentUICulture = new CultureInfo(language); 

// This changes how number, date formatting is handled 
Thread.CurrentThread.CurrentCulture = new CultureInfo(language); 

希望帮助!

0

我建议你扩展具有Culture参数的用户实体以将其存储在数据库中。 然后,它可以在会话中添加有关用户的文化,例如(但任何其它技术也可使用)

,那么你需要增加新的属性与代码

public class LocalizationAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     try 
     { 
      string culture = UserSession.Culture;//Other mechanism of getting userinfo could be used there 
      if (!string.IsNullOrEmpty(culture)) 
      { 
       CultureInfo cultureInfo = new CultureInfo(culture); 
       Thread.CurrentThread.CurrentCulture = cultureInfo; 
       Thread.CurrentThread.CurrentUICulture = cultureInfo; 
      } 
     } 
     catch (Exception e) 
     { 
      Logger logger = new Logger(); 
      logger.LogException(e); 
     } 
    } 
} 

并添加此属性适用于所有应该本地化的控制器

0

一种方法是使用cookie。

假设您有一个下拉列表或用户可以选择语言的某种输入,请将该输入帖子添加到操作方法中。在这种操作方法,写的语言ID将Cookie:

public class LanguageController 
{ 
    [ActionName("change-to")] 
    public virtual RedirectResult Change(LanguageChanger model) 
    { 
     var langCookie = new HttpCookie(CookieNames.Language); 
     langCookie.Value = model.SelectedIsoCode; 
     langCookie.Expires = DateTime.UtcNow.AddDays(28); 
     HttpContext.Response.Cookies.Add(langCookie); 
     return Redirect(model.ReturnUrl); 
    } 
} 

然后,您可以使用一个HttpModule来设置文化为每个请求。你知道文化通过这种方式被设置在整个请求处理管道,而不是只当你的控制器操作执行:

public class CookieLocalizationModule : IHttpModule 
{ 
    public void Dispose() { } 

    public void Init(HttpApplication context) 
    { 
     context.BeginRequest += new EventHandler(context_BeginRequest); 
    } 

    void context_BeginRequest(object sender, EventArgs e) 
    { 
     // read the cookie (if any) and set the culture 
     if (HttpContext.Current.Request.Cookies[CookieNames.Language] != null) 
     { 
      var cookie = HttpContext.Current.Request 
       .Cookies[CookieNames.Language]; 
      var lang = cookie.Value; 
      var culture = new System.Globalization.CultureInfo(lang); 
      Thread.CurrentThread.CurrentCulture = culture; 
      Thread.CurrentThread.CurrentUICulture = culture; 
     } 
    } 

} 

向IIS注册& IIS Express中的模块,看到这个web.config文件(注意卡西尼配置会略有不同)

<system.webServer> 
    <validation validateIntegratedModeConfiguration="false" /> 
    <modules runAllManagedModulesForAllRequests="true"> 
     <add name="CookieLocalizationModule" 
      type="MyProject.CookieLocalizationModule, MyProject" /> 
    </modules> 
    <handlers> 
     ... 
+0

我在MVC 2项目工作CookieLocalizationModule的相同的设置,但在MVC 4中context_BeginRequest达到永不失败。问题是什么?谢谢。 – user585440