VS_QT_8_Qt中英文翻译
目录
-
一、概述
-
二、中英文创建
-
- 1、Qt Linguist
-
- 创建.ts文件
- 翻译.ts文件
- 发布.qm文件
-
三、中英文切换
一、概述
中英文翻译功能是一种广泛存在的技术特点,例如常见的浏览器网页通常都支持多语言选择。为了满足更多用户需求,国外主流软件在本地也会提供汉化版本,同时为了满足国产软件开发的需求,中文与英文的切换操作是一种常见且默认配置的功能。
在软件开发过程中,我们通常会采用统一的英文格式作为默认选择。然而,如果项目一开始就未充分考虑多语言切换的需求,无论是采用全英文设计还是全中文设计,当需要进行语言切换时,临时进行界面设计修改都会增加一些时间成本。为此,本章节将分步骤进行讲解:
1. 生成中英文翻译对照文件
通过自动化工具,生成英文文本与中文对照的翻译文件。
2. 详细阐述调用方法并实现中英文自由切换功能
本系统支持通过调用API实现中英文语言的自由切换功能,具体包括英文转中文和中文转英文两种模式。该功能基于先进的自然语言处理技术,确保翻译的准确性和流畅性。
备注:本工程自始至终全部采用英文进行项目工程的所有界面设计工作;待开发完成后,将通过Qt Linguist工具对ts文件进行处理,生成对应的qm文件,从而为中英文切换提供自动翻译的基础文件。
二、中英文创建
1、Qt Linguist
Launch Linguist
Qt Linguist 是为QT平台提供的字符串多语言翻译功能平台。安装成功使用的VS和QT程序后,VS主菜单栏会新增一个QT功能栏,在该功能栏中依次包含QT Designer、QT Linguist、QT项目设置、QT版本信息设置等功能项。在QT功能栏的下拉列表中,点击【Launch Linguist



上下文
上下文
软件界面采用Qt语言进行设计,主窗口布局从左至右依次为包含内容的区域、包含字符串的区域以及包含短语和表单的区域。
| 项目 | 描述 |
|---|---|
| 上下文 | 工程中创建的多个UI |
| 字符串 | 每个UI中对应的部件 |
| 短语和表单 | 每个部件对应的内容 |
创建.ts文件
当采用英文设计界面开发完成后,如下MultiViewer UI最终的设计界面

单击VS2013窗口标题栏中的【QT5



解决方案资源管理器
解决方案资源管理器
此时,上面生成的imagingviewer_zh.ts和imagingviewer_en.ts分别位于【解决方案资源管理器

点击选中imagingviewer_zh.ts文件并执行双击操作后,Qt linguist软件会自动打开ImagingViewer工程的所有设计界面。

翻译.ts文件
上下文
源文
源文

依次翻译其他控件

发布.qm文件
文件
文件
文件
文件

在Translation Files目录下创建的.ts文件,右键点击选中的文件后会显示lupdate更新或lrelease发布功能。

三、中英文切换
根据上一节的翻译资源库.qm文件,本节内容采用源代码与文本结合的方式,阐述如何成功地实现中英文字转换功能。
首先,在main函数中导入.qm文件,其中默认采用英文版本,用户可选其他语言。具体来说,这里采用了相对路径方式,将imagingviewer_en.qm和imagingviewer_zh.qm分别放置在与.exe文件处于同一目录的位置。
//main.cpp
void main()
{
//
QTranslator* mTranslator = new QTranslator(qApp);
mTranslator->load("./imagingviewer_en.qm");
qApp->installTranslator(mTranslator);
//
}
AI助手
在打开资源管理器时,可以使用ImagingViewer.qrc程序。随后,选择并导入所需的.qm文件,然后找到该文件在资源管理器中引用的相对路径。例如,这里的相对路径为:/Resources/imagingviewer_zh.qm。

| qm文件 | 描述 | 备注 |
|---|---|---|
| exe同一路径 | load(“./imagingviewer_en.qm”) | |
| qrc载入资源 | load(“:/Resources/imagingviewer_zh.qm”) | 不稳定,会出现找不到该路径问题 |
在主界面ImagingViewer中实现语言切换
在构造函数中为ImagingViewer建立信号与槽连接,这样在m_TopWidget切换语言时,可以通过LanguageChange(int)信号将索引值发送至主界面ImagingViewer。槽函数ChangeLanguage(int)根据传入的索引值,分别调用对应的.qm文件。重载changeEvent(QEvent *event)函数,该函数在处理QEvent::LanguageChange事件时,将调用UI翻译接口ui.retranslateUi(this)。
//ImagingViewer.h
//main window class
class ImagingViewer : public QMainWindow
{
Q_OBJECT
public:
//
public slots:
//0-English; 1-Chinese
void ChangeLanguage(int);
protected:
void changeEvent(QEvent *event);
private:
QTranslator* m_QTranslator;
};
AI助手
//ImagingViewer.cpp
//Constructed Function
ImagingViewer::ImagingViewer(QWidget *parent): QMainWindow(parent)
{
ui.setupUi(this);
// 建立信号和槽,用于连接标题栏翻译按钮触发时的中英文切换响应
connect(m_TopWidget, SIGNAL(LanguageChange(int)), this,SLOT(ChangeLanguage(int)));
}
void ImagingViewer::changeEvent(QEvent *e)
{
QWidget::changeEvent(e);
switch (e->type())
{
// 当发生QEvent::LanguageChange事件时,调用ui.retranslateUi(this)重新翻译
case QEvent::LanguageChange:
ui.retranslateUi(this);
break;
default:
break;
}
}
// 槽函数,根据索引值分别调用imagingviewer_zh.qm或imagingviewer_en.qm文件
void ImagingViewer::ChangeLanguage(int index)
{
m_QTranslator = new QTranslator(qApp);
if (index)
{
//index =1, change language to Chinease
if (m_QTranslator->load(QString("./imagingviewer_zh.qm")))
{
qApp->installTranslator(m_QTranslator);
}
}
else
{
//index =0, change language to English
if (m_QTranslator->load(QString("./imagingviewer_en.qm")))
{
qApp->installTranslator(m_QTranslator);
}
}
ui.retranslateUi(this);
}
AI助手
在整合多个widget界面并完成主界面布局的情况下,主界面所定义的槽函数在触发语言切换时,仅限于主界面的英文字符串会被翻译成中文,而次界面则会保持不变。这种直观表现为只有ImagingViewer窗口的字符串会被翻译,而其他如MultiViewer等次界面则无法实现翻译功能。因此,必须在MultiViewer次界面中实现changeEvent(QEvent *event)函数的行为,以确保语言切换的同步翻译。对于其他次界面(如ToolWidget、VolumeViewer和TopWidget),其同步翻译功能的实现方式应与MultiViewer次界面保持一致。
//MultiViewer.h
//Local window
class MultiViewer : public QWidget
{
Q_OBJECT
public:
//
protected:
void changeEvent(QEvent *event);
};
AI助手
//MultiViewer.cpp
void MultiViewer::changeEvent(QEvent *event)
{
if (event->type() == QEvent::LanguageChange){
ui.retranslateUi(this);
}
}
AI助手
- 结果展示


