Locale::Po4a::Sgml(3) PO ファイルと SGML ドキュメントの変換

説明

po4a (PO for anything) プロジェクトは、gettext ツールが想定していないドキュメントのような領域で翻訳をしやすくすること (またより興味深いのは、翻訳文の保守がしやすくなること) を目標にしています。

Locale::Po4a::Sgml は、SGML フォーマットのドキュメントを他の [自然] 言語へ翻訳するのを助けるモジュールです。

このモジュールは SGML ファイルのパースに nsgmls を利用します。必ずインストールしてください。また、SGML ファイルの DTD を、システムに必ずインストールしてください。

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

debug
デバッグしたい場所を示す、空白区切りのキーワードリストを表示します。取り得る値は、tag, generic, entities, refs です。
verbose
どのように実行しているかの、より詳細な情報を出力します。
translate
内容が追加 msgid の形になる、追加タグ (DTD の範囲外) の空白区切りリストです。
section
translate カテゴリ内の他のタグを中に含む、追加タグ (DTD の範囲外) の空白区切りリストです。
indent
インデントレベルを増やすタグの、空白区切りリストです。
verbatim
そのタグのレイアウトを変更されません。段落は折り返されず、インデントのための空白は追加されず、見栄えのための空行追加もされません。
empty
閉じる必要のないタグです。
ignore
無視され、po4a がただの文字列として扱うタグです。つまり、msgid の一部として扱えます。例えば、<b> はこのカテゴリの良い例です。<b> が翻訳セクションに入ってしまうと、文全体が入った msgid が作られなくなってしまいます。これはまずいです。
attributes
翻訳する必要のある属性の、空白区切りリストです。属性を名前 (例: ``lang'') で指定できますが、特定のタグの中にあるときだけこの属性を訳すように、タグ階層を前につけることもできます。例えば、<bbb><aaa>lang は、<bbb> タグの中にある、<aaa> タグの中にある場合に、lang 属性を訳すということを示しています。タグ名は、実際には正規表現ですから、<aaa|bbbb>lang のように書いた場合は、<aaa> タグか <bbb> タグの中にある lang 属性のみを訳せます。
qualify
翻訳が属性名で修飾しなければならない属性の、空白区切りのリストです。この設定に与えた属性は、自動的に 'attributes' リストにも追加されることに注意してください。
force
DTD が分からない場合や、nsgmls が入力ファイルでエラーを検出しても処理します。
include-all
デフォルトでは、('&version;' のような) エンティティを一つだけ含む msgid は、翻訳者の便宜のためスキップします。このオプションを有効にすると、この最適化を行わなくなります。これは、``<title>&Aacute;</title>'' のような構造を含むドキュメントには便利です。とはいえ、そのようなことがそんなにあるかは疑わしいです……
ignore-inclusion
インラインにしたくないエンティティの、空白区切りリストです。このオプションは注意して使用してください。nsgmls (内部で使用) がタグを追加し、無効な出力ドキュメントを表示する原因になる可能性があります。

このモジュールの状態

結果は完璧です。言い換えると生成したドキュメントは完全に一致しています。しかし、まだ以下のような問題があります。
  • nsgmls のエラー出力を /dev/null にリダイレクトしています。明らかにまずいのですが、どのように回避したらよいのかがわかりません。

    問題は、nsgmls から条件付き取り込み (つまり "<! [ %foo [" and "]]>" のようなもの) を、``保護'' しなければならないということです。そうしないと、nsgmls が展開してしまい、最終ドキュメントで復元する方法がわかりません。これを防ぐために、私は "{PO4A-beg-foo}""{PO4A-end}" に書き直しました。

    それに関する問題は、"{PO4A-end}" と私が追加するそのようなものが、ドキュメント内で (<p> タグ内などではなく) 有効であるということです。

    nsgmls の出力を前述の方法でリダイレクトしてしまえば、すべてうまくいきますが、それによって、ドキュメントのフォーマットが間違っていることを、検出できなくなってしまいます。

  • DebianDoc DTD と DocBook DTD でのみ動作します。新しい DTD のサポートを追加するのは非常に簡単でしょう。仕組みはすべての DTD で同じで、既存のタグのリストとその特徴を与えるだけです。

    確かに、もっとドキュメントの記述が必要です。しかし、これはまだベータ版ですし、変わることが予想されるものの記述を行うのがイヤなのです。

  • 警告: DTD のサポートは非常に実験的です。すべてのタグの定義を見つけるのに、リファレンスマニュアルを読んだわけではありません。ネットで見つかるドキュメントで動作するように、このモジュールにタグの定義を追加しました。あなたのドキュメントが私のよりも多くの種類のタグを使用している場合、動作しないでしょう。しかし前述の通り、修正は非常に簡単です。

    DocBook のテストは SAG (System Administrator Guide) でのみ行いましたが、このドキュメントは非常に大きく、DocBook の仕様のほとんどを使用していると考えています。

    DebianDoc に対しては、DDP にあるマニュアルでテストをしています。しかしまだ、すべてではありません。

  • ファイルの取り込みを行う場合、PO ファイルにあるメッセージの参照文字列 (例: "#: en/titletoc.sgml:9460" のような行) は誤りが発生するでしょう。

    これにより、生成したドキュメントでは、条件付き取り込み (例; the "<! [ %foo [" and "]]>" など)やいくつかのエンティティ (&version; のような) がそのまま扱われてほしいので、nsgmls から保護するため前処理を行うことになります。そこで、入力ファイルの一時コピーを作成し、nsgmls に渡してパースする前に、それらすべてを変更します。

    こうするためには、与えられたファイルの内容により、ファイルの取り込みを確認しながらエンティティを置換します (サブファイルでも必要とあらば保護できるように)。ですが今のところ、後で参照 (例えばファイル名や行番号) を修正するということは行いません。どのようにするのが正しいのか、私にはよくわかりません。

著者

このモジュールは、以下の方による sgmlspl (SGMLS パーサや NSGMLS パーサの SGML ポストプロセッサ) の適合版です。

 Copyright (c) 1995 by David Megginson <[email protected]>

po4a への適合は以下のメンバーが行いました。

 Denis Barbier <[email protected]>
 Martin Quinson (mquinson#debian.org)

著作権・ライセンス

 Copyright (c) 1995 by David Megginson <[email protected]>
 Copyright 2002, 2003, 2004, 2005 by SPI, inc.

本プログラムはフリーソフトウェアです。GPL の条項に基づき再頒布と変更を行うことができます (COPYING ファイルをご覧ください)。