Oblici množine (plural forms)

Oblici množine su način na koji određeni jezik menja nabrojive imenice.
Pogledajmo to na primeru brojanja ovaca:

1 ovca
2 ovce
3 ovce
4 ovce
5 ovaca

Slovenski jezici uglavnom imaju 3 oblika množine, u našem slučaju to su: ovca, ovce, ovaca

Engleski sa druge strane ima samo 2 oblika množine
tj. u engleskom se množina pravi tako što se doda s na kraju reči

Opet postoje jezici koji uopšte nemaju množinu, recimo Kineski
ili jezici koji imaju 5 oblika množine - Irski

Pogledajmo sad kako se to odnosi na programiranje,
tipičan englez bi ovako napisao kod:

printf ("%d sheep%s counted", n, n == 1 ? "" : "s");

Ali šta da se radi kad treba prevesti na neki drugi jezik koje ne pravi množinu
tako što dodaje s na kraj reči:

if (n == 1)
printf ("%d sheep counted", n);
else
printf ("%d sheeps counted", n);

Ovo izgleda bolje ali opet rešava problem samo za jezike koji imaju 2 oblika množine, šta će mo sa svima ostalima?
A pored toga reći će neko ko zna englesku gramatiku malo bolje:
sheeps nije pravilno, ovca u engleskom ima nepravilan oblik množine:
http://wiki.answers.com/Q/What_is_the_plural_noun_of_sheep

Dakle postoje 2 problema koje treba rešiti:
1. Neki jezici imaju nepravilne oblike množine za neke imenice!
2. Broj oblika množine se razlikuje od jezika do jezika.

Posledica ovoga je da se ovo ne može rešiti u kodu.
Ovo se rešava tako što se koristi više stringova za prevod iste reči koja sadrži numeričku promenljivu.
A ta promenljiva se predaje kao parametar funkciji za prevod:


printf (t("%d sheeps counted", n), n);

Onda funkcija za prevod nađe formulu množine za dati jezik i iskoristi je da odabere jedan od više stringova koji ste uključili za prevod.

Evo kako bi izgledao naš .po fajl koji pravilno rešava ovaj problem:


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

msgid "%d sheep counted"
msgid_plural "%d sheeps counted"
msgstr[0] "%d ovca izbrojana"
msgstr[1] "%d ovce izbrojane"
msgstr[2] "%d ovaca izbrojano"

nplurals je broj oblika množine
plural je formula kojom se određuje koji oblik množine se koristi.
Za srpski ta formula glasi: specijalni oblik za brojeve koji se završavaju na 1, specijalni oblik za brojeve koji se završavaju na 2,3,4 sem ako se završavaju na 11, 12, 13, 14

1 ovca
2-4 ovce
5-20 ovaca (uključuje 11-14)
21 ovca
22-24 ovce
25-30 ovaca
31 ovca
32-34 ovce
35-40 ovaca

zajebano zar ne?
plural=((((n%10)==1)&&((n%100)!=11))?(0):(((((n%10)>=2)&&((n%10)<=4))&&(((n%100)<10)||((n%100)>=20)))?(1):2));\n"

engleski je mnogo prostiji, ako je 1 onda je jednina inače je množina.
plural=(n != 1)

OBRATITE PAŽNJU:
msgstr[0] "%d ovca izbrojana"
msgstr[1] "%d ovce izbrojane"
msgstr[2] "%d ovaca izbrojano"

u .po fajlu indexi počinju od nule ali
[0] se odnosi na brojanje sa 1 (ovca)
[1] se odnosi na brojanje sa 2 (ovce) u stvari (2-4) i sl.
[2] se odnosi na sve ostale slučajeve (ovaca)

Ako vas zanima ovde možete pogledati oblike množine za sve jezike:
http://translate.sourceforge.net/wiki/l10n/pluralforms

U drupal stringovima promenljive počinju sa @, !, i %
ili su uokvirene u vitičaste zagrade {}

Dakle kada vidite stvari tipa: @user, !class, %foo, {stuff}, {stuff}.open
nemojte ih prevoditi, to su promenljive.
"!user logged out" => "!user se izlogovao"

Ako naiđete na numeričku promenljivu prevedite string u sva 3 oblika množine.
"Deleted @count files" => "Obrisan @count fajl" + "Obrisano @count fajla" + "Obrisano @count fajlova"

Ovo je korisno zapamtiti kao pravilo 125:
1 ovca
2 ovce
5 ovaca