Struts2 - Localización, internacionalización (i18n)

La internacionalización (i18n) es el proceso de planificación e implementación de productos y servicios para que puedan adaptarse fácilmente a idiomas y culturas locales específicos, un proceso llamado localización. El proceso de internacionalización se denomina habilitación de traducción o localización.

La internacionalización se abrevia i18n porque la palabra empieza con la letra “i” y termina con “n”, y hay 18 caracteres entre la primera i y la última n.

Struts2 proporciona soporte de localización, es decir, internacionalización (i18n) a través de paquetes de recursos, interceptores y bibliotecas de etiquetas en los siguientes lugares:

  • Las etiquetas de la interfaz de usuario

  • Mensajes y errores.

  • Dentro de las clases de acción.

Paquetes de recursos

Struts2 utiliza paquetes de recursos para proporcionar múltiples opciones de idioma y configuración regional a los usuarios de la aplicación web. No necesita preocuparse por escribir páginas en diferentes idiomas. Todo lo que tiene que hacer es crear un paquete de recursos para cada idioma que desee. Los paquetes de recursos contendrán títulos, mensajes y otro texto en el idioma de su usuario. Los paquetes de recursos son el archivo que contiene los pares clave / valor para el idioma predeterminado de su aplicación.

El formato de nomenclatura más simple para un archivo de recursos es:

bundlename_language_country.properties

Aquí, bundlenamepodría ser ActionClass, Interface, SuperClass, Model, Package, Global resource properties. Parte siguientelanguage_country representa la configuración regional del país, por ejemplo, la configuración regional en español (España) está representada por es_ES, y la configuración regional en inglés (Estados Unidos) está representada por en_US, etc., donde puede omitir la parte del país, que es opcional.

Cuando hace referencia a un elemento de mensaje por su clave, el marco de Struts busca un paquete de mensajes correspondiente en el siguiente orden:

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

Para desarrollar su aplicación en varios idiomas, debe mantener varios archivos de propiedades correspondientes a esos idiomas / configuración regional y definir todo el contenido en términos de pares clave / valor.

Por ejemplo, si va a desarrollar su aplicación para inglés estadounidense (predeterminado), español y francés, deberá crear tres archivos de propiedades. Aquí lo usaréglobal.properties sólo archivo, también puede hacer uso de diferentes archivos de propiedades para segregar diferentes tipos de mensajes.

  • global.properties - Por defecto, se aplicará el inglés (Estados Unidos)

  • global_fr.properties - Esto se utilizará para la configuración regional de Franch.

  • global_es.properties - Esto se utilizará para la configuración regional en español.

Accede a los mensajes

Hay varias formas de acceder a los recursos del mensaje, incluido getText, la etiqueta de texto, el atributo clave de las etiquetas de la interfaz de usuario y la etiqueta i18n. Veámoslos en breve -

Para mostrar i18n texto, usa una llamada para getText en la etiqueta de propiedad, o cualquier otra etiqueta, como las etiquetas de la interfaz de usuario de la siguiente manera:

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

los text tag recupera un mensaje del paquete de recursos predeterminado, es decir, struts.properties

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

los i18n tagempuja un paquete de recursos arbitrario a la pila de valor. Otras etiquetas dentro del alcance de la etiqueta i18n pueden mostrar mensajes de ese paquete de recursos

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

los key El atributo de la mayoría de las etiquetas de IU se puede utilizar para generar un mensaje a partir de un paquete de recursos:

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

Ejemplo de localización

Apuntemos a crear index.jspdel capítulo anterior en varios idiomas. El mismo archivo se escribiría de la siguiente manera:

<%@ 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>

Nosotros crearemos success.jsp archivo que se invocará en caso de que la acción definida regrese 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>

Aquí necesitaríamos crear las siguientes dos acciones. (a) Primera acción a para cuidar de Locale y mostrar el mismo archivo index.jsp con un idioma diferente (b) Otra acción es encargarse de enviar el formulario en sí. Ambas acciones devolverán SUCCESS, pero tomaremos diferentes acciones basadas en los valores de retorno porque nuestro propósito es diferente para ambas acciones.

Acción para cuidar la configuración regional

package com.tutorialspoint.struts2;

import com.opensymphony.xwork2.ActionSupport;

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

Acción para enviar el formulario

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

Ahora creemos los siguientes tres global.properties archivos y poner el CLASSPATH -

propiedades.globales

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

Crearemos nuestro struts.xml con dos acciones de la siguiente manera:

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

A continuación se muestra el contenido de web.xml archivo -

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

Ahora, haga clic derecho en el nombre del proyecto y haga clic en Export > WAR Filepara crear un archivo War. Luego, implemente este WAR en el directorio de aplicaciones web de Tomcat. Finalmente, inicie el servidor Tomcat e intente acceder a la URLhttp://localhost:8080/HelloWorldStruts2/index.jsp. Esto producirá la siguiente pantalla:

Ahora seleccione cualquiera de los idiomas, digamos que seleccionamos Spanish, mostraría el siguiente resultado:

También puedes probar con el idioma francés. Finalmente, intentemos hacer clicSubmit Cuando estemos en Español Locale, mostraría la siguiente pantalla -

Felicitaciones, ahora que tiene una página web multilingüe, puede lanzar su sitio web a nivel mundial.