Internationalisation

Nous avons déjà vu qu'un navigateur web pouvait être configuré avec une langue par défaut, et que cette langue est transmise au serveur dans les flux HTTP de requête. Nous avons également vu que cette langue était exposée dans les méthodes de la requête. On peut donc facilement imaginer un mécanisme, dans lequel une application web prendrait cette langue en compte pour afficher ses pages dans la bonne langue, celle du navigateur, automatiquement.

Une application internationalisée est une application qui a la capacité de d'afficher ses pages dans différentes langues, et de choisir celle du navigateur, quand elle existe, automatiquement. Ce mécanisme repose entre autres, sur les ResourceBundle définis dans le JDK.

Un ResourceBundle est un jeu de fichiers texte, qui suit une convention de nommage précise, et qui est rangé dans un même package. Le premier de ces fichiers texte porte le nom du bundle, par exemple : org.paumard.bundles.ApplicationBundle. Ce fichier doit alors porter le nom ApplicationBundle.properties, et être rangé dans le package org.paumard.bundles.

Ce fichier est un fichier texte, qui contient des paires clés / valeurs, ligne par ligne.

On peut compléter ce bundle avec d'autres fichiers, dans des langues différentes. Ces autres fichiers doivent suivre la convention de nommage suivante : on ajoute au nom le suffixe _fr, _en, etc... où les caractères qui suivent _ désignent le code de la langue de ce fichier. Dans notre exemple, le fichier ApplicationBundle_fr.properties aura même contenu que le fichier racine, et le contenu du fichier ApplicationBundle_en.properties sera en anglais.

On peut ainsi créer des fichiers en espagnol (_es), en allemand (_de), en italien (_it), etc... À chaque fois, le fichier doit contenir les mêmes clés, et des valeurs dans la langue désignée.

En Java, un bundle s'utilise de la façon suivante.

On peut charger un bundle en passant à la méthode getBundle() la langue (locale) dans laquelle on veut charger ce bundle. Si cette langue n'est pas définie, alors le bundle racine sera chargé. Notons que l'on peut lire la langue dans laquelle la JVM s'exécute en invoquant la méthode Locale.getDefault().

On imagine donc assez bien, à partir de cet exemple simple, comment l'internationalisation d'une application web va pouvoir fonctionner.

L'internationalisation est gérée par les éléments de la librairie de tags standard fmt. Cette librairie est chargée de la façon suivante.

Examinons l'exemple suivant.

Voici le contenu du bundle associé.

Tout d'abord, remarquons que la déclaration d'un bundle suit la même syntaxe que dans une application Java classique : un bundle est désigné par son nom en tant que ressource.

Remarquons ensuite que les éléments qui dépendent d'un bundle donné doivent être déclarés comme sous-éléments de l'élément bundle.

La librairie de tags fmt nous donne un tag, message, qui permet de désigner une clé de ce bundle, et de l'afficher. Bien sûr, le message affiché est celui de la langue choisie par le système, ou explicitement.

Les deux premiers messages de notre bundle sont des messages simples : first-name et last-name. En revanche, notre dernier message est en fait un format, qui déclare deux paramètres {0} et {1}. Fixer les paramètres de ce message, se fait ajoutant des sous-élément param à l'élément message.