名称: qt-翻译工作流 描述: 设置Qt Linguist工作流,包含.ts文件、lupdate/lrelease集成和翻译管理 允许工具: 读取、写入、编辑、Bash、Glob、Grep 标签: [qt, i18n, 翻译, linguist, 本地化]
qt-翻译工作流
设置Qt Linguist翻译工作流,包含.ts文件和lrelease集成。此技能为Qt应用程序配置完整的国际化管道。
功能
- 配置lupdate进行字符串提取
- 设置.ts翻译文件
- 集成lrelease进行.qm编译
- 生成CMake翻译目标
- 配置复数形式处理
- 设置基于上下文的翻译
- 生成翻译状态报告
- 配置Qt Linguist项目文件
输入模式
{
"类型": "对象",
"属性": {
"项目路径": {
"类型": "字符串",
"描述": "Qt项目路径"
},
"语言": {
"类型": "数组",
"项目": { "类型": "字符串" },
"描述": "目标语言代码(例如:['de', 'fr', 'ja'])"
},
"源语言": {
"类型": "字符串",
"默认": "en",
"描述": "源语言代码"
},
"翻译目录": {
"类型": "字符串",
"默认": "translations"
},
"包含QML": {
"类型": "布尔值",
"默认": true
},
"复数形式": {
"类型": "布尔值",
"默认": true
},
"生成CMake": {
"类型": "布尔值",
"默认": true
}
},
"必需": ["项目路径", "语言"]
}
输出模式
{
"类型": "对象",
"属性": {
"成功": { "类型": "布尔值" },
"文件": {
"类型": "数组",
"项目": {
"类型": "对象",
"属性": {
"路径": { "类型": "字符串" },
"语言": { "类型": "字符串" },
"类型": { "枚举": ["ts", "qm", "cmake"] }
}
}
},
"命令": {
"类型": "对象",
"属性": {
"提取": { "类型": "字符串" },
"编译": { "类型": "字符串" }
}
}
},
"必需": ["成功"]
}
CMake集成
# CMakeLists.txt
find_package(Qt6 REQUIRED COMPONENTS LinguistTools)
set(TS_FILES
translations/myapp_de.ts
translations/myapp_fr.ts
translations/myapp_ja.ts
)
# 创建翻译目标
qt_add_translations(myapp
TS_FILES ${TS_FILES}
QM_FILES_OUTPUT_VARIABLE QM_FILES
LUPDATE_OPTIONS -no-obsolete -locations relative
LRELEASE_OPTIONS -compress
)
# 添加到资源
qt_add_resources(myapp "translations"
PREFIX "/translations"
FILES ${QM_FILES}
)
翻译文件结构
项目/
├── translations/
│ ├── myapp_de.ts
│ ├── myapp_fr.ts
│ ├── myapp_ja.ts
│ └── myapp_en.ts # 参考文件
├── src/
│ ├── main.cpp
│ └── mainwindow.cpp
└── qml/
└── main.qml
源代码设置
C++翻译
// mainwindow.cpp
#include <QCoreApplication>
MainWindow::MainWindow() {
// 简单翻译
setWindowTitle(tr("我的应用程序"));
// 带上下文
label->setText(QCoreApplication::translate("MainWindow", "欢迎"));
// 复数形式
QString message = tr("%n 个文件已选择", "", count);
// 带消歧义
QString open1 = tr("打开", "菜单项");
QString open2 = tr("打开", "窗口标题");
// 动态翻译
QString format = tr("你好,%1!");
label->setText(format.arg(userName));
}
// 启用重新翻译
void MainWindow::changeEvent(QEvent* event) {
if (event->type() == QEvent::LanguageChange) {
retranslateUi();
}
QMainWindow::changeEvent(event);
}
QML翻译
// main.qml
import QtQuick 2.15
Window {
title: qsTr("我的应用程序")
Text {
// 简单翻译
text: qsTr("欢迎使用本应用")
}
Text {
// 复数形式
text: qsTr("%n 个项目", "", itemCount)
}
Text {
// 带上下文
text: qsTranslate("设置页面", "语言")
}
}
翻译加载
// main.cpp
#include <QTranslator>
#include <QLocale>
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
// 加载系统区域设置
QTranslator translator;
const QStringList uiLanguages = QLocale::system().uiLanguages();
for (const QString &locale : uiLanguages) {
const QString baseName = "myapp_" + QLocale(locale).name();
if (translator.load(":/translations/" + baseName)) {
app.installTranslator(&translator);
break;
}
}
// 或加载特定语言
QTranslator germanTranslator;
if (germanTranslator.load(":/translations/myapp_de")) {
app.installTranslator(&germanTranslator);
}
return app.exec();
}
语言切换
class LanguageManager : public QObject {
Q_OBJECT
public:
void setLanguage(const QString& languageCode) {
// 移除旧翻译器
if (m_translator) {
qApp->removeTranslator(m_translator);
}
// 加载新翻译器
m_translator = new QTranslator(this);
QString path = QString(":/translations/myapp_%1").arg(languageCode);
if (m_translator->load(path)) {
qApp->installTranslator(m_translator);
emit languageChanged();
}
}
signals:
void languageChanged();
private:
QTranslator* m_translator = nullptr;
};
工作流命令
# 从源代码提取字符串
lupdate src/*.cpp qml/*.qml -ts translations/myapp_de.ts
# 带选项提取
lupdate -recursive -locations relative -no-obsolete \
src/ qml/ -ts translations/*.ts
# 编译翻译
lrelease translations/*.ts
# 在Qt Linguist中打开
linguist translations/myapp_de.ts
翻译状态报告
# 检查翻译完整性
lconvert -if ts -i translations/myapp_de.ts -of csv -o status.csv
# 自定义脚本报告状态
for file in translations/*.ts; do
total=$(grep -c '<source>' "$file")
translated=$(grep -c 'type="finished"' "$file")
echo "$file: $translated/$total 已翻译"
done
最佳实践
- 随处使用tr():标记所有用户可见字符串
- 提供上下文:使用消歧义注释
- 处理复数形式:使用%n和复数形式
- 使用QString::arg():用于动态内容
- 测试RTL语言:阿拉伯语、希伯来语支持
- 保持翻译更新:在CI中运行lupdate
相关技能
qt-cmake-project-generator- 项目设置desktop-i18n流程 - 完整i18n工作流docs-localization- 文档本地化
相关代理
qt-cpp-specialist- Qt实现localization-coordinator- 翻译管理