Locale::Po4a::Sgml - 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>Á</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 <dmeggins@aix1.uottawa.ca>
po4a
への適合は以下のメンバーが行いました。
Denis Barbier <barbier@linuxfr.org>
Martin Quinson (mquinson#debian.org)
著作権・ライセンス¶
Copyright (c) 1995 by David Megginson <dmeggins@aix1.uottawa.ca>
Copyright 2002, 2003, 2004, 2005 by SPI, inc.
本プログラムはフリーソフトウェアです。GPL
の条項に基づき再頒布と変更を行うことができます
(COPYING
ファイルをご覧ください)。