Jak na vícejazyčný web či aplikaci v PHP

Často potřebujeme provozovat jedny webové stránky ve více jazycích.

Možností, jak toho docílit je několik.

Můžeme vytvořit kompletní kopii daného webu a poté přepsat všechny texty do požadovaného jazyka. Na první pohled se může zdát, že jde o nejrychlejší způsob. Není tomu tak.

Mnohem efektivnější cesta je spravovat jednu jedinou verzi webu a pouze texty v různých jazycích umístit do speciálních samostatných souborů.

Přesně takový postup umožňuje lokalizační nástroj GNU gettext, který má podporu v mnoha programovacích jazycích, včetně PHP.

Příprava webu pro podporu více jazyků

Úprava webu vytvořeného v PHP za účelem podpory vícejazyčnosti je snadná. Veškeré texty určené k překladům je potřeba umístit do funkce gettext():

echo gettext("Můj text");

V praxi pak používáme spíše alias pro tuto funkci ve formě podtržítka:

echo _("Můj text");

Soubory PO (Portable Object)

Jedná se o běžné textové soubory s příponou .po, obsahující překlady do cílového jazyka.
Každý jazyk je umístěn ve vlastním .po souboru.

Výhodou použití překladových .po souborů je možnost upravovat cílové texty bez nutnosti zásahu do zdrojového kódu webu.

Struktura .po souboru

Na začátku souboru se nachází hlavička, obsahující základní informace o překladu.

Zbytek souboru tvoří především páry řetězců představující vlastní překlad do daného jazyka:

  • msgid zdrojový text, odpovídá řetězcům ve zdrojovém kódu
  • msgstr přeložený text v cílovém jazyce
msgid "Hello world"
msgstr "Bonjour le monde"

Pokud je cílový řetězec (msgstr) prázdný, v aplikaci je zobrazen obsah zdrojového řetězce (msgid).

Hlavička

Začátek souboru PO tvoří hlavička, která obsahuje upřesňující informace o souboru s překladem.

Language

Obsahuje kód jazyka ve kterém jsou uvedeny cílové texty.

"Language: en"

Viz. Označení použitého jazyka

Content-Type

Informuje o typu souboru a použité jazykové sadě.

"Content-Type: text/plain; charset=UTF-8n"

Content-Transfer-Encoding

"Content-Transfer-Encoding: 8bit"

Plural-Forms

Obsahuje vzorec pro použití tvarů množného čísla.

Podrobné informace o hlavičce PO souboru.

Označení použitého jazyka

Daný jazyk lze označit jedním ze tří způsobů:

  • ll – kód jazyka
  • ll_CC – kód jazyka následovaný kódem země
  • ll_CC@variant – kód jazyka následovaný kódem země doplněný o označení skriptu jazyka

ll

Např.: cs – čeština, en – angličtina, de – němčina.

  • dva znaky (malými písmeny) představující daný jazyk podle normy ISO 639-1 (tzv. Language Designator).
    Viz Seznam jazykových kódů.

ll_CC

Např.: en_GB – britská angličtina, en_US – americká angličtina.

V případě potřeby odlišení dialektu jazyka podle cílové země.
(Typicky např. britská angličtina se liší od americké angličtiny.)

  • dva znaky (malými písmeny) představující daný jazyk podle normy ISO 639-1 (tzv. Language Designator).
    Viz Seznam jazykových kódů.
  • znak podtržítka
  • dva znaky (velkými písmeny) představující danou zemi podle normy ISO 3166-1 (tzv. Region Designator).
    Viz Seznam kódů zemí.

Výchozí rozšířenou variantu ll_CC lze pro určitý dialekt nahradit zkrácenou variantou ll, např.:

  • de_DE lze nahradit de pro dialekt němčiny kterým se mluví v Německu
  • pt_PT lze nahradit pt pro dialekt portugalštiny kterým se mluví v Portugalsku
  • apod.

ll_CC@variant

  • dva znaky (malými písmeny) představující daný jazyk podle normy ISO 639-1 (tzv. Language Designator).
    Viz Seznam jazykových kódů.
  • znak podtržítka
  • dva znaky (velkými písmeny) představující danou zemi podle normy ISO 3166-1 (tzv. Region Designator).
    Viz Seznam kódů zemí.
  • znak zavináč
  • označení skriptu jazyka (malé znaky), např. „latin“ nebo „cyrillic“ (tzv. Script Designator)

Překlad množného čísla

Různé jazyky mají různý počet tvarů množného čísla.

Angličtina má pouze jediný tvar množného čísla, kdy ke slovu přidáme koncovku „s“:

1 apple
2 apples
5 apples

Čeština používá tři tvary množného čísla:

1 jablko
2 jablka
5 jablek

Tuto rozdílnost lze sice vyřešit na úrovni samotného kódu aplikace/webu pomocí podmínek, vhodnější způsob však je použití souboru s překladem do daného jazyka.

V PO souboru lze definovat vzorec pro výběr správné varianty tvaru množného čísla na základě aktuálně použitého počtu.

Příklady vzorců pro různé jazyky:

Angličtina (en):

nplurals=2; plural=(n != 1)

