如何使用cmake和QRC将Qt4 qm文件集成到二进制文件中?

时间:2010-06-26 19:57:27

标签: localization qt4 internationalization translation cmake

我有一个Qt4 CMake项目,我想将i18n的QM文件集成到输出二进制文件中。这些是我到目前为止生成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执行阴影构建(在源dir之外构建),但解析了QRC文件中依赖于期望引用文件相对于QRC文件的依赖关系(很好的功能,但没有制定规则)如何在该位置构建QM文件)。 QM文件位于${CMAKE_CURRENT_BINARY_DIR}(它们属于使用阴影构建的地方),但是期望它在${CMAKE_CURRENT_SOURCE_DIR}(非生成文件应该在哪里 - 因此两个位置都是正确的,具体取决于具体情况)。

4 个答案:

答案 0 :(得分:10)

我遇到了完全相同的问题。我提出了以下解决方案:

创建一个仅包含预期QM文件的QRC文件,并为其指定一个不同的前缀,以免与其他资源发生冲突:

<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} )

如果您使用Qt 5,请使用${Qt5Core_RCC_EXECUTABLE}代替${QT_RCC_EXECUTABLE}

答案 1 :(得分:5)

我在CMake 3.0中找到了一种非常简单的方法(也许,更早一些),没有ADD_CUSTOM_COMMAND和其他复杂情况。

首先,您应该创建一个包含所有.qm个文件的QRC文件(谢谢,the_fly_123):

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

然后,您可以使用configure_file将此QRC文件复制到输出目录中,并使用标准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_

答案 2 :(得分:1)

我的解决方案是从头开始生成带有编译翻译的ts.qrc XML文件,然后用app进行编译。

以下是示例:

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目录中的文件最初由lupdate工具生成。

答案 3 :(得分:0)

您需要使用Qt资源系统将您的翻译直接包含在您的应用程序二进制文件中。使用QT4_ADD_RESOURCES宏来执行此操作。有一些例子如何使用它:http://www.qtcentre.org/wiki/index.php?title=Compiling_Qt4_apps_with_CMake