Qt翻译工作流Skill qt-translation-workflow

Qt翻译工作流技能专门用于配置和管理Qt应用程序的国际化(i18n)和本地化流程。该技能提供完整的Qt Linguist集成方案,包括字符串提取、翻译文件管理、多语言编译和CMake自动化配置。关键词:Qt国际化、Qt Linguist、.ts文件、lupdate、lrelease、多语言支持、本地化工作流、CMake翻译集成、Qt应用程序翻译、i18n自动化

前端开发 0 次安装 0 次浏览 更新于 2/25/2026

名称: 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

最佳实践

  1. 随处使用tr():标记所有用户可见字符串
  2. 提供上下文:使用消歧义注释
  3. 处理复数形式:使用%n和复数形式
  4. 使用QString::arg():用于动态内容
  5. 测试RTL语言:阿拉伯语、希伯来语支持
  6. 保持翻译更新:在CI中运行lupdate

相关技能

  • qt-cmake-project-generator - 项目设置
  • desktop-i18n 流程 - 完整i18n工作流
  • docs-localization - 文档本地化

相关代理

  • qt-cpp-specialist - Qt实现
  • localization-coordinator - 翻译管理