Skip to content

5. Exemplo 04 – Internacionalização

Este exemplo retoma a internacionalização abordada no primeiro exemplo.

5.1. O projeto NetBeans

Nele encontramos:

  • uma visualização [Page1.JSP]
  • dois arquivos de mensagens [messages*.properties]
  • nenhuma ação

5.2. Configuração do projeto

O arquivo [struts.xml] é o seguinte:


<?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>
  <!-- internacionalização -->
  <constant name="struts.custom.i18n.resources" value="messages" />
  <!-- pacote padrão -->
  <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>
  <!-- pacote de ações -->
  <package name="actions" namespace="/actions" extends="struts-default">
    <action name="Action1">
      <result name="success">/vues/Page1.JSP</result>
    </action>
  </package>
</struts>
  • a linha 8 define uma constante Struts, que determina o nome do arquivo de mensagens internacionalizadas, neste caso, messages. Os arquivos [messages_xx.properties] serão procurados no ClassPath do projeto. Por esse motivo, eles foram colocados aqui, na raiz de [Source Packages] e [1].
  • linhas 21-23: definem uma ação [Action1] sem classe associada. Será então utilizada uma classe padrão do Struts, cujo método execute retorna a chave success. A visualização [/vues/Page1.JSP] será então retornada ao cliente. É importante compreender que isso não é o mesmo que chamar diretamente a visualização [/vues/Page1.JSP]. De fato, a chamada de uma ação aciona a execução dos interceptadores, o que não ocorre na chamada direta a uma visualização. Um dos interceptadores gerencia a internacionalização.

5.3. Os arquivos de mensagens

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

Elas definem três chaves: page.texte, page.titre1 e page.titre2. O arquivo [messages_en.properties] será utilizado se o idioma da página for o inglês (en). O arquivo [messages.properties] será utilizado para todos os outros idiomas. Esse é o arquivo de mensagens padrão. O idioma utilizado é:

  • aquela do navegador do cliente, conforme suas preferências enviadas ao servidor
  • aquela solicitada por uma requisição do cliente com o parâmetro request_locale=xx.

5.4. A visualização [Page1.JSP]

A visualização é a seguinte:


<%@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>
  • linha 7: exibe a mensagem da chave page.titre1
  • linha 10: exibe a mensagem da chave page.titre2
  • linha 11: exibe a mensagem de chave page.texte

5.5. Os testes

Vamos executar o projeto:

  • no [1], a página foi exibida em francês. Foi utilizado o arquivo [messages.properties] porque o navegador utilizado tinha o francês como idioma preferencial.
  • no [3], a página foi exibida em inglês. Foi utilizado o arquivo [messages_en.properties] porque o URL [2] utilizou o parâmetro request_locale=en.

No [4], é solicitada uma página em alemão (de). Como não existe o arquivo [messages_de.properties], é utilizado o arquivo padrão [messages.properties] [5].

No [6], define-se o inglês como idioma preferencial do navegador.

No [7], a ação [Action1] é solicitada sem parâmetros de idioma. A solicitação vem de um navegador cujo idioma preferencial é o inglês (en). Portanto, é o arquivo [messages_en.properties] que é utilizado em vez de [8].

A partir de agora, todos os projetos terão um único arquivo [messages.properties], que será utilizado para todos os idiomas. Isso nos obrigará a escrever visualizações que utilizem as chaves desse arquivo. A internacionalização para o inglês consistirá em criar o arquivo [messages_en.properties] com as mensagens em inglês. Não há nenhuma outra alteração a ser feita.