Podpora lokalizace
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ř.:
1 public class MyModule extends CpsSpringModuleAbstract {2 3 protected String[] getDefaultModuleMessageSources() {4 return new String[] {5 "META-INF/lib_form/i18n/messages",6 "META-INF/lib_form/i18n/errors",7 "META-INF/lib_form/i18n/messages-inspector"8 };9 }10 11 /**12 * Tuto metodu netřeba přetěžovat - utf-8 je defaultní implementace. 13 */14 protected String getDefaultModuleMessageSourcesEncoding() {15 return "utf-8";16 }17 18}
Alternativně je možné uvést lokalizační soubory pomocí anotace:
1 @ModuleMessageSources({2 @ModuleMessageSource(resource = "com/fg/webapp/cps/v1/modules/spring/module_messages")3})4public class MyModule extends CpsSpringModuleAbstract {5 6 7}
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):
1 <localization>2 <bundle>storage:f.i18n:messages</bundle>3 <bundle>storage:f.i18n:messages-simpleForms</bundle> 4</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