2010-06-26 18 views
12

मेरे पास एक क्यूटी 4 सीएमके प्रोजेक्ट है और मैं आउटपुट बाइनरी में i18n के लिए क्यूएम फ़ाइलों को एकीकृत करना चाहता हूं। ये नियम मैं अब तक टीएस और 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}) 

यह मुख्य रूप से प्रारंभ है। सीपीपी:

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 पता चलता है कि अनुवाद के द्विआधारी में नहीं जा रहे हैं।

अद्यतन:

QT4_ADD_RESOURCES(myapp_QM_RCC_SRCS i18n/translations.qrc) 

का उपयोग कर और निष्पादन योग्य निर्भरता को myapp_QM_RCC_SRCS जोड़ने

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

और: मैं एक i18n/translations.qrc करने के लिए प्रत्येक QM फ़ाइल जोड़ा।

लेकिन यह निर्माण समय के दौरान विफल रहता है इस तथ्य के कारण धन्यवाद कि सीएमके एक छाया निर्माण (स्रोत डीआईआर के बाहर निर्माण) करता है लेकिन क्यूआरसी फाइलों के सापेक्ष संदर्भित फाइलों की अपेक्षा निर्भरता के लिए क्यूआरसी फाइलों को पार करता है (अच्छी सुविधा लेकिन कोई मेक नहीं है नियम है कि उस स्थान पर क्यूएम फ़ाइल कैसे बनाएं)। क्यूएम फाइलें ${CMAKE_CURRENT_BINARY_DIR} (जहां वे छाया निर्माण का उपयोग कर रहे हैं) में हैं, लेकिन ${CMAKE_CURRENT_SOURCE_DIR} (जहां गैर-जेनरेट की गई फाइलें होनी चाहिए) - इसलिए स्थिति के आधार पर दोनों स्थान सही होंगे)।

उत्तर

10

मुझे एक ही समस्या थी।

एक QRC फ़ाइल है कि केवल उम्मीद QM फ़ाइलें हैं बनाएँ, और इसलिए यह अपने अन्य संसाधनों के साथ संघर्ष नहीं होगा यह एक अलग उपसर्ग दे::

<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} यदि आप क्यूटी 5.

का उपयोग
+0

वादा करता है, मैं कोशिश करूँगा। +1 – hurikhan77

+0

मैंने सीखने के लिए चरण-दर-चरण से अपना विचार बनाया है कि आपने यह कैसे किया है। अच्छी तरह से काम। – hurikhan77

+0

ठोस! एक आकर्षण की तरह काम किया – Claudiu

0

आपको अपने अनुवाद बाइनरी में सीधे अपना अनुवाद शामिल करने के लिए क्यूटी संसाधन प्रणाली का उपयोग करने की आवश्यकता है। ऐसा करने के लिए QT4_ADD_RESOURCES मैक्रो का उपयोग करें। इसका कुछ उदाहरण है इसका उपयोग कैसे करें: http://www.qtcentre.org/wiki/index.php?title=Compiling_Qt4_apps_with_CMake

+0

के साथ सभी qt5_ उपसर्गों की जगह हाँ मैं पहले से ही है कि पता लगा। लेकिन यह काम नहीं करेगा: सीएमके 2.6 ने क्यूआरसी के स्रोतों को खोजा है (मेरे मामले में क्यूएम फाइल जेनरेट की जाएगी) लेकिन यह नहीं जान पाएगी कि इस फाइल को कैसे बनाया जाए क्योंकि यह स्रोत पथ में होने की अपेक्षा करता है, निर्माण पथ नहीं (जहां इसे पहले बनाया गया था)। – hurikhan77

1

मेरा समाधान स्क्रैच से संकलित अनुवादों के साथ ts.qrc एक्सएमएल फ़ाइल उत्पन्न करना है और उसके बाद इसे ऐप से शिकायत करना है।

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

फ़ाइल पेड़:

ts dir शुरू में lupdate उपकरण द्वारा उत्पन्न में
/ - 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 

फ़ाइलें

यहाँ उदाहरण है।

+0

अच्छा, लेकिन यह समानांतर बनाने (मेक-जेएसओमेथिंग) के साथ काम नहीं करता है – drizzt

3

मुझे ADD_CUSTOM_COMMAND और अन्य जटिलताओं के बिना सीएमके 3.0 (और शायद, पहले) में ऐसा करने का एक बहुत ही आसान तरीका मिला है।

सबसे पहले, आप सूचीबद्ध सभी .qm फ़ाइलें (धन्यवाद, the_fly_123) के साथ एक QRC फाइल बनाने चाहिए:

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

तो फिर तुम इस QRC configure_file का उपयोग कर उत्पादन निर्देशिका में फाइल और मानक क्यूटी दिनचर्या का उपयोग निर्माण करने के लिए कॉपी कर सकते हैं अन्य स्रोतों के साथ add_executable में

# 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} में शामिल हैं: और जोड़ें।
नोट: क्यूटी 4 के लिए qt4_

+1

'$ {CMAKE_BINARY_DIR}' (रूट बिल्ड डीआईआर), यह '$ {CMAKE_CURRENT_BINARY_DIR}' (बिल्ड डीआईआर में उपदिर) होना चाहिए, क्योंकि वह है जहां [config_file] (https://cmake.org/cmake/help/ v3.10/command/config_file.html) प्रतियां। –