ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Qt - Linguist语言家

2022-07-17 10:00:59  阅读:214  来源: 互联网

标签:翻译 en Qt tr 西班牙语 ar Linguist es 语言


Qt Linguist

简介

Qt提供了一款优秀的支持Qt C++和Qt Quick应用程序的翻译工具。发布者、翻译者和开发者可以使用这款工具来完成他们的任务。

发布者:承担了全面发布应用程序的责任。通常,他们协调开发者和翻译者的工作,可以使用lupdate工具同步源代码,进行翻译,使用lrelease同步工具为发布应用程序创建运行时使用的翻译文件。

翻译者:可以使用Qt Linguist工具翻译应用程序的文本。当然,这必须要有专业的翻译知识。

开发者:必须创建Qt应用程序能够使用的翻译文本。也应该帮助翻译者识别短语出现的场景。

以上有三种角色-发布者、翻译者、开发者,当然很多情况下,其实就是一种,那就是程序猿自己,大家都懂的。

使用流程

1,使用tr包裹字符串

如果想让你的程序实现国际化,那么就在用户所有可见的字符串处都使用QObject::tr()。

[static] QString QObject::tr(const char *sourceText, const char *disambiguation = nullptr, int n = -1)

2,修改pro文件

在.pro文件中添加翻译文件名称。

TRANSLATIONS += translations/zh_CN.ts \   /*中文翻译文件*/
                translations/en.ts        /*英文翻译文件*/

3,生成翻译文件

点击 菜单栏->工具->外部->Qt语言家->更新翻译(lupdae),此时会在translations目录下面生成zh_CN.ts和en.ts两个文件。

4,打开翻译文件,并翻译

4.1 修改xml,翻译

ts文件实际上是一个xml文件,直接可以用文本编辑器打开。

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1" language="en">                            <!-- 版本和语言 -->
<context>
    <name>MainWindow</name>
    <message>
        <location filename="../mainwindow.ui" line="14"/>   <!-- 文本位置-->
        <source>MainWindow</source>                         <!-- 源文本-->
        <translatorcomment>title</translatorcomment>        <!-- 注释 -->
        <translation>Maye</translation>                     <!-- 翻译文本 -->
    </message>
    <message>
        <location filename="../mainwindow.ui" line="27"/>
        <source>用户名</source>
        <translation>username</translation>
    </message>
    <message>
        <location filename="../mainwindow.ui" line="40"/>
        <source>密码</source>
        <translation>password</translation>
    </message>
    <message>
        <location filename="../mainwindow.ui" line="73"/>
        <source>登录</source>
        <translation>login</translation>
    </message>
    <message>
        <location filename="../mainwindow.ui" line="86"/>
        <source>注册</source>
        <translation>register</translation>
    </message>
    <message>
        <location filename="../mainwindow.ui" line="100"/>
        <source>中文</source>
        <translation>chinese</translation>
    </message>
    <message>
        <location filename="../mainwindow.ui" line="105"/>
        <source>英文</source>
        <translation type="unfinished">English</translation>
    </message>
    <message>
        <location filename="../mainwindow.ui" line="119"/>
        <source>语言</source>
        <translation type="unfinished">language</translation>
    </message>
</context>
</TS>
​

4.1 使用语言家翻译

找到Linguist预言家打开,点击菜单栏->文件->打开,选择上面生成的.ts文件,并打开。

打开之后可以看到如下界面,主要就是对语言进行翻译。

翻译前面的图标及含义:

图标 含义

未翻译

已翻译,未标记完成

已翻译,且已标记完成

 

4.2 使用短语书让翻译变得更快捷

短语书就是一个提前写好的翻译对照文件,在翻译ts文件的时候,可以打开短语书,很方便的就可以看到翻译。

1. 新建短语书

然后把需要的翻译提前写好,以后也可以重复使用。选择源语言和目标语言。

2. 编辑短语书

短语书创建完成之后,就可以开始编辑短语书了。

如下:先新建条目,再写上源文、译文、以及准确度(可以不写,也可以随便写点东西),最后点击保存,就可以关掉窗口了

3. 使用短语书

如果使用已经写好的短语书,而不是刚刚创建的,那么需要先打开短语书。如果是刚在预言家上创建的,则是打开状态的。

5,发布翻译

翻译完成之后,就可以发布翻译了,为什么要发布呢?发布是什么意思?

  • ts文件是文本文件,占用内存比较大,发布之后会生成对应的二进制文件,内存较小

  • 通过发布就可以把ts文件转换成二进制文件

