首页 > 代码库 > tr()和国际化

tr()和国际化

如果我们程序需要翻译成另外一种语言,那么Qt Linguist 和Qt的翻译工具已经为我们解决这个问题,它提供了一套解决方案,它们提供了如何组织和处理翻译后字符串的方法。

为了准备进行代码翻译,需要使用QObject::tr()函数,来包含需要翻译的字符串,当将其作用于非静态函数时,他会将QMetaObject所提供对象的类名进行翻译,作为要翻译字符串分组的“上下文”

tr()函数有两个作用:

  1. 它使的QT的lupate工具可以提取所有可翻译的字符串

  2. 如果翻译文件可用,并且语言已经被选中,该函数就会返回翻译后的字符串

如果没有可以使用的翻译文件,那么tr()函数返回原始字符串

注意:确保每个可翻译的字符串都完全在tr()函数内部,并且编译时刻被进行提取,这个是非常重要的,对于带参数的字符串,可以使用QString::arg()函数来将参数放置在翻译过的字符串中:

 label->setText(tr("%1 + %2 = %3"))
 .arg(para1)
 .arg(para2)
 .arg(para3)

具体步骤:

  1. 在pro文件中添加:

TRANSLATIONS = $$PWD/lang/chinese.ts \ 
               $$PWD/lang/english.ts

  2.  方法 一>使用Qt的终端使用lupdate  pro文件名,生成翻译文件chinese.ts和english.ts

     方法 二>工具->外部->Qt语言家->更新翻译,将生成翻译文件chinies.ts和english.ts

  3.使用Qt Linguist编辑*.ts文件,来进行翻译工作

  4. 方法 一>使用Qt的终端使用lrelease命令

      方法 二>Qt Linguist找到“发布”,就可以根据*.ts生成*.qm文件,他们可以有应用程序来载入其翻译

      方法 三>工具->外部->Qt语言家->部署翻译,将生成语言文件qm

  5. 加载翻译文件

QTranslator translator;
translator.load("cn.qm");
qApp->installTranslator(&translator);


用QT实现多国语言支持有两种情况:

第一种:使用UI编辑器来自动生成界面,这种方式实现多语系的动态切换很容易。

void MainWindow::changeLanguage(const ELangType& langType)
{
    switch(langType)
    {
        case ELangType_Chinese:
        {
            this->languageState = ELangType_Chinese;
            this->translator.load("chinese") ;
            qApp->installTranslator(&(this->translator));
            break;
        }
        case ELangType_English:
        {
            this->languageState = ELangType_English;
            this->translator.load("english") ;
            qApp->installTranslator(&(this->translator));
            break;
        }
        default:
        {
            break;
        }
    }
}

这个函数是实现语言动态切换,其中languageType是用来记录当前语言的状态,qApp是QApplication对象,我们只需使用QTranslator加载不同的文件就可以实现多语系的动态切换。

第二种:不使用UI编辑器,自己通过亲自编程来设计应用程序界面,这种方式实现多语系动态切换比较繁琐,注意不是难;

void MainWindow::changeLanguage(const ELangType& langType)
{
    switch(langType)
    {
        case ELangType_Chinese:
        {
            this->languageState = ELangType_Chinese;
            this->translator.load("chinese") ;
            this->pOwner->installTranslator(&(this->translator));
            break;
        }
        case ELangType_English:
        {
            this->languageState = ELangType_English;
            this->translator.load("english") ;
            this->pOwner->installTranslator(&(this->translator));
            break;
        }
        default:
        {
            break;
        }
    }
    
    this->labelname->setText(tr("name"));
    this->labeltel->setText(tr("tel"));
    ........
}

因此这个特别麻烦,每个界面都要进行类似这样的操作,一般我会在每个界面使用一个retranslateUi()函数,把所有的

要翻译的控件放到里面,每次翻译的时候调用下就可以了

注意:第一个方法没有再次从新设置tr(),原因如下

void MainWindow::changeEvent(QEvent *e)
{
    QMainWindow::changeEvent(e);
    switch (e->type()) {
    case QEvent::LanguageChange:
         ui->retranslateUi(this);//这里实现语言翻译器的更新。
    .......
}

tr()和国际化