blob: d3aa1edfb39deca0d3831de612adf14c2eafb89a [file] [log] [blame]
Adrià Vilanova Martínez86fda492022-05-31 15:05:21 +02001import actionApi from './common/actionApi.js';
Adrià Vilanova Martínez53f7a7f2022-05-30 13:59:59 +02002import {isoLangs} from './common/consts.js';
3import Options from './common/options.js';
Adrià Vilanova Martínez86fda492022-05-31 15:05:21 +02004import ExtSessionStorage from './common/sessionStorage.js';
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ínez86fda492022-05-31 15:05:21 +020017 let optionsPromise = Options.getOptions();
18 let ssPromise = ExtSessionStorage.get(['contextMenuLangs', 'translatorTab']);
19 Promise.all([optionsPromise, ssPromise])
20 .then(returnValues => {
21 const [options, sessionStorageItems] = returnValues;
Adrià Vilanova Martínezec599342022-05-31 11:57:35 +020022 let url = getTranslationUrl(
Adrià Vilanova Martínez86fda492022-05-31 15:05:21 +020023 sessionStorageItems.contextMenuLangs?.[info.menuItemId],
24 info.selectionText);
Adrià Vilanova Martínezec599342022-05-31 11:57:35 +020025 let settings_tab = {url};
Adrià Vilanova Martínez86fda492022-05-31 15:05:21 +020026 if (sessionStorageItems.translatorTab && options.uniqueTab == 'yep') {
27 chrome.tabs.update(
28 sessionStorageItems.translatorTab, settings_tab, tab => {
29 chrome.tabs.highlight(
30 {
31 windowId: tab.windowId,
32 tabs: tab.index,
33 },
34 () => {
35 chrome.windows.update(tab.windowId, {
36 focused: true,
37 });
38 });
39 });
Adrià Vilanova Martínez53f7a7f2022-05-30 13:59:59 +020040 } else if (options.uniqueTab == 'popup') {
Adrià Vilanova Martínezec599342022-05-31 11:57:35 +020041 chrome.windows.create({
42 type: 'popup',
43 url,
44 width: 1000,
45 height: 382,
46 });
Adrià Vilanova Martínez53f7a7f2022-05-30 13:59:59 +020047 } else {
48 chrome.tabs.create(settings_tab, function(tab) {
Adrià Vilanova Martínez86fda492022-05-31 15:05:21 +020049 ExtSessionStorage.set({translatorTab: tab.id});
avm999635a57c412020-12-27 00:26:45 +010050 });
Adrià Vilanova Martínez53f7a7f2022-05-30 13:59:59 +020051 }
52 })
53 .catch(err => {
Adrià Vilanova Martínez86fda492022-05-31 15:05:21 +020054 console.error('Error handling translation click', err);
avm999635a57c412020-12-27 00:26:45 +010055 });
avm999634a2a5d52016-06-04 16:17:29 +020056}
57
Adrià Vilanova Martínez53f7a7f2022-05-30 13:59:59 +020058function createMenus(options) {
59 chrome.contextMenus.removeAll();
avm999634a2a5d52016-06-04 16:17:29 +020060
Adrià Vilanova Martínez86fda492022-05-31 15:05:21 +020061 let contextMenuLangs = {};
Adrià Vilanova Martínez53f7a7f2022-05-30 13:59:59 +020062 let langs = options.targetLangs;
63 let isSingleEntry = Object.values(langs).length == 1;
avm999634a2a5d52016-06-04 16:17:29 +020064
Adrià Vilanova Martínez53f7a7f2022-05-30 13:59:59 +020065 let parentEl;
66 if (!isSingleEntry) {
67 parentEl = chrome.contextMenus.create({
68 'id': 'parent',
avm999635a57c412020-12-27 00:26:45 +010069 'title': chrome.i18n.getMessage('contextmenu_title'),
70 'contexts': ['selection']
71 });
Adrià Vilanova Martínez53f7a7f2022-05-30 13:59:59 +020072 }
73
74 for (let [index, language] of Object.entries(langs)) {
75 let languageDetails = isoLangs[language];
76 if (languageDetails === undefined) {
77 console.error(language + ' doesn\'t exist!');
78 continue;
79 }
80 let title;
81 if (isSingleEntry) {
82 title =
83 chrome.i18n.getMessage('contextmenu_title2', languageDetails.name);
84 } else {
85 title = languageDetails.name + ' (' + languageDetails.nativeName + ')';
86 }
87 let id = chrome.contextMenus.create({
88 'id': 'tr_language_' + language,
89 'title': title,
90 'parentId': parentEl,
91 'contexts': ['selection']
92 });
Adrià Vilanova Martínez86fda492022-05-31 15:05:21 +020093 contextMenuLangs[id] = language;
Adrià Vilanova Martínez53f7a7f2022-05-30 13:59:59 +020094 }
95
96 if (!isSingleEntry) {
97 chrome.contextMenus.create({
98 'id': 'tr_separator',
99 'type': 'separator',
100 'parentId': parentEl,
101 'contexts': ['selection']
102 });
103 chrome.contextMenus.create({
avm999635a57c412020-12-27 00:26:45 +0100104 'id': 'tr_options',
105 'title': chrome.i18n.getMessage('contextmenu_edit'),
Adrià Vilanova Martínez53f7a7f2022-05-30 13:59:59 +0200106 'parentId': parentEl,
avm999635a57c412020-12-27 00:26:45 +0100107 'contexts': ['selection']
108 });
109 }
Adrià Vilanova Martínez86fda492022-05-31 15:05:21 +0200110
111 return ExtSessionStorage.set({contextMenuLangs});
Adrià Vilanova Martínez53f7a7f2022-05-30 13:59:59 +0200112}
113
114chrome.storage.onChanged.addListener((changes, areaName) => {
115 if (areaName == 'sync') {
116 Options.getOptions(/* readOnly = */ false)
117 .then(options => {
Adrià Vilanova Martínez86fda492022-05-31 15:05:21 +0200118 return createMenus(options);
Adrià Vilanova Martínez53f7a7f2022-05-30 13:59:59 +0200119 })
120 .catch(err => {
121 console.error(
Adrià Vilanova Martínez86fda492022-05-31 15:05:21 +0200122 'Error setting up the extension after a change ' +
Adrià Vilanova Martínez53f7a7f2022-05-30 13:59:59 +0200123 'in the storage area.',
124 err);
125 });
126 }
avm999634a2a5d52016-06-04 16:17:29 +0200127});
128
Adrià Vilanova Martínez53f7a7f2022-05-30 13:59:59 +0200129Options.getOptions(/* readOnly = */ false)
130 .then(options => {
131 if (options.isFirstRun) {
132 chrome.notifications.create('install', {
133 type: 'basic',
134 iconUrl: 'icons/translate-128.png',
135 title: chrome.i18n.getMessage('notification_install_title'),
136 message: chrome.i18n.getMessage('notification_install_message'),
137 isClickable: true
138 });
139 }
140
Adrià Vilanova Martínez86fda492022-05-31 15:05:21 +0200141 return createMenus(options);
Adrià Vilanova Martínez53f7a7f2022-05-30 13:59:59 +0200142 })
143 .catch(err => {
Adrià Vilanova Martínez86fda492022-05-31 15:05:21 +0200144 console.error('Error initializing the extension.', err);
Adrià Vilanova Martínez53f7a7f2022-05-30 13:59:59 +0200145 });
146
avm99963ce257a92020-12-27 00:07:13 +0100147chrome.notifications.onClicked.addListener(notification_id => {
avm999635a57c412020-12-27 00:26:45 +0100148 switch (notification_id) {
149 case 'install':
Adrià Vilanova Martínez53f7a7f2022-05-30 13:59:59 +0200150 chrome.runtime.openOptionsPage();
avm999635a57c412020-12-27 00:26:45 +0100151 break;
152 }
153 chrome.notifications.clear(notification_id);
avm999634a2a5d52016-06-04 16:17:29 +0200154});
155
avm99963ce257a92020-12-27 00:07:13 +0100156chrome.contextMenus.onClicked.addListener((info, tab) => {
avm999635a57c412020-12-27 00:26:45 +0100157 if (info.menuItemId == 'tr_options') {
Adrià Vilanova Martínez53f7a7f2022-05-30 13:59:59 +0200158 chrome.runtime.openOptionsPage();
avm999635a57c412020-12-27 00:26:45 +0100159 } else {
160 translationClick(info, tab);
161 }
avm999634a2a5d52016-06-04 16:17:29 +0200162});
avm99963ce257a92020-12-27 00:07:13 +0100163
Adrià Vilanova Martínezec599342022-05-31 11:57:35 +0200164chrome.tabs.onRemoved.addListener((tabId, removeInfo) => {
Adrià Vilanova Martínez86fda492022-05-31 15:05:21 +0200165 ExtSessionStorage.get('translatorTab')
166 .then(items => {
167 if (tabId == items.translatorTab) {
168 ExtSessionStorage.set({translatorTab: null});
169 }
170 })
171 .catch(err => console.log(err));
Adrià Vilanova Martínezec599342022-05-31 11:57:35 +0200172});
173
Adrià Vilanova Martínez86fda492022-05-31 15:05:21 +0200174actionApi.onClicked.addListener(() => {
Adrià Vilanova Martínez53f7a7f2022-05-30 13:59:59 +0200175 chrome.runtime.openOptionsPage();
avm99963ce257a92020-12-27 00:07:13 +0100176});
Adrià Vilanova Martínez86fda492022-05-31 15:05:21 +0200177
178chrome.runtime.onMessage.addListener((request, sender, sendResponse) => {
179 switch (request.action) {
180 case 'clearTranslatorTab':
181 ExtSessionStorage.set({translatorTab: null});
182 break;
183
184 default:
185 console.error(`Unknown action "${action}" received as a message.`);
186 }
187});