WebFav: I18n |
from Wiki KIVu |
Vytvoříme si nový modul?. Necháme si vygenerovat základní adresáře pro práci. Pracovat budeme v adresáři pages
. Naše I18N? *.properties
soubory budou uložené v adresáři classes/{jmeno-modulu}/
. Kde jmeno-modulu
je adresářová struktúra odpovídající balíkům javovských tříd podle zadaného názvu modulu např: cz.zcu.fav.kiv
.
Dál se samožrejmě můžeme zanořovat a vytvářet pod-adresáře podle libosti a podle toho rozlišit co k čemu náleží.
classes/{jmeno-modulu}/
vytvoříme
TestBundle.properties
- defaultní jazyková mutace. Když není specifiková jazyková mutace, nebo hláška není nalezena v některé konkrétní jazykové mutace, nebo požadovaná jazyková mutace neexistuje, tak se použije tato jazyková verze.
TestBundle_de.properties
- německá jazyková mutace
TestBundle_en.properties
- anglická jazyková mutace
test.value01=***
, *** je text v dané jazykové mutaci (ahoj, Hallo, hello)
test.value02=***
, *** je text v dané jazykové mutaci (soused, Nachbar, neighbour)
Máme připravené lokalizované texte, které budeme zobrazovat podle lokalizace uživatelského prohlížeče.
V adresáři pages
vytvoříme .jsp
soubor. Máme několik možností jak zobrazit lokalizované texty:
Locale locale = Locale.ENGLISH;
nebo Locale locale = new Locale("cs");
nebo jiným způsobem, který nám vyhovuje.
String bundle = jmeno-modulu + ".TestBundle";
ResourceBundle testBundle = PropertyResourceBundle.getBundle( bundle, locale );
<% page import="java.util.ResourceBundle, java.util.PropertyResourceBundle" %>
<%= testBundle.getString("test.value01") %>
Scriplet dáva více volnosti v tom jak zvolit zdroje. Je možné se napojit najednou na několik zdrojů a podobně. K tomu samému slouží i taglib
JSTL. Následující funguje v JSP bez problémů, bohužel OpenCMS si s tím neumělo poradit a tak je to jenom přání, aby to fungovalo.
V obou následujích případech předpokladám, že už máme získaný řetězec locale
.
taglib fmt
a to: <%@ taglib prefix="fmt" uri="http://java.sun.com/jstl/fmt" %>
. Přidáme do kontextu náš řetězec locale
: pageContext.setAttribute("locale", locale);
a můžeme definovat lokalizaci: <fmt:setLocale value="${locale}" />
. Teď už jenom definujeme zdroj <fmt:setBundle basename="cz.zcu.fav.kiv.TestBundle" />
a voláme naše lokalizované texty: <fmt:message key="test.value01" />
fmt
, která umožní použití direktív v definici locale
a to <%@ taglib prefix="fmt_rt" uri="http://java.sun.com/jstl/fmt_rt" %>
. Teď už můžeme použít: <fmt_rt:setLocale value="<%=locale%>" />
. Vše ostatní je stejné jako v předchozím bode.
Kdybychom chtěli definovat více basename
tak můžeme použít ještě atribut var
: <fmt:setBundle basename="cz.zcu.fav.kiv.TestBundle" var="test" />
a pak když hledáme hlášku, tak přídáme atribut: <fmt:message key="test.value01" bundle="${test}"/>
.
Když zadáte špatně zdroj, tak se místo lokalizovaného textu zobrazí text: ???test.value01???
. Když však zadáte špatně klíč, tak server reaguje trošku radikálněji a to chybovou hláškou a chybou 500.
Po každé úpravě *.properties
souborů je NUTNÉ restartovat server. Jinak classloader nezná *.properties
a zobrazí se 500, protože server vyhodil výjimku, že nezná nové klíče.
Když jen upravíte jazykové hlášky a nezměníte klíče, tak se bez restartu budou zobrazovat staré jazykové hlášky.
Ve verzi 6.2.2 sem narazil na napříjemné chování. Když zadáte escape sekvenci zanku v UTF-8 a místo \uXXXX
zadáte třeba \uXXX
, tak se vám už po restartu servru nepodaří přihlásit se a dostat se do systému.
V adresáři WEB-INF/classes/
si ale můžete najít posledně upravovaný properties
soubor přeložený do class
a tam ho smazat. Se štěstím se to povede. Bohužel se může stát, že dojde k revertu databáze podle poslední exportované verze.
Další možnost je dostat se do OpenCMS přez plugin do Eclipse? LaughingPanda a tam dohledat chybu a opravit ji, nebo se nabourat přímo do databáze (to ale budete muset být už opravdu zoufalí).