Frage

komplette C ++ i18n gettext () „Hallo Welt“ -Beispiel hat C ++ Code, der für einen einfachen festen String funktioniert. Ich suche jetzt ein Beispielprogramm, das mit Pluralen funktioniert. Dieses Beispiel Code zeigt sechs Linien. Nur ein korrekt auf Englisch. Es ist nicht die Plurale korrekt verarbeiten.

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 () für Pluralformen verschiedene Art und Weise beschrieben, die Sprachen verarbeiten Plurale zum Beispiel:

  • Koreanisch - kein pluals
  • Englisch - zwei Formen, Einzahl verwendet nur für einen
  • Französisch - zwei Formen, Einzahl verwendet für null und eins
  • Polnisch - drei Formen, Sonderfall für ein und einige Zahlen in 2 endet, 3 oder 4

Meine Erwartung ist, dass der Code in der Lage sein wird (gegeben Nachrichtenkataloge) zu arbeiten, die speziell für alle oben genannten Fälle und mehrere weitere Variationen hier nicht aufgeführt. Die richtige Ausgabe, wenn es mit Englisch ausgeführt wird, wäre:

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.
War es hilfreich?

Lösung

Ich bin nicht sicher, was Sie wollen. Wenn es leichte Modifikation von Ihrem Beispiel ist, dass Ihre gewünschte Ausgabe geben, ersetzen Sie einfach die printf Zeile

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

aber wie es ist eine triviale Änderung der Antwort der Abwickler und die gettext Dokumentation hat das sehr ähnlich Beispiel:

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

Ich frage mich, ob es wirklich das, was Sie wollten. Wenn Sie mit einer C ++ Syntax verwenden gettext möchten, müssen Sie für Bibliotheken wie boost :: Format suchen.

Andere Tipps

Als erstes ist gettext() nicht magisch. Es ist irgendwie kein globales Wörterbuch aller Wörter in allen Sprachen enthalten.

Alles, was es tut, ist eine Nachricht die Übersetzung in Ihrer Anwendung Nachrichtendatenbank nachschlagen, so dass dieses Beispiel wird angenommen, gibt es eine solche Datei (wo gettext() es finden kann, kann dies etwas schwierig sein).

Als nächst Sie verwenden es falsch. Die Seite, die Sie verknüpft beschreibt die ngettext() Funktion, das ist, was Sie haben, um zu verwenden werden, eine Übersetzung zu erhalten, die mit einer Zählung variiert.

Ihr Anruf soll wie folgt aussehen:

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

Auf diese Weise kann gettext entscheiden, welche Form zu verwenden, basierend auf dem Zähl-Parameter.

Nun hast du eigentlich eine .po-Datei für die verschiedenen Pluralformen machen? Finden Sie in der Beschreibung des gettext Workflow auf Wikipedia . Lesen Sie auch alle der die gettxt Dokumentation über Pluralformen die Beispiele von .po-Dateien mit Pluralformen im besonderen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top