Při návrhu téměř každé reálné aplikace je nutno řešit problém její
internacionalizace. A protože rámec Spring je zde od toho, aby
usnadňoval implementaci často se opakujících funkcí, tak i v této
oblasti poskytuje programátorovi pomocnou ruku v podobě zdroje
zpráv (objekty s rozhraním
org.springframework.context.MessageSource). Jeho
úkolem je poskytovat parametrizované zprávy pro dané národní prostředí
(Locale).
Definice zdroje zpráv, která musí mít nutně název
messageSource, může vypadat takto:
<bean name="messageSource"
class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<property name="basename" value="WEB-INF/spring/messages" />
<property name="cacheSeconds" value="20" />
<property name="fileEncodings">
<props>
<prop key="WEB-INF/spring/messages_cs">UTF-8</prop>
<prop key="WEB-INF/spring/messages_en">UTF-8</prop>
<prop key="WEB-INF/spring/messages">UTF-8</prop>
</props>
</property>
</bean>
Tento příklad je opět převzat z přiložené
vzorové aplikace, konkrétně ze souboru
WEB-INF\spring\applicationContext-business.xml.
Třídou, kterou používáme, je
ReloadableResourceBundleMessageSource, jenž je
schopen oproti standardní implementaci
org.springframework.context.support.ResourceBundleMessageSource
ve stanoveném časovém intervalu pravidelně znovu načítat zprávy z
definovaných souborů.
Obě zmíněné implementace interně využívají klasické
internacionalizační architektury jazyka Java, tzn. třídy
java.util.ResourceBundle ve spolupráci se
standardním zpracováním zpráv poskytovaným třídou
java.text.MessageFormat. V naší definici jsme
pomocí atributu basename specifikovali umístění
našich properties souborů se zprávami, nastavili dvacetisekundový
interval znovunačítání zpráv a definovali kódování zmíněných properties
souborů.
Ke zprávám z definovaného zdroje zpráv pak lze snadno přistupovat
ze všech vrstev aplikace. V JSP/JSTL šablonách lze
využít standardní JSTL značku
fmt:message či značku
spring:message z obecné knihovny značek rámce Spring
(viz „Knihovny značek JSP“). V kontrolerech (viz „Kontrolery“), které rozšiřují jakoukoliv třídu z hierarchie
základních rámcem poskytnutých kontrolerů, lze použít následující
volání:
getMessageSourceAccessor().getMessage(...)
Objekt
manažerské (servisní, aplikační) vrstvy pak musí pro možnost stejného
volání rozšířit třídu
org.springframework.context.support.ApplicationObjectSupport.