实现qt的多语言转换

news2024/9/22 3:46:49

 前言:qt实现多语言转换主要,用到lrelease.exe,在QT下运行图片和语言转换,需要对对应格式的内容进行转换。图片语言,甚至是字体均是通过添加.qrc配置,来转换。图片转换成.rcc格式。而语言通过在.excel编辑,转换成.ts文件。.ts文件通过lrelease.exe转换成.qm文件。前者可能更简单一点,后者可以通过python来实现。

一、.qrc添加图片资源转换成.rcc格式

newpng.qrc中填入以下内容来检索对应的图片的路径

<RCC>
  <qresource prefix="/">
    <file>pagestart.gif</file>
    <file>CutPeaks-Fillvalleys.png</file>
    <file>CutPeaks-Fillvalleys_press.png</file>
    <file>LoginCombox.png</file>
    <file>page1_1.png</file>
    <file>page1_change.png</file>
    <file>DM_N4.png</file>
    <file>DM_N5.png</file>
    <file>DM_N6.png</file>
    <file>TC_CS.png</file>
    <file>TC_HS.png</file>
    <file>TC_PQ.png</file>
 </qresource>
</RCC>

在linux的含qrc的文件下执行下面的命令

rcc -binary newpng.qrc -o newpng.rcc

得到newpng.rcc,将含.rcc的文件拷到对应编译的路径下,来实现图片资源的加载

二、多语言的实现

多语言,需要自行编辑一个excel文件,电脑需要安装有qt。

①将自己需要翻译的内容整理在excel中

②确保自己有python环境,博主是在vscode中运行的

python解释器安装教程(3.10版本)-CSDN博客

language.qrc用在qt中检索用的--没什么好说的

template.ts无用的文件

geni18nts.py让excel中的各列文件转换成.ts文件

tsToqm.py让.ts文件转换成.qm文件(这个是我自己弄的,hhh)

language.qrc

<RCC>
  <qresource prefix="/">
    <file>en.qm</file>
    <file>zh.qm</file>
    <file>jp.qm</file>
 </qresource>
</RCC>
geni18nts.py


# 我的表格如下,这是一个通过excel生成翻译文件.ts的表 的需求,请使用python实现
#
# en	zh	jp
# hujintao	胡金涛	hujintao_jp
# huhuhu	呼呼呼	huhuhu_jp
# 使用xlwing库操作excel 读取数据
# 1.第一行表头的数据为生成的翻译文件的文件名,例如 en.ts zh.ts jp.ts 有多少列就生成多少个文件
# 2.下面的数据为翻译文件的context 原文使用en列的数据,每个翻译文件的译文使用表格中对应的列的数据
# 例如 en列的数据为 hujintao 那么zh列的数据为 胡金涛 jp列的数据为 hujintao_jp
# 生成模版为
# <?xml version="1.0" encoding="utf-8"?>
# <!DOCTYPE TS>
# <TS version="2.1" language="ja_JP">
# <context>
#     <message>
#         <source>huhuhu</source>
#         <translation type="unfinished">テキストラベル2</translation>
#     </message>
# </context>
# </TS>
# 及 在<context> 块中往下写 使用jinja2模版
import xlwings as xw
from jinja2 import Environment, FileSystemLoader
import subprocess
# 打开Excel文件并读取数据
xlsxApp = xw.App(visible=True, add_book=False)
xlsxApp.display_alerts = False
xlsxApp.screen_updating = False
wb = xlsxApp.books.open("./翻译源文件.xlsx")
sheet = wb.sheets[0]
data = sheet.range("A1").options(expand="table").value

# 读取第一行的数据作为文件名
file_names = data[0]

# 读取剩余的数据作为文件内容 去重
contents = data[1:]
en_set = set()
new_contents = []
# 遍历 contents ,删除重复的数据 ,并不是连续的
for content in contents:
    if(content[0] == "" or content[0] == None): # 去除空行
        continue
    if content[0] not in en_set:
        en_set.add(content[0])
        new_contents.append(content)


# 设置jinja2模板环境
env = Environment(loader=FileSystemLoader("./"))

# 对于每一列数据,生成一个.ts文件
for i, file_name in enumerate(file_names):
    # 加载模板
    template = env.get_template("./template.ts")

    # 生成文件内容
    file_content = template.render(contents=[(content[0], content[i]) for content in new_contents])

    # 写入文件
    with open(f"./{file_name}.ts", "w", encoding="utf-8") as f:
        f.write(file_content)

# 关闭Excel
wb.save()
wb.close()
xlsxApp.quit()
# 执行 cmd 命令 "E:\qt\qtEnv\sqlite3\aaa\bin\lrelease.exe D:/downloads/QtI18NProject-master/QtI18NProject-master/QtI18NProject.pro"
# subprocess.run(r'"D:\sqlite3\aaa\bin\lrelease.exe" "myqtui.pro"', shell=True)
subprocess.run(r'"E:\qt\qtEnv\sqlite3\aaa\bin\lrelease.exe" "myqtui.pro"', shell=True)

