识别Qt语言学翻译文件(TS文件)中的消息

时间:2012-01-12 10:17:39

标签: qt internationalization translation qt4.6

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

我试图了解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>

可以正确打开上述文件。

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

2 个答案:

答案 0 :(得分: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>

重复项由上下文标识(即 MyContext MyOtherContext )和来源(删除)。

修改

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

道德是:当且仅当Qt Linguist再次加载生成的ts文件并且 lupdate 接受(重新同步应用程序)时,您可以执行所需的所有操作

答案 1 :(得分: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))。

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