Olá!
Estou tentando colocar internacionalização no meu projeto.
Estou usando struts 2.1.6 e sei que pra fazer funcionar a internacionalização, preciso usar arquivos .properties, como faço para usar esses arquivos nas páginas?
obrigado!
Olá!
Estou tentando colocar internacionalização no meu projeto.
Estou usando struts 2.1.6 e sei que pra fazer funcionar a internacionalização, preciso usar arquivos .properties, como faço para usar esses arquivos nas páginas?
obrigado!
Olá ThiagoWorldCoder, tudo beleza ??
O Struts 2 possui internacionalização em vários níveis:
Global:
Você cria um arquivo properties com as chaves e valores que você precisa e no seu arquivo struts.properties informa o nome do arquivo na chave struts.custom.i18n.resources.
Ex.:
struts.custom.i18n.resources=arquivo1,arquivo2
Por classe de ação:
Dentro do pacote da ação você cria um arquivo NomeDaClasseAction.properties, assim para os métodos da classe NomeDaClasseAction serão utilizados os recursos presentes no arquivo properties.
Por pacote:
Dentro de um pacote você cria o arquivo package.properties, os recursos desse arquivo ficam visíveis a todas as classes de ação do pacote onde se encontra o arquivo.
Por interface ou classe base:
Basta criar um arquivo NomeDaClasse.properties ou NomeDaInterface.properties colocar no mesmo pacote da classe ou interface, assim, toda classe de ação que herdar a classe base ou implementar a interface poderá acessar os recursos desses arquivos properties.
Model Driven:
Se a sua classe de ação implementa a interface ModelDriven, ela também vai ter acesso a recursos definidos dentro de um arquivo NomeDaClasseModelo.properties
Tags para acessar aos recursos dos resource bundles.
Basta informar o nome da chave na propriedade name.
<s:text name=“chave.presente.no.arquivo.properties” />
outras tags
Dentro de qualquer outra tag, utilizando recursos da OGNL você pode acessar os valores presentes nos resource bundles utilizando o método getText(String chave).
<s:property value=“getText(‘chave.presente.no.arquivo.properties’)” />
Para carregar um resource bundle arbitrário utilize a tag .
<s:i18n name=“pacotes.da.aplicacao.nomeDoBundle” >
</s:i18n>
Obs: o interceptador I18nInterceptor tem de estar na pilha de interceptadores da aplicação.
Você pode achar mais informações aqui: http://struts.apache.org/2.1.6/docs/localization.html.
Acho que é isso que eu devo estar errando
Obs: o interceptador I18nInterceptor tem de estar na pilha de interceptadores da aplicação.
Tenho um interceptador lá… mas não deve estar utilizando esse interceptador!!
Valeu!!!
Se der certo eu aviso!!
Até agora não tinha dado nada certo, à não ser globalMessages que eu coloquei na mão!! Vamos ver se setando o interceptador dá certo!!!
valeu!
Como faço pra colocar esse interceptador na pilha de interceptadores?
Não está dando certo faz 3 dias… !!!
O Struts 2 fornece algumas pilhas de interceptadores padrão para serem utilizadas na sua aplicação, todas ficam definidas dentro do arquivo struts-default.xml que vem dentro do arquivo struts2.jar.
Depois de escolher uma basta definí-la no arquivo struts.xml da sua aplicação, como no exemplo abaixo.
[code]
<!-- definimos aqui a pilha i18n dá suporte aos interceptadores mais básicos e suporte a internacionalização, estes interceptadores vão valer para todas as actions dentro da tag package -->
<default-interceptor-ref name="i18nStack"/>
<action name="index" class="br.com.exemplo.IndexAction">
<result name="success">/index.jsp</result>
<!-- Aqui definimos uma pilha de interceptadores para esta ação apenas, a defaultStack compreende todos os interceptadores do Struts 2 -->
<interceptor-ref name="defaultStack"/>
</action>
</package>
[/code]
Por padrão se você não definir uma pilha de interceptadores para a sua aplicação utilizando a tag o Struts 2 irá utilizar a pilha defaultStack que utiliza todos os interceptadores inclusive o responsável pela internacionalização (que tem o nome i18n).
Existem várias outras pilhas que você pode utilizar basta consultar o arquivo struts-default.xml ou dar uma olhada nesta página:
http://struts.apache.org/2.1.6/docs/struts-defaultxml.html
Sobre a utilidade de cada interceptador consulte esta página:
http://struts.apache.org/2.1.6/docs/interceptors.html
Obs: se você não tinha definido nenhuma pilha de interceptadores a sua aplicação deveria estar utilizando a defaultStack e aceitando a internacionalização consequentemente, de uma olhada se na sua configuração de arquivos de propriedade globais está constando o nome e caminho correto para o arquivo, lembrando que não é necessário informar a extensão .properties.
Galera!!
As coisas estão melhorando!!
Criei os arquivos language.properties, language_pt_BR.properties e o arquivo language_en_US.properties
no language.properties só coloquei user=User
Em language_pt_BR coloquei user=Usuario (o acento não pegou ainda, deu um erro inexplicável!)
Em language_en_US coloquei user=User
O que fez ler o arquivo language foi o struts.properties que coloquei na pasta src também, nesse arquivo coloquei a seguinte propriedade:
struts.custom.i18n.resources=language
Isso foi o suficiente pra achar o arquivo language.properties.
Na minha página criei um link para cada bandeira, e cada uma passa uma propriedade para um action responsável por mudar o Locale, o action ficou assim:
package action;
import java.util.Locale;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class ServicesAction extends ActionSupport {
/**
*
*/
private static final long serialVersionUID = 1L;
private String language;
private String country;
private Locale locale;
public String changeLanguage() {
Locale[] locales = Locale.getAvailableLocales();
for(Locale locale: locales) {
if (locale.getLanguage().equals(language) && locale.getCountry().equals(country)) {
this.locale = locale;
Locale.setDefault(locale);
System.out.println(locale.getLanguage()+"_"+locale.getCountry());
// System.out.println(this.locale.getDisplayCountry());
}
}
ActionContext.getContext().setLocale(this.locale);
return SUCCESS;
}
public String getLanguage() {
return language;
}
public void setLanguage(String language) {
this.language = language;
}
public String getCountry() {
return country;
}
public void setCountry(String country) {
this.country = country;
}
}
a página ficou assim:
language.jsp
<%@ taglib prefix="s" uri="/struts-tags" %>
<%@ taglib prefix="sx" uri="/struts-dojo-tags" %>
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<div class="language">
<s:url id="pt" action="changeLanguage">
<s:param name="language">pt</s:param>
<s:param name="country">BR</s:param>
</s:url>
<s:url id="en" action="changeLanguage">
<s:param name="language">en</s:param>
<s:param name="country">US</s:param>
</s:url>
<sx:a cssClass="languageLogin" href="%{pt}" targets="language"><img class="languageImage" src="images/br.png" alt="Bandeira do Brasil" /></sx:a>
<sx:a cssClass="languageLogin" href="%{en}" targets="language"><img class="languageImage" src="images/usa.png" alt="Bandeira dos EUA" /></sx:a>
</div>
<%@ taglib prefix="s" uri="/struts-tags" %>
<%@ taglib prefix="sx" uri="/struts-dojo-tags" %>
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<div id="login">
<s:form action="Logar">
<s:textfield key="user" name="usuario" required="true" maxlength="20" size="20" />
<s:password label="Senha" name="senha" required="true" maxlength="20" size="20" />
<s:submit value="Entrar" />
<s:actionerror cssStyle="color:red;"/>
</s:form>
<s:url id="sendEmail" action="sendEmail">
<s:param name="usuario" />
<s:param name="senha" />
</s:url>
<sx:a cssStyle="color: red;" href="%{sendEmail}">Esqueceu a senha?</sx:a>
</div>
A página que chama as outras incluindo-as:
<%@ taglib prefix="s" uri="/struts-tags" %>
<%@ taglib prefix="sx" uri="/struts-dojo-tags" %>
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<link href="css/posicionamento.css" rel="stylesheet" type="text/css">
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title></title>
<sx:head />
</head>
<body>
<s:include value="language.jsp"/>
<s:include value="login.jsp"/>
</body>
</html>
O usuário está ficando com o nome Usuário… porque o locale está em pt_BR!! O problema é que ao escolher o en_US não muda para inglês o valor da key user que é User!!!
O que está faltando!!!
obrigado!!
Olha o seu código funcionou aqui, deve ser alguma configuração no struts.xml.
Um detalhe, acredito que vocẽ vá querer utilizar esse topo para troca de idioma em todas as páginas da sua aplicação, se for esse o caso é melhor (e mais elegante) vocẽ escrever um interceptor, ai você só precisa adicionar o seu interceptor de “troca de locale” na pilha de interceptors da sua aplicação.
Eu fiz uma adaptação da sua action em um interceptor:
[code] /*
package action;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
import java.util.Locale;
import javax.servlet.http.HttpServletRequest;
import org.apache.struts2.ServletActionContext;
/**
*
@author adriano
*/
public class LocaleInterceptor extends AbstractInterceptor {
private String language = “”;
private String country = “”;
private Locale locale = null;
@Override
public String intercept(ActionInvocation invocation) throws Exception {
HttpServletRequest request = ServletActionContext.getRequest();
if (request.getParameter("language") != null)
language = (String) request.getParameter("language");
if (request.getParameter("country") != null)
country = (String) request.getParameter("country");
Locale[] locales = Locale.getAvailableLocales();
for(Locale l: locales) {
if (l.getLanguage().equals(language) && l.getCountry().equals(country)) {
locale = l;
Locale.setDefault(locale);
}
}
if (locale != null)
ActionContext.getContext().setLocale(locale);
return invocation.invoke();
}
}[/code]
Segue o struts.xml com a configuração do novo interceptor:
[code]<?xml version="1.0" encoding="UTF-8" ?>
<package name="padrao" extends="struts-default">
<-- criando uma pilha de interceptadores que é pilha "defaultStack" + o interceptador que criamos -->
<interceptors>
<interceptor name="locale" class="action.LocaleInterceptor" />
<interceptor-stack name="gujStack">
<interceptor-ref name="locale"/>
<interceptor-ref name="defaultStack"/>
</interceptor-stack>
</interceptors>
<-- definido a sua pilha padrão de interceptors para a pilha que acabamos de criar -->
<default-interceptor-ref name="gujStack"/>
<action name="changeLanguage" method="changeLanguage" class="action.ServicesAction">
<result>/index.jsp</result>
</action>
<action name="invoker" method="execute" class="action.MinhaAction">
<result>/invoker.jsp</result>
</action>
</package>
[/code]
Deixe vazio o método changeLanguage da classe ServicesAction, e realize o teste, se funcionar dai em diante é só incluir os links dos idiomas nas páginas que suportarem internacionalização, mas ao invés dos links apontarem para uma ação específica eles podem apontar para a própria ação que foi executada, assim só irá ocorrer um reload da ação ao invés de sempre direcionar o usuário para uma ação/página específica.
Funcionou!!!
Muito obrigado à todos!!!