Locale::Po4a::Sgml(3pm)

名称
Locale::Po4a::Sgml - 将 SGML 文档从/转换为 PO 文件

描述
Po4a (PO For Anything) 项目的目标是在文档等不需要翻译的领域使用 gettext 工具简化翻译(更有趣的是，简化翻译的维护)。

Locale::Po4a::Sgml 是一个帮助将 SGML 格式的文档翻译成其他 [人类] 语言的模块。

本模块使用 onsgmls(1) 解析 SGML 文件。确保它已安装。还要确保 SGML 文件的 DTD 已安装在系统中。

此模块接受的选项

debug
    空格分隔的关键字列表，指示要调试的部件。可能的值有：标记、类属、图元和参照。

verbose
    给出更多关于正在发生的事情的信息。

translate
    空格分隔的额外标记列表 (除了 DTD 提供的标记之外)，其内容应形成额外的 msgid。

section
    空格分隔的包含其他标记的额外标记列表 (除了 DTD 提供的标记之外)，其中一些标记属于 translate 类别。

indent
    增加缩进级别的以空格分隔的标记列表。

verbatim
    这些标签内的布局不应更改。段落不会换行，也不会添加额外的缩进空间或新行用于修饰。

empty
    标签不需要关闭。

ignore
    标签被 po4a 忽略并视为纯字符数据。也就是说，它们可以是 msgid 的一部分。例如，<b> 是此类别的一个很好的候选者，因为将其放入翻译部分会创建不是完整句子的 msgid，这是不好的。

attributes
    需要转换的属性的空格分隔列表。您可以按属性的名称指定属性(例如，"lang"(语言))，但也可以在其前面加上标记层次结构，以指定此属性仅在转换为指定的标记时才会被转换。例如：<bbb><aaa> lang 指定只有当 lang 属性在 <aaa> 标记中(该标记在 <bbb> 标记中)时，lang 属性才会被转换。标记名称实际上是正则表达式，因此您还可以编写类似 <aaa|bbbb> lang 这样的内容，以便仅转换 <aaa> 或 <bbb> 标记中的 lang 属性。

qualify
    翻译必须由属性名称限定的属性的空格分隔列表。请注意，此设置会自动将给定属性添加到"属性"列表中。

force
    即使 DTD 未知或 onsgmls 在输入文件中发现错误，也要继续。

include-all
    默认情况下，仅包含一个实体(如 '&version;')的 msgid 会被跳过，以方便翻译人员使用。激活此选项可阻止此优化。如果文档包含像 "<title>&Aacute;</title>" 这样的结构，那么它可能会很有用，即使我怀疑这样的事情是否会发生……

ignore-inclusion
    不会内联的实体的空格分隔列表。请谨慎使用此选项：它可能会导致 onsgmls (内部使用) 添加标记并使输出文档无效。

此模块的状态
结果是完美的。即生成的文档完全相同。但是仍然存在一些问题：

•   默认情况下，onsgmls 的错误输出被重定向到 /dev/null，这显然是错误的。我不知道如何避免这一点。

    问题是我必须 "protect" 条件包含(即"<! [ %foo [" and "]]>" stuff) 不受 onsgmls 的影响。否则 onsgmls 会吃掉它们，我不知道如何在最终文档中恢复它们。为了防止出现这种情况，我将它们重写为 "{PO4A-beg-foo}" 和 "{PO4A-end}"。

    这样做的问题是，"{PO4A-end}" 和 I 添加的内容在文档中无效(不在 <p> 标记中)。

    如果您想查看在输出，请将以下内容添加到命令行(或 po4a 配置行)：

      -o debug=onsgmls

•   它只适用于 DebianDoc 和 DocBook DTD。添加对新 DTD 的支持应该非常容易。该机制对于每个 DTD 都是相同的，您只需给出现有标记及其一些特征的列表。

    我同意，这需要更多的文档，但它仍然被认为是测试版，我讨厌记录可能/将会改变的东西。

•   警告，对 DTD 的支持只是试验性的。我没有阅读任何参考手册来查找每个标签的定义。我确实在模块中添加了标签定义，直到它适用于我在网上找到的一些文档。如果你的文档使用的标签比我的多，它就不会起作用。但正如我上面所说的，修复这个问题应该是相当容易的。

    我只针对 SAG (系统管理员指南)测试了 DocBook，但是这个文档相当大，应该使用大多数 DocBook 特性。

    对于 DebianDoc，我测试了 DDP 的一些手册，但还没有全部测试。

•   在包含文件的情况下，PO 文件中消息的字符串引用(即类似 "#: en/titletoc.sgml:9460" 的行)将是错误的。

    这是因为我对文件进行了预处理，以保护条件包含 (即 "<! [ %foo [" and "]]>" 内容) 和某些实体 (如 &version;) 不受 onsgmls 的影响，因为我希望它们与生成的文档保持原样。为此，我创建了输入文件的临时副本，并在将其传递给 onsgmls 进行解析之前对其进行了所有我想要的更改。

    为了使其正常工作，我将请求包含文件的实体替换为给定文件的内容 (这样我也可以保护子文件中需要的内容)。但是到目前为止，没有采取任何措施来纠正后面的引用 (即文件名和行号)。我不确定最好的办法是什么。

作者
此模块是 sgmlspl (用于 ONSGMLS 解析器的 SGML 后处理器) 的改编版本，它是：

 版权所有 © 1995 David Megginson <dmeggins@aix1.uottawa.ca>

对 po4a 的改编是通过以下方式完成的：

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

版权和许可
 版权所有 © 1995 David Megginson <dmeggins@aix1.uottawa.ca>。
 版权所有 © 2002-2005 SPI, Inc.

此程序是自由软件；您可以根据 GPL 条款重新分发和/或修改它(请参阅复制文件)。