我在使用 CMake 在 Qt6 应用程序中设置翻译文件时遇到问题。
我认为我的问题不限于 qml 文件,但我将在这里仅使用 qml 文件以使我的情况简单。
我正在开发一个带有子模块的项目来组织我的 cpp 和 qml 文件。
举个例子,假设我有一个名为
appTestLocalization
的根项目,其中包含一个 Main.qml
和一个模块 MyModule
,位于包含 MyModule
的目录 MyText.qml
中。qsTr()
。
我想向我的应用程序添加本地化,并按照 qt doc 添加一个 qt_add_translations(),就像根项目的 CMakeLists.txt 中的那样:
qt_add_translations(appTestLocalization TS_FILES i18n/lang_fr_FR.ts)
然后在 Qt Creator 中我执行
Ctrl+K
并运行 cm update_translations
(或 cm appTestLocalization_lupdate
但结果是相同的)
但是,生成的 ts 文件仅包含
qsTr
中的 Main.qml
。
所以我尝试像这样手动添加模块目录,但结果是相同的:
qt_add_translations(appTestLocalization
INCLUDE_DIRECTORIES
MyModule
TS_FILES
i18n/lang_fr_FR.ts)
我也尝试在模块的
CMakeLists.txt
中添加翻译:
qt_add_translations(mymodule TS_FILES ${CMAKE_SOURCE_DIR}/i18n/lang_fr_FR.ts)
但是它会覆盖根项目的翻译...
如何将模块文件添加到 Qt 翻译过程中?
编辑:
我知道我可以使用
SOURCE
参数添加我想要的文件,如下所示:
qt_add_translations(appTestLocalization
#SOURCES
Main.qml
MyModule/MyLabel.qml
TS_FILES
i18n/lang_fr_FR.ts
)
但这似乎是一种“错误”的方式,因为我们可以在多个模块中拥有很多文件。维护这将是一场噩梦,我想避免这种情况。
我也尝试将
-recursive
传递给 lupdate,尽管它应该是默认值,但它也不起作用:
qt_add_translations(appTestLocalization
LUPDATE_OPTIONS -recursive
TS_FILES
i18n/lang_fr_FR.ts
)
正如 @smr 所提到的,您可以扫描文件以递归翻译。这就是我们向由一堆模块构建的应用程序添加翻译的方式:
file(GLOB_RECURSE QML_SOURCES RELATIVE ${CMAKE_SOURCE_DIR} *.qml)
qt_add_translations(${EXECUTABLE_NAME} TS_FILES
${EXECUTABLE_NAME}_de_DE.ts
${EXECUTABLE_NAME}_en_EN.ts
SOURCES ${QML_SOURCES}
RESOURCE_PREFIX "/translations"
LUPDATE_OPTIONS -no-obsolete
)