IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Internationalisation, gettext et std::local


Sujet :

C++

  1. #1
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut Internationalisation, gettext et std::local
    Bon, je repose ma question puisqu’elle a l’air d’avoir pris un coup de froid :
    Je souhaite internationaliser mon application, et plus spécifiquement gérer des messages textes dans différentes langues. J’ai un peu exploré le net pour voir les solutions qui pouvaient s’offrir à moi, et j’ai trouvé deux pistes :
    gettext est une librairie permettant de gérer des catalogues de textes multi-langues. Cependant cette solution ne me plait pas pour deux raisons majeurs :
    Par défaut, les chaînes de caractères doivent être en anglais et sont utilisées telles qu’elles apparaissent dans le code comme identifiant du catalogue. On peut, mais c’est plus compliqué, les gérés par du français.
    Du coup, ma seconde raison tient essentiellement à ce que je ne souhaite pas positionner les chaînes dans le code (exceptions faites d’un fichier ‘ressource’ associé). En effet, les chaînes ne sont pas produite par le développeur ni pour le français, ni pour les traductions.
    L’autre solution serait std ::local. Le hic, c’est que je n’arrive à trouver aucune doc là-dessus, et spécifiquement sur le format des fichiers catalogues associés. La doc dit que seul l’interface std ::local est spécifiée (jusque là, c’est normale), et que l’implémentation est laissée à la charge du compilo. D’où, pas d’info sur le format des fichiers….
    Donc ma question est quelqu’un connaîtrait-il une bibliothèque permettant de gérer des messages textes issus de plusieurs catalogues (à l’instar des LoadString des ressources windows), avec bien sûr la contrainte d’être à peu près libre et multi plateforme.
    Merci.

  2. #2
    Membre éclairé

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    717
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 717
    Points : 858
    Points
    858
    Par défaut
    1er question, ton appli a t'elle une GUI. Si oui il est fort probable que la biblio utilisée pour faire la GUI possède un mécanisme de gestion des catalogues qu'il serait dommage de ne pas utiliser.

    Sinon, il n'y a rien en standard dans le C++ qui puisse faire cela. std::local n'a pas de gestion de catalogues, elle sert juste à changer le comportement des fonctions standards, comme le formatage des nombres "1.2" en anglais, "1,2" en français, ...

    Mais gettext me semble plus puissant que tu semble le croire. Il peut s'utiliser de la même façon que LoadString, par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::cout << _("MESSAGE1");
    avec ensuite un fichier .po pour l'anglais contenant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    msgid "MESSAGE1"
    msgstr "Hello, World!"
    et un fichier .po pour le français contenant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    msgid "MESSAGE1"
    msgstr "Bonjour tout le monde !"

  3. #3
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    Du coup, ma seconde raison tient essentiellement à ce que je ne souhaite pas positionner les chaînes dans le code (exceptions faites d’un fichier ‘ressource’ associé). En effet, les chaînes ne sont pas produite par le développeur ni pour le français, ni pour les traductions.
    Pour ma part, je préfère avoir des chaînes qui ont du sens plutôt que des ids :
    - Déjà, en mode dégradé, quand des ressources manquent, l'utilisateur se retrouve quand même à pouvoir à peu près utiliser le programme
    - Surtout, ça rend le code plus compréhensible pour le développeur, qui préfèrera probablement écrire (et relire) un truc genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cout << format(_("Error: file %0% not found in folder %1%") % fileName % filePath));
    Que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cout << format(_("ID1425") % fileName % filePath));
    Après on est d'accord que le langage utilisé par le développeur n'est ni l'anglais, ni le français, mais un langage interne compréhensible par lui.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  4. #4
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Citation Envoyé par JolyLoic Voir le message
    Pour ma part, je préfère avoir des chaînes qui ont du sens plutôt que des ids :
    En fait, l'interface est faite pour l'utilisateur et pas le programmeur, donc moi je suis plus partisan d'avoir des IDs dans le code et des chaînes dans un fichier dédié. D'ailleurs, dans les différentes missions que j'ai pu effectuées, ces libellés sont fixés par des équipes extérieures au dev (car un développeur fait des interfaces... de développeurs).


    Citation Envoyé par Sylvain Togni Voir le message
    1er question, ton appli a t'elle une GUI. Si oui il est fort probable que la biblio utilisée pour faire la GUI possède un mécanisme de gestion des catalogues qu'il serait dommage de ne pas utiliser.
    Oui, mais non ... Enfin presque. J'utilise wxWidget et ils se basent sur gettext.

    Citation Envoyé par Sylvain Togni Voir le message
    Sinon, il n'y a rien en standard dans le C++ qui puisse faire cela. std::local n'a pas de gestion de catalogues, elle sert juste à changer le comportement des fonctions standards, comme le formatage des nombres "1.2" en anglais, "1,2" en français, ...
    En fait, j'ai trouvé dans la doc sur std::local, la facette std::message qui normalement permet de gérer des catalogues. Mais je n'arrive pas à avoir d'info plus précise.

    Citation Envoyé par Sylvain Togni Voir le message
    Mais gettext me semble plus puissant que tu semble le croire. Il peut s'utiliser de la même façon que LoadString, par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::cout << _("MESSAGE1");
    avec ensuite un fichier .po pour l'anglais contenant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    msgid "MESSAGE1"
    msgstr "Hello, World!"
    et un fichier .po pour le français contenant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    msgid "MESSAGE1"
    msgstr "Bonjour tout le monde !"
    C'est un peu l'impression que j'avais. Cependant, il y a un mécanisme que je n'arrive pas à saisir. J'ai cru comprendre que par défaut les chaines étant dans une langue donnée (mettons l'anglais) et qu'ensuite on fournissait des catalogues (.po/.mo) pour chacune des autres langues. Donc, ma question, si je configure mon appli en anglais, prend-il les chaînes dans le code ou charge-t-il un catalogue anglais?

  5. #5
    Membre éclairé

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    717
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 717
    Points : 858
    Points
    858
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    J'ai cru comprendre que par défaut les chaines étant dans une langue donnée (mettons l'anglais) et qu'ensuite on fournissait des catalogues (.po/.mo) pour chacune des autres langues. Donc, ma question, si je configure mon appli en anglais, prend-il les chaînes dans le code ou charge-t-il un catalogue anglais?
    gettext charge le catalogue demandé. Si il ne le trouve pas, il utilise les chaines dans le code. Il ne traite pas l'anglais plus spécifiquement qu'une autre langue.

  6. #6
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    En fait, l'interface est faite pour l'utilisateur et pas le programmeur, donc moi je suis plus partisan d'avoir des IDs dans le code et des chaînes dans un fichier dédié. D'ailleurs, dans les différentes missions que j'ai pu effectuées, ces libellés sont fixés par des équipes extérieures au dev (car un développeur fait des interfaces... de développeurs).
    Je n'ai jamais dit le contraire. J'ai juste dit que je préférais que ces IDs soient des choses qui aient du sens pour le développeur, plus qu'un numéro imbittable. Dans mon exemple, rien n'empêche qu'il y ait une traduction langue de dev => anglais :
    "Error: file %0% not found in folder %1%" => "Error: the file %0% can not be found in folder '%1%'"

    Avoue que dans ce cas, une inversion des %1% et %0% a moins de chance de se produire, côté code ou côté traducteur, que si l'ID était u simple numéro, non ?
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  7. #7
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Citation Envoyé par JolyLoic Voir le message
    Je n'ai jamais dit le contraire. J'ai juste dit que je préférais que ces IDs soient des choses qui aient du sens pour le développeur, plus qu'un numéro imbittable. Dans mon exemple, rien n'empêche qu'il y ait une traduction langue de dev => anglais :
    "Error: file %0% not found in folder %1%" => "Error: the file %0% can not be found in folder '%1%'"

    Avoue que dans ce cas, une inversion des %1% et %0% a moins de chance de se produire, côté code ou côté traducteur, que si l'ID était u simple numéro, non ?
    J'ai peur qu'on parte sur un troll

    Merci pour les infos sur gettext.
    Donc, je vais partir avec gettext (espérons que dans deux mois, je ne regrette pas ce choix...)
    Par contre, j'ai téléchargé gettext, et là Je ne sais même par par où commencer pour générer les outils pour Windows, quelle procédure suivre pour l'utiliser, etc... Savez-vous où je peux trouver de la doc (dans l'idéal en français), là dessus, et spécialement pour des plateformes de dev en windows?

  8. #8
    Membre éclairé

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    717
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 717
    Points : 858
    Points
    858
    Par défaut
    En fait avec wxWidgets c'est très simple tu n'a même pas besoin d'utiliser directement gettext.

    1) Tu enveloppe toutes les chaine à localiser par _("...") dans le code
    2) Tu utilise poEdit, c'est un logiciel qui extrait toutes les chaines automatiquement, offre une interface pour les traduire et compile les fichiers catalogues .mo
    3) Dans ton wxApp tu rajoute un membre wxLocale puis dans la fonction OnInit()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    myLocale.Init(wxLANGUAGE_DEFAULT, 0); // par exemple, pour charger le catalogue correspondant à la langue de l'OS
    myLocale.AddCatalog(_T("wx")); // catalogue des chaines wxWidgets
    myLocale.AddCatalog(GetAppName()); // catalogue de l'application
    4) Et enfin tu place les fichiers catalogues wx.mo et <app-name>.mo dans le répertoire correspondant à la langue, par exemple dans "fr" pour le français, à côté de l'exécutable.

  9. #9
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    De toute maniere, la localisation d'interface c'est pas juste remplacer un texte par un autre...
    Ca c'est la localisation de programme console !

    Une UI peut être entièrement différente en fonction de la langue... Ecriture de droite à gauche, inversions de champs pour correspondre aux usages "traditionels" (par exemple trois champs Année, Mois, Jour), etc, etc...
    Comme en HTML on a en général une boite de dialogue / page html par langue... Il y a même des cas ou c'est tout un flow qui peut changer.

    Maintenant si il s'agit juste de gérer des messages texte... je ne sais pas comment fonctionne wxWidget, mais il n'y a pas que la langue qui compte... le pays aussi... et même le code région....
    po_PO != po_BR
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 0
    Dernier message: 06/12/2013, 09h12
  2. gettext I18n et locale
    Par zevince dans le forum Langage
    Réponses: 0
    Dernier message: 16/11/2011, 22h08
  3. Support Gettext pour l'internationalisation
    Par Franck.H dans le forum GTK+ avec C & C++
    Réponses: 16
    Dernier message: 22/07/2007, 18h15
  4. [Internationalisation] Local ID
    Par Neilos dans le forum C++Builder
    Réponses: 2
    Dernier message: 28/06/2005, 08h00

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo