2010-10-12 21 views
6

J'cris une application multi-langues qui utilise beaucoup énumérations, et je voudrais atteindre les objectifs suivants:Quelle est la meilleure façon de fournir la localisation pour Enums?

  1. Afficher les noms Enum comme des chaînes localisées
  2. fournissent des descriptions localisées en utilisant des attributs
  3. Activer l'analyse syntaxique des énumérations de retour aux valeurs int

Je souhaite décorer l'énum en utilisant des attributs + un fichier de ressources, de sorte que les chaînes localisées puissent être atteintes à partir d'informations de type exécution. J'ai été sur la route avant de déclarer une classe statique avec des membres statiques au lieu de une énumération, mais cela présentait autant de problèmes qu'elle a résolus.

Une sorte de mécanisme basé sur TypeDescriptor est-il approprié? Ou même possible? De plus - comment accomplir le but n ° 3 d'une manière propre, générique, réutilisable?


Depuis que j'ai posé cette question, j'ai complété la bibliothèque open source qui nécessitait des affichages enum localisables. Je suis allé avec la technique d'implémentation de TypeConverters. Source complète disponible à http://measures.codeplex.com/

+0

+1 J'aime la bibliothèque de mesures. – kenny

Répondre

5

Que diriez-vous d'écrire TypeConvertor pour vos enums?

  1. Définissez un attribut personnalisé qui identifiera la chaîne de ressource pour la valeur enum.
  2. Write TypeConvertor qui recherchera cet attribut pour obtenir l'ID de ressource, puis convertira la valeur en chaîne. (Vous pouvez avoir la classe d'aide pour la même chose mais en utilisant TypeConvertor et TypeConvertorAttribute permet de l'utiliser de façon plus transparente).
  3. Vous pouvez écrire une classe/méthode générique qui effectuera une conversion inverse (de chaîne à enum). La méthode sera quelque chose comme Parse<T>(string value) où T sera de type enum. L'implémentation va construire (à la demande) un dictionnaire de recherche pour un type T enum donné en utilisant la réflexion pour rechercher votre attribut personnalisé.
+1

Semble être la bonne voie à suivre ... avez-vous un exemple de code? – Mark

+0

Sorry Mark - je n'ai pas d'exemple de code! – VinayC

4

Je viens d'écrire une réponse à un autre sujet touchant certaines choses. Regardez here pour certains exemples de code.

+0

J'ai quelque chose de très similaire à ce que vous avez déjà posté, mais il ne s'occupe pas de l'aspect localisation de l'utilisation des énumérations. Avez-vous des réponses à propos de la localisation? – Mark

4

Je pense que vous êtes dans la bonne direction - utilisez des attributs pour décorer les membres de l'énumération. La seule chose que vous devez probablement faire est d'oublier System.ComponentModel et de concevoir votre propre ensemble d'attributs qui respecteront vos exigences et l'architecture globale de l'application.

Nous avons utilisé la même approche et cela fonctionne comme prévu "d'une manière propre, générique, réutilisable". Le seul aspect que nous n'avons pas mis en œuvre parce que nous n'en avions pas besoin était l'internationalisation réelle. Cependant, c'est juste une mécanique qui vous oblige à suivre la culture actuelle et à décider où sélectionner les fichiers de ressources. Fondamentalement, vous devrez peut-être choisir entre l'approche «plusieurs attributs» (un par langue) ou «unique attribut» (un pour toutes les langues encapsulant la sélection de fichiers de ressources).

+0

Vous avez un échantillon de code que vous pouvez poster ici? – Mark