将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源数据转换指定的翻译数据再输出到指定文件。如:
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文件;
static QString convertContext(QList<QVariantMap> source, QString contextTitle, QString language)
  • system("lrelease *.ts")将当前目录下的ts文件转换为qm文件。

注意事项

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

源码

目录

Csv2Qm/
├── Csv2Qm.pro
├── Csv.cpp
├── Csv.h
├── main.cpp
└── translation.csv

main.cpp

#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!!!";elseqDebug()<<"Failed!!!";return 0;
}

Csv.cpp

#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

源码地址:

https://github.com/aeagean/Csv2Qm.git

发布QtCsv文件转语言翻译文件工具相关推荐

  1. c语言课件 文件,C语言课件--文件.ppt

    C语言课件--文件 例12-5 /*将字符串"apple", "grape", "pear" 写入到磁盘文件f12-5.txt中,然后再从该 ...

  2. c++ 读文件_C语言处理文件基础知识:文件、流和键盘输入

    文件是一块存储信息的存储器区域,可能这样说很多同学不理解,通俗来说,就是在磁盘上划分一块区域用于存放特定的数据,比如文本数据就是文本文件,音频数据就是音频文件.当然,文件夹也是一个特殊的文件.通常,文 ...

  3. c tcp服务器发送文件,c语言tcp文件传输

    c语言tcp文件传输 内容精选 换一换 第18节Linux网络管理入门本节所讲内容:18.1OSI七层模型和TCP/IP四层模型18.1.1OSI七层模型OSI七层模型是任何与网络相关的知识都无法跳过 ...

  4. c 怎么跨服务器取文件,c语言远程文件获取服务器

    c语言远程文件获取服务器 内容精选 换一换 用户可根据产品型号获取所需软件包以及数字签名文件.{version}表示软件版本号,{arch}表示CPU架构,{os}表示操作系统版本.{version} ...

  5. c语言延时头文件,c语言头文件大全

    ctype.h 字符处理函数: 本类别函数用于对单个字符进行处理,包括字符的类别测试和字符的大小写转换 ---------------------------------------- 字符测试是否字 ...

  6. 如何写一个C语言头文件,C语言头文件如何写?.doc

    C语言头文件如何写? 沃直植跑决争肾垮忧地留许腐榔锑舱黎徒礁锄税絮窟柑冀宴稼误萎蛛席脏衙鹏丢寇急院馋猎争城丫轨最懦患队巩并道嫉缘拉诵旭倘荫惭岩靛约瞥剑澳摈讶蕾沈蜜荧次侧抿两洛加悠馈射移淳敏凹肮复钡桑缮 ...

  7. c语言文件打开方式字符串,C语言打开文件-C语言打开文件的方式-C语言以只读方式打开文件-C语言以读写方式打开文件-嗨客网...

    C语言打开文件教程 在 在 C 语言中,打开文件使用 fopen C语言fopen函数详解 语法 FILE *fopen(char *filename, char *mode); 参数 参数 描述 f ...

  8. c语言中 文件,c语言中文件的使用方法

    c语言中文件的使用方法 一.文件指针的定义 FILE *fp//注意FILE的大写 二.文件的打开 fp=fopen("(路径)文件名.文件格式后缀","文件的使用方法& ...

  9. c语言字符型头文件,C语言头文件大全Word版

    <C语言头文件大全Word版>由会员分享,可在线阅读,更多相关<C语言头文件大全Word版(7页珍藏版)>请在人人文库网上搜索. 1.传播优秀Word版文档 ,希望对您有帮助, ...

  10. c语言写入运行不了文件,c语言写入文件 不能马上更新

    今天用c语言  写入一个文件发现  调用写入函数后    打开文件文件里面是空的.只有程序结束后或关闭指针后文件中的内容才能更新. 网上找了半天终于把问题解决了: 原来是C语言对文件的操作使用了文件缓 ...

最新文章

  1. Linux Kernel TCP/IP Stack — L2 Layer — Linux Bridge(虚拟网桥)
  2. fir fpga 不同截止频率_【通信篇】带你认识FIR滤波器
  3. 提升vector性能的几个技巧
  4. 【Linux系统编程应用】 Linux Input子系统(一)
  5. python下载微信公众号文章_python如何导出微信公众号文章
  6. excel有的单元文字可以超出单元格_excel单元格斜线
  7. web自动化如何在不同浏览器运行_如何给树莓派搭建WEB开发运行环境之JAVA篇
  8. python微控制器编程从零开始下载_Python微控制器编程从零开始(使用MicroPython)...
  9. 函数__内置函数(reversed,slice,format,ord,chr,ascii,repr)递归,迭代,二分法
  10. 仓储系统流程图_有效的仓储物流管理的6个重要提示
  11. 52.网络参数管理者: DHCP
  12. MASK RCNN在tensorflow 2.5中运行
  13. vs生成解决方案默认路径_交换网络防环协议——STP生成树,太阁实验栈
  14. 蓝桥杯真题:k倍区间
  15. 安装MathType及使用
  16. CentOS7 时间与网络时间同步
  17. ER图(实体联系图)
  18. 斗兽棋 java_GitHub - java-a/project1: 基于命令行的斗兽棋
  19. 2022考研数学 张宇 基础班【配套张宇30讲】【免费分享】
  20. MySQL必知必会5

热门文章

  1. 内网使用Maven本地仓库环境
  2. 企业微信如何借助企客加运营私域流量的策略
  3. 明解C语言(入门篇)第十一章
  4. Vue之解析PSD文件(文字)
  5. 微信小程序云开发入门详细教程
  6. matlab实现机器学习算法-回归分析
  7. Nordic nRF52840实战学习--使用nRF52840开发板抓蓝牙数据包
  8. latex编译pdf winedt_XeLaTeX及WinEdt6.0入门指南资料.pdf
  9. Java通过图片URL把图片上传到本地服务器
  10. 432考研_贾俊平《统计学》第1章 导论思维导图