Идентификация сообщений в файле перевода Qt Linguist (файл TS) - PullRequest
1 голос
/ 12 января 2012

Я надеюсь, что это правильный форум, чтобы задать этот вопрос.Если это не так, пожалуйста, перенаправьте меня на более подходящий форум.

Я пытаюсь понять формат файла 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: Переводчик , Руководство по Qt Linguist: Программисты , Формат файла Linguist TS , но ни по одному из них я не имеюнашел информацию, которую я ищу, а именно, как идентифицируется каждое сообщение и что может вызвать сообщение об ошибке в 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 ]

3 голосов
/ 12 января 2012

Сообщение об ошибке, сообщаемое 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 ) и источнику ( Удалить ).

Edit:

Я внимательно изучил исходный код Qt Linguist. Насколько я могу судить, он никогда не использует ts.dtd для проверки, все жестко закодировано (см. Класс TSReader в ts.cpp).

Мораль такова: вы можете выполнять любые необходимые манипуляции, если и только если полученный файл ts может быть снова загружен Qt Linguist и принят lupdate (для повторной синхронизации приложения).

1 голос
/ 21 мая 2012

Полный ключ поиска для перевода:

Контекст + исходная строка и, если имеется, строка устранения неоднозначности

см. 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 # translationator-comments )).

Итак, как вы заметили, у вас может быть две строки с одинаковым контекстом и исходной строкой, если они имеют разные строки устранения неоднозначности (или одна из них имеет одну, а другая - нет).

...