Navigace

Hlavní menu

 

GNU Gettext - automatický výběr jazyka

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ódJazykKódJazyk
sqalbánštinaararabština
hyarménštinabgbulharština
beběloruštinacakatalánština
zhčínštinahrchorvatština
csčeštinadadánština
enangličtinaeoesperanto
etestonštinafifinština
frfrancouzštinadeněmčina
elřečtinaiwhebrejština (také he)
humaďarštinaititalština
jajaponštinakokorejština
lalatinanonorština
plpolštinaptportugalština
rorumunštinaruruština
srsrbštinashsrbochorvatština
skslovenštinaslslovinština
esšpanělštinasvšvédština
ththajštinatrturečtina
ukukrajinštinavivietnamš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.

Kosek, Jiří (12. 4. 2005)

GNU Gettext - snadná lokalizace webových aplikací

Internet je globální médium a jako takové klade na webdevelopery některé specifické požadavky. Jedním z nich je také nutnost internacionalizace a lokalizace jejich produktů do širokého spektra jazyků. Tato série článků již byla uzavřena, ačkoli další pokračování nelze vyloučit.