Skip to content

Commit e09911a

Browse files
committed
✨ feat(docker): 编译过程放入 Dockerfile
1 parent 0b457e8 commit e09911a

File tree

9 files changed

+93
-13561
lines changed

9 files changed

+93
-13561
lines changed

.dockerignore

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,2 @@
1-
generate_locales.py
2-
generate_messages.py
3-
.gitea
4-
locales
1+
.github
52
target

Dockerfile

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,15 @@
1-
FROM apache/superset:4.1.1-py311
2-
3-
COPY messages.json /app/superset/translations/zh/LC_MESSAGES/messages.json
4-
COPY messages.po /app/superset/translations/zh/LC_MESSAGES/messages.po
1+
# 构建翻译文件(请勿替换FROM)
2+
FROM python:3.12.6-slim-bookworm AS builder
3+
COPY . /app
4+
WORKDIR /app
5+
RUN pip install --no-cache-dir --upgrade pip &&\
6+
pip install --no-cache-dir -r requirements.txt &&\
7+
python generate_locales.py && python generate_messages.py
58

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

2326
USER superset

README.md

Lines changed: 64 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,9 @@
66

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

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

11-
## 使用方法
11+
## 部署
1212

1313
### Docker 镜像
1414

@@ -20,6 +20,40 @@
2020
docker pull lutinglt/superset-zh
2121
```
2222

23+
参考配置 docker-compose.yml
24+
25+
```yml
26+
services:
27+
superset:
28+
image: lutinglt/superset-zh
29+
container_name: superset
30+
hostname: superset
31+
restart: always
32+
ports:
33+
- 8080:8088
34+
environment:
35+
- TZ=Asia/Shanghai
36+
volumes:
37+
# sqlite 存储持久化
38+
- ./superset:~/.superset
39+
# 导入配置文件
40+
- ./superset_config.py:/app/pythonpath/superset_config.py
41+
```
42+
43+
参考配置 superset_config.py
44+
45+
```python
46+
SECRET_KEY = 'superset'
47+
SQLALCHEMY_DATABASE_URI = 'postgresql://superset:superset@postgres/superset'
48+
WTF_CSRF_ENABLED = False
49+
TALISMAN_ENABLED = False
50+
BABEL_DEFAULT_LOCALE = "zh"
51+
LANGUAGES = {
52+
"zh": {"flag": "cn", "name": "简体中文"},
53+
"en": {"flag": "us", "name": "English"},
54+
}
55+
```
56+
2357
#### 手动构建
2458

2559
```bash
@@ -36,35 +70,37 @@ docker build -t lutinglt/superset-zh .
3670
3771
### 手动汉化
3872

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

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

4677
重启 Superset 查看汉化效果.
4778

