5 Po4a ドキメント翻訳にしよう


PIC
____________________________________________________________________

翻訳翻訳よりものかかるになりがちですしかしこれをると文との乖離はきくなり ていきますDebian 発されている Po4a プレンテキストXMLHTMLLaTeXnroff (man) などドキメント翻訳PO というげるですはこの Po4a 使たなドキメントPO するためにておくべき造について ます

5.1 はじめに 味で道なドキメント翻訳

長期的にればドキメント翻訳大切なのはドキメント翻訳ではなく翻訳 もの1 超える長いドキメント翻訳えたとしても文がわり続ける をしなければ翻訳ていきます

味で道なです文にしてはのような発生します

同時のような的な発生します

こういていますドキメント翻訳diff分を眺めて それを翻訳反映させます分をんでする能力によ翻訳反映させるにもにもなり ます

このようなドキメント翻訳必要労力らげてくれるのが Po4a ですPo4a ドキメン 翻訳PO というしてげるです以下ではまず PO という 翻訳にとてどのように便なのかをそのPo4a がどのようななのか ます

5.2 PO

PO プログラム翻訳のためにられたイルですここではそのについて いきまし

5.2.1 PO 的な

まずはPO 的なします

PO には文と文のからなるエントリりで多数められています単なエントリ ます

#: src/apt_config_treeitems.cc:99
msgid ""
"%BOption:%b  %s\n"
"%BDefault:%b %s\n"
"%BValue:%b   %s\n"
msgstr ""
"%B オプシ:%b %s\n"
"%B デフルト:%b %s\n"
"%B :%b         %s\n"

ですがmsgidからまる連のmsgstrからまる連の"まれた部分それぞれ文と です

#まる的にすべてコメントです#:まる文をしたです れはxgettextして POT 生成するときにします翻訳msgidてもできない コメントをもとにしてスコ眺めることができます

#:にもコメントがありますそのようなコメントんだエントリ ます

#  最後 %s   (core dumped)」 。
#. ForTranslators: "%s update %s" gets replaced by a command line, do not translate it!
#: src/generic/apt/download_update_manager.cc:383
#, c-format
msgid "The debtags update process (%s update %s) was killed by signal %d%s."
msgstr ""
"debtags  プロセス (%s update %s)  シグナル %d   kill  されました %s"

#.まる文のスコからされたコメントです翻訳 必要翻訳しにくい発者から翻訳への使われますこれもxgettext 出時します

#,まるフラグですもよく使われるフラグfuzzy というフラグでしこれについてはしますこれ し ま す

それ#もない翻訳翻訳したコメントですエントリにはこのよう 翻訳コメント由自につけることができます

このようなコメントプログラムスココメント同様にのみ必要となるものなのでMO するとき にすべてされます*1

5.2.2 fuzzy エントリ

msgmergePO しい POT する翻訳されているエントリmsgidmsgidエントリ されることがありますえばエントリ A msgidmsgidエントリ A’ されるとしますこのと msgmerge A として A’ 翻訳できると判断A’ msgstr A msgstr A’ fuzzy フラグをつけますこのようにしてられるエントリのような fuzzy エントリ です

#: src/main.cc:181
#, fuzzy, c-format
msgid ""
" -q             In command-line mode, suppress the incremental progress\n"
"                indicators.\n"
msgstr " -q                 コマンドラインモ表示しません"

しかしこれだけだと翻訳にはmsgidがどうしたのか分かりませんそこで GNU gettext 0.16 から 導入されたのがのような#|まるコメントです

#: src/main.cc:181
#, fuzzy, c-format
#| msgid ""
#| " -q             In command-line mode, suppress the incremental progress "
#| "indicators."
msgid ""
" -q             In command-line mode, suppress the incremental progress\n"
"                indicators.\n"
msgstr " -q                 コマンドラインモ表示しません"

#|まるコメントmsgidですmsgmerge--previousしたされますこのコメント 使えばmsgid現在msgidできるのでどのようなmsgstrえれば翻訳現在msgid できるのかが単に分かりますPO げるみとえますmsgmerge--previousされていない しておくとよいでし

5.2.3

