英中 / 中英对照制作程序:操作指南

英中 / 中英对照制作程序:操作指南

摘要 :本文介绍一款基于 Spring Boot + Thymeleaf + Bootstrap 的英中 / 中英对照制作程序,用于规范英语学习软件中词库与句库的导入文件。程序还原了 VB 版《英中/中英对照制作程序》的核心功能:文本规范化、中英对照制作、英中对照制作、对照文本保存,并补足了原程序声明了变量却未真正实现的段落数一致性检查功能。程序界面为三个文本框加一组命令按钮,支持文件上传(自动识别 UTF-8 / GBK 编码),完全离线可用。

本文目录


一、程序能解决什么问题

在制作英语学习软件的词库、句库时,原始的英文语料与中文译文往往格式杂乱:段落疏密不一、缩进不统一、中英行数对不上。人工整理既费时又容易出错。

本程序把这项工作标准化:载入中英文文本 → 规范化 → 校验段落数 → 一键生成对照文本 → 保存。生成的对照文本中,中英文段落交替排列、格式统一,既可直接导入词库句库,也便于学习者逐句对照阅读。

与原 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:上传文件

点击中文卡片下方的【打开中文文件】或英文卡片下方的【打开英文文件】,选择本地文本文件即可。

上传有两个便利之处:

  1. 自动识别编码 ------ 程序先按 UTF-8 严格解码,失败则回退 GBK。国内教材、词库文件常见 GBK 编码,直接按 UTF-8 读会满屏乱码,这个处理省去了手工转码的麻烦。
  2. 不影响另一侧 ------ 上传英文文件不会覆盖已填好的中文内容,反之亦然。

载入后,提示条会显示文件名与该文件的段数

步骤二:规范化(可选)

若原文格式不统一,可点击【规范中文文本】或【规范英文文本】。程序会:

  • 丢弃空行,把每个非空行作为一段;
  • 段与段之间空一行;
  • 段首缩进 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 版的基础上做了三处实质性改进:

  1. 补齐段落数一致性检查 ------ 原程序声明了变量却未实现,本版做成独立按钮,三档判定,并能明确指出哪一侧多、相差几段;
  2. 编码自动探测 ------ 免去手工转换 GBK 的麻烦;
  3. 取消 64KB 限制 ------ Web 版无此约束。

程序刻意保留了原版的排版规则:段间空一行、段首缩进 4 字符、中英段落交替、缺失处以 ######空缺####### 占位。这样生成的对照文件与过去 VB 版产出的格式一致,导入词库时无需调整。

本文所述程序基于 Spring Boot 3.2.5 + Thymeleaf + Bootstrap 5.3.3 实现,完全离线可用。

相关推荐
CoderYanger5 小时前
Java EE 进阶:5. Spring IoC&DI(第三弹):Spring DI
java·开发语言·spring boot·spring·面试·java-ee·mvc
重生之我是Java开发战士7 小时前
【Redis】Java & JavaSpring 客户端
java·redis·bootstrap
小蒜学长7 小时前
基于SpringBoot 框架的自媒体新闻系统的设计与实现(代码+数据库+LW)
java·spring boot·后端·mysql数据库·自媒体新闻管理系统
余槐i8 小时前
PostgreSQL 加索引后查询反而更慢:优化器弃用索引的 3 种情形
spring boot·redis·mysql·postgresql·事务
学长毕设18 小时前
基于springboot的食品仓库管理系统
java·spring boot·后端
captain37620 小时前
MyBatis操作数据库(入门2)
java·数据库·spring boot·后端·spring·mybatis
学长毕设1 天前
基于SpringBoot的餐厅管理系统-附源码
java·spring boot·后端
paopaokaka_luck1 天前
基于springboot+vue的益暖微光公益服务平台(DeepSeek公益助手、善款信息追溯、志愿服务积分闭环、ECharts运营分析、活动状态自动流转)
java·前端·javascript·spring boot·mysql·架构·echarts
软件技术NINI1 天前
基于SpringBoot和Vue的摇滚乐鉴赏网站
vue.js·spring boot·后端·spring·html·毕业设计·毕设