Domanda

completa C ++ i18n gettext () esempio “ciao mondo” ha il codice C ++ che funziona per una semplice stringa fissa. Ora sto cercando un programma di esempio che funziona con plurali. Questo codice di esempio mostra sei linee. Solo uno è corretto in inglese. Essa non gestisce correttamente i plurali.

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 () per le forme plurali descrive vari modi che le lingue gestiscono plurali per esempio:

  • Coreano - non pluals
  • Inglese - due forme, singolare utilizzato per una sola
  • Francese - due forme, singolare utilizzato per zero e uno
  • Polish - tre forme, caso speciale per uno e alcuni numeri che terminano con 2, 3 o 4

La mia aspettativa è che il codice sarà in grado di lavorare (dato cataloghi di messaggi) specifico per tutti i casi di cui sopra e molti altri varianti non elencate qui. L'uscita corretta quando viene eseguita con l'inglese potrebbe essere:

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.
È stato utile?

Soluzione

Non sono sicuro di ciò che si desidera. Se è leggera modifica del vostro esempio che danno l'output desiderato, basta sostituire la linea printf da

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

, ma in quanto è una modifica banale di risposta di svolgimento e la documentazione gettext ha l'esempio molto simile,

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

Mi chiedo se è veramente quello che volevi. Se si desidera utilizzare gettext con una sintassi più C ++, si dovrà cercare librerie come Boost :: Format.

Altri suggerimenti

In primo luogo, gettext() non è magico. Non ha in qualche modo contiene un dizionario globale di tutte le parole in tutte le lingue.

Tutto ciò che fa è cercare di traduzione di un messaggio nel database dei messaggi della propria applicazione, in modo da questo esempio presuppone c'è un tale file (dove gettext() può trovarlo, questo può essere un po 'difficile).

Avanti, lo si usa male. La pagina si è collegato al descrive la funzione ngettext(), che è quello che si sta andando ad avere per utilizzare al fine di ottenere una traduzione che varia con un conteggio.

La chiamata dovrebbe essere simile a questo:

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

In questo modo gettext decidere il modulo da utilizzare, in base al parametro count.

Bene hai effettivamente fare un file .po per le diverse forme plurali? Vedere la del flusso di lavoro gettext su Wikipedia . Anche a leggere le tutti di gettxt documentazione su forme plurali in particolare gli esempi di file .po contengono forme plurali.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top