1

我想*.qm使用. 所有文件都使用/ /etc 约定命名。但是产生输出,只使用 basename 直到 first ,而不是最后一个。*.tsqt5_add_translation*.ts*.de_DE.ts*.fr_FR.tsqt5_add_translation.

不可能将选项传递给lrelease使用qt5_add_translation(QM_FILES "${PROJECT_NAME}.de_DE.ts" OPTIONS -qm "${PROJECT_NAME}.de_DE.qm")语法。

源文件的设置OUTPUT_NAME属性*.ts也不起作用:

set_source_files_properties(
    "${PROJECT_NAME}.de_DE.ts" PROPERTIES
    OUTPUT_LOCATION "${CMAKE_CURRENT_SOURCE_DIR}"
    OUTPUT_NAME "${PROJECT_NAME}.de_DE.qm"
    )

在这种情况下产生文件名仍然是"${PROJECT_NAME}.qm",不是"${PROJECT_NAME}.de_DE.qm"

如何覆盖生成*.qm文件的生成名称?

当然,我可以制作自定义命令并将其用于我的目的,但我更喜欢使用 ready qt5_add_translation

编辑:

看着/usr/local/Qt-5.9.2/lib/cmake/Qt5LinguistTools/Qt5LinguistToolsMacros.cmake我得出的结论,没有办法实现使用 ready to use 的期望qt5_add_translation,因为 usingget_filename_component(qm ${_abs_FILE} NAME_WE)获取文件名:

NAME_WE = 没有目录或最长扩展名的文件名

出于我的目的,需要使用组合(以获取带完整后缀的文件名),然后结合ABSOLUTE应用多次以提取不带最短扩展名的文件名。EXTNAME_WE

4

2 回答 2

1

我最终得到了以下自定义函数add_translation来替换qt5_add_translation

function(ADD_TRANSLATION _qm_files)
    foreach(_basename ${ARGN})
    set(qm "${CMAKE_CURRENT_SOURCE_DIR}/${_basename}.qm")
    add_custom_command(
        OUTPUT "${qm}"
        COMMAND "${Qt5_LRELEASE_EXECUTABLE}"
        ARGS -markuntranslated "Not translated!" -nounfinished -removeidentical -compress "${CMAKE_CURRENT_SOURCE_DIR}/${_basename}.ts" -qm "${qm}"
        DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/${_basename}.ts" VERBATIM
    )
    list(APPEND ${_qm_files} "${qm}")
    endforeach()
    set(${_qm_files} ${${_qm_files}} PARENT_SCOPE)
endfunction()

它接受*.ts文件的基本名称并生成结果*.qm文件列表:两者都在当前源目录中。

于 2017-12-18T07:36:04.470 回答
1

请升级到 Qt 5.9.4 或更新版本。名称中带有点的 .ts 文件的处理已在此处修复,另请参见https://bugreports.qt.io/browse/QTBUG-64317

于 2019-05-16T15:02:47.707 回答