Oracle Database 2日でJava開発者ガイド 11g リリース1(11.1) E05692-02 |
|
様々なロケールをサポートするグローバル・インターネット・アプリケーションを構築するには、適切な開発の実施が必要です。ロケールとは、各国の言語およびその言語が話される地域のことです。アプリケーション自体で、ユーザーのロケール設定を認識し、ユーザーが期待する文化的な慣習に従って、内容を表示する必要があります。正しい日付書式や数値書式を使用するなど、適切なロケール特性でデータを表示することが重要です。Oracle Databaseは完全に国際化されており、グローバル・アプリケーションを開発およびデプロイするためのグローバル・プラットフォームを提供します。
この章では、JavaおよびOracle Database環境でのグローバル・アプリケーション開発について説明します。グローバル・インターネット・アプリケーションの開発およびデプロイに関連する基本タスク、すなわちロケール認識の開発、ユーザー設定言語でのHTMLコンテンツの構築、ユーザー・ロケールの文化的な慣習に従ったデータの表示などについて説明します。
この章では、次の項目について説明します。
グローバル・インターネット・アプリケーションでは、ユーザー・ロケールを認識する必要があります。日付、時間、通貨の書式設定など、ロケールに依存する機能はJavaやSQLなどのプログラミング環境に組み込まれています。アプリケーションではロケールに依存する機能を使用して、ユーザー・ロケールの文化的な慣習に従って、HTMLページを書式設定できます。
プログラミング環境によって、ロケールを表す方法は異なります。たとえば、フランス語(カナダ)のロケールは、次のように表されます。
表9-1に、一般的に使用されるロケールのJavaおよびOracle環境での定義を示します。
異なるプログラミング環境をまたいでグローバル・アプリケーションを記述する場合、ユーザーのロケール設定を環境間で同期化する必要があります。たとえば、PL/SQLプロシージャをコールするJavaアプリケーションでは、Javaロケールを対応するNLS_LANGUAGE
およびNLS_TERRITORY
値にマッピングし、ユーザー・ロケールが一致するようにパラメータ値を変更してから、PL/SQLプロシージャをコールする必要があります。
Oracle Globalization Development Kit(GDK)では、LocaleMapper
クラスが提供されています。Java、IANA、ISO、Oracle間で、等価のロケールおよびキャラクタ・セットがマッピングされます。Javaアプリケーションが、Oracleロケール名で指定されたロケール情報をクライアントから受け取る場合があります。Javaアプリケーションで情報を正しく処理するには、等価のJavaロケールにマッピングできる必要があります。
例9-1に、LocaleMapper
クラスの使用方法を示します。
Locale locale = new Locale("fr", "CA"); String oraLang = LocaleMapper.getOraLanguage(locale); String oraTerr = LocaleMapper.getOraTerritory(locale);
GDKは、Oracleアプリケーション開発者にグローバル・インターネット・アプリケーションの開発フレームワークを提供する、一連のJava Application Program Interface(API)です。GDKによって、Javaの既存のグローバリゼーション機能が補完されます。中間層JavaアプリケーションとOracle Databaseサーバー間のロケール動作が同期化されます。
グローバル環境では、ロケール設定が異なるユーザーをアプリケーションで受け入れる必要がある場合があります。ユーザーの優先ロケールを判別します。優先ロケールがわかったら、アプリケーションはそのロケールの言語を使用してHTMLコンテンツを構築し、そのロケールの文化的な慣習に従う必要があります。
ユーザー・ロケールを判別する最も一般的な方法の1つは、ユーザーのブラウザのデフォルトのISOロケール設定に基づきます。通常、ブラウザはロケール設定をAccept-Language
HTTPヘッダーを使用してHTTPサーバーに送信します。このヘッダーがNULL
に設定されている場合、使用できるロケール設定情報がないため、アプリケーションは、理論上は事前定義されたアプリケーションのデフォルト・ロケールにフォールバックする必要があります。
JSPページとJavaサーブレットの両方で、例9-2に示すように、サーブレットAPIへのコールを使用してAccept-Language
HTTPヘッダーを取得できます。
String lang = request.getHeader("Accept-Language") StringTokenizer st = new StringTokenizer(lang, ",") if (st.hasMoreTokens()) userLocale = st.nextToken();
このコードはAccept-Language
ヘッダーをHTTPリクエストから取得し、最初のISOロケールを抽出した後、そのISOロケールをユーザー設定ロケールとして使用します。
Javaロケール・オブジェクトは、対応するユーザーのロケールをJavaで表します。ロケールに使用されるJavaエンコーディングは、Java文字列とバイト・データ間で正しく変換する必要があります。Javaコードでユーザー・ロケールを認識する場合は、ロケールのJavaエンコーディングを考慮する必要があります。JavaメソッドでJavaロケールおよびエンコーディングを認識させるには、次の2つの方法があります。
グローバル・アプリケーションを開発する場合は、2番目の方法を採用し、現在のユーザー・ロケールに対応するJavaロケールおよびJavaエンコーディングを明示的に指定することをお薦めします。例9-3に示すように、getDateTimeInstance
メソッドで、ユーザー・ロケール(user_locale
)に対応するJavaロケール・オブジェクトを指定できます。
DateFormat df = DateFormat.getDateTimeInstance(DateFormat.FULL, DateFormat.FULL, user_ locale); dateString = df.format(date); /* Format a date */
HTMLページのエンコーディングは、ブラウザおよびインターネット・アプリケーションにとって重要な情報です。ページ・エンコーディングは、インターネット・アプリケーションがサービスを提供するロケールに使用されるキャラクタ・セットです。ブラウザでは、正しいフォントおよびキャラクタ・セット・マッピング表を使用してHTMLページを表示できるように、ページ・エンコーディングを認識する必要があります。インターネット・アプリケーションでは、HTMLフォームからの入力を処理できるように、HTMLページ・エンコーディングを認識する必要があります。
異なるロケールに異なるネイティブ・エンコーディングを使用するかわりに、すべてのページ・エンコーディングにUTF-8(Unicodeエンコーディング)を使用することをお薦めします。UTF-8エンコーディングを使用すると、グローバル・アプリケーションのコーディングが簡単になるだけでなく、単一ページで多言語のコンテンツを配置できるようになります。
この項では、次の項目について説明します。
HTMLページのエンコーディングを指定するには、2つの方法があります。1つはHTTPヘッダーで指定する方法、もう1つはHTMLページ・ヘッダーで指定する方法です。
Content-Type
HTTPヘッダーをHTTP指定に含めます。例9-4に示すように、コンテンツ・タイプおよびキャラクタ・セットを指定します。
Content-Type: text/html; charset=utf-8
charset
パラメータでは、HTMLページのエンコーディングを指定します。charset
パラメータに指定できる値は、ブラウザがサポートする文字エンコーディングのIANA名です。
この方法は、主に静的なHTMLページに対して使用します。例9-5に示すように、HTMLヘッダーで文字エンコーディングを指定します。
<meta http-equiv="Content-Type" content="text/html;charset=utf-8">
charset
パラメータでは、HTMLページのエンコーディングを指定します。Content-Type
HTTPヘッダーと同様に、charsetパラメータに指定できる値は、ブラウザがサポートする文字エンコーディングのIANA名です。
contentType
ページ・ディレクティブを使用して、JavaServer Pages(JSP)ファイルのContent-Type
HTTPヘッダーでHTMLページのエンコーディングを指定できます。次に例を示します。
<%@ page contentType="text/html; charset=utf-8" %>
このエンコーディングは、クライアントへの応答用にJSPファイルが使用するMIME
タイプおよび文字エンコーディングです。JSPコンテナに有効な任意のMIME
タイプまたはIANAキャラクタ・セット名を使用できます。デフォルトのMIME
タイプはtext/html
であり、デフォルトのキャラクタ・セットはISO-8859-1です。前述の例では、キャラクタ・セットはUTF-8に設定されています。contentType
ページ・ディレクティブのキャラクタ・セットによって、JSPエンジンに対し、動的なHTMLページをエンコードし、指定されたキャラクタ・セットでHTTP Content-Type
ヘッダーを設定するように指示されます。
Javaサーブレットの場合、Servlet APIのsetContentType
メソッドをコールして、HTTPヘッダーでページ・エンコーディングを指定できます。例9-6のdoGet
関数は、このメソッドのコール方法を示しています。
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // generate the MIME type and character set header response.setContentType("text/html; charset=utf-8"); ... // generate the HTML page Printwriter out = response.getWriter(); out.println("<HTML>"); ... out.println("</HTML>"); }
getWriter
メソッドの前にsetContentType
メソッドをコールする必要があります。これは、getWriter
メソッドによって、setContentType
メソッド・コールで指定されたキャラクタ・セットを使用する出力ストリーム・ライターが初期化されるためです。ライターに書き込まれ、最終的にはブラウザに書き込まれるHTMLコンテンツは、setContentType
コールによって指定されたエンコーディングでエンコードされます。
ユーザー・インタフェースをユーザーのローカル言語で表示できるようにすることは、アプリケーションのグローバル化に関する基本タスクの1つです。HTMLページのコンテンツの翻訳可能なソースは、次のカテゴリに分類されます。
この項では、翻訳可能なコンテンツの外部化について説明します。内容は次のとおりです。
JavaサーブレットおよびJSPページの翻訳可能な文字列をJavaリソース・バンドルに外部化する必要があります。これにより、これらのリソース・バンドルをJavaコードとは別に翻訳できます。翻訳後、リソース・バンドルは英語バンドルと同じベース・クラス名を持ちますが、接尾辞としてJavaロケール名が付きます。Javaリソース・バンドルの参照メカニズムが正しく機能するように、バンドルは英語リソース・バンドルと同じディレクトリ内に配置する必要があります。
多言語アプリケーションではユーザー・ロケールは固定ではないため、ユーザー・ロケールに対応するJavaロケール・オブジェクトを明示的に指定し、getBundle
メソッドをコールする必要があります。次の例では、Javaロケール・オブジェクトはuser_locale
です。
ResourceBundle rb = ResourceBundle.getBundle("resource", user_locale); String helloStr = rb.getString("hello");
前述のコードは、ユーザー設定ロケールに対応するリソース・バンドルから、テキスト文字列hello
のローカライズされたバージョンを取得します。
HTMLやGIFなどの静的ファイルは、すぐに翻訳できます。これらのファイルを翻訳するときは、UTF-8をファイル・エンコーディングとして、対応する言語に翻訳する必要があります。翻訳されたファイルの言語を区別する場合、異なる言語の静的ファイルは異なるディレクトリに格納するか、または異なるファイル名で格納することができます。
JSPページを使用するかJavaサーブレットを使用するかに関係なく、製品名や製品の説明などの動的な情報は、多くの場合データベースに格納されています。様々な翻訳を区別するには、この情報を保持するデータベース・スキーマに情報の言語を示す列を含める必要があります。翻訳された情報を選択するには、問合せにWHERE
句を含めて、問合せの希望する言語で情報を選択する必要があります。
アプリケーションのデータは、ユーザーが期待するとおりに表示する必要があります。そうしないと、データの意味が間違って解釈される場合があります。たとえば、「12/11/05」はアメリカ合衆国では「2005年12月11日」を意味しますが、イギリスでは「2005年11月12日」を意味します。数値および通貨の書式にも同様の混乱があります。たとえば、ピリオド(.)はアメリカ合衆国では小数点の記号ですが、ドイツでは千単位のセパレータとして使用されます。
言語にはそれぞれ独自のソート・ルールがあります。アルファベット順に照合される言語、文字の画数に従う言語、単語の発音で順序付けられる言語などがあります。ユーザーが慣れている言語順序でソートしないでデータを表示すると、情報の検索が難しくなり、時間がかかる場合があります。
アプリケーションのロジックおよびデータベースから取得されるデータ量によっては、アプリケーション・レベルではなくデータベース・レベルでデータを書式設定する方が適切な場合があります。Oracle Databaseには、ユーザーのロケール設定がわかっているときにデータの表示を調整するのに役立つ多くの機能があります。次の項では、SQLでのロケールに依存する操作の例について説明します。
Oracle Databaseには、3つの異なる日付表示書式があります。標準の日付、短い日付および長い日付です。例9-7に、アメリカ合衆国とドイツにおける短い日付書式と長い日付書式の違いを示します。
SQL> ALTER SESSION SET NLS_TERRITORY=america NLS_LANGUAGE=american; Session altered. SQL> SELECT employee_id EmpID, 2 SUBSTR(first_name,1,1)||'.'||last_name "EmpName", 3 TO_CHAR(hire_date,'DS') "Hiredate", 4 TO_CHAR(hire_date,'DL') "Long HireDate" 5 FROM employees 6* WHERE employee_id <105; EMPID EmpName Hiredate Long HireDate ---------- --------------------------- ---------- ----------------------------- 100 S.King 06/17/1987 Wednesday, June 17, 1987 101 N.Kochhar 09/21/1989 Thursday, September 21, 1989 102 L.De Haan 01/13/1993 Wednesday, January 13, 1993 103 A.Hunold 01/03/1990 Wednesday, January 3, 1990 104 B.Ernst 05/21/1991 Tuesday, May 21, 1991 SQL> ALTER SESSION SET SET NLS_TERRITORY=germany NLS_LANGUAGE=german; Session altered. SQL> SELECT employee_id EmpID, 2 SUBSTR(first_name,1,1)||'.'||last_name "EmpName", 3 TO_CHAR(hire_date,'DS') "Hiredate", 4 TO_CHAR(hire_date,'DL') "Long HireDate" 5 FROM employees 6* WHERE employee_id <105; EMPID EmpName Hiredate Long HireDate ---------- --------------------------- -------- ------------------------------ 100 S.King 17.06.87 Mittwoch, 17. Juni 1987 101 N.Kochhar 21.09.89 Donnerstag, 21. September 1989 102 L.De Haan 13.01.93 Mittwoch, 13. Januar 1993 103 A.Hunold 03.01.90 Mittwoch, 3. Januar 1990 104 B.Ernst 21.05.91 Dienstag, 21. Mai 1991
例9-8に、アメリカ合衆国とドイツでの小数点文字とグループのセパレータの違いを示します。
SQL> ALTER SESSION SET SET NLS_TERRITORY=america; Session altered. SQL> SELECT employee_id EmpID, 2 SUBSTR(first_name,1,1)||'.'||last_name "EmpName", 3 TO_CHAR(salary, '99G999D99') "Salary" 4 FROM employees 5* WHERE employee_id <105 EMPID EmpName Salary ---------- --------------------------- ---------- 100 S.King 24,000.00 101 N.Kochhar 17,000.00 102 L.De Haan 17,000.00 103 A.Hunold 9,000.00 104 B.Ernst 6,000.00 SQL> ALTER SESSION SET SET NLS_TERRITORY=germany; Session altered. SQL> SELECT employee_id EmpID, 2 SUBSTR(first_name,1,1)||'.'||last_name "EmpName", 3 TO_CHAR(salary, '99G999D99') "Salary" 4 FROM employees 5* WHERE employee_id <105 EMPID EmpName Salary ---------- --------------------------- ---------- 100 S.King 24.000,00 101 N.Kochhar 17.000,00 102 L.De Haan 17.000,00 103 A.Hunold 9.000,00 104 B.Ernst 6.000,00
スペインでは、従来から「ch」、「ll」および「ñ」を独自の文字として扱っており、順序としてはそれぞれc、lおよびnの後になります。例9-9に、従業員名ChenおよびChungに対してスペイン語のソートを使用した場合の結果を示します。
SQL> ALTER SESSION SET NLS_SORT=binary; Session altered. SQL> SELECT employee_id EmpID, 2 last_name "Last Name" 3 FROM employees 4 WHERE last_name LIKE 'C%' 5* ORDER BY last_name EMPID Last Name ---------- ------------------------- 187 Cabrio 148 Cambrault 154 Cambrault 110 Chen 188 Chung 119 Colmenares 6 rows selected. SQL> ALTER SESSION SET NLS_SORT=spanish_m; Session altered. SQL> SELECT employee_id EmpID, 2 last_name "Last Name" 3 FROM employees 4 WHERE last_name LIKE 'C%' 5* ORDER BY last_name EMPID Last Name ---------- ------------------------- 187 Cabrio 148 Cambrault 154 Cambrault 119 Colmenares 110 Chen 188 Chung 6 rows selected.
NLS_LANGUAGE
パラメータによって、データベースから返されるデータベース・エラー・メッセージの言語も制御されます。SQL文を送信する前にこのパラメータを設定すると、ローカル言語固有のデータベース・エラー・メッセージがアプリケーションに返されます。
次のサーバー・メッセージについて考えてみます。
ORA-00942: table or view does not exist
NLS_LANGUAGE
パラメータをフランス語に設定すると、サーバー・メッセージは次のように表示されます。
ORA-00942: table ou vue inexistante
Javaアプリケーションでは、リソース・バンドルを使用して、JSPページで使用される、ローカライズされた様々なテキストが提供されています。
リソース・バンドルには、ロケール固有のオブジェクトが含まれています。ロケール固有のリソース(ページに表示するテキストなど)がプログラムで必要な場合は、現在のユーザー・ロケールに適したリソース・バンドルからロードできます。この方法では、実際のテキストをリソース・バンドルに分離することによって、大部分がユーザー・ロケールから独立したプログラム・コードを記述できます。
リソース・バンドル・テクノロジには、次のような特徴があります。
MyResources
であるとします。ドイツ語のロケール固有のバージョンは、MyResources_de
などとなります。
String
は、MyResources
ではCancel
と定義されていますが、MyResources_de
ではAbbrechen
と定義されている場合があります。
CH
)のドイツ語(de
)などです。
アプリケーションでリソース・バンドルを使用するには、次の手順を実行します。
サンプル・アプリケーションでは、次の場所でリソース・バンドルを使用できます。
value
プロパティを、リソース・バンドルからテキストを取得する式に設定します。
この項では、次のタスクについて説明します。
デフォルトのリソース・バンドルを作成するには、次の手順を実行します。
java.util.ListResourceBundle
を拡張する新しいJavaクラスMyResources.java
を作成します。
public class MyResources extends ListResourceBundle { public Object[][] getContents() { return contents; } static final Object[][] contents = { }; }
static final Object[][] contents = { // LOCALIZE THIS {"CompanyName", "AnyCo Corporation"}, {"SiteName", "HR Application"}, {"FilterButton", "Filter"}, {"UpdateButton", "Update"}, // END OF MATERIAL TO LOCALIZE };
完成したリソース・バンドル・クラスは、例9-10のようになります。
public class MyResources extends ListResourceBundle { public Object[][] getContents() { return contents; } static final Object[][] contents = { // LOCALIZE THIS {"CompanyName", "AnyCo Corporation"}, {"SiteName", "HR Application"}, {"FilterButton", "Filter"}, {"UpdateButton", "Update"}, // END OF MATERIAL TO LOCALIZE }; }
アプリケーションをグローバル化するには、サポートする様々なロケールについて、各言語での項目のテキストを含む、ロケール固有のリソース・バンドルを作成する必要があります。
リソース・バンドルで定義されたテキストをJSPページで使用するには、次の手順を実行します。
edit.jsp
など)をビジュアル・エディタで開きます。
None
に設定します。jsp:usebeanタグを新しい行に追加します。IDとしてmyResources
を入力し、クラスとしてhr.MyResources
を入力します。「有効範囲」を「セッション」
に設定し、「OK」をクリックします。
「スクリプトレットの挿入」ダイアログ・ボックスで、次のように、リソース・バンドルからテキストを取得するスクリプトを入力します。
out.println(myResources.getString("CompanyName") + ": " + myResources.getString("SiteName"));
<h2 align="center"> <% = myResources.getString("CompanyName") + ": " + myResources.getString("SiteName")); %> </h2>
<% out.println(myResources.getString("UpdateButton"));%>
<input type="submit" value=<% out.println(myResources.getString("UpdateButton"));%> />
ここでアプリケーションを実行すると、リソース・バンドルで定義したテキストがページに表示されます。
|
Copyright © 2007 Oracle Corporation. All Rights Reserved. |
|