发布的方式有两种:

  • 通过语言家发布

    • 点击 菜单栏->文件->发布全部即可发布所有ts文件

  • 通过Qt Creator发布

    • 点击 菜单栏->工具->外部->Qt语言家->发布翻译(lrelease),会在translations目录中生成zc_CN.qm和en.qm两个文件。

 

6,加载语言文件

QTranslator类为文本输出提供国际化支持。

该类的对象包含一组从源语言到目标语言的翻译。 QTranslator提供了在翻译文件中查找翻译的功能。 翻译文件使用Qt Linguist创建。

QTranslator translator;
if(translator.load("linguist_en.qm","F:\\MyCode\\QtCode\\Lingguist\\translate"))
{
      qApp->installTranslator(&translator);
      ui->retranslateUi(this);
}

注意:翻译文件加载的位置必须在界面实例化之前完成,否则是没有效果的.

7,动态切换语言

如果界面是通过Ui生成的,切换语言之后,可以通过调用函数retranslateUi翻译界面,否则需要重启程序.

  • 下拉框切换语言

void MainWindow::on_comboBox_currentIndexChanged(int index)
{
    QString filename;
    switch (index)
    {
    case 0:
        filename = "linguist_zh_CN.qm";      
        break;
    case 1:
        filename = "linguist_en.qm";
        break;
    }
    QTranslator translator;
    if(!translator.load(filename,"F:\\MyCode\\QtCode\\Lingguist\\translate"))
    {
        qDebug()<<"翻译文件加载失败";
        return;
    }
    if(qApp->installTranslator(&translator))
    {
        qDebug()<<"安装成功";
    }else
    {
        qDebug()<<"安装失败";
    }
    ui->retranslateUi(this);
}
  • 保存语言选择和恢复语言

保存

void MainWindow::on_comboBox_currentIndexChanged(int index)
{
    QString filename;
    switch (index)
    {
    case 0:
        filename = "linguist_zh_CN.qm";
        break;
    case 1:
        filename = "linguist_en.qm";
        break;
    }
    //保存配置
    QSettings setting("config.ini",QSettings::Format::IniFormat);
    setting.setValue("ts",filename);
    ...
}

恢复

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
​
    QSettings setting("config.ini",QSettings::Format::IniFormat);
    QString filename = setting.value("ts").toString();
​
    QTranslator translator;
    if(!translator.load(filename,"F:\\MyCode\\QtCode\\Lingguist\\translate"))
    {
        qDebug()<<"翻译文件加载失败";
    }
    if(qApp->installTranslator(&translator))
    {
        qDebug()<<"安装成功";
    }else
    {
        qDebug()<<"安装失败";
    }
​
    MainWindow w;
    w.show();
    return a.exec();
}
  • 重启程序

//重启程序才能生效,是否重启
auto ret = QMessageBox::information(this,"hit","是否重启",QMessageBox::StandardButton::Ok,QMessageBox::No);
if(ret == QMessageBox::Ok)
{
    QString exe =  QApplication::applicationDirPath()+"/"+qAppName()+".exe";
    QProcess::startDetached(exe);
    qApp->quit();
}

 

在论坛中漂,经常遇到有人遇到tr相关的问题。用tr的有两类人:

  • (1)因为发现中文老出问题,然后搜索,发现很多人用tr,于是他也开始用tr

  • (2)另一类人,确实是出于国际化的需要,将需要在界面上显示的文件都用tr包起来,这有分两种:

    • (2a) 用tr包住英文(最最推荐的用法,源码英文,然后提供英文到其他语言的翻译包)

    • (2b) 用tr包住中文(源码用中文,然后提供中文到其他语言的翻译包)

注意哦,如果你正在用tr包裹中文字符,却不属于(2b),那么:

  • 你在误用tr

  • 你需要的是QString,而不是tr

如果你确实属于(2b),请做好心理准备,你可能还会遇到很多困难,

tr 是做什么的?下面二者的区别是什么?

QString text1 = QObject::tr("hello"); 
QString text2 = QString("hello");

tr是用来实现国际化,如果你为这个程序提供了中文翻译包(其中hello被翻译成中文"你好"),那么text1的内容将是中文"你好";如果你为程序提供且使用日文翻译包,那么text1的内容将是日文。

tr是经过多级函数调用才实现了翻译操作,是有代价的,所以不该用的时候最好不要用。

