关闭

QT 软件中英文切换

标签: qt国际化软件本地化
326人阅读 评论(0) 收藏 举报
分类:

本文内容学习自Johan Thelin的《Foundations of Qt Development》,欢迎交流。

本文中的例子是将软件版本在中英文之间动态切换,在书中归属语言国际化的章节Internationalization and Localization。在实现上用到了lupdate, linguist, lrelease等qt自带的工具,中间文件有翻译源文件ts文件,翻译后文件qm文件。

我们的工程是internal,文件有:

.
├── chinese.qm (由.pro生成后的翻译文件)
├── chinese.ts (由.pro生成后的翻译源文件)
├── english.qm (由.pro生成后的翻译文件)
├── english.ts (由.pro生成后的翻译源文件)
├── internal (生成后的可执行文件)
├── internal.pro
├── internal.pro.user
├── main.cpp
├── mainwindow.cpp
├── mainwindow.h
└── mainwindow.ui


这里写图片描述
运行效果

ts文件的生成

在pro中加上:
TRANSLATIONS += english.ts chinese.ts
然后,使用lupdate生成xml文件(.ts文件).

[edemon@CentOS internal]$ lupdate internal.pro
Updating 'english.ts'...
    Found 8 source text(s) (8 new and 0 already existing)
Updating 'chinese.ts'...
    Found 8 source text(s) (8 new and 0 already existing)
[edemon@CentOS internal]$ ls
chinese.ts  internal.pro      main.cpp  mainwindow.cpp  mainwindow.ui  ui_mainwindow.h
english.ts  internal.pro.user  main.o    mainwindow.h    Makefile

xml内容:

[edemon@CentOS internal]$ cat chinese.ts 
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.0">
<context>
    <name>MainWindow</name>
    <message>
        <location filename="mainwindow.ui" line="14"/>
        <source>MainWindow</source>
        <translation type="unfinished"></translation>
    </message>
    ...
</context>
</TS>

修改ts文件(翻译源文件)

可以直接编译ts文件,也可以使用工具linguist。
如下:
这里写图片描述

修改的对应项将问号点成对勾,不然ts文件一直显示translation type=”unfinished”
如下:
这里写图片描述

    <message>
        <location filename="mainwindow.cpp" line="32"/>
        <source>chinese</source>
        <translation>中文</translation>
    </message>
    <message>
        <location filename="mainwindow.cpp" line="33"/>
        <source>Mainwindow</source>
        <translation type="unfinished">主窗体</translation>
    </message>

english.ts被linguist打开后,填好English Translation,看到Source text也是Mainwindow,总觉得怪怪的,但我没有理会。
这里写图片描述

qm文件的生成

[edemon@CentOS internal]$  lrelease internal.pro
Updating '/home/edemon/workspace/internal/english.qm'...
    Generated 8 translation(s) (8 finished and 0 unfinished)
Updating '/home/edemon/workspace/internal/chinese.qm'...
    Generated 8 translation(s) (8 finished and 0 unfinished)

代码

首先,我们需要一个QTranslator *qtrans,它被安装在QApplication对象上。
点击语言选择按钮,触发加载语言包资源的槽函数。一旦bool QTranslator::load()成功了,MainWindow::changeEvent()自然顺势被调用,我们的UI更新函数void MainWindow::translateUi()可以放在changeEvent()里面。
关键功能函数:

functions effect
void QWidget::changeEvent(QEvent * event) [virtual protected] 处理更新事件
void languageChanged(); 加载语言包
void translateUi(); 更新UI

code:
main.cpp

#include "mainwindow.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    a.installTranslator(w.qtrans);
    return a.exec();
}

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QTranslator>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT
protected:
    void changeEvent(QEvent *);

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
    void translateUi();

public slots:
    void languageChanged();

private:
    Ui::MainWindow *ui;
public:
    QTranslator *qtrans;
};

