英中 / 中英对照制作程序:操作指南
摘要 :本文介绍一款基于 Spring Boot + Thymeleaf + Bootstrap 的英中 / 中英对照制作程序,用于规范英语学习软件中词库与句库的导入文件。程序还原了 VB 版《英中/中英对照制作程序》的核心功能:文本规范化、中英对照制作、英中对照制作、对照文本保存,并补足了原程序声明了变量却未真正实现的段落数一致性检查功能。程序界面为三个文本框加一组命令按钮,支持文件上传(自动识别 UTF-8 / GBK 编码),完全离线可用。
本文目录
- [英中 / 中英对照制作程序:操作指南](#英中 / 中英对照制作程序:操作指南)
-
- 一、程序能解决什么问题
-
- [与原 VB 版的对应关系](#与原 VB 版的对应关系)
- 二、运行前的准备
-
- [2.1 环境要求](#2.1 环境要求)
- [2.2 打包与启动](#2.2 打包与启动)
- [2.3 目录结构](#2.3 目录结构)
- 三、界面说明
-
- [3.1 顶部使用提示条](#3.1 顶部使用提示条)
- [3.2 三个文本框](#3.2 三个文本框)
- [3.3 段落数一致性检查区](#3.3 段落数一致性检查区)
- [3.4 底部操作条](#3.4 底部操作条)
- 四、操作步骤详解
-
- 步骤一:载入文本
- 步骤二:规范化(可选)
- [步骤三:检查段落数 ★](#步骤三:检查段落数 ★)
- 步骤四:制作对照
- 步骤五:保存
- 五、核心算法说明
-
- [5.1 段落切分](#5.1 段落切分)
- [5.2 交替拼接](#5.2 交替拼接)
- [5.3 空缺占位](#5.3 空缺占位)
- 六、常见问题
-
- Q1:上传的中文文件显示乱码怎么办?
- Q2:提示「段落数不一致」,但我明明数出来一样?
- [Q3:对照文本里的 `######空缺#######` 需要手工替换吗?](######空缺#######` 需要手工替换吗?)
- Q4:能处理多大的文本?
- [Q5:为什么段首缩进是 4 个空格?](#Q5:为什么段首缩进是 4 个空格?)
- Q6:页面样式加载不出来?
- Q7:点击【保存对照文本】没有弹出「另存为」对话框?
- 七、测试与验证
-
- [7.1 单元测试](#7.1 单元测试)
- [7.2 接口级端到端测试](#7.2 接口级端到端测试)
- [7.3 真实浏览器交互测试](#7.3 真实浏览器交互测试)
- [7.4 「另存为」对话框测试](#7.4 「另存为」对话框测试)
- 八、小结
一、程序能解决什么问题
在制作英语学习软件的词库、句库时,原始的英文语料与中文译文往往格式杂乱:段落疏密不一、缩进不统一、中英行数对不上。人工整理既费时又容易出错。
本程序把这项工作标准化:载入中英文文本 → 规范化 → 校验段落数 → 一键生成对照文本 → 保存。生成的对照文本中,中英文段落交替排列、格式统一,既可直接导入词库句库,也便于学习者逐句对照阅读。
与原 VB 版的对应关系
| 原 VB 程序 | 本程序 | 说明 |
|---|---|---|
| 【打开中文文件】/【打开英文文件】 | 按钮 + 文件上传 | Web 版改用上传,自动识别 UTF-8 / GBK 编码 |
| 【规范中文文本】/【规范英文文本】 | 同名按钮 | 段与段之间空一行,段首空出 4 个字符 |
| 【制作中英对照】 | 同名按钮 | 中文段落在前、英文段落在后,交替排列 |
| 【制作英中对照】 | 同名按钮 | 英文段落在前,规则对称 |
| (原程序未实现) | 【检查英文段落数与中文段落数是否一致】 | 本版新增:逐项报出两侧段数、差值与缺段提示 |
| 【保存对照文本】 | 同名按钮 | 弹出「另存为」对话框,可自选位置与文件名 |
| 【清空文本框】 | 同名按钮 | 清空三个文本域 |
原程序在 VB 中声明了 NumEnglish 与 NumChinese 两个变量,用于记录中英文段数,但实际代码并未使用它们做比较。本版把这项功能补齐为独立按钮。
二、运行前的准备
2.1 环境要求
| 项目 | 版本 |
|---|---|
| JDK | 21 |
| Maven | 3.8 及以上 |
| 浏览器 | Chrome / Edge / Firefox 均可 |
2.2 打包与启动
在项目根目录执行:
bash
# 打包
mvn clean package
# 启动
java -jar target/contrastmaker.jar --server.port=8090


启动后浏览器访问 http://localhost:8090/ 即可。

提示 :如果启动时提示端口被占用,换一个端口即可,例如
--server.port=9090。
2.3 目录结构
text
contrastmaker/
├── pom.xml
├── e2e_test.py
├── browser_test.py
├── test_save_dialog.py
├── check_csdn.py
└── src/
├── main/
│ ├── java/com/huawei/contrast/
│ │ ├── ContrastMakerApplication.java
│ │ ├── controller/ContrastController.java
│ │ ├── model/TextForm.java
│ │ └── service/ContrastService.java
│ └── resources/
│ ├── application.yml
│ ├── templates/index.html
│ └── static/
│ ├── css/app.css
│ ├── js/app.js
│ ├── favicon.svg
│ └── vendor/bootstrap/
└── test/java/com/huawei/contrast/
└── ContrastServiceTest.java
各文件的作用:
| 文件 | 说明 |
|---|---|
pom.xml |
Spring Boot 3.2.5 + Thymeleaf 依赖配置 |
e2e_test.py |
接口级端到端测试(15 项) |
browser_test.py |
真实浏览器交互测试(8 项) |
test_save_dialog.py |
「另存为」对话框测试(3 项) |
check_csdn.py |
CSDN Markdown 规范自检脚本 |
ContrastMakerApplication.java |
启动类 |
ContrastController.java |
六个按钮的接口实现 |
TextForm.java |
表单绑定对象 |
ContrastService.java |
核心算法(切分、规范化、交替拼接、占位) |
application.yml |
端口、编码、静态资源配置 |
index.html |
Thymeleaf 页面模板 |
static/vendor/bootstrap/ |
本地化的 Bootstrap 5.3.3 |
ContrastServiceTest.java |
核心算法单元测试(18 项) |
三、界面说明
程序界面由三个文本框和一组命令按钮组成,自上而下分为四块。
本文的标记约定:【】内是程序里的按钮名,「」内是界面上的文案或文件名。
3.1 顶部使用提示条
页面顶部的浅蓝色提示条给出了推荐的操作顺序:
载入中文与英文文本 → 必要时规范化 → 检查段落数是否一致 → 制作中英/英中对照 → 保存对照文本。
并提示了段落数不一致时的占位标记 ######空缺#######。

3.2 三个文本框
三栏并排布局,从左到右分别是:
| 文本框 | 用途 | 占位提示 |
|---|---|---|
| 中文文本 | 存放中文原文 | 在此粘贴中文文本,每行一段...... |
| 英文文本 | 存放英文原文 | 在此粘贴英文文本,每行一段...... |
| 对照文本 | 输出对照结果(只读) | 点击【制作中英对照】或【制作英中对照】后,结果显示在此...... |
每个文本框右上角有一个徽标,实时显示该侧当前的段落数 ,无需点击任何按钮即可查看。

3.3 段落数一致性检查区
中英文本框下方是独立的检查卡片,包含:
- 左侧显示「中文 N 段 vs 英文 M 段」,两侧一致时显示绿色对勾,不一致时显示红色叉号;
- 右侧是一个醒目的黄色按钮:【检查英文段落数与中文段落数是否一致】 。

3.4 底部操作条
最下方是两个按钮:【清空文本框】与【保存对照文本】,以及一行排版规则说明。

四、操作步骤详解
步骤一:载入文本
有两种方式,二选一即可。
方式 A:直接粘贴
把中文内容粘贴进【中文文本】框,英文内容粘贴进【英文文本】框。
★ 关键约定:以「非空行」为一段。空行会被自动忽略,所以粘贴时不必刻意清理空行。
方式 B:上传文件
点击中文卡片下方的【打开中文文件】或英文卡片下方的【打开英文文件】,选择本地文本文件即可。
上传有两个便利之处:
- 自动识别编码 ------ 程序先按 UTF-8 严格解码,失败则回退 GBK。国内教材、词库文件常见 GBK 编码,直接按 UTF-8 读会满屏乱码,这个处理省去了手工转码的麻烦。
- 不影响另一侧 ------ 上传英文文件不会覆盖已填好的中文内容,反之亦然。
载入后,提示条会显示文件名与该文件的段数


步骤二:规范化(可选)
若原文格式不统一,可点击【规范中文文本】或【规范英文文本】。程序会:
- 丢弃空行,把每个非空行作为一段;
- 段与段之间空一行;
- 段首缩进 4 个字符。
规范化后文本框内容会被替换,可以放心反复操作。


步骤三:检查段落数 ★
这是整个流程中最关键的一步。
中英文段落数不一致,是对照制作中最常见的错误来源。若两侧段数不等,交替排列时就会出现错位------本该配对的句子串到了别的位置,导进词库后才发现,为时已晚。
点击【检查英文段落数与中文段落数是否一致】,程序会给出三种判定:
| 情形 | 提示 | 颜色 |
|---|---|---|
| 两侧段数相同 | 中英文段落数一致(各 N 段),可以制作对照。 | 绿色 |
| 两侧段数不同 | 中英文段落数不一致:中文 4 段,英文 3 段,相差 1 段。制作对照时缺失位置将以「######空缺#######」占位,请先补齐。 |
黄色 |
| 尚未输入内容 | --- | 灰色 |
★ 注意第三种情形:两侧都是 0 段时程序显示「尚未输入内容」,不会误判为一致。这能避免刚打开页面就看到一个绿色对勾的假象。
提示语会明确指出哪一侧多、哪一侧少、相差几段。若提示不一致,建议先回到原文补齐缺失段落,再制作对照。

步骤四:制作对照
- 点击【制作中英对照】→ 对照框输出中文段落在前、英文段落在后的版本;
- 点击【制作英中对照】→ 对照框输出英文段落在前、中文段落在后的版本。
生成的文本形如:
text
海潮之旅:鸟语花香的自然探索
A Journey to Haichao: A Natural Exploration amid Birdsong and Fragrance
12月2日,星期六,天空阴沉着,好像随时都会下起雨来。
December 2, a Saturday. The sky was overcast, as if rain might break at any moment.
规律是:每一段之间空一行,段首缩进 4 个字符。中英文交替出现,标题因为写在正文首行,所以与其他段落完全同等对待。
若两侧段数不等,缺失位置会出现占位标记:
text
今天天气不错
######空缺#######
这个标记是给人看的提醒------它标出了原文与译文数量未对齐的位置,请回到原文补齐后再导入。
单击【制作中英对照】按钮

单击【制作英中对照】按钮

步骤五:保存
点击【保存对照文本】,浏览器会弹出系统的**「另存为」对话框**,可以自选保存位置与文件名。
对话框里已经预填了默认文件名「对照文本.txt」,文件类型限定为纯文本(.txt)。选好位置、确认后文件即写入,页面顶部会提示「已保存为「xxx.txt」」------ 显示的是你在对话框里最终确定的文件名,改名后提示会同步更新。
★ 「另存为」对话框需要 Chrome 或 Edge。程序基于浏览器的 File System Access API 实现,Firefox 与 Safari 暂不支持 ------ 这类浏览器点击后会降级为普通下载(落到默认下载目录),并弹窗提示你改用 Chrome / Edge。
用户在对话框里点【取消】时,程序不写文件也不报错,静默退出。
文件编码为 UTF-8(带 BOM),换行为 CRLF。带 BOM 是为了让 Windows 记事本在各类系统版本上都能正确显示中文 ------ 这个文件主要用于人工阅读校对,显示乱码的代价远大于多出的一个 BOM 字符。
假如我们单击了【制作中英对照】按钮

单击【保存对照文本】

弹出【另存为】对话框

可以修改保存位置,默认文件名对照文本.txt也可以修改,比如改成中英对照文本.txt

单击【保存】按钮,即可生成对照文本

- 双击
中英对照文本.txt,查看内容

五、核心算法说明
5.1 段落切分
java
public List<String> splitParagraphs(String text) {
List<String> paras = new ArrayList<>();
if (text == null || text.isBlank()) {
return paras;
}
// 统一换行符:Windows 的 \r\n、单独的 \r 与 \n 都视为段落分隔
String normalized = text.replace("\r\n", "\n").replace('\r', '\n');
for (String line : normalized.split("\n")) {
String trimmed = line.trim();
if (!trimmed.isEmpty()) {
paras.add(trimmed);
}
}
return paras;
}
要点:
- 以非空行为段落单位 ,与原版 VB 的
Line Input+Trim(NextLine) <> ""判定完全一致; - 兼容三种换行符 ,Windows 环境下直接粘贴的文本不会因
\r\n而多出空段。
5.2 交替拼接
java
for (int i = 0; i < total; i++) {
if (i > 0) {
sb.append("\n\n");
}
String first = chineseFirst ? at(zh, i) : at(en, i);
String second = chineseFirst ? at(en, i) : at(zh, i);
sb.append(pad).append(first);
sb.append("\n\n");
sb.append(pad).append(second);
}
中文段落落在第 1、3、5... 位,英文段落落在第 2、4、6... 位------对应原版用 MSFLEXGRID 控件的奇偶行交替存放。
5.3 空缺占位
java
private String at(List<String> paras, int index) {
if (index < 0 || index >= paras.size()) {
return GAP_MARK;
}
String v = paras.get(index);
return (v == null || v.isEmpty()) ? GAP_MARK : v;
}
一段不足时填入 ######空缺#######。
★ 这里有个容易忽略的细节:越界取值必须提前拦截 。段落数不等恰恰是「制作对照」最常见的正常情形,如果直接
list.get(i)会抛IndexOutOfBoundsException------最该能用的功能反而崩溃了。
六、常见问题
Q1:上传的中文文件显示乱码怎么办?
程序已内置 UTF-8 / GBK 自动探测。若仍有问题,请确认文件本身不是 UTF-16 或其他编码,可先用记事本「另存为 → UTF-8」转换后再上传。
Q2:提示「段落数不一致」,但我明明数出来一样?
程序统计的是非空行。若原文有空行,程序不计入,您手工数时若把空行也算进去就会对不上。建议直接以程序的判定为准。
Q3:对照文本里的 ######空缺####### 需要手工替换吗?
需要。这是给人看的提醒标记,标出未对齐的位置。请回到原文补齐缺失段落,重新制作对照,而不是直接导入。
Q4:能处理多大的文本?
原 VB 版用 TextBox 控件,处理文本不能超过 64KB,超过需换成 RichTextBox。本程序用 textarea 配合服务端处理,没有这个限制,几百 KB 的文本照样能对照。
Q5:为什么段首缩进是 4 个空格?
与原 VB 版的 Space(4) 保持一致。若词库导入有其他缩进要求,改 ContrastService.INDENT 常量即可。
Q6:页面样式加载不出来?
本程序已将 Bootstrap 5.3.3 本地化到 static/vendor/bootstrap/,页面不请求任何外部资源,离线环境也能正常显示。若样式异常,请确认 target/classes/static/vendor/ 下的文件完整。
Q7:点击【保存对照文本】没有弹出「另存为」对话框?
「另存为」对话框基于浏览器的 File System Access API,目前只有 Chrome 与 Edge 支持。Firefox / Safari 会自动降级为普通下载(落到默认下载目录),并弹窗提示。
另外,该 API 要求页面运行在 HTTPS 或 localhost 环境下;若部署到普通 HTTP 域名,也会降级为普通下载。
七、测试与验证
程序提供三层测试,均可通过独立命令运行。
7.1 单元测试
bash
mvn test
覆盖切分、规范化、交替拼接、空缺占位、段落数判定等核心逻辑,共 18 项。
7.2 接口级端到端测试
bash
python e2e_test.py
需服务已启动。覆盖段落数一致与不一致两种情形、两种对照方向的输出格式、空缺占位、规范化结果、清空功能、静态资源可达性、文件上传(中英双侧、互不覆盖、GBK 编码)等,共 19 项。
7.3 真实浏览器交互测试
bash
python browser_test.py
需服务已启动,且本机装有 Chrome。用 Playwright 驱动真实浏览器模拟点击【打开文件】【检查段落数】【制作对照】等按钮,并截图留存,共 8 项。
7.4 「另存为」对话框测试
bash
python test_save_dialog.py
需服务已启动。用 Playwright 注入桩函数模拟用户在原生对话框中的三种选择:正常保存、点【取消】、浏览器不支持该 API 时的降级路径,共 3 项。
八、小结
这款程序在原 VB 版的基础上做了三处实质性改进:
- 补齐段落数一致性检查 ------ 原程序声明了变量却未实现,本版做成独立按钮,三档判定,并能明确指出哪一侧多、相差几段;
- 编码自动探测 ------ 免去手工转换 GBK 的麻烦;
- 取消 64KB 限制 ------ Web 版无此约束。
程序刻意保留了原版的排版规则:段间空一行、段首缩进 4 字符、中英段落交替、缺失处以 ######空缺####### 占位。这样生成的对照文件与过去 VB 版产出的格式一致,导入词库时无需调整。
本文所述程序基于 Spring Boot 3.2.5 + Thymeleaf + Bootstrap 5.3.3 实现,完全离线可用。