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.