Přepínač jazyků na Django webu
Publikováno 2.1.2013
O překladech v Django frameworku jsem již psal. Když už tedy umíme aplikaci lokalizovat, zkusme si udělat přepínač jazyků, ať přeložené texty využijeme. Pěkný návod je zde, přesto ho zrekapituluji a doplním.
1. inicializace LocaleMiddleware
Django samotné obsahuje middleware, který přepínání jazyků umožňuje. Přidáme tedy potřebný middleware do souboru settings.py:
MIDDLEWARE_CLASSES = [ ... django.middleware.locale.LocaleMiddleware, ]
2. zpracování požadavků na změnu jazyka
Přepnutí jazyka je realizováno POST requestem na specifickou URL. Musíme tedy URL zpracovat. Do souboru urls.py přidáme toto:
urlpatterns = patterns( ... url(r'^i18n/', include('django.conf.urls.i18n')), )
3. Konfigurace požadovaných jazyků
V souboru settings.py založíme konstantu, která obsahuje seznam volitelných jazyků. Jedním z nich by měl být defaultní jazyk určený konstantou LANGUAGE_CODE v témže souboru. Jazyky jsou definovány dvoupísmenným kódem podle normy i18n.
LANGUAGE_CHOICE = [ "cs", "en", ]
4. Zpřístupnění konstanty v šablonách
Vlastní konstantu dostaneme do šablony kontextovým procesorem. Do souboru context_processors.py vložíme toto:
from django.conf import settings
def langs(request): ctx = { "LANGUAGE_CHOICE": settings.LANGUAGE_CHOICE, } return ctx
Zkontrolujeme, zda se tento procesor nachází v nastavení settings.py v seznamu TEMPLATE_CONTEXT_PROCESSORS.
5. Vložení přepínače do šablony
Do šablony vložíme vlastní HTML kód (částečně generovaný), který zobrazí přepínač jazyků, např. takto:
{% load i18n %} {% get_current_language as LCR %} <ul class="nav pull-right"> <li> <form action="/i18n/setlang/" name="setLang" method="post">{% csrf_token %} <input name="next" type="hidden" value="{{ request.path }}" /> <select name="language" onchange="document.setLang.submit();return false;"> {% for lang in LANGUAGE_CHOICE %} <option value="{{ lang }}"{% if LCR == lang %} selected{% endif %}>{{ lang|language_name_local|capfirst }}</option> {% endfor %} </select> </form> </li> </ul>
Tato varianta přepínače jazyků využívá select box. Dokáže předvybrat aktuálně nastavený jazyk. V hidden proměnné next je nastaveno aktuální URL, kde se právě na webu nacházíme. Na toto URL je web přesměrován, když dojde k přepnutí jazyka. Předpokládáme tedy, že jsou přeložené všechny stránky webu a URL pro různé jazyky se neliší. Zobrazení názvu jazyka necháváme na systému, nemusíme se tedy zabývat jeho překladáním. V select boxu se název každého jazyka objeví přeložený v daném jazyku, což je pro uživatele žádoucí. K tomu je využit filtr language_name_local. Další filtr nám zajistí, že je první písmeno názvu velké.