Utilizando a API do Contexto de Internacionalização
Os aplicativos clientes EJB (Enterprise JavaBeans), os servlets e os enterprise beans podem obter e gerenciar programaticamente o contexto de internacionalização utilizando a API do contexto de internacionalização. Para aplicativos de cliente de serviço da Web, utilize a API para obter e gerenciar o contexto de internacionalização da mesma forma que para clientes EJB.
Antes de Iniciar
Os pacotes java.util e com.ibm.websphere.i18n.context contêm todas as classes necessárias para usar o serviço de internacionalização em um aplicativo EJB.
Procedimento
Resultados
Os componentes resultantes devem usar AMI (Application-Managed Internationalization). Para obter informações adicionais sobre AMI, consulte Contexto de Internacionalização: Critérios de Gerenciamento.
Exemplo
Gerenciando contexto de internacionalização em um programa cliente EJB: O exemplo de código a seguir ilustra como usar a API de contexto de internacionalização em um programa cliente EJB ou um programa cliente de serviço da Web contidos.
//------------------------------------------
// Exemplo Básico: Cliente EJB J2EE.
//------------------------------------------
package examples.basic;
//------------------------------------------
// SERVIÇO DE INTERNACIONALIZAÇÃO: Importações.
//------------------------------------------
import com.ibm.websphere.i18n.context.UserInternationalization;
import com.ibm.websphere.i18n.context.Internationalization;
import com.ibm.websphere.i18n.context.InvocationInternationalization;
import javax.naming.InitialContext;
import javax.naming.Context;
import javax.naming.NamingException;
import java.util.Locale;
import java.util.SimpleTimeZone;
public class EjbClient {
public static void main(String args[]) {
//--------------------------------------------------
// SERVIÇO DE INTERNACIONALIZAÇÃO: Referências de API.
//--------------------------------------------------
UserInternationalization userI18n = null;
Internationalization callerI18n = null;
InvocationInternationalization invocationI18n = null;
//--------------------------------------------------
// SERVIÇO DE INTERNACIONALIZAÇÃO: Nome JNDI.
//--------------------------------------------------
final String UserI18NUrl =
"java:comp/websphere/UserInternationalization";
//--------------------------------------------------
// SERVIÇO DE INTERNACIONALIZAÇÃO: Resolver a API.
//--------------------------------------------------
try {
Context initialContext = new InitialContext();
userI18n = (UserInternationalization)initialContext.lookup(
UserI18NUrl);
callerI18n = userI18n.getCallerInternationalization();
invI18n = userI18n.getInvocationInternationalization ();
} catch (NamingException ne) {
log("Erro: Impossível resolver UserInternationalization: Exceção: " + ne);
} catch (IllegalStateException ise) {
log("Erro: UserInternationalization não está disponível: " + ise);
}
...
//--------------------------------------------------------------------
// SERVIÇO DE INTERNACIONALIZAÇÃO: Definir contexto de chamada.
//
// Sob o AMI (Application-Managed Internationalization), os programas clientes
// EJB incluídos podem definir elementos de contexto de chamada. Os dois
// a seguir associam o locale e o fuso horário fornecidos da chamada
// com o encadeamento atual. Chamadas subseqüentes do método de bean remoto
// propagarão esses elementos de contexto.
//--------------------------------------------------------------------
try {
invocationI18n.setLocale(new Locale("fr", "FR", ""));
invocationI18n.setTimeZone("ECT");
} catch (IllegalStateException ise) {
log("An anomaly occurred accessing Invocation context: " + ise );
}
...
//--------------------------------------------------------------------
// SERVIÇO DE INTERNACIONALIZAÇÃO: Obter locale e fuso horário.
//
// Sob o AMI, os programas clientes EJB incluídos podem obter os elementos de
// contexto de responsável pela chamada e de chamada associados ao encadeamento atual.
// As quatro instruções a seguir retornam o locale e o fuso horário da chamada
// associados acima e o locale e o fuso horário do responsável pela chamada
// associados internamente pelo serviço. Obter um elemento de contexto de responsável
// pela chamada em um cliente incluído resulta no elemento padrão da JVM.
//--------------------------------------------------------------------
Locale invocationLocale = null;
SimpleTimeZone invocationTimeZone = null;
Locale callerLocale = null;
SimpleTimeZone callerTimeZone = null;
try {
invocationLocale = invocationI18n.getLocale();
invocationTimeZone =
(SimpleTimeZone)invocationI18n.getTimeZone();
callerLocale = callerI18n.getLocale();
callerTimeZone = SimpleTimeZone)callerI18n.getTimeZone();
} catch (IllegalStateException ise) {
log("An anomaly occurred accessing I18n context: " + ise );
}
...
} // main
...
void log(String s) {
System.out.println (((s == null) ? "nulo" : s));
}
} // EjbClient
Gerenciando contexto de internacionalização em um servlet: O exemplo de código a seguir ilustra como utilizar a API de contexto de internacionalização em um servlet. Anote os comentários nos métodos init e doPost.
...
//--------------------------------------------------------------------
// SERVIÇO DE INTERNACIONALIZAÇÃO: Importações.
//--------------------------------------------------------------------
import com.ibm.websphere.i18n.context.UserInternationalization;
import com.ibm.websphere.i18n.context.Internationalization;
import com.ibm.websphere.i18n.context.InvocationInternationalization;
import javax.naming.InitialContext;
import javax.naming.Context;
import javax.naming.NamingException;
import java.util.Locale;
public class J2eeServlet extends HttpServlet {
...
//------------------------------------------------------------------
// SERVIÇO DE INTERNACIONALIZAÇÃO: Referências de API.
//------------------------------------------------------------------
protected UserInternationalization userI18n = null;
protected Internationalization i18n = null;
protected InvocationInternationalization invI18n = null;
//------------------------------------------------------------
// SERVIÇO DE INTERNACIONALIZAÇÃO: Nome JNDI.
//------------------------------------------------------------
public static final String UserI18NUrl =
"java:comp/websphere/UserInternationalization";
protected Locale callerLocale = null;
protected Locale invocationLocale = null;
/**
* Inicializar este servlet.
* Resolver referências ao contexto inicial JNDI e à
* API do contexto de internacionalização.
*/
public void init() throws ServletException {
//------------------------------------------------------------------
// SERVIÇO DE INTERNACIONALIZAÇÃO: Resolver a API.
//
// Sob o CMI (Container-Managed Internationalization), os servlets possuem
// acesso apenas leitura aos elementos do contexto de chamada. As tentativas de
// definir esses elementos resultam em um IllegalStateException.
//
// Sugestão: armazene em cache todas as referências à API do contexto de
// internacionalização uma vez, durante a inicialização e utilize-as
// em todo o ciclo de existência do servlet.
//------------------------------------------------------------------
try {
Context initialContext = new InitialContext();
userI18n = (UserInternationalization)initialContext.lookup(UserI18nUrl);
callerI18n = userI18n.getCallerInternationalization();
invI18n = userI18n.getInvocationInternationalization();
} catch (NamingException ne) {
throw new ServletException("Cannot resolve UserInternationalization" + ne);
} catch (IllegalStateException ise) {
throw new ServletException ("Error: UserInternationalization is not
available: " + ise);
}
...
} // init
/**
* Processar pedidos de entrada GET HTTP.
* @param request Objeto que encapsula o pedido para o servlet
* @param response Objeto que encapsula a resposta do
* Servlet.
*/
public void doGet(
HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
} // doGet
/**
* Processar pedidos de entrada POST HTTP
* @param request Objeto que encapsula o pedido para
* Servlet.
* @param response Objeto que encapsula a resposta do
* Servlet.
*/
public void doPost(
HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
...
//--------------------------------------------------------------------
// SERVIÇO DE INTERNACIONALIZAÇÃO: Obter contexto de responsável pela chamada.
//
// O serviço de internacionalização extrai accept-languages
// propagados no pedido HTTP e os associa ao encadeamento atual
// como uma lista de locales no contexto do responsável pela chamada.
// Esses locales são acessíveis nos métodos de serviço do Servlet HTTP
// utilizando o objeto de internacionalização de responsável pela chamada.
//
// Se o pedido de entrada HTTP não tiver accept-languages,
// o serviço associará o locale padrão do servidor. O serviço
// sempre associa o fuso horário GMT.
//
//--------------------------------------------------------------------
try {
callerLocale = callerI18n.getLocale(); // locale do responsável pela chamada
// o código a seguir permite obter o locale da chamada,
// que depende dos critérios de Internacionalização.
invocationLocale = invI18n.getLocale(); // locale da chamada
} catch (IllegalStateException ise) {
log("Ocorreu uma anomalia ao acessar o contexto de Chamada: " + ise);
}
// NOTA: Os navegadores podem propagar accept-languages que contenham um
// código de idioma, mas omitem um código de país, como "fr" para indicar
// "Francês como falado na França." O código a seguir fornece um
// código padrão do país nesses casos.
if (callerLocale.getCountry().equals(""))
callerLocale = AccInfoJBean.getCompleteLocale(callerLocale);
// Utilizar iLocale em operações sensíveis ao locale JDK, etc.
...
} // doPost
...
void log(String s) {
System.out.println (((s == null) ? "nulo" : s));
}
} // CLASS J2eeServlet
Gerenciando contexto de internacionalização em um bean de sessão: Este exemplo de código ilustra como executar uma operação localizada utilizando o serviço de internacionalização em um bean de sessão ou bean de sessão ativado para serviço da Web.
...
//------------------------------------------------------------
// SERVIÇO DE INTERNACIONALIZAÇÃO: Importações.
//------------------------------------------------------------
import com.ibm.websphere.i18n.context.UserInternationalization;
import com.ibm.websphere.i18n.context.Internationalization;
import com.ibm.websphere.i18n.context.InvocationInternationalization;
import javax.naming.InitialContext;
import javax.naming.Context;
import javax.naming.NamingException;
import java.util.Locale;
/**
* Esta é uma Classe de Bean de Sessão sem estado
*/
public class J2EESessionBean implements SessionBean {
//------------------------------------------------------------
// SERVIÇO DE INTERNACIONALIZAÇÃO: Referências de API.
//------------------------------------------------------------
protected UserInternationalization userI18n = null;
protected InvocationInternationalization invI18n = null;
//------------------------------------------------------------
// SERVIÇO DE INTERNACIONALIZAÇÃO: Nome JNDI.
//------------------------------------------------------------
public static final String UserI18NUrl =
"java:comp/websphere/UserInternationalization";
...
/**
* Obter a referência apropriada da interface de internacionalização
* neste método.
* @param ctx javax.ejb.SessionContext
*/
public void setSessionContext(javax.ejb.SessionContext ctx) {
//------------------------------------------------------------
// SERVIÇO DE INTERNACIONALIZAÇÃO: Resolver a API.
//------------------------------------------------------------
try {
Context initialContext = new InitialContext();
userI18n = (UserInternationalization)initialContext.lookup(
UserI18NUrl);
invI18n = userI18n.getInvocationInternationalization();
} catch (NamingException ne) {
log("Erro: Impossível resolver UserInternationalization: Exceção: " + ne);
} catch (IllegalStateException ise) {
log("Erro: UserInternationalization não está disponível: " + ise);
}
} // setSessionContext
/**
* Configurar o pacote de recursos utilizando o Serviço I18n
*/
public void setResourceBundle()
{
Locale invLocale = null;
//------------------------------------------------------------
// SERVIÇO DE INTERNACIONALIZAÇÃO: Obter contexto de chamada.
//------------------------------------------------------------
try {
invLocale = invI18n.getLocale();
} catch (IllegalStateException ise) {
log ("Ocorreu uma anomalia ao acessar o contexto de Chamada: " + ise );
}
try {
Resources.setResourceBundle(invLocale);
// A classe Resources fornece suporte para recuperar mensagens do(s)
// pacote(s) de recursos. Consulte o código fonte da amostra Cotação do Dia
} catch (Exception e) {
log("Erro: Ocorreu uma exceção ao definir o pacote de recursos: " + e);
}
} // setResourceBundle
/**
* Transmitir chaves de mensagens para obter os textos localizados
* @return java.lang.String []
* @param key java.lang.String []
*/
public String[] getMsgs(String[] key) {
setResourceBundle();
return Resources.getMsgs(key);
}
...
void log(String s) {
System.out.println(((s == null) ? ";null" : s));
}
} // CLASS J2EESessionBean
Representando contexto de internacionalização em um cabeçalho SOAP: Este exemplo de código ilustra como o contexto de internacionalização é representado no cabeçalho SOAP do pedido de serviço da Web.
<InternationalizationContext>
<Locales>
<Locale>
<LanguageCode>ja</LanguageCode>
<CountryCode>JP</CountryCode>
<VariantCode>Nihonbushi</VariantCode>
</Locale>
<Locale>
<LanguageCode>fr</LanguageCode>
<CountryCode>FR</CountryCode>
</Locale>
<Locale>
<LanguageCode>en</LanguageCode>
<CountryCode>US</CountryCode>
</Locale>
</Locales>
<TimeZoneID>JST</TimeZoneID>
</InternationalizationContext>
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="InternationalizationContext"
type="InternationalizationContextType">
</xsd:element>
<xsd:complexType name="InternationalizationContextType">
<xsd:sequence>
<xsd:element name="Locales"
type="LocalesType">
</xsd:element>
<xsd:element name="TimeZoneID"
type="xsd:string">
</xsd:element>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="LocalesType">
<xsd:sequence>
<xsd:element name="Locale"
type="LocaleType"
minOccurs="0"
maxOccurs="unbounded">
</xsd:element>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="LocaleType">
<xsd:sequence>
<xsd:element name="LanguageCode"
type="xsd:string"
minOccurs="0"
maxOccurs="1">
</xsd:element>
<xsd:element name="CountryCode"
type="xsd:string"
minOccurs="0"
maxOccurs="1">
</xsd:element>
<xsd:element name="VariantCode"
type="xsd:string"
minOccurs="0"
maxOccurs="1">
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:schema>