名前

Locale::Po4a::Xml - XML文書及びその派生をPOファイルと相互変換する

説明

po4a (PO for anything) プロジェクトは、gettext ツールが想定していないドキュメントのような領域で翻訳をしやすくすること (またより興味深いのは、翻訳文の保守がしやすくなること) を目標にしています。
Locale::Po4a::Xml は、XML 文書をほかの [自然] 言語へ翻訳するのを助けるモジュールです。XML を元にした文書用モジュールを作成する土台としても使うことができます。

PO4A::XML を使った翻訳

このモジュールは、一般的な XML 文書を直接扱うのに使用できます。ほとんどの XML を元にした文書では、タグの内容にテキストが書かれているため、タグの内容を抽出し属性は抽出しません。
振る舞いをカスタマイズできるような、(次節で説明する)オプションがあります。手元の文書形式と合わない場合は、形式を詳細に記述できるよう、迷わずこれから派生した独自のモジュールを書いてください。その方法は以下にある「派生モジュールの書き方」節を参照してください。

このモジュールで使用できるオプション

グローバルデバッグオプションにより、このモジュールが何か重要なものを読み飛ばしていないか確認するように、除外した文字列を表示するようになります。
以下は、このモジュール固有のオプションです:
nostrip
抽出した文字列の前後にある空白の除去を防ぎます。
wrap
翻訳する文字列を正規化し、空白は重要ではないとみなして、翻訳された文書を折り返します。このオプションは、カスタムタグオプションで上書きされます。以下の translated オプションを参照してください。
unwrap_attributes
属性は既定で折り返されます。このオプションは折り返しを無効にします。
caseinsensitive
タグや属性の検索を、大文字小文字を意識せずに行います。これを定義すると、<BooK>laNG や <BOOK>Lang は <book>lang として扱います。
escapequotes
出力文字列で引用符をエスケープします。例えばAndroidのビルドツールで使用する文字列リソースを作成する場合などに必要です。 https://developer.android.com/guide/topics/resources/string-resource.html も参照してください
includeexternal
定義されている場合、外部実体が生成した(翻訳済み)文書に含まれ、文字列の抽出のために使用されます。定義されていなければ、外部実体を独立した文書として、個別に翻訳する必要があります。
ontagerror
このオプションは、(開始タグと一致しない終了タグといった)不正な XML 文法があった場合のこのモジュールの振る舞いを定義します。以下の値を取り得ます。
fail
既定値です。エラーを表示して終了します。
warn
処理を継続し警告を表示します。
silent
何も警告を表示せずに処理を継続します。
 
このオプションを使用する場合は注意してください。通常、入力ファイルを修正するのをお勧めします。
tagsonly
注:このオプションは非推奨です。 tags オプションで指定したタグしか抽出しません。もしくは、指定したタグを除くすべてのタグを抽出します。
doctype
文書の最初の行の doctype (が定義されていればそれ)と照合させようとする文字列。照合しなければ、文書は不正な型と見なし警告します。
addlang
lang="..." 属性を追加するタグへのパス(例: <bbb><aaa>)を示す文字列です。言語は、PO ファイルの .po 拡張子を除いた basename で定義されます。
optionalclosingtag
(HTMLのように)終了タグを省略可能かどうかを示す真偽値。既定では、閉じタグがない場合は ontagerror に従って制御されるエラーが発生します。
tags
注意:このオプションは非推奨です。代わりに translated オプションや untranslated オプションを使用してください。 翻訳したり読み飛ばしたりするタグの空白区切りリストです。既定では、指定したタグは除外されますが、"tagsonly" オプションを使用すると、指定したタグのみを含めるようになります。タグは <aaa> の形でなければなりませんが、<bbb> タグの中に入っているときのみ <aaa> タグの内容を翻訳したい場合、つなげて書く (<bbb><aaa>) ことができます。 タグ階層の前に文字を付けてタグのオプションを指定できます。例えば、l<w>(改行)や l<W> (改行なし)を付けて、グローバル wrap オプションで指定した既定の振る舞いを上書きできます。 例:W<chapter><title>
attributes
翻訳したいタグの属性の空白区切りリスト。属性の名前(例えば "lang")で指定することもできますが、タグの階層を前につけて、この属性が指定されたタグの中にあるときだけ翻訳されるように指定することができます。例えば<bbb><aaa>lang は、lang属性が<aaa>タグの中にあり、さらにそれが<bbb>の中にある場合のみ翻訳されるように指定します。
foldattributes
インラインタグの中で翻訳しない属性です。そうでなければ、タグのすべての属性を po4a-id=<id> によって置換します。 これは、属性を翻訳してはならない場合に有効で、翻訳者のために文字列を単純化し、誤植を避けることができます。
customtag
タグとして扱いたくないタグの空白区切りリストです。このタグはインラインとして扱われ、閉じる必要はありません。
break
改行するとして扱いたいタグの空白区切りリストです。既定では、すべてのタグに対して改行を行います。 タグは <aaa> の形でなければなりませんが、別のタグ (<bbb>) の中に入っているときにのみタグ (<aaa>) の内容を翻訳したい場合、つなげて書く (<bbb><aaa>) ことができます。 タグは、 breakinlineplaceholdercustomtag 設定文字列のうち1つだけのリスト中に含まれている必要があります。
inline
インラインとして扱いたいタグの空白区切りリストです。既定では、すべてのタグのところで文字の並びが改行されます。 タグは <aaa> の形でなければなりませんが、別のタグ (<bbb>) の中に入っているときにのみタグ (<aaa>) の内容を翻訳したい場合、つなげて書く (<bbb><aaa>) ことができます。
placeholder
プレースホルダとして扱われるべきタグの空白区切りリストです。プレースホルダは文字の並びを改行しませんが、プレースホルダの内容は別々に翻訳されます。 そのブロック内のプレースホルダの場所は、以下のような文字列の印が付きます:
  <placeholder type=\"footnote\" id=\"0\"/>
    
