Qt多国语言动态切换(含源代码)

2023-11-18

Qt中文国际化  (含高阶做法)

 

作者:melon

日期:2019/7/15

 

1. 国际化需要用到的工具

lrelease.exe、lupdate.exe、linguist.exe(非必须),这些工具在Qt5.12.2的bin文件夹都可以找到

 

lupdate.exe ---- 用于扫描ts文件中的字符(必须使用tr或者qsTr等函数注册)

lrelease.exe ---- 用于生成qm翻译文件

linguist.exe  ---- 可以打开ts和qm的文件,在里面可以对ts文件的字符进行翻译

 

2. 国际化步骤详解(翻译中文简体、英文)

(1)使用lupdate生成ts翻译文件(不是必须步骤,可以直接跳到第2步)

lupdate -ts zh_CN.ts

lupdate -ts en.ts  

 

(2)使用lupdate扫描需要翻译文件的文字

lupdate –recursive <path> -ts zh_CN.ts

lupdate–recursive <path> -ts en.ts

-recursive 这个命令是遍历path所有的文件以及子文件夹

-ts 生成扫描完成的zh_CN.ts,指定输出文件名为zh_CN.ts

也可以指定扫描文件,如 lupdate main.qml Button.qml -ts zh_CN.ts

上面就是指定扫描main.qml和Button.qml

 

(3)使用linguist打开zh_CN.ts和en.ts,进行文字翻译

翻译好保存退出

(4)使用lrelease生成最终的qm翻译文件

lrelease zh.ts -qm zh.qm

lrelease en.ts -qm en.qm

 

(5)使用QTranlator加载qm文件(注意路径),注册到QApplication即可

translator->load("zh.qm")

qApp->installTranslator(translator);

 

 

高阶做法(自定义xml,同时兼容linguist)

 

1.根据ts文件格式自定义自己的xml文件(ts本身的格式就是xml)

<?xml version="1.0" encoding="utf-8"?>

<!DOCTYPE TS>

<TS version="2.1" language="zh_CN">

<context>

    <name>Charater</name>

    <message>

        <location filename="Charater.js" line="7"/>

        <source>ChineseLocalize</source>

        <translation>中文国际化</translation>

    </message>

    <message>

        <location filename="Charater.js" line="8"/>

        <source>ExchangeLanguage</source>

        <translation>切换语言</translation>

    </message>

</context>

</TS>

每一个字段存在<message>中,<source>是原文,<translation>是翻译后的文字

2.使用XmlListModel读取xml文本

 

3.将读取到的文字动态绑定到需要用到的属性上即可实现动态语言切换,非常高效方便,推荐使用

 

 

注意:

  1. 如果在qm文件没有找到翻译的文本,会使用原始的文本
  2. 在C++和js文件定义tr(“中文”)和qsTr(“中文”)扫描出来的会是乱码,除非把中文换成unicode字符,但是这样可读性很差

 

建议:

  1. 以英文为初始语言
  2. 如果需要更多其它扫描规则,自行查阅lupdate用法(使用命令行即可查看)
  3. 需要翻译的文字统一放在一个文件方便管理,可以自定义多国语言的xml文件,利用linguist翻译,自行读取xml的翻译好的文字,个人觉得这是一种效率更高而且更加灵活方便的做法,既去除了qsTr和Qt本地化工具的限制,又可以做到和Qt本地化工具的完美兼容

 

