Locale::Po4a::TransTractor(3pm) | Po4a 工具 | Locale::Po4a::TransTractor(3pm) |
Locale::Po4a::TransTractor - 通用翻譯提取器。
Po4a (PO For Anything) 專案的目標是在文件等不需要翻譯的領域使用 gettext 工具簡化翻譯(更有趣的是,簡化翻譯的維護)。
這個類是每個 po4a 解析器的祖先,用於解析文件、搜尋可翻譯字串、將它們提取到 PO 檔案並在輸出文件中用它們的翻譯替換它們。
更正式地說,它接受以下引數作為輸入:
作為輸出,它產生:
以下是這一點的圖形表示:
輸入文件 --\ /---> 輸出文件 \ / (已翻譯) +-> 解析() 函式 -----+ / \ 輸入 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--; ) { # 這不是我們第一次看到<p>。 # 將當前行重新放入輸入, # 並將構建的段落輸出 $self->unshiftline($line,$lref); # 現在文件已形成,請翻譯它: # - 刪除前導標記 $paragraph =~ s/^<p>//s; # - 按鍵輸出前導標籤(未翻譯)和 # 段落的其餘部分(已翻譯) $self->pushline( "<p>" . $self->translate($paragraph,$pararef) ); next PARAGRAPH; } else { # 追加到段落後面 $paragraph .= $line; $pararef = $lref unless(length($pararef)); } # 重新初始化迴圈 ($line,$lref)=$self->shiftline(); } # 沒有得到定義的行嗎?輸入檔案的結尾。 return; } }
一旦實現瞭解析函式,就可以使用下一節中介紹的公共介面來使用 document 類。
引數,除了 new() 接受的引數(具有預期型別):
此陣列
"@{$self->{TT}{doc_in}}"
將此輸入文件資料儲存為。
具有交替含義的字串陣列。
*字串 $textline
儲存輸入文字資料的每一行。
*字串 "$filename:$linenum"
儲存其位置並呼叫為。
"reference" ("linenum"
從 1 開始)。
請注意,它不解析任何內容。當您完成將輸入檔案打包到文件中時,應該使用 parse() 函式。
此翻譯文件資料由以下人員提供:
* "$self->docheader()"
儲存外掛的標題文字,以及。
* "@{$self->{TT}{doc_out}}"
儲存陣列中主翻譯文字的每一行。
[正常使用 po4a 文件...] ($percent,$hit,$queries) = $document->stats(); print "我們找到了 $percent\% ($hit from $queries) 字串的翻譯\n";
此函式在出錯時返回非空整數。
提供了四個函式來獲取輸入和返回輸出。它們與 Perl 的 shift/unshift 和 push/pop 非常相似。
* Perl shift 返回第一個陣列項並將其從陣列中刪除。 * Perl unshift 將項作為第一個陣列項新增到陣列中。 * Perl pop 返回最後一個數組項並將其從陣列中刪除。 * Perl push 將一項作為最後一個數組項追加到陣列中。
第一對是關於輸入的,第二對是關於輸出的。助記符:在 input 中,您感興趣的是第一行,shift 提供什麼,而在 output 中,您希望將結果新增到末尾,就像 push 一樣。
提供一個函式來處理應該翻譯的文字。
此函式還可以接受一些額外的引數。它們必須組織為雜湊。例如:
$self->translate("string","ref","type", 'wrap' => 1);
操作:
它將使用命令列中指定的輸出字符集。如果未指定該命令,則將使用輸入 PO 的字元集,如果輸入 PO 具有預設的 "CHARSET",則返回輸入文件的字符集,以便不會執行編碼。
當前翻譯提取器的一個缺點是它不能處理包含所有語言的翻譯文件,如 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>
2023-01-03 | Po4a 工具 |