Какой лучший способ обеспечить локализацию для Enums? - PullRequest
6 голосов
/ 12 октября 2010

Я пишу многоязычное приложение, которое использует много перечислений, и я хотел бы достичь следующих целей:

  1. Отображение имен перечислений в виде локализованных строк
  2. Предоставить локализованные описания с использованием атрибутов
  3. Включить чувствительный к языку синтаксический анализ перечислений обратно к значениям int

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

Подходит ли какой-то механизм на основе TypeDescriptor? Или даже возможно?

Более того - как можно достичь цели № 3 чистым, общим и многократно используемым способом?


С тех пор как я задал этот вопрос, я завершил работу над библиотекой с открытым исходным кодом, для которой требовалось локализованное отображение enum. Я пошел с техникой реализации TypeConverters. Полный источник доступен на http://measures.codeplex.com/

Ответы [ 3 ]

5 голосов
/ 12 октября 2010

Как насчет написания TypeConvertor для ваших перечислений?

  1. Определите некоторый пользовательский атрибут, который будет идентифицировать строку ресурса для значения перечисления.
  2. Напишите TypeConvertor, который будет искать этот атрибут, чтобы получить идентификатор ресурса, а затем преобразовать значение в строку. (Вы можете иметь вспомогательный класс для того же самого, но использование TypeConvertor и TypeConvertorAttribute позволяет использовать его более прозрачно).
  3. Вы можете написать общий класс / метод, который будет выполнять обратное преобразование (из строки в enum). Метод будет выглядеть примерно так: Parse<T>(string value), где T будет типом enum. Реализация создаст (по запросу) словарь поиска для заданного типа перечисления T, используя отражение для поиска вашего пользовательского атрибута.
4 голосов
/ 12 октября 2010

Я думаю, что вы находитесь в правильном направлении - используйте атрибуты для украшения членов перечисления.Единственное, что вам, вероятно, нужно сделать, это забыть о System.ComponentModel и спроектировать свой собственный набор атрибутов, который будет соответствовать вашим требованиям и общей архитектуре приложения.

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

4 голосов
/ 12 октября 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...