タグは <aaa> の形でなければなりませんが、別のタグ (<bbb>) の中に入っているときにのみタグ (<aaa>) の内容を翻訳したい場合、つなげて書く (<bbb><aaa>) ことができます。
break-pi
既定では、処理命令(すなわち、"<? ... ?>"タグ)はインラインタグとして扱われます。 PIを改行タグとして処理したい場合は、このオプションを渡します。 未処理のPHPタグは、構文解析器によって処理命令として扱われることに注意してください。
nodefault
モジュールが既定でいずれの分類にも設定するべきではないタグの空白区切りリストです。 If you have a tag which has its default setting by the subclass of this module but you want to set alternative setting, you need to list that tag as a part of the nodefault setting string.
cpp
C プリプロセッサディレクティブをサポートします。このオプションをセットすると、po4a はプリプロセッサディレクティブを段落区切りとして扱います。XML ファイルが前処理 (preprocess) されなければならない場合に重要です。そうでなければ、po4a が現在の段落に属すと見なせなければ、行の中にディレクティブを挿入する可能性があり、これをプリプロセッサが認識できないからです。注意: プリプロセッサディレクティブは、タグとタグの間にのみ現れなければなりません (タグを分断してはなりません)。
translated
翻訳するタグの空白区切りリストです。 タグは <aaa> の形でなければなりませんが、別のタグ (<bbb>) の中に入っているときにのみタグ (<aaa>) の内容を翻訳したい場合、つなげて書く (<bbb><aaa>) ことができます。 You can also specify some tag options by putting some characters in front of the tag hierarchy. This overrides the default behavior specified by the global wrap and defaulttranslateoption option.
w
翻訳し、内容を再改行するタグです。
W
翻訳を行うが改行を行うべきでない内容のコンマ区切りリストです。
i
インラインで訳されるべきタグです。
p
プレースホルダとして翻訳されるべきタグです。
 
Internally, the XML parser only cares about these four options: w W i p.
 
* Tags listed in break are set to w or W depending on the wrap option.
 
* Tags listed in inline are set to i.
 
* Tags listed in placeholder are set to p.
 
* Tags listed in untranslated are without any of these options set.
 
You can verify actual internal parameter behavior by invoking po4a with --debug option.
 
例:W<chapter><title>
 
Please note a tag should be listed in either translated or untranslated setting string.
untranslated
翻訳しないタグの空白区切りリストです。 タグは <aaa> の形でなければなりませんが、別のタグ (<bbb>) の中に入っているときにのみタグ (<aaa>) の内容を翻訳したい場合、つなげて書く (<bbb><aaa>) ことができます。 Please note a translatable inline tag in an untranslated tag is treated as a translatable breaking tag, i setting is dropped and w or W is set depending on the wrap option.
defaulttranslateoption
translated、untranslated、break、inline、または placeholder のいずれでもないタグのデフォルトカテゴリ。 This is a set of letters as defined in translated and this setting is only valid for translatable tags.

