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

Как интегрировать Qt4 qm файлы в двоичные файлы с помощью cmake и QRC?

У меня есть проект Qt4 CMake, и я бы хотел интегрировать файлы QM для i18n в выходной двоичный файл. Это правила, которые я до сих пор использовал для создания TS и QM файлов:

set(myapp_TRANSLATIONS
    i18n/myapp_de.ts
)

set(FILES_TO_TRANSLATE
    ${myapp_SRCS}
    ${myapp_MOC_HDRS}
)

QT4_CREATE_TRANSLATION(QM_FILES ${FILES_TO_TRANSLATE} ${myapp_TRANSLATIONS})
QT4_ADD_TRANSLATION(QM ${myapp_TRANSLATIONS})

Я попробовал следующее: чтобы добавить файлы QM в исполняемый файл:

add_executable(myapp ${myapp_SRCS} ${myapp_MOC_SRCS} ${myapp_RCC_SRCS} ${QM})

Это инициализация main.cpp:

QTranslator qtTranslator;
qtTranslator.load("qt_" + QLocale::system().name(), QLibraryInfo::location(QLibraryInfo::TranslationsPath));
app.installTranslator(&qtTranslator);

QTranslator appTranslator;
appTranslator.load("myapp_" + QLocale::system().name());
app.installTranslator(&appTranslator);

Однако strings mypp показывает, что переводы не входят в двоичный файл.

Обновление: Я добавил каждый qm файл в i18n/translations.qrc:

<!DOCTYPE RCC><RCC version="1.0">
  <qresource prefix="/resources">
    <file>myapp_de.qm</file>
    <file>  ...   .qm</file>
  </qresource>
</RCC>

и используя

QT4_ADD_RESOURCES(myapp_QM_RCC_SRCS i18n/translations.qrc)

и добавление myapp_QM_RCC_SRCS к исполняемым зависимостям.

Но это не удается во время сборки благодаря тому, что CMake создает теневую сборку (построение за пределами исходного каталога), но анализирует файлы QRC для зависимостей, ожидающих ссылки файлов по сравнению с QRC файлом (хорошая функция, но нет правила make как создать файл QM в этом месте). Файлы QM находятся в ${CMAKE_CURRENT_BINARY_DIR} (где они принадлежат теневому построению), но ожидают его в ${CMAKE_CURRENT_SOURCE_DIR} (где не созданы файлы - так что оба места будут правильными, в зависимости от ситуации).

4b9b3361

Ответ 1

У меня была такая же проблема. Я придумал следующее решение:

Создайте QRC файл, содержащий только ожидаемые файлы QM, и дайте ему другой префикс, чтобы он не конфликтует с вашими другими ресурсами:

<RCC>
    <qresource prefix="/translators">
    <file>myapp_en.qm</file>
    </qresource>
</RCC>

Добавьте правило CMake, чтобы скопировать QRC файл в выходной каталог, а затем другое правило для запуска компилятора ресурсов:

# Change 'myapp_en' to be the base file name of the qrc file.
SET( trans_file myapp_en )
SET( trans_srcfile ${CMAKE_CURRENT_SOURCE_DIR}/${trans_file}.qrc)
SET( trans_infile ${CMAKE_CURRENT_BINARY_DIR}/${trans_file}.qrc)
SET( trans_outfile ${CMAKE_CURRENT_BINARY_DIR}/qrc_${trans_file}.cxx)

# Copy the QRC file to the output directory, because the files listed in the 
# qrc file are relative to that directory.
ADD_CUSTOM_COMMAND(
    OUTPUT ${trans_infile}
    COMMAND ${CMAKE_COMMAND} -E copy ${trans_srcfile} ${trans_infile}
    MAIN_DEPENDENCY ${trans_srcfile}
    )

# Run the resource compiler (rcc_options should already be set). We can't
# use QT4_ADD_RESOURCES because the qrc file may not exist yet.
ADD_CUSTOM_COMMAND(
    OUTPUT ${trans_outfile}
    COMMAND ${QT_RCC_EXECUTABLE}
    ARGS ${rcc_options} -name ${trans_file} -o ${trans_outfile} ${trans_infile}
    MAIN_DEPENDENCY ${trans_infile}
    DEPENDS ${qm_files}
    )

