V předchozím článku o gettextu jsme si ukázali použití této lokalizační knihovny na jednoduchém skriptu. Tentokrát se podíváme na to, jak průběžně s vývojem aplikace udržovat i její překlady a jak se vypořádat s některými lingvistickými lahůdkami způsobenými odlišnou gramatikou jednotlivých jazyků.

Aktualizace překladů

Postup během prvotního překladu aplikace je poměrně jednoduchý. Noční můrou každého překladu jsou však aktualizace. Po změně kódu je potřeba zjistit, zda se musí přeložit nějaké nové texty, případně opravit překlady textů, ve kterých v originálu došlo ke změně. Jedna z velkých předností gettextu spočívá v tom, že se s vývojem kódu počítá a tak gettext obsahuje nástroje podporující průběžné aktualizace překladů.

Následující postup shrnuje všechny kroky potřebné pro aktualizaci originálního anglického textu a jeho českého překladu“

  1. Vygenerování PO souboru ze všech zdrojových textů v aktuálním adresáři:

    xgettext –from-code=cp1250 *.php

  2. Přidání nově zjištěných textů do stávající anglické lokalizace:

    msgmerge -U ../locale/en/LC_MESSAGES/messages.po messages.po

    Vygenerování binárního MO souboru z PO souboru:

    msgfmt ../locale/en/LC_MESSAGES/messages.po -o ../locale/en/LC_MESSAGES/messages.mo

  3. Přidání nově zjištěných textů do stávající české lokalizace“

    msgmerge -U ../locale/cs/LC_MESSAGES/messages.po messages.po

  4. Přeložení nových záznamů v české lokalizaci (soubor ../locale/cs/LC_MESSAGES/messages.po).

  5. Vygenerování binárního MO souboru pro českou lokalizaci:

    msgfmt ../locale/cs/LC_MESSAGES/messages.po -o ../locale/cs/LC_MESSAGES/messages.mo

  6. Odstranění pomocného souboru s texty k přeložení:

    rm messages.po

  7. Restart http serveru, protože si překlady ukládá do vyrovnávací paměti.

Celý proces aktualizace překladu je zachycen na následujícím obrázku:

Schéma aktualizace překladů
Schéma aktualizace překladů (plná velikost, cca 50 kB)

Nástroje pro editaci souborů PO

U větších aplikací začne být ruční editování PO souborů poměrně nepohodlné. Naštěstí existuje několik programů, které nabízejí pohodlné grafické prostředí pro správu souborů s překlady. Nejznámější z nich jsou uvedeny v následujícím přehledu:

Editaci souborů s překlady vám může usnadnit například poEdit
Editaci souborů s překlady vám může usnadnit například poEdit (plná velikost, cca 15 kB)

Překlady množných čísel

Občas potřebujeme v aplikaci vypisovat texty, jejichž obsah a gramatický tvar se liší podle doplňované hodnoty. Například:

Máte 1 nový e-mail.
Máte 2 nové e-maily.
Máte 126 nových e-mailů.

K dispozici proto máme funkci ngettext(), která standardně počítá s angličtinou, kde je jeden jiný tvar množného čísla. Funkce má tři parametry – frázi pro jednotné číslo, frázi pro množné číslo a počet. Podle posledního parametru gettext vybere odpovídající ze dvou frází.

Některé jazyky však mají více tvarů množných čísel – například čeština tři. I to lze pomocí gettextu řešit. Do PO souboru překladu vložíme direktivu:

„Plural-Forms: nplurals=3;
    plural=n==1 ? 0 : n>=2 && n<=4 ? 1 : 2;“

Ta podle parametru n určí, která ze tří variant textu se použije. Tato varianta podmínky odpovídá progresivnějšímu způsobu skloňování (jeden email, 2-4 emaily, 5 a více emailů). Pro konzervativní aplikace (například máte 101 nový e-mail) lze použít podmínku:

„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;“

Do PO souboru s českým překladem pak umístíme několik tvarů množného čísla:

msgid „You have %s new e-mail.“
msgid_plural „You have %s new e-mails.“
msgstr[0] „Máte %s novou e-mailovou zprávu.“
msgstr[1] „Máte %s nové e-mailové zprávy.“
msgstr[2] „Máte %s nových e-mailových zpráv.“

Různé tvary množného čísla se do výstupu nejčastěji vkládají pomocí funkce printf(), která umožňuje doplnit číslo do výstupu:

printf(ngettext(„You have %s new e-mail.“,     „You have %s new e-mails.“, $n), $n)

Starší komentáře ke článku

Pokud máte zájem o starší komentáře k tomuto článku, naleznete je zde.

Žádný příspěvek v diskuzi

Odpovědět