2010-06-26 7 views
12

Ich habe ein Qt4 CMake-Projekt und möchte die QM-Dateien für i18n in die binäre Ausgabe integrieren. Dies sind die Regeln, die ich bisher habe zur Erzeugung des TS und QM-Dateien:Wie integriert man Qt4 qm-Dateien mit CMake und QRC in Binärdateien?

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

Ich habe versucht, die im Anschluss an die QM-Dateien in der ausführbaren Datei hinzuzufügen:

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

Dies ist die Initialisierung von Haupt. cav:

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

Allerdings zeigt strings mypp, dass die Übersetzungen nicht in die binären gehen.

Update: Ich habe jede qm-Datei in ein i18n/translations.qrc:

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

und

QT4_ADD_RESOURCES(myapp_QM_RCC_SRCS i18n/translations.qrc) 

und das Hinzufügen von myapp_QM_RCC_SRCS zu den ausführbaren Abhängigkeiten verwenden.

Aber das scheitert während der Bauzeit dank der Tatsache, dass CMake einen Schatten baut (außerhalb des Quellverzeichnisses), aber die QRC-Dateien auf Abhängigkeiten analysiert und die referenzierten Dateien relativ zur QRC-Datei erwartet (nettes Feature, aber kein make Regel, wie die QM-Datei an diesem Ort erstellt wird. Die QM-Dateien befinden sich in ${CMAKE_CURRENT_BINARY_DIR} (wo sie mit Shadowbuilding zusammenhängen), erwarten aber in ${CMAKE_CURRENT_SOURCE_DIR} (wo nicht generierte Dateien sein sollten - also wären beide Standorte je nach Situation korrekt).

Antwort

10

Ich hatte genau das gleiche Problem. Ich kam mit der folgenden Lösung:

eine QRC-Datei erstellen, die nur die erwarteten QM-Dateien enthalten, und ihm einen anderen Präfix geben, damit es nicht mit anderen Ressourcen in Konflikt steht:

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

ein In CMake Regel die QRC-Datei in das Ausgabeverzeichnis zu kopieren und dann eine andere Regel, die Ressource-Compiler auszuführen:

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

verwenden ${Qt5Core_RCC_EXECUTABLE} statt ${QT_RCC_EXECUTABLE} wenn Sie Qt verwenden 5.

+0

Sieht vielversprechend aus, ich werde es versuchen. +1 – hurikhan77

+0

Ich habe Ihre Idee von Anfang an Schritt für Schritt aufgebaut, um zu lernen, wie Sie es gemacht haben. Funktioniert perfekt. – hurikhan77

+0

Fest! Arbeitete wie ein Charme – Claudiu

0

Sie müssen das Qt-Ressourcensystem verwenden, um Ihre Übersetzung direkt in Ihre Anwendungsbinärdatei aufzunehmen. Verwenden Sie dazu das Makro QT4_ADD_RESOURCES. Es gibt ein Beispiel, wie man es benutzt: http://www.qtcentre.org/wiki/index.php?title=Compiling_Qt4_apps_with_CMake

+0

Ja ich das schon herausgefunden. Aber es wird nicht funktionieren: CMake 2.6 entdeckt die Quellen des QRC (in meinem Fall die zu erzeugende QM-Datei) wird aber nicht wissen können, wie man diese Datei erstellt, da sie erwartet, dass sie im Quellpfad ist, nicht der Build-Pfad (wo er zuvor erstellt wurde). – hurikhan77

1

Meine Lösung besteht darin, ts.qrc XML-Datei mit kompilierten Übersetzungen von Grund auf neu zu generieren und dann mit App zu kompilieren.

Hier ist Beispiel:

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

Dateibaum:

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

Dateien in ts dir zunächst von lupdate Tool generiert.

+0

Gut, aber es funktioniert nicht mit parallelen make (make -jSOMETHING) – drizzt

3

Ich habe einen sehr einfachen Weg gefunden, es in CMake 3.0 (und vielleicht früher) ohne ADD_CUSTOM_COMMAND und andere Komplikationen zu tun.

Zunächst sollten Sie eine QRC-Datei mit allen .qm Dateien aufgelistet (danke, the_fly_123) erstellen:

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

Dann können Sie diese QRC kopieren in das Ausgabeverzeichnis Datei Routinen configure_file und verwenden Standard-Qt zu bauen und fügen sie es:

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

Dann ${myapp_QM_RC} in add_executable zusammen mit anderen Quellen umfassen.
Hinweis: Für Qt4 ersetzen alle qt5_ Präfixe mit qt4_

+1

statt '$ {CMAKE_BINARY_DIR}' (das root build dir), sollte es '$ {CMAKE_CURRENT_BINARY_DIR}' (das Unterverzeichnis in Build dir) sein, denn das ist wo [configure_file] (https://cmake.org/cmake/help/ v3.10/command/configure_file.html) kopiert nach. –