geni18nts.py注意:需要在相对路径下执行,如果你E:\qt\qtEnv\sqlite3\aaa\bin\lrelease.exe中没有lrelease.exe,则需要我的第二份代码。

有的话则需要改一下它的路径

import os
import subprocess

def convert_ts_to_qm(directory):
    # 遍历指定目录下的所有文件
    for root, dirs, files in os.walk(directory):
        for file in files:
            # 如果文件是 .ts 文件
            if file.endswith(".ts"):
                ts_file = os.path.join(root, file)
                qm_file = ts_file.replace(".ts", ".qm")
                
                # 生成对应的 .qm 文件
                command = [r"C:\Qt\Qt5.9.0\5.9\winrt_x86_msvc2017\bin\lrelease.exe", ts_file, "-qm", qm_file]  # 指定 lrelease 的完整路径
                try:
                    subprocess.run(command, check=True)
                    print(f"Generated {qm_file} successfully.")
                except subprocess.CalledProcessError as e:
                    print(f"Error generating {qm_file}: {e}")
                except FileNotFoundError:
                    print("lrelease not found. Please check the path.")

if __name__ == "__main__":
    # 指定包含 .ts 文件的路径
    directory = r"F:\translate"
    convert_ts_to_qm(directory)

生成qm文件

有了qm文件就可以执行翻译了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2055591.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

觉飞内衣洗衣机怎么样?各维度专业剖析觉飞、希亦、由利三大机型

由于我们的内衣、内裤和袜子等等贴身小件衣物的清洁频率比一般的衣物要高。而且&#xff0c;如果我们人工手洗的话&#xff0c;不仅会大大浪费了我们的时间&#xff0c;而且还不能进行对这些贴身的以为进行深层消毒和除菌。这种情况下&#xff0c;就得需要一台专门用于清洗内衣…

Passware Kit Mobile

Passware Kit Mobile Passware Kit Mobile年度许可证最多支持 300 次成功移动设备提取&#xff0c;并且每年可续订。年度试用许可证最多支持 5 次成功提取。 从移动设备提取和解密用户数据的取证工具。 最先进的移动取证工具 Passware 取证产品被世界顶级执法机构用于破获需要解…

编译Android使用的ffmpeg库

1 下载NDK 官网&#xff1a;NDK 下载 | Android NDK | Android Developers 2 下载ffmpeg 官网&#xff1a;FFmpeg 3 下载配置msys2 在我之前的博客中有写windows下编译ffmpeg 最详细教程_windows 编译 ffmpeg-CSDN博客 4 编写编译脚本 在ffmpeg的路径下新建一个脚本…

【原创教程】电气电工06:打孔攻丝篇

打孔攻丝,是我们电气电工工作中经常遇到的,比如我们要在某个地方安装一个传感器,我们需要固定在底板上,这时候就需要我们会这个基本技能;我们在柜内布局安装板时,也需要进行打孔攻丝。 下面我们介绍一下这项技能。 首先我们先要熟悉钻头和丝锥,我们来…

STM32标准库学习笔记-11.I2C通信

参考教程&#xff1a;【STM32入门教程-2023版 细致讲解 中文字幕】 I2C通信 I2C&#xff08;Inter IC Bus&#xff09;是由Philips公司八十年代推出的一种通用数据总线两根通信线&#xff1a;SCL&#xff08;Serial Clock&#xff09;、SDA&#xff08;Serial Data&#xff0…

适用于所有Android手机的5个最佳Android手机解锁工具

在当今互联互通的世界中&#xff0c;我们移动设备的安全至关重要。但是&#xff0c;由于忘记密码、屏幕破裂或其他不可预见的问题&#xff0c;用户可能会发现自己被锁定在 Android 设备之外。为了满足这一需求&#xff0c;出现了各种 Android 解锁工具&#xff0c;提供创新的解…

CMake编译不同文件目录下的C++文件

由于我们构建一个项目的时候&#xff0c;通常不会将所有的源文件放在一个文件目录下&#xff0c;这样既不方便开发&#xff0c;也不方便源码阅读&#xff0c;我们通常会对项目文件进行分层&#xff0c;比如分为include、src、res、lib这些目录&#xff0c;src下又分为model、co…

解决怎样在使用Signal Tap进行在线调试时,单独编译工程没有报错,而在Signal tap添加了信号之后进行时编译报错。

问题 如下图所示&#xff0c;我们在Signal Tap中添加完相应的信号之后对于工程进行重新编译时&#xff0c;显示报错信息&#xff1a; 报错原因 这里错误显示的时我们使用的设备只有30个 类型为M9K的RAM位置。然而&#xff0c;当前设计需要超过30个位置才能成功适配。意思就是…

<Linux> 进程控制

目录 一、进程创建 1. fork函数 2. fork函数返回值 3. 写时拷贝 4. fork常规用法 5. fork调用失败原因 6. 如何创建多个子进程&#xff1f; 二、进程终止 1. 进程退出场景 2. 进程退出码 3. errno 4. 进程异常退出 5. 进程常见退出方法 5.1 return退出 5.2 exit退出 5.3 _ex…

