Utilisation de l'API du contexte d'internationalisation
Les applications client EJB (Enterprise JavaBeans), les servlets et les beans enterprise peuvent obtenir et gérer, par le biais d'un programme, le contexte d'internationalisation à l'aide de l'API associée. Pour les applications client de services Web, utilisez l'API pour obtenir et gérer le contexte d'internationalisation de la même manière que pour les clients EJB.
Avant de commencer
Les packages java.util et com.ibm.websphere.i18n.context contiennent toutes les classes nécessaires à l'utilisation du service d'internationalisation dans une application EJB.
Procédure
Résultats
On dit que les composants résultants utilisent AMI (application-managed internationalization). Pour plus d'informations AMI, voir Contexte d'internationalisation : Règles de gestion.
Exemple
Gestion du contexte d'internationalisation dans un programme client EJB : l'exemple de code ci-dessous explique comment utiliser l'API du contexte d'internationalisation dans un programme client EJB ou un programme client de service Web contenu.
//------------------------------------------
// Basic Example: J2EE EJB client.
//------------------------------------------
package examples.basic;
//------------------------------------------
// INTERNATIONALIZATION SERVICE: Imports.
//------------------------------------------
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[]) {
//--------------------------------------------------
// INTERNATIONALIZATION SERVICE: API references.
//--------------------------------------------------
UserInternationalization userI18n = null;
Internationalization callerI18n = null;
InvocationInternationalization invocationI18n = null;
//--------------------------------------------------
// INTERNATIONALIZATION SERVICE: JNDI name.
//--------------------------------------------------
final String UserI18NUrl =
"java:comp/websphere/UserInternationalization";
//--------------------------------------------------
// INTERNATIONALIZATION SERVICE: Resolve the API.
//--------------------------------------------------
try {
Context initialContext = new InitialContext();
userI18n = (UserInternationalization)initialContext.lookup(
UserI18NUrl);
callerI18n = userI18n.getCallerInternationalization();
invI18n = userI18n.getInvocationInternationalization ();
} catch (NamingException ne) {
log("Error: Cannot resolve UserInternationalization: Exception: " + ne);
} catch (IllegalStateException ise) {
log("Error: UserInternationalization is not available: " + ise);
}
...
//--------------------------------------------------------------------
// INTERNATIONALIZATION SERVICE: Set invocation context.
//
// Under Application-managed Internationalization (AMI), contained EJB
// client programs may set invocation context elements. The following
// statements associate the supplied invocation locale and time zone
// with the current thread. Subsequent remote bean method calls will
// propagate these context elements.
//--------------------------------------------------------------------
try {
invocationI18n.setLocale(new Locale("fr", "FR", ""));
invocationI18n.setTimeZone("ECT");
} catch (IllegalStateException ise) {
log("An anomaly occurred accessing Invocation context: " + ise );
}
...
//--------------------------------------------------------------------
// INTERNATIONALIZATION SERVICE: Get locale and time zone.
//
// Under AMI, contained EJB client programs can get caller and
// invocation context elements associated with the current thread.
// The next four statements return the invocation locale and time zone
// associated above, and the caller locale and time zone associated
// internally by the service. Getting a caller context element within
// a contained client results in the default element of the 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) ? "null" : s));
}
} // EjbClient
Gestion du contexte d'internationalisation dans un servlet : l'exemple de code ci-dessous explique comment utiliser l'API du contexte d'internationalisation dans un servlet. Notez les commentaires dans les méthodes init et doPost.
...
//--------------------------------------------------------------------
// INTERNATIONALIZATION SERVICE: Imports.
//--------------------------------------------------------------------
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 {
...
//------------------------------------------------------------------
// INTERNATIONALIZATION SERVICE: API references.
//------------------------------------------------------------------
protected UserInternationalization userI18n = null;
protected Internationalization i18n = null;
protected InvocationInternationalization invI18n = null;
//------------------------------------------------------------
// INTERNATIONALIZATION SERVICE: JNDI name.
//------------------------------------------------------------
public static final String UserI18NUrl =
"java:comp/websphere/UserInternationalization";
protected Locale callerLocale = null;
protected Locale invocationLocale = null;
/**
* Initialize this servlet.
* Resolve references to the JNDI initial context and the
* internationalization context API.
*/
public void init() throws ServletException {
//------------------------------------------------------------------
// INTERNATIONALIZATION SERVICE: Resolve API.
//
// Under Container-managed Internationalization (CMI), servlets have
// read-only access to invocation context elements. Attempts to set these
// elements result in an IllegalStateException.
//
// Suggestion: cache all internationalization context API references
// once, during initialization, and use them throughout the servlet
// lifecycle.
//------------------------------------------------------------------
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
/**
* Process incoming HTTP GET requests.
* @param request Object that encapsulates the request to the servlet
* @param response Object that encapsulates the response from the
* Servlet.
*/
public void doGet(
HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
} // doGet
/**
* Process incoming HTTP POST requests
* @param request Object that encapsulates the request to
* the Servlet.
* @param response Object that encapsulates the response from
* the Servlet.
*/
public void doPost(
HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
...
//--------------------------------------------------------------------
// INTERNATIONALIZATION SERVICE: Get caller context.
//
// The internationalization service extracts the accept-languages
// propagated in the HTTP request and associates them with the
// current thread as a list of locales within the caller context.
// These locales are accessible within HTTP Servlet service methods
// using the caller internationalization object.
//
// If the incoming HTTP request does not contain accept languages,
// the service associates the server's default locale. The service
// always associates the GMT time zone.
//
//--------------------------------------------------------------------
try {
callerLocale = callerI18n.getLocale(); // caller locale
// the following code enables you to get invocation locale,
// which depends on the Internationalization policies.
invocationLocale = invI18n.getLocale(); // invocation locale
} catch (IllegalStateException ise) {
log("An anomaly occurred accessing Invocation context: " + ise);
}
// NOTE: Browsers may propagate accept-languages that contain a
// language code, but lack a country code, like "fr" to indicate
// "French as spoken in France." The following code supplies a
// default country code in such cases.
if (callerLocale.getCountry().equals(""))
callerLocale = AccInfoJBean.getCompleteLocale(callerLocale);
// Use iLocale in JDK locale-sensitive operations, etc.
...
} // doPost
...
void log(String s) {
System.out.println (((s == null) ? "null" : s));
}
} // CLASS J2eeServlet
Gestion du contexte d'internationalisation dans un bean session : l'exemple de code ci-dessous explique comment effectuer une opération localisée à l'aide du service d'internationalisation dans un bean session ou un bean session ou bean session de service Web.
...
//------------------------------------------------------------
// INTERNATIONALIZATION SERVICE: Imports.
//------------------------------------------------------------
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;
/**
* This is a stateless Session Bean Class
*/
public class J2EESessionBean implements SessionBean {
//------------------------------------------------------------
// INTERNATIONALIZATION SERVICE: API references.
//------------------------------------------------------------
protected UserInternationalization userI18n = null;
protected InvocationInternationalization invI18n = null;
//------------------------------------------------------------
// INTERNATIONALIZATION SERVICE: JNDI name.
//------------------------------------------------------------
public static final String UserI18NUrl =
"java:comp/websphere/UserInternationalization";
...
/**
* Obtain the appropriate internationalization interface
* reference in this method.
* @param ctx javax.ejb.SessionContext
*/
public void setSessionContext(javax.ejb.SessionContext ctx) {
//------------------------------------------------------------
// INTERNATIONALIZATION SERVICE: Resolve the API.
//------------------------------------------------------------
try {
Context initialContext = new InitialContext();
userI18n = (UserInternationalization)initialContext.lookup(
UserI18NUrl);
invI18n = userI18n.getInvocationInternationalization();
} catch (NamingException ne) {
log("Error: Cannot resolve UserInternationalization: Exception: " + ne);
} catch (IllegalStateException ise) {
log("Error: UserInternationalization is not available: " + ise);
}
} // setSessionContext
/**
* Set up resource bundle using I18n Service
*/
public void setResourceBundle()
{
Locale invLocale = null;
//------------------------------------------------------------
// INTERNATIONALIZATION SERVICE: Get invocation context.
//------------------------------------------------------------
try {
invLocale = invI18n.getLocale();
} catch (IllegalStateException ise) {
log ("An anomaly occurred while accessing Invocation context: " + ise );
}
try {
Resources.setResourceBundle(invLocale);
// Class Resources provides support for retrieving messages from
// the resource bundle(s). See Currency Exchange sample source code.
} catch (Exception e) {
log("Error: Exception occurred while setting resource bundle: " + e);
}
} // setResourceBundle
/**
* Pass message keys to get the localized texts
* @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
Représentation du contexte d'internationalisation dans un en-tête SOAP : l'exemple de code ci-après montre comment un contexte d'internationalisation est représenté dans l'en-tête SOAP d'une demande de service 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>