Aller au contenu

i18n : Internationnalisation

C’est quoi ?

L’internationalisation, i18n pour les intimes ! Il y a 18 lettres entre le i et le n du mot internationalisation : C’est le processus de conception et de développement d’une application qui peut être facilement adaptée à différents pays et langues.

En Java, cela se fait généralement en utilisant les classes de la bibliothèque java.util.Locale et java.text.MessageFormat. J’ai développé cette partie avec la classe ResourseBundle dans la partie swing pour gérer le multi-langue d’une interface graphique en utilisant des fichiers .properties.

Comment l’utiliser ?

étapes

Exemple de code :

Locale locale = Locale.getDefault();
ResourceBundle messages = ResourceBundle.getBundle("Messages", locale);
String message = messages.getString("welcomeMessage");
Object[] params = {"John", "Paris"};
String formattedMessage = MessageFormat.format(message, params);
System.out.println(formattedMessage);

Dans cet bout de code, le fichier de propriétés approprié (Messages_fr_FR.properties par exemple) sera chargé en fonction de la langue et du pays de l’utilisateur (obtenus grâce à Locale.getDefault()). Le message de bienvenue sera récupéré dans ce fichier de propriétés et formatté en utilisant les valeurs de params.

Le résultat final sera affiché dans la console.

L’internationalisation est utile lorsque vous voulez créer une application qui peut être utilisée dans différents pays et langues, mais elle peut être complexe à mettre en place et à maintenir.

Pour un site web : est-ce la meilleure solution ?

Oui et non, (une réponse de Normand, je sais) i18n est effectivement bien pratique pour les sites web qui doivent être traduits dans de nombreuses langues. En utilisant les classes vues plus haut.

Il existe également d’autres manières de faire de l’internationnalisation pour les sites web (en Java).

Remarque : L’i18n peut être une tâche complexe et fastidieuse, en particulier lorsque vous prenez en charge de nombreuses langues et pays. Il faut choisir une approche qui convient le mieux à vos besoins en matière de traduction et de gestion de contenu. C’est du boulot !

i18n & SpringBoot

Vous avez de la chance, Spring Boot offre un support intégré pour l’internationalisation (i18n) des applications web.

Il suffit d’ajouter les dépendances suivantes à votre fichier pom.xml pour les fans de maven ou build.gradle pour les autres (comme moi) !

On suppose, ici, l’utilisation du template Thymeleaf 3.1.1

<dependencies>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
  </dependency>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-thymeleaf</artifactId>
  </dependency>
</dependencies>
dependencies {
  implementation 'org.springframework.boot:spring-boot-starter-web'
  implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
}

Principe : Chaque fichier .properties contiendra les chaînes de caractères traduites pour une langue et un pays, jusque là, rien ne change.

Vous devez définir la langue par défaut de votre application dans le fichier de propriétés principal application.properties

spring.messages.basename=messages
spring.messages.encoding=UTF-8
spring.messages.fallback-to-system-locale=true

Dans SpringBoot, il suffit d’utiliser la classe org.springframework.context.MessageSource pour charger les chaînes de caractères traduites dans les fichiers properties.

@Autowired
private MessageSource messageSource;
public String getMessage(String code, Object[] args, Locale locale) {
  return messageSource.getMessage(code, args, locale);
}

ou bien dans vos templates Thymeleaf :

#{message.code} 

configuration avec Tiles (Apache)

dans votre build.gradle :

dependencies {
  implementation 'org.springframework.boot:spring-boot-starter-web'
  implementation 'org.apache.tiles:tiles-jsp:3.0.8'
  implementation 'org.apache.tiles:tiles-extras:3.0.8'
  implementation 'org.apache.tiles:tiles-servlet:3.0.8'
  implementation 'org.apache.tiles:tiles-template:3.0.8'
}

Créez un fichier de configuration Tiles nommé tiles.xml dans le répertoire src/main/resources de votre projet. Définissez les gabarits que vous souhaitez utiliser dans ce fichier.

Exemple :

<tiles-definitions>
  <definition name="base.definition" template="/WEB-INF/layouts/layout.jsp">
    <put-attribute name="title" value="My App" />
    <put-attribute name="header" value="/WEB-INF/views/header.jsp" />
    <put-attribute name="menu" value="/WEB-INF/views/menu.jsp" />
    <put-attribute name="body" value="" />
    <put-attribute name="footer" value="/WEB-INF/views/footer.jsp" />
  </definition>
</tiles-definitions>

A vous de faire vos recherches si vous souhaitez utiliser ce framework !