我有一个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}
(非生成文件应该在哪里 - 因此两个位置都是正确的,具体取决于具体情况)。
答案 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