Quelle est la meilleure façon d'ajouter une prise en charge multilingue à un programme C ++?
Si possible, la langue doit être lue dans un fichier texte brut contenant quelque chose comme des paires de la valeur clé (§welcomeMessageA§ "Bonjour% s! "). P>
J'ai pensé à quelque chose comme ajouter une fonction localisée (clé) qui renvoie la chaîne du fichier de langue chargé. Y a-t-il des voies meilleures ou plus efficaces? P>
//half-pseudo code //somewhere load the language key value pairs into langfile[] string localizedString(key) { //do something else here with the string like parsing placeholders return langfile[key]; } cout << localizedString(§WelcomeMessage§);
3 Réponses :
moyen le plus simple sans bibliothèques externes:
// strings.h p> // strings.c p> // en_au.lang p> mais vous auriez besoin d'une liste de noms de chaîne pour correspondre aux titres de la chaîne. IE P> // parse_strings.c p> Ce qui précède doit être légèrement plus facile dans C ++, car vous pouviez utiliser la méthode de la totring (ou quoi Jamais comme - ne peut pas être dérangé de le regarder). p> Tout ce que vous avez à faire est d'analyser les fichiers de langue. P> J'espère que cela aide. P> PS: et pour accéder aux chaînes: p> languages[current_language][STRING_HELLO]
Merci, mais est-il possible d'utiliser du texte non latin de cette façon (comme le chinois ou le russe)?
Faire les chaînes non signé Char code> puis utiliser UTF-8.
La suggestion de l'espace_c0wb0w est une bonne. Nous utilisons actuellement l'UCU avec succès pour cela dans nos produits. P>
faisant écho à votre commentaire à sa réponse: il est en effet difficile de dire que l'ICU est "petit, propre, simple". Il existe une «complexité accidentelle» dans l'ICU provenant de son interface «Java-ISH», mais une grande partie de la complexité et de la taille vient simplement de la complexité et de la taille du domaine problématique qui s'adresse. P>
Si vous n'avez pas besoin de la pleine puissance de l'ICU et ne vous intéresse que par "Traduction du message", vous pouvez regarder GNU GetText qui, selon vos besoins en matière de plate-forme et de licence, peut être une alternative "plus petite, plus propre et moins compliquée". P>
Le Boost.Locale projet est également une alternative intéressante. En fait, son " Messages Formatage " La fonctionnalité est basée sur le modèle GetText. < / p>
Wow, boost.locale semble assez bien fait!
Puisque vous demandez le meilleur fort> fort> (et que vous n'avez pas mentionné la plate-forme), je recommanderais gnu gettext . P>
Il s'agit de la bibliothèque internationalisation la plus complète et mature pour la programmation C / C ++. P>
Le bibliothèque ICU est conçu pour cela.