I have a Qt4 CMake project and I'd like to integrate the QM files for i18n into the output binary. These are the rules I have so far for generating the TS and QM files:
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})
I tried the following to add the QM files to the executable:
add_executable(myapp ${myapp_SRCS} ${myapp_MOC_SRCS} ${myapp_RCC_SRCS} ${QM})
This is the initialization from 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);
However, strings mypp
shows that the translations are not going into the binary.
Update: I added each qm file to a i18n/translations.qrc
:
<!DOCTYPE RCC><RCC version="1.0">
<qresource prefix="/resources">
<file>myapp_de.qm</file>
<file> ... .qm</file>
</qresource>
</RCC>
and using
QT4_ADD_RESOURCES(myapp_QM_RCC_SRCS i18n/translations.qrc)
and adding myapp_QM_RCC_SRCS
to the executable dependencies.
But this fails during build time thanks to the fact that CMake does a shadow build (building outside the source dir) but parses the QRC files for dependencies expecting the referenced files relative to the QRC file (nice feature but there's no make rule how to build the QM file at that location). The QM files are in ${CMAKE_CURRENT_BINARY_DIR}
(where they belong using shadow building) but expects it in ${CMAKE_CURRENT_SOURCE_DIR}
(where non-generated files should be - so both locations would be correct, depending on situation).
My solution is to generate
ts.qrc
XML file with compiled translations from scratch and then complie it with app.Here is example:
File tree:
Files in
ts
dir initially generated bylupdate
tool.I have found a very simple way to do it in CMake 3.0 (and, maybe, earlier) without
ADD_CUSTOM_COMMAND
and other complications.First, you should create a QRC file with all
.qm
files listed ( thanks, the_fly_123 ):Then you can copy this QRC file into the output directory using
configure_file
and use standard Qt routines to build and add it:Then include
${myapp_QM_RC}
inadd_executable
along with other sources.Note: For Qt4 replace all
qt5_
prefixes withqt4_
I had the exact same problem. I came up with the following solution:
Create a QRC file that contains only the expected QM files, and give it a different prefix so it won't conflict with your other resources:
Add a CMake rule to copy the QRC file to the output directory and then another rule to run the resource compiler:
Use
${Qt5Core_RCC_EXECUTABLE}
instead of${QT_RCC_EXECUTABLE}
if you use Qt 5.You need to use Qt resources system to include your translation directly into your application binary. Use QT4_ADD_RESOURCES macro to do this. There is some example how to use it: http://www.qtcentre.org/wiki/index.php?title=Compiling_Qt4_apps_with_CMake