用 Qt 5 中实现多国语言支持

Qt5 实现多国语言

引言

  • 目的:自用/笔记
  • 时间:2018-02-13 01:13
  • 平台: Windows 7
  • 项目:将英语界面添加德语和土耳其语翻译

步骤

  1. 使用默认语言写出整个工程,这里使用英语作为缺省语言

  2. 标记期望译为多国语言的字符串,在代码中把相关字符使用tr()替换

    例如在代码中,把界面上的"Select Output Image" 期望转换为多国语言,只需要将代码中的字符替换为 tr(”Select Output Image")

QFileDialog::getSaveFileName(this,"SelectOutputImage",QDir::currentPath(),"*.jpg;;*.png);
QFileDialog::getSaveFileName(this,tr("SelectOutputImage"),QDir::currentPath(),"*.jpg;;*.png);
//这行代码功能是选择存储路径,getSaveFileName函数第二个参数是文件选择导航器界面的标题栏,我们希望他参与多国语言翻译,所以使用tr函数将其"标记"
  1. 把翻译文件添加到工程文件(.PRO文件)中,添加该语句:

    TRANSLATIONS = translation_de.ts translation_tr.ts

    ts文件是Qt用以实现多国语言的一个中间文件,再此声明一下

    de代表德国语,tr代表土耳其语(这是个很好的命名习惯,可读性高而且后期还要使用这个文件名继续生成其他文件)

  2. 使用Qt的 lupdate 工具生成TS文件

    • 此步骤就是生成第3步中向工程声明的两个ts文件,其原理是遍历源代码和 UI 文件寻找可翻译的文本并创建ts文件。翻译人员使用Qt提供的Linguist工具就可以翻译这些文本

    • lupdate 位于Qt安装目录的bin文件夹,如:C:\Qt|Qt5.9.1\msvc2015\bin

    • 方法一: 直接在Qt中运行lupdate,工具->外部->Qt语言家->lupdate

    • 方法二:使用命令行工具

      使用CD指令切换到项目目录,也就是有.pro文件的那个目录

      输入C:\Qt\Qt5.9.1\msvc2015/bin/lupdate.exe *.pro执行lupdate

      运行结束后,工程路径下就会有两个ts文件

  3. 运行linguist 并加载刚刚生成的两个ts文件,翻译好保存

  4. 创建QM文件。创建ts文件方法相同(直接IDE中运行或命令行运行),把lupdate替换为lrelease即可

  5. 把QM文件添加到工程的resources中

  6. Qt中负责多国语言的是QTranslator类,所以要向mainWindow.h中添加包含文件

本例中需要翻译出两国语言,故声明两个QTranslator 对象作为MainWindow的私有成员

#include <QTranslaotr>
QTranslator *turkishTranslator;
QTranslator *germanTranslator;
  1. 在构造函数中添加以下代码,以便启动软件时自动加载翻译文件

    turkishTranslator = new QTranslator(this);
    turkishTranslator
    ->load(":/translations/translation_tr.qm");
    germanTranslator = new QTranslator(this);
    germanTranslator
    ->load(":/translations/translation_de.qm");
    //承于QObject在父对象销毁时会自动去销毁子对象。(父类被销毁时,子类也被销毁)
    
  2. 在界面中创建语言设定菜单右键单击接界面,点选创建菜单栏,命名为Language,然后创建子项:

  • English
  • German
  • Turkish

创建完成后,在底部的Action Editor中就会显示三个入口,这些入口是创建菜单时自动生成的

  1. 右键单击Turkish后选择转到槽,触发类型:triggered()

    x向生成的函数中添加如下代码

    void MainWindow::on_actionTurkish_triggered()
    {
        qApp -> installTranslator(turkishTranslator);
    }
    
  2. 同理,向German的槽中添加如下代码

    void MainWindow::on_actionTurkish_triggered()
    {
        qApp -> installTranslator(germanTranslator);
    }
    
  3. 对actionEnglish执行同样的操作。与之前不同,由于工程本身就是用英语写的,所以要想显示英语,只需移除turkishTranslator 和 germanTranslator即可,代码如下

    void MianWindow::on_actionEnglish_triggered()
    {
        qApp -> removeTranslator(turkishTranslator);
        qApp -> removeTranslator(germanTranslator);
    }
    
  4. 为保证界面翻译成功运行,我们需要重写changeEvent,在mianWindow.h中添加如下代码

    void changeEvent(QEvent *event);
    
  5. 在mainWindow.cpp文件中添加如下代码:

    void MainWindow::changeEvent(QEvent *event)
    {
        if(event -> type() == QEvent::LanguageChange)
        {
            
        }
    }
    

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 本文提及如何使用QT和QT Linguist来实现翻译,如果你对所谓动态翻译感兴趣,请移步到其他文章。笔者也推荐一...
    陆大胖阅读 4,160评论 1 6
  • Qt是属于一个跨平台的GUI开发软件,支持的平台有Unix、Linux、Windows/WinCE、IOS等。 Q...
    一叶之界阅读 8,205评论 0 17
  • 为什么在头文件中有的是使用前置声明,而有的是包含头文件? 如下代码: 前置声明(forward declarati...
    Joe_HUST阅读 1,319评论 0 6