Previous: AppData, Up: List of Data Formats [Contents][Index]
XMLファイル内の翻訳可能な文字列のマーキングは、別の"ルール"ファイルを通じて行われ、これはInternationalization Tag
Set標準(ITS,
http://www.w3.org/TR/its20/)を利用します。現在サポートされているITSデータカテゴリーは、‘Translate’、‘Localization
Note’、‘Elements Within Text’、‘Preserve
Space’です。これらに加えて、xgettext
は以下の拡張データカテゴリーも認識します。
このデータカテゴリーは抽出されたテキストのmsgctxt
に関連付けられます。グローバルルールでは、contextRule
要素は以下を含みます:
selector
属性(必須)。これは、このルールが適用されるノードを選択するabsolute selectorを含みます。
msgctxt
値を保持するノードを指す、relative selectorを含むcontextPointer
属性(必須)。
msgid
値を保持するボードを指すrelative selectorを含む、textPointer
属性(オプション)。
このデータカテゴリーは、特別なXML文字(<
、>
、&
、"
)が、entity
referenceでエスケープされるかどうかを示します。グローバルルールでは、escapeRule
要素は以下を含みます:
selector
属性(必須)。これは、このルールが適用されるノードを選択するabsolute selectorを含みます。
yes
またはno
をもつescape
属性(必須)。
このデータカテゴリーは、標準の‘Preserve
Space’カテゴリーを、追加の値‘trim’で拡張します。この値は、コンテントの前または後ろの空白文字を削除することを意味しますが、中間にある空白文字は正規化しません。グローバルルールでは、preserveSpaceRule
要素は、以下を含みます:
selector
属性(必須)。これは、このルールが適用されるノードを選択するabsolute selectorを含みます。
default
、preserve
、trim
をもつspace
属性(必須)。
これらすべての拡張データカテゴリーは、グローバルルールだけを表現でき、ルール要素は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ファイルのワイルドカードパターンを示します7。locatingRule
要素は、子要素として、XMLファイルの内容にたいするチェックを追加する、documentRule
要素をもつことができます。
1番目のルールはファイル拡張子.xmlをもつ任意のファイルにマッチしますが、root要素が‘<messages>’のXMLファイルだけに適用されます。
2番目のルールは、同じITSルールファイルが、拡張子.msgをもつ任意のファイルにも適用されることを示しています。locatingRule
のname
属性(オプション)により、ルールを名前で選択することができ、これは通常xgettext
の-L
オプションで行われます。
関連付けられたITSルールファイルは、locatingRule
またはdocumentRule
のtarget
属性により示されます。これがdocumentRule
要素内で指定された場合には、親要素locatingRule
はtarget
属性をもつべきではありません。
locatingルールファイルは、ファイル拡張子.locをもたなければなりません。ITSルールファイルとlocatingルールファイルは、$prefix/share/gettext/itsディレクトリーにインストールされていなければなりません。これらのファイルが1度正確にインストールされれば、xgettext
はマッチするXMLファイルから翻訳可能文字列を抽出することができます。
XMLでは、翻訳文字列にたいして2つのユースケースがあります。1つは翻訳文字列が直接プログラムにより評価されるケースで、もう1つは翻訳文字列が元のXMLドキュメントに書き戻されてマージされるケースです。前者のケースでは、抽出文字列内の特別な文字はエスケープされるべきではなく、後者ではエスケープされるべきです。特別な文字のエスケープを制御するために、データカテゴリー‘Escape Special Characters’を使うことができます。
翻訳をマージするために、--xml
オプションを指定して‘msgfmt’プログラムを使用することができます。‘msgfmt’プログラムを呼び出す方法についての詳細は、msgfmt Invocationを参照してください。‘msgfmt’の--xml
オプションは、文字のエスケープを処理しないので、翻訳文字列は、マークアップのための要素のような、任意のXML構造をもつことができます。
ファイル名のマッチングは入力ファイル名から接尾辞.in
を取り除いた後に行われることに注意してください。したがって、pattern
属性には、.in
にマッチするパターンを含めてはなりません。たとえば、入力ファイル名がfoo.msg.inの場合、パターンは*.in
ではなく、*.msg
、または単に*
とするべきです。