简介

Qt 多语言支持很强大,很好用。

首先要强调的是程序中需要翻译的字符串最好都用 tr("message") 这种形式,这里的 "message" 就是需要翻译的字符串,统一用英文来表示,也就是说开发过程中程序的默认语言是英文,

开发完成后,用 Qt 多语言工具将程序翻译成不同的语言。

需要用到的工具就是 Qt 自带的 lupdate, lrelease, linguist 这3个,不同的二进制发布版本会存放在不同的安装目录。

例如我的编译器版本是 mingw53_32,那么它们存放的路径如下:

D:\Qt\Qt5.11.1\5.11.1\mingw53_32\bin\lupdate.exe
D:\Qt\Qt5.11.1\5.11.1\mingw53_32\bin\linguist.exe
D:\Qt\Qt5.11.1\5.11.1\mingw53_32\bin\lrelease.exe

如果没有把这个 bin 路径添加到系统的 PATH 路径,那么就需要填写完整的路径来启动可执行文件。

三个工具的作用

  1. lupdate 工具用来提取程序中由 tr() 等函数包含的带翻译的字符串到一个文本文件 proXXX_zh_CN.ts 中,例如这里需要翻译成中文简体,开发过程中需要用到此 ts 文件;
  2. linguist 工具会打开上一步的 ts 文件,然后让开发人员翻译,例如 "hello world" 翻译成中文,需要填写对应的单词表,如果不填写,那么就不会产生翻译,程序最终输出的就是原始的 "hello world";
  3. lrelease 工具会把上一步的 ts 文件转换为 QM 文件,例如 proXXX_zh_CN.qm,这个文件才是应用读取的翻译文件,发布应用程序应当提供这个文件。

一个简单的 helloworld 程序

命令行程序,开发完成后,需要翻译的字符串就是这一行代码中的字符串:

qDebug().noquote() << QObject::tr("hello world") << endl;

翻译过程,大致步骤如下:

0. 用默认语言(例如英语)开发应用;

  1. 应用开发完成,用 lupdate 工具提取待翻译的字符串到 TS 文件,用 linguist 工具打开 TS 文件,翻译文本;
  2. 翻译完成用 lrelease 工具把 TS 文件转换为 QM 文件;
  3. 程序中加载 QM 文件,并安装翻译对象。
  4. 打包发布应用程序。

手把手示例

0. 用默认语言开发应用

新建一个控制台应用 helloworld,用 qDebug() 输出一句话即可。

1. 用工具 lupdate 提取待翻译的字符串生成 ts 文件,并用 linguist 工具打开并翻译

这一连串的动作,我用脚本实现了,代码如下:

:: @ECHO OFF
SET LUPDATE_BIN=D:\Qt\Qt5.11.1\5.11.1\mingw53_32\bin\lupdate.exe
SET LINGUIST_BIN=D:\Qt\Qt5.11.1\5.11.1\mingw53_32\bin\linguist.exe
SET PRO_NAME=helloworld.pro
SET TS_FILENAME=helloworld_zh_CN.ts START %LUPDATE_BIN% -pro %PRO_NAME% -ts %TS_FILENAME% START %LINGUIST_BIN% %TS_FILENAME% EXIT

功能很简单,首先设置 lupdatelinguist 工具路径,然后根据项目设置工程的文件名字和需要翻译的文件名字,然后启动程序,第一步生成 TS 文件,第二步用 linguist 打开刚刚生成的 TS 文件。

在这个应用中只有一个单词需要翻译,示例如下:

2. 翻译完成,用 lrelease 工具把 TS 文件转换为 QM 文件

这个动作我也用脚本实现了,代码如下:

:: convert *.ts to *.qm file.
SET LRELEASE_BIN=D:\Qt\Qt5.11.1\5.11.1\mingw53_32\bin\lrelease.exe
SET TS_FILENAME=helloworld_zh_CN.ts
SET QM_FILENAME=helloworld_zh_CN.qm START %LRELEASE_BIN% %TS_FILENAME% -qm %QM_FILENAME%

3. 修改代码,程序中加载 QM 文件

这个步骤才是重点,划分为以下几个小步骤:

  1. 头文件包含 #include <QTranslator>,注意在 PRO 文件中添加这一句话 TRANSLATIONS = helloworld_zh_CN.ts
  2. 新建一个 QTranslator translator_zh_CN 示例,然后加载QM文件,相关代码如下:
    QTranslator translator_zh_CN;

    // [1] tries to load a file called helloworld_zh_CN.qm
