3

有谁知道您是否可以控制 ModelState 对象的文化,我在我的多语言应用程序中面临一个问题,其中语言基于您访问该站点的子域,例如:

italia.domain.com - “将文化更改为意大利语”

German.domain.com -“将文化更改为德语”

问题是提交表单时 ModelState 对象上的语言似乎由客户端浏览器控制,而不是当前线程文化。

因此,我正在寻找一个解决方案,我可以修改此行为或覆盖它,以便我的意大利语子域上的语言始终是意大利语,而不是客户端浏览器的语言。

编辑

我已经完成了根据子域更改语言的部分:

var HttpHost = HttpContext.Request.ServerVariables["HTTP_HOST"];
var _hostname = (HttpHost.Split(':').Length > 1) ? HttpHost.Substring(0, HttpHost.IndexOf(':')) : HttpHost;

var allowedHostnames = "italiansubdomain.domain.com|it,frenchsubdomain.domain.com|fr,germansubdomain.domain.com|de,englishsubdomain.domain.com|en".Split(',');
foreach (var hostname in allowedHostnames)
{
    if (hostname.StartsWith(_hostname.ToLower()))
    {
        var lang = hostname.Split('|').Last();
        if (lang == "en") lang = "uk";
        // Updates the cultures for the dynamic language
        var ci = new CultureInfo(lang);
        System.Threading.Thread.CurrentThread.CurrentCulture = ci;
        System.Threading.Thread.CurrentThread.CurrentUICulture = ci;
    }
}

所以我的问题是,当我像这样使用 Modelstate 验证时:

public class Email {
    [Required(ErrorMessageResourceName = "validation_required", ErrorMessageResourceType = typeof(Resources.Master)), StringLength(50, MinimumLength = 2, ErrorMessageResourceName = "validation_string_length_2_50", ErrorMessageResourceType = typeof(Resources.Master))]
    public string SenderName { get; set; }
    [Required(ErrorMessageResourceName = "validation_required", ErrorMessageResourceType = typeof(Resources.Master)), Email(ErrorMessageResourceName = "validation_email_invalid", ErrorMessageResourceType = typeof(Resources.Master))]
    public string SenderEmail { get; set; }
    [Required(ErrorMessageResourceName = "validation_required", ErrorMessageResourceType = typeof(Resources.Master)), StringLength(50, MinimumLength = 2, ErrorMessageResourceName = "validation_string_length_2_50", ErrorMessageResourceType = typeof(Resources.Master))]
    public string ReceiverName { get; set; }
    [Required(ErrorMessageResourceName = "validation_required", ErrorMessageResourceType = typeof(Resources.Master)), Email(ErrorMessageResourceName = "validation_email_invalid", ErrorMessageResourceType = typeof(Resources.Master))]
    public string ReceiverEmail { get; set; }
    public string Comment { get; set; }
}

以及检查模型状态验证部分:

if (!ModelState.IsValid) {
  var keys = ModelState.Keys.ToList();
  var values = ModelState.Values.ToList();

  for (var i = 0; i < keys.Count; i++)
  {
      var value = values[i];
      if (value.Errors.Count > 0)
      { 
          response.AddError(keys[i], value.Errors[0].ErrorMessage);
      }
  }
}

然后,当我通过 Ajax 响应结果或仅通过调试我根据浏览器语言设置接收错误消息来访问错误时,这就是我想将其更改为当前活动的语言的地方。

编辑

提前致谢, bsthomsen

4

4 回答 4

3

我通过将更改文化的代码从 Controller.OnActionExecuting 移动到 Controller.ExecuteCore 解决了这个问题

于 2012-08-08T07:16:58.170 回答
0

这个 libk 应该有助于如何:为 ASP.NET 网页全球化设置文化和 UI 文化

将全球化部分添加到 Web.config 文件

<globalization uiCulture="es" culture="es-MX" />

或以编程方式,覆盖InitializeCulture页面的方法(WebForms)

protected override void InitializeCulture()
{

        UICulture = selectedLanguage ;
        Culture = selectedLanguage ;

        Thread.CurrentThread.CurrentCulture = 
            CultureInfo.CreateSpecificCulture(selectedLanguage);
        Thread.CurrentThread.CurrentUICulture = new 
            CultureInfo(selectedLanguage);

    base.InitializeCulture();
}

或查看这个问题Set Culture in an ASP.Net MVC app

于 2012-08-07T17:34:51.500 回答
0

我曾在一个不完全相同但相似的情况下工作。您应该能够将当前线程的 UICulture 设置为特定语言,并且事情应该可以按您期望的那样工作。因此,确定请求的子域并相应地设置文化。查看更多:http: //msdn.microsoft.com/en-us/library/system.threading.thread.currentuiculture.aspx

于 2012-08-07T17:38:17.553 回答
0

您可以轻松地覆盖每个请求的文化Global.asax.cs

在您的情况下,您可以检查传入的 URL 并相应地设置文化。

protected void Application_AcquireRequestState(object sender, EventArgs e)
{
     //Create culture info object 
     CultureInfo ci = new CultureInfo("en");

     if(Request.Url.Host.Equals("italia.domain.com",
                                    StringComparison.InvariantCultureIgnoreCase))
     {
          ci = new CultureInfo("it");
     }

     System.Threading.Thread.CurrentThread.CurrentUICulture = ci;
     System.Threading.Thread.CurrentThread.CurrentCulture =
                                      CultureInfo.CreateSpecificCulture(ci.Name);
}
于 2012-08-07T17:43:36.467 回答