#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QGroupBox>

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

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    qtrans = new QTranslator();

    connect(ui->radioButton,SIGNAL(toggled(bool)),this,SLOT(languageChanged()));
    connect(ui->radioButton_2,SIGNAL(toggled(bool)),this,SLOT(languageChanged()));
    ui->radioButton->setChecked(true);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::translateUi()
{
    ui->groupBox->setTitle(QObject::tr("language"));
    ui->radioButton->setText(QObject::tr("english"));
    ui->radioButton_2->setText(QObject::tr("chinese"));
    setWindowTitle(QObject::tr("Mainwindow"));
}

void MainWindow::languageChanged()
{
    if(ui->radioButton->isChecked())
        qtrans->load("./english.qm");
    else
        qtrans->load("./chinese.qm");
}
0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

Qt实现多国语言(即界面翻译)可实时进行切换

新建一个Qt Widgets Application的工程, 然后在UI界面上放置QLabel以及一个按钮 最终要实现点击按钮,实现QLabel上的文字进行中英切换 大致步骤: 1.由...
  • sinat_35523212
  • sinat_35523212
  • 2016-08-28 23:23
  • 3368

QT实现多国语言的动态切换

摘要:本文论述了如何使用QT实现程序的多语系支持以及多语系的动态切换。 前沿 我们生活中用到的程序大多都是支持单一语言的,比如在中国我们用到的软件大多是汉语的,也有很少部分使用的是英语的,但是很少...
  • wang_hu_feng
  • wang_hu_feng
  • 2014-09-29 21:09
  • 2380

android 输入法软键盘屏蔽掉中文切换

android4.4.2屏蔽掉输入法的中文情节, 直接上路子: diff --git a/packages/inputmethods/PinyinIME/res/xml/skb_sym2.xml b/...
  • DKBDKBDKB
  • DKBDKBDKB
  • 2016-11-08 16:32
  • 1309

QT动态切换中英文Demo

  • 2014-10-11 12:02
  • 7KB
  • 下载

qt 之 国际化(中英文切换)

转载自:http://blog.csdn.net/liang19890820/article/details/50276673 简介 Qt国际化属于Qt高级中的一部分,本想着放到后面来说,上节刚好介...
  • baidu_33570760
  • baidu_33570760
  • 2017-05-04 11:37
  • 383

Qt 之 中英文切换的使用

Qt 之 多语言支持 1  在pro文件中加入 TRANSLATIONS = Language_Chn.ts    # 1个或者多个ts文件名 2  在命令行执行 lupdate xx...
  • zhaodan19861107
  • zhaodan19861107
  • 2014-11-10 15:22
  • 506

Qt自动补全代码快捷键和输入法切换快捷键 的冲突解决 (附:fedora上查询 删除软件命令)

Qt自动补全代码快捷键和输入法切换快捷键 的冲突解决 (附:fedora上查询 删除软件命令) 遥想当年初接触qt,只要能要就心满意足了。随着不断学习,发现了越来越多的问题。在linux环境下,...
  • lyc_daniel
  • lyc_daniel
  • 2013-10-08 13:49
  • 2176

使用 vue-i18n 切换中英文

vue-i18n 仓库地址:https://github.com/kazupon/vue-i18n 兼容性: 支持 Vue.js 2.x 以上版本   安装方法:(此处只演示 ...
  • dx18520548758
  • dx18520548758
  • 5天前 16:33
  • 37

linux环境中英文切换配置以及乱码问题

问题这几天玩实验室的服务器,默认语言是中文的,有时候是挺不方便的,比如遇见一个比较复杂的问题,提示的信息是中文的,但是百度里根本没有好的资料,只能google,但是难道让我google搜中午么。因此就...
  • gatieme
  • gatieme
  • 2016-03-27 14:47
  • 6047

Android应用 中英文切换

今天才从别人博客上学来的,浅谈一下我的看法代码可以从那位大神的博客上下载:http://download.csdn.net/detail/qcooler/7052849 ①:在res目录下建立val...
  • zhengyikuangge
  • zhengyikuangge
  • 2015-12-04 16:39
  • 3897
    个人资料
    • 访问:327281次
    • 积分:8806
    • 等级:
    • 排名:第2521名
    • 原创:574篇
    • 转载:13篇
    • 译文:0篇
    • 评论:36条
    我的链接
    最新评论