Locale::Po4a::TransTractor(3pm) | Po4a Tools | Locale::Po4a::TransTractor(3pm) |
Locale::Po4a::TransTractor - 汎用翻訳抽出機構
po4a (PO for anything) プロジェクトは、gettext ツールが想定していないドキュメントのような領域で翻訳をしやすくすること (またより興味深いのは、翻訳文の保守がしやすくなること) を目標にしています。
このクラスは、翻訳可能な文字列を検索するためのドキュメントのパース、PO ファイルへの抽出、出力したドキュメントへの翻訳した文字列の置換に使用する、すべての po4a パーサの祖先になります。
もっと形式張って言うと、入力として以下の引数を取ります:
以下を出力します:
これを視覚的に表すと次のようになります:
入力ドキュメント-\ /---> 出力ドキュメント \ / (翻訳済) +-> parse() 関数 ---------+ / \ 入力 PO --------/ \---> 出力 PO (抽出済)
この関数は後述の process() 関数から呼ばれますが、new() 関数を使用してドキュメントに内容を手で追加するのを選んだ場合、この関数自体を呼ばねばなりません。
以下の例は、"<p>" で始まる段落のリストをパースします。簡単にするために、ドキュメントは整形されている、すなわち、現れるタグは '<p>' のみで、各段落はこのタグで必ず始まると仮定します。
sub parse { my $self = shift; PARAGRAPH: while (1) { my ($paragraph,$pararef)=("",""); my $first=1; my ($line,$lref)=$self->shiftline(); while (defined($line)) { if ($line =~ m/<p>/ && !$first--; ) { # Not the first time we see <p>. # Reput the current line in input, # and put the built paragraph to output $self->unshiftline($line,$lref); # Now that the document is formed, translate it: # - Remove the leading tag $paragraph =~ s/^<p>//s; # - push to output the leading tag (untranslated) and the # rest of the paragraph (translated) $self->pushline( "<p>" . $self->translate($paragraph,$pararef) ); next PARAGRAPH; } else { # Append to the paragraph $paragraph .= $line; $pararef = $lref unless(length($pararef)); } # Reinit the loop ($line,$lref)=$self->shiftline(); } # Did not get a defined line? End of input file. return; } }
parse 関数を実装したら、次節で説明するパブリックインターフェースを用いて document クラスを使用できます。
new() で受け付けるもの以外の引数 (と想定する型):
This array
"@{$self->{TT}{doc_in}}" holds this
input document data as an array of strings with alternating meanings.
* The string $textline holding each line of the
input text data.
* The string "$filename:$linenum"
holding its location and called as
"reference" ("linenum" starts
with 1).
パースは一切行わないことに注意してください。入力ファイルがドキュメントに格納した時点で parse() 関数を使用するべきです。
This translated document data are provided by:
* "$self->docheader()" holding the
header text for the plugin, and
* "@{$self->{TT}{doc_out}}" holding
each line of the main translated text in the array.
[po4a ドキュメントの通常の使用...] ($percent,$hit,$queries) = $document->stats(); print "We found translations for $percent\% ($hit from $queries) of strings.\n";
この関数は、エラー時に null 以外の数値を返します。
Four functions are provided to get input and return output. They are very similar to shift/unshift and push/pop of Perl.
* Perl shift returns the first array item and drop it from the array. * Perl unshift prepends an item to the array as the first array item. * Perl pop returns the last array item and drop it from the array. * Perl push appends an item to the array as the last array item.
The first pair is about input, while the second is about output. Mnemonic: in input, you are interested in the first line, what shift gives, and in output you want to add your result at the end, like push does.
翻訳するべきテキストを扱う関数を一つ用意しています。
この関数は、いくつか追加引数を取れます。ハッシュとしてまとめなければなりません。例えば:
$self->translate("string","ref","type", 'wrap' => 1);
動作:
コマンドラインで指定した出力文字セットが使われます。指定しない場合は、入力 PO ファイルの文字セットを使用します。入力 PO ファイルにデフォルトの "CHARSET" がある場合は、入力ドキュメントの文字セットを返します。そして、エンコーディングの変換は行われません。
現在の TransTractor の欠点の一つに、(debconf テンプレートや、.desktop ファイルのような) すべての言語を含む翻訳済みドキュメントを扱えないというものがあります。
この問題に対処するには、以下のようにインターフェースのみを変更することが必要です:
$self->pushline_all({ "Description[".$langcode."]=". $self->translate($line,$ref,$langcode) });
これで十分だといいのですが ;)
Denis Barbier <barbier@linuxfr.org> Martin Quinson (mquinson#debian.org) Jordi Vilalta <jvprat@gmail.com>
倉澤 望 <nabetaro@debian.or.jp> Debian JP Documentation ML <debian-doc@debian.or.jp>
2020-12-09 | Po4a Tools |