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.

Les messages contenus dans les ressources peuvent être munis de paramètres.

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.

Principe de l'internationalisation

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 :

  1. Recherche d'une valeur dans les points d'extension ;
  2. Recherche d'une valeur dans le contexte courant ;
  3. Recherche d'une valeur dans les ressources par défaut du portail ;
  4. Génération d'un message générique.
Lorsque qu'un bundle de ressources n'est pas trouvé pour la langue de l'utilisateur, l'algorithme va rechercher dans le bundle de ressources de la langue par défaut du portail.

Interface du service

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.

Point d'extension

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 :

  • Clé à internationaliser : IInternationalizationService.CUSTOMIZER_ATTRIBUTE_KEY ;
  • Locale de l'utilisateur : IInternationalizationService.CUSTOMIZER_ATTRIBUTE_LOCALE ;
  • Valeur retournée par le mécanisme de customization : IInternationalizationService.CUSTOMIZER_ATTRIBUTE_RESULT.

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

Tag