//translator_zh_CN.load("helloworld_zh_CN"); // not work
translator_zh_CN.load(":/translations/helloworld_zh_CN");

这里的 QM 文件我是添加到 QRC 文件中,所以引用的路径是以 :/prefix/filename 形式。

QRC 文件如何使用以后再说。

  1. 安装翻译语言,一句话搞定 app.installTranslator(&translator_zh_CN);

4. 发布应用程序

不是本文重点,以后再说。

附上源文件

helloworld.pro 内容如下:

QT -= gui

CONFIG += c++11 console
CONFIG -= app_bundle # The following define makes your compiler emit warnings if you use
# any feature of Qt which as been marked deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS # You can also make your code fail to compile if you use deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 SOURCES += \
main.cpp # [3] add this file to the project.
TRANSLATIONS = helloworld_zh_CN.ts RESOURCES += \
helloworld.qrc

main.cpp 内容如下:

#include <QCoreApplication>
// it MUST be included if you want to support multiple languages.
#include <QTranslator> #include <QObject>
#include <QDebug> int main(int argc, char *argv[])
{
QCoreApplication app(argc, argv);
QTranslator translator_zh_CN; // [1] tries to load a file called helloworld_zh_CN.qm
//translator_zh_CN.load("helloworld_zh_CN"); // not work
translator_zh_CN.load(":/translations/helloworld_zh_CN"); // [2] install the translator
app.installTranslator(&translator_zh_CN);
qDebug().noquote() << QObject::tr("hello world") << endl; return app.exec();
}

helloworld.qrc 内容如下:

<RCC>
<qresource prefix="/translations">
<file alias="helloworld_zh_CN">helloworld_zh_CN.qm</file>
</qresource>
</RCC>

最后是调用 lupdate, linguistlrelease 的脚本.

lupdate_helloworld.bat 内容如下:

:: @ECHO OFF
SET LUPDATE_BIN=D:\Qt\Qt5.11.1\5.11.1\mingw53_32\bin\lupdate.exe
SET LINGUIST_BIN=D:\Qt\Qt5.11.1\5.11.1\mingw53_32\bin\linguist.exe
SET PRO_NAME=helloworld.pro
SET TS_FILENAME=helloworld_zh_CN.ts START %LUPDATE_BIN% -pro %PRO_NAME% -ts %TS_FILENAME% START %LINGUIST_BIN% %TS_FILENAME% EXIT

lrelease_helloworld.bat 内容如下:

:: convert *.ts to *.qm file.
SET LRELEASE_BIN=D:\Qt\Qt5.11.1\5.11.1\mingw53_32\bin\lrelease.exe
SET TS_FILENAME=helloworld_zh_CN.ts
SET QM_FILENAME=helloworld_zh_CN.qm START %LRELEASE_BIN% %TS_FILENAME% -qm %QM_FILENAME%

声明

欢迎转载,请注明出处和作者,同时保留声明。

作者:LinTeX9527

出处:https://www.cnblogs.com/LinTeX9527/p/10988561.html

本博客的文章如无特殊说明,均为原创,转载请注明出处。如未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

