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

  1. Obter Acesso à API do Contexto de Internacionalização.

    Resolva as referências da API de contexto de internacionalização uma vez pelo ciclo de vida de um componente de aplicativo no método de inicialização desse componente (por exemplo, no método init dos servlets ou no método SetXxxContext dos beans corporativos). Para programas clientes de serviço da Web, resolva uma referência à API do contexto de internacionalização durante a inicialização. Para beans de sessão sem preservação de estado ativados para serviços da Web, resolva a referência no método setSessionContext.

  2. Acessar Códigos do Idioma e Fusos Horários do Responsável pela Chamada

    Cada chamada remota de um componente de aplicativo possui um contexto de internacionalização do responsável pela chamada associado ao encadeamento que está executando essa chamada. Um contexto de responsável pela chamada é propagado pelo serviço de internacionalização e o middleware para o destino de um pedido, como um método de negócios de EJB (Enterprise JavaBeans) ou um método de serviço do servlet. Esta tarefa também se aplica a programas clientes de serviço da Web.

  3. Acessar Códigos do Idioma e Fusos Horários de Chamada

    Cada chamada remota de um método de negócios EJB (Enterprise JavaBeans) ou um método de serviço do servlet possui um contexto de internacionalização de chamada associado ao encadeamento que está executando essa chamada. O contexto de chamada é o contexto de internacionalização sob o qual as implementações dos métodos de servlet e de negócios são executadas; ele é propagado em chamadas subsequentes pelo serviço de internacionalização e pelo middleware. Esta tarefa também se aplica a programas clientes de serviço da Web.

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

Cada componente de aplicativo suportado utiliza a API do contexto de internacionalização de forma diferente. São fornecidos exemplos de código que ilustram como usar a API em cada tipo de componente. As diferenças no uso da API, bem como outras dicas de codificação, são indicadas nos comentários que antecedem os blocos relevantes de instrução.

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>
Esta representação é válida no seguinte esquema:
<?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>

Ícone que indica o tipo de tópico Tópico de Tarefa



Ícone de registro de data e hora Última atualização: last_date
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=tin_manageapi
Nome do arquivo: tin_manageapi.html