Le service d'internationalisation permet de gérer facilement l'accès aux ressources en fonction de la langue de l'utilisateur et du contexte.
Ce service dispose d'un point d'extension permettant de personnaliser certains résultats en fonction du contexte.
Pour y accéder à partir d'une page JSP, une librairie de tags a également été ajoutée.
L'algorithme du service consiste à recherche pour une clé donnée la valeur la plus pertinente possible, en fonction du contexte et de la langue de l'utilisateur. Il permet également d'éviter la levée d'exceptions MissingResourceException lorsque la ressource n'est pas trouvée.
Les étapes sont les suivantes :
L'interface du service d'internationalisation est org.osivia.portal.api.internationalization.IInternationalizationService, disponible dans l'API du portail. Les méthodes fournies sont les suivantes :
IBundleFactory getBundleFactory(ClassLoader classLoader);
String getString(String key, Locale locale, Object... args);
String getString(String key, Locale locale, ClassLoader classLoader, Object... args);
Les méthodes getString permettent d'accéder directement aux ressources.
La méthode getBundleFactory permet de récupérer une factory des bundles de ressources afin d'éviter de devoir conserver le class loader du contexte courant. L'interface org.osivia.portal.api.internationalization.IBundleFactory présente la méthode suivante :
Bundle getBundle(Locale locale);
Cette méthode permet d'accès aux ressources de la langue désirée, sans avoir à fournir le contexte. L'objet Bundle propose alors une méthode getString faisant appel à celle du service d'internationalisation.
Le service d'internationalisation reprend le mécanisme générique des customizers. Pour étendre ou modifier des clés à internationaliser, il suffit alors de créer un portlet technique implémentant l'interface des customizers, et dont l'identifiant de customization est IInternationalizationService.CUSTOMIZER_ID.
Les attributs du contexte de customization sont les suivants :
Exemple d'implémentation du service de customization :
public void customize(String customizationId, CustomizationContext context) {
Map<String, Object> attributes = context.getAttributes();
String key = (String) attributes.get(IInternationalizationService.CUSTOMIZER_ATTRIBUTE_KEY);
Locale locale = (Locale) attributes.get(IInternationalizationService.CUSTOMIZER_ATTRIBUTE_LOCALE);
if (StringUtils.isNotBlank(key) && (locale != null)) {
try {
ResourceBundle resourceBundle = ResourceBundle.getBundle(RESOURCE_BUNDLE_NAME, locale);
String result = resourceBundle.getString(key);
attributes.put(IInternationalizationService.CUSTOMIZER_ATTRIBUTE_RESULT, result);
} catch (MissingResourceException e) {
// Do nothing
}
}
}