7
votes

C ++, support multilingue / localisation

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§);


1 commentaires

Le bibliothèque ICU est conçu pour cela.


3 Réponses :


10
votes

moyen le plus simple sans bibliothèques externes:

// strings.h p> xxx pré>

// strings.c p> xxx pré> Cela vous donnera ce que vous voulez. De toute évidence, vous pourriez lire les chaînes d'un fichier. I.e. P>

// en_au.lang p> xxx pré>

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> xxx pré>

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]


2 commentaires

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 puis utiliser UTF-8.



5
votes

La suggestion de l'espace_c0wb0w est une bonne. Nous utilisons actuellement l'UCU avec succès pour cela dans nos produits.

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.

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".

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>


1 commentaires

Wow, boost.locale semble assez bien fait!



2
votes

Puisque vous demandez le meilleur (et que vous n'avez pas mentionné la plate-forme), je recommanderais gnu gettext .

Il s'agit de la bibliothèque internationalisation la plus complète et mature pour la programmation C / C ++.


0 commentaires