Как я могу интернационализировать строки, представляющие значения перечисления C #? - PullRequest
5 голосов
/ 25 мая 2010

Я видел много вопросов и ответов о сопоставлении строк с перечислениями и наоборот, но как я могу сопоставить серию локализованных строк с перечислениями?

Должен ли я просто создать метод расширения, подобный этому , который возвращает правильную строку из файла ресурсов? Есть ли способ локализовать атрибуты (например, «Описание»), которые используются в решениях, подобных этому ?

Какое решение является предпочтительным - метод расширения или атрибуты. Мне кажется, что это не целевое назначение атрибутов. Фактически, теперь, когда я думаю об этом, если бы я использовал метод расширения, атрибут был бы похож на то, что я бы использовал, чтобы указать ключ в файле ресурсов для локализованной строки, которую я хочу использовать вместо значения перечисления.

РЕДАКТИРОВАТЬ - пример:

Учитывая следующее перечисление,

public enum TransactionTypes {
    Cheque = 1,
    BankTransfer = 2,
    CreditCard = 3
}

Мне нужен способ сопоставления каждого типа локализованной строке. Я начал с метода расширения для перечисления, в котором используется оператор switch и строго типизированные ссылки на файл ресурсов.

Однако метод расширения для каждого перечисления не кажется хорошим решением. Я начал подписываться на this , чтобы создать собственный атрибут для каждого перечисляемого значения. Атрибут имеет базовое имя и ключ для файла ресурсов, содержащего локализованные строки. В приведенном выше перечислении, например, у меня есть это:

...
[EnumResourceAttribute("FinancialTransaction", "Cheque")]
Cheque = 1,
...

Где "FinanacialTransaction" - файл resx, а "Check" - строковый ключ. Я пытаюсь создать служебный метод, которому я мог бы передать любое значение из любого перечисления и заставить его возвращать локализованное строковое представление этого значения, предполагая, что указан пользовательский атрибут. Я просто не могу понять, как получить динамический доступ к файлу ресурса и ключу в нем.

Ответы [ 2 ]

8 голосов
/ 25 мая 2010

Я бы определенно предложил использовать файл ресурса, возможно, с методом (расширением или иным образом), чтобы упростить получение соответствующего ресурса. По мере роста числа поддерживаемых вами языков вы не хотите, чтобы код был полон текста, отвлекающим вас от самих значений.

Аналогичным образом, переводческие компании, вероятно, будут готовы обрабатывать файлы resx - они не захотят возиться с вашим исходным кодом, и вы все равно не должны позволять им это делать:)

Просто используйте ресурсы, в которых указывается имя перечисления и значение внутри него. Просто масштабируется до нескольких перечислений и нескольких языков, не загромождает ваш исходный код, хорошо работает с инструментами перевода и в основном соответствует потоку i18n в .NET.

РЕДАКТИРОВАТЬ: Для отображения значений перечисления на имена ресурсов, я бы просто сделал что-то вроде:

public static string ToResourceName<T>(this T value) where T : struct
{
    return typeof(T).Name + "." + value;
}

Тогда вы могли бы сделать:

string resource = MyEnum.SomeValue.ToResourceName();

Очевидно, что каждый раз выполняется конкатенация строк - вы могли бы кэшировать это, если хотите, но я бы не стал беспокоиться, если бы у вас не было никаких признаков того, что это действительно проблема.

Конечно, это не мешает вам использовать метод расширения для не перечислений. Если вы хотите сделать это, вам нужно что-то вроде Unconstrained Melody .

2 голосов
/ 09 июня 2010

Я продолжил с пользовательскими атрибутами и создал этот метод утилиты:

    public static string getEnumResourceString(Enum value)
    {
        System.Reflection.FieldInfo fi = value.GetType().GetField(value.ToString());
        EnumResourceAttribute attr = (EnumResourceAttribute)System.Attribute.GetCustomAttribute(fi, typeof(EnumResourceAttribute));
        return (string)HttpContext.GetGlobalResourceObject(attr.BaseName, attr.Key);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...