Qt自动化翻译ts文件
摘要:为解决大型多语言项目中手动翻译效率低下的问题,开发了一款自动化翻译工具。该工具能自动识别并翻译.ts文件内容,生成翻译后的文件,同时支持.ts文件与Excel格式相互转换,便于翻译对比。功能包括自动翻译、文件格式转换,显著提升翻译效率,适用于需要处理大量多语言资源的项目。
·
在大型项目,多语种国际化翻译,有时候几百个单词,光查找翻译都要一天,所以开发了这一款自动化工具,可以自动识别翻译,并生成翻译后的ts文件!!!,也可以生成Execl,做对比。
该项目可以翻译文件(.ts)和Excel文件的相互转换。


#include "TranslateWorker.h"
#include <QDebug>
#include <QThread>
TranslateWorker::TranslateWorker(QObject *parent)
: QObject(parent)
, m_pNetworkManager(new QNetworkAccessManager(this))
, m_pTranslateList(nullptr)
, m_pTimer(new QTimer(this))
, m_currentIndex(0)
{
connect(m_pNetworkManager, &QNetworkAccessManager::finished,
this, &TranslateWorker::onTranslateFinished);
connect(m_pTimer, &QTimer::timeout,
this, &TranslateWorker::onTranslateTimeout);
m_pTimer->setSingleShot(true);
}
TranslateWorker::~TranslateWorker()
{
}
void TranslateWorker::SetTranslateList(QList<TranslateModel>* pList)
{
m_pTranslateList = pList;
}
void TranslateWorker::setIDAndSecret(QString id, QString secret)
{
BAIDU_APP_ID = id;
BAIDU_APP_SECRET = secret;
}
bool TranslateWorker::BaiduTranslate(const QString& fromLang, const QString& toLang)
{
if (!m_pTranslateList || m_pTranslateList->isEmpty()) {
qDebug() << "翻译列表为空";
return false;
}
if (BAIDU_APP_ID == "your_baidu_app_id" || BAIDU_APP_SECRET == "your_baidu_app_secret") {
qDebug() << "请先配置百度翻译API的APP_ID和APP_SECRET";
emit translateError("请先配置百度翻译API的APP_ID和APP_SECRET");
return false;
}
m_fromLanguage = convertLanguageCode(fromLang);
m_toLanguage = convertLanguageCode(toLang);
m_currentIndex = 0;
qDebug() << "开始百度翻译,总数:" << m_pTranslateList->size();
translateNext();
return true;
}
QString TranslateWorker::generateBaiduSign(const QString& query, const QString& salt)
{
QString signStr = BAIDU_APP_ID + query + salt + BAIDU_APP_SECRET;
QByteArray hash = QCryptographicHash::hash(signStr.toUtf8(), QCryptographicHash::Md5);
return hash.toHex();
}
QString TranslateWorker::convertLanguageCode(const QString& originalCode)
{
// 百度翻译语言代码映射
static QMap<QString, QString> languageMap = {
{"auto", "auto"}, // 自动检测
{"zh-CHS", "zh"}, // 中文简体
{"zh-CHT", "cht"}, // 中文繁体
{"en", "en"}, // 英语
{"ja", "jp"}, // 日语
{"ko", "kor"}, // 韩语
{"fr", "fra"}, // 法语
{"de", "de"}, // 德语
{"es", "spa"}, // 西班牙语
{"ru", "ru"}, // 俄语
{"th", "th"}, // 泰语
{"ar", "ara"}, // 阿拉伯语
{"pt", "pt"}, // 葡萄牙语
{"it", "it"}, // 意大利语
{"el", "el"}, // 希腊语
{"nl", "nl"}, // 荷兰语
{"pl", "pl"}, // 波兰语
{"bg", "bul"}, // 保加利亚语
{"et", "est"}, // 爱沙尼亚语
{"da", "dan"}, // 丹麦语
{"fi", "fin"}, // 芬兰语
{"cs", "cs"}, // 捷克语
{"ro", "rom"}, // 罗马尼亚语
{"sl", "slo"}, // 斯洛文尼亚语
{"sv", "swe"}, // 瑞典语
{"hu", "hu"}, // 匈牙利语
{"vi", "vie"} // 越南语
};
return languageMap.value(originalCode, originalCode);
}
void TranslateWorker::translateNext()
{
if (m_currentIndex >= m_pTranslateList->size()) {
qDebug() << "所有翻译完成";
emit translateCompleted();
return;
}
const TranslateModel& model = m_pTranslateList->at(m_currentIndex);
QString sourceText = model.GetSource();
if (sourceText.isEmpty()) {
qDebug() << "跳过空文本,索引:" << m_currentIndex;
m_currentIndex++;
QTimer::singleShot(100, this, &TranslateWorker::translateNext);
return;
}
// 生成请求参数
// 创建请求
// 发送请求
// 设置超时
// 发送进度信号
emit translateProgress(m_currentIndex + 1, m_pTranslateList->size());
}
void TranslateWorker::onTranslateTimeout()
{
qDebug() << "翻译请求超时";
emit translateError("翻译请求超时");
}
void TranslateWorker::resetTranslation()
{
m_currentIndex = 0;
m_pTimer->stop();
}
更多推荐




所有评论(0)