2010-06-26 11 views
12

Bir Qt4 CMake projem var ve i18n için QM dosyalarını çıktı ikili sistemine entegre etmek istiyorum. Bunlar şimdiye kadar TS ve QM dosyaları üretmek için ben kurallar şunlardır: Qt4 qm dosyalarını cmake ve QRC kullanarak nasıl ikili hale getirilir?

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

Ben yürütülebilir QM dosyaları eklemek için aşağıdaki çalıştı:

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

Bu ana den başlatma olduğunu. 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); 

Ancak strings mypp çeviriler ikili girecek olmadığını gösterir.

Güncelleme

: Ben i18n/translations.qrc her qm dosyasını ekledi:

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

ve

QT4_ADD_RESOURCES(myapp_QM_RCC_SRCS i18n/translations.qrc) 

kullanarak ve yürütülebilir bağımlılıkları için myapp_QM_RCC_SRCS ekledi.

Ancak bu, CMake'in bir gölge oluşturması (kaynak dizininin dışında bina) yapması, ancak QRC dosyalarını QRC dosyasına göre başvurulan dosyaları beklerken bağımlılıkları için ayrıştırması sayesinde yapılama süresi boyunca başarısız olur (güzel özellik ancak yapamazsınız) QM dosyasını bu konumda nasıl kuracağınızı yönetin). QM dosyaları ${CMAKE_CURRENT_BINARY_DIR} (burada gölge oluşturma kullanılarak aittir) içinde bulunur, ancak ${CMAKE_CURRENT_SOURCE_DIR}'da (üretilmemiş dosyaların olması gerektiği yerde) bekler - böylece her iki konum da duruma bağlı olarak doğru olur.

cevap

10

Aynı sorunla karşılaştım.

sadece beklenen QM dosyalarını içeren bir QRC dosyası oluşturun ve diğer kaynaklarla çakışmaması için bunu farklı bir önek vermek:

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

bir ekleme aşağıdaki çözüm geldi Eğer Qt 5.

kullanırsanız

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

kullanın ${Qt5Core_RCC_EXECUTABLE} yerine ${QT_RCC_EXECUTABLE}: CKağıt kural kaynak derleyici çalıştırmak için çıkış dizini ve daha sonra başka bir kurala QRC dosyayı kopyalamak için

+0

Umut verici görünüyor, bunu deneyeceğim. +1 – hurikhan77

+0

Nasıl yaptığınızı öğrenmek için fikrinizi adım adım oluşturdunuz. Mükemmel çalışıyor. – hurikhan77

+0

Katı! Bir çekicilik gibi çalıştı – Claudiu

0

Tercümenizi doğrudan uygulamanızın içine eklemek için Qt kaynakları sistemini kullanmanız gerekir. Bunu yapmak için QT4_ADD_RESOURCES makrosunu kullanın. Bunu nasıl kullanacağımıza dair bir örnek var: http://www.qtcentre.org/wiki/index.php?title=Compiling_Qt4_apps_with_CMake

+0

tüm qt5_ önekleri yerine Evet zaten anladım. Ancak işe yaramaz: CMake 2.6 QRC'nin kaynaklarını (benim durumumda QM dosyası oluşturulurken) keşfeder, ancak bu dosyayı kaynak yolunda olmasını beklediği şekilde nasıl oluşturacağını bilemez. yapı yolu değil (daha önce oluşturulduğu yer). – hurikhan77

1

Çözümüm, sıfırdan derlenmiş çevirilerle ts.qrc XML dosyasını oluşturmak ve daha sonra uygulama ile tamamlamaktır.

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

Dosya ağacı: başlangıçta lupdate aracı tarafından üretilen ts dir

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

Dosyalar İşte

örnektir.

+0

İyi, ancak paralel yapıda (make-jSOMETHING) – drizzt

3

CMake 3.0'da (ve belki de daha önce) ADD_CUSTOM_COMMAND ve diğer komplikasyonlar olmadan bunu yapmanın çok kolay bir yolunu buldum.

İlk olarak, listelenen tüm .qm dosyaları (teşekkürler, the_fly_123) ile QRC dosyası oluşturmak olmalıdır:

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

Sonra bu QRC configure_file kullanarak çıkış dizine dosya ve oluşturmanın standart Qt rutinleri kullanmak kopyalayabilirsiniz ve ekleyin:

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

Sonra ${myapp_QM_RC} dahil add_executable diğer kaynaklarıyla birlikte.
Not: Qt4 için qt4_

+1

yerine $ {CMAKE_BINARY_DIR} '(root build dir), $ {CMAKE_CURRENT_BINARY_DIR}' (build dir alt dizin) olmalıdır, çünkü [configure_file] (https://cmake.org/cmake/help/ v3.10/komut/configure_file.html) ile arasında. –

İlgili konular