通过String.Format()进行错误的枚举本地化

时间:2019-03-21 16:48:31

标签: c# asp.net-mvc razor localization

我无法获取String.Format()以将本地化用于枚举。它不会选择默认的本地化,而是始终默认为法语。我的网站是法语。英文翻译在Title.en-GB.resx中。

我有以下枚举:

public enum Title
{
     [Display(Name = "Mr", ResourceType = typeof(Res.Title))]
     Mr = 1,
     [Display(Name = "Mrs", ResourceType = typeof(Res.Title))]
     Mrs = 2,
     [Display(Name = "Miss", ResourceType = typeof(Res.Title))]
     Miss = 3
}

我正在使用两个简单的资源文件(英语和法语)来做到这一点:

<data name="Miss" xml:space="preserve">
  <value>Mademoiselle</value>
</data>

当我这样做时,翻译工作按预期进行:

@Html.EnumDropDownListFor(m => m.Title)

但是,每当我尝试通过String.Format显示枚举时,翻译就永远不会起作用,而且我总是以Mister或Madame等结尾。

<p>
    @String.Format("{0} {1} {2}", (Title)Model.Person.Title), Model.Person.FirstName, Model.Person.LastName)
</p>

标题是模型上的一个整数,因此是演员表。

web.config具有以下设置:

<globalization uiCulture="fr-FR" culture="fr-FR" />

其他一切都很好。有任何想法吗?谢谢。

1 个答案:

答案 0 :(得分:1)

发生这种情况的原因是string.Format将调用((Title)Model.Person.Title).ToString()方法,而该方法对Display属性一无所知。在这种情况下,您需要以某种方式获得价值。方法之一是创建一些扩展名,例如:

public static class EnumExtensions
{
    public static string GetDisplayName(this Enum value)
    {
        return value.GetType()
            .GetMember(value.ToString())
            .First()
            .GetCustomAttribute<DisplayAttribute>()
            .GetName();
    }
}

其中.GetName()将从资源中检索本地化的字符串

然后您应该将其命名为:

<p>
    @String.Format("{0} {1} {2}", ((Title)Model.Person.Title).GetDisplayName(), Model.Person.FirstName, Model.Person.LastName)
</p>