Skip to content

Commit

Permalink
✨ feat(docker): 编译过程放入 Dockerfile
Browse files Browse the repository at this point in the history
  • Loading branch information
lutinglt committed Nov 23, 2024
1 parent 0b457e8 commit e09911a
Show file tree
Hide file tree
Showing 9 changed files with 93 additions and 13,561 deletions.
5 changes: 1 addition & 4 deletions .dockerignore
Original file line number Diff line number Diff line change
@@ -1,5 +1,2 @@
generate_locales.py
generate_messages.py
.gitea
locales
.github
target
23 changes: 13 additions & 10 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -1,8 +1,15 @@
FROM apache/superset:4.1.1-py311

COPY messages.json /app/superset/translations/zh/LC_MESSAGES/messages.json
COPY messages.po /app/superset/translations/zh/LC_MESSAGES/messages.po
# 构建翻译文件(请勿替换FROM)
FROM python:3.12.6-slim-bookworm AS builder
COPY . /app
WORKDIR /app
RUN pip install --no-cache-dir --upgrade pip &&\
pip install --no-cache-dir -r requirements.txt &&\
python generate_locales.py && python generate_messages.py

# 将翻译导入镜像(此处替换所需的官方版本)
FROM apache/superset:4.1.1-py311
COPY --from=builder /app/messages.json /app/superset/translations/zh/LC_MESSAGES/messages.json
COPY --from=builder /app/target/messages.mo /app/superset/translations/zh/LC_MESSAGES/messages.mo
USER root
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime &&\
export DEBIAN_FRONTEND=noninteractive &&\
Expand All @@ -13,11 +20,7 @@ RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime &&\
pip install psycopg2 mysqlclient &&\
# 默认语言
sed -i "s/BABEL_DEFAULT_LOCALE = \"en\"/BABEL_DEFAULT_LOCALE = \"zh\"/" /app/superset/config.py &&\
sed -i "s/LANGUAGES = {}/LANGUAGES = {\"zh\": {\"flag\": \"cn\", \"name\": \"简体中文\"}, \"en\": {\"flag\": \"us\", \"name\": \"English\"}}/" /app/superset/config.py &&\
# 清理不需要的翻译
cd /app/superset/translations &&\
rm -rf ar de es fr it ja ko nl pt pt_BR ru sk sl tr uk zh-TW &&\
# 翻译
pybabel compile -d /app/superset/translations || true
# 打开语言切换
sed -i "s/LANGUAGES = {}/LANGUAGES = {\"zh\": {\"flag\": \"cn\", \"name\": \"简体中文\"}, \"en\": {\"flag\": \"us\", \"name\": \"English\"}}/" /app/superset/config.py

USER superset
90 changes: 64 additions & 26 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,9 @@

