Pluralizace již používaného slova (množné číslo)

108 views
Skip to first unread message

PavelZet

unread,
Feb 5, 2018, 12:27:15 PM2/5/18
to django-cs
V Djangu používám pro překlady běžně
django.utils.translation.gettext

generuji slovník pomocí skriptu makemessages a přeložím konstrukci:
msgid "human"
msgstr
"člověk"

zkompiluji skriptem compilemessages

a v template volám přes
{% load i18n %}
{% trans "human" %}

...dosud je vše pořádku :)


Časem se potřebuji toto slovo také skloňovat do množných čísel podle počtu do třech tvarů, např. 1 "člověk", 2 "lidé", 5 "lidí"
Nabízí se mi pluralizace.

Pokud tedy v Djangu nově využiji
django.utils.translation.pgettext

vygeneruji slovník pomocí skriptu makemessages

tak dostanu k přeložení konstrukci
msgid "human"
msgstr
[0] "člověk"
msgstr
[1] "lidé"
msgstr
[2] "lidí"
Tato konstrukce s jedním msgid je generována společně pro všechna volání human přes gettext (resp. lang v template) i přes pgettext.
Na tom nevidím nic špatného a líbí se mi to.

Pokud ale nyní v template použiji jednoduchý překlad z gettext
{% load i18n %}
{% trans "human" %}

Tak překlad neproběhne :(

Předpokládal bych, že se pro gettext použije tvar msgstr[0], ale nepřeloží se nic.

Otázka: Opravdu musím všechny překlady tohoto slova VŠUDE dohledat a přepsat do pluralizované podoby? tedy z hezkého
{% trans "human" %}
Na ukecané
{% blocktrans count %} human {% plural %} human {% endblocktrans %}

Nebo lze řešit jiným vhodnějším způsobem?
V záloze mám překlady typu
msgid "human"
msgstr
"člověk"

msgid
"human2"
msgstr
"lidé"

msgid
"human5"
msgstr
"lidí"

ale moc se mi to nelíbí. Nerad bych překlady v Djangu uchopil špatně.

Díky moc za reakci.

MirekZv

unread,
Feb 14, 2018, 5:14:13 AM2/14/18
to django-cs
Nevím. Dokonce ani nevím, co je pgettext (během 2 vteřin jsem si přečetl, že umožňuje různé překlady v různých kontextech).
Jediné, co vím, že my používáme pro pluralizaci .ngettext.
To je ale v jiném projektu, než ve Djangu, takže k Django templatám neporadím (ale taky mě to zajímá).
Tipnul bych si ale, že přechod na ngettext by to mohl vyřešit (a ponechat staré .gettext překlady beze změny).



Dne pondělí 5. února 2018 18:27:15 UTC+1 PavelZet napsal(a):

PavelZet

unread,
Feb 14, 2018, 1:10:11 PM2/14/18
to django-cs
Díky za reakci.
asi jsem se upsal a měl jsem na mysli ngettext, díky za opravu.

Funkce překladu chápu takto (opravte mne prosím, zda chápu špatně):

gettext
 - nejjednodušší překlad textu 1:1 do jiného jazyka
 - tedy ze slovníku django.po podle msgid na msgstr
 - v template volám pěkné {% trans my_msgid %}
 - staré překlady jednotného čísla mohou zůstat zachovány
 - překlady množných čísel nutné připsat formou
msgid "human2"
msgstr "lidé"

msgid
"human5"
msgstr
"lidí"
 - ale v kódu .py a v templates pak musím ručně detekovat podle počtu, který z překladů použít :(

ngettext
 - přeloží text 1:2 do jiného jazyka dle jednotného nebo množného čísla
 - tedy ze slovníku django.po podle msgid na msgstr[0] (jednotné číslo) nebo msgstr[1] (množné číslo)
 - v template musím volat přes zdlouhavé {% blocktrans count %} my_msgid {% plural %} my_msgid {% endblocktrans %}
 - pro ang stačí, problém ale je např. čeština, která má často 3 tvary slova - jednotný "kus", množné pro 2-4 "kusy", množné pro 0 a 5+ "kusů"
 - ve slovníku django.po je možné v hlavičce nastavit plural form na 3 tvary podle počtu (tedy česká varianta)
 - lze pak generovat ve slovníku django.po 3 tvary překladu msgstr[0] a msgstr[1] a msgstr[2]. ale vysvětlujte překladatelce co který tvar znamená :/
 - staré překlady před pluralizací {% trans my_msgid %} se nepřeloží

pgettext
 - přeloží text 1:N do jiného jazyka dle významu
 - tedy ze slovníku django.po podle msgctxt (význam) a msgid na msgstr
 - v template volám pěkně {% trans my_msgid context "1" %}
 - za pomocí významu lze tak dosadit počet, ale nepřijde mi to správné
 - staré překlady před pluralizací {% trans my_msgid %} se nepřeloží :(

každá metoda překladu množného čísla nese své nedostatky
nejvýhodnější forma pluralizace pro češtinu mi v tuto chvíli připadá trojí použití gettext

nebo pomíjím vhodnější řešení?



Dne středa 14. února 2018 11:14:13 UTC+1 MirekZv napsal(a):
Reply all
Reply to author
Forward
0 new messages