국제화 컨텍스트 API 사용
엔터프라이즈 JavaBeans(EJB) 클라이언트 애플리케이션, 서블릿, 엔터프라이즈 Bean은 국제화 컨텍스트 API를 사용하여 국제화 컨텍스트를 프로그래밍 방식으로 확보 및 관리할 수 있습니다. 웹 서비스 클라이언트 애플리케이션에 대해 API를 사용하여 EJB 클라이언트와 동일한 방식으로 국제화 컨텍스트를 확보하고 관리합니다.
시작하기 전에
java.util and com.ibm.websphere.i18n.context 패키지에는 EJB 애플리케이션 내에서 국제화 서비스를 사용하는 데 필요한 모든 클래스가 포함됩니다.
프로시저
결과
결과 컴포넌트는 애플리케이션 관리 국제화(AMI)를 사용하도록 지시됩니다. AMI에 대한 자세한 정보는 국제화 컨텍스트: 관리 정책의 내용을 참조하십시오.
예
EJB 클라이언트 프로그램에서 국제화 컨텍스트 관리: 다음 코드 예는 포함된 EJB 클라이언트 프로그램이나 웹 서비스 클라이언트 프로그램에서 국제화 컨텍스트 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 또는 웹 서비스 사용 세션 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 헤더에 국제화 컨텍스트 표시: 이 코드 예는 웹 서비스 요청의 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>