2010-06-26 32 views
12

我有一個Qt4 CMake項目,我想將i18n的QM文件集成到輸出二進制文件中。這是我的規則至今產生的TS和QM文件:如何使用cmake和QRC將Qt4 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}) 

這是主要的初始化。 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做了一個陰影構建(在源代碼目錄之外構建)但是解析了QRC文件的期望被引用文件相對於QRC文件的依賴關係,所以這在構建時失敗(很好的特性,但是沒有make規則如何在該位置構建QM文件)。質量管理文件在${CMAKE_CURRENT_BINARY_DIR}(他們屬於使用影子建築物的地方),但預計在${CMAKE_CURRENT_SOURCE_DIR}(其中非生成的文件應該是 - 所以這兩個位置將是正確的,取決於情況)。

回答

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

使用${Qt5Core_RCC_EXECUTABLE}而不是${QT_RCC_EXECUTABLE}如果你使用Qt 5

+0

看起來很有希望,我會嘗試。 +1 – hurikhan77 2010-12-17 22:24:29

+0

我從一開始就一步一步構建了您的想法,以瞭解您是如何做到的。完美的作品。 – hurikhan77 2011-10-01 20:05:30

+0

固體!像魅力一樣工作 – Claudiu 2014-08-06 21:54:30

0

您需要使用Qt資源系統將您的翻譯直接包含到應用程序二進制文件中。使用QT4_ADD_RESOURCES宏來做到這一點。有一些例子如何使用它:http://www.qtcentre.org/wiki/index.php?title=Compiling_Qt4_apps_with_CMake

+0

全部更換qt5_前綴是的,我已經想通了這一點。但它不起作用:CMake 2.6發現了QRC的來源(在我的情況下是要生成的QM文件),但無法知道如何構建該文件,因爲它預計它將位於源路徑中,而不是構建路徑(之前創建的路徑)。 – hurikhan77 2010-07-06 14:19:06

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 

文件中最初由lupdate工具生成ts目錄。

+0

好,但它不與平行make(make -jSOMETHING) – drizzt 2015-08-09 19:09:54

3

我已經找到了一個非常簡單的方法來做到這一點在CMake 3.0(也許,更早)沒有ADD_CUSTOM_COMMAND和其他併發症。

首先,你應該創建(感謝,the_fly_123)中列出的所有.qm文件QRC文件:

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

然後你就可以複製此QRC文件到輸出目錄使用configure_file和使用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與qt4_

+1

,而不是'$ {CMAKE_BINARY_DIR}'(根構建目錄),它應該是'$ {CMAKE_CURRENT_BINARY_DIR}'(構建目錄中的子目錄),因爲那是[configure_file](https://cmake.org/cmake/help/) v3.10/command/configure_file.html)複製到。 – 2017-12-11 13:59:15

相關問題