Často potřebujete vytvořit webové stránky ve více jazykových verzích. Uživateli pak musíte umožnit snadno mezi nimi přepínat. Tento článek popisuje velmi jednoduché a univerzální řešení tohoto problému. Zdrojový kód je sice napsán pro ASP, ale princip řešení je natolik obecný a podrobně komentovaný, že si ho zájemci velmi snadno upraví i pro PHP a dokonce i pro klientský JavaScript.

Zadání

Když jsme byli ve firmě před několika lety poprvé postaveni před úkol vytvořit vícejazyčný web, hledali jsme mimo jiné snadný způsob přepínání mezi jednotlivými jazykovými verzemi stránek. Na řešení jsme si stanovili tyto požadavky:

  1. Přepínání musí fungovat transparentně 1:1. To znamená, že se uživatel po přepnutí dostane na stejnou stránku v jiné jazykové verzi, nikoli na stránku úvodní.
  2. Odkaz, který přepnutí do určité jazykové verze způsobí, musí být na všech stránkách stejný. Tím se velmi zjednoduší správa stránek a omezí riziko chybných odkazů, které přepnou na jinou stránku.
  3. Skript je primárně určen pro ASP, princip však musí jít využít i na jiných platformách, a to i pro stránky, které nedisponují možností skriptů na straně serveru.

Princip řešení

První, co je třeba vzít v úvahu, je způsob rozlišení jazykových verzí stránek. Nejčastěji se používají dva způsoby:

  1. Jazyková verze je identifikována parametrem v URL (tzv. querystringem) každé stránky. Např. v URL http://www.xyz.cz/stranka.asp?lang=cz je jazyková verze stránky stranka.asp určena parametrem lang.
  2. Pro jednotlivé jazykové verze je uzpůsobena adresářová struktura webu. Např. stránka s URL http://www.xyz.cz/cz/stranka.html je česky (adresář cz), zatímco URL http://www.xyz.cz/en/stranka.html patří odpovídající stránce anglické (adresář en).

Úkolem tedy je, vytvořit skript, který:

  1. zjistí URL volající stránky,
  2. vytvoří URL cílové stránky tím, že v původním URL zamění identifikaci jazykové verze,
  3. předá řízení (redirect) na stránku s novým URL.

Vstupním parametrem toho skriptu přitom musí být kód cílové jazykové verze. Odkaz na skript je pak možné umístit na vhodné místo každé stránky buď v podobě obrázku odpovídající vlaječky, nebo jako prostý textový odkaz, či ve formě rozbalovacího seznamu jazykových verzí.

Zdrojový kód

Zdrojový kód řešení je napsán v jazyce VBScript pro platformu ASP a pracuje s identifikací jazykové verze ve formě parametru lang připojeného k URL (querystring). Velmi snadno však jde upravit i pro jiné jazyky a pro druhý způsob přepínání využívající adresářovou strukturu. Jedna z takových možných úprav je naznačena v závěru článku.

Nyní však k samotnému skriptu. Jeho úvodní část je velmi jednoduchá:

<%@ LANGUAGE = "VBScript" ENABLESESSIONSTATE = False %>
<% Option Explicit %>
<%
SwitchLanguage(Request.QueryString("lang"))

Za klasickou hlavičkou ASP skriptu následuje volání procedury SwitchLang, která se postará o všechnu práci. Podstatné je, že proceduře musíte poslat kód cílového jazyka jako parametr. Ten zjistíme z proměnné lang uložené v QueryStringu.

Celý skript lze tedy volat dvěma způsoby — buď přímým odkazem (např. <a href="switchlang.asp?lang=en">English</a>), nebo formulářem s rozbalovacím seznamem jazyků. V druhém případě musí být formulář odeslán metodou GET, tedy nějak takto:

<form action="switchlang.asp" method="get">
  <select size="1" name="lang">
    <option value="cz">Cesky</option>
    <option value="en">English</option>
    <option value="fr">Francais</option>
  </select>
  <input type="submit" value="Go">
</form>

Nyní se podívejme na vlastní výkonnou proceduru SwitchLang:

sub SwitchLanguage( _
  byval strLanguage _
)
  const strLangParamName = "lang="
  const strDefaultDocName = "default.asp"
  const strHomePageName = "http://www.xyz.cz/default.asp"
  dim strCurrURL, strNewURL
  dim varQueryString, intPos, intMaxIndex, i
  ‚ Zjisti URL původní stránky
  strCurrURL = LCase(Request.ServerVariables("HTTP_REFERER"))

V první části procedury jsou deklarovány potřebné konstanty a proměnné. Kód cílového jazyka se předává (hodnotou) v parametru strLanguage. Konstanta strLangParamName udává název parametru pro jazykovou verzi v QueryStringu. Konstanta strDefaultDocName určuje název implicitní stránky, pro případ, že URL původní (volající) končí jen názvem adresáře. Konstanta strHomePageName určuje URL vstupní stránky, která se otevře v případě, že se volající stránku nepodaří zjistit.