翻訳翻訳やその連絡文の連絡翻訳文字などはメタですPO エントリとして使そのエントリmsgstrにこれらのメタめることになています msgid文字にするとています

またなど曖昧長いコメント (つまりイル) くことになてい ます

以下aptitude ja.po です

# Japanese translations for aptitude
# aptitude 
# Copyright (C) 2006-2008 Noritada Kobayashi <nori1@dolphin.c.u-tokyo.ac.jp>.
# This file is distributed under the same license as the aptitude package.
#
msgid ""
msgstr ""
"Project-Id-Version: aptitude 0.4.1\n"
"Report-Msgid-Bugs-To: aptitude@packages.debian.org\n"
"POT-Creation-Date: 2008-09-05 16:05+0200\n"
"PO-Revision-Date: 2008-05-16 03:35+0900\n"
"Last-Translator: Noritada Kobayashi <nori1@dolphin.c.u-tokyo.ac.jp>\n"
"Language-Team: Japanese\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"

なおここでは略しましたが筆者ジカタログでのにするためaptitude Subversion PO ではコメント表をめています

5.2.4 その他の

ここまででPO エントリについてざました

PO エントリについてはmsgid msgstr からるものにも複数へのとして msgidmsgid_pluralmsgstr[n] からるものがありますしくは GNU gettext ドキメン *2 3 The Format of PO Filesしてください

5.2.5 PO

PO 翻訳うには PO 便ですPO テキストなのでどんなテキストエデでもできますが まれる"\エスケするのはですそのような機械的なPO した PO 任せるのがよいでしまたPO には翻訳能をつものもあるので率もがるはず です

PO としてよくられているのはEmacs PO メジである po-modeKDE PO スイ である KBabelGNOME PO エデである Gtranslatorそして poedit です

ここでは筆者れている po-mode について筆者がよく使だけざしますする エントリとは現在ソルがあるエントリ味です

まずエントリ動には以下のような使えます

n
エントリ動します
p
エントリ動します
t
エントリ動します
T
エントリ動します
f
fuzzy エントリ動します
F
fuzzy エントリ動します
u
未訳エントリ動します
U
未訳エントリ動します
o
obsolete エントリ動します
O
obsolete エントリ動します
m
選択エントリスタpush します
r
スタから pop してられたエントリ動します

また選択エントリには以下のような使えます

RET
いて選択エントリmsgstrします
#
いて選択エントリ翻訳コメントします
k
選択エントリmsgstr(kill) します
K
選択エントリ翻訳コメント(kill) します
w
選択エントリmsgstrコピします
W
選択エントリ翻訳コメントコピします
y
選択エントリmsgstrスト (yank) します
Y
選択エントリ翻訳コメントスト (yank) します
TAB
選択エントリfuzzy フラグきます
DEL
選択エントリfuzzy フラグをつけます未訳または fuzzy obsolete にしますobsolete します
C-j
選択エントリmsgidmsgstrコピします
s
選択エントリコメントをもとにスコ表示しますコメント複数 されている表示します

ではEmacs ができます以下のとおりです

C-c C-c
msgstr または翻訳コメントとしてじま *3
C-c C-k
してじます

最後メインバでの PO 全体わる以下のとおりです

_
します
?, h
ヘルプ表示します
V
msgfmt--check (-c) をつけてPO がないか認した存しますえばmsgid ているのにmsgstrていないそれがされます


PIC PIC


1: po-mode KBabel


単なから分かるといますがpo-mode 動やがしやすく便です

ただpo-mode にはのところ翻訳メモリのような能はありませんKBabel Gtranslator 翻訳メモリえている ので翻訳メモリ味のあるかたはこれらをしてみるのもよいでし

5.2.6 GNU gettext

翻訳には PO 使うことになるでしうがGNU gettext するPO POT してコマンド ラインから動処できるておくと便です以下でざします

