一、问题的提出

开学了,我本学期教授的是大学英语三。所教班级人数多,学生基础参差不齐,为了辅助学生更好地学习英语,我特地制作了一些教学资料供学生自主学习。

双语阅读工具就是其中之一。这个工具的特点是可以导入双语语料库,选择文本分隔方式后,可以以不同的颜色间隔显示原文和译文,便于学生对照和辨识。同时学生还可以一键切换双语的上下位置,转移学生的视觉焦点,提升阅读效率。点击播放,还可以播放当前目录下的音频,这样一款妥妥的自定义的双语英语阅读学习辅助工具。

二、问题的解决

然而实现这一点,其实并不简单。

第一步,我要找到课文原文和译文,通过语料清洗,删除行首的数字、空行,进行除噪后,分别存储为原文和译文两个不同的txt文本,接着再导入到tmxmall的aligner,把文本进行句对齐。

第二步,我还要从tmxmall中导出我对齐的文本,放在Word文件中,把我要标注的单词加粗,并存为【课文.docx】。

第三步,我使用无障碍标注工具,把【课文.docx】文件中的加粗单词进行标注,主要是调用了小牛机器翻译的API,把单词的文中释义标注在单词旁边。如下图所示:

图片

第四步,我们把标注好的文本复制到【课文带释义.TXT】文件当中备用。接着,我们打开ChatGPT,输入以下命令。

我想生成一个可以导入txt文件,用间隔颜色展示双语语料库的html文件,顶部设置有导入、重置、字体放大或缩小按钮,可以播放当前目录下的音频。右侧有滚动条,滚动时,顶部按钮一直显示,界面漂亮、清爽,可以大屏显示,在课堂上使用。可以添加一些必要的功能和参数,给出html代码。

经过不断调试,终于生成了以下代码,大家可以保存到html文件中使用:

<!DOCTYPE html>
<html lang="zh">
<head>
  <meta charset="UTF-8">
  <title>双语语料库展示</title>
  <style>
    body {
      font-family: "Microsoft YaHei", sans-serif;
      margin: 0;
      background: linear-gradient(135deg, #f0f3f7, #e6ebef);
    }
    header {
      position: fixed;
      top: 0;
      width: 100%;
      background: linear-gradient(90deg, #2c3e50, #1abc9c);
      color: white;
      padding: 12px 20px;
      display: flex;
      justify-content: space-between;
      align-items: center;
      z-index: 1000;
      box-shadow: 0 4px 6px rgba(0,0,0,0.2);
    }
    #controls {
      display: flex;
      gap: 10px;
      align-items: center;
    }
    #controls button, #controls select, #controls input[type="file"] {
      padding: 6px 12px;
      font-size: 14px;
      border-radius: 20px;
      border: none;
      cursor: pointer;
      background: #ecf0f1;
      color: #2c3e50;
      box-shadow: 0 2px 4px rgba(0,0,0,0.2);
      transition: all 0.2s ease;
    }
    #controls button:hover, #controls select:hover, #controls input[type="file"]:hover {
      background: #1abc9c;
      color: white;
    }
    #audioPlayer {
      height: 32px;
    }
    #content {
      margin-top: 100px;
      padding: 20px;
    }
    .entry {
      margin-bottom: 20px;
      border-radius: 12px;
      box-shadow: 0 4px 8px rgba(0,0,0,0.15);
      overflow: hidden;
      transition: transform 0.2s ease, box-shadow 0.2s ease;
    }
    .entry:hover {
      transform: scale(1.02);
      box-shadow: 0 6px 12px rgba(0,0,0,0.25);
    }
    .target {
      background: #a8e6a3; /* 亮绿色 */
      padding: 12px;
      font-weight: bold;
      font-size: 18px;
    }
    .source {
      background: #aed6f1; /* 亮蓝色 */
      padding: 12px;
      font-size: 16px;
    }
  </style>
</head>
<body>
  <header>
    <div id="controls">
      <input type="file" id="fileInput">
      <select id="parseMode">
       <option value="oddEven">奇偶行</option>
        <option value="tab">Tab 分隔</option>
        <option value="pipe">| 分隔</option>
        <option value="triple">||| 分隔</option>
        
      </select>
      <button onclick="resetContent()">重置</button>
      <button onclick="swapPosition()">交换位置</button>
    </div>
    <audio id="audioPlayer" controls>
      <source src="audio.mp3" type="audio/mpeg">
      你的浏览器不支持音频播放。
    </audio>
  </header>
  <div id="content"></div>

  <script>
    let fontSize = 16;
    let isSwapped = JSON.parse(localStorage.getItem("isSwapped")) || false;

    document.getElementById('fileInput').addEventListener('change', handleFile);

    function handleFile(event) {
      const file = event.target.files[0];
      if (!file) return;
      const reader = new FileReader();
      reader.onload = e => {
        const lines = e.target.result.split(/\r?\n/).filter(l => l.trim());
        const mode = document.getElementById("parseMode").value;
        const entries = parseCorpus(lines, mode);
        displayEntries(entries);
      };
      reader.readAsText(file, "utf-8");
    }

    function parseCorpus(lines, mode) {
      let entries = [];
      if (mode === "tab") {
        lines.forEach(line => {
          const parts = line.split("\t");
          if (parts.length >= 2) entries.push([parts[1], parts[0]]);
        });
      } else if (mode === "pipe") {
        lines.forEach(line => {
          const parts = line.split("|");
          if (parts.length >= 2) entries.push([parts[1], parts[0]]);
        });
      } else if (mode === "triple") {
        lines.forEach(line => {
          const parts = line.split("|||");
          if (parts.length >= 2) entries.push([parts[1], parts[0]]);
        });
      } else if (mode === "oddEven") {
        for (let i = 0; i < lines.length; i += 2) {
          if (i + 1 < lines.length) entries.push([lines[i+1], lines[i]]);
        }
      }
      return entries;
    }

    function displayEntries(entries) {
      const container = document.getElementById("content");
      container.innerHTML = "";
      entries.forEach(([target, source]) => {
        const entry = document.createElement("div");
        entry.className = "entry";
        if (isSwapped) {
          entry.innerHTML = `
            <div class="source">${source}</div>
            <div class="target">${target}</div>
          `;
        } else {
          entry.innerHTML = `
            <div class="target">${target}</div>
            <div class="source">${source}</div>
          `;
        }
        container.appendChild(entry);
      });
    }

    function resetContent() {
      document.getElementById("content").innerHTML = "";
    }

    function changeFontSize(delta) {
      fontSize += delta;
      document.getElementById("content").style.fontSize = fontSize + "px";
    }

    function swapPosition() {
      isSwapped = !isSwapped;
      localStorage.setItem("isSwapped", JSON.stringify(isSwapped));
      // 重新渲染已有条目
      const entries = [...document.querySelectorAll(".entry")].map(entry => {
        const target = entry.querySelector(".target").textContent;
        const source = entry.querySelector(".source").textContent;
        return [target, source];
      });
      displayEntries(entries);
    }
  </script>
</body>
</html>

最终的效果如下,可以显示双语、播放音频,同时还带有单词的注释内容。

三、学后总结

这个双语阅读工具,整合文字、音频、注释信息等,而且当鼠标放到指令行还会有突起动画,便于识别。

遗憾的是文本大小设置还有问题,不过可以用ctrl+中键滚动鼠标来实现页面字体放大或缩小。后期可以继续改进这个工具。

外语教学和英语学习过程中,都会遇到的一些个性化的小问题,看起来很难,其实都可以转化技术实现的问题,借助AI大模型,善用提示词,让AI帮助我们,轻松实现我们的编程梦想,把思想转化为现实。

关注我,学习更多Python和大模型在英语教学和学习方面的应用!

Logo

更多推荐