blob: e72574e3f1d1aba5f7a857806f0316ee563769b6 [file] [log] [blame]
Adrià Vilanova Martínez53f7a7f2022-05-30 13:59:59 +02001import {isoLangs} from './common/consts.js';
2import Options from './common/options.js';
Adrià Vilanova Martíneza197d862022-05-27 17:33:20 +02003
avm99963ce257a92020-12-27 00:07:13 +01004var array_elements = [], translator_tab = null, translator_window = null;
avm999634a2a5d52016-06-04 16:17:29 +02005
avm99963ce257a92020-12-27 00:07:13 +01006function getTranslationUrl(lang, text) {
avm999635a57c412020-12-27 00:26:45 +01007 var params = new URLSearchParams({
8 sl: 'auto',
9 tl: lang,
10 text: text,
11 op: 'translate',
12 });
13 return 'https://translate.google.com/?' + params.toString();
avm99963ce257a92020-12-27 00:07:13 +010014}
15
16function translationClick(info, tab) {
Adrià Vilanova Martínez53f7a7f2022-05-30 13:59:59 +020017 Options.getOptions()
18 .then(options => {
19 var url = getTranslationUrl(
20 array_elements[info.menuItemId]['langCode'], info.selectionText);
21 var settings_tab = {url};
22 if (translator_tab && options.uniqueTab == 'yep') {
23 chrome.tabs.update(translator_tab, settings_tab, tab => {
24 chrome.tabs.highlight(
25 {
26 windowId: tab.windowId,
27 tabs: tab.index,
28 },
29 () => {
30 chrome.windows.update(tab.windowId, {
31 focused: true,
32 });
33 });
34 });
35 } else if (options.uniqueTab == 'popup') {
36 chrome.windows.create(
37 {
38 type: 'popup',
39 url,
40 width: 1000,
41 height: 382,
42 },
43 function(tab) {
44 translator_window = tab.windowId;
45 translator_tab = tab.id;
46 chrome.windows.onRemoved.addListener(function(windowId) {
47 if (windowId == translator_window) {
48 translator_window = null;
49 translator_tab = null;
50 }
51 });
avm999635a57c412020-12-27 00:26:45 +010052 });
Adrià Vilanova Martínez53f7a7f2022-05-30 13:59:59 +020053 } else {
54 chrome.tabs.create(settings_tab, function(tab) {
avm999635a57c412020-12-27 00:26:45 +010055 translator_window = tab.windowId;
56 translator_tab = tab.id;
Adrià Vilanova Martínez53f7a7f2022-05-30 13:59:59 +020057 chrome.tabs.onRemoved.addListener(function(tabId, removeInfo) {
58 if (tabId == translator_tab) {
avm999635a57c412020-12-27 00:26:45 +010059 translator_window = null;
60 translator_tab = null;
61 }
62 });
63 });
Adrià Vilanova Martínez53f7a7f2022-05-30 13:59:59 +020064 }
65 })
66 .catch(err => {
67 console.error('Error retrieving options to handle translation', err);
avm999635a57c412020-12-27 00:26:45 +010068 });
avm999634a2a5d52016-06-04 16:17:29 +020069}
70
Adrià Vilanova Martínez53f7a7f2022-05-30 13:59:59 +020071function createMenus(options) {
72 chrome.contextMenus.removeAll();
avm999634a2a5d52016-06-04 16:17:29 +020073
Adrià Vilanova Martínez53f7a7f2022-05-30 13:59:59 +020074 let langs = options.targetLangs;
75 let isSingleEntry = Object.values(langs).length == 1;
avm999634a2a5d52016-06-04 16:17:29 +020076
Adrià Vilanova Martínez53f7a7f2022-05-30 13:59:59 +020077 let parentEl;
78 if (!isSingleEntry) {
79 parentEl = chrome.contextMenus.create({
80 'id': 'parent',
avm999635a57c412020-12-27 00:26:45 +010081 'title': chrome.i18n.getMessage('contextmenu_title'),
82 'contexts': ['selection']
83 });
Adrià Vilanova Martínez53f7a7f2022-05-30 13:59:59 +020084 }
85
86 for (let [index, language] of Object.entries(langs)) {
87 let languageDetails = isoLangs[language];
88 if (languageDetails === undefined) {
89 console.error(language + ' doesn\'t exist!');
90 continue;
91 }
92 let title;
93 if (isSingleEntry) {
94 title =
95 chrome.i18n.getMessage('contextmenu_title2', languageDetails.name);
96 } else {
97 title = languageDetails.name + ' (' + languageDetails.nativeName + ')';
98 }
99 let id = chrome.contextMenus.create({
100 'id': 'tr_language_' + language,
101 'title': title,
102 'parentId': parentEl,
103 'contexts': ['selection']
104 });
105 array_elements[id] = new Array();
106 array_elements[id]['langCode'] = language;
107 }
108
109 if (!isSingleEntry) {
110 chrome.contextMenus.create({
111 'id': 'tr_separator',
112 'type': 'separator',
113 'parentId': parentEl,
114 'contexts': ['selection']
115 });
116 chrome.contextMenus.create({
avm999635a57c412020-12-27 00:26:45 +0100117 'id': 'tr_options',
118 'title': chrome.i18n.getMessage('contextmenu_edit'),
Adrià Vilanova Martínez53f7a7f2022-05-30 13:59:59 +0200119 'parentId': parentEl,
avm999635a57c412020-12-27 00:26:45 +0100120 'contexts': ['selection']
121 });
122 }
Adrià Vilanova Martínez53f7a7f2022-05-30 13:59:59 +0200123}
124
125chrome.storage.onChanged.addListener((changes, areaName) => {
126 if (areaName == 'sync') {
127 Options.getOptions(/* readOnly = */ false)
128 .then(options => {
129 createMenus(options);
130 })
131 .catch(err => {
132 console.error(
133 'Error retrieving options to set up the extension after a change ' +
134 'in the storage area.',
135 err);
136 });
137 }
avm999634a2a5d52016-06-04 16:17:29 +0200138});
139
Adrià Vilanova Martínez53f7a7f2022-05-30 13:59:59 +0200140Options.getOptions(/* readOnly = */ false)
141 .then(options => {
142 if (options.isFirstRun) {
143 chrome.notifications.create('install', {
144 type: 'basic',
145 iconUrl: 'icons/translate-128.png',
146 title: chrome.i18n.getMessage('notification_install_title'),
147 message: chrome.i18n.getMessage('notification_install_message'),
148 isClickable: true
149 });
150 }
151
152 createMenus(options);
153 })
154 .catch(err => {
155 console.error(
156 'Error retrieving options to initialize the extension.', err);
157 });
158
avm99963ce257a92020-12-27 00:07:13 +0100159chrome.notifications.onClicked.addListener(notification_id => {
avm999635a57c412020-12-27 00:26:45 +0100160 switch (notification_id) {
161 case 'install':
Adrià Vilanova Martínez53f7a7f2022-05-30 13:59:59 +0200162 chrome.runtime.openOptionsPage();
avm999635a57c412020-12-27 00:26:45 +0100163 break;
164 }
165 chrome.notifications.clear(notification_id);
avm999634a2a5d52016-06-04 16:17:29 +0200166});
167
avm99963ce257a92020-12-27 00:07:13 +0100168chrome.contextMenus.onClicked.addListener((info, tab) => {
avm999635a57c412020-12-27 00:26:45 +0100169 if (info.menuItemId == 'tr_options') {
Adrià Vilanova Martínez53f7a7f2022-05-30 13:59:59 +0200170 chrome.runtime.openOptionsPage();
avm999635a57c412020-12-27 00:26:45 +0100171 } else {
172 translationClick(info, tab);
173 }
avm999634a2a5d52016-06-04 16:17:29 +0200174});
avm99963ce257a92020-12-27 00:07:13 +0100175
Adrià Vilanova Martínez53f7a7f2022-05-30 13:59:59 +0200176chrome.browserAction.onClicked.addListener(() => {
177 chrome.runtime.openOptionsPage();
avm99963ce257a92020-12-27 00:07:13 +0100178});