【问题标题】:Internationalization with ASP.Net MVC3(User Select Preferred language once for all View)使用 ASP.Net MVC3 国际化(用户选择首选语言一次查看)
【发布时间】:2012-01-19 08:03:38
【问题描述】:

我希望用户为整个应用选择一次首选语言。建议我最简单的步骤。
这样用户在登录后只选择一次首选语言,然后所有应用程序的视图都以所选文化呈现。
我发现了一些相关的here


因为我是国际化的新手,所以我没有正确理解它。
我创建了一个示例应用程序,它适用于特定于浏览器的文化,但在这里我希望用户选择首选语言。

【问题讨论】:

    标签: asp.net asp.net-mvc asp.net-mvc-3 internationalization


    【解决方案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);
    

    希望有帮助!

    【讨论】:

      【解决方案2】:

      我建议您使用 Culture 参数扩展 User 实体以将其存储在 DB 中。 然后可以在 Session 中添加有关用户文化的信息(但也可以使用任何其他技术)

      那么你需要用代码添加新的属性

      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);
              }
          }
      }
      

      并将这个属性添加到所有应该本地化的控制器中

      【讨论】:

        【解决方案3】:

        一种方法是使用 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(注意 Cassini 配置会有些不同)

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

        【讨论】:

        • 我在 MVC 2 项目中具有相同的 CookieLocalizationModule 设置,但在从未达到 context_BeginRequest 的 MVC 4 中失败。问题是什么?谢谢。
        猜你喜欢
        • 1970-01-01
        • 2011-03-29
        • 1970-01-01
        • 1970-01-01
        • 2011-06-06
        • 1970-01-01
        • 1970-01-01
        • 2017-04-11
        • 2018-11-26
        相关资源
        最近更新 更多