Jazyky

JellyPot podporuje vícejazyčné weby, přičemž počet jazyků není nijak omezen. Další jazyk je možné přidat nebo odebrat v jakékoliv fázi vývoje nebo provozu webu. Pro přidání jazyka je potřeba učinit následující kroky:

  1. definovat jazyk v elementu Languages souboru Site.config,
  2. označit jazykově závislá pole v Site.config (měl-li web dosud jen jeden jazyk),
  3. přidat textový soubor nového jazyka,
  4. přidat přepínač jazyků do stránek
  5. a dodržet doporučenou adresářovou strukturu webu, resp. alespoň tu zásadu, že šablony stránek pro daný jazyk jsou umístěny ve složce, jejíž jméno se shoduje se jménem jazyka, nebo jsou ve složce příslušné výchozímu jazyku.

Definice jazyků v Site.config

Definice jazyků se v souboru site.config uvádí do elementu <Languages>. JellyPot vyžaduje, aby i v případě jednojazyčného webu byl zde tento jazyk uveden. Při přidávání dalšího jazyka tak stačí jen doplnit další element <Language>. Detailní popis jednotivých atributů je uveden u elementu <Languages>. První jazyk zde uvedený nazýváme výchozím jazykem.

<?xml version="1.0" encoding="utf-8" ?>
<JellyPotDef xmlns="urn:Bet:ns:JellyPot:SiteConfig">
    ...
    <Languages>
        <Language name="cs" title="Česky" />
        <Language name="en" title="English" />
        <Language name="ja" title="日本語" cultureName="ja-JP" />
    </Languages>
    ...
</JellyPotDef>

Označení jazykově závislých polí v Site.config

Po přidání jazyka je zpravidla potřeba označit některá pole deklarovaných typů jako jazykově závislá. Do takových polí je možné zadat v každém jazyce odlišný obsah (vhodné např. pro nadpisy a obsahy článků) na rozdíl od polí jazykově nezávislých, které mají ve všech jazycích obsah totožný (příkladem budiž kontaktní emaily, odkazy či obrázky). Jako jazykově závislé lze označit:

  • konkrétní pole jednotlivých deklarovaných typů,
  • nebo celé kolekce.

Označení jazykově závislých polí

Jazykově závislá pole se v deklaraci typu v Site.config označují atributem langDepend, viz např. pole <SimpleText> nebo <Text>, stejným způsobem lze ale označit většinu polí:

<Type name="ArticleItem">
    <SimpleText name="title" langDepend="firstValue" />
    <Text name="text" langDepend="values" />
</Type>

Atribut může nabývat hodnot:

  • values – pro každý jazyk může být naplněn odlišný obsah. Pokud pro daný jazyk není obsah naplněn, na webu se nic nezobrazí.
  • firstValue – pro každý jazyk může být naplněn odlišný obsah. Pokud pro daný jazyk není obsah naplněn, na webu se automaticky zobrazí obsah z výchozího jazyka.
  • none – označuje, že pole není jazykově závislé. Pole se tedy chová stejně, jako by atribut langDepend nebyl uveden.

Jazykově závislé kolekce

Jazykově závislá kolekce se od obyčejné liší tím, že v každém jazyce obsahuje zcela samostatné prvky, kterých tak může být v různých jazycích různý počet. Kolekce se tedy chová tak, jako bychom měli pro každý jazyk samostatnou kolekci.

Představme si, že na firemním webu potřebujeme uvádět zcela jiné tiskové zprávy pro každý jazyk. Pokud by byly jazykově závislé pouze pole v definici typu, nikoliv kolekce samotná, pak by v každém jazyku by byly stejné zprávy (pochopitelně přeloženy do příslušného jazyka).

Atribut langDepend může u kolekcí nabývat těchto hodnot:

  • items – označení pro jazykově závislou kolekci
  • none – klasická kolekce s výchozím chováním

Site.config tento způsob jazykové závislosti vypadá následovně:

<Vars>
    <Collection name="articleCol"
                itemType="ArticleItem"
                langDepend="items" />
</Vars>
<Types>
    <Type name="ArticleItem">
        <SimpleText name="title" />
        <Text name="text" />
    </Type>
</Types>

Přidání textového souboru

Dále je potřeba pro nový jazyk přidat textový soubor. Viz podrobnější informace v odkazovaném tématu.

Přidání přepínače jazyků v .aspx

Z pohledu uživatele webu je ještě nutné přidat přepínač jazyků. K jeho vygenerování složí control <je:langSelector>. Opět více u popisu tohoto controlu.

Jak probíhá zpracování požadavku na stránku na vícejazyčném webu

Pokud je definováno více jazyků, není potřeba vytvářet .aspx šablony zvlášť pro každý jazyk, zpravidla stačí vytvořit je pro výchozí jazyk. Zároveň je ale možné pro každý jazyk použít různé .aspx šablony. To se hodí, pokud má být v určitém jazyce nějaká stránka jiná než v ostatních. Způsob zpracování požadavku s ohledem na jazykové mutace vysvětluje níže uvedený obrázek. V něm předpokládáme, že klient požaduje stránku en/page.aspx, výchozí jazyk je cs.

Požadavek en/page.aspx ano ano ne ne Vezme en/page.aspx a sestaví stránku s hodnotami en a pošle prohlížeči Vezme /cs/page.aspx a sestaví stránku s hodnotami en a pošle prohlížeči Error 404 Existuje soubor cs/page.aspx ? Existuje soubor en/page.aspx ?

Poněkud odlišně je potřeba postupovat v situacích, kdy požadavek neobsahuje *.aspx stránku, ale jen adresář, tj. např. http://www.example.com/en/. IIS standardně takové požadavky zpracovává tak, že v adresáři hledá výchozí dokument, zpravidla default.aspx. Pokud tento neexistuje, IIS zpracování požadavku rovnou ukončí chybovou stránkou 404. Toto chování lze upravit vytvořením složky pro každý jazyk a do nich umístit prázdný soubor default.aspx (s velikostí 0 B). Tím IIS předá požadavek systému JellyPot, který pak už zařídí přesměrování, jak je výše uvedeno.

Připomínky a postřehy

Máte-li nějakou připomínku, dobrý nápad nebo jste našli v dokumentaci chybu, rádi od vás uslyšíme.