Plural-Forms Syntax verstehen

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
buhtz
Beiträge: 1106
Registriert: 04.12.2015 17:54:49
Kontaktdaten:

Plural-Forms Syntax verstehen

Beitrag von buhtz » 28.07.2023 10:49:54

Ich versuche im Kontext von Debiangettext die Syntax der "Plural-Forms" Header Zeile in den po-Files zu durchdringen.
Trotz vieler Beispiele im Web und auch der GNU gettext docu, komme ich aber nicht so ganz dahinter.
Eine Vielzahl von Beispielen ist hier zu finden: https://docs.translatehouse.org/project ... forms.html

Hier mal als Beispiele Englisch, Deutsch, Slowenisch und Arabisch, wobei selbst die beiden ersten eigentlich einfachen Formen sich mir nicht im Detail erschließen. Bin nicht mal sicher, was hier der Feldtrenner zwischen den Varianten ist. Und Slowenisch hat auch noch Klammern dabei.

Code: Alles auswählen

Plural-Forms: nplurals=2; plural=n != 1;
Plural-Forms: nplurals=2; plural=(n != 1);
Plural-Forms: nplurals=4; plural=(n%100==1 ? 1 : n%100==2 ? 2 : n%100==3 || n%100==4 ? 3 : 0)
Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 ? 4 : 5;
Debian 11 & 12; Desktop-PC, Headless-NAS, Raspberry Pi 4
Teil des Upstream Betreuer Teams von Back In Time (Debianbackintime)

chrbr
Beiträge: 551
Registriert: 29.10.2022 15:53:26

Re: Plural-Forms Syntax verstehen

Beitrag von chrbr » 28.07.2023 11:40:15

Hast du in der gettext Dokumentation nach "Plural-Froms" gesucht?
Dort wird das in etwa in der Mitte vom html File beschrieben:
https://www.gnu.org/savannah-checkouts/ ... ttext.html
Der Bereich beginnt mit

Code: Alles auswählen

The following rules are known at this point. The language with families are listed. 
But this does not necessarily mean the information can be generalized for the 
whole family (as can be easily seen in the table below).5 ....

Benutzeravatar
Meillo
Moderator
Beiträge: 8818
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Plural-Forms Syntax verstehen

Beitrag von Meillo » 28.07.2023 12:34:34

buhtz hat geschrieben: ↑ zum Beitrag ↑
28.07.2023 10:49:54

Code: Alles auswählen

Plural-Forms: nplurals=2; plural=n != 1;
Plural-Forms: nplurals=2; plural=(n != 1);
Plural-Forms: nplurals=4; plural=(n%100==1 ? 1 : n%100==2 ? 2 : n%100==3 || n%100==4 ? 3 : 0)
Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 ? 4 : 5;
So wie ich mir das aus den geposteten Antweisungen erklaere:

`nplurals' gibt an, wie viele verschiedene Pluralformen es gibt. Im Englischen und Deutschen gibt es zwei, naemlich Singular und Plural. Im Slowenischen sind es vier.

Die Formel hinter `plural=' berechnet anhand einer Zahl `n' welche Pluralform zu verwenden ist. Ist das Ergebnis 0, so ist die Singularform zu verwenden. Ist das Ergebnis 1, dann die erste Pluralform, usw. Im Englischen und Deutschen ist es einfach: Wenn ein Ding ist, dann nehmen wir Singular und sonst Plural. Im Slowenischen wird fuer 101, 201 und so wohl ein anderer Plural verwendet als fuer 91 beispielsweise.

(Ich habe jedoch nicht in die Doku geschaut, sondern das Dateiformat nur bestmoeglich zu reverse-engineren versucht. 8)


Btw: Ist es im Deutschen ``101 Häuser'' oder ``101 Haus''? ;-)
Use ed once in a while!

buhtz
Beiträge: 1106
Registriert: 04.12.2015 17:54:49
Kontaktdaten:

Re: Plural-Forms Syntax verstehen

Beitrag von buhtz » 28.07.2023 14:44:34

