レベル: 初級 Laura Menke (menkell@us.ibm.com), Technical Coordinator, IBM WebSphere Developer Domain
2001年 4月 01日 Laura はこの記事で、XML および XSLT テクノロジーを活用して、ディクショナリー主導式で Web ページを動的に国際化対応させる方法を示しています。また、汎用 XSLT スタイル・シートのサンプルが提供されています。読者は、これを拡張して自分のアプリケーションに組み込むことも可能です。さらに、スタイル・シートとともにサンプルのディクショナリー・レイアウトも含まれています。この方法を利用することにより、サイトのコンテンツを変更するときに編集する必要のあるファイルの数を最小化することができます。
概要
この記事では、読者がJSP、サーブレット、HTML、XML、およびXSLTに関して一般的な知識を持っていることを想定しています。今回の記事では、XSLTスタイル・シートとXMLディクショナリーを使用してWebコンテンツを国際化対応させるための解決策を紹介します。
表示される情報を動的に国際化対応させることは、難しい課題です。たとえば、あるHTMLページに含まれているボタンとラベルを、対象言語に翻訳しなければならないとします。HTMLの翻訳は、サーブレットやJSPを使用してコーディングしたり、各言語ごとに別個のページを使用したりして行うことができます。しかし、ソースが動的なものである場合には、こうした解決策は非常にコストが高く、また込み入った作業が必要になる可能性があります。
ほとんどのWebアプリケーションは、XMLでフォーマットされたデータ (HTMLページも含まれます) を扱います。その結果として、標準のXMLベースの変換メカニズム (たとえばXSLT) を使用して、対象言語に応じてテキストの一部を置き換えることができます。しかし、単にXSLTを使用するだけでは、言語ペアごとに1つのXSLTスタイル・シートが必要になります。この問題を解決するには、テキストの翻訳可能部分の動的置き換えを制御するための、ディクショナリー主導式の汎用XSLTスタイル・シートを作成する必要があります。こうすると、ユーザーは、新しいディクショナリーを用意して、汎用XSLTスタイル・シートを新しい状況に適用するだけで済むため、情報を国際化対応させるためのコストと複雑さが削減されます。またこれにより、テキストの翻訳を中央の1個所に保管して、ディクショナリーを再利用できるようになります。
図1: 汎用XSLTスタイル・シートの使用
Webコンテンツの変換は、さまざまな方法で行うことができます。汎用XSLTスタイル・シートは、サーブレットでも、JSPでも、ブラウザーでも使用することができます。たとえば、Internet Explorer 5.0はXSLT変換を扱うことができますので、処理の一部をクライアントで実行させ、パフォーマンスを向上させることができます。しかし、WAPフォンやPalm Pilotはこの機能を備えていませんので、変換はサーブレットまたはJSPで行わなければなりません。
汎用XSLTスタイル・シート
XSLTスタイル・シートを定義する際に重要なことは、特定のWeb言語 (HTML、WML、またはその他のマークアップ言語) に直接結び付けられることがなく、多くの状況に適用できる、汎用スタイル・シートを作成することです。この汎用XSLTスタイル・シートに、表示される情報を国際化対応させるための基本機能を追加します。そして、これを拡張したり他のXSLTスタイル・シートに組み込んだりして、機能を追加します。汎用スタイル・シートでは以下のルールが定められています:「国際化対応が必要な、HTML/XML文書内のすべてのエレメント (ボタン、ラベル、またはテキスト) は、属性nlsid が定義されていなければならない。」nlsid の値はXMLディクショナリーへのキーとして使用されます。XSLTスタイル・シートはディクショナリー内に索引を作り、nlsid 属性の値に一致するキーを検出し、ディクショナリー内の処理中の言語と突き合わせを行い、翻訳済みテキストを取り出します。そして、翻訳テキストをエレメントの本文に置き換えまたは挿入します。ディクショナリー内の nlsid で指定されたキーを検出できない場合、スタイル・シートは、エレメントの内容をそのまま新規文書にコピーします (エレメントにデフォルトの内容が含まれている場合)。リスト1 は、この規則を具体化した汎用XSLTスタイル・シートを示しています。XSLTスタイル・シートに渡される2つのパラメーターは、使用すべきXMLディクショナリーと翻訳のために使用したい対象言語を定義するために使用されます。
汎用ディクショナリー
このXMLディクショナリーの形式は次のようになっています。ルート・エレメントはロケールです。ロケールの子は、nlsid 属性の値によって索引付けできるディクショナリー内のキーです。キーの子は、サポートされる言語で、そのテキスト部分を翻訳したものを含みます。ディクショナリーは、Webアプリケーションのページごとに、あるいはWebアプリケーションのセクションごとに定義することも、Webアプリケーション全体に関して1つのディクショナリーを使用することもできます。また、XMLディクショナリーを複数のアプリケーションで使用することもできます。 リスト2 は、ログオン画面のディクショナリーの例です。ここには、英語とドイツ語の2つの言語が含まれています。
リスト2: ログイン画面のディクショナリー
<?xml version='1.0'?>
<locale>
<userid>
<en-us>User Name</en-us>
<de>Benutzername</de>
</userid>
<password>
<en-us>Password</en-us>
<de>Passwort</de>
</password>
<logonbutton>
<en-us>Logon</en-us>
<de>Anmelden</de>
</logonbutton>
</locale>
|
Webコンテンツの外観
上で述べたように、翻訳したいすべてのエレメントについて、nlsid 属性を定義しておく必要があります。このエレメントには、デフォルトの言語が含まれる場合と含まれない場合があります。リスト3a は、デフォルト言語がある 場合のラベル・エレメントを表し、リスト3b は、デフォルト言語がない 場合を表しています。以下のエレメントの汎用スタイル・シートを適用した場合の結果は、結果3c のようになります。この例では、ブラウザーから受け取られる言語はドイツ語であり、また、上で定義したXMLディクショナリー (リスト2 を参照) が使用されます。
リスト3a: デフォルトがあるHTML文書で定義されるエレメント
<label id="useridLabel" nlsid="userid">User Name</label>
|
または
リスト3b: デフォルトがないHTML文書で定義されるエレメント
<label id="useridLabel" nlsid="userid"/>
|
リスト3c: 変換の結果:
<label id="useridLabel" nlsid="userid">Benutzername</label>
|
サーブレット変換の例
Internet ExplorerやNetscape Navigatorなどのブラウザーでは、希望する言語をユーザーが設定することができます。サーブレットまたはJSPは、HTTP要求の「Accept-Language」ヘッダーを介してユーザーの希望する言語を検索します。希望する言語は、VBScriptを使用してInternet Explorerから取り出すことができます。Webアプリケーションを国際化対応させるためには、希望する言語をパラメーターとしてXSLTスタイル・シートに渡し、HTML/XML文書で変換を実行し、国際化対応した情報を表示するだけで済みます。
たとえば、サーブレットには、HTMLページの変換を処理するための、次のようなコードを含めることができます (リスト4 を参照)。
リスト4: HTMLページの翻訳
public void doGet (HttpServletRequest req, HttpServletResponse res) throws
ServletException, IOException {
.......
XSLTProcessor processor =
org.apache.xalan.xslt.XSLTProcessorFactory.getProcessor();
Processor.setStylesheetParam("currentLocale",
req.getHeader("Accept-Language"));
processor.setStylesheetParam("dictionary-file","'nls.xml'");
Processor.process(new
org.apache.xalan.xslt.XSLTInputSource("HTMLToBeTranslated.xml"),
new
org.apache.xalan.xslt.XSLTInputSource("NLSStyleSheet.xsl"),
New
org.apache.xalan.xslt.XSLTResultTarget(OutputStreamForView));
.......
}
|
要約
この記事で私は、XSLTとXMLディクショナリーを使用して、Webコンテンツを国際化対応させるための拡張可能なソリューションを作成する方法を示しました。この方法を活用することにより、開発者が保守しなければならないコードの分量を削減することができ、また、ハードコーディングされたリソース・バンドルがアプリケーションのあちこちに散在するのを防ぐことができます。また、この方法を使用すると、24か国語で同じページ・ソースを書くなどということをしないで、1 つのページ・ソースを使用することができます。さらに、ディクショナリーは広範囲のアプリケーションで再利用できます。
参考文献
著者について  | |  | Laura Menkeは、ミネソタ州ロチェスターにあるIBM WebSphere Developer's Domainでテクニカル・コーディネーターとして勤務しています。彼女はUniversity of Wisconsin-La Crosseでコンピューター・サイエンスの学位を取得しています。現在は、University of Minnesotaで、コンピューター・サイエンスの修士号の取得を目指しています。彼女は過去3年間、各種のオブジェクト指向テクノロジーの仕事をしてきました。特に、クライアント・テクノロジーに深い関心を持っています。彼女の連絡先は menkell@us.ibm.com です。 |
記事の評価
|