前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >发布QtCsv文件转语言翻译文件工具

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

作者头像
Qt君
发布2019-07-15 15:36:45
9890
发布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!!!";
    else
        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));
        }

        data.append(item);
    }

    return data;
}

translation.csv 文件

key

zh_CN

en

start

开始

Start

end

结束

End

open

打开

Open

close

关闭

Close

源码地址:

代码语言:javascript
复制
https://github.com/aeagean/Csv2Qm.git
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-02-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Qt君 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 直接生成qm文件的工具
  • 实现
  • 注意事项
  • 源码
相关产品与服务
文件存储
文件存储(Cloud File Storage,CFS)为您提供安全可靠、可扩展的共享文件存储服务。文件存储可与腾讯云服务器、容器服务、批量计算等服务搭配使用,为多个计算节点提供容量和性能可弹性扩展的高性能共享存储。腾讯云文件存储的管理界面简单、易使用,可实现对现有应用的无缝集成;按实际用量付费,为您节约成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档