読者です 読者をやめる 読者になる 読者になる

C++ ときどき ごはん、わりとてぃーぶれいく☆

Wonder Rabbit Projectのなかのひとのブログ。主にC++。

DartRefJP ドキュメントのローカライズに際し po4a を使ってみる?それとも… (part 2)

前回のあらすじ。

  1. dartrefjpで行う様なドキュメントのローカライズに適したツールが欲しい。
  2. po4aとかいいかも。
  3. とりあえずArch Linuxのパッケージからインストールする。
  4. po4a-gettextしてみたがどうも文字コード周りでエラー吐いたし、眠い、寝る。

エラーその1: -f sgml が Unknown format tpye とか言われる。

% po4a-gettextize -f sgml -m chapter-1.html -p chapter-1.po
Unknown format type: sgml.
List of valid formats:
  - dia: uncompressed Dia diagrams.
  - docbook: DocBook XML.
  - guide: Gentoo Linux's XML documentation format.
  - ini: INI format.
  - kernelhelp: Help messages of each kernel compilation option.
  - latex: LaTeX format.
  - man: Good old manual page format.
  - pod: Perl Online Documentation format.
  - sgml: either DebianDoc or DocBook DTD.
  - texinfo: The info page format.
  - tex: generic TeX documents (see also latex).
  - text: simple text document.
  - wml: WML documents.
  - xhtml: XHTML documents.
  - xml: generic XML documents (see also docbook).

うーん、HTMLが無いのなら試しにSGMLとして、と思ったのだけどどうも上手く行かないらしい。そもそもリストにsgmlてあるのにUnknownとか言われてしょんぼり・x・;

エラーその2: -f text でもなんか文字コード周りで働きたくないでござるとか言われる。

% po4a-gettextize -f text -m chapter-1.html -p chapter-1.po
po4a: Couldn't determine the input document's charset. Please specify it on the command line. (non-ASCII char at chapter-1.html:110)

さて、とりあえずtextでパース出来ない原因は「ソースの110行目に非ASCII文字があるから」とか言ってるので、ちょっと見てみましょう。変ですね…原文はEnglishなので8bitどころか7bitのはず。COPYRIGHTに©使ってるとかでも無いし。←追記参照

% vim chapter-1.html
:110

f:id:USAGI-WRP:20120307162000p:plain

はて…一見すると何事も問題の無いASCII文字ばかりの様に見えます。しかし、よく見ると幾つか可笑しな点に気がつく筈です。ちなみに原文だと、冒頭の以下の辺りに相当します。

f:id:USAGI-WRP:20120307162443p:plain

さて、気付きましたか?もう1つヒントとして、Vimがこのファイルに対して推論した文字コードをステータスバーで確認してみると次のようになっています。

f:id:USAGI-WRP:20120307162630p:plain

試しに、強制的にISO8859-1(=ASCII)を指定して開きなおして見ましょう。

:e ++enc=ISO8859-1

f:id:USAGI-WRP:20120307162912p:plain

はい、もう分かりましたね!

:Vinarise

f:id:USAGI-WRP:20120307164051p:plain

実はこの原文はEnglishなのでASCII文字コードしか使っていないだろうと思ったら間違いなわけです。この問題はよく論文などでも見掛けます・w・; 全ての人々が文字コードについて正しく知っていて電子文書を書くわけではないので、単純に計算機の世界でEnglishの文書としては本来有るはずの無い文字コードがEnglishの文書にも埋もれて居たりします。

そんなわけで、po4a-gettextの前にutf-8から真にASCIIなソースへと変換してあげる必要がある事が分かりました。

% nkf -wZ chapter-1.html > chapter-1.html.ASCII

nkfのZオプションJIS X0208 特殊文字をASCIIに変換できる事を利用してみた。結果は思惑通り以下の様に良好である。

f:id:USAGI-WRP:20120307165409p:plain

これでpo4a-gettextが少なくとも-f textモードでは動いてくれるはず。

