Подтвердить что ты не робот

Лучшая практика для Qt-переводов и git

Сегодня я попытался объединить две ветки git проекта Qt. Оба ветки добавили новые строки и новые переводы для них. Теперь инструмент Qt lupdate хранит номер строки исходного файла, где требуется перевод в файлах .ts. Как вы можете себе представить, номера строк не идентичны для двух ветвей, и когда оба файла перевода были обновлены, это приводит к сотням конфликтов слияния, подобных этому, для каждого файла перевода:

<<<<<<< HEAD
 +        <location filename="../../src/network/mail/CSmtp.cpp" line="856"/>
=======
+         <location filename="../../src/network/mail/CSmtp.cpp" line="860"/>
>>>>>>> master

Вы можете сказать, что просто используйте одну из версий и снова запустите lupdate, но таким образом вы потеряете все новые переводы из одной из ветвей.

Другие инструменты, такие как gettext, не имеют этой проблемы, так как они не сохраняют номера строк.

Каковы некоторые хорошие подходы, чтобы избежать этой проблемы в Qt?

4b9b3361

Ответ 1

На странице lupdate man:

-locations {absolute | relative | none}

Укажите/переопределите, как ссылки на исходный код сохраняются в файлах ts. Значение по умолчанию absolute.

Поэтому используйте lupdate -locations none, чтобы исключить все номера строк в файлах TS. Используйте lupdate -locations relative, чтобы уменьшить количество строк в строке: теперь изменения номеров строк будут влиять только на первую строку после каждого изменения, что может быть приемлемым компромиссом, если вы используете linguist с исходным кодом окно открыто.

Мое предпочтение заключается в том, чтобы зафиксировать исходный код только версии с -locations none. В любое время, когда мне нужны номера строк, я запускаю lupdate локально, чтобы создать временную версию с абсолютными местоположениями. Убедитесь, что вы временно не выполняете!

Ответ 2

Одним из возможных решений (упомянутых в ответе на "Слияние файлов перевода (.ts) с существующими файлами .ts" является использование lconvert. Когда это было введено, в Qt 4.5:

Новый инструмент фильтра lconvert облегчает преобразование между форматами файлов и может использоваться для выполнения других преобразований в наборах переводимых строк.

Он включает в себя ручной шаг (создание второго файла только с строками, которые вы хотите объединить), а затем:

 lconvert -i primary.ts secondary.ts -o complete.ts

Чтобы завершить конечный результат, ответ на "Файл перевода, все еще работающий после изменения источника?" , также упоминает pylupdate4 your_project.pro как способ обновления всех ссылок к строкам в файле ts.

Ответ 3

Вы также можете сбросить номера строк с помощью lupdate, используя -locations none. Это устранит любые конфликты с номерами строк, но вы потеряете контекст строк в источниках. Для файлов .ui существует также аргумент -no-ui-lines.

lupdate -locations none -no-ui-lines ...

Ответ 4

  • Зафиксируйте пустой TS, который является действительным XML, например. ./i18n/myapp_de.ts

    <?xml version="1.0" encoding="utf-8"?>
    <!DOCTYPE TS>
    <TS version="2.1">
    </TS>
    
  • Запустите lupdate -verbose -no-obsolete ./src-folder/ -ts ./i18n/myapp_de.ts, когда источники изменились.

  • Не спрашивайте, почему это красиво создает новые записи перевода и правильные контексты без номеров строк, пока нет, если файл TS не существует.

Ответ 5

Если вы объединились с помощью стратегии ours или theirs (см. git merge doc в главе MERGE STRATEGIES), у вас будут все переводы из обоих ветвей:

git merge branch1 -X theirs
git merge branch2 -X theirs

Затем запустите команду lupdate, чтобы исправить строки строк rong.