msgattrib
エントリじたをしますえばfuzzy エントリのみにする」 、 fuzzy エントリ fuzzy フラグといたことが能です
msgcat
複数PO げます
msgcmp
PO POT msgidします
msgcomm
複数PO まれるmsgidします
msgconv
PO 文字します
msgen
PO しますイル未訳エントリmsgstrmsgid同じ文字します
msgexec
PO まれるすべての翻訳してコマンドします
msgfilter
PO まれるすべての翻訳してをします
msgfmt
PO コンパイルして MO します
msggrep
パタしたエントリPO からします
msginit
PO します
msgmerge
PO POT します
msgunfmt
MO から PO コンパイルします
msguniq
PO まれる複したmsgid1 つにまとめます
xgettext
スコからmsgidして POT 生成します

発者使うのはxgettextmsgmergemsgfmtですが他の使いこなせるようになておくと便です 使マニアルペしてください

5.2.7 まとめ

PO プログラム翻訳のためにられたイルコメントのような翻訳有用fuzzy エントリのような 翻訳率をげるためのみをんでいることをしましたまたPO というした についてもしました

5.3 ドキメント翻訳PO 使うという

プログラム翻訳のためにされた PO 翻訳にと翻訳両方をしやすいする存在となり ましたその由としては以下のようなものがえられます

ドキメント翻訳については文をそのままコピして翻訳するため翻訳部分 (インデン ドキメントでのなど) があその翻訳けますプログラム翻訳べて分量多いの いのでとして翻訳への担はきくなりますこの翻訳にときな悩みの した

そこでまれたのがドキメント翻訳しても PO 使おうというです的にはドキ メントブロエントリとした PO ドキメントPO とをできるようにするこ とで翻訳PO での翻訳できるようにします以下がそのようなられてい ます

Po4a
Debian 発されている*4 とするドキメントプレンテキストXMLHTMLLaTeXnroff (man)Pod など多数 Perl かれたモジおよびプログラムとしてされているDebian po4a
poxml
KDE KDE SDK モジ1 つのコンポネントとして発されているとするドキメン DocBook XML C++ されたpo2xmlxml2pot などの能プログラムから Debian poxml
xml2po
GNOME gnome-doc-utils 1 つのリテとして発されているとするドキメント DocBook XML であるPython されたシンプル1 つのイルからるのでドキ ントビルド使できるDebian ではgnome-doc-utilsまれる

poxml xml2po DocBook XML のみをであるのにPo4a サポしているのはおそ らく GNOME KDE Debian 立場いを反映しているのでしGNOME KDE プロジクトドキメン DocBook XML できますがストリビである Debian ではソフトウドキ ントする必要があるのです

セクシではドキメント翻訳PO 使する 3 つののうち唯一複数ドキメントサポ し て い る Po4a についてていきます

5.4 Po4a

Po4a というソフトウ名はpo for anythingからています名前からも分かるようにからドキメント 翻訳PO することを的としておりそのためにとして複数うことをしたりとな ています

えば以下のような現在サポされています

KernelHelp
ネルヘルプドキメントです
nroff
Unix あるマニアルペですBSD マニアルペ使されている mdoc サポ されています初心きしにくいですがPo4a サポされたのでインライン だけ分かれば (文のをすれば) 翻訳できます
POD
Perl 連のドキメント使われるですスココメントとしてまれたドキメント 翻訳しにくいですがそれを PO として翻訳しやすくします
SGML
では XML のほうが流ですが昔前ドキメント流です現在サポされている DTD DebianDoc-SGML DocBook SGML のものです
TeX/LaTeX
名なソフトウ LATEXです
GNU Texinfo
GNU ドキメント使されるです
XML
よく使われるドキメントです現在サポされている DTD DiaDocBook XMLGuide XMLXHTML のものです

サポされているpo4a-gettextizepo4a-translatepo4a-updatepoなどのコマンド--help-formatオプシ 与えると表示できます*5 コマンド--format (-f) などを与えてドキメントするこのている名前使してくだ さい

noritada[3:39]%  po4a-gettextize --help-format   terra:~/svnwc/build-common/doc
有効:
  - dia:   Dia  ダイアグラム
  - docbook: Docbook XML
  - guide: Gentoo Linux   xml  ドキメントフ
  - ini: .INI 
  - kernelhelp:  ネルコンパイルオプシヘルプメ
  - latex: LaTeX 
  - man:  マニアルペジフ
  - pod: Perl  オンラインドキメントフ
  - sgml: debiandoc   docbook DTD 
  - texinfo: info  ジフ
  - tex:   TeX  ドキメント (latex  )
  - text:  シンプルテキストフ
  - wml: WML  ドキメント
  - xhtml: XHTML  ドキメント
  - xml:   XML  ドキメント (docbook  )

