Code Beispiel

Wiederverwendbare Codes

Know-how

I18N, ResourceBundle in AEM 6.1/6.2

Text Translations werden in AEM über i18n realisiert.

In AEM 6.1/6.2 lassen sich Translations über Java (OSGI) nicht aus dem ResouceBundle auslesen. Wir zeigen einen Workaround mit SlingBindings.


In HTL (HTML Template Language) werden i18n Keys über folgenden Ausdruck ausgewertet:

${'any-text' @ i18n}

Als Ergebnis wird die jeweilige (definierte) Sprachübersetzung angezeigt.

Wenn über Java (OSGI Bundles) auf Translations zugegriffen wird, erfolgt dies über das ResourceBundle:

Locale locale = currentPage.getLanguage(false);
ResourceBundle resourceBundle = slingRequest.getResourceBundle(locale);
I18n i18n = new I18n(resourceBundle);
String translation = i18n.get(key);

In AEM 6.1/6.2 kommt es vor, dass der Aufruf von slingRequest.getResourceBundle(locale) ein Object vom Typ org.apache.sling.engine.impl.helper.NullResourceBundle zurück gibt.

Das hier ein NullResourceBundle zurück geliefert wird liegt daran, dass nicht der eigentliche SlingHttpServletRequest Objekt injiziert wurde sondern ein Wrapper Object, welches das ResourceBundle nicht kennt.

Als Workaround kann über die SlingBindings auf das original HttpServletRequest Objekt zugegriffen und darüber die korrekte Resource geladen werden:

SlingBindings bindings = (SlingBindings) request.getAttribute(SlingBindings.class.getName());
if (bindings != null) {
    resourceBundle = bindings.getRequest().getResourceBundle(locale);
    I18n i18n = new I18n(resourceBundle);
    String translation = i18n.get(key);
}