0

我已经以其他形式看到过这个问题(主要与验证有关),但无法理解答案。

我有以下内容:

    [Required, DisplayName("First Name")]
    public virtual string GivenName { get; set; }

我想让 DisplayName 本地化。我通过创建一个RequiredAttribute Extension 来进行尝试,就像其他人一样:

public class RequiredFieldAttribute : System.ComponentModel.DataAnnotations.RequiredAttribute
    {
        public RequiredFieldAttribute()
        {
            T = NullLocalizer.Instance;
        }

        public Localizer T { get; set; }

        public override string FormatErrorMessage(string name) {
            var field = T(name).Text;
            return T("Please fill in {0}.", field).Text;
        }
    }
}

返回的错误消息不断返回英文名称。但我确信有翻译,因为当我在视图中使用以下内容时,我得到了本地化名称:

@Html.LabelFor(m => register.GivenName, T("First Name"))

消息本身(请填写...)也已本地化。除了字段名称不是。在视图中请求字段名的字符串时如何本地化它,但在扩展中使用它时却没有。

在查看关于 codeplex 的讨论时,我看到一些变更集修复了有关命名空间中本地化数据注释的问题Orchard.MVC.DataAnnotations。但我在现有模块中找不到任何关于如何使用这些模块的示例。

4

3 回答 3

2

这个问题可能已经过时了,但我在 Orchard CMS 1.8.1 中问自己同样的问题。所以这就是我的做法。

假设您有一个看起来像的模型

public class Message
{
  [System.ComponentModel.DataAnnotations.Required(ErrorMessage="Please select a date."]
  public System.DateTime Date { get; set; }
  ...
}

并且您希望对所需的验证消息进行德语翻译,然后App_Data\Localization\de-DE\orchard.module.po在模块中创建一个文件并将以下段落放入其中

msgctxt "System.ComponentModel.DataAnnotations.RequiredAttribute"
msgid "Please select a date."
msgstr "Bitte wählen Sie ein Datum."

您甚至可以跳过 msgctxt 行(这是翻译的范围),因为它也可以在没有它的情况下工作。.po 文件格式的描述可以在http://pology.nedohodnik.net/doc/user/en_US/ch-poformat.html找到。

如果翻译不起作用,那么以下方法是一个很好的调试入口点:

Orchard/Localization/Text.cs
public LocalizedString Get(string textHint, params object[] args) ...

Orchard/Localization/Services/DefaultLocalizedStringManager.cs
public string GetLocalizedString() ...
于 2015-02-25T08:34:10.477 回答
0

我也遇到了这个问题。我想知道你是否解决了。

您提到您找不到 Orchard.MVC.DataAnnotations 示例。它们位于(如果您使用 Orchard 源代码(从 1.6 开始))~/Orchard.Framework/Mvc/DataAnnotations

LocalizedRequiredAttribute.cs看起来像:

namespace Orchard.Mvc.DataAnnotations {
public class LocalizedRequiredAttribute : RequiredAttribute {
    public LocalizedRequiredAttribute(RequiredAttribute attribute, Localizer t) {
        AllowEmptyStrings = attribute.AllowEmptyStrings;

        if ( !String.IsNullOrEmpty(attribute.ErrorMessage) )
            ErrorMessage = attribute.ErrorMessage;

        T = t;
    }

    public Localizer T { get; set; }

    public override string FormatErrorMessage(string name) {
        return String.IsNullOrEmpty(ErrorMessage)
            ? T("The {0} field is required.", name).Text
            : T(ErrorMessage, name).Text;
    }
}

所以你必须用[LocalizedRequiredAttribute]. 抱歉,我现在的理解是,在此示例中,您将继续像以前一样使用 [Required],而 Orchard 会为您进行更改。但是,您必须手动创建.po文件,因为 TranslationManager 不会提取这些文件。

我自己在尝试本地化[Display(Name="")]属性时遇到了麻烦。我的部分困惑在于System.ComponentModel并且System.ComponentModel.DataAnnotations因为它们都具有相似的属性(DisplayNameAttribute对于前者,DisplayAttibute对于后者)。

于 2012-11-30T15:17:35.947 回答
0

您可以在 orchard 项目中使用普通验证相同的普通 mvc 项目您只需将这些设置添加到 webconfig :

<appSettings>
<add key="ClientValidationEnabled" value="true"/>
<add key="UnobtrusiveJavaScriptEnabled" value="true"/>

结尾

于 2019-03-07T17:06:29.817 回答