5.5 Po4a 使

5.5.1 導入 (1): 文ドキメントフイルから POT 生成する

Po4a 使ドキメント翻訳をするにすべきことは文のドキメントフイルから POT 生成すること ですPOT 生成にはpo4a-gettextizeコマンド使します-fオプシドキメントフイル-m オプシ文ドキメントフイル (マスタドキメント) 名前-pオプシする POT イル名を与えてコマンドします-Mオプシ文ドキメントフイル文字するこ とも能です

がないはすんなりとコマンド了しPOT 生成されますドキメント造にがある (えば XML においてタグがきちんとじられていない) エラになります

POT 生成されたら翻訳プログラム翻訳同じですPOT コピして PO 適切 した翻訳めまし

ではhoge.en.htmlという XHTML ドキメントからhoge.pot生成しています

hoge.en.html ():

<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
<head>
<title>Test file</title>
</head>
<body>
<h1>Test file</h1>
<p>This is an <a href="apple">apple</a>.</p>
<p>This is an <a href="orange">orange</a>.</p>
</body>
</html>

コマンドライン:

noritada[14:14]%  po4a-gettextize -v -f xhtml -m hoge.en.html -p hoge.pot

hoge.pot ():

# SOME DESCRIPTIVE TITLE
# Copyright (C) YEAR Free Software Foundation, Inc.
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"POT-Creation-Date: 2008-09-20 14:21+0900\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: ENCODING"

# type: Attribute ’xml:lang’ of: <html>
#: hoge.en.html:4 hoge.en.html:4
msgid "en"
msgstr ""

# type: Content of: <html><body><h1>
#: hoge.en.html:6 hoge.en.html:9
msgid "Test file"
msgstr ""

# type: Content of: <html><body><p>
#: hoge.en.html:10
msgid "This is an <a href=\"apple\">apple</a>."
msgstr ""

# type: Content of: <html><body><p>
#: hoge.en.html:11
msgid "This is an <a href=\"orange\">orange</a>."
msgstr ""
5.5.2 導入 (2): 文・翻訳ドキメントフイルから PO 生成する

文と同じ翻訳したドキメントにありそれを Po4a PO したいにもpo4a-gettextize使 ますPOT コピして PO 翻訳ドキメントブロコピアンドストPO エント といういなくうんざりするです

ただしこのどの文がどの文にするかを Po4a する必要があるので文ドキメントフイル翻訳 メントフイル同じ造であることがになります同じ造」 とはPo4a 分ける単位つまりブロ ベルたときにする同じ順序んでいるという味ですもし翻訳側でブロわれてい たらエラわるでしブロ順序ている無事 わるかもしれませんがブロmsgid msgstr はおかしくなているはず です

翻訳ブロとして翻訳ドキメントしているそれは旦取いてくださいPo4a PO から翻訳ドキメント生成する文にはないする方法されています方法については ます

文ドキメントフイル翻訳ドキメントフイル同じ造であればpo4a-gettextizeいたするは ずです-fオプシドキメントフイルPOT 生成する連のオプシえて-lオプ 翻訳ドキメントフイル名前与えてコマンドします-Lオプシ翻訳ドキメント イル文字することも能です

するとすべてのエントリfuzzy フラグされた PO 生成されますすべてのエントリfuzzy フラグ されるのはとでもいいのでにはにすべてのエントリ文と文を認してほしいという 反映したものです由にできるドキメント与えて Po4a *6 か し ら の 発 生 し て い る 能 性 が あ る の で す

以下ではhoge.en.htmlするhoge.ja.htmlPO することをみます

まずはとりあえずpo4a-gettextizeしてみました

hoge.ja.html ():

<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="ja" xml:lang="ja">
<head>
<title>テストフイル</title>
</head>
<body>
<h1>テストイル</h1>
<p>これは<a href="apple">リンゴ</a>です</p>
<p>これは<a href="orange">オレンジ</a>です</p>
<p>(:  オレンジミカンとはいます)</p>
</body>
</html>

