blob: 0befddffa37ed4da05ff4e4c6f5dde26a8095701 [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
Adrià Vilanova Martínezec599342022-05-31 11:57:35 +02004window.contextMenuLangs = [];
5window.translator_tab = null;
avm999634a2a5d52016-06-04 16:17:29 +02006
avm99963ce257a92020-12-27 00:07:13 +01007function getTranslationUrl(lang, text) {
avm999635a57c412020-12-27 00:26:45 +01008 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();
avm99963ce257a92020-12-27 00:07:13 +010015}
16
17function translationClick(info, tab) {
Adrià Vilanova Martínez53f7a7f2022-05-30 13:59:59 +020018 Options.getOptions()
19 .then(options => {
Adrià Vilanova Martínezec599342022-05-31 11:57:35 +020020 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ínez53f7a7f2022-05-30 13:59:59 +020025 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ínezec599342022-05-31 11:57:35 +020037 chrome.windows.create({
38 type: 'popup',
39 url,
40 width: 1000,
41 height: 382,
42 });
Adrià Vilanova Martínez53f7a7f2022-05-30 13:59:59 +020043 } else {
44 chrome.tabs.create(settings_tab, function(tab) {
Adrià Vilanova Martínezec599342022-05-31 11:57:35 +020045 let translator_window = tab.windowId;
46 window.translator_tab = tab.id;
avm999635a57c412020-12-27 00:26:45 +010047 });
Adrià Vilanova Martínez53f7a7f2022-05-30 13:59:59 +020048 }
49 })
50 .catch(err => {
51 console.error('Error retrieving options to handle translation', err);
avm999635a57c412020-12-27 00:26:45 +010052 });
avm999634a2a5d52016-06-04 16:17:29 +020053}
54
Adrià Vilanova Martínez53f7a7f2022-05-30 13:59:59 +020055function createMenus(options) {
56 chrome.contextMenus.removeAll();
avm999634a2a5d52016-06-04 16:17:29 +020057
Adrià Vilanova Martínez53f7a7f2022-05-30 13:59:59 +020058 let langs = options.targetLangs;
59 let isSingleEntry = Object.values(langs).length == 1;
avm999634a2a5d52016-06-04 16:17:29 +020060
Adrià Vilanova Martínez53f7a7f2022-05-30 13:59:59 +020061 let parentEl;
62 if (!isSingleEntry) {
63 parentEl = chrome.contextMenus.create({
64 'id': 'parent',
avm999635a57c412020-12-27 00:26:45 +010065 'title': chrome.i18n.getMessage('contextmenu_title'),
66 'contexts': ['selection']
67 });
Adrià Vilanova Martínez53f7a7f2022-05-30 13:59:59 +020068 }
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ínezec599342022-05-31 11:57:35 +020089 window.contextMenuLangs[id] = language;
Adrià Vilanova Martínez53f7a7f2022-05-30 13:59:59 +020090 }
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({
avm999635a57c412020-12-27 00:26:45 +0100100 'id': 'tr_options',
101 'title': chrome.i18n.getMessage('contextmenu_edit'),
Adrià Vilanova Martínez53f7a7f2022-05-30 13:59:59 +0200102 'parentId': parentEl,
avm999635a57c412020-12-27 00:26:45 +0100103 'contexts': ['selection']
104 });
105 }
Adrià Vilanova Martínez53f7a7f2022-05-30 13:59:59 +0200106}
107
108chrome.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 }
avm999634a2a5d52016-06-04 16:17:29 +0200121});
122
Adrià Vilanova Martínez53f7a7f2022-05-30 13:59:59 +0200123Options.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
avm99963ce257a92020-12-27 00:07:13 +0100142chrome.notifications.onClicked.addListener(notification_id => {
avm999635a57c412020-12-27 00:26:45 +0100143 switch (notification_id) {
144 case 'install':
Adrià Vilanova Martínez53f7a7f2022-05-30 13:59:59 +0200145 chrome.runtime.openOptionsPage();
avm999635a57c412020-12-27 00:26:45 +0100146 break;
147 }
148 chrome.notifications.clear(notification_id);
avm999634a2a5d52016-06-04 16:17:29 +0200149});
150
avm99963ce257a92020-12-27 00:07:13 +0100151chrome.contextMenus.onClicked.addListener((info, tab) => {
avm999635a57c412020-12-27 00:26:45 +0100152 if (info.menuItemId == 'tr_options') {
Adrià Vilanova Martínez53f7a7f2022-05-30 13:59:59 +0200153 chrome.runtime.openOptionsPage();
avm999635a57c412020-12-27 00:26:45 +0100154 } else {
155 translationClick(info, tab);
156 }
avm999634a2a5d52016-06-04 16:17:29 +0200157});
avm99963ce257a92020-12-27 00:07:13 +0100158
Adrià Vilanova Martínezec599342022-05-31 11:57:35 +0200159chrome.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ínez53f7a7f2022-05-30 13:59:59 +0200166chrome.browserAction.onClicked.addListener(() => {
167 chrome.runtime.openOptionsPage();
avm99963ce257a92020-12-27 00:07:13 +0100168});