Překládáme WordPress – 1. část – jak to vlastně funguje?

aneb lokalizace WordPressu z pohledu neprogramátora.

Půjdeme na to malou oklikou. WordPress je systém, který se skládá z jádra (to je to, co si nainstalujete po stažení z webu), z řady motivů vzhledu, které vytváří komunita uživatelů zdarma nebo na kšeft, a z řady přídavných skriptů, tzv. pluginů, které dodávají funkce, v jádře neobsažené, nebo obsažené funkce nějak vylepšují. Tyto pluginy jsou opět vesměs vytvářeny nadšenci, v tomto případě programátory, kteří to berou jako rozcvičku, zviditelnění, a nebo prostě umí a chtějí pomoci. Dříve bylo téměř pravidlem, že doplňky WP byly vytvářeny v anglicky mluvících zemích, a případné snahy o lokalizaci do jiných jazyků byly velkoryse přehlíženy. Pokud se ale podíváme dnes, vidíme, že velká část vzhledů je vytvářena někde v Asii (Indie, Thajsko, Turecko, Pakistán…) a velká část pluginů někde na východě (Rusko, Srbsko, Polsko, ČR…). Stále častěji se objevuje tvorba, která je pro lokalizaci přizpůsobena, říká se tomu internacionalizace (i18n). K této internacionalizaci vydala skupina vývojářů WordPressu řadu doporučení, která jsou (někdy bohužel pomalu) uváděna do praxe.

Soubory WP obsahují textové řetězce, které se objevují na obrazovce v čitelné podobě. Jsou to buď výstupy PHP funkcí, např.:

echo('word');

nebo výpis obsahu proměnných, např.:

$name = 'word';

nebo jde o přímý výpis textů v HTML, např.:

<h2>Name</h2>

Aby bylo možné zajistit překlad těchto textů do jiných jazyků, používá WordPress PHP proměnnou WPLANG, definovanou v souboru wp-config.php:

define ('WPLANG', 'xx_XX');

kde xx_XX je označení cílového jazyka, pro nás je to cs_CZ. Dále používá PHP skript gettext, který vyhledává výše zmíněné textové řetězce a snaží se najít jejich překlad v souboru, označeném xx_XX.mo, v našem případě tedy cs_CZ.mo. Tento soubor musí být umístěn v adresáři wp-includes\languages. Pokud překlad  nebo příslušný soubor nenajde, použije původní text. Aby gettext mohl tyto řetězce najít, musí být nějak označeny. Ve WP se používá označení __ (dvě podtržítka za sebou), _e, __c nebo __ngettext (dvě podtržítka na začátku).

__ se označují řetězce uvnitř PHP funkcí, např.:

<? php
....
$name = __('word');
....
?>

_e se označují řetězce mimo PHP, které se vypisují za použití PHP funkce echo. Takto je nutné postupovat v případě HTML, např.

<h2>Name</h2>

se zapíše jako

 <h2><?php _e('Name'); ?></h2>

__c je totéž jako __, ale za textový řetězec lze přidat znak |, za který lze uvést komentář (comment). To se dá použít v případě, že má angličtina shodný výraz, jehož význam se mění podle kontextu (výborné jako informace pro překladatele, bohužel málo využívané), např.:

__c('Editor|role'); – česky Redaktor v případě role pro WordPress

__c('Editor|rich-text textarea'); – česky Editor v případě, že jde opravdu o editor textu

Jako další příklad lze uvést name (jméno vs. název) a řadu dalších.

__ngettex se používá v případě, že je nutné vyjádřit rozdíl mezi singulárem (image) a plurálem (images). Funkce __ngettext má tři argumenty: tvar singuláru, tvar plurálu a počet, např.

__ngettext('%s image available', '%s images available', $image_count');

Pokud máme správně nastaveno rozlišení plurálů v překladatelském programu, funkce nám umožní zadat správné tvary pro různé počty v češtině:

1 obrázek k dispozici

2 obrázky k dispozici

5 obrázků k dispozici

Použití proměnných v řetězcích:

Často je obsahem textového řetězce nějaká proměnná:

 echo "We deleted $count spams."

Pokud tento řetězec zapíšeme jako

 _e("We deleted $count spams.");

nebude to fungovat, protože gettext vezme $count jako normální text. V tomto případě se používá funkce printf, např.

 printf(__("We deleted %d spams."), $count);

Proměnná %d je pak při každém volání funkce nakrmena hodnotou z $count. V případě použití více hodnot proměnných musí být patřičně označeny:

 printf(__("Your city is %1$s, and your zip code is %2$s."));

Takovýto zápis má výhodu v tom, že překladatel, který musí dodržet zápis proměnných, může jejich pořadí přehodit podle potřeby, např. může zapsat překlad takto:

"Adresa je %2$s %1$s", ve výsledku "Adresa je 62800 Brno"

Nyní se vrátíme k řetězci ohledně spamů výše. Pokud bychom jej přeložili jako „Je vymazáno %d spamů“, a spam byl jenom jeden, výsledek by byl tristní: „Je vymazáno 1 spamů“. Nyní je potřeba použít funkci __ngettext:

 printf(__ngettext("We deleted %d spam.", "We deleted %d spams.", $count), $count);

a překládáme:

Vymazal jsem 1 spam.

Vymazal jsem 2 (3,4…) spamy.

Vymazal jsem 5 (a více) spamů.

Jednoduché, co?

Příště se budeme věnovat použití zřejmě nejrozšířenějšího editoru překladů, který umí pracovat s gettextem, českého PoEditu. Ten umí převádět seznamy textových řetězců a jejich překladů do tvaru, který používá gettext ve WordPressu, tj. do souborů s příponou .mo.


Napsat komentář

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

Tato stránka používá Akismet k omezení spamu. Podívejte se, jak vaše data z komentářů zpracováváme..