• C++Qt开发——Linguist语言家


    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文件中添加翻译文件名称。

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

    本文福利,费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QT嵌入式开发,Quick模块等等)↓↓↓↓↓↓见下面↓↓文章底部点击费领取↓↓

    3,生成翻译文件

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

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

    4.1 修改xml,翻译

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

    1. <?xml version="1.0" encoding="utf-8"?>
    2. <!DOCTYPE TS>
    3. <TS version="2.1" language="en"> <!-- 版本和语言 -->
    4. <context>
    5.    <name>MainWindow</name>
    6.    <message>
    7.        <location filename="../mainwindow.ui" line="14"/> <!-- 文本位置-->
    8.        <source>MainWindow</source> <!-- 源文本-->
    9.        <translatorcomment>title</translatorcomment> <!-- 注释 -->
    10.        <translation>Maye</translation> <!-- 翻译文本 -->
    11.    </message>
    12.    <message>
    13.        <location filename="../mainwindow.ui" line="27"/>
    14.        <source>用户名</source>
    15.        <translation>username</translation>
    16.    </message>
    17.    <message>
    18.        <location filename="../mainwindow.ui" line="40"/>
    19.        <source>密码</source>
    20.        <translation>password</translation>
    21.    </message>
    22.    <message>
    23.        <location filename="../mainwindow.ui" line="73"/>
    24.        <source>登录</source>
    25.        <translation>login</translation>
    26.    </message>
    27.    <message>
    28.        <location filename="../mainwindow.ui" line="86"/>
    29.        <source>注册</source>
    30.        <translation>register</translation>
    31.    </message>
    32.    <message>
    33.        <location filename="../mainwindow.ui" line="100"/>
    34.        <source>中文</source>
    35.        <translation>chinese</translation>
    36.    </message>
    37.    <message>
    38.        <location filename="../mainwindow.ui" line="105"/>
    39.        <source>英文</source>
    40.        <translation type="unfinished">English</translation>
    41.    </message>
    42.    <message>
    43.        <location filename="../mainwindow.ui" line="119"/>
    44.        <source>语言</source>
    45.        <translation type="unfinished">language</translation>
    46.    </message>
    47. </context>
    48. </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创建。

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

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

    7,动态切换语言

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

    • 下拉框切换语言

    1. void MainWindow::on_comboBox_currentIndexChanged(int index)
    2. {
    3.    QString filename;
    4.    switch (index)
    5.   {
    6.    case 0:
    7.        filename = "linguist_zh_CN.qm";      
    8.        break;
    9.    case 1:
    10.        filename = "linguist_en.qm";
    11.        break;
    12.   }
    13.    QTranslator translator;
    14.    if(!translator.load(filename,"F:\\MyCode\\QtCode\\Lingguist\\translate"))
    15.   {
    16.        qDebug()<<"翻译文件加载失败";
    17.        return;
    18.   }
    19.    if(qApp->installTranslator(&translator))
    20.   {
    21.        qDebug()<<"安装成功";
    22.   }else
    23.   {
    24.        qDebug()<<"安装失败";
    25.   }
    26.    ui->retranslateUi(this);
    27. }
    • 保存语言选择和恢复语言

    本文福利,费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QT嵌入式开发,Quick模块等等)↓↓↓↓↓↓见下面↓↓文章底部点击费领取↓↓

    保存

    1. void MainWindow::on_comboBox_currentIndexChanged(int index)
    2. {
    3.    QString filename;
    4.    switch (index)
    5.   {
    6.    case 0:
    7.        filename = "linguist_zh_CN.qm";
    8.        break;
    9.    case 1:
    10.        filename = "linguist_en.qm";
    11.        break;
    12.   }
    13.    //保存配置
    14.    QSettings setting("config.ini",QSettings::Format::IniFormat);
    15.    setting.setValue("ts",filename);
    16. ...
    17. }

    恢复

    1. int main(int argc, char *argv[])
    2. {
    3.    QApplication a(argc, argv);
    4.    QSettings setting("config.ini",QSettings::Format::IniFormat);
    5.    QString filename = setting.value("ts").toString();
    6.    QTranslator translator;
    7.    if(!translator.load(filename,"F:\\MyCode\\QtCode\\Lingguist\\translate"))
    8.   {
    9.        qDebug()<<"翻译文件加载失败";
    10.   }
    11.    if(qApp->installTranslator(&translator))
    12.   {
    13.        qDebug()<<"安装成功";
    14.   }else
    15.   {
    16.        qDebug()<<"安装失败";
    17.   }
    18.    MainWindow w;
    19.    w.show();
    20.    return a.exec();
    21. }
    • 重启程序

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

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

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

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

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

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

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

    • 你在误用tr

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

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

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

    1. QString text1 = QObject::tr("hello");
    2. 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祖鲁语

    本文福利,费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QT嵌入式开发,Quick模块等等)↓↓↓↓↓↓见下面↓↓文章底部点击费领取↓↓ 

  • 相关阅读:
    代码随想录 Day47 动态规划15 LeetCode T583 两个字符串的删除操作 T72 编辑距离
    Javaweb回炉简要学习笔记
    Linux 三剑客之AWK
    HCIP【GRE VPN、MGRE VPN与PPP验证综合实验】
    golang gin 框架读取无法用 body 传递的表单参数
    [NOIP2015 提高组] 跳石头—二分答案
    Java进阶篇--AQS(AbstractQueuedSynchronizer)
    [C#]C#调用cplex
    java-net-php-python-jspm学生课堂学习状态查看系统计算机毕业设计程序
    为FMX项目设置全局日期格式
  • 原文地址:https://blog.csdn.net/m0_60259116/article/details/127874111