Podpora lokalizace
Do Springové podpory v modulárním systému je zaintegrovaná podpora lokalizace pro moduly. Vše je postaveno na
org.springframework.context.support.ReloadableResourceBundleMessageSource,
který sám o sobě splňuje většinu požadavků, které na lokalizační mechanismy máme.
Předně je to možnost psát lokalizované texty přímo v kódovaných plain textových souborech bez nutnosti používání native2ascii, podpora hierarchického hledání, podpora autorefreshe a další.
Pro použití je nutné aby váš modul implementoval další rozhranní navíc
LocalizedCpsSpringModule, které definuje jedinou metodu getMessageSource, vracející patřičnou implementaci pro váš modul.
Typicky ovšem používejte předporgramovanou implementaci z abstraktní třídy CpsSpringModuleAbstract, která tuto metodu
implementuje tak, že vrací přímo aplikační kontext modulu (tj. vrací stejnou referenci, kterou dostanete pokud ve svých
beanách implementujete Spring interface MessageSourceAware).
Defaultní implementace v CpsSpringModuleAbstract potom do svého kontextu registruje speciální message source
ReloadableResourceBundleMessageSource odvozený od standardních Springových implementací - tuto implementaci je možné
změnit překrytím metody getReloadableResourceBundleMessageSource().
Standardní implementací tohoto rozhraní je
ModuleReloadableResourceBundleMessageSource, nicméně například RamJet modul poskytuje vlastní implementaci pro debug/test
prostředí InspectableReloadableResourceBundleMessageSourceImpl, která umožňuje monitorovat, které klíče jsou při
vykreslování konkrétní stránky požadovány a v jakých bundlech jsou případně uložené vyhodnocené texty.
Jak již bylo uvedeno výše, do aplikačního kontextuje je tedy automaticky doplněna beana s názvem MessageSource. Tato
beana má specifikovaný nadřízený MessageSource, který obsahuje data z property souborů na classpath, které jsou
specifikovány v metodě getDefaultModuleMessageSources() načtené pomocí kódování vrácené v metodě
getDefaultModuleMessageSourcesEncoding() - např.:
public class MyModule extends CpsSpringModuleAbstract {
protected String[] getDefaultModuleMessageSources() { return new String[] { "META-INF/lib_form/i18n/messages", "META-INF/lib_form/i18n/errors", "META-INF/lib_form/i18n/messages-inspector" }; } /** * Tuto metodu netřeba přetěžovat - utf-8 je defaultní implementace. */ protected String getDefaultModuleMessageSourcesEncoding() { return "utf-8"; } }Alternativně je možné uvést lokalizační soubory pomocí anotace:
@ModuleMessageSources({ @ModuleMessageSource(resource = "com/fg/webapp/cps/v1/modules/spring/module_messages")})public class MyModule extends CpsSpringModuleAbstract {
}MessageSource jako takový potom obsahuje data z property souborů definovaných v těle modulu pomocí XML snippetu (jako kódování se bere defaultní kódování CPS specifikované v sitemap):
<localization> <bundle>storage:f.i18n:messages</bundle> <bundle>storage:f.i18n:messages-simpleForms</bundle> </localization>Pro získávání message sourců platí stejná logika, která je zdokumentovaná pro SpringFramework. Tj. pokud potřebujete
v beanách získat nějaký lokalizovaný text, implementujte rozhranní MessageSourceAware a potom se standardním způsobem
zeptejte na lokalizovaný text pro konkrétní klíč.
Takto realizovaná lokalizovanost modulů má následující výhody:
- všechny výhody, které přináší ReloadableResourceBundleMessageSource Springu
- možnost definovat v modulu safe-defaults na classpath - tj. minimalizace chyb cílového vývojáře kvůli chybějící lokalizované hlášce
- možnost odlišit kódování default lokalizovaných souborů od implementačních pro konkrétní projekt (možnost ovlivnění ze sitemap.xml)
- automatické přizpůsobení refresh intervalu podle běhového režimu (viz. následující kapitoly)
- není nutné nic vymýšlet a funguje to dobře
