ASP.NET MVC4多语言数据注释

时间:2012-10-09 20:04:45

标签: c# .net asp.net-mvc data-annotations multilingual

在标准应用程序中,我有以下内容:

[Required]
[DisplayName("Email Address")]
public string EmailAddress { get; set; }

...这反过来会自动以英语为此表单字段生成一个标签。

现在,如果我需要我的应用程序支持5种语言,ASP.NET MVC应用程序处理此问题的最佳方法是什么?

适用范围约为400-600个数据字段。

更新:我还需要支持更新应用程序中的小部分文本,例如页面名称和每个表单的介绍(小段落)。

3 个答案:

答案 0 :(得分:9)

不是将实际值分配给属性属性,而是为资源字符串分配键。然后,您可以使用了解本地化上下文的自定义ModelMetadataProvider,并提供相应的字符串。要获得更好的解决方案,您可以使自定义ModelMetadataProvider推断约定(减少对详细属性的需求)。

菲尔·哈克(Phil Haack)有一篇名为Model Metadata and Validation Localization using Conventions的博客文章解释了这是如何运作的。还有一个名为ModelMetadataExtensions的相应NuGet包,其源代码位于https://github.com/Haacked/mvc-metadata-conventions的github上。

作为旁注,我建议我回顾一下我在以前的一个老问题上得到的一些很棒的答案:Effective Strategies for Localization in .NET。它们没有专门解决您的问题,但如果您正在使用多语言.NET应用程序,它将非常有用。

答案 1 :(得分:-1)

我会制作自定义属性,例如 [MyDisplayName(“Section”,“Key”)] 这将提供基于所选语言的翻译。另请查看数据库驱动的资源管理器,例如http://www.west-wind.com/presentations/wwDbResourceProvider/

答案 2 :(得分:-1)

本地化的最佳方法是将字符串存储在数据库中,而不是资源文件,除非

  1. 您的应用非常静态
  2. 您的语言设置非常静态
  3. 您可以使用自定义属性修饰模型,您可以在其中设置资源的默认字符串和数据库ID,例如

    [MyResource("email", 123)]
    

    您可以编写自定义http委托处理程序以从缓存中获取资源(例如)。对客户端进行身份验证后,您就会了解客户端的语言需求和资源ID。因此,具有西班牙语和资源id = 1的客户端将获得“Si”,具有英语的客户端将获得“是”。资源ID将映射到特定于语言的字符串。