Mirin webspace

Nejbohatší život má ten, kdo žije s minimem nároků

19. 8. 2009 Zend Framework

Množná čísla překladů

Základní věci pro překlady jsou v Zend Frameworku už dlouho - viz. jeden starší článek, teprve od Zend Frameworku 1.9.x je ale možné použít vestavěnou podporu množných čísel v překladech. Již poměrně dlouhou dobu se toto rozšíření schovávalo v inkubátoru a od verze 1.9. je konečně ve standard library. Mohl jsem tak opustit svůj ošklivý workaround pro množná čísla a použít standardní řešení. Nebylo to tak úplně pravda, použitelné to bylo až od verze 1.9.1, ale o tom později.

S uživatelského hlediska to je poměrně jednoduché. V manuálu se dočtete, jaké metody jsou pro podporu plurálů nově ve třídě Zend_Translate k dispozici a jak je použít. Také je napsáno, jak se máte zařídit pro různé translate adaptéry. Některé dokonce množná čísla ani nepodporují, no spíše je lepší říci, že menšina adaptérů množná čísla podporuje :-), podporované jsou adaptéry Array, CSV, Gettext.

Já od začátku používám gettext a to proto, že jeho skenovací utility přímo počítají s použitím gettextu v PHP. Jak ale dostat množná čísla do gettextu a potažmo do php aplikace založené na Zend Frameworku, to se už v manuálu nedočtete. Musíte mrknout do dokumentace gettextu.

Množná čísla v .po souborech

V gettextu to funguje tak, že v úvodní části .po souboru musíte mít uvedeno, jak se s množnými čísly bude zacházet a posléze si pro jednotlivé překládané fráze definujete jejich množná čísla. Vypadá to zhruba takto

..
..
"POT-Creation-Date: 2009-08-07 08:43-0400\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: koubel <koubel@volny.cz>\n"
"Language-Team: CS <koubel@volny.cz>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
...
...
#: ../../application/modules/blog/views/scripts/articleInList.phtml:29
#: ../../application/modules/blog/views/scripts/index/view-entry.phtml:77
msgid "comment"
msgid_plural "comments"
msgstr[0] "komentář"
msgstr[1] "komentáře"
msgstr[2] "komentářů"

Ta část za Plural-Forms nám říká, jak se bude s množnými čísly nakládat. Syntaxe je podobná céčkové (potažmo i PHP, tady byl asi pro Thomase Weidnera, autora Zend_Translate trochu zádrhel, ale o tom dále) pro ternární operátor. Je to v celku zřejmé: máme 3 tvary množného čísla (indexy 0,1,2), pokud je "počet n", což je náš vstupní parametr pro použití překladu množného čísla, 1, tak použijeme překlad s indexem 0, v našem případě "1 komentář", dále pak pro 2 až 4 máme překlad s indexem 1 - např. "4 komentáře", pro ostatní případy překlad s indexem 2 - např. "25 komentářů".

Pozor, toto nastavení nezařídí správné použití množných čísel v Zend Framework based aplikaci! Podrobnosti uvedu dále.

Detekce plurálů automatizovanými nástroji gettextu

Od teď si můžete .po soubory vytvářet sami. Gettext nám ale nabízí automatickou podporu pro proskenování zdrojových souborů a automatický update .po souborů i integrovanou podporou pro PHP syntaxi zdrojových souborů. Jde o to mít ve zdrojových souborech správně syntakticky zapsanou funkci pro překlad a gettext to už pak pozná.

Pro můj případ jsou všechny překlady zapsány funkcemi, resp. metodami

  1. _(),translator() pro jednotná čísla
  2. plural() pro množná čísla

Pak stačí tyto parametry volání xgettextu aby nám našel naše překlady, více se dočtete v manuálu gettextu.

gettext --keyword=translator --keyword=plural:1,2

Volání překladů v php kódu

Takže teď musíte zajistit použití výše zmíněných funkcí pro překlady. Já jsem udělal vlastním action helperem pro použití v controlerech a vlastním view helperem pro použití v šablonách. Máte k dispozici předpřipravený view helper přímo ve frameworku, ale přišel mě zbytečně složitý a komplexní, tak jsem si napsal vlastní. Pozor na to, že by Váš view helper měl použít volání plural() pro množná čísla, aby to gettext dobře detekoval při skenování.

Implementace hledání množných čísel v Zend Frameworku

Tak teď by se mohlo zdát, že už všechno bude fungovat jak má. Ale v Zend Frameworku 1.9.0 tomu tak nebylo. Je to proto, že Zend Framework má sice vlastní implementaci čtení binárních souborů s gettext překlady (.mo), neohlíží se ale nastavení množných čísel gettextem přes gettext direktivu Plural-Forms. Místo toho má natvrdo zadrátovanou logiku vybírání množného čísla dle nastaveného Zend_Locale. Ta v podstatě kopíruje to, co se uvádí v .po souberech jako Plural-Form. Můžete nahlédnout do Plural.php. Problém je v tom, že výsledek C like zápisu v gettextu pro češtinu a slovenštinu není stejný jako když ho okopírujete do PHP kódu, pravděpodobně to má na svědomí nějaká priorita v PHP operátorech. To způsobí to, že se špatně určí, který překlad se pro jaký "počet n" má použít. Nicméně po drobné opravě už v Zend Frameworku 1.9.1 funguje určování množného čísla správně.


Komentáře (0)

Komentáře jsou uzavřeny.