Čeština (cs):

nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2

Irština (ga):

nplurals=5; plural=(n==1 ? 0 : n==2 ? 1 : n<7 ? 2 : n<11 ? 3 : 4)

Viz. Seznam vzorců pro množná čísla podle jazyka.

Zápis překladů

Zápis vět u nichž neřešíme množné číslo je jednoduchý:

msgid "orange"
msgstr "Poměranč"

Kde:

  • msgid zdrojový text, odpovídá řetězcům použitým ve zdrojovém kódu webu/aplikace
  • msgstr přeložený text do cílového jazyka

Pokud potřebujeme řešit množné číslo, zápis je složitější:

msgid "apple"
msgid_plural "apples"
msgstr[0] "Jablko"
msgstr[1] "Jablka"
msgstr[2] "Jablek"
  • msgid_plural – zdrojový text pro řetězec v množném čísle (2 a více)

Přeložený řetězec je volen na základě čísla.

Plural-Forms – určuje počet tvarů množného čísla a vzorec pro výběr správné varianty tvaru množného čísla. Závisí na cílovém jazyce překladu.

msgstr[x] – obsahuje text pro daný tvar překladu

#, c-format
msgid "One file removed"
msgid_plural "%d files removed"
msgstr[0] "%d slika je uklonjena"
msgstr[1] "%d datoteke uklonjenih"
msgstr[2] "%d slika uklonjenih"

Kontext (msgctxt)

Kontext umožňuje rozlišení zápisů překladu s totožným zdrojovým textem (msgstr).

Pro totožný termín (msgstr) v odlišném kontextu (msgctxt) může být v rámci jednoho překladového (.po) souboru použit jiný text překladu (msgstr).

Lze tedy použít více zápisů se stejným zdrojovým textem (msgstr), každý ale musí mít odlišný kontext (msgctxt).

Pozn.: Absence kontextu se nerovná uvedenému kontextu obsahujícím prázdný řetězec.

Např. při lokalizaci navigace programu se běžně vyskytuje stejný (jednoslovný) termín na více místech s odlišným kontextem.

Informace o počtu variant množného čísla

Počet variant množného číslavzorec pro výběr požadované varianty se v PO souboru umísťuje do sekce hlavičky za klíčové slovo Plural-Forms.

Tvar vzorec se liší na základě pravidel pro tvorbu množného čísla dle cílového jazyka.

Plural-Forms: nplurals=2; plural=n == 1 ? 0 : 1;

Kde:

  • hodnota nplurals (celé číslo) určuje počet rozdílných tvarů množného čísla v daném jazyce existuje
  • plural obsahuje výraz (v syntaxi jazyka C) – pravidlo pro výběr vhodného tvaru množného čísla

Příklady vzorců

Příklady vzorců pro volbu vhodné varianty podle počtu tvarů množného čísla pro vybrané jazyky:

Společný tvar jednotného a množného čísla

Některé jazyky (japonština, vietnamština, korejština, thajština) používají pro jednotné i množné číslo společný tvar.

Plural-Forms: nplurals=1; plural=0;
Jeden tvar množného čísla

Většina světových jazyků (angličtina, němčina, španělština, řečtina atd.) a esperanto používá jeden tvar množného čísla.

Plural-Forms: nplurals=2; plural=(n != 1);
Dva tvary množného čísla

Některé jazyky (brazilská portugalština a francouzština) používají dva tvary množného čísla. Jednotné číslo je použito pro množství jedna a nula.

Plural-Forms: nplurals=2; plural=n>1;
Tři tvary množného čísla

Čeština a slovenština používá tři tvary množného čísla:

  • pro množství 1
  • pro množství 2-4
  • pro množství 0, 5 a více
Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;

A tak dále. Další příklady lze nalézt zde.

Další struktura PO souboru

  • # poznámka překladatele (volitelně)
  • #poznámka automaticky spravovaná nástrojem pro práci s překladovým souborem
  • #. extracted-comments
  • #: reference…
  • #, flags…
    • fuzzy
  • #| msgid previous-untranslated-string
  • msgctxt context

Soubor může volitelně obsahovat prázdné řádky.

Soubory .pot

Gettext portable object template.

Šablony překladů. Soubory jsou totožné se soubory .po, avšak neobsahují přeložené řetězce.

(Pozor: nezaměňovat se soubory s totožnou příponou .pot aplikace MS PowerPoint.)

Struktura .pot souboru

Základ tvoří pár řetězců:

  • msgid – zdrojový text (vyskytuje se ve zdrojovém kódu)
  • msgstr – prázdný řetězec

Např.:

msgid "Hello world"
msgstr ""

Soubory MO

Ve výsledku web nepoužívá přímo soubory PO, ale jejich zkompilovanou variantu v podobě souborů s příponou .mo.

Nástroje pro práci se soubory překladu

Závěr

Samotným překladem slov z jednoho jazyka do druhého však proces lokalizace zdaleka nekončí. Je potřeba myslet i na další odlišnosti mezi jednotlivými jazyky, jako např. tvar data a času, způsob zobrazení cen a měn a podobně.

Zdroje

Napsat komentář

Vaše emailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *