相关文章推荐
道上混的滑板  ·  在亚行logcat输出中,在Android上 ...·  2 月前    · 
冲动的登山鞋  ·  【Qt之JSON文件】QJsonDocume ...·  1 月前    · 
含蓄的斑马  ·  QT中获取选中的radioButton的两种 ...·  1 周前    · 
干练的炒粉  ·  QComboBox ...·  1 周前    · 
豪爽的金针菇  ·  WorksheetFunction.Tran ...·  4 周前    · 
没有腹肌的八宝粥  ·  vtk文件与vtu文件区别-CSDN博客·  1 年前    · 
鼻子大的杨桃  ·  『Android』Handler实现循环定时 ...·  1 年前    · 
没有腹肌的鞭炮  ·  1月17日上市公司晚间公告速递_上市公司_交 ...·  2 年前    · 
爱健身的马铃薯  ·  懂算法才能打“算法战” - 中华人民共和国国防部·  2 年前    · 
Code  ›  发布QtCsv文件转语言翻译文件工具开发者社区
csv 语言翻译 qstring
https://cloud.tencent.com/developer/article/1463205
很拉风的水煮肉
9 月前
Qt君

发布QtCsv文件转语言翻译文件工具

前往小程序,Get 更优 阅读体验!
立即前往
腾讯云
开发者社区
文档 建议反馈 控制台
首页
学习
活动
专区
工具
TVP
最新优惠活动
文章/答案/技术大牛
发布
首页
学习
活动
专区
工具
TVP 最新优惠活动
返回腾讯云官网
Qt君
首页
学习
活动
专区
工具
TVP 最新优惠活动
返回腾讯云官网
社区首页 > 专栏 > 发布QtCsv文件转语言翻译文件工具

发布QtCsv文件转语言翻译文件工具

作者头像
Qt君
发布 于 2019-07-15 15:36:45
1K 0
发布 于 2019-07-15 15:36:45
举报
文章被收录于专栏: 跟Qt君学编程

将Csv格式文件转换为qm翻译文件,中间无需干预手动干预ts文件即可完成翻译文件的制作。

直接生成qm文件的工具

  1. 我们做Qt翻译文件时候一般使用 lupdate xx.pro 生成ts文件,再根据翻译使用Qt Linguist Manual工具修改ts后再使用 lrelease*.ts 生成对应的qm文件。这一过程略显繁琐,作者的本意是简化该流程并能提供一个通用的翻译文本格式(csv)给翻译人员使用;
  2. 本工具是通过csv翻译文件翻译到qm文件的工具,简单易用;
  3. 文尾附部分源码与源码地址。

实现

  • Csv解析实现使用 QList<QVariantMap>Csv::readAll(); 接口解析csv格式,每一行的Csv格式数据为一个QList的item项,QVariantMap为第一行的标题与值的匹配;
  • Csv标题格式的定义,第一行的第一列固定为key值(该值为程序tr所应用的值),第一行的第二列至后都是语言的对应翻译。如:

key

zh_CN

en

start

开始

Start

end

结束

End

  • convert主要作用是将csv源数据转换指定的翻译数据再输出到指定文件。如:
代码语言: javascript
复制
static bool convert(QList<QVariantMap> source, QString language, QString outputFile)
convert(csvContexts, "zh_CN", "zh_CN.ts"); //将zh_CN列翻译转换为zh_CN.ts文件
convert(csvContexts, "en", "en.ts"); //将en列翻译转换为en.ts文件
  • convertContext主要作用为指定格式的ts文件;
代码语言: javascript
复制
static QString convertContext(QList<QVariantMap> source, QString contextTitle, QString language)
  • system("lrelease *.ts") 将当前目录下的ts文件转换为qm文件。

注意事项

  • 当文件转换不成功需要查看translation.csv文件是否为空。

源码

目录

代码语言: javascript
复制
Csv2Qm/
├── Csv2Qm.pro
├── Csv.cpp
├── Csv.h
├── main.cpp
└── translation.csv

main.cpp

