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 |.
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
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:
- HTTP::negotiateLanguage – knihovna projektu PEAR
- accept-to-gettext – skript Woutera Verhelsta
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.
Mohlo by vás také zajímat
-
Vaše pošta může být špatně nastavena – svěřte ji profesionálům
13. července 2023 -
10 nejpopulárnějších programovacích jazyků a jejich využití
9. listopadu 2023 -
Aukce CZ domén: Jak vydražit expirovanou CZ doménu?
12. června 2024
Nejnovější
-
Jak chránit webové stránky před Web/AI Scrapingem
27. listopadu 2024 -
Jaký monitor je nejlepší k novému Macu Mini?
25. listopadu 2024 -
Výkonný a kompaktní: ASOME Max Studio s výjimečným poměrem cena/výkon
11. listopadu 2024 -
Šokující data od Microsoftu: Kyberútoky rostou o stovky procent!
8. listopadu 2024
loans
Srp 31, 2011 v 5:02Cars 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.