2010-06-26 15 views
12

J'ai un projet Qt4 CMake et je voudrais intégrer les fichiers QM pour i18n dans le binaire de sortie. Ce sont les règles que je jusqu'à présent pour générer les fichiers TS et QM:Comment intégrer les fichiers qm Qt4 en binaire en utilisant cmake et QRC?

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

J'ai essayé les éléments suivants pour ajouter les fichiers QM à l'exécutable:

add_executable(myapp ${myapp_SRCS} ${myapp_MOC_SRCS} ${myapp_RCC_SRCS} ${QM}) 

C'est l'initialisation de la principale. 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); 

Cependant, strings mypp montre que les traductions ne vont pas dans le binaire.

Mise à jour: j'ajouté chaque fichier qm à un i18n/translations.qrc:

<!DOCTYPE RCC><RCC version="1.0"> 
    <qresource prefix="/resources"> 
    <file>myapp_de.qm</file> 
    <file> ... .qm</file> 
    </qresource> 
</RCC> 

et en utilisant

QT4_ADD_RESOURCES(myapp_QM_RCC_SRCS i18n/translations.qrc) 

et en ajoutant myapp_QM_RCC_SRCS aux dépendances exécutables.

Mais cela échoue pendant la compilation du fait que CMake fait une construction d'ombre (construction en dehors du répertoire source) mais analyse les fichiers QRC pour les dépendances en attendant les fichiers référencés par rapport au fichier QRC (fonctionnalité intéressante mais règle comment construire le fichier QM à cet endroit). Les fichiers QM sont dans ${CMAKE_CURRENT_BINARY_DIR} (où ils appartiennent à l'aide de la construction d'ombre) mais l'attend dans ${CMAKE_CURRENT_SOURCE_DIR} (où les fichiers non générés devraient être - donc les deux emplacements seraient corrects, selon la situation).

Répondre

10

J'ai eu exactement le même problème. Je suis venu avec la solution suivante:

Créer un fichier QRC qui contient uniquement les fichiers QM attendus, et lui donner un préfixe différent, donc il ne sera pas en conflit avec vos autres ressources:

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

Ajouter un règle CMake pour copier le fichier QRC dans le répertoire de sortie, puis une autre règle pour exécuter le compilateur de ressources:

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

utilisation ${Qt5Core_RCC_EXECUTABLE} au lieu de ${QT_RCC_EXECUTABLE} si vous utilisez Qt 5.

+0

Ça promet, je vais essayer ça. +1 – hurikhan77

+0

J'ai construit votre idée depuis le début, étape par étape, pour apprendre comment vous l'avez fait. Fonctionne parfaitement. – hurikhan77

+0

Solide! Travaillé comme un charme – Claudiu

0

Vous devez utiliser le système de ressources Qt pour inclure votre traduction directement dans votre application binaire. Utilisez la macro QT4_ADD_RESOURCES pour cela. Il y a un exemple comment l'utiliser: http://www.qtcentre.org/wiki/index.php?title=Compiling_Qt4_apps_with_CMake

+0

Oui je l'ai déjà compris cela. Mais ça ne marchera pas: CMake 2.6 découvre les sources du QRC (dans mon cas le fichier QM à générer) mais ne pourra pas savoir comment construire ce fichier car il s'attend à ce qu'il soit dans le chemin source, pas le chemin de construction (où il a été créé avant). – hurikhan77

1

Ma solution est de générer ts.qrc fichier XML avec des traductions compilées à partir de zéro, puis complie avec l'application.

Voici par exemple:

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

arbre du fichier:

/ - 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 

fichiers dans ts dir initialement générée par lupdate outil.

+0

Bon, mais cela ne fonctionne pas avec make parallèle (make -jSOMETHING) – drizzt

3

J'ai trouvé une façon très simple de le faire dans CMake 3.0 (et, peut-être, plus tôt) sans ADD_CUSTOM_COMMAND et d'autres complications.

D'abord, vous devez créer un fichier QRC avec tous .qm fichiers listés (merci, the_fly_123):

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

Ensuite, vous pouvez copier ce fichier QRC dans le répertoire de sortie en utilisant configure_file et utiliser des routines Qt standard pour construire et l'ajouter:

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

comprennent ensuite ${myapp_QM_RC} dans add_executable ainsi que d'autres sources.
Note: Pour Qt4 remplacer toutes les qt5_ préfixes avec qt4_

+1

au lieu de '$ {CMAKE_BINARY_DIR}' (le répertoire de construction racine), il devrait être '$ {CMAKE_CURRENT_BINARY_DIR}' (le sous-répertoire du répertoire de construction), parce que c'est là que [configure_file] (https://cmake.org/cmake/help/ v3.10/command/configure_file.html) copie vers. –