chrbr hat geschrieben: ↑ zum Beitrag ↑
28.07.2023 11:40:15
Hast du in der gettext Dokumentation nach "Plural-Froms" gesucht?
Ja, es gibt zwei Sektionen dazu.
https://www.gnu.org/savannah-checkouts/ ... ural-forms
https://www.gnu.org/savannah-checkouts/ ... ural-forms
chrbr hat geschrieben: ↑ zum Beitrag ↑
28.07.2023 11:40:15
Dort wird das in etwa in der Mitte vom html File beschrieben:
Der Bereich beginnt mit

Code: Alles auswählen

The following rules are known at this point.....
Ich mag mich etwas blöd anstellen, aber die Stellen helfen mir nicht beim Verständnis. Es fängt spätestens bei "Three forms, special case for zero" an unklar zu werden. "%100"? Doppelpunkte, Semikolons, Leerzeichen, Fragezeichen? Ich kapiere es echt nicht. Sorry.
Meillo hat geschrieben: ↑ zum Beitrag ↑
28.07.2023 12:34:34
Die Formel hinter `plural=' ...
Aber wo hört die eine Formel auf und fängt die andere an? Was ist der Feld-/Formeltrenner, wenn es 2 oder mehr Plural-Formen gibt?
Debian 11 & 12; Desktop-PC, Headless-NAS, Raspberry Pi 4
Teil des Upstream Betreuer Teams von Back In Time (Debianbackintime)

chrbr
Beiträge: 551
Registriert: 29.10.2022 15:53:26

Re: Plural-Forms Syntax verstehen

Beitrag von chrbr » 28.07.2023 17:10:31

Das sieht wirklich wirr aus. Als Beispiel:

Code: Alles auswählen

Plural-Forms: nplurals=3; \
    plural=n==1 ? 0 : \
           n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;
Das sieht mir etwas nach C-Code im Guru Stil aus. Das "?" steht für eine if Abfrage. Der Doppelpunkt könnte für den "else" Zweig stehen. Das "%" Zeichen ist der Modulo Operator. Zum Beispiel wäre der Teil

Code: Alles auswählen

n%10>=2 && n%10<=4
wahr für alle n mit der Einerstelle 2, 3 oder 4. So wie ich das verstehe ist
  • plural=0 für n=1
  • plural=1 für n mit Einerstelle 2, 3, 4 und n<10 oder n>20
  • plural=2 für alle anderen Fälle
Ein C Experte wird das hoffentlich korrigieren wenn das falsch ist.

Benutzeravatar
Meillo
Moderator
Beiträge: 8818
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Plural-Forms Syntax verstehen

Beitrag von Meillo » 28.07.2023 17:31:40

chrbr hat geschrieben: ↑ zum Beitrag ↑
28.07.2023 17:10:31
Das sieht wirklich wirr aus. Als Beispiel:

Code: Alles auswählen

Plural-Forms: nplurals=3; \
    plural=n==1 ? 0 : \
           n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;
Das sieht mir etwas nach C-Code im Guru Stil aus. Das "?" steht für eine if Abfrage. Der Doppelpunkt könnte für den "else" Zweig stehen. Das "%" Zeichen ist der Modulo Operator.
Ja, das ist ein C-Ausdruck.

Hier mal etwas umformatiert:

Code: Alles auswählen

n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2

if (n == 1) {
	return 0;
} else if (n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20)) {
	return 1;
} else {
	return 2;
}
`n % 10' ergibt den Rest wenn man `n' durch 10 teilt. Im Falle von n=27 ist der Ausdruck also 7.

`n % 100' ist das gleiche wenn man durch 100 teilt. Im Falle von n=27 ist es 27 und bei n=1863 ist es 63.

Falls du mit C gar nicht vertraut bist: `&&' bedeutet logisches UND, und `||' bedeutet logisches ODER.
chrbr hat geschrieben: ↑ zum Beitrag ↑
28.07.2023 17:10:31
Ein C Experte wird das hoffentlich korrigieren wenn das falsch ist.
Ich habe keinen Fehler gesehen.
Use ed once in a while!

Antworten