コマンドライン:

noritada[14:54]%  po4a-gettextize -v -f xhtml -m hoge.en.html -l hoge.ja.html -p ja.po
po4a gettextize: Original has less strings than the translation (6<7). Please
               fix it by removing the extra entry from the translated file. You
               may need an addendum (cf po4a(7)) to reput the chunk in place
               after gettextization. A possible cause is that a text duplicated
               in the original is not translated the same way each time. Remove
               one of the translations, and you’re fine.
po4a gettextization: Structure disparity between original and translated files:
msgid (at hoge.en.html:6 hoge.en.html:9) is of type ’Content of:
<html><body><h1>’ while
msgstr (at hoge.ja.html:6) is of type ’Content of: <html><head><title>’.
Original text: Test file
Translated text:  テストフイル
(result so far dumped to gettextization.failed.po)
The gettextization failed (once again). Don’t give up, gettextizing is a subtle
art, but this is only needed once to convert a project to the gorgeous luxus
offered by po4a to translators.
Please refer to the po4a(7) documentation, the section "HOWTO convert a
pre-existing translation to po4a?" contains several hints to help you in your
task

立したパラグラフにしたために PO へのしたとてもうpo4a-gettextize してみますイル略します

コマンドライン:

noritada[14:55]%  po4a-gettextize -v -f xhtml -m hoge.en.html -l hoge.ja.html -p ja.po
po4a gettextization: Structure disparity between original and translated files:
msgid (at hoge.en.html:6 hoge.en.html:9) is of type ’Content of:
<html><body><h1>’ while
msgstr (at hoge.ja.html:6) is of type ’Content of: <html><head><title>’.
Original text: Test file
Translated text:  テストフイル
(result so far dumped to gettextization.failed.po)
The gettextization failed (once again). Don’t give up, gettextizing is a subtle
art, but this is only needed once to convert a project to the gorgeous luxus
offered by po4a to translators.
Please refer to the po4a(7) documentation, the section "HOWTO convert a
pre-existing translation to po4a?" contains several hints to help you in your
task

なんだかエラてしまていますどうもtitleh1文がともにTest fileなのにテスト イル他方テストイルとなていることにがあるようですそこで両方して po4a-gettextizeにかけるとします

hoge.ja.html ():

<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="ja" xml:lang="ja">
<head>
<title>テストフイル</title>
</head>
<body>
<h1>テストフイル</h1>
<p>これは<a href="apple">リンゴ</a>です</p>
<p>これは<a href="orange">オレンジ</a>です</p>
</body>
</html>

コマンドライン:

noritada[15:07]%  po4a-gettextize -v -f xhtml -m hoge.en.html -l hoge.ja.html -p ja.po

ja.po ():

# SOME DESCRIPTIVE TITLE
# Copyright (C) YEAR Free Software Foundation, Inc.
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"POT-Creation-Date: 2008-09-20 15:07+0900\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: ENCODING"

# type: Attribute ’xml:lang’ of: <html>
#: hoge.en.html:4 hoge.en.html:4
#, fuzzy
msgid "en"
msgstr "ja"

# type: Content of: <html><body><h1>
#: hoge.en.html:6 hoge.en.html:9
#, fuzzy
msgid "Test file"
msgstr "テストフイル"

# type: Content of: <html><body><p>
#: hoge.en.html:10
#, fuzzy
msgid "This is an <a href=\"apple\">apple</a>."
msgstr "これは<a href=\"apple\">リンゴ</a>です"

# type: Content of: <html><body><p>
#: hoge.en.html:11
#, fuzzy
msgid "This is an <a href=\"orange\">orange</a>."
msgstr "これは<a href=\"orange\">オレンジ</a>です"
5.5.3 PO 文ドキメントフイルから翻訳ドキメントフイル生成する

po4a-translate

5.5.4 文ドキメントフイルPO 反映させる

po4a-updatepo

5.5.5 PO 翻訳ドキメントフイルする

po4a

5.5.6 文にない翻訳ドキメントフイルする

5.6 Po4a

5.6.1 TransTractor::parse()

44 エリア Debian 2008 9
____________________________________________________________________________________________