Previous: , Up: List of Data Formats   [Contents][Index]


15.6.6 Preparing Rules for XML Internationalization

XMLファイル内の翻訳可能な文字列のマーキングは、別の"ルール"ファイルを通じて行われ、これはInternationalization Tag Set標準(ITS, http://www.w3.org/TR/its20/)を利用します。現在サポートされているITSデータカテゴリーは、‘Translate’、‘Localization Note’、‘Elements Within Text’、‘Preserve Space’です。これらに加えて、xgettextは以下の拡張データカテゴリーも認識します。

Context

このデータカテゴリーは抽出されたテキストのmsgctxtに関連付けられます。グローバルルールでは、contextRule要素は以下を含みます:

Escape Special Characters

このデータカテゴリーは、特別なXML文字(<>&")が、entity referenceでエスケープされるかどうかを示します。グローバルルールでは、escapeRule要素は以下を含みます:

Extended Preserve Space

このデータカテゴリーは、標準の‘Preserve Space’カテゴリーを、追加の値‘trim’で拡張します。この値は、コンテントの前または後ろの空白文字を削除することを意味しますが、中間にある空白文字は正規化しません。グローバルルールでは、preserveSpaceRule要素は、以下を含みます:

これらすべての拡張データカテゴリーは、グローバルルールだけを表現でき、ルール要素はhttps://www.gnu.org/s/gettext/ns/its/extensions/1.0ネームスペースをもつ必要があります。

以下のようなXMLドキュメントファイルmessages.xmlが与えられたとします:

<?xml version="1.0"?>
<messages>
  <message>
    <p>A translatable string</p>
  </message>
  <message>
    <p translatable="no">A non-translatable string</p>
  </message>
</messages>

1番目のテキストコンテント("A translatable string")を抽出して、2番目の("A non-translatable string")は抽出しない場合は、以下のITSルールが使用されます:

<?xml version="1.0"?>
<its:rules xmlns:its="http://www.w3.org/2005/11/its" version="1.0">
  <its:translateRule selector="/messages" translate="no"/>
  <its:translateRule selector="//message/p" translate="yes"/>

  <!-- If 'p' has an attribute 'translatable' with the value 'no', then
       the content is not translatable.  -->
  <its:translateRule selector="//message/p[@translatable = 'no']"
    translate="no"/>
</its:rules>

これとは別に‘xgettext’は、XMLファイルにITSルールを関連付ける、"locating rule"と呼ばれるファイルを必要とします。上記のITSファイルがmessages.itsに保存された場合、locating ruleは以下のようになるでしょう:

<?xml version="1.0"?>
<locatingRules>
  <locatingRule name="Messages" pattern="*.xml">
    <documentRule localName="messages" target="messages.its"/>
  </locatingRule>
  <locatingRule name="Messages" pattern="*.msg" target="messages.its"/>
</locatingRules>

locatingRule要素は、pattern属性をもたなければなりません。この属性は、リテラルのファイル名、またはXMLファイルのワイルドカードパターンを示します7locatingRule要素は、子要素として、XMLファイルの内容にたいするチェックを追加する、documentRule要素をもつことができます。

1番目のルールはファイル拡張子.xmlをもつ任意のファイルにマッチしますが、root要素が‘<messages>’のXMLファイルだけに適用されます。

2番目のルールは、同じITSルールファイルが、拡張子.msgをもつ任意のファイルにも適用されることを示しています。locatingRulename属性(オプション)により、ルールを名前で選択することができ、これは通常xgettext-Lオプションで行われます。

関連付けられたITSルールファイルは、locatingRuleまたはdocumentRuletarget属性により示されます。これがdocumentRule要素内で指定された場合には、親要素locatingRuletarget属性をもつべきではありません。

locatingルールファイルは、ファイル拡張子.locをもたなければなりません。ITSルールファイルとlocatingルールファイルは、$prefix/share/gettext/itsディレクトリーにインストールされていなければなりません。これらのファイルが1度正確にインストールされれば、xgettextはマッチするXMLファイルから翻訳可能文字列を抽出することができます。

15.6.6.1 Two Use-cases of Translated Strings in XML

XMLでは、翻訳文字列にたいして2つのユースケースがあります。1つは翻訳文字列が直接プログラムにより評価されるケースで、もう1つは翻訳文字列が元のXMLドキュメントに書き戻されてマージされるケースです。前者のケースでは、抽出文字列内の特別な文字はエスケープされるべきではなく、後者ではエスケープされるべきです。特別な文字のエスケープを制御するために、データカテゴリー‘Escape Special Characters’を使うことができます。

翻訳をマージするために、--xmlオプションを指定して‘msgfmt’プログラムを使用することができます。‘msgfmt’プログラムを呼び出す方法についての詳細は、msgfmt Invocationを参照してください。‘msgfmt’の--xmlオプションは、文字のエスケープを処理しないので、翻訳文字列は、マークアップのための要素のような、任意のXML構造をもつことができます。


Footnotes

(7)

ファイル名のマッチングは入力ファイル名から接尾辞.inを取り除いた後に行われることに注意してください。したがって、pattern属性には、.inにマッチするパターンを含めてはなりません。たとえば、入力ファイル名がfoo.msg.inの場合、パターンは*.inではなく、*.msg、または単に*とするべきです。