Enum localisation
Comment avez-vous localiser les énumérations pour un ListBoxFor
lorsque plusieurs options sont possibles?
Par exemple un enum
qui contient des rôles:
public enum RoleType
{
[Display(Description = "Administrator", ResourceType = typeof(Resource))]
Administrator = 1,
[Display(Description = "Moderator", ResourceType = typeof(Resource))]
Moderator = 2,
[Display(Description = "Webmaster", ResourceType = typeof(Resource))]
Webmaster = 3,
[Display(Description = "Guest", ResourceType = typeof(Resource))]
Guest = 4,
Etc.... = 5,
}
J'ai vu ce fait avec dropdownlist
/selectlists
. Mais est-il un moyen de faire cela pour un multi liste de sélection?
[MODIFIER]
C'est comment j'aimerais l'utiliser, ce qui est la façon dont il fonctionne maintenant, mais ne sont pas traduits dans une autre langue:
var roles = from role r in Enum.GetValues(typeof(RoleType))
select new
{
Id = (int)Enum.Parse(typeof(RoleType), r.ToString()),
Name = r.ToString()
};
searchModel.roles = new MultiSelectList(roles, "Id", "Name");
Note: j'ai renommé l'enum de Rôle à RoleType.
- Tu veux dire en utilisant des valeurs qui peuvent être combinés avec des opérations bit à bit comme ceci?
- non, je veux dire pour la traduction dans la vue. Enum descriptions sont enregistrés dans un fichier de ressources.
- Double Possible de Comment utiliser la localisation en C#
- En Wpf, contrôle de mise en œuvre de cette un stackoverflow.com/a/47464705/1106625
Vous devez vous connecter pour publier un commentaire.
Vous pouvez mettre en œuvre un attribut de description.
Définir comme ceci:
Et de l'utiliser comme ceci:
J'ai résolu le problème en créant un EnumExtension que j'utilise dans mon point de vue. Cette extension se présente pour un fichier de ressources appelé "EnumResources.resx" et recherche de la ressource par la convention d'appellation suivante {Nom de EnumType}_{Valeur d'enum passé en}. Si la ressource clé est manquante, il affiche la valeur de la ressource encapsulées dans des doubles crochets [[EnumValue]]. De cette façon, il est facile de trouver un "non traduite" Enum dans votre point de vue. Aussi cela permet de vous rappeler si vous avez oublié de mettre à jour le fichier de ressources après un changement de nom ou telle.
La ressource de fichier ressemble à ceci:
Utilisation:
enum
's placé dans un fichier de ressources? Est-il possible d'avoir plusieurs fichiers trop?convention over configuration
de réponse. Juste un commentaire, vous devez passer de la culture que vous voulez match contre ici:var resourceDisplayName = rm.GetString(e.GetType().Name + "_" + e, EnumResources.Culture);
Il y a un moyen d'utiliser les attributs de spécifier une chaîne de caractères à utiliser pour les énumérations, lors de l'affichage, mais nous l'avons trouvé trop délicat quand vous avez eu à gérer la localisation.
Donc, ce que nous avons l'habitude de le faire pour les énumérations, qui doivent être localisée est d'écrire une classe d'extension qui fournit une méthode pour obtenir le nom traduit. Vous pouvez simplement utiliser un commutateur qui renvoie des chaînes de l'habitude de ressources. De cette façon, vous fournir les chaînes traduites pour les énumérations, par le biais des ressources, tout comme pour les autres chaînes.
Par exemple:
Que vous pouvez utiliser comme ceci:
Si vous gardez le
RoleExt
implémentation de la classe à côté de laenum Role
mise en œuvre, il va devenir effectivement une partie de l'interface pourRole
. Bien sûr, vous pouvez également ajouter à cette classe tous les autres extensions utiles pour les enum .[MODIFIER]
Si vous souhaitez gérer plusieurs indicateurs paramètres ("l'Administrateur et le Modérateur ET Webmaster"), alors vous avez besoin de faire les choses un peu différemment:
Que vous pourriez utiliser comme ceci:
Fichiers De Ressources
Fichiers de ressources sont la façon dont vous internationaliser vos chaînes. Pour plus d'informations sur la façon de les utiliser, voir ici:
http://msdn.microsoft.com/en-us/library/vstudio/aa992030%28v=vs.100%29.aspx
http://msdn.microsoft.com/en-us/library/vstudio/756hydy4%28v=vs.100%29.aspx
Vous pouvez utiliser votre valeur d'enum à faire ce que vous voulez.
Lorsque vous souhaitez obtenir des sélectionnés enum sur la zone de liste, vous pouvez récupérer la liste élément, puis vous récupérez les associés enum nombre.
Alors vous convertir un enum cet
(
i
est associé int vale pour cet exemple)Conversion enum article en Entier et entier valeur d'enum élément
SI vous ajoutez à une table de hachage, alors vous pouvez le faire de cette façon
lorsque vous choisissez un élément dans la table de hachage , convertir Enum élément et l'utiliser où vous voulez. Vous pouvez utiliser la même méthode pour remplir les tables de données /Comboboxes , des listes déroulantes et ainsi de suite
La méthode d'extension de soufflet, il est travaillé pour moi.
Je holpe aide.
Une version de @eluxen réponse de travail pour certains portables (PCL) bibliothèques (en particulier pour
Profile47
) où la solution d'origine ne fonctionne pas. Deux problèmes ont été abordés: DescriptionAttribute n'est pas disponible dans les bibliothèques portatives, et problème signalé par @Jitendra Pancholi avec "impossible de trouver toutes les ressources" erreur est résoluPour l'utilisation de la réponse originale à cette question. Et si vous ne rencontrez pas de problèmes, je serais encore à l'utilisation de l'original de la réponse, car elle ne contient pas de solutions à travers la réflexion
L'un des problèmes de la traduction/localisation des enums, c'est que non seulement vous avez à les traduire en spectacle, mais aussi d'analyser les traductions vers la valeur d'enum. La suite C# ce fichier contient comment j'ai surmonté les problèmes de manière deux traductions d'énumérations. Pardon de l'excès de commentaires, mais je ne reçois assez bavard sur mes créations.
Cela ne nécessite pas un attribut de l'avant de chaque valeur d'enum, mais nécessite que le nom de l'attribut de la traduction de votre enum chaîne dans les ressources est mis en forme telles que c'est une concaténation de la enum type-le nom et la valeur d'enum. Voir le commentaire ci-dessus la LocalEnumDescription méthode pour plus d'informations. En outre, il conserve les traductions des énumérations (à la fois en avant et en arrière) par la cartographie de leurs traductions telles que nous n'avons pas besoin de chercher la traduction à chaque fois que nous rencontrons une valeur d'enum.
Espérons-le, il est assez facile à comprendre et à utiliser.
Encore une autre possibilité est de créer un mondial nom d'affichage de stockage de la classe d'extension de plus de Enum classe:
Possible l'utilisation est très simple, par exemple:
Même réponse que accepté de répondre, mais sans avertissements d'analyse du code
Les solutions ci-dessus avec le LocalizedDescriptionAttribute lire à partir de la langue du programme. Parfait pour un client, pas si flexible pour un côté serveur lorsque vous souhaitez passer la langue en tant que paramètre.
J'ai donc étendu eluxen solution avec le LocalizedDescriptionAttribute par l'ajout d'une autre méthode:
Avec le GetDescription extension aussi avec le paramètre de langue:
Et finalement, je préfère éviter toute chaîne dans l'utilisation de l'attribut n', à l'aide de nameof.
que j'utilise dans mon code comme suit:
Vous pouvez l'utiliser comme
Espère que cela aidera à quelqu'un
J'utilise actuellement, j'espère que ça aide!:
Créé un .resx fichier nommé "App_GlobalResources\ProductNames.resx".
Utilisation:
Vous pouvez utiliser Lexicale.Localisation1 qui permet d'intégrer la valeur par défaut et la culture des valeurs spécifiques dans le code, et de développer en externe fichiers de localisation (comme .en json .resx ou .ini) pour de plus amples cultures.
Code du Programme:
localisation.ini:
1 (je suis responsable de la bibliothèque)