diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 00000000..2e19cc40 --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1,15 @@ +# These are supported funding model platforms + +github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] +patreon: # Replace with a single Patreon username +open_collective: # Replace with a single Open Collective username +ko_fi: webextension +tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel +community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry +liberapay: # Replace with a single Liberapay username +issuehunt: # Replace with a single IssueHunt username +lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry +polar: # Replace with a single Polar username +buy_me_a_coffee: # Replace with a single Buy Me a Coffee username +thanks_dev: # Replace with a single thanks.dev username +custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] diff --git a/.gitignore b/.gitignore deleted file mode 100644 index 1da1310a..00000000 --- a/.gitignore +++ /dev/null @@ -1,7 +0,0 @@ -addon-sdk* -node_modules/ -server/node_modules/ -builds/unpacked -test/ -.DS_Store -Thumbs.db diff --git a/README.md b/README.md index 1ae70344..9ef189d6 100644 --- a/README.md +++ b/README.md @@ -1,30 +1,23 @@ -## [Gmail Notifier](http://add0n.com/gmail-notifier.html) multi-browser extension (ignotifier) +## [Gmail Notifier](https://webextension.org/listing/gmail-notifier.html) browser extension (ignotifier) ### Description -[Gmail Notifier](http://add0n.com/gmail-notifier.html) is a multi-account notifier for Google mail (without storing passwords locally) - -![116888](https://cloud.githubusercontent.com/assets/351062/19102298/0a93ce12-8adc-11e6-9a35-b4e183de6c73.png) - -### General information -To compile ignotifier project you need to have these softwares and libraries available: - - * [nodejs](http://nodejs.org/) - * [Mozilla JPM](https://developer.mozilla.org/en-US/Add-ons/SDK/Tools/jpm) - * [Gulp.JS](http://gulpjs.com/) - -### Folders description -* compile: nodejs locale converter -* preview: screenshots -* src: ignotifier source code - -### How to compile ignotifier -1. Open a new terminal in the root dir (directory contains src, preview, template, and compile folders) -2. Run `npm install` to acquire the necessary nodejs packages -3. Run `gulp firefox` or `gulp chrome` to compile ignotifier in Firefox or Chrome browsers - * After running `gulp firefox`, project gets compiled for Firefox browser. Compiled files will be located on `builds/unpacked/firefox` folder. An executable XPI will be placed in `builds/packed/firefox.xpi` - * After running `gulp chrome`, project gets compiled for Chrome/Opera browser. Compiled files will be located on `builds/unpacked/chrome` folder. A zipped archive will be placed in `builds/packed/chrome.zip` - * For `gulp firefox` to auto install the extension on your Firefox browser, you need to have [Extension Auto-Installer](https://addons.mozilla.org/en-US/firefox/addon/autoinstaller/) installed in your Firefox. - * For `gulp chrome` to auto install the extension on your Chrome browser, you will need to modify [Line 65 of `gulp.js`](https://github.com/inbasic/ignotifier/blob/master/gulpfile.js#L65) to your Chrome executable (the current path is for Mac OS). +[Gmail Notifier](https://webextension.org/listing/gmail-notifier.html) is a multi-account notifier for Google mail (without storing passwords locally) + +### YouTube Preview +[![YouTube Preview](https://img.youtube.com/vi/5Z2huN_GNkA/0.jpg)](https://www.youtube.com/watch?v=5Z2huN_GNkA) + +### Listings (v3) + + * [Chrome Webstore](https://chrome.google.com/webstore/detail/gmail-notifier-developer/inglgcknnendooehdkhplbmhhbfkngmg) + * [Firefox Add-ons](https://addons.mozilla.org/firefox/addon/gmail-notifier-dev-edition/) + * [Edge Addons](https://microsoftedge.microsoft.com/addons/detail/jhgfdokolagmnmjggpipkdefblhlhaap) + +### Listings (v2) + + * [Chrome Webstore](https://chrome.google.com/webstore/detail/gmail-notifier/dcjichoefijpinlfnjghokpkojhlhkgl) + * [Firefox Add-ons](https://addons.mozilla.org/firefox/addon/gmail-notifier-restartless/) + * [Edge Addons](https://microsoftedge.microsoft.com/addons/detail/cmhmeappbhdaifkknkhdnmogalbnhloa) + * [Opera Addons](https://addons.opera.com/extensions/details/gmail-notifier/) ### How to translate ignotifier * To translate ignotifier into your language head to [transifex.com](https://www.transifex.com/projects/p/gmail-notifier-addon) page. diff --git a/WebExtension/data/icons/gray/19.png b/WebExtension/data/icons/gray/19.png deleted file mode 100644 index d50d7f37..00000000 Binary files a/WebExtension/data/icons/gray/19.png and /dev/null differ diff --git a/WebExtension/data/icons/new/19.png b/WebExtension/data/icons/new/19.png deleted file mode 100644 index 13b3e13e..00000000 Binary files a/WebExtension/data/icons/new/19.png and /dev/null differ diff --git a/WebExtension/data/icons/options/16.png b/WebExtension/data/icons/options/16.png deleted file mode 100644 index f05726a7..00000000 Binary files a/WebExtension/data/icons/options/16.png and /dev/null differ diff --git a/WebExtension/data/options/redirect.html b/WebExtension/data/options/redirect.html deleted file mode 100644 index d5d9ee7e..00000000 --- a/WebExtension/data/options/redirect.html +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - Open Options page - - - diff --git a/WebExtension/data/options/redirect.js b/WebExtension/data/options/redirect.js deleted file mode 100644 index 5c3f7ec3..00000000 --- a/WebExtension/data/options/redirect.js +++ /dev/null @@ -1,3 +0,0 @@ -'use strict'; - -document.querySelector('a').click(); diff --git a/WebExtension/data/popup/body/index.css b/WebExtension/data/popup/body/index.css deleted file mode 100644 index d4c65155..00000000 --- a/WebExtension/data/popup/body/index.css +++ /dev/null @@ -1,14 +0,0 @@ -body { - margin: 0; -} -table { - color: inherit; -} -body, td { - font-family: arial,sans-serif; - font-size: 12px; -} -a { - color: #1155CC; - text-decoration: none; -} diff --git a/WebExtension/data/popup/gmail.js b/WebExtension/data/popup/gmail.js deleted file mode 100644 index b0b874c5..00000000 --- a/WebExtension/data/popup/gmail.js +++ /dev/null @@ -1,250 +0,0 @@ -'use strict'; - -var gmail = {}; - -gmail.fetch = url => fetch(url, {credentials: 'same-origin'}).then(r => { - if (r.ok) { - return r; - } - throw Error('action -> fetch Error'); -}); - -gmail.get = { - base: url => /[^?]*/.exec(url)[0], - id: url => { - const tmp = /message_id=([^&]*)/.exec(url); - if (tmp && tmp.length) { - return tmp[1]; - } - return null; - } -}; - -gmail.action = (token => { - function getAt(url) { - if (token[url]) { - return Promise.resolve(token[url]); - } - return gmail.fetch(url).then(r => r.text()).then(content => { - const tmp = /GM_ACTION_TOKEN="([^"]*)"/.exec(content); - if (tmp && tmp.length) { - token[url] = tmp[1]; - return token[url]; - } - else { - return gmail.fetch(url + 'h/' + Math.ceil(1000000 * Math.random())).then(r => r.text()).then(content => { - const tmp = /at=([^"&]*)/.exec(content); - if (tmp && tmp.length > 1) { - token[url] = tmp[1]; - } - return token[url]; - }); - } - }); - } - - function sendCmd(url, at, threads, cmd) { - if (cmd === 'rc_%5Ei') { - // mark as read on archive - chrome.storage.local.get({ - doReadOnArchive: false - }, prefs => { - if (prefs.doReadOnArchive === true || prefs.doReadOnArchive === 'true') { - sendCmd(url, at, threads, 'rd'); - } - }); - } - return gmail.fetch(url + '&at=' + at + '&act=' + cmd.replace('rd-all', 'rd') + '&t=' + threads.join('&t=')); - } - - return (links, cmd) => { - links = typeof links === 'string' ? [links] : links; - const url = /[^?]*/.exec(links[0])[0] + '/?ibxr=0'; - return getAt(url).then(function(at) { - if (!at) { - return Promise.reject(new Error('action -> Cannot resolve GM_ACTION_TOKEN')); - } - const threads = links.map(link => gmail.get.id(link) || '').map(t => t); - - if (threads.length) { - return sendCmd(url, at, threads, cmd); - } - return Promise.reject(Error('action -> Error at resolving thread.')); - }); - }; -})({}); - -gmail.staticID = (iks => url => { - if (iks[url]) { - return Promise.resolve(iks[url]); - } - return gmail.fetch(url).then(r => r.text()).then(content => { - const tmp = /var GLOBALS=\[(?:([^,]*),){10}/.exec(content || ''); - const ik = tmp && tmp.length > 1 ? tmp[1].replace(/["']/g, '') : null; - if (ik) { - iks[url] = ik; - return ik; - } - else { - throw Error( - 'body -> getIK -> ' + - 'Error at resolving user\'s static ID. Please switch back to the summary mode.' - ); - } - }); -})({}); - -gmail.body = (contents => (link, mode) => { - console.log(link, mode) - link = link.replace('http://', 'https://'); - if (contents[link]) { - return Promise.resolve(contents[link]); - } - - const url = /[^?]*/.exec(link)[0] + '/?ibxr=0'; - const thread = gmail.get.id(link); - - if (!thread) { - return Promise.reject(Error('body -> Error at resolving thread. Please switch back to the summary mode.')); - } - return gmail.staticID(url) - .then(ik => gmail.fetch(url + '&ui=2&ik=' + ik + '&view=pt&dsqt=1&search=all&msg=' + thread) - .then(r => r.text()) - .then(content => { - const body = gmail.render[mode === 1 ? 'getHTMLText' : 'getPlainText'](content, url, link); - contents[link] = body; - return body; - })); -})({}); - -gmail.render = (() => { - const getLastMessage = content => { - const html = new DOMParser().parseFromString(content, 'text/html'); - const message = html.documentElement.getElementsByClassName('message'); - try { - return message[message.length - 1].children[0].children[2]; - } - catch (e) {} - return ''; - }; - - return { - getHTMLText: (content, link, feed) => { - const body = getLastMessage(content); - return body ? - body.innerHTML - .replace(/src="\/mail\/u\//g, 'src="https://mail.google.com/mail/u/') - .replace(/\?ui=2&/g, link + '?ui=2&') - .replace(//g, '') - .replace('[Quoted text hidden]', '[Quoted text hidden]') : - content; - }, - getPlainText: content => { - const body = getLastMessage(content) || '...'; - - const normalize = a => { - if (!a) { - return ''; - } - return a - .replace(/ +/g, ' ') - .replace(/[\t]+/gm, '') - .replace(/[ ]+$/gm, '') - .replace(/^[ ]+/gm, '') - .replace(/\n{2,}/g, '\n\n') - .replace(/\n+$/, '') - .replace(/^\n+/, '') - .replace(/\nNEWLINE\n/g, '\n\n') - .replace(/NEWLINE\n/g, '\n\n') - .replace(/NEWLINE/g, '\n'); - }; - const removeWhiteSpace = node => { - const isWhite = node => !(/[^\t\n\r ]/.test(node.nodeValue)); - const ws = []; - const findWhite = node => { - for (let i = 0; i < node.childNodes.length; i++) { - const n = node.childNodes[i]; - if (n.nodeType === 3 && isWhite(n)) { - ws.push(n); - } - else if (n.hasChildNodes()) { - findWhite(n); - } - } - }; - findWhite(node); - for (let i = 0; i < ws.length; i++) { - ws[i].parentNode.removeChild(ws[i]); - } - }; - const sty = (n, prop) => { - const s = n.currentStyle || window.getComputedStyle(n, null); - if (n.tagName === 'SCRIPT') { - return 'none'; - } - if (!s[prop]) { - return 'LI,P,TR'.indexOf(n.tagName) > -1 ? 'block' : n.style[prop]; - } - if (s[prop] === 'block' && n.tagName === 'TD') { - return 'feaux-inline'; - } - return s[prop]; - }; - - const blockTypeNodes = 'table-row,block,list-item'; - const isBlock = n => { - const s = sty(n, 'display') || 'feaux-inline'; - if (blockTypeNodes.indexOf(s) > -1) { - return true; - } - return false; - }; - const recurse = n => { - let t = ''; - if (/pre/.test(sty(n, 'whiteSpace'))) { - t += n.innerHTML - .replace(/\t/g, ' ') - .replace(/\n/g, ' '); - return ''; - } - const s = sty(n, 'display'); - if (s === 'none') { - return ''; - } - const gap = isBlock(n) ? '\n' : ' '; - - t += gap; - for (let i = 0; i < n.childNodes.length; i++) { - const c = n.childNodes[i]; - if (c.localName === 'a' && c.href && c.textContent) { - t += "" + c.textContent + ''; - } - else if (c.nodeType === 3) { - t += c.nodeValue; - } - else if (c.childNodes.length) { - recurse(c); - } - } - t += gap; - t = t.replace(/(<[^>^<]+>)/ig, function(s) { //Strip HTML tags - return s.indexOf('') !== -1 ? s : s.replace(//g, '>'); - }); - return t; - }; - const node = body.cloneNode(true); - node.innerHTML = node.innerHTML.replace(/
/g, '\n'); - const paras = node.getElementsByTagName('p'); - for (let i = 0; i < paras.length; i++) { - paras[i].innerHTML += 'NEWLINE'; - } - - removeWhiteSpace(node); - - return normalize(recurse(node)) - .replace(/^\s\s*/, '').replace(/\s\s*$/, '') - .replace(/\n\s{2,}\n/g, '\n\n') - .replace(/\n/g, '
'); - } - }; -})(); diff --git a/drawings/blue.svg b/drawings/blue.svg new file mode 100644 index 00000000..052baa4a --- /dev/null +++ b/drawings/blue.svg @@ -0,0 +1,53 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + diff --git a/drawings/gray.svg b/drawings/gray.svg new file mode 100644 index 00000000..a3046f0b --- /dev/null +++ b/drawings/gray.svg @@ -0,0 +1,53 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + diff --git a/drawings/icon.png b/drawings/icon.png index 48e6780f..56fe3315 100644 Binary files a/drawings/icon.png and b/drawings/icon.png differ diff --git a/drawings/new.svg b/drawings/new.svg new file mode 100644 index 00000000..8159acc0 --- /dev/null +++ b/drawings/new.svg @@ -0,0 +1,30 @@ + + + + + + image/svg+xml + + + + + + + diff --git a/drawings/p.svg b/drawings/p.svg new file mode 100644 index 00000000..9eb6ee17 --- /dev/null +++ b/drawings/p.svg @@ -0,0 +1,62 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + diff --git a/drawings/red.svg b/drawings/red.svg new file mode 100644 index 00000000..f2c715bd --- /dev/null +++ b/drawings/red.svg @@ -0,0 +1,53 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + diff --git a/JPM/builds/packed/icon.png b/v1/builds/packed/icon.png similarity index 100% rename from JPM/builds/packed/icon.png rename to v1/builds/packed/icon.png diff --git a/JPM/builds/packed/icon64.png b/v1/builds/packed/icon64.png similarity index 100% rename from JPM/builds/packed/icon64.png rename to v1/builds/packed/icon64.png diff --git a/JPM/builds/unpacked/chrome/_locales/bg/messages.json b/v1/builds/unpacked/chrome/_locales/bg/messages.json similarity index 100% rename from JPM/builds/unpacked/chrome/_locales/bg/messages.json rename to v1/builds/unpacked/chrome/_locales/bg/messages.json diff --git a/JPM/builds/unpacked/chrome/_locales/el/messages.json b/v1/builds/unpacked/chrome/_locales/el/messages.json similarity index 100% rename from JPM/builds/unpacked/chrome/_locales/el/messages.json rename to v1/builds/unpacked/chrome/_locales/el/messages.json diff --git a/WebExtension/_locales/en/messages.json b/v1/builds/unpacked/chrome/_locales/en/messages.json similarity index 91% rename from WebExtension/_locales/en/messages.json rename to v1/builds/unpacked/chrome/_locales/en/messages.json index 27f3c252..6bd7bb34 100644 --- a/WebExtension/_locales/en/messages.json +++ b/v1/builds/unpacked/chrome/_locales/en/messages.json @@ -6,7 +6,7 @@ "message": "Notifier for Gmail™" }, "tooltip_1": { - "message": "Left click: Open Gmail or mail preview panel" + "message": "Left click: Open Gmail™ or mail preview panel" }, "tooltip_2": { "message": "Middle (or Ctrl+Left) click: Refresh all accounts" @@ -15,13 +15,13 @@ "message": "Right click: Account selections" }, "description": { - "message": "Multiple label and account notifier for Google Mail (Gmail)" + "message": "Multiple label and account notifier for Google Mail (Gmail™)" }, "log_in_to_your_account": { - "message": "Please sign-in to your Gmail account" + "message": "Please sign-in to your Gmail™ account" }, "msg_1": { - "message": "Tab is already open. Click on the toolbar button to open Gmail in a new tab, or to switch to an existing Gmail tab." + "message": "Tab is already open. Click on the toolbar button to open Gmail™ in a new tab, or to switch to an existing Gmail™ tab." }, "msg_2": { "message": "Link is copied to the clipboard." @@ -89,14 +89,14 @@ "message": "Please log into your account" }, "notification": { - "message": "From: [author_email][break]Title: [title][break]Summary: [summary]" + "message": "From: [author_email][break] Title: [title][break] Summary: [summary]" }, "options_title": { "message": "Options - Gmail™ Notifier" }, "options_inshort": { - "message": "Multiple label and account notifier for Google Mail (Gmail)." + "message": "Multiple label and account notifier for Google Mail (Gmail™)." }, "options_donation": { "message": "Make a Donation" @@ -129,7 +129,7 @@ "message": "Set the value to zero for no email check until the first manual refresh [Not available on Safari]." }, "options_gmail": { - "message": "Gmail:" + "message": "Gmail™:" }, "options_gmail_1": { "message": "Primary account (/mail/u/0/)" @@ -229,7 +229,7 @@ }, "options_notifications_16": { - "message": "Gmail Notifier default alert" + "message": "Gmail™ Notifier default alert" }, "options_notifications_17": { "message": "Checker Plus bell alert" @@ -280,31 +280,31 @@ "message": "Tab Opening:" }, "options_tab_1": { - "message": "Search for an open Gmail account only on the active window" + "message": "Search for an open Gmail™ account only on the active window" }, "options_tab_2": { - "message": "Do not search other browser windows for open Gmail accounts. If Gmail is not open in the active window, open a new tab." + "message": "Do not search other browser windows for open Gmail™ accounts. If Gmail™ is not open in the active window, open a new tab." }, "options_tab_3": { - "message": "Open new Gmail account next to the active tab" + "message": "Open new Gmail™ account next to the active tab" }, "options_tab_4": { - "message": "Open Gmail account in the active tab" + "message": "Open Gmail™ account in the active tab" }, "options_tab_5": { - "message": "Open Gmail account in a background tab" + "message": "Open Gmail™ account in a background tab" }, "options_tab_6": { - "message": "Open Gmail account in a new window" + "message": "Open Gmail™ account in a new window" }, "options_tab_7": { "message": "Always use blank tabs instead of opening a new tab when open in tab is activated" }, "options_tab_8": { - "message": "Ignore opened Gmail tabs" + "message": "Ignore opened Gmail™ tabs" }, "options_tab_9": { - "message": "When unchecked, Gmail Notifier checks either active window or all open windows for open instance of Gmail and switch to the tab when tab opening is requested." + "message": "When unchecked, Gmail™ Notifier checks either active window or all open windows for open instance of Gmail™ and switch to the tab when tab opening is requested." }, "options_toolbar": { "message": "Toolbar:" @@ -316,7 +316,7 @@ "message": "Always open email preview panel" }, "options_toolbar_3": { - "message": "Open Gmail account if only one account is logged-in" + "message": "Open Gmail™ account if only one account is logged-in" }, "options_toolbar_4": { "message": "Toolbar panel mode" @@ -358,7 +358,7 @@ "message": "Refresh all accounts" }, "options_toolbar_17": { - "message": "Open primary Gmail account" + "message": "Open primary Gmail™ account" }, "options_misc": { "message": "Miscellaneous:" @@ -382,7 +382,7 @@ "message": "Red color for \"No Unread\" and gray color for \"Disconnected\"" }, "options_misc_6": { - "message": "Show desktop notification to warn that Gmail is already opened in the active tab" + "message": "Show desktop notification to warn that Gmail™ is already opened in the active tab" }, "options_misc_7": { "message": "Show welcome page on upgrade" diff --git a/JPM/src/_locales/fr/messages.json b/v1/builds/unpacked/chrome/_locales/fr/messages.json similarity index 83% rename from JPM/src/_locales/fr/messages.json rename to v1/builds/unpacked/chrome/_locales/fr/messages.json index afd61a1a..eb237b00 100644 --- a/JPM/src/_locales/fr/messages.json +++ b/v1/builds/unpacked/chrome/_locales/fr/messages.json @@ -16,11 +16,11 @@ "description": "" }, "options_notifications_30": { - "message": "Combine all concurrent desktop notifications into a single notification", + "message": "Combiner toutes les notifications simultanées de bureau en une seule notification", "description": "" }, "settings_open_label": { - "message": "Open Options", + "message": "Ouvrir les options", "description": "" }, "options_timings_l7": { @@ -64,7 +64,7 @@ "description": "" }, "options_notifications_28": { - "message": "Disable all notifications for a custom time period (in minutes):", + "message": "Désactiver toutes les notifications pendant une période de temps personnalisée (en minutes) :", "description": "" }, "options_timings_l4": { @@ -72,11 +72,11 @@ "description": "" }, "options_notifications_32": { - "message": "name or email contains", + "message": "nom ou contenus d'e-mail", "description": "" }, "options_tab_6": { - "message": "Ouvrir un compte Gmail dans une nouvelle fenêtre", + "message": "Ouvrir un compte Gmail™ dans une nouvelle fenêtre", "description": "" }, "options_notifications_25": { @@ -104,7 +104,7 @@ "description": "" }, "label_13": { - "message": "For a custom time period", + "message": "Pour une période de temps personnalisée", "description": "" }, "options_empty": { @@ -144,7 +144,7 @@ "description": "" }, "tooltip_1": { - "message": "Clic gauche : Ouvrir Gmail ou le panneau de prévisualisation d'e-mail", + "message": "Clic gauche : Ouvrir Gmail™ ou le panneau de prévisualisation d'e-mail", "description": "" }, "notification": { @@ -192,11 +192,11 @@ "description": "" }, "options_notifications_34": { - "message": "email summary contains", + "message": "sommaire de contenus d'e-mail", "description": "" }, "label_14": { - "message": "Logged-in accounts", + "message": "Comptes connectés", "description": "" }, "options_misc_13": { @@ -204,7 +204,7 @@ "description": "" }, "options_misc_6": { - "message": "Show desktop notification to warn that Gmail is already opened in the active tab", + "message": "Afficher une notification sur le bureau pour avertir que Gmail™ est déjà ouvert dans l'onglet actif", "description": "" }, "popup_read": { @@ -216,7 +216,7 @@ "description": "" }, "settings_open_title": { - "message": "Open options (settings) page", + "message": "Ouvrir la page des options (paramètres)", "description": "" }, "label_2": { @@ -232,7 +232,7 @@ "description": "" }, "options_tab_5": { - "message": "Ouvrir un compte Gmail dans un onglet d'arrière-plan", + "message": "Ouvrir un compte Gmail™ dans un onglet d'arrière-plan", "description": "" }, "label_7": { @@ -248,7 +248,7 @@ "description": "" }, "options_title": { - "message": "Options - Gmail™ Notifier", + "message": "Options - Notifieur Gmail™", "description": "" }, "popup_msg_13": { @@ -268,11 +268,11 @@ "description": "" }, "options_tab_9": { - "message": "When unchecked, Gmail Notifier checks either active window or all open windows for open instance of Gmail and switch to the tab when tab opening is requested.", + "message": "Lorsque cette option est décochée, le notifieur Gmail™ vérifie la fenêtre active ou l'ensemble des fenêtres ouvertes pour l'instance en cours de Gmail™ et passe à l'onglet suivant lorsque l'ouverture d'onglet est demandée.", "description": "" }, "gmail": { - "message": "Gmail™ Notifier", + "message": "Notifieur Gmail™", "description": "" }, "popup_msg_6": { @@ -284,7 +284,7 @@ "description": "" }, "options_notifications_16": { - "message": "Alerte par défaut Gmail Notifier", + "message": "Alerte par défaut du Notifieur Gmail™", "description": "" }, "options_misc_14": { @@ -312,7 +312,7 @@ "description": "" }, "log_in_to_your_account": { - "message": "Veuillez vous connecter à votre compte Gmail", + "message": "Veuillez vous connecter à votre compte Gmail™", "description": "" }, "popup_of": { @@ -364,7 +364,7 @@ "description": "" }, "options_gmail": { - "message": "Gmail :", + "message": "Gmail™ :", "description": "" }, "label_1": { @@ -376,11 +376,11 @@ "description": "" }, "options_notifications_24": { - "message": "Le volume est un nombre entre 0 et 100 où 100 est le volume le plus fort (défaut).", + "message": "Le volume est un nombre entre 0 et 100 où 100 est le volume le plus fort (par défaut).", "description": "" }, "options_notifications_10": { - "message": "Note pour les utilisateurs de Mac. Depuis Firefox 28.0, toutes les notifications de bureau sont gérées par le \"Notification Center\" Mac qui provoque une alerte sonore supplémentaire. Vous devez désactiver soit cette notification sonore, soit celle générée par le \"Notification Center\".", + "message": "Remarque : pour les utilisateurs de Mac. Depuis la version 28.0 de Firefox, toutes les notifications de bureau sont gérées par le \"Centre de Notifications\" Mac qui provoque une alerte sonore supplémentaire. Vous devez désactiver soit cette notification sonore, soit celle générée par le \"Centre de Notifications\".", "description": "" }, "options_misc_2": { @@ -408,11 +408,11 @@ "description": "" }, "options_notifications_35": { - "message": "To select a new custom sound, select a built-in sound first and then change the option to custom sound", + "message": "Pour sélectionner un nouveau son personnalisé, sélectionnez d'abord un son intégré, puis modifiez l'option en son personnalisé", "description": "" }, "msg_1": { - "message": "Un onglet est déjà ouvert. Cliquez sur le bouton de la barre d'outils pour ouvrir Gmail dans un nouvel onglet, ou pour basculer sur un onglet Gmail existant.", + "message": "Un onglet est déjà ouvert. Cliquez sur le bouton de la barre d'outils pour ouvrir Gmail™ dans un nouvel onglet, ou pour basculer sur un onglet Gmail™ existant.", "description": "" }, "popup_refresh": { @@ -432,11 +432,11 @@ "description": "" }, "options_notifications_33": { - "message": "email title contains", + "message": "titre des contenus d'e-mail", "description": "" }, "tooltip_3": { - "message": "Clic droit : Sélections des comptes", + "message": "Clic droit : sélections des comptes", "description": "" }, "popup_date_format": { @@ -456,11 +456,11 @@ "description": "" }, "options_notifications_22": { - "message": "If your browser is not playing the custom notification sound, try to convert it into a plain WAV format using an online conversion tool.", + "message": "Si votre navigateur ne lit pas le son de notification personnalisé, essayez de le convertir en un format WAV simple à l'aide d'un outil de conversion en ligne.", "description": "" }, "options_tab_1": { - "message": "Chercher un compte Gmail ouvert seulement dans la fenêtre active", + "message": "Chercher un compte Gmail™ ouvert seulement dans la fenêtre active", "description": "" }, "popup_msg_7_format": { @@ -476,7 +476,7 @@ "description": "" }, "toolbar_label": { - "message": "Gmail™ Notifier", + "message": "Notifieur Gmail™", "description": "" }, "popup_msg_1": { @@ -492,7 +492,7 @@ "description": "" }, "options_gmail_12": { - "message": "Séparer les flux par \",\" (Virgule). Exemple de flux : https://mail.google.com/mail/u/0/feed/atom/inbox", + "message": "Séparer les flux par \",\" (virgule). Exemple de flux : https://mail.google.com/mail/u/0/feed/atom/inbox", "description": "" }, "options_toolbar_12": { @@ -520,7 +520,7 @@ "description": "" }, "options_toolbar_3": { - "message": "Ouvrir un compte Gmail si un seul compte est connecté", + "message": "Ouvrir un compte Gmail™ si un seul compte est connecté", "description": "" }, "options_gmail_7": { @@ -544,15 +544,15 @@ "description": "" }, "tooltip_2": { - "message": "Clic milieu (ou Ctrl+clic gauche) : Rafraîchir tous les comptes", + "message": "Clic milieu (ou Ctrl+clic gauche) : rafraîchir tous les comptes", "description": "" }, "options_notifications_29": { - "message": "This option is related to the right click menu on the toolbar button -> disable all notifications -> custom time period.", + "message": "Cette option est liée au menu contextuel sur le bouton de la barre d'outils -> désactiver toutes les notifications -> période de temps personnalisée.", "description": "" }, "options_tab_3": { - "message": "Ouvrir un nouveau compte Gmail à côté de l'onglet actif", + "message": "Ouvrir un nouveau compte Gmail™ à côté de l'onglet actif", "description": "" }, "options_gmail_8": { @@ -560,7 +560,7 @@ "description": "" }, "options_toolbar_17": { - "message": "Ouvrir le premier compte Gmail", + "message": "Ouvrir le premier compte Gmail™", "description": "" }, "options_notifications_7": { @@ -572,7 +572,7 @@ "description": "" }, "options_tab_8": { - "message": "Ignore opened Gmail tabs", + "message": "Ignorer les onglets Gmail™ ouverts", "description": "" }, "popup_no_subject": { @@ -580,7 +580,7 @@ "description": "" }, "msg_5": { - "message": "Select an audio sound file", + "message": "Choisir un fichier son", "description": "" }, "popup_msg_2": { @@ -596,7 +596,7 @@ "description": "" }, "msg_4": { - "message": "Note : Pour que le notifieur fonctionne correctement, vous devez être connecté à votre compte Google.", + "message": "Remarque : pour que le notifieur fonctionne correctement, vous devez être connecté à votre compte Google.", "description": "" }, "popup_msg_20": { @@ -612,7 +612,7 @@ "description": "" }, "options_tab_2": { - "message": "Ne pas chercher les comptes Gmail ouverts dans les autres fenêtres du navigateur. Si Gmail n'est pas ouvert dans la fenêtre active, ouvrir un nouvel onglet.", + "message": "Ne pas chercher les comptes Gmail™ ouverts dans les autres fenêtres du navigateur. Si Gmail™ n'est pas ouvert dans la fenêtre active, ouvrir un nouvel onglet.", "description": "" }, "label_11": { @@ -624,7 +624,7 @@ "description": "" }, "options_notifications_31": { - "message": "Custom sound notification", + "message": "Son de notification personnalisé", "description": "" }, "options_timings_l5": { @@ -636,7 +636,7 @@ "description": "" }, "options_gmail_2": { - "message": "Séparer les libellés par \",\" (Virgule).", + "message": "Séparer les libellés par \",\" (virgule).", "description": "" }, "options_misc_4": { @@ -660,7 +660,7 @@ "description": "" }, "options_inshort": { - "message": "Notifieur multi-comptes et multi-libellés pour Google Mail (Gmail).", + "message": "Notifieur multi-comptes et multi-libellés pour Google Mail (Gmail™).", "description": "" }, "options_misc_12": { @@ -668,7 +668,7 @@ "description": "" }, "options_tab_4": { - "message": "Ouvrir un compte Gmail dans l'onglet actif", + "message": "Ouvrir un compte Gmail™ dans l'onglet actif", "description": "" }, "popup_msg_3_format": { @@ -676,15 +676,15 @@ "description": "" }, "label_12": { - "message": "Open FAQs", + "message": "Ouvrir la FAQ", "description": "" }, "description": { - "message": "Notifieur multi-comptes et multi-libellés pour Google Mail (Gmail)", + "message": "Notifieur multi-comptes et multi-libellés pour Google Mail (Gmail™)", "description": "" }, "popup_spam": { "message": "Spam", "description": "" } -} \ No newline at end of file +} diff --git a/JPM/builds/unpacked/chrome/_locales/hu/messages.json b/v1/builds/unpacked/chrome/_locales/hu/messages.json similarity index 100% rename from JPM/builds/unpacked/chrome/_locales/hu/messages.json rename to v1/builds/unpacked/chrome/_locales/hu/messages.json diff --git a/JPM/builds/unpacked/chrome/_locales/nl/messages.json b/v1/builds/unpacked/chrome/_locales/nl/messages.json similarity index 100% rename from JPM/builds/unpacked/chrome/_locales/nl/messages.json rename to v1/builds/unpacked/chrome/_locales/nl/messages.json diff --git a/JPM/builds/unpacked/chrome/_locales/pl/messages.json b/v1/builds/unpacked/chrome/_locales/pl/messages.json similarity index 100% rename from JPM/builds/unpacked/chrome/_locales/pl/messages.json rename to v1/builds/unpacked/chrome/_locales/pl/messages.json diff --git a/JPM/builds/unpacked/chrome/_locales/ru/messages.json b/v1/builds/unpacked/chrome/_locales/ru/messages.json similarity index 100% rename from JPM/builds/unpacked/chrome/_locales/ru/messages.json rename to v1/builds/unpacked/chrome/_locales/ru/messages.json diff --git a/JPM/builds/unpacked/chrome/_locales/sr/messages.json b/v1/builds/unpacked/chrome/_locales/sr/messages.json similarity index 100% rename from JPM/builds/unpacked/chrome/_locales/sr/messages.json rename to v1/builds/unpacked/chrome/_locales/sr/messages.json diff --git a/JPM/builds/unpacked/chrome/_locales/zh_CN/messages.json b/v1/builds/unpacked/chrome/_locales/zh_CN/messages.json similarity index 100% rename from JPM/builds/unpacked/chrome/_locales/zh_CN/messages.json rename to v1/builds/unpacked/chrome/_locales/zh_CN/messages.json diff --git a/JPM/builds/unpacked/chrome/data/icons/blue/16.png b/v1/builds/unpacked/chrome/data/icons/blue/16.png similarity index 100% rename from JPM/builds/unpacked/chrome/data/icons/blue/16.png rename to v1/builds/unpacked/chrome/data/icons/blue/16.png diff --git a/JPM/builds/unpacked/chrome/data/icons/blue/19.png b/v1/builds/unpacked/chrome/data/icons/blue/19.png similarity index 100% rename from JPM/builds/unpacked/chrome/data/icons/blue/19.png rename to v1/builds/unpacked/chrome/data/icons/blue/19.png diff --git a/JPM/builds/unpacked/chrome/data/icons/blue/32.png b/v1/builds/unpacked/chrome/data/icons/blue/32.png similarity index 100% rename from JPM/builds/unpacked/chrome/data/icons/blue/32.png rename to v1/builds/unpacked/chrome/data/icons/blue/32.png diff --git a/JPM/builds/unpacked/chrome/data/icons/browsers/chrome.png b/v1/builds/unpacked/chrome/data/icons/browsers/chrome.png similarity index 100% rename from JPM/builds/unpacked/chrome/data/icons/browsers/chrome.png rename to v1/builds/unpacked/chrome/data/icons/browsers/chrome.png diff --git a/JPM/builds/unpacked/chrome/data/icons/browsers/firefox.png b/v1/builds/unpacked/chrome/data/icons/browsers/firefox.png similarity index 100% rename from JPM/builds/unpacked/chrome/data/icons/browsers/firefox.png rename to v1/builds/unpacked/chrome/data/icons/browsers/firefox.png diff --git a/JPM/builds/unpacked/chrome/data/icons/browsers/opera.png b/v1/builds/unpacked/chrome/data/icons/browsers/opera.png similarity index 100% rename from JPM/builds/unpacked/chrome/data/icons/browsers/opera.png rename to v1/builds/unpacked/chrome/data/icons/browsers/opera.png diff --git a/JPM/builds/unpacked/chrome/data/icons/gray/16.png b/v1/builds/unpacked/chrome/data/icons/gray/16.png similarity index 100% rename from JPM/builds/unpacked/chrome/data/icons/gray/16.png rename to v1/builds/unpacked/chrome/data/icons/gray/16.png diff --git a/JPM/builds/unpacked/chrome/data/icons/gray/19.png b/v1/builds/unpacked/chrome/data/icons/gray/19.png similarity index 100% rename from JPM/builds/unpacked/chrome/data/icons/gray/19.png rename to v1/builds/unpacked/chrome/data/icons/gray/19.png diff --git a/JPM/builds/unpacked/chrome/data/icons/gray/32.png b/v1/builds/unpacked/chrome/data/icons/gray/32.png similarity index 100% rename from JPM/builds/unpacked/chrome/data/icons/gray/32.png rename to v1/builds/unpacked/chrome/data/icons/gray/32.png diff --git a/JPM/builds/unpacked/chrome/data/icons/load0/16.png b/v1/builds/unpacked/chrome/data/icons/load0/16.png similarity index 100% rename from JPM/builds/unpacked/chrome/data/icons/load0/16.png rename to v1/builds/unpacked/chrome/data/icons/load0/16.png diff --git a/JPM/builds/unpacked/chrome/data/icons/load0/19.png b/v1/builds/unpacked/chrome/data/icons/load0/19.png similarity index 100% rename from JPM/builds/unpacked/chrome/data/icons/load0/19.png rename to v1/builds/unpacked/chrome/data/icons/load0/19.png diff --git a/JPM/builds/unpacked/chrome/data/icons/load0/32.png b/v1/builds/unpacked/chrome/data/icons/load0/32.png similarity index 100% rename from JPM/builds/unpacked/chrome/data/icons/load0/32.png rename to v1/builds/unpacked/chrome/data/icons/load0/32.png diff --git a/JPM/builds/unpacked/chrome/data/icons/load1/16.png b/v1/builds/unpacked/chrome/data/icons/load1/16.png similarity index 100% rename from JPM/builds/unpacked/chrome/data/icons/load1/16.png rename to v1/builds/unpacked/chrome/data/icons/load1/16.png diff --git a/JPM/builds/unpacked/chrome/data/icons/load1/19.png b/v1/builds/unpacked/chrome/data/icons/load1/19.png similarity index 100% rename from JPM/builds/unpacked/chrome/data/icons/load1/19.png rename to v1/builds/unpacked/chrome/data/icons/load1/19.png diff --git a/JPM/builds/unpacked/chrome/data/icons/load1/32.png b/v1/builds/unpacked/chrome/data/icons/load1/32.png similarity index 100% rename from JPM/builds/unpacked/chrome/data/icons/load1/32.png rename to v1/builds/unpacked/chrome/data/icons/load1/32.png diff --git a/JPM/builds/unpacked/chrome/data/icons/load2/16.png b/v1/builds/unpacked/chrome/data/icons/load2/16.png similarity index 100% rename from JPM/builds/unpacked/chrome/data/icons/load2/16.png rename to v1/builds/unpacked/chrome/data/icons/load2/16.png diff --git a/JPM/builds/unpacked/chrome/data/icons/load2/19.png b/v1/builds/unpacked/chrome/data/icons/load2/19.png similarity index 100% rename from JPM/builds/unpacked/chrome/data/icons/load2/19.png rename to v1/builds/unpacked/chrome/data/icons/load2/19.png diff --git a/JPM/builds/unpacked/chrome/data/icons/load2/32.png b/v1/builds/unpacked/chrome/data/icons/load2/32.png similarity index 100% rename from JPM/builds/unpacked/chrome/data/icons/load2/32.png rename to v1/builds/unpacked/chrome/data/icons/load2/32.png diff --git a/JPM/builds/unpacked/chrome/data/icons/load3/16.png b/v1/builds/unpacked/chrome/data/icons/load3/16.png similarity index 100% rename from JPM/builds/unpacked/chrome/data/icons/load3/16.png rename to v1/builds/unpacked/chrome/data/icons/load3/16.png diff --git a/JPM/builds/unpacked/chrome/data/icons/load3/19.png b/v1/builds/unpacked/chrome/data/icons/load3/19.png similarity index 100% rename from JPM/builds/unpacked/chrome/data/icons/load3/19.png rename to v1/builds/unpacked/chrome/data/icons/load3/19.png diff --git a/JPM/builds/unpacked/chrome/data/icons/load3/32.png b/v1/builds/unpacked/chrome/data/icons/load3/32.png similarity index 100% rename from JPM/builds/unpacked/chrome/data/icons/load3/32.png rename to v1/builds/unpacked/chrome/data/icons/load3/32.png diff --git a/JPM/builds/unpacked/chrome/data/icons/new/16.png b/v1/builds/unpacked/chrome/data/icons/new/16.png similarity index 100% rename from JPM/builds/unpacked/chrome/data/icons/new/16.png rename to v1/builds/unpacked/chrome/data/icons/new/16.png diff --git a/JPM/builds/unpacked/chrome/data/icons/new/19.png b/v1/builds/unpacked/chrome/data/icons/new/19.png similarity index 100% rename from JPM/builds/unpacked/chrome/data/icons/new/19.png rename to v1/builds/unpacked/chrome/data/icons/new/19.png diff --git a/JPM/builds/unpacked/chrome/data/icons/new/32.png b/v1/builds/unpacked/chrome/data/icons/new/32.png similarity index 100% rename from JPM/builds/unpacked/chrome/data/icons/new/32.png rename to v1/builds/unpacked/chrome/data/icons/new/32.png diff --git a/JPM/builds/unpacked/chrome/data/icons/notification/16.png b/v1/builds/unpacked/chrome/data/icons/notification/16.png similarity index 100% rename from JPM/builds/unpacked/chrome/data/icons/notification/16.png rename to v1/builds/unpacked/chrome/data/icons/notification/16.png diff --git a/JPM/builds/unpacked/chrome/data/icons/notification/32.png b/v1/builds/unpacked/chrome/data/icons/notification/32.png similarity index 100% rename from JPM/builds/unpacked/chrome/data/icons/notification/32.png rename to v1/builds/unpacked/chrome/data/icons/notification/32.png diff --git a/JPM/builds/unpacked/chrome/data/icons/notification/48.png b/v1/builds/unpacked/chrome/data/icons/notification/48.png similarity index 100% rename from JPM/builds/unpacked/chrome/data/icons/notification/48.png rename to v1/builds/unpacked/chrome/data/icons/notification/48.png diff --git a/JPM/builds/unpacked/chrome/data/icons/notification/64.png b/v1/builds/unpacked/chrome/data/icons/notification/64.png similarity index 100% rename from JPM/builds/unpacked/chrome/data/icons/notification/64.png rename to v1/builds/unpacked/chrome/data/icons/notification/64.png diff --git a/JPM/builds/unpacked/chrome/data/icons/options/16.png b/v1/builds/unpacked/chrome/data/icons/options/16.png similarity index 100% rename from JPM/builds/unpacked/chrome/data/icons/options/16.png rename to v1/builds/unpacked/chrome/data/icons/options/16.png diff --git a/JPM/builds/unpacked/chrome/data/icons/options/64.png b/v1/builds/unpacked/chrome/data/icons/options/64.png similarity index 100% rename from JPM/builds/unpacked/chrome/data/icons/options/64.png rename to v1/builds/unpacked/chrome/data/icons/options/64.png diff --git a/JPM/builds/unpacked/chrome/data/icons/red/128.png b/v1/builds/unpacked/chrome/data/icons/red/128.png similarity index 100% rename from JPM/builds/unpacked/chrome/data/icons/red/128.png rename to v1/builds/unpacked/chrome/data/icons/red/128.png diff --git a/JPM/builds/unpacked/chrome/data/icons/red/16.png b/v1/builds/unpacked/chrome/data/icons/red/16.png similarity index 100% rename from JPM/builds/unpacked/chrome/data/icons/red/16.png rename to v1/builds/unpacked/chrome/data/icons/red/16.png diff --git a/JPM/builds/unpacked/chrome/data/icons/red/19.png b/v1/builds/unpacked/chrome/data/icons/red/19.png similarity index 100% rename from JPM/builds/unpacked/chrome/data/icons/red/19.png rename to v1/builds/unpacked/chrome/data/icons/red/19.png diff --git a/JPM/builds/unpacked/chrome/data/icons/red/32.png b/v1/builds/unpacked/chrome/data/icons/red/32.png similarity index 100% rename from JPM/builds/unpacked/chrome/data/icons/red/32.png rename to v1/builds/unpacked/chrome/data/icons/red/32.png diff --git a/JPM/builds/unpacked/chrome/data/icons/red/48.png b/v1/builds/unpacked/chrome/data/icons/red/48.png similarity index 100% rename from JPM/builds/unpacked/chrome/data/icons/red/48.png rename to v1/builds/unpacked/chrome/data/icons/red/48.png diff --git a/JPM/builds/unpacked/chrome/data/icons/red/64.png b/v1/builds/unpacked/chrome/data/icons/red/64.png similarity index 100% rename from JPM/builds/unpacked/chrome/data/icons/red/64.png rename to v1/builds/unpacked/chrome/data/icons/red/64.png diff --git a/JPM/builds/unpacked/chrome/data/icons/tray/blue.png b/v1/builds/unpacked/chrome/data/icons/tray/blue.png similarity index 100% rename from JPM/builds/unpacked/chrome/data/icons/tray/blue.png rename to v1/builds/unpacked/chrome/data/icons/tray/blue.png diff --git a/JPM/builds/unpacked/chrome/data/icons/tray/gray.png b/v1/builds/unpacked/chrome/data/icons/tray/gray.png similarity index 100% rename from JPM/builds/unpacked/chrome/data/icons/tray/gray.png rename to v1/builds/unpacked/chrome/data/icons/tray/gray.png diff --git a/JPM/builds/unpacked/chrome/data/icons/tray/red.png b/v1/builds/unpacked/chrome/data/icons/tray/red.png similarity index 100% rename from JPM/builds/unpacked/chrome/data/icons/tray/red.png rename to v1/builds/unpacked/chrome/data/icons/tray/red.png diff --git a/JPM/builds/unpacked/chrome/data/options/chrome/chrome.js b/v1/builds/unpacked/chrome/data/options/chrome/chrome.js similarity index 100% rename from JPM/builds/unpacked/chrome/data/options/chrome/chrome.js rename to v1/builds/unpacked/chrome/data/options/chrome/chrome.js diff --git a/JPM/builds/unpacked/chrome/data/options/css_browser_selector.js b/v1/builds/unpacked/chrome/data/options/css_browser_selector.js similarity index 100% rename from JPM/builds/unpacked/chrome/data/options/css_browser_selector.js rename to v1/builds/unpacked/chrome/data/options/css_browser_selector.js diff --git a/JPM/builds/unpacked/chrome/data/options/index.css b/v1/builds/unpacked/chrome/data/options/index.css similarity index 100% rename from JPM/builds/unpacked/chrome/data/options/index.css rename to v1/builds/unpacked/chrome/data/options/index.css diff --git a/JPM/builds/unpacked/chrome/data/options/index.html b/v1/builds/unpacked/chrome/data/options/index.html similarity index 100% rename from JPM/builds/unpacked/chrome/data/options/index.html rename to v1/builds/unpacked/chrome/data/options/index.html diff --git a/JPM/builds/unpacked/chrome/data/options/index.js b/v1/builds/unpacked/chrome/data/options/index.js similarity index 100% rename from JPM/builds/unpacked/chrome/data/options/index.js rename to v1/builds/unpacked/chrome/data/options/index.js diff --git a/JPM/builds/unpacked/chrome/data/popup/body/email-chrome.css b/v1/builds/unpacked/chrome/data/popup/body/email-chrome.css similarity index 100% rename from JPM/builds/unpacked/chrome/data/popup/body/email-chrome.css rename to v1/builds/unpacked/chrome/data/popup/body/email-chrome.css diff --git a/JPM/builds/unpacked/chrome/data/popup/chrome/chrome.js b/v1/builds/unpacked/chrome/data/popup/chrome/chrome.js similarity index 100% rename from JPM/builds/unpacked/chrome/data/popup/chrome/chrome.js rename to v1/builds/unpacked/chrome/data/popup/chrome/chrome.js diff --git a/JPM/builds/unpacked/chrome/data/popup/fetch.gif b/v1/builds/unpacked/chrome/data/popup/fetch.gif similarity index 100% rename from JPM/builds/unpacked/chrome/data/popup/fetch.gif rename to v1/builds/unpacked/chrome/data/popup/fetch.gif diff --git a/JPM/builds/unpacked/chrome/data/popup/icons.png b/v1/builds/unpacked/chrome/data/popup/icons.png similarity index 100% rename from JPM/builds/unpacked/chrome/data/popup/icons.png rename to v1/builds/unpacked/chrome/data/popup/icons.png diff --git a/JPM/builds/unpacked/chrome/data/popup/index.css b/v1/builds/unpacked/chrome/data/popup/index.css similarity index 100% rename from JPM/builds/unpacked/chrome/data/popup/index.css rename to v1/builds/unpacked/chrome/data/popup/index.css diff --git a/JPM/builds/unpacked/chrome/data/popup/index.html b/v1/builds/unpacked/chrome/data/popup/index.html similarity index 100% rename from JPM/builds/unpacked/chrome/data/popup/index.html rename to v1/builds/unpacked/chrome/data/popup/index.html diff --git a/JPM/src/data/popup/index.js b/v1/builds/unpacked/chrome/data/popup/index.js similarity index 99% rename from JPM/src/data/popup/index.js rename to v1/builds/unpacked/chrome/data/popup/index.js index 4ec40f2e..001af9ca 100644 --- a/JPM/src/data/popup/index.js +++ b/v1/builds/unpacked/chrome/data/popup/index.js @@ -151,7 +151,7 @@ var Listen = function (query, on, callback, pointer) { new Listen('email-container', "click", function(e) { // Clear old list - qs("accounts").innerHTML = ""; + qs("accounts").textContent = ''; // Add new items (remove no-unread accounts first) objs. filter(function (o) { diff --git a/JPM/builds/unpacked/chrome/data/popup/wait.gif b/v1/builds/unpacked/chrome/data/popup/wait.gif similarity index 100% rename from JPM/builds/unpacked/chrome/data/popup/wait.gif rename to v1/builds/unpacked/chrome/data/popup/wait.gif diff --git a/JPM/builds/unpacked/chrome/data/sounds/0.wav b/v1/builds/unpacked/chrome/data/sounds/0.wav similarity index 100% rename from JPM/builds/unpacked/chrome/data/sounds/0.wav rename to v1/builds/unpacked/chrome/data/sounds/0.wav diff --git a/JPM/builds/unpacked/chrome/data/sounds/1.wav b/v1/builds/unpacked/chrome/data/sounds/1.wav similarity index 100% rename from JPM/builds/unpacked/chrome/data/sounds/1.wav rename to v1/builds/unpacked/chrome/data/sounds/1.wav diff --git a/JPM/builds/unpacked/chrome/data/sounds/2.wav b/v1/builds/unpacked/chrome/data/sounds/2.wav similarity index 100% rename from JPM/builds/unpacked/chrome/data/sounds/2.wav rename to v1/builds/unpacked/chrome/data/sounds/2.wav diff --git a/JPM/builds/unpacked/chrome/data/sounds/3.wav b/v1/builds/unpacked/chrome/data/sounds/3.wav similarity index 100% rename from JPM/builds/unpacked/chrome/data/sounds/3.wav rename to v1/builds/unpacked/chrome/data/sounds/3.wav diff --git a/JPM/builds/unpacked/chrome/lib/common.js b/v1/builds/unpacked/chrome/lib/common.js similarity index 100% rename from JPM/builds/unpacked/chrome/lib/common.js rename to v1/builds/unpacked/chrome/lib/common.js diff --git a/JPM/builds/unpacked/chrome/lib/config.js b/v1/builds/unpacked/chrome/lib/config.js similarity index 100% rename from JPM/builds/unpacked/chrome/lib/config.js rename to v1/builds/unpacked/chrome/lib/config.js diff --git a/JPM/builds/unpacked/chrome/lib/utils/gmail.js b/v1/builds/unpacked/chrome/lib/utils/gmail.js similarity index 100% rename from JPM/builds/unpacked/chrome/lib/utils/gmail.js rename to v1/builds/unpacked/chrome/lib/utils/gmail.js diff --git a/JPM/builds/unpacked/chrome/lib/utils/render.js b/v1/builds/unpacked/chrome/lib/utils/render.js similarity index 100% rename from JPM/builds/unpacked/chrome/lib/utils/render.js rename to v1/builds/unpacked/chrome/lib/utils/render.js diff --git a/JPM/builds/unpacked/chrome/lib/utils/server.js b/v1/builds/unpacked/chrome/lib/utils/server.js similarity index 100% rename from JPM/builds/unpacked/chrome/lib/utils/server.js rename to v1/builds/unpacked/chrome/lib/utils/server.js diff --git a/JPM/builds/unpacked/chrome/lib/utils/tab.js b/v1/builds/unpacked/chrome/lib/utils/tab.js similarity index 100% rename from JPM/builds/unpacked/chrome/lib/utils/tab.js rename to v1/builds/unpacked/chrome/lib/utils/tab.js diff --git a/JPM/builds/unpacked/chrome/lib/utils/timer.js b/v1/builds/unpacked/chrome/lib/utils/timer.js similarity index 100% rename from JPM/builds/unpacked/chrome/lib/utils/timer.js rename to v1/builds/unpacked/chrome/lib/utils/timer.js diff --git a/JPM/builds/unpacked/chrome/lib/wrapper/chrome/EventEmitter.js b/v1/builds/unpacked/chrome/lib/wrapper/chrome/EventEmitter.js similarity index 100% rename from JPM/builds/unpacked/chrome/lib/wrapper/chrome/EventEmitter.js rename to v1/builds/unpacked/chrome/lib/wrapper/chrome/EventEmitter.js diff --git a/JPM/builds/unpacked/chrome/lib/wrapper/chrome/app.js b/v1/builds/unpacked/chrome/lib/wrapper/chrome/app.js similarity index 100% rename from JPM/builds/unpacked/chrome/lib/wrapper/chrome/app.js rename to v1/builds/unpacked/chrome/lib/wrapper/chrome/app.js diff --git a/JPM/builds/unpacked/chrome/lib/wrapper/chrome/background.html b/v1/builds/unpacked/chrome/lib/wrapper/chrome/background.html similarity index 100% rename from JPM/builds/unpacked/chrome/lib/wrapper/chrome/background.html rename to v1/builds/unpacked/chrome/lib/wrapper/chrome/background.html diff --git a/JPM/builds/unpacked/chrome/manifest.json b/v1/builds/unpacked/chrome/manifest.json similarity index 100% rename from JPM/builds/unpacked/chrome/manifest.json rename to v1/builds/unpacked/chrome/manifest.json diff --git a/JPM/compile/convert.js b/v1/compile/convert.js similarity index 100% rename from JPM/compile/convert.js rename to v1/compile/convert.js diff --git a/JPM/gulpfile.js b/v1/gulpfile.js similarity index 100% rename from JPM/gulpfile.js rename to v1/gulpfile.js diff --git a/JPM/package.json b/v1/package.json similarity index 100% rename from JPM/package.json rename to v1/package.json diff --git a/JPM/src/Icon-64.png b/v1/src/Icon-64.png similarity index 100% rename from JPM/src/Icon-64.png rename to v1/src/Icon-64.png diff --git a/JPM/src/Info.plist b/v1/src/Info.plist similarity index 100% rename from JPM/src/Info.plist rename to v1/src/Info.plist diff --git a/JPM/src/Settings.plist b/v1/src/Settings.plist similarity index 100% rename from JPM/src/Settings.plist rename to v1/src/Settings.plist diff --git a/JPM/src/_locales/bg/messages.json b/v1/src/_locales/bg/messages.json similarity index 100% rename from JPM/src/_locales/bg/messages.json rename to v1/src/_locales/bg/messages.json diff --git a/JPM/src/_locales/el/messages.json b/v1/src/_locales/el/messages.json similarity index 100% rename from JPM/src/_locales/el/messages.json rename to v1/src/_locales/el/messages.json diff --git a/JPM/builds/unpacked/chrome/_locales/en/messages.json b/v1/src/_locales/en/messages.json similarity index 91% rename from JPM/builds/unpacked/chrome/_locales/en/messages.json rename to v1/src/_locales/en/messages.json index 27f3c252..6bd7bb34 100644 --- a/JPM/builds/unpacked/chrome/_locales/en/messages.json +++ b/v1/src/_locales/en/messages.json @@ -6,7 +6,7 @@ "message": "Notifier for Gmail™" }, "tooltip_1": { - "message": "Left click: Open Gmail or mail preview panel" + "message": "Left click: Open Gmail™ or mail preview panel" }, "tooltip_2": { "message": "Middle (or Ctrl+Left) click: Refresh all accounts" @@ -15,13 +15,13 @@ "message": "Right click: Account selections" }, "description": { - "message": "Multiple label and account notifier for Google Mail (Gmail)" + "message": "Multiple label and account notifier for Google Mail (Gmail™)" }, "log_in_to_your_account": { - "message": "Please sign-in to your Gmail account" + "message": "Please sign-in to your Gmail™ account" }, "msg_1": { - "message": "Tab is already open. Click on the toolbar button to open Gmail in a new tab, or to switch to an existing Gmail tab." + "message": "Tab is already open. Click on the toolbar button to open Gmail™ in a new tab, or to switch to an existing Gmail™ tab." }, "msg_2": { "message": "Link is copied to the clipboard." @@ -89,14 +89,14 @@ "message": "Please log into your account" }, "notification": { - "message": "From: [author_email][break]Title: [title][break]Summary: [summary]" + "message": "From: [author_email][break] Title: [title][break] Summary: [summary]" }, "options_title": { "message": "Options - Gmail™ Notifier" }, "options_inshort": { - "message": "Multiple label and account notifier for Google Mail (Gmail)." + "message": "Multiple label and account notifier for Google Mail (Gmail™)." }, "options_donation": { "message": "Make a Donation" @@ -129,7 +129,7 @@ "message": "Set the value to zero for no email check until the first manual refresh [Not available on Safari]." }, "options_gmail": { - "message": "Gmail:" + "message": "Gmail™:" }, "options_gmail_1": { "message": "Primary account (/mail/u/0/)" @@ -229,7 +229,7 @@ }, "options_notifications_16": { - "message": "Gmail Notifier default alert" + "message": "Gmail™ Notifier default alert" }, "options_notifications_17": { "message": "Checker Plus bell alert" @@ -280,31 +280,31 @@ "message": "Tab Opening:" }, "options_tab_1": { - "message": "Search for an open Gmail account only on the active window" + "message": "Search for an open Gmail™ account only on the active window" }, "options_tab_2": { - "message": "Do not search other browser windows for open Gmail accounts. If Gmail is not open in the active window, open a new tab." + "message": "Do not search other browser windows for open Gmail™ accounts. If Gmail™ is not open in the active window, open a new tab." }, "options_tab_3": { - "message": "Open new Gmail account next to the active tab" + "message": "Open new Gmail™ account next to the active tab" }, "options_tab_4": { - "message": "Open Gmail account in the active tab" + "message": "Open Gmail™ account in the active tab" }, "options_tab_5": { - "message": "Open Gmail account in a background tab" + "message": "Open Gmail™ account in a background tab" }, "options_tab_6": { - "message": "Open Gmail account in a new window" + "message": "Open Gmail™ account in a new window" }, "options_tab_7": { "message": "Always use blank tabs instead of opening a new tab when open in tab is activated" }, "options_tab_8": { - "message": "Ignore opened Gmail tabs" + "message": "Ignore opened Gmail™ tabs" }, "options_tab_9": { - "message": "When unchecked, Gmail Notifier checks either active window or all open windows for open instance of Gmail and switch to the tab when tab opening is requested." + "message": "When unchecked, Gmail™ Notifier checks either active window or all open windows for open instance of Gmail™ and switch to the tab when tab opening is requested." }, "options_toolbar": { "message": "Toolbar:" @@ -316,7 +316,7 @@ "message": "Always open email preview panel" }, "options_toolbar_3": { - "message": "Open Gmail account if only one account is logged-in" + "message": "Open Gmail™ account if only one account is logged-in" }, "options_toolbar_4": { "message": "Toolbar panel mode" @@ -358,7 +358,7 @@ "message": "Refresh all accounts" }, "options_toolbar_17": { - "message": "Open primary Gmail account" + "message": "Open primary Gmail™ account" }, "options_misc": { "message": "Miscellaneous:" @@ -382,7 +382,7 @@ "message": "Red color for \"No Unread\" and gray color for \"Disconnected\"" }, "options_misc_6": { - "message": "Show desktop notification to warn that Gmail is already opened in the active tab" + "message": "Show desktop notification to warn that Gmail™ is already opened in the active tab" }, "options_misc_7": { "message": "Show welcome page on upgrade" diff --git a/WebExtension/_locales/fr/messages.json b/v1/src/_locales/fr/messages.json similarity index 83% rename from WebExtension/_locales/fr/messages.json rename to v1/src/_locales/fr/messages.json index afd61a1a..1a1d1853 100644 --- a/WebExtension/_locales/fr/messages.json +++ b/v1/src/_locales/fr/messages.json @@ -16,11 +16,11 @@ "description": "" }, "options_notifications_30": { - "message": "Combine all concurrent desktop notifications into a single notification", + "message": "Combiner toutes les notifications de bureau simultanées en une seule notification", "description": "" }, "settings_open_label": { - "message": "Open Options", + "message": "Ouvrir les options", "description": "" }, "options_timings_l7": { @@ -64,7 +64,7 @@ "description": "" }, "options_notifications_28": { - "message": "Disable all notifications for a custom time period (in minutes):", + "message": "Désactiver toutes les notifications pendant une période de temps personnalisée (en minutes) :", "description": "" }, "options_timings_l4": { @@ -72,11 +72,11 @@ "description": "" }, "options_notifications_32": { - "message": "name or email contains", + "message": "nom ou contenus d'e-mail", "description": "" }, "options_tab_6": { - "message": "Ouvrir un compte Gmail dans une nouvelle fenêtre", + "message": "Ouvrir un compte Gmail™ dans une nouvelle fenêtre", "description": "" }, "options_notifications_25": { @@ -104,7 +104,7 @@ "description": "" }, "label_13": { - "message": "For a custom time period", + "message": "Pour une période de temps personnalisée", "description": "" }, "options_empty": { @@ -144,11 +144,11 @@ "description": "" }, "tooltip_1": { - "message": "Clic gauche : Ouvrir Gmail ou le panneau de prévisualisation d'e-mail", + "message": "Clic gauche : Ouvrir Gmail™ ou le panneau de prévisualisation d'e-mail", "description": "" }, "notification": { - "message": "De : [author_email][break]Objet : [title][break]Résumé : [summary]", + "message": "De : [author_email][break] Objet : [title][break] Résumé : [summary]", "description": "" }, "popup_trash": { @@ -192,11 +192,11 @@ "description": "" }, "options_notifications_34": { - "message": "email summary contains", + "message": "sommaire de contenus d'e-mail", "description": "" }, "label_14": { - "message": "Logged-in accounts", + "message": "Comptes connectés", "description": "" }, "options_misc_13": { @@ -204,7 +204,7 @@ "description": "" }, "options_misc_6": { - "message": "Show desktop notification to warn that Gmail is already opened in the active tab", + "message": "Afficher une notification sur le bureau pour avertir que Gmail™ est déjà ouvert dans l'onglet actif", "description": "" }, "popup_read": { @@ -216,7 +216,7 @@ "description": "" }, "settings_open_title": { - "message": "Open options (settings) page", + "message": "Ouvrir la page des options (paramètres)", "description": "" }, "label_2": { @@ -232,7 +232,7 @@ "description": "" }, "options_tab_5": { - "message": "Ouvrir un compte Gmail dans un onglet d'arrière-plan", + "message": "Ouvrir un compte Gmail™ dans un onglet d'arrière-plan", "description": "" }, "label_7": { @@ -248,7 +248,7 @@ "description": "" }, "options_title": { - "message": "Options - Gmail™ Notifier", + "message": "Options - Notifieur Gmail™", "description": "" }, "popup_msg_13": { @@ -268,11 +268,11 @@ "description": "" }, "options_tab_9": { - "message": "When unchecked, Gmail Notifier checks either active window or all open windows for open instance of Gmail and switch to the tab when tab opening is requested.", + "message": "Lorsque cette option est décochée, le notifieur Gmail™ vérifie la fenêtre active ou l'ensemble des fenêtres ouvertes pour l'instance en cours de Gmail™ et passe à l'onglet suivant lorsque l'ouverture d'onglet est demandée.", "description": "" }, "gmail": { - "message": "Gmail™ Notifier", + "message": "Notifieur Gmail™", "description": "" }, "popup_msg_6": { @@ -284,7 +284,7 @@ "description": "" }, "options_notifications_16": { - "message": "Alerte par défaut Gmail Notifier", + "message": "Alerte par défaut du Notifieur Gmail™", "description": "" }, "options_misc_14": { @@ -312,7 +312,7 @@ "description": "" }, "log_in_to_your_account": { - "message": "Veuillez vous connecter à votre compte Gmail", + "message": "Veuillez vous connecter à votre compte Gmail™", "description": "" }, "popup_of": { @@ -320,7 +320,7 @@ "description": "" }, "options_notifications_15": { - "message": "Default sound notification is", + "message": "La notification sonore par défaut est", "description": "" }, "options_notifications_21": { @@ -364,7 +364,7 @@ "description": "" }, "options_gmail": { - "message": "Gmail :", + "message": "Gmail™ :", "description": "" }, "label_1": { @@ -376,11 +376,11 @@ "description": "" }, "options_notifications_24": { - "message": "Le volume est un nombre entre 0 et 100 où 100 est le volume le plus fort (défaut).", + "message": "Le volume est un nombre entre 0 et 100 où 100 est le volume le plus fort (par défaut).", "description": "" }, "options_notifications_10": { - "message": "Note pour les utilisateurs de Mac. Depuis Firefox 28.0, toutes les notifications de bureau sont gérées par le \"Notification Center\" Mac qui provoque une alerte sonore supplémentaire. Vous devez désactiver soit cette notification sonore, soit celle générée par le \"Notification Center\".", + "message": "Remarque : pour les utilisateurs de Mac. Depuis la version 28.0 de Firefox, toutes les notifications de bureau sont gérées par le \"Centre de Notifications\" Mac qui provoque une alerte sonore supplémentaire. Vous devez désactiver soit cette notification sonore, soit celle générée par le \"Centre de Notifications\".", "description": "" }, "options_misc_2": { @@ -408,11 +408,11 @@ "description": "" }, "options_notifications_35": { - "message": "To select a new custom sound, select a built-in sound first and then change the option to custom sound", + "message": "Pour sélectionner un nouveau son personnalisé, sélectionnez d'abord un son intégré, puis modifiez l'option en son personnalisé", "description": "" }, "msg_1": { - "message": "Un onglet est déjà ouvert. Cliquez sur le bouton de la barre d'outils pour ouvrir Gmail dans un nouvel onglet, ou pour basculer sur un onglet Gmail existant.", + "message": "Un onglet est déjà ouvert. Cliquez sur le bouton de la barre d'outils pour ouvrir Gmail™ dans un nouvel onglet, ou pour basculer sur un onglet Gmail™ existant.", "description": "" }, "popup_refresh": { @@ -432,11 +432,11 @@ "description": "" }, "options_notifications_33": { - "message": "email title contains", + "message": "titre des contenus d'e-mail", "description": "" }, "tooltip_3": { - "message": "Clic droit : Sélections des comptes", + "message": "Clic droit : sélections des comptes", "description": "" }, "popup_date_format": { @@ -456,11 +456,11 @@ "description": "" }, "options_notifications_22": { - "message": "If your browser is not playing the custom notification sound, try to convert it into a plain WAV format using an online conversion tool.", + "message": "Si votre navigateur ne lit pas le son de notification personnalisé, essayez de le convertir en un format WAV simple à l'aide d'un outil de conversion en ligne.", "description": "" }, "options_tab_1": { - "message": "Chercher un compte Gmail ouvert seulement dans la fenêtre active", + "message": "Chercher un compte Gmail™ ouvert seulement dans la fenêtre active", "description": "" }, "popup_msg_7_format": { @@ -476,7 +476,7 @@ "description": "" }, "toolbar_label": { - "message": "Gmail™ Notifier", + "message": "Notifieur Gmail™", "description": "" }, "popup_msg_1": { @@ -520,7 +520,7 @@ "description": "" }, "options_toolbar_3": { - "message": "Ouvrir un compte Gmail si un seul compte est connecté", + "message": "Ouvrir un compte Gmail™ si un seul compte est connecté", "description": "" }, "options_gmail_7": { @@ -544,15 +544,15 @@ "description": "" }, "tooltip_2": { - "message": "Clic milieu (ou Ctrl+clic gauche) : Rafraîchir tous les comptes", + "message": "Clic milieu (ou Ctrl+clic gauche) : rafraîchir tous les comptes", "description": "" }, "options_notifications_29": { - "message": "This option is related to the right click menu on the toolbar button -> disable all notifications -> custom time period.", + "message": "Cette option est liée au menu contextuel sur le bouton de la barre d'outils -> désactiver toutes les notifications -> période de temps personnalisée.", "description": "" }, "options_tab_3": { - "message": "Ouvrir un nouveau compte Gmail à côté de l'onglet actif", + "message": "Ouvrir un nouveau compte Gmail™ à côté de l'onglet actif", "description": "" }, "options_gmail_8": { @@ -560,7 +560,7 @@ "description": "" }, "options_toolbar_17": { - "message": "Ouvrir le premier compte Gmail", + "message": "Ouvrir le premier compte Gmail™", "description": "" }, "options_notifications_7": { @@ -572,7 +572,7 @@ "description": "" }, "options_tab_8": { - "message": "Ignore opened Gmail tabs", + "message": "Ignorer les onglets Gmail™ ouverts", "description": "" }, "popup_no_subject": { @@ -580,7 +580,7 @@ "description": "" }, "msg_5": { - "message": "Select an audio sound file", + "message": "Choisir un fichier son", "description": "" }, "popup_msg_2": { @@ -596,7 +596,7 @@ "description": "" }, "msg_4": { - "message": "Note : Pour que le notifieur fonctionne correctement, vous devez être connecté à votre compte Google.", + "message": "Remarque : pour que le notifieur fonctionne correctement, vous devez être connecté à votre compte Google.", "description": "" }, "popup_msg_20": { @@ -612,7 +612,7 @@ "description": "" }, "options_tab_2": { - "message": "Ne pas chercher les comptes Gmail ouverts dans les autres fenêtres du navigateur. Si Gmail n'est pas ouvert dans la fenêtre active, ouvrir un nouvel onglet.", + "message": "Ne pas chercher les comptes Gmail™ ouverts dans les autres fenêtres du navigateur. Si Gmail™ n'est pas ouvert dans la fenêtre active, ouvrir un nouvel onglet.", "description": "" }, "label_11": { @@ -624,7 +624,7 @@ "description": "" }, "options_notifications_31": { - "message": "Custom sound notification", + "message": "Son de notification personnalisé", "description": "" }, "options_timings_l5": { @@ -636,7 +636,7 @@ "description": "" }, "options_gmail_2": { - "message": "Séparer les libellés par \",\" (Virgule).", + "message": "Séparer les libellés par \",\" (virgule).", "description": "" }, "options_misc_4": { @@ -660,7 +660,7 @@ "description": "" }, "options_inshort": { - "message": "Notifieur multi-comptes et multi-libellés pour Google Mail (Gmail).", + "message": "Notifieur multi-comptes et multi-libellés pour Google Mail (Gmail™).", "description": "" }, "options_misc_12": { @@ -668,7 +668,7 @@ "description": "" }, "options_tab_4": { - "message": "Ouvrir un compte Gmail dans l'onglet actif", + "message": "Ouvrir un compte Gmail™ dans l'onglet actif", "description": "" }, "popup_msg_3_format": { @@ -676,15 +676,15 @@ "description": "" }, "label_12": { - "message": "Open FAQs", + "message": "Ouvrir la FAQ", "description": "" }, "description": { - "message": "Notifieur multi-comptes et multi-libellés pour Google Mail (Gmail)", + "message": "Notifieur multi-comptes et multi-libellés pour Google Mail (Gmail™)", "description": "" }, "popup_spam": { "message": "Spam", "description": "" } -} \ No newline at end of file +} diff --git a/JPM/src/_locales/hu/messages.json b/v1/src/_locales/hu/messages.json similarity index 100% rename from JPM/src/_locales/hu/messages.json rename to v1/src/_locales/hu/messages.json diff --git a/JPM/src/_locales/nl/messages.json b/v1/src/_locales/nl/messages.json similarity index 100% rename from JPM/src/_locales/nl/messages.json rename to v1/src/_locales/nl/messages.json diff --git a/JPM/src/_locales/pl/messages.json b/v1/src/_locales/pl/messages.json similarity index 100% rename from JPM/src/_locales/pl/messages.json rename to v1/src/_locales/pl/messages.json diff --git a/JPM/src/_locales/ru/messages.json b/v1/src/_locales/ru/messages.json similarity index 100% rename from JPM/src/_locales/ru/messages.json rename to v1/src/_locales/ru/messages.json diff --git a/JPM/src/_locales/sr/messages.json b/v1/src/_locales/sr/messages.json similarity index 100% rename from JPM/src/_locales/sr/messages.json rename to v1/src/_locales/sr/messages.json diff --git a/JPM/src/_locales/zh_CN/messages.json b/v1/src/_locales/zh_CN/messages.json similarity index 100% rename from JPM/src/_locales/zh_CN/messages.json rename to v1/src/_locales/zh_CN/messages.json diff --git a/JPM/src/chrome.manifest b/v1/src/chrome.manifest similarity index 100% rename from JPM/src/chrome.manifest rename to v1/src/chrome.manifest diff --git a/JPM/src/data/firefox/chrome/content/options-opener.xul b/v1/src/data/firefox/chrome/content/options-opener.xul similarity index 100% rename from JPM/src/data/firefox/chrome/content/options-opener.xul rename to v1/src/data/firefox/chrome/content/options-opener.xul diff --git a/JPM/src/data/firefox/notification.html b/v1/src/data/firefox/notification.html similarity index 100% rename from JPM/src/data/firefox/notification.html rename to v1/src/data/firefox/notification.html diff --git a/JPM/src/data/firefox/shared/connect.jsm b/v1/src/data/firefox/shared/connect.jsm similarity index 100% rename from JPM/src/data/firefox/shared/connect.jsm rename to v1/src/data/firefox/shared/connect.jsm diff --git a/JPM/src/data/firefox/sound.html b/v1/src/data/firefox/sound.html similarity index 100% rename from JPM/src/data/firefox/sound.html rename to v1/src/data/firefox/sound.html diff --git a/JPM/src/data/icons/blue/16.png b/v1/src/data/icons/blue/16.png similarity index 100% rename from JPM/src/data/icons/blue/16.png rename to v1/src/data/icons/blue/16.png diff --git a/JPM/src/data/icons/blue/19.png b/v1/src/data/icons/blue/19.png similarity index 100% rename from JPM/src/data/icons/blue/19.png rename to v1/src/data/icons/blue/19.png diff --git a/JPM/src/data/icons/blue/32.png b/v1/src/data/icons/blue/32.png similarity index 100% rename from JPM/src/data/icons/blue/32.png rename to v1/src/data/icons/blue/32.png diff --git a/JPM/src/data/icons/browsers/chrome.png b/v1/src/data/icons/browsers/chrome.png similarity index 100% rename from JPM/src/data/icons/browsers/chrome.png rename to v1/src/data/icons/browsers/chrome.png diff --git a/JPM/src/data/icons/browsers/firefox.png b/v1/src/data/icons/browsers/firefox.png similarity index 100% rename from JPM/src/data/icons/browsers/firefox.png rename to v1/src/data/icons/browsers/firefox.png diff --git a/JPM/src/data/icons/browsers/opera.png b/v1/src/data/icons/browsers/opera.png similarity index 100% rename from JPM/src/data/icons/browsers/opera.png rename to v1/src/data/icons/browsers/opera.png diff --git a/JPM/src/data/icons/browsers/safari.png b/v1/src/data/icons/browsers/safari.png similarity index 100% rename from JPM/src/data/icons/browsers/safari.png rename to v1/src/data/icons/browsers/safari.png diff --git a/JPM/src/data/icons/gray/16.png b/v1/src/data/icons/gray/16.png similarity index 100% rename from JPM/src/data/icons/gray/16.png rename to v1/src/data/icons/gray/16.png diff --git a/JPM/src/data/icons/gray/19.png b/v1/src/data/icons/gray/19.png similarity index 100% rename from JPM/src/data/icons/gray/19.png rename to v1/src/data/icons/gray/19.png diff --git a/JPM/src/data/icons/gray/32.png b/v1/src/data/icons/gray/32.png similarity index 100% rename from JPM/src/data/icons/gray/32.png rename to v1/src/data/icons/gray/32.png diff --git a/JPM/src/data/icons/load0/16.png b/v1/src/data/icons/load0/16.png similarity index 100% rename from JPM/src/data/icons/load0/16.png rename to v1/src/data/icons/load0/16.png diff --git a/JPM/src/data/icons/load0/19.png b/v1/src/data/icons/load0/19.png similarity index 100% rename from JPM/src/data/icons/load0/19.png rename to v1/src/data/icons/load0/19.png diff --git a/JPM/src/data/icons/load0/32.png b/v1/src/data/icons/load0/32.png similarity index 100% rename from JPM/src/data/icons/load0/32.png rename to v1/src/data/icons/load0/32.png diff --git a/JPM/src/data/icons/load1/16.png b/v1/src/data/icons/load1/16.png similarity index 100% rename from JPM/src/data/icons/load1/16.png rename to v1/src/data/icons/load1/16.png diff --git a/JPM/src/data/icons/load1/19.png b/v1/src/data/icons/load1/19.png similarity index 100% rename from JPM/src/data/icons/load1/19.png rename to v1/src/data/icons/load1/19.png diff --git a/JPM/src/data/icons/load1/32.png b/v1/src/data/icons/load1/32.png similarity index 100% rename from JPM/src/data/icons/load1/32.png rename to v1/src/data/icons/load1/32.png diff --git a/JPM/src/data/icons/load2/16.png b/v1/src/data/icons/load2/16.png similarity index 100% rename from JPM/src/data/icons/load2/16.png rename to v1/src/data/icons/load2/16.png diff --git a/JPM/src/data/icons/load2/19.png b/v1/src/data/icons/load2/19.png similarity index 100% rename from JPM/src/data/icons/load2/19.png rename to v1/src/data/icons/load2/19.png diff --git a/JPM/src/data/icons/load2/32.png b/v1/src/data/icons/load2/32.png similarity index 100% rename from JPM/src/data/icons/load2/32.png rename to v1/src/data/icons/load2/32.png diff --git a/JPM/src/data/icons/load3/16.png b/v1/src/data/icons/load3/16.png similarity index 100% rename from JPM/src/data/icons/load3/16.png rename to v1/src/data/icons/load3/16.png diff --git a/JPM/src/data/icons/load3/19.png b/v1/src/data/icons/load3/19.png similarity index 100% rename from JPM/src/data/icons/load3/19.png rename to v1/src/data/icons/load3/19.png diff --git a/JPM/src/data/icons/load3/32.png b/v1/src/data/icons/load3/32.png similarity index 100% rename from JPM/src/data/icons/load3/32.png rename to v1/src/data/icons/load3/32.png diff --git a/JPM/src/data/icons/new/16.png b/v1/src/data/icons/new/16.png similarity index 100% rename from JPM/src/data/icons/new/16.png rename to v1/src/data/icons/new/16.png diff --git a/JPM/src/data/icons/new/19.png b/v1/src/data/icons/new/19.png similarity index 100% rename from JPM/src/data/icons/new/19.png rename to v1/src/data/icons/new/19.png diff --git a/JPM/src/data/icons/new/32.png b/v1/src/data/icons/new/32.png similarity index 100% rename from JPM/src/data/icons/new/32.png rename to v1/src/data/icons/new/32.png diff --git a/JPM/src/data/icons/notification/16.png b/v1/src/data/icons/notification/16.png similarity index 100% rename from JPM/src/data/icons/notification/16.png rename to v1/src/data/icons/notification/16.png diff --git a/JPM/src/data/icons/notification/32.png b/v1/src/data/icons/notification/32.png similarity index 100% rename from JPM/src/data/icons/notification/32.png rename to v1/src/data/icons/notification/32.png diff --git a/JPM/src/data/icons/notification/48.png b/v1/src/data/icons/notification/48.png similarity index 100% rename from JPM/src/data/icons/notification/48.png rename to v1/src/data/icons/notification/48.png diff --git a/JPM/src/data/icons/notification/64.png b/v1/src/data/icons/notification/64.png similarity index 100% rename from JPM/src/data/icons/notification/64.png rename to v1/src/data/icons/notification/64.png diff --git a/JPM/src/data/icons/options/16.png b/v1/src/data/icons/options/16.png similarity index 100% rename from JPM/src/data/icons/options/16.png rename to v1/src/data/icons/options/16.png diff --git a/JPM/src/data/icons/options/64.png b/v1/src/data/icons/options/64.png similarity index 100% rename from JPM/src/data/icons/options/64.png rename to v1/src/data/icons/options/64.png diff --git a/JPM/src/data/icons/red/128.png b/v1/src/data/icons/red/128.png similarity index 100% rename from JPM/src/data/icons/red/128.png rename to v1/src/data/icons/red/128.png diff --git a/JPM/src/data/icons/red/16.png b/v1/src/data/icons/red/16.png similarity index 100% rename from JPM/src/data/icons/red/16.png rename to v1/src/data/icons/red/16.png diff --git a/JPM/src/data/icons/red/19.png b/v1/src/data/icons/red/19.png similarity index 100% rename from JPM/src/data/icons/red/19.png rename to v1/src/data/icons/red/19.png diff --git a/JPM/src/data/icons/red/32.png b/v1/src/data/icons/red/32.png similarity index 100% rename from JPM/src/data/icons/red/32.png rename to v1/src/data/icons/red/32.png diff --git a/JPM/src/data/icons/red/48.png b/v1/src/data/icons/red/48.png similarity index 100% rename from JPM/src/data/icons/red/48.png rename to v1/src/data/icons/red/48.png diff --git a/JPM/src/data/icons/red/64.png b/v1/src/data/icons/red/64.png similarity index 100% rename from JPM/src/data/icons/red/64.png rename to v1/src/data/icons/red/64.png diff --git a/JPM/src/data/icons/safari/clear.png b/v1/src/data/icons/safari/clear.png similarity index 100% rename from JPM/src/data/icons/safari/clear.png rename to v1/src/data/icons/safari/clear.png diff --git a/JPM/src/data/icons/safari/new.png b/v1/src/data/icons/safari/new.png similarity index 100% rename from JPM/src/data/icons/safari/new.png rename to v1/src/data/icons/safari/new.png diff --git a/JPM/src/data/icons/safari/unknown.png b/v1/src/data/icons/safari/unknown.png similarity index 100% rename from JPM/src/data/icons/safari/unknown.png rename to v1/src/data/icons/safari/unknown.png diff --git a/JPM/src/data/icons/tray/blue.png b/v1/src/data/icons/tray/blue.png similarity index 100% rename from JPM/src/data/icons/tray/blue.png rename to v1/src/data/icons/tray/blue.png diff --git a/JPM/src/data/icons/tray/gray.png b/v1/src/data/icons/tray/gray.png similarity index 100% rename from JPM/src/data/icons/tray/gray.png rename to v1/src/data/icons/tray/gray.png diff --git a/JPM/src/data/icons/tray/red.png b/v1/src/data/icons/tray/red.png similarity index 100% rename from JPM/src/data/icons/tray/red.png rename to v1/src/data/icons/tray/red.png diff --git a/JPM/src/data/options/chrome/chrome.js b/v1/src/data/options/chrome/chrome.js similarity index 100% rename from JPM/src/data/options/chrome/chrome.js rename to v1/src/data/options/chrome/chrome.js diff --git a/JPM/src/data/options/css_browser_selector.js b/v1/src/data/options/css_browser_selector.js similarity index 100% rename from JPM/src/data/options/css_browser_selector.js rename to v1/src/data/options/css_browser_selector.js diff --git a/JPM/src/data/options/firefox/firefox.js b/v1/src/data/options/firefox/firefox.js similarity index 100% rename from JPM/src/data/options/firefox/firefox.js rename to v1/src/data/options/firefox/firefox.js diff --git a/JPM/src/data/options/index.css b/v1/src/data/options/index.css similarity index 100% rename from JPM/src/data/options/index.css rename to v1/src/data/options/index.css diff --git a/JPM/src/data/options/index.html b/v1/src/data/options/index.html similarity index 100% rename from JPM/src/data/options/index.html rename to v1/src/data/options/index.html diff --git a/JPM/src/data/options/index.js b/v1/src/data/options/index.js similarity index 100% rename from JPM/src/data/options/index.js rename to v1/src/data/options/index.js diff --git a/JPM/src/data/options/safari/safari.js b/v1/src/data/options/safari/safari.js similarity index 100% rename from JPM/src/data/options/safari/safari.js rename to v1/src/data/options/safari/safari.js diff --git a/JPM/src/data/popup/body/email-chrome.css b/v1/src/data/popup/body/email-chrome.css similarity index 100% rename from JPM/src/data/popup/body/email-chrome.css rename to v1/src/data/popup/body/email-chrome.css diff --git a/JPM/src/data/popup/body/email-firefox.css b/v1/src/data/popup/body/email-firefox.css similarity index 100% rename from JPM/src/data/popup/body/email-firefox.css rename to v1/src/data/popup/body/email-firefox.css diff --git a/JPM/src/data/popup/chrome/chrome.js b/v1/src/data/popup/chrome/chrome.js similarity index 100% rename from JPM/src/data/popup/chrome/chrome.js rename to v1/src/data/popup/chrome/chrome.js diff --git a/JPM/src/data/popup/fetch.gif b/v1/src/data/popup/fetch.gif similarity index 100% rename from JPM/src/data/popup/fetch.gif rename to v1/src/data/popup/fetch.gif diff --git a/JPM/src/data/popup/firefox/firefox.js b/v1/src/data/popup/firefox/firefox.js similarity index 100% rename from JPM/src/data/popup/firefox/firefox.js rename to v1/src/data/popup/firefox/firefox.js diff --git a/JPM/src/data/popup/icons.png b/v1/src/data/popup/icons.png similarity index 100% rename from JPM/src/data/popup/icons.png rename to v1/src/data/popup/icons.png diff --git a/JPM/src/data/popup/index.css b/v1/src/data/popup/index.css similarity index 100% rename from JPM/src/data/popup/index.css rename to v1/src/data/popup/index.css diff --git a/JPM/src/data/popup/index.html b/v1/src/data/popup/index.html similarity index 100% rename from JPM/src/data/popup/index.html rename to v1/src/data/popup/index.html diff --git a/JPM/builds/unpacked/chrome/data/popup/index.js b/v1/src/data/popup/index.js similarity index 100% rename from JPM/builds/unpacked/chrome/data/popup/index.js rename to v1/src/data/popup/index.js diff --git a/JPM/src/data/popup/safari/safari.js b/v1/src/data/popup/safari/safari.js similarity index 100% rename from JPM/src/data/popup/safari/safari.js rename to v1/src/data/popup/safari/safari.js diff --git a/JPM/src/data/popup/wait.gif b/v1/src/data/popup/wait.gif similarity index 100% rename from JPM/src/data/popup/wait.gif rename to v1/src/data/popup/wait.gif diff --git a/JPM/src/data/sounds/0.wav b/v1/src/data/sounds/0.wav similarity index 100% rename from JPM/src/data/sounds/0.wav rename to v1/src/data/sounds/0.wav diff --git a/JPM/src/data/sounds/1.wav b/v1/src/data/sounds/1.wav similarity index 100% rename from JPM/src/data/sounds/1.wav rename to v1/src/data/sounds/1.wav diff --git a/JPM/src/data/sounds/2.wav b/v1/src/data/sounds/2.wav similarity index 100% rename from JPM/src/data/sounds/2.wav rename to v1/src/data/sounds/2.wav diff --git a/JPM/src/data/sounds/3.wav b/v1/src/data/sounds/3.wav similarity index 100% rename from JPM/src/data/sounds/3.wav rename to v1/src/data/sounds/3.wav diff --git a/JPM/src/lib/common.js b/v1/src/lib/common.js similarity index 100% rename from JPM/src/lib/common.js rename to v1/src/lib/common.js diff --git a/JPM/src/lib/config.js b/v1/src/lib/config.js similarity index 100% rename from JPM/src/lib/config.js rename to v1/src/lib/config.js diff --git a/JPM/src/lib/utils/gmail.js b/v1/src/lib/utils/gmail.js similarity index 100% rename from JPM/src/lib/utils/gmail.js rename to v1/src/lib/utils/gmail.js diff --git a/JPM/src/lib/utils/render.js b/v1/src/lib/utils/render.js similarity index 100% rename from JPM/src/lib/utils/render.js rename to v1/src/lib/utils/render.js diff --git a/JPM/src/lib/utils/server.js b/v1/src/lib/utils/server.js similarity index 100% rename from JPM/src/lib/utils/server.js rename to v1/src/lib/utils/server.js diff --git a/JPM/src/lib/utils/tab.js b/v1/src/lib/utils/tab.js similarity index 100% rename from JPM/src/lib/utils/tab.js rename to v1/src/lib/utils/tab.js diff --git a/JPM/src/lib/utils/timer.js b/v1/src/lib/utils/timer.js similarity index 100% rename from JPM/src/lib/utils/timer.js rename to v1/src/lib/utils/timer.js diff --git a/JPM/src/lib/wrapper/chrome/EventEmitter.js b/v1/src/lib/wrapper/chrome/EventEmitter.js similarity index 100% rename from JPM/src/lib/wrapper/chrome/EventEmitter.js rename to v1/src/lib/wrapper/chrome/EventEmitter.js diff --git a/JPM/src/lib/wrapper/chrome/app.js b/v1/src/lib/wrapper/chrome/app.js similarity index 100% rename from JPM/src/lib/wrapper/chrome/app.js rename to v1/src/lib/wrapper/chrome/app.js diff --git a/JPM/src/lib/wrapper/chrome/background.html b/v1/src/lib/wrapper/chrome/background.html similarity index 100% rename from JPM/src/lib/wrapper/chrome/background.html rename to v1/src/lib/wrapper/chrome/background.html diff --git a/JPM/src/lib/wrapper/firefox/app.js b/v1/src/lib/wrapper/firefox/app.js similarity index 100% rename from JPM/src/lib/wrapper/firefox/app.js rename to v1/src/lib/wrapper/firefox/app.js diff --git a/JPM/src/lib/wrapper/firefox/tbExtra.js b/v1/src/lib/wrapper/firefox/tbExtra.js similarity index 100% rename from JPM/src/lib/wrapper/firefox/tbExtra.js rename to v1/src/lib/wrapper/firefox/tbExtra.js diff --git a/JPM/src/lib/wrapper/firefox/tray/darwin/tray.js b/v1/src/lib/wrapper/firefox/tray/darwin/tray.js similarity index 100% rename from JPM/src/lib/wrapper/firefox/tray/darwin/tray.js rename to v1/src/lib/wrapper/firefox/tray/darwin/tray.js diff --git a/JPM/src/lib/wrapper/firefox/tray/winnt/tray.js b/v1/src/lib/wrapper/firefox/tray/winnt/tray.js similarity index 100% rename from JPM/src/lib/wrapper/firefox/tray/winnt/tray.js rename to v1/src/lib/wrapper/firefox/tray/winnt/tray.js diff --git a/JPM/src/lib/wrapper/firefox/tray/wrapper.js b/v1/src/lib/wrapper/firefox/tray/wrapper.js similarity index 100% rename from JPM/src/lib/wrapper/firefox/tray/wrapper.js rename to v1/src/lib/wrapper/firefox/tray/wrapper.js diff --git a/JPM/src/lib/wrapper/firefox/userstyles.js b/v1/src/lib/wrapper/firefox/userstyles.js similarity index 100% rename from JPM/src/lib/wrapper/firefox/userstyles.js rename to v1/src/lib/wrapper/firefox/userstyles.js diff --git a/JPM/src/lib/wrapper/safari/app.js b/v1/src/lib/wrapper/safari/app.js similarity index 100% rename from JPM/src/lib/wrapper/safari/app.js rename to v1/src/lib/wrapper/safari/app.js diff --git a/JPM/src/lib/wrapper/safari/background.html b/v1/src/lib/wrapper/safari/background.html similarity index 100% rename from JPM/src/lib/wrapper/safari/background.html rename to v1/src/lib/wrapper/safari/background.html diff --git a/JPM/src/lib/wrapper/safari/i18next-1.7.4.js b/v1/src/lib/wrapper/safari/i18next-1.7.4.js similarity index 100% rename from JPM/src/lib/wrapper/safari/i18next-1.7.4.js rename to v1/src/lib/wrapper/safari/i18next-1.7.4.js diff --git a/JPM/src/lib/wrapper/safari/q.js b/v1/src/lib/wrapper/safari/q.js similarity index 100% rename from JPM/src/lib/wrapper/safari/q.js rename to v1/src/lib/wrapper/safari/q.js diff --git a/JPM/src/locale/bg.properties b/v1/src/locale/bg.properties similarity index 100% rename from JPM/src/locale/bg.properties rename to v1/src/locale/bg.properties diff --git a/JPM/src/locale/el.properties b/v1/src/locale/el.properties similarity index 100% rename from JPM/src/locale/el.properties rename to v1/src/locale/el.properties diff --git a/JPM/src/locale/en-US.properties b/v1/src/locale/en-US.properties similarity index 100% rename from JPM/src/locale/en-US.properties rename to v1/src/locale/en-US.properties diff --git a/JPM/src/locale/en.properties b/v1/src/locale/en.properties similarity index 100% rename from JPM/src/locale/en.properties rename to v1/src/locale/en.properties diff --git a/JPM/src/locale/fr.properties b/v1/src/locale/fr.properties similarity index 100% rename from JPM/src/locale/fr.properties rename to v1/src/locale/fr.properties diff --git a/JPM/src/locale/hu.properties b/v1/src/locale/hu.properties similarity index 100% rename from JPM/src/locale/hu.properties rename to v1/src/locale/hu.properties diff --git a/JPM/src/locale/nl.properties b/v1/src/locale/nl.properties similarity index 100% rename from JPM/src/locale/nl.properties rename to v1/src/locale/nl.properties diff --git a/JPM/src/locale/pl.properties b/v1/src/locale/pl.properties similarity index 100% rename from JPM/src/locale/pl.properties rename to v1/src/locale/pl.properties diff --git a/JPM/src/locale/ru-RU.properties b/v1/src/locale/ru-RU.properties similarity index 100% rename from JPM/src/locale/ru-RU.properties rename to v1/src/locale/ru-RU.properties diff --git a/JPM/src/locale/ru.properties b/v1/src/locale/ru.properties similarity index 100% rename from JPM/src/locale/ru.properties rename to v1/src/locale/ru.properties diff --git a/JPM/src/locale/sr.properties b/v1/src/locale/sr.properties similarity index 100% rename from JPM/src/locale/sr.properties rename to v1/src/locale/sr.properties diff --git a/JPM/src/locale/zh-CN.properties b/v1/src/locale/zh-CN.properties similarity index 100% rename from JPM/src/locale/zh-CN.properties rename to v1/src/locale/zh-CN.properties diff --git a/JPM/src/manifest.json b/v1/src/manifest.json similarity index 100% rename from JPM/src/manifest.json rename to v1/src/manifest.json diff --git a/JPM/src/package.json b/v1/src/package.json similarity index 100% rename from JPM/src/package.json rename to v1/src/package.json diff --git a/JPM/src/update.plist b/v1/src/update.plist similarity index 100% rename from JPM/src/update.plist rename to v1/src/update.plist diff --git a/WebExtension/LICENSE b/v2/LICENSE similarity index 100% rename from WebExtension/LICENSE rename to v2/LICENSE diff --git a/v2/_locales/ar/messages.json b/v2/_locales/ar/messages.json new file mode 100644 index 00000000..ffd024c9 --- /dev/null +++ b/v2/_locales/ar/messages.json @@ -0,0 +1,758 @@ +{ + "toolbar_label": { + "message": "Notifier for Gmail™", + "description": "" + }, + "tooltip_1": { + "message": "Left click: Open Gmail or mail preview panel", + "description": "" + }, + "tooltip_2": { + "message": "Middle (or Ctrl+Left) click: Refresh all accounts", + "description": "" + }, + "tooltip_3": { + "message": "Right click: Account selections", + "description": "" + }, + "description": { + "message": "Multiple label and account notifier for Google Mail (Gmail)", + "description": "" + }, + "log_in_to_your_account": { + "message": "Please sign-in to your Gmail account", + "description": "" + }, + "msg_1": { + "message": "Tab is already open. Click on the toolbar button to open Gmail in a new tab, or to switch to an existing Gmail tab.", + "description": "" + }, + "msg_2": { + "message": "الرابط نُسخ إلي الحافظة.", + "description": "" + }, + "msg_3": { + "message": "النص المحدد نُسخ إلي الحافظة.", + "description": "" + }, + "msg_4": { + "message": "Note: For the notifier to work properly, you need to be logged-in into your Google account.", + "description": "" + }, + "msg_5": { + "message": "Select an audio sound file", + "description": "" + }, + "label_1": { + "message": "تحديث", + "description": "" + }, + "label_2": { + "message": "الإعدادات", + "description": "" + }, + "label_3": { + "message": "عدل كل الإشعارات", + "description": "" + }, + "label_4": { + "message": "لـ5 دقائق", + "description": "" + }, + "label_5": { + "message": "لـ 15 دقيقة", + "description": "" + }, + "label_6": { + "message": "لـ 30 دقيقية", + "description": "" + }, + "label_7": { + "message": "لـ 1 ساعة", + "description": "" + }, + "label_8": { + "message": "لـ 2 ساعة", + "description": "" + }, + "label_9": { + "message": "لـ 5 ساعات", + "description": "" + }, + "label_13": { + "message": "For a custom time period", + "description": "" + }, + "label_10": { + "message": "Enable notifications (session)", + "description": "" + }, + "label_11": { + "message": "إنشاء إيميل", + "description": "" + }, + "label_12": { + "message": "Open FAQs", + "description": "" + }, + "label_14": { + "message": "Logged-in accounts", + "description": "" + }, + "unknown": { + "message": "unknown", + "description": "" + }, + "and": { + "message": "and", + "description": "" + }, + "log_into_your_account": { + "message": "Please log into your account", + "description": "" + }, + "notification": { + "message": "From: [author_email][break]Title: [title][break]Summary: [summary]", + "description": "" + }, + "options_title": { + "message": "إعدادات أشعارات جوجل ميل ", + "description": "" + }, + "options_inshort": { + "message": "Multiple label and account notifier for Google Mail (Gmail).", + "description": "" + }, + "options_donation": { + "message": "Support Development", + "description": "" + }, + "options_timings": { + "message": "Timings:", + "description": "" + }, + "options_timings_l1": { + "message": "Check for new emails every (in seconds):", + "description": "" + }, + "options_timings_l2": { + "message": "Minimum period is 10 seconds.", + "description": "" + }, + "options_timings_l3": { + "message": "Remind for all unread emails every (in minutes):", + "description": "" + }, + "options_timings_l4": { + "message": "Set the value to zero for none-periodic reminders.", + "description": "" + }, + "options_timings_l5": { + "message": "Minimum period is 5 minutes.", + "description": "" + }, + "options_timings_l6": { + "message": "Non-zero value fires both desktop notification and alert sound (similar to new email arrival) eternally if you have unread email(s).", + "description": "" + }, + "options_timings_l7": { + "message": "Do not check for new emails on startup for (in seconds):", + "description": "" + }, + "options_timings_l8": { + "message": "Set the value to zero for no email check until the first manual refresh [Not available on Safari].", + "description": "" + }, + "options_gmail": { + "message": "Gmail:", + "description": "" + }, + "options_gmail_1": { + "message": "Primary account (/mail/u/0/)", + "description": "" + }, + "options_gmail_2": { + "message": "Separate labels by \",\" (Comma).", + "description": "" + }, + "options_gmail_3": { + "message": "Secondary account (/mail/u/1/)", + "description": "" + }, + "options_gmail_4": { + "message": "Tertiary account (/mail/u/2/)", + "description": "" + }, + "options_gmail_5": { + "message": "Quaternary account (/mail/u/3/)", + "description": "" + }, + "options_gmail_6": { + "message": "Quinary account (/mail/u/4/)", + "description": "" + }, + "options_gmail_7": { + "message": "Senary account (/mail/u/5/)", + "description": "" + }, + "options_gmail_8": { + "message": "Mark message as read when archiving it", + "description": "" + }, + "options_gmail_15": { + "message": "Some popular labels:", + "description": "" + }, + "options_gmail_10": { + "message": "Receive notifications for the following labels and accounts:", + "description": "" + }, + "options_gmail_11": { + "message": "Custom feeds:", + "description": "" + }, + "options_gmail_12": { + "message": "Separate feeds by \",\" (Comma). Sample feed: https://mail.google.com/mail/u/0/feed/atom/inbox", + "description": "" + }, + "options_gmail_13": { + "message": "Note: maximum number for all labels except \"inbox\" is 20 (Google feeds only supply the 20 newest entries)", + "description": "" + }, + "options_gmail_14": { + "message": "Note: for the Notifier to listen for more than 5 accounts, add feeds URLs to the \"Custom feeds\" field. For instance to listen to the 6 and 7th accounts add: https://mail.google.com/mail/u/6/feed/atom/inbox, https://mail.google.com/mail/u/7/feed/atom/inbox", + "description": "" + }, + "options_notifications": { + "message": "Notifications:", + "description": "" + }, + "options_notifications_1": { + "message": "Display desktop notification for new emails", + "description": "" + }, + "options_notifications_2": { + "message": "Show desktop notification for (in seconds):", + "description": "" + }, + "options_notifications_3": { + "message": "This option may not work based on your OS.", + "description": "" + }, + "options_notifications_4": { + "message": "Notification format", + "description": "" + }, + "options_notifications_5": { + "message": "Available variables:", + "description": "" + }, + "options_notifications_6": { + "message": "Truncate notifications longer than", + "description": "" + }, + "options_notifications_7": { + "message": "characters for [title] and [summary] fields.", + "description": "" + }, + "options_notifications_8": { + "message": "To have no ellipsis truncation, use a big number here.", + "description": "" + }, + "options_notifications_9": { + "message": "Play alert sound for new emails", + "description": "" + }, + "options_notifications_10": { + "message": "Note for Mac users. From Firefox 28.0, all desktop notifications are handled by Mac Notification Center which causes an extra sound alert. You need to either uncheck this sound notification or the one that is generated by the Notification Center.", + "description": "" + }, + "options_notifications_11": { + "message": "Display \"Windows taskbar notification\" or \"Mac OS Dock notification\"", + "description": "" + }, + "options_notifications_12": { + "message": "Taskbar notifications are not supported on Linux OS at the moment.", + "description": "" + }, + "options_notifications_13": { + "message": "Open toolbar panel when click on the taskbar notification icon (Windows only, beta)", + "description": "" + }, + "options_notifications_14": { + "message": "This feature is highly experimental and might make your Firefox browser unstable. [Restart required].", + "description": "" + }, + "options_notifications_15": { + "message": "Default sound notification is", + "description": "" + }, + "options_notifications_16": { + "message": "Gmail Notifier default alert", + "description": "" + }, + "options_notifications_17": { + "message": "Checker Plus bell alert", + "description": "" + }, + "options_notifications_18": { + "message": "Checker Plus ding alert", + "description": "" + }, + "options_notifications_19": { + "message": "Windows email alert", + "description": "" + }, + "options_notifications_20": { + "message": "User defined sound", + "description": "" + }, + "options_notifications_21": { + "message": "User defined notification sound is", + "description": "" + }, + "options_notifications_22": { + "message": "If your browser is not playing the custom notification sound, try to convert it into a plain WAV format using an online conversion tool.", + "description": "" + }, + "options_notifications_35": { + "message": "To select a new custom sound, select a built-in sound first and then change the option to custom sound", + "description": "" + }, + "options_notifications_23": { + "message": "Volume of the sound notification is", + "description": "" + }, + "options_notifications_24": { + "message": "Volume is a number between 0 to 100 where 100 is the highest volume (default).", + "description": "" + }, + "options_notifications_25": { + "message": "In safari most likely the default sound notifications are not playing properly, if so use a custom sound file as your notification.", + "description": "" + }, + "options_notifications_26": { + "message": "Always show tray notification (Windows only)", + "description": "" + }, + "options_notifications_27": { + "message": "Tray notification will be shown even if there is no unread message.", + "description": "" + }, + "options_notifications_28": { + "message": "Disable all notifications for a custom time period (in minutes):", + "description": "" + }, + "options_notifications_29": { + "message": "This option is related to the right click menu on the toolbar button -> disable all notifications -> custom time period.", + "description": "" + }, + "options_notifications_30": { + "message": "Combine all concurrent desktop notifications into a single notification", + "description": "" + }, + "options_notifications_31": { + "message": "Custom sound notification", + "description": "" + }, + "options_notifications_32": { + "message": "name or email contains", + "description": "" + }, + "options_notifications_33": { + "message": "email title contains", + "description": "" + }, + "options_notifications_34": { + "message": "email summary contains", + "description": "" + }, + "options_notifications_36": { + "message": "Ask Gmail to prevent 'inbox.google.com' redirection", + "description": "" + }, + "options_notifications_37": { + "message": "Display Badge number", + "description": "" + }, + "options_notifications_38": { + "message": "Faster actions (mark as read, delete, ...) (Consider actions to be resolved when headers are received)", + "description": "" + }, + "options_notifications_40": { + "message": "Allow quick actions from notification box (maximum two actions) (Chrome only)", + "description": "" + }, + "options_notifications_41": { + "message": "Mark as Read", + "description": "" + }, + "options_notifications_42": { + "message": "Archive", + "description": "" + }, + "options_notifications_43": { + "message": "Trash", + "description": "" + }, + "options_tab": { + "message": "Tab Opening:", + "description": "" + }, + "options_tab_1": { + "message": "Search for an open Gmail account only on the active window", + "description": "" + }, + "options_tab_2": { + "message": "Do not search other browser windows for open Gmail accounts. If Gmail is not open in the active window, open a new tab.", + "description": "" + }, + "options_tab_3": { + "message": "Open new Gmail account next to the active tab", + "description": "" + }, + "options_tab_4": { + "message": "Open Gmail account in the active tab", + "description": "" + }, + "options_tab_5": { + "message": "Open Gmail account in a background tab", + "description": "" + }, + "options_tab_6": { + "message": "Open Gmail account in a new window", + "description": "" + }, + "options_tab_7": { + "message": "Always use blank tabs instead of opening a new tab when open in tab is activated", + "description": "" + }, + "options_tab_8": { + "message": "Ignore opened Gmail tabs", + "description": "" + }, + "options_tab_9": { + "message": "When unchecked, Gmail Notifier checks either active window or all open windows for open instance of Gmail and switch to the tab when tab opening is requested.", + "description": "" + }, + "options_tab_10": { + "message": "Open emails in basic HTML mode", + "description": "" + }, + "options_toolbar": { + "message": "Toolbar:", + "description": "" + }, + "options_toolbar_1": { + "message": "Toolbar button behaviour", + "description": "" + }, + "options_toolbar_2": { + "message": "Always open email preview panel", + "description": "" + }, + "options_toolbar_3": { + "message": "Open Gmail account if only one account is logged-in", + "description": "" + }, + "options_toolbar_18": { + "message": "Open Gmail account (forced)", + "description": "" + }, + "options_toolbar_4": { + "message": "Toolbar panel mode", + "description": "" + }, + "options_toolbar_5": { + "message": "Show summary only", + "description": "" + }, + "options_toolbar_6": { + "message": "Show full content", + "description": "" + }, + "options_toolbar_7": { + "message": "Toolbar panel width in the full-content view mode is (in pixels):", + "description": "" + }, + "options_toolbar_8": { + "message": "Minimum width is 500px.", + "description": "" + }, + "options_toolbar_9": { + "message": "Toolbar panel height in the full-content view mode is (in pixels):", + "description": "" + }, + "options_toolbar_10": { + "message": "Minimum height is 500px.", + "description": "" + }, + "options_toolbar_11": { + "message": "Support keyboard shortcuts on the toolbar panel", + "description": "" + }, + "options_toolbar_12": { + "message": "!: Report as spam, #: Trash, e: Archive, Shift + i: Mark as read.", + "description": "" + }, + "options_toolbar_13": { + "message": "Render emails as HTML in full-content mode", + "description": "" + }, + "options_toolbar_14": { + "message": "If you prefer text-only rendering in the full-content mode, uncheck the box.", + "description": "" + }, + "options_toolbar_15": { + "message": "Middle-click on the toolbar button to", + "description": "" + }, + "options_toolbar_16": { + "message": "Refresh all accounts", + "description": "" + }, + "options_toolbar_17": { + "message": "Open primary Gmail account", + "description": "" + }, + "options_misc": { + "message": "Miscellaneous:", + "description": "" + }, + "options_misc_1": { + "message": "Sort accounts alphabetically", + "description": "" + }, + "options_misc_2": { + "message": "The default order type is logged-in order.", + "description": "" + }, + "options_misc_3": { + "message": "Toolbar color pattern is", + "description": "" + }, + "options_misc_4": { + "message": "Gray color for \"No Unread\" and blue color for \"Disconnected\"", + "description": "" + }, + "options_misc_5": { + "message": "Blue color for \"No Unread\" and gray color for \"Disconnected\"", + "description": "" + }, + "options_misc_9": { + "message": "Red color for \"No Unread\" and gray color for \"Disconnected\"", + "description": "" + }, + "options_misc_6": { + "message": "Show desktop notification to warn that Gmail is already opened in the active tab", + "description": "" + }, + "options_misc_7": { + "message": "Show welcome page on upgrade", + "description": "" + }, + "options_misc_8": { + "message": "Reset all settings back to factory", + "description": "" + }, + "options_misc_10": { + "message": "Only fire desktop and sound notifications when email has arrived in less than (in minutes): ", + "description": "" + }, + "options_misc_11": { + "message": "By setting this preference to zero, you will receive neither desktop nor sound notifications; however, you will still get badge notification.", + "description": "" + }, + "options_misc_12": { + "message": "Do not include login details in the tooltip text", + "description": "" + }, + "options_misc_13": { + "message": "By default, the notifier updates tooltip text of the toolbar button with login info. By unchecking this option, the tooltip text remains the default value.", + "description": "" + }, + "options_misc_14": { + "message": "Do not show the exact badge number when the number of unread emails is greater than 999", + "description": "" + }, + "options_misc_15": { + "message": "Open FAQs page on updates", + "description": "" + }, + "options_plugins": { + "message": "Plug-ins:", + "description": "" + }, + "options_plugins_1": { + "message": "Gmail labels and star button (experimental)", + "description": "" + }, + "options_plugins_2": { + "message": "This plugin displays the star button as well as thread's labels in the popup (expanded mode only).", + "description": "" + }, + "options_px": { + "message": "px", + "description": "" + }, + "options_empty": { + "message": "not defined", + "description": "" + }, + "options_button_test": { + "message": "Play", + "description": "" + }, + "options_button_reset": { + "message": "Reset Preferences", + "description": "" + }, + "popup_settings": { + "message": "settings", + "description": "" + }, + "popup_of": { + "message": "of", + "description": "" + }, + "popup_wait": { + "message": "Wait...", + "description": "" + }, + "popup_date_format": { + "message": "%mm %dd, %yy", + "description": "" + }, + "popup_no_subject": { + "message": "(no subject)", + "description": "" + }, + "popup_open_settings": { + "message": "Open settings", + "description": "" + }, + "popup_open_inbox": { + "message": "Open inbox", + "description": "" + }, + "popup_archive": { + "message": "Archive", + "description": "" + }, + "popup_spam": { + "message": "Spam", + "description": "" + }, + "popup_trash": { + "message": "Trash", + "description": "" + }, + "popup_refresh": { + "message": "Refresh", + "description": "" + }, + "popup_read": { + "message": "Mark as Read", + "description": "" + }, + "popup_read_all": { + "message": "Mark all as read", + "description": "" + }, + "popup_msg_1": { + "message": "just now", + "description": "" + }, + "popup_msg_2": { + "message": "1 minute ago", + "description": "" + }, + "popup_msg_3_format": { + "message": "%d minutes ago", + "description": "" + }, + "popup_msg_4": { + "message": "1 hour ago", + "description": "" + }, + "popup_msg_5": { + "message": "hours ago", + "description": "" + }, + "popup_msg_6": { + "message": "Yesterday", + "description": "" + }, + "popup_msg_7_format": { + "message": "%d days ago", + "description": "" + }, + "popup_msg_8_format": { + "message": "%d week(s) ago", + "description": "" + }, + "popup_msg_9_format": { + "message": "%d month(s) ago", + "description": "" + }, + "popup_msg_10": { + "message": "January", + "description": "" + }, + "popup_msg_11": { + "message": "February", + "description": "" + }, + "popup_msg_12": { + "message": "March", + "description": "" + }, + "popup_msg_13": { + "message": "April", + "description": "" + }, + "popup_msg_14": { + "message": "May", + "description": "" + }, + "popup_msg_15": { + "message": "June", + "description": "" + }, + "popup_msg_16": { + "message": "July", + "description": "" + }, + "popup_msg_17": { + "message": "August", + "description": "" + }, + "popup_msg_18": { + "message": "September", + "description": "" + }, + "popup_msg_19": { + "message": "October", + "description": "" + }, + "popup_msg_20": { + "message": "November", + "description": "" + }, + "popup_msg_21": { + "message": "December", + "description": "" + }, + "settings_open_title": { + "message": "Open options (settings) page", + "description": "" + }, + "settings_open_label": { + "message": "Open Options", + "description": "" + }, + "gmail": { + "message": "Notifier for Gmail™", + "description": "" + } +} \ No newline at end of file diff --git a/v2/_locales/be/messages.json b/v2/_locales/be/messages.json new file mode 100644 index 00000000..9ab532ae --- /dev/null +++ b/v2/_locales/be/messages.json @@ -0,0 +1,762 @@ +{ + "toolbar_label": { + "message": "Notifier for Gmail™", + "description": "" + }, + "tooltip_1": { + "message": "Левая кнопка мышы: Адкрыць Gmail або панэль перадпрагляду", + "description": "" + }, + "tooltip_2": { + "message": "Сярэдняя кнопка мышы (або Ctrl+Left): Абнавіць усе ўліковыя запісы", + "description": "" + }, + "tooltip_3": { + "message": "Правая кнопка мышы: Выбар уліковага запісу", + "description": "" + }, + "description": { + "message": "Апавяшчэнні для некалькіх ярлыкоў і ўліковых запісаў Google Mail (Gmail)", + "description": "" + }, + "log_in_to_your_account": { + "message": "Увайдзіце ў свой уліковы запіс Gmail", + "description": "" + }, + "msg_1": { + "message": "Укладка ўжо адкрыта. Націсніце на кнопку ў панэлі інструментаў, каб адкрыць Gmail у новай укладцы або пераключыцца на існуючую ўкладку Gmail.", + "description": "" + }, + "msg_2": { + "message": "Спасылка скапіявана ў буфер абмену.", + "description": "" + }, + "msg_3": { + "message": "Вылучаны тэкст скапіяваны ў буфер абмену.", + "description": "" + }, + "msg_4": { + "message": "Заўвага: Для правільнай працы Notifier вам трэба ўвайсці ў свой уліковы запіс Google.", + "description": "" + }, + "msg_5": { + "message": "Выберыце аўдыя файл", + "description": "" + }, + "label_1": { + "message": "Абнавіць", + "description": "" + }, + "label_2": { + "message": "Налады", + "description": "" + }, + "label_3": { + "message": "Адключыць усе апавяшчэнні", + "description": "" + }, + "label_4": { + "message": "На 5 хвілін", + "description": "" + }, + "label_5": { + "message": "На 15 хвілін", + "description": "" + }, + "label_6": { + "message": "На 30 хвілін", + "description": "" + }, + "label_7": { + "message": "На 1 гадзіну", + "description": "" + }, + "label_8": { + "message": "На 2 гадзіны", + "description": "" + }, + "label_9": { + "message": "На 5 гадзін", + "description": "" + }, + "label_13": { + "message": "На карыстальніцкі перыяд", + "description": "" + }, + "label_10": { + "message": "Уключыць апавяшчэнні (сесія)", + "description": "" + }, + "label_11": { + "message": "Стварыць ліст", + "description": "" + }, + "label_12": { + "message": "Адкрыць ЧаПы", + "description": "" + }, + "label_14": { + "message": "Уліковыя запісы, пад якімі выкананы ўваход", + "description": "" + }, + "unknown": { + "message": "невядомы", + "description": "" + }, + "and": { + "message": "і", + "description": "" + }, + "log_into_your_account": { + "message": "Увайдзіце ў свой уліковы запіс", + "description": "" + }, + "notification": { + "message": "Ад: [author_email][break]Загаловак: [title][break]Зводка: [summary]", + "description": "" + }, + "options_title": { + "message": "Параметры - Gmail™ Notifier", + "description": "" + }, + "options_inshort": { + "message": "Апавяшчэнні для некалькіх ярлыкоў і ўліковых запісаў Google Mail (Gmail).", + "description": "" + }, + "options_donation": { + "message": "Падтрымаць распрацоўку", + "description": "" + }, + "options_timings": { + "message": "Час:", + "description": "" + }, + "options_timings_l1": { + "message": "Правяраць на новыя лісты кожныя (у секундах):", + "description": "" + }, + "options_timings_l2": { + "message": "Мінімальны перыяд 10 секунд.", + "description": "" + }, + "options_timings_l3": { + "message": "Нагадваць пра непрачытаныя лісты кожныя (у хвілінах):", + "description": "" + }, + "options_timings_l4": { + "message": "Задайце нулявое значэнне, каб апавяшчаць неперыядычна.", + "description": "" + }, + "options_timings_l5": { + "message": "Мінімальны перыяд 5 хвілін.", + "description": "" + }, + "options_timings_l6": { + "message": "Пры ненулявым значэнні і апавяшчэнні працоўнага стала, і гукавыя абвесткі (як і пры атрыманні новых лістоў) будуць з'яўляцца заўсёды, пакуль ў вас ёсць непрачытаная пошта.", + "description": "" + }, + "options_timings_l7": { + "message": "Не правяраць пошту пры запуску на працягу (у секундах):", + "description": "" + }, + "options_timings_l8": { + "message": "Задайце нулявое значэнне, каб не правяраць пошту да першага ручнога абнаўлення [Недаступна ў Safari]", + "description": "" + }, + "options_gmail": { + "message": "Gmail:", + "description": "" + }, + "options_gmail_1": { + "message": "Асноўны ўліковы запіс (/mail/u/0/)", + "description": "" + }, + "options_gmail_2": { + "message": "Раздзяляйце ярлыкі з дапамогай \",\" (коскі).", + "description": "" + }, + "options_gmail_3": { + "message": "Другі ўліковы запіс (/mail/u/1/)", + "description": "" + }, + "options_gmail_4": { + "message": "Трэці ўліковы запіс (/mail/u/2/)", + "description": "" + }, + "options_gmail_5": { + "message": "Чацвёрты ўліковы запіс (/mail/u/3/)", + "description": "" + }, + "options_gmail_6": { + "message": "Пяты ўліковы запіс (/mail/u/4/)", + "description": "" + }, + "options_gmail_7": { + "message": "Шосты ўліковы запіс (/mail/u/5/)", + "description": "" + }, + "options_gmail_8": { + "message": "Пазначаць паведамленне прачытаным пры архіваванні", + "description": "" + }, + "options_gmail_15": { + "message": "Папулярныя ярлыкі:", + "description": "" + }, + "options_gmail_10": { + "message": "Атрымліваць апавяшчэнні для наступных ярлыкоў і ўліковых запісаў:", + "description": "" + }, + "options_gmail_11": { + "message": "Карыстальніцкія каналы:", + "description": "" + }, + "options_gmail_12": { + "message": "Раздзяляйце каналы з дапамогай \",\" (коскі). Прыклад канала: https://mail.google.com/mail/u/0/feed/atom/inbox", + "description": "" + }, + "options_gmail_13": { + "message": "Заўвага: максімальная колькасць ярлыкоў, акрамя \"inbox\", - 20 (каналы Google выдаюць толькі 20 найноўшых запісаў)", + "description": "" + }, + "options_gmail_14": { + "message": "Заўвага: каб Notifier слухаў больш за 5 уліковых запісаў, дадайце URL-адрасы каналаў у поле \"Карыстальніцкія каналы\". Напрыклад, каб слухаць 6-ы і 7-ы ўліковыя запісы, дадайце: https://mail.google.com/mail/u/6/feed/atom/inbox, https://mail.google.com/mail/u/7/feed/atom/inbox", + "description": "" + }, + "options_notifications": { + "message": "Апавяшчэнні:", + "description": "" + }, + "options_notifications_1": { + "message": "Паказваць апавяшчэнне на працоўным стале для новых лістоў", + "description": "" + }, + "options_notifications_2": { + "message": "Паказваць апавяшчэнне на працоўным стале на працягу (у секундах):", + "description": "" + }, + "options_notifications_3": { + "message": "Гэты параметр можа не працаваць у вашай АС.", + "description": "" + }, + "options_notifications_4": { + "message": "Фармат апавяшчэнняў", + "description": "" + }, + "options_notifications_5": { + "message": "Даступныя пераменныя:", + "description": "" + }, + "options_notifications_6": { + "message": "Абразаць апавяшчэнні, даўжэйшыя за", + "description": "" + }, + "options_notifications_7": { + "message": "сімвалы для палёў [title] і [summary].", + "description": "" + }, + "options_notifications_8": { + "message": "Увядзіце тут вялікую лічбу, каб тэкст абразаўся без шматкроп'я.", + "description": "" + }, + "options_notifications_9": { + "message": "Прайграваць гукавую абвестку пры атрыманні новых паведамленняў", + "description": "" + }, + "options_notifications_10": { + "message": "Заўвага для карытальнікаў Mac. У Firefox, пачынаючы ад версіі 28.0, усе апавяшчэнні працоўнага стала апрацоўваюцца Цэнтрам апавяшчэнняў Mac, што прыводзіць да дадатковай гукавой абвесткі. Вам трэба адключыць або гэта гукавое апавяшчэнне, або тое, што стварае Цэнтр апавяшчэнняў.", + "description": "" + }, + "options_notifications_11": { + "message": "Паказваць \"Апавяшчэнне панэлі заданняў у Windows\" або \"Апавяшчэнне док-панэлі ў Mac OS\"", + "description": "" + }, + "options_notifications_12": { + "message": "Апавяшчэнні панэлі заданняў на дадзены момант не падтрымліваюцца ў АС Linux.", + "description": "" + }, + "options_notifications_13": { + "message": "Адкрываць панэль перадпрагляду пры націсканні на значок апавяшчэння панэлі заданняў (толькі Windows, бэта)", + "description": "" + }, + "options_notifications_14": { + "message": "Гэта эксперыментальная функцыя, яна можа прывесці да нестабільнай працы Firefox. [Патрабуецца перазапуск].", + "description": "" + }, + "options_notifications_15": { + "message": "Прадвызначаны гук апавяшчэння", + "description": "" + }, + "options_notifications_16": { + "message": "Прадвызначаная абвестка Gmail Notifier", + "description": "" + }, + "options_notifications_17": { + "message": "Званочак з Checker Plus", + "description": "" + }, + "options_notifications_18": { + "message": "\"Дзінь\" з Checker Plus", + "description": "" + }, + "options_notifications_19": { + "message": "Абвестка пошты з Windows", + "description": "" + }, + "options_notifications_20": { + "message": "Карыстальніцкі гук", + "description": "" + }, + "options_notifications_21": { + "message": "Карыстальніцкі гук апавяшчэння", + "description": "" + }, + "options_notifications_22": { + "message": "Калі ваш браўзер не прайграе карыстальніцкі гук апавяшчэнне, паспрабуйце ператварыць яго ў фармат WAV з дапамогай анлайн інструментаў.", + "description": "" + }, + "options_notifications_35": { + "message": "Каб выбраць новы гук, спачатку выберыце ўбудаваны гук, а потым змяніце параметр на карыстальніцкі", + "description": "" + }, + "options_notifications_23": { + "message": "Гучнасць гукавога апавяшчэння", + "description": "" + }, + "options_notifications_24": { + "message": "Узровень гучнасці - гэта лічба ад 0 да 100, дзе 100 - наймацнейшая гучнасць (прадвазначана).", + "description": "" + }, + "options_notifications_25": { + "message": "У Safari прадвызначаныя гукі апавяшчэнняў хутчэй за ўсё не прайграюцца належным чынам, таму выкарыстоўвайце свой гукавы файл для апавяшчэнняў.", + "description": "" + }, + "options_notifications_26": { + "message": "Заўсёды паказваць апавяшчэнне панэлі заданняў (толькі Windows)", + "description": "" + }, + "options_notifications_27": { + "message": "Апавяшчэнне панэлі заданняў будзе паказвацца нават пры адсутнасці непрачытаных паведамленняў.", + "description": "" + }, + "options_notifications_28": { + "message": "Адключыць усе апавяшчэнні на перыяд (у хвілінах):", + "description": "" + }, + "options_notifications_29": { + "message": "Гэты параметр адпавядае пункту меню правай кнопкі мышы на кнопцы ў панэлі інструментаў -> адключыць усе апавяшчэнні -> карыстальніцкі перыяд.", + "description": "" + }, + "options_notifications_30": { + "message": "Аб'ядноўваць усе адначасовыя апавяшчэнні працоўнага стала ў адно", + "description": "" + }, + "options_notifications_31": { + "message": "Карыстальніцкае гукавое апавяшчэнне", + "description": "" + }, + "options_notifications_32": { + "message": "імя або адрас змяшчае", + "description": "" + }, + "options_notifications_33": { + "message": "загаловак ліста ўтрымлівае", + "description": "" + }, + "options_notifications_34": { + "message": "зводка ліста змяшчае", + "description": "" + }, + "options_notifications_36": { + "message": "Папрасіць Gmail не перанакіроўваць на 'inbox.google.com'", + "description": "" + }, + "options_notifications_37": { + "message": "Паказваць нумар у значку", + "description": "" + }, + "options_notifications_38": { + "message": "Хуткія дзеянні (пазначыць прачынатым, выдаліць, ...) (Дзеянні, якія трэба выканаць пры атрыманні загалоўкаў)", + "description": "" + }, + "options_notifications_40": { + "message": "Дазволіць хуткія дзеянні з акна апавяшчэння (не больш за два дзеянні) (толькі Chrome)", + "description": "" + }, + "options_notifications_41": { + "message": "У прачытанае", + "description": "" + }, + "options_notifications_42": { + "message": "Архіў", + "description": "" + }, + "options_notifications_43": { + "message": "У сметніцу", + "description": "" + }, + "options_tab": { + "message": "Адкрыццё ўкладкі:", + "description": "" + }, + "options_tab_1": { + "message": "Шукаць адкрытую ўкладку Gmail толькі ў актыўным акне", + "description": "" + }, + "options_tab_2": { + "message": "Не шукаць адкрытую ўкладку Gmail у іншых вокнах браўзера. Калі Gmail не адкрыты ў актыўным акне, адкрываць новую ўкладку.", + "description": "" + }, + "options_tab_3": { + "message": "Адкрываць уліковы запіс Gmail побач з актыўнай укладкай", + "description": "" + }, + "options_tab_4": { + "message": "Адкрываць уліковы запіс Gmail у актыўнай укладцы", + "description": "" + }, + "options_tab_5": { + "message": "Адкрываць уліковы запіс Gmail у фонавай укладцы", + "description": "" + }, + "options_tab_6": { + "message": "Адкрываць уліковы запіс Gmail у новым акне", + "description": "" + }, + "options_tab_7": { + "message": "Заўсёды выкарыстоўваць пустыя ўкладкі замест таго, каб адкрываць новыя, калі уключана адкрыванне ўкладкі.", + "description": "" + }, + "options_tab_8": { + "message": "Ігнараваць адкрытыя ўкладкі Gmail", + "description": "" + }, + "options_tab_9": { + "message": "Калі пазнака знята, Gmail Notifier шукае адкрытыя экземпляры Gmail або ў актыўным акне, або ва ўсіх адкрытых вокнах і пераключаецца на ўкладку з ім, калі атрымлівае запыт адкрыць укладку.", + "description": "" + }, + "options_tab_10": { + "message": "Адкрываць лісты ў рэжыме простага HTML", + "description": "" + }, + "options_tab_11": { + "message": "Адкрываць апошні непрачытаны ліст замест папкі \"Уваходныя\"", + "description": "" + }, + "options_toolbar": { + "message": "Панэль інструментаў:", + "description": "" + }, + "options_toolbar_1": { + "message": "Паводзіны кнопкі ў панэлі інструментаў", + "description": "" + }, + "options_toolbar_2": { + "message": "Заўсёды адкрываць панэль перадпрагляду", + "description": "" + }, + "options_toolbar_3": { + "message": "Адкрываць Gmail, калі выкананы ўваход толькі ў адзін уліковы запіс", + "description": "" + }, + "options_toolbar_18": { + "message": "Адкрыць уліковы запіс Gmail (прымусова)", + "description": "" + }, + "options_toolbar_4": { + "message": "Рэжым панэлі перадпрагляду", + "description": "" + }, + "options_toolbar_5": { + "message": "Паказваць толькі зводку", + "description": "" + }, + "options_toolbar_6": { + "message": "Паказваць усё змесціва", + "description": "" + }, + "options_toolbar_7": { + "message": "Шырыня панэлі перадпрагляду ў рэжыме прагляду ўсяго змесціва (у пікселах):", + "description": "" + }, + "options_toolbar_8": { + "message": "Мінімальная шырыня 500 пкс.", + "description": "" + }, + "options_toolbar_9": { + "message": "Вышыня панэлі перадпрагляду ў рэжыме прагляду ўсяго змесціва (у пікселах):", + "description": "" + }, + "options_toolbar_10": { + "message": "Мінімальная вышыня 500 пкс.", + "description": "" + }, + "options_toolbar_11": { + "message": "Падтрымліваць спалучэнні клавіш клавіятуры ў панэлі перадпрагляду", + "description": "" + }, + "options_toolbar_12": { + "message": "!: У спам, #: У сметніцу, e: У архіў, Shift + i: У прачытанае.", + "description": "" + }, + "options_toolbar_13": { + "message": "Апрацоўваць лісты як HTML у рэжыме прагляду ўсяго змесціва", + "description": "" + }, + "options_toolbar_14": { + "message": "Здыміце пазнаку, калі жадаеце апрацоўваць лісты ў рэжыме поўнага прагляду як звычайны тэкст.", + "description": "" + }, + "options_toolbar_15": { + "message": "Націсканне сярэдній кнопкай мышы па кнопцы ў панэлі інструментаў", + "description": "" + }, + "options_toolbar_16": { + "message": "Абнавіць усе ўліковыя запісы", + "description": "" + }, + "options_toolbar_17": { + "message": "Адкрыць асноўны ўліковы запіс Gmail", + "description": "" + }, + "options_misc": { + "message": "Рознае:", + "description": "" + }, + "options_misc_1": { + "message": "Сартаваць уліковыя запісы ў алфавітным парадку", + "description": "" + }, + "options_misc_2": { + "message": "Прадвызначаны парадак - па чарзе ўваходу ва ўліковы запіс.", + "description": "" + }, + "options_misc_3": { + "message": "Колеры значка ў панэлі інструментаў", + "description": "" + }, + "options_misc_4": { + "message": "Шэры - \"Няма непрачытаных\" , сіні - \"Адключаны\"", + "description": "" + }, + "options_misc_5": { + "message": "Сіні - \"Няма непрачытаных\" , шэры - \"Адключаны\"", + "description": "" + }, + "options_misc_9": { + "message": "Чырвоны - \"Няма непрачытаных\" , шэры - \"Адключаны\"", + "description": "" + }, + "options_misc_6": { + "message": "Паказаць апавяшчэнне на працоўным стале, каб папярэдзіць, што Gmail ужо адкрыты ў актыўнай укладцы", + "description": "" + }, + "options_misc_7": { + "message": "Паказваць прывітальную старонку пасля абнаўлення", + "description": "" + }, + "options_misc_8": { + "message": "Скінуць усе налады да завадскіх", + "description": "" + }, + "options_misc_10": { + "message": "Запускаць гукавыя апавяшчэнні і апавяшчэнні на працоўным стале, толькі калі ліст прыйшоў менш чым за (у хвілінах):", + "description": "" + }, + "options_misc_11": { + "message": "Пры заданні нулявога значэння вы не будзеце атрымліваць апавяшчэнні працоўнага стала і гукавыя апавяшчэнні, але значок апавяшчэння вы па ранейшаму будзеце бачыць.", + "description": "" + }, + "options_misc_12": { + "message": "Не ўключаць звесткі аб уліковым запісе ў тэкст усплывальнай падказкі", + "description": "" + }, + "options_misc_13": { + "message": "Прадвызначана Notifier абнаўляе ўсплывальную падказку кнопкі інфармацыяй аб уліковым запісе. Пры знятай пазнацы тэкст усплывальнай падказкі застаецца прадвызначаным.", + "description": "" + }, + "options_misc_14": { + "message": "Не паказваць дакладную лічбу ў значку, калі непрачытаных лістоў больш за 999", + "description": "" + }, + "options_misc_15": { + "message": "Адкрываць ЧаПы пасля абнаўлення", + "description": "" + }, + "options_plugins": { + "message": "Плагіны:", + "description": "" + }, + "options_plugins_1": { + "message": "Кнопка зоркі і ярлыкі Gmail (эксперыментальнае)", + "description": "" + }, + "options_plugins_2": { + "message": "Гэты плагін паказвае кнопку зоркі і ярлыкі размоў у панэлі перадпрагляду (толькі ў разгорнутым рэжыме)", + "description": "" + }, + "options_px": { + "message": "пкс", + "description": "" + }, + "options_empty": { + "message": "не вызначана", + "description": "" + }, + "options_button_test": { + "message": "Прайграць", + "description": "" + }, + "options_button_reset": { + "message": "Скінуць параметры", + "description": "" + }, + "popup_settings": { + "message": "налады", + "description": "" + }, + "popup_of": { + "message": "з", + "description": "" + }, + "popup_wait": { + "message": "Пачакайце...", + "description": "" + }, + "popup_date_format": { + "message": "%mm %dd, %yy", + "description": "" + }, + "popup_no_subject": { + "message": "(без тэмы)", + "description": "" + }, + "popup_open_settings": { + "message": "Адкрыць налады", + "description": "" + }, + "popup_open_inbox": { + "message": "Адкрыць Уваходныя", + "description": "" + }, + "popup_archive": { + "message": "У архіў", + "description": "" + }, + "popup_spam": { + "message": "У спам", + "description": "" + }, + "popup_trash": { + "message": "У сметніцу", + "description": "" + }, + "popup_refresh": { + "message": "Абнавіць", + "description": "" + }, + "popup_read": { + "message": "У прачытанае", + "description": "" + }, + "popup_read_all": { + "message": "Усё ў прачытанае", + "description": "" + }, + "popup_msg_1": { + "message": "толькі што", + "description": "" + }, + "popup_msg_2": { + "message": "1 хвіліну таму", + "description": "" + }, + "popup_msg_3_format": { + "message": "%d хв. таму", + "description": "" + }, + "popup_msg_4": { + "message": "1 гадзіну таму", + "description": "" + }, + "popup_msg_5": { + "message": "гадзін(ы) таму", + "description": "" + }, + "popup_msg_6": { + "message": "Учора", + "description": "" + }, + "popup_msg_7_format": { + "message": "%d дзён таму", + "description": "" + }, + "popup_msg_8_format": { + "message": "%d тыдн. таму", + "description": "" + }, + "popup_msg_9_format": { + "message": "%d мес. таму", + "description": "" + }, + "popup_msg_10": { + "message": "Студзень", + "description": "" + }, + "popup_msg_11": { + "message": "Люты", + "description": "" + }, + "popup_msg_12": { + "message": "Сакавік", + "description": "" + }, + "popup_msg_13": { + "message": "Красавік", + "description": "" + }, + "popup_msg_14": { + "message": "Травень", + "description": "" + }, + "popup_msg_15": { + "message": "Чэрвень", + "description": "" + }, + "popup_msg_16": { + "message": "Ліпень", + "description": "" + }, + "popup_msg_17": { + "message": "Жнівень", + "description": "" + }, + "popup_msg_18": { + "message": "Верасень", + "description": "" + }, + "popup_msg_19": { + "message": "Кастрычнік", + "description": "" + }, + "popup_msg_20": { + "message": "Лістапад", + "description": "" + }, + "popup_msg_21": { + "message": "Снежань", + "description": "" + }, + "settings_open_title": { + "message": "Адкрыць старонку параметраў (налад)", + "description": "" + }, + "settings_open_label": { + "message": "Адкрыць параметры", + "description": "" + }, + "gmail": { + "message": "Notifier for Gmail™", + "description": "" + } +} \ No newline at end of file diff --git a/WebExtension/_locales/bg/messages.json b/v2/_locales/bg/messages.json similarity index 88% rename from WebExtension/_locales/bg/messages.json rename to v2/_locales/bg/messages.json index e1744ae3..08d80db6 100644 --- a/WebExtension/_locales/bg/messages.json +++ b/v2/_locales/bg/messages.json @@ -1,690 +1,758 @@ { - "label_9": { - "message": "За 5 часа", + "toolbar_label": { + "message": "Notifier for Gmail™", "description": "" }, - "options_notifications_19": { - "message": "Оповестяване за поща на Уиндоус", + "tooltip_1": { + "message": "Щракване с ляво копче: Отваряне на пощата или панела за предварителен преглед", "description": "" }, - "options_notifications_17": { - "message": "Камбана", + "tooltip_2": { + "message": "Щракване със средно копче (или Контрол + Ляво): Обновяване на всички сметки", "description": "" }, - "options_notifications_13": { - "message": "Отваряне на панела при щракване върху иконката в лентата на задачите (Само за Уиндоус, в бета)", + "tooltip_3": { + "message": "Щракване с дясно копче: Избор на сметка", "description": "" }, - "options_notifications_30": { - "message": "Обединяване на всички едновременни известия на работния плот в едно известие", + "description": { + "message": "Известител за няколко профила в пощата на Гугъл (Джимейл)", "description": "" }, - "settings_open_label": { - "message": "Отваряне на настройките", + "log_in_to_your_account": { + "message": "Моля, влезте в профила си в пощата на Гугъл", "description": "" }, - "options_timings_l7": { - "message": "Без проверка за нови писма при стартиране (в секунди):", + "msg_1": { + "message": "Подпрозорецът вече е отворен. Натиснете копчето на лентата, за да отворите пощата в нов подпрозорец или да преминете към вече отворен раздел.", "description": "" }, - "label_4": { - "message": "За 5 минути", + "msg_2": { + "message": "Връзката е копирана в буфера.", "description": "" }, - "options_timings_l3": { - "message": "Напомняне за непрочетени писма на всеки (в минути):", + "msg_3": { + "message": "Избраният текст е копиран в буфера.", "description": "" }, - "popup_msg_4": { - "message": "Преди 1 час", + "msg_4": { + "message": "Бележка: За да работи правилно известителя, трябва да сте влезли в профила си в Гугъл.", "description": "" }, - "options_gmail_1": { - "message": "Главна сметка (/mail/u/0/)", + "msg_5": { + "message": "Изберете звуков файл", "description": "" }, - "options_gmail_10": { - "message": "Получаване на известия за следните етикети и сметки:", + "label_1": { + "message": "Обновяване", "description": "" }, - "options_notifications_1": { - "message": "Показване на известия на работния плот за нови писма", + "label_2": { + "message": "Настройки", "description": "" }, - "options_notifications_9": { - "message": "Свирене на звуково оповестяване за нови писма", + "label_3": { + "message": "Изключване на известията", + "description": "" + }, + "label_4": { + "message": "За 5 минути", + "description": "" + }, + "label_5": { + "message": "За 15 минути", "description": "" }, "label_6": { "message": "За 30 минути", "description": "" }, - "options_misc_8": { - "message": "Нулиране на всички настройки към първоначалните", + "label_7": { + "message": "За 1 час", "description": "" }, - "options_notifications_28": { - "message": "Изключване на всички известия за избран период (в минути):", + "label_8": { + "message": "За 2 часа", "description": "" }, - "options_timings_l4": { - "message": "Задайте стойността на нула за непериодични напомняния.", + "label_9": { + "message": "За 5 часа", "description": "" }, - "options_notifications_32": { - "message": "името или писмото съдържа", + "label_13": { + "message": "За избран период", "description": "" }, - "options_tab_6": { - "message": "Отваряне на пощата в нов прозорец", + "label_10": { + "message": "Enable notifications (session)", "description": "" }, - "options_notifications_25": { - "message": "В Сафари първоначалното звуково известяване може да не работи. Ако е така, използвайте потребителски файл.", + "label_11": { + "message": "Писане на писмо", "description": "" }, - "options_toolbar_15": { - "message": "Натискане със средното копче върху лентата", + "label_12": { + "message": "Отваряне на въпросника", "description": "" }, - "options_toolbar_10": { - "message": "Минималната височина е 500 пиксела.", + "label_14": { + "message": "Вписани сметки", "description": "" }, - "popup_msg_10": { - "message": "Януари", + "unknown": { + "message": "неизвестно", "description": "" }, - "options_notifications_26": { - "message": "Винаги да се показват известия в областта за уведомяване (само за Уиндоус)", + "and": { + "message": "и", "description": "" }, - "label_3": { - "message": "Изключване на известията", + "log_into_your_account": { + "message": "Моля, влезте в сметката си", "description": "" }, - "label_13": { - "message": "За избран период", + "notification": { + "message": "От: [author_email][break] Заглавие: [title][break] Обобщение: [summary]", "description": "" }, - "options_empty": { - "message": "не е обозначено", + "options_title": { + "message": "Настройки", "description": "" }, - "options_notifications_3": { - "message": "Тази функция може да не работи на вашата операционна система.", + "options_inshort": { + "message": "Известител за няколко профила в пощата на Гугъл (Джимейл).", + "description": "" + }, + "options_donation": { + "message": "Support Development", "description": "" }, "options_timings": { - "message": "Разписание", + "message": "Timings:", "description": "" }, - "options_gmail_5": { - "message": "Четвърта сметка (/mail/u/3/)", + "options_timings_l1": { + "message": "Проверка за нови писма на всеки (в секунди):", "description": "" }, - "label_5": { - "message": "За 15 минути", + "options_timings_l2": { + "message": "Минималният период е 10 секунди.", "description": "" }, - "options_misc_9": { - "message": "Червен цвят за \"Няма непрочетени\" и сив цвят за \"Няма връзка\"", + "options_timings_l3": { + "message": "Напомняне за непрочетени писма на всеки (в минути):", "description": "" }, - "popup_msg_5": { - "message": "часа назад", + "options_timings_l4": { + "message": "Задайте стойността на нула за непериодични напомняния.", "description": "" }, - "options_notifications_27": { - "message": "Известията в областта за уведомяване ще се показват дори ако няма непрочетени писма.", + "options_timings_l5": { + "message": "Минималният период е 5 минути.", "description": "" }, - "options_misc_1": { - "message": "Подреждане на сметките по азбучен ред", + "options_timings_l6": { + "message": "Ако имате непрочетени писма, стойностите, различни от нула, пускат оповестителен звук и известия на работния плот безкрайно.", "description": "" }, - "tooltip_1": { - "message": "Щракване с ляво копче: Отваряне на пощата или панела за предварителен преглед", + "options_timings_l7": { + "message": "Без проверка за нови писма при стартиране (в секунди):", "description": "" }, - "notification": { - "message": "От: [author_email][break] Заглавие: [title][break] Обобщение: [summary]", + "options_timings_l8": { + "message": "Задайте стойността на нула, за да не се проверява за нови писма до първото ръчно обновяване [Не е налично в Сафари].", "description": "" }, - "popup_trash": { - "message": "Кошче", + "options_gmail": { + "message": "Поща на Гугъл:", "description": "" }, - "options_tab": { - "message": "Отваряне на подпрозорец:", + "options_gmail_1": { + "message": "Главна сметка (/mail/u/0/)", "description": "" }, - "log_into_your_account": { - "message": "Моля, влезте в сметката си", + "options_gmail_2": { + "message": "Разделяйте етикетите със \",\" (запетая).", "description": "" }, - "label_10": { - "message": "Включване на известията", + "options_gmail_3": { + "message": "Втора сметка (/mail/u/1/)", "description": "" }, - "options_notifications_23": { - "message": "Гръмкостта на звуковото оповестяване е", + "options_gmail_4": { + "message": "Трета сметка (/mail/u/2/)", "description": "" }, - "options_timings_l2": { - "message": "Минималният период е 10 секунди.", + "options_gmail_5": { + "message": "Четвърта сметка (/mail/u/3/)", "description": "" }, - "options_toolbar_11": { - "message": "Поддръжка на клавишни комбинации в панела", + "options_gmail_6": { + "message": "Пета сметка (/mail/u/4/)", "description": "" }, - "options_gmail_9": { - "message": "Някои популярни етикети: \"Входяща поща\", \"Важни\", \"^smartlabel_personal\", \"^smartlabel_newsletter\", \"^smartlabel_notification\" и \"^smartlabel_group\"", + "options_gmail_7": { + "message": "Шеста сметка (/mail/u/5/)", "description": "" }, - "popup_msg_17": { - "message": "Август", + "options_gmail_8": { + "message": "Отбелязване на писмото като прочетено при архвиране", "description": "" }, - "popup_msg_15": { - "message": "Юни", + "options_gmail_15": { + "message": "Some popular labels:", "description": "" }, - "options_notifications_34": { - "message": "обобщението на писмото съдържа", + "options_gmail_10": { + "message": "Получаване на известия за следните етикети и сметки:", "description": "" }, - "label_14": { - "message": "Вписани сметки", + "options_gmail_11": { + "message": "Потребителски емисии:", "description": "" }, - "options_misc_13": { - "message": "По подразбиране, известителят обновява подсказките на копчето с входна информация. Ако изчистите отметката, текста в подсказката ще остане на първоначалната стойност.", + "options_gmail_12": { + "message": "Отделяйте емисиите със \",\" (запетая). Примерна емисия: https://mail.google.com/mail/u/0/feed/atom/inbox", "description": "" }, - "options_misc_6": { - "message": "Show desktop notification to warn that Gmail is already opened in the active tab", + "options_gmail_13": { + "message": "Note: maximum number for all labels except \"inbox\" is 20 (Google feeds only supply the 20 newest entries)", "description": "" }, - "popup_read": { - "message": "Отбелязване като прочетено", + "options_gmail_14": { + "message": "Note: for the Notifier to listen for more than 5 accounts, add feeds URLs to the \"Custom feeds\" field. For instance to listen to the 6 and 7th accounts add: https://mail.google.com/mail/u/6/feed/atom/inbox, https://mail.google.com/mail/u/7/feed/atom/inbox", + "description": "" + }, + "options_notifications": { + "message": "Известия:", + "description": "" + }, + "options_notifications_1": { + "message": "Показване на известия на работния плот за нови писма", + "description": "" + }, + "options_notifications_2": { + "message": "Показване на известия на работния плот за (в секунди):", + "description": "" + }, + "options_notifications_3": { + "message": "Тази функция може да не работи на вашата операционна система.", "description": "" }, "options_notifications_4": { "message": "Формат на известията", "description": "" }, - "settings_open_title": { - "message": "Отваряне на страницата с настройките", + "options_notifications_5": { + "message": "Налични променливи:", "description": "" }, - "label_2": { - "message": "Настройки", + "options_notifications_6": { + "message": "Съкращаване на известията, по-дълги от", "description": "" }, - "options_toolbar_14": { - "message": "Ако предпочитате само текст в режима на цяло съдържание, махнете отметката.", + "options_notifications_7": { + "message": "символа за полетата [заглавие] и [обобщение].", "description": "" }, - "options_notifications_18": { - "message": "Звънене", + "options_notifications_8": { + "message": "Ако искате да няма многоточие, използвайте по-голямо число.", "description": "" }, - "options_tab_5": { - "message": "Отваряне на пощата в подпрозорец на заден план", + "options_notifications_9": { + "message": "Свирене на звуково оповестяване за нови писма", "description": "" }, - "label_7": { - "message": "За 1 час", + "options_notifications_10": { + "message": "Бележка за потребителите на Макинтош. От Файърфокс 28.0, всички известия на работния плот ще се управляват от Центъра за известия, което поражда допълнително звуково оповестяване. Трябва да изключите или това оповестяване, или оповестяването в Центъра за известия.", "description": "" }, - "popup_archive": { - "message": "Архив", + "options_notifications_11": { + "message": "Показване на \"Известие в лентата със задачи на Уиндоус\" или \"Известие в лентата на Макинтош\"", "description": "" }, - "msg_2": { - "message": "Връзката е копирана в буфера.", + "options_notifications_12": { + "message": "В момента не се поддържат известия в лентата със задачи под Линукс.", "description": "" }, - "options_title": { - "message": "Настройки", + "options_notifications_13": { + "message": "Отваряне на панела при щракване върху иконката в лентата на задачите (Само за Уиндоус, в бета)", "description": "" }, - "popup_msg_13": { - "message": "Април", + "options_notifications_14": { + "message": "Тази функция е експериментална и може да направи разглеждача Файърфокс нестабилен. [Изисква се повторно пускане].", "description": "" }, - "popup_msg_9_format": { - "message": "Преди %d месец(а)", + "options_notifications_15": { + "message": "Звуковото известие по подразбиране е", "description": "" }, - "popup_msg_11": { - "message": "Февруари", + "options_notifications_16": { + "message": "Оповестяване по подразбиране", "description": "" }, - "popup_open_inbox": { - "message": "Отваряне на входящата кутия", + "options_notifications_17": { + "message": "Камбана", "description": "" }, - "options_tab_9": { - "message": "When unchecked, Gmail Notifier checks either active window or all open windows for open instance of Gmail and switch to the tab when tab opening is requested.", + "options_notifications_18": { + "message": "Звънене", "description": "" }, - "gmail": { - "message": "Известител за пощата на Гугъл", + "options_notifications_19": { + "message": "Оповестяване за поща на Уиндоус", "description": "" }, - "popup_msg_6": { - "message": "Вчера", + "options_notifications_20": { + "message": "Потребителски звук", "description": "" }, - "options_toolbar_8": { - "message": "Минималната ширина е 500 пиксела.", + "options_notifications_21": { + "message": "Потребителският оповестителен звук е", "description": "" }, - "options_notifications_16": { - "message": "Оповестяване по подразбиране", + "options_notifications_22": { + "message": "Ако четецът ви не възпроизвежда потребителския звук, опитайте се да го преобразувате във формат WAV.", "description": "" }, - "options_misc_14": { - "message": "Без показване на точния брой в значката, когато непрочетените писма надхвърлят 999", + "options_notifications_35": { + "message": "За да изберете нов потребителски звук, първо изберете вграден звук и след това променете настройката на потребителски.", "description": "" }, - "popup_msg_18": { - "message": "Септември", + "options_notifications_23": { + "message": "Гръмкостта на звуковото оповестяване е", "description": "" }, - "options_notifications_14": { - "message": "Тази функция е експериментална и може да направи разглеждача Файърфокс нестабилен. [Изисква се повторно пускане].", + "options_notifications_24": { + "message": "Гръмкостта е число между 0 и 100, където 100 е най-високото (по подразбиране).", "description": "" }, - "options_gmail_3": { - "message": "Втора сметка (/mail/u/1/)", + "options_notifications_25": { + "message": "В Сафари първоначалното звуково известяване може да не работи. Ако е така, използвайте потребителски файл.", "description": "" }, - "options_notifications_11": { - "message": "Показване на \"Известие в лентата със задачи на Уиндоус\" или \"Известие в лентата на Макинтош\"", + "options_notifications_26": { + "message": "Винаги да се показват известия в областта за уведомяване (само за Уиндоус)", "description": "" }, - "options_notifications_2": { - "message": "Показване на известия на работния плот за (в секунди):", + "options_notifications_27": { + "message": "Известията в областта за уведомяване ще се показват дори ако няма непрочетени писма.", "description": "" }, - "log_in_to_your_account": { - "message": "Моля, влезте в профила си в пощата на Гугъл", + "options_notifications_28": { + "message": "Изключване на всички известия за избран период (в минути):", "description": "" }, - "popup_of": { - "message": "of", + "options_notifications_29": { + "message": "Тази настройка е свързана с менюто на копчето -> изключване на всички известия -> избран период.", "description": "" }, - "options_notifications_15": { - "message": "Звуковото известие по подразбиране е", + "options_notifications_30": { + "message": "Обединяване на всички едновременни известия на работния плот в едно известие", "description": "" }, - "options_notifications_21": { - "message": "Потребителският оповестителен звук е", + "options_notifications_31": { + "message": "Custom sound notification", "description": "" }, - "options_toolbar_9": { - "message": "Височина на панела в режим на преглед на цялото съдържание (в пиксели):", + "options_notifications_32": { + "message": "name or email contains", "description": "" }, - "options_toolbar_1": { - "message": "Поведение на копчето на лентата", + "options_notifications_33": { + "message": "заглавието на писмото съдържа", "description": "" }, - "unknown": { - "message": "неизвестно", + "options_notifications_34": { + "message": "обобщението на писмото съдържа", "description": "" }, - "popup_msg_21": { - "message": "Декември", + "options_notifications_36": { + "message": "Ask Gmail to prevent 'inbox.google.com' redirection", "description": "" }, - "popup_read_all": { - "message": "Отбелязване на всички като прочетени", + "options_notifications_37": { + "message": "Display Badge number", "description": "" }, - "options_notifications_8": { - "message": "Ако искате да няма многоточие, използвайте по-голямо число.", + "options_notifications_38": { + "message": "Faster actions (mark as read, delete, ...) (Consider actions to be resolved when headers are received)", "description": "" }, - "options_donation": { - "message": "Направете дарение", + "options_notifications_40": { + "message": "Allow quick actions from notification box (maximum two actions) (Chrome only)", "description": "" }, - "msg_3": { - "message": "Избраният текст е копиран в буфера.", + "options_notifications_41": { + "message": "Mark as Read", "description": "" }, - "options_misc_7": { - "message": "Показване на приветстващата страница при надграждане", + "options_notifications_42": { + "message": "Archive", "description": "" }, - "options_gmail": { - "message": "Поща на Гугъл:", + "options_notifications_43": { + "message": "Trash", "description": "" }, - "label_1": { - "message": "Обновяване", + "options_tab": { + "message": "Отваряне на подпрозорец:", "description": "" }, - "options_notifications_5": { - "message": "Налични променливи:", + "options_tab_1": { + "message": "Търсене за отворена сметка само в активния прозорец", "description": "" }, - "options_notifications_24": { - "message": "Гръмкостта е число между 0 и 100, където 100 е най-високото (по подразбиране).", + "options_tab_2": { + "message": "Без търсене в други прозорци за отворени сметки. Ако пощата не е отворена в активния прозорец, да се отвори нов подпрозорец.", "description": "" }, - "options_notifications_10": { - "message": "Бележка за потребителите на Макинтош. От Файърфокс 28.0, всички известия на работния плот ще се управляват от Центъра за известия, което поражда допълнително звуково оповестяване. Трябва да изключите или това оповестяване, или оповестяването в Центъра за известия.", + "options_tab_3": { + "message": "Отваряне на пощата до активния подпрозорец", "description": "" }, - "options_misc_2": { - "message": "По подразбиране се сортира по ред на влизане.", + "options_tab_4": { + "message": "Отваряне на пощата в активния подпрозорец", "description": "" }, - "options_toolbar_2": { - "message": "Винаги да се отваря панел с предварителен преглед", + "options_tab_5": { + "message": "Отваряне на пощата в подпрозорец на заден план", "description": "" }, - "popup_settings": { - "message": "настройки", + "options_tab_6": { + "message": "Отваряне на пощата в нов прозорец", "description": "" }, - "options_gmail_4": { - "message": "Трета сметка (/mail/u/2/)", + "options_tab_7": { + "message": "Винаги да се използват празни подпрозорци вместо да се отваря нов, когато е включено отварянето в подпрозорци", "description": "" }, - "options_toolbar_5": { - "message": "Показване само на обобщение", + "options_tab_8": { + "message": "Пренебрегване на отворените подпрозорци с пощата на Гугъл", "description": "" }, - "options_notifications_12": { - "message": "В момента не се поддържат известия в лентата със задачи под Линукс.", + "options_tab_9": { + "message": "Ако не е отметнато, известителят проверява активния подпрозорец или всички отворени прозорци за отворена поща и превключва на нея при изискване на отварянето на подпрозорец.", "description": "" }, - "options_notifications_35": { - "message": "За да изберете нов потребителски звук, първо изберете вграден звук и след това променете настройката на потребителски.", + "options_tab_10": { + "message": "Open emails in basic HTML mode", "description": "" }, - "msg_1": { - "message": "Подпрозорецът вече е отворен. Натиснете копчето на лентата, за да отворите пощата в нов подпрозорец или да преминете към вече отворен раздел.", + "options_toolbar": { + "message": "Лента:", "description": "" }, - "popup_refresh": { - "message": "Презареждане", + "options_toolbar_1": { + "message": "Поведение на копчето на лентата", + "description": "" + }, + "options_toolbar_2": { + "message": "Винаги да се отваря панел с предварителен преглед", + "description": "" + }, + "options_toolbar_3": { + "message": "Отваряне на пощата ако се използва само една сметка", + "description": "" + }, + "options_toolbar_18": { + "message": "Open Gmail account (forced)", + "description": "" + }, + "options_toolbar_4": { + "message": "Режим на панела", + "description": "" + }, + "options_toolbar_5": { + "message": "Показване само на обобщение", + "description": "" + }, + "options_toolbar_6": { + "message": "Показване на цялото съдържание", + "description": "" + }, + "options_toolbar_7": { + "message": "Ширина на панела в режим на преглед на цялото съдържание (в пиксели):", "description": "" }, - "options_misc_5": { - "message": "Син цвят за \"Няма непрочетени\" и сив цвят за \"Няма връзка\"", + "options_toolbar_8": { + "message": "Минималната ширина е 500 пиксела.", "description": "" }, - "options_timings_l8": { - "message": "Задайте стойността на нула, за да не се проверява за нови писма до първото ръчно обновяване [Не е налично в Сафари].", + "options_toolbar_9": { + "message": "Височина на панела в режим на преглед на цялото съдържание (в пиксели):", "description": "" }, - "popup_msg_19": { - "message": "Октомври", + "options_toolbar_10": { + "message": "Минималната височина е 500 пиксела.", "description": "" }, - "options_notifications_33": { - "message": "заглавието на писмото съдържа", + "options_toolbar_11": { + "message": "Поддръжка на клавишни комбинации в панела", "description": "" }, - "tooltip_3": { - "message": "Щракване с дясно копче: Избор на сметка", + "options_toolbar_12": { + "message": "!: Докладване като спам, #: Кошче, e: Архив, Shift + i: Отбелязване като прочетено.", "description": "" }, - "popup_date_format": { - "message": "%mm %dd, %yy", + "options_toolbar_13": { + "message": "Извеждане на писмата като ЕМХТ (HTML) в режима на цяло съдържание", "description": "" }, - "options_notifications": { - "message": "Известия:", + "options_toolbar_14": { + "message": "Ако предпочитате само текст в режима на цяло съдържание, махнете отметката.", "description": "" }, - "options_timings_l6": { - "message": "Ако имате непрочетени писма, стойностите, различни от нула, пускат оповестителен звук и известия на работния плот безкрайно.", + "options_toolbar_15": { + "message": "Натискане със средното копче върху лентата", "description": "" }, - "popup_msg_12": { - "message": "Март", + "options_toolbar_16": { + "message": "Обновяване на всички сметки", "description": "" }, - "options_notifications_22": { - "message": "Ако четецът ви не възпроизвежда потребителския звук, опитайте се да го преобразувате във формат WAV.", + "options_toolbar_17": { + "message": "Отваряне на главната сметка", "description": "" }, - "options_tab_1": { - "message": "Търсене за отворена сметка само в активния прозорец", + "options_misc": { + "message": "Разни:", "description": "" }, - "popup_msg_7_format": { - "message": "Преди %d дена", + "options_misc_1": { + "message": "Подреждане на сметките по азбучен ред", "description": "" }, - "options_timings_l1": { - "message": "Проверка за нови писма на всеки (в секунди):", + "options_misc_2": { + "message": "По подразбиране се сортира по ред на влизане.", "description": "" }, - "options_toolbar_4": { - "message": "Режим на панела", + "options_misc_3": { + "message": "Цвят на иконката на лентата", "description": "" }, - "toolbar_label": { - "message": "Известител за пощата на Гугъл", + "options_misc_4": { + "message": "Сив цвят за \"Няма непрочетени\" и син цвят за \"Няма връзка\"", "description": "" }, - "popup_msg_1": { - "message": "Току-що", + "options_misc_5": { + "message": "Син цвят за \"Няма непрочетени\" и сив цвят за \"Няма връзка\"", "description": "" }, - "popup_open_settings": { - "message": "Отваряне на настройките", + "options_misc_9": { + "message": "Червен цвят за \"Няма непрочетени\" и сив цвят за \"Няма връзка\"", "description": "" }, - "options_misc_3": { - "message": "Цвят на иконката на лентата", + "options_misc_6": { + "message": "Показване на известия на работния плот, които указват дали пощата е отворена в активния подпрозорец", "description": "" }, - "options_gmail_12": { - "message": "Отделяйте емисиите със \",\" (запетая). Примерна емисия: https://mail.google.com/mail/u/0/feed/atom/inbox", + "options_misc_7": { + "message": "Показване на приветстващата страница при надграждане", "description": "" }, - "options_toolbar_12": { - "message": "!: Докладване като спам, #: Кошче, e: Архив, Shift + i: Отбелязване като прочетено.", + "options_misc_8": { + "message": "Нулиране на всички настройки към първоначалните", "description": "" }, - "options_px": { - "message": "px", + "options_misc_10": { + "message": "Да се появяват известия на работния плот и звукови оповестявания само за писма, пристигнали по-рано от (в минути):", "description": "" }, "options_misc_11": { "message": "Ако стойността се зададе на нула, няма да получавате нито звукови оповестявания, нито известия на работния плот. Ще работи само значката за известия.", "description": "" }, - "options_notifications_20": { - "message": "Потребителски звук", + "options_misc_12": { + "message": "Без входни детайли в подсказките", "description": "" }, - "and": { - "message": "и", + "options_misc_13": { + "message": "По подразбиране, известителят обновява подсказките на копчето с входна информация. Ако изчистите отметката, текста в подсказката ще остане на първоначалната стойност.", "description": "" }, - "options_tab_7": { - "message": "Винаги да се използват празни подпрозорци вместо да се отваря нов, когато е включено отварянето в подпрозорци", + "options_misc_14": { + "message": "Без показване на точния брой в значката, когато непрочетените писма надхвърлят 999", "description": "" }, - "options_toolbar_3": { - "message": "Отваряне на пощата ако се използва само една сметка", + "options_misc_15": { + "message": "Open FAQs page on updates", "description": "" }, - "options_gmail_7": { - "message": "Шеста сметка (/mail/u/5/)", + "options_plugins": { + "message": "Plug-ins:", "description": "" }, - "popup_msg_8_format": { - "message": "Преди %d седмица(и)", + "options_plugins_1": { + "message": "Gmail labels and star button (experimental)", "description": "" }, - "options_toolbar": { - "message": "Лента:", + "options_plugins_2": { + "message": "This plugin displays the star button as well as thread's labels in the popup (expanded mode only).", "description": "" }, - "options_notifications_6": { - "message": "Съкращаване на известията, по-дълги от", + "options_px": { + "message": "px", "description": "" }, - "popup_wait": { - "message": "Изчакайте...", + "options_empty": { + "message": "не е обозначено", "description": "" }, - "tooltip_2": { - "message": "Щракване със средно копче (или Контрол + Ляво): Обновяване на всички сметки", + "options_button_test": { + "message": "Play", "description": "" }, - "options_notifications_29": { - "message": "Тази настройка е свързана с менюто на копчето -> изключване на всички известия -> избран период.", + "options_button_reset": { + "message": "Reset Preferences", "description": "" }, - "options_tab_3": { - "message": "Отваряне на пощата до активния подпрозорец", + "popup_settings": { + "message": "настройки", "description": "" }, - "options_gmail_8": { - "message": "Отбелязване на писмото като прочетено при архвиране", + "popup_of": { + "message": "of", "description": "" }, - "options_toolbar_17": { - "message": "Отваряне на главната сметка", + "popup_wait": { + "message": "Изчакайте...", "description": "" }, - "options_notifications_7": { - "message": "символа за полетата [заглавие] и [обобщение].", + "popup_date_format": { + "message": "%mm %dd, %yy", "description": "" }, - "options_misc_10": { - "message": "Да се появяват известия на работния плот и звукови оповестявания само за писма, пристигнали по-рано от (в минути):", + "popup_no_subject": { + "message": "(няма тема)", "description": "" }, - "options_tab_8": { - "message": "Ignore opened Gmail tabs", + "popup_open_settings": { + "message": "Отваряне на настройките", "description": "" }, - "popup_no_subject": { - "message": "(няма тема)", + "popup_open_inbox": { + "message": "Отваряне на входящата кутия", "description": "" }, - "msg_5": { - "message": "Изберете звуков файл", + "popup_archive": { + "message": "Архив", "description": "" }, - "popup_msg_2": { - "message": "Преди 1 минута", + "popup_spam": { + "message": "Спам", "description": "" }, - "popup_msg_16": { - "message": "Юли", + "popup_trash": { + "message": "Кошче", "description": "" }, - "label_8": { - "message": "За 2 часа", + "popup_refresh": { + "message": "Презареждане", "description": "" }, - "msg_4": { - "message": "Бележка: За да работи правилно известителя, трябва да сте влезли в профила си в Гугъл.", + "popup_read": { + "message": "Отбелязване като прочетено", "description": "" }, - "popup_msg_20": { - "message": "Ноември", + "popup_read_all": { + "message": "Отбелязване на всички като прочетени", "description": "" }, - "options_toolbar_6": { - "message": "Показване на цялото съдържание", + "popup_msg_1": { + "message": "Току-що", "description": "" }, - "options_gmail_11": { - "message": "Потребителски емисии:", + "popup_msg_2": { + "message": "Преди 1 минута", "description": "" }, - "options_tab_2": { - "message": "Без търсене в други прозорци за отворени сметки. Ако пощата не е отворена в активния прозорец, да се отвори нов подпрозорец.", + "popup_msg_3_format": { + "message": "Преди %d минути", "description": "" }, - "label_11": { - "message": "Писане на писмо", + "popup_msg_4": { + "message": "Преди 1 час", "description": "" }, - "options_toolbar_7": { - "message": "Ширина на панела в режим на преглед на цялото съдържание (в пиксели):", + "popup_msg_5": { + "message": "часа назад", "description": "" }, - "options_notifications_31": { - "message": "Звуково известие по избор", + "popup_msg_6": { + "message": "Вчера", "description": "" }, - "options_timings_l5": { - "message": "Минималният период е 5 минути.", + "popup_msg_7_format": { + "message": "Преди %d дена", "description": "" }, - "options_misc": { - "message": "Разни:", + "popup_msg_8_format": { + "message": "Преди %d седмица(и)", "description": "" }, - "options_gmail_2": { - "message": "Разделяйте етикетите със \",\" (запетая).", + "popup_msg_9_format": { + "message": "Преди %d месец(а)", "description": "" }, - "options_misc_4": { - "message": "Сив цвят за \"Няма непрочетени\" и син цвят за \"Няма връзка\"", + "popup_msg_10": { + "message": "Януари", "description": "" }, - "options_toolbar_13": { - "message": "Извеждане на писмата като ЕМХТ (HTML) в режима на цяло съдържание", + "popup_msg_11": { + "message": "Февруари", "description": "" }, - "options_toolbar_16": { - "message": "Обновяване на всички сметки", + "popup_msg_12": { + "message": "Март", "description": "" }, - "options_gmail_6": { - "message": "Пета сметка (/mail/u/4/)", + "popup_msg_13": { + "message": "Април", "description": "" }, "popup_msg_14": { "message": "Май", "description": "" }, - "options_inshort": { - "message": "Известител за няколко профила в пощата на Гугъл (Джимейл).", + "popup_msg_15": { + "message": "Юни", "description": "" }, - "options_misc_12": { - "message": "Без входни детайли в подсказките", + "popup_msg_16": { + "message": "Юли", "description": "" }, - "options_tab_4": { - "message": "Отваряне на пощата в активния подпрозорец", + "popup_msg_17": { + "message": "Август", "description": "" }, - "popup_msg_3_format": { - "message": "Преди %d минути", + "popup_msg_18": { + "message": "Септември", "description": "" }, - "label_12": { - "message": "Отваряне на въпросника", + "popup_msg_19": { + "message": "Октомври", "description": "" }, - "description": { - "message": "Известител за няколко профила в пощата на Гугъл (Джимейл)", + "popup_msg_20": { + "message": "Ноември", "description": "" }, - "popup_spam": { - "message": "Спам", + "popup_msg_21": { + "message": "Декември", + "description": "" + }, + "settings_open_title": { + "message": "Отваряне на страницата с настройките", + "description": "" + }, + "settings_open_label": { + "message": "Отваряне на настройките", + "description": "" + }, + "gmail": { + "message": "Notifier for Gmail™", "description": "" } } \ No newline at end of file diff --git a/v2/_locales/ca/messages.json b/v2/_locales/ca/messages.json new file mode 100644 index 00000000..8a1e1eac --- /dev/null +++ b/v2/_locales/ca/messages.json @@ -0,0 +1,762 @@ +{ + "toolbar_label": { + "message": "Notificador per a Gmail™", + "description": "" + }, + "tooltip_1": { + "message": "Clic esquerre: Obre Gmail o el tauler de previsualització del correu", + "description": "" + }, + "tooltip_2": { + "message": "Clic del mig (o Control+Clic esquerre): Actualitza tots els comptes", + "description": "" + }, + "tooltip_3": { + "message": "Clic dret: seleccions de compte", + "description": "" + }, + "description": { + "message": "Notificador d'etiquetes i comptes múltiples per a Google Mail (Gmail)", + "description": "" + }, + "log_in_to_your_account": { + "message": "Si us plau, accedeix al teu compte de Gmail", + "description": "" + }, + "msg_1": { + "message": "La pestanya ja s'ha obert. Fes clic al botó de la barra d'eines per obrir Gmail en una nova pestanya o selecciona una pestanya de Gmail existent.", + "description": "" + }, + "msg_2": { + "message": "S'ha copiat l'enllaç al porta-retalls.", + "description": "" + }, + "msg_3": { + "message": "S'ha copiat el text seleccionat al porta-retalls.", + "description": "" + }, + "msg_4": { + "message": "Nota: per tal que el notificador funcioni correctament, cal estar connectat al compte de Google.", + "description": "" + }, + "msg_5": { + "message": "Selecciona un fitxer de so", + "description": "" + }, + "label_1": { + "message": "Actualitza", + "description": "" + }, + "label_2": { + "message": "Opcions", + "description": "" + }, + "label_3": { + "message": "Deshabilitar totes les notificacions", + "description": "" + }, + "label_4": { + "message": "Durant 5 minuts", + "description": "" + }, + "label_5": { + "message": "Durant 15 minuts", + "description": "" + }, + "label_6": { + "message": "Durant 30 minuts", + "description": "" + }, + "label_7": { + "message": "Durant 1 hora", + "description": "" + }, + "label_8": { + "message": "Durant 2 hores", + "description": "" + }, + "label_9": { + "message": "Durant 5 hores", + "description": "" + }, + "label_13": { + "message": "Durant un període de temps personalitzat", + "description": "" + }, + "label_10": { + "message": "Habilitar notificacions (sessió)", + "description": "" + }, + "label_11": { + "message": "Redacta un correu electrònic", + "description": "" + }, + "label_12": { + "message": "Obrir PMFs", + "description": "" + }, + "label_14": { + "message": "Comptes connectats", + "description": "" + }, + "unknown": { + "message": "desconegut", + "description": "" + }, + "and": { + "message": "i", + "description": "" + }, + "log_into_your_account": { + "message": "Si us plau, connecta't al compte", + "description": "" + }, + "notification": { + "message": "De: [author_email][break]Títol: [title][break]Contingut: [summary]", + "description": "" + }, + "options_title": { + "message": "Opcions - Gmail™ Notifier", + "description": "" + }, + "options_inshort": { + "message": "Notificador d'etiquetes i comptes múltiples per a Google Mail (Gmail).", + "description": "" + }, + "options_donation": { + "message": "Dona suport al desenvolupament", + "description": "" + }, + "options_timings": { + "message": "Temporitzadors:", + "description": "" + }, + "options_timings_l1": { + "message": "Comprova nous correus electrònics cada (en segons):", + "description": "" + }, + "options_timings_l2": { + "message": "El període mínim són 10 segons.", + "description": "" + }, + "options_timings_l3": { + "message": "Recorda tots els correus electrònics sense llegir cada (en minuts):", + "description": "" + }, + "options_timings_l4": { + "message": "Estableix el valor a zero per a recordatoris no periòdics.", + "description": "" + }, + "options_timings_l5": { + "message": "El període mínim són 5 minuts.", + "description": "" + }, + "options_timings_l6": { + "message": "Els valors diferents de zero dispararan notificacions d'escriptori i alertes sonores (semblants a l'arribada d'un nou correu electrònic) eternament si té correus electrònics sense llegir.", + "description": "" + }, + "options_timings_l7": { + "message": "No comprovar nous correus electrònics en obrir durant (en segons):", + "description": "" + }, + "options_timings_l8": { + "message": "Estableix el valor a zero per no comprovar els correus electrònics fins a la primera actualització manual (No disponible a Safari].", + "description": "" + }, + "options_gmail": { + "message": "Gmail:", + "description": "" + }, + "options_gmail_1": { + "message": "Compte principal (/mail/u/0/)", + "description": "" + }, + "options_gmail_2": { + "message": "Separa les etiquetes amb \",\" (coma).", + "description": "" + }, + "options_gmail_3": { + "message": "Compte secundari (/mail/u/1)", + "description": "" + }, + "options_gmail_4": { + "message": "Compte terciari (/mail/u/2/)", + "description": "" + }, + "options_gmail_5": { + "message": "Compte quaternari (/mail/u/3/)", + "description": "" + }, + "options_gmail_6": { + "message": "Compte quinari (/mail/u/4/)", + "description": "" + }, + "options_gmail_7": { + "message": "Compte senari (/mail/u/5/)", + "description": "" + }, + "options_gmail_8": { + "message": "Marca el missatge com a llegit en el moment d'arxivar-lo", + "description": "" + }, + "options_gmail_15": { + "message": "Algunes etiquetes populars:", + "description": "" + }, + "options_gmail_10": { + "message": "Rebre notificacions per a les següents etiquetes i comptes:", + "description": "" + }, + "options_gmail_11": { + "message": "Canals personalitzats", + "description": "" + }, + "options_gmail_12": { + "message": "Separa els canals amb \",\" (coma). Canal d'exemple: https://mail.google.com/mail/u/0/feed/atom/inbox", + "description": "" + }, + "options_gmail_13": { + "message": "Nota: el número màxim per a totes les etiquetes excepte \"safata d'entrada\" és 20 (Google només dona la informació per a les 20 entrades més recents)", + "description": "" + }, + "options_gmail_14": { + "message": "Nota: per tal que el Notificador comprovi més de 5 comptes, afegeix-ne les adreces al camp \"Canals personalitzats\". Per exemple, per comprovar els comptes sisè i setè, afegeix: https://mail.google.com/mail/u/6/feed/atom/inbox, https://mail.google.com/mail/u/7/feed/atom/inbox", + "description": "" + }, + "options_notifications": { + "message": "Notificacions:", + "description": "" + }, + "options_notifications_1": { + "message": "Mostra notificacions d'escriptori per a nous correus electrònics", + "description": "" + }, + "options_notifications_2": { + "message": "Mostra notificacions d'escriptori durant (en segons):", + "description": "" + }, + "options_notifications_3": { + "message": "Aquesta opció podria no funcionar segons el sistema operatiu.", + "description": "" + }, + "options_notifications_4": { + "message": "Format de la notificació", + "description": "" + }, + "options_notifications_5": { + "message": "Variables disponibles:", + "description": "" + }, + "options_notifications_6": { + "message": "Talla les notificacions més llargues de", + "description": "" + }, + "options_notifications_7": { + "message": "caràcters per als camps [title] i [summary].", + "description": "" + }, + "options_notifications_8": { + "message": "Per no tenir truncament de l'el·lipsi, utilitza un número gran.", + "description": "" + }, + "options_notifications_9": { + "message": "Reprodueix el so d'alerta per a nous correus electrònics", + "description": "" + }, + "options_notifications_10": { + "message": "Nota per a usuaris de Mac. Des de Firefox 28.0, totes les notificacions d'escriptori es gestionen des del Centre de Notificacions de Mac, el qual genera un so d'alerta addicional. Cal desactivar aquesta notificació sonora o bé la generada pel Centre de Notificacions.", + "description": "" + }, + "options_notifications_11": { + "message": "Mostra \"Notificació a la barra de Windows\" o \"Notificació a la barra de Mac OS\"", + "description": "" + }, + "options_notifications_12": { + "message": "Les notificacions a la barra de tasques no estan suportades en sistemes operatius Linux actualment.", + "description": "" + }, + "options_notifications_13": { + "message": "Obre el tauler d'eines en fer clic a la icona de notificació de la barra de tasques (només a Windows, beta)", + "description": "" + }, + "options_notifications_14": { + "message": "Aquesta funcionalitat és altament experimental i pot fer que el navegador Firefox esdevingui inestable. [Cal reiniciar].", + "description": "" + }, + "options_notifications_15": { + "message": "El so de notificació per defecte és", + "description": "" + }, + "options_notifications_16": { + "message": "Alerta per defecte de Gmail Notifier", + "description": "" + }, + "options_notifications_17": { + "message": "Campana d'alerta de Checker Plus", + "description": "" + }, + "options_notifications_18": { + "message": "So d'alerta de Checker Plus", + "description": "" + }, + "options_notifications_19": { + "message": "Alerta de correu electrònic de Windows", + "description": "" + }, + "options_notifications_20": { + "message": "So definit per l'usuari", + "description": "" + }, + "options_notifications_21": { + "message": "El so de notificació definit per l'usuari és", + "description": "" + }, + "options_notifications_22": { + "message": "Si el navegador no reprodueix el so de notificació personalitzat, intenta convertir-lo a format WAV senzill utilitzant una eina de conversió en línia.", + "description": "" + }, + "options_notifications_35": { + "message": "Per seleccionar un nou so personalitzat, primer selecciona un so predefinit i després canvia l'opció a so personalitzat", + "description": "" + }, + "options_notifications_23": { + "message": "El volum de la notificació sonar és", + "description": "" + }, + "options_notifications_24": { + "message": "El volum és un número entre 0 i 100, on 100 és el volum més alt (per defecte).", + "description": "" + }, + "options_notifications_25": { + "message": "A Safari, el més probable és que les notificacions sonores per defecte no es reprodueixin. Si és el cas, utilitza un fitxer de so personalitzat.", + "description": "" + }, + "options_notifications_26": { + "message": "Sempre mostra la notificació de safata (només Windows)", + "description": "" + }, + "options_notifications_27": { + "message": "Les notificacions de safata es mostraran encara que no hi hagi missatges sense llegir.", + "description": "" + }, + "options_notifications_28": { + "message": "Deshabilitar totes les notificacions durant un període de temps personalitzat (en minuts):", + "description": "" + }, + "options_notifications_29": { + "message": "Aquesta opció està relacionada amb el menú de clic dret al botó de la barra d'eines -> deshabilitar totes les notificacions -> període de temps personalitzat.", + "description": "" + }, + "options_notifications_30": { + "message": "Combina totes les notificacions d'escriptori simultànies en una única notificació", + "description": "" + }, + "options_notifications_31": { + "message": "Notificació sonora personalitzada", + "description": "" + }, + "options_notifications_32": { + "message": "el nom o l'adreça de correu contenen", + "description": "" + }, + "options_notifications_33": { + "message": "el títol conté", + "description": "" + }, + "options_notifications_34": { + "message": "el missatge conté", + "description": "" + }, + "options_notifications_36": { + "message": "Demana a Gmail evitar la redirecció a 'inbox.google.com'", + "description": "" + }, + "options_notifications_37": { + "message": "Mostra la insígnia amb el número", + "description": "" + }, + "options_notifications_38": { + "message": "Les accions més ràpides (marcar com a llegit, esborrar, ...) (Considera que les accions es faran en rebre les capçaleres)", + "description": "" + }, + "options_notifications_40": { + "message": "Permetre accions ràpides des de l'àrea de notificació (màxim dues accions) (només Chrome)", + "description": "" + }, + "options_notifications_41": { + "message": "Marca com a llegit", + "description": "" + }, + "options_notifications_42": { + "message": "Arxiva", + "description": "" + }, + "options_notifications_43": { + "message": "Paperera", + "description": "" + }, + "options_tab": { + "message": "Obertura de pestanya:", + "description": "" + }, + "options_tab_1": { + "message": "Cerca comptes de Gmail oberts només a la finestra activa", + "description": "" + }, + "options_tab_2": { + "message": "No cerquis comptes de Gmail oberts en altres finestres del navegador. Si Gmail no està obert a la finestra activa, obre una nova pestanya.", + "description": "" + }, + "options_tab_3": { + "message": "Obre un nou compte de Gmail després de la pestanya activa", + "description": "" + }, + "options_tab_4": { + "message": "Obre el compte de Gmail a la pestanya activa", + "description": "" + }, + "options_tab_5": { + "message": "Obre el compte de Gmail en una pestanya a part", + "description": "" + }, + "options_tab_6": { + "message": "Obre el compte de Gmail en una nova finestra", + "description": "" + }, + "options_tab_7": { + "message": "Utilitza sempre pestanyes en blanc enlloc d'obrir una nova pestanya quan s'activi l'opció d'obrir en una pestanya", + "description": "" + }, + "options_tab_8": { + "message": "Ignora les pestanyes obertes amb Gmail", + "description": "" + }, + "options_tab_9": { + "message": "Si està desmarcat, Gmail Notifier comprova si hi ha Gmail obert a qualsevol finestra oberta i activarà la pestsanya si s'ha sol·licitat obrir-ne.", + "description": "" + }, + "options_tab_10": { + "message": "Obre correus electrònics en mode HTML bàsic", + "description": "" + }, + "options_tab_11": { + "message": "Obre el correu electrònic sense llegir més recent enlloc d'obrir la safata d'entrada", + "description": "" + }, + "options_toolbar": { + "message": "Barra d'eines:", + "description": "" + }, + "options_toolbar_1": { + "message": "Comportament del botó de la barra d'eines", + "description": "" + }, + "options_toolbar_2": { + "message": "Obre sempre el tauler de previsualització", + "description": "" + }, + "options_toolbar_3": { + "message": "Obre el compte de Gmail si només s'ha connectat un compte", + "description": "" + }, + "options_toolbar_18": { + "message": "Obre el compte de Gmail (forçat)", + "description": "" + }, + "options_toolbar_4": { + "message": "Mode del tauler d'eines", + "description": "" + }, + "options_toolbar_5": { + "message": "Mostra només el missatge", + "description": "" + }, + "options_toolbar_6": { + "message": "Mostra tot el contingut", + "description": "" + }, + "options_toolbar_7": { + "message": "L'amplada del tauler d'eines amb tot el contingut és (en píxels):", + "description": "" + }, + "options_toolbar_8": { + "message": "L'amplada mínima és de 500px.", + "description": "" + }, + "options_toolbar_9": { + "message": "L'alçada del tauler d'eines amb tot el contingut és (en píxels):", + "description": "" + }, + "options_toolbar_10": { + "message": "L'alçada mínima és de 500px.", + "description": "" + }, + "options_toolbar_11": { + "message": "Permet dreceres de teclat al tauler d'eines", + "description": "" + }, + "options_toolbar_12": { + "message": "!: Marca com a brossa, #: Paperera, e: Arxiva, Majúscules + i: Marca com a llegit.", + "description": "" + }, + "options_toolbar_13": { + "message": "Mostra els correus electrònics com a HTML en mode de contingut sencer", + "description": "" + }, + "options_toolbar_14": { + "message": "Desmarca aquesta opció per mostrar el contingut sencer només amb text.", + "description": "" + }, + "options_toolbar_15": { + "message": "Clic del mig al botó de la barra d'eines per a", + "description": "" + }, + "options_toolbar_16": { + "message": "Actualitza tots els comptes", + "description": "" + }, + "options_toolbar_17": { + "message": "Obre el compte de Gmail principal", + "description": "" + }, + "options_misc": { + "message": "Diversos:", + "description": "" + }, + "options_misc_1": { + "message": "Ordena els comptes alfabèticament", + "description": "" + }, + "options_misc_2": { + "message": "El tipus d'ordre per defecte és l'ordre de connexió.", + "description": "" + }, + "options_misc_3": { + "message": "El patró de color de la barra d'eines és", + "description": "" + }, + "options_misc_4": { + "message": "Color gris per a \"No hi ha missatges sense llegir\" i color blau per a \"Desconnectat\"", + "description": "" + }, + "options_misc_5": { + "message": "Color blau per a \"No hi ha missatges sense llegir\" i color gris per a \"Desconnectat\"", + "description": "" + }, + "options_misc_9": { + "message": "Color vermell per a \"No hi ha missatges sense llegir\" i color gris per a \"Desconnectat\"", + "description": "" + }, + "options_misc_6": { + "message": "Mostra notificacions d'escriptori per avisar que Gmail ja està obert a la pestanya activa", + "description": "" + }, + "options_misc_7": { + "message": "Mostra la pàgina de benvinguda en actualitzar", + "description": "" + }, + "options_misc_8": { + "message": "Restableix les opcions de fàbrica", + "description": "" + }, + "options_misc_10": { + "message": "Només dispara notificacions d'escriptori i sonores quan un correu electrònic hagi arribat fa menys de (en minuts):", + "description": "" + }, + "options_misc_11": { + "message": "Establint aquesta opció a zero no es generarà cap notificació d'escriptori o sonora. Malgrat tot, sí apareixerà la insígnia.", + "description": "" + }, + "options_misc_12": { + "message": "No incloure informació d'accés al text de l'indicador de funció", + "description": "" + }, + "options_misc_13": { + "message": "Per defecte, el notificador actualitza el text de l'indicador de funció amb informació d'accés. Desmarcant aquesta opció, el text mantindrà el valor per defecte.", + "description": "" + }, + "options_misc_14": { + "message": "No mostrar a la insígnia el número exacte de correus electrònics sense llegir si és més gran que 999", + "description": "" + }, + "options_misc_15": { + "message": "Obre la pàgina de PMFs després d'actualitzar", + "description": "" + }, + "options_plugins": { + "message": "Extensions:", + "description": "" + }, + "options_plugins_1": { + "message": "Etiquetes i botó estrella de Gmail (experimental)", + "description": "" + }, + "options_plugins_2": { + "message": "Aquesta extensió mostra el botó estrella, així com les etiquets del fil a la finestra emergent (només en mode estès).", + "description": "" + }, + "options_px": { + "message": "px", + "description": "" + }, + "options_empty": { + "message": "no definit", + "description": "" + }, + "options_button_test": { + "message": "Reprodueix", + "description": "" + }, + "options_button_reset": { + "message": "Restableix les opcions", + "description": "" + }, + "popup_settings": { + "message": "opcions", + "description": "" + }, + "popup_of": { + "message": "de", + "description": "" + }, + "popup_wait": { + "message": "Espera...", + "description": "" + }, + "popup_date_format": { + "message": "%mm %dd, %yy", + "description": "" + }, + "popup_no_subject": { + "message": "(sense títol)", + "description": "" + }, + "popup_open_settings": { + "message": "Obre les opcions", + "description": "" + }, + "popup_open_inbox": { + "message": "Obre la safata d'entrada", + "description": "" + }, + "popup_archive": { + "message": "Arxiva", + "description": "" + }, + "popup_spam": { + "message": "Brossa", + "description": "" + }, + "popup_trash": { + "message": "Paperera", + "description": "" + }, + "popup_refresh": { + "message": "Actualitza", + "description": "" + }, + "popup_read": { + "message": "Marca com a llegit", + "description": "" + }, + "popup_read_all": { + "message": "Marca'ls tots com a no llegits", + "description": "" + }, + "popup_msg_1": { + "message": "ara mateix", + "description": "" + }, + "popup_msg_2": { + "message": "Fa 1 minut", + "description": "" + }, + "popup_msg_3_format": { + "message": "Fa %d minuts", + "description": "" + }, + "popup_msg_4": { + "message": "Fa 1 hora", + "description": "" + }, + "popup_msg_5": { + "message": "hores", + "description": "" + }, + "popup_msg_6": { + "message": "Ahir", + "description": "" + }, + "popup_msg_7_format": { + "message": "Fa %d dies", + "description": "" + }, + "popup_msg_8_format": { + "message": "Fa %d setmanes", + "description": "" + }, + "popup_msg_9_format": { + "message": "Fa %d mesos", + "description": "" + }, + "popup_msg_10": { + "message": "Gener", + "description": "" + }, + "popup_msg_11": { + "message": "Febrer", + "description": "" + }, + "popup_msg_12": { + "message": "Març", + "description": "" + }, + "popup_msg_13": { + "message": "Abril", + "description": "" + }, + "popup_msg_14": { + "message": "Maig", + "description": "" + }, + "popup_msg_15": { + "message": "Juny", + "description": "" + }, + "popup_msg_16": { + "message": "Juliol", + "description": "" + }, + "popup_msg_17": { + "message": "Agost", + "description": "" + }, + "popup_msg_18": { + "message": "Setembre", + "description": "" + }, + "popup_msg_19": { + "message": "Octubre", + "description": "" + }, + "popup_msg_20": { + "message": "Novembre", + "description": "" + }, + "popup_msg_21": { + "message": "Desembre", + "description": "" + }, + "settings_open_title": { + "message": "Obre la pàgina d'opcions", + "description": "" + }, + "settings_open_label": { + "message": "Obre les opcions", + "description": "" + }, + "gmail": { + "message": "Notificador per a Gmail™", + "description": "" + } +} \ No newline at end of file diff --git a/v2/_locales/de/messages.json b/v2/_locales/de/messages.json new file mode 100644 index 00000000..b1aa5081 --- /dev/null +++ b/v2/_locales/de/messages.json @@ -0,0 +1,758 @@ +{ + "toolbar_label": { + "message": "Notifier für Gmail™", + "description": "" + }, + "tooltip_1": { + "message": "Linksklick: Öffne Gmail oder das Mail-Vorschau-Panel", + "description": "" + }, + "tooltip_2": { + "message": "Mittel- (oder Strg+Links) Klick: Alle Konten aktualisieren", + "description": "" + }, + "tooltip_3": { + "message": "Rechtsklick: Kontoauswahl", + "description": "" + }, + "description": { + "message": "Mehrere Label- und Account-Benachrichtigungen für Google Mail (Gmail)", + "description": "" + }, + "log_in_to_your_account": { + "message": "Bitte im Gmail-Konto anmelden", + "description": "" + }, + "msg_1": { + "message": "Der Tab ist bereits geöffnet. Klicke auf die Schaltfläche in der Symbolleiste, um Gmail in einem neuen Tab zu öffnen oder zu einem vorhandenen Gmail-Tab zu wechseln.", + "description": "" + }, + "msg_2": { + "message": "Der Link wird in die Zwischenablage kopiert.", + "description": "" + }, + "msg_3": { + "message": "Der ausgewählte Text wird in die Zwischenablage kopiert.", + "description": "" + }, + "msg_4": { + "message": "Hinweis: Damit der Notifier ordnungsgemäß funktioniert, muss man im Google-Konto angemeldet sein.", + "description": "" + }, + "msg_5": { + "message": "Wähle eine Audiodatei aus.", + "description": "" + }, + "label_1": { + "message": "Aktualisieren", + "description": "" + }, + "label_2": { + "message": "Einstellungen", + "description": "" + }, + "label_3": { + "message": "Alle Benachrichtigungen deaktivieren", + "description": "" + }, + "label_4": { + "message": "Für 5 Minuten", + "description": "" + }, + "label_5": { + "message": "Für 15 Minuten", + "description": "" + }, + "label_6": { + "message": "Für 30 Minuten", + "description": "" + }, + "label_7": { + "message": "Für 1 Stunde", + "description": "" + }, + "label_8": { + "message": "Für 2 Stunden", + "description": "" + }, + "label_9": { + "message": "Für 5 Stunden", + "description": "" + }, + "label_13": { + "message": "Für einen benutzerdefinierten Zeitraum", + "description": "" + }, + "label_10": { + "message": "Benachrichtigungen aktivieren (Sitzung)", + "description": "" + }, + "label_11": { + "message": "E-Mail verfassen", + "description": "" + }, + "label_12": { + "message": "FAQ's öffnen", + "description": "" + }, + "label_14": { + "message": "Angemeldete Konten", + "description": "" + }, + "unknown": { + "message": "unbekannt", + "description": "" + }, + "and": { + "message": "und", + "description": "" + }, + "log_into_your_account": { + "message": "Bitte im Account einloggen", + "description": "" + }, + "notification": { + "message": "Von: [author_email][break]Titel: [title][break]Auszug: [summary]", + "description": "" + }, + "options_title": { + "message": "Optionen - Gmail™ Notifier", + "description": "" + }, + "options_inshort": { + "message": "Mehrere Label- und Account-Benachrichtigungen für Google Mail (Gmail).", + "description": "" + }, + "options_donation": { + "message": "Entwicklung unterstützen", + "description": "" + }, + "options_timings": { + "message": "Zeiten:", + "description": "" + }, + "options_timings_l1": { + "message": "Überprüfe auf neuen E-Mails alle (in Sekunden):", + "description": "" + }, + "options_timings_l2": { + "message": "Mindestdauer beträgt 10 Sekunden.", + "description": "" + }, + "options_timings_l3": { + "message": "An ungelesene E-Mails erinnern alle (in Minuten):", + "description": "" + }, + "options_timings_l4": { + "message": "Für nicht periodische Erinnerungen den Wert auf Null setzen.", + "description": "" + }, + "options_timings_l5": { + "message": "Mindestdauer beträgt 5 Minuten.", + "description": "" + }, + "options_timings_l6": { + "message": "Bei einem Wert ungleich Null werden sowohl Desktop-Benachrichtigungen als auch Alarme (ähnlich wie bei neuer E-Mail) dauerhaft ausgelöst, wenn man ungelesene E-Mails hat.", + "description": "" + }, + "options_timings_l7": { + "message": "Beim Start nicht nach neuen E-Mails überprüfen für (in Sekunden):", + "description": "" + }, + "options_timings_l8": { + "message": "Um keine E-Mail-Überprüfung bis zur ersten manuellen Aktualisierung zu starten, setze den Wert auf Null [Nicht verfügbar in Safari].", + "description": "" + }, + "options_gmail": { + "message": "Gmail:", + "description": "" + }, + "options_gmail_1": { + "message": "Hauptkonto (/mail/u/0/)", + "description": "" + }, + "options_gmail_2": { + "message": "Trenne Labels durch \",\" (Komma).", + "description": "" + }, + "options_gmail_3": { + "message": "Zweites Konto (/mail/u/1/)", + "description": "" + }, + "options_gmail_4": { + "message": "Drittes Konto (/mail/u/2/)", + "description": "" + }, + "options_gmail_5": { + "message": "Viertes Konto (/mail/u/3/)", + "description": "" + }, + "options_gmail_6": { + "message": "Fünftes Konto (/mail/u/4/)", + "description": "" + }, + "options_gmail_7": { + "message": "Sechstes Konto (/mail/u/5/)", + "description": "" + }, + "options_gmail_8": { + "message": "Markiere Nachricht als gelesen, wenn sie archiviert wird.", + "description": "" + }, + "options_gmail_15": { + "message": "Some popular labels:", + "description": "" + }, + "options_gmail_10": { + "message": "Erhalte Benachrichtigungen für folgende Labels und Konten:", + "description": "" + }, + "options_gmail_11": { + "message": "Benutzerdefinierte Feeds:", + "description": "" + }, + "options_gmail_12": { + "message": "Trenne Feeds durch \",\" (Komma). Beispiel Feed: https://mail.google.com/mail/u/0/feed/atom/inbox", + "description": "" + }, + "options_gmail_13": { + "message": "Hinweis: Maximale Anzahl für alle Labels außer \"Posteingang\" ist 20 (Google-Feeds liefern nur die 20 neuesten Einträge)", + "description": "" + }, + "options_gmail_14": { + "message": "Hinweis: Damit der Notifier mehr als fünf Konten überwacht, füge dem Feld 'Benutzerdefinierte Feeds' Feed-URLs hinzu. Zum Beispiel um den 6. und 7. Account zu überwachen: https://mail.google.com/mail/u/6/feed/atom/inbox, https://mail.google.com/mail/u/7/feed/atom/inbox", + "description": "" + }, + "options_notifications": { + "message": "Benachrichtigung:", + "description": "" + }, + "options_notifications_1": { + "message": "Desktop-Benachrichtigung für neue E-Mails anzeigen", + "description": "" + }, + "options_notifications_2": { + "message": "Desktop-Benachrichtigung anzeigen für (in Sekunden):", + "description": "" + }, + "options_notifications_3": { + "message": "Diese Option funktioniert möglicherweise nicht basierend auf dem Betriebssystem.", + "description": "" + }, + "options_notifications_4": { + "message": "Benachrichtigungsformat", + "description": "" + }, + "options_notifications_5": { + "message": "Verfügbare Variablen:", + "description": "" + }, + "options_notifications_6": { + "message": "Benachrichtigungen kürzen, wenn die Felder [Titel] und [Auszug] länger als", + "description": "" + }, + "options_notifications_7": { + "message": "Zeichen sind.", + "description": "" + }, + "options_notifications_8": { + "message": "Verwende hier eine große Zahl, um keine Ellipsenabkürzungen zu haben.", + "description": "" + }, + "options_notifications_9": { + "message": "Alarmton für neue E-Mails abspielen", + "description": "" + }, + "options_notifications_10": { + "message": "Hinweis für Mac-Benutzer. Ab Firefox 28.0 werden alle Desktop-Benachrichtigungen vom Mac Notification Center bearbeitet, das eine zusätzliche akustische Benachrichtigung auslöst. Man muss entweder die Benachrichtigungstöne oder die vom Benachrichtigungscenter generierte Benachrichtigung deaktivieren.", + "description": "" + }, + "options_notifications_11": { + "message": "Anzeige \"Windows Taskleisten-Benachrichtigung\" oder \"Mac OS Dock-Benachrichtigung\"", + "description": "" + }, + "options_notifications_12": { + "message": "Taskleisten-Benachrichtigungen werden derzeit nicht unter Linux unterstützt.", + "description": "" + }, + "options_notifications_13": { + "message": "Öffne das Symbolleisten-Panel, wenn auf das Taskleisten-Benachrichtigungsicon geklickt wird (nur Windows, Beta).", + "description": "" + }, + "options_notifications_14": { + "message": "Diese Funktion ist sehr experimentell und könnte den Firefox-Browser instabil machen. [Neustart erforderlich].", + "description": "" + }, + "options_notifications_15": { + "message": "Standard-Benachrichtigungston ist", + "description": "" + }, + "options_notifications_16": { + "message": "Gmail Notifier Standard-Alarm", + "description": "" + }, + "options_notifications_17": { + "message": "Checker Plus Glocken-Alarm", + "description": "" + }, + "options_notifications_18": { + "message": "Checker Plus Ding-Alarm", + "description": "" + }, + "options_notifications_19": { + "message": "Windows E-Mail-Alarm", + "description": "" + }, + "options_notifications_20": { + "message": "Benutzerdefinierter Ton", + "description": "" + }, + "options_notifications_21": { + "message": "Benutzerdefinierter Benachrichtigungston ist", + "description": "" + }, + "options_notifications_22": { + "message": "Wenn der Browser den benutzerdefinierten Benachrichtigungston nicht abspielt, versuche ihn mit einem Online-Konvertierungstool in ein einfaches WAV-Format zu konvertieren.", + "description": "" + }, + "options_notifications_35": { + "message": "Um einen neuen benutzerdefinierten Ton auszuwählen, wähle zuerst einen integrierten Ton und dann die Option für einen benutzerdefinierten Ton.", + "description": "" + }, + "options_notifications_23": { + "message": "Lautstärke vom Benachrichtigungston ist", + "description": "" + }, + "options_notifications_24": { + "message": "Lautstärke ist eine Zahl zwischen 0 und 100, wobei 100 die höchste Lautstärke ist (Standard).", + "description": "" + }, + "options_notifications_25": { + "message": "In Safari werden die Standard-Benachrichtigungstöne wahrscheinlich nicht richtig wiedergegeben. Wenn dies der Fall ist, verwende eine benutzerdefinierte Ton-Datei als Benachrichtigung.", + "description": "" + }, + "options_notifications_26": { + "message": "Tray-Benachrichtigung immer anzeigen (nur Windows)", + "description": "" + }, + "options_notifications_27": { + "message": "Tray-Benachrichtigung wird angezeigt, auch wenn keine ungelesene Nachricht vorhanden ist.", + "description": "" + }, + "options_notifications_28": { + "message": "Deaktiviere alle Benachrichtigungen für einen benutzerdefinierten Zeitraum (in Minuten):", + "description": "" + }, + "options_notifications_29": { + "message": "Diese Option bezieht sich auf das Rechtsklick-Menü der Schaltfläche auf der Symbolleiste -> Alle Benachrichtigungen deaktivieren -> Benutzerdefinierter Zeitraum.", + "description": "" + }, + "options_notifications_30": { + "message": "Fasse alle gleichzeitigen Desktop-Benachrichtigungen in einer einzigen Benachrichtigung zusammen.", + "description": "" + }, + "options_notifications_31": { + "message": "Benutzerdefinierter Benachrichtigungston", + "description": "" + }, + "options_notifications_32": { + "message": "Name oder E-Mail enthält", + "description": "" + }, + "options_notifications_33": { + "message": "E-Mail-Titel enthält", + "description": "" + }, + "options_notifications_34": { + "message": "E-Mail-Auszug enthält", + "description": "" + }, + "options_notifications_36": { + "message": "Bitte Gmail, die Weiterleitung von 'inbox.google.com' zu verhindern.", + "description": "" + }, + "options_notifications_37": { + "message": "Plakettennummer anzeigen", + "description": "" + }, + "options_notifications_38": { + "message": "Schnellere Aktionen (als gelesen markieren, löschen, ...) (Berücksichtige Aktionen, die beim Empfang von Kopfzeilen aufgelöst werden sollen)", + "description": "" + }, + "options_notifications_40": { + "message": "Allow quick actions from notification box (maximum two actions) (Chrome only)", + "description": "" + }, + "options_notifications_41": { + "message": "Mark as Read", + "description": "" + }, + "options_notifications_42": { + "message": "Archive", + "description": "" + }, + "options_notifications_43": { + "message": "Trash", + "description": "" + }, + "options_tab": { + "message": "Tab Öffnen:", + "description": "" + }, + "options_tab_1": { + "message": "Suche nach einem geöffneten Gmail-Konto nur im aktiven Fenster.", + "description": "" + }, + "options_tab_2": { + "message": "Durchsuche keine anderen Browserfenster nach offenen Gmail-Konten. Wenn Gmail im aktiven Fenster nicht geöffnet ist, öffne einen neuen Tab.", + "description": "" + }, + "options_tab_3": { + "message": "Öffne ein neues Gmail-Konto neben dem aktiven Tab.", + "description": "" + }, + "options_tab_4": { + "message": "Öffne das Gmail-Konto im aktiven Tab.", + "description": "" + }, + "options_tab_5": { + "message": "Öffne das Gmail-Konto in einem Hintergrund-Tab.", + "description": "" + }, + "options_tab_6": { + "message": "Öffne das Gmail-Konto in einem neuen Fenster.", + "description": "" + }, + "options_tab_7": { + "message": "Verwende immer leere Tabs, anstatt einen neuen Tab zu öffnen, wenn Öffnen im Tab aktiviert ist.", + "description": "" + }, + "options_tab_8": { + "message": "Geöffnete Gmail-Tabs ignorieren", + "description": "" + }, + "options_tab_9": { + "message": "Wenn diese Option deaktiviert ist, überprüft Gmail Notifier entweder das aktive Fenster oder alle geöffneten Fenster auf die geöffnete Gmail-Instanz und wechselt zum Tab, wenn die Tab-Öffnung angefordert wird.", + "description": "" + }, + "options_tab_10": { + "message": "Open emails in basic HTML mode", + "description": "" + }, + "options_toolbar": { + "message": "Symbolleiste:", + "description": "" + }, + "options_toolbar_1": { + "message": "Verhalten der Symbolleistenschaltfläche", + "description": "" + }, + "options_toolbar_2": { + "message": "Immer das E-Mail-Vorschaupanel öffnen.", + "description": "" + }, + "options_toolbar_3": { + "message": "Öffne das Gmail-Konto, wenn nur ein Konto angemeldet ist.", + "description": "" + }, + "options_toolbar_18": { + "message": "Open Gmail account (forced)", + "description": "" + }, + "options_toolbar_4": { + "message": "Symbolleiste Panel-Modus", + "description": "" + }, + "options_toolbar_5": { + "message": "Nur Auszug anzeigen", + "description": "" + }, + "options_toolbar_6": { + "message": "Gesamten Inhalt anzeigen", + "description": "" + }, + "options_toolbar_7": { + "message": "Breite des Symbolleisten-Panels im Modus 'Gesamten Inhalt anzeigen' ist (in Pixel):", + "description": "" + }, + "options_toolbar_8": { + "message": "Minimale Breite ist 500px.", + "description": "" + }, + "options_toolbar_9": { + "message": "Höhe des Symbolleisten-Panels im Modus 'Gesamten Inhalt anzeigen' ist (in Pixel):", + "description": "" + }, + "options_toolbar_10": { + "message": "Mindesthöhe ist 500px.", + "description": "" + }, + "options_toolbar_11": { + "message": "Tastaturkürzel auf dem Symbolleisten-Panel unterstützen", + "description": "" + }, + "options_toolbar_12": { + "message": "!: Als Spam melden, #: Papierkorb, e: Archivieren, Umschalttaste + i: Als gelesen markieren.", + "description": "" + }, + "options_toolbar_13": { + "message": "Im Modus 'Gesamten Inhalt anzeigen' E-Mails als HTML rendern.", + "description": "" + }, + "options_toolbar_14": { + "message": "Wenn im Modus 'Gesamten Inhalt anzeigen' nur Text-Rendern bevorzugt wird, deaktiviere das Kontrollkästchen.", + "description": "" + }, + "options_toolbar_15": { + "message": "Klicke mit der mittleren Maustaste auf die Schaltfläche in der Symbolleiste, um", + "description": "" + }, + "options_toolbar_16": { + "message": "Alle Konten aktualisieren", + "description": "" + }, + "options_toolbar_17": { + "message": "Öffne das Haput-Gmail-Konto", + "description": "" + }, + "options_misc": { + "message": "Sonstiges:", + "description": "" + }, + "options_misc_1": { + "message": "Konten alphabetisch sortieren", + "description": "" + }, + "options_misc_2": { + "message": "Standart-Sortierung ist in Login-Reihenfolge.", + "description": "" + }, + "options_misc_3": { + "message": "Symbolleiste Farbmuster ist", + "description": "" + }, + "options_misc_4": { + "message": "Grau für \"keine Ungelesenen\" und Blau für \"Getrennt\"", + "description": "" + }, + "options_misc_5": { + "message": "Blau für \"keine Ungelesenen\" und Grau für \"Getrennt\"", + "description": "" + }, + "options_misc_9": { + "message": "Rot für \"keine Ungelesenen\" und Grau für \"Getrennt\"", + "description": "" + }, + "options_misc_6": { + "message": "Zeige eine Desktopbenachrichtigung an, wenn Gmail bereits in einem anderen Tab geöffnet ist.", + "description": "" + }, + "options_misc_7": { + "message": "Begrüßungsseite beim Upgrade anzeigen", + "description": "" + }, + "options_misc_8": { + "message": "Alle Einstellungen auf Werkseinstellungen zurücksetzen", + "description": "" + }, + "options_misc_10": { + "message": "Desktop- und Benachrichtigungstöne nur auslösen, wenn die E-Mail vor weniger als angekommen ist (in Minuten):", + "description": "" + }, + "options_misc_11": { + "message": "Wenn man diese Einstellung auf Null setzt, erhält man weder Desktop- noch Benachrichtigungstöne. Man erhält jedoch immer noch eine Schaltflächen-Benachrichtigung.", + "description": "" + }, + "options_misc_12": { + "message": "Füge keine Login-Daten in den Tooltip-Text ein!", + "description": "" + }, + "options_misc_13": { + "message": "Standardmäßig aktualisiert der Notifier Tooltip-Text der Symbolleistenschaltfläche mit Anmeldeinformationen. Wenn diese Option deaktiviert ist, bleibt der Tooltip-Text der Standardwert.", + "description": "" + }, + "options_misc_14": { + "message": "Zeige nicht die genaue Menge an, wenn die Anzahl der ungelesenen E-Mails größer als 999 ist.", + "description": "" + }, + "options_misc_15": { + "message": "Öffne die FAQ-Seite nach Updates", + "description": "" + }, + "options_plugins": { + "message": "Plug-ins:", + "description": "" + }, + "options_plugins_1": { + "message": "Gmail-Labels und Sternschaltfläche (experimentell)", + "description": "" + }, + "options_plugins_2": { + "message": "Dieses Plugin zeigt sowohl die Sternschaltfläche als auch die Thread-Labels im Popup an (nur erweiterter Modus).", + "description": "" + }, + "options_px": { + "message": "px", + "description": "" + }, + "options_empty": { + "message": "nicht definiert", + "description": "" + }, + "options_button_test": { + "message": "abspielen", + "description": "" + }, + "options_button_reset": { + "message": "Einstellungen zurücksetzen", + "description": "" + }, + "popup_settings": { + "message": "Einstellungen", + "description": "" + }, + "popup_of": { + "message": "von", + "description": "" + }, + "popup_wait": { + "message": "Warte...", + "description": "" + }, + "popup_date_format": { + "message": "%mm %dd, %yy", + "description": "" + }, + "popup_no_subject": { + "message": "(kein Thema)", + "description": "" + }, + "popup_open_settings": { + "message": "Open Settings", + "description": "" + }, + "popup_open_inbox": { + "message": "Open Inbox", + "description": "" + }, + "popup_archive": { + "message": "Archivieren", + "description": "" + }, + "popup_spam": { + "message": "Spam", + "description": "" + }, + "popup_trash": { + "message": "Papierkorb", + "description": "" + }, + "popup_refresh": { + "message": "Aktualisieren", + "description": "" + }, + "popup_read": { + "message": "Als gelesen markieren", + "description": "" + }, + "popup_read_all": { + "message": "Alle als gelesen markieren", + "description": "" + }, + "popup_msg_1": { + "message": "jetzt gerade", + "description": "" + }, + "popup_msg_2": { + "message": "Vor 1 Minute", + "description": "" + }, + "popup_msg_3_format": { + "message": "Vor %d Minuten", + "description": "" + }, + "popup_msg_4": { + "message": "Vor 1 Stunde", + "description": "" + }, + "popup_msg_5": { + "message": "Stunden her", + "description": "" + }, + "popup_msg_6": { + "message": "Gestern", + "description": "" + }, + "popup_msg_7_format": { + "message": "Vor %d Tagen", + "description": "" + }, + "popup_msg_8_format": { + "message": "Vor %d Woche(n)", + "description": "" + }, + "popup_msg_9_format": { + "message": "Vor %d Monat(en)", + "description": "" + }, + "popup_msg_10": { + "message": "Januar", + "description": "" + }, + "popup_msg_11": { + "message": "Februar", + "description": "" + }, + "popup_msg_12": { + "message": "März", + "description": "" + }, + "popup_msg_13": { + "message": "April", + "description": "" + }, + "popup_msg_14": { + "message": "Mai", + "description": "" + }, + "popup_msg_15": { + "message": "Juni", + "description": "" + }, + "popup_msg_16": { + "message": "Juli", + "description": "" + }, + "popup_msg_17": { + "message": "August", + "description": "" + }, + "popup_msg_18": { + "message": "September", + "description": "" + }, + "popup_msg_19": { + "message": "Oktober", + "description": "" + }, + "popup_msg_20": { + "message": "November", + "description": "" + }, + "popup_msg_21": { + "message": "Dezember", + "description": "" + }, + "settings_open_title": { + "message": "Öffne die Seite Optionen (Einstellungen)", + "description": "" + }, + "settings_open_label": { + "message": "Optionen öffnen", + "description": "" + }, + "gmail": { + "message": "Notifier für Gmail™", + "description": "" + } +} \ No newline at end of file diff --git a/WebExtension/_locales/el/messages.json b/v2/_locales/el/messages.json similarity index 90% rename from WebExtension/_locales/el/messages.json rename to v2/_locales/el/messages.json index 073c67ad..772880c4 100644 --- a/WebExtension/_locales/el/messages.json +++ b/v2/_locales/el/messages.json @@ -1,690 +1,758 @@ { - "label_9": { - "message": "Για 5 ώρες", + "toolbar_label": { + "message": "Notifier for Gmail™", "description": "" }, - "options_notifications_19": { - "message": "Windows email ειδοποίηση", + "tooltip_1": { + "message": "Αριστερό κλικ: Ανοίξτε το Gmail ή το παράθυρο προεπισκόπησης αλληλογραφίας", "description": "" }, - "options_notifications_17": { - "message": "Checker Plus ειδοποίηση καμπάνας", + "tooltip_2": { + "message": "Μεσαίο (ή Ctrl + Left) κλικ: Ανανέωση όλων των λογαριασμών", "description": "" }, - "options_notifications_13": { - "message": "Ανοιγμα της γραμμής εργαλείων όταν κάνετε κλικ στο εικονίδιο ειδοποίησης στην γραμμή εργασιών (μόνο για Windows, beta)", + "tooltip_3": { + "message": "Δεξί κλικ: Επιλογές Λογαριασμού", "description": "" }, - "options_notifications_30": { - "message": "Συνδυάστε όλες τις ταυτόχρονες ειδοποιήσεις στην επιφάνεια εργασίας σε μια ενιαία κοινοποίηση", + "description": { + "message": "Πολλαπλές ετικέτες και κοινοποίηση λογαριασμού για το Google Mail (Gmail)", "description": "" }, - "settings_open_label": { - "message": "Ανοίξτε τις Επιλογές", + "log_in_to_your_account": { + "message": "Παρακαλούμε συνδεθείτε στον Gmail λογαριασμό σας ", "description": "" }, - "options_timings_l7": { - "message": "Να μην γίνεται έλεγχος για νέα email κατά την εκκίνηση για (σε δευτερόλεπτα):", + "msg_1": { + "message": "Η καρτέλα είναι ήδη ανοικτή. Κάντε κλικ στο κουμπί της γραμμής εργαλείων για να ανοίξετε το Gmail σε μια νέα καρτέλα, ή να μεταβείτε σε μια υπάρχουσα Gmail καρτέλα.", "description": "" }, - "label_4": { - "message": "Για 5 λεπτά", + "msg_2": { + "message": "Ο σύνδεσμος έχει αντιγραφεί στο πρόχειρο.", "description": "" }, - "options_timings_l3": { - "message": "Υπενθύμιση για όλα τα μη αναγνωσμένα email κάθε (σε λεπτά):", + "msg_3": { + "message": "Το επιλεγμένο κείμενο έχει αντιγράφει στο πρόχειρο.", "description": "" }, - "popup_msg_4": { - "message": "1 ώρα πριν", + "msg_4": { + "message": "Σημείωση: Για να λειτουργήσει σωστά το notifier, θα πρέπει να είστε συνδεδεμένοι στον Google λογαριασμό σας.", "description": "" }, - "options_gmail_1": { - "message": "Πρωτοβάθμιος λογαριασμός (/mail/u/0/)", + "msg_5": { + "message": "Επιλέξτε ένα αρχείο ήχου", "description": "" }, - "options_gmail_10": { - "message": "Λάβετε ειδοποιήσεις για τις εξής ετικέτες και τους λογαριασμούς:", + "label_1": { + "message": "Ανανέωση", "description": "" }, - "options_notifications_1": { - "message": "Κοινοποίηση επιφάνειας εργασίας οθόνης για νέα email", + "label_2": { + "message": "Ρυθμίσεις", "description": "" }, - "options_notifications_9": { - "message": "Αναπαραγωγή ήχου ειδοποίησης για νέα email", + "label_3": { + "message": "Απενεργοποίηση όλων των ειδοποιήσεων", + "description": "" + }, + "label_4": { + "message": "Για 5 λεπτά", + "description": "" + }, + "label_5": { + "message": "Για 15 λεπτά", "description": "" }, "label_6": { "message": "Για 30 λεπτά", "description": "" }, - "options_misc_8": { - "message": "Επαναφορά όλων των ρυθμίσεων στις εργοστασιακές ρυθμίσεις", + "label_7": { + "message": "Για 1 ώρα", "description": "" }, - "options_notifications_28": { - "message": "Απενεργοποίηση όλων των ειδοποιήσεων για μια προσαρμοσμένη χρονική περίοδο (σε λεπτά):", + "label_8": { + "message": "Για 2 ώρες", "description": "" }, - "options_timings_l4": { - "message": "Ρυθμίστε την τιμή στο μηδέν για μη-περιοδικές υπενθυμίσεις.", + "label_9": { + "message": "Για 5 ώρες", "description": "" }, - "options_notifications_32": { - "message": "περιέχει όνομα ή email", + "label_13": { + "message": "Για μια προσαρμοσμένη χρονική περίοδο", "description": "" }, - "options_tab_6": { - "message": "Άνοιγμα λογαριασμού Gmail σε νέο παράθυρο", + "label_10": { + "message": "Enable notifications (session)", "description": "" }, - "options_notifications_25": { - "message": "Στο safari πιθανότατα οι προεπιλεγμένες ειδοποιήσεις ήχου να μην παίζουν σωστά, αν ναι, χρησιμοποιήστε ένα αρχείο ήχου ως κοινοποίηση.", + "label_11": { + "message": "Συντάξτε ένα e-mail", "description": "" }, - "options_toolbar_15": { - "message": "Μέσαιο κλικ στην μπάρα εργαλείων για", + "label_12": { + "message": "Άνοιγμα Συχνών Ερωτήσεων", "description": "" }, - "options_toolbar_10": { - "message": "Το ελάχιστο ύψος είναι 500px.", + "label_14": { + "message": "Σύνδεση στους λογαριασμούς", "description": "" }, - "popup_msg_10": { - "message": "Ιανουάριος", + "unknown": { + "message": "άγνωστο", "description": "" }, - "options_notifications_26": { - "message": "Εμφανιση πάντα κοινοποίησης στον δίσκο (μόνο για Windows)", + "and": { + "message": "και", "description": "" }, - "label_3": { - "message": "Απενεργοποίηση όλων των ειδοποιήσεων", + "log_into_your_account": { + "message": "Παρακαλούμε συνδεθείτε στον λογαριασμό σας ", "description": "" }, - "label_13": { - "message": "Για μια προσαρμοσμένη χρονική περίοδο", + "notification": { + "message": "Από: [author_email] [break] Τίτλος: [τίτλος] [break] Περίληψη: [περίληψη]", "description": "" }, - "options_empty": { - "message": "δεν ορίζεται", + "options_title": { + "message": "Επιλογές - Gmail ™ Notifier", "description": "" }, - "options_notifications_3": { - "message": "Η επιλογή αυτή δεν μπορεί να λειτουργήσει με βάση το λειτουργικό σας σύστημα.", + "options_inshort": { + "message": "Πολλαπλές ετικέτες και λογαριασμοί κοινοποιών για το Google Mail (Gmail).", + "description": "" + }, + "options_donation": { + "message": "Support Development", "description": "" }, "options_timings": { - "message": "Χρονοδιάγραμμα", + "message": "Timings:", "description": "" }, - "options_gmail_5": { - "message": "Τεταρτογενής λογαριασμός (/mail/u/3/)", + "options_timings_l1": { + "message": "Έλεγχος για νέα e-mail κάθε (σε δευτερόλεπτα):", "description": "" }, - "label_5": { - "message": "Για 15 λεπτά", + "options_timings_l2": { + "message": "Ελάχιστο χρονικό διάστημα είναι 10 δευτερόλεπτα.", "description": "" }, - "options_misc_9": { - "message": "Κόκκινο χρώμα για \"Μη Αναγνωσμένα\" και γκρι χρώμα για \"Ασύνδετα\"", + "options_timings_l3": { + "message": "Υπενθύμιση για όλα τα μη αναγνωσμένα email κάθε (σε λεπτά):", "description": "" }, - "popup_msg_5": { - "message": "ώρες πριν", + "options_timings_l4": { + "message": "Ρυθμίστε την τιμή στο μηδέν για μη-περιοδικές υπενθυμίσεις.", "description": "" }, - "options_notifications_27": { - "message": "Κοινοποίηση στον δίσκος θα εμφανίζεται ακόμη και αν δεν υπάρχει μη αναγνωσμένο μήνυμα.", + "options_timings_l5": { + "message": "Ελάχιστη περίοδος είναι 5 λεπτά.", "description": "" }, - "options_misc_1": { - "message": "Ταξινόμηση λογαριασμών αλφαβητικά", + "options_timings_l6": { + "message": "Πυρκαγιές με μη μηδενική τιμή, κοινοποίηση και ηχητική ειδοποίηση τόσο στην επιφάνεια εργασίας (παρόμοιο με νέα άφιξη email) για πάντα, αν έχετε μη αναγνωσμένα email(s).", "description": "" }, - "tooltip_1": { - "message": "Αριστερό κλικ: Ανοίξτε το Gmail ή το παράθυρο προεπισκόπησης αλληλογραφίας", + "options_timings_l7": { + "message": "Να μην γίνεται έλεγχος για νέα email κατά την εκκίνηση για (σε δευτερόλεπτα):", "description": "" }, - "notification": { - "message": "Από: [author_email] [break] Τίτλος: [τίτλος] [break] Περίληψη: [περίληψη]", + "options_timings_l8": { + "message": "Ρυθμίστε την τιμή στο μηδέν για κανένα έλεγχο e-mail μέχρι την πρώτη χειροκίνητη ανανέωση [Δεν διατίθεται στο Safari].", "description": "" }, - "popup_trash": { - "message": "Σκουπίδια", + "options_gmail": { + "message": "Gmail:", "description": "" }, - "options_tab": { - "message": "Άνοιγμα καρτέλας:", + "options_gmail_1": { + "message": "Πρωτοβάθμιος λογαριασμός (/mail/u/0/)", "description": "" }, - "log_into_your_account": { - "message": "Παρακαλούμε συνδεθείτε στον λογαριασμό σας ", + "options_gmail_2": { + "message": "Ξεχωριστές ετικέτες με \",\" (κόμμα).", "description": "" }, - "label_10": { - "message": "Ενεργοποίηση ειδοποιήσεων", + "options_gmail_3": { + "message": "Δευτερεύον λογαριασμός (/mail/u/1/)", "description": "" }, - "options_notifications_23": { - "message": "Ένταση ήχου κοινοποιήσεως ", + "options_gmail_4": { + "message": "Τριτοβάθμιος λογαριασμός (/mail/u/2/)", "description": "" }, - "options_timings_l2": { - "message": "Ελάχιστο χρονικό διάστημα είναι 10 δευτερόλεπτα.", + "options_gmail_5": { + "message": "Τεταρτογενής λογαριασμός (/mail/u/3/)", "description": "" }, - "options_toolbar_11": { - "message": "Συντομεύσεις πληκτρολογίου υποστήριξης στον πίνακα εργαλείων", + "options_gmail_6": { + "message": "Πενταδικός λογαριασμός (/mail/u/4/)", "description": "" }, - "options_gmail_9": { - "message": "Μερικές δημοφιλείς ετικέτες: \"Εισερχόμενα\", \"σημαντικό\", \"^ smartlabel προσωπικά\", \"^ smartlabel ενημερωτικό δελτίο\", \"^ κοινοποίηση smartlabel\", και \"^ smartlabel_group\"", + "options_gmail_7": { + "message": "Σκηνικός λογαριασμός (/mail/u/5/)", "description": "" }, - "popup_msg_17": { - "message": "Αύγουστος", + "options_gmail_8": { + "message": "Σήμανση ως αναγνωσμένο μήνυμα κατά την αρχειοθέτηση", "description": "" }, - "popup_msg_15": { - "message": "Ιούνιος", + "options_gmail_15": { + "message": "Some popular labels:", "description": "" }, - "options_notifications_34": { - "message": "περιέχει περίληψη email", + "options_gmail_10": { + "message": "Λάβετε ειδοποιήσεις για τις εξής ετικέτες και τους λογαριασμούς:", "description": "" }, - "label_14": { - "message": "Σύνδεση στους λογαριασμούς", + "options_gmail_11": { + "message": "Προσαρμοσμένες τροφοδοσίες:", "description": "" }, - "options_misc_13": { - "message": "Από προεπιλογή, ο κοινοποιών ενημερώνει κείμενο επεξήγησης του κουμπιού γραμμής εργαλείων με πληροφορίες σύνδεσης. Με την απενεργοποίηση της επιλογής αυτής, στο κείμενο επεξήγησης παραμένει η προεπιλεγμένη τιμή.", + "options_gmail_12": { + "message": "Ξεχωριστές τροφοδοσίες με \",\" (κόμμα). Δείγμα τροφοδοσίας: https://mail.google.com/mail/u/0/feed/atom/inbox", "description": "" }, - "options_misc_6": { - "message": "Show desktop notification to warn that Gmail is already opened in the active tab", + "options_gmail_13": { + "message": "Note: maximum number for all labels except \"inbox\" is 20 (Google feeds only supply the 20 newest entries)", "description": "" }, - "popup_read": { - "message": "Σημείωσε ως Διαβασμένο", + "options_gmail_14": { + "message": "Note: for the Notifier to listen for more than 5 accounts, add feeds URLs to the \"Custom feeds\" field. For instance to listen to the 6 and 7th accounts add: https://mail.google.com/mail/u/6/feed/atom/inbox, https://mail.google.com/mail/u/7/feed/atom/inbox", + "description": "" + }, + "options_notifications": { + "message": "Ειδοποιήσεις:", + "description": "" + }, + "options_notifications_1": { + "message": "Κοινοποίηση επιφάνειας εργασίας οθόνης για νέα email", + "description": "" + }, + "options_notifications_2": { + "message": "Εμφάνιση κοινοποίησης επιφάνειας εργασίας για (σε δευτερόλεπτα):", + "description": "" + }, + "options_notifications_3": { + "message": "Η επιλογή αυτή δεν μπορεί να λειτουργήσει με βάση το λειτουργικό σας σύστημα.", "description": "" }, "options_notifications_4": { "message": "Μορφή κοινοποίησης", "description": "" }, - "settings_open_title": { - "message": "Ανοίξτε τις επιλογές (ρυθμίσεις) σελίδας", + "options_notifications_5": { + "message": "Διαθέσιμες μεταβλητές:", "description": "" }, - "label_2": { - "message": "Ρυθμίσεις", + "options_notifications_6": { + "message": "Περικόψτε ειδοποιήσεις περισσότερο από", "description": "" }, - "options_toolbar_14": { - "message": "Αν προτιμάτε μονο το κείμενο σε λειτουργία πλήρους περιεχομένου, αποεπιλέξτε το πλαίσιο.", + "options_notifications_7": { + "message": "χαρακτήρες για [τίτλος] και [περίληψη] πεδία.", "description": "" }, - "options_notifications_18": { - "message": "Checker Plus Ειδοποίηση κωδώνισματος", + "options_notifications_8": { + "message": "Για να μην έχουν καμία περικοπή τα αποσιωπητικά, χρησιμοποιήστε ένα μεγάλο αριθμό εδώ.", "description": "" }, - "options_tab_5": { - "message": "Άνοιγμα λογαριασμού Gmail σε μια καρτέλα στον φόντο", + "options_notifications_9": { + "message": "Αναπαραγωγή ήχου ειδοποίησης για νέα email", "description": "" }, - "label_7": { - "message": "Για 1 ώρα", + "options_notifications_10": { + "message": "Σημείωση για τους χρήστες του Mac. Από το Firefox 28.0, όλες οι ειδοποιήσεις στην επιφάνεια εργασίας διεκπεραιώνονται από το Mac Κέντρο Ειδοποίησης που προκαλεί ένα επιπλέον ήχο ειδοποίησης. Θα πρέπει είτε να απενεργοποιήσετε αυτο τον ήχο ειδοποίησης ή αυτόν που παράγεται από το Κέντρο Ειδοποίησης.", "description": "" }, - "popup_archive": { - "message": "Αρχείο", + "options_notifications_11": { + "message": "Εμφανιση \"Ειδοποιήσεις της γραμμής εργασιών του Windows\" ή \"Mac OS Dock κοινοποίησης\"", "description": "" }, - "msg_2": { - "message": "Ο σύνδεσμος έχει αντιγραφεί στο πρόχειρο.", + "options_notifications_12": { + "message": "Το Taskbar notifications δεν υποστηρίζεται απο το λειτουργικό σύστημα Linux αυτή τη στιγμή.", "description": "" }, - "options_title": { - "message": "Επιλογές - Gmail ™ Notifier", + "options_notifications_13": { + "message": "Ανοιγμα της γραμμής εργαλείων όταν κάνετε κλικ στο εικονίδιο ειδοποίησης στην γραμμή εργασιών (μόνο για Windows, beta)", "description": "" }, - "popup_msg_13": { - "message": "Απρίλιος", + "options_notifications_14": { + "message": "Αυτό το χαρακτηριστικό είναι ιδιαίτερα πειραματικό και θα μπορούσε να κάνει τον Firefox browser ασταθή. [Επανεκκίνηση απαιτείται].", "description": "" }, - "popup_msg_9_format": { - "message": "%d μήνα(ες) πρίν", + "options_notifications_15": { + "message": "Ο προ επιλεγμένος ήχος ειδοποίησης είναι", "description": "" }, - "popup_msg_11": { - "message": "Φεβρουάριος", + "options_notifications_16": { + "message": "Gmail Notifier προεπιλεγμένη ειδοποίηση", "description": "" }, - "popup_open_inbox": { - "message": "Ανοίξτε το φάκελο εισερχομένων", + "options_notifications_17": { + "message": "Checker Plus ειδοποίηση καμπάνας", "description": "" }, - "options_tab_9": { - "message": "When unchecked, Gmail Notifier checks either active window or all open windows for open instance of Gmail and switch to the tab when tab opening is requested.", + "options_notifications_18": { + "message": "Checker Plus Ειδοποίηση κωδώνισματος", "description": "" }, - "gmail": { - "message": "Gmail™ Notifier", + "options_notifications_19": { + "message": "Windows email ειδοποίηση", "description": "" }, - "popup_msg_6": { - "message": "Εχθές", + "options_notifications_20": { + "message": "Ο ήχος ορίζεται από τον χρήστη ", "description": "" }, - "options_toolbar_8": { - "message": "Το ελάχιστο πλάτος είναι 500px.", + "options_notifications_21": { + "message": "Προσδιορισμενος ηχος απο τον χρηστη", "description": "" }, - "options_notifications_16": { - "message": "Gmail Notifier προεπιλεγμένη ειδοποίηση", + "options_notifications_22": { + "message": "Αν ο browser σας δεν παίζει το προεπιλεγμένο ήχο ειδοποίησης, προσπαθήστε να το μετατρέψετε σε μια απλή μορφή WAV χρησιμοποιώντας ένα online εργαλείο μετατροπής.", "description": "" }, - "options_misc_14": { - "message": "Να μην εμφανίζεται ο ακριβής αριθμός σημάτων όταν ο αριθμός των μη αναγνωσμένων μηνυμάτων ηλεκτρονικού ταχυδρομείου είναι μεγαλύτερος από 999", + "options_notifications_35": { + "message": "Για να επιλέξετε ένα νέο προσαρμοσμένο ήχο, επιλέξτε ένα ενσωματωμένο ήχο και στη συνέχεια αλλάξτε την επιλογή με τον προσαρμοσμένο ήχο", "description": "" }, - "popup_msg_18": { - "message": "Σεπτέμβριος", + "options_notifications_23": { + "message": "Ένταση ήχου κοινοποιήσεως ", "description": "" }, - "options_notifications_14": { - "message": "Αυτό το χαρακτηριστικό είναι ιδιαίτερα πειραματικό και θα μπορούσε να κάνει τον Firefox browser ασταθή. [Επανεκκίνηση απαιτείται].", + "options_notifications_24": { + "message": "Ένταση είναι ένας αριθμός μεταξύ 0 έως 100, όπου 100 είναι η υψηλότερη ένταση (προεπιλογή).", "description": "" }, - "options_gmail_3": { - "message": "Δευτερεύον λογαριασμός (/mail/u/1/)", + "options_notifications_25": { + "message": "Στο safari πιθανότατα οι προεπιλεγμένες ειδοποιήσεις ήχου να μην παίζουν σωστά, αν ναι, χρησιμοποιήστε ένα αρχείο ήχου ως κοινοποίηση.", "description": "" }, - "options_notifications_11": { - "message": "Εμφανιση \"Ειδοποιήσεις της γραμμής εργασιών του Windows\" ή \"Mac OS Dock κοινοποίησης\"", + "options_notifications_26": { + "message": "Εμφανιση πάντα κοινοποίησης στον δίσκο (μόνο για Windows)", "description": "" }, - "options_notifications_2": { - "message": "Εμφάνιση κοινοποίησης επιφάνειας εργασίας για (σε δευτερόλεπτα):", + "options_notifications_27": { + "message": "Κοινοποίηση στον δίσκος θα εμφανίζεται ακόμη και αν δεν υπάρχει μη αναγνωσμένο μήνυμα.", "description": "" }, - "log_in_to_your_account": { - "message": "Παρακαλούμε συνδεθείτε στον Gmail λογαριασμό σας ", + "options_notifications_28": { + "message": "Απενεργοποίηση όλων των ειδοποιήσεων για μια προσαρμοσμένη χρονική περίοδο (σε λεπτά):", "description": "" }, - "popup_of": { - "message": "από", + "options_notifications_29": { + "message": "Αυτή η επιλογή σχετίζεται με το δεξί κλικ μενού στο κουμπί της γραμμής εργαλείων -> απενεργοποιήσετε όλες τις ειδοποιήσεις -> προσαρμοσμένης χρονικής περιόδου.", "description": "" }, - "options_notifications_15": { - "message": "Ο προ επιλεγμένος ήχος ειδοποίησης είναι", + "options_notifications_30": { + "message": "Συνδυάστε όλες τις ταυτόχρονες ειδοποιήσεις στην επιφάνεια εργασίας σε μια ενιαία κοινοποίηση", "description": "" }, - "options_notifications_21": { - "message": "Προσδιορισμενος ηχος απο τον χρηστη", + "options_notifications_31": { + "message": "Custom sound notification", "description": "" }, - "options_toolbar_9": { - "message": "Το υψος της γραμμής εργαλείων σε κατάσταση πλήρους περιεχομένου είναι (σε εικονοστοιχεία):", + "options_notifications_32": { + "message": "name or email contains", "description": "" }, - "options_toolbar_1": { - "message": "Γραμμή εργαλείων συμπεριφορά κουμπιού", + "options_notifications_33": { + "message": "περιέχει τίτλο email", "description": "" }, - "unknown": { - "message": "άγνωστο", + "options_notifications_34": { + "message": "περιέχει περίληψη email", "description": "" }, - "popup_msg_21": { - "message": "Δεκέμβριος", + "options_notifications_36": { + "message": "Ask Gmail to prevent 'inbox.google.com' redirection", "description": "" }, - "popup_read_all": { - "message": "Σημείωση όλων ως Αναγνωσμένα", + "options_notifications_37": { + "message": "Display Badge number", "description": "" }, - "options_notifications_8": { - "message": "Για να μην έχουν καμία περικοπή τα αποσιωπητικά, χρησιμοποιήστε ένα μεγάλο αριθμό εδώ.", + "options_notifications_38": { + "message": "Faster actions (mark as read, delete, ...) (Consider actions to be resolved when headers are received)", "description": "" }, - "options_donation": { - "message": "Κάντε μια δωρεά", + "options_notifications_40": { + "message": "Allow quick actions from notification box (maximum two actions) (Chrome only)", "description": "" }, - "msg_3": { - "message": "Το επιλεγμένο κείμενο έχει αντιγράφει στο πρόχειρο.", + "options_notifications_41": { + "message": "Mark as Read", "description": "" }, - "options_misc_7": { - "message": "Εμφάνιση σελίδας υποδοχής για αναβάθμιση", + "options_notifications_42": { + "message": "Archive", "description": "" }, - "options_gmail": { - "message": "Gmail:", + "options_notifications_43": { + "message": "Trash", "description": "" }, - "label_1": { - "message": "Ανανέωση", + "options_tab": { + "message": "Άνοιγμα καρτέλας:", "description": "" }, - "options_notifications_5": { - "message": "Διαθέσιμες μεταβλητές:", + "options_tab_1": { + "message": "Αναζήτηση για έναν ανοικτό λογαριασμό Gmail μόνο στο ενεργό παράθυρο", "description": "" }, - "options_notifications_24": { - "message": "Ένταση είναι ένας αριθμός μεταξύ 0 έως 100, όπου 100 είναι η υψηλότερη ένταση (προεπιλογή).", + "options_tab_2": { + "message": "Μην ψάξετε σε άλλα παράθυρα του προγράμματος περιήγησης για ανοικτούς λογαριασμούς Gmail. Εάν το Gmail δεν είναι ανοικτό στο ενεργό παράθυρο, ανοίξτε μια νέα καρτέλα.", "description": "" }, - "options_notifications_10": { - "message": "Σημείωση για τους χρήστες του Mac. Από το Firefox 28.0, όλες οι ειδοποιήσεις στην επιφάνεια εργασίας διεκπεραιώνονται από το Mac Κέντρο Ειδοποίησης που προκαλεί ένα επιπλέον ήχο ειδοποίησης. Θα πρέπει είτε να απενεργοποιήσετε αυτο τον ήχο ειδοποίησης ή αυτόν που παράγεται από το Κέντρο Ειδοποίησης.", + "options_tab_3": { + "message": "Άνοιγμα νέου λογαριασμού Gmail δίπλα στην ενεργή καρτέλα", "description": "" }, - "options_misc_2": { - "message": "Ο τύπος προεπιλεγμένης σειράς που έχει συνδεθεί", + "options_tab_4": { + "message": "Άνοιγμα λογαριασμού Gmail στην ενεργή καρτέλα", "description": "" }, - "options_toolbar_2": { - "message": "Πάντα ανοικτό παράθυρο προεπισκόπησης email", + "options_tab_5": { + "message": "Άνοιγμα λογαριασμού Gmail σε μια καρτέλα στον φόντο", "description": "" }, - "popup_settings": { - "message": "Ρυθμίσεις", + "options_tab_6": { + "message": "Άνοιγμα λογαριασμού Gmail σε νέο παράθυρο", "description": "" }, - "options_gmail_4": { - "message": "Τριτοβάθμιος λογαριασμός (/mail/u/2/)", + "options_tab_7": { + "message": "Πάντα να χρησιμοποιείτε κενό καρτελών αντί να ανοίγει μια νέα καρτέλα, όταν είναι ανοικτή στην καρτέλα ενεργοποιείται", "description": "" }, - "options_toolbar_5": { - "message": "Εμφάνιση μόνο συνοπτικά", + "options_tab_8": { + "message": "Ignore opened Gmail tabs", "description": "" }, - "options_notifications_12": { - "message": "Το Taskbar notifications δεν υποστηρίζεται απο το λειτουργικό σύστημα Linux αυτή τη στιγμή.", + "options_tab_9": { + "message": "When unchecked, Gmail Notifier checks either active window or all open windows for open instance of Gmail and switch to the tab when tab opening is requested.", "description": "" }, - "options_notifications_35": { - "message": "Για να επιλέξετε ένα νέο προσαρμοσμένο ήχο, επιλέξτε ένα ενσωματωμένο ήχο και στη συνέχεια αλλάξτε την επιλογή με τον προσαρμοσμένο ήχο", + "options_tab_10": { + "message": "Open emails in basic HTML mode", "description": "" }, - "msg_1": { - "message": "Η καρτέλα είναι ήδη ανοικτή. Κάντε κλικ στο κουμπί της γραμμής εργαλείων για να ανοίξετε το Gmail σε μια νέα καρτέλα, ή να μεταβείτε σε μια υπάρχουσα Gmail καρτέλα.", + "options_toolbar": { + "message": "Γραμμη Εργαλειων:", "description": "" }, - "popup_refresh": { - "message": "Ανανεώνω", + "options_toolbar_1": { + "message": "Γραμμή εργαλείων συμπεριφορά κουμπιού", + "description": "" + }, + "options_toolbar_2": { + "message": "Πάντα ανοικτό παράθυρο προεπισκόπησης email", + "description": "" + }, + "options_toolbar_3": { + "message": "Άνοιγμα λογαριασμού Gmail αν μόνο ένας λογαριασμός είναι συνδεδεμένος ", + "description": "" + }, + "options_toolbar_18": { + "message": "Open Gmail account (forced)", + "description": "" + }, + "options_toolbar_4": { + "message": "Λειτουργία γραμμής εργαλείων", + "description": "" + }, + "options_toolbar_5": { + "message": "Εμφάνιση μόνο συνοπτικά", + "description": "" + }, + "options_toolbar_6": { + "message": "Εμφάνιση πλήρους περιεχομένου", + "description": "" + }, + "options_toolbar_7": { + "message": "Πλάτος γραμμής εργαλείων του πίνακα σε κατάσταση πλήρους περιεχομένου (σε εικονοστοιχεία):", "description": "" }, - "options_misc_5": { - "message": "Μπλε χρώμα για \"Μη Αναγνωσμένα\" και γκρι χρώμα για \"Αποσυνδεση\"", + "options_toolbar_8": { + "message": "Το ελάχιστο πλάτος είναι 500px.", "description": "" }, - "options_timings_l8": { - "message": "Ρυθμίστε την τιμή στο μηδέν για κανένα έλεγχο e-mail μέχρι την πρώτη χειροκίνητη ανανέωση [Δεν διατίθεται στο Safari].", + "options_toolbar_9": { + "message": "Το υψος της γραμμής εργαλείων σε κατάσταση πλήρους περιεχομένου είναι (σε εικονοστοιχεία):", "description": "" }, - "popup_msg_19": { - "message": "Οκτώβριος", + "options_toolbar_10": { + "message": "Το ελάχιστο ύψος είναι 500px.", "description": "" }, - "options_notifications_33": { - "message": "περιέχει τίτλο email", + "options_toolbar_11": { + "message": "Συντομεύσεις πληκτρολογίου υποστήριξης στον πίνακα εργαλείων", "description": "" }, - "tooltip_3": { - "message": "Δεξί κλικ: Επιλογές Λογαριασμού", + "options_toolbar_12": { + "message": "!: Αναφορά ως ανεπιθύμητο, #: Απορρίμματα, και: Αρχείο, Shift + I: Επισήμανση ως διαβάσμενο", "description": "" }, - "popup_date_format": { - "message": "%mm %dd, %yy", + "options_toolbar_13": { + "message": "Απόδοση e-mail ως HTML σε λειτουργία πλήρους περιεχομένου", "description": "" }, - "options_notifications": { - "message": "Ειδοποιήσεις:", + "options_toolbar_14": { + "message": "Αν προτιμάτε μονο το κείμενο σε λειτουργία πλήρους περιεχομένου, αποεπιλέξτε το πλαίσιο.", "description": "" }, - "options_timings_l6": { - "message": "Πυρκαγιές με μη μηδενική τιμή, κοινοποίηση και ηχητική ειδοποίηση τόσο στην επιφάνεια εργασίας (παρόμοιο με νέα άφιξη email) για πάντα, αν έχετε μη αναγνωσμένα email(s).", + "options_toolbar_15": { + "message": "Μέσαιο κλικ στην μπάρα εργαλείων για", "description": "" }, - "popup_msg_12": { - "message": "Μάρτιος", + "options_toolbar_16": { + "message": "Ανανέωση όλων των λογαριασμών", "description": "" }, - "options_notifications_22": { - "message": "Αν ο browser σας δεν παίζει το προεπιλεγμένο ήχο ειδοποίησης, προσπαθήστε να το μετατρέψετε σε μια απλή μορφή WAV χρησιμοποιώντας ένα online εργαλείο μετατροπής.", + "options_toolbar_17": { + "message": "Άνοιγμα του κύριου Gmail λογαριασμου", "description": "" }, - "options_tab_1": { - "message": "Αναζήτηση για έναν ανοικτό λογαριασμό Gmail μόνο στο ενεργό παράθυρο", + "options_misc": { + "message": "Διάφορα:", "description": "" }, - "popup_msg_7_format": { - "message": "%d ημέρες πριν", + "options_misc_1": { + "message": "Ταξινόμηση λογαριασμών αλφαβητικά", "description": "" }, - "options_timings_l1": { - "message": "Έλεγχος για νέα e-mail κάθε (σε δευτερόλεπτα):", + "options_misc_2": { + "message": "Ο τύπος προεπιλεγμένης σειράς που έχει συνδεθεί", "description": "" }, - "options_toolbar_4": { - "message": "Λειτουργία γραμμής εργαλείων", + "options_misc_3": { + "message": "Το σχέδιο χρώματος γραμμής εργαλείων είναι", "description": "" }, - "toolbar_label": { - "message": "Gmail™ Notifier", + "options_misc_4": { + "message": "Γκρι χρώμα για \"Μη Αναγνωσμένα\" και μπλε χρώμα για \"Αποσυνδεση\"", "description": "" }, - "popup_msg_1": { - "message": "μόλις τώρα", + "options_misc_5": { + "message": "Μπλε χρώμα για \"Μη Αναγνωσμένα\" και γκρι χρώμα για \"Αποσυνδεση\"", "description": "" }, - "popup_open_settings": { - "message": "Ανοίξτε τις ρυθμίσεις", + "options_misc_9": { + "message": "Κόκκινο χρώμα για \"Μη Αναγνωσμένα\" και γκρι χρώμα για \"Ασύνδετα\"", "description": "" }, - "options_misc_3": { - "message": "Το σχέδιο χρώματος γραμμής εργαλείων είναι", + "options_misc_6": { + "message": "Show desktop notification to warn that Gmail is already opened in the active tab", "description": "" }, - "options_gmail_12": { - "message": "Ξεχωριστές τροφοδοσίες με \",\" (κόμμα). Δείγμα τροφοδοσίας: https://mail.google.com/mail/u/0/feed/atom/inbox", + "options_misc_7": { + "message": "Εμφάνιση σελίδας υποδοχής για αναβάθμιση", "description": "" }, - "options_toolbar_12": { - "message": "!: Αναφορά ως ανεπιθύμητο, #: Απορρίμματα, και: Αρχείο, Shift + I: Επισήμανση ως διαβάσμενο", + "options_misc_8": { + "message": "Επαναφορά όλων των ρυθμίσεων στις εργοστασιακές ρυθμίσεις", "description": "" }, - "options_px": { - "message": "px", + "options_misc_10": { + "message": "Μόνο εμφάνιση στην επιφάνεια εργασίας και ηχητικές ειδοποιήσεις, όταν το ηλεκτρονικό ταχυδρομείου έχει φτάσει σε λιγότερο από (σε λεπτά):", "description": "" }, "options_misc_11": { "message": "Θέτοντας αυτήν την προτίμηση στο μηδέν, δεν θα λάμβανετε ειδοποιήσεις στην επιφάνεια εργασίας και ούτε ηχητικές ειδοποιήσεις. Ωστόσο, μπορείτε ακόμα να παίρνετε σήμα κοινοποιήσεων.", "description": "" }, - "options_notifications_20": { - "message": "Ο ήχος ορίζεται από τον χρήστη ", + "options_misc_12": { + "message": "Δεν περιλαμβάνονται στοιχεία σύνδεσης στο κείμενο επεξήγησης", "description": "" }, - "and": { - "message": "και", + "options_misc_13": { + "message": "Από προεπιλογή, ο κοινοποιών ενημερώνει κείμενο επεξήγησης του κουμπιού γραμμής εργαλείων με πληροφορίες σύνδεσης. Με την απενεργοποίηση της επιλογής αυτής, στο κείμενο επεξήγησης παραμένει η προεπιλεγμένη τιμή.", "description": "" }, - "options_tab_7": { - "message": "Πάντα να χρησιμοποιείτε κενό καρτελών αντί να ανοίγει μια νέα καρτέλα, όταν είναι ανοικτή στην καρτέλα ενεργοποιείται", + "options_misc_14": { + "message": "Να μην εμφανίζεται ο ακριβής αριθμός σημάτων όταν ο αριθμός των μη αναγνωσμένων μηνυμάτων ηλεκτρονικού ταχυδρομείου είναι μεγαλύτερος από 999", "description": "" }, - "options_toolbar_3": { - "message": "Άνοιγμα λογαριασμού Gmail αν μόνο ένας λογαριασμός είναι συνδεδεμένος ", + "options_misc_15": { + "message": "Open FAQs page on updates", "description": "" }, - "options_gmail_7": { - "message": "Σκηνικός λογαριασμός (/mail/u/5/)", + "options_plugins": { + "message": "Plug-ins:", "description": "" }, - "popup_msg_8_format": { - "message": "%d εβδομάδα(ες) πριν", + "options_plugins_1": { + "message": "Gmail labels and star button (experimental)", "description": "" }, - "options_toolbar": { - "message": "Γραμμη Εργαλειων:", + "options_plugins_2": { + "message": "This plugin displays the star button as well as thread's labels in the popup (expanded mode only).", "description": "" }, - "options_notifications_6": { - "message": "Περικόψτε ειδοποιήσεις περισσότερο από", + "options_px": { + "message": "px", "description": "" }, - "popup_wait": { - "message": "Περιμένετε...", + "options_empty": { + "message": "δεν ορίζεται", "description": "" }, - "tooltip_2": { - "message": "Μεσαίο (ή Ctrl + Left) κλικ: Ανανέωση όλων των λογαριασμών", + "options_button_test": { + "message": "Play", "description": "" }, - "options_notifications_29": { - "message": "Αυτή η επιλογή σχετίζεται με το δεξί κλικ μενού στο κουμπί της γραμμής εργαλείων -> απενεργοποιήσετε όλες τις ειδοποιήσεις -> προσαρμοσμένης χρονικής περιόδου.", + "options_button_reset": { + "message": "Reset Preferences", "description": "" }, - "options_tab_3": { - "message": "Άνοιγμα νέου λογαριασμού Gmail δίπλα στην ενεργή καρτέλα", + "popup_settings": { + "message": "Ρυθμίσεις", "description": "" }, - "options_gmail_8": { - "message": "Σήμανση ως αναγνωσμένο μήνυμα κατά την αρχειοθέτηση", + "popup_of": { + "message": "από", "description": "" }, - "options_toolbar_17": { - "message": "Άνοιγμα του κύριου Gmail λογαριασμου", + "popup_wait": { + "message": "Περιμένετε...", "description": "" }, - "options_notifications_7": { - "message": "χαρακτήρες για [τίτλος] και [περίληψη] πεδία.", + "popup_date_format": { + "message": "%mm %dd, %yy", "description": "" }, - "options_misc_10": { - "message": "Μόνο εμφάνιση στην επιφάνεια εργασίας και ηχητικές ειδοποιήσεις, όταν το ηλεκτρονικό ταχυδρομείου έχει φτάσει σε λιγότερο από (σε λεπτά):", + "popup_no_subject": { + "message": "(χωρίς θέμα)", "description": "" }, - "options_tab_8": { - "message": "Ignore opened Gmail tabs", + "popup_open_settings": { + "message": "Open Settings", "description": "" }, - "popup_no_subject": { - "message": "(χωρίς θέμα)", + "popup_open_inbox": { + "message": "Open Inbox", "description": "" }, - "msg_5": { - "message": "Επιλέξτε ένα αρχείο ήχου", + "popup_archive": { + "message": "Αρχείο", "description": "" }, - "popup_msg_2": { - "message": "1 λεπτό πριν", + "popup_spam": { + "message": "Spam", "description": "" }, - "popup_msg_16": { - "message": "Ιούλιος", + "popup_trash": { + "message": "Σκουπίδια", "description": "" }, - "label_8": { - "message": "Για 2 ώρες", + "popup_refresh": { + "message": "Ανανεώνω", "description": "" }, - "msg_4": { - "message": "Σημείωση: Για να λειτουργήσει σωστά το notifier, θα πρέπει να είστε συνδεδεμένοι στον Google λογαριασμό σας.", + "popup_read": { + "message": "Σημείωσε ως Διαβασμένο", "description": "" }, - "popup_msg_20": { - "message": "Νοέμβριος", + "popup_read_all": { + "message": "Σημείωση όλων ως Αναγνωσμένα", "description": "" }, - "options_toolbar_6": { - "message": "Εμφάνιση πλήρους περιεχομένου", + "popup_msg_1": { + "message": "μόλις τώρα", "description": "" }, - "options_gmail_11": { - "message": "Προσαρμοσμένες τροφοδοσίες:", + "popup_msg_2": { + "message": "1 λεπτό πριν", "description": "" }, - "options_tab_2": { - "message": "Μην ψάξετε σε άλλα παράθυρα του προγράμματος περιήγησης για ανοικτούς λογαριασμούς Gmail. Εάν το Gmail δεν είναι ανοικτό στο ενεργό παράθυρο, ανοίξτε μια νέα καρτέλα.", + "popup_msg_3_format": { + "message": "%d λεπτά πριν", "description": "" }, - "label_11": { - "message": "Συντάξτε ένα e-mail", + "popup_msg_4": { + "message": "1 ώρα πριν", "description": "" }, - "options_toolbar_7": { - "message": "Πλάτος γραμμής εργαλείων του πίνακα σε κατάσταση πλήρους περιεχομένου (σε εικονοστοιχεία):", + "popup_msg_5": { + "message": "ώρες πριν", "description": "" }, - "options_notifications_31": { - "message": "Προσαρμοσμένος ήχος ειδοποίησης", + "popup_msg_6": { + "message": "Εχθές", "description": "" }, - "options_timings_l5": { - "message": "Ελάχιστη περίοδος είναι 5 λεπτά.", + "popup_msg_7_format": { + "message": "%d ημέρες πριν", "description": "" }, - "options_misc": { - "message": "Διάφορα:", + "popup_msg_8_format": { + "message": "%d εβδομάδα(ες) πριν", "description": "" }, - "options_gmail_2": { - "message": "Ξεχωριστές ετικέτες με \",\" (κόμμα).", + "popup_msg_9_format": { + "message": "%d μήνα(ες) πρίν", "description": "" }, - "options_misc_4": { - "message": "Γκρι χρώμα για \"Μη Αναγνωσμένα\" και μπλε χρώμα για \"Αποσυνδεση\"", + "popup_msg_10": { + "message": "Ιανουάριος", "description": "" }, - "options_toolbar_13": { - "message": "Απόδοση e-mail ως HTML σε λειτουργία πλήρους περιεχομένου", + "popup_msg_11": { + "message": "Φεβρουάριος", "description": "" }, - "options_toolbar_16": { - "message": "Ανανέωση όλων των λογαριασμών", + "popup_msg_12": { + "message": "Μάρτιος", "description": "" }, - "options_gmail_6": { - "message": "Πενταδικός λογαριασμός (/mail/u/4/)", + "popup_msg_13": { + "message": "Απρίλιος", "description": "" }, "popup_msg_14": { "message": "Μάιος", "description": "" }, - "options_inshort": { - "message": "Πολλαπλές ετικέτες και λογαριασμοί κοινοποιών για το Google Mail (Gmail).", + "popup_msg_15": { + "message": "Ιούνιος", "description": "" }, - "options_misc_12": { - "message": "Δεν περιλαμβάνονται στοιχεία σύνδεσης στο κείμενο επεξήγησης", + "popup_msg_16": { + "message": "Ιούλιος", "description": "" }, - "options_tab_4": { - "message": "Άνοιγμα λογαριασμού Gmail στην ενεργή καρτέλα", + "popup_msg_17": { + "message": "Αύγουστος", "description": "" }, - "popup_msg_3_format": { - "message": "%d λεπτά πριν", + "popup_msg_18": { + "message": "Σεπτέμβριος", "description": "" }, - "label_12": { - "message": "Άνοιγμα Συχνών Ερωτήσεων", + "popup_msg_19": { + "message": "Οκτώβριος", "description": "" }, - "description": { - "message": "Πολλαπλές ετικέτες και κοινοποίηση λογαριασμού για το Google Mail (Gmail)", + "popup_msg_20": { + "message": "Νοέμβριος", "description": "" }, - "popup_spam": { - "message": "Spam", + "popup_msg_21": { + "message": "Δεκέμβριος", + "description": "" + }, + "settings_open_title": { + "message": "Ανοίξτε τις επιλογές (ρυθμίσεις) σελίδας", + "description": "" + }, + "settings_open_label": { + "message": "Ανοίξτε τις Επιλογές", + "description": "" + }, + "gmail": { + "message": "Notifier for Gmail™", "description": "" } } \ No newline at end of file diff --git a/JPM/src/_locales/en/messages.json b/v2/_locales/en/messages.json similarity index 79% rename from JPM/src/_locales/en/messages.json rename to v2/_locales/en/messages.json index 27f3c252..c8807a1a 100644 --- a/JPM/src/_locales/en/messages.json +++ b/v2/_locales/en/messages.json @@ -6,7 +6,7 @@ "message": "Notifier for Gmail™" }, "tooltip_1": { - "message": "Left click: Open Gmail or mail preview panel" + "message": "Left click: Open Gmail™ or mail preview panel" }, "tooltip_2": { "message": "Middle (or Ctrl+Left) click: Refresh all accounts" @@ -15,13 +15,13 @@ "message": "Right click: Account selections" }, "description": { - "message": "Multiple label and account notifier for Google Mail (Gmail)" + "message": "Multiple label and account notifier for Google Mail (Gmail™)" }, "log_in_to_your_account": { - "message": "Please sign-in to your Gmail account" + "message": "Please sign-in to your Gmail™ account" }, "msg_1": { - "message": "Tab is already open. Click on the toolbar button to open Gmail in a new tab, or to switch to an existing Gmail tab." + "message": "Tab is already open. Click on the toolbar button to open Gmail™ in a new tab, or to switch to an existing Gmail™ tab." }, "msg_2": { "message": "Link is copied to the clipboard." @@ -67,7 +67,7 @@ "message": "For a custom time period" }, "label_10": { - "message": "Enable notifications" + "message": "Enable notifications (session)" }, "label_11": { "message": "Compose an email" @@ -89,20 +89,20 @@ "message": "Please log into your account" }, "notification": { - "message": "From: [author_email][break]Title: [title][break]Summary: [summary]" + "message": "From: [author_email][break] Title: [title][break] Summary: [summary]" }, "options_title": { "message": "Options - Gmail™ Notifier" }, "options_inshort": { - "message": "Multiple label and account notifier for Google Mail (Gmail)." + "message": "Multiple label and account notifier for Google Mail (Gmail™)." }, "options_donation": { - "message": "Make a Donation" + "message": "Support Development" }, "options_timings": { - "message": "Timings" + "message": "Timings:" }, "options_timings_l1": { "message": "Check for new emails every (in seconds):" @@ -129,7 +129,7 @@ "message": "Set the value to zero for no email check until the first manual refresh [Not available on Safari]." }, "options_gmail": { - "message": "Gmail:" + "message": "Gmail™:" }, "options_gmail_1": { "message": "Primary account (/mail/u/0/)" @@ -155,8 +155,8 @@ "options_gmail_8": { "message": "Mark message as read when archiving it" }, - "options_gmail_9": { - "message": "Some popular labels: \"inbox\", \"important\", \"^smartlabel_personal\", \"^smartlabel_newsletter\", \"^smartlabel_notification\", and \"^smartlabel_group\"" + "options_gmail_15": { + "message": "Some popular labels:" }, "options_gmail_10": { "message": "Receive notifications for the following labels and accounts:" @@ -167,6 +167,12 @@ "options_gmail_12": { "message": "Separate feeds by \",\" (Comma). Sample feed: https://mail.google.com/mail/u/0/feed/atom/inbox" }, + "options_gmail_13": { + "message": "Note: maximum number for all labels except \"inbox\" is 20 (Google feeds only supply the 20 newest entries)" + }, + "options_gmail_14": { + "message": "Note: for the Notifier to listen for more than 5 accounts, add feeds URLs to the \"Custom feeds\" field. For instance to listen to the 6 and 7th accounts add: https://mail.google.com/mail/u/6/feed/atom/inbox, https://mail.google.com/mail/u/7/feed/atom/inbox" + }, "options_notifications": { "message": "Notifications:" }, @@ -215,21 +221,8 @@ "options_notifications_15": { "message": "Default sound notification is" }, - "options_notifications_31": { - "message": "Custom sound notification" - }, - "options_notifications_32": { - "message": "name or email contains" - }, - "options_notifications_33": { - "message": "email title contains" - }, - "options_notifications_34": { - "message": "email summary contains" - }, - "options_notifications_16": { - "message": "Gmail Notifier default alert" + "message": "Gmail™ Notifier default alert" }, "options_notifications_17": { "message": "Checker Plus bell alert" @@ -276,35 +269,74 @@ "options_notifications_30": { "message": "Combine all concurrent desktop notifications into a single notification" }, + "options_notifications_31": { + "message": "Custom sound notification" + }, + "options_notifications_32": { + "message": "name or email contains" + }, + "options_notifications_33": { + "message": "email title contains" + }, + "options_notifications_34": { + "message": "email summary contains" + }, + "options_notifications_36": { + "message": "Ask Gmail™ to prevent 'inbox.google.com' redirection" + }, + "options_notifications_37": { + "message": "Display Badge number" + }, + "options_notifications_38": { + "message": "Faster actions (mark as read, delete, ...) (Consider actions to be resolved when headers are received)" + }, + "options_notifications_40": { + "message": "Allow quick actions from notification box (maximum two actions) (Chrome only)" + }, + "options_notifications_41": { + "message": "Mark as Read" + }, + "options_notifications_42": { + "message": "Archive" + }, + "options_notifications_43": { + "message": "Trash" + }, "options_tab": { "message": "Tab Opening:" }, "options_tab_1": { - "message": "Search for an open Gmail account only on the active window" + "message": "Search for an open Gmail™ account only on the active window" }, "options_tab_2": { - "message": "Do not search other browser windows for open Gmail accounts. If Gmail is not open in the active window, open a new tab." + "message": "Do not search other browser windows for open Gmail™ accounts. If Gmail™ is not open in the active window, open a new tab." }, "options_tab_3": { - "message": "Open new Gmail account next to the active tab" + "message": "Open new Gmail™ account next to the active tab" }, "options_tab_4": { - "message": "Open Gmail account in the active tab" + "message": "Open Gmail™ account in the active tab" }, "options_tab_5": { - "message": "Open Gmail account in a background tab" + "message": "Open Gmail™ account in a background tab" }, "options_tab_6": { - "message": "Open Gmail account in a new window" + "message": "Open Gmail™ account in a new window" }, "options_tab_7": { "message": "Always use blank tabs instead of opening a new tab when open in tab is activated" }, "options_tab_8": { - "message": "Ignore opened Gmail tabs" + "message": "Ignore opened Gmail™ tabs" }, "options_tab_9": { - "message": "When unchecked, Gmail Notifier checks either active window or all open windows for open instance of Gmail and switch to the tab when tab opening is requested." + "message": "When unchecked, Gmail™ Notifier checks either active window or all open windows for open instance of Gmail™ and switch to the tab when tab opening is requested." + }, + "options_tab_10": { + "message": "Open emails in basic HTML mode" + }, + "options_tab_11": { + "message": "Open the newest unread email instead of opening the INBOX folder" }, "options_toolbar": { "message": "Toolbar:" @@ -316,7 +348,10 @@ "message": "Always open email preview panel" }, "options_toolbar_3": { - "message": "Open Gmail account if only one account is logged-in" + "message": "Open Gmail™ account if only one account is logged-in" + }, + "options_toolbar_18": { + "message": "Open Gmail™ account (forced)" }, "options_toolbar_4": { "message": "Toolbar panel mode" @@ -358,7 +393,7 @@ "message": "Refresh all accounts" }, "options_toolbar_17": { - "message": "Open primary Gmail account" + "message": "Open primary Gmail™ account" }, "options_misc": { "message": "Miscellaneous:" @@ -382,7 +417,7 @@ "message": "Red color for \"No Unread\" and gray color for \"Disconnected\"" }, "options_misc_6": { - "message": "Show desktop notification to warn that Gmail is already opened in the active tab" + "message": "Show desktop notification to warn that Gmail™ is already opened in the active tab" }, "options_misc_7": { "message": "Show welcome page on upgrade" @@ -405,13 +440,30 @@ "options_misc_14": { "message": "Do not show the exact badge number when the number of unread emails is greater than 999" }, + "options_misc_15": { + "message": "Open FAQs page on updates" + }, + "options_plugins": { + "message": "Plug-ins:" + }, + "options_plugins_1": { + "message": "Gmail™ labels and star button (experimental)" + }, + "options_plugins_2": { + "message": "This plugin displays the star button as well as thread's labels in the popup (expanded mode only)." + }, "options_px": { "message": "px" }, "options_empty": { "message": "not defined" }, - + "options_button_test": { + "message": "Play" + }, + "options_button_reset": { + "message": "Reset Preferences" + }, "popup_settings": { "message": "settings" }, @@ -428,10 +480,10 @@ "message": "(no subject)" }, "popup_open_settings": { - "message": "Open settings" + "message": "Open Settings" }, "popup_open_inbox": { - "message": "Open inbox" + "message": "Open Inbox" }, "popup_archive": { "message": "Archive" diff --git a/v2/_locales/es/messages.json b/v2/_locales/es/messages.json new file mode 100644 index 00000000..1cc13708 --- /dev/null +++ b/v2/_locales/es/messages.json @@ -0,0 +1,758 @@ +{ + "toolbar_label": { + "message": "Notifier for Gmail™", + "description": "" + }, + "tooltip_1": { + "message": "Click izquierdo: abrir Gmail o el panel de vista previa", + "description": "" + }, + "tooltip_2": { + "message": "Click medio (o Ctrl+Click izquierdo): actualizar todas las cuentas", + "description": "" + }, + "tooltip_3": { + "message": "Click derecho: selección de cuenta", + "description": "" + }, + "description": { + "message": "Notificador para múltiples cuentas y etiquetas de Google Mail (Gmail)", + "description": "" + }, + "log_in_to_your_account": { + "message": "Por favor, inicia sesión en tu cuenta de Gmail", + "description": "" + }, + "msg_1": { + "message": "La pestaña ya está abierta. Haz click en el botón de la barra de herramientas para abrir Gmail en una nueva pestaña, o para cambiar a una pestaña de Gmail ya existente.", + "description": "" + }, + "msg_2": { + "message": "El enlace se copió al portapapeles.", + "description": "" + }, + "msg_3": { + "message": "El texto seleccionado se copió al portapapeles.", + "description": "" + }, + "msg_4": { + "message": "Aviso: para que el notificador funcione correctamente, debes haber iniciado sesión en tu cuenta Google.", + "description": "" + }, + "msg_5": { + "message": "Elige un archivo de sonido", + "description": "" + }, + "label_1": { + "message": "Actualizar", + "description": "" + }, + "label_2": { + "message": "Configuración", + "description": "" + }, + "label_3": { + "message": "Desactivar todas las notificaciones", + "description": "" + }, + "label_4": { + "message": "Durante 5 minutos", + "description": "" + }, + "label_5": { + "message": "Durante 15 minutos", + "description": "" + }, + "label_6": { + "message": "Durante 30 minutos", + "description": "" + }, + "label_7": { + "message": "Durante 1 hora", + "description": "" + }, + "label_8": { + "message": "Durante 2 horas", + "description": "" + }, + "label_9": { + "message": "Durante 5 horas", + "description": "" + }, + "label_13": { + "message": "Por un período de tiempo personalizado", + "description": "" + }, + "label_10": { + "message": "Enable notifications (session)", + "description": "" + }, + "label_11": { + "message": "Redactar un correo nuevo", + "description": "" + }, + "label_12": { + "message": "Abrir FAQs", + "description": "" + }, + "label_14": { + "message": "Cuentas que han iniciado sesión", + "description": "" + }, + "unknown": { + "message": "desconocido", + "description": "" + }, + "and": { + "message": "y", + "description": "" + }, + "log_into_your_account": { + "message": "Por favor, inicia sesión en tu cuenta", + "description": "" + }, + "notification": { + "message": "De: [author_email][break]Asunto: [title][break]Resumen: [summary]", + "description": "" + }, + "options_title": { + "message": "Opciones - Gmail™ Notifier", + "description": "" + }, + "options_inshort": { + "message": "Notificador para Google Mail (Gmail), con soporte de múltiples cuentas y etiquetas.", + "description": "" + }, + "options_donation": { + "message": "Support Development", + "description": "" + }, + "options_timings": { + "message": "Timings:", + "description": "" + }, + "options_timings_l1": { + "message": "Verificar si hay correos nuevos cada (en segundos):", + "description": "" + }, + "options_timings_l2": { + "message": "El período mínimo es 10 segundos", + "description": "" + }, + "options_timings_l3": { + "message": "Recordarme que tengo mails sin leer cada (en minutos):", + "description": "" + }, + "options_timings_l4": { + "message": "Pon el valor a cero para no recibir recordatorios periódicamente", + "description": "" + }, + "options_timings_l5": { + "message": "El período mínimo es 5 minutos", + "description": "" + }, + "options_timings_l6": { + "message": "Valores distintos de cero activan las notificaciones sonoras y de escritorio (como cuando llega correo nuevo) constantemente mientras tengas correo sin leer.", + "description": "" + }, + "options_timings_l7": { + "message": "No verificar si hay correos nuevos al inicio durante (en segundos):", + "description": "" + }, + "options_timings_l8": { + "message": "Configura este valor a cero para evitar chequear el e-mail hasta la primer actualización manual (No disponible en Safari).", + "description": "" + }, + "options_gmail": { + "message": "Gmail:", + "description": "" + }, + "options_gmail_1": { + "message": "Cuenta principal (/mail/u/0/)", + "description": "" + }, + "options_gmail_2": { + "message": "Separa las etiquetas con \",\" (coma).", + "description": "" + }, + "options_gmail_3": { + "message": "Cuenta secundaria (/mail/u/1/)", + "description": "" + }, + "options_gmail_4": { + "message": "Tercera cuenta (/mail/u/2/)", + "description": "" + }, + "options_gmail_5": { + "message": "Cuarta cuenta (/mail/u/3/)", + "description": "" + }, + "options_gmail_6": { + "message": "Quinta cuenta ((/mail/u/4/)", + "description": "" + }, + "options_gmail_7": { + "message": "Sexta cuenta ((/mail/u/5/)", + "description": "" + }, + "options_gmail_8": { + "message": "Marcar mensaje como leído al archivarlo", + "description": "" + }, + "options_gmail_15": { + "message": "Some popular labels:", + "description": "" + }, + "options_gmail_10": { + "message": "Recibir notificaciones para las siguientes etiquetas y cuentas:", + "description": "" + }, + "options_gmail_11": { + "message": "Feeds personalizados:", + "description": "" + }, + "options_gmail_12": { + "message": "Separa los feeds con \",\" (coma). Feed de ejemplo: https://mail.google.com/mail/u/0/feed/atom/inbox", + "description": "" + }, + "options_gmail_13": { + "message": "Note: maximum number for all labels except \"inbox\" is 20 (Google feeds only supply the 20 newest entries)", + "description": "" + }, + "options_gmail_14": { + "message": "Note: for the Notifier to listen for more than 5 accounts, add feeds URLs to the \"Custom feeds\" field. For instance to listen to the 6 and 7th accounts add: https://mail.google.com/mail/u/6/feed/atom/inbox, https://mail.google.com/mail/u/7/feed/atom/inbox", + "description": "" + }, + "options_notifications": { + "message": "Notificaciones:", + "description": "" + }, + "options_notifications_1": { + "message": "Mostrar notificaciones de escritorio cuando haya correos nuevos", + "description": "" + }, + "options_notifications_2": { + "message": "Mostrar notificaciones de escritorio durante (en segundos):", + "description": "" + }, + "options_notifications_3": { + "message": "Esta opción podría no funcionar en tu sistema operativo.", + "description": "" + }, + "options_notifications_4": { + "message": "Formato de notificaciones:", + "description": "" + }, + "options_notifications_5": { + "message": "Variables disponibles:", + "description": "" + }, + "options_notifications_6": { + "message": "Cortar notificaciones más largas que", + "description": "" + }, + "options_notifications_7": { + "message": "caracteres para los campos [title] y [summary].", + "description": "" + }, + "options_notifications_8": { + "message": "Para no cortar nada, usa un número grande aquí.", + "description": "" + }, + "options_notifications_9": { + "message": "Reproducir sonido de aviso cuando haya correos nuevos", + "description": "" + }, + "options_notifications_10": { + "message": "Aviso para usuarios de Mac. A partir de Firefox 28.0, todas las notificaciones de escritorio son controladas por el Centro de Notificaciones Mac, lo que causa un sonido de alerta extra. Es necesario desactivar esta notificación sonora, o bien la que es generada por el Centro de Notificaciones.", + "description": "" + }, + "options_notifications_11": { + "message": "Mostrar notificación de la barra de tareas de Windows o del Dock de Mac OS", + "description": "" + }, + "options_notifications_12": { + "message": "Las notificaciones en la barra de tareas no están soportadas de momento en sistemas operativos Linux.", + "description": "" + }, + "options_notifications_13": { + "message": "Abrir panel de la barra de herramientas cuando clickeo en el ícono de notificación de la barra de tareas (sólo Windows, beta)", + "description": "" + }, + "options_notifications_14": { + "message": "Esta característica es extremadamente experimental y puede volver tu navegador inestable. [Restart required].", + "description": "" + }, + "options_notifications_15": { + "message": "El sonido de notificación por defecto es", + "description": "" + }, + "options_notifications_16": { + "message": "Aviso por defecto de Gmail Notifier", + "description": "" + }, + "options_notifications_17": { + "message": "Aviso \"bell\" de Checker Plus", + "description": "" + }, + "options_notifications_18": { + "message": "Aviso \"ding\" de Checker Plus", + "description": "" + }, + "options_notifications_19": { + "message": "Aviso de correo de Windows", + "description": "" + }, + "options_notifications_20": { + "message": "Sonido definido por el usuario", + "description": "" + }, + "options_notifications_21": { + "message": "El sonido definido por el usuario es", + "description": "" + }, + "options_notifications_22": { + "message": "Si tu navegador no está reproduciendo el sonido de notificación personalizado, intenta convertirlo al formato WAV usando una herramienta de conversión online.", + "description": "" + }, + "options_notifications_35": { + "message": "Para elegir un nuevo sonido personalizado, elige en primer lugar un sonido incluído y luego cambia la opción nuevamente a \"sonido personalizado\"", + "description": "" + }, + "options_notifications_23": { + "message": "El volumen de las notificaciones sonoras es", + "description": "" + }, + "options_notifications_24": { + "message": "\"Volumen\" es un número entre 0 y 100, donde 100 es el volumen más alto (por defecto).", + "description": "" + }, + "options_notifications_25": { + "message": "En Safari, es muy probable que las notificaciones sonoras por defecto no se reproduzcan correctamente. En tal caso, usa un archivo de sonido personalizado.", + "description": "" + }, + "options_notifications_26": { + "message": "Siempre mostrar notificación en la bandeja de sistema (sólo Windows)", + "description": "" + }, + "options_notifications_27": { + "message": "La notificación en la bandeja del sistema será mostrada incluso si no hay mensajes sin leer.", + "description": "" + }, + "options_notifications_28": { + "message": "Deshabilitar todas las notificaciones por un período de tiempo personalizado (en minutos):", + "description": "" + }, + "options_notifications_29": { + "message": "Esta opción está relacionada con el menú que se muestra al hacer click derecho sobre el botón de la barra de herramientas (deshabilitar todas las notificaciones -> período de tiempo personalizado).", + "description": "" + }, + "options_notifications_30": { + "message": "Combinar todas las notificaciones de escritorio en una única", + "description": "" + }, + "options_notifications_31": { + "message": "Custom sound notification", + "description": "" + }, + "options_notifications_32": { + "message": "name or email contains", + "description": "" + }, + "options_notifications_33": { + "message": "El asunto del correo contiene", + "description": "" + }, + "options_notifications_34": { + "message": "El resumen del correo contiene", + "description": "" + }, + "options_notifications_36": { + "message": "Ask Gmail to prevent 'inbox.google.com' redirection", + "description": "" + }, + "options_notifications_37": { + "message": "Display Badge number", + "description": "" + }, + "options_notifications_38": { + "message": "Faster actions (mark as read, delete, ...) (Consider actions to be resolved when headers are received)", + "description": "" + }, + "options_notifications_40": { + "message": "Allow quick actions from notification box (maximum two actions) (Chrome only)", + "description": "" + }, + "options_notifications_41": { + "message": "Mark as Read", + "description": "" + }, + "options_notifications_42": { + "message": "Archive", + "description": "" + }, + "options_notifications_43": { + "message": "Trash", + "description": "" + }, + "options_tab": { + "message": "Apertura de pestañas:", + "description": "" + }, + "options_tab_1": { + "message": "Buscar una cuenta de Gmail abierta sólo en la ventana activa", + "description": "" + }, + "options_tab_2": { + "message": "No buscar cuentas de Gmail abiertas en otras ventanas del navegador. Si Gmail no está abierto en la ventana activa, abrir una nueva pestaña.", + "description": "" + }, + "options_tab_3": { + "message": "Abrir una nueva cuenta Gmail junto a la pestaña activa", + "description": "" + }, + "options_tab_4": { + "message": "Abrir cuenta Gmail en la pestaña activa", + "description": "" + }, + "options_tab_5": { + "message": "Abrir la cuenta Gmail en una pestaña inactiva", + "description": "" + }, + "options_tab_6": { + "message": "Abrir cuenta Gmail en una nueva ventana", + "description": "" + }, + "options_tab_7": { + "message": "Siempre usar pestañas vacías en lugar de abrir una nueva cuando \"abrir en pestaña\" esté activado", + "description": "" + }, + "options_tab_8": { + "message": "Ignorar pestañas de Gmail abiertas", + "description": "" + }, + "options_tab_9": { + "message": "Si está desactivado, Gmail Notifier chequea todas las ventanas activas por una pestaña de Gmail abierta y cambia a ella cuando se solicita abrir una pestaña nueva.", + "description": "" + }, + "options_tab_10": { + "message": "Open emails in basic HTML mode", + "description": "" + }, + "options_toolbar": { + "message": "Barra de herramientas:", + "description": "" + }, + "options_toolbar_1": { + "message": "Comportamiento del botón de la barra de herramientas", + "description": "" + }, + "options_toolbar_2": { + "message": "Siempre abrir el panel de vista previa de correo", + "description": "" + }, + "options_toolbar_3": { + "message": "Abrir cuenta Gmail si sólo una cuenta ha iniciado sesión", + "description": "" + }, + "options_toolbar_18": { + "message": "Open Gmail account (forced)", + "description": "" + }, + "options_toolbar_4": { + "message": "Modo del panel de vista previa", + "description": "" + }, + "options_toolbar_5": { + "message": "Mostrar sólo el resumen", + "description": "" + }, + "options_toolbar_6": { + "message": "Mostrar contenido completo", + "description": "" + }, + "options_toolbar_7": { + "message": "Ancho del panel de vista previa en modo de contenido completo (en pixels):", + "description": "" + }, + "options_toolbar_8": { + "message": "El ancho mínimo es 500px.", + "description": "" + }, + "options_toolbar_9": { + "message": "Alto del panel de vista previa en modo contenido completo (en pixels):", + "description": "" + }, + "options_toolbar_10": { + "message": "El alto mínimo es 500px.", + "description": "" + }, + "options_toolbar_11": { + "message": "Permitir atajos de teclado en el panel de vista previa", + "description": "" + }, + "options_toolbar_12": { + "message": "!: Marcar como spam, #:Eliminar, e: Archivar, Shift + i: Marcar como leído", + "description": "" + }, + "options_toolbar_13": { + "message": "Visualizar los mensajes como HTML en el modo contenido completo", + "description": "" + }, + "options_toolbar_14": { + "message": "Si prefieres visualizar los mensajes como sólo texto, desactiva esta casilla.", + "description": "" + }, + "options_toolbar_15": { + "message": "Click medio en el botón de la barra de herramientas para", + "description": "" + }, + "options_toolbar_16": { + "message": "Actualizar todas las cuentas", + "description": "" + }, + "options_toolbar_17": { + "message": "Abrir cuenta Gmail principal", + "description": "" + }, + "options_misc": { + "message": "Otros:", + "description": "" + }, + "options_misc_1": { + "message": "Ordenar cuentas alfabéticamente", + "description": "" + }, + "options_misc_2": { + "message": "El orden por defecto es de acuerdo al momento de inicio de sesión.", + "description": "" + }, + "options_misc_3": { + "message": "El esquema de colores de la barra de herramientas es:", + "description": "" + }, + "options_misc_4": { + "message": "Gris para \"Sin mensajes por leer\" y azul para \"Desconectado\"", + "description": "" + }, + "options_misc_5": { + "message": "Azul para \"Sin mensajes por leer\" y gris para \"Desconectado\"", + "description": "" + }, + "options_misc_9": { + "message": "Rojo para \"Sin mensajes por leer\" y gris para \"Desconectado\"", + "description": "" + }, + "options_misc_6": { + "message": "Mostrar notificación de escritorio para advertir que Gmail ya está abierto en la pestaña activa", + "description": "" + }, + "options_misc_7": { + "message": "Mostrar página de bienvenida al actualizar versión", + "description": "" + }, + "options_misc_8": { + "message": "Reestablecer toda la configuración", + "description": "" + }, + "options_misc_10": { + "message": "Sólo activar notificaciones sonoras y de escritorio cuando haya llegado correo en menos de (en minutos):", + "description": "" + }, + "options_misc_11": { + "message": "Poniendo este valor a cero, no recibirás notificaciones sonoras o de escritorio, sin embargo, todavía recibirás notificaciones en el ícono de la barra de herramientas.", + "description": "" + }, + "options_misc_12": { + "message": "No incluir detalles de cuenta en el texto que se muestra al pasar el puntero sobre el ícono", + "description": "" + }, + "options_misc_13": { + "message": "Por defecto, el texto que se muestra al pasar el puntero sobre el ícono se actualiza con la información de la cuenta. Desmarcando esta casilla, permanecerá sin cambios.", + "description": "" + }, + "options_misc_14": { + "message": "No mostrar el número exacto de correos no leídos en el icono cuando este sea mayor que 999", + "description": "" + }, + "options_misc_15": { + "message": "Open FAQs page on updates", + "description": "" + }, + "options_plugins": { + "message": "Plug-ins:", + "description": "" + }, + "options_plugins_1": { + "message": "Gmail labels and star button (experimental)", + "description": "" + }, + "options_plugins_2": { + "message": "This plugin displays the star button as well as thread's labels in the popup (expanded mode only).", + "description": "" + }, + "options_px": { + "message": "px", + "description": "" + }, + "options_empty": { + "message": "sin definir", + "description": "" + }, + "options_button_test": { + "message": "Play", + "description": "" + }, + "options_button_reset": { + "message": "Reset Preferences", + "description": "" + }, + "popup_settings": { + "message": "ajustes", + "description": "" + }, + "popup_of": { + "message": "de", + "description": "" + }, + "popup_wait": { + "message": "Espera...", + "description": "" + }, + "popup_date_format": { + "message": "%dd %mm, %yy", + "description": "" + }, + "popup_no_subject": { + "message": "(sin asunto)", + "description": "" + }, + "popup_open_settings": { + "message": "Abrir configuración", + "description": "" + }, + "popup_open_inbox": { + "message": "Abrir bandeja de entrada", + "description": "" + }, + "popup_archive": { + "message": "Archivar", + "description": "" + }, + "popup_spam": { + "message": "Spam", + "description": "" + }, + "popup_trash": { + "message": "Eliminar", + "description": "" + }, + "popup_refresh": { + "message": "Actualizar", + "description": "" + }, + "popup_read": { + "message": "Marcar como leído", + "description": "" + }, + "popup_read_all": { + "message": "Marcar todos como leídos", + "description": "" + }, + "popup_msg_1": { + "message": "ahora", + "description": "" + }, + "popup_msg_2": { + "message": "hace 1 minuto", + "description": "" + }, + "popup_msg_3_format": { + "message": "hace %d minutos", + "description": "" + }, + "popup_msg_4": { + "message": "hace 1 hora", + "description": "" + }, + "popup_msg_5": { + "message": "hace algunas horas", + "description": "" + }, + "popup_msg_6": { + "message": "Ayer", + "description": "" + }, + "popup_msg_7_format": { + "message": "hace %d días", + "description": "" + }, + "popup_msg_8_format": { + "message": "hace %d semana(s)", + "description": "" + }, + "popup_msg_9_format": { + "message": "hace %d mes(es)", + "description": "" + }, + "popup_msg_10": { + "message": "Enero", + "description": "" + }, + "popup_msg_11": { + "message": "Febrero", + "description": "" + }, + "popup_msg_12": { + "message": "Marzo", + "description": "" + }, + "popup_msg_13": { + "message": "Abril", + "description": "" + }, + "popup_msg_14": { + "message": "Mayo", + "description": "" + }, + "popup_msg_15": { + "message": "Junio", + "description": "" + }, + "popup_msg_16": { + "message": "Julio", + "description": "" + }, + "popup_msg_17": { + "message": "Agosto", + "description": "" + }, + "popup_msg_18": { + "message": "Septiembre", + "description": "" + }, + "popup_msg_19": { + "message": "Octubre", + "description": "" + }, + "popup_msg_20": { + "message": "Noviembre", + "description": "" + }, + "popup_msg_21": { + "message": "Diciembre", + "description": "" + }, + "settings_open_title": { + "message": "Abrir página de opciones (ajustes)", + "description": "" + }, + "settings_open_label": { + "message": "Abrir opciones", + "description": "" + }, + "gmail": { + "message": "Notifier for Gmail™", + "description": "" + } +} \ No newline at end of file diff --git a/JPM/builds/unpacked/chrome/_locales/fr/messages.json b/v2/_locales/fr/messages.json similarity index 67% rename from JPM/builds/unpacked/chrome/_locales/fr/messages.json rename to v2/_locales/fr/messages.json index afd61a1a..11391aaf 100644 --- a/JPM/builds/unpacked/chrome/_locales/fr/messages.json +++ b/v2/_locales/fr/messages.json @@ -1,690 +1,769 @@ { - "label_9": { - "message": "Pour 5 heures", + "gmail": { + "message": "Notifieur pour Gmail™", "description": "" }, - "options_notifications_19": { - "message": "Alerte e-mail Windows", + "toolbar_label": { + "message": "Notifieur pour Gmail™", "description": "" }, - "options_notifications_17": { - "message": "Alerte sonore \"Bell\" de l'extension \"Checker Plus\" pour Google Chrome", + "tooltip_1": { + "message": "Clic gauche : Ouvrir Gmail™ ou le panneau de prévisualisation d'e-mail", "description": "" }, - "options_notifications_13": { - "message": "Ouvrir le panneau de la barre d'outils sur clic de l'icône de notification dans la barre de tâches (uniquement sous Windows, beta)", + "tooltip_2": { + "message": "Clic milieu (ou Ctrl+clic gauche) : Rafraîchir tous les comptes", "description": "" }, - "options_notifications_30": { - "message": "Combine all concurrent desktop notifications into a single notification", + "tooltip_3": { + "message": "Clic droit : Sélections des comptes", "description": "" }, - "settings_open_label": { - "message": "Open Options", + "description": { + "message": "Notifieur multi-comptes et multi-libellés pour Google Mail (Gmail™)", "description": "" }, - "options_timings_l7": { - "message": "Ne pas relever les nouveaux e-mails au démarrage avant (en secondes) :", + "log_in_to_your_account": { + "message": "Veuillez vous connecter à votre compte Gmail™", "description": "" }, - "label_4": { - "message": "Pour 5 min", + "msg_1": { + "message": "Un onglet est déjà ouvert. Cliquez sur le bouton de la barre d'outils pour ouvrir Gmail™ dans un nouvel onglet ou basculer sur un onglet Gmail™ existant.", "description": "" }, - "options_timings_l3": { - "message": "Rappeler les e-mails non lus toutes les (en minutes) :", + "msg_2": { + "message": "Le lien est copié dans le presse-papiers.", "description": "" }, - "popup_msg_4": { - "message": "1 heure plus tôt", + "msg_3": { + "message": "Le texte sélectionné est copié dans le presse-papiers.", "description": "" }, - "options_gmail_1": { - "message": "Compte principal (/mail/u/0/)", + "msg_4": { + "message": "Remarque : Pour que le notifieur fonctionne correctement, vous devez être connecté à votre compte Google.", "description": "" }, - "options_gmail_10": { - "message": "Recevoir les notifications pour les libellés et comptes suivants :", + "msg_5": { + "message": "Choisir un fichier son audio", "description": "" }, - "options_notifications_1": { - "message": "Afficher la notification sur le bureau pour les nouveaux e-mails", + "label_1": { + "message": "Rafraîchir", "description": "" }, - "options_notifications_9": { - "message": "Jouer l'alerte sonore pour les nouveaux e-mails", + "label_2": { + "message": "Paramètres", + "description": "" + }, + "label_3": { + "message": "Désactiver toutes les notifications", + "description": "" + }, + "label_4": { + "message": "Pour 5 min", + "description": "" + }, + "label_5": { + "message": "Pour 15 min", "description": "" }, "label_6": { "message": "Pour 30 min", "description": "" }, - "options_misc_8": { - "message": "Réinitialiser tous les paramètres aux valeurs par défaut", + "label_7": { + "message": "Pour 1 heure", "description": "" }, - "options_notifications_28": { - "message": "Disable all notifications for a custom time period (in minutes):", + "label_8": { + "message": "Pour 2 heures", "description": "" }, - "options_timings_l4": { - "message": "Positionner la valeur à zéro pour tous les rappels non périodiques.", + "label_9": { + "message": "Pour 5 heures", "description": "" }, - "options_notifications_32": { - "message": "name or email contains", + "label_13": { + "message": "Pour une période de temps personnalisée", "description": "" }, - "options_tab_6": { - "message": "Ouvrir un compte Gmail dans une nouvelle fenêtre", + "label_10": { + "message": "Activer les notifications (session)", "description": "" }, - "options_notifications_25": { - "message": "Dans Safari, il est probable que les notfications sonores par défaut ne soient pas jouées correctement. Si c'est le cas, utilisez un fichier son personnel comme notification.", + "label_11": { + "message": "Rédiger un e-mail", "description": "" }, - "options_toolbar_15": { - "message": "Cliquer avec le bouton du milieu sur bouton de la barre d'outils pour", + "label_12": { + "message": "Ouvrir la FAQ", "description": "" }, - "options_toolbar_10": { - "message": "La hauteur minimale est de 500 pixels.", + "label_14": { + "message": "Comptes connectés", "description": "" }, - "popup_msg_10": { - "message": "Janvier", + "unknown": { + "message": "inconnu", "description": "" }, - "options_notifications_26": { - "message": "Toujours afficher la notification dans la zone de notification système (uniquement sous Windows)", + "and": { + "message": " et ", "description": "" }, - "label_3": { - "message": "Désactiver toutes les notifications", + "log_into_your_account": { + "message": "Veuillez vous connecter à votre compte", "description": "" }, - "label_13": { - "message": "For a custom time period", + "notification": { + "message": "De : [author_email][break] Objet : [title][break] Résumé : [summary]", "description": "" }, - "options_empty": { - "message": "non défini", + "options_title": { + "message": "Options - Gmail™ Notifier", "description": "" }, - "options_notifications_3": { - "message": "Cette option peut ne pas fonctionner sur votre système d'exploitation.", + "options_inshort": { + "message": "Notifieur multi-comptes et multi-libellés pour Google Mail (Gmail™).", + "description": "" + }, + "options_donation": { + "message": "Faire un don", "description": "" }, "options_timings": { - "message": "Temporisations", + "message": "Temporisations ", "description": "" }, - "options_gmail_5": { - "message": "4ème compte (/mail/u/3/)", + "options_timings_l1": { + "message": "Relever les nouveaux e-mails tous les (en secondes) :", "description": "" }, - "label_5": { - "message": "Pour 15 min", + "options_timings_l2": { + "message": "La période minimum est de 10 secondes.", "description": "" }, - "options_misc_9": { - "message": "Couleur rouge pour \"Tous lus\" et couleur gris pour \"Déconnecté\"", + "options_timings_l3": { + "message": "Rappeler les e-mails non lus toutes les (en minutes) :", "description": "" }, - "popup_msg_5": { - "message": "heures plus tôt", + "options_timings_l4": { + "message": "Positionner la valeur à zéro pour tous les rappels non périodiques.", "description": "" }, - "options_notifications_27": { - "message": "La notification dans la zone de notification système sera affichée même si tous les messages sont lus.", + "options_timings_l5": { + "message": "La période minimum est de 5 minutes.", "description": "" }, - "options_misc_1": { - "message": "Trier les comptes par ordre alphabétique", + "options_timings_l6": { + "message": "Une valeur non nulle déclenche une notification sur le bureau et une alerte sonore (similaire à l'arrivée d'un nouvel e-mail) de façon perpétuelle si vous avez un ou plusieurs e-mails non lus.", "description": "" }, - "tooltip_1": { - "message": "Clic gauche : Ouvrir Gmail ou le panneau de prévisualisation d'e-mail", + "options_timings_l7": { + "message": "Ne pas relever les nouveaux e-mails au démarrage avant (en secondes) :", "description": "" }, - "notification": { - "message": "De : [author_email][break]Objet : [title][break]Résumé : [summary]", + "options_timings_l8": { + "message": "Positionner la valeur à zéro pour éviter le relevé d'e-mails jusqu'au premier rafraîchissement manuel [Non disponible dans Safari].", "description": "" }, - "popup_trash": { - "message": "Corbeille", + "options_gmail": { + "message": "Gmail™ ", "description": "" }, - "options_tab": { - "message": "Ouverture d'onglet :", + "options_gmail_1": { + "message": "Compte principal (/mail/u/0/)", "description": "" }, - "log_into_your_account": { - "message": "Veuillez vous connecter à votre compte", + "options_gmail_2": { + "message": "Séparer les libellés par \",\" (virgule).", "description": "" }, - "label_10": { - "message": "Activer les notifications", + "options_gmail_3": { + "message": "2ème compte (/mail/u/1/)", "description": "" }, - "options_notifications_23": { - "message": "Le volume de la notification sonore est", + "options_gmail_4": { + "message": "3ème compte (/mail/u/2/)", "description": "" }, - "options_timings_l2": { - "message": "La période minimum est de 10 secondes.", + "options_gmail_5": { + "message": "4ème compte (/mail/u/3/)", "description": "" }, - "options_toolbar_11": { - "message": "Support des raccourcis clavier dans le panneau de la barre d'outils", + "options_gmail_6": { + "message": "5ème compte (/mail/u/4/)", "description": "" }, - "options_gmail_9": { - "message": "Des libellés populaires : \"inbox\", \"important\", \"^smartlabel_personal\", \"^smartlabel_newsletter\", \"^smartlabel_notification\", et \"^smartlabel_group\"", + "options_gmail_7": { + "message": "6ème compte (/mail/u/5/)", "description": "" }, - "popup_msg_17": { - "message": "Août", + "options_gmail_8": { + "message": "Marquer les messages comme lu en les archivant", "description": "" }, - "popup_msg_15": { - "message": "Juin", + "options_gmail_15": { + "message": "Quelques libellés populaires :", "description": "" }, - "options_notifications_34": { - "message": "email summary contains", + "options_gmail_10": { + "message": "Recevoir les notifications pour les libellés et comptes suivants :", "description": "" }, - "label_14": { - "message": "Logged-in accounts", + "options_gmail_11": { + "message": "Flux personnalisés :", "description": "" }, - "options_misc_13": { - "message": "Par défaut, le notifieur met à jour la bulle textuelle du bouton de la barre d'outils avec des infos d'identifiant. En désactivant cette option, la bulle textuelle restera à sa valeur par défaut.", + "options_gmail_12": { + "message": "Séparer les flux par \",\" (virgule). Exemple de flux : https://mail.google.com/mail/u/0/feed/atom/inbox", "description": "" }, - "options_misc_6": { - "message": "Show desktop notification to warn that Gmail is already opened in the active tab", + "options_gmail_13": { + "message": "Remarque : le nombre maximal pour tous les libellés sauf \"Boîte de réception\" est de 20 (les flux Google ne fournissent que les 20 entrées les plus récentes)", "description": "" }, - "popup_read": { - "message": "Marquer comme lu", + "options_gmail_14": { + "message": "Remarque : pour que le notifieur écoute plus de 5 comptes, ajoutez les URL des flux au champ \"Flux personnalisés\". Par exemple, pour écouter les 6e et 7e comptes, ajoutez : https://mail.google.com/mail/u/6/feed/atom/inbox, https://mail.google.com/mail/u/7/feed/atom/inbox", + "description": "" + }, + "options_notifications": { + "message": "Notifications ", + "description": "" + }, + "options_notifications_1": { + "message": "Afficher la notification sur le bureau pour les nouveaux e-mails", + "description": "" + }, + "options_notifications_2": { + "message": "Présenter la notification de bureau pendant (en secondes) :", + "description": "" + }, + "options_notifications_3": { + "message": "Cette option peut ne pas fonctionner sur votre système d'exploitation.", "description": "" }, "options_notifications_4": { "message": "Format de notification", "description": "" }, - "settings_open_title": { - "message": "Open options (settings) page", + "options_notifications_5": { + "message": "Variables disponibles : ", "description": "" }, - "label_2": { - "message": "Paramètres", + "options_notifications_6": { + "message": "Tronquer les notifications plus longues que ", "description": "" }, - "options_toolbar_14": { - "message": "Si vous préférez le rendu \"texte uniquement\" dans le mode \"contenu total\", décochez cette case.", + "options_notifications_7": { + "message": " caractères pour les champs [objet] et [résumé].", "description": "" }, - "options_notifications_18": { - "message": "Alerte sonore \"Ding\" de l'extension \"Checker Plus\" pour Google Chrome", + "options_notifications_8": { + "message": "Pour ne pas tronquer avec des points de suspension, utilisez un nombre élevé.", "description": "" }, - "options_tab_5": { - "message": "Ouvrir un compte Gmail dans un onglet d'arrière-plan", + "options_notifications_9": { + "message": "Jouer l'alerte sonore pour les nouveaux e-mails", "description": "" }, - "label_7": { - "message": "Pour 1 heure", + "options_notifications_10": { + "message": "Remarque : pour les utilisateurs de Mac. Depuis la version 28.0 de Firefox, toutes les notifications de bureau sont gérées par le \"Centre de Notifications\" Mac qui provoque une alerte sonore supplémentaire. Vous devez désactiver soit cette notification sonore, soit celle générée par le \"Centre de Notifications\".", "description": "" }, - "popup_archive": { - "message": "Archive", + "options_notifications_11": { + "message": "Afficher la notification dans la barre de tâches Windows ou dans le dock Mac OS", "description": "" }, - "msg_2": { - "message": "Le lien est copié dans le presse-papiers.", + "options_notifications_12": { + "message": "Les notifications dans la barre de tâches ne sont pas supportées sous Linux pour le moment.", "description": "" }, - "options_title": { - "message": "Options - Gmail™ Notifier", + "options_notifications_13": { + "message": "Ouvrir le panneau de la barre d'outils sur clic de l'icône de notification dans la barre de tâches (uniquement sous Windows, beta)", "description": "" }, - "popup_msg_13": { - "message": "Avril", + "options_notifications_14": { + "message": "Cette fonctionnalité est hautement expérimentale et pourrait rendre instable votre navigateur Firefox. [Redémarrage nécessaire].", "description": "" }, - "popup_msg_9_format": { - "message": "%d mois plus tôt", + "options_notifications_15": { + "message": "La notification sonore par défaut est", "description": "" }, - "popup_msg_11": { - "message": "Février", + "options_notifications_16": { + "message": "Alerte par défaut Gmail™ Notifier", "description": "" }, - "popup_open_inbox": { - "message": "Ouvrir la boîte de réception", + "options_notifications_17": { + "message": "Alerte sonore \"Bell\" de l'extension \"Checker Plus\" pour Google Chrome", "description": "" }, - "options_tab_9": { - "message": "When unchecked, Gmail Notifier checks either active window or all open windows for open instance of Gmail and switch to the tab when tab opening is requested.", + "options_notifications_18": { + "message": "Alerte sonore \"Ding\" de l'extension \"Checker Plus\" pour Google Chrome", "description": "" }, - "gmail": { - "message": "Gmail™ Notifier", + "options_notifications_19": { + "message": "Alerte e-mail Windows", "description": "" }, - "popup_msg_6": { - "message": "Hier", + "options_notifications_20": { + "message": "Son défini par l'utilisateur", "description": "" }, - "options_toolbar_8": { - "message": "La largeur minimale est de 500 pixels.", + "options_notifications_21": { + "message": "La notification sonore définie par l'utilisateur est", "description": "" }, - "options_notifications_16": { - "message": "Alerte par défaut Gmail Notifier", + "options_notifications_22": { + "message": "Si votre navigateur ne lit pas le son de notification personnalisé, essayez de le convertir en un format WAV simple à l'aide d'un outil de conversion en ligne.", "description": "" }, - "options_misc_14": { - "message": "Ne pas afficher le nombre badge exact quand le nombre d'e-mails non lus est supérieur à 999", + "options_notifications_35": { + "message": "Pour sélectionner un nouveau son personnalisé, sélectionnez d'abord un son intégré, puis modifiez l'option en son personnalisé", "description": "" }, - "popup_msg_18": { - "message": "Septembre", + "options_notifications_23": { + "message": "Le volume de la notification sonore est", "description": "" }, - "options_notifications_14": { - "message": "Cette fonctionnalité est hautement expérimentale et pourrait rendre instable votre navigateur Firefox. [Rédemarrage nécessaire].", + "options_notifications_24": { + "message": "Le volume est un nombre entre 0 et 100 où 100 est le volume le plus fort (défaut).", "description": "" }, - "options_gmail_3": { - "message": "2ème compte (/mail/u/1/)", + "options_notifications_25": { + "message": "Dans Safari, il est probable que les notifications sonores par défaut ne soient pas jouées correctement. Si c'est le cas, utilisez un fichier son personnel comme notification.", "description": "" }, - "options_notifications_11": { - "message": "Afficher la notification dans la barre de tâches Windows ou dans le dock Mac OS", + "options_notifications_26": { + "message": "Toujours afficher la notification dans la zone de notification système (uniquement sous Windows)", "description": "" }, - "options_notifications_2": { - "message": "Présenter la notification de bureau pendant (en secondes) :", + "options_notifications_27": { + "message": "La notification dans la zone de notification système sera affichée même si tous les messages sont lus.", "description": "" }, - "log_in_to_your_account": { - "message": "Veuillez vous connecter à votre compte Gmail", + "options_notifications_28": { + "message": "Désactiver toutes les notifications pendant une période de temps personnalisée (en minutes) :", "description": "" }, - "popup_of": { - "message": "sur", + "options_notifications_29": { + "message": "Cette option est liée au menu contextuel sur le bouton de la barre d'outils -> désactiver toutes les notifications -> période de temps personnalisée.", "description": "" }, - "options_notifications_15": { - "message": "Default sound notification is", + "options_notifications_30": { + "message": "Combiner toutes les notifications simultanées de bureau en une seule notification", "description": "" }, - "options_notifications_21": { - "message": "La notification sonore définie par l'utilisateur est", + "options_notifications_31": { + "message": "Son de notification personnalisé", "description": "" }, - "options_toolbar_9": { - "message": "La hauteur du panneau de la barre d'outils dans le mode \"contenu total\" est (en pixels) :", + "options_notifications_32": { + "message": "Nom ou contenus d'e-mail", "description": "" }, - "options_toolbar_1": { - "message": "Comportement du bouton de la barre d'outils", + "options_notifications_33": { + "message": "Titre des contenus d'e-mail", "description": "" }, - "unknown": { - "message": "inconnu", + "options_notifications_34": { + "message": "Sommaire de contenus d'e-mail", "description": "" }, - "popup_msg_21": { - "message": "Décembre", + "options_notifications_35": { + "message": "Pour sélectionner un nouveau son personnalisé, sélectionnez d'abord un son intégré, puis modifiez l'option en son personnalisé", "description": "" }, - "popup_read_all": { - "message": "Tout marquer comme lu", + "options_notifications_36": { + "message": "Demander à Gmail™ d'empêcher la redirection vers 'inbox.google.com'", "description": "" }, - "options_notifications_8": { - "message": "Pour ne pas tronquer avec des points de suspension, utiliser un nombre élevé.", + "options_notifications_37": { + "message": "Afficher le numéro de badge", "description": "" }, - "options_donation": { - "message": "Faire un don", + "options_notifications_38": { + "message": "Actions plus rapides (marquer comme lu, mettre à la corbeille, ...) (Considérer les actions à résoudre lorsque les en-têtes sont reçus)", "description": "" }, - "msg_3": { - "message": "Le texte sélectionné est copié dans le presse-papiers.", + "options_notifications_40": { + "message": "Autoriser les actions rapides depuis la boîte de notification (deux actions maximum) (Chrome uniquement)", + "description": "" + }, + "options_notifications_41": { + "message": "Marquer comme lu", + "description": "" + }, + "options_notifications_42": { + "message": "Archiver", + "description": "" + }, + "options_notifications_43": { + "message": "Mettre à la corbeille", + "description": "" + }, + "options_tab": { + "message": "Ouverture d'onglet ", + "description": "" + }, + "options_tab_1": { + "message": "Chercher un compte Gmail™ ouvert seulement dans la fenêtre active", + "description": "" + }, + "options_tab_2": { + "message": "Ne pas chercher les comptes Gmail™ ouverts dans les autres fenêtres du navigateur. Si Gmail™ n'est pas ouvert dans la fenêtre active, ouvrir un nouvel onglet.", + "description": "" + }, + "options_tab_3": { + "message": "Ouvrir un nouveau compte Gmail™ à côté de l'onglet actif", + "description": "" + }, + "options_tab_4": { + "message": "Ouvrir un compte Gmail™ dans l'onglet actif", + "description": "" + }, + "options_tab_5": { + "message": "Ouvrir un compte Gmail™ dans un onglet d'arrière-plan", "description": "" }, - "options_misc_7": { - "message": "Afficher la page de bienvenue après une mise à jour", + "options_tab_6": { + "message": "Ouvrir un compte Gmail™ dans une nouvelle fenêtre", "description": "" }, - "options_gmail": { - "message": "Gmail :", + "options_tab_7": { + "message": "Toujours utiliser des onglets vierges au lieu d'ouvrir un nouvel onglet quand ouvrir dans un onglet est activé.", "description": "" }, - "label_1": { - "message": "Rafraîchir", + "options_tab_8": { + "message": "Ignorer les onglets Gmail™ ouverts", "description": "" }, - "options_notifications_5": { - "message": "Variables disponibles :", + "options_tab_9": { + "message": "Lorsque cette option est décochée, Gmail™ Notifier vérifie la fenêtre active ou l'ensemble des fenêtres ouvertes pour l'instance en cours de Gmail™ et passe à l'onglet suivant lorsque l'ouverture d'onglet est demandée.", "description": "" }, - "options_notifications_24": { - "message": "Le volume est un nombre entre 0 et 100 où 100 est le volume le plus fort (défaut).", + "options_tab_10": { + "message": "Ouvrir les e-mails en mode HTML basique", "description": "" }, - "options_notifications_10": { - "message": "Note pour les utilisateurs de Mac. Depuis Firefox 28.0, toutes les notifications de bureau sont gérées par le \"Notification Center\" Mac qui provoque une alerte sonore supplémentaire. Vous devez désactiver soit cette notification sonore, soit celle générée par le \"Notification Center\".", + "options_tab_11": { + "message": "Ouvrir le dernier e-mail non lu au lieu d'ouvrir le dossier \"Boîte de Réception\"" + }, + "options_toolbar": { + "message": "Barre d'outils ", "description": "" }, - "options_misc_2": { - "message": "Le type de tri par défaut respecte l'ordre de connexions.", + "options_toolbar_1": { + "message": "Comportement du bouton de la barre d'outils", "description": "" }, "options_toolbar_2": { "message": "Toujours ouvrir le panneau de prévisualisation d'e-mail", "description": "" }, - "popup_settings": { - "message": "paramètres", - "description": "" - }, - "options_gmail_4": { - "message": "3ème compte (/mail/u/2/)", + "options_toolbar_3": { + "message": "Ouvrir un compte Gmail™ si un seul compte est connecté", "description": "" }, - "options_toolbar_5": { - "message": "Afficher le résumé uniquement", + "options_toolbar_18": { + "message": "Ouvrir un compte Gmail™ (mode forcé)", "description": "" }, - "options_notifications_12": { - "message": "Les notifications dans la barre de tâches ne sont pas supportées sous Linux pour le moment.", + "options_toolbar_4": { + "message": "Mode du panneau de la barre d'outils", "description": "" }, - "options_notifications_35": { - "message": "To select a new custom sound, select a built-in sound first and then change the option to custom sound", + "options_toolbar_5": { + "message": "Afficher le résumé uniquement", "description": "" }, - "msg_1": { - "message": "Un onglet est déjà ouvert. Cliquez sur le bouton de la barre d'outils pour ouvrir Gmail dans un nouvel onglet, ou pour basculer sur un onglet Gmail existant.", + "options_toolbar_6": { + "message": "Afficher la totalité du contenu", "description": "" }, - "popup_refresh": { - "message": "Rafraîchir", + "options_toolbar_7": { + "message": "La largeur du panneau de la barre d'outils dans le mode \"contenu total\" est (en pixels) :", "description": "" }, - "options_misc_5": { - "message": "Couleur bleu pour \"Tous lus\" et couleur gris pour \"Déconnecté\"", + "options_toolbar_8": { + "message": "La largeur minimale est de 500 pixels.", "description": "" }, - "options_timings_l8": { - "message": "Positionner la valeur à zéro pour éviter le relevé d'e-mails jusqu'au premier rafraîchissement manuel [Non disponible sous Safari].", + "options_toolbar_9": { + "message": "La hauteur du panneau de la barre d'outils dans le mode \"contenu total\" est (en pixels) :", "description": "" }, - "popup_msg_19": { - "message": "Octobre", + "options_toolbar_10": { + "message": "La hauteur minimale est de 500 pixels.", "description": "" }, - "options_notifications_33": { - "message": "email title contains", + "options_toolbar_11": { + "message": "Support des raccourcis clavier dans le panneau de la barre d'outils", "description": "" }, - "tooltip_3": { - "message": "Clic droit : Sélections des comptes", + "options_toolbar_12": { + "message": "! : Signaler en spam, # : Mettre à la corbeille, e : Archiver, Shift + i : Marquer comme lu.", "description": "" }, - "popup_date_format": { - "message": "%dd %mm %yy", + "options_toolbar_13": { + "message": "Rendre les e-mails en HTML dans le mode \"contenu total\"", "description": "" }, - "options_notifications": { - "message": "Notifications :", + "options_toolbar_14": { + "message": "Si vous préférez le rendu \"texte uniquement\" dans le mode \"contenu total\", décochez cette case.", "description": "" }, - "options_timings_l6": { - "message": "Une valeur non nulle déclenche une notification sur le bureau et une alerte sonore (similaire à l'arrivée d'un nouvel e-mail) de façon perpétuelle si vous avez un ou plusieurs e-mails non lus.", + "options_toolbar_15": { + "message": "Cliquer avec le bouton du milieu sur bouton de la barre d'outils pour", "description": "" }, - "popup_msg_12": { - "message": "Mars", + "options_toolbar_16": { + "message": "Rafraîchir tous les comptes", "description": "" }, - "options_notifications_22": { - "message": "If your browser is not playing the custom notification sound, try to convert it into a plain WAV format using an online conversion tool.", + "options_toolbar_17": { + "message": "Ouvrir le premier compte Gmail™", "description": "" }, - "options_tab_1": { - "message": "Chercher un compte Gmail ouvert seulement dans la fenêtre active", + "options_misc": { + "message": "Divers ", "description": "" }, - "popup_msg_7_format": { - "message": "%d jours plus tôt", + "options_misc_1": { + "message": "Trier les comptes par ordre alphabétique", "description": "" }, - "options_timings_l1": { - "message": "Relever les nouveaux e-mails tous les (en secondes) :", + "options_misc_2": { + "message": "Le type de tri par défaut respecte l'ordre de connexions.", "description": "" }, - "options_toolbar_4": { - "message": "Mode du panneau de la barre d'outils", + "options_misc_3": { + "message": "Couleur de l’icône de la barre d'outils :", "description": "" }, - "toolbar_label": { - "message": "Gmail™ Notifier", + "options_misc_4": { + "message": "Gris pour \"Tous lus\" et Bleu pour \"Déconnecté\"", "description": "" }, - "popup_msg_1": { - "message": "à l'instant", + "options_misc_5": { + "message": "Bleu pour \"Tous lus\" et Gris pour \"Déconnecté\"", "description": "" }, - "popup_open_settings": { - "message": "Ouvrir les paramètres", + "options_misc_9": { + "message": "Rouge pour \"Tous lus\" et Gris pour \"Déconnecté\"", "description": "" }, - "options_misc_3": { - "message": "La légende de la barre d'outils est", + "options_misc_6": { + "message": "Afficher une notification sur le bureau pour avertir que Gmail™ est déjà ouvert dans l'onglet actif", "description": "" }, - "options_gmail_12": { - "message": "Séparer les flux par \",\" (Virgule). Exemple de flux : https://mail.google.com/mail/u/0/feed/atom/inbox", + "options_misc_7": { + "message": "Afficher la page de bienvenue après une mise à jour", "description": "" }, - "options_toolbar_12": { - "message": "! : Signaler comme spam, # : Mettre à la corbeille, e : Archiver, Shift + i : Marquer comme lu.", + "options_misc_8": { + "message": "Réinitialiser tous les paramètres aux valeurs par défaut", "description": "" }, - "options_px": { - "message": "pixel(s)", + "options_misc_10": { + "message": "Déclencher uniquement les notifications sonores et de bureau quand un e-mail est arrivé depuis moins de (en minutes) :", "description": "" }, "options_misc_11": { "message": "En positionnant cette préférence à zéro, vous ne recevrez ni de notifications de bureau ni de notifications sonores ; néanmoins, vous recevrez toujours une notification de badge.", "description": "" }, - "options_notifications_20": { - "message": "Son défini par l'utilisateur", + "options_misc_12": { + "message": "Ne pas inclure de détails d'identifiant dans la bulle textuelle", "description": "" }, - "and": { - "message": "et", + "options_misc_13": { + "message": "Par défaut, le notifieur met à jour la bulle textuelle du bouton de la barre d'outils avec des infos d'identifiant. En désactivant cette option, la bulle textuelle restera à sa valeur par défaut.", "description": "" }, - "options_tab_7": { - "message": "Toujours utiliser des onglets vierges au lieu d'ouvrir un nouvel onglet quand ouvrir dans un onglet est activé.", + "options_misc_14": { + "message": "Ne pas afficher le nombre badge exact quand le nombre d'e-mails non lus est supérieur à 999", "description": "" }, - "options_toolbar_3": { - "message": "Ouvrir un compte Gmail si un seul compte est connecté", + "options_misc_15": { + "message": "Ouvrir la page FAQ sur les mises à jour", "description": "" }, - "options_gmail_7": { - "message": "6ème compte (/mail/u/5/)", + "options_plugins": { + "message": "Plug-ins ", "description": "" }, - "popup_msg_8_format": { - "message": "%d semaines plus tôt", + "options_plugins_1": { + "message": "Libellés Gmail™ et bouton étoile (expérimental)", "description": "" }, - "options_toolbar": { - "message": "Barre d'outils :", + "options_plugins_2": { + "message": "Ce plugin affiche le bouton étoile ainsi que les libellés des fils de discussion dans la fenêtre contextuelle (mode étendu uniquement).", "description": "" }, - "options_notifications_6": { - "message": "Tronquer les notifications plus longues que", + "options_px": { + "message": "pixel(s)", "description": "" }, - "popup_wait": { - "message": "Patientez...", + "options_empty": { + "message": "non défini", "description": "" }, - "tooltip_2": { - "message": "Clic milieu (ou Ctrl+clic gauche) : Rafraîchir tous les comptes", + "options_button_test": { + "message": "Jouer le son", "description": "" }, - "options_notifications_29": { - "message": "This option is related to the right click menu on the toolbar button -> disable all notifications -> custom time period.", + "options_button_reset": { + "message": "Remise à zéro des préférences", "description": "" }, - "options_tab_3": { - "message": "Ouvrir un nouveau compte Gmail à côté de l'onglet actif", + "popup_settings": { + "message": "Paramètres", "description": "" }, - "options_gmail_8": { - "message": "Marquer le message comme lu en l'archivant", + "popup_of": { + "message": "sur", "description": "" }, - "options_toolbar_17": { - "message": "Ouvrir le premier compte Gmail", + "popup_wait": { + "message": "Patientez...", "description": "" }, - "options_notifications_7": { - "message": "caractères pour les champs [objet] et [résumé].", + "popup_date_format": { + "message": "%dd %mm %yy", "description": "" }, - "options_misc_10": { - "message": "Déclencher uniquement les notifications sonores et de bureau quand un e-mail est arrivé depuis moins de (en minutes) :", + "popup_no_subject": { + "message": "(aucun objet)", "description": "" }, - "options_tab_8": { - "message": "Ignore opened Gmail tabs", + "popup_open_settings": { + "message": "Ouvrir les paramètres", "description": "" }, - "popup_no_subject": { - "message": "(aucun objet)", + "popup_open_inbox": { + "message": "Ouvrir la boîte de réception", "description": "" }, - "msg_5": { - "message": "Select an audio sound file", + "popup_archive": { + "message": "Archiver", "description": "" }, - "popup_msg_2": { - "message": "1 minute plus tôt", + "popup_spam": { + "message": "Signaler en spam", "description": "" }, - "popup_msg_16": { - "message": "Juillet", + "popup_trash": { + "message": "Mettre à la corbeille", "description": "" }, - "label_8": { - "message": "Pour 2 heures", + "popup_refresh": { + "message": "Rafraîchir", "description": "" }, - "msg_4": { - "message": "Note : Pour que le notifieur fonctionne correctement, vous devez être connecté à votre compte Google.", + "popup_read": { + "message": "Marquer comme lu", "description": "" }, - "popup_msg_20": { - "message": "Novembre", + "popup_read_all": { + "message": "Tout marquer comme lu", "description": "" }, - "options_toolbar_6": { - "message": "Afficher la totalité du contenu", + "popup_toggle_dark": { + "message": "Basculer thème sombre ou clair" "description": "" }, - "options_gmail_11": { - "message": "Flux personnalisés :", + "popup_msg_1": { + "message": "à l'instant", "description": "" }, - "options_tab_2": { - "message": "Ne pas chercher les comptes Gmail ouverts dans les autres fenêtres du navigateur. Si Gmail n'est pas ouvert dans la fenêtre active, ouvrir un nouvel onglet.", + "popup_msg_2": { + "message": "1 minute plus tôt", "description": "" }, - "label_11": { - "message": "Rédiger un e-mail", + "popup_msg_3_format": { + "message": "%d minutes plus tôt", "description": "" }, - "options_toolbar_7": { - "message": "La largeur du panneau de la barre d'outils dans le mode \"contenu total\" est (en pixels) :", + "popup_msg_4": { + "message": "1 heure plus tôt", "description": "" }, - "options_notifications_31": { - "message": "Custom sound notification", + "popup_msg_5": { + "message": "heures plus tôt", "description": "" }, - "options_timings_l5": { - "message": "La période minimum est de 5 minutes.", + "popup_msg_6": { + "message": "Hier", "description": "" }, - "options_misc": { - "message": "Divers :", + "popup_msg_7_format": { + "message": "%d jours plus tôt", "description": "" }, - "options_gmail_2": { - "message": "Séparer les libellés par \",\" (Virgule).", + "popup_msg_8_format": { + "message": "%d semaines plus tôt", "description": "" }, - "options_misc_4": { - "message": "Couleur gris pour \"Tous lus\" et couleur bleu pour \"Déconnecté\"", + "popup_msg_9_format": { + "message": "%d mois plus tôt", "description": "" }, - "options_toolbar_13": { - "message": "Rendre les e-mails en HTML dans le mode \"contenu total\"", + "popup_msg_10": { + "message": "Janvier", "description": "" }, - "options_toolbar_16": { - "message": "Rafraîchir tous les comptes", + "popup_msg_11": { + "message": "Février", "description": "" }, - "options_gmail_6": { - "message": "5ème compte (/mail/u/4/)", + "popup_msg_12": { + "message": "Mars", + "description": "" + }, + "popup_msg_13": { + "message": "Avril", "description": "" }, "popup_msg_14": { "message": "Mai", "description": "" }, - "options_inshort": { - "message": "Notifieur multi-comptes et multi-libellés pour Google Mail (Gmail).", + "popup_msg_15": { + "message": "Juin", "description": "" }, - "options_misc_12": { - "message": "Ne pas inclure de détails d'identifiant dans la bulle textuelle", + "popup_msg_16": { + "message": "Juillet", "description": "" }, - "options_tab_4": { - "message": "Ouvrir un compte Gmail dans l'onglet actif", + "popup_msg_17": { + "message": "Août", "description": "" }, - "popup_msg_3_format": { - "message": "%d minutes plus tôt", + "popup_msg_18": { + "message": "Septembre", "description": "" }, - "label_12": { - "message": "Open FAQs", + "popup_msg_19": { + "message": "Octobre", "description": "" }, - "description": { - "message": "Notifieur multi-comptes et multi-libellés pour Google Mail (Gmail)", + "popup_msg_20": { + "message": "Novembre", "description": "" }, - "popup_spam": { - "message": "Spam", + "popup_msg_21": { + "message": "Décembre", + "description": "" + }, + "settings_open_title": { + "message": "Ouvrir la page options (paramètres)", + "description": "" + }, + "settings_open_label": { + "message": "Ouvrir les options", "description": "" } -} \ No newline at end of file +} diff --git a/v2/_locales/he/messages.json b/v2/_locales/he/messages.json new file mode 100644 index 00000000..6d87af11 --- /dev/null +++ b/v2/_locales/he/messages.json @@ -0,0 +1,758 @@ +{ + "toolbar_label": { + "message": "Notifier for Gmail™", + "description": "" + }, + "tooltip_1": { + "message": "כפתור שמאלי: פתח Gmail או הצג תצוגה מקדימה", + "description": "" + }, + "tooltip_2": { + "message": "כפתור אמצעי (או Ctrl+Left): עדכן את כל החשבונות", + "description": "" + }, + "tooltip_3": { + "message": "כפתור ימני: בחירת חשבון", + "description": "" + }, + "description": { + "message": "מתריע על הודעות חדשות בחשבון ה-Gmail בכמה חשבונות ותוויות", + "description": "" + }, + "log_in_to_your_account": { + "message": "אנא התחבר לחשבון ה-Gmail שלך", + "description": "" + }, + "msg_1": { + "message": "קיימת לשונית פתוחה עם Gmail. לחץ על האייקון של התוסף על מנת לפתוח לשונית חדשה או עבור ללשונית הקיימת.", + "description": "" + }, + "msg_2": { + "message": "הקישור הועתק בהצלחה.", + "description": "" + }, + "msg_3": { + "message": "הטקסט הנבחר הועתק בהצלחה.", + "description": "" + }, + "msg_4": { + "message": "שים לב: על מנת שהתוסף יעבוד כצפוי עליך להתחבר לחשבון ה-Gmail שלך.", + "description": "" + }, + "msg_5": { + "message": "בחר קובץ לצליל", + "description": "" + }, + "label_1": { + "message": "רענן", + "description": "" + }, + "label_2": { + "message": "מאפיינים", + "description": "" + }, + "label_3": { + "message": "כבה את כל ההתראות", + "description": "" + }, + "label_4": { + "message": "ל-5 דקות", + "description": "" + }, + "label_5": { + "message": "ל-15 דקות", + "description": "" + }, + "label_6": { + "message": "ל-30 דקות", + "description": "" + }, + "label_7": { + "message": "לשעה", + "description": "" + }, + "label_8": { + "message": "לשעתיים", + "description": "" + }, + "label_9": { + "message": "ל-5 שעות", + "description": "" + }, + "label_13": { + "message": "לתקופה", + "description": "" + }, + "label_10": { + "message": "הפעל התראות (עבור הסשיין)", + "description": "" + }, + "label_11": { + "message": "צור מייל חדש", + "description": "" + }, + "label_12": { + "message": "פתח FAQ", + "description": "" + }, + "label_14": { + "message": "חשבונות מחוברים", + "description": "" + }, + "unknown": { + "message": "לא ידוע", + "description": "" + }, + "and": { + "message": "וגם", + "description": "" + }, + "log_into_your_account": { + "message": "אנא התחבר לחשבונך ב-Gmail", + "description": "" + }, + "notification": { + "message": "התקבל מ: [שם הכותב][break]כותרת: [כותרת][break]תקציר: [תקציר]", + "description": "" + }, + "options_title": { + "message": "אפשרויות - Gmail™ Notifier", + "description": "" + }, + "options_inshort": { + "message": "מתריע על הודעות חדשות בחשבון ה-Gmail בכמה חשבונות ותוויות", + "description": "" + }, + "options_donation": { + "message": "תמוך בפיתוח", + "description": "" + }, + "options_timings": { + "message": "תזמונים:", + "description": "" + }, + "options_timings_l1": { + "message": "בדוק עבור אמיילים חדשים כל (שניות):", + "description": "" + }, + "options_timings_l2": { + "message": "זמן מינימלי הוא 10 שניות.", + "description": "" + }, + "options_timings_l3": { + "message": "הזכר עבור כל הלא נקראו כל (בדק'):", + "description": "" + }, + "options_timings_l4": { + "message": "קבע כ-0 עבור כיבוי התזכורת.", + "description": "" + }, + "options_timings_l5": { + "message": "זמן מינימלי הוא 5 דקות.", + "description": "" + }, + "options_timings_l6": { + "message": "ערך שונה מ-0 יגרום לשני צלילים, גם של בועית ההתראות וגם של התראות הדפדפן (בדומה לקבלת אימייל חדש) במידה ויש לך אימיילים שלא נקראו.", + "description": "" + }, + "options_timings_l7": { + "message": "אל תבדוק בעלייה ראשונה עבור אימיילים חדשים למשך (שניות):", + "description": "" + }, + "options_timings_l8": { + "message": "קבע כ-0 על מנת לא לבצע בדיקת אימיילים חדשה בעלייה כלל, עד הבדיקה הידנית (לא אפשרי בדפדפן Safari).", + "description": "" + }, + "options_gmail": { + "message": "Gmail:", + "description": "" + }, + "options_gmail_1": { + "message": "חשבון ראשון (/mail/u/0/)", + "description": "" + }, + "options_gmail_2": { + "message": "הפרד תווית באמצעות \",\" (פסיק).", + "description": "" + }, + "options_gmail_3": { + "message": "חשבון שני (/mail/u/1/)", + "description": "" + }, + "options_gmail_4": { + "message": "חשבון שלישי (/mail/u/2/)", + "description": "" + }, + "options_gmail_5": { + "message": "חשבון רביעי (/mail/u/3/)", + "description": "" + }, + "options_gmail_6": { + "message": "חשבון חמישי (/mail/u/4/)", + "description": "" + }, + "options_gmail_7": { + "message": "חשבון שישי (/mail/u/5/)", + "description": "" + }, + "options_gmail_8": { + "message": "סמן הודעות כנקראו בעת העברה לארכיון", + "description": "" + }, + "options_gmail_15": { + "message": "תוויות נפוצות:", + "description": "" + }, + "options_gmail_10": { + "message": "הצ התרעות עבור התוויות הבאות:", + "description": "" + }, + "options_gmail_11": { + "message": "מקור מותאם אישית:", + "description": "" + }, + "options_gmail_12": { + "message": "הפרד מקורות ע\"י פסיק (,). לדוגמא: https://mail.google.com/mail/u/0/feed/atom/inbox", + "description": "" + }, + "options_gmail_13": { + "message": "הערה: מספר התוויות המקסימלי (מלבד אינבוקס) הוא 20", + "description": "" + }, + "options_gmail_14": { + "message": "הערה: בשביל שהתוסף יאזין ליותר מ-5 חשבונות, הוסף את כתובות ה-feed לשדה \"Custom Feeds\". לדוגמא על מנת להאזין לחשבונות ה-6 ו-7 תוסיף:\nhttps://mail.google.com/mail/u/6/feed/atom/inbox, https://mail.google.com/mail/u/7/feed/atom/inbox", + "description": "" + }, + "options_notifications": { + "message": "התרעות:", + "description": "" + }, + "options_notifications_1": { + "message": "הצג התרעות משולחן העבודה עבור מיילים חדשים", + "description": "" + }, + "options_notifications_2": { + "message": "הצג התראות מערכת למשך (שניות):", + "description": "" + }, + "options_notifications_3": { + "message": "ייתתכן ואפשרות זו לא תעבוד במערכת ההפעלה שלך.", + "description": "" + }, + "options_notifications_4": { + "message": "מבנה ההתרעה", + "description": "" + }, + "options_notifications_5": { + "message": "משתנים קיימים:", + "description": "" + }, + "options_notifications_6": { + "message": "קצר התרעות הארוכות מ", + "description": "" + }, + "options_notifications_7": { + "message": "תווים עבור שדות [כותרת] ו-[תקציר].", + "description": "" + }, + "options_notifications_8": { + "message": "על מנת למנוע חיתוך השתמש במספר גדול.", + "description": "" + }, + "options_notifications_9": { + "message": "השמע צליל התראה עבור אימיילים חדשים", + "description": "" + }, + "options_notifications_10": { + "message": "שימו לב: עבור משתמשי Mac, החל מ-Firefox גרסה 28.0 כל התראות הבועית מנועלות ע\"י Mac Notification Center מה שגורם להשמעת צליל נוסף.\nעליך לבטל את אחד הצלילים.", + "description": "" + }, + "options_notifications_11": { + "message": "הצג התראות בועית ב-וינדוס או ב-Mac.", + "description": "" + }, + "options_notifications_12": { + "message": "בועית ההתראות אינה נתמכת במערכת ההפעלה Linux.", + "description": "" + }, + "options_notifications_13": { + "message": "פתח את התצוגה המקדימה בעת לחיצה על בועית ההתראות (בוינדוס בלבד, בטא)", + "description": "" + }, + "options_notifications_14": { + "message": "אפשרות זו נסיונית ויכולה לגרום לקריסת דפדפן Firefox. (מצריך הפעלה מחדש של הדפדפן).", + "description": "" + }, + "options_notifications_15": { + "message": "צליל ברירת מחדל", + "description": "" + }, + "options_notifications_16": { + "message": "צליל התראה ברירת מחדל", + "description": "" + }, + "options_notifications_17": { + "message": "צליל Checker Plus bell", + "description": "" + }, + "options_notifications_18": { + "message": "צליל Checker Plus ding ", + "description": "" + }, + "options_notifications_19": { + "message": "בועית התראות אימייל", + "description": "" + }, + "options_notifications_20": { + "message": "צליל מותאם אישית", + "description": "" + }, + "options_notifications_21": { + "message": "צליל התראות מותאם אישית", + "description": "" + }, + "options_notifications_22": { + "message": "אם הדפדפן אינו מנגן את צליל ההתראות, נסה להמיר אותו לקובץ WAV עם אחד מכלי ההמרה הזמינים ברשת.", + "description": "" + }, + "options_notifications_35": { + "message": "לבחירת צליל אישי חדש, בחר תחילה בצליל המובנה ולאחר מכן שנה אותו לצליל אישי", + "description": "" + }, + "options_notifications_23": { + "message": "עוצמת השמע של ההתראה הוא", + "description": "" + }, + "options_notifications_24": { + "message": "עוצמת שמע הוא מספר בין 0 ל-100, כאשר 100 היא העוצמה המקסימלית (ברירת מחדל).", + "description": "" + }, + "options_notifications_25": { + "message": "בסאפרי רוב הסיכויים שצליל ההתראות אינו עובד, אם זה המצב, השתמש בצליל אישי.", + "description": "" + }, + "options_notifications_26": { + "message": "תמיד הצג התרעת בועית (עבור חלונות בלבד)", + "description": "" + }, + "options_notifications_27": { + "message": "התרעות בועית יוצגו גם אם אין אימיילים שלא נקראו.", + "description": "" + }, + "options_notifications_28": { + "message": "כבה את כל ההתראות למשך תקופה (בדק'):", + "description": "" + }, + "options_notifications_29": { + "message": "אופציה זו שייכת לתפריט הכפתור הימני.", + "description": "" + }, + "options_notifications_30": { + "message": "אחד את כל התראות המערכת להתראה אחת", + "description": "" + }, + "options_notifications_31": { + "message": "צליל התראות אישי", + "description": "" + }, + "options_notifications_32": { + "message": "שם או אימייל מכילים", + "description": "" + }, + "options_notifications_33": { + "message": "נושא המייל מכיל", + "description": "" + }, + "options_notifications_34": { + "message": "גוף המייל מכיל", + "description": "" + }, + "options_notifications_36": { + "message": "בקש מג'ימייל למנוע מעבר ל- 'inbox.google.com'", + "description": "" + }, + "options_notifications_37": { + "message": "הצג מספר", + "description": "" + }, + "options_notifications_38": { + "message": "פעולות מהירות (סמן כנקרא, מחק, ...) נחשבים כבוצעות בקבלת ה-headers של הבקשה.", + "description": "" + }, + "options_notifications_40": { + "message": "אפשר פעולות מהירות מתיבת הנוטיפיקציה (עד 2 פעולות)\n(כרום בלבד)", + "description": "" + }, + "options_notifications_41": { + "message": "סמן כנקרא", + "description": "" + }, + "options_notifications_42": { + "message": "ארכיון", + "description": "" + }, + "options_notifications_43": { + "message": "אשפה", + "description": "" + }, + "options_tab": { + "message": "פתיחת לשוניות:", + "description": "" + }, + "options_tab_1": { + "message": "חפש עבור לשונית עם Gmail רק עבור החלון הפעיל", + "description": "" + }, + "options_tab_2": { + "message": "אל תחפש בחלונות אחרים עבור לשונית Gmail. אם אין לשונית עם Gmail בחלון הנוכחי, פתח לשונית חדשה.", + "description": "" + }, + "options_tab_3": { + "message": "פתח חשבון Gmail בסמוך ללשונית הפעילה", + "description": "" + }, + "options_tab_4": { + "message": "פתח חשבון Gmail בלשונית קיימת", + "description": "" + }, + "options_tab_5": { + "message": "פתח חשבון Gmail בלשונית נסתרת", + "description": "" + }, + "options_tab_6": { + "message": "פתח חשבון Gmail בחלון חדש", + "description": "" + }, + "options_tab_7": { + "message": "תמיד השתמש בטאב ריק במקום טאב חדש על מנת לפתוח", + "description": "" + }, + "options_tab_8": { + "message": "התעלם מלשוניות ג'ימייל פתוחות", + "description": "" + }, + "options_tab_9": { + "message": "כשלא מסומן, התוסף מחפש בחלון הנוכחי לשונית של ג'ימייל או פותח לשונית חדשה.", + "description": "" + }, + "options_tab_10": { + "message": "פתח מיילים במוד HTML בסיסי", + "description": "" + }, + "options_toolbar": { + "message": "סרגל הכלים:", + "description": "" + }, + "options_toolbar_1": { + "message": "כפתור סרגל הכלים", + "description": "" + }, + "options_toolbar_2": { + "message": "תפיד פתח את חלונית התצוגה", + "description": "" + }, + "options_toolbar_3": { + "message": "פתח את Gmail רק במידה ומחוברים עם חשבון יחיד", + "description": "" + }, + "options_toolbar_18": { + "message": "פתח את ג'ימייל", + "description": "" + }, + "options_toolbar_4": { + "message": "מצב תצוגה מקדימה", + "description": "" + }, + "options_toolbar_5": { + "message": "התג תקציר בלבד", + "description": "" + }, + "options_toolbar_6": { + "message": "הצג את כל התוכן", + "description": "" + }, + "options_toolbar_7": { + "message": "גובה חלונית תצוגה מקדימה במצב מצומצם (פיקסלים):", + "description": "" + }, + "options_toolbar_8": { + "message": "רוחב מינימלי הוא 500px.", + "description": "" + }, + "options_toolbar_9": { + "message": "גובה חלונית תצוגה מקדימה במצב מלא (פיקסלים):", + "description": "" + }, + "options_toolbar_10": { + "message": "גובה מינימלי הוא 500px.", + "description": "" + }, + "options_toolbar_11": { + "message": "תמוך בקיצורי מקלדת בתוסף", + "description": "" + }, + "options_toolbar_12": { + "message": "!: דווח כספם, #: השלך לאשפה, Shift+i: סמן כנקרא.", + "description": "" + }, + "options_toolbar_13": { + "message": "הצג את כל תוכן המיילים בתצוגה מורחבת.", + "description": "" + }, + "options_toolbar_14": { + "message": "אם אתה מעדיף תצוגת טקסט בלבד במצב תצוגה מקדימה מורחבת, בטל סימון.", + "description": "" + }, + "options_toolbar_15": { + "message": "לחיצת כפתור האמצעי על האייקון בתפריט עבור", + "description": "" + }, + "options_toolbar_16": { + "message": "רענן את כל החשבונות", + "description": "" + }, + "options_toolbar_17": { + "message": "פתח את חשבון ה-Gmail הראשי", + "description": "" + }, + "options_misc": { + "message": "שונות:", + "description": "" + }, + "options_misc_1": { + "message": "מיין חשבונות לפי א-ב", + "description": "" + }, + "options_misc_2": { + "message": "סדר הופעת", + "description": "" + }, + "options_misc_3": { + "message": "צבע העיגול בתפריט", + "description": "" + }, + "options_misc_4": { + "message": "אפור עבור ״לא נקראו״ וכחול עבור ״מנותק״", + "description": "" + }, + "options_misc_5": { + "message": "כחול עבור ״לא נקראו״ ואפור עבור ״מנותק״", + "description": "" + }, + "options_misc_9": { + "message": "צבע אדום ל-\"לא נקרא\" וצבע אפור ל-\"לא מחובר\"", + "description": "" + }, + "options_misc_6": { + "message": "הצג התראות מערכת ההפעלה בכדי להזהיר שג'ימייל כבר פתוח בלשונית הנוכחית", + "description": "" + }, + "options_misc_7": { + "message": "הצג הודעת פתיחה בעת עדכון התוסף", + "description": "" + }, + "options_misc_8": { + "message": "אפס את כל ההגדרות", + "description": "" + }, + "options_misc_10": { + "message": "התרע עבור מיילים חדשים אשר הגיעו בפחות מ (בדק'):", + "description": "" + }, + "options_misc_11": { + "message": "ע\"י קביעת ערך זה ל-0, תמע קבלת התראות מערכת ההפעלה (כולל צליל), תקבל אך ורק התראות בדפדפן.", + "description": "" + }, + "options_misc_12": { + "message": "אל תציג פרטי התחברות בפרטי הסבר הקצר", + "description": "" + }, + "options_misc_13": { + "message": "כברירת מחדל, התוסף מעדכן את ההסבר הקצר עם פרטי ההתחברות. כשאופציה זו מכובה, ההסבר הקצר ישאר עם המידע הסטטי.", + "description": "" + }, + "options_misc_14": { + "message": "אל תציג את מספר המיילים המדוייק כאשר מספר זה גדול מ-999", + "description": "" + }, + "options_misc_15": { + "message": "פתח עמוד FAQ בעת עדכון", + "description": "" + }, + "options_plugins": { + "message": "פלאגאינים:", + "description": "" + }, + "options_plugins_1": { + "message": "התוויות של ג'ימייל וכפתור הכוכב (נסיוני)", + "description": "" + }, + "options_plugins_2": { + "message": "פלאגאין זה מציג את כפתור הכוכב וכן את תוויות המייל (נסיוני)", + "description": "" + }, + "options_px": { + "message": "px", + "description": "" + }, + "options_empty": { + "message": "לא מוגדר", + "description": "" + }, + "options_button_test": { + "message": "הפעל", + "description": "" + }, + "options_button_reset": { + "message": "אפס מאפיינים", + "description": "" + }, + "popup_settings": { + "message": "הגדרות", + "description": "" + }, + "popup_of": { + "message": "של", + "description": "" + }, + "popup_wait": { + "message": "המתן...", + "description": "" + }, + "popup_date_format": { + "message": "%dd %mm, %yy", + "description": "" + }, + "popup_no_subject": { + "message": "(אין נושא)", + "description": "" + }, + "popup_open_settings": { + "message": "Open Settings", + "description": "" + }, + "popup_open_inbox": { + "message": "Open Inbox", + "description": "" + }, + "popup_archive": { + "message": "ארכיון", + "description": "" + }, + "popup_spam": { + "message": "ספאם", + "description": "" + }, + "popup_trash": { + "message": "מחק", + "description": "" + }, + "popup_refresh": { + "message": "רענן", + "description": "" + }, + "popup_read": { + "message": "סמן כנקרא", + "description": "" + }, + "popup_read_all": { + "message": "סמן הכל כנקרא", + "description": "" + }, + "popup_msg_1": { + "message": "עכשיו", + "description": "" + }, + "popup_msg_2": { + "message": "לפני דקה", + "description": "" + }, + "popup_msg_3_format": { + "message": "לפני %d דקות", + "description": "" + }, + "popup_msg_4": { + "message": "לפני שעה", + "description": "" + }, + "popup_msg_5": { + "message": "לפני שעות", + "description": "" + }, + "popup_msg_6": { + "message": "אתמול", + "description": "" + }, + "popup_msg_7_format": { + "message": "לפני %d ימים", + "description": "" + }, + "popup_msg_8_format": { + "message": "לפני %d שבוע(ות)", + "description": "" + }, + "popup_msg_9_format": { + "message": "לפני %d חודש(ים)", + "description": "" + }, + "popup_msg_10": { + "message": "ינואר", + "description": "" + }, + "popup_msg_11": { + "message": "פברואר", + "description": "" + }, + "popup_msg_12": { + "message": "מרץ", + "description": "" + }, + "popup_msg_13": { + "message": "אפריל", + "description": "" + }, + "popup_msg_14": { + "message": "מאי", + "description": "" + }, + "popup_msg_15": { + "message": "יוני", + "description": "" + }, + "popup_msg_16": { + "message": "יולי", + "description": "" + }, + "popup_msg_17": { + "message": "אוגוסט", + "description": "" + }, + "popup_msg_18": { + "message": "ספטמבר", + "description": "" + }, + "popup_msg_19": { + "message": "אוקטובר", + "description": "" + }, + "popup_msg_20": { + "message": "נובמבר", + "description": "" + }, + "popup_msg_21": { + "message": "דצמבר", + "description": "" + }, + "settings_open_title": { + "message": "פתח עמוד אפשרויות", + "description": "" + }, + "settings_open_label": { + "message": "פתח אפשרויות", + "description": "" + }, + "gmail": { + "message": "Notifier for Gmail™", + "description": "" + } +} \ No newline at end of file diff --git a/WebExtension/_locales/hu/messages.json b/v2/_locales/hu/messages.json similarity index 87% rename from WebExtension/_locales/hu/messages.json rename to v2/_locales/hu/messages.json index ce456f54..a1477728 100644 --- a/WebExtension/_locales/hu/messages.json +++ b/v2/_locales/hu/messages.json @@ -1,690 +1,762 @@ { - "label_9": { - "message": "5 órára", + "toolbar_label": { + "message": "Gmail™ értesítő", "description": "" }, - "options_notifications_19": { - "message": "Windows e-mail értesítés", + "tooltip_1": { + "message": "Jobb egér: Gmail vagy előnézeti panel megnyitása", "description": "" }, - "options_notifications_17": { - "message": "Checker Plus bell értesítés", + "tooltip_2": { + "message": "Középső (vagy Ctrl+Bal) egér: Összes fiók frissítése", "description": "" }, - "options_notifications_13": { - "message": "A tálcaértesítés ikonjára kattintás nyissa meg az eszközpanelt (Csak Windows, béta)", + "tooltip_3": { + "message": "Jobb egér: fiókválasztás", "description": "" }, - "options_notifications_30": { - "message": "Az összes egyidejű asztali értesítés összevonása egy értesítéssé", + "description": { + "message": "Egy vagy több Google Mail (Gmail) fiókhoz, illetve címkéhez értesítő", "description": "" }, - "settings_open_label": { - "message": "Beállítások megnyitása", + "log_in_to_your_account": { + "message": "Jelentkezzen be Gmail-fiókjába", "description": "" }, - "options_timings_l7": { - "message": "Ne keressen új leveleket induláskor ennyi másodpercig:", + "msg_1": { + "message": "Már megnyitotta a Gmail-t. Kattintson az eszköztár gombjára a Gmail megnyitásához új ablakban vagy már megnyitott Gmail lapra váltáshoz.", "description": "" }, - "label_4": { - "message": "5 percre", + "msg_2": { + "message": "A link a vágólapra került.", "description": "" }, - "options_timings_l3": { - "message": "Emlékeztessen az összes olvasatlan levélre (percenként):", + "msg_3": { + "message": "A kijelölt szöveg a vágólapra került.", "description": "" }, - "popup_msg_4": { - "message": "1 óra múlva", + "msg_4": { + "message": "Megjegyzés: Az értesítő működéséhez szükséges, hogy Google-fiókjába bejelentkezzen.", "description": "" }, - "options_gmail_1": { - "message": "Elsődleges fiók(/mail/u/0/)", + "msg_5": { + "message": "Válassz egy hangfájlt", "description": "" }, - "options_gmail_10": { - "message": "A következő címkék és fiókok esetén legyen értesítés:", + "label_1": { + "message": "Frissítés", "description": "" }, - "options_notifications_1": { - "message": "Asztali értesítések megjelenítése új levelek érkezésekor", + "label_2": { + "message": "Beállítások", "description": "" }, - "options_notifications_9": { - "message": "Hangjelzés lejátszása új levelek érkezésekor", + "label_3": { + "message": "Összes értesítés tiltása", + "description": "" + }, + "label_4": { + "message": "5 percre", + "description": "" + }, + "label_5": { + "message": "15 percre", "description": "" }, "label_6": { "message": "30 percre", "description": "" }, - "options_misc_8": { - "message": "Összes beállítás visszaállítása alapértelmezettre", + "label_7": { + "message": "1 órára", "description": "" }, - "options_notifications_28": { - "message": "Összes értesítés tiltása egyéni időhosszra (percben):", + "label_8": { + "message": "2 órára", "description": "" }, - "options_timings_l4": { - "message": "Állítsa az értéket 0-ra nem ismétlődő értesítésekhez.", + "label_9": { + "message": "5 órára", "description": "" }, - "options_notifications_32": { - "message": "név vagy levél tartalmazza", + "label_13": { + "message": "Egyéni időhosszra", "description": "" }, - "options_tab_6": { - "message": "Gmail-fiók megnyitása új ablakban", + "label_10": { + "message": "Értesítések engedélyezése (munkamenet)", "description": "" }, - "options_notifications_25": { - "message": "Gyakran az alapértelmezett hangértesítések nem jól kerülnek lejátszásra Safari-ban. Ebben az esetben állítson be egyéni hangfájlt.", + "label_11": { + "message": "Levél írása", "description": "" }, - "options_toolbar_15": { - "message": "Az eszköztár gombjára a középső egérgombbal kattintás", + "label_12": { + "message": "GyÍK megnyitása", "description": "" }, - "options_toolbar_10": { - "message": "A legkisebb magasság is 500px.", + "label_14": { + "message": "Bejelentkezett fiókok", "description": "" }, - "popup_msg_10": { - "message": "Január", + "unknown": { + "message": "ismeretlen", "description": "" }, - "options_notifications_26": { - "message": "Mindig látszódjon a tálcaértesítő (Csak Windows)", + "and": { + "message": "és", "description": "" }, - "label_3": { - "message": "Összes értesítés tiltása", + "log_into_your_account": { + "message": "Jelentkezzen be fiókjába", "description": "" }, - "label_13": { - "message": "Egyéni időhosszra", + "notification": { + "message": "Feladó: [author_email][break]Tárgy: [title][break]Összegzés: [summary]", "description": "" }, - "options_empty": { - "message": "nincs megadva", + "options_title": { + "message": "Beállítások - Gmail™ Értesítő", "description": "" }, - "options_notifications_3": { - "message": "Ez a beállítás lehet, hogy nem működik ezen az operációs rendszeren.", + "options_inshort": { + "message": "Egy vagy több Google Mail (Gmail) fiókhoz, illetve címkéhez értesítő.", + "description": "" + }, + "options_donation": { + "message": "Támogatásfejlesztés", "description": "" }, "options_timings": { "message": "Időzítés:", "description": "" }, - "options_gmail_5": { - "message": "Negyedik fiók (/mail/u/3/)", + "options_timings_l1": { + "message": "Új levelek ellenőrzése ennyi másodpercenként:", "description": "" }, - "label_5": { - "message": "15 percre", + "options_timings_l2": { + "message": "A legkisebb időköz 10 másodperc.", "description": "" }, - "options_misc_9": { - "message": "Piros szín a \"Nincs olvasatlan\" és szürke szín a \"Szétkapcsolva\"", + "options_timings_l3": { + "message": "Emlékeztessen az összes olvasatlan levélre (percenként):", "description": "" }, - "popup_msg_5": { - "message": "órával ezelőtt", + "options_timings_l4": { + "message": "Állítsa az értéket 0-ra nem ismétlődő értesítésekhez.", "description": "" }, - "options_notifications_27": { - "message": "A tálcaértesítő akkor is látszódjon, amikor nincs olvasatlan üzenet. ", + "options_timings_l5": { + "message": "A legrövidebb időköz 5 perc.", "description": "" }, - "options_misc_1": { - "message": "Fiókok betűrendbe rendezése", + "options_timings_l6": { + "message": "Nem 0 érték esetén addig él az asztali értesítő és a hangjelzés (hasonlóan, mint új levél érkezésél) míg van olvasatlan levele.", "description": "" }, - "tooltip_1": { - "message": "Jobb egér: Gmail vagy előnézeti panel megnyitása", + "options_timings_l7": { + "message": "Ne keressen új leveleket induláskor ennyi másodpercig:", "description": "" }, - "notification": { - "message": "Feladó: [author_email][break]Tárgy: [title][break]Összegzés: [summary]", + "options_timings_l8": { + "message": "Állítsa 0-ra az értéket, hogy ne legyen automatikus ellenőrzés az első kézi frissítésig [Safariban nem érhető el].", "description": "" }, - "popup_trash": { - "message": "Kuka", + "options_gmail": { + "message": "Gmail:", "description": "" }, - "options_tab": { - "message": "Lap megnyitása:", + "options_gmail_1": { + "message": "Elsődleges fiók(/mail/u/0/)", "description": "" }, - "log_into_your_account": { - "message": "Jelentkezzen be fiókjába", + "options_gmail_2": { + "message": "A címkéket vesszővel (\",\"-vel) válassza el.", "description": "" }, - "label_10": { - "message": "Értesítések engedélyezése", + "options_gmail_3": { + "message": "Másodlagos fiók (/mail/u/1/)", "description": "" }, - "options_notifications_23": { - "message": "A hangértesítés hangereje", + "options_gmail_4": { + "message": "Harmadik fiók (/mail/u/2/)", "description": "" }, - "options_timings_l2": { - "message": "A legkisebb időköz 10 másodperc.", + "options_gmail_5": { + "message": "Negyedik fiók (/mail/u/3/)", "description": "" }, - "options_toolbar_11": { - "message": "Gyorsbillentyű támogatása az eszköztár gombján", + "options_gmail_6": { + "message": "Ötödik fiók (/mail/u/4/)", "description": "" }, - "options_gmail_9": { - "message": "Néhány népszerű címke: \"beérkező\", \"fontos\", \"^smartlabel_personal\", \"^smartlabel_newsletter\", \"^smartlabel_notification\", and \"^smartlabel_group\"", + "options_gmail_7": { + "message": "Hatodik fiók (/mail/u/5/)", "description": "" }, - "popup_msg_17": { - "message": "Augusztus", + "options_gmail_8": { + "message": "Archiváláskor olvasottnak megjelölés", "description": "" }, - "popup_msg_15": { - "message": "Június", + "options_gmail_15": { + "message": "Néhány népszerű címke:", "description": "" }, - "options_notifications_34": { - "message": "levélösszegző tartalmazza", + "options_gmail_10": { + "message": "A következő címkék és fiókok esetén legyen értesítés:", "description": "" }, - "label_14": { - "message": "Bejelentkezett fiókok", + "options_gmail_11": { + "message": "Egyéni hírcsatornák:", "description": "" }, - "options_misc_13": { - "message": "Alapértelmezetten az értesítő frissíti az eszköztár gombjának buboréksúgóját a bejelentkezési információval. Ezen opció kikapcsolásával a buboréksúgó szövege az alapértelmezett szöveg marad.", + "options_gmail_12": { + "message": "A hírcsatornákat \",\"-vel (vesszővel) válassza el. Példa hírcsatornára: https://mail.google.com/mail/u/0/feed/atom/inbox", "description": "" }, - "options_misc_6": { - "message": "Asztali figyelmeztetés megjelenítése, hogy Gmail már az aktív fülön nyitva van ", + "options_gmail_13": { + "message": "Megjegyzés: \"beérkező\" kivételével az összes címke maximális száma 20 (Google hírcsatorna csak maximum 20 új bejegyzést támogat)", "description": "" }, - "popup_read": { - "message": "Megj. olvasottként", + "options_gmail_14": { + "message": "Megjegyzés: több, mint 5 fiók figyeléséhez adj meg hírcsatorna URL-eket az \"Egyéni hírcsatornák\" mezőben. Például 6. és 7. fiók figyeléséhez add hozzá a következőket: https://mail.google.com/mail/u/6/feed/atom/inbox, https://mail.google.com/mail/u/7/feed/atom/inbox", + "description": "" + }, + "options_notifications": { + "message": "Értesítések:", + "description": "" + }, + "options_notifications_1": { + "message": "Asztali értesítések megjelenítése új levelek érkezésekor", + "description": "" + }, + "options_notifications_2": { + "message": "Asztali értesítés megjelenítése ennyi másodpercig:", + "description": "" + }, + "options_notifications_3": { + "message": "Ez a beállítás lehet, hogy nem működik ezen az operációs rendszeren.", "description": "" }, "options_notifications_4": { "message": "Értesítés formátuma", "description": "" }, - "settings_open_title": { - "message": "Beállítások oldal megnyitása", + "options_notifications_5": { + "message": "Használható változók:", "description": "" }, - "label_2": { - "message": "Beállítások", + "options_notifications_6": { + "message": "Értesítés levágása, ha hosszabb mint", "description": "" }, - "options_toolbar_14": { - "message": "Amennyiben a levelet szövegként szeretné látni, nem jelölje be ezt a jelölőnégyzetet.", + "options_notifications_7": { + "message": "karakternél a [cím] és az [összegzés] mező.", "description": "" }, - "options_notifications_18": { - "message": "Checker Plus ding értesítés", + "options_notifications_8": { + "message": "Hogy ne lehessen szólevágás, nagy számot adjon meg.", "description": "" }, - "options_tab_5": { - "message": "Gmail-fiók megnyitása egy háttér lapon", + "options_notifications_9": { + "message": "Hangjelzés lejátszása új levelek érkezésekor", "description": "" }, - "label_7": { - "message": "1 órára", + "options_notifications_10": { + "message": "Megjegyzés Mac használóknak. A Firefox 28.0 verziójától az összes asztali értesítést a Mac Notification Center (Mac Üzenetközpont) kezeli, ami extra hangjelzést okoz. Ezért célszerű vagy ezt, vagy a Notification Center hangértesítését kikapcsolni.", "description": "" }, - "popup_archive": { - "message": "Archív", + "options_notifications_11": { + "message": "\"Windows tálcaértesítés\" vagy \"Mac OS Dock értesítés\" megjelenítése", "description": "" }, - "msg_2": { - "message": "A link a vágólapra került.", + "options_notifications_12": { + "message": "Tálcaértesítések nem támogatottak jelenleg Linux alatt.", "description": "" }, - "options_title": { - "message": "Beállítások - Gmail™ Értesítő", + "options_notifications_13": { + "message": "A tálcaértesítés ikonjára kattintás nyissa meg az eszközpanelt (Csak Windows, béta)", "description": "" }, - "popup_msg_13": { - "message": "Április", + "options_notifications_14": { + "message": "Ez a tulajdonság jelenleg komoly fejlesztés alatt áll, így a Forefox-ot instabillá teheti. [Újraindítás szükséges].", "description": "" }, - "popup_msg_9_format": { - "message": "%d hónappal ezelőtt", + "options_notifications_15": { + "message": "Alapértelmezett hangértesítés bekapcsolva", "description": "" }, - "popup_msg_11": { - "message": "Február", + "options_notifications_16": { + "message": "Gmail értesítő alapértelmezett jelzése", "description": "" }, - "popup_open_inbox": { - "message": "Beérkező levelek megnyitása", + "options_notifications_17": { + "message": "Checker Plus bell értesítés", "description": "" }, - "options_tab_9": { - "message": "Amikor nincs bepipálva, Gmail értesítő az összes megnyitott ablakot (az aktívat is) ellenőrzi nyitva lévő Gmail példányért és átvált a lapra, amikor lapnyitási kérelmet kap. ", + "options_notifications_18": { + "message": "Checker Plus ding értesítés", "description": "" }, - "gmail": { - "message": "Gmail™ értesítő", + "options_notifications_19": { + "message": "Windows e-mail értesítés", "description": "" }, - "popup_msg_6": { - "message": "Tegnap", + "options_notifications_20": { + "message": "Felhasználó által megadott hang", "description": "" }, - "options_toolbar_8": { - "message": "A legkisebb szélesség 500px.", + "options_notifications_21": { + "message": "A felhasználó által megadott hang", "description": "" }, - "options_notifications_16": { - "message": "Gmail értesítő alapértelmezett jelzése", + "options_notifications_22": { + "message": "Amennyiben böngésződ nem játssza le az egyéni hangot, próbáld a hangot online konvertáló segítségével egyszerű WAV formátumra átalakítani..", "description": "" }, - "options_misc_14": { - "message": "Ne pontos szám jelenjen meg, amikor az olvasatlan levelek száma nagyobb, mint 999. ", + "options_notifications_35": { + "message": "Új egyéni hang választásához először válassz egy beépített hangot, majd állítsd be az egyéni hangértesítés opciót. ", "description": "" }, - "popup_msg_18": { - "message": "Szeptember", + "options_notifications_23": { + "message": "A hangértesítés hangereje", "description": "" }, - "options_notifications_14": { - "message": "Ez a tulajdonság jelenleg komoly fejlesztés alatt áll, így a Forefox-ot instabillá teheti. [Újraindítás szükséges].", + "options_notifications_24": { + "message": "A hangerő 0 és 100 közötti szám, ahol 100 a leghangosabb (ez az alapértelmezett érték).", "description": "" }, - "options_gmail_3": { - "message": "Másodlagos fiók (/mail/u/1/)", + "options_notifications_25": { + "message": "Gyakran az alapértelmezett hangértesítések nem jól kerülnek lejátszásra Safari-ban. Ebben az esetben állítson be egyéni hangfájlt.", "description": "" }, - "options_notifications_11": { - "message": "\"Windows tálcaértesítés\" vagy \"Mac OS Dock értesítés\" megjelenítése", + "options_notifications_26": { + "message": "Mindig látszódjon a tálcaértesítő (Csak Windows)", "description": "" }, - "options_notifications_2": { - "message": "Asztali értesítés megjelenítése ennyi másodpercig:", + "options_notifications_27": { + "message": "A tálcaértesítő akkor is látszódjon, amikor nincs olvasatlan üzenet. ", "description": "" }, - "log_in_to_your_account": { - "message": "Jelentkezzen be Gmail-fiókjába", + "options_notifications_28": { + "message": "Összes értesítés tiltása egyéni időhosszra (percben):", "description": "" }, - "popup_of": { - "message": "/", + "options_notifications_29": { + "message": "Ez az beállítás kapcsolatban van az eszköztáron lévő gombon jobb egérrel elérhető menü -> összes értesítés tiltása -> egyéni időhosszra beállítással.", "description": "" }, - "options_notifications_15": { - "message": "Alapértelmezett hangértesítés bekapcsolva", + "options_notifications_30": { + "message": "Az összes egyidejű asztali értesítés összevonása egy értesítéssé", "description": "" }, - "options_notifications_21": { - "message": "A felhasználó által megadott hang", + "options_notifications_31": { + "message": "Értesítés egyéni hangja", "description": "" }, - "options_toolbar_9": { - "message": "Teljes tartalom megjelenítésekor az eszköztár panel magassága pixelben:", + "options_notifications_32": { + "message": "név vagy e-mail cím tartalmazza", "description": "" }, - "options_toolbar_1": { - "message": "Eszköztárgomb viselkedése", + "options_notifications_33": { + "message": "levél címe tartalmazza", "description": "" }, - "unknown": { - "message": "ismeretlen", + "options_notifications_34": { + "message": "levélösszegző tartalmazza", "description": "" }, - "popup_msg_21": { - "message": "December", + "options_notifications_36": { + "message": "Gmail kérése az 'inbox.google.com' átirányítás megakadályozására", "description": "" }, - "popup_read_all": { - "message": "Összes megjelölése olvasottként", + "options_notifications_37": { + "message": "Jelvény számának megjelenítése", "description": "" }, - "options_notifications_8": { - "message": "Hogy ne lehessen szólevágás, nagy számot adjon meg.", + "options_notifications_38": { + "message": "Gyorsabb műveletek (megjelölés olvasottként, törlés, ...) (A fejlécek érkeztével megoldható műveletek)", "description": "" }, - "options_donation": { - "message": "Támogasd munkánkat", + "options_notifications_40": { + "message": "Gyorsműveletek bekapcsolása az értesítési dobozból (maximálisan kettő művelet) (csak Chrome)", "description": "" }, - "msg_3": { - "message": "A kijelölt szöveg a vágólapra került.", + "options_notifications_41": { + "message": "Megj. olvasottként", "description": "" }, - "options_misc_7": { - "message": "Üdvözlő oldal megjelenítése frissítéskor", + "options_notifications_42": { + "message": "Archív", "description": "" }, - "options_gmail": { - "message": "Gmail:", + "options_notifications_43": { + "message": "Kuka", "description": "" }, - "label_1": { - "message": "Frissítés", + "options_tab": { + "message": "Lap megnyitása:", "description": "" }, - "options_notifications_5": { - "message": "Használható változók:", + "options_tab_1": { + "message": "Gmail-fiók keresése csak az aktív böngészőablakban", "description": "" }, - "options_notifications_24": { - "message": "A hangerő 0 és 100 közötti szám, ahol 100 a leghangosabb (ez az alapértelmezett érték).", + "options_tab_2": { + "message": "Ne keressen megnyitott Gmail-fiókokért más böngészőablakot. Ha a Gmail nincs megnyitva, új lapon nyissa meg.", "description": "" }, - "options_notifications_10": { - "message": "Megjegyzés Mac használóknak. A Firefox 28.0 verziójától az összes asztali értesítést a Mac Notification Center (Mac Üzenetközpont) kezeli, ami extra hangjelzést okoz. Ezért célszerű vagy ezt, vagy a Notification Center hangértesítését kikapcsolni.", + "options_tab_3": { + "message": "Gmail-fiók megnyitása az aktív lap mellett", "description": "" }, - "options_misc_2": { - "message": "Az alapértelmezett rendezés a bejelentkezés sorrendje.", + "options_tab_4": { + "message": "Gmail-fiók megnyitása az aktív lapon", "description": "" }, - "options_toolbar_2": { - "message": "Mindig nyissa meg a levél előnézetpanelét", + "options_tab_5": { + "message": "Gmail-fiók megnyitása egy háttér lapon", "description": "" }, - "popup_settings": { - "message": "beállítások", + "options_tab_6": { + "message": "Gmail-fiók megnyitása új ablakban", "description": "" }, - "options_gmail_4": { - "message": "Harmadik fiók (/mail/u/2/)", + "options_tab_7": { + "message": "Minden esetben új lap nyitása helyett üres lapot használjon, amikor a lapon megnyitás be van kapcsolva", "description": "" }, - "options_toolbar_5": { - "message": "Csak az összegzés megjelenítése", + "options_tab_8": { + "message": "Már nyitva lévő Gmail lapok figyelmen kívül hagyása", "description": "" }, - "options_notifications_12": { - "message": "Tálcaértesítések nem támogatottak jelenleg Linux alatt.", + "options_tab_9": { + "message": "Amikor nincs bepipálva, Gmail értesítő az összes megnyitott ablakot (az aktívat is) ellenőrzi nyitva lévő Gmail példányért és átvált a lapra, amikor lapnyitási kérelmet kap. ", "description": "" }, - "options_notifications_35": { - "message": "Új egyéni hang választásához először válassz egy beépített hangot, majd állítsd be az egyéni hangértesítés opciót. ", + "options_tab_10": { + "message": "Levelek megnyitása alap HTML módban", "description": "" }, - "msg_1": { - "message": "Már megnyitotta a Gmail-t. Kattintson az eszköztár gombjára a Gmail megnyitásához új ablakban vagy már megnyitott Gmail lapra váltáshoz.", + "options_tab_11": { + "message": "Open the newest unread email instead of opening the INBOX folder", "description": "" }, - "popup_refresh": { - "message": "Frissítés", + "options_toolbar": { + "message": "Eszköztár:", "description": "" }, - "options_misc_5": { - "message": "Kék szín a \"Nincs olvasatlan\" és szürke szín a \"Szétkapcsolva\"", + "options_toolbar_1": { + "message": "Eszköztárgomb viselkedése", + "description": "" + }, + "options_toolbar_2": { + "message": "Mindig nyissa meg a levél előnézetpanelét", + "description": "" + }, + "options_toolbar_3": { + "message": "Gmail-fiók megnyitása csak akkor, ha már egy fiókba bejelentkezett.", + "description": "" + }, + "options_toolbar_18": { + "message": "Gmail-fiók megnyitása (kierőszakolt)", + "description": "" + }, + "options_toolbar_4": { + "message": "Eszköztár panel mód", + "description": "" + }, + "options_toolbar_5": { + "message": "Csak az összegzés megjelenítése", + "description": "" + }, + "options_toolbar_6": { + "message": "Teljes tartalom megjelenítése", + "description": "" + }, + "options_toolbar_7": { + "message": "Teljes tartalom megjelenítésekor az eszköztár panel szélessége pixelben:", + "description": "" + }, + "options_toolbar_8": { + "message": "A legkisebb szélesség 500px.", "description": "" }, - "options_timings_l8": { - "message": "Állítsa 0-ra az értéket, hogy ne legyen automatikus ellenőrzés az első kézi frissítésig [Safariban nem érhető el].", + "options_toolbar_9": { + "message": "Teljes tartalom megjelenítésekor az eszköztár panel magassága pixelben:", "description": "" }, - "popup_msg_19": { - "message": "Október", + "options_toolbar_10": { + "message": "A legkisebb magasság is 500px.", "description": "" }, - "options_notifications_33": { - "message": "levél címe tartalmazza", + "options_toolbar_11": { + "message": "Gyorsbillentyű támogatása az eszköztár gombján", "description": "" }, - "tooltip_3": { - "message": "Jobb egér: fiókválasztás", + "options_toolbar_12": { + "message": "!: Spam bejelentése, #: Kuka, e: Archiválás, Shift + i: Megjelölés olvasottként.", "description": "" }, - "popup_date_format": { - "message": "%yy. %mm %dd.", + "options_toolbar_13": { + "message": "Levél megjelenítése HTML-ként teljes tartalom módban", "description": "" }, - "options_notifications": { - "message": "Értesítések:", + "options_toolbar_14": { + "message": "Amennyiben a levelet szövegként szeretné látni, nem jelölje be ezt a jelölőnégyzetet.", "description": "" }, - "options_timings_l6": { - "message": "Nem 0 érték esetén addig él az asztali értesítő és a hangjelzés (hasonlóan, mint új levél érkezésél) míg van olvasatlan levele.", + "options_toolbar_15": { + "message": "Az eszköztár gombjára a középső egérgombbal kattintás", "description": "" }, - "popup_msg_12": { - "message": "Március", + "options_toolbar_16": { + "message": "Összes fiók frissítése", "description": "" }, - "options_notifications_22": { - "message": "Amennyiben böngésződ nem játssza le az egyéni hangot, próbáld a hangot online konvertáló segítségével egyszerű WAV formátumra átalakítani..", + "options_toolbar_17": { + "message": "Elsődleges Gmail-fiók megnyitása", "description": "" }, - "options_tab_1": { - "message": "Gmail-fiók keresése csak az aktív böngészőablakban", + "options_misc": { + "message": "Egyebek:", "description": "" }, - "popup_msg_7_format": { - "message": "%d nappal ezelőtt", + "options_misc_1": { + "message": "Fiókok betűrendbe rendezése", "description": "" }, - "options_timings_l1": { - "message": "Új levelek ellenőrzése ennyi másodpercenként:", + "options_misc_2": { + "message": "Az alapértelmezett rendezés a bejelentkezés sorrendje.", "description": "" }, - "options_toolbar_4": { - "message": "Eszköztár panel mód", + "options_misc_3": { + "message": "Eszköztár panel színmintája", "description": "" }, - "toolbar_label": { - "message": "Gmail™ értesítő", + "options_misc_4": { + "message": "Szürke szín a \"Nincs olvasatlan\" és kék szín a \"Szétkapcsolva\"", "description": "" }, - "popup_msg_1": { - "message": "éppen most", + "options_misc_5": { + "message": "Kék szín a \"Nincs olvasatlan\" és szürke szín a \"Szétkapcsolva\"", "description": "" }, - "popup_open_settings": { - "message": "Beállítások megnyitása", + "options_misc_9": { + "message": "Piros szín a \"Nincs olvasatlan\" és szürke szín a \"Szétkapcsolva\"", "description": "" }, - "options_misc_3": { - "message": "Eszköztár panel színmintája", + "options_misc_6": { + "message": "Asztali figyelmeztetés megjelenítése, hogy Gmail már az aktív fülön nyitva van ", "description": "" }, - "options_gmail_12": { - "message": "A hírcsatornákat \",\"-vel (vesszővel) válassza el. Példa hírcsatornára: https://mail.google.com/mail/u/0/feed/atom/inbox", + "options_misc_7": { + "message": "Üdvözlő oldal megjelenítése frissítéskor", "description": "" }, - "options_toolbar_12": { - "message": "!: Spam bejelentése, #: Kuka, e: Archiválás, Shift + i: Megjelölés olvasottként.", + "options_misc_8": { + "message": "Összes beállítás visszaállítása alapértelmezettre", "description": "" }, - "options_px": { - "message": "px", + "options_misc_10": { + "message": "Csak asztali- és hangértesítés jelezzen amikor levél érkezett kevesebb, mint ennyi percen belül:", "description": "" }, "options_misc_11": { "message": "Amennyiben nullára állítja ezt az értéket, nem kap sem asztali- sem hangértesítést, de az ikonértesítés továbbra is megmarad.", "description": "" }, - "options_notifications_20": { - "message": "Felhasználó által megadott hang", + "options_misc_12": { + "message": "A buboréksúgó szövegébe ne helyezz bejelentkezési adatokat", "description": "" }, - "and": { - "message": "és", + "options_misc_13": { + "message": "Alapértelmezetten az értesítő frissíti az eszköztár gombjának buboréksúgóját a bejelentkezési információval. Ezen opció kikapcsolásával a buboréksúgó szövege az alapértelmezett szöveg marad.", "description": "" }, - "options_tab_7": { - "message": "Minden esetben új lap nyitása helyett üres lapot használjon, amikor a lapon megnyitás be van kapcsolva", + "options_misc_14": { + "message": "Ne pontos szám jelenjen meg, amikor az olvasatlan levelek száma nagyobb, mint 999. ", "description": "" }, - "options_toolbar_3": { - "message": "Gmail-fiók megnyitása csak akkor, ha már egy fiókba bejelentkezett.", + "options_misc_15": { + "message": "Frissítéskor a GyÍK oldal megnyitása", "description": "" }, - "options_gmail_7": { - "message": "Hatodik fiók (/mail/u/5/)", + "options_plugins": { + "message": "Bővítmények:", "description": "" }, - "popup_msg_8_format": { - "message": "%d héttel ezelőtt", + "options_plugins_1": { + "message": "Gmail címkék és csillagok (kísérleti)", "description": "" }, - "options_toolbar": { - "message": "Eszköztár:", + "options_plugins_2": { + "message": "Ez a bővítmény megjeleníti a csillagot és a téma címkéit buborékban (csak kibővített módban).", "description": "" }, - "options_notifications_6": { - "message": "Értesítés levágása, ha hosszabb mint", + "options_px": { + "message": "px", "description": "" }, - "popup_wait": { - "message": "Várj...", + "options_empty": { + "message": "nincs megadva", "description": "" }, - "tooltip_2": { - "message": "Középső (vagy Ctrl+Bal) egér: Összes fiók frissítése", + "options_button_test": { + "message": "Lejátszás", "description": "" }, - "options_notifications_29": { - "message": "Ez az beállítás kapcsolatban van az eszköztáron lévő gombon jobb egérrel elérhető menü -> összes értesítés tiltása -> egyéni időhosszra beállítással.", + "options_button_reset": { + "message": "Tulajdonságok alapértelmezettre állítása", "description": "" }, - "options_tab_3": { - "message": "Gmail-fiók megnyitása az aktív lap mellett", + "popup_settings": { + "message": "beállítások", "description": "" }, - "options_gmail_8": { - "message": "Archiváláskor olvasottnak megjelölés", + "popup_of": { + "message": "/", "description": "" }, - "options_toolbar_17": { - "message": "Elsődleges Gmail-fiók megnyitása", + "popup_wait": { + "message": "Várj...", "description": "" }, - "options_notifications_7": { - "message": "karakternél a [cím] és az [összegzés] mező.", + "popup_date_format": { + "message": "%yy. %mm %dd.", "description": "" }, - "options_misc_10": { - "message": "Csak asztali- és hangértesítés jelezzen amikor levél érkezett kevesebb, mint ennyi percen belül:", + "popup_no_subject": { + "message": "(nincs tárgy)", "description": "" }, - "options_tab_8": { - "message": "Már nyitva lévő Gmail lapok figyelmen kívül hagyása", + "popup_open_settings": { + "message": "Beállítások megnyitása", "description": "" }, - "popup_no_subject": { - "message": "(nincs tárgy)", + "popup_open_inbox": { + "message": " Beérkező levelek megnyitása", "description": "" }, - "msg_5": { - "message": "Válassz egy hangfájlt", + "popup_archive": { + "message": "Archív", "description": "" }, - "popup_msg_2": { - "message": "1 perccel ezelőtt", + "popup_spam": { + "message": "Spam", "description": "" }, - "popup_msg_16": { - "message": "Július", + "popup_trash": { + "message": "Kuka", "description": "" }, - "label_8": { - "message": "2 órára", + "popup_refresh": { + "message": "Frissítés", "description": "" }, - "msg_4": { - "message": "Megjegyzés: Az értesítő működéséhez szükséges, hogy Google-fiókjába bejelentkezzen.", + "popup_read": { + "message": "Megj. olvasottként", "description": "" }, - "popup_msg_20": { - "message": "November", + "popup_read_all": { + "message": "Összes megjelölése olvasottként", "description": "" }, - "options_toolbar_6": { - "message": "Teljes tartalom megjelenítése", + "popup_msg_1": { + "message": "éppen most", "description": "" }, - "options_gmail_11": { - "message": "Egyéni hírforrások:", + "popup_msg_2": { + "message": "1 perccel ezelőtt", "description": "" }, - "options_tab_2": { - "message": "Ne keressen megnyitott Gmail-fiókokért más böngészőablakot. Ha a Gmail nincs megnyitva, új lapon nyissa meg.", + "popup_msg_3_format": { + "message": "%d perccel ezelőtt", "description": "" }, - "label_11": { - "message": "Levél írása", + "popup_msg_4": { + "message": "1 óra múlva", "description": "" }, - "options_toolbar_7": { - "message": "Teljes tartalom megjelenítésekor az eszköztár panel szélessége pixelben:", + "popup_msg_5": { + "message": "órával ezelőtt", "description": "" }, - "options_notifications_31": { - "message": "Egyéni hangértesítés", + "popup_msg_6": { + "message": "Tegnap", "description": "" }, - "options_timings_l5": { - "message": "A legrövidebb időköz 5 perc.", + "popup_msg_7_format": { + "message": "%d nappal ezelőtt", "description": "" }, - "options_misc": { - "message": "Egyebek:", + "popup_msg_8_format": { + "message": "%d héttel ezelőtt", "description": "" }, - "options_gmail_2": { - "message": "A címkéket vesszővel (\",\"-vel) válassza el.", + "popup_msg_9_format": { + "message": "%d hónappal ezelőtt", "description": "" }, - "options_misc_4": { - "message": "Szürke szín a \"Nincs olvasatlan\" és kék szín a \"Szétkapcsolva\"", + "popup_msg_10": { + "message": "Január", "description": "" }, - "options_toolbar_13": { - "message": "Levél megjelenítése HTML-ként teljes tartalom módban", + "popup_msg_11": { + "message": "Február", "description": "" }, - "options_toolbar_16": { - "message": "Összes fiók frissítése", + "popup_msg_12": { + "message": "Március", "description": "" }, - "options_gmail_6": { - "message": "Ötödik fiók (/mail/u/4/)", + "popup_msg_13": { + "message": "Április", "description": "" }, "popup_msg_14": { "message": "Május", "description": "" }, - "options_inshort": { - "message": "Egy vagy több Google Mail (Gmail) fiókhoz, illetve címkéhez értesítő.", + "popup_msg_15": { + "message": "Június", "description": "" }, - "options_misc_12": { - "message": "A buboréksúgó szövegébe ne helyezz bejelentkezési adatokat", + "popup_msg_16": { + "message": "Július", "description": "" }, - "options_tab_4": { - "message": "Gmail-fiók megnyitása az aktív lapon", + "popup_msg_17": { + "message": "Augusztus", "description": "" }, - "popup_msg_3_format": { - "message": "%d perccel ezelőtt", + "popup_msg_18": { + "message": "Szeptember", "description": "" }, - "label_12": { - "message": "GyÍK megnyitása", + "popup_msg_19": { + "message": "Október", "description": "" }, - "description": { - "message": "Egy vagy több Google Mail (Gmail) fiókhoz, illetve címkéhez értesítő", + "popup_msg_20": { + "message": "November", "description": "" }, - "popup_spam": { - "message": "Spam", + "popup_msg_21": { + "message": "December", + "description": "" + }, + "settings_open_title": { + "message": "Beállítások oldal megnyitása", + "description": "" + }, + "settings_open_label": { + "message": "Beállítások megnyitása", + "description": "" + }, + "gmail": { + "message": "Gmail™ értesítő", "description": "" } } \ No newline at end of file diff --git a/WebExtension/_locales/nl/messages.json b/v2/_locales/nl/messages.json similarity index 55% rename from WebExtension/_locales/nl/messages.json rename to v2/_locales/nl/messages.json index 3bcae35e..6dc380e4 100644 --- a/WebExtension/_locales/nl/messages.json +++ b/v2/_locales/nl/messages.json @@ -1,690 +1,762 @@ { - "label_9": { - "message": "Voor 5 uur", + "toolbar_label": { + "message": "Gmail-melder™", "description": "" }, - "options_notifications_19": { - "message": "Windows-e-mailgeluid", + "tooltip_1": { + "message": "Linksklikken: Gmail of het e-mailvoorvertoningspaneel openen", "description": "" }, - "options_notifications_17": { - "message": "Checker Plus-belgeluid", + "tooltip_2": { + "message": "Middelklikken (of Ctrl+pijltje naar links): alle accounts verversen", "description": "" }, - "options_notifications_13": { - "message": "Werkbalkpaneel openen bij klikken op taakbalkmeldingspictogram (alleen op Windows - beta)", + "tooltip_3": { + "message": "Rechtsklikken: accountselectie", "description": "" }, - "options_notifications_30": { - "message": "Alle bureaubladmeldingen samenvoegen in één melding", + "description": { + "message": "Label- en accountmelder voor Google Mail (Gmail)", "description": "" }, - "settings_open_label": { - "message": "Opties openen", + "log_in_to_your_account": { + "message": "Log in op uw Gmail-account", "description": "" }, - "options_timings_l7": { - "message": "Niet controleren op nieuwe e-mails bij opstarten voor de duur van (in seconden):", + "msg_1": { + "message": "Het tabblad is al geopend. Klik op de werkbalkknop om Gmail op een nieuw tabblad te openen of naar een geopend Gmail-tabblad te gaan.", "description": "" }, - "label_4": { - "message": "Voor 5 minuten", + "msg_2": { + "message": "De link is gekopieerd naar het klembord.", "description": "" }, - "options_timings_l3": { - "message": "Herinnering voor alle ongelezen e-mails, elke (in minuten):", + "msg_3": { + "message": "De selectie is gekopieerd naar het klembord.", "description": "" }, - "popup_msg_4": { - "message": "1 uur geleden", + "msg_4": { + "message": "Let op: om de melder naar behoren te laten werken dient u ingelogd te zijn op uw Google-account.", "description": "" }, - "options_gmail_1": { - "message": "Hoofdaccount (/mail/u/0/)", + "msg_5": { + "message": "Kies een audiobestand", "description": "" }, - "options_gmail_10": { - "message": "Meldingen ontvangen voor de volgende labels en accounts:", + "label_1": { + "message": "Verversen", "description": "" }, - "options_notifications_1": { - "message": "Bureaubladmelding weergeven bij nieuwe e-mails", + "label_2": { + "message": "Instellingen", "description": "" }, - "options_notifications_9": { - "message": "Meldingsgeluid afspelen bij nieuwe e-mails", + "label_3": { + "message": "Alle meldingen uitschakelen", + "description": "" + }, + "label_4": { + "message": "5 minuten", + "description": "" + }, + "label_5": { + "message": "15 minuten", "description": "" }, "label_6": { - "message": "Voor 30 minuten", + "message": "30 minuten", "description": "" }, - "options_misc_8": { - "message": "Alle instellingen naar standaardwaarden herstellen", + "label_7": { + "message": "1 uur", "description": "" }, - "options_notifications_28": { - "message": "Schakelt alle meldingen uit voor een aangepaste tijdsperiode (in minuten):", + "label_8": { + "message": "2 uur", "description": "" }, - "options_timings_l4": { - "message": "Stel de waarde op nul in voor niet-periodieke herinneringen.", + "label_9": { + "message": "5 uur", "description": "" }, - "options_notifications_32": { - "message": "naam of e-mail bevat", + "label_13": { + "message": "Voor een aangepaste tijdsperiode", "description": "" }, - "options_tab_6": { - "message": "Gmail-account openen in een nieuw venster", + "label_10": { + "message": "Meldingen tonen (sessie)", "description": "" }, - "options_notifications_25": { - "message": "Waarschijnlijk werken de standaardmeldingsgeluiden niet goed in Safari. Als dit het geval is moet u een eigen geluidsbestand instellen.", + "label_11": { + "message": "E-mail opstellen", "description": "" }, - "options_toolbar_15": { - "message": "Middelklikken op de werkbalkknop om", + "label_12": { + "message": "Veelgestelde vragen (FAQ) openen", "description": "" }, - "options_toolbar_10": { - "message": "Minimale hoogte is 500px.", + "label_14": { + "message": "Ingelogde accounts", "description": "" }, - "popup_msg_10": { - "message": "januari", + "unknown": { + "message": "onbekend", "description": "" }, - "options_notifications_26": { - "message": "Systeemvakmelding altijd weergeven (wordt alleen ondersteund op Windows)", + "and": { + "message": "en", "description": "" }, - "label_3": { - "message": "Alle meldingen uitschakelen", + "log_into_your_account": { + "message": "Log in op uw account", "description": "" }, - "label_13": { - "message": "Voor een aangepaste tijdsperiode", + "notification": { + "message": "Van: [author_email][break]Onderwerp: [title][break]Samenvatting: [summary]", "description": "" }, - "options_empty": { - "message": "niet opgegeven", + "options_title": { + "message": "Instellingen - Gmail™-melder", "description": "" }, - "options_notifications_3": { - "message": "Deze instellingen werkt mogelijk niet, afhankelijk van het door u gebruikte besturingssysteem.", + "options_inshort": { + "message": "Label- en accountmelder voor Google Mail (Gmail)", + "description": "" + }, + "options_donation": { + "message": "Ondersteun de ontwikkeling", "description": "" }, "options_timings": { - "message": "Tijdstippen", + "message": "Tijdstippen:", "description": "" }, - "options_gmail_5": { - "message": "Vierde account (/mail/u/3)", + "options_timings_l1": { + "message": "Op nieuwe e-mails controleren, elke (in seconden):", "description": "" }, - "label_5": { - "message": "Voor 15 minuten", + "options_timings_l2": { + "message": "De minimale tijdsduur is 10 seconden.", "description": "" }, - "options_misc_9": { - "message": "Rode kleur voor \"Geen ongelezen berichten\" en grijze kleur voor \"Niet verbonden\"", + "options_timings_l3": { + "message": "Herinnering voor alle ongelezen e-mails, elke (in minuten):", "description": "" }, - "popup_msg_5": { - "message": "uren geleden", + "options_timings_l4": { + "message": "Stel de waarde in op nul voor geen herinneringen te tonen.", "description": "" }, - "options_notifications_27": { - "message": "Er zal een systeemvakmelding worden weergegeven zelfs als er geen ongelezen bericht is.", + "options_timings_l5": { + "message": "De minimale tijdsduur is 5 minuten.", "description": "" }, - "options_misc_1": { - "message": "Accounts alfabetisch sorteren", + "options_timings_l6": { + "message": "Een waarde hoger dan nul zorgt voor constante meldingen en waarschuwingsgeluiden (vergelijkbaar met het arriveren van een nieuwe e-mail) als u ongelezen e-mail(s) hebt.", "description": "" }, - "tooltip_1": { - "message": "Linksklik: Gmail of het e-mailvoorbeeldpaneel openen", + "options_timings_l7": { + "message": "Niet controleren op nieuwe e-mails bij opstarten voor de duur van (in seconden):", "description": "" }, - "notification": { - "message": "Van: [author_email][break]Titel: [title][break]Samenvatting: [summary]", + "options_timings_l8": { + "message": "Stel de waarde op nul in om geen e-mailcontrole uit te voeren zolang er nog geen handmatige verversing is uitgevoerd [niet beschikbaar in Safari].", "description": "" }, - "popup_trash": { - "message": "Prullenbak", + "options_gmail": { + "message": "Gmail:", "description": "" }, - "options_tab": { - "message": "Tabblad openen:", + "options_gmail_1": { + "message": "Hoofdaccount (/mail/u/0/)", "description": "" }, - "log_into_your_account": { - "message": "Log alstublieft in op uw account", + "options_gmail_2": { + "message": "Scheid labels met “,” (komma's).", "description": "" }, - "label_10": { - "message": "Meldingen inschakelen", + "options_gmail_3": { + "message": "Tweede account (/mail/u/1)", "description": "" }, - "options_notifications_23": { - "message": "Volume van het meldingsgeluid is", + "options_gmail_4": { + "message": "Derde account (/mail/u/2)", "description": "" }, - "options_timings_l2": { - "message": "Minimale tijdsduur is 10 seconden.", + "options_gmail_5": { + "message": "Vierde account (/mail/u/3)", "description": "" }, - "options_toolbar_11": { - "message": "Toetsenbordsneltoetsen ondersteunen op het werkbalkpaneel", + "options_gmail_6": { + "message": "Vijfde account (/mail/u/4)", "description": "" }, - "options_gmail_9": { - "message": "Enkele populaire labels: \"postvakIN\", \"belangrijk\", \"^slimlabel_persoonlijk\", \"^slimlabel_nieuwsbrief\", \"^slimlabel_melding\" en \"^slimlabel_groep\"", + "options_gmail_7": { + "message": "Zesde account (/mail/u/5)", "description": "" }, - "popup_msg_17": { - "message": "augustus", + "options_gmail_8": { + "message": "Berichten als gelezen markeren na archiveren", "description": "" }, - "popup_msg_15": { - "message": "juni", + "options_gmail_15": { + "message": "Enkele veelgebruikte labels:", "description": "" }, - "options_notifications_34": { - "message": "e-mail-samenvatting bevat", + "options_gmail_10": { + "message": "Meldingen tonen voor de volgende labels en accounts:", "description": "" }, - "label_14": { - "message": "Ingelogde accounts", + "options_gmail_11": { + "message": "Aangepaste feeds:", "description": "" }, - "options_misc_13": { - "message": "Standaard weergeeft de melder inloggegevens op de tooltip van de werkbalkknop. Door deze optie uit te vinden zal de tekst op de standaardwaarde blijven.", + "options_gmail_12": { + "message": "Scheid feeds met komma's (“,”). Voorbeeldfeed: https://mail.google.com/mail/u/0/feed/atom/inbox", "description": "" }, - "options_misc_6": { - "message": "Bureaubladmeldingen weergeven als waarschuwing wanneer Gmail al geopend is op het actieve tabblad", + "options_gmail_13": { + "message": "Let op: het maximumaantal labels, m.u.v. ‘inbox’, is 20 (Google's feeds geven alleen de 20 nieuwste labels door)", "description": "" }, - "popup_read": { - "message": "Als gelezen markeren", + "options_gmail_14": { + "message": "Tip: als de melder meer dan 5 accounts in de gaten moet houden, voeg dan de feed-url's toe aan het ‘Aangepaste feeds’-veld. Voorbeeld: om account 6 en 7 in de gaten te houden, voeg toe: https://mail.google.com/mail/u/6/feed/atom/inbox, https://mail.google.com/mail/u/7/feed/atom/inbox", + "description": "" + }, + "options_notifications": { + "message": "Meldingen:", + "description": "" + }, + "options_notifications_1": { + "message": "Bureaubladmeldingen tonen bij nieuwe e-mails", + "description": "" + }, + "options_notifications_2": { + "message": "Bureaubladmeldingen tonen voor de duur van (in seconden):", + "description": "" + }, + "options_notifications_3": { + "message": "Deze instelling werkt mogelijk niet op alle besturingssystemen.", "description": "" }, "options_notifications_4": { "message": "Meldingopmaak", "description": "" }, - "settings_open_title": { - "message": "Open de opties-pagina (instellingen)", + "options_notifications_5": { + "message": "Beschikbare variabelen:", "description": "" }, - "label_2": { - "message": "Instellingen", + "options_notifications_6": { + "message": "Meldingen inkorten die langer zijn dan", "description": "" }, - "options_toolbar_14": { - "message": "Schakel deze optie uit als u platte tekst-opmaak prefereert in volledige-inhoudsmodus.", + "options_notifications_7": { + "message": "tekens voor [title]- en [summary]-velden", "description": "" }, - "options_notifications_18": { - "message": "Checker Plus-dinggeluid", + "options_notifications_8": { + "message": "Voer hier een groot getal in om inkorting te voorkomen.", "description": "" }, - "options_tab_5": { - "message": "Gmail-account openen op een achtergrondtabblad", + "options_notifications_9": { + "message": "Meldingsgeluid afspelen bij nieuwe e-mails", "description": "" }, - "label_7": { - "message": "Voor 1 uur", + "options_notifications_10": { + "message": "Opmerking voor Mac-gebruikers: sinds Firefox 28.0 worden alle bureaubladmeldingen afgehandeld middels het macOS-berichtencentrum, welke een extra meldingsgeluid afspeelt. U moet ofwel deze optie uitschakelen ofwel de corresponderende optie in het macOS-berichtencentrum.", "description": "" }, - "popup_archive": { - "message": "Archief", + "options_notifications_11": { + "message": "‘Windows-taakbalkmeldingen’/‘macOS-dockmeldingen’ tonen", "description": "" }, - "msg_2": { - "message": "Link is gekopieerd naar het klembord.", + "options_notifications_12": { + "message": "Taakbalkmeldingen worden momenteel niet ondersteund op Linux-systemen.", "description": "" }, - "options_title": { - "message": "Voorkeuren - Gmail™-melder", + "options_notifications_13": { + "message": "Werkbalkpaneel openen na klikken op taakbalkmeldingspictogram (alleen Windows - bèta)", "description": "" }, - "popup_msg_13": { - "message": "april", + "options_notifications_14": { + "message": "Deze optie is zeer experimenteel en kan mogelijk instabiliteit veroorzaken in Firefox. [herstart vereist]", "description": "" }, - "popup_msg_9_format": { - "message": "%d maand(en) geleden", + "options_notifications_15": { + "message": "Het standaard meldingsgeluid is", "description": "" }, - "popup_msg_11": { - "message": "februari", + "options_notifications_16": { + "message": "Standaardgeluid van Gmail-melder", "description": "" }, - "popup_open_inbox": { - "message": "Postvak IN openen", + "options_notifications_17": { + "message": "Checker Plus-belgeluid", "description": "" }, - "options_tab_9": { - "message": "Als dit niet is aangevinkt zal Gmail Notifier óf het actieve venster controleren óf alle geopende vensters of Gmail al geopend is. Daarna zal naar het actieve tabblad worden overgeschakeld als dat is aangevraagd.", + "options_notifications_18": { + "message": "Checker Plus-dinggeluid", "description": "" }, - "gmail": { - "message": "Gmail™-melder", + "options_notifications_19": { + "message": "Windows-e-mailgeluid", "description": "" }, - "popup_msg_6": { - "message": "Gisteren", + "options_notifications_20": { + "message": "Eigen geluid", "description": "" }, - "options_toolbar_8": { - "message": "Minimale breedte is 500px.", + "options_notifications_21": { + "message": "Het eigen gekozen meldingsgeluid is", "description": "" }, - "options_notifications_16": { - "message": "Standaardwaarschuwing van Gmail-melder", + "options_notifications_22": { + "message": "Als uw browser geen eigen meldingsgeluid afspeelt, probeer dan het bestand te converteren naar onbewerkt wav-formaat middels een online-converteerprogramma.", "description": "" }, - "options_misc_14": { - "message": "Geen exact badgenummer weergeven wanneer het aantal ongelezen e-mails hoger is dan 999", + "options_notifications_35": { + "message": "Om een nieuw aangepast geluid te gebruiken, dient u eerst een ingebouwd geluid te kiezen en deze te wijzigen naar een eigen geluid", "description": "" }, - "popup_msg_18": { - "message": "september", + "options_notifications_23": { + "message": "Het volume van het meldingsgeluid is", "description": "" }, - "options_notifications_14": { - "message": "Deze optie is zeer experimenteel en kan mogelijk instabiliteit veroorzaken in Firefox. [Herstart vereist].", + "options_notifications_24": { + "message": "Het volumeniveau is een getal tussen de 0 en 100 waar 100 het hoogste volumeniveau is (standaard).", "description": "" }, - "options_gmail_3": { - "message": "Tweede account (/mail/u/1)", + "options_notifications_25": { + "message": "Waarschijnlijk werken de standaard meldingsgeluiden niet goed in Safari. Als dit het geval is, moet u een eigen geluidsbestand kiezen.", "description": "" }, - "options_notifications_11": { - "message": "\"Windows-taakbalkmelding\" of \"Mac OS X-dockmelding\" weergeven", + "options_notifications_26": { + "message": "Altijd systeemvakmeldingen tonen (alleen Windows)", "description": "" }, - "options_notifications_2": { - "message": "Bureaubladmelding weergeven voor de duur van (in seconden):", + "options_notifications_27": { + "message": "Er wordt een systeemvakmelding getoond, zelfs als er geen ongelezen bericht is.", "description": "" }, - "log_in_to_your_account": { - "message": "Log alstublieft in op uw Gmail-account", + "options_notifications_28": { + "message": "Schakelt alle meldingen uit voor een aangepaste tijdsperiode (in minuten):", "description": "" }, - "popup_of": { - "message": "van", + "options_notifications_29": { + "message": "Deze optie is gerelateerd aan het rechtermuisknopmenu op de werkbalkknop -> Alle meldingen uitschakelen -> Aangepaste tijdsperiode.", "description": "" }, - "options_notifications_15": { - "message": "Standaard meldingsgeluid is", + "options_notifications_30": { + "message": "Alle bureaubladmeldingen samenvoegen tot één melding", "description": "" }, - "options_notifications_21": { - "message": "Eigen gekozen meldingsgeluid is", + "options_notifications_31": { + "message": "Eigen geluidsmelding", "description": "" }, - "options_toolbar_9": { - "message": "Werkbalkpaneel-hoogte in de volledige-inhoudsweergave is (in pixels):", + "options_notifications_32": { + "message": "naam of e-mailadres bevat", "description": "" }, - "options_toolbar_1": { - "message": "Gedrag van werkbalkknop", + "options_notifications_33": { + "message": "e-mailonderwerp bevat", "description": "" }, - "unknown": { - "message": "onbekend", + "options_notifications_34": { + "message": "e-mailsamenvatting bevat", "description": "" }, - "popup_msg_21": { - "message": "december", + "options_notifications_36": { + "message": "Gmail vragen om doorverwijzing naar ‘inbox.google.com’ te voorkomen", "description": "" }, - "popup_read_all": { - "message": "Alles als gelezen markeren", + "options_notifications_37": { + "message": "Aantal e-mails op pictogram tonen", "description": "" }, - "options_notifications_8": { - "message": "Om te afbreking te voorkomen, vul hier een groot getal in.", + "options_notifications_38": { + "message": "Snellere acties (markeren als gelezen, verwijderen, ...) (Acties beschouwen als voltooid zodra koppen ontvangen zijn)", "description": "" }, - "options_donation": { - "message": "Doe een donatie", + "options_notifications_40": { + "message": "Snelle acties toestaan vanuit meldingsgebied (maximaal twee acties - alleen Chrome)", "description": "" }, - "msg_3": { - "message": "Geselecteerde tekst is gekopieerd naar het klembord.", + "options_notifications_41": { + "message": "Markeren als gelezen", "description": "" }, - "options_misc_7": { - "message": "Welkomstpagina weergeven na update", + "options_notifications_42": { + "message": "Archiveren", "description": "" }, - "options_gmail": { - "message": "Gmail:", + "options_notifications_43": { + "message": "Verpl. nr. prullenbak", "description": "" }, - "label_1": { - "message": "Verversen", + "options_tab": { + "message": "Tabblad openen:", "description": "" }, - "options_notifications_5": { - "message": "Beschikbare variabelen", + "options_tab_1": { + "message": "Alleen op het actieve venster zoeken naar een geopend Gmail-account", "description": "" }, - "options_notifications_24": { - "message": "Volumeniveau is een getal tussen de 0 en 100 waar 100 het hoogste volumeniveau is (standaard).", + "options_tab_2": { + "message": "Niet in andere browservensters zoeken naar geopende Gmail-accounts. Als Gmail niet is geopend in het actieve venster, wordt een nieuw tabblad geopend.", "description": "" }, - "options_notifications_10": { - "message": "Opmerking voor Mac-gebruikers: sinds Firefox 28.0 worden alle bureaubladmeldingen afgehandeld middels het Mac Berichtencentrum welke een extra meldingsgeluid afspeelt. U moet ofwel deze optie uitschakelen ofwel de corresponderende optie in het Mac Berichtencentrm.", + "options_tab_3": { + "message": "Nieuw Gmail-account openen op tabblad naast actief tabblad", "description": "" }, - "options_misc_2": { - "message": "De standaardsortering is sorteren op datum ingelogd.", + "options_tab_4": { + "message": "Gmail-account openen op actief tabblad", "description": "" }, - "options_toolbar_2": { - "message": "Altijd e-mail-voorbeeldpaneel openen", + "options_tab_5": { + "message": "Gmail-account openen op achtergrondtabblad", "description": "" }, - "popup_settings": { - "message": "Instellingen", + "options_tab_6": { + "message": "Gmail-account openen in nieuw venster", "description": "" }, - "options_gmail_4": { - "message": "Derde account (/mail/u/2)", + "options_tab_7": { + "message": "Altijd blanco tabbladen gebruiken in plaats van een nieuw tabblad te openen als een tabblad is geactiveerd", "description": "" }, - "options_toolbar_5": { - "message": "Samenvatting weergeven", + "options_tab_8": { + "message": "Geopende Gmail-tabbladen negeren", "description": "" }, - "options_notifications_12": { - "message": "Taakbalkmeldingen worden momenteel niet ondersteund op Linux-besturingssystemen.", + "options_tab_9": { + "message": "Als dit niet is aangevinkt, dan zal Gmail-melder óf binnen het actieve venster óf binnen alle geopende vensters controleren of Gmail al geopend is. Daarna zal naar het actieve tabblad worden overgeschakeld (indien gewenst).", "description": "" }, - "options_notifications_35": { - "message": "Om een nieuw aangepast geluid te selecteren moet u eerst een ingebouwd geluid selecteren en deze wijzigen naar een aangepast geluid", + "options_tab_10": { + "message": "E-mails opmaken met html", "description": "" }, - "msg_1": { - "message": "Tabblad is al geopend. Klik op de werkbalkknop om Gmail in een nieuw tabblad te openen of om naar een bestaand Gmail-tabblad over te schakelen.", + "options_tab_11": { + "message": "Open de nieuwste ongelezen e-mail in plaats van de inbox-map", "description": "" }, - "popup_refresh": { - "message": "Verversen", + "options_toolbar": { + "message": "Werkbalk:", "description": "" }, - "options_misc_5": { - "message": "Blauwe kleur voor \"Geen ongelezen berichten en grijze kleur voor \"Niet verbonden\"", + "options_toolbar_1": { + "message": "Gedrag van werkbalkknop", "description": "" }, - "options_timings_l8": { - "message": "Stel de waarde op nul in om geen e-mailcontrole uit te voeren zolang er nog geen handmatige verversing is uitgevoerd [Niet beschikbaar in Safari].", + "options_toolbar_2": { + "message": "E-mailvoorvertoningspaneel openen", "description": "" }, - "popup_msg_19": { - "message": "oktober", + "options_toolbar_3": { + "message": "Gmail-account openen als er slechts één account is ingelogd", "description": "" }, - "options_notifications_33": { - "message": "e-mail-titel bevat", + "options_toolbar_18": { + "message": "Gmail-account openen (afdwingen)", "description": "" }, - "tooltip_3": { - "message": "Rechtsklik: Accountselectie", + "options_toolbar_4": { + "message": "Werkbalkpaneelmodus", "description": "" }, - "popup_date_format": { - "message": "%mm %dd, %yy", + "options_toolbar_5": { + "message": "Samenvatting tonen", "description": "" }, - "options_notifications": { - "message": "Meldingen:", + "options_toolbar_6": { + "message": "Volledige inhoud tonen", "description": "" }, - "options_timings_l6": { - "message": "Een waarde hoger dan nul zorgt voor constante bureaubladmeldingen en waarschuwingsgeluiden (vergelijkbaar met het arriveren van een Nieuwe e-mail) wanneer u ongelezen e-mail(s) hebt.", + "options_toolbar_7": { + "message": "De breedte van het werkbalkpaneel in de volledige weergavemodus is (in pixels):", "description": "" }, - "popup_msg_12": { - "message": "maart", + "options_toolbar_8": { + "message": "De minimale breedte is 500px.", "description": "" }, - "options_notifications_22": { - "message": "Als uw browser geen aangepast meldingsgeluid afspeelt, probeer dan om het te converteren naar plat WAV-formaat middels een online converteerapplicatie.", + "options_toolbar_9": { + "message": "De hoogte van het werkbalkpaneel in de volledige weergavemodus is (in pixels):", "description": "" }, - "options_tab_1": { - "message": "Alleen op het actieve venster zoeken naar een openstaand Gmail-account", + "options_toolbar_10": { + "message": "De minimale hoogte is 500px.", "description": "" }, - "popup_msg_7_format": { - "message": "%d dagen geleden", + "options_toolbar_11": { + "message": "Sneltoetsen ondersteunen op het werkbalkpaneel", "description": "" }, - "options_timings_l1": { - "message": "Op nieuwe e-mails controleren, elke (in seconden):", + "options_toolbar_12": { + "message": "!: Melden als spam, #:Verplaatsen naar prullenbak, e:Archiveren, Shift + i: Markeren als ongelezen.", "description": "" }, - "options_toolbar_4": { - "message": "Werkbalkpaneel-modus", + "options_toolbar_13": { + "message": "E-mails opmaken met html in volledige weergavemodus", "description": "" }, - "toolbar_label": { - "message": "Gmail™-melder", + "options_toolbar_14": { + "message": "Schakel deze optie uit als u voorkeur geeft aan plattetekstopmaak in de volledige weergavemodus.", "description": "" }, - "popup_msg_1": { - "message": "zojuist", + "options_toolbar_15": { + "message": "Middelklikken op de werkbalkknop om", "description": "" }, - "popup_open_settings": { - "message": "Instellingen openen", + "options_toolbar_16": { + "message": "Alle accounts te verversen", + "description": "" + }, + "options_toolbar_17": { + "message": "Het primaire Gmail-account te openen", + "description": "" + }, + "options_misc": { + "message": "Overig:", + "description": "" + }, + "options_misc_1": { + "message": "Accounts alfabetisch sorteren", + "description": "" + }, + "options_misc_2": { + "message": "De standaardsortering is sorteren op datum van inloggen.", "description": "" }, "options_misc_3": { - "message": "Kleurenpatroon van werkbalk is", + "message": "Het kleurenpatroon van de werkbalk is", "description": "" }, - "options_gmail_12": { - "message": "Scheidt feeds met het kommateken (\",\"). Voorbeeldfeed: https://mail.google.com/mail/u/0/feed/atom/inbox", + "options_misc_4": { + "message": "Grijze kleur bij ‘Geen ongelezen berichten’ en blauwe kleur bij ‘Niet verbonden’", "description": "" }, - "options_toolbar_12": { - "message": "!: Rapporteren als spam, #:Verplaatsen naar prullenbak, e:Archiveren, Shift + i: Markeren als ongelezen.", + "options_misc_5": { + "message": "Blauwe kleur bij ‘Geen ongelezen berichten’ en grijze kleur bij ‘Niet verbonden’", "description": "" }, - "options_px": { - "message": "px", + "options_misc_9": { + "message": "Rode kleur bij ‘Geen ongelezen berichten’ en grijze kleur bij ‘Niet verbonden’", "description": "" }, - "options_misc_11": { - "message": "Door deze instelling op nul te zetten ontvangt geen bureaublad- of geluidsmeldingen; u krijgt echter nog wél de indicator op de knop.", + "options_misc_6": { + "message": "Bureaubladmelding tonen als Gmail al geopend is op het actieve tabblad", "description": "" }, - "options_notifications_20": { - "message": "Eigen gekozen geluid", + "options_misc_7": { + "message": "Welkomstpagina tonen na updates", "description": "" }, - "and": { - "message": "en", + "options_misc_8": { + "message": "Alle instellingen naar standaardwaarden herstellen", "description": "" }, - "options_tab_7": { - "message": "Altijd lege tabbladen gebruiken in plaats een nieuw tabblad te openen wanneer een tabblad is geactiveerd", + "options_misc_10": { + "message": "Alleen bureaublad- en geluidsmeldingen ontvangen als een e-mail ontvangen is in minder dan (in minuten):", "description": "" }, - "options_toolbar_3": { - "message": "Gmail-account openen wanneer er slechts één account is ingelogd", + "options_misc_11": { + "message": "Door deze instelling op nul te zetten ontvangt geen bureaublad- of geluidsmeldingen - u ziet echter nog wél de indicator op de knop.", "description": "" }, - "options_gmail_7": { - "message": "Zesde account (/mail/u/5)", + "options_misc_12": { + "message": "Geen inloggegevens in de tooltiptekst weergeven", "description": "" }, - "popup_msg_8_format": { - "message": "%d we(e)k(en) geleden", + "options_misc_13": { + "message": "Standaard toont de melder inloggegevens op de hulpballon van de werkbalkknop. Door deze instelling uit te schakelen blijft de tekst op de standaardwaarde.", "description": "" }, - "options_toolbar": { - "message": "Werkbalk:", + "options_misc_14": { + "message": "Geen exact embleemgetal tonen als het aantal ongelezen e-mails meer is dan 999", "description": "" }, - "options_notifications_6": { - "message": "Meldingen afbreken die langer zijn dan", + "options_misc_15": { + "message": "Veelgestelde vragen-pagina openen na updates", "description": "" }, - "popup_wait": { - "message": "Wachten...", + "options_plugins": { + "message": "Plug-ins:", "description": "" }, - "tooltip_2": { - "message": "Middelklik (of Ctrl+Links): Alle accounts verversen", + "options_plugins_1": { + "message": "Gmail-labels en sterknop (experimenteel)", "description": "" }, - "options_notifications_29": { - "message": "Deze optie is gerelateerd aan het rechtermuisknopmenu op de werkbalkknop -> Alle meldingen uitschakelen -> Aangepaste tijdsperiode.", + "options_plugins_2": { + "message": "Deze plug-in toont de sterknop en onderwerplabels in de pop-up (alleen in de uitgeklapte modus).", "description": "" }, - "options_tab_3": { - "message": "Nieuw Gmail-account openen op tabblad naast actief tabblad", + "options_px": { + "message": "px", "description": "" }, - "options_gmail_8": { - "message": "Bericht als gelezen markeren na archiveren", + "options_empty": { + "message": "niet-opgegeven", "description": "" }, - "options_toolbar_17": { - "message": "Primair Gmail-account openen", + "options_button_test": { + "message": "Afspelen", "description": "" }, - "options_notifications_7": { - "message": "tekens voor [title] en [summary]-velden", + "options_button_reset": { + "message": "Standaardwaarden herstellen", "description": "" }, - "options_misc_10": { - "message": "Alleen bureaublad- en geluidsmeldingen weergeven wanneer een e-mail binnen is ontvangen in minder dan (in minuten):", + "popup_settings": { + "message": "Instellingen", "description": "" }, - "options_tab_8": { - "message": "Geopende Gmail-tabbladen negeren", + "popup_of": { + "message": "van", + "description": "" + }, + "popup_wait": { + "message": "Even geduld…", + "description": "" + }, + "popup_date_format": { + "message": "%dd %mm %yy", "description": "" }, "popup_no_subject": { "message": "(geen onderwerp)", "description": "" }, - "msg_5": { - "message": "Selecteer een audiobestand", + "popup_open_settings": { + "message": "Instellingen openen", "description": "" }, - "popup_msg_2": { - "message": "1 minuut geleden", + "popup_open_inbox": { + "message": "Inbox openen", "description": "" }, - "popup_msg_16": { - "message": "juli", + "popup_archive": { + "message": "Archief", "description": "" }, - "label_8": { - "message": "Voor 2 uur", + "popup_spam": { + "message": "Spam", "description": "" }, - "msg_4": { - "message": "Let op: om de melder correct te laten werken moet u ingelogd zijn op uw Google-account.", + "popup_trash": { + "message": "Prullenbak", "description": "" }, - "popup_msg_20": { - "message": "november", + "popup_refresh": { + "message": "Verversen", "description": "" }, - "options_toolbar_6": { - "message": "Volledige inhoud weergeven", + "popup_read": { + "message": "Markeren als gelezen", "description": "" }, - "options_gmail_11": { - "message": "Aangepaste feeds:", + "popup_read_all": { + "message": "Alles markeren als gelezen", "description": "" }, - "options_tab_2": { - "message": "Niet in andere browservensters zoeken naar openstaande Gmail-accounts. Als Gmail niet is geopend in het actieve venster, wordt een nieuw tabblad geopend.", + "popup_msg_1": { + "message": "zojuist", "description": "" }, - "label_11": { - "message": "Een e-mail opstellen", + "popup_msg_2": { + "message": "1 minuut geleden", "description": "" }, - "options_toolbar_7": { - "message": "Breedte van werkbalkpaneel in volledige-inhoudsweergave is (in pixels):", + "popup_msg_3_format": { + "message": "%d minuten geleden", "description": "" }, - "options_notifications_31": { - "message": "Aangepaste geluidsmelding", + "popup_msg_4": { + "message": "1 uur geleden", "description": "" }, - "options_timings_l5": { - "message": "Minimale tijdsduur is 5 minuten.", + "popup_msg_5": { + "message": "uur geleden", "description": "" }, - "options_misc": { - "message": "Diversen:", + "popup_msg_6": { + "message": "Gisteren", "description": "" }, - "options_gmail_2": { - "message": "Labels scheiden d.m.v. \",\" (komma).", + "popup_msg_7_format": { + "message": "%d dagen geleden", "description": "" }, - "options_misc_4": { - "message": "Grijze kleur voor \"Geen ongelezen berichten\" en blauwe kleur voor \"Niet verbonden\"", + "popup_msg_8_format": { + "message": "%d week/weken geleden", "description": "" }, - "options_toolbar_13": { - "message": "E-mails opmaken in HTML in volledige-inhoudsmodus", + "popup_msg_9_format": { + "message": "%d maand(en) geleden", "description": "" }, - "options_toolbar_16": { - "message": "Alle accounts verversen", + "popup_msg_10": { + "message": "januari", "description": "" }, - "options_gmail_6": { - "message": "Vijfde account (/mail/u/4)", + "popup_msg_11": { + "message": "februari", + "description": "" + }, + "popup_msg_12": { + "message": "maart", + "description": "" + }, + "popup_msg_13": { + "message": "april", "description": "" }, "popup_msg_14": { "message": "mei", "description": "" }, - "options_inshort": { - "message": "Labels- en accountsmelder voor Google Mail (Gmail)", + "popup_msg_15": { + "message": "juni", "description": "" }, - "options_misc_12": { - "message": "Geen inloggegevens in de tooltiptekst weergeven", + "popup_msg_16": { + "message": "juli", "description": "" }, - "options_tab_4": { - "message": "Gmail-account openen op actief tabblad", + "popup_msg_17": { + "message": "augustus", "description": "" }, - "popup_msg_3_format": { - "message": "%d minuten geleden", + "popup_msg_18": { + "message": "september", "description": "" }, - "label_12": { - "message": "Veel gestelde vragen (FAQ) openen", + "popup_msg_19": { + "message": "oktober", "description": "" }, - "description": { - "message": "Labels- en accountsmelder voor Google Mail (Gmail)", + "popup_msg_20": { + "message": "november", "description": "" }, - "popup_spam": { - "message": "Spam", + "popup_msg_21": { + "message": "december", + "description": "" + }, + "settings_open_title": { + "message": "Open de instellingenpagina", + "description": "" + }, + "settings_open_label": { + "message": "Instellingen openen", + "description": "" + }, + "gmail": { + "message": "Gmail-melder™", "description": "" } } \ No newline at end of file diff --git a/WebExtension/_locales/pl/messages.json b/v2/_locales/pl/messages.json similarity index 87% rename from WebExtension/_locales/pl/messages.json rename to v2/_locales/pl/messages.json index 8395b883..ecc52345 100644 --- a/WebExtension/_locales/pl/messages.json +++ b/v2/_locales/pl/messages.json @@ -1,690 +1,762 @@ { - "label_9": { - "message": "Przez 5 godzin", + "toolbar_label": { + "message": "Powiadomienia Gmail™", "description": "" }, - "options_notifications_19": { - "message": "Sygnał e-mail Windows", + "tooltip_1": { + "message": "LPM: Otwórz Gmail lub panel podglądu wiadomości", "description": "" }, - "options_notifications_17": { - "message": "Dzwonek Checker Plus", + "tooltip_2": { + "message": "Kółko myszy (lub Ctrl+LPM): Odśwież wszystkie konta", "description": "" }, - "options_notifications_13": { - "message": "Otwórz panel paska narzędzi podczas kliknięcia na ikonkę powiadomień paska zadań (tylko Windows, beta)", + "tooltip_3": { + "message": "PPM: Wybór kont", "description": "" }, - "options_notifications_30": { - "message": "Połącz wszystkie jednoczesne powiadomienia na pulpicie w pojedyncze", + "description": { + "message": "Etykiety i powiadomienia kont dla Poczty Google (Gmail)", "description": "" }, - "settings_open_label": { - "message": "Otwórz opcje", + "log_in_to_your_account": { + "message": "Proszę się zalogować do konta Gmail", "description": "" }, - "options_timings_l7": { - "message": "Sprawdzaj nowe wiadomości przy starcie po (sekundy):", + "msg_1": { + "message": "Karta jest już otworzona. Naciśnij na przycisku paska narzędzi, aby otworzyć Gmail w nowej karcie lub aby przełączyć się na istniejącą kartę Gmail.", "description": "" }, - "label_4": { - "message": "Przez 5 minut", + "msg_2": { + "message": "Link został skopiowany do schowka.", "description": "" }, - "options_timings_l3": { - "message": "Przypominaj o nieprzeczytanych wiadomościach co (minuty):", + "msg_3": { + "message": "Zaznaczony tekst został skopiowany do schowka.", "description": "" }, - "popup_msg_4": { - "message": "godzinę temu", + "msg_4": { + "message": "Informacja: Aby powiadomienia działały poprawnie, musisz być zalogowany do swojego konta Google.", "description": "" }, - "options_gmail_1": { - "message": "Konto główne (/mail/u/0/)", + "msg_5": { + "message": "Wybierz plik z dźwiękiem audio", "description": "" }, - "options_gmail_10": { - "message": "Otrzymuj powiadomienia dla następujących etykiet oraz kont:", + "label_1": { + "message": "Odśwież", "description": "" }, - "options_notifications_1": { - "message": "Wyświetlaj na pulpicie powiadomienia o nowych wiadomościach", + "label_2": { + "message": "Ustawienia", "description": "" }, - "options_notifications_9": { - "message": "Odtwórz dźwięk po otrzymaniu nowych wiadomości", + "label_3": { + "message": "Wyłącz wszystkie powiadomienia", + "description": "" + }, + "label_4": { + "message": "Przez 5 minut", + "description": "" + }, + "label_5": { + "message": "Przez 15 minut", "description": "" }, "label_6": { "message": "Przez 30 minut", "description": "" }, - "options_misc_8": { - "message": "Przywróć wszystkie ustawienia do fabrycznych", + "label_7": { + "message": "Przez godzinę", "description": "" }, - "options_notifications_28": { - "message": "Wyłącz wszystkie powiadomienia na własny odstęp czasowy (minuty):", + "label_8": { + "message": "Przez 2 godziny", "description": "" }, - "options_timings_l4": { - "message": "Ustaw wartość na zero, aby nie otrzymywać przypomnień.", + "label_9": { + "message": "Przez 5 godzin", "description": "" }, - "options_notifications_32": { - "message": "nazwa lub e-mail zawiera", + "label_13": { + "message": "Na własny odstęp czasowy", "description": "" }, - "options_tab_6": { - "message": "Otwórz konto Gmail w nowym oknie", + "label_10": { + "message": "Włącz powiadomienia (dla sesji)", "description": "" }, - "options_notifications_25": { - "message": "Safari często odtwarza nieprawidłowo domyślne dźwięki powiadomień. W takim przypadku spróbuj użyć własnych dźwięków powiadomień.", + "label_11": { + "message": "Stwórz wiadomość", "description": "" }, - "options_toolbar_15": { - "message": "Akcja środkowego przycisku myszy na pasku narzędzi:", + "label_12": { + "message": "Otwórz FAQ", "description": "" }, - "options_toolbar_10": { - "message": "Minimalna wysokość to 500px.", + "label_14": { + "message": "Zalogowane konta", "description": "" }, - "popup_msg_10": { - "message": "stycznia", + "unknown": { + "message": "nieznane", "description": "" }, - "options_notifications_26": { - "message": "Zawsze pokazuj ikony powiadomień (tylko Windows)", + "and": { + "message": "i", "description": "" }, - "label_3": { - "message": "Wyłącz wszystkie powiadomienia", + "log_into_your_account": { + "message": "Proszę się zalogować do swojego konta", "description": "" }, - "label_13": { - "message": "Na własny odstęp czasowy", + "notification": { + "message": "Od: [author_email][break]Tytuł: [title][break]Streszczenie: [summary]", "description": "" }, - "options_empty": { - "message": "nie określono", + "options_title": { + "message": "Opcje - Powiadomienia Gmail™", "description": "" }, - "options_notifications_3": { - "message": "Ta opcja może nie działać na twoim systemie operacyjnym.", + "options_inshort": { + "message": "Etykiety i powiadomienia kont dla Poczty Google (Gmail).", + "description": "" + }, + "options_donation": { + "message": "Wspomóż rozwój programu", "description": "" }, "options_timings": { - "message": "Czasowe", + "message": "Czasowe:", "description": "" }, - "options_gmail_5": { - "message": "Czwarte konto (/mail/u/3/)", + "options_timings_l1": { + "message": "Sprawdzaj nowe wiadomości co (sekundy):", "description": "" }, - "label_5": { - "message": "Przez 15 minut", + "options_timings_l2": { + "message": "Minimalny odstęp czasowy to 10 sekund.", "description": "" }, - "options_misc_9": { - "message": "Czerwony dla \"Nieprzeczytane\" i szary dla \"Rozłączony\"", + "options_timings_l3": { + "message": "Przypominaj o nieprzeczytanych wiadomościach co (minuty):", "description": "" }, - "popup_msg_5": { - "message": "godzin(y) temu", + "options_timings_l4": { + "message": "Ustaw wartość na zero, aby nie otrzymywać przypomnień.", "description": "" }, - "options_notifications_27": { - "message": "Ikony obszaru powiadomień będą zawsze wyświetlane, nawet gdy brak nieprzeczytanych wiadomości.", + "options_timings_l5": { + "message": "Minimalny odstęp czasowy to 5 minut.", "description": "" }, - "options_misc_1": { - "message": "Sortuj konta alfabetycznie", + "options_timings_l6": { + "message": "Wartości inne niż zero wyzwalają powiadomienia na pulpicie oraz dźwięk, dopóki posiadasz nieprzeczytane wiadomości (podobnie jak otrzymanie nowej poczty).", "description": "" }, - "tooltip_1": { - "message": "LPM: Otwórz Gmail lub panel podglądu wiadomości", + "options_timings_l7": { + "message": "Sprawdzaj nowe wiadomości przy starcie po (sekundy):", "description": "" }, - "notification": { - "message": "Od: [author_email][break]Tytuł: [title][break]Streszczenie: [summary]", + "options_timings_l8": { + "message": "Ustaw wartość na zero, aby nie sprawdzać nowych wiadomości przed pierwszym ręcznym odświeżeniem [niedostępne na Safari].", "description": "" }, - "popup_trash": { - "message": "Usuń", + "options_gmail": { + "message": "Gmail:", "description": "" }, - "options_tab": { - "message": "Otwieranie kart:", + "options_gmail_1": { + "message": "Konto główne (/mail/u/0/)", "description": "" }, - "log_into_your_account": { - "message": "Proszę się zalogować do swojego konta", + "options_gmail_2": { + "message": "Oddzielaj etykiety znakiem \",\" (przecinek).", "description": "" }, - "label_10": { - "message": "Włącz powiadomienia", + "options_gmail_3": { + "message": "Drugie konto (/mail/u/1/)", "description": "" }, - "options_notifications_23": { - "message": "Głośność dźwięku powiadomienia", + "options_gmail_4": { + "message": "Trzecie konto (/mail/u/2/)", "description": "" }, - "options_timings_l2": { - "message": "Minimalny odstęp czasowy to 10 sekund.", + "options_gmail_5": { + "message": "Czwarte konto (/mail/u/3/)", "description": "" }, - "options_toolbar_11": { - "message": "Wsparcie skrótów klawiszowych w panelu paska narzędzi", + "options_gmail_6": { + "message": "Piąte konto (/mail/u/4)", "description": "" }, - "options_gmail_9": { - "message": "Popularne etykiety: \"inbox\", \"important\", \"^smartlabel_personal\", \"^smartlabel_newsletter\", \"^smartlabel_notification\" oraz \"^smartlabel_group\"", + "options_gmail_7": { + "message": "Szóste konto (/mail/u/5/)", "description": "" }, - "popup_msg_17": { - "message": "sierpnia", + "options_gmail_8": { + "message": "Oznacz wiadomość jako przeczytaną podczas archiwizowania", "description": "" }, - "popup_msg_15": { - "message": "czerwca", + "options_gmail_15": { + "message": "Kilka popularnych etykiet:", "description": "" }, - "options_notifications_34": { - "message": "podsumowanie e-mail'a zawiera", + "options_gmail_10": { + "message": "Otrzymuj powiadomienia dla następujących etykiet oraz kont:", "description": "" }, - "label_14": { - "message": "Zalogowane konta", + "options_gmail_11": { + "message": "Własne kanały:", "description": "" }, - "options_misc_13": { - "message": "Rozszerzenie domyślnie aktualizuje treść okienka podpowiedzi na przycisku paska narzędzi informacjami o profilu. Odznaczenie tej opcji spowoduje zachowanie treści w domyślnej wartości.", + "options_gmail_12": { + "message": "Oddzielaj kanały znakiem \",\" (przecinek). Przykładowy kanał:\nhttps://mail.google.com/mail/u/0/feed/atom/inbox", "description": "" }, - "options_misc_6": { - "message": "Pokazuj powiadomienia na pulpicie, aby powiadomić, że Gmail jest już otwarty w aktywnej karcie", + "options_gmail_13": { + "message": "Informacja: maksymalna ilość wszystkich etykiet, poza \"inbox\", wynosi 20 (Kanały Google dostarczają jedynie 20 najnowszych rekordów).", "description": "" }, - "popup_read": { - "message": "Przeczytane", + "options_gmail_14": { + "message": "Informacja: Aby Powiadomienia nasłuchiwały więcej niż 5 kont, dodaj adresy URL kanałów do pola \"Własne kanały\". Na przykład, aby nasłuchiwać szóste i siódme konto, dodaj: https://mail.google.com/mail/u/6/feed/atom/inbox, https://mail.google.com/mail/u/7/feed/atom/inbox", + "description": "" + }, + "options_notifications": { + "message": "Powiadomienia:", + "description": "" + }, + "options_notifications_1": { + "message": "Wyświetlaj na pulpicie powiadomienia o nowych wiadomościach", + "description": "" + }, + "options_notifications_2": { + "message": "Pokazuj powiadomienia na pulpicie przez (sekundy):", + "description": "" + }, + "options_notifications_3": { + "message": "Ta opcja może nie działać na twoim systemie operacyjnym.", "description": "" }, "options_notifications_4": { "message": "Format powiadomienia", "description": "" }, - "settings_open_title": { - "message": "Otwórz stronę opcji (ustawień)", + "options_notifications_5": { + "message": "Dostępne klucze:", "description": "" }, - "label_2": { - "message": "Ustawienia", + "options_notifications_6": { + "message": "Skracaj powiadomienia dłuższe niż", "description": "" }, - "options_toolbar_14": { - "message": "Jeżeli wolisz surowy tekst w trybie pełnej zawartości, odznacz to pole.", + "options_notifications_7": { + "message": "znaków dla pól [title] oraz [summary].", "description": "" }, - "options_notifications_18": { - "message": "Dzwoneczek Checker Plus", + "options_notifications_8": { + "message": "Jeżeli nie chcesz skracać, wpisz dużą liczbę.", "description": "" }, - "options_tab_5": { - "message": "Otwórz konto Gmail w karcie w tle", + "options_notifications_9": { + "message": "Odtwórz dźwięk po otrzymaniu nowych wiadomości", "description": "" }, - "label_7": { - "message": "Przez godzinę", + "options_notifications_10": { + "message": "Informacja dla użytkowników systemu Mac. Począwszy od Firefox 28.0, wszystkie powiadomienia na pulpicie są przechwytywane przez Centrum Powiadomień Mac, które wywołuje dodatkowy dźwięk powiadomienia. Zalecane jest wyłączenie jednego z tych dźwięków.", "description": "" }, - "popup_archive": { - "message": "Archiwizuj", + "options_notifications_11": { + "message": "Wyświetlaj \"powiadomienia paska zadań Windows\" lub \"powiadomienia Mac OS Dock\"", "description": "" }, - "msg_2": { - "message": "Link został skopiowany do schowka.", + "options_notifications_12": { + "message": "Obecnie, powiadomienia paska zadań nie są wspierane na systemach Linuks.", "description": "" }, - "options_title": { - "message": "Opcje - Powiadomienia Gmail™", + "options_notifications_13": { + "message": "Otwórz panel paska narzędzi podczas kliknięcia na ikonkę powiadomień paska zadań (tylko Windows, beta)", "description": "" }, - "popup_msg_13": { - "message": "kwietnia", + "options_notifications_14": { + "message": "Ta funkcjonalność jest eksperymentalna i może uczynić Twoją przeglądarkę Firefox niestabilną [wymagany restart].", "description": "" }, - "popup_msg_9_format": { - "message": "miesięcy temu: %d", + "options_notifications_15": { + "message": "Domyślny dźwięk powiadomienia to", "description": "" }, - "popup_msg_11": { - "message": "lutego", + "options_notifications_16": { + "message": "Domyślny sygnał Powiadomień Gmail™", "description": "" }, - "popup_open_inbox": { - "message": "Otwórz skrzynkę", + "options_notifications_17": { + "message": "Dzwonek Checker Plus", "description": "" }, - "options_tab_9": { - "message": "Jeżeli odznaczono, Powiadomienia Gmail sprawdzą wszystkie otwarte okna w poszukiwaniu karty z otwartym Gmail'em, a następnie otworzy ją na żądanie.", + "options_notifications_18": { + "message": "Dzwoneczek Checker Plus", "description": "" }, - "gmail": { - "message": "Powiadomienia Gmail™", + "options_notifications_19": { + "message": "Sygnał e-mail Windows", "description": "" }, - "popup_msg_6": { - "message": "wczoraj", + "options_notifications_20": { + "message": "Własny sygnał", "description": "" }, - "options_toolbar_8": { - "message": "Minimalna szerokość to 500px.", + "options_notifications_21": { + "message": "Własny dźwięk powiadomień:", "description": "" }, - "options_notifications_16": { - "message": "Domyślny sygnał Powiadomień Gmail™", + "options_notifications_22": { + "message": "Jeżeli Twoja przeglądarka nie odtwarza własnego dźwięku powiadomienia, spróbuj go przetworzyć na format WAV przy pomocy narzędzi konwersji w sieci.", "description": "" }, - "options_misc_14": { - "message": "Nie wyświetlaj szczegółowej liczby na znaczku, gdy liczba nieprzeczytanych wiadomości jest większa niż 999", + "options_notifications_35": { + "message": "Aby wybrać nowy własny dźwięk, najpierw wybierz wbudowany dźwięk, a następnie zmień wybór na Własny dźwięk", "description": "" }, - "popup_msg_18": { - "message": "września", + "options_notifications_23": { + "message": "Głośność dźwięku powiadomienia", "description": "" }, - "options_notifications_14": { - "message": "Ta funkcjonalność jest eksperymentalna i może uczynić Twoją przeglądarkę Firefox niestabilną [wymagany restart].", + "options_notifications_24": { + "message": "Głośność to liczba pomiędzy 0 i 100, gdzie 100 oznacza najwyższą głośność (domyślnie).", "description": "" }, - "options_gmail_3": { - "message": "Drugie konto (/mail/u/1/)", + "options_notifications_25": { + "message": "Safari często odtwarza nieprawidłowo domyślne dźwięki powiadomień. W takim przypadku spróbuj użyć własnych dźwięków powiadomień.", "description": "" }, - "options_notifications_11": { - "message": "Wyświetlaj \"powiadomienia paska zadań Windows\" lub \"powiadomienia Mac OS Dock\"", + "options_notifications_26": { + "message": "Zawsze pokazuj ikony powiadomień (tylko Windows)", "description": "" }, - "options_notifications_2": { - "message": "Pokazuj powiadomienia na pulpicie przez (sekundy):", + "options_notifications_27": { + "message": "Ikony obszaru powiadomień będą zawsze wyświetlane, nawet gdy brak nieprzeczytanych wiadomości.", "description": "" }, - "log_in_to_your_account": { - "message": "Proszę się zalogować do konta Gmail", + "options_notifications_28": { + "message": "Wyłącz wszystkie powiadomienia na własny odstęp czasowy (minuty):", "description": "" }, - "popup_of": { - "message": "z", + "options_notifications_29": { + "message": "Ta opcja jest dostępna po naciśnięciu Prawym Przyciskiem Myszy na przycisk na pasku narzędzi -> Wyłącz wszystkie powiadomienia -> Własny odstęp czasowy.", "description": "" }, - "options_notifications_15": { - "message": "Domyślny dźwięk powiadomienia to", + "options_notifications_30": { + "message": "Połącz wszystkie jednoczesne powiadomienia na pulpicie w pojedyncze", "description": "" }, - "options_notifications_21": { - "message": "Własny dźwięk powiadomień:", + "options_notifications_31": { + "message": "Własny dźwięk powiadomienia", "description": "" }, - "options_toolbar_9": { - "message": "Wysokość panelu paska narzędzi w trybie pełnej zawartości (piksele):", + "options_notifications_32": { + "message": "nazwa lub e-mail zawiera", "description": "" }, - "options_toolbar_1": { - "message": "Zachowanie przycisku paska narzędzi", + "options_notifications_33": { + "message": "tytuł e-mail'a zawiera", "description": "" }, - "unknown": { - "message": "nieznane", + "options_notifications_34": { + "message": "podsumowanie e-mail'a zawiera", "description": "" }, - "popup_msg_21": { - "message": "grudnia", + "options_notifications_36": { + "message": "Unikaj przekierowywania Gmail'a do 'inbox.google.com'", "description": "" }, - "popup_read_all": { - "message": "Wszystkie przeczytane", + "options_notifications_37": { + "message": "Wyświetlaj symbol z liczbą wiadomości", "description": "" }, - "options_notifications_8": { - "message": "Jeżeli nie chcesz skracać, wpisz dużą liczbę.", + "options_notifications_38": { + "message": "Szybsze operacje (oznacz jako przeczytane, usuń, ...) (Operacje są wykonywane po otrzymaniu nagłówków)", "description": "" }, - "options_donation": { - "message": "Złóż dotację", + "options_notifications_40": { + "message": "Zezwól na szybkie akcje z okna powiadomień (maksymalnie dwie akcje) (tylko dla Chrome)", "description": "" }, - "msg_3": { - "message": "Zaznaczony tekst został skopiowany do schowka.", + "options_notifications_41": { + "message": "Oznacz jako przeczytane", "description": "" }, - "options_misc_7": { - "message": "Pokazuj stronę powitalną po aktualizacji", + "options_notifications_42": { + "message": "Archiwizuj", "description": "" }, - "options_gmail": { - "message": "Gmail:", + "options_notifications_43": { + "message": "Usuń", "description": "" }, - "label_1": { - "message": "Odśwież", + "options_tab": { + "message": "Otwieranie kart:", "description": "" }, - "options_notifications_5": { - "message": "Dostępne klucze:", + "options_tab_1": { + "message": "Szukaj w aktywnym oknie otwartej karty z kontem Gmail", "description": "" }, - "options_notifications_24": { - "message": "Głośność to liczba pomiędzy 0 i 100, gdzie 100 oznacza najwyższą głośność (domyślnie).", + "options_tab_2": { + "message": "Nie przeszukuj innych okien przeglądarki pod kątem otwartych kont Gmail. Jeżeli Gmail nie jest otworzony w aktywnym oknie, otwórz nową kartę.", "description": "" }, - "options_notifications_10": { - "message": "Informacja dla użytkowników systemu Mac. Począwszy od Firefox 28.0, wszystkie powiadomienia na pulpicie są przechwytywane przez Centrum Powiadomień Mac, które wywołuje dodatkowy dźwięk powiadomienia. Zalecane jest wyłączenie jednego z tych dźwięków.", + "options_tab_3": { + "message": "Otwórz kolejne konto Gmail za aktywną kartą", "description": "" }, - "options_misc_2": { - "message": "Domyślne sortowanie bazuje na kolejności zalogowania.", + "options_tab_4": { + "message": "Otwórz konto Gmail w aktywnej karcie", "description": "" }, - "options_toolbar_2": { - "message": "Zawsze otwieraj panel podglądu wiadomości", + "options_tab_5": { + "message": "Otwórz konto Gmail w karcie w tle", "description": "" }, - "popup_settings": { - "message": "Ustawienia", + "options_tab_6": { + "message": "Otwórz konto Gmail w nowym oknie", "description": "" }, - "options_gmail_4": { - "message": "Trzecie konto (/mail/u/2/)", + "options_tab_7": { + "message": "Zawsze używaj pustych kart zamiast otwierania nowej karty (gdy opcja otwierania na karcie jest aktywna)", "description": "" }, - "options_toolbar_5": { - "message": "Pokazuj tylko podsumowanie", + "options_tab_8": { + "message": "Ignoruj otwarte karty Gmail'a", "description": "" }, - "options_notifications_12": { - "message": "Obecnie, powiadomienia paska zadań nie są wspierane na systemach Linuks.", + "options_tab_9": { + "message": "Jeżeli odznaczono, Powiadomienia Gmail sprawdzą wszystkie otwarte okna w poszukiwaniu karty z otwartym Gmail'em, a następnie otworzy ją na żądanie.", "description": "" }, - "options_notifications_35": { - "message": "Aby wybrać nowy własny dźwięk, najpierw wybierz wbudowany dźwięk, a następnie zmień wybór na Własny dźwięk", + "options_tab_10": { + "message": "Otwórz wiadomości w trybie podstawowego HTML", "description": "" }, - "msg_1": { - "message": "Karta jest już otworzona. Naciśnij na przycisku paska narzędzi, aby otworzyć Gmail w nowej karcie lub aby przełączyć się na istniejącą kartę Gmail.", + "options_tab_11": { + "message": "Otwórz najnowszą nieprzeczytaną wiadomość zamiast folderu Odebrane", "description": "" }, - "popup_refresh": { - "message": "Odśwież", + "options_toolbar": { + "message": "Pasek narzędzi:", "description": "" }, - "options_misc_5": { - "message": "Niebieski dla \"Nieprzeczytane\" i szary dla \"Rozłączony\"", + "options_toolbar_1": { + "message": "Zachowanie przycisku paska narzędzi", + "description": "" + }, + "options_toolbar_2": { + "message": "Zawsze otwieraj panel podglądu wiadomości", + "description": "" + }, + "options_toolbar_3": { + "message": "Otwieraj konto Gmail, tylko jeżeli zalogowano na jednym", + "description": "" + }, + "options_toolbar_18": { + "message": "Otwórz konto Gmail (wymuś)", + "description": "" + }, + "options_toolbar_4": { + "message": "Tryb panelu paska narzędzi", + "description": "" + }, + "options_toolbar_5": { + "message": "Pokazuj tylko podsumowanie", + "description": "" + }, + "options_toolbar_6": { + "message": "Pokazuj pełną zawartość", + "description": "" + }, + "options_toolbar_7": { + "message": "Szerokość panelu paska narzędzi w trybie pełnej zawartości (piksele):", + "description": "" + }, + "options_toolbar_8": { + "message": "Minimalna szerokość to 500px.", "description": "" }, - "options_timings_l8": { - "message": "Ustaw wartość na zero, aby nie sprawdzać nowych wiadomości przed pierwszym ręcznym odświeżeniem [niedostępne na Safari].", + "options_toolbar_9": { + "message": "Wysokość panelu paska narzędzi w trybie pełnej zawartości (piksele):", "description": "" }, - "popup_msg_19": { - "message": "października", + "options_toolbar_10": { + "message": "Minimalna wysokość to 500px.", "description": "" }, - "options_notifications_33": { - "message": "tytuł e-mail'a zawiera", + "options_toolbar_11": { + "message": "Wsparcie skrótów klawiszowych w panelu paska narzędzi", "description": "" }, - "tooltip_3": { - "message": "PPM: Wybór kont", + "options_toolbar_12": { + "message": "!: Zgłoś spam, #: Usuń, e: Archiwizuj, Shift + i: Oznacz jako przeczytane.", "description": "" }, - "popup_date_format": { - "message": "%dd %mm %yy", + "options_toolbar_13": { + "message": "Wyświetlaj wiadomości jako HTML w trybie pełnej zawartości", "description": "" }, - "options_notifications": { - "message": "Powiadomienia:", + "options_toolbar_14": { + "message": "Jeżeli wolisz surowy tekst w trybie pełnej zawartości, odznacz to pole.", "description": "" }, - "options_timings_l6": { - "message": "Wartości inne niż zero wyzwalają powiadomienia na pulpicie oraz dźwięk, dopóki posiadasz nieprzeczytane wiadomości (podobnie jak otrzymanie nowej poczty).", + "options_toolbar_15": { + "message": "Akcja środkowego przycisku myszy na pasku narzędzi:", "description": "" }, - "popup_msg_12": { - "message": "marca", + "options_toolbar_16": { + "message": "Odśwież wszystkie konta", "description": "" }, - "options_notifications_22": { - "message": "Jeżeli Twoja przeglądarka nie odtwarza własnego dźwięku powiadomienia, spróbuj go przetworzyć na format WAV przy pomocy narzędzi konwersji w sieci.", + "options_toolbar_17": { + "message": "Otwórz główne konto Gmail", "description": "" }, - "options_tab_1": { - "message": "Szukaj w aktywnym oknie otwartej karty z kontem Gmail", + "options_misc": { + "message": "Różności:", "description": "" }, - "popup_msg_7_format": { - "message": "%d dni temu", + "options_misc_1": { + "message": "Sortuj konta alfabetycznie", "description": "" }, - "options_timings_l1": { - "message": "Sprawdzaj nowe wiadomości co (sekundy):", + "options_misc_2": { + "message": "Domyślne sortowanie bazuje na kolejności zalogowania.", "description": "" }, - "options_toolbar_4": { - "message": "Tryb panelu paska narzędzi", + "options_misc_3": { + "message": "Kolor paska narzędzi:", "description": "" }, - "toolbar_label": { - "message": "Powiadomienia Gmail™", + "options_misc_4": { + "message": "Szary dla \"Nieprzeczytane\" i niebieski dla \"Rozłączony\"", "description": "" }, - "popup_msg_1": { - "message": "przed chwilą", + "options_misc_5": { + "message": "Niebieski dla \"Nieprzeczytane\" i szary dla \"Rozłączony\"", "description": "" }, - "popup_open_settings": { - "message": "Otwórz ustawienia", + "options_misc_9": { + "message": "Czerwony dla \"Nieprzeczytane\" i szary dla \"Rozłączony\"", "description": "" }, - "options_misc_3": { - "message": "Kolor paska narzędzi:", + "options_misc_6": { + "message": "Pokazuj powiadomienia na pulpicie, aby powiadomić, że Gmail jest już otwarty w aktywnej karcie", "description": "" }, - "options_gmail_12": { - "message": "Oddzielaj kanały znakiem \",\" (przecinek). Przykładowy kanał:\nhttps://mail.google.com/mail/u/0/feed/atom/inbox", + "options_misc_7": { + "message": "Pokazuj stronę powitalną po aktualizacji", "description": "" }, - "options_toolbar_12": { - "message": "!: Zgłoś spam, #: Usuń, e: Archiwizuj, Shift + i: Oznacz jako przeczytane.", + "options_misc_8": { + "message": "Przywróć wszystkie ustawienia do fabrycznych", "description": "" }, - "options_px": { - "message": "px", + "options_misc_10": { + "message": "Uruchom powiadomienia na pulpicie oraz dźwiękowe, gdy e-mail został otrzymany poniżej (minut):", "description": "" }, "options_misc_11": { "message": "Ustawienie tej opcji na zero spowoduje, iż nie będziesz otrzymywać powiadomień na pulpicie ani dźwiękowych; jednakże nadal będziesz otrzymywać powiadomienia z ikonki na pasku narzędzi.", "description": "" }, - "options_notifications_20": { - "message": "Własny sygnał", + "options_misc_12": { + "message": "Nie uwzględniaj informacji o profilu w treści okienka podpowiedzi", "description": "" }, - "and": { - "message": "i", + "options_misc_13": { + "message": "Rozszerzenie domyślnie aktualizuje treść okienka podpowiedzi na przycisku paska narzędzi informacjami o profilu. Odznaczenie tej opcji spowoduje zachowanie treści w domyślnej wartości.", "description": "" }, - "options_tab_7": { - "message": "Zawsze używaj pustych kart zamiast otwierania nowej karty (gdy opcja otwierania na karcie jest aktywna)", + "options_misc_14": { + "message": "Nie wyświetlaj szczegółowej liczby na znaczku, gdy liczba nieprzeczytanych wiadomości jest większa niż 999", "description": "" }, - "options_toolbar_3": { - "message": "Otwieraj konto Gmail, tylko jeżeli zalogowano na jednym", + "options_misc_15": { + "message": "Otwórz stronę FAQ (Często zadawane pytania) po zaktualizowaniu", "description": "" }, - "options_gmail_7": { - "message": "Szóste konto (/mail/u/5/)", + "options_plugins": { + "message": "Wtyczki:", "description": "" }, - "popup_msg_8_format": { - "message": "%d tygodni(e) temu", + "options_plugins_1": { + "message": "Etykiety Gmail oraz symbol gwiazdki (eksperymentalne)", "description": "" }, - "options_toolbar": { - "message": "Pasek narzędzi:", + "options_plugins_2": { + "message": "Ta wtyczka wyświetla symbol gwiazdki oraz etykiety tematu w panelu podglądu wiadomości (tylko tryb rozszerzony).", "description": "" }, - "options_notifications_6": { - "message": "Skracaj powiadomienia dłuższe niż", + "options_px": { + "message": "px", "description": "" }, - "popup_wait": { - "message": "Czekaj...", + "options_empty": { + "message": "nie określono", "description": "" }, - "tooltip_2": { - "message": "Kółko myszy (lub Ctrl+LPM): Odśwież wszystkie konta", + "options_button_test": { + "message": "Odtwórz", "description": "" }, - "options_notifications_29": { - "message": "Ta opcja jest dostępna po naciśnięciu Prawym Przyciskiem Myszy na przycisk na pasku narzędzi -> Wyłącz wszystkie powiadomienia -> Własny odstęp czasowy.", + "options_button_reset": { + "message": "Przywróć ustawienia fabryczne", "description": "" }, - "options_tab_3": { - "message": "Otwórz kolejne konto Gmail za aktywną kartą", + "popup_settings": { + "message": "Ustawienia", "description": "" }, - "options_gmail_8": { - "message": "Oznacz wiadomość jako przeczytaną podczas archiwizowania", + "popup_of": { + "message": "z", "description": "" }, - "options_toolbar_17": { - "message": "Otwórz główne konto Gmail", + "popup_wait": { + "message": "Czekaj...", "description": "" }, - "options_notifications_7": { - "message": "znaków dla pól [title] oraz [summary].", + "popup_date_format": { + "message": "%dd %mm %yy", "description": "" }, - "options_misc_10": { - "message": "Uruchom powiadomienia na pulpicie oraz dźwiękowe, gdy e-mail został otrzymany poniżej (minut):", + "popup_no_subject": { + "message": "(brak tematu)", "description": "" }, - "options_tab_8": { - "message": "Ignoruj otwarte karty Gmail'a", + "popup_open_settings": { + "message": "Otwórz ustawienia", "description": "" }, - "popup_no_subject": { - "message": "(brak tematu)", + "popup_open_inbox": { + "message": "Otwórz skrzynkę", "description": "" }, - "msg_5": { - "message": "Wybierz plik z dźwiękiem audio", + "popup_archive": { + "message": "Archiwizuj", "description": "" }, - "popup_msg_2": { - "message": "minutę temu", + "popup_spam": { + "message": "Zgłoś spam", "description": "" }, - "popup_msg_16": { - "message": "lipca", + "popup_trash": { + "message": "Usuń", "description": "" }, - "label_8": { - "message": "Przez 2 godziny", + "popup_refresh": { + "message": "Odśwież", "description": "" }, - "msg_4": { - "message": "Informacja: Aby powiadomienia działały poprawnie, musisz być zalogowany do swojego konta Google.", + "popup_read": { + "message": "Przeczytane", "description": "" }, - "popup_msg_20": { - "message": "listopada", + "popup_read_all": { + "message": "Wszystkie przeczytane", "description": "" }, - "options_toolbar_6": { - "message": "Pokazuj pełną zawartość", + "popup_msg_1": { + "message": "przed chwilą", "description": "" }, - "options_gmail_11": { - "message": "Własne kanały:", + "popup_msg_2": { + "message": "minutę temu", "description": "" }, - "options_tab_2": { - "message": "Nie przeszukuj innych okien przeglądarki pod kątem otwartych kont Gmail. Jeżeli Gmail nie jest otworzony w aktywnym oknie, otwórz nową kartę.", + "popup_msg_3_format": { + "message": "%d minut(y) temu", "description": "" }, - "label_11": { - "message": "Stwórz wiadomość", + "popup_msg_4": { + "message": "godzinę temu", "description": "" }, - "options_toolbar_7": { - "message": "Szerokość panelu paska narzędzi w trybie pełnej zawartości (piksele):", + "popup_msg_5": { + "message": "godzin(y) temu", "description": "" }, - "options_notifications_31": { - "message": "Własny dźwięk powiadomienia", + "popup_msg_6": { + "message": "wczoraj", "description": "" }, - "options_timings_l5": { - "message": "Minimalny odstęp czasowy to 5 minut.", + "popup_msg_7_format": { + "message": "%d dni temu", "description": "" }, - "options_misc": { - "message": "Różności:", + "popup_msg_8_format": { + "message": "%d tygodni(e) temu", "description": "" }, - "options_gmail_2": { - "message": "Oddzielaj etykiety znakiem \",\" (przecinek).", + "popup_msg_9_format": { + "message": "miesięcy temu: %d", "description": "" }, - "options_misc_4": { - "message": "Szary dla \"Nieprzeczytane\" i niebieski dla \"Rozłączony\"", + "popup_msg_10": { + "message": "stycznia", "description": "" }, - "options_toolbar_13": { - "message": "Wyświetlaj wiadomości jako HTML w trybie pełnej zawartości", + "popup_msg_11": { + "message": "lutego", "description": "" }, - "options_toolbar_16": { - "message": "Odśwież wszystkie konta", + "popup_msg_12": { + "message": "marca", "description": "" }, - "options_gmail_6": { - "message": "Piąte konto (/mail/u/4)", + "popup_msg_13": { + "message": "kwietnia", "description": "" }, "popup_msg_14": { "message": "maja", "description": "" }, - "options_inshort": { - "message": "Etykiety i powiadomienia kont dla Poczty Google (Gmail).", + "popup_msg_15": { + "message": "czerwca", "description": "" }, - "options_misc_12": { - "message": "Nie uwzględniaj informacji o profilu w treści okienka podpowiedzi", + "popup_msg_16": { + "message": "lipca", "description": "" }, - "options_tab_4": { - "message": "Otwórz konto Gmail w aktywnej karcie", + "popup_msg_17": { + "message": "sierpnia", "description": "" }, - "popup_msg_3_format": { - "message": "%d minut(y) temu", + "popup_msg_18": { + "message": "września", "description": "" }, - "label_12": { - "message": "Otwórz FAQ", + "popup_msg_19": { + "message": "października", "description": "" }, - "description": { - "message": "Etykiety i powiadomienia kont dla Poczty Google (Gmail)", + "popup_msg_20": { + "message": "listopada", "description": "" }, - "popup_spam": { - "message": "Zgłoś spam", + "popup_msg_21": { + "message": "grudnia", + "description": "" + }, + "settings_open_title": { + "message": "Otwórz stronę opcji (ustawień)", + "description": "" + }, + "settings_open_label": { + "message": "Otwórz opcje", + "description": "" + }, + "gmail": { + "message": "Powiadomienia Gmail™", "description": "" } } \ No newline at end of file diff --git a/WebExtension/_locales/ru/messages.json b/v2/_locales/ru/messages.json similarity index 84% rename from WebExtension/_locales/ru/messages.json rename to v2/_locales/ru/messages.json index 01dc075d..0adcb5f2 100644 --- a/WebExtension/_locales/ru/messages.json +++ b/v2/_locales/ru/messages.json @@ -1,690 +1,762 @@ { - "label_9": { - "message": "на 5 часов", + "toolbar_label": { + "message": "Оповещения для Gmail™", "description": "" }, - "options_notifications_19": { - "message": "Оповещение о новом сообщении из Windows", + "tooltip_1": { + "message": "Левый клик: Открыть вкладку Gmail или окно предварительного просмотра", "description": "" }, - "options_notifications_17": { - "message": "Звонок из Checker Plus", + "tooltip_2": { + "message": "Средний клик (или Ctrl+левый клик): Обновить все аккаунты", "description": "" }, - "options_notifications_13": { - "message": "При клике на значок в трее открывать окно предварительного просмотра (только для Windows, beta)", + "tooltip_3": { + "message": "Правый клик: Меню дополнения", "description": "" }, - "options_notifications_30": { - "message": "Объединять несколько параллельных уведомлений в одно", + "description": { + "message": "Оповещение для нескольких аккаунтов Google Mail (Gmail)", "description": "" }, - "settings_open_label": { - "message": "Открыть настройки", + "log_in_to_your_account": { + "message": "Войдите, пожалуйста, в Ваш аккаунт Gmail", "description": "" }, - "options_timings_l7": { - "message": "Не проверять почту сразу после запуска в течении (в секундах):", + "msg_1": { + "message": "Вкладка уже открыта. Нажмите на кнопку на панели инструментов, чтобы открыть Gmail в новой вкладке или перейти на уже открытую вкладку Gmail.", "description": "" }, - "label_4": { - "message": "на 5 минут", + "msg_2": { + "message": "Ссылка скопирована в буфер обмена.", "description": "" }, - "options_timings_l3": { - "message": "Напоминать о непрочитанных сообщениях каждые (в минутах):", + "msg_3": { + "message": "Выделенный текст скопирован в буфет обмена.", "description": "" }, - "popup_msg_4": { - "message": "1 час назад", + "msg_4": { + "message": "Замечание: Чтобы оповещение работало правильно, вы должны быть залогинены в свой аккаунт Google.", "description": "" }, - "options_gmail_1": { - "message": "Основной аккаунт (/mail/u/0/)", + "msg_5": { + "message": "Выберите звуковой файл", "description": "" }, - "options_gmail_10": { - "message": "Получать оповещения для следующих аккаунтов и ярлыков:", + "label_1": { + "message": "Обновить", "description": "" }, - "options_notifications_1": { - "message": "Показывать всплывающие уведомления для новых сообщений", + "label_2": { + "message": "Настройки", "description": "" }, - "options_notifications_9": { - "message": "Проигрывать звуковое оповещение при получении новых сообщений", + "label_3": { + "message": "Отключить все оповещения...", "description": "" }, - "label_6": { - "message": "на 30 минут", + "label_4": { + "message": "на 5 минут", "description": "" }, - "options_misc_8": { - "message": "Сбросить все настройки на начальные", + "label_5": { + "message": "на 15 минут", "description": "" }, - "options_notifications_28": { - "message": "Отключить все уведомления на определенный период времени Х (в минутах)", + "label_6": { + "message": "на 30 минут", "description": "" }, - "options_timings_l4": { - "message": "Установите ноль для отключения напоминаний.", + "label_7": { + "message": "на 1 час", "description": "" }, - "options_notifications_32": { - "message": "имя или адрес содержит", + "label_8": { + "message": "на 2 часа", "description": "" }, - "options_tab_6": { - "message": "Открывать Gmail в новом окне", + "label_9": { + "message": "на 5 часов", "description": "" }, - "options_notifications_25": { - "message": "В Safari обычно встроенные звуковые оповещения воспроизводятся не правильно, в этом случае используйте пользовательские звуковые файлы для оповещения.", + "label_13": { + "message": "на Х минут", "description": "" }, - "options_toolbar_15": { - "message": "Клик средней кнопкой мыши по значку в панели инструментов", + "label_10": { + "message": "Включить уведомления (текущая сессия)", "description": "" }, - "options_toolbar_10": { - "message": "Минимальная высота окна - 500px.", + "label_11": { + "message": "Создать сообщение", "description": "" }, - "popup_msg_10": { - "message": "Январь", + "label_12": { + "message": "Открыть FAQ", "description": "" }, - "options_notifications_26": { - "message": "Всегда показывать значок уведомления в трее (Только Windows)", + "label_14": { + "message": "Авторизованные аккаунты", "description": "" }, - "label_3": { - "message": "Отключить все оповещения...", + "unknown": { + "message": "не определено", "description": "" }, - "label_13": { - "message": "на Х минут", + "and": { + "message": "и", "description": "" }, - "options_empty": { - "message": "не определен", + "log_into_your_account": { + "message": "Пожалуйста, войдите в свой аккаунт", "description": "" }, - "options_notifications_3": { - "message": "Эта функция может не работать в Вашей ОС.", + "notification": { + "message": "От: [author_email][break]Тема: [title][break]Сводка: [summary]", "description": "" }, - "options_timings": { - "message": "Расписание:", + "options_title": { + "message": "Настройки", "description": "" }, - "options_gmail_5": { - "message": "Четвертый аккаунт (/mail/u/3/)", + "options_inshort": { + "message": "Оповещение для нескольких аккаунтов Google Mail (Gmail).", "description": "" }, - "label_5": { - "message": "на 15 минут", + "options_donation": { + "message": "Поддержка разработки", "description": "" }, - "options_misc_9": { - "message": "Красный для \"Нет непрочитанных\" и серый для \"Отключен\"", + "options_timings": { + "message": "Задержки:", "description": "" }, - "popup_msg_5": { - "message": "часов назад", + "options_timings_l1": { + "message": "Проверять почту каждые (в секундах):", "description": "" }, - "options_notifications_27": { - "message": "Значок в трее будет показан даже если нет не прочитанных сообщений.", + "options_timings_l2": { + "message": "Минимальный период - 10 сек.", "description": "" }, - "options_misc_1": { - "message": "Сортировать аккаунты по алфавиту", + "options_timings_l3": { + "message": "Напоминать о непрочитанных сообщениях каждые (в минутах):", "description": "" }, - "tooltip_1": { - "message": "Левый клик: Открыть вкладку Gmail или окно предварительного просмотра", + "options_timings_l4": { + "message": "Установите ноль для отключения напоминаний.", "description": "" }, - "notification": { - "message": "От: [author_email][break]Тема: [title][break]Сводка: [summary]", + "options_timings_l5": { + "message": "Минимальный период - 5 мин.", "description": "" }, - "popup_trash": { - "message": "Удалить", + "options_timings_l6": { + "message": "Ненулевое значение включает всплывающие уведомления и звуковое оповещение (как при получении нового сообщения).", "description": "" }, - "options_tab": { - "message": "Открытие вкладки Gmail:", + "options_timings_l7": { + "message": "Не проверять почту сразу после запуска в течение (в секундах):", "description": "" }, - "log_into_your_account": { - "message": "Пожалуйста, войдите в свой аккаунт", + "options_timings_l8": { + "message": "При установке нуля автоматическая проверка почты начнется только после первого ручного обновления (Не доступно в Safari).", "description": "" }, - "label_10": { - "message": "Включить оповещения", + "options_gmail": { + "message": "Аккаунты Gmail:", "description": "" }, - "options_notifications_23": { - "message": "Громкость звукового оповещения:", + "options_gmail_1": { + "message": "Основной аккаунт (/mail/u/0/)", "description": "" }, - "options_timings_l2": { - "message": "Минимальный период - 10 сек.", + "options_gmail_2": { + "message": "Разделяйте ярлыки \",\" (Запятой).", "description": "" }, - "options_toolbar_11": { - "message": "Включить горячие клавиши в окне предварительного просмотра", + "options_gmail_3": { + "message": "Второй аккаунт (/mail/u/1/)", "description": "" }, - "options_gmail_9": { - "message": "Некоторые популярные ярлыки: \"inbox\", \"important\", \"^smartlabel_personal\", \"^smartlabel_newsletter\", \"^smartlabel_notification\", and \"^smartlabel_group\"", + "options_gmail_4": { + "message": "Третий аккаунт (/mail/u/2/)", "description": "" }, - "popup_msg_17": { - "message": "Август", + "options_gmail_5": { + "message": "Четвертый аккаунт (/mail/u/3/)", "description": "" }, - "popup_msg_15": { - "message": "Июнь", + "options_gmail_6": { + "message": "Пятый аккаунт (/mail/u/4/)", "description": "" }, - "options_notifications_34": { - "message": "краткая сводка сообщения содержит", + "options_gmail_7": { + "message": "Шестой аккаунт (/mail/u/5/)", "description": "" }, - "label_14": { - "message": "Авторизованные аккаунты", + "options_gmail_8": { + "message": "Отмечать сообщения как прочитанные при архивации", "description": "" }, - "options_misc_13": { - "message": "По умолчанию в тексте всплывающей подсказки значка на панели инструментов показывается название учетной записи.", + "options_gmail_15": { + "message": "Популярные ярлыки:", "description": "" }, - "options_misc_6": { - "message": "Показывать всплывающее уведомление о том, что Gmail уже открыт в активной вкладке", + "options_gmail_10": { + "message": "Получать оповещения для следующих аккаунтов и ярлыков:", "description": "" }, - "popup_read": { - "message": "Прочтено", + "options_gmail_11": { + "message": "Свои каналы:", "description": "" }, - "options_notifications_4": { - "message": "Формат уведомления", + "options_gmail_12": { + "message": "Разделяйте каналы \",\" (Запятой). Пример канала: https://mail.google.com/mail/u/0/feed/atom/inbox", "description": "" }, - "settings_open_title": { - "message": "Открыть страницу настроек", + "options_gmail_13": { + "message": "Примечание: максимальное количество всех ярлыков, кроме «входящие», составляет 20 (каналы Google содержат только 20 новых записей)", "description": "" }, - "label_2": { - "message": "Настройки", + "options_gmail_14": { + "message": "Примечание: чтобы \"Оповещения для Gmail\" проверял более 5 учетных записей, добавьте URL-адреса фидов в поле «Пользовательские каналы» («Custom feeds»). Например, чтобы проверять 6 и 7 учетные записи, добавьте: https://mail.google.com/mail/u/6/feed/atom/inbox, https://mail.google.com/mail/u/7/feed/atom/inbox", "description": "" }, - "options_toolbar_14": { - "message": "Если Вы предпочитаете отображение в виде простого текста в полном режиме - снимите эту галку.", + "options_notifications": { + "message": "Всплывающие уведомления:", "description": "" }, - "options_notifications_18": { - "message": "Динь из Checker Plus", + "options_notifications_1": { + "message": "Показывать всплывающие уведомления для новых сообщений", "description": "" }, - "options_tab_5": { - "message": "Открывать Gmail в фоновой вкладке", + "options_notifications_2": { + "message": "Время показа всплывающих уведомлений (в секундах):", "description": "" }, - "label_7": { - "message": "на 1 час", + "options_notifications_3": { + "message": "Эта функция может не работать в Вашей ОС.", "description": "" }, - "popup_archive": { - "message": "Архивировать", + "options_notifications_4": { + "message": "Формат уведомления", "description": "" }, - "msg_2": { - "message": "Ссылка скопирована в буфер обмена.", + "options_notifications_5": { + "message": "Доступные переменные:", "description": "" }, - "options_title": { - "message": "Настройки", + "options_notifications_6": { + "message": "Обрезать текст уведомления длиннее, чем", "description": "" }, - "popup_msg_13": { - "message": "Апрель", + "options_notifications_7": { + "message": "символов для полей [title] и [summary].", "description": "" }, - "popup_msg_9_format": { - "message": "%d месяца(ев) назад", + "options_notifications_8": { + "message": "Чтобы избежать обрезания сообщений, используйте здесь большие значения.", "description": "" }, - "popup_msg_11": { - "message": "Февраль", + "options_notifications_9": { + "message": "Проигрывать звуковое оповещение при получении новых сообщений", "description": "" }, - "popup_open_inbox": { - "message": "Открыть входящие", + "options_notifications_10": { + "message": "Замечание для пользователей Mac. Начиная с Firefox 28.0, все всплывающие уведомления обрабатываются Mac Notification Center, что приводит к двойному звуковому оповещению. Вам следует отключить это звуковое оповещение или звуковое оповещение от Notification Center.", "description": "" }, - "options_tab_9": { - "message": "Если активировано, аддон проверяет на наличие открытого уже Gmail и переключает фокус на него.", + "options_notifications_11": { + "message": "Показывать \"Уведомления панели задач Windows\" или \"Уведомления в док-панели Mac OS\"", "description": "" }, - "gmail": { - "message": "Оповещение для Gmail™", + "options_notifications_12": { + "message": "Оповещения на панели задач для Linux OS пока не поддерживаются.", "description": "" }, - "popup_msg_6": { - "message": "Вчера", + "options_notifications_13": { + "message": "При клике на значок в трее открывать окно предварительного просмотра (только для Windows, beta)", "description": "" }, - "options_toolbar_8": { - "message": "Минимальная ширина окна - 500px.", + "options_notifications_14": { + "message": "Эта экспериментальная функция и может вызвать нестабильность в работе Firefox. [Требуется перезапуск].", + "description": "" + }, + "options_notifications_15": { + "message": "Звук оповещений по умолчанию", "description": "" }, "options_notifications_16": { "message": "По умолчанию", "description": "" }, - "options_misc_14": { - "message": "Не показывать точное количество непрочитанных сообщений на значке в панели инструментов, если оно превышает 999", + "options_notifications_17": { + "message": "Оповещения из Checker Plus", "description": "" }, - "popup_msg_18": { - "message": "Сентябрь", + "options_notifications_18": { + "message": "Динь из Checker Plus", "description": "" }, - "options_notifications_14": { - "message": "Эта экспериментальная функция и может вызвать нестабильность в работе Firefox. [Требуется перезапуск].", + "options_notifications_19": { + "message": "Оповещение о новом сообщении из Windows", "description": "" }, - "options_gmail_3": { - "message": "Второй аккаунт (/mail/u/1/)", + "options_notifications_20": { + "message": "Пользовательский звук", "description": "" }, - "options_notifications_11": { - "message": "Показывать \"Уведомления панели задач Windows\" или \"Уведомления в док-панели Mac OS\"", + "options_notifications_21": { + "message": "Пользовательский звук:", "description": "" }, - "options_notifications_2": { - "message": "Время показа всплывающих уведомлений (в секундах):", + "options_notifications_22": { + "message": "Если ваш браузер не воспроизводит звук оповещения, попробуйте конвертировать файл в формат WAV с помощью онлайн инструментов.", "description": "" }, - "log_in_to_your_account": { - "message": "Войдите, пожалуйста, в Ваш аккаунт Gmail", + "options_notifications_35": { + "message": "Для выбора нового пользовательского звука сначала выберите встроенный звук, а затем измените опцию на пользовательский звук", "description": "" }, - "popup_of": { - "message": "из", + "options_notifications_23": { + "message": "Громкость звукового оповещения:", "description": "" }, - "options_notifications_15": { - "message": "Звук оповещений по умолчанию", + "options_notifications_24": { + "message": "Громкость - число от 0 до 100, где 100 соответствует максимальной громкости.", "description": "" }, - "options_notifications_21": { - "message": "Пользовательский звук:", + "options_notifications_25": { + "message": "В Safari обычно встроенные звуковые оповещения воспроизводятся не правильно, в этом случае используйте пользовательские звуковые файлы для оповещения.", "description": "" }, - "options_toolbar_9": { - "message": "Высота окна просмотра в полном режиме (в пикселях):", + "options_notifications_26": { + "message": "Всегда показывать значок уведомления в трее (Только Windows)", "description": "" }, - "options_toolbar_1": { - "message": "Поведение кнопки на панели", + "options_notifications_27": { + "message": "Значок в трее будет показан даже если нет не прочитанных сообщений.", "description": "" }, - "unknown": { - "message": "не определено", + "options_notifications_28": { + "message": "Отключить все уведомления на определенный период времени Х (в минутах)", "description": "" }, - "popup_msg_21": { - "message": "Декабрь", + "options_notifications_29": { + "message": "Эта настройка относится к меню кнопки на панели инструментов -> Отключить все уведомления -> на Х минут", "description": "" }, - "popup_read_all": { - "message": "Все прочтено", + "options_notifications_30": { + "message": "Объединять несколько параллельных уведомлений в одно", "description": "" }, - "options_notifications_8": { - "message": "Чтобы избежать обрезания сообщений, используйте здесь большие значения.", + "options_notifications_31": { + "message": "Пользовательское звуковое оповещение", "description": "" }, - "options_donation": { - "message": "Сделать пожертвование", + "options_notifications_32": { + "message": "имя или email содержит", "description": "" }, - "msg_3": { - "message": "Выделенный текст скопирован в буфет обмена.", + "options_notifications_33": { + "message": "заголовок сообщения содержит", "description": "" }, - "options_misc_7": { - "message": "Показывать страницу приветствия при обновлении дополнения", + "options_notifications_34": { + "message": "краткая сводка сообщения содержит", "description": "" }, - "options_gmail": { - "message": "Аккаунты Gmail:", + "options_notifications_36": { + "message": "Попросить Gmail не перенаправлять на «inbox.google.com»", "description": "" }, - "label_1": { - "message": "Обновить", + "options_notifications_37": { + "message": "Номер отображаемого знака", "description": "" }, - "options_notifications_5": { - "message": "Доступные переменные:", + "options_notifications_38": { + "message": "Более быстрые действия (отметить как прочитанные, удалить, ...) (учитывать действия, которые необходимо производить при получении заголовков)", "description": "" }, - "options_notifications_24": { - "message": "Громкость - число от 0 до 100, где 100 соответствует максимальной громкости.", + "options_notifications_40": { + "message": "Разрешить быстрые действия в окне уведомления (не более двух действий) (только в Chrome)", "description": "" }, - "options_notifications_10": { - "message": "Замечание для пользователей Mac. Начиная с Firefox 28.0, все всплывающие уведомления обрабатываются Mac Notification Center, что приводит к двойному звуковому оповещению. Вам следует отключить это звуковое оповещение или звуковое оповещение от Notification Center.", + "options_notifications_41": { + "message": "Прочтено", "description": "" }, - "options_misc_2": { - "message": "По умолчанию - сортировка по времени входа.", + "options_notifications_42": { + "message": "Архивировать", "description": "" }, - "options_toolbar_2": { - "message": "Всегда открывать окно предварительного просмотра", + "options_notifications_43": { + "message": "Удалить", "description": "" }, - "popup_settings": { - "message": "настройки", + "options_tab": { + "message": "Открытие вкладки Gmail:", "description": "" }, - "options_gmail_4": { - "message": "Третий аккаунт (/mail/u/2/)", + "options_tab_1": { + "message": "Отслеживать открытую вкладку Gmail только в активном окне браузера", "description": "" }, - "options_toolbar_5": { - "message": "Показывать только сводку", + "options_tab_2": { + "message": "Не производить поиск открытой вкладки с Gmail в других окнах браузера. Если Gmail не открыт во вкладке активного окна - открыть новую вкладку.", "description": "" }, - "options_notifications_12": { - "message": "Оповещения на панели задач для Linux OS пока не поддерживаются.", + "options_tab_3": { + "message": "Открывать вкладку Gmail рядом с активной вкладкой", "description": "" }, - "options_notifications_35": { - "message": "Для выбора нового пользовательского звука сначала выберите встроенный звук, а затем измените опцию на пользовательский звук", + "options_tab_4": { + "message": "Открывать Gmail в активной вкладке", "description": "" }, - "msg_1": { - "message": "Вкладка уже открыта. Нажмите на кнопку на панели инструментов чтобы открыть Gmail в новой вкладке или перейти на уже открытую вкладку Gmail.", + "options_tab_5": { + "message": "Открывать Gmail в фоновой вкладке", "description": "" }, - "popup_refresh": { - "message": "Обновить", + "options_tab_6": { + "message": "Открывать Gmail в новом окне", "description": "" }, - "options_misc_5": { - "message": "Голубой для \"Нет непрочитанных\" и серый для \"Отключен\"", + "options_tab_7": { + "message": "Использовать имеющуюся пустую вкладку вместо открытия новой, если активна функция \"Открывать во вкладке\"", "description": "" }, - "options_timings_l8": { - "message": "При установке нуля автоматическая проверка почты начнется только после первого ручного обновления (Не доступно в Safari).", + "options_tab_8": { + "message": "Игнорировать открытые с Gmail вкладки", "description": "" }, - "popup_msg_19": { - "message": "Октябрь", + "options_tab_9": { + "message": "Если активировано, Gmail Notifier не проверяет наличие уже открытого окна Gmail и не переключает фокус на него.", "description": "" }, - "options_notifications_33": { - "message": "заголовок сообщения содержит", + "options_tab_10": { + "message": "Открывать письма в базовом HTML-режиме", "description": "" }, - "tooltip_3": { - "message": "Правый клик: Меню дополнения", + "options_tab_11": { + "message": "Open the newest unread email instead of opening the INBOX folder", "description": "" }, - "popup_date_format": { - "message": "%mm %dd, %yy", + "options_toolbar": { + "message": "Окно предварительного просмотра:", "description": "" }, - "options_notifications": { - "message": "Всплывающие уведомления:", + "options_toolbar_1": { + "message": "Поведение кнопки на панели", "description": "" }, - "options_timings_l6": { - "message": "Ненулевое значение включает всплывающие уведомления и звуковое оповещение (как при получении нового сообщения).", + "options_toolbar_2": { + "message": "Всегда открывать окно предварительного просмотра", "description": "" }, - "popup_msg_12": { - "message": "Март", + "options_toolbar_3": { + "message": "Открывать Gmail только если авторизован один аккаунт", "description": "" }, - "options_notifications_22": { - "message": "Если ваш браузер не воспроизводит звук оповещения, попробуйте конвертировать файл в формат WAV с помощью онлайн инструментов.", + "options_toolbar_18": { + "message": "Открыть аккаунт Gmail (принудительно)", "description": "" }, - "options_tab_1": { - "message": "Отслеживать открытую вкладку Gmail только в активном окне браузера", + "options_toolbar_4": { + "message": "Режим окна предварительного просмотра", "description": "" }, - "popup_msg_7_format": { - "message": "%d дней назад", + "options_toolbar_5": { + "message": "Показывать только сводку", "description": "" }, - "options_timings_l1": { - "message": "Проверять почту каждые (в секундах):", + "options_toolbar_6": { + "message": "Полный режим - показывать сообщение целиком", "description": "" }, - "options_toolbar_4": { - "message": "Режим окна предварительного просмотра", + "options_toolbar_7": { + "message": "Ширина окна просмотра в полном режиме (в пискелях):", "description": "" }, - "toolbar_label": { - "message": "Оповещение для Gmail™", + "options_toolbar_8": { + "message": "Минимальная ширина окна - 500px.", "description": "" }, - "popup_msg_1": { - "message": "только сейчас", + "options_toolbar_9": { + "message": "Высота окна просмотра в полном режиме (в пикселях):", "description": "" }, - "popup_open_settings": { - "message": "Настройки", + "options_toolbar_10": { + "message": "Минимальная высота окна - 500px.", + "description": "" + }, + "options_toolbar_11": { + "message": "Включить горячие клавиши в окне предварительного просмотра", + "description": "" + }, + "options_toolbar_12": { + "message": "!: Сообщить о спаме, #: Удалить, e: Архивировать, Shift + i: Отметить как прочитанное.", + "description": "" + }, + "options_toolbar_13": { + "message": "Отображать сообщения в HTML-формате в полном режиме", + "description": "" + }, + "options_toolbar_14": { + "message": "Если Вы предпочитаете отображение в виде простого текста в полном режиме - снимите эту галку.", + "description": "" + }, + "options_toolbar_15": { + "message": "Клик средней кнопкой мыши по значку в панели инструментов", + "description": "" + }, + "options_toolbar_16": { + "message": "Обновить все аккаунты", + "description": "" + }, + "options_toolbar_17": { + "message": "Открыть основной аккаунт", + "description": "" + }, + "options_misc": { + "message": "Дополнительно:", + "description": "" + }, + "options_misc_1": { + "message": "Сортировать аккаунты по алфавиту", + "description": "" + }, + "options_misc_2": { + "message": "По умолчанию - сортировка по времени входа.", "description": "" }, "options_misc_3": { "message": "Цвет значка на панели инструментов", "description": "" }, - "options_gmail_12": { - "message": "Разделяйте каналы \",\" (Запятой). Пример канала: https://mail.google.com/mail/u/0/feed/atom/inbox", + "options_misc_4": { + "message": "Серый для \"Нет непрочитанных\" и голубой для \"Отключен\"", "description": "" }, - "options_toolbar_12": { - "message": "!: Сообщить о спаме, #: Удалить, e: Архивировать, Shift + i: Отметить как прочитанное.", + "options_misc_5": { + "message": "Голубой для \"Нет непрочитанных\" и серый для \"Отключен\"", "description": "" }, - "options_px": { - "message": "px", + "options_misc_9": { + "message": "Красный для \"Нет непрочитанных\" и серый для \"Отключен\"", "description": "" }, - "options_misc_11": { - "message": "Установив здесь нулевое значение, Вы не получите ни всплывающего уведомления, ни звукового оповещения; однако значок уведомления будет работать.", + "options_misc_6": { + "message": "Показывать всплывающее уведомление о том, что Gmail уже открыт в активной вкладке", "description": "" }, - "options_notifications_20": { - "message": "Пользовательский звук", + "options_misc_7": { + "message": "Показывать страницу приветствия при обновлении дополнения", "description": "" }, - "and": { - "message": "и", + "options_misc_8": { + "message": "Сбросить все настройки на начальные", "description": "" }, - "options_tab_7": { - "message": "Использовать имеющуюся пустую вкладку вместо открытия новой, если активна функция \"Открывать во вкладке\"", + "options_misc_10": { + "message": "Всплывающие уведомления и звуковое оповещение только для сообщений, полученных менее чем (в минутах):", "description": "" }, - "options_toolbar_3": { - "message": "Открывать Gmail только если авторизован один аккаунт", + "options_misc_11": { + "message": "Установив здесь нулевое значение, Вы не получите ни всплывающего уведомления, ни звукового оповещения; однако значок уведомления будет работать.", "description": "" }, - "options_gmail_7": { - "message": "Шестой аккаунт (/mail/u/5/)", + "options_misc_12": { + "message": "Не включать информацию об учетной записи в текст всплывающей подсказки ", "description": "" }, - "popup_msg_8_format": { - "message": "%d недель назад", + "options_misc_13": { + "message": "По умолчанию в тексте всплывающей подсказки значка на панели инструментов показывается название учетной записи.", "description": "" }, - "options_toolbar": { - "message": "Окно предварительного просмотра:", + "options_misc_14": { + "message": "Не показывать точное количество непрочитанных сообщений на значке в панели инструментов, если оно превышает 999", "description": "" }, - "options_notifications_6": { - "message": "Обрезать текст уведомления длиннее чем", + "options_misc_15": { + "message": "Открыть Часто Задаваемые Вопросы при обновлениях", "description": "" }, - "popup_wait": { - "message": "Ожидайте...", + "options_plugins": { + "message": "Плагины:", "description": "" }, - "tooltip_2": { - "message": "Средний клик (или Ctrl+левый клик): Обновить все аккаунты", + "options_plugins_1": { + "message": "Ярлыки и помеченные Gmail (экспериментальные)", "description": "" }, - "options_notifications_29": { - "message": "Эта настройка относится к меню кнопки на панели инструментов -> Отключить все уведомления -> на Х минут", + "options_plugins_2": { + "message": "Этот плагин отображает кнопку помеченные, а также цепочку ярлыков во всплывающем окне (только в расширенном режиме).", "description": "" }, - "options_tab_3": { - "message": "Открывать вкладку Gmail рядом с активной вкладкой", + "options_px": { + "message": "px", "description": "" }, - "options_gmail_8": { - "message": "Отмечать сообщения как прочитанные при архивации", + "options_empty": { + "message": "не определен", "description": "" }, - "options_toolbar_17": { - "message": "Открыть основной аккаунт", + "options_button_test": { + "message": "Играть", "description": "" }, - "options_notifications_7": { - "message": "символов для полей [title] и [summary].", + "options_button_reset": { + "message": "Сбросить настройки", "description": "" }, - "options_misc_10": { - "message": "Всплывающие уведомления и звуковое оповещение только для сообщений, полученных менее чем (в минутах):", + "popup_settings": { + "message": "настройки", "description": "" }, - "options_tab_8": { - "message": "Игнорировать открытые с Gmail вкладки", + "popup_of": { + "message": "из", + "description": "" + }, + "popup_wait": { + "message": "Ожидайте...", + "description": "" + }, + "popup_date_format": { + "message": "%mm %dd, %yy", "description": "" }, "popup_no_subject": { "message": "(без темы)", "description": "" }, - "msg_5": { - "message": "Выберите звуковой файл", + "popup_open_settings": { + "message": "Открыть настройки", "description": "" }, - "popup_msg_2": { - "message": "1 минуту назад", + "popup_open_inbox": { + "message": "Открыть входящие", "description": "" }, - "popup_msg_16": { - "message": "Июль", + "popup_archive": { + "message": "Архивировать", "description": "" }, - "label_8": { - "message": "на 2 часа", + "popup_spam": { + "message": "Спам", "description": "" }, - "msg_4": { - "message": "Замечание: Чтобы оповещение работало правильно, вы должны быть залогинены в свой аккаунт Google.", + "popup_trash": { + "message": "Удалить", "description": "" }, - "popup_msg_20": { - "message": "Ноябрь", + "popup_refresh": { + "message": "Обновить", "description": "" }, - "options_toolbar_6": { - "message": "Полный режим - показывать сообщение целиком", + "popup_read": { + "message": "Прочтено", "description": "" }, - "options_gmail_11": { - "message": "Свои каналы:", + "popup_read_all": { + "message": "Все прочтено", "description": "" }, - "options_tab_2": { - "message": "Не производить поиск открытой вкладки с Gmail в других окнах браузера. Если Gmail не открыт во вкладке активного окна - открыть новую вкладку.", + "popup_msg_1": { + "message": "только сейчас", "description": "" }, - "label_11": { - "message": "Создать сообщение", + "popup_msg_2": { + "message": "1 минуту назад", "description": "" }, - "options_toolbar_7": { - "message": "Ширина окна просмотра в полном режиме (в пискелях):", + "popup_msg_3_format": { + "message": "%d минут назад", "description": "" }, - "options_notifications_31": { - "message": "Пользовательское звуковое оповещение", + "popup_msg_4": { + "message": "1 час назад", "description": "" }, - "options_timings_l5": { - "message": "Минимальный период - 5 мин.", + "popup_msg_5": { + "message": "часов назад", "description": "" }, - "options_misc": { - "message": "Дополнительно:", + "popup_msg_6": { + "message": "Вчера", "description": "" }, - "options_gmail_2": { - "message": "Разделяйте ярлыки \",\" (Запятой).", + "popup_msg_7_format": { + "message": "%d дней назад", "description": "" }, - "options_misc_4": { - "message": "Серый для \"Нет непрочитанных\" и голубой для \"Отключен\"", + "popup_msg_8_format": { + "message": "%d недель назад", "description": "" }, - "options_toolbar_13": { - "message": "Отображать сообщения в HTML-формате в полном режиме", + "popup_msg_9_format": { + "message": "%d месяца(ев) назад", "description": "" }, - "options_toolbar_16": { - "message": "Обновить все аккаунты", + "popup_msg_10": { + "message": "Январь", "description": "" }, - "options_gmail_6": { - "message": "Пятый аккаунт (/mail/u/4/)", + "popup_msg_11": { + "message": "Февраль", + "description": "" + }, + "popup_msg_12": { + "message": "Март", + "description": "" + }, + "popup_msg_13": { + "message": "Апрель", "description": "" }, "popup_msg_14": { "message": "Май", "description": "" }, - "options_inshort": { - "message": "Оповещение для нескольких аккаунтов Google Mail (Gmail).", + "popup_msg_15": { + "message": "Июнь", "description": "" }, - "options_misc_12": { - "message": "Не включать информацию об учетной записи в текст всплывающей подсказки ", + "popup_msg_16": { + "message": "Июль", "description": "" }, - "options_tab_4": { - "message": "Открывать Gmail в активной вкладке", + "popup_msg_17": { + "message": "Август", "description": "" }, - "popup_msg_3_format": { - "message": "%d минут назад", + "popup_msg_18": { + "message": "Сентябрь", "description": "" }, - "label_12": { - "message": "Открыть FAQ", + "popup_msg_19": { + "message": "Октябрь", "description": "" }, - "description": { - "message": "Оповещение для нескольких аккаунтов Google Mail (Gmail)", + "popup_msg_20": { + "message": "Ноябрь", "description": "" }, - "popup_spam": { - "message": "Спам", + "popup_msg_21": { + "message": "Декабрь", + "description": "" + }, + "settings_open_title": { + "message": "Открыть страницу настроек", + "description": "" + }, + "settings_open_label": { + "message": "Открыть настройки", + "description": "" + }, + "gmail": { + "message": "Оповещения для Gmail™", "description": "" } } \ No newline at end of file diff --git a/WebExtension/_locales/sr/messages.json b/v2/_locales/sr/messages.json similarity index 86% rename from WebExtension/_locales/sr/messages.json rename to v2/_locales/sr/messages.json index da56f8e0..6814218b 100644 --- a/WebExtension/_locales/sr/messages.json +++ b/v2/_locales/sr/messages.json @@ -1,690 +1,762 @@ { - "label_9": { - "message": "На 5 сати", + "toolbar_label": { + "message": "Обавештења за Gmail™", "description": "" }, - "options_notifications_19": { - "message": "Windows email звук", + "tooltip_1": { + "message": "Леви клик: Отвори Gmail или панел прегледа поште", "description": "" }, - "options_notifications_17": { - "message": "Checker Plus bell", + "tooltip_2": { + "message": "Средњи (или Ctrl+Леви) клик: Освежи све налоге", "description": "" }, - "options_notifications_13": { - "message": "Отвори панел прегледа поште када кликнем на иконицу обавештења на траци задатака (само Windows, бета)", + "tooltip_3": { + "message": "Десни клик: Избор налога", "description": "" }, - "options_notifications_30": { - "message": "Споји сва истовремена десктоп обавештења у једно обавештење", + "description": { + "message": "Обавештења за више Google Mail (Gmail) налога", "description": "" }, - "settings_open_label": { - "message": "Отвори опције", + "log_in_to_your_account": { + "message": "Пријавите се својим Gmail налогом", "description": "" }, - "options_timings_l7": { - "message": "Не проверавај нову пошту при покретању у року од (у секундама):", + "msg_1": { + "message": "Картица је већ отворена. Кликните на дугме на алатној траци да отворите Gmail у новој картици или да се пребаците на постојећу Gmail картицу.", "description": "" }, - "label_4": { - "message": "На 5 минута", + "msg_2": { + "message": "Линк је копиран у клипборд.", "description": "" }, - "options_timings_l3": { - "message": "Подсети на сву непрочитану пошту сваких (у минутима):", + "msg_3": { + "message": "Одабрани текст је копиран у клипборд.", "description": "" }, - "popup_msg_4": { - "message": "пре 1 сат", + "msg_4": { + "message": "Напомена: Да би обавештења радила исправно, морате бити пријављени на свој Google налог.", "description": "" }, - "options_gmail_1": { - "message": "Основни налог (/mail/u/0/)", + "msg_5": { + "message": "Изаберите датотеку звучног обавештења", "description": "" }, - "options_gmail_10": { - "message": "Примај обавештења за следеће ознаке и налоге:", + "label_1": { + "message": "Освежи", "description": "" }, - "options_notifications_1": { - "message": "Прикажи десктоп обавештења о новој пошти", + "label_2": { + "message": "Подешавања", "description": "" }, - "options_notifications_9": { - "message": "Пусти звучно обавештење о новој пошти", + "label_3": { + "message": "Онемогући сва обавештења", + "description": "" + }, + "label_4": { + "message": "На 5 минута", + "description": "" + }, + "label_5": { + "message": "На 15 минута", "description": "" }, "label_6": { "message": "На 30 минута", "description": "" }, - "options_misc_8": { - "message": "Врати сва подешавања на фабричка", + "label_7": { + "message": "На 1 сат", "description": "" }, - "options_notifications_28": { - "message": "Онемогући сва обавештења у прилагођеном временском периоду (у минутима)", + "label_8": { + "message": "На 2 сата", "description": "" }, - "options_timings_l4": { - "message": "Постави вредност на нула за искључивање подсетника.", + "label_9": { + "message": "На 5 сати", "description": "" }, - "options_notifications_32": { - "message": "име или е-пошта садржи", + "label_13": { + "message": "У прилагођеном временском периоду", "description": "" }, - "options_tab_6": { - "message": "Отвори Gmail налог у новом прозору", + "label_10": { + "message": "Омогући обавештења (сесија)", "description": "" }, - "options_notifications_25": { - "message": "У Ѕafari прегледачу највероватније се подразумевани звук обавештења неће емитовати исправно, у том случају употребите прилагођени звук за обавештење.", + "label_11": { + "message": "Напиши нову поруку", "description": "" }, - "options_toolbar_15": { - "message": "Средњи клик на дугме на алатној траци", + "label_12": { + "message": "Отвори FAQ", "description": "" }, - "options_toolbar_10": { - "message": "Минимална висина је 500 пиксела.", + "label_14": { + "message": "Пријављени налози", "description": "" }, - "popup_msg_10": { - "message": "јануар", + "unknown": { + "message": "непознат", "description": "" }, - "options_notifications_26": { - "message": "Увек прикажи иконицу обавештења у системској траци (само Windows)", + "and": { + "message": "и", "description": "" }, - "label_3": { - "message": "Онемогући сва обавештења", + "log_into_your_account": { + "message": "Пријавите се својим Gmail налогом", "description": "" }, - "label_13": { - "message": "У прилагођеном временском периоду", + "notification": { + "message": "Од: [author_email][break]Наслов: [title][break]Кратак преглед: [summary]", "description": "" }, - "options_empty": { - "message": "недефинисано", + "options_title": { + "message": "Gmail™ Notifier - Опције", "description": "" }, - "options_notifications_3": { - "message": "Ова опција можда неће радити на Вашем оперативном систему.", + "options_inshort": { + "message": "Обавештења за више Google Mail (Gmail) налога.", + "description": "" + }, + "options_donation": { + "message": "Подржи развој", "description": "" }, "options_timings": { "message": "Подешавања времена", "description": "" }, - "options_gmail_5": { - "message": "Четврти налог (/mail/u/3/)", + "options_timings_l1": { + "message": "Провери нову пошту сваких (у секундама):", "description": "" }, - "label_5": { - "message": "На 15 минута", + "options_timings_l2": { + "message": "Минимални период је 10 секунди.", "description": "" }, - "options_misc_9": { - "message": "Црвена боја за \"Нема непрочитаних\" и сива за \"Неповезан\"", + "options_timings_l3": { + "message": "Подсети на сву непрочитану пошту сваких (у минутима):", "description": "" }, - "popup_msg_5": { - "message": "сата/и раније", + "options_timings_l4": { + "message": "Постави вредност на нула за искључивање подсетника.", "description": "" }, - "options_notifications_27": { - "message": "Иконица обавештења у системској траци ће бити приказана чак и ако нема непрочитаних порука.", + "options_timings_l5": { + "message": "Минимални период је 5 минута.", "description": "" }, - "options_misc_1": { - "message": "Поређај налоге по алфабету", + "options_timings_l6": { + "message": "Све вредности осим нуле покрећу десктоп обавештење и звучни сигнал (као када пристигне нова пошта) у задатим временским периодима ако имате непрочитану пошту.", "description": "" }, - "tooltip_1": { - "message": "Леви клик: Отвори Gmail или панел прегледа поште", + "options_timings_l7": { + "message": "Не проверавај нову пошту при покретању у року од (у секундама):", "description": "" }, - "notification": { - "message": "Од: [author_email][break]Наслов: [title][break]Кратак преглед: [summary]", + "options_timings_l8": { + "message": "Постави вредност на нула за непроверавање поште до првог ручног ажурирања [није доступно у Safari прегледачу].", "description": "" }, - "popup_trash": { - "message": "Избриши", + "options_gmail": { + "message": "Gmail:", "description": "" }, - "options_tab": { - "message": "Отварање картица:", + "options_gmail_1": { + "message": "Основни налог (/mail/u/0/)", "description": "" }, - "log_into_your_account": { - "message": "Пријавите се својим Gmail налогом", + "options_gmail_2": { + "message": "Одвојити ознаке \",\" (зарезом).", "description": "" }, - "label_10": { - "message": "Омогући обавештења", + "options_gmail_3": { + "message": "Други налог (/mail/u/1/)", "description": "" }, - "options_notifications_23": { - "message": "Јачина звука обавештења је", + "options_gmail_4": { + "message": "Трећи налог (/mail/u/2/)", "description": "" }, - "options_timings_l2": { - "message": "Минимални период је 10 секунди.", + "options_gmail_5": { + "message": "Четврти налог (/mail/u/3/)", "description": "" }, - "options_toolbar_11": { - "message": "Омогући тастерске пречице у панелу", + "options_gmail_6": { + "message": "Пети налог (/mail/u/4/)", "description": "" }, - "options_gmail_9": { - "message": "Неке популарне ознаке: \"inbox\", \"important\", \"^smartlabel_personal\", \"^smartlabel_newsletter\", \"^smartlabel_notification\" и \"^smartlabel_group\"", + "options_gmail_7": { + "message": "Шести налог (/mail/u/5/)", "description": "" }, - "popup_msg_17": { - "message": "август", + "options_gmail_8": { + "message": "Означи поруке као прочитане при архивирању", "description": "" }, - "popup_msg_15": { - "message": "јун", + "options_gmail_15": { + "message": "Неке популарне ознаке:", "description": "" }, - "options_notifications_34": { - "message": "кратак преглед е-поште садржи", + "options_gmail_10": { + "message": "Примај обавештења за следеће ознаке и налоге:", "description": "" }, - "label_14": { - "message": "Пријављени налози", + "options_gmail_11": { + "message": "Прилагођени канали:", "description": "" }, - "options_misc_13": { - "message": "Подразумевано, у опису алатке на дугмету на алатној траци се приказују информације о пријављивању. Одчекирањем ове опције, опис алатке остаје на подразумеваној вредности.", + "options_gmail_12": { + "message": "Одвојити канале \",\" (зарезом). Пример канала: https://mail.google.com/mail/u/0/feed/atom/inbox", "description": "" }, - "options_misc_6": { - "message": "Прикажи десктоп обавештење као упозорење да је Gmail већ отворен у активној картици", + "options_gmail_13": { + "message": "Напомена: максимални број за све ознаке осим за \"inbox\" је 20 (Google канали подржавају само 20 најновијих ставки)", "description": "" }, - "popup_read": { - "message": "Озн. као прочитано", + "options_gmail_14": { + "message": "Напомена: да би Notifier пратио више од 5 налога, додајте адресе канала у поље \"Прилагођени канали\". На пример, за праћење 6. и 7. налога додајте: https://mail.google.com/mail/u/6/feed/atom/inbox, https://mail.google.com/mail/u/7/feed/atom/inbox", + "description": "" + }, + "options_notifications": { + "message": "Обавештења:", + "description": "" + }, + "options_notifications_1": { + "message": "Прикажи десктоп обавештења о новој пошти", + "description": "" + }, + "options_notifications_2": { + "message": "Прикажи десктоп обавештења у трајању од (у секундама):", + "description": "" + }, + "options_notifications_3": { + "message": "Ова опција можда неће радити на Вашем оперативном систему.", "description": "" }, "options_notifications_4": { "message": "Формат обавештења", "description": "" }, - "settings_open_title": { - "message": "Отвори страницу опција (подешавања)", + "options_notifications_5": { + "message": "Доступне варијабле:", "description": "" }, - "label_2": { - "message": "Подешавања", + "options_notifications_6": { + "message": "Скрати обавештења дужа од", "description": "" }, - "options_toolbar_14": { - "message": "Одчекирајте ако више волите приказ само текста у режиму приказа пуног садржаја.", + "options_notifications_7": { + "message": "карактера у пољима [title] и [summary].", "description": "" }, - "options_notifications_18": { - "message": "Checker Plus ding", + "options_notifications_8": { + "message": "Да би се избегло сечење поруке, употребите велики број.", "description": "" }, - "options_tab_5": { - "message": "Отвори Gmail налог у позадинској картици", + "options_notifications_9": { + "message": "Пусти звучно обавештење о новој пошти", "description": "" }, - "label_7": { - "message": "На 1 сат", + "options_notifications_10": { + "message": "Савет за кориснике Mac система. Од Firefox 28.0 верзије, свим десктоп обавештењима управља Mac Notification Center који емитује додатни звучни сигнал. Потребно је да одчекирате ово звучно обавештење или оно које је генерисано од стране Notification Center Mac система.", "description": "" }, - "popup_archive": { - "message": "Архивирај", + "options_notifications_11": { + "message": "Прикажи \"Windows обавештења на траци задатака\" или \"Mac OS Dock обавештења\"", "description": "" }, - "msg_2": { - "message": "Линк је копиран у клипборд.", + "options_notifications_12": { + "message": "Обавештења на траци задатака нису подржана у Linux систему.", "description": "" }, - "options_title": { - "message": "Gmail™ Notifier - Опције", + "options_notifications_13": { + "message": "Отвори панел прегледа поште када кликнем на иконицу обавештења на траци задатака (само Windows, бета)", "description": "" }, - "popup_msg_13": { - "message": "април", + "options_notifications_14": { + "message": "Ово је експериментална функција и може изазвати нестабилност Firefox прегледача. [Неопходно је поновно покретање].", "description": "" }, - "popup_msg_9_format": { - "message": "пре %d месеца", + "options_notifications_15": { + "message": "Подразумевано звучно обавештење је", "description": "" }, - "popup_msg_11": { - "message": "фебруар", + "options_notifications_16": { + "message": "Gmail Notifier подразумевани звук", "description": "" }, - "popup_open_inbox": { - "message": "Отвори Примљене", + "options_notifications_17": { + "message": "Checker Plus bell", "description": "" }, - "options_tab_9": { - "message": "Када је отчекирано, Gmail Notifier проверава у активном или свим отвореним прозорима да ли има отворених Gmail инстанци и пребацује на картицу када је отварање картице захтевано.", + "options_notifications_18": { + "message": "Checker Plus ding", "description": "" }, - "gmail": { - "message": "Gmail™ Notifier", + "options_notifications_19": { + "message": "Windows email звук", "description": "" }, - "popup_msg_6": { - "message": "јуче", + "options_notifications_20": { + "message": "Кориснички дефинисани звук", "description": "" }, - "options_toolbar_8": { - "message": "Минимална ширина је 500 пиксела.", + "options_notifications_21": { + "message": "Кориснички дефинисани звук обавештења је", "description": "" }, - "options_notifications_16": { - "message": "Gmail Notifier подразумевани звук", + "options_notifications_22": { + "message": "Ако ваш прегледач не емитује прилагођени звук обавештења, покушајте да га конвертујете у WAV формат користећи алат за конвертовање на мрежи.", "description": "" }, - "options_misc_14": { - "message": "Не приказуј тачан број непрочитаних порука на иконици ако је већи од 999", + "options_notifications_35": { + "message": "За избор новог прилагођеног звука, изаберите прво уграђени звук а затим промените опцију на прилагођени звук", "description": "" }, - "popup_msg_18": { - "message": "септембар", + "options_notifications_23": { + "message": "Јачина звука обавештења", "description": "" }, - "options_notifications_14": { - "message": "Ово је експериментална функција и може изазвати нестабилност Firefox прегледача. [Неопходно је поновно покретање].", + "options_notifications_24": { + "message": "Јачина је број од 0 до 100 при чему је 100 најгласније (подразумевано).", "description": "" }, - "options_gmail_3": { - "message": "Други налог (/mail/u/1/)", + "options_notifications_25": { + "message": "У Ѕafari прегледачу највероватније се подразумевани звук обавештења неће емитовати исправно, у том случају употребите прилагођени звук за обавештење.", "description": "" }, - "options_notifications_11": { - "message": "Прикажи \"Windows обавештења на траци задатака\" или \"Mac OS Dock обавештења\"", + "options_notifications_26": { + "message": "Увек прикажи иконицу обавештења у системској траци (само Windows)", "description": "" }, - "options_notifications_2": { - "message": "Прикажи десктоп обавештења у трајању од (у секундама):", + "options_notifications_27": { + "message": "Иконица обавештења у системској траци ће бити приказана чак и ако нема непрочитаних порука.", "description": "" }, - "log_in_to_your_account": { - "message": "Пријавите се својим Gmail налогом", + "options_notifications_28": { + "message": "Онемогући сва обавештења у прилагођеном временском периоду (у минутима)", "description": "" }, - "popup_of": { - "message": "од", + "options_notifications_29": { + "message": "Ова опција се односи на мени на десном клику на дугмету на алатној траци -> онемогући сва обавештења -> прилагођени временски период", "description": "" }, - "options_notifications_15": { - "message": "Подразумевано звучно обавештење је", + "options_notifications_30": { + "message": "Споји сва истовремена десктоп обавештења у једно обавештење", "description": "" }, - "options_notifications_21": { - "message": "Кориснички дефинисани звук обавештења је", + "options_notifications_31": { + "message": "Прилагођени звук обавештења", "description": "" }, - "options_toolbar_9": { - "message": "Висина панела у режиму приказа пуног садржаја (у пикселима):", + "options_notifications_32": { + "message": "име или е-пошта садржи", "description": "" }, - "options_toolbar_1": { - "message": "Понашање дугмета на алатној картици", + "options_notifications_33": { + "message": "наслов е-поште садржи", "description": "" }, - "unknown": { - "message": "непознат", + "options_notifications_34": { + "message": "кратак преглед е-поште садржи", "description": "" }, - "popup_msg_21": { - "message": "децембар", + "options_notifications_36": { + "message": "Захтевај да Gmail спречи преусмеравање на 'inbox.google.com'", "description": "" }, - "popup_read_all": { - "message": "Означи све као прочитано", + "options_notifications_37": { + "message": "Прикажи бројчану ознаку", "description": "" }, - "options_notifications_8": { - "message": "Да би се избегло сечење поруке, употребите велики број.", + "options_notifications_38": { + "message": "Брже радње (означи као прочитано, избриши...) (Размотрите радње које треба решити када се примају заглавља", "description": "" }, - "options_donation": { - "message": "Донирајте", + "options_notifications_40": { + "message": "Дозволи брзе радње из поља обавештења (највише две радње) (само Chrome)", "description": "" }, - "msg_3": { - "message": "Одабрани текст је копиран у клипборд.", + "options_notifications_41": { + "message": "Означи као прочитано", "description": "" }, - "options_misc_7": { - "message": "Прикажи страницу добродошлице при надоградњи", + "options_notifications_42": { + "message": "Архивирај", "description": "" }, - "options_gmail": { - "message": "Gmail:", + "options_notifications_43": { + "message": "Избриши", "description": "" }, - "label_1": { - "message": "Освежи", + "options_tab": { + "message": "Отварање картица:", "description": "" }, - "options_notifications_5": { - "message": "Доступне варијабле:", + "options_tab_1": { + "message": "Потражи отворени Gmail налог само у активном прозору", "description": "" }, - "options_notifications_24": { - "message": "Јачина је број од 0 до 100 при чему је 100 најгласније (подразумевано).", + "options_tab_2": { + "message": "Не тражи у другим прозорима прегледача отворене Gmail налоге. Ако Gmail није отворен у активном прозору, отвориће се у новој картици.", "description": "" }, - "options_notifications_10": { - "message": "Савет за кориснике Mac система. Од Firefox 28.0 верзије, свим десктоп обавештењима управља Mac Notification Center који емитује додатни звучни сигнал. Потребно је да одчекирате ово звучно обавештење или оно које је генерисано од стране Notification Center Mac система.", + "options_tab_3": { + "message": "Отвори нови Gmail налог поред активне картице", "description": "" }, - "options_misc_2": { - "message": "Подразумевани редослед је по времену пријављивања.", + "options_tab_4": { + "message": "Отвори Gmail налог у активној картици", "description": "" }, - "options_toolbar_2": { - "message": "Увек отвори панел прегледа поште", + "options_tab_5": { + "message": "Отвори Gmail налог у позадинској картици", "description": "" }, - "popup_settings": { - "message": "подешавања", + "options_tab_6": { + "message": "Отвори Gmail налог у новом прозору", "description": "" }, - "options_gmail_4": { - "message": "Трећи налог (/mail/u/2/)", + "options_tab_7": { + "message": "Увек употреби празну картицу уместо отварања нове картице (када је отварање у картици активирано)", "description": "" }, - "options_toolbar_5": { - "message": "Прикажи кратак преглед", + "options_tab_8": { + "message": "Занемари отворене Gmail картице", "description": "" }, - "options_notifications_12": { - "message": "Обавештења на траци задатака нису подржана у Linux систему.", + "options_tab_9": { + "message": "Када је одчекирано, Gmail Notifier проверава у активном или свим отвореним прозорима да ли има отворених Gmail инстанци и пребацује на картицу када је отварање картице захтевано.", "description": "" }, - "options_notifications_35": { - "message": "За избор новог прилагођеног звука, изаберите прво уграђени звук а затим промените опцију на прилагођени звук", + "options_tab_10": { + "message": "Отвори пошту у основном HTML режиму", "description": "" }, - "msg_1": { - "message": "Картица је већ отворена. Кликните на дугме на алатној траци да отворите Gmail у новој картици или да се пребаците на постојећу Gmail картицу.", + "options_tab_11": { + "message": "Open the newest unread email instead of opening the INBOX folder", "description": "" }, - "popup_refresh": { - "message": "Освежи", + "options_toolbar": { + "message": "Алатна трака:", + "description": "" + }, + "options_toolbar_1": { + "message": "Понашање дугмета на алатној картици", + "description": "" + }, + "options_toolbar_2": { + "message": "Увек отвори панел прегледа поште", + "description": "" + }, + "options_toolbar_3": { + "message": "Отвори Gmail налог ако је само један налог пријављен", + "description": "" + }, + "options_toolbar_18": { + "message": "Отвори Gmail налог (принудно)", + "description": "" + }, + "options_toolbar_4": { + "message": "Режим приказа панела", + "description": "" + }, + "options_toolbar_5": { + "message": "Прикажи кратак преглед", + "description": "" + }, + "options_toolbar_6": { + "message": "Прикажи пун садржај", + "description": "" + }, + "options_toolbar_7": { + "message": "Ширина панела у режиму приказа пуног садржаја (у пикселима):", "description": "" }, - "options_misc_5": { - "message": "Плава боја за \"Нема непрочитаних\" и сива за \"Неповезан\"", + "options_toolbar_8": { + "message": "Минимална ширина је 500 пиксела.", "description": "" }, - "options_timings_l8": { - "message": "Постави вредност на нула за непроверавање поште до првог ручног ажурирања [није доступно у Safari прегледачу].", + "options_toolbar_9": { + "message": "Висина панела у режиму приказа пуног садржаја (у пикселима):", "description": "" }, - "popup_msg_19": { - "message": "октобар", + "options_toolbar_10": { + "message": "Минимална висина је 500 пиксела.", "description": "" }, - "options_notifications_33": { - "message": "наслов е-поште садржи", + "options_toolbar_11": { + "message": "Омогући тастерске пречице у панелу", "description": "" }, - "tooltip_3": { - "message": "Десни клик: Избор налога", + "options_toolbar_12": { + "message": "!: Пријави непожељну поруку, #: Отпад, e: Архивирај, Shift + i: Означи као прочитано.", "description": "" }, - "popup_date_format": { - "message": "%dd. %mm %yy.", + "options_toolbar_13": { + "message": "Прикажи пошту као HTML у режиму приказа пуног садржаја", "description": "" }, - "options_notifications": { - "message": "Обавештења:", + "options_toolbar_14": { + "message": "Одчекирајте ако више волите приказ само текста у режиму приказа пуног садржаја.", "description": "" }, - "options_timings_l6": { - "message": "Све вредности осим нуле покрећу десктоп обавештење и звучни сигнал (као када пристигне нова пошта) у задатим временским периодима ако имате непрочитану пошту.", + "options_toolbar_15": { + "message": "Средњи клик на дугме на алатној траци", "description": "" }, - "popup_msg_12": { - "message": "март", + "options_toolbar_16": { + "message": "Освежава све налоге", "description": "" }, - "options_notifications_22": { - "message": "Ако ваш прегледач не емитује прилагођени звук обавештења, покушајте да га конвертујете у WAV формат користећи алат за конвертовање на мрежи.", + "options_toolbar_17": { + "message": "Отвара основни Gmail налог", "description": "" }, - "options_tab_1": { - "message": "Потражи отворени Gmail налог само у активном прозору", + "options_misc": { + "message": "Остало:", "description": "" }, - "popup_msg_7_format": { - "message": "пре %d дана", + "options_misc_1": { + "message": "Поређај налоге по алфабету", "description": "" }, - "options_timings_l1": { - "message": "Провери нову пошту сваких (у секундама):", + "options_misc_2": { + "message": "Подразумевани редослед је по времену пријављивања.", "description": "" }, - "options_toolbar_4": { - "message": "Режим приказа панела", + "options_misc_3": { + "message": "Боја иконице на алатној траци", "description": "" }, - "toolbar_label": { - "message": "Gmail™ Notifier", + "options_misc_4": { + "message": "Сива боја за \"Нема непрочитаних\" и плава за \"Неповезан\"", "description": "" }, - "popup_msg_1": { - "message": "управо сада", + "options_misc_5": { + "message": "Плава боја за \"Нема непрочитаних\" и сива за \"Неповезан\"", "description": "" }, - "popup_open_settings": { - "message": "Подешавања", + "options_misc_9": { + "message": "Црвена боја за \"Нема непрочитаних\" и сива за \"Неповезан\"", "description": "" }, - "options_misc_3": { - "message": "Боја иконице на алатној траци", + "options_misc_6": { + "message": "Прикажи десктоп обавештење као упозорење да је Gmail већ отворен у активној картици", "description": "" }, - "options_gmail_12": { - "message": "Одвоји канале \",\" (зарезом). Пример канала: https://mail.google.com/mail/u/0/feed/atom/inbox", + "options_misc_7": { + "message": "Прикажи страницу добродошлице при надоградњи", "description": "" }, - "options_toolbar_12": { - "message": "!: Пријави непожељну поруку, #: Отпад, e: Архивирај, Shift + i: Означи као прочитано.", + "options_misc_8": { + "message": "Врати сва подешавања на фабричка", "description": "" }, - "options_px": { - "message": "px", + "options_misc_10": { + "message": "Покрени десктоп и звучна обавештења само за пошту пристиглу у последњих (у минутима): ", "description": "" }, "options_misc_11": { "message": "Постављајући ову вредност на нула, нећете примати ни десктоп ни звучна обавештења; ипак, обавештење у виду ознаке на иконици ће бити приказано.", "description": "" }, - "options_notifications_20": { - "message": "Кориснички дефинисани звук", + "options_misc_12": { + "message": "Не обухватај детаље о пријављивању у опису алатке", "description": "" }, - "and": { - "message": "и", + "options_misc_13": { + "message": "Подразумевано, у опису алатке на дугмету на алатној траци се приказују информације о пријављивању. Одчекирањем ове опције, опис алатке остаје на подразумеваној вредности.", "description": "" }, - "options_tab_7": { - "message": "Увек употреби празну картицу уместо отварања нове картице (када је отварање у картици активирано)", + "options_misc_14": { + "message": "Не приказуј тачан број непрочитаних порука на иконици ако је већи од 999", "description": "" }, - "options_toolbar_3": { - "message": "Отвори Gmail налог ако је само један налог пријављен", + "options_misc_15": { + "message": "Отвори најчешће постављана питања након ажурирања", "description": "" }, - "options_gmail_7": { - "message": "Шести налог (/mail/u/5/)", + "options_plugins": { + "message": "Додатне компоненте:", "description": "" }, - "popup_msg_8_format": { - "message": "пре %d седмице/а", + "options_plugins_1": { + "message": "Gmail ознаке и дугме звезда (експериментално)", "description": "" }, - "options_toolbar": { - "message": "Алатна трака:", + "options_plugins_2": { + "message": "Ова додатна компонента приказује дугме звезда као и ознаке тема у искачућем прозору (само режим приказа пуног садржаја).", "description": "" }, - "options_notifications_6": { - "message": "Скрати обавештења дужа од", + "options_px": { + "message": "px", "description": "" }, - "popup_wait": { - "message": "Сачекај...", + "options_empty": { + "message": "недефинисано", "description": "" }, - "tooltip_2": { - "message": "Средњи (или Ctrl+Леви) клик: Освежи све налоге", + "options_button_test": { + "message": "Репродукуј", "description": "" }, - "options_notifications_29": { - "message": "Ова опција се односи на мени на десном клику на дугмету на алатној траци -> онемогући сва обавештења -> прилагођени временски период", + "options_button_reset": { + "message": "Поништи подешавања", "description": "" }, - "options_tab_3": { - "message": "Отвори нови Gmail налог поред активне картице", + "popup_settings": { + "message": "подешавања", "description": "" }, - "options_gmail_8": { - "message": "Означи поруке као прочитане при архивирању", + "popup_of": { + "message": "од", "description": "" }, - "options_toolbar_17": { - "message": "Отвара основни Gmail налог", + "popup_wait": { + "message": "Сачекај...", "description": "" }, - "options_notifications_7": { - "message": "карактера у пољима [title] и [summary].", + "popup_date_format": { + "message": "%dd. %mm %yy.", "description": "" }, - "options_misc_10": { - "message": "Покрени десктоп и звучна обавештења само за пошту пристиглу у последњих (у минутима): ", + "popup_no_subject": { + "message": "(без наслова)", "description": "" }, - "options_tab_8": { - "message": "Занемари отворене Gmail картице", + "popup_open_settings": { + "message": "Отвори подешавања", "description": "" }, - "popup_no_subject": { - "message": "(без наслова)", + "popup_open_inbox": { + "message": "Отвори пријемно сандуче", "description": "" }, - "msg_5": { - "message": "Изаберите датотеку звучног обавештења", + "popup_archive": { + "message": "Архивирај", "description": "" }, - "popup_msg_2": { - "message": "пре 1 минут", + "popup_spam": { + "message": "Пријави непожељну поруку", "description": "" }, - "popup_msg_16": { - "message": "јул", + "popup_trash": { + "message": "Избриши", "description": "" }, - "label_8": { - "message": "На 2 сата", + "popup_refresh": { + "message": "Освежи", "description": "" }, - "msg_4": { - "message": "Напомена: Да би обавештења радила исправно, морате бити пријављени на свој Google налог.", + "popup_read": { + "message": "Озн. као прочитано", "description": "" }, - "popup_msg_20": { - "message": "новембар", + "popup_read_all": { + "message": "Означи све као прочитано", "description": "" }, - "options_toolbar_6": { - "message": "Прикажи пун садржај", + "popup_msg_1": { + "message": "управо сада", "description": "" }, - "options_gmail_11": { - "message": "Прилагођени канали:", + "popup_msg_2": { + "message": "пре 1 минут", "description": "" }, - "options_tab_2": { - "message": "Не тражи у другим прозорима прегледача отворене Gmail налоге. Ако Gmail није отворен у активном прозору, отвориће се у новој картици.", + "popup_msg_3_format": { + "message": "пре %d минута", "description": "" }, - "label_11": { - "message": "Напиши нову поруку", + "popup_msg_4": { + "message": "пре 1 сат", "description": "" }, - "options_toolbar_7": { - "message": "Ширина панела у режиму приказа пуног садржаја (у пикселима):", + "popup_msg_5": { + "message": "сата/и раније", "description": "" }, - "options_notifications_31": { - "message": "Прилагођени звук обавештења", + "popup_msg_6": { + "message": "јуче", "description": "" }, - "options_timings_l5": { - "message": "Минимални период је 5 минута.", + "popup_msg_7_format": { + "message": "пре %d дана", "description": "" }, - "options_misc": { - "message": "Остало:", + "popup_msg_8_format": { + "message": "пре %d седмице/а", "description": "" }, - "options_gmail_2": { - "message": "Одвоји ознаке \",\" (зарезом).", + "popup_msg_9_format": { + "message": "пре %d месеца", "description": "" }, - "options_misc_4": { - "message": "Сива боја за \"Нема непрочитаних\" и плава за \"Неповезан\"", + "popup_msg_10": { + "message": "јануар", "description": "" }, - "options_toolbar_13": { - "message": "Прикажи пошту као HTML у режиму приказа пуног садржаја", + "popup_msg_11": { + "message": "фебруар", "description": "" }, - "options_toolbar_16": { - "message": "Освежава све налоге", + "popup_msg_12": { + "message": "март", "description": "" }, - "options_gmail_6": { - "message": "Пети налог (/mail/u/4/)", + "popup_msg_13": { + "message": "април", "description": "" }, "popup_msg_14": { "message": "мај", "description": "" }, - "options_inshort": { - "message": "Обавештења за више Google Mail (Gmail) налога.", + "popup_msg_15": { + "message": "јун", "description": "" }, - "options_misc_12": { - "message": "Не обухватај детаље о пријављивању у опису алатке", + "popup_msg_16": { + "message": "јул", "description": "" }, - "options_tab_4": { - "message": "Отвори Gmail налог у активној картици", + "popup_msg_17": { + "message": "август", "description": "" }, - "popup_msg_3_format": { - "message": "пре %d минута", + "popup_msg_18": { + "message": "септембар", "description": "" }, - "label_12": { - "message": "Отвори FAQ", + "popup_msg_19": { + "message": "октобар", "description": "" }, - "description": { - "message": "Обавештења за више Google Mail (Gmail) налога", + "popup_msg_20": { + "message": "новембар", "description": "" }, - "popup_spam": { - "message": "Пријави непожељну поруку", + "popup_msg_21": { + "message": "децембар", + "description": "" + }, + "settings_open_title": { + "message": "Отвори страницу опција (подешавања)", + "description": "" + }, + "settings_open_label": { + "message": "Отвори опције", + "description": "" + }, + "gmail": { + "message": "Обавештења за Gmail™", "description": "" } } \ No newline at end of file diff --git a/v2/_locales/tr/messages.json b/v2/_locales/tr/messages.json new file mode 100644 index 00000000..47cb5884 --- /dev/null +++ b/v2/_locales/tr/messages.json @@ -0,0 +1,758 @@ +{ + "toolbar_label": { + "message": "Notifier for Gmail™", + "description": "" + }, + "tooltip_1": { + "message": "Left click: Open Gmail or mail preview panel", + "description": "" + }, + "tooltip_2": { + "message": "Middle (or Ctrl+Left) click: Refresh all accounts", + "description": "" + }, + "tooltip_3": { + "message": "Right click: Account selections", + "description": "" + }, + "description": { + "message": "Multiple label and account notifier for Google Mail (Gmail)", + "description": "" + }, + "log_in_to_your_account": { + "message": "Lütfen Gmail hesabınıza giriş yapın", + "description": "" + }, + "msg_1": { + "message": "Sekme zaten açık. Gmail'i yeni bir sekmede açmak veya mevcut bir Gmail sekmesine geçmek için araç çubuğu düğmesine tıklayın.", + "description": "" + }, + "msg_2": { + "message": "Bağlantı panoya kopyalandı.", + "description": "" + }, + "msg_3": { + "message": "Seçilen metin panoya kopyalandı.", + "description": "" + }, + "msg_4": { + "message": "Note: For the notifier to work properly, you need to be logged-in into your Google account.", + "description": "" + }, + "msg_5": { + "message": "Bir ses dosyası seçin", + "description": "" + }, + "label_1": { + "message": "Yenile", + "description": "" + }, + "label_2": { + "message": "Ayarlar", + "description": "" + }, + "label_3": { + "message": "Tüm bildirimleri devre dışı bırak", + "description": "" + }, + "label_4": { + "message": "5 dakika", + "description": "" + }, + "label_5": { + "message": "15 dakika", + "description": "" + }, + "label_6": { + "message": "30 dakika", + "description": "" + }, + "label_7": { + "message": "1 saat", + "description": "" + }, + "label_8": { + "message": "2 saat", + "description": "" + }, + "label_9": { + "message": "5 saat", + "description": "" + }, + "label_13": { + "message": "Özel bir süre için", + "description": "" + }, + "label_10": { + "message": "Bildirimleri etkinleştir", + "description": "" + }, + "label_11": { + "message": "Bir e-posta oluştur", + "description": "" + }, + "label_12": { + "message": "SSS'i aç", + "description": "" + }, + "label_14": { + "message": "Giriş yapılan hesaplar", + "description": "" + }, + "unknown": { + "message": "bilinmeyen", + "description": "" + }, + "and": { + "message": "ve", + "description": "" + }, + "log_into_your_account": { + "message": "Please log into your account", + "description": "" + }, + "notification": { + "message": "From: [author_email][break]Title: [title][break]Summary: [summary]", + "description": "" + }, + "options_title": { + "message": "Seçenekler - Gmail™ Notifier", + "description": "" + }, + "options_inshort": { + "message": "Multiple label and account notifier for Google Mail (Gmail).", + "description": "" + }, + "options_donation": { + "message": "Geliştirmeye Destek ol", + "description": "" + }, + "options_timings": { + "message": "Zamanlama:", + "description": "" + }, + "options_timings_l1": { + "message": "Şu kadar saniyede bir yeni e-postaları kontrol et:", + "description": "" + }, + "options_timings_l2": { + "message": "En az süre 10 saniyedir.", + "description": "" + }, + "options_timings_l3": { + "message": "Şu kadar dakikada bir okunmamış e-postaları hatırlat:", + "description": "" + }, + "options_timings_l4": { + "message": "Hiçbir zaman hatırlatılmaması için değeri 0 (sıfır) olarak ayarlayın.", + "description": "" + }, + "options_timings_l5": { + "message": "En az süre 5 dakikadır.", + "description": "" + }, + "options_timings_l6": { + "message": "Değerler 0 (sıfır) değilse okunmamış e-postalar hem masaüstü bildirimi hem de uyarı sesiyle size bildirilir.", + "description": "" + }, + "options_timings_l7": { + "message": "Şu saniyeliğine başlangıçta yeni e-postaları kontrol etme:", + "description": "" + }, + "options_timings_l8": { + "message": "İlk elle yenilemeye kadar e-posta kontrolünü kapamak için değeri 0 (sıfır) olarak ayarlayın [Safari için geçerli değildir].", + "description": "" + }, + "options_gmail": { + "message": "Gmail:", + "description": "" + }, + "options_gmail_1": { + "message": "Birinci (asıl) hesap (/mail/u/0/)", + "description": "" + }, + "options_gmail_2": { + "message": "Etiketleri \",\" (virgül) ile ayırın.", + "description": "" + }, + "options_gmail_3": { + "message": "İkinci hesap (/mail/u/1/)", + "description": "" + }, + "options_gmail_4": { + "message": "Üçüncü hesap (/mail/u/2/)", + "description": "" + }, + "options_gmail_5": { + "message": "Dördüncü hesap (/mail/u/3/)", + "description": "" + }, + "options_gmail_6": { + "message": "Beşinci hesap (/mail/u/4/)", + "description": "" + }, + "options_gmail_7": { + "message": "Altıncı hesap (/mail/u/5/)", + "description": "" + }, + "options_gmail_8": { + "message": "İletiyi arşivlerken okunmuş olarak işaretle", + "description": "" + }, + "options_gmail_15": { + "message": "Some popular labels:", + "description": "" + }, + "options_gmail_10": { + "message": "Aşağıdaki etiketler ve hesaplar için bildirim alın:", + "description": "" + }, + "options_gmail_11": { + "message": "Custom feeds:", + "description": "" + }, + "options_gmail_12": { + "message": "Separate feeds by \",\" (Comma). Sample feed: https://mail.google.com/mail/u/0/feed/atom/inbox", + "description": "" + }, + "options_gmail_13": { + "message": "Note: maximum number for all labels except \"inbox\" is 20 (Google feeds only supply the 20 newest entries)", + "description": "" + }, + "options_gmail_14": { + "message": "Note: for the Notifier to listen for more than 5 accounts, add feeds URLs to the \"Custom feeds\" field. For instance to listen to the 6 and 7th accounts add: https://mail.google.com/mail/u/6/feed/atom/inbox, https://mail.google.com/mail/u/7/feed/atom/inbox", + "description": "" + }, + "options_notifications": { + "message": "Bildirimler:", + "description": "" + }, + "options_notifications_1": { + "message": "Yeni e-postalar için masaüstü bildirimlerini aç", + "description": "" + }, + "options_notifications_2": { + "message": "Masaüstü bildirimlerini şu kadar saniye göster:", + "description": "" + }, + "options_notifications_3": { + "message": "Bu seçenek işletim sisteminize bağlı olarak çalışmayabilir.", + "description": "" + }, + "options_notifications_4": { + "message": "Bildirim şekli", + "description": "" + }, + "options_notifications_5": { + "message": "Mevcut değişkenler:", + "description": "" + }, + "options_notifications_6": { + "message": "Gelen e-posta yandaki sayı kadar karakterden fazla ise bildirim gösterme:", + "description": "" + }, + "options_notifications_7": { + "message": " ", + "description": "" + }, + "options_notifications_8": { + "message": "Elips şeklinde olmaması için burada büyük bir sayı kullanın veya varsayılan olarak bırakın.", + "description": "" + }, + "options_notifications_9": { + "message": "Yeni e-postalar için uyarı sesi çal", + "description": "" + }, + "options_notifications_10": { + "message": "Mac kullanıcıları için not: Firefox 28.0 sürümünde, tüm masaüstü bildirimleri, ekstra bir uyarıya neden olan Mac Bildirim Merkezi tarafından kontrol edilmektedir. Bu sesli bildirimin veya Bildirim Merkezi tarafından oluşturulan bildirimin tikini kaldırmanız gerekir.", + "description": "" + }, + "options_notifications_11": { + "message": "\"Windows görev çubuğu bildirimi\" veya \"Mac OS Dock bildirimi\" ni görüntüle", + "description": "" + }, + "options_notifications_12": { + "message": "Görev çubuğu bildirimleri şu anda Linux işletim sistemlerinde desteklenmemektedir.", + "description": "" + }, + "options_notifications_13": { + "message": "Görev çubuğu bildirim simgesini tıklattığınızda araç çubuğu panelini açın (Yalnızca Windows, Beta)", + "description": "" + }, + "options_notifications_14": { + "message": "Bu özellik oldukça deneyseldir ve Firefox tarayıcınızı kararsız hale getirebilir. [Yeniden başlatma gerektirir].", + "description": "" + }, + "options_notifications_15": { + "message": "Varsayılan sesli bildirim", + "description": "" + }, + "options_notifications_16": { + "message": "Gmail Bildirici varsayılan sesi", + "description": "" + }, + "options_notifications_17": { + "message": "Checker Plus bildirim sesi", + "description": "" + }, + "options_notifications_18": { + "message": "Checker Plus tınlama sesi", + "description": "" + }, + "options_notifications_19": { + "message": "Windows e-posta sesi", + "description": "" + }, + "options_notifications_20": { + "message": "Özel bildirim sesi seçin", + "description": "" + }, + "options_notifications_21": { + "message": "Özel bildirim sesiniz:", + "description": "" + }, + "options_notifications_22": { + "message": "Tarayıcınız özel bildirim sesini çalmıyorsa, çevrimiçi bir dönüştürme aracı kullanarak WAV formatına dönüştürmeyi deneyin.", + "description": "" + }, + "options_notifications_35": { + "message": "To select a new custom sound, select a built-in sound first and then change the option to custom sound", + "description": "" + }, + "options_notifications_23": { + "message": "Bildirim sesinin değeri", + "description": "" + }, + "options_notifications_24": { + "message": "Ses, 0 ile 100 arasında bir sayıdır; burada 100, en yüksek ses düzeyidir (varsayılan).", + "description": "" + }, + "options_notifications_25": { + "message": "Safari'de varsayılan sesli bildirimler düzgün şekilde oynatılmıyorsa, özel bir ses dosyası kullanın.", + "description": "" + }, + "options_notifications_26": { + "message": "Always show tray notification (Windows only)", + "description": "" + }, + "options_notifications_27": { + "message": "Tray notification will be shown even if there is no unread message.", + "description": "" + }, + "options_notifications_28": { + "message": "Disable all notifications for a custom time period (in minutes):", + "description": "" + }, + "options_notifications_29": { + "message": "This option is related to the right click menu on the toolbar button -> disable all notifications -> custom time period.", + "description": "" + }, + "options_notifications_30": { + "message": "Combine all concurrent desktop notifications into a single notification", + "description": "" + }, + "options_notifications_31": { + "message": "Özel bildirim sesi", + "description": "" + }, + "options_notifications_32": { + "message": "name or email contains", + "description": "" + }, + "options_notifications_33": { + "message": "email title contains", + "description": "" + }, + "options_notifications_34": { + "message": "email summary contains", + "description": "" + }, + "options_notifications_36": { + "message": "Ask Gmail to prevent 'inbox.google.com' redirection", + "description": "" + }, + "options_notifications_37": { + "message": "Display Badge number", + "description": "" + }, + "options_notifications_38": { + "message": "Faster actions (mark as read, delete, ...) (Consider actions to be resolved when headers are received)", + "description": "" + }, + "options_notifications_40": { + "message": "Allow quick actions from notification box (maximum two actions) (Chrome only)", + "description": "" + }, + "options_notifications_41": { + "message": "Mark as Read", + "description": "" + }, + "options_notifications_42": { + "message": "Archive", + "description": "" + }, + "options_notifications_43": { + "message": "Trash", + "description": "" + }, + "options_tab": { + "message": "Sekme Açılışı:", + "description": "" + }, + "options_tab_1": { + "message": "Sadece aktif pencerede açık bir Gmail hesabı arayın", + "description": "" + }, + "options_tab_2": { + "message": "Do not search other browser windows for open Gmail accounts. If Gmail is not open in the active window, open a new tab.", + "description": "" + }, + "options_tab_3": { + "message": "Open new Gmail account next to the active tab", + "description": "" + }, + "options_tab_4": { + "message": "Open Gmail account in the active tab", + "description": "" + }, + "options_tab_5": { + "message": "Open Gmail account in a background tab", + "description": "" + }, + "options_tab_6": { + "message": "Open Gmail account in a new window", + "description": "" + }, + "options_tab_7": { + "message": "Always use blank tabs instead of opening a new tab when open in tab is activated", + "description": "" + }, + "options_tab_8": { + "message": "Ignore opened Gmail tabs", + "description": "" + }, + "options_tab_9": { + "message": "When unchecked, Gmail Notifier checks either active window or all open windows for open instance of Gmail and switch to the tab when tab opening is requested.", + "description": "" + }, + "options_tab_10": { + "message": "Open emails in basic HTML mode", + "description": "" + }, + "options_toolbar": { + "message": "Araç Çubuğu:", + "description": "" + }, + "options_toolbar_1": { + "message": "Toolbar button behaviour", + "description": "" + }, + "options_toolbar_2": { + "message": "Always open email preview panel", + "description": "" + }, + "options_toolbar_3": { + "message": "Yalnızca bir hesap giriş yaptıysa, Gmail hesabını aç", + "description": "" + }, + "options_toolbar_18": { + "message": "Open Gmail account (forced)", + "description": "" + }, + "options_toolbar_4": { + "message": "Toolbar panel mode", + "description": "" + }, + "options_toolbar_5": { + "message": "Sadece özetini göster", + "description": "" + }, + "options_toolbar_6": { + "message": "Tam içeriği göster", + "description": "" + }, + "options_toolbar_7": { + "message": "Toolbar panel width in the full-content view mode is (in pixels):", + "description": "" + }, + "options_toolbar_8": { + "message": "Minimum width is 500px.", + "description": "" + }, + "options_toolbar_9": { + "message": "Toolbar panel height in the full-content view mode is (in pixels):", + "description": "" + }, + "options_toolbar_10": { + "message": "Minimum height is 500px.", + "description": "" + }, + "options_toolbar_11": { + "message": "Support keyboard shortcuts on the toolbar panel", + "description": "" + }, + "options_toolbar_12": { + "message": "!: Report as spam, #: Trash, e: Archive, Shift + i: Mark as read.", + "description": "" + }, + "options_toolbar_13": { + "message": "Render emails as HTML in full-content mode", + "description": "" + }, + "options_toolbar_14": { + "message": "If you prefer text-only rendering in the full-content mode, uncheck the box.", + "description": "" + }, + "options_toolbar_15": { + "message": "Middle-click on the toolbar button to", + "description": "" + }, + "options_toolbar_16": { + "message": "Tüm hesapları yenile", + "description": "" + }, + "options_toolbar_17": { + "message": "Open primary Gmail account", + "description": "" + }, + "options_misc": { + "message": "Diğer Ayarlar:", + "description": "" + }, + "options_misc_1": { + "message": "Sort accounts alphabetically", + "description": "" + }, + "options_misc_2": { + "message": "The default order type is logged-in order.", + "description": "" + }, + "options_misc_3": { + "message": "Toolbar color pattern is", + "description": "" + }, + "options_misc_4": { + "message": "Gray color for \"No Unread\" and blue color for \"Disconnected\"", + "description": "" + }, + "options_misc_5": { + "message": "Blue color for \"No Unread\" and gray color for \"Disconnected\"", + "description": "" + }, + "options_misc_9": { + "message": "Red color for \"No Unread\" and gray color for \"Disconnected\"", + "description": "" + }, + "options_misc_6": { + "message": "Show desktop notification to warn that Gmail is already opened in the active tab", + "description": "" + }, + "options_misc_7": { + "message": "Show welcome page on upgrade", + "description": "" + }, + "options_misc_8": { + "message": "Reset all settings back to factory", + "description": "" + }, + "options_misc_10": { + "message": "Only fire desktop and sound notifications when email has arrived in less than (in minutes): ", + "description": "" + }, + "options_misc_11": { + "message": "By setting this preference to zero, you will receive neither desktop nor sound notifications; however, you will still get badge notification.", + "description": "" + }, + "options_misc_12": { + "message": "Do not include login details in the tooltip text", + "description": "" + }, + "options_misc_13": { + "message": "By default, the notifier updates tooltip text of the toolbar button with login info. By unchecking this option, the tooltip text remains the default value.", + "description": "" + }, + "options_misc_14": { + "message": "Do not show the exact badge number when the number of unread emails is greater than 999", + "description": "" + }, + "options_misc_15": { + "message": "Her güncellemeden sonra SSS sayfasını aç", + "description": "" + }, + "options_plugins": { + "message": "Plug-ins:", + "description": "" + }, + "options_plugins_1": { + "message": "Gmail labels and star button (experimental)", + "description": "" + }, + "options_plugins_2": { + "message": "This plugin displays the star button as well as thread's labels in the popup (expanded mode only).", + "description": "" + }, + "options_px": { + "message": "px", + "description": "" + }, + "options_empty": { + "message": "not defined", + "description": "" + }, + "options_button_test": { + "message": "Oynat", + "description": "" + }, + "options_button_reset": { + "message": "Tercihleri Sıfırla", + "description": "" + }, + "popup_settings": { + "message": "ayarlar", + "description": "" + }, + "popup_of": { + "message": "of", + "description": "" + }, + "popup_wait": { + "message": "Bekleyiniz...", + "description": "" + }, + "popup_date_format": { + "message": "%mm %dd, %yy", + "description": "" + }, + "popup_no_subject": { + "message": "(konu yok)", + "description": "" + }, + "popup_open_settings": { + "message": "Ayarları aç", + "description": "" + }, + "popup_open_inbox": { + "message": "Gmail'i aç", + "description": "" + }, + "popup_archive": { + "message": "Arşivle", + "description": "" + }, + "popup_spam": { + "message": "Spamla", + "description": "" + }, + "popup_trash": { + "message": "Sil", + "description": "" + }, + "popup_refresh": { + "message": "Yenile", + "description": "" + }, + "popup_read": { + "message": "Okundu İşaretle", + "description": "" + }, + "popup_read_all": { + "message": "Tümünü okundu işaretle", + "description": "" + }, + "popup_msg_1": { + "message": "az önce", + "description": "" + }, + "popup_msg_2": { + "message": "1 dakika önce", + "description": "" + }, + "popup_msg_3_format": { + "message": "%d dakika önce", + "description": "" + }, + "popup_msg_4": { + "message": "1 saat önce", + "description": "" + }, + "popup_msg_5": { + "message": "saat önce", + "description": "" + }, + "popup_msg_6": { + "message": "Dün", + "description": "" + }, + "popup_msg_7_format": { + "message": "%d gün önce", + "description": "" + }, + "popup_msg_8_format": { + "message": "%d hafta önce", + "description": "" + }, + "popup_msg_9_format": { + "message": "%d ay önce", + "description": "" + }, + "popup_msg_10": { + "message": "Ocak", + "description": "" + }, + "popup_msg_11": { + "message": "Şubat", + "description": "" + }, + "popup_msg_12": { + "message": "Mart", + "description": "" + }, + "popup_msg_13": { + "message": "Nisan", + "description": "" + }, + "popup_msg_14": { + "message": "Mayıs", + "description": "" + }, + "popup_msg_15": { + "message": "Haziran", + "description": "" + }, + "popup_msg_16": { + "message": "Temmuz", + "description": "" + }, + "popup_msg_17": { + "message": "Ağustos", + "description": "" + }, + "popup_msg_18": { + "message": "Eylül", + "description": "" + }, + "popup_msg_19": { + "message": "Ekim", + "description": "" + }, + "popup_msg_20": { + "message": "Kasım", + "description": "" + }, + "popup_msg_21": { + "message": "Aralık", + "description": "" + }, + "settings_open_title": { + "message": "Open options (settings) page", + "description": "" + }, + "settings_open_label": { + "message": "Seçenekler", + "description": "" + }, + "gmail": { + "message": "Notifier for Gmail™", + "description": "" + } +} \ No newline at end of file diff --git a/v2/_locales/uk/messages.json b/v2/_locales/uk/messages.json new file mode 100644 index 00000000..62820f9f --- /dev/null +++ b/v2/_locales/uk/messages.json @@ -0,0 +1,758 @@ +{ + "toolbar_label": { + "message": "Notifier for Gmail™", + "description": "" + }, + "tooltip_1": { + "message": "Left click: Open Gmail or mail preview panel", + "description": "" + }, + "tooltip_2": { + "message": "Middle (or Ctrl+Left) click: Refresh all accounts", + "description": "" + }, + "tooltip_3": { + "message": "Right click: Account selections", + "description": "" + }, + "description": { + "message": "Нагадувач облікового запису для Google Mail (Gmail) з багатьма мітками", + "description": "" + }, + "log_in_to_your_account": { + "message": "Будь ласка, увійдіть в свій обліковий запис Gmail", + "description": "" + }, + "msg_1": { + "message": "Вкладка вже відкрита. Натисніть кнопку на панелі інструментів, щоб відкрити Gmail в новій вкладці, або переключитися на існуючу вкладку Gmail.", + "description": "" + }, + "msg_2": { + "message": "Посилання скопійовано до буфера обміну.", + "description": "" + }, + "msg_3": { + "message": "Виділений текст скопійовано до буфера обміну.", + "description": "" + }, + "msg_4": { + "message": "Note: For the notifier to work properly, you need to be logged-in into your Google account.", + "description": "" + }, + "msg_5": { + "message": "Select an audio sound file", + "description": "" + }, + "label_1": { + "message": "Оновити", + "description": "" + }, + "label_2": { + "message": "Налаштування", + "description": "" + }, + "label_3": { + "message": "Відключити всі попередження", + "description": "" + }, + "label_4": { + "message": "Протягом 5 хвилин", + "description": "" + }, + "label_5": { + "message": "Протягом 15 хвилин", + "description": "" + }, + "label_6": { + "message": "Протягом 30 хвилин", + "description": "" + }, + "label_7": { + "message": "Протягом 1 години", + "description": "" + }, + "label_8": { + "message": "Протягом 2 годин", + "description": "" + }, + "label_9": { + "message": "Протягом 5 годин", + "description": "" + }, + "label_13": { + "message": "For a custom time period", + "description": "" + }, + "label_10": { + "message": "Enable notifications (session)", + "description": "" + }, + "label_11": { + "message": "Написати листа", + "description": "" + }, + "label_12": { + "message": "Open FAQs", + "description": "" + }, + "label_14": { + "message": "Logged-in accounts", + "description": "" + }, + "unknown": { + "message": "unknown", + "description": "" + }, + "and": { + "message": "and", + "description": "" + }, + "log_into_your_account": { + "message": "Please log into your account", + "description": "" + }, + "notification": { + "message": "From: [author_email][break]Title: [title][break]Summary: [summary]", + "description": "" + }, + "options_title": { + "message": "Параметри - Gmail™ Notifier", + "description": "" + }, + "options_inshort": { + "message": "Нагадувач облікового запису для Google Mail (Gmail) з багатьма мітками.", + "description": "" + }, + "options_donation": { + "message": "Support Development", + "description": "" + }, + "options_timings": { + "message": "Timings:", + "description": "" + }, + "options_timings_l1": { + "message": "Check for new emails every (in seconds):", + "description": "" + }, + "options_timings_l2": { + "message": "Minimum period is 10 seconds.", + "description": "" + }, + "options_timings_l3": { + "message": "Remind for all unread emails every (in minutes):", + "description": "" + }, + "options_timings_l4": { + "message": "Set the value to zero for none-periodic reminders.", + "description": "" + }, + "options_timings_l5": { + "message": "Minimum period is 5 minutes.", + "description": "" + }, + "options_timings_l6": { + "message": "Non-zero value fires both desktop notification and alert sound (similar to new email arrival) eternally if you have unread email(s).", + "description": "" + }, + "options_timings_l7": { + "message": "Do not check for new emails on startup for (in seconds):", + "description": "" + }, + "options_timings_l8": { + "message": "Set the value to zero for no email check until the first manual refresh [Not available on Safari].", + "description": "" + }, + "options_gmail": { + "message": "Gmail:", + "description": "" + }, + "options_gmail_1": { + "message": "Primary account (/mail/u/0/)", + "description": "" + }, + "options_gmail_2": { + "message": "Separate labels by \",\" (Comma).", + "description": "" + }, + "options_gmail_3": { + "message": "Secondary account (/mail/u/1/)", + "description": "" + }, + "options_gmail_4": { + "message": "Tertiary account (/mail/u/2/)", + "description": "" + }, + "options_gmail_5": { + "message": "Quaternary account (/mail/u/3/)", + "description": "" + }, + "options_gmail_6": { + "message": "Quinary account (/mail/u/4/)", + "description": "" + }, + "options_gmail_7": { + "message": "Senary account (/mail/u/5/)", + "description": "" + }, + "options_gmail_8": { + "message": "Mark message as read when archiving it", + "description": "" + }, + "options_gmail_15": { + "message": "Some popular labels:", + "description": "" + }, + "options_gmail_10": { + "message": "Receive notifications for the following labels and accounts:", + "description": "" + }, + "options_gmail_11": { + "message": "Custom feeds:", + "description": "" + }, + "options_gmail_12": { + "message": "Separate feeds by \",\" (Comma). Sample feed: https://mail.google.com/mail/u/0/feed/atom/inbox", + "description": "" + }, + "options_gmail_13": { + "message": "Note: maximum number for all labels except \"inbox\" is 20 (Google feeds only supply the 20 newest entries)", + "description": "" + }, + "options_gmail_14": { + "message": "Note: for the Notifier to listen for more than 5 accounts, add feeds URLs to the \"Custom feeds\" field. For instance to listen to the 6 and 7th accounts add: https://mail.google.com/mail/u/6/feed/atom/inbox, https://mail.google.com/mail/u/7/feed/atom/inbox", + "description": "" + }, + "options_notifications": { + "message": "Notifications:", + "description": "" + }, + "options_notifications_1": { + "message": "Display desktop notification for new emails", + "description": "" + }, + "options_notifications_2": { + "message": "Show desktop notification for (in seconds):", + "description": "" + }, + "options_notifications_3": { + "message": "This option may not work based on your OS.", + "description": "" + }, + "options_notifications_4": { + "message": "Notification format", + "description": "" + }, + "options_notifications_5": { + "message": "Available variables:", + "description": "" + }, + "options_notifications_6": { + "message": "Truncate notifications longer than", + "description": "" + }, + "options_notifications_7": { + "message": "characters for [title] and [summary] fields.", + "description": "" + }, + "options_notifications_8": { + "message": "To have no ellipsis truncation, use a big number here.", + "description": "" + }, + "options_notifications_9": { + "message": "Play alert sound for new emails", + "description": "" + }, + "options_notifications_10": { + "message": "Note for Mac users. From Firefox 28.0, all desktop notifications are handled by Mac Notification Center which causes an extra sound alert. You need to either uncheck this sound notification or the one that is generated by the Notification Center.", + "description": "" + }, + "options_notifications_11": { + "message": "Display \"Windows taskbar notification\" or \"Mac OS Dock notification\"", + "description": "" + }, + "options_notifications_12": { + "message": "Taskbar notifications are not supported on Linux OS at the moment.", + "description": "" + }, + "options_notifications_13": { + "message": "Open toolbar panel when click on the taskbar notification icon (Windows only, beta)", + "description": "" + }, + "options_notifications_14": { + "message": "This feature is highly experimental and might make your Firefox browser unstable. [Restart required].", + "description": "" + }, + "options_notifications_15": { + "message": "Default sound notification is", + "description": "" + }, + "options_notifications_16": { + "message": "Gmail Notifier default alert", + "description": "" + }, + "options_notifications_17": { + "message": "Checker Plus bell alert", + "description": "" + }, + "options_notifications_18": { + "message": "Checker Plus ding alert", + "description": "" + }, + "options_notifications_19": { + "message": "Windows email alert", + "description": "" + }, + "options_notifications_20": { + "message": "User defined sound", + "description": "" + }, + "options_notifications_21": { + "message": "User defined notification sound is", + "description": "" + }, + "options_notifications_22": { + "message": "If your browser is not playing the custom notification sound, try to convert it into a plain WAV format using an online conversion tool.", + "description": "" + }, + "options_notifications_35": { + "message": "To select a new custom sound, select a built-in sound first and then change the option to custom sound", + "description": "" + }, + "options_notifications_23": { + "message": "Volume of the sound notification is", + "description": "" + }, + "options_notifications_24": { + "message": "Volume is a number between 0 to 100 where 100 is the highest volume (default).", + "description": "" + }, + "options_notifications_25": { + "message": "In safari most likely the default sound notifications are not playing properly, if so use a custom sound file as your notification.", + "description": "" + }, + "options_notifications_26": { + "message": "Always show tray notification (Windows only)", + "description": "" + }, + "options_notifications_27": { + "message": "Tray notification will be shown even if there is no unread message.", + "description": "" + }, + "options_notifications_28": { + "message": "Disable all notifications for a custom time period (in minutes):", + "description": "" + }, + "options_notifications_29": { + "message": "This option is related to the right click menu on the toolbar button -> disable all notifications -> custom time period.", + "description": "" + }, + "options_notifications_30": { + "message": "Combine all concurrent desktop notifications into a single notification", + "description": "" + }, + "options_notifications_31": { + "message": "Custom sound notification", + "description": "" + }, + "options_notifications_32": { + "message": "name or email contains", + "description": "" + }, + "options_notifications_33": { + "message": "email title contains", + "description": "" + }, + "options_notifications_34": { + "message": "email summary contains", + "description": "" + }, + "options_notifications_36": { + "message": "Ask Gmail to prevent 'inbox.google.com' redirection", + "description": "" + }, + "options_notifications_37": { + "message": "Display Badge number", + "description": "" + }, + "options_notifications_38": { + "message": "Faster actions (mark as read, delete, ...) (Consider actions to be resolved when headers are received)", + "description": "" + }, + "options_notifications_40": { + "message": "Allow quick actions from notification box (maximum two actions) (Chrome only)", + "description": "" + }, + "options_notifications_41": { + "message": "Mark as Read", + "description": "" + }, + "options_notifications_42": { + "message": "Archive", + "description": "" + }, + "options_notifications_43": { + "message": "Trash", + "description": "" + }, + "options_tab": { + "message": "Tab Opening:", + "description": "" + }, + "options_tab_1": { + "message": "Search for an open Gmail account only on the active window", + "description": "" + }, + "options_tab_2": { + "message": "Do not search other browser windows for open Gmail accounts. If Gmail is not open in the active window, open a new tab.", + "description": "" + }, + "options_tab_3": { + "message": "Open new Gmail account next to the active tab", + "description": "" + }, + "options_tab_4": { + "message": "Open Gmail account in the active tab", + "description": "" + }, + "options_tab_5": { + "message": "Open Gmail account in a background tab", + "description": "" + }, + "options_tab_6": { + "message": "Open Gmail account in a new window", + "description": "" + }, + "options_tab_7": { + "message": "Always use blank tabs instead of opening a new tab when open in tab is activated", + "description": "" + }, + "options_tab_8": { + "message": "Ignore opened Gmail tabs", + "description": "" + }, + "options_tab_9": { + "message": "When unchecked, Gmail Notifier checks either active window or all open windows for open instance of Gmail and switch to the tab when tab opening is requested.", + "description": "" + }, + "options_tab_10": { + "message": "Open emails in basic HTML mode", + "description": "" + }, + "options_toolbar": { + "message": "Toolbar:", + "description": "" + }, + "options_toolbar_1": { + "message": "Toolbar button behaviour", + "description": "" + }, + "options_toolbar_2": { + "message": "Always open email preview panel", + "description": "" + }, + "options_toolbar_3": { + "message": "Open Gmail account if only one account is logged-in", + "description": "" + }, + "options_toolbar_18": { + "message": "Open Gmail account (forced)", + "description": "" + }, + "options_toolbar_4": { + "message": "Toolbar panel mode", + "description": "" + }, + "options_toolbar_5": { + "message": "Show summary only", + "description": "" + }, + "options_toolbar_6": { + "message": "Show full content", + "description": "" + }, + "options_toolbar_7": { + "message": "Toolbar panel width in the full-content view mode is (in pixels):", + "description": "" + }, + "options_toolbar_8": { + "message": "Minimum width is 500px.", + "description": "" + }, + "options_toolbar_9": { + "message": "Toolbar panel height in the full-content view mode is (in pixels):", + "description": "" + }, + "options_toolbar_10": { + "message": "Minimum height is 500px.", + "description": "" + }, + "options_toolbar_11": { + "message": "Support keyboard shortcuts on the toolbar panel", + "description": "" + }, + "options_toolbar_12": { + "message": "!: Report as spam, #: Trash, e: Archive, Shift + i: Mark as read.", + "description": "" + }, + "options_toolbar_13": { + "message": "Render emails as HTML in full-content mode", + "description": "" + }, + "options_toolbar_14": { + "message": "If you prefer text-only rendering in the full-content mode, uncheck the box.", + "description": "" + }, + "options_toolbar_15": { + "message": "Middle-click on the toolbar button to", + "description": "" + }, + "options_toolbar_16": { + "message": "Refresh all accounts", + "description": "" + }, + "options_toolbar_17": { + "message": "Open primary Gmail account", + "description": "" + }, + "options_misc": { + "message": "Miscellaneous:", + "description": "" + }, + "options_misc_1": { + "message": "Sort accounts alphabetically", + "description": "" + }, + "options_misc_2": { + "message": "The default order type is logged-in order.", + "description": "" + }, + "options_misc_3": { + "message": "Toolbar color pattern is", + "description": "" + }, + "options_misc_4": { + "message": "Gray color for \"No Unread\" and blue color for \"Disconnected\"", + "description": "" + }, + "options_misc_5": { + "message": "Blue color for \"No Unread\" and gray color for \"Disconnected\"", + "description": "" + }, + "options_misc_9": { + "message": "Red color for \"No Unread\" and gray color for \"Disconnected\"", + "description": "" + }, + "options_misc_6": { + "message": "Show desktop notification to warn that Gmail is already opened in the active tab", + "description": "" + }, + "options_misc_7": { + "message": "Show welcome page on upgrade", + "description": "" + }, + "options_misc_8": { + "message": "Reset all settings back to factory", + "description": "" + }, + "options_misc_10": { + "message": "Only fire desktop and sound notifications when email has arrived in less than (in minutes): ", + "description": "" + }, + "options_misc_11": { + "message": "By setting this preference to zero, you will receive neither desktop nor sound notifications; however, you will still get badge notification.", + "description": "" + }, + "options_misc_12": { + "message": "Do not include login details in the tooltip text", + "description": "" + }, + "options_misc_13": { + "message": "By default, the notifier updates tooltip text of the toolbar button with login info. By unchecking this option, the tooltip text remains the default value.", + "description": "" + }, + "options_misc_14": { + "message": "Do not show the exact badge number when the number of unread emails is greater than 999", + "description": "" + }, + "options_misc_15": { + "message": "Open FAQs page on updates", + "description": "" + }, + "options_plugins": { + "message": "Plug-ins:", + "description": "" + }, + "options_plugins_1": { + "message": "Gmail labels and star button (experimental)", + "description": "" + }, + "options_plugins_2": { + "message": "This plugin displays the star button as well as thread's labels in the popup (expanded mode only).", + "description": "" + }, + "options_px": { + "message": "px", + "description": "" + }, + "options_empty": { + "message": "not defined", + "description": "" + }, + "options_button_test": { + "message": "Play", + "description": "" + }, + "options_button_reset": { + "message": "Reset Preferences", + "description": "" + }, + "popup_settings": { + "message": "settings", + "description": "" + }, + "popup_of": { + "message": "of", + "description": "" + }, + "popup_wait": { + "message": "Wait...", + "description": "" + }, + "popup_date_format": { + "message": "%mm %dd, %yy", + "description": "" + }, + "popup_no_subject": { + "message": "(no subject)", + "description": "" + }, + "popup_open_settings": { + "message": "Open settings", + "description": "" + }, + "popup_open_inbox": { + "message": "Open inbox", + "description": "" + }, + "popup_archive": { + "message": "Archive", + "description": "" + }, + "popup_spam": { + "message": "Spam", + "description": "" + }, + "popup_trash": { + "message": "Trash", + "description": "" + }, + "popup_refresh": { + "message": "Refresh", + "description": "" + }, + "popup_read": { + "message": "Mark as Read", + "description": "" + }, + "popup_read_all": { + "message": "Mark all as read", + "description": "" + }, + "popup_msg_1": { + "message": "just now", + "description": "" + }, + "popup_msg_2": { + "message": "1 minute ago", + "description": "" + }, + "popup_msg_3_format": { + "message": "%d minutes ago", + "description": "" + }, + "popup_msg_4": { + "message": "1 hour ago", + "description": "" + }, + "popup_msg_5": { + "message": "hours ago", + "description": "" + }, + "popup_msg_6": { + "message": "Yesterday", + "description": "" + }, + "popup_msg_7_format": { + "message": "%d days ago", + "description": "" + }, + "popup_msg_8_format": { + "message": "%d week(s) ago", + "description": "" + }, + "popup_msg_9_format": { + "message": "%d month(s) ago", + "description": "" + }, + "popup_msg_10": { + "message": "January", + "description": "" + }, + "popup_msg_11": { + "message": "February", + "description": "" + }, + "popup_msg_12": { + "message": "March", + "description": "" + }, + "popup_msg_13": { + "message": "April", + "description": "" + }, + "popup_msg_14": { + "message": "May", + "description": "" + }, + "popup_msg_15": { + "message": "June", + "description": "" + }, + "popup_msg_16": { + "message": "July", + "description": "" + }, + "popup_msg_17": { + "message": "August", + "description": "" + }, + "popup_msg_18": { + "message": "September", + "description": "" + }, + "popup_msg_19": { + "message": "October", + "description": "" + }, + "popup_msg_20": { + "message": "November", + "description": "" + }, + "popup_msg_21": { + "message": "December", + "description": "" + }, + "settings_open_title": { + "message": "Open options (settings) page", + "description": "" + }, + "settings_open_label": { + "message": "Open Options", + "description": "" + }, + "gmail": { + "message": "Notifier for Gmail™", + "description": "" + } +} \ No newline at end of file diff --git a/WebExtension/_locales/zh_CN/messages.json b/v2/_locales/zh_CN/messages.json similarity index 86% rename from WebExtension/_locales/zh_CN/messages.json rename to v2/_locales/zh_CN/messages.json index 13f52292..703c47cf 100644 --- a/WebExtension/_locales/zh_CN/messages.json +++ b/v2/_locales/zh_CN/messages.json @@ -1,690 +1,762 @@ { - "label_9": { - "message": "禁用 5 小时", + "toolbar_label": { + "message": "Notifier for Gmail™", "description": "" }, - "options_notifications_19": { - "message": "Windows 邮件提醒", + "tooltip_1": { + "message": "左键单击:打开 Gmail 或邮件预览面板", "description": "" }, - "options_notifications_17": { - "message": "Checker Plus 钟声", + "tooltip_2": { + "message": "中键 (或 Ctrl+左键) 单击:刷新所有帐户", "description": "" }, - "options_notifications_13": { - "message": "在点击任务栏通知图标时打开工具栏面板(仅 Windows,测试版)", + "tooltip_3": { + "message": "右键单击:选择帐户", "description": "" }, - "options_notifications_30": { - "message": "整合所有连续的桌面通知为单条通知", + "description": { + "message": "支持多个标签和帐户的通知工具,适用于 Google Mail (Gmail)", "description": "" }, - "settings_open_label": { - "message": "打开选项", + "log_in_to_your_account": { + "message": "请登录您的 Gmail 帐户", "description": "" }, - "options_timings_l7": { - "message": "不检查新邮件,在刚启动的(秒):", + "msg_1": { + "message": "标签页已经打开。点击工具栏上的按钮在新标签页中打开 Gmail,或者切换到现有的 Gmail 标签页。", "description": "" }, - "label_4": { - "message": "禁用 5 分钟", + "msg_2": { + "message": "链接已复制到剪贴板。", "description": "" }, - "options_timings_l3": { - "message": "提醒有未读邮件,每隔(分钟):", + "msg_3": { + "message": "选定文本已复制到剪贴板。", "description": "" }, - "popup_msg_4": { - "message": "1 小时前", + "msg_4": { + "message": "注意:为了通知能正常工作,您需要先登录到您的 Google 帐户。", "description": "" }, - "options_gmail_1": { - "message": "主帐户 (/mail/u/0/)", + "msg_5": { + "message": "选择一个声音文件", "description": "" }, - "options_gmail_10": { - "message": "接收下列标签和帐户的通知:", + "label_1": { + "message": "刷新", "description": "" }, - "options_notifications_1": { - "message": "为新邮件显示桌面通知", + "label_2": { + "message": "设置", "description": "" }, - "options_notifications_9": { - "message": "为新邮件播放声音提醒", + "label_3": { + "message": "禁用所有通知", + "description": "" + }, + "label_4": { + "message": "禁用 5 分钟", + "description": "" + }, + "label_5": { + "message": "禁用 15 分钟", "description": "" }, "label_6": { "message": "禁用 30 分钟", "description": "" }, - "options_misc_8": { - "message": "重置所有设置到出厂设置", + "label_7": { + "message": "禁用 1 小时", "description": "" }, - "options_notifications_28": { - "message": "指定时间内禁止所有通知 (分钟):", + "label_8": { + "message": "禁用 2 小时", "description": "" }, - "options_timings_l4": { - "message": "设置值为 0 可禁用定期提醒。", + "label_9": { + "message": "禁用 5 小时", "description": "" }, - "options_notifications_32": { - "message": "名称或电子邮件包含", + "label_13": { + "message": "自定义时间长度", "description": "" }, - "options_tab_6": { - "message": "在新窗口打开 Gmail 帐户", + "label_10": { + "message": "启用通知(本次会话期间)", "description": "" }, - "options_notifications_25": { - "message": "在 Safari 下很可能默认的通知声音不能正常播放,如果您使用了一个自定义文件作为通知声音。", + "label_11": { + "message": "撰写邮件", "description": "" }, - "options_toolbar_15": { - "message": "中键单击工具栏按钮", + "label_12": { + "message": "打开常见问题", "description": "" }, - "options_toolbar_10": { - "message": "最小高度为 500px。", + "label_14": { + "message": "已登录帐户", "description": "" }, - "popup_msg_10": { - "message": "1月", + "unknown": { + "message": "未知", "description": "" }, - "options_notifications_26": { - "message": "始终显示托盘通知 (仅 Windows)", + "and": { + "message": "及", "description": "" }, - "label_3": { - "message": "禁用所有通知", + "log_into_your_account": { + "message": "请登录您的帐户", "description": "" }, - "label_13": { - "message": "自定义时间长度", + "notification": { + "message": "来自: [author_email][break]标题: [title][break]摘要: [summary]", "description": "" }, - "options_empty": { - "message": "未定义", + "options_title": { + "message": "选项 - Gmail™ Notifier", "description": "" }, - "options_notifications_3": { - "message": "此选项在您的操作系统上可能无法正常工作。", + "options_inshort": { + "message": "支持多个标签和帐户的通知工具,适用于 Google Mail (Gmail)。", + "description": "" + }, + "options_donation": { + "message": "支持软件开发", "description": "" }, "options_timings": { - "message": "时间", + "message": "时间:", "description": "" }, - "options_gmail_5": { - "message": "第四帐户 (/mail/u/3/)", + "options_timings_l1": { + "message": "检查新邮件,每隔(秒):", "description": "" }, - "label_5": { - "message": "禁用 15 分钟", + "options_timings_l2": { + "message": "最小周期为 10 秒。", "description": "" }, - "options_misc_9": { - "message": "红色表示“无未读邮件”,灰色表示“已断开”", + "options_timings_l3": { + "message": "提醒有未读邮件,每隔(分钟):", "description": "" }, - "popup_msg_5": { - "message": "小时前", + "options_timings_l4": { + "message": "设置值为 0 可禁用定期提醒。", "description": "" }, - "options_notifications_27": { - "message": "托盘通知图标将始终显示,即使没有未读邮件。", + "options_timings_l5": { + "message": "最小周期为 5 分钟。", "description": "" }, - "options_misc_1": { - "message": "按字母排序帐户", + "options_timings_l6": { + "message": "非零的值将反复触发桌面通知和提醒声音(类似有新邮件到达),如果您有未读的邮件。", "description": "" }, - "tooltip_1": { - "message": "左键单击:打开 Gmail 或邮件预览面板", + "options_timings_l7": { + "message": "不检查新邮件,在刚启动的(秒):", "description": "" }, - "notification": { - "message": "来自: [author_email][break]标题: [title][break]摘要: [summary]", + "options_timings_l8": { + "message": "设置值为 0 将禁用邮件检查,除非手动刷新 [Safari 上不可用]。", "description": "" }, - "popup_trash": { - "message": "删除", + "options_gmail": { + "message": "Gmail:", "description": "" }, - "options_tab": { - "message": "打开标签页:", + "options_gmail_1": { + "message": "主帐户 (/mail/u/0/)", "description": "" }, - "log_into_your_account": { - "message": "请登录您的帐户", + "options_gmail_2": { + "message": "用 \",\" (半角逗号) 分隔。", "description": "" }, - "label_10": { - "message": "启用通知功能", + "options_gmail_3": { + "message": "第二帐户 (/mail/u/1/)", "description": "" }, - "options_notifications_23": { - "message": "声音提醒的音量为", + "options_gmail_4": { + "message": "第三帐户 (/mail/u/2/)", "description": "" }, - "options_timings_l2": { - "message": "最小周期为 10 秒。", + "options_gmail_5": { + "message": "第四帐户 (/mail/u/3/)", "description": "" }, - "options_toolbar_11": { - "message": "工具栏面板上支持键盘快捷键", + "options_gmail_6": { + "message": "第五帐户 (/mail/u/4/)", "description": "" }, - "options_gmail_9": { - "message": "部分常用标签: \"inbox\", \"important\", \"^smartlabel_personal\", \"^smartlabel_newsletter\", \"^smartlabel_notification\", \"^smartlabel_group\"", + "options_gmail_7": { + "message": "第六帐户 (/mail/u/5/)", "description": "" }, - "popup_msg_17": { - "message": "8月", + "options_gmail_8": { + "message": "归档时标记邮件为已读", "description": "" }, - "popup_msg_15": { - "message": "6月", + "options_gmail_15": { + "message": "常用的标签:", "description": "" }, - "options_notifications_34": { - "message": "邮件摘要包含", + "options_gmail_10": { + "message": "接收下列标签和帐户的通知:", "description": "" }, - "label_14": { - "message": "已登录帐户", + "options_gmail_11": { + "message": "自定义收取点:", "description": "" }, - "options_misc_13": { - "message": "默认情况下,本扩展的工具栏按钮的工具提示带有登录信息。取消此选项时,工具提示文本将恢复默认值。", + "options_gmail_12": { + "message": "用 \",\" (半角逗号) 分隔收取点。收取点样例: https://mail.google.com/mail/u/0/feed/atom/inbox", "description": "" }, - "options_misc_6": { - "message": "Show desktop notification to warn that Gmail is already opened in the active tab", + "options_gmail_13": { + "message": "注意:除收件箱(inbox)外,所有标签的最大数量为 20(Google 提供的收取点仅提供最新的 20 项)", "description": "" }, - "popup_read": { - "message": "标为已读", + "options_gmail_14": { + "message": "注意:要使 Notifier 监测超过5个帐户,请将收取点网址添加到“自定义收取点”栏。形式例如: https://mail.google.com/mail/u/6/feed/atom/inbox, https://mail.google.com/mail/u/7/feed/atom/inbox", + "description": "" + }, + "options_notifications": { + "message": "通知:", + "description": "" + }, + "options_notifications_1": { + "message": "为新邮件显示桌面通知", + "description": "" + }, + "options_notifications_2": { + "message": "显示桌面通知(秒):", + "description": "" + }, + "options_notifications_3": { + "message": "此选项在您的操作系统上可能无法正常工作。", "description": "" }, "options_notifications_4": { "message": "通知格式", "description": "" }, - "settings_open_title": { - "message": "打开选项(设置)页面", + "options_notifications_5": { + "message": "可用变量:", "description": "" }, - "label_2": { - "message": "设置", + "options_notifications_6": { + "message": "截断通知中超过", "description": "" }, - "options_toolbar_14": { - "message": "如果您偏好在完整内容模式下只呈现文本形式,取消此框。", + "options_notifications_7": { + "message": "字符的标题和摘要。", "description": "" }, - "options_notifications_18": { - "message": "Checker Plus 铃声", + "options_notifications_8": { + "message": "要想没有截断和省略号,在这里使用较大的数值。", "description": "" }, - "options_tab_5": { - "message": "在后台标签页打开 Gmail 帐户", + "options_notifications_9": { + "message": "为新邮件播放声音提醒", "description": "" }, - "label_7": { - "message": "禁用 1 小时", + "options_notifications_10": { + "message": "Mac 用户请注意:从 Firefox 28.0 开始,所有桌面通知都经由 Mac 通知中心处理,包括触发一个额外的声音提醒。您需要取消这里的声音或者“通知中心”中的声音。", "description": "" }, - "popup_archive": { - "message": "归档", + "options_notifications_11": { + "message": "显示“Windows 任务栏通知”或者“Mac OS Dock 通知”", "description": "" }, - "msg_2": { - "message": "链接已复制到剪贴板。", + "options_notifications_12": { + "message": "任务栏通知目前不支持 Linux 操作系统。", "description": "" }, - "options_title": { - "message": "选项 - Gmail™ Notifier", + "options_notifications_13": { + "message": "在点击任务栏通知图标时打开工具栏面板(仅 Windows,测试版)", "description": "" }, - "popup_msg_13": { - "message": "4月", + "options_notifications_14": { + "message": "此功能是实验性的,并可能导致您的 Firefox 浏览器不稳定 [需要重启]。", "description": "" }, - "popup_msg_9_format": { - "message": "%d 个月前", + "options_notifications_15": { + "message": "默认声音是", "description": "" }, - "popup_msg_11": { - "message": "2月", + "options_notifications_16": { + "message": "Gmail Notifier 默认声音", "description": "" }, - "popup_open_inbox": { - "message": "打开收件箱", + "options_notifications_17": { + "message": "Checker Plus 钟声", "description": "" }, - "options_tab_9": { - "message": "When unchecked, Gmail Notifier checks either active window or all open windows for open instance of Gmail and switch to the tab when tab opening is requested.", + "options_notifications_18": { + "message": "Checker Plus 铃声", "description": "" }, - "gmail": { - "message": "Gmail™ Notifier", + "options_notifications_19": { + "message": "Windows 邮件提醒", "description": "" }, - "popup_msg_6": { - "message": "昨天", + "options_notifications_20": { + "message": "用户定义声音", "description": "" }, - "options_toolbar_8": { - "message": "最小宽度为 500px。", + "options_notifications_21": { + "message": "用户定义声音为", "description": "" }, - "options_notifications_16": { - "message": "Gmail Notifier 默认声音", + "options_notifications_22": { + "message": "如果您的浏览器不能播放自定义的声音,请尝试用在线转换工具将它转换为纯 WAV 格式。", "description": "" }, - "options_misc_14": { - "message": "未读邮件超过 999 封时,不在徽章上显示确切数字", + "options_notifications_35": { + "message": "要选择一个新的自定义声音,选择一个内置声音,然后再更改此选项为自定义声音", "description": "" }, - "popup_msg_18": { - "message": "9月", + "options_notifications_23": { + "message": "声音提醒的音量为", "description": "" }, - "options_notifications_14": { - "message": "此功能是实验性的,并可能导致您的 Firefox 浏览器不稳定 [需要重启]。", + "options_notifications_24": { + "message": "音量是 0 至 100 之间的一个数字,100 是最高音量(默认值)。", "description": "" }, - "options_gmail_3": { - "message": "第二帐户 (/mail/u/1/)", + "options_notifications_25": { + "message": "在 Safari 下很可能默认的通知声音不能正常播放,如果您使用了一个自定义文件作为通知声音。", "description": "" }, - "options_notifications_11": { - "message": "显示“Windows 任务栏通知”或者“Mac OS Dock 通知”", + "options_notifications_26": { + "message": "始终显示托盘通知 (仅 Windows)", "description": "" }, - "options_notifications_2": { - "message": "显示桌面通知(秒):", + "options_notifications_27": { + "message": "托盘通知图标将始终显示,即使没有未读邮件。", "description": "" }, - "log_in_to_your_account": { - "message": "请登录您的 Gmail 帐户", + "options_notifications_28": { + "message": "指定时间内禁止所有通知 (分钟):", "description": "" }, - "popup_of": { - "message": "/", + "options_notifications_29": { + "message": "此选项有关工具栏按钮的右键菜单 -> 禁止所有通知 -> 自定义时间长度。", "description": "" }, - "options_notifications_15": { - "message": "默认声音是", + "options_notifications_30": { + "message": "整合所有连续的桌面通知为单条通知", "description": "" }, - "options_notifications_21": { - "message": "用户定义声音为", + "options_notifications_31": { + "message": "自定义声音通知", "description": "" }, - "options_toolbar_9": { - "message": "完整内容模式下的工具栏面板高度为(像素):", + "options_notifications_32": { + "message": "名称或电子邮件包含", "description": "" }, - "options_toolbar_1": { - "message": "工具栏按钮行为", + "options_notifications_33": { + "message": "邮件标题包含", "description": "" }, - "unknown": { - "message": "未知", + "options_notifications_34": { + "message": "邮件摘要包含", "description": "" }, - "popup_msg_21": { - "message": "12月", + "options_notifications_36": { + "message": "要求 Gmail 避免重定向到 'inbox.google.com'", "description": "" }, - "popup_read_all": { - "message": "全部标为已读", + "options_notifications_37": { + "message": "显示徽标数字", "description": "" }, - "options_notifications_8": { - "message": "要想没有截断和省略号,在这里使用较大的数值。", + "options_notifications_38": { + "message": "快捷动作(标为已读、删除等)(看到标题后可能执行的操作)", "description": "" }, - "options_donation": { - "message": "捐款", + "options_notifications_40": { + "message": "允许从通知框执行快速操作(最多两项操作)(仅支持 Chrome)", "description": "" }, - "msg_3": { - "message": "选定文本已复制到剪贴板。", + "options_notifications_41": { + "message": "标为已读", "description": "" }, - "options_misc_7": { - "message": "升级后显示欢迎页面", + "options_notifications_42": { + "message": "归档", "description": "" }, - "options_gmail": { - "message": "Gmail:", + "options_notifications_43": { + "message": "移入垃圾箱", "description": "" }, - "label_1": { - "message": "刷新", + "options_tab": { + "message": "打开标签页:", "description": "" }, - "options_notifications_5": { - "message": "可用变量:", + "options_tab_1": { + "message": "只在活动窗口中搜索已打开的 Gmail 帐户", "description": "" }, - "options_notifications_24": { - "message": "音量是 0 至 100 之间的一个数字,100 是最高音量(默认值)。", + "options_tab_2": { + "message": "不搜索其他浏览器窗口有无打开的 Gmail 帐户。如果活动窗口中没有已打开的 Gmail,打开一个新标签页。", "description": "" }, - "options_notifications_10": { - "message": "Mac 用户请注意:从 Firefox 28.0 开始,所有桌面通知都经由 Mac 通知中心处理,包括触发一个额外的声音提醒。您需要取消这里的声音或者“通知中心”中的声音。", + "options_tab_3": { + "message": "在当前标签页后面打开新的 Gmail 帐户", "description": "" }, - "options_misc_2": { - "message": "默认顺序是登录顺序。", + "options_tab_4": { + "message": "在当前标签页打开 Gmail 帐户", "description": "" }, - "options_toolbar_2": { - "message": "总是打开邮件预览面板", + "options_tab_5": { + "message": "在后台标签页打开 Gmail 帐户", "description": "" }, - "popup_settings": { - "message": "设置", + "options_tab_6": { + "message": "在新窗口打开 Gmail 帐户", "description": "" }, - "options_gmail_4": { - "message": "第三帐户 (/mail/u/2/)", + "options_tab_7": { + "message": "始终使用空白标签页而不是打开一个新标签页", "description": "" }, - "options_toolbar_5": { - "message": "只显示摘要", + "options_tab_8": { + "message": "忽略已打开的 Gmail 标签页", "description": "" }, - "options_notifications_12": { - "message": "任务栏通知目前不支持 Linux 操作系统。", + "options_tab_9": { + "message": "在未选中时,Gmail Notifier 会检查是否已有活动窗口包含已打开的 Gmail,并在必要时切换到已打开的标签页。", "description": "" }, - "options_notifications_35": { - "message": "要选择一个新的自定义声音,选择一个内置声音,然后再更改此选项为自定义声音", + "options_tab_10": { + "message": "用基本 HTML 模式打开邮件", "description": "" }, - "msg_1": { - "message": "标签页已经打开。点击工具栏上的按钮在新标签页中打开 Gmail,或者切换到现有的 Gmail 标签页。", + "options_tab_11": { + "message": "直接打开最新的未读邮件,代替收件箱文件夹", "description": "" }, - "popup_refresh": { - "message": "刷新", + "options_toolbar": { + "message": "工具栏:", + "description": "" + }, + "options_toolbar_1": { + "message": "工具栏按钮行为", + "description": "" + }, + "options_toolbar_2": { + "message": "总是打开邮件预览面板", + "description": "" + }, + "options_toolbar_3": { + "message": "打开 Gmail 帐户,如果只登录了一个帐户", + "description": "" + }, + "options_toolbar_18": { + "message": "强制打开 Gmail 账户", + "description": "" + }, + "options_toolbar_4": { + "message": "工具栏面板模式", + "description": "" + }, + "options_toolbar_5": { + "message": "只显示摘要", + "description": "" + }, + "options_toolbar_6": { + "message": "显示完整内容", + "description": "" + }, + "options_toolbar_7": { + "message": "完整内容模式下的工具栏面板宽度为(像素):", "description": "" }, - "options_misc_5": { - "message": "蓝色表示“无未读邮件”,灰色表示“已断开”", + "options_toolbar_8": { + "message": "最小宽度为 500px。", "description": "" }, - "options_timings_l8": { - "message": "设置值为 0 将禁用邮件检查,除非手动刷新 [Safari 上不可用]。", + "options_toolbar_9": { + "message": "完整内容模式下的工具栏面板高度为(像素):", "description": "" }, - "popup_msg_19": { - "message": "10月", + "options_toolbar_10": { + "message": "最小高度为 500px。", "description": "" }, - "options_notifications_33": { - "message": "邮件标题包含", + "options_toolbar_11": { + "message": "工具栏面板上支持键盘快捷键", "description": "" }, - "tooltip_3": { - "message": "右键单击:选择帐户", + "options_toolbar_12": { + "message": "!: 报告为垃圾邮件, #: 删除, e: 归档, Shift + i: 标记为已读。", "description": "" }, - "popup_date_format": { - "message": "%yy-%mm-%dd", + "options_toolbar_13": { + "message": "在完整内容模式下,呈现邮件为 HTML 形式", "description": "" }, - "options_notifications": { - "message": "通知:", + "options_toolbar_14": { + "message": "如果您偏好在完整内容模式下只呈现文本形式,取消此框。", "description": "" }, - "options_timings_l6": { - "message": "非零的值将反复触发桌面通知和提醒声音(类似有新邮件到达),如果您有未读的邮件。", + "options_toolbar_15": { + "message": "中键单击工具栏按钮", "description": "" }, - "popup_msg_12": { - "message": "3月", + "options_toolbar_16": { + "message": "刷新所有帐户", "description": "" }, - "options_notifications_22": { - "message": "如果您的浏览器不能播放自定义的声音,请尝试用在线转换工具将它转换为纯 WAV 格式。", + "options_toolbar_17": { + "message": "打开主要的 Gmail 帐户", "description": "" }, - "options_tab_1": { - "message": "只在活动窗口中搜索已打开的 Gmail 帐户", + "options_misc": { + "message": "杂项:", "description": "" }, - "popup_msg_7_format": { - "message": "%d 天前", + "options_misc_1": { + "message": "按字母排序帐户", "description": "" }, - "options_timings_l1": { - "message": "检查新邮件,每隔(秒):", + "options_misc_2": { + "message": "默认顺序是登录顺序。", "description": "" }, - "options_toolbar_4": { - "message": "工具栏面板模式", + "options_misc_3": { + "message": "工具栏颜色模式", "description": "" }, - "toolbar_label": { - "message": "Gmail™ Notifier", + "options_misc_4": { + "message": "灰色表示“无未读邮件”,蓝色表示“已断开”", "description": "" }, - "popup_msg_1": { - "message": "刚刚", + "options_misc_5": { + "message": "蓝色表示“无未读邮件”,灰色表示“已断开”", "description": "" }, - "popup_open_settings": { - "message": "打开设置", + "options_misc_9": { + "message": "红色表示“无未读邮件”,灰色表示“已断开”", "description": "" }, - "options_misc_3": { - "message": "工具栏颜色模式", + "options_misc_6": { + "message": "显示桌面通知以警告 Gmail 已在活动标签页打开", "description": "" }, - "options_gmail_12": { - "message": "用 \",\" (半角逗号) 分隔收取点。收取点样例: https://mail.google.com/mail/u/0/feed/atom/inbox", + "options_misc_7": { + "message": "升级后显示欢迎页面", "description": "" }, - "options_toolbar_12": { - "message": "!: 报告为垃圾邮件, #: 删除, e: 归档, Shift + i: 标记为已读。", + "options_misc_8": { + "message": "重置所有设置到出厂设置", "description": "" }, - "options_px": { - "message": "像素", + "options_misc_10": { + "message": "仅在邮件抵达未超过x分钟时发出桌面和声音通知:", "description": "" }, "options_misc_11": { "message": "如果将此选项设置为 0,您将不再收到桌面和声音通知,但仍可收到网址栏徽章通知。", "description": "" }, - "options_notifications_20": { - "message": "用户定义声音", + "options_misc_12": { + "message": "不在工具提示中包含登录信息", "description": "" }, - "and": { - "message": "及", + "options_misc_13": { + "message": "默认情况下,本扩展的工具栏按钮的工具提示带有登录信息。取消此选项时,工具提示文本将恢复默认值。", "description": "" }, - "options_tab_7": { - "message": "始终使用空白标签页而不是打开一个新标签页", + "options_misc_14": { + "message": "未读邮件超过 999 封时,不在徽章上显示确切数字", "description": "" }, - "options_toolbar_3": { - "message": "打开 Gmail 帐户,如果只登录了一个帐户", + "options_misc_15": { + "message": "更新时打开常见问题页面", "description": "" }, - "options_gmail_7": { - "message": "第六帐户 (/mail/u/5/)", + "options_plugins": { + "message": "插件:", "description": "" }, - "popup_msg_8_format": { - "message": "%d 周前", + "options_plugins_1": { + "message": "Gmail 标签及星标按钮(实验性)", "description": "" }, - "options_toolbar": { - "message": "工具栏:", + "options_plugins_2": { + "message": "此插件在弹出窗口中显示星标按钮和主题的标签(仅限扩展模式)。", "description": "" }, - "options_notifications_6": { - "message": "截断通知中超过", + "options_px": { + "message": "像素", "description": "" }, - "popup_wait": { - "message": "等待...", + "options_empty": { + "message": "未定义", "description": "" }, - "tooltip_2": { - "message": "中键 (或 Ctrl+左键) 单击:刷新所有帐户", + "options_button_test": { + "message": "播放", "description": "" }, - "options_notifications_29": { - "message": "此选项有关工具栏按钮的右键菜单 -> 禁止所有通知 -> 自定义时间长度。", + "options_button_reset": { + "message": "重置首选项", "description": "" }, - "options_tab_3": { - "message": "在当前标签页后面打开新的 Gmail 帐户", + "popup_settings": { + "message": "设置", "description": "" }, - "options_gmail_8": { - "message": "归档时标记邮件为已读", + "popup_of": { + "message": "/", "description": "" }, - "options_toolbar_17": { - "message": "打开主要的 Gmail 帐户", + "popup_wait": { + "message": "等待...", "description": "" }, - "options_notifications_7": { - "message": "字符的标题和摘要。", + "popup_date_format": { + "message": "%yy-%mm-%dd", "description": "" }, - "options_misc_10": { - "message": "仅在邮件抵达未超过x分钟时发出桌面和声音通知:", + "popup_no_subject": { + "message": "(无主题)", "description": "" }, - "options_tab_8": { - "message": "Ignore opened Gmail tabs", + "popup_open_settings": { + "message": "打开设置", "description": "" }, - "popup_no_subject": { - "message": "(无主题)", + "popup_open_inbox": { + "message": "打开收件箱", "description": "" }, - "msg_5": { - "message": "选择一个声音文件", + "popup_archive": { + "message": "归档", "description": "" }, - "popup_msg_2": { - "message": "1 分钟前", + "popup_spam": { + "message": "垃圾", "description": "" }, - "popup_msg_16": { - "message": "7月", + "popup_trash": { + "message": "删除", "description": "" }, - "label_8": { - "message": "禁用 2 小时", + "popup_refresh": { + "message": "刷新", "description": "" }, - "msg_4": { - "message": "注意:为了通知能正常工作,您需要先登录到您的 Google 帐户。", + "popup_read": { + "message": "标为已读", "description": "" }, - "popup_msg_20": { - "message": "11月", + "popup_read_all": { + "message": "全部标为已读", "description": "" }, - "options_toolbar_6": { - "message": "显示完整内容", + "popup_msg_1": { + "message": "刚刚", "description": "" }, - "options_gmail_11": { - "message": "自定义收取点:", + "popup_msg_2": { + "message": "1 分钟前", "description": "" }, - "options_tab_2": { - "message": "不搜索其他浏览器窗口有无打开的 Gmail 帐户。如果活动窗口中没有已打开的 Gmail,打开一个新标签页。", + "popup_msg_3_format": { + "message": "%d 分钟前", "description": "" }, - "label_11": { - "message": "撰写邮件", + "popup_msg_4": { + "message": "1 小时前", "description": "" }, - "options_toolbar_7": { - "message": "完整内容模式下的工具栏面板宽度为(像素):", + "popup_msg_5": { + "message": "小时前", "description": "" }, - "options_notifications_31": { - "message": "自定义声音通知", + "popup_msg_6": { + "message": "昨天", "description": "" }, - "options_timings_l5": { - "message": "最小周期为 5 分钟。", + "popup_msg_7_format": { + "message": "%d 天前", "description": "" }, - "options_misc": { - "message": "杂项:", + "popup_msg_8_format": { + "message": "%d 周前", "description": "" }, - "options_gmail_2": { - "message": "用 \",\" (半角逗号) 分隔。", + "popup_msg_9_format": { + "message": "%d 个月前", "description": "" }, - "options_misc_4": { - "message": "灰色表示“无未读邮件”,蓝色表示“已断开”", + "popup_msg_10": { + "message": "1月", "description": "" }, - "options_toolbar_13": { - "message": "在完整内容模式下,呈现邮件为 HTML 形式", + "popup_msg_11": { + "message": "2月", "description": "" }, - "options_toolbar_16": { - "message": "刷新所有帐户", + "popup_msg_12": { + "message": "3月", "description": "" }, - "options_gmail_6": { - "message": "第五帐户 (/mail/u/4/)", + "popup_msg_13": { + "message": "4月", "description": "" }, "popup_msg_14": { "message": "5月", "description": "" }, - "options_inshort": { - "message": "支持多个标签和帐户的通知工具,适用于 Google Mail (Gmail)。", + "popup_msg_15": { + "message": "6月", "description": "" }, - "options_misc_12": { - "message": "不在工具提示中包含登录信息", + "popup_msg_16": { + "message": "7月", "description": "" }, - "options_tab_4": { - "message": "在当前标签页打开 Gmail 帐户", + "popup_msg_17": { + "message": "8月", "description": "" }, - "popup_msg_3_format": { - "message": "%d 分钟前", + "popup_msg_18": { + "message": "9月", "description": "" }, - "label_12": { - "message": "打开常见问题", + "popup_msg_19": { + "message": "10月", "description": "" }, - "description": { - "message": "支持多个标签和帐户的通知工具,适用于 Google Mail (Gmail)", + "popup_msg_20": { + "message": "11月", "description": "" }, - "popup_spam": { - "message": "垃圾", + "popup_msg_21": { + "message": "12月", + "description": "" + }, + "settings_open_title": { + "message": "打开选项(设置)页面", + "description": "" + }, + "settings_open_label": { + "message": "打开选项", + "description": "" + }, + "gmail": { + "message": "Notifier for Gmail™", "description": "" } } \ No newline at end of file diff --git a/WebExtension/config.js b/v2/config.js similarity index 76% rename from WebExtension/config.js rename to v2/config.js index 41c932dd..8d4873d6 100644 --- a/WebExtension/config.js +++ b/v2/config.js @@ -17,8 +17,10 @@ config.map = { checkbox: [ 'notification', 'alert', 'combined', 'searchMode', 'ignoreOpens', 'relatedToCurrent', 'currentTab', 'background', 'useBlankTabs', - 'newWindow', 'keyUp', 'render', 'doReadOnArchive', 'alphabetic', - 'onGmailNotification', 'minimal' + 'newWindow', 'keyUp', 'render', 'doReadOnArchive', 'inboxRedirection', + 'alphabetic', 'onGmailNotification', 'minimal', 'welcome', 'badge', + 'plug-in/labels', 'express', 'basic.html', 'smartOpen', + 'notification.buttons.markasread', 'notification.buttons.archive', 'notification.buttons.trash' ] }; @@ -26,12 +28,12 @@ config.prefs = { 'period': 60, // seconds 'initialPeriod': 3, // seconds 'resetPeriod': 0, // minutes - 'feeds_0': 'inbox', - 'feeds_1': 'inbox', - 'feeds_2': 'inbox', - 'feeds_3': 'inbox', - 'feeds_4': 'inbox', - 'feeds_5': 'inbox', + 'feeds_0': '', + 'feeds_1': '', + 'feeds_2': '', + 'feeds_3': '', + 'feeds_4': '', + 'feeds_5': '', 'feeds_custom': '', 'notification': true, 'notificationTime': 8, // seconds @@ -65,15 +67,27 @@ config.prefs = { 'useBlankTabs': false, 'newWindow': false, 'oldFashion': 0, - 'size':0, + 'size': 0, 'fullWidth': 750, 'fullHeight': 600, 'keyUp': false, 'render': true, 'doReadOnArchive': true, + 'inboxRedirection': true, 'alphabetic': false, 'clrPattern': 0, 'onGmailNotification': true, 'threatAsNew': 10, // minutes - 'minimal': true + 'minimal': true, + 'welcome': true, + 'badge': true, + 'backgroundColor': '#6e6e6e', + 'express': false, + 'notification.buttons.markasread': true, + 'notification.buttons.archive': true, + 'notification.buttons.trash': false, + 'basic.html': false, + 'smartOpen': true, + // plug-ins + 'plug-in/labels': true }; diff --git a/WebExtension/data/icons/blue/16.png b/v2/data/icons/blue/16.png similarity index 100% rename from WebExtension/data/icons/blue/16.png rename to v2/data/icons/blue/16.png diff --git a/v2/data/icons/blue/18.png b/v2/data/icons/blue/18.png new file mode 100644 index 00000000..1e4e01b1 Binary files /dev/null and b/v2/data/icons/blue/18.png differ diff --git a/WebExtension/data/icons/blue/19.png b/v2/data/icons/blue/19.png similarity index 100% rename from WebExtension/data/icons/blue/19.png rename to v2/data/icons/blue/19.png diff --git a/WebExtension/data/icons/blue/32.png b/v2/data/icons/blue/32.png similarity index 100% rename from WebExtension/data/icons/blue/32.png rename to v2/data/icons/blue/32.png diff --git a/WebExtension/data/icons/browsers/chrome.png b/v2/data/icons/browsers/chrome.png similarity index 100% rename from WebExtension/data/icons/browsers/chrome.png rename to v2/data/icons/browsers/chrome.png diff --git a/WebExtension/data/icons/browsers/firefox.png b/v2/data/icons/browsers/firefox.png similarity index 100% rename from WebExtension/data/icons/browsers/firefox.png rename to v2/data/icons/browsers/firefox.png diff --git a/WebExtension/data/icons/browsers/opera.png b/v2/data/icons/browsers/opera.png similarity index 100% rename from WebExtension/data/icons/browsers/opera.png rename to v2/data/icons/browsers/opera.png diff --git a/WebExtension/data/icons/gray/16.png b/v2/data/icons/gray/16.png similarity index 100% rename from WebExtension/data/icons/gray/16.png rename to v2/data/icons/gray/16.png diff --git a/v2/data/icons/gray/18.png b/v2/data/icons/gray/18.png new file mode 100644 index 00000000..2f2b93b3 Binary files /dev/null and b/v2/data/icons/gray/18.png differ diff --git a/v2/data/icons/gray/19.png b/v2/data/icons/gray/19.png new file mode 100644 index 00000000..31c7cbc1 Binary files /dev/null and b/v2/data/icons/gray/19.png differ diff --git a/WebExtension/data/icons/gray/32.png b/v2/data/icons/gray/32.png similarity index 100% rename from WebExtension/data/icons/gray/32.png rename to v2/data/icons/gray/32.png diff --git a/WebExtension/data/icons/load0/16.png b/v2/data/icons/load0/16.png similarity index 100% rename from WebExtension/data/icons/load0/16.png rename to v2/data/icons/load0/16.png diff --git a/v2/data/icons/load0/18.png b/v2/data/icons/load0/18.png new file mode 100644 index 00000000..b67a65be Binary files /dev/null and b/v2/data/icons/load0/18.png differ diff --git a/WebExtension/data/icons/load0/19.png b/v2/data/icons/load0/19.png similarity index 100% rename from WebExtension/data/icons/load0/19.png rename to v2/data/icons/load0/19.png diff --git a/WebExtension/data/icons/load0/32.png b/v2/data/icons/load0/32.png similarity index 100% rename from WebExtension/data/icons/load0/32.png rename to v2/data/icons/load0/32.png diff --git a/WebExtension/data/icons/load1/16.png b/v2/data/icons/load1/16.png similarity index 100% rename from WebExtension/data/icons/load1/16.png rename to v2/data/icons/load1/16.png diff --git a/v2/data/icons/load1/18.png b/v2/data/icons/load1/18.png new file mode 100644 index 00000000..c08152ce Binary files /dev/null and b/v2/data/icons/load1/18.png differ diff --git a/WebExtension/data/icons/load1/19.png b/v2/data/icons/load1/19.png similarity index 100% rename from WebExtension/data/icons/load1/19.png rename to v2/data/icons/load1/19.png diff --git a/WebExtension/data/icons/load1/32.png b/v2/data/icons/load1/32.png similarity index 100% rename from WebExtension/data/icons/load1/32.png rename to v2/data/icons/load1/32.png diff --git a/WebExtension/data/icons/load2/16.png b/v2/data/icons/load2/16.png similarity index 100% rename from WebExtension/data/icons/load2/16.png rename to v2/data/icons/load2/16.png diff --git a/v2/data/icons/load2/18.png b/v2/data/icons/load2/18.png new file mode 100644 index 00000000..be997add Binary files /dev/null and b/v2/data/icons/load2/18.png differ diff --git a/WebExtension/data/icons/load2/19.png b/v2/data/icons/load2/19.png similarity index 100% rename from WebExtension/data/icons/load2/19.png rename to v2/data/icons/load2/19.png diff --git a/WebExtension/data/icons/load2/32.png b/v2/data/icons/load2/32.png similarity index 100% rename from WebExtension/data/icons/load2/32.png rename to v2/data/icons/load2/32.png diff --git a/WebExtension/data/icons/load3/16.png b/v2/data/icons/load3/16.png similarity index 100% rename from WebExtension/data/icons/load3/16.png rename to v2/data/icons/load3/16.png diff --git a/v2/data/icons/load3/18.png b/v2/data/icons/load3/18.png new file mode 100644 index 00000000..40f7c05d Binary files /dev/null and b/v2/data/icons/load3/18.png differ diff --git a/WebExtension/data/icons/load3/19.png b/v2/data/icons/load3/19.png similarity index 100% rename from WebExtension/data/icons/load3/19.png rename to v2/data/icons/load3/19.png diff --git a/WebExtension/data/icons/load3/32.png b/v2/data/icons/load3/32.png similarity index 100% rename from WebExtension/data/icons/load3/32.png rename to v2/data/icons/load3/32.png diff --git a/WebExtension/data/icons/new/16.png b/v2/data/icons/new/16.png similarity index 100% rename from WebExtension/data/icons/new/16.png rename to v2/data/icons/new/16.png diff --git a/v2/data/icons/new/18.png b/v2/data/icons/new/18.png new file mode 100644 index 00000000..39166e6f Binary files /dev/null and b/v2/data/icons/new/18.png differ diff --git a/v2/data/icons/new/19.png b/v2/data/icons/new/19.png new file mode 100644 index 00000000..081f6c5b Binary files /dev/null and b/v2/data/icons/new/19.png differ diff --git a/WebExtension/data/icons/new/32.png b/v2/data/icons/new/32.png similarity index 100% rename from WebExtension/data/icons/new/32.png rename to v2/data/icons/new/32.png diff --git a/WebExtension/data/icons/notification/16.png b/v2/data/icons/notification/16.png similarity index 100% rename from WebExtension/data/icons/notification/16.png rename to v2/data/icons/notification/16.png diff --git a/WebExtension/data/icons/notification/32.png b/v2/data/icons/notification/32.png similarity index 100% rename from WebExtension/data/icons/notification/32.png rename to v2/data/icons/notification/32.png diff --git a/WebExtension/data/icons/notification/48.png b/v2/data/icons/notification/48.png similarity index 100% rename from WebExtension/data/icons/notification/48.png rename to v2/data/icons/notification/48.png diff --git a/WebExtension/data/icons/notification/64.png b/v2/data/icons/notification/64.png similarity index 100% rename from WebExtension/data/icons/notification/64.png rename to v2/data/icons/notification/64.png diff --git a/v2/data/icons/options/32.png b/v2/data/icons/options/32.png new file mode 100644 index 00000000..090a82c3 Binary files /dev/null and b/v2/data/icons/options/32.png differ diff --git a/WebExtension/data/icons/options/64.png b/v2/data/icons/options/64.png similarity index 100% rename from WebExtension/data/icons/options/64.png rename to v2/data/icons/options/64.png diff --git a/WebExtension/data/icons/red/128.png b/v2/data/icons/red/128.png similarity index 100% rename from WebExtension/data/icons/red/128.png rename to v2/data/icons/red/128.png diff --git a/WebExtension/data/icons/red/16.png b/v2/data/icons/red/16.png similarity index 100% rename from WebExtension/data/icons/red/16.png rename to v2/data/icons/red/16.png diff --git a/v2/data/icons/red/18.png b/v2/data/icons/red/18.png new file mode 100644 index 00000000..0f2963df Binary files /dev/null and b/v2/data/icons/red/18.png differ diff --git a/WebExtension/data/icons/red/19.png b/v2/data/icons/red/19.png similarity index 100% rename from WebExtension/data/icons/red/19.png rename to v2/data/icons/red/19.png diff --git a/WebExtension/data/icons/red/32.png b/v2/data/icons/red/32.png similarity index 100% rename from WebExtension/data/icons/red/32.png rename to v2/data/icons/red/32.png diff --git a/WebExtension/data/icons/red/48.png b/v2/data/icons/red/48.png similarity index 100% rename from WebExtension/data/icons/red/48.png rename to v2/data/icons/red/48.png diff --git a/WebExtension/data/icons/red/64.png b/v2/data/icons/red/64.png similarity index 100% rename from WebExtension/data/icons/red/64.png rename to v2/data/icons/red/64.png diff --git a/WebExtension/data/icons/tray/blue.png b/v2/data/icons/tray/blue.png similarity index 100% rename from WebExtension/data/icons/tray/blue.png rename to v2/data/icons/tray/blue.png diff --git a/WebExtension/data/icons/tray/gray.png b/v2/data/icons/tray/gray.png similarity index 100% rename from WebExtension/data/icons/tray/gray.png rename to v2/data/icons/tray/gray.png diff --git a/WebExtension/data/icons/tray/red.png b/v2/data/icons/tray/red.png similarity index 100% rename from WebExtension/data/icons/tray/red.png rename to v2/data/icons/tray/red.png diff --git a/v2/data/images/archive.png b/v2/data/images/archive.png new file mode 100644 index 00000000..9a6f121e Binary files /dev/null and b/v2/data/images/archive.png differ diff --git a/v2/data/images/read.png b/v2/data/images/read.png new file mode 100644 index 00000000..095bf6de Binary files /dev/null and b/v2/data/images/read.png differ diff --git a/v2/data/images/trash.png b/v2/data/images/trash.png new file mode 100644 index 00000000..754dc3d8 Binary files /dev/null and b/v2/data/images/trash.png differ diff --git a/WebExtension/data/locale.js b/v2/data/locale.js similarity index 100% rename from WebExtension/data/locale.js rename to v2/data/locale.js diff --git a/WebExtension/data/options/index.css b/v2/data/options/index.css similarity index 95% rename from WebExtension/data/options/index.css rename to v2/data/options/index.css index 8cf82b5b..b7976dec 100644 --- a/WebExtension/data/options/index.css +++ b/v2/data/options/index.css @@ -151,6 +151,7 @@ label { } #header [type=title] { font-size: 150%; + margin-bottom: 5px; } #header [type=description] { font-size: 85%; @@ -161,7 +162,7 @@ label { margin: 0; padding: 10px; } -#header button { +#donation input[type=button] { background-color: #F07600; color: #FFF; border: 1px solid transparent; @@ -174,6 +175,7 @@ label { outline: medium none; text-align: center; vertical-align: middle !important; + -webkit-appearance: none; } input:invalid { @@ -202,3 +204,9 @@ input:invalid { margin-left: 5px; width: 80px; } + +#donation { + text-decoration: none; + color: #fff; + font-weight: bold; +} diff --git a/WebExtension/data/options/index.html b/v2/data/options/index.html similarity index 83% rename from WebExtension/data/options/index.html rename to v2/data/options/index.html index b1ecd7c9..51e730d8 100644 --- a/WebExtension/data/options/index.html +++ b/v2/data/options/index.html @@ -2,8 +2,8 @@ - - + + @@ -14,18 +14,10 @@
-
- - - -
- -
-
+

-

+

+ +

+            inbox, important, all, unread
+            ^sq_ig_i_personal (Inbox Primary), ^sq_ig_i_social (Inbox Social), ^sq_ig_i_promo (Inbox Promotions), ^sq_ig_i_notification (Inbox Updates), ^sq_ig_i_group (Inbox Forums)
+            ^smartlabel_personal, ^smartlabel_newsletter, ^smartlabel_notification, ^smartlabel_group
+          
+

@@ -88,14 +87,21 @@
- +

+

+

+

+

-
+
+
@@ -234,7 +249,16 @@

- + + +

+ +
@@ -286,6 +318,7 @@
@@ -324,6 +357,14 @@ + + +
: - +
+ +
+
+
+ +

+
+
diff --git a/WebExtension/data/options/index.js b/v2/data/options/index.js similarity index 65% rename from WebExtension/data/options/index.js rename to v2/data/options/index.js index 4126791e..5c314264 100644 --- a/WebExtension/data/options/index.js +++ b/v2/data/options/index.js @@ -21,11 +21,16 @@ var notify = (notify => { function restore() { chrome.storage.local.get(config.prefs, prefs => Object.entries(prefs).forEach(([key, value]) => { - if (config.map.checkbox.indexOf(key) === -1) { - document.getElementById(key).value = value; + try { + if (config.map.checkbox.indexOf(key) === -1) { + document.getElementById(key).value = value; + } + else { + document.getElementById(key).checked = value; + } } - else { - document.getElementById(key).checked = value; + catch (e) { + console.error(e); } })); } @@ -69,7 +74,7 @@ document.addEventListener('change', e => { }).filter(s => s).join(', '); } else if (key === 'notificationTruncate') { - if (value % 2) { //odd number + if (value % 2) { // odd number value += 1; target.value = value; } @@ -106,7 +111,6 @@ document.addEventListener('change', e => { } return; } - chrome.storage.local.set({ [key]: value }); @@ -128,3 +132,57 @@ document.getElementById('reset').addEventListener('click', () => { chrome.storage.local.set(config.prefs, () => window.location.reload()); }); }); + +document.getElementById('test-play').addEventListener('click', () => chrome.runtime.sendMessage({ + method: 'test-play' +})); + +// pref changes +chrome.storage.onChanged.addListener(prefs => { + chrome.runtime.getBackgroundPage(b => { + if (prefs.resetPeriod) { + if (prefs.resetPeriod.newValue) { + b.resetTimer.fill(prefs.resetPeriod.newValue * 1000 * 60); + b.resetTimer.reset(); + } + else { + b.resetTimer.stop(); + } + } + if (prefs.oldFashion) { + const numberOfAccounts = b.checkEmails.getCached() + .map(o => o.xml ? o.xml.title : null) + .filter((o, i, a) => o && a.indexOf(o) === i) + .length; + const hasUnread = b.checkEmails.getCached() + .map(o => o.xml ? o.xml.fullcount : 0) + .reduce((p, c) => p + c, 0); + if (numberOfAccounts === 1 && prefs.oldFashion.newValue === 1) { + b.app.popup.detach(); + } + else if (hasUnread) { + b.app.popup.attach(); + } + } + if (prefs.minimal || + prefs.feeds_0 || prefs.feeds_1 || prefs.feeds_2 || prefs.feeds_3 || prefs.feeds_4 || prefs.feeds_5 || + prefs.feeds_custom + ) { + b.repeater.reset(); + } + if (prefs.clrPattern || prefs.badge) { + b.actions.reset(); + } + if (prefs.period) { + b.repeater.fill(prefs.period.newValue * 1000); + } + if (prefs.backgroundColor) { + b.toolbar.color = prefs.backgroundColor.newValue; + } + if (prefs.oldFashion) { + b.actions.reset(); + } + }); +}); + +document.getElementById('donation').href = chrome.runtime.getManifest().homepage_url + '?rd=donate'; diff --git a/WebExtension/data/popup/accessibility.js b/v2/data/popup/accessibility.js similarity index 64% rename from WebExtension/data/popup/accessibility.js rename to v2/data/popup/accessibility.js index b59d4467..a835399f 100644 --- a/WebExtension/data/popup/accessibility.js +++ b/v2/data/popup/accessibility.js @@ -1,20 +1,25 @@ -/* globals qs, isPrivate */ +/* global qs */ 'use strict'; // Link opener for html { - function opener(e) { - e.preventDefault(); - e.stopPropagation(); + const opener = e => { const target = e.target; - const link = (target.closest('a') && target.closest('a').href) || target.src || target.href; + const a = target.closest('a') || target; + let link = a.dataset.href || a.href || a.src || target.src || target.href; + + if (link && link.startsWith('https://www.google.com/url?q=')) { + const args = (new URL(link)).searchParams; + link = args.get('q') || link; + } if (link) { + e.preventDefault(); + e.stopPropagation(); chrome.runtime.sendMessage({ method: 'open', url: { - isPrivate, link, button: e.button, ctrlKey: e.ctrlKey, @@ -22,11 +27,13 @@ altKey: e.altKey, metaKey: e.metaKey } - }, () => window.close()); + }, () => e.button === 0 ? window.close() : null); } - } + }; window.addEventListener('click', opener); - qs('iframe').contentDocument.addEventListener('click', opener); + qs('iframe').addEventListener('load', () => { + qs('iframe').contentDocument.addEventListener('mousedown', opener); + }); } { diff --git a/v2/data/popup/body/index.css b/v2/data/popup/body/index.css new file mode 100644 index 00000000..cd06ce64 --- /dev/null +++ b/v2/data/popup/body/index.css @@ -0,0 +1,29 @@ +body { + margin: 0; +} +table { + color: inherit; +} +body, +td { + font-family: arial, sans-serif; + font-size: 12px; +} +a { + color: #15c; + text-decoration: none; + cursor: pointer; +} +body > hr { + border: none; + border-bottom: solid 4px whitesmoke; +} +body > hr:last-child { + display: none; +} + +.root { + width: 100%; + border-collapse: collapse; + border: none; +} diff --git a/WebExtension/data/popup/body/index.html b/v2/data/popup/body/index.html similarity index 89% rename from WebExtension/data/popup/body/index.html rename to v2/data/popup/body/index.html index 6682a6fd..bb25b04b 100644 --- a/WebExtension/data/popup/body/index.html +++ b/v2/data/popup/body/index.html @@ -3,8 +3,7 @@ + - - - + diff --git a/WebExtension/data/popup/fetch.gif b/v2/data/popup/fetch.gif similarity index 100% rename from WebExtension/data/popup/fetch.gif rename to v2/data/popup/fetch.gif diff --git a/v2/data/popup/gmail.js b/v2/data/popup/gmail.js new file mode 100644 index 00000000..46c93a85 --- /dev/null +++ b/v2/data/popup/gmail.js @@ -0,0 +1,125 @@ +'use strict'; + +var gmail = {}; + +gmail.fetch = url => new Promise((resolve, reject) => { + const req = new XMLHttpRequest(); + req.onload = () => resolve({ + text: () => req.response + }); + req.onerror = () => reject(new Error('action -> fetch Error')); + req.open('GET', url); + req.send(); +}); + +gmail.get = { + base: url => /[^?]*/.exec(url)[0], + id: url => { + const tmp = /message_id=([^&]*)/.exec(url); + if (tmp && tmp.length) { + return tmp[1]; + } + return null; + } +}; + +gmail.staticID = (iks => url => { + if (iks[url]) { + return Promise.resolve(iks[url]); + } + return gmail.fetch(url).then(r => r.text()).then(content => { + const tmp = /var GLOBALS=\[(?:([^,]*),){10}/.exec(content || ''); + const ik = tmp && tmp.length > 1 ? tmp[1].replace(/["']/g, '') : null; + if (ik) { + iks[url] = ik; + return ik; + } + else { + throw Error( + 'body -> getIK -> ' + + 'Error at resolving user\'s static ID. Please switch back to the summary mode.' + ); + } + }); +})({}); + +gmail.body = (contents => (link, mode) => { + link = link.replace('http://', 'https://'); + if (contents[link]) { + return Promise.resolve(contents[link]); + } + + const url = gmail.get.base(link); + const thread = gmail.get.id(link); + + const rand = Math.random().toString(36).substr(2).padStart(13, '0'); + const oLink = url + `/h/${rand}/?th=${thread}&v=pt`; + + if (!thread) { + return Promise.reject(Error('body -> Error at resolving thread. Please switch back to the summary mode.')); + } + return fetch(oLink, { + credentials: 'include' + }).then(r => { + if (r.ok) { + return r.text(); + } + throw Error('cannot use oLink to generate print view'); + }).catch(e => { + console.error(e); + return gmail.staticID(url) + .then(ik => gmail.fetch(url + '?ui=2&ik=' + ik + '&view=pt&dsqt=1&search=all&msg=' + thread).then(r => r.text())); + }).then(content => { + const body = gmail.render[mode ? 'getHTMLText' : 'getPlainText'](content, url, link); + contents[link] = body; + return body; + }); +})({}); + +gmail.render = (() => { + const getLastMessage = content => { + const html = new DOMParser().parseFromString(content, 'text/html'); + const message = html.documentElement.getElementsByClassName('message'); + try { + const f = document.createDocumentFragment(); + for (let n = message.length - 1; n >= 0; n -= 1) { + f.appendChild(message[n].children[0].children[2]); + } + return f; + } + catch (e) {} + return ''; + }; + + return { + getHTMLText: content => { + const body = getLastMessage(content); + if (body) { + const table = document.createElement('table'); + table.classList.add('root'); + table.appendChild(body); + + [...table.querySelectorAll('a')].forEach(a => { + a.dataset.href = a.href; + a.removeAttribute('href'); + }); + return table; + } + else { + return ''; + } + }, + getPlainText: content => { + const body = getLastMessage(content); + if (body) { + const span = document.createElement('span'); + span.style['white-space'] = 'pre-line'; + span.textContent = body.innerText; + return span; + } + else { + return ''; + } + } + }; +})(); diff --git a/WebExtension/data/popup/icons.png b/v2/data/popup/icons.png similarity index 100% rename from WebExtension/data/popup/icons.png rename to v2/data/popup/icons.png diff --git a/v2/data/popup/icons/archive.png b/v2/data/popup/icons/archive.png new file mode 100644 index 00000000..73155126 Binary files /dev/null and b/v2/data/popup/icons/archive.png differ diff --git a/v2/data/popup/icons/arrow_drop_down.png b/v2/data/popup/icons/arrow_drop_down.png new file mode 100644 index 00000000..25122b9b Binary files /dev/null and b/v2/data/popup/icons/arrow_drop_down.png differ diff --git a/v2/data/popup/icons/check.png b/v2/data/popup/icons/check.png new file mode 100644 index 00000000..56b23623 Binary files /dev/null and b/v2/data/popup/icons/check.png differ diff --git a/v2/data/popup/icons/check_all.png b/v2/data/popup/icons/check_all.png new file mode 100644 index 00000000..5c81b114 Binary files /dev/null and b/v2/data/popup/icons/check_all.png differ diff --git a/v2/data/popup/icons/check_box.png b/v2/data/popup/icons/check_box.png new file mode 100644 index 00000000..04f1dc82 Binary files /dev/null and b/v2/data/popup/icons/check_box.png differ diff --git a/v2/data/popup/icons/chevron_left.png b/v2/data/popup/icons/chevron_left.png new file mode 100644 index 00000000..a61961b7 Binary files /dev/null and b/v2/data/popup/icons/chevron_left.png differ diff --git a/v2/data/popup/icons/chevron_right.png b/v2/data/popup/icons/chevron_right.png new file mode 100644 index 00000000..ab326e3b Binary files /dev/null and b/v2/data/popup/icons/chevron_right.png differ diff --git a/v2/data/popup/icons/delete.png b/v2/data/popup/icons/delete.png new file mode 100644 index 00000000..98cdd870 Binary files /dev/null and b/v2/data/popup/icons/delete.png differ diff --git a/v2/data/popup/icons/inbox.png b/v2/data/popup/icons/inbox.png new file mode 100644 index 00000000..20b0d08f Binary files /dev/null and b/v2/data/popup/icons/inbox.png differ diff --git a/v2/data/popup/icons/list.png b/v2/data/popup/icons/list.png new file mode 100644 index 00000000..91651169 Binary files /dev/null and b/v2/data/popup/icons/list.png differ diff --git a/v2/data/popup/icons/refresh.png b/v2/data/popup/icons/refresh.png new file mode 100644 index 00000000..3b54a9d9 Binary files /dev/null and b/v2/data/popup/icons/refresh.png differ diff --git a/v2/data/popup/icons/settings.png b/v2/data/popup/icons/settings.png new file mode 100644 index 00000000..211777df Binary files /dev/null and b/v2/data/popup/icons/settings.png differ diff --git a/v2/data/popup/icons/spam.png b/v2/data/popup/icons/spam.png new file mode 100644 index 00000000..32067f13 Binary files /dev/null and b/v2/data/popup/icons/spam.png differ diff --git a/WebExtension/data/popup/index.css b/v2/data/popup/index.css similarity index 60% rename from WebExtension/data/popup/index.css rename to v2/data/popup/index.css index dc1eb67f..59e43274 100644 --- a/WebExtension/data/popup/index.css +++ b/v2/data/popup/index.css @@ -1,18 +1,16 @@ html,body { margin: 0; background-color: #fff; - color: #222222; + color: #222; } body { display: flex; - display: -webkit-flex; flex-direction: column; - -webkit-flex-direction: column; overflow: hidden; - font: 12.8px arial,sans-serif; - border: 1px solid #DCDCDC; + font: 12.8px arial, sans-serif; + border: 1px solid #dcdcdc; border-radius: 2px; - background-color: #F5F5F5; + background-color: #f5f5f5; margin: 5px; } a, @@ -26,15 +24,11 @@ a:focus { .vcenter { display: flex; - display: -webkit-flex; align-items: center; - -webkit-align-items: center; } .hcenter { display: flex; - display: -webkit-flex; justify-content: center; - -webkit-justify-content: center; } .ellipsis { overflow: hidden; @@ -57,20 +51,21 @@ a:focus { .btn:hover { color: #191919; border-color: #c6c6c6; - opacity: .9; + opacity: 0.9; } .btn:active { - border: 1px solid #4D90FE; + border: 1px solid #4d90fe; } .btn[disabled], .btn[disabled]:hover { border: 1px solid rgba(0, 0, 0, 0.1); cursor: default; - opacity: .4; + opacity: 0.4; } .btn[wait] { background-image: url("wait.gif"); background-position: center center; + background-size: 18px; } header { @@ -80,13 +75,13 @@ header { } header div[name="email-container"] { flex: auto; - -webkit-flex: auto; - background: url(icons.png) 5px 0 no-repeat, url(icons.png) right -22px no-repeat; + background: url('icons/list.png') 5px 1px no-repeat, url('icons/arrow_drop_down.png') right 1px no-repeat; padding: 0 15px 0 28px; opacity: 0.7; cursor: pointer; -moz-user-select: none; user-select: none; + background-size: 20px; } header div[name="email-container"]:hover { opacity: 0.9; @@ -94,12 +89,11 @@ header div[name="email-container"]:hover { header div[name="stat"] { min-width: 50px; text-align: center; - border-left: 1px solid #DCDCDC; + border-left: 1px solid #dcdcdc; padding-left: 5px; } header div[name="nav"] { display: flex; - display: -webkit-flex; min-width: 86px; } header div[name="nav"] div { @@ -107,25 +101,22 @@ header div[name="nav"] div { height: 22px; } header div[name="nav"] div[name="previous"] { - background-image: url(icons.png); - background-position: center -132px; + background-image: url('icons/chevron_left.png'); + background-size: 20px; margin-right: -1px; } header div[name="nav"] div[name="next"] { - background-image: url(icons.png); - background-position: center -154px; + background-image: url('icons/chevron_right.png'); + background-size: 20px; } #content { display: flex; - display: -webkit-flex; flex-direction: column; - -webkit-flex-direction: column; flex: auto; - -webkit-flex: auto; - background-color: #FFF; - border-top: 1px solid #DCDCDC; - border-bottom: 1px solid #DCDCDC; + background-color: #fff; + border-top: 1px solid #dcdcdc; + border-bottom: 1px solid #dcdcdc; padding: 0 5px; } #content[loading] { @@ -133,14 +124,60 @@ header div[name="nav"] div[name="next"] { } #content div[name="title"] { font-size: 150%; - border-bottom: 1px solid #DCDCDC; + border-bottom: 1px solid #dcdcdc; height: 35px; } +#content div[name="title"] #title { + flex: 1; + overflow: hidden; + text-overflow: ellipsis; +} +#content div[name="title"] #star { + width: 16px; + height: 16px; + background-repeat: no-repeat; + background-size: 16px; + background-position: center; + cursor: pointer; +} +body[data-star=hide] #content div[name="title"] #star { + display: none; +} +body[data-star=true] #content div[name="title"] #star { + background-image: url('plug-ins/star.svg'); +} +body[data-star=false] #content div[name="title"] #star { + background-image: url('plug-ins/no-star.svg'); +} +#content div[name=labels] { + padding: 0 5px; +} +#content div[name=labels] .label { + font: 11px arial, sans-serif; + background-color: rgb(221, 221, 221); + color: rgb(102, 102, 102); + margin-right: 5px; + padding-left: 5px; +} +#content div[name=labels] .label [data-cmd="remove-label"] { + padding: 2px 4px; + cursor: pointer; + margin-left: 5px; +} +#content div[name=labels] .label [data-cmd="remove-label"]:hover { + color: rgb(221, 221, 221); + background-color: rgb(102, 102, 102); +} +body[data-labels=false] #content div[name=labels] { + display: none; +} +body[data-labels=true] #content div[name=labels] { + height: 32px; +} + #content div[name="info"] { display: flex; - display: -webkit-flex; flex-direction: row; - -webkit-flex-direction: row; padding-top: 5px; } #content div[name="info"] div[name="sender"] { @@ -150,7 +187,6 @@ header div[name="nav"] div[name="next"] { } #content div[name="info"] div[name="email"] { flex: auto; - -webkit-flex: auto; color: #727272; } #content div[name="info"] div[name="date"] { @@ -159,20 +195,19 @@ header div[name="nav"] div[name="next"] { } #content div[name="body"] { flex: auto; - -webkit-flex: auto; + flex-direction: column; } -#content div[name="body"]>iframe { +#content div[name="body"] > iframe { border-width: 0; width: 100%; height: 50px; padding-top: 8px; } -@media all and (min-height: 300px) { - #content div[name="body"]>iframe { - height: calc(100% - 145px); - width: calc(100% - 24px); - position: absolute; - } + +body[mode="expanded"] #content div[name="body"] > iframe { + height: calc(100% - 145px); + width: calc(100% - 24px); + position: absolute; } footer div { @@ -181,38 +216,33 @@ footer div { height: 22px; margin: 4px 3px; white-space: nowrap; - background-image: url(icons.png); + background-size: 20px; } footer div[name="settings"] { -background-position: center -264px; + background-image: url('icons/settings.png'); } footer div[name="gmail"] { -background-position: center -176px; + background-image: url('icons/inbox.png'); } footer div[name="archive"] { - background-position: center -110px; + background-image: url('icons/archive.png'); } footer div[name="spam"] { - background-position: center -88px; + background-image: url('icons/spam.png'); } footer div[name="trash"] { - background-position: center -44px; + background-image: url('icons/delete.png'); } footer div[name="refresh"] { - background-position: center -66px; + background-image: url('icons/refresh.png'); } footer div[name="read"] { width: 90px; background-image: none; } footer div[name="read-all"] { - background-position: center -242px; -} -@media all and (max-width: 500px) { - footer div[name="read-all"] { - display: none; - } + background-image: url('icons/check_all.png'); } #accounts { @@ -221,7 +251,7 @@ footer div[name="read-all"] { top: 40px; left: 9px; color: #000 !important; /* KDE dark theme issue */ - background-color: #FFF; + background-color: #fff; min-width: 250px; border: 1px solid rgba(0, 0, 0, 0.2); border-radius: 2px; @@ -235,7 +265,7 @@ footer div[name="read-all"] { #accounts li { padding: 4px 8px 4px 28px; display: block; - border-bottom: 1px solid #F5F5F5; + border-bottom: 1px solid #f5f5f5; cursor: pointer; max-width: 500px; } @@ -243,12 +273,11 @@ footer div[name="read-all"] { border-bottom: none; } #accounts li:hover { - background-color: #F5F5F5; + background-color: #f5f5f5; } #accounts li.selected { - background-image: url(icons.png); - background-position: 5px -198px; - background-repeat: no-repeat; + background: url('icons/check.png') center left 2px no-repeat; + background-size: 20px; } #expand { @@ -257,12 +286,11 @@ footer div[name="read-all"] { left: 9px; width: 40px; height: 12px; - background-image: url(icons.png); - background-position: center -225px; + background-image: url('icons/arrow_drop_down.png'); + background-size: 20px; } body[mode="expanded"] #expand { -moz-transform: scaleY(-1); - -webkit-transform: scaleY(-1); transform: scaleY(-1); } /* tooltip */ @@ -270,7 +298,7 @@ body[mode="expanded"] #expand { position: relative; z-index: 99; } -.tooltip:hover:before { +.tooltip:hover::before { position: absolute; left: 38%; bottom: 24px; @@ -280,7 +308,7 @@ body[mode="expanded"] #expand { border-top: 6px solid rgba(0, 0, 0, 0.8); z-index: 99; } -.tooltip:hover:after { +.tooltip:hover::after { position: absolute; bottom: 30px; left: 50%; @@ -288,7 +316,7 @@ body[mode="expanded"] #expand { background-color: rgba(0, 0, 0, 0.8); border-radius: 1px; text-align: center; - color: #FFFFFF; + color: #fff; font-weight: normal; content: attr(title); padding: 5px 10px; diff --git a/WebExtension/data/popup/index.html b/v2/data/popup/index.html similarity index 88% rename from WebExtension/data/popup/index.html rename to v2/data/popup/index.html index e92b17c2..e5bcd5f0 100644 --- a/WebExtension/data/popup/index.html +++ b/v2/data/popup/index.html @@ -6,7 +6,7 @@ - +
Email
- -
@@ -18,7 +18,15 @@
Title +
+
+
Sender diff --git a/WebExtension/data/popup/index.js b/v2/data/popup/index.js similarity index 76% rename from WebExtension/data/popup/index.js rename to v2/data/popup/index.js index f6b11f7c..4a0f62a6 100644 --- a/WebExtension/data/popup/index.js +++ b/v2/data/popup/index.js @@ -4,17 +4,35 @@ var objs; var contentCache = []; var selected = {}; -var isPrivate = false; +var api = { + callbacks: {} +}; +api.on = function(name, callback) { + api.callbacks[name] = api.callbacks[name] || []; + api.callbacks[name].push(callback); +}; +api.emit = function(name, data) { + (api.callbacks[name] || []).forEach(c => c(data)); +}; +chrome.storage.local.get({ + 'plug-in/labels': true +}, prefs => { + if (prefs['plug-in/labels']) { + document.body.appendChild(Object.assign(document.createElement('script'), { + src: 'plug-ins/labels.js' + })); + } +}); -var notify = msg => console.error(msg) && chrome.notifications.create(null, { +const notify = msg => chrome.notifications.create(null, { type: 'basic', iconUrl: '/data/icons/notification/48.png', title: chrome.i18n.getMessage('gmail'), - message: msg.message || msg, + message: msg.message || msg }); -var qs = function(q, m) { - var reserved = { +const qs = function(q, m) { + const reserved = { 'stats': 'header div[name="stat"] b', 'accounts': '#accounts', 'content': '#content', @@ -34,7 +52,7 @@ var qs = function(q, m) { 'read': 'footer div[name="read"]', 'read-all': 'footer div[name="read-all"]', 'email-container': 'header div[name="email-container"]', - 'iframe': '#content iframe', + 'iframe': '#content iframe' }; q = reserved[q] || q; qs.cache = qs.cache || []; @@ -42,7 +60,7 @@ var qs = function(q, m) { return qs.cache[q]; }; -var html = (() => { +const html = (() => { // List of all used elements const li = document.createElement('li'); @@ -55,17 +73,17 @@ var html = (() => { return function(tag, txt) { var tmp; switch (tag) { - case 'li': - tmp = li.cloneNode(false); - break; - default: - tmp = document.createElement(tag); + case 'li': + tmp = li.cloneNode(false); + break; + default: + tmp = document.createElement(tag); } return addContent(tmp, txt); }; })(); /** objects **/ -var accountSelector = (() => { +const accountSelector = (() => { const tmp = qs('email-container'); return { get text() { @@ -74,10 +92,11 @@ var accountSelector = (() => { set text(val) { localStorage.setItem('last-account', val); tmp.textContent = val; - } + }, + gen: xml => xml.title + (xml.label ? ' [' + xml.label + ']' : '') }; })(); -var stat = (() => { +const stat = (() => { const list = qs('stats', true); return { get current() { @@ -94,11 +113,11 @@ var stat = (() => { } }; })(); -var body = (function() { - var date = qs('date'); - var email = qs('email'); - var name = qs('sender'); - var title = qs('title'); +const body = (function() { + const date = qs('date'); + const email = qs('email'); + const name = qs('sender'); + const title = qs('title'); return { get date() { return date.textContent; @@ -133,7 +152,7 @@ var body = (function() { })(); /** Update UI if necessary **/ -var update = (() => { +const update = (() => { const old = { link: null, id: null, @@ -192,8 +211,7 @@ var update = (() => { if (doAccountSelector) { old.link = selected.parent.xml.link; - accountSelector.text = selected.parent.xml.title + - (selected.parent.xml.label ? ' [' + selected.parent.xml.label + ']' : ''); + accountSelector.text = accountSelector.gen(selected.parent.xml); } if (doAccountBody) { old.id = selected.entry.id; @@ -202,13 +220,21 @@ var update = (() => { const messageID = gmail.get.id(selected.entry.link); stat.current = index + 1; body.title = selected.entry.title; - body.titleLink = messageID ? base + '/?shva=1#inbox/' + messageID : selected.entry.link; + if (messageID && selected.parent.xml.link.indexOf('#') === -1) { + body.titleLink = base + '/?shva=1#inbox/' + messageID; + } + else if (messageID) { + body.titleLink = selected.parent.xml.link + '/' + messageID; + } + else { + body.titleLink = selected.entry.link; + } + body.name = selected.entry.author_name; - //body.nameLink = base + "?view=cm&fs=1&tf=1&to=" + selected.entry.author_email; + // body.nameLink = base + "?view=cm&fs=1&tf=1&to=" + selected.entry.author_email; body.nameLink = 'mailto:' + selected.entry.author_email + '?subject=Re: ' + selected.entry.title; body.email = '<' + selected.entry.author_email + '>'; updateContent(); - isPrivate = selected.parent.isPrivate; } if (doNumber) { old.count = selected.parent.xml.fullcount; @@ -230,8 +256,8 @@ var update = (() => { }; })(); -/** Listeners **/ -var Listen = function(query, on, callback, pointer) { +/* Listeners */ +const Listen = function(query, on, callback, pointer) { const elem = qs(query); elem.addEventListener(on, function(e) { if (elem.getAttribute('disabled') === 'true') { @@ -280,17 +306,20 @@ new Listen('accounts', 'click', ({target}) => { new Listen('next', 'click', () => update(false, true)); new Listen('previous', 'click', () => update(true, false)); -var action = (cmd, links = selected.entry.link) => gmail.action(links, cmd).catch(e => e).then(e => { - if (e && e instanceof Error) { // if error - notify(e); - } - if (cmd === 'rd') { - qs('read').textContent = locale.get('popup_read'); - qs('read').removeAttribute('disabled'); - } - else { - let obj; - switch (cmd) { +const action = (cmd, links = selected.entry.link, callback = () => {}) => { + chrome.runtime.sendMessage({ + method: 'gmail.action', + cmd, + links + }, () => { + callback(); + if (cmd === 'rd') { + qs('read').textContent = locale.get('popup_read'); + qs('read').removeAttribute('disabled'); + } + else { + let obj; + switch (cmd) { case 'rd': obj = qs('read'); break; @@ -300,25 +329,28 @@ var action = (cmd, links = selected.entry.link) => gmail.action(links, cmd).catc case 'tr': obj = qs('trash'); break; - case 'rc_%5Ei': + case 'rc_^i': obj = qs('archive'); break; case 'sp': obj = qs('spam'); break; + } + if (obj) { + obj.removeAttribute('wait'); + obj.removeAttribute('disabled'); + } } - obj.removeAttribute('wait'); - obj.removeAttribute('disabled'); - } - chrome.runtime.sendMessage({ - method: 'update' + chrome.runtime.sendMessage({ + method: 'update' + }); }); -}); +}; new Listen('archive', 'click', () => { qs('archive').setAttribute('wait', true); qs('archive').setAttribute('disabled', true); - action('rc_%5Ei'); + action('rc_^i'); }); new Listen('trash', 'click', () => { qs('trash').setAttribute('wait', true); @@ -343,7 +375,9 @@ new Listen('gmail', 'click', () => chrome.runtime.sendMessage({ method: 'open', url: selected.parent.xml.link }, () => window.close())); -new Listen('settings', 'click', () => chrome.runtime.openOptionsPage()); +new Listen('settings', 'click', () => chrome.tabs.update({ + url: '/data/options/index.html' +}, () => window.close())); new Listen('read-all', 'click', () => { qs('read-all').setAttribute('wait', true); qs('read-all').setAttribute('disabled', true); @@ -361,25 +395,40 @@ function updateContent() { } }; + if (selected.entry) { + localStorage.setItem('last-id', selected.entry.id); + } + const mode = qs('body').getAttribute('mode') === 'expanded' ? 1 : 0; if (mode === 1) { const link = selected.entry.link; const content = contentCache[link]; + api.emit('update-full-content', link); if (content) { qs('content').removeAttribute('loading'); - //content is a safe HTML parsed by (lib/utils/render.js) - qs('iframe').contentDocument.body.innerHTML = content; + if (content) { + qs('iframe').contentDocument.querySelector('head base').href = link; + qs('iframe').contentDocument.body.textContent = ''; + qs('iframe').contentDocument.body.appendChild(content); + } } else { doSummary(); qs('content').setAttribute('loading', 'true'); - gmail.body(link, mode).then(content => { + chrome.storage.local.get({ + render: true + }, prefs => gmail.body(link, prefs.render).then(content => { if (link === selected.entry.link) { // For chat conversations, there is no full content mode - contentCache[link] = content === '...' ? selected.entry.summary + ' ...' : content; - updateContent(); + if (content) { + contentCache[link] = content; + updateContent(); + } + else { + qs('content').removeAttribute('loading'); + } } - }).catch(notify); + }).catch(notify)); } } else { @@ -406,15 +455,15 @@ const resize = () => { updateContent(); } const normal = { - width: 500, - height: 240, + width: 550, + height: 240 }; Object.assign(document.body.style, { width: (expanded ? prefs.fullWidth : normal.width) + 'px', height: (expanded ? prefs.fullHeight - 20 : normal.height) + 'px' }); }); - //Close account selection menu if it is open + // Close account selection menu if it is open qs('accounts').style.display = 'none'; }; resize(); @@ -426,28 +475,33 @@ chrome.storage.onChanged.addListener(prefs => { // communication chrome.runtime.onMessage.addListener(request => { - if (request.method === 'update-date') { - //This function is called on every server response. - if (!selected.entry) { - return; + if (request.method === 'validate-current') { + if (selected.parent.xml.fullcount === 20) { + objs = request.data; + update(); } - body.date = utils.prettyDate(selected.entry.modified); } else if (request.method === 'update') { objs = request.data; update(); } + else if (request.method === 'update-date') { + // This function is called on every server response. + if (!selected.entry) { + return; + } + body.date = utils.prettyDate(selected.entry.modified); + } }); // init qs('iframe').addEventListener('load', () => chrome.runtime.getBackgroundPage(b => { objs = b.checkEmails.getCached(); if (objs && objs.length) { - //Selected account + // Selected account const unreadEntries = objs.map(obj => obj.xml.entries .filter(e => obj.newIDs.indexOf(e.id) !== -1)) .reduce((p, c) => p.concat(c), []); - // selecting the correct account if (unreadEntries.length) { const newestEntry = unreadEntries.sort((p, c) => { @@ -461,10 +515,14 @@ qs('iframe').addEventListener('load', () => chrome.runtime.getBackgroundPage(b = if (!selected.entry) { const lastAccount = localStorage.getItem('last-account'); if (lastAccount) { - const account = objs.filter(o => o.xml.title === lastAccount).shift(); + const account = objs.filter(o => accountSelector.gen(o.xml) === lastAccount).shift(); if (account) { + const id = localStorage.getItem('last-id'); selected = { - entry: account.xml.entries[0], + entry: [ + ...account.xml.entries.filter(e => e.id === id), + account.xml.entries[0] + ].shift(), parent: account }; return update(); diff --git a/v2/data/popup/plug-ins/labels.js b/v2/data/popup/plug-ins/labels.js new file mode 100644 index 00000000..6ea2924c --- /dev/null +++ b/v2/data/popup/plug-ins/labels.js @@ -0,0 +1,98 @@ +/* globals api, gmail, action, selected */ +'use strict'; + +{ + let response; + let root; + let query; + let inprogress = ''; + + function star(url) { + const id = gmail.get.id(url); + const o = response.filter(o => o.thread === id).shift(); + if (o) { + document.body.dataset.star = o.labels.some(s => s === 'STARRED'); + } + else { + document.body.dataset.star = 'hide'; + } + } + const hiddens = ['STARRED', 'Inbox', 'INBOX']; + function labels(url) { + const id = gmail.get.id(url); + const o = response.filter(o => o.thread === id).shift(); + if (o) { + const parent = document.getElementById('labels'); + const t = document.getElementById('label-template'); + parent.textContent = ''; + o.labels.map(s => s === '^i' ? 'Inbox' : s).filter(s => s.startsWith('^') === false && hiddens.indexOf(s) === -1).forEach(label => { + const clone = document.importNode(t.content, true); + clone.querySelector('span').textContent = label; + clone.querySelector('div').dataset.value = label; + parent.appendChild(clone); + }); + + document.body.dataset.labels = true; + } + else { + document.body.dataset.labels = false; + } + } + + const update = (q = query, callback = () => {}) => chrome.runtime.sendMessage({ + method: 'gmail.search', + url: selected.parent.xml.rootLink, + query: q + }, r => { + if (!r || r instanceof Error) { + console.error(r); + } + else { + response = r; + query = q; + root = selected.parent.xml.rootLink; + callback(); + } + }); + + function fetch(url = selected.entry.link) { + document.body.dataset.labels = false; + document.body.dataset.star = 'hide'; + + const q = 'in:' + (selected.parent.xml.label || 'inbox') + ' is:unread'; + if (q === query && root === selected.parent.xml.rootLink && response) { + star(url); + labels(url); + } + else { + if (inprogress === q) { + console.warn('update is rejected; duplicated'); + } + else { + inprogress = q; + update(q, () => { + inprogress = ''; + star(url); + labels(url); + }); + } + } + } + + api.on('update-full-content', fetch); + + document.getElementById('star').addEventListener('click', () => { + const cmd = document.body.dataset.star === 'true' ? 'xst' : 'st'; + action(cmd, selected.entry.link, update); + document.body.dataset.star = cmd === 'xst' ? 'false' : 'true'; + }); + document.getElementById('labels').addEventListener('click', ({target}) => { + const cmd = target.dataset.cmd; + if (cmd === 'remove-label') { + const div = target.closest('div'); + const label = div.dataset.value; + action('rc_' + label, selected.entry.link, update); + div.remove(); + } + }); +} diff --git a/v2/data/popup/plug-ins/no-star.svg b/v2/data/popup/plug-ins/no-star.svg new file mode 100644 index 00000000..ef18682b --- /dev/null +++ b/v2/data/popup/plug-ins/no-star.svg @@ -0,0 +1 @@ + diff --git a/v2/data/popup/plug-ins/star.svg b/v2/data/popup/plug-ins/star.svg new file mode 100644 index 00000000..efb16fd1 --- /dev/null +++ b/v2/data/popup/plug-ins/star.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/WebExtension/data/popup/utils.js b/v2/data/popup/utils.js similarity index 100% rename from WebExtension/data/popup/utils.js rename to v2/data/popup/utils.js diff --git a/WebExtension/data/popup/wait.gif b/v2/data/popup/wait.gif similarity index 100% rename from WebExtension/data/popup/wait.gif rename to v2/data/popup/wait.gif diff --git a/WebExtension/data/sounds/0.wav b/v2/data/sounds/0.wav similarity index 100% rename from WebExtension/data/sounds/0.wav rename to v2/data/sounds/0.wav diff --git a/WebExtension/data/sounds/1.wav b/v2/data/sounds/1.wav similarity index 100% rename from WebExtension/data/sounds/1.wav rename to v2/data/sounds/1.wav diff --git a/WebExtension/data/sounds/2.wav b/v2/data/sounds/2.wav similarity index 100% rename from WebExtension/data/sounds/2.wav rename to v2/data/sounds/2.wav diff --git a/WebExtension/data/sounds/3.wav b/v2/data/sounds/3.wav similarity index 100% rename from WebExtension/data/sounds/3.wav rename to v2/data/sounds/3.wav diff --git a/WebExtension/lib/common.js b/v2/lib/common.js similarity index 60% rename from WebExtension/lib/common.js rename to v2/lib/common.js index 71ea8731..47f00e01 100644 --- a/WebExtension/lib/common.js +++ b/v2/lib/common.js @@ -1,4 +1,6 @@ -/* globals app, config, timer, checkEmails, server, contextmenu, toolbar */ +/* eslint-disable */ + +/* global app, config, timer, server, contextmenu, toolbar, gmail */ 'use strict'; var repeater; // main repeater @@ -16,10 +18,39 @@ var actions = { .setTimeout(() => config.notification.silent = false, time * 1000); }, reset: () => repeater.reset(true), - onCommand: link => open(link || config.email.url) + onCommand: link => { + if (link) { + open(link); + } + else if (config.tabs.open.smart) { + try { + const objs = checkEmails.getCached(); + if (objs && objs.length) { + // Selected account + const unreadEntries = [].concat([], ...objs.map(obj => obj.xml.entries)); + // selecting the correct account + if (unreadEntries.length) { + const newestEntry = unreadEntries.sort((p, c) => { + const d1 = new Date(p.modified); + const d2 = new Date(c.modified); + return d1 < d2; + })[0]; + if (newestEntry) { + return open(newestEntry.link); + } + } + return open(objs[0].xml.entries[0].link); + } + } + catch (e) {} + } + return open(config.email.url); + } }; -function play(arr) { +function play(arr = []) { + console.log('PLAY', arr); + const media = config.notification.sound.media; const filters = [0, 1, 2, 3, 4].map(index => ({ filter: media['custom' + index].filter, @@ -50,12 +81,20 @@ function play(arr) { } function open(url, inBackground, refresh) { + // console.log(new Error().stack); + // console.log(url, inBackground, refresh); + url = url.replace('@private', ''); // some urls might end with "@private" for private mode + function parseUri(str) { const uri = new URL(str); if (uri.hostname.startsWith('mail.google')) { - uri.messageId = (/message_id=([^&]*)|#[^/]*\/([^&]*)/.exec(uri.hostname) || [])[1] || uri.hash.split('/')[1]; - uri.label = (/#([^/]*)/.exec(str) || [])[1]; + uri.messageId = (/message_id=([^&]*)|#[^/]*\/([^&]*)/.exec(uri.href) || [])[1] || uri.hash.split('/').pop(); + { + const a = uri.hash.substr(1).replace('label/', '').split('/'); + a.pop(); + uri.label = a.length ? a.join('/') : ''; + } } return uri; } @@ -70,7 +109,16 @@ function open(url, inBackground, refresh) { } chrome.tabs.query(options, tabs => resolve(tabs)); })).then(tabs => { + tabs = tabs.filter(t => t.url); + const parse2 = parseUri(url); + // support for basic HTML + if (parse2.messageId && config.email.basic) { + url = `${parse2.origin}${parse2.pathname}/h/?&th=${parse2.messageId}&v=c`.replace('//h', '/h'); + if (parse2.label) { + url += '&s=l&l=' + parse2.label; + } + } for (let i = 0; i < tabs.length; i++) { const tab = tabs[i]; @@ -99,27 +147,26 @@ function open(url, inBackground, refresh) { !/to=/.test(url) && !/view=cm/.test(url) ) { - const reload = parse2.messageId && tab.url.indexOf(parse2.messageId) === -1 || refresh; + const reload = refresh || + (parse2.messageId && tab.url.indexOf(parse2.messageId) === -1) || + (parse1.messageId && !parse2.messageId); // when opening INBOX when a thread page is open + if (tab.active && !reload) { if (config.tabs.NotifyGmailIsOpen) { app.notify(app.l10n('msg_1')); } } - else if (tab.active && reload) { - chrome.tabs.update(tab.id, {url}); - } - if (tab.active === false) { - const options = { - active: true - }; - if (reload) { - options.url = url; - } - chrome.tabs.update(tab.id, options); - chrome.windows.update(tab.windowId, { - focused: true - }); + const options = { + active: true + }; + if (reload) { + options.url = url; } + chrome.tabs.update(tab.id, options); + chrome.windows.update(tab.windowId, { + focused: true + }); + return; } } @@ -163,7 +210,6 @@ var checkEmails = (function() { return { execute: function(forced) { - console.log('checkEmails.execute', forced); if (forced) { toolbar.icon = 'load'; toolbar.badge = 0; @@ -230,11 +276,11 @@ var checkEmails = (function() { app.popup.detach(); return; } - //Removing not logged-in accounts + // Removing not logged-in accounts objs = objs.filter(function(o) { return o.network && !o.notAuthorized && o.xml && o.xml.entries; }); - //Sorting accounts + // Sorting accounts objs.sort(function(a, b) { var var1 = config.email.alphabetic ? a.xml.title : a.xml.link; var var2 = config.email.alphabetic ? b.xml.title : b.xml.link; @@ -251,13 +297,15 @@ var checkEmails = (function() { return p + c.xml.fullcount; }, 0); // + cachedEmails = objs; + // if (!anyNewEmails && !forced && count === newCount) { - app.popup.send('update-date', objs); //Updating the date of the panel - return; //Everything is clear + app.popup.send('update-date', objs); // Updating the date of the panel + app.popup.send('validate-current', objs); // maybe the current email is marked as read but still count is 20 (max value for non inbox labels) + return; // Everything is clear } count = newCount; // - cachedEmails = objs; contextmenu.fireContext(); // Preparing the report tmp = []; @@ -267,7 +315,8 @@ var checkEmails = (function() { return anyNewEmails ? o.newIDs.indexOf(e.id) !== -1 : o.xml.fullcount !== 0; }) .splice(0, config.email.maxReport) - .forEach(function(e) { + .forEach(e => { + e.parent = o; tmp.push(e); }); }); @@ -296,6 +345,13 @@ var checkEmails = (function() { (c.xml.label ? ' [' + c.xml.label + ']' : '') + ' (' + c.xml.fullcount + ')\n'; }, '').replace(/\n$/, ''); + let singleAccount = false; + if (config.email.openInboxOnOne === 1) { + singleAccount = objs.map(o => o.xml.rootLink).filter((s, i, l) => l.indexOf(s) === i).length === 1; + } + else if (config.email.openInboxOnOne === 2) { + singleAccount = true; + } if (!forced && !anyNewEmails) { if (newCount) { @@ -304,7 +360,7 @@ var checkEmails = (function() { color = 'red'; toolbar.label = tooltip; app.popup.send('update', objs); - if (tmp.length === 1 && config.email.openInboxOnOne === 1) { + if (singleAccount) { app.popup.detach(); } else { @@ -330,14 +386,76 @@ var checkEmails = (function() { toolbar.icon = 'new'; toolbar.badge = newCount; color = 'new'; - if (tmp.length === 1 && config.email.openInboxOnOne === 1) { + if (singleAccount) { app.popup.detach(); } else { app.popup.attach(); } if (config.notification.show) { - app.notify(report, '', () => open('https://mail.google.com/')); + const buttons = [{ + title: app.l10n('popup_read'), + iconUrl: '/data/images/read.png', + callback: () => gmail.action({ + links: tmp.map(o => o.link), + cmd: 'rd' + }).catch(() => {}).then(() => window.setTimeout(() => repeater.reset(), 500)) + }, { + title: app.l10n('popup_archive'), + iconUrl: '/data/images/archive.png', + callback: () => gmail.action({ + links: tmp.map(o => o.link), + cmd: 'rc_^i' + }).catch(() => {}).then(() => window.setTimeout(() => repeater.reset(), 500)) + }, { + title: app.l10n('popup_trash'), + iconUrl: '/data/images/trash.png', + callback: () => gmail.action({ + links: tmp.map(o => o.link), + cmd: 'tr' + }).catch(() => {}).then(() => window.setTimeout(() => repeater.reset(), 500)) + }].filter((o, i) => { + if ( + (i === 0 && config.notification.buttons.markasread) || + (i === 1 && config.notification.buttons.archive) || + (i === 2 && config.notification.buttons.trash) + ) { + return true; + } + return false; + }).slice(0, 2); + + // convert links + const links = []; + + for (const o of tmp) { + try { + const base = gmail.get.base(o.link); + const messageID = gmail.get.id(o.link); + + if (messageID && o.parent.xml.link.indexOf('#') === -1) { + links.push(base + '/?shva=1#inbox/' + messageID); + } + else if (messageID) { + links.push(o.parent.xml.link + '/' + messageID); + } + else { + links.push(o.link); + } + } + catch (e) { + links.push(o.link); + } + } + + app.notify(report, '', () => { + // use open to open the first link and use chrome.tabs.create for the rest + open(links[0]); + links.slice(1).forEach(url => chrome.tabs.create({ + url, + active: false + })); + }, buttons); } if (config.notification.sound.play) { play(tmp); @@ -359,18 +477,17 @@ chrome.browserAction.onClicked.addListener(() => actions.onCommand()); // start up app.on('load', () => { // add a repeater to check all accounts - repeater = new timer.repeater( + repeater = new timer.Repeater( (config.email.check.first ? config.email.check.first : 5) * 1000, config.email.check.period * 1000 ); repeater.on(checkEmails.execute); - if (config.email.check.first === 0) { // manual mode - console.log('stopped the main repeater'); + if (config.email.check.first === 0) { // manual mode repeater.stop(); } // periodic reset - resetTimer = new timer.repeater( + resetTimer = new timer.Repeater( config.email.check.resetPeriod * 1000 * 60, config.email.check.resetPeriod * 1000 * 60 ); @@ -381,13 +498,9 @@ app.on('load', () => { }); // updates -app.on('update', () => { - console.log('update is requested'); - repeater.reset(); -}); +app.on('update', () => repeater && repeater.reset()); // messaging -chrome.runtime.onMessage.addListener(request => { - console.log(request); +chrome.runtime.onMessage.addListener((request, sender, response) => { const method = request.method; if (method === 'update' && request.forced) { repeater.reset(true); @@ -413,68 +526,64 @@ chrome.runtime.onMessage.addListener(request => { open(url.link, null, null, url.isPrivate); } } -}); - -// pref changes -chrome.storage.onChanged.addListener(prefs => { - if (prefs.resetPeriod) { - if (prefs.resetPeriod.newValue) { - resetTimer.fill(prefs.resetPeriod.newValue * 1000 * 60); - resetTimer.reset(); - } - else { - resetTimer.stop(); - } - } - if (prefs.oldFashion) { - const numberOfAccounts = checkEmails.getCached() - .map(o => o.xml ? o.xml.title : null) - .filter((o, i, a) => o && a.indexOf(o) === i) - .length; - const hasUnread = checkEmails.getCached() - .map(o => o.xml ? o.xml.fullcount : 0) - .reduce((p, c) => p + c, 0); - if (numberOfAccounts === 1 && prefs.oldFashion.newValue === 1) { - app.popup.detach(); - } - else if (hasUnread) { - app.popup.attach(); - } - } - if (prefs.minimal || - prefs.feeds_0 || prefs.feeds_1 || prefs.feeds_2 || prefs.feeds_3 || prefs.feeds_4 || prefs.feeds_5 || - prefs.feeds_custom - ) { - repeater.reset(); - } - if (prefs.clrPattern) { - actions.reset(); + else if (method === 'test-play') { + play(null); } - if (prefs.period) { - repeater.fill(prefs.period.newValue * 1000); + else if (method === 'gmail.action') { + gmail.action(request).then(() => { + response(); + }).catch(e => { + + notify(e.message); + response(e); + }); + return true; } - if (prefs.backgroundColor) { - toolbar.color = prefs.backgroundColor.newValue; + else if (method === 'gmail.search') { + // to prevent errors due to disconnected port + const callback = a => { + try { + response(a); + } + catch (e) {} + }; + + gmail.search(request).then(r => callback(r.entries)).catch(() => callback()); + return true; } }); -// FAQs & Feedback & init -chrome.storage.local.get({ - 'version': null, - 'welcome': true -}, prefs => { - const version = chrome.runtime.getManifest().version; - - if (prefs.version ? (prefs.welcome && prefs.version !== version) : true) { - chrome.storage.local.set({version}, () => { - chrome.tabs.create({ - url: 'http://add0n.com/gmail-notifier.html?version=' + version + - '&type=' + (prefs.version ? ('upgrade&p=' + prefs.version) : 'install') - }); - }); - } +// init +app.on('load', () => { + const prefs = config.prefs; + // init; + toolbar.color = prefs.backgroundColor; }); + +/* FAQs & Feedback */ { - const {name, version} = chrome.runtime.getManifest(); - chrome.runtime.setUninstallURL('http://add0n.com/feedback.html?name=' + name + '&version=' + version); + const {management, runtime: {onInstalled, setUninstallURL, getManifest}, storage, tabs} = chrome; + if (navigator.webdriver !== true) { + const page = getManifest().homepage_url; + const {name, version} = getManifest(); + onInstalled.addListener(({reason, previousVersion}) => { + management.getSelf(({installType}) => installType === 'normal' && storage.local.get({ + 'faqs': true, + 'last-update': 0 + }, prefs => { + if (reason === 'install' || (prefs.faqs && reason === 'update')) { + const doUpdate = (Date.now() - prefs['last-update']) / 1000 / 60 / 60 / 24 > 45; + if (doUpdate && previousVersion !== version) { + tabs.query({active: true, currentWindow: true}, tbs => tabs.create({ + url: page + '?version=' + version + (previousVersion ? '&p=' + previousVersion : '') + '&type=' + reason, + active: reason === 'install', + ...(tbs && tbs.length && {index: tbs[0].index + 1}) + })); + storage.local.set({'last-update': Date.now()}); + } + } + })); + }); + setUninstallURL(page + '?rd=feedback&name=' + encodeURIComponent(name) + '&version=' + version); + } } diff --git a/WebExtension/lib/config.js b/v2/lib/config.js similarity index 86% rename from WebExtension/lib/config.js rename to v2/lib/config.js index b5b30997..fc40bad3 100644 --- a/WebExtension/lib/config.js +++ b/v2/lib/config.js @@ -2,49 +2,28 @@ 'use strict'; Object.assign(config.prefs, { - timeout: 9000, - maxReport: 3, - tooltip: true, - backgroundColor: '#3366CC', - firstRun: true + 'timeout': 9000, + 'maxReport': 3, + 'tooltip': true, + 'firstRun': true, + 'version': null, + 'notification.sound.media.default.file': null, + 'notification.sound.media.custom0.file': null, + 'notification.sound.media.custom1.file': null, + 'notification.sound.media.custom2.file': null, + 'notification.sound.media.custom3.file': null, + 'notification.sound.media.custom4.file': null }); -chrome.storage.local.get(config.prefs, ps => { - if (ps.firstRun) { - config.map.number.forEach(name => ps[name] = Number(ps[name])); - config.map.checkbox.forEach(name => { - if (ps[name] === 'true') { - ps[name] = true; - } - else if (ps[name] === 'false') { - ps[name] = false; - } - }); - ps.firstRun = false; - chrome.storage.local.set(ps); - } - - Object.assign(config.prefs, ps); - - app.storage = { - read: id => config.prefs[id], - write: (id, data) => { - config.prefs[id] = data; - chrome.storage.local.set({ - [id]: data - }); - } - }; - - app.emit('load'); -}); chrome.storage.onChanged.addListener(prefs => { - console.log(prefs); Object.keys(prefs).forEach(key => config.prefs[key] = prefs[key].newValue); }); config.email = { url: 'https://mail.google.com/mail/u/0', + get basic() { + return config.prefs['basic.html']; + }, compose: 'https://mail.google.com/mail/?ui=2&view=cm', get feeds_0() { return config.prefs['feeds_0']; @@ -70,7 +49,7 @@ config.email = { get feeds() { var tmp = ['0', '1', '2', '3', '4', '5'] .map(i => config.email['feeds_' + i]) - .map((f, i) => f.split(', ').map(tag => tag ? (tag.startsWith('http:') ? tag : i + '/feed/atom/' + tag) : '')); + .map((f, i) => f.split(', ').map(tag => tag ? (tag.startsWith('http:') ? tag : i + '/feed/atom/' + encodeURIComponent(tag)) : '')); let merged = []; tmp.forEach(l => merged.push(...l)); merged = merged @@ -84,7 +63,7 @@ config.email = { ]; } merged = merged - //only feeds without '/inbox' show the right full-count + // only feeds without '/inbox' show the right full-count .map(tag => tag.replace('/inbox', '')) .filter(f => f) .filter((feed, index, feeds) => feeds.indexOf(feed) === index) @@ -99,10 +78,10 @@ config.email = { } return merged; }, - get timeout () { + get timeout() { return config.prefs.timeout; }, - get maxReport () { //Maximum number of simultaneous reports from a single account + get maxReport() { // Maximum number of simultaneous reports from a single account return config.prefs.maxReport; }, get threatAsNew() { // in minutes @@ -117,6 +96,9 @@ config.email = { get doReadOnArchive() { return config.prefs.doReadOnArchive; }, + get inboxRedirection() { + return config.prefs.inboxRedirection; + }, get openInboxOnOne() { return config.prefs.oldFashion; }, @@ -266,6 +248,17 @@ config.notification = { checked: val === false }); }, + buttons: { + get markasread() { + return config.prefs['notification.buttons.markasread']; + }, + get trash() { + return config.prefs['notification.buttons.trash']; + }, + get archive() { + return config.prefs['notification.buttons.archive']; + } + } }; config.labels = { @@ -275,7 +268,9 @@ config.labels = { }; config.ui = { - badge: true, + get badge() { + return config.prefs.badge; + }, get tooltip() { return config.prefs.tooltip; }, @@ -324,6 +319,15 @@ config.tabs = { return 1; } return 0; + }, + get smart() { + return config.prefs['smartOpen']; } } }; + +config['plug-ins'] = { + get labels() { + return config.prefs['plug-in/labels']; + } +}; diff --git a/WebExtension/lib/context-menu.js b/v2/lib/context-menu.js similarity index 95% rename from WebExtension/lib/context-menu.js rename to v2/lib/context-menu.js index cf3fa8d4..c07956cb 100644 --- a/WebExtension/lib/context-menu.js +++ b/v2/lib/context-menu.js @@ -46,7 +46,7 @@ var contextmenu = {}; parentId: ids.disable, id, title: l10n(id), - contexts: ['browser_action'], + contexts: ['browser_action'] })); chrome.contextMenus.onClicked.addListener(info => { @@ -82,7 +82,7 @@ var contextmenu = {}; actions.reset(); } else if (method === 'label_12') { - open('http://add0n.com/gmail-notifier.html?type=context'); + open(chrome.runtime.getManifest().homepage_url); } }); @@ -109,7 +109,6 @@ var contextmenu = {}; return; } cache = accounts.map(a => a.title); - console.log('building context-menu'); ids.childs.forEach(o => chrome.contextMenus.remove(o.id)); ids.childs = []; diff --git a/v2/lib/gmail.js b/v2/lib/gmail.js new file mode 100644 index 00000000..2b5a8fe7 --- /dev/null +++ b/v2/lib/gmail.js @@ -0,0 +1,294 @@ +'use strict'; + +var gmail = {}; + +gmail.fetch = url => new Promise((resolve, reject) => { + const req = new XMLHttpRequest(); + req.onload = () => resolve({ + text: () => req.response, + status: req.status + }); + req.onerror = () => reject(new Error('action -> fetch Error')); + req.open('GET', url); + req.send(); +}); + +gmail.random = () => (Math.random().toString(36) + '00000000000000000').slice(2, 14); + +gmail.get = { + base: url => /[^?]*/.exec(url)[0].split('/h')[0].replace(/\/$/, ''), + id: url => { + const tmp = /message_id=([^&]*)/.exec(url); + if (tmp && tmp.length) { + return tmp[1]; + } + return null; + } +}; + +{ + const token = {}; + gmail.at = {}; + gmail.at.get = url => { + url = gmail.get.base(url); + if (token[url]) { + // invalidate after 10 minutes + if (Date.now() - token[url].date < 10 * 60 * 1000) { + return Promise.resolve(token[url]); + } + } + return new Promise((resolve, reject) => { + const blind = 'https://mail.google.com/mail/?ui=html&zy=h'; + fetch(blind, { + credentials: 'include' + }).then(r => r.url).then(href => { + if (href.indexOf('/u/') === -1) { + return reject(Error('cannot find basic HTML view from the blind URL')); + } + const id = url.split('/u/')[1].split('/')[0]; + const base = href.replace(/\/u\/\d+/, '/u/' + id); + + gmail.fetch(base).then(r => r.text()).then(content => { + const parser = new DOMParser(); + const doc = parser.parseFromString(content, 'text/html'); + + const e = doc.querySelector('a[href*="at="]'); + const input = doc.querySelector('[name="at"]'); // do you really want to use this view + if (e) { + const args = new URLSearchParams(e.href.split('?')[1]); + const at = args.get('at'); + if (!at) { + reject(Error('cannot extract "at" from the base page')); + } + token[url] = { + at, + base, + date: Date.now() + }; + resolve(token[url]); + } + else if (input) { + // allow access + const body = new URLSearchParams(); + body.append('at', input.value); + fetch(base.split('?')[0] + '?a=uia', { + method: 'POST', + body, + credentials: 'include' + }); + + token[url] = { + at: input.value, + base, + date: Date.now() + }; + resolve(token[url]); + } + else { + reject(Error('cannot get "at" from the base page')); + } + }); + }); + }); + }; + gmail.at.invalidate = url => delete token[gmail.get.base(url)]; +} + +gmail.formData = obj => { + const arr = []; + Object.keys(obj).forEach(key => { + if (!Array.isArray(obj[key])) { + obj[key] = [obj[key]]; + } + obj[key].forEach(v => { + arr.push(`${key}=${encodeURIComponent(v)}`); + }); + }); + return arr.join('&'); +}; + +gmail.post = (url, params, threads = [], retry = true, express = false) => new Promise((resolve, reject) => { + const req = new XMLHttpRequest(); + chrome.storage.local.get({ + inboxRedirection: true, + express: false + }, prefs => { + url = (gmail.get.base(url) + '/?' + gmail.formData(params)); + req.open('POST', url); + req.setRequestHeader('content-type', 'application/x-www-form-urlencoded'); + req.onreadystatechange = () => { + // consider post as successful if req.readyState === HEADERS_RECEIVED + if (express && prefs.express && req.readyState === 2 && req.status === 200) { + resolve(req); + } + }; + req.onload = () => { + if (req.status === 302 && retry === true) { + gmail.at.invalidate(url); + gmail.post(url, params, threads, retry = false).then(resolve, reject); + } + else if (req.status === 404) { + reject(new Error('Gmail is rejecting this action')); + } + else { + resolve(req); + } + }; + req.onerror = () => reject(''); + req.send(threads.length ? 't=' + threads.join('&t=') : ''); + }); +}); + + +gmail.action = ({links, cmd}) => { + links = typeof links === 'string' ? [links] : links; + const url = /[^?]*/.exec(links[0])[0]; + + return gmail.at.get(url).then(obj => { + const threads = links.map(link => gmail.get.id(link) || '').map(t => t); + + if (threads.length) { + const shortcuts = { + 'rd': { // mark as read + 'tact': 'rd', + 'nvp_tbu_go': 'Go', + 'redir': '?&' + }, + 'rd-all': { // mark all as read + 'tact': 'rd', + 'nvp_tbu_go': 'Go' + }, + 'rc_^i': { // archive + 'tact': 'arch', + 'nvp_tbu_go': 'Go' + }, + 'rc_Inbox': { // archive + 'tact': 'arch', + 'nvp_tbu_go': 'Go' + }, + 'tr': { // trash + 'tact': '', + 'nvp_a_tr': 'Delete' + }, + 'move-to-inbox': { + 'tact': '', + 'nvp_a_ib': 'Move to Inbox' + }, + 'sp': { // report spam + 'tact': '', + 'nvp_a_sp': 'Report Spam' + }, + 'rc_Spam': { // report spam + 'tact': '', + 'nvp_a_sp': 'Report Spam' + }, + 'st': { // add-star + 'tact': 'st', + 'nvp_tbu_go': 'Go', + 'bact': '' + }, + 'xst': { // remove star + 'tact': 'xst', + 'nvp_tbu_go': 'Go', + 'bact': '' + } + }; + const command = shortcuts[cmd] || { + 'tact': cmd, + 'nvp_tbu_go': 'Go', + 'bact': '' + }; + const body = new URLSearchParams(); + body.append('at', obj.at); + for (const [key, value] of Object.entries(command)) { + body.append(key, value); + } + for (const thread of threads) { + body.append('t', thread); + } + body.append('bact', ''); + + if (cmd === 'rc_^i' || cmd === 'rc_Inbox') { + chrome.storage.local.get({ + doReadOnArchive: true + }, prefs => { + if (prefs.doReadOnArchive === true || prefs.doReadOnArchive === 'true') { + gmail.action({ + links, + cmd: 'rd' + }); + } + }); + } + + return fetch(obj.base.split('?')['0'] + '?&s=a', { + method: 'POST', + body, + credentials: 'include' + }); + } + return Promise.reject(Error('action -> Error at resolving thread.')); + }); +}; + +gmail.search = async ({url, query}) => { + const obj = await gmail.at.get(url); + if (obj.at) { + const body = new URLSearchParams(); + body.append('s', 'q'); + body.append('q', query); + body.append('nvp_site_mail', 'Search Mail'); + body.append('at', obj.at); + + const r = await fetch(obj.base.split('?')[0] + '?s=q&q=' + encodeURIComponent(query) + '&nvp_site_mail=Search%20Mail', { + credentials: 'include' + }); + const content = await r.text(); + const parser = new DOMParser(); + const doc = parser.parseFromString(content, 'text/html'); + + const as = [...doc.querySelectorAll('a[href*="&th="]')]; + + const entries = as.map(a => { + const ts = a.querySelector('.ts'); + const es = ts.children.length === 3 ? ts.children : ts.childNodes; + if (es.length < 3) { + throw Error('Cannot extract "labels", "title", and "snippet" from the element'); + } + const snippet = ts.querySelector('.ts > font:last-child'); + + const entry = {}; + entry.thread = a.href.split('th=')[1].split('&')[0]; + entry.labels = [...es[0].textContent.split(/\s*,\s*/)].filter(a => a); + if (a.closest('tr').querySelector('img[alt=Starred]')) { + entry.labels.push('STARRED'); + } + entry.date = ts.closest('td').nextElementSibling.textContent; + entry.from = ts.closest('td').previousElementSibling.textContent.replace(/\s+\(\d+\)$/, ''); + entry.text = snippet ? snippet.textContent.replace(/^ - /, '') : ''; + + + return entry; + }); + + let count = 0; + if (as.length) { + const t = doc.querySelector('form[name=f] td[align="right"] b:last-of-type'); + if (!t) { + throw Error('Cannot detect count'); + } + count = Number(t.textContent); + } + + return { + 'count': count || entries.length, + 'name': 'NA', + 'logged-in': true, + 'responseURL': r.responseURL, + entries + }; + } + else { + throw new Error('Cannot parse search result/1'); + } +}; diff --git a/v2/lib/load.js b/v2/lib/load.js new file mode 100644 index 00000000..5cd969a4 --- /dev/null +++ b/v2/lib/load.js @@ -0,0 +1,33 @@ +/* globals config, app */ +'use strict'; + +chrome.storage.local.get(config.prefs, ps => { + // fix preferences from older versions + if (ps.firstRun && ps.version) { + config.map.number.forEach(name => ps[name] = Number(ps[name])); + config.map.checkbox.forEach(name => { + if (ps[name] === 'true') { + ps[name] = true; + } + else if (ps[name] === 'false') { + ps[name] = false; + } + }); + ps.firstRun = false; + chrome.storage.local.set(ps); + } + + Object.assign(config.prefs, ps); + + app.storage = { + read: id => config.prefs[id], + write: (id, data) => { + config.prefs[id] = data; + chrome.storage.local.set({ + [id]: data + }); + } + }; + // window.setTimeout(() => app.emit('load'), 2000); + app.emit('load'); +}); diff --git a/WebExtension/lib/toolbar.js b/v2/lib/toolbar.js similarity index 86% rename from WebExtension/lib/toolbar.js rename to v2/lib/toolbar.js index 23ba3b0a..85762db6 100644 --- a/WebExtension/lib/toolbar.js +++ b/v2/lib/toolbar.js @@ -5,12 +5,11 @@ var toolbar = {}; Object.defineProperty(toolbar, 'badge', { set(val) { - console.log('setBadge', val); if (val > 999 && config.ui.minimal) { val = '>' + Math.round(val / 1000) + 'K'; } chrome.browserAction.setBadgeText({ - text: val === 0 ? '' : String(val) + text: val === 0 || config.ui.badge === false ? '' : String(val) }); } }); @@ -60,7 +59,12 @@ Object.defineProperty(toolbar, 'color', { } } chrome.browserAction.setIcon({ - path: '/data/icons/' + clr + '/19.png' + path: { + '16': '/data/icons/' + clr + '/16.png', + '18': '/data/icons/' + clr + '/18.png', + '19': '/data/icons/' + clr + '/19.png', + '32': '/data/icons/' + clr + '/32.png' + } }); } diff --git a/WebExtension/lib/utils/server.js b/v2/lib/utils/server.js similarity index 100% rename from WebExtension/lib/utils/server.js rename to v2/lib/utils/server.js diff --git a/WebExtension/lib/utils/tab.js b/v2/lib/utils/tab.js similarity index 100% rename from WebExtension/lib/utils/tab.js rename to v2/lib/utils/tab.js diff --git a/WebExtension/lib/utils/timer.js b/v2/lib/utils/timer.js similarity index 97% rename from WebExtension/lib/utils/timer.js rename to v2/lib/utils/timer.js index 23e3a580..a61070b2 100644 --- a/WebExtension/lib/utils/timer.js +++ b/v2/lib/utils/timer.js @@ -17,7 +17,7 @@ var timer = {}; * } * }); **/ -timer.repeater = function() { +timer.Repeater = function() { let id, callback; let intervals = [].slice.call(arguments, 0); function stop() { diff --git a/WebExtension/lib/wrapper/chrome/app.js b/v2/lib/wrapper/chrome/app.js similarity index 74% rename from WebExtension/lib/wrapper/chrome/app.js rename to v2/lib/wrapper/chrome/app.js index 4788e76d..0e77e3e5 100644 --- a/WebExtension/lib/wrapper/chrome/app.js +++ b/v2/lib/wrapper/chrome/app.js @@ -2,6 +2,7 @@ 'use strict'; var isFirefox = navigator.userAgent.indexOf('Firefox') !== -1; +var isOpera = navigator.userAgent.indexOf('OPR') !== -1; var EventEmitter = function() { this.callbacks = {}; @@ -26,6 +27,15 @@ chrome.notifications.onClicked.addListener(function(id) { app.notify[id](); } }); +if (chrome.notifications.onButtonClicked) { + chrome.notifications.onButtonClicked.addListener((id, index) => { + chrome.notifications.clear(id, function() {}); + userActions.forEach(c => c()); + if (app.notify[id] && app.notify[id].buttons) { + app.notify[id].buttons[index].callback(); + } + }); +} app.popup = { attach: () => chrome.browserAction.setPopup({ @@ -40,7 +50,7 @@ app.popup = { popup: '' }); }, - send: (id, data) => chrome.runtime.sendMessage({method: id, data: data}) + send: (id, data) => chrome.runtime.sendMessage({method: id, data: data}, () => chrome.runtime.lastError) }; app.get = (url, headers = {}, data, timeout) => new Promise(resolve => { @@ -64,7 +74,7 @@ app.get = (url, headers = {}, data, timeout) => new Promise(resolve => { app.l10n = chrome.i18n.getMessage; -app.notify = function(text, title, callback) { +app.notify = function(text, title, callback, buttons = []) { title = title || app.l10n('gmail'); if (config.notification.silent) { return; @@ -74,11 +84,15 @@ app.notify = function(text, title, callback) { isArray = false; text = text[0]; } + if (isOpera && isArray) { + isArray = false; + text = text.join('\n'); + } const options = { type: isArray ? 'list' : 'basic', iconUrl: '/data/icons/notification/48.png', - title: title, + title, message: isArray ? '' : text, priority: 2, eventTime: Date.now() + 30000, @@ -90,14 +104,28 @@ app.notify = function(text, title, callback) { }; }) : [], isClickable: true, - requireInteraction: true + requireInteraction: true, + buttons: buttons.map(b => ({ + title: b.title, + iconUrl: b.iconUrl + })) }; if (isFirefox) { delete options.requireInteraction; + delete options.buttons; + } + if (isOpera) { + delete options.buttons; + } + if (config.notification.actions === false) { + delete options.buttons; } chrome.notifications.create(null, options, id => { app.notify[id] = callback; + if (callback) { + app.notify[id].buttons = buttons; + } window.setTimeout(id => { app.notify[id] = null; chrome.notifications.clear(id); @@ -136,17 +164,23 @@ app.sound = (function() { { let id; chrome.webRequest.onCompleted.addListener(d => { - if (d.frameId) { - if (d.type === 'main_frame' || d.url.indexOf('act=') !== -1) { + if (d.tabId) { + if ( + d.type === 'main_frame' || + d.url.indexOf('&act=') !== -1 || + (d.url.indexOf('/sync/u/') !== -1 && d.method === 'POST') + ) { window.clearTimeout(id); id = window.setTimeout(() => { - console.log('webRequest update'); app.emit('update'); - }, 100); + }, 2000); } } }, - {urls: ['https://mail.google.com/mail/u*']}, + {urls: [ + '*://mail.google.com/mail/u*', + '*://mail.google.com/sync/u/*/i/s*' + ]}, [] ); } diff --git a/WebExtension/lib/wrapper/chrome/background.html b/v2/lib/wrapper/chrome/background.html similarity index 85% rename from WebExtension/lib/wrapper/chrome/background.html rename to v2/lib/wrapper/chrome/background.html index c503a00f..a01fa20f 100644 --- a/WebExtension/lib/wrapper/chrome/background.html +++ b/v2/lib/wrapper/chrome/background.html @@ -11,7 +11,9 @@ + + diff --git a/WebExtension/manifest.json b/v2/manifest.json similarity index 55% rename from WebExtension/manifest.json rename to v2/manifest.json index 01aeb399..1138d2e1 100644 --- a/WebExtension/manifest.json +++ b/v2/manifest.json @@ -1,14 +1,13 @@ { "name": "Notifier for Gmail™", - "short_name": "ignotifier", "description": "__MSG_description__", "author": "InBasic", - "version": "0.8.0b1", + "version": "1.0.5", "manifest_version": 2, "default_locale": "en", "permissions": [ - "https://mail.google.com/mail/", - "tabs", + "*://mail.google.com/mail/", + "*://mail.google.com/sync/", "notifications", "contextMenus", "webRequest", @@ -18,25 +17,29 @@ "notification.png" ], "browser_action": { - "default_icon": "data/icons/blue/19.png" + "default_icon": { + "16": "data/icons/blue/16.png", + "18": "data/icons/blue/18.png", + "19": "data/icons/blue/19.png", + "32": "data/icons/blue/32.png" + } }, "background": { "page": "lib/wrapper/chrome/background.html" }, "options_ui": { - "page": "data/options/redirect.html", - "chrome_style": true + "page": "data/options/index.html", + "chrome_style": false, + "open_in_tab": true }, "homepage_url": "http://add0n.com/gmail-notifier.html", "icons": { "16": "data/icons/red/16.png", + "18": "data/icons/red/18.png", + "19": "data/icons/red/19.png", + "32": "data/icons/red/32.png", "48": "data/icons/red/48.png", + "64": "data/icons/red/64.png", "128": "data/icons/red/128.png" - }, - "applications": { - "gecko": { - "id": "jid0-GjwrPchS3Ugt7xydvqVK4DQk8Ls@jetpack", - "strict_min_version": "55.0" - } } } diff --git a/v3.classic/LICENSE b/v3.classic/LICENSE new file mode 120000 index 00000000..ea5b6064 --- /dev/null +++ b/v3.classic/LICENSE @@ -0,0 +1 @@ +../LICENSE \ No newline at end of file diff --git a/v3.classic/_locales/ar/messages.json b/v3.classic/_locales/ar/messages.json new file mode 100644 index 00000000..cce53244 --- /dev/null +++ b/v3.classic/_locales/ar/messages.json @@ -0,0 +1,758 @@ +{ + "toolbar_label": { + "message": "Notifier for Gmail™", + "description": "" + }, + "tooltip_1": { + "message": "Left click: Open Gmail or mail preview panel", + "description": "" + }, + "tooltip_2": { + "message": "Middle (or Ctrl+Left) click: Refresh all accounts", + "description": "" + }, + "tooltip_3": { + "message": "Right click: Account selections", + "description": "" + }, + "description": { + "message": "Multiple label and account notifier for Google Mail (Gmail)", + "description": "" + }, + "log_in_to_your_account": { + "message": "Please sign-in to your Gmail account", + "description": "" + }, + "msg_1": { + "message": "Tab is already open. Click on the toolbar button to open Gmail in a new tab, or to switch to an existing Gmail tab.", + "description": "" + }, + "msg_2": { + "message": "الرابط نُسخ إلي الحافظة.", + "description": "" + }, + "msg_3": { + "message": "النص المحدد نُسخ إلي الحافظة.", + "description": "" + }, + "msg_4": { + "message": "Note: For the notifier to work properly, you need to be logged-in into your Google account.", + "description": "" + }, + "msg_5": { + "message": "Select an audio sound file", + "description": "" + }, + "label_1": { + "message": "تحديث", + "description": "" + }, + "label_2": { + "message": "الإعدادات", + "description": "" + }, + "label_3": { + "message": "عدل كل الإشعارات", + "description": "" + }, + "label_4": { + "message": "لـ5 دقائق", + "description": "" + }, + "label_5": { + "message": "لـ 15 دقيقة", + "description": "" + }, + "label_6": { + "message": "لـ 30 دقيقية", + "description": "" + }, + "label_7": { + "message": "لـ 1 ساعة", + "description": "" + }, + "label_8": { + "message": "لـ 2 ساعة", + "description": "" + }, + "label_9": { + "message": "لـ 5 ساعات", + "description": "" + }, + "label_13": { + "message": "For a custom time period", + "description": "" + }, + "label_10": { + "message": "Enable notifications (session)", + "description": "" + }, + "label_11": { + "message": "إنشاء إيميل", + "description": "" + }, + "label_12": { + "message": "Open FAQs", + "description": "" + }, + "label_14": { + "message": "Logged-in accounts", + "description": "" + }, + "unknown": { + "message": "unknown", + "description": "" + }, + "and": { + "message": "and", + "description": "" + }, + "log_into_your_account": { + "message": "Please log into your account", + "description": "" + }, + "notification": { + "message": "From: [author_email][break]Title: [title][break]Summary: [summary]", + "description": "" + }, + "options_title": { + "message": "إعدادات أشعارات جوجل ميل ", + "description": "" + }, + "options_inshort": { + "message": "Multiple label and account notifier for Google Mail (Gmail).", + "description": "" + }, + "options_donation": { + "message": "Support Development", + "description": "" + }, + "options_timings": { + "message": "Timings:", + "description": "" + }, + "options_timings_l1": { + "message": "Check for new emails every (in seconds):", + "description": "" + }, + "options_timings_l2": { + "message": "Minimum period is 10 seconds.", + "description": "" + }, + "options_timings_l3": { + "message": "Remind for all unread emails every (in minutes):", + "description": "" + }, + "options_timings_l4": { + "message": "Set the value to zero for none-periodic reminders.", + "description": "" + }, + "options_timings_l5": { + "message": "Minimum period is 5 minutes.", + "description": "" + }, + "options_timings_l6": { + "message": "Non-zero value fires both desktop notification and alert sound (similar to new email arrival) eternally if you have unread email(s).", + "description": "" + }, + "options_timings_l7": { + "message": "Do not check for new emails on startup for (in seconds):", + "description": "" + }, + "options_timings_l8": { + "message": "Set the value to zero for no email check until the first manual refresh [Not available on Safari].", + "description": "" + }, + "options_gmail": { + "message": "Gmail:", + "description": "" + }, + "options_gmail_1": { + "message": "Primary account (/mail/u/0/)", + "description": "" + }, + "options_gmail_2": { + "message": "Separate labels by \",\" (Comma).", + "description": "" + }, + "options_gmail_3": { + "message": "Secondary account (/mail/u/1/)", + "description": "" + }, + "options_gmail_4": { + "message": "Tertiary account (/mail/u/2/)", + "description": "" + }, + "options_gmail_5": { + "message": "Quaternary account (/mail/u/3/)", + "description": "" + }, + "options_gmail_6": { + "message": "Quinary account (/mail/u/4/)", + "description": "" + }, + "options_gmail_7": { + "message": "Senary account (/mail/u/5/)", + "description": "" + }, + "options_gmail_8": { + "message": "Mark message as read when archiving it", + "description": "" + }, + "options_gmail_15": { + "message": "Some popular labels:", + "description": "" + }, + "options_gmail_10": { + "message": "Receive notifications for the following labels and accounts:", + "description": "" + }, + "options_gmail_11": { + "message": "Custom feeds:", + "description": "" + }, + "options_gmail_12": { + "message": "Separate feeds by \",\" (Comma). Sample feed: https://mail.google.com/mail/u/0/feed/atom/inbox", + "description": "" + }, + "options_gmail_13": { + "message": "Note: maximum number for all labels except \"inbox\" is 20 (Google feeds only supply the 20 newest entries)", + "description": "" + }, + "options_gmail_14": { + "message": "Note: for the Notifier to listen for more than 5 accounts, add feeds URLs to the \"Custom feeds\" field. For instance to listen to the 6 and 7th accounts add: https://mail.google.com/mail/u/6/feed/atom/inbox, https://mail.google.com/mail/u/7/feed/atom/inbox", + "description": "" + }, + "options_notifications": { + "message": "Notifications:", + "description": "" + }, + "options_notifications_1": { + "message": "Display desktop notification for new emails", + "description": "" + }, + "options_notifications_2": { + "message": "Show desktop notification for (in seconds):", + "description": "" + }, + "options_notifications_3": { + "message": "This option may not work based on your OS.", + "description": "" + }, + "options_notifications_4": { + "message": "Notification format", + "description": "" + }, + "options_notifications_5": { + "message": "Available variables:", + "description": "" + }, + "options_notifications_6": { + "message": "Truncate notifications longer than", + "description": "" + }, + "options_notifications_7": { + "message": "characters for [title] and [summary] fields.", + "description": "" + }, + "options_notifications_8": { + "message": "To have no ellipsis truncation, use a big number here.", + "description": "" + }, + "options_notifications_9": { + "message": "Play alert sound for new emails", + "description": "" + }, + "options_notifications_10": { + "message": "Note for Mac users. From Firefox 28.0, all desktop notifications are handled by Mac Notification Center which causes an extra sound alert. You need to either uncheck this sound notification or the one that is generated by the Notification Center.", + "description": "" + }, + "options_notifications_11": { + "message": "Display \"Windows taskbar notification\" or \"Mac OS Dock notification\"", + "description": "" + }, + "options_notifications_12": { + "message": "Taskbar notifications are not supported on Linux OS at the moment.", + "description": "" + }, + "options_notifications_13": { + "message": "Open toolbar panel when click on the taskbar notification icon (Windows only, beta)", + "description": "" + }, + "options_notifications_14": { + "message": "This feature is highly experimental and might make your Firefox browser unstable. [Restart required].", + "description": "" + }, + "options_notifications_15": { + "message": "Default sound notification is", + "description": "" + }, + "options_notifications_16": { + "message": "Gmail Notifier default alert", + "description": "" + }, + "options_notifications_17": { + "message": "Checker Plus bell alert", + "description": "" + }, + "options_notifications_18": { + "message": "Checker Plus ding alert", + "description": "" + }, + "options_notifications_19": { + "message": "Windows email alert", + "description": "" + }, + "options_notifications_20": { + "message": "User defined sound", + "description": "" + }, + "options_notifications_21": { + "message": "User defined notification sound is", + "description": "" + }, + "options_notifications_22": { + "message": "If your browser is not playing the custom notification sound, try to convert it into a plain WAV format using an online conversion tool.", + "description": "" + }, + "options_notifications_35": { + "message": "To select a new custom sound, select a built-in sound first and then change the option to custom sound", + "description": "" + }, + "options_notifications_23": { + "message": "Volume of the sound notification is", + "description": "" + }, + "options_notifications_24": { + "message": "Volume is a number between 0 to 100 where 100 is the highest volume (default).", + "description": "" + }, + "options_notifications_25": { + "message": "In safari most likely the default sound notifications are not playing properly, if so use a custom sound file as your notification.", + "description": "" + }, + "options_notifications_26": { + "message": "Always show tray notification (Windows only)", + "description": "" + }, + "options_notifications_27": { + "message": "Tray notification will be shown even if there is no unread message.", + "description": "" + }, + "options_notifications_28": { + "message": "Disable all notifications for a custom time period (in minutes):", + "description": "" + }, + "options_notifications_29": { + "message": "This option is related to the right click menu on the toolbar button -> disable all notifications -> custom time period.", + "description": "" + }, + "options_notifications_30": { + "message": "Combine all concurrent desktop notifications into a single notification", + "description": "" + }, + "options_notifications_31": { + "message": "Custom sound notification", + "description": "" + }, + "options_notifications_32": { + "message": "name or email contains", + "description": "" + }, + "options_notifications_33": { + "message": "email title contains", + "description": "" + }, + "options_notifications_34": { + "message": "email summary contains", + "description": "" + }, + "options_notifications_36": { + "message": "Ask Gmail to prevent 'inbox.google.com' redirection", + "description": "" + }, + "options_notifications_37": { + "message": "Display Badge number", + "description": "" + }, + "options_notifications_38": { + "message": "Faster actions (mark as read, delete, ...) (Consider actions to be resolved when headers are received)", + "description": "" + }, + "options_notifications_40": { + "message": "Allow quick actions from notification box (maximum two actions) (Chrome only)", + "description": "" + }, + "options_notifications_41": { + "message": "Mark as Read", + "description": "" + }, + "options_notifications_42": { + "message": "Archive", + "description": "" + }, + "options_notifications_43": { + "message": "Trash", + "description": "" + }, + "options_tab": { + "message": "Tab Opening:", + "description": "" + }, + "options_tab_1": { + "message": "Search for an open Gmail account only on the active window", + "description": "" + }, + "options_tab_2": { + "message": "Do not search other browser windows for open Gmail accounts. If Gmail is not open in the active window, open a new tab.", + "description": "" + }, + "options_tab_3": { + "message": "Open new Gmail account next to the active tab", + "description": "" + }, + "options_tab_4": { + "message": "Open Gmail account in the active tab", + "description": "" + }, + "options_tab_5": { + "message": "Open Gmail account in a background tab", + "description": "" + }, + "options_tab_6": { + "message": "Open Gmail account in a new window", + "description": "" + }, + "options_tab_7": { + "message": "Always use blank tabs instead of opening a new tab when open in tab is activated", + "description": "" + }, + "options_tab_8": { + "message": "Ignore opened Gmail tabs", + "description": "" + }, + "options_tab_9": { + "message": "When unchecked, Gmail Notifier checks either active window or all open windows for open instance of Gmail and switch to the tab when tab opening is requested.", + "description": "" + }, + "options_tab_10": { + "message": "Open emails in basic HTML mode", + "description": "" + }, + "options_toolbar": { + "message": "Toolbar:", + "description": "" + }, + "options_toolbar_1": { + "message": "Toolbar button behaviour", + "description": "" + }, + "options_toolbar_2": { + "message": "Always open email preview panel", + "description": "" + }, + "options_toolbar_3": { + "message": "Open Gmail account if only one account is logged-in", + "description": "" + }, + "options_toolbar_18": { + "message": "Open Gmail account (forced)", + "description": "" + }, + "options_toolbar_4": { + "message": "Toolbar panel mode", + "description": "" + }, + "options_toolbar_5": { + "message": "Show summary only", + "description": "" + }, + "options_toolbar_6": { + "message": "Show full content", + "description": "" + }, + "options_toolbar_7": { + "message": "Toolbar panel width in the full-content view mode is (in pixels):", + "description": "" + }, + "options_toolbar_8": { + "message": "Minimum width is 500px.", + "description": "" + }, + "options_toolbar_9": { + "message": "Toolbar panel height in the full-content view mode is (in pixels):", + "description": "" + }, + "options_toolbar_10": { + "message": "Minimum height is 500px.", + "description": "" + }, + "options_toolbar_11": { + "message": "Support keyboard shortcuts on the toolbar panel", + "description": "" + }, + "options_toolbar_12": { + "message": "!: Report as spam, #: Trash, e: Archive, Shift + i: Mark as read.", + "description": "" + }, + "options_toolbar_13": { + "message": "Render emails as HTML in full-content mode", + "description": "" + }, + "options_toolbar_14": { + "message": "If you prefer text-only rendering in the full-content mode, uncheck the box.", + "description": "" + }, + "options_toolbar_15": { + "message": "Middle-click on the toolbar button to", + "description": "" + }, + "options_toolbar_16": { + "message": "Refresh all accounts", + "description": "" + }, + "options_toolbar_17": { + "message": "Open primary Gmail account", + "description": "" + }, + "options_misc": { + "message": "Miscellaneous:", + "description": "" + }, + "options_misc_1": { + "message": "Sort accounts alphabetically", + "description": "" + }, + "options_misc_2": { + "message": "The default order type is logged-in order.", + "description": "" + }, + "options_misc_3": { + "message": "Toolbar color pattern is", + "description": "" + }, + "options_misc_4": { + "message": "Gray color for \"No Unread\" and blue color for \"Disconnected\"", + "description": "" + }, + "options_misc_5": { + "message": "Blue color for \"No Unread\" and gray color for \"Disconnected\"", + "description": "" + }, + "options_misc_9": { + "message": "Red color for \"No Unread\" and gray color for \"Disconnected\"", + "description": "" + }, + "options_misc_6": { + "message": "Show desktop notification to warn that Gmail is already opened in the active tab", + "description": "" + }, + "options_misc_7": { + "message": "Show welcome page on upgrade", + "description": "" + }, + "options_misc_8": { + "message": "Reset all settings back to factory", + "description": "" + }, + "options_misc_10": { + "message": "Only fire desktop and sound notifications when email has arrived in less than (in minutes): ", + "description": "" + }, + "options_misc_11": { + "message": "By setting this preference to zero, you will receive neither desktop nor sound notifications; however, you will still get badge notification.", + "description": "" + }, + "options_misc_12": { + "message": "Do not include login details in the tooltip text", + "description": "" + }, + "options_misc_13": { + "message": "By default, the notifier updates tooltip text of the toolbar button with login info. By unchecking this option, the tooltip text remains the default value.", + "description": "" + }, + "options_misc_14": { + "message": "Do not show the exact badge number when the number of unread emails is greater than 999", + "description": "" + }, + "options_misc_15": { + "message": "Open FAQs page on updates", + "description": "" + }, + "options_plugins": { + "message": "Plug-ins:", + "description": "" + }, + "options_plugins_1": { + "message": "Gmail labels and star button (experimental)", + "description": "" + }, + "options_plugins_2": { + "message": "This plugin displays the star button as well as thread's labels in the popup (expanded mode only).", + "description": "" + }, + "options_px": { + "message": "px", + "description": "" + }, + "options_empty": { + "message": "not defined", + "description": "" + }, + "options_button_test": { + "message": "Play", + "description": "" + }, + "options_button_reset": { + "message": "Reset Preferences", + "description": "" + }, + "popup_settings": { + "message": "settings", + "description": "" + }, + "popup_of": { + "message": "of", + "description": "" + }, + "popup_wait": { + "message": "Wait...", + "description": "" + }, + "popup_date_format": { + "message": "%mm %dd, %yy", + "description": "" + }, + "popup_no_subject": { + "message": "(no subject)", + "description": "" + }, + "popup_open_settings": { + "message": "Open settings", + "description": "" + }, + "popup_open_inbox": { + "message": "Open inbox", + "description": "" + }, + "popup_archive": { + "message": "Archive", + "description": "" + }, + "popup_spam": { + "message": "Spam", + "description": "" + }, + "popup_trash": { + "message": "Trash", + "description": "" + }, + "popup_refresh": { + "message": "Refresh", + "description": "" + }, + "popup_read": { + "message": "Mark as Read", + "description": "" + }, + "popup_read_all": { + "message": "Mark all as read", + "description": "" + }, + "popup_msg_1": { + "message": "just now", + "description": "" + }, + "popup_msg_2": { + "message": "1 minute ago", + "description": "" + }, + "popup_msg_3_format": { + "message": "%d minutes ago", + "description": "" + }, + "popup_msg_4": { + "message": "1 hour ago", + "description": "" + }, + "popup_msg_5": { + "message": "hours ago", + "description": "" + }, + "popup_msg_6": { + "message": "Yesterday", + "description": "" + }, + "popup_msg_7_format": { + "message": "%d days ago", + "description": "" + }, + "popup_msg_8_format": { + "message": "%d week(s) ago", + "description": "" + }, + "popup_msg_9_format": { + "message": "%d month(s) ago", + "description": "" + }, + "popup_msg_10": { + "message": "January", + "description": "" + }, + "popup_msg_11": { + "message": "February", + "description": "" + }, + "popup_msg_12": { + "message": "March", + "description": "" + }, + "popup_msg_13": { + "message": "April", + "description": "" + }, + "popup_msg_14": { + "message": "May", + "description": "" + }, + "popup_msg_15": { + "message": "June", + "description": "" + }, + "popup_msg_16": { + "message": "July", + "description": "" + }, + "popup_msg_17": { + "message": "August", + "description": "" + }, + "popup_msg_18": { + "message": "September", + "description": "" + }, + "popup_msg_19": { + "message": "October", + "description": "" + }, + "popup_msg_20": { + "message": "November", + "description": "" + }, + "popup_msg_21": { + "message": "December", + "description": "" + }, + "settings_open_title": { + "message": "Open options (settings) page", + "description": "" + }, + "settings_open_label": { + "message": "Open Options", + "description": "" + }, + "gmail": { + "message": "Notifier for Gmail™", + "description": "" + } +} diff --git a/v3.classic/_locales/be/messages.json b/v3.classic/_locales/be/messages.json new file mode 100644 index 00000000..f26c4f28 --- /dev/null +++ b/v3.classic/_locales/be/messages.json @@ -0,0 +1,620 @@ +{ + "gmail": { + "message": "Notifier for Gmail™" + }, + "toolbar_label": { + "message": "Notifier for Gmail™" + }, + "description": { + "message": "Апавяшчэнні для некалькіх ярлыкоў і ўліковых запісаў Google Mail (Gmail™)" + }, + "log_in_to_your_account": { + "message": "Увайдзіце ў свой уліковы запіс Gmail™" + }, + "msg_1": { + "message": "Укладка ўжо адкрыта. Націсніце на кнопку ў панэлі інструментаў, каб адкрыць Gmail у новай укладцы або пераключыцца на існуючую ўкладку Gmail™." + }, + "msg_2": { + "message": "Спасылка скапіявана ў буфер абмену." + }, + "msg_3": { + "message": "Вылучаны тэкст скапіяваны ў буфер абмену." + }, + "msg_4": { + "message": "Заўвага: Для правільнай працы Notifier вам трэба ўвайсці ў свой уліковы запіс Google." + }, + "msg_5": { + "message": "Выберыце аўдыяфайл" + }, + "label_1": { + "message": "Абнавіць" + }, + "label_2": { + "message": "Налады" + }, + "label_3": { + "message": "Адключыць усе апавяшчэнні" + }, + "label_4": { + "message": "На 5 хвілін" + }, + "label_5": { + "message": "На 15 хвілін" + }, + "label_6": { + "message": "На 30 хвілін" + }, + "label_7": { + "message": "На 1 гадзіну" + }, + "label_8": { + "message": "На 2 гадзіны" + }, + "label_9": { + "message": "На 5 гадзін" + }, + "label_13": { + "message": "На карыстальніцкі перыяд" + }, + "label_10": { + "message": "Уключыць апавяшчэнні (сеанс)" + }, + "label_11": { + "message": "Напісаць паведамленне" + }, + "label_12": { + "message": "Адкрыць ЧаПы" + }, + "label_14": { + "message": "Адкрыць Gmail" + }, + "label_15": { + "message": "Уключаныя ўліковыя запісы" + }, + "unknown": { + "message": "невядомы" + }, + "and": { + "message": "і" + }, + "log_into_your_account": { + "message": "Увайдзіце ў свой уліковы запіс" + }, + "notification": { + "message": "Ад: [author_email][break] Загаловак: [title][break] Зводка: [summary]" + }, + "options_title": { + "message": "Параметры - Gmail™ Notifier" + }, + "options_inshort": { + "message": "Апавяшчэнні для некалькіх ярлыкоў і ўліковых запісаў Google Mail (Gmail™)" + }, + "options_donation": { + "message": "Падтрымаць распрацоўку" + }, + "options_timings": { + "message": "Час:" + }, + "options_timings_l1": { + "message": "Правяраць пошту кожныя (у секундах):" + }, + "options_timings_l2": { + "message": "Мінімальны перыяд 10 секунд." + }, + "options_timings_l3": { + "message": "Нагадваць пра непрачытаныя паведамленні кожныя (у хвілінах):" + }, + "options_timings_l4": { + "message": "Задайце нулявое значэнне, каб апавяшчаць неперыядычна." + }, + "options_timings_l5": { + "message": "Мінімальны перыяд 5 хвілін." + }, + "options_timings_l6": { + "message": "Пры ненулявым значэнні і апавяшчэнні працоўнага стала, і гукавыя абвесткі (як і пры атрыманні новых паведамленняў) будуць з'яўляцца заўсёды, пакуль ў вас ёсць непрачытаная пошта." + }, + "options_timings_l7": { + "message": "Не правяраць пошту пры запуску на працягу (у секундах):" + }, + "options_timings_l8": { + "message": "Задайце нулявое значэнне, каб не правяраць пошту да першага ручнога абнаўлення [Недаступна ў Safari]" + }, + "options_timings_l9": { + "message": "Адсочваць ўкладкі Gmail і сеткавую актыўнасць, каб абнаўляць Notifier пры зменах." + }, + "options_timings_20": { + "message": "Кантраляваць стан бяздзейнасці сістэмы, каб абнаўляць Notifier пры аднаўленні актыўнасці." + }, + "options_gmail": { + "message": "Gmail™" + }, + "options_gmail_1": { + "message": "Асноўны ўліковы запіс (/mail/u/0/)" + }, + "options_gmail_2": { + "message": "Раздзяляйце ярлыкі з дапамогай \",\" (коскі)." + }, + "options_gmail_3": { + "message": "Другі ўліковы запіс (/mail/u/1/)" + }, + "options_gmail_4": { + "message": "Трэці ўліковы запіс (/mail/u/2/)" + }, + "options_gmail_5": { + "message": "Чацвёрты ўліковы запіс (/mail/u/3/)" + }, + "options_gmail_6": { + "message": "Пяты ўліковы запіс (/mail/u/4/)" + }, + "options_gmail_7": { + "message": "Шосты ўліковы запіс (/mail/u/5/)" + }, + "options_gmail_8": { + "message": "Пазначаць паведамленні прачытанымі пры архіваванні" + }, + "options_gmail_15": { + "message": "Папулярныя ярлыкі:" + }, + "options_gmail_10": { + "message": "Атрымліваць апавяшчэнні для наступных ярлыкоў і ўліковых запісаў:" + }, + "options_gmail_11": { + "message": "Карыстальніцкія каналы:" + }, + "options_gmail_12": { + "message": "Раздзяляйце каналы з дапамогай \",\" (коскі). Прыклад канала: https://mail.google.com/mail/u/0/feed/atom/inbox" + }, + "options_gmail_13": { + "message": "Заўвага: максімальная колькасць ярлыкоў, акрамя \"inbox\", - 20 (каналы Google выдаюць толькі 20 найноўшых запісаў)" + }, + "options_gmail_14": { + "message": "Заўвага: каб Notifier слухаў больш за 5 уліковых запісаў, дадайце URL-адрасы каналаў у поле \"Карыстальніцкія каналы\". Напрыклад, каб слухаць 6-ы і 7-ы ўліковыя запісы, дадайце: https://mail.google.com/mail/u/6/feed/atom/inbox, https://mail.google.com/mail/u/7/feed/atom/inbox" + }, + "options_notifications": { + "message": "Апавяшчэнні" + }, + "options_notifications_1": { + "message": "Паказваць апавяшчэнне на працоўным стале для новых паведамленняў" + }, + "options_notifications_2": { + "message": "Паказваць апавяшчэнне на працоўным стале на працягу (у секундах):" + }, + "options_notifications_3": { + "message": "Гэты параметр можа не працаваць у вашай АС." + }, + "options_notifications_4": { + "message": "Фармат апавяшчэнняў" + }, + "options_notifications_5": { + "message": "Даступныя пераменныя:" + }, + "options_notifications_6": { + "message": "Абразаць апавяшчэнні, даўжэйшыя за" + }, + "options_notifications_7": { + "message": "сімвал(-ы/-аў) для палёў [title] і [summary]." + }, + "options_notifications_8": { + "message": "Увядзіце тут вялікую лічбу, каб тэкст абразаўся без шматкроп'я." + }, + "options_notifications_9": { + "message": "Прайграваць гукавую абвестку пры атрыманні новых паведамленняў" + }, + "options_notifications_10": { + "message": "Заўвага для карытальнікаў Mac. У Firefox, пачынаючы ад версіі 28.0, усе апавяшчэнні працоўнага стала апрацоўваюцца Цэнтрам апавяшчэнняў Mac, што прыводзіць да дадатковай гукавой абвесткі. Вам трэба адключыць або гэта гукавое апавяшчэнне, або тое, што стварае Цэнтр апавяшчэнняў." + }, + "options_notifications_11": { + "message": "Паказваць \"Апавяшчэнне панэлі заданняў у Windows™\" або \"Апавяшчэнне док-панэлі ў Mac OS\"" + }, + "options_notifications_12": { + "message": "Апавяшчэнні панэлі заданняў на дадзены момант не падтрымліваюцца ў АС Linux." + }, + "options_notifications_13": { + "message": "Адкрываць панэль перадпрагляду пры націсканні на значок апавяшчэння панэлі заданняў (толькі Windows™, бэта)" + }, + "options_notifications_14": { + "message": "Гэта эксперыментальная функцыя, яна можа прывесці да нестабільнай працы Firefox. [Патрабуецца перазапуск]." + }, + "options_notifications_15": { + "message": "Прадвызначаны гук апавяшчэння:" + }, + "options_notifications_16": { + "message": "Прадвызначаная абвестка Gmail™ Notifier" + }, + "options_notifications_17": { + "message": "Званочак з Checker Plus" + }, + "options_notifications_18": { + "message": "\"Дзінь\" з Checker Plus" + }, + "options_notifications_19": { + "message": "Абвестка пошты з Windows™" + }, + "options_notifications_20": { + "message": "Карыстальніцкі гук" + }, + "options_notifications_21": { + "message": "Карыстальніцкі гук апавяшчэння:" + }, + "options_notifications_22": { + "message": "Калі ваш браўзер не прайграе карыстальніцкі гук апавяшчэння, паспрабуйце ператварыць яго ў фармат WAV з дапамогай анлайн інструментаў." + }, + "options_notifications_35": { + "message": "Каб выбраць новы гук, спачатку выберыце ўбудаваны гук, а потым змяніце параметр на карыстальніцкі" + }, + "options_notifications_23": { + "message": "Гучнасць гукавога апавяшчэння (у %):" + }, + "options_notifications_24": { + "message": "Узровень гучнасці - гэта лік ад 0 да 100, дзе 100 - наймацнейшая гучнасць (прадвазначана)." + }, + "options_notifications_25": { + "message": "У Safari прадвызначаныя гукі апавяшчэнняў хутчэй за ўсё не прайграюцца належным чынам, таму выкарыстоўвайце свой гукавы файл для апавяшчэнняў." + }, + "options_notifications_26": { + "message": "Заўсёды паказваць апавяшчэнне панэлі заданняў (толькі Windows™)" + }, + "options_notifications_27": { + "message": "Апавяшчэнне панэлі заданняў будзе паказвацца нават пры адсутнасці непрачытаных паведамленняў." + }, + "options_notifications_28": { + "message": "Адключыць усе апавяшчэнні на перыяд (у хвілінах):" + }, + "options_notifications_29": { + "message": "Гэты параметр адпавядае пункту меню правай кнопкі мышы на кнопцы ў панэлі інструментаў -> адключыць усе апавяшчэнні -> карыстальніцкі перыяд." + }, + "options_notifications_30": { + "message": "Аб'ядноўваць усе адначасовыя апавяшчэнні працоўнага стала ў адно" + }, + "options_notifications_31": { + "message": "Карыстальніцкае апавяшчэнне для" + }, + "options_notifications_32": { + "message": "імя або адрас змяшчае" + }, + "options_notifications_33": { + "message": "загаловак паведамлення змяшчае" + }, + "options_notifications_34": { + "message": "зводка паведамлення змяшчае" + }, + "options_notifications_36": { + "message": "Папрасіць Gmail™ не перанакіроўваць на 'inbox.google.com'" + }, + "options_notifications_37": { + "message": "Паказваць колькасць непрачытаных паведамленняў на значку (і выбраць колер значка)" + }, + "options_notifications_38": { + "message": "Хуткія дзеянні (пазначыць прачынатым, выдаліць, ...) (Дзеянні, якія трэба выканаць пры атрыманні загалоўкаў)" + }, + "options_notifications_40": { + "message": "Дазволіць хуткія дзеянні з акна апавяшчэння (не больш за два дзеянні, толькі Chrome)" + }, + "options_notifications_41": { + "message": "У прачытанае" + }, + "options_notifications_42": { + "message": "У архіў" + }, + "options_notifications_43": { + "message": "У сметніцу" + }, + "options_notifications_44": { + "message": "Прайграваць гукавое апавяшчэнне ў наступных станах:" + }, + "options_notifications_45": { + "message": "Актыўны" + }, + "options_notifications_46": { + "message": "Рэжым чакання" + }, + "options_notifications_47": { + "message": "Заблакіраваны" + }, + "options_notifications_48": { + "message": "Паказваць апавяшчэнне на працоўным стале ў наступных станах:" + }, + "options_tab": { + "message": "Адкрыццё ўкладкі:" + }, + "options_tab_1": { + "message": "Шукаць адкрытую ўкладку Gmail™ толькі ў актыўным акне" + }, + "options_tab_2": { + "message": "Не шукаць адкрытую ўкладку Gmail™ у іншых вокнах браўзера. Калі Gmail™ не адкрыты ў актыўным акне, адкрываць новую ўкладку." + }, + "options_tab_3": { + "message": "Адкрываць уліковы запіс Gmail™ побач з актыўнай укладкай" + }, + "options_tab_4": { + "message": "Адкрываць уліковы запіс Gmail™ у актыўнай укладцы" + }, + "options_tab_5": { + "message": "Адкрываць уліковы запіс Gmail™ у фонавай укладцы" + }, + "options_tab_6": { + "message": "Адкрываць уліковы запіс Gmail™ у новым акне" + }, + "options_tab_7": { + "message": "Заўсёды выкарыстоўваць пустыя ўкладкі замест таго, каб адкрываць новыя, калі ўключана адкрыванне ўкладкі." + }, + "options_tab_8": { + "message": "Ігнараваць адкрытыя ўкладкі Gmail™" + }, + "options_tab_9": { + "message": "Калі пазначана, notifier адкрывае паведамленні ў новых укладках браўзера. Калі не пазначана, ён спачатку будзе шукаць у актыўным акне існуючую ўкладку Gmail™ і пераключыцца на яе. Калі не знойдзе, ён будзе шукаць іншыя адкрытыя вокны перад тым, як адкрыць новую ўкладку." + }, + "options_tab_10": { + "message": "Адкрываць паведамленні ў рэжыме базавага HTML" + }, + "options_tab_11": { + "message": "Пры націску на загаловак непрачытанага паведамлення адкрываецца гэта самае паведамленне ў Gmail™, а не папка \"Уваходныя\"" + }, + "options_toolbar": { + "message": "Панэль інструментаў" + }, + "options_toolbar_1": { + "message": "Паводзіны кнопкі" + }, + "options_toolbar_2": { + "message": "Заўсёды адкрываць панэль перадпрагляду" + }, + "options_toolbar_3": { + "message": "Адкрываць Gmail™, калі выкананы ўваход толькі ў адзін уліковы запіс" + }, + "options_toolbar_18": { + "message": "Адкрыць уліковы запіс Gmail™ (прымусова)" + }, + "options_toolbar_4": { + "message": "Рэжым панэлі перадпрагляду" + }, + "options_toolbar_5": { + "message": "Паказваць толькі зводку" + }, + "options_toolbar_6": { + "message": "Паказваць усё змесціва" + }, + "options_toolbar_7": { + "message": "Шырыня панэлі перадпрагляду ў рэжыме прагляду ўсяго змесціва (у пікселах):" + }, + "options_toolbar_8": { + "message": "Мінімальная шырыня 500 пкс." + }, + "options_toolbar_9": { + "message": "Вышыня панэлі перадпрагляду ў рэжыме прагляду ўсяго змесціва (у пікселах):" + }, + "options_toolbar_10": { + "message": "Мінімальная вышыня 500 пкс." + }, + "options_toolbar_11": { + "message": "Падтрымліваць спалучэнні клавіш клавіятуры ў панэлі перадпрагляду" + }, + "options_toolbar_12": { + "message": "У спам: , У сметніцу: <#>, У архіў: , У прачытанае: ." + }, + "options_toolbar_13": { + "message": "Апрацоўваць паведамленні як HTML у рэжыме прагляду ўсяго змесціва" + }, + "options_toolbar_14": { + "message": "Здыміце пазнаку, калі жадаеце апрацоўваць паведамленні ў рэжыме поўнага прагляду, як звычайны тэкст." + }, + "options_toolbar_15": { + "message": "Націсканне сярэдній кнопкай мышы па кнопцы ў панэлі інструментаў" + }, + "options_toolbar_16": { + "message": "Абнавіць усе ўліковыя запісы" + }, + "options_toolbar_17": { + "message": "Адкрыць асноўны ўліковы запіс Gmail™" + }, + "options_misc": { + "message": "Рознае" + }, + "options_misc_1": { + "message": "Сартаваць уліковыя запісы ў алфавітным парадку" + }, + "options_misc_2": { + "message": "Прадвызначаны парадак - па чарзе ўваходу ва ўліковы запіс." + }, + "options_misc_3": { + "message": "Колеры значка ў панэлі інструментаў:" + }, + "options_misc_4": { + "message": "Шэры - \"Няма непрачытаных\" , сіні - \"Адключаны\"" + }, + "options_misc_5": { + "message": "Сіні - \"Няма непрачытаных\" , шэры - \"Адключаны\"" + }, + "options_misc_9": { + "message": "Чырвоны - \"Няма непрачытаных\" , шэры - \"Адключаны\"" + }, + "options_misc_6": { + "message": "Паказаць апавяшчэнне на працоўным стале, каб папярэдзіць, што Gmail™ ужо адкрыты ў актыўнай укладцы" + }, + "options_misc_7": { + "message": "Паказваць прывітальную старонку пасля абнаўлення" + }, + "options_misc_8": { + "message": "Скінуць усе налады да завадскіх" + }, + "options_misc_10": { + "message": "Запускаць гукавыя апавяшчэнні і апавяшчэнні на працоўным стале, толькі калі паведамленне прыйшло менш чым за (у хвілінах):" + }, + "options_misc_11": { + "message": "Пры заданні нулявога значэння вы не будзеце атрымліваць апавяшчэнні працоўнага стала і гукавыя апавяшчэнні, але значок апавяшчэння вы па ранейшаму будзеце бачыць." + }, + "options_misc_12": { + "message": "Не ўключаць звесткі аб уліковым запісе ў тэкст усплывальнай падказкі" + }, + "options_misc_13": { + "message": "Прадвызначана Notifier абнаўляе ўсплывальную падказку кнопкі інфармацыяй аб уліковым запісе. Пры знятай пазнацы тэкст усплывальнай падказкі застаецца прадвызначаным." + }, + "options_misc_14": { + "message": "Не паказваць дакладную лічбу ў значку, калі непрачытаных паведамленняў больш за 999" + }, + "options_misc_15": { + "message": "Адкрываць ЧаПы пасля абнаўлення" + }, + "options_misc_16": { + "message": "Колеравая тэма панэлі:" + }, + "options_misc_17": { + "message": "Светлая" + }, + "options_misc_18": { + "message": "Цёмная" + }, + "options_misc_19": { + "message": "Сістэмная" + }, + "options_misc_20": { + "message": "Скінуць гісторыю для \"Уключаных уліковых запісаў\"" + }, + "options_misc_21": { + "message": "Скінуць уліковыя запісы" + }, + "options_plugins": { + "message": "Плагіны" + }, + "options_plugins_1": { + "message": "Кнопка зоркі і ярлыкі Gmail™ (эксперыментальнае)" + }, + "options_plugins_2": { + "message": "Гэты плагін паказвае кнопку зоркі і ярлыкі размоў у панэлі перадпрагляду (толькі ў разгорнутым рэжыме)." + }, + "options_styling": { + "message": "Стыль" + }, + "options_styling_0": { + "message": "Маштаб прагляду электроннай пошты (0,5-4)" + }, + "options_styling_1": { + "message": "Карыстальніцкія правілы CSS для верхняй панэлі" + }, + "options_styling_2": { + "message": "Карыстальніцкія правілы CSS для прагляду электроннай пошты" + }, + "options_px": { + "message": "пкс." + }, + "options_empty": { + "message": "не вызначана" + }, + "options_button_test": { + "message": "Прайграць гук" + }, + "options_button_reset": { + "message": "Скінуць параметры" + }, + "popup_settings": { + "message": "Налады" + }, + "popup_of": { + "message": "з" + }, + "popup_wait": { + "message": "Пачакайце..." + }, + "popup_date_format": { + "message": "%dd %mm %yy" + }, + "popup_no_subject": { + "message": "(без тэмы)" + }, + "popup_open_settings": { + "message": "Адкрыць налады" + }, + "popup_open_inbox": { + "message": "Адкрыць Уваходныя" + }, + "popup_archive": { + "message": "У архіў" + }, + "popup_spam": { + "message": "У спам" + }, + "popup_trash": { + "message": "У сметніцу" + }, + "popup_refresh": { + "message": "Абнавіць" + }, + "popup_read": { + "message": "У прачытанае" + }, + "popup_read_all": { + "message": "Усё ў прачытанае" + }, + "popup_toggle_dark": { + "message": "Уключэнне і выключэнне цёмнай тэмы" + }, + "popup_msg_1": { + "message": "толькі што" + }, + "popup_msg_2": { + "message": "1 хвіліну таму" + }, + "popup_msg_3_format": { + "message": "%d хв. таму" + }, + "popup_msg_4": { + "message": "1 гадзіну таму" + }, + "popup_msg_5": { + "message": "г. таму" + }, + "popup_msg_6": { + "message": "Учора" + }, + "popup_msg_7_format": { + "message": "%d дз. таму" + }, + "popup_msg_8_format": { + "message": "%d тыд. таму" + }, + "popup_msg_9_format": { + "message": "%d мес. таму" + }, + "popup_msg_10": { + "message": "Студзень" + }, + "popup_msg_11": { + "message": "Люты" + }, + "popup_msg_12": { + "message": "Сакавік" + }, + "popup_msg_13": { + "message": "Красавік" + }, + "popup_msg_14": { + "message": "Травень" + }, + "popup_msg_15": { + "message": "Чэрвень" + }, + "popup_msg_16": { + "message": "Ліпень" + }, + "popup_msg_17": { + "message": "Жнівень" + }, + "popup_msg_18": { + "message": "Верасень" + }, + "popup_msg_19": { + "message": "Кастрычнік" + }, + "popup_msg_20": { + "message": "Лістапад" + }, + "popup_msg_21": { + "message": "Снежань" + }, + "settings_open_title": { + "message": "Адкрыць старонку параметраў (налад)" + }, + "settings_open_label": { + "message": "Адкрыць параметры" + } +} diff --git a/v3.classic/_locales/bg/messages.json b/v3.classic/_locales/bg/messages.json new file mode 100644 index 00000000..08d80db6 --- /dev/null +++ b/v3.classic/_locales/bg/messages.json @@ -0,0 +1,758 @@ +{ + "toolbar_label": { + "message": "Notifier for Gmail™", + "description": "" + }, + "tooltip_1": { + "message": "Щракване с ляво копче: Отваряне на пощата или панела за предварителен преглед", + "description": "" + }, + "tooltip_2": { + "message": "Щракване със средно копче (или Контрол + Ляво): Обновяване на всички сметки", + "description": "" + }, + "tooltip_3": { + "message": "Щракване с дясно копче: Избор на сметка", + "description": "" + }, + "description": { + "message": "Известител за няколко профила в пощата на Гугъл (Джимейл)", + "description": "" + }, + "log_in_to_your_account": { + "message": "Моля, влезте в профила си в пощата на Гугъл", + "description": "" + }, + "msg_1": { + "message": "Подпрозорецът вече е отворен. Натиснете копчето на лентата, за да отворите пощата в нов подпрозорец или да преминете към вече отворен раздел.", + "description": "" + }, + "msg_2": { + "message": "Връзката е копирана в буфера.", + "description": "" + }, + "msg_3": { + "message": "Избраният текст е копиран в буфера.", + "description": "" + }, + "msg_4": { + "message": "Бележка: За да работи правилно известителя, трябва да сте влезли в профила си в Гугъл.", + "description": "" + }, + "msg_5": { + "message": "Изберете звуков файл", + "description": "" + }, + "label_1": { + "message": "Обновяване", + "description": "" + }, + "label_2": { + "message": "Настройки", + "description": "" + }, + "label_3": { + "message": "Изключване на известията", + "description": "" + }, + "label_4": { + "message": "За 5 минути", + "description": "" + }, + "label_5": { + "message": "За 15 минути", + "description": "" + }, + "label_6": { + "message": "За 30 минути", + "description": "" + }, + "label_7": { + "message": "За 1 час", + "description": "" + }, + "label_8": { + "message": "За 2 часа", + "description": "" + }, + "label_9": { + "message": "За 5 часа", + "description": "" + }, + "label_13": { + "message": "За избран период", + "description": "" + }, + "label_10": { + "message": "Enable notifications (session)", + "description": "" + }, + "label_11": { + "message": "Писане на писмо", + "description": "" + }, + "label_12": { + "message": "Отваряне на въпросника", + "description": "" + }, + "label_14": { + "message": "Вписани сметки", + "description": "" + }, + "unknown": { + "message": "неизвестно", + "description": "" + }, + "and": { + "message": "и", + "description": "" + }, + "log_into_your_account": { + "message": "Моля, влезте в сметката си", + "description": "" + }, + "notification": { + "message": "От: [author_email][break] Заглавие: [title][break] Обобщение: [summary]", + "description": "" + }, + "options_title": { + "message": "Настройки", + "description": "" + }, + "options_inshort": { + "message": "Известител за няколко профила в пощата на Гугъл (Джимейл).", + "description": "" + }, + "options_donation": { + "message": "Support Development", + "description": "" + }, + "options_timings": { + "message": "Timings:", + "description": "" + }, + "options_timings_l1": { + "message": "Проверка за нови писма на всеки (в секунди):", + "description": "" + }, + "options_timings_l2": { + "message": "Минималният период е 10 секунди.", + "description": "" + }, + "options_timings_l3": { + "message": "Напомняне за непрочетени писма на всеки (в минути):", + "description": "" + }, + "options_timings_l4": { + "message": "Задайте стойността на нула за непериодични напомняния.", + "description": "" + }, + "options_timings_l5": { + "message": "Минималният период е 5 минути.", + "description": "" + }, + "options_timings_l6": { + "message": "Ако имате непрочетени писма, стойностите, различни от нула, пускат оповестителен звук и известия на работния плот безкрайно.", + "description": "" + }, + "options_timings_l7": { + "message": "Без проверка за нови писма при стартиране (в секунди):", + "description": "" + }, + "options_timings_l8": { + "message": "Задайте стойността на нула, за да не се проверява за нови писма до първото ръчно обновяване [Не е налично в Сафари].", + "description": "" + }, + "options_gmail": { + "message": "Поща на Гугъл:", + "description": "" + }, + "options_gmail_1": { + "message": "Главна сметка (/mail/u/0/)", + "description": "" + }, + "options_gmail_2": { + "message": "Разделяйте етикетите със \",\" (запетая).", + "description": "" + }, + "options_gmail_3": { + "message": "Втора сметка (/mail/u/1/)", + "description": "" + }, + "options_gmail_4": { + "message": "Трета сметка (/mail/u/2/)", + "description": "" + }, + "options_gmail_5": { + "message": "Четвърта сметка (/mail/u/3/)", + "description": "" + }, + "options_gmail_6": { + "message": "Пета сметка (/mail/u/4/)", + "description": "" + }, + "options_gmail_7": { + "message": "Шеста сметка (/mail/u/5/)", + "description": "" + }, + "options_gmail_8": { + "message": "Отбелязване на писмото като прочетено при архвиране", + "description": "" + }, + "options_gmail_15": { + "message": "Some popular labels:", + "description": "" + }, + "options_gmail_10": { + "message": "Получаване на известия за следните етикети и сметки:", + "description": "" + }, + "options_gmail_11": { + "message": "Потребителски емисии:", + "description": "" + }, + "options_gmail_12": { + "message": "Отделяйте емисиите със \",\" (запетая). Примерна емисия: https://mail.google.com/mail/u/0/feed/atom/inbox", + "description": "" + }, + "options_gmail_13": { + "message": "Note: maximum number for all labels except \"inbox\" is 20 (Google feeds only supply the 20 newest entries)", + "description": "" + }, + "options_gmail_14": { + "message": "Note: for the Notifier to listen for more than 5 accounts, add feeds URLs to the \"Custom feeds\" field. For instance to listen to the 6 and 7th accounts add: https://mail.google.com/mail/u/6/feed/atom/inbox, https://mail.google.com/mail/u/7/feed/atom/inbox", + "description": "" + }, + "options_notifications": { + "message": "Известия:", + "description": "" + }, + "options_notifications_1": { + "message": "Показване на известия на работния плот за нови писма", + "description": "" + }, + "options_notifications_2": { + "message": "Показване на известия на работния плот за (в секунди):", + "description": "" + }, + "options_notifications_3": { + "message": "Тази функция може да не работи на вашата операционна система.", + "description": "" + }, + "options_notifications_4": { + "message": "Формат на известията", + "description": "" + }, + "options_notifications_5": { + "message": "Налични променливи:", + "description": "" + }, + "options_notifications_6": { + "message": "Съкращаване на известията, по-дълги от", + "description": "" + }, + "options_notifications_7": { + "message": "символа за полетата [заглавие] и [обобщение].", + "description": "" + }, + "options_notifications_8": { + "message": "Ако искате да няма многоточие, използвайте по-голямо число.", + "description": "" + }, + "options_notifications_9": { + "message": "Свирене на звуково оповестяване за нови писма", + "description": "" + }, + "options_notifications_10": { + "message": "Бележка за потребителите на Макинтош. От Файърфокс 28.0, всички известия на работния плот ще се управляват от Центъра за известия, което поражда допълнително звуково оповестяване. Трябва да изключите или това оповестяване, или оповестяването в Центъра за известия.", + "description": "" + }, + "options_notifications_11": { + "message": "Показване на \"Известие в лентата със задачи на Уиндоус\" или \"Известие в лентата на Макинтош\"", + "description": "" + }, + "options_notifications_12": { + "message": "В момента не се поддържат известия в лентата със задачи под Линукс.", + "description": "" + }, + "options_notifications_13": { + "message": "Отваряне на панела при щракване върху иконката в лентата на задачите (Само за Уиндоус, в бета)", + "description": "" + }, + "options_notifications_14": { + "message": "Тази функция е експериментална и може да направи разглеждача Файърфокс нестабилен. [Изисква се повторно пускане].", + "description": "" + }, + "options_notifications_15": { + "message": "Звуковото известие по подразбиране е", + "description": "" + }, + "options_notifications_16": { + "message": "Оповестяване по подразбиране", + "description": "" + }, + "options_notifications_17": { + "message": "Камбана", + "description": "" + }, + "options_notifications_18": { + "message": "Звънене", + "description": "" + }, + "options_notifications_19": { + "message": "Оповестяване за поща на Уиндоус", + "description": "" + }, + "options_notifications_20": { + "message": "Потребителски звук", + "description": "" + }, + "options_notifications_21": { + "message": "Потребителският оповестителен звук е", + "description": "" + }, + "options_notifications_22": { + "message": "Ако четецът ви не възпроизвежда потребителския звук, опитайте се да го преобразувате във формат WAV.", + "description": "" + }, + "options_notifications_35": { + "message": "За да изберете нов потребителски звук, първо изберете вграден звук и след това променете настройката на потребителски.", + "description": "" + }, + "options_notifications_23": { + "message": "Гръмкостта на звуковото оповестяване е", + "description": "" + }, + "options_notifications_24": { + "message": "Гръмкостта е число между 0 и 100, където 100 е най-високото (по подразбиране).", + "description": "" + }, + "options_notifications_25": { + "message": "В Сафари първоначалното звуково известяване може да не работи. Ако е така, използвайте потребителски файл.", + "description": "" + }, + "options_notifications_26": { + "message": "Винаги да се показват известия в областта за уведомяване (само за Уиндоус)", + "description": "" + }, + "options_notifications_27": { + "message": "Известията в областта за уведомяване ще се показват дори ако няма непрочетени писма.", + "description": "" + }, + "options_notifications_28": { + "message": "Изключване на всички известия за избран период (в минути):", + "description": "" + }, + "options_notifications_29": { + "message": "Тази настройка е свързана с менюто на копчето -> изключване на всички известия -> избран период.", + "description": "" + }, + "options_notifications_30": { + "message": "Обединяване на всички едновременни известия на работния плот в едно известие", + "description": "" + }, + "options_notifications_31": { + "message": "Custom sound notification", + "description": "" + }, + "options_notifications_32": { + "message": "name or email contains", + "description": "" + }, + "options_notifications_33": { + "message": "заглавието на писмото съдържа", + "description": "" + }, + "options_notifications_34": { + "message": "обобщението на писмото съдържа", + "description": "" + }, + "options_notifications_36": { + "message": "Ask Gmail to prevent 'inbox.google.com' redirection", + "description": "" + }, + "options_notifications_37": { + "message": "Display Badge number", + "description": "" + }, + "options_notifications_38": { + "message": "Faster actions (mark as read, delete, ...) (Consider actions to be resolved when headers are received)", + "description": "" + }, + "options_notifications_40": { + "message": "Allow quick actions from notification box (maximum two actions) (Chrome only)", + "description": "" + }, + "options_notifications_41": { + "message": "Mark as Read", + "description": "" + }, + "options_notifications_42": { + "message": "Archive", + "description": "" + }, + "options_notifications_43": { + "message": "Trash", + "description": "" + }, + "options_tab": { + "message": "Отваряне на подпрозорец:", + "description": "" + }, + "options_tab_1": { + "message": "Търсене за отворена сметка само в активния прозорец", + "description": "" + }, + "options_tab_2": { + "message": "Без търсене в други прозорци за отворени сметки. Ако пощата не е отворена в активния прозорец, да се отвори нов подпрозорец.", + "description": "" + }, + "options_tab_3": { + "message": "Отваряне на пощата до активния подпрозорец", + "description": "" + }, + "options_tab_4": { + "message": "Отваряне на пощата в активния подпрозорец", + "description": "" + }, + "options_tab_5": { + "message": "Отваряне на пощата в подпрозорец на заден план", + "description": "" + }, + "options_tab_6": { + "message": "Отваряне на пощата в нов прозорец", + "description": "" + }, + "options_tab_7": { + "message": "Винаги да се използват празни подпрозорци вместо да се отваря нов, когато е включено отварянето в подпрозорци", + "description": "" + }, + "options_tab_8": { + "message": "Пренебрегване на отворените подпрозорци с пощата на Гугъл", + "description": "" + }, + "options_tab_9": { + "message": "Ако не е отметнато, известителят проверява активния подпрозорец или всички отворени прозорци за отворена поща и превключва на нея при изискване на отварянето на подпрозорец.", + "description": "" + }, + "options_tab_10": { + "message": "Open emails in basic HTML mode", + "description": "" + }, + "options_toolbar": { + "message": "Лента:", + "description": "" + }, + "options_toolbar_1": { + "message": "Поведение на копчето на лентата", + "description": "" + }, + "options_toolbar_2": { + "message": "Винаги да се отваря панел с предварителен преглед", + "description": "" + }, + "options_toolbar_3": { + "message": "Отваряне на пощата ако се използва само една сметка", + "description": "" + }, + "options_toolbar_18": { + "message": "Open Gmail account (forced)", + "description": "" + }, + "options_toolbar_4": { + "message": "Режим на панела", + "description": "" + }, + "options_toolbar_5": { + "message": "Показване само на обобщение", + "description": "" + }, + "options_toolbar_6": { + "message": "Показване на цялото съдържание", + "description": "" + }, + "options_toolbar_7": { + "message": "Ширина на панела в режим на преглед на цялото съдържание (в пиксели):", + "description": "" + }, + "options_toolbar_8": { + "message": "Минималната ширина е 500 пиксела.", + "description": "" + }, + "options_toolbar_9": { + "message": "Височина на панела в режим на преглед на цялото съдържание (в пиксели):", + "description": "" + }, + "options_toolbar_10": { + "message": "Минималната височина е 500 пиксела.", + "description": "" + }, + "options_toolbar_11": { + "message": "Поддръжка на клавишни комбинации в панела", + "description": "" + }, + "options_toolbar_12": { + "message": "!: Докладване като спам, #: Кошче, e: Архив, Shift + i: Отбелязване като прочетено.", + "description": "" + }, + "options_toolbar_13": { + "message": "Извеждане на писмата като ЕМХТ (HTML) в режима на цяло съдържание", + "description": "" + }, + "options_toolbar_14": { + "message": "Ако предпочитате само текст в режима на цяло съдържание, махнете отметката.", + "description": "" + }, + "options_toolbar_15": { + "message": "Натискане със средното копче върху лентата", + "description": "" + }, + "options_toolbar_16": { + "message": "Обновяване на всички сметки", + "description": "" + }, + "options_toolbar_17": { + "message": "Отваряне на главната сметка", + "description": "" + }, + "options_misc": { + "message": "Разни:", + "description": "" + }, + "options_misc_1": { + "message": "Подреждане на сметките по азбучен ред", + "description": "" + }, + "options_misc_2": { + "message": "По подразбиране се сортира по ред на влизане.", + "description": "" + }, + "options_misc_3": { + "message": "Цвят на иконката на лентата", + "description": "" + }, + "options_misc_4": { + "message": "Сив цвят за \"Няма непрочетени\" и син цвят за \"Няма връзка\"", + "description": "" + }, + "options_misc_5": { + "message": "Син цвят за \"Няма непрочетени\" и сив цвят за \"Няма връзка\"", + "description": "" + }, + "options_misc_9": { + "message": "Червен цвят за \"Няма непрочетени\" и сив цвят за \"Няма връзка\"", + "description": "" + }, + "options_misc_6": { + "message": "Показване на известия на работния плот, които указват дали пощата е отворена в активния подпрозорец", + "description": "" + }, + "options_misc_7": { + "message": "Показване на приветстващата страница при надграждане", + "description": "" + }, + "options_misc_8": { + "message": "Нулиране на всички настройки към първоначалните", + "description": "" + }, + "options_misc_10": { + "message": "Да се появяват известия на работния плот и звукови оповестявания само за писма, пристигнали по-рано от (в минути):", + "description": "" + }, + "options_misc_11": { + "message": "Ако стойността се зададе на нула, няма да получавате нито звукови оповестявания, нито известия на работния плот. Ще работи само значката за известия.", + "description": "" + }, + "options_misc_12": { + "message": "Без входни детайли в подсказките", + "description": "" + }, + "options_misc_13": { + "message": "По подразбиране, известителят обновява подсказките на копчето с входна информация. Ако изчистите отметката, текста в подсказката ще остане на първоначалната стойност.", + "description": "" + }, + "options_misc_14": { + "message": "Без показване на точния брой в значката, когато непрочетените писма надхвърлят 999", + "description": "" + }, + "options_misc_15": { + "message": "Open FAQs page on updates", + "description": "" + }, + "options_plugins": { + "message": "Plug-ins:", + "description": "" + }, + "options_plugins_1": { + "message": "Gmail labels and star button (experimental)", + "description": "" + }, + "options_plugins_2": { + "message": "This plugin displays the star button as well as thread's labels in the popup (expanded mode only).", + "description": "" + }, + "options_px": { + "message": "px", + "description": "" + }, + "options_empty": { + "message": "не е обозначено", + "description": "" + }, + "options_button_test": { + "message": "Play", + "description": "" + }, + "options_button_reset": { + "message": "Reset Preferences", + "description": "" + }, + "popup_settings": { + "message": "настройки", + "description": "" + }, + "popup_of": { + "message": "of", + "description": "" + }, + "popup_wait": { + "message": "Изчакайте...", + "description": "" + }, + "popup_date_format": { + "message": "%mm %dd, %yy", + "description": "" + }, + "popup_no_subject": { + "message": "(няма тема)", + "description": "" + }, + "popup_open_settings": { + "message": "Отваряне на настройките", + "description": "" + }, + "popup_open_inbox": { + "message": "Отваряне на входящата кутия", + "description": "" + }, + "popup_archive": { + "message": "Архив", + "description": "" + }, + "popup_spam": { + "message": "Спам", + "description": "" + }, + "popup_trash": { + "message": "Кошче", + "description": "" + }, + "popup_refresh": { + "message": "Презареждане", + "description": "" + }, + "popup_read": { + "message": "Отбелязване като прочетено", + "description": "" + }, + "popup_read_all": { + "message": "Отбелязване на всички като прочетени", + "description": "" + }, + "popup_msg_1": { + "message": "Току-що", + "description": "" + }, + "popup_msg_2": { + "message": "Преди 1 минута", + "description": "" + }, + "popup_msg_3_format": { + "message": "Преди %d минути", + "description": "" + }, + "popup_msg_4": { + "message": "Преди 1 час", + "description": "" + }, + "popup_msg_5": { + "message": "часа назад", + "description": "" + }, + "popup_msg_6": { + "message": "Вчера", + "description": "" + }, + "popup_msg_7_format": { + "message": "Преди %d дена", + "description": "" + }, + "popup_msg_8_format": { + "message": "Преди %d седмица(и)", + "description": "" + }, + "popup_msg_9_format": { + "message": "Преди %d месец(а)", + "description": "" + }, + "popup_msg_10": { + "message": "Януари", + "description": "" + }, + "popup_msg_11": { + "message": "Февруари", + "description": "" + }, + "popup_msg_12": { + "message": "Март", + "description": "" + }, + "popup_msg_13": { + "message": "Април", + "description": "" + }, + "popup_msg_14": { + "message": "Май", + "description": "" + }, + "popup_msg_15": { + "message": "Юни", + "description": "" + }, + "popup_msg_16": { + "message": "Юли", + "description": "" + }, + "popup_msg_17": { + "message": "Август", + "description": "" + }, + "popup_msg_18": { + "message": "Септември", + "description": "" + }, + "popup_msg_19": { + "message": "Октомври", + "description": "" + }, + "popup_msg_20": { + "message": "Ноември", + "description": "" + }, + "popup_msg_21": { + "message": "Декември", + "description": "" + }, + "settings_open_title": { + "message": "Отваряне на страницата с настройките", + "description": "" + }, + "settings_open_label": { + "message": "Отваряне на настройките", + "description": "" + }, + "gmail": { + "message": "Notifier for Gmail™", + "description": "" + } +} \ No newline at end of file diff --git a/v3.classic/_locales/ca/messages.json b/v3.classic/_locales/ca/messages.json new file mode 100644 index 00000000..8a1e1eac --- /dev/null +++ b/v3.classic/_locales/ca/messages.json @@ -0,0 +1,762 @@ +{ + "toolbar_label": { + "message": "Notificador per a Gmail™", + "description": "" + }, + "tooltip_1": { + "message": "Clic esquerre: Obre Gmail o el tauler de previsualització del correu", + "description": "" + }, + "tooltip_2": { + "message": "Clic del mig (o Control+Clic esquerre): Actualitza tots els comptes", + "description": "" + }, + "tooltip_3": { + "message": "Clic dret: seleccions de compte", + "description": "" + }, + "description": { + "message": "Notificador d'etiquetes i comptes múltiples per a Google Mail (Gmail)", + "description": "" + }, + "log_in_to_your_account": { + "message": "Si us plau, accedeix al teu compte de Gmail", + "description": "" + }, + "msg_1": { + "message": "La pestanya ja s'ha obert. Fes clic al botó de la barra d'eines per obrir Gmail en una nova pestanya o selecciona una pestanya de Gmail existent.", + "description": "" + }, + "msg_2": { + "message": "S'ha copiat l'enllaç al porta-retalls.", + "description": "" + }, + "msg_3": { + "message": "S'ha copiat el text seleccionat al porta-retalls.", + "description": "" + }, + "msg_4": { + "message": "Nota: per tal que el notificador funcioni correctament, cal estar connectat al compte de Google.", + "description": "" + }, + "msg_5": { + "message": "Selecciona un fitxer de so", + "description": "" + }, + "label_1": { + "message": "Actualitza", + "description": "" + }, + "label_2": { + "message": "Opcions", + "description": "" + }, + "label_3": { + "message": "Deshabilitar totes les notificacions", + "description": "" + }, + "label_4": { + "message": "Durant 5 minuts", + "description": "" + }, + "label_5": { + "message": "Durant 15 minuts", + "description": "" + }, + "label_6": { + "message": "Durant 30 minuts", + "description": "" + }, + "label_7": { + "message": "Durant 1 hora", + "description": "" + }, + "label_8": { + "message": "Durant 2 hores", + "description": "" + }, + "label_9": { + "message": "Durant 5 hores", + "description": "" + }, + "label_13": { + "message": "Durant un període de temps personalitzat", + "description": "" + }, + "label_10": { + "message": "Habilitar notificacions (sessió)", + "description": "" + }, + "label_11": { + "message": "Redacta un correu electrònic", + "description": "" + }, + "label_12": { + "message": "Obrir PMFs", + "description": "" + }, + "label_14": { + "message": "Comptes connectats", + "description": "" + }, + "unknown": { + "message": "desconegut", + "description": "" + }, + "and": { + "message": "i", + "description": "" + }, + "log_into_your_account": { + "message": "Si us plau, connecta't al compte", + "description": "" + }, + "notification": { + "message": "De: [author_email][break]Títol: [title][break]Contingut: [summary]", + "description": "" + }, + "options_title": { + "message": "Opcions - Gmail™ Notifier", + "description": "" + }, + "options_inshort": { + "message": "Notificador d'etiquetes i comptes múltiples per a Google Mail (Gmail).", + "description": "" + }, + "options_donation": { + "message": "Dona suport al desenvolupament", + "description": "" + }, + "options_timings": { + "message": "Temporitzadors:", + "description": "" + }, + "options_timings_l1": { + "message": "Comprova nous correus electrònics cada (en segons):", + "description": "" + }, + "options_timings_l2": { + "message": "El període mínim són 10 segons.", + "description": "" + }, + "options_timings_l3": { + "message": "Recorda tots els correus electrònics sense llegir cada (en minuts):", + "description": "" + }, + "options_timings_l4": { + "message": "Estableix el valor a zero per a recordatoris no periòdics.", + "description": "" + }, + "options_timings_l5": { + "message": "El període mínim són 5 minuts.", + "description": "" + }, + "options_timings_l6": { + "message": "Els valors diferents de zero dispararan notificacions d'escriptori i alertes sonores (semblants a l'arribada d'un nou correu electrònic) eternament si té correus electrònics sense llegir.", + "description": "" + }, + "options_timings_l7": { + "message": "No comprovar nous correus electrònics en obrir durant (en segons):", + "description": "" + }, + "options_timings_l8": { + "message": "Estableix el valor a zero per no comprovar els correus electrònics fins a la primera actualització manual (No disponible a Safari].", + "description": "" + }, + "options_gmail": { + "message": "Gmail:", + "description": "" + }, + "options_gmail_1": { + "message": "Compte principal (/mail/u/0/)", + "description": "" + }, + "options_gmail_2": { + "message": "Separa les etiquetes amb \",\" (coma).", + "description": "" + }, + "options_gmail_3": { + "message": "Compte secundari (/mail/u/1)", + "description": "" + }, + "options_gmail_4": { + "message": "Compte terciari (/mail/u/2/)", + "description": "" + }, + "options_gmail_5": { + "message": "Compte quaternari (/mail/u/3/)", + "description": "" + }, + "options_gmail_6": { + "message": "Compte quinari (/mail/u/4/)", + "description": "" + }, + "options_gmail_7": { + "message": "Compte senari (/mail/u/5/)", + "description": "" + }, + "options_gmail_8": { + "message": "Marca el missatge com a llegit en el moment d'arxivar-lo", + "description": "" + }, + "options_gmail_15": { + "message": "Algunes etiquetes populars:", + "description": "" + }, + "options_gmail_10": { + "message": "Rebre notificacions per a les següents etiquetes i comptes:", + "description": "" + }, + "options_gmail_11": { + "message": "Canals personalitzats", + "description": "" + }, + "options_gmail_12": { + "message": "Separa els canals amb \",\" (coma). Canal d'exemple: https://mail.google.com/mail/u/0/feed/atom/inbox", + "description": "" + }, + "options_gmail_13": { + "message": "Nota: el número màxim per a totes les etiquetes excepte \"safata d'entrada\" és 20 (Google només dona la informació per a les 20 entrades més recents)", + "description": "" + }, + "options_gmail_14": { + "message": "Nota: per tal que el Notificador comprovi més de 5 comptes, afegeix-ne les adreces al camp \"Canals personalitzats\". Per exemple, per comprovar els comptes sisè i setè, afegeix: https://mail.google.com/mail/u/6/feed/atom/inbox, https://mail.google.com/mail/u/7/feed/atom/inbox", + "description": "" + }, + "options_notifications": { + "message": "Notificacions:", + "description": "" + }, + "options_notifications_1": { + "message": "Mostra notificacions d'escriptori per a nous correus electrònics", + "description": "" + }, + "options_notifications_2": { + "message": "Mostra notificacions d'escriptori durant (en segons):", + "description": "" + }, + "options_notifications_3": { + "message": "Aquesta opció podria no funcionar segons el sistema operatiu.", + "description": "" + }, + "options_notifications_4": { + "message": "Format de la notificació", + "description": "" + }, + "options_notifications_5": { + "message": "Variables disponibles:", + "description": "" + }, + "options_notifications_6": { + "message": "Talla les notificacions més llargues de", + "description": "" + }, + "options_notifications_7": { + "message": "caràcters per als camps [title] i [summary].", + "description": "" + }, + "options_notifications_8": { + "message": "Per no tenir truncament de l'el·lipsi, utilitza un número gran.", + "description": "" + }, + "options_notifications_9": { + "message": "Reprodueix el so d'alerta per a nous correus electrònics", + "description": "" + }, + "options_notifications_10": { + "message": "Nota per a usuaris de Mac. Des de Firefox 28.0, totes les notificacions d'escriptori es gestionen des del Centre de Notificacions de Mac, el qual genera un so d'alerta addicional. Cal desactivar aquesta notificació sonora o bé la generada pel Centre de Notificacions.", + "description": "" + }, + "options_notifications_11": { + "message": "Mostra \"Notificació a la barra de Windows\" o \"Notificació a la barra de Mac OS\"", + "description": "" + }, + "options_notifications_12": { + "message": "Les notificacions a la barra de tasques no estan suportades en sistemes operatius Linux actualment.", + "description": "" + }, + "options_notifications_13": { + "message": "Obre el tauler d'eines en fer clic a la icona de notificació de la barra de tasques (només a Windows, beta)", + "description": "" + }, + "options_notifications_14": { + "message": "Aquesta funcionalitat és altament experimental i pot fer que el navegador Firefox esdevingui inestable. [Cal reiniciar].", + "description": "" + }, + "options_notifications_15": { + "message": "El so de notificació per defecte és", + "description": "" + }, + "options_notifications_16": { + "message": "Alerta per defecte de Gmail Notifier", + "description": "" + }, + "options_notifications_17": { + "message": "Campana d'alerta de Checker Plus", + "description": "" + }, + "options_notifications_18": { + "message": "So d'alerta de Checker Plus", + "description": "" + }, + "options_notifications_19": { + "message": "Alerta de correu electrònic de Windows", + "description": "" + }, + "options_notifications_20": { + "message": "So definit per l'usuari", + "description": "" + }, + "options_notifications_21": { + "message": "El so de notificació definit per l'usuari és", + "description": "" + }, + "options_notifications_22": { + "message": "Si el navegador no reprodueix el so de notificació personalitzat, intenta convertir-lo a format WAV senzill utilitzant una eina de conversió en línia.", + "description": "" + }, + "options_notifications_35": { + "message": "Per seleccionar un nou so personalitzat, primer selecciona un so predefinit i després canvia l'opció a so personalitzat", + "description": "" + }, + "options_notifications_23": { + "message": "El volum de la notificació sonar és", + "description": "" + }, + "options_notifications_24": { + "message": "El volum és un número entre 0 i 100, on 100 és el volum més alt (per defecte).", + "description": "" + }, + "options_notifications_25": { + "message": "A Safari, el més probable és que les notificacions sonores per defecte no es reprodueixin. Si és el cas, utilitza un fitxer de so personalitzat.", + "description": "" + }, + "options_notifications_26": { + "message": "Sempre mostra la notificació de safata (només Windows)", + "description": "" + }, + "options_notifications_27": { + "message": "Les notificacions de safata es mostraran encara que no hi hagi missatges sense llegir.", + "description": "" + }, + "options_notifications_28": { + "message": "Deshabilitar totes les notificacions durant un període de temps personalitzat (en minuts):", + "description": "" + }, + "options_notifications_29": { + "message": "Aquesta opció està relacionada amb el menú de clic dret al botó de la barra d'eines -> deshabilitar totes les notificacions -> període de temps personalitzat.", + "description": "" + }, + "options_notifications_30": { + "message": "Combina totes les notificacions d'escriptori simultànies en una única notificació", + "description": "" + }, + "options_notifications_31": { + "message": "Notificació sonora personalitzada", + "description": "" + }, + "options_notifications_32": { + "message": "el nom o l'adreça de correu contenen", + "description": "" + }, + "options_notifications_33": { + "message": "el títol conté", + "description": "" + }, + "options_notifications_34": { + "message": "el missatge conté", + "description": "" + }, + "options_notifications_36": { + "message": "Demana a Gmail evitar la redirecció a 'inbox.google.com'", + "description": "" + }, + "options_notifications_37": { + "message": "Mostra la insígnia amb el número", + "description": "" + }, + "options_notifications_38": { + "message": "Les accions més ràpides (marcar com a llegit, esborrar, ...) (Considera que les accions es faran en rebre les capçaleres)", + "description": "" + }, + "options_notifications_40": { + "message": "Permetre accions ràpides des de l'àrea de notificació (màxim dues accions) (només Chrome)", + "description": "" + }, + "options_notifications_41": { + "message": "Marca com a llegit", + "description": "" + }, + "options_notifications_42": { + "message": "Arxiva", + "description": "" + }, + "options_notifications_43": { + "message": "Paperera", + "description": "" + }, + "options_tab": { + "message": "Obertura de pestanya:", + "description": "" + }, + "options_tab_1": { + "message": "Cerca comptes de Gmail oberts només a la finestra activa", + "description": "" + }, + "options_tab_2": { + "message": "No cerquis comptes de Gmail oberts en altres finestres del navegador. Si Gmail no està obert a la finestra activa, obre una nova pestanya.", + "description": "" + }, + "options_tab_3": { + "message": "Obre un nou compte de Gmail després de la pestanya activa", + "description": "" + }, + "options_tab_4": { + "message": "Obre el compte de Gmail a la pestanya activa", + "description": "" + }, + "options_tab_5": { + "message": "Obre el compte de Gmail en una pestanya a part", + "description": "" + }, + "options_tab_6": { + "message": "Obre el compte de Gmail en una nova finestra", + "description": "" + }, + "options_tab_7": { + "message": "Utilitza sempre pestanyes en blanc enlloc d'obrir una nova pestanya quan s'activi l'opció d'obrir en una pestanya", + "description": "" + }, + "options_tab_8": { + "message": "Ignora les pestanyes obertes amb Gmail", + "description": "" + }, + "options_tab_9": { + "message": "Si està desmarcat, Gmail Notifier comprova si hi ha Gmail obert a qualsevol finestra oberta i activarà la pestsanya si s'ha sol·licitat obrir-ne.", + "description": "" + }, + "options_tab_10": { + "message": "Obre correus electrònics en mode HTML bàsic", + "description": "" + }, + "options_tab_11": { + "message": "Obre el correu electrònic sense llegir més recent enlloc d'obrir la safata d'entrada", + "description": "" + }, + "options_toolbar": { + "message": "Barra d'eines:", + "description": "" + }, + "options_toolbar_1": { + "message": "Comportament del botó de la barra d'eines", + "description": "" + }, + "options_toolbar_2": { + "message": "Obre sempre el tauler de previsualització", + "description": "" + }, + "options_toolbar_3": { + "message": "Obre el compte de Gmail si només s'ha connectat un compte", + "description": "" + }, + "options_toolbar_18": { + "message": "Obre el compte de Gmail (forçat)", + "description": "" + }, + "options_toolbar_4": { + "message": "Mode del tauler d'eines", + "description": "" + }, + "options_toolbar_5": { + "message": "Mostra només el missatge", + "description": "" + }, + "options_toolbar_6": { + "message": "Mostra tot el contingut", + "description": "" + }, + "options_toolbar_7": { + "message": "L'amplada del tauler d'eines amb tot el contingut és (en píxels):", + "description": "" + }, + "options_toolbar_8": { + "message": "L'amplada mínima és de 500px.", + "description": "" + }, + "options_toolbar_9": { + "message": "L'alçada del tauler d'eines amb tot el contingut és (en píxels):", + "description": "" + }, + "options_toolbar_10": { + "message": "L'alçada mínima és de 500px.", + "description": "" + }, + "options_toolbar_11": { + "message": "Permet dreceres de teclat al tauler d'eines", + "description": "" + }, + "options_toolbar_12": { + "message": "!: Marca com a brossa, #: Paperera, e: Arxiva, Majúscules + i: Marca com a llegit.", + "description": "" + }, + "options_toolbar_13": { + "message": "Mostra els correus electrònics com a HTML en mode de contingut sencer", + "description": "" + }, + "options_toolbar_14": { + "message": "Desmarca aquesta opció per mostrar el contingut sencer només amb text.", + "description": "" + }, + "options_toolbar_15": { + "message": "Clic del mig al botó de la barra d'eines per a", + "description": "" + }, + "options_toolbar_16": { + "message": "Actualitza tots els comptes", + "description": "" + }, + "options_toolbar_17": { + "message": "Obre el compte de Gmail principal", + "description": "" + }, + "options_misc": { + "message": "Diversos:", + "description": "" + }, + "options_misc_1": { + "message": "Ordena els comptes alfabèticament", + "description": "" + }, + "options_misc_2": { + "message": "El tipus d'ordre per defecte és l'ordre de connexió.", + "description": "" + }, + "options_misc_3": { + "message": "El patró de color de la barra d'eines és", + "description": "" + }, + "options_misc_4": { + "message": "Color gris per a \"No hi ha missatges sense llegir\" i color blau per a \"Desconnectat\"", + "description": "" + }, + "options_misc_5": { + "message": "Color blau per a \"No hi ha missatges sense llegir\" i color gris per a \"Desconnectat\"", + "description": "" + }, + "options_misc_9": { + "message": "Color vermell per a \"No hi ha missatges sense llegir\" i color gris per a \"Desconnectat\"", + "description": "" + }, + "options_misc_6": { + "message": "Mostra notificacions d'escriptori per avisar que Gmail ja està obert a la pestanya activa", + "description": "" + }, + "options_misc_7": { + "message": "Mostra la pàgina de benvinguda en actualitzar", + "description": "" + }, + "options_misc_8": { + "message": "Restableix les opcions de fàbrica", + "description": "" + }, + "options_misc_10": { + "message": "Només dispara notificacions d'escriptori i sonores quan un correu electrònic hagi arribat fa menys de (en minuts):", + "description": "" + }, + "options_misc_11": { + "message": "Establint aquesta opció a zero no es generarà cap notificació d'escriptori o sonora. Malgrat tot, sí apareixerà la insígnia.", + "description": "" + }, + "options_misc_12": { + "message": "No incloure informació d'accés al text de l'indicador de funció", + "description": "" + }, + "options_misc_13": { + "message": "Per defecte, el notificador actualitza el text de l'indicador de funció amb informació d'accés. Desmarcant aquesta opció, el text mantindrà el valor per defecte.", + "description": "" + }, + "options_misc_14": { + "message": "No mostrar a la insígnia el número exacte de correus electrònics sense llegir si és més gran que 999", + "description": "" + }, + "options_misc_15": { + "message": "Obre la pàgina de PMFs després d'actualitzar", + "description": "" + }, + "options_plugins": { + "message": "Extensions:", + "description": "" + }, + "options_plugins_1": { + "message": "Etiquetes i botó estrella de Gmail (experimental)", + "description": "" + }, + "options_plugins_2": { + "message": "Aquesta extensió mostra el botó estrella, així com les etiquets del fil a la finestra emergent (només en mode estès).", + "description": "" + }, + "options_px": { + "message": "px", + "description": "" + }, + "options_empty": { + "message": "no definit", + "description": "" + }, + "options_button_test": { + "message": "Reprodueix", + "description": "" + }, + "options_button_reset": { + "message": "Restableix les opcions", + "description": "" + }, + "popup_settings": { + "message": "opcions", + "description": "" + }, + "popup_of": { + "message": "de", + "description": "" + }, + "popup_wait": { + "message": "Espera...", + "description": "" + }, + "popup_date_format": { + "message": "%mm %dd, %yy", + "description": "" + }, + "popup_no_subject": { + "message": "(sense títol)", + "description": "" + }, + "popup_open_settings": { + "message": "Obre les opcions", + "description": "" + }, + "popup_open_inbox": { + "message": "Obre la safata d'entrada", + "description": "" + }, + "popup_archive": { + "message": "Arxiva", + "description": "" + }, + "popup_spam": { + "message": "Brossa", + "description": "" + }, + "popup_trash": { + "message": "Paperera", + "description": "" + }, + "popup_refresh": { + "message": "Actualitza", + "description": "" + }, + "popup_read": { + "message": "Marca com a llegit", + "description": "" + }, + "popup_read_all": { + "message": "Marca'ls tots com a no llegits", + "description": "" + }, + "popup_msg_1": { + "message": "ara mateix", + "description": "" + }, + "popup_msg_2": { + "message": "Fa 1 minut", + "description": "" + }, + "popup_msg_3_format": { + "message": "Fa %d minuts", + "description": "" + }, + "popup_msg_4": { + "message": "Fa 1 hora", + "description": "" + }, + "popup_msg_5": { + "message": "hores", + "description": "" + }, + "popup_msg_6": { + "message": "Ahir", + "description": "" + }, + "popup_msg_7_format": { + "message": "Fa %d dies", + "description": "" + }, + "popup_msg_8_format": { + "message": "Fa %d setmanes", + "description": "" + }, + "popup_msg_9_format": { + "message": "Fa %d mesos", + "description": "" + }, + "popup_msg_10": { + "message": "Gener", + "description": "" + }, + "popup_msg_11": { + "message": "Febrer", + "description": "" + }, + "popup_msg_12": { + "message": "Març", + "description": "" + }, + "popup_msg_13": { + "message": "Abril", + "description": "" + }, + "popup_msg_14": { + "message": "Maig", + "description": "" + }, + "popup_msg_15": { + "message": "Juny", + "description": "" + }, + "popup_msg_16": { + "message": "Juliol", + "description": "" + }, + "popup_msg_17": { + "message": "Agost", + "description": "" + }, + "popup_msg_18": { + "message": "Setembre", + "description": "" + }, + "popup_msg_19": { + "message": "Octubre", + "description": "" + }, + "popup_msg_20": { + "message": "Novembre", + "description": "" + }, + "popup_msg_21": { + "message": "Desembre", + "description": "" + }, + "settings_open_title": { + "message": "Obre la pàgina d'opcions", + "description": "" + }, + "settings_open_label": { + "message": "Obre les opcions", + "description": "" + }, + "gmail": { + "message": "Notificador per a Gmail™", + "description": "" + } +} \ No newline at end of file diff --git a/v3.classic/_locales/de/messages.json b/v3.classic/_locales/de/messages.json new file mode 100644 index 00000000..b1aa5081 --- /dev/null +++ b/v3.classic/_locales/de/messages.json @@ -0,0 +1,758 @@ +{ + "toolbar_label": { + "message": "Notifier für Gmail™", + "description": "" + }, + "tooltip_1": { + "message": "Linksklick: Öffne Gmail oder das Mail-Vorschau-Panel", + "description": "" + }, + "tooltip_2": { + "message": "Mittel- (oder Strg+Links) Klick: Alle Konten aktualisieren", + "description": "" + }, + "tooltip_3": { + "message": "Rechtsklick: Kontoauswahl", + "description": "" + }, + "description": { + "message": "Mehrere Label- und Account-Benachrichtigungen für Google Mail (Gmail)", + "description": "" + }, + "log_in_to_your_account": { + "message": "Bitte im Gmail-Konto anmelden", + "description": "" + }, + "msg_1": { + "message": "Der Tab ist bereits geöffnet. Klicke auf die Schaltfläche in der Symbolleiste, um Gmail in einem neuen Tab zu öffnen oder zu einem vorhandenen Gmail-Tab zu wechseln.", + "description": "" + }, + "msg_2": { + "message": "Der Link wird in die Zwischenablage kopiert.", + "description": "" + }, + "msg_3": { + "message": "Der ausgewählte Text wird in die Zwischenablage kopiert.", + "description": "" + }, + "msg_4": { + "message": "Hinweis: Damit der Notifier ordnungsgemäß funktioniert, muss man im Google-Konto angemeldet sein.", + "description": "" + }, + "msg_5": { + "message": "Wähle eine Audiodatei aus.", + "description": "" + }, + "label_1": { + "message": "Aktualisieren", + "description": "" + }, + "label_2": { + "message": "Einstellungen", + "description": "" + }, + "label_3": { + "message": "Alle Benachrichtigungen deaktivieren", + "description": "" + }, + "label_4": { + "message": "Für 5 Minuten", + "description": "" + }, + "label_5": { + "message": "Für 15 Minuten", + "description": "" + }, + "label_6": { + "message": "Für 30 Minuten", + "description": "" + }, + "label_7": { + "message": "Für 1 Stunde", + "description": "" + }, + "label_8": { + "message": "Für 2 Stunden", + "description": "" + }, + "label_9": { + "message": "Für 5 Stunden", + "description": "" + }, + "label_13": { + "message": "Für einen benutzerdefinierten Zeitraum", + "description": "" + }, + "label_10": { + "message": "Benachrichtigungen aktivieren (Sitzung)", + "description": "" + }, + "label_11": { + "message": "E-Mail verfassen", + "description": "" + }, + "label_12": { + "message": "FAQ's öffnen", + "description": "" + }, + "label_14": { + "message": "Angemeldete Konten", + "description": "" + }, + "unknown": { + "message": "unbekannt", + "description": "" + }, + "and": { + "message": "und", + "description": "" + }, + "log_into_your_account": { + "message": "Bitte im Account einloggen", + "description": "" + }, + "notification": { + "message": "Von: [author_email][break]Titel: [title][break]Auszug: [summary]", + "description": "" + }, + "options_title": { + "message": "Optionen - Gmail™ Notifier", + "description": "" + }, + "options_inshort": { + "message": "Mehrere Label- und Account-Benachrichtigungen für Google Mail (Gmail).", + "description": "" + }, + "options_donation": { + "message": "Entwicklung unterstützen", + "description": "" + }, + "options_timings": { + "message": "Zeiten:", + "description": "" + }, + "options_timings_l1": { + "message": "Überprüfe auf neuen E-Mails alle (in Sekunden):", + "description": "" + }, + "options_timings_l2": { + "message": "Mindestdauer beträgt 10 Sekunden.", + "description": "" + }, + "options_timings_l3": { + "message": "An ungelesene E-Mails erinnern alle (in Minuten):", + "description": "" + }, + "options_timings_l4": { + "message": "Für nicht periodische Erinnerungen den Wert auf Null setzen.", + "description": "" + }, + "options_timings_l5": { + "message": "Mindestdauer beträgt 5 Minuten.", + "description": "" + }, + "options_timings_l6": { + "message": "Bei einem Wert ungleich Null werden sowohl Desktop-Benachrichtigungen als auch Alarme (ähnlich wie bei neuer E-Mail) dauerhaft ausgelöst, wenn man ungelesene E-Mails hat.", + "description": "" + }, + "options_timings_l7": { + "message": "Beim Start nicht nach neuen E-Mails überprüfen für (in Sekunden):", + "description": "" + }, + "options_timings_l8": { + "message": "Um keine E-Mail-Überprüfung bis zur ersten manuellen Aktualisierung zu starten, setze den Wert auf Null [Nicht verfügbar in Safari].", + "description": "" + }, + "options_gmail": { + "message": "Gmail:", + "description": "" + }, + "options_gmail_1": { + "message": "Hauptkonto (/mail/u/0/)", + "description": "" + }, + "options_gmail_2": { + "message": "Trenne Labels durch \",\" (Komma).", + "description": "" + }, + "options_gmail_3": { + "message": "Zweites Konto (/mail/u/1/)", + "description": "" + }, + "options_gmail_4": { + "message": "Drittes Konto (/mail/u/2/)", + "description": "" + }, + "options_gmail_5": { + "message": "Viertes Konto (/mail/u/3/)", + "description": "" + }, + "options_gmail_6": { + "message": "Fünftes Konto (/mail/u/4/)", + "description": "" + }, + "options_gmail_7": { + "message": "Sechstes Konto (/mail/u/5/)", + "description": "" + }, + "options_gmail_8": { + "message": "Markiere Nachricht als gelesen, wenn sie archiviert wird.", + "description": "" + }, + "options_gmail_15": { + "message": "Some popular labels:", + "description": "" + }, + "options_gmail_10": { + "message": "Erhalte Benachrichtigungen für folgende Labels und Konten:", + "description": "" + }, + "options_gmail_11": { + "message": "Benutzerdefinierte Feeds:", + "description": "" + }, + "options_gmail_12": { + "message": "Trenne Feeds durch \",\" (Komma). Beispiel Feed: https://mail.google.com/mail/u/0/feed/atom/inbox", + "description": "" + }, + "options_gmail_13": { + "message": "Hinweis: Maximale Anzahl für alle Labels außer \"Posteingang\" ist 20 (Google-Feeds liefern nur die 20 neuesten Einträge)", + "description": "" + }, + "options_gmail_14": { + "message": "Hinweis: Damit der Notifier mehr als fünf Konten überwacht, füge dem Feld 'Benutzerdefinierte Feeds' Feed-URLs hinzu. Zum Beispiel um den 6. und 7. Account zu überwachen: https://mail.google.com/mail/u/6/feed/atom/inbox, https://mail.google.com/mail/u/7/feed/atom/inbox", + "description": "" + }, + "options_notifications": { + "message": "Benachrichtigung:", + "description": "" + }, + "options_notifications_1": { + "message": "Desktop-Benachrichtigung für neue E-Mails anzeigen", + "description": "" + }, + "options_notifications_2": { + "message": "Desktop-Benachrichtigung anzeigen für (in Sekunden):", + "description": "" + }, + "options_notifications_3": { + "message": "Diese Option funktioniert möglicherweise nicht basierend auf dem Betriebssystem.", + "description": "" + }, + "options_notifications_4": { + "message": "Benachrichtigungsformat", + "description": "" + }, + "options_notifications_5": { + "message": "Verfügbare Variablen:", + "description": "" + }, + "options_notifications_6": { + "message": "Benachrichtigungen kürzen, wenn die Felder [Titel] und [Auszug] länger als", + "description": "" + }, + "options_notifications_7": { + "message": "Zeichen sind.", + "description": "" + }, + "options_notifications_8": { + "message": "Verwende hier eine große Zahl, um keine Ellipsenabkürzungen zu haben.", + "description": "" + }, + "options_notifications_9": { + "message": "Alarmton für neue E-Mails abspielen", + "description": "" + }, + "options_notifications_10": { + "message": "Hinweis für Mac-Benutzer. Ab Firefox 28.0 werden alle Desktop-Benachrichtigungen vom Mac Notification Center bearbeitet, das eine zusätzliche akustische Benachrichtigung auslöst. Man muss entweder die Benachrichtigungstöne oder die vom Benachrichtigungscenter generierte Benachrichtigung deaktivieren.", + "description": "" + }, + "options_notifications_11": { + "message": "Anzeige \"Windows Taskleisten-Benachrichtigung\" oder \"Mac OS Dock-Benachrichtigung\"", + "description": "" + }, + "options_notifications_12": { + "message": "Taskleisten-Benachrichtigungen werden derzeit nicht unter Linux unterstützt.", + "description": "" + }, + "options_notifications_13": { + "message": "Öffne das Symbolleisten-Panel, wenn auf das Taskleisten-Benachrichtigungsicon geklickt wird (nur Windows, Beta).", + "description": "" + }, + "options_notifications_14": { + "message": "Diese Funktion ist sehr experimentell und könnte den Firefox-Browser instabil machen. [Neustart erforderlich].", + "description": "" + }, + "options_notifications_15": { + "message": "Standard-Benachrichtigungston ist", + "description": "" + }, + "options_notifications_16": { + "message": "Gmail Notifier Standard-Alarm", + "description": "" + }, + "options_notifications_17": { + "message": "Checker Plus Glocken-Alarm", + "description": "" + }, + "options_notifications_18": { + "message": "Checker Plus Ding-Alarm", + "description": "" + }, + "options_notifications_19": { + "message": "Windows E-Mail-Alarm", + "description": "" + }, + "options_notifications_20": { + "message": "Benutzerdefinierter Ton", + "description": "" + }, + "options_notifications_21": { + "message": "Benutzerdefinierter Benachrichtigungston ist", + "description": "" + }, + "options_notifications_22": { + "message": "Wenn der Browser den benutzerdefinierten Benachrichtigungston nicht abspielt, versuche ihn mit einem Online-Konvertierungstool in ein einfaches WAV-Format zu konvertieren.", + "description": "" + }, + "options_notifications_35": { + "message": "Um einen neuen benutzerdefinierten Ton auszuwählen, wähle zuerst einen integrierten Ton und dann die Option für einen benutzerdefinierten Ton.", + "description": "" + }, + "options_notifications_23": { + "message": "Lautstärke vom Benachrichtigungston ist", + "description": "" + }, + "options_notifications_24": { + "message": "Lautstärke ist eine Zahl zwischen 0 und 100, wobei 100 die höchste Lautstärke ist (Standard).", + "description": "" + }, + "options_notifications_25": { + "message": "In Safari werden die Standard-Benachrichtigungstöne wahrscheinlich nicht richtig wiedergegeben. Wenn dies der Fall ist, verwende eine benutzerdefinierte Ton-Datei als Benachrichtigung.", + "description": "" + }, + "options_notifications_26": { + "message": "Tray-Benachrichtigung immer anzeigen (nur Windows)", + "description": "" + }, + "options_notifications_27": { + "message": "Tray-Benachrichtigung wird angezeigt, auch wenn keine ungelesene Nachricht vorhanden ist.", + "description": "" + }, + "options_notifications_28": { + "message": "Deaktiviere alle Benachrichtigungen für einen benutzerdefinierten Zeitraum (in Minuten):", + "description": "" + }, + "options_notifications_29": { + "message": "Diese Option bezieht sich auf das Rechtsklick-Menü der Schaltfläche auf der Symbolleiste -> Alle Benachrichtigungen deaktivieren -> Benutzerdefinierter Zeitraum.", + "description": "" + }, + "options_notifications_30": { + "message": "Fasse alle gleichzeitigen Desktop-Benachrichtigungen in einer einzigen Benachrichtigung zusammen.", + "description": "" + }, + "options_notifications_31": { + "message": "Benutzerdefinierter Benachrichtigungston", + "description": "" + }, + "options_notifications_32": { + "message": "Name oder E-Mail enthält", + "description": "" + }, + "options_notifications_33": { + "message": "E-Mail-Titel enthält", + "description": "" + }, + "options_notifications_34": { + "message": "E-Mail-Auszug enthält", + "description": "" + }, + "options_notifications_36": { + "message": "Bitte Gmail, die Weiterleitung von 'inbox.google.com' zu verhindern.", + "description": "" + }, + "options_notifications_37": { + "message": "Plakettennummer anzeigen", + "description": "" + }, + "options_notifications_38": { + "message": "Schnellere Aktionen (als gelesen markieren, löschen, ...) (Berücksichtige Aktionen, die beim Empfang von Kopfzeilen aufgelöst werden sollen)", + "description": "" + }, + "options_notifications_40": { + "message": "Allow quick actions from notification box (maximum two actions) (Chrome only)", + "description": "" + }, + "options_notifications_41": { + "message": "Mark as Read", + "description": "" + }, + "options_notifications_42": { + "message": "Archive", + "description": "" + }, + "options_notifications_43": { + "message": "Trash", + "description": "" + }, + "options_tab": { + "message": "Tab Öffnen:", + "description": "" + }, + "options_tab_1": { + "message": "Suche nach einem geöffneten Gmail-Konto nur im aktiven Fenster.", + "description": "" + }, + "options_tab_2": { + "message": "Durchsuche keine anderen Browserfenster nach offenen Gmail-Konten. Wenn Gmail im aktiven Fenster nicht geöffnet ist, öffne einen neuen Tab.", + "description": "" + }, + "options_tab_3": { + "message": "Öffne ein neues Gmail-Konto neben dem aktiven Tab.", + "description": "" + }, + "options_tab_4": { + "message": "Öffne das Gmail-Konto im aktiven Tab.", + "description": "" + }, + "options_tab_5": { + "message": "Öffne das Gmail-Konto in einem Hintergrund-Tab.", + "description": "" + }, + "options_tab_6": { + "message": "Öffne das Gmail-Konto in einem neuen Fenster.", + "description": "" + }, + "options_tab_7": { + "message": "Verwende immer leere Tabs, anstatt einen neuen Tab zu öffnen, wenn Öffnen im Tab aktiviert ist.", + "description": "" + }, + "options_tab_8": { + "message": "Geöffnete Gmail-Tabs ignorieren", + "description": "" + }, + "options_tab_9": { + "message": "Wenn diese Option deaktiviert ist, überprüft Gmail Notifier entweder das aktive Fenster oder alle geöffneten Fenster auf die geöffnete Gmail-Instanz und wechselt zum Tab, wenn die Tab-Öffnung angefordert wird.", + "description": "" + }, + "options_tab_10": { + "message": "Open emails in basic HTML mode", + "description": "" + }, + "options_toolbar": { + "message": "Symbolleiste:", + "description": "" + }, + "options_toolbar_1": { + "message": "Verhalten der Symbolleistenschaltfläche", + "description": "" + }, + "options_toolbar_2": { + "message": "Immer das E-Mail-Vorschaupanel öffnen.", + "description": "" + }, + "options_toolbar_3": { + "message": "Öffne das Gmail-Konto, wenn nur ein Konto angemeldet ist.", + "description": "" + }, + "options_toolbar_18": { + "message": "Open Gmail account (forced)", + "description": "" + }, + "options_toolbar_4": { + "message": "Symbolleiste Panel-Modus", + "description": "" + }, + "options_toolbar_5": { + "message": "Nur Auszug anzeigen", + "description": "" + }, + "options_toolbar_6": { + "message": "Gesamten Inhalt anzeigen", + "description": "" + }, + "options_toolbar_7": { + "message": "Breite des Symbolleisten-Panels im Modus 'Gesamten Inhalt anzeigen' ist (in Pixel):", + "description": "" + }, + "options_toolbar_8": { + "message": "Minimale Breite ist 500px.", + "description": "" + }, + "options_toolbar_9": { + "message": "Höhe des Symbolleisten-Panels im Modus 'Gesamten Inhalt anzeigen' ist (in Pixel):", + "description": "" + }, + "options_toolbar_10": { + "message": "Mindesthöhe ist 500px.", + "description": "" + }, + "options_toolbar_11": { + "message": "Tastaturkürzel auf dem Symbolleisten-Panel unterstützen", + "description": "" + }, + "options_toolbar_12": { + "message": "!: Als Spam melden, #: Papierkorb, e: Archivieren, Umschalttaste + i: Als gelesen markieren.", + "description": "" + }, + "options_toolbar_13": { + "message": "Im Modus 'Gesamten Inhalt anzeigen' E-Mails als HTML rendern.", + "description": "" + }, + "options_toolbar_14": { + "message": "Wenn im Modus 'Gesamten Inhalt anzeigen' nur Text-Rendern bevorzugt wird, deaktiviere das Kontrollkästchen.", + "description": "" + }, + "options_toolbar_15": { + "message": "Klicke mit der mittleren Maustaste auf die Schaltfläche in der Symbolleiste, um", + "description": "" + }, + "options_toolbar_16": { + "message": "Alle Konten aktualisieren", + "description": "" + }, + "options_toolbar_17": { + "message": "Öffne das Haput-Gmail-Konto", + "description": "" + }, + "options_misc": { + "message": "Sonstiges:", + "description": "" + }, + "options_misc_1": { + "message": "Konten alphabetisch sortieren", + "description": "" + }, + "options_misc_2": { + "message": "Standart-Sortierung ist in Login-Reihenfolge.", + "description": "" + }, + "options_misc_3": { + "message": "Symbolleiste Farbmuster ist", + "description": "" + }, + "options_misc_4": { + "message": "Grau für \"keine Ungelesenen\" und Blau für \"Getrennt\"", + "description": "" + }, + "options_misc_5": { + "message": "Blau für \"keine Ungelesenen\" und Grau für \"Getrennt\"", + "description": "" + }, + "options_misc_9": { + "message": "Rot für \"keine Ungelesenen\" und Grau für \"Getrennt\"", + "description": "" + }, + "options_misc_6": { + "message": "Zeige eine Desktopbenachrichtigung an, wenn Gmail bereits in einem anderen Tab geöffnet ist.", + "description": "" + }, + "options_misc_7": { + "message": "Begrüßungsseite beim Upgrade anzeigen", + "description": "" + }, + "options_misc_8": { + "message": "Alle Einstellungen auf Werkseinstellungen zurücksetzen", + "description": "" + }, + "options_misc_10": { + "message": "Desktop- und Benachrichtigungstöne nur auslösen, wenn die E-Mail vor weniger als angekommen ist (in Minuten):", + "description": "" + }, + "options_misc_11": { + "message": "Wenn man diese Einstellung auf Null setzt, erhält man weder Desktop- noch Benachrichtigungstöne. Man erhält jedoch immer noch eine Schaltflächen-Benachrichtigung.", + "description": "" + }, + "options_misc_12": { + "message": "Füge keine Login-Daten in den Tooltip-Text ein!", + "description": "" + }, + "options_misc_13": { + "message": "Standardmäßig aktualisiert der Notifier Tooltip-Text der Symbolleistenschaltfläche mit Anmeldeinformationen. Wenn diese Option deaktiviert ist, bleibt der Tooltip-Text der Standardwert.", + "description": "" + }, + "options_misc_14": { + "message": "Zeige nicht die genaue Menge an, wenn die Anzahl der ungelesenen E-Mails größer als 999 ist.", + "description": "" + }, + "options_misc_15": { + "message": "Öffne die FAQ-Seite nach Updates", + "description": "" + }, + "options_plugins": { + "message": "Plug-ins:", + "description": "" + }, + "options_plugins_1": { + "message": "Gmail-Labels und Sternschaltfläche (experimentell)", + "description": "" + }, + "options_plugins_2": { + "message": "Dieses Plugin zeigt sowohl die Sternschaltfläche als auch die Thread-Labels im Popup an (nur erweiterter Modus).", + "description": "" + }, + "options_px": { + "message": "px", + "description": "" + }, + "options_empty": { + "message": "nicht definiert", + "description": "" + }, + "options_button_test": { + "message": "abspielen", + "description": "" + }, + "options_button_reset": { + "message": "Einstellungen zurücksetzen", + "description": "" + }, + "popup_settings": { + "message": "Einstellungen", + "description": "" + }, + "popup_of": { + "message": "von", + "description": "" + }, + "popup_wait": { + "message": "Warte...", + "description": "" + }, + "popup_date_format": { + "message": "%mm %dd, %yy", + "description": "" + }, + "popup_no_subject": { + "message": "(kein Thema)", + "description": "" + }, + "popup_open_settings": { + "message": "Open Settings", + "description": "" + }, + "popup_open_inbox": { + "message": "Open Inbox", + "description": "" + }, + "popup_archive": { + "message": "Archivieren", + "description": "" + }, + "popup_spam": { + "message": "Spam", + "description": "" + }, + "popup_trash": { + "message": "Papierkorb", + "description": "" + }, + "popup_refresh": { + "message": "Aktualisieren", + "description": "" + }, + "popup_read": { + "message": "Als gelesen markieren", + "description": "" + }, + "popup_read_all": { + "message": "Alle als gelesen markieren", + "description": "" + }, + "popup_msg_1": { + "message": "jetzt gerade", + "description": "" + }, + "popup_msg_2": { + "message": "Vor 1 Minute", + "description": "" + }, + "popup_msg_3_format": { + "message": "Vor %d Minuten", + "description": "" + }, + "popup_msg_4": { + "message": "Vor 1 Stunde", + "description": "" + }, + "popup_msg_5": { + "message": "Stunden her", + "description": "" + }, + "popup_msg_6": { + "message": "Gestern", + "description": "" + }, + "popup_msg_7_format": { + "message": "Vor %d Tagen", + "description": "" + }, + "popup_msg_8_format": { + "message": "Vor %d Woche(n)", + "description": "" + }, + "popup_msg_9_format": { + "message": "Vor %d Monat(en)", + "description": "" + }, + "popup_msg_10": { + "message": "Januar", + "description": "" + }, + "popup_msg_11": { + "message": "Februar", + "description": "" + }, + "popup_msg_12": { + "message": "März", + "description": "" + }, + "popup_msg_13": { + "message": "April", + "description": "" + }, + "popup_msg_14": { + "message": "Mai", + "description": "" + }, + "popup_msg_15": { + "message": "Juni", + "description": "" + }, + "popup_msg_16": { + "message": "Juli", + "description": "" + }, + "popup_msg_17": { + "message": "August", + "description": "" + }, + "popup_msg_18": { + "message": "September", + "description": "" + }, + "popup_msg_19": { + "message": "Oktober", + "description": "" + }, + "popup_msg_20": { + "message": "November", + "description": "" + }, + "popup_msg_21": { + "message": "Dezember", + "description": "" + }, + "settings_open_title": { + "message": "Öffne die Seite Optionen (Einstellungen)", + "description": "" + }, + "settings_open_label": { + "message": "Optionen öffnen", + "description": "" + }, + "gmail": { + "message": "Notifier für Gmail™", + "description": "" + } +} \ No newline at end of file diff --git a/v3.classic/_locales/el/messages.json b/v3.classic/_locales/el/messages.json new file mode 100644 index 00000000..772880c4 --- /dev/null +++ b/v3.classic/_locales/el/messages.json @@ -0,0 +1,758 @@ +{ + "toolbar_label": { + "message": "Notifier for Gmail™", + "description": "" + }, + "tooltip_1": { + "message": "Αριστερό κλικ: Ανοίξτε το Gmail ή το παράθυρο προεπισκόπησης αλληλογραφίας", + "description": "" + }, + "tooltip_2": { + "message": "Μεσαίο (ή Ctrl + Left) κλικ: Ανανέωση όλων των λογαριασμών", + "description": "" + }, + "tooltip_3": { + "message": "Δεξί κλικ: Επιλογές Λογαριασμού", + "description": "" + }, + "description": { + "message": "Πολλαπλές ετικέτες και κοινοποίηση λογαριασμού για το Google Mail (Gmail)", + "description": "" + }, + "log_in_to_your_account": { + "message": "Παρακαλούμε συνδεθείτε στον Gmail λογαριασμό σας ", + "description": "" + }, + "msg_1": { + "message": "Η καρτέλα είναι ήδη ανοικτή. Κάντε κλικ στο κουμπί της γραμμής εργαλείων για να ανοίξετε το Gmail σε μια νέα καρτέλα, ή να μεταβείτε σε μια υπάρχουσα Gmail καρτέλα.", + "description": "" + }, + "msg_2": { + "message": "Ο σύνδεσμος έχει αντιγραφεί στο πρόχειρο.", + "description": "" + }, + "msg_3": { + "message": "Το επιλεγμένο κείμενο έχει αντιγράφει στο πρόχειρο.", + "description": "" + }, + "msg_4": { + "message": "Σημείωση: Για να λειτουργήσει σωστά το notifier, θα πρέπει να είστε συνδεδεμένοι στον Google λογαριασμό σας.", + "description": "" + }, + "msg_5": { + "message": "Επιλέξτε ένα αρχείο ήχου", + "description": "" + }, + "label_1": { + "message": "Ανανέωση", + "description": "" + }, + "label_2": { + "message": "Ρυθμίσεις", + "description": "" + }, + "label_3": { + "message": "Απενεργοποίηση όλων των ειδοποιήσεων", + "description": "" + }, + "label_4": { + "message": "Για 5 λεπτά", + "description": "" + }, + "label_5": { + "message": "Για 15 λεπτά", + "description": "" + }, + "label_6": { + "message": "Για 30 λεπτά", + "description": "" + }, + "label_7": { + "message": "Για 1 ώρα", + "description": "" + }, + "label_8": { + "message": "Για 2 ώρες", + "description": "" + }, + "label_9": { + "message": "Για 5 ώρες", + "description": "" + }, + "label_13": { + "message": "Για μια προσαρμοσμένη χρονική περίοδο", + "description": "" + }, + "label_10": { + "message": "Enable notifications (session)", + "description": "" + }, + "label_11": { + "message": "Συντάξτε ένα e-mail", + "description": "" + }, + "label_12": { + "message": "Άνοιγμα Συχνών Ερωτήσεων", + "description": "" + }, + "label_14": { + "message": "Σύνδεση στους λογαριασμούς", + "description": "" + }, + "unknown": { + "message": "άγνωστο", + "description": "" + }, + "and": { + "message": "και", + "description": "" + }, + "log_into_your_account": { + "message": "Παρακαλούμε συνδεθείτε στον λογαριασμό σας ", + "description": "" + }, + "notification": { + "message": "Από: [author_email] [break] Τίτλος: [τίτλος] [break] Περίληψη: [περίληψη]", + "description": "" + }, + "options_title": { + "message": "Επιλογές - Gmail ™ Notifier", + "description": "" + }, + "options_inshort": { + "message": "Πολλαπλές ετικέτες και λογαριασμοί κοινοποιών για το Google Mail (Gmail).", + "description": "" + }, + "options_donation": { + "message": "Support Development", + "description": "" + }, + "options_timings": { + "message": "Timings:", + "description": "" + }, + "options_timings_l1": { + "message": "Έλεγχος για νέα e-mail κάθε (σε δευτερόλεπτα):", + "description": "" + }, + "options_timings_l2": { + "message": "Ελάχιστο χρονικό διάστημα είναι 10 δευτερόλεπτα.", + "description": "" + }, + "options_timings_l3": { + "message": "Υπενθύμιση για όλα τα μη αναγνωσμένα email κάθε (σε λεπτά):", + "description": "" + }, + "options_timings_l4": { + "message": "Ρυθμίστε την τιμή στο μηδέν για μη-περιοδικές υπενθυμίσεις.", + "description": "" + }, + "options_timings_l5": { + "message": "Ελάχιστη περίοδος είναι 5 λεπτά.", + "description": "" + }, + "options_timings_l6": { + "message": "Πυρκαγιές με μη μηδενική τιμή, κοινοποίηση και ηχητική ειδοποίηση τόσο στην επιφάνεια εργασίας (παρόμοιο με νέα άφιξη email) για πάντα, αν έχετε μη αναγνωσμένα email(s).", + "description": "" + }, + "options_timings_l7": { + "message": "Να μην γίνεται έλεγχος για νέα email κατά την εκκίνηση για (σε δευτερόλεπτα):", + "description": "" + }, + "options_timings_l8": { + "message": "Ρυθμίστε την τιμή στο μηδέν για κανένα έλεγχο e-mail μέχρι την πρώτη χειροκίνητη ανανέωση [Δεν διατίθεται στο Safari].", + "description": "" + }, + "options_gmail": { + "message": "Gmail:", + "description": "" + }, + "options_gmail_1": { + "message": "Πρωτοβάθμιος λογαριασμός (/mail/u/0/)", + "description": "" + }, + "options_gmail_2": { + "message": "Ξεχωριστές ετικέτες με \",\" (κόμμα).", + "description": "" + }, + "options_gmail_3": { + "message": "Δευτερεύον λογαριασμός (/mail/u/1/)", + "description": "" + }, + "options_gmail_4": { + "message": "Τριτοβάθμιος λογαριασμός (/mail/u/2/)", + "description": "" + }, + "options_gmail_5": { + "message": "Τεταρτογενής λογαριασμός (/mail/u/3/)", + "description": "" + }, + "options_gmail_6": { + "message": "Πενταδικός λογαριασμός (/mail/u/4/)", + "description": "" + }, + "options_gmail_7": { + "message": "Σκηνικός λογαριασμός (/mail/u/5/)", + "description": "" + }, + "options_gmail_8": { + "message": "Σήμανση ως αναγνωσμένο μήνυμα κατά την αρχειοθέτηση", + "description": "" + }, + "options_gmail_15": { + "message": "Some popular labels:", + "description": "" + }, + "options_gmail_10": { + "message": "Λάβετε ειδοποιήσεις για τις εξής ετικέτες και τους λογαριασμούς:", + "description": "" + }, + "options_gmail_11": { + "message": "Προσαρμοσμένες τροφοδοσίες:", + "description": "" + }, + "options_gmail_12": { + "message": "Ξεχωριστές τροφοδοσίες με \",\" (κόμμα). Δείγμα τροφοδοσίας: https://mail.google.com/mail/u/0/feed/atom/inbox", + "description": "" + }, + "options_gmail_13": { + "message": "Note: maximum number for all labels except \"inbox\" is 20 (Google feeds only supply the 20 newest entries)", + "description": "" + }, + "options_gmail_14": { + "message": "Note: for the Notifier to listen for more than 5 accounts, add feeds URLs to the \"Custom feeds\" field. For instance to listen to the 6 and 7th accounts add: https://mail.google.com/mail/u/6/feed/atom/inbox, https://mail.google.com/mail/u/7/feed/atom/inbox", + "description": "" + }, + "options_notifications": { + "message": "Ειδοποιήσεις:", + "description": "" + }, + "options_notifications_1": { + "message": "Κοινοποίηση επιφάνειας εργασίας οθόνης για νέα email", + "description": "" + }, + "options_notifications_2": { + "message": "Εμφάνιση κοινοποίησης επιφάνειας εργασίας για (σε δευτερόλεπτα):", + "description": "" + }, + "options_notifications_3": { + "message": "Η επιλογή αυτή δεν μπορεί να λειτουργήσει με βάση το λειτουργικό σας σύστημα.", + "description": "" + }, + "options_notifications_4": { + "message": "Μορφή κοινοποίησης", + "description": "" + }, + "options_notifications_5": { + "message": "Διαθέσιμες μεταβλητές:", + "description": "" + }, + "options_notifications_6": { + "message": "Περικόψτε ειδοποιήσεις περισσότερο από", + "description": "" + }, + "options_notifications_7": { + "message": "χαρακτήρες για [τίτλος] και [περίληψη] πεδία.", + "description": "" + }, + "options_notifications_8": { + "message": "Για να μην έχουν καμία περικοπή τα αποσιωπητικά, χρησιμοποιήστε ένα μεγάλο αριθμό εδώ.", + "description": "" + }, + "options_notifications_9": { + "message": "Αναπαραγωγή ήχου ειδοποίησης για νέα email", + "description": "" + }, + "options_notifications_10": { + "message": "Σημείωση για τους χρήστες του Mac. Από το Firefox 28.0, όλες οι ειδοποιήσεις στην επιφάνεια εργασίας διεκπεραιώνονται από το Mac Κέντρο Ειδοποίησης που προκαλεί ένα επιπλέον ήχο ειδοποίησης. Θα πρέπει είτε να απενεργοποιήσετε αυτο τον ήχο ειδοποίησης ή αυτόν που παράγεται από το Κέντρο Ειδοποίησης.", + "description": "" + }, + "options_notifications_11": { + "message": "Εμφανιση \"Ειδοποιήσεις της γραμμής εργασιών του Windows\" ή \"Mac OS Dock κοινοποίησης\"", + "description": "" + }, + "options_notifications_12": { + "message": "Το Taskbar notifications δεν υποστηρίζεται απο το λειτουργικό σύστημα Linux αυτή τη στιγμή.", + "description": "" + }, + "options_notifications_13": { + "message": "Ανοιγμα της γραμμής εργαλείων όταν κάνετε κλικ στο εικονίδιο ειδοποίησης στην γραμμή εργασιών (μόνο για Windows, beta)", + "description": "" + }, + "options_notifications_14": { + "message": "Αυτό το χαρακτηριστικό είναι ιδιαίτερα πειραματικό και θα μπορούσε να κάνει τον Firefox browser ασταθή. [Επανεκκίνηση απαιτείται].", + "description": "" + }, + "options_notifications_15": { + "message": "Ο προ επιλεγμένος ήχος ειδοποίησης είναι", + "description": "" + }, + "options_notifications_16": { + "message": "Gmail Notifier προεπιλεγμένη ειδοποίηση", + "description": "" + }, + "options_notifications_17": { + "message": "Checker Plus ειδοποίηση καμπάνας", + "description": "" + }, + "options_notifications_18": { + "message": "Checker Plus Ειδοποίηση κωδώνισματος", + "description": "" + }, + "options_notifications_19": { + "message": "Windows email ειδοποίηση", + "description": "" + }, + "options_notifications_20": { + "message": "Ο ήχος ορίζεται από τον χρήστη ", + "description": "" + }, + "options_notifications_21": { + "message": "Προσδιορισμενος ηχος απο τον χρηστη", + "description": "" + }, + "options_notifications_22": { + "message": "Αν ο browser σας δεν παίζει το προεπιλεγμένο ήχο ειδοποίησης, προσπαθήστε να το μετατρέψετε σε μια απλή μορφή WAV χρησιμοποιώντας ένα online εργαλείο μετατροπής.", + "description": "" + }, + "options_notifications_35": { + "message": "Για να επιλέξετε ένα νέο προσαρμοσμένο ήχο, επιλέξτε ένα ενσωματωμένο ήχο και στη συνέχεια αλλάξτε την επιλογή με τον προσαρμοσμένο ήχο", + "description": "" + }, + "options_notifications_23": { + "message": "Ένταση ήχου κοινοποιήσεως ", + "description": "" + }, + "options_notifications_24": { + "message": "Ένταση είναι ένας αριθμός μεταξύ 0 έως 100, όπου 100 είναι η υψηλότερη ένταση (προεπιλογή).", + "description": "" + }, + "options_notifications_25": { + "message": "Στο safari πιθανότατα οι προεπιλεγμένες ειδοποιήσεις ήχου να μην παίζουν σωστά, αν ναι, χρησιμοποιήστε ένα αρχείο ήχου ως κοινοποίηση.", + "description": "" + }, + "options_notifications_26": { + "message": "Εμφανιση πάντα κοινοποίησης στον δίσκο (μόνο για Windows)", + "description": "" + }, + "options_notifications_27": { + "message": "Κοινοποίηση στον δίσκος θα εμφανίζεται ακόμη και αν δεν υπάρχει μη αναγνωσμένο μήνυμα.", + "description": "" + }, + "options_notifications_28": { + "message": "Απενεργοποίηση όλων των ειδοποιήσεων για μια προσαρμοσμένη χρονική περίοδο (σε λεπτά):", + "description": "" + }, + "options_notifications_29": { + "message": "Αυτή η επιλογή σχετίζεται με το δεξί κλικ μενού στο κουμπί της γραμμής εργαλείων -> απενεργοποιήσετε όλες τις ειδοποιήσεις -> προσαρμοσμένης χρονικής περιόδου.", + "description": "" + }, + "options_notifications_30": { + "message": "Συνδυάστε όλες τις ταυτόχρονες ειδοποιήσεις στην επιφάνεια εργασίας σε μια ενιαία κοινοποίηση", + "description": "" + }, + "options_notifications_31": { + "message": "Custom sound notification", + "description": "" + }, + "options_notifications_32": { + "message": "name or email contains", + "description": "" + }, + "options_notifications_33": { + "message": "περιέχει τίτλο email", + "description": "" + }, + "options_notifications_34": { + "message": "περιέχει περίληψη email", + "description": "" + }, + "options_notifications_36": { + "message": "Ask Gmail to prevent 'inbox.google.com' redirection", + "description": "" + }, + "options_notifications_37": { + "message": "Display Badge number", + "description": "" + }, + "options_notifications_38": { + "message": "Faster actions (mark as read, delete, ...) (Consider actions to be resolved when headers are received)", + "description": "" + }, + "options_notifications_40": { + "message": "Allow quick actions from notification box (maximum two actions) (Chrome only)", + "description": "" + }, + "options_notifications_41": { + "message": "Mark as Read", + "description": "" + }, + "options_notifications_42": { + "message": "Archive", + "description": "" + }, + "options_notifications_43": { + "message": "Trash", + "description": "" + }, + "options_tab": { + "message": "Άνοιγμα καρτέλας:", + "description": "" + }, + "options_tab_1": { + "message": "Αναζήτηση για έναν ανοικτό λογαριασμό Gmail μόνο στο ενεργό παράθυρο", + "description": "" + }, + "options_tab_2": { + "message": "Μην ψάξετε σε άλλα παράθυρα του προγράμματος περιήγησης για ανοικτούς λογαριασμούς Gmail. Εάν το Gmail δεν είναι ανοικτό στο ενεργό παράθυρο, ανοίξτε μια νέα καρτέλα.", + "description": "" + }, + "options_tab_3": { + "message": "Άνοιγμα νέου λογαριασμού Gmail δίπλα στην ενεργή καρτέλα", + "description": "" + }, + "options_tab_4": { + "message": "Άνοιγμα λογαριασμού Gmail στην ενεργή καρτέλα", + "description": "" + }, + "options_tab_5": { + "message": "Άνοιγμα λογαριασμού Gmail σε μια καρτέλα στον φόντο", + "description": "" + }, + "options_tab_6": { + "message": "Άνοιγμα λογαριασμού Gmail σε νέο παράθυρο", + "description": "" + }, + "options_tab_7": { + "message": "Πάντα να χρησιμοποιείτε κενό καρτελών αντί να ανοίγει μια νέα καρτέλα, όταν είναι ανοικτή στην καρτέλα ενεργοποιείται", + "description": "" + }, + "options_tab_8": { + "message": "Ignore opened Gmail tabs", + "description": "" + }, + "options_tab_9": { + "message": "When unchecked, Gmail Notifier checks either active window or all open windows for open instance of Gmail and switch to the tab when tab opening is requested.", + "description": "" + }, + "options_tab_10": { + "message": "Open emails in basic HTML mode", + "description": "" + }, + "options_toolbar": { + "message": "Γραμμη Εργαλειων:", + "description": "" + }, + "options_toolbar_1": { + "message": "Γραμμή εργαλείων συμπεριφορά κουμπιού", + "description": "" + }, + "options_toolbar_2": { + "message": "Πάντα ανοικτό παράθυρο προεπισκόπησης email", + "description": "" + }, + "options_toolbar_3": { + "message": "Άνοιγμα λογαριασμού Gmail αν μόνο ένας λογαριασμός είναι συνδεδεμένος ", + "description": "" + }, + "options_toolbar_18": { + "message": "Open Gmail account (forced)", + "description": "" + }, + "options_toolbar_4": { + "message": "Λειτουργία γραμμής εργαλείων", + "description": "" + }, + "options_toolbar_5": { + "message": "Εμφάνιση μόνο συνοπτικά", + "description": "" + }, + "options_toolbar_6": { + "message": "Εμφάνιση πλήρους περιεχομένου", + "description": "" + }, + "options_toolbar_7": { + "message": "Πλάτος γραμμής εργαλείων του πίνακα σε κατάσταση πλήρους περιεχομένου (σε εικονοστοιχεία):", + "description": "" + }, + "options_toolbar_8": { + "message": "Το ελάχιστο πλάτος είναι 500px.", + "description": "" + }, + "options_toolbar_9": { + "message": "Το υψος της γραμμής εργαλείων σε κατάσταση πλήρους περιεχομένου είναι (σε εικονοστοιχεία):", + "description": "" + }, + "options_toolbar_10": { + "message": "Το ελάχιστο ύψος είναι 500px.", + "description": "" + }, + "options_toolbar_11": { + "message": "Συντομεύσεις πληκτρολογίου υποστήριξης στον πίνακα εργαλείων", + "description": "" + }, + "options_toolbar_12": { + "message": "!: Αναφορά ως ανεπιθύμητο, #: Απορρίμματα, και: Αρχείο, Shift + I: Επισήμανση ως διαβάσμενο", + "description": "" + }, + "options_toolbar_13": { + "message": "Απόδοση e-mail ως HTML σε λειτουργία πλήρους περιεχομένου", + "description": "" + }, + "options_toolbar_14": { + "message": "Αν προτιμάτε μονο το κείμενο σε λειτουργία πλήρους περιεχομένου, αποεπιλέξτε το πλαίσιο.", + "description": "" + }, + "options_toolbar_15": { + "message": "Μέσαιο κλικ στην μπάρα εργαλείων για", + "description": "" + }, + "options_toolbar_16": { + "message": "Ανανέωση όλων των λογαριασμών", + "description": "" + }, + "options_toolbar_17": { + "message": "Άνοιγμα του κύριου Gmail λογαριασμου", + "description": "" + }, + "options_misc": { + "message": "Διάφορα:", + "description": "" + }, + "options_misc_1": { + "message": "Ταξινόμηση λογαριασμών αλφαβητικά", + "description": "" + }, + "options_misc_2": { + "message": "Ο τύπος προεπιλεγμένης σειράς που έχει συνδεθεί", + "description": "" + }, + "options_misc_3": { + "message": "Το σχέδιο χρώματος γραμμής εργαλείων είναι", + "description": "" + }, + "options_misc_4": { + "message": "Γκρι χρώμα για \"Μη Αναγνωσμένα\" και μπλε χρώμα για \"Αποσυνδεση\"", + "description": "" + }, + "options_misc_5": { + "message": "Μπλε χρώμα για \"Μη Αναγνωσμένα\" και γκρι χρώμα για \"Αποσυνδεση\"", + "description": "" + }, + "options_misc_9": { + "message": "Κόκκινο χρώμα για \"Μη Αναγνωσμένα\" και γκρι χρώμα για \"Ασύνδετα\"", + "description": "" + }, + "options_misc_6": { + "message": "Show desktop notification to warn that Gmail is already opened in the active tab", + "description": "" + }, + "options_misc_7": { + "message": "Εμφάνιση σελίδας υποδοχής για αναβάθμιση", + "description": "" + }, + "options_misc_8": { + "message": "Επαναφορά όλων των ρυθμίσεων στις εργοστασιακές ρυθμίσεις", + "description": "" + }, + "options_misc_10": { + "message": "Μόνο εμφάνιση στην επιφάνεια εργασίας και ηχητικές ειδοποιήσεις, όταν το ηλεκτρονικό ταχυδρομείου έχει φτάσει σε λιγότερο από (σε λεπτά):", + "description": "" + }, + "options_misc_11": { + "message": "Θέτοντας αυτήν την προτίμηση στο μηδέν, δεν θα λάμβανετε ειδοποιήσεις στην επιφάνεια εργασίας και ούτε ηχητικές ειδοποιήσεις. Ωστόσο, μπορείτε ακόμα να παίρνετε σήμα κοινοποιήσεων.", + "description": "" + }, + "options_misc_12": { + "message": "Δεν περιλαμβάνονται στοιχεία σύνδεσης στο κείμενο επεξήγησης", + "description": "" + }, + "options_misc_13": { + "message": "Από προεπιλογή, ο κοινοποιών ενημερώνει κείμενο επεξήγησης του κουμπιού γραμμής εργαλείων με πληροφορίες σύνδεσης. Με την απενεργοποίηση της επιλογής αυτής, στο κείμενο επεξήγησης παραμένει η προεπιλεγμένη τιμή.", + "description": "" + }, + "options_misc_14": { + "message": "Να μην εμφανίζεται ο ακριβής αριθμός σημάτων όταν ο αριθμός των μη αναγνωσμένων μηνυμάτων ηλεκτρονικού ταχυδρομείου είναι μεγαλύτερος από 999", + "description": "" + }, + "options_misc_15": { + "message": "Open FAQs page on updates", + "description": "" + }, + "options_plugins": { + "message": "Plug-ins:", + "description": "" + }, + "options_plugins_1": { + "message": "Gmail labels and star button (experimental)", + "description": "" + }, + "options_plugins_2": { + "message": "This plugin displays the star button as well as thread's labels in the popup (expanded mode only).", + "description": "" + }, + "options_px": { + "message": "px", + "description": "" + }, + "options_empty": { + "message": "δεν ορίζεται", + "description": "" + }, + "options_button_test": { + "message": "Play", + "description": "" + }, + "options_button_reset": { + "message": "Reset Preferences", + "description": "" + }, + "popup_settings": { + "message": "Ρυθμίσεις", + "description": "" + }, + "popup_of": { + "message": "από", + "description": "" + }, + "popup_wait": { + "message": "Περιμένετε...", + "description": "" + }, + "popup_date_format": { + "message": "%mm %dd, %yy", + "description": "" + }, + "popup_no_subject": { + "message": "(χωρίς θέμα)", + "description": "" + }, + "popup_open_settings": { + "message": "Open Settings", + "description": "" + }, + "popup_open_inbox": { + "message": "Open Inbox", + "description": "" + }, + "popup_archive": { + "message": "Αρχείο", + "description": "" + }, + "popup_spam": { + "message": "Spam", + "description": "" + }, + "popup_trash": { + "message": "Σκουπίδια", + "description": "" + }, + "popup_refresh": { + "message": "Ανανεώνω", + "description": "" + }, + "popup_read": { + "message": "Σημείωσε ως Διαβασμένο", + "description": "" + }, + "popup_read_all": { + "message": "Σημείωση όλων ως Αναγνωσμένα", + "description": "" + }, + "popup_msg_1": { + "message": "μόλις τώρα", + "description": "" + }, + "popup_msg_2": { + "message": "1 λεπτό πριν", + "description": "" + }, + "popup_msg_3_format": { + "message": "%d λεπτά πριν", + "description": "" + }, + "popup_msg_4": { + "message": "1 ώρα πριν", + "description": "" + }, + "popup_msg_5": { + "message": "ώρες πριν", + "description": "" + }, + "popup_msg_6": { + "message": "Εχθές", + "description": "" + }, + "popup_msg_7_format": { + "message": "%d ημέρες πριν", + "description": "" + }, + "popup_msg_8_format": { + "message": "%d εβδομάδα(ες) πριν", + "description": "" + }, + "popup_msg_9_format": { + "message": "%d μήνα(ες) πρίν", + "description": "" + }, + "popup_msg_10": { + "message": "Ιανουάριος", + "description": "" + }, + "popup_msg_11": { + "message": "Φεβρουάριος", + "description": "" + }, + "popup_msg_12": { + "message": "Μάρτιος", + "description": "" + }, + "popup_msg_13": { + "message": "Απρίλιος", + "description": "" + }, + "popup_msg_14": { + "message": "Μάιος", + "description": "" + }, + "popup_msg_15": { + "message": "Ιούνιος", + "description": "" + }, + "popup_msg_16": { + "message": "Ιούλιος", + "description": "" + }, + "popup_msg_17": { + "message": "Αύγουστος", + "description": "" + }, + "popup_msg_18": { + "message": "Σεπτέμβριος", + "description": "" + }, + "popup_msg_19": { + "message": "Οκτώβριος", + "description": "" + }, + "popup_msg_20": { + "message": "Νοέμβριος", + "description": "" + }, + "popup_msg_21": { + "message": "Δεκέμβριος", + "description": "" + }, + "settings_open_title": { + "message": "Ανοίξτε τις επιλογές (ρυθμίσεις) σελίδας", + "description": "" + }, + "settings_open_label": { + "message": "Ανοίξτε τις Επιλογές", + "description": "" + }, + "gmail": { + "message": "Notifier for Gmail™", + "description": "" + } +} \ No newline at end of file diff --git a/v3.classic/_locales/en/messages.json b/v3.classic/_locales/en/messages.json new file mode 100644 index 00000000..298abd18 --- /dev/null +++ b/v3.classic/_locales/en/messages.json @@ -0,0 +1,623 @@ +{ + "gmail": { + "message": "Notifier for Gmail™" + }, + "toolbar_label": { + "message": "Notifier for Gmail™" + }, + "description": { + "message": "Multiple label and account notifier for Google Mail (Gmail™)" + }, + "log_in_to_your_account": { + "message": "Please sign-in to your Gmail™ account" + }, + "msg_1": { + "message": "Tab is already open. Click on the toolbar button to open Gmail™ in a new tab, or to switch to an existing Gmail™ tab." + }, + "msg_2": { + "message": "Link is copied to the clipboard." + }, + "msg_3": { + "message": "Selected text is copied to the clipboard." + }, + "msg_4": { + "message": "Note: For the notifier to work properly, you need to be logged-in into your Google account." + }, + "msg_5": { + "message": "Select an audio sound file" + }, + "msg_6": { + "message": "To run Gmail Notifier actions on this account, please allow Basic HTML view in Gmail. After granting access, restart the notifier." + }, + "label_1": { + "message": "Refresh" + }, + "label_2": { + "message": "Settings" + }, + "label_3": { + "message": "Disable all notifications" + }, + "label_4": { + "message": "For 5 mins" + }, + "label_5": { + "message": "For 15 mins" + }, + "label_6": { + "message": "For 30 mins" + }, + "label_7": { + "message": "For 1 hour" + }, + "label_8": { + "message": "For 2 hours" + }, + "label_9": { + "message": "For 5 hours" + }, + "label_13": { + "message": "For the custom time period" + }, + "label_10": { + "message": "Enable notifications (session)" + }, + "label_11": { + "message": "Compose an email" + }, + "label_12": { + "message": "Open FAQs" + }, + "label_14": { + "message": "Open Gmail" + }, + "label_15": { + "message": "Included Accounts" + }, + "unknown": { + "message": "unknown" + }, + "and": { + "message": "and" + }, + "log_into_your_account": { + "message": "Please log into your account" + }, + "notification": { + "message": "From: [author_email][break] Title: [title][break] Summary: [summary]" + }, + "options_title": { + "message": "Options Page - Gmail™ Notifier" + }, + "options_inshort": { + "message": "Multiple label and account notifier for Google Mail (Gmail™)." + }, + "options_donation": { + "message": "Support Development $" + }, + "options_timings": { + "message": "Timings" + }, + "options_timings_l1": { + "message": "Check for new emails every (in seconds):" + }, + "options_timings_l2": { + "message": "Minimum period is 10 seconds." + }, + "options_timings_l3": { + "message": "Remind you of all unread emails every (in minutes):" + }, + "options_timings_l4": { + "message": "Set the value to zero for none-periodic reminders." + }, + "options_timings_l5": { + "message": "Minimum period is 5 minutes." + }, + "options_timings_l6": { + "message": "Non-zero value fires both desktop notification and alert sound (similar to new email arrival) eternally if you have unread email(s)." + }, + "options_timings_l7": { + "message": "Do not check for new emails on startup for (in seconds):" + }, + "options_timings_l8": { + "message": "Set the value to zero for no email check until the first manual refresh [Not available on Safari]." + }, + "options_timings_l9": { + "message": "Track Gmail tabs and network activity to refresh the notifier on changes." + }, + "options_timings_20": { + "message": "Monitor system idle state to refresh the notifier when activity resumes." + }, + "options_gmail": { + "message": "Gmail™" + }, + "options_gmail_1": { + "message": "Primary account (/mail/u/0/)" + }, + "options_gmail_2": { + "message": "Separate labels by \",\" (Comma)." + }, + "options_gmail_3": { + "message": "Secondary account (/mail/u/1/)" + }, + "options_gmail_4": { + "message": "Tertiary account (/mail/u/2/)" + }, + "options_gmail_5": { + "message": "Quaternary account (/mail/u/3/)" + }, + "options_gmail_6": { + "message": "Quinary account (/mail/u/4/)" + }, + "options_gmail_7": { + "message": "Senary account (/mail/u/5/)" + }, + "options_gmail_8": { + "message": "Mark messages as read when archiving them" + }, + "options_gmail_15": { + "message": "Some popular labels:" + }, + "options_gmail_10": { + "message": "Receive notifications for the following labels and accounts:" + }, + "options_gmail_11": { + "message": "Custom feeds:" + }, + "options_gmail_12": { + "message": "Separate feeds by \",\" (Comma). Sample feed: https://mail.google.com/mail/u/0/feed/atom/inbox" + }, + "options_gmail_13": { + "message": "Note: maximum number for all labels except \"inbox\" is 20 (Google feeds only supply the 20 newest entries)" + }, + "options_gmail_14": { + "message": "Note: for the Notifier to listen for more than 5 accounts, add feeds URLs to the \"Custom feeds\" field. For instance to listen to the 6 and 7th accounts add: https://mail.google.com/mail/u/6/feed/atom/inbox, https://mail.google.com/mail/u/7/feed/atom/inbox" + }, + "options_notifications": { + "message": "Notifications" + }, + "options_notifications_1": { + "message": "Display desktop notification for new emails" + }, + "options_notifications_2": { + "message": "Show desktop notification for (in seconds):" + }, + "options_notifications_3": { + "message": "This option may not work based on your OS." + }, + "options_notifications_4": { + "message": "Notification format" + }, + "options_notifications_5": { + "message": "Available variables:" + }, + "options_notifications_6": { + "message": "Truncate notifications longer than" + }, + "options_notifications_7": { + "message": "characters for [title] and [summary] fields." + }, + "options_notifications_8": { + "message": "To have no ellipsis truncation, use a big number here." + }, + "options_notifications_9": { + "message": "Play alert sound for new emails" + }, + "options_notifications_10": { + "message": "Note for Mac users. From Firefox version 28.0, all desktop notifications are handled by Mac Notification Center which causes an extra sound alert. You need to either uncheck this sound notification or the one that is generated by the Notification Center." + }, + "options_notifications_11": { + "message": "Display \"Windows™ taskbar notification\" or \"Mac OS Dock notification\"" + }, + "options_notifications_12": { + "message": "Taskbar notifications are not supported on Linux OS at the moment." + }, + "options_notifications_13": { + "message": "Open toolbar panel when click on the taskbar notification icon (Windows™ only, beta)" + }, + "options_notifications_14": { + "message": "This feature is highly experimental and might make your Firefox browser unstable. [Restart required]." + }, + "options_notifications_15": { + "message": "Default sound notification:" + }, + "options_notifications_16": { + "message": "Gmail™ Notifier default alert" + }, + "options_notifications_17": { + "message": "Checker Plus bell alert" + }, + "options_notifications_18": { + "message": "Checker Plus ding alert" + }, + "options_notifications_19": { + "message": "Windows™ email alert" + }, + "options_notifications_20": { + "message": "User defined sound" + }, + "options_notifications_21": { + "message": "User defined notification sound:" + }, + "options_notifications_22": { + "message": "If your browser is not playing the custom notification sound, try to convert it into a plain WAV format using an online conversion tool." + }, + "options_notifications_35": { + "message": "To select a new custom sound, select a built-in sound first and then change the option to custom sound" + }, + "options_notifications_23": { + "message": "Volume of the sound notification (in %):" + }, + "options_notifications_24": { + "message": "Volume is a number between 0 to 100 where 100 is the highest volume (default)." + }, + "options_notifications_25": { + "message": "In safari most likely the default sound notifications are not playing properly, if so use a custom sound file as your notification." + }, + "options_notifications_26": { + "message": "Always show tray notification (Windows™ only)" + }, + "options_notifications_27": { + "message": "Tray notification will be shown even if there is no unread message." + }, + "options_notifications_28": { + "message": "Disable all notifications for a custom time period (in minutes):" + }, + "options_notifications_29": { + "message": "This option is related to the right click menu on the toolbar button -> disable all notifications -> custom time period." + }, + "options_notifications_30": { + "message": "Combine all concurrent desktop notifications into a single notification" + }, + "options_notifications_31": { + "message": "Custom sound notification for" + }, + "options_notifications_32": { + "message": "name or email contains" + }, + "options_notifications_33": { + "message": "email title contains" + }, + "options_notifications_34": { + "message": "email summary contains" + }, + "options_notifications_36": { + "message": "Ask Gmail™ to prevent 'inbox.google.com' redirection" + }, + "options_notifications_37": { + "message": "Show unread email count on badge (and choose badge color)" + }, + "options_notifications_38": { + "message": "Faster actions (mark as read, delete, ...) (Consider actions to be resolved when headers are received)" + }, + "options_notifications_40": { + "message": "Allow quick actions from notification box (maximum two actions, for Chrome only)" + }, + "options_notifications_41": { + "message": "Mark as Read" + }, + "options_notifications_42": { + "message": "Archive" + }, + "options_notifications_43": { + "message": "Trash" + }, + "options_notifications_44": { + "message": "Play sound notification on the following states:" + }, + "options_notifications_45": { + "message": "Active" + }, + "options_notifications_46": { + "message": "Idle" + }, + "options_notifications_47": { + "message": "Locked" + }, + "options_notifications_48": { + "message": "Display desktop notification on the following states:" + }, + "options_tab": { + "message": "Tab Opening" + }, + "options_tab_1": { + "message": "Search for an open Gmail™ account, only on the active window" + }, + "options_tab_2": { + "message": "Do not search other browser windows for open Gmail™ accounts. If Gmail™ is not open in the active window, open a new tab." + }, + "options_tab_3": { + "message": "Open new Gmail™ account next to the active tab" + }, + "options_tab_4": { + "message": "Open Gmail™ account in the active tab" + }, + "options_tab_5": { + "message": "Open Gmail™ account in a background tab" + }, + "options_tab_6": { + "message": "Open Gmail™ account in a new window" + }, + "options_tab_7": { + "message": "Always use blank tabs instead of opening a new tab when open in tab is activated" + }, + "options_tab_8": { + "message": "Ignore opened Gmail™ tabs" + }, + "options_tab_9": { + "message": "When checked, the notifier open emails in new browser tabs. When unchecked, it will first search the active window for an existing Gmail™ tab and switch to it. If not found, it will search other open windows before opening a new tab." + }, + "options_tab_10": { + "message": "Open emails in basic HTML mode" + }, + "options_tab_11": { + "message": "Clicking on the title of an unread email opens Gmail™ to the email itself instead of opening to the INBOX folder" + }, + "options_toolbar": { + "message": "Toolbar" + }, + "options_toolbar_1": { + "message": "Toolbar button behaviour" + }, + "options_toolbar_2": { + "message": "Always open email preview panel" + }, + "options_toolbar_3": { + "message": "Open Gmail™ account if only one account is logged-in" + }, + "options_toolbar_18": { + "message": "Open Gmail™ account (forced)" + }, + "options_toolbar_4": { + "message": "Toolbar panel mode" + }, + "options_toolbar_5": { + "message": "Show summary only" + }, + "options_toolbar_6": { + "message": "Show full content" + }, + "options_toolbar_7": { + "message": "Toolbar panel width in the full-content view mode (in pixels):" + }, + "options_toolbar_8": { + "message": "Minimum width is 500px." + }, + "options_toolbar_9": { + "message": "Toolbar panel height in the full-content view mode (in pixels):" + }, + "options_toolbar_10": { + "message": "Minimum height is 500px." + }, + "options_toolbar_11": { + "message": "Support keyboard shortcuts on the toolbar panel" + }, + "options_toolbar_12": { + "message": "Report as spam: , Trash: <#>, Archive: , Mark as read: ." + }, + "options_toolbar_13": { + "message": "Render emails as HTML in full-content mode" + }, + "options_toolbar_14": { + "message": "If you prefer text-only rendering in the full-content mode, uncheck the box." + }, + "options_toolbar_15": { + "message": "Middle-click on the toolbar button to" + }, + "options_toolbar_16": { + "message": "Refresh all accounts" + }, + "options_toolbar_17": { + "message": "Open primary Gmail™ account" + }, + "options_misc": { + "message": "Miscellaneous" + }, + "options_misc_1": { + "message": "Sort accounts alphabetically" + }, + "options_misc_2": { + "message": "The default order type is logged-in order." + }, + "options_misc_3": { + "message": "Toolbar button color pattern:" + }, + "options_misc_4": { + "message": "Gray color for \"No Unread\" and blue color for \"Disconnected\"" + }, + "options_misc_5": { + "message": "Blue color for \"No Unread\" and gray color for \"Disconnected\"" + }, + "options_misc_9": { + "message": "Red color for \"No Unread\" and gray color for \"Disconnected\"" + }, + "options_misc_6": { + "message": "Show desktop notification to warn that Gmail™ is already opened in the active tab" + }, + "options_misc_7": { + "message": "Show welcome page on upgrade" + }, + "options_misc_8": { + "message": "Reset all settings back to factory" + }, + "options_misc_10": { + "message": "Only fire desktop and sound notifications when email has arrived in less than (in minutes): " + }, + "options_misc_11": { + "message": "By setting this preference to zero, you will receive neither desktop nor sound notifications; however, you will still get badge notification." + }, + "options_misc_12": { + "message": "Do not include login details in the tooltip text" + }, + "options_misc_13": { + "message": "By default, the notifier updates tooltip text of the toolbar button with login info. By unchecking this option, the tooltip text remains the default value." + }, + "options_misc_14": { + "message": "Do not show the exact badge number when the number of unread emails is greater than 999" + }, + "options_misc_15": { + "message": "Open FAQs page on updates" + }, + "options_misc_16": { + "message": "Color theme of panel:" + }, + "options_misc_17": { + "message": "Light theme" + }, + "options_misc_18": { + "message": "Dark theme" + }, + "options_misc_19": { + "message": "System theme" + }, + "options_misc_20": { + "message": "Reset history for \"Included Accounts\"" + }, + "options_misc_21": { + "message": "Reset Accounts" + }, + "options_plugins": { + "message": "Plug-ins" + }, + "options_plugins_1": { + "message": "Gmail™ labels and star button (experimental)" + }, + "options_plugins_2": { + "message": "This plugin displays the star button as well as thread's labels in the popup (expanded mode only)." + }, + "options_styling": { + "message": "Styling" + }, + "options_styling_0": { + "message": "Scale email view by (0.5-4)" + }, + "options_styling_1": { + "message": "Custom CSS rules for top panel" + }, + "options_styling_2": { + "message": "Custom CSS rules for email view" + }, + "options_px": { + "message": "px" + }, + "options_empty": { + "message": "not defined" + }, + "options_button_test": { + "message": "Play sound ►" + }, + "options_button_reset": { + "message": "Reset Preferences" + }, + "popup_settings": { + "message": "Settings" + }, + "popup_of": { + "message": "of" + }, + "popup_wait": { + "message": "Wait..." + }, + "popup_date_format": { + "message": "%mm %dd, %yy" + }, + "popup_no_subject": { + "message": "(no subject)" + }, + "popup_open_settings": { + "message": "Open Settings" + }, + "popup_open_inbox": { + "message": "Open Inbox" + }, + "popup_archive": { + "message": "Archive" + }, + "popup_spam": { + "message": "Spam" + }, + "popup_trash": { + "message": "Trash" + }, + "popup_refresh": { + "message": "Refresh" + }, + "popup_read": { + "message": "Mark as Read" + }, + "popup_read_all": { + "message": "Mark all as read" + }, + "popup_toggle_dark": { + "message": "Toggle dark theme on and off" + }, + "popup_msg_1": { + "message": "just now" + }, + "popup_msg_2": { + "message": "1 minute ago" + }, + "popup_msg_3_format": { + "message": "%d minutes ago" + }, + "popup_msg_4": { + "message": "1 hour ago" + }, + "popup_msg_5": { + "message": "hours ago" + }, + "popup_msg_6": { + "message": "Yesterday" + }, + "popup_msg_7_format": { + "message": "%d days ago" + }, + "popup_msg_8_format": { + "message": "%d week(s) ago" + }, + "popup_msg_9_format": { + "message": "%d month(s) ago" + }, + "popup_msg_10": { + "message": "January" + }, + "popup_msg_11": { + "message": "February" + }, + "popup_msg_12": { + "message": "March" + }, + "popup_msg_13": { + "message": "April" + }, + "popup_msg_14": { + "message": "May" + }, + "popup_msg_15": { + "message": "June" + }, + "popup_msg_16": { + "message": "July" + }, + "popup_msg_17": { + "message": "August" + }, + "popup_msg_18": { + "message": "September" + }, + "popup_msg_19": { + "message": "October" + }, + "popup_msg_20": { + "message": "November" + }, + "popup_msg_21": { + "message": "December" + }, + "settings_open_title": { + "message": "Open options (settings) page" + }, + "settings_open_label": { + "message": "Open Options" + } +} diff --git a/v3.classic/_locales/es/messages.json b/v3.classic/_locales/es/messages.json new file mode 100644 index 00000000..1cc13708 --- /dev/null +++ b/v3.classic/_locales/es/messages.json @@ -0,0 +1,758 @@ +{ + "toolbar_label": { + "message": "Notifier for Gmail™", + "description": "" + }, + "tooltip_1": { + "message": "Click izquierdo: abrir Gmail o el panel de vista previa", + "description": "" + }, + "tooltip_2": { + "message": "Click medio (o Ctrl+Click izquierdo): actualizar todas las cuentas", + "description": "" + }, + "tooltip_3": { + "message": "Click derecho: selección de cuenta", + "description": "" + }, + "description": { + "message": "Notificador para múltiples cuentas y etiquetas de Google Mail (Gmail)", + "description": "" + }, + "log_in_to_your_account": { + "message": "Por favor, inicia sesión en tu cuenta de Gmail", + "description": "" + }, + "msg_1": { + "message": "La pestaña ya está abierta. Haz click en el botón de la barra de herramientas para abrir Gmail en una nueva pestaña, o para cambiar a una pestaña de Gmail ya existente.", + "description": "" + }, + "msg_2": { + "message": "El enlace se copió al portapapeles.", + "description": "" + }, + "msg_3": { + "message": "El texto seleccionado se copió al portapapeles.", + "description": "" + }, + "msg_4": { + "message": "Aviso: para que el notificador funcione correctamente, debes haber iniciado sesión en tu cuenta Google.", + "description": "" + }, + "msg_5": { + "message": "Elige un archivo de sonido", + "description": "" + }, + "label_1": { + "message": "Actualizar", + "description": "" + }, + "label_2": { + "message": "Configuración", + "description": "" + }, + "label_3": { + "message": "Desactivar todas las notificaciones", + "description": "" + }, + "label_4": { + "message": "Durante 5 minutos", + "description": "" + }, + "label_5": { + "message": "Durante 15 minutos", + "description": "" + }, + "label_6": { + "message": "Durante 30 minutos", + "description": "" + }, + "label_7": { + "message": "Durante 1 hora", + "description": "" + }, + "label_8": { + "message": "Durante 2 horas", + "description": "" + }, + "label_9": { + "message": "Durante 5 horas", + "description": "" + }, + "label_13": { + "message": "Por un período de tiempo personalizado", + "description": "" + }, + "label_10": { + "message": "Enable notifications (session)", + "description": "" + }, + "label_11": { + "message": "Redactar un correo nuevo", + "description": "" + }, + "label_12": { + "message": "Abrir FAQs", + "description": "" + }, + "label_14": { + "message": "Cuentas que han iniciado sesión", + "description": "" + }, + "unknown": { + "message": "desconocido", + "description": "" + }, + "and": { + "message": "y", + "description": "" + }, + "log_into_your_account": { + "message": "Por favor, inicia sesión en tu cuenta", + "description": "" + }, + "notification": { + "message": "De: [author_email][break]Asunto: [title][break]Resumen: [summary]", + "description": "" + }, + "options_title": { + "message": "Opciones - Gmail™ Notifier", + "description": "" + }, + "options_inshort": { + "message": "Notificador para Google Mail (Gmail), con soporte de múltiples cuentas y etiquetas.", + "description": "" + }, + "options_donation": { + "message": "Support Development", + "description": "" + }, + "options_timings": { + "message": "Timings:", + "description": "" + }, + "options_timings_l1": { + "message": "Verificar si hay correos nuevos cada (en segundos):", + "description": "" + }, + "options_timings_l2": { + "message": "El período mínimo es 10 segundos", + "description": "" + }, + "options_timings_l3": { + "message": "Recordarme que tengo mails sin leer cada (en minutos):", + "description": "" + }, + "options_timings_l4": { + "message": "Pon el valor a cero para no recibir recordatorios periódicamente", + "description": "" + }, + "options_timings_l5": { + "message": "El período mínimo es 5 minutos", + "description": "" + }, + "options_timings_l6": { + "message": "Valores distintos de cero activan las notificaciones sonoras y de escritorio (como cuando llega correo nuevo) constantemente mientras tengas correo sin leer.", + "description": "" + }, + "options_timings_l7": { + "message": "No verificar si hay correos nuevos al inicio durante (en segundos):", + "description": "" + }, + "options_timings_l8": { + "message": "Configura este valor a cero para evitar chequear el e-mail hasta la primer actualización manual (No disponible en Safari).", + "description": "" + }, + "options_gmail": { + "message": "Gmail:", + "description": "" + }, + "options_gmail_1": { + "message": "Cuenta principal (/mail/u/0/)", + "description": "" + }, + "options_gmail_2": { + "message": "Separa las etiquetas con \",\" (coma).", + "description": "" + }, + "options_gmail_3": { + "message": "Cuenta secundaria (/mail/u/1/)", + "description": "" + }, + "options_gmail_4": { + "message": "Tercera cuenta (/mail/u/2/)", + "description": "" + }, + "options_gmail_5": { + "message": "Cuarta cuenta (/mail/u/3/)", + "description": "" + }, + "options_gmail_6": { + "message": "Quinta cuenta ((/mail/u/4/)", + "description": "" + }, + "options_gmail_7": { + "message": "Sexta cuenta ((/mail/u/5/)", + "description": "" + }, + "options_gmail_8": { + "message": "Marcar mensaje como leído al archivarlo", + "description": "" + }, + "options_gmail_15": { + "message": "Some popular labels:", + "description": "" + }, + "options_gmail_10": { + "message": "Recibir notificaciones para las siguientes etiquetas y cuentas:", + "description": "" + }, + "options_gmail_11": { + "message": "Feeds personalizados:", + "description": "" + }, + "options_gmail_12": { + "message": "Separa los feeds con \",\" (coma). Feed de ejemplo: https://mail.google.com/mail/u/0/feed/atom/inbox", + "description": "" + }, + "options_gmail_13": { + "message": "Note: maximum number for all labels except \"inbox\" is 20 (Google feeds only supply the 20 newest entries)", + "description": "" + }, + "options_gmail_14": { + "message": "Note: for the Notifier to listen for more than 5 accounts, add feeds URLs to the \"Custom feeds\" field. For instance to listen to the 6 and 7th accounts add: https://mail.google.com/mail/u/6/feed/atom/inbox, https://mail.google.com/mail/u/7/feed/atom/inbox", + "description": "" + }, + "options_notifications": { + "message": "Notificaciones:", + "description": "" + }, + "options_notifications_1": { + "message": "Mostrar notificaciones de escritorio cuando haya correos nuevos", + "description": "" + }, + "options_notifications_2": { + "message": "Mostrar notificaciones de escritorio durante (en segundos):", + "description": "" + }, + "options_notifications_3": { + "message": "Esta opción podría no funcionar en tu sistema operativo.", + "description": "" + }, + "options_notifications_4": { + "message": "Formato de notificaciones:", + "description": "" + }, + "options_notifications_5": { + "message": "Variables disponibles:", + "description": "" + }, + "options_notifications_6": { + "message": "Cortar notificaciones más largas que", + "description": "" + }, + "options_notifications_7": { + "message": "caracteres para los campos [title] y [summary].", + "description": "" + }, + "options_notifications_8": { + "message": "Para no cortar nada, usa un número grande aquí.", + "description": "" + }, + "options_notifications_9": { + "message": "Reproducir sonido de aviso cuando haya correos nuevos", + "description": "" + }, + "options_notifications_10": { + "message": "Aviso para usuarios de Mac. A partir de Firefox 28.0, todas las notificaciones de escritorio son controladas por el Centro de Notificaciones Mac, lo que causa un sonido de alerta extra. Es necesario desactivar esta notificación sonora, o bien la que es generada por el Centro de Notificaciones.", + "description": "" + }, + "options_notifications_11": { + "message": "Mostrar notificación de la barra de tareas de Windows o del Dock de Mac OS", + "description": "" + }, + "options_notifications_12": { + "message": "Las notificaciones en la barra de tareas no están soportadas de momento en sistemas operativos Linux.", + "description": "" + }, + "options_notifications_13": { + "message": "Abrir panel de la barra de herramientas cuando clickeo en el ícono de notificación de la barra de tareas (sólo Windows, beta)", + "description": "" + }, + "options_notifications_14": { + "message": "Esta característica es extremadamente experimental y puede volver tu navegador inestable. [Restart required].", + "description": "" + }, + "options_notifications_15": { + "message": "El sonido de notificación por defecto es", + "description": "" + }, + "options_notifications_16": { + "message": "Aviso por defecto de Gmail Notifier", + "description": "" + }, + "options_notifications_17": { + "message": "Aviso \"bell\" de Checker Plus", + "description": "" + }, + "options_notifications_18": { + "message": "Aviso \"ding\" de Checker Plus", + "description": "" + }, + "options_notifications_19": { + "message": "Aviso de correo de Windows", + "description": "" + }, + "options_notifications_20": { + "message": "Sonido definido por el usuario", + "description": "" + }, + "options_notifications_21": { + "message": "El sonido definido por el usuario es", + "description": "" + }, + "options_notifications_22": { + "message": "Si tu navegador no está reproduciendo el sonido de notificación personalizado, intenta convertirlo al formato WAV usando una herramienta de conversión online.", + "description": "" + }, + "options_notifications_35": { + "message": "Para elegir un nuevo sonido personalizado, elige en primer lugar un sonido incluído y luego cambia la opción nuevamente a \"sonido personalizado\"", + "description": "" + }, + "options_notifications_23": { + "message": "El volumen de las notificaciones sonoras es", + "description": "" + }, + "options_notifications_24": { + "message": "\"Volumen\" es un número entre 0 y 100, donde 100 es el volumen más alto (por defecto).", + "description": "" + }, + "options_notifications_25": { + "message": "En Safari, es muy probable que las notificaciones sonoras por defecto no se reproduzcan correctamente. En tal caso, usa un archivo de sonido personalizado.", + "description": "" + }, + "options_notifications_26": { + "message": "Siempre mostrar notificación en la bandeja de sistema (sólo Windows)", + "description": "" + }, + "options_notifications_27": { + "message": "La notificación en la bandeja del sistema será mostrada incluso si no hay mensajes sin leer.", + "description": "" + }, + "options_notifications_28": { + "message": "Deshabilitar todas las notificaciones por un período de tiempo personalizado (en minutos):", + "description": "" + }, + "options_notifications_29": { + "message": "Esta opción está relacionada con el menú que se muestra al hacer click derecho sobre el botón de la barra de herramientas (deshabilitar todas las notificaciones -> período de tiempo personalizado).", + "description": "" + }, + "options_notifications_30": { + "message": "Combinar todas las notificaciones de escritorio en una única", + "description": "" + }, + "options_notifications_31": { + "message": "Custom sound notification", + "description": "" + }, + "options_notifications_32": { + "message": "name or email contains", + "description": "" + }, + "options_notifications_33": { + "message": "El asunto del correo contiene", + "description": "" + }, + "options_notifications_34": { + "message": "El resumen del correo contiene", + "description": "" + }, + "options_notifications_36": { + "message": "Ask Gmail to prevent 'inbox.google.com' redirection", + "description": "" + }, + "options_notifications_37": { + "message": "Display Badge number", + "description": "" + }, + "options_notifications_38": { + "message": "Faster actions (mark as read, delete, ...) (Consider actions to be resolved when headers are received)", + "description": "" + }, + "options_notifications_40": { + "message": "Allow quick actions from notification box (maximum two actions) (Chrome only)", + "description": "" + }, + "options_notifications_41": { + "message": "Mark as Read", + "description": "" + }, + "options_notifications_42": { + "message": "Archive", + "description": "" + }, + "options_notifications_43": { + "message": "Trash", + "description": "" + }, + "options_tab": { + "message": "Apertura de pestañas:", + "description": "" + }, + "options_tab_1": { + "message": "Buscar una cuenta de Gmail abierta sólo en la ventana activa", + "description": "" + }, + "options_tab_2": { + "message": "No buscar cuentas de Gmail abiertas en otras ventanas del navegador. Si Gmail no está abierto en la ventana activa, abrir una nueva pestaña.", + "description": "" + }, + "options_tab_3": { + "message": "Abrir una nueva cuenta Gmail junto a la pestaña activa", + "description": "" + }, + "options_tab_4": { + "message": "Abrir cuenta Gmail en la pestaña activa", + "description": "" + }, + "options_tab_5": { + "message": "Abrir la cuenta Gmail en una pestaña inactiva", + "description": "" + }, + "options_tab_6": { + "message": "Abrir cuenta Gmail en una nueva ventana", + "description": "" + }, + "options_tab_7": { + "message": "Siempre usar pestañas vacías en lugar de abrir una nueva cuando \"abrir en pestaña\" esté activado", + "description": "" + }, + "options_tab_8": { + "message": "Ignorar pestañas de Gmail abiertas", + "description": "" + }, + "options_tab_9": { + "message": "Si está desactivado, Gmail Notifier chequea todas las ventanas activas por una pestaña de Gmail abierta y cambia a ella cuando se solicita abrir una pestaña nueva.", + "description": "" + }, + "options_tab_10": { + "message": "Open emails in basic HTML mode", + "description": "" + }, + "options_toolbar": { + "message": "Barra de herramientas:", + "description": "" + }, + "options_toolbar_1": { + "message": "Comportamiento del botón de la barra de herramientas", + "description": "" + }, + "options_toolbar_2": { + "message": "Siempre abrir el panel de vista previa de correo", + "description": "" + }, + "options_toolbar_3": { + "message": "Abrir cuenta Gmail si sólo una cuenta ha iniciado sesión", + "description": "" + }, + "options_toolbar_18": { + "message": "Open Gmail account (forced)", + "description": "" + }, + "options_toolbar_4": { + "message": "Modo del panel de vista previa", + "description": "" + }, + "options_toolbar_5": { + "message": "Mostrar sólo el resumen", + "description": "" + }, + "options_toolbar_6": { + "message": "Mostrar contenido completo", + "description": "" + }, + "options_toolbar_7": { + "message": "Ancho del panel de vista previa en modo de contenido completo (en pixels):", + "description": "" + }, + "options_toolbar_8": { + "message": "El ancho mínimo es 500px.", + "description": "" + }, + "options_toolbar_9": { + "message": "Alto del panel de vista previa en modo contenido completo (en pixels):", + "description": "" + }, + "options_toolbar_10": { + "message": "El alto mínimo es 500px.", + "description": "" + }, + "options_toolbar_11": { + "message": "Permitir atajos de teclado en el panel de vista previa", + "description": "" + }, + "options_toolbar_12": { + "message": "!: Marcar como spam, #:Eliminar, e: Archivar, Shift + i: Marcar como leído", + "description": "" + }, + "options_toolbar_13": { + "message": "Visualizar los mensajes como HTML en el modo contenido completo", + "description": "" + }, + "options_toolbar_14": { + "message": "Si prefieres visualizar los mensajes como sólo texto, desactiva esta casilla.", + "description": "" + }, + "options_toolbar_15": { + "message": "Click medio en el botón de la barra de herramientas para", + "description": "" + }, + "options_toolbar_16": { + "message": "Actualizar todas las cuentas", + "description": "" + }, + "options_toolbar_17": { + "message": "Abrir cuenta Gmail principal", + "description": "" + }, + "options_misc": { + "message": "Otros:", + "description": "" + }, + "options_misc_1": { + "message": "Ordenar cuentas alfabéticamente", + "description": "" + }, + "options_misc_2": { + "message": "El orden por defecto es de acuerdo al momento de inicio de sesión.", + "description": "" + }, + "options_misc_3": { + "message": "El esquema de colores de la barra de herramientas es:", + "description": "" + }, + "options_misc_4": { + "message": "Gris para \"Sin mensajes por leer\" y azul para \"Desconectado\"", + "description": "" + }, + "options_misc_5": { + "message": "Azul para \"Sin mensajes por leer\" y gris para \"Desconectado\"", + "description": "" + }, + "options_misc_9": { + "message": "Rojo para \"Sin mensajes por leer\" y gris para \"Desconectado\"", + "description": "" + }, + "options_misc_6": { + "message": "Mostrar notificación de escritorio para advertir que Gmail ya está abierto en la pestaña activa", + "description": "" + }, + "options_misc_7": { + "message": "Mostrar página de bienvenida al actualizar versión", + "description": "" + }, + "options_misc_8": { + "message": "Reestablecer toda la configuración", + "description": "" + }, + "options_misc_10": { + "message": "Sólo activar notificaciones sonoras y de escritorio cuando haya llegado correo en menos de (en minutos):", + "description": "" + }, + "options_misc_11": { + "message": "Poniendo este valor a cero, no recibirás notificaciones sonoras o de escritorio, sin embargo, todavía recibirás notificaciones en el ícono de la barra de herramientas.", + "description": "" + }, + "options_misc_12": { + "message": "No incluir detalles de cuenta en el texto que se muestra al pasar el puntero sobre el ícono", + "description": "" + }, + "options_misc_13": { + "message": "Por defecto, el texto que se muestra al pasar el puntero sobre el ícono se actualiza con la información de la cuenta. Desmarcando esta casilla, permanecerá sin cambios.", + "description": "" + }, + "options_misc_14": { + "message": "No mostrar el número exacto de correos no leídos en el icono cuando este sea mayor que 999", + "description": "" + }, + "options_misc_15": { + "message": "Open FAQs page on updates", + "description": "" + }, + "options_plugins": { + "message": "Plug-ins:", + "description": "" + }, + "options_plugins_1": { + "message": "Gmail labels and star button (experimental)", + "description": "" + }, + "options_plugins_2": { + "message": "This plugin displays the star button as well as thread's labels in the popup (expanded mode only).", + "description": "" + }, + "options_px": { + "message": "px", + "description": "" + }, + "options_empty": { + "message": "sin definir", + "description": "" + }, + "options_button_test": { + "message": "Play", + "description": "" + }, + "options_button_reset": { + "message": "Reset Preferences", + "description": "" + }, + "popup_settings": { + "message": "ajustes", + "description": "" + }, + "popup_of": { + "message": "de", + "description": "" + }, + "popup_wait": { + "message": "Espera...", + "description": "" + }, + "popup_date_format": { + "message": "%dd %mm, %yy", + "description": "" + }, + "popup_no_subject": { + "message": "(sin asunto)", + "description": "" + }, + "popup_open_settings": { + "message": "Abrir configuración", + "description": "" + }, + "popup_open_inbox": { + "message": "Abrir bandeja de entrada", + "description": "" + }, + "popup_archive": { + "message": "Archivar", + "description": "" + }, + "popup_spam": { + "message": "Spam", + "description": "" + }, + "popup_trash": { + "message": "Eliminar", + "description": "" + }, + "popup_refresh": { + "message": "Actualizar", + "description": "" + }, + "popup_read": { + "message": "Marcar como leído", + "description": "" + }, + "popup_read_all": { + "message": "Marcar todos como leídos", + "description": "" + }, + "popup_msg_1": { + "message": "ahora", + "description": "" + }, + "popup_msg_2": { + "message": "hace 1 minuto", + "description": "" + }, + "popup_msg_3_format": { + "message": "hace %d minutos", + "description": "" + }, + "popup_msg_4": { + "message": "hace 1 hora", + "description": "" + }, + "popup_msg_5": { + "message": "hace algunas horas", + "description": "" + }, + "popup_msg_6": { + "message": "Ayer", + "description": "" + }, + "popup_msg_7_format": { + "message": "hace %d días", + "description": "" + }, + "popup_msg_8_format": { + "message": "hace %d semana(s)", + "description": "" + }, + "popup_msg_9_format": { + "message": "hace %d mes(es)", + "description": "" + }, + "popup_msg_10": { + "message": "Enero", + "description": "" + }, + "popup_msg_11": { + "message": "Febrero", + "description": "" + }, + "popup_msg_12": { + "message": "Marzo", + "description": "" + }, + "popup_msg_13": { + "message": "Abril", + "description": "" + }, + "popup_msg_14": { + "message": "Mayo", + "description": "" + }, + "popup_msg_15": { + "message": "Junio", + "description": "" + }, + "popup_msg_16": { + "message": "Julio", + "description": "" + }, + "popup_msg_17": { + "message": "Agosto", + "description": "" + }, + "popup_msg_18": { + "message": "Septiembre", + "description": "" + }, + "popup_msg_19": { + "message": "Octubre", + "description": "" + }, + "popup_msg_20": { + "message": "Noviembre", + "description": "" + }, + "popup_msg_21": { + "message": "Diciembre", + "description": "" + }, + "settings_open_title": { + "message": "Abrir página de opciones (ajustes)", + "description": "" + }, + "settings_open_label": { + "message": "Abrir opciones", + "description": "" + }, + "gmail": { + "message": "Notifier for Gmail™", + "description": "" + } +} \ No newline at end of file diff --git a/v3.classic/_locales/fr/messages.json b/v3.classic/_locales/fr/messages.json new file mode 100644 index 00000000..1f2568af --- /dev/null +++ b/v3.classic/_locales/fr/messages.json @@ -0,0 +1,590 @@ +{ + "gmail": { + "message": "Notifieur pour Gmail™" + }, + "toolbar_label": { + "message": "Notifieur pour Gmail™" + }, + "description": { + "message": "Notifieur multi-comptes et multi-libellés pour Google Mail (Gmail™)" + }, + "log_in_to_your_account": { + "message": "Veuillez vous connecter à votre compte Gmail™" + }, + "msg_1": { + "message": "L’onglet est déjà ouvert. Cliquez sur le bouton de la barre d’outils pour ouvrir Gmail™ dans un nouvel onglet ou pour passer à un onglet Gmail™ existant." + }, + "msg_2": { + "message": "Le lien a été copié dans le presse-papiers." + }, + "msg_3": { + "message": "Le texte sélectionné a été copié dans le presse-papiers." + }, + "msg_4": { + "message": "Remarque : pour que le notifieur fonctionne correctement, vous devez être connecté à votre compte Google." + }, + "msg_5": { + "message": "Choisir un fichier son audio" + }, + "label_1": { + "message": "Rafraîchir" + }, + "label_2": { + "message": "Paramètres" + }, + "label_3": { + "message": "Désactiver toutes les notifications" + }, + "label_4": { + "message": "Pour 5 min" + }, + "label_5": { + "message": "Pour 15 min" + }, + "label_6": { + "message": "Pour 30 min" + }, + "label_7": { + "message": "Pour 1 heure" + }, + "label_8": { + "message": "Pour 2 heures" + }, + "label_9": { + "message": "Pour 5 heures" + }, + "label_13": { + "message": "Pour la période de temps personnalisée" + }, + "label_10": { + "message": "Activer les notifications (session)" + }, + "label_11": { + "message": "Rédiger un e-mail" + }, + "label_12": { + "message": "Ouvrir la FAQ" + }, + "label_14": { + "message": "Compte(s) connecté(s) :" + }, + "unknown": { + "message": "inconnu" + }, + "and": { + "message": "et" + }, + "log_into_your_account": { + "message": "Veuillez vous connecter à votre compte" + }, + "notification": { + "message": "De : [author_email][break] Objet : [title][break] Résumé : [summary]" + }, + "options_title": { + "message": "Options - Gmail™ Notifier" + }, + "options_inshort": { + "message": "Notifieur multi-comptes et multi-libellés pour Google Mail (Gmail™)." + }, + "options_donation": { + "message": "Faire un don €" + }, + "options_timings": { + "message": "Temporisations" + }, + "options_timings_l1": { + "message": "Relever les nouveaux e-mails toutes les (en secondes) :" + }, + "options_timings_l2": { + "message": "La période minimum est de 10 secondes." + }, + "options_timings_l3": { + "message": "Rappeler les e-mails non lus toutes les (en minutes) :" + }, + "options_timings_l4": { + "message": "Positionner la valeur à zéro pour tous les rappels non périodiques." + }, + "options_timings_l5": { + "message": "La période minimum est de 5 minutes." + }, + "options_timings_l6": { + "message": "Une valeur non nulle déclenche une notification sur le bureau et une alerte sonore (similaire à l’arrivée d’un nouvel e-mail) de façon perpétuelle, si vous avez un ou plusieurs e-mails non lus." + }, + "options_timings_l7": { + "message": "Ne pas relever les nouveaux e-mails au démarrage avant (en secondes) :" + }, + "options_timings_l8": { + "message": "Positionner la valeur à zéro pour éviter le relevé d’e-mails jusqu’au premier rafraîchissement manuel [Non disponible avec Safari]." + }, + "options_gmail": { + "message": "Gmail™" + }, + "options_gmail_1": { + "message": "Compte principal (/mail/u/0/)" + }, + "options_gmail_2": { + "message": "Séparer les libellés par des \",\" (virgules)." + }, + "options_gmail_3": { + "message": "2ème compte (/mail/u/1/)" + }, + "options_gmail_4": { + "message": "3ème compte (/mail/u/2/)" + }, + "options_gmail_5": { + "message": "4ème compte (/mail/u/3/)" + }, + "options_gmail_6": { + "message": "5ème compte (/mail/u/4/)" + }, + "options_gmail_7": { + "message": "6ème compte (/mail/u/5/)" + }, + "options_gmail_8": { + "message": "Marquer les messages comme lus en les archivant" + }, + "options_gmail_15": { + "message": "Quelques libellés populaires :" + }, + "options_gmail_10": { + "message": "Recevoir les notifications pour les libellés et comptes suivants :" + }, + "options_gmail_11": { + "message": "Flux personnalisés :" + }, + "options_gmail_12": { + "message": "Séparer les flux par des \",\" (virgules). Exemple de flux : https://mail.google.com/mail/u/0/feed/atom/inbox" + }, + "options_gmail_13": { + "message": "Remarque : le nombre maximal pour tous les libellés sauf «Boîte de réception» est de 20 (les flux Google ne fournissent que les 20 entrées les plus récentes)." + }, + "options_gmail_14": { + "message": "Remarque : pour que le notifieur écoute plus de 5 comptes, ajoutez les URL des flux au champ «Flux personnalisés». Par exemple, pour écouter les 6e et 7e comptes, ajoutez : https://mail.google.com/mail/u/6/feed/atom/inbox, https://mail.google.com/mail/u/7/feed/atom/inbox" + }, + "options_notifications": { + "message": "Notifications" + }, + "options_notifications_1": { + "message": "Afficher la notification sur le bureau pour les nouveaux e-mails" + }, + "options_notifications_2": { + "message": "Présenter la notification de bureau pendant (en secondes) :" + }, + "options_notifications_3": { + "message": "Cette option peut ne pas fonctionner sur votre système d’exploitation." + }, + "options_notifications_4": { + "message": "Format de notification :" + }, + "options_notifications_5": { + "message": "Variables disponibles :" + }, + "options_notifications_6": { + "message": "Tronquer les notifications plus longues que" + }, + "options_notifications_7": { + "message": "caractères pour les champs [objet] et [résumé]." + }, + "options_notifications_8": { + "message": "Pour ne pas tronquer avec des points de suspension, utiliser un nombre élevé." + }, + "options_notifications_9": { + "message": "Jouer l’alerte sonore pour les nouveaux e-mails" + }, + "options_notifications_10": { + "message": "Remarque : pour les utilisateurs de Mac. Depuis la version 28.0 de Firefox, toutes les notifications de bureau sont gérées par le «Centre de notifications» Mac qui provoque une alerte sonore supplémentaire. Vous devez désactiver soit cette notification sonore, soit celle générée par le «Centre de notifications»." + }, + "options_notifications_11": { + "message": "Afficher la notification dans la barre de tâches Windows™ ou dans le dock Mac OS" + }, + "options_notifications_12": { + "message": "Les notifications dans la barre de tâches ne sont pas supportées sous Linux pour le moment." + }, + "options_notifications_13": { + "message": "Ouvrir le panneau de la barre d’outils par un clic sur l’icône de notification dans la barre de tâches (uniquement sous Windows™, beta)" + }, + "options_notifications_14": { + "message": "Cette fonctionnalité est hautement expérimentale et pourrait rendre instable votre navigateur Firefox. [Redémarrage nécessaire]." + }, + "options_notifications_15": { + "message": "Notification sonore par défaut :" + }, + "options_notifications_16": { + "message": "Alerte par défaut de Gmail™ Notifier" + }, + "options_notifications_17": { + "message": "Alerte «Bell» de Chrome «Checker Plus»" + }, + "options_notifications_18": { + "message": "Alerte «Ding» de Chrome «Checker Plus»" + }, + "options_notifications_19": { + "message": "Alerte sonore Windows™ Mail " + }, + "options_notifications_20": { + "message": "Son défini par l’utilisateur" + }, + "options_notifications_21": { + "message": "Notification sonore définie par l’utilisateur :" + }, + "options_notifications_22": { + "message": "Si votre navigateur ne lit pas le son de notification personnalisé, essayez de le convertir en un format WAV simple à l’aide d’un outil de conversion en ligne." + }, + "options_notifications_35": { + "message": "Pour sélectionner un nouveau son personnalisé, sélectionnez d’abord un son intégré, puis modifiez le choix de l’option en son personnalisé." + }, + "options_notifications_23": { + "message": "Le Volume de la notification sonore (en %) :" + }, + "options_notifications_24": { + "message": "Le volume est un nombre entre 0 et 100 (%). 100 % est le volume le plus fort (par défaut)." + }, + "options_notifications_25": { + "message": "Dans Safari, il est probable que les notifications sonores par défaut ne soient pas jouées correctement. Si c’est le cas, utilisez un fichier son personnel comme notification." + }, + "options_notifications_26": { + "message": "Toujours afficher la notification dans la barre des taches (uniquement sous Windows™)" + }, + "options_notifications_27": { + "message": "La notification dans la barre des taches sera affichée même si tous les messages sont lus." + }, + "options_notifications_28": { + "message": "Désactiver toutes les notifications pendant une période de temps personnalisée (en minutes) :" + }, + "options_notifications_29": { + "message": "Cette option est liée au menu contextuel du bouton de la barre d’outils -> Désactiver toutes les notifications -> Période de temps personnalisée" + }, + "options_notifications_30": { + "message": "Combiner toutes les notifications simultanées de bureau en une seule notification" + }, + "options_notifications_31": { + "message": "Son personnalisé pour :" + }, + "options_notifications_32": { + "message": "nom ou contenus d’e-mail" + }, + "options_notifications_33": { + "message": "titre des contenus d’e-mail" + }, + "options_notifications_34": { + "message": "sommaire de contenus d’e-mail" + }, + "options_notifications_36": { + "message": "Demander à Gmail™ d’empêcher la redirection «inbox.google.com»" + }, + "options_notifications_37": { + "message": "Afficher le nombre d’e-mail non lus sur le badge (et choisir la couleur du badge)" + }, + "options_notifications_38": { + "message": "Pour Chrome uniquement : autoriser les actions plus rapides (marquer comme lu, supprimer, ...) (Considérer les actions à résoudre lorsque les en-têtes sont reçus)" + }, + "options_notifications_40": { + "message": "Pour Chrome uniquement et si les actions rapides sont autorisées pour la boîte de notification (choisir 2 actions au maximum) :" + }, + "options_notifications_41": { + "message": "Marquer comme lu" + }, + "options_notifications_42": { + "message": "Archiver" + }, + "options_notifications_43": { + "message": "Supprimer" + }, + "options_tab": { + "message": "Ouverture d’onglet" + }, + "options_tab_1": { + "message": "Ne chercher un compte Gmail™ ouvert, que dans la fenêtre active" + }, + "options_tab_2": { + "message": "Ne pas chercher les comptes Gmail™ ouverts dans les autres fenêtres du navigateur. Si Gmail™ n’est pas ouvert dans la fenêtre active, ouvrir un nouvel onglet." + }, + "options_tab_3": { + "message": "Ouvrir le nouveau compte Gmail™ à côté de l’onglet actif" + }, + "options_tab_4": { + "message": "Ouvrir le compte Gmail™ dans l’onglet actif" + }, + "options_tab_5": { + "message": "Ouvrir le compte Gmail™ dans un onglet d’arrière-plan" + }, + "options_tab_6": { + "message": "Ouvrir le compte Gmail™ dans une nouvelle fenêtre" + }, + "options_tab_7": { + "message": "Toujours utiliser des onglets vierges au lieu d’ouvrir un nouvel onglet quand l’option ouvrir dans un onglet est activé" + }, + "options_tab_8": { + "message": "Ignorer les onglets Gmail™ ouverts" + }, + "options_tab_9": { + "message": "Lorsque cette case est cochée, le notificateur ouvre les e-mails dans de nouveaux onglets du navigateur. Lorsque cette case n'est pas cochée, il recherchera d'abord dans la fenêtre active un onglet Gmail™ existant et y basculera. S'il n'est pas trouvé, il recherchera d'autres fenêtres ouvertes avant d'ouvrir un nouvel onglet." + }, + "options_tab_10": { + "message": "Ouvrir les e-mails en mode HTML basique" + }, + "options_tab_11": { + "message": "Cliquer sur le titre d'un e-mail non lu ouvre Gmail™ sur l'e-mail lui-même au lieu d’ouvrir le dossier «Boîte de réception»" + }, + "options_toolbar": { + "message": "Barre d’outils" + }, + "options_toolbar_1": { + "message": "Comportement du bouton de la barre d’outils :" + }, + "options_toolbar_2": { + "message": "Toujours ouvrir le panneau de prévisualisation d’e-mail" + }, + "options_toolbar_3": { + "message": "Ouvrir le compte Gmail™ si un seul compte est connecté" + }, + "options_toolbar_18": { + "message": "Ouvrir le compte Gmail™ (mode forcé)" + }, + "options_toolbar_4": { + "message": "Mode d’affichage du panneau de la barre d’outils :" + }, + "options_toolbar_5": { + "message": "Afficher le résumé uniquement" + }, + "options_toolbar_6": { + "message": "Afficher la totalité du contenu" + }, + "options_toolbar_7": { + "message": "Largeur du panneau de la barre d’outils dans le mode «contenu total» (en pixels) :" + }, + "options_toolbar_8": { + "message": "La largeur minimale est de 500 pixels." + }, + "options_toolbar_9": { + "message": "Hauteur du panneau de la barre d’outils dans le mode «contenu total» (en pixels) :" + }, + "options_toolbar_10": { + "message": "La hauteur minimale est de 500 pixels." + }, + "options_toolbar_11": { + "message": "Supporter les raccourcis clavier dans le panneau de la barre d’outils" + }, + "options_toolbar_12": { + "message": "Signaler comme spam : < ! >, Supprimer : < # >, Archiver : < e >, Marquer comme lu : < Shift + i >." + }, + "options_toolbar_13": { + "message": "Afficher les e-mails en rendu HTML dans le mode «contenu total»" + }, + "options_toolbar_14": { + "message": "Si vous préférez le rendu «texte uniquement» dans le mode «contenu total», décochez cette case." + }, + "options_toolbar_15": { + "message": "Cliquer avec le bouton du milieu sur l’icône de la barre d’outils pour" + }, + "options_toolbar_16": { + "message": "Rafraîchir tous les comptes" + }, + "options_toolbar_17": { + "message": "Ouvrir le compte Gmail™ principal" + }, + "options_misc": { + "message": "Divers" + }, + "options_misc_1": { + "message": "Trier les comptes par ordre alphabétique" + }, + "options_misc_2": { + "message": "Le type de tri par défaut respecte l’ordre de connexions." + }, + "options_misc_3": { + "message": "Légende des couleurs du bouton de la barre d’outils :" + }, + "options_misc_4": { + "message": "gris pour «Tous lus» et bleu pour «Déconnecté»" + }, + "options_misc_5": { + "message": "bleu pour «Tous lus» et gris pour «Déconnecté»" + }, + "options_misc_9": { + "message": "rouge pour «Tous lus» et gris pour «Déconnecté»" + }, + "options_misc_6": { + "message": "Afficher une notification sur le bureau pour avertir que Gmail™ est déjà ouvert dans l’onglet actif" + }, + "options_misc_7": { + "message": "Afficher la page de bienvenue après une mise à jour" + }, + "options_misc_8": { + "message": "Réinitialiser tous les paramètres à leurs valeurs par défaut" + }, + "options_misc_10": { + "message": "Ne déclencher les notifications de bureau et les notifications sonores que lorsqu’un e-mail est arrivé depuis moins de (en minutes) :" + }, + "options_misc_11": { + "message": "En positionnant cette préférence à zéro, vous ne recevrez ni notifications de bureau ni notifications sonores ; malgré tout, la notification de badge continuera ses mises à jour." + }, + "options_misc_12": { + "message": "Ne pas inclure de détails d’identifiant dans la bulle textuelle" + }, + "options_misc_13": { + "message": "Par défaut, le notifieur met à jour la bulle textuelle du bouton de la barre d’outils avec des infos d’identifiant. En désactivant cette option, la bulle textuelle restera à sa valeur par défaut." + }, + "options_misc_14": { + "message": "Ne pas afficher le nombre badge exact quand le nombre d’e-mails non lus est supérieur à 999" + }, + "options_misc_15": { + "message": "Ouvrir la page FAQ sur les mises à jour" + }, + "options_misc_16": { + "message": "Thème de couleur par défaut pour le panneau :" + }, + "options_misc_17": { + "message": "Thème clair" + }, + "options_misc_18": { + "message": "Thème sombre" + }, + "options_misc_19": { + "message": "Thème système" + }, + "options_plugins": { + "message": "Plug-ins" + }, + "options_plugins_1": { + "message": "Libellés Gmail™ et bouton étoile (expérimental)" + }, + "options_plugins_2": { + "message": "Ce plugin affiche le bouton étoile ainsi que les libellés des fils de discussion dans la fenêtre contextuelle (mode étendu uniquement)." + }, + "options_styling": { + "message": "Mise en Style" + }, + "options_styling_0": { + "message": "Vue des e-mail à l'échelle (0,5-4)" + }, + "options_styling_1": { + "message": "Règles CSS personnalisées pour le panneau supérieur" + }, + "options_styling_2": { + "message": "Règles CSS personnalisées pour la vue des e-mail" + }, + "options_px": { + "message": "pixel(s)" + }, + "options_empty": { + "message": "non défini" + }, + "options_button_test": { + "message": "Jouer le son ►" + }, + "options_button_reset": { + "message": " <= Remise à zéro des préférences => " + }, + "popup_settings": { + "message": "Paramètres" + }, + "popup_of": { + "message": "sur" + }, + "popup_wait": { + "message": "Patientez..." + }, + "popup_date_format": { + "message": "%mm %jj %aa" + }, + "popup_no_subject": { + "message": "(aucun objet)" + }, + "popup_open_settings": { + "message": "Paramètres" + }, + "popup_open_inbox": { + "message": "Boîte de réception" + }, + "popup_archive": { + "message": "Archiver" + }, + "popup_spam": { + "message": "Spam !" + }, + "popup_trash": { + "message": "Supprimer" + }, + "popup_refresh": { + "message": "Rafraîchir" + }, + "popup_read": { + "message": "Marquer comme lu" + }, + "popup_read_all": { + "message": "Tout marquer comme lu" + }, + "popup_toggle_dark": { + "message": "Thème sombre <==> Thème clair" + }, + "popup_msg_1": { + "message": "à l’instant" + }, + "popup_msg_2": { + "message": "1 minute plus tôt" + }, + "popup_msg_3_format": { + "message": "%d minutes plus tôt" + }, + "popup_msg_4": { + "message": "1 heure plus tôt" + }, + "popup_msg_5": { + "message": "heures plus tôt" + }, + "popup_msg_6": { + "message": "Hier" + }, + "popup_msg_7_format": { + "message": "%d jours plus tôt" + }, + "popup_msg_8_format": { + "message": "%d semaines plus tôt" + }, + "popup_msg_9_format": { + "message": "%d mois plus tôt" + }, + "popup_msg_10": { + "message": "Janvier" + }, + "popup_msg_11": { + "message": "Février" + }, + "popup_msg_12": { + "message": "Mars" + }, + "popup_msg_13": { + "message": "Avril" + }, + "popup_msg_14": { + "message": "Mai" + }, + "popup_msg_15": { + "message": "Juin" + }, + "popup_msg_16": { + "message": "Juillet" + }, + "popup_msg_17": { + "message": "Août" + }, + "popup_msg_18": { + "message": "Septembre" + }, + "popup_msg_19": { + "message": "Octobre" + }, + "popup_msg_20": { + "message": "Novembre" + }, + "popup_msg_21": { + "message": "Décembre" + }, + "settings_open_title": { + "message": "Ouvrir la page des options (paramètres)" + }, + "settings_open_label": { + "message": "Ouvrir les options" + } +} diff --git a/v3.classic/_locales/he/messages.json b/v3.classic/_locales/he/messages.json new file mode 100644 index 00000000..6d87af11 --- /dev/null +++ b/v3.classic/_locales/he/messages.json @@ -0,0 +1,758 @@ +{ + "toolbar_label": { + "message": "Notifier for Gmail™", + "description": "" + }, + "tooltip_1": { + "message": "כפתור שמאלי: פתח Gmail או הצג תצוגה מקדימה", + "description": "" + }, + "tooltip_2": { + "message": "כפתור אמצעי (או Ctrl+Left): עדכן את כל החשבונות", + "description": "" + }, + "tooltip_3": { + "message": "כפתור ימני: בחירת חשבון", + "description": "" + }, + "description": { + "message": "מתריע על הודעות חדשות בחשבון ה-Gmail בכמה חשבונות ותוויות", + "description": "" + }, + "log_in_to_your_account": { + "message": "אנא התחבר לחשבון ה-Gmail שלך", + "description": "" + }, + "msg_1": { + "message": "קיימת לשונית פתוחה עם Gmail. לחץ על האייקון של התוסף על מנת לפתוח לשונית חדשה או עבור ללשונית הקיימת.", + "description": "" + }, + "msg_2": { + "message": "הקישור הועתק בהצלחה.", + "description": "" + }, + "msg_3": { + "message": "הטקסט הנבחר הועתק בהצלחה.", + "description": "" + }, + "msg_4": { + "message": "שים לב: על מנת שהתוסף יעבוד כצפוי עליך להתחבר לחשבון ה-Gmail שלך.", + "description": "" + }, + "msg_5": { + "message": "בחר קובץ לצליל", + "description": "" + }, + "label_1": { + "message": "רענן", + "description": "" + }, + "label_2": { + "message": "מאפיינים", + "description": "" + }, + "label_3": { + "message": "כבה את כל ההתראות", + "description": "" + }, + "label_4": { + "message": "ל-5 דקות", + "description": "" + }, + "label_5": { + "message": "ל-15 דקות", + "description": "" + }, + "label_6": { + "message": "ל-30 דקות", + "description": "" + }, + "label_7": { + "message": "לשעה", + "description": "" + }, + "label_8": { + "message": "לשעתיים", + "description": "" + }, + "label_9": { + "message": "ל-5 שעות", + "description": "" + }, + "label_13": { + "message": "לתקופה", + "description": "" + }, + "label_10": { + "message": "הפעל התראות (עבור הסשיין)", + "description": "" + }, + "label_11": { + "message": "צור מייל חדש", + "description": "" + }, + "label_12": { + "message": "פתח FAQ", + "description": "" + }, + "label_14": { + "message": "חשבונות מחוברים", + "description": "" + }, + "unknown": { + "message": "לא ידוע", + "description": "" + }, + "and": { + "message": "וגם", + "description": "" + }, + "log_into_your_account": { + "message": "אנא התחבר לחשבונך ב-Gmail", + "description": "" + }, + "notification": { + "message": "התקבל מ: [שם הכותב][break]כותרת: [כותרת][break]תקציר: [תקציר]", + "description": "" + }, + "options_title": { + "message": "אפשרויות - Gmail™ Notifier", + "description": "" + }, + "options_inshort": { + "message": "מתריע על הודעות חדשות בחשבון ה-Gmail בכמה חשבונות ותוויות", + "description": "" + }, + "options_donation": { + "message": "תמוך בפיתוח", + "description": "" + }, + "options_timings": { + "message": "תזמונים:", + "description": "" + }, + "options_timings_l1": { + "message": "בדוק עבור אמיילים חדשים כל (שניות):", + "description": "" + }, + "options_timings_l2": { + "message": "זמן מינימלי הוא 10 שניות.", + "description": "" + }, + "options_timings_l3": { + "message": "הזכר עבור כל הלא נקראו כל (בדק'):", + "description": "" + }, + "options_timings_l4": { + "message": "קבע כ-0 עבור כיבוי התזכורת.", + "description": "" + }, + "options_timings_l5": { + "message": "זמן מינימלי הוא 5 דקות.", + "description": "" + }, + "options_timings_l6": { + "message": "ערך שונה מ-0 יגרום לשני צלילים, גם של בועית ההתראות וגם של התראות הדפדפן (בדומה לקבלת אימייל חדש) במידה ויש לך אימיילים שלא נקראו.", + "description": "" + }, + "options_timings_l7": { + "message": "אל תבדוק בעלייה ראשונה עבור אימיילים חדשים למשך (שניות):", + "description": "" + }, + "options_timings_l8": { + "message": "קבע כ-0 על מנת לא לבצע בדיקת אימיילים חדשה בעלייה כלל, עד הבדיקה הידנית (לא אפשרי בדפדפן Safari).", + "description": "" + }, + "options_gmail": { + "message": "Gmail:", + "description": "" + }, + "options_gmail_1": { + "message": "חשבון ראשון (/mail/u/0/)", + "description": "" + }, + "options_gmail_2": { + "message": "הפרד תווית באמצעות \",\" (פסיק).", + "description": "" + }, + "options_gmail_3": { + "message": "חשבון שני (/mail/u/1/)", + "description": "" + }, + "options_gmail_4": { + "message": "חשבון שלישי (/mail/u/2/)", + "description": "" + }, + "options_gmail_5": { + "message": "חשבון רביעי (/mail/u/3/)", + "description": "" + }, + "options_gmail_6": { + "message": "חשבון חמישי (/mail/u/4/)", + "description": "" + }, + "options_gmail_7": { + "message": "חשבון שישי (/mail/u/5/)", + "description": "" + }, + "options_gmail_8": { + "message": "סמן הודעות כנקראו בעת העברה לארכיון", + "description": "" + }, + "options_gmail_15": { + "message": "תוויות נפוצות:", + "description": "" + }, + "options_gmail_10": { + "message": "הצ התרעות עבור התוויות הבאות:", + "description": "" + }, + "options_gmail_11": { + "message": "מקור מותאם אישית:", + "description": "" + }, + "options_gmail_12": { + "message": "הפרד מקורות ע\"י פסיק (,). לדוגמא: https://mail.google.com/mail/u/0/feed/atom/inbox", + "description": "" + }, + "options_gmail_13": { + "message": "הערה: מספר התוויות המקסימלי (מלבד אינבוקס) הוא 20", + "description": "" + }, + "options_gmail_14": { + "message": "הערה: בשביל שהתוסף יאזין ליותר מ-5 חשבונות, הוסף את כתובות ה-feed לשדה \"Custom Feeds\". לדוגמא על מנת להאזין לחשבונות ה-6 ו-7 תוסיף:\nhttps://mail.google.com/mail/u/6/feed/atom/inbox, https://mail.google.com/mail/u/7/feed/atom/inbox", + "description": "" + }, + "options_notifications": { + "message": "התרעות:", + "description": "" + }, + "options_notifications_1": { + "message": "הצג התרעות משולחן העבודה עבור מיילים חדשים", + "description": "" + }, + "options_notifications_2": { + "message": "הצג התראות מערכת למשך (שניות):", + "description": "" + }, + "options_notifications_3": { + "message": "ייתתכן ואפשרות זו לא תעבוד במערכת ההפעלה שלך.", + "description": "" + }, + "options_notifications_4": { + "message": "מבנה ההתרעה", + "description": "" + }, + "options_notifications_5": { + "message": "משתנים קיימים:", + "description": "" + }, + "options_notifications_6": { + "message": "קצר התרעות הארוכות מ", + "description": "" + }, + "options_notifications_7": { + "message": "תווים עבור שדות [כותרת] ו-[תקציר].", + "description": "" + }, + "options_notifications_8": { + "message": "על מנת למנוע חיתוך השתמש במספר גדול.", + "description": "" + }, + "options_notifications_9": { + "message": "השמע צליל התראה עבור אימיילים חדשים", + "description": "" + }, + "options_notifications_10": { + "message": "שימו לב: עבור משתמשי Mac, החל מ-Firefox גרסה 28.0 כל התראות הבועית מנועלות ע\"י Mac Notification Center מה שגורם להשמעת צליל נוסף.\nעליך לבטל את אחד הצלילים.", + "description": "" + }, + "options_notifications_11": { + "message": "הצג התראות בועית ב-וינדוס או ב-Mac.", + "description": "" + }, + "options_notifications_12": { + "message": "בועית ההתראות אינה נתמכת במערכת ההפעלה Linux.", + "description": "" + }, + "options_notifications_13": { + "message": "פתח את התצוגה המקדימה בעת לחיצה על בועית ההתראות (בוינדוס בלבד, בטא)", + "description": "" + }, + "options_notifications_14": { + "message": "אפשרות זו נסיונית ויכולה לגרום לקריסת דפדפן Firefox. (מצריך הפעלה מחדש של הדפדפן).", + "description": "" + }, + "options_notifications_15": { + "message": "צליל ברירת מחדל", + "description": "" + }, + "options_notifications_16": { + "message": "צליל התראה ברירת מחדל", + "description": "" + }, + "options_notifications_17": { + "message": "צליל Checker Plus bell", + "description": "" + }, + "options_notifications_18": { + "message": "צליל Checker Plus ding ", + "description": "" + }, + "options_notifications_19": { + "message": "בועית התראות אימייל", + "description": "" + }, + "options_notifications_20": { + "message": "צליל מותאם אישית", + "description": "" + }, + "options_notifications_21": { + "message": "צליל התראות מותאם אישית", + "description": "" + }, + "options_notifications_22": { + "message": "אם הדפדפן אינו מנגן את צליל ההתראות, נסה להמיר אותו לקובץ WAV עם אחד מכלי ההמרה הזמינים ברשת.", + "description": "" + }, + "options_notifications_35": { + "message": "לבחירת צליל אישי חדש, בחר תחילה בצליל המובנה ולאחר מכן שנה אותו לצליל אישי", + "description": "" + }, + "options_notifications_23": { + "message": "עוצמת השמע של ההתראה הוא", + "description": "" + }, + "options_notifications_24": { + "message": "עוצמת שמע הוא מספר בין 0 ל-100, כאשר 100 היא העוצמה המקסימלית (ברירת מחדל).", + "description": "" + }, + "options_notifications_25": { + "message": "בסאפרי רוב הסיכויים שצליל ההתראות אינו עובד, אם זה המצב, השתמש בצליל אישי.", + "description": "" + }, + "options_notifications_26": { + "message": "תמיד הצג התרעת בועית (עבור חלונות בלבד)", + "description": "" + }, + "options_notifications_27": { + "message": "התרעות בועית יוצגו גם אם אין אימיילים שלא נקראו.", + "description": "" + }, + "options_notifications_28": { + "message": "כבה את כל ההתראות למשך תקופה (בדק'):", + "description": "" + }, + "options_notifications_29": { + "message": "אופציה זו שייכת לתפריט הכפתור הימני.", + "description": "" + }, + "options_notifications_30": { + "message": "אחד את כל התראות המערכת להתראה אחת", + "description": "" + }, + "options_notifications_31": { + "message": "צליל התראות אישי", + "description": "" + }, + "options_notifications_32": { + "message": "שם או אימייל מכילים", + "description": "" + }, + "options_notifications_33": { + "message": "נושא המייל מכיל", + "description": "" + }, + "options_notifications_34": { + "message": "גוף המייל מכיל", + "description": "" + }, + "options_notifications_36": { + "message": "בקש מג'ימייל למנוע מעבר ל- 'inbox.google.com'", + "description": "" + }, + "options_notifications_37": { + "message": "הצג מספר", + "description": "" + }, + "options_notifications_38": { + "message": "פעולות מהירות (סמן כנקרא, מחק, ...) נחשבים כבוצעות בקבלת ה-headers של הבקשה.", + "description": "" + }, + "options_notifications_40": { + "message": "אפשר פעולות מהירות מתיבת הנוטיפיקציה (עד 2 פעולות)\n(כרום בלבד)", + "description": "" + }, + "options_notifications_41": { + "message": "סמן כנקרא", + "description": "" + }, + "options_notifications_42": { + "message": "ארכיון", + "description": "" + }, + "options_notifications_43": { + "message": "אשפה", + "description": "" + }, + "options_tab": { + "message": "פתיחת לשוניות:", + "description": "" + }, + "options_tab_1": { + "message": "חפש עבור לשונית עם Gmail רק עבור החלון הפעיל", + "description": "" + }, + "options_tab_2": { + "message": "אל תחפש בחלונות אחרים עבור לשונית Gmail. אם אין לשונית עם Gmail בחלון הנוכחי, פתח לשונית חדשה.", + "description": "" + }, + "options_tab_3": { + "message": "פתח חשבון Gmail בסמוך ללשונית הפעילה", + "description": "" + }, + "options_tab_4": { + "message": "פתח חשבון Gmail בלשונית קיימת", + "description": "" + }, + "options_tab_5": { + "message": "פתח חשבון Gmail בלשונית נסתרת", + "description": "" + }, + "options_tab_6": { + "message": "פתח חשבון Gmail בחלון חדש", + "description": "" + }, + "options_tab_7": { + "message": "תמיד השתמש בטאב ריק במקום טאב חדש על מנת לפתוח", + "description": "" + }, + "options_tab_8": { + "message": "התעלם מלשוניות ג'ימייל פתוחות", + "description": "" + }, + "options_tab_9": { + "message": "כשלא מסומן, התוסף מחפש בחלון הנוכחי לשונית של ג'ימייל או פותח לשונית חדשה.", + "description": "" + }, + "options_tab_10": { + "message": "פתח מיילים במוד HTML בסיסי", + "description": "" + }, + "options_toolbar": { + "message": "סרגל הכלים:", + "description": "" + }, + "options_toolbar_1": { + "message": "כפתור סרגל הכלים", + "description": "" + }, + "options_toolbar_2": { + "message": "תפיד פתח את חלונית התצוגה", + "description": "" + }, + "options_toolbar_3": { + "message": "פתח את Gmail רק במידה ומחוברים עם חשבון יחיד", + "description": "" + }, + "options_toolbar_18": { + "message": "פתח את ג'ימייל", + "description": "" + }, + "options_toolbar_4": { + "message": "מצב תצוגה מקדימה", + "description": "" + }, + "options_toolbar_5": { + "message": "התג תקציר בלבד", + "description": "" + }, + "options_toolbar_6": { + "message": "הצג את כל התוכן", + "description": "" + }, + "options_toolbar_7": { + "message": "גובה חלונית תצוגה מקדימה במצב מצומצם (פיקסלים):", + "description": "" + }, + "options_toolbar_8": { + "message": "רוחב מינימלי הוא 500px.", + "description": "" + }, + "options_toolbar_9": { + "message": "גובה חלונית תצוגה מקדימה במצב מלא (פיקסלים):", + "description": "" + }, + "options_toolbar_10": { + "message": "גובה מינימלי הוא 500px.", + "description": "" + }, + "options_toolbar_11": { + "message": "תמוך בקיצורי מקלדת בתוסף", + "description": "" + }, + "options_toolbar_12": { + "message": "!: דווח כספם, #: השלך לאשפה, Shift+i: סמן כנקרא.", + "description": "" + }, + "options_toolbar_13": { + "message": "הצג את כל תוכן המיילים בתצוגה מורחבת.", + "description": "" + }, + "options_toolbar_14": { + "message": "אם אתה מעדיף תצוגת טקסט בלבד במצב תצוגה מקדימה מורחבת, בטל סימון.", + "description": "" + }, + "options_toolbar_15": { + "message": "לחיצת כפתור האמצעי על האייקון בתפריט עבור", + "description": "" + }, + "options_toolbar_16": { + "message": "רענן את כל החשבונות", + "description": "" + }, + "options_toolbar_17": { + "message": "פתח את חשבון ה-Gmail הראשי", + "description": "" + }, + "options_misc": { + "message": "שונות:", + "description": "" + }, + "options_misc_1": { + "message": "מיין חשבונות לפי א-ב", + "description": "" + }, + "options_misc_2": { + "message": "סדר הופעת", + "description": "" + }, + "options_misc_3": { + "message": "צבע העיגול בתפריט", + "description": "" + }, + "options_misc_4": { + "message": "אפור עבור ״לא נקראו״ וכחול עבור ״מנותק״", + "description": "" + }, + "options_misc_5": { + "message": "כחול עבור ״לא נקראו״ ואפור עבור ״מנותק״", + "description": "" + }, + "options_misc_9": { + "message": "צבע אדום ל-\"לא נקרא\" וצבע אפור ל-\"לא מחובר\"", + "description": "" + }, + "options_misc_6": { + "message": "הצג התראות מערכת ההפעלה בכדי להזהיר שג'ימייל כבר פתוח בלשונית הנוכחית", + "description": "" + }, + "options_misc_7": { + "message": "הצג הודעת פתיחה בעת עדכון התוסף", + "description": "" + }, + "options_misc_8": { + "message": "אפס את כל ההגדרות", + "description": "" + }, + "options_misc_10": { + "message": "התרע עבור מיילים חדשים אשר הגיעו בפחות מ (בדק'):", + "description": "" + }, + "options_misc_11": { + "message": "ע\"י קביעת ערך זה ל-0, תמע קבלת התראות מערכת ההפעלה (כולל צליל), תקבל אך ורק התראות בדפדפן.", + "description": "" + }, + "options_misc_12": { + "message": "אל תציג פרטי התחברות בפרטי הסבר הקצר", + "description": "" + }, + "options_misc_13": { + "message": "כברירת מחדל, התוסף מעדכן את ההסבר הקצר עם פרטי ההתחברות. כשאופציה זו מכובה, ההסבר הקצר ישאר עם המידע הסטטי.", + "description": "" + }, + "options_misc_14": { + "message": "אל תציג את מספר המיילים המדוייק כאשר מספר זה גדול מ-999", + "description": "" + }, + "options_misc_15": { + "message": "פתח עמוד FAQ בעת עדכון", + "description": "" + }, + "options_plugins": { + "message": "פלאגאינים:", + "description": "" + }, + "options_plugins_1": { + "message": "התוויות של ג'ימייל וכפתור הכוכב (נסיוני)", + "description": "" + }, + "options_plugins_2": { + "message": "פלאגאין זה מציג את כפתור הכוכב וכן את תוויות המייל (נסיוני)", + "description": "" + }, + "options_px": { + "message": "px", + "description": "" + }, + "options_empty": { + "message": "לא מוגדר", + "description": "" + }, + "options_button_test": { + "message": "הפעל", + "description": "" + }, + "options_button_reset": { + "message": "אפס מאפיינים", + "description": "" + }, + "popup_settings": { + "message": "הגדרות", + "description": "" + }, + "popup_of": { + "message": "של", + "description": "" + }, + "popup_wait": { + "message": "המתן...", + "description": "" + }, + "popup_date_format": { + "message": "%dd %mm, %yy", + "description": "" + }, + "popup_no_subject": { + "message": "(אין נושא)", + "description": "" + }, + "popup_open_settings": { + "message": "Open Settings", + "description": "" + }, + "popup_open_inbox": { + "message": "Open Inbox", + "description": "" + }, + "popup_archive": { + "message": "ארכיון", + "description": "" + }, + "popup_spam": { + "message": "ספאם", + "description": "" + }, + "popup_trash": { + "message": "מחק", + "description": "" + }, + "popup_refresh": { + "message": "רענן", + "description": "" + }, + "popup_read": { + "message": "סמן כנקרא", + "description": "" + }, + "popup_read_all": { + "message": "סמן הכל כנקרא", + "description": "" + }, + "popup_msg_1": { + "message": "עכשיו", + "description": "" + }, + "popup_msg_2": { + "message": "לפני דקה", + "description": "" + }, + "popup_msg_3_format": { + "message": "לפני %d דקות", + "description": "" + }, + "popup_msg_4": { + "message": "לפני שעה", + "description": "" + }, + "popup_msg_5": { + "message": "לפני שעות", + "description": "" + }, + "popup_msg_6": { + "message": "אתמול", + "description": "" + }, + "popup_msg_7_format": { + "message": "לפני %d ימים", + "description": "" + }, + "popup_msg_8_format": { + "message": "לפני %d שבוע(ות)", + "description": "" + }, + "popup_msg_9_format": { + "message": "לפני %d חודש(ים)", + "description": "" + }, + "popup_msg_10": { + "message": "ינואר", + "description": "" + }, + "popup_msg_11": { + "message": "פברואר", + "description": "" + }, + "popup_msg_12": { + "message": "מרץ", + "description": "" + }, + "popup_msg_13": { + "message": "אפריל", + "description": "" + }, + "popup_msg_14": { + "message": "מאי", + "description": "" + }, + "popup_msg_15": { + "message": "יוני", + "description": "" + }, + "popup_msg_16": { + "message": "יולי", + "description": "" + }, + "popup_msg_17": { + "message": "אוגוסט", + "description": "" + }, + "popup_msg_18": { + "message": "ספטמבר", + "description": "" + }, + "popup_msg_19": { + "message": "אוקטובר", + "description": "" + }, + "popup_msg_20": { + "message": "נובמבר", + "description": "" + }, + "popup_msg_21": { + "message": "דצמבר", + "description": "" + }, + "settings_open_title": { + "message": "פתח עמוד אפשרויות", + "description": "" + }, + "settings_open_label": { + "message": "פתח אפשרויות", + "description": "" + }, + "gmail": { + "message": "Notifier for Gmail™", + "description": "" + } +} \ No newline at end of file diff --git a/v3.classic/_locales/hu/messages.json b/v3.classic/_locales/hu/messages.json new file mode 100644 index 00000000..8f2ff629 --- /dev/null +++ b/v3.classic/_locales/hu/messages.json @@ -0,0 +1,578 @@ +{ + "gmail": { + "message": "Gmail™ értesítő" + }, + "toolbar_label": { + "message": "Gmail™ értesítő" + }, + "description": { + "message": "Egy vagy több Google Mail (Gmail™) fiókhoz, illetve címkéhez értesítő" + }, + "log_in_to_your_account": { + "message": "Jelentkezzen be Gmail™-fiókjába" + }, + "msg_1": { + "message": "Már megnyitotta a Gmail™-t. Kattintson az eszköztár gombjára a Gmail™ megnyitásához új ablakban vagy már megnyitott Gmail™ lapra váltáshoz." + }, + "msg_2": { + "message": "A link a vágólapra került." + }, + "msg_3": { + "message": "A kijelölt szöveg a vágólapra került." + }, + "msg_4": { + "message": "Megjegyzés: Az értesítő működéséhez szükséges, hogy Google-fiókjába bejelentkezzen." + }, + "msg_5": { + "message": "Válassz egy hangfájlt" + }, + "label_1": { + "message": "Frissítés" + }, + "label_2": { + "message": "Beállítások" + }, + "label_3": { + "message": "Összes értesítés tiltása" + }, + "label_4": { + "message": "5 percre" + }, + "label_5": { + "message": "15 percre" + }, + "label_6": { + "message": "30 percre" + }, + "label_7": { + "message": "1 órára" + }, + "label_8": { + "message": "2 órára" + }, + "label_9": { + "message": "5 órára" + }, + "label_13": { + "message": "Egyéni időhosszra" + }, + "label_10": { + "message": "Értesítések engedélyezése (munkamenet)" + }, + "label_11": { + "message": "Levél írása" + }, + "label_12": { + "message": "GyIK megnyitása" + }, + "label_14": { + "message": "Bejelentkezett fiókok" + }, + "unknown": { + "message": "ismeretlen" + }, + "and": { + "message": "és" + }, + "log_into_your_account": { + "message": "Jelentkezzen be fiókjába" + }, + "notification": { + "message": "Feladó: [author_email][break]Tárgy: [title][break]Összegzés: [summary]" + }, + "options_title": { + "message": "Beállítások - Gmail™ Értesítő" + }, + "options_inshort": { + "message": "Egy vagy több Google Mail (Gmail™) fiókhoz, illetve címkéhez értesítő." + }, + "options_donation": { + "message": "Támogatásfejlesztés $" + }, + "options_timings": { + "message": "Időzítés" + }, + "options_timings_l1": { + "message": "Új levelek ellenőrzése ennyi másodpercenként:" + }, + "options_timings_l2": { + "message": "A legkisebb időköz 10 másodperc." + }, + "options_timings_l3": { + "message": "Emlékeztessen az összes olvasatlan levélre (percenként):" + }, + "options_timings_l4": { + "message": "Állítsa az értéket 0-ra nem ismétlődő értesítésekhez." + }, + "options_timings_l5": { + "message": "A legrövidebb időköz 5 perc." + }, + "options_timings_l6": { + "message": "Nem 0 érték esetén addig él az asztali értesítő és a hangjelzés (hasonlóan, mint új levél érkezésél) míg van olvasatlan levele." + }, + "options_timings_l7": { + "message": "Ne keressen új leveleket induláskor ennyi másodpercig:" + }, + "options_timings_l8": { + "message": "Állítsa 0-ra az értéket, hogy ne legyen automatikus ellenőrzés az első kézi frissítésig [Safariban nem érhető el]." + }, + "options_gmail": { + "message": "Gmail™" + }, + "options_gmail_1": { + "message": "Elsődleges fiók(/mail/u/0/)" + }, + "options_gmail_2": { + "message": "A címkéket vesszővel (\",\"-vel) válassza el." + }, + "options_gmail_3": { + "message": "Másodlagos fiók (/mail/u/1/)" + }, + "options_gmail_4": { + "message": "Harmadik fiók (/mail/u/2/)" + }, + "options_gmail_5": { + "message": "Negyedik fiók (/mail/u/3/)" + }, + "options_gmail_6": { + "message": "Ötödik fiók (/mail/u/4/)" + }, + "options_gmail_7": { + "message": "Hatodik fiók (/mail/u/5/)" + }, + "options_gmail_8": { + "message": "Archiváláskor olvasottnak megjelölés" + }, + "options_gmail_15": { + "message": "Néhány népszerű címke:" + }, + "options_gmail_10": { + "message": "A következő címkék és fiókok esetén legyen értesítés:" + }, + "options_gmail_11": { + "message": "Egyéni hírcsatornák:" + }, + "options_gmail_12": { + "message": "A hírcsatornákat \",\"-vel (vesszővel) válassza el. Példa hírcsatornára: https://mail.google.com/mail/u/0/feed/atom/inbox" + }, + "options_gmail_13": { + "message": "Megjegyzés: \"beérkező\" kivételével az összes címke maximális száma 20 (Google hírcsatorna csak maximum 20 új bejegyzést támogat)" + }, + "options_gmail_14": { + "message": "Megjegyzés: több, mint 5 fiók figyeléséhez adj meg hírcsatorna URL-eket az \"Egyéni hírcsatornák\" mezőben. Például 6. és 7. fiók figyeléséhez add hozzá a következőket: https://mail.google.com/mail/u/6/feed/atom/inbox, https://mail.google.com/mail/u/7/feed/atom/inbox" + }, + "options_notifications": { + "message": "Értesítések" + }, + "options_notifications_1": { + "message": "Asztali értesítések megjelenítése új levelek érkezésekor" + }, + "options_notifications_2": { + "message": "Asztali értesítés megjelenítése ennyi másodpercig:" + }, + "options_notifications_3": { + "message": "Ez a beállítás lehet, hogy nem működik ezen az operációs rendszeren." + }, + "options_notifications_4": { + "message": "Értesítés formátuma" + }, + "options_notifications_5": { + "message": "Használható változók:" + }, + "options_notifications_6": { + "message": "Értesítés levágása, ha hosszabb, mint" + }, + "options_notifications_7": { + "message": "karakternél a [cím] és az [összegzés] mező." + }, + "options_notifications_8": { + "message": "Hogy ne lehessen szólevágás, nagy számot adjon meg." + }, + "options_notifications_9": { + "message": "Hangjelzés lejátszása új levelek érkezésekor" + }, + "options_notifications_10": { + "message": "Megjegyzés Mac használóknak. A Firefox 28.0 verziójától az összes asztali értesítést a Mac Notification Center (Mac Üzenetközpont) kezeli, ami extra hangjelzést okoz. Ezért célszerű vagy ezt, vagy a Notification Center hangértesítését kikapcsolni." + }, + "options_notifications_11": { + "message": "\"Windows tálcaértesítés\" vagy \"Mac OS Dock értesítés\" megjelenítése" + }, + "options_notifications_12": { + "message": "Tálcaértesítések nem támogatottak jelenleg Linux alatt." + }, + "options_notifications_13": { + "message": "A tálcaértesítés ikonjára kattintás nyissa meg az eszközpanelt (Csak Windows, béta)" + }, + "options_notifications_14": { + "message": "Ez a tulajdonság jelenleg komoly fejlesztés alatt áll, így a Forefox-ot instabillá teheti. [Újraindítás szükséges]." + }, + "options_notifications_15": { + "message": "Alapértelmezett értesítési hang" + }, + "options_notifications_16": { + "message": "Gmail™ értesítő alapértelmezett jelzése" + }, + "options_notifications_17": { + "message": "Checker Plus bell értesítés" + }, + "options_notifications_18": { + "message": "Checker Plus ding értesítés" + }, + "options_notifications_19": { + "message": "Windows e-mail értesítés" + }, + "options_notifications_20": { + "message": "Felhasználó által megadott hang" + }, + "options_notifications_21": { + "message": "A felhasználó által megadott értesítési hang:" + }, + "options_notifications_22": { + "message": "Amennyiben böngésződ nem játssza le az egyéni hangot, próbáld a hangot online konvertáló segítségével egyszerű WAV formátumra átalakítani.." + }, + "options_notifications_35": { + "message": "Új egyéni hang választásához először válassz egy beépített hangot, majd állítsd be az egyéni hangértesítés opciót. " + }, + "options_notifications_23": { + "message": "A hangértesítés hangereje (%-ban)" + }, + "options_notifications_24": { + "message": "A hangerő 0 és 100 közötti szám, ahol 100 a leghangosabb (ez az alapértelmezett érték)." + }, + "options_notifications_25": { + "message": "Gyakran az alapértelmezett hangértesítések nem jól kerülnek lejátszásra Safari-ban. Ebben az esetben állítson be egyéni hangfájlt." + }, + "options_notifications_26": { + "message": "Mindig látszódjon a tálcaértesítő (Csak Windows)" + }, + "options_notifications_27": { + "message": "A tálcaértesítő akkor is látszódjon, amikor nincs olvasatlan üzenet. " + }, + "options_notifications_28": { + "message": "Összes értesítés tiltása egyéni időhosszra (percben):" + }, + "options_notifications_29": { + "message": "Ez az beállítás kapcsolatban van az eszköztáron lévő gombon jobb egérrel elérhető menü -> összes értesítés tiltása -> egyéni időhosszra beállítással." + }, + "options_notifications_30": { + "message": "Az összes egyidejű asztali értesítés összevonása egy értesítéssé" + }, + "options_notifications_31": { + "message": "Értesítés egyéni hangja" + }, + "options_notifications_32": { + "message": "név vagy e-mail cím tartalmazza" + }, + "options_notifications_33": { + "message": "levél címe tartalmazza" + }, + "options_notifications_34": { + "message": "levélösszegző tartalmazza" + }, + "options_notifications_36": { + "message": "Gmail™ kérése az 'inbox.google.com' átirányítás megakadályozására" + }, + "options_notifications_37": { + "message": "Az olvasatlan e-mailek számának megjelenítése a jelvényen (és válassza ki a jelvény színét)" + }, + "options_notifications_38": { + "message": "Gyorsabb műveletek (megjelölés olvasottként, törlés, ...) (A fejlécek érkeztével megoldható műveletek)" + }, + "options_notifications_40": { + "message": "Gyorsműveletek bekapcsolása az értesítési dobozból (maximálisan kettő művelet, csak Chrome)" + }, + "options_notifications_41": { + "message": "Megj. olvasottként" + }, + "options_notifications_42": { + "message": "Archív" + }, + "options_notifications_43": { + "message": "Kuka" + }, + "options_tab": { + "message": "Lap megnyitása" + }, + "options_tab_1": { + "message": "Gmail™-fiók keresése csak az aktív böngészőablakban" + }, + "options_tab_2": { + "message": "Ne keressen megnyitott Gmail™-fiókokért más böngészőablakot. Ha a Gmail™ nincs megnyitva, új lapon nyissa meg." + }, + "options_tab_3": { + "message": "Gmail™-fiók megnyitása az aktív lap mellett" + }, + "options_tab_4": { + "message": "Gmail™-fiók megnyitása az aktív lapon" + }, + "options_tab_5": { + "message": "Gmail™-fiók megnyitása egy háttér lapon" + }, + "options_tab_6": { + "message": "Gmail™-fiók megnyitása új ablakban" + }, + "options_tab_7": { + "message": "Minden esetben új lap nyitása helyett üres lapot használjon, amikor a lapon megnyitás be van kapcsolva" + }, + "options_tab_8": { + "message": "Már nyitva lévő Gmail™ lapok figyelmen kívül hagyása" + }, + "options_tab_9": { + "message": "Ha be van jelölve, az értesítő új böngészőlapokon nyitja meg az e-maileket. Ha nincs bejelölve, akkor először megkeresi az aktív ablakban egy meglévő Gmail™ lapot, és átvált rá. Ha nem található, akkor megkeresi a többi megnyitott ablakot, mielőtt új lapot nyitna meg." + }, + "options_tab_10": { + "message": "Levelek megnyitása alap HTML módban" + }, + "options_tab_11": { + "message": "Egy olvasatlan e-mail címére kattintva a Gmail™ magához az e-mailhez nyitja meg a Gmail™-t, nem pedig az Beérkező levelek mappát." + }, + "options_toolbar": { + "message": "Eszköztár" + }, + "options_toolbar_1": { + "message": "Eszköztárgomb viselkedése" + }, + "options_toolbar_2": { + "message": "Mindig nyissa meg a levél előnézetpanelét" + }, + "options_toolbar_3": { + "message": "Gmail™-fiók megnyitása csak akkor, ha már egy fiókba bejelentkezett" + }, + "options_toolbar_18": { + "message": "Gmail™-fiók megnyitása (kierőszakolt)" + }, + "options_toolbar_4": { + "message": "Eszköztár panel mód" + }, + "options_toolbar_5": { + "message": "Csak az összegzés megjelenítése" + }, + "options_toolbar_6": { + "message": "Teljes tartalom megjelenítése" + }, + "options_toolbar_7": { + "message": "Teljes tartalom megjelenítésekor az eszköztár panel szélessége pixelben:" + }, + "options_toolbar_8": { + "message": "A legkisebb szélesség 500px." + }, + "options_toolbar_9": { + "message": "Teljes tartalom megjelenítésekor az eszköztár panel magassága pixelben:" + }, + "options_toolbar_10": { + "message": "A legkisebb magasság 500px." + }, + "options_toolbar_11": { + "message": "Gyorsbillentyű támogatása az eszköztár gombján" + }, + "options_toolbar_12": { + "message": "Jelentés spamként: , Kuka: <#>, Archí: , Megjelölés olvasottként: ." + }, + "options_toolbar_13": { + "message": "Levél megjelenítése HTML-ként teljes tartalom módban" + }, + "options_toolbar_14": { + "message": "Amennyiben a levelet szövegként szeretné látni, nem jelölje be ezt a jelölőnégyzetet." + }, + "options_toolbar_15": { + "message": "Az eszköztár gombjára a középső egérgombbal kattintás" + }, + "options_toolbar_16": { + "message": "Összes fiók frissítése" + }, + "options_toolbar_17": { + "message": "Elsődleges Gmail™-fiók megnyitása" + }, + "options_misc": { + "message": "Egyebek:" + }, + "options_misc_1": { + "message": "Fiókok betűrendbe rendezése" + }, + "options_misc_2": { + "message": "Az alapértelmezett rendezés a bejelentkezés sorrendje." + }, + "options_misc_3": { + "message": "Toolbar button color pattern:" + }, + "options_misc_4": { + "message": "Szürke szín a \"Nincs olvasatlan\" és kék szín a \"Szétkapcsolva\"" + }, + "options_misc_5": { + "message": "Kék szín a \"Nincs olvasatlan\" és szürke szín a \"Szétkapcsolva\"" + }, + "options_misc_9": { + "message": "Piros szín a \"Nincs olvasatlan\" és szürke szín a \"Szétkapcsolva\"" + }, + "options_misc_6": { + "message": "Asztali figyelmeztetés megjelenítése, hogy Gmail™ már az aktív lapon nyitva van " + }, + "options_misc_7": { + "message": "Üdvözlő oldal megjelenítése frissítéskor" + }, + "options_misc_8": { + "message": "Összes beállítás visszaállítása alapértelmezettre" + }, + "options_misc_10": { + "message": "Csak asztali- és hangértesítés jelezzen amikor levél érkezett kevesebb, mint ennyi percen belül:" + }, + "options_misc_11": { + "message": "Amennyiben nullára állítja ezt az értéket, nem kap sem asztali- sem hangértesítést, de az ikonértesítés továbbra is megmarad." + }, + "options_misc_12": { + "message": "A buboréksúgó szövegébe ne helyezz bejelentkezési adatokat" + }, + "options_misc_13": { + "message": "Alapértelmezetten az értesítő frissíti az eszköztár gombjának buboréksúgóját a bejelentkezési információval. Ezen opció kikapcsolásával a buboréksúgó szövege az alapértelmezett szöveg marad." + }, + "options_misc_14": { + "message": "Ne pontos szám jelenjen meg, amikor az olvasatlan levelek száma nagyobb, mint 999. " + }, + "options_misc_15": { + "message": "Frissítéskor a GyIK oldal megnyitása" + }, + "options_misc_16": { + "message": "Color theme of panel:" + }, + "options_misc_17": { + "message": "Light theme" + }, + "options_misc_18": { + "message": "Dark theme" + }, + "options_misc_19": { + "message": "System theme" + }, + "options_plugins": { + "message": "Bővítmények" + }, + "options_plugins_1": { + "message": "Gmail™ címkék és csillagok (kísérleti)" + }, + "options_plugins_2": { + "message": "Ez a bővítmény megjeleníti a csillagot és a téma címkéit buborékban (csak kibővített módban)." + }, + "options_px": { + "message": "px" + }, + "options_empty": { + "message": "nincs megadva" + }, + "options_button_test": { + "message": "Hang lejátszása ►" + }, + "options_button_reset": { + "message": "Tulajdonságok alapértelmezettre állítása" + }, + "popup_settings": { + "message": "Beállítások" + }, + "popup_of": { + "message": "/" + }, + "popup_wait": { + "message": "Várj..." + }, + "popup_date_format": { + "message": "%yy. %mm %dd." + }, + "popup_no_subject": { + "message": "(nincs tárgy)" + }, + "popup_open_settings": { + "message": "Beállítások megnyitása" + }, + "popup_open_inbox": { + "message": " Beérkező levelek megnyitása" + }, + "popup_archive": { + "message": "Archív" + }, + "popup_spam": { + "message": "Spam" + }, + "popup_trash": { + "message": "Kuka" + }, + "popup_refresh": { + "message": "Frissítés" + }, + "popup_read": { + "message": "Megj. olvasottként" + }, + "popup_read_all": { + "message": "Összes megjelölése olvasottként" + }, + "popup_toggle_dark": { + "message": "Sötét téma be- és kikapcsolása" + }, + "popup_msg_1": { + "message": "éppen most" + }, + "popup_msg_2": { + "message": "1 perccel ezelőtt" + }, + "popup_msg_3_format": { + "message": "%d perccel ezelőtt" + }, + "popup_msg_4": { + "message": "1 óra múlva" + }, + "popup_msg_5": { + "message": "órával ezelőtt" + }, + "popup_msg_6": { + "message": "Tegnap" + }, + "popup_msg_7_format": { + "message": "%d nappal ezelőtt" + }, + "popup_msg_8_format": { + "message": "%d héttel ezelőtt" + }, + "popup_msg_9_format": { + "message": "%d hónappal ezelőtt" + }, + "popup_msg_10": { + "message": "Január" + }, + "popup_msg_11": { + "message": "Február" + }, + "popup_msg_12": { + "message": "Március" + }, + "popup_msg_13": { + "message": "Április" + }, + "popup_msg_14": { + "message": "Május" + }, + "popup_msg_15": { + "message": "Június" + }, + "popup_msg_16": { + "message": "Július" + }, + "popup_msg_17": { + "message": "Augusztus" + }, + "popup_msg_18": { + "message": "Szeptember" + }, + "popup_msg_19": { + "message": "Október" + }, + "popup_msg_20": { + "message": "November" + }, + "popup_msg_21": { + "message": "December" + }, + "settings_open_title": { + "message": "Beállítások oldal megnyitása" + }, + "settings_open_label": { + "message": "Beállítások megnyitása" + } +} diff --git a/v3.classic/_locales/it/messages.json b/v3.classic/_locales/it/messages.json new file mode 100644 index 00000000..8d1ad65e --- /dev/null +++ b/v3.classic/_locales/it/messages.json @@ -0,0 +1,590 @@ +{ + "gmail": { + "message": "Notificatore per Gmail™" + }, + "toolbar_label": { + "message": "Notificatore per Gmail™" + }, + "description": { + "message": "Notificatore di più etichette e account per Google Mail (Gmail™)" + }, + "log_in_to_your_account": { + "message": "Per favore accedi al tuo account" + }, + "msg_1": { + "message": "La scheda è già aperta. Fare clic sul pulsante nella barra degli strumenti per aprire Gmail™ in una nuova scheda o per passare a una scheda Gmail™ esistente." + }, + "msg_2": { + "message": "Il collegamento viene copiato negli appunti." + }, + "msg_3": { + "message": "Il testo selezionato viene copiato negli appunti." + }, + "msg_4": { + "message": "Nota: affinché il notificatore funzioni correttamente, è necessario aver effettuato l'accesso al proprio account Google." + }, + "msg_5": { + "message": "Selezionare un file audio" + }, + "label_1": { + "message": "Aggiorna" + }, + "label_2": { + "message": "Impostazioni" + }, + "label_3": { + "message": "Disabilita tutte le notifiche" + }, + "label_4": { + "message": "Per 5 minuti" + }, + "label_5": { + "message": "Per 15 minuti" + }, + "label_6": { + "message": "Per 30 minuti" + }, + "label_7": { + "message": "Per 1 ora" + }, + "label_8": { + "message": "Per 2 ore" + }, + "label_9": { + "message": "Per 5 ore" + }, + "label_13": { + "message": "Per il periodo di tempo personalizzato" + }, + "label_10": { + "message": "Abilita notifiche (sessione)" + }, + "label_11": { + "message": "Comporre un'e-mail" + }, + "label_12": { + "message": "Apri FAQ" + }, + "label_14": { + "message": "Account collegati:" + }, + "unknown": { + "message": "sconosciuto" + }, + "and": { + "message": " e " + }, + "log_into_your_account": { + "message": "Per favore accedi al tuo account" + }, + "notification": { + "message": "Da: [author_email][break] Titolo: [title][break] Riepilogo: [summary]" + }, + "options_title": { + "message": "Opzioni - Notificatore Gmail" + }, + "options_inshort": { + "message": "Notificatore di più etichette e account per Google Mail (Gmail™)." + }, + "options_donation": { + "message": "Supporto allo sviluppo" + }, + "options_timings": { + "message": "Orari" + }, + "options_timings_l1": { + "message": "Controlla le nuove e-mail ogni (in secondi):" + }, + "options_timings_l2": { + "message": "Il periodo minimo è di 10 secondi." + }, + "options_timings_l3": { + "message": "Ricorda tutte le e-mail non lette ogni (in minuti):" + }, + "options_timings_l4": { + "message": "Impostare il valore a zero per i promemoria non periodici." + }, + "options_timings_l5": { + "message": "Il periodo minimo è di 5 minuti." + }, + "options_timings_l6": { + "message": "Un valore diverso da zero attiva sia la notifica sul desktop che il suono di avviso (simile all'arrivo di una nuova e-mail) per sempre se ci sono e-mail non lette." + }, + "options_timings_l7": { + "message": "Non verificare la presenza di nuove e-mail all'avvio per (in secondi):" + }, + "options_timings_l8": { + "message": "Impostare il valore su zero per non controllare le e-mail fino al primo aggiornamento manuale [Non disponibile su Safari]." + }, + "options_gmail": { + "message": "Gmail™" + }, + "options_gmail_1": { + "message": "Account primario (/mail/u/0/)" + }, + "options_gmail_2": { + "message": "Separare le etichette con \",\" (virgola)." + }, + "options_gmail_3": { + "message": "Account secondario (/mail/u/1/)" + }, + "options_gmail_4": { + "message": "Terzo Account (/mail/u/2/)" + }, + "options_gmail_5": { + "message": "Quarto Account (/mail/u3/)" + }, + "options_gmail_6": { + "message": "Quinto Account (/mail/u4/)" + }, + "options_gmail_7": { + "message": "Sesto Account (/mail/u5/)" + }, + "options_gmail_8": { + "message": "Contrassegnare il messaggio come letto quando lo si archivia" + }, + "options_gmail_15": { + "message": "Alcune etichette popolari:" + }, + "options_gmail_10": { + "message": "Ricevere notifiche per le etichette e gli account seguenti:" + }, + "options_gmail_11": { + "message": "Alimentazioni personalizzate:" + }, + "options_gmail_12": { + "message": "Separare i feed con \",\" (virgola). Esempio di feed: https://mail.google.com/mail/u/0/feed/atom/inbox" + }, + "options_gmail_13": { + "message": "Nota: il numero massimo per tutte le etichette, ad eccezione di \"inbox\", è 20 (i feed di Google forniscono solo le 20 voci più recenti)." + }, + "options_gmail_14": { + "message": "Nota: per far sì che il notificatore ascolti più di 5 account, aggiungere gli URL dei feed al campo \"Feed personalizzati\". Ad esempio, per ascoltare il 6° e il 7° account aggiungere: https://mail.google.com/mail/u/6/feed/atom/inbox, https://mail.google.com/mail/u/7/feed/atom/inbox" + }, + "options_notifications": { + "message": "Notifica" + }, + "options_notifications_1": { + "message": "Visualizzare la notifica sul desktop per le nuove e-mail" + }, + "options_notifications_2": { + "message": "Mostra la notifica sul desktop per (in secondi):" + }, + "options_notifications_3": { + "message": "Questa opzione potrebbe non funzionare a seconda del sistema operativo in uso." + }, + "options_notifications_4": { + "message": "Formato di notifica:" + }, + "options_notifications_5": { + "message": "Variabili disponibili:" + }, + "options_notifications_6": { + "message": "Tronca le notifiche più lunghe di" + }, + "options_notifications_7": { + "message": "caratteri per i campi [titolo] e [sommario]." + }, + "options_notifications_8": { + "message": "Per evitare il troncamento dell'ellissi, utilizzare un numero grande." + }, + "options_notifications_9": { + "message": "Riproduzione di un suono di avviso per le nuove e-mail" + }, + "options_notifications_10": { + "message": "Nota per gli utenti Mac. A partire da Firefox 28.0, tutte le notifiche sul desktop sono gestite dal Centro notifiche del Mac, che provoca un avviso sonoro aggiuntivo. È necessario deselezionare questa notifica sonora o quella generata dal Centro notifiche." + }, + "options_notifications_11": { + "message": "Visualizzare la \"notifica della barra delle applicazioni di Windows™\" o la \"notifica del Dock di Mac OS\"." + }, + "options_notifications_12": { + "message": "Le notifiche della barra delle applicazioni non sono attualmente supportate dal sistema operativo Linux." + }, + "options_notifications_13": { + "message": "Apertura del pannello della barra degli strumenti quando si fa clic sull'icona di notifica della barra delle applicazioni (solo Windows™, beta)" + }, + "options_notifications_14": { + "message": "Questa funzione è altamente sperimentale e potrebbe rendere instabile il browser Firefox. [È necessario un riavvio.]" + }, + "options_notifications_15": { + "message": "La notifica sonora predefinita è:" + }, + "options_notifications_16": { + "message": "Avviso predefinito di Gmail™ Notifier" + }, + "options_notifications_17": { + "message": "Allarme campanello Checker Plus" + }, + "options_notifications_18": { + "message": "Allarme ding Checker Plus" + }, + "options_notifications_19": { + "message": "Avviso e-mail di Windows™" + }, + "options_notifications_20": { + "message": "Suono definito dall'utente" + }, + "options_notifications_21": { + "message": "Il suono di notifica definito dall'utente è" + }, + "options_notifications_22": { + "message": "Se il browser non riproduce il suono di notifica personalizzato, provate a convertirlo in un semplice formato WAV utilizzando uno strumento di conversione online." + }, + "options_notifications_35": { + "message": "Per selezionare un nuovo suono personalizzato, selezionare prima un suono incorporato e poi cambiare l'opzione in suono personalizzato." + }, + "options_notifications_23": { + "message": "Il volume della notifica sonora è" + }, + "options_notifications_24": { + "message": "Il volume è un numero compreso tra 0 e 100, dove 100 è il volume più alto (impostazione predefinita)." + }, + "options_notifications_25": { + "message": "In Safari è probabile che le notifiche sonore predefinite non vengano riprodotte correttamente; in tal caso, utilizzare un file audio personalizzato come notifica." + }, + "options_notifications_26": { + "message": "Mostra sempre la notifica nella tray (solo per Windows™)" + }, + "options_notifications_27": { + "message": "La notifica del vassoio viene visualizzata anche se non ci sono messaggi non letti." + }, + "options_notifications_28": { + "message": "Disattiva tutte le notifiche per un periodo di tempo personalizzato (in minuti):" + }, + "options_notifications_29": { + "message": "Questa opzione è collegata al menu della barra degli strumenti con il tasto destro del mouse -> disattiva tutte le notifiche -> periodo di tempo personalizzato." + }, + "options_notifications_30": { + "message": "Combinare tutte le notifiche concomitanti sul desktop in un'unica notifica" + }, + "options_notifications_31": { + "message": "Notifica sonora personalizzata" + }, + "options_notifications_32": { + "message": "nome o e-mail contiene" + }, + "options_notifications_33": { + "message": "il titolo dell'e-mail contiene" + }, + "options_notifications_34": { + "message": "il riepilogo dell'e-mail contiene" + }, + "options_notifications_36": { + "message": "Chiedi a Gmail™ di impedire il reindirizzamento a \\\"inbox.google.com\\\"" + }, + "options_notifications_37": { + "message": "Mostra il numero di e-mail non lette sul badge (e scegli il colore del badge)" + }, + "options_notifications_38": { + "message": "Solo per Chrome: consenti azioni più veloci (contrassegna come letto, elimina, ...) (Considera azioni per risolvere la ricezione delle intestazioni)" + }, + "options_notifications_40": { + "message": "Solo per Chrome e se sono consentite azioni rapide per la casella di notifica (scegliere massimo 2 azioni):" + }, + "options_notifications_41": { + "message": "Segna come letto" + }, + "options_notifications_42": { + "message": "Archivia" + }, + "options_notifications_43": { + "message": "Cestina" + }, + "options_tab": { + "message": "Apertura della scheda" + }, + "options_tab_1": { + "message": "Cerca un account Gmail™ aperto solo nella finestra attiva" + }, + "options_tab_2": { + "message": "Non cercare account Gmail™ aperti in altre finestre del browser. Se Gmail™ non è aperto nella finestra attiva, apri una nuova scheda." + }, + "options_tab_3": { + "message": "Apri un nuovo account Gmail™ accanto alla scheda attiva" + }, + "options_tab_4": { + "message": "Apri un account Gmail™ nella scheda attiva" + }, + "options_tab_5": { + "message": "Apri un account Gmail™ in una scheda in background" + }, + "options_tab_6": { + "message": "Apri un account Gmail™ in una nuova finestra" + }, + "options_tab_7": { + "message": "Utilizzare sempre le schede vuote invece di aprire una nuova scheda quando l'apertura in scheda è attivata" + }, + "options_tab_8": { + "message": "Ignora le schede Gmail™ aperte" + }, + "options_tab_9": { + "message": "Se selezionato, il notificatore apre le e-mail in nuove schede del browser. Quando questa casella è deselezionata, cercherà innanzitutto una scheda Gmail™ esistente nella finestra attiva e passerà ad essa. Se non viene trovata, cercherà altre finestre aperte prima di aprire una nuova scheda." + }, + "options_tab_10": { + "message": "Aprire le e-mail in modalità HTML di base" + }, + "options_tab_11": { + "message": "Aprire l'ultima email non letta invece di aprire la cartella INBOX" + }, + "options_toolbar": { + "message": "Barra degli strumenti" + }, + "options_toolbar_1": { + "message": "Comportamento dei pulsanti della barra degli strumenti:" + }, + "options_toolbar_2": { + "message": "Pannello di anteprima delle e-mail sempre aperto" + }, + "options_toolbar_3": { + "message": "Apri un account Gmail™ se è stato effettuato l'accesso solo a un account" + }, + "options_toolbar_18": { + "message": "Apri un account Gmail™ (forzato)" + }, + "options_toolbar_4": { + "message": "Modalità pannello della barra degli strumenti:" + }, + "options_toolbar_5": { + "message": "Mostra solo il riepilogo" + }, + "options_toolbar_6": { + "message": "Mostra il contenuto completo" + }, + "options_toolbar_7": { + "message": "La larghezza del pannello della barra degli strumenti nella modalità di visualizzazione a contenuto completo è (in pixel):" + }, + "options_toolbar_8": { + "message": "La larghezza minima è di 500px." + }, + "options_toolbar_9": { + "message": "Altezza del pannello della barra degli strumenti nella modalità di visualizzazione a contenuto completo è (in pixel):" + }, + "options_toolbar_10": { + "message": "L'altezza minima è di 500px." + }, + "options_toolbar_11": { + "message": "Supporta le scorciatoie da tastiera nel pannello della barra degli strumenti" + }, + "options_toolbar_12": { + "message": "Segnala come spam: < ! >, Cestino: < # >, Archivia: < e >, Segna come letto: < Maiusc + i >," + }, + "options_toolbar_13": { + "message": "Visualizza le e-mail con rendering HTML in modalità contenuto completo" + }, + "options_toolbar_14": { + "message": "Se si preferisce il rendering di solo testo nella modalità a contenuto completo, deselezionare la casella." + }, + "options_toolbar_15": { + "message": "Fare clic con il tasto centrale del mouse sul pulsante della barra degli strumenti per" + }, + "options_toolbar_16": { + "message": "Aggiornare tutti gli account" + }, + "options_toolbar_17": { + "message": "Apri account Gmail™ principale" + }, + "options_misc": { + "message": "Varie" + }, + "options_misc_1": { + "message": "Ordinare i conti in ordine alfabetico" + }, + "options_misc_2": { + "message": "Il tipo di ordine predefinito è l'ordine registrato." + }, + "options_misc_3": { + "message": "Modello di colore dei pulsanti della barra degli strumenti:" + }, + "options_misc_4": { + "message": "Colore grigio per \"Non letto\" e colore blu per \"Disconnesso\"." + }, + "options_misc_5": { + "message": "Colore blu per \"Non letto\" e colore grigio per \"Disconnesso\"." + }, + "options_misc_9": { + "message": "Colore rosso per \"Non letto\" e grigio per \"Disconnesso\"." + }, + "options_misc_6": { + "message": "Mostra notifica desktop per avvisare che Gmail™ è già aperto nella scheda attiva" + }, + "options_misc_7": { + "message": "Mostra la pagina di benvenuto all'aggiornamento" + }, + "options_misc_8": { + "message": "Ripristinare tutte le impostazioni di fabbrica" + }, + "options_misc_10": { + "message": "Avviare le notifiche sul desktop e quelle sonore solo quando le e-mail sono arrivate in meno di (in minuti):" + }, + "options_misc_11": { + "message": "Impostando questa preferenza su zero, non si riceveranno né le notifiche sul desktop né quelle sonore, ma si riceveranno comunque le notifiche dei badge." + }, + "options_misc_12": { + "message": "Non includere i dati di accesso nel testo del tooltip" + }, + "options_misc_13": { + "message": "Per impostazione predefinita, il notificatore aggiorna il testo della barra degli strumenti con le informazioni di accesso. Deselezionando questa opzione, il testo del tooltip rimane il valore predefinito." + }, + "options_misc_14": { + "message": "Non mostrare il numero esatto di badge quando il numero di email non lette è superiore a 999" + }, + "options_misc_15": { + "message": "Aprire la pagina delle FAQ sugli aggiornamenti" + }, + "options_misc_16": { + "message": "Tema colore predefinito per il pannello:" + }, + "options_misc_17": { + "message": "Tema chiaro" + }, + "options_misc_18": { + "message": "Tema scuro" + }, + "options_misc_19": { + "message": "Tema del sistema" + }, + "options_plugins": { + "message": "Plug-ins" + }, + "options_plugins_1": { + "message": "Etichette Gmail™ e pulsante a forma di stella (sperimentale)" + }, + "options_plugins_2": { + "message": "Questo plugin visualizza il pulsante della stella e le etichette delle discussioni nel popup (solo in modalità estesa)." + }, + "options_styling": { + "message": "Stile" + }, + "options_styling_0": { + "message": "Scala la visualizzazione dell'e-mail di (0,5-4)" + }, + "options_styling_1": { + "message": "Regole CSS personalizzate per il pannello superiore" + }, + "options_styling_2": { + "message": "Regole CSS personalizzate per la visualizzazione delle e-mail" + }, + "options_px": { + "message": "px" + }, + "options_empty": { + "message": "non definito" + }, + "options_button_test": { + "message": "Riproduzione del suono ►" + }, + "options_button_reset": { + "message": "Reimpostare le preferenze" + }, + "popup_settings": { + "message": "Impostazioni" + }, + "popup_of": { + "message": "of" + }, + "popup_wait": { + "message": "Attendere..." + }, + "popup_date_format": { + "message": "%mm %dd, %yy" + }, + "popup_no_subject": { + "message": "(senza soggetto)" + }, + "popup_open_settings": { + "message": "Aprire impostazioni" + }, + "popup_open_inbox": { + "message": "Aprire la posta in arrivo" + }, + "popup_archive": { + "message": "Archivia" + }, + "popup_spam": { + "message": "Spam" + }, + "popup_trash": { + "message": "Cestina" + }, + "popup_refresh": { + "message": "Aggiorna" + }, + "popup_read": { + "message": "Segna come letto" + }, + "popup_read_all": { + "message": "Segna tutte come letto" + }, + "popup_toggle_dark": { + "message": "Attiva e disattiva il tema scuro" + }, + "popup_msg_1": { + "message": "solo ora" + }, + "popup_msg_2": { + "message": "1 minuto fa" + }, + "popup_msg_3_format": { + "message": "%d minuti fa" + }, + "popup_msg_4": { + "message": "1 ora fa" + }, + "popup_msg_5": { + "message": "ore fa" + }, + "popup_msg_6": { + "message": "Ieri" + }, + "popup_msg_7_format": { + "message": "%d giorni fa" + }, + "popup_msg_8_format": { + "message": "%d settimana/e fa" + }, + "popup_msg_9_format": { + "message": "%d mese/i fa" + }, + "popup_msg_10": { + "message": "Gennaio" + }, + "popup_msg_11": { + "message": "Febbraio" + }, + "popup_msg_12": { + "message": "Marzo" + }, + "popup_msg_13": { + "message": "Aprile" + }, + "popup_msg_14": { + "message": "Maggio" + }, + "popup_msg_15": { + "message": "Giugno" + }, + "popup_msg_16": { + "message": "Luglio" + }, + "popup_msg_17": { + "message": "Agosto" + }, + "popup_msg_18": { + "message": "Settembre" + }, + "popup_msg_19": { + "message": "Ottobre" + }, + "popup_msg_20": { + "message": "Novembre" + }, + "popup_msg_21": { + "message": "Dicembre" + }, + "settings_open_title": { + "message": "Aprire la pagina delle opzioni (impostazioni)" + }, + "settings_open_label": { + "message": "Aprire opzioni" + } +} diff --git a/v3.classic/_locales/ja/messages.json b/v3.classic/_locales/ja/messages.json new file mode 100644 index 00000000..9a6b36d2 --- /dev/null +++ b/v3.classic/_locales/ja/messages.json @@ -0,0 +1,590 @@ +{ + "gmail": { + "message": "Notifier for Gmail™" + }, + "toolbar_label": { + "message": "Notifier for Gmail™" + }, + "description": { + "message": "Googleメール (Gmail™) の複数のラベルとアカウント通知機能" + }, + "log_in_to_your_account": { + "message": "Gmail™アカウントにログインして下さい" + }, + "msg_1": { + "message": "タブはすでに開いています。ツールバー ボタンをクリックして、Gmail™ を新しいタブで開くか、既存の Gmail™ タブに切り替えてください。" + }, + "msg_2": { + "message": "リンクがクリップボードにコピーされます。" + }, + "msg_3": { + "message": "選択したテキストがクリップボードにコピーされます。" + }, + "msg_4": { + "message": "通知機能が正しく動作するには、Google アカウントにログインする必要があります。" + }, + "msg_5": { + "message": "音声ファイルを選択" + }, + "label_1": { + "message": "更新" + }, + "label_2": { + "message": "設定" + }, + "label_3": { + "message": "すべての通知を無効にする" + }, + "label_4": { + "message": "5分間" + }, + "label_5": { + "message": "15分間" + }, + "label_6": { + "message": "30分間" + }, + "label_7": { + "message": "1時間" + }, + "label_8": { + "message": "2時間" + }, + "label_9": { + "message": "5時間" + }, + "label_13": { + "message": "カスタム期間" + }, + "label_10": { + "message": "通知を有効にする(セッション)" + }, + "label_11": { + "message": "メールを作成する" + }, + "label_12": { + "message": "よくある質問" + }, + "label_14": { + "message": "ログインしたアカウント" + }, + "unknown": { + "message": "不明" + }, + "and": { + "message": "と" + }, + "log_into_your_account": { + "message": "アカウントにログインしてください" + }, + "notification": { + "message": "From: [author_email][break] 件名: [title][break] Summary: [summary]" + }, + "options_title": { + "message": "オプション ページ - Gmail™ Notifier" + }, + "options_inshort": { + "message": "Google メール (Gmail™) 用の複数のラベルとアカウント通知機能。" + }, + "options_donation": { + "message": "開発サポート$" + }, + "options_timings": { + "message": "タイミング" + }, + "options_timings_l1": { + "message": "新しいメールを確認する間隔 (秒単位):" + }, + "options_timings_l2": { + "message": "最小期間は10秒です。" + }, + "options_timings_l3": { + "message": "すべての未読メールを次の間隔で通知します (分単位):" + }, + "options_timings_l4": { + "message": "定期的でないリマインダーの場合は値を 0 に設定します" + }, + "options_timings_l5": { + "message": "最短期間は5分です。" + }, + "options_timings_l6": { + "message": "値がゼロ以外の場合、未読メールがある場合、デスクトップ通知と警告音(新しいメールの到着に類似)の両方が永続的に鳴り続けます。" + }, + "options_timings_l7": { + "message": "起動時に新しいメールをチェックしない時間(秒数):" + }, + "options_timings_l8": { + "message": "最初の手動更新までメールをチェックしない場合は、値を 0 に設定します [Safari では使用できません]。" + }, + "options_gmail": { + "message": "Gmail™" + }, + "options_gmail_1": { + "message": "プライマリ アカウント (/mail/u/0/)" + }, + "options_gmail_2": { + "message": "ラベルは「,」(カンマ)で区切ります。" + }, + "options_gmail_3": { + "message": "第2アカウント (/mail/u/1/)" + }, + "options_gmail_4": { + "message": "第3アカウント (/mail/u/2/)" + }, + "options_gmail_5": { + "message": "第4アカウント (/mail/u/3/)" + }, + "options_gmail_6": { + "message": "第5アカウント (/mail/u/4/)" + }, + "options_gmail_7": { + "message": "第6アカウント (/mail/u/5/)" + }, + "options_gmail_8": { + "message": "メッセージをアーカイブするときに既読にする" + }, + "options_gmail_15": { + "message": "人気のあるラベル:" + }, + "options_gmail_10": { + "message": "次のラベルとアカウントの通知を受信します:" + }, + "options_gmail_11": { + "message": "カスタムフィード:" + }, + "options_gmail_12": { + "message": "フィードは「,」(カンマ)で区切ります。サンプル フィード: https://mail.google.com/mail/u/0/feed/atom/inbox" + }, + "options_gmail_13": { + "message": "注: 「受信トレイ」を除くすべてのラベルの最大数は 20 です (Google フィードは最新の 20 件のエントリのみを提供します)" + }, + "options_gmail_14": { + "message": "注: 通知機能が 5 つ以上のアカウントをリッスンするには、「カスタム フィード」フィールドにフィード URL を追加します。たとえば、6 番目と 7 番目のアカウントをリッスンするには、https://mail.google.com/mail/u/6/feed/atom/inbox、https://mail.google.com/mail/u/7/feed/atom/inbox を追加します。" + }, + "options_notifications": { + "message": "通知" + }, + "options_notifications_1": { + "message": "新しいメールのデスクトップ通知を表示する" + }, + "options_notifications_2": { + "message": "デスクトップ通知を表示する時間 (秒):" + }, + "options_notifications_3": { + "message": "このオプションは、OS によっては機能しない場合があります。" + }, + "options_notifications_4": { + "message": "通知フォーマット" + }, + "options_notifications_5": { + "message": "利用可能な変数:" + }, + "options_notifications_6": { + "message": "通知を切り捨てる長さ" + }, + "options_notifications_7": { + "message": "[件名] および [summary] フィールドの文字。" + }, + "options_notifications_8": { + "message": "省略記号を切り捨てないようにするには、ここで大きな数値を使用します。" + }, + "options_notifications_9": { + "message": "新着メールの通知音を鳴らす" + }, + "options_notifications_10": { + "message": "Mac ユーザーへの注意: Firefox バージョン 28.0 以降、すべてのデスクトップ通知は Mac 通知センターによって処理され、追加のサウンド アラートが発生します。このサウンド通知または通知センターによって生成されるサウンド通知のいずれかのチェックを外す必要があります。" + }, + "options_notifications_11": { + "message": "「Windows™ タスクバー通知」または「Mac OS Dock 通知」を表示します" + }, + "options_notifications_12": { + "message": "現時点では、タスクバー通知は Linux OS ではサポートされていません。" + }, + "options_notifications_13": { + "message": "タスクバーの通知アイコンをクリックするとツールバー パネルが開きます (Windows™ のみ、ベータ版)" + }, + "options_notifications_14": { + "message": "この機能は極めて実験的なもので、Firefox ブラウザが不安定になる可能性があります。[再起動が必要です]。" + }, + "options_notifications_15": { + "message": "デフォルトのサウンド通知:" + }, + "options_notifications_16": { + "message": "Gmail™ 通知のデフォルトアラート" + }, + "options_notifications_17": { + "message": "Checker Plus ベルアラート" + }, + "options_notifications_18": { + "message": "Checker Plus ding アラート" + }, + "options_notifications_19": { + "message": "Windows™ Eメールアラート" + }, + "options_notifications_20": { + "message": "ユーザー定義のサウンド" + }, + "options_notifications_21": { + "message": "ユーザー定義の通知音:" + }, + "options_notifications_22": { + "message": "ブラウザでカスタム通知音が再生されない場合は、オンライン変換ツールを使用して、プレーンな WAV 形式に変換してみてください。" + }, + "options_notifications_35": { + "message": "新しいカスタムサウンドを選択するには、まず組み込みサウンドを選択し、オプションをカスタムサウンドに変更します。" + }, + "options_notifications_23": { + "message": "サウンド通知の音量(%):" + }, + "options_notifications_24": { + "message": "音量は 0 ~ 100 の数値で、100 が最高音量です (デフォルト)。" + }, + "options_notifications_25": { + "message": "Safari では、デフォルトのサウンド通知が正しく再生されない可能性が高いため、その場合は通知としてカスタム サウンド ファイルを使用してください。" + }, + "options_notifications_26": { + "message": "トレイ通知を常に表示する (Windows™ のみ)" + }, + "options_notifications_27": { + "message": "未読メッセージがない場合でもトレイ通知が表示されます。" + }, + "options_notifications_28": { + "message": "カスタム期間(分単位)のすべての通知を無効にします。" + }, + "options_notifications_29": { + "message": "このオプションは、ツールバー ボタンの右クリック メニュー -> すべての通知を無効にする -> カスタム期間に関連しています。" + }, + "options_notifications_30": { + "message": "すべての同時デスクトップ通知を1つの通知にまとめる" + }, + "options_notifications_31": { + "message": "カスタムサウンド通知" + }, + "options_notifications_32": { + "message": "名前またはメールアドレス" + }, + "options_notifications_33": { + "message": "メールの件名" + }, + "options_notifications_34": { + "message": "メールの概要" + }, + "options_notifications_36": { + "message": "Gmail™ に「inbox.google.com」へのリダイレクトを防止するよう依頼する" + }, + "options_notifications_37": { + "message": "バッジに未読メール数を表示する(バッジの色を選択)" + }, + "options_notifications_38": { + "message": "より高速なアクション(既読としてマーク、削除など)(ヘッダーを受信したときに解決されるアクションを検討してください)" + }, + "options_notifications_40": { + "message": "通知ボックスからのクイックアクションを許可する(最大 2 つのアクション、Chrome のみ)" + }, + "options_notifications_41": { + "message": "既読にする" + }, + "options_notifications_42": { + "message": "アーカイブ" + }, + "options_notifications_43": { + "message": "ゴミ箱" + }, + "options_tab": { + "message": "タブを開く" + }, + "options_tab_1": { + "message": "アクティブなウィンドウでのみ、開いている Gmail™ アカウントを検索します" + }, + "options_tab_2": { + "message": "開いている Gmail™ アカウントを他のブラウザ ウィンドウで検索しないでください。アクティブ ウィンドウで Gmail™ が開いていない場合は、新しいタブを開きます。" + }, + "options_tab_3": { + "message": "アクティブなタブの横に新しいGmail™アカウントを開く" + }, + "options_tab_4": { + "message": "アクティブなタブでGmail™アカウントを開く" + }, + "options_tab_5": { + "message": "Gmail™アカウントをバックグラウンドタブで開く" + }, + "options_tab_6": { + "message": "Gmail™アカウントを新しいウィンドウで開く" + }, + "options_tab_7": { + "message": "タブで開くが有効になっている場合は、新しいタブを開くのではなく、常に空のタブを使用します。" + }, + "options_tab_8": { + "message": "開いている Gmail™ タブを無視する" + }, + "options_tab_9": { + "message": "チェックされている場合、通知機能はメールを新しいブラウザ タブで開きます。チェックされていない場合は、まずアクティブ ウィンドウで既存の Gmail™ タブを検索し、そのタブに切り替えます。見つからない場合は、新しいタブを開く前に、開いている他のウィンドウを検索します。" + }, + "options_tab_10": { + "message": "基本的なHTMLモードでメールを開く" + }, + "options_tab_11": { + "message": "未読メールのタイトルをクリックすると、Gmail™ は INBOX フォルダではなくメール自体を開きます。" + }, + "options_toolbar": { + "message": "ツールバー" + }, + "options_toolbar_1": { + "message": "ツールバーボタンの動作" + }, + "options_toolbar_2": { + "message": "メールプレビューパネルを常に開く" + }, + "options_toolbar_3": { + "message": "ログインしているアカウントが 1 つだけの場合は Gmail™ アカウントを開きます" + }, + "options_toolbar_18": { + "message": "Gmail™ アカウントを開く (強制)" + }, + "options_toolbar_4": { + "message": "ツールバーパネルモード" + }, + "options_toolbar_5": { + "message": "概要のみ表示" + }, + "options_toolbar_6": { + "message": "全コンテンツを表示" + }, + "options_toolbar_7": { + "message": "フルコンテンツ表示モードでのツールバー パネルの幅 (ピクセル単位):" + }, + "options_toolbar_8": { + "message": "最小幅は500ピクセルです。" + }, + "options_toolbar_9": { + "message": "フルコンテンツ表示モードでのツールバー パネルの高さ (ピクセル単位):" + }, + "options_toolbar_10": { + "message": "最小の高さは500ピクセルです。" + }, + "options_toolbar_11": { + "message": "ツールバーパネルでキーボードショートカットをサポート" + }, + "options_toolbar_12": { + "message": "スパムとして報告: 、ゴミ箱: <#>、アーカイブ: 1、既読にする: 。" + }, + "options_toolbar_13": { + "message": "フルコンテンツモードでメールをHTMLとしてレンダリングする" + }, + "options_toolbar_14": { + "message": "フルコンテンツ モードでテキストのみのレンダリングを希望する場合は、ボックスのチェックを外します。" + }, + "options_toolbar_15": { + "message": "ツールバーボタンを中クリックすると" + }, + "options_toolbar_16": { + "message": "すべてのアカウントを更新" + }, + "options_toolbar_17": { + "message": "メインのGmail™アカウントを開く" + }, + "options_misc": { + "message": "その他" + }, + "options_misc_1": { + "message": "アカウントをアルファベット順に並べ替える" + }, + "options_misc_2": { + "message": "デフォルトのオーダーはログインです。" + }, + "options_misc_3": { + "message": "ツールバーボタンのカラーパターン:" + }, + "options_misc_4": { + "message": "「未読なし」は灰色、「切断」は青色" + }, + "options_misc_5": { + "message": "「未読なし」は青色、「切断」は灰色" + }, + "options_misc_9": { + "message": "未読なし」は赤色、「切断」は灰色" + }, + "options_misc_6": { + "message": "Gmail™ がアクティブなタブで既に開かれていることを警告するデスクトップ通知を表示します" + }, + "options_misc_7": { + "message": "アップグレード時にウェルカムページを表示する" + }, + "options_misc_8": { + "message": "すべての設定を工場出荷時の状態に戻す" + }, + "options_misc_10": { + "message": "メールが次の時間 (分単位) 以内に到着した場合にのみ、デスクトップ通知とサウンド通知を起動します:" + }, + "options_misc_11": { + "message": "この設定をゼロに設定すると、デスクトップ通知もサウンド通知も受信されなくなりますが、バッジ通知は引き続き受信されます。" + }, + "options_misc_12": { + "message": "ツールチップテキストにログイン詳細を含めないでください" + }, + "options_misc_13": { + "message": "デフォルトでは、通知機能はツールバー ボタンのツールチップ テキストをログイン情報で更新します。このオプションをオフにすると、ツールチップ テキストはデフォルト値のままになります。" + }, + "options_misc_14": { + "message": "未読メールの数が 999 を超える場合、正確なバッジ番号を表示しない" + }, + "options_misc_15": { + "message": "アップデートに関するFAQページを開く" + }, + "options_misc_16": { + "message": "パネルのカラーテーマ:" + }, + "options_misc_17": { + "message": "ライトテーマ" + }, + "options_misc_18": { + "message": "ダークテーマ" + }, + "options_misc_19": { + "message": "システムテーマ" + }, + "options_plugins": { + "message": "プラグイン" + }, + "options_plugins_1": { + "message": "Gmail™ ラベルとスターボタン (試験的)" + }, + "options_plugins_2": { + "message": "このプラグインは、ポップアップにスターボタンとスレッドのラベルを表示します (拡張モードのみ)。" + }, + "options_styling": { + "message": "スタイリング" + }, + "options_styling_0": { + "message": "メールの表示を(0.5~4)で拡大する" + }, + "options_styling_1": { + "message": "トップパネルのカスタム CSS ルール" + }, + "options_styling_2": { + "message": "メールビューのカスタム CSS ルール" + }, + "options_px": { + "message": "px" + }, + "options_empty": { + "message": "未定義" + }, + "options_button_test": { + "message": "サウンドを再生する ►" + }, + "options_button_reset": { + "message": "設定をリセット" + }, + "popup_settings": { + "message": "設定" + }, + "popup_of": { + "message": "of" + }, + "popup_wait": { + "message": "Wait..." + }, + "popup_date_format": { + "message": "%mm %dd, %yy" + }, + "popup_no_subject": { + "message": "(件名なし)" + }, + "popup_open_settings": { + "message": "設定を開く" + }, + "popup_open_inbox": { + "message": "受信トレイを開く" + }, + "popup_archive": { + "message": "アーカイブ" + }, + "popup_spam": { + "message": "スパム" + }, + "popup_trash": { + "message": "ゴミ箱" + }, + "popup_refresh": { + "message": "更新" + }, + "popup_read": { + "message": "既読にする" + }, + "popup_read_all": { + "message": "すべて既読にする" + }, + "popup_toggle_dark": { + "message": "ダークテーマのオン/オフを切り替え" + }, + "popup_msg_1": { + "message": "ちょうど今" + }, + "popup_msg_2": { + "message": "1 分前" + }, + "popup_msg_3_format": { + "message": "%d 分前" + }, + "popup_msg_4": { + "message": "1 時間前" + }, + "popup_msg_5": { + "message": "数時間前" + }, + "popup_msg_6": { + "message": "昨日" + }, + "popup_msg_7_format": { + "message": "%d 日前" + }, + "popup_msg_8_format": { + "message": "%d 週間前" + }, + "popup_msg_9_format": { + "message": "%d か月前" + }, + "popup_msg_10": { + "message": "1月" + }, + "popup_msg_11": { + "message": "2月" + }, + "popup_msg_12": { + "message": "3月" + }, + "popup_msg_13": { + "message": "4月" + }, + "popup_msg_14": { + "message": "5月" + }, + "popup_msg_15": { + "message": "6月" + }, + "popup_msg_16": { + "message": "7月" + }, + "popup_msg_17": { + "message": "8月" + }, + "popup_msg_18": { + "message": "9月" + }, + "popup_msg_19": { + "message": "10月" + }, + "popup_msg_20": { + "message": "11月" + }, + "popup_msg_21": { + "message": "12月" + }, + "settings_open_title": { + "message": "オプション(設定)ページを開く" + }, + "settings_open_label": { + "message": "オプションを開く" + } +} diff --git a/v3.classic/_locales/nl/messages.json b/v3.classic/_locales/nl/messages.json new file mode 100644 index 00000000..6dc380e4 --- /dev/null +++ b/v3.classic/_locales/nl/messages.json @@ -0,0 +1,762 @@ +{ + "toolbar_label": { + "message": "Gmail-melder™", + "description": "" + }, + "tooltip_1": { + "message": "Linksklikken: Gmail of het e-mailvoorvertoningspaneel openen", + "description": "" + }, + "tooltip_2": { + "message": "Middelklikken (of Ctrl+pijltje naar links): alle accounts verversen", + "description": "" + }, + "tooltip_3": { + "message": "Rechtsklikken: accountselectie", + "description": "" + }, + "description": { + "message": "Label- en accountmelder voor Google Mail (Gmail)", + "description": "" + }, + "log_in_to_your_account": { + "message": "Log in op uw Gmail-account", + "description": "" + }, + "msg_1": { + "message": "Het tabblad is al geopend. Klik op de werkbalkknop om Gmail op een nieuw tabblad te openen of naar een geopend Gmail-tabblad te gaan.", + "description": "" + }, + "msg_2": { + "message": "De link is gekopieerd naar het klembord.", + "description": "" + }, + "msg_3": { + "message": "De selectie is gekopieerd naar het klembord.", + "description": "" + }, + "msg_4": { + "message": "Let op: om de melder naar behoren te laten werken dient u ingelogd te zijn op uw Google-account.", + "description": "" + }, + "msg_5": { + "message": "Kies een audiobestand", + "description": "" + }, + "label_1": { + "message": "Verversen", + "description": "" + }, + "label_2": { + "message": "Instellingen", + "description": "" + }, + "label_3": { + "message": "Alle meldingen uitschakelen", + "description": "" + }, + "label_4": { + "message": "5 minuten", + "description": "" + }, + "label_5": { + "message": "15 minuten", + "description": "" + }, + "label_6": { + "message": "30 minuten", + "description": "" + }, + "label_7": { + "message": "1 uur", + "description": "" + }, + "label_8": { + "message": "2 uur", + "description": "" + }, + "label_9": { + "message": "5 uur", + "description": "" + }, + "label_13": { + "message": "Voor een aangepaste tijdsperiode", + "description": "" + }, + "label_10": { + "message": "Meldingen tonen (sessie)", + "description": "" + }, + "label_11": { + "message": "E-mail opstellen", + "description": "" + }, + "label_12": { + "message": "Veelgestelde vragen (FAQ) openen", + "description": "" + }, + "label_14": { + "message": "Ingelogde accounts", + "description": "" + }, + "unknown": { + "message": "onbekend", + "description": "" + }, + "and": { + "message": "en", + "description": "" + }, + "log_into_your_account": { + "message": "Log in op uw account", + "description": "" + }, + "notification": { + "message": "Van: [author_email][break]Onderwerp: [title][break]Samenvatting: [summary]", + "description": "" + }, + "options_title": { + "message": "Instellingen - Gmail™-melder", + "description": "" + }, + "options_inshort": { + "message": "Label- en accountmelder voor Google Mail (Gmail)", + "description": "" + }, + "options_donation": { + "message": "Ondersteun de ontwikkeling", + "description": "" + }, + "options_timings": { + "message": "Tijdstippen:", + "description": "" + }, + "options_timings_l1": { + "message": "Op nieuwe e-mails controleren, elke (in seconden):", + "description": "" + }, + "options_timings_l2": { + "message": "De minimale tijdsduur is 10 seconden.", + "description": "" + }, + "options_timings_l3": { + "message": "Herinnering voor alle ongelezen e-mails, elke (in minuten):", + "description": "" + }, + "options_timings_l4": { + "message": "Stel de waarde in op nul voor geen herinneringen te tonen.", + "description": "" + }, + "options_timings_l5": { + "message": "De minimale tijdsduur is 5 minuten.", + "description": "" + }, + "options_timings_l6": { + "message": "Een waarde hoger dan nul zorgt voor constante meldingen en waarschuwingsgeluiden (vergelijkbaar met het arriveren van een nieuwe e-mail) als u ongelezen e-mail(s) hebt.", + "description": "" + }, + "options_timings_l7": { + "message": "Niet controleren op nieuwe e-mails bij opstarten voor de duur van (in seconden):", + "description": "" + }, + "options_timings_l8": { + "message": "Stel de waarde op nul in om geen e-mailcontrole uit te voeren zolang er nog geen handmatige verversing is uitgevoerd [niet beschikbaar in Safari].", + "description": "" + }, + "options_gmail": { + "message": "Gmail:", + "description": "" + }, + "options_gmail_1": { + "message": "Hoofdaccount (/mail/u/0/)", + "description": "" + }, + "options_gmail_2": { + "message": "Scheid labels met “,” (komma's).", + "description": "" + }, + "options_gmail_3": { + "message": "Tweede account (/mail/u/1)", + "description": "" + }, + "options_gmail_4": { + "message": "Derde account (/mail/u/2)", + "description": "" + }, + "options_gmail_5": { + "message": "Vierde account (/mail/u/3)", + "description": "" + }, + "options_gmail_6": { + "message": "Vijfde account (/mail/u/4)", + "description": "" + }, + "options_gmail_7": { + "message": "Zesde account (/mail/u/5)", + "description": "" + }, + "options_gmail_8": { + "message": "Berichten als gelezen markeren na archiveren", + "description": "" + }, + "options_gmail_15": { + "message": "Enkele veelgebruikte labels:", + "description": "" + }, + "options_gmail_10": { + "message": "Meldingen tonen voor de volgende labels en accounts:", + "description": "" + }, + "options_gmail_11": { + "message": "Aangepaste feeds:", + "description": "" + }, + "options_gmail_12": { + "message": "Scheid feeds met komma's (“,”). Voorbeeldfeed: https://mail.google.com/mail/u/0/feed/atom/inbox", + "description": "" + }, + "options_gmail_13": { + "message": "Let op: het maximumaantal labels, m.u.v. ‘inbox’, is 20 (Google's feeds geven alleen de 20 nieuwste labels door)", + "description": "" + }, + "options_gmail_14": { + "message": "Tip: als de melder meer dan 5 accounts in de gaten moet houden, voeg dan de feed-url's toe aan het ‘Aangepaste feeds’-veld. Voorbeeld: om account 6 en 7 in de gaten te houden, voeg toe: https://mail.google.com/mail/u/6/feed/atom/inbox, https://mail.google.com/mail/u/7/feed/atom/inbox", + "description": "" + }, + "options_notifications": { + "message": "Meldingen:", + "description": "" + }, + "options_notifications_1": { + "message": "Bureaubladmeldingen tonen bij nieuwe e-mails", + "description": "" + }, + "options_notifications_2": { + "message": "Bureaubladmeldingen tonen voor de duur van (in seconden):", + "description": "" + }, + "options_notifications_3": { + "message": "Deze instelling werkt mogelijk niet op alle besturingssystemen.", + "description": "" + }, + "options_notifications_4": { + "message": "Meldingopmaak", + "description": "" + }, + "options_notifications_5": { + "message": "Beschikbare variabelen:", + "description": "" + }, + "options_notifications_6": { + "message": "Meldingen inkorten die langer zijn dan", + "description": "" + }, + "options_notifications_7": { + "message": "tekens voor [title]- en [summary]-velden", + "description": "" + }, + "options_notifications_8": { + "message": "Voer hier een groot getal in om inkorting te voorkomen.", + "description": "" + }, + "options_notifications_9": { + "message": "Meldingsgeluid afspelen bij nieuwe e-mails", + "description": "" + }, + "options_notifications_10": { + "message": "Opmerking voor Mac-gebruikers: sinds Firefox 28.0 worden alle bureaubladmeldingen afgehandeld middels het macOS-berichtencentrum, welke een extra meldingsgeluid afspeelt. U moet ofwel deze optie uitschakelen ofwel de corresponderende optie in het macOS-berichtencentrum.", + "description": "" + }, + "options_notifications_11": { + "message": "‘Windows-taakbalkmeldingen’/‘macOS-dockmeldingen’ tonen", + "description": "" + }, + "options_notifications_12": { + "message": "Taakbalkmeldingen worden momenteel niet ondersteund op Linux-systemen.", + "description": "" + }, + "options_notifications_13": { + "message": "Werkbalkpaneel openen na klikken op taakbalkmeldingspictogram (alleen Windows - bèta)", + "description": "" + }, + "options_notifications_14": { + "message": "Deze optie is zeer experimenteel en kan mogelijk instabiliteit veroorzaken in Firefox. [herstart vereist]", + "description": "" + }, + "options_notifications_15": { + "message": "Het standaard meldingsgeluid is", + "description": "" + }, + "options_notifications_16": { + "message": "Standaardgeluid van Gmail-melder", + "description": "" + }, + "options_notifications_17": { + "message": "Checker Plus-belgeluid", + "description": "" + }, + "options_notifications_18": { + "message": "Checker Plus-dinggeluid", + "description": "" + }, + "options_notifications_19": { + "message": "Windows-e-mailgeluid", + "description": "" + }, + "options_notifications_20": { + "message": "Eigen geluid", + "description": "" + }, + "options_notifications_21": { + "message": "Het eigen gekozen meldingsgeluid is", + "description": "" + }, + "options_notifications_22": { + "message": "Als uw browser geen eigen meldingsgeluid afspeelt, probeer dan het bestand te converteren naar onbewerkt wav-formaat middels een online-converteerprogramma.", + "description": "" + }, + "options_notifications_35": { + "message": "Om een nieuw aangepast geluid te gebruiken, dient u eerst een ingebouwd geluid te kiezen en deze te wijzigen naar een eigen geluid", + "description": "" + }, + "options_notifications_23": { + "message": "Het volume van het meldingsgeluid is", + "description": "" + }, + "options_notifications_24": { + "message": "Het volumeniveau is een getal tussen de 0 en 100 waar 100 het hoogste volumeniveau is (standaard).", + "description": "" + }, + "options_notifications_25": { + "message": "Waarschijnlijk werken de standaard meldingsgeluiden niet goed in Safari. Als dit het geval is, moet u een eigen geluidsbestand kiezen.", + "description": "" + }, + "options_notifications_26": { + "message": "Altijd systeemvakmeldingen tonen (alleen Windows)", + "description": "" + }, + "options_notifications_27": { + "message": "Er wordt een systeemvakmelding getoond, zelfs als er geen ongelezen bericht is.", + "description": "" + }, + "options_notifications_28": { + "message": "Schakelt alle meldingen uit voor een aangepaste tijdsperiode (in minuten):", + "description": "" + }, + "options_notifications_29": { + "message": "Deze optie is gerelateerd aan het rechtermuisknopmenu op de werkbalkknop -> Alle meldingen uitschakelen -> Aangepaste tijdsperiode.", + "description": "" + }, + "options_notifications_30": { + "message": "Alle bureaubladmeldingen samenvoegen tot één melding", + "description": "" + }, + "options_notifications_31": { + "message": "Eigen geluidsmelding", + "description": "" + }, + "options_notifications_32": { + "message": "naam of e-mailadres bevat", + "description": "" + }, + "options_notifications_33": { + "message": "e-mailonderwerp bevat", + "description": "" + }, + "options_notifications_34": { + "message": "e-mailsamenvatting bevat", + "description": "" + }, + "options_notifications_36": { + "message": "Gmail vragen om doorverwijzing naar ‘inbox.google.com’ te voorkomen", + "description": "" + }, + "options_notifications_37": { + "message": "Aantal e-mails op pictogram tonen", + "description": "" + }, + "options_notifications_38": { + "message": "Snellere acties (markeren als gelezen, verwijderen, ...) (Acties beschouwen als voltooid zodra koppen ontvangen zijn)", + "description": "" + }, + "options_notifications_40": { + "message": "Snelle acties toestaan vanuit meldingsgebied (maximaal twee acties - alleen Chrome)", + "description": "" + }, + "options_notifications_41": { + "message": "Markeren als gelezen", + "description": "" + }, + "options_notifications_42": { + "message": "Archiveren", + "description": "" + }, + "options_notifications_43": { + "message": "Verpl. nr. prullenbak", + "description": "" + }, + "options_tab": { + "message": "Tabblad openen:", + "description": "" + }, + "options_tab_1": { + "message": "Alleen op het actieve venster zoeken naar een geopend Gmail-account", + "description": "" + }, + "options_tab_2": { + "message": "Niet in andere browservensters zoeken naar geopende Gmail-accounts. Als Gmail niet is geopend in het actieve venster, wordt een nieuw tabblad geopend.", + "description": "" + }, + "options_tab_3": { + "message": "Nieuw Gmail-account openen op tabblad naast actief tabblad", + "description": "" + }, + "options_tab_4": { + "message": "Gmail-account openen op actief tabblad", + "description": "" + }, + "options_tab_5": { + "message": "Gmail-account openen op achtergrondtabblad", + "description": "" + }, + "options_tab_6": { + "message": "Gmail-account openen in nieuw venster", + "description": "" + }, + "options_tab_7": { + "message": "Altijd blanco tabbladen gebruiken in plaats van een nieuw tabblad te openen als een tabblad is geactiveerd", + "description": "" + }, + "options_tab_8": { + "message": "Geopende Gmail-tabbladen negeren", + "description": "" + }, + "options_tab_9": { + "message": "Als dit niet is aangevinkt, dan zal Gmail-melder óf binnen het actieve venster óf binnen alle geopende vensters controleren of Gmail al geopend is. Daarna zal naar het actieve tabblad worden overgeschakeld (indien gewenst).", + "description": "" + }, + "options_tab_10": { + "message": "E-mails opmaken met html", + "description": "" + }, + "options_tab_11": { + "message": "Open de nieuwste ongelezen e-mail in plaats van de inbox-map", + "description": "" + }, + "options_toolbar": { + "message": "Werkbalk:", + "description": "" + }, + "options_toolbar_1": { + "message": "Gedrag van werkbalkknop", + "description": "" + }, + "options_toolbar_2": { + "message": "E-mailvoorvertoningspaneel openen", + "description": "" + }, + "options_toolbar_3": { + "message": "Gmail-account openen als er slechts één account is ingelogd", + "description": "" + }, + "options_toolbar_18": { + "message": "Gmail-account openen (afdwingen)", + "description": "" + }, + "options_toolbar_4": { + "message": "Werkbalkpaneelmodus", + "description": "" + }, + "options_toolbar_5": { + "message": "Samenvatting tonen", + "description": "" + }, + "options_toolbar_6": { + "message": "Volledige inhoud tonen", + "description": "" + }, + "options_toolbar_7": { + "message": "De breedte van het werkbalkpaneel in de volledige weergavemodus is (in pixels):", + "description": "" + }, + "options_toolbar_8": { + "message": "De minimale breedte is 500px.", + "description": "" + }, + "options_toolbar_9": { + "message": "De hoogte van het werkbalkpaneel in de volledige weergavemodus is (in pixels):", + "description": "" + }, + "options_toolbar_10": { + "message": "De minimale hoogte is 500px.", + "description": "" + }, + "options_toolbar_11": { + "message": "Sneltoetsen ondersteunen op het werkbalkpaneel", + "description": "" + }, + "options_toolbar_12": { + "message": "!: Melden als spam, #:Verplaatsen naar prullenbak, e:Archiveren, Shift + i: Markeren als ongelezen.", + "description": "" + }, + "options_toolbar_13": { + "message": "E-mails opmaken met html in volledige weergavemodus", + "description": "" + }, + "options_toolbar_14": { + "message": "Schakel deze optie uit als u voorkeur geeft aan plattetekstopmaak in de volledige weergavemodus.", + "description": "" + }, + "options_toolbar_15": { + "message": "Middelklikken op de werkbalkknop om", + "description": "" + }, + "options_toolbar_16": { + "message": "Alle accounts te verversen", + "description": "" + }, + "options_toolbar_17": { + "message": "Het primaire Gmail-account te openen", + "description": "" + }, + "options_misc": { + "message": "Overig:", + "description": "" + }, + "options_misc_1": { + "message": "Accounts alfabetisch sorteren", + "description": "" + }, + "options_misc_2": { + "message": "De standaardsortering is sorteren op datum van inloggen.", + "description": "" + }, + "options_misc_3": { + "message": "Het kleurenpatroon van de werkbalk is", + "description": "" + }, + "options_misc_4": { + "message": "Grijze kleur bij ‘Geen ongelezen berichten’ en blauwe kleur bij ‘Niet verbonden’", + "description": "" + }, + "options_misc_5": { + "message": "Blauwe kleur bij ‘Geen ongelezen berichten’ en grijze kleur bij ‘Niet verbonden’", + "description": "" + }, + "options_misc_9": { + "message": "Rode kleur bij ‘Geen ongelezen berichten’ en grijze kleur bij ‘Niet verbonden’", + "description": "" + }, + "options_misc_6": { + "message": "Bureaubladmelding tonen als Gmail al geopend is op het actieve tabblad", + "description": "" + }, + "options_misc_7": { + "message": "Welkomstpagina tonen na updates", + "description": "" + }, + "options_misc_8": { + "message": "Alle instellingen naar standaardwaarden herstellen", + "description": "" + }, + "options_misc_10": { + "message": "Alleen bureaublad- en geluidsmeldingen ontvangen als een e-mail ontvangen is in minder dan (in minuten):", + "description": "" + }, + "options_misc_11": { + "message": "Door deze instelling op nul te zetten ontvangt geen bureaublad- of geluidsmeldingen - u ziet echter nog wél de indicator op de knop.", + "description": "" + }, + "options_misc_12": { + "message": "Geen inloggegevens in de tooltiptekst weergeven", + "description": "" + }, + "options_misc_13": { + "message": "Standaard toont de melder inloggegevens op de hulpballon van de werkbalkknop. Door deze instelling uit te schakelen blijft de tekst op de standaardwaarde.", + "description": "" + }, + "options_misc_14": { + "message": "Geen exact embleemgetal tonen als het aantal ongelezen e-mails meer is dan 999", + "description": "" + }, + "options_misc_15": { + "message": "Veelgestelde vragen-pagina openen na updates", + "description": "" + }, + "options_plugins": { + "message": "Plug-ins:", + "description": "" + }, + "options_plugins_1": { + "message": "Gmail-labels en sterknop (experimenteel)", + "description": "" + }, + "options_plugins_2": { + "message": "Deze plug-in toont de sterknop en onderwerplabels in de pop-up (alleen in de uitgeklapte modus).", + "description": "" + }, + "options_px": { + "message": "px", + "description": "" + }, + "options_empty": { + "message": "niet-opgegeven", + "description": "" + }, + "options_button_test": { + "message": "Afspelen", + "description": "" + }, + "options_button_reset": { + "message": "Standaardwaarden herstellen", + "description": "" + }, + "popup_settings": { + "message": "Instellingen", + "description": "" + }, + "popup_of": { + "message": "van", + "description": "" + }, + "popup_wait": { + "message": "Even geduld…", + "description": "" + }, + "popup_date_format": { + "message": "%dd %mm %yy", + "description": "" + }, + "popup_no_subject": { + "message": "(geen onderwerp)", + "description": "" + }, + "popup_open_settings": { + "message": "Instellingen openen", + "description": "" + }, + "popup_open_inbox": { + "message": "Inbox openen", + "description": "" + }, + "popup_archive": { + "message": "Archief", + "description": "" + }, + "popup_spam": { + "message": "Spam", + "description": "" + }, + "popup_trash": { + "message": "Prullenbak", + "description": "" + }, + "popup_refresh": { + "message": "Verversen", + "description": "" + }, + "popup_read": { + "message": "Markeren als gelezen", + "description": "" + }, + "popup_read_all": { + "message": "Alles markeren als gelezen", + "description": "" + }, + "popup_msg_1": { + "message": "zojuist", + "description": "" + }, + "popup_msg_2": { + "message": "1 minuut geleden", + "description": "" + }, + "popup_msg_3_format": { + "message": "%d minuten geleden", + "description": "" + }, + "popup_msg_4": { + "message": "1 uur geleden", + "description": "" + }, + "popup_msg_5": { + "message": "uur geleden", + "description": "" + }, + "popup_msg_6": { + "message": "Gisteren", + "description": "" + }, + "popup_msg_7_format": { + "message": "%d dagen geleden", + "description": "" + }, + "popup_msg_8_format": { + "message": "%d week/weken geleden", + "description": "" + }, + "popup_msg_9_format": { + "message": "%d maand(en) geleden", + "description": "" + }, + "popup_msg_10": { + "message": "januari", + "description": "" + }, + "popup_msg_11": { + "message": "februari", + "description": "" + }, + "popup_msg_12": { + "message": "maart", + "description": "" + }, + "popup_msg_13": { + "message": "april", + "description": "" + }, + "popup_msg_14": { + "message": "mei", + "description": "" + }, + "popup_msg_15": { + "message": "juni", + "description": "" + }, + "popup_msg_16": { + "message": "juli", + "description": "" + }, + "popup_msg_17": { + "message": "augustus", + "description": "" + }, + "popup_msg_18": { + "message": "september", + "description": "" + }, + "popup_msg_19": { + "message": "oktober", + "description": "" + }, + "popup_msg_20": { + "message": "november", + "description": "" + }, + "popup_msg_21": { + "message": "december", + "description": "" + }, + "settings_open_title": { + "message": "Open de instellingenpagina", + "description": "" + }, + "settings_open_label": { + "message": "Instellingen openen", + "description": "" + }, + "gmail": { + "message": "Gmail-melder™", + "description": "" + } +} \ No newline at end of file diff --git a/v3.classic/_locales/pl/messages.json b/v3.classic/_locales/pl/messages.json new file mode 100644 index 00000000..ecc52345 --- /dev/null +++ b/v3.classic/_locales/pl/messages.json @@ -0,0 +1,762 @@ +{ + "toolbar_label": { + "message": "Powiadomienia Gmail™", + "description": "" + }, + "tooltip_1": { + "message": "LPM: Otwórz Gmail lub panel podglądu wiadomości", + "description": "" + }, + "tooltip_2": { + "message": "Kółko myszy (lub Ctrl+LPM): Odśwież wszystkie konta", + "description": "" + }, + "tooltip_3": { + "message": "PPM: Wybór kont", + "description": "" + }, + "description": { + "message": "Etykiety i powiadomienia kont dla Poczty Google (Gmail)", + "description": "" + }, + "log_in_to_your_account": { + "message": "Proszę się zalogować do konta Gmail", + "description": "" + }, + "msg_1": { + "message": "Karta jest już otworzona. Naciśnij na przycisku paska narzędzi, aby otworzyć Gmail w nowej karcie lub aby przełączyć się na istniejącą kartę Gmail.", + "description": "" + }, + "msg_2": { + "message": "Link został skopiowany do schowka.", + "description": "" + }, + "msg_3": { + "message": "Zaznaczony tekst został skopiowany do schowka.", + "description": "" + }, + "msg_4": { + "message": "Informacja: Aby powiadomienia działały poprawnie, musisz być zalogowany do swojego konta Google.", + "description": "" + }, + "msg_5": { + "message": "Wybierz plik z dźwiękiem audio", + "description": "" + }, + "label_1": { + "message": "Odśwież", + "description": "" + }, + "label_2": { + "message": "Ustawienia", + "description": "" + }, + "label_3": { + "message": "Wyłącz wszystkie powiadomienia", + "description": "" + }, + "label_4": { + "message": "Przez 5 minut", + "description": "" + }, + "label_5": { + "message": "Przez 15 minut", + "description": "" + }, + "label_6": { + "message": "Przez 30 minut", + "description": "" + }, + "label_7": { + "message": "Przez godzinę", + "description": "" + }, + "label_8": { + "message": "Przez 2 godziny", + "description": "" + }, + "label_9": { + "message": "Przez 5 godzin", + "description": "" + }, + "label_13": { + "message": "Na własny odstęp czasowy", + "description": "" + }, + "label_10": { + "message": "Włącz powiadomienia (dla sesji)", + "description": "" + }, + "label_11": { + "message": "Stwórz wiadomość", + "description": "" + }, + "label_12": { + "message": "Otwórz FAQ", + "description": "" + }, + "label_14": { + "message": "Zalogowane konta", + "description": "" + }, + "unknown": { + "message": "nieznane", + "description": "" + }, + "and": { + "message": "i", + "description": "" + }, + "log_into_your_account": { + "message": "Proszę się zalogować do swojego konta", + "description": "" + }, + "notification": { + "message": "Od: [author_email][break]Tytuł: [title][break]Streszczenie: [summary]", + "description": "" + }, + "options_title": { + "message": "Opcje - Powiadomienia Gmail™", + "description": "" + }, + "options_inshort": { + "message": "Etykiety i powiadomienia kont dla Poczty Google (Gmail).", + "description": "" + }, + "options_donation": { + "message": "Wspomóż rozwój programu", + "description": "" + }, + "options_timings": { + "message": "Czasowe:", + "description": "" + }, + "options_timings_l1": { + "message": "Sprawdzaj nowe wiadomości co (sekundy):", + "description": "" + }, + "options_timings_l2": { + "message": "Minimalny odstęp czasowy to 10 sekund.", + "description": "" + }, + "options_timings_l3": { + "message": "Przypominaj o nieprzeczytanych wiadomościach co (minuty):", + "description": "" + }, + "options_timings_l4": { + "message": "Ustaw wartość na zero, aby nie otrzymywać przypomnień.", + "description": "" + }, + "options_timings_l5": { + "message": "Minimalny odstęp czasowy to 5 minut.", + "description": "" + }, + "options_timings_l6": { + "message": "Wartości inne niż zero wyzwalają powiadomienia na pulpicie oraz dźwięk, dopóki posiadasz nieprzeczytane wiadomości (podobnie jak otrzymanie nowej poczty).", + "description": "" + }, + "options_timings_l7": { + "message": "Sprawdzaj nowe wiadomości przy starcie po (sekundy):", + "description": "" + }, + "options_timings_l8": { + "message": "Ustaw wartość na zero, aby nie sprawdzać nowych wiadomości przed pierwszym ręcznym odświeżeniem [niedostępne na Safari].", + "description": "" + }, + "options_gmail": { + "message": "Gmail:", + "description": "" + }, + "options_gmail_1": { + "message": "Konto główne (/mail/u/0/)", + "description": "" + }, + "options_gmail_2": { + "message": "Oddzielaj etykiety znakiem \",\" (przecinek).", + "description": "" + }, + "options_gmail_3": { + "message": "Drugie konto (/mail/u/1/)", + "description": "" + }, + "options_gmail_4": { + "message": "Trzecie konto (/mail/u/2/)", + "description": "" + }, + "options_gmail_5": { + "message": "Czwarte konto (/mail/u/3/)", + "description": "" + }, + "options_gmail_6": { + "message": "Piąte konto (/mail/u/4)", + "description": "" + }, + "options_gmail_7": { + "message": "Szóste konto (/mail/u/5/)", + "description": "" + }, + "options_gmail_8": { + "message": "Oznacz wiadomość jako przeczytaną podczas archiwizowania", + "description": "" + }, + "options_gmail_15": { + "message": "Kilka popularnych etykiet:", + "description": "" + }, + "options_gmail_10": { + "message": "Otrzymuj powiadomienia dla następujących etykiet oraz kont:", + "description": "" + }, + "options_gmail_11": { + "message": "Własne kanały:", + "description": "" + }, + "options_gmail_12": { + "message": "Oddzielaj kanały znakiem \",\" (przecinek). Przykładowy kanał:\nhttps://mail.google.com/mail/u/0/feed/atom/inbox", + "description": "" + }, + "options_gmail_13": { + "message": "Informacja: maksymalna ilość wszystkich etykiet, poza \"inbox\", wynosi 20 (Kanały Google dostarczają jedynie 20 najnowszych rekordów).", + "description": "" + }, + "options_gmail_14": { + "message": "Informacja: Aby Powiadomienia nasłuchiwały więcej niż 5 kont, dodaj adresy URL kanałów do pola \"Własne kanały\". Na przykład, aby nasłuchiwać szóste i siódme konto, dodaj: https://mail.google.com/mail/u/6/feed/atom/inbox, https://mail.google.com/mail/u/7/feed/atom/inbox", + "description": "" + }, + "options_notifications": { + "message": "Powiadomienia:", + "description": "" + }, + "options_notifications_1": { + "message": "Wyświetlaj na pulpicie powiadomienia o nowych wiadomościach", + "description": "" + }, + "options_notifications_2": { + "message": "Pokazuj powiadomienia na pulpicie przez (sekundy):", + "description": "" + }, + "options_notifications_3": { + "message": "Ta opcja może nie działać na twoim systemie operacyjnym.", + "description": "" + }, + "options_notifications_4": { + "message": "Format powiadomienia", + "description": "" + }, + "options_notifications_5": { + "message": "Dostępne klucze:", + "description": "" + }, + "options_notifications_6": { + "message": "Skracaj powiadomienia dłuższe niż", + "description": "" + }, + "options_notifications_7": { + "message": "znaków dla pól [title] oraz [summary].", + "description": "" + }, + "options_notifications_8": { + "message": "Jeżeli nie chcesz skracać, wpisz dużą liczbę.", + "description": "" + }, + "options_notifications_9": { + "message": "Odtwórz dźwięk po otrzymaniu nowych wiadomości", + "description": "" + }, + "options_notifications_10": { + "message": "Informacja dla użytkowników systemu Mac. Począwszy od Firefox 28.0, wszystkie powiadomienia na pulpicie są przechwytywane przez Centrum Powiadomień Mac, które wywołuje dodatkowy dźwięk powiadomienia. Zalecane jest wyłączenie jednego z tych dźwięków.", + "description": "" + }, + "options_notifications_11": { + "message": "Wyświetlaj \"powiadomienia paska zadań Windows\" lub \"powiadomienia Mac OS Dock\"", + "description": "" + }, + "options_notifications_12": { + "message": "Obecnie, powiadomienia paska zadań nie są wspierane na systemach Linuks.", + "description": "" + }, + "options_notifications_13": { + "message": "Otwórz panel paska narzędzi podczas kliknięcia na ikonkę powiadomień paska zadań (tylko Windows, beta)", + "description": "" + }, + "options_notifications_14": { + "message": "Ta funkcjonalność jest eksperymentalna i może uczynić Twoją przeglądarkę Firefox niestabilną [wymagany restart].", + "description": "" + }, + "options_notifications_15": { + "message": "Domyślny dźwięk powiadomienia to", + "description": "" + }, + "options_notifications_16": { + "message": "Domyślny sygnał Powiadomień Gmail™", + "description": "" + }, + "options_notifications_17": { + "message": "Dzwonek Checker Plus", + "description": "" + }, + "options_notifications_18": { + "message": "Dzwoneczek Checker Plus", + "description": "" + }, + "options_notifications_19": { + "message": "Sygnał e-mail Windows", + "description": "" + }, + "options_notifications_20": { + "message": "Własny sygnał", + "description": "" + }, + "options_notifications_21": { + "message": "Własny dźwięk powiadomień:", + "description": "" + }, + "options_notifications_22": { + "message": "Jeżeli Twoja przeglądarka nie odtwarza własnego dźwięku powiadomienia, spróbuj go przetworzyć na format WAV przy pomocy narzędzi konwersji w sieci.", + "description": "" + }, + "options_notifications_35": { + "message": "Aby wybrać nowy własny dźwięk, najpierw wybierz wbudowany dźwięk, a następnie zmień wybór na Własny dźwięk", + "description": "" + }, + "options_notifications_23": { + "message": "Głośność dźwięku powiadomienia", + "description": "" + }, + "options_notifications_24": { + "message": "Głośność to liczba pomiędzy 0 i 100, gdzie 100 oznacza najwyższą głośność (domyślnie).", + "description": "" + }, + "options_notifications_25": { + "message": "Safari często odtwarza nieprawidłowo domyślne dźwięki powiadomień. W takim przypadku spróbuj użyć własnych dźwięków powiadomień.", + "description": "" + }, + "options_notifications_26": { + "message": "Zawsze pokazuj ikony powiadomień (tylko Windows)", + "description": "" + }, + "options_notifications_27": { + "message": "Ikony obszaru powiadomień będą zawsze wyświetlane, nawet gdy brak nieprzeczytanych wiadomości.", + "description": "" + }, + "options_notifications_28": { + "message": "Wyłącz wszystkie powiadomienia na własny odstęp czasowy (minuty):", + "description": "" + }, + "options_notifications_29": { + "message": "Ta opcja jest dostępna po naciśnięciu Prawym Przyciskiem Myszy na przycisk na pasku narzędzi -> Wyłącz wszystkie powiadomienia -> Własny odstęp czasowy.", + "description": "" + }, + "options_notifications_30": { + "message": "Połącz wszystkie jednoczesne powiadomienia na pulpicie w pojedyncze", + "description": "" + }, + "options_notifications_31": { + "message": "Własny dźwięk powiadomienia", + "description": "" + }, + "options_notifications_32": { + "message": "nazwa lub e-mail zawiera", + "description": "" + }, + "options_notifications_33": { + "message": "tytuł e-mail'a zawiera", + "description": "" + }, + "options_notifications_34": { + "message": "podsumowanie e-mail'a zawiera", + "description": "" + }, + "options_notifications_36": { + "message": "Unikaj przekierowywania Gmail'a do 'inbox.google.com'", + "description": "" + }, + "options_notifications_37": { + "message": "Wyświetlaj symbol z liczbą wiadomości", + "description": "" + }, + "options_notifications_38": { + "message": "Szybsze operacje (oznacz jako przeczytane, usuń, ...) (Operacje są wykonywane po otrzymaniu nagłówków)", + "description": "" + }, + "options_notifications_40": { + "message": "Zezwól na szybkie akcje z okna powiadomień (maksymalnie dwie akcje) (tylko dla Chrome)", + "description": "" + }, + "options_notifications_41": { + "message": "Oznacz jako przeczytane", + "description": "" + }, + "options_notifications_42": { + "message": "Archiwizuj", + "description": "" + }, + "options_notifications_43": { + "message": "Usuń", + "description": "" + }, + "options_tab": { + "message": "Otwieranie kart:", + "description": "" + }, + "options_tab_1": { + "message": "Szukaj w aktywnym oknie otwartej karty z kontem Gmail", + "description": "" + }, + "options_tab_2": { + "message": "Nie przeszukuj innych okien przeglądarki pod kątem otwartych kont Gmail. Jeżeli Gmail nie jest otworzony w aktywnym oknie, otwórz nową kartę.", + "description": "" + }, + "options_tab_3": { + "message": "Otwórz kolejne konto Gmail za aktywną kartą", + "description": "" + }, + "options_tab_4": { + "message": "Otwórz konto Gmail w aktywnej karcie", + "description": "" + }, + "options_tab_5": { + "message": "Otwórz konto Gmail w karcie w tle", + "description": "" + }, + "options_tab_6": { + "message": "Otwórz konto Gmail w nowym oknie", + "description": "" + }, + "options_tab_7": { + "message": "Zawsze używaj pustych kart zamiast otwierania nowej karty (gdy opcja otwierania na karcie jest aktywna)", + "description": "" + }, + "options_tab_8": { + "message": "Ignoruj otwarte karty Gmail'a", + "description": "" + }, + "options_tab_9": { + "message": "Jeżeli odznaczono, Powiadomienia Gmail sprawdzą wszystkie otwarte okna w poszukiwaniu karty z otwartym Gmail'em, a następnie otworzy ją na żądanie.", + "description": "" + }, + "options_tab_10": { + "message": "Otwórz wiadomości w trybie podstawowego HTML", + "description": "" + }, + "options_tab_11": { + "message": "Otwórz najnowszą nieprzeczytaną wiadomość zamiast folderu Odebrane", + "description": "" + }, + "options_toolbar": { + "message": "Pasek narzędzi:", + "description": "" + }, + "options_toolbar_1": { + "message": "Zachowanie przycisku paska narzędzi", + "description": "" + }, + "options_toolbar_2": { + "message": "Zawsze otwieraj panel podglądu wiadomości", + "description": "" + }, + "options_toolbar_3": { + "message": "Otwieraj konto Gmail, tylko jeżeli zalogowano na jednym", + "description": "" + }, + "options_toolbar_18": { + "message": "Otwórz konto Gmail (wymuś)", + "description": "" + }, + "options_toolbar_4": { + "message": "Tryb panelu paska narzędzi", + "description": "" + }, + "options_toolbar_5": { + "message": "Pokazuj tylko podsumowanie", + "description": "" + }, + "options_toolbar_6": { + "message": "Pokazuj pełną zawartość", + "description": "" + }, + "options_toolbar_7": { + "message": "Szerokość panelu paska narzędzi w trybie pełnej zawartości (piksele):", + "description": "" + }, + "options_toolbar_8": { + "message": "Minimalna szerokość to 500px.", + "description": "" + }, + "options_toolbar_9": { + "message": "Wysokość panelu paska narzędzi w trybie pełnej zawartości (piksele):", + "description": "" + }, + "options_toolbar_10": { + "message": "Minimalna wysokość to 500px.", + "description": "" + }, + "options_toolbar_11": { + "message": "Wsparcie skrótów klawiszowych w panelu paska narzędzi", + "description": "" + }, + "options_toolbar_12": { + "message": "!: Zgłoś spam, #: Usuń, e: Archiwizuj, Shift + i: Oznacz jako przeczytane.", + "description": "" + }, + "options_toolbar_13": { + "message": "Wyświetlaj wiadomości jako HTML w trybie pełnej zawartości", + "description": "" + }, + "options_toolbar_14": { + "message": "Jeżeli wolisz surowy tekst w trybie pełnej zawartości, odznacz to pole.", + "description": "" + }, + "options_toolbar_15": { + "message": "Akcja środkowego przycisku myszy na pasku narzędzi:", + "description": "" + }, + "options_toolbar_16": { + "message": "Odśwież wszystkie konta", + "description": "" + }, + "options_toolbar_17": { + "message": "Otwórz główne konto Gmail", + "description": "" + }, + "options_misc": { + "message": "Różności:", + "description": "" + }, + "options_misc_1": { + "message": "Sortuj konta alfabetycznie", + "description": "" + }, + "options_misc_2": { + "message": "Domyślne sortowanie bazuje na kolejności zalogowania.", + "description": "" + }, + "options_misc_3": { + "message": "Kolor paska narzędzi:", + "description": "" + }, + "options_misc_4": { + "message": "Szary dla \"Nieprzeczytane\" i niebieski dla \"Rozłączony\"", + "description": "" + }, + "options_misc_5": { + "message": "Niebieski dla \"Nieprzeczytane\" i szary dla \"Rozłączony\"", + "description": "" + }, + "options_misc_9": { + "message": "Czerwony dla \"Nieprzeczytane\" i szary dla \"Rozłączony\"", + "description": "" + }, + "options_misc_6": { + "message": "Pokazuj powiadomienia na pulpicie, aby powiadomić, że Gmail jest już otwarty w aktywnej karcie", + "description": "" + }, + "options_misc_7": { + "message": "Pokazuj stronę powitalną po aktualizacji", + "description": "" + }, + "options_misc_8": { + "message": "Przywróć wszystkie ustawienia do fabrycznych", + "description": "" + }, + "options_misc_10": { + "message": "Uruchom powiadomienia na pulpicie oraz dźwiękowe, gdy e-mail został otrzymany poniżej (minut):", + "description": "" + }, + "options_misc_11": { + "message": "Ustawienie tej opcji na zero spowoduje, iż nie będziesz otrzymywać powiadomień na pulpicie ani dźwiękowych; jednakże nadal będziesz otrzymywać powiadomienia z ikonki na pasku narzędzi.", + "description": "" + }, + "options_misc_12": { + "message": "Nie uwzględniaj informacji o profilu w treści okienka podpowiedzi", + "description": "" + }, + "options_misc_13": { + "message": "Rozszerzenie domyślnie aktualizuje treść okienka podpowiedzi na przycisku paska narzędzi informacjami o profilu. Odznaczenie tej opcji spowoduje zachowanie treści w domyślnej wartości.", + "description": "" + }, + "options_misc_14": { + "message": "Nie wyświetlaj szczegółowej liczby na znaczku, gdy liczba nieprzeczytanych wiadomości jest większa niż 999", + "description": "" + }, + "options_misc_15": { + "message": "Otwórz stronę FAQ (Często zadawane pytania) po zaktualizowaniu", + "description": "" + }, + "options_plugins": { + "message": "Wtyczki:", + "description": "" + }, + "options_plugins_1": { + "message": "Etykiety Gmail oraz symbol gwiazdki (eksperymentalne)", + "description": "" + }, + "options_plugins_2": { + "message": "Ta wtyczka wyświetla symbol gwiazdki oraz etykiety tematu w panelu podglądu wiadomości (tylko tryb rozszerzony).", + "description": "" + }, + "options_px": { + "message": "px", + "description": "" + }, + "options_empty": { + "message": "nie określono", + "description": "" + }, + "options_button_test": { + "message": "Odtwórz", + "description": "" + }, + "options_button_reset": { + "message": "Przywróć ustawienia fabryczne", + "description": "" + }, + "popup_settings": { + "message": "Ustawienia", + "description": "" + }, + "popup_of": { + "message": "z", + "description": "" + }, + "popup_wait": { + "message": "Czekaj...", + "description": "" + }, + "popup_date_format": { + "message": "%dd %mm %yy", + "description": "" + }, + "popup_no_subject": { + "message": "(brak tematu)", + "description": "" + }, + "popup_open_settings": { + "message": "Otwórz ustawienia", + "description": "" + }, + "popup_open_inbox": { + "message": "Otwórz skrzynkę", + "description": "" + }, + "popup_archive": { + "message": "Archiwizuj", + "description": "" + }, + "popup_spam": { + "message": "Zgłoś spam", + "description": "" + }, + "popup_trash": { + "message": "Usuń", + "description": "" + }, + "popup_refresh": { + "message": "Odśwież", + "description": "" + }, + "popup_read": { + "message": "Przeczytane", + "description": "" + }, + "popup_read_all": { + "message": "Wszystkie przeczytane", + "description": "" + }, + "popup_msg_1": { + "message": "przed chwilą", + "description": "" + }, + "popup_msg_2": { + "message": "minutę temu", + "description": "" + }, + "popup_msg_3_format": { + "message": "%d minut(y) temu", + "description": "" + }, + "popup_msg_4": { + "message": "godzinę temu", + "description": "" + }, + "popup_msg_5": { + "message": "godzin(y) temu", + "description": "" + }, + "popup_msg_6": { + "message": "wczoraj", + "description": "" + }, + "popup_msg_7_format": { + "message": "%d dni temu", + "description": "" + }, + "popup_msg_8_format": { + "message": "%d tygodni(e) temu", + "description": "" + }, + "popup_msg_9_format": { + "message": "miesięcy temu: %d", + "description": "" + }, + "popup_msg_10": { + "message": "stycznia", + "description": "" + }, + "popup_msg_11": { + "message": "lutego", + "description": "" + }, + "popup_msg_12": { + "message": "marca", + "description": "" + }, + "popup_msg_13": { + "message": "kwietnia", + "description": "" + }, + "popup_msg_14": { + "message": "maja", + "description": "" + }, + "popup_msg_15": { + "message": "czerwca", + "description": "" + }, + "popup_msg_16": { + "message": "lipca", + "description": "" + }, + "popup_msg_17": { + "message": "sierpnia", + "description": "" + }, + "popup_msg_18": { + "message": "września", + "description": "" + }, + "popup_msg_19": { + "message": "października", + "description": "" + }, + "popup_msg_20": { + "message": "listopada", + "description": "" + }, + "popup_msg_21": { + "message": "grudnia", + "description": "" + }, + "settings_open_title": { + "message": "Otwórz stronę opcji (ustawień)", + "description": "" + }, + "settings_open_label": { + "message": "Otwórz opcje", + "description": "" + }, + "gmail": { + "message": "Powiadomienia Gmail™", + "description": "" + } +} \ No newline at end of file diff --git a/v3.classic/_locales/ru/messages.json b/v3.classic/_locales/ru/messages.json new file mode 100644 index 00000000..0adcb5f2 --- /dev/null +++ b/v3.classic/_locales/ru/messages.json @@ -0,0 +1,762 @@ +{ + "toolbar_label": { + "message": "Оповещения для Gmail™", + "description": "" + }, + "tooltip_1": { + "message": "Левый клик: Открыть вкладку Gmail или окно предварительного просмотра", + "description": "" + }, + "tooltip_2": { + "message": "Средний клик (или Ctrl+левый клик): Обновить все аккаунты", + "description": "" + }, + "tooltip_3": { + "message": "Правый клик: Меню дополнения", + "description": "" + }, + "description": { + "message": "Оповещение для нескольких аккаунтов Google Mail (Gmail)", + "description": "" + }, + "log_in_to_your_account": { + "message": "Войдите, пожалуйста, в Ваш аккаунт Gmail", + "description": "" + }, + "msg_1": { + "message": "Вкладка уже открыта. Нажмите на кнопку на панели инструментов, чтобы открыть Gmail в новой вкладке или перейти на уже открытую вкладку Gmail.", + "description": "" + }, + "msg_2": { + "message": "Ссылка скопирована в буфер обмена.", + "description": "" + }, + "msg_3": { + "message": "Выделенный текст скопирован в буфет обмена.", + "description": "" + }, + "msg_4": { + "message": "Замечание: Чтобы оповещение работало правильно, вы должны быть залогинены в свой аккаунт Google.", + "description": "" + }, + "msg_5": { + "message": "Выберите звуковой файл", + "description": "" + }, + "label_1": { + "message": "Обновить", + "description": "" + }, + "label_2": { + "message": "Настройки", + "description": "" + }, + "label_3": { + "message": "Отключить все оповещения...", + "description": "" + }, + "label_4": { + "message": "на 5 минут", + "description": "" + }, + "label_5": { + "message": "на 15 минут", + "description": "" + }, + "label_6": { + "message": "на 30 минут", + "description": "" + }, + "label_7": { + "message": "на 1 час", + "description": "" + }, + "label_8": { + "message": "на 2 часа", + "description": "" + }, + "label_9": { + "message": "на 5 часов", + "description": "" + }, + "label_13": { + "message": "на Х минут", + "description": "" + }, + "label_10": { + "message": "Включить уведомления (текущая сессия)", + "description": "" + }, + "label_11": { + "message": "Создать сообщение", + "description": "" + }, + "label_12": { + "message": "Открыть FAQ", + "description": "" + }, + "label_14": { + "message": "Авторизованные аккаунты", + "description": "" + }, + "unknown": { + "message": "не определено", + "description": "" + }, + "and": { + "message": "и", + "description": "" + }, + "log_into_your_account": { + "message": "Пожалуйста, войдите в свой аккаунт", + "description": "" + }, + "notification": { + "message": "От: [author_email][break]Тема: [title][break]Сводка: [summary]", + "description": "" + }, + "options_title": { + "message": "Настройки", + "description": "" + }, + "options_inshort": { + "message": "Оповещение для нескольких аккаунтов Google Mail (Gmail).", + "description": "" + }, + "options_donation": { + "message": "Поддержка разработки", + "description": "" + }, + "options_timings": { + "message": "Задержки:", + "description": "" + }, + "options_timings_l1": { + "message": "Проверять почту каждые (в секундах):", + "description": "" + }, + "options_timings_l2": { + "message": "Минимальный период - 10 сек.", + "description": "" + }, + "options_timings_l3": { + "message": "Напоминать о непрочитанных сообщениях каждые (в минутах):", + "description": "" + }, + "options_timings_l4": { + "message": "Установите ноль для отключения напоминаний.", + "description": "" + }, + "options_timings_l5": { + "message": "Минимальный период - 5 мин.", + "description": "" + }, + "options_timings_l6": { + "message": "Ненулевое значение включает всплывающие уведомления и звуковое оповещение (как при получении нового сообщения).", + "description": "" + }, + "options_timings_l7": { + "message": "Не проверять почту сразу после запуска в течение (в секундах):", + "description": "" + }, + "options_timings_l8": { + "message": "При установке нуля автоматическая проверка почты начнется только после первого ручного обновления (Не доступно в Safari).", + "description": "" + }, + "options_gmail": { + "message": "Аккаунты Gmail:", + "description": "" + }, + "options_gmail_1": { + "message": "Основной аккаунт (/mail/u/0/)", + "description": "" + }, + "options_gmail_2": { + "message": "Разделяйте ярлыки \",\" (Запятой).", + "description": "" + }, + "options_gmail_3": { + "message": "Второй аккаунт (/mail/u/1/)", + "description": "" + }, + "options_gmail_4": { + "message": "Третий аккаунт (/mail/u/2/)", + "description": "" + }, + "options_gmail_5": { + "message": "Четвертый аккаунт (/mail/u/3/)", + "description": "" + }, + "options_gmail_6": { + "message": "Пятый аккаунт (/mail/u/4/)", + "description": "" + }, + "options_gmail_7": { + "message": "Шестой аккаунт (/mail/u/5/)", + "description": "" + }, + "options_gmail_8": { + "message": "Отмечать сообщения как прочитанные при архивации", + "description": "" + }, + "options_gmail_15": { + "message": "Популярные ярлыки:", + "description": "" + }, + "options_gmail_10": { + "message": "Получать оповещения для следующих аккаунтов и ярлыков:", + "description": "" + }, + "options_gmail_11": { + "message": "Свои каналы:", + "description": "" + }, + "options_gmail_12": { + "message": "Разделяйте каналы \",\" (Запятой). Пример канала: https://mail.google.com/mail/u/0/feed/atom/inbox", + "description": "" + }, + "options_gmail_13": { + "message": "Примечание: максимальное количество всех ярлыков, кроме «входящие», составляет 20 (каналы Google содержат только 20 новых записей)", + "description": "" + }, + "options_gmail_14": { + "message": "Примечание: чтобы \"Оповещения для Gmail\" проверял более 5 учетных записей, добавьте URL-адреса фидов в поле «Пользовательские каналы» («Custom feeds»). Например, чтобы проверять 6 и 7 учетные записи, добавьте: https://mail.google.com/mail/u/6/feed/atom/inbox, https://mail.google.com/mail/u/7/feed/atom/inbox", + "description": "" + }, + "options_notifications": { + "message": "Всплывающие уведомления:", + "description": "" + }, + "options_notifications_1": { + "message": "Показывать всплывающие уведомления для новых сообщений", + "description": "" + }, + "options_notifications_2": { + "message": "Время показа всплывающих уведомлений (в секундах):", + "description": "" + }, + "options_notifications_3": { + "message": "Эта функция может не работать в Вашей ОС.", + "description": "" + }, + "options_notifications_4": { + "message": "Формат уведомления", + "description": "" + }, + "options_notifications_5": { + "message": "Доступные переменные:", + "description": "" + }, + "options_notifications_6": { + "message": "Обрезать текст уведомления длиннее, чем", + "description": "" + }, + "options_notifications_7": { + "message": "символов для полей [title] и [summary].", + "description": "" + }, + "options_notifications_8": { + "message": "Чтобы избежать обрезания сообщений, используйте здесь большие значения.", + "description": "" + }, + "options_notifications_9": { + "message": "Проигрывать звуковое оповещение при получении новых сообщений", + "description": "" + }, + "options_notifications_10": { + "message": "Замечание для пользователей Mac. Начиная с Firefox 28.0, все всплывающие уведомления обрабатываются Mac Notification Center, что приводит к двойному звуковому оповещению. Вам следует отключить это звуковое оповещение или звуковое оповещение от Notification Center.", + "description": "" + }, + "options_notifications_11": { + "message": "Показывать \"Уведомления панели задач Windows\" или \"Уведомления в док-панели Mac OS\"", + "description": "" + }, + "options_notifications_12": { + "message": "Оповещения на панели задач для Linux OS пока не поддерживаются.", + "description": "" + }, + "options_notifications_13": { + "message": "При клике на значок в трее открывать окно предварительного просмотра (только для Windows, beta)", + "description": "" + }, + "options_notifications_14": { + "message": "Эта экспериментальная функция и может вызвать нестабильность в работе Firefox. [Требуется перезапуск].", + "description": "" + }, + "options_notifications_15": { + "message": "Звук оповещений по умолчанию", + "description": "" + }, + "options_notifications_16": { + "message": "По умолчанию", + "description": "" + }, + "options_notifications_17": { + "message": "Оповещения из Checker Plus", + "description": "" + }, + "options_notifications_18": { + "message": "Динь из Checker Plus", + "description": "" + }, + "options_notifications_19": { + "message": "Оповещение о новом сообщении из Windows", + "description": "" + }, + "options_notifications_20": { + "message": "Пользовательский звук", + "description": "" + }, + "options_notifications_21": { + "message": "Пользовательский звук:", + "description": "" + }, + "options_notifications_22": { + "message": "Если ваш браузер не воспроизводит звук оповещения, попробуйте конвертировать файл в формат WAV с помощью онлайн инструментов.", + "description": "" + }, + "options_notifications_35": { + "message": "Для выбора нового пользовательского звука сначала выберите встроенный звук, а затем измените опцию на пользовательский звук", + "description": "" + }, + "options_notifications_23": { + "message": "Громкость звукового оповещения:", + "description": "" + }, + "options_notifications_24": { + "message": "Громкость - число от 0 до 100, где 100 соответствует максимальной громкости.", + "description": "" + }, + "options_notifications_25": { + "message": "В Safari обычно встроенные звуковые оповещения воспроизводятся не правильно, в этом случае используйте пользовательские звуковые файлы для оповещения.", + "description": "" + }, + "options_notifications_26": { + "message": "Всегда показывать значок уведомления в трее (Только Windows)", + "description": "" + }, + "options_notifications_27": { + "message": "Значок в трее будет показан даже если нет не прочитанных сообщений.", + "description": "" + }, + "options_notifications_28": { + "message": "Отключить все уведомления на определенный период времени Х (в минутах)", + "description": "" + }, + "options_notifications_29": { + "message": "Эта настройка относится к меню кнопки на панели инструментов -> Отключить все уведомления -> на Х минут", + "description": "" + }, + "options_notifications_30": { + "message": "Объединять несколько параллельных уведомлений в одно", + "description": "" + }, + "options_notifications_31": { + "message": "Пользовательское звуковое оповещение", + "description": "" + }, + "options_notifications_32": { + "message": "имя или email содержит", + "description": "" + }, + "options_notifications_33": { + "message": "заголовок сообщения содержит", + "description": "" + }, + "options_notifications_34": { + "message": "краткая сводка сообщения содержит", + "description": "" + }, + "options_notifications_36": { + "message": "Попросить Gmail не перенаправлять на «inbox.google.com»", + "description": "" + }, + "options_notifications_37": { + "message": "Номер отображаемого знака", + "description": "" + }, + "options_notifications_38": { + "message": "Более быстрые действия (отметить как прочитанные, удалить, ...) (учитывать действия, которые необходимо производить при получении заголовков)", + "description": "" + }, + "options_notifications_40": { + "message": "Разрешить быстрые действия в окне уведомления (не более двух действий) (только в Chrome)", + "description": "" + }, + "options_notifications_41": { + "message": "Прочтено", + "description": "" + }, + "options_notifications_42": { + "message": "Архивировать", + "description": "" + }, + "options_notifications_43": { + "message": "Удалить", + "description": "" + }, + "options_tab": { + "message": "Открытие вкладки Gmail:", + "description": "" + }, + "options_tab_1": { + "message": "Отслеживать открытую вкладку Gmail только в активном окне браузера", + "description": "" + }, + "options_tab_2": { + "message": "Не производить поиск открытой вкладки с Gmail в других окнах браузера. Если Gmail не открыт во вкладке активного окна - открыть новую вкладку.", + "description": "" + }, + "options_tab_3": { + "message": "Открывать вкладку Gmail рядом с активной вкладкой", + "description": "" + }, + "options_tab_4": { + "message": "Открывать Gmail в активной вкладке", + "description": "" + }, + "options_tab_5": { + "message": "Открывать Gmail в фоновой вкладке", + "description": "" + }, + "options_tab_6": { + "message": "Открывать Gmail в новом окне", + "description": "" + }, + "options_tab_7": { + "message": "Использовать имеющуюся пустую вкладку вместо открытия новой, если активна функция \"Открывать во вкладке\"", + "description": "" + }, + "options_tab_8": { + "message": "Игнорировать открытые с Gmail вкладки", + "description": "" + }, + "options_tab_9": { + "message": "Если активировано, Gmail Notifier не проверяет наличие уже открытого окна Gmail и не переключает фокус на него.", + "description": "" + }, + "options_tab_10": { + "message": "Открывать письма в базовом HTML-режиме", + "description": "" + }, + "options_tab_11": { + "message": "Open the newest unread email instead of opening the INBOX folder", + "description": "" + }, + "options_toolbar": { + "message": "Окно предварительного просмотра:", + "description": "" + }, + "options_toolbar_1": { + "message": "Поведение кнопки на панели", + "description": "" + }, + "options_toolbar_2": { + "message": "Всегда открывать окно предварительного просмотра", + "description": "" + }, + "options_toolbar_3": { + "message": "Открывать Gmail только если авторизован один аккаунт", + "description": "" + }, + "options_toolbar_18": { + "message": "Открыть аккаунт Gmail (принудительно)", + "description": "" + }, + "options_toolbar_4": { + "message": "Режим окна предварительного просмотра", + "description": "" + }, + "options_toolbar_5": { + "message": "Показывать только сводку", + "description": "" + }, + "options_toolbar_6": { + "message": "Полный режим - показывать сообщение целиком", + "description": "" + }, + "options_toolbar_7": { + "message": "Ширина окна просмотра в полном режиме (в пискелях):", + "description": "" + }, + "options_toolbar_8": { + "message": "Минимальная ширина окна - 500px.", + "description": "" + }, + "options_toolbar_9": { + "message": "Высота окна просмотра в полном режиме (в пикселях):", + "description": "" + }, + "options_toolbar_10": { + "message": "Минимальная высота окна - 500px.", + "description": "" + }, + "options_toolbar_11": { + "message": "Включить горячие клавиши в окне предварительного просмотра", + "description": "" + }, + "options_toolbar_12": { + "message": "!: Сообщить о спаме, #: Удалить, e: Архивировать, Shift + i: Отметить как прочитанное.", + "description": "" + }, + "options_toolbar_13": { + "message": "Отображать сообщения в HTML-формате в полном режиме", + "description": "" + }, + "options_toolbar_14": { + "message": "Если Вы предпочитаете отображение в виде простого текста в полном режиме - снимите эту галку.", + "description": "" + }, + "options_toolbar_15": { + "message": "Клик средней кнопкой мыши по значку в панели инструментов", + "description": "" + }, + "options_toolbar_16": { + "message": "Обновить все аккаунты", + "description": "" + }, + "options_toolbar_17": { + "message": "Открыть основной аккаунт", + "description": "" + }, + "options_misc": { + "message": "Дополнительно:", + "description": "" + }, + "options_misc_1": { + "message": "Сортировать аккаунты по алфавиту", + "description": "" + }, + "options_misc_2": { + "message": "По умолчанию - сортировка по времени входа.", + "description": "" + }, + "options_misc_3": { + "message": "Цвет значка на панели инструментов", + "description": "" + }, + "options_misc_4": { + "message": "Серый для \"Нет непрочитанных\" и голубой для \"Отключен\"", + "description": "" + }, + "options_misc_5": { + "message": "Голубой для \"Нет непрочитанных\" и серый для \"Отключен\"", + "description": "" + }, + "options_misc_9": { + "message": "Красный для \"Нет непрочитанных\" и серый для \"Отключен\"", + "description": "" + }, + "options_misc_6": { + "message": "Показывать всплывающее уведомление о том, что Gmail уже открыт в активной вкладке", + "description": "" + }, + "options_misc_7": { + "message": "Показывать страницу приветствия при обновлении дополнения", + "description": "" + }, + "options_misc_8": { + "message": "Сбросить все настройки на начальные", + "description": "" + }, + "options_misc_10": { + "message": "Всплывающие уведомления и звуковое оповещение только для сообщений, полученных менее чем (в минутах):", + "description": "" + }, + "options_misc_11": { + "message": "Установив здесь нулевое значение, Вы не получите ни всплывающего уведомления, ни звукового оповещения; однако значок уведомления будет работать.", + "description": "" + }, + "options_misc_12": { + "message": "Не включать информацию об учетной записи в текст всплывающей подсказки ", + "description": "" + }, + "options_misc_13": { + "message": "По умолчанию в тексте всплывающей подсказки значка на панели инструментов показывается название учетной записи.", + "description": "" + }, + "options_misc_14": { + "message": "Не показывать точное количество непрочитанных сообщений на значке в панели инструментов, если оно превышает 999", + "description": "" + }, + "options_misc_15": { + "message": "Открыть Часто Задаваемые Вопросы при обновлениях", + "description": "" + }, + "options_plugins": { + "message": "Плагины:", + "description": "" + }, + "options_plugins_1": { + "message": "Ярлыки и помеченные Gmail (экспериментальные)", + "description": "" + }, + "options_plugins_2": { + "message": "Этот плагин отображает кнопку помеченные, а также цепочку ярлыков во всплывающем окне (только в расширенном режиме).", + "description": "" + }, + "options_px": { + "message": "px", + "description": "" + }, + "options_empty": { + "message": "не определен", + "description": "" + }, + "options_button_test": { + "message": "Играть", + "description": "" + }, + "options_button_reset": { + "message": "Сбросить настройки", + "description": "" + }, + "popup_settings": { + "message": "настройки", + "description": "" + }, + "popup_of": { + "message": "из", + "description": "" + }, + "popup_wait": { + "message": "Ожидайте...", + "description": "" + }, + "popup_date_format": { + "message": "%mm %dd, %yy", + "description": "" + }, + "popup_no_subject": { + "message": "(без темы)", + "description": "" + }, + "popup_open_settings": { + "message": "Открыть настройки", + "description": "" + }, + "popup_open_inbox": { + "message": "Открыть входящие", + "description": "" + }, + "popup_archive": { + "message": "Архивировать", + "description": "" + }, + "popup_spam": { + "message": "Спам", + "description": "" + }, + "popup_trash": { + "message": "Удалить", + "description": "" + }, + "popup_refresh": { + "message": "Обновить", + "description": "" + }, + "popup_read": { + "message": "Прочтено", + "description": "" + }, + "popup_read_all": { + "message": "Все прочтено", + "description": "" + }, + "popup_msg_1": { + "message": "только сейчас", + "description": "" + }, + "popup_msg_2": { + "message": "1 минуту назад", + "description": "" + }, + "popup_msg_3_format": { + "message": "%d минут назад", + "description": "" + }, + "popup_msg_4": { + "message": "1 час назад", + "description": "" + }, + "popup_msg_5": { + "message": "часов назад", + "description": "" + }, + "popup_msg_6": { + "message": "Вчера", + "description": "" + }, + "popup_msg_7_format": { + "message": "%d дней назад", + "description": "" + }, + "popup_msg_8_format": { + "message": "%d недель назад", + "description": "" + }, + "popup_msg_9_format": { + "message": "%d месяца(ев) назад", + "description": "" + }, + "popup_msg_10": { + "message": "Январь", + "description": "" + }, + "popup_msg_11": { + "message": "Февраль", + "description": "" + }, + "popup_msg_12": { + "message": "Март", + "description": "" + }, + "popup_msg_13": { + "message": "Апрель", + "description": "" + }, + "popup_msg_14": { + "message": "Май", + "description": "" + }, + "popup_msg_15": { + "message": "Июнь", + "description": "" + }, + "popup_msg_16": { + "message": "Июль", + "description": "" + }, + "popup_msg_17": { + "message": "Август", + "description": "" + }, + "popup_msg_18": { + "message": "Сентябрь", + "description": "" + }, + "popup_msg_19": { + "message": "Октябрь", + "description": "" + }, + "popup_msg_20": { + "message": "Ноябрь", + "description": "" + }, + "popup_msg_21": { + "message": "Декабрь", + "description": "" + }, + "settings_open_title": { + "message": "Открыть страницу настроек", + "description": "" + }, + "settings_open_label": { + "message": "Открыть настройки", + "description": "" + }, + "gmail": { + "message": "Оповещения для Gmail™", + "description": "" + } +} \ No newline at end of file diff --git a/v3.classic/_locales/sr/messages.json b/v3.classic/_locales/sr/messages.json new file mode 100644 index 00000000..6814218b --- /dev/null +++ b/v3.classic/_locales/sr/messages.json @@ -0,0 +1,762 @@ +{ + "toolbar_label": { + "message": "Обавештења за Gmail™", + "description": "" + }, + "tooltip_1": { + "message": "Леви клик: Отвори Gmail или панел прегледа поште", + "description": "" + }, + "tooltip_2": { + "message": "Средњи (или Ctrl+Леви) клик: Освежи све налоге", + "description": "" + }, + "tooltip_3": { + "message": "Десни клик: Избор налога", + "description": "" + }, + "description": { + "message": "Обавештења за више Google Mail (Gmail) налога", + "description": "" + }, + "log_in_to_your_account": { + "message": "Пријавите се својим Gmail налогом", + "description": "" + }, + "msg_1": { + "message": "Картица је већ отворена. Кликните на дугме на алатној траци да отворите Gmail у новој картици или да се пребаците на постојећу Gmail картицу.", + "description": "" + }, + "msg_2": { + "message": "Линк је копиран у клипборд.", + "description": "" + }, + "msg_3": { + "message": "Одабрани текст је копиран у клипборд.", + "description": "" + }, + "msg_4": { + "message": "Напомена: Да би обавештења радила исправно, морате бити пријављени на свој Google налог.", + "description": "" + }, + "msg_5": { + "message": "Изаберите датотеку звучног обавештења", + "description": "" + }, + "label_1": { + "message": "Освежи", + "description": "" + }, + "label_2": { + "message": "Подешавања", + "description": "" + }, + "label_3": { + "message": "Онемогући сва обавештења", + "description": "" + }, + "label_4": { + "message": "На 5 минута", + "description": "" + }, + "label_5": { + "message": "На 15 минута", + "description": "" + }, + "label_6": { + "message": "На 30 минута", + "description": "" + }, + "label_7": { + "message": "На 1 сат", + "description": "" + }, + "label_8": { + "message": "На 2 сата", + "description": "" + }, + "label_9": { + "message": "На 5 сати", + "description": "" + }, + "label_13": { + "message": "У прилагођеном временском периоду", + "description": "" + }, + "label_10": { + "message": "Омогући обавештења (сесија)", + "description": "" + }, + "label_11": { + "message": "Напиши нову поруку", + "description": "" + }, + "label_12": { + "message": "Отвори FAQ", + "description": "" + }, + "label_14": { + "message": "Пријављени налози", + "description": "" + }, + "unknown": { + "message": "непознат", + "description": "" + }, + "and": { + "message": "и", + "description": "" + }, + "log_into_your_account": { + "message": "Пријавите се својим Gmail налогом", + "description": "" + }, + "notification": { + "message": "Од: [author_email][break]Наслов: [title][break]Кратак преглед: [summary]", + "description": "" + }, + "options_title": { + "message": "Gmail™ Notifier - Опције", + "description": "" + }, + "options_inshort": { + "message": "Обавештења за више Google Mail (Gmail) налога.", + "description": "" + }, + "options_donation": { + "message": "Подржи развој", + "description": "" + }, + "options_timings": { + "message": "Подешавања времена", + "description": "" + }, + "options_timings_l1": { + "message": "Провери нову пошту сваких (у секундама):", + "description": "" + }, + "options_timings_l2": { + "message": "Минимални период је 10 секунди.", + "description": "" + }, + "options_timings_l3": { + "message": "Подсети на сву непрочитану пошту сваких (у минутима):", + "description": "" + }, + "options_timings_l4": { + "message": "Постави вредност на нула за искључивање подсетника.", + "description": "" + }, + "options_timings_l5": { + "message": "Минимални период је 5 минута.", + "description": "" + }, + "options_timings_l6": { + "message": "Све вредности осим нуле покрећу десктоп обавештење и звучни сигнал (као када пристигне нова пошта) у задатим временским периодима ако имате непрочитану пошту.", + "description": "" + }, + "options_timings_l7": { + "message": "Не проверавај нову пошту при покретању у року од (у секундама):", + "description": "" + }, + "options_timings_l8": { + "message": "Постави вредност на нула за непроверавање поште до првог ручног ажурирања [није доступно у Safari прегледачу].", + "description": "" + }, + "options_gmail": { + "message": "Gmail:", + "description": "" + }, + "options_gmail_1": { + "message": "Основни налог (/mail/u/0/)", + "description": "" + }, + "options_gmail_2": { + "message": "Одвојити ознаке \",\" (зарезом).", + "description": "" + }, + "options_gmail_3": { + "message": "Други налог (/mail/u/1/)", + "description": "" + }, + "options_gmail_4": { + "message": "Трећи налог (/mail/u/2/)", + "description": "" + }, + "options_gmail_5": { + "message": "Четврти налог (/mail/u/3/)", + "description": "" + }, + "options_gmail_6": { + "message": "Пети налог (/mail/u/4/)", + "description": "" + }, + "options_gmail_7": { + "message": "Шести налог (/mail/u/5/)", + "description": "" + }, + "options_gmail_8": { + "message": "Означи поруке као прочитане при архивирању", + "description": "" + }, + "options_gmail_15": { + "message": "Неке популарне ознаке:", + "description": "" + }, + "options_gmail_10": { + "message": "Примај обавештења за следеће ознаке и налоге:", + "description": "" + }, + "options_gmail_11": { + "message": "Прилагођени канали:", + "description": "" + }, + "options_gmail_12": { + "message": "Одвојити канале \",\" (зарезом). Пример канала: https://mail.google.com/mail/u/0/feed/atom/inbox", + "description": "" + }, + "options_gmail_13": { + "message": "Напомена: максимални број за све ознаке осим за \"inbox\" је 20 (Google канали подржавају само 20 најновијих ставки)", + "description": "" + }, + "options_gmail_14": { + "message": "Напомена: да би Notifier пратио више од 5 налога, додајте адресе канала у поље \"Прилагођени канали\". На пример, за праћење 6. и 7. налога додајте: https://mail.google.com/mail/u/6/feed/atom/inbox, https://mail.google.com/mail/u/7/feed/atom/inbox", + "description": "" + }, + "options_notifications": { + "message": "Обавештења:", + "description": "" + }, + "options_notifications_1": { + "message": "Прикажи десктоп обавештења о новој пошти", + "description": "" + }, + "options_notifications_2": { + "message": "Прикажи десктоп обавештења у трајању од (у секундама):", + "description": "" + }, + "options_notifications_3": { + "message": "Ова опција можда неће радити на Вашем оперативном систему.", + "description": "" + }, + "options_notifications_4": { + "message": "Формат обавештења", + "description": "" + }, + "options_notifications_5": { + "message": "Доступне варијабле:", + "description": "" + }, + "options_notifications_6": { + "message": "Скрати обавештења дужа од", + "description": "" + }, + "options_notifications_7": { + "message": "карактера у пољима [title] и [summary].", + "description": "" + }, + "options_notifications_8": { + "message": "Да би се избегло сечење поруке, употребите велики број.", + "description": "" + }, + "options_notifications_9": { + "message": "Пусти звучно обавештење о новој пошти", + "description": "" + }, + "options_notifications_10": { + "message": "Савет за кориснике Mac система. Од Firefox 28.0 верзије, свим десктоп обавештењима управља Mac Notification Center који емитује додатни звучни сигнал. Потребно је да одчекирате ово звучно обавештење или оно које је генерисано од стране Notification Center Mac система.", + "description": "" + }, + "options_notifications_11": { + "message": "Прикажи \"Windows обавештења на траци задатака\" или \"Mac OS Dock обавештења\"", + "description": "" + }, + "options_notifications_12": { + "message": "Обавештења на траци задатака нису подржана у Linux систему.", + "description": "" + }, + "options_notifications_13": { + "message": "Отвори панел прегледа поште када кликнем на иконицу обавештења на траци задатака (само Windows, бета)", + "description": "" + }, + "options_notifications_14": { + "message": "Ово је експериментална функција и може изазвати нестабилност Firefox прегледача. [Неопходно је поновно покретање].", + "description": "" + }, + "options_notifications_15": { + "message": "Подразумевано звучно обавештење је", + "description": "" + }, + "options_notifications_16": { + "message": "Gmail Notifier подразумевани звук", + "description": "" + }, + "options_notifications_17": { + "message": "Checker Plus bell", + "description": "" + }, + "options_notifications_18": { + "message": "Checker Plus ding", + "description": "" + }, + "options_notifications_19": { + "message": "Windows email звук", + "description": "" + }, + "options_notifications_20": { + "message": "Кориснички дефинисани звук", + "description": "" + }, + "options_notifications_21": { + "message": "Кориснички дефинисани звук обавештења је", + "description": "" + }, + "options_notifications_22": { + "message": "Ако ваш прегледач не емитује прилагођени звук обавештења, покушајте да га конвертујете у WAV формат користећи алат за конвертовање на мрежи.", + "description": "" + }, + "options_notifications_35": { + "message": "За избор новог прилагођеног звука, изаберите прво уграђени звук а затим промените опцију на прилагођени звук", + "description": "" + }, + "options_notifications_23": { + "message": "Јачина звука обавештења", + "description": "" + }, + "options_notifications_24": { + "message": "Јачина је број од 0 до 100 при чему је 100 најгласније (подразумевано).", + "description": "" + }, + "options_notifications_25": { + "message": "У Ѕafari прегледачу највероватније се подразумевани звук обавештења неће емитовати исправно, у том случају употребите прилагођени звук за обавештење.", + "description": "" + }, + "options_notifications_26": { + "message": "Увек прикажи иконицу обавештења у системској траци (само Windows)", + "description": "" + }, + "options_notifications_27": { + "message": "Иконица обавештења у системској траци ће бити приказана чак и ако нема непрочитаних порука.", + "description": "" + }, + "options_notifications_28": { + "message": "Онемогући сва обавештења у прилагођеном временском периоду (у минутима)", + "description": "" + }, + "options_notifications_29": { + "message": "Ова опција се односи на мени на десном клику на дугмету на алатној траци -> онемогући сва обавештења -> прилагођени временски период", + "description": "" + }, + "options_notifications_30": { + "message": "Споји сва истовремена десктоп обавештења у једно обавештење", + "description": "" + }, + "options_notifications_31": { + "message": "Прилагођени звук обавештења", + "description": "" + }, + "options_notifications_32": { + "message": "име или е-пошта садржи", + "description": "" + }, + "options_notifications_33": { + "message": "наслов е-поште садржи", + "description": "" + }, + "options_notifications_34": { + "message": "кратак преглед е-поште садржи", + "description": "" + }, + "options_notifications_36": { + "message": "Захтевај да Gmail спречи преусмеравање на 'inbox.google.com'", + "description": "" + }, + "options_notifications_37": { + "message": "Прикажи бројчану ознаку", + "description": "" + }, + "options_notifications_38": { + "message": "Брже радње (означи као прочитано, избриши...) (Размотрите радње које треба решити када се примају заглавља", + "description": "" + }, + "options_notifications_40": { + "message": "Дозволи брзе радње из поља обавештења (највише две радње) (само Chrome)", + "description": "" + }, + "options_notifications_41": { + "message": "Означи као прочитано", + "description": "" + }, + "options_notifications_42": { + "message": "Архивирај", + "description": "" + }, + "options_notifications_43": { + "message": "Избриши", + "description": "" + }, + "options_tab": { + "message": "Отварање картица:", + "description": "" + }, + "options_tab_1": { + "message": "Потражи отворени Gmail налог само у активном прозору", + "description": "" + }, + "options_tab_2": { + "message": "Не тражи у другим прозорима прегледача отворене Gmail налоге. Ако Gmail није отворен у активном прозору, отвориће се у новој картици.", + "description": "" + }, + "options_tab_3": { + "message": "Отвори нови Gmail налог поред активне картице", + "description": "" + }, + "options_tab_4": { + "message": "Отвори Gmail налог у активној картици", + "description": "" + }, + "options_tab_5": { + "message": "Отвори Gmail налог у позадинској картици", + "description": "" + }, + "options_tab_6": { + "message": "Отвори Gmail налог у новом прозору", + "description": "" + }, + "options_tab_7": { + "message": "Увек употреби празну картицу уместо отварања нове картице (када је отварање у картици активирано)", + "description": "" + }, + "options_tab_8": { + "message": "Занемари отворене Gmail картице", + "description": "" + }, + "options_tab_9": { + "message": "Када је одчекирано, Gmail Notifier проверава у активном или свим отвореним прозорима да ли има отворених Gmail инстанци и пребацује на картицу када је отварање картице захтевано.", + "description": "" + }, + "options_tab_10": { + "message": "Отвори пошту у основном HTML режиму", + "description": "" + }, + "options_tab_11": { + "message": "Open the newest unread email instead of opening the INBOX folder", + "description": "" + }, + "options_toolbar": { + "message": "Алатна трака:", + "description": "" + }, + "options_toolbar_1": { + "message": "Понашање дугмета на алатној картици", + "description": "" + }, + "options_toolbar_2": { + "message": "Увек отвори панел прегледа поште", + "description": "" + }, + "options_toolbar_3": { + "message": "Отвори Gmail налог ако је само један налог пријављен", + "description": "" + }, + "options_toolbar_18": { + "message": "Отвори Gmail налог (принудно)", + "description": "" + }, + "options_toolbar_4": { + "message": "Режим приказа панела", + "description": "" + }, + "options_toolbar_5": { + "message": "Прикажи кратак преглед", + "description": "" + }, + "options_toolbar_6": { + "message": "Прикажи пун садржај", + "description": "" + }, + "options_toolbar_7": { + "message": "Ширина панела у режиму приказа пуног садржаја (у пикселима):", + "description": "" + }, + "options_toolbar_8": { + "message": "Минимална ширина је 500 пиксела.", + "description": "" + }, + "options_toolbar_9": { + "message": "Висина панела у режиму приказа пуног садржаја (у пикселима):", + "description": "" + }, + "options_toolbar_10": { + "message": "Минимална висина је 500 пиксела.", + "description": "" + }, + "options_toolbar_11": { + "message": "Омогући тастерске пречице у панелу", + "description": "" + }, + "options_toolbar_12": { + "message": "!: Пријави непожељну поруку, #: Отпад, e: Архивирај, Shift + i: Означи као прочитано.", + "description": "" + }, + "options_toolbar_13": { + "message": "Прикажи пошту као HTML у режиму приказа пуног садржаја", + "description": "" + }, + "options_toolbar_14": { + "message": "Одчекирајте ако више волите приказ само текста у режиму приказа пуног садржаја.", + "description": "" + }, + "options_toolbar_15": { + "message": "Средњи клик на дугме на алатној траци", + "description": "" + }, + "options_toolbar_16": { + "message": "Освежава све налоге", + "description": "" + }, + "options_toolbar_17": { + "message": "Отвара основни Gmail налог", + "description": "" + }, + "options_misc": { + "message": "Остало:", + "description": "" + }, + "options_misc_1": { + "message": "Поређај налоге по алфабету", + "description": "" + }, + "options_misc_2": { + "message": "Подразумевани редослед је по времену пријављивања.", + "description": "" + }, + "options_misc_3": { + "message": "Боја иконице на алатној траци", + "description": "" + }, + "options_misc_4": { + "message": "Сива боја за \"Нема непрочитаних\" и плава за \"Неповезан\"", + "description": "" + }, + "options_misc_5": { + "message": "Плава боја за \"Нема непрочитаних\" и сива за \"Неповезан\"", + "description": "" + }, + "options_misc_9": { + "message": "Црвена боја за \"Нема непрочитаних\" и сива за \"Неповезан\"", + "description": "" + }, + "options_misc_6": { + "message": "Прикажи десктоп обавештење као упозорење да је Gmail већ отворен у активној картици", + "description": "" + }, + "options_misc_7": { + "message": "Прикажи страницу добродошлице при надоградњи", + "description": "" + }, + "options_misc_8": { + "message": "Врати сва подешавања на фабричка", + "description": "" + }, + "options_misc_10": { + "message": "Покрени десктоп и звучна обавештења само за пошту пристиглу у последњих (у минутима): ", + "description": "" + }, + "options_misc_11": { + "message": "Постављајући ову вредност на нула, нећете примати ни десктоп ни звучна обавештења; ипак, обавештење у виду ознаке на иконици ће бити приказано.", + "description": "" + }, + "options_misc_12": { + "message": "Не обухватај детаље о пријављивању у опису алатке", + "description": "" + }, + "options_misc_13": { + "message": "Подразумевано, у опису алатке на дугмету на алатној траци се приказују информације о пријављивању. Одчекирањем ове опције, опис алатке остаје на подразумеваној вредности.", + "description": "" + }, + "options_misc_14": { + "message": "Не приказуј тачан број непрочитаних порука на иконици ако је већи од 999", + "description": "" + }, + "options_misc_15": { + "message": "Отвори најчешће постављана питања након ажурирања", + "description": "" + }, + "options_plugins": { + "message": "Додатне компоненте:", + "description": "" + }, + "options_plugins_1": { + "message": "Gmail ознаке и дугме звезда (експериментално)", + "description": "" + }, + "options_plugins_2": { + "message": "Ова додатна компонента приказује дугме звезда као и ознаке тема у искачућем прозору (само режим приказа пуног садржаја).", + "description": "" + }, + "options_px": { + "message": "px", + "description": "" + }, + "options_empty": { + "message": "недефинисано", + "description": "" + }, + "options_button_test": { + "message": "Репродукуј", + "description": "" + }, + "options_button_reset": { + "message": "Поништи подешавања", + "description": "" + }, + "popup_settings": { + "message": "подешавања", + "description": "" + }, + "popup_of": { + "message": "од", + "description": "" + }, + "popup_wait": { + "message": "Сачекај...", + "description": "" + }, + "popup_date_format": { + "message": "%dd. %mm %yy.", + "description": "" + }, + "popup_no_subject": { + "message": "(без наслова)", + "description": "" + }, + "popup_open_settings": { + "message": "Отвори подешавања", + "description": "" + }, + "popup_open_inbox": { + "message": "Отвори пријемно сандуче", + "description": "" + }, + "popup_archive": { + "message": "Архивирај", + "description": "" + }, + "popup_spam": { + "message": "Пријави непожељну поруку", + "description": "" + }, + "popup_trash": { + "message": "Избриши", + "description": "" + }, + "popup_refresh": { + "message": "Освежи", + "description": "" + }, + "popup_read": { + "message": "Озн. као прочитано", + "description": "" + }, + "popup_read_all": { + "message": "Означи све као прочитано", + "description": "" + }, + "popup_msg_1": { + "message": "управо сада", + "description": "" + }, + "popup_msg_2": { + "message": "пре 1 минут", + "description": "" + }, + "popup_msg_3_format": { + "message": "пре %d минута", + "description": "" + }, + "popup_msg_4": { + "message": "пре 1 сат", + "description": "" + }, + "popup_msg_5": { + "message": "сата/и раније", + "description": "" + }, + "popup_msg_6": { + "message": "јуче", + "description": "" + }, + "popup_msg_7_format": { + "message": "пре %d дана", + "description": "" + }, + "popup_msg_8_format": { + "message": "пре %d седмице/а", + "description": "" + }, + "popup_msg_9_format": { + "message": "пре %d месеца", + "description": "" + }, + "popup_msg_10": { + "message": "јануар", + "description": "" + }, + "popup_msg_11": { + "message": "фебруар", + "description": "" + }, + "popup_msg_12": { + "message": "март", + "description": "" + }, + "popup_msg_13": { + "message": "април", + "description": "" + }, + "popup_msg_14": { + "message": "мај", + "description": "" + }, + "popup_msg_15": { + "message": "јун", + "description": "" + }, + "popup_msg_16": { + "message": "јул", + "description": "" + }, + "popup_msg_17": { + "message": "август", + "description": "" + }, + "popup_msg_18": { + "message": "септембар", + "description": "" + }, + "popup_msg_19": { + "message": "октобар", + "description": "" + }, + "popup_msg_20": { + "message": "новембар", + "description": "" + }, + "popup_msg_21": { + "message": "децембар", + "description": "" + }, + "settings_open_title": { + "message": "Отвори страницу опција (подешавања)", + "description": "" + }, + "settings_open_label": { + "message": "Отвори опције", + "description": "" + }, + "gmail": { + "message": "Обавештења за Gmail™", + "description": "" + } +} \ No newline at end of file diff --git a/v3.classic/_locales/tr/messages.json b/v3.classic/_locales/tr/messages.json new file mode 100644 index 00000000..47cb5884 --- /dev/null +++ b/v3.classic/_locales/tr/messages.json @@ -0,0 +1,758 @@ +{ + "toolbar_label": { + "message": "Notifier for Gmail™", + "description": "" + }, + "tooltip_1": { + "message": "Left click: Open Gmail or mail preview panel", + "description": "" + }, + "tooltip_2": { + "message": "Middle (or Ctrl+Left) click: Refresh all accounts", + "description": "" + }, + "tooltip_3": { + "message": "Right click: Account selections", + "description": "" + }, + "description": { + "message": "Multiple label and account notifier for Google Mail (Gmail)", + "description": "" + }, + "log_in_to_your_account": { + "message": "Lütfen Gmail hesabınıza giriş yapın", + "description": "" + }, + "msg_1": { + "message": "Sekme zaten açık. Gmail'i yeni bir sekmede açmak veya mevcut bir Gmail sekmesine geçmek için araç çubuğu düğmesine tıklayın.", + "description": "" + }, + "msg_2": { + "message": "Bağlantı panoya kopyalandı.", + "description": "" + }, + "msg_3": { + "message": "Seçilen metin panoya kopyalandı.", + "description": "" + }, + "msg_4": { + "message": "Note: For the notifier to work properly, you need to be logged-in into your Google account.", + "description": "" + }, + "msg_5": { + "message": "Bir ses dosyası seçin", + "description": "" + }, + "label_1": { + "message": "Yenile", + "description": "" + }, + "label_2": { + "message": "Ayarlar", + "description": "" + }, + "label_3": { + "message": "Tüm bildirimleri devre dışı bırak", + "description": "" + }, + "label_4": { + "message": "5 dakika", + "description": "" + }, + "label_5": { + "message": "15 dakika", + "description": "" + }, + "label_6": { + "message": "30 dakika", + "description": "" + }, + "label_7": { + "message": "1 saat", + "description": "" + }, + "label_8": { + "message": "2 saat", + "description": "" + }, + "label_9": { + "message": "5 saat", + "description": "" + }, + "label_13": { + "message": "Özel bir süre için", + "description": "" + }, + "label_10": { + "message": "Bildirimleri etkinleştir", + "description": "" + }, + "label_11": { + "message": "Bir e-posta oluştur", + "description": "" + }, + "label_12": { + "message": "SSS'i aç", + "description": "" + }, + "label_14": { + "message": "Giriş yapılan hesaplar", + "description": "" + }, + "unknown": { + "message": "bilinmeyen", + "description": "" + }, + "and": { + "message": "ve", + "description": "" + }, + "log_into_your_account": { + "message": "Please log into your account", + "description": "" + }, + "notification": { + "message": "From: [author_email][break]Title: [title][break]Summary: [summary]", + "description": "" + }, + "options_title": { + "message": "Seçenekler - Gmail™ Notifier", + "description": "" + }, + "options_inshort": { + "message": "Multiple label and account notifier for Google Mail (Gmail).", + "description": "" + }, + "options_donation": { + "message": "Geliştirmeye Destek ol", + "description": "" + }, + "options_timings": { + "message": "Zamanlama:", + "description": "" + }, + "options_timings_l1": { + "message": "Şu kadar saniyede bir yeni e-postaları kontrol et:", + "description": "" + }, + "options_timings_l2": { + "message": "En az süre 10 saniyedir.", + "description": "" + }, + "options_timings_l3": { + "message": "Şu kadar dakikada bir okunmamış e-postaları hatırlat:", + "description": "" + }, + "options_timings_l4": { + "message": "Hiçbir zaman hatırlatılmaması için değeri 0 (sıfır) olarak ayarlayın.", + "description": "" + }, + "options_timings_l5": { + "message": "En az süre 5 dakikadır.", + "description": "" + }, + "options_timings_l6": { + "message": "Değerler 0 (sıfır) değilse okunmamış e-postalar hem masaüstü bildirimi hem de uyarı sesiyle size bildirilir.", + "description": "" + }, + "options_timings_l7": { + "message": "Şu saniyeliğine başlangıçta yeni e-postaları kontrol etme:", + "description": "" + }, + "options_timings_l8": { + "message": "İlk elle yenilemeye kadar e-posta kontrolünü kapamak için değeri 0 (sıfır) olarak ayarlayın [Safari için geçerli değildir].", + "description": "" + }, + "options_gmail": { + "message": "Gmail:", + "description": "" + }, + "options_gmail_1": { + "message": "Birinci (asıl) hesap (/mail/u/0/)", + "description": "" + }, + "options_gmail_2": { + "message": "Etiketleri \",\" (virgül) ile ayırın.", + "description": "" + }, + "options_gmail_3": { + "message": "İkinci hesap (/mail/u/1/)", + "description": "" + }, + "options_gmail_4": { + "message": "Üçüncü hesap (/mail/u/2/)", + "description": "" + }, + "options_gmail_5": { + "message": "Dördüncü hesap (/mail/u/3/)", + "description": "" + }, + "options_gmail_6": { + "message": "Beşinci hesap (/mail/u/4/)", + "description": "" + }, + "options_gmail_7": { + "message": "Altıncı hesap (/mail/u/5/)", + "description": "" + }, + "options_gmail_8": { + "message": "İletiyi arşivlerken okunmuş olarak işaretle", + "description": "" + }, + "options_gmail_15": { + "message": "Some popular labels:", + "description": "" + }, + "options_gmail_10": { + "message": "Aşağıdaki etiketler ve hesaplar için bildirim alın:", + "description": "" + }, + "options_gmail_11": { + "message": "Custom feeds:", + "description": "" + }, + "options_gmail_12": { + "message": "Separate feeds by \",\" (Comma). Sample feed: https://mail.google.com/mail/u/0/feed/atom/inbox", + "description": "" + }, + "options_gmail_13": { + "message": "Note: maximum number for all labels except \"inbox\" is 20 (Google feeds only supply the 20 newest entries)", + "description": "" + }, + "options_gmail_14": { + "message": "Note: for the Notifier to listen for more than 5 accounts, add feeds URLs to the \"Custom feeds\" field. For instance to listen to the 6 and 7th accounts add: https://mail.google.com/mail/u/6/feed/atom/inbox, https://mail.google.com/mail/u/7/feed/atom/inbox", + "description": "" + }, + "options_notifications": { + "message": "Bildirimler:", + "description": "" + }, + "options_notifications_1": { + "message": "Yeni e-postalar için masaüstü bildirimlerini aç", + "description": "" + }, + "options_notifications_2": { + "message": "Masaüstü bildirimlerini şu kadar saniye göster:", + "description": "" + }, + "options_notifications_3": { + "message": "Bu seçenek işletim sisteminize bağlı olarak çalışmayabilir.", + "description": "" + }, + "options_notifications_4": { + "message": "Bildirim şekli", + "description": "" + }, + "options_notifications_5": { + "message": "Mevcut değişkenler:", + "description": "" + }, + "options_notifications_6": { + "message": "Gelen e-posta yandaki sayı kadar karakterden fazla ise bildirim gösterme:", + "description": "" + }, + "options_notifications_7": { + "message": " ", + "description": "" + }, + "options_notifications_8": { + "message": "Elips şeklinde olmaması için burada büyük bir sayı kullanın veya varsayılan olarak bırakın.", + "description": "" + }, + "options_notifications_9": { + "message": "Yeni e-postalar için uyarı sesi çal", + "description": "" + }, + "options_notifications_10": { + "message": "Mac kullanıcıları için not: Firefox 28.0 sürümünde, tüm masaüstü bildirimleri, ekstra bir uyarıya neden olan Mac Bildirim Merkezi tarafından kontrol edilmektedir. Bu sesli bildirimin veya Bildirim Merkezi tarafından oluşturulan bildirimin tikini kaldırmanız gerekir.", + "description": "" + }, + "options_notifications_11": { + "message": "\"Windows görev çubuğu bildirimi\" veya \"Mac OS Dock bildirimi\" ni görüntüle", + "description": "" + }, + "options_notifications_12": { + "message": "Görev çubuğu bildirimleri şu anda Linux işletim sistemlerinde desteklenmemektedir.", + "description": "" + }, + "options_notifications_13": { + "message": "Görev çubuğu bildirim simgesini tıklattığınızda araç çubuğu panelini açın (Yalnızca Windows, Beta)", + "description": "" + }, + "options_notifications_14": { + "message": "Bu özellik oldukça deneyseldir ve Firefox tarayıcınızı kararsız hale getirebilir. [Yeniden başlatma gerektirir].", + "description": "" + }, + "options_notifications_15": { + "message": "Varsayılan sesli bildirim", + "description": "" + }, + "options_notifications_16": { + "message": "Gmail Bildirici varsayılan sesi", + "description": "" + }, + "options_notifications_17": { + "message": "Checker Plus bildirim sesi", + "description": "" + }, + "options_notifications_18": { + "message": "Checker Plus tınlama sesi", + "description": "" + }, + "options_notifications_19": { + "message": "Windows e-posta sesi", + "description": "" + }, + "options_notifications_20": { + "message": "Özel bildirim sesi seçin", + "description": "" + }, + "options_notifications_21": { + "message": "Özel bildirim sesiniz:", + "description": "" + }, + "options_notifications_22": { + "message": "Tarayıcınız özel bildirim sesini çalmıyorsa, çevrimiçi bir dönüştürme aracı kullanarak WAV formatına dönüştürmeyi deneyin.", + "description": "" + }, + "options_notifications_35": { + "message": "To select a new custom sound, select a built-in sound first and then change the option to custom sound", + "description": "" + }, + "options_notifications_23": { + "message": "Bildirim sesinin değeri", + "description": "" + }, + "options_notifications_24": { + "message": "Ses, 0 ile 100 arasında bir sayıdır; burada 100, en yüksek ses düzeyidir (varsayılan).", + "description": "" + }, + "options_notifications_25": { + "message": "Safari'de varsayılan sesli bildirimler düzgün şekilde oynatılmıyorsa, özel bir ses dosyası kullanın.", + "description": "" + }, + "options_notifications_26": { + "message": "Always show tray notification (Windows only)", + "description": "" + }, + "options_notifications_27": { + "message": "Tray notification will be shown even if there is no unread message.", + "description": "" + }, + "options_notifications_28": { + "message": "Disable all notifications for a custom time period (in minutes):", + "description": "" + }, + "options_notifications_29": { + "message": "This option is related to the right click menu on the toolbar button -> disable all notifications -> custom time period.", + "description": "" + }, + "options_notifications_30": { + "message": "Combine all concurrent desktop notifications into a single notification", + "description": "" + }, + "options_notifications_31": { + "message": "Özel bildirim sesi", + "description": "" + }, + "options_notifications_32": { + "message": "name or email contains", + "description": "" + }, + "options_notifications_33": { + "message": "email title contains", + "description": "" + }, + "options_notifications_34": { + "message": "email summary contains", + "description": "" + }, + "options_notifications_36": { + "message": "Ask Gmail to prevent 'inbox.google.com' redirection", + "description": "" + }, + "options_notifications_37": { + "message": "Display Badge number", + "description": "" + }, + "options_notifications_38": { + "message": "Faster actions (mark as read, delete, ...) (Consider actions to be resolved when headers are received)", + "description": "" + }, + "options_notifications_40": { + "message": "Allow quick actions from notification box (maximum two actions) (Chrome only)", + "description": "" + }, + "options_notifications_41": { + "message": "Mark as Read", + "description": "" + }, + "options_notifications_42": { + "message": "Archive", + "description": "" + }, + "options_notifications_43": { + "message": "Trash", + "description": "" + }, + "options_tab": { + "message": "Sekme Açılışı:", + "description": "" + }, + "options_tab_1": { + "message": "Sadece aktif pencerede açık bir Gmail hesabı arayın", + "description": "" + }, + "options_tab_2": { + "message": "Do not search other browser windows for open Gmail accounts. If Gmail is not open in the active window, open a new tab.", + "description": "" + }, + "options_tab_3": { + "message": "Open new Gmail account next to the active tab", + "description": "" + }, + "options_tab_4": { + "message": "Open Gmail account in the active tab", + "description": "" + }, + "options_tab_5": { + "message": "Open Gmail account in a background tab", + "description": "" + }, + "options_tab_6": { + "message": "Open Gmail account in a new window", + "description": "" + }, + "options_tab_7": { + "message": "Always use blank tabs instead of opening a new tab when open in tab is activated", + "description": "" + }, + "options_tab_8": { + "message": "Ignore opened Gmail tabs", + "description": "" + }, + "options_tab_9": { + "message": "When unchecked, Gmail Notifier checks either active window or all open windows for open instance of Gmail and switch to the tab when tab opening is requested.", + "description": "" + }, + "options_tab_10": { + "message": "Open emails in basic HTML mode", + "description": "" + }, + "options_toolbar": { + "message": "Araç Çubuğu:", + "description": "" + }, + "options_toolbar_1": { + "message": "Toolbar button behaviour", + "description": "" + }, + "options_toolbar_2": { + "message": "Always open email preview panel", + "description": "" + }, + "options_toolbar_3": { + "message": "Yalnızca bir hesap giriş yaptıysa, Gmail hesabını aç", + "description": "" + }, + "options_toolbar_18": { + "message": "Open Gmail account (forced)", + "description": "" + }, + "options_toolbar_4": { + "message": "Toolbar panel mode", + "description": "" + }, + "options_toolbar_5": { + "message": "Sadece özetini göster", + "description": "" + }, + "options_toolbar_6": { + "message": "Tam içeriği göster", + "description": "" + }, + "options_toolbar_7": { + "message": "Toolbar panel width in the full-content view mode is (in pixels):", + "description": "" + }, + "options_toolbar_8": { + "message": "Minimum width is 500px.", + "description": "" + }, + "options_toolbar_9": { + "message": "Toolbar panel height in the full-content view mode is (in pixels):", + "description": "" + }, + "options_toolbar_10": { + "message": "Minimum height is 500px.", + "description": "" + }, + "options_toolbar_11": { + "message": "Support keyboard shortcuts on the toolbar panel", + "description": "" + }, + "options_toolbar_12": { + "message": "!: Report as spam, #: Trash, e: Archive, Shift + i: Mark as read.", + "description": "" + }, + "options_toolbar_13": { + "message": "Render emails as HTML in full-content mode", + "description": "" + }, + "options_toolbar_14": { + "message": "If you prefer text-only rendering in the full-content mode, uncheck the box.", + "description": "" + }, + "options_toolbar_15": { + "message": "Middle-click on the toolbar button to", + "description": "" + }, + "options_toolbar_16": { + "message": "Tüm hesapları yenile", + "description": "" + }, + "options_toolbar_17": { + "message": "Open primary Gmail account", + "description": "" + }, + "options_misc": { + "message": "Diğer Ayarlar:", + "description": "" + }, + "options_misc_1": { + "message": "Sort accounts alphabetically", + "description": "" + }, + "options_misc_2": { + "message": "The default order type is logged-in order.", + "description": "" + }, + "options_misc_3": { + "message": "Toolbar color pattern is", + "description": "" + }, + "options_misc_4": { + "message": "Gray color for \"No Unread\" and blue color for \"Disconnected\"", + "description": "" + }, + "options_misc_5": { + "message": "Blue color for \"No Unread\" and gray color for \"Disconnected\"", + "description": "" + }, + "options_misc_9": { + "message": "Red color for \"No Unread\" and gray color for \"Disconnected\"", + "description": "" + }, + "options_misc_6": { + "message": "Show desktop notification to warn that Gmail is already opened in the active tab", + "description": "" + }, + "options_misc_7": { + "message": "Show welcome page on upgrade", + "description": "" + }, + "options_misc_8": { + "message": "Reset all settings back to factory", + "description": "" + }, + "options_misc_10": { + "message": "Only fire desktop and sound notifications when email has arrived in less than (in minutes): ", + "description": "" + }, + "options_misc_11": { + "message": "By setting this preference to zero, you will receive neither desktop nor sound notifications; however, you will still get badge notification.", + "description": "" + }, + "options_misc_12": { + "message": "Do not include login details in the tooltip text", + "description": "" + }, + "options_misc_13": { + "message": "By default, the notifier updates tooltip text of the toolbar button with login info. By unchecking this option, the tooltip text remains the default value.", + "description": "" + }, + "options_misc_14": { + "message": "Do not show the exact badge number when the number of unread emails is greater than 999", + "description": "" + }, + "options_misc_15": { + "message": "Her güncellemeden sonra SSS sayfasını aç", + "description": "" + }, + "options_plugins": { + "message": "Plug-ins:", + "description": "" + }, + "options_plugins_1": { + "message": "Gmail labels and star button (experimental)", + "description": "" + }, + "options_plugins_2": { + "message": "This plugin displays the star button as well as thread's labels in the popup (expanded mode only).", + "description": "" + }, + "options_px": { + "message": "px", + "description": "" + }, + "options_empty": { + "message": "not defined", + "description": "" + }, + "options_button_test": { + "message": "Oynat", + "description": "" + }, + "options_button_reset": { + "message": "Tercihleri Sıfırla", + "description": "" + }, + "popup_settings": { + "message": "ayarlar", + "description": "" + }, + "popup_of": { + "message": "of", + "description": "" + }, + "popup_wait": { + "message": "Bekleyiniz...", + "description": "" + }, + "popup_date_format": { + "message": "%mm %dd, %yy", + "description": "" + }, + "popup_no_subject": { + "message": "(konu yok)", + "description": "" + }, + "popup_open_settings": { + "message": "Ayarları aç", + "description": "" + }, + "popup_open_inbox": { + "message": "Gmail'i aç", + "description": "" + }, + "popup_archive": { + "message": "Arşivle", + "description": "" + }, + "popup_spam": { + "message": "Spamla", + "description": "" + }, + "popup_trash": { + "message": "Sil", + "description": "" + }, + "popup_refresh": { + "message": "Yenile", + "description": "" + }, + "popup_read": { + "message": "Okundu İşaretle", + "description": "" + }, + "popup_read_all": { + "message": "Tümünü okundu işaretle", + "description": "" + }, + "popup_msg_1": { + "message": "az önce", + "description": "" + }, + "popup_msg_2": { + "message": "1 dakika önce", + "description": "" + }, + "popup_msg_3_format": { + "message": "%d dakika önce", + "description": "" + }, + "popup_msg_4": { + "message": "1 saat önce", + "description": "" + }, + "popup_msg_5": { + "message": "saat önce", + "description": "" + }, + "popup_msg_6": { + "message": "Dün", + "description": "" + }, + "popup_msg_7_format": { + "message": "%d gün önce", + "description": "" + }, + "popup_msg_8_format": { + "message": "%d hafta önce", + "description": "" + }, + "popup_msg_9_format": { + "message": "%d ay önce", + "description": "" + }, + "popup_msg_10": { + "message": "Ocak", + "description": "" + }, + "popup_msg_11": { + "message": "Şubat", + "description": "" + }, + "popup_msg_12": { + "message": "Mart", + "description": "" + }, + "popup_msg_13": { + "message": "Nisan", + "description": "" + }, + "popup_msg_14": { + "message": "Mayıs", + "description": "" + }, + "popup_msg_15": { + "message": "Haziran", + "description": "" + }, + "popup_msg_16": { + "message": "Temmuz", + "description": "" + }, + "popup_msg_17": { + "message": "Ağustos", + "description": "" + }, + "popup_msg_18": { + "message": "Eylül", + "description": "" + }, + "popup_msg_19": { + "message": "Ekim", + "description": "" + }, + "popup_msg_20": { + "message": "Kasım", + "description": "" + }, + "popup_msg_21": { + "message": "Aralık", + "description": "" + }, + "settings_open_title": { + "message": "Open options (settings) page", + "description": "" + }, + "settings_open_label": { + "message": "Seçenekler", + "description": "" + }, + "gmail": { + "message": "Notifier for Gmail™", + "description": "" + } +} \ No newline at end of file diff --git a/v3.classic/_locales/uk/messages.json b/v3.classic/_locales/uk/messages.json new file mode 100644 index 00000000..62820f9f --- /dev/null +++ b/v3.classic/_locales/uk/messages.json @@ -0,0 +1,758 @@ +{ + "toolbar_label": { + "message": "Notifier for Gmail™", + "description": "" + }, + "tooltip_1": { + "message": "Left click: Open Gmail or mail preview panel", + "description": "" + }, + "tooltip_2": { + "message": "Middle (or Ctrl+Left) click: Refresh all accounts", + "description": "" + }, + "tooltip_3": { + "message": "Right click: Account selections", + "description": "" + }, + "description": { + "message": "Нагадувач облікового запису для Google Mail (Gmail) з багатьма мітками", + "description": "" + }, + "log_in_to_your_account": { + "message": "Будь ласка, увійдіть в свій обліковий запис Gmail", + "description": "" + }, + "msg_1": { + "message": "Вкладка вже відкрита. Натисніть кнопку на панелі інструментів, щоб відкрити Gmail в новій вкладці, або переключитися на існуючу вкладку Gmail.", + "description": "" + }, + "msg_2": { + "message": "Посилання скопійовано до буфера обміну.", + "description": "" + }, + "msg_3": { + "message": "Виділений текст скопійовано до буфера обміну.", + "description": "" + }, + "msg_4": { + "message": "Note: For the notifier to work properly, you need to be logged-in into your Google account.", + "description": "" + }, + "msg_5": { + "message": "Select an audio sound file", + "description": "" + }, + "label_1": { + "message": "Оновити", + "description": "" + }, + "label_2": { + "message": "Налаштування", + "description": "" + }, + "label_3": { + "message": "Відключити всі попередження", + "description": "" + }, + "label_4": { + "message": "Протягом 5 хвилин", + "description": "" + }, + "label_5": { + "message": "Протягом 15 хвилин", + "description": "" + }, + "label_6": { + "message": "Протягом 30 хвилин", + "description": "" + }, + "label_7": { + "message": "Протягом 1 години", + "description": "" + }, + "label_8": { + "message": "Протягом 2 годин", + "description": "" + }, + "label_9": { + "message": "Протягом 5 годин", + "description": "" + }, + "label_13": { + "message": "For a custom time period", + "description": "" + }, + "label_10": { + "message": "Enable notifications (session)", + "description": "" + }, + "label_11": { + "message": "Написати листа", + "description": "" + }, + "label_12": { + "message": "Open FAQs", + "description": "" + }, + "label_14": { + "message": "Logged-in accounts", + "description": "" + }, + "unknown": { + "message": "unknown", + "description": "" + }, + "and": { + "message": "and", + "description": "" + }, + "log_into_your_account": { + "message": "Please log into your account", + "description": "" + }, + "notification": { + "message": "From: [author_email][break]Title: [title][break]Summary: [summary]", + "description": "" + }, + "options_title": { + "message": "Параметри - Gmail™ Notifier", + "description": "" + }, + "options_inshort": { + "message": "Нагадувач облікового запису для Google Mail (Gmail) з багатьма мітками.", + "description": "" + }, + "options_donation": { + "message": "Support Development", + "description": "" + }, + "options_timings": { + "message": "Timings:", + "description": "" + }, + "options_timings_l1": { + "message": "Check for new emails every (in seconds):", + "description": "" + }, + "options_timings_l2": { + "message": "Minimum period is 10 seconds.", + "description": "" + }, + "options_timings_l3": { + "message": "Remind for all unread emails every (in minutes):", + "description": "" + }, + "options_timings_l4": { + "message": "Set the value to zero for none-periodic reminders.", + "description": "" + }, + "options_timings_l5": { + "message": "Minimum period is 5 minutes.", + "description": "" + }, + "options_timings_l6": { + "message": "Non-zero value fires both desktop notification and alert sound (similar to new email arrival) eternally if you have unread email(s).", + "description": "" + }, + "options_timings_l7": { + "message": "Do not check for new emails on startup for (in seconds):", + "description": "" + }, + "options_timings_l8": { + "message": "Set the value to zero for no email check until the first manual refresh [Not available on Safari].", + "description": "" + }, + "options_gmail": { + "message": "Gmail:", + "description": "" + }, + "options_gmail_1": { + "message": "Primary account (/mail/u/0/)", + "description": "" + }, + "options_gmail_2": { + "message": "Separate labels by \",\" (Comma).", + "description": "" + }, + "options_gmail_3": { + "message": "Secondary account (/mail/u/1/)", + "description": "" + }, + "options_gmail_4": { + "message": "Tertiary account (/mail/u/2/)", + "description": "" + }, + "options_gmail_5": { + "message": "Quaternary account (/mail/u/3/)", + "description": "" + }, + "options_gmail_6": { + "message": "Quinary account (/mail/u/4/)", + "description": "" + }, + "options_gmail_7": { + "message": "Senary account (/mail/u/5/)", + "description": "" + }, + "options_gmail_8": { + "message": "Mark message as read when archiving it", + "description": "" + }, + "options_gmail_15": { + "message": "Some popular labels:", + "description": "" + }, + "options_gmail_10": { + "message": "Receive notifications for the following labels and accounts:", + "description": "" + }, + "options_gmail_11": { + "message": "Custom feeds:", + "description": "" + }, + "options_gmail_12": { + "message": "Separate feeds by \",\" (Comma). Sample feed: https://mail.google.com/mail/u/0/feed/atom/inbox", + "description": "" + }, + "options_gmail_13": { + "message": "Note: maximum number for all labels except \"inbox\" is 20 (Google feeds only supply the 20 newest entries)", + "description": "" + }, + "options_gmail_14": { + "message": "Note: for the Notifier to listen for more than 5 accounts, add feeds URLs to the \"Custom feeds\" field. For instance to listen to the 6 and 7th accounts add: https://mail.google.com/mail/u/6/feed/atom/inbox, https://mail.google.com/mail/u/7/feed/atom/inbox", + "description": "" + }, + "options_notifications": { + "message": "Notifications:", + "description": "" + }, + "options_notifications_1": { + "message": "Display desktop notification for new emails", + "description": "" + }, + "options_notifications_2": { + "message": "Show desktop notification for (in seconds):", + "description": "" + }, + "options_notifications_3": { + "message": "This option may not work based on your OS.", + "description": "" + }, + "options_notifications_4": { + "message": "Notification format", + "description": "" + }, + "options_notifications_5": { + "message": "Available variables:", + "description": "" + }, + "options_notifications_6": { + "message": "Truncate notifications longer than", + "description": "" + }, + "options_notifications_7": { + "message": "characters for [title] and [summary] fields.", + "description": "" + }, + "options_notifications_8": { + "message": "To have no ellipsis truncation, use a big number here.", + "description": "" + }, + "options_notifications_9": { + "message": "Play alert sound for new emails", + "description": "" + }, + "options_notifications_10": { + "message": "Note for Mac users. From Firefox 28.0, all desktop notifications are handled by Mac Notification Center which causes an extra sound alert. You need to either uncheck this sound notification or the one that is generated by the Notification Center.", + "description": "" + }, + "options_notifications_11": { + "message": "Display \"Windows taskbar notification\" or \"Mac OS Dock notification\"", + "description": "" + }, + "options_notifications_12": { + "message": "Taskbar notifications are not supported on Linux OS at the moment.", + "description": "" + }, + "options_notifications_13": { + "message": "Open toolbar panel when click on the taskbar notification icon (Windows only, beta)", + "description": "" + }, + "options_notifications_14": { + "message": "This feature is highly experimental and might make your Firefox browser unstable. [Restart required].", + "description": "" + }, + "options_notifications_15": { + "message": "Default sound notification is", + "description": "" + }, + "options_notifications_16": { + "message": "Gmail Notifier default alert", + "description": "" + }, + "options_notifications_17": { + "message": "Checker Plus bell alert", + "description": "" + }, + "options_notifications_18": { + "message": "Checker Plus ding alert", + "description": "" + }, + "options_notifications_19": { + "message": "Windows email alert", + "description": "" + }, + "options_notifications_20": { + "message": "User defined sound", + "description": "" + }, + "options_notifications_21": { + "message": "User defined notification sound is", + "description": "" + }, + "options_notifications_22": { + "message": "If your browser is not playing the custom notification sound, try to convert it into a plain WAV format using an online conversion tool.", + "description": "" + }, + "options_notifications_35": { + "message": "To select a new custom sound, select a built-in sound first and then change the option to custom sound", + "description": "" + }, + "options_notifications_23": { + "message": "Volume of the sound notification is", + "description": "" + }, + "options_notifications_24": { + "message": "Volume is a number between 0 to 100 where 100 is the highest volume (default).", + "description": "" + }, + "options_notifications_25": { + "message": "In safari most likely the default sound notifications are not playing properly, if so use a custom sound file as your notification.", + "description": "" + }, + "options_notifications_26": { + "message": "Always show tray notification (Windows only)", + "description": "" + }, + "options_notifications_27": { + "message": "Tray notification will be shown even if there is no unread message.", + "description": "" + }, + "options_notifications_28": { + "message": "Disable all notifications for a custom time period (in minutes):", + "description": "" + }, + "options_notifications_29": { + "message": "This option is related to the right click menu on the toolbar button -> disable all notifications -> custom time period.", + "description": "" + }, + "options_notifications_30": { + "message": "Combine all concurrent desktop notifications into a single notification", + "description": "" + }, + "options_notifications_31": { + "message": "Custom sound notification", + "description": "" + }, + "options_notifications_32": { + "message": "name or email contains", + "description": "" + }, + "options_notifications_33": { + "message": "email title contains", + "description": "" + }, + "options_notifications_34": { + "message": "email summary contains", + "description": "" + }, + "options_notifications_36": { + "message": "Ask Gmail to prevent 'inbox.google.com' redirection", + "description": "" + }, + "options_notifications_37": { + "message": "Display Badge number", + "description": "" + }, + "options_notifications_38": { + "message": "Faster actions (mark as read, delete, ...) (Consider actions to be resolved when headers are received)", + "description": "" + }, + "options_notifications_40": { + "message": "Allow quick actions from notification box (maximum two actions) (Chrome only)", + "description": "" + }, + "options_notifications_41": { + "message": "Mark as Read", + "description": "" + }, + "options_notifications_42": { + "message": "Archive", + "description": "" + }, + "options_notifications_43": { + "message": "Trash", + "description": "" + }, + "options_tab": { + "message": "Tab Opening:", + "description": "" + }, + "options_tab_1": { + "message": "Search for an open Gmail account only on the active window", + "description": "" + }, + "options_tab_2": { + "message": "Do not search other browser windows for open Gmail accounts. If Gmail is not open in the active window, open a new tab.", + "description": "" + }, + "options_tab_3": { + "message": "Open new Gmail account next to the active tab", + "description": "" + }, + "options_tab_4": { + "message": "Open Gmail account in the active tab", + "description": "" + }, + "options_tab_5": { + "message": "Open Gmail account in a background tab", + "description": "" + }, + "options_tab_6": { + "message": "Open Gmail account in a new window", + "description": "" + }, + "options_tab_7": { + "message": "Always use blank tabs instead of opening a new tab when open in tab is activated", + "description": "" + }, + "options_tab_8": { + "message": "Ignore opened Gmail tabs", + "description": "" + }, + "options_tab_9": { + "message": "When unchecked, Gmail Notifier checks either active window or all open windows for open instance of Gmail and switch to the tab when tab opening is requested.", + "description": "" + }, + "options_tab_10": { + "message": "Open emails in basic HTML mode", + "description": "" + }, + "options_toolbar": { + "message": "Toolbar:", + "description": "" + }, + "options_toolbar_1": { + "message": "Toolbar button behaviour", + "description": "" + }, + "options_toolbar_2": { + "message": "Always open email preview panel", + "description": "" + }, + "options_toolbar_3": { + "message": "Open Gmail account if only one account is logged-in", + "description": "" + }, + "options_toolbar_18": { + "message": "Open Gmail account (forced)", + "description": "" + }, + "options_toolbar_4": { + "message": "Toolbar panel mode", + "description": "" + }, + "options_toolbar_5": { + "message": "Show summary only", + "description": "" + }, + "options_toolbar_6": { + "message": "Show full content", + "description": "" + }, + "options_toolbar_7": { + "message": "Toolbar panel width in the full-content view mode is (in pixels):", + "description": "" + }, + "options_toolbar_8": { + "message": "Minimum width is 500px.", + "description": "" + }, + "options_toolbar_9": { + "message": "Toolbar panel height in the full-content view mode is (in pixels):", + "description": "" + }, + "options_toolbar_10": { + "message": "Minimum height is 500px.", + "description": "" + }, + "options_toolbar_11": { + "message": "Support keyboard shortcuts on the toolbar panel", + "description": "" + }, + "options_toolbar_12": { + "message": "!: Report as spam, #: Trash, e: Archive, Shift + i: Mark as read.", + "description": "" + }, + "options_toolbar_13": { + "message": "Render emails as HTML in full-content mode", + "description": "" + }, + "options_toolbar_14": { + "message": "If you prefer text-only rendering in the full-content mode, uncheck the box.", + "description": "" + }, + "options_toolbar_15": { + "message": "Middle-click on the toolbar button to", + "description": "" + }, + "options_toolbar_16": { + "message": "Refresh all accounts", + "description": "" + }, + "options_toolbar_17": { + "message": "Open primary Gmail account", + "description": "" + }, + "options_misc": { + "message": "Miscellaneous:", + "description": "" + }, + "options_misc_1": { + "message": "Sort accounts alphabetically", + "description": "" + }, + "options_misc_2": { + "message": "The default order type is logged-in order.", + "description": "" + }, + "options_misc_3": { + "message": "Toolbar color pattern is", + "description": "" + }, + "options_misc_4": { + "message": "Gray color for \"No Unread\" and blue color for \"Disconnected\"", + "description": "" + }, + "options_misc_5": { + "message": "Blue color for \"No Unread\" and gray color for \"Disconnected\"", + "description": "" + }, + "options_misc_9": { + "message": "Red color for \"No Unread\" and gray color for \"Disconnected\"", + "description": "" + }, + "options_misc_6": { + "message": "Show desktop notification to warn that Gmail is already opened in the active tab", + "description": "" + }, + "options_misc_7": { + "message": "Show welcome page on upgrade", + "description": "" + }, + "options_misc_8": { + "message": "Reset all settings back to factory", + "description": "" + }, + "options_misc_10": { + "message": "Only fire desktop and sound notifications when email has arrived in less than (in minutes): ", + "description": "" + }, + "options_misc_11": { + "message": "By setting this preference to zero, you will receive neither desktop nor sound notifications; however, you will still get badge notification.", + "description": "" + }, + "options_misc_12": { + "message": "Do not include login details in the tooltip text", + "description": "" + }, + "options_misc_13": { + "message": "By default, the notifier updates tooltip text of the toolbar button with login info. By unchecking this option, the tooltip text remains the default value.", + "description": "" + }, + "options_misc_14": { + "message": "Do not show the exact badge number when the number of unread emails is greater than 999", + "description": "" + }, + "options_misc_15": { + "message": "Open FAQs page on updates", + "description": "" + }, + "options_plugins": { + "message": "Plug-ins:", + "description": "" + }, + "options_plugins_1": { + "message": "Gmail labels and star button (experimental)", + "description": "" + }, + "options_plugins_2": { + "message": "This plugin displays the star button as well as thread's labels in the popup (expanded mode only).", + "description": "" + }, + "options_px": { + "message": "px", + "description": "" + }, + "options_empty": { + "message": "not defined", + "description": "" + }, + "options_button_test": { + "message": "Play", + "description": "" + }, + "options_button_reset": { + "message": "Reset Preferences", + "description": "" + }, + "popup_settings": { + "message": "settings", + "description": "" + }, + "popup_of": { + "message": "of", + "description": "" + }, + "popup_wait": { + "message": "Wait...", + "description": "" + }, + "popup_date_format": { + "message": "%mm %dd, %yy", + "description": "" + }, + "popup_no_subject": { + "message": "(no subject)", + "description": "" + }, + "popup_open_settings": { + "message": "Open settings", + "description": "" + }, + "popup_open_inbox": { + "message": "Open inbox", + "description": "" + }, + "popup_archive": { + "message": "Archive", + "description": "" + }, + "popup_spam": { + "message": "Spam", + "description": "" + }, + "popup_trash": { + "message": "Trash", + "description": "" + }, + "popup_refresh": { + "message": "Refresh", + "description": "" + }, + "popup_read": { + "message": "Mark as Read", + "description": "" + }, + "popup_read_all": { + "message": "Mark all as read", + "description": "" + }, + "popup_msg_1": { + "message": "just now", + "description": "" + }, + "popup_msg_2": { + "message": "1 minute ago", + "description": "" + }, + "popup_msg_3_format": { + "message": "%d minutes ago", + "description": "" + }, + "popup_msg_4": { + "message": "1 hour ago", + "description": "" + }, + "popup_msg_5": { + "message": "hours ago", + "description": "" + }, + "popup_msg_6": { + "message": "Yesterday", + "description": "" + }, + "popup_msg_7_format": { + "message": "%d days ago", + "description": "" + }, + "popup_msg_8_format": { + "message": "%d week(s) ago", + "description": "" + }, + "popup_msg_9_format": { + "message": "%d month(s) ago", + "description": "" + }, + "popup_msg_10": { + "message": "January", + "description": "" + }, + "popup_msg_11": { + "message": "February", + "description": "" + }, + "popup_msg_12": { + "message": "March", + "description": "" + }, + "popup_msg_13": { + "message": "April", + "description": "" + }, + "popup_msg_14": { + "message": "May", + "description": "" + }, + "popup_msg_15": { + "message": "June", + "description": "" + }, + "popup_msg_16": { + "message": "July", + "description": "" + }, + "popup_msg_17": { + "message": "August", + "description": "" + }, + "popup_msg_18": { + "message": "September", + "description": "" + }, + "popup_msg_19": { + "message": "October", + "description": "" + }, + "popup_msg_20": { + "message": "November", + "description": "" + }, + "popup_msg_21": { + "message": "December", + "description": "" + }, + "settings_open_title": { + "message": "Open options (settings) page", + "description": "" + }, + "settings_open_label": { + "message": "Open Options", + "description": "" + }, + "gmail": { + "message": "Notifier for Gmail™", + "description": "" + } +} \ No newline at end of file diff --git a/v3.classic/_locales/zh_CN/messages.json b/v3.classic/_locales/zh_CN/messages.json new file mode 100644 index 00000000..703c47cf --- /dev/null +++ b/v3.classic/_locales/zh_CN/messages.json @@ -0,0 +1,762 @@ +{ + "toolbar_label": { + "message": "Notifier for Gmail™", + "description": "" + }, + "tooltip_1": { + "message": "左键单击:打开 Gmail 或邮件预览面板", + "description": "" + }, + "tooltip_2": { + "message": "中键 (或 Ctrl+左键) 单击:刷新所有帐户", + "description": "" + }, + "tooltip_3": { + "message": "右键单击:选择帐户", + "description": "" + }, + "description": { + "message": "支持多个标签和帐户的通知工具,适用于 Google Mail (Gmail)", + "description": "" + }, + "log_in_to_your_account": { + "message": "请登录您的 Gmail 帐户", + "description": "" + }, + "msg_1": { + "message": "标签页已经打开。点击工具栏上的按钮在新标签页中打开 Gmail,或者切换到现有的 Gmail 标签页。", + "description": "" + }, + "msg_2": { + "message": "链接已复制到剪贴板。", + "description": "" + }, + "msg_3": { + "message": "选定文本已复制到剪贴板。", + "description": "" + }, + "msg_4": { + "message": "注意:为了通知能正常工作,您需要先登录到您的 Google 帐户。", + "description": "" + }, + "msg_5": { + "message": "选择一个声音文件", + "description": "" + }, + "label_1": { + "message": "刷新", + "description": "" + }, + "label_2": { + "message": "设置", + "description": "" + }, + "label_3": { + "message": "禁用所有通知", + "description": "" + }, + "label_4": { + "message": "禁用 5 分钟", + "description": "" + }, + "label_5": { + "message": "禁用 15 分钟", + "description": "" + }, + "label_6": { + "message": "禁用 30 分钟", + "description": "" + }, + "label_7": { + "message": "禁用 1 小时", + "description": "" + }, + "label_8": { + "message": "禁用 2 小时", + "description": "" + }, + "label_9": { + "message": "禁用 5 小时", + "description": "" + }, + "label_13": { + "message": "自定义时间长度", + "description": "" + }, + "label_10": { + "message": "启用通知(本次会话期间)", + "description": "" + }, + "label_11": { + "message": "撰写邮件", + "description": "" + }, + "label_12": { + "message": "打开常见问题", + "description": "" + }, + "label_14": { + "message": "已登录帐户", + "description": "" + }, + "unknown": { + "message": "未知", + "description": "" + }, + "and": { + "message": "及", + "description": "" + }, + "log_into_your_account": { + "message": "请登录您的帐户", + "description": "" + }, + "notification": { + "message": "来自: [author_email][break]标题: [title][break]摘要: [summary]", + "description": "" + }, + "options_title": { + "message": "选项 - Gmail™ Notifier", + "description": "" + }, + "options_inshort": { + "message": "支持多个标签和帐户的通知工具,适用于 Google Mail (Gmail)。", + "description": "" + }, + "options_donation": { + "message": "支持软件开发", + "description": "" + }, + "options_timings": { + "message": "时间:", + "description": "" + }, + "options_timings_l1": { + "message": "检查新邮件,每隔(秒):", + "description": "" + }, + "options_timings_l2": { + "message": "最小周期为 10 秒。", + "description": "" + }, + "options_timings_l3": { + "message": "提醒有未读邮件,每隔(分钟):", + "description": "" + }, + "options_timings_l4": { + "message": "设置值为 0 可禁用定期提醒。", + "description": "" + }, + "options_timings_l5": { + "message": "最小周期为 5 分钟。", + "description": "" + }, + "options_timings_l6": { + "message": "非零的值将反复触发桌面通知和提醒声音(类似有新邮件到达),如果您有未读的邮件。", + "description": "" + }, + "options_timings_l7": { + "message": "不检查新邮件,在刚启动的(秒):", + "description": "" + }, + "options_timings_l8": { + "message": "设置值为 0 将禁用邮件检查,除非手动刷新 [Safari 上不可用]。", + "description": "" + }, + "options_gmail": { + "message": "Gmail:", + "description": "" + }, + "options_gmail_1": { + "message": "主帐户 (/mail/u/0/)", + "description": "" + }, + "options_gmail_2": { + "message": "用 \",\" (半角逗号) 分隔。", + "description": "" + }, + "options_gmail_3": { + "message": "第二帐户 (/mail/u/1/)", + "description": "" + }, + "options_gmail_4": { + "message": "第三帐户 (/mail/u/2/)", + "description": "" + }, + "options_gmail_5": { + "message": "第四帐户 (/mail/u/3/)", + "description": "" + }, + "options_gmail_6": { + "message": "第五帐户 (/mail/u/4/)", + "description": "" + }, + "options_gmail_7": { + "message": "第六帐户 (/mail/u/5/)", + "description": "" + }, + "options_gmail_8": { + "message": "归档时标记邮件为已读", + "description": "" + }, + "options_gmail_15": { + "message": "常用的标签:", + "description": "" + }, + "options_gmail_10": { + "message": "接收下列标签和帐户的通知:", + "description": "" + }, + "options_gmail_11": { + "message": "自定义收取点:", + "description": "" + }, + "options_gmail_12": { + "message": "用 \",\" (半角逗号) 分隔收取点。收取点样例: https://mail.google.com/mail/u/0/feed/atom/inbox", + "description": "" + }, + "options_gmail_13": { + "message": "注意:除收件箱(inbox)外,所有标签的最大数量为 20(Google 提供的收取点仅提供最新的 20 项)", + "description": "" + }, + "options_gmail_14": { + "message": "注意:要使 Notifier 监测超过5个帐户,请将收取点网址添加到“自定义收取点”栏。形式例如: https://mail.google.com/mail/u/6/feed/atom/inbox, https://mail.google.com/mail/u/7/feed/atom/inbox", + "description": "" + }, + "options_notifications": { + "message": "通知:", + "description": "" + }, + "options_notifications_1": { + "message": "为新邮件显示桌面通知", + "description": "" + }, + "options_notifications_2": { + "message": "显示桌面通知(秒):", + "description": "" + }, + "options_notifications_3": { + "message": "此选项在您的操作系统上可能无法正常工作。", + "description": "" + }, + "options_notifications_4": { + "message": "通知格式", + "description": "" + }, + "options_notifications_5": { + "message": "可用变量:", + "description": "" + }, + "options_notifications_6": { + "message": "截断通知中超过", + "description": "" + }, + "options_notifications_7": { + "message": "字符的标题和摘要。", + "description": "" + }, + "options_notifications_8": { + "message": "要想没有截断和省略号,在这里使用较大的数值。", + "description": "" + }, + "options_notifications_9": { + "message": "为新邮件播放声音提醒", + "description": "" + }, + "options_notifications_10": { + "message": "Mac 用户请注意:从 Firefox 28.0 开始,所有桌面通知都经由 Mac 通知中心处理,包括触发一个额外的声音提醒。您需要取消这里的声音或者“通知中心”中的声音。", + "description": "" + }, + "options_notifications_11": { + "message": "显示“Windows 任务栏通知”或者“Mac OS Dock 通知”", + "description": "" + }, + "options_notifications_12": { + "message": "任务栏通知目前不支持 Linux 操作系统。", + "description": "" + }, + "options_notifications_13": { + "message": "在点击任务栏通知图标时打开工具栏面板(仅 Windows,测试版)", + "description": "" + }, + "options_notifications_14": { + "message": "此功能是实验性的,并可能导致您的 Firefox 浏览器不稳定 [需要重启]。", + "description": "" + }, + "options_notifications_15": { + "message": "默认声音是", + "description": "" + }, + "options_notifications_16": { + "message": "Gmail Notifier 默认声音", + "description": "" + }, + "options_notifications_17": { + "message": "Checker Plus 钟声", + "description": "" + }, + "options_notifications_18": { + "message": "Checker Plus 铃声", + "description": "" + }, + "options_notifications_19": { + "message": "Windows 邮件提醒", + "description": "" + }, + "options_notifications_20": { + "message": "用户定义声音", + "description": "" + }, + "options_notifications_21": { + "message": "用户定义声音为", + "description": "" + }, + "options_notifications_22": { + "message": "如果您的浏览器不能播放自定义的声音,请尝试用在线转换工具将它转换为纯 WAV 格式。", + "description": "" + }, + "options_notifications_35": { + "message": "要选择一个新的自定义声音,选择一个内置声音,然后再更改此选项为自定义声音", + "description": "" + }, + "options_notifications_23": { + "message": "声音提醒的音量为", + "description": "" + }, + "options_notifications_24": { + "message": "音量是 0 至 100 之间的一个数字,100 是最高音量(默认值)。", + "description": "" + }, + "options_notifications_25": { + "message": "在 Safari 下很可能默认的通知声音不能正常播放,如果您使用了一个自定义文件作为通知声音。", + "description": "" + }, + "options_notifications_26": { + "message": "始终显示托盘通知 (仅 Windows)", + "description": "" + }, + "options_notifications_27": { + "message": "托盘通知图标将始终显示,即使没有未读邮件。", + "description": "" + }, + "options_notifications_28": { + "message": "指定时间内禁止所有通知 (分钟):", + "description": "" + }, + "options_notifications_29": { + "message": "此选项有关工具栏按钮的右键菜单 -> 禁止所有通知 -> 自定义时间长度。", + "description": "" + }, + "options_notifications_30": { + "message": "整合所有连续的桌面通知为单条通知", + "description": "" + }, + "options_notifications_31": { + "message": "自定义声音通知", + "description": "" + }, + "options_notifications_32": { + "message": "名称或电子邮件包含", + "description": "" + }, + "options_notifications_33": { + "message": "邮件标题包含", + "description": "" + }, + "options_notifications_34": { + "message": "邮件摘要包含", + "description": "" + }, + "options_notifications_36": { + "message": "要求 Gmail 避免重定向到 'inbox.google.com'", + "description": "" + }, + "options_notifications_37": { + "message": "显示徽标数字", + "description": "" + }, + "options_notifications_38": { + "message": "快捷动作(标为已读、删除等)(看到标题后可能执行的操作)", + "description": "" + }, + "options_notifications_40": { + "message": "允许从通知框执行快速操作(最多两项操作)(仅支持 Chrome)", + "description": "" + }, + "options_notifications_41": { + "message": "标为已读", + "description": "" + }, + "options_notifications_42": { + "message": "归档", + "description": "" + }, + "options_notifications_43": { + "message": "移入垃圾箱", + "description": "" + }, + "options_tab": { + "message": "打开标签页:", + "description": "" + }, + "options_tab_1": { + "message": "只在活动窗口中搜索已打开的 Gmail 帐户", + "description": "" + }, + "options_tab_2": { + "message": "不搜索其他浏览器窗口有无打开的 Gmail 帐户。如果活动窗口中没有已打开的 Gmail,打开一个新标签页。", + "description": "" + }, + "options_tab_3": { + "message": "在当前标签页后面打开新的 Gmail 帐户", + "description": "" + }, + "options_tab_4": { + "message": "在当前标签页打开 Gmail 帐户", + "description": "" + }, + "options_tab_5": { + "message": "在后台标签页打开 Gmail 帐户", + "description": "" + }, + "options_tab_6": { + "message": "在新窗口打开 Gmail 帐户", + "description": "" + }, + "options_tab_7": { + "message": "始终使用空白标签页而不是打开一个新标签页", + "description": "" + }, + "options_tab_8": { + "message": "忽略已打开的 Gmail 标签页", + "description": "" + }, + "options_tab_9": { + "message": "在未选中时,Gmail Notifier 会检查是否已有活动窗口包含已打开的 Gmail,并在必要时切换到已打开的标签页。", + "description": "" + }, + "options_tab_10": { + "message": "用基本 HTML 模式打开邮件", + "description": "" + }, + "options_tab_11": { + "message": "直接打开最新的未读邮件,代替收件箱文件夹", + "description": "" + }, + "options_toolbar": { + "message": "工具栏:", + "description": "" + }, + "options_toolbar_1": { + "message": "工具栏按钮行为", + "description": "" + }, + "options_toolbar_2": { + "message": "总是打开邮件预览面板", + "description": "" + }, + "options_toolbar_3": { + "message": "打开 Gmail 帐户,如果只登录了一个帐户", + "description": "" + }, + "options_toolbar_18": { + "message": "强制打开 Gmail 账户", + "description": "" + }, + "options_toolbar_4": { + "message": "工具栏面板模式", + "description": "" + }, + "options_toolbar_5": { + "message": "只显示摘要", + "description": "" + }, + "options_toolbar_6": { + "message": "显示完整内容", + "description": "" + }, + "options_toolbar_7": { + "message": "完整内容模式下的工具栏面板宽度为(像素):", + "description": "" + }, + "options_toolbar_8": { + "message": "最小宽度为 500px。", + "description": "" + }, + "options_toolbar_9": { + "message": "完整内容模式下的工具栏面板高度为(像素):", + "description": "" + }, + "options_toolbar_10": { + "message": "最小高度为 500px。", + "description": "" + }, + "options_toolbar_11": { + "message": "工具栏面板上支持键盘快捷键", + "description": "" + }, + "options_toolbar_12": { + "message": "!: 报告为垃圾邮件, #: 删除, e: 归档, Shift + i: 标记为已读。", + "description": "" + }, + "options_toolbar_13": { + "message": "在完整内容模式下,呈现邮件为 HTML 形式", + "description": "" + }, + "options_toolbar_14": { + "message": "如果您偏好在完整内容模式下只呈现文本形式,取消此框。", + "description": "" + }, + "options_toolbar_15": { + "message": "中键单击工具栏按钮", + "description": "" + }, + "options_toolbar_16": { + "message": "刷新所有帐户", + "description": "" + }, + "options_toolbar_17": { + "message": "打开主要的 Gmail 帐户", + "description": "" + }, + "options_misc": { + "message": "杂项:", + "description": "" + }, + "options_misc_1": { + "message": "按字母排序帐户", + "description": "" + }, + "options_misc_2": { + "message": "默认顺序是登录顺序。", + "description": "" + }, + "options_misc_3": { + "message": "工具栏颜色模式", + "description": "" + }, + "options_misc_4": { + "message": "灰色表示“无未读邮件”,蓝色表示“已断开”", + "description": "" + }, + "options_misc_5": { + "message": "蓝色表示“无未读邮件”,灰色表示“已断开”", + "description": "" + }, + "options_misc_9": { + "message": "红色表示“无未读邮件”,灰色表示“已断开”", + "description": "" + }, + "options_misc_6": { + "message": "显示桌面通知以警告 Gmail 已在活动标签页打开", + "description": "" + }, + "options_misc_7": { + "message": "升级后显示欢迎页面", + "description": "" + }, + "options_misc_8": { + "message": "重置所有设置到出厂设置", + "description": "" + }, + "options_misc_10": { + "message": "仅在邮件抵达未超过x分钟时发出桌面和声音通知:", + "description": "" + }, + "options_misc_11": { + "message": "如果将此选项设置为 0,您将不再收到桌面和声音通知,但仍可收到网址栏徽章通知。", + "description": "" + }, + "options_misc_12": { + "message": "不在工具提示中包含登录信息", + "description": "" + }, + "options_misc_13": { + "message": "默认情况下,本扩展的工具栏按钮的工具提示带有登录信息。取消此选项时,工具提示文本将恢复默认值。", + "description": "" + }, + "options_misc_14": { + "message": "未读邮件超过 999 封时,不在徽章上显示确切数字", + "description": "" + }, + "options_misc_15": { + "message": "更新时打开常见问题页面", + "description": "" + }, + "options_plugins": { + "message": "插件:", + "description": "" + }, + "options_plugins_1": { + "message": "Gmail 标签及星标按钮(实验性)", + "description": "" + }, + "options_plugins_2": { + "message": "此插件在弹出窗口中显示星标按钮和主题的标签(仅限扩展模式)。", + "description": "" + }, + "options_px": { + "message": "像素", + "description": "" + }, + "options_empty": { + "message": "未定义", + "description": "" + }, + "options_button_test": { + "message": "播放", + "description": "" + }, + "options_button_reset": { + "message": "重置首选项", + "description": "" + }, + "popup_settings": { + "message": "设置", + "description": "" + }, + "popup_of": { + "message": "/", + "description": "" + }, + "popup_wait": { + "message": "等待...", + "description": "" + }, + "popup_date_format": { + "message": "%yy-%mm-%dd", + "description": "" + }, + "popup_no_subject": { + "message": "(无主题)", + "description": "" + }, + "popup_open_settings": { + "message": "打开设置", + "description": "" + }, + "popup_open_inbox": { + "message": "打开收件箱", + "description": "" + }, + "popup_archive": { + "message": "归档", + "description": "" + }, + "popup_spam": { + "message": "垃圾", + "description": "" + }, + "popup_trash": { + "message": "删除", + "description": "" + }, + "popup_refresh": { + "message": "刷新", + "description": "" + }, + "popup_read": { + "message": "标为已读", + "description": "" + }, + "popup_read_all": { + "message": "全部标为已读", + "description": "" + }, + "popup_msg_1": { + "message": "刚刚", + "description": "" + }, + "popup_msg_2": { + "message": "1 分钟前", + "description": "" + }, + "popup_msg_3_format": { + "message": "%d 分钟前", + "description": "" + }, + "popup_msg_4": { + "message": "1 小时前", + "description": "" + }, + "popup_msg_5": { + "message": "小时前", + "description": "" + }, + "popup_msg_6": { + "message": "昨天", + "description": "" + }, + "popup_msg_7_format": { + "message": "%d 天前", + "description": "" + }, + "popup_msg_8_format": { + "message": "%d 周前", + "description": "" + }, + "popup_msg_9_format": { + "message": "%d 个月前", + "description": "" + }, + "popup_msg_10": { + "message": "1月", + "description": "" + }, + "popup_msg_11": { + "message": "2月", + "description": "" + }, + "popup_msg_12": { + "message": "3月", + "description": "" + }, + "popup_msg_13": { + "message": "4月", + "description": "" + }, + "popup_msg_14": { + "message": "5月", + "description": "" + }, + "popup_msg_15": { + "message": "6月", + "description": "" + }, + "popup_msg_16": { + "message": "7月", + "description": "" + }, + "popup_msg_17": { + "message": "8月", + "description": "" + }, + "popup_msg_18": { + "message": "9月", + "description": "" + }, + "popup_msg_19": { + "message": "10月", + "description": "" + }, + "popup_msg_20": { + "message": "11月", + "description": "" + }, + "popup_msg_21": { + "message": "12月", + "description": "" + }, + "settings_open_title": { + "message": "打开选项(设置)页面", + "description": "" + }, + "settings_open_label": { + "message": "打开选项", + "description": "" + }, + "gmail": { + "message": "Notifier for Gmail™", + "description": "" + } +} \ No newline at end of file diff --git a/v3.classic/core/button.js b/v3.classic/core/button.js new file mode 100644 index 00000000..24f30770 --- /dev/null +++ b/v3.classic/core/button.js @@ -0,0 +1,134 @@ +'use strict'; + +const button = { + set label(title) { + chrome.action.setTitle({title}); + }, + set color(color) { + chrome.action.setBadgeBackgroundColor({color}); + } +}; +// button.badge +{ + Object.defineProperty(button, 'badge', { + set(val) { + chrome.storage.local.get({ + 'minimal': true, + 'badge': true + }, prefs => { + if (val > 999 && prefs.minimal) { + const formatter = new Intl.NumberFormat('en-US', { + notation: 'compact', + compactDisplay: 'short' + }); + val = '>' + formatter.format(val); + } + chrome.action.setBadgeText({ + text: val === 0 || prefs.badge === false ? '' : String(val) + }); + }); + } + }); +} +// button.icon +{ + let id; + Object.defineProperty(button, 'icon', { + set(clr) { + clearTimeout(id); + + chrome.storage.local.get({ + 'clrPattern': 0 // 0: normal color scheme, 1: reverse color scheme + }, prefs => { + function set(clr) { + // Change color pattern? + if (prefs.clrPattern === 1) { + switch (clr) { + case 'blue': + clr = 'gray'; + break; + case 'gray': + clr = 'blue'; + break; + } + } + if (prefs.clrPattern === 2) { + switch (clr) { + case 'blue': + clr = 'gray'; + break; + case 'red': + clr = 'blue'; + break; + case 'gray': + clr = 'red'; + break; + } + } + chrome.action.setIcon({ + path: { + '16': '/data/icons/' + clr + '/16.png', + '18': '/data/icons/' + clr + '/18.png', + '19': '/data/icons/' + clr + '/19.png', + '32': '/data/icons/' + clr + '/32.png' + } + }); + } + + if (clr === 'load') { + const next = (i, n = 0) => { + clearTimeout(id); + if (n < 100) { + id = setTimeout(() => { + set('load' + i); + i += 1; + next(i % 4, n += 1); + }, 200); + } + else { + set('blue'); + } + }; + next(0); + } + else if (clr === 'new') { + const next = i => { + clearTimeout(id); + id = setTimeout(() => { + set(i % 2 ? 'red' : 'new'); + if (i < 7) { + i += 1; + next(i); + } + }, 300); + }; + next(0); + } + else { + set(clr); + } + }); + } + }); +} + +// once +{ + const once = () => { + if (once.done) { + return; + } + once.done = true; + + chrome.storage.local.get({ + 'backgroundColor': '#6e6e6e' + }).then(prefs => button.color = prefs.backgroundColor); + }; + chrome.runtime.onStartup.addListener(once); + chrome.runtime.onInstalled.addListener(once); +} +chrome.storage.onChanged.addListener(ps => { + if (ps.backgroundColor) { + button.color = ps.backgroundColor.newValue; + } +}); diff --git a/v3.classic/core/check.js b/v3.classic/core/check.js new file mode 100644 index 00000000..8fed2b4d --- /dev/null +++ b/v3.classic/core/check.js @@ -0,0 +1,630 @@ +/* global log, button, context, Feed, repeater, sound, offscreen, toast */ + +if (typeof importScripts !== 'undefined') { + self.importScripts('/core/utils/feed.js'); +} + +{ + const helper = { + id(href) { + const m = href.match(/u\/(?\d+)/); + if (m) { + return Number(m.groups.n); + } + }, + base(href) { + return /[^?]*/.exec(href)[0].split('/h')[0].replace(/\/$/, ''); + }, + thread(href) { + const m = href.match(/message_id=(?[^&]+)/); + if (m) { + return m.groups.thread; + } + } + }; + + const isPrivate = false; + + const read = (prefs, type = 'local') => chrome.storage[type].get(prefs); + + const notify = async (text, title, click = {}, buttons = []) => { + title = title || chrome.i18n.getMessage('gmail'); + + const p2 = await read({ + 'silent': false + }, 'session'); + if (p2.silent) { + log('[feed]', 'notification is silent', text, title); + return; + } + const p1 = await read({ + 'notificationTime': 10, // seconds + 'notification.state.active': true, + 'notification.state.idle': true, + 'notification.state.locked': true + }, 'local'); + + if ( + p1['notification.state.active'] === false || + p1['notification.state.idle'] === false || + p1['notification.state.locked'] === false + ) { + const state = await chrome.idle.queryState(5 * 60); + if (p1['notification.state.' + state] === false) { + log('[feed]', 'notification is aborted', text, title); + return; + } + } + + let isArray = Array.isArray(text); + if (isArray && text.length === 1) { + isArray = false; + text = text[0]; + } + // Users on Mac OS X only see the first item. + if (isArray && navigator.platform.includes('Mac')) { + isArray = false; + text = text.join('\n\n'); + } + + const when = Date.now() + p1.notificationTime * 1000; + const options = { + type: isArray ? 'list' : 'basic', + iconUrl: '/data/icons/notification/48.png', + title, + message: isArray ? '' : text, + priority: 2, + eventTime: when, + items: isArray ? text.map(message => { + const tmp = message.split('\n'); + return { + title: (tmp[1] || '').replace('Title: ', ''), + message: tmp[0].replace('From: ', '') + }; + }) : [], + requireInteraction: click ? true : false, + buttons: buttons.map(b => ({ + title: b.title, + iconUrl: b.iconUrl + })) + + }; + if (navigator.userAgent.includes('Firefox')) { + delete options.requireInteraction; + delete options.buttons; + } + // if (config.notification.actions === false) { + // delete options.buttons; + // } + + const id = 'action.' + Math.random(); + chrome.storage.session.set({ + [id]: { + buttons: (buttons || []).map(o => o.action), + click + } + }); + chrome.alarms.create('clear.notification.' + id, { + when + }); + chrome.notifications.create(id, options); + }; + chrome.notifications.onClicked.addListener(id => { + chrome.notifications.clear(id); + sound.stop(); + if (id.startsWith('action.')) { + chrome.storage.session.get(id, prefs => { + chrome.storage.session.remove(id); + const {click} = prefs[id]; + if (click.cmd === 'open') { + const {links} = click; + // use open to open the first link and use chrome.tabs.create for the rest + self.openLink(links[0]); + links.slice(1).forEach(url => chrome.tabs.create({ + url, + active: false + })); + } + else { + console.error('No action', click); + } + }); + } + }); + chrome.alarms.onAlarm.addListener(o => { + if (o.name.startsWith('clear.notification.')) { + const id = o.name.slice(19); + chrome.notifications.clear(id); + chrome.storage.session.remove(id); + } + }); + if (chrome.notifications.onButtonClicked) { + chrome.notifications.onButtonClicked.addListener((id, index) => { + sound.stop(); + + chrome.storage.session.get(id, prefs => { + chrome.storage.session.remove(id); + chrome.notifications.clear(id); + + const request = prefs[id].buttons[index]; + // links might be from different accounts + const bases = {}; + for (const link of request.links) { + const base = helper.base(link); + bases[base] = bases[base] || []; + bases[base].push(link); + } + const requests = Object.values(bases).map(links => ({ + ...request, + links + })); + // dispatch + chrome.storage.local.get({ + doReadOnArchive: true + }, prefs => { + requests.forEach(r => r.prefs = prefs); + Promise.all(requests.map(request => offscreen.command({ + cmd: 'gmail.action', + request + }))).then(arr => { + const errors = arr.filter(o => o !== true); + if (errors.length) { + console.error(errors); + toast(errors.map(e => e.message).join('\n\n')); + } + }).finally(() => repeater.reset('action.command', 500)); + }); + }); + }); + } + + const shorten = (str = '', truncate) => { + if (str.length < truncate) { + return str; + } + return str.substr(0, truncate / 2) + '...' + str.substr(str.length - truncate / 2); + }; + + const attach = () => chrome.action.setPopup({ + popup: '/data/popup/index.html' + }); + const detach = () => { + chrome.action.setPopup({ + popup: '' + }); + chrome.runtime.sendMessage({ + method: 'close-popup' + }, () => chrome.runtime.lastError); + }; + chrome.storage.onChanged.addListener(ps => { + if (ps.oldFashion) { + self.checkEmails.getCached().then(objs => { + const numberOfAccounts = objs.map(o => o.xml ? o.xml.title : null) + .filter((o, i, a) => o && a.indexOf(o) === i).length; + const hasUnread = objs.map(o => o.xml ? o.xml.fullcount : 0) + .reduce((p, c) => p + c, 0); + + if (numberOfAccounts === 1 && ps.oldFashion.newValue === 1) { + detach(); + } + else if (hasUnread) { + attach(); + } + }); + } + }); + + const buildFeeds = prefs => { + const tmp = ['0', '1', '2', '3', '4', '5'] + .map(i => prefs['feeds_' + i]) + .map((f, i) => f.split(', ').map(tag => tag ? (tag.startsWith('http:') ? tag : i + '/feed/atom/' + encodeURIComponent(tag)) : '')); + let merged = []; + tmp.forEach(l => merged.push(...l)); + merged = merged + .filter(s => s) + .map(tag => tag.startsWith('http:') ? tag : 'https://mail.google.com/mail/u/' + tag); + + if (prefs.feeds_custom) { + merged = [ + ...merged, + ...prefs.feeds_custom.split(/\s*,\s*/g) + ]; + } + merged = merged + // only feeds without '/inbox' show the right full-count + .map(tag => tag.replace('/inbox', '')) + .filter(f => f) + .filter((feed, index, feeds) => feeds.indexOf(feed) === index) + .sort(); + if (!merged.length) { + merged = [ + 'https://mail.google.com/mail/u/0/feed/atom', + 'https://mail.google.com/mail/u/1/feed/atom', + 'https://mail.google.com/mail/u/2/feed/atom', + 'https://mail.google.com/mail/u/3/feed/atom', + 'https://mail.google.com/mail/u/4/feed/atom', + 'https://mail.google.com/mail/u/5/feed/atom' + ]; + } + return merged; + }; + + self.checkEmails = { + getCached() { + if (self.checkEmails.cached) { + return Promise.resolve(self.checkEmails.cached); + } + return read({ + 'cached-objects': [] + }, 'session').then(prefs => prefs['cached-objects']); + } + }; + self.checkEmails.execute = async forced => { + if (forced) { + button.icon = 'load'; + button.badge = 0; + // do not use -1; if the user is logged out, the loading need to be stopped + chrome.storage.session.set({count: 0}); + } + // Cancel previous execution? + if (self.checkEmails.controller) { + self.checkEmails.controller.abort(); + } + const prefs = await read({ + 'url': 'https://mail.google.com/mail/u/0', + 'feeds_0': '', + 'feeds_1': '', + 'feeds_2': '', + 'feeds_3': '', + 'feeds_4': '', + 'feeds_5': '', + 'feeds_custom': '', + 'timeout': 9000, + 'alphabetic': false, + 'notificationTruncate': 70, + 'combined': navigator.userAgent.includes('Firefox'), + 'maxReport': 3, + 'oldFashion': 0, + 'notification': true, + 'notification.buttons.markasread': true, + 'notification.buttons.archive': true, + 'notification.buttons.trash': false, + 'alert': true, + 'notificationFormat': chrome.i18n.getMessage('notification'), + 'accounts': {} + }); + + const controller = self.checkEmails.controller = new AbortController(); + const signal = controller.signal; + + const fdsr = buildFeeds(prefs); // requested feeds + // do not reduce the feed list from cookies. It is not reliable + const feeds = fdsr.map(feed => new Feed(feed, prefs.timeout, isPrivate)); + + try { + const objs = []; + let mn = -1; // keep track of the last logged-out account + const uids = new Set(); + for (const feed of feeds) { + if (mn !== -1) { + if (helper.id(feed.href) >= mn) { // belongs to a logged-out account + continue; + } + } + + const r = await feed.execute(signal, uid => { // do not check logged-out feeds + if (uid) { + if (uids.has(uid)) { // this is a logged-out account + const n = helper.id(feed.href); + mn = mn === -1 ? n : Math.min(mn, n); + + return true; + } + uids.add(uid); + } + }).catch(e => signal.aborted === false && log('[feed]', 'error', e)); + if (signal.aborted) { + return log('[feed]', 'skipped'); + } + if (r && r.notAuthorized && mn === -1) { + mn = helper.id(feed.href); + } + + if (r && r.xml) { + // only add logged-in accounts + if (r.network && !r.notAuthorized && r.xml && r.xml.entries) { + // meta + if (r.xml?.title) { + if (r.xml.title in prefs.accounts) { + r.meta = prefs.accounts[r.xml.title]; + } + if (!r.meta) { + r.meta = {}; + prefs.accounts[r.xml.title] = {}; + chrome.storage.local.set({ + accounts: prefs.accounts + }); + } + } + objs.push(r); + } + } + } + + log('[feed]', 'forced', forced, 'objects', objs); + + const isAuthorized = objs.length !== 0 && objs.some(c => !c.notAuthorized && c.network); + const count = await new Promise(resolve => chrome.storage.session.get({ + count: -1 + }, prefs => resolve(prefs.count))); + + if (!isAuthorized) { + if (count !== -1) { + button.icon = 'blue'; + button.badge = 0; + chrome.storage.session.set({count: -1}); + chrome.storage.session.set({ + 'cached-objects': [] + }); + if (self.checkEmails.cached) { + self.checkEmails.cached.length = 0; + } + context.accounts('logged.out'); + } + if (forced) { + self.openLink(prefs.url); + toast(chrome.i18n.getMessage('log_into_your_account')); + } + button.label = chrome.i18n.getMessage('gmail'); + detach(); + + log('[feed]', 'ignore checking', 'unauthorized'); + return; + } + // Sorting accounts + objs.sort((a, b) => { + const var1 = prefs.alphabetic ? a.xml.title : a.xml.link; + const var2 = prefs.alphabetic ? b.xml.title : b.xml.link; + if (var1 > var2) { + return 1; + } + if (var1 < var2) { + return -1; + } + return 0; + }); + // simplified version of objs for storing and sending between contexts + const cachedObjs = objs.map(o => { + const xml = { + ...o.xml + }; + delete xml.parent; + return { + newIDs: o.newIDs, + xml + }; + }); + + // Update cache (only copy a minimal object) + chrome.storage.session.set({ + 'cached-objects': cachedObjs + }); + + self.checkEmails.cached = objs; + // save new emails + for (const o of objs) { + o.commit(); + } + + // New total count number + const anyNewEmails = objs.filter(c => c.meta.ignored !== true).some(c => c.newIDs.length !== 0); + let newCount = 0; + for (const obj of objs) { + if (obj.meta.ignored === true) { + continue; + } + newCount += obj.xml.fullcount; + } + + if (!anyNewEmails && !forced && count === newCount) { + // Updating panel if it is open + chrome.runtime.sendMessage({ + method: 'update-date', + data: cachedObjs + }, () => { + if (chrome.runtime.lastError) { + return; + } + // maybe the current email is marked as read but still count is 20 (max value for non inbox labels) + chrome.runtime.sendMessage({ + method: 'validate-current', + data: cachedObjs + }); + }); + // we could have a new account with no new emails + chrome.storage.session.get({ + 'accounts.keys': [] + }, prefs => { + if (prefs['accounts.keys'].length !== objs.length) { + context.accounts('mismatch'); + } + }); + + return; // Everything is clear + } + // + chrome.storage.session.set({count: newCount}); + // + context.accounts('new.email'); + // Preparing the report + const reportArray = []; + for (const o of objs) { + if (o.meta.ignored === true) { + continue; + } + + (o.xml && o.xml.entries ? o.xml.entries : []).filter(e => { + if (anyNewEmails) { + return o.newIDs.includes(e.id); + } + return o.xml.fullcount !== 0; + }).forEach(e => { + e.parent = o; + reportArray.push(e); + }); + } + // keep recent ones + reportArray.sort((a, b) => { + return (new Date(b.modified)).getTime() - (new Date(a.modified)).getTime(); + }); + reportArray.splice(prefs.maxReport, reportArray.length); + + let report = reportArray.map(e => prefs.notificationFormat + .replace('[author_name]', e.author_name) + .replace('[author_email]', e.author_email) + .replace('[summary]', shorten(e.summary, prefs.notificationTruncate)) + .replace('[title]', shorten(e.title, prefs.notificationTruncate)) + .replace(/\[break\]/g, '\n')); + if (prefs.combined) { + report = [report.join('\n\n')]; + } + // Preparing the tooltip + button.label = chrome.i18n.getMessage('gmail') + '\n\n' + + objs.filter(c => c.meta.ignored !== true).reduce((p, c) => { + return p += + c.xml.title + + (c.xml.label ? ' [' + c.xml.label + ']' : '') + + ' (' + c.xml.fullcount + ')\n'; + }, '').replace(/\n$/, ''); + + const singleAccount = prefs.oldFashion === 1 ? + objs.filter(c => c.meta.ignored !== true) + .map(o => o.xml.rootLink).filter((s, i, l) => l.indexOf(s) === i).length === 1 : + prefs.oldFashion === 2; + // + if (!forced && !anyNewEmails) { + if (newCount) { + button.icon = 'red'; + button.badge = newCount; + chrome.storage.session.set({count: newCount}); + + chrome.runtime.sendMessage({ + method: 'update', + data: cachedObjs + }, () => chrome.runtime.lastError); + if (singleAccount) { + detach(); + } + else { + attach(); + } + } + else { + button.icon = 'gray'; + button.badge = 0; + chrome.storage.session.set({count: 0}); + detach(); + } + } + else if (forced && !newCount) { + button.icon = 'gray'; + button.badge = 0; + chrome.storage.session.set({count: 0}); + detach(); + } + else { + button.icon = 'new'; + button.badge = newCount; + chrome.storage.session.set({count: newCount}); + if (singleAccount) { + detach(); + } + else { + attach(); + } + + if (prefs.notification) { + const buttons = []; + if (prefs['notification.buttons.markasread']) { + buttons.push({ + title: chrome.i18n.getMessage('popup_read'), + iconUrl: '/data/images/read.png', + action: { + links: reportArray.map(o => o.link), + cmd: 'rd' + } + }); + } + if (prefs['notification.buttons.archive']) { + buttons.push({ + title: chrome.i18n.getMessage('popup_archive'), + iconUrl: '/data/images/archive.png', + action: { + links: reportArray.map(o => o.link), + cmd: 'rc_^i' + } + }); + } + if (prefs['notification.buttons.trash']) { + buttons.push({ + title: chrome.i18n.getMessage('popup_trash'), + iconUrl: '/data/images/trash.png', + action: { + links: reportArray.map(o => o.link), + cmd: 'tr' + } + }); + } + + // convert links + const links = []; + for (const o of reportArray) { + try { + const base = helper.base(o.link); + const thread = helper.thread(o.link); + + if (thread && o.parent.xml.link.indexOf('#') === -1) { + links.push(base + '/?shva=1#inbox/' + thread); + } + else if (thread) { + links.push(o.parent.xml.link + '/' + thread); + } + else { + links.push(o.link); + } + } + catch (e) { + console.error(e); + links.push(o.link); + } + } + notify(report, '', { + cmd: 'open', + links + }, buttons.slice(0, 2)); + } + if (prefs.alert) { + const entries = []; // new entries only + for (const o of objs) { + if (o.xml && o.newIDs.length) { + for (const entry of o.xml.entries) { + if (o.newIDs.includes(entry.id)) { + entries.push(entry); + } + } + } + } + sound.play(entries).catch(e => toast(e.message)); + } + chrome.runtime.sendMessage({ + method: 'update-reset', + data: cachedObjs + }, () => chrome.runtime.lastError); + } + } + catch (e) { + console.error(e); + } + }; +} + diff --git a/v3.classic/core/context.js b/v3.classic/core/context.js new file mode 100644 index 00000000..3a90803d --- /dev/null +++ b/v3.classic/core/context.js @@ -0,0 +1,284 @@ +/* global log, checkEmails, repeater */ +'use strict'; + +// https://github.com/inbasic/ignotifier/issues/620 +const once = () => { + if (once.done) { + return; + } + once.done = true; + + chrome.contextMenus.create({ + id: 'root.ctx', + title: chrome.i18n.getMessage('label_14'), + contexts: ['action'], + enabled: false + }, () => chrome.runtime.lastError); + chrome.contextMenus.create({ + id: 'ignored.ctx', + title: chrome.i18n.getMessage('label_15'), + contexts: ['action'], + enabled: false + }, () => chrome.runtime.lastError); + chrome.contextMenus.create({ + title: chrome.i18n.getMessage('label_3'), + contexts: ['action'], + id: 'disable.ctx' + }, () => chrome.runtime.lastError); + for (const id of ['4', '5', '6', '7', '8', '9', '13']) { + chrome.contextMenus.create({ + parentId: 'disable.ctx', + id: 'label_' + id, + title: chrome.i18n.getMessage('label_' + id), + contexts: ['action'] + }, () => chrome.runtime.lastError); + } + // reset silence menu on startup. The actual pref is false + chrome.storage.session.set({ // Firefox + silent: false + }); + chrome.contextMenus.create({ + title: chrome.i18n.getMessage('label_10'), + type: 'checkbox', + contexts: ['action'], + id: 'silent.ctx', + checked: false + }, () => { + if (chrome.runtime.lastError) { + chrome.contextMenus.update('silent.ctx', { + checked: true + }, () => chrome.runtime.lastError); + } + }); + chrome.contextMenus.create({ + title: chrome.i18n.getMessage('label_11'), + contexts: ['action'], + id: 'label_11' + }, () => chrome.runtime.lastError); + chrome.contextMenus.create({ + title: chrome.i18n.getMessage('label_1'), + contexts: ['action'], + id: 'label_1' + }, () => chrome.runtime.lastError); + // chrome.contextMenus.create({ + // title: chrome.i18n.getMessage('label_12'), + // contexts: ['action'], + // id: 'label_12' + // }, () => chrome.runtime.lastError); +}; +chrome.runtime.onInstalled.addListener(once); +chrome.runtime.onStartup.addListener(once); + +/* public methods */ +self.context = {}; +self.context.accounts = async reason => { + const accounts = new Map(); + const emails = new Set(); + for (const o of await checkEmails.getCached()) { + if (o.xml?.title) { + emails.add(o.xml.title); + } + const href = o.xml?.rootLink.replace(/\?.*/, ''); + if (href) { + accounts.set(href, { + title: o.xml.title + }); + } + } + chrome.contextMenus.update('root.ctx', { + enabled: accounts.size !== 0 + }); + // create a unique key to determine whether context menu needs update or not + const keys = [...accounts.keys()]; + chrome.storage.session.get({ + 'accounts.keys': [] + }, prefs => { + // do we need to update + if (prefs['accounts.keys'].join(',') === keys.join(',')) { + log('[menu]', 'accounts menu is up to date'); + return; + } + log('[menu]', `Reason: "${reason}"`, prefs['accounts.keys'], keys); + chrome.storage.session.set({ + 'accounts.keys': keys + }); + // remove old context menu items + for (const key of prefs['accounts.keys']) { + chrome.contextMenus.remove(key, () => chrome.runtime.lastError); + } + // add new items + for (const [id, {title}] of accounts) { + chrome.contextMenus.create({ + title, + id, + parentId: 'root.ctx', + contexts: ['action'] + }, () => chrome.runtime.lastError); + } + }); +}; + +{ + const silent = time => { + const next = time => { + chrome.storage.session.set({ + silent: true + }); + chrome.alarms.create('resume.alarm', { + when: Date.now() + time * 1000 + }); + }; + if (time === 'custom') { + chrome.storage.local.get({ + 'silentTime': 10 // minutes + }, prefs => next(prefs.silentTime * 60)); + } + else { + next(time); + } + }; + const resume = () => { + chrome.alarms.clear('resume.alarm'); + chrome.storage.session.set({ + silent: false + }); + }; + chrome.alarms.onAlarm.addListener(o => { + if (o.name === 'resume.alarm') { + resume(); + } + }); + chrome.storage.onChanged.addListener(ps => { + if (ps.silent) { + chrome.contextMenus.update('silent.ctx', { + checked: !ps.silent.newValue + }); + } + }); + + chrome.contextMenus.onClicked.addListener(info => { + const method = info.menuItemId; + + if (method.startsWith('http')) { + // convert /u/0 to /u/0/ + self.openLink(method + (/\/u\/\d$/.test(method) ? '/' : '')); + } + else if (method.startsWith('ignored:')) { + chrome.storage.local.get({ + accounts: {} + }).then(prefs => { + prefs.accounts[method.replace('ignored:', '')].ignored = info.checked === false; + chrome.storage.local.set(prefs); + }); + } + else if (method === 'root.ctx') { + chrome.storage.session.get({ + 'accounts.keys': [] + }, prefs => { + self.openLink(prefs['accounts.keys'][0]); + }); + } + else if (method === 'label_4') { + silent(300); + } + else if (method === 'label_5') { + silent(900); + } + else if (method === 'label_6') { + silent(1800); + } + else if (method === 'label_7') { + silent(3600); + } + else if (method === 'label_8') { + silent(7200); + } + else if (method === 'label_9') { + silent(18000); + } + else if (method === 'label_13') { + silent('custom'); + } + else if (method === 'label_11') { + chrome.storage.local.get({ + compose: 'https://mail.google.com/mail/?ui=2&view=cm' + }, prefs => self.openLink(prefs.compose)); + } + else if (method === 'silent.ctx') { + if (info.checked) { + resume(); + } + else { + chrome.storage.session.set({ + silent: true + }); + } + } + else if (method === 'label_1') { + repeater.reset('user.request'); + } + else if (method === 'label_12') { + self.openLink(chrome.runtime.getManifest().homepage_url); + } + }); +} + +// ignored list +{ + const update = () => chrome.storage.local.get({ + accounts: {} + }).then(prefs => { + const entries = Object.entries(prefs.accounts); + + for (const [title, o] of entries) { + chrome.contextMenus.create({ + title, + contexts: ['action'], + id: 'ignored:' + title, + parentId: 'ignored.ctx', + type: 'checkbox', + checked: o.ignored !== true + }, () => chrome.runtime.lastError); + } + chrome.contextMenus.update('ignored.ctx', { + enabled: entries.length > 0 + }); + }); + chrome.storage.onChanged.addListener(ps => { + if ('accounts' in ps) { + ps.accounts.newValue = ps.accounts.newValue || {}; + + // remove removed emails + if (ps.accounts.oldValue) { + const oldKeys = Object.keys(ps.accounts.oldValue); + for (const key of oldKeys) { + if (!(key in ps.accounts.newValue)) { + chrome.contextMenus.remove('ignored:' + key); + } + } + const newKeys = Object.keys(ps.accounts.newValue); + let check = false; + for (const key of newKeys) { + if (oldKeys.includes(key) === false) { + check = true; + break; + } + } + if (check === false) { + return; + } + } + update(); + } + }); + + const once = () => { + if (once.done) { + return; + } + once.done = true; + update(); + }; + chrome.runtime.onInstalled.addListener(once); + chrome.runtime.onStartup.addListener(once); +} diff --git a/v3.classic/core/offscreen.js b/v3.classic/core/offscreen.js new file mode 100644 index 00000000..46141a1f --- /dev/null +++ b/v3.classic/core/offscreen.js @@ -0,0 +1,49 @@ +/* global log */ + +const offscreen = { + busy: false, + cache: [] +}; + +offscreen.command = async request => { + if (offscreen.busy) { + return new Promise(resolve => { + offscreen.cache.push({request, resolve}); + }); + } + offscreen.busy = true; + + // do we have an active offscreen worker + const existingContexts = await chrome.runtime.getContexts({ + contextTypes: ['OFFSCREEN_DOCUMENT'] + }); + if (existingContexts.length === 0) { + log('[offscreen]', 'creating...'); + await chrome.offscreen.createDocument({ + url: '/core/offscreen/index.html', + reasons: ['AUDIO_PLAYBACK', 'DOM_SCRAPING'], + justification: 'parse a command or play alert' + }); + } + offscreen.busy = false; + for (const {request, resolve} of offscreen.cache) { + chrome.runtime.sendMessage({ + method: 'offscreen', + request + }, resolve); + } + offscreen.cache.length = 0; + + return new Promise(resolve => chrome.runtime.sendMessage({ + method: 'offscreen', + request + }, resolve)); +}; + +chrome.runtime.onMessage.addListener(request => { + if (request.method === 'exit-offscreen') { + chrome.offscreen.closeDocument().then(() => { + log('[offscreen]', 'exited'); + }); + } +}); diff --git a/v3.classic/core/offscreen/firefox/polyfill.js b/v3.classic/core/offscreen/firefox/polyfill.js new file mode 100644 index 00000000..8bbf4fde --- /dev/null +++ b/v3.classic/core/offscreen/firefox/polyfill.js @@ -0,0 +1,33 @@ +// Firefox workaround +chrome.offscreen = { + closeDocument() { + for (const e of document.querySelectorAll('iframe.offscreen')) { + e.remove(); + } + return Promise.resolve(); + }, + createDocument(q) { + if (document.querySelector('iframe.offscreen')) { + return Promise.reject(Error('ALREADY_ATTACHED')); + } + return new Promise(resolve => { + const e = document.createElement('iframe'); + e.classList.add('offscreen'); + e.addEventListener('load', () => { + e.addEventListener('load', resolve, { + once: true + }); + e.contentWindow.location.replace(q.url); + }, {once: true}); + document.body.append(e); + }); + } +}; +chrome.runtime.getContexts = function(q) { + if (q.contextTypes && q.contextTypes.includes('OFFSCREEN_DOCUMENT')) { + return Promise.resolve([...document.querySelectorAll('iframe.offscreen')]); + } + else { + return Promise.reject(Error('NOT_SUPPORTED')); + } +}; diff --git a/v3.classic/core/offscreen/gmail/core.js b/v3.classic/core/offscreen/gmail/core.js new file mode 100644 index 00000000..68db4bd2 --- /dev/null +++ b/v3.classic/core/offscreen/gmail/core.js @@ -0,0 +1,251 @@ +const gmail = {}; +const cache = { + iks: new Map(), + ats: new Map() +}; +gmail.page = n => { + if (cache.iks.has(n)) { + return Promise.resolve(cache.iks.get(n)); + } + + const page = localStorage.getItem('page-' + n) || `https://mail.google.com/mail/u/${n}/s/`; + + const next = async href => { + const r = await fetch(href, { + credentials: 'include' + }); + if (r.ok) { + const content = await r.text(); + const m = content.match(/ID_KEY\s*=\s*['"](?[^'"]*)['"]/); + + if (m) { + cache.iks.set(n, m.groups); + return m.groups; + } + const parser = new DOMParser(); + const doc = parser.parseFromString(content, 'text/html'); + const meta = doc.querySelector('meta[http-equiv="refresh"]'); + if (meta) { + const url = meta.content.split('url=')[1]; + if (url) { + const o = new URL(url, page); + localStorage.setItem('page-' + n, o.href); + + return next(o.href); + } + } + } + throw Error('core.js -> id_key'); + }; + + return next(page); +}; +gmail.at = n => { + if (cache.ats.has(n)) { + return Promise.resolve(cache.ats.get(n)); + } + + return new Promise((resolve, reject) => chrome.runtime.sendMessage({ + method: 'get-at', + n + }, at => { + if (at) { + cache.ats.set(n, at); + resolve(at); + } + // backup plan + else { + console.info('[core]', 'Using alternative method to get GAMIL_AT'); + + fetch(`https://mail.google.com/mail/u/${n}/h/`, { + credentials: 'include' + }).then(r => { + if (r.ok) { + return r.text(); + } + throw Error('core.js -> at -> ' + r.status); + }).then(content => { + const parser = new DOMParser(); + const doc = parser.parseFromString(content, 'text/html'); + + const e = doc.querySelector('a[href*="at="]'); + const input = doc.querySelector('[name="at"]'); // do you really want to use this view + + if (e) { + const args = new URLSearchParams(e.href.split('?')[1]); + if (args.has('at')) { + cache.ats.set(n, args.get('at')); + return resolve(args.get('at')); + } + } + if (input && input.value && input.value !== 'null') { + cache.ats.set(n, input.value); + return resolve(input.value); + } + throw Error('core.js -> at (h); Try to open Gmail in a browser tab to set the cookie'); + }).then(resolve, reject); + } + })); +}; + + +gmail.search = async ({url, query}) => { + const m = url.match(/u\/(?\d+)/); + if (m) { + const {n} = m.groups; + const {ik} = await gmail.page(n); + if (!ik) { + throw Error('core.js -> ik -> empty'); + } + const at = await gmail.at(n); + if (!at) { + throw Error('core.js -> at -> empty'); + } + const body = new URLSearchParams(); + body.append('s_jr', JSON.stringify([null, [ + [null, null, null, null, null, null, [null, true, false]], + [null, [null, query, 0, null, 80, null, null, null, false, [], [], true]] + ], 2, null, null, null, ik])); + + const href = `https://mail.google.com/mail/u/${n}/s/?v=or&ik=${ik}&at=${at}&subui=chrome&hl=en&ts=` + Date.now(); + const r = await fetch(href, { + method: 'POST', + credentials: 'include', + body + }); + if (!r.ok) { + throw Error('core.js -> body: ' + r.status); + } + const content = await r.text(); + // do we have access to the basic HTML + if (!content || content.includes('/spreauth')) { + const links = content.match(/\bhttps?:\/\/[^\s<>"'()]+/gi) || []; + const e = new Error('core.js -> permission_error'); + e.details = {links}; + + throw e; + } + + const parts = content.split(/\d+&/); + + const results = parts[2]; + const j = JSON.parse(results); + const entries = j[1][0][2][5].map(a => { + const entry = {}; + entry.subject = a[3]; + entry.thread = a[11]; + entry.labels = a[8] || []; + entry.date = a[7]; + entry.from = a[5]; + entry.text = a[4]; + + try { + if (a[10][2] === 1) { + entry.labels.push('STARRED'); + } + } + catch (e) {} + return entry; + }); + + return { + 'count': entries.length, + 'name': 'NA', + 'logged-in': true, + 'responseURL': r.responseURL, + entries + }; + } + else { + throw Error('core.js -> valid_m'); + } +}; + +gmail.action = async ({links, cmd, prefs}) => { + links = typeof links === 'string' ? [links] : links; + + const a = links.map(link => { + const m = link.match(/u\/(?\d+).*message_id=(?[^&]+)/); + if (m) { + return m.groups; + } + }).filter(o => o); + + if (a.length) { + const at = await gmail.at(a[0].n); + + if (!at) { + throw Error('core.js -> at'); + } + const {ik} = await gmail.page(a[0].n); + if (!ik) { + throw Error('core.js -> ik'); + } + + const action = { + command: 'l:all', + labels: [], + ids: [] + }; + + if (cmd === 'rd' || cmd === 'rd-all') { // mark as read + action.code = 3; + } + else if (cmd === 'rc_^i' || cmd === 'rc_Inbox') { // archive + action.code = 1; + if (prefs.doReadOnArchive === true || prefs.doReadOnArchive === 'true') { + gmail.action({ + links, + cmd: 'rd', + prefs + }); + } + } + else if (cmd === 'sp' || cmd === 'rc_Spam') { // report spam + action.code = 7; + } + else if (cmd === 'tr') { // trash + action.code = 9; + } + else if (cmd === 'st') { // star + action.code = 5; + } + else if (cmd === 'xst') { // remove star + action.code = 6; + } + else if (cmd.startsWith('rc_')) { // add or remove labels + // action.labels = cmd.slice(3); + } + if (!action.code) { + throw Error('core.js -> action_not_supported: ' + cmd); + } + + const body = new FormData(); + body.append('s_jr', JSON.stringify([null, [ + ...a.map(o => [null, null, null, [ + null, action.code, o.thread, (o.id || o.thread), action.command, [], action.labels, o.ids + ]]), + [null, null, null, null, null, null, [null, true, false]], + [null, null, null, null, null, null, [null, true, false]] + ], 2, null, null, null, ik])); + + const href = `https://mail.google.com/mail/u/${a[0].n}/s/?v=or&ik=${ik}&at=${at}&subui=chrome&hl=en&ts=` + Date.now(); + const r = await fetch(href, { + method: 'POST', + credentials: 'include', + body + }); + // do we have permission to do the action? + const content = await r.text(); + if (!content || content.includes('/spreauth')) { + const links = content.match(/\bhttps?:\/\/[^\s<>"'()]+/gi) || []; + const e = new Error('core.js -> permission_error'); + e.details = {links}; + + throw e; + } + + return r; + } + throw Error('core.js -> no_links'); +}; diff --git a/v3.classic/core/offscreen/index.html b/v3.classic/core/offscreen/index.html new file mode 100644 index 00000000..c4cd7af3 --- /dev/null +++ b/v3.classic/core/offscreen/index.html @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/v3.classic/core/offscreen/index.js b/v3.classic/core/offscreen/index.js new file mode 100644 index 00000000..0f783084 --- /dev/null +++ b/v3.classic/core/offscreen/index.js @@ -0,0 +1,98 @@ +/* global gmail */ +const ids = new Set(); + +const exit = () => { + clearTimeout(exit.id); + console.info('%c[offscreen iframe]', 'color:#ff9900', 'exit request', ids.size); + exit.id = setTimeout(() => { + if (ids.size === 0) { + chrome.runtime.sendMessage({ + method: 'exit-offscreen' + }); + } + }, 60000); +}; + +const play = request => new Promise((resolve, reject) => { + stop(); + const audio = document.createElement('audio'); + audio.setAttribute('preload', 'auto'); + audio.setAttribute('autobuffer', 'true'); + audio.setAttribute('autoplay', 'true'); + audio.onended = audio.onerror = e => { + ids.delete(request.id); + exit(); + }; + audio.iid = request.id; + document.body.append(audio); + + const {index, media, prefs} = request; + + const type = index === null ? media.default.type : media['custom' + index].type; + let path = '/data/sounds/' + type + '.mp4'; + if (type === 4) { + path = index === null ? media.default.file : media['custom' + index].file; + } + audio.src = path; + audio.volume = prefs.soundVolume / 100; + audio.play().then(() => resolve(true), e => reject(e)); +}); + +const stop = () => { + for (const e of document.querySelectorAll('audio')) { + e.pause(); + e.remove(); + ids.delete(e.iid); + } + exit(); +}; + +chrome.runtime.onMessage.addListener(({request, method}, sender, response) => { + if (method === 'offscreen') { + console.info('%c[offscreen iframe]', 'color:#ff9900', 'request', request); + clearTimeout(exit.id); + const id = request.cmd + ';' + Math.random(); + request.id = id; + ids.add(id); + + if (request.cmd === 'play') { + play(request).then(() => response(true), e => response({ + error: e.message + })); + + return true; + } + else if (request.cmd === 'stop') { + stop(request); + response(true); + ids.delete(request.id); + exit(); + } + else if (request.cmd === 'gmail.action') { + gmail.action(request.request).then(() => response(true)).catch(e => { + console.error(e); + response({ + message: e.message, + details: e.details + }); + }).finally(() => { + ids.delete(request.id); + exit(); + }); + return true; + } + else if (request.cmd === 'gmail.search') { + gmail.search(request.request).then(response).catch(e => { + console.error(e); + response({ + message: e.message, + details: e.details + }); + }).finally(() => { + ids.delete(request.id); + exit(); + }); + return true; + } + } +}); diff --git a/v3.classic/core/open.js b/v3.classic/core/open.js new file mode 100644 index 00000000..1884ddb9 --- /dev/null +++ b/v3.classic/core/open.js @@ -0,0 +1,134 @@ +/* global toast */ + +{ + const parseUri = str => { + const uri = new URL(str); + if (uri.hostname.startsWith('mail.google')) { + // https://mail.google.com/mail/u/0/#inbox + // https://mail.google.com/mail/u/0/#inbox/TEST_MESSAGE_ID + uri.messageId = (/message_id=([^&]*)|#[^/]*\/([^&]*)/.exec(uri.href) || [])[1] || uri.hash.split('/')[1] || ''; + { + const a = uri.hash.substr(1).replace('label/', '').split('/'); + a.pop(); + uri.label = a.length ? a.join('/') : ''; + } + } + return uri; + }; + + self.openLink = (url, inBackground, refresh) => { + url = url.replace('@private', ''); // some urls might end with "@private" for private mode + + chrome.storage.local.get({ + 'ignoreOpens': false, + 'searchMode': true, // true: current window only, false: all open windows + 'basic.html': false, + 'onGmailNotification': true, + 'currentTab': false, + 'newWindow': false, + 'relatedToCurrent': false, + 'background': false + }, async prefs => { + const mode = prefs.currentTab ? 2 : (prefs.newWindow ? 1 : 0); + + const tabs = prefs.ignoreOpens ? [] : await new Promise(resolve => { + const options = {}; + if (prefs.searchMode) { + options.currentWindow = true; + } + chrome.tabs.query(options, tabs => resolve(tabs.filter(t => t.url))); + }); + + const parse2 = parseUri(url); + // support for basic HTML + if (parse2.messageId && prefs['basic.html']) { + url = `${parse2.origin}${parse2.pathname}/h/?&th=${parse2.messageId}&v=c`.replace('//h', '/h'); + if (parse2.label) { + url += '&s=l&l=' + parse2.label; + } + } + + for (let i = 0; i < tabs.length; i++) { + const tab = tabs[i]; + if (tab.url === url) { + if (prefs.onGmailNotification && tab.active) { + toast(chrome.i18n.getMessage('msg_1')); + } + const options = { + active: true + }; + if (refresh) { + options.url = url; + } + chrome.tabs.update(tab.id, options); + chrome.windows.update(tab.windowId, { + focused: true + }); + return; + } + const parse1 = parseUri(tab.url); + // Only if Gmail + if ( + parse1.hostname.startsWith('mail.google') && + parse1.hostname === parse2.hostname && + parse1.pathname.indexOf(parse2.pathname) === 0 && + !/to=/.test(url) && + !/view=cm/.test(url) + ) { + const reload = refresh || + (parse2.messageId && tab.url.indexOf(parse2.messageId) === -1) || + (parse1.messageId && !parse2.messageId); // when opening INBOX when a thread page is open + + if (tab.active && !reload) { + if (prefs.onGmailNotification) { + chrome.windows.getCurrent().then(w => { + if (w.id === tab.windowId) { + toast(chrome.i18n.getMessage('msg_1')); + } + }); + } + } + const options = { + active: true + }; + if (reload) { + options.url = url; + } + chrome.tabs.update(tab.id, options); + chrome.windows.update(tab.windowId, { + focused: true + }); + + return; + } + } + if (mode === 2) { + chrome.tabs.query({ + active: true, + currentWindow: true + }, ([tab]) => chrome.tabs.update(tab.id, {url})); + } + else if (mode === 0) { + chrome.tabs.query({ + active: true, + currentWindow: true + }, ([tab]) => { + const options = { + url, + active: typeof inBackground === 'undefined' ? !prefs.background : !inBackground + }; + if (prefs.relatedToCurrent) { + options.index = tab.index + 1; + } + chrome.tabs.create(options); + }); + } + else { + chrome.windows.create({ + url, + focused: typeof inBackground === 'undefined' ? !prefs.background : !inBackground + }); + } + }); + }; +} diff --git a/v3.classic/core/repeater.js b/v3.classic/core/repeater.js new file mode 100644 index 00000000..5d3b846f --- /dev/null +++ b/v3.classic/core/repeater.js @@ -0,0 +1,140 @@ +/* global log, checkEmails */ +const repeater = { + reason: '' +}; +repeater.build = (type = 'normal', reason, delay) => chrome.storage.local.get({ + 'period': 120, // seconds + 'initialPeriod': 3 // seconds +}, async prefs => { + repeater.reason = reason; + + if (isNaN(delay)) { + if (type === 'normal') { + delay = (prefs.initialPeriod || 5) * 1000; + } + else if (type === 'fired') { + delay = prefs.period * 1000; + } + else { + delay = 100; + } + } + + const now = Date.now(); + const when = now + delay; + // ignore + if (type !== 'fired') { + const next = await chrome.alarms.get('repeater'); + if (next) { + if (next.scheduledTime > now) { + if ((when - next.scheduledTime) > 0) { + return log('[repeater]', 'ignored', when - next.scheduledTime); + } + } + } + } + log('[repeater]', `Reason: "${reason}"`, `Type: "${type}"`, `Delay: ${(delay / 1000).toFixed(2)}s`); + chrome.alarms.create('repeater', { + when, + periodInMinutes: prefs.period / 60 + }); +}); + +repeater.reset = (reason, delay) => repeater.build('now', reason, delay); + +/* alarm */ +chrome.alarms.onAlarm.addListener(o => { + if (o.name === 'repeater') { + repeater.build('fired', 'alarm.fired'); // make sure we can handle less than a minute calls + + const forced = ['user.request', 'options.changes', 'change.of.feeds', 'popup.forced'].includes(repeater.reason); + checkEmails.execute(forced); + + chrome.storage.local.get({ + 'initialPeriod': 3 // seconds + }, prefs => { + if (prefs.initialPeriod === 0) { // manual mode + chrome.alarms.onAlarm.remove('repeater'); + } + }); + } +}); +/* startup */ +{ + const once = () => { + if (once.done) { + return; + } + once.done = true; + repeater.build('normal', 'startup'); + }; + chrome.runtime.onStartup.addListener(once); + chrome.runtime.onInstalled.addListener(once); +} + +/* idle */ +{ + const observe = name => { + if (name === 'active') { + repeater.reset('exit.idle'); + } + }; + + const run = b => { + chrome.idle.onStateChanged.removeListener(observe); + if (b) { + chrome.idle.onStateChanged.addListener(observe); + } + }; + + chrome.storage.local.get({ + 'idle.watch': true + }).then(prefs => { + run(prefs['idle.watch']); + }); + + chrome.storage.onChanged.addListener(ps => { + if ('idle.watch' in ps) { + run(ps['idle.watch'].newValue); + } + }); + + { + const once = () => { + if (once.done) { + return; + } + once.done = true; + + chrome.storage.local.get({ + 'idle-detection': 5 // minutes + }, prefs => { + chrome.idle.setDetectionInterval(prefs['idle-detection'] * 60); + }); + }; + chrome.runtime.onStartup.addListener(once); + chrome.runtime.onInstalled.addListener(once); + } +} + +/* pref changes */ +chrome.storage.onChanged.addListener(prefs => { + if (prefs.minimal || + prefs.feeds_0 || prefs.feeds_1 || prefs.feeds_2 || prefs.feeds_3 || prefs.feeds_4 || prefs.feeds_5 || + prefs.feeds_custom + ) { + repeater.reset('change.of.feeds'); + } + if (prefs.clrPattern || prefs.badge) { + repeater.reset('options.changes'); + } + if (prefs.period) { + repeater.reset('period.changed'); + } + if (prefs.oldFashion) { + repeater.reset('options.changes'); + } + if (prefs.accounts) { + repeater.reset('change.of.ignored.list'); + } +}); diff --git a/v3.classic/core/sound.js b/v3.classic/core/sound.js new file mode 100644 index 00000000..f9366b69 --- /dev/null +++ b/v3.classic/core/sound.js @@ -0,0 +1,197 @@ +/* global log, offscreen */ + +const sound = {}; + +sound.play = (entries = [], error = () => {}) => new Promise((resolve, reject) => { + chrome.storage.session.get({ + silent: false + }, prefs => { + if (prefs.silent) { + log('[play]', 'aborted', 'silent mode'); + return; + } + chrome.storage.local.get({ + 'sound.state.active': true, + 'sound.state.idle': true, + 'sound.state.locked': true, + 'notification.sound.media.default.type': 0, + 'notification.sound.media.custom0.type': 0, + 'notification.sound.media.custom1.type': 0, + 'notification.sound.media.custom2.type': 0, + 'notification.sound.media.custom3.type': 0, + 'notification.sound.media.custom4.type': 0, + 'notification.sound.media.custom0.selector': 0, + 'notification.sound.media.custom1.selector': 0, + 'notification.sound.media.custom2.selector': 0, + 'notification.sound.media.custom3.selector': 0, + 'notification.sound.media.custom4.selector': 0, + 'notification.sound.media.custom0.filter': '', + 'notification.sound.media.custom1.filter': '', + 'notification.sound.media.custom2.filter': '', + 'notification.sound.media.custom3.filter': '', + 'notification.sound.media.custom4.filter': '', + 'notification.sound.media.default.file': null, + 'notification.sound.media.custom0.file': null, + 'notification.sound.media.custom1.file': null, + 'notification.sound.media.custom2.file': null, + 'notification.sound.media.custom3.file': null, + 'notification.sound.media.custom4.file': null, + 'alert': true, + 'soundVolume': 80 + }, async prefs => { + if ( + prefs['sound.state.active'] === false || + prefs['sound.state.idle'] === false || + prefs['sound.state.locked'] === false + ) { + const state = await chrome.idle.queryState(5 * 60); + if (prefs['sound.state.' + state] === false) { + log('[play]', 'aborted', 'unmatched idle state'); + return; + } + } + + const media = { + default: { + get type() { // 0-3: built-in, 4: user defined + return prefs['notification.sound.media.default.type']; + }, + get file() { + return prefs['notification.sound.media.default.file']; + }, + get mime() { + return prefs['notification.sound.media.default.mime']; + } + }, + custom0: { + get type() { // 0-3: built-in, 4: user defined + return prefs['notification.sound.media.custom0.type']; + }, + get file() { + return prefs['notification.sound.media.custom0.file']; + }, + get mime() { + return prefs['notification.sound.media.custom0.mime']; + }, + get filter() { + return prefs['notification.sound.media.custom0.filter']; + }, + get selector() { + return prefs['notification.sound.media.custom0.selector']; + } + }, + custom1: { + get type() { // 0-3: built-in, 4: user defined + return prefs['notification.sound.media.custom1.type']; + }, + get file() { + return prefs['notification.sound.media.custom1.file']; + }, + get mime() { + return prefs['notification.sound.media.custom1.mime']; + }, + get filter() { + return prefs['notification.sound.media.custom1.filter']; + }, + get selector() { + return prefs['notification.sound.media.custom1.selector']; + } + }, + custom2: { + get type() { // 0-3: built-in, 4: user defined + return prefs['notification.sound.media.custom2.type']; + }, + get file() { + return prefs['notification.sound.media.custom2.file']; + }, + get mime() { + return prefs['notification.sound.media.custom2.mime']; + }, + get filter() { + return prefs['notification.sound.media.custom2.filter']; + }, + get selector() { + return prefs['notification.sound.media.custom2.selector']; + } + }, + custom3: { + get type() { // 0-3: built-in, 4: user defined + return prefs['notification.sound.media.custom3.type']; + }, + get file() { + return prefs['notification.sound.media.custom3.file']; + }, + get mime() { + return prefs['notification.sound.media.custom3.mime']; + }, + get filter() { + return prefs['notification.sound.media.custom3.filter']; + }, + get selector() { + return prefs['notification.sound.media.custom3.selector']; + } + }, + custom4: { + get type() { // 0-3: built-in, 4: user defined + return prefs['notification.sound.media.custom4.type']; + }, + get file() { + return prefs['notification.sound.media.custom4.file']; + }, + get mime() { + return prefs['notification.sound.media.custom4.mime']; + }, + get filter() { + return prefs['notification.sound.media.custom4.filter']; + }, + get selector() { + return prefs['notification.sound.media.custom4.selector']; + } + } + }; + const filters = [0, 1, 2, 3, 4].map(index => ({ + filter: media['custom' + index].filter, + selector: media['custom' + index].selector, + index + })).filter(o => o.filter).filter(obj => { + const keyword = obj.filter.toLowerCase(); + if (obj.selector === 0) { + return entries.reduce((p, c) => { + return p || ( + c.author_email.toLowerCase().includes(keyword) || + c.author_name.toLowerCase().includes(keyword) + ); + }, false); + } + if (obj.selector === 1) { + return entries.reduce((p, c) => p || c.title.toLowerCase().includes(keyword), false); + } + if (obj.selector === 2) { + return entries.reduce((p, c) => p || c.summary.toLowerCase().includes(keyword), false); + } + return false; + }); + + offscreen.command({ + cmd: 'play', + media, + index: filters.length ? filters[0].index : null, + prefs: { + alert: prefs.alert, + soundVolume: prefs.soundVolume + } + }).then(b => { + if (b !== true && 'error' in b) { + reject(Error(b.error)); + } + else { + resolve(); + } + }); + }); + }); +}); + +sound.stop = () => offscreen.command({ + cmd: 'stop' +}); diff --git a/v3.classic/core/utils/feed.js b/v3.classic/core/utils/feed.js new file mode 100644 index 00000000..b5f3b52f --- /dev/null +++ b/v3.classic/core/utils/feed.js @@ -0,0 +1,280 @@ +/* global sax */ + +if (typeof importScripts !== 'undefined') { + self.importScripts('/core/utils/sax.js'); +} + +const convert = code => { + return new Promise((resolve, reject) => { + let tree; + + class Node { + constructor(name, attributes) { + this.name = name; + this.attributes = attributes; + this.children = []; + } + } + + const parser = sax.parser(false); + parser.onopentag = function(node) { + const child = new Node(node.name, node.attributes); + + if (!tree) { + tree = child; + } + else { + child.parent = tree; + tree.children.push(child); + tree = child; + } + }; + + parser.onclosetag = function(name) { + if (name === tree.name) { + if (tree.parent) { + tree = tree.parent; + } + } + }; + parser.ontext = text => tree.text = text; + parser.onend = () => { + resolve(tree); + }; + parser.onerror = e => reject(e); + parser.write(code).end(); + }); +}; + +class Feed { + #timeout; + #isPrivate; + constructor(feed, timeout, isPrivate) { + this.href = feed; + this.#timeout = timeout; + this.#isPrivate = isPrivate; + } + execute(signal, duplicated = () => false) { + const isPrivate = this.#isPrivate; + + // Sometimes id is wrong in the feed structure! + const fixID = link => { + const id = /u\/\d+/.exec(this.href); + if (id && id.length) { + return link.replace(/u\/\d+/, id[0]); + } + return link; + }; + const controller = new AbortController(); + signal.addEventListener('abort', () => controller.abort(signal.reason), { + signal: controller.signal + }); + const id = setTimeout(() => controller.abort('TIMEOUT'), this.#timeout); + const href = this.href + '?rand=' + Math.round(Math.random() * 10000000); + return fetch(href, { + method: 'GET', + cache: 'no-store', + signal + }).then(async r => { + if (!r.ok) { + clearTimeout(id); + return { + isPrivate, + network: r.status !== 0, + notAuthorized: r.status === 401, + xml: null, + newIDs: [] + }; + } + if (r.url.includes('/u/0/') && this.href.includes('/u/0/') === false) { + clearTimeout(id); + return { + isPrivate, + network: r.status !== 0, + notAuthorized: true, + xml: null, + newIDs: [] + }; + } + + const content = await r.text(); + clearTimeout(id); + // global id + const uid = (content.split('')[1] || '').split('')[0]; + if (uid) { + if (duplicated(uid)) { + return { + isPrivate, + network: r.status !== 0, + notAuthorized: true, + xml: null, + newIDs: [] + }; + } + } + // + const tree = await convert(content); + + const xml = { + get fullcount() { + let one = 0; + for (const node of tree.children) { + if (node.name === 'FULLCOUNT') { + one = Number(node.text); + break; + } + } + const two = tree.children.filter(o => o.name === 'ENTRY').length; + + return Math.max(one, two); + }, + get id() { + return uid; + }, + get title() { + let title = ''; + for (const node of tree.children) { + if (node.name === 'TITLE') { + title = node.text; + break; + } + } + try { + return title.match(/[^ ]+@.+\.[^ ]+/)[0]; + } + catch (e) { + return title; + } + }, + get label() { + for (const node of tree.children) { + if (node.name === 'TAGLINE') { + const match = node.text.match(/'(.*)' label/); + if (match && match.length == 2) { + return match[1]; + } + } + } + return ''; + }, + get link() { + let temp = this.rootLink; + const label = this.label; + if (label) { + temp += '/?shva=1#label/' + label; + } + // account selector uses this url as account identifier + if (isPrivate) { + temp += '@private'; + } + return temp; + }, + get rootLink() { + let temp = 'https://mail.google.com/mail/u/0'; + // Inbox href + for (const node of tree.children) { + if (node.name === 'LINK') { + temp = node.attributes?.HREF; + break; + } + } + temp = temp.replace('http://', 'https://'); + return fixID(temp); + }, + get authorized() { + for (const node of tree.children) { + if (node.name === 'TITLE') { + return true; + } + } + return false; + }, + get entries() { + return tree.children.filter(o => o.name === 'ENTRY').map(node => { + const o = {}; + for (const c of node.children) { + if (c.name === 'TITLE') { + o.title = c.text; + } + else if (c.name === 'SUMMARY') { + o.summary = c.text; + } + else if (c.name === 'MODIFIED') { + o.modified = c.text; + } + else if (c.name === 'ISSUED') { + o.issued = c.text; + } + else if (c.name === 'ID') { + o.id = c.text; + } + else if (c.name === 'LINK') { + o.link = fixID((c.attributes.HREF || '').replace('http://', 'https://')); + } + else if (c.name === 'AUTHOR') { + for (const nn of c.children) { + if (nn.name === 'NAME') { + o['author_name'] = nn.text; + } + else if (nn.name === 'EMAIL') { + o['author_email'] = nn.text; + } + } + } + } + o['author_name'] = o['author_name'] || chrome.i18n.getMessage('msg_1'); + o['author_email'] = o['author_email'] || ''; + o.title = o.title || ''; + o.summary = o.summary || ''; + + return o; + }); + } + }; + const key = 'ids.account.' + xml.title; + return new Promise(resolve => { + chrome.storage.local.get({ + [key]: [], + 'threatAsNew': 10 // minutes + }, prefs => { + const newIDs = []; + const oldIDs = []; + const now = Date.now(); + for (const {id, modified} of xml.entries) { + const age = (now - (new Date(modified)).getTime()); + if (age > 1000 * 60 * prefs.threatAsNew) { + oldIDs.push(id); + } + else if (prefs[key].includes(id)) { + oldIDs.push(id); + } + else { + newIDs.push(id); + } + } + resolve({ + isPrivate, + network: true, + notAuthorized: xml.authorized === false, + xml, + newIDs, + // we postpone the save of new ids to make sure the request is not being aborted + commit() { + if (newIDs.length) { + chrome.storage.local.set({ + [key]: [ + ...oldIDs, + ...newIDs + ] + }); + } + } + }); + }); + }); + }).catch(e => { + clearTimeout(id); + throw e; + }); + } +} diff --git a/v3.classic/core/utils/log.js b/v3.classic/core/utils/log.js new file mode 100644 index 00000000..fcc10194 --- /dev/null +++ b/v3.classic/core/utils/log.js @@ -0,0 +1,30 @@ +const log = (origin, ...args) => { + const cc = [ + '#ff0099', + '#ff9900', + '#c46dff', + '#0099ff', + '#66cc00', + '#00cc66' + ]; + + let n = 0; + switch (origin) { + case '[offscreen]': + n = 1; + break; + case '[menu]': + n = 2; + break; + case '[feed]': + n = 3; + break; + case '[repeater]': + n = 4; + break; + case '[play]': + n = 5; + break; + } + console.info('%c' + origin, 'color:' + cc[n], ...args); +}; diff --git a/v3.classic/core/utils/sax.js b/v3.classic/core/utils/sax.js new file mode 100644 index 00000000..795d607e --- /dev/null +++ b/v3.classic/core/utils/sax.js @@ -0,0 +1,1565 @@ +;(function (sax) { // wrapper for non-node envs + sax.parser = function (strict, opt) { return new SAXParser(strict, opt) } + sax.SAXParser = SAXParser + sax.SAXStream = SAXStream + sax.createStream = createStream + + // When we pass the MAX_BUFFER_LENGTH position, start checking for buffer overruns. + // When we check, schedule the next check for MAX_BUFFER_LENGTH - (max(buffer lengths)), + // since that's the earliest that a buffer overrun could occur. This way, checks are + // as rare as required, but as often as necessary to ensure never crossing this bound. + // Furthermore, buffers are only tested at most once per write(), so passing a very + // large string into write() might have undesirable effects, but this is manageable by + // the caller, so it is assumed to be safe. Thus, a call to write() may, in the extreme + // edge case, result in creating at most one complete copy of the string passed in. + // Set to Infinity to have unlimited buffers. + sax.MAX_BUFFER_LENGTH = 64 * 1024 + + var buffers = [ + 'comment', 'sgmlDecl', 'textNode', 'tagName', 'doctype', + 'procInstName', 'procInstBody', 'entity', 'attribName', + 'attribValue', 'cdata', 'script' + ] + + sax.EVENTS = [ + 'text', + 'processinginstruction', + 'sgmldeclaration', + 'doctype', + 'comment', + 'opentagstart', + 'attribute', + 'opentag', + 'closetag', + 'opencdata', + 'cdata', + 'closecdata', + 'error', + 'end', + 'ready', + 'script', + 'opennamespace', + 'closenamespace' + ] + + function SAXParser (strict, opt) { + if (!(this instanceof SAXParser)) { + return new SAXParser(strict, opt) + } + + var parser = this + clearBuffers(parser) + parser.q = parser.c = '' + parser.bufferCheckPosition = sax.MAX_BUFFER_LENGTH + parser.opt = opt || {} + parser.opt.lowercase = parser.opt.lowercase || parser.opt.lowercasetags + parser.looseCase = parser.opt.lowercase ? 'toLowerCase' : 'toUpperCase' + parser.tags = [] + parser.closed = parser.closedRoot = parser.sawRoot = false + parser.tag = parser.error = null + parser.strict = !!strict + parser.noscript = !!(strict || parser.opt.noscript) + parser.state = S.BEGIN + parser.strictEntities = parser.opt.strictEntities + parser.ENTITIES = parser.strictEntities ? Object.create(sax.XML_ENTITIES) : Object.create(sax.ENTITIES) + parser.attribList = [] + + // namespaces form a prototype chain. + // it always points at the current tag, + // which protos to its parent tag. + if (parser.opt.xmlns) { + parser.ns = Object.create(rootNS) + } + + // mostly just for error reporting + parser.trackPosition = parser.opt.position !== false + if (parser.trackPosition) { + parser.position = parser.line = parser.column = 0 + } + emit(parser, 'onready') + } + + if (!Object.create) { + Object.create = function (o) { + function F () {} + F.prototype = o + var newf = new F() + return newf + } + } + + if (!Object.keys) { + Object.keys = function (o) { + var a = [] + for (var i in o) if (o.hasOwnProperty(i)) a.push(i) + return a + } + } + + function checkBufferLength (parser) { + var maxAllowed = Math.max(sax.MAX_BUFFER_LENGTH, 10) + var maxActual = 0 + for (var i = 0, l = buffers.length; i < l; i++) { + var len = parser[buffers[i]].length + if (len > maxAllowed) { + // Text/cdata nodes can get big, and since they're buffered, + // we can get here under normal conditions. + // Avoid issues by emitting the text node now, + // so at least it won't get any bigger. + switch (buffers[i]) { + case 'textNode': + closeText(parser) + break + + case 'cdata': + emitNode(parser, 'oncdata', parser.cdata) + parser.cdata = '' + break + + case 'script': + emitNode(parser, 'onscript', parser.script) + parser.script = '' + break + + default: + error(parser, 'Max buffer length exceeded: ' + buffers[i]) + } + } + maxActual = Math.max(maxActual, len) + } + // schedule the next check for the earliest possible buffer overrun. + var m = sax.MAX_BUFFER_LENGTH - maxActual + parser.bufferCheckPosition = m + parser.position + } + + function clearBuffers (parser) { + for (var i = 0, l = buffers.length; i < l; i++) { + parser[buffers[i]] = '' + } + } + + function flushBuffers (parser) { + closeText(parser) + if (parser.cdata !== '') { + emitNode(parser, 'oncdata', parser.cdata) + parser.cdata = '' + } + if (parser.script !== '') { + emitNode(parser, 'onscript', parser.script) + parser.script = '' + } + } + + SAXParser.prototype = { + end: function () { end(this) }, + write: write, + resume: function () { this.error = null; return this }, + close: function () { return this.write(null) }, + flush: function () { flushBuffers(this) } + } + + var Stream + try { + Stream = require('stream').Stream + } catch (ex) { + Stream = function () {} + } + + var streamWraps = sax.EVENTS.filter(function (ev) { + return ev !== 'error' && ev !== 'end' + }) + + function createStream (strict, opt) { + return new SAXStream(strict, opt) + } + + function SAXStream (strict, opt) { + if (!(this instanceof SAXStream)) { + return new SAXStream(strict, opt) + } + + Stream.apply(this) + + this._parser = new SAXParser(strict, opt) + this.writable = true + this.readable = true + + var me = this + + this._parser.onend = function () { + me.emit('end') + } + + this._parser.onerror = function (er) { + me.emit('error', er) + + // if didn't throw, then means error was handled. + // go ahead and clear error, so we can write again. + me._parser.error = null + } + + this._decoder = null + + streamWraps.forEach(function (ev) { + Object.defineProperty(me, 'on' + ev, { + get: function () { + return me._parser['on' + ev] + }, + set: function (h) { + if (!h) { + me.removeAllListeners(ev) + me._parser['on' + ev] = h + return h + } + me.on(ev, h) + }, + enumerable: true, + configurable: false + }) + }) + } + + SAXStream.prototype = Object.create(Stream.prototype, { + constructor: { + value: SAXStream + } + }) + + SAXStream.prototype.write = function (data) { + if (typeof Buffer === 'function' && + typeof Buffer.isBuffer === 'function' && + Buffer.isBuffer(data)) { + if (!this._decoder) { + var SD = require('string_decoder').StringDecoder + this._decoder = new SD('utf8') + } + data = this._decoder.write(data) + } + + this._parser.write(data.toString()) + this.emit('data', data) + return true + } + + SAXStream.prototype.end = function (chunk) { + if (chunk && chunk.length) { + this.write(chunk) + } + this._parser.end() + return true + } + + SAXStream.prototype.on = function (ev, handler) { + var me = this + if (!me._parser['on' + ev] && streamWraps.indexOf(ev) !== -1) { + me._parser['on' + ev] = function () { + var args = arguments.length === 1 ? [arguments[0]] : Array.apply(null, arguments) + args.splice(0, 0, ev) + me.emit.apply(me, args) + } + } + + return Stream.prototype.on.call(me, ev, handler) + } + + // this really needs to be replaced with character classes. + // XML allows all manner of ridiculous numbers and digits. + var CDATA = '[CDATA[' + var DOCTYPE = 'DOCTYPE' + var XML_NAMESPACE = 'http://www.w3.org/XML/1998/namespace' + var XMLNS_NAMESPACE = 'http://www.w3.org/2000/xmlns/' + var rootNS = { xml: XML_NAMESPACE, xmlns: XMLNS_NAMESPACE } + + // http://www.w3.org/TR/REC-xml/#NT-NameStartChar + // This implementation works on strings, a single character at a time + // as such, it cannot ever support astral-plane characters (10000-EFFFF) + // without a significant breaking change to either this parser, or the + // JavaScript language. Implementation of an emoji-capable xml parser + // is left as an exercise for the reader. + var nameStart = /[:_A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]/ + + var nameBody = /[:_A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\u00B7\u0300-\u036F\u203F-\u2040.\d-]/ + + var entityStart = /[#:_A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]/ + var entityBody = /[#:_A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\u00B7\u0300-\u036F\u203F-\u2040.\d-]/ + + function isWhitespace (c) { + return c === ' ' || c === '\n' || c === '\r' || c === '\t' + } + + function isQuote (c) { + return c === '"' || c === '\'' + } + + function isAttribEnd (c) { + return c === '>' || isWhitespace(c) + } + + function isMatch (regex, c) { + return regex.test(c) + } + + function notMatch (regex, c) { + return !isMatch(regex, c) + } + + var S = 0 + sax.STATE = { + BEGIN: S++, // leading byte order mark or whitespace + BEGIN_WHITESPACE: S++, // leading whitespace + TEXT: S++, // general stuff + TEXT_ENTITY: S++, // & and such. + OPEN_WAKA: S++, // < + SGML_DECL: S++, // + SCRIPT: S++, // + + + + diff --git a/v3.classic/data/options/index.js b/v3.classic/data/options/index.js new file mode 100644 index 00000000..ac3f78fe --- /dev/null +++ b/v3.classic/data/options/index.js @@ -0,0 +1,142 @@ +/* global config */ +'use strict'; + +const notify = msg => new Promise((resolve, reject) => { + const e = document.getElementById('notify'); + e.querySelector('div').textContent = msg; + e.showModal(); + e.onclick = ({target}) => { + const cmd = target.dataset.cmd; + if (cmd) { + e.close(); + } + if (cmd === 'yes') { + resolve(); + } + if (cmd === 'no') { + reject(Error('abort')); + } + }; +}); + +function restore() { + chrome.storage.local.get(config.prefs, prefs => Object.entries(prefs).forEach(([key, value]) => { + try { + if (config.map.checkbox.indexOf(key) === -1) { + document.getElementById(key).value = value; + } + else { + document.getElementById(key).checked = value; + } + } + catch (e) { + console.error(e); + } + })); +} + +document.addEventListener('change', e => { + const target = e.target; + const key = target.id; + let value = target.value; + if (key && target.validity.valid) { + if (config.map.number.indexOf(key) !== -1) { + value = Number(value); + } + else if (config.map.checkbox.indexOf(key) !== -1) { + value = target.checked; + } + if (/^feeds_[012345]$/.test(key)) { + target.value = value = value.split(',') + .map(tag => tag + .replace(/^\s\s*/, '') + .replace(/\s\s*$/, '') + .replace(/\s/g, '-') + .replace(/\//g, '-') + .replace(/^"/g, '') + .replace(/"$/g, '') + .toLowerCase() + ) + .filter(tag => tag) // remove empty tags + .filter((t, i, a) => a.indexOf(t) === i) // remove duplicate tags + .join(', '); + } + else if (key === 'feeds_custom') { + target.value = value = target.value.split(/\s*,\s*/).map(s => { + try { + const uri = new URL(s); + if (uri.protocol.startsWith('http')) { + return s; + } + } + catch (e) {} + return ''; + }).filter(s => s).join(', '); + } + else if (key === 'notificationTruncate') { + if (value % 2) { // odd number + value += 1; + target.value = value; + } + } + else if (key.startsWith('notification.sound.media.') && key.endsWith('.type') && value === 4) { + target.parentNode.querySelector('label').style.display = 'inline-block'; + } + else if (key.endsWith('.file')) { + const file = target.files[0]; + + if (file.type.startsWith('audio/') || file.type.startsWith('video/')) { + const reader = new FileReader(); + reader.onload = e => { + chrome.storage.local.set({ + [key]: e.target.result + }, () => { + const lastError = chrome.runtime.lastError; + if (lastError) { + alert(lastError.message); + } + else { + chrome.storage.local.set({ + [key.replace('.file', '.mime')]: file.type + }); + target.parentNode.style.display = 'none'; + } + }); + }; + reader.onerror = e => alert(e.meesage || e); + reader.readAsDataURL(file); + } + else { + window.alert(`This file is not supported. Mime-type is "${file.type}"`); + } + return; + } + chrome.storage.local.set({ + [key]: value + }); + } +}); + +document.addEventListener('input', ({target}) => { + const key = target.id; + if (key === 'resetPeriod') { + const value = Number(target.value); + target.setCustomValidity(value === 0 || value > 4 ? '' : 'Value must be zero or greater than 4'); + } +}); + +document.addEventListener('DOMContentLoaded', restore); + +document.getElementById('reset').addEventListener('click', () => { + notify('Are you sure you want to reset all the preferences back to the default values?').then(() => { + chrome.storage.local.set(config.prefs, () => location.reload()); + }).catch(() => {}); +}); + +document.getElementById('reset-accounts').onclick = () => chrome.storage.local.remove('accounts'); + +document.getElementById('test-play').addEventListener('click', () => chrome.runtime.sendMessage({ + method: 'test-play' +})); + +document.getElementById('donation').href = chrome.runtime.getManifest().homepage_url + '?rd=donate'; diff --git a/v3.classic/data/popup/accessibility.js b/v3.classic/data/popup/accessibility.js new file mode 100644 index 00000000..a544903f --- /dev/null +++ b/v3.classic/data/popup/accessibility.js @@ -0,0 +1,58 @@ +/* global qs */ +'use strict'; + +// Link opener for html +const opener = self.opener = e => { + const target = e.target; + + const a = target.closest('a') || target; + const link = a.dataset.href || a.href || a.src || target.src || target.href; + + if (link) { + e.preventDefault(); + e.stopPropagation(); + chrome.runtime.sendMessage({ + method: 'open', + url: { + link, + button: e.button, + ctrlKey: e.ctrlKey, + shiftKey: e.shiftKey, + altKey: e.altKey, + metaKey: e.metaKey + } + }, () => e.button === 0 ? window.close() : null); + } +}; +addEventListener('click', opener); + +// Support Gmail's keyboard shortcuts on the panel +const keyup = self.keyup = e => { + if (!keyup.doKeyUp) { + return; + } + + if (e.keyCode === 49 && e.shiftKey) { + qs('spam').click(); + } + if (e.keyCode === 51 && e.shiftKey) { + qs('trash').click(); + } + if (e.keyCode === 73 && e.shiftKey) { + qs('read').click(); + } + if (e.keyCode === 69) { + qs('archive').click(); + } +}; +chrome.storage.local.get({ + keyUp: false +}, prefs => keyup.doKeyUp = prefs.keyUp); + +addEventListener('keyup', keyup); + +window.focus(); + +chrome.runtime.sendMessage({ + method: 'stop-sound' +}); diff --git a/v3.classic/data/popup/body/index.css b/v3.classic/data/popup/body/index.css new file mode 100644 index 00000000..8122b016 --- /dev/null +++ b/v3.classic/data/popup/body/index.css @@ -0,0 +1,68 @@ +body { + background-color: #fff; + color: #222; + font: 12.8px arial, sans-serif; +} +body, +td { + font-size: 13px; +} +a { + color: #15c; + cursor: pointer; +} +a:visited { + color: #61c; +} +img { + border: 0; +} +pre { + white-space: pre; + white-space: -moz-pre-wrap; + white-space: -o-pre-wrap; + white-space: pre-wrap; + word-wrap: break-word; + max-width: 800px; + overflow: auto; +} + +/* custom CSS */ +.root { + width: 100%; + border-collapse: collapse; + border: none; +} +body { + margin: 0; +} +body.summary { + white-space: pre-wrap; +} +table { + color: inherit; +} + +html { + color-scheme: light; + scrollbar-color: #626262 #fff; +} +html.dark { + background-color: #fff; + filter: hue-rotate(180deg) invert(100%); + color-scheme: dark; + scrollbar-color: #9d9d9d #000; +} +html.dark em, +html.dark img, +html.dark svg, +html.dark image, +html.dark video, +html.dark audio, +html.dark embed, +html.dark iframe, +html.dark object, +html.dark button, +html.dark canvas { + filter: hue-rotate(180deg) invert(100%); +} diff --git a/v3.classic/data/popup/body/index.html b/v3.classic/data/popup/body/index.html new file mode 100644 index 00000000..c760b826 --- /dev/null +++ b/v3.classic/data/popup/body/index.html @@ -0,0 +1,13 @@ + + + + + + + + + + + +Loading... + diff --git a/v3.classic/data/popup/body/index.js b/v3.classic/data/popup/body/index.js new file mode 100644 index 00000000..1fa0e0a9 --- /dev/null +++ b/v3.classic/data/popup/body/index.js @@ -0,0 +1,51 @@ +{ + const block = e => { + const target = e.target; + + const a = target.closest('a') || target; + const url = a.dataset.href || a.href || a.src || target.src || target.href; + + if (url) { + e.preventDefault(); + e.stopPropagation(); + + chrome.tabs.query({ + active: true, + lastFocusedWindow: true + }, tabs => { + chrome.tabs.create({ + url, + active: false, // allow the user to open multiple links + index: tabs && tabs.length ? tabs[0].index + 1 : undefined + }); + }); + return false; + } + return true; + }; + + // https://github.com/inbasic/ignotifier/issues/634 + onclick = e => { + if (e.button === 0 && (e.ctrlKey || e.metaKey)) { + return block(e); + } + return true; + }; + onauxclick = e => { + if (e.button === 1) { + return block(e); + } + return true; + }; +} + +// Key binding +addEventListener('keyup', top.keyup); + +// styling +// styling +chrome.storage.local.get({ + 'styling_body': '' +}, prefs => { + document.getElementById('styling_body').textContent = prefs['styling_body']; +}); diff --git a/v3.classic/data/popup/fetch.gif b/v3.classic/data/popup/fetch.gif new file mode 100644 index 00000000..d896b070 Binary files /dev/null and b/v3.classic/data/popup/fetch.gif differ diff --git a/v3.classic/data/popup/gmail.js b/v3.classic/data/popup/gmail.js new file mode 100644 index 00000000..dc336efe --- /dev/null +++ b/v3.classic/data/popup/gmail.js @@ -0,0 +1,106 @@ +'use strict'; + +const gmail = {}; + +/* gmail.get */ +gmail.get = { + base: url => /[^?]*/.exec(url)[0], + id: url => { + const tmp = /message_id=([^&]*)/.exec(url); + if (tmp && tmp.length) { + return tmp[1]; + } + return null; + } +}; + +/* gmail.body */ +{ + const cache = {}; + + gmail.body = (link, mode) => { + link = link.replace('http://', 'https://'); + + if (cache[link]) { + return Promise.resolve(cache[link]); + } + + const url = gmail.get.base(link); + const thread = gmail.get.id(link); + + if (!thread) { + return Promise.reject(Error('body -> Error at resolving thread. Please switch back to the summary mode.')); + } + + const href = url + '/?ui=2&view=pt&dsqt=1&search=all&msg=' + thread; + + return fetch(href, { + credentials: 'include' + }).then(r => { + if (!r.ok) { + throw Error('body -> print failed -> ' + r.status); + } + return r.text(); + }).then(content => { + const body = gmail.render[mode ? 'getHTMLText' : 'getPlainText'](content, url, link); + cache[link] = body; + return body; + }); + }; +} + +/* gmail.render */ +{ + const getLastMessage = content => { + const doc = new DOMParser().parseFromString(content, 'text/html'); + + const m = doc.querySelectorAll('.message > tbody > tr > td:last-child'); + if (m.length) { + const td = m[m.length - 1]; + for (const a of td.querySelectorAll('a')) { + if (a.href) { + // prevent Google redirection + if (a.href.startsWith('https://www.google.com/url?q=')) { + try { + const args = (new URL(a.href)).searchParams; + a.href = args.get('q') || a.href; + } + catch (e) {} + } + } + } + return td; + } + return ''; + }; + gmail.render = { + getHTMLText(content) { + const td = getLastMessage(content); + if (td) { + // remove extra padding + for (const table of td.querySelectorAll('table[cellpadding="12"]')) { + table.removeAttribute('cellpadding'); + } + // + const table = document.createElement('table'); + table.classList.add('root'); + const tr = document.createElement('tr'); + table.appendChild(tr); + tr.appendChild(td); + + return table; + } + return ''; + }, + getPlainText(content) { + const td = getLastMessage(content); + if (td) { + const span = document.createElement('span'); + span.style['white-space'] = 'pre-line'; + span.textContent = td.innerText; + return span; + } + return ''; + } + }; +} diff --git a/v3.classic/data/popup/icons.png b/v3.classic/data/popup/icons.png new file mode 100644 index 00000000..36e8ed1b Binary files /dev/null and b/v3.classic/data/popup/icons.png differ diff --git a/v3.classic/data/popup/icons/archive.png b/v3.classic/data/popup/icons/archive.png new file mode 100644 index 00000000..73155126 Binary files /dev/null and b/v3.classic/data/popup/icons/archive.png differ diff --git a/v3.classic/data/popup/icons/arrow_drop_down.png b/v3.classic/data/popup/icons/arrow_drop_down.png new file mode 100644 index 00000000..25122b9b Binary files /dev/null and b/v3.classic/data/popup/icons/arrow_drop_down.png differ diff --git a/v3.classic/data/popup/icons/check.png b/v3.classic/data/popup/icons/check.png new file mode 100644 index 00000000..56b23623 Binary files /dev/null and b/v3.classic/data/popup/icons/check.png differ diff --git a/v3.classic/data/popup/icons/check_all.png b/v3.classic/data/popup/icons/check_all.png new file mode 100644 index 00000000..5c81b114 Binary files /dev/null and b/v3.classic/data/popup/icons/check_all.png differ diff --git a/v3.classic/data/popup/icons/check_box.png b/v3.classic/data/popup/icons/check_box.png new file mode 100644 index 00000000..04f1dc82 Binary files /dev/null and b/v3.classic/data/popup/icons/check_box.png differ diff --git a/v3.classic/data/popup/icons/chevron_left.png b/v3.classic/data/popup/icons/chevron_left.png new file mode 100644 index 00000000..a61961b7 Binary files /dev/null and b/v3.classic/data/popup/icons/chevron_left.png differ diff --git a/v3.classic/data/popup/icons/chevron_right.png b/v3.classic/data/popup/icons/chevron_right.png new file mode 100644 index 00000000..ab326e3b Binary files /dev/null and b/v3.classic/data/popup/icons/chevron_right.png differ diff --git a/v3.classic/data/popup/icons/dark.png b/v3.classic/data/popup/icons/dark.png new file mode 100644 index 00000000..6e5efccc Binary files /dev/null and b/v3.classic/data/popup/icons/dark.png differ diff --git a/v3.classic/data/popup/icons/delete.png b/v3.classic/data/popup/icons/delete.png new file mode 100644 index 00000000..98cdd870 Binary files /dev/null and b/v3.classic/data/popup/icons/delete.png differ diff --git a/v3.classic/data/popup/icons/inbox.png b/v3.classic/data/popup/icons/inbox.png new file mode 100644 index 00000000..20b0d08f Binary files /dev/null and b/v3.classic/data/popup/icons/inbox.png differ diff --git a/v3.classic/data/popup/icons/list.png b/v3.classic/data/popup/icons/list.png new file mode 100644 index 00000000..91651169 Binary files /dev/null and b/v3.classic/data/popup/icons/list.png differ diff --git a/v3.classic/data/popup/icons/refresh.png b/v3.classic/data/popup/icons/refresh.png new file mode 100644 index 00000000..3b54a9d9 Binary files /dev/null and b/v3.classic/data/popup/icons/refresh.png differ diff --git a/v3.classic/data/popup/icons/settings.png b/v3.classic/data/popup/icons/settings.png new file mode 100644 index 00000000..211777df Binary files /dev/null and b/v3.classic/data/popup/icons/settings.png differ diff --git a/v3.classic/data/popup/icons/spam.png b/v3.classic/data/popup/icons/spam.png new file mode 100644 index 00000000..32067f13 Binary files /dev/null and b/v3.classic/data/popup/icons/spam.png differ diff --git a/v3.classic/data/popup/index.css b/v3.classic/data/popup/index.css new file mode 100644 index 00000000..1280dc38 --- /dev/null +++ b/v3.classic/data/popup/index.css @@ -0,0 +1,342 @@ +html { + color-scheme: light; +} +html.dark { + color-scheme: dark; + background-color: #fff; + filter: invert(100%); +} +html.dark iframe { + filter: invert(100%); +} +html,body { + margin: 0; + background-color: #fff; + color: #222; +} +body { + display: flex; + flex-direction: column; + overflow: hidden; + font: 12.8px arial, sans-serif; + border: 1px solid #dcdcdc; + border-radius: 2px; + background-color: #f5f5f5; + margin: 5px; +} +a, +a:hover, +a:active, +a:focus { + outline: 0; + text-decoration: none; + color: #191919; +} + +.vcenter { + display: flex; + align-items: center; +} +.hcenter { + display: flex; + justify-content: center; +} +.ellipsis { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} +.btn { + border: 1px solid rgba(0, 0, 0, 0.15); + background-color: white; + background-repeat: no-repeat; + background-position: 50% 50%; + cursor: pointer; + font-weight: bold; + font-size: 12px; + border-radius: 2px; + opacity: 0.6; + -moz-user-select: none; + user-select: none; +} +.btn:hover { + color: #191919; + border-color: #c6c6c6; + opacity: 0.9; +} +.btn:active { + border: 1px solid #4d90fe; +} +.btn[disabled], +.btn[disabled]:hover { + border: 1px solid rgba(0, 0, 0, 0.1); + cursor: default; + opacity: 0.4; +} +.btn[wait] { + background-image: url("wait.gif"); + background-position: center center; + background-size: 18px; +} + +header { + width: 100%; + height: 32px; + line-height: 22px; +} +header div[name="email-container"] { + flex: auto; + background: url('icons/list.png') 5px 1px no-repeat, url('icons/arrow_drop_down.png') right 1px no-repeat; + padding: 0 15px 0 28px; + opacity: 0.7; + cursor: pointer; + -moz-user-select: none; + user-select: none; + background-size: 20px; +} +header div[name="email-container"]:hover { + opacity: 0.9; +} +header div[name="stat"] { + min-width: 50px; + text-align: center; + border-left: 1px solid #dcdcdc; + padding-left: 5px; +} +header div[name="nav"] { + display: flex; + min-width: 86px; +} +header div[name="nav"] div { + width: 38px; + height: 22px; +} +header div[name="nav"] div[name="previous"] { + background-image: url('icons/chevron_left.png'); + background-size: 20px; + margin-right: -1px; +} +header div[name="nav"] div[name="next"] { + background-image: url('icons/chevron_right.png'); + background-size: 20px; +} + +#content { + display: flex; + flex-direction: column; + flex: auto; + background-color: #fff; + border-top: 1px solid #dcdcdc; + border-bottom: 1px solid #dcdcdc; + padding: 0 5px; + overflow: auto; +} +#content[loading] { + background: #fff url("fetch.gif") no-repeat center center; +} +#content div[name="title"] { + font-size: 150%; + border-bottom: 1px solid #dcdcdc; + height: 35px; +} +#content div[name="title"] #title { + flex: 1; + overflow: hidden; + text-overflow: ellipsis; +} +#content div[name="title"] #star { + width: 16px; + height: 16px; + background-repeat: no-repeat; + background-size: 16px; + background-position: center; + cursor: pointer; +} +body[data-star=hide] #content div[name="title"] #star { + display: none; +} +body[data-star=true] #content div[name="title"] #star { + background-image: url('plug-ins/star.svg'); +} +body[data-star=false] #content div[name="title"] #star { + background-image: url('plug-ins/no-star.svg'); +} +#content div[name=labels] { + padding: 0 5px; +} +#content div[name=labels] .label { + font: 11px arial, sans-serif; + background-color: rgb(221, 221, 221); + color: rgb(102, 102, 102); + margin-right: 5px; + padding-left: 5px; +} +#content div[name=labels] .label [data-cmd="remove-label"] { + padding: 2px 4px; + cursor: pointer; + margin-left: 5px; +} +#content div[name=labels] .label [data-cmd="remove-label"]:hover { + color: rgb(221, 221, 221); + background-color: rgb(102, 102, 102); +} +body[data-labels=false] #content div[name=labels] { + display: none; +} +body[data-labels=true] #content div[name=labels] { + height: 32px; +} + +#content div[name="info"] { + display: flex; + flex-direction: row; + padding-block: 5px; +} +#content div[name="info"] div[name="sender"] { + min-width: 40px; + font-weight: bold; + padding: 0 3px 0 0; +} +#content div[name="info"] div[name="email"] { + flex: auto; + color: #727272; +} +#content div[name="info"] div[name="date"] { + min-width: 40px; + text-align: right; +} +#content div[name="body"] { + flex: auto; + flex-direction: column; + overflow: hidden; +} +#content div[name="body"] > iframe { + --scale: 1.0; + + border: solid 1px transparent; /* Firefox */ + box-sizing: border-box; + scale: var(--scale); + transform-origin: top left; + width: calc(100% / var(--scale)); + height: calc(100% / var(--scale)); +} + +footer div { + min-width: 32px; + padding: 0 5px; + height: 22px; + margin: 4px 3px; + white-space: nowrap; + background-size: 20px; +} + +footer div[name="settings"] { + background-image: url('icons/settings.png'); +} +footer div[name="gmail"] { + background-image: url('icons/inbox.png'); +} +footer div[name="archive"] { + background-image: url('icons/archive.png'); +} +footer div[name="spam"] { + background-image: url('icons/spam.png'); +} +footer div[name="trash"] { + background-image: url('icons/delete.png'); +} +footer div[name="refresh"] { + background-image: url('icons/refresh.png'); +} +footer div[name="read"] { + width: 90px; + background-image: none; +} +footer div[name="read-all"] { + background-image: url('icons/check_all.png'); +} +footer div[name="toggle-dark"] { + background-image: url('icons/dark.png'); +} +body[data-dark="auto"] footer div[name="toggle-dark"] { + display: none; +} + +#accounts { + display: none; + position: absolute; + top: 40px; + left: 9px; + color: #000 !important; /* KDE dark theme issue */ + background-color: #fff; + min-width: 250px; + border: 1px solid rgba(0, 0, 0, 0.2); + border-radius: 2px; + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2); + margin: 0; + padding: 0; + -moz-user-select: none; + user-select: none; + z-index: 100; +} +#accounts li { + padding: 8px 8px 8px 28px; + display: block; + border-bottom: 1px solid #f5f5f5; + cursor: pointer; + max-width: 500px; +} +#accounts li:last-child { + border-bottom: none; +} +#accounts li:hover { + background-color: #f5f5f5; +} +#accounts li.selected { + background: url('icons/check.png') center left 2px no-repeat; + background-size: 20px; +} + +#expand { + position: fixed; + bottom: 44px; + left: 9px; + width: 40px; + height: 12px; + background-image: url('icons/arrow_drop_down.png'); + background-size: 20px; +} +body[mode="expanded"] #expand { + -moz-transform: scaleY(-1); + transform: scaleY(-1); +} +/* tooltip */ +.tooltip { + position: relative; + z-index: 99; +} +.tooltip:hover::before { + position: absolute; + left: 38%; + bottom: 24px; + content: ""; + border-left: 5px solid transparent; + border-right: 5px solid transparent; + border-top: 6px solid rgba(0, 0, 0, 0.8); + z-index: 99; +} +.tooltip:hover::after { + position: absolute; + bottom: 30px; + left: 50%; + transform: translateX(-50%); + background-color: rgba(0, 0, 0, 0.8); + border-radius: 1px; + text-align: center; + color: #fff; + font-weight: normal; + content: attr(title); + padding: 5px 10px; + z-index: 98; + white-space: nowrap; +} diff --git a/v3.classic/data/popup/index.html b/v3.classic/data/popup/index.html new file mode 100644 index 00000000..8eefd10c --- /dev/null +++ b/v3.classic/data/popup/index.html @@ -0,0 +1,73 @@ + + + + + + + + + + +
+
Email
+
- -
+
+
+
+
+
+
+
+ Subject +
+ +
+ +
+
+ Sender +
+
-
+
-
+
+
+ +
+
+ + + +
+
+
+
+
+
+
+
+
+
+
+
    +
    + + + + + + + + diff --git a/v3.classic/data/popup/index.js b/v3.classic/data/popup/index.js new file mode 100644 index 00000000..8d1f53ba --- /dev/null +++ b/v3.classic/data/popup/index.js @@ -0,0 +1,632 @@ +/* global gmail, locale, utils */ +'use strict'; + +var objs; +var contentCache = []; +var selected = {}; +var api = { + callbacks: {} +}; +api.on = function(name, callback) { + api.callbacks[name] = api.callbacks[name] || []; + api.callbacks[name].push(callback); +}; +api.emit = function(name, data) { + (api.callbacks[name] || []).forEach(c => c(data)); +}; +chrome.storage.local.get({ + 'plug-in/labels': true +}, prefs => { + if (prefs['plug-in/labels']) { + document.body.appendChild(Object.assign(document.createElement('script'), { + src: 'plug-ins/labels.js' + })); + } +}); + +// styling +chrome.storage.local.get({ + 'styling_top': '', + 'scale': 1 +}, prefs => { + document.getElementById('styling_top').textContent = prefs['styling_top']; + qs('iframe').style.setProperty('--scale', prefs.scale); +}); + +// eslint-disable-next-line no-unused-vars +const notify = msg => chrome.notifications.create({ + type: 'basic', + iconUrl: '/data/icons/notification/48.png', + title: chrome.i18n.getMessage('gmail'), + message: msg.message || msg || 'Unknown Error - 4' +}); + +const qs = function(q, m) { + const reserved = { + 'stats': 'header div[name="stat"] b', + 'accounts': '#accounts', + 'content': '#content', + 'expand': '#expand', + 'date': '#content div[name="date"]', + 'email': '#content div[name="email"]', + 'sender': '#content div[name="sender"] a', + 'title': '#content div[name="title"] a', + 'next': 'header div div:nth-child(2)', + 'previous': 'header div div:nth-child(1)', + 'archive': 'footer div[name="archive"]', + 'spam': 'footer div[name="spam"]', + 'settings': 'footer div[name="settings"]', + 'toggle-dark': 'footer div[name="toggle-dark"]', + 'gmail': 'footer div[name="gmail"]', + 'trash': 'footer div[name="trash"]', + 'refresh': 'footer div[name="refresh"]', + 'read': 'footer div[name="read"]', + 'read-all': 'footer div[name="read-all"]', + 'email-container': 'header div[name="email-container"]', + 'iframe': '#content iframe' + }; + q = reserved[q] || q; + qs.cache = qs.cache || []; + qs.cache[q] = qs.cache[q] || document[m ? 'querySelectorAll' : 'querySelector'](q); + return qs.cache[q]; +}; + +const html = (() => { + // List of all used elements + const li = document.createElement('li'); + + const addContent = (elem, txt) => { + if (txt) { + elem.textContent = txt; + } + return elem; + }; + return function(tag, txt) { + let tmp; + switch (tag) { + case 'li': + tmp = li.cloneNode(false); + break; + default: + tmp = document.createElement(tag); + } + return addContent(tmp, txt); + }; +})(); +/** objects **/ +const accountSelector = (() => { + const tmp = qs('email-container'); + return { + get text() { + return tmp.textContent; + }, + set text(val) { + localStorage.setItem('last-account', val); + tmp.textContent = val; + }, + gen: xml => xml.title + (xml.label ? ' [' + xml.label + ']' : '') + }; +})(); +const stat = (() => { + const list = qs('stats', true); + return { + get current() { + return list[0].textContent; + }, + set current(val) { + list[0].textContent = val; + }, + get total() { + return list[1].textContent; + }, + set total(val) { + list[1].textContent = val; + } + }; +})(); +const body = (function() { + const date = qs('date'); + const email = qs('email'); + const name = qs('sender'); + const title = qs('title'); + return { + get date() { + return date.textContent; + }, + set date(val) { + date.textContent = val; + }, + get email() { + return email.textContent; + }, + set email(val) { + email.textContent = val; + }, + get name() { + return name.textContent; + }, + set name(val) { + name.textContent = val; + }, + set nameLink(val) { + name.setAttribute('href', val); + }, get title() { + return title.textContent; + }, + set title(val) { + title.textContent = val || locale.get('popup_no_subject'); + }, + set titleLink(val) { + title.setAttribute('href', val); + } + }; +})(); + +/** Update UI if necessary **/ +const update = (() => { + const old = { + link: null, + id: null, + count: null + }; + let index; + return (previous, next) => { + // Make sure the selected entry is still available + const isAvailable = objs.reduce((p, c) => p.concat(c.xml.entries), []) + .reduce((p, c) => p || selected.entry && c.id === selected.entry.id, false); + if (isAvailable) { // Even if the selected entry is available still the parent might have been changed + selected.parent = objs.filter(o => o.xml.link === selected.parent.xml.link)[0]; + } + else { + // does the old account still have unread entries? + const obj = objs.filter(o => selected.parent && o.xml.link === selected.parent.xml.link); + if (obj.length && obj[0].xml.fullcount) { + selected.entry = obj[0].xml.entries[Math.min(obj[0].xml.entries.length - 1, index)]; + selected.parent = obj[0]; + } + else { + selected.parent = objs.reduce((p, c) => c.xml.fullcount ? c : p); + selected.entry = selected.parent.xml.entries[0]; + } + } + if (!selected.parent) { + return; + } + // updating current index + selected.parent.xml.entries.forEach((entry, i) => { + if (entry.id === selected.entry.id) { + if (index !== i) { + index = i; + // Although body is updated but index is not + stat.current = index + 1; + } + } + }); + + // Is previous or next requested + if (previous && index > 0) { + index -= 1; + selected.entry = selected.parent.xml.entries[index]; + } + if (next && selected.parent.xml.entries.length - 1 > index) { + index += 1; + selected.entry = selected.parent.xml.entries[index]; + } + + // What parts need update + const doAccountSelector = old.link !== selected.parent.xml.link; + const doAccountBody = old.id !== selected.entry.id; + const doNumber = old.count !== selected.parent.xml.fullcount; + const doPrevious = index !== 0; + const doNext = index !== selected.parent.xml.entries.length - 1; + + if (doAccountSelector) { + old.link = selected.parent.xml.link; + accountSelector.text = accountSelector.gen(selected.parent.xml); + } + if (doAccountBody) { + old.id = selected.entry.id; + + const base = gmail.get.base(selected.entry.link); + const messageID = gmail.get.id(selected.entry.link); + stat.current = index + 1; + body.title = selected.entry.title; + if (messageID && selected.parent.xml.link.indexOf('#') === -1) { + body.titleLink = base + '/?shva=1#inbox/' + messageID; + } + else if (messageID) { + body.titleLink = selected.parent.xml.link + '/' + messageID; + } + else { + body.titleLink = selected.entry.link; + } + + body.name = selected.entry.author_name; + // body.nameLink = base + "?view=cm&fs=1&tf=1&to=" + selected.entry.author_email; + body.nameLink = 'mailto:' + selected.entry.author_email + '?subject=Re: ' + selected.entry.title; + body.email = '<' + selected.entry.author_email + '>'; + updateContent(); + } + if (doNumber) { + old.count = selected.parent.xml.fullcount; + stat.total = selected.parent.xml.fullcount; + } + if (doPrevious) { + qs('previous').removeAttribute('disabled'); + } + else { + qs('previous').setAttribute('disabled', true); + } + if (doNext) { + qs('next').removeAttribute('disabled'); + } + else { + qs('next').setAttribute('disabled', true); + } + body.date = utils.prettyDate(selected.entry.modified); + }; +})(); + +/* Listeners */ +const Listen = function(query, on, callback, pointer) { + const elem = qs(query); + elem.addEventListener(on, function(e) { + if (elem.getAttribute('disabled') === 'true') { + return; + } + if (callback) { + callback.apply(pointer, [e]); + } + }, false); +}; + +new Listen('email-container', 'click', function(e) { + // Clear old list + qs('accounts').textContent = ''; + // Add new items (remove no-unread accounts first) + objs.filter(o => o.xml.fullcount) + .map(o => [o.xml.title + (o.xml.label ? ' [' + o.xml.label + ']' : ''), o.xml.link]) + .forEach(arr => { + const li = html('li', arr[0]); + li.setAttribute('value', arr[1]); + li.setAttribute('class', 'ellipsis'); + + if (selected.entry && arr[1] === selected.parent.xml.link) { + li.classList.add('selected'); + } + qs('accounts').appendChild(li); + }); + // Show menu + qs('accounts').style.display = 'block'; + e.stopPropagation(); + + window.addEventListener('click', function _() { + qs('accounts').style.display = 'none'; + window.removeEventListener('click', _); + }, false); +}); +new Listen('accounts', 'click', ({target}) => { + const link = target.getAttribute('value'); + if (selected.parent.xml.link !== link) { + const obj = objs.reduce((p, c) => c.xml.link === link ? c : p); + selected.entry = obj.xml.entries[0]; + selected.parent = obj; + update(); + } +}); +new Listen('next', 'click', () => update(false, true)); +new Listen('previous', 'click', () => update(true, false)); + +const action = (cmd, links = selected.entry.link, callback = () => {}) => { + chrome.runtime.sendMessage({ + method: 'gmail.action', + cmd, + links + }, () => { + callback(); + if (cmd === 'rd') { + qs('read').textContent = locale.get('popup_read'); + qs('read').removeAttribute('disabled'); + } + else { + let obj; + switch (cmd) { + case 'rd': + obj = qs('read'); + break; + case 'rd-all': + obj = qs('read-all'); + break; + case 'tr': + obj = qs('trash'); + break; + case 'rc_^i': + obj = qs('archive'); + break; + case 'sp': + obj = qs('spam'); + break; + } + if (obj) { + obj.removeAttribute('wait'); + obj.removeAttribute('disabled'); + } + } + chrome.runtime.sendMessage({ + method: 'update' + }); + }); +}; + +new Listen('archive', 'click', () => { + qs('archive').setAttribute('wait', true); + qs('archive').setAttribute('disabled', true); + action('rc_^i'); +}); +new Listen('trash', 'click', () => { + qs('trash').setAttribute('wait', true); + qs('trash').setAttribute('disabled', true); + action('tr'); +}); +new Listen('spam', 'click', () => { + qs('spam').setAttribute('wait', true); + qs('spam').setAttribute('disabled', true); + action('sp'); +}); +new Listen('read', 'click', () => { + qs('read').textContent = locale.get('popup_wait'); + qs('read').setAttribute('disabled', true); + action('rd'); +}); +new Listen('refresh', 'click', () => chrome.runtime.sendMessage({ + method: 'update', + forced: true +})); +new Listen('gmail', 'click', () => chrome.runtime.sendMessage({ + method: 'open', + url: selected.parent.xml.link +}, () => window.close())); +new Listen('settings', 'click', () => chrome.tabs.update({ + url: '/data/options/index.html' +}, () => window.close())); +new Listen('read-all', 'click', () => { + qs('read-all').setAttribute('wait', true); + qs('read-all').setAttribute('disabled', true); + action('rd-all', selected.parent.xml.entries.map(e => e.link)); +}); + +new Listen('expand', 'click', () => chrome.storage.local.set({ + size: qs('body').getAttribute('mode') === 'expanded' ? 0 : 1 +})); +new Listen('toggle-dark', 'click', () => chrome.storage.local.set({ + dark: document.documentElement.classList.contains('dark') !== true +})); + +function updateContent() { + const doSummary = () => { + if (selected.entry) { + qs('iframe').contentDocument.body.textContent = selected.entry.summary + ' ...'; + qs('iframe').contentDocument.body.classList.add('summary'); + } + }; + + if (selected.entry) { + localStorage.setItem('last-id', selected.entry.id); + } + + const mode = qs('body').getAttribute('mode') === 'expanded' ? 1 : 0; + const link = selected.entry.link; + if (mode === 1) { + const content = contentCache[link]; + api.emit('update-full-content', link); + if (content) { + qs('content').removeAttribute('loading'); + qs('iframe').contentDocument.querySelector('head base').href = link; + qs('iframe').contentDocument.body.textContent = ''; + qs('iframe').contentDocument.body.appendChild(content); + qs('iframe').contentDocument.body.classList.remove('summary'); + } + else { + doSummary(); + qs('content').setAttribute('loading', 'true'); + chrome.storage.local.get({ + render: true + }, prefs => gmail.body(link, prefs.render).then(content => { + if (link === selected.entry.link) { + // For chat conversations, there is no full content mode + if (content) { + contentCache[link] = content; + updateContent(); + } + else { + throw Error('empty body'); + } + } + }).catch(e => { + qs('content').removeAttribute('loading'); + // notify(e); + doSummary(); + qs('iframe').contentDocument.body.textContent += ` + +-- + +Error fetching email content: ` + e.message; + })); + } + } + else { + // Use the print view to force Gmail setting "at" cookie if it is not available + const m = link.match(/u\/(?\d+)/); + chrome.runtime.sendMessage({ + method: 'get-at', + n: m.groups.n + }, at => { + if (!at) { + console.info('%c[popup]', 'color:#0099ff', 'Force print view...'); + gmail.body(link, true); + } + }); + + doSummary(); + } +} + +// dark theme +const scheme = { + dark() { + document.documentElement.classList.add('dark'); + try { + qs('iframe').contentDocument.documentElement.classList.add('dark'); + } + catch (e) {} + }, + light() { + document.documentElement.classList.remove('dark'); + qs('iframe').contentDocument.documentElement?.classList?.remove('dark'); + } +}; +qs('iframe').addEventListener('load', () => { + if (document.documentElement.classList.contains('dark')) { + qs('iframe').contentDocument.documentElement?.classList?.add('dark'); + } +}, { + once: true +}); +chrome.storage.local.get({ + dark: false +}, prefs => { + document.body.dataset.dark = prefs.dark; + + if (prefs.dark === 'true' || prefs.dark === true) { + scheme.dark(); + } + else if (prefs.dark === 'false' || prefs.dark === false) { + scheme.light(); + } + else { + matchMedia('(prefers-color-scheme: dark)').addEventListener('change', e => { + if (e.matches) { + scheme.dark(); + } + else { + scheme.light(); + } + }); + if (matchMedia('(prefers-color-scheme: dark)').matches) { + scheme.dark(); + } + else { + scheme.light(); + } + } +}); + +// resize +const resize = () => { + chrome.storage.local.get({ + fullWidth: 750, + fullHeight: 600, + size: 0 + }, prefs => { + const expanded = prefs.size === 1 || prefs.size === '1'; + if (expanded) { + document.body.setAttribute('mode', 'expanded'); + } + else { + document.body.removeAttribute('mode'); + qs('content').removeAttribute('loading'); + } + if (selected.entry) { + updateContent(); + } + const normal = { + width: 550, + height: 240 + }; + Object.assign(document.body.style, { + width: (expanded ? prefs.fullWidth : normal.width) + 'px', + height: (expanded ? prefs.fullHeight - 20 : normal.height) + 'px' + }); + }); + // Close account selection menu if it is open + qs('accounts').style.display = 'none'; +}; +resize(); +chrome.storage.onChanged.addListener(prefs => { + if (prefs.size || prefs.fullWidth || prefs.fullHeight) { + resize(); + } + if (prefs.dark) { + scheme[prefs.dark.newValue ? 'dark' : 'light'](); + } +}); + +// communication +chrome.runtime.onMessage.addListener(request => { + if (request.method === 'validate-current') { + if (selected.parent.xml.fullcount === 20) { + objs = request.data; + update(); + } + } + else if (request.method === 'update') { + objs = request.data; + update(); + } + else if (request.method === 'update-date') { + // This function is called on every server response. + if (!selected.entry) { + return; + } + body.date = utils.prettyDate(selected.entry.modified); + } + else if (request.method === 'close-popup') { + window.close(); + } +}); + +// init +qs('iframe').onload = () => chrome.storage.session.get({ + 'cached-objects': [] +}, prefs => { + objs = prefs['cached-objects']; + + if (objs && objs.length) { + // Selected account + const unreadEntries = objs.map(obj => obj.xml.entries + .filter(e => obj.newIDs.indexOf(e.id) !== -1)) + .reduce((p, c) => p.concat(c), []); + // selecting the correct account + if (unreadEntries.length) { + const newestEntry = unreadEntries.sort((p, c) => { + const d1 = new Date(p.modified); + const d2 = new Date(c.modified); + return d1 < d2; + })[0]; + selected.entry = newestEntry; + selected.parent = objs.reduce((p, c) => c.xml.entries.indexOf(newestEntry) !== -1 ? c : p); + } + if (!selected.entry) { + const lastAccount = localStorage.getItem('last-account'); + if (lastAccount) { + const account = objs.filter(o => accountSelector.gen(o.xml) === lastAccount).shift(); + if (account) { + const id = localStorage.getItem('last-id'); + selected = { + entry: [ + ...account.xml.entries.filter(e => e.id === id), + account.xml.entries[0] + ].shift(), + parent: account + }; + return update(); + } + } + } + selected = { + entry: objs[0].xml.entries[0], + parent: objs[0] + }; + update(); + } +}); diff --git a/v3.classic/data/popup/plug-ins/labels.js b/v3.classic/data/popup/plug-ins/labels.js new file mode 100644 index 00000000..d7fbcb2f --- /dev/null +++ b/v3.classic/data/popup/plug-ins/labels.js @@ -0,0 +1,102 @@ +/* global api, gmail, action, selected */ +'use strict'; + +{ + const hiddens = ['STARRED', 'Inbox', 'INBOX']; + + let response; + let root; + let query; + let inprogress = ''; + + const star = url => { + const id = gmail.get.id(url); + + const o = response.filter(o => o.thread === id).shift(); + if (o) { + document.body.dataset.star = o.labels.some(s => s === 'STARRED'); + } + else { + document.body.dataset.star = 'hide'; + } + }; + + const labels = url => { + return; + const id = gmail.get.id(url); + const o = response.filter(o => o.thread === id).shift(); + if (o) { + const parent = document.getElementById('labels'); + const t = document.getElementById('label-template'); + parent.textContent = ''; + o.labels.map(s => s === '^i' ? 'Inbox' : s).filter(s => s.startsWith('^') === false && hiddens.indexOf(s) === -1).forEach(label => { + const clone = document.importNode(t.content, true); + clone.querySelector('span').textContent = label; + clone.querySelector('div').dataset.value = label; + parent.appendChild(clone); + }); + + document.body.dataset.labels = true; + } + else { + document.body.dataset.labels = false; + } + }; + + const update = (q = query, callback = () => {}) => chrome.runtime.sendMessage({ + method: 'gmail.search', + url: selected.parent.xml.rootLink, + query: q + }, r => { + if (!r || r instanceof Error) { + console.error(r); + } + else { + response = r; + query = q; + root = selected.parent.xml.rootLink; + callback(); + } + }); + + const fetch = (url = selected.entry.link) => { + document.body.dataset.labels = false; + document.body.dataset.star = 'hide'; + + const q = 'in:' + (selected.parent.xml.label || 'inbox') + ' is:unread'; + if (q === query && root === selected.parent.xml.rootLink && response) { + star(url); + labels(url); + } + else { + if (inprogress === q) { + console.info('update is rejected; duplicated'); + } + else { + inprogress = q; + update(q, () => { + inprogress = ''; + star(url); + labels(url); + }); + } + } + }; + + api.on('update-full-content', fetch); + + document.getElementById('star').addEventListener('click', () => { + const cmd = document.body.dataset.star === 'true' ? 'xst' : 'st'; + action(cmd, selected.entry.link, update); + document.body.dataset.star = cmd === 'xst' ? 'false' : 'true'; + }); + document.getElementById('labels').addEventListener('click', ({target}) => { + const cmd = target.dataset.cmd; + if (cmd === 'remove-label') { + const div = target.closest('div'); + const label = div.dataset.value; + action('rc_' + label, selected.entry.link, update); + div.remove(); + } + }); +} diff --git a/v3.classic/data/popup/plug-ins/no-star.svg b/v3.classic/data/popup/plug-ins/no-star.svg new file mode 100644 index 00000000..ef18682b --- /dev/null +++ b/v3.classic/data/popup/plug-ins/no-star.svg @@ -0,0 +1 @@ + diff --git a/v3.classic/data/popup/plug-ins/star.svg b/v3.classic/data/popup/plug-ins/star.svg new file mode 100644 index 00000000..efb16fd1 --- /dev/null +++ b/v3.classic/data/popup/plug-ins/star.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/v3.classic/data/popup/utils.js b/v3.classic/data/popup/utils.js new file mode 100644 index 00000000..dc0dc039 --- /dev/null +++ b/v3.classic/data/popup/utils.js @@ -0,0 +1,41 @@ +/* globals locale */ +'use strict'; + +var utils = {}; + +utils.prettyDate = time => { + const date = new Date((time || '')); + const diff = (((new Date()).getTime() - date.getTime()) / 1000); + const dayDiff = Math.floor(diff / 86400); + + if (isNaN(dayDiff) || dayDiff < 0) { + return 'just now'; + } + return dayDiff === 0 && ( + diff < 60 && locale.get('popup_msg_1') || + diff < 120 && locale.get('popup_msg_2') || + diff < 3600 && locale.get('popup_msg_3_format').replace('%d', Math.floor(diff / 60)) || + diff < 7200 && locale.get('popup_msg_4') || + diff < 86400 && Math.floor(diff / 3600) + ' ' + locale.get('popup_msg_5')) || + dayDiff === 1 && locale.get('popup_msg_6') || + dayDiff < 7 && locale.get('popup_msg_7_format').replace('%d', dayDiff) || + dayDiff < 7 * 7 && locale.get('popup_msg_8_format').replace('%d', Math.ceil(dayDiff / 7)) || + dayDiff < 7 * 4 * 3 && locale.get('popup_msg_9_format').replace('%d', Math.ceil(dayDiff / 7 / 4)) || + locale.get('popup_date_format') + .replace('%dd', date.getDate()) + .replace('%yy', date.getFullYear().toString()) + .replace('%mm', [ + locale.get('popup_msg_10'), + locale.get('popup_msg_11'), + locale.get('popup_msg_12'), + locale.get('popup_msg_13'), + locale.get('popup_msg_14'), + locale.get('popup_msg_15'), + locale.get('popup_msg_16'), + locale.get('popup_msg_17'), + locale.get('popup_msg_18'), + locale.get('popup_msg_19'), + locale.get('popup_msg_20'), + locale.get('popup_msg_21') + ][date.getMonth()]); +}; diff --git a/v3.classic/data/popup/wait.gif b/v3.classic/data/popup/wait.gif new file mode 100644 index 00000000..75534e13 Binary files /dev/null and b/v3.classic/data/popup/wait.gif differ diff --git a/v3.classic/data/sounds/0.mp4 b/v3.classic/data/sounds/0.mp4 new file mode 100644 index 00000000..dcddef4b Binary files /dev/null and b/v3.classic/data/sounds/0.mp4 differ diff --git a/v3.classic/data/sounds/1.mp4 b/v3.classic/data/sounds/1.mp4 new file mode 100644 index 00000000..3897565a Binary files /dev/null and b/v3.classic/data/sounds/1.mp4 differ diff --git a/v3.classic/data/sounds/2.mp4 b/v3.classic/data/sounds/2.mp4 new file mode 100644 index 00000000..c4cd701c Binary files /dev/null and b/v3.classic/data/sounds/2.mp4 differ diff --git a/v3.classic/data/sounds/3.mp4 b/v3.classic/data/sounds/3.mp4 new file mode 100644 index 00000000..b5b1bc4a Binary files /dev/null and b/v3.classic/data/sounds/3.mp4 differ diff --git a/v3.classic/manifest.json b/v3.classic/manifest.json new file mode 100644 index 00000000..8a17fe74 --- /dev/null +++ b/v3.classic/manifest.json @@ -0,0 +1,68 @@ +{ + "name": "Notifier for Gmail™", + "description": "__MSG_description__", + "author": "InBasic", + "version": "1.2.3", + "manifest_version": 3, + "default_locale": "en", + "permissions": [ + "notifications", + "contextMenus", + "webRequest", + "storage", + "alarms", + "idle", + "offscreen", + "cookies" + ], + "host_permissions": [ + "*://mail.google.com/mail/", + "*://mail.google.com/sync/" + ], + "action": { + "default_icon": { + "16": "/data/icons/blue/16.png", + "18": "/data/icons/blue/18.png", + "19": "/data/icons/blue/19.png", + "32": "/data/icons/blue/32.png" + } + }, + "background": { + "service_worker": "worker.js", + "scripts": [ + "/core/utils/log.js", + "/core/open.js", + "/core/offscreen/firefox/polyfill.js", + "/core/offscreen.js", + "/core/context.js", + "/core/button.js", + "/core/sound.js", + "/core/utils/sax.js", + "/core/utils/feed.js", + "/core/check.js", + "/core/repeater.js", + "/core/watch.js", + "/worker.js" + ] + }, + "options_ui": { + "page": "/data/options/index.html", + "open_in_tab": true + }, + "homepage_url": "https://webextension.org/listing/gmail-notifier.html", + "icons": { + "16": "/data/icons/red/16.png", + "18": "/data/icons/red/18.png", + "19": "/data/icons/red/19.png", + "32": "/data/icons/red/32.png", + "48": "/data/icons/red/48.png", + "64": "/data/icons/red/64.png", + "128": "/data/icons/red/128.png" + }, + "browser_specific_settings": { + "gecko": { + "id": "jid0-GjwrPchS3Ugt7xydvqVK4DQk8Ls@jetpack", + "strict_min_version": "128.0" + } + } +} diff --git a/v3.classic/worker.js b/v3.classic/worker.js new file mode 100644 index 00000000..950275b6 --- /dev/null +++ b/v3.classic/worker.js @@ -0,0 +1,183 @@ +/* global checkEmails, repeater, sound, offscreen */ + +if (typeof importScripts !== 'undefined') { + self.importScripts('/core/utils/log.js'); + self.importScripts('/core/open.js'); + self.importScripts('/core/offscreen.js'); + self.importScripts('/core/context.js'); + self.importScripts('/core/button.js'); + self.importScripts('/core/sound.js'); + self.importScripts('/core/check.js'); + self.importScripts('/core/repeater.js'); + self.importScripts('/core/watch.js'); +} + +const toast = (message = 'Unknown Error') => chrome.notifications.create({ + type: 'basic', + iconUrl: '/data/icons/notification/48.png', + title: chrome.i18n.getMessage('gmail'), + message +}, id => setTimeout(chrome.notifications.clear, 5000, id)); + +const onClicked = link => { + if (link) { + self.openLink(link); + return; + } + chrome.storage.local.get({ + 'url': 'https://mail.google.com/mail/u/0/', + 'smartOpen': true + }, async prefs => { + if (prefs.smartOpen) { + try { + const objs = await checkEmails.getCached(); + if (objs && objs.length) { + // Selected account + const unreadEntries = [].concat([], ...objs.map(obj => obj.xml.entries)); + // selecting the correct account + if (unreadEntries.length) { + const newestEntry = unreadEntries.sort((p, c) => { + const d1 = new Date(p.modified); + const d2 = new Date(c.modified); + return d1 < d2; + })[0]; + if (newestEntry) { + return self.openLink(newestEntry.link); + } + } + try { + return self.openLink(objs[0].xml.entries[0].link); + } + catch (e) {} + } + } + catch (e) {} + } + return self.openLink(prefs.url); + }); +}; + +// user interactions +chrome.action.onClicked.addListener(() => onClicked()); + +// messaging +chrome.runtime.onMessage.addListener((request, sender, response) => { + const method = request.method; + + if (method === 'update' && request.forced) { + repeater.reset('popup.forced'); + } + else if (method === 'update') { + repeater.reset('popup', 500); + } + else if (method === 'open') { + const url = request.url; + if (typeof url === 'string') { + self.openLink(url); + } + else if (url.button === 2 || !url.link) { + return; + } + else if (url.button === 0 && (url.ctrlKey || url.metaKey)) { + self.openLink(url.link, true, null, url.isPrivate); + } + else if (url.button === 1) { + self.openLink(url.link, true, null, url.isPrivate); + } + else { + self.openLink(url.link, null, null, url.isPrivate); + } + } + else if (method === 'test-play') { + sound.play().catch(e => toast(e.message)); + } + else if (method === 'gmail.action') { + chrome.storage.local.get({ + doReadOnArchive: true + }, prefs => { + request.prefs = prefs; + offscreen.command({ + cmd: 'gmail.action', + request + }).then(e => { + if (e === true) { + response(); + } + else { + console.error(e); + // do we have access to the basic HTML view? + if (e.details && e.details.links && e.details.links.length) { + self.openLink(e.details.links[0]); + toast(chrome.i18n.getMessage('msg_6')); + } + else { + toast(e.message || 'Unknown Error - 1'); + } + response(e); + } + }).finally(() => repeater.reset('popup.action', 500)); + }); + + return true; + } + else if (method === 'gmail.search') { + offscreen.command({ + cmd: 'gmail.search', + request + }).then(r => { + if (!r) { + response(); + console.error('Empty response from offscreen'); + } + else if (r.message) { + // do we have access to the basic HTML view? + if (r.details && r.details.links && r.details.links.length) { + self.openLink(r.details.links[0]); + toast(chrome.i18n.getMessage('msg_6')); + } + response(); + console.error(r); + } + else { + response(r.entries); + } + }); + return true; + } + else if (method === 'stop-sound') { + sound.stop(); + } + else if (method === 'get-at') { + chrome.cookies.get({name: 'GMAIL_AT', url: 'https://mail.google.com/mail/u/' + request.n}, o => { + response(o?.value); + }); + return true; + } +}); + +/* FAQs & Feedback */ +{ + const {management, runtime: {onInstalled, setUninstallURL, getManifest}, storage, tabs} = chrome; + if (navigator.webdriver !== true) { + const {homepage_url: page, name, version} = getManifest(); + onInstalled.addListener(({reason, previousVersion}) => { + management.getSelf(({installType}) => installType === 'normal' && storage.local.get({ + 'faqs': true, + 'last-update': 0 + }, prefs => { + if (reason === 'install' || (prefs.faqs && reason === 'update')) { + const doUpdate = (Date.now() - prefs['last-update']) / 1000 / 60 / 60 / 24 > 45; + if (doUpdate && previousVersion !== version) { + tabs.query({active: true, lastFocusedWindow: true}, tbs => tabs.create({ + url: page + '?version=' + version + (previousVersion ? '&p=' + previousVersion : '') + '&type=' + reason, + active: reason === 'install', + ...(tbs && tbs.length && {index: tbs[0].index + 1}) + })); + storage.local.set({'last-update': Date.now()}); + } + } + })); + }); + setUninstallURL(page + '?rd=feedback&name=' + encodeURIComponent(name) + '&version=' + version); + } +} diff --git a/v3.dev/LICENSE b/v3.dev/LICENSE new file mode 120000 index 00000000..ea5b6064 --- /dev/null +++ b/v3.dev/LICENSE @@ -0,0 +1 @@ +../LICENSE \ No newline at end of file diff --git a/v3.dev/_locales/be/messages.json b/v3.dev/_locales/be/messages.json new file mode 100644 index 00000000..52a983e3 --- /dev/null +++ b/v3.dev/_locales/be/messages.json @@ -0,0 +1,251 @@ +{ + "description": { + "message": "Апавяшчэнні для некалькіх ярлыкоў і ўліковых запісаў Google Mail (Gmail) і шмат чаго іншага!" + }, + "bg_no_message": { + "message": "Няма непрачытаных паведамленняў" + }, + "bg_sign_out": { + "message": "Вы не ўвайшлі!" + }, + "bg_no_message_logged_in": { + "message": "Уліковыя запісы, пад якімі выкананы ўваход:" + }, + "bg_no_message_logged_out": { + "message": "Уліковыя запісы, пад якімі не выкананы ўваход:" + }, + "bg_unexpected_error": { + "message": "Нечаканая памылка:" + }, + "bg_check_new_emails": { + "message": "Правяраем на новыя паведамленні. Пачакайце..." + }, + "bg_no_mark_as_read": { + "message": "У прачытанае" + }, + "bg_no_report": { + "message": "У спам" + }, + "bg_no_archive": { + "message": "У архіў" + }, + "bg_no_delete": { + "message": "Выдаліць" + }, + "bg_no_add_star": { + "message": "Дадаць зорку" + }, + "pp_mark_all_as_read": { + "message": "Пазначыць усе паведамленні з гэтага запыту як прачытаныя" + }, + "pp_mark_as_read": { + "message": "У прачытанае" + }, + "pp_mark_as_unread": { + "message": "Пазначыць як непрачытанае" + }, + "pp_mark_as_read_title": { + "message": "Пазначыць прачытаным (Shift + KeyI) або пазначыць непрачытаным (Shift + KeyU)" + }, + "pp_refresh": { + "message": "Refresh this query (KeyR)" + }, + "pp_report": { + "message": "У спам (!)" + }, + "pp_delete": { + "message": "Выдаліць (#)" + }, + "pp_archive": { + "message": "У архіў (KeyE)" + }, + "pp_inbox": { + "message": "Адкрыць Уваходныя" + }, + "pp_options": { + "message": "Адкрыць старонку параметраў" + }, + "pp_search": { + "message": "Увядзіце запыт і націсніце Enter (напр. is:unread label:inbox)" + }, + "pp_notification": { + "message": "Add or remove notification for the current query and remember this query when the interface is open. Each email address needs to have at least one active notification query, or the default query is used. To ignore an email address from getting notification alerts, use the ignore list from the options page. To prevent a query from contributing to the badge counter, prepend it with the \"[silent]\" keyword (Shift + KeyA)." + }, + "pp_previous": { + "message": "Да папярэдняга паведамлення (KeyJ)" + }, + "pp_next": { + "message": "Да наступнага паведамлення (KeyK)" + }, + "pp_account_selector": { + "message": "Выбраць папярэдні ўліковы запіс (Shift + KeyJ) і выбраць наступны ўліковы запіс (Shift + KeyK)" + }, + "pp_query_selector": { + "message": "Выбраць папярэдні запыт (Meta + KeyJ) і выбраць наступны запыт (Meta + KeyK)" + }, + "pp_expand": { + "message": "Пераключэнне паміж згорнутым і разгорнутым рэжымам" + }, + "pp_no_user": { + "message": "Карытсальнік {EMAIL} не ўвайшоў або гэты ўліковы запіс недаступны." + }, + "pp_of": { + "message": "з" + }, + "pp_waiting": { + "message": "Чакаем уліковыя запісы..." + }, + "pp_empty_view": { + "message": "..." + }, + "pp_empty_entries": { + "message": "Пусты спіс" + }, + "pp_next_thread": { + "message": "Наступная гутарка" + }, + "pp_view": { + "message": "Пераключыць від паміж адзіночным і сеткай з чатырох (Meta + KeyV)" + }, + "op_opening_mode": { + "message": "Адкрываць інтэрфейс у" + }, + "op_opening_mode_tab": { + "message": "Укладка браўзера" + }, + "op_opening_mode_popup": { + "message": "Усплывальнае акно браўзера" + }, + "op_default_page": { + "message": "Прадвызначаная старонка" + }, + "op_default_page_desc": { + "message": "Націсканне на кнопку адкрывае гэту старонку, калі няма непрачытаных лістоў" + }, + "op_default_engine": { + "message": "Прадвызначаная сістэма атрымання пошты" + }, + "op_default_engine_rss": { + "message": "RSS (рэкамендаваная)" + }, + "op_default_engine_api": { + "message": "Gmail API (эксперыментальная)" + }, + "op_default_engine_native": { + "message": "Уласная (notmuch) (эксперыментальная)" + }, + "op_badge_text_format": { + "message": "Фармат тэксту значка" + }, + "op_badge_text_format_desc": { + "message": "Даступныя ключавыя словы:" + }, + "op_ignored_users": { + "message": "Карыстальнікі, якія ігнаруюцца:" + }, + "op_ignored_users_desc": { + "message": "Comma-separated list of logged-in email addresses to ignore when updating badge. Instead to ignore a query prepend the query with the \"[silent]\" keyword." + }, + "op_popup": { + "message": "Інтэрфейс перадпрагляду" + }, + "op_internals": { + "message": "Сістэма" + }, + "op_badge": { + "message": "Значок" + }, + "op_email": { + "message": "Чытанне пошты" + }, + "op_mark_as_read": { + "message": "У прачытанае" + }, + "op_mark_as_read_desc": { + "message": "Аўтаматычна пазначаць ліст як прачытаны пасля яго прагляду" + }, + "op_csp": { + "message": "Палітыка бяспекі змесціва" + }, + "op_csp_desc": { + "message": "Выкарыстоўваць гэту палітыку бяспекі змесціва пры праглядзе пошты. Напрыклад, каб прадухіліць загрузку аддаленых рэсурсаў, напішыце \"default-src 'none'; style-src 'unsafe-inline';\" (без двукоссяў), або, каб дазволіць аддаленыя рэсурcы, ачысціце поле" + }, + "op_notification": { + "message": "Апавяшчэнне" + }, + "op_notification_email": { + "message": "напр. me@gmail.com" + }, + "op_notification_query": { + "message": "напр. label:INBOX is:unread" + }, + "op_notification_sound": { + "message": "Ці пайграваць гукавое апавяшчэнне пры атрыманні новага паведамлення" + }, + "op_notification_desktop": { + "message": "Ці паказваць апавяшчэнне на працоўным стале для новых лістоў" + }, + "op_notification_source_title": { + "message": "Нумар, каторы прадстаўляе крыніцу гуку. Выкарыстоўвайце 0, 1, 2 або 3 для прадвызначаных гукаў" + }, + "op_notification_source": { + "message": "напр. 1" + }, + "op_notification_file": { + "message": "Захоўваць карыстальніцкі гук" + }, + "op_notification_submit": { + "message": "Дадаць правіла" + }, + "op_n_email": { + "message": "Адрас электроннай пошты" + }, + "op_n_query": { + "message": "Запыт" + }, + "op_n_sound": { + "message": "Прайграць гук" + }, + "op_n_desktop": { + "message": "Паказаць апавяшчэнне" + }, + "op_n_source": { + "message": "ID крыніцы гуку" + }, + "op_n_remove": { + "message": "Выдаліць правіла" + }, + "op_msg_large_file": { + "message": "Гэты файл занадта вялікі! Зменшыце памер файла і паўтарыце спробу." + }, + "op_msg_sound_id": { + "message": "Выкарыстоўвайце '%%' як ID крыніцы гэтага гуку" + }, + "op_msg_saved": { + "message": "Параметры захаваны" + }, + "op_msg_reset": { + "message": "Націсніце двойчы, каб скінуць!" + }, + "op_notification_remove_sound": { + "message": "Выдаліць карыстальніцкі гук" + }, + "op_reset": { + "message": "Скінуць налады да завадскіх" + }, + "op_support": { + "message": "Падтрымаць распрацоўку" + }, + "op_save": { + "message": "Захаваць параметры" + }, + "op_badge_period": { + "message": "Перыяд (у хвілінах):" + }, + "op_api_client": { + "message": "Сервер Gmail API" + }, + "op_native": { + "message": "Злучыцца з \"notmuch\"" + } +} diff --git a/v3.dev/_locales/ca/messages.json b/v3.dev/_locales/ca/messages.json new file mode 100644 index 00000000..32372a21 --- /dev/null +++ b/v3.dev/_locales/ca/messages.json @@ -0,0 +1,251 @@ +{ + "description": { + "message": "Notificador d'etiquetes i comptes múltiples per a Google Mail (Gmail), i més!" + }, + "bg_no_message": { + "message": "No hi ha missatges sense llegir" + }, + "bg_sign_out": { + "message": "T'has desconnectat!" + }, + "bg_no_message_logged_in": { + "message": "Comptes connectats:" + }, + "bg_no_message_logged_out": { + "message": "Comptes desconnectats:" + }, + "bg_unexpected_error": { + "message": "Error inesperat:" + }, + "bg_check_new_emails": { + "message": "Comprovant nous correus electrònics. Si us plau, espera..." + }, + "bg_no_mark_as_read": { + "message": "Marca com a llegit" + }, + "bg_no_report": { + "message": "Marca com a brossa" + }, + "bg_no_archive": { + "message": "Arxiva" + }, + "bg_no_delete": { + "message": "Esborra" + }, + "bg_no_add_star": { + "message": "Afegeix una estrella" + }, + "pp_mark_all_as_read": { + "message": "Marca tots els missatges d'aquesta cerca com a llegits" + }, + "pp_mark_as_read": { + "message": "Marca com a llegit" + }, + "pp_mark_as_unread": { + "message": "Marca com a no llegit" + }, + "pp_mark_as_read_title": { + "message": "Marca com a llegit (Maj + Tecla I) o marca com a no llegit (Maj + Tecla U)" + }, + "pp_refresh": { + "message": "Refresh this query (KeyR)" + }, + "pp_report": { + "message": "Marca com a brossa (!)" + }, + "pp_delete": { + "message": "Esborra (#)" + }, + "pp_archive": { + "message": "Arxiva (Tecla E)" + }, + "pp_inbox": { + "message": "Obre la safata d'entrada" + }, + "pp_options": { + "message": "Obre la pàgina d'opcions" + }, + "pp_search": { + "message": "Fes una cerca i prem la tecla d'Intro (per exemple, is:unread label:inbox)" + }, + "pp_notification": { + "message": "Add or remove notification for the current query and remember this query when the interface is open. Each email address needs to have at least one active notification query, or the default query is used. To ignore an email address from getting notification alerts, use the ignore list from the options page. To prevent a query from contributing to the badge counter, prepend it with the \"[silent]\" keyword (Shift + KeyA)." + }, + "pp_previous": { + "message": "Torna al missatge anterior (Tecla J)" + }, + "pp_next": { + "message": "Ves al missatge següent (Tecla K)" + }, + "pp_account_selector": { + "message": "Selecciona el compte anterior (Maj + Tecla J) i selecciona el compte següent (Maj + Tecla K)" + }, + "pp_query_selector": { + "message": "Selecciona la cerca anterior (Meta + Tecla J) i selecciona la cerca següent (Meta + Tecla K)" + }, + "pp_expand": { + "message": "Canvia entre els modes col·lapsat i expandit" + }, + "pp_no_user": { + "message": "L'usuari [EMAIL] no està connectat o no es pot accedir al seu compte." + }, + "pp_of": { + "message": "de" + }, + "pp_waiting": { + "message": "Esperant els comptes..." + }, + "pp_empty_view": { + "message": "..." + }, + "pp_empty_entries": { + "message": "Llista buida" + }, + "pp_next_thread": { + "message": "Fil següent" + }, + "pp_view": { + "message": "Canvia entre les vistes senzilla o quadrícula (Meta + Tecla V)" + }, + "op_opening_mode": { + "message": "Obre la interfície a" + }, + "op_opening_mode_tab": { + "message": "Pestanya del navegador" + }, + "op_opening_mode_popup": { + "message": "Finestra emergent del navegador" + }, + "op_default_page": { + "message": "Pàgina per defecte" + }, + "op_default_page_desc": { + "message": "Fer clic al botó d'acció obre aquesta pàgina quan no hi ha correus electrònics sense llegir" + }, + "op_default_engine": { + "message": "Motor per defecte per rebre correus electrònics" + }, + "op_default_engine_rss": { + "message": "RSS (recomanat)" + }, + "op_default_engine_api": { + "message": "API de Gmail (experimental)" + }, + "op_default_engine_native": { + "message": "Natiu (notmuch) (experimental)" + }, + "op_badge_text_format": { + "message": "Format de text de la insígnia" + }, + "op_badge_text_format_desc": { + "message": "Paraules clau disponibles:" + }, + "op_ignored_users": { + "message": "Usuaris ignorats:" + }, + "op_ignored_users_desc": { + "message": "Comma-separated list of logged-in email addresses to ignore when updating badge. Instead to ignore a query prepend the query with the \"[silent]\" keyword." + }, + "op_popup": { + "message": "Interfície de la finestra emergent" + }, + "op_internals": { + "message": "Motor" + }, + "op_badge": { + "message": "Insígnia" + }, + "op_email": { + "message": "Llegint correus electrònics" + }, + "op_mark_as_read": { + "message": "Marca com a llegit" + }, + "op_mark_as_read_desc": { + "message": "Marca automàticament el correu electrònic com a llegit en visualitzar-lo" + }, + "op_csp": { + "message": "Política de seguretat del contingut" + }, + "op_csp_desc": { + "message": "Utilitza aquesta política de seguretat de contingut per visualitzar correus electrònics. Per exemple, per evitar que el visualitzador carregui recursos remots, utilitza \"default-src 'none'; style-src 'unsafe-line';\" (sense cometes); o per permetre tots els recursos remots, buida el camp." + }, + "op_notification": { + "message": "Notificació" + }, + "op_notification_email": { + "message": "Per exemple: jo@gmail.com" + }, + "op_notification_query": { + "message": "Per exemple: label:INBOX is:unread" + }, + "op_notification_sound": { + "message": "Reprodueix o no un so de notificació en rebre un nou correu electrònic" + }, + "op_notification_desktop": { + "message": "Mostra o no una notificació d'escriptori en rebre un nou correu electrònic" + }, + "op_notification_source_title": { + "message": "Un número que representa la font de so. Utilitza 0, 1, 2 o 3 per als sons per defecte" + }, + "op_notification_source": { + "message": "Per exemple: 1" + }, + "op_notification_file": { + "message": "Desa un so personalitzat" + }, + "op_notification_submit": { + "message": "Afegeix una regla" + }, + "op_n_email": { + "message": "Adreça de correu electrònic" + }, + "op_n_query": { + "message": "Cerca" + }, + "op_n_sound": { + "message": "Reprodueix un so" + }, + "op_n_desktop": { + "message": "Mostra una notificació" + }, + "op_n_source": { + "message": "Identificador de la font de so" + }, + "op_n_remove": { + "message": "Elimina una regla" + }, + "op_msg_large_file": { + "message": "Aquest fitxer és massa gran! Si us plau, redueix-ne la mida i torna-ho a intentar." + }, + "op_msg_sound_id": { + "message": "Utilitza '%%' com a identificador de la font d'aquest so" + }, + "op_msg_saved": { + "message": "Opcions desades" + }, + "op_msg_reset": { + "message": "Fes doble clic per reiniciar!" + }, + "op_notification_remove_sound": { + "message": "Elimina un so personalitzat" + }, + "op_reset": { + "message": "Restaura les opcions de fàbrica" + }, + "op_support": { + "message": "Dóna suport al desenvolupament" + }, + "op_save": { + "message": "Desa les opcions" + }, + "op_badge_period": { + "message": "Període (en minuts)" + }, + "op_api_client": { + "message": "Servidor d'API de Gmail" + }, + "op_native": { + "message": "Connecta a \"notmuch\"" + } +} diff --git a/v3.dev/_locales/en/messages.json b/v3.dev/_locales/en/messages.json new file mode 100644 index 00000000..eb0cd41c --- /dev/null +++ b/v3.dev/_locales/en/messages.json @@ -0,0 +1,251 @@ +{ + "description": { + "message": "Multiple label and account notifier for Google Mail (Gmail), and more!" + }, + "bg_no_message": { + "message": "No Unread Messages" + }, + "bg_sign_out": { + "message": "You are signed out!" + }, + "bg_no_message_logged_in": { + "message": "Logged-in Accounts:" + }, + "bg_no_message_logged_out": { + "message": "Logged-out Accounts:" + }, + "bg_unexpected_error": { + "message": "Unexpected Error:" + }, + "bg_check_new_emails": { + "message": "Checking for new emails. Please wait..." + }, + "bg_no_mark_as_read": { + "message": "Mark as Read" + }, + "bg_no_report": { + "message": "Report Spam" + }, + "bg_no_archive": { + "message": "Archive" + }, + "bg_no_delete": { + "message": "Delete" + }, + "bg_no_add_star": { + "message": "Add Star" + }, + "pp_mark_all_as_read": { + "message": "Mark all messages for this query as read" + }, + "pp_mark_as_read": { + "message": "Mark as Read" + }, + "pp_mark_as_unread": { + "message": "Mark as Unread" + }, + "pp_mark_as_read_title": { + "message": "Mark as read (Shift + KeyI), or Mark as unread (Shift + KeyU)" + }, + "pp_refresh": { + "message": "Refresh this query (KeyR)" + }, + "pp_report": { + "message": "Report spam (!)" + }, + "pp_delete": { + "message": "Delete (#)" + }, + "pp_archive": { + "message": "Archive (KeyE)" + }, + "pp_inbox": { + "message": "Open Inbox" + }, + "pp_options": { + "message": "Open options page" + }, + "pp_search": { + "message": "Type a query and hit the Enter key (e.g. is:unread label:inbox)" + }, + "pp_notification": { + "message": "Add or remove notification for the current query and remember this query when the interface is open. Each email address needs to have at least one active notification query, or the default query is used. To ignore an email address from getting notification alerts, use the ignore list from the options page. To prevent a query from contributing to the badge counter, prepend it with the \"[silent]\" keyword (Shift + KeyA)." + }, + "pp_previous": { + "message": "Move to the previous message (KeyJ)" + }, + "pp_next": { + "message": "Move to the next message (KeyK)" + }, + "pp_account_selector": { + "message": "Select previous account (Shift + KeyJ) and select next account (Shift + KeyK)" + }, + "pp_query_selector": { + "message": "Select previous query (Meta + KeyJ) and select next query (Meta + KeyK)" + }, + "pp_expand": { + "message": "Toggle between collapsed and expanded modes" + }, + "pp_no_user": { + "message": "{EMAIL} user is not logged-in or its account cannot be accessed." + }, + "pp_of": { + "message": "of" + }, + "pp_waiting": { + "message": "Waiting for accounts..." + }, + "pp_empty_view": { + "message": "..." + }, + "pp_empty_entries": { + "message": "Empty List" + }, + "pp_next_thread": { + "message": "Next Thread" + }, + "pp_view": { + "message": "Toggle between single or four grid views (Meta + KeyV)" + }, + "op_opening_mode": { + "message": "Open the interface in" + }, + "op_opening_mode_tab": { + "message": "Browser Tab" + }, + "op_opening_mode_popup": { + "message": "Browser Popup" + }, + "op_default_page": { + "message": "Default page" + }, + "op_default_page_desc": { + "message": "Click on the action button opens this page when there are no unread emails" + }, + "op_default_engine": { + "message": "Default engine to fetch emails" + }, + "op_default_engine_rss": { + "message": "RSS (recommended)" + }, + "op_default_engine_api": { + "message": "Gmail API (experimental)" + }, + "op_default_engine_native": { + "message": "Native (notmuch) (experimental)" + }, + "op_badge_text_format": { + "message": "Badge text format" + }, + "op_badge_text_format_desc": { + "message": "Available keywords:" + }, + "op_ignored_users": { + "message": "Ignored users:" + }, + "op_ignored_users_desc": { + "message": "Comma-separated list of logged-in email addresses to ignore when updating badge. Instead to ignore a query prepend the query with the \"[silent]\" keyword." + }, + "op_popup": { + "message": "Popup Interface" + }, + "op_internals": { + "message": "Engine" + }, + "op_badge": { + "message": "Badge" + }, + "op_email": { + "message": "Email Reading" + }, + "op_mark_as_read": { + "message": "Mark as read" + }, + "op_mark_as_read_desc": { + "message": "Automatically mark the email as read when viewing it" + }, + "op_csp": { + "message": "Content security policy" + }, + "op_csp_desc": { + "message": "Use this content security policy for viewing emails. For instance to prevent the viewer from loading any remote resources use \"default-src 'none'; style-src 'unsafe-inline';\" (without quotes), or to allow all the remote resources, empty the box" + }, + "op_notification": { + "message": "Notification" + }, + "op_notification_email": { + "message": "e.g. me@gmail.com" + }, + "op_notification_query": { + "message": "e.g. label:INBOX is:unread" + }, + "op_notification_sound": { + "message": "Whether to play a sound notification when you got a new email or not" + }, + "op_notification_desktop": { + "message": "Whether to show a desktop notification when you got a new email or not" + }, + "op_notification_source_title": { + "message": "A number that represents the sound's source. Use 0, 1, 2, or 3 for the default sounds" + }, + "op_notification_source": { + "message": "e.g. 1" + }, + "op_notification_file": { + "message": "Store Custom Sound" + }, + "op_notification_submit": { + "message": "Add Rule" + }, + "op_n_email": { + "message": "Email Address" + }, + "op_n_query": { + "message": "Query" + }, + "op_n_sound": { + "message": "Play Sound" + }, + "op_n_desktop": { + "message": "Show Notification" + }, + "op_n_source": { + "message": "Sound Source ID" + }, + "op_n_remove": { + "message": "Remove Rule" + }, + "op_msg_large_file": { + "message": "This file is to big! Please reduce the filesize and retry." + }, + "op_msg_sound_id": { + "message": "Use '%%' as the souce id of this sound" + }, + "op_msg_saved": { + "message": "Options Saved" + }, + "op_msg_reset": { + "message": "Double-click to reset!" + }, + "op_notification_remove_sound": { + "message": "Remove Custom Sound" + }, + "op_reset": { + "message": "Factory Reset" + }, + "op_support": { + "message": "Support Development" + }, + "op_save": { + "message": "Save Options" + }, + "op_badge_period": { + "message": "Period (in minutes)" + }, + "op_api_client": { + "message": "Gmail API server" + }, + "op_native": { + "message": "Connect to \"notmuch\"" + } +} diff --git a/v3.dev/_locales/nl/messages.json b/v3.dev/_locales/nl/messages.json new file mode 100644 index 00000000..a6b0ab73 --- /dev/null +++ b/v3.dev/_locales/nl/messages.json @@ -0,0 +1,251 @@ +{ + "description": { + "message": "Label- en accountmelder voor Google Mail (Gmail)" + }, + "bg_no_message": { + "message": "Geen ongelezen berichten" + }, + "bg_sign_out": { + "message": "Je bent uitgelogd!" + }, + "bg_no_message_logged_in": { + "message": "Ingelogde accounts:" + }, + "bg_no_message_logged_out": { + "message": "Uitgelogde accounts:" + }, + "bg_unexpected_error": { + "message": "Onverwachte fout:" + }, + "bg_check_new_emails": { + "message": "Bezig met controleren op nieuwe e-mails…" + }, + "bg_no_mark_as_read": { + "message": "Markeren als gelezen" + }, + "bg_no_report": { + "message": "Melden als spam" + }, + "bg_no_archive": { + "message": "Archiveren" + }, + "bg_no_delete": { + "message": "Verwijderen" + }, + "bg_no_add_star": { + "message": "Markeren als favoriet" + }, + "pp_mark_all_as_read": { + "message": "Alle berichten hierbinnen markeren als gelezen" + }, + "pp_mark_as_read": { + "message": "Markeren als gelezen" + }, + "pp_mark_as_unread": { + "message": "Markeren als ongelezen" + }, + "pp_mark_as_read_title": { + "message": "Markeren als gelezen (Shift + KeyI) of Markeren als ongelezen Shift + KeyU)" + }, + "pp_refresh": { + "message": "Herladen (R)" + }, + "pp_report": { + "message": "Melden als spam (!)" + }, + "pp_delete": { + "message": "Verwijderen (#)" + }, + "pp_archive": { + "message": "Archiveren (KeyE)" + }, + "pp_inbox": { + "message": "Inbox openen" + }, + "pp_options": { + "message": "Instellingen openen" + }, + "pp_search": { + "message": "Typ een zoekopdracht en druk op enter (bijv. is:unread label:inbox)" + }, + "pp_notification": { + "message": "Voeg meldingen toe aan de huidige opvraging of verwijder ze, en onthoud deze opvraging zolang het venster getoond wordt. Elk e-mailadres dient minimaal één actieve meldingenreeks te hebben, anders worden de standaardinstellingen gebruikt. Een e-mailadres negeren kan middels de negeerlijst in de instellingen. Om ook de teller niet te gebruiken, kan de opvraging worden voorzien van \"[silent]\" trefwoord (Super + KeyA)." + }, + "pp_previous": { + "message": "Ga naar vorig bericht (KeyJ)" + }, + "pp_next": { + "message": "Ga naar volgend bericht (KeyK)" + }, + "pp_account_selector": { + "message": "Ga naar vorig account (Shift + KeyJ) en ga naar volgend account (Shift + KeyK)" + }, + "pp_query_selector": { + "message": "Ga naar vorige opvraging (Shift + KeyJ) en ga naar volgende opvraging (Shift + KeyK)" + }, + "pp_expand": { + "message": "Schakel tussen in- en uitgeklapte modus" + }, + "pp_no_user": { + "message": "(EMAIL} is niet ingelogd of er is geen toegang tot het account." + }, + "pp_of": { + "message": "van" + }, + "pp_waiting": { + "message": "Bezig met wachten op accounts…" + }, + "pp_empty_view": { + "message": "…" + }, + "pp_empty_entries": { + "message": "Blanco lijst" + }, + "pp_next_thread": { + "message": "Volgend gesprek" + }, + "pp_view": { + "message": "Schakel tussen de één- en viertegelweergave (Super + KeyV)" + }, + "op_opening_mode": { + "message": "Open Gmail-melder op/in een" + }, + "op_opening_mode_tab": { + "message": "browsertabblad" + }, + "op_opening_mode_popup": { + "message": "browserpop-up" + }, + "op_default_page": { + "message": "Standaardpagina" + }, + "op_default_page_desc": { + "message": "Klik op de actieknop om deze pagina te openen als er geen ongelezen e-mails zijn" + }, + "op_default_engine": { + "message": "Standaardmethode om e-mails op te halen" + }, + "op_default_engine_rss": { + "message": "RSS (aanbevolen)" + }, + "op_default_engine_api": { + "message": "Gmail-api (experimenteel)" + }, + "op_default_engine_native": { + "message": "Ingebouwd (notmuch) (experimenteel)" + }, + "op_badge_text_format": { + "message": "Tekstopmaak van teller" + }, + "op_badge_text_format_desc": { + "message": "Beschikbare trefwoorden:" + }, + "op_ignored_users": { + "message": "Genegeerde gebruikers:" + }, + "op_ignored_users_desc": { + "message": "Een kommagescheiden lijst met ingelogde e-mailadressen die dienen te worden genegeerd door het meldingspictogram. Voorzien van \"[silent]\" trefwoord (Super + KeyA) om een opvraging te negeren." + }, + "op_popup": { + "message": "Pop-upvormgeving" + }, + "op_internals": { + "message": "Methode" + }, + "op_badge": { + "message": "Teller" + }, + "op_email": { + "message": "Lezen" + }, + "op_mark_as_read": { + "message": "Markeren als gelezen" + }, + "op_mark_as_read_desc": { + "message": "E-mail automatisch markeren als gelezen na openen" + }, + "op_csp": { + "message": "Inhoudsbeveiliging" + }, + "op_csp_desc": { + "message": "Pas deze beveiliging toe bij het bekijken van e-mails, bijv. om te voorkomen dat externe inhoud wordt geladen. Hiervoor kun je \"default-src 'none'; style-src 'unsafe-inline';\" (zonder dubbele de aanhalingstekens) gebruiken. Laat leeg om alles toe te staan." + }, + "op_notification": { + "message": "Melding" + }, + "op_notification_email": { + "message": "bijv. ik@gmail.com" + }, + "op_notification_query": { + "message": "bijv. label:INBOX is:unread" + }, + "op_notification_sound": { + "message": "Of er een geluid moet worden afgespeeld bij het ontvangen van een nieuwe e-mail" + }, + "op_notification_desktop": { + "message": "Of er een geluid moet worden getoond bij het ontvangen van een nieuwe e-mail" + }, + "op_notification_source_title": { + "message": "Het getal dat de bron aanduidt. Gebruik 0, 1, 2 of 3 om de standaardgeluiden af te spelen." + }, + "op_notification_source": { + "message": "bijv. 1" + }, + "op_notification_file": { + "message": "Eigen geluid bewaren" + }, + "op_notification_submit": { + "message": "Regel toevoegen" + }, + "op_n_email": { + "message": "E-mailadres" + }, + "op_n_query": { + "message": "Opvraging" + }, + "op_n_sound": { + "message": "Geluid afspelen" + }, + "op_n_desktop": { + "message": "Melding tonen" + }, + "op_n_source": { + "message": "Geluidsbron-id" + }, + "op_n_remove": { + "message": "Regel verwijderen" + }, + "op_msg_large_file": { + "message": "Dit bestand is te groot! Verlaag de bestandsgrootte en probeer het opnieuw." + }, + "op_msg_sound_id": { + "message": "‘%’ gebruiken als bron-id van dit geluid" + }, + "op_msg_saved": { + "message": "De instellingen zijn opgeslagen" + }, + "op_msg_reset": { + "message": "Dubbelklik om te herstellen" + }, + "op_notification_remove_sound": { + "message": "Eigen geluid verwijderen" + }, + "op_reset": { + "message": "Standaardwaarden" + }, + "op_support": { + "message": "Ondersteun de ontwikkeling" + }, + "op_save": { + "message": "Instellingen opslaan" + }, + "op_badge_period": { + "message": "Duur (in minuten)" + }, + "op_api_client": { + "message": "Gmail-api-server" + }, + "op_native": { + "message": "Verbinden met ‘notmuch’" + } +} diff --git a/v3.dev/_locales/zh_CN/messages.json b/v3.dev/_locales/zh_CN/messages.json new file mode 100644 index 00000000..b8d95bf8 --- /dev/null +++ b/v3.dev/_locales/zh_CN/messages.json @@ -0,0 +1,251 @@ +{ + "description": { + "message": "适用于 Google 邮箱(Gmail)的通知程序,支持多组标签或账户等功能。" + }, + "bg_no_message": { + "message": "没有未读邮件" + }, + "bg_sign_out": { + "message": "您已退出登录" + }, + "bg_no_message_logged_in": { + "message": "已登录的账户:" + }, + "bg_no_message_logged_out": { + "message": "账号已退出登录:" + }, + "bg_unexpected_error": { + "message": "意外错误:" + }, + "bg_check_new_emails": { + "message": "正在查收新邮件,请稍候..." + }, + "bg_no_mark_as_read": { + "message": "标为已读" + }, + "bg_no_report": { + "message": "举报垃圾邮件" + }, + "bg_no_archive": { + "message": "归档" + }, + "bg_no_delete": { + "message": "删除" + }, + "bg_no_add_star": { + "message": "加星标" + }, + "pp_mark_all_as_read": { + "message": "标记本次查询中的所有邮件为已读" + }, + "pp_mark_as_read": { + "message": "标为已读" + }, + "pp_mark_as_unread": { + "message": "标为未读" + }, + "pp_mark_as_read_title": { + "message": "标为已读(Shift + I 键)或标为未读(Shift + U 键)" + }, + "pp_refresh": { + "message": "Refresh this query (KeyR)" + }, + "pp_report": { + "message": "举报垃圾邮件 (!)" + }, + "pp_delete": { + "message": "删除 (#)" + }, + "pp_archive": { + "message": "归档(E 键)" + }, + "pp_inbox": { + "message": "打开收件箱" + }, + "pp_options": { + "message": "打开选项页面" + }, + "pp_search": { + "message": "Type a query and hit the Enter key (e.g. is:unread label:inbox)" + }, + "pp_notification": { + "message": "Add or remove notification for the current query and remember this query when the interface is open. Each email address needs to have at least one active notification query, or the default query is used. To ignore an email address from getting notification alerts, use the ignore list from the options page. To prevent a query from contributing to the badge counter, prepend it with the \"[silent]\" keyword (Shift + KeyA)." + }, + "pp_previous": { + "message": "移动到上一邮件(J 键)" + }, + "pp_next": { + "message": "移动到下一邮件(K 键)" + }, + "pp_account_selector": { + "message": "选择上一个账户(Shift + J 键)和选择下一个账户(Shift + K 键)" + }, + "pp_query_selector": { + "message": "选择上一个查询(Meta + J 键)和选择下一个查询(Meta + K 键)" + }, + "pp_expand": { + "message": "切换折叠/展开模式" + }, + "pp_no_user": { + "message": "{EMAIL} 账户未登录或者访问受限。" + }, + "pp_of": { + "message": "/" + }, + "pp_waiting": { + "message": "正在等待账户..." + }, + "pp_empty_view": { + "message": "..." + }, + "pp_empty_entries": { + "message": "空列表" + }, + "pp_next_thread": { + "message": "下一主题" + }, + "pp_view": { + "message": "切换单/四网格视图(Meta + V 键)" + }, + "op_opening_mode": { + "message": "打开界面于" + }, + "op_opening_mode_tab": { + "message": "浏览器标签页" + }, + "op_opening_mode_popup": { + "message": "浏览器弹出面板" + }, + "op_default_page": { + "message": "默认页面" + }, + "op_default_page_desc": { + "message": "没有未读邮件时点击按钮打开此页面" + }, + "op_default_engine": { + "message": "获取电子邮件的默认引擎" + }, + "op_default_engine_rss": { + "message": "RSS(推荐)" + }, + "op_default_engine_api": { + "message": "Gmail API(实验性)" + }, + "op_default_engine_native": { + "message": "原生(notmuch;实验性)" + }, + "op_badge_text_format": { + "message": "徽标文本格式" + }, + "op_badge_text_format_desc": { + "message": "可用关键词:" + }, + "op_ignored_users": { + "message": "忽略的用户:" + }, + "op_ignored_users_desc": { + "message": "Comma-separated list of logged-in email addresses to ignore when updating badge. Instead to ignore a query prepend the query with the \"[silent]\" keyword." + }, + "op_popup": { + "message": "弹出面板界面" + }, + "op_internals": { + "message": "引擎" + }, + "op_badge": { + "message": "徽标" + }, + "op_email": { + "message": "邮件阅读" + }, + "op_mark_as_read": { + "message": "标为已读" + }, + "op_mark_as_read_desc": { + "message": "查阅时自动标记邮件为已读" + }, + "op_csp": { + "message": "内容安全策略" + }, + "op_csp_desc": { + "message": "Use this content security policy for viewing emails. For instance to prevent the viewer from loading any remote resources use \"default-src 'none'; style-src 'unsafe-inline';\" (without quotes), or to allow all the remote resources, empty the box" + }, + "op_notification": { + "message": "通知" + }, + "op_notification_email": { + "message": "例如 me@gmail.com" + }, + "op_notification_query": { + "message": "例如 label:INBOX is:unread" + }, + "op_notification_sound": { + "message": "Whether to play a sound notification when you got a new email or not" + }, + "op_notification_desktop": { + "message": "Whether to show a desktop notification when you got a new email or not" + }, + "op_notification_source_title": { + "message": "A number that represents the sound's source. Use 0, 1, 2, or 3 for the default sounds" + }, + "op_notification_source": { + "message": "例如 1" + }, + "op_notification_file": { + "message": "保存自定义音效" + }, + "op_notification_submit": { + "message": "添加规则" + }, + "op_n_email": { + "message": "电子邮件地址" + }, + "op_n_query": { + "message": "查询" + }, + "op_n_sound": { + "message": "播放音效" + }, + "op_n_desktop": { + "message": "显示通知" + }, + "op_n_source": { + "message": "音效来源 ID" + }, + "op_n_remove": { + "message": "移除规则" + }, + "op_msg_large_file": { + "message": "This file is to big! Please reduce the filesize and retry." + }, + "op_msg_sound_id": { + "message": "使用 '%%' 作为此声音的来源 ID" + }, + "op_msg_saved": { + "message": "选项已保存" + }, + "op_msg_reset": { + "message": "双击来重置!" + }, + "op_notification_remove_sound": { + "message": "移除自定义音效" + }, + "op_reset": { + "message": "恢复出厂设置" + }, + "op_support": { + "message": "支持软件开发" + }, + "op_save": { + "message": "保存选项" + }, + "op_badge_period": { + "message": "周期(分钟)" + }, + "op_api_client": { + "message": "Gmail API 服务器" + }, + "op_native": { + "message": "连接到 \"notmuch\"" + } +} diff --git a/v3.dev/accounts.js b/v3.dev/accounts.js new file mode 100644 index 00000000..e044bed5 --- /dev/null +++ b/v3.dev/accounts.js @@ -0,0 +1,96 @@ +/* global core, CONFIGS, NativeEngine, query, clean */ + +const accounts = { + number: 0, + local: '', + async check() { + const db = []; + for (let n = 0; n < 20; n += 3) { + const hrefs = [ + `https://mail.google.com/mail/u/${n}/feed/atom/inbox`, + `https://mail.google.com/mail/u/${n + 1}/feed/atom/inbox`, + `https://mail.google.com/mail/u/${n + 2}/feed/atom/inbox` + ]; + + const bodies = await Promise.all(hrefs.map(h => fetch(h).then(r => r.text()))); + const emails = []; + for (let m = 0; m < 3; m += 1) { + const o = await query(bodies[m], { + match(node) { + return node.name === 'TITLE'; + } + }); + const email = o?.text.split(' for ')[1]; + + if (o && email && emails.indexOf(email) === -1) { + emails.push(email); + db.push({ + href: hrefs[m].split('/feed/')[0], + id: n + m, + email + }); + } + else { + const r = await core.storage.read({ + 'ignored-users': CONFIGS['ignored-users'] + }).then(prefs => db.filter(o => { + const n = prefs['ignored-users'].indexOf(o.email); + if (n === -1) { + return true; + } + core.log('ignoring', o.email); + return false; + })); + if (accounts.local) { + r.push({ + email: accounts.local, + native: true + }); + } + return r; + } + } + } + throw Error('maximum reached'); + }, + 'is-logged-in'(forced = false) { + // Google + const g = async () => { + const now = Date.now(); + if (forced === false) { + const prefs = await core.storage.read({ + 'last-check': 0 + }); + if (now - prefs['last-check'] < 60 * 60 * 1000) { + return true; + } + } + const r = await fetch('https://mail.google.com/mail/?ui=html&zy=h'); + const b = r.ok && r.url.indexOf('accounts.google') === -1; + core.storage.write({ + 'last-check': b ? now : 0 + }); + if (!b) { // make sure all caches are cleared + clean(true); + } + return b; + }; + // notmuch + const n = async () => { + const engine = new NativeEngine(); + try { + await engine.authorize(); + const user = await engine.introduce(); + accounts.local = user; + return Boolean(user); + } + catch (e) { + return false; + } + }; + + return Promise.all([g(), n()]).then(([remote, local]) => { + return remote || local; + }); + } +}; diff --git a/v3.dev/badge.js b/v3.dev/badge.js new file mode 100644 index 00000000..61464e15 --- /dev/null +++ b/v3.dev/badge.js @@ -0,0 +1,308 @@ +/* global core ready users CONFIGS */ + +const notify = () => core.storage.read({ + 'notification': CONFIGS['notification'], + 'notification-counts': CONFIGS['notification-counts'], + 'popup-switch-on-new': CONFIGS['popup-switch-on-new'] +}).then(prefs => { + for (const [user, o] of Object.entries(users)) { + for (const [query, e] of Object.entries(o.queries || {})) { + const old = prefs['notification-counts'][user]?.[query]?.count; + const count = e.resultSizeEstimate; + prefs['notification-counts'][user] = prefs['notification-counts'][user] || {}; + prefs['notification-counts'][user][query] = { + count, + date: Date.now() + }; + if (isNaN(old) === false && count > old && e.silent !== true) { + core.log('count mismatch', user, query, 'old', old, 'new', count); + if (count > old) { + const threads = e.threads.slice(0, count - old); + // notify + const o = prefs.notification[user]?.[query]; + if (o) { + if (o.sound) { + notify.sound(o); + } + if (o.desktop) { + notify.desktop(user, query, count, threads); + } + } + else { + notify.sound({ + source: 0 + }); + notify.desktop(user, query, count, threads); + } + // adjust popup view + if (prefs['popup-switch-on-new']) { + core.storage.write({ + 'popup-account': { + user, + query, + threads: threads[0].id + } + }); + } + } + } + } + } + // save + core.storage.write({ + 'notification-counts': prefs['notification-counts'] + }); +}); +notify.sound = ({source}) => core.storage.read({ + 'custom-sounds': CONFIGS['custom-sounds'], + 'sound-volume': CONFIGS['sound-volume'] +}).then(prefs => { + let href = 'data/sounds/' + source + '.wav'; + if (source >= 10) { + href = Object.values(prefs['custom-sounds']).filter(o => o.id === source).map(o => o.binary).shift() || + 'data/sounds/0.wav'; + } + const audio = new Audio(href); + audio.volume = prefs['sound-volume']; + audio.play(); +}); +notify.desktop = (user, query, count, threads) => core.storage.read({ + 'notification-delay': CONFIGS['notification-delay'], // ms + 'notification-type': CONFIGS['notification-type'], + 'notification-text-format-combined': CONFIGS['notification-text-format-combined'], + 'notification-text-format-each': CONFIGS['notification-text-format-each'], + 'notification-buttons': CONFIGS['notification-buttons'], + 'notification-max-per-account': CONFIGS['notification-max-per-account'] +}).then(async prefs => { + if (prefs['notification-type'] === 'combined') { + core.notify.create(JSON.stringify([threads[0].id, user]), { + message: prefs['notification-text-format-combined'] + .replace('{USER}', user) + .replace('{QUERY}', query) + .replace('{COUNT}', count) + .replace('{SNIPPET}', '...') + }); + } + else { + for (const thread of threads.slice(0, prefs['notification-max-per-account'])) { + const map = {}; + map['mark-as-read'] = await core.i18n.translate('bg_no_mark_as_read'); + map['report'] = await core.i18n.translate('bg_no_report'); + map['archive'] = await core.i18n.translate('bg_no_archive'); + map['delete'] = await core.i18n.translate('bg_no_delete'); + map['add-star'] = await core.i18n.translate('bg_no_add_star'); + + const buttons = prefs['notification-buttons'].map(command => ({ + title: map[command] + })); + + core.notify.create(JSON.stringify([thread.id, user, prefs['notification-buttons']]), { + message: prefs['notification-text-format-each'] + .replace('{USER}', user) + .replace('{QUERY}', query) + .replace('{COUNT}', count) + .replace('{SNIPPET}', thread.snippet), + buttons + }); + await new Promise(resolve => setTimeout(resolve, prefs['notification-delay'])); + } + } +}); +core.notify.fired(str => { + try { + const [, user] = JSON.parse(str); + core.page.open({ + url: users[user].href + }); + } + catch (e) { + console.warn(e); + } +}); +core.notify.buttons((str, n) => { + try { + const [id, user, commands] = JSON.parse(str); + const command = commands[n]; + users[user].engine.action([{id}], command) + .catch(e => console.warn('cannot perform action', e, command, user)); + } + catch (e) { + console.warn(e); + } +}); + +const badge = async reason => { + const now = Date.now(); + if (now - badge.date < 500) { + if (badge.busy) { + console.log('BUSY!'); + return new Promise((resolve, reject) => { + badge.caches.push({resolve, reject}); + }); + } + else { + core.log('Badge is called too soon. Ignoring this request', reason); + return Promise.resolve(); + } + } + badge.date = now; + badge.busy = true; + + core.log('badge is called', reason); + try { + await ready(); + const prefs = await core.storage.read({ + 'queries': CONFIGS['queries'], + 'default-queries': CONFIGS['default-queries'], + 'badge-format': CONFIGS['badge-text-format'], + 'opening-mode': CONFIGS['opening-mode'] + }); + const brokens = []; + await Promise.all(Object.values(users).map(async user => { + user.queries = user.queries || {}; + + const queries = (prefs.queries[user.email] || prefs['default-queries']); + if (queries.length === 0) { + queries.push(...prefs['default-queries']); + } + + return Promise.all(queries.map(query => user.engine.threads(query, false).then(o => { + if (query.includes('[silent]')) { + o.silent = true; + } + user.queries[query] = o; + }).catch(e => { + brokens.push(user.email); + user.queries = {}; + console.warn(e); + core.log(user.email, 'is logged-out', e.message); + }))); + })); + core.runtime.post({ + method: 'users-updated' + }); + const count = Object.values(users).map(o => o.queries).map(qs => Object.values(qs)).flat() + .reduce((p, c) => p + (c.silent ? 0 : c.resultSizeEstimate), 0); + core.log('badge is resolved', count); + + core.action.popup(count !== 0 && prefs['opening-mode'] === 'popup' ? 'data/popup/index.html?mode=popup' : ''); + + if (count === 0) { + let color = brokens.length ? 'blue' : 'gray'; + // what if there is no logged-in account + if (Object.values(users).length === 0) { + color = 'blue'; + } + + let msg = color === 'blue' ? + await core.i18n.translate('bg_sign_out') : + await core.i18n.translate('bg_no_message') + '\n\n' + + await core.i18n.translate('bg_no_message_logged_in') + ': ' + + Object.keys(users).filter(u => brokens.indexOf(u) === -1).join(', '); + + if (brokens.length) { + msg += '\n\n' + await core.i18n.translate('bg_no_message_logged_out') + ': ' + brokens.join(', '); + } + core.action.set(color, '', '', msg); + + core.runtime.post({ + method: 'close-popup' + }); + } + else { + const msg = []; + for (const user of Object.values(users)) { + if (Object.keys(user.queries).length) { + const m = prefs['badge-format'] + .replace('{EMAIL}', user.email) + .replace('{DATE}', (new Date()).toLocaleString()); + + msg.push(m.replace(/(.*)@@(.*)/, (a, b, c) => { + return Object.entries(user.queries).map(([query, o]) => { + return b + c + .replace('{QUERY}', query) + .replace('{EMAIL}', user.email) + .replace('{COUNT}', o.resultSizeEstimate) + .replace('{SNIPPET}', o.snippet); + }).join('\n'); + })); + } + } + core.action.set( + brokens.length ? 'blue' : 'red', + count > 999 ? (count / 1000).toFixed() + 'k' : count, + '', + msg.join('\n\n') + ); + } + notify(); + for (const {resolve} of badge.caches) { + resolve(); + } + } + catch (e) { + console.warn('Unexpected Error', e); + core.action.set('blue', 'E', 'bg_unexpected_error', ': ' + e.message); + for (const {reject} of badge.caches) { + reject(e); + } + } + badge.busy = false; + badge.caches = []; +}; +badge.caches = []; + +core.runtime.start(() => { + core.action.set('blue', '...', 'bg_check_new_emails'); + badge('first-run'); + core.storage.read({ + 'badge-period': CONFIGS['badge-period'], // minutes + 'badge-delay': CONFIGS['badge-delay'], // minutes + 'badge-color': CONFIGS['badge-color'], + 'idle-detection': CONFIGS['idle-detection'] // minutes + }).then(prefs => { + core.action.color(prefs['badge-color']); + + core.alarms.create('badge', { + when: Date.now() + prefs['badge-delay'] * 60 * 1000, + periodInMinutes: prefs['badge-period'] + }); + + core.idle.set(prefs['idle-detection'] * 60); + }); +}); +core.alarms.fired(alarm => { + if (alarm.name === 'badge') { + badge('alarm'); + } +}); +if (typeof window !== 'undefined') { + window.addEventListener('online', () => badge('online')); +} +core.idle.fired(name => name === 'active' && badge('idle')); + +/* + storage calls + + ignore: ps['queries'] since it is fired by hard-refresh + +*/ +core.storage.changed(ps => { + if ( + ps['badge-text-format'] || ps['default-queries'] || ps['notification'] || + ps['ignored-users'] || ps['opening-mode'] || ps['api-client-id'] + ) { + badge('prefs-changed'); + } + if (ps['badge-period'] || ps['badge-delay']) { + core.storage.read({ + 'badge-period': CONFIGS['badge-period'], // minutes + 'badge-delay': CONFIGS['badge-delay'] // minutes + }).then(prefs => { + core.alarms.create('badge', { + when: Date.now() + prefs['badge-delay'] * 60 * 1000, + periodInMinutes: prefs['badge-period'] + }); + }); + } +}); diff --git a/v3.dev/configs.js b/v3.dev/configs.js new file mode 100644 index 00000000..e5802fa7 --- /dev/null +++ b/v3.dev/configs.js @@ -0,0 +1,48 @@ +const CONFIGS = { + 'opening-mode': 'popup', // tab, popup + 'default-page': 'https://mail.google.com/mail/u/0/#inbox', + /* engine */ + 'default-engine': 'rss', // 'rss' or 'api', + 'default-engine-mapping': {}, // {'me@gmail.com': 'api', 'you@gmail.com': 'rss'} + /* badge */ + 'badge-text-format': `{EMAIL}: + @@{QUERY} ({COUNT}) + +Last checked: {DATE}`, // valid keywords: "{EMAIL}", "{QUERY}", "{COUNT}", "{SNIPPET}", "{DATE}" + 'badge-delay': 10, // minutes + 'badge-period': 10, // minutes + 'badge-color': '#666', + 'idle-detection': 5, // minutes + /* popup */ + 'popup-csp': `default-src 'none'; style-src 'unsafe-inline';`, + 'popup-switch-to-unread-user': true, // try to find a logged-in user with unread emails + 'popup-switch-to-unread-query': true, // try to find a query for the current user with unread emails + 'popup-mark-read-on-view': false, + 'popup-switch-on-new': true, // switch to a user with unread emails + /* notification */ + 'queries': {}, // {me@gmail.com: ['label:inbox is:unread', ...]} + 'default-queries': ['label:INBOX is:unread'], // if an email does not have a query, use this + 'notification': {}, // {me@gmail.com: {'query': {sound: true, desktop: true, source: 0}}} + 'ignored-users': [], + 'notification-max-per-account': 3, // maximum number of simultaneous notifications per account + 'notification-delay': 500, // delay between multiple notifications in ms + 'notification-buttons': ['mark-as-read', 'archive'], + 'notification-type': 'each', + 'notification-text-format-combined': `{USER} {QUERY} ({COUNT})`, // valid keywords: "{USER}", "{QUERY}", "{COUNT}", "{SNIPPET}" + 'notification-text-format-each': `{USER} + +{SNIPPET}`, // valid keywords: "{USER}", "{QUERY}", "{COUNT}", "{SNIPPET}" + 'sound-volume': 0.8, + 'api-client-id': '' // [user-client-id].apps.googleusercontent.com +}; + +// preferences with no direct interaction +Object.assign(CONFIGS, { + 'popup-collapsed-message': 'snippet', // snippet or complete + 'popup-view': 'grid', // single, grid + 'grid-view': '12', // 11, 12, 1_1, 1_2 + 'popup-account': {}, // {user, query} + 'popup-mode': 'expanded', // collapsed or expanded + 'notification-counts': {}, // {email: {query: count}} + 'custom-sounds': {} // {'hash': {binary: '', id}} +}); diff --git a/v3.dev/core.js b/v3.dev/core.js new file mode 100644 index 00000000..2c61ab82 --- /dev/null +++ b/v3.dev/core.js @@ -0,0 +1,173 @@ +const isFirefox = /Firefox/.test(navigator.userAgent) || typeof InstallTrigger !== 'undefined'; + +const translate = async id => { + const lang = navigator.language.split('-')[0]; + translate.objects = translate.objects || await Promise.all([ + fetch('_locales/' + lang + '/messages.json').then(r => r.json()).catch(() => ({})), + fetch('_locales/en/messages.json').then(r => r.json()) + ]); + return translate.objects[0][id]?.message || translate.objects[1][id]?.message || id; +}; + +const core = {}; +core.storage = { + read(prefs) { + return new Promise(resolve => chrome.storage.local.get(prefs, resolve)); + }, + write(prefs) { + return new Promise(resolve => chrome.storage.local.set(prefs, resolve)); + }, + changed(c) { + chrome.storage.onChanged.addListener(c); + } +}; +core.log = (...args) => console.log(new Date().toISOString().substr(11), ...args); + +core.action = { + set(color, badge, id, extra = '') { + (chrome.browserAction || chrome.action).setIcon({ + path: { + '16': 'data/icons/colors/' + color + '/16.png', + '32': 'data/icons/colors/' + color + '/32.png' + } + }); + (chrome.browserAction || chrome.action).setBadgeText({ + text: badge + '' + }); + translate(id).then(title => (chrome.browserAction || chrome.action).setTitle({ + title: title + extra + })); + }, + badge() { + return new Promise(resolve => (chrome.browserAction || chrome.action).getBadgeText({}, resolve)); + }, + popup(popup) { + (chrome.browserAction || chrome.action).setPopup({popup}); + }, + click(c) { + (chrome.browserAction || chrome.action).onClicked.addListener(c); + }, + color(color) { + (chrome.browserAction || chrome.action).setBadgeBackgroundColor({ + color + }); + } +}; + +core.page = { + open(props) { + return new Promise(resolve => chrome.tabs.create(props, resolve)); + }, + find(props) { + return new Promise(resolve => chrome.tabs.query(props, resolve)); + }, + options() { + chrome.runtime.openOptionsPage(); + }, + focus(tab, refresh = false) { + chrome.tabs.update(tab.id, { + active: true + }); + chrome.windows.update(tab.windowId, { + focused: true + }); + if (refresh) { + chrome.tabs.reload(tab.id); + } + } +}; + +core.i18n = { + get(id) { + return chrome.i18n.getMessage(id); + }, + translate(id) { + return translate(id); + } +}; + +core.runtime = { + start(c) { + chrome.runtime.onInstalled.addListener(c); + chrome.runtime.onStartup.addListener(c); + }, + message(c) { + chrome.runtime.onMessage.addListener(c); + }, + post(o, c = () => { + chrome.runtime.lastError; + }) { + chrome.runtime.sendMessage(o, c); + }, + reload() { + chrome.runtime.reload(); + }, + connect(prps) { + chrome.runtime.connect(prps); + }, + port(c) { + chrome.runtime.onConnect.addListener(c); + } +}; + +core.alarms = { + create(...args) { + chrome.alarms.create(...args); + }, + fired(c) { + chrome.alarms.onAlarm.addListener(c); + } +}; + +core.notify = { + create(name, o) { + if (isFirefox) { + delete o.buttons; + } + chrome.notifications.create(name, { + type: 'basic', + iconUrl: '/data/icons/colors/red/48.png', + title: chrome.runtime.getManifest().name, + ...o + }); + }, + fired(c) { + chrome.notifications.onClicked.addListener(c); + }, + buttons(c) { + chrome.notifications.onButtonClicked.addListener(c); + } +}; + +core.idle = { + set(num) { + chrome.idle.setDetectionInterval(num); + }, + fired(c) { + chrome.idle.onStateChanged.addListener(c); + } +}; + +core.download = options => new Promise((resolve, reject) => { + chrome.downloads.download(options, id => { + const lastError = chrome.runtime.lastError; + if (lastError) { + reject(lastError); + } + else { + resolve(id); + } + }); +}); + +core.context = { + create(props) { + if (typeof window === 'undefined') { + props.contexts = props.contexts.map(s => s === 'browser_action' ? 'action' : s); + } + chrome.contextMenus.create(props); + }, + fired(c) { + chrome.contextMenus.onClicked.addListener(c); + } +}; diff --git a/v3.dev/data/icons/colors/blue/16.png b/v3.dev/data/icons/colors/blue/16.png new file mode 100644 index 00000000..939325e6 Binary files /dev/null and b/v3.dev/data/icons/colors/blue/16.png differ diff --git a/v3.dev/data/icons/colors/blue/32.png b/v3.dev/data/icons/colors/blue/32.png new file mode 100644 index 00000000..93cfc929 Binary files /dev/null and b/v3.dev/data/icons/colors/blue/32.png differ diff --git a/v3.dev/data/icons/colors/gray/16.png b/v3.dev/data/icons/colors/gray/16.png new file mode 100644 index 00000000..3016815f Binary files /dev/null and b/v3.dev/data/icons/colors/gray/16.png differ diff --git a/v3.dev/data/icons/colors/gray/32.png b/v3.dev/data/icons/colors/gray/32.png new file mode 100644 index 00000000..be207cb9 Binary files /dev/null and b/v3.dev/data/icons/colors/gray/32.png differ diff --git a/v3.dev/data/icons/colors/red/128.png b/v3.dev/data/icons/colors/red/128.png new file mode 100644 index 00000000..1ab860e8 Binary files /dev/null and b/v3.dev/data/icons/colors/red/128.png differ diff --git a/v3.dev/data/icons/colors/red/16.png b/v3.dev/data/icons/colors/red/16.png new file mode 100644 index 00000000..6c4a9c6d Binary files /dev/null and b/v3.dev/data/icons/colors/red/16.png differ diff --git a/v3.dev/data/icons/colors/red/256.png b/v3.dev/data/icons/colors/red/256.png new file mode 100644 index 00000000..b1d4e957 Binary files /dev/null and b/v3.dev/data/icons/colors/red/256.png differ diff --git a/v3.dev/data/icons/colors/red/32.png b/v3.dev/data/icons/colors/red/32.png new file mode 100644 index 00000000..d823c40f Binary files /dev/null and b/v3.dev/data/icons/colors/red/32.png differ diff --git a/v3.dev/data/icons/colors/red/48.png b/v3.dev/data/icons/colors/red/48.png new file mode 100644 index 00000000..a20818c5 Binary files /dev/null and b/v3.dev/data/icons/colors/red/48.png differ diff --git a/v3.dev/data/icons/colors/red/512.png b/v3.dev/data/icons/colors/red/512.png new file mode 100644 index 00000000..e988d3bb Binary files /dev/null and b/v3.dev/data/icons/colors/red/512.png differ diff --git a/v3.dev/data/icons/colors/red/64.png b/v3.dev/data/icons/colors/red/64.png new file mode 100644 index 00000000..8794f468 Binary files /dev/null and b/v3.dev/data/icons/colors/red/64.png differ diff --git a/v3.dev/data/inject/watch.js b/v3.dev/data/inject/watch.js new file mode 100644 index 00000000..84244a8b --- /dev/null +++ b/v3.dev/data/inject/watch.js @@ -0,0 +1,42 @@ +let timeout = false; + +const script = document.createElement('script'); +script.addEventListener('change', e => { + e.stopPropagation(); + e.preventDefault(); + + if (timeout === false) { + timeout = setTimeout(() => { + timeout = false; + chrome.runtime.sendMessage({ + method: 'soft-refresh' + }); + }, 3000); + } +}); +script.textContent = `{ + const script = document.currentScript; + const pointer = Object.getOwnPropertyDescriptor(Document.prototype, 'title'); + let title; + Object.defineProperty(document, 'title', { + enumerable: true, + configurable: true, + get() { + return title; + }, + set(v) { + if (title !== v) { + script.dispatchEvent(new Event('change')); + } + title = v; + pointer.set.call(this, v); + } + }); +}`; +document.documentElement.appendChild(script); +script.remove(); + +window.addEventListener('beforeunload', () => chrome.runtime.sendMessage({ + method: 'soft-refresh', + delay: 1000 +})); diff --git a/v3.dev/data/options/index.css b/v3.dev/data/options/index.css new file mode 100644 index 00000000..3b5fdf97 --- /dev/null +++ b/v3.dev/data/options/index.css @@ -0,0 +1,145 @@ +:root { + --white: #fff; + --gray: #f5f5f5; + --dark-gray: #a0a0a0; + --red: #fee; + --blue: #dfeaff; +} + +body { + font-size: 13px; + font-family: Arial, "Helvetica Neue", Helvetica, sans-serif; + max-width: 80%; + margin: 0 auto; + display: grid; + grid-template-rows: minmax(1fr, min-content) 1fr min-content; + height: 100vh; + overflow: hidden; +} + +@media screen and (max-width: 700px) { + body { + margin: 0 10px; + max-width: unset; + } +} +select { + justify-self: end; +} +.button, +select, +button, +input[type=submit], +input[type=button] { + box-sizing: border-box; + color: #444; + background-image: linear-gradient(rgb(237, 237, 237), rgb(237, 237, 237) 38%, rgb(222, 222, 222)); + box-shadow: rgba(0, 0, 0, 0.08) 0 1px 0, rgba(255, 255, 255, 0.75) 0 1px 2px inset; + text-shadow: rgb(240, 240, 240) 0 1px 0; + border: solid 1px rgba(0, 0, 0, 0.25); + padding: 5px; + cursor: pointer; +} +input[type=button]:disabled { + opacity: 0.5; + cursor: default; +} +textarea, +input[type=text], +input[type=number] { + border: none; + text-indent: 5px; + outline: none; + background-color: var(--gray); +} +input[type=text], +input[type=number] { + height: 24px; +} +input[type=number] { + justify-self: end; +} +textarea:focus, +input[type=text]:focus, +input[type=number]:focus { + background-color: var(--blue); +} +h1 { + font-size: 100%; + text-align: center; + background: var(--red); + padding: 10px; +} + +.two { + display: grid; + grid-template-columns: min-content 1fr; + white-space: nowrap; + grid-gap: 10px; + align-items: center; +} +.two .fill { + grid-column: 1/3; +} +.hidden { + display: none !important; +} +.note { + color: var(--dark-gray); + white-space: normal; +} +.auto { + overflow: auto; +} + +#add-notification { + display: grid; + grid-template-rows: min-content min-content; + grid-gap: 10px; + white-space: nowrap; + margin-top: 10px; +} +#add-notification > div:first-child { + display: grid; + grid-gap: 5px; + grid-template-columns: 1fr 2fr 32px 32px 80px; + align-items: center; +} +@media screen and (max-width: 600px) { + #add-notification > div:first-child { + grid-template-columns: 1fr 2fr 32px 32px; + } +} +#add-notification > div:last-child { + justify-self: end; + display: grid; + grid-template-columns: min-content min-content min-content; + grid-gap: 10px; +} +#add-notification input[type=file] { + display: none; +} +#add-notification input[type=checkbox] { + justify-self: center; +} + +#notifications { + display: grid; + grid-template-columns: min-content 1fr min-content min-content min-content min-content; + white-space: nowrap; + grid-gap: 10px; + overflow: hidden; + margin-top: 20px; + align-items: center; +} +#notifications > div { + display: contents; +} +#notifications [data-id="query"] { + overflow: hidden; + text-overflow: ellipsis; +} +#tools { + align-self: end; + justify-self: end; +} diff --git a/v3.dev/data/options/index.html b/v3.dev/data/options/index.html new file mode 100644 index 00000000..0874ca36 --- /dev/null +++ b/v3.dev/data/options/index.html @@ -0,0 +1,112 @@ + + + + Options Page :: Gmail™ Notifier (Dev Edition) + + + + + +
    +

    + + + + + + +

    + + + + +

    + + + +
    + + {EMAIL}, + {QUERY}, + {COUNT}, + {SNIPPET}, + {DATE}, + {EMAIL} +
    + + + + +

    + + + + + + + + +
    +
    +

    +
    + + +
    +
    +
    + + + + + +
    +
    + + + +
    +
    +
    +
    + + + + + + - +
    + +
    +
    +

    + + + + + +

    + + + + + diff --git a/v3.dev/data/options/index.js b/v3.dev/data/options/index.js new file mode 100644 index 00000000..15fc5b33 --- /dev/null +++ b/v3.dev/data/options/index.js @@ -0,0 +1,189 @@ +/* global core, CONFIGS */ + +const toast = document.getElementById('toast'); + +/* localization */ +[...document.querySelectorAll('[data-i18n]')].forEach(e => { + if (e.dataset.i18nValue) { + e.setAttribute(e.dataset.i18nValue, core.i18n.get(e.dataset.i18n)); + } + else { + e.textContent = core.i18n.get(e.dataset.i18n); + } +}); +[...document.querySelectorAll('[data-i18n-title]')].forEach(e => { + e.title = core.i18n.get(e.dataset.i18nTitle); +}); + +const build = prefs => { + const e = document.getElementById('notifications'); + for (const n of [...e.querySelectorAll('.entry')]) { + n.remove(); + } + + const t = document.querySelector('#notifications template'); + for (const [user, o] of Object.entries(prefs.notification)) { + for (const [query, op] of Object.entries(o)) { + const clone = document.importNode(t.content, true); + clone.querySelector('[data-id=user]').textContent = user; + clone.querySelector('[data-id=query]').textContent = query; + clone.querySelector('[data-id=sound]').textContent = op.sound ? 'True' : 'False'; + clone.querySelector('[data-id=desktop]').textContent = op.desktop ? 'True' : 'False'; + clone.querySelector('[data-id=source]').textContent = op.source; + clone.querySelector('[data-i18n="op_n_remove"]').value = core.i18n.get('op_n_remove'); + e.appendChild(clone); + } + } + if (Object.keys(prefs.notification).length === 0) { + e.classList.add('hidden'); + } +}; + +core.storage.read({ + 'opening-mode': CONFIGS['opening-mode'], + 'default-page': CONFIGS['default-page'], + 'default-engine': CONFIGS['default-engine'], + 'badge-text-format': CONFIGS['badge-text-format'], + 'ignored-users': CONFIGS['ignored-users'], + 'notification': CONFIGS['notification'], + 'popup-mark-read-on-view': CONFIGS['popup-mark-read-on-view'], + 'popup-csp': CONFIGS['popup-csp'], + 'badge-period': CONFIGS['badge-period'], + 'api-client-id': CONFIGS['api-client-id'] +}).then(prefs => { + document.getElementById('opening-mode').value = prefs['opening-mode']; + document.getElementById('default-page').value = prefs['default-page']; + document.getElementById('default-engine').value = prefs['default-engine']; + document.getElementById('badge-text-format').value = prefs['badge-text-format']; + document.getElementById('ignored-users').value = prefs['ignored-users']; + document.getElementById('popup-mark-read-on-view').checked = prefs['popup-mark-read-on-view']; + document.getElementById('popup-csp').value = prefs['popup-csp']; + document.getElementById('badge-period').value = prefs['badge-period']; + document.getElementById('api-client-id').value = prefs['api-client-id']; + + build(prefs); +}); + +document.getElementById('add-notification').addEventListener('submit', async e => { + e.preventDefault(); + + const prefs = await core.storage.read({ + 'notification': CONFIGS['notification'] + }); + const user = e.target.elements.user.value; + const query = e.target.elements.query.value; + prefs.notification[user] = prefs.notification[user] || {}; + prefs.notification[user][query] = { + sound: e.target.elements.sound.checked, + desktop: e.target.elements.desktop.checked, + source: e.target.elements.source.value + }; + await core.storage.write(prefs); + build(prefs); +}); + +document.getElementById('add-custom-sound').addEventListener('change', e => { + const file = e.target.files[0]; + const reader = new FileReader(); + reader.onload = async () => { + e.value = ''; + const code = await crypto.subtle.digest('SHA-256', reader.result); + const hash = Array.from(new Uint8Array(code)).map(b => b.toString(16).padStart(2, '0')).join(''); + + const prefs = await core.storage.read({ + 'custom-sounds': CONFIGS['custom-sounds'] + }); + const next = n => { + document.querySelector('#add-notification [name="source"]').value = n; + alert(core.i18n.get('op_msg_sound_id').replace('%%', n)); + }; + + if (prefs['custom-sounds'][hash]) { + next(prefs['custom-sounds'][hash].id); + } + else { + const r = new FileReader(); + r.onload = async () => { + let id = 10; + while (Object.values(prefs['custom-sounds']).some(o => o.id === id)) { + id += 1; + } + prefs['custom-sounds'][hash] = { + id, + binary: r.result + }; + await core.storage.write(prefs); + next(id); + }; + r.readAsDataURL(file); + } + }; + if (file.size < 2 * 1024 * 1024) { + reader.readAsArrayBuffer(file); + } + else { + alert(core.i18n.get('op_msg_large_file')); + } +}); +document.getElementById('notifications').addEventListener('click', async e => { + if (e.target.dataset.command === 'remove') { + const parent = e.target.closest('.entry'); + const user = parent.querySelector('[data-id=user]').textContent; + const query = parent.querySelector('[data-id=query]').textContent; + const prefs = await core.storage.read({ + 'notification': CONFIGS['notification'] + }); + delete prefs.notification[user][query]; + if (Object.keys(prefs.notification[user]).length === 0) { + delete prefs.notification[user]; + } + await core.storage.write(prefs); + parent.remove(); + } +}); + +// save +document.getElementById('save').addEventListener('click', async () => { + await core.storage.write({ + 'opening-mode': document.getElementById('opening-mode').value, + 'default-page': document.getElementById('default-page').value, + 'default-engine': document.getElementById('default-engine').value, + 'badge-text-format': document.getElementById('badge-text-format').value, + 'ignored-users': document.getElementById('ignored-users').value, + 'popup-mark-read-on-view': document.getElementById('popup-mark-read-on-view').checked, + 'popup-csp': document.getElementById('popup-csp').value, + 'badge-period': Math.max(1, document.getElementById('badge-period').value), + 'badge-delay': Math.max(1, document.getElementById('badge-period').value), + 'api-client-id': document.getElementById('api-client-id').value + }); + toast.textContent = core.i18n.get('op_msg_saved'); + setTimeout(() => toast.textContent = '', 2000); +}); +// reset +document.getElementById('reset').addEventListener('click', e => { + if (e.detail === 1) { + toast.textContent = core.i18n.get('op_msg_reset'); + window.setTimeout(() => toast.textContent = '', 2000); + } + else { + localStorage.clear(); + chrome.storage.local.clear(() => { + chrome.runtime.reload(); + window.close(); + }); + } +}); +// support +document.getElementById('support').addEventListener('click', () => chrome.tabs.create({ + url: chrome.runtime.getManifest().homepage_url + '?rd=donate' +})); +// native +document.getElementById('native').addEventListener('click', () => chrome.permissions.request({ + permissions: ['nativeMessaging'] +}, granted => { + if (granted) { + core.runtime.post({ + method: 'hard-refresh' + }); + } +})); diff --git a/v3.dev/data/popup/api.js b/v3.dev/data/popup/api.js new file mode 100644 index 00000000..bffe83c4 --- /dev/null +++ b/v3.dev/data/popup/api.js @@ -0,0 +1,351 @@ +/* global core, post, active, moment, CONFIGS */ + +const api = {}; + +const scrollIntoView = e => { + const out = () => { + const rect = e.getBoundingClientRect(); + if (rect.bottom < 0 || rect.left > window.innerWidth || rect.top > window.innerHeight) { + return true; + } + const d = document.elementFromPoint(rect.left, rect.top); + return e.contains(d) === false; + }; + if (out()) { + e.scrollIntoView(); + } +}; + +/* api.dom */ +api.dom = { + entries(selected = false) { + if (selected) { + return [...document.querySelectorAll('#entries input:checked')]; + } + return [...document.querySelectorAll('#entries input')]; + }, + entry(selected) { + return document.querySelector('#entries input' + (selected ? ':checked' : '')); + } +}; + +/* api.navigate */ +api.navigate = direction => { + const inputs = api.dom.entries(true); + if (inputs.length) { + const input = direction === 'next' ? inputs[inputs.length - 1] : inputs[0]; + const li = input.closest('li'); + const d = direction === 'next' ? li.nextElementSibling : li.previousElementSibling; + if (d) { + d.querySelector('input').dispatchEvent(new CustomEvent('click', { + detail: { + 'consider-trusted': true + }, + bubbles: true + })); + d.querySelector('input').click(); + return scrollIntoView(d); + } + } + const input = api.dom.entry(); + if (input) { + input.click(); + scrollIntoView(input.closest('li')); + } +}; + +/* api.view */ +{ + const content = document.getElementById('content'); + api.view = { + clear() { + content.textContent = ''; + }, + async display(threads) { + content.classList.add('loading'); + api.view.clear(); + let n = 0; + for (const thread of threads) { + const h2 = document.createElement('h2'); + h2.textContent = core.i18n.get('pp_next_thread'); + h2.classList.add('next-thread'); + content.appendChild(h2); + + const {messages, error} = await post({ + method: 'read-a-thread', + thread + }); + + const prefs = await core.storage.read({ + 'popup-csp': CONFIGS['popup-csp'], + 'popup-collapsed-message': CONFIGS['popup-collapsed-message'] + }); + if (error) { + console.warn(error); + return alert(error.message || error); + } + for (const message of messages.reverse()) { + const iframe = document.createElement('iframe'); + iframe.src = 'view/view.html'; + const index = n; + iframe.onload = () => { + // resize observer + const resize = () => { + const d = () => { + if (iframe.contentDocument) { + iframe.style.height = iframe.contentDocument.documentElement.scrollHeight + 'px'; + } + }; + clearTimeout(resize.id); + resize.id = setTimeout(d, 200); + }; + const resizeObserver = new ResizeObserver(resize); + resizeObserver.observe(iframe.contentDocument.documentElement); + // show message + iframe.contentWindow.postMessage({ + 'mode': document.body.classList.contains('collapsed') ? 'collapsed' : 'expanded', + 'com': prefs['popup-collapsed-message'], + 'method': 'show-message', + 'csp': prefs['popup-csp'], + 'user-href': thread['user-href'], + 'base': thread.base, + message, + index + }, '*'); + }; + content.appendChild(iframe); + n += 1; + } + } + content.classList.remove('loading'); + } + }; +} + +/* api.users */ +{ + const e = document.getElementById('user'); + api.users = { + clear() { + e.textContent = ''; + }, + async build() { + const prefs = await core.storage.read({ + 'popup-account': CONFIGS['popup-account'], + 'popup-switch-to-unread-user': CONFIGS['popup-switch-to-unread-user'] + }); + Object.keys(active.users).forEach(user => { + const option = document.createElement('option'); + option.value = option.textContent = user; + option.selected = prefs['popup-account'].user === user; + e.appendChild(option); + }); + // what if the user does not have new email + if (prefs['popup-switch-to-unread-user']) { + if (Object.values(active.users[active.user].queries || {}).some(o => o.resultSizeEstimate) === false) { + for (const [user, o] of Object.entries(active.users)) { + if (Object.values(o.queries || {}).some(o => o.resultSizeEstimate)) { + e.value = user; + break; + } + } + } + } + e.dispatchEvent(new Event('change')); + }, + async queries() { + const prefs = await core.storage.read({ + 'queries': CONFIGS['queries'], + 'default-queries': CONFIGS['default-queries'] + }); + let qs = prefs['default-queries']; + if (prefs.queries[active.user]) { + qs = prefs.queries[active.user]; + } + return qs; + } + }; +} + +/* api.query */ +{ + const e = document.getElementById('search'); + const history = document.getElementById('history'); + api.query = { + async build() { + api.query.clear(); + + const prefs = await core.storage.read({ + 'popup-switch-to-unread-query': CONFIGS['popup-switch-to-unread-query'], + 'popup-account': CONFIGS['popup-account'], + 'default-queries': CONFIGS['default-queries'] + }); + + const queries = active.users[active.user]?.queries || {}; + for (const query of Object.keys(queries)) { + const option = document.createElement('option'); + option.textContent = option.value = query; + history.appendChild(option); + } + if (prefs['popup-account'].user === active.user) { + history.value = e.value = prefs['popup-account'].query; + } + if (e.value === '') { + history.value = e.value = prefs['default-queries'][0]; + } + // what is the active query does not have emails + if (prefs['popup-switch-to-unread-query']) { + // what id a custom query is searched which needs to be fetched + if (queries[active.query] && !queries[active.query]?.resultSizeEstimate) { + for (const [query, o] of Object.entries(queries)) { + if (o.resultSizeEstimate) { + history.value = e.value = query; + break; + } + } + } + } + e.dispatchEvent(new Event('search')); + }, + clear() { + history.textContent = ''; + e.value = ''; + } + }; +} + +/* api.entries */ +{ + const entries = document.getElementById('entries'); + const t = document.getElementById('t-entry'); + api.entries = { + clear() { + entries.textContent = ''; + document.getElementById('total').textContent = '-'; + document.title = active.user + '- Gmail Notifier'; + }, + async build(threads = [], e) { + api.entries.clear(); + document.getElementById('total').textContent = threads.length; + document.title = active.user + ` (${threads.length}) - Gmail Notifier`; + + const prefs = await core.storage.read({ + 'popup-account': CONFIGS['popup-account'] + }); + + for (const thread of threads) { + if (thread.messages.error) { + console.warn('ignoring a thread', thread); + continue; + } + const clone = document.importNode(t.content, true); + const input = clone.querySelector('input'); + input.thread = thread; + input.dataset.thread = thread.id; + + input.dataset.read = thread.messages.labelIds.indexOf('UNREAD') === -1; + input.dataset.star = thread.messages.labelIds.includes('STARRED'); + + if (thread.messages.date) { + clone.querySelector('[data-id=date]').textContent = thread.messages.date; + } + else { + const date = moment(parseInt(thread.messages.internalDate)); + clone.querySelector('[data-id=date]').textContent = date.fromNow(); + } + + const sender = thread.messages.payload.headers.filter(a => a.name === 'From').shift(); + clone.querySelector('[data-id=sender]').title = + clone.querySelector('[data-id=sender]').textContent = sender ? sender.value : ''; + + clone.querySelector('[data-id=snippet]').title = + clone.querySelector('[data-id=snippet]').textContent = thread.snippet || ''; + + for (const name of thread.messages.labelIds) { + if ([...window.HIDDENS, ...window.DISABLED].some(s => s === name.toLowerCase())) { + continue; + } + const span = document.createElement('span'); + span.classList.add('tag'); + span.textContent = name; + clone.querySelector('[data-id=tags]').appendChild(span); + } + + entries.appendChild(clone); + } + let ids = []; + if (prefs['popup-account'].user === active.user && prefs['popup-account'].query === active.query) { + ids = prefs['popup-account'].threads; + } + // select threads + for (const id of ids) { + entries.querySelector(`input[data-thread="${id}"]`)?.click(); + } + // select the first thread if no thread is selected + if (api.dom.entry(true) === null) { + api.dom.entry()?.click(); + } + // scroll into view + const input = api.dom.entry(true); + if (input) { + scrollIntoView(input.closest('li')); + } + else { + api.update.buttons(); + } + }, + remove(li) { + li.remove(); + const total = api.dom.entries().length; + document.getElementById('total').textContent = total; + document.title = active.user + ` (${total}) - Gmail Notifier`; + } + }; +} + +api.update = { + stat() { + const lis = api.dom.entries().map(e => e.closest('li')); + const r = { + total: lis.length + }; + + const input = api.dom.entry(true); + const li = input?.closest('li'); + r.current = li ? lis.indexOf(li) : -1; + r.read = input?.dataset.read === 'true'; + + return r; + } +}; +/* update notification */ +{ + const sound = document.getElementById('sound'); + api.update.notification = async () => { + const queries = await api.users.queries(); + + sound.classList[queries.indexOf(active.query) === -1 ? 'remove' : 'add']('active'); + sound.classList[active.query.includes('[silent]') ? 'add' : 'remove']('silent'); + }; +} +/* update current */ +api.update.buttons = () => { + const {current, total, read} = api.update.stat(); + document.getElementById('current').textContent = current === -1 ? 0 : (current + 1); + + document.getElementById('previous').disabled = current === -1 ? true : (current === 0); + document.getElementById('next').disabled = current === -1 ? true : (current === total - 1); + + document.getElementById('sound').disabled = active.user === ''; + + document.getElementById('archive').disabled = + document.getElementById('delete').disabled = + document.getElementById('report').disabled = + document.getElementById('mark-as-read').disabled = + document.getElementById('mark-all-as-read').disabled = current === -1; + + document.getElementById('inbox').disabled = !active.users[active.user].href; + + document.getElementById('mark-as-read').value = core.i18n.get(read ? 'pp_mark_as_unread' : 'pp_mark_as_read'); + document.getElementById('mark-as-read').dataset.command = read ? 'mark-as-unread' : 'mark-as-read'; +}; diff --git a/v3.dev/data/popup/commands.js b/v3.dev/data/popup/commands.js new file mode 100644 index 00000000..243793b8 --- /dev/null +++ b/v3.dev/data/popup/commands.js @@ -0,0 +1,193 @@ +/* global post, core, api, active */ + +const command = async (e, name, isTrusted = false) => { + let es; + if (name === 'add-star' || name === 'remove-star') { + const li = e.target.closest('li'); + es = [{ + thread: li.querySelector('input').thread, + li + }]; + } + else { + es = api.dom.entries(true).map(e => ({ + thread: e.thread, + li: e.closest('li') + })); + } + if (es.length) { + e.target.disabled = true; + e.target.classList.add('loading'); + + for (const act of command.map[name]) { + if (act === 'post') { + const r = await post({ + method: 'run-a-command', + name, + threads: es.map(e => e.thread) + }); + const o = r ? r.filter(o => o.error).shift() : false; + if (o) { + console.warn(o); + return alert(core.i18n.get('pp_action_failed') + '\n\n' + o.error.message); + } + } + else if (act === 'next') { // only move to next on a user action + if (isTrusted) { + document.getElementById('next').click(); + } + } + else if (act === 'update') { + const ni = api.dom.entry(true); + + es.map(({li}) => li.querySelector('input')).forEach(input => { + if (name === 'mark-as-unread') { + input.dataset.read = false; + // remove label + const n = input.thread.messages.labelIds.indexOf('UNREAD'); + if (n === -1) { + input.thread.messages.labelIds.push('UNREAD'); + } + } + else { + input.dataset.read = true; + // remove label + const n = input.thread.messages.labelIds.indexOf('UNREAD'); + if (n !== -1) { + input.thread.messages.labelIds.splice(n, 1); + } + } + // if navigation to next failed, update button states + if (ni === input) { + api.update.buttons(); + } + }); + } + else if (act === 'remove') { + es.map(({li}) => api.entries.remove(li)); + } + } + + e.target.disabled = false; + e.target.classList.remove('loading'); + } + else { + alert('select a thread and retry'); + } +}; +command.map = { + 'mark-as-read': ['post', 'next', 'update'], + 'mark-as-unread': ['post', 'next', 'update'], + 'mark-all-as-read': ['post', 'next', 'update'], + 'archive': ['post', 'next', 'remove'], + 'delete': ['post', 'next', 'remove'], + 'report': ['post', 'next', 'remove'], + 'add-star': ['post'], + 'remove-star': ['post'] +}; + +document.getElementById('options').onclick = () => core.page.options(); +document.getElementById('archive').onclick = e => command(e, 'archive', true); +document.getElementById('delete').onclick = e => command(e, 'delete', true); +document.getElementById('report').onclick = e => command(e, 'report', true); +document.getElementById('mark-as-read').onclick = e => command(e, e.target.dataset.command, true); +document.getElementById('mark-all-as-read').onclick = async e => { + const threads = api.dom.entries().map(e => e.thread); + if (threads.length) { + e.target.disabled = true; + e.target.classList.add('loading'); + await post({ + method: 'run-a-command', + name: 'mark-as-read', + threads + }); + location.reload(); + } +}; +document.getElementById('inbox').onclick = () => core.page.open({ + url: active.users[active.user].href +}); +document.getElementById('refresh').onclick = async e => { + e.target.disabled = true; + e.target.classList.add('loading'); + await post({ + method: 'hard-refresh' + }); + location.reload(); +}; +{ + const s = document.getElementById('search'); + document.addEventListener('keydown', e => { + if (e.target === s) { + return; + } + const meta = e.ctrlKey || e.metaKey; + + if (e.code === 'KeyK' && e.shiftKey) { + const user = document.getElementById('user'); + user.selectedIndex = (user.childElementCount + user.selectedIndex - 1) % user.childElementCount; + user.dispatchEvent(new Event('change')); + } + else if (e.code === 'KeyJ' && e.shiftKey) { + const history = document.getElementById('history'); + history.selectedIndex = (history.selectedIndex + 1) % history.childElementCount; + history.dispatchEvent(new Event('change')); + } + else if (e.code === 'KeyK' && meta) { + const history = document.getElementById('history'); + history.selectedIndex = (history.childElementCount + history.selectedIndex - 1) % history.childElementCount; + history.dispatchEvent(new Event('change')); + } + else if (e.code === 'KeyJ' && meta) { + const user = document.getElementById('user'); + user.selectedIndex = (user.selectedIndex + 1) % user.childElementCount; + user.dispatchEvent(new Event('change')); + } + else if (e.code === 'KeyJ') { + document.getElementById('previous').click(); + } + else if (e.code === 'KeyK') { + document.getElementById('next').click(); + } + else if (e.code === 'KeyE') { + document.getElementById('archive').click(); + } + else if (e.code === 'KeyR') { + document.getElementById('refresh').click(); + } + else if (e.code === 'KeyI' && e.shiftKey) { + const input = document.getElementById('mark-as-read'); + if (input.dataset.command === 'mark-as-read') { + input.click(); + } + } + else if (e.code === 'KeyU' && e.shiftKey) { + const input = document.getElementById('mark-as-read'); + if (input.dataset.command === 'mark-as-unread') { + input.click(); + } + } + else if (e.key === '#') { + document.getElementById('delete').click(); + } + else if (e.key === '!') { + document.getElementById('report').click(); + } + else if (e.code === 'KeyF' && meta) { + document.getElementById('search').focus(); + e.preventDefault(); + } + else if (e.code === 'KeyA' && meta) { + api.dom.entries().forEach(o => o.checked = e.shiftKey ? false : true); + e.preventDefault(); + } + else if (e.code === 'KeyA' && e.shiftKey) { + document.getElementById('sound').click(); + e.preventDefault(); + } + else if (e.code === 'KeyV' && meta) { + document.getElementById('view').click(); + e.preventDefault(); + } + }); +} diff --git a/v3.dev/data/popup/externals/moment/README b/v3.dev/data/popup/externals/moment/README new file mode 100644 index 00000000..6ce175fe --- /dev/null +++ b/v3.dev/data/popup/externals/moment/README @@ -0,0 +1,2 @@ +Version 2.29.1 +https://momentjs.com/downloads/moment.js diff --git a/v3.dev/data/popup/externals/moment/moment.js b/v3.dev/data/popup/externals/moment/moment.js new file mode 100644 index 00000000..1484d6cc --- /dev/null +++ b/v3.dev/data/popup/externals/moment/moment.js @@ -0,0 +1,5670 @@ +//! moment.js +//! version : 2.29.1 +//! authors : Tim Wood, Iskren Chernev, Moment.js contributors +//! license : MIT +//! momentjs.com + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + global.moment = factory() +}(this, (function () { 'use strict'; + + var hookCallback; + + function hooks() { + return hookCallback.apply(null, arguments); + } + + // This is done to register the method called with moment() + // without creating circular dependencies. + function setHookCallback(callback) { + hookCallback = callback; + } + + function isArray(input) { + return ( + input instanceof Array || + Object.prototype.toString.call(input) === '[object Array]' + ); + } + + function isObject(input) { + // IE8 will treat undefined and null as object if it wasn't for + // input != null + return ( + input != null && + Object.prototype.toString.call(input) === '[object Object]' + ); + } + + function hasOwnProp(a, b) { + return Object.prototype.hasOwnProperty.call(a, b); + } + + function isObjectEmpty(obj) { + if (Object.getOwnPropertyNames) { + return Object.getOwnPropertyNames(obj).length === 0; + } else { + var k; + for (k in obj) { + if (hasOwnProp(obj, k)) { + return false; + } + } + return true; + } + } + + function isUndefined(input) { + return input === void 0; + } + + function isNumber(input) { + return ( + typeof input === 'number' || + Object.prototype.toString.call(input) === '[object Number]' + ); + } + + function isDate(input) { + return ( + input instanceof Date || + Object.prototype.toString.call(input) === '[object Date]' + ); + } + + function map(arr, fn) { + var res = [], + i; + for (i = 0; i < arr.length; ++i) { + res.push(fn(arr[i], i)); + } + return res; + } + + function extend(a, b) { + for (var i in b) { + if (hasOwnProp(b, i)) { + a[i] = b[i]; + } + } + + if (hasOwnProp(b, 'toString')) { + a.toString = b.toString; + } + + if (hasOwnProp(b, 'valueOf')) { + a.valueOf = b.valueOf; + } + + return a; + } + + function createUTC(input, format, locale, strict) { + return createLocalOrUTC(input, format, locale, strict, true).utc(); + } + + function defaultParsingFlags() { + // We need to deep clone this object. + return { + empty: false, + unusedTokens: [], + unusedInput: [], + overflow: -2, + charsLeftOver: 0, + nullInput: false, + invalidEra: null, + invalidMonth: null, + invalidFormat: false, + userInvalidated: false, + iso: false, + parsedDateParts: [], + era: null, + meridiem: null, + rfc2822: false, + weekdayMismatch: false, + }; + } + + function getParsingFlags(m) { + if (m._pf == null) { + m._pf = defaultParsingFlags(); + } + return m._pf; + } + + var some; + if (Array.prototype.some) { + some = Array.prototype.some; + } else { + some = function (fun) { + var t = Object(this), + len = t.length >>> 0, + i; + + for (i = 0; i < len; i++) { + if (i in t && fun.call(this, t[i], i, t)) { + return true; + } + } + + return false; + }; + } + + function isValid(m) { + if (m._isValid == null) { + var flags = getParsingFlags(m), + parsedParts = some.call(flags.parsedDateParts, function (i) { + return i != null; + }), + isNowValid = + !isNaN(m._d.getTime()) && + flags.overflow < 0 && + !flags.empty && + !flags.invalidEra && + !flags.invalidMonth && + !flags.invalidWeekday && + !flags.weekdayMismatch && + !flags.nullInput && + !flags.invalidFormat && + !flags.userInvalidated && + (!flags.meridiem || (flags.meridiem && parsedParts)); + + if (m._strict) { + isNowValid = + isNowValid && + flags.charsLeftOver === 0 && + flags.unusedTokens.length === 0 && + flags.bigHour === undefined; + } + + if (Object.isFrozen == null || !Object.isFrozen(m)) { + m._isValid = isNowValid; + } else { + return isNowValid; + } + } + return m._isValid; + } + + function createInvalid(flags) { + var m = createUTC(NaN); + if (flags != null) { + extend(getParsingFlags(m), flags); + } else { + getParsingFlags(m).userInvalidated = true; + } + + return m; + } + + // Plugins that add properties should also add the key here (null value), + // so we can properly clone ourselves. + var momentProperties = (hooks.momentProperties = []), + updateInProgress = false; + + function copyConfig(to, from) { + var i, prop, val; + + if (!isUndefined(from._isAMomentObject)) { + to._isAMomentObject = from._isAMomentObject; + } + if (!isUndefined(from._i)) { + to._i = from._i; + } + if (!isUndefined(from._f)) { + to._f = from._f; + } + if (!isUndefined(from._l)) { + to._l = from._l; + } + if (!isUndefined(from._strict)) { + to._strict = from._strict; + } + if (!isUndefined(from._tzm)) { + to._tzm = from._tzm; + } + if (!isUndefined(from._isUTC)) { + to._isUTC = from._isUTC; + } + if (!isUndefined(from._offset)) { + to._offset = from._offset; + } + if (!isUndefined(from._pf)) { + to._pf = getParsingFlags(from); + } + if (!isUndefined(from._locale)) { + to._locale = from._locale; + } + + if (momentProperties.length > 0) { + for (i = 0; i < momentProperties.length; i++) { + prop = momentProperties[i]; + val = from[prop]; + if (!isUndefined(val)) { + to[prop] = val; + } + } + } + + return to; + } + + // Moment prototype object + function Moment(config) { + copyConfig(this, config); + this._d = new Date(config._d != null ? config._d.getTime() : NaN); + if (!this.isValid()) { + this._d = new Date(NaN); + } + // Prevent infinite loop in case updateOffset creates new moment + // objects. + if (updateInProgress === false) { + updateInProgress = true; + hooks.updateOffset(this); + updateInProgress = false; + } + } + + function isMoment(obj) { + return ( + obj instanceof Moment || (obj != null && obj._isAMomentObject != null) + ); + } + + function warn(msg) { + if ( + hooks.suppressDeprecationWarnings === false && + typeof console !== 'undefined' && + console.warn + ) { + console.warn('Deprecation warning: ' + msg); + } + } + + function deprecate(msg, fn) { + var firstTime = true; + + return extend(function () { + if (hooks.deprecationHandler != null) { + hooks.deprecationHandler(null, msg); + } + if (firstTime) { + var args = [], + arg, + i, + key; + for (i = 0; i < arguments.length; i++) { + arg = ''; + if (typeof arguments[i] === 'object') { + arg += '\n[' + i + '] '; + for (key in arguments[0]) { + if (hasOwnProp(arguments[0], key)) { + arg += key + ': ' + arguments[0][key] + ', '; + } + } + arg = arg.slice(0, -2); // Remove trailing comma and space + } else { + arg = arguments[i]; + } + args.push(arg); + } + warn( + msg + + '\nArguments: ' + + Array.prototype.slice.call(args).join('') + + '\n' + + new Error().stack + ); + firstTime = false; + } + return fn.apply(this, arguments); + }, fn); + } + + var deprecations = {}; + + function deprecateSimple(name, msg) { + if (hooks.deprecationHandler != null) { + hooks.deprecationHandler(name, msg); + } + if (!deprecations[name]) { + warn(msg); + deprecations[name] = true; + } + } + + hooks.suppressDeprecationWarnings = false; + hooks.deprecationHandler = null; + + function isFunction(input) { + return ( + (typeof Function !== 'undefined' && input instanceof Function) || + Object.prototype.toString.call(input) === '[object Function]' + ); + } + + function set(config) { + var prop, i; + for (i in config) { + if (hasOwnProp(config, i)) { + prop = config[i]; + if (isFunction(prop)) { + this[i] = prop; + } else { + this['_' + i] = prop; + } + } + } + this._config = config; + // Lenient ordinal parsing accepts just a number in addition to + // number + (possibly) stuff coming from _dayOfMonthOrdinalParse. + // TODO: Remove "ordinalParse" fallback in next major release. + this._dayOfMonthOrdinalParseLenient = new RegExp( + (this._dayOfMonthOrdinalParse.source || this._ordinalParse.source) + + '|' + + /\d{1,2}/.source + ); + } + + function mergeConfigs(parentConfig, childConfig) { + var res = extend({}, parentConfig), + prop; + for (prop in childConfig) { + if (hasOwnProp(childConfig, prop)) { + if (isObject(parentConfig[prop]) && isObject(childConfig[prop])) { + res[prop] = {}; + extend(res[prop], parentConfig[prop]); + extend(res[prop], childConfig[prop]); + } else if (childConfig[prop] != null) { + res[prop] = childConfig[prop]; + } else { + delete res[prop]; + } + } + } + for (prop in parentConfig) { + if ( + hasOwnProp(parentConfig, prop) && + !hasOwnProp(childConfig, prop) && + isObject(parentConfig[prop]) + ) { + // make sure changes to properties don't modify parent config + res[prop] = extend({}, res[prop]); + } + } + return res; + } + + function Locale(config) { + if (config != null) { + this.set(config); + } + } + + var keys; + + if (Object.keys) { + keys = Object.keys; + } else { + keys = function (obj) { + var i, + res = []; + for (i in obj) { + if (hasOwnProp(obj, i)) { + res.push(i); + } + } + return res; + }; + } + + var defaultCalendar = { + sameDay: '[Today at] LT', + nextDay: '[Tomorrow at] LT', + nextWeek: 'dddd [at] LT', + lastDay: '[Yesterday at] LT', + lastWeek: '[Last] dddd [at] LT', + sameElse: 'L', + }; + + function calendar(key, mom, now) { + var output = this._calendar[key] || this._calendar['sameElse']; + return isFunction(output) ? output.call(mom, now) : output; + } + + function zeroFill(number, targetLength, forceSign) { + var absNumber = '' + Math.abs(number), + zerosToFill = targetLength - absNumber.length, + sign = number >= 0; + return ( + (sign ? (forceSign ? '+' : '') : '-') + + Math.pow(10, Math.max(0, zerosToFill)).toString().substr(1) + + absNumber + ); + } + + var formattingTokens = /(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|N{1,5}|YYYYYY|YYYYY|YYYY|YY|y{2,4}|yo?|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g, + localFormattingTokens = /(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g, + formatFunctions = {}, + formatTokenFunctions = {}; + + // token: 'M' + // padded: ['MM', 2] + // ordinal: 'Mo' + // callback: function () { this.month() + 1 } + function addFormatToken(token, padded, ordinal, callback) { + var func = callback; + if (typeof callback === 'string') { + func = function () { + return this[callback](); + }; + } + if (token) { + formatTokenFunctions[token] = func; + } + if (padded) { + formatTokenFunctions[padded[0]] = function () { + return zeroFill(func.apply(this, arguments), padded[1], padded[2]); + }; + } + if (ordinal) { + formatTokenFunctions[ordinal] = function () { + return this.localeData().ordinal( + func.apply(this, arguments), + token + ); + }; + } + } + + function removeFormattingTokens(input) { + if (input.match(/\[[\s\S]/)) { + return input.replace(/^\[|\]$/g, ''); + } + return input.replace(/\\/g, ''); + } + + function makeFormatFunction(format) { + var array = format.match(formattingTokens), + i, + length; + + for (i = 0, length = array.length; i < length; i++) { + if (formatTokenFunctions[array[i]]) { + array[i] = formatTokenFunctions[array[i]]; + } else { + array[i] = removeFormattingTokens(array[i]); + } + } + + return function (mom) { + var output = '', + i; + for (i = 0; i < length; i++) { + output += isFunction(array[i]) + ? array[i].call(mom, format) + : array[i]; + } + return output; + }; + } + + // format date using native date object + function formatMoment(m, format) { + if (!m.isValid()) { + return m.localeData().invalidDate(); + } + + format = expandFormat(format, m.localeData()); + formatFunctions[format] = + formatFunctions[format] || makeFormatFunction(format); + + return formatFunctions[format](m); + } + + function expandFormat(format, locale) { + var i = 5; + + function replaceLongDateFormatTokens(input) { + return locale.longDateFormat(input) || input; + } + + localFormattingTokens.lastIndex = 0; + while (i >= 0 && localFormattingTokens.test(format)) { + format = format.replace( + localFormattingTokens, + replaceLongDateFormatTokens + ); + localFormattingTokens.lastIndex = 0; + i -= 1; + } + + return format; + } + + var defaultLongDateFormat = { + LTS: 'h:mm:ss A', + LT: 'h:mm A', + L: 'MM/DD/YYYY', + LL: 'MMMM D, YYYY', + LLL: 'MMMM D, YYYY h:mm A', + LLLL: 'dddd, MMMM D, YYYY h:mm A', + }; + + function longDateFormat(key) { + var format = this._longDateFormat[key], + formatUpper = this._longDateFormat[key.toUpperCase()]; + + if (format || !formatUpper) { + return format; + } + + this._longDateFormat[key] = formatUpper + .match(formattingTokens) + .map(function (tok) { + if ( + tok === 'MMMM' || + tok === 'MM' || + tok === 'DD' || + tok === 'dddd' + ) { + return tok.slice(1); + } + return tok; + }) + .join(''); + + return this._longDateFormat[key]; + } + + var defaultInvalidDate = 'Invalid date'; + + function invalidDate() { + return this._invalidDate; + } + + var defaultOrdinal = '%d', + defaultDayOfMonthOrdinalParse = /\d{1,2}/; + + function ordinal(number) { + return this._ordinal.replace('%d', number); + } + + var defaultRelativeTime = { + future: 'in %s', + past: '%s ago', + s: 'a few seconds', + ss: '%d seconds', + m: 'a minute', + mm: '%d minutes', + h: 'an hour', + hh: '%d hours', + d: 'a day', + dd: '%d days', + w: 'a week', + ww: '%d weeks', + M: 'a month', + MM: '%d months', + y: 'a year', + yy: '%d years', + }; + + function relativeTime(number, withoutSuffix, string, isFuture) { + var output = this._relativeTime[string]; + return isFunction(output) + ? output(number, withoutSuffix, string, isFuture) + : output.replace(/%d/i, number); + } + + function pastFuture(diff, output) { + var format = this._relativeTime[diff > 0 ? 'future' : 'past']; + return isFunction(format) ? format(output) : format.replace(/%s/i, output); + } + + var aliases = {}; + + function addUnitAlias(unit, shorthand) { + var lowerCase = unit.toLowerCase(); + aliases[lowerCase] = aliases[lowerCase + 's'] = aliases[shorthand] = unit; + } + + function normalizeUnits(units) { + return typeof units === 'string' + ? aliases[units] || aliases[units.toLowerCase()] + : undefined; + } + + function normalizeObjectUnits(inputObject) { + var normalizedInput = {}, + normalizedProp, + prop; + + for (prop in inputObject) { + if (hasOwnProp(inputObject, prop)) { + normalizedProp = normalizeUnits(prop); + if (normalizedProp) { + normalizedInput[normalizedProp] = inputObject[prop]; + } + } + } + + return normalizedInput; + } + + var priorities = {}; + + function addUnitPriority(unit, priority) { + priorities[unit] = priority; + } + + function getPrioritizedUnits(unitsObj) { + var units = [], + u; + for (u in unitsObj) { + if (hasOwnProp(unitsObj, u)) { + units.push({ unit: u, priority: priorities[u] }); + } + } + units.sort(function (a, b) { + return a.priority - b.priority; + }); + return units; + } + + function isLeapYear(year) { + return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0; + } + + function absFloor(number) { + if (number < 0) { + // -0 -> 0 + return Math.ceil(number) || 0; + } else { + return Math.floor(number); + } + } + + function toInt(argumentForCoercion) { + var coercedNumber = +argumentForCoercion, + value = 0; + + if (coercedNumber !== 0 && isFinite(coercedNumber)) { + value = absFloor(coercedNumber); + } + + return value; + } + + function makeGetSet(unit, keepTime) { + return function (value) { + if (value != null) { + set$1(this, unit, value); + hooks.updateOffset(this, keepTime); + return this; + } else { + return get(this, unit); + } + }; + } + + function get(mom, unit) { + return mom.isValid() + ? mom._d['get' + (mom._isUTC ? 'UTC' : '') + unit]() + : NaN; + } + + function set$1(mom, unit, value) { + if (mom.isValid() && !isNaN(value)) { + if ( + unit === 'FullYear' && + isLeapYear(mom.year()) && + mom.month() === 1 && + mom.date() === 29 + ) { + value = toInt(value); + mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit]( + value, + mom.month(), + daysInMonth(value, mom.month()) + ); + } else { + mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value); + } + } + } + + // MOMENTS + + function stringGet(units) { + units = normalizeUnits(units); + if (isFunction(this[units])) { + return this[units](); + } + return this; + } + + function stringSet(units, value) { + if (typeof units === 'object') { + units = normalizeObjectUnits(units); + var prioritized = getPrioritizedUnits(units), + i; + for (i = 0; i < prioritized.length; i++) { + this[prioritized[i].unit](units[prioritized[i].unit]); + } + } else { + units = normalizeUnits(units); + if (isFunction(this[units])) { + return this[units](value); + } + } + return this; + } + + var match1 = /\d/, // 0 - 9 + match2 = /\d\d/, // 00 - 99 + match3 = /\d{3}/, // 000 - 999 + match4 = /\d{4}/, // 0000 - 9999 + match6 = /[+-]?\d{6}/, // -999999 - 999999 + match1to2 = /\d\d?/, // 0 - 99 + match3to4 = /\d\d\d\d?/, // 999 - 9999 + match5to6 = /\d\d\d\d\d\d?/, // 99999 - 999999 + match1to3 = /\d{1,3}/, // 0 - 999 + match1to4 = /\d{1,4}/, // 0 - 9999 + match1to6 = /[+-]?\d{1,6}/, // -999999 - 999999 + matchUnsigned = /\d+/, // 0 - inf + matchSigned = /[+-]?\d+/, // -inf - inf + matchOffset = /Z|[+-]\d\d:?\d\d/gi, // +00:00 -00:00 +0000 -0000 or Z + matchShortOffset = /Z|[+-]\d\d(?::?\d\d)?/gi, // +00 -00 +00:00 -00:00 +0000 -0000 or Z + matchTimestamp = /[+-]?\d+(\.\d{1,3})?/, // 123456789 123456789.123 + // any word (or two) characters or numbers including two/three word month in arabic. + // includes scottish gaelic two word and hyphenated months + matchWord = /[0-9]{0,256}['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFF07\uFF10-\uFFEF]{1,256}|[\u0600-\u06FF\/]{1,256}(\s*?[\u0600-\u06FF]{1,256}){1,2}/i, + regexes; + + regexes = {}; + + function addRegexToken(token, regex, strictRegex) { + regexes[token] = isFunction(regex) + ? regex + : function (isStrict, localeData) { + return isStrict && strictRegex ? strictRegex : regex; + }; + } + + function getParseRegexForToken(token, config) { + if (!hasOwnProp(regexes, token)) { + return new RegExp(unescapeFormat(token)); + } + + return regexes[token](config._strict, config._locale); + } + + // Code from http://stackoverflow.com/questions/3561493/is-there-a-regexp-escape-function-in-javascript + function unescapeFormat(s) { + return regexEscape( + s + .replace('\\', '') + .replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g, function ( + matched, + p1, + p2, + p3, + p4 + ) { + return p1 || p2 || p3 || p4; + }) + ); + } + + function regexEscape(s) { + return s.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'); + } + + var tokens = {}; + + function addParseToken(token, callback) { + var i, + func = callback; + if (typeof token === 'string') { + token = [token]; + } + if (isNumber(callback)) { + func = function (input, array) { + array[callback] = toInt(input); + }; + } + for (i = 0; i < token.length; i++) { + tokens[token[i]] = func; + } + } + + function addWeekParseToken(token, callback) { + addParseToken(token, function (input, array, config, token) { + config._w = config._w || {}; + callback(input, config._w, config, token); + }); + } + + function addTimeToArrayFromToken(token, input, config) { + if (input != null && hasOwnProp(tokens, token)) { + tokens[token](input, config._a, config, token); + } + } + + var YEAR = 0, + MONTH = 1, + DATE = 2, + HOUR = 3, + MINUTE = 4, + SECOND = 5, + MILLISECOND = 6, + WEEK = 7, + WEEKDAY = 8; + + function mod(n, x) { + return ((n % x) + x) % x; + } + + var indexOf; + + if (Array.prototype.indexOf) { + indexOf = Array.prototype.indexOf; + } else { + indexOf = function (o) { + // I know + var i; + for (i = 0; i < this.length; ++i) { + if (this[i] === o) { + return i; + } + } + return -1; + }; + } + + function daysInMonth(year, month) { + if (isNaN(year) || isNaN(month)) { + return NaN; + } + var modMonth = mod(month, 12); + year += (month - modMonth) / 12; + return modMonth === 1 + ? isLeapYear(year) + ? 29 + : 28 + : 31 - ((modMonth % 7) % 2); + } + + // FORMATTING + + addFormatToken('M', ['MM', 2], 'Mo', function () { + return this.month() + 1; + }); + + addFormatToken('MMM', 0, 0, function (format) { + return this.localeData().monthsShort(this, format); + }); + + addFormatToken('MMMM', 0, 0, function (format) { + return this.localeData().months(this, format); + }); + + // ALIASES + + addUnitAlias('month', 'M'); + + // PRIORITY + + addUnitPriority('month', 8); + + // PARSING + + addRegexToken('M', match1to2); + addRegexToken('MM', match1to2, match2); + addRegexToken('MMM', function (isStrict, locale) { + return locale.monthsShortRegex(isStrict); + }); + addRegexToken('MMMM', function (isStrict, locale) { + return locale.monthsRegex(isStrict); + }); + + addParseToken(['M', 'MM'], function (input, array) { + array[MONTH] = toInt(input) - 1; + }); + + addParseToken(['MMM', 'MMMM'], function (input, array, config, token) { + var month = config._locale.monthsParse(input, token, config._strict); + // if we didn't find a month name, mark the date as invalid. + if (month != null) { + array[MONTH] = month; + } else { + getParsingFlags(config).invalidMonth = input; + } + }); + + // LOCALES + + var defaultLocaleMonths = 'January_February_March_April_May_June_July_August_September_October_November_December'.split( + '_' + ), + defaultLocaleMonthsShort = 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split( + '_' + ), + MONTHS_IN_FORMAT = /D[oD]?(\[[^\[\]]*\]|\s)+MMMM?/, + defaultMonthsShortRegex = matchWord, + defaultMonthsRegex = matchWord; + + function localeMonths(m, format) { + if (!m) { + return isArray(this._months) + ? this._months + : this._months['standalone']; + } + return isArray(this._months) + ? this._months[m.month()] + : this._months[ + (this._months.isFormat || MONTHS_IN_FORMAT).test(format) + ? 'format' + : 'standalone' + ][m.month()]; + } + + function localeMonthsShort(m, format) { + if (!m) { + return isArray(this._monthsShort) + ? this._monthsShort + : this._monthsShort['standalone']; + } + return isArray(this._monthsShort) + ? this._monthsShort[m.month()] + : this._monthsShort[ + MONTHS_IN_FORMAT.test(format) ? 'format' : 'standalone' + ][m.month()]; + } + + function handleStrictParse(monthName, format, strict) { + var i, + ii, + mom, + llc = monthName.toLocaleLowerCase(); + if (!this._monthsParse) { + // this is not used + this._monthsParse = []; + this._longMonthsParse = []; + this._shortMonthsParse = []; + for (i = 0; i < 12; ++i) { + mom = createUTC([2000, i]); + this._shortMonthsParse[i] = this.monthsShort( + mom, + '' + ).toLocaleLowerCase(); + this._longMonthsParse[i] = this.months(mom, '').toLocaleLowerCase(); + } + } + + if (strict) { + if (format === 'MMM') { + ii = indexOf.call(this._shortMonthsParse, llc); + return ii !== -1 ? ii : null; + } else { + ii = indexOf.call(this._longMonthsParse, llc); + return ii !== -1 ? ii : null; + } + } else { + if (format === 'MMM') { + ii = indexOf.call(this._shortMonthsParse, llc); + if (ii !== -1) { + return ii; + } + ii = indexOf.call(this._longMonthsParse, llc); + return ii !== -1 ? ii : null; + } else { + ii = indexOf.call(this._longMonthsParse, llc); + if (ii !== -1) { + return ii; + } + ii = indexOf.call(this._shortMonthsParse, llc); + return ii !== -1 ? ii : null; + } + } + } + + function localeMonthsParse(monthName, format, strict) { + var i, mom, regex; + + if (this._monthsParseExact) { + return handleStrictParse.call(this, monthName, format, strict); + } + + if (!this._monthsParse) { + this._monthsParse = []; + this._longMonthsParse = []; + this._shortMonthsParse = []; + } + + // TODO: add sorting + // Sorting makes sure if one month (or abbr) is a prefix of another + // see sorting in computeMonthsParse + for (i = 0; i < 12; i++) { + // make the regex if we don't have it already + mom = createUTC([2000, i]); + if (strict && !this._longMonthsParse[i]) { + this._longMonthsParse[i] = new RegExp( + '^' + this.months(mom, '').replace('.', '') + '$', + 'i' + ); + this._shortMonthsParse[i] = new RegExp( + '^' + this.monthsShort(mom, '').replace('.', '') + '$', + 'i' + ); + } + if (!strict && !this._monthsParse[i]) { + regex = + '^' + this.months(mom, '') + '|^' + this.monthsShort(mom, ''); + this._monthsParse[i] = new RegExp(regex.replace('.', ''), 'i'); + } + // test the regex + if ( + strict && + format === 'MMMM' && + this._longMonthsParse[i].test(monthName) + ) { + return i; + } else if ( + strict && + format === 'MMM' && + this._shortMonthsParse[i].test(monthName) + ) { + return i; + } else if (!strict && this._monthsParse[i].test(monthName)) { + return i; + } + } + } + + // MOMENTS + + function setMonth(mom, value) { + var dayOfMonth; + + if (!mom.isValid()) { + // No op + return mom; + } + + if (typeof value === 'string') { + if (/^\d+$/.test(value)) { + value = toInt(value); + } else { + value = mom.localeData().monthsParse(value); + // TODO: Another silent failure? + if (!isNumber(value)) { + return mom; + } + } + } + + dayOfMonth = Math.min(mom.date(), daysInMonth(mom.year(), value)); + mom._d['set' + (mom._isUTC ? 'UTC' : '') + 'Month'](value, dayOfMonth); + return mom; + } + + function getSetMonth(value) { + if (value != null) { + setMonth(this, value); + hooks.updateOffset(this, true); + return this; + } else { + return get(this, 'Month'); + } + } + + function getDaysInMonth() { + return daysInMonth(this.year(), this.month()); + } + + function monthsShortRegex(isStrict) { + if (this._monthsParseExact) { + if (!hasOwnProp(this, '_monthsRegex')) { + computeMonthsParse.call(this); + } + if (isStrict) { + return this._monthsShortStrictRegex; + } else { + return this._monthsShortRegex; + } + } else { + if (!hasOwnProp(this, '_monthsShortRegex')) { + this._monthsShortRegex = defaultMonthsShortRegex; + } + return this._monthsShortStrictRegex && isStrict + ? this._monthsShortStrictRegex + : this._monthsShortRegex; + } + } + + function monthsRegex(isStrict) { + if (this._monthsParseExact) { + if (!hasOwnProp(this, '_monthsRegex')) { + computeMonthsParse.call(this); + } + if (isStrict) { + return this._monthsStrictRegex; + } else { + return this._monthsRegex; + } + } else { + if (!hasOwnProp(this, '_monthsRegex')) { + this._monthsRegex = defaultMonthsRegex; + } + return this._monthsStrictRegex && isStrict + ? this._monthsStrictRegex + : this._monthsRegex; + } + } + + function computeMonthsParse() { + function cmpLenRev(a, b) { + return b.length - a.length; + } + + var shortPieces = [], + longPieces = [], + mixedPieces = [], + i, + mom; + for (i = 0; i < 12; i++) { + // make the regex if we don't have it already + mom = createUTC([2000, i]); + shortPieces.push(this.monthsShort(mom, '')); + longPieces.push(this.months(mom, '')); + mixedPieces.push(this.months(mom, '')); + mixedPieces.push(this.monthsShort(mom, '')); + } + // Sorting makes sure if one month (or abbr) is a prefix of another it + // will match the longer piece. + shortPieces.sort(cmpLenRev); + longPieces.sort(cmpLenRev); + mixedPieces.sort(cmpLenRev); + for (i = 0; i < 12; i++) { + shortPieces[i] = regexEscape(shortPieces[i]); + longPieces[i] = regexEscape(longPieces[i]); + } + for (i = 0; i < 24; i++) { + mixedPieces[i] = regexEscape(mixedPieces[i]); + } + + this._monthsRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i'); + this._monthsShortRegex = this._monthsRegex; + this._monthsStrictRegex = new RegExp( + '^(' + longPieces.join('|') + ')', + 'i' + ); + this._monthsShortStrictRegex = new RegExp( + '^(' + shortPieces.join('|') + ')', + 'i' + ); + } + + // FORMATTING + + addFormatToken('Y', 0, 0, function () { + var y = this.year(); + return y <= 9999 ? zeroFill(y, 4) : '+' + y; + }); + + addFormatToken(0, ['YY', 2], 0, function () { + return this.year() % 100; + }); + + addFormatToken(0, ['YYYY', 4], 0, 'year'); + addFormatToken(0, ['YYYYY', 5], 0, 'year'); + addFormatToken(0, ['YYYYYY', 6, true], 0, 'year'); + + // ALIASES + + addUnitAlias('year', 'y'); + + // PRIORITIES + + addUnitPriority('year', 1); + + // PARSING + + addRegexToken('Y', matchSigned); + addRegexToken('YY', match1to2, match2); + addRegexToken('YYYY', match1to4, match4); + addRegexToken('YYYYY', match1to6, match6); + addRegexToken('YYYYYY', match1to6, match6); + + addParseToken(['YYYYY', 'YYYYYY'], YEAR); + addParseToken('YYYY', function (input, array) { + array[YEAR] = + input.length === 2 ? hooks.parseTwoDigitYear(input) : toInt(input); + }); + addParseToken('YY', function (input, array) { + array[YEAR] = hooks.parseTwoDigitYear(input); + }); + addParseToken('Y', function (input, array) { + array[YEAR] = parseInt(input, 10); + }); + + // HELPERS + + function daysInYear(year) { + return isLeapYear(year) ? 366 : 365; + } + + // HOOKS + + hooks.parseTwoDigitYear = function (input) { + return toInt(input) + (toInt(input) > 68 ? 1900 : 2000); + }; + + // MOMENTS + + var getSetYear = makeGetSet('FullYear', true); + + function getIsLeapYear() { + return isLeapYear(this.year()); + } + + function createDate(y, m, d, h, M, s, ms) { + // can't just apply() to create a date: + // https://stackoverflow.com/q/181348 + var date; + // the date constructor remaps years 0-99 to 1900-1999 + if (y < 100 && y >= 0) { + // preserve leap years using a full 400 year cycle, then reset + date = new Date(y + 400, m, d, h, M, s, ms); + if (isFinite(date.getFullYear())) { + date.setFullYear(y); + } + } else { + date = new Date(y, m, d, h, M, s, ms); + } + + return date; + } + + function createUTCDate(y) { + var date, args; + // the Date.UTC function remaps years 0-99 to 1900-1999 + if (y < 100 && y >= 0) { + args = Array.prototype.slice.call(arguments); + // preserve leap years using a full 400 year cycle, then reset + args[0] = y + 400; + date = new Date(Date.UTC.apply(null, args)); + if (isFinite(date.getUTCFullYear())) { + date.setUTCFullYear(y); + } + } else { + date = new Date(Date.UTC.apply(null, arguments)); + } + + return date; + } + + // start-of-first-week - start-of-year + function firstWeekOffset(year, dow, doy) { + var // first-week day -- which january is always in the first week (4 for iso, 1 for other) + fwd = 7 + dow - doy, + // first-week day local weekday -- which local weekday is fwd + fwdlw = (7 + createUTCDate(year, 0, fwd).getUTCDay() - dow) % 7; + + return -fwdlw + fwd - 1; + } + + // https://en.wikipedia.org/wiki/ISO_week_date#Calculating_a_date_given_the_year.2C_week_number_and_weekday + function dayOfYearFromWeeks(year, week, weekday, dow, doy) { + var localWeekday = (7 + weekday - dow) % 7, + weekOffset = firstWeekOffset(year, dow, doy), + dayOfYear = 1 + 7 * (week - 1) + localWeekday + weekOffset, + resYear, + resDayOfYear; + + if (dayOfYear <= 0) { + resYear = year - 1; + resDayOfYear = daysInYear(resYear) + dayOfYear; + } else if (dayOfYear > daysInYear(year)) { + resYear = year + 1; + resDayOfYear = dayOfYear - daysInYear(year); + } else { + resYear = year; + resDayOfYear = dayOfYear; + } + + return { + year: resYear, + dayOfYear: resDayOfYear, + }; + } + + function weekOfYear(mom, dow, doy) { + var weekOffset = firstWeekOffset(mom.year(), dow, doy), + week = Math.floor((mom.dayOfYear() - weekOffset - 1) / 7) + 1, + resWeek, + resYear; + + if (week < 1) { + resYear = mom.year() - 1; + resWeek = week + weeksInYear(resYear, dow, doy); + } else if (week > weeksInYear(mom.year(), dow, doy)) { + resWeek = week - weeksInYear(mom.year(), dow, doy); + resYear = mom.year() + 1; + } else { + resYear = mom.year(); + resWeek = week; + } + + return { + week: resWeek, + year: resYear, + }; + } + + function weeksInYear(year, dow, doy) { + var weekOffset = firstWeekOffset(year, dow, doy), + weekOffsetNext = firstWeekOffset(year + 1, dow, doy); + return (daysInYear(year) - weekOffset + weekOffsetNext) / 7; + } + + // FORMATTING + + addFormatToken('w', ['ww', 2], 'wo', 'week'); + addFormatToken('W', ['WW', 2], 'Wo', 'isoWeek'); + + // ALIASES + + addUnitAlias('week', 'w'); + addUnitAlias('isoWeek', 'W'); + + // PRIORITIES + + addUnitPriority('week', 5); + addUnitPriority('isoWeek', 5); + + // PARSING + + addRegexToken('w', match1to2); + addRegexToken('ww', match1to2, match2); + addRegexToken('W', match1to2); + addRegexToken('WW', match1to2, match2); + + addWeekParseToken(['w', 'ww', 'W', 'WW'], function ( + input, + week, + config, + token + ) { + week[token.substr(0, 1)] = toInt(input); + }); + + // HELPERS + + // LOCALES + + function localeWeek(mom) { + return weekOfYear(mom, this._week.dow, this._week.doy).week; + } + + var defaultLocaleWeek = { + dow: 0, // Sunday is the first day of the week. + doy: 6, // The week that contains Jan 6th is the first week of the year. + }; + + function localeFirstDayOfWeek() { + return this._week.dow; + } + + function localeFirstDayOfYear() { + return this._week.doy; + } + + // MOMENTS + + function getSetWeek(input) { + var week = this.localeData().week(this); + return input == null ? week : this.add((input - week) * 7, 'd'); + } + + function getSetISOWeek(input) { + var week = weekOfYear(this, 1, 4).week; + return input == null ? week : this.add((input - week) * 7, 'd'); + } + + // FORMATTING + + addFormatToken('d', 0, 'do', 'day'); + + addFormatToken('dd', 0, 0, function (format) { + return this.localeData().weekdaysMin(this, format); + }); + + addFormatToken('ddd', 0, 0, function (format) { + return this.localeData().weekdaysShort(this, format); + }); + + addFormatToken('dddd', 0, 0, function (format) { + return this.localeData().weekdays(this, format); + }); + + addFormatToken('e', 0, 0, 'weekday'); + addFormatToken('E', 0, 0, 'isoWeekday'); + + // ALIASES + + addUnitAlias('day', 'd'); + addUnitAlias('weekday', 'e'); + addUnitAlias('isoWeekday', 'E'); + + // PRIORITY + addUnitPriority('day', 11); + addUnitPriority('weekday', 11); + addUnitPriority('isoWeekday', 11); + + // PARSING + + addRegexToken('d', match1to2); + addRegexToken('e', match1to2); + addRegexToken('E', match1to2); + addRegexToken('dd', function (isStrict, locale) { + return locale.weekdaysMinRegex(isStrict); + }); + addRegexToken('ddd', function (isStrict, locale) { + return locale.weekdaysShortRegex(isStrict); + }); + addRegexToken('dddd', function (isStrict, locale) { + return locale.weekdaysRegex(isStrict); + }); + + addWeekParseToken(['dd', 'ddd', 'dddd'], function (input, week, config, token) { + var weekday = config._locale.weekdaysParse(input, token, config._strict); + // if we didn't get a weekday name, mark the date as invalid + if (weekday != null) { + week.d = weekday; + } else { + getParsingFlags(config).invalidWeekday = input; + } + }); + + addWeekParseToken(['d', 'e', 'E'], function (input, week, config, token) { + week[token] = toInt(input); + }); + + // HELPERS + + function parseWeekday(input, locale) { + if (typeof input !== 'string') { + return input; + } + + if (!isNaN(input)) { + return parseInt(input, 10); + } + + input = locale.weekdaysParse(input); + if (typeof input === 'number') { + return input; + } + + return null; + } + + function parseIsoWeekday(input, locale) { + if (typeof input === 'string') { + return locale.weekdaysParse(input) % 7 || 7; + } + return isNaN(input) ? null : input; + } + + // LOCALES + function shiftWeekdays(ws, n) { + return ws.slice(n, 7).concat(ws.slice(0, n)); + } + + var defaultLocaleWeekdays = 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split( + '_' + ), + defaultLocaleWeekdaysShort = 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'), + defaultLocaleWeekdaysMin = 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'), + defaultWeekdaysRegex = matchWord, + defaultWeekdaysShortRegex = matchWord, + defaultWeekdaysMinRegex = matchWord; + + function localeWeekdays(m, format) { + var weekdays = isArray(this._weekdays) + ? this._weekdays + : this._weekdays[ + m && m !== true && this._weekdays.isFormat.test(format) + ? 'format' + : 'standalone' + ]; + return m === true + ? shiftWeekdays(weekdays, this._week.dow) + : m + ? weekdays[m.day()] + : weekdays; + } + + function localeWeekdaysShort(m) { + return m === true + ? shiftWeekdays(this._weekdaysShort, this._week.dow) + : m + ? this._weekdaysShort[m.day()] + : this._weekdaysShort; + } + + function localeWeekdaysMin(m) { + return m === true + ? shiftWeekdays(this._weekdaysMin, this._week.dow) + : m + ? this._weekdaysMin[m.day()] + : this._weekdaysMin; + } + + function handleStrictParse$1(weekdayName, format, strict) { + var i, + ii, + mom, + llc = weekdayName.toLocaleLowerCase(); + if (!this._weekdaysParse) { + this._weekdaysParse = []; + this._shortWeekdaysParse = []; + this._minWeekdaysParse = []; + + for (i = 0; i < 7; ++i) { + mom = createUTC([2000, 1]).day(i); + this._minWeekdaysParse[i] = this.weekdaysMin( + mom, + '' + ).toLocaleLowerCase(); + this._shortWeekdaysParse[i] = this.weekdaysShort( + mom, + '' + ).toLocaleLowerCase(); + this._weekdaysParse[i] = this.weekdays(mom, '').toLocaleLowerCase(); + } + } + + if (strict) { + if (format === 'dddd') { + ii = indexOf.call(this._weekdaysParse, llc); + return ii !== -1 ? ii : null; + } else if (format === 'ddd') { + ii = indexOf.call(this._shortWeekdaysParse, llc); + return ii !== -1 ? ii : null; + } else { + ii = indexOf.call(this._minWeekdaysParse, llc); + return ii !== -1 ? ii : null; + } + } else { + if (format === 'dddd') { + ii = indexOf.call(this._weekdaysParse, llc); + if (ii !== -1) { + return ii; + } + ii = indexOf.call(this._shortWeekdaysParse, llc); + if (ii !== -1) { + return ii; + } + ii = indexOf.call(this._minWeekdaysParse, llc); + return ii !== -1 ? ii : null; + } else if (format === 'ddd') { + ii = indexOf.call(this._shortWeekdaysParse, llc); + if (ii !== -1) { + return ii; + } + ii = indexOf.call(this._weekdaysParse, llc); + if (ii !== -1) { + return ii; + } + ii = indexOf.call(this._minWeekdaysParse, llc); + return ii !== -1 ? ii : null; + } else { + ii = indexOf.call(this._minWeekdaysParse, llc); + if (ii !== -1) { + return ii; + } + ii = indexOf.call(this._weekdaysParse, llc); + if (ii !== -1) { + return ii; + } + ii = indexOf.call(this._shortWeekdaysParse, llc); + return ii !== -1 ? ii : null; + } + } + } + + function localeWeekdaysParse(weekdayName, format, strict) { + var i, mom, regex; + + if (this._weekdaysParseExact) { + return handleStrictParse$1.call(this, weekdayName, format, strict); + } + + if (!this._weekdaysParse) { + this._weekdaysParse = []; + this._minWeekdaysParse = []; + this._shortWeekdaysParse = []; + this._fullWeekdaysParse = []; + } + + for (i = 0; i < 7; i++) { + // make the regex if we don't have it already + + mom = createUTC([2000, 1]).day(i); + if (strict && !this._fullWeekdaysParse[i]) { + this._fullWeekdaysParse[i] = new RegExp( + '^' + this.weekdays(mom, '').replace('.', '\\.?') + '$', + 'i' + ); + this._shortWeekdaysParse[i] = new RegExp( + '^' + this.weekdaysShort(mom, '').replace('.', '\\.?') + '$', + 'i' + ); + this._minWeekdaysParse[i] = new RegExp( + '^' + this.weekdaysMin(mom, '').replace('.', '\\.?') + '$', + 'i' + ); + } + if (!this._weekdaysParse[i]) { + regex = + '^' + + this.weekdays(mom, '') + + '|^' + + this.weekdaysShort(mom, '') + + '|^' + + this.weekdaysMin(mom, ''); + this._weekdaysParse[i] = new RegExp(regex.replace('.', ''), 'i'); + } + // test the regex + if ( + strict && + format === 'dddd' && + this._fullWeekdaysParse[i].test(weekdayName) + ) { + return i; + } else if ( + strict && + format === 'ddd' && + this._shortWeekdaysParse[i].test(weekdayName) + ) { + return i; + } else if ( + strict && + format === 'dd' && + this._minWeekdaysParse[i].test(weekdayName) + ) { + return i; + } else if (!strict && this._weekdaysParse[i].test(weekdayName)) { + return i; + } + } + } + + // MOMENTS + + function getSetDayOfWeek(input) { + if (!this.isValid()) { + return input != null ? this : NaN; + } + var day = this._isUTC ? this._d.getUTCDay() : this._d.getDay(); + if (input != null) { + input = parseWeekday(input, this.localeData()); + return this.add(input - day, 'd'); + } else { + return day; + } + } + + function getSetLocaleDayOfWeek(input) { + if (!this.isValid()) { + return input != null ? this : NaN; + } + var weekday = (this.day() + 7 - this.localeData()._week.dow) % 7; + return input == null ? weekday : this.add(input - weekday, 'd'); + } + + function getSetISODayOfWeek(input) { + if (!this.isValid()) { + return input != null ? this : NaN; + } + + // behaves the same as moment#day except + // as a getter, returns 7 instead of 0 (1-7 range instead of 0-6) + // as a setter, sunday should belong to the previous week. + + if (input != null) { + var weekday = parseIsoWeekday(input, this.localeData()); + return this.day(this.day() % 7 ? weekday : weekday - 7); + } else { + return this.day() || 7; + } + } + + function weekdaysRegex(isStrict) { + if (this._weekdaysParseExact) { + if (!hasOwnProp(this, '_weekdaysRegex')) { + computeWeekdaysParse.call(this); + } + if (isStrict) { + return this._weekdaysStrictRegex; + } else { + return this._weekdaysRegex; + } + } else { + if (!hasOwnProp(this, '_weekdaysRegex')) { + this._weekdaysRegex = defaultWeekdaysRegex; + } + return this._weekdaysStrictRegex && isStrict + ? this._weekdaysStrictRegex + : this._weekdaysRegex; + } + } + + function weekdaysShortRegex(isStrict) { + if (this._weekdaysParseExact) { + if (!hasOwnProp(this, '_weekdaysRegex')) { + computeWeekdaysParse.call(this); + } + if (isStrict) { + return this._weekdaysShortStrictRegex; + } else { + return this._weekdaysShortRegex; + } + } else { + if (!hasOwnProp(this, '_weekdaysShortRegex')) { + this._weekdaysShortRegex = defaultWeekdaysShortRegex; + } + return this._weekdaysShortStrictRegex && isStrict + ? this._weekdaysShortStrictRegex + : this._weekdaysShortRegex; + } + } + + function weekdaysMinRegex(isStrict) { + if (this._weekdaysParseExact) { + if (!hasOwnProp(this, '_weekdaysRegex')) { + computeWeekdaysParse.call(this); + } + if (isStrict) { + return this._weekdaysMinStrictRegex; + } else { + return this._weekdaysMinRegex; + } + } else { + if (!hasOwnProp(this, '_weekdaysMinRegex')) { + this._weekdaysMinRegex = defaultWeekdaysMinRegex; + } + return this._weekdaysMinStrictRegex && isStrict + ? this._weekdaysMinStrictRegex + : this._weekdaysMinRegex; + } + } + + function computeWeekdaysParse() { + function cmpLenRev(a, b) { + return b.length - a.length; + } + + var minPieces = [], + shortPieces = [], + longPieces = [], + mixedPieces = [], + i, + mom, + minp, + shortp, + longp; + for (i = 0; i < 7; i++) { + // make the regex if we don't have it already + mom = createUTC([2000, 1]).day(i); + minp = regexEscape(this.weekdaysMin(mom, '')); + shortp = regexEscape(this.weekdaysShort(mom, '')); + longp = regexEscape(this.weekdays(mom, '')); + minPieces.push(minp); + shortPieces.push(shortp); + longPieces.push(longp); + mixedPieces.push(minp); + mixedPieces.push(shortp); + mixedPieces.push(longp); + } + // Sorting makes sure if one weekday (or abbr) is a prefix of another it + // will match the longer piece. + minPieces.sort(cmpLenRev); + shortPieces.sort(cmpLenRev); + longPieces.sort(cmpLenRev); + mixedPieces.sort(cmpLenRev); + + this._weekdaysRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i'); + this._weekdaysShortRegex = this._weekdaysRegex; + this._weekdaysMinRegex = this._weekdaysRegex; + + this._weekdaysStrictRegex = new RegExp( + '^(' + longPieces.join('|') + ')', + 'i' + ); + this._weekdaysShortStrictRegex = new RegExp( + '^(' + shortPieces.join('|') + ')', + 'i' + ); + this._weekdaysMinStrictRegex = new RegExp( + '^(' + minPieces.join('|') + ')', + 'i' + ); + } + + // FORMATTING + + function hFormat() { + return this.hours() % 12 || 12; + } + + function kFormat() { + return this.hours() || 24; + } + + addFormatToken('H', ['HH', 2], 0, 'hour'); + addFormatToken('h', ['hh', 2], 0, hFormat); + addFormatToken('k', ['kk', 2], 0, kFormat); + + addFormatToken('hmm', 0, 0, function () { + return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2); + }); + + addFormatToken('hmmss', 0, 0, function () { + return ( + '' + + hFormat.apply(this) + + zeroFill(this.minutes(), 2) + + zeroFill(this.seconds(), 2) + ); + }); + + addFormatToken('Hmm', 0, 0, function () { + return '' + this.hours() + zeroFill(this.minutes(), 2); + }); + + addFormatToken('Hmmss', 0, 0, function () { + return ( + '' + + this.hours() + + zeroFill(this.minutes(), 2) + + zeroFill(this.seconds(), 2) + ); + }); + + function meridiem(token, lowercase) { + addFormatToken(token, 0, 0, function () { + return this.localeData().meridiem( + this.hours(), + this.minutes(), + lowercase + ); + }); + } + + meridiem('a', true); + meridiem('A', false); + + // ALIASES + + addUnitAlias('hour', 'h'); + + // PRIORITY + addUnitPriority('hour', 13); + + // PARSING + + function matchMeridiem(isStrict, locale) { + return locale._meridiemParse; + } + + addRegexToken('a', matchMeridiem); + addRegexToken('A', matchMeridiem); + addRegexToken('H', match1to2); + addRegexToken('h', match1to2); + addRegexToken('k', match1to2); + addRegexToken('HH', match1to2, match2); + addRegexToken('hh', match1to2, match2); + addRegexToken('kk', match1to2, match2); + + addRegexToken('hmm', match3to4); + addRegexToken('hmmss', match5to6); + addRegexToken('Hmm', match3to4); + addRegexToken('Hmmss', match5to6); + + addParseToken(['H', 'HH'], HOUR); + addParseToken(['k', 'kk'], function (input, array, config) { + var kInput = toInt(input); + array[HOUR] = kInput === 24 ? 0 : kInput; + }); + addParseToken(['a', 'A'], function (input, array, config) { + config._isPm = config._locale.isPM(input); + config._meridiem = input; + }); + addParseToken(['h', 'hh'], function (input, array, config) { + array[HOUR] = toInt(input); + getParsingFlags(config).bigHour = true; + }); + addParseToken('hmm', function (input, array, config) { + var pos = input.length - 2; + array[HOUR] = toInt(input.substr(0, pos)); + array[MINUTE] = toInt(input.substr(pos)); + getParsingFlags(config).bigHour = true; + }); + addParseToken('hmmss', function (input, array, config) { + var pos1 = input.length - 4, + pos2 = input.length - 2; + array[HOUR] = toInt(input.substr(0, pos1)); + array[MINUTE] = toInt(input.substr(pos1, 2)); + array[SECOND] = toInt(input.substr(pos2)); + getParsingFlags(config).bigHour = true; + }); + addParseToken('Hmm', function (input, array, config) { + var pos = input.length - 2; + array[HOUR] = toInt(input.substr(0, pos)); + array[MINUTE] = toInt(input.substr(pos)); + }); + addParseToken('Hmmss', function (input, array, config) { + var pos1 = input.length - 4, + pos2 = input.length - 2; + array[HOUR] = toInt(input.substr(0, pos1)); + array[MINUTE] = toInt(input.substr(pos1, 2)); + array[SECOND] = toInt(input.substr(pos2)); + }); + + // LOCALES + + function localeIsPM(input) { + // IE8 Quirks Mode & IE7 Standards Mode do not allow accessing strings like arrays + // Using charAt should be more compatible. + return (input + '').toLowerCase().charAt(0) === 'p'; + } + + var defaultLocaleMeridiemParse = /[ap]\.?m?\.?/i, + // Setting the hour should keep the time, because the user explicitly + // specified which hour they want. So trying to maintain the same hour (in + // a new timezone) makes sense. Adding/subtracting hours does not follow + // this rule. + getSetHour = makeGetSet('Hours', true); + + function localeMeridiem(hours, minutes, isLower) { + if (hours > 11) { + return isLower ? 'pm' : 'PM'; + } else { + return isLower ? 'am' : 'AM'; + } + } + + var baseConfig = { + calendar: defaultCalendar, + longDateFormat: defaultLongDateFormat, + invalidDate: defaultInvalidDate, + ordinal: defaultOrdinal, + dayOfMonthOrdinalParse: defaultDayOfMonthOrdinalParse, + relativeTime: defaultRelativeTime, + + months: defaultLocaleMonths, + monthsShort: defaultLocaleMonthsShort, + + week: defaultLocaleWeek, + + weekdays: defaultLocaleWeekdays, + weekdaysMin: defaultLocaleWeekdaysMin, + weekdaysShort: defaultLocaleWeekdaysShort, + + meridiemParse: defaultLocaleMeridiemParse, + }; + + // internal storage for locale config files + var locales = {}, + localeFamilies = {}, + globalLocale; + + function commonPrefix(arr1, arr2) { + var i, + minl = Math.min(arr1.length, arr2.length); + for (i = 0; i < minl; i += 1) { + if (arr1[i] !== arr2[i]) { + return i; + } + } + return minl; + } + + function normalizeLocale(key) { + return key ? key.toLowerCase().replace('_', '-') : key; + } + + // pick the locale from the array + // try ['en-au', 'en-gb'] as 'en-au', 'en-gb', 'en', as in move through the list trying each + // substring from most specific to least, but move to the next array item if it's a more specific variant than the current root + function chooseLocale(names) { + var i = 0, + j, + next, + locale, + split; + + while (i < names.length) { + split = normalizeLocale(names[i]).split('-'); + j = split.length; + next = normalizeLocale(names[i + 1]); + next = next ? next.split('-') : null; + while (j > 0) { + locale = loadLocale(split.slice(0, j).join('-')); + if (locale) { + return locale; + } + if ( + next && + next.length >= j && + commonPrefix(split, next) >= j - 1 + ) { + //the next array item is better than a shallower substring of this one + break; + } + j--; + } + i++; + } + return globalLocale; + } + + function loadLocale(name) { + var oldLocale = null, + aliasedRequire; + // TODO: Find a better way to register and load all the locales in Node + if ( + locales[name] === undefined && + typeof module !== 'undefined' && + module && + module.exports + ) { + try { + oldLocale = globalLocale._abbr; + aliasedRequire = require; + aliasedRequire('./locale/' + name); + getSetGlobalLocale(oldLocale); + } catch (e) { + // mark as not found to avoid repeating expensive file require call causing high CPU + // when trying to find en-US, en_US, en-us for every format call + locales[name] = null; // null means not found + } + } + return locales[name]; + } + + // This function will load locale and then set the global locale. If + // no arguments are passed in, it will simply return the current global + // locale key. + function getSetGlobalLocale(key, values) { + var data; + if (key) { + if (isUndefined(values)) { + data = getLocale(key); + } else { + data = defineLocale(key, values); + } + + if (data) { + // moment.duration._locale = moment._locale = data; + globalLocale = data; + } else { + if (typeof console !== 'undefined' && console.warn) { + //warn user if arguments are passed but the locale could not be set + console.warn( + 'Locale ' + key + ' not found. Did you forget to load it?' + ); + } + } + } + + return globalLocale._abbr; + } + + function defineLocale(name, config) { + if (config !== null) { + var locale, + parentConfig = baseConfig; + config.abbr = name; + if (locales[name] != null) { + deprecateSimple( + 'defineLocaleOverride', + 'use moment.updateLocale(localeName, config) to change ' + + 'an existing locale. moment.defineLocale(localeName, ' + + 'config) should only be used for creating a new locale ' + + 'See http://momentjs.com/guides/#/warnings/define-locale/ for more info.' + ); + parentConfig = locales[name]._config; + } else if (config.parentLocale != null) { + if (locales[config.parentLocale] != null) { + parentConfig = locales[config.parentLocale]._config; + } else { + locale = loadLocale(config.parentLocale); + if (locale != null) { + parentConfig = locale._config; + } else { + if (!localeFamilies[config.parentLocale]) { + localeFamilies[config.parentLocale] = []; + } + localeFamilies[config.parentLocale].push({ + name: name, + config: config, + }); + return null; + } + } + } + locales[name] = new Locale(mergeConfigs(parentConfig, config)); + + if (localeFamilies[name]) { + localeFamilies[name].forEach(function (x) { + defineLocale(x.name, x.config); + }); + } + + // backwards compat for now: also set the locale + // make sure we set the locale AFTER all child locales have been + // created, so we won't end up with the child locale set. + getSetGlobalLocale(name); + + return locales[name]; + } else { + // useful for testing + delete locales[name]; + return null; + } + } + + function updateLocale(name, config) { + if (config != null) { + var locale, + tmpLocale, + parentConfig = baseConfig; + + if (locales[name] != null && locales[name].parentLocale != null) { + // Update existing child locale in-place to avoid memory-leaks + locales[name].set(mergeConfigs(locales[name]._config, config)); + } else { + // MERGE + tmpLocale = loadLocale(name); + if (tmpLocale != null) { + parentConfig = tmpLocale._config; + } + config = mergeConfigs(parentConfig, config); + if (tmpLocale == null) { + // updateLocale is called for creating a new locale + // Set abbr so it will have a name (getters return + // undefined otherwise). + config.abbr = name; + } + locale = new Locale(config); + locale.parentLocale = locales[name]; + locales[name] = locale; + } + + // backwards compat for now: also set the locale + getSetGlobalLocale(name); + } else { + // pass null for config to unupdate, useful for tests + if (locales[name] != null) { + if (locales[name].parentLocale != null) { + locales[name] = locales[name].parentLocale; + if (name === getSetGlobalLocale()) { + getSetGlobalLocale(name); + } + } else if (locales[name] != null) { + delete locales[name]; + } + } + } + return locales[name]; + } + + // returns locale data + function getLocale(key) { + var locale; + + if (key && key._locale && key._locale._abbr) { + key = key._locale._abbr; + } + + if (!key) { + return globalLocale; + } + + if (!isArray(key)) { + //short-circuit everything else + locale = loadLocale(key); + if (locale) { + return locale; + } + key = [key]; + } + + return chooseLocale(key); + } + + function listLocales() { + return keys(locales); + } + + function checkOverflow(m) { + var overflow, + a = m._a; + + if (a && getParsingFlags(m).overflow === -2) { + overflow = + a[MONTH] < 0 || a[MONTH] > 11 + ? MONTH + : a[DATE] < 1 || a[DATE] > daysInMonth(a[YEAR], a[MONTH]) + ? DATE + : a[HOUR] < 0 || + a[HOUR] > 24 || + (a[HOUR] === 24 && + (a[MINUTE] !== 0 || + a[SECOND] !== 0 || + a[MILLISECOND] !== 0)) + ? HOUR + : a[MINUTE] < 0 || a[MINUTE] > 59 + ? MINUTE + : a[SECOND] < 0 || a[SECOND] > 59 + ? SECOND + : a[MILLISECOND] < 0 || a[MILLISECOND] > 999 + ? MILLISECOND + : -1; + + if ( + getParsingFlags(m)._overflowDayOfYear && + (overflow < YEAR || overflow > DATE) + ) { + overflow = DATE; + } + if (getParsingFlags(m)._overflowWeeks && overflow === -1) { + overflow = WEEK; + } + if (getParsingFlags(m)._overflowWeekday && overflow === -1) { + overflow = WEEKDAY; + } + + getParsingFlags(m).overflow = overflow; + } + + return m; + } + + // iso 8601 regex + // 0000-00-00 0000-W00 or 0000-W00-0 + T + 00 or 00:00 or 00:00:00 or 00:00:00.000 + +00:00 or +0000 or +00) + var extendedIsoRegex = /^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([+-]\d\d(?::?\d\d)?|\s*Z)?)?$/, + basicIsoRegex = /^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d|))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([+-]\d\d(?::?\d\d)?|\s*Z)?)?$/, + tzRegex = /Z|[+-]\d\d(?::?\d\d)?/, + isoDates = [ + ['YYYYYY-MM-DD', /[+-]\d{6}-\d\d-\d\d/], + ['YYYY-MM-DD', /\d{4}-\d\d-\d\d/], + ['GGGG-[W]WW-E', /\d{4}-W\d\d-\d/], + ['GGGG-[W]WW', /\d{4}-W\d\d/, false], + ['YYYY-DDD', /\d{4}-\d{3}/], + ['YYYY-MM', /\d{4}-\d\d/, false], + ['YYYYYYMMDD', /[+-]\d{10}/], + ['YYYYMMDD', /\d{8}/], + ['GGGG[W]WWE', /\d{4}W\d{3}/], + ['GGGG[W]WW', /\d{4}W\d{2}/, false], + ['YYYYDDD', /\d{7}/], + ['YYYYMM', /\d{6}/, false], + ['YYYY', /\d{4}/, false], + ], + // iso time formats and regexes + isoTimes = [ + ['HH:mm:ss.SSSS', /\d\d:\d\d:\d\d\.\d+/], + ['HH:mm:ss,SSSS', /\d\d:\d\d:\d\d,\d+/], + ['HH:mm:ss', /\d\d:\d\d:\d\d/], + ['HH:mm', /\d\d:\d\d/], + ['HHmmss.SSSS', /\d\d\d\d\d\d\.\d+/], + ['HHmmss,SSSS', /\d\d\d\d\d\d,\d+/], + ['HHmmss', /\d\d\d\d\d\d/], + ['HHmm', /\d\d\d\d/], + ['HH', /\d\d/], + ], + aspNetJsonRegex = /^\/?Date\((-?\d+)/i, + // RFC 2822 regex: For details see https://tools.ietf.org/html/rfc2822#section-3.3 + rfc2822 = /^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),?\s)?(\d{1,2})\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s(\d{2,4})\s(\d\d):(\d\d)(?::(\d\d))?\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|([+-]\d{4}))$/, + obsOffsets = { + UT: 0, + GMT: 0, + EDT: -4 * 60, + EST: -5 * 60, + CDT: -5 * 60, + CST: -6 * 60, + MDT: -6 * 60, + MST: -7 * 60, + PDT: -7 * 60, + PST: -8 * 60, + }; + + // date from iso format + function configFromISO(config) { + var i, + l, + string = config._i, + match = extendedIsoRegex.exec(string) || basicIsoRegex.exec(string), + allowTime, + dateFormat, + timeFormat, + tzFormat; + + if (match) { + getParsingFlags(config).iso = true; + + for (i = 0, l = isoDates.length; i < l; i++) { + if (isoDates[i][1].exec(match[1])) { + dateFormat = isoDates[i][0]; + allowTime = isoDates[i][2] !== false; + break; + } + } + if (dateFormat == null) { + config._isValid = false; + return; + } + if (match[3]) { + for (i = 0, l = isoTimes.length; i < l; i++) { + if (isoTimes[i][1].exec(match[3])) { + // match[2] should be 'T' or space + timeFormat = (match[2] || ' ') + isoTimes[i][0]; + break; + } + } + if (timeFormat == null) { + config._isValid = false; + return; + } + } + if (!allowTime && timeFormat != null) { + config._isValid = false; + return; + } + if (match[4]) { + if (tzRegex.exec(match[4])) { + tzFormat = 'Z'; + } else { + config._isValid = false; + return; + } + } + config._f = dateFormat + (timeFormat || '') + (tzFormat || ''); + configFromStringAndFormat(config); + } else { + config._isValid = false; + } + } + + function extractFromRFC2822Strings( + yearStr, + monthStr, + dayStr, + hourStr, + minuteStr, + secondStr + ) { + var result = [ + untruncateYear(yearStr), + defaultLocaleMonthsShort.indexOf(monthStr), + parseInt(dayStr, 10), + parseInt(hourStr, 10), + parseInt(minuteStr, 10), + ]; + + if (secondStr) { + result.push(parseInt(secondStr, 10)); + } + + return result; + } + + function untruncateYear(yearStr) { + var year = parseInt(yearStr, 10); + if (year <= 49) { + return 2000 + year; + } else if (year <= 999) { + return 1900 + year; + } + return year; + } + + function preprocessRFC2822(s) { + // Remove comments and folding whitespace and replace multiple-spaces with a single space + return s + .replace(/\([^)]*\)|[\n\t]/g, ' ') + .replace(/(\s\s+)/g, ' ') + .replace(/^\s\s*/, '') + .replace(/\s\s*$/, ''); + } + + function checkWeekday(weekdayStr, parsedInput, config) { + if (weekdayStr) { + // TODO: Replace the vanilla JS Date object with an independent day-of-week check. + var weekdayProvided = defaultLocaleWeekdaysShort.indexOf(weekdayStr), + weekdayActual = new Date( + parsedInput[0], + parsedInput[1], + parsedInput[2] + ).getDay(); + if (weekdayProvided !== weekdayActual) { + getParsingFlags(config).weekdayMismatch = true; + config._isValid = false; + return false; + } + } + return true; + } + + function calculateOffset(obsOffset, militaryOffset, numOffset) { + if (obsOffset) { + return obsOffsets[obsOffset]; + } else if (militaryOffset) { + // the only allowed military tz is Z + return 0; + } else { + var hm = parseInt(numOffset, 10), + m = hm % 100, + h = (hm - m) / 100; + return h * 60 + m; + } + } + + // date and time from ref 2822 format + function configFromRFC2822(config) { + var match = rfc2822.exec(preprocessRFC2822(config._i)), + parsedArray; + if (match) { + parsedArray = extractFromRFC2822Strings( + match[4], + match[3], + match[2], + match[5], + match[6], + match[7] + ); + if (!checkWeekday(match[1], parsedArray, config)) { + return; + } + + config._a = parsedArray; + config._tzm = calculateOffset(match[8], match[9], match[10]); + + config._d = createUTCDate.apply(null, config._a); + config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm); + + getParsingFlags(config).rfc2822 = true; + } else { + config._isValid = false; + } + } + + // date from 1) ASP.NET, 2) ISO, 3) RFC 2822 formats, or 4) optional fallback if parsing isn't strict + function configFromString(config) { + var matched = aspNetJsonRegex.exec(config._i); + if (matched !== null) { + config._d = new Date(+matched[1]); + return; + } + + configFromISO(config); + if (config._isValid === false) { + delete config._isValid; + } else { + return; + } + + configFromRFC2822(config); + if (config._isValid === false) { + delete config._isValid; + } else { + return; + } + + if (config._strict) { + config._isValid = false; + } else { + // Final attempt, use Input Fallback + hooks.createFromInputFallback(config); + } + } + + hooks.createFromInputFallback = deprecate( + 'value provided is not in a recognized RFC2822 or ISO format. moment construction falls back to js Date(), ' + + 'which is not reliable across all browsers and versions. Non RFC2822/ISO date formats are ' + + 'discouraged. Please refer to http://momentjs.com/guides/#/warnings/js-date/ for more info.', + function (config) { + config._d = new Date(config._i + (config._useUTC ? ' UTC' : '')); + } + ); + + // Pick the first defined of two or three arguments. + function defaults(a, b, c) { + if (a != null) { + return a; + } + if (b != null) { + return b; + } + return c; + } + + function currentDateArray(config) { + // hooks is actually the exported moment object + var nowValue = new Date(hooks.now()); + if (config._useUTC) { + return [ + nowValue.getUTCFullYear(), + nowValue.getUTCMonth(), + nowValue.getUTCDate(), + ]; + } + return [nowValue.getFullYear(), nowValue.getMonth(), nowValue.getDate()]; + } + + // convert an array to a date. + // the array should mirror the parameters below + // note: all values past the year are optional and will default to the lowest possible value. + // [year, month, day , hour, minute, second, millisecond] + function configFromArray(config) { + var i, + date, + input = [], + currentDate, + expectedWeekday, + yearToUse; + + if (config._d) { + return; + } + + currentDate = currentDateArray(config); + + //compute day of the year from weeks and weekdays + if (config._w && config._a[DATE] == null && config._a[MONTH] == null) { + dayOfYearFromWeekInfo(config); + } + + //if the day of the year is set, figure out what it is + if (config._dayOfYear != null) { + yearToUse = defaults(config._a[YEAR], currentDate[YEAR]); + + if ( + config._dayOfYear > daysInYear(yearToUse) || + config._dayOfYear === 0 + ) { + getParsingFlags(config)._overflowDayOfYear = true; + } + + date = createUTCDate(yearToUse, 0, config._dayOfYear); + config._a[MONTH] = date.getUTCMonth(); + config._a[DATE] = date.getUTCDate(); + } + + // Default to current date. + // * if no year, month, day of month are given, default to today + // * if day of month is given, default month and year + // * if month is given, default only year + // * if year is given, don't default anything + for (i = 0; i < 3 && config._a[i] == null; ++i) { + config._a[i] = input[i] = currentDate[i]; + } + + // Zero out whatever was not defaulted, including time + for (; i < 7; i++) { + config._a[i] = input[i] = + config._a[i] == null ? (i === 2 ? 1 : 0) : config._a[i]; + } + + // Check for 24:00:00.000 + if ( + config._a[HOUR] === 24 && + config._a[MINUTE] === 0 && + config._a[SECOND] === 0 && + config._a[MILLISECOND] === 0 + ) { + config._nextDay = true; + config._a[HOUR] = 0; + } + + config._d = (config._useUTC ? createUTCDate : createDate).apply( + null, + input + ); + expectedWeekday = config._useUTC + ? config._d.getUTCDay() + : config._d.getDay(); + + // Apply timezone offset from input. The actual utcOffset can be changed + // with parseZone. + if (config._tzm != null) { + config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm); + } + + if (config._nextDay) { + config._a[HOUR] = 24; + } + + // check for mismatching day of week + if ( + config._w && + typeof config._w.d !== 'undefined' && + config._w.d !== expectedWeekday + ) { + getParsingFlags(config).weekdayMismatch = true; + } + } + + function dayOfYearFromWeekInfo(config) { + var w, weekYear, week, weekday, dow, doy, temp, weekdayOverflow, curWeek; + + w = config._w; + if (w.GG != null || w.W != null || w.E != null) { + dow = 1; + doy = 4; + + // TODO: We need to take the current isoWeekYear, but that depends on + // how we interpret now (local, utc, fixed offset). So create + // a now version of current config (take local/utc/offset flags, and + // create now). + weekYear = defaults( + w.GG, + config._a[YEAR], + weekOfYear(createLocal(), 1, 4).year + ); + week = defaults(w.W, 1); + weekday = defaults(w.E, 1); + if (weekday < 1 || weekday > 7) { + weekdayOverflow = true; + } + } else { + dow = config._locale._week.dow; + doy = config._locale._week.doy; + + curWeek = weekOfYear(createLocal(), dow, doy); + + weekYear = defaults(w.gg, config._a[YEAR], curWeek.year); + + // Default to current week. + week = defaults(w.w, curWeek.week); + + if (w.d != null) { + // weekday -- low day numbers are considered next week + weekday = w.d; + if (weekday < 0 || weekday > 6) { + weekdayOverflow = true; + } + } else if (w.e != null) { + // local weekday -- counting starts from beginning of week + weekday = w.e + dow; + if (w.e < 0 || w.e > 6) { + weekdayOverflow = true; + } + } else { + // default to beginning of week + weekday = dow; + } + } + if (week < 1 || week > weeksInYear(weekYear, dow, doy)) { + getParsingFlags(config)._overflowWeeks = true; + } else if (weekdayOverflow != null) { + getParsingFlags(config)._overflowWeekday = true; + } else { + temp = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy); + config._a[YEAR] = temp.year; + config._dayOfYear = temp.dayOfYear; + } + } + + // constant that refers to the ISO standard + hooks.ISO_8601 = function () {}; + + // constant that refers to the RFC 2822 form + hooks.RFC_2822 = function () {}; + + // date from string and format string + function configFromStringAndFormat(config) { + // TODO: Move this to another part of the creation flow to prevent circular deps + if (config._f === hooks.ISO_8601) { + configFromISO(config); + return; + } + if (config._f === hooks.RFC_2822) { + configFromRFC2822(config); + return; + } + config._a = []; + getParsingFlags(config).empty = true; + + // This array is used to make a Date, either with `new Date` or `Date.UTC` + var string = '' + config._i, + i, + parsedInput, + tokens, + token, + skipped, + stringLength = string.length, + totalParsedInputLength = 0, + era; + + tokens = + expandFormat(config._f, config._locale).match(formattingTokens) || []; + + for (i = 0; i < tokens.length; i++) { + token = tokens[i]; + parsedInput = (string.match(getParseRegexForToken(token, config)) || + [])[0]; + if (parsedInput) { + skipped = string.substr(0, string.indexOf(parsedInput)); + if (skipped.length > 0) { + getParsingFlags(config).unusedInput.push(skipped); + } + string = string.slice( + string.indexOf(parsedInput) + parsedInput.length + ); + totalParsedInputLength += parsedInput.length; + } + // don't parse if it's not a known token + if (formatTokenFunctions[token]) { + if (parsedInput) { + getParsingFlags(config).empty = false; + } else { + getParsingFlags(config).unusedTokens.push(token); + } + addTimeToArrayFromToken(token, parsedInput, config); + } else if (config._strict && !parsedInput) { + getParsingFlags(config).unusedTokens.push(token); + } + } + + // add remaining unparsed input length to the string + getParsingFlags(config).charsLeftOver = + stringLength - totalParsedInputLength; + if (string.length > 0) { + getParsingFlags(config).unusedInput.push(string); + } + + // clear _12h flag if hour is <= 12 + if ( + config._a[HOUR] <= 12 && + getParsingFlags(config).bigHour === true && + config._a[HOUR] > 0 + ) { + getParsingFlags(config).bigHour = undefined; + } + + getParsingFlags(config).parsedDateParts = config._a.slice(0); + getParsingFlags(config).meridiem = config._meridiem; + // handle meridiem + config._a[HOUR] = meridiemFixWrap( + config._locale, + config._a[HOUR], + config._meridiem + ); + + // handle era + era = getParsingFlags(config).era; + if (era !== null) { + config._a[YEAR] = config._locale.erasConvertYear(era, config._a[YEAR]); + } + + configFromArray(config); + checkOverflow(config); + } + + function meridiemFixWrap(locale, hour, meridiem) { + var isPm; + + if (meridiem == null) { + // nothing to do + return hour; + } + if (locale.meridiemHour != null) { + return locale.meridiemHour(hour, meridiem); + } else if (locale.isPM != null) { + // Fallback + isPm = locale.isPM(meridiem); + if (isPm && hour < 12) { + hour += 12; + } + if (!isPm && hour === 12) { + hour = 0; + } + return hour; + } else { + // this is not supposed to happen + return hour; + } + } + + // date from string and array of format strings + function configFromStringAndArray(config) { + var tempConfig, + bestMoment, + scoreToBeat, + i, + currentScore, + validFormatFound, + bestFormatIsValid = false; + + if (config._f.length === 0) { + getParsingFlags(config).invalidFormat = true; + config._d = new Date(NaN); + return; + } + + for (i = 0; i < config._f.length; i++) { + currentScore = 0; + validFormatFound = false; + tempConfig = copyConfig({}, config); + if (config._useUTC != null) { + tempConfig._useUTC = config._useUTC; + } + tempConfig._f = config._f[i]; + configFromStringAndFormat(tempConfig); + + if (isValid(tempConfig)) { + validFormatFound = true; + } + + // if there is any input that was not parsed add a penalty for that format + currentScore += getParsingFlags(tempConfig).charsLeftOver; + + //or tokens + currentScore += getParsingFlags(tempConfig).unusedTokens.length * 10; + + getParsingFlags(tempConfig).score = currentScore; + + if (!bestFormatIsValid) { + if ( + scoreToBeat == null || + currentScore < scoreToBeat || + validFormatFound + ) { + scoreToBeat = currentScore; + bestMoment = tempConfig; + if (validFormatFound) { + bestFormatIsValid = true; + } + } + } else { + if (currentScore < scoreToBeat) { + scoreToBeat = currentScore; + bestMoment = tempConfig; + } + } + } + + extend(config, bestMoment || tempConfig); + } + + function configFromObject(config) { + if (config._d) { + return; + } + + var i = normalizeObjectUnits(config._i), + dayOrDate = i.day === undefined ? i.date : i.day; + config._a = map( + [i.year, i.month, dayOrDate, i.hour, i.minute, i.second, i.millisecond], + function (obj) { + return obj && parseInt(obj, 10); + } + ); + + configFromArray(config); + } + + function createFromConfig(config) { + var res = new Moment(checkOverflow(prepareConfig(config))); + if (res._nextDay) { + // Adding is smart enough around DST + res.add(1, 'd'); + res._nextDay = undefined; + } + + return res; + } + + function prepareConfig(config) { + var input = config._i, + format = config._f; + + config._locale = config._locale || getLocale(config._l); + + if (input === null || (format === undefined && input === '')) { + return createInvalid({ nullInput: true }); + } + + if (typeof input === 'string') { + config._i = input = config._locale.preparse(input); + } + + if (isMoment(input)) { + return new Moment(checkOverflow(input)); + } else if (isDate(input)) { + config._d = input; + } else if (isArray(format)) { + configFromStringAndArray(config); + } else if (format) { + configFromStringAndFormat(config); + } else { + configFromInput(config); + } + + if (!isValid(config)) { + config._d = null; + } + + return config; + } + + function configFromInput(config) { + var input = config._i; + if (isUndefined(input)) { + config._d = new Date(hooks.now()); + } else if (isDate(input)) { + config._d = new Date(input.valueOf()); + } else if (typeof input === 'string') { + configFromString(config); + } else if (isArray(input)) { + config._a = map(input.slice(0), function (obj) { + return parseInt(obj, 10); + }); + configFromArray(config); + } else if (isObject(input)) { + configFromObject(config); + } else if (isNumber(input)) { + // from milliseconds + config._d = new Date(input); + } else { + hooks.createFromInputFallback(config); + } + } + + function createLocalOrUTC(input, format, locale, strict, isUTC) { + var c = {}; + + if (format === true || format === false) { + strict = format; + format = undefined; + } + + if (locale === true || locale === false) { + strict = locale; + locale = undefined; + } + + if ( + (isObject(input) && isObjectEmpty(input)) || + (isArray(input) && input.length === 0) + ) { + input = undefined; + } + // object construction must be done this way. + // https://github.com/moment/moment/issues/1423 + c._isAMomentObject = true; + c._useUTC = c._isUTC = isUTC; + c._l = locale; + c._i = input; + c._f = format; + c._strict = strict; + + return createFromConfig(c); + } + + function createLocal(input, format, locale, strict) { + return createLocalOrUTC(input, format, locale, strict, false); + } + + var prototypeMin = deprecate( + 'moment().min is deprecated, use moment.max instead. http://momentjs.com/guides/#/warnings/min-max/', + function () { + var other = createLocal.apply(null, arguments); + if (this.isValid() && other.isValid()) { + return other < this ? this : other; + } else { + return createInvalid(); + } + } + ), + prototypeMax = deprecate( + 'moment().max is deprecated, use moment.min instead. http://momentjs.com/guides/#/warnings/min-max/', + function () { + var other = createLocal.apply(null, arguments); + if (this.isValid() && other.isValid()) { + return other > this ? this : other; + } else { + return createInvalid(); + } + } + ); + + // Pick a moment m from moments so that m[fn](other) is true for all + // other. This relies on the function fn to be transitive. + // + // moments should either be an array of moment objects or an array, whose + // first element is an array of moment objects. + function pickBy(fn, moments) { + var res, i; + if (moments.length === 1 && isArray(moments[0])) { + moments = moments[0]; + } + if (!moments.length) { + return createLocal(); + } + res = moments[0]; + for (i = 1; i < moments.length; ++i) { + if (!moments[i].isValid() || moments[i][fn](res)) { + res = moments[i]; + } + } + return res; + } + + // TODO: Use [].sort instead? + function min() { + var args = [].slice.call(arguments, 0); + + return pickBy('isBefore', args); + } + + function max() { + var args = [].slice.call(arguments, 0); + + return pickBy('isAfter', args); + } + + var now = function () { + return Date.now ? Date.now() : +new Date(); + }; + + var ordering = [ + 'year', + 'quarter', + 'month', + 'week', + 'day', + 'hour', + 'minute', + 'second', + 'millisecond', + ]; + + function isDurationValid(m) { + var key, + unitHasDecimal = false, + i; + for (key in m) { + if ( + hasOwnProp(m, key) && + !( + indexOf.call(ordering, key) !== -1 && + (m[key] == null || !isNaN(m[key])) + ) + ) { + return false; + } + } + + for (i = 0; i < ordering.length; ++i) { + if (m[ordering[i]]) { + if (unitHasDecimal) { + return false; // only allow non-integers for smallest unit + } + if (parseFloat(m[ordering[i]]) !== toInt(m[ordering[i]])) { + unitHasDecimal = true; + } + } + } + + return true; + } + + function isValid$1() { + return this._isValid; + } + + function createInvalid$1() { + return createDuration(NaN); + } + + function Duration(duration) { + var normalizedInput = normalizeObjectUnits(duration), + years = normalizedInput.year || 0, + quarters = normalizedInput.quarter || 0, + months = normalizedInput.month || 0, + weeks = normalizedInput.week || normalizedInput.isoWeek || 0, + days = normalizedInput.day || 0, + hours = normalizedInput.hour || 0, + minutes = normalizedInput.minute || 0, + seconds = normalizedInput.second || 0, + milliseconds = normalizedInput.millisecond || 0; + + this._isValid = isDurationValid(normalizedInput); + + // representation for dateAddRemove + this._milliseconds = + +milliseconds + + seconds * 1e3 + // 1000 + minutes * 6e4 + // 1000 * 60 + hours * 1000 * 60 * 60; //using 1000 * 60 * 60 instead of 36e5 to avoid floating point rounding errors https://github.com/moment/moment/issues/2978 + // Because of dateAddRemove treats 24 hours as different from a + // day when working around DST, we need to store them separately + this._days = +days + weeks * 7; + // It is impossible to translate months into days without knowing + // which months you are are talking about, so we have to store + // it separately. + this._months = +months + quarters * 3 + years * 12; + + this._data = {}; + + this._locale = getLocale(); + + this._bubble(); + } + + function isDuration(obj) { + return obj instanceof Duration; + } + + function absRound(number) { + if (number < 0) { + return Math.round(-1 * number) * -1; + } else { + return Math.round(number); + } + } + + // compare two arrays, return the number of differences + function compareArrays(array1, array2, dontConvert) { + var len = Math.min(array1.length, array2.length), + lengthDiff = Math.abs(array1.length - array2.length), + diffs = 0, + i; + for (i = 0; i < len; i++) { + if ( + (dontConvert && array1[i] !== array2[i]) || + (!dontConvert && toInt(array1[i]) !== toInt(array2[i])) + ) { + diffs++; + } + } + return diffs + lengthDiff; + } + + // FORMATTING + + function offset(token, separator) { + addFormatToken(token, 0, 0, function () { + var offset = this.utcOffset(), + sign = '+'; + if (offset < 0) { + offset = -offset; + sign = '-'; + } + return ( + sign + + zeroFill(~~(offset / 60), 2) + + separator + + zeroFill(~~offset % 60, 2) + ); + }); + } + + offset('Z', ':'); + offset('ZZ', ''); + + // PARSING + + addRegexToken('Z', matchShortOffset); + addRegexToken('ZZ', matchShortOffset); + addParseToken(['Z', 'ZZ'], function (input, array, config) { + config._useUTC = true; + config._tzm = offsetFromString(matchShortOffset, input); + }); + + // HELPERS + + // timezone chunker + // '+10:00' > ['10', '00'] + // '-1530' > ['-15', '30'] + var chunkOffset = /([\+\-]|\d\d)/gi; + + function offsetFromString(matcher, string) { + var matches = (string || '').match(matcher), + chunk, + parts, + minutes; + + if (matches === null) { + return null; + } + + chunk = matches[matches.length - 1] || []; + parts = (chunk + '').match(chunkOffset) || ['-', 0, 0]; + minutes = +(parts[1] * 60) + toInt(parts[2]); + + return minutes === 0 ? 0 : parts[0] === '+' ? minutes : -minutes; + } + + // Return a moment from input, that is local/utc/zone equivalent to model. + function cloneWithOffset(input, model) { + var res, diff; + if (model._isUTC) { + res = model.clone(); + diff = + (isMoment(input) || isDate(input) + ? input.valueOf() + : createLocal(input).valueOf()) - res.valueOf(); + // Use low-level api, because this fn is low-level api. + res._d.setTime(res._d.valueOf() + diff); + hooks.updateOffset(res, false); + return res; + } else { + return createLocal(input).local(); + } + } + + function getDateOffset(m) { + // On Firefox.24 Date#getTimezoneOffset returns a floating point. + // https://github.com/moment/moment/pull/1871 + return -Math.round(m._d.getTimezoneOffset()); + } + + // HOOKS + + // This function will be called whenever a moment is mutated. + // It is intended to keep the offset in sync with the timezone. + hooks.updateOffset = function () {}; + + // MOMENTS + + // keepLocalTime = true means only change the timezone, without + // affecting the local hour. So 5:31:26 +0300 --[utcOffset(2, true)]--> + // 5:31:26 +0200 It is possible that 5:31:26 doesn't exist with offset + // +0200, so we adjust the time as needed, to be valid. + // + // Keeping the time actually adds/subtracts (one hour) + // from the actual represented time. That is why we call updateOffset + // a second time. In case it wants us to change the offset again + // _changeInProgress == true case, then we have to adjust, because + // there is no such time in the given timezone. + function getSetOffset(input, keepLocalTime, keepMinutes) { + var offset = this._offset || 0, + localAdjust; + if (!this.isValid()) { + return input != null ? this : NaN; + } + if (input != null) { + if (typeof input === 'string') { + input = offsetFromString(matchShortOffset, input); + if (input === null) { + return this; + } + } else if (Math.abs(input) < 16 && !keepMinutes) { + input = input * 60; + } + if (!this._isUTC && keepLocalTime) { + localAdjust = getDateOffset(this); + } + this._offset = input; + this._isUTC = true; + if (localAdjust != null) { + this.add(localAdjust, 'm'); + } + if (offset !== input) { + if (!keepLocalTime || this._changeInProgress) { + addSubtract( + this, + createDuration(input - offset, 'm'), + 1, + false + ); + } else if (!this._changeInProgress) { + this._changeInProgress = true; + hooks.updateOffset(this, true); + this._changeInProgress = null; + } + } + return this; + } else { + return this._isUTC ? offset : getDateOffset(this); + } + } + + function getSetZone(input, keepLocalTime) { + if (input != null) { + if (typeof input !== 'string') { + input = -input; + } + + this.utcOffset(input, keepLocalTime); + + return this; + } else { + return -this.utcOffset(); + } + } + + function setOffsetToUTC(keepLocalTime) { + return this.utcOffset(0, keepLocalTime); + } + + function setOffsetToLocal(keepLocalTime) { + if (this._isUTC) { + this.utcOffset(0, keepLocalTime); + this._isUTC = false; + + if (keepLocalTime) { + this.subtract(getDateOffset(this), 'm'); + } + } + return this; + } + + function setOffsetToParsedOffset() { + if (this._tzm != null) { + this.utcOffset(this._tzm, false, true); + } else if (typeof this._i === 'string') { + var tZone = offsetFromString(matchOffset, this._i); + if (tZone != null) { + this.utcOffset(tZone); + } else { + this.utcOffset(0, true); + } + } + return this; + } + + function hasAlignedHourOffset(input) { + if (!this.isValid()) { + return false; + } + input = input ? createLocal(input).utcOffset() : 0; + + return (this.utcOffset() - input) % 60 === 0; + } + + function isDaylightSavingTime() { + return ( + this.utcOffset() > this.clone().month(0).utcOffset() || + this.utcOffset() > this.clone().month(5).utcOffset() + ); + } + + function isDaylightSavingTimeShifted() { + if (!isUndefined(this._isDSTShifted)) { + return this._isDSTShifted; + } + + var c = {}, + other; + + copyConfig(c, this); + c = prepareConfig(c); + + if (c._a) { + other = c._isUTC ? createUTC(c._a) : createLocal(c._a); + this._isDSTShifted = + this.isValid() && compareArrays(c._a, other.toArray()) > 0; + } else { + this._isDSTShifted = false; + } + + return this._isDSTShifted; + } + + function isLocal() { + return this.isValid() ? !this._isUTC : false; + } + + function isUtcOffset() { + return this.isValid() ? this._isUTC : false; + } + + function isUtc() { + return this.isValid() ? this._isUTC && this._offset === 0 : false; + } + + // ASP.NET json date format regex + var aspNetRegex = /^(-|\+)?(?:(\d*)[. ])?(\d+):(\d+)(?::(\d+)(\.\d*)?)?$/, + // from http://docs.closure-library.googlecode.com/git/closure_goog_date_date.js.source.html + // somewhat more in line with 4.4.3.2 2004 spec, but allows decimal anywhere + // and further modified to allow for strings containing both week and day + isoRegex = /^(-|\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/; + + function createDuration(input, key) { + var duration = input, + // matching against regexp is expensive, do it on demand + match = null, + sign, + ret, + diffRes; + + if (isDuration(input)) { + duration = { + ms: input._milliseconds, + d: input._days, + M: input._months, + }; + } else if (isNumber(input) || !isNaN(+input)) { + duration = {}; + if (key) { + duration[key] = +input; + } else { + duration.milliseconds = +input; + } + } else if ((match = aspNetRegex.exec(input))) { + sign = match[1] === '-' ? -1 : 1; + duration = { + y: 0, + d: toInt(match[DATE]) * sign, + h: toInt(match[HOUR]) * sign, + m: toInt(match[MINUTE]) * sign, + s: toInt(match[SECOND]) * sign, + ms: toInt(absRound(match[MILLISECOND] * 1000)) * sign, // the millisecond decimal point is included in the match + }; + } else if ((match = isoRegex.exec(input))) { + sign = match[1] === '-' ? -1 : 1; + duration = { + y: parseIso(match[2], sign), + M: parseIso(match[3], sign), + w: parseIso(match[4], sign), + d: parseIso(match[5], sign), + h: parseIso(match[6], sign), + m: parseIso(match[7], sign), + s: parseIso(match[8], sign), + }; + } else if (duration == null) { + // checks for null or undefined + duration = {}; + } else if ( + typeof duration === 'object' && + ('from' in duration || 'to' in duration) + ) { + diffRes = momentsDifference( + createLocal(duration.from), + createLocal(duration.to) + ); + + duration = {}; + duration.ms = diffRes.milliseconds; + duration.M = diffRes.months; + } + + ret = new Duration(duration); + + if (isDuration(input) && hasOwnProp(input, '_locale')) { + ret._locale = input._locale; + } + + if (isDuration(input) && hasOwnProp(input, '_isValid')) { + ret._isValid = input._isValid; + } + + return ret; + } + + createDuration.fn = Duration.prototype; + createDuration.invalid = createInvalid$1; + + function parseIso(inp, sign) { + // We'd normally use ~~inp for this, but unfortunately it also + // converts floats to ints. + // inp may be undefined, so careful calling replace on it. + var res = inp && parseFloat(inp.replace(',', '.')); + // apply sign while we're at it + return (isNaN(res) ? 0 : res) * sign; + } + + function positiveMomentsDifference(base, other) { + var res = {}; + + res.months = + other.month() - base.month() + (other.year() - base.year()) * 12; + if (base.clone().add(res.months, 'M').isAfter(other)) { + --res.months; + } + + res.milliseconds = +other - +base.clone().add(res.months, 'M'); + + return res; + } + + function momentsDifference(base, other) { + var res; + if (!(base.isValid() && other.isValid())) { + return { milliseconds: 0, months: 0 }; + } + + other = cloneWithOffset(other, base); + if (base.isBefore(other)) { + res = positiveMomentsDifference(base, other); + } else { + res = positiveMomentsDifference(other, base); + res.milliseconds = -res.milliseconds; + res.months = -res.months; + } + + return res; + } + + // TODO: remove 'name' arg after deprecation is removed + function createAdder(direction, name) { + return function (val, period) { + var dur, tmp; + //invert the arguments, but complain about it + if (period !== null && !isNaN(+period)) { + deprecateSimple( + name, + 'moment().' + + name + + '(period, number) is deprecated. Please use moment().' + + name + + '(number, period). ' + + 'See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info.' + ); + tmp = val; + val = period; + period = tmp; + } + + dur = createDuration(val, period); + addSubtract(this, dur, direction); + return this; + }; + } + + function addSubtract(mom, duration, isAdding, updateOffset) { + var milliseconds = duration._milliseconds, + days = absRound(duration._days), + months = absRound(duration._months); + + if (!mom.isValid()) { + // No op + return; + } + + updateOffset = updateOffset == null ? true : updateOffset; + + if (months) { + setMonth(mom, get(mom, 'Month') + months * isAdding); + } + if (days) { + set$1(mom, 'Date', get(mom, 'Date') + days * isAdding); + } + if (milliseconds) { + mom._d.setTime(mom._d.valueOf() + milliseconds * isAdding); + } + if (updateOffset) { + hooks.updateOffset(mom, days || months); + } + } + + var add = createAdder(1, 'add'), + subtract = createAdder(-1, 'subtract'); + + function isString(input) { + return typeof input === 'string' || input instanceof String; + } + + // type MomentInput = Moment | Date | string | number | (number | string)[] | MomentInputObject | void; // null | undefined + function isMomentInput(input) { + return ( + isMoment(input) || + isDate(input) || + isString(input) || + isNumber(input) || + isNumberOrStringArray(input) || + isMomentInputObject(input) || + input === null || + input === undefined + ); + } + + function isMomentInputObject(input) { + var objectTest = isObject(input) && !isObjectEmpty(input), + propertyTest = false, + properties = [ + 'years', + 'year', + 'y', + 'months', + 'month', + 'M', + 'days', + 'day', + 'd', + 'dates', + 'date', + 'D', + 'hours', + 'hour', + 'h', + 'minutes', + 'minute', + 'm', + 'seconds', + 'second', + 's', + 'milliseconds', + 'millisecond', + 'ms', + ], + i, + property; + + for (i = 0; i < properties.length; i += 1) { + property = properties[i]; + propertyTest = propertyTest || hasOwnProp(input, property); + } + + return objectTest && propertyTest; + } + + function isNumberOrStringArray(input) { + var arrayTest = isArray(input), + dataTypeTest = false; + if (arrayTest) { + dataTypeTest = + input.filter(function (item) { + return !isNumber(item) && isString(input); + }).length === 0; + } + return arrayTest && dataTypeTest; + } + + function isCalendarSpec(input) { + var objectTest = isObject(input) && !isObjectEmpty(input), + propertyTest = false, + properties = [ + 'sameDay', + 'nextDay', + 'lastDay', + 'nextWeek', + 'lastWeek', + 'sameElse', + ], + i, + property; + + for (i = 0; i < properties.length; i += 1) { + property = properties[i]; + propertyTest = propertyTest || hasOwnProp(input, property); + } + + return objectTest && propertyTest; + } + + function getCalendarFormat(myMoment, now) { + var diff = myMoment.diff(now, 'days', true); + return diff < -6 + ? 'sameElse' + : diff < -1 + ? 'lastWeek' + : diff < 0 + ? 'lastDay' + : diff < 1 + ? 'sameDay' + : diff < 2 + ? 'nextDay' + : diff < 7 + ? 'nextWeek' + : 'sameElse'; + } + + function calendar$1(time, formats) { + // Support for single parameter, formats only overload to the calendar function + if (arguments.length === 1) { + if (!arguments[0]) { + time = undefined; + formats = undefined; + } else if (isMomentInput(arguments[0])) { + time = arguments[0]; + formats = undefined; + } else if (isCalendarSpec(arguments[0])) { + formats = arguments[0]; + time = undefined; + } + } + // We want to compare the start of today, vs this. + // Getting start-of-today depends on whether we're local/utc/offset or not. + var now = time || createLocal(), + sod = cloneWithOffset(now, this).startOf('day'), + format = hooks.calendarFormat(this, sod) || 'sameElse', + output = + formats && + (isFunction(formats[format]) + ? formats[format].call(this, now) + : formats[format]); + + return this.format( + output || this.localeData().calendar(format, this, createLocal(now)) + ); + } + + function clone() { + return new Moment(this); + } + + function isAfter(input, units) { + var localInput = isMoment(input) ? input : createLocal(input); + if (!(this.isValid() && localInput.isValid())) { + return false; + } + units = normalizeUnits(units) || 'millisecond'; + if (units === 'millisecond') { + return this.valueOf() > localInput.valueOf(); + } else { + return localInput.valueOf() < this.clone().startOf(units).valueOf(); + } + } + + function isBefore(input, units) { + var localInput = isMoment(input) ? input : createLocal(input); + if (!(this.isValid() && localInput.isValid())) { + return false; + } + units = normalizeUnits(units) || 'millisecond'; + if (units === 'millisecond') { + return this.valueOf() < localInput.valueOf(); + } else { + return this.clone().endOf(units).valueOf() < localInput.valueOf(); + } + } + + function isBetween(from, to, units, inclusivity) { + var localFrom = isMoment(from) ? from : createLocal(from), + localTo = isMoment(to) ? to : createLocal(to); + if (!(this.isValid() && localFrom.isValid() && localTo.isValid())) { + return false; + } + inclusivity = inclusivity || '()'; + return ( + (inclusivity[0] === '(' + ? this.isAfter(localFrom, units) + : !this.isBefore(localFrom, units)) && + (inclusivity[1] === ')' + ? this.isBefore(localTo, units) + : !this.isAfter(localTo, units)) + ); + } + + function isSame(input, units) { + var localInput = isMoment(input) ? input : createLocal(input), + inputMs; + if (!(this.isValid() && localInput.isValid())) { + return false; + } + units = normalizeUnits(units) || 'millisecond'; + if (units === 'millisecond') { + return this.valueOf() === localInput.valueOf(); + } else { + inputMs = localInput.valueOf(); + return ( + this.clone().startOf(units).valueOf() <= inputMs && + inputMs <= this.clone().endOf(units).valueOf() + ); + } + } + + function isSameOrAfter(input, units) { + return this.isSame(input, units) || this.isAfter(input, units); + } + + function isSameOrBefore(input, units) { + return this.isSame(input, units) || this.isBefore(input, units); + } + + function diff(input, units, asFloat) { + var that, zoneDelta, output; + + if (!this.isValid()) { + return NaN; + } + + that = cloneWithOffset(input, this); + + if (!that.isValid()) { + return NaN; + } + + zoneDelta = (that.utcOffset() - this.utcOffset()) * 6e4; + + units = normalizeUnits(units); + + switch (units) { + case 'year': + output = monthDiff(this, that) / 12; + break; + case 'month': + output = monthDiff(this, that); + break; + case 'quarter': + output = monthDiff(this, that) / 3; + break; + case 'second': + output = (this - that) / 1e3; + break; // 1000 + case 'minute': + output = (this - that) / 6e4; + break; // 1000 * 60 + case 'hour': + output = (this - that) / 36e5; + break; // 1000 * 60 * 60 + case 'day': + output = (this - that - zoneDelta) / 864e5; + break; // 1000 * 60 * 60 * 24, negate dst + case 'week': + output = (this - that - zoneDelta) / 6048e5; + break; // 1000 * 60 * 60 * 24 * 7, negate dst + default: + output = this - that; + } + + return asFloat ? output : absFloor(output); + } + + function monthDiff(a, b) { + if (a.date() < b.date()) { + // end-of-month calculations work correct when the start month has more + // days than the end month. + return -monthDiff(b, a); + } + // difference in months + var wholeMonthDiff = (b.year() - a.year()) * 12 + (b.month() - a.month()), + // b is in (anchor - 1 month, anchor + 1 month) + anchor = a.clone().add(wholeMonthDiff, 'months'), + anchor2, + adjust; + + if (b - anchor < 0) { + anchor2 = a.clone().add(wholeMonthDiff - 1, 'months'); + // linear across the month + adjust = (b - anchor) / (anchor - anchor2); + } else { + anchor2 = a.clone().add(wholeMonthDiff + 1, 'months'); + // linear across the month + adjust = (b - anchor) / (anchor2 - anchor); + } + + //check for negative zero, return zero if negative zero + return -(wholeMonthDiff + adjust) || 0; + } + + hooks.defaultFormat = 'YYYY-MM-DDTHH:mm:ssZ'; + hooks.defaultFormatUtc = 'YYYY-MM-DDTHH:mm:ss[Z]'; + + function toString() { + return this.clone().locale('en').format('ddd MMM DD YYYY HH:mm:ss [GMT]ZZ'); + } + + function toISOString(keepOffset) { + if (!this.isValid()) { + return null; + } + var utc = keepOffset !== true, + m = utc ? this.clone().utc() : this; + if (m.year() < 0 || m.year() > 9999) { + return formatMoment( + m, + utc + ? 'YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]' + : 'YYYYYY-MM-DD[T]HH:mm:ss.SSSZ' + ); + } + if (isFunction(Date.prototype.toISOString)) { + // native implementation is ~50x faster, use it when we can + if (utc) { + return this.toDate().toISOString(); + } else { + return new Date(this.valueOf() + this.utcOffset() * 60 * 1000) + .toISOString() + .replace('Z', formatMoment(m, 'Z')); + } + } + return formatMoment( + m, + utc ? 'YYYY-MM-DD[T]HH:mm:ss.SSS[Z]' : 'YYYY-MM-DD[T]HH:mm:ss.SSSZ' + ); + } + + /** + * Return a human readable representation of a moment that can + * also be evaluated to get a new moment which is the same + * + * @link https://nodejs.org/dist/latest/docs/api/util.html#util_custom_inspect_function_on_objects + */ + function inspect() { + if (!this.isValid()) { + return 'moment.invalid(/* ' + this._i + ' */)'; + } + var func = 'moment', + zone = '', + prefix, + year, + datetime, + suffix; + if (!this.isLocal()) { + func = this.utcOffset() === 0 ? 'moment.utc' : 'moment.parseZone'; + zone = 'Z'; + } + prefix = '[' + func + '("]'; + year = 0 <= this.year() && this.year() <= 9999 ? 'YYYY' : 'YYYYYY'; + datetime = '-MM-DD[T]HH:mm:ss.SSS'; + suffix = zone + '[")]'; + + return this.format(prefix + year + datetime + suffix); + } + + function format(inputString) { + if (!inputString) { + inputString = this.isUtc() + ? hooks.defaultFormatUtc + : hooks.defaultFormat; + } + var output = formatMoment(this, inputString); + return this.localeData().postformat(output); + } + + function from(time, withoutSuffix) { + if ( + this.isValid() && + ((isMoment(time) && time.isValid()) || createLocal(time).isValid()) + ) { + return createDuration({ to: this, from: time }) + .locale(this.locale()) + .humanize(!withoutSuffix); + } else { + return this.localeData().invalidDate(); + } + } + + function fromNow(withoutSuffix) { + return this.from(createLocal(), withoutSuffix); + } + + function to(time, withoutSuffix) { + if ( + this.isValid() && + ((isMoment(time) && time.isValid()) || createLocal(time).isValid()) + ) { + return createDuration({ from: this, to: time }) + .locale(this.locale()) + .humanize(!withoutSuffix); + } else { + return this.localeData().invalidDate(); + } + } + + function toNow(withoutSuffix) { + return this.to(createLocal(), withoutSuffix); + } + + // If passed a locale key, it will set the locale for this + // instance. Otherwise, it will return the locale configuration + // variables for this instance. + function locale(key) { + var newLocaleData; + + if (key === undefined) { + return this._locale._abbr; + } else { + newLocaleData = getLocale(key); + if (newLocaleData != null) { + this._locale = newLocaleData; + } + return this; + } + } + + var lang = deprecate( + 'moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.', + function (key) { + if (key === undefined) { + return this.localeData(); + } else { + return this.locale(key); + } + } + ); + + function localeData() { + return this._locale; + } + + var MS_PER_SECOND = 1000, + MS_PER_MINUTE = 60 * MS_PER_SECOND, + MS_PER_HOUR = 60 * MS_PER_MINUTE, + MS_PER_400_YEARS = (365 * 400 + 97) * 24 * MS_PER_HOUR; + + // actual modulo - handles negative numbers (for dates before 1970): + function mod$1(dividend, divisor) { + return ((dividend % divisor) + divisor) % divisor; + } + + function localStartOfDate(y, m, d) { + // the date constructor remaps years 0-99 to 1900-1999 + if (y < 100 && y >= 0) { + // preserve leap years using a full 400 year cycle, then reset + return new Date(y + 400, m, d) - MS_PER_400_YEARS; + } else { + return new Date(y, m, d).valueOf(); + } + } + + function utcStartOfDate(y, m, d) { + // Date.UTC remaps years 0-99 to 1900-1999 + if (y < 100 && y >= 0) { + // preserve leap years using a full 400 year cycle, then reset + return Date.UTC(y + 400, m, d) - MS_PER_400_YEARS; + } else { + return Date.UTC(y, m, d); + } + } + + function startOf(units) { + var time, startOfDate; + units = normalizeUnits(units); + if (units === undefined || units === 'millisecond' || !this.isValid()) { + return this; + } + + startOfDate = this._isUTC ? utcStartOfDate : localStartOfDate; + + switch (units) { + case 'year': + time = startOfDate(this.year(), 0, 1); + break; + case 'quarter': + time = startOfDate( + this.year(), + this.month() - (this.month() % 3), + 1 + ); + break; + case 'month': + time = startOfDate(this.year(), this.month(), 1); + break; + case 'week': + time = startOfDate( + this.year(), + this.month(), + this.date() - this.weekday() + ); + break; + case 'isoWeek': + time = startOfDate( + this.year(), + this.month(), + this.date() - (this.isoWeekday() - 1) + ); + break; + case 'day': + case 'date': + time = startOfDate(this.year(), this.month(), this.date()); + break; + case 'hour': + time = this._d.valueOf(); + time -= mod$1( + time + (this._isUTC ? 0 : this.utcOffset() * MS_PER_MINUTE), + MS_PER_HOUR + ); + break; + case 'minute': + time = this._d.valueOf(); + time -= mod$1(time, MS_PER_MINUTE); + break; + case 'second': + time = this._d.valueOf(); + time -= mod$1(time, MS_PER_SECOND); + break; + } + + this._d.setTime(time); + hooks.updateOffset(this, true); + return this; + } + + function endOf(units) { + var time, startOfDate; + units = normalizeUnits(units); + if (units === undefined || units === 'millisecond' || !this.isValid()) { + return this; + } + + startOfDate = this._isUTC ? utcStartOfDate : localStartOfDate; + + switch (units) { + case 'year': + time = startOfDate(this.year() + 1, 0, 1) - 1; + break; + case 'quarter': + time = + startOfDate( + this.year(), + this.month() - (this.month() % 3) + 3, + 1 + ) - 1; + break; + case 'month': + time = startOfDate(this.year(), this.month() + 1, 1) - 1; + break; + case 'week': + time = + startOfDate( + this.year(), + this.month(), + this.date() - this.weekday() + 7 + ) - 1; + break; + case 'isoWeek': + time = + startOfDate( + this.year(), + this.month(), + this.date() - (this.isoWeekday() - 1) + 7 + ) - 1; + break; + case 'day': + case 'date': + time = startOfDate(this.year(), this.month(), this.date() + 1) - 1; + break; + case 'hour': + time = this._d.valueOf(); + time += + MS_PER_HOUR - + mod$1( + time + (this._isUTC ? 0 : this.utcOffset() * MS_PER_MINUTE), + MS_PER_HOUR + ) - + 1; + break; + case 'minute': + time = this._d.valueOf(); + time += MS_PER_MINUTE - mod$1(time, MS_PER_MINUTE) - 1; + break; + case 'second': + time = this._d.valueOf(); + time += MS_PER_SECOND - mod$1(time, MS_PER_SECOND) - 1; + break; + } + + this._d.setTime(time); + hooks.updateOffset(this, true); + return this; + } + + function valueOf() { + return this._d.valueOf() - (this._offset || 0) * 60000; + } + + function unix() { + return Math.floor(this.valueOf() / 1000); + } + + function toDate() { + return new Date(this.valueOf()); + } + + function toArray() { + var m = this; + return [ + m.year(), + m.month(), + m.date(), + m.hour(), + m.minute(), + m.second(), + m.millisecond(), + ]; + } + + function toObject() { + var m = this; + return { + years: m.year(), + months: m.month(), + date: m.date(), + hours: m.hours(), + minutes: m.minutes(), + seconds: m.seconds(), + milliseconds: m.milliseconds(), + }; + } + + function toJSON() { + // new Date(NaN).toJSON() === null + return this.isValid() ? this.toISOString() : null; + } + + function isValid$2() { + return isValid(this); + } + + function parsingFlags() { + return extend({}, getParsingFlags(this)); + } + + function invalidAt() { + return getParsingFlags(this).overflow; + } + + function creationData() { + return { + input: this._i, + format: this._f, + locale: this._locale, + isUTC: this._isUTC, + strict: this._strict, + }; + } + + addFormatToken('N', 0, 0, 'eraAbbr'); + addFormatToken('NN', 0, 0, 'eraAbbr'); + addFormatToken('NNN', 0, 0, 'eraAbbr'); + addFormatToken('NNNN', 0, 0, 'eraName'); + addFormatToken('NNNNN', 0, 0, 'eraNarrow'); + + addFormatToken('y', ['y', 1], 'yo', 'eraYear'); + addFormatToken('y', ['yy', 2], 0, 'eraYear'); + addFormatToken('y', ['yyy', 3], 0, 'eraYear'); + addFormatToken('y', ['yyyy', 4], 0, 'eraYear'); + + addRegexToken('N', matchEraAbbr); + addRegexToken('NN', matchEraAbbr); + addRegexToken('NNN', matchEraAbbr); + addRegexToken('NNNN', matchEraName); + addRegexToken('NNNNN', matchEraNarrow); + + addParseToken(['N', 'NN', 'NNN', 'NNNN', 'NNNNN'], function ( + input, + array, + config, + token + ) { + var era = config._locale.erasParse(input, token, config._strict); + if (era) { + getParsingFlags(config).era = era; + } else { + getParsingFlags(config).invalidEra = input; + } + }); + + addRegexToken('y', matchUnsigned); + addRegexToken('yy', matchUnsigned); + addRegexToken('yyy', matchUnsigned); + addRegexToken('yyyy', matchUnsigned); + addRegexToken('yo', matchEraYearOrdinal); + + addParseToken(['y', 'yy', 'yyy', 'yyyy'], YEAR); + addParseToken(['yo'], function (input, array, config, token) { + var match; + if (config._locale._eraYearOrdinalRegex) { + match = input.match(config._locale._eraYearOrdinalRegex); + } + + if (config._locale.eraYearOrdinalParse) { + array[YEAR] = config._locale.eraYearOrdinalParse(input, match); + } else { + array[YEAR] = parseInt(input, 10); + } + }); + + function localeEras(m, format) { + var i, + l, + date, + eras = this._eras || getLocale('en')._eras; + for (i = 0, l = eras.length; i < l; ++i) { + switch (typeof eras[i].since) { + case 'string': + // truncate time + date = hooks(eras[i].since).startOf('day'); + eras[i].since = date.valueOf(); + break; + } + + switch (typeof eras[i].until) { + case 'undefined': + eras[i].until = +Infinity; + break; + case 'string': + // truncate time + date = hooks(eras[i].until).startOf('day').valueOf(); + eras[i].until = date.valueOf(); + break; + } + } + return eras; + } + + function localeErasParse(eraName, format, strict) { + var i, + l, + eras = this.eras(), + name, + abbr, + narrow; + eraName = eraName.toUpperCase(); + + for (i = 0, l = eras.length; i < l; ++i) { + name = eras[i].name.toUpperCase(); + abbr = eras[i].abbr.toUpperCase(); + narrow = eras[i].narrow.toUpperCase(); + + if (strict) { + switch (format) { + case 'N': + case 'NN': + case 'NNN': + if (abbr === eraName) { + return eras[i]; + } + break; + + case 'NNNN': + if (name === eraName) { + return eras[i]; + } + break; + + case 'NNNNN': + if (narrow === eraName) { + return eras[i]; + } + break; + } + } else if ([name, abbr, narrow].indexOf(eraName) >= 0) { + return eras[i]; + } + } + } + + function localeErasConvertYear(era, year) { + var dir = era.since <= era.until ? +1 : -1; + if (year === undefined) { + return hooks(era.since).year(); + } else { + return hooks(era.since).year() + (year - era.offset) * dir; + } + } + + function getEraName() { + var i, + l, + val, + eras = this.localeData().eras(); + for (i = 0, l = eras.length; i < l; ++i) { + // truncate time + val = this.clone().startOf('day').valueOf(); + + if (eras[i].since <= val && val <= eras[i].until) { + return eras[i].name; + } + if (eras[i].until <= val && val <= eras[i].since) { + return eras[i].name; + } + } + + return ''; + } + + function getEraNarrow() { + var i, + l, + val, + eras = this.localeData().eras(); + for (i = 0, l = eras.length; i < l; ++i) { + // truncate time + val = this.clone().startOf('day').valueOf(); + + if (eras[i].since <= val && val <= eras[i].until) { + return eras[i].narrow; + } + if (eras[i].until <= val && val <= eras[i].since) { + return eras[i].narrow; + } + } + + return ''; + } + + function getEraAbbr() { + var i, + l, + val, + eras = this.localeData().eras(); + for (i = 0, l = eras.length; i < l; ++i) { + // truncate time + val = this.clone().startOf('day').valueOf(); + + if (eras[i].since <= val && val <= eras[i].until) { + return eras[i].abbr; + } + if (eras[i].until <= val && val <= eras[i].since) { + return eras[i].abbr; + } + } + + return ''; + } + + function getEraYear() { + var i, + l, + dir, + val, + eras = this.localeData().eras(); + for (i = 0, l = eras.length; i < l; ++i) { + dir = eras[i].since <= eras[i].until ? +1 : -1; + + // truncate time + val = this.clone().startOf('day').valueOf(); + + if ( + (eras[i].since <= val && val <= eras[i].until) || + (eras[i].until <= val && val <= eras[i].since) + ) { + return ( + (this.year() - hooks(eras[i].since).year()) * dir + + eras[i].offset + ); + } + } + + return this.year(); + } + + function erasNameRegex(isStrict) { + if (!hasOwnProp(this, '_erasNameRegex')) { + computeErasParse.call(this); + } + return isStrict ? this._erasNameRegex : this._erasRegex; + } + + function erasAbbrRegex(isStrict) { + if (!hasOwnProp(this, '_erasAbbrRegex')) { + computeErasParse.call(this); + } + return isStrict ? this._erasAbbrRegex : this._erasRegex; + } + + function erasNarrowRegex(isStrict) { + if (!hasOwnProp(this, '_erasNarrowRegex')) { + computeErasParse.call(this); + } + return isStrict ? this._erasNarrowRegex : this._erasRegex; + } + + function matchEraAbbr(isStrict, locale) { + return locale.erasAbbrRegex(isStrict); + } + + function matchEraName(isStrict, locale) { + return locale.erasNameRegex(isStrict); + } + + function matchEraNarrow(isStrict, locale) { + return locale.erasNarrowRegex(isStrict); + } + + function matchEraYearOrdinal(isStrict, locale) { + return locale._eraYearOrdinalRegex || matchUnsigned; + } + + function computeErasParse() { + var abbrPieces = [], + namePieces = [], + narrowPieces = [], + mixedPieces = [], + i, + l, + eras = this.eras(); + + for (i = 0, l = eras.length; i < l; ++i) { + namePieces.push(regexEscape(eras[i].name)); + abbrPieces.push(regexEscape(eras[i].abbr)); + narrowPieces.push(regexEscape(eras[i].narrow)); + + mixedPieces.push(regexEscape(eras[i].name)); + mixedPieces.push(regexEscape(eras[i].abbr)); + mixedPieces.push(regexEscape(eras[i].narrow)); + } + + this._erasRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i'); + this._erasNameRegex = new RegExp('^(' + namePieces.join('|') + ')', 'i'); + this._erasAbbrRegex = new RegExp('^(' + abbrPieces.join('|') + ')', 'i'); + this._erasNarrowRegex = new RegExp( + '^(' + narrowPieces.join('|') + ')', + 'i' + ); + } + + // FORMATTING + + addFormatToken(0, ['gg', 2], 0, function () { + return this.weekYear() % 100; + }); + + addFormatToken(0, ['GG', 2], 0, function () { + return this.isoWeekYear() % 100; + }); + + function addWeekYearFormatToken(token, getter) { + addFormatToken(0, [token, token.length], 0, getter); + } + + addWeekYearFormatToken('gggg', 'weekYear'); + addWeekYearFormatToken('ggggg', 'weekYear'); + addWeekYearFormatToken('GGGG', 'isoWeekYear'); + addWeekYearFormatToken('GGGGG', 'isoWeekYear'); + + // ALIASES + + addUnitAlias('weekYear', 'gg'); + addUnitAlias('isoWeekYear', 'GG'); + + // PRIORITY + + addUnitPriority('weekYear', 1); + addUnitPriority('isoWeekYear', 1); + + // PARSING + + addRegexToken('G', matchSigned); + addRegexToken('g', matchSigned); + addRegexToken('GG', match1to2, match2); + addRegexToken('gg', match1to2, match2); + addRegexToken('GGGG', match1to4, match4); + addRegexToken('gggg', match1to4, match4); + addRegexToken('GGGGG', match1to6, match6); + addRegexToken('ggggg', match1to6, match6); + + addWeekParseToken(['gggg', 'ggggg', 'GGGG', 'GGGGG'], function ( + input, + week, + config, + token + ) { + week[token.substr(0, 2)] = toInt(input); + }); + + addWeekParseToken(['gg', 'GG'], function (input, week, config, token) { + week[token] = hooks.parseTwoDigitYear(input); + }); + + // MOMENTS + + function getSetWeekYear(input) { + return getSetWeekYearHelper.call( + this, + input, + this.week(), + this.weekday(), + this.localeData()._week.dow, + this.localeData()._week.doy + ); + } + + function getSetISOWeekYear(input) { + return getSetWeekYearHelper.call( + this, + input, + this.isoWeek(), + this.isoWeekday(), + 1, + 4 + ); + } + + function getISOWeeksInYear() { + return weeksInYear(this.year(), 1, 4); + } + + function getISOWeeksInISOWeekYear() { + return weeksInYear(this.isoWeekYear(), 1, 4); + } + + function getWeeksInYear() { + var weekInfo = this.localeData()._week; + return weeksInYear(this.year(), weekInfo.dow, weekInfo.doy); + } + + function getWeeksInWeekYear() { + var weekInfo = this.localeData()._week; + return weeksInYear(this.weekYear(), weekInfo.dow, weekInfo.doy); + } + + function getSetWeekYearHelper(input, week, weekday, dow, doy) { + var weeksTarget; + if (input == null) { + return weekOfYear(this, dow, doy).year; + } else { + weeksTarget = weeksInYear(input, dow, doy); + if (week > weeksTarget) { + week = weeksTarget; + } + return setWeekAll.call(this, input, week, weekday, dow, doy); + } + } + + function setWeekAll(weekYear, week, weekday, dow, doy) { + var dayOfYearData = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy), + date = createUTCDate(dayOfYearData.year, 0, dayOfYearData.dayOfYear); + + this.year(date.getUTCFullYear()); + this.month(date.getUTCMonth()); + this.date(date.getUTCDate()); + return this; + } + + // FORMATTING + + addFormatToken('Q', 0, 'Qo', 'quarter'); + + // ALIASES + + addUnitAlias('quarter', 'Q'); + + // PRIORITY + + addUnitPriority('quarter', 7); + + // PARSING + + addRegexToken('Q', match1); + addParseToken('Q', function (input, array) { + array[MONTH] = (toInt(input) - 1) * 3; + }); + + // MOMENTS + + function getSetQuarter(input) { + return input == null + ? Math.ceil((this.month() + 1) / 3) + : this.month((input - 1) * 3 + (this.month() % 3)); + } + + // FORMATTING + + addFormatToken('D', ['DD', 2], 'Do', 'date'); + + // ALIASES + + addUnitAlias('date', 'D'); + + // PRIORITY + addUnitPriority('date', 9); + + // PARSING + + addRegexToken('D', match1to2); + addRegexToken('DD', match1to2, match2); + addRegexToken('Do', function (isStrict, locale) { + // TODO: Remove "ordinalParse" fallback in next major release. + return isStrict + ? locale._dayOfMonthOrdinalParse || locale._ordinalParse + : locale._dayOfMonthOrdinalParseLenient; + }); + + addParseToken(['D', 'DD'], DATE); + addParseToken('Do', function (input, array) { + array[DATE] = toInt(input.match(match1to2)[0]); + }); + + // MOMENTS + + var getSetDayOfMonth = makeGetSet('Date', true); + + // FORMATTING + + addFormatToken('DDD', ['DDDD', 3], 'DDDo', 'dayOfYear'); + + // ALIASES + + addUnitAlias('dayOfYear', 'DDD'); + + // PRIORITY + addUnitPriority('dayOfYear', 4); + + // PARSING + + addRegexToken('DDD', match1to3); + addRegexToken('DDDD', match3); + addParseToken(['DDD', 'DDDD'], function (input, array, config) { + config._dayOfYear = toInt(input); + }); + + // HELPERS + + // MOMENTS + + function getSetDayOfYear(input) { + var dayOfYear = + Math.round( + (this.clone().startOf('day') - this.clone().startOf('year')) / 864e5 + ) + 1; + return input == null ? dayOfYear : this.add(input - dayOfYear, 'd'); + } + + // FORMATTING + + addFormatToken('m', ['mm', 2], 0, 'minute'); + + // ALIASES + + addUnitAlias('minute', 'm'); + + // PRIORITY + + addUnitPriority('minute', 14); + + // PARSING + + addRegexToken('m', match1to2); + addRegexToken('mm', match1to2, match2); + addParseToken(['m', 'mm'], MINUTE); + + // MOMENTS + + var getSetMinute = makeGetSet('Minutes', false); + + // FORMATTING + + addFormatToken('s', ['ss', 2], 0, 'second'); + + // ALIASES + + addUnitAlias('second', 's'); + + // PRIORITY + + addUnitPriority('second', 15); + + // PARSING + + addRegexToken('s', match1to2); + addRegexToken('ss', match1to2, match2); + addParseToken(['s', 'ss'], SECOND); + + // MOMENTS + + var getSetSecond = makeGetSet('Seconds', false); + + // FORMATTING + + addFormatToken('S', 0, 0, function () { + return ~~(this.millisecond() / 100); + }); + + addFormatToken(0, ['SS', 2], 0, function () { + return ~~(this.millisecond() / 10); + }); + + addFormatToken(0, ['SSS', 3], 0, 'millisecond'); + addFormatToken(0, ['SSSS', 4], 0, function () { + return this.millisecond() * 10; + }); + addFormatToken(0, ['SSSSS', 5], 0, function () { + return this.millisecond() * 100; + }); + addFormatToken(0, ['SSSSSS', 6], 0, function () { + return this.millisecond() * 1000; + }); + addFormatToken(0, ['SSSSSSS', 7], 0, function () { + return this.millisecond() * 10000; + }); + addFormatToken(0, ['SSSSSSSS', 8], 0, function () { + return this.millisecond() * 100000; + }); + addFormatToken(0, ['SSSSSSSSS', 9], 0, function () { + return this.millisecond() * 1000000; + }); + + // ALIASES + + addUnitAlias('millisecond', 'ms'); + + // PRIORITY + + addUnitPriority('millisecond', 16); + + // PARSING + + addRegexToken('S', match1to3, match1); + addRegexToken('SS', match1to3, match2); + addRegexToken('SSS', match1to3, match3); + + var token, getSetMillisecond; + for (token = 'SSSS'; token.length <= 9; token += 'S') { + addRegexToken(token, matchUnsigned); + } + + function parseMs(input, array) { + array[MILLISECOND] = toInt(('0.' + input) * 1000); + } + + for (token = 'S'; token.length <= 9; token += 'S') { + addParseToken(token, parseMs); + } + + getSetMillisecond = makeGetSet('Milliseconds', false); + + // FORMATTING + + addFormatToken('z', 0, 0, 'zoneAbbr'); + addFormatToken('zz', 0, 0, 'zoneName'); + + // MOMENTS + + function getZoneAbbr() { + return this._isUTC ? 'UTC' : ''; + } + + function getZoneName() { + return this._isUTC ? 'Coordinated Universal Time' : ''; + } + + var proto = Moment.prototype; + + proto.add = add; + proto.calendar = calendar$1; + proto.clone = clone; + proto.diff = diff; + proto.endOf = endOf; + proto.format = format; + proto.from = from; + proto.fromNow = fromNow; + proto.to = to; + proto.toNow = toNow; + proto.get = stringGet; + proto.invalidAt = invalidAt; + proto.isAfter = isAfter; + proto.isBefore = isBefore; + proto.isBetween = isBetween; + proto.isSame = isSame; + proto.isSameOrAfter = isSameOrAfter; + proto.isSameOrBefore = isSameOrBefore; + proto.isValid = isValid$2; + proto.lang = lang; + proto.locale = locale; + proto.localeData = localeData; + proto.max = prototypeMax; + proto.min = prototypeMin; + proto.parsingFlags = parsingFlags; + proto.set = stringSet; + proto.startOf = startOf; + proto.subtract = subtract; + proto.toArray = toArray; + proto.toObject = toObject; + proto.toDate = toDate; + proto.toISOString = toISOString; + proto.inspect = inspect; + if (typeof Symbol !== 'undefined' && Symbol.for != null) { + proto[Symbol.for('nodejs.util.inspect.custom')] = function () { + return 'Moment<' + this.format() + '>'; + }; + } + proto.toJSON = toJSON; + proto.toString = toString; + proto.unix = unix; + proto.valueOf = valueOf; + proto.creationData = creationData; + proto.eraName = getEraName; + proto.eraNarrow = getEraNarrow; + proto.eraAbbr = getEraAbbr; + proto.eraYear = getEraYear; + proto.year = getSetYear; + proto.isLeapYear = getIsLeapYear; + proto.weekYear = getSetWeekYear; + proto.isoWeekYear = getSetISOWeekYear; + proto.quarter = proto.quarters = getSetQuarter; + proto.month = getSetMonth; + proto.daysInMonth = getDaysInMonth; + proto.week = proto.weeks = getSetWeek; + proto.isoWeek = proto.isoWeeks = getSetISOWeek; + proto.weeksInYear = getWeeksInYear; + proto.weeksInWeekYear = getWeeksInWeekYear; + proto.isoWeeksInYear = getISOWeeksInYear; + proto.isoWeeksInISOWeekYear = getISOWeeksInISOWeekYear; + proto.date = getSetDayOfMonth; + proto.day = proto.days = getSetDayOfWeek; + proto.weekday = getSetLocaleDayOfWeek; + proto.isoWeekday = getSetISODayOfWeek; + proto.dayOfYear = getSetDayOfYear; + proto.hour = proto.hours = getSetHour; + proto.minute = proto.minutes = getSetMinute; + proto.second = proto.seconds = getSetSecond; + proto.millisecond = proto.milliseconds = getSetMillisecond; + proto.utcOffset = getSetOffset; + proto.utc = setOffsetToUTC; + proto.local = setOffsetToLocal; + proto.parseZone = setOffsetToParsedOffset; + proto.hasAlignedHourOffset = hasAlignedHourOffset; + proto.isDST = isDaylightSavingTime; + proto.isLocal = isLocal; + proto.isUtcOffset = isUtcOffset; + proto.isUtc = isUtc; + proto.isUTC = isUtc; + proto.zoneAbbr = getZoneAbbr; + proto.zoneName = getZoneName; + proto.dates = deprecate( + 'dates accessor is deprecated. Use date instead.', + getSetDayOfMonth + ); + proto.months = deprecate( + 'months accessor is deprecated. Use month instead', + getSetMonth + ); + proto.years = deprecate( + 'years accessor is deprecated. Use year instead', + getSetYear + ); + proto.zone = deprecate( + 'moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/', + getSetZone + ); + proto.isDSTShifted = deprecate( + 'isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information', + isDaylightSavingTimeShifted + ); + + function createUnix(input) { + return createLocal(input * 1000); + } + + function createInZone() { + return createLocal.apply(null, arguments).parseZone(); + } + + function preParsePostFormat(string) { + return string; + } + + var proto$1 = Locale.prototype; + + proto$1.calendar = calendar; + proto$1.longDateFormat = longDateFormat; + proto$1.invalidDate = invalidDate; + proto$1.ordinal = ordinal; + proto$1.preparse = preParsePostFormat; + proto$1.postformat = preParsePostFormat; + proto$1.relativeTime = relativeTime; + proto$1.pastFuture = pastFuture; + proto$1.set = set; + proto$1.eras = localeEras; + proto$1.erasParse = localeErasParse; + proto$1.erasConvertYear = localeErasConvertYear; + proto$1.erasAbbrRegex = erasAbbrRegex; + proto$1.erasNameRegex = erasNameRegex; + proto$1.erasNarrowRegex = erasNarrowRegex; + + proto$1.months = localeMonths; + proto$1.monthsShort = localeMonthsShort; + proto$1.monthsParse = localeMonthsParse; + proto$1.monthsRegex = monthsRegex; + proto$1.monthsShortRegex = monthsShortRegex; + proto$1.week = localeWeek; + proto$1.firstDayOfYear = localeFirstDayOfYear; + proto$1.firstDayOfWeek = localeFirstDayOfWeek; + + proto$1.weekdays = localeWeekdays; + proto$1.weekdaysMin = localeWeekdaysMin; + proto$1.weekdaysShort = localeWeekdaysShort; + proto$1.weekdaysParse = localeWeekdaysParse; + + proto$1.weekdaysRegex = weekdaysRegex; + proto$1.weekdaysShortRegex = weekdaysShortRegex; + proto$1.weekdaysMinRegex = weekdaysMinRegex; + + proto$1.isPM = localeIsPM; + proto$1.meridiem = localeMeridiem; + + function get$1(format, index, field, setter) { + var locale = getLocale(), + utc = createUTC().set(setter, index); + return locale[field](utc, format); + } + + function listMonthsImpl(format, index, field) { + if (isNumber(format)) { + index = format; + format = undefined; + } + + format = format || ''; + + if (index != null) { + return get$1(format, index, field, 'month'); + } + + var i, + out = []; + for (i = 0; i < 12; i++) { + out[i] = get$1(format, i, field, 'month'); + } + return out; + } + + // () + // (5) + // (fmt, 5) + // (fmt) + // (true) + // (true, 5) + // (true, fmt, 5) + // (true, fmt) + function listWeekdaysImpl(localeSorted, format, index, field) { + if (typeof localeSorted === 'boolean') { + if (isNumber(format)) { + index = format; + format = undefined; + } + + format = format || ''; + } else { + format = localeSorted; + index = format; + localeSorted = false; + + if (isNumber(format)) { + index = format; + format = undefined; + } + + format = format || ''; + } + + var locale = getLocale(), + shift = localeSorted ? locale._week.dow : 0, + i, + out = []; + + if (index != null) { + return get$1(format, (index + shift) % 7, field, 'day'); + } + + for (i = 0; i < 7; i++) { + out[i] = get$1(format, (i + shift) % 7, field, 'day'); + } + return out; + } + + function listMonths(format, index) { + return listMonthsImpl(format, index, 'months'); + } + + function listMonthsShort(format, index) { + return listMonthsImpl(format, index, 'monthsShort'); + } + + function listWeekdays(localeSorted, format, index) { + return listWeekdaysImpl(localeSorted, format, index, 'weekdays'); + } + + function listWeekdaysShort(localeSorted, format, index) { + return listWeekdaysImpl(localeSorted, format, index, 'weekdaysShort'); + } + + function listWeekdaysMin(localeSorted, format, index) { + return listWeekdaysImpl(localeSorted, format, index, 'weekdaysMin'); + } + + getSetGlobalLocale('en', { + eras: [ + { + since: '0001-01-01', + until: +Infinity, + offset: 1, + name: 'Anno Domini', + narrow: 'AD', + abbr: 'AD', + }, + { + since: '0000-12-31', + until: -Infinity, + offset: 1, + name: 'Before Christ', + narrow: 'BC', + abbr: 'BC', + }, + ], + dayOfMonthOrdinalParse: /\d{1,2}(th|st|nd|rd)/, + ordinal: function (number) { + var b = number % 10, + output = + toInt((number % 100) / 10) === 1 + ? 'th' + : b === 1 + ? 'st' + : b === 2 + ? 'nd' + : b === 3 + ? 'rd' + : 'th'; + return number + output; + }, + }); + + // Side effect imports + + hooks.lang = deprecate( + 'moment.lang is deprecated. Use moment.locale instead.', + getSetGlobalLocale + ); + hooks.langData = deprecate( + 'moment.langData is deprecated. Use moment.localeData instead.', + getLocale + ); + + var mathAbs = Math.abs; + + function abs() { + var data = this._data; + + this._milliseconds = mathAbs(this._milliseconds); + this._days = mathAbs(this._days); + this._months = mathAbs(this._months); + + data.milliseconds = mathAbs(data.milliseconds); + data.seconds = mathAbs(data.seconds); + data.minutes = mathAbs(data.minutes); + data.hours = mathAbs(data.hours); + data.months = mathAbs(data.months); + data.years = mathAbs(data.years); + + return this; + } + + function addSubtract$1(duration, input, value, direction) { + var other = createDuration(input, value); + + duration._milliseconds += direction * other._milliseconds; + duration._days += direction * other._days; + duration._months += direction * other._months; + + return duration._bubble(); + } + + // supports only 2.0-style add(1, 's') or add(duration) + function add$1(input, value) { + return addSubtract$1(this, input, value, 1); + } + + // supports only 2.0-style subtract(1, 's') or subtract(duration) + function subtract$1(input, value) { + return addSubtract$1(this, input, value, -1); + } + + function absCeil(number) { + if (number < 0) { + return Math.floor(number); + } else { + return Math.ceil(number); + } + } + + function bubble() { + var milliseconds = this._milliseconds, + days = this._days, + months = this._months, + data = this._data, + seconds, + minutes, + hours, + years, + monthsFromDays; + + // if we have a mix of positive and negative values, bubble down first + // check: https://github.com/moment/moment/issues/2166 + if ( + !( + (milliseconds >= 0 && days >= 0 && months >= 0) || + (milliseconds <= 0 && days <= 0 && months <= 0) + ) + ) { + milliseconds += absCeil(monthsToDays(months) + days) * 864e5; + days = 0; + months = 0; + } + + // The following code bubbles up values, see the tests for + // examples of what that means. + data.milliseconds = milliseconds % 1000; + + seconds = absFloor(milliseconds / 1000); + data.seconds = seconds % 60; + + minutes = absFloor(seconds / 60); + data.minutes = minutes % 60; + + hours = absFloor(minutes / 60); + data.hours = hours % 24; + + days += absFloor(hours / 24); + + // convert days to months + monthsFromDays = absFloor(daysToMonths(days)); + months += monthsFromDays; + days -= absCeil(monthsToDays(monthsFromDays)); + + // 12 months -> 1 year + years = absFloor(months / 12); + months %= 12; + + data.days = days; + data.months = months; + data.years = years; + + return this; + } + + function daysToMonths(days) { + // 400 years have 146097 days (taking into account leap year rules) + // 400 years have 12 months === 4800 + return (days * 4800) / 146097; + } + + function monthsToDays(months) { + // the reverse of daysToMonths + return (months * 146097) / 4800; + } + + function as(units) { + if (!this.isValid()) { + return NaN; + } + var days, + months, + milliseconds = this._milliseconds; + + units = normalizeUnits(units); + + if (units === 'month' || units === 'quarter' || units === 'year') { + days = this._days + milliseconds / 864e5; + months = this._months + daysToMonths(days); + switch (units) { + case 'month': + return months; + case 'quarter': + return months / 3; + case 'year': + return months / 12; + } + } else { + // handle milliseconds separately because of floating point math errors (issue #1867) + days = this._days + Math.round(monthsToDays(this._months)); + switch (units) { + case 'week': + return days / 7 + milliseconds / 6048e5; + case 'day': + return days + milliseconds / 864e5; + case 'hour': + return days * 24 + milliseconds / 36e5; + case 'minute': + return days * 1440 + milliseconds / 6e4; + case 'second': + return days * 86400 + milliseconds / 1000; + // Math.floor prevents floating point math errors here + case 'millisecond': + return Math.floor(days * 864e5) + milliseconds; + default: + throw new Error('Unknown unit ' + units); + } + } + } + + // TODO: Use this.as('ms')? + function valueOf$1() { + if (!this.isValid()) { + return NaN; + } + return ( + this._milliseconds + + this._days * 864e5 + + (this._months % 12) * 2592e6 + + toInt(this._months / 12) * 31536e6 + ); + } + + function makeAs(alias) { + return function () { + return this.as(alias); + }; + } + + var asMilliseconds = makeAs('ms'), + asSeconds = makeAs('s'), + asMinutes = makeAs('m'), + asHours = makeAs('h'), + asDays = makeAs('d'), + asWeeks = makeAs('w'), + asMonths = makeAs('M'), + asQuarters = makeAs('Q'), + asYears = makeAs('y'); + + function clone$1() { + return createDuration(this); + } + + function get$2(units) { + units = normalizeUnits(units); + return this.isValid() ? this[units + 's']() : NaN; + } + + function makeGetter(name) { + return function () { + return this.isValid() ? this._data[name] : NaN; + }; + } + + var milliseconds = makeGetter('milliseconds'), + seconds = makeGetter('seconds'), + minutes = makeGetter('minutes'), + hours = makeGetter('hours'), + days = makeGetter('days'), + months = makeGetter('months'), + years = makeGetter('years'); + + function weeks() { + return absFloor(this.days() / 7); + } + + var round = Math.round, + thresholds = { + ss: 44, // a few seconds to seconds + s: 45, // seconds to minute + m: 45, // minutes to hour + h: 22, // hours to day + d: 26, // days to month/week + w: null, // weeks to month + M: 11, // months to year + }; + + // helper function for moment.fn.from, moment.fn.fromNow, and moment.duration.fn.humanize + function substituteTimeAgo(string, number, withoutSuffix, isFuture, locale) { + return locale.relativeTime(number || 1, !!withoutSuffix, string, isFuture); + } + + function relativeTime$1(posNegDuration, withoutSuffix, thresholds, locale) { + var duration = createDuration(posNegDuration).abs(), + seconds = round(duration.as('s')), + minutes = round(duration.as('m')), + hours = round(duration.as('h')), + days = round(duration.as('d')), + months = round(duration.as('M')), + weeks = round(duration.as('w')), + years = round(duration.as('y')), + a = + (seconds <= thresholds.ss && ['s', seconds]) || + (seconds < thresholds.s && ['ss', seconds]) || + (minutes <= 1 && ['m']) || + (minutes < thresholds.m && ['mm', minutes]) || + (hours <= 1 && ['h']) || + (hours < thresholds.h && ['hh', hours]) || + (days <= 1 && ['d']) || + (days < thresholds.d && ['dd', days]); + + if (thresholds.w != null) { + a = + a || + (weeks <= 1 && ['w']) || + (weeks < thresholds.w && ['ww', weeks]); + } + a = a || + (months <= 1 && ['M']) || + (months < thresholds.M && ['MM', months]) || + (years <= 1 && ['y']) || ['yy', years]; + + a[2] = withoutSuffix; + a[3] = +posNegDuration > 0; + a[4] = locale; + return substituteTimeAgo.apply(null, a); + } + + // This function allows you to set the rounding function for relative time strings + function getSetRelativeTimeRounding(roundingFunction) { + if (roundingFunction === undefined) { + return round; + } + if (typeof roundingFunction === 'function') { + round = roundingFunction; + return true; + } + return false; + } + + // This function allows you to set a threshold for relative time strings + function getSetRelativeTimeThreshold(threshold, limit) { + if (thresholds[threshold] === undefined) { + return false; + } + if (limit === undefined) { + return thresholds[threshold]; + } + thresholds[threshold] = limit; + if (threshold === 's') { + thresholds.ss = limit - 1; + } + return true; + } + + function humanize(argWithSuffix, argThresholds) { + if (!this.isValid()) { + return this.localeData().invalidDate(); + } + + var withSuffix = false, + th = thresholds, + locale, + output; + + if (typeof argWithSuffix === 'object') { + argThresholds = argWithSuffix; + argWithSuffix = false; + } + if (typeof argWithSuffix === 'boolean') { + withSuffix = argWithSuffix; + } + if (typeof argThresholds === 'object') { + th = Object.assign({}, thresholds, argThresholds); + if (argThresholds.s != null && argThresholds.ss == null) { + th.ss = argThresholds.s - 1; + } + } + + locale = this.localeData(); + output = relativeTime$1(this, !withSuffix, th, locale); + + if (withSuffix) { + output = locale.pastFuture(+this, output); + } + + return locale.postformat(output); + } + + var abs$1 = Math.abs; + + function sign(x) { + return (x > 0) - (x < 0) || +x; + } + + function toISOString$1() { + // for ISO strings we do not use the normal bubbling rules: + // * milliseconds bubble up until they become hours + // * days do not bubble at all + // * months bubble up until they become years + // This is because there is no context-free conversion between hours and days + // (think of clock changes) + // and also not between days and months (28-31 days per month) + if (!this.isValid()) { + return this.localeData().invalidDate(); + } + + var seconds = abs$1(this._milliseconds) / 1000, + days = abs$1(this._days), + months = abs$1(this._months), + minutes, + hours, + years, + s, + total = this.asSeconds(), + totalSign, + ymSign, + daysSign, + hmsSign; + + if (!total) { + // this is the same as C#'s (Noda) and python (isodate)... + // but not other JS (goog.date) + return 'P0D'; + } + + // 3600 seconds -> 60 minutes -> 1 hour + minutes = absFloor(seconds / 60); + hours = absFloor(minutes / 60); + seconds %= 60; + minutes %= 60; + + // 12 months -> 1 year + years = absFloor(months / 12); + months %= 12; + + // inspired by https://github.com/dordille/moment-isoduration/blob/master/moment.isoduration.js + s = seconds ? seconds.toFixed(3).replace(/\.?0+$/, '') : ''; + + totalSign = total < 0 ? '-' : ''; + ymSign = sign(this._months) !== sign(total) ? '-' : ''; + daysSign = sign(this._days) !== sign(total) ? '-' : ''; + hmsSign = sign(this._milliseconds) !== sign(total) ? '-' : ''; + + return ( + totalSign + + 'P' + + (years ? ymSign + years + 'Y' : '') + + (months ? ymSign + months + 'M' : '') + + (days ? daysSign + days + 'D' : '') + + (hours || minutes || seconds ? 'T' : '') + + (hours ? hmsSign + hours + 'H' : '') + + (minutes ? hmsSign + minutes + 'M' : '') + + (seconds ? hmsSign + s + 'S' : '') + ); + } + + var proto$2 = Duration.prototype; + + proto$2.isValid = isValid$1; + proto$2.abs = abs; + proto$2.add = add$1; + proto$2.subtract = subtract$1; + proto$2.as = as; + proto$2.asMilliseconds = asMilliseconds; + proto$2.asSeconds = asSeconds; + proto$2.asMinutes = asMinutes; + proto$2.asHours = asHours; + proto$2.asDays = asDays; + proto$2.asWeeks = asWeeks; + proto$2.asMonths = asMonths; + proto$2.asQuarters = asQuarters; + proto$2.asYears = asYears; + proto$2.valueOf = valueOf$1; + proto$2._bubble = bubble; + proto$2.clone = clone$1; + proto$2.get = get$2; + proto$2.milliseconds = milliseconds; + proto$2.seconds = seconds; + proto$2.minutes = minutes; + proto$2.hours = hours; + proto$2.days = days; + proto$2.weeks = weeks; + proto$2.months = months; + proto$2.years = years; + proto$2.humanize = humanize; + proto$2.toISOString = toISOString$1; + proto$2.toString = toISOString$1; + proto$2.toJSON = toISOString$1; + proto$2.locale = locale; + proto$2.localeData = localeData; + + proto$2.toIsoString = deprecate( + 'toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)', + toISOString$1 + ); + proto$2.lang = lang; + + // FORMATTING + + addFormatToken('X', 0, 0, 'unix'); + addFormatToken('x', 0, 0, 'valueOf'); + + // PARSING + + addRegexToken('x', matchSigned); + addRegexToken('X', matchTimestamp); + addParseToken('X', function (input, array, config) { + config._d = new Date(parseFloat(input) * 1000); + }); + addParseToken('x', function (input, array, config) { + config._d = new Date(toInt(input)); + }); + + //! moment.js + + hooks.version = '2.29.1'; + + setHookCallback(createLocal); + + hooks.fn = proto; + hooks.min = min; + hooks.max = max; + hooks.now = now; + hooks.utc = createUTC; + hooks.unix = createUnix; + hooks.months = listMonths; + hooks.isDate = isDate; + hooks.locale = getSetGlobalLocale; + hooks.invalid = createInvalid; + hooks.duration = createDuration; + hooks.isMoment = isMoment; + hooks.weekdays = listWeekdays; + hooks.parseZone = createInZone; + hooks.localeData = getLocale; + hooks.isDuration = isDuration; + hooks.monthsShort = listMonthsShort; + hooks.weekdaysMin = listWeekdaysMin; + hooks.defineLocale = defineLocale; + hooks.updateLocale = updateLocale; + hooks.locales = listLocales; + hooks.weekdaysShort = listWeekdaysShort; + hooks.normalizeUnits = normalizeUnits; + hooks.relativeTimeRounding = getSetRelativeTimeRounding; + hooks.relativeTimeThreshold = getSetRelativeTimeThreshold; + hooks.calendarFormat = getCalendarFormat; + hooks.prototype = proto; + + // currently HTML5 input type only supports 24-hour formats + hooks.HTML5_FMT = { + DATETIME_LOCAL: 'YYYY-MM-DDTHH:mm', // + DATETIME_LOCAL_SECONDS: 'YYYY-MM-DDTHH:mm:ss', // + DATETIME_LOCAL_MS: 'YYYY-MM-DDTHH:mm:ss.SSS', // + DATE: 'YYYY-MM-DD', // + TIME: 'HH:mm', // + TIME_SECONDS: 'HH:mm:ss', // + TIME_MS: 'HH:mm:ss.SSS', // + WEEK: 'GGGG-[W]WW', // + MONTH: 'YYYY-MM', // + }; + + return hooks; + +}))); diff --git a/v3.dev/data/popup/icons/archive.png b/v3.dev/data/popup/icons/archive.png new file mode 100644 index 00000000..73155126 Binary files /dev/null and b/v3.dev/data/popup/icons/archive.png differ diff --git a/v3.dev/data/popup/icons/delete.png b/v3.dev/data/popup/icons/delete.png new file mode 100644 index 00000000..98cdd870 Binary files /dev/null and b/v3.dev/data/popup/icons/delete.png differ diff --git a/v3.dev/data/popup/icons/down.png b/v3.dev/data/popup/icons/down.png new file mode 100644 index 00000000..f1aa3160 Binary files /dev/null and b/v3.dev/data/popup/icons/down.png differ diff --git a/v3.dev/data/popup/icons/down.svg b/v3.dev/data/popup/icons/down.svg new file mode 100644 index 00000000..a29afbda --- /dev/null +++ b/v3.dev/data/popup/icons/down.svg @@ -0,0 +1,4 @@ + + + + diff --git a/v3.dev/data/popup/icons/expand.png b/v3.dev/data/popup/icons/expand.png new file mode 100644 index 00000000..25122b9b Binary files /dev/null and b/v3.dev/data/popup/icons/expand.png differ diff --git a/v3.dev/data/popup/icons/grid-view.svg b/v3.dev/data/popup/icons/grid-view.svg new file mode 100644 index 00000000..ea8fdc68 --- /dev/null +++ b/v3.dev/data/popup/icons/grid-view.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/v3.dev/data/popup/icons/inbox.png b/v3.dev/data/popup/icons/inbox.png new file mode 100644 index 00000000..56c29219 Binary files /dev/null and b/v3.dev/data/popup/icons/inbox.png differ diff --git a/v3.dev/data/popup/icons/loading.svg b/v3.dev/data/popup/icons/loading.svg new file mode 100644 index 00000000..31e2be03 --- /dev/null +++ b/v3.dev/data/popup/icons/loading.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/v3.dev/data/popup/icons/mark-all-as-read.png b/v3.dev/data/popup/icons/mark-all-as-read.png new file mode 100644 index 00000000..5c81b114 Binary files /dev/null and b/v3.dev/data/popup/icons/mark-all-as-read.png differ diff --git a/v3.dev/data/popup/icons/next.png b/v3.dev/data/popup/icons/next.png new file mode 100644 index 00000000..ab326e3b Binary files /dev/null and b/v3.dev/data/popup/icons/next.png differ diff --git a/v3.dev/data/popup/icons/options.png b/v3.dev/data/popup/icons/options.png new file mode 100644 index 00000000..211777df Binary files /dev/null and b/v3.dev/data/popup/icons/options.png differ diff --git a/v3.dev/data/popup/icons/previous.png b/v3.dev/data/popup/icons/previous.png new file mode 100644 index 00000000..a61961b7 Binary files /dev/null and b/v3.dev/data/popup/icons/previous.png differ diff --git a/v3.dev/data/popup/icons/refresh.png b/v3.dev/data/popup/icons/refresh.png new file mode 100644 index 00000000..3b54a9d9 Binary files /dev/null and b/v3.dev/data/popup/icons/refresh.png differ diff --git a/v3.dev/data/popup/icons/report.png b/v3.dev/data/popup/icons/report.png new file mode 100644 index 00000000..32067f13 Binary files /dev/null and b/v3.dev/data/popup/icons/report.png differ diff --git a/v3.dev/data/popup/icons/silent.svg b/v3.dev/data/popup/icons/silent.svg new file mode 100644 index 00000000..fbb45e0a --- /dev/null +++ b/v3.dev/data/popup/icons/silent.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/v3.dev/data/popup/icons/single-view.svg b/v3.dev/data/popup/icons/single-view.svg new file mode 100644 index 00000000..f8bbc0bb --- /dev/null +++ b/v3.dev/data/popup/icons/single-view.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/v3.dev/data/popup/icons/sound.svg b/v3.dev/data/popup/icons/sound.svg new file mode 100644 index 00000000..62e5b8dc --- /dev/null +++ b/v3.dev/data/popup/icons/sound.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/v3.dev/data/popup/icons/star_false.png b/v3.dev/data/popup/icons/star_false.png new file mode 100644 index 00000000..4819f826 Binary files /dev/null and b/v3.dev/data/popup/icons/star_false.png differ diff --git a/v3.dev/data/popup/icons/star_true.png b/v3.dev/data/popup/icons/star_true.png new file mode 100644 index 00000000..386bbefc Binary files /dev/null and b/v3.dev/data/popup/icons/star_true.png differ diff --git a/v3.dev/data/popup/index.css b/v3.dev/data/popup/index.css new file mode 100644 index 00000000..ea2288d7 --- /dev/null +++ b/v3.dev/data/popup/index.css @@ -0,0 +1,364 @@ +:root { + --white: #fff; + --gray: #f5f5f5; + --dark-gray: #a0a0a0; + --darker-gray: #717171; + --blue: #4083f2; + --loader: #55a3f4; +} +body { + font-size: 13px; + font-family: Arial, "Helvetica Neue", Helvetica, sans-serif; + display: grid; + grid-template-rows: 42px 1fr 0 42px; + margin: 0; + height: 100vh; + position: relative; +} +body.popup { + width: 800px; + height: 600px; +} +body.collapsed { + height: 350px; +} +body.popup.single { + width: 600px; +} + +input[type=button] { + cursor: pointer; + background-color: var(--white); + background-repeat: no-repeat; + background-size: 20px 20px; + background-position: center; + border: none; + height: 32px; + opacity: 0.54; + transition: opacity 200ms; + outline: none; +} +input[type=button]:hover { + opacity: 1; +} +input[type=button]:disabled { + opacity: 0.1 !important; + cursor: default; +} +input[type=button].loading { + background-image: url(icons/loading.svg) !important; + background-size: 28px; +} +#queries { + border: none; + outline: none; + height: 32px; + text-indent: 32px; + appearance: none; + background: var(--white) url(icons/down.png) center center no-repeat; + background-size: 14px; + cursor: pointer; + margin-left: -5px; +} + +#header, +#footer { + display: grid; + background-color: var(--gray); +} +#header { + grid-template-columns: 1fr 2fr; +} +#header > div { + display: grid; + grid-gap: 5px; + white-space: nowrap; + align-items: center; +} +#header > div:first-child { + grid-template-columns: 42px 42px 1fr; +} +#header > div:last-child { + margin-left: 5px; + grid-template-columns: 2fr 16px 42px min-content 42px; +} +#footer { + grid-template-columns: repeat(6, 42px) 1fr 42px; + align-items: center; +} +#history { + outline: none; + cursor: pointer; + appearance: none; + background: url(icons/down.svg) center center no-repeat; + background-size: 10px; + text-indent: 100px; + border: none; +} + +#archive { + background-image: url(icons/archive.png); +} +#report { + background-image: url(icons/report.png); +} +#delete { + background-image: url(icons/delete.png); +} +#inbox { + background-image: url(icons/inbox.png); +} +#options { + background-image: url(icons/options.png); +} +#refresh { + background-image: url(icons/refresh.png); +} +#mark-all-as-read { + background-image: url(icons/mark-all-as-read.png); +} +#previous { + background-image: url(icons/previous.png); +} +#next { + background-image: url(icons/next.png); +} +#view { + background-image: url(icons/grid-view.svg); +} + +body.single #view { + background-image: url(icons/single-view.svg); +} +#sound { + background-image: url(icons/sound.svg); + opacity: 1; + filter: saturate(0); +} +#sound.active { + filter: saturate(1); +} +#sound.silent { + background-image: url('icons/silent.svg'); +} + +#body { + position: relative; + display: grid; + grid-template-columns: var(--size, 1fr) 2fr; + overflow: hidden; +} +body[data-view="11"] #body { + grid-template-columns: 2fr 2fr; +} +body[data-view="12"] #body { + grid-template-columns: 1fr 2fr; +} +body[data-view="1_2"] #body { + grid-template-columns: 1fr; + grid-template-rows: 1fr 2fr; +} +body[data-view="1_1"] #body { + grid-template-columns: 1fr; + grid-template-rows: 1fr 1fr; +} +body[data-view="1_1"].single #body { + grid-template-rows: 1fr; +} + +body.single #body { + grid-template-columns: 1fr; +} +#content { + border: none; + width: 100%; + height: 100%; + overflow: auto; + position: relative; + box-sizing: border-box; +} +body[data-view="11"] #content, +body[data-view="12"] #content { + border-left: solid 5px var(--gray); +} +body[data-view="1_1"] #content, +body[data-view="1_2"] #content { + border-top: solid 5px var(--gray); +} +#content:empty::after { + content: attr(data-message); + color: var(--dark-gray); + position: absolute; + left: 0; + top: 0; + height: 100%; + width: 100%; + display: flex; + align-items: center; + justify-content: center; +} +#content > h2 { + text-align: center; + font-size: 100%; + font-weight: normal; + background: var(--gray); + box-shadow: 0 0 0 5px var(--gray); +} +#content > h2:first-child { + display: none; +} + +#content iframe { + width: 100%; + border: none; +} +#content iframe + iframe { + border-top: solid 5px var(--gray); +} +#entries { + align-self: start; + display: grid; + grid-template-columns: 32px var(--size, 1fr) min-content 2fr min-content; + align-items: center; + padding: 0; + margin: 0; + list-style: none; + overflow: hidden auto; + user-select: none; + max-height: 100%; + position: relative; +} +body[data-view="11"] #entries { + grid-template-columns: 32px 1fr min-content 2fr min-content; +} +body[data-view="12"] #entries { + grid-template-columns: 32px 2fr min-content 2fr min-content; +} + +#entries:empty::after { + content: attr(data-message); + color: var(--dark-gray); + padding: 10px; + white-space: nowrap; +} +body.single #entries { + display: none; +} +#entries li { + overflow: hidden; + margin: 10px 5px; + display: contents; + font-weight: bold; +} +#entries li label { + display: contents; +} +#entries li input { + display: none; +} +#entries li div[data-id="date"], +#entries li div[data-id="tags"], +#entries li div[data-id="sender"], +#entries li div[data-id="snippet"] { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + cursor: pointer; + height: 30px; + line-height: 30px; +} +#entries li div[data-id="snippet"] { + padding: 0 10px; +} +#entries li div[data-id="sender"] { + padding-left: 10px; +} +#entries li div[data-id="sender"]:empty { + display: none; +} +#entries li div[data-id="sender"]:empty + div { + padding-left: 10px; + grid-column: 2/4; +} +#entries li div[data-id="star"] { + height: 100%; + background: url(icons/star_false.png) center center no-repeat; + background-size: 20px; + cursor: pointer; +} +#entries li input[data-star="true"] ~ div[data-id="star"] { + background-image: url(icons/star_true.png); +} +#entries li div[data-id="date"] { + padding-right: 5px; + white-space: nowrap; + text-align: right; +} +#entries li div[data-id="tags"] .tag { + background-color: var(--gray); + color: var(--darker-gray); + margin-right: 2px; + font-weight: normal; + font-size: 80%; + padding: 2px 5px; +} +#entries li div[data-id="tags"]:not(:empty) + div[data-id="snippet"] { + padding-left: 5px; +} +body.popup[data-view="12"] #entries li div[data-id="tags"] { + width: 0; +} +#entries li input:checked ~ div { + color: var(--blue) !important; +} +#entries li input[data-read="true"] ~ div { + font-weight: normal; +} +#entries li:nth-child(even) div { + background-color: var(--gray); +} + +#expand { + height: 12px; + width: 42px; + background-image: url(icons/expand.png); + background-color: var(--gray); + position: absolute; + bottom: 15px; + right: 15px; + transform: rotate(180deg); + transition: trasform 200ms; +} +body:not(.popup) #expand { + display: none; +} +body.collapsed #expand { + transform: rotate(0deg); +} +#user, +#search { + border: none; + height: 32px; + outline: none; + padding: 0 10px; +} + +#entries.loading::before, +#content.loading::before, +body.loading::before { + content: ''; + position: absolute; + top: 0; + left: 0; + display: block; + background-color: var(--loader); + height: 2px; + width: 10px; + animation: loader 3s ease-in infinite; +} + +@keyframes loader { + 100% { + width: 100%; + } +} diff --git a/v3.dev/data/popup/index.html b/v3.dev/data/popup/index.html new file mode 100644 index 00000000..feffa509 --- /dev/null +++ b/v3.dev/data/popup/index.html @@ -0,0 +1,63 @@ + + + + Gmail Notifier + + + + + + + + +
    +
      +
      + +
      +
      + options! +
      + + + + + + + + + + diff --git a/v3.dev/data/popup/index.js b/v3.dev/data/popup/index.js new file mode 100644 index 00000000..b481e9dd --- /dev/null +++ b/v3.dev/data/popup/index.js @@ -0,0 +1,282 @@ +/* global core, api, command, CONFIGS, isFirefox */ + +/* localization */ +[...document.querySelectorAll('[data-i18n]')].forEach(e => { + if (e.dataset.i18nValue) { + e.setAttribute(e.dataset.i18nValue, core.i18n.get(e.dataset.i18n)); + } + else { + e.textContent = core.i18n.get(e.dataset.i18n); + } +}); +[...document.querySelectorAll('[data-i18n-title]')].forEach(e => { + e.title = core.i18n.get(e.dataset.i18nTitle); +}); + +window.HIDDENS = ['starred', 'spam', 'trash', 'important', 'unread', 'new', 'flagged', 'inbox', 'attachment']; +window.DISABLED = [ + 'SENT', 'CATEGORY_PERSONAL', 'CATEGORY_SOCIAL', 'CATEGORY_PROMOTIONS', 'CATEGORY_UPDATES', 'CATEGORY_FORUMS' +]; + +/* args */ +const args = new URLSearchParams(location.search); +if (args.get('mode') === 'popup') { + document.body.classList.add('popup'); +} +const active = { + get user() { + return document.getElementById('user').value; + }, + get query() { + return document.getElementById('search').value; + }, + users: {} +}; + +const post = window.post = request => new Promise(resolve => { + core.runtime.post(Object.assign({}, request, { + user: active.user, + query: active.query + }), resolve); +}); + +/* navigate */ +document.getElementById('previous').addEventListener('click', () => api.navigate('previous')); +document.getElementById('next').addEventListener('click', () => api.navigate('next')); + +/* click on entries */ +document.getElementById('entries').addEventListener('click', e => { + if (e.target.dataset.id === 'star') { + const input = e.target.parentElement.querySelector('input'); + if (input.dataset.star === 'true') { + input.dataset.star = false; + command(e, 'remove-star'); + } + else { + input.dataset.star = true; + command(e, 'add-star'); + } + + e.stopPropagation(); + e.preventDefault(); + return; + } + + if (e.isTrusted || e.detail['consider-trusted']) { + const meta = e.ctrlKey || e.metaKey; + if (meta !== true) { + // remove old selected + for (const input of api.dom.entries(true)) { + if (e.target !== input) { + input.checked = false; + } + } + } + } +}); + +/* view an email */ +document.getElementById('entries').addEventListener('change', () => { + const inputs = api.dom.entries(true); + if (inputs.length) { + api.view.display(inputs.map(e => e.thread)); + // mark as read if there is at least one unread message + if (inputs.some(i => i.thread.messages.labelIds.indexOf('UNREAD') !== -1)) { + core.storage.read({ + 'popup-mark-read-on-view': CONFIGS['popup-mark-read-on-view'] + }).then(prefs => { + if (prefs['popup-mark-read-on-view']) { + const target = document.getElementById('mark-as-read'); + command({ + target + }, 'mark-as-read', false); + } + }); + } + } + else { + api.view.clear(); + } +}); + +/* updating */ +document.getElementById('entries').addEventListener('change', e => { + api.update.buttons(e); +}); +document.getElementById('search').addEventListener('search', () => { + api.update.notification(); +}); +document.getElementById('search').addEventListener('keypress', e => { + if (e.key === 'Enter' && isFirefox) { + e.target.dispatchEvent(new Event('search')); + } +}); +document.getElementById('user').addEventListener('change', () => api.query.build()); + +/* search from history */ +document.getElementById('history').addEventListener('change', e => { + const s = document.getElementById('search'); + s.value = e.target.value; + s.dispatchEvent(new Event('search')); +}); +/* searching */ +document.getElementById('search').addEventListener('search', async e => { + const q = e.target.value.trim(); + if (q === '') { + return; + } + + // do we have the results of this query + document.getElementById('entries').classList.add('loading'); + api.entries.clear(); + api.view.clear(); + if (q) { + const query = active.users?.[active.user]?.queries[q] || await post({ + method: 'search-for-emails' + }); + if (query.threads) { + for (let i = 0; i < query.threads.length; i += 3) { + await Promise.all([0, 1, 2].map(async n => { + const thread = query.threads[n + i]; + if (thread) { + if (thread.messages) { + return; + } + else { + try { + thread.messages = await post({ + method: 'read-messages', + thread + }); + } + catch (e) {} + } + } + })); + } + await api.entries.build(query.threads, e); + } + } + document.getElementById('entries').classList.remove('loading'); +}); + +/* save session */ +{ + const save = () => { + core.storage.write({ + 'popup-account': { + user: active.user, + query: active.query, + threads: api.dom.entries(true).map(i => i.dataset.thread) + } + }); + }; + // navigate button, keyboard shortcut, click on an entry + document.getElementById('entries').addEventListener('change', e => e.isTrusted && save()); + document.getElementById('search').addEventListener('search', e => e.isTrusted && save()); +} + +/* toggle notifications */ +document.getElementById('sound').addEventListener('click', async e => { + e.target.classList.toggle('active'); + const queries = await api.users.queries(); + if (e.target.classList.contains('active')) { + queries.push(active.query); + } + else { + const n = queries.indexOf(active.query); + if (n !== -1) { + queries.splice(n, 1); + } + } + + const prefs = await core.storage.read({ + 'queries': CONFIGS['queries'] + }); + prefs.queries[active.user] = queries; + await core.storage.write(prefs); + await post({ + method: 'hard-refresh' + }); +}); + +/* expand button */ +document.getElementById('expand').onclick = () => { + document.body.classList.toggle('collapsed'); + document.getElementById('entries').dispatchEvent(new Event('change')); + core.storage.write({ + mode: document.body.classList.contains('collapsed') ? 'collapsed' : 'expanded' + }); +}; +core.storage.read({ + mode: CONFIGS['popup-mode'] +}).then(prefs => { + // only on the popup mode + if (args.get('mode') === 'popup') { + document.body.classList[prefs.mode === 'collapsed' ? 'add' : 'remove']('collapsed'); + } + else { + document.body.classList.remove('collapsed'); + } +}); + +/* view */ +core.storage.read({ + 'popup-view': CONFIGS['popup-view'], + 'grid-view': CONFIGS['grid-view'] +}).then(prefs => { + document.body.classList[prefs['popup-view'] === 'single' ? 'add' : 'remove']('single'); + document.body.dataset.view = prefs['grid-view']; +}); +document.getElementById('view').onclick = async () => { + const prefs = await core.storage.read({ + 'popup-view': CONFIGS['popup-view'], + 'grid-view': CONFIGS['grid-view'] + }); + if (prefs['popup-view'] === 'single') { + prefs['popup-view'] = 'grid'; + prefs['grid-view'] = '12'; + } + else if (prefs['grid-view'] === '12') { + prefs['grid-view'] = '11'; + } + else if (prefs['grid-view'] === '11') { + prefs['grid-view'] = '1_2'; + } + else if (prefs['grid-view'] === '1_2') { + prefs['grid-view'] = '1_1'; + } + else if (prefs['grid-view'] === '1_1') { + prefs['popup-view'] = 'single'; + } + document.body.classList[prefs['popup-view'] === 'single' ? 'add' : 'remove']('single'); + document.body.dataset.view = prefs['grid-view']; + core.storage.write(prefs); +}; + +/* start */ +(async () => { + document.body.classList.add('loading'); + + active.users = await post({ + method: 'get-users' + }); + + // build users + await api.users.build(); + + document.body.classList.remove('loading'); +})(); + + +core.runtime.message((request, sender, response) => { + if (request.method === 'close-popup' && args.get('mode') === 'popup') { + window.close(); + } + else if (request.method === 'interface-echo') { + response(true); + core.runtime.post({ + method: 'focus-interface' + }); + } +}); diff --git a/v3.dev/data/popup/view/sandbox/sandbox.css b/v3.dev/data/popup/view/sandbox/sandbox.css new file mode 100644 index 00000000..ea851d29 --- /dev/null +++ b/v3.dev/data/popup/view/sandbox/sandbox.css @@ -0,0 +1,16 @@ +:root { + --dark-gray: #a0a0a0; +} +body, +pre { + font-size: 13px; + font-family: Arial, "Helvetica Neue", Helvetica, sans-serif; +} +body:empty::after { + content: 'nothing to show!'; + font-style: italic; + color: var(--dark-gray); +} +pre { + white-space: break-spaces; +} diff --git a/v3.dev/data/popup/view/sandbox/sandbox.html b/v3.dev/data/popup/view/sandbox/sandbox.html new file mode 100644 index 00000000..b72faf7d --- /dev/null +++ b/v3.dev/data/popup/view/sandbox/sandbox.html @@ -0,0 +1,9 @@ + + + + + + + +Waiting for content... + diff --git a/v3.dev/data/popup/view/view.css b/v3.dev/data/popup/view/view.css new file mode 100644 index 00000000..0d1f832c --- /dev/null +++ b/v3.dev/data/popup/view/view.css @@ -0,0 +1,87 @@ +:root { + --white: #fff; + --gray: #f5f5f5; + --blue: #4083f2; + --label-clr: #fff; + --label-bg: var(--blue); + --attch-bg: #f5f5f5; +} +body { + font-size: 13px; + font-family: Arial, "Helvetica Neue", Helvetica, sans-serif; + display: grid; + grid-template-rows: min-content min-content min-content min-content 1fr 42px; + grid-template-columns: min-content 1fr; + grid-gap: 5px 10px; + margin: 0; + height: 100vh; + align-items: center; + padding: 0 5px; + overflow-y: hidden; +} + +#content { + grid-column: 1/3; + border: none; + width: 100%; + height: 100%; +} +#more { + display: flex; + align-items: center; + grid-column: 1/3; + gap: 5px; +} +#subject { + flex: 1; + font-size: 22px; + text-decoration: none; + color: inherit; + font-weight: normal; +} +#subject, +#from, +#to { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} +.label { + color: var(--label-clr); + background-color: var(--label-bg); + display: flex; + align-items: center; + padding-left: 5px; + font-size: 80%; +} +.label:not(:last-child) { + margin-right: 2px; +} +.label input[type=button] { + border: none; + outline: none; + cursor: pointer; + margin-left: 5px; + padding: 0 5px; + opacity: 0.54; +} +.label input[type=button]:hover:not(:disabled) { + opacity: 1; +} +.label input[type=button]:disabled { + cursor: not-allowed; +} +#attachments { + display: flex; + flex-flow: wrap; + gap: 5px; +} + +.attachment { + color: var(--attch-clr); + background-color: var(--attch-bg); + display: flex; + align-items: center; + padding: 2px 5px; + cursor: pointer; +} diff --git a/v3.dev/data/popup/view/view.html b/v3.dev/data/popup/view/view.html new file mode 100644 index 00000000..2bebb264 --- /dev/null +++ b/v3.dev/data/popup/view/view.html @@ -0,0 +1,31 @@ + + + + + + + + + + + +
      +

      Subject

      +
      + From + + To + + Attachments +
      -
      + + + + diff --git a/v3.dev/data/popup/view/view.js b/v3.dev/data/popup/view/view.js new file mode 100644 index 00000000..baa48f0e --- /dev/null +++ b/v3.dev/data/popup/view/view.js @@ -0,0 +1,226 @@ +const decode = function(input) { + let a; + try { + a = atob(input); + } + catch (e) { + a = atob(input.replace(/-/g, '+').replace(/_/g, '/')); + } + + return decodeURIComponent(escape(a)); +}; + +window.onmessage = e => { + const request = e.data; + + if (request.method === 'show-message') { + document.querySelector('base').href = request.base; + + const message = request.message; + const more = document.getElementById('more'); + /* subject */ + const subject = message?.headers?.Subject || message.payload.headers.filter(o => o.name === 'Subject').shift().value; + if (subject) { + const e = document.getElementById('subject'); + e.title = e.textContent = subject; + e.href = request['user-href']; + } + /* labels */ + const t = document.getElementById('label'); + for (const label of (message.labelIds || message.tags)) { + if (parent.HIDDENS.some(a => label.toLowerCase() === a)) { + continue; + } + const clone = document.importNode(t.content, true); + clone.querySelector('input').disabled = parent.DISABLED.some(a => label === a); + clone.querySelector('span').textContent = label; + clone.querySelector('input').onclick = e => { + top.post({ + method: 'modify-a-message', + message, + removeLabelIds: [label] + }); + e.target.parentElement.remove(); + }; + more.appendChild(clone); + } + /* from */ + const from = message?.headers?.From || message.payload.headers.filter(o => o.name === 'From').shift().value; + if (from) { + document.getElementById('from').textContent = from; + } + /* to */ + const to = message?.headers?.To || message.payload.headers.filter(o => o.name === 'To').shift().value; + if (to) { + document.getElementById('to').textContent = to; + } + /* content */ + let content; + let mime; + + const parts = []; + const attachments = []; + if (message.body && Array.isArray(message.body)) { // notmuch + const next = o => { + if (o['content-type'].startsWith('multipart/')) { + o.content.forEach(next); + } + else { + parts.push(o); + } + }; + message.body.forEach(next); + parts.forEach(o => { + if (o['content-type'] !== 'text/plain' && o['content-type'] !== 'text/html') { + attachments.push(o); + } + }); + const o = parts.filter(o => { + if (request.mode === 'expanded') { + return o['content-type'] === 'text/html'; + } + return o['content-type'] === 'text/plain'; + }).shift() || parts[0]; + if (o) { + mime = o['content-type']; + content = o; + } + } + else if (message.payload.parts) { + const parts = []; + const next = o => { + if (o.mimeType && o.mimeType.startsWith('multipart/')) { + o.parts.forEach(next); + } + else { + parts.push(o); + } + }; + message.payload.parts.forEach(next); + + parts.forEach(o => { + if (o.mimeType !== 'text/plain' && o.mimeType !== 'text/html') { + attachments.push(o); + } + }); + const o = parts.filter(o => { + if (request.mode === 'expanded') { + return o.mimeType === 'text/html'; + } + return o.mimeType === 'text/plain'; + }).shift(); + if (o) { + mime = o.mimeType; + content = o.body; + } + } + if (!content) { + content = message.payload.body; + mime = message.payload.mimeType; + } + if ( + (mime === 'text/html' && request.mode === 'collapsed') || + (mime === 'text/plain' && request.com === 'snippet' && message.snippet) + ) { + content = { + content: message.snippet + }; + mime = 'text/plain'; + } + const f = document.getElementById('content'); + if (request.csp) { + const meta = document.createElement('meta'); + meta.setAttribute('http-equiv', 'Content-Security-Policy'); + meta.setAttribute('content', request.csp); + f.contentDocument.head.appendChild(meta); + } + if (content) { + if (content['raw-html']) { + const parser = new DOMParser(); + const doc = parser.parseFromString(content['raw-html'], 'text/html'); + const bodies = doc.querySelectorAll('.maincontent > table tr:last-child td > div'); + + content.content = ''; + for (const body of [...bodies].reverse()) { + content.content += body.innerHTML + '
      '; + } + } + + const body = content.content || decode(content.data || ''); + f.contentDocument.body.textContent = ''; + if (mime === 'text/html') { + const parser = new DOMParser(); + const doc = parser.parseFromString(body, 'text/html'); + const e = doc.querySelector('body'); + f.contentDocument.body.appendChild(e); + } + else if (body) { + const pre = document.createElement('pre'); + pre.textContent = body; + f.contentDocument.body.appendChild(pre); + } + const style = document.createElement('style'); + style.textContent = ` + body > hr { + border: none; + border-bottom: solid 4px whitesmoke; + } + body > hr:last-child { + display: none; + } + `; + f.contentDocument.head.appendChild(style); + + // prevent redirects + for (const a of [...f.contentDocument.body.querySelectorAll('a[href^="https://www.google.com/url?"]')]) { + const href = a.href; + const args = new URLSearchParams(a.href.substr(27)); + if (args.has('q')) { + const link = args.get('q'); + a.setAttribute('href', link || href); + } + } + + // resize observer + const resizeObserver = new ResizeObserver(() => { + f.style.height = f.contentDocument.documentElement.offsetHeight + 'px'; + }); + resizeObserver.observe(f.contentDocument.documentElement); + // forward keyboards + f.contentDocument.addEventListener('keydown', e => { + top.document.dispatchEvent(new KeyboardEvent('keydown', e)); + }); + } + // attachments + if (attachments.length) { + const a = document.getElementById('attachment'); + const e = document.getElementById('attachments'); + e.textContent = ''; + attachments.forEach(part => { + const clone = document.importNode(a.content, true); + + clone.querySelector('span').onclick = e => chrome.permissions.request({ + permissions: ['downloads'] + }, granted => { + if (granted) { + const name = e.target.textContent; + e.target.textContent = 'Downloading...'; + setTimeout(() => e.target.textContent = name, 1000); + top.post({ + method: 'download-an-attachment', + message, + part + }); + } + }); + clone.querySelector('span').textContent = part.filename || `NA (${part['content-type'] || part.mimeType})`; + e.appendChild(clone); + }); + } + } +}; + +// forward keyboards +document.addEventListener('keydown', e => { + top.document.dispatchEvent(new KeyboardEvent('keydown', e)); +}); diff --git a/v3.dev/data/sounds/0.wav b/v3.dev/data/sounds/0.wav new file mode 100644 index 00000000..9bdc4a28 Binary files /dev/null and b/v3.dev/data/sounds/0.wav differ diff --git a/v3.dev/data/sounds/1.wav b/v3.dev/data/sounds/1.wav new file mode 100644 index 00000000..aea0e6fe Binary files /dev/null and b/v3.dev/data/sounds/1.wav differ diff --git a/v3.dev/data/sounds/2.wav b/v3.dev/data/sounds/2.wav new file mode 100644 index 00000000..c9462afc Binary files /dev/null and b/v3.dev/data/sounds/2.wav differ diff --git a/v3.dev/data/sounds/3.wav b/v3.dev/data/sounds/3.wav new file mode 100644 index 00000000..4640f29c Binary files /dev/null and b/v3.dev/data/sounds/3.wav differ diff --git a/v3.dev/engines/.eslintrc b/v3.dev/engines/.eslintrc new file mode 100644 index 00000000..53e79da3 --- /dev/null +++ b/v3.dev/engines/.eslintrc @@ -0,0 +1,5 @@ +{ + "parserOptions": { + "sourceType": "module" + } +} diff --git a/v3.dev/engines/api/core.js b/v3.dev/engines/api/core.js new file mode 100644 index 00000000..f3f8544c --- /dev/null +++ b/v3.dev/engines/api/core.js @@ -0,0 +1,196 @@ +/* global core, CONFIGS */ + +class APIEngine { + constructor(cnfg = {}) { + this.TYPE = 'API'; + this.user = {}; + this.config = Object.assign({ + 'base': 'https://www.googleapis.com/gmail/v1/', + 'auth': 'https://accounts.google.com/o/oauth2/auth', + 'scopes': ['https://www.googleapis.com/auth/gmail.modify'].join(', ') + }, cnfg); + } + async authorize(cache = true, interactive = true) { + const prefs = await core.storage.read({ + 'api-client': CONFIGS['api-client'] + }); + + if (prefs['api-client'] === '') { + throw Error('Please set api-client and retry'); + } + + const r = new Promise((resolve, reject) => { + const url = this.config.auth + + '?response_type=token&client_id=' + prefs['api-client'] + + '&scope=' + this.config.scopes + + '&redirect_uri=' + chrome.identity.getRedirectURL('oauth2'); + + const next = () => chrome.identity.launchWebAuthFlow({ + url, + interactive + }, redirectUrl => { + const {lastError} = chrome.runtime; + if (lastError) { + return reject(Error(lastError.message)); + } + core.log('engine.identity', redirectUrl); + const args = new URLSearchParams(redirectUrl.split('#')[1]); + core.storage.write({ + 'type': args.get('token_type'), + 'token': args.get('access_token'), + 'expires': args.get('expires_in') + }).then(resolve); + }); + if (cache) { + next(); + } + else { + chrome.identity.clearAllCachedAuthTokens(next); + } + }); + + return r; + } + async fetch(path, options = {}, authorization = true) { + options.headers = options.headers || {}; + if (authorization) { + const {token, type} = await core.storage.read({ + token: '', + type: 'Bearer' + }); + options.headers['Authorization'] = type + ' ' + token; + } + return fetch(this.config.base + path, options); + } + async introduce(user) { + const profile = await this.fetch(`users/${user.email}/profile`).then(r => r.json()); + if (profile.error) { + throw Error(profile.error.message); + } + this.user.profile = profile; + return profile.emailAddress; + } + async labels() { + const r = await this.fetch(`users/${this.user.profile.emailAddress}/labels`).then(r => r.json()); + if (r.error) { + throw Error(r.error.message); + } + this.user.labels = r.labels; + return r.labels; + } + async threads(query) { + const href = `users/${this.user.profile.emailAddress}/threads?q=` + encodeURIComponent(query); + let r = await this.fetch(href).then(r => r.json()); + if (r.error) { + core.log('renewing token / threads', r); + this.authorize(true, true); + r = await this.fetch(href).then(r => r.json()); + } + if (r.error) { + throw Error(r.error.message); + } + + return r; + } + async messages(thread) { + const href = `users/${this.user.profile.emailAddress}/messages/${thread.id}?` + + 'format=METADATA&metadataHeaders=Subject&metadataHeaders=From'; + let r = await this.fetch(href).then(r => r.json()); + if (r.error) { + core.log('renewing token / messages', r); + this.authorize(true, true); + r = await this.fetch(href).then(r => r.json()); + } + if (r.error) { + throw Error(r.error.message); + } + + return r; + } + async thread(thread) { + const href = `users/${this.user.profile.emailAddress}/threads/${thread.id}`; + let r = await this.fetch(href).then(r => r.json()); + if (r.error) { + core.log('renewing token / thread', r); + this.authorize(true, true); + r = await this.fetch(href).then(r => r.json()); + } + if (r.error) { + throw Error(r.error.message); + } + + return r; + } + // https://developers.google.com/gmail/api/guides/labels + async action(threads, name) { + const href = `users/${this.user.profile.emailAddress}/threads/`; + if (name === 'delete') { + return Promise.all(threads.map(thread => this.fetch(href + thread.id + '/trash', { + method: 'POST' + }).then(r => r.json()))); + } + else { + const addLabelIds = []; + const removeLabelIds = []; + if (name === 'mark-as-unread') { + addLabelIds.push('UNREAD'); + } + if (name === 'mark-as-read') { + removeLabelIds.push('UNREAD'); + } + if (name === 'archive') { + removeLabelIds.push('INBOX'); + } + if (name === 'move-to-inbox') { + addLabelIds.push('INBOX'); + } + if (name === 'report') { + addLabelIds.push('SPAM'); + } + if (name === 'add-star') { + addLabelIds.push('STARRED'); + } + if (name === 'remove-star') { + removeLabelIds.push('STARRED'); + } + + const r = await Promise.all(threads.map(thread => this.fetch(href + thread.id + '/modify', { + method: 'POST', + body: JSON.stringify({ + addLabelIds, + removeLabelIds + }) + }).then(r => r.json()))); + + await this.update(); + + return r; + } + } + async attachment(message, part) { + const href = `users/${this.user.profile.emailAddress}/messages/${message.id}/attachments/${part.body.attachmentId}`; + let r = await this.fetch(href).then(r => r.json()); + if (r.error) { + core.log('renewing token / attachment', r); + this.authorize(true, true); + r = await this.fetch(href).then(r => r.json()); + } + const url = 'data:' + part.mimeType + ';base64,' + r.data.replace(/-/g, '+').replace(/_/g, '/'); + + return core.download({ + filename: part.filename || 'unknown', + url + }); + } + async modify({message, addLabelIds = [], removeLabelIds = []}) { + const href = `users/${this.user.profile.emailAddress}/messages/${message.id}/modify`; + const r = await this.fetch(href, { + method: 'POST', + body: JSON.stringify({ + addLabelIds, + removeLabelIds + }) + }).then(r => r.json()); + return r; + } +} diff --git a/v3.dev/engines/native/core.js b/v3.dev/engines/native/core.js new file mode 100644 index 00000000..a256dbf4 --- /dev/null +++ b/v3.dev/engines/native/core.js @@ -0,0 +1,286 @@ +/* global core */ + +class NativeEngine { + constructor(cnfg = {}) { + this.TYPE = 'NATIVE'; + this.user = {}; + this.config = Object.assign({ + id: 'com.add0n.node', + path: '/usr/local/bin/notmuch', + wsl: 'C:\\\\Windows\\\\System32\\\\wsl.exe', + thread: { + limit: 100 + } + }, cnfg); + } + update() { + return Promise.resolve(); + } + authorize() { + return new Promise((resolve, reject) => chrome.permissions.contains({ + permissions: ['nativeMessaging'] + }, granted => { + if (granted) { + resolve(); + } + else { + reject(Error('User does not permit the native access')); + } + })); + } + exec(command, permissions = ['child_process', 'os']) { + return new Promise((resolve, reject) => { + chrome.runtime.sendNativeMessage(this.config.id, { + permissions, + args: [this.config.path, this.config.wsl, command], + script: String.raw` + const callback = (error, stdout, stderr) => { + push({ + stdout, + stderr: stderr || (error ? error.message : ''), + code: (error || stderr) ? 1 : 0 + }); + close(); + } + + const cmd = require('os').platform() === 'win32' ? + require('child_process').exec(args[1] + ' ' + args[0] + ' ' + args[2], callback) : + require('child_process').exec(args[0] + ' ' + args[2], callback); + ` + }, r => { + const lastError = chrome.runtime.lastError; + if (lastError) { + reject(lastError); + } + else { + resolve(r); + } + }); + }); + } + spawn(commands, each = 'JSON.parse(stdout).forEach(push);', data = 'data => stdout += data', permissions = ['child_process', 'os']) { + const {id, path, wsl} = this.config; + return new ReadableStream({ + start(controller) { + const ch = chrome.runtime.connectNative(id); + + ch.onDisconnect.addListener(() => controller.error(Error('channel is broken'))); + ch.onMessage.addListener(r => { + if (!r) { + ch.disconnect(); + controller.error(Error('empty response')); + } + controller.enqueue(r); + + if (r.code === 0) { + ch.disconnect(); + controller.close(); + } + else if ('code' in r) { + ch.disconnect(); + console.warn(r); + controller.error(Error(r.error || r.stderr || 'code is not zero')); + } + }); + ch.postMessage({ + permissions, + args: [path, wsl, commands], + script: String.raw` + const [command, query, limit, offset, output] = args; + let notmuch; + if (require('os').platform() === 'win32') { + notmuch = require('child_process').spawn(args[1], ['notmuch', ...args[2]]); + } + else { + notmuch = require('child_process').spawn( + args[0], + args[2] + ); + } + + let stderr = ''; + let stdout = ''; + notmuch.stdout.on('data', ${data}); + notmuch.stderr.on('data', data => stderr += data); + notmuch.on('close', code => { + if (code === 0) { + ${each} + push({code: 0}); + close(); + } + else { + push({code, stdout, stderr}); + close(); + } + }); + notmuch.stdin.end(); + ` + }); + } + }); + } + async introduce() { + const r = await this.exec('config get user.name'); + if (r && r.stdout) { + this.user.name = r.stdout.trim(); + + return this.user.name || 'unknown'; + } + else { + throw Error(r?.stderr || 'cannot detect any user! is "notmuch" installed on this system'); + } + } + async threads(query) { + // convert Gmail's query to notmuch + query = query.replaceAll('label:', 'tag:'); + + const resultSizeEstimate = parseInt((await this.exec('count ' + query)).stdout); + const readable = this.spawn(['search', '--limit=' + this.config.thread.limit, '--offset=0', '--format=json', '--output=summary', query]); + + return new Promise((resolve, reject) => { + const threads = []; + readable.pipeTo(new WritableStream({ + write(r) { + if (r.thread) { + threads.push({ + snippet: r.subject, + id: r.thread, + messages: { + labelIds: r.tags.map(s => { + if (s === 'unread') { + return 'UNREAD'; + } + else if (s === 'flagged') { + return 'STARRED'; + } + return s; + }), + date: r.date_relative, + payload: { + mimeType: 'multipart/alternative', + headers: [{ + name: 'From', + value: r.authors + }] + } + } + }); + } + }, + close() { + resolve({ + resultSizeEstimate, + threads + }); + }, + abort(e) { + reject(e); + } + })); + }); + } + async thread(thread) { + const readable = this.spawn([ + 'show', '--entire-thread=true', '--body=true', '--include-html', '--format=json', 'thread:' + thread.id + ], `const step = arr => arr.forEach(a => Array.isArray(a) ? step(a) : push(a)); step(JSON.parse(stdout));`); + return new Promise((resolve, reject) => { + const messages = []; + readable.pipeTo(new WritableStream({ + write(r) { + if (r.id) { + messages.push(r); + } + }, + close() { + resolve({ + messages + }); + }, + abort(e) { + reject(e); + } + })); + }); + } + async action(threads, name) { + const addLabelIds = []; + const removeLabelIds = []; + if (name === 'delete') { + addLabelIds.push('deleted'); + } + if (name === 'mark-as-unread') { + addLabelIds.push('unread'); + } + if (name === 'mark-as-read') { + removeLabelIds.push('unread'); + } + if (name === 'archive') { + addLabelIds.push('archive'); + } + if (name === 'move-to-inbox') { + addLabelIds.push('inbox'); + } + if (name === 'report') { + addLabelIds.push('spam'); + } + if (name === 'add-star') { + addLabelIds.push('flagged'); + } + if (name === 'remove-star') { + removeLabelIds.push('flagged'); + } + + const r = await this.exec('tag ' + [ + ...addLabelIds.map(s => '+' + s), + ...removeLabelIds.map(s => '-' + s) + ].join(' ') + ' ' + threads.map(th => 'thread:' + th.id).join(' ')); + + await this.exec('new'); + await this.update(); + + return [r]; + } + async attachment(message, part) { + const readable = this.spawn(['show', '--part=' + part.id, '--format=raw', 'id:' + message.id], '', 'stdout => push(stdout)'); + return new Promise((resolve, reject) => { + const data = []; + + readable.pipeTo(new WritableStream({ + write(r) { + if (r.data) { + data.push(r.data); + } + }, + close() { + const bytes = new Uint8Array(data.flat()); + const blob = new Blob([bytes], { + type: part['content-type'] + }); + const href = URL.createObjectURL(blob); + + core.download({ + filename: part.filename || 'unknown', + url: href + }).then(() => { + URL.revokeObjectURL(href); + resolve(); + }); + }, + abort(e) { + reject(e); + } + })); + }); + } + async modify({message, addLabelIds = [], removeLabelIds = []}) { + const r = await this.exec('tag ' + [ + ...addLabelIds.map(s => '+' + s), + ...removeLabelIds.map(s => '-' + s) + ].join(' ') + ' ' + 'id:' + message.id); + + await this.exec('new'); + await this.update(); + + return r; + } +} diff --git a/v3.dev/engines/rss/core.js b/v3.dev/engines/rss/core.js new file mode 100644 index 00000000..58c61cc1 --- /dev/null +++ b/v3.dev/engines/rss/core.js @@ -0,0 +1,495 @@ +/* global query, core */ + +class RSSEngine { + constructor(cnfg = {}) { + this.TYPE = 'RSS'; + this.CACHE = 'rss-v1'; + this.user = { + queries: {} + }; + this.config = Object.assign({ + blind: 'https://mail.google.com/mail/?ui=html&zy=h', + timeout: 30 * 60 * 1000 + }, cnfg); + } + update() { + return Promise.resolve(); + } + async clean() { + const cache = await caches.open(this.CACHE); + for (const request of await cache.keys()) { + await cache.delete(request); + } + } + authorize() { + return Promise.reject(Error('User need to login using Gmail interface')); + } + async get(path, properties = {}, skip = false) { + const href = path.startsWith('http') ? path : this.base + path; + + const request = new Request(href, properties); + const cache = await caches.open(this.CACHE); + const now = Date.now(); + let response = await caches.match(request); + if (response) { + const date = (new Date(response.headers.get('date'))).getTime(); + if (now - date < this.config.timeout) { + if (skip) { + return response; + } + return await response.text(); + } + } + core.log(request.method, href); + response = await fetch(request); + if (response.ok && response.url.indexOf('accounts.google') === -1) { + // caching + if (request.method === 'GET') { + cache.put(request, response.clone()); + } + if (skip) { + return response; + } + return await response.text(); + } + else { + this.clean(); + } + throw Error('Request rejected'); + } + async bypass(at) { + const body = new URLSearchParams(); + body.append('at', at); + await fetch(this.base.split('?')[0] + '?a=uia', { + method: 'POST', + body + }); + } + async introduce(user, step = 0) { + const href = await this.get(this.config.blind, {}, true).then(r => r.url); + if (href.indexOf('/u/') === -1) { + throw Error('cannot find basic HTML view from the blind URL'); + } + this.user.id = user.id; + this.base = href.replace(/\/u\/\d+/, '/u/' + user.id).split('?')[0]; + + const content = await this.get(this.base); + + // do you really want to use this view + const input = await query(content, { // doc.querySelector('[name="at"]'); + match(node) { + return node?.attributes.NAME === 'at'; + } + }); + + if (input && step === 0) { + await this.bypass(input.value); + return this.introduce(user, step += 1); + } + + try { + const email = await query(content, { + match(node) { + return node?.attributes?.CLASS?.indexOf('gb4') !== -1; + } + }).text; + this.user.id = 0; + this.user.email = email; + return email; + } + catch (e) { + console.warn(e); + throw Error('Cannot extract email from interface'); + } + } + async labels() { + const labels = []; + const content = await this.get(this.base); + // system + const a = await query(content, { // [href="?&"] + name: 'A', + match(node) { + return node?.attributes?.HREF === '?&'; + } + }); + if (a) { + const table = a.closest('table'); + [...table.querySelectorAll('a[href]')].forEach(e => { + const href = e.getAttribute('href'); + if (href === '?&cs=b&pv=tl&v=b') { // compose + return; + } + if (href === '?&v=cl') { // contacts + return; + } + const m = /\((\d+)\)$/.exec(e.textContent); + labels.push({ + name: m ? e.textContent.replace(m[0], '').trim() : e.textContent, + count: m ? Number(m[1]) : 0, + type: 'system', + href: e.href + }); + }); + } + else { + throw Error('Cannot find "INBOX" link'); + } + // user + const b = await query(content, { // doc.querySelector('[href="?&v=prl"]'); // edit labels + match(node) { + return node?.attributes?.HREF.indexOf('?&v=prl') !== -1; + } + }); + if (b) { + const table = b.closest('TABLE'); + [...table.querySelectorAll('a[href]')].forEach(e => { + const href = e.getAttribute('href'); + if (href === '?&v=prl') { // edit labels + return; + } + const m = /\((\d+)\)$/.exec(e.textContent); + labels.push({ + name: m ? e.textContent.replace(m[0], '') : e.textContent, + count: m ? Number(m[1]) : 0, + type: 'user', + href: e.href + }); + }); + } + else { + throw Error('Cannot find "Edit labels" link'); + } + this.user.labels = labels; + return labels; + } + async at() { + const content = await this.get(this.base); + const e1 = await query(content, { // doc.querySelector('a[href*="at="]'); + name: 'A', + match(node) { + return node?.attributes?.HREF.indexOf('at=') !== -1; + } + }); + if (e1 && e1.attributes) { + const args = new URLSearchParams(e1.attributes.HREF.split('?')[1]); + const at = args.get('at'); + if (!at) { + throw Error('cannot extract "at" from the base page'); + } + return at; + } + + const input = await query(content, { // doc.querySelector('[name="at"]'); // do you really want to use this view + match(node) { + return node?.attributes?.NAME === 'at'; + } + }); + + // allow access to the HTML version + if (input && input.attributes) { + await this.bypass(input.attributes.VALUE); + return input.attributes.VALUE; + } + throw Error('cannot get "at" from the base page'); + } + async threads(q, cache = true) { + const at = await this.at(); + const body = new URLSearchParams(); + body.append('s', 'q'); + body.append('q', q); + body.append('nvp_site_mail', 'Search Mail'); + body.append('at', at); + + const headers = {}; + if (cache === false) { + headers['cache-control'] = 'no-cache'; + } + + const content = await this.get(this.base.split('?')[0] + '?s=q&q=' + encodeURIComponent(q) + '&nvp_site_mail=Search%20Mail', { + method: 'POST', + body, + headers + }); + const as = await query(content, { // [...doc.querySelectorAll('a[href*="&th="]')]; + name: 'A', + match(node) { + return node?.attributes?.HREF.indexOf('&th=') !== -1; + } + }, false); + let resultSizeEstimate = 0; + if (as.length) { + // Gmail does not return the exact number. Try to get it from the interface + if (q === 'label:INBOX is:unread') { + const a = await query(content, { // doc.querySelector('a[href="?&"]'); + name: 'A', + match(node) { + return node?.attributes?.HREF === '?&'; + } + }); + if (a) { + const m = /\d+/.exec(a.text.replace(/[,.]/g, '')); + if (m && isNaN(m[0]) === false) { + resultSizeEstimate = Number(m[0]); + } + } + } + if (resultSizeEstimate === 0) { + // doc.querySelector('form[name=f] td[align="right"] b:last-of-type'); + const t = (await query(content, { + name: 'FORM', + match(node) { + return node?.attributes.NAME === 'f'; + } + }))?.child({ + name: 'TD', + match(n) { + return n?.attributes.ALIGN === 'right'; + } + })?.child({name: 'B'}, true); + + if (!t) { + throw Error('Cannot detect resultSizeEstimate'); + } + const n = Number(t.text.replace(/[,.]/g, '')); // 3,650 -> 3650 + if (isNaN(n) === false) { + resultSizeEstimate = n; + } + } + } + + const threads = as.map(a => { + const thread = {}; + const tr = a.closest('TR'); + + // const es = ts.children.length === 3 ? ts.children : ts.childNodes; + // if (es.length < 3) { + // throw Error('Cannot extract "labels", "title", and "snippet" from the element'); + // } + const snippet = a.child({name: 'FONT'}, true); // ts.querySelector('font:last-child'); + + thread.snippet = snippet && snippet.text ? snippet.text.replace(/^ - /, '') : ''; + + const ts = a.child({ + match(n) { + return n?.attributes?.CLASS?.indexOf('ts') !== -1; + } + }); + const subject = ts.children[1].name === 'B' ? ts.children[1] : ts; + + thread.href = a.attributes.HREF; + + thread.id = a.attributes.HREF.split('th=')[1].split('&')[0]; + + thread['user-href'] = `https://mail.google.com/mail/u/${this.user.id}/?shva=1#all/${thread.id}`; + thread.base = this.base; + + const date = tr.child({name: 'TD'}, true); + const labels = a.child({ + name: 'FONT', + match(n) { + return n?.attributes.SIZE === '1'; + } + })?.child({name: 'FONT'}); + const from = tr.children[1].child({name: 'B'}) || tr.children[1]; + + thread.messages = { + labelIds: labels?.text?.split(/\s*,\s*/).filter(a => a) || [], + date: date.text || date.children[0].text, + // date: 'FFF', // ts.closest('td').nextElementSibling.textContent + payload: { + mimeType: 'multipart/alternative', + headers: [{ + name: 'Subject', + value: subject.text + }, { + name: 'From', + value: from.text.replace(/\s+\(\d+\)$/, '') + // value: 'FRRRRR' // ts.closest('td').previousElementSibling.textContent.replace(/\s+\(\d+\)$/, '') + }] + } + }; + if (subject.name === 'B') { + thread.messages.labelIds.push('UNREAD'); + } + const img = tr.child({ // querySelector('img[alt=Starred]') + name: 'INPUT', + match(n) { + return n?.attributes?.NAME === 't'; + } + })?.child({name: 'IMG'}); + if (img && img?.attributes?.SRC?.indexOf('star') !== -1) { + thread.messages.labelIds.push('STARRED'); + } + return thread; + }); + + + this.user.queries[query] = threads; + + return { + resultSizeEstimate, + threads + }; + } + async thread(o) { + const href = o.href.replace('&v=c', '&v=pt'); + const content = await this.get(href); + + let labelIds = o.messages.labelIds; + // try to update labels since "o" might be outdated + for (const threads of Object.values(this.user.queries)) { + for (const thread of threads) { + if (thread.id === o.id) { + labelIds = thread.messages.labelIds; + break; + } + } + } + const to = (await query(content, { + name: 'FONT', + match(n) { + return n?.attributes?.CLASS?.indexOf('recipient') !== -1; + } + }))?.child({name: 'DIV'})?.text.replace('To: ', '') || 'NA'; + + // parts + const parts = [{ + mimeType: 'text/plain', + body: { + 'raw-html': content + } + }, { + mimeType: 'text/html', + body: { + 'raw-html': content + } + }]; + + // find attachments + const att = (await query(content, { + name: 'TABLE', + match(n) { + return n?.attributes?.CLASS && n?.attributes?.CLASS?.indexOf('att') !== -1; + } + })); + if (att && att.child) { + for (const e of att.child({name: 'TABLE'}, false, false)) { + const a = e.child({ + name: 'A' + }); + const b = e.child({ + name: 'B' + }); + if (b.text) { + const href = a.attributes.HREF.startsWith('http') ? a.attributes.HREF : this.base + a.attributes.HREF; + + parts.push({ + 'href': href, + 'content-disposition': 'attachment', + 'content-length': b.parent.text, + 'content-type': 'application/octet-stream', + 'filename': b.text + }); + } + } + } + + return { + href, + messages: [{ + id: o.id, + labelIds, + payload: { + mimeType: 'multipart/alternative', + parts, + headers: [{ + name: 'To', + value: to + }, ...o.messages.payload.headers] + }, + snippet: o.snippet + }] + }; + } + async action(threads, name, user, query) { + const shortcuts = { + 'mark-as-unread': { + 'tact': 'ur', + 'nvp_tbu_go': 'Go' + }, + 'mark-as-read': { + 'tact': 'rd', + 'nvp_tbu_go': 'Go' + }, + 'archive': { + 'tact': 'arch', + 'nvp_tbu_go': 'Go' + }, + 'delete': { + 'tact': '', + 'nvp_a_tr': 'Delete' + }, + 'move-to-inbox': { + 'tact': '', + 'nvp_a_ib': 'Move to Inbox' + }, + 'report': { + 'tact': '', + 'nvp_a_sp': 'Report Spam' + }, + 'add-star': { + 'tact': 'st', + 'nvp_tbu_go': 'Go', + 'bact': '' + }, + 'remove-star': { + 'tact': 'xst', + 'nvp_tbu_go': 'Go', + 'bact': '' + } + }; + const command = shortcuts[name]; + const at = await this.at(); + + const body = new URLSearchParams(); + body.append('at', at); + for (const [key, value] of Object.entries(command)) { + body.append(key, value); + } + for (const thread of threads) { + body.append('t', thread.id); + } + body.append('bact', ''); + await this.get(this.base.split('?')['0'] + '?&s=a', { + method: 'POST', + body + }, true); + await this.update(); + } + async modify({message, addLabelIds = [], removeLabelIds = []}) { + const at = await this.at(); + const body = new URLSearchParams(); + body.append('redir', '?&'); + body.append('at', at); + for (const s of addLabelIds) { + body.append('tact', 'ac_' + s); + } + for (const s of removeLabelIds) { + body.append('tact', 'rc_' + s); + } + body.append('nvp_tbu_go', 'Go'); + body.append('t', message.id); + body.append('bact', ''); + await this.get(this.base.split('?')['0'] + '?&s=a', { + method: 'POST', + body + }, true); + await this.update(); + } + async attachment(message, part) { + return core.download({ + filename: part.filename || 'unknown', + url: part.href + }); + } +} diff --git a/v3.dev/manifest.json b/v3.dev/manifest.json new file mode 100644 index 00000000..ac77f7fd --- /dev/null +++ b/v3.dev/manifest.json @@ -0,0 +1,57 @@ +{ + "manifest_version": 2, + "version": "2.1.0", + "name": "Gmail™ Notifier (Developer Edition)", + "description": "__MSG_description__", + "default_locale": "en", + "homepage_url": "https://webextension.org/listing/gmail-notifier.html?from=dev", + "permissions": [ + "notifications", + "storage", + "alarms", + "identity", + "idle", + "https://mail.google.com/", + "https://accounts.google.com/", + "contextMenus" + ], + "optional_permissions": [ + "nativeMessaging", + "downloads" + ], + "icons": { + "16": "data/icons/colors/red/16.png", + "32": "data/icons/colors/red/32.png", + "48": "data/icons/colors/red/48.png", + "64": "data/icons/colors/red/64.png", + "128": "data/icons/colors/red/128.png", + "256": "data/icons/colors/red/256.png", + "512": "data/icons/colors/red/512.png" + }, + "browser_action": {}, + "background": { + "persistent": false, + "scripts": [ + "core.js", + "accounts.js", + "configs.js", + "utils/sax.js", + "utils/query.js", + "engines/rss/core.js", + "engines/api/core.js", + "engines/native/core.js", + "worker.js", + "badge.js" + ] + }, + "content_scripts": [{ + "matches": ["https://mail.google.com/mail/u/*"], + "js": ["data/inject/watch.js"], + "run_at": "document_start" + }], + "options_ui": { + "page": "data/options/index.html", + "chrome_style": false, + "open_in_tab": true + } +} diff --git a/v3.dev/plugins.js b/v3.dev/plugins.js new file mode 100644 index 00000000..e69de29b diff --git a/v3.dev/utils/query.js b/v3.dev/utils/query.js new file mode 100644 index 00000000..1f9cb2cb --- /dev/null +++ b/v3.dev/utils/query.js @@ -0,0 +1,83 @@ +/* global sax */ + +const query = (code, query, stop = true) => { + return new Promise((resolve, reject) => { + const results = []; + let tree; + + const validate = () => { + if ((query.name ? query.name === tree.name : true) && (query.match ? query.match(tree) : true)) { + results.push(tree); + if (stop) { + resolve(tree); + throw Error('done'); + } + } + }; + + class Node { + constructor(name, attributes) { + this.name = name; + this.attributes = attributes; + this.children = []; + } + closest(name) { + let p = this.parent; + while (p && p.name !== name) { + p = p.parent; + } + return p; + } + child(query, reverse = false, stop = true) { + const matches = []; + const once = node => { + if (node.children) { + for (const n of (reverse ? [...node.children].reverse() : node.children)) { + if ((query.name ? query.name === n.name : true) && (query.match ? query.match(n) : true)) { + return n; + } + const r = once(n); + if (r && stop) { + return r; + } + else if (r) { + matches.push(r); + } + } + } + }; + const r = once(this); + return stop ? r : matches; + } + } + + const parser = sax.parser(false); + parser.onopentag = function(node) { + const child = new Node(node.name, node.attributes); + + if (!tree) { + tree = child; + } + else { + child.parent = tree; + tree.children.push(child); + tree = child; + } + }; + + parser.onclosetag = function(name) { + validate(); + if (name === tree.name) { + if (tree.parent) { + tree = tree.parent; + } + } + }; + parser.ontext = text => tree.text = text; + parser.onend = () => { + resolve(results); + }; + parser.onerror = e => reject(e); + parser.write(code).end(); + }); +}; diff --git a/v3.dev/utils/sax.js b/v3.dev/utils/sax.js new file mode 100644 index 00000000..795d607e --- /dev/null +++ b/v3.dev/utils/sax.js @@ -0,0 +1,1565 @@ +;(function (sax) { // wrapper for non-node envs + sax.parser = function (strict, opt) { return new SAXParser(strict, opt) } + sax.SAXParser = SAXParser + sax.SAXStream = SAXStream + sax.createStream = createStream + + // When we pass the MAX_BUFFER_LENGTH position, start checking for buffer overruns. + // When we check, schedule the next check for MAX_BUFFER_LENGTH - (max(buffer lengths)), + // since that's the earliest that a buffer overrun could occur. This way, checks are + // as rare as required, but as often as necessary to ensure never crossing this bound. + // Furthermore, buffers are only tested at most once per write(), so passing a very + // large string into write() might have undesirable effects, but this is manageable by + // the caller, so it is assumed to be safe. Thus, a call to write() may, in the extreme + // edge case, result in creating at most one complete copy of the string passed in. + // Set to Infinity to have unlimited buffers. + sax.MAX_BUFFER_LENGTH = 64 * 1024 + + var buffers = [ + 'comment', 'sgmlDecl', 'textNode', 'tagName', 'doctype', + 'procInstName', 'procInstBody', 'entity', 'attribName', + 'attribValue', 'cdata', 'script' + ] + + sax.EVENTS = [ + 'text', + 'processinginstruction', + 'sgmldeclaration', + 'doctype', + 'comment', + 'opentagstart', + 'attribute', + 'opentag', + 'closetag', + 'opencdata', + 'cdata', + 'closecdata', + 'error', + 'end', + 'ready', + 'script', + 'opennamespace', + 'closenamespace' + ] + + function SAXParser (strict, opt) { + if (!(this instanceof SAXParser)) { + return new SAXParser(strict, opt) + } + + var parser = this + clearBuffers(parser) + parser.q = parser.c = '' + parser.bufferCheckPosition = sax.MAX_BUFFER_LENGTH + parser.opt = opt || {} + parser.opt.lowercase = parser.opt.lowercase || parser.opt.lowercasetags + parser.looseCase = parser.opt.lowercase ? 'toLowerCase' : 'toUpperCase' + parser.tags = [] + parser.closed = parser.closedRoot = parser.sawRoot = false + parser.tag = parser.error = null + parser.strict = !!strict + parser.noscript = !!(strict || parser.opt.noscript) + parser.state = S.BEGIN + parser.strictEntities = parser.opt.strictEntities + parser.ENTITIES = parser.strictEntities ? Object.create(sax.XML_ENTITIES) : Object.create(sax.ENTITIES) + parser.attribList = [] + + // namespaces form a prototype chain. + // it always points at the current tag, + // which protos to its parent tag. + if (parser.opt.xmlns) { + parser.ns = Object.create(rootNS) + } + + // mostly just for error reporting + parser.trackPosition = parser.opt.position !== false + if (parser.trackPosition) { + parser.position = parser.line = parser.column = 0 + } + emit(parser, 'onready') + } + + if (!Object.create) { + Object.create = function (o) { + function F () {} + F.prototype = o + var newf = new F() + return newf + } + } + + if (!Object.keys) { + Object.keys = function (o) { + var a = [] + for (var i in o) if (o.hasOwnProperty(i)) a.push(i) + return a + } + } + + function checkBufferLength (parser) { + var maxAllowed = Math.max(sax.MAX_BUFFER_LENGTH, 10) + var maxActual = 0 + for (var i = 0, l = buffers.length; i < l; i++) { + var len = parser[buffers[i]].length + if (len > maxAllowed) { + // Text/cdata nodes can get big, and since they're buffered, + // we can get here under normal conditions. + // Avoid issues by emitting the text node now, + // so at least it won't get any bigger. + switch (buffers[i]) { + case 'textNode': + closeText(parser) + break + + case 'cdata': + emitNode(parser, 'oncdata', parser.cdata) + parser.cdata = '' + break + + case 'script': + emitNode(parser, 'onscript', parser.script) + parser.script = '' + break + + default: + error(parser, 'Max buffer length exceeded: ' + buffers[i]) + } + } + maxActual = Math.max(maxActual, len) + } + // schedule the next check for the earliest possible buffer overrun. + var m = sax.MAX_BUFFER_LENGTH - maxActual + parser.bufferCheckPosition = m + parser.position + } + + function clearBuffers (parser) { + for (var i = 0, l = buffers.length; i < l; i++) { + parser[buffers[i]] = '' + } + } + + function flushBuffers (parser) { + closeText(parser) + if (parser.cdata !== '') { + emitNode(parser, 'oncdata', parser.cdata) + parser.cdata = '' + } + if (parser.script !== '') { + emitNode(parser, 'onscript', parser.script) + parser.script = '' + } + } + + SAXParser.prototype = { + end: function () { end(this) }, + write: write, + resume: function () { this.error = null; return this }, + close: function () { return this.write(null) }, + flush: function () { flushBuffers(this) } + } + + var Stream + try { + Stream = require('stream').Stream + } catch (ex) { + Stream = function () {} + } + + var streamWraps = sax.EVENTS.filter(function (ev) { + return ev !== 'error' && ev !== 'end' + }) + + function createStream (strict, opt) { + return new SAXStream(strict, opt) + } + + function SAXStream (strict, opt) { + if (!(this instanceof SAXStream)) { + return new SAXStream(strict, opt) + } + + Stream.apply(this) + + this._parser = new SAXParser(strict, opt) + this.writable = true + this.readable = true + + var me = this + + this._parser.onend = function () { + me.emit('end') + } + + this._parser.onerror = function (er) { + me.emit('error', er) + + // if didn't throw, then means error was handled. + // go ahead and clear error, so we can write again. + me._parser.error = null + } + + this._decoder = null + + streamWraps.forEach(function (ev) { + Object.defineProperty(me, 'on' + ev, { + get: function () { + return me._parser['on' + ev] + }, + set: function (h) { + if (!h) { + me.removeAllListeners(ev) + me._parser['on' + ev] = h + return h + } + me.on(ev, h) + }, + enumerable: true, + configurable: false + }) + }) + } + + SAXStream.prototype = Object.create(Stream.prototype, { + constructor: { + value: SAXStream + } + }) + + SAXStream.prototype.write = function (data) { + if (typeof Buffer === 'function' && + typeof Buffer.isBuffer === 'function' && + Buffer.isBuffer(data)) { + if (!this._decoder) { + var SD = require('string_decoder').StringDecoder + this._decoder = new SD('utf8') + } + data = this._decoder.write(data) + } + + this._parser.write(data.toString()) + this.emit('data', data) + return true + } + + SAXStream.prototype.end = function (chunk) { + if (chunk && chunk.length) { + this.write(chunk) + } + this._parser.end() + return true + } + + SAXStream.prototype.on = function (ev, handler) { + var me = this + if (!me._parser['on' + ev] && streamWraps.indexOf(ev) !== -1) { + me._parser['on' + ev] = function () { + var args = arguments.length === 1 ? [arguments[0]] : Array.apply(null, arguments) + args.splice(0, 0, ev) + me.emit.apply(me, args) + } + } + + return Stream.prototype.on.call(me, ev, handler) + } + + // this really needs to be replaced with character classes. + // XML allows all manner of ridiculous numbers and digits. + var CDATA = '[CDATA[' + var DOCTYPE = 'DOCTYPE' + var XML_NAMESPACE = 'http://www.w3.org/XML/1998/namespace' + var XMLNS_NAMESPACE = 'http://www.w3.org/2000/xmlns/' + var rootNS = { xml: XML_NAMESPACE, xmlns: XMLNS_NAMESPACE } + + // http://www.w3.org/TR/REC-xml/#NT-NameStartChar + // This implementation works on strings, a single character at a time + // as such, it cannot ever support astral-plane characters (10000-EFFFF) + // without a significant breaking change to either this parser, or the + // JavaScript language. Implementation of an emoji-capable xml parser + // is left as an exercise for the reader. + var nameStart = /[:_A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]/ + + var nameBody = /[:_A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\u00B7\u0300-\u036F\u203F-\u2040.\d-]/ + + var entityStart = /[#:_A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]/ + var entityBody = /[#:_A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\u00B7\u0300-\u036F\u203F-\u2040.\d-]/ + + function isWhitespace (c) { + return c === ' ' || c === '\n' || c === '\r' || c === '\t' + } + + function isQuote (c) { + return c === '"' || c === '\'' + } + + function isAttribEnd (c) { + return c === '>' || isWhitespace(c) + } + + function isMatch (regex, c) { + return regex.test(c) + } + + function notMatch (regex, c) { + return !isMatch(regex, c) + } + + var S = 0 + sax.STATE = { + BEGIN: S++, // leading byte order mark or whitespace + BEGIN_WHITESPACE: S++, // leading whitespace + TEXT: S++, // general stuff + TEXT_ENTITY: S++, // & and such. + OPEN_WAKA: S++, // < + SGML_DECL: S++, // + SCRIPT: S++, //