Struts2 - Localisation, internationalisation (i18n)

L'internationalisation (i18n) est le processus de planification et de mise en œuvre de produits et de services afin qu'ils puissent facilement être adaptés aux langues et cultures locales spécifiques, un processus appelé localisation. Le processus d'internationalisation est appelé traduction ou activation de la localisation.

L'internationalisation est abrégée i18n parce que le mot commence par la lettre “i” et se termine par “n”, et il y a 18 caractères entre le premier i et le dernier n.

Struts2 fournit la localisation, c'est-à-dire la prise en charge de l'internationalisation (i18n) via des ensembles de ressources, des intercepteurs et des bibliothèques de balises aux endroits suivants -

  • Les balises UI

  • Messages et erreurs.

  • Au sein des classes d'action.

Bundles de ressources

Struts2 utilise des ensembles de ressources pour fournir plusieurs options de langue et de paramètres régionaux aux utilisateurs de l'application Web. Vous n'avez pas à vous soucier d'écrire des pages dans différentes langues. Tout ce que vous avez à faire est de créer un ensemble de ressources pour chaque langue souhaitée. Les ensembles de ressources contiendront des titres, des messages et d'autres textes dans la langue de votre utilisateur. Les ensembles de ressources sont le fichier qui contient les paires clé / valeur pour la langue par défaut de votre application.

Le format de dénomination le plus simple pour un fichier de ressources est -

bundlename_language_country.properties

Ici, bundlenamepeut être ActionClass, Interface, SuperClass, Model, Package, Global resource properties. Partie suivantelanguage_country représente les paramètres régionaux du pays par exemple, les paramètres régionaux espagnols (Espagne) sont représentés par es_ES et les paramètres régionaux anglais (États-Unis) sont représentés par en_US etc.

Lorsque vous référencez un élément de message par sa clé, le framework Struts recherche un ensemble de messages correspondant dans l'ordre suivant -

  • ActionClass.properties
  • Interface.properties
  • SuperClass.properties
  • model.properties
  • package.properties
  • struts.properties
  • global.properties

Pour développer votre application dans plusieurs langues, vous devez gérer plusieurs fichiers de propriétés correspondant à ces langues / paramètres régionaux et définir tout le contenu en termes de paires clé / valeur.

Par exemple, si vous envisagez de développer votre application pour l'anglais américain (par défaut), l'espagnol et le français, vous devrez créer trois fichiers de propriétés. Ici, je vais utiliserglobal.properties uniquement, vous pouvez également utiliser différents fichiers de propriétés pour séparer différents types de messages.

  • global.properties - Par défaut, l'anglais (États-Unis) sera appliqué

  • global_fr.properties - Cela sera utilisé pour les paramètres régionaux de Franch.

  • global_es.properties - Ceci sera utilisé pour les paramètres régionaux espagnols.

Accéder aux messages

Il existe plusieurs façons d'accéder aux ressources de message, notamment getText, la balise de texte, l'attribut clé des balises d'interface utilisateur et la balise i18n. Voyons-les en bref -

Afficher i18n texte, utilisez un appel pour getText dans la balise de propriété, ou toute autre balise, comme les balises d'interface utilisateur comme suit -

<s:property value = "getText('some.key')" />

le text tag récupère un message du groupe de ressources par défaut, c'est-à-dire struts.properties

<s:text name = "some.key" />

le i18n tagpousse un ensemble de ressources arbitraires sur la pile de valeurs. D'autres balises dans le cadre de la balise i18n peuvent afficher les messages de ce groupe de ressources.

<s:i18n name = "some.package.bundle">
   <s:text name = "some.key" />
</s:i18n>

le key l'attribut de la plupart des balises d'interface utilisateur peut être utilisé pour générer un message à partir d'un ensemble de ressources -

<s:textfield key = "some.key" name = "textfieldName"/>

Exemple de localisation

Laissez-nous cibler pour créer index.jspdu chapitre précédent en plusieurs langues. Le même fichier serait écrit comme suit -

<%@ page language = "java" contentType = "text/html; charset = ISO-8859-1"
   pageEncoding = "ISO-8859-1"%>
<%@ taglib prefix = "s" uri = "/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
"http://www.w3.org/TR/html4/loose.dtd">

<html>
   <head>
      <title>Employee Form with Multilingual Support</title>
   </head>

   <body>
      <h1><s:text name = "global.heading"/></h1>

      <s:url id = "indexEN" namespace="/" action = "locale" >
         <s:param name = "request_locale" >en</s:param>
      </s:url>
      
      <s:url id = "indexES" namespace="/" action = "locale" >
         <s:param name = "request_locale" >es</s:param>
      </s:url>
      
      <s:url id = "indexFR" namespace="/" action = "locale" >
         <s:param name = "request_locale" >fr</s:param>
      </s:url>

      <s:a href="%{indexEN}" >English</s:a>
      <s:a href="%{indexES}" >Spanish</s:a>
      <s:a href="%{indexFR}" >France</s:a>

      <s:form action = "empinfo" method = "post" namespace = "/">
         <s:textfield name = "name" key = "global.name" size = "20" />
         <s:textfield name = "age" key = "global.age" size = "20" />
         <s:submit name = "submit" key = "global.submit" />
      </s:form>

   </body>
