Utilización de la API de contexto de internacionalización

Las aplicaciones clientes de EJB (Enterprise JavaBeans), los servlets y los enterprise beans se pueden obtener y gestionar el contexto de internacionalización mediante programación utilizando la API del contexto de internacionalización. Para las aplicaciones de cliente de servicio web, utilice la API para obtener y gestionar el contexto de internacionalización del mismo modo que lo hace para los clientes EJB.

Antes de empezar

Los paquetes java.util y com.ibm.websphere.i18n.context contienen todas las clases necesarias para utilizar el servicio de internacionalización dentro de una aplicación EJB.

Procedimiento

  1. Obtener acceso a la API del contexto de internacionalización .

    Resuelva las referencias de API de contexto de internacionalización una vez durante el ciclo de vida de un componente de aplicación, en el método de inicialización de dicho componente (por ejemplo, en el método init de servlets o en el método SetXxxContext de enterprise beans.) Para los programas del cliente de servicio web, resuelva una referencia a la API del contexto de internacionalización durante la inicialización. Para los beans de sesión sin estado habilitados para servicios web, resuelva la referencia en el método setSessionContext.

  2. Acceso a los entornos locales y a los husos horarios de los llamantes.

    Toda invocación remota de un componente de aplicación tiene un contexto de internacionalización del llamante asociado a la hebra que ejecuta dicha invocación. El contexto del llamante se propaga a través del servicio de internacionalización y del middleware al destino de una solicitud, como un método de empresa EJB (Enterprise JavaBeans) o un método de servicio de servlet. Esta tarea se aplica también a los programas cliente del servicio web.

  3. Acceso a los entornos locales y a los husos horarios.

    Toda invocación remota de un método de empresa EJB (Enterprise JavaBeans) o un servicio de servlet tiene un contexto de internacionalización de invocación asociado a la hebra que ejecuta dicha invocación. El contexto de invocación es el contexto de internacionalización bajo el que se ejecutan las implementaciones de los métodos servlet y de empresa; se propaga en invocaciones posteriores por el servicio de internacionalización y middleware. Esta tarea se aplica también a los programas cliente del servicio web.

Resultados

Se dice de los componentes resultantes que utilizan internacionalización gestionada por contenedor (AMI). Para obtener más información acerca de AMI, consulte Contexto de internacionalización: gestión de políticas.

Ejemplo

Cada componente de aplicación admitido utiliza la API de contexto de internacionalización de forma distinta. Se proporcionan ejemplos de código que ilustran cómo utilizar la API dentro de cada tipo de componente. Las diferencias en el uso de la API, así como otras anotaciones sobre el código se resaltan en comentarios que preceden a los bloques de sentencias relevantes.

Gestión del contexto de internacionalización en un programa cliente EJB: el código de ejemplo siguiente ilustra cómo utilizar la API de contexto de internacionalización en un programa cliente EJB contenido o en un programa cliente de servicio web.

//------------------------------------------
// Ejemplo básico: cliente EJB J2EE EJB.
//------------------------------------------
package examples.basic;

//------------------------------------------
// SERVICIO DE INTERNACIONALIZACIÓN: Importar.
//------------------------------------------
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[]) {

    //--------------------------------------------------
    // SERVICIO DE INTERNACIONALIZACIÓN: Referencias API.
    //--------------------------------------------------
    UserInternationalization userI18n = null;
    Internationalization callerI18n = null;
    InvocationInternationalization invocationI18n = null;
   
    //--------------------------------------------------
    // SERVICIO DE INTERNACIONALIZACIÓN: Nombre JNDI. 
    //--------------------------------------------------
    final String UserI18NUrl =
        "java:comp/websphere/UserInternationalization";

    //--------------------------------------------------
    // SERVICIO DE INTERNACIONALIZACIÓN: Resolver el API.
    //--------------------------------------------------
    try {
     Context initialContext = new InitialContext();    
     userI18n = (UserInternationalization)initialContext.lookup(
         UserI18NUrl);
     callerI18n = userI18n.getCallerInternationalization();
     invI18n = userI18n.getInvocationInternationalization ();
    } catch (NamingException ne) {
      log("Error: No se puede resolver UserInternationalization: Excepción: " + ne);
    } catch (IllegalStateException ise) {
      log("Error: UserInternationalization no está disponible: " + ise);
    }
    ...

    //--------------------------------------------------------------------
    // SERVICIO DE INTERNACIONALIZACIÓN: Establecer contexto de invocación.
    //
    // En AMI (internacionalización gestionada por contenedor), los programas cliente 
    // EJB contenidos pueden establecer los elementos del contexto de invocación. Las 
    // sentencias siguientes asocian el entorno local y el huso horario de la invocación 
    // proporcionado con la hebra actual. Las posteriores llamadas al método bean remoto 
    // propagarán estos elementos de contexto.
    //--------------------------------------------------------------------
    try {
      invocationI18n.setLocale(new Locale("es", "ES", ""));
      invocationI18n.setTimeZone("ECT");
    } catch (IllegalStateException ise) {
      log("Se ha producido una anomalía al acceder al contexto de invocación: " + ise );
    }
    ...

    //--------------------------------------------------------------------
    // SERVICIO DE INTERNACIONALIZACIÓN: Obtener entorno local y zona horaria.
    //
    // En AMI, los programas cliente EJB pueden obtener los elementos del contexto
    // de la invocación y del llamante asociados a la hebra actual. 
    // Las cuatro sentencias siguientes devuelven el entorno local y zona horaria de la invocación 
    // asociados arriba, y el entorno local y zona horaria del llamante asociados 
    // internamente por el servicio. La obtención de un elemento de contexto del llamante dentro de 
    // de un cliente contenido da como resultado el elemento predeterminado de la 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("Se ha producido una anomalía al acceder al contexto I18n: " + ise );
    }

    ...
  } // main

  ...
  void log(String s) {
    System.out.println (((s == null) ? "null" : s));
  }
} // EjbClient

