V této části našeho seznámení s lokalizační knihovnou gettext se podíváme na to, jak uživatelům jednoduše umožnit výběr jazyka, ve kterém chtějí s aplikací komunikovat.

Máme-li aplikaci lokalizovanou do více jazyků, musíme nějakým způsobem zajistit, aby uživatel viděl verzi v jazyce, kterému rozumí. Uživatelsky nejpohodlnější je asi zaslat stránku v jazyce, který má uživatel nastaven jako preferovaný. Tato informace se přenáší v HTTP hlavičce Accept-Language:

Accept-Language: cs;q=1.0,en;q=0.9

Obsah hlavičky se skládá ze seznamu kódů preferovaných jazyků (viz tabulka). Za jazykovým kódem může být ještě uvedena priorita tohoto jazyka. Každý uživatel si může své preferované jazyky nastavit podle libosti ve svém prohlížeči. Například v MSIE pomocí | Nástroje | Možnosti Internetu... | Jazyky |.

Vybrané jazykové kódy podle ISO 639
Kód Jazyk Kód Jazyk
sq albánština ar arabština
hy arménština bg bulharština
be běloruština ca katalánština
zh čínština hr chorvatština
cs čeština da dánština
en angličtina eo esperanto
et estonština fi finština
fr francouzština de němčina
el řečtina iw hebrejština (také he)
hu maďarština it italština
ja japonština ko korejština
la latina no norština
pl polština pt portugalština
ro rumunština ru ruština
sr srbština sh srbochorvatština
sk slovenština sl slovinština
es španělština sv švédština
th thajština tr turečtina
uk ukrajinština vi vietnamština

Nastavení preferovaných jazyků v Microsoft Internet Exploreru
Nastavení preferovaných jazyků v Microsoft Internet Exploreru

Aplikace by však na automatický výběr neměla spoléhat a měla by nabízet i možnost ruční změny preferovaného jazyka. Je mnoho situací, kdy si uživatel nemůže změnit nastavení prohlížeče – práce, internetová kavárna a podobně. Asi by nás moc nepotěšilo, kdybychom si během dovolené v Číně mohli číst jen stránky v čínštině, protože ta by byla nastavena jako výchozí jazyk na všech počítačích v internetových kavárnách. Uživatelské nastavení jazyka, které je nezávislé na nastavení jazyka v prohlížeči, si může webová aplikace uchovávat například v podobě cookie. Ukázkové řešení ilustruje následující příklad l10n.php:

<?php
// výběr jazyka pro texty aplikace
$lang = „en“; // implicitní jazyk
// změna preferovaného jazyka podle parametru v URL
if (IsSet($_GET[„changelang“]))
{
  $lang = $_GET[„changelang“];
  if ($lang == „auto“)
  {
    // vynulování kódu v cookie
    SetCookie(„lang“);
    // „uhádnutí“ jazyka podle Accept-Language
    list($jazykVaha) = Explode(„,“, $_SERVER[„HTTP_ACCEPT_LANGUAGE“]);
    list($prvniJazyk) = Explode(„;“, $jazykVaha);
    if ($prvniJazyk != „“) $lang = $prvniJazyk;
  }
  else
  {
    // zapamatování vybraného jazyka v cookie na jeden rok
    SetCookie(„lang“, $lang, time() + 60*60*24*365);
  }
}
else
{
  // načtení preferovaného jazyka z cookie
  if (IsSet($_COOKIE[„lang“]))
  {
    $lang = $_COOKIE[„lang“];
  }
  else
  {
    // „uhádnutí“ jazyka podle Accept-Language
    list($jazykVaha) = Explode(„,“, $_SERVER[„HTTP_ACCEPT_LANGUAGE“]);
    list($prvniJazyk) = Explode(„;“, $jazykVaha);
    if ($prvniJazyk != „“) $lang = $prvniJazyk;
  }
}
// změna jazyka používaného knihovnou gettext
putenv(„LANG=$lang“);
setlocale(LC_ALL, $lang);
bindtextdomain(„messages“, realpath(„../locale“));
bind_textdomain_codeset(„messages“, „utf-8“);
textdomain(„messages“);
?>

