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

识别Qt语言学家翻译文件(TS文件)中的消息,qt,internationalization,translation,qt4.6,Qt,Internationalization,Translation,Qt4.6,我希望这是提出这个问题的正确论坛。如果不是,请将我重定向到更合适的论坛 我试图理解Qt语言学家TS文件的格式。我已经修改了一个文件,当我试图打开它时,我会收到一条错误消息。。。。该文件确实包含一个上下文,其中包含两条具有 同一来源 具有相同文件名但行号不同的位置 不同的翻译 以下是导致此错误的最小文件的源代码: <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE TS> <TS version="2.0" languag

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

我试图理解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>
    <message>
        <location filename="../../../../../MyFile.cpp" line="1572"/>
        <source>Delete</source>
        <translation>Eliminar</translation>
    </message>
</context>
</TS>
据我所知,每条消息都是通过上下文、来源和位置来标识的,因此这应该不是问题,因为行号不同。还要注意,您不能将两个消息元素合并为一个,因为它们包含不同的翻译文本

因此,我不清楚是什么导致了错误消息。我使用的是Qt版本4.6.2。 我查看了以下文档:,,但在其中没有一个文档中我找到了我要查找的信息,即如何识别每条消息以及在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>
可以打开上面的文件而不出错


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

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语言学家的源代码。据我所知,它从不使用ts.dtd进行验证,所有内容都是硬编码的,请参阅ts.cpp中的TSReader类


寓意是:当且仅当生成的ts文件可由Qt Linguist再次加载并由lupdate接受以重新同步应用程序时,您才可以执行任何操作。

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>
    </context>
  <context>
    <name>MyOtherContext</name>
        <message>
            <location filename="../../../../../MyFile.cpp" line="1572"/>
            <source>Delete</source>
            <translation>Eliminar</translation>
        </message>
    </context>
</TS>
重复项通过上下文识别,即MyContext与MyOtherContext和源删除

编辑:

我仔细检查了Qt语言学家的源代码。据我所知,它从不使用ts.dtd进行验证,所有内容都是硬编码的,请参阅ts.cpp中的TSReader类


寓意是:当且仅当生成的ts文件可由Qt Linguist再次加载并由lupdate接受以重新同步应用程序时,您才可以执行任何操作。

翻译的完整查找键为

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

消歧字符串存储在comment字段中,因为在较旧的Qt版本中,这也是插入开发人员注释的方式,Qt语言学家仍然认为这是一种方式,因此.ts文件中的新注释外组件也一样,请参见


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

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

消歧字符串存储在comment字段中,因为在较旧的Qt版本中,这也是插入开发人员注释的方式,Qt语言学家仍然认为这是一种方式,因此.ts文件中的新注释外组件也一样,请参见


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

Qt 4.6.2。我将把这些信息添加到问题中。您觉得使用XML技术舒服吗?是的,我已经编写了几个用于读取和写入XML文件的工具。我不会将自己定义为XML的高级用户,但我已经在这方面做了很多工作。我需要知道如何在Qt语言文件的TS/context元素中识别消息元素。作为有效的XML文档,可以根据您提供的链接中给出的DTD验证您修改的TS文件。顺便说一句,你可以通过提供一个完整的修改片段来帮助其他愿意回答你问题的人,你已经对一个假定有效的TS文件进行了修改。在该页面上找到的DTD是否只能作为参考?当我尝试验证DTD本身时,例如在上,我在第29行得到一个错误,它位于第31行,Qt版本4.6的DTD:。xmllint在DTD上给出相同的错误消息,无法验证XML文件.Qt 4.6.2。我将把这些信息添加到问题中。你觉得舒服吗
能够使用XML技术吗?是的,我已经编写了几个用于读取和写入XML文件的工具。我不会将自己定义为XML的高级用户,但我已经在这方面做了很多工作。我需要知道如何在Qt语言文件的TS/context元素中识别消息元素。作为有效的XML文档,可以根据您提供的链接中给出的DTD验证您修改的TS文件。顺便说一句,你可以通过提供一个完整的修改片段来帮助其他愿意回答你问题的人,你已经对一个假定有效的TS文件进行了修改。在该页面上找到的DTD是否只能作为参考?当我尝试验证DTD本身时,例如在上,我在第29行得到一个错误,它位于第31行,Qt版本4.6的DTD:。xmllint在DTD上给出了相同的错误消息,无法验证XML文件。您是正确的,但可能有相同的上下文、相同的源代码和不同的翻译文本。我发现有一个可选的注释标记:TS/context/message/comment。如果两条消息有不同的注释,那么它们似乎是可以接受的。至少我没有收到错误消息。非常感谢您花时间查看源代码!你能把上面的评论移到你的答案上吗?那么我可以接受。你是对的,但是有可能有相同的背景,相同的来源,不同的翻译文本。我发现有一个可选的注释标记:TS/context/message/comment。如果两条消息有不同的注释,那么它们似乎是可以接受的。至少我没有收到错误消息。非常感谢您花时间查看源代码!你能把上面的评论移到你的答案上吗?那我就可以接受了。