Mehrere Pluralformen in gettext()

Lesezeit: 3 Minuten

Benutzeravatar von Atadj
Atadj

Siehe dieses Beispiel von _n(); Funktion (http://codex.wordpress.org/Function_Reference/_n):

sprintf( _n('%d comment.', '%d comments.', $number, 'text-domain'), $number );

auf Englisch:

1 Comment
2 Comments

In Sprachen wie Polnisch gibt es ein anderes Muster und mehrere Pluralformen:

1 Komentarz
2 Komentarze
3 Komentarze
4 Komentarze
5 Komentarzy
6 Komentarzy
...
21 Komentarzy
22 Komentarze
23 Komentarze
24 Komentarze
25 Komentarzy
...
31 Komentarzy
32 Komentarze
...
91 Komentarzy
92 Komentarze
...
111 Komentarzy
112 Komentarzy (!)
...
121 Komentarzy
122 Komentarze

Ich suche nach einer Möglichkeit, Übersetzern zu ermöglichen, ihr eigenes Muster festzulegen, wenn ihre Sprache mehrere Pluralformen unterstützt. Können Sie sich einen kreativen PHP-Ansatz vorstellen, um dies zu tun?

Eine Lösung, die mir einfällt (aber Übersetzer können immer noch kein Muster festlegen):

if($number == 1){
    $message = __(‘1 Komentarz’ , ‘text-domain’);
}else if($number == 2){
    $message = __(‘2 Komentarze’ , ‘text-domain’);
}else if($number == 3){
    $message = __(‘3 Komentarze’ , ‘text-domain’);
}

BEARBEITEN: Ich habe das in der PO-Datei für Polnisch gefunden: "Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" aber ich verstehe immer noch nicht, wie ich mich vorbereiten soll _n(); Funktion, dies zu unterstützen.

akkys Benutzeravatar
okay

Erstens muss Ihre Locale-Datei die Definition von Plural haben. Wie Sie die Frage hinzugefügt haben, können Sie im polnischen Fall sehen

"Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"

oder eine ähnliche Definition in der Datei (domain_name)-pl.po.

Dann müssen Sie die Übersetzung für “%d Kommentar”/”%d Kommentare” in der .po-Datei vorbereiten. Zum Beispiel,

msgid "%d Comment"
msgid_plural "%d Comments"
msgstr[0] "%d Komentarz"
msgstr[1] "%d Komentarze"
msgstr[2] "%d Komentarzy"

Bitte kompilieren Sie die .po-Datei in eine .mo-Datei und legen Sie sie in einem geeigneten Ordner ab. (zB Sprachen/(Domänenname)-pl.mo

In Ihrem WordPress-Code (Plugin/Theme, nehme ich an) können Sie ihn so nennen:

for ($i=1;$i<15;$i++) {
  printf(_n("%d Comment", "%d Comments", $i, "(domain_name)"), $i);echo "<br />";
}
printf(_n("%d Comment", "%d Comments", 112, "(domain_name)"), 112);echo "<br />";

dann setze natürlich das Gebietsschema von WordPress auf Polnisch, in wp-config.php,

define ('WPLANG', 'pl');

Sie sollten die Ergebnisse mit korrekten Pluralformen sehen.

  • Ihre Antwort ist größtenteils richtig (außer dass Sie for() nicht benötigen – es funktioniert nur mit just _n(); auch wenn es theoretisch nur zwei Pluralformen unterstützt). Ich habe es gestern herausgefunden 🙂 Danke!

    – Atadj

    26. August 2012 um 15:11 Uhr

  • Die for-Schleife dient nur dazu, die generierten Texte mit mehr Zahlen anzuzeigen.

    – Okay

    12. November 2012 um 6:45 Uhr

  • Könntest du erklären "Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" ein bisschen mehr? Ist das Teil von babel.cfg (in flasche_babel)? Oder die Pot-Datei? Die po-Datei?

    – Martin Thoma

    11. August 2019 um 19:54 Uhr

  • Es befindet sich in einer .po-Datei, die in eine .mo-Datei konvertiert werden soll, dann verwendet gettext die Definition.

    – Okay

    12. August 2019 um 22:57 Uhr

Ich glaube, ich habe einen Weg gefunden, das zu tun, was ich will. Mit der POEdit-Anwendung können Sie mehrere Pluralformen erstellen, indem Sie das Muster verwenden, das Sie in den Einstellungen angeben können.

Der Übersetzer muss das Muster selbst codieren (siehe Muster für Polnisch in meiner Frage). Ich recherchiere immer noch zu diesem Thema, aber wenn jemand ähnliche Fragen hat, ist dies ein guter Anfang: http://www.poedit.net/trac/wiki/Doc/PluralForms

1402490cookie-checkMehrere Pluralformen in gettext()

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy