Adrià Vilanova Martínez | 53f7a7f | 2022-05-30 13:59:59 +0200 | [diff] [blame] | 1 | import {isoLangs} from './common/consts.js'; |
| 2 | import Options from './common/options.js'; |
Adrià Vilanova Martínez | a197d86 | 2022-05-27 17:33:20 +0200 | [diff] [blame] | 3 | |
Adrià Vilanova Martínez | ec59934 | 2022-05-31 11:57:35 +0200 | [diff] [blame^] | 4 | window.contextMenuLangs = []; |
| 5 | window.translator_tab = null; |
avm99963 | 4a2a5d5 | 2016-06-04 16:17:29 +0200 | [diff] [blame] | 6 | |
avm99963 | ce257a9 | 2020-12-27 00:07:13 +0100 | [diff] [blame] | 7 | function getTranslationUrl(lang, text) { |
avm99963 | 5a57c41 | 2020-12-27 00:26:45 +0100 | [diff] [blame] | 8 | var params = new URLSearchParams({ |
| 9 | sl: 'auto', |
| 10 | tl: lang, |
| 11 | text: text, |
| 12 | op: 'translate', |
| 13 | }); |
| 14 | return 'https://translate.google.com/?' + params.toString(); |
avm99963 | ce257a9 | 2020-12-27 00:07:13 +0100 | [diff] [blame] | 15 | } |
| 16 | |
| 17 | function translationClick(info, tab) { |
Adrià Vilanova Martínez | 53f7a7f | 2022-05-30 13:59:59 +0200 | [diff] [blame] | 18 | Options.getOptions() |
| 19 | .then(options => { |
Adrià Vilanova Martínez | ec59934 | 2022-05-31 11:57:35 +0200 | [diff] [blame^] | 20 | let url = getTranslationUrl( |
| 21 | window.contextMenuLangs[info.menuItemId], info.selectionText); |
| 22 | let settings_tab = {url}; |
| 23 | if (window.translator_tab && options.uniqueTab == 'yep') { |
| 24 | chrome.tabs.update(window.translator_tab, settings_tab, tab => { |
Adrià Vilanova Martínez | 53f7a7f | 2022-05-30 13:59:59 +0200 | [diff] [blame] | 25 | chrome.tabs.highlight( |
| 26 | { |
| 27 | windowId: tab.windowId, |
| 28 | tabs: tab.index, |
| 29 | }, |
| 30 | () => { |
| 31 | chrome.windows.update(tab.windowId, { |
| 32 | focused: true, |
| 33 | }); |
| 34 | }); |
| 35 | }); |
| 36 | } else if (options.uniqueTab == 'popup') { |
Adrià Vilanova Martínez | ec59934 | 2022-05-31 11:57:35 +0200 | [diff] [blame^] | 37 | chrome.windows.create({ |
| 38 | type: 'popup', |
| 39 | url, |
| 40 | width: 1000, |
| 41 | height: 382, |
| 42 | }); |
Adrià Vilanova Martínez | 53f7a7f | 2022-05-30 13:59:59 +0200 | [diff] [blame] | 43 | } else { |
| 44 | chrome.tabs.create(settings_tab, function(tab) { |
Adrià Vilanova Martínez | ec59934 | 2022-05-31 11:57:35 +0200 | [diff] [blame^] | 45 | let translator_window = tab.windowId; |
| 46 | window.translator_tab = tab.id; |
avm99963 | 5a57c41 | 2020-12-27 00:26:45 +0100 | [diff] [blame] | 47 | }); |
Adrià Vilanova Martínez | 53f7a7f | 2022-05-30 13:59:59 +0200 | [diff] [blame] | 48 | } |
| 49 | }) |
| 50 | .catch(err => { |
| 51 | console.error('Error retrieving options to handle translation', err); |
avm99963 | 5a57c41 | 2020-12-27 00:26:45 +0100 | [diff] [blame] | 52 | }); |
avm99963 | 4a2a5d5 | 2016-06-04 16:17:29 +0200 | [diff] [blame] | 53 | } |
| 54 | |
Adrià Vilanova Martínez | 53f7a7f | 2022-05-30 13:59:59 +0200 | [diff] [blame] | 55 | function createMenus(options) { |
| 56 | chrome.contextMenus.removeAll(); |
avm99963 | 4a2a5d5 | 2016-06-04 16:17:29 +0200 | [diff] [blame] | 57 | |
Adrià Vilanova Martínez | 53f7a7f | 2022-05-30 13:59:59 +0200 | [diff] [blame] | 58 | let langs = options.targetLangs; |
| 59 | let isSingleEntry = Object.values(langs).length == 1; |
avm99963 | 4a2a5d5 | 2016-06-04 16:17:29 +0200 | [diff] [blame] | 60 | |
Adrià Vilanova Martínez | 53f7a7f | 2022-05-30 13:59:59 +0200 | [diff] [blame] | 61 | let parentEl; |
| 62 | if (!isSingleEntry) { |
| 63 | parentEl = chrome.contextMenus.create({ |
| 64 | 'id': 'parent', |
avm99963 | 5a57c41 | 2020-12-27 00:26:45 +0100 | [diff] [blame] | 65 | 'title': chrome.i18n.getMessage('contextmenu_title'), |
| 66 | 'contexts': ['selection'] |
| 67 | }); |
Adrià Vilanova Martínez | 53f7a7f | 2022-05-30 13:59:59 +0200 | [diff] [blame] | 68 | } |
| 69 | |
| 70 | for (let [index, language] of Object.entries(langs)) { |
| 71 | let languageDetails = isoLangs[language]; |
| 72 | if (languageDetails === undefined) { |
| 73 | console.error(language + ' doesn\'t exist!'); |
| 74 | continue; |
| 75 | } |
| 76 | let title; |
| 77 | if (isSingleEntry) { |
| 78 | title = |
| 79 | chrome.i18n.getMessage('contextmenu_title2', languageDetails.name); |
| 80 | } else { |
| 81 | title = languageDetails.name + ' (' + languageDetails.nativeName + ')'; |
| 82 | } |
| 83 | let id = chrome.contextMenus.create({ |
| 84 | 'id': 'tr_language_' + language, |
| 85 | 'title': title, |
| 86 | 'parentId': parentEl, |
| 87 | 'contexts': ['selection'] |
| 88 | }); |
Adrià Vilanova Martínez | ec59934 | 2022-05-31 11:57:35 +0200 | [diff] [blame^] | 89 | window.contextMenuLangs[id] = language; |
Adrià Vilanova Martínez | 53f7a7f | 2022-05-30 13:59:59 +0200 | [diff] [blame] | 90 | } |
| 91 | |
| 92 | if (!isSingleEntry) { |
| 93 | chrome.contextMenus.create({ |
| 94 | 'id': 'tr_separator', |
| 95 | 'type': 'separator', |
| 96 | 'parentId': parentEl, |
| 97 | 'contexts': ['selection'] |
| 98 | }); |
| 99 | chrome.contextMenus.create({ |
avm99963 | 5a57c41 | 2020-12-27 00:26:45 +0100 | [diff] [blame] | 100 | 'id': 'tr_options', |
| 101 | 'title': chrome.i18n.getMessage('contextmenu_edit'), |
Adrià Vilanova Martínez | 53f7a7f | 2022-05-30 13:59:59 +0200 | [diff] [blame] | 102 | 'parentId': parentEl, |
avm99963 | 5a57c41 | 2020-12-27 00:26:45 +0100 | [diff] [blame] | 103 | 'contexts': ['selection'] |
| 104 | }); |
| 105 | } |
Adrià Vilanova Martínez | 53f7a7f | 2022-05-30 13:59:59 +0200 | [diff] [blame] | 106 | } |
| 107 | |
| 108 | chrome.storage.onChanged.addListener((changes, areaName) => { |
| 109 | if (areaName == 'sync') { |
| 110 | Options.getOptions(/* readOnly = */ false) |
| 111 | .then(options => { |
| 112 | createMenus(options); |
| 113 | }) |
| 114 | .catch(err => { |
| 115 | console.error( |
| 116 | 'Error retrieving options to set up the extension after a change ' + |
| 117 | 'in the storage area.', |
| 118 | err); |
| 119 | }); |
| 120 | } |
avm99963 | 4a2a5d5 | 2016-06-04 16:17:29 +0200 | [diff] [blame] | 121 | }); |
| 122 | |
Adrià Vilanova Martínez | 53f7a7f | 2022-05-30 13:59:59 +0200 | [diff] [blame] | 123 | Options.getOptions(/* readOnly = */ false) |
| 124 | .then(options => { |
| 125 | if (options.isFirstRun) { |
| 126 | chrome.notifications.create('install', { |
| 127 | type: 'basic', |
| 128 | iconUrl: 'icons/translate-128.png', |
| 129 | title: chrome.i18n.getMessage('notification_install_title'), |
| 130 | message: chrome.i18n.getMessage('notification_install_message'), |
| 131 | isClickable: true |
| 132 | }); |
| 133 | } |
| 134 | |
| 135 | createMenus(options); |
| 136 | }) |
| 137 | .catch(err => { |
| 138 | console.error( |
| 139 | 'Error retrieving options to initialize the extension.', err); |
| 140 | }); |
| 141 | |
avm99963 | ce257a9 | 2020-12-27 00:07:13 +0100 | [diff] [blame] | 142 | chrome.notifications.onClicked.addListener(notification_id => { |
avm99963 | 5a57c41 | 2020-12-27 00:26:45 +0100 | [diff] [blame] | 143 | switch (notification_id) { |
| 144 | case 'install': |
Adrià Vilanova Martínez | 53f7a7f | 2022-05-30 13:59:59 +0200 | [diff] [blame] | 145 | chrome.runtime.openOptionsPage(); |
avm99963 | 5a57c41 | 2020-12-27 00:26:45 +0100 | [diff] [blame] | 146 | break; |
| 147 | } |
| 148 | chrome.notifications.clear(notification_id); |
avm99963 | 4a2a5d5 | 2016-06-04 16:17:29 +0200 | [diff] [blame] | 149 | }); |
| 150 | |
avm99963 | ce257a9 | 2020-12-27 00:07:13 +0100 | [diff] [blame] | 151 | chrome.contextMenus.onClicked.addListener((info, tab) => { |
avm99963 | 5a57c41 | 2020-12-27 00:26:45 +0100 | [diff] [blame] | 152 | if (info.menuItemId == 'tr_options') { |
Adrià Vilanova Martínez | 53f7a7f | 2022-05-30 13:59:59 +0200 | [diff] [blame] | 153 | chrome.runtime.openOptionsPage(); |
avm99963 | 5a57c41 | 2020-12-27 00:26:45 +0100 | [diff] [blame] | 154 | } else { |
| 155 | translationClick(info, tab); |
| 156 | } |
avm99963 | 4a2a5d5 | 2016-06-04 16:17:29 +0200 | [diff] [blame] | 157 | }); |
avm99963 | ce257a9 | 2020-12-27 00:07:13 +0100 | [diff] [blame] | 158 | |
Adrià Vilanova Martínez | ec59934 | 2022-05-31 11:57:35 +0200 | [diff] [blame^] | 159 | chrome.tabs.onRemoved.addListener((tabId, removeInfo) => { |
| 160 | if (tabId == window.translator_tab) { |
| 161 | translator_window = null; |
| 162 | window.translator_tab = null; |
| 163 | } |
| 164 | }); |
| 165 | |
Adrià Vilanova Martínez | 53f7a7f | 2022-05-30 13:59:59 +0200 | [diff] [blame] | 166 | chrome.browserAction.onClicked.addListener(() => { |
| 167 | chrome.runtime.openOptionsPage(); |
avm99963 | ce257a9 | 2020-12-27 00:07:13 +0100 | [diff] [blame] | 168 | }); |