如何将QT国际化集成到CMake中?

19

大家好,

我正在尝试在CMake中使用QT国际化。 我已经按照以下方式配置了我的CMake文件:

#Internalization - this should generate core_jp.ts ?
SET(rinzo_core_TRANSLATIONS
   i18n/core_jp.ts
   )

#these are my source files in the project
SET(FILES_TO_TRANSLATE
   ${rinzo_core_srcs} 
   ${rinzo_core_moh_srcs}
 )

QT4_CREATE_TRANSLATION(QM_FILES ${FILES_TO_TRANSLATE} ${rinzo_core_TRANSLATIONS})
QT4_ADD_TRANSLATION(QM ${rinzo_core_TRANSLATIONS})

但它没有生成任何TS或QM文件。

我的问题 -

1. CMake(使用QT工具)是否自动生成TS文件,从源代码中提取“tr()”方法?(这意味着我不必创建任何TS文件,上面的i18n / core_jp.ts将自动生成)

2. QM文件到底是什么?

先行致谢。


根据http://www.itk.org/Wiki/CMake:How_To_Build_Qt4_Software的说明,翻译二进制文件(*.qm)。 - Roman A. Taycher
4个回答

8
CMake 文档中查看 QT4_CREATE_TRANSLATIONQT4_ADD_TRANSLATION 宏。
因此,您应该执行以下操作:
SET(Lang_files
  example.ts
)
...
QT4_CREATE_TRANSLATION(LangSrcs ${Lang_files})
...
ADD_EXECUTABLE(project_name ... others sources ... ${LangSrcs})

当我这样做时,我得到了以下错误:在src/CMakeLists.txt的第44行(add_executable)出现CMake错误: 无法找到源文件:/home/panzi/software/qjoypad/qjoypad/build-locale/qjoypad_de.qm尝试使用扩展名.c .C .c++ .cc .cpp .cxx .m .M .mm .h .hh .h++ .hm .hpp .hxx .in .txx - panzi

4
我的解决方案依赖手动调用lupdate和lrelease工具,通过add_custom_target添加目标,因此生成的文件不会在make clean时被删除并放置在源代码目录中。
我定义了一个函数来扫描提供的目录,生成/更新ts文件,并将它们编译成qm文件放在同一目录下,这样它们可以通过.qrc文件添加到应用程序中。
cmake_minimum_required(VERSION 3.5)

project(l10n LANGUAGES CXX)
find_package(Qt5 COMPONENTS Core LinguistTools REQUIRED)

# genearats ts and qm file searching recursively SRC_DIR
function(generate_translations CUSTOM_TARGET TS_DIR TS_FILES SRC_DIR)
    set(UPADTE_TS_TARGET_NAME ${CUSTOM_TARGET}_ts)
    set(UPADTE_QM_TARGET_NAME ${CUSTOM_TARGET}_qm)

    add_custom_target(${UPADTE_TS_TARGET_NAME}
        COMMAND ${Qt5_LUPDATE_EXECUTABLE} -recursive ${SRC_DIR} -ts ${TS_FILES}
        WORKING_DIRECTORY ${TS_DIR})

    add_custom_target(${UPADTE_QM_TARGET_NAME}
        COMMAND ${Qt5_LRELEASE_EXECUTABLE} ${TS_FILES}
        WORKING_DIRECTORY ${TS_DIR})

    add_dependencies(${UPADTE_QM_TARGET_NAME} ${UPADTE_TS_TARGET_NAME} )
    add_dependencies(${CUSTOM_TARGET} ${UPADTE_QM_TARGET_NAME})
endfunction()

add_executable(l10n main.cxx)

target_link_libraries(l10n Qt5::Core)

set(MY_TS_DIR ${CMAKE_CURRENT_SOURCE_DIR}/translate)
set(MY_TS_FILES foo_en.ts foo_en.ts)
set(MY_SOURCE_LOOKUP_DIR ${CMAKE_CURRENT_SOURCE_DIR})

generate_translations(l10n "${MY_TS_DIR}" "${MY_TS_FILES}" "${MY_SOURCE_LOOKUP_DIR}")

只是好奇...你还在使用Qt 3.5吗? :) - Ashika Umanga Umagiliya

4
根据http://itk.org/Wiki/CMake:How_To_Build_Qt4_Software翻译二进制文件(*.qm)
此外,还有来自该网站底部的内容。
Usage - Updating the .ts files

当您希望处理所有源文件(查找新文本以进行翻译)时,请配置CMake以打开UPDATE_TRANSLATIONS,然后制作您的项目。CMake将修改您SOURCE文件夹中的.ts文件,并生成.qm文件。警告:请注意,CMake将更新源.ts文件,这意味着如果执行make clean操作,它将删除您的源.ts文件!因此,尽快关闭UPDATE_TRANSLATIONS是一个好主意。

谢谢,我按照相同的步骤操作了,但是没有生成任何东西! - Ashika Umanga Umagiliya

0

你可以使用 qt/[qt_version]/[msvc|mingw|...]/bin/ 中的 lupdate.exe、linguist.exe 和 lrelease.exe 吗?

你可以这样使用它:

Usage:
    lupdate [options] [project-file]
    lupdate [options] [source-file|path]... -ts ts-files
Options:
    -help  Display this information and exit.
    -noobsolete
           Drop all obsolete strings.
    -extensions [,]...
           Process files with the given extensions only.
           The extension list must be separated with commas, not with whitespace.
           Default: 'ui,c,c++,cc,cpp,cxx,ch,h,h++,hh,hpp,hxx'.
    -pluralonly
           Only include plural form messages.
    -silent
           Do not explain what is being done.
    -version
           Display the version of lupdate and exit 

所以,[source-file|path] - 是你的选项,就像我想的那样。 尝试使用源文件名称列表来调用它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接