simple-translate/simple-translate/background.js

125 lines
3.6 KiB
JavaScript

/* Copyright (c) 2017-2018 Sienori All rights reserved.
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
//初回起動時にオプションページを表示して設定を初期化
browser.runtime.onInstalled.addListener((details) => {
if (details.reason != 'install' && details.reason != 'update') return;
browser.tabs.create({
url: "options/options.html#information?action=updated",
active: false
});
});
let S = new settingsObj();
browser.storage.onChanged.addListener(showMenu);
if (typeof (browser.contextMenus.onShown) != 'undefined') browser.contextMenus.onShown.addListener(updateMenu);
S.init().then(function () {
showMenu();
});
function showMenu() {
if (S.get().ifShowMenu) {
menuRemove();
menuCreate();
} else menuRemove();
}
//テキストまたはリンクの選択時はページ翻訳を非表示にする
function updateMenu(info, tab) {
if (info.contexts.includes('selection') || info.contexts.includes('link')) {
browser.contextMenus.update('translatePage', { contexts: ['password'] }); //passwordにすることで事実上無効にする
} else {
browser.contextMenus.update('translatePage', { contexts: ['all'] });
}
browser.contextMenus.refresh();
}
//メニューを表示
function menuCreate() {
browser.contextMenus.create({
id: "translatePageOnTab",
title: browser.i18n.getMessage("translatePageMenu"),
contexts: ["tab"],
});
browser.contextMenus.create({
id: "translatePage",
title: browser.i18n.getMessage("translatePageMenu"),
contexts: ["all"],
});
browser.contextMenus.create({
id: "translateText",
title: browser.i18n.getMessage("translateTextMenu"),
contexts: ["selection"],
});
browser.contextMenus.create({
id: "translateLink",
title: browser.i18n.getMessage("translateLinkMenu"),
contexts: ["link"],
});
}
//メニューを削除
function menuRemove() {
browser.contextMenus.removeAll();
}
//メニュークリック時
browser.contextMenus.onClicked.addListener(function (info, tab) {
switch (info.menuItemId) {
case "translatePage":
case "translatePageOnTab":
translatePageMenu(info, tab);
break;
case "translateText":
translateTextMenu(info, tab);
break;
case "translateLink":
translateLinkMenu(info, tab);
break;
}
});
//テキストを翻訳
function translateTextMenu(info, tab) {
browser.tabs.sendMessage(
tab.id, {
message: "showPanelFromMenu"
}
)
}
//ページ全体を翻訳
function translatePageMenu(info, tab) {
browser.tabs.create({
'url': "https://translate.google.com/translate?hl=" + S.get().targetLang + "&sl=auto&u=" + encodeURIComponent(info.pageUrl),
'active': true,
'index': tab.index + 1
});
}
//リンクを翻訳
function translateLinkMenu(info, tab) {
browser.tabs.create({
'url': "https://translate.google.com/translate?hl=" + S.get().targetLang + "&sl=auto&u=" + encodeURIComponent(info.linkUrl),
'active': true,
'index': tab.index + 1
});
}
//スクリプトからのメッセージに返信
browser.runtime.onMessage.addListener(function (request) {
switch (request.message) {
case "getSetting":
break;
}
});