Cool_Breeze 发表于 2024-3-21 11:39

PySide2多国语言

本帖最后由 Cool_Breeze 于 2024-3-21 11:44 编辑

## 创建一个配置项目文件

文本文件mul.pro,文件名和后缀名随意

### 文件配置格式要求

```
FORMS = mul.ui \
      mulDialog.ui

SOURCES += Mul.py \
            mulDialog.py

TRANSLATIONS = mul_zh_CN1.ts \
                mul_en-US1.ts

CODECFORTR = UTF-8

CODECFORSRC = UTF-8
```

- FORMS 窗口ui文件
- SOURCES 自己创建的文件(不是qt设计师转换的UI代码文件,有个坑)
- TRANSLATIONS 对应的翻译文件名
- CODECFORTR 翻译文件的编码
- CODECFORSRC 不清楚

以下未验证:

- DESTDIR = translations `DESTDIR`: 指定生成翻译文件的输出目录。
- CONFIG += source_location `CONFIG`: 指定配置选项,如是否在翻译文件中包含源码行号。
- DEFINES += QT_DEPRECATED_WARNINGS `DEFINES`: 定义预处理宏,用于条件编译相关的内容。
- INCLUDEPATH += include `INCLUDEPATH`: 指定额外的包含目录。

## 生成语言文件ts

pyside2-lupdate.exe 文件在PySide2的安装包目录,以及Python的Script目录

```bash
pyside2-lupdate.exe -verbose mul.pro -noobsolete
```

pyside2-lupdate.exe参数

```
Usage:
    pyside2-lupdate project-file
    pyside2-lupdate source-files -ts ts-files
Options:
    -helpDisplay this information and exit
    -noobsolete
         Drop all obsolete strings
    -verbose
         Explain what is being done
    -version
         Display the version of pyside2-lupdate and exit
```

默认ts文件状态:

```html
<context encoding="UTF-8">
    <name>MulDialog</name>
    <message encoding="UTF-8">
      <location filename="mulDialog.py" line="22"/>
      <source>经过了多少 %d 秒</source>
      <comment>备注</comment>
      <translation type="unfinished"></translation>
    </message>
</context>
```

小提示:

​                在变更UI控件或者自己的py文件后需要重新生成ts文件。但是ts文件会覆盖Qt语言专家以前编辑好的ts文件(导致翻译好的文件变成了默认状态。。。)。所以需要变更配置文件里面的ts文件名,这下知道为什么我的ts文件名后面有个1了吧。

## 使用Qt语言专家打开对应的ts文件

linguist.exe 文件在PySide2的安装包目录

使用快捷键Ctrl+b输入源信息

启动文件后,菜单栏文件打开可以多选ts文件



编辑好后点击菜单栏文件,然后选择发布全部,就能生成对应的qm文件了。

翻译好保存的ts文件状态:

```html
<context encoding="UTF-8">
    <name>MulDialog</name>
    <message encoding="UTF-8">
      <location filename="mulDialog.py" line="22"/>
      <source>软件已运行时长 %d 秒</source>
      <comment>备注</comment>
      <translation type="unfinished">The software has been running for %d seconds</translation>
    </message>
</context>
```

## tr与QCoreApplication.translate

QObject.tr的用法:

### (https://doc.qt.io/qt-6/qstring.html) QObject::tr(const char **sourceText*, const char **disambiguation* = nullptr, int *n* = -1)

sourceText 文本信息

disambiguation 备注

n 不知道怎么用

```python
self.ui.label.setText(self.tr('经过了多少 %d 秒', '备注') % (self._count))
```

QCoreApplication.translate 我用这个会乱码。

## 应用语言文件

应用大了以后动态切换语言很费力,建议重启变更。

程序启动加载语言文件:

```python
try:
    with APPCONFIG.open('r') as f:
      config = json.load(f)
except:
    config = {}
language = config.get('Language')
app = QApplication()
trans = QTranslator(app)
if language == 'en_us':
    trans.load('mul_en-US.qm')
else:
    trans.load('mul_zh-CN.qm')
app.installTranslator(trans)
```

动态切换语言文件:

每个UI文件对应生成的Python代码都有一个**retranslateUi**方法,

当变更语言后(调用app.installTranslator(trans))需要调用全部窗口的**retranslateUi**方法更新窗口

v.n.lee 发表于 2024-3-21 13:23

挺好的教程

lvhaiqiang 发表于 2024-3-21 15:05

参考了学废了 {:1_893:}
页: [1]
查看完整版本: PySide2多国语言