Question

complète C ++ i18n gettext () « Bonjour tout le monde » exemple a le code C ++ qui fonctionne pour une simple chaîne fixe. Je cherche maintenant un exemple de programme qui fonctionne avec pluriels. Ce code d'exemple affiche six lignes. Un seul est correct en anglais. Il ne gère pas correctement les pluriels.

cat >helloplurals.cxx <<EOF
// hellopurals.cxx
#include <libintl.h>
#include <locale.h>
#include <iostream>
#include <stdio.h>
int main (){
    setlocale(LC_ALL, "");
    bindtextdomain("helloplurals", ".");
    textdomain( "helloplurals");
    for (int ii=0; ii<5; ii++)
        printf (gettext("Hello world with %d moon.\n"), ii);
}
EOF
g++ -o helloplurals helloplurals.cxx
./helloplurals

GNU gettext () pour les formes plurielles décrit diverses façons dont les langues traitent pluriels par exemple:

  • Corée - pas pluals
  • anglais - deux formes, utilisé singulier pour un seul
  • Français - deux formes, singulier utilisé pour zéro et un
  • polonais - trois formes, cas particulier pour l'un et certains numéros se terminant par 2, 3 ou 4

Mon attente est que le code sera en mesure de travailler (données catalogues de messages) spécialement pour tous les cas ci-dessus et plusieurs variantes plus qui ne figurent pas ici. La sortie correcte lorsqu'elle est exécutée avec l'anglais serait:

Hello world with 0 moons.
Hello world with 1 moon.
Hello world with 2 moons.
Hello world with 3 moons.
Hello world with 4 moons.
Était-ce utile?

La solution

Je ne sais pas ce que vous voulez. Si elle est légère modification de votre exemple qui donnent à votre sortie désirée, il suffit de remplacer la ligne printf par

printf(ngettext("Hello world with %d moon\n", "Hello world with %d moons\n", ii), ii);

mais comme il est une modification triviale de la réponse de déroulage et la documentation de gettext a l'exemple très similaire,

printf (ngettext ("%d file removed", "%d files removed", n), n);

Je me demande s'il est vraiment ce que vous vouliez. Si vous souhaitez utiliser gettext avec une syntaxe plus C ++, vous devrez rechercher des bibliothèques comme Boost :: Format.

Autres conseils

D'abord, gettext() n'est pas magique. Il ne contient pas en quelque sorte un dictionnaire global de tous les mots dans toutes les langues.

Tout ce qu'il fait est de regarder jusqu'à la traduction d'un message dans la base de données de messages de votre application, de sorte que cet exemple suppose qu'il existe un tel fichier (où gettext() peut le trouver, cela peut être un peu délicat).

Ensuite, vous utilisez mal. La page que vous lié à la fonction décrit ngettext(), qui est ce que vous allez devoir utiliser afin d'obtenir une traduction qui varie avec un compte.

Votre appel devrait ressembler à ceci:

printf("%s", ngettext("moon", "moons", ii));

Cela permet gettext décider quelle forme à utiliser, en fonction du paramètre de comptage.

Eh bien, vous avez fait en fait un fichier .po pour les différentes formes plurielles? Voir la du flux de travail de gettext sur Wikipedia . Lisez aussi tous de gettxt documentation sur les formes plurielles en particulier les exemples de fichiers .po contenant des formes plurielles.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top