% po4a-gettextize -f text -m chapter-1.html.ASCII -p chapter-1.html.ASCII.po
% head chapter-1.html.ASCII.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: 2012-03-07 16:54+0900\n"
% tail chapter-1.html.ASCII.po
"      var s = document.getElementsByTagName('script')[0]; "
"s.parentNode.insertBefore(po, s);\n"
"    })();\n"
"\t</script>\n"
msgstr ""

#. type: Plain text
#: chapter-1.html.ASCII:525
msgid "</body> </html>"
msgstr ""

どうやらテキストモードとしては.poの生成に成功した様である・w・b

さて…そうなるともうちょっとこの段階で欲を出して、-f textではなく、-f xhtmlなどではパース可能か試してみる。言うまでもなく、HTML5をxhtmlで厳格にパースすれば失敗するはずであるが…。

% po4a-gettextize -f xhtml -m chapter-1.html.ASCII -p chapter-1.html.ASCII.po 
chapter-1.html.ASCII:44: (po4a::xml)
Unexpected closing tag </head> found. The main document may be wrong.

この-f xhtmlという試みは予想通りに失敗した。これはこれで有る意味、心の平穏が保たれる結果である・w・;
やはり-f textしか手は無い模様(´・ω・`)

f:id:USAGI-WRP:20120307170728p:plain

んー・・・まあ・・・、アシストツール無しのGitリポジトリ管理だけでdiffを見ながら完全に手作業するよりはいいかな程度だけど、それでもやっぱり使えないよりは断然いいはず。

良いはずの理由としては、原文に変化があった場合に、とりあえずはその変化を含む部分については未翻訳部分としつつも以前の原文から変化の無い部分についてはそのまま.poによりパッチを当てる様にローカライズでき、訳出の追い付きを徐々に進める事ができるという事。

これは文書を読むユーザーにも古い情報の訳出のままを提示しつつ、文書冒頭に「この文書は既に古いかもしれないので…」などの注意書きを入れるよりも、どこが新しくなって未訳出なのかが判ったほうが良いし、その部分について情報が必要ならば原文をわざわざ見に行かずともその部分だけ申し訳ないがローカライズ版のユーザーに頑張って脳内翻訳して読み進めて貰えば済むのでたぶんいろいろと楽だと思う。

もちろん、参加してくれる有志が増えるかはさておくにしても、.poをgithubで管理すれば多人数による共同編集作業も行い易くなる。

と、言う訳で、一部リソースについて、以下のワークフローで作業してみようと思う。

*初期状態の作成

  1. とりあえず安心と安全のGitリポジトリで管理しとく // git
  2. このシステムを使う訳出対象のリストを作成・管理 // (shで扱い易いといいな)
  3. 各文書毎のワーキングディレクトリで

*自動化(人力更新チェックとか漏れや遅れになるので)

  1. 訳出対象リストに応じて自動的に初期状態を作成 //(shでどうとでもなるじゃろう)
  2. 原文の更新
  3. poの更新 // po4a-updatepo
  4. 原文とpoからローカライズ版の生成は

以上はとりあえずはシェルスクリプトを用意する等でも半自動化できる。必要ならcronとか使って完全自動化もできるし。

こうなると手作業でやるのは

これだけになってみんな幸せになれる。

*既にローカライズ済みのリソースがある場合の統合(必要なら)

必要になったらpo4aのmanの「既存の訳を po4a にコンバートするには?」とか参考にやる。

とかまあ、こんな感じでどうかしら・w・b

dartrefjpのML等でも提案しつつ、サンプルケースとしてDartぱずらーずを先ずはこの手法で取り組んでみようかと思います。

<追記>

po4aのmanのpo4a-gettextizeで見逃していたオプションに -M というのを見付けました@w@;

-M, --master-charset
    翻訳するドキュメントファイルの文字セットです。 

と、言う訳で、 -M utf-8 とかオプションを追加してあげると無理にASCII化しなくてもpo4aできます・w・b