我希望这是提出这个问题的正确论坛。如果不是,请将我重定向到更合适的论坛。
我试图了解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">&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: Translator,Qt Linguist Manual: Programmers,Linguist 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">&Borrar</translation>
</message>
<message>
<location filename="../../../../../MyFile.cpp" line="1572"/>
<source>Delete</source>
<comment>Comment 2</comment>
<translation>Eliminar</translation>
</message>
</context>
</TS>
可以正确打开上述文件。
这似乎解决了我的问题,但最好有一些关于这种格式的精确文档。
答案 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">&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))。
因此,正如您所注意到的,只要它们具有不同的消歧字符串(或者其中一个具有一个而另一个不具有),则可以使用具有相同上下文和源字符串的两个字符串。