Qt 多语言支持的更多相关文章

  1. Qt 编写应用支持多语言版本--一个GUI应用示例

    简介 上一篇博文已经说过如何编写支持多语言的Qt 命令行应用,这一篇说说Qt GUI 应用多语言支持的坑. 本人喜欢用代码来写布局,而不是用 Qt Designer 来设计布局,手写布局比 Qt De ...

  2. Pyqt 国际化多语言支持

    国际化是指在代码设计上加入能方便的移植到其他国家和地区的特性, 给Pyqt 添加国际化支持需要五步 一.编写GUI.py 在要被翻译的text上用tr方法括起来 # -*- coding: utf-8 ...

  3. 分享两种实现Winform程序的多语言支持的解决方案

    因公司业务需要,需要将原有的ERP系统加上支持繁体语言,但不能改变原有的编码方式,即:普通程序员感受不到编码有什么不同.经过我与几个同事的多番沟通,确定了以下两种方案: 方案一:在窗体基类中每次加载并 ...

  4. EnumHelper.cs枚举助手(枚举描述信息多语言支持)C#

    C#里面经常会用到枚举类型,枚举是值类型对象,如果你想用枚举类型的多属性特性,或者你想在MVC页面上通过简单的值类型转换,将某字段值所代表的含义转换为文字显示,这时候必须要将枚举扩展,是它支持文本描述 ...

  5. ios调用系统相册、相机 显示中文标题、本地化多语言支持

    因为调用系统相册.相机需要显示中文,所以搞了半天才知道是在Project->info->Custom ios Target Properties 添加 Localizations 并加入C ...

  6. (视频)《快速创建网站》 3.3 国际化高大上 - WordPress多语言支持

    本文是<快速创建网站>系列的第7篇,如果你还没有看过之前的内容,建议你点击以下目录中的章节先阅读其他内容再回到本文. 访问本系列目录,请点击:http://devopshub.cn/tag ...

  7. tp 多语言支持

    tp支持多语言 通过get来改变语言的 http://localhost/tp/index.php/Admin/User/add/hl/zh-cn http://localhost/tp/index. ...

  8. iOS-生成国际化包-配置App多语言支持

      标签: ios国际化 ios多语言支持 xcode多语言支持 xcode生成多语言 国际化 it 分类: 功能知识   如果你的App需要支持多国语言.那么,就应该为你的App应用添加“国际化”支 ...

  9. Zend Framework 入门(2)—多国语言支持

    如果你的项目想要支持多语言版本,那么就需要用到 Zend_Translate.Zend_Translate 的详细文档在这里,不过如果想偷懒的话,也很简单,在View Helpers 文档中介绍了如何 ...

随机推荐

  1. 我的spring cloud项目历程(2018.3~2018.9)

    前言 今天是9月17日,趁着山竹的临幸,得以在家里舒适的办公.项目从3月底开始,至今刚好半年.抽几十分钟,总结下半年的历程.对后面的项目,应该也有一点帮助吧. 学习前的七个问题 项目开始前,由于某些特 ...

  2. 《windows核心编程系列》五谈谈线程基础

    线程基础 与前面介绍的进程一样,线程也有两部分组成.一个是线程内核对象.它是一个数据结构,操作系统用它来管理线程以及用它来存储线程的一些统计信息.另一个是线程栈,用于维护线程执行时所需的所有函数参数和 ...

  3. linux系统资源限制ulimit

    ulimit命令用来限制系统用户对shell资源的访问.如果不懂什么意思,下面一段内容可以帮助你理解: 假设有这样一种情况,当一台 Linux 主机上同时登陆了 10 个人,在系统资源无限制的情况下, ...

  4. [Usaco2006 Open]County Fair Events 参加节日庆祝

    Description Farmer John has returned to the County Fair so he can attend the special events (concert ...

  5. Objective-c单例模式的正确写法--用dispatch 线程安全

    单例模式在iOS开发中可能算是最常用的模式之一了,但是由于oc本身的语言特性,想要写一个正确的单例模式相对来说比较麻烦,这里我就抛砖引玉来聊一聊iOS中单例模式的设计思路.关于单例模式更多的介绍请参考 ...

  6. jQuery Ajax使用实例

    <script src="http://cdn.bootcss.com/jquery/1.11.2/jquery.js"></script> <scr ...

  7. 2017团体程序设计天梯赛大区赛 L3-3 球队“食物链”

    思路: 状压dp. 实现: #include <iostream> #include <cstdio> #include <cstring> using names ...

  8. vue2.0 动态切换组件

    组件标签是Vue框架自定义的标签,它的用途就是可以动态绑定我们的组件,根据数据的不同更换不同的组件. <!DOCTYPE html> <html lang="en" ...

  9. 玩转CPU运行曲线

    Leaf 是不是从来没有想过看看cpu运行曲线啊骚年?顶多也就仅仅是看看cpu利用率,吓自己一跳后感觉关闭几个不该打开的程序~ 然而问题来了,微软公司要让你绘制cpu运行曲线啊!!不仅是固定的直线,还 ...

  10. 迅为IMX6Q四核核心板商业级|工业级|IMX6Plus版本|IMX6DL双核核心板

    IMX6Q处理器:兼容单核,双核,工业级,汽车级,IMX6Q最新Plus版本,共用同一底板,高端产品无忧. i.MX6系列针对消费电子.工业控制和汽车应用领域,它将ARM Cortex-A9架构的高功 ...