L'internationalisation est native dans esup-commons. L'intérêt n'est pas seulement de fournir une application en plusieurs langages... L'externalisation de toutes les chaînes de caractères et la possibilité d'utiliser simultanément plusieurs fichiers de chaînes (les bundles) permettent de simplifier la personnalisation des applications par les administrateurs.
Sommaire :
...
| Sommaire |
|---|
...
...
Principes
Configuration
L'internationalisation est définie dans le fichier de configuration /properties/i18n/i18n.xml. On y trouvera par exemple :
| Bloc de code | ||||
|---|---|---|---|---|
| ||||
<bean id="i18nService" class="org.esupportail.commons.services.i18n.ResourceBundleMessageSourceI18nServiceImpl"> <property name="messageSource" ref="msgs" /> </bean> <bean id="msgs" class class="org.esupportail.commons.services.i18n.ReloadableResourceBundleMessageSource"> <!-- org.esupportail.commons.services.i18n.ReloadableResourceBundleMessageSource since 0.3.3 org.springframework.context.support.ReloadableResourceBundleMessageSource" before --> <property name="basenames"> <list> <value>classpath:properties/i18n/bundles/Custom</value> <value>classpath:properties/i18n/bundles/Messages</value> <value>classpath:properties/i18n/bundles/Commons</value> </list> </property> <property name="cacheSeconds" value="60" /> </bean> |
...
- Le nom du bean lui même est important car il est notamment utilisé dans les vues JSF
- La propriété basenames donne la liste des fichiers de messages à utiliser. Chaque valeur de la liste correspond au chemin du fichier de message dans le classpath. Par exemple, on cherchera pour la valeur Custom les fichiers Custom_<locale>.properties ou à défaut Custom.properties. Par convention, on groupera tous les fichiers de messages dans le répertoire /properties/i18n/bundles.
- La propriété cacheSeconds donne le délai en entre cache relecture des fichiers de messages
| Remarque |
|---|
Depuis la version 0.3.3 de EC2 la classe est de type org.esupportail.commons.services.i18n.ReloadableResourceBundleMessageSource et plus org.springframework.context.support.ReloadableResourceBundleMessageSource afin de supporter la méthode getStrings() du service i18n. |
Implémentations disponibles
...
| exercice | ||||||
|---|---|---|---|---|---|---|
| ||||||
Surcharger dans Custom_fr.properties une des entrées de Messages_fr.properties et tester.
|
Modification des fichiers de messages
Pour modifier les fichiers de messages il est recommandé d'utiliser Ressource Bundle Editor (RBE). Il permet notamment d'éditer plusieurs fichiers, correspondants à plusieurs langues, en même temps. Les messages enregistrés dans ces fichiers peuvent contenir des paramètres qui seront dynamiquement renseignés lors de l'exécution. Ces paramètres apparaissent dans les messages sous cette forme :
| Bloc de code |
|---|
{n}
|
avec n commençant à 0. Exemple :
| Bloc de code |
|---|
L''utilisateur {0} est maintenant gestionnaire du service {1}.
|
| Remarque |
|---|
Noter ci-dessus l'échappement des apostrophes lorsque la chaîne contient un ou plusieurs paramètres. |
| Bloc de code |
|---|
L''utilisateur {0} est maintenant gestionnaire du service {1,choice,0#annuaire|1#helpdesk}.
|
...
Dans le fichier faces-config.xml il faut ajouter à la définition de l'application l’application le resolver d'expression suivant :
...
| Bloc de code | ||||
|---|---|---|---|---|
| ||||
<h:outputText value="#{msgs\['DEEPLINKING_DEMO.GENERATE_URL.PARAM_NAME'\]}" /> |
Ajout d'un langage
L'ajout d'un langage se fait dans le fichier de configuration src/main/webapps/WEB-INF/jsf/faces-config.xml. Exemple :
| Bloc de code | ||||
|---|---|---|---|---|
| ||||
<locale-config>
<default-locale>fr</default-locale>
<supported-locale>fr</supported-locale>
<supported-locale>en</supported-locale>
</locale-config>
|
Il suffit ensuite d'écrire le bundle correspondant.
| exercice | ||||
|---|---|---|---|---|
| ||||
Ajouter le langage japonais et traduire tout esup-commons |
Spring MVC
| Avertissement |
|---|
TODO |
...
Accès depuis un contrôleur (Java)
Par héritage, toute classe (métier ou contrôleur) qui étend AbstractApplicationAwareBean bénéficie des services de AbstractI18nAwareBean et peut appeler ses méthodes d'internationalisation.
On utilise cela en particulier pour les messages (d'information ou d'erreur) lancés par les contrôleurs et affichés sur les vues JSF à l'aide de la balise <h:messages>. On utilisera par exemple :
| Bloc de code |
|---|
addErrorMessage(null, "MANAGERS.MESSAGE.USER_NOT_FOUND", userId);
|
On utilisera également cette fonctionnalité à toute autre fin en accédant directement aux fichiers de messages de cette manière :
| Bloc de code |
|---|
String msg = getString("MY.MESSAGE");
|
On peut également passer des paramètres à la méthode getString(), ainsi qu'une locale (si l'on souhaite une locale différente de la locale courante), qui est donnée par ma méthode getLocale().
Changement des messages d'erreur par défaut de JSF
Pour modifier les messages d'erreurs par défaut ou les internationaliser, il faut écrire un fichier JsfMessage_fr.properties dans le répertoire /properties/i18n/bundles et ajouter :
| Bloc de code |
|---|
<message-bundle>properties/i18n/bundles/JsfMessages</message-bundle>
|
...
Par exemple lorsque l'on utilise les validations implicites avec l'attribut required="true" au lieu d'avoir le message « une donnée est requise », on pourra avoir un message personnalisé en indiquant les messages suivants dans le fichier JsfMessages.properties :
| Bloc de code |
|---|
javax.faces.component.UIInput.REQUIRED = Erreur de validation javax.faces.component.UIInput.REQUIRED_detail = "et {0} alors !!! |
Spring MVC
Spring MVC nécessite que le bean implémentant MessageSource porte l'id messageSource. Dans l'exemple ci-dessus vous pouvez changer msgs en messageSource ou définir un alias :
| Bloc de code |
|---|
<alias name="msgs" alias="messageSource"/>
|
Ensuite dans la vue vous accédez aux messages avec ce type de code :
| Bloc de code |
|---|
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
<h1><spring:message code="title"/></h1>
<spring:message code="messageWithParam" arguments="${param1},${param2}"/>
|