各国语言代码和名称表

语言代码 语言名称
af 南非语
af-ZA 南非语
ar 阿拉伯语
ar-AE 阿拉伯语(阿联酋)
ar-BH 阿拉伯语(巴林)
ar-DZ 阿拉伯语(阿尔及利亚)
ar-EG 阿拉伯语(埃及)
ar-IQ 阿拉伯语(伊拉克)
ar-JO 阿拉伯语(约旦)
ar-KW 阿拉伯语(科威特)
ar-LB 阿拉伯语(黎巴嫩)
ar-LY 阿拉伯语(利比亚)
ar-MA 阿拉伯语(摩洛哥)
ar-OM 阿拉伯语(阿曼)
ar-QA 阿拉伯语(卡塔尔)
ar-SA 阿拉伯语(沙特阿拉伯)
ar-SY 阿拉伯语(叙利亚)
ar-TN 阿拉伯语(突尼斯)
ar-YE 阿拉伯语(也门)
az 阿塞拜疆语
az-AZ 阿塞拜疆语(拉丁文)
az-AZ 阿塞拜疆语(西里尔文)
be 比利时语
be-BY 比利时语
bg 保加利亚语
bg-BG 保加利亚语
bs-BA 波斯尼亚语(拉丁文,波斯尼亚和黑塞哥维那)
ca 加泰隆语
ca-ES 加泰隆语
cs 捷克语
cs-CZ 捷克语
cy 威尔士语
cy-GB 威尔士语
da 丹麦语
da-DK 丹麦语
de 德语
de-AT 德语(奥地利)
de-CH 德语(瑞士)
de-DE 德语(德国)
de-LI 德语(列支敦士登)
de-LU 德语(卢森堡)
dv 第维埃语
dv-MV 第维埃语
el 希腊语
el-GR 希腊语
en 英语
en-AU 英语(澳大利亚)
en-BZ 英语(伯利兹)
en-CA 英语(加拿大)
en-CB 英语(加勒比海)
en-GB 英语(英国)
en-IE 英语(爱尔兰)
en-JM 英语(牙买加)
en-NZ 英语(新西兰)
en-PH 英语(菲律宾)
en-TT 英语(特立尼达)
en-US 英语(美国)
en-ZA 英语(南非)
en-ZW 英语(津巴布韦)
eo 世界语
es 西班牙语
es-AR 西班牙语(阿根廷)
es-BO 西班牙语(玻利维亚)
es-CL 西班牙语(智利)
es-CO 西班牙语(哥伦比亚)
es-CR 西班牙语(哥斯达黎加)
es-DO 西班牙语(多米尼加共和国)
es-EC 西班牙语(厄瓜多尔)
es-ES 西班牙语(传统)
es-ES 西班牙语(国际)
es-GT 西班牙语(危地马拉)
es-HN 西班牙语(洪都拉斯)
es-MX 西班牙语(墨西哥)
es-NI 西班牙语(尼加拉瓜)
es-PA 西班牙语(巴拿马)
es-PE 西班牙语(秘鲁)
es-PR 西班牙语(波多黎各(美))
es-PY 西班牙语(巴拉圭)
es-SV 西班牙语(萨尔瓦多)
es-UY 西班牙语(乌拉圭)
es-VE 西班牙语(委内瑞拉)
et 爱沙尼亚语
et-EE 爱沙尼亚语
eu 巴士克语
eu-ES 巴士克语
fa 法斯语
fa-IR 法斯语
fi 芬兰语
fi-FI 芬兰语
fo 法罗语
fo-FO 法罗语
fr 法语
fr-BE 法语(比利时)
fr-CA 法语(加拿大)
fr-CH 法语(瑞士)
fr-FR 法语(法国)
fr-LU 法语(卢森堡)
fr-MC 法语(摩纳哥)
gl 加里西亚语
gl-ES 加里西亚语
gu 古吉拉特语
gu-IN 古吉拉特语
he 希伯来语
he-IL 希伯来语
hi 印地语
hi-IN 印地语
hr 克罗地亚语
hr-BA 克罗地亚语(波斯尼亚和黑塞哥维那)
hr-HR 克罗地亚语
hu 匈牙利语
hu-HU 匈牙利语
hy 亚美尼亚语
hy-AM 亚美尼亚语
id 印度尼西亚语
id-ID 印度尼西亚语
is 冰岛语
is-IS 冰岛语
it 意大利语
it-CH 意大利语(瑞士)
it-IT 意大利语(意大利)
ja 日语
ja-JP 日语
ka 格鲁吉亚语
ka-GE 格鲁吉亚语
kk 哈萨克语
kk-KZ 哈萨克语
kn 卡纳拉语
kn-IN 卡纳拉语
ko 朝鲜语
ko-KR 朝鲜语
kok 孔卡尼语
kok-IN 孔卡尼语
ky 吉尔吉斯语
ky-KG 吉尔吉斯语(西里尔文)
lt 立陶宛语
lt-LT 立陶宛语
lv 拉脱维亚语
lv-LV 拉脱维亚语
mi 毛利语
mi-NZ 毛利语
mk 马其顿语
mk-MK 马其顿语(FYROM)
mn 蒙古语
mn-MN 蒙古语(西里尔文)
mr 马拉地语
mr-IN 马拉地语
ms 马来语
ms-BN 马来语(文莱达鲁萨兰)
ms-MY 马来语(马来西亚)
mt 马耳他语
mt-MT 马耳他语
nb 挪威语(伯克梅尔)
nb-NO 挪威语(伯克梅尔)(挪威)
nl 荷兰语
nl-BE 荷兰语(比利时)
nl-NL 荷兰语(荷兰)
nn-NO 挪威语(尼诺斯克)(挪威)
ns 北梭托语
ns-ZA 北梭托语
pa 旁遮普语
pa-IN 旁遮普语
pl 波兰语
pl-PL 波兰语
pt 葡萄牙语
pt-BR 葡萄牙语(巴西)
pt-PT 葡萄牙语(葡萄牙)
qu 克丘亚语
qu-BO 克丘亚语(玻利维亚)
qu-EC 克丘亚语(厄瓜多尔)
qu-PE 克丘亚语(秘鲁)
ro 罗马尼亚语
ro-RO 罗马尼亚语
ru 俄语
ru-RU 俄语
sa 梵文
sa-IN 梵文
se 北萨摩斯语
se-FI 北萨摩斯语(芬兰)
se-FI 斯科特萨摩斯语(芬兰)
se-FI 伊那里萨摩斯语(芬兰)
se-NO 北萨摩斯语(挪威)
se-NO 律勒欧萨摩斯语(挪威)
se-NO 南萨摩斯语(挪威)
se-SE 北萨摩斯语(瑞典)
se-SE 律勒欧萨摩斯语(瑞典)
se-SE 南萨摩斯语(瑞典)
sk 斯洛伐克语
sk-SK 斯洛伐克语
sl 斯洛文尼亚语
sl-SI 斯洛文尼亚语
sq 阿尔巴尼亚语
sq-AL 阿尔巴尼亚语
sr-BA 塞尔维亚语(拉丁文,波斯尼亚和黑塞哥维那)
sr-BA 塞尔维亚语(西里尔文,波斯尼亚和黑塞哥维那)
sr-SP 塞尔维亚(拉丁)
sr-SP 塞尔维亚(西里尔文)
sv 瑞典语
sv-FI 瑞典语(芬兰)
sv-SE 瑞典语
sw 斯瓦希里语
sw-KE 斯瓦希里语
syr 叙利亚语
syr-SY 叙利亚语
ta 泰米尔语
ta-IN 泰米尔语
te 泰卢固语
te-IN 泰卢固语
th 泰语
th-TH 泰语
tl 塔加路语
tl-PH 塔加路语(菲律宾)
tn 茨瓦纳语
tn-ZA 茨瓦纳语
tr 土耳其语
tr-TR 土耳其语
ts 宗加语
tt 鞑靼语
tt-RU 鞑靼语
uk 乌克兰语
uk-UA 乌克兰语
ur 乌都语
ur-PK 乌都语
uz 乌兹别克语
uz-UZ 乌兹别克语(拉丁文)
uz-UZ 乌兹别克语(西里尔文)
vi 越南语
vi-VN 越南语
xh 班图语
xh-ZA 班图语
zh 中文
zh-CN 中文(简体)
zh-HK 中文(香港)
zh-MO 中文(澳门)
zh-SG 中文(新加坡)
zh-TW 中文(繁体)
zu 祖鲁语
zu-ZA 祖鲁语

标签:翻译,en,Qt,tr,西班牙语,ar,Linguist,es,语言
来源: https://www.cnblogs.com/zhuchunlin/p/16485972.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有