总第23篇

在Qt的项目开发过程中,有时软件要翻译成多语言版本,这就涉及到国际化方面的操作。虽然Qt对这方面集成了很多工具,操作起来比较方便,本文还是总结一下国际化的方法和步骤,用以备忘和参考。

我们通常在写程序时,为了正常显示中文,一般会直接用到类QTextCodectr()函数,其实这只是一种临时的做法,方便我们快速完成程序、显示效果。当要真正发布一个程序时,最好的方式是在程序中使用英文字符串,再使用国际化工具进行翻译

1.软件国际化的方法

在Qt中,所有的输入部件和文本绘制方式对对所有支持的语言都提供了内置支持,Qt内置的字体引擎可以在同一时间正确而精细地绘制不同的文本。在Qt项目开发过程中,我们可以使用Qt Linguist工具来完成应用程序的翻译工作。

在Qt中编写代码时,要对需要显示的字符串调用tr()函数,完成代码编辑后,对这个应用程序的翻译主要分三个步骤:

  • CMD中运行lupdate工具,从源代码中提取要翻译的文本,这里会生成一个.ts文件,此文件格式是xml格式;
  • Qt Linguist中打开.ts文件,并完成翻译工作;
  • CMD中运动lrelease工具,从.ts文件中生成一个.qm文件,它是一个二进制文件,用于程序运行时使用。

其中,.ts文件和.qm文件都是平台无关的 。

2.具体实例实现步骤

  • 新建Qt Gui应用,项目名称为myI18N,类名为MainWindow,基类保持QMainWindow不变。
  • 建立完项目后,点击mainwindow.ui文件进入设计模式,先添加一个&File菜单,再为其添加一个&New子菜单并设置快捷键为Ctrl+N,然后往界面上拖入一个Push Button
  • 下面我们再使用代码添加几个标签,打开mainwindow.cpp文件,添加头文件#include <QLabel>,然后在构造函数中添加代码:
    label = new QLabel(this);label->setText(tr("helllo QT"));label->move(100,50);label2 = new QLabel(this);label2->setText(tr("password","mainwindow"));label2->move(100,80);label3 = new QLabel(this);int id = 123;QString name = "wusanlang";label3->setText(tr("ID is %1, Name is %2").arg(id).arg(name));label3->resize(180,20);label3->move(100,120);

这里值得注意的是tr()函数是不止一个参数的,其原型为:

QString QObject::tr(const char *sourceText, const char *disambiguation = Q_NULLPTR, int n = -1)

第一个参数sourceText就是要显示的字符串,tr()函数会返回sourceText的译文;第二个参数disambiguation是消除歧义字符串,比如这里的password,如果一个程序中需要输入多个不同的密码,那么在没有上下文的情况下,就很难确定这个password到底指哪个密码。这个参数一般使用类名或者部件名,比如这里使用了mainwindow,就说明这个password是在mainwindow上的;第三个参数n表明是否使用了复数,因为英文单词中复数一般要在单词末尾加“s”,比如“1 message”,复数时为“2 messages”。遇到这种情况,就可以使用这个参数,它可以根据数值来判断是否需要添加“s”。

  • 程序运行结果如下图所示。
  • 源程序编写完成后,我们在.pro文件中指定生成.ts文件的名字,即在文件中添加语句:
TRANSLATIONS = myI18N_zh_CN.ts    //文件名可以随意,但要注意区分

  • CMD中执行lupdate.exe程序,生成.ts文件。如下图所示:
  • 这时使用Qt Linguist 打开.ts文件进行翻译 ,翻译完成后保存。
  • 翻译完成后,使用lrelease.exe程序,生成.qm文件。如下图所示:
  • 在项目程序中,添加.qm文件来改变程序的语言。

在使用qm文件时,要用到QTranslator类,其使用方法为:

int main(int argc, char *argv[])
{QApplication a(argc, argv);         //全局对象指针是宏qAppQTranslator translator;translator.load("../myI18N_zh_CN.qm");a.installTranslator(&translator);MainWindow w;w.show();return a.exec();
}

本测试项目中,我自己制作了,通过点击按钮来实现中英文的切换,其按钮槽函数为实现如下:

void MainWindow::on_pushButton_clicked()
{QTranslator translator;if(m_bTranslator)    //翻译成中文{translator.load("../myI18N_zh_CN.qm");qApp->installTranslator(&translator);ui->retranslateUi(this);//自己添加非ui控件的动态翻译label->setText(QApplication::translate("MainWindow", "helllo QT", Q_NULLPTR));label2->setText(QApplication::translate("MainWindow", "password", Q_NULLPTR));label3->setText(QApplication::translate("MainWindow", "ID is %1, Name is %2", Q_NULLPTR));}else{qApp->removeTranslator(&translator);ui->retranslateUi(this);//自己添加的非ui控件的动态翻译label->setText(QApplication::translate("MainWindow", "hello QT", Q_NULLPTR));label2->setText(QApplication::translate("MainWindow", "password", Q_NULLPTR));label3->setText(QApplication::translate("MainWindow", "ID is %1, Name is %2", Q_NULLPTR));}m_bTranslator = !m_bTranslator;
}

其具体的项目Demo程序包,我以私信我索取。

Qt国际化翻译并不难,本文主要总结归纳一下,以便备忘和后期参考。