48-
> [!IMPORTANT]
49-
>
50-
> config.py 里的 `BABEL_DEFAULT_LOCALE` 变量会影响标题栏的汉化, 默认为 `en`, 修改为 `zh` 重新编译即可.
51-
5279
> [!IMPORTANT]
5380
>
5481
> config.py 里的 `LANGUAGES` 变量为空会关闭语言选择框, 默认为空, 参考配置:
55-
56-
```python
57-
BABEL_DEFAULT_LOCALE = "zh"
58-
LANGUAGES = {
59-
"zh": {"flag": "cn", "name": "简体中文"},
60-
"en": {"flag": "us", "name": "English"},
61-
}
62-
```
82+
>
83+
>```python
84+
>LANGUAGES = {
85+
> "zh": {"flag": "cn", "name": "简体中文"},
86+
> "en": {"flag": "us", "name": "English"},
87+
>}
88+
>```
6389
6490
> [!NOTE]
6591
>
6692
> superset_config.py 会覆盖 config.py 里的配置, 优先级更高.
6793
94+
> [!TIP]
95+
>
96+
> config.py 里的 `BABEL_DEFAULT_LOCALE` 变量可能会影响标题栏的汉化, 默认为 `en`, 如果标题栏没有汉化修改为 `zh` 下载最新的 `messages.po` 重新编译即可.
97+
>
98+
>```python
99+
># 替换成自己的安装目录下的 translations 目录
100+
># 编译报错请无视
101+
>pybabel compile -d superset/translations
102+
>```
103+
68104
> [!TIP]
69105
>
70106
> Superset 2.1.0 之后安装的默认安全选项更为严格, 部署后登录不上, 或无法启动推荐添加以下配置
@@ -76,21 +112,23 @@ LANGUAGES = {
76112
> CONTENT_SECURITY_POLICY_WARNING = False # 关闭内容安全策略警告
77113
> ```
78114
79-
## 脚本说明
115+
## 脚本
80116
81-
脚本依赖 `babel``polib` 并基于 Python 3.12 构建, 其中使用了一些类型注解可能会影响兼容性, 如有报错请自行删除, Python >= 3.8 理论上都可以直接运行.
82-
83-
```bash
84-
pip install babel polib
85-
```
117+
> [!IMPORTANT]
118+
>
119+
> 脚本基于 Python 3.12 构建, 其中使用了一些类型注解可能会影响兼容性, 如有报错请自行删除, Python >= 3.8 理论上都可以直接运行, 安装依赖运行命令:
120+
>
121+
>```bash
122+
>pip install -r requirements.txt
123+
>```
86124
87125
### `generate_locales.py`
88126
89127
基于 Superset 项目下的 `superset/translations/messages.pot``superset/translations/zh/LC_MESSAGES/messages.po` 生成最新的需要翻译的内容, 然后取本项目下 `messages.json` 已翻译的部分覆盖需要翻译的内容, 生成全部翻译条目(包含未翻译)和筛选出未翻译的条目的 json 文件, 进行手动校验翻译过程, 方便补充新翻译和修改已翻译内容, 具体查看脚本中的文档注释内容.
90128
91129
### `generate_messages.py`
92130
93-
根据已经翻译的内容生成 Superset 前端需要的 `messages.json``messages.po`, 具体查看脚本中的文档注释内容.
131+
根据已经翻译的内容生成 Superset 前端需要的 `messages.json``messages.mo`, 具体查看脚本中的文档注释内容.
94132
95133
## 贡献
96134

generate_locales.py

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,44 +2,45 @@
22
# -*- coding:utf-8 -*-
33
"""
44
所有文件统一使用 utf-8 编码, 行尾统一使用 LF
5-
运行前请下载最新的 messages.pot 和 messages.po 文件, 并放置在 locales 目录下 (鉴于网络原因, 不使用脚本请手动下载)
5+
运行前请下载最新的 messages.pot 和 zh/messages.po 文件, 并放置在 translations 目录下
6+
(鉴于网络原因, 不使用脚本请手动下载) (不需最新无需下载, 直接使用项目中的文件即可)
67
https://github.com/apache/superset/blob/master/superset/translations/messages.pot
78
https://github.com/apache/superset/blob/master/superset/translations/zh/LC_MESSAGES/messages.po
89
先在项目的当前目录运行该脚本, 生成 target 待翻译目录
910
target/tmp/messages.json : 保存所有翻译, 用于修改现有翻译(如果补充翻译会被filter_messages.json覆盖)
1011
target/tmp/filter_messages.json : 保存未翻译的, 用于补充翻译
1112
target/tmp/plural_messages.json : 保存复数翻译, 标记文件, 请勿修改
13+
target/tmp/messages.po : 翻译模版, 用于核对参考
1214
完善翻译后, 在项目的当前目录运行 generate_messages.py
1315
"""
1416

1517
import json
1618
import os
1719

1820
import polib
19-
from babel.messages.frontend import CommandLineInterface
2021

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

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

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

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

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

generate_messages.py

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

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

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

0 commit comments

Comments
 (0)