</html>

Nous allons créer success.jsp fichier qui sera appelé en cas de retour de l'action définie SUCCESS.

<%@ page language = "java" contentType = "text/html; charset = ISO-8859-1"
	pageEncoding = "ISO-8859-1"%>
<%@ taglib prefix = "s" uri = "/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
   "http://www.w3.org/TR/html4/loose.dtd">

<html>
   <head>
      <title>Success</title>
   </head>
   
   <body>
      <s:property value = "getText('global.success')" />
   </body>
</html>

Ici, nous aurions besoin de créer les deux actions suivantes. (a) Première action a pour prendre soin des paramètres régionaux et afficher le même fichier index.jsp avec une langue différente (b) Une autre action consiste à prendre soin de soumettre le formulaire lui-même. Les deux actions renverront SUCCESS, mais nous prendrons des actions différentes en fonction des valeurs de retour car notre objectif est différent pour les deux actions

Action pour prendre soin des paramètres régionaux

package com.tutorialspoint.struts2;

import com.opensymphony.xwork2.ActionSupport;

public class Locale extends ActionSupport {
   public String execute() {
       return SUCCESS;
   }
}

Action pour soumettre le formulaire

package com.tutorialspoint.struts2;

import com.opensymphony.xwork2.ActionSupport;

public class Employee extends ActionSupport{
   private String name;
   private int age;
   
   public String execute() {
      return SUCCESS;
   }
   
   public String getName() {
      return name;
   }
   
   public void setName(String name) {
      this.name = name;
   }
   
   public int getAge() {
      return age;
   }
   
   public void setAge(int age) {
      this.age = age;
   }
}

Maintenant, créons les trois suivants global.properties fichiers et insérez les CLASSPATH -

global.properties

global.name = Name
global.age = Age
global.submit = Submit
global.heading = Select Locale
global.success = Successfully authenticated

global_fr.properties

global.name = Nom d'utilisateur 
global.age = l'âge
global.submit = Soumettre des
global.heading = Sé lectionnez Local
global.success = Authentifi	é  avec succès

global_es.properties

global.name = Nombre de usuario
global.age = Edad
global.submit = Presentar
global.heading = seleccionar la configuracion regional
global.success = Autenticado correctamente

Nous allons créer notre struts.xml avec deux actions comme suit -

<?xml version = "1.0" Encoding = "UTF-8"?>
<!DOCTYPE struts PUBLIC
   "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
   "http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>
   <constant name = "struts.devMode" value = "true" />
   <constant name = "struts.custom.i18n.resources" value = "global" />
   <package name = "helloworld" extends = "struts-default" namespace="/">
      <action name = "empinfo" 
         class = "com.tutorialspoint.struts2.Employee"
         method = "execute">
         <result name = "input">/index.jsp</result>
         <result name = "success">/success.jsp</result>
      </action>
      
      <action name = "locale" 
         class = "com.tutorialspoint.struts2.Locale"
         method = "execute">
         <result name = "success">/index.jsp</result>
      </action>
   </package>

</struts>

Voici le contenu de web.xml fichier -

<?xml version = "1.0" Encoding = "UTF-8"?>
<web-app xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
   xmlns = "http://java.sun.com/xml/ns/javaee"
   xmlns:web = "http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
   xsi:schemaLocation = "http://java.sun.com/xml/ns/javaee
   http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
   id = "WebApp_ID" version = "3.0">

   <display-name>Struts 2</display-name>
   <welcome-file-list>
      <welcome-file>index.jsp</welcome-file>
   </welcome-file-list>

   <filter>
      <filter-name>struts2</filter-name>
      <filter-class>
         org.apache.struts2.dispatcher.FilterDispatcher
      </filter-class>
   </filter>

   <filter-mapping>
      <filter-name>struts2</filter-name>
      <url-pattern>/*</url-pattern>
   </filter-mapping>
</web-app>

Maintenant, faites un clic droit sur le nom du projet et cliquez sur Export > WAR Filepour créer un fichier War. Déployez ensuite ce WAR dans le répertoire webapps de Tomcat. Enfin, démarrez le serveur Tomcat et essayez d'accéder à l'URLhttp://localhost:8080/HelloWorldStruts2/index.jsp. Cela produira l'écran suivant -

Maintenant, sélectionnez l'une des langues, disons que nous sélectionnons Spanish, il afficherait le résultat suivant -

Vous pouvez également essayer avec la langue française. Enfin, essayons de cliquerSubmit lorsque nous sommes dans les paramètres régionaux espagnols, il afficherait l'écran suivant -

Félicitations, maintenant que vous avez une page Web multilingue, vous pouvez lancer votre site Web dans le monde entier.