C
hustbaer schrieb:
Christoph schrieb:
Gerade das mit den vielen polnischen Pluralformen habe ich schon selbst erlebt. Daher meine Frage zu Singular/Plural. Die Annahme, dass es nur die zwei Formen Singular/Plural gibt, ist eben auch sehr deutsch- oder englisch-zentriert.
Aber wie macht man es sonst?
Dann muss der Übersetzer ja pro ID mehrere Texte eintragen können, und diese mit bestimmten Bedingungen verknüpfen ...?
[...]
Gibt es für so ein System (das mehrere Übersetzungen pro ID erlaubt) irgendeinen Standard (oder mehrere)?
Ich kenn nur gettext. Dort funktioniert das so, dass die Datei mit den übersetzten Strings, d.h. die po-Datei, selber definieren kann wie die Plural-Formen selektiert werden.
In der po-Datei steht dann ganz oben zum Beispiel sowas, wenn es um polnisch geht:
"Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
Diesen Ausdruck muss der Übersetzer aber nicht selber erfinden. Für praktisch jede Sprache kann man die passende Zeile einfach aus einer Liste kopieren.
Eine übersetzte Nachricht in der po-Datei sieht dann so aus:
msgid "%d stroke."
msgid_plural "%d strokes."
msgstr[0] "%d kreska."
msgstr[1] "%d kreski."
msgstr[2] "%d kresek."
Im Programm-Code kann man dann ngettext("%d stroke.", "%d strokes.", number_of_strokes) aufrufen, um den übersetzten Text zu bekommen. Abhängig von number_of_strokes wird jeweils die passende Pluralform aus den 3 möglichen Formen ausgewählt. Die zwei message-ids sind notwendig, damit in der C-locale, in der Übersetzungen ignoriert werden, auch irgendwas sinnvolles herauskommt.
gettext kann normalerweise aus dem Quelltext ein Template für die po-Dateien erzeugen, das ist dann eine pot-Datei. Da steht dann sowas drin:
msgid "%d stroke."
msgid_plural "%d strokes."
msgstr[0] ""
msgstr[1] ""
Damit kann der Übersetzer schwer übersehen, dass an der Stelle Pluralformen benötigt werden. Für polnisch muss er aber eben wissen, dass er msgstr[2] manuell hinzufügen muss.
Dieses Verfahren von gettext funktioniert aber halt gar nicht mehr, wenn man mehr als ein Objekt korrekt zählen möchte im String.
edit: Was noch dazukommt ist, dass "0" im Deutschen als Plural zählt und nicht als Singular. Man sagt "0 Dateien" und nicht "0 Datei". In anderen Sprachen wird "0" als Singular gezählt, d.h. genauso wie "1". Das passiert auch in Sprachen, die nur Singular/Plural unterscheiden. Das heißt selbst wenn es nur die beiden Formen Singular/Plural gibt, ist eine Unterscheidung der Art if(n == 1) singular(); else plural(); nicht richtig.
edit2: Die Doku von gettext hat einen guten Artikel über das Thema, mit vielen Beispielen:
http://www.gnu.org/s/hello/manual/gettext/Plural-forms.html