源码链接:https://download.csdn.net/download/weixin_28927079/11357386

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Qt多国语言动态切换(含源代码) 的相关文章

  • Qt/c++ 随机字符串生成[重复]

    这个问题在这里已经有答案了 我正在创建一个应用程序 需要生成多个随机字符串 几乎就像一个由一定长度的 ASCII 字符组成的唯一 ID 这些字符混合有大写 小写 数字字符 有没有 Qt 库可以实现这一点 如果没有 在纯 C 中生成多个随机字
  • QSpinBox 输入 NaN 作为有效值

    我正在尝试扩展 QSpinBox 以能够输入 NaN 或 nan 作为有效值 根据文档 我应该使用 textFromValue valueFromText 和 validate 函数来完成此操作 但我无法让它工作 因为它仍然不允许我输入除数
  • Qt Creator:如何区分 win32 和 win64

    我必须在 pro 文件中执行类似的操作 win32 LIBS L 3rdparty libusb win32 lib msvc llibusb else win64 LIBS L 3rdparty libusb win32 lib msvc
  • Qt中如何获取鼠标在屏幕上的位置?

    我想获取屏幕上的鼠标坐标 我怎样才能在 Qt 中做到这一点 在 Windows 上 使用 C 我正在做类似答案中建议的事情对于这个问题 https stackoverflow com q 11737665 1420197 正如文档所述 QC
  • Qt:将拖放委托给子级的最佳方式

    我在 QWidget 上使用拖放 我重新实现了 DragEnterEvent dragLeaveEvent dragMoveEvent 和 dropEvent 效果很好 在我的 QWidget 中 我有其他 QWidget 子级 我希望它们
  • GoQt 致命错误:QAbstractAnimation:没有这样的文件或目录

    我尝试编译 Qt 来开发桌面应用程序 我按照 Qt 网站上的官方 wiki 指南的说明进行操作 当我尝试go run示例文件夹中的示例 我收到错误 去运行 home pinkya rabbit workspace go1programs s
  • 如何在模型更改时停止ListView“跳跃”

    我需要做什么 我需要创建一个聊天窗口用一个ListView在 QML 中存储聊天消息 我设置listView positionViewAtEnd 以便跟踪最后的消息 我禁用positionViewAtEnd当我向上滚动时 我可以阅读过去的消
  • 从布局中按名称获取小部件

    如果我想从 python Qt 的布局中获取特定的小部件 我应该如何进行 到目前为止我所做的 for i in range self ui horizontalLayout 14 count here it does fail name s
  • QGraphicsScene::clear 不会改变 sceneRect

    我有一个 QGraphicsScene 场景 和 QGraphicsView graphicsView 我有一个画图的方法 当我需要重绘所有图形时 我调用这个方法 一切都好 但我意识到 scene gt clear 不会改变 sceneRe
  • Qt 文件对话框默认后缀不起作用

    我将以下代码用于 QtQuick Dialogs 1 3 和 Qt 5 10 0 下 filedialog 的新属性 我使用 Qt Creator 5 10 默认套件构建它 import QtQuick 2 10 import QtQuic
  • 如何将图像显示为缩略图

    我有一个QTreeView显示硬盘驱动器和目录 我也有一个QListView显示图像文件如下 但我想将图像显示为缩略图 如下所示 My code mainWidget mainWidget QWidget parent QWidget pa
  • QCombobox 向下箭头图像

    如何更改Qcombobox向下箭头图像 现在我正在使用这个 QSS 代码 但这不起作用 我无法删除向下箭头边框 QComboBox border 0px QComboBox down arrow border 0px background
  • 更改 Qt OpenGL 窗口示例以使用 OpenGL 3.3

    我正在尝试更改 Qt OpenGL 示例以使用更现代的 opengl 版本 330 似乎合适 所以我做了 在 main cpp 上设置版本和配置文件 设置着色器版本 更改着色器以使用统一 它现在构建没有任何错误 但我只看到一个空白窗口 我错
  • 即使在可访问性中勾选应用程序,AXIsProcessTrustedWithOptions 也不会返回 true

    As this question https stackoverflow com questions 17693408 enable access for assistive devices programmatically on 10 9
  • 在 MacOS 终端上运行 ffmpeg [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我对 MacOS 相当陌生 我发现使用终端来获取信息并不容易ffmpeg和我在 Window 上一样正常运行 我有 ffmpeg 二进制文件ffmpe
  • Qt:如何连接到 SQLite?

    我安装了 SQLite3 解压到 c sqlite 创建了一个数据库 c sqlite mzsales 现在我试图在 QTableView 中显示其内容 QSqlDatabase db QSqlDatabase addDatabase QS
  • 将 gnuplot 嵌入现有 QtWidget 中

    我正在用 C 创建一个 伪 实时绘图应用程序 使用 gnuplot 作为绘图后端 我的要求之一是绘图必须位于现有窗口内 而不是有一个单独的绘图窗口 gnuplot 默认为 Gnuplot 有一个选项可以指定 Qt 小部件 ID 这似乎适合我
  • 无法在带有 QSortFilterProxyModel 的 QTreeView 的点击信号中使用 itemFromIndex

    我有一个 QTreeView 在视图和 QStandardItemModel 之间有一个 QSortFilterProxyModel 来对树进行排序 然后我想通过 clicked 信号对视图中的点击进行操作 模型 视图的设置类似于 mymo
  • 如何在 QtQuick 2 中对 QML TableView 进行排序?

    我想使用 Qt 5 1 实现具有自定义角色的可排序 TableView 但我不知道当用户单击标题时该怎么做才能对其进行排序 在我的 Qt pro 文件中 我添加了 android ios blackberry qtHaveModule wi
  • QSerialPort 中的 readAll() 不包括最后发送的响应

    我正在使用 Qt 来控制串行设备 如果我向串行设备发送命令 我会执行类似的操作serial gt write command r n 我制作了一个按钮 它将纯文本小部件内的文本更改为串行端口的响应 为了获得串口的响应 我使用serial g

随机推荐