Proměnné strCurrURL a strNewURL slouží pro uložení URL volající stránky a procedurou vytvořené URL cílové stránky. Ostatní proměnné mají jen pomocný charakter.

V prvním výkonném příkazu se naplní proměnná strCurrURL hodnotou HTTP_REFERER, která by měla obsahovat kompletní URL volající stránky. Ovšem pozor, HTTP_REFERER nemusí být vždy k dispozici a tento stav musíte náležitě ošetřit, jak ostatně uvidíte hned v následující části kódu.

  ‚ Zjisti, zda původní URL není prázdné
  if strCurrURL = "" then
    ‚ URL je prázdné –> přesměruj na home page
    strNewURL = strHomePageName & "?" & strLangParamName & strLanguage
  else
    ‚ Zjisti, zda je třeba použít implicitní stránku
    if Right(strCurrURL, 1) = "/" then
      ‚ URL končí na "/" –> připoj jméno implicitní stránky
      strNewURL = strCurrURL & strDefaultDocName & "?" & strLangParamName & strLanguage
    else
      ‚ Zjisti, zda URL obsahuje parametry (QueryString)
      intPos = InStr(strCurrURL, "?")
      if intPos = 0 then
        ‚ Neobsahuje parametry –> připoj parametr s jazykovou verzí
        strNewURL = strCurrURL & "?" & strLangParamName & strLanguage
      else
        ‚ URL obsahuje parametry –> rozděl je do pomocného pole
        varQueryString = Split(Mid(strCurrURL, intPos + 1), "&")
        ‚ Vytvoř nové URL a připoj všechny původní parametry
        ‚ s výjimkou jazykové verze
        strNewURL = Left(strCurrURL, intPos)
        intMaxIndex = UBound(varQueryString)
        for i = 0 to intMaxIndex
          if (Left(varQueryString(i), Len(strLangParamName)) <> strLangParamName) then
            strNewURL = strNewURL & varQueryString(i) & "&"
          end if
        next
        ‚ Nakonec připoj parametr jazykové verze
        strNewURL = strNewURL & strLangParamName & strLanguage
      end if
    end if
  end if

Komentáře přímo v kódu vám určitě budou k pochopení algoritmu stačit. Je ostatně velmi jednoduchý:

  1. Pokud se nepodaří zjistit URL volající stránky (HTTP_REFERER), proběhne přesměrování na cílovou jazykovou verzi home page.
  2. Pokud je URL volající stránky ukončeno lomítkem, je třeba přidat jméno implicitní stránky a připojit parametr s cílovou jazykovou verzí.
  3. Neobsahuje-li URL volající stránky dosud žádné parametry (QueryString), stačí k němu připojit parametr s cílovou jazykovou verzí.
  4. Pokud URL volající stránku již nějaké parametry obsahuje, musí se všechny s výjimkou jazykové verze přepsat do nového URL a poté k němu parametr s cílovou jazykovou verzí připojit.

Závěr procedury je již jednoduchý — provede přesměrování na vytvořené cílové URL.

  ‚ Přesměruj na nové URL
  Response.Redirect strNewURL
end sub ‚ SwitchLanguage
%>

JavaScript

V úvodu článku jsem slíbil, že popsaný princip bude možné použít i na jiných platformách než ASP. Naznačím tedy ještě, jak využít klientský JavaScript v kombinaci s rozdělením jazykových verzí do samostatných adresářů.

V takovém případě můžete použít document.location.href jak ke zjištění URL volající stránky, tak k přesměrování na stránku novou. Je vhodné vytvořit si pro to funkci a odkaz na ni a tedy i na jinou jazykovou verzi uzavřít do tagu <script>. Zároveň je třeba do tagu <noscript> uvést odkaz na home page příslušné jazykové verze pro případ, že prohlížeč nedisponuje klientským JavaScriptem.

V samotné funkci pak již stačí nalézt to správné lomítko (zpravidla poslední) a zaměnit název adresáře před ním kódem cílového jazyka. Celý úkol si zjednodušíte tím, že budete používat kódy jazyků o stále stejné délce (např. 2 znaky).

Závěr

Kód, tak jak jsem ho zde uvedl, ve skutečnosti ve firmě nepoužíváme. Již dříve jsme si pro vícejazyčné stránky vytvořili mnohem komplexnější systém objektů, které se starají i o správné, národní zobrazování čísel a dat a částečně i o varianty textů v různých jazycích. Samotný princip přepínání jazyků v této podobě je však mnohem srozumitelnější a doufám, že alespoň některým z vás přijde vhod.

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

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

Žádný příspěvek v diskuzi

Odpovědět