Неправильная локализация Enum через String.Format () - PullRequest
1 голос
/ 21 марта 2019

Я не могу заставить 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, перевод никогда не хочет работать,и я всегда получаю мистера или мадам и т.д.1018 *

Все остальное в порядке.Есть идеи?Благодаря.

1 Ответ

1 голос
/ 22 марта 2019

Причина, по которой это происходит, заключается в том, что 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...