[PR: 29476](https://github.com/apache/superset/pull/29476) 这个提交中删除了大量的中文翻译,导致 Superset 的中文翻译质量大幅下降, 在这次提交后便没有人再对中文翻译进行维护。

本项目基于 [PR: 27922](https://github.com/apache/superset/pull/27922) 的最后一次中文翻译提交,为了方便维护翻译, 用 Python 构建了翻译脚本, 改变了汉化步骤, 先生成 messages.json, 再通过 json 生成 messages.po, 此过程修复了一些翻译文件无法正常生效的问题.
本项目基于 [PR: 27922](https://github.com/apache/superset/pull/27922) 的最后一次中文翻译提交,为了方便维护翻译, 用 Python 构建了翻译脚本, 改变了汉化步骤, 先生成 messages.json, 再通过 json 生成 messages.po 和 messages.mo, 此过程修复了一些翻译文件无法正常生效的问题.

## 使用方法
## 部署

### Docker 镜像

Expand All @@ -20,6 +20,40 @@
docker pull lutinglt/superset-zh
```

参考配置 docker-compose.yml

```yml
services:
superset:
image: lutinglt/superset-zh
container_name: superset
hostname: superset
restart: always
ports:
- 8080:8088
environment:
- TZ=Asia/Shanghai
volumes:
# sqlite 存储持久化
- ./superset:~/.superset
# 导入配置文件
- ./superset_config.py:/app/pythonpath/superset_config.py
```
参考配置 superset_config.py
```python
SECRET_KEY = 'superset'
SQLALCHEMY_DATABASE_URI = 'postgresql://superset:superset@postgres/superset'
WTF_CSRF_ENABLED = False
TALISMAN_ENABLED = False
BABEL_DEFAULT_LOCALE = "zh"
LANGUAGES = {
"zh": {"flag": "cn", "name": "简体中文"},
"en": {"flag": "us", "name": "English"},
}
```

#### 手动构建

```bash
Expand All @@ -36,35 +70,37 @@ docker build -t lutinglt/superset-zh .
### 手动汉化

找到 Superset 安装目录下的 `translations` 目录, 找到 `zh/LC_MESSAGES` 目录, 直接将项目仓库里的 `messages.json``messages.po` 文件复制到 `zh/LC_MESSAGES` 目录下, 然后运行:
找到 Superset 安装目录下的 `translations` 目录, 找到 `zh/LC_MESSAGES` 目录

```bash
# 替换成自己的安装目录下的 translations 目录
pybabel compile -d superset/translations
```
下载最新版本的 `messages.json``messages.mo` 文件复制到 `zh/LC_MESSAGES` 目录下

重启 Superset 查看汉化效果.

> [!IMPORTANT]
>
> config.py 里的 `BABEL_DEFAULT_LOCALE` 变量会影响标题栏的汉化, 默认为 `en`, 修改为 `zh` 重新编译即可.
> [!IMPORTANT]
>
> config.py 里的 `LANGUAGES` 变量为空会关闭语言选择框, 默认为空, 参考配置:
```python
BABEL_DEFAULT_LOCALE = "zh"
LANGUAGES = {
"zh": {"flag": "cn", "name": "简体中文"},
"en": {"flag": "us", "name": "English"},
}
```
>
>```python
>LANGUAGES = {
> "zh": {"flag": "cn", "name": "简体中文"},
> "en": {"flag": "us", "name": "English"},
>}
>```
> [!NOTE]
>
> superset_config.py 会覆盖 config.py 里的配置, 优先级更高.
> [!TIP]
>
> config.py 里的 `BABEL_DEFAULT_LOCALE` 变量可能会影响标题栏的汉化, 默认为 `en`, 如果标题栏没有汉化修改为 `zh` 下载最新的 `messages.po` 重新编译即可.
>
>```python
># 替换成自己的安装目录下的 translations 目录
># 编译报错请无视
>pybabel compile -d superset/translations
>```
> [!TIP]
>
> Superset 2.1.0 之后安装的默认安全选项更为严格, 部署后登录不上, 或无法启动推荐添加以下配置
Expand All @@ -76,21 +112,23 @@ LANGUAGES = {
> CONTENT_SECURITY_POLICY_WARNING = False # 关闭内容安全策略警告
> ```
## 脚本说明
## 脚本
脚本依赖 `babel``polib` 并基于 Python 3.12 构建, 其中使用了一些类型注解可能会影响兼容性, 如有报错请自行删除, Python >= 3.8 理论上都可以直接运行.
```bash
pip install babel polib
```
> [!IMPORTANT]
>
> 脚本基于 Python 3.12 构建, 其中使用了一些类型注解可能会影响兼容性, 如有报错请自行删除, Python >= 3.8 理论上都可以直接运行, 安装依赖运行命令:
>
>```bash
>pip install -r requirements.txt
>```
### `generate_locales.py`
基于 Superset 项目下的 `superset/translations/messages.pot``superset/translations/zh/LC_MESSAGES/messages.po` 生成最新的需要翻译的内容, 然后取本项目下 `messages.json` 已翻译的部分覆盖需要翻译的内容, 生成全部翻译条目(包含未翻译)和筛选出未翻译的条目的 json 文件, 进行手动校验翻译过程, 方便补充新翻译和修改已翻译内容, 具体查看脚本中的文档注释内容.
### `generate_messages.py`
根据已经翻译的内容生成 Superset 前端需要的 `messages.json``messages.po`, 具体查看脚本中的文档注释内容.
根据已经翻译的内容生成 Superset 前端需要的 `messages.json``messages.mo`, 具体查看脚本中的文档注释内容.
## 贡献
Expand Down
15 changes: 8 additions & 7 deletions generate_locales.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,44 +2,45 @@
# -*- coding:utf-8 -*-
"""
所有文件统一使用 utf-8 编码, 行尾统一使用 LF
运行前请下载最新的 messages.pot 和 messages.po 文件, 并放置在 locales 目录下 (鉴于网络原因, 不使用脚本请手动下载)
运行前请下载最新的 messages.pot 和 zh/messages.po 文件, 并放置在 translations 目录下
(鉴于网络原因, 不使用脚本请手动下载) (不需最新无需下载, 直接使用项目中的文件即可)
https://github.com/apache/superset/blob/master/superset/translations/messages.pot
https://github.com/apache/superset/blob/master/superset/translations/zh/LC_MESSAGES/messages.po
先在项目的当前目录运行该脚本, 生成 target 待翻译目录
target/tmp/messages.json : 保存所有翻译, 用于修改现有翻译(如果补充翻译会被filter_messages.json覆盖)
target/tmp/filter_messages.json : 保存未翻译的, 用于补充翻译
target/tmp/plural_messages.json : 保存复数翻译, 标记文件, 请勿修改
target/tmp/messages.po : 翻译模版, 用于核对参考
完善翻译后, 在项目的当前目录运行 generate_messages.py
"""

import json
import os

import polib
from babel.messages.frontend import CommandLineInterface

if __name__ == "__main__":
os.makedirs("target/tmp", exist_ok=True)
# 根据最新的翻译模版 messages.pot 生成新的 messages.po
argv = ["pybabel", "init", "-i", "locales/messages.pot", "-d", "target/locales", "-l", "en"]
CommandLineInterface().run(argv)
pot_file = polib.pofile("translations/messages.pot")
pot_file.save("target/tmp/messages.po")

# 读取旧的 messages.json
with open("messages.json", "r", encoding="utf-8") as f:
old_trans = json.load(f)["locale_data"]["superset"]
del old_trans[""]

# 读取新的 messages.po
po = polib.pofile("target/locales/en/LC_MESSAGES/messages.po")
po = polib.pofile("target/tmp/messages.po")
new_trans = {entry.msgid: entry.msgstr for entry in po}
plural_trans = {entry.msgid: entry.msgid_plural for entry in po if entry.msgstr_plural}

# 新的 messages.po 合并新的中文 messages.po 和旧的 messages.json
zh_po = polib.pofile("locales/zh/LC_MESSAGES/messages.po")
zh_po = polib.pofile("translations/zh/LC_MESSAGES/messages.po")
new_trans.update({zh_entry.msgid: zh_entry.msgstr for zh_entry in zh_po})
new_trans.update(old_trans)

# 生成新的 messages.json
os.makedirs("target/tmp", exist_ok=True)
with open("target/tmp/messages.json", "w", encoding="utf-8") as f:
json.dump(new_trans, f, ensure_ascii=False, indent=2, sort_keys=True)

Expand Down
11 changes: 6 additions & 5 deletions generate_messages.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
#!/bin/python
# -*- coding:utf-8 -*-
"""
该脚本运行后,会生成 target/messages.json, 并将 target/messages.json 转换为 target/messages.po
检查无误后, 请使用默认配置的 prettier 格式化 target/messages.json
手动覆盖根目录下的 messages.json 和 messages.po, 之后提交代码
该脚本运行后,会生成 target/messages.json, 并将 target/messages.json 转换为 target/messages.po 和 target/messages.mo
检查核对无误后, 请使用默认配置的 prettier 格式化 target/messages.json
手动覆盖根目录下的 messages.json, 之后提交代码
"""

import json
Expand Down Expand Up @@ -36,8 +36,8 @@
with open("target/messages.json", "w", encoding="utf-8") as f:
json.dump(trans, f, ensure_ascii=False, indent=2, sort_keys=True)

# 生成 messages.po
zh_po = polib.pofile("locales/zh/LC_MESSAGES/messages.po")
# 生成 messages.po & messages.mo
zh_po = polib.pofile("translations/zh/LC_MESSAGES/messages.po")
po = polib.POFile()
po.metadata = zh_po.metadata
po_trans = {k: v[0] if isinstance(v, list) else v for k, v in trans["locale_data"]["superset"].items()}
Expand All @@ -56,3 +56,4 @@
)
po.append(entry)
po.save("target/messages.po")
po.save_as_mofile("target/messages.mo")
Loading

0 comments on commit e09911a

Please sign in to comment.