Skip to content

5. Ejemplo 04 – Internacionalización

Este ejemplo retoma la internacionalización estudiada en el primer ejemplo.

5.1. El proyecto NetBeans

Image

Image

En él encontramos:

  • una vista [Page1.jsp]
  • dos archivos de mensajes [messages*.properties]
  • sin acciones

5.2. Configuración del proyecto

El archivo [struts.xml] es el siguiente:


<?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>
  <!-- internacionalización -->
  <constant name="struts.custom.i18n.resources" value="messages" />
  <!-- paquete predeterminado -->
  <package name="default" namespace="/" extends="struts-default">
    <default-action-ref name="index" />
    <action name="index">
      <result type="redirectAction">
        <param name="actionName">Action1</param>
        <param name="namespace">/actions</param>
      </result>
    </action>
  </package>
  <!-- paquete de acciones -->
  <package name="actions" namespace="/actions" extends="struts-default">
    <action name="Action1">
      <result name="success">/vues/Page1.jsp</result>
    </action>
  </package>
</struts>
  • La línea 8 define una constante Struts, la que establece el nombre del archivo de mensajes internacionalizados, en este caso messages. Los archivos [messages_xx.properties] se buscarán en el ClassPath del proyecto. Por este motivo, se han colocado aquí, en la raíz de [Source Packages] [1].
  • Líneas 21-23: definen una acción [Action1] sin clase asociada. Se utilizará entonces una clase predeterminada de Struts cuyo método execute devuelve la clave success. A continuación, se devolverá la vista [/vues/Page1.jsp] al cliente. Es importante comprender que esto no es lo mismo que llamar directamente a la vista [/vues/Page1.jsp]. De hecho, la llamada a una acción activa la ejecución de los interceptores, algo que no ocurre con la llamada directa a una vista. Uno de los interceptores gestiona la internacionalización.

5.3. Los archivos de mensajes

messages.properties


page.texte=Ici, on met un texte fran\u00e7ais...
page.titre1=Fran\u00e7ais
page.titre2=Fran\u00e7ais

messages_en.properties


page.texte=Here, we put some english text...
page.titre1=English
page.titre2=English

Definen tres claves: page.texte, page.titre1 y page.titre2. El archivo [messages_en.properties] se utilizará si el idioma de la página es el inglés (en). El archivo [messages.properties] se utilizará para todos los demás idiomas. Este es el archivo de mensajes por defecto. El idioma utilizado es:

  • el del navegador del cliente en sus preferencias enviadas al servidor
  • la solicitada por una petición del cliente con el parámetro request_locale=xx.

5.4. La vista [Page1.jsp]

La vista es la siguiente:


<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html>
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title><s:text name="page.titre1"/></title>
  </head>
  <body>
    <h1><s:text name="page.titre2"/></h1>
    <s:text name="page.texte"/>
  </body>
</html>
  • línea 7: muestra el mensaje de clave page.titre1
  • línea 10: muestra el mensaje de clave page.titre2
  • línea 11: muestra el mensaje de clave page.texte

5.5. Las pruebas

Ejecutemos el proyecto:

  • en [1], la página se mostró en francés. Se utilizó el archivo [messages.properties] porque el navegador utilizado tenía el francés como idioma preferido.
  • en [3], la página se ha mostrado en inglés. Se ha utilizado el archivo [messages_en.properties] porque la URL [2] ha utilizado el parámetro request_locale=en.

En [4], se solicita una página en alemán (de). Como no existe el archivo [messages_de.properties], se utiliza el archivo predeterminado [messages.properties] [5].

En [6], se establece el inglés como idioma preferido del navegador.

En [7], se solicita la acción [Action1] sin parámetros de idioma. La solicitud procede de un navegador cuyo idioma preferido es el inglés (en). Por lo tanto, se utiliza el archivo [messages_en.properties] [8].

A partir de ahora, todos los proyectos tendrán un único archivo [messages.properties] que se utilizará para todos los idiomas. Esto nos obligará a escribir vistas que utilicen las claves de este archivo. Internacionalizar al inglés equivaldrá a crear el archivo [messages_en.properties] de los mensajes en inglés. No hay que realizar ningún otro cambio.