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

hur*_*n77 12 translation localization qt4 cmake internationalization

我有一个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})
Run Code Online (Sandbox Code Playgroud)

我尝试了以下操作将QM文件添加到可执行文件中:

add_executable(myapp ${myapp_SRCS} ${myapp_MOC_SRCS} ${myapp_RCC_SRCS} ${QM})
Run Code Online (Sandbox Code Playgroud)

这是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);
Run Code Online (Sandbox Code Playgroud)

但是,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>
Run Code Online (Sandbox Code Playgroud)

和使用

QT4_ADD_RESOURCES(myapp_QM_RCC_SRCS i18n/translations.qrc)
Run Code Online (Sandbox Code Playgroud)

并添加myapp_QM_RCC_SRCS到可执行的依赖项.

但是由于CMake执行了阴影构建(在源目录之外构建)但是解析了QRC文件以寻找相对于QRC文件的引用文件的依赖性(这很好的功能但是没有制定规则如何构建该位置的QM文件).QM文件位于${CMAKE_CURRENT_BINARY_DIR}(它们属于使用阴影构建的地方)但是期望它${CMAKE_CURRENT_SOURCE_DIR}(非生成的文件应该是 - 所以两个位置都是正确的,具体取决于具体情况).

小智 10

我有同样的问题.我提出了以下解决方案:

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

<RCC>
    <qresource prefix="/translators">
    <file>myapp_en.qm</file>
    </qresource>
</RCC>
Run Code Online (Sandbox Code Playgroud)

添加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} )
Run Code Online (Sandbox Code Playgroud)

如果您使用Qt 5,请使用${Qt5Core_RCC_EXECUTABLE}而不是${QT_RCC_EXECUTABLE}.

  • 不要停止阅读,有一种更简单的方法:http://stackoverflow.com/a/34798124/789427 (2认同)

Ale*_*nko 5

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

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

<RCC>
  <qresource prefix="/translators">
    <file>myapp_en.qm</file>
  </qresource>
</RCC>
Run Code Online (Sandbox Code Playgroud)

然后,您可以configure_file使用标准Qt例程将此QRC文件复制到输出目录中并进行构建和添加:

# 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})
Run Code Online (Sandbox Code Playgroud)

然后包括${myapp_QM_RC}add_executable连同其他来源.
注意:对于Qt4,请替换所有qt5_前缀qt4_