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ř.:

java
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:

java
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):

xml
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