C# ASP.NET MVC4多语言数据批注

C# ASP.NET MVC4多语言数据批注,c#,.net,asp.net-mvc,data-annotations,multilingual,C#,.net,Asp.net Mvc,Data Annotations,Multilingual,在标准应用程序中,我有以下内容: [Required] [DisplayName("Email Address")] public string EmailAddress { get; set; } …这会自动生成此表单字段的英文标签 现在,如果我需要我的应用程序支持5种语言,那么ASP.NET MVC应用程序处理这一问题的最佳方法是什么 应用范围约为400-600个数据字段 更新:我还需要支持更新应用程序中的小部分文本,如页面名称和每个表单的简介(小段落)。我将创建自定义属性,如[MyDis

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

[Required]
[DisplayName("Email Address")]
public string EmailAddress { get; set; }
…这会自动生成此表单字段的英文标签

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

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


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

我将创建自定义属性,如[MyDisplayName(“Section”,“Key”)]
这将提供基于选定语言的翻译。还可以查看数据库驱动的资源管理器,如

,而不是为属性属性指定实际值,而是为资源字符串指定键。然后,您可以使用一个定制的
modelmataprovider
,它知道本地化上下文并将提供适当的字符串。为了获得更好的解决方案,您可以使用自定义的
modelmataprovider
inferconvention(这减少了对详细属性的需要)

Phil Haack有一篇名为的博客文章,解释了这是如何工作的。还有一个相应的NuGet包,名为,源代码可在github上获得,网址为


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

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

  • 你的应用程序非常静态
  • 您的语言集非常静态
  • 您可以使用自定义属性装饰您的模型,在其中为资源设置默认字符串和DB id,例如

    [MyResource("email", 123)]
    

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

    我所做的(它是一个集群****)类似于:
    [DisplayName(ResourceManager.GetTag(“EmailAddress”,GetCurrentLocale())]
    -我创建了那个类和方法并让它工作了,但也许有一种更好的内置方式。您可以为每种语言使用资源并使用注释。@Serg-这不是只在开发人员的工作站上工作吗?据我所知,属性在编译时序列化到程序集元数据中,因此如果您将代码转换到另一种语言上国家/地区并运行它,我认为您仍然可以获得它编译时使用的任何语言。
    GetCurrentLocale()
    并不是直接调用.NET语言环境,它只是我使用的一个名称。它实际上从客户端获取一个cookie值。例如:
    en-US,en-GB,es-es
    为注释和答案干杯,将在下周处理这些问题,然后重新访问并标记答案。