瀏覽器插件-離線英漢詞典 2018-10-12

如前文在瀏覽器插件中讀取JSON資源文件末所述, 用瀏覽器插件實現了不依賴任何在線翻譯服務的英漢詞典. 由於詞典包含77萬個詞條, 插件大小也達到了13+MB.
2018-10-11-dictionary瀏覽器_詞
詞典數據也包含很多常見短語:
2018-10-11-dictionary瀏覽器_詞組
源碼庫: program-in-chinese/webextension_english_chinese_dictionary

在火狐插件網站提交審覈時, 發現源文件大小有限制, 超過4MB就不能被審覈服務自動分析. 於是按每個詞典文件五萬詞條進行分隔(詳見轉換到JSON; 按五萬行分隔json · program-in-chinese/english-chinese-dictionary@10b55f6)

插件源碼主要是導入詞典數據和查詢/顯示兩部分:

加載詞典.js

const 詞典路徑 = '詞典數據/詞典'
const 文件擴展 = '.json'
var 詞典文件 = {};
for (var 文件序號 = 0; 文件序號 < 16; 文件序號++) {
  詞典文件[文件序號] = false;
}
var 詞典數據 = {};

function 載入部分詞典(文件) {
  return function () {
    var 文件路徑 = 詞典路徑 + 文件 + 文件擴展;
    fetch(chrome.runtime.getURL(文件路徑))
      .then((響應) => 響應.json())
      .then((數據) => {
        for (var 英文 in 數據) {
          詞典數據[英文] = 數據[英文];
        }
        詞典文件[文件] = true;
      });
  }
}

for (var 文件 in 詞典文件) {
  載入部分詞典(文件)();
}

function 已載入詞典() {
  for (var 文件 in 詞典文件) {
    if (!詞典文件[文件]) {
      return false;
    }
  }
  return true;
}

function 取釋義(選中文本) {
  var 釋義 = 詞典數據[選中文本];
  if (!釋義) {
    選中文本 = 選中文本.toLowerCase();
    釋義 = 詞典數據[選中文本];
  }
  return 釋義;
}

主界面.js

function 翻譯選中文本() {
  chrome.tabs.executeScript({
    code: "window.getSelection().toString();"
  }, function (選中內容) {
    // TODO: 如果沒有toString, 報錯: -,.toLowerCase is not function
    var 選中文本 = 選中內容.toString();
    if (!選中文本) {
      置彈窗內容("無選中文本");
      return;
    }
    var 詞典接口 = chrome.extension.getBackgroundPage();
    if (!詞典接口.已載入詞典()) {
      置彈窗內容("載入詞典數據中...");
      return;
    }
    var 釋義 = 詞典接口.取釋義(選中文本);
    置彈窗內容(選中文本, 釋義);
  });
}

function 置彈窗內容(英文, 釋義) {
  var 窗體 = document.body;
  var 英文部分 = document.getElementById("英文");
  var 釋義部分 = document.getElementById("釋義");
  英文部分.appendChild(document.createTextNode(英文));
  var 多行 = 釋義.split('\\n');
  for (var 行數 in 多行) {
    釋義部分.appendChild(document.createTextNode(多行[行數]));
    釋義部分.appendChild(document.createElement("br"));
  }
}

翻譯選中文本();

另, 已在Chrome插件商店發佈. 鏈接如下:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章