Как интегрировать файлы Qt4 qm в двоичные файлы, используя cmake и QRC? - PullRequest
12 голосов
/ 26 июня 2010

У меня есть проект 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} (где должны быть не сгенерированные файлы - поэтому оба местоположения будут правильными, в зависимости от ситуации).

Ответы [ 4 ]

10 голосов
/ 17 декабря 2010

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

Создайте файл 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.

5 голосов
/ 14 января 2016

Я нашел очень простой способ сделать это в 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_

1 голос
/ 10 января 2014

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

Вот пример:

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.

0 голосов
/ 06 июля 2010

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

...