我无法获取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" />
其他一切都很好。有任何想法吗?谢谢。
答案 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>