别人做的网站不能用怎么办啊,我要制作网站,项目管理软件应用,wordpress中文链接目录
前言
实现步骤
1. 准备翻译文件
2. 翻译字符串
3.设置应用程序语言
cmake 构建方式
示例代码
总结
1. 使用 file(GLOB ...)
2. 引入其他资源文件
再次生成翻译文件
5. 手动更新和生成.qm文件
其他资源 前言
在当今全球化的软件开发环境中#xff0c;应用程…目录
前言
实现步骤
1. 准备翻译文件
2. 翻译字符串
3.设置应用程序语言
cmake 构建方式
示例代码
总结
1. 使用 file(GLOB ...)
2. 引入其他资源文件
再次生成翻译文件
5. 手动更新和生成.qm文件
其他资源 前言
在当今全球化的软件开发环境中应用程序的国际化i18n与本地化l10n能力已成为衡量其专业度和用户体验的重要标准之一。QT/QML作为一套强大的跨平台应用程序开发框架其内置的国际化支持机制使得开发者能够轻松地为应用添加多语言功能从而满足不同地域用户的语言需求。本文将深入探讨如何在QT/QML项目中实现中英文显示的国际化从基础概念到具体实施步骤帮助开发者构建出更加友好、包容的应用界面。
QT框架提供了完整的国际化支持包括字符串提取、翻译文件的创建与管理、以及运行时的动态加载等。QML作为QT用于构建用户界面的声明式语言也完全融入了这一国际化体系让开发者能以简洁高效的方式实现界面的多语言切换。
实现步骤
在QT/QML应用中实现国际化i18n以支持中英文显示主要涉及以下几个步骤
1. 准备翻译文件
创建翻译文件使用Qt Linguist工具QT自带的工具或手动创建.tsTranslation Source文件。通常为每种语言创建一个例如en.ts用于英语zh.ts用于中文。
提取字符串使用lupdate工具从源代码中提取可翻译的字符串到.ts文件中。这包括QML文件中的qsTr()或qsTranslate()包裹的文本。
2. 翻译字符串
翻译.ts文件使用Qt Linguist工具(QT自带)或其他翻译工具编辑.ts文件将英文字符串翻译成目标语言如中文。
编译.ts文件为.qm使用lrelease工具将翻译好的.ts文件编译为二进制的.qmQt Message File文件这是运行时加载的文件。
3.设置应用程序语言
动态切换语言可以通过修改QLocale或直接设置Application的语言来改变界面语言。
cmake 构建方式
生成Qt的ts翻译文件编辑CMakeLists.txt文件使用qt5_create_translation。
# 设置翻译源文件(.ts)的输出目录
#set(QML_FILES ${CMAKE_CURRENT_SOURCE_DIR}/source/qml/main.qml)
# 使用 file(GLOB ...) 获取所有 QML 文件
file(GLOB_RECURSE QML_FILES ${CMAKE_CURRENT_SOURCE_DIR}/source/qml/*.qml)
set(TS_FILES${CMAKE_CURRENT_BINARY_DIR}/translations/daemon_en_US.ts${CMAKE_CURRENT_BINARY_DIR}/translations/daemon_zh_CN.ts)# 关键
find_package(Qt5LinguistTools)
qt5_create_translation(QM_FILES ${QML_FILES} ${TS_FILES} OPTIONS -source-language en_US -no-obsolete)# 添加可执行文件
add_executable(${PROJECT_NAME} ${SOURCES} ${HEADERS} ${QML_FILES} ${QM_FILES})注意必须将 ${QM_FILES}加入到add_executable参数中才能在编译时生成只有原文的ts文件
ts文件会在“清除”或重新编译的时候一并被删除再编译的时候生成全新的ts原有的翻译会丢失万分注意!
示例代码
假设您的 C 代码如下
#include QGuiApplication
#include QQmlApplicationEngine
#include QTranslator
#include QLocale
#include QQmlContextint main(int argc, char *argv[])
{QGuiApplication app(argc, argv);// 创建翻译器对象QTranslator translator;// 初始化加载翻译文件默认载入英文translator.load(:/translations/daemon_en_US.qm);app.installTranslator(translator);QQmlApplicationEngine engine;// 将翻译器对象设置到 QML 上下文环境中engine.rootContext()-setContextProperty(translator, translator);engine.load(QUrl(QStringLiteral(qrc:/source/qml/main.qml)));return app.exec();
}在 QML 文件中假设您有如下内容
import QtQuick 2.12
import QtQuick.Controls 2.12ApplicationWindow {visible: truewidth: 640height: 480title: qsTr(Hello World)Column {anchors.centerIn: parentspacing: 20Text {id: labeltext: qsTr(This is a text)}Button {text: Switch to ChineseonClicked: {// 动态切换到中文if (translator.load(:/translations/daemon_zh_CN.qm)) {Qt.application.installTranslator(translator);label.text qsTr(This is a text); // 触发翻译更新}}}Button {text: Switch to EnglishonClicked: {// 动态切换到英文if (translator.load(:/translations/daemon_en_US.qm)) {Qt.application.installTranslator(translator);label.text qsTr(This is a text); // 触发翻译更新}}}}
}在这个例子中通过 engine.rootContext()-setContextProperty(translator, translator); 这一行代码QML 中的 translator 对象和 C 中的翻译器对象关联起来使得 QML 中能够调用 C 的方法来动态加载翻译文件并自动更新界面显示的语言。
总结
通过将翻译器对象设置为 QML 上下文的属性可以在 QML 中调用 translator 对象的函数实现动态加载和切换翻译文件的功能从而满足多语言动态切换的需求。
其中 engine.rootContext()-setContextProperty(translator, translator); 的主要作用是将 C 对象暴露给 QML以便在 QML 中直接使用和操控这个对象使得多语言支持更具灵活性和动态性。
以下是一个将QML文件夹下的所有QML文件引入到CMakeLists.txt中的方法
1. 使用 file(GLOB ...)
file(GLOB ...) 可以递归地获取指定目录下的所有符合条件的文件。这种方法非常灵活适用于需要引入一组文件的场景。
cmake_minimum_required(VERSION 3.12)project(daemon VERSION 1.0)set(CMAKE_CXX_STANDARD 11)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_AUTOUIC ON)find_package(Qt5 COMPONENTS Core Quick LinguistTools REQUIRED)# 设置源文件和头文件
set(SOURCESmain.cppsource/cpp/myclass.cpp
)set(HEADERSsource/cpp/myclass.h
)# 使用 file(GLOB ...) 获取所有 QML 文件
file(GLOB_RECURSE QML_FILES ${CMAKE_CURRENT_SOURCE_DIR}/source/qml/*.qml)# 设置翻译文件
set(TS_FILES${CMAKE_CURRENT_SOURCE_DIR}/translations/daemon_en_US.ts${CMAKE_CURRENT_SOURCE_DIR}/translations/daemon_zh_CN.ts
)# 创建翻译文件
qt5_create_translation(QM_FILES TS_FILES ${TS_FILES} QML_FILES ${QML_FILES})# 添加可执行文件
add_executable(${PROJECT_NAME} ${SOURCES} ${HEADERS} ${QML_FILES} ${QM_FILES})# 链接Qt库
target_link_libraries(${PROJECT_NAME} Qt5::Core Qt5::Quick)在这个示例中
file(GLOB_RECURSE QML_FILES ${CMAKE_CURRENT_SOURCE_DIR}/source/qml/*.qml)这一步使用通配符*.qml来递归获取source/qml目录下的所有QML文件并将结果存储到QML_FILES变量中。剩余的CMake配置保留了引入其他源文件和头文件以及Qt翻译文件的生成和处理。
2. 引入其他资源文件
如果您的QML项目中还有其他类型的资源文件如图像文件、.js文件等也可以使用类似的方法引入
# 引入图像资源文件
file(GLOB_RECURSE IMAGE_FILES ${CMAKE_CURRENT_SOURCE_DIR}/source/images/*)# 引入JavaScript文件
file(GLOB_RECURSE JS_FILES ${CMAKE_CURRENT_SOURCE_DIR}/source/js/*.js)将这些文件添加到目标中
add_executable(${PROJECT_NAME} ${SOURCES} ${HEADERS} ${QML_FILES} ${QM_FILES} ${IMAGE_FILES} ${JS_FILES})通过这种方式可以灵活地管理和组织项目中的各种资源文件简化CMake配置确保正确引入所有需要的文件。
再次生成翻译文件
确保您的.ts文件已正确配置并包含在项目中。尝试手动运行lupdate命令并查看输出
cd path_to_your_project
lupdate source/qml/*.qml source/cpp/*.cpp -ts translations/daemon_en_US.ts translations/daemon_zh_CN.ts然后使用linguist工具打开.ts文件确认其中是否包含待翻译文本
linguist translations/daemon_zh_CN.ts5. 手动更新和生成.qm文件
如果依旧遇到问题可以尝试手动更新ts文件并生成qm文件以确保流程正确
# 手动更新 TS 文件
lupdate source/qml/*.qml source/cpp/*.cpp -ts translations/daemon_en_US.ts translations/daemon_zh_CN.ts# 使用Qt Linguist工具编辑并保存 TS 文件
linguist translations/daemon_en_US.ts
linguist translations/daemon_zh_CN.ts# 手动生成 QM 文件
lrelease translations/daemon_en_US.ts
lrelease translations/daemon_zh_CN.ts在以上步骤中验证所有QML和C文件中确实包含带有qsTr()或tr()的翻译标记并确认lupdate和lrelease工具的路径和执行是否正确。如果所有步骤正确完成生成的.qm文件会包含预期的翻译数据。
注意
lupdate工具本身不会自动进行翻译。它的主要功能是从源代码和QML文件中提取出所有标记为需要翻译的字符串并生成或更新.ts文件。这些.ts文件是XML格式的翻译源文件其中包含了需要翻译的原始字符串及其上下文信息但并不会包含任何自动生成的翻译。
生成的.ts文件中所有翻译项最初都是未翻译状态开发人员或翻译人员需要手动使用Qt Linguist工具为每个字符串提供翻译。
对于QML中的文本应该使用qsTr()函数来包裹那些需要翻译的字符串。例如
Text {text: qsTr(Hello, World!)}
在C代码中你应该使用tr()宏来标记需要翻译的字符串。例如
QString message tr(Welcome to the application.);
确保所有的用户可见的字符串都通过tr()进行了包裹。这包括但不限于对话框消息、菜单项、按钮标签等。
避免在代码逻辑中使用硬编码的字符串无论是QML还是C都应该避免直接在逻辑处理中使用未经qsTr()或tr()处理的字符串。如果字符串中包含变量或需要格式化的地方使用占位符如C中的arg()方法或QML中的字符串插值并确保翻译时考虑这些变量的存在。
qsTr()和tr()是分别在QML和C中进行国际化的基本手段通过它们确保字符串可以被翻译工具识别并处理。
总结
lupdate 提取源字符串并生成 .ts 文件不会自动翻译。使用 linguist 工具手动翻译 .ts 文件内容。使用 lrelease 生成 .qm 文件以供应用程序使用。
通过这个流程您可以管理和使用Qt项目中的翻译文件实现应用程序的多语言支持。
其他资源
https://www.cnblogs.com/Paoyao/p/15752116.html
https://zhuanlan.zhihu.com/p/379477970
配置CLion管理Qt项目国际化支持的方法_C 语言_脚本之家
Qt之Qml 国际化—实现简易语言切换功能_qml 中英文切换-CSDN博客
Qt / Qml 中支持多国语言_qml 多语言-CSDN博客