【问题标题】:ASP.NET MVC4 Multi-lingual Data AnnotationsASP.NET MVC4 多语言数据注释
【发布时间】:2012-10-09 20:04:45
【问题描述】:

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

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

...这又会自动为该表单域生成一个英文标签。

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

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

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

【问题讨论】:

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

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


【解决方案1】:

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

Phil Haack 有一篇名为 Model Metadata and Validation Localization using Conventions 的博客文章解释了它的工作原理。还有一个相应的 NuGet 包,名为 ModelMetadataExtensions,其源代码可在 github 上的 https://github.com/Haacked/mvc-metadata-conventions 获得。

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

【讨论】:

  • 有人有类似 Phil Haack 的 .NET Core 5.0 解决方案吗?
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    1. 您的应用非常静态
    2. 您的语言集非常静态

    您可以使用自定义属性来装饰您的模型,您可以在其中为资源设置默认字符串和数据库 ID,例如

    [MyResource("email", 123)]
    

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

    【讨论】:

      猜你喜欢
      • 2017-02-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-03
      • 1970-01-01
      • 1970-01-01
      • 2016-01-03
      相关资源
      最近更新 更多