| import {convertLanguages, isoLangs} from './common/consts.js'; |
| |
| var array_elements = [], translator_tab = null, translator_window = null; |
| |
| function isEmpty(obj) { |
| return Object.keys(obj).length === 0; |
| } |
| |
| function inObject(hayStack, el) { |
| for (var i of Object.keys(hayStack)) { |
| if (hayStack[i] == el) return true; |
| } |
| return false; |
| } |
| |
| function getTranslationUrl(lang, text) { |
| var params = new URLSearchParams({ |
| sl: 'auto', |
| tl: lang, |
| text: text, |
| op: 'translate', |
| }); |
| return 'https://translate.google.com/?' + params.toString(); |
| } |
| |
| function translationClick(info, tab) { |
| chrome.storage.sync.get('uniquetab', items => { |
| var url = getTranslationUrl( |
| array_elements[info.menuItemId]['langCode'], info.selectionText); |
| var settings_tab = {url}; |
| if (translator_tab && items.uniquetab == 'yep') { |
| chrome.tabs.update(translator_tab, settings_tab, tab => { |
| chrome.tabs.highlight( |
| { |
| windowId: tab.windowId, |
| tabs: tab.index, |
| }, |
| _ => { |
| chrome.windows.update(tab.windowId, { |
| focused: true, |
| }); |
| }); |
| }); |
| } else if (items.uniquetab == 'panel' || items.uniquetab == 'popup') { |
| chrome.windows.create( |
| { |
| type: 'popup', |
| url, |
| width: 1000, |
| height: 382, |
| }, |
| function(tab) { |
| translator_window = tab.windowId; |
| translator_tab = tab.id; |
| chrome.windows.onRemoved.addListener(function(windowId) { |
| if (windowId == translator_window) { |
| translator_window = null; |
| translator_tab = null; |
| } |
| }); |
| }); |
| } else { |
| chrome.tabs.create(settings_tab, function(tab) { |
| translator_window = tab.windowId; |
| translator_tab = tab.id; |
| chrome.tabs.onRemoved.addListener(function(tabId, removeInfo) { |
| if (tabId == translator_tab) { |
| translator_window = null; |
| translator_tab = null; |
| } |
| }); |
| }); |
| } |
| }); |
| } |
| |
| function openOptionsPage() { |
| if (chrome.runtime.openOptionsPage) { |
| // New way to open options pages, if supported (Chrome 42+). |
| chrome.runtime.openOptionsPage(); |
| } else { |
| chrome.tabs.create( |
| { |
| 'url': 'chrome-extension://' + |
| chrome.i18n.getMessage('@@extension_id') + '/options.html', |
| 'active': true |
| }, |
| tab => { |
| chrome.windows.update(tab.windowId, {focused: true}); |
| }); |
| } |
| } |
| |
| function createmenus() { |
| chrome.storage.sync.get('translateinto', function(items) { |
| chrome.contextMenus.removeAll(); |
| |
| var count = 0, singleone = true; |
| |
| for (var language of Object.keys(items.translateinto)) { |
| if (count == 0) { |
| count++; |
| } else { |
| singleone = false; |
| break; |
| } |
| } |
| |
| if (singleone) { |
| for (var language_id of Object.keys(items.translateinto)) { |
| var language = items.translateinto[language_id]; |
| var languagem = isoLangs[language]; |
| if (languagem === undefined) { |
| console.error(language + ' doesn\'t exist!'); |
| continue; |
| } |
| var id = chrome.contextMenus.create({ |
| 'id': 'tr_single_parent', |
| 'title': chrome.i18n.getMessage('contextmenu_title2', languagem.name), |
| 'contexts': ['selection'], |
| }); |
| array_elements[id] = new Array(); |
| array_elements[id]['langCode'] = language; |
| } |
| } else { |
| var parentEl = chrome.contextMenus.create({ |
| 'id': 'parent', |
| 'title': chrome.i18n.getMessage('contextmenu_title'), |
| 'contexts': ['selection'] |
| }); |
| for (var language_id of Object.keys(items.translateinto)) { |
| var language = items.translateinto[language_id]; |
| var languagem = isoLangs[language]; |
| if (languagem === undefined) { |
| console.error(language + ' doesn\'t exist!'); |
| continue; |
| } |
| var title = languagem.name + ' (' + languagem.nativeName + ')'; |
| var id = chrome.contextMenus.create({ |
| 'id': 'tr_language_' + language, |
| 'title': title, |
| 'parentId': parentEl, |
| 'contexts': ['selection'] |
| }); |
| array_elements[id] = new Array(); |
| array_elements[id]['langCode'] = language; |
| } |
| chrome.contextMenus.create({ |
| 'id': 'tr_separator', |
| 'type': 'separator', |
| 'parentId': parentEl, |
| 'contexts': ['selection'] |
| }); |
| chrome.contextMenus.create({ |
| 'id': 'tr_options', |
| 'title': chrome.i18n.getMessage('contextmenu_edit'), |
| 'parentId': parentEl, |
| 'contexts': ['selection'] |
| }); |
| } |
| }); |
| } |
| |
| chrome.runtime.onInstalled.addListener(function(details) { |
| chrome.storage.sync.get(null, function(items) { |
| if (details.reason == 'install') { |
| if (isEmpty(items)) { |
| var settings = {'translateinto': {}, 'uniquetab': 'popup'}, |
| default_language_1 = |
| chrome.i18n.getMessage('@@ui_locale').replace('_', '-'), |
| default_language_2 = |
| chrome.i18n.getMessage('@@ui_locale').split('_')[0]; |
| |
| if (isoLangs[default_language_1] != undefined) |
| settings.translateinto['0'] = default_language_1; |
| else if (isoLangs[default_language_2] != undefined) |
| settings.translateinto['0'] = default_language_2; |
| |
| chrome.storage.sync.set(settings, function() { |
| chrome.notifications.create('install', { |
| type: 'basic', |
| iconUrl: 'icons/translate-128.png', |
| title: chrome.i18n.getMessage('notification_install_title'), |
| message: chrome.i18n.getMessage('notification_install_message'), |
| isClickable: true |
| }); |
| }); |
| } |
| } |
| if (details.reason == 'update') { |
| var version = details.previousVersion.split('.'); |
| |
| // Updating from a version previous to v0.6 |
| if (version[0] == '0' && version[1] < '6') { |
| var settings = { |
| languages: {}, |
| uniquetab: '', |
| }; |
| var default_language = |
| chrome.i18n.getMessage('@@ui_locale').split('_')[0]; |
| |
| if (isoLangs[default_language] != undefined) |
| settings.languages[default_language] = default_language; |
| |
| chrome.storage.sync.set(settings); |
| } |
| |
| // Updating from a version previous to v0.7 |
| if (version[0] == '0' && version[1] < '7') { |
| items.translateinto = {}; |
| var i = 0; |
| for (var language in items.languages) { |
| items.translateinto[i] = items.languages[language]; |
| i++; |
| } |
| delete items.languages; |
| chrome.storage.sync.set(items); |
| } |
| |
| // Remove non-existent languages or change with correct language code |
| if (items.translateinto) { |
| var modified = false; |
| for (var language_id of Object.keys(items.translateinto)) { |
| var language = items.translateinto[language_id]; |
| if (isoLangs[language] === undefined) { |
| if (convertLanguages[language] === undefined) { |
| // The language doesn't exist |
| console.log( |
| 'Deleting ' + language + |
| ' from items.translateinto because it doesn\'t exist.'); |
| delete items.translateinto[language_id]; |
| } else { |
| // The language doesn't exist but a known replacement is known |
| var newLanguage = convertLanguages[language]; |
| console.log('Replacing ' + language + ' with ' + newLanguage); |
| |
| // If the converted language is already on the list, just remove |
| // the wrong language, otherwise convert the language |
| if (inObject(items.translateinto, newLanguage)) |
| delete items.translateinto[language_id]; |
| else |
| items.translateinto[language_id] = newLanguage; |
| } |
| modified = true; |
| } |
| } |
| if (modified) chrome.storage.sync.set(items); |
| } else { |
| console.log('items.translateinto doesn\'t exist: let\'s create it.'); |
| items['translateinto'] = {}; |
| chrome.storage.sync.set(items); |
| } |
| } |
| }); |
| }); |
| |
| chrome.storage.onChanged.addListener((changes, areaName) => { |
| if (areaName == 'sync') createmenus(); |
| }); |
| |
| chrome.storage.sync.get(null, items => { |
| if (items.translateinto) { |
| createmenus(); |
| } else { |
| chrome.contextMenus.removeAll(); |
| var parent = chrome.contextMenus.create({ |
| 'id': 'tr_parent', |
| 'title': chrome.i18n.getMessage('contextmenu_title'), |
| 'contexts': ['selection'] |
| }); |
| var id = chrome.contextMenus.create({ |
| 'id': 'tr_options', |
| 'title': chrome.i18n.getMessage('contextmenu_edit'), |
| 'parentId': parent, |
| 'contexts': ['selection'] |
| }); |
| } |
| }); |
| |
| chrome.notifications.onClicked.addListener(notification_id => { |
| switch (notification_id) { |
| case 'install': |
| openOptionsPage(); |
| break; |
| } |
| chrome.notifications.clear(notification_id); |
| }); |
| |
| chrome.contextMenus.onClicked.addListener((info, tab) => { |
| if (info.menuItemId == 'tr_options') { |
| openOptionsPage(); |
| } else { |
| translationClick(info, tab); |
| } |
| }); |
| |
| chrome.browserAction.onClicked.addListener(_ => { |
| openOptionsPage(); |
| }); |