# Add compiled resources to executable dependency list
ADD_EXECUTABLE( ${APP_NAME} ... ${trans_outfile} )

Используйте ${Qt5Core_RCC_EXECUTABLE} вместо ${QT_RCC_EXECUTABLE}, если вы используете Qt 5.

Ответ 2

Я нашел очень простой способ сделать это в CMake 3.0 (и, возможно, раньше) без ADD_CUSTOM_COMMAND и других осложнений.

Сначала вы должны создать QRC файл со всеми перечисленными .qm файлами (спасибо, the_fly_123):

<RCC>
  <qresource prefix="/translators">
    <file>myapp_en.qm</file>
  </qresource>
</RCC>

Затем вы можете скопировать этот QRC файл в выходной каталог с помощью configure_file и использовать стандартные подпрограммы Qt для его создания и добавления:

# Change lang.qrc to the name of QRC file, created on the previous step
set(lang_qrc "lang.qrc")
configure_file(${lang_qrc} ${lang_qrc} COPYONLY)
qt5_add_translation(myapp_QM ${myapp_TRANSLATIONS})
qt5_add_resources(myapp_QM_RC ${CMAKE_CURRENT_BINARY_DIR}/${lang_qrc})

Затем включите ${myapp_QM_RC} в add_executable вместе с другими источниками.
Примечание.. Для Qt4 замените все префиксы qt5_ на qt4_

Ответ 3

Мое решение состоит в том, чтобы сгенерировать XML файл ts.qrc с скомпилированными переводами с нуля, а затем выполнить его с помощью приложения.

Вот пример:

file(GLOB QRC_FILES *.qrc)
file(GLOB TS_FILES ts/*.ts)
...

# Option for updating translations
option(UPDATE_TRANSLATIONS "Update source translation ts/*.ts files (WARNING: make clean will delete the source *.ts files. Danger!)" OFF)
if(UPDATE_TRANSLATIONS)
qt4_create_translation(QM_FILES ${TS_FILES})
endif()
...
# Compiling translations *.ts -> *.qm
qt4_add_translation(QM_FILES ${TS_FILES})
...
# Create translations QRC file - ts.qrc
set(TRANSLATIONS_QRC "${CMAKE_CURRENT_BINARY_DIR}/ts.qrc")
file(WRITE ${TRANSLATIONS_QRC} "<RCC>\n\t<qresource prefix=\"/ts\">")
foreach(QM_FILE ${QM_FILES})
    get_filename_component(QM_FILE_NAME ${QM_FILE} NAME)
    file(APPEND ${TRANSLATIONS_QRC} "\n\t\t<file alias=\"${QM_FILE_NAME}\">${QM_FILE_NAME}</file>")
endforeach()
file(APPEND ${TRANSLATIONS_QRC} "\n\t</qresource>\n</RCC>")
list(APPEND QRC_FILES ${TRANSLATIONS_QRC})
...
# Compiling *.qrc files
qt4_add_resources(QRC_SRCS ${QRC_FILES})
...
# Add compiled resources to executable dependency list
add_executable(${APP_NAME} ... ${QRC_SRCS})

Дерево файлов:

/ - source code root
/rc.qrc - contains app icons etc.
/ts/appname_*.ts - application translations
...
/build - build root
/build/appname_*.qm - compiled translations
/build/ts.qrc - translations rescources
/build/Release/qrc_rc.cxx - compiled icon etc. resources
/build/Release/qrc_ts.cxx - compiled translation resources

Файлы в ts dir, первоначально созданные с помощью инструмента lupdate.

Ответ 4

Вам необходимо использовать систему ресурсов Qt, чтобы включить ваш перевод непосредственно в двоичный файл приложения. Для этого используйте макрос QT4_ADD_RESOURCES. Существует пример того, как его использовать: http://www.qtcentre.org/wiki/index.php?title=Compiling_Qt4_apps_with_CMake