【问题标题】:How to integrate QT internationalization to CMake?如何将 QT 国际化集成到 CMake?
【发布时间】:2011-08-03 13:29:58
【问题描述】:

大家好,

我正在尝试将 QT 国际化与 CMake 结合使用。 我已将我的 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工具)是否会自动从源代码中提取“tr()”方法生成TS文件? (这意味着我不必创建任何 TS 文件,并且 i18n/core_jp.ts 以上会自动生成)

2.QM 文件到底是什么?

提前致谢

【问题讨论】:

标签: c++ qt internationalization qt4 cmake


【解决方案1】:

在 CMake 文档中,请参阅 QT4_CREATE_TRANSLATION 和 QT4_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
【解决方案2】:

根据http://itk.org/Wiki/CMake:How_To_Build_Qt4_Software翻译二进制文件(*.qm)

也来自该网站的底部

Usage - Updating the .ts files

当您希望它处理您的所有 源文件(寻找新的文本 翻译),配置cmake开启 UPDATE_TRANSLATIONS,然后制作 你的项目。 CMake 将修改您的 .ts 文件在您的 SOURCE 文件夹中 除了生成 .qm 文件。 警告:请注意,CMake 将更新源 .ts 文件,这意味着如果 > 您执行 make clean,它将删除您的源 .ts 文件!!!因此,最好尽快关闭 UPDATE_TRANSLATIONS。

【讨论】:

  • 谢谢,我按照同样的程序,但没有生成任何东西!
【解决方案3】:

我的解决方案依赖于通过 add_custom_target 手动调用的 lupdate 和 lrelease 工具,因此生成的文件不会在 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 吗? :)
【解决方案4】:

你能使用来自 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] - 是你的选择,就像我想的那样。 尝试使用源文件名列表调用它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-28
    • 2014-01-03
    • 1970-01-01
    • 2016-11-28
    • 1970-01-01
    • 1970-01-01
    • 2011-11-29
    相关资源
    最近更新 更多