1

我希望这是提出这个问题的正确论坛。如果不是,请将我重定向到更合适的论坛。

我正在尝试了解 Qt Linguist TS 文件的格式。我修改了一个文件,当我尝试打开它时,我收到错误消息“在...中找到重复的消息”。该文件确实包含一个上下文,其中包含两条消息

  • 同一来源
  • 文件名相同但行号不同的位置
  • 不同的翻译

这是给出此错误的最小文件的源代码:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.0" language="es">
<context>
    <name>MyContext</name>
    <message>
        <location filename="../../../../../MyFile.cpp" line="605"/>
        <source>Delete</source>
        <translatorcomment>Menu option</translatorcomment>
        <translation type="unfinished">&amp;Borrar</translation>
    </message>
    <message>
        <location filename="../../../../../MyFile.cpp" line="1572"/>
        <source>Delete</source>
        <translation>Eliminar</translation>
    </message>
</context>
</TS>

据我所知,每条消息都由上下文、来源和位置标识,因此这应该不是问题,因为行号不同。另请注意,您不能将两个消息元素合并为一个,因为它们包含不同的翻译文本。

所以我不清楚是什么导致了错误信息。我正在使用 Qt 4.6.2 版。我查看了以下文档:Qt Linguist Manual: TranslatorQt Linguist Manual: ProgrammersLinguist TS file format,但在这些文档中我都没有找到我要查找的信息,即如何识别每条消息以及可能导致的原因Qt Linguist 中的错误消息。

如果您不知道该问题的答案,则指向有关 TS 格式的更多详细信息的链接也会有所帮助。

更新

我发现通过使用可选标签 TS/context/message/comment 可以为相同的上下文/消息/源提供不同的翻译文本,例如

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.0" language="es">
<context>
    <name>MyContext</name>
    <message>
        <location filename="../../../../../MyFile.cpp" line="605"/>
        <source>Delete</source>
        <comment>Comment 1</comment>
        <translatorcomment>Menu option</translatorcomment>
        <translation type="unfinished">&amp;Borrar</translation>
    </message>
    <message>
        <location filename="../../../../../MyFile.cpp" line="1572"/>
        <source>Delete</source>
        <comment>Comment 2</comment>
        <translation>Eliminar</translation>
    </message>
</context>
</TS>

上面的文件可以正常打开。

这似乎解决了我的问题,但最好有一些关于这种格式的精确文档。

4

2 回答 2

3

Qt 语言学家报告的错误信息是有意义的。

试试这个修改后的 TS 文件版本:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>

<TS version="2.0" language="es">
  <context>
    <name>MyContext</name>
        <message>
            <location filename="../../../../../MyFile.cpp" line="605"/>
            <source>Delete</source>
            <translatorcomment>Menu option</translatorcomment>
            <translation type="unfinished">&amp;Borrar</translation>
        </message>
    </context>
  <context>
    <name>MyOtherContext</name>
        <message>
            <location filename="../../../../../MyFile.cpp" line="1572"/>
            <source>Delete</source>
            <translation>Eliminar</translation>
        </message>
    </context>
</TS>

重复项由上下文(即MyContextMyOtherContext)和源(Delete)标识。

编辑:

我仔细检查了 Qt Linguist 的源代码。据我所知,它永远不会ts.dtd用于验证目的,所有内容都是硬编码的(请参阅 ts.cpp 中的 TSReader 类)。

ts寓意是:当且仅当结果文件可以被 Qt Linguist 再次加载并被lupdate接受(以重新同步应用程序)时,您才能进行所需的所有操作。

于 2012-01-12T13:28:16.177 回答
1

翻译的完整查找键是

上下文 + 源字符串以及消歧字符串(如果存在)

http://qt-project.org/doc/qt-4.8/i18n-source-translation.html#disambiguation

消歧字符串存储在注释字段中,因为在旧的 Qt 版本中,这也是插入开发人员注释的方式(Qt Linguist 仍然可以识别它,新注释也是如此(.ts 文件中的额外注释见http://qt-project.org/doc/qt-4.8/i18n-source-translation.html#translator-comments ))。

因此,正如您所注意到的,您可以拥有两个具有相同上下文和源字符串的字符串,只要它们具有不同的消歧字符串(或者其中一个有一个而另一个没有)。

于 2012-05-21T00:54:57.187 回答