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 :

printf, ordre des arguments, internationalisation


Sujet :

C

  1. #1
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Par défaut printf, ordre des arguments, internationalisation
    Dans une autre discussion, Emmanuel Delahaye me faisait remarquer que le format "m$" de printf n'est pas standard.

    Pour info pour ceux qui ne connaissent pas, "m$" permet, quand printf le supporte, de numéroter les arguments, de sorte qu'il n'est nécessaire de les passer dans l'ordre exact où ils apparaissent dans la chaine de format. Ainsi pour dire qu'on a une voiture verte on peut faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("I have a %2$s %1$s\n", object, color);
    Un des intérets majeurs est qu'on peut peut ainsi résister à une traduction qui changerait l'ordre des mots. Dans un programme internationalisé, on aurait par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf(gettext("I have a %1$s %2$s\n"), color, object);
    En français le message serait traduit en "J'ai une %2$s %1$s\n", qui afficherait bien "J'ai une voiture verte", et pas "J'ai une verte voiture".

    Mais, puisque les "m$" ne sont pas standards, comment fait-on si on tient à produire du code portable ? Est-ce qu'il y a un autre mécanisme qui permet de passer les arguments dans le désordre à printf, ou est-on condamné à traduire les messages en conservant l'ordre des arguments ?

  2. #2
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Par défaut
    Pendant que j'ouvrais ce sujet on m'a répondu dans le thread original, dont voici le lien : http://www.developpez.net/forums/d63...aine-formatee/

  3. #3
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    tu pourrais lire ce thread :

    http://www.developpez.net/forums/d29...r-application/

    J'y expose ma manière de faire
    http://www.developpez.net/forums/m1852358-8/

    Comme la fonction GetString retourne un pointeur, si tu construis une phrase qui a une certaine syntaxe mais dont la syntaxe change suivant la langue, tu peux faire un autre ID pour le format de la syntaxe de cette phrase, et t'en sortir comme ceci.

    Mais la plupart du temps, un découpage idoine des sous-chaînes suffit.

    Ensuite, avec les remarques mises dans ton autre threa, tu peux aussi tenir compte des différents types de langues...

  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
    Par défaut
    Dans mon expérience, il s'est systématiquement avéré plus judicieux d'utiliser des chaînes spécifiques pour chacune des langues plutôt que d'essayer de les reconstruire dans le code. Ca ne répond pas directement à ta question, mais ca peut être une solution à un problème d'internationalisation. Ensuite, il faut jongler un peu. Ainsi, au lieu de vouloir dire 'ma XX est de couleur YY', on cherche à s'orienter sur des forumations différentes: 'Propriété couleur de XX: YY'. Ca peut faire des phrases moins riches mais beaucoup, beaucoup, beaucoup moins de soucis à faire traduire. (Idem pour les gestions pluriels/singuliers).

  5. #5
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Par défaut
    Oui bien sûr, mon exemple c'était pour faire simple. Il faut autant que possible traduire des phrases complètes. Mais il y a toujours des cas où certains éléments de la phrase ne sont pas connus à la compilation. Effectivement on peut en général s'en sortir à coups de deux points suivits du truc variable.

    Néamoins ma question était plus générale, et ne se pose pas que pour l'internationalisation des messages. Je voulais juste savoir s'il y avait un moyen standard d'utiliser les arguments dans un ordre autre que celui du format, et apparement la réponse est non.

    La notation "n$" est bien pratique aussi pour n'avoir à passer qu'un fois un paramètre qui doit apparaitre plusieurs fois dans le message. Par exemple, pour afficher un chaine qui n'est pas terminée par un 0, ainsi que la longueur de la chaine, on peut faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("str=%2$.*1$s len=%1$d\n", len, str);
    Qui est plus maintenable que la solution sans $, qui nécessite de répéter un argument :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("str=%.*s len=%d\n", len, str, len);

Discussions similaires

  1. Passage des arguments pour printf
    Par Missa dans le forum C
    Réponses: 8
    Dernier message: 01/09/2009, 13h40
  2. Modifier l'ordre des cartes son
    Par YéTeeh dans le forum Matériel
    Réponses: 3
    Dernier message: 19/08/2003, 01h13
  3. Ordre des champs dans une table
    Par patapetz dans le forum Outils
    Réponses: 5
    Dernier message: 30/07/2003, 06h53
  4. Réponses: 9
    Dernier message: 29/07/2003, 14h41
  5. Question : ordre des bits ?
    Par Choupi dans le forum C
    Réponses: 3
    Dernier message: 11/02/2003, 06h22

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