WRITING DERIVATIVE MODULES

翻訳するタグや属性の定義

最も簡単なカスタマイズとして、パーサに変換させたいタグや属性を定義できます。これを初期化関数で行うべきです。まず、main 関数を呼び出し、コマンドラインオプションを取得し、カスタム定義をオプションハッシュに追加します。コマンドラインから新しいオプションを扱いたい場合は、main の初期化を呼び出す前に、以下のように定義してください:
  $self->{options}{'new_option'}='';
  $self->SUPER::initialize(%options);
  $self->{options}{'_default_translated'}.=' <p> <head><title>';
  $self->{options}{'attributes'}.=' <p>lang id';
  $self->{options}{'_default_inline'}.=' <br>';
  $self->treat_options;
You should use the _default_inline, _default_break, _default_placeholder, _default_translated, _default_untranslated, and _default_attributes options in derivative modules. This allow users to override the default behavior defined in your module with command line options.

コマンドラインオプションで既定の挙動を上書きする

If you don't like the default behavior of this xml module and its derivative modules, you can provide command line options to change their behavior.
See Locale::Po4a::Docbook(3pm),

found_string 関数の上書き

その他の簡単なステップとしては、パーサから抽出した文字列を翻訳するために受け取る "found_string" 関数の上書きがあります。そこでは、翻訳する文字列を制御し、翻訳自体の前後での変換を行えます。
抽出したテキスト、それがどこにあったかの参照位置、そして、どの文字列を翻訳するか、どのように翻訳するか、どのようにコメントを生成するか、といったことを制御する追加情報を含むハッシュを受け取ります。
このオプションの内容は、(このハッシュのエントリで指定する) 文字列の種類に依存します:
type="tag"
見つかった文字列は翻訳するタグの内容です。"tag_options" エントリにはモジュールの "tags" オプションにあるタグ階層の直前のオプション文字を含みます。
type="attribute"
検出した文字列が、翻訳可能な属性値であることを意味します。"attribute" エントリは、属性名を持っています。
これは、翻訳済みドキュメントでオリジナルを置き換えるテキストを、返さなければなりません。以下に、この関数の基本的な例を示します:
  sub found_string {
    my ($self,$text,$ref,$options)=@_;
    $text = $self->translate($text,$ref,"type ".$options->{'type'},
      'wrap'=>$self->{options}{'wrap'});
    return $text;
  }
別のシンプルな例は、(いくつかの文字列のフィルタでしかない) 新しい Dia モジュールにあります。

タグタイプの変更 (TODO)

これはかなり複雑な部分ですが、全体のカスタマイズを行うことができます。それぞれタグタイプの振る舞いを定義したハッシュのリストを基にしています。このリストはソートされるべきであり、もっとも具体的なもの (beginning キーで始まり end キーの順) の後に一般的なタグが来るようにします。タグタイプを定義するには、以下のキーを持つハッシュを作成する必要があります:
beginning
"<" の後に、タグの始まりを指定します。
end
">" の前に、タグの終わりを指定します。
breaking
改行タグクラスかどうかを示します。非改行 (インライン) タグは、別のタグの内容の一部とすることができるものです。これは、偽 (0) または真 (1) の値、または未定義を取ることができます。これを未定義のままにしておくと、このクラスの具体的なタグが改行タグかどうかを返す f_breaking 関数を定義しなければなりません。
f_breaking
次のタグが改行されているかどうかを調べる関数です。breaking オプションが定義されていなければ、定義する必要があります。
f_extract
このキーを未定義にしておくと、汎用抽出関数はタグ自体を抽出しなければなりません。これは、内部に別のタグがある、または特殊な構造を持つタグにとって、メインのパーサがおかしくならないですみ、役に立ちます。この関数は、入力ストリームからタグを削除するかどうかを決める、真偽値を受け付けます。
f_translate
この関数は、タグを ( get_string_until() のフォーマットで) 受け取り、変換タグ (翻訳属性や変換が必要なすべて) を単一の文字列で返します。

派生パーサ作成時に使用する内部関数

タグに対する動作