JavaFX入门01 制作简易计算器

目录 利用JavaFX Scene Builder 2.0制作图形界面将fxml文件导入IDEA中&#xff0c;并添加JavaFX相关依赖定义启动类&#xff0c;呈现界面定义控制类&#xff0c;实现具体逻辑运行代码&#xff0c;进行测试 利用JavaFX Scene Builder 2.0制作图形界面 制作完成后&#xff0c;将其…

C语言之“ 数组 ”

&#x1f339;个人主页&#x1f339;&#xff1a;喜欢草莓熊的bear &#x1f339;专栏&#x1f339;&#xff1a;C语言基础 目录 前言 一、数组 二、一维数组 2.1 一维数组的创建和初始化 数组创建 数组初始化 数组类型 2.2 一维数组的使用 数组下标 数组打印 数组输…

Spring由于后端逻辑,前端无法展示数据

1.Spring由于后端逻辑&#xff0c;前端无法展示数据 1.代码详情 后端逻辑&#xff1a;在ctroller层&#xff0c;调用getList方法返回的是List列表 使用枚举类来定义了状态码&#xff1a; 状态码SUCCESS返回result类 前端代码&#xff0c;if条件里面是根据自定义的状态码来进…

RM集团在造船中应用虚拟现实辅助工程技术

船舶内饰中的虚拟现实辅助工程 设计船舶内饰是一项资源密集型任务&#xff0c;全球范围内有数百名工程师参与到大型造船项目中。如今&#xff0c;作为船舶内饰设计领域的专家&#xff0c;R&M集团正在利用虚拟现实辅助工程(VAE)技术&#xff0c;优化开发流程。 从游轮上的餐…

浅谈如何克服编程学习中的挫折感

目录 1.概述 2.心态调整 3.学习方法 3.1. 基础知识的打牢 3.2. 分解问题 3.3. 理论与实践相结合 3.4. 利用在线资源和社区 3.5. 教学 3.6. 定期复习与总结 3.7. 持续学习和适应新技术 3.8. 解决实际问题 4.成功经验 5.总结 1.概述 在编程学习的过程中&#xff0c…

【流媒体】RTMPDump—RTMP_ConnectStream(创建流连接)

目录 1. RTMP_ConnectStream函数1.1 读取packet&#xff08;RTMP_ReadPacket&#xff09;1.2 解析packet&#xff08;RTMP_ClientPacket&#xff09;1.2.1 设置Chunk Size&#xff08;HandleChangeChunkSize&#xff09;1.2.2 用户控制信息&#xff08;HandleCtrl&#xff09;1…

灵创空间:打造健康与创意融合的全新文化体验

近日&#xff0c;备受瞩目的灵创空间品牌正式亮相&#xff0c;致力于为顾客提供健康、舒适且富有文化氛围的环境。灵创空间专注于研发中高端健康饮品&#xff0c;精选国内外优质健康原料&#xff0c;推出符合现代人需求的平价高品质饮品。在满足消费者健康需求的同时&#xff0…

【Word多级标题完整设置】设置各级标题样式将多级列表链接到各级标题样式中

Word多级标题完整设置 一、设置各级标题样式主标题样式设置中英文字体、字形以及字号设置段落设置&#xff08;缩进、间距和行距&#xff09; 一级标题样式设置中英文字体、字形以及字号设置段落设置&#xff08;缩进、间距和行距&#xff09; 二级标题样式设置中英文字体、字形…

OurTV v3.1.1 — 完全免费,播放流畅的电视直播软件

OurTV是一款专业的魔改大屏版开源电视直播软件&#xff0c;与“我的电视”类似&#xff0c;内含丰富的电视频道&#xff0c;完全免费且无广告&#xff0c;画质清晰&#xff0c;播放流畅&#xff0c;提供良好的观影体验。此外&#xff0c;该软件还提供手机版。 链接&#xff1a…

AM32开源代码之代码分析 - DSHOT/BDSHOT

AM32开源代码之代码分析 - DSHOT/BDSHOT 1. 源由2. 协议设计2.1 位格式2.2 帧结构2.3 CRC计算2.4 帧格式&#xff08;eRPM&#xff09;2.4.1 DSHOT2.4.2 BDSHOT 2.5 EDT编码策略2.5 eRPM传输 3. 框架设计3.1 初始化3.2 动态过程3.2.1 飞控触发3.2.2 定时触发 3.3 协议检测3.3.1…

JS day0820

ok了家人们今天学习Dom对象&#xff0c;和一个综合案例&#xff0c;一起去看看吧。 一.BOM对象 Browser Object Model 浏览器对象模型。 JavaScript 将浏览器的各 个组成部分封装为对象 Window &#xff1a;浏览器窗口对象。 对象表示浏览器中打开的窗口Navigator&#xff1…