Gestión del contexto de internacionalización en un servlet: El código de ejemplo siguiente muestra cómo utilizar la API de contexto de internacionalización en un servlet. Observe los comentarios en los métodos init y doPost.

...
//--------------------------------------------------------------------
// SERVICIO DE INTERNACIONALIZACIÓN: Importar.
//--------------------------------------------------------------------
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 {

  ...
  //------------------------------------------------------------------
  // SERVICIO DE INTERNACIONALIZACIÓN: Referencias API.
  //------------------------------------------------------------------
  protected UserInternationalization        userI18n = null;
  protected Internationalization i18n = null;
  protected InvocationInternationalization  invI18n  = null;

  //------------------------------------------------------------
  // SERVICIO DE INTERNACIONALIZACIÓN: Nombre JNDI. 
  //------------------------------------------------------------
  public static final String UserI18NUrl = 
      "java:comp/websphere/UserInternationalization";  

  protected Locale callerLocale = null;
  protected Locale invocationLocale = null;

  /**
   * Inicializar este servlet.
   * Resolver referencias al contexto inicial de JNDI y a la
   * API del contexto de internacionalización.
   */
  public void init() throws ServletException {

    //------------------------------------------------------------------
    // SERVICIO DE INTERNACIONALIZACIÓN: Resolver API.
    //
    // En CMI (internacionalización gestionada por contenedor), los servlets tienen 
    // acceso de sólo lectura a los elementos del contexto de invocación. Si se intenta 
    // establecer estos elementos se generará una IllegalStateException.
    //
    // Sugerencia: almacene en la memoria caché una vez todas las referencias a la API del 
    // contexto de internacionalización, durante la inicialización, y utilícelas en todo el 
    // ciclo de vida del servlet.
    //------------------------------------------------------------------
    try {
      Context initialContext = new InitialContext();
      userI18n = (UserInternationalization)initialContext.lookup(UserI18nUrl);
      callerI18n = userI18n.getCallerInternationalization();
      invI18n = userI18n.getInvocationInternationalization();
    } catch (NamingException ne) {
      throw new ServletException("No se puede resolver UserInternationalization" + ne);
    } catch (IllegalStateException ise) {
      throw new ServletException ("Error: UserInternationalization no está
         disponible: " + ise);
    }
    ...
  } // init
  
  /**
   * Procesar solicitudes HTTP GET entrantes.
   * Objeto de solicitud @param que encapsula la solicitud para el servlet
   * Objeto de respuesta @param que encapsula la respuesta del
   *    Servlet.
   */
  public void doGet(
      HttpServletRequest  request, 
      HttpServletResponse response)
    throws ServletException, IOException {
    doPost(request, response);
  } // doGet

  /**
   * Procesar solicitudes POST de HTTP entrantes.
   * Objeto de solicitud @param que encapsula la solicitud para 
   * el servlet.
   * Objeto de respuesta @param que encapsula la respuesta
   * el servlet.
   */
  public void doPost(
      HttpServletRequest  request,
      HttpServletResponse response)
    throws ServletException, IOException {

    ...
    //--------------------------------------------------------------------
    // SERVICIO DE INTERNACIONALIZACIÓN: Obtener contexto de llamante.
    //
    // El servicio de internacionalización extrae los idiomas de aceptación
    // propagados en la solicitud HTTP y los asocia con la 
    // hebra actual como lista de entornos locales dentro del contexto de llamante.
    // Se puede acceder a estos entornos locales dentro de los métodos del servicio HTTP Servlet 
    // con el objeto de internacionalización de llamante.
    // 
    // Si la solicitud HTTP entrante no contiene los idiomas aceptados,
    // el servicio asocia el entorno local predeterminado del servidor. El servicio
    // siempre se asocia al huso horario GMT.
    //
    //--------------------------------------------------------------------
    try {
      callerLocale = callerI18n.getLocale();   // entorno local del llamante
      // El código siguiente le habilita para obtener el entorno local de invocación,
      // que depende de las políticas de internacionalización.
      invocationLocale = invI18n.getLocale();  // entorno local de la invocación
    } catch (IllegalStateException ise) {
      log("Se ha producido una anomalía al acceder al contexto de invocación: " + ise );
    }
    // NOTA: Los navegadores pueden propagar los idiomas aceptados que contienen un 
    // código de idioma, pero que carecen de un código de país, como "fr" para indicar 
    // "Francés hablado en Francia".  El siguiente código proporciona un
    // código de país predeterminado en dichos casos.
    if (callerLocale.getCountry().equals(""))
      callerLocale = AccInfoJBean.getCompleteLocale(callerLocale);
    
    // Utilice iLocale en operaciones que se vean afectadas por el entorno local de JDK, etc.
    ...
  } // doPost
  
  ...
  void log(String s) {
    System.out.println (((s == null) ? "null" : s));
  }
} // CLASS J2eeServlet

Gestión de contexto de internacionalización en un bean de sesión: este ejemplo de código ilustra cómo realizar una operación localizada utilizando el servicio de internacionalización en un bean de sesión o un bean de sesión habilitado para servicio web.

...   
//------------------------------------------------------------
// SERVICIO DE INTERNACIONALIZACIÓN: Importar.
//------------------------------------------------------------
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 es una clase Bean de sesión sin estado
 */
public class J2EESessionBean implements SessionBean {

  //------------------------------------------------------------
  // SERVICIO DE INTERNACIONALIZACIÓN: Referencias API.
  //------------------------------------------------------------
  protected UserInternationalization        userI18n = null;
  protected InvocationInternationalization  invI18n  = null;

  //------------------------------------------------------------
  // SERVICIO DE INTERNACIONALIZACIÓN: Nombre JNDI. 
  //------------------------------------------------------------
  public static final String UserI18NUrl = 
      "java:comp/websphere/UserInternationalization";  
  ...
  
  /**
   * Obtener la referencia a la interfaz de internacionalización 
   * adecuada en este método.
   * @param ctx javax.ejb.SessionContext
   */
  public void setSessionContext(javax.ejb.SessionContext ctx) {

    //------------------------------------------------------------
    // SERVICIO DE INTERNACIONALIZACIÓN: Resolver el API.
    //------------------------------------------------------------
    try {
      Context initialContext = new InitialContext();    
      userI18n = (UserInternationalization)initialContext.lookup(
          UserI18NUrl);
      invI18n = userI18n.getInvocationInternationalization();
    } catch (NamingException ne) {
      log("Error: No se puede resolver UserInternationalization: Excepción: " + ne);
        
    } catch (IllegalStateException ise) {
      log("Error: UserInternationalization no está disponible: " + ise);
    }
  } // setSessionContext 

 /**
  * Configurar el paquete de recursos (Resource bundle) utilizando el servicio I18n
  */
  public void setResourceBundle()
  {
    Locale invLocale   = null;

    //------------------------------------------------------------
    // SERVICIO DE INTERNACIONALIZACIÓN: Obtener el contexto de invocación.
    //------------------------------------------------------------
    try {
      invLocale = invI18n.getLocale();
    } catch (IllegalStateException ise) {
      log("Se ha producido una anomalía al acceder al contexto de invocación: " + ise );
    }
    try {    
      Resources.setResourceBundle(invLocale);
      // La clase Resources proporciona soporte para la recuperación de mensajes desde
      // el paquete o paquetes de recursos. Consulte el código fuente del ejemplo
      // Intercambio de divisas.
    } catch(Exception e) {
      log("Error: Se ha producido una excepción al establecer el paquete de recursos: " + e);
    }
  } // setResourceBundle

  /**
   * Pasar claves de mensaje para obtener el texto localizado (adaptado al entorno local)
   * @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

Representación de contexto de internacionalización en una cabecera SOAP: este ejemplo de código ilustra cómo se representa el contexto de internacionalización en la cabecera SOAP de una solicitud de servicio 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 representación es válida para el siguiente 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>

Icon that indicates the type of topic Task topic



Timestamp icon Last updated: last_date
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=tin_manageapi
File name: tin_manageapi.html