Обновление лингвиста Qt игнорирует файлы qml

При запуске lupdate ни один из qsTr в файлах qml не распознается. Полученный файл .ts не содержит никакого контекста перевода.

$ lupdate -verbose App.pro
Updating 'translations/en.ts'...
    Found 0 source text(s) (0 new and 0 already existing)

Проект должен быть правильно настроен:

OTHER_FILES += \
    content/main.qml

TRANSLATIONS += \
    translations/en.ts

В main.qml среди прочего:

menuBar: MenuBar {
    Menu {
        title: qsTr("File")
        MenuItem {
            text: qsTr("Open")
            onTriggered: Qt.quit();
        }
    }
    Menu {
        title: qsTr("...")
        MenuItem {
            text: qsTr("About")
            onTriggered: {
                aboutApplicationDialog.open()
            }
        }
    }
}

person Appleshell    schedule 31.05.2014    source источник


Ответы (3)


Вы можете создать файл перевода, запустив lupdate в файле QML:

lupdate main.qml -ts main.ts

Чтобы получить файл .ts, запустив lupdate в файле .pro проекта, вы можете использовать обходной путь. Из документации Qt:

Инструмент lupdate извлекает строки пользовательского интерфейса из вашего приложения. lupdate читает файл .pro вашего приложения, чтобы определить, какие исходные файлы содержат тексты для перевода. Это означает, что ваши исходные файлы должны быть перечислены в записи SOURCES или HEADERS в файле .pro. Если ваших файлов нет в списке, тексты в них не будут найдены.

Однако переменная SOURCES предназначена для исходных файлов C++. Если вы укажете здесь исходные файлы QML или JavaScript, компилятор попытается построить их так, как если бы они были файлами C++. В качестве обходного пути вы можете использовать условный оператор lupdate_only{...}, чтобы инструмент lupdate видел файлы .qml, но компилятор C++ их игнорировал.

Если вы укажете свои файлы .qml в приложении, например:

lupdate_only{
SOURCES = content/main.qml
}

Когда вы запускаете lupdate в проекте .pro, результирующий файл .ts будет содержать контекст перевода QML.

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

# DON'T USE, FAILS!
lupdate_only
{
SOURCES = content/main.qml
}

терпит неудачу (по крайней мере, в OS X 10.12/Qt 5.7) с большим количеством предупреждений и ошибок компилятора, которые далеки от намека на реальную проблему, например.

clang: warning: <qml source file>: 'linker' input unused
clang: warning: argument unused during compilation: '-g'
clang: warning: argument unused during compilation: '-isysroot /Applications/Xcode_7.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk'
  ... 
clang: error: no such file or directory: 'Page1.o'
clang: error: no such file or directory: 'Page1Form.ui.o'

В качестве альтернативы вы можете использовать символ продолжения:

lupdate_only \
{
SOURCES = content/main.qml
}
person Nejat    schedule 01.06.2014

Начиная с Qt 5.8.0 в файле .pro больше не требуется никаких трюков.

Файлы QML могут быть перечислены один раз внутри контейнера ресурсов .qrc, и они будут правильно подобраны:

  1. компилятор
  2. приложение во время выполнения
  3. обновление для перевода

.про файл:

RESOURCES += application.qrc

.qrc — это XML-файл, обычно управляемый через qtcreator без просмотра его содержимого. Дополнительную информацию о файлах qrc можно найти здесь: http://doc.qt.io/qt-5/qtquick-deployment.html#managing-resource-files-with-the-qt-resource-system

Поддержка .qrc была добавлена ​​в lupdate 25 октября 2016 г.: >http://code.qt.io/cgit/qt/qttools.git/commit/?id=f2ebd51d96ad49eb826a4e37e67d506fffcbd40c Он не попал в выпуск Qt 5.7.1, но будет доступен в 5.7. 2 (если он вообще есть).

person Mark Ch    schedule 03.03.2017

Использование lupdate_only кажется жизнеспособным решением. Однако обратите внимание, что QtCreator также подберет файлы qml в качестве исходных файлов, поэтому теперь все файлы qml отображаются в списке дубликатов при навигации по проекту.

Чтобы избежать этого, я использовал другой подход, когда я обновляю переводы через скрипт оболочки:

#!/bin/bash
../../5.5/gcc_64/bin/lupdate *.pro
for tr in *.ts
do
  ../../5.5/gvv_64/bin/lupdate *.qml -ts $ts
done
person Geoffrey VL    schedule 27.06.2017