blob: 7058875ed03ccd6560334abfbd86afe992ad09c7 [file] [log] [blame]
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, function() {
chrome.notifications.create('upgradedtostorage', {
type: 'basic',
iconUrl: 'icons/translate-128.png',
title:
chrome.i18n.getMessage('notification_upgradedtostorage_title'),
message: chrome.i18n.getMessage(
'notification_upgradedtostorage_message'),
isClickable: true,
});
});
}
// 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, _ => {
chrome.notifications.create('reorder', {
type: 'basic',
iconUrl: 'icons/translate-128.png',
title: chrome.i18n.getMessage('notification_reorder_title'),
message: chrome.i18n.getMessage('notification_reorder_message'),
isClickable: true
});
});
}
// 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':
case 'upgradedtostorage':
case 'reorder':
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();
});