エンティティのローカリゼーション

XSLTテンプレートをローカライズする方法はかなりあります。一部の方法はLebedevのスタジオで説明されていますが、今日はエンティティを使用したローカライズについて説明します。

ENTITY


DTDを詳しく調べることなく、「エンティティ」とは何かについて最初から説明します。 エンティティは、DTDを使用して記述され、略語として使用されるXMLドキュメント内の一意の定数です。 そのような置換の例は、標準キーボードレイアウトに存在しない文字のレタリングです(©、®、₤など)。 エンティティの説明は次のとおりです。

<!ENTITY - "-">

または、XSLTの詳細な説明:

<! DOCTYPE xsl:stylesheet [
<! ENTITY - "-" >
] >


* This source code was highlighted with Source Code Highlighter .


XMLテーブルのエンティティは、次のように置換されます。 entity-name ;
例として、有名なエンティティnbsp(改行なしスペース)について説明します。

<!ENTITY nbsp "&amp;#160;">

HTML DTDの多くの「標準」エンティティを見ることができます: www.w3.org/TR/xhtml1/DTD/xhtml-lat1.ent

(X)HTMLですべての特殊文字のエンティティがデフォルトで記述されている場合、XSTではamp(&amp; amp;)、lt(&amp; lt;)、gt(&amp; gt;)の3つのエンティティのみが定義されます。 nbspを使用する場合は、特殊文字の説明を含む既製のテーブルを使用するか、エンティティを自分で説明する必要があります。

ローカリゼーション(開始)


エンティティを使用して、XSLTテンプレートの最も単純なローカライズを作成してみましょう。
<? xml version ="1.0" encoding ="UTF-8" ? >

<! DOCTYPE xsl:stylesheet [
<! ENTITY labelHello ", !" >
] >

< xsl:stylesheet version ="1.0" xmlns:xsl ="http://www.w3.org/1999/XSL/Transform" >
< xsl:output encoding ="utf-8" method ="xml" />

< xsl:template match ="/" >
< xsl:text > &labelHello; </ xsl:text >
</ xsl:template >

</ xsl:stylesheet >


* This source code was highlighted with Source Code Highlighter .


結果は明らかだと思います。 しかし、この例には大きな欠点が1つあります。言語を変更するときは、すべてのテンプレートのすべてのエンティティを置き換える必要があります。つまり、そのようなローカライズにはほとんど意味がありません。 ここで、サイトが小さく、すべての言語定数を1か所で収集できるとします。 この場所をlang.dtdファイルとし、「言語」エンティティのみを記述します。 このようなDTDファイルの例を次に示します。

<? xml version ="1.0" encoding ="UTF-8" ? >

<! ENTITY labelHello ", !" >
<! ENTITY labelLogin "" >
<! ENTITY labelRegister "" >

* This source code was highlighted with Source Code Highlighter .


ここで小さなことは、このファイルをXSLTテンプレートに含めることです。

<! DOCTYPE xsl:stylesheet SYSTEM "lang.dtd" >

* This source code was highlighted with Source Code Highlighter .


後者のオプションはすでにかなり機能しています。 言語を変更するには、1つのファイルを置き換えるだけです。 しかし、場合によっては、これではまだ十分ではありません。

CMSローカリゼーション


すべての言語ファイルが配列として表されているか、通常はデータベースにあるCMSがあるとします。 システムのローカライズとXSLTテンプレートをリンクする最も簡単な方法は、「言語」エンティティを持つDTD ファイルを自動的に生成することです。 もちろん、このオプションは最悪ではありませんが、DTDをその場で生成するというわずかに異なるオプションがあります。 これには2つの利点があります。第1に、ローカライズを変更するときに言語DTDファイルを更新する必要がなくなりました。 次に、ローカライズを簡単に変更して、CMSによってインストールされる言語の言語エンティティを提供できます。

lang.dtdファイルのように、コンテンツを提供するスクリプトを記述したとします。これをXSLTテンプレートに含めます。

<! DOCTYPE xsl:stylesheet SYSTEM "http://localhost/lang.php" >

* This source code was highlighted with Source Code Highlighter .


ここでは、ドメインにバインドするという、決して解決できない問題が発生します。 しかし、CMSがPHPで記述されている場合(他の言語については答えません)、絶望するには早すぎます:)

バージョン4.3以降のPHPでは、独自のプロトコルを実装できます。 たとえば、プロトコルサポートファイル(ファイル://)またはその他を実装できます。 開発者は、ユーザープロトコルの実装を担当します。 これについては詳しく説明しません。 これは別のトピックです。 PHPのドキュメントプロトコルの実装について読むことができ、私のプロジェクトのSVNで完成した例を参照できます

これをXSLTに適用します。 langなどのプロトコルを実装し、テンプレートを修正します。

<! DOCTYPE xsl:stylesheet SYSTEM "lang://modulename" >

* This source code was highlighted with Source Code Highlighter .

Source: https://habr.com/ru/post/J61501/


All Articles