本文到此结束!

如果对你有帮助,请随手 点个赞点喜欢收藏不点赞,感觉不仁道......

=======================================================

欢迎【关注作者、私信作者】。我们一起交流一起进步。

=======================================================

qt 判断路径非英文符号与非英文字符_Qt中,软件多语言国际化翻译的方法与步骤...相关推荐

  1. Qt中,软件多语言国际化翻译的方法与步骤

    Qt中,软件多语言国际化翻译的方法与步骤 在Qt的项目开发过程中,有时软件要翻译成多语言版本,这就涉及到国际化方面的操作.虽然Qt对这方面集成了很多工具,操作起来比较方便,本文还是总结一下国际化的方法 ...

  2. python中的符号是否都是英文符号_使用Python处理CSV中的非标准美式英文字符和符号...

    您的问题最有可能与MS Office套件的CP-1252"Windows Unicode"编码.如果你将它看作ASCII或UTF,你会得到时髦的字符. 你可以做两件事情: 队的MS ...

  3. qt qthead里如何响应信号_Qt 中的多线程技术(翻译)

    原文链接 Multithreading Technologies in Qt​doc.qt.io 正文 Qt 提供一系列的类与函数来处理多线程.Qt 开发者们可以使用下面四种方法来实现多线程应用. Q ...

  4. python之中文符号转英文符号

    方法一: maketrans方法, 它使用的是一种映射关系来将(中文字符)转换为(英文字符),前提需要维护映射关系数据,也就是你维护了(中文符号),你也得维护其对应的(英文符号),且两边的数量得保持一 ...

  5. Qt 多国语言国际化

    简述:Qt 提供了一种国际化方案,在程序使用过程中,不需要重启应用程序就可以实现语言的动态切换 1.实现语言国际化步骤 要实现语言国际化,需要执行以下步骤: A.  对用户可见的文本信息全部使用 tr ...

  6. java文件名特殊符号_linux命令行下文件名中包含特殊符号如何的处理方法

    问题描述 前面<Jenkins系列之--07 实现SQL脚本批量执行>在实际运行过程中碰到如下问题 某次一模块SQL脚本执行完成后,再次执行还会运行,即备份执行完成的脚本这个功能没起作用, ...

  7. qprocess回调_Qt图形编程基础之:Qt/Embedded开发入门-嵌入式系统-与非网

    12.2.1  Qt/Embedded介绍 1.架构 Qt/Embedded以原始Qt为基础,并做了许多出色的调整以适用于嵌入式环境.Qt/Embedded通过Qt API与Linux I/O设施直接 ...

  8. Qt判断文件夹路径、文件是否存在不存在则创建

    Qt判断文件夹/目录是否存在 Qt判断文件夹/目录是否存在,可以使用QDir类的exists方法来判断,在使用时需要包含头文件#include <QDir>,例如下面的代码: #inclu ...

  9. java中判断字符串实际长度(中文2个字符,英文1个字符)的方法,包含中英文符号

    java中判断字符串实际长度(中文2个字符,英文1个字符)的方法,包含中英文符号 介绍 数据库中很多字段都会限制长度,为了方便用户使用,在前端界面给出限制长度的提示,看网上很多写的获取字符串长度都没有 ...

最新文章

  1. R语言使用ggplot2包使用geom_violin函数绘制分组小提琴图(配置边界颜色)实战
  2. QT如何设置应用程序的图标
  3. 数楼梯——恶心的高精斐波那契数列
  4. xfce4桌面的标题栏都变成了透明的
  5. Mercurial hg web server的配置
  6. 记录一次可能的order by注入
  7. 复制文本朗读_原创:昭明文选配乐朗读 卷第五十一 论一 东方曼倩 非有先生论 王子渊 四子讲德论 并序...
  8. java获取mysql时间格式化_Java与mysql的时间格式化问题,获取时间的上下午
  9. ONNX系列六 --- 在Java中使用可移植的ONNX AI模型
  10. Web前端笔记(4)
  11. 【重点】程序员面试金典——17.13树转链表
  12. WINDOWS删除N天前的文件命令forfiles
  13. 关于recycle.exe病毒的查杀
  14. 将2010年的旧电脑升级为Win8.1遇到的问题及解决办法
  15. lmdb高效存储图片数据
  16. 【MOOC】华中科技大学计算机组成原理慕课答案-第二章-数据表示
  17. 米家电磁炉显示e10_MIJIA 米家 电磁炉
  18. 网络SSID是什么意思
  19. 嵌入式了解 以及学习路线
  20. 微信视频号绑定公众号教程分享

热门文章

  1. 手写“2021”新年春节艺术字,好素材会说话!
  2. 经典商务未来科技海报PSD分层模板,以后绝对用得上
  3. 科技通讯PSD分层海报出击!Hello 5G时代
  4. java有哪些技术_Java程序员,最常用的20%技术有哪些?
  5. beast php,windows php-beast 安装
  6. C++控制台简单的用户登录
  7. c9, Performance Monitor Control Register
  8. Unwind 栈回溯详解:libunwind
  9. ncurses关于颜色系统:start_color(),has_colors(),init_pair(),color_content(),pait_content()
  10. java模块间调用信息_java与c++模块之间的交互方法?