代码语言: javascript
复制
#include "Csv.h"
#include <QCoreApplication>
#include <QJsonDocument>
#include <QFile>
#include <QDebug>
const QStringList Languages = {
    "zh_CN", "en"
static QString convertContext(QList<QVariantMap> source, QString contextTitle, QString language)
    QString context = QString("<context>\n");
    context += QString("\t<name>%1</name>\n").arg(contextTitle);
    for (int i = 0; i < source.count(); i++) {
        QVariantMap item;
        item["source"] = source.at(i).value("key").toString();
        if (Languages.contains(language)) {
            item["translation"] = source.at(i).value(language).toString();
        else {
            qDebug()<<"Failed!!!";
            exit(-1);
        context += QString("\t<message>\n\t\t<source>%1</source>\n\t\t<translation>%2</translation>\n\t</message>\n")
                    .arg(item["source"].toString())
                    .arg(item["translation"].toString());
    context += QString("</context>\n");
    return context;
static bool convert(QList<QVariantMap> source, QString language, QString outputFile)
    QString head = QString("<?xml version=\"1.0\" encoding=\"utf-8\"?>\n") +
        QString("<!DOCTYPE TS>\n") +
        QString("<TS version=\"2.0\" language=\"%1\">\n").arg(language);
    QString content;
    content += convertContext(source, "QObject", language);
    QString tail = QString("</TS>");
    QString result = head + content + tail;
    QFile file(outputFile);
    file.open(QFile::WriteOnly);
    file.write(result.toUtf8());
    file.close();
int main(int argc, char *argv[])
    QString file = "translation.csv";
    if (argc == 2) {
        file = argv[1];
    Csv csvor;
    csvor.open(file);
    QList<QVariantMap> csvContexts = csvor.readAll();
    if (csvContexts.isEmpty()) {
        qDebug()<<"csvContexts Failed!!!";
        return -1;
    convert(csvContexts, "zh_CN", "zh_CN.ts");
    convert(csvContexts, "en", "en.ts");
    if (system("lrelease *.ts") == 0)
        qDebug()<<"Success!!!";
        qDebug()<<"Failed!!!";
    return 0;
}

Csv.cpp

代码语言: javascript
复制
#include "Csv.h"
#include <QStringList>
#include <QDebug>
Csv::Csv()
bool Csv::open(const QString &fileName)
    m_file = new QFile(fileName);
    if (!m_file->open(QIODevice::ReadWrite)) {
        qDebug()<<"[error] "<<QString("Open %1 file failed!").arg(fileName);
        return false;
    else {
        return true;
QList<QVariantMap> Csv::readAll()
    QList<QVariantMap> data;
    if (m_file == NULL)
        return data;
    bool isFirstLine = true;
    QStringList titles;
    while (!m_file->atEnd()) {
        QByteArray line = m_file->readLine();
        QStringList contents = QString::fromLocal8Bit(line)
                               .simplified()
                               .split(',', QString::SkipEmptyParts);
        if (isFirstLine) {
            isFirstLine = false;
            titles = contents;
            continue;
        QVariantMap item;
        for (int i = 0; i < contents.count(); i++) {
            if (i >= titles.count())
                continue;
            item.insert(item.find(titles[i]), titles[i], contents.at(i));
 
推荐文章
道上混的滑板  ·  在亚行logcat输出中,在Android上查看Qt应用程序日志记录的最简单方法是什么?开发者社区
2 月前
冲动的登山鞋  ·  【Qt之JSON文件】QJsonDocument、QJsonObject、QJsonArray等类介绍及使用 - FBshark
1 月前
含蓄的斑马  ·  QT中获取选中的radioButton的两种方法 - 24K纯开源
1 周前
干练的炒粉  ·  QComboBox 设置选中的item_c++ qt combox additem所添加的项的索引位置
1 周前
豪爽的金针菇  ·  WorksheetFunction.Transpose 方法 (Excel) | Microsoft Learn
4 周前
没有腹肌的八宝粥  ·  vtk文件与vtu文件区别-CSDN博客
1 年前
鼻子大的杨桃  ·  『Android』Handler实现循环定时及其他定时、延时方式实现 - 简书
1 年前
没有腹肌的鞭炮  ·  1月17日上市公司晚间公告速递_上市公司_交易提示_新浪财经_新浪网
2 年前
爱健身的马铃薯  ·  懂算法才能打“算法战” - 中华人民共和国国防部
2 年前
今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
删除内容请联系邮箱 2879853325@qq.com
Code - 代码工具平台
© 2024 ~ 沪ICP备11025650号