国際化対応コンテキスト API の使用
Enterprise JavaBeans (EJB) クライアント・アプリケーション、サーブレット、およびエンタープライズ Bean は、 国際化対応コンテキスト API を使用して、国際化対応コンテキストをプログラマチックに取得および管理できます。 Web サービス・クライアント・アプリケーションの場合は、API を使用して、EJB クライアントの場合と同じ方法で、国際化対応コンテキストを取得および管理します。
始める前に
java.util および com.ibm.websphere.i18n.context パッケージには、EJB アプリケーション内で国際化対応サービスを使用するために必要なクラスがすべて含まれています。
手順
タスクの結果
この結果生成されるコンポーネントは、アプリケーション管理国際化対応 (AMI) と呼ばれます。AMI について詳しくは、国際化対応コンテキスト: 管理ポリシーを参照してください。
例
EJB クライアント・プログラム内での国際化対応コンテキストの管理: 以下の コード例は、組み込まれている EJB クライアント・プログラム、または Web サービス・クライアント・プログラム内での国際化対応コンテキスト API の使用方法を示したものです。
//------------------------------------------
// 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
サーブレット内での国際化対応コンテキストの管理: 以下のコード例は、サーブレット内での 国際化対応コンテキスト API の使用方法を示したものです。 init および 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
セッション Bean 内での国際化対応 コンテキストの管理: このコード例は、セッション Bean または Web サービス対応 セッション Bean 内で国際化対応サービスを使用して、ローカライズされた操作を 実行する方法を示したものです。
...
//------------------------------------------------------------
// 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
SOAP ヘッダー内での国際化対応コンテキストの表示: このコード例は、Web サービス要求の SOAP ヘッダー内で 国際化対応コンテキストがどのように表されるかを示したものです。
<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>