Qt多语言实现

2024-06-07 14:19 月霖 760

1.准备一个excel语言文件

2.编译qm文件

编写一个python脚本,将该excel转换为ts文件,并编译为qm文件。

  • ts文件(翻译源文件):ts文件是Qt中的翻译源文件,XML格式。它包含了源代码中的所有可翻译文本。ts文件的格式如下:
<?xml version="1.0" encoding="utf-8"?>
<TS language="zh_CN" version="2.1">
    <context>
        <message>
            <source>camera_graphics</source>
            <translation>照相机图像</translation>
        </message>
        <message>
            <source>tomography_graphics</source>
            <translation>X光断层图像</translation>
        </message>
    </context>
</TS>
  • qm文件(翻译目标文件):qm文件是Qt中的翻译目标文件,二进制格式。程序在运行时直接加载qm文件,而无需解析和处理XML格式的ts文件,从而提高程序的执行效率。

python脚本参考:

import openpyxl
import subprocess
from xml.dom.minidom import Document

def read_excel(file_path):
    # 打开 Excel 文件
    wb = openpyxl.load_workbook(file_path)
    
    # 读取所有 sheet 的数据
    all_rows = []
    for sheet_name in wb.sheetnames:
        sheet = wb[sheet_name]
        all_rows.extend([
            tuple(sheet.cell(row=row, column=col).value for col in range(1, sheet.max_column + 1))
            for row in range(2, sheet.max_row + 1)
        ])

    return all_rows


def create_ts_file(language, rows):
    # 创建 XML 文档
    doc = Document()
    ts = doc.createElement('TS')
    ts.setAttribute('version', '2.1')
    ts.setAttribute('language', language)
    doc.appendChild(ts)
    
    # 创建 <context> 元素
    context = doc.createElement('context')
    ts.appendChild(context)

    for row in rows:
        source, chinese, english = row

        # 创建 <message> 元素
        message = doc.createElement('message')

        # 创建 <source> 元素
        source_element = doc.createElement('source')
        source_element.appendChild(doc.createTextNode(source))
        message.appendChild(source_element)

        # 创建 <translation> 元素
        translation_element = doc.createElement('translation')
        translation_element.appendChild(doc.createTextNode(chinese if language == 'zh_CN' else english))
        message.appendChild(translation_element)

        context.appendChild(message)

    # 将 XML 写入文件,设置缩进和换行
    xml_str = doc.toprettyxml(indent="    ", encoding='utf-8').decode('utf-8')
    ts_file_path = f'lang_{language}.ts'
    with open(ts_file_path, 'w', encoding='utf-8') as file:
        file.write(xml_str)
        
    # 调用 lrelease 命令编译 .ts 文件为 .qm 文件
    subprocess.run(['lrelease', ts_file_path])

if __name__ == "__main__":
    # 读取 Excel 文件数据
    excel_data = read_excel("test.xlsx")

    for language in ["zh_CN", "en"]:
        # 生成每个语言的 .ts 文件
        create_ts_file(language, excel_data)

执行完成后,得到4个文件:lang_zh_CN.ts、lang_en.ts、lang_zh_CN.qm、lang_en.qm,最终放到Qt的是两个qm文件。

3.在Qt中使用

1)使用QTranslator加载qm文件,并调用QApplication的installTranslator函数来装载:

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QTranslator translator;
    translator.load(":/language/lang_en.qm");
    a.installTranslator(&translator);

    // 省略...

    return a.exec();
}

2)在需要翻译的地方调用translate函数:

ui->graphicsTab->setTabText(0, QApplication::instance()->translate(0, "camera_graphics"));
ui->graphicsTab->setTabText(1, QApplication::instance()->translate(0, "tomography_graphics"));
第1个参数0表示全局范围,第2个参数为翻译文本的id。

第1个参数0表示全局范围,第2个参数为翻译文本的id。