Skript nejprve testuje, zda je v URL požadavku zadán parametr changelang. Pokud má hodnotu auto, nastaví aktuální jazyk podle obsahu HTTP hlavičky Accept-Language. Vezme si přitom první jazyk, který je v seznamu uvedený. Pokud je v changelang uvedena jiná hodnota, považuje se za kód jazyka a tento kód se uloží do cookie s názvem lang. Platnost této cookie se přitom nastaví na jeden rok.

V případě, že je skript volán bez parametru, určí se jazyk podle obsahu dříve nastavené cookie. Není-li cookie lang nastavena, provede se opět automatická detekce jazyka na základě hlavičky Accept-Language. Skript pak na závěr nastaví knihovnu gettext do uživatelem zvoleného jazyka. Skript l10n.php je díky svému chování určen k tomu, aby se načetl na začátek každého skriptu v lokalizované aplikaci.

Využití skriptu v praxi ukazuje jednoduchá aplikace nlsdemo.php. Ta od uživatele získá číslo a vygeneruje matici obsahující součiny všech čísel menších nebo rovných zadanému číslu. Aplikace je to tedy v podstatě k ničemu, ale demonstruje využití skriptu l10n.php pro detekci a přepínání jazyka.

<?php
// zákaz ukládání stránky do vyrovnávací paměti
header(„Cache-Control: no-cache“);
// detekce jazyka a inicializace lokalizačního mechanismu
require_once „l10n.php“;
?>
<!DOCTYPE HTML PUBLIC ‚-//W3C//DTD HTML 4.0 Transitional//EN‘>
<html>
<head>
<meta http-equiv=“Content-Type“ content=“text/html;charset=utf-8″>
<title><?php echo _(„Internationalized form“)?></title>
</head>
<body>
<?php if (!IsSet($_GET[„n“])): ?>
<h1><?php echo _(„Welcome!“)?></h1>
<form action=“nlsdemo.php“>
<?php echo _(„Your preferred natural number: „)?>
<input name=“n“>
<input type=“submit“ value=“<?php echo _(„Submit“)?>“>
</form>
<?php else: ?>
<?php echo _(„Here is your <i>magic matrix</i>.“)?>
<table border=“1″>
<?php
  $n = abs($_GET[„n“]);
  for ($i=1; $i<=$n; $i++)
  {
    echo „<tr>“;
    for ($j=1; $j<=$n; $j++)
      echo „<td>“ . $i * $j . „</td>“;
    echo „</tr>“;
  }
?>
</table>
<a href=“nlsdemo.php“><?php echo _(„Generate new matrix“)?></a>
<?php endif ?>
<div align=“center“>
  <a href=“nlsdemo.php?changelang=en“>English interface</a> |
  <a href=“nlsdemo.php?changelang=cs“><?php echo _(„Czech interface“)?></a> |
  <a href=“nlsdemo.php?changelang=auto“><?php echo _(„Autodetect language“)?></a>
</div>
</body>
</html>

Jako domácí cvičení si můžete zkusit skript l10n.php vylepšit tak, aby z preferovaných jazyků vybral ten s nejvyšší vahou, do kterého je zároveň aplikace přeložena. Nechce-li se vám do toho, můžete se nechat inspirovat kódy jiných vývojářů, které jsou volně k dispozici:

Ukázka lokalizované aplikace
Ukázka lokalizované aplikace (plná velikost, cca 45 kB)

Ukázali jsme si tedy použití knihovny GNU Gettext, která v současnosti patří mezi nejlepší dostupné nástroje pro lokalizaci aplikací. Gettext lze používat pro lokalizaci aplikací napsaných v různých programovacích jazycích včetně PHP. Píšete-li však webové aplikace v PHP, těžko naleznete pro jejich lokalizaci lepší nástroj, než je gettext.

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

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

1 Příspěvěk v diskuzi

  1. Cars and houses are expensive and not everybody is able to buy it. However, credit loans are created to aid different people in such hard situations.

Odpovědět