You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
docuseal/简体中文支持部署指南.md

398 lines
11 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# DocuSeal 简体中文支持部署指南
## 概述
本文档记录了为 DocuSeal 开源电子签名平台添加完整简体中文zh-CN支持的整个过程包括后端 Rails i18n 翻译、前端 Vue 组件翻译、Dockerfile 国内镜像源适配,以及语言选项统一。
## 修改文件清单
| 文件 | 变更量 | 说明 |
|------|--------|------|
| `config/locales/i18n.yml` | +1070 行 | 新增 zh-CN 区域,完整中文翻译 |
| `app/javascript/submission_form/i18n.js` | +111 行 | 新增前端提交表单 zh 翻译对象 |
| `app/javascript/template_builder/i18n.js` | +226 行 | 新增前端模板编辑器 zh 翻译对象 |
| `app/controllers/accounts_controller.rb` | +16 行 | 统一语言选项列表 |
| `config/application.rb` | +1 行 | 添加 zh-CN 到可用语言列表 |
| `Dockerfile` | +19 行 | 添加国内镜像源加速构建 |
| `docker-compose.yml` | 版本锁定 | 锁定 PostgreSQL 和 Caddy 版本 |
---
## 一、i18n 中文翻译详情
### 1.1 后端 Rails 翻译config/locales/i18n.yml
在文件末尾(第 8088 行)新增 `zh-CN` 语言区域,采用 YAML 锚点继承模式:
```yaml
zh-CN:
<<: *en # 继承所有英文键作为回退
language_zh-CN: 中文 (简体)
sign_in: 登录
# ... 1000+ 条中文翻译
```
翻译覆盖范围:
- 登录/注册/密码重置流程
- 账户设置、偏好设置
- 文档模板管理(创建、编辑、归档)
- 签署流程(签名请求、提醒、完成通知)
- 邮件模板(签名请求邮件、提醒邮件、完成通知)
- 表单字段类型(文本、签名、日期、选择框等)
- API 参考、嵌入集成
- Webhook、SSO、SAML 配置
- 应用导览、分页
- 订阅计划、账单
- Devise 认证系统
- Doorkeeper OAuth 授权
- 所有系统通知/提示消息
**技术要点:**
- 使用 `<<: *en` 继承英文键,未翻译的键自动回退英文
- 配合 `config.i18n.fallbacks = [:en]` 双重保障
- 保留了所有插值变量(`%{name}`, `%{count}` 等)和 HTML 标签
### 1.2 前端提交表单翻译app/javascript/submission_form/i18n.js
新增 `zh` 翻译对象107 个键),覆盖:
- 表单进度提示
- 签名绘制操作(手绘、输入、上传)
- 字段类型名称
- 身份验证流程(短信/邮件验证码)
- 文件上传操作
- 支付界面
关键代码:
```js
const zh = {
step: '步骤',
sign_and_complete: '签署并完成',
draw_signature: '绘制签名',
// ... 107 个翻译键
}
const i18n = { en, es, it, de, fr, pl, uk, cs, pt, he, nl, ar, ko, ja, zh }
```
**技术要点:**
- 前端 locale 解析:`I18n.locale.to_s.split('-').first` → `"zh"`,匹配 `i18n["zh"]`
- 回退链:`i18n[locale] → i18n[browserLang] → i18n.en → key`
### 1.3 前端模板编辑器翻译app/javascript/template_builder/i18n.js
新增 `zh` 翻译对象221 个键),覆盖:
- 字段绘制和编辑操作
- 参与方管理第1-20方
- 字段属性设置(字体、对齐、验证等)
- 条件逻辑配置
- 公式编辑器
- 修订版本管理
- PDF 密码保护
关键代码:
```js
const zh = {
fixed: '固定',
draw_field_on_the_document: '在文档上绘制字段',
// ... 221 个翻译键
}
export { en, es, it, pt, fr, de, nl, zh }
```
### 1.4 语言选项统一
`config/application.rb``available_locales` 包含 zh-CN完整 22 种语言)。
`accounts_controller.rb``LOCALE_OPTIONS` 从原来的 9 种扩展到 22 种,与 `available_locales` 完全一致:
```ruby
LOCALE_OPTIONS = {
'en-US' => 'English (United States)',
'en-GB' => 'English (United Kingdom)',
'fr-FR' => 'Français',
'es-ES' => 'Español',
'pt-PT' => 'Português',
'de-DE' => 'Deutsch',
'it-IT' => 'Italiano',
'nl-NL' => 'Nederlands',
'zh-CN' => '中文 (简体)',
'es' => 'Español',
'it' => 'Italiano',
'de' => 'Deutsch',
'fr' => 'Français',
'nl' => 'Nederlands',
'pl' => 'Polski',
'uk' => 'Українська',
'cs' => 'Čeština',
'pt' => 'Português',
'he' => 'עברית',
'ar' => 'العربية',
'ko' => '한국어',
'ja' => '日本語'
}.freeze
```
---
## 二、Dockerfile 国内镜像源适配
### 2.1 修改内容
| 构建阶段 | 包管理器 | 原地址 | 替换为国内镜像 |
|---------|---------|--------|---------------|
| download | Alpine apk | `dl-cdn.alpinelinux.org` | `mirrors.tuna.tsinghua.edu.cn` |
| webpack | Alpine apk | `dl-cdn.alpinelinux.org` | `mirrors.tuna.tsinghua.edu.cn` |
| webpack | RubyGems | `rubygems.org` | `gems.ruby-china.com` |
| webpack | Yarn/npm | `registry.yarnpkg.com` | `registry.npmmirror.com` |
| app | Alpine apk | `dl-cdn.alpinelinux.org` | `mirrors.tuna.tsinghua.edu.cn` |
| app | Bundler | `rubygems.org` | `gems.ruby-china.com` |
### 2.2 关键代码位置
**Alpine apk 镜像**3 个阶段均添加):
```dockerfile
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.tuna.tsinghua.edu.cn/g' /etc/apk/repositories
```
**RubyGems 镜像**webpack 阶段):
```dockerfile
gem sources --remove https://rubygems.org/ && \
gem sources -a https://gems.ruby-china.com/
```
**Bundler 镜像**app 阶段):
```dockerfile
bundle config set --global mirror.https://rubygems.org https://gems.ruby-china.com
```
**Yarn 镜像**webpack 阶段):
```dockerfile
yarn config set registry https://registry.npmmirror.com
```
### 2.3 GitHub 资源下载说明
以下资源仍直接从 GitHub 下载(未走镜像),因为它们通常通过 HTTPS 443 端口可以正常访问:
| 资源 | 大小 | 用途 |
|------|------|------|
| GoNotoKurrent 字体Regular + Bold | ~30MB | 文档默认字体 |
| DancingScript 字体 | ~200KB | 签名字体 |
| ONNX 模型文件 | ~10MB | 表单字段自动检测 |
| PDFium 二进制包 | ~30MB | PDF 渲染引擎 |
如果 GitHub 下载仍然超时,可手动下载后通过 Docker volume 挂载,或使用 `ghproxy.net` 等 GitHub 文件代理。
---
## 三、构建与部署
### 3.1 构建 Docker 镜像
```bash
cd /home/new211/my_project/DocuSeal/docuseal
# 构建镜像(首次约 15-30 分钟)
docker build -t docuseal-zh:latest .
# 如需完全重新构建(不使用缓存)
docker build -t docuseal-zh:latest . --no-cache
```
### 3.2 修改 docker-compose.yml
```yaml
services:
app:
depends_on:
postgres:
condition: service_healthy
image: docuseal-zh:latest # 改为本地构建的镜像
# image: docuseal/docuseal:latest # 原始镜像(无中文)
ports:
- 3000:3000
volumes:
- ./docuseal:/data/docuseal
environment:
- FORCE_SSL=${HOST}
- DATABASE_URL=postgresql://postgres:postgres@postgres:5432/docuseal
postgres:
image: postgres:17.5
volumes:
- './pg_data:/var/lib/postgresql/18/docker'
environment:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: postgres
POSTGRES_DB: docuseal
healthcheck:
test: ["CMD-SHELL", "pg_isready -U postgres"]
interval: 5s
timeout: 5s
retries: 5
```
### 3.3 启动服务
```bash
# 创建数据目录
mkdir -p ./docuseal ./pg_data
# 启动
docker compose up -d
# 查看日志
docker compose logs -f app
```
访问 `http://localhost:3000` 即可使用。
### 3.4 本地开发模式(不依赖 Docker
```bash
# 前提:已安装 Ruby 4.0+、Node.js、PostgreSQL、Yarn
# 安装依赖
bundle install
yarn install
# 编译前端
bin/shakapacker
# 准备数据库
bin/rails db:prepare
# 启动
bin/rails server
```
---
## 四、验证方法
### 4.1 快速验证(无需启动服务)
```bash
# 1. 验证 YAML 格式
ruby -ryaml -e "YAML.load_file('config/locales/i18n.yml')" && echo "YAML 格式正确"
# 2. 验证前端 JS 翻译键数量
node -e "import('./app/javascript/submission_form/i18n.js').then(m => console.log('zh 键数:', Object.keys(m.default.zh).length))"
node -e "import('./app/javascript/template_builder/i18n.js').then(m => console.log('zh 键数:', Object.keys(m.zh).length))"
# 3. 确认 zh-CN 已注册到可用语言列表
grep "zh-CN" config/application.rb
grep "zh-CN" app/controllers/accounts_controller.rb
```
预期输出:
- YAML 格式正确
- submission_form zh 键数: **106**
- template_builder zh 键数: **221**
- 两个 grep 命令均有输出
### 4.2 功能验证清单
启动服务后,按以下清单验证:
| 序号 | 页面 | 操作 | 预期结果 |
|------|------|------|---------|
| 1 | 登录页 `/` | 点击语言下拉菜单 | 显示 **中文 (简体)** 选项 |
| 2 | 登录页 | 选择中文 | 整个界面切换为中文 |
| 3 | 注册页 `/sign_up` | 查看表单 | 字段标签显示中文 |
| 4 | 登录后首页 | 查看导航 | 菜单项显示中文 |
| 5 | 模板创建 | 创建新模板 | 编辑器界面显示中文 |
| 6 | 模板编辑器 | 拖放字段 | 字段名称、设置面板显示中文 |
| 7 | 模板编辑器 | 查看参与方 | 第一方/第二方等显示中文 |
| 8 | 发送文档 | 添加收件人 | 表单和按钮显示中文 |
| 9 | 签署页面 | 以签署者身份打开 | 签名操作、按钮显示中文 |
| 10 | 账户设置 `/settings/account` | 查看语言下拉 | 包含完整 22 种语言选项 |
| 11 | 邮件模板 | 查看邮件设置 | 模板变量说明显示中文 |
| 12 | API 参考 | 查看 API 文档 | 界面显示中文 |
---
## 五、翻译回退机制
当某个翻译键在 `zh-CN` 中未定义时,系统按以下优先级查找:
```
zh-CN 翻译 → 英文翻译en→ 原始键名
```
具体实现:
1. **后端 Rails**`config.i18n.fallbacks = [:en]` + YAML `<<: *en` 锚点继承
2. **前端提交表单**`this.i18n[key] || i18n[lang]?.[key] || i18n[browserLang]?.[key] || i18n.en[key] || key`
3. **前端模板编辑器**:同上逻辑
---
## 六、常见问题
### Q1切换中文后部分文字仍显示英文
**原因**:前端 JS 翻译键缺失。检查对应 Vue 组件的 i18n.js 文件中是否有对应的 `zh` 键。
**解决**:在 `app/javascript/submission_form/i18n.js``template_builder/i18n.js``zh` 对象中补充缺失的键。
### Q2Docker 构建时 GitHub 下载超时?
**原因**:国内网络访问 GitHub 不稳定。
**解决方案(按优先级)**
1. 使用代理构建:
```bash
docker build --build-arg HTTP_PROXY=http://your-proxy:port \
--build-arg HTTPS_PROXY=http://your-proxy:port \
-t docuseal-zh:latest .
```
2. 手动下载资源文件,修改 Dockerfile 使用 `COPY` 替代 `wget`
3. 尝试不同的 GitHub 镜像代理(在 `wget` URL 前加前缀):
- `https://ghproxy.net/``https://ghproxy.com/`
- `https://mirror.ghproxy.com/`
### Q3如何添加更多中文语言变体如 zh-TW 繁体中文)?
```bash
# 1. 复制 zh-CN 翻译作为基础
# 2. 修改为繁体中文
# 3. 在 config/application.rb 的 available_locales 中添加 :'zh-TW'
# 4. 在 accounts_controller.rb 的 LOCALE_OPTIONS 中添加
# 5. 在前端 i18n.js 中添加 zh-TW 翻译对象
```
### Q4如何只构建前端翻译不重新构建整个 Docker 镜像)?
```bash
# 本地开发模式重新编译前端
bin/shakapacker
# 或者只重编译前端资源
yarn install && bin/shakapacker
```
---
## 七、文件变更完整差异
如需查看所有变更的完整差异:
```bash
git diff HEAD -- \
config/locales/i18n.yml \
app/javascript/submission_form/i18n.js \
app/javascript/template_builder/i18n.js \
app/controllers/accounts_controller.rb \
config/application.rb \
Dockerfile
```
---
> **文档版本**1.0
> **最后更新**2026-05-18
> **适用版本**DocuSeal (master branch)