LOCALE::PO4A::SGML.3PM(1) User Contributed Perl Documentation LOCALE::PO4A::SGML.3PM(1)

名前

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

説明

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

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

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

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

空白区切りのキーワードのリストです。それぞれ、表示される追加の不具合修正文言の分類を示します。取り得る値は "entities", "generic", "onsgml", "refs", "tag" です。
どのように実行しているかのより詳細な情報を出力します。
(DTDで規定されているもの以外の)追加タグの空白区切りリストです。該当する内容がmsgidに追加されます。つまり、翻訳の対象となります。
translate カテゴリ内のほかのタグを中に含む追加タグ (DTD の範囲外) の空白区切りリストです。
字下げの水準を増やすタグの空白区切りリストです。結果的な文書中の字下げに作用します。
そのタグのレイアウトは変更されません。段落は折り返されず、インデントのための空白は追加されず、見栄えのための空行追加もされません。
閉じる必要のないタグです。
po4aにより無視され、素の文字データと見做すタグです。つまり、msgidの一部になります。例えば <b> はこの分類の好例です。というのも translate 節に含めると内容のみがあるmsgidが作られてしまう(そして大抵は完全な文でなくなってしまう)からです。そうなってはまずいですよね。
翻訳する必要がある属性の、空白区切りのリストです。(例えば "lang" のように)名前で属性を指定できますが、タグの継承を伴う前置詞も付けられます。そうするとこの属性は指定されたタグの中にあるもののみが翻訳されます。例えば、 "<bbb><aaa>lan" はlang属性を指定していますが、更にその属性は "<aaa>" タグ内にあり、且つこのタグは "<bbb>" タグ内になければなりません。タグ名は実際には正規表現となります。そのため "<aaa|bbb>lang のように書くと、 "<aaa>" または "<bbb>" タグ内にある "lang" 属性のみが翻訳されます。"
属性の空白区切りのリストです。この翻訳は属性名で修飾されていなければなりません。つまり、翻訳用に抽出されるテキストには、属性名と値が両方とも含まれるということです。例えば "<aaa lang_en="foo">" のようなタグについては、翻訳者には文字列 "lang_en="foo"" >> のようにタグが表示されます。なお、ここで与えた属性は自動的に attributes のリストにも加えられます。
DTD が分からない場合や onsgmls が入力ファイルでエラーを検出する場合のいずれでも処理します。
デフォルトでは、("&version;" のような) エンティティを一つだけ含む msgid は、翻訳者の便宜のためスキップします。このオプションを有効にすると、この最適化を行わなくなります。これは、 "<title>&Aacute;</title>" のような構造を含むドキュメントには便利です。とはいえ、そのようなことがそんなにあるかは疑わしいです……
インラインにしたくないエンティティの空白区切りリストです。このオプションは注意して使用してください。 onsgmls (内部で使用)がタグを追加し、無効な出力ドキュメントを表示する原因になる可能性があります。

このモジュールの状態

結果は完璧です。言い換えると生成した文書は元の文書と完全に一致しています。しかし、まだ以下のような問題があります。

  • 既定では onsgmls のエラー出力を /dev/null にリダイレクトしています。明らかにまずいのですが、どのように回避したらよいのかがわかりません。

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

    これの問題は、"{PO4A-end}" などと私が追加するものが、(<p> タグ内などと違って) ドキュメント内で無効であることです。

    もし onsgmls の出力を見たかったら、以下をコマンドライン(ないしpo4aの設定行)に加えるだけです。

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

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

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

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

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

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

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

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

著者

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

Copyright © 1995 David Megginson <dmeggins@aix1.uottawa.ca>

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

Denis Barbier <barbier@linuxfr.org>
Martin Quinson (mquinson#debian.org)

訳者

倉澤 望 <nabetaro@debian.or.jp>
Debian JP Documentation ML <debian-doc@debian.or.jp>

著作権とライセンス

Copyright © 1995 David Megginson <dmeggins@aix1.uottawa.ca>.
Copyright © 2002-2005 SPI, Inc.

本プログラムは自由ソフトウェアです。GPL v2.0以降の条項に基づき再頒布と変更を行えます(COPYINGファイルを参照)。

Hey! The above document had some coding errors, which are explained below:

Unterminated C< ... > sequence
2024-06-08 perl v5.38.2