get_path()
この関数は、ドキュメントのルートからの現在のタグのパスを、<html><body><p> の形態で返します。 タグ (括弧なし) の追加配列を引数に渡せます。要素パスは現在のパスの最後に追加されます。
tag_type()
この関数は、tag_types リストから、入力ストリームの次のタグに一致するもののインデックスを返します。入力ファイルの最後の場合は、-1 を返します。 Here, the tag has structure started by < and end by > and it can contain multiple lines. This works on the array "@{$self->{TT}{doc_in}}" holding input document data and reference indirectly via "$self->shiftline()" and "$self->unshiftline($$)".
extract_tag($$)
この関数は、入力ストリームから、開始部と終了部を除いた次のタグを、入力ファイルからの参照を管理するため配列の形で返します。パラメータは以下の二つがあります。タグのタイプ (tag_type が返す形) と入力ストリームから削除するかどうかを指定する真偽値です。 This works on the array "@{$self->{TT}{doc_in}}" holding input document data and reference indirectly via "$self->shiftline()" and "$self->unshiftline($$)".
get_tag_name(@)
この関数は、extract_tag が返した配列を引数で受け取り、受け取ったタグの名前を返します。
breaking_tag()
この関数は、入力ストリームの次のタグが、改行タグかそうでない (インラインタグ) かを真偽値で返します。入力ストリームは変化しません。
treat_tag()
この関数は入力ストリームから次のタグを翻訳します。タグタイプのカスタム翻訳関数ごとに使用します。 This works on the array "@{$self->{TT}{doc_in}}" holding input document data and reference indirectly via "$self->shiftline()" and "$self->unshiftline($$)".
tag_in_list($@)
この関数は、第一引数 (タグ階層) が第二引数 (タグのリストやタグ階層) にあるタグと一致するかどうかの文字列の値を返します。一致しない場合、0 を返します。そうでない場合、一致したタグのオプション (タグの前の文字列) か 1 (オプションがない場合) を返します。

属性に対する動作

treat_attributes(@)
This function handles the translation of the tags' attributes. It receives the tag without the beginning / end marks, and then it finds the attributes, and it translates the translatable ones (specified by the module option attributes). This returns a plain string with the translated tag.

WORKING WITH TAGGED CONTENTS

treat_content()
This function gets the text until the next breaking tag (not inline) from the input stream. Translate it using each tag type's custom translation functions. This works on the array "@{$self->{TT}{doc_in}}" holding input document data and reference indirectly via "$self->shiftline()" and "$self->unshiftline($$)".

モジュールオプションに対する動作

treat_options()
この関数は、内部構造をモジュールのオプションの (コマンドラインや initialize 関数で指定した) タグ、属性、インラインデータで満たします。

入力ドキュメントからのテキスト取得

get_string_until($%)
この関数は入力ドキュメントから、第一引数に指定した文字列が見つかるまで、行 (とその参照) を配列で返します。第二引数は、オプションのハッシュです。値が 0 は無効を表し、1 は有効を表します。 以下のオプションが有効です:
include
検索したテキストを含む配列を返すようになります
remove
入力から返ったストリームを削除します
unquoted
検索テキストが、クォート外にあることを保証します
regex
This denotes that the first argument is a regular expression rather than an plain string
skip_spaces(\@)
この関数は引数として段落の参照 (get_string_until が返すフォーマット) を受け取り、先頭の空白をスキップし、単純な文字列として返します。
join_lines(@)
この関数は、属性の配列から、テキストのシンプルな文字列を返します (参照を廃棄)。

このモジュールの状態

このモジュールはタグや属性を翻訳できます。

TODO リスト

DOCTYPE (エンティティ)
エンティティの翻訳は最小限しかサポートしていません。翻訳は全体が対象となり、タグは考慮しません。複数行のエンティティはサポートしておらず、翻訳中ではエンティティは常に再度折り返されます。
継承モジュールでのタグタイプ変更 (tag_types 構造体を $self ハッシュ内に移動?)

関連項目

Locale::Po4a::TransTractor(3pm), po4a(7)

著者

 Jordi Vilalta <[email protected]>
 Nicolas François <[email protected]>

訳者

 倉澤 望 <[email protected]>
 Debian JP Documentation ML <[email protected]>

著作権とライセンス

 Copyright © 2004 Jordi Vilalta  <[email protected]>
 Copyright © 2008-2009 Nicolas François <[email protected]>
本プログラムはフリーソフトウェアです。GPL の条項に基づき再頒布と変更を行うことができます (COPYING ファイルを参照してください)。

Recommended readings

Pages related to Locale::Po4a::Xml you should read also:

Questions & Answers

Helpful answers and articles about Locale::Po4a::Xml you may found on these sites:
Stack Overflow Server Fault Super User Unix & Linux Ask Ubuntu Network Engineering DevOps Raspberry Pi Webmasters Google Search