如何将QT翻译添加到CMake

时间:2018-07-06 21:19:13

标签: qt cmake

无法弄清楚如何将QT翻译添加到CMake。我尝试过:

file(GLOB TRANSLATION_FILES ${CMAKE_SOURCE_DIR}/Translations/*.ts)
qt5_add_translation(QM_FILES ${TRANSLATION_FILES})
add_executable(${PROJECT_NAME} ${CPP_FILES} ${RESOURCES} ${QM_FILES})

当我编译用CMake生成的VS2015项目时,我将获得以下构建输出:

*2>Generating MyProj_en.qm
2>Updating 'C:/repos/build/lg/MyProj_en.qm'...
2>    Generated 14 translation(s) (14 finished and 0 unfinished)
2>Generating MyProj_ru.qm
2>Updating 'C:/repos/build/lg/MyProj_ru.qm'...*

因此至少生成了* .qm文件,但是QTranslator不会加载翻译:

static const QString translationsDirectory = ":/Translations/";
QTranslator translator;
bool loaded = translator.load(translation_file, translationsDirectory);
//here loaded == false

我在CMake中想念什么?

EDIT1:

在我的.pro文件(带有QMake)中,我有这个:

TRANSLATIONS = $$files(Translations/*.ts)

qtPrepareTool(LRELEASE, lrelease)
for(tsfile, TRANSLATIONS) {
    qmfile = $$tsfile
    qmfile ~= s,.ts$,.qm,
    if (!exists($$qmfile)) {
        command = $$LRELEASE -removeidentical $$tsfile -qm $$qmfile
        system($$command)|error("Translation: Failed to run: $$command")
    }
}

#Icon files are added in the same way as in quickcontrols2\gallery\ sample
RESOURCES += qml.qrc \
    scene.qrc \
    $$files(Translations/*.qm) \
    icons.qrc

和上面的C ++代码成功加载了翻译。

EDIT2:

试图将QM_FILES添加到资源:

file(GLOB TRANSLATION_FILES ${CMAKE_SOURCE_DIR}/Translations/*.ts)
qt5_add_translation(QM_FILES ${TRANSLATION_FILES})

qt5_add_resources(RESOURCES qml.qrc scene.qrc icons.qrc ${QM_FILES})

add_executable(${PROJECT_NAME} ${CPP_FILES} ${RESOURCES})

但没有成功,错误是:

CUSTOMBUILD : RCC Parse error : 'C:/repos/build/lg/MyProj_en.qm' Line: 1 Column: 2 [Encountered incorrectly encoded content.]

可能是.qrc文件,但不是.qm。

1 个答案:

答案 0 :(得分:0)

可能有点晚了,但是: 可以在代码中找到 qmake 所做的事情并且确实非常清晰:https://github.com/qt/qtbase/blob/5.15.2/mkspecs/features/lrelease.prf

当您检查构建目录时,很明显 qmake 会生成一个名为 qmake_<resource list name>.qrc 的文件——在本例中为 qmake_qmake_qm_files.qrc --,然后将其添加到 RESOURCES 列表中。

对于 cmake,我个人的解决方案是这样的(你可能想想出一些更漂亮的东西):

  set(qmDir "${CMAKE_CURRENT_BINARY_DIR}/.qm")
  file(MAKE_DIRECTORY ${qmDir})

  file(GLOB_RECURSE translationFiles *.ts)
  set_source_files_properties(${translationFiles} PROPERTIES OUTPUT_LOCATION ${qmDir})
  qt5_create_translation(qmFileList ${translationFiles})

  set(qmResourcesFile "${qmDir}/${resourceFileName}.qrc")
  file(WRITE ${qmResourcesFile} "<!DOCTYPE RCC><RCC version=\"1.0\">\n  <qresource prefix=\"i18n\">\n")

  foreach(qm_file ${qmFileList})
    file(RELATIVE_PATH qm_filename ${qmDir} ${qm_file})
    file(APPEND ${qmResourcesFile} "    <file alias=\"${qm_filename}\">${qm_file}</file>\n")
  endforeach(qm_file)

  file(APPEND ${qmResourcesFile} "  </qresource>\n</RCC>\n")

然后使用 qt5_add_resourcesqmResourcesFile 添加到您的来源。