Edee.one · Dokumentace

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

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

xml
<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