2010-10-12 15 views
6

Estoy escribiendo una aplicación multi-idioma que utiliza muchas enumeraciones, y me gustaría lograr los siguientes objetivos: nombres Enum¿Cuál es la mejor manera de proporcionar localización para Enumeraciones?

  1. se muestran como cadenas localizadas
  2. proporcionan descripciones localizadas mediante atributos
  3. Habilite el análisis sensible al lenguaje de las enumeraciones de nuevo a valores int

Me gustaría decorar la enumeración utilizando atributos + un archivo de recursos, de forma que se pueda acceder a las cadenas localizadas desde la información de tipo de tiempo de ejecución. He estado en la ruta antes de declarar una clase estática con miembros estáticos en lugar de una enumeración, pero esto presentaba tantos problemas como había resuelto.

¿Es adecuado algún tipo de mecanismo basado en TypeDescriptor? O incluso posible?

Además, ¿cómo se logra el objetivo n. ° 3 de una manera limpia, genérica y reutilizable?


Desde que hice esta pregunta, he completado la biblioteca de código abierto que necesitaba pantallas enum localizables. Fui con la técnica de implementar TypeConverters. Fuente completa disponible en http://measures.codeplex.com/

+0

+1 Me gusta la biblioteca de medidas. – kenny

Respuesta

5

¿Qué le parece escribir TypeConvertor para sus enums?

  1. Defina un atributo personalizado que identificará la cadena de recursos para el valor enum.
  2. Escriba TypeConvertor que buscará este atributo para obtener el Id. De recurso y luego convertir el valor a cadena. (Puede tener clase de ayuda para lo mismo, pero el uso de TypeConvertor y TypeConvertorAttribute permite usarlo de forma más transparente).
  3. Puede escribir una clase/método genérico que realice la conversión inversa (de cadena a enumeración). El método será algo así como Parse<T>(string value) donde T será enum type. La implementación creará (bajo demanda) un diccionario de búsqueda para enum tipo T dado usando reflexión para buscar su atributo personalizado.
+1

Parece ser el camino correcto ... ¿tiene algún código de ejemplo? – Mark

+0

Lo sentimos Mark - no tiene ningún código de ejemplo! – VinayC

4

Acabo de escribir una respuesta a otro hilo tocando algunas de las cosas. Mire here para algunos ejemplos de código.

+0

Tengo algo muy similar a lo que publicó anteriormente, pero no se ocupa del aspecto de localización del uso de enumeraciones. ¿Tiene alguna respuesta sobre la localización? – Mark

4

Creo que está en la dirección correcta: use atributos para decorar los miembros de la enumeración. Lo único que probablemente deba hacer es olvidarse del System.ComponentModel y diseñar su propio conjunto de atributos que respetarán sus requisitos y la arquitectura general de la aplicación.

Utilizamos el mismo enfoque y funciona como se esperaba "de una manera limpia, genérica y reutilizable". El único aspecto que no implementamos porque no lo necesitamos es la internacionalización real. Sin embargo, esa es solo una mecánica que requiere que haga un seguimiento de la cultura actual y decida dónde seleccionar los archivos de recursos. Básicamente, es posible que necesite seleccionar entre los enfoques "atributos múltiples" (uno por idioma) o "atributo único" (uno para todos los idiomas que encapsulan la selección de archivos de recursos).

+0

¿Tienes algún código de muestra que puedas publicar aquí? – Mark

Cuestiones relacionadas