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 a91d5946..00000000 --- a/.gitignore +++ /dev/null @@ -1,5 +0,0 @@ -addon-sdk* -node_modules/ -test/ -.DS_Store -Thumbs.db \ No newline at end of file diff --git a/README.md b/README.md index e17ae967..9ef189d6 100644 --- a/README.md +++ b/README.md @@ -1,39 +1,41 @@ -##Gmail Notifier multi-browser extension(ignotifier) -### Description -[Gmail Notifier](http://add0n.com/gmail-notifier.html) is a multi-account notifier for Google mail (without storing passwords locally) +## [Gmail Notifier](https://webextension.org/listing/gmail-notifier.html) browser extension (ignotifier) -###General information -To compile ignotifier project you need to have these softwares and libraries available: +### Description +[Gmail Notifier](https://webextension.org/listing/gmail-notifier.html) is a multi-account notifier for Google mail (without storing passwords locally) - * [python](http://www.python.org/getit/) - * [nodejs](http://nodejs.org/) - * [Mozilla addon-sdk](https://addons.mozilla.org/en-US/developers/builder) +### YouTube Preview +[![YouTube Preview](https://img.youtube.com/vi/5Z2huN_GNkA/0.jpg)](https://www.youtube.com/watch?v=5Z2huN_GNkA) +### Listings (v3) -> By default, the addon-sdk folder is assumed to be one directory above the project. This can be modified using the ``--sdk`` parameter. + * [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) -###Folders description -* compile: nodejs auto-compiler -* preview: screenshots -* src: ignotifier source code -* template: bootstrap folder +### Listings (v2) -###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 ``node compile/install.js`` to run ignotifier in a new Firefox profile - To make the xpi run ``node compile/install.js --xpi`` - For more options use ``node compile/install.js --help`` + * [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 +### How to translate ignotifier * To translate ignotifier into your language head to [transifex.com](https://www.transifex.com/projects/p/gmail-notifier-addon) page. -* After the translation is ready, insert the translated file in `/src.safariextension/_locales` folder -* For Firefox to recognize the translation, you need to run the following commend in the root directory +* After the translation is ready, insert the translated file in `/src/_locales` directory +* For Firefox to recognize the translation, you will need to run the following commend in the root directory `node compile/convert.js` * Now compile the project as described above to have the localized version of ignotifier. -###How to try the precompiled latest version +### How to try the precompiled latest version on Firefox 1. Select the right branch -2. Browse the src directory +2. Browse the `builds/packed` directory 3. Download the raw *.xpi file -4. Drag and drop it into Firefox +4. Open a browser tab for `about:debugging` and turn on the developer mode +5. Point the browse button to the download XPI + +### How to try the precompiled latest version on Chrome +1. Select the right branch +2. Browse the `builds/packed` directory +3. Download the *.zip file and extract it somewhere +4. Open a browser tab for `chrome://extensions` and turn on the developer mode +5. Point the browse button to the root directory diff --git a/builds/packed/chrome.zip b/builds/packed/chrome.zip deleted file mode 100644 index b05fe552..00000000 Binary files a/builds/packed/chrome.zip and /dev/null differ diff --git a/builds/packed/firefox.xpi b/builds/packed/firefox.xpi deleted file mode 100644 index ff7cdd04..00000000 Binary files a/builds/packed/firefox.xpi and /dev/null differ diff --git a/builds/packed/install.rdf b/builds/packed/install.rdf deleted file mode 100644 index dc812c86..00000000 --- a/builds/packed/install.rdf +++ /dev/null @@ -1,27 +0,0 @@ - - - jid0-GjwrPchS3Ugt7xydvqVK4DQk8Ls@jetpack - 0.6.0 - 2 - true - false - - chrome://ignotifier/content/options-opener.xul - - - - - {ec8030f7-c20a-464f-9b0e-13a3a9e97384} - 29.0 - 40.0 - - - - - Gmail Notifier (restartless) - Multiple label and account notifier for Google Mail (Gmail) - InBasic - CaTz - ecaron - - diff --git a/builds/unpacked/firefox/chrome.manifest b/builds/unpacked/firefox/chrome.manifest deleted file mode 100644 index 876e29ad..00000000 --- a/builds/unpacked/firefox/chrome.manifest +++ /dev/null @@ -1 +0,0 @@ -content ignotifier data/firefox/chrome/content/ diff --git a/builds/unpacked/firefox/data/firefox/overlay.css b/builds/unpacked/firefox/data/firefox/overlay.css deleted file mode 100644 index e595fb31..00000000 --- a/builds/unpacked/firefox/data/firefox/overlay.css +++ /dev/null @@ -1,43 +0,0 @@ -toolbarpaletteitem[place="palette"] > __id__:after, -__id__[cui-areatype="menu-panel"]:after { - display: none; -} -__id__:after { - position: relative; - display: none; - font-family: __font_family__; - font-size: __font_size__; - font-weight: 600; - content: attr(value); - background-color: __bg_color__; - color: __color__; - text-align: center; - overflow: hidden; - border-radius: 2px; - height: __height__; - line-height: __line_height__; -} -__id__[cui-areatype="toolbar"][length="1"]:after, -__id__[cui-areatype="toolbar"][length="2"]:after, -__id__[cui-areatype="toolbar"][length="3"]:after, -__id__[cui-areatype="toolbar"][length="4"]:after { - display: table; -} -__id__[length="1"]:after { - width: __width_1__; - margin: __margin_1__; -} -__id__[length="2"]:after { - width: __width_2__; - margin: __margin_2__; -} -__id__[length="3"]:after { - width: __width_3__; - margin: __margin_3__; -} -__id__[length="4"]:after { - width: __width_4__; - margin: __margin_4__; -} - -__extra__ \ No newline at end of file diff --git a/builds/unpacked/firefox/lib/utils/gmail.js b/builds/unpacked/firefox/lib/utils/gmail.js deleted file mode 100644 index 5b4ba572..00000000 --- a/builds/unpacked/firefox/lib/utils/gmail.js +++ /dev/null @@ -1,128 +0,0 @@ -var isFirefox = typeof require !== 'undefined'; -if (isFirefox) { - app = require('../wrapper/firefox/app'); - config = require('../config'); - render = require('./render'); - gmail = exports; -} -else { - var gmail = {}; -} - -gmail.body = (function () { - var iks = {}, contents = {}; - - function getIK (url) { - if (iks[url]) { - return app.Promise.resolve(iks[url]); - } - return new app.get(url).then(function (req) { - var tmp = /var GLOBALS\=\[(?:([^\,]*)\,){10}/.exec(req.responseText || ""); - var ik = tmp && tmp.length > 1 ? tmp[1].replace(/[\"\']/g, "") : null; - if (ik) { - iks[url] = ik; - return ik; - } - else { - return Error("gmail.js -> body -> getIK -> Error at resolving user's static ID. Please switch back to the summary mode."); - } - }); - } - - return function (link) { - link = link.replace("http://", "https://"); - if (contents[link]) { - return app.Promise.resolve(contents[link]); - } - - var url = /[^\?]*/.exec(link)[0] + "/"; - var thread = /message\_id\=([^\&]*)/.exec(link); - if (!thread.length) { - return app.Promise.reject(Error('gmail.js -> body -> Error at resolving thread. Please switch back to the summary mode.')); - } - return getIK(url).then(function (ik) { - return new app.get(url + "?ui=2&ik=" + ik + "&view=pt&dsqt=1&search=all&msg=" + thread[1]).then(function (req) { - var body = render[config.popup.display ? "getHTMLText" : "getPlainText"](req, url, link); - contents[link] = body; - return body; - }); - }); - } -})(); - -/** - * Send archive, mark as read, mark as unread, and trash commands to Gmail server - * @param {String} link, xml.link address - * @param {String} cmd: rd, ur, rc_%5Ei, tr, sp - */ -gmail.action = (function () { - function getAt_2 (url) { - return new app.get(url + "h/" + Math.ceil(1000000 * Math.random())).then (function (req) { - if (!req) { - return Error("gmail.js -> action -> getAt_2 -> server response is empty."); - } - if(req.status == 200) { - var tmp = /at\=([^\"\&]*)/.exec(req.responseText); - return tmp && tmp.length > 1 ? tmp[1] : null; - } - else { - return Error("gmail.js -> action -> getAt_2 -> got status of " + req.status); - } - }); - } - function getAt (url) { - return new app.get(url).then(function (req) { - if (!req) { - return Error("gmail.js -> action -> getAt -> server response is empty."); - } - if(req.status == 200) { - var tmp = /GM_ACTION_TOKEN\=\"([^\"]*)\"/.exec(req.responseText); - if (tmp && tmp.length) { - return tmp[1]; - } - else { - return getAt_2(url); - } - } - else { - return Error("gmail.js -> action -> getAt -> got status of " + req.status); - } - }); - } - - function sendCmd (url, at, threads, cmd) { - if (cmd == "rc_%5Ei" && config.email.doReadOnArchive) { - sendCmd(url, at, threads, "rd"); - } - var u = url + "?at=" + at + "&act=" + cmd.replace("rd-all", "rd"); - u += "&t=" + threads.join("&t="); - - return new app.get(u).then(function (req) { - if (!req) { - return Error("gmail.js -> action -> sendCmd -> server response is empty."); - } - if (req.status === 200) { - return true; - } - return Error("gmail.js -> action -> sendCmd -> got status of " + req.status); - }); - } - - return function (links, cmd) { - links = typeof(links) === "string" ? [links] : links; - var url = /[^\?]*/.exec(links[0])[0] + "/"; - return getAt(url).then(function (at) { - var threads = []; - links.forEach(function (link) { - var thread = /message\_id\=([^\&]*)/.exec(link); - if (thread && thread.length) { - threads.push(thread[1]); - } - }); - if (threads.length) { - return sendCmd(url, at, threads, cmd); - } - return app.Promise.reject(Error("gmail.js -> action -> Error at resolving thread.")); - }); - } -})(); diff --git a/builds/unpacked/firefox/lib/wrapper/firefox/app.js b/builds/unpacked/firefox/lib/wrapper/firefox/app.js deleted file mode 100644 index 1b8f7abe..00000000 --- a/builds/unpacked/firefox/lib/wrapper/firefox/app.js +++ /dev/null @@ -1,502 +0,0 @@ -var {Cc, Ci, Cu} = require('chrome'), - {on, off, once, emit} = require('sdk/event/core'), - buttons = require("sdk/ui/button/action"), - tabs = require("sdk/tabs"), - self = require("sdk/self"), - loader = require('@loader/options'), - array = require('sdk/util/array'), - data = self.data, - panel = require("sdk/panel"), - l10n = require("sdk/l10n").get, - timer = require("sdk/timers"), - pageWorker = require("sdk/page-worker"), - pageMod = require("sdk/page-mod"), - sp = require("sdk/simple-prefs"), - unload = require("sdk/system/unload"), - events = require("sdk/system/events"), - tabsUtils = require("sdk/tabs/utils"), - prefs = sp.prefs, - config = require("../../config"), - tbExtra = require("./tbExtra"), - windows = { - utils: require('sdk/window/utils'), - get active () { // Chrome window - return this.utils.getMostRecentBrowserWindow(); - }, - get SDKWindow () { // SDK window - return require("sdk/windows").browserWindows.activeWindow - }, - } - -var exportsHelper = {}; - -Cu.import("resource://gre/modules/Promise.jsm"); -Cu.import("resource://gre/modules/XPCOMUtils.jsm"); - -// Event Emitter -exports.on = on.bind(null, exports); -exports.once = once.bind(null, exports); -exports.emit = emit.bind(null, exports); -exports.removeListener = function removeListener (type, listener) { - off(exports, type, listener); -}; - -/* popup */ -var popup = panel.Panel({ - contentURL: data.url("./popup/index.html"), - contentScriptFile: [ - data.url("./popup/firefox/firefox.js"), - data.url("./popup/index.js") - ], - contentScriptOptions: { - base: loader.prefixURI, - locales: { - 'popup_msg_1': l10n('popup_msg_1'), - 'popup_msg_2': l10n('popup_msg_2'), - 'popup_msg_3': l10n('popup_msg_3'), - 'popup_msg_4': l10n('popup_msg_4'), - 'popup_msg_5': l10n('popup_msg_5'), - 'popup_msg_6': l10n('popup_msg_6'), - 'popup_msg_7': l10n('popup_msg_7'), - 'popup_msg_8': l10n('popup_msg_8'), - 'popup_msg_9': l10n('popup_msg_9'), - 'popup_msg_10': l10n('popup_msg_10'), - 'popup_msg_11': l10n('popup_msg_11'), - 'popup_msg_12': l10n('popup_msg_12'), - 'popup_msg_13': l10n('popup_msg_13'), - 'popup_msg_14': l10n('popup_msg_14'), - 'popup_msg_15': l10n('popup_msg_15'), - 'popup_msg_16': l10n('popup_msg_16'), - 'popup_msg_17': l10n('popup_msg_17'), - 'popup_msg_18': l10n('popup_msg_18'), - 'popup_msg_19': l10n('popup_msg_19'), - 'popup_msg_20': l10n('popup_msg_20'), - 'popup_msg_21': l10n('popup_msg_21') - } - } -}); -popup.on('show', () => popup.port.emit('show')); - -/* button */ -var button = buttons.ActionButton({ - id: self.name, - label: l10n("toolbar_label"), - icon: { - "16": "./icons/blue/16.png", - "32": "./icons/blue/32.png" - }, - onClick: function() { - if (button.onClick) { - button.onClick(); - } - } -}); -tbExtra.setButton(button); - -/* option */ -var options = (function () { - var workers = [], options_arr = []; - pageMod.PageMod({ - include: data.url("options/index.html"), - contentScriptFile: [ - data.url("options/firefox/firefox.js"), - data.url("options/index.js") - ], - contentScriptWhen: "start", - contentScriptOptions: { - base: loader.prefixURI - }, - onAttach: function(worker) { - array.add(workers, worker); - worker.on('pageshow', function() { array.add(workers, this); }); - worker.on('pagehide', function() { array.remove(workers, this); }); - worker.on('detach', function() { array.remove(workers, this); }); - // PageMod has no access to mozFullPath of input. - worker.port.on("get-sound-fullpath", function () { - var browserWindow = Cc["@mozilla.org/appshell/window-mediator;1"]. - getService(Ci.nsIWindowMediator). - getMostRecentWindow("navigator:browser"); - var file = browserWindow.content.document.querySelector("input[type=file]").files[0].mozFullPath; - config.notification.sound.custom.file = file; - }); - options_arr.forEach(function (arr) { - worker.port.on(arr[0], arr[1]); - }); - } - }); - return { - send: function (id, data) { - workers.forEach(function (worker) { - worker.port.emit(id, data); - }); - }, - receive: (id, callback) => options_arr.push([id, callback]) - } -})(); - -function get (url, headers, data, timeout) { - headers = headers || {}; - - var d = new Promise.defer(); - var req = Cc["@mozilla.org/xmlextras/xmlhttprequest;1"] - .createInstance(Ci.nsIXMLHttpRequest); - req.mozBackgroundRequest = true; //No authentication - req.timeout = timeout; - req.open('GET', url, true); - for (var id in headers) { - req.setRequestHeader(id, headers[id]); - } - req.onreadystatechange = function () { - if (req.readyState == 4) { - d.resolve(req); - } - }; - req.channel - .QueryInterface(Ci.nsIHttpChannelInternal) - .forceAllowThirdPartyCookie = true; - if (data) { - var arr = []; - for(e in data) { - arr.push(e + "=" + data[e]); - } - data = arr.join("&"); - } - req.send(data ? data : ""); - return d.promise; -} - -/* exports */ -exports.Promise = Promise; - -exports.button = { - onCommand: function (c) { - button.onClick = c; - }, - onContext: function (c) { - tbExtra.onContext(function (e, menupopup, menuitem, menuseparator, menu) { - var types = { - "menupopup": menupopup, - "menuitem": menuitem, - "menuseparator": menuseparator, - "menu": menu - } - // remove old items - while (menupopup.firstChild) { - menupopup.removeChild(menupopup.firstChild); - } - var items = c(); - function appendChilds (root, arr) { - arr.forEach(function (e) { - var element = types[e.type].cloneNode(false); - ["label", "tooltip", "value", "link"].filter(function (i) { - return e[i]; - }).forEach(function (i) { - return element.setAttribute(i, e[i]); - }); - if (e.command) { - element.addEventListener("command", function (event) { - event.preventDefault(); - event.stopPropagation(); - e.command(event); - }, false); - } - root.appendChild (element); - if (e.childs && e.childs.length) appendChilds(element, e.childs); - }); - } - appendChilds(menupopup, items); - }); - }, - onClick: function (c) { - tbExtra.onClick(c); - }, - set label (val) { - button.label = config.ui.tooltip ? l10n('toolbar_label') : val; - }, - set badge (val) { - if (config.ui.badge) { - tbExtra.setBadge(val); - } - }, - set color (val) { - button.icon = { - "16": "./icons/" + val + "/16.png", - "32": "./icons/" + val + "/32.png" - } - } -} - -exports.popup = { - show: function () { - popup.show({ - width: config.popup.width, - height: config.popup.height, - position: button - }); - }, - hide: function () { - popup.hide(); - }, - attach: function () {}, - detach: () => popup.hide(), - send: function (id, data) { - if (id === "resize") { - popup.resize(data.width, data.height); - } - if (popup.isShowing) { - popup.port.emit(id, data); - } - }, - receive: (id, callback) => popup.port.on(id, callback) -} - -exports.timer = timer; - -exports.get = get; - -exports.parser = function () { - return Cc["@mozilla.org/xmlextras/domparser;1"] - .createInstance(Ci.nsIDOMParser); -} - -exports.l10n = (id) => l10n(id); - -exports.windows = (function () { - function toWindow (win) { - return { - obj: win, - focus: function () { - (win.focus || win.activate)(); - } - } - } - function toTab (tab) { - return { - get url () { - return tab.url - }, - set url (val) { - if (tab.url == val) { - tab.reload(); - } - else { - tab.url = val; - } - }, - activate: () => tab.activate(), - window: () => Promise.resolve(toWindow(toWindow(tab.window))), - get active () { - return tab == tabs.activeTab; - }, - close: function () { - tab.close(); - } - } - } - return { - active: function () { - return Promise.resolve(toWindow(windows.active)); - }, - open: function (url, inBackground) { - var popup = windows.active.open(url); - if (inBackground) { - popup.blur(); - window.focus(); - } - }, - tabs: { - list: function (currentWindow) { - var tbs = currentWindow ? windows.SDKWindow.tabs : tabs; - var temp = []; - for each (var tab in tbs) { - temp.push(tab); - } - return Promise.resolve(temp.map(toTab)); - }, - active: function () { - return Promise.resolve(toTab(tabs.activeTab)); - }, - open: function (url, inBackground) { - var gBrowser = windows.active.gBrowser; - // use old blank tabs? - (function () { - if (config.tabs.open.relatedToCurrent || !config.tabs.open.useBlankTabs) { - return Promise.resolve(null); - } - return exports.windows.tabs.list(true).then(function (tabs) { - return tabs.reduce(function (p, c) { - return p || (c.url === "about:newtab" || c.url === "about:blank" ? c : null); - }, null); - }); - })().then(function (t) { - if (t) { - t.url = url; - if (!inBackground) { - t.activate(); - } - } - else { - t = gBrowser.addTab(url, { - relatedToCurrent: config.tabs.open.relatedToCurrent - }); - if (!inBackground) { - gBrowser.selectedTab = t; - } - } - }); - } - } - } -})(); - -exports.notify = (function () { // https://github.com/fwenzel/copy-shorturl/blob/master/lib/simple-notify.js - var alertServ = Cc["@mozilla.org/alerts-service;1"]. - getService(Ci.nsIAlertsService); - - return function (text, title , callback) { - title = title || l10n("gmail"); - if (config.notification.silent) return; - - try { - alertServ.showAlertNotification( - data.url("icons/notification/32.png"), - title, - text, - callback ? true : false, - "", - function (subject, topic, data) { - if (topic == "alertclickcallback") { - timer.setTimeout(callback, 100); - } - }, ""); - } - catch(e) { - let browser = windows.active.gBrowser, - notificationBox = browser.getNotificationBox(); - - notification = notificationBox.appendNotification( - text, - 'jetpack-notification-box', - data.url("icons/notification/16.png"), - notificationBox.PRIORITY_INFO_MEDIUM, - [] - ); - timer.setTimeout(function() { - notification.close(); - }, config.notification.time * 1000); - } - } -})(); - -XPCOMUtils.defineLazyGetter(exportsHelper, "play", function () { - Cu.import("resource://gre/modules/FileUtils.jsm"); - Cu.import("resource://gre/modules/Services.jsm"); - - return { - now: function () { - if (config.notification.silent) return; - - var path = "../../data/sounds/" + config.notification.sound.original; - if (config.notification.sound.type === 4 && config.notification.sound.custom.file) { - var file = new FileUtils.File(config.notification.sound.custom.file); - if (file.exists()) { - path = Services.io.newFileURI(file).spec; - let res = Services.io.getProtocolHandler('resource').QueryInterface(Ci.nsIResProtocolHandler); - let name = 'igsound'; - res.setSubstitution(name, Services.io.newURI(path, null, null)); - path = 'resource://' + name; - } - } - var worker = pageWorker.Page({ - contentScript: - "var audio = new Audio('" + path + "');" + - "audio.addEventListener('ended', function () {self.postMessage()});" + - "audio.volume = " + (config.notification.sound.volume / 100) + ";" + - "audio.play();", - contentURL: data.url("firefox/sound.html"), - onMessage: function() { - worker.destroy(); - } - }); - }, - reset: function () {} - } -}); -Object.defineProperty(exports, 'play', { - get: function () { - return exportsHelper.play; - } -}); - -XPCOMUtils.defineLazyGetter(exportsHelper, "clipboard", function () { - var clipboardHelper = Cc["@mozilla.org/widget/clipboardhelper;1"] - .getService(Ci.nsIClipboardHelper); - return function (str) { - clipboardHelper.copyString(str); - } -}); -Object.defineProperty(exports, 'clipboard', { - get: function () { - return exportsHelper.clipboard; - } -}); - -exports.version = function () { - return self.version; -} - -exports.startup = function (c) { - if (self.loadReason == "startup" || self.loadReason == "install") { - c(); - } -} - -exports.unload = function (c) { - unload.when(c); -} - -exports.options = options; - -exports.storage = { - read: function (id) { - return (prefs[id] || prefs[id] + "" === "false" || !isNaN(prefs[id])) ? (prefs[id] + "") : null; - }, - write: function (id, data) { - data = data + ""; - if (data === "true" || data === "false") { - prefs[id] = data === "true" ? true : false; - } - else if (parseInt(data) + '' === data) { - prefs[id] = parseInt(data); - } - else { - prefs[id] = data + ""; - } - } -} - -exports.manifest = { - url: loader.prefixURI -} - -exports.tray = require('./tray/wrapper').tray; - -/* updating badge when action is posted */ -function listener(event) { - var channel = event.subject.QueryInterface(Ci.nsIHttpChannel); - var url = channel.URI.spec; - if (url.indexOf('https://mail.google.com/mail/u') === -1 || url.indexOf('act=') === -1) { - return; - } - channel = channel.QueryInterface(Ci.nsIHttpChannel); - exports.emit('update'); -} -events.on('http-on-modify-request', listener); - -// connect -exports.connect = function (actions) { - var connect = {}; - Cu.import(data.url('firefox/shared/connect.jsm'), connect); - connect.remote.actions = actions; - Object.freeze(connect); -} diff --git a/builds/unpacked/firefox/lib/wrapper/firefox/tbExtra.js b/builds/unpacked/firefox/lib/wrapper/firefox/tbExtra.js deleted file mode 100644 index d5544797..00000000 --- a/builds/unpacked/firefox/lib/wrapper/firefox/tbExtra.js +++ /dev/null @@ -1,128 +0,0 @@ -var {Cc, Ci, Cu, components} = require('chrome'), - system = require("sdk/system"), - self = require("sdk/self"), - data = self.data, - timer = require("sdk/timers"), - base64 = require("sdk/base64"), - unload = require("sdk/system/unload"), - config = require("../../config"), - userstyles = require("./userstyles"), - is36 = Cc["@mozilla.org/xpcom/version-comparator;1"] - .getService(Ci.nsIVersionComparator) - .compare(system.version, "36.0") >= 0, - id = ('action-button--' + self.id.toLowerCase()+ '-' + self.name) - .replace(/[^a-z0-9_-]/g, ''); - -const NS_XUL = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"; - -var button, badge = 0, onContext, onClick; - -Cu.import("resource:///modules/CustomizableUI.jsm"); - -var listen = { - onWidgetBeforeDOMChange: function(tbb, aNextNode, aContainer, aIsRemoval) { - if (tbb.id !== id) return; - // Set badge - if (badge && !is36) { - timer.setTimeout(exports.setBadge, 500, badge); - } - // Install onContext if it is not installed - if (!tbb.isOnContextInstalled) { - tbb.isOnContextInstalled = true; - - let doc = tbb.ownerDocument.defaultView.document; - let menupopup = doc.createElementNS(NS_XUL, "menupopup"); - let menu = doc.createElementNS(NS_XUL, "menu"); - let menuitem = doc.createElementNS(NS_XUL, "menuitem"); - let menuseparator = doc.createElementNS(NS_XUL, "menuseparator"); - - tbb.addEventListener("contextmenu", function (e) { - if (onContext) { - //Prevent Firefox context menu - e.stopPropagation(); - e.preventDefault(); - onContext(e, menupopup, menuitem, menuseparator, menu); - menupopup.openPopup(tbb , "after_end", 0, 0, false); - } - }, true); - tbb.addEventListener("click", function (e) { - if (onClick) { - onClick(e); - } - }, true); - tbb.appendChild(menupopup); - } - } -} -CustomizableUI.addListener(listen); -unload.when(function () { - CustomizableUI.removeListener(listen); - CustomizableUI.destroyWidget(id); -}); - -exports.setBadge = (function () { - if(is36) { - return function (val) { - badge = val; - if (button) { - button.badge = val ? val : ""; - button.badgeColor = config.ui.backgroundColor; - } - } - } - else { - Cu.import("resource://gre/modules/FileUtils.jsm"); - Cu.import("resource://gre/modules/NetUtil.jsm"); - - NetUtil.asyncFetch(data.url("./firefox/overlay.css"), function(inputStream, status) { - if (!components.isSuccessCode(status)) { - return; - } - var css = NetUtil.readInputStreamToString(inputStream, inputStream.available()); - css = css - .replace(/__extra__/g, config.ui.extra) // need to be first - .replace(/__id__/g, "#" + id) - .replace(/__font_family__/g, config.ui.fontFamily) - .replace(/__font_size__/g, config.ui.fontSize) - .replace(/__height__/g, config.ui.height) - .replace(/__line_height__/g, config.ui.lineHeight) - .replace(/__margin_1__/g, config.ui.margin["1"]) - .replace(/__margin_2__/g, config.ui.margin["2"]) - .replace(/__margin_3__/g, config.ui.margin["3"]) - .replace(/__margin_4__/g, config.ui.margin["4"]) - .replace(/__width_1__/g, config.ui.width["1"]) - .replace(/__width_2__/g, config.ui.width["2"]) - .replace(/__width_3__/g, config.ui.width["3"]) - .replace(/__width_4__/g, config.ui.width["4"]) - .replace(/__bg_color__/g, config.ui.backgroundColor) - .replace(/__color__/g, config.ui.color); - - userstyles.load("data:text/css;base64," + base64.encode(css)); - }); - - return function (value) { - badge = value; - var bb = CustomizableUI.getWidget(id); - if (!bb) return; - if ((value + "").length > 4) { - value = "9999"; - } - bb.instances.forEach(function (i) { - var tbb = i.anchor.ownerDocument.defaultView.document.getElementById(id); - if (!tbb) return; - tbb.setAttribute("value", value ? value : ""); - tbb.setAttribute("length", value ? (value + "").length : 0); - }); - } - } -})(); - -exports.onContext = function (c) { - onContext = c; -}; -exports.onClick = function (c) { - onClick = c; -}; -exports.setButton = function (b) { - button = b; -}; diff --git a/builds/unpacked/firefox/lib/wrapper/firefox/tray/darwin/tray.js b/builds/unpacked/firefox/lib/wrapper/firefox/tray/darwin/tray.js deleted file mode 100644 index 038dbf75..00000000 --- a/builds/unpacked/firefox/lib/wrapper/firefox/tray/darwin/tray.js +++ /dev/null @@ -1,19 +0,0 @@ -var {Cc, Ci} = require('chrome'), - unload = require("sdk/system/unload"), - config = require('../../../../config'); - -var dock = Cc["@mozilla.org/widget/macdocksupport;1"] - .getService(Ci.nsIMacDockSupport); - -exports.set = function (badge, msg) { - if(!config.tray.show) return; - dock.badgeText = badge; -} -exports.remove = function () { - dock.badgeText = ""; -} -exports.callback = function () { } - -unload.when(function () { - exports.remove(); -}); \ No newline at end of file diff --git a/builds/unpacked/firefox/lib/wrapper/firefox/tray/wrapper.js b/builds/unpacked/firefox/lib/wrapper/firefox/tray/wrapper.js deleted file mode 100644 index a247e6e4..00000000 --- a/builds/unpacked/firefox/lib/wrapper/firefox/tray/wrapper.js +++ /dev/null @@ -1,19 +0,0 @@ -var {Cc, Ci, Cu} = require('chrome'), - os = require("sdk/system").platform, - config = require('../../../config'); - -var tray = (function () { - if (os === "winnt") { - return require('./winnt/tray'); - } - if (os === "darwin") { - return require('./darwin/tray'); - } - return { - set: function () {}, - remove: function () {}, - callback: function () {} - }; -})(); - -exports.tray = tray; \ No newline at end of file diff --git a/builds/unpacked/firefox/locale/nl.properties b/builds/unpacked/firefox/locale/nl.properties deleted file mode 100644 index e43d2d32..00000000 --- a/builds/unpacked/firefox/locale/nl.properties +++ /dev/null @@ -1,124 +0,0 @@ -label_9=Voor 5 uur -options_notifications_19=Windows-e-mailgeluid -options_notifications_17=Checker Plus-belgeluid -options_notifications_13=Werkbalkpaneel openen bij klikken op taakbalkmeldingspictogram (alleen op Windows - beta) -options_timings_l7=Niet controleren op nieuwe e-mails bij opstarten voor de duur van (in seconden): -label_4=Voor 5 minuten -options_timings_l3=Herinnering voor alle ongelezen e-mails, elke (in minuten): -options_gmail_1=Hoofdaccount (/mail/u/0/) -options_gmail_10=Meldingen ontvangen voor de volgende labels en accounts: -options_notifications_1=Bureaubladmelding weergeven bij nieuwe e-mails -options_notifications_9=Meldingsgeluid afspelen bij nieuwe e-mails -label_6=Voor 30 minuten -options_misc_8=Alle instellingen naar standaardwaarden herstellen -options_timings_l4=Stel de waarde op nul in voor niet-periodieke herinneringen. -options_tab_6=Gmail-account openen in een nieuw venster -options_notifications_25=Waarschijnlijk werken de standaardmeldingsgeluiden niet goed in Safari. Als dit het geval is moet u een eigen geluidsbestand instellen. -options_toolbar_15=Middelklikken op de werkbalkknop om -options_toolbar_10=Minimale hoogte is 500px. -options_notifications_26=Systeemvakmelding altijd weergeven (wordt alleen ondersteund op Windows) -label_3=Alle meldingen uitschakelen -options_empty=niet opgegeven -options_notifications_3=Deze instellingen werkt mogelijk niet, afhankelijk van het door u gebruikte besturingssysteem. -options_timings=Tijdstippen -options_gmail_5=Vierde account (/mail/u/3) -label_5=Voor 15 minuten -options_misc_9=Rode kleur voor "Geen ongelezen berichten" en grijze kleur voor "Niet verbonden" -options_notifications_27=Er zal een systeemvakmelding worden weergegeven zelfs als er geen ongelezen bericht is. -options_misc_1=Accounts alfabetisch sorteren -tooltip_1=Linksklik: Gmail of het e-mailvoorbeeldpaneel openen -notification=Van: [author_email][break]Titel: [title][break]Samenvatting: [summary] -options_tab=Tabblad openen: -log_into_your_account=Log alstublieft in op uw account -label_10=Meldingen inschakelen -options_notifications_23=Volume van het meldingsgeluid is -options_timings_l2=Minimale tijdsduur is 10 seconden. -options_toolbar_11=Toetsenbordsneltoetsen ondersteunen op het werkbalkpaneel -options_gmail_9=Enkele populaire labels: "postvakIN", "belangrijk", "^slimlabel_persoonlijk", "^slimlabel_nieuwsbrief", "^slimlabel_melding" en "^slimlabel_groep" -options_misc_13=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_misc_6=Geen bureaubladmeldingen weergeven om te waarschuwen dat de Gmail-website al geopend is -options_notifications_4=Meldingopmaak -label_2=Instellingen -options_toolbar_14=Schakel deze optie uit als u platte tekst-opmaak prefereert in volledige-inhoudsmodus. -options_notifications_18=Checker Plus-dinggeluid -options_tab_5=Gmail-account openen op een achtergrondtabblad -label_7=Voor 1 uur -msg_2=Link is gekopieerd naar het klembord. -options_title=Voorkeuren - Gmail™-melder -gmail=Gmail™-melder -options_toolbar_8=Minimale breedte is 500px. -options_notifications_16=Standaardwaarschuwing van Gmail-melder -options_misc_14=Geen exact badgenummer weergeven wanneer het aantal ongelezen e-mails hoger is dan 999 -options_notifications_14=Deze optie is zeer experimenteel en kan mogelijk instabiliteit veroorzaken in Firefox. [Herstart vereist]. -options_gmail_3=Tweede account (/mail/u/1) -options_notifications_11="Windows-taakbalkmelding" of "Mac OS X-dockmelding" weergeven -options_notifications_2=Bureaubladmelding weergeven voor de duur van (in seconden): -log_in_to_your_account=Log alstublieft in op uw Gmail-account -options_notifications_15=Meldingsgeluid is -options_notifications_21=Eigen gekozen meldingsgeluid is -options_toolbar_9=Werkbalkpaneel-hoogte in de volledige-inhoudsweergave is (in pixels): -options_toolbar_1=Gedrag van werkbalkknop -unknown=onbekend -options_notifications_8=Om te afbreking te voorkomen, vul hier een groot getal in. -options_donation=Doe een donatie -msg_3=Geselecteerde tekst is gekopieerd naar het klembord. -options_misc_7=Welkomstpagina weergeven na update -options_gmail=Gmail: -label_1=Verversen -options_notifications_5=Beschikbare variabelen -options_notifications_24=Volumeniveau is een getal tussen de 0 en 100 waar 100 het hoogste volumeniveau is (standaard). -options_notifications_10=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_misc_2=De standaardsortering is sorteren op datum ingelogd. -options_toolbar_2=Altijd e-mail-voorbeeldpaneel openen -popup_settings=Instellingen -options_gmail_4=Derde account (/mail/u/2) -options_toolbar_5=Samenvatting weergeven -options_notifications_12=Taakbalkmeldingen worden momenteel niet ondersteund op Linux-besturingssystemen. -msg_1=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_misc_5=Blauwe kleur voor "Geen ongelezen berichten en grijze kleur voor "Niet verbonden" -options_timings_l8=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]. -tooltip_3=Rechtsklik: Accountselectie -options_notifications=Meldingen: -options_timings_l6=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_notifications_22=Als uw browser geen meldingsgeluid afspeelt, probeer dan om het te converteren naar plat WAV-formaat middels een online converteerapplicatie. -options_tab_1=Alleen op het actieve venster zoeken naar een openstaand Gmail-account -options_timings_l1=Op nieuwe e-mails controleren, elke (in seconden): -options_toolbar_4=Werkbalkpaneel-modus -toolbar_label=Gmail™-melder -options_misc_3=Kleurenpatroon van werkbalk is -options_gmail_12=Scheidt feeds met het kommateken (","). Voorbeeldfeed: https://mail.google.com/mail/u/0/feed/atom/inbox -options_toolbar_12=!: Rapporteren als spam, #:Verplaatsen naar prullenbak, e:Archiveren, Shift + i: Markeren als ongelezen. -options_px=px -options_misc_11=Door deze instelling op nul te zetten ontvangt geen bureaublad- of geluidsmeldingen; u krijgt echter nog wél de indicator op de knop. -options_notifications_20=Eigen gekozen geluid -and=en -options_tab_7=Altijd lege tabbladen gebruiken in plaats een nieuw tabblad te openen wanneer een tabblad is geactiveerd -options_toolbar_3=Gmail-account openen wanneer er slechts één account is ingelogd -options_gmail_7=Zesde account (/mail/u/5) -options_toolbar=Werkbalk: -options_notifications_6=Meldingen afbreken die langer zijn dan -tooltip_2=Middelklik (of Ctrl+Links): Alle accounts verversen -options_tab_3=Nieuw Gmail-account openen op tabblad naast actief tabblad -options_gmail_8=Bericht als gelezen markeren na archiveren -options_toolbar_17=Primair Gmail-account openen -options_notifications_7=tekens voor [title] en [summary]-velden -options_misc_10=Alleen bureaublad- en geluidsmeldingen weergeven wanneer een e-mail binnen is ontvangen in minder dan (in minuten): -label_8=Voor 2 uur -msg_4=Let op: om de melder correct te laten werken moet u ingelogd zijn op uw Google-account. -options_toolbar_6=Volledige inhoud weergeven -options_gmail_11=Aangepaste feeds: -options_tab_2=Niet in andere browservensters zoeken naar openstaande Gmail-accounts. Als Gmail niet is geopend in het actieve venster, wordt een nieuw tabblad geopend. -label_11=Een e-mail opstellen -options_toolbar_7=Breedte van werkbalkpaneel in volledige-inhoudsweergave is (in pixels): -options_timings_l5=Minimale tijdsduur is 5 minuten. -options_misc=Diversen: -options_gmail_2=Labels scheiden d.m.v. "," (komma). -options_misc_4=Grijze kleur voor "Geen ongelezen berichten" en blauwe kleur voor "Niet verbonden" -options_toolbar_13=E-mails opmaken in HTML in volledige-inhoudsmodus -options_toolbar_16=Alle accounts verversen -options_gmail_6=Vijfde account (/mail/u/4) -options_inshort=Labels- en accountsmelder voor Google Mail (Gmail) -options_misc_12=Geen inloggegevens in de tooltiptekst weergeven -options_tab_4=Gmail-account openen op actief tabblad -label_12=Website openen -description=Labels- en accountsmelder voor Google Mail (Gmail) diff --git a/builds/unpacked/firefox/locale/pl.properties b/builds/unpacked/firefox/locale/pl.properties deleted file mode 100644 index 0f081277..00000000 --- a/builds/unpacked/firefox/locale/pl.properties +++ /dev/null @@ -1,125 +0,0 @@ -label_9=Przez 5 godzin -options_notifications_19=Sygnał e-mail Windows -options_notifications_17=Dzwonek Checker Plus -options_notifications_13=Otwórz panel paska narzędzi podczas kliknięcia na ikonkę powiadomień paska zadań (tylko Windows, beta) -options_timings_l7=Nie sprawdzaj nowych wiadomości przy starcie przez (sekundy): -label_4=Przez 5 minut -options_timings_l3=Przypominaj o nieprzeczytanych wiadomościach co (minuty): -options_gmail_1=Konto główne (/mail/u/0/) -options_gmail_10=Otrzymuj powiadomienia dla następujących etykiet oraz kont: -options_notifications_1=Wyświetlaj na pulpicie powiadomienia o nowych wiadomościach -options_notifications_9=Odtwórz dźwięk po otrzymaniu nowych wiadomości -label_6=Przez 30 minut -options_misc_8=Przywróć wszystkie ustawienia do fabrycznych -options_timings_l4=Ustaw wartość na zero, aby nie otrzymywać przypomnień. -options_tab_6=Otwórz konto Gmail w nowym oknie -options_notifications_25=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ń. -options_toolbar_15=Akcja środkowego przycisku myszy na pasku narzędzi: -options_toolbar_10=Minimalna wysokość to 500px. -options_notifications_26=Zawsze pokazuj ikony powiadomień (tylko Windows) -label_3=Wyłącz wszystkie powiadomienia -options_empty=nie określono -options_notifications_3=Ta opcja może nie działać na Twoim systemie operacyjnym. -options_timings=Czasowe -options_gmail_5=Czwarte konto (/mail/u/3/) -label_5=Przez 15 minut -options_misc_9=Czerwony dla "Nieprzeczytane" i szary dla "Rozłączony" -options_notifications_27=Ikony obszaru powiadomień będą zawsze wyświetlane, nawet gdy brak nieprzeczytanych wiadomości. -options_misc_1=Sortuj konta alfabetycznie -tooltip_1=LPM: Otwórz Gmail lub panel podglądu wiadomości -notification=Od: [author_email][break]Tytuł: [title][break]Streszczenie: [summary] -options_tab=Otwieranie kart: -log_into_your_account=Proszę się zalogować do swojego konta -label_10=Włącz powiadomienia -options_notifications_23=Głośność dźwięku powiadomienia -options_timings_l2=Minimalny okres czasu to 10 sekund. -options_toolbar_11=Wsparcie skrótów klawiszowych w panelu paska narzędzi -options_gmail_9=Popularne etykiety: "inbox", "important", "^smartlabel_personal", "^smartlabel_newsletter", "^smartlabel_notification" oraz "^smartlabel_group" -options_misc_13=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_misc_6=Nie pokazuj powiadomień na pulpicie, jeśli strona Gmail jest już otworzona -options_notifications_4=Format powiadomienia -label_2=Ustawienia -options_toolbar_14=Jeżeli wolisz sam tekst w trybie pełnej zawartości, odznacz to pole. -options_notifications_18=Dzwoneczek Checker Plus -options_tab_5=Otwórz konto Gmail w karcie w tle -label_7=Przez godzinę -msg_2=Link został skopiowany do schowka. -options_title=Opcje - Powiadomienia Gmail™ -gmail=Powiadomienia Gmail™ -options_toolbar_8=Minimalna szerokość to 500px. -options_notifications_16=Domyślny sygnał Powiadomień Gmail™ -options_misc_14=Nie wyświetlaj szczegółowej liczby na znaczku, gdy liczba nieprzeczytanych wiadomości jest większa niż 999 -options_notifications_14=Ta funkcjonalność jest eksperymentalna i może uczynić Twoją przeglądarkę Firefox niestabilną [wymagany restart]. -options_gmail_3=Drugie konto (/mail/u/1/) -options_notifications_11=Wyświetlaj "powiadomienia paska zadań Windows" lub "powiadomienia Mac OS Dock" -options_notifications_2=Pokazuj powiadomienia na pulpicie przez (sekundy): -log_in_to_your_account=Proszę się zalogować do konta Gmail -options_notifications_15=Dźwięk powiadomienia -options_notifications_21=Własny dźwięk powiadomień: -options_toolbar_9=Wysokość panelu paska narzędzi w trybie pełnej zawartości (piksele): -options_toolbar_1=Zachowanie przycisku paska narzędzi -unknown=nieznane -options_notifications_8=Jeżeli nie chcesz skracać, wpisz dużą liczbę. -options_donation=Złóż dotację -msg_3=Zaznaczony tekst został skopiowany do schowka. -options_misc_7=Pokazuj stronę powitalną po aktualizacji -options_gmail=Gmail: -label_1=Odśwież -options_notifications_5=Dostępne klucze: -options_notifications_24=Głośność to liczba pomiędzy 0 i 100, gdzie 100 oznacza najwyższą głośność (domyślnie). -options_notifications_10=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_misc_2=Domyślne sortowanie bazuje na kolejności zalogowania. -options_toolbar_2=Zawsze otwieraj panel podglądu wiadomości -popup_settings=Ustawienia -options_gmail_4=Trzecie konto (/mail/u/2/) -options_toolbar_5=Pokazuj tylko podsumowanie -options_notifications_12=Obecnie, powiadomienia paska zadań nie są wspierane na systemach Linuks. -msg_1=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_misc_5=Niebieski dla "Nieprzeczytane" i szary dla "Rozłączony" -options_timings_l8=Ustaw wartość na zero, aby nie sprawdzać nowych wiadomości przed pierwszym ręcznym odświeżeniem [niedostępne na Safari]. -tooltip_3=PPM: Wybór kont -options_notifications=Powiadomienia: -options_timings_l6=Wartości inne niż zero wyzwalają powiadomienia na pulpicie oraz dźwięk (podobnie jak otrzymanie nowej poczty), dopóki posiadasz nieprzeczytane wiadomości. -options_notifications_22=Jeżeli Twoja przeglądarka nie odtwarza dźwięku powiadomienia, spróbuj go przekonwertować do zwykłego formatu WAV przy pomocy narzędzi konwersji online. -options_tab_1=Szukaj w aktywnym oknie otwartej karty z kontem Gmail -options_timings_l1=Sprawdzaj nowe wiadomości co (sekundy): -options_toolbar_4=Tryb panelu paska narzędzi -toolbar_label=Powiadomienia Gmail™ -options_misc_3=Kolor paska narzędzi: -options_gmail_12=Oddzielaj kanały znakiem "," (przecinek). Przykładowy kanał: -https://mail.google.com/mail/u/0/feed/atom/inbox -options_toolbar_12=!: Zgłoś spam, #: Usuń, e: Archiwizuj, Shift + i: Oznacz jako przeczytane. -options_px=px -options_misc_11=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. -options_notifications_20=Własny sygnał -and=i -options_tab_7=Zawsze używaj pustych kart zamiast otwierania nowej karty przy aktywnej takiej opcji -options_toolbar_3=Otwieraj konto Gmail, tylko jeżeli zalogowano na jednym -options_gmail_7=Szóste konto (/mail/u/5/) -options_toolbar=Pasek narzędzi: -options_notifications_6=Skracaj powiadomienia dłuższe niż -tooltip_2=Kółko myszy (lub Ctrl+LPM): Odśwież wszystkie konta -options_tab_3=Otwórz kolejne konto Gmail za aktywną kartą -options_gmail_8=Oznacz wiadomość jako przeczytaną podczas archiwizowania -options_toolbar_17=Otwórz główne konto Gmail -options_notifications_7=znaków dla pól [title] oraz [summary]. -options_misc_10=Uruchom powiadomienia na pulpicie oraz dźwiękowe, gdy e-mail został otrzymany poniżej (minut): -label_8=Przez 2 godziny -msg_4=Informacja: Aby powiadomienia działały poprawnie, musisz być zalogowany do swojego konta Google. -options_toolbar_6=Pokazuj pełną zawartość -options_gmail_11=Własne kanały: -options_tab_2=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ę. -label_11=Stwórz wiadomość -options_toolbar_7=Szerokość panelu paska narzędzi w trybie pełnej zawartości (piksele): -options_timings_l5=Minimalny czas to 5 minut. -options_misc=Różności: -options_gmail_2=Oddzielaj etykiety znakiem "," (przecinek). -options_misc_4=Szary dla "Nieprzeczytane" i niebieski dla "Rozłączony" -options_toolbar_13=Wyświetlaj wiadomości jako HTML w trybie pełnej zawartości -options_toolbar_16=Odśwież wszystkie konta -options_gmail_6=Piąte konto (/mail/u/4) -options_inshort=Etykiety i powiadomienia kont dla Poczty Google (Gmail). -options_misc_12=Nie uwzględniaj informacji o profilu w treści okienka podpowiedzi -options_tab_4=Otwórz konto Gmail w aktywnej karcie -label_12=Otwórz stronę domową -description=Etykiety i powiadomienia kont dla Poczty Google (Gmail) diff --git a/builds/unpacked/firefox/locale/zh-CN.properties b/builds/unpacked/firefox/locale/zh-CN.properties deleted file mode 100644 index a8b0a218..00000000 --- a/builds/unpacked/firefox/locale/zh-CN.properties +++ /dev/null @@ -1,124 +0,0 @@ -label_9=禁用 5 小时 -options_notifications_19=Windows 邮件提醒 -options_notifications_17=Checker Plus 钟声 -options_notifications_13=在点击任务栏通知图标时打开工具栏面板(仅 Windows,测试版) -options_timings_l7=不检查新邮件,在刚启动的(秒): -label_4=禁用 5 分钟 -options_timings_l3=提醒有未读邮件,每隔(分钟): -options_gmail_1=主帐户 (/mail/u/0/) -options_gmail_10=接收下列标签和帐户的通知: -options_notifications_1=为新邮件显示桌面通知 -options_notifications_9=为新邮件播放声音提醒 -label_6=禁用 30 分钟 -options_misc_8=重置所有设置到出厂设置 -options_timings_l4=设置值为 0 可禁用定期提醒。 -options_tab_6=在新窗口打开 Gmail 帐户 -options_notifications_25=在 Safari 下很可能默认的通知声音不能正常播放,如果您使用了一个自定义文件作为通知声音。 -options_toolbar_15=中键单击工具栏按钮 -options_toolbar_10=最小高度为 500px。 -options_notifications_26=始终显示托盘通知 (仅 Windows) -label_3=禁用所有通知 -options_empty=未定义 -options_notifications_3=此选项在您的操作系统上可能无法正常工作。 -options_timings=时间 -options_gmail_5=第四帐户 (/mail/u/3/) -label_5=禁用 15 分钟 -options_misc_9=红色表示“无未读邮件”,灰色表示“已断开” -options_notifications_27=托盘通知图标将始终显示,即使没有未读邮件。 -options_misc_1=按字母排序帐户 -tooltip_1=左键单击:打开 Gmail 或邮件预览面板 -notification=来自: [author_email][break]标题: [title][break]摘要: [summary] -options_tab=打开标签页: -log_into_your_account=请登录您的帐户 -label_10=启用通知功能 -options_notifications_23=声音提醒的音量为 -options_timings_l2=最小周期为 10 秒。 -options_toolbar_11=工具栏面板上支持键盘快捷键 -options_gmail_9=部分常用标签: "inbox", "important", "^smartlabel_personal", "^smartlabel_newsletter", "^smartlabel_notification", "^smartlabel_group" -options_misc_13=默认情况下,本扩展的工具栏按钮的工具提示带有登录信息。取消此选项时,工具提示文本将恢复默认值。 -options_misc_6=不在 Gmail 网站已经打开时显示桌面通知 -options_notifications_4=通知格式 -label_2=设置 -options_toolbar_14=如果您偏好在完整内容模式下只呈现文本形式,取消此框。 -options_notifications_18=Checker Plus 铃声 -options_tab_5=在后台标签页打开 Gmail 帐户 -label_7=禁用 1 小时 -msg_2=链接已复制到剪贴板。 -options_title=选项 - Gmail™ Notifier -gmail=Gmail™ Notifier -options_toolbar_8=最小宽度为 500px。 -options_notifications_16=Gmail Notifier 默认声音 -options_misc_14=未读邮件超过 999 封时,不在徽章上显示确切数字 -options_notifications_14=此功能是实验性的,并可能导致您的 Firefox 浏览器不稳定 [需要重启]。 -options_gmail_3=第二帐户 (/mail/u/1/) -options_notifications_11=显示“Windows 任务栏通知”或者“Mac OS Dock 通知” -options_notifications_2=显示桌面通知(秒): -log_in_to_your_account=请登录您的 Gmail 帐户 -options_notifications_15=声音通知为 -options_notifications_21=用户定义声音为 -options_toolbar_9=完整内容模式下的工具栏面板高度为(像素): -options_toolbar_1=工具栏按钮行为 -unknown=未知 -options_notifications_8=要想没有截断和省略号,在这里使用较大的数值。 -options_donation=捐款 -msg_3=选定文本已复制到剪贴板。 -options_misc_7=升级后显示欢迎页面 -options_gmail=Gmail: -label_1=刷新 -options_notifications_5=可用变量: -options_notifications_24=音量是 0 至 100 之间的一个数字,100 是最高音量(默认值)。 -options_notifications_10=Mac 用户请注意:从 Firefox 28.0 开始,所有桌面通知都经由 Mac 通知中心处理,包括触发一个额外的声音提醒。您需要取消这里的声音或者“通知中心”中的声音。 -options_misc_2=默认顺序是登录顺序。 -options_toolbar_2=总是打开邮件预览面板 -popup_settings=设置 -options_gmail_4=第三帐户 (/mail/u/2/) -options_toolbar_5=只显示摘要 -options_notifications_12=任务栏通知目前不支持 Linux 操作系统。 -msg_1=标签页已经打开。点击工具栏上的按钮在新标签页中打开 Gmail,或者切换到现有的 Gmail 标签页。 -options_misc_5=蓝色表示“无未读邮件”,灰色表示“已断开” -options_timings_l8=设置值为 0 将禁用邮件检查,除非手动刷新 [Safari 上不可用]。 -tooltip_3=右键单击:选择帐户 -options_notifications=通知: -options_timings_l6=非零的值将反复触发桌面通知和提醒声音(类似有新邮件到达),如果您有未读的邮件。 -options_notifications_22=如果您的浏览器没有播放通知声音,尝试使用一种在线转换工具,将它转换为一个纯净的 WAV 格式。 -options_tab_1=只在活动窗口中搜索已打开的 Gmail 帐户 -options_timings_l1=检查新邮件,每隔(秒): -options_toolbar_4=工具栏面板模式 -toolbar_label=Gmail™ Notifier -options_misc_3=工具栏颜色模式 -options_gmail_12=用 "," (半角逗号) 分隔收取点。收取点样例: https://mail.google.com/mail/u/0/feed/atom/inbox -options_toolbar_12=!: 报告为垃圾邮件, #: 删除, e: 归档, Shift + i: 标记为已读。 -options_px=像素 -options_misc_11=如果将此选项设置为 0,您将不再收到桌面和声音通知,但仍可收到网址栏徽章通知。 -options_notifications_20=用户定义声音 -and=及 -options_tab_7=始终使用空白标签页而不是打开一个新标签页 -options_toolbar_3=打开 Gmail 帐户,如果只登录了一个帐户 -options_gmail_7=第六帐户 (/mail/u/5/) -options_toolbar=工具栏: -options_notifications_6=截断通知中超过 -tooltip_2=中键 (或 Ctrl+左键) 单击:刷新所有帐户 -options_tab_3=在当前标签页后面打开新的 Gmail 帐户 -options_gmail_8=归档时标记邮件为已读 -options_toolbar_17=打开主要的 Gmail 帐户 -options_notifications_7=字符的标题和摘要。 -options_misc_10=仅在邮件抵达未超过x分钟时发出桌面和声音通知: -label_8=禁用 2 小时 -msg_4=注意:为了通知能正常工作,您需要先登录到您的 Google 帐户。 -options_toolbar_6=显示完整内容 -options_gmail_11=自定义收取点: -options_tab_2=不搜索其他浏览器窗口有无打开的 Gmail 帐户。如果活动窗口中没有已打开的 Gmail,打开一个新标签页。 -label_11=撰写邮件 -options_toolbar_7=完整内容模式下的工具栏面板宽度为(像素): -options_timings_l5=最小周期为 5 分钟。 -options_misc=杂项: -options_gmail_2=用 "," (半角逗号) 分隔。 -options_misc_4=灰色表示“无未读邮件”,蓝色表示“已断开” -options_toolbar_13=在完整内容模式下,呈现邮件为 HTML 形式 -options_toolbar_16=刷新所有帐户 -options_gmail_6=第五帐户 (/mail/u/4/) -options_inshort=支持多个标签和帐户的通知工具,适用于 Google Mail (Gmail)。 -options_misc_12=不在工具提示中包含登录信息 -options_tab_4=在当前标签页打开 Gmail 帐户 -label_12=打开主页 -description=支持多个标签和帐户的通知工具,适用于 Google Mail (Gmail) diff --git a/builds/unpacked/firefox/package.json b/builds/unpacked/firefox/package.json deleted file mode 100644 index 18cb5166..00000000 --- a/builds/unpacked/firefox/package.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "fullName": "Gmail Notifier (restartless)", - "name": "ignotifier", - "description": "Multiple label and account notifier for Google Mail (Gmail)", - "id": "jid0-GjwrPchS3Ugt7xydvqVK4DQk8Ls@jetpack", - "license": "mozilla public license 1.1", - "version": "0.5.10", - "author": "InBasic", - "contributors": [ - "CaTz", - "ecaron" - ], - "lib": "lib", - "main": "./lib/common.js", - "url": "http://firefox.add0n.com/gmail-notifier.html", - "icon": "data/icons/red/32.png", - "icon64": "data/icons/red/64.png", - "permissions": { - "private-browsing": true, - "unsafe-content-script": true, - "cross-domain-content": ["file:///"] - } -} - - - diff --git a/compile/convert.js b/compile/convert.js deleted file mode 100644 index a5cac71f..00000000 --- a/compile/convert.js +++ /dev/null @@ -1,32 +0,0 @@ -'use strict'; - -var fs = require('fs'); - -function convert (input, output) { - fs.readFile('src/_locales/' + input + '/messages.json', 'utf8', function (err, data) { - if (err) { - throw err; - } - var json = JSON.parse(data); - var c = ''; - for (var name in json) { - c += name + '=' + json[name].message + '\n'; - } - fs.writeFile('src/locale/' + output + '.properties', c, 'utf8', function (err) { - if (err) { - throw err; - } - else { - console.log('done'); - } - }); - }); -} - -convert('en', 'en'); -convert('el', 'el'); -//convert('he', 'he'); -convert('nl', 'nl'); -convert('pl', 'pl'); -convert('ru', 'ru'); -convert('zh_CN', 'zh-CN'); diff --git a/compile/install.js b/compile/install.js deleted file mode 100644 index a762d77c..00000000 --- a/compile/install.js +++ /dev/null @@ -1,197 +0,0 @@ -var fs = require('fs'), - path = require('path'), - program = require('commander'), - clc = require('cli-color'), - net = require('net'), - spawn = require('child_process').spawn, - exec = require('child_process').exec, - glob = require("glob"); - - -var isWindows = !!process.platform.match(/^win/); - -/** Command Line setup **/ -program - .version('0.0.4') - .option('-r, --run', - 'Run extension in a clean profile ' + - '(equivalent to cfx run). No XPI will be generated' - ) - .option('-w, --wget', - 'Send generated XPI over TCP (Port:8888) to the current profile ' + - 'A TCP server such as "Extension auto installer" is required.' - ) - .option('-e, --xpi', - 'Create XPI file in /src.safariextension dir' - ) - .option('-j, --jsconsole', - 'Show jsConsole in run mode' - ) - .option('-i, --ip ', - 'Combine this option with --wget to send the generated XPI to a host rather than "localhost"', - 'localhost' - ) - .option('--sdk ', - 'Path to the Mozilla Add-On SDK library [..]', - '..' - ) - .option('--sdkVersion ', - 'Use another version of SDK rather than the most recent one' - ) - .parse(process.argv); - -/** Wget **/ -var installer = function (callback) { - var child; - - var cmd = "ls src.safariextension/executables/*.xpi" - child = exec(cmd, {}, function (error, stdout, stderr) { - if (stdout) { - fs.readFile(/.*/.exec(stdout)[0], null, function(err, buffer) { - console.log(clc.green('Connecting to ' + program.ip + '/:8888')); - var client = net.connect({ - host: program.ip, - port: 8888 - }, function() { - var identifier = new Buffer('\rPOST / HTTP/1.1\n\rUser-Agent: NodeJS Compiler\n\r\n'); - client.write(identifier); - client.end(buffer); - }); - client.on('data', function(data) { - console.log(clc.green(data.toString())); - client.end(); - setTimeout(function(){process.exit(0);}, 500); - }); - }); - } - if (stderr) - console.log(clc.red(stderr)); - }); -} - -process.chdir(require("path").join(__dirname, '..')); - -/** Clearing Thumb.db and .DS_Store **/ -glob("**/.DS_Store", {}, function (err, files1) { - if (err) throw err; - glob("**/Thumbs.db", {}, function (err, files2) { - if (err) throw err; - var files = files1.concat(files2); - files.forEach(function (file) { - console.error('cleaning ', file); - fs.unlinkSync(file); - }); - /** Find SDK **/ - fs.readdir(program.sdk, function (err, files) { - if (err) throw new Error(err); - - var actualAddonPath, sdkVersion, sdkVersionMatched = false; - /** In case user supplied path pointing to actual SDK directory **/ - if (/addon-sdk/.test(program.sdk) !== false) { - if (typeof program.sdkVersion !== "undefined") { - console.log(clc.red("--sdk pointed to actual addon directory, ignoring --sdkVersion")); - } - actualAddonPath = program.sdk; - sdkVersion = actualAddonPath - } else { - files = files.filter(function (file) { - return /^addon-sdk-/.test(file); - }).sort(function (a, b) { - /** Is there any preferred sdk version **/ - if (program.sdkVersion) { - if (a.indexOf(program.sdkVersion) != -1) { - sdkVersionMatched = true; - return -1; - } - if (b.indexOf(program.sdkVersion) != -1) { - sdkVersionMatched = true; - return 1; - } - } - /** If the directory used has multiple addon-sdk folders, make sure we use the most recent **/ - var _patern = /(\d+)/g; - var temp1 = a.match(_patern), temp2 = b.match(_patern); - for (var i = 0; i < 10; i++) { - if (temp1[i] != temp2[i]) { - return parseInt(temp1[i]) + + + + + 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/package.json b/package.json deleted file mode 100644 index c00407b7..00000000 --- a/package.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "author": "InBasic ", - "name" : "ignotifier", - "version" : "0.2.6", - "dependencies" : - { - "cli-color": "0.2", - "commander": "1.1", - "glob": "4.0.6" - } -} diff --git a/src/chrome.manifest b/src/chrome.manifest deleted file mode 100644 index 876e29ad..00000000 --- a/src/chrome.manifest +++ /dev/null @@ -1 +0,0 @@ -content ignotifier data/firefox/chrome/content/ diff --git a/src/data/firefox/chrome/content/options-opener.xul b/src/data/firefox/chrome/content/options-opener.xul deleted file mode 100644 index 2e5da077..00000000 --- a/src/data/firefox/chrome/content/options-opener.xul +++ /dev/null @@ -1,18 +0,0 @@ - - - - - diff --git a/src/data/firefox/notification.html b/src/data/firefox/notification.html deleted file mode 100644 index 418137d6..00000000 --- a/src/data/firefox/notification.html +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/src/data/firefox/overlay.css b/src/data/firefox/overlay.css deleted file mode 100644 index e595fb31..00000000 --- a/src/data/firefox/overlay.css +++ /dev/null @@ -1,43 +0,0 @@ -toolbarpaletteitem[place="palette"] > __id__:after, -__id__[cui-areatype="menu-panel"]:after { - display: none; -} -__id__:after { - position: relative; - display: none; - font-family: __font_family__; - font-size: __font_size__; - font-weight: 600; - content: attr(value); - background-color: __bg_color__; - color: __color__; - text-align: center; - overflow: hidden; - border-radius: 2px; - height: __height__; - line-height: __line_height__; -} -__id__[cui-areatype="toolbar"][length="1"]:after, -__id__[cui-areatype="toolbar"][length="2"]:after, -__id__[cui-areatype="toolbar"][length="3"]:after, -__id__[cui-areatype="toolbar"][length="4"]:after { - display: table; -} -__id__[length="1"]:after { - width: __width_1__; - margin: __margin_1__; -} -__id__[length="2"]:after { - width: __width_2__; - margin: __margin_2__; -} -__id__[length="3"]:after { - width: __width_3__; - margin: __margin_3__; -} -__id__[length="4"]:after { - width: __width_4__; - margin: __margin_4__; -} - -__extra__ \ No newline at end of file diff --git a/src/data/firefox/shared/connect.jsm b/src/data/firefox/shared/connect.jsm deleted file mode 100644 index 9f34059c..00000000 --- a/src/data/firefox/shared/connect.jsm +++ /dev/null @@ -1,3 +0,0 @@ -var EXPORTED_SYMBOLS = ["remote"]; - -var remote = {}; diff --git a/src/data/firefox/sound.html b/src/data/firefox/sound.html deleted file mode 100644 index 84c753b3..00000000 --- a/src/data/firefox/sound.html +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/src/data/options/firefox/firefox.js b/src/data/options/firefox/firefox.js deleted file mode 100644 index ca9560ff..00000000 --- a/src/data/options/firefox/firefox.js +++ /dev/null @@ -1,15 +0,0 @@ -/* globals self */ -'use strict'; - -var background = { - send: function (id, data) { - self.port.emit(id, data); - }, - receive: function (id, callback) { - self.port.on(id, callback); - } -}; - -background.receive('show', function () { - background.send('show'); -}); diff --git a/src/data/popup/body/email-firefox.css b/src/data/popup/body/email-firefox.css deleted file mode 100644 index 5355b3f0..00000000 --- a/src/data/popup/body/email-firefox.css +++ /dev/null @@ -1,26 +0,0 @@ -body { - margin: 0; -} -body, td { - font-family: arial,sans-serif; - font-size: 12px; -} -a { - color: #1155CC; - text-decoration: none; -} - -body>table:first-child, -body>hr, -.maincontent>table:first-child, -.maincontent>hr { - display: none; -} - -.message>tbody>tr:nth-child(1), .message>tbody>tr:nth-child(2) { - display: none; -} - -.message>tbody>tr>td>table>tbody>tr>td { - padding: 0 6px; -} diff --git a/src/data/popup/firefox/firefox.js b/src/data/popup/firefox/firefox.js deleted file mode 100644 index 9e199192..00000000 --- a/src/data/popup/firefox/firefox.js +++ /dev/null @@ -1,16 +0,0 @@ -/* globals self */ -'use strict'; - -var background = { - send: self.port.emit, - receive: self.port.on -}; - -var manifest = { - url: self.options.base, - locale: (id) => self.options.locales[id] -}; - -background.receive('show', function () { - background.send('show'); -}); diff --git a/src/lib/utils/gmail.js b/src/lib/utils/gmail.js deleted file mode 100644 index 5b4ba572..00000000 --- a/src/lib/utils/gmail.js +++ /dev/null @@ -1,128 +0,0 @@ -var isFirefox = typeof require !== 'undefined'; -if (isFirefox) { - app = require('../wrapper/firefox/app'); - config = require('../config'); - render = require('./render'); - gmail = exports; -} -else { - var gmail = {}; -} - -gmail.body = (function () { - var iks = {}, contents = {}; - - function getIK (url) { - if (iks[url]) { - return app.Promise.resolve(iks[url]); - } - return new app.get(url).then(function (req) { - var tmp = /var GLOBALS\=\[(?:([^\,]*)\,){10}/.exec(req.responseText || ""); - var ik = tmp && tmp.length > 1 ? tmp[1].replace(/[\"\']/g, "") : null; - if (ik) { - iks[url] = ik; - return ik; - } - else { - return Error("gmail.js -> body -> getIK -> Error at resolving user's static ID. Please switch back to the summary mode."); - } - }); - } - - return function (link) { - link = link.replace("http://", "https://"); - if (contents[link]) { - return app.Promise.resolve(contents[link]); - } - - var url = /[^\?]*/.exec(link)[0] + "/"; - var thread = /message\_id\=([^\&]*)/.exec(link); - if (!thread.length) { - return app.Promise.reject(Error('gmail.js -> body -> Error at resolving thread. Please switch back to the summary mode.')); - } - return getIK(url).then(function (ik) { - return new app.get(url + "?ui=2&ik=" + ik + "&view=pt&dsqt=1&search=all&msg=" + thread[1]).then(function (req) { - var body = render[config.popup.display ? "getHTMLText" : "getPlainText"](req, url, link); - contents[link] = body; - return body; - }); - }); - } -})(); - -/** - * Send archive, mark as read, mark as unread, and trash commands to Gmail server - * @param {String} link, xml.link address - * @param {String} cmd: rd, ur, rc_%5Ei, tr, sp - */ -gmail.action = (function () { - function getAt_2 (url) { - return new app.get(url + "h/" + Math.ceil(1000000 * Math.random())).then (function (req) { - if (!req) { - return Error("gmail.js -> action -> getAt_2 -> server response is empty."); - } - if(req.status == 200) { - var tmp = /at\=([^\"\&]*)/.exec(req.responseText); - return tmp && tmp.length > 1 ? tmp[1] : null; - } - else { - return Error("gmail.js -> action -> getAt_2 -> got status of " + req.status); - } - }); - } - function getAt (url) { - return new app.get(url).then(function (req) { - if (!req) { - return Error("gmail.js -> action -> getAt -> server response is empty."); - } - if(req.status == 200) { - var tmp = /GM_ACTION_TOKEN\=\"([^\"]*)\"/.exec(req.responseText); - if (tmp && tmp.length) { - return tmp[1]; - } - else { - return getAt_2(url); - } - } - else { - return Error("gmail.js -> action -> getAt -> got status of " + req.status); - } - }); - } - - function sendCmd (url, at, threads, cmd) { - if (cmd == "rc_%5Ei" && config.email.doReadOnArchive) { - sendCmd(url, at, threads, "rd"); - } - var u = url + "?at=" + at + "&act=" + cmd.replace("rd-all", "rd"); - u += "&t=" + threads.join("&t="); - - return new app.get(u).then(function (req) { - if (!req) { - return Error("gmail.js -> action -> sendCmd -> server response is empty."); - } - if (req.status === 200) { - return true; - } - return Error("gmail.js -> action -> sendCmd -> got status of " + req.status); - }); - } - - return function (links, cmd) { - links = typeof(links) === "string" ? [links] : links; - var url = /[^\?]*/.exec(links[0])[0] + "/"; - return getAt(url).then(function (at) { - var threads = []; - links.forEach(function (link) { - var thread = /message\_id\=([^\&]*)/.exec(link); - if (thread && thread.length) { - threads.push(thread[1]); - } - }); - if (threads.length) { - return sendCmd(url, at, threads, cmd); - } - return app.Promise.reject(Error("gmail.js -> action -> Error at resolving thread.")); - }); - } -})(); diff --git a/src/lib/wrapper/firefox/app.js b/src/lib/wrapper/firefox/app.js deleted file mode 100644 index 1b8f7abe..00000000 --- a/src/lib/wrapper/firefox/app.js +++ /dev/null @@ -1,502 +0,0 @@ -var {Cc, Ci, Cu} = require('chrome'), - {on, off, once, emit} = require('sdk/event/core'), - buttons = require("sdk/ui/button/action"), - tabs = require("sdk/tabs"), - self = require("sdk/self"), - loader = require('@loader/options'), - array = require('sdk/util/array'), - data = self.data, - panel = require("sdk/panel"), - l10n = require("sdk/l10n").get, - timer = require("sdk/timers"), - pageWorker = require("sdk/page-worker"), - pageMod = require("sdk/page-mod"), - sp = require("sdk/simple-prefs"), - unload = require("sdk/system/unload"), - events = require("sdk/system/events"), - tabsUtils = require("sdk/tabs/utils"), - prefs = sp.prefs, - config = require("../../config"), - tbExtra = require("./tbExtra"), - windows = { - utils: require('sdk/window/utils'), - get active () { // Chrome window - return this.utils.getMostRecentBrowserWindow(); - }, - get SDKWindow () { // SDK window - return require("sdk/windows").browserWindows.activeWindow - }, - } - -var exportsHelper = {}; - -Cu.import("resource://gre/modules/Promise.jsm"); -Cu.import("resource://gre/modules/XPCOMUtils.jsm"); - -// Event Emitter -exports.on = on.bind(null, exports); -exports.once = once.bind(null, exports); -exports.emit = emit.bind(null, exports); -exports.removeListener = function removeListener (type, listener) { - off(exports, type, listener); -}; - -/* popup */ -var popup = panel.Panel({ - contentURL: data.url("./popup/index.html"), - contentScriptFile: [ - data.url("./popup/firefox/firefox.js"), - data.url("./popup/index.js") - ], - contentScriptOptions: { - base: loader.prefixURI, - locales: { - 'popup_msg_1': l10n('popup_msg_1'), - 'popup_msg_2': l10n('popup_msg_2'), - 'popup_msg_3': l10n('popup_msg_3'), - 'popup_msg_4': l10n('popup_msg_4'), - 'popup_msg_5': l10n('popup_msg_5'), - 'popup_msg_6': l10n('popup_msg_6'), - 'popup_msg_7': l10n('popup_msg_7'), - 'popup_msg_8': l10n('popup_msg_8'), - 'popup_msg_9': l10n('popup_msg_9'), - 'popup_msg_10': l10n('popup_msg_10'), - 'popup_msg_11': l10n('popup_msg_11'), - 'popup_msg_12': l10n('popup_msg_12'), - 'popup_msg_13': l10n('popup_msg_13'), - 'popup_msg_14': l10n('popup_msg_14'), - 'popup_msg_15': l10n('popup_msg_15'), - 'popup_msg_16': l10n('popup_msg_16'), - 'popup_msg_17': l10n('popup_msg_17'), - 'popup_msg_18': l10n('popup_msg_18'), - 'popup_msg_19': l10n('popup_msg_19'), - 'popup_msg_20': l10n('popup_msg_20'), - 'popup_msg_21': l10n('popup_msg_21') - } - } -}); -popup.on('show', () => popup.port.emit('show')); - -/* button */ -var button = buttons.ActionButton({ - id: self.name, - label: l10n("toolbar_label"), - icon: { - "16": "./icons/blue/16.png", - "32": "./icons/blue/32.png" - }, - onClick: function() { - if (button.onClick) { - button.onClick(); - } - } -}); -tbExtra.setButton(button); - -/* option */ -var options = (function () { - var workers = [], options_arr = []; - pageMod.PageMod({ - include: data.url("options/index.html"), - contentScriptFile: [ - data.url("options/firefox/firefox.js"), - data.url("options/index.js") - ], - contentScriptWhen: "start", - contentScriptOptions: { - base: loader.prefixURI - }, - onAttach: function(worker) { - array.add(workers, worker); - worker.on('pageshow', function() { array.add(workers, this); }); - worker.on('pagehide', function() { array.remove(workers, this); }); - worker.on('detach', function() { array.remove(workers, this); }); - // PageMod has no access to mozFullPath of input. - worker.port.on("get-sound-fullpath", function () { - var browserWindow = Cc["@mozilla.org/appshell/window-mediator;1"]. - getService(Ci.nsIWindowMediator). - getMostRecentWindow("navigator:browser"); - var file = browserWindow.content.document.querySelector("input[type=file]").files[0].mozFullPath; - config.notification.sound.custom.file = file; - }); - options_arr.forEach(function (arr) { - worker.port.on(arr[0], arr[1]); - }); - } - }); - return { - send: function (id, data) { - workers.forEach(function (worker) { - worker.port.emit(id, data); - }); - }, - receive: (id, callback) => options_arr.push([id, callback]) - } -})(); - -function get (url, headers, data, timeout) { - headers = headers || {}; - - var d = new Promise.defer(); - var req = Cc["@mozilla.org/xmlextras/xmlhttprequest;1"] - .createInstance(Ci.nsIXMLHttpRequest); - req.mozBackgroundRequest = true; //No authentication - req.timeout = timeout; - req.open('GET', url, true); - for (var id in headers) { - req.setRequestHeader(id, headers[id]); - } - req.onreadystatechange = function () { - if (req.readyState == 4) { - d.resolve(req); - } - }; - req.channel - .QueryInterface(Ci.nsIHttpChannelInternal) - .forceAllowThirdPartyCookie = true; - if (data) { - var arr = []; - for(e in data) { - arr.push(e + "=" + data[e]); - } - data = arr.join("&"); - } - req.send(data ? data : ""); - return d.promise; -} - -/* exports */ -exports.Promise = Promise; - -exports.button = { - onCommand: function (c) { - button.onClick = c; - }, - onContext: function (c) { - tbExtra.onContext(function (e, menupopup, menuitem, menuseparator, menu) { - var types = { - "menupopup": menupopup, - "menuitem": menuitem, - "menuseparator": menuseparator, - "menu": menu - } - // remove old items - while (menupopup.firstChild) { - menupopup.removeChild(menupopup.firstChild); - } - var items = c(); - function appendChilds (root, arr) { - arr.forEach(function (e) { - var element = types[e.type].cloneNode(false); - ["label", "tooltip", "value", "link"].filter(function (i) { - return e[i]; - }).forEach(function (i) { - return element.setAttribute(i, e[i]); - }); - if (e.command) { - element.addEventListener("command", function (event) { - event.preventDefault(); - event.stopPropagation(); - e.command(event); - }, false); - } - root.appendChild (element); - if (e.childs && e.childs.length) appendChilds(element, e.childs); - }); - } - appendChilds(menupopup, items); - }); - }, - onClick: function (c) { - tbExtra.onClick(c); - }, - set label (val) { - button.label = config.ui.tooltip ? l10n('toolbar_label') : val; - }, - set badge (val) { - if (config.ui.badge) { - tbExtra.setBadge(val); - } - }, - set color (val) { - button.icon = { - "16": "./icons/" + val + "/16.png", - "32": "./icons/" + val + "/32.png" - } - } -} - -exports.popup = { - show: function () { - popup.show({ - width: config.popup.width, - height: config.popup.height, - position: button - }); - }, - hide: function () { - popup.hide(); - }, - attach: function () {}, - detach: () => popup.hide(), - send: function (id, data) { - if (id === "resize") { - popup.resize(data.width, data.height); - } - if (popup.isShowing) { - popup.port.emit(id, data); - } - }, - receive: (id, callback) => popup.port.on(id, callback) -} - -exports.timer = timer; - -exports.get = get; - -exports.parser = function () { - return Cc["@mozilla.org/xmlextras/domparser;1"] - .createInstance(Ci.nsIDOMParser); -} - -exports.l10n = (id) => l10n(id); - -exports.windows = (function () { - function toWindow (win) { - return { - obj: win, - focus: function () { - (win.focus || win.activate)(); - } - } - } - function toTab (tab) { - return { - get url () { - return tab.url - }, - set url (val) { - if (tab.url == val) { - tab.reload(); - } - else { - tab.url = val; - } - }, - activate: () => tab.activate(), - window: () => Promise.resolve(toWindow(toWindow(tab.window))), - get active () { - return tab == tabs.activeTab; - }, - close: function () { - tab.close(); - } - } - } - return { - active: function () { - return Promise.resolve(toWindow(windows.active)); - }, - open: function (url, inBackground) { - var popup = windows.active.open(url); - if (inBackground) { - popup.blur(); - window.focus(); - } - }, - tabs: { - list: function (currentWindow) { - var tbs = currentWindow ? windows.SDKWindow.tabs : tabs; - var temp = []; - for each (var tab in tbs) { - temp.push(tab); - } - return Promise.resolve(temp.map(toTab)); - }, - active: function () { - return Promise.resolve(toTab(tabs.activeTab)); - }, - open: function (url, inBackground) { - var gBrowser = windows.active.gBrowser; - // use old blank tabs? - (function () { - if (config.tabs.open.relatedToCurrent || !config.tabs.open.useBlankTabs) { - return Promise.resolve(null); - } - return exports.windows.tabs.list(true).then(function (tabs) { - return tabs.reduce(function (p, c) { - return p || (c.url === "about:newtab" || c.url === "about:blank" ? c : null); - }, null); - }); - })().then(function (t) { - if (t) { - t.url = url; - if (!inBackground) { - t.activate(); - } - } - else { - t = gBrowser.addTab(url, { - relatedToCurrent: config.tabs.open.relatedToCurrent - }); - if (!inBackground) { - gBrowser.selectedTab = t; - } - } - }); - } - } - } -})(); - -exports.notify = (function () { // https://github.com/fwenzel/copy-shorturl/blob/master/lib/simple-notify.js - var alertServ = Cc["@mozilla.org/alerts-service;1"]. - getService(Ci.nsIAlertsService); - - return function (text, title , callback) { - title = title || l10n("gmail"); - if (config.notification.silent) return; - - try { - alertServ.showAlertNotification( - data.url("icons/notification/32.png"), - title, - text, - callback ? true : false, - "", - function (subject, topic, data) { - if (topic == "alertclickcallback") { - timer.setTimeout(callback, 100); - } - }, ""); - } - catch(e) { - let browser = windows.active.gBrowser, - notificationBox = browser.getNotificationBox(); - - notification = notificationBox.appendNotification( - text, - 'jetpack-notification-box', - data.url("icons/notification/16.png"), - notificationBox.PRIORITY_INFO_MEDIUM, - [] - ); - timer.setTimeout(function() { - notification.close(); - }, config.notification.time * 1000); - } - } -})(); - -XPCOMUtils.defineLazyGetter(exportsHelper, "play", function () { - Cu.import("resource://gre/modules/FileUtils.jsm"); - Cu.import("resource://gre/modules/Services.jsm"); - - return { - now: function () { - if (config.notification.silent) return; - - var path = "../../data/sounds/" + config.notification.sound.original; - if (config.notification.sound.type === 4 && config.notification.sound.custom.file) { - var file = new FileUtils.File(config.notification.sound.custom.file); - if (file.exists()) { - path = Services.io.newFileURI(file).spec; - let res = Services.io.getProtocolHandler('resource').QueryInterface(Ci.nsIResProtocolHandler); - let name = 'igsound'; - res.setSubstitution(name, Services.io.newURI(path, null, null)); - path = 'resource://' + name; - } - } - var worker = pageWorker.Page({ - contentScript: - "var audio = new Audio('" + path + "');" + - "audio.addEventListener('ended', function () {self.postMessage()});" + - "audio.volume = " + (config.notification.sound.volume / 100) + ";" + - "audio.play();", - contentURL: data.url("firefox/sound.html"), - onMessage: function() { - worker.destroy(); - } - }); - }, - reset: function () {} - } -}); -Object.defineProperty(exports, 'play', { - get: function () { - return exportsHelper.play; - } -}); - -XPCOMUtils.defineLazyGetter(exportsHelper, "clipboard", function () { - var clipboardHelper = Cc["@mozilla.org/widget/clipboardhelper;1"] - .getService(Ci.nsIClipboardHelper); - return function (str) { - clipboardHelper.copyString(str); - } -}); -Object.defineProperty(exports, 'clipboard', { - get: function () { - return exportsHelper.clipboard; - } -}); - -exports.version = function () { - return self.version; -} - -exports.startup = function (c) { - if (self.loadReason == "startup" || self.loadReason == "install") { - c(); - } -} - -exports.unload = function (c) { - unload.when(c); -} - -exports.options = options; - -exports.storage = { - read: function (id) { - return (prefs[id] || prefs[id] + "" === "false" || !isNaN(prefs[id])) ? (prefs[id] + "") : null; - }, - write: function (id, data) { - data = data + ""; - if (data === "true" || data === "false") { - prefs[id] = data === "true" ? true : false; - } - else if (parseInt(data) + '' === data) { - prefs[id] = parseInt(data); - } - else { - prefs[id] = data + ""; - } - } -} - -exports.manifest = { - url: loader.prefixURI -} - -exports.tray = require('./tray/wrapper').tray; - -/* updating badge when action is posted */ -function listener(event) { - var channel = event.subject.QueryInterface(Ci.nsIHttpChannel); - var url = channel.URI.spec; - if (url.indexOf('https://mail.google.com/mail/u') === -1 || url.indexOf('act=') === -1) { - return; - } - channel = channel.QueryInterface(Ci.nsIHttpChannel); - exports.emit('update'); -} -events.on('http-on-modify-request', listener); - -// connect -exports.connect = function (actions) { - var connect = {}; - Cu.import(data.url('firefox/shared/connect.jsm'), connect); - connect.remote.actions = actions; - Object.freeze(connect); -} diff --git a/src/lib/wrapper/firefox/tbExtra.js b/src/lib/wrapper/firefox/tbExtra.js deleted file mode 100644 index d5544797..00000000 --- a/src/lib/wrapper/firefox/tbExtra.js +++ /dev/null @@ -1,128 +0,0 @@ -var {Cc, Ci, Cu, components} = require('chrome'), - system = require("sdk/system"), - self = require("sdk/self"), - data = self.data, - timer = require("sdk/timers"), - base64 = require("sdk/base64"), - unload = require("sdk/system/unload"), - config = require("../../config"), - userstyles = require("./userstyles"), - is36 = Cc["@mozilla.org/xpcom/version-comparator;1"] - .getService(Ci.nsIVersionComparator) - .compare(system.version, "36.0") >= 0, - id = ('action-button--' + self.id.toLowerCase()+ '-' + self.name) - .replace(/[^a-z0-9_-]/g, ''); - -const NS_XUL = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"; - -var button, badge = 0, onContext, onClick; - -Cu.import("resource:///modules/CustomizableUI.jsm"); - -var listen = { - onWidgetBeforeDOMChange: function(tbb, aNextNode, aContainer, aIsRemoval) { - if (tbb.id !== id) return; - // Set badge - if (badge && !is36) { - timer.setTimeout(exports.setBadge, 500, badge); - } - // Install onContext if it is not installed - if (!tbb.isOnContextInstalled) { - tbb.isOnContextInstalled = true; - - let doc = tbb.ownerDocument.defaultView.document; - let menupopup = doc.createElementNS(NS_XUL, "menupopup"); - let menu = doc.createElementNS(NS_XUL, "menu"); - let menuitem = doc.createElementNS(NS_XUL, "menuitem"); - let menuseparator = doc.createElementNS(NS_XUL, "menuseparator"); - - tbb.addEventListener("contextmenu", function (e) { - if (onContext) { - //Prevent Firefox context menu - e.stopPropagation(); - e.preventDefault(); - onContext(e, menupopup, menuitem, menuseparator, menu); - menupopup.openPopup(tbb , "after_end", 0, 0, false); - } - }, true); - tbb.addEventListener("click", function (e) { - if (onClick) { - onClick(e); - } - }, true); - tbb.appendChild(menupopup); - } - } -} -CustomizableUI.addListener(listen); -unload.when(function () { - CustomizableUI.removeListener(listen); - CustomizableUI.destroyWidget(id); -}); - -exports.setBadge = (function () { - if(is36) { - return function (val) { - badge = val; - if (button) { - button.badge = val ? val : ""; - button.badgeColor = config.ui.backgroundColor; - } - } - } - else { - Cu.import("resource://gre/modules/FileUtils.jsm"); - Cu.import("resource://gre/modules/NetUtil.jsm"); - - NetUtil.asyncFetch(data.url("./firefox/overlay.css"), function(inputStream, status) { - if (!components.isSuccessCode(status)) { - return; - } - var css = NetUtil.readInputStreamToString(inputStream, inputStream.available()); - css = css - .replace(/__extra__/g, config.ui.extra) // need to be first - .replace(/__id__/g, "#" + id) - .replace(/__font_family__/g, config.ui.fontFamily) - .replace(/__font_size__/g, config.ui.fontSize) - .replace(/__height__/g, config.ui.height) - .replace(/__line_height__/g, config.ui.lineHeight) - .replace(/__margin_1__/g, config.ui.margin["1"]) - .replace(/__margin_2__/g, config.ui.margin["2"]) - .replace(/__margin_3__/g, config.ui.margin["3"]) - .replace(/__margin_4__/g, config.ui.margin["4"]) - .replace(/__width_1__/g, config.ui.width["1"]) - .replace(/__width_2__/g, config.ui.width["2"]) - .replace(/__width_3__/g, config.ui.width["3"]) - .replace(/__width_4__/g, config.ui.width["4"]) - .replace(/__bg_color__/g, config.ui.backgroundColor) - .replace(/__color__/g, config.ui.color); - - userstyles.load("data:text/css;base64," + base64.encode(css)); - }); - - return function (value) { - badge = value; - var bb = CustomizableUI.getWidget(id); - if (!bb) return; - if ((value + "").length > 4) { - value = "9999"; - } - bb.instances.forEach(function (i) { - var tbb = i.anchor.ownerDocument.defaultView.document.getElementById(id); - if (!tbb) return; - tbb.setAttribute("value", value ? value : ""); - tbb.setAttribute("length", value ? (value + "").length : 0); - }); - } - } -})(); - -exports.onContext = function (c) { - onContext = c; -}; -exports.onClick = function (c) { - onClick = c; -}; -exports.setButton = function (b) { - button = b; -}; diff --git a/src/lib/wrapper/firefox/tray/darwin/tray.js b/src/lib/wrapper/firefox/tray/darwin/tray.js deleted file mode 100644 index 038dbf75..00000000 --- a/src/lib/wrapper/firefox/tray/darwin/tray.js +++ /dev/null @@ -1,19 +0,0 @@ -var {Cc, Ci} = require('chrome'), - unload = require("sdk/system/unload"), - config = require('../../../../config'); - -var dock = Cc["@mozilla.org/widget/macdocksupport;1"] - .getService(Ci.nsIMacDockSupport); - -exports.set = function (badge, msg) { - if(!config.tray.show) return; - dock.badgeText = badge; -} -exports.remove = function () { - dock.badgeText = ""; -} -exports.callback = function () { } - -unload.when(function () { - exports.remove(); -}); \ No newline at end of file diff --git a/src/lib/wrapper/firefox/tray/winnt/tray.js b/src/lib/wrapper/firefox/tray/winnt/tray.js deleted file mode 100644 index 6fc21eb3..00000000 --- a/src/lib/wrapper/firefox/tray/winnt/tray.js +++ /dev/null @@ -1,245 +0,0 @@ -'use strict'; - -/* References - * https://github.com/foudfou/FireTray/tree/winnt/src/modules/winnt - * http://www.codeproject.com/Articles/4768/Basic-use-of-Shell_NotifyIcon-in-Win32 - */ - -var {Cc, Ci, Cu} = require('chrome'), - pageWorker = require('sdk/page-worker'), - self = require('sdk/self'), - data = self.data, - unload = require('sdk/system/unload'), - oscpu = Cc['@mozilla.org/network/protocol;1?name=http'] - .getService(Ci.nsIHttpProtocolHandler).oscpu, - version = parseInt((/\d\.\d/.exec(oscpu) || ['0'])[0].replace('.', '')), // Windows Version - config = require('../../../../config'); - -var exportsHelper = {}; - -var {XPCOMUtils} = Cu.import('resource://gre/modules/XPCOMUtils.jsm'); -var {ctypes} = Cu.import('resource://gre/modules/ctypes.jsm'); -Cu.import('resource://gre/modules/Promise.jsm'); - -if (self.loadReason === 'install') { - if (version >= 60) { //Vista - config.tray.doTrayCallback = true; - } -} - -// private variables -var BOOL = ctypes.bool, - BYTE = ctypes.unsigned_char, - WORD = ctypes.unsigned_short, - DWORD = ctypes.unsigned_long, - UINT = ctypes.unsigned_int, - HANDLE = ctypes.voidptr_t, - HWND = HANDLE, - HICON = HANDLE, - HINSTANCE = HANDLE, - TCHAR = ctypes.jschar, - LPVOID = ctypes.voidptr_t, - INT = ctypes.int, - is64bit = ctypes.size_t.size === 8, - LONG_PTR = is64bit ? ctypes.int64_t : ctypes.long, - LRESULT = LONG_PTR, - UINT_PTR = is64bit ? ctypes.uint64_t : ctypes.unsigned_int, - WPARAM = UINT_PTR, - LPARAM = LONG_PTR; -// private StructTypes -var GUID = ctypes.StructType('GUID', [ - {'Data1': ctypes.unsigned_long}, - {'Data2': ctypes.unsigned_short}, - {'Data3': ctypes.unsigned_short}, - {'Data4': ctypes.char.array(8)} -]), -NOTIFYICONDATAW = ctypes.StructType('NOTIFYICONDATAW', [ - {'cbSize': DWORD}, - {'hWnd': HWND}, - {'uID': UINT}, - {'uFlags': UINT}, - {'uCallbackMessage': UINT}, - {'hIcon': HICON}, - {'szTip': ctypes.ArrayType(TCHAR, 128)}, - {'dwState': DWORD}, - {'dwStateMask': DWORD}, - {'szInfo': ctypes.ArrayType(TCHAR, 256)}, - {'uTimeoutOrVersion': UINT}, // union - {'szInfoTitle': ctypes.ArrayType(TCHAR, 64)}, - {'dwInfoFlags': DWORD}, - {'guidItem': GUID}, - {'hBalloonIcon': HICON} -]); -// private FunctionTypes -var WNDPROC = ctypes.FunctionType(ctypes.stdcall_abi, LRESULT, [HWND, UINT, WPARAM, LPARAM]).ptr; -// libraries -var user32 = ctypes.open('user32.dll'), - shell32 = ctypes.open('shell32.dll'); -XPCOMUtils.defineLazyGetter(user32, 'DefWindowProcW', function() { - return user32.declare('DefWindowProcW', ctypes.winapi_abi, LRESULT, HWND, UINT, WPARAM, LPARAM); -}); -XPCOMUtils.defineLazyGetter(user32, 'SetWindowLongPtrW', function() { - return user32.declare(is64bit ? 'SetWindowLongPtrW' : 'SetWindowLongW', ctypes.winapi_abi, LONG_PTR , HWND, INT, LONG_PTR); -}); -XPCOMUtils.defineLazyGetter(user32, 'CreateIcon', function() { - return user32.declare('CreateIcon', ctypes.winapi_abi, HICON, HINSTANCE, INT , INT, BYTE, BYTE, LPVOID, LPVOID); -}); -XPCOMUtils.defineLazyGetter(shell32, 'Shell_NotifyIconW', function() { - return shell32.declare('Shell_NotifyIconW', ctypes.winapi_abi, BOOL, DWORD, NOTIFYICONDATAW.ptr); -}); - -// notification icon -function icon (badge) { - var d = new Promise.defer(); - function getIcon () { - var canvas = document.getElementById('canvas'); - var context = canvas.getContext('2d'); - var img = new Image(); - img.onload = function () { - var xText, xRect; - switch ('badge'.length) { - case 1: - [xText, xRect] = [10, 8]; - break; - case 2: - [xText, xRect] = [5, 3]; - break; - default: - [xText, xRect] = [1, 0]; - break; - } - context.drawImage(img, 0, badge > 0 ? 1 : 3); - if (badge > 0) { - context.fillStyle = '#3366CC'; - context.fillRect (xRect, 6, 16, 16); - context.fillStyle = '#fff'; - context.font = '9px Arial'; - context.fillText('badge'.length <= 3 ? 'badge' : '>1K', xText, 14); - } - var arr = context.getImageData(0, 0, 16, 16).data, tmp = []; - for (var i = 0, n = arr.length; i < n; i += 4) { //r,g,b,alpha - [tmp[i + 1], tmp[i + 3]] = [arr[i + 1], arr[i + 3]]; - [tmp[i + 2], tmp[i]] = [arr[i], arr[i + 2]]; - } - self.postMessage(tmp); - }; - img.src = 'source'; - } - var color = badge > 0 ? 'red' : badge === -1 ? 'blue' : 'gray'; - if (config.ui && config.ui.pattern === 1) { - switch (color) { - case 'blue': - color = 'gray'; - break; - case 'gray': - color = 'blue'; - break; - } - } - var worker = pageWorker.Page({ - contentURL: data.url('firefox/notification.html'), - contentScript: ('(' + getIcon) - .replace(/source/g, data.url('icons/tray/' + color + '.png')) - .replace(/badge/g, badge) + - ')();', - onMessage: function (arr) { - d.resolve(arr); - worker.destroy(); - } - }); - return d.promise; -} - -// hWnd -function getHWND () { - // Hidden Window - var hiddenWindow = Cc['@mozilla.org/appshell/appShellService;1'] - .getService(Ci.nsIAppShellService).hiddenDOMWindow; - // Getting base Window - var baseWindow = hiddenWindow.QueryInterface(Ci.nsIInterfaceRequestor) - .getInterface(Ci.nsIWebNavigation) - .QueryInterface(Ci.nsIDocShellTreeItem) - .treeOwner - .QueryInterface(Ci.nsIInterfaceRequestor) - .nsIBaseWindow; - return ctypes.cast(ctypes.uintptr_t(baseWindow.nativeHandle), ctypes.voidptr_t); -} -var hWnd = getHWND(); - -// preparing notification -var nid = new NOTIFYICONDATAW; -nid.hWnd = hWnd; -nid.uID = config.tray ? config.tray.id.unique : 24342; -nid.uCallbackMessage = config.tray ? config.tray.id.msg : 665; -nid.uTimeoutAndVersion = (config.tray ? config.tray.time.notification : 3) * 1000; -nid.uFlags = 0x00000001 /* NIF_MESSAGE */ | 0x00000002 /* NIF_ICON */ | 0x00000004 /* NIF_TIP */ /* | 0x000000010 NIF_INFO */; -nid.dwInfoFlags = 0x00000001 /* NIIF_INFO */; -//nid.szInfoTitle = _('gmail'); // 'Balloon Tooltip' title -nid.cbSize = (function () { - function FIELD_OFFSET(aType, aField, aPos) { - var addr2nb = (a) => ctypes.cast(a, ctypes.unsigned_long).value, - s = new aType(), - addr_field = typeof(aPos) === 'undefined' ? addr2nb(s.addressOfField(aField)) : addr2nb(s[aField].addressOfElement(aPos)); - return addr_field - addr2nb(s.address()); - } - if (version >= 60) { //Vista - return NOTIFYICONDATAW.size; - } - if (version >= 51) { //XP - return FIELD_OFFSET(NOTIFYICONDATAW, 'hBalloonIcon'); - } - if (version >= 50) { //2K - return FIELD_OFFSET(NOTIFYICONDATAW, 'guidItem'); - } - return FIELD_OFFSET(NOTIFYICONDATAW, 'szTip', 64); -})(); -// callback listener -var callback; -var proxyWndProc = WNDPROC (function (hWnd, uMsg, wParam, lParam) { - if (config.tray && uMsg === config.tray.id.msg && (+lParam === 513 || +lParam === 517)) { - if (callback) { - callback(); - } - } - return user32.DefWindowProcW(hWnd, uMsg, wParam, lParam); -}); - -var oldOffset; -if (config.tray && config.tray.doTrayCallback) { - oldOffset = user32.SetWindowLongPtrW(hWnd, -4 /* GWLP_WNDPROC */, ctypes.cast(proxyWndProc, LONG_PTR)); -} - -var isInstalled = false; -exports.set = function (badge, msg) { - if (!config.tray.show) { - return; - } - //nid.szInfo = msg; - nid.szTip = msg.substring(0, 63); // maximum of 64 characters - icon(badge).then(function (arr) { - var uint8Array = new Uint8Array(arr); - nid.hIcon = user32.CreateIcon(hWnd, 16, 16, 1, 32, uint8Array, uint8Array); - shell32.Shell_NotifyIconW( - isInstalled ? 0x00000001 /* NIM_MODIFY */ : 0x00000000 /* NIM_ADD */, - nid.address() - ); - isInstalled = true; - }); -}; -exports.remove = function () { - if (!isInstalled) { - return; - } - shell32.Shell_NotifyIconW(0x00000002 /* NIM_DELETE */, nid.address()); - isInstalled = false; -}; -exports.callback = function (c) { - callback = c; -}; - -unload.when(function () { - exports.remove(); - if (oldOffset) { - user32.SetWindowLongPtrW(hWnd, -4, oldOffset); - } -}); diff --git a/src/lib/wrapper/firefox/tray/wrapper.js b/src/lib/wrapper/firefox/tray/wrapper.js deleted file mode 100644 index a247e6e4..00000000 --- a/src/lib/wrapper/firefox/tray/wrapper.js +++ /dev/null @@ -1,19 +0,0 @@ -var {Cc, Ci, Cu} = require('chrome'), - os = require("sdk/system").platform, - config = require('../../../config'); - -var tray = (function () { - if (os === "winnt") { - return require('./winnt/tray'); - } - if (os === "darwin") { - return require('./darwin/tray'); - } - return { - set: function () {}, - remove: function () {}, - callback: function () {} - }; -})(); - -exports.tray = tray; \ No newline at end of file diff --git a/src/lib/wrapper/firefox/userstyles.js b/src/lib/wrapper/firefox/userstyles.js deleted file mode 100644 index 19cb8915..00000000 --- a/src/lib/wrapper/firefox/userstyles.js +++ /dev/null @@ -1,55 +0,0 @@ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -"use strict"; - -const { Cc, Ci } = require("chrome"); -const unload = require("sdk/system/unload").when; - -const sss = Cc["@mozilla.org/content/style-sheet-service;1"] - .getService(Ci.nsIStyleSheetService); - -function getURI(aURL) Cc["@mozilla.org/network/io-service;1"] - .getService(Ci.nsIIOService).newURI(aURL, null, null); - -function setOptions(url, options) { - let newOptions = {}; - options = options || {}; - - newOptions.uri = getURI(url); - newOptions.type = (options.type || 'user').toLowerCase(); - newOptions.type = (newOptions.type == 'agent') ? sss.AGENT_SHEET : sss.USER_SHEET; - - return newOptions; -}; - -/** - * Load various packaged styles for the add-on and undo on unload - * - * @usage load(aURL): Load specified style - * @param [string] aURL: Style file to load - * @param [object] options: - */ -const loadSS = exports.load = function loadSS(url, options) { - let { uri, type } = setOptions(url, options); - - // load the stylesheet - sss.loadAndRegisterSheet(uri, type); - - // unload the stylesheet on unload - unload(unregisterSS.bind(null, url, options)); -}; - -const registeredSS = exports.registered = function registeredSS(url, options) { - let { uri, type } = setOptions(url, options); - - // check that the stylesheet is registered - return !!sss.sheetRegistered(uri, type); -}; - -const unregisterSS = exports.unload = function unregisterSS(url, options) { - let { uri, type } = setOptions(url, options); - - // unregister the stylesheet - sss.unregisterSheet(uri, type); -}; diff --git a/src/locale/el.properties b/src/locale/el.properties deleted file mode 100644 index fdd64823..00000000 --- a/src/locale/el.properties +++ /dev/null @@ -1,124 +0,0 @@ -label_9=Για 5 ώρες -options_notifications_19=Windows email ειδοποίηση -options_notifications_17=Checker Plus ειδοποίηση καμπάνας -options_notifications_13=Ανοιγμα της γραμμής εργαλείων όταν κάνετε κλικ στο εικονίδιο ειδοποίησης στην γραμμή εργασιών (μόνο για Windows, beta) -options_timings_l7=Να μην γίνεται έλεγχος για νέα email κατά την εκκίνηση για (σε δευτερόλεπτα): -label_4=Για 5 λεπτά -options_timings_l3=Υπενθύμιση για όλα τα μη αναγνωσμένα email κάθε (σε λεπτά): -options_gmail_1=Πρωτοβάθμιος λογαριασμός (/mail/u/0/) -options_gmail_10=Λάβετε ειδοποιήσεις για τις εξής ετικέτες και τους λογαριασμούς: -options_notifications_1=Κοινοποίηση επιφάνειας εργασίας οθόνης για νέα email -options_notifications_9=Αναπαραγωγή ήχου ειδοποίησης για νέα email -label_6=Για 30 λεπτά -options_misc_8=Επαναφορά όλων των ρυθμίσεων στις εργοστασιακές ρυθμίσεις -options_timings_l4=Ρυθμίστε την τιμή στο μηδέν για μη-περιοδικές υπενθυμίσεις. -options_tab_6=Άνοιγμα λογαριασμού Gmail σε νέο παράθυρο -options_notifications_25=Στο safari πιθανότατα οι προεπιλεγμένες ειδοποιήσεις ήχου να μην παίζουν σωστά, αν ναι, χρησιμοποιήστε ένα αρχείο ήχου ως κοινοποίηση. -options_toolbar_15=Μέσαιο κλικ στην μπάρα εργαλείων για -options_toolbar_10=Το ελάχιστο ύψος είναι 500px. -options_notifications_26=Εμφανιση πάντα κοινοποίησης στον δίσκο (μόνο για Windows) -label_3=Απενεργοποίηση όλων των ειδοποιήσεων -options_empty=δεν ορίζεται -options_notifications_3=Η επιλογή αυτή δεν μπορεί να λειτουργήσει με βάση το λειτουργικό σας σύστημα. -options_timings=Χρονοδιάγραμμα -options_gmail_5=Τεταρτογενής λογαριασμός (/mail/u/3/) -label_5=Για 15 λεπτά -options_misc_9=Red color for "No Unread" and gray color for "Disconnected" -options_notifications_27=Κοινοποίηση στον δίσκος θα εμφανίζεται ακόμη και αν δεν υπάρχει μη αναγνωσμένο μήνυμα. -options_misc_1=Ταξινόμηση λογαριασμών αλφαβητικά -tooltip_1=Αριστερό κλικ: Ανοίξτε το Gmail ή το παράθυρο προεπισκόπησης αλληλογραφίας -notification=Από: [author_email] [break] Τίτλος: [τίτλος] [break] Περίληψη: [περίληψη] -options_tab=Άνοιγμα καρτέλας: -log_into_your_account=Παρακαλούμε συνδεθείτε στον λογαριασμό σας -label_10=Ενεργοποίηση ειδοποιήσεων -options_notifications_23=Ένταση ήχου κοινοποιήσεως -options_timings_l2=Ελάχιστο χρονικό διάστημα είναι 10 δευτερόλεπτα. -options_toolbar_11=Συντομεύσεις πληκτρολογίου υποστήριξης στον πίνακα εργαλείων -options_gmail_9=Μερικές δημοφιλείς ετικέτες: "Εισερχόμενα", "σημαντικό", "^ smartlabel προσωπικά", "^ smartlabel ενημερωτικό δελτίο", "^ κοινοποίηση smartlabel", και "^ smartlabel_group" -options_misc_13=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_6=Να μην εμφανίζεται ειδοποίηση στην επιφάνεια εργασίας για να προειδοποιήσει ότι η ιστοσελίδα του Gmail είναι ήδη ανοικτή -options_notifications_4=Μορφή κοινοποίησης -label_2=Ρυθμίσεις -options_toolbar_14=Αν προτιμάτε μονο το κείμενο σε λειτουργία πλήρους περιεχομένου, αποεπιλέξτε το πλαίσιο. -options_notifications_18=Checker Plus Ειδοποίηση κωδώνισματος -options_tab_5=Άνοιγμα λογαριασμού Gmail σε μια καρτέλα στον φόντο -label_7=Για 1 ώρα -msg_2=Ο σύνδεσμος έχει αντιγραφεί στο πρόχειρο. -options_title=Επιλογές - Gmail ™ Notifier -gmail=Gmail™ Notifier -options_toolbar_8=Το ελάχιστο πλάτος είναι 500px. -options_notifications_16=Gmail Notifier προεπιλεγμένη ειδοποίηση -options_misc_14=Do not show the exact badge number when the number of unread emails is greater than 999 -options_notifications_14=Αυτό το χαρακτηριστικό είναι ιδιαίτερα πειραματικό και θα μπορούσε να κάνει τον Firefox browser ασταθή. [Επανεκκίνηση απαιτείται]. -options_gmail_3=Δευτερεύον λογαριασμός (/mail/u/1/) -options_notifications_11=Εμφανιση "Ειδοποιήσεις της γραμμής εργασιών του Windows" ή "Mac OS Dock κοινοποίησης" -options_notifications_2=Εμφάνιση κοινοποίησης επιφάνειας εργασίας για (σε δευτερόλεπτα): -log_in_to_your_account=Παρακαλούμε συνδεθείτε στον Gmail λογαριασμό σας -options_notifications_15=Ηχητική ειδοποίηση -options_notifications_21=Προσδιορισμενος ηχος απο τον χρηστη -options_toolbar_9=Το υψος της γραμμής εργαλείων σε κατάσταση πλήρους περιεχομένου είναι (σε εικονοστοιχεία): -options_toolbar_1=Γραμμή εργαλείων συμπεριφορά κουμπιού -unknown=άγνωστο -options_notifications_8=Για να μην έχουν καμία περικοπή τα αποσιωπητικά, χρησιμοποιήστε ένα μεγάλο αριθμό εδώ. -options_donation=Κάντε μια δωρεά -msg_3=Το επιλεγμένο κείμενο εχει αντιγράφει στο πρόχειρο. -options_misc_7=Εμφάνιση σελίδας υποδοχής για αναβάθμιση -options_gmail=Gmail: -label_1=Ανανέωση -options_notifications_5=Διαθέσιμες μεταβλητές: -options_notifications_24=Ένταση είναι ένας αριθμός μεταξύ 0 έως 100, όπου 100 είναι η υψηλότερη ένταση (προεπιλογή). -options_notifications_10=Σημείωση για τους χρήστες του Mac. Από το Firefox 28.0, όλες οι ειδοποιήσεις στην επιφάνεια εργασίας διεκπεραιώνονται από το Mac Κέντρο Ειδοποίησης που προκαλεί ένα επιπλέον ήχο ειδοποίησης. Θα πρέπει είτε να απενεργοποιήσετε αυτο τον ήχο ειδοποίησης ή αυτόν που παράγεται από το Κέντρο Ειδοποίησης. -options_misc_2=Ο τύπος προεπιλεγμένης σειράς που έχει συνδεθεί -options_toolbar_2=Πάντα ανοικτό παράθυρο προεπισκόπησης email -popup_settings=Ρυθμίσεις -options_gmail_4=Τριτοβάθμιος λογαριασμός (/mail/u/2/) -options_toolbar_5=Εμφάνιση μόνο συνοπτικά -options_notifications_12=Το Taskbar notifications δεν υποστηρίζεται απο το λειτουργικό σύστημα Linux αυτή τη στιγμή. -msg_1=Η καρτέλα είναι ήδη ανοικτή. Κάντε κλικ στο κουμπί της γραμμής εργαλείων για να ανοίξετε το Gmail σε μια νέα καρτέλα, ή να μεταβείτε σε μια υπάρχουσα Gmail καρτέλα. -options_misc_5=Μπλε χρώμα για "Μη Αναγνωσμένα" και γκρι χρώμα για "Αποσυνδεση" -options_timings_l8=Ρυθμίστε την τιμή στο μηδέν για κανένα έλεγχο e-mail μέχρι την πρώτη χειροκίνητη ανανέωση [Δεν διατίθεται στο Safari]. -tooltip_3=Δεξί κλικ: Επιλογές Λογαριασμού -options_notifications=Ειδοποιήσεις: -options_timings_l6=Πυρκαγιές με μη μηδενική τιμή, κοινοποίηση και ηχητική ειδοποίηση τόσο στην επιφάνεια εργασίας (παρόμοιο με νέα άφιξη email) για πάντα, αν έχετε μη αναγνωσμένα email(s). -options_notifications_22=Αν το πρόγραμμα περιήγησης σας δεν παίζει τον ήχο κοινοποίησης, προσπαθήστε να τον μετατρέψετε σε μια απλή μορφή WAV χρησιμοποιώντας ένα online εργαλείο μετατροπής. -options_tab_1=Αναζήτηση για έναν ανοικτό λογαριασμό Gmail μόνο στο ενεργό παράθυρο -options_timings_l1=Έλεγχος για νέα e-mail κάθε (σε δευτερόλεπτα): -options_toolbar_4=Λειτουργία γραμμής εργαλείων -toolbar_label=Gmail™ Notifier -options_misc_3=Το σχέδιο χρώματος γραμμής εργαλείων είναι -options_gmail_12=Ξεχωριστές τροφοδοσίες με "," (κόμμα). Δείγμα τροφοδοσίας: https://mail.google.com/mail/u/0/feed/atom/inbox -options_toolbar_12=!: Αναφορά ως ανεπιθύμητο, #: Απορρίμματα, και: Αρχείο, Shift + I: Επισήμανση ως διαβάσμενο -options_px=px -options_misc_11=By setting this preference to zero, you will receive neither desktop nor sound notifications; however, you will still get badge notification. -options_notifications_20=Ο ήχος ορίζεται από τον χρήστη -and=και -options_tab_7=Πάντα να χρησιμοποιείτε κενό καρτελών αντί να ανοίγει μια νέα καρτέλα, όταν είναι ανοικτή στην καρτέλα ενεργοποιείται -options_toolbar_3=Άνοιγμα λογαριασμού Gmail αν μόνο ένας λογαριασμός είναι συνδεδεμένος -options_gmail_7=Σκηνικός λογαριασμός (/mail/u/5/) -options_toolbar=Γραμμη Εργαλειων: -options_notifications_6=Περικόψτε ειδοποιήσεις περισσότερο από -tooltip_2=Μεσαίο (ή Ctrl + Left) κλικ: Ανανέωση όλων των λογαριασμών -options_tab_3=Άνοιγμα νέου λογαριασμού Gmail δίπλα στην ενεργή καρτέλα -options_gmail_8=Σήμανση ως αναγνωσμένο μήνυμα κατά την αρχειοθέτηση -options_toolbar_17=Άνοιγμα του κύριου Gmail λογαριασμου -options_notifications_7=χαρακτήρες για [τίτλος] και [περίληψη] πεδία. -options_misc_10=Only fire desktop and sound notifications when email has arrived in less than (in minutes): -label_8=Για 2 ώρες -msg_4=Σημείωση: Για να λειτουργήσει σωστά το notifier, θα πρέπει να είστε συνδεδεμένοι στον Google λογαριασμό σας. -options_toolbar_6=Εμφάνιση πλήρους περιεχομένου -options_gmail_11=Προσαρμοσμένες τροφοδοσίες: -options_tab_2=Μην ψάξετε σε άλλα παράθυρα του προγράμματος περιήγησης για ανοικτούς λογαριασμούς Gmail. Εάν το Gmail δεν είναι ανοικτό στο ενεργό παράθυρο, ανοίξτε μια νέα καρτέλα. -label_11=Συντάξτε ένα e-mail -options_toolbar_7=Πλάτος γραμμής εργαλείων του πίνακα σε κατάσταση πλήρους περιεχομένου (σε εικονοστοιχεία): -options_timings_l5=Ελάχιστη περίοδος είναι 5 λεπτά. -options_misc=Διάφορα: -options_gmail_2=Ξεχωριστές ετικέτες με "," (κόμμα). -options_misc_4=Γκρι χρώμα για "Μη Αναγνωσμένα" και μπλε χρώμα για "Αποσυνδεση" -options_toolbar_13=Απόδοση e-mail ως HTML σε λειτουργία πλήρους περιεχομένου -options_toolbar_16=Ανανέωση όλων των λογαριασμών -options_gmail_6=Πενταδικός λογαριασμός (/mail/u/4/) -options_inshort=Πολλαπλές ετικέτες και λογαριασμοι κοινοποιών για το Google Mail (Gmail). -options_misc_12=Do not include login details in the tooltip text -options_tab_4=Άνοιγμα λογαριασμού Gmail στην ενεργή καρτέλα -label_12=Άνοιγμα αρχικής σελίδας -description=Πολλαπλές ετικέτες και κοινωποιηση λογαριασμού για το Google Mail (Gmail) diff --git a/src/package.json b/src/package.json deleted file mode 100644 index 18cb5166..00000000 --- a/src/package.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "fullName": "Gmail Notifier (restartless)", - "name": "ignotifier", - "description": "Multiple label and account notifier for Google Mail (Gmail)", - "id": "jid0-GjwrPchS3Ugt7xydvqVK4DQk8Ls@jetpack", - "license": "mozilla public license 1.1", - "version": "0.5.10", - "author": "InBasic", - "contributors": [ - "CaTz", - "ecaron" - ], - "lib": "lib", - "main": "./lib/common.js", - "url": "http://firefox.add0n.com/gmail-notifier.html", - "icon": "data/icons/red/32.png", - "icon64": "data/icons/red/64.png", - "permissions": { - "private-browsing": true, - "unsafe-content-script": true, - "cross-domain-content": ["file:///"] - } -} - - - diff --git a/builds/packed/icon.png b/v1/builds/packed/icon.png similarity index 100% rename from builds/packed/icon.png rename to v1/builds/packed/icon.png diff --git a/builds/packed/icon64.png b/v1/builds/packed/icon64.png similarity index 100% rename from builds/packed/icon64.png rename to v1/builds/packed/icon64.png diff --git a/v1/builds/unpacked/chrome/_locales/bg/messages.json b/v1/builds/unpacked/chrome/_locales/bg/messages.json new file mode 100644 index 00000000..e1744ae3 --- /dev/null +++ b/v1/builds/unpacked/chrome/_locales/bg/messages.json @@ -0,0 +1,690 @@ +{ + "label_9": { + "message": "За 5 часа", + "description": "" + }, + "options_notifications_19": { + "message": "Оповестяване за поща на Уиндоус", + "description": "" + }, + "options_notifications_17": { + "message": "Камбана", + "description": "" + }, + "options_notifications_13": { + "message": "Отваряне на панела при щракване върху иконката в лентата на задачите (Само за Уиндоус, в бета)", + "description": "" + }, + "options_notifications_30": { + "message": "Обединяване на всички едновременни известия на работния плот в едно известие", + "description": "" + }, + "settings_open_label": { + "message": "Отваряне на настройките", + "description": "" + }, + "options_timings_l7": { + "message": "Без проверка за нови писма при стартиране (в секунди):", + "description": "" + }, + "label_4": { + "message": "За 5 минути", + "description": "" + }, + "options_timings_l3": { + "message": "Напомняне за непрочетени писма на всеки (в минути):", + "description": "" + }, + "popup_msg_4": { + "message": "Преди 1 час", + "description": "" + }, + "options_gmail_1": { + "message": "Главна сметка (/mail/u/0/)", + "description": "" + }, + "options_gmail_10": { + "message": "Получаване на известия за следните етикети и сметки:", + "description": "" + }, + "options_notifications_1": { + "message": "Показване на известия на работния плот за нови писма", + "description": "" + }, + "options_notifications_9": { + "message": "Свирене на звуково оповестяване за нови писма", + "description": "" + }, + "label_6": { + "message": "За 30 минути", + "description": "" + }, + "options_misc_8": { + "message": "Нулиране на всички настройки към първоначалните", + "description": "" + }, + "options_notifications_28": { + "message": "Изключване на всички известия за избран период (в минути):", + "description": "" + }, + "options_timings_l4": { + "message": "Задайте стойността на нула за непериодични напомняния.", + "description": "" + }, + "options_notifications_32": { + "message": "името или писмото съдържа", + "description": "" + }, + "options_tab_6": { + "message": "Отваряне на пощата в нов прозорец", + "description": "" + }, + "options_notifications_25": { + "message": "В Сафари първоначалното звуково известяване може да не работи. Ако е така, използвайте потребителски файл.", + "description": "" + }, + "options_toolbar_15": { + "message": "Натискане със средното копче върху лентата", + "description": "" + }, + "options_toolbar_10": { + "message": "Минималната височина е 500 пиксела.", + "description": "" + }, + "popup_msg_10": { + "message": "Януари", + "description": "" + }, + "options_notifications_26": { + "message": "Винаги да се показват известия в областта за уведомяване (само за Уиндоус)", + "description": "" + }, + "label_3": { + "message": "Изключване на известията", + "description": "" + }, + "label_13": { + "message": "За избран период", + "description": "" + }, + "options_empty": { + "message": "не е обозначено", + "description": "" + }, + "options_notifications_3": { + "message": "Тази функция може да не работи на вашата операционна система.", + "description": "" + }, + "options_timings": { + "message": "Разписание", + "description": "" + }, + "options_gmail_5": { + "message": "Четвърта сметка (/mail/u/3/)", + "description": "" + }, + "label_5": { + "message": "За 15 минути", + "description": "" + }, + "options_misc_9": { + "message": "Червен цвят за \"Няма непрочетени\" и сив цвят за \"Няма връзка\"", + "description": "" + }, + "popup_msg_5": { + "message": "часа назад", + "description": "" + }, + "options_notifications_27": { + "message": "Известията в областта за уведомяване ще се показват дори ако няма непрочетени писма.", + "description": "" + }, + "options_misc_1": { + "message": "Подреждане на сметките по азбучен ред", + "description": "" + }, + "tooltip_1": { + "message": "Щракване с ляво копче: Отваряне на пощата или панела за предварителен преглед", + "description": "" + }, + "notification": { + "message": "От: [author_email][break] Заглавие: [title][break] Обобщение: [summary]", + "description": "" + }, + "popup_trash": { + "message": "Кошче", + "description": "" + }, + "options_tab": { + "message": "Отваряне на подпрозорец:", + "description": "" + }, + "log_into_your_account": { + "message": "Моля, влезте в сметката си", + "description": "" + }, + "label_10": { + "message": "Включване на известията", + "description": "" + }, + "options_notifications_23": { + "message": "Гръмкостта на звуковото оповестяване е", + "description": "" + }, + "options_timings_l2": { + "message": "Минималният период е 10 секунди.", + "description": "" + }, + "options_toolbar_11": { + "message": "Поддръжка на клавишни комбинации в панела", + "description": "" + }, + "options_gmail_9": { + "message": "Някои популярни етикети: \"Входяща поща\", \"Важни\", \"^smartlabel_personal\", \"^smartlabel_newsletter\", \"^smartlabel_notification\" и \"^smartlabel_group\"", + "description": "" + }, + "popup_msg_17": { + "message": "Август", + "description": "" + }, + "popup_msg_15": { + "message": "Юни", + "description": "" + }, + "options_notifications_34": { + "message": "обобщението на писмото съдържа", + "description": "" + }, + "label_14": { + "message": "Вписани сметки", + "description": "" + }, + "options_misc_13": { + "message": "По подразбиране, известителят обновява подсказките на копчето с входна информация. Ако изчистите отметката, текста в подсказката ще остане на първоначалната стойност.", + "description": "" + }, + "options_misc_6": { + "message": "Show desktop notification to warn that Gmail is already opened in the active tab", + "description": "" + }, + "popup_read": { + "message": "Отбелязване като прочетено", + "description": "" + }, + "options_notifications_4": { + "message": "Формат на известията", + "description": "" + }, + "settings_open_title": { + "message": "Отваряне на страницата с настройките", + "description": "" + }, + "label_2": { + "message": "Настройки", + "description": "" + }, + "options_toolbar_14": { + "message": "Ако предпочитате само текст в режима на цяло съдържание, махнете отметката.", + "description": "" + }, + "options_notifications_18": { + "message": "Звънене", + "description": "" + }, + "options_tab_5": { + "message": "Отваряне на пощата в подпрозорец на заден план", + "description": "" + }, + "label_7": { + "message": "За 1 час", + "description": "" + }, + "popup_archive": { + "message": "Архив", + "description": "" + }, + "msg_2": { + "message": "Връзката е копирана в буфера.", + "description": "" + }, + "options_title": { + "message": "Настройки", + "description": "" + }, + "popup_msg_13": { + "message": "Април", + "description": "" + }, + "popup_msg_9_format": { + "message": "Преди %d месец(а)", + "description": "" + }, + "popup_msg_11": { + "message": "Февруари", + "description": "" + }, + "popup_open_inbox": { + "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.", + "description": "" + }, + "gmail": { + "message": "Известител за пощата на Гугъл", + "description": "" + }, + "popup_msg_6": { + "message": "Вчера", + "description": "" + }, + "options_toolbar_8": { + "message": "Минималната ширина е 500 пиксела.", + "description": "" + }, + "options_notifications_16": { + "message": "Оповестяване по подразбиране", + "description": "" + }, + "options_misc_14": { + "message": "Без показване на точния брой в значката, когато непрочетените писма надхвърлят 999", + "description": "" + }, + "popup_msg_18": { + "message": "Септември", + "description": "" + }, + "options_notifications_14": { + "message": "Тази функция е експериментална и може да направи разглеждача Файърфокс нестабилен. [Изисква се повторно пускане].", + "description": "" + }, + "options_gmail_3": { + "message": "Втора сметка (/mail/u/1/)", + "description": "" + }, + "options_notifications_11": { + "message": "Показване на \"Известие в лентата със задачи на Уиндоус\" или \"Известие в лентата на Макинтош\"", + "description": "" + }, + "options_notifications_2": { + "message": "Показване на известия на работния плот за (в секунди):", + "description": "" + }, + "log_in_to_your_account": { + "message": "Моля, влезте в профила си в пощата на Гугъл", + "description": "" + }, + "popup_of": { + "message": "of", + "description": "" + }, + "options_notifications_15": { + "message": "Звуковото известие по подразбиране е", + "description": "" + }, + "options_notifications_21": { + "message": "Потребителският оповестителен звук е", + "description": "" + }, + "options_toolbar_9": { + "message": "Височина на панела в режим на преглед на цялото съдържание (в пиксели):", + "description": "" + }, + "options_toolbar_1": { + "message": "Поведение на копчето на лентата", + "description": "" + }, + "unknown": { + "message": "неизвестно", + "description": "" + }, + "popup_msg_21": { + "message": "Декември", + "description": "" + }, + "popup_read_all": { + "message": "Отбелязване на всички като прочетени", + "description": "" + }, + "options_notifications_8": { + "message": "Ако искате да няма многоточие, използвайте по-голямо число.", + "description": "" + }, + "options_donation": { + "message": "Направете дарение", + "description": "" + }, + "msg_3": { + "message": "Избраният текст е копиран в буфера.", + "description": "" + }, + "options_misc_7": { + "message": "Показване на приветстващата страница при надграждане", + "description": "" + }, + "options_gmail": { + "message": "Поща на Гугъл:", + "description": "" + }, + "label_1": { + "message": "Обновяване", + "description": "" + }, + "options_notifications_5": { + "message": "Налични променливи:", + "description": "" + }, + "options_notifications_24": { + "message": "Гръмкостта е число между 0 и 100, където 100 е най-високото (по подразбиране).", + "description": "" + }, + "options_notifications_10": { + "message": "Бележка за потребителите на Макинтош. От Файърфокс 28.0, всички известия на работния плот ще се управляват от Центъра за известия, което поражда допълнително звуково оповестяване. Трябва да изключите или това оповестяване, или оповестяването в Центъра за известия.", + "description": "" + }, + "options_misc_2": { + "message": "По подразбиране се сортира по ред на влизане.", + "description": "" + }, + "options_toolbar_2": { + "message": "Винаги да се отваря панел с предварителен преглед", + "description": "" + }, + "popup_settings": { + "message": "настройки", + "description": "" + }, + "options_gmail_4": { + "message": "Трета сметка (/mail/u/2/)", + "description": "" + }, + "options_toolbar_5": { + "message": "Показване само на обобщение", + "description": "" + }, + "options_notifications_12": { + "message": "В момента не се поддържат известия в лентата със задачи под Линукс.", + "description": "" + }, + "options_notifications_35": { + "message": "За да изберете нов потребителски звук, първо изберете вграден звук и след това променете настройката на потребителски.", + "description": "" + }, + "msg_1": { + "message": "Подпрозорецът вече е отворен. Натиснете копчето на лентата, за да отворите пощата в нов подпрозорец или да преминете към вече отворен раздел.", + "description": "" + }, + "popup_refresh": { + "message": "Презареждане", + "description": "" + }, + "options_misc_5": { + "message": "Син цвят за \"Няма непрочетени\" и сив цвят за \"Няма връзка\"", + "description": "" + }, + "options_timings_l8": { + "message": "Задайте стойността на нула, за да не се проверява за нови писма до първото ръчно обновяване [Не е налично в Сафари].", + "description": "" + }, + "popup_msg_19": { + "message": "Октомври", + "description": "" + }, + "options_notifications_33": { + "message": "заглавието на писмото съдържа", + "description": "" + }, + "tooltip_3": { + "message": "Щракване с дясно копче: Избор на сметка", + "description": "" + }, + "popup_date_format": { + "message": "%mm %dd, %yy", + "description": "" + }, + "options_notifications": { + "message": "Известия:", + "description": "" + }, + "options_timings_l6": { + "message": "Ако имате непрочетени писма, стойностите, различни от нула, пускат оповестителен звук и известия на работния плот безкрайно.", + "description": "" + }, + "popup_msg_12": { + "message": "Март", + "description": "" + }, + "options_notifications_22": { + "message": "Ако четецът ви не възпроизвежда потребителския звук, опитайте се да го преобразувате във формат WAV.", + "description": "" + }, + "options_tab_1": { + "message": "Търсене за отворена сметка само в активния прозорец", + "description": "" + }, + "popup_msg_7_format": { + "message": "Преди %d дена", + "description": "" + }, + "options_timings_l1": { + "message": "Проверка за нови писма на всеки (в секунди):", + "description": "" + }, + "options_toolbar_4": { + "message": "Режим на панела", + "description": "" + }, + "toolbar_label": { + "message": "Известител за пощата на Гугъл", + "description": "" + }, + "popup_msg_1": { + "message": "Току-що", + "description": "" + }, + "popup_open_settings": { + "message": "Отваряне на настройките", + "description": "" + }, + "options_misc_3": { + "message": "Цвят на иконката на лентата", + "description": "" + }, + "options_gmail_12": { + "message": "Отделяйте емисиите със \",\" (запетая). Примерна емисия: https://mail.google.com/mail/u/0/feed/atom/inbox", + "description": "" + }, + "options_toolbar_12": { + "message": "!: Докладване като спам, #: Кошче, e: Архив, Shift + i: Отбелязване като прочетено.", + "description": "" + }, + "options_px": { + "message": "px", + "description": "" + }, + "options_misc_11": { + "message": "Ако стойността се зададе на нула, няма да получавате нито звукови оповестявания, нито известия на работния плот. Ще работи само значката за известия.", + "description": "" + }, + "options_notifications_20": { + "message": "Потребителски звук", + "description": "" + }, + "and": { + "message": "и", + "description": "" + }, + "options_tab_7": { + "message": "Винаги да се използват празни подпрозорци вместо да се отваря нов, когато е включено отварянето в подпрозорци", + "description": "" + }, + "options_toolbar_3": { + "message": "Отваряне на пощата ако се използва само една сметка", + "description": "" + }, + "options_gmail_7": { + "message": "Шеста сметка (/mail/u/5/)", + "description": "" + }, + "popup_msg_8_format": { + "message": "Преди %d седмица(и)", + "description": "" + }, + "options_toolbar": { + "message": "Лента:", + "description": "" + }, + "options_notifications_6": { + "message": "Съкращаване на известията, по-дълги от", + "description": "" + }, + "popup_wait": { + "message": "Изчакайте...", + "description": "" + }, + "tooltip_2": { + "message": "Щракване със средно копче (или Контрол + Ляво): Обновяване на всички сметки", + "description": "" + }, + "options_notifications_29": { + "message": "Тази настройка е свързана с менюто на копчето -> изключване на всички известия -> избран период.", + "description": "" + }, + "options_tab_3": { + "message": "Отваряне на пощата до активния подпрозорец", + "description": "" + }, + "options_gmail_8": { + "message": "Отбелязване на писмото като прочетено при архвиране", + "description": "" + }, + "options_toolbar_17": { + "message": "Отваряне на главната сметка", + "description": "" + }, + "options_notifications_7": { + "message": "символа за полетата [заглавие] и [обобщение].", + "description": "" + }, + "options_misc_10": { + "message": "Да се появяват известия на работния плот и звукови оповестявания само за писма, пристигнали по-рано от (в минути):", + "description": "" + }, + "options_tab_8": { + "message": "Ignore opened Gmail tabs", + "description": "" + }, + "popup_no_subject": { + "message": "(няма тема)", + "description": "" + }, + "msg_5": { + "message": "Изберете звуков файл", + "description": "" + }, + "popup_msg_2": { + "message": "Преди 1 минута", + "description": "" + }, + "popup_msg_16": { + "message": "Юли", + "description": "" + }, + "label_8": { + "message": "За 2 часа", + "description": "" + }, + "msg_4": { + "message": "Бележка: За да работи правилно известителя, трябва да сте влезли в профила си в Гугъл.", + "description": "" + }, + "popup_msg_20": { + "message": "Ноември", + "description": "" + }, + "options_toolbar_6": { + "message": "Показване на цялото съдържание", + "description": "" + }, + "options_gmail_11": { + "message": "Потребителски емисии:", + "description": "" + }, + "options_tab_2": { + "message": "Без търсене в други прозорци за отворени сметки. Ако пощата не е отворена в активния прозорец, да се отвори нов подпрозорец.", + "description": "" + }, + "label_11": { + "message": "Писане на писмо", + "description": "" + }, + "options_toolbar_7": { + "message": "Ширина на панела в режим на преглед на цялото съдържание (в пиксели):", + "description": "" + }, + "options_notifications_31": { + "message": "Звуково известие по избор", + "description": "" + }, + "options_timings_l5": { + "message": "Минималният период е 5 минути.", + "description": "" + }, + "options_misc": { + "message": "Разни:", + "description": "" + }, + "options_gmail_2": { + "message": "Разделяйте етикетите със \",\" (запетая).", + "description": "" + }, + "options_misc_4": { + "message": "Сив цвят за \"Няма непрочетени\" и син цвят за \"Няма връзка\"", + "description": "" + }, + "options_toolbar_13": { + "message": "Извеждане на писмата като ЕМХТ (HTML) в режима на цяло съдържание", + "description": "" + }, + "options_toolbar_16": { + "message": "Обновяване на всички сметки", + "description": "" + }, + "options_gmail_6": { + "message": "Пета сметка (/mail/u/4/)", + "description": "" + }, + "popup_msg_14": { + "message": "Май", + "description": "" + }, + "options_inshort": { + "message": "Известител за няколко профила в пощата на Гугъл (Джимейл).", + "description": "" + }, + "options_misc_12": { + "message": "Без входни детайли в подсказките", + "description": "" + }, + "options_tab_4": { + "message": "Отваряне на пощата в активния подпрозорец", + "description": "" + }, + "popup_msg_3_format": { + "message": "Преди %d минути", + "description": "" + }, + "label_12": { + "message": "Отваряне на въпросника", + "description": "" + }, + "description": { + "message": "Известител за няколко профила в пощата на Гугъл (Джимейл)", + "description": "" + }, + "popup_spam": { + "message": "Спам", + "description": "" + } +} \ No newline at end of file diff --git a/src/_locales/el/messages.json b/v1/builds/unpacked/chrome/_locales/el/messages.json similarity index 70% rename from src/_locales/el/messages.json rename to v1/builds/unpacked/chrome/_locales/el/messages.json index a5a4f9b2..073c67ad 100644 --- a/src/_locales/el/messages.json +++ b/v1/builds/unpacked/chrome/_locales/el/messages.json @@ -15,6 +15,14 @@ "message": "Ανοιγμα της γραμμής εργαλείων όταν κάνετε κλικ στο εικονίδιο ειδοποίησης στην γραμμή εργασιών (μόνο για Windows, beta)", "description": "" }, + "options_notifications_30": { + "message": "Συνδυάστε όλες τις ταυτόχρονες ειδοποιήσεις στην επιφάνεια εργασίας σε μια ενιαία κοινοποίηση", + "description": "" + }, + "settings_open_label": { + "message": "Ανοίξτε τις Επιλογές", + "description": "" + }, "options_timings_l7": { "message": "Να μην γίνεται έλεγχος για νέα email κατά την εκκίνηση για (σε δευτερόλεπτα):", "description": "" @@ -27,6 +35,10 @@ "message": "Υπενθύμιση για όλα τα μη αναγνωσμένα email κάθε (σε λεπτά):", "description": "" }, + "popup_msg_4": { + "message": "1 ώρα πριν", + "description": "" + }, "options_gmail_1": { "message": "Πρωτοβάθμιος λογαριασμός (/mail/u/0/)", "description": "" @@ -51,10 +63,18 @@ "message": "Επαναφορά όλων των ρυθμίσεων στις εργοστασιακές ρυθμίσεις", "description": "" }, + "options_notifications_28": { + "message": "Απενεργοποίηση όλων των ειδοποιήσεων για μια προσαρμοσμένη χρονική περίοδο (σε λεπτά):", + "description": "" + }, "options_timings_l4": { "message": "Ρυθμίστε την τιμή στο μηδέν για μη-περιοδικές υπενθυμίσεις.", "description": "" }, + "options_notifications_32": { + "message": "περιέχει όνομα ή email", + "description": "" + }, "options_tab_6": { "message": "Άνοιγμα λογαριασμού Gmail σε νέο παράθυρο", "description": "" @@ -71,6 +91,10 @@ "message": "Το ελάχιστο ύψος είναι 500px.", "description": "" }, + "popup_msg_10": { + "message": "Ιανουάριος", + "description": "" + }, "options_notifications_26": { "message": "Εμφανιση πάντα κοινοποίησης στον δίσκο (μόνο για Windows)", "description": "" @@ -79,6 +103,10 @@ "message": "Απενεργοποίηση όλων των ειδοποιήσεων", "description": "" }, + "label_13": { + "message": "Για μια προσαρμοσμένη χρονική περίοδο", + "description": "" + }, "options_empty": { "message": "δεν ορίζεται", "description": "" @@ -100,7 +128,11 @@ "description": "" }, "options_misc_9": { - "message": "Red color for \"No Unread\" and gray color for \"Disconnected\"", + "message": "Κόκκινο χρώμα για \"Μη Αναγνωσμένα\" και γκρι χρώμα για \"Ασύνδετα\"", + "description": "" + }, + "popup_msg_5": { + "message": "ώρες πριν", "description": "" }, "options_notifications_27": { @@ -119,6 +151,10 @@ "message": "Από: [author_email] [break] Τίτλος: [τίτλος] [break] Περίληψη: [περίληψη]", "description": "" }, + "popup_trash": { + "message": "Σκουπίδια", + "description": "" + }, "options_tab": { "message": "Άνοιγμα καρτέλας:", "description": "" @@ -147,18 +183,42 @@ "message": "Μερικές δημοφιλείς ετικέτες: \"Εισερχόμενα\", \"σημαντικό\", \"^ smartlabel προσωπικά\", \"^ smartlabel ενημερωτικό δελτίο\", \"^ κοινοποίηση smartlabel\", και \"^ smartlabel_group\"", "description": "" }, + "popup_msg_17": { + "message": "Αύγουστος", + "description": "" + }, + "popup_msg_15": { + "message": "Ιούνιος", + "description": "" + }, + "options_notifications_34": { + "message": "περιέχει περίληψη email", + "description": "" + }, + "label_14": { + "message": "Σύνδεση στους λογαριασμούς", + "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.", + "message": "Από προεπιλογή, ο κοινοποιών ενημερώνει κείμενο επεξήγησης του κουμπιού γραμμής εργαλείων με πληροφορίες σύνδεσης. Με την απενεργοποίηση της επιλογής αυτής, στο κείμενο επεξήγησης παραμένει η προεπιλεγμένη τιμή.", "description": "" }, "options_misc_6": { - "message": "Να μην εμφανίζεται ειδοποίηση στην επιφάνεια εργασίας για να προειδοποιήσει ότι η ιστοσελίδα του Gmail είναι ήδη ανοικτή", + "message": "Show desktop notification to warn that Gmail is already opened in the active tab", + "description": "" + }, + "popup_read": { + "message": "Σημείωσε ως Διαβασμένο", "description": "" }, "options_notifications_4": { "message": "Μορφή κοινοποίησης", "description": "" }, + "settings_open_title": { + "message": "Ανοίξτε τις επιλογές (ρυθμίσεις) σελίδας", + "description": "" + }, "label_2": { "message": "Ρυθμίσεις", "description": "" @@ -179,6 +239,10 @@ "message": "Για 1 ώρα", "description": "" }, + "popup_archive": { + "message": "Αρχείο", + "description": "" + }, "msg_2": { "message": "Ο σύνδεσμος έχει αντιγραφεί στο πρόχειρο.", "description": "" @@ -187,10 +251,34 @@ "message": "Επιλογές - Gmail ™ Notifier", "description": "" }, + "popup_msg_13": { + "message": "Απρίλιος", + "description": "" + }, + "popup_msg_9_format": { + "message": "%d μήνα(ες) πρίν", + "description": "" + }, + "popup_msg_11": { + "message": "Φεβρουάριος", + "description": "" + }, + "popup_open_inbox": { + "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.", + "description": "" + }, "gmail": { "message": "Gmail™ Notifier", "description": "" }, + "popup_msg_6": { + "message": "Εχθές", + "description": "" + }, "options_toolbar_8": { "message": "Το ελάχιστο πλάτος είναι 500px.", "description": "" @@ -200,7 +288,11 @@ "description": "" }, "options_misc_14": { - "message": "Do not show the exact badge number when the number of unread emails is greater than 999", + "message": "Να μην εμφανίζεται ο ακριβής αριθμός σημάτων όταν ο αριθμός των μη αναγνωσμένων μηνυμάτων ηλεκτρονικού ταχυδρομείου είναι μεγαλύτερος από 999", + "description": "" + }, + "popup_msg_18": { + "message": "Σεπτέμβριος", "description": "" }, "options_notifications_14": { @@ -223,8 +315,12 @@ "message": "Παρακαλούμε συνδεθείτε στον Gmail λογαριασμό σας ", "description": "" }, + "popup_of": { + "message": "από", + "description": "" + }, "options_notifications_15": { - "message": "Ηχητική ειδοποίηση ", + "message": "Ο προ επιλεγμένος ήχος ειδοποίησης είναι", "description": "" }, "options_notifications_21": { @@ -243,6 +339,14 @@ "message": "άγνωστο", "description": "" }, + "popup_msg_21": { + "message": "Δεκέμβριος", + "description": "" + }, + "popup_read_all": { + "message": "Σημείωση όλων ως Αναγνωσμένα", + "description": "" + }, "options_notifications_8": { "message": "Για να μην έχουν καμία περικοπή τα αποσιωπητικά, χρησιμοποιήστε ένα μεγάλο αριθμό εδώ.", "description": "" @@ -252,7 +356,7 @@ "description": "" }, "msg_3": { - "message": "Το επιλεγμένο κείμενο εχει αντιγράφει στο πρόχειρο.", + "message": "Το επιλεγμένο κείμενο έχει αντιγράφει στο πρόχειρο.", "description": "" }, "options_misc_7": { @@ -303,10 +407,18 @@ "message": "Το Taskbar notifications δεν υποστηρίζεται απο το λειτουργικό σύστημα Linux αυτή τη στιγμή.", "description": "" }, + "options_notifications_35": { + "message": "Για να επιλέξετε ένα νέο προσαρμοσμένο ήχο, επιλέξτε ένα ενσωματωμένο ήχο και στη συνέχεια αλλάξτε την επιλογή με τον προσαρμοσμένο ήχο", + "description": "" + }, "msg_1": { "message": "Η καρτέλα είναι ήδη ανοικτή. Κάντε κλικ στο κουμπί της γραμμής εργαλείων για να ανοίξετε το Gmail σε μια νέα καρτέλα, ή να μεταβείτε σε μια υπάρχουσα Gmail καρτέλα.", "description": "" }, + "popup_refresh": { + "message": "Ανανεώνω", + "description": "" + }, "options_misc_5": { "message": "Μπλε χρώμα για \"Μη Αναγνωσμένα\" και γκρι χρώμα για \"Αποσυνδεση\"", "description": "" @@ -315,10 +427,22 @@ "message": "Ρυθμίστε την τιμή στο μηδέν για κανένα έλεγχο e-mail μέχρι την πρώτη χειροκίνητη ανανέωση [Δεν διατίθεται στο Safari].", "description": "" }, + "popup_msg_19": { + "message": "Οκτώβριος", + "description": "" + }, + "options_notifications_33": { + "message": "περιέχει τίτλο email", + "description": "" + }, "tooltip_3": { "message": "Δεξί κλικ: Επιλογές Λογαριασμού", "description": "" }, + "popup_date_format": { + "message": "%mm %dd, %yy", + "description": "" + }, "options_notifications": { "message": "Ειδοποιήσεις:", "description": "" @@ -327,14 +451,22 @@ "message": "Πυρκαγιές με μη μηδενική τιμή, κοινοποίηση και ηχητική ειδοποίηση τόσο στην επιφάνεια εργασίας (παρόμοιο με νέα άφιξη email) για πάντα, αν έχετε μη αναγνωσμένα email(s).", "description": "" }, + "popup_msg_12": { + "message": "Μάρτιος", + "description": "" + }, "options_notifications_22": { - "message": "Αν το πρόγραμμα περιήγησης σας δεν παίζει τον ήχο κοινοποίησης, προσπαθήστε να τον μετατρέψετε σε μια απλή μορφή WAV χρησιμοποιώντας ένα online εργαλείο μετατροπής.", + "message": "Αν ο browser σας δεν παίζει το προεπιλεγμένο ήχο ειδοποίησης, προσπαθήστε να το μετατρέψετε σε μια απλή μορφή WAV χρησιμοποιώντας ένα online εργαλείο μετατροπής.", "description": "" }, "options_tab_1": { "message": "Αναζήτηση για έναν ανοικτό λογαριασμό Gmail μόνο στο ενεργό παράθυρο", "description": "" }, + "popup_msg_7_format": { + "message": "%d ημέρες πριν", + "description": "" + }, "options_timings_l1": { "message": "Έλεγχος για νέα e-mail κάθε (σε δευτερόλεπτα):", "description": "" @@ -347,6 +479,14 @@ "message": "Gmail™ Notifier", "description": "" }, + "popup_msg_1": { + "message": "μόλις τώρα", + "description": "" + }, + "popup_open_settings": { + "message": "Ανοίξτε τις ρυθμίσεις", + "description": "" + }, "options_misc_3": { "message": "Το σχέδιο χρώματος γραμμής εργαλείων είναι", "description": "" @@ -364,7 +504,7 @@ "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.", + "message": "Θέτοντας αυτήν την προτίμηση στο μηδέν, δεν θα λάμβανετε ειδοποιήσεις στην επιφάνεια εργασίας και ούτε ηχητικές ειδοποιήσεις. Ωστόσο, μπορείτε ακόμα να παίρνετε σήμα κοινοποιήσεων.", "description": "" }, "options_notifications_20": { @@ -387,6 +527,10 @@ "message": "Σκηνικός λογαριασμός (/mail/u/5/)", "description": "" }, + "popup_msg_8_format": { + "message": "%d εβδομάδα(ες) πριν", + "description": "" + }, "options_toolbar": { "message": "Γραμμη Εργαλειων:", "description": "" @@ -395,10 +539,18 @@ "message": "Περικόψτε ειδοποιήσεις περισσότερο από", "description": "" }, + "popup_wait": { + "message": "Περιμένετε...", + "description": "" + }, "tooltip_2": { "message": "Μεσαίο (ή Ctrl + Left) κλικ: Ανανέωση όλων των λογαριασμών", "description": "" }, + "options_notifications_29": { + "message": "Αυτή η επιλογή σχετίζεται με το δεξί κλικ μενού στο κουμπί της γραμμής εργαλείων -> απενεργοποιήσετε όλες τις ειδοποιήσεις -> προσαρμοσμένης χρονικής περιόδου.", + "description": "" + }, "options_tab_3": { "message": "Άνοιγμα νέου λογαριασμού Gmail δίπλα στην ενεργή καρτέλα", "description": "" @@ -416,7 +568,27 @@ "description": "" }, "options_misc_10": { - "message": "Only fire desktop and sound notifications when email has arrived in less than (in minutes): ", + "message": "Μόνο εμφάνιση στην επιφάνεια εργασίας και ηχητικές ειδοποιήσεις, όταν το ηλεκτρονικό ταχυδρομείου έχει φτάσει σε λιγότερο από (σε λεπτά):", + "description": "" + }, + "options_tab_8": { + "message": "Ignore opened Gmail tabs", + "description": "" + }, + "popup_no_subject": { + "message": "(χωρίς θέμα)", + "description": "" + }, + "msg_5": { + "message": "Επιλέξτε ένα αρχείο ήχου", + "description": "" + }, + "popup_msg_2": { + "message": "1 λεπτό πριν", + "description": "" + }, + "popup_msg_16": { + "message": "Ιούλιος", "description": "" }, "label_8": { @@ -427,6 +599,10 @@ "message": "Σημείωση: Για να λειτουργήσει σωστά το notifier, θα πρέπει να είστε συνδεδεμένοι στον Google λογαριασμό σας.", "description": "" }, + "popup_msg_20": { + "message": "Νοέμβριος", + "description": "" + }, "options_toolbar_6": { "message": "Εμφάνιση πλήρους περιεχομένου", "description": "" @@ -447,6 +623,10 @@ "message": "Πλάτος γραμμής εργαλείων του πίνακα σε κατάσταση πλήρους περιεχομένου (σε εικονοστοιχεία):", "description": "" }, + "options_notifications_31": { + "message": "Προσαρμοσμένος ήχος ειδοποίησης", + "description": "" + }, "options_timings_l5": { "message": "Ελάχιστη περίοδος είναι 5 λεπτά.", "description": "" @@ -475,24 +655,36 @@ "message": "Πενταδικός λογαριασμός (/mail/u/4/)", "description": "" }, + "popup_msg_14": { + "message": "Μάιος", + "description": "" + }, "options_inshort": { - "message": "Πολλαπλές ετικέτες και λογαριασμοι κοινοποιών για το Google Mail (Gmail).", + "message": "Πολλαπλές ετικέτες και λογαριασμοί κοινοποιών για το Google Mail (Gmail).", "description": "" }, "options_misc_12": { - "message": "Do not include login details in the tooltip text", + "message": "Δεν περιλαμβάνονται στοιχεία σύνδεσης στο κείμενο επεξήγησης", "description": "" }, "options_tab_4": { "message": "Άνοιγμα λογαριασμού Gmail στην ενεργή καρτέλα", "description": "" }, + "popup_msg_3_format": { + "message": "%d λεπτά πριν", + "description": "" + }, "label_12": { - "message": "Άνοιγμα αρχικής σελίδας", + "message": "Άνοιγμα Συχνών Ερωτήσεων", "description": "" }, "description": { - "message": "Πολλαπλές ετικέτες και κοινωποιηση λογαριασμού για το Google Mail (Gmail)", + "message": "Πολλαπλές ετικέτες και κοινοποίηση λογαριασμού για το Google Mail (Gmail)", + "description": "" + }, + "popup_spam": { + "message": "Spam", "description": "" } } \ No newline at end of file diff --git a/src/_locales/en/messages.json b/v1/builds/unpacked/chrome/_locales/en/messages.json similarity index 78% rename from src/_locales/en/messages.json rename to v1/builds/unpacked/chrome/_locales/en/messages.json index 057e8db4..6bd7bb34 100644 --- a/src/_locales/en/messages.json +++ b/v1/builds/unpacked/chrome/_locales/en/messages.json @@ -1,12 +1,12 @@ { "gmail": { - "message": "Gmail™ Notifier" + "message": "Notifier for Gmail™" }, "toolbar_label": { - "message": "Gmail™ Notifier" + "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." @@ -32,6 +32,9 @@ "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" + }, "label_1": { "message": "Refresh" @@ -60,6 +63,9 @@ "label_9": { "message": "For 5 hours" }, + "label_13": { + "message": "For a custom time period" + }, "label_10": { "message": "Enable notifications" }, @@ -67,7 +73,10 @@ "message": "Compose an email" }, "label_12": { - "message": "Open homepage" + "message": "Open FAQs" + }, + "label_14": { + "message": "Logged-in accounts" }, "unknown": { @@ -80,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" @@ -120,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/)" @@ -204,10 +213,23 @@ "message": "This feature is highly experimental and might make your Firefox browser unstable. [Restart required]." }, "options_notifications_15": { - "message": "Sound notification is" + "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" @@ -225,7 +247,10 @@ "message": "User defined notification sound is" }, "options_notifications_22": { - "message": "If your browser is not playing the notification sound, try to convert it into a plain WAV format using an online conversion tool." + "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 is" @@ -242,31 +267,45 @@ "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_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" + }, + "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_toolbar": { "message": "Toolbar:" }, @@ -277,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" @@ -319,7 +358,7 @@ "message": "Refresh all accounts" }, "options_toolbar_17": { - "message": "Open primary Gmail account" + "message": "Open primary Gmail™ account" }, "options_misc": { "message": "Miscellaneous:" @@ -343,7 +382,7 @@ "message": "Red color for \"No Unread\" and gray color for \"Disconnected\"" }, "options_misc_6": { - "message": "Do not show desktop notification to warn that Gmail website is already open" + "message": "Show desktop notification to warn that Gmail™ is already opened in the active tab" }, "options_misc_7": { "message": "Show welcome page on upgrade" @@ -379,7 +418,15 @@ "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" }, @@ -410,8 +457,8 @@ "popup_msg_2": { "message": "1 minute ago" }, - "popup_msg_3": { - "message": "minutes ago" + "popup_msg_3_format": { + "message": "%d minutes ago" }, "popup_msg_4": { "message": "1 hour ago" @@ -422,14 +469,14 @@ "popup_msg_6": { "message": "Yesterday" }, - "popup_msg_7": { - "message": "days ago" + "popup_msg_7_format": { + "message": "%d days ago" }, - "popup_msg_8": { - "message": "weeks ago" + "popup_msg_8_format": { + "message": "%d week(s) ago" }, - "popup_msg_9": { - "message": "months ago" + "popup_msg_9_format": { + "message": "%d month(s) ago" }, "popup_msg_10": { "message": "January" @@ -466,5 +513,12 @@ }, "popup_msg_21": { "message": "December" + }, + + "settings_open_title": { + "message": "Open options (settings) page" + }, + "settings_open_label": { + "message": "Open Options" } } diff --git a/v1/builds/unpacked/chrome/_locales/fr/messages.json b/v1/builds/unpacked/chrome/_locales/fr/messages.json new file mode 100644 index 00000000..eb237b00 --- /dev/null +++ b/v1/builds/unpacked/chrome/_locales/fr/messages.json @@ -0,0 +1,690 @@ +{ + "label_9": { + "message": "Pour 5 heures", + "description": "" + }, + "options_notifications_19": { + "message": "Alerte e-mail Windows", + "description": "" + }, + "options_notifications_17": { + "message": "Alerte sonore \"Bell\" de l'extension \"Checker Plus\" pour Google Chrome", + "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)", + "description": "" + }, + "options_notifications_30": { + "message": "Combiner toutes les notifications simultanées de bureau en une seule notification", + "description": "" + }, + "settings_open_label": { + "message": "Ouvrir les options", + "description": "" + }, + "options_timings_l7": { + "message": "Ne pas relever les nouveaux e-mails au démarrage avant (en secondes) :", + "description": "" + }, + "label_4": { + "message": "Pour 5 min", + "description": "" + }, + "options_timings_l3": { + "message": "Rappeler les e-mails non lus toutes les (en minutes) :", + "description": "" + }, + "popup_msg_4": { + "message": "1 heure plus tôt", + "description": "" + }, + "options_gmail_1": { + "message": "Compte principal (/mail/u/0/)", + "description": "" + }, + "options_gmail_10": { + "message": "Recevoir les notifications pour les libellés et comptes suivants :", + "description": "" + }, + "options_notifications_1": { + "message": "Afficher la notification sur le bureau pour les nouveaux e-mails", + "description": "" + }, + "options_notifications_9": { + "message": "Jouer l'alerte sonore pour les nouveaux e-mails", + "description": "" + }, + "label_6": { + "message": "Pour 30 min", + "description": "" + }, + "options_misc_8": { + "message": "Réinitialiser tous les paramètres aux valeurs par défaut", + "description": "" + }, + "options_notifications_28": { + "message": "Désactiver toutes les notifications pendant une période de temps personnalisée (en minutes) :", + "description": "" + }, + "options_timings_l4": { + "message": "Positionner la valeur à zéro pour tous les rappels non périodiques.", + "description": "" + }, + "options_notifications_32": { + "message": "nom ou contenus d'e-mail", + "description": "" + }, + "options_tab_6": { + "message": "Ouvrir un compte Gmail™ dans une nouvelle fenêtre", + "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.", + "description": "" + }, + "options_toolbar_15": { + "message": "Cliquer avec le bouton du milieu sur bouton de la barre d'outils pour", + "description": "" + }, + "options_toolbar_10": { + "message": "La hauteur minimale est de 500 pixels.", + "description": "" + }, + "popup_msg_10": { + "message": "Janvier", + "description": "" + }, + "options_notifications_26": { + "message": "Toujours afficher la notification dans la zone de notification système (uniquement sous Windows)", + "description": "" + }, + "label_3": { + "message": "Désactiver toutes les notifications", + "description": "" + }, + "label_13": { + "message": "Pour une période de temps personnalisée", + "description": "" + }, + "options_empty": { + "message": "non défini", + "description": "" + }, + "options_notifications_3": { + "message": "Cette option peut ne pas fonctionner sur votre système d'exploitation.", + "description": "" + }, + "options_timings": { + "message": "Temporisations", + "description": "" + }, + "options_gmail_5": { + "message": "4ème compte (/mail/u/3/)", + "description": "" + }, + "label_5": { + "message": "Pour 15 min", + "description": "" + }, + "options_misc_9": { + "message": "Couleur rouge pour \"Tous lus\" et couleur gris pour \"Déconnecté\"", + "description": "" + }, + "popup_msg_5": { + "message": "heures plus tôt", + "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.", + "description": "" + }, + "options_misc_1": { + "message": "Trier les comptes par ordre alphabétique", + "description": "" + }, + "tooltip_1": { + "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]", + "description": "" + }, + "popup_trash": { + "message": "Corbeille", + "description": "" + }, + "options_tab": { + "message": "Ouverture d'onglet :", + "description": "" + }, + "log_into_your_account": { + "message": "Veuillez vous connecter à votre compte", + "description": "" + }, + "label_10": { + "message": "Activer les notifications", + "description": "" + }, + "options_notifications_23": { + "message": "Le volume de la notification sonore est", + "description": "" + }, + "options_timings_l2": { + "message": "La période minimum est de 10 secondes.", + "description": "" + }, + "options_toolbar_11": { + "message": "Support des raccourcis clavier dans le panneau de la barre d'outils", + "description": "" + }, + "options_gmail_9": { + "message": "Des libellés populaires : \"inbox\", \"important\", \"^smartlabel_personal\", \"^smartlabel_newsletter\", \"^smartlabel_notification\", et \"^smartlabel_group\"", + "description": "" + }, + "popup_msg_17": { + "message": "Août", + "description": "" + }, + "popup_msg_15": { + "message": "Juin", + "description": "" + }, + "options_notifications_34": { + "message": "sommaire de contenus d'e-mail", + "description": "" + }, + "label_14": { + "message": "Comptes connecté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.", + "description": "" + }, + "options_misc_6": { + "message": "Afficher une notification sur le bureau pour avertir que Gmail™ est déjà ouvert dans l'onglet actif", + "description": "" + }, + "popup_read": { + "message": "Marquer comme lu", + "description": "" + }, + "options_notifications_4": { + "message": "Format de notification", + "description": "" + }, + "settings_open_title": { + "message": "Ouvrir la page des options (paramètres)", + "description": "" + }, + "label_2": { + "message": "Paramètres", + "description": "" + }, + "options_toolbar_14": { + "message": "Si vous préférez le rendu \"texte uniquement\" dans le mode \"contenu total\", décochez cette case.", + "description": "" + }, + "options_notifications_18": { + "message": "Alerte sonore \"Ding\" de l'extension \"Checker Plus\" pour Google Chrome", + "description": "" + }, + "options_tab_5": { + "message": "Ouvrir un compte Gmail™ dans un onglet d'arrière-plan", + "description": "" + }, + "label_7": { + "message": "Pour 1 heure", + "description": "" + }, + "popup_archive": { + "message": "Archive", + "description": "" + }, + "msg_2": { + "message": "Le lien est copié dans le presse-papiers.", + "description": "" + }, + "options_title": { + "message": "Options - Notifieur Gmail™", + "description": "" + }, + "popup_msg_13": { + "message": "Avril", + "description": "" + }, + "popup_msg_9_format": { + "message": "%d mois plus tôt", + "description": "" + }, + "popup_msg_11": { + "message": "Février", + "description": "" + }, + "popup_open_inbox": { + "message": "Ouvrir la boîte de réception", + "description": "" + }, + "options_tab_9": { + "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": "Notifieur Gmail™", + "description": "" + }, + "popup_msg_6": { + "message": "Hier", + "description": "" + }, + "options_toolbar_8": { + "message": "La largeur minimale est de 500 pixels.", + "description": "" + }, + "options_notifications_16": { + "message": "Alerte par défaut du Notifieur Gmail™", + "description": "" + }, + "options_misc_14": { + "message": "Ne pas afficher le nombre badge exact quand le nombre d'e-mails non lus est supérieur à 999", + "description": "" + }, + "popup_msg_18": { + "message": "Septembre", + "description": "" + }, + "options_notifications_14": { + "message": "Cette fonctionnalité est hautement expérimentale et pourrait rendre instable votre navigateur Firefox. [Rédemarrage nécessaire].", + "description": "" + }, + "options_gmail_3": { + "message": "2ème compte (/mail/u/1/)", + "description": "" + }, + "options_notifications_11": { + "message": "Afficher la notification dans la barre de tâches Windows ou dans le dock Mac OS", + "description": "" + }, + "options_notifications_2": { + "message": "Présenter la notification de bureau pendant (en secondes) :", + "description": "" + }, + "log_in_to_your_account": { + "message": "Veuillez vous connecter à votre compte Gmail™", + "description": "" + }, + "popup_of": { + "message": "sur", + "description": "" + }, + "options_notifications_15": { + "message": "Default sound notification is", + "description": "" + }, + "options_notifications_21": { + "message": "La notification sonore définie par l'utilisateur est", + "description": "" + }, + "options_toolbar_9": { + "message": "La hauteur du panneau de la barre d'outils dans le mode \"contenu total\" est (en pixels) :", + "description": "" + }, + "options_toolbar_1": { + "message": "Comportement du bouton de la barre d'outils", + "description": "" + }, + "unknown": { + "message": "inconnu", + "description": "" + }, + "popup_msg_21": { + "message": "Décembre", + "description": "" + }, + "popup_read_all": { + "message": "Tout marquer comme lu", + "description": "" + }, + "options_notifications_8": { + "message": "Pour ne pas tronquer avec des points de suspension, utiliser un nombre élevé.", + "description": "" + }, + "options_donation": { + "message": "Faire un don", + "description": "" + }, + "msg_3": { + "message": "Le texte sélectionné est copié dans le presse-papiers.", + "description": "" + }, + "options_misc_7": { + "message": "Afficher la page de bienvenue après une mise à jour", + "description": "" + }, + "options_gmail": { + "message": "Gmail™ :", + "description": "" + }, + "label_1": { + "message": "Rafraîchir", + "description": "" + }, + "options_notifications_5": { + "message": "Variables disponibles :", + "description": "" + }, + "options_notifications_24": { + "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": "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": { + "message": "Le type de tri par défaut respecte l'ordre de connexions.", + "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/)", + "description": "" + }, + "options_toolbar_5": { + "message": "Afficher le résumé uniquement", + "description": "" + }, + "options_notifications_12": { + "message": "Les notifications dans la barre de tâches ne sont pas supportées sous Linux pour le moment.", + "description": "" + }, + "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": "" + }, + "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.", + "description": "" + }, + "popup_refresh": { + "message": "Rafraîchir", + "description": "" + }, + "options_misc_5": { + "message": "Couleur bleu pour \"Tous lus\" et couleur gris pour \"Déconnecté\"", + "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].", + "description": "" + }, + "popup_msg_19": { + "message": "Octobre", + "description": "" + }, + "options_notifications_33": { + "message": "titre des contenus d'e-mail", + "description": "" + }, + "tooltip_3": { + "message": "Clic droit : sélections des comptes", + "description": "" + }, + "popup_date_format": { + "message": "%dd %mm %yy", + "description": "" + }, + "options_notifications": { + "message": "Notifications :", + "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.", + "description": "" + }, + "popup_msg_12": { + "message": "Mars", + "description": "" + }, + "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_tab_1": { + "message": "Chercher un compte Gmail™ ouvert seulement dans la fenêtre active", + "description": "" + }, + "popup_msg_7_format": { + "message": "%d jours plus tôt", + "description": "" + }, + "options_timings_l1": { + "message": "Relever les nouveaux e-mails tous les (en secondes) :", + "description": "" + }, + "options_toolbar_4": { + "message": "Mode du panneau de la barre d'outils", + "description": "" + }, + "toolbar_label": { + "message": "Notifieur Gmail™", + "description": "" + }, + "popup_msg_1": { + "message": "à l'instant", + "description": "" + }, + "popup_open_settings": { + "message": "Ouvrir les paramètres", + "description": "" + }, + "options_misc_3": { + "message": "La légende de la barre d'outils est", + "description": "" + }, + "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_toolbar_12": { + "message": "! : Signaler comme spam, # : Mettre à la corbeille, e : Archiver, Shift + i : Marquer comme lu.", + "description": "" + }, + "options_px": { + "message": "pixel(s)", + "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", + "description": "" + }, + "and": { + "message": "et", + "description": "" + }, + "options_tab_7": { + "message": "Toujours utiliser des onglets vierges au lieu d'ouvrir un nouvel onglet quand ouvrir dans un onglet est activé.", + "description": "" + }, + "options_toolbar_3": { + "message": "Ouvrir un compte Gmail™ si un seul compte est connecté", + "description": "" + }, + "options_gmail_7": { + "message": "6ème compte (/mail/u/5/)", + "description": "" + }, + "popup_msg_8_format": { + "message": "%d semaines plus tôt", + "description": "" + }, + "options_toolbar": { + "message": "Barre d'outils :", + "description": "" + }, + "options_notifications_6": { + "message": "Tronquer les notifications plus longues que", + "description": "" + }, + "popup_wait": { + "message": "Patientez...", + "description": "" + }, + "tooltip_2": { + "message": "Clic milieu (ou Ctrl+clic gauche) : rafraîchir tous les comptes", + "description": "" + }, + "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_tab_3": { + "message": "Ouvrir un nouveau compte Gmail™ à côté de l'onglet actif", + "description": "" + }, + "options_gmail_8": { + "message": "Marquer le message comme lu en l'archivant", + "description": "" + }, + "options_toolbar_17": { + "message": "Ouvrir le premier compte Gmail™", + "description": "" + }, + "options_notifications_7": { + "message": "caractères pour les champs [objet] et [résumé].", + "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) :", + "description": "" + }, + "options_tab_8": { + "message": "Ignorer les onglets Gmail™ ouverts", + "description": "" + }, + "popup_no_subject": { + "message": "(aucun objet)", + "description": "" + }, + "msg_5": { + "message": "Choisir un fichier son", + "description": "" + }, + "popup_msg_2": { + "message": "1 minute plus tôt", + "description": "" + }, + "popup_msg_16": { + "message": "Juillet", + "description": "" + }, + "label_8": { + "message": "Pour 2 heures", + "description": "" + }, + "msg_4": { + "message": "Remarque : pour que le notifieur fonctionne correctement, vous devez être connecté à votre compte Google.", + "description": "" + }, + "popup_msg_20": { + "message": "Novembre", + "description": "" + }, + "options_toolbar_6": { + "message": "Afficher la totalité du contenu", + "description": "" + }, + "options_gmail_11": { + "message": "Flux personnalisés :", + "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": "" + }, + "label_11": { + "message": "Rédiger un e-mail", + "description": "" + }, + "options_toolbar_7": { + "message": "La largeur du panneau de la barre d'outils dans le mode \"contenu total\" est (en pixels) :", + "description": "" + }, + "options_notifications_31": { + "message": "Son de notification personnalisé", + "description": "" + }, + "options_timings_l5": { + "message": "La période minimum est de 5 minutes.", + "description": "" + }, + "options_misc": { + "message": "Divers :", + "description": "" + }, + "options_gmail_2": { + "message": "Séparer les libellés par \",\" (virgule).", + "description": "" + }, + "options_misc_4": { + "message": "Couleur gris pour \"Tous lus\" et couleur bleu pour \"Déconnecté\"", + "description": "" + }, + "options_toolbar_13": { + "message": "Rendre les e-mails en HTML dans le mode \"contenu total\"", + "description": "" + }, + "options_toolbar_16": { + "message": "Rafraîchir tous les comptes", + "description": "" + }, + "options_gmail_6": { + "message": "5ème compte (/mail/u/4/)", + "description": "" + }, + "popup_msg_14": { + "message": "Mai", + "description": "" + }, + "options_inshort": { + "message": "Notifieur multi-comptes et multi-libellés pour Google Mail (Gmail™).", + "description": "" + }, + "options_misc_12": { + "message": "Ne pas inclure de détails d'identifiant dans la bulle textuelle", + "description": "" + }, + "options_tab_4": { + "message": "Ouvrir un compte Gmail™ dans l'onglet actif", + "description": "" + }, + "popup_msg_3_format": { + "message": "%d minutes plus tôt", + "description": "" + }, + "label_12": { + "message": "Ouvrir la FAQ", + "description": "" + }, + "description": { + "message": "Notifieur multi-comptes et multi-libellés pour Google Mail (Gmail™)", + "description": "" + }, + "popup_spam": { + "message": "Spam", + "description": "" + } +} diff --git a/v1/builds/unpacked/chrome/_locales/hu/messages.json b/v1/builds/unpacked/chrome/_locales/hu/messages.json new file mode 100644 index 00000000..ce456f54 --- /dev/null +++ b/v1/builds/unpacked/chrome/_locales/hu/messages.json @@ -0,0 +1,690 @@ +{ + "label_9": { + "message": "5 órára", + "description": "" + }, + "options_notifications_19": { + "message": "Windows e-mail értesítés", + "description": "" + }, + "options_notifications_17": { + "message": "Checker Plus bell értesítés", + "description": "" + }, + "options_notifications_13": { + "message": "A tálcaértesítés ikonjára kattintás nyissa meg az eszközpanelt (Csak Windows, béta)", + "description": "" + }, + "options_notifications_30": { + "message": "Az összes egyidejű asztali értesítés összevonása egy értesítéssé", + "description": "" + }, + "settings_open_label": { + "message": "Beállítások megnyitása", + "description": "" + }, + "options_timings_l7": { + "message": "Ne keressen új leveleket induláskor ennyi másodpercig:", + "description": "" + }, + "label_4": { + "message": "5 percre", + "description": "" + }, + "options_timings_l3": { + "message": "Emlékeztessen az összes olvasatlan levélre (percenként):", + "description": "" + }, + "popup_msg_4": { + "message": "1 óra múlva", + "description": "" + }, + "options_gmail_1": { + "message": "Elsődleges fiók(/mail/u/0/)", + "description": "" + }, + "options_gmail_10": { + "message": "A következő címkék és fiókok esetén legyen értesítés:", + "description": "" + }, + "options_notifications_1": { + "message": "Asztali értesítések megjelenítése új levelek érkezésekor", + "description": "" + }, + "options_notifications_9": { + "message": "Hangjelzés lejátszása új levelek érkezésekor", + "description": "" + }, + "label_6": { + "message": "30 percre", + "description": "" + }, + "options_misc_8": { + "message": "Összes beállítás visszaállítása alapértelmezettre", + "description": "" + }, + "options_notifications_28": { + "message": "Összes értesítés tiltása egyéni időhosszra (percben):", + "description": "" + }, + "options_timings_l4": { + "message": "Állítsa az értéket 0-ra nem ismétlődő értesítésekhez.", + "description": "" + }, + "options_notifications_32": { + "message": "név vagy levél tartalmazza", + "description": "" + }, + "options_tab_6": { + "message": "Gmail-fiók megnyitása új ablakban", + "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.", + "description": "" + }, + "options_toolbar_15": { + "message": "Az eszköztár gombjára a középső egérgombbal kattintás", + "description": "" + }, + "options_toolbar_10": { + "message": "A legkisebb magasság is 500px.", + "description": "" + }, + "popup_msg_10": { + "message": "Január", + "description": "" + }, + "options_notifications_26": { + "message": "Mindig látszódjon a tálcaértesítő (Csak Windows)", + "description": "" + }, + "label_3": { + "message": "Összes értesítés tiltása", + "description": "" + }, + "label_13": { + "message": "Egyéni időhosszra", + "description": "" + }, + "options_empty": { + "message": "nincs megadva", + "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_timings": { + "message": "Időzítés:", + "description": "" + }, + "options_gmail_5": { + "message": "Negyedik fiók (/mail/u/3/)", + "description": "" + }, + "label_5": { + "message": "15 percre", + "description": "" + }, + "options_misc_9": { + "message": "Piros szín a \"Nincs olvasatlan\" és szürke szín a \"Szétkapcsolva\"", + "description": "" + }, + "popup_msg_5": { + "message": "órával ezelőtt", + "description": "" + }, + "options_notifications_27": { + "message": "A tálcaértesítő akkor is látszódjon, amikor nincs olvasatlan üzenet. ", + "description": "" + }, + "options_misc_1": { + "message": "Fiókok betűrendbe rendezése", + "description": "" + }, + "tooltip_1": { + "message": "Jobb egér: Gmail vagy előnézeti panel megnyitása", + "description": "" + }, + "notification": { + "message": "Feladó: [author_email][break]Tárgy: [title][break]Összegzés: [summary]", + "description": "" + }, + "popup_trash": { + "message": "Kuka", + "description": "" + }, + "options_tab": { + "message": "Lap megnyitása:", + "description": "" + }, + "log_into_your_account": { + "message": "Jelentkezzen be fiókjába", + "description": "" + }, + "label_10": { + "message": "Értesítések engedélyezése", + "description": "" + }, + "options_notifications_23": { + "message": "A hangértesítés hangereje", + "description": "" + }, + "options_timings_l2": { + "message": "A legkisebb időköz 10 másodperc.", + "description": "" + }, + "options_toolbar_11": { + "message": "Gyorsbillentyű támogatása az eszköztár gombján", + "description": "" + }, + "options_gmail_9": { + "message": "Néhány népszerű címke: \"beérkező\", \"fontos\", \"^smartlabel_personal\", \"^smartlabel_newsletter\", \"^smartlabel_notification\", and \"^smartlabel_group\"", + "description": "" + }, + "popup_msg_17": { + "message": "Augusztus", + "description": "" + }, + "popup_msg_15": { + "message": "Június", + "description": "" + }, + "options_notifications_34": { + "message": "levélösszegző tartalmazza", + "description": "" + }, + "label_14": { + "message": "Bejelentkezett fiókok", + "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.", + "description": "" + }, + "options_misc_6": { + "message": "Asztali figyelmeztetés megjelenítése, hogy Gmail már az aktív fülön nyitva van ", + "description": "" + }, + "popup_read": { + "message": "Megj. olvasottként", + "description": "" + }, + "options_notifications_4": { + "message": "Értesítés formátuma", + "description": "" + }, + "settings_open_title": { + "message": "Beállítások oldal megnyitása", + "description": "" + }, + "label_2": { + "message": "Beállítások", + "description": "" + }, + "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_notifications_18": { + "message": "Checker Plus ding értesítés", + "description": "" + }, + "options_tab_5": { + "message": "Gmail-fiók megnyitása egy háttér lapon", + "description": "" + }, + "label_7": { + "message": "1 órára", + "description": "" + }, + "popup_archive": { + "message": "Archív", + "description": "" + }, + "msg_2": { + "message": "A link a vágólapra került.", + "description": "" + }, + "options_title": { + "message": "Beállítások - Gmail™ Értesítő", + "description": "" + }, + "popup_msg_13": { + "message": "Április", + "description": "" + }, + "popup_msg_9_format": { + "message": "%d hónappal ezelőtt", + "description": "" + }, + "popup_msg_11": { + "message": "Február", + "description": "" + }, + "popup_open_inbox": { + "message": "Beérkező levelek megnyitása", + "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. ", + "description": "" + }, + "gmail": { + "message": "Gmail™ értesítő", + "description": "" + }, + "popup_msg_6": { + "message": "Tegnap", + "description": "" + }, + "options_toolbar_8": { + "message": "A legkisebb szélesség 500px.", + "description": "" + }, + "options_notifications_16": { + "message": "Gmail értesítő alapértelmezett jelzése", + "description": "" + }, + "options_misc_14": { + "message": "Ne pontos szám jelenjen meg, amikor az olvasatlan levelek száma nagyobb, mint 999. ", + "description": "" + }, + "popup_msg_18": { + "message": "Szeptember", + "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].", + "description": "" + }, + "options_gmail_3": { + "message": "Másodlagos fiók (/mail/u/1/)", + "description": "" + }, + "options_notifications_11": { + "message": "\"Windows tálcaértesítés\" vagy \"Mac OS Dock értesítés\" megjelenítése", + "description": "" + }, + "options_notifications_2": { + "message": "Asztali értesítés megjelenítése ennyi másodpercig:", + "description": "" + }, + "log_in_to_your_account": { + "message": "Jelentkezzen be Gmail-fiókjába", + "description": "" + }, + "popup_of": { + "message": "/", + "description": "" + }, + "options_notifications_15": { + "message": "Alapértelmezett hangértesítés bekapcsolva", + "description": "" + }, + "options_notifications_21": { + "message": "A felhasználó által megadott hang", + "description": "" + }, + "options_toolbar_9": { + "message": "Teljes tartalom megjelenítésekor az eszköztár panel magassága pixelben:", + "description": "" + }, + "options_toolbar_1": { + "message": "Eszköztárgomb viselkedése", + "description": "" + }, + "unknown": { + "message": "ismeretlen", + "description": "" + }, + "popup_msg_21": { + "message": "December", + "description": "" + }, + "popup_read_all": { + "message": "Összes megjelölése olvasottként", + "description": "" + }, + "options_notifications_8": { + "message": "Hogy ne lehessen szólevágás, nagy számot adjon meg.", + "description": "" + }, + "options_donation": { + "message": "Támogasd munkánkat", + "description": "" + }, + "msg_3": { + "message": "A kijelölt szöveg a vágólapra került.", + "description": "" + }, + "options_misc_7": { + "message": "Üdvözlő oldal megjelenítése frissítéskor", + "description": "" + }, + "options_gmail": { + "message": "Gmail:", + "description": "" + }, + "label_1": { + "message": "Frissítés", + "description": "" + }, + "options_notifications_5": { + "message": "Használható változók:", + "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).", + "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.", + "description": "" + }, + "options_misc_2": { + "message": "Az alapértelmezett rendezés a bejelentkezés sorrendje.", + "description": "" + }, + "options_toolbar_2": { + "message": "Mindig nyissa meg a levél előnézetpanelét", + "description": "" + }, + "popup_settings": { + "message": "beállítások", + "description": "" + }, + "options_gmail_4": { + "message": "Harmadik fiók (/mail/u/2/)", + "description": "" + }, + "options_toolbar_5": { + "message": "Csak az összegzés megjelenítése", + "description": "" + }, + "options_notifications_12": { + "message": "Tálcaértesítések nem támogatottak jelenleg Linux alatt.", + "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. ", + "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.", + "description": "" + }, + "popup_refresh": { + "message": "Frissítés", + "description": "" + }, + "options_misc_5": { + "message": "Kék szín a \"Nincs olvasatlan\" és szürke szín a \"Szétkapcsolva\"", + "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].", + "description": "" + }, + "popup_msg_19": { + "message": "Október", + "description": "" + }, + "options_notifications_33": { + "message": "levél címe tartalmazza", + "description": "" + }, + "tooltip_3": { + "message": "Jobb egér: fiókválasztás", + "description": "" + }, + "popup_date_format": { + "message": "%yy. %mm %dd.", + "description": "" + }, + "options_notifications": { + "message": "Értesítések:", + "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.", + "description": "" + }, + "popup_msg_12": { + "message": "Március", + "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..", + "description": "" + }, + "options_tab_1": { + "message": "Gmail-fiók keresése csak az aktív böngészőablakban", + "description": "" + }, + "popup_msg_7_format": { + "message": "%d nappal ezelőtt", + "description": "" + }, + "options_timings_l1": { + "message": "Új levelek ellenőrzése ennyi másodpercenként:", + "description": "" + }, + "options_toolbar_4": { + "message": "Eszköztár panel mód", + "description": "" + }, + "toolbar_label": { + "message": "Gmail™ értesítő", + "description": "" + }, + "popup_msg_1": { + "message": "éppen most", + "description": "" + }, + "popup_open_settings": { + "message": "Beállítások megnyitása", + "description": "" + }, + "options_misc_3": { + "message": "Eszköztár panel színmintája", + "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", + "description": "" + }, + "options_toolbar_12": { + "message": "!: Spam bejelentése, #: Kuka, e: Archiválás, Shift + i: Megjelölés olvasottként.", + "description": "" + }, + "options_px": { + "message": "px", + "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", + "description": "" + }, + "and": { + "message": "és", + "description": "" + }, + "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_3": { + "message": "Gmail-fiók megnyitása csak akkor, ha már egy fiókba bejelentkezett.", + "description": "" + }, + "options_gmail_7": { + "message": "Hatodik fiók (/mail/u/5/)", + "description": "" + }, + "popup_msg_8_format": { + "message": "%d héttel ezelőtt", + "description": "" + }, + "options_toolbar": { + "message": "Eszköztár:", + "description": "" + }, + "options_notifications_6": { + "message": "Értesítés levágása, ha hosszabb mint", + "description": "" + }, + "popup_wait": { + "message": "Várj...", + "description": "" + }, + "tooltip_2": { + "message": "Középső (vagy Ctrl+Bal) egér: Összes fiók frissítése", + "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.", + "description": "" + }, + "options_tab_3": { + "message": "Gmail-fiók megnyitása az aktív lap mellett", + "description": "" + }, + "options_gmail_8": { + "message": "Archiváláskor olvasottnak megjelölés", + "description": "" + }, + "options_toolbar_17": { + "message": "Elsődleges Gmail-fiók megnyitása", + "description": "" + }, + "options_notifications_7": { + "message": "karakternél a [cím] és az [összegzés] mező.", + "description": "" + }, + "options_misc_10": { + "message": "Csak asztali- és hangértesítés jelezzen amikor levél érkezett kevesebb, mint ennyi percen belül:", + "description": "" + }, + "options_tab_8": { + "message": "Már nyitva lévő Gmail lapok figyelmen kívül hagyása", + "description": "" + }, + "popup_no_subject": { + "message": "(nincs tárgy)", + "description": "" + }, + "msg_5": { + "message": "Válassz egy hangfájlt", + "description": "" + }, + "popup_msg_2": { + "message": "1 perccel ezelőtt", + "description": "" + }, + "popup_msg_16": { + "message": "Július", + "description": "" + }, + "label_8": { + "message": "2 órára", + "description": "" + }, + "msg_4": { + "message": "Megjegyzés: Az értesítő működéséhez szükséges, hogy Google-fiókjába bejelentkezzen.", + "description": "" + }, + "popup_msg_20": { + "message": "November", + "description": "" + }, + "options_toolbar_6": { + "message": "Teljes tartalom megjelenítése", + "description": "" + }, + "options_gmail_11": { + "message": "Egyéni hírforrások:", + "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.", + "description": "" + }, + "label_11": { + "message": "Levél írása", + "description": "" + }, + "options_toolbar_7": { + "message": "Teljes tartalom megjelenítésekor az eszköztár panel szélessége pixelben:", + "description": "" + }, + "options_notifications_31": { + "message": "Egyéni hangértesítés", + "description": "" + }, + "options_timings_l5": { + "message": "A legrövidebb időköz 5 perc.", + "description": "" + }, + "options_misc": { + "message": "Egyebek:", + "description": "" + }, + "options_gmail_2": { + "message": "A címkéket vesszővel (\",\"-vel) válassza el.", + "description": "" + }, + "options_misc_4": { + "message": "Szürke szín a \"Nincs olvasatlan\" és kék szín a \"Szétkapcsolva\"", + "description": "" + }, + "options_toolbar_13": { + "message": "Levél megjelenítése HTML-ként teljes tartalom módban", + "description": "" + }, + "options_toolbar_16": { + "message": "Összes fiók frissítése", + "description": "" + }, + "options_gmail_6": { + "message": "Ötödik fiók (/mail/u/4/)", + "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ő.", + "description": "" + }, + "options_misc_12": { + "message": "A buboréksúgó szövegébe ne helyezz bejelentkezési adatokat", + "description": "" + }, + "options_tab_4": { + "message": "Gmail-fiók megnyitása az aktív lapon", + "description": "" + }, + "popup_msg_3_format": { + "message": "%d perccel ezelőtt", + "description": "" + }, + "label_12": { + "message": "GyÍK megnyitása", + "description": "" + }, + "description": { + "message": "Egy vagy több Google Mail (Gmail) fiókhoz, illetve címkéhez értesítő", + "description": "" + }, + "popup_spam": { + "message": "Spam", + "description": "" + } +} \ No newline at end of file diff --git a/src/_locales/nl/messages.json b/v1/builds/unpacked/chrome/_locales/nl/messages.json similarity index 74% rename from src/_locales/nl/messages.json rename to v1/builds/unpacked/chrome/_locales/nl/messages.json index 63f29541..3bcae35e 100644 --- a/src/_locales/nl/messages.json +++ b/v1/builds/unpacked/chrome/_locales/nl/messages.json @@ -15,6 +15,14 @@ "message": "Werkbalkpaneel openen bij klikken op taakbalkmeldingspictogram (alleen op Windows - beta)", "description": "" }, + "options_notifications_30": { + "message": "Alle bureaubladmeldingen samenvoegen in één melding", + "description": "" + }, + "settings_open_label": { + "message": "Opties openen", + "description": "" + }, "options_timings_l7": { "message": "Niet controleren op nieuwe e-mails bij opstarten voor de duur van (in seconden):", "description": "" @@ -27,6 +35,10 @@ "message": "Herinnering voor alle ongelezen e-mails, elke (in minuten):", "description": "" }, + "popup_msg_4": { + "message": "1 uur geleden", + "description": "" + }, "options_gmail_1": { "message": "Hoofdaccount (/mail/u/0/)", "description": "" @@ -51,10 +63,18 @@ "message": "Alle instellingen naar standaardwaarden herstellen", "description": "" }, + "options_notifications_28": { + "message": "Schakelt alle meldingen uit voor een aangepaste tijdsperiode (in minuten):", + "description": "" + }, "options_timings_l4": { "message": "Stel de waarde op nul in voor niet-periodieke herinneringen.", "description": "" }, + "options_notifications_32": { + "message": "naam of e-mail bevat", + "description": "" + }, "options_tab_6": { "message": "Gmail-account openen in een nieuw venster", "description": "" @@ -71,6 +91,10 @@ "message": "Minimale hoogte is 500px.", "description": "" }, + "popup_msg_10": { + "message": "januari", + "description": "" + }, "options_notifications_26": { "message": "Systeemvakmelding altijd weergeven (wordt alleen ondersteund op Windows)", "description": "" @@ -79,6 +103,10 @@ "message": "Alle meldingen uitschakelen", "description": "" }, + "label_13": { + "message": "Voor een aangepaste tijdsperiode", + "description": "" + }, "options_empty": { "message": "niet opgegeven", "description": "" @@ -103,6 +131,10 @@ "message": "Rode kleur voor \"Geen ongelezen berichten\" en grijze kleur voor \"Niet verbonden\"", "description": "" }, + "popup_msg_5": { + "message": "uren geleden", + "description": "" + }, "options_notifications_27": { "message": "Er zal een systeemvakmelding worden weergegeven zelfs als er geen ongelezen bericht is.", "description": "" @@ -119,6 +151,10 @@ "message": "Van: [author_email][break]Titel: [title][break]Samenvatting: [summary]", "description": "" }, + "popup_trash": { + "message": "Prullenbak", + "description": "" + }, "options_tab": { "message": "Tabblad openen:", "description": "" @@ -147,18 +183,42 @@ "message": "Enkele populaire labels: \"postvakIN\", \"belangrijk\", \"^slimlabel_persoonlijk\", \"^slimlabel_nieuwsbrief\", \"^slimlabel_melding\" en \"^slimlabel_groep\"", "description": "" }, + "popup_msg_17": { + "message": "augustus", + "description": "" + }, + "popup_msg_15": { + "message": "juni", + "description": "" + }, + "options_notifications_34": { + "message": "e-mail-samenvatting bevat", + "description": "" + }, + "label_14": { + "message": "Ingelogde accounts", + "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.", "description": "" }, "options_misc_6": { - "message": "Geen bureaubladmeldingen weergeven om te waarschuwen dat de Gmail-website al geopend is", + "message": "Bureaubladmeldingen weergeven als waarschuwing wanneer Gmail al geopend is op het actieve tabblad", + "description": "" + }, + "popup_read": { + "message": "Als gelezen markeren", "description": "" }, "options_notifications_4": { "message": "Meldingopmaak", "description": "" }, + "settings_open_title": { + "message": "Open de opties-pagina (instellingen)", + "description": "" + }, "label_2": { "message": "Instellingen", "description": "" @@ -179,6 +239,10 @@ "message": "Voor 1 uur", "description": "" }, + "popup_archive": { + "message": "Archief", + "description": "" + }, "msg_2": { "message": "Link is gekopieerd naar het klembord.", "description": "" @@ -187,10 +251,34 @@ "message": "Voorkeuren - Gmail™-melder", "description": "" }, + "popup_msg_13": { + "message": "april", + "description": "" + }, + "popup_msg_9_format": { + "message": "%d maand(en) geleden", + "description": "" + }, + "popup_msg_11": { + "message": "februari", + "description": "" + }, + "popup_open_inbox": { + "message": "Postvak IN openen", + "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.", + "description": "" + }, "gmail": { "message": "Gmail™-melder", "description": "" }, + "popup_msg_6": { + "message": "Gisteren", + "description": "" + }, "options_toolbar_8": { "message": "Minimale breedte is 500px.", "description": "" @@ -203,6 +291,10 @@ "message": "Geen exact badgenummer weergeven wanneer het aantal ongelezen e-mails hoger is dan 999", "description": "" }, + "popup_msg_18": { + "message": "september", + "description": "" + }, "options_notifications_14": { "message": "Deze optie is zeer experimenteel en kan mogelijk instabiliteit veroorzaken in Firefox. [Herstart vereist].", "description": "" @@ -223,8 +315,12 @@ "message": "Log alstublieft in op uw Gmail-account", "description": "" }, + "popup_of": { + "message": "van", + "description": "" + }, "options_notifications_15": { - "message": "Meldingsgeluid is", + "message": "Standaard meldingsgeluid is", "description": "" }, "options_notifications_21": { @@ -243,6 +339,14 @@ "message": "onbekend", "description": "" }, + "popup_msg_21": { + "message": "december", + "description": "" + }, + "popup_read_all": { + "message": "Alles als gelezen markeren", + "description": "" + }, "options_notifications_8": { "message": "Om te afbreking te voorkomen, vul hier een groot getal in.", "description": "" @@ -303,10 +407,18 @@ "message": "Taakbalkmeldingen worden momenteel niet ondersteund op Linux-besturingssystemen.", "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", + "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.", "description": "" }, + "popup_refresh": { + "message": "Verversen", + "description": "" + }, "options_misc_5": { "message": "Blauwe kleur voor \"Geen ongelezen berichten en grijze kleur voor \"Niet verbonden\"", "description": "" @@ -315,10 +427,22 @@ "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_msg_19": { + "message": "oktober", + "description": "" + }, + "options_notifications_33": { + "message": "e-mail-titel bevat", + "description": "" + }, "tooltip_3": { "message": "Rechtsklik: Accountselectie", "description": "" }, + "popup_date_format": { + "message": "%mm %dd, %yy", + "description": "" + }, "options_notifications": { "message": "Meldingen:", "description": "" @@ -327,14 +451,22 @@ "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.", "description": "" }, + "popup_msg_12": { + "message": "maart", + "description": "" + }, "options_notifications_22": { - "message": "Als uw browser geen meldingsgeluid afspeelt, probeer dan om het te converteren naar plat WAV-formaat middels een online converteerapplicatie.", + "message": "Als uw browser geen aangepast meldingsgeluid afspeelt, probeer dan om het te converteren naar plat WAV-formaat middels een online converteerapplicatie.", "description": "" }, "options_tab_1": { "message": "Alleen op het actieve venster zoeken naar een openstaand Gmail-account", "description": "" }, + "popup_msg_7_format": { + "message": "%d dagen geleden", + "description": "" + }, "options_timings_l1": { "message": "Op nieuwe e-mails controleren, elke (in seconden):", "description": "" @@ -347,6 +479,14 @@ "message": "Gmail™-melder", "description": "" }, + "popup_msg_1": { + "message": "zojuist", + "description": "" + }, + "popup_open_settings": { + "message": "Instellingen openen", + "description": "" + }, "options_misc_3": { "message": "Kleurenpatroon van werkbalk is", "description": "" @@ -387,6 +527,10 @@ "message": "Zesde account (/mail/u/5)", "description": "" }, + "popup_msg_8_format": { + "message": "%d we(e)k(en) geleden", + "description": "" + }, "options_toolbar": { "message": "Werkbalk:", "description": "" @@ -395,10 +539,18 @@ "message": "Meldingen afbreken die langer zijn dan", "description": "" }, + "popup_wait": { + "message": "Wachten...", + "description": "" + }, "tooltip_2": { "message": "Middelklik (of Ctrl+Links): Alle accounts verversen", "description": "" }, + "options_notifications_29": { + "message": "Deze optie is gerelateerd aan het rechtermuisknopmenu op de werkbalkknop -> Alle meldingen uitschakelen -> Aangepaste tijdsperiode.", + "description": "" + }, "options_tab_3": { "message": "Nieuw Gmail-account openen op tabblad naast actief tabblad", "description": "" @@ -419,6 +571,26 @@ "message": "Alleen bureaublad- en geluidsmeldingen weergeven wanneer een e-mail binnen is ontvangen in minder dan (in minuten):", "description": "" }, + "options_tab_8": { + "message": "Geopende Gmail-tabbladen negeren", + "description": "" + }, + "popup_no_subject": { + "message": "(geen onderwerp)", + "description": "" + }, + "msg_5": { + "message": "Selecteer een audiobestand", + "description": "" + }, + "popup_msg_2": { + "message": "1 minuut geleden", + "description": "" + }, + "popup_msg_16": { + "message": "juli", + "description": "" + }, "label_8": { "message": "Voor 2 uur", "description": "" @@ -427,6 +599,10 @@ "message": "Let op: om de melder correct te laten werken moet u ingelogd zijn op uw Google-account.", "description": "" }, + "popup_msg_20": { + "message": "november", + "description": "" + }, "options_toolbar_6": { "message": "Volledige inhoud weergeven", "description": "" @@ -447,6 +623,10 @@ "message": "Breedte van werkbalkpaneel in volledige-inhoudsweergave is (in pixels):", "description": "" }, + "options_notifications_31": { + "message": "Aangepaste geluidsmelding", + "description": "" + }, "options_timings_l5": { "message": "Minimale tijdsduur is 5 minuten.", "description": "" @@ -475,6 +655,10 @@ "message": "Vijfde account (/mail/u/4)", "description": "" }, + "popup_msg_14": { + "message": "mei", + "description": "" + }, "options_inshort": { "message": "Labels- en accountsmelder voor Google Mail (Gmail)", "description": "" @@ -487,12 +671,20 @@ "message": "Gmail-account openen op actief tabblad", "description": "" }, + "popup_msg_3_format": { + "message": "%d minuten geleden", + "description": "" + }, "label_12": { - "message": "Website openen", + "message": "Veel gestelde vragen (FAQ) openen", "description": "" }, "description": { "message": "Labels- en accountsmelder voor Google Mail (Gmail)", "description": "" + }, + "popup_spam": { + "message": "Spam", + "description": "" } } \ No newline at end of file diff --git a/src/_locales/pl/messages.json b/v1/builds/unpacked/chrome/_locales/pl/messages.json similarity index 72% rename from src/_locales/pl/messages.json rename to v1/builds/unpacked/chrome/_locales/pl/messages.json index 50ce245d..8395b883 100644 --- a/src/_locales/pl/messages.json +++ b/v1/builds/unpacked/chrome/_locales/pl/messages.json @@ -15,8 +15,16 @@ "message": "Otwórz panel paska narzędzi podczas kliknięcia na ikonkę powiadomień paska zadań (tylko Windows, beta)", "description": "" }, + "options_notifications_30": { + "message": "Połącz wszystkie jednoczesne powiadomienia na pulpicie w pojedyncze", + "description": "" + }, + "settings_open_label": { + "message": "Otwórz opcje", + "description": "" + }, "options_timings_l7": { - "message": "Nie sprawdzaj nowych wiadomości przy starcie przez (sekundy):", + "message": "Sprawdzaj nowe wiadomości przy starcie po (sekundy):", "description": "" }, "label_4": { @@ -27,6 +35,10 @@ "message": "Przypominaj o nieprzeczytanych wiadomościach co (minuty):", "description": "" }, + "popup_msg_4": { + "message": "godzinę temu", + "description": "" + }, "options_gmail_1": { "message": "Konto główne (/mail/u/0/)", "description": "" @@ -51,10 +63,18 @@ "message": "Przywróć wszystkie ustawienia do fabrycznych", "description": "" }, + "options_notifications_28": { + "message": "Wyłącz wszystkie powiadomienia na własny odstęp czasowy (minuty):", + "description": "" + }, "options_timings_l4": { "message": "Ustaw wartość na zero, aby nie otrzymywać przypomnień.", "description": "" }, + "options_notifications_32": { + "message": "nazwa lub e-mail zawiera", + "description": "" + }, "options_tab_6": { "message": "Otwórz konto Gmail w nowym oknie", "description": "" @@ -71,6 +91,10 @@ "message": "Minimalna wysokość to 500px.", "description": "" }, + "popup_msg_10": { + "message": "stycznia", + "description": "" + }, "options_notifications_26": { "message": "Zawsze pokazuj ikony powiadomień (tylko Windows)", "description": "" @@ -79,12 +103,16 @@ "message": "Wyłącz wszystkie powiadomienia", "description": "" }, + "label_13": { + "message": "Na własny odstęp czasowy", + "description": "" + }, "options_empty": { "message": "nie określono", "description": "" }, "options_notifications_3": { - "message": "Ta opcja może nie działać na Twoim systemie operacyjnym.", + "message": "Ta opcja może nie działać na twoim systemie operacyjnym.", "description": "" }, "options_timings": { @@ -103,6 +131,10 @@ "message": "Czerwony dla \"Nieprzeczytane\" i szary dla \"Rozłączony\"", "description": "" }, + "popup_msg_5": { + "message": "godzin(y) temu", + "description": "" + }, "options_notifications_27": { "message": "Ikony obszaru powiadomień będą zawsze wyświetlane, nawet gdy brak nieprzeczytanych wiadomości.", "description": "" @@ -119,6 +151,10 @@ "message": "Od: [author_email][break]Tytuł: [title][break]Streszczenie: [summary]", "description": "" }, + "popup_trash": { + "message": "Usuń", + "description": "" + }, "options_tab": { "message": "Otwieranie kart:", "description": "" @@ -136,7 +172,7 @@ "description": "" }, "options_timings_l2": { - "message": "Minimalny okres czasu to 10 sekund.", + "message": "Minimalny odstęp czasowy to 10 sekund.", "description": "" }, "options_toolbar_11": { @@ -147,24 +183,48 @@ "message": "Popularne etykiety: \"inbox\", \"important\", \"^smartlabel_personal\", \"^smartlabel_newsletter\", \"^smartlabel_notification\" oraz \"^smartlabel_group\"", "description": "" }, + "popup_msg_17": { + "message": "sierpnia", + "description": "" + }, + "popup_msg_15": { + "message": "czerwca", + "description": "" + }, + "options_notifications_34": { + "message": "podsumowanie e-mail'a zawiera", + "description": "" + }, + "label_14": { + "message": "Zalogowane konta", + "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_6": { - "message": "Nie pokazuj powiadomień na pulpicie, jeśli strona Gmail jest już otworzona", + "message": "Pokazuj powiadomienia na pulpicie, aby powiadomić, że Gmail jest już otwarty w aktywnej karcie", + "description": "" + }, + "popup_read": { + "message": "Przeczytane", "description": "" }, "options_notifications_4": { "message": "Format powiadomienia", "description": "" }, + "settings_open_title": { + "message": "Otwórz stronę opcji (ustawień)", + "description": "" + }, "label_2": { "message": "Ustawienia", "description": "" }, "options_toolbar_14": { - "message": "Jeżeli wolisz sam tekst w trybie pełnej zawartości, odznacz to pole.", + "message": "Jeżeli wolisz surowy tekst w trybie pełnej zawartości, odznacz to pole.", "description": "" }, "options_notifications_18": { @@ -179,6 +239,10 @@ "message": "Przez godzinę", "description": "" }, + "popup_archive": { + "message": "Archiwizuj", + "description": "" + }, "msg_2": { "message": "Link został skopiowany do schowka.", "description": "" @@ -187,10 +251,34 @@ "message": "Opcje - Powiadomienia Gmail™", "description": "" }, + "popup_msg_13": { + "message": "kwietnia", + "description": "" + }, + "popup_msg_9_format": { + "message": "miesięcy temu: %d", + "description": "" + }, + "popup_msg_11": { + "message": "lutego", + "description": "" + }, + "popup_open_inbox": { + "message": "Otwórz skrzynkę", + "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": "" + }, "gmail": { "message": "Powiadomienia Gmail™", "description": "" }, + "popup_msg_6": { + "message": "wczoraj", + "description": "" + }, "options_toolbar_8": { "message": "Minimalna szerokość to 500px.", "description": "" @@ -203,6 +291,10 @@ "message": "Nie wyświetlaj szczegółowej liczby na znaczku, gdy liczba nieprzeczytanych wiadomości jest większa niż 999", "description": "" }, + "popup_msg_18": { + "message": "września", + "description": "" + }, "options_notifications_14": { "message": "Ta funkcjonalność jest eksperymentalna i może uczynić Twoją przeglądarkę Firefox niestabilną [wymagany restart].", "description": "" @@ -223,8 +315,12 @@ "message": "Proszę się zalogować do konta Gmail", "description": "" }, + "popup_of": { + "message": "z", + "description": "" + }, "options_notifications_15": { - "message": "Dźwięk powiadomienia", + "message": "Domyślny dźwięk powiadomienia to", "description": "" }, "options_notifications_21": { @@ -243,6 +339,14 @@ "message": "nieznane", "description": "" }, + "popup_msg_21": { + "message": "grudnia", + "description": "" + }, + "popup_read_all": { + "message": "Wszystkie przeczytane", + "description": "" + }, "options_notifications_8": { "message": "Jeżeli nie chcesz skracać, wpisz dużą liczbę.", "description": "" @@ -303,10 +407,18 @@ "message": "Obecnie, powiadomienia paska zadań nie są wspierane na systemach Linuks.", "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": "" + }, "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": "" }, + "popup_refresh": { + "message": "Odśwież", + "description": "" + }, "options_misc_5": { "message": "Niebieski dla \"Nieprzeczytane\" i szary dla \"Rozłączony\"", "description": "" @@ -315,26 +427,46 @@ "message": "Ustaw wartość na zero, aby nie sprawdzać nowych wiadomości przed pierwszym ręcznym odświeżeniem [niedostępne na Safari].", "description": "" }, + "popup_msg_19": { + "message": "października", + "description": "" + }, + "options_notifications_33": { + "message": "tytuł e-mail'a zawiera", + "description": "" + }, "tooltip_3": { "message": "PPM: Wybór kont", "description": "" }, + "popup_date_format": { + "message": "%dd %mm %yy", + "description": "" + }, "options_notifications": { "message": "Powiadomienia:", "description": "" }, "options_timings_l6": { - "message": "Wartości inne niż zero wyzwalają powiadomienia na pulpicie oraz dźwięk (podobnie jak otrzymanie nowej poczty), dopóki posiadasz nieprzeczytane wiadomości.", + "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": "" + }, + "popup_msg_12": { + "message": "marca", "description": "" }, "options_notifications_22": { - "message": "Jeżeli Twoja przeglądarka nie odtwarza dźwięku powiadomienia, spróbuj go przekonwertować do zwykłego formatu WAV przy pomocy narzędzi konwersji online.", + "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_tab_1": { "message": "Szukaj w aktywnym oknie otwartej karty z kontem Gmail", "description": "" }, + "popup_msg_7_format": { + "message": "%d dni temu", + "description": "" + }, "options_timings_l1": { "message": "Sprawdzaj nowe wiadomości co (sekundy):", "description": "" @@ -347,6 +479,14 @@ "message": "Powiadomienia Gmail™", "description": "" }, + "popup_msg_1": { + "message": "przed chwilą", + "description": "" + }, + "popup_open_settings": { + "message": "Otwórz ustawienia", + "description": "" + }, "options_misc_3": { "message": "Kolor paska narzędzi:", "description": "" @@ -376,7 +516,7 @@ "description": "" }, "options_tab_7": { - "message": "Zawsze używaj pustych kart zamiast otwierania nowej karty przy aktywnej takiej opcji", + "message": "Zawsze używaj pustych kart zamiast otwierania nowej karty (gdy opcja otwierania na karcie jest aktywna)", "description": "" }, "options_toolbar_3": { @@ -387,6 +527,10 @@ "message": "Szóste konto (/mail/u/5/)", "description": "" }, + "popup_msg_8_format": { + "message": "%d tygodni(e) temu", + "description": "" + }, "options_toolbar": { "message": "Pasek narzędzi:", "description": "" @@ -395,10 +539,18 @@ "message": "Skracaj powiadomienia dłuższe niż", "description": "" }, + "popup_wait": { + "message": "Czekaj...", + "description": "" + }, "tooltip_2": { "message": "Kółko myszy (lub Ctrl+LPM): Odśwież wszystkie konta", "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_tab_3": { "message": "Otwórz kolejne konto Gmail za aktywną kartą", "description": "" @@ -419,6 +571,26 @@ "message": "Uruchom powiadomienia na pulpicie oraz dźwiękowe, gdy e-mail został otrzymany poniżej (minut):", "description": "" }, + "options_tab_8": { + "message": "Ignoruj otwarte karty Gmail'a", + "description": "" + }, + "popup_no_subject": { + "message": "(brak tematu)", + "description": "" + }, + "msg_5": { + "message": "Wybierz plik z dźwiękiem audio", + "description": "" + }, + "popup_msg_2": { + "message": "minutę temu", + "description": "" + }, + "popup_msg_16": { + "message": "lipca", + "description": "" + }, "label_8": { "message": "Przez 2 godziny", "description": "" @@ -427,6 +599,10 @@ "message": "Informacja: Aby powiadomienia działały poprawnie, musisz być zalogowany do swojego konta Google.", "description": "" }, + "popup_msg_20": { + "message": "listopada", + "description": "" + }, "options_toolbar_6": { "message": "Pokazuj pełną zawartość", "description": "" @@ -447,8 +623,12 @@ "message": "Szerokość panelu paska narzędzi w trybie pełnej zawartości (piksele):", "description": "" }, + "options_notifications_31": { + "message": "Własny dźwięk powiadomienia", + "description": "" + }, "options_timings_l5": { - "message": "Minimalny czas to 5 minut.", + "message": "Minimalny odstęp czasowy to 5 minut.", "description": "" }, "options_misc": { @@ -475,6 +655,10 @@ "message": "Piąte konto (/mail/u/4)", "description": "" }, + "popup_msg_14": { + "message": "maja", + "description": "" + }, "options_inshort": { "message": "Etykiety i powiadomienia kont dla Poczty Google (Gmail).", "description": "" @@ -487,12 +671,20 @@ "message": "Otwórz konto Gmail w aktywnej karcie", "description": "" }, + "popup_msg_3_format": { + "message": "%d minut(y) temu", + "description": "" + }, "label_12": { - "message": "Otwórz stronę domową", + "message": "Otwórz FAQ", "description": "" }, "description": { "message": "Etykiety i powiadomienia kont dla Poczty Google (Gmail)", "description": "" + }, + "popup_spam": { + "message": "Zgłoś spam", + "description": "" } } \ No newline at end of file diff --git a/src/_locales/ru/messages.json b/v1/builds/unpacked/chrome/_locales/ru/messages.json similarity index 75% rename from src/_locales/ru/messages.json rename to v1/builds/unpacked/chrome/_locales/ru/messages.json index 217ab94c..01dc075d 100644 --- a/src/_locales/ru/messages.json +++ b/v1/builds/unpacked/chrome/_locales/ru/messages.json @@ -15,6 +15,14 @@ "message": "При клике на значок в трее открывать окно предварительного просмотра (только для Windows, beta)", "description": "" }, + "options_notifications_30": { + "message": "Объединять несколько параллельных уведомлений в одно", + "description": "" + }, + "settings_open_label": { + "message": "Открыть настройки", + "description": "" + }, "options_timings_l7": { "message": "Не проверять почту сразу после запуска в течении (в секундах):", "description": "" @@ -27,6 +35,10 @@ "message": "Напоминать о непрочитанных сообщениях каждые (в минутах):", "description": "" }, + "popup_msg_4": { + "message": "1 час назад", + "description": "" + }, "options_gmail_1": { "message": "Основной аккаунт (/mail/u/0/)", "description": "" @@ -51,10 +63,18 @@ "message": "Сбросить все настройки на начальные", "description": "" }, + "options_notifications_28": { + "message": "Отключить все уведомления на определенный период времени Х (в минутах)", + "description": "" + }, "options_timings_l4": { "message": "Установите ноль для отключения напоминаний.", "description": "" }, + "options_notifications_32": { + "message": "имя или адрес содержит", + "description": "" + }, "options_tab_6": { "message": "Открывать Gmail в новом окне", "description": "" @@ -71,6 +91,10 @@ "message": "Минимальная высота окна - 500px.", "description": "" }, + "popup_msg_10": { + "message": "Январь", + "description": "" + }, "options_notifications_26": { "message": "Всегда показывать значок уведомления в трее (Только Windows)", "description": "" @@ -79,6 +103,10 @@ "message": "Отключить все оповещения...", "description": "" }, + "label_13": { + "message": "на Х минут", + "description": "" + }, "options_empty": { "message": "не определен", "description": "" @@ -103,6 +131,10 @@ "message": "Красный для \"Нет непрочитанных\" и серый для \"Отключен\"", "description": "" }, + "popup_msg_5": { + "message": "часов назад", + "description": "" + }, "options_notifications_27": { "message": "Значок в трее будет показан даже если нет не прочитанных сообщений.", "description": "" @@ -119,6 +151,10 @@ "message": "От: [author_email][break]Тема: [title][break]Сводка: [summary]", "description": "" }, + "popup_trash": { + "message": "Удалить", + "description": "" + }, "options_tab": { "message": "Открытие вкладки Gmail:", "description": "" @@ -147,18 +183,42 @@ "message": "Некоторые популярные ярлыки: \"inbox\", \"important\", \"^smartlabel_personal\", \"^smartlabel_newsletter\", \"^smartlabel_notification\", and \"^smartlabel_group\"", "description": "" }, + "popup_msg_17": { + "message": "Август", + "description": "" + }, + "popup_msg_15": { + "message": "Июнь", + "description": "" + }, + "options_notifications_34": { + "message": "краткая сводка сообщения содержит", + "description": "" + }, + "label_14": { + "message": "Авторизованные аккаунты", + "description": "" + }, "options_misc_13": { "message": "По умолчанию в тексте всплывающей подсказки значка на панели инструментов показывается название учетной записи.", "description": "" }, "options_misc_6": { - "message": "Не показывать всплывающее уведомление о том, что вкладка Gmail уже открыта", + "message": "Показывать всплывающее уведомление о том, что Gmail уже открыт в активной вкладке", + "description": "" + }, + "popup_read": { + "message": "Прочтено", "description": "" }, "options_notifications_4": { "message": "Формат уведомления", "description": "" }, + "settings_open_title": { + "message": "Открыть страницу настроек", + "description": "" + }, "label_2": { "message": "Настройки", "description": "" @@ -179,6 +239,10 @@ "message": "на 1 час", "description": "" }, + "popup_archive": { + "message": "Архивировать", + "description": "" + }, "msg_2": { "message": "Ссылка скопирована в буфер обмена.", "description": "" @@ -187,22 +251,50 @@ "message": "Настройки", "description": "" }, + "popup_msg_13": { + "message": "Апрель", + "description": "" + }, + "popup_msg_9_format": { + "message": "%d месяца(ев) назад", + "description": "" + }, + "popup_msg_11": { + "message": "Февраль", + "description": "" + }, + "popup_open_inbox": { + "message": "Открыть входящие", + "description": "" + }, + "options_tab_9": { + "message": "Если активировано, аддон проверяет на наличие открытого уже Gmail и переключает фокус на него.", + "description": "" + }, "gmail": { "message": "Оповещение для Gmail™", "description": "" }, + "popup_msg_6": { + "message": "Вчера", + "description": "" + }, "options_toolbar_8": { "message": "Минимальная ширина окна - 500px.", "description": "" }, "options_notifications_16": { - "message": "Звук оповещения по умолчанию", + "message": "По умолчанию", "description": "" }, "options_misc_14": { "message": "Не показывать точное количество непрочитанных сообщений на значке в панели инструментов, если оно превышает 999", "description": "" }, + "popup_msg_18": { + "message": "Сентябрь", + "description": "" + }, "options_notifications_14": { "message": "Эта экспериментальная функция и может вызвать нестабильность в работе Firefox. [Требуется перезапуск].", "description": "" @@ -223,8 +315,12 @@ "message": "Войдите, пожалуйста, в Ваш аккаунт Gmail", "description": "" }, + "popup_of": { + "message": "из", + "description": "" + }, "options_notifications_15": { - "message": "Звуковое оповещение:", + "message": "Звук оповещений по умолчанию", "description": "" }, "options_notifications_21": { @@ -243,6 +339,14 @@ "message": "не определено", "description": "" }, + "popup_msg_21": { + "message": "Декабрь", + "description": "" + }, + "popup_read_all": { + "message": "Все прочтено", + "description": "" + }, "options_notifications_8": { "message": "Чтобы избежать обрезания сообщений, используйте здесь большие значения.", "description": "" @@ -303,22 +407,42 @@ "message": "Оповещения на панели задач для Linux OS пока не поддерживаются.", "description": "" }, + "options_notifications_35": { + "message": "Для выбора нового пользовательского звука сначала выберите встроенный звук, а затем измените опцию на пользовательский звук", + "description": "" + }, "msg_1": { "message": "Вкладка уже открыта. Нажмите на кнопку на панели инструментов чтобы открыть Gmail в новой вкладке или перейти на уже открытую вкладку Gmail.", "description": "" }, + "popup_refresh": { + "message": "Обновить", + "description": "" + }, "options_misc_5": { "message": "Голубой для \"Нет непрочитанных\" и серый для \"Отключен\"", "description": "" }, "options_timings_l8": { - "message": "При установке нуля автоматическая проверка почты начнется только после первого ручного обновления [Не доступно в Safari].", + "message": "При установке нуля автоматическая проверка почты начнется только после первого ручного обновления (Не доступно в Safari).", + "description": "" + }, + "popup_msg_19": { + "message": "Октябрь", + "description": "" + }, + "options_notifications_33": { + "message": "заголовок сообщения содержит", "description": "" }, "tooltip_3": { "message": "Правый клик: Меню дополнения", "description": "" }, + "popup_date_format": { + "message": "%mm %dd, %yy", + "description": "" + }, "options_notifications": { "message": "Всплывающие уведомления:", "description": "" @@ -327,14 +451,22 @@ "message": "Ненулевое значение включает всплывающие уведомления и звуковое оповещение (как при получении нового сообщения).", "description": "" }, + "popup_msg_12": { + "message": "Март", + "description": "" + }, "options_notifications_22": { - "message": "Если Ваш браузер не проигрывает звук, попробуйте конвертировать звуковой файл в формат WAV.", + "message": "Если ваш браузер не воспроизводит звук оповещения, попробуйте конвертировать файл в формат WAV с помощью онлайн инструментов.", "description": "" }, "options_tab_1": { "message": "Отслеживать открытую вкладку Gmail только в активном окне браузера", "description": "" }, + "popup_msg_7_format": { + "message": "%d дней назад", + "description": "" + }, "options_timings_l1": { "message": "Проверять почту каждые (в секундах):", "description": "" @@ -347,6 +479,14 @@ "message": "Оповещение для Gmail™", "description": "" }, + "popup_msg_1": { + "message": "только сейчас", + "description": "" + }, + "popup_open_settings": { + "message": "Настройки", + "description": "" + }, "options_misc_3": { "message": "Цвет значка на панели инструментов", "description": "" @@ -380,13 +520,17 @@ "description": "" }, "options_toolbar_3": { - "message": "Открывать Gmail только если залогинен один аккаунт", + "message": "Открывать Gmail только если авторизован один аккаунт", "description": "" }, "options_gmail_7": { "message": "Шестой аккаунт (/mail/u/5/)", "description": "" }, + "popup_msg_8_format": { + "message": "%d недель назад", + "description": "" + }, "options_toolbar": { "message": "Окно предварительного просмотра:", "description": "" @@ -395,10 +539,18 @@ "message": "Обрезать текст уведомления длиннее чем", "description": "" }, + "popup_wait": { + "message": "Ожидайте...", + "description": "" + }, "tooltip_2": { "message": "Средний клик (или Ctrl+левый клик): Обновить все аккаунты", "description": "" }, + "options_notifications_29": { + "message": "Эта настройка относится к меню кнопки на панели инструментов -> Отключить все уведомления -> на Х минут", + "description": "" + }, "options_tab_3": { "message": "Открывать вкладку Gmail рядом с активной вкладкой", "description": "" @@ -419,6 +571,26 @@ "message": "Всплывающие уведомления и звуковое оповещение только для сообщений, полученных менее чем (в минутах):", "description": "" }, + "options_tab_8": { + "message": "Игнорировать открытые с Gmail вкладки", + "description": "" + }, + "popup_no_subject": { + "message": "(без темы)", + "description": "" + }, + "msg_5": { + "message": "Выберите звуковой файл", + "description": "" + }, + "popup_msg_2": { + "message": "1 минуту назад", + "description": "" + }, + "popup_msg_16": { + "message": "Июль", + "description": "" + }, "label_8": { "message": "на 2 часа", "description": "" @@ -427,6 +599,10 @@ "message": "Замечание: Чтобы оповещение работало правильно, вы должны быть залогинены в свой аккаунт Google.", "description": "" }, + "popup_msg_20": { + "message": "Ноябрь", + "description": "" + }, "options_toolbar_6": { "message": "Полный режим - показывать сообщение целиком", "description": "" @@ -447,6 +623,10 @@ "message": "Ширина окна просмотра в полном режиме (в пискелях):", "description": "" }, + "options_notifications_31": { + "message": "Пользовательское звуковое оповещение", + "description": "" + }, "options_timings_l5": { "message": "Минимальный период - 5 мин.", "description": "" @@ -475,6 +655,10 @@ "message": "Пятый аккаунт (/mail/u/4/)", "description": "" }, + "popup_msg_14": { + "message": "Май", + "description": "" + }, "options_inshort": { "message": "Оповещение для нескольких аккаунтов Google Mail (Gmail).", "description": "" @@ -487,12 +671,20 @@ "message": "Открывать Gmail в активной вкладке", "description": "" }, + "popup_msg_3_format": { + "message": "%d минут назад", + "description": "" + }, "label_12": { - "message": "Открыть домашнюю страницу", + "message": "Открыть FAQ", "description": "" }, "description": { "message": "Оповещение для нескольких аккаунтов Google Mail (Gmail)", "description": "" + }, + "popup_spam": { + "message": "Спам", + "description": "" } } \ No newline at end of file diff --git a/v1/builds/unpacked/chrome/_locales/sr/messages.json b/v1/builds/unpacked/chrome/_locales/sr/messages.json new file mode 100644 index 00000000..da56f8e0 --- /dev/null +++ b/v1/builds/unpacked/chrome/_locales/sr/messages.json @@ -0,0 +1,690 @@ +{ + "label_9": { + "message": "На 5 сати", + "description": "" + }, + "options_notifications_19": { + "message": "Windows email звук", + "description": "" + }, + "options_notifications_17": { + "message": "Checker Plus bell", + "description": "" + }, + "options_notifications_13": { + "message": "Отвори панел прегледа поште када кликнем на иконицу обавештења на траци задатака (само Windows, бета)", + "description": "" + }, + "options_notifications_30": { + "message": "Споји сва истовремена десктоп обавештења у једно обавештење", + "description": "" + }, + "settings_open_label": { + "message": "Отвори опције", + "description": "" + }, + "options_timings_l7": { + "message": "Не проверавај нову пошту при покретању у року од (у секундама):", + "description": "" + }, + "label_4": { + "message": "На 5 минута", + "description": "" + }, + "options_timings_l3": { + "message": "Подсети на сву непрочитану пошту сваких (у минутима):", + "description": "" + }, + "popup_msg_4": { + "message": "пре 1 сат", + "description": "" + }, + "options_gmail_1": { + "message": "Основни налог (/mail/u/0/)", + "description": "" + }, + "options_gmail_10": { + "message": "Примај обавештења за следеће ознаке и налоге:", + "description": "" + }, + "options_notifications_1": { + "message": "Прикажи десктоп обавештења о новој пошти", + "description": "" + }, + "options_notifications_9": { + "message": "Пусти звучно обавештење о новој пошти", + "description": "" + }, + "label_6": { + "message": "На 30 минута", + "description": "" + }, + "options_misc_8": { + "message": "Врати сва подешавања на фабричка", + "description": "" + }, + "options_notifications_28": { + "message": "Онемогући сва обавештења у прилагођеном временском периоду (у минутима)", + "description": "" + }, + "options_timings_l4": { + "message": "Постави вредност на нула за искључивање подсетника.", + "description": "" + }, + "options_notifications_32": { + "message": "име или е-пошта садржи", + "description": "" + }, + "options_tab_6": { + "message": "Отвори Gmail налог у новом прозору", + "description": "" + }, + "options_notifications_25": { + "message": "У Ѕafari прегледачу највероватније се подразумевани звук обавештења неће емитовати исправно, у том случају употребите прилагођени звук за обавештење.", + "description": "" + }, + "options_toolbar_15": { + "message": "Средњи клик на дугме на алатној траци", + "description": "" + }, + "options_toolbar_10": { + "message": "Минимална висина је 500 пиксела.", + "description": "" + }, + "popup_msg_10": { + "message": "јануар", + "description": "" + }, + "options_notifications_26": { + "message": "Увек прикажи иконицу обавештења у системској траци (само Windows)", + "description": "" + }, + "label_3": { + "message": "Онемогући сва обавештења", + "description": "" + }, + "label_13": { + "message": "У прилагођеном временском периоду", + "description": "" + }, + "options_empty": { + "message": "недефинисано", + "description": "" + }, + "options_notifications_3": { + "message": "Ова опција можда неће радити на Вашем оперативном систему.", + "description": "" + }, + "options_timings": { + "message": "Подешавања времена", + "description": "" + }, + "options_gmail_5": { + "message": "Четврти налог (/mail/u/3/)", + "description": "" + }, + "label_5": { + "message": "На 15 минута", + "description": "" + }, + "options_misc_9": { + "message": "Црвена боја за \"Нема непрочитаних\" и сива за \"Неповезан\"", + "description": "" + }, + "popup_msg_5": { + "message": "сата/и раније", + "description": "" + }, + "options_notifications_27": { + "message": "Иконица обавештења у системској траци ће бити приказана чак и ако нема непрочитаних порука.", + "description": "" + }, + "options_misc_1": { + "message": "Поређај налоге по алфабету", + "description": "" + }, + "tooltip_1": { + "message": "Леви клик: Отвори Gmail или панел прегледа поште", + "description": "" + }, + "notification": { + "message": "Од: [author_email][break]Наслов: [title][break]Кратак преглед: [summary]", + "description": "" + }, + "popup_trash": { + "message": "Избриши", + "description": "" + }, + "options_tab": { + "message": "Отварање картица:", + "description": "" + }, + "log_into_your_account": { + "message": "Пријавите се својим Gmail налогом", + "description": "" + }, + "label_10": { + "message": "Омогући обавештења", + "description": "" + }, + "options_notifications_23": { + "message": "Јачина звука обавештења је", + "description": "" + }, + "options_timings_l2": { + "message": "Минимални период је 10 секунди.", + "description": "" + }, + "options_toolbar_11": { + "message": "Омогући тастерске пречице у панелу", + "description": "" + }, + "options_gmail_9": { + "message": "Неке популарне ознаке: \"inbox\", \"important\", \"^smartlabel_personal\", \"^smartlabel_newsletter\", \"^smartlabel_notification\" и \"^smartlabel_group\"", + "description": "" + }, + "popup_msg_17": { + "message": "август", + "description": "" + }, + "popup_msg_15": { + "message": "јун", + "description": "" + }, + "options_notifications_34": { + "message": "кратак преглед е-поште садржи", + "description": "" + }, + "label_14": { + "message": "Пријављени налози", + "description": "" + }, + "options_misc_13": { + "message": "Подразумевано, у опису алатке на дугмету на алатној траци се приказују информације о пријављивању. Одчекирањем ове опције, опис алатке остаје на подразумеваној вредности.", + "description": "" + }, + "options_misc_6": { + "message": "Прикажи десктоп обавештење као упозорење да је Gmail већ отворен у активној картици", + "description": "" + }, + "popup_read": { + "message": "Озн. као прочитано", + "description": "" + }, + "options_notifications_4": { + "message": "Формат обавештења", + "description": "" + }, + "settings_open_title": { + "message": "Отвори страницу опција (подешавања)", + "description": "" + }, + "label_2": { + "message": "Подешавања", + "description": "" + }, + "options_toolbar_14": { + "message": "Одчекирајте ако више волите приказ само текста у режиму приказа пуног садржаја.", + "description": "" + }, + "options_notifications_18": { + "message": "Checker Plus ding", + "description": "" + }, + "options_tab_5": { + "message": "Отвори Gmail налог у позадинској картици", + "description": "" + }, + "label_7": { + "message": "На 1 сат", + "description": "" + }, + "popup_archive": { + "message": "Архивирај", + "description": "" + }, + "msg_2": { + "message": "Линк је копиран у клипборд.", + "description": "" + }, + "options_title": { + "message": "Gmail™ Notifier - Опције", + "description": "" + }, + "popup_msg_13": { + "message": "април", + "description": "" + }, + "popup_msg_9_format": { + "message": "пре %d месеца", + "description": "" + }, + "popup_msg_11": { + "message": "фебруар", + "description": "" + }, + "popup_open_inbox": { + "message": "Отвори Примљене", + "description": "" + }, + "options_tab_9": { + "message": "Када је отчекирано, Gmail Notifier проверава у активном или свим отвореним прозорима да ли има отворених Gmail инстанци и пребацује на картицу када је отварање картице захтевано.", + "description": "" + }, + "gmail": { + "message": "Gmail™ Notifier", + "description": "" + }, + "popup_msg_6": { + "message": "јуче", + "description": "" + }, + "options_toolbar_8": { + "message": "Минимална ширина је 500 пиксела.", + "description": "" + }, + "options_notifications_16": { + "message": "Gmail Notifier подразумевани звук", + "description": "" + }, + "options_misc_14": { + "message": "Не приказуј тачан број непрочитаних порука на иконици ако је већи од 999", + "description": "" + }, + "popup_msg_18": { + "message": "септембар", + "description": "" + }, + "options_notifications_14": { + "message": "Ово је експериментална функција и може изазвати нестабилност Firefox прегледача. [Неопходно је поновно покретање].", + "description": "" + }, + "options_gmail_3": { + "message": "Други налог (/mail/u/1/)", + "description": "" + }, + "options_notifications_11": { + "message": "Прикажи \"Windows обавештења на траци задатака\" или \"Mac OS Dock обавештења\"", + "description": "" + }, + "options_notifications_2": { + "message": "Прикажи десктоп обавештења у трајању од (у секундама):", + "description": "" + }, + "log_in_to_your_account": { + "message": "Пријавите се својим Gmail налогом", + "description": "" + }, + "popup_of": { + "message": "од", + "description": "" + }, + "options_notifications_15": { + "message": "Подразумевано звучно обавештење је", + "description": "" + }, + "options_notifications_21": { + "message": "Кориснички дефинисани звук обавештења је", + "description": "" + }, + "options_toolbar_9": { + "message": "Висина панела у режиму приказа пуног садржаја (у пикселима):", + "description": "" + }, + "options_toolbar_1": { + "message": "Понашање дугмета на алатној картици", + "description": "" + }, + "unknown": { + "message": "непознат", + "description": "" + }, + "popup_msg_21": { + "message": "децембар", + "description": "" + }, + "popup_read_all": { + "message": "Означи све као прочитано", + "description": "" + }, + "options_notifications_8": { + "message": "Да би се избегло сечење поруке, употребите велики број.", + "description": "" + }, + "options_donation": { + "message": "Донирајте", + "description": "" + }, + "msg_3": { + "message": "Одабрани текст је копиран у клипборд.", + "description": "" + }, + "options_misc_7": { + "message": "Прикажи страницу добродошлице при надоградњи", + "description": "" + }, + "options_gmail": { + "message": "Gmail:", + "description": "" + }, + "label_1": { + "message": "Освежи", + "description": "" + }, + "options_notifications_5": { + "message": "Доступне варијабле:", + "description": "" + }, + "options_notifications_24": { + "message": "Јачина је број од 0 до 100 при чему је 100 најгласније (подразумевано).", + "description": "" + }, + "options_notifications_10": { + "message": "Савет за кориснике Mac система. Од Firefox 28.0 верзије, свим десктоп обавештењима управља Mac Notification Center који емитује додатни звучни сигнал. Потребно је да одчекирате ово звучно обавештење или оно које је генерисано од стране Notification Center Mac система.", + "description": "" + }, + "options_misc_2": { + "message": "Подразумевани редослед је по времену пријављивања.", + "description": "" + }, + "options_toolbar_2": { + "message": "Увек отвори панел прегледа поште", + "description": "" + }, + "popup_settings": { + "message": "подешавања", + "description": "" + }, + "options_gmail_4": { + "message": "Трећи налог (/mail/u/2/)", + "description": "" + }, + "options_toolbar_5": { + "message": "Прикажи кратак преглед", + "description": "" + }, + "options_notifications_12": { + "message": "Обавештења на траци задатака нису подржана у Linux систему.", + "description": "" + }, + "options_notifications_35": { + "message": "За избор новог прилагођеног звука, изаберите прво уграђени звук а затим промените опцију на прилагођени звук", + "description": "" + }, + "msg_1": { + "message": "Картица је већ отворена. Кликните на дугме на алатној траци да отворите Gmail у новој картици или да се пребаците на постојећу Gmail картицу.", + "description": "" + }, + "popup_refresh": { + "message": "Освежи", + "description": "" + }, + "options_misc_5": { + "message": "Плава боја за \"Нема непрочитаних\" и сива за \"Неповезан\"", + "description": "" + }, + "options_timings_l8": { + "message": "Постави вредност на нула за непроверавање поште до првог ручног ажурирања [није доступно у Safari прегледачу].", + "description": "" + }, + "popup_msg_19": { + "message": "октобар", + "description": "" + }, + "options_notifications_33": { + "message": "наслов е-поште садржи", + "description": "" + }, + "tooltip_3": { + "message": "Десни клик: Избор налога", + "description": "" + }, + "popup_date_format": { + "message": "%dd. %mm %yy.", + "description": "" + }, + "options_notifications": { + "message": "Обавештења:", + "description": "" + }, + "options_timings_l6": { + "message": "Све вредности осим нуле покрећу десктоп обавештење и звучни сигнал (као када пристигне нова пошта) у задатим временским периодима ако имате непрочитану пошту.", + "description": "" + }, + "popup_msg_12": { + "message": "март", + "description": "" + }, + "options_notifications_22": { + "message": "Ако ваш прегледач не емитује прилагођени звук обавештења, покушајте да га конвертујете у WAV формат користећи алат за конвертовање на мрежи.", + "description": "" + }, + "options_tab_1": { + "message": "Потражи отворени Gmail налог само у активном прозору", + "description": "" + }, + "popup_msg_7_format": { + "message": "пре %d дана", + "description": "" + }, + "options_timings_l1": { + "message": "Провери нову пошту сваких (у секундама):", + "description": "" + }, + "options_toolbar_4": { + "message": "Режим приказа панела", + "description": "" + }, + "toolbar_label": { + "message": "Gmail™ Notifier", + "description": "" + }, + "popup_msg_1": { + "message": "управо сада", + "description": "" + }, + "popup_open_settings": { + "message": "Подешавања", + "description": "" + }, + "options_misc_3": { + "message": "Боја иконице на алатној траци", + "description": "" + }, + "options_gmail_12": { + "message": "Одвоји канале \",\" (зарезом). Пример канала: https://mail.google.com/mail/u/0/feed/atom/inbox", + "description": "" + }, + "options_toolbar_12": { + "message": "!: Пријави непожељну поруку, #: Отпад, e: Архивирај, Shift + i: Означи као прочитано.", + "description": "" + }, + "options_px": { + "message": "px", + "description": "" + }, + "options_misc_11": { + "message": "Постављајући ову вредност на нула, нећете примати ни десктоп ни звучна обавештења; ипак, обавештење у виду ознаке на иконици ће бити приказано.", + "description": "" + }, + "options_notifications_20": { + "message": "Кориснички дефинисани звук", + "description": "" + }, + "and": { + "message": "и", + "description": "" + }, + "options_tab_7": { + "message": "Увек употреби празну картицу уместо отварања нове картице (када је отварање у картици активирано)", + "description": "" + }, + "options_toolbar_3": { + "message": "Отвори Gmail налог ако је само један налог пријављен", + "description": "" + }, + "options_gmail_7": { + "message": "Шести налог (/mail/u/5/)", + "description": "" + }, + "popup_msg_8_format": { + "message": "пре %d седмице/а", + "description": "" + }, + "options_toolbar": { + "message": "Алатна трака:", + "description": "" + }, + "options_notifications_6": { + "message": "Скрати обавештења дужа од", + "description": "" + }, + "popup_wait": { + "message": "Сачекај...", + "description": "" + }, + "tooltip_2": { + "message": "Средњи (или Ctrl+Леви) клик: Освежи све налоге", + "description": "" + }, + "options_notifications_29": { + "message": "Ова опција се односи на мени на десном клику на дугмету на алатној траци -> онемогући сва обавештења -> прилагођени временски период", + "description": "" + }, + "options_tab_3": { + "message": "Отвори нови Gmail налог поред активне картице", + "description": "" + }, + "options_gmail_8": { + "message": "Означи поруке као прочитане при архивирању", + "description": "" + }, + "options_toolbar_17": { + "message": "Отвара основни Gmail налог", + "description": "" + }, + "options_notifications_7": { + "message": "карактера у пољима [title] и [summary].", + "description": "" + }, + "options_misc_10": { + "message": "Покрени десктоп и звучна обавештења само за пошту пристиглу у последњих (у минутима): ", + "description": "" + }, + "options_tab_8": { + "message": "Занемари отворене Gmail картице", + "description": "" + }, + "popup_no_subject": { + "message": "(без наслова)", + "description": "" + }, + "msg_5": { + "message": "Изаберите датотеку звучног обавештења", + "description": "" + }, + "popup_msg_2": { + "message": "пре 1 минут", + "description": "" + }, + "popup_msg_16": { + "message": "јул", + "description": "" + }, + "label_8": { + "message": "На 2 сата", + "description": "" + }, + "msg_4": { + "message": "Напомена: Да би обавештења радила исправно, морате бити пријављени на свој Google налог.", + "description": "" + }, + "popup_msg_20": { + "message": "новембар", + "description": "" + }, + "options_toolbar_6": { + "message": "Прикажи пун садржај", + "description": "" + }, + "options_gmail_11": { + "message": "Прилагођени канали:", + "description": "" + }, + "options_tab_2": { + "message": "Не тражи у другим прозорима прегледача отворене Gmail налоге. Ако Gmail није отворен у активном прозору, отвориће се у новој картици.", + "description": "" + }, + "label_11": { + "message": "Напиши нову поруку", + "description": "" + }, + "options_toolbar_7": { + "message": "Ширина панела у режиму приказа пуног садржаја (у пикселима):", + "description": "" + }, + "options_notifications_31": { + "message": "Прилагођени звук обавештења", + "description": "" + }, + "options_timings_l5": { + "message": "Минимални период је 5 минута.", + "description": "" + }, + "options_misc": { + "message": "Остало:", + "description": "" + }, + "options_gmail_2": { + "message": "Одвоји ознаке \",\" (зарезом).", + "description": "" + }, + "options_misc_4": { + "message": "Сива боја за \"Нема непрочитаних\" и плава за \"Неповезан\"", + "description": "" + }, + "options_toolbar_13": { + "message": "Прикажи пошту као HTML у режиму приказа пуног садржаја", + "description": "" + }, + "options_toolbar_16": { + "message": "Освежава све налоге", + "description": "" + }, + "options_gmail_6": { + "message": "Пети налог (/mail/u/4/)", + "description": "" + }, + "popup_msg_14": { + "message": "мај", + "description": "" + }, + "options_inshort": { + "message": "Обавештења за више Google Mail (Gmail) налога.", + "description": "" + }, + "options_misc_12": { + "message": "Не обухватај детаље о пријављивању у опису алатке", + "description": "" + }, + "options_tab_4": { + "message": "Отвори Gmail налог у активној картици", + "description": "" + }, + "popup_msg_3_format": { + "message": "пре %d минута", + "description": "" + }, + "label_12": { + "message": "Отвори FAQ", + "description": "" + }, + "description": { + "message": "Обавештења за више Google Mail (Gmail) налога", + "description": "" + }, + "popup_spam": { + "message": "Пријави непожељну поруку", + "description": "" + } +} \ No newline at end of file diff --git a/src/_locales/zh_CN/messages.json b/v1/builds/unpacked/chrome/_locales/zh_CN/messages.json similarity index 74% rename from src/_locales/zh_CN/messages.json rename to v1/builds/unpacked/chrome/_locales/zh_CN/messages.json index 08e9ffc3..13f52292 100644 --- a/src/_locales/zh_CN/messages.json +++ b/v1/builds/unpacked/chrome/_locales/zh_CN/messages.json @@ -15,6 +15,14 @@ "message": "在点击任务栏通知图标时打开工具栏面板(仅 Windows,测试版)", "description": "" }, + "options_notifications_30": { + "message": "整合所有连续的桌面通知为单条通知", + "description": "" + }, + "settings_open_label": { + "message": "打开选项", + "description": "" + }, "options_timings_l7": { "message": "不检查新邮件,在刚启动的(秒):", "description": "" @@ -27,6 +35,10 @@ "message": "提醒有未读邮件,每隔(分钟):", "description": "" }, + "popup_msg_4": { + "message": "1 小时前", + "description": "" + }, "options_gmail_1": { "message": "主帐户 (/mail/u/0/)", "description": "" @@ -51,10 +63,18 @@ "message": "重置所有设置到出厂设置", "description": "" }, + "options_notifications_28": { + "message": "指定时间内禁止所有通知 (分钟):", + "description": "" + }, "options_timings_l4": { "message": "设置值为 0 可禁用定期提醒。", "description": "" }, + "options_notifications_32": { + "message": "名称或电子邮件包含", + "description": "" + }, "options_tab_6": { "message": "在新窗口打开 Gmail 帐户", "description": "" @@ -71,6 +91,10 @@ "message": "最小高度为 500px。", "description": "" }, + "popup_msg_10": { + "message": "1月", + "description": "" + }, "options_notifications_26": { "message": "始终显示托盘通知 (仅 Windows)", "description": "" @@ -79,6 +103,10 @@ "message": "禁用所有通知", "description": "" }, + "label_13": { + "message": "自定义时间长度", + "description": "" + }, "options_empty": { "message": "未定义", "description": "" @@ -103,6 +131,10 @@ "message": "红色表示“无未读邮件”,灰色表示“已断开”", "description": "" }, + "popup_msg_5": { + "message": "小时前", + "description": "" + }, "options_notifications_27": { "message": "托盘通知图标将始终显示,即使没有未读邮件。", "description": "" @@ -119,6 +151,10 @@ "message": "来自: [author_email][break]标题: [title][break]摘要: [summary]", "description": "" }, + "popup_trash": { + "message": "删除", + "description": "" + }, "options_tab": { "message": "打开标签页:", "description": "" @@ -147,18 +183,42 @@ "message": "部分常用标签: \"inbox\", \"important\", \"^smartlabel_personal\", \"^smartlabel_newsletter\", \"^smartlabel_notification\", \"^smartlabel_group\"", "description": "" }, + "popup_msg_17": { + "message": "8月", + "description": "" + }, + "popup_msg_15": { + "message": "6月", + "description": "" + }, + "options_notifications_34": { + "message": "邮件摘要包含", + "description": "" + }, + "label_14": { + "message": "已登录帐户", + "description": "" + }, "options_misc_13": { "message": "默认情况下,本扩展的工具栏按钮的工具提示带有登录信息。取消此选项时,工具提示文本将恢复默认值。", "description": "" }, "options_misc_6": { - "message": "不在 Gmail 网站已经打开时显示桌面通知", + "message": "Show desktop notification to warn that Gmail is already opened in the active tab", + "description": "" + }, + "popup_read": { + "message": "标为已读", "description": "" }, "options_notifications_4": { "message": "通知格式", "description": "" }, + "settings_open_title": { + "message": "打开选项(设置)页面", + "description": "" + }, "label_2": { "message": "设置", "description": "" @@ -179,6 +239,10 @@ "message": "禁用 1 小时", "description": "" }, + "popup_archive": { + "message": "归档", + "description": "" + }, "msg_2": { "message": "链接已复制到剪贴板。", "description": "" @@ -187,10 +251,34 @@ "message": "选项 - Gmail™ Notifier", "description": "" }, + "popup_msg_13": { + "message": "4月", + "description": "" + }, + "popup_msg_9_format": { + "message": "%d 个月前", + "description": "" + }, + "popup_msg_11": { + "message": "2月", + "description": "" + }, + "popup_open_inbox": { + "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.", + "description": "" + }, "gmail": { "message": "Gmail™ Notifier", "description": "" }, + "popup_msg_6": { + "message": "昨天", + "description": "" + }, "options_toolbar_8": { "message": "最小宽度为 500px。", "description": "" @@ -203,6 +291,10 @@ "message": "未读邮件超过 999 封时,不在徽章上显示确切数字", "description": "" }, + "popup_msg_18": { + "message": "9月", + "description": "" + }, "options_notifications_14": { "message": "此功能是实验性的,并可能导致您的 Firefox 浏览器不稳定 [需要重启]。", "description": "" @@ -223,8 +315,12 @@ "message": "请登录您的 Gmail 帐户", "description": "" }, + "popup_of": { + "message": "/", + "description": "" + }, "options_notifications_15": { - "message": "声音通知为", + "message": "默认声音是", "description": "" }, "options_notifications_21": { @@ -243,6 +339,14 @@ "message": "未知", "description": "" }, + "popup_msg_21": { + "message": "12月", + "description": "" + }, + "popup_read_all": { + "message": "全部标为已读", + "description": "" + }, "options_notifications_8": { "message": "要想没有截断和省略号,在这里使用较大的数值。", "description": "" @@ -303,10 +407,18 @@ "message": "任务栏通知目前不支持 Linux 操作系统。", "description": "" }, + "options_notifications_35": { + "message": "要选择一个新的自定义声音,选择一个内置声音,然后再更改此选项为自定义声音", + "description": "" + }, "msg_1": { "message": "标签页已经打开。点击工具栏上的按钮在新标签页中打开 Gmail,或者切换到现有的 Gmail 标签页。", "description": "" }, + "popup_refresh": { + "message": "刷新", + "description": "" + }, "options_misc_5": { "message": "蓝色表示“无未读邮件”,灰色表示“已断开”", "description": "" @@ -315,10 +427,22 @@ "message": "设置值为 0 将禁用邮件检查,除非手动刷新 [Safari 上不可用]。", "description": "" }, + "popup_msg_19": { + "message": "10月", + "description": "" + }, + "options_notifications_33": { + "message": "邮件标题包含", + "description": "" + }, "tooltip_3": { "message": "右键单击:选择帐户", "description": "" }, + "popup_date_format": { + "message": "%yy-%mm-%dd", + "description": "" + }, "options_notifications": { "message": "通知:", "description": "" @@ -327,14 +451,22 @@ "message": "非零的值将反复触发桌面通知和提醒声音(类似有新邮件到达),如果您有未读的邮件。", "description": "" }, + "popup_msg_12": { + "message": "3月", + "description": "" + }, "options_notifications_22": { - "message": "如果您的浏览器没有播放通知声音,尝试使用一种在线转换工具,将它转换为一个纯净的 WAV 格式。", + "message": "如果您的浏览器不能播放自定义的声音,请尝试用在线转换工具将它转换为纯 WAV 格式。", "description": "" }, "options_tab_1": { "message": "只在活动窗口中搜索已打开的 Gmail 帐户", "description": "" }, + "popup_msg_7_format": { + "message": "%d 天前", + "description": "" + }, "options_timings_l1": { "message": "检查新邮件,每隔(秒):", "description": "" @@ -347,6 +479,14 @@ "message": "Gmail™ Notifier", "description": "" }, + "popup_msg_1": { + "message": "刚刚", + "description": "" + }, + "popup_open_settings": { + "message": "打开设置", + "description": "" + }, "options_misc_3": { "message": "工具栏颜色模式", "description": "" @@ -387,6 +527,10 @@ "message": "第六帐户 (/mail/u/5/)", "description": "" }, + "popup_msg_8_format": { + "message": "%d 周前", + "description": "" + }, "options_toolbar": { "message": "工具栏:", "description": "" @@ -395,10 +539,18 @@ "message": "截断通知中超过", "description": "" }, + "popup_wait": { + "message": "等待...", + "description": "" + }, "tooltip_2": { "message": "中键 (或 Ctrl+左键) 单击:刷新所有帐户", "description": "" }, + "options_notifications_29": { + "message": "此选项有关工具栏按钮的右键菜单 -> 禁止所有通知 -> 自定义时间长度。", + "description": "" + }, "options_tab_3": { "message": "在当前标签页后面打开新的 Gmail 帐户", "description": "" @@ -419,6 +571,26 @@ "message": "仅在邮件抵达未超过x分钟时发出桌面和声音通知:", "description": "" }, + "options_tab_8": { + "message": "Ignore opened Gmail tabs", + "description": "" + }, + "popup_no_subject": { + "message": "(无主题)", + "description": "" + }, + "msg_5": { + "message": "选择一个声音文件", + "description": "" + }, + "popup_msg_2": { + "message": "1 分钟前", + "description": "" + }, + "popup_msg_16": { + "message": "7月", + "description": "" + }, "label_8": { "message": "禁用 2 小时", "description": "" @@ -427,6 +599,10 @@ "message": "注意:为了通知能正常工作,您需要先登录到您的 Google 帐户。", "description": "" }, + "popup_msg_20": { + "message": "11月", + "description": "" + }, "options_toolbar_6": { "message": "显示完整内容", "description": "" @@ -447,6 +623,10 @@ "message": "完整内容模式下的工具栏面板宽度为(像素):", "description": "" }, + "options_notifications_31": { + "message": "自定义声音通知", + "description": "" + }, "options_timings_l5": { "message": "最小周期为 5 分钟。", "description": "" @@ -475,6 +655,10 @@ "message": "第五帐户 (/mail/u/4/)", "description": "" }, + "popup_msg_14": { + "message": "5月", + "description": "" + }, "options_inshort": { "message": "支持多个标签和帐户的通知工具,适用于 Google Mail (Gmail)。", "description": "" @@ -487,12 +671,20 @@ "message": "在当前标签页打开 Gmail 帐户", "description": "" }, + "popup_msg_3_format": { + "message": "%d 分钟前", + "description": "" + }, "label_12": { - "message": "打开主页", + "message": "打开常见问题", "description": "" }, "description": { "message": "支持多个标签和帐户的通知工具,适用于 Google Mail (Gmail)", "description": "" + }, + "popup_spam": { + "message": "垃圾", + "description": "" } } \ No newline at end of file diff --git a/builds/unpacked/firefox/data/icons/blue/16.png b/v1/builds/unpacked/chrome/data/icons/blue/16.png similarity index 100% rename from builds/unpacked/firefox/data/icons/blue/16.png rename to v1/builds/unpacked/chrome/data/icons/blue/16.png diff --git a/builds/unpacked/firefox/data/icons/blue/19.png b/v1/builds/unpacked/chrome/data/icons/blue/19.png similarity index 100% rename from builds/unpacked/firefox/data/icons/blue/19.png rename to v1/builds/unpacked/chrome/data/icons/blue/19.png diff --git a/builds/unpacked/firefox/data/icons/blue/32.png b/v1/builds/unpacked/chrome/data/icons/blue/32.png similarity index 100% rename from builds/unpacked/firefox/data/icons/blue/32.png rename to v1/builds/unpacked/chrome/data/icons/blue/32.png diff --git a/builds/unpacked/firefox/data/icons/browsers/chrome.png b/v1/builds/unpacked/chrome/data/icons/browsers/chrome.png similarity index 100% rename from builds/unpacked/firefox/data/icons/browsers/chrome.png rename to v1/builds/unpacked/chrome/data/icons/browsers/chrome.png diff --git a/builds/unpacked/firefox/data/icons/browsers/firefox.png b/v1/builds/unpacked/chrome/data/icons/browsers/firefox.png similarity index 100% rename from builds/unpacked/firefox/data/icons/browsers/firefox.png rename to v1/builds/unpacked/chrome/data/icons/browsers/firefox.png diff --git a/builds/unpacked/firefox/data/icons/browsers/opera.png b/v1/builds/unpacked/chrome/data/icons/browsers/opera.png similarity index 100% rename from builds/unpacked/firefox/data/icons/browsers/opera.png rename to v1/builds/unpacked/chrome/data/icons/browsers/opera.png diff --git a/builds/unpacked/firefox/data/icons/gray/16.png b/v1/builds/unpacked/chrome/data/icons/gray/16.png similarity index 100% rename from builds/unpacked/firefox/data/icons/gray/16.png rename to v1/builds/unpacked/chrome/data/icons/gray/16.png diff --git a/builds/unpacked/firefox/data/icons/gray/19.png b/v1/builds/unpacked/chrome/data/icons/gray/19.png similarity index 100% rename from builds/unpacked/firefox/data/icons/gray/19.png rename to v1/builds/unpacked/chrome/data/icons/gray/19.png diff --git a/builds/unpacked/firefox/data/icons/gray/32.png b/v1/builds/unpacked/chrome/data/icons/gray/32.png similarity index 100% rename from builds/unpacked/firefox/data/icons/gray/32.png rename to v1/builds/unpacked/chrome/data/icons/gray/32.png diff --git a/builds/unpacked/firefox/data/icons/load0/16.png b/v1/builds/unpacked/chrome/data/icons/load0/16.png similarity index 100% rename from builds/unpacked/firefox/data/icons/load0/16.png rename to v1/builds/unpacked/chrome/data/icons/load0/16.png diff --git a/builds/unpacked/firefox/data/icons/load0/19.png b/v1/builds/unpacked/chrome/data/icons/load0/19.png similarity index 100% rename from builds/unpacked/firefox/data/icons/load0/19.png rename to v1/builds/unpacked/chrome/data/icons/load0/19.png diff --git a/builds/unpacked/firefox/data/icons/load0/32.png b/v1/builds/unpacked/chrome/data/icons/load0/32.png similarity index 100% rename from builds/unpacked/firefox/data/icons/load0/32.png rename to v1/builds/unpacked/chrome/data/icons/load0/32.png diff --git a/builds/unpacked/firefox/data/icons/load1/16.png b/v1/builds/unpacked/chrome/data/icons/load1/16.png similarity index 100% rename from builds/unpacked/firefox/data/icons/load1/16.png rename to v1/builds/unpacked/chrome/data/icons/load1/16.png diff --git a/builds/unpacked/firefox/data/icons/load1/19.png b/v1/builds/unpacked/chrome/data/icons/load1/19.png similarity index 100% rename from builds/unpacked/firefox/data/icons/load1/19.png rename to v1/builds/unpacked/chrome/data/icons/load1/19.png diff --git a/builds/unpacked/firefox/data/icons/load1/32.png b/v1/builds/unpacked/chrome/data/icons/load1/32.png similarity index 100% rename from builds/unpacked/firefox/data/icons/load1/32.png rename to v1/builds/unpacked/chrome/data/icons/load1/32.png diff --git a/builds/unpacked/firefox/data/icons/load2/16.png b/v1/builds/unpacked/chrome/data/icons/load2/16.png similarity index 100% rename from builds/unpacked/firefox/data/icons/load2/16.png rename to v1/builds/unpacked/chrome/data/icons/load2/16.png diff --git a/builds/unpacked/firefox/data/icons/load2/19.png b/v1/builds/unpacked/chrome/data/icons/load2/19.png similarity index 100% rename from builds/unpacked/firefox/data/icons/load2/19.png rename to v1/builds/unpacked/chrome/data/icons/load2/19.png diff --git a/builds/unpacked/firefox/data/icons/load2/32.png b/v1/builds/unpacked/chrome/data/icons/load2/32.png similarity index 100% rename from builds/unpacked/firefox/data/icons/load2/32.png rename to v1/builds/unpacked/chrome/data/icons/load2/32.png diff --git a/builds/unpacked/firefox/data/icons/load3/16.png b/v1/builds/unpacked/chrome/data/icons/load3/16.png similarity index 100% rename from builds/unpacked/firefox/data/icons/load3/16.png rename to v1/builds/unpacked/chrome/data/icons/load3/16.png diff --git a/builds/unpacked/firefox/data/icons/load3/19.png b/v1/builds/unpacked/chrome/data/icons/load3/19.png similarity index 100% rename from builds/unpacked/firefox/data/icons/load3/19.png rename to v1/builds/unpacked/chrome/data/icons/load3/19.png diff --git a/builds/unpacked/firefox/data/icons/load3/32.png b/v1/builds/unpacked/chrome/data/icons/load3/32.png similarity index 100% rename from builds/unpacked/firefox/data/icons/load3/32.png rename to v1/builds/unpacked/chrome/data/icons/load3/32.png diff --git a/builds/unpacked/firefox/data/icons/new/16.png b/v1/builds/unpacked/chrome/data/icons/new/16.png similarity index 100% rename from builds/unpacked/firefox/data/icons/new/16.png rename to v1/builds/unpacked/chrome/data/icons/new/16.png diff --git a/builds/unpacked/firefox/data/icons/new/19.png b/v1/builds/unpacked/chrome/data/icons/new/19.png similarity index 100% rename from builds/unpacked/firefox/data/icons/new/19.png rename to v1/builds/unpacked/chrome/data/icons/new/19.png diff --git a/builds/unpacked/firefox/data/icons/new/32.png b/v1/builds/unpacked/chrome/data/icons/new/32.png similarity index 100% rename from builds/unpacked/firefox/data/icons/new/32.png rename to v1/builds/unpacked/chrome/data/icons/new/32.png diff --git a/builds/unpacked/firefox/data/icons/notification/16.png b/v1/builds/unpacked/chrome/data/icons/notification/16.png similarity index 100% rename from builds/unpacked/firefox/data/icons/notification/16.png rename to v1/builds/unpacked/chrome/data/icons/notification/16.png diff --git a/builds/unpacked/firefox/data/icons/notification/32.png b/v1/builds/unpacked/chrome/data/icons/notification/32.png similarity index 100% rename from builds/unpacked/firefox/data/icons/notification/32.png rename to v1/builds/unpacked/chrome/data/icons/notification/32.png diff --git a/builds/unpacked/firefox/data/icons/notification/48.png b/v1/builds/unpacked/chrome/data/icons/notification/48.png similarity index 100% rename from builds/unpacked/firefox/data/icons/notification/48.png rename to v1/builds/unpacked/chrome/data/icons/notification/48.png diff --git a/builds/unpacked/firefox/data/icons/notification/64.png b/v1/builds/unpacked/chrome/data/icons/notification/64.png similarity index 100% rename from builds/unpacked/firefox/data/icons/notification/64.png rename to v1/builds/unpacked/chrome/data/icons/notification/64.png diff --git a/builds/unpacked/firefox/data/icons/options/16.png b/v1/builds/unpacked/chrome/data/icons/options/16.png similarity index 100% rename from builds/unpacked/firefox/data/icons/options/16.png rename to v1/builds/unpacked/chrome/data/icons/options/16.png diff --git a/builds/unpacked/firefox/data/icons/options/64.png b/v1/builds/unpacked/chrome/data/icons/options/64.png similarity index 100% rename from builds/unpacked/firefox/data/icons/options/64.png rename to v1/builds/unpacked/chrome/data/icons/options/64.png diff --git a/builds/unpacked/firefox/data/icons/red/128.png b/v1/builds/unpacked/chrome/data/icons/red/128.png similarity index 100% rename from builds/unpacked/firefox/data/icons/red/128.png rename to v1/builds/unpacked/chrome/data/icons/red/128.png diff --git a/builds/unpacked/firefox/data/icons/red/16.png b/v1/builds/unpacked/chrome/data/icons/red/16.png similarity index 100% rename from builds/unpacked/firefox/data/icons/red/16.png rename to v1/builds/unpacked/chrome/data/icons/red/16.png diff --git a/builds/unpacked/firefox/data/icons/red/19.png b/v1/builds/unpacked/chrome/data/icons/red/19.png similarity index 100% rename from builds/unpacked/firefox/data/icons/red/19.png rename to v1/builds/unpacked/chrome/data/icons/red/19.png diff --git a/builds/unpacked/firefox/data/icons/red/32.png b/v1/builds/unpacked/chrome/data/icons/red/32.png similarity index 100% rename from builds/unpacked/firefox/data/icons/red/32.png rename to v1/builds/unpacked/chrome/data/icons/red/32.png diff --git a/builds/unpacked/firefox/data/icons/red/48.png b/v1/builds/unpacked/chrome/data/icons/red/48.png similarity index 100% rename from builds/unpacked/firefox/data/icons/red/48.png rename to v1/builds/unpacked/chrome/data/icons/red/48.png diff --git a/builds/unpacked/firefox/data/icons/red/64.png b/v1/builds/unpacked/chrome/data/icons/red/64.png similarity index 100% rename from builds/unpacked/firefox/data/icons/red/64.png rename to v1/builds/unpacked/chrome/data/icons/red/64.png diff --git a/builds/unpacked/firefox/data/icons/tray/blue.png b/v1/builds/unpacked/chrome/data/icons/tray/blue.png similarity index 100% rename from builds/unpacked/firefox/data/icons/tray/blue.png rename to v1/builds/unpacked/chrome/data/icons/tray/blue.png diff --git a/builds/unpacked/firefox/data/icons/tray/gray.png b/v1/builds/unpacked/chrome/data/icons/tray/gray.png similarity index 100% rename from builds/unpacked/firefox/data/icons/tray/gray.png rename to v1/builds/unpacked/chrome/data/icons/tray/gray.png diff --git a/builds/unpacked/firefox/data/icons/tray/red.png b/v1/builds/unpacked/chrome/data/icons/tray/red.png similarity index 100% rename from builds/unpacked/firefox/data/icons/tray/red.png rename to v1/builds/unpacked/chrome/data/icons/tray/red.png diff --git a/src/data/options/chrome/chrome.js b/v1/builds/unpacked/chrome/data/options/chrome/chrome.js similarity index 100% rename from src/data/options/chrome/chrome.js rename to v1/builds/unpacked/chrome/data/options/chrome/chrome.js diff --git a/builds/unpacked/firefox/data/options/css_browser_selector.js b/v1/builds/unpacked/chrome/data/options/css_browser_selector.js similarity index 100% rename from builds/unpacked/firefox/data/options/css_browser_selector.js rename to v1/builds/unpacked/chrome/data/options/css_browser_selector.js diff --git a/builds/unpacked/firefox/data/options/index.css b/v1/builds/unpacked/chrome/data/options/index.css similarity index 83% rename from builds/unpacked/firefox/data/options/index.css rename to v1/builds/unpacked/chrome/data/options/index.css index 3cd40c39..b7dde699 100644 --- a/builds/unpacked/firefox/data/options/index.css +++ b/v1/builds/unpacked/chrome/data/options/index.css @@ -15,20 +15,28 @@ } .box { - width:100%; - display: table; -} -.box label { - display: table-cell; - width: 1px; - white-space: nowrap; - padding-right: 5px; + display: flex; + align-items: center; } .box input, .box select { display: table-cell; width:100%; } +.box div { + white-space: nowrap; + margin-right: 10px; +} + +.browse { + display: none; + font-weight: bold; + padding: 0 5px; + cursor: pointer; +} +.browse input { + display: none; +} .spacer { height: 18px; @@ -57,6 +65,24 @@ table { color: #222; font-family: arial,sans-serif; } +select, +input { + background-color: #fff; +} +input { + height: 24px; + border: 1px solid #C8C8C8; +} +select { + height: 22px; + border: 0; + outline: 1px solid #C8C8C8; +} + +input[type=checkbox] { + width: 20px; + height: 20px; +} input[type=number] { width: 55px; diff --git a/builds/unpacked/firefox/data/options/index.html b/v1/builds/unpacked/chrome/data/options/index.html similarity index 55% rename from builds/unpacked/firefox/data/options/index.html rename to v1/builds/unpacked/chrome/data/options/index.html index 699bb47a..b1a3890b 100644 --- a/builds/unpacked/firefox/data/options/index.html +++ b/v1/builds/unpacked/chrome/data/options/index.html @@ -57,39 +57,39 @@

- - +
+

- - +
+

- - +
+

- - +
+

- - +
+

- - +
+

- +

@@ -99,14 +99,14 @@

- +

[author_name], [author_email], [title] [summary].

@@ -115,76 +115,182 @@

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

+
+
+ + + + +
+

+
+
+ + + + +
+

+
+
+ + + + +
+

+
+
+ + + + +
+

+
+
+ + + + +
+

-
- . -
+

+


+

+ +
+

+

+

+

+

+

@@ -192,7 +298,7 @@
- +
@@ -214,18 +320,18 @@

- +
+

- +
+

@@ -264,26 +370,28 @@

+ + diff --git a/src/data/options/index.js b/v1/builds/unpacked/chrome/data/options/index.js similarity index 54% rename from src/data/options/index.js rename to v1/builds/unpacked/chrome/data/options/index.js index 0fade81f..5fd715bb 100644 --- a/src/data/options/index.js +++ b/v1/builds/unpacked/chrome/data/options/index.js @@ -18,46 +18,35 @@ var connect = function (elem, pref) { pref = pref || elem.getAttribute('data-pref'); background.send('get', pref); elem.addEventListener('change', function () { - if (pref === 'notification.sound.custom.file') { + if (pref.endsWith('.file')) { + var base = pref.replace('.file', ''); var file = this.files[0]; + var input = document.querySelector('[data-pref="' + pref + '"]'); + if (input) { + input.parentNode.style.display = 'none'; + } background.send('changed', { - pref: 'notification.sound.custom.file', - value: this.value - }); - background.send('changed', { - pref: 'notification.sound.type', - value: 4 - }); - background.send('changed', { - pref: 'notification.sound.custom.name', - value: file.name + pref: base + '.mime', + value: file.type }); + var reader = new FileReader(); + reader.onload = function (e) { + background.send('changed', { + pref, + value: e.target.result + }); + }; + reader.onerror = function (e) { + alert(e); + }; + reader.readAsDataURL(file); + } + else { background.send('changed', { - pref: 'notification.sound.custom.mime', - value: file.type + pref: pref, + value: this[att] }); - if (isFirefox) { - self.port.emit('get-sound-fullpath'); - } - else { - var reader = new FileReader(); - reader.onload = function (e) { - background.send('changed', { - pref: 'notification.sound.custom.file', - value: e.target.result - }); - }; - reader.onerror = function (e) { - alert(e); - }; - reader.readAsDataURL(file); - } - return; } - background.send('changed', { - pref: pref, - value: this[att] - }); }); } return { @@ -79,7 +68,19 @@ background.receive('set', function (o) { } }); -window.addEventListener('load', function () { +background.receive('custom-sound', function (pref) { + if (isFirefox) { + background.send('custom-sound', pref); + } + else { + var input = document.querySelector('[data-pref="' + pref + '"]'); + if (input) { + input.parentElement.style.display = 'inline-block'; + } + } +}); + +window.addEventListener('DOMContentLoaded', function () { var prefs = document.querySelectorAll('*[data-pref]'); [].forEach.call(prefs, function (elem) { var pref = elem.getAttribute('data-pref'); diff --git a/src/data/popup/body/email-chrome.css b/v1/builds/unpacked/chrome/data/popup/body/email-chrome.css similarity index 81% rename from src/data/popup/body/email-chrome.css rename to v1/builds/unpacked/chrome/data/popup/body/email-chrome.css index 14cbf93c..d4c65155 100644 --- a/src/data/popup/body/email-chrome.css +++ b/v1/builds/unpacked/chrome/data/popup/body/email-chrome.css @@ -1,6 +1,9 @@ body { margin: 0; } +table { + color: inherit; +} body, td { font-family: arial,sans-serif; font-size: 12px; @@ -8,4 +11,4 @@ body, td { a { color: #1155CC; text-decoration: none; -} \ No newline at end of file +} diff --git a/src/data/popup/chrome/chrome.js b/v1/builds/unpacked/chrome/data/popup/chrome/chrome.js similarity index 89% rename from src/data/popup/chrome/chrome.js rename to v1/builds/unpacked/chrome/data/popup/chrome/chrome.js index ccf3b568..6da4afd4 100644 --- a/src/data/popup/chrome/chrome.js +++ b/v1/builds/unpacked/chrome/data/popup/chrome/chrome.js @@ -32,3 +32,7 @@ var manifest = { elem.textContent = chrome.i18n.getMessage(elem.getAttribute('data-l10n-id')); }); })(document.querySelectorAll('*[data-l10n-id]')); + +chrome.extension.getBackgroundPage().userActions.forEach(function (callback) { + callback(); +}); diff --git a/builds/unpacked/firefox/data/popup/fetch.gif b/v1/builds/unpacked/chrome/data/popup/fetch.gif similarity index 100% rename from builds/unpacked/firefox/data/popup/fetch.gif rename to v1/builds/unpacked/chrome/data/popup/fetch.gif diff --git a/builds/unpacked/firefox/data/popup/icons.png b/v1/builds/unpacked/chrome/data/popup/icons.png similarity index 100% rename from builds/unpacked/firefox/data/popup/icons.png rename to v1/builds/unpacked/chrome/data/popup/icons.png diff --git a/builds/unpacked/firefox/data/popup/index.css b/v1/builds/unpacked/chrome/data/popup/index.css similarity index 100% rename from builds/unpacked/firefox/data/popup/index.css rename to v1/builds/unpacked/chrome/data/popup/index.css diff --git a/builds/unpacked/firefox/data/popup/index.html b/v1/builds/unpacked/chrome/data/popup/index.html similarity index 90% rename from builds/unpacked/firefox/data/popup/index.html rename to v1/builds/unpacked/chrome/data/popup/index.html index 46c0f32b..bcfda84d 100644 --- a/builds/unpacked/firefox/data/popup/index.html +++ b/v1/builds/unpacked/chrome/data/popup/index.html @@ -3,6 +3,7 @@ + @@ -52,5 +53,7 @@
    + + diff --git a/builds/unpacked/firefox/data/popup/index.js b/v1/builds/unpacked/chrome/data/popup/index.js similarity index 87% rename from builds/unpacked/firefox/data/popup/index.js rename to v1/builds/unpacked/chrome/data/popup/index.js index 0b829c97..001af9ca 100644 --- a/builds/unpacked/firefox/data/popup/index.js +++ b/v1/builds/unpacked/chrome/data/popup/index.js @@ -2,7 +2,11 @@ // (function (locales) { [].forEach.call(locales, function (locale) { - var elem = document.querySelector('[title=' + locale.dataset.l10nId); + var elem; + try { + elem = document.querySelector('[title="' + locale.dataset.l10nId + '"'); + } + catch (e) {} if (elem) { elem.title = locale.textContent; } @@ -14,6 +18,7 @@ var isOpera = typeof chrome !== 'undefined' && navigator.userAgent.indexOf('OPR' var isChrome = typeof chrome !== 'undefined' && navigator.userAgent.indexOf('OPR') === -1; var objs, contentCache = [], selected = {}; +var isPrivate = false; var qs = function (q, m) { var reserved = { @@ -102,19 +107,19 @@ var body = (function() { title = qs('title'); return { get date() { - return date.textContent + return date.textContent; }, set date(val) { date.textContent = val; }, get email() { - return email.textContent + return email.textContent; }, set email(val) { email.textContent = val; }, get name() { - return name.textContent + return name.textContent; }, set name(val) { name.textContent = val; @@ -125,7 +130,7 @@ var body = (function() { return title.textContent; }, set title(val) { - title.textContent = val || "(no subject)"; + title.textContent = val || manifest.locale('popup_no_subject'); }, set titleLink(val) { title.setAttribute("href", val) @@ -146,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) { @@ -207,7 +212,7 @@ var update = (function () { if (!isAvailable) { // does the old account still have unread entries? var obj = objs.filter(function (o) { - return o.xml.link == selected.parent.xml.link; + return 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)]; @@ -225,6 +230,9 @@ var update = (function () { return o.xml.link == selected.parent.xml.link })[0]; } + if (!selected.parent) { + return; + } // updating current index selected.parent.xml.entries.forEach(function (entry, i) { if (entry.id == selected.entry.id) { @@ -270,6 +278,7 @@ var update = (function () { 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; @@ -316,7 +325,7 @@ new Listen('spam', "click", function(e) { }); }); new Listen('read', "click", function(e) { - qs('read').textContent = "Wait..."; + qs('read').textContent = manifest.locale('popup_wait'); qs('read').setAttribute("disabled", true); background.send("action", { links: selected.entry.link, @@ -346,7 +355,7 @@ new Listen('read-all', "click", function(e) { background.receive("action-response", function(cmd) { if (cmd == "rd") { - qs('read').textContent = "Mark as read"; + qs('read').textContent = manifest.locale('popup_read'); qs('read').removeAttribute("disabled"); } else { @@ -422,35 +431,26 @@ background.receive("body-response", function(o) { // Link opener for html function opener (e) { e.preventDefault(); + e.stopPropagation(); var target = e.originalTarget || e.target; - var selectedText = target.ownerDocument.getSelection() + ''; - - var link = target.href || target.src; - if (target.localName != "a" && target.parentNode && target.parentNode.localName == "a") { - link = target.parentNode.href || link; - } + var link = (target.closest('a') && target.closest('a').href) || target.src || target.href; if (link) { - if (e.button === 2) { - background.send("clipboard", { - str: link, - type: 0 - }); - } - else { - background.send("open", link); - } - } - else if (e.button === 2 && selectedText) { - background.send("clipboard", { - str: selectedText, - type: 1 + background.send("open", { + isPrivate: isPrivate, + link: link, + button: e.button, + ctrlKey: e.ctrlKey, + shiftKey: e.shiftKey, + altKey: e.altKey, + metaKey: e.metaKey }); } } window.addEventListener("click", opener); qs("iframe").contentDocument.addEventListener("click", opener); + function keyup (e) { if (!keyup.doKeyUp) return; @@ -470,7 +470,7 @@ background.receive("show", function () { obj.removeAttribute("wait"); obj.removeAttribute("disabled"); }); - qs('read').textContent = "Mark as read"; + qs('read').textContent = manifest.locale('popup_read'); background.send("resize"); background.send("keyUp"); @@ -549,26 +549,29 @@ function prettyDate(time) { return day_diff == 0 && ( diff < 60 && manifest.locale('popup_msg_1') || diff < 120 && manifest.locale('popup_msg_2') || - diff < 3600 && Math.floor(diff / 60) + " " + manifest.locale('popup_msg_3') || + diff < 3600 && manifest.locale('popup_msg_3_format').replace('%d', Math.floor(diff / 60)) || diff < 7200 && manifest.locale('popup_msg_4') || diff < 86400 && Math.floor(diff / 3600) + " " + manifest.locale('popup_msg_5')) || day_diff == 1 && manifest.locale('popup_msg_6') || - day_diff < 7 && day_diff + " " + manifest.locale('popup_msg_7') || - day_diff < 7 * 7 && Math.ceil(day_diff / 7) + " " + manifest.locale('popup_msg_8') || - day_diff < 7 * 4 * 3 && Math.ceil(day_diff / 7 / 4) + " " + manifest.locale('popup_msg_9') || - [ - manifest.locale('popup_msg_10'), - manifest.locale('popup_msg_11'), - manifest.locale('popup_msg_12'), - manifest.locale('popup_msg_13'), - manifest.locale('popup_msg_14'), - manifest.locale('popup_msg_15'), - manifest.locale('popup_msg_16'), - manifest.locale('popup_msg_17'), - manifest.locale('popup_msg_18'), - manifest.locale('popup_msg_19'), - manifest.locale('popup_msg_20'), - manifest.locale('popup_msg_21') - ][date.getMonth()] + " " + date.getDate() + ", " + date.getFullYear().toString(); + day_diff < 7 && manifest.locale('popup_msg_7_format').replace('%d', day_diff) || + day_diff < 7 * 7 && manifest.locale('popup_msg_8_format').replace('%d', Math.ceil(day_diff / 7)) || + day_diff < 7 * 4 * 3 && manifest.locale('popup_msg_9_format').replace('%d', Math.ceil(day_diff / 7 / 4)) || + manifest.locale('popup_date_format') + .replace('%dd', date.getDate()) + .replace('%yy', date.getFullYear().toString()) + .replace('%mm', [ + manifest.locale('popup_msg_10'), + manifest.locale('popup_msg_11'), + manifest.locale('popup_msg_12'), + manifest.locale('popup_msg_13'), + manifest.locale('popup_msg_14'), + manifest.locale('popup_msg_15'), + manifest.locale('popup_msg_16'), + manifest.locale('popup_msg_17'), + manifest.locale('popup_msg_18'), + manifest.locale('popup_msg_19'), + manifest.locale('popup_msg_20'), + manifest.locale('popup_msg_21') + ][date.getMonth()]); } diff --git a/builds/unpacked/firefox/data/popup/wait.gif b/v1/builds/unpacked/chrome/data/popup/wait.gif similarity index 100% rename from builds/unpacked/firefox/data/popup/wait.gif rename to v1/builds/unpacked/chrome/data/popup/wait.gif diff --git a/builds/unpacked/firefox/data/sounds/0.wav b/v1/builds/unpacked/chrome/data/sounds/0.wav similarity index 100% rename from builds/unpacked/firefox/data/sounds/0.wav rename to v1/builds/unpacked/chrome/data/sounds/0.wav diff --git a/builds/unpacked/firefox/data/sounds/1.wav b/v1/builds/unpacked/chrome/data/sounds/1.wav similarity index 100% rename from builds/unpacked/firefox/data/sounds/1.wav rename to v1/builds/unpacked/chrome/data/sounds/1.wav diff --git a/builds/unpacked/firefox/data/sounds/2.wav b/v1/builds/unpacked/chrome/data/sounds/2.wav similarity index 100% rename from builds/unpacked/firefox/data/sounds/2.wav rename to v1/builds/unpacked/chrome/data/sounds/2.wav diff --git a/builds/unpacked/firefox/data/sounds/3.wav b/v1/builds/unpacked/chrome/data/sounds/3.wav similarity index 100% rename from builds/unpacked/firefox/data/sounds/3.wav rename to v1/builds/unpacked/chrome/data/sounds/3.wav diff --git a/src/lib/common.js b/v1/builds/unpacked/chrome/lib/common.js similarity index 76% rename from src/lib/common.js rename to v1/builds/unpacked/chrome/lib/common.js index 92b39514..05e6090b 100644 --- a/src/lib/common.js +++ b/v1/builds/unpacked/chrome/lib/common.js @@ -12,6 +12,11 @@ if (isFirefox) { var tab = require('./utils/tab'); } +// disable sound on a user action +app.actions(function () { + app.sound.stop(); +}); + // add a repeater to check all accounts var repeater = new timer.repeater( (config.email.check.first ? config.email.check.first : 5) * 1000, @@ -20,14 +25,15 @@ var repeater = new timer.repeater( var actions = { silent: function (time) { - if (config.notification.silent) { - app.timer.clearTimeout(config.notification.silent); - } + app.timer.clearTimeout(config.notification.silent); config.notification.silent = false; - if (time) { + if (time === 'custom') { + time = config.notification.silentTime * 60; + } + if (!isNaN(time)) { config.notification.silent = app.timer.setTimeout(function () { config.notification.silent = false; - }, time); + }, time * 1000); } }, reset: function () { @@ -65,6 +71,7 @@ var actions = { } } }; +app.on('open-options', actions.openOptions); if (isFirefox) { app.connect(actions); } @@ -136,7 +143,43 @@ var icon = (function () { }; })(); -function open (url, inBackground, refresh) { +function play (arr) { + var filters = [0, 1, 2, 3, 4].map(function (index) { + return { + filter: config.notification.sound.media['custom' + index].filter, + selector: config.notification.sound.media['custom' + index].selector, + index: index + }; + }). + filter(function (obj) { + return obj.filter; + }). + filter(function (obj) { + if (obj.selector === 0) { + return arr.reduce(function (p, c) { + return p || ( + c.author_email.toLowerCase().indexOf(obj.filter.toLowerCase()) !== -1 || + c.author_name.toLowerCase().indexOf(obj.filter.toLowerCase()) !== -1 + ); + }, false); + } + if (obj.selector === 1) { + return arr.reduce(function (p, c) { + return p || c.title.toLowerCase().indexOf(obj.filter.toLowerCase()) !== -1; + }, false); + } + if (obj.selector === 2) { + return arr.reduce(function (p, c) { + return p || c.summary.toLowerCase().indexOf(obj.filter.toLowerCase()) !== -1; + }, false); + } + return false; + }); + app.sound.play(filters.length ? filters[0].index : null); +} + +function open (url, inBackground, refresh, isPrivate) { + url = url.replace('@private', ''); // some urls might end with "@private" for private mode function parseUri (str) { str = str || ''; str = str.replace('gmail', 'mail.google'); @@ -176,9 +219,17 @@ function open (url, inBackground, refresh) { return uri; } - app.windows.active() + app.windows.active(isPrivate) .then(function () { - return app.windows.tabs.list(config.tabs.search); + if (config.tabs.ignoreOpens) { + return []; + } + var tabs = []; + try { // http://add0n.com/gmail-notifier.html#comment-2622018574 + tabs = app.windows.tabs.list(config.tabs.search); + } + catch (e) {} + return tabs; }) .then(function (tabs) { var parse2 = parseUri(url); @@ -252,7 +303,7 @@ function setBadge (val) { } var checkEmails = (function () { var color = 'blue', count = -1, cachedEmails; - var emails, feeds = ''; + var emails, feeds = '', isPrivate = app.isPrivate(); return { execute: function (forced) { @@ -267,19 +318,32 @@ var checkEmails = (function () { e.reject(); }); } - if (config.email.feeds.join(', ') !== feeds) { + + if (config.email.feeds.join(', ') !== feeds || isPrivate !== app.isPrivate()) { + isPrivate = app.isPrivate(); emails = config.email.feeds.map(function (feed) { return new server.Email(feed, config.email.timeout); }); + // supporting private mode + if (app.isPrivate()) { + emails = emails.concat(config.email.feeds.map(function (feed) { + return new server.Email(feed, config.email.timeout, true); + })); + } + feeds = config.email.feeds.join(', '); } // Execute fresh servers app.Promise.all(emails.map(function (e) { - return e.execute(); + return e.execute().catch (function () {}); })).then(function (objs) { + // Removing error objects + objs = objs.filter(function (o) { + return o; + }); // Make sure there is no duplicate account var tmp = objs.map(function (o) { - return o.notAuthorized === true || o.network === false ? null : o.xml.title + '/' + o.xml.label; + return o.notAuthorized === true || o.network === false ? null : (o.xml ? o.xml.title + '/' + o.xml.label : null); }) .map(function (l, i, a) { return !l ? false : a.indexOf(l) !== i; @@ -306,6 +370,7 @@ var checkEmails = (function () { color = 'blue'; count = -1; cachedEmails = []; + app.button.fireContext(); app.popup.detach(); } if (forced) { @@ -324,7 +389,7 @@ var checkEmails = (function () { } //Removing not logged-in accounts objs = objs.filter(function (o) { - return o.network && !o.notAuthorized; + return o.network && !o.notAuthorized && o.xml && o.xml.entries; }); //Sorting accounts objs.sort(function (a, b) { @@ -350,10 +415,11 @@ var checkEmails = (function () { count = newCount; // cachedEmails = objs; + app.button.fireContext(); // Preparing the report var tmp = []; objs.forEach (function (o) { - (o.xml.entries || []) + (o.xml && o.xml.entries ? o.xml.entries : []) .filter(function (e) { return anyNewEmails ? o.newIDs.indexOf(e.id) !== -1 : o.xml.fullcount !== 0; }) @@ -375,7 +441,10 @@ var checkEmails = (function () { .replace('[summary]', shorten(e.summary)) .replace('[title]', shorten(e.title)) .replace(/\[break\]/g, '\n'); - }).join('\n\n'); + }); + if (config.notification.combined) { + report = [report.join('\n\n')]; + } // Preparing the tooltip var tooltip = app.l10n('gmail') + '\n\n' + @@ -385,13 +454,32 @@ var checkEmails = (function () { (c.xml.label ? ' [' + c.xml.label + ']' : '') + ' (' + c.xml.fullcount + ')' + '\n'; }, '').replace(/\n$/, ''); + // Preparing tray tooltip; make sure length is less than 64 chars + var trayTooltip = (function () { + var name = objs.reduce(function (p, c) { + return p += + c.xml.title + + (c.xml.label ? ' [' + c.xml.label + ']' : '') + + ' (' + c.xml.fullcount + ')' + '\n'; + }, '').replace(/\n$/, ''); + + var title = app.l10n('gmail') + '\n\n'; + if (name.length + title.length < 64) { + name = title + name; + } + if (name.length > 64) { + name = name.replace(/\@.* \(/g , ' ('); + } + return name; + })(); if (!forced && !anyNewEmails) { if (newCount) { icon('red'); setBadge(newCount); + color = 'red'; if (config.tray.show) { - app.tray.set(newCount, tooltip); + app.tray.set(newCount, trayTooltip); } app.button.label = tooltip; app.popup.send('update', objs); @@ -441,24 +529,31 @@ var checkEmails = (function () { } if (config.notification.show) { app.notify(report, '', function () { - app.timer.setTimeout(function () { - // restore browser window first! - app.windows.active().then(function (win) { - win.focus(); - app.timer.setTimeout(actions.onCommand, 100, tmp.length ? tmp[0].link : null); - }); - }, 100); + if (isFirefox) { + app.timer.setTimeout(function () { + // restore browser window first! + app.windows.active().then(function (win) { + win.focus(); + app.timer.setTimeout(actions.onCommand, 1000, tmp.length ? tmp[0].link : null); + }); + }, 100); + } + else { + open('https://mail.google.com/'); + } }); } if (config.tray.show) { - app.tray.set(newCount, tooltip); + app.tray.set(newCount, trayTooltip); } if (config.notification.sound.play) { - app.play.now(); + play(tmp); } app.button.label = tooltip; app.popup.send('update-reset', objs); } + }, function () { + // this should not be called }); }, getCached: function () { @@ -521,15 +616,24 @@ app.popup.receive('show', function () { app.popup.send('update-reset', objs); } }); -app.popup.receive('open', function (link) { - app.popup.hide(); - if (link) { - open(link); +app.popup.receive('open', function (obj) { + // context menu + if (typeof obj === 'string') { + open(obj); + } + else if (obj.button === 2 || !obj.link) { + return; + } + else if (obj.button === 0 && (obj.ctrlKey || obj.metaKey)) { + open(obj.link, true, null, obj.isPrivate); + } + else if (obj.button === 1) { + open(obj.link, true, null, obj.isPrivate); + } + else { + open(obj.link, null, null, obj.isPrivate); + app.popup.hide(); } -}); -app.popup.receive('clipboard', function (o) { - app.clipboard(o.str); - app.notify(app.l10n(o.type ? 'msg_3' : 'msg_2')); }); app.popup.receive('update', function () { repeater.reset(true); @@ -540,7 +644,7 @@ app.popup.receive('action', function (o) { app.popup.send('action-response', o.cmd); }, function (e) { - app.notify(e); + app.notify(e.message || e); } ); }); @@ -574,73 +678,45 @@ app.button.onClick (function (e) { } } }); -app.button.onContext(function () { - // insert new items - var show = checkEmails.getCached().map(function (o) { - return o.xml.rootLink; - }).map(function (e, i, a) { - return a.indexOf(e) === i; - }); - var items = []; - if (isFirefox) { - items = checkEmails.getCached().filter(function (e, i) { + +app.button.onContext({ + get accounts () { + var show = checkEmails.getCached().map(function (o) { + return o.xml ? o.xml.rootLink : null; + }) + .filter(function (o) { + return o; + }) + .map(function (e, i, a) { + return a.indexOf(e) === i; + }); + return checkEmails.getCached().filter(function (e, i) { return show[i]; }).map(function (o) { return { - type: 'menuitem', label: o.xml.title, - command: function (link, e) { + command: function (link) { if (link) { open(link.replace(/\?.*/ , '')); } }.bind(this, o.xml.rootLink) }; }); - if (items.length) { - items.push({type: 'menuseparator'}); - } - - items = items.concat([ - {type: 'menu', label: app.l10n('label_3'), childs: [ - {type: 'menupopup', childs: [ - {type: 'menuitem', label: app.l10n('label_4'), value: 300}, - {type: 'menuitem', label: app.l10n('label_5'), value: 900}, - {type: 'menuitem', label: app.l10n('label_6'), value: 1800}, - {type: 'menuitem', label: app.l10n('label_7'), value: 3600}, - {type: 'menuitem', label: app.l10n('label_8'), value: 7200}, - {type: 'menuitem', label: app.l10n('label_9'), value: 18000} - ], command: function (e) { - actions.silent(parseInt(e.originalTarget.getAttribute('value')) * 1000); - }} - ]}, - {type: 'menuitem', label: app.l10n('label_10'), command: actions.silent}, - {type: 'menuseparator'} - ]); - } - else { - items = items.concat([ - {type: 'menuitem', label: app.l10n('label_3') + ' ' + app.l10n('label_4').toLowerCase(), command: actions.silent.bind(actions, 300 * 1000)}, - {type: 'menuitem', label: app.l10n('label_3') + ' ' + app.l10n('label_7').toLowerCase(), command: actions.silent.bind(actions, 3600 * 1000)}, - {type: 'menuitem', label: app.l10n('label_10'), command: actions.silent} - ]); - } - items = items.concat([ - {type: 'menuitem', label: app.l10n('label_11'), command: function () { - open(config.email.compose); - }}, - {type: 'menuitem', label: app.l10n('label_1'), command: actions.reset}, - ]); - if (isFirefox) { - items = items.concat([ - {type: 'menuitem', label: app.l10n('label_2'), command: actions.openOptions}, - {type: 'menuseparator'}, - {type: 'menuitem', label: app.l10n('label_12'), command: function () { - open(config.welcome.homepage + '?type=context'); - }} - ]); + }, + silent: actions.silent, + faq: function () { + open(config.welcome.homepage + '?type=context'); + }, + refresh: actions.reset, + compose: function () { + open(config.email.compose); + }, + options: actions.openOptions, + get state () { + return !config.notification.silent; } - return items; }); + // initialization app.startup(function () { //welcome @@ -650,11 +726,9 @@ app.startup(function () { '?type=' + (config.welcome.version ? 'upgrade' : 'install') + (config.welcome.version ? '&p=' + config.welcome.version : '') + '&v=' + app.version(); - app.timer.setTimeout(function () { - open(url, false); - }, config.welcome.time); + config.welcome.version = app.version(); + app.timer.setTimeout(open, config.welcome.time, url, false); } - config.welcome.version = app.version(); } }); if (!config.welcome.version) { @@ -687,15 +761,6 @@ app.options.receive('get', function (pref) { value: config.get(pref) }); }); -app.unload(function () { - app.windows.tabs.list().then(function (tabs) { - tabs.forEach(function (tab) { - if (tab.url === app.manifest.url + 'data/options/index.html') { - tab.close(); - } - }); - }); -}); // pref listeners config.on('email.check.resetPeriod', function () { if (config.email.check.resetPeriod) { @@ -706,6 +771,9 @@ config.on('email.check.resetPeriod', function () { resetTimer.stop(); } }); +config.on('email.check.period', function () { + repeater.fill(config.email.check.period * 1000); +}); config.on('email.openInboxOnOne', function () { var numberOfAccounts = checkEmails.getCached() .map(function (o) { @@ -747,4 +815,4 @@ app.on('update', function () { app.timer.setTimeout(function () { repeater.reset(); }, 500); -}) +}); diff --git a/src/lib/config.js b/v1/builds/unpacked/chrome/lib/config.js similarity index 63% rename from src/lib/config.js rename to v1/builds/unpacked/chrome/lib/config.js index 156eba4c..87cb2185 100644 --- a/src/lib/config.js +++ b/v1/builds/unpacked/chrome/lib/config.js @@ -157,7 +157,7 @@ config.email = (function () { } app.storage.write('notificationTruncate', Math.max(val, 20)); }, - maxReport: 1, //Maximum number of simultaneous reports from a single account + maxReport: 3, //Maximum number of simultaneous reports from a single account get alphabetic () { return app.storage.read('alphabetic') === 'true' ? true : false; }, @@ -182,10 +182,10 @@ config.email = (function () { get first () { var tmp = app.storage.read('initialPeriod'); if (tmp === null) { - return 5; + return 10; } tmp = +tmp; - return isNaN(tmp) ? 5 : tmp; + return isNaN(tmp) ? 10 : tmp; }, set first (val) { val = +val; @@ -198,11 +198,12 @@ config.email = (function () { app.storage.write('initialPeriod', val); }, get period () { - return +app.storage.read('period') || 15; + return +app.storage.read('period') || 60; }, set period (val) { val = parseInt(val); app.storage.write('period', val > 10 ? val : 10); + config.on.emit('email.check.period'); }, get resetPeriod () { var tmp = +app.storage.read('resetPeriod'); @@ -227,6 +228,12 @@ config.notification = { set show (val) { app.storage.write('notification', val); }, + get combined () { + return app.storage.read('combined') === 'true' ? true : false; + }, + set combined (val) { + app.storage.write('combined', val); + }, sound: { get play () { return app.storage.read('alert') === 'false' ? false : true; @@ -242,35 +249,204 @@ config.notification = { val = val < 100 ? val : 100; app.storage.write('soundVolume', val); }, - get type () { // 0-3: built-in, 4: user defined - return +app.storage.read('soundNotification') || 0; - }, - set type (val) { - app.storage.write('soundNotification', val); - app.play.reset(); - }, - get original () { - return (this.type % 4) + '.wav'; - }, - custom: { - get file () { - return app.storage.read('sound_file'); + media: { + default: { + get type () { // 0-3: built-in, 4: user defined + return +app.storage.read('notification.sound.media.default.type') || 0; + }, + set type (val) { + app.storage.write('notification.sound.media.default.type', val); + if (val === 4) { + app.options.send('custom-sound', 'notification.sound.media.default.file'); + } + }, + get file () { + return app.storage.read('notification.sound.media.default.file'); + }, + set file (val) { + app.storage.write('notification.sound.media.default.file', val); + }, + get mime () { + return app.storage.read('notification.sound.media.default.mime'); + }, + set mime (val) { + app.storage.write('notification.sound.media.default.mime', val); + } }, - set file (val) { - app.storage.write('sound_file', val); - app.play.reset(); + custom0: { + get type () { // 0-3: built-in, 4: user defined + return +app.storage.read('notification.sound.media.custom0.type') || 0; + }, + set type (val) { + app.storage.write('notification.sound.media.custom0.type', val); + if (val === 4) { + app.options.send('custom-sound', 'notification.sound.media.custom0.file'); + } + }, + get file () { + return app.storage.read('notification.sound.media.custom0.file'); + }, + set file (val) { + app.storage.write('notification.sound.media.custom0.file', val); + }, + get mime () { + return app.storage.read('notification.sound.media.custom0.mime'); + }, + set mime (val) { + app.storage.write('notification.sound.media.custom0.mime', val); + }, + get filter () { + return app.storage.read('notification.sound.media.custom0.filter') || ''; + }, + set filter (val) { + app.storage.write('notification.sound.media.custom0.filter', val); + }, + get selector () { + return +app.storage.read('notification.sound.media.custom0.selector') || 0; + }, + set selector (val) { + app.storage.write('notification.sound.media.custom0.selector', val); + }, }, - get name () { - return app.storage.read('sound_name') || app.l10n('unknown'); + custom1: { + get type () { // 0-3: built-in, 4: user defined + return +app.storage.read('notification.sound.media.custom1.type') || 0; + }, + set type (val) { + app.storage.write('notification.sound.media.custom1.type', val); + if (val === 4) { + app.options.send('custom-sound', 'notification.sound.media.custom1.file'); + } + }, + get file () { + return app.storage.read('notification.sound.media.custom1.file'); + }, + set file (val) { + app.storage.write('notification.sound.media.custom1.file', val); + }, + get mime () { + return app.storage.read('notification.sound.media.custom1.mime'); + }, + set mime (val) { + app.storage.write('notification.sound.media.custom1.mime', val); + }, + get filter () { + return app.storage.read('notification.sound.media.custom1.filter') || ''; + }, + set filter (val) { + app.storage.write('notification.sound.media.custom1.filter', val); + }, + get selector () { + return +app.storage.read('notification.sound.media.custom1.selector') || 0; + }, + set selector (val) { + app.storage.write('notification.sound.media.custom1.selector', val); + } }, - set name (val) { - app.storage.write('sound_name', val); + custom2: { + get type () { // 0-3: built-in, 4: user defined + return +app.storage.read('notification.sound.media.custom2.type') || 0; + }, + set type (val) { + app.storage.write('notification.sound.media.custom2.type', val); + if (val === 4) { + app.options.send('custom-sound', 'notification.sound.media.custom2.file'); + } + }, + get file () { + return app.storage.read('notification.sound.media.custom2.file'); + }, + set file (val) { + app.storage.write('notification.sound.media.custom2.file', val); + }, + get mime () { + return app.storage.read('notification.sound.media.custom2.mime'); + }, + set mime (val) { + app.storage.write('notification.sound.media.custom2.mime', val); + }, + get filter () { + return app.storage.read('notification.sound.media.custom2.filter') || ''; + }, + set filter (val) { + app.storage.write('notification.sound.media.custom2.filter', val); + }, + get selector () { + return +app.storage.read('notification.sound.media.custom2.selector') || 0; + }, + set selector (val) { + app.storage.write('notification.sound.media.custom2.selector', val); + } }, - get mime () { - return app.storage.read('sound_mime'); + custom3: { + get type () { // 0-3: built-in, 4: user defined + return +app.storage.read('notification.sound.media.custom3.type') || 0; + }, + set type (val) { + app.storage.write('notification.sound.media.custom3.type', val); + if (val === 4) { + app.options.send('custom-sound', 'notification.sound.media.custom3.file'); + } + }, + get file () { + return app.storage.read('notification.sound.media.custom3.file'); + }, + set file (val) { + app.storage.write('notification.sound.media.custom3.file', val); + }, + get mime () { + return app.storage.read('notification.sound.media.custom3.mime'); + }, + set mime (val) { + app.storage.write('notification.sound.media.custom3.mime', val); + }, + get filter () { + return app.storage.read('notification.sound.media.custom3.filter') || ''; + }, + set filter (val) { + app.storage.write('notification.sound.media.custom3.filter', val); + }, + get selector () { + return +app.storage.read('notification.sound.media.custom3.selector') || 0; + }, + set selector (val) { + app.storage.write('notification.sound.media.custom3.selector', val); + } }, - set mime (val) { - app.storage.write('sound_mime', val); + custom4: { + get type () { // 0-3: built-in, 4: user defined + return +app.storage.read('notification.sound.media.custom4.type') || 0; + }, + set type (val) { + app.storage.write('notification.sound.media.custom4.type', val); + if (val === 4) { + app.options.send('custom-sound', 'notification.sound.media.custom4.file'); + } + }, + get file () { + return app.storage.read('notification.sound.media.custom4.file'); + }, + set file (val) { + app.storage.write('notification.sound.media.custom4.file', val); + }, + get mime () { + return app.storage.read('notification.sound.media.custom4.mime'); + }, + set mime (val) { + app.storage.write('notification.sound.media.custom4.mime', val); + }, + get filter () { + return app.storage.read('notification.sound.media.custom4.filter') || ''; + }, + set filter (val) { + app.storage.write('notification.sound.media.custom4.filter', val); + }, + get selector () { + return +app.storage.read('notification.sound.media.custom4.selector') || 0; + }, + set selector (val) { + app.storage.write('notification.sound.media.custom4.selector', val); + } } } }, @@ -287,7 +463,23 @@ config.notification = { val = +val; app.storage.write('notificationTime', val > 3 ? val : 3); }, - silent: false, + get silentTime () { + return +app.storage.read('silentTime') || 10; // in minutes + }, + set silentTime (val) { + val = +val; + val = val > 1 ? val : 1; + val = val < 1000 ? val : 1000; + app.storage.write('silentTime', val); + }, + _silent: false, + get silent () { + return config.notification._silent; + }, + set silent (val) { + config.notification._silent = val; + app.button.onState(); + }, safari: { get oneTime () { return app.storage.read('safari-onetime') === 'false' ? false : true; @@ -473,7 +665,13 @@ config.popup = { }, set keyUp (val) { app.storage.write('keyUp', val); - } + }, + get populate () { // populate popup in background after a minute + return app.storage.read('populate') === 'false' ? false : true; + }, + set populate (val) { + app.storage.write('populate', val); + }, }; config.tabs = { @@ -483,6 +681,12 @@ config.tabs = { set search (val) { app.storage.write('searchMode', val); }, + get ignoreOpens () { // true: ignore opened Gmail tabs + return app.storage.read('ignoreOpens') === 'true' ? true : false; + }, + set ignoreOpens (val) { + app.storage.write('ignoreOpens', val); + }, get NotifyGmailIsOpen () { return app.storage.read('onGmailNotification') === 'false' ? false : true; }, diff --git a/v1/builds/unpacked/chrome/lib/utils/gmail.js b/v1/builds/unpacked/chrome/lib/utils/gmail.js new file mode 100644 index 00000000..58d03072 --- /dev/null +++ b/v1/builds/unpacked/chrome/lib/utils/gmail.js @@ -0,0 +1,141 @@ +'use strict'; + +var isFirefox = typeof require !== 'undefined'; +if (isFirefox) { + var app = require('../wrapper/firefox/app'); + var config = require('../config'); + var render = require('./render'); +} + +var gmail = typeof exports === 'undefined' ? {} : exports; + +gmail.body = (function () { + var iks = {}, contents = {}; + + function getIK (url) { + if (iks[url]) { + return app.Promise.resolve(iks[url]); + } + return new app.get(url).then(function (req) { + var tmp = /var GLOBALS\=\[(?:([^\,]*)\,){10}/.exec(req.responseText || ''); + var ik = tmp && tmp.length > 1 ? tmp[1].replace(/[\"\']/g, '') : null; + if (ik) { + iks[url] = ik; + return ik; + } + else { + return Error( + 'gmail.js -> body -> getIK -> ' + + 'Error at resolving user\'s static ID. Please switch back to the summary mode.' + ); + } + }); + } + + return function (link) { + link = link.replace('http://', 'https://'); + if (contents[link]) { + return app.Promise.resolve(contents[link]); + } + + var url = /[^\?]*/.exec(link)[0] + '/?ibxr=0'; + var thread = /message\_id\=([^\&]*)/.exec(link); + + if (!thread || !thread.length) { + return app.Promise.reject(Error( + 'gmail.js -> body -> Error at resolving thread. Please switch back to the summary mode.' + )); + } + return getIK(url).then(function (ik) { + return new app.get(url + '?ui=2&ik=' + ik + '&view=pt&dsqt=1&search=all&msg=' + thread[1]) + .then(function (req) { + if (req.status !== 200) { + return '...'; + } + var body = render[config.popup.display ? 'getHTMLText' : 'getPlainText'](req, url, link); + contents[link] = body; + return body; + }); + }); + }; +})(); + +/** + * Send archive, mark as read, mark as unread, and trash commands to Gmail server + * @param {String} link, xml.link address + * @param {String} cmd: rd, ur, rc_%5Ei, tr, sp + */ +gmail.action = (function () { + function getAt2 (url) { + return new app.get(url + 'h/' + Math.ceil(1000000 * Math.random())).then (function (req) { + if (!req) { + return Error('gmail.js -> action -> getAt2 -> server response is empty.'); + } + if (req.status === 200) { + var tmp = /at\=([^\"\&]*)/.exec(req.responseText); + return tmp && tmp.length > 1 ? tmp[1] : null; + } + else { + return Error('gmail.js -> action -> getAt2 -> got status of ' + req.status); + } + }); + } + function getAt (url) { + return new app.get(url).then(function (req) { + if (!req) { + return Error('gmail.js -> action -> getAt -> server response is empty.'); + } + if (req.status === 200) { + var tmp = /GM_ACTION_TOKEN\=\"([^\"]*)\"/.exec(req.responseText); + if (tmp && tmp.length) { + return tmp[1]; + } + else { + return getAt2(url); + } + } + else { + return Error('gmail.js -> action -> getAt -> got status of ' + req.status); + } + }); + } + + function sendCmd (url, at, threads, cmd) { + if (cmd === 'rc_%5Ei' && config.email.doReadOnArchive) { + sendCmd(url, at, threads, 'rd'); + } + var u = url + '&at=' + at + '&act=' + cmd.replace('rd-all', 'rd'); + u += '&t=' + threads.join('&t='); + + return new app.get(u).then(function (req) { + if (!req) { + return Error('gmail.js -> action -> sendCmd -> server response is empty.'); + } + if (req.status === 200) { + return true; + } + return Error('gmail.js -> action -> sendCmd -> got status of ' + req.status); + }); + } + + return function (links, cmd) { + links = typeof(links) === 'string' ? [links] : links; + var url = /[^\?]*/.exec(links[0])[0] + '/?ibxr=0'; + return getAt(url).then(function (at) { + if (at instanceof Error) { + return app.Promise.reject(at); + } + var threads = []; + links.forEach(function (link) { + var thread = /message\_id\=([^\&]*)/.exec(link); + if (thread && thread.length) { + threads.push(thread[1]); + } + }); + if (threads.length) { + return sendCmd(url, at, threads, cmd); + } + return app.Promise.reject(Error('gmail.js -> action -> Error at resolving thread.')); + }); + }; +})(); diff --git a/builds/unpacked/firefox/lib/utils/render.js b/v1/builds/unpacked/chrome/lib/utils/render.js similarity index 93% rename from builds/unpacked/firefox/lib/utils/render.js rename to v1/builds/unpacked/chrome/lib/utils/render.js index f97bafe2..c77161c1 100644 --- a/builds/unpacked/firefox/lib/utils/render.js +++ b/v1/builds/unpacked/chrome/lib/utils/render.js @@ -54,7 +54,7 @@ render.getHTMLText = function (req, link, feed) { .innerHTML .replace(/src\=\"\/mail\/u\//g, 'src="https://mail.google.com/mail/u/') .replace(/\?ui\=2\&/g, link + '?ui=2&') - .replace(/\/g, '') + .replace(//g, '') .replace(/display\:none\!important\;/g, '') .replace('[Quoted text hidden]', '[Quoted text hidden]'); } @@ -65,12 +65,16 @@ render.getHTMLText = function (req, link, feed) { else { var body = getLastMessage(req.responseText); return body ? - body.innerHTML.replace('[Quoted text hidden]', '[Quoted text hidden]') : + 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]') : req.responseText; } }; -render.getPlainText = function (req, link, feed) { +render.getPlainText = function (req) { var body = getLastMessage(req.responseText) || '...'; var normalize = function (a) { diff --git a/src/lib/utils/server.js b/v1/builds/unpacked/chrome/lib/utils/server.js similarity index 88% rename from src/lib/utils/server.js rename to v1/builds/unpacked/chrome/lib/utils/server.js index 13c80829..9a0c36b2 100644 --- a/src/lib/utils/server.js +++ b/v1/builds/unpacked/chrome/lib/utils/server.js @@ -9,7 +9,7 @@ else { } // -server.Parser = function(req, feed) { +server.Parser = function(req, feed, isPrivate) { var xml; if (req.responseXML) { xml = req.responseXML; @@ -20,9 +20,9 @@ server.Parser = function(req, feed) { } //Sometimes id is wrong in the feed structure! function fixID (link) { - var id = /u\/\d/.exec(feed); - if (id.length) { - return link.replace(/u\/\d/, id[0]); + var id = /u\/\d+/.exec(feed); + if (id && id.length) { + return link.replace(/u\/\d+/, id[0]); }; return link; } @@ -70,6 +70,10 @@ server.Parser = function(req, feed) { temp += "/?shva=1#label/" + label; } } catch(e) {} + // account selector uses this url as account identifier + if (isPrivate) { + temp += '@private'; + } return temp; }, @@ -121,6 +125,7 @@ server.Parser = function(req, feed) { get link () { var temp = entry.getElementsByTagName("link")[0].getAttribute("href").replace("http://", "https://"); temp = fixID (temp); + return temp; } } @@ -134,26 +139,26 @@ server.Parser = function(req, feed) { } } -server.Email = function (feed, timeout) { +server.Email = function (feed, timeout, isPrivate) { var d, ids = [], pCount = 0; - return { execute: function () { d = app.Promise.defer(); - var url = feed + "?rand=" + Math.round(Math.random() * 10000000); - new app.get(url, null, null, timeout).then( + var url = feed + '?rand=' + Math.round(Math.random() * 10000000); + new app.get(url, null, null, timeout, isPrivate).then( function (req) { if (req.status != 200) { return d.resolve({ + isPrivate: isPrivate, network: req.status !== 0, notAuthorized: req.status === 401, xml: null, newIDs: [] }); } - var xml = new server.Parser(req, feed); + var xml = new server.Parser(req, feed, isPrivate); //Cleaning old entries - var cIDs = xml.entries + var cIDs = (xml.entries || []) .filter(function (e) { var age = ((new Date()).getTime() - (new Date(e.modified)).getTime()); return age < 1000 * 60 * config.email.threatAsNew; @@ -171,13 +176,16 @@ server.Email = function (feed, timeout) { } pCount = xml.fullcount; d.resolve({ + isPrivate: isPrivate, network: true, notAuthorized: false, xml: xml, newIDs: newIDs }); } - ); + ).catch(function (e) { + d.reject(e) + }); return d.promise; }, reject: function () { diff --git a/builds/unpacked/firefox/lib/utils/tab.js b/v1/builds/unpacked/chrome/lib/utils/tab.js similarity index 100% rename from builds/unpacked/firefox/lib/utils/tab.js rename to v1/builds/unpacked/chrome/lib/utils/tab.js diff --git a/src/lib/utils/timer.js b/v1/builds/unpacked/chrome/lib/utils/timer.js similarity index 88% rename from src/lib/utils/timer.js rename to v1/builds/unpacked/chrome/lib/utils/timer.js index 7066d292..dc9bbb52 100644 --- a/src/lib/utils/timer.js +++ b/v1/builds/unpacked/chrome/lib/utils/timer.js @@ -1,14 +1,18 @@ +'use strict'; + +var app = app || require('../wrapper/firefox/app'); +var timer; + var isFirefox = typeof require !== 'undefined'; if (isFirefox) { - app = require('../wrapper/firefox/app'); timer = exports; } else { - var timer = {}; + timer = {}; } /** Repeater: Repeats a function infinity with an interval pattern - * Example: + * Example: * var repeater = new repeater(1000, 10000, 2000); * var i = 0; * repeater.on(function () { @@ -41,7 +45,7 @@ timer.repeater = function () { catch (e) {} }, t, arguments); } - + return { reset: function () { stop(); @@ -56,9 +60,9 @@ timer.repeater = function () { fill: function () { intervals = [].slice.call(arguments, 0); } - } -} + }; +}; timer.setTimeout = app.timer.setTimeout; timer.clearTimeout = app.timer.clearTimeout; -timer.setInterval = app.timer.setInterval; \ No newline at end of file +timer.setInterval = app.timer.setInterval; diff --git a/src/lib/wrapper/chrome/EventEmitter.js b/v1/builds/unpacked/chrome/lib/wrapper/chrome/EventEmitter.js similarity index 100% rename from src/lib/wrapper/chrome/EventEmitter.js rename to v1/builds/unpacked/chrome/lib/wrapper/chrome/EventEmitter.js diff --git a/src/lib/wrapper/chrome/app.js b/v1/builds/unpacked/chrome/lib/wrapper/chrome/app.js similarity index 56% rename from src/lib/wrapper/chrome/app.js rename to v1/builds/unpacked/chrome/lib/wrapper/chrome/app.js index 38a8a1ac..10ea0659 100644 --- a/src/lib/wrapper/chrome/app.js +++ b/v1/builds/unpacked/chrome/lib/wrapper/chrome/app.js @@ -1,7 +1,8 @@ -/* globals config, chrome, webkitNotifications */ +/* globals config, chrome */ 'use strict'; var app = new EventEmitter(); +var userActions = []; app.once('load', function () { var script = document.createElement('script'); @@ -10,10 +11,36 @@ app.once('load', function () { }); /* exports */ +if (!Promise.defer) { + Promise.defer = function () { + var deferred = {}; + var promise = new Promise(function (resolve, reject) { + deferred.resolve = resolve; + deferred.reject = reject; + }); + deferred.promise = promise; + return deferred; + }; +} app.Promise = Promise; +app.actions = function (callback) { + userActions.push(callback); +}; +chrome.notifications.onClicked.addListener(function (id) { + chrome.notifications.clear(id, function () {}); + userActions.forEach(function (callback) { + callback(); + }); + if (app.notify[id]) { + app.notify[id](); + } +}); + app.button = (function () { var callback; + var onContext; + var ids = {childs: []}; chrome.browserAction.onClicked.addListener(function () { if (callback) { callback(); @@ -25,31 +52,150 @@ app.button = (function () { callback = c; }, onContext: function (c) { - chrome.contextMenus.removeAll(); - var items = c(); - items.forEach(function (obj) { - chrome.contextMenus.create({ - title: obj.label, - type: obj.type === 'menuseparator' ? 'separator' : 'normal', - contexts: ['browser_action'], - onclick: obj.command + onContext = c; + ids.root = chrome.contextMenus.create({ + title: app.l10n('label_14'), + contexts: ['browser_action'], + enabled: false + }); + ids.disable = chrome.contextMenus.create({ + title: app.l10n('label_3'), + contexts: ['browser_action'] + }); + chrome.contextMenus.create({ + parentId: ids.disable, + title: app.l10n('label_4'), + contexts: ['browser_action'], + onclick: function () { + onContext.silent(300); + } + }); + chrome.contextMenus.create({ + parentId: ids.disable, + title: app.l10n('label_5'), + contexts: ['browser_action'], + onclick: function () { + onContext.silent(900); + } + }); + chrome.contextMenus.create({ + parentId: ids.disable, + title: app.l10n('label_6'), + contexts: ['browser_action'], + onclick: function () { + onContext.silent(1800); + } + }); + chrome.contextMenus.create({ + parentId: ids.disable, + title: app.l10n('label_7'), + contexts: ['browser_action'], + onclick: function () { + onContext.silent(3600); + } + }); + chrome.contextMenus.create({ + parentId: ids.disable, + title: app.l10n('label_8'), + contexts: ['browser_action'], + onclick: function () { + onContext.silent(7200); + } + }); + chrome.contextMenus.create({ + parentId: ids.disable, + title: app.l10n('label_9'), + contexts: ['browser_action'], + onclick: function () { + onContext.silent(18000); + } + }); + chrome.contextMenus.create({ + parentId: ids.disable, + title: app.l10n('label_13'), + contexts: ['browser_action'], + onclick: function () { + onContext.silent('custom'); + } + }); + ids.silent = chrome.contextMenus.create({ + title: app.l10n('label_10'), + type: 'checkbox', + checked: onContext.state, + contexts: ['browser_action'], + onclick: function () { + onContext.silent(); + } + }); + chrome.contextMenus.create({ + title: app.l10n('label_11'), + contexts: ['browser_action'], + onclick: onContext.compose + }); + chrome.contextMenus.create({ + title: app.l10n('label_1'), + contexts: ['browser_action'], + onclick: onContext.refresh + }); + chrome.contextMenus.create({ + title: app.l10n('label_12'), + contexts: ['browser_action'], + onclick: onContext.faq + }); + }, + fireContext: function () { + ids.childs.forEach(function (obj) { + chrome.contextMenus.remove(obj.id); + }); + ids.childs = []; + var accounts = onContext.accounts; + if (accounts.length === 1) { + chrome.contextMenus.update(ids.root, { + title: accounts[0].label, + onclick: accounts[0].command }); + } + else { + chrome.contextMenus.update(ids.root, { + title: app.l10n('label_14'), + onclick: null + }, () => { + accounts.forEach(function (obj) { + ids.childs.push({ + name: obj.name, + id: chrome.contextMenus.create({ + parentId: ids.root, + contexts: ['browser_action'], + title: obj.label, + onclick: obj.command + }) + }); + }); + }); + } + chrome.contextMenus.update(ids.root, { + enabled: accounts.length !== 0 + }); + }, + onState: function () { + chrome.contextMenus.update(ids.silent, { + checked: onContext.state }); }, onClick: function () {}, - set label (val) { + set label (val) { // jshint ignore:line chrome.browserAction.setTitle({ title: val }); }, - set badge (val) { + set badge (val) { // jshint ignore:line chrome.browserAction.setBadgeText({ text: (val ? val : '') + '' }); }, - set color (val) { + set color (val) { // jshint ignore:line chrome.browserAction.setIcon({ - path: '../../../data/icons/' + val + '/19.png' + path: '/data/icons/' + val + '/19.png' }); } }; @@ -241,80 +387,63 @@ app.notify = function (text, title, callback) { if (config.notification.silent) { return; } - - var notification, - icon = '../../../data/icons/notification/48.png'; - - if (typeof window.webkitNotifications === 'undefined' && typeof Notification === 'undefined') { - console.error('Notification dismissed', title, text); - return; //Opera + var isArray = Array.isArray(text); + if (isArray && text.length === 1) { + isArray = false; + text = text[0]; } - if (window.webkitNotifications) { - notification = webkitNotifications.createNotification(icon, title, text); - } - else { - notification = new Notification(title, { - body: text, - icon: icon - }); - } - notification.onclick = function () { - if (callback) { - callback(); - } - }; - window.setTimeout(function () { - if (notification) { - if (window.webkitNotifications) { - notification.cancel(); - } - else { - notification.close(); - } - } - }, config.notification.time * 1000); + chrome.notifications.create(null, { + type: isArray ? 'list' : 'basic', + iconUrl: '/data/icons/notification/48.png', + title: title, + message: isArray ? '' : text, + priority: 2, + eventTime: Date.now() + 30000, + items: isArray ? text.map(function (message) { + var tmp = message.split('\n'); + return { + title: tmp[1].replace('Title: ', ''), + message: tmp[0].replace('From: ', '') + }; + }): [], + isClickable: true, + requireInteraction: true + }, function (id) { + app.notify[id] = callback; + window.setTimeout(function (id) { + app.notify[id] = null; + chrome.notifications.clear(id, function () {}); + }, config.notification.time * 1000, id); + }); }; -app.play = (function () { - var audio; - function reset () { - audio = document.createElement('audio'); - audio.setAttribute('preload', 'auto'); - audio.autobuffer = true; - var source = document.createElement('source'); - var data = config.notification.sound.custom.file; - var mime = config.notification.sound.mime || 'audio/wav'; - if (config.notification.sound.type === 4 && data && audio.canPlayType(mime)) { - source.type = mime; - source.src = data; - } - else { - source.type = 'audio/wav'; - source.src = '../../../data/sounds/' + config.notification.sound.original; - } - audio.appendChild(source); - } +app.sound = (function () { + var audio = document.createElement('audio'); + audio.setAttribute('preload', 'auto'); + audio.setAttribute('autobuffer', 'true'); return { - now: function () { + play: function (index) { if (config.notification.silent) { return; } - if (!audio) { - reset(); + var type = index === null ? config.notification.sound.media.default.type : config.notification.sound.media['custom' + index].type; + var path = '../../../data/sounds/' + type + '.wav'; + if (type === 4) { + path = index === null ? config.notification.sound.media.default.file : config.notification.sound.media['custom' + index].file; } - + audio.src = path; audio.volume = config.notification.sound.volume / 100; - audio.load; audio.play(); }, - reset: reset + stop: function () { + audio.pause(); + audio.currentTime = 0; + } }; })(); -app.clipboard = function () {}; - app.version = function () { return chrome[chrome.runtime && chrome.runtime.getManifest ? 'runtime' : 'extension'].getManifest().version; }; @@ -412,12 +541,16 @@ app.contentScript = (function () { }; })(); /* updating badge when action is posted */ -chrome.webRequest.onHeadersReceived.addListener( +chrome.webRequest.onCompleted.addListener( function (info) { - if (info.url.indexOf('act=') !== -1) { + if (info.type === 'main_frame' || info.url.indexOf('act=') !== -1) { app.emit('update'); } }, {urls: ['https://mail.google.com/mail/u*']}, - ['responseHeaders'] + [] ); + +app.isPrivate = function () { + return false; +}; diff --git a/src/lib/wrapper/chrome/background.html b/v1/builds/unpacked/chrome/lib/wrapper/chrome/background.html similarity index 100% rename from src/lib/wrapper/chrome/background.html rename to v1/builds/unpacked/chrome/lib/wrapper/chrome/background.html diff --git a/src/manifest.json b/v1/builds/unpacked/chrome/manifest.json similarity index 92% rename from src/manifest.json rename to v1/builds/unpacked/chrome/manifest.json index 50e3ddf7..81691613 100644 --- a/src/manifest.json +++ b/v1/builds/unpacked/chrome/manifest.json @@ -1,9 +1,9 @@ { - "name": "Gmail™ Notifier", + "name": "Notifier for Gmail™", "short_name": "ignotifier", "description": "__MSG_description__", "author": "InBasic", - "version": "0.5.10", + "version": "0.7.4", "manifest_version": 2, "default_locale": "en", "permissions": [ diff --git a/v1/compile/convert.js b/v1/compile/convert.js new file mode 100644 index 00000000..66e1b917 --- /dev/null +++ b/v1/compile/convert.js @@ -0,0 +1,58 @@ +'use strict'; + +var fs = require('fs'); +var path = require('path'); + +function convert (input, outputs) { + + fs.exists('src/_locales/' + input + '/messages.json', function (exists) { + if (exists) { + fs.readFile('src/_locales/' + input + '/messages.json', 'utf8', function (err, data) { + if (err) { + throw err; + } + var json = JSON.parse(data); + var c = ''; + for (var name in json) { + c += name + '=' + json[name].message + '\n'; + } + outputs.forEach(function (output) { + fs.writeFile('src/locale/' + output + '.properties', c, 'utf8', function (err) { + if (err) { + throw err; + } + else { + console.log('[done]', input + '/messages.json', 'src/locale/' + output + '.properties'); + } + }); + }); + }); + } + else { + console.error('[error]', 'Cannot locate', input + '/messages.json'); + } + }); +} + +function map (input) { + if (input === 'en') { + return ['en', 'en-US']; + } + if (input === 'ru') { + return ['ru', 'ru-RU']; + } + return [input.replace('_', '-')]; +} + +fs.readdir('src/locale', function (err, files) { + console.error(err); + files.forEach(function (file) { + fs.unlinkSync(path.resolve('src/locale', file)); + }); + fs.readdir('src/_locales/', function (err, files) { + files.filter(f => !f.startsWith('.')).forEach(function (file) { + convert (file, map(file)); + }); + }); +}); + diff --git a/gulpfile.js b/v1/gulpfile.js similarity index 98% rename from gulpfile.js rename to v1/gulpfile.js index 61173df7..e21f32c6 100644 --- a/gulpfile.js +++ b/v1/gulpfile.js @@ -117,7 +117,7 @@ gulp.task('firefox-pack', function () { cwd: './builds/unpacked/firefox' })) .pipe(shell([ - 'zip firefox.xpi install.rdf icon.png icon64.png', + 'zip firefox.xpi icon.png icon64.png', ], { cwd: './builds/packed' })); diff --git a/v1/package.json b/v1/package.json new file mode 100644 index 00000000..6b3fb51d --- /dev/null +++ b/v1/package.json @@ -0,0 +1,23 @@ +{ + "author": "InBasic ", + "name" : "ignotifier", + "version" : "0.2.6", + "dependencies" : + { + "cli-color": "*", + "commander": "*", + "gulp": "*", + "gulp-change": "*", + "gulp-babel": "*", + "babel-preset-es2015": "*", + "gulp-if": "*", + "gulp-filter": "*", + "gulp-shell": "*", + "gulp-wait": "*", + "gulp-clean": "*", + "gulp-zip": "*", + "gulp-rename": "*", + "run-sequence": "*", + "jpm": "*" + } +} diff --git a/src/Icon-64.png b/v1/src/Icon-64.png similarity index 100% rename from src/Icon-64.png rename to v1/src/Icon-64.png diff --git a/src/Info.plist b/v1/src/Info.plist similarity index 100% rename from src/Info.plist rename to v1/src/Info.plist diff --git a/src/Settings.plist b/v1/src/Settings.plist similarity index 100% rename from src/Settings.plist rename to v1/src/Settings.plist diff --git a/v1/src/_locales/bg/messages.json b/v1/src/_locales/bg/messages.json new file mode 100644 index 00000000..e1744ae3 --- /dev/null +++ b/v1/src/_locales/bg/messages.json @@ -0,0 +1,690 @@ +{ + "label_9": { + "message": "За 5 часа", + "description": "" + }, + "options_notifications_19": { + "message": "Оповестяване за поща на Уиндоус", + "description": "" + }, + "options_notifications_17": { + "message": "Камбана", + "description": "" + }, + "options_notifications_13": { + "message": "Отваряне на панела при щракване върху иконката в лентата на задачите (Само за Уиндоус, в бета)", + "description": "" + }, + "options_notifications_30": { + "message": "Обединяване на всички едновременни известия на работния плот в едно известие", + "description": "" + }, + "settings_open_label": { + "message": "Отваряне на настройките", + "description": "" + }, + "options_timings_l7": { + "message": "Без проверка за нови писма при стартиране (в секунди):", + "description": "" + }, + "label_4": { + "message": "За 5 минути", + "description": "" + }, + "options_timings_l3": { + "message": "Напомняне за непрочетени писма на всеки (в минути):", + "description": "" + }, + "popup_msg_4": { + "message": "Преди 1 час", + "description": "" + }, + "options_gmail_1": { + "message": "Главна сметка (/mail/u/0/)", + "description": "" + }, + "options_gmail_10": { + "message": "Получаване на известия за следните етикети и сметки:", + "description": "" + }, + "options_notifications_1": { + "message": "Показване на известия на работния плот за нови писма", + "description": "" + }, + "options_notifications_9": { + "message": "Свирене на звуково оповестяване за нови писма", + "description": "" + }, + "label_6": { + "message": "За 30 минути", + "description": "" + }, + "options_misc_8": { + "message": "Нулиране на всички настройки към първоначалните", + "description": "" + }, + "options_notifications_28": { + "message": "Изключване на всички известия за избран период (в минути):", + "description": "" + }, + "options_timings_l4": { + "message": "Задайте стойността на нула за непериодични напомняния.", + "description": "" + }, + "options_notifications_32": { + "message": "името или писмото съдържа", + "description": "" + }, + "options_tab_6": { + "message": "Отваряне на пощата в нов прозорец", + "description": "" + }, + "options_notifications_25": { + "message": "В Сафари първоначалното звуково известяване може да не работи. Ако е така, използвайте потребителски файл.", + "description": "" + }, + "options_toolbar_15": { + "message": "Натискане със средното копче върху лентата", + "description": "" + }, + "options_toolbar_10": { + "message": "Минималната височина е 500 пиксела.", + "description": "" + }, + "popup_msg_10": { + "message": "Януари", + "description": "" + }, + "options_notifications_26": { + "message": "Винаги да се показват известия в областта за уведомяване (само за Уиндоус)", + "description": "" + }, + "label_3": { + "message": "Изключване на известията", + "description": "" + }, + "label_13": { + "message": "За избран период", + "description": "" + }, + "options_empty": { + "message": "не е обозначено", + "description": "" + }, + "options_notifications_3": { + "message": "Тази функция може да не работи на вашата операционна система.", + "description": "" + }, + "options_timings": { + "message": "Разписание", + "description": "" + }, + "options_gmail_5": { + "message": "Четвърта сметка (/mail/u/3/)", + "description": "" + }, + "label_5": { + "message": "За 15 минути", + "description": "" + }, + "options_misc_9": { + "message": "Червен цвят за \"Няма непрочетени\" и сив цвят за \"Няма връзка\"", + "description": "" + }, + "popup_msg_5": { + "message": "часа назад", + "description": "" + }, + "options_notifications_27": { + "message": "Известията в областта за уведомяване ще се показват дори ако няма непрочетени писма.", + "description": "" + }, + "options_misc_1": { + "message": "Подреждане на сметките по азбучен ред", + "description": "" + }, + "tooltip_1": { + "message": "Щракване с ляво копче: Отваряне на пощата или панела за предварителен преглед", + "description": "" + }, + "notification": { + "message": "От: [author_email][break] Заглавие: [title][break] Обобщение: [summary]", + "description": "" + }, + "popup_trash": { + "message": "Кошче", + "description": "" + }, + "options_tab": { + "message": "Отваряне на подпрозорец:", + "description": "" + }, + "log_into_your_account": { + "message": "Моля, влезте в сметката си", + "description": "" + }, + "label_10": { + "message": "Включване на известията", + "description": "" + }, + "options_notifications_23": { + "message": "Гръмкостта на звуковото оповестяване е", + "description": "" + }, + "options_timings_l2": { + "message": "Минималният период е 10 секунди.", + "description": "" + }, + "options_toolbar_11": { + "message": "Поддръжка на клавишни комбинации в панела", + "description": "" + }, + "options_gmail_9": { + "message": "Някои популярни етикети: \"Входяща поща\", \"Важни\", \"^smartlabel_personal\", \"^smartlabel_newsletter\", \"^smartlabel_notification\" и \"^smartlabel_group\"", + "description": "" + }, + "popup_msg_17": { + "message": "Август", + "description": "" + }, + "popup_msg_15": { + "message": "Юни", + "description": "" + }, + "options_notifications_34": { + "message": "обобщението на писмото съдържа", + "description": "" + }, + "label_14": { + "message": "Вписани сметки", + "description": "" + }, + "options_misc_13": { + "message": "По подразбиране, известителят обновява подсказките на копчето с входна информация. Ако изчистите отметката, текста в подсказката ще остане на първоначалната стойност.", + "description": "" + }, + "options_misc_6": { + "message": "Show desktop notification to warn that Gmail is already opened in the active tab", + "description": "" + }, + "popup_read": { + "message": "Отбелязване като прочетено", + "description": "" + }, + "options_notifications_4": { + "message": "Формат на известията", + "description": "" + }, + "settings_open_title": { + "message": "Отваряне на страницата с настройките", + "description": "" + }, + "label_2": { + "message": "Настройки", + "description": "" + }, + "options_toolbar_14": { + "message": "Ако предпочитате само текст в режима на цяло съдържание, махнете отметката.", + "description": "" + }, + "options_notifications_18": { + "message": "Звънене", + "description": "" + }, + "options_tab_5": { + "message": "Отваряне на пощата в подпрозорец на заден план", + "description": "" + }, + "label_7": { + "message": "За 1 час", + "description": "" + }, + "popup_archive": { + "message": "Архив", + "description": "" + }, + "msg_2": { + "message": "Връзката е копирана в буфера.", + "description": "" + }, + "options_title": { + "message": "Настройки", + "description": "" + }, + "popup_msg_13": { + "message": "Април", + "description": "" + }, + "popup_msg_9_format": { + "message": "Преди %d месец(а)", + "description": "" + }, + "popup_msg_11": { + "message": "Февруари", + "description": "" + }, + "popup_open_inbox": { + "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.", + "description": "" + }, + "gmail": { + "message": "Известител за пощата на Гугъл", + "description": "" + }, + "popup_msg_6": { + "message": "Вчера", + "description": "" + }, + "options_toolbar_8": { + "message": "Минималната ширина е 500 пиксела.", + "description": "" + }, + "options_notifications_16": { + "message": "Оповестяване по подразбиране", + "description": "" + }, + "options_misc_14": { + "message": "Без показване на точния брой в значката, когато непрочетените писма надхвърлят 999", + "description": "" + }, + "popup_msg_18": { + "message": "Септември", + "description": "" + }, + "options_notifications_14": { + "message": "Тази функция е експериментална и може да направи разглеждача Файърфокс нестабилен. [Изисква се повторно пускане].", + "description": "" + }, + "options_gmail_3": { + "message": "Втора сметка (/mail/u/1/)", + "description": "" + }, + "options_notifications_11": { + "message": "Показване на \"Известие в лентата със задачи на Уиндоус\" или \"Известие в лентата на Макинтош\"", + "description": "" + }, + "options_notifications_2": { + "message": "Показване на известия на работния плот за (в секунди):", + "description": "" + }, + "log_in_to_your_account": { + "message": "Моля, влезте в профила си в пощата на Гугъл", + "description": "" + }, + "popup_of": { + "message": "of", + "description": "" + }, + "options_notifications_15": { + "message": "Звуковото известие по подразбиране е", + "description": "" + }, + "options_notifications_21": { + "message": "Потребителският оповестителен звук е", + "description": "" + }, + "options_toolbar_9": { + "message": "Височина на панела в режим на преглед на цялото съдържание (в пиксели):", + "description": "" + }, + "options_toolbar_1": { + "message": "Поведение на копчето на лентата", + "description": "" + }, + "unknown": { + "message": "неизвестно", + "description": "" + }, + "popup_msg_21": { + "message": "Декември", + "description": "" + }, + "popup_read_all": { + "message": "Отбелязване на всички като прочетени", + "description": "" + }, + "options_notifications_8": { + "message": "Ако искате да няма многоточие, използвайте по-голямо число.", + "description": "" + }, + "options_donation": { + "message": "Направете дарение", + "description": "" + }, + "msg_3": { + "message": "Избраният текст е копиран в буфера.", + "description": "" + }, + "options_misc_7": { + "message": "Показване на приветстващата страница при надграждане", + "description": "" + }, + "options_gmail": { + "message": "Поща на Гугъл:", + "description": "" + }, + "label_1": { + "message": "Обновяване", + "description": "" + }, + "options_notifications_5": { + "message": "Налични променливи:", + "description": "" + }, + "options_notifications_24": { + "message": "Гръмкостта е число между 0 и 100, където 100 е най-високото (по подразбиране).", + "description": "" + }, + "options_notifications_10": { + "message": "Бележка за потребителите на Макинтош. От Файърфокс 28.0, всички известия на работния плот ще се управляват от Центъра за известия, което поражда допълнително звуково оповестяване. Трябва да изключите или това оповестяване, или оповестяването в Центъра за известия.", + "description": "" + }, + "options_misc_2": { + "message": "По подразбиране се сортира по ред на влизане.", + "description": "" + }, + "options_toolbar_2": { + "message": "Винаги да се отваря панел с предварителен преглед", + "description": "" + }, + "popup_settings": { + "message": "настройки", + "description": "" + }, + "options_gmail_4": { + "message": "Трета сметка (/mail/u/2/)", + "description": "" + }, + "options_toolbar_5": { + "message": "Показване само на обобщение", + "description": "" + }, + "options_notifications_12": { + "message": "В момента не се поддържат известия в лентата със задачи под Линукс.", + "description": "" + }, + "options_notifications_35": { + "message": "За да изберете нов потребителски звук, първо изберете вграден звук и след това променете настройката на потребителски.", + "description": "" + }, + "msg_1": { + "message": "Подпрозорецът вече е отворен. Натиснете копчето на лентата, за да отворите пощата в нов подпрозорец или да преминете към вече отворен раздел.", + "description": "" + }, + "popup_refresh": { + "message": "Презареждане", + "description": "" + }, + "options_misc_5": { + "message": "Син цвят за \"Няма непрочетени\" и сив цвят за \"Няма връзка\"", + "description": "" + }, + "options_timings_l8": { + "message": "Задайте стойността на нула, за да не се проверява за нови писма до първото ръчно обновяване [Не е налично в Сафари].", + "description": "" + }, + "popup_msg_19": { + "message": "Октомври", + "description": "" + }, + "options_notifications_33": { + "message": "заглавието на писмото съдържа", + "description": "" + }, + "tooltip_3": { + "message": "Щракване с дясно копче: Избор на сметка", + "description": "" + }, + "popup_date_format": { + "message": "%mm %dd, %yy", + "description": "" + }, + "options_notifications": { + "message": "Известия:", + "description": "" + }, + "options_timings_l6": { + "message": "Ако имате непрочетени писма, стойностите, различни от нула, пускат оповестителен звук и известия на работния плот безкрайно.", + "description": "" + }, + "popup_msg_12": { + "message": "Март", + "description": "" + }, + "options_notifications_22": { + "message": "Ако четецът ви не възпроизвежда потребителския звук, опитайте се да го преобразувате във формат WAV.", + "description": "" + }, + "options_tab_1": { + "message": "Търсене за отворена сметка само в активния прозорец", + "description": "" + }, + "popup_msg_7_format": { + "message": "Преди %d дена", + "description": "" + }, + "options_timings_l1": { + "message": "Проверка за нови писма на всеки (в секунди):", + "description": "" + }, + "options_toolbar_4": { + "message": "Режим на панела", + "description": "" + }, + "toolbar_label": { + "message": "Известител за пощата на Гугъл", + "description": "" + }, + "popup_msg_1": { + "message": "Току-що", + "description": "" + }, + "popup_open_settings": { + "message": "Отваряне на настройките", + "description": "" + }, + "options_misc_3": { + "message": "Цвят на иконката на лентата", + "description": "" + }, + "options_gmail_12": { + "message": "Отделяйте емисиите със \",\" (запетая). Примерна емисия: https://mail.google.com/mail/u/0/feed/atom/inbox", + "description": "" + }, + "options_toolbar_12": { + "message": "!: Докладване като спам, #: Кошче, e: Архив, Shift + i: Отбелязване като прочетено.", + "description": "" + }, + "options_px": { + "message": "px", + "description": "" + }, + "options_misc_11": { + "message": "Ако стойността се зададе на нула, няма да получавате нито звукови оповестявания, нито известия на работния плот. Ще работи само значката за известия.", + "description": "" + }, + "options_notifications_20": { + "message": "Потребителски звук", + "description": "" + }, + "and": { + "message": "и", + "description": "" + }, + "options_tab_7": { + "message": "Винаги да се използват празни подпрозорци вместо да се отваря нов, когато е включено отварянето в подпрозорци", + "description": "" + }, + "options_toolbar_3": { + "message": "Отваряне на пощата ако се използва само една сметка", + "description": "" + }, + "options_gmail_7": { + "message": "Шеста сметка (/mail/u/5/)", + "description": "" + }, + "popup_msg_8_format": { + "message": "Преди %d седмица(и)", + "description": "" + }, + "options_toolbar": { + "message": "Лента:", + "description": "" + }, + "options_notifications_6": { + "message": "Съкращаване на известията, по-дълги от", + "description": "" + }, + "popup_wait": { + "message": "Изчакайте...", + "description": "" + }, + "tooltip_2": { + "message": "Щракване със средно копче (или Контрол + Ляво): Обновяване на всички сметки", + "description": "" + }, + "options_notifications_29": { + "message": "Тази настройка е свързана с менюто на копчето -> изключване на всички известия -> избран период.", + "description": "" + }, + "options_tab_3": { + "message": "Отваряне на пощата до активния подпрозорец", + "description": "" + }, + "options_gmail_8": { + "message": "Отбелязване на писмото като прочетено при архвиране", + "description": "" + }, + "options_toolbar_17": { + "message": "Отваряне на главната сметка", + "description": "" + }, + "options_notifications_7": { + "message": "символа за полетата [заглавие] и [обобщение].", + "description": "" + }, + "options_misc_10": { + "message": "Да се появяват известия на работния плот и звукови оповестявания само за писма, пристигнали по-рано от (в минути):", + "description": "" + }, + "options_tab_8": { + "message": "Ignore opened Gmail tabs", + "description": "" + }, + "popup_no_subject": { + "message": "(няма тема)", + "description": "" + }, + "msg_5": { + "message": "Изберете звуков файл", + "description": "" + }, + "popup_msg_2": { + "message": "Преди 1 минута", + "description": "" + }, + "popup_msg_16": { + "message": "Юли", + "description": "" + }, + "label_8": { + "message": "За 2 часа", + "description": "" + }, + "msg_4": { + "message": "Бележка: За да работи правилно известителя, трябва да сте влезли в профила си в Гугъл.", + "description": "" + }, + "popup_msg_20": { + "message": "Ноември", + "description": "" + }, + "options_toolbar_6": { + "message": "Показване на цялото съдържание", + "description": "" + }, + "options_gmail_11": { + "message": "Потребителски емисии:", + "description": "" + }, + "options_tab_2": { + "message": "Без търсене в други прозорци за отворени сметки. Ако пощата не е отворена в активния прозорец, да се отвори нов подпрозорец.", + "description": "" + }, + "label_11": { + "message": "Писане на писмо", + "description": "" + }, + "options_toolbar_7": { + "message": "Ширина на панела в режим на преглед на цялото съдържание (в пиксели):", + "description": "" + }, + "options_notifications_31": { + "message": "Звуково известие по избор", + "description": "" + }, + "options_timings_l5": { + "message": "Минималният период е 5 минути.", + "description": "" + }, + "options_misc": { + "message": "Разни:", + "description": "" + }, + "options_gmail_2": { + "message": "Разделяйте етикетите със \",\" (запетая).", + "description": "" + }, + "options_misc_4": { + "message": "Сив цвят за \"Няма непрочетени\" и син цвят за \"Няма връзка\"", + "description": "" + }, + "options_toolbar_13": { + "message": "Извеждане на писмата като ЕМХТ (HTML) в режима на цяло съдържание", + "description": "" + }, + "options_toolbar_16": { + "message": "Обновяване на всички сметки", + "description": "" + }, + "options_gmail_6": { + "message": "Пета сметка (/mail/u/4/)", + "description": "" + }, + "popup_msg_14": { + "message": "Май", + "description": "" + }, + "options_inshort": { + "message": "Известител за няколко профила в пощата на Гугъл (Джимейл).", + "description": "" + }, + "options_misc_12": { + "message": "Без входни детайли в подсказките", + "description": "" + }, + "options_tab_4": { + "message": "Отваряне на пощата в активния подпрозорец", + "description": "" + }, + "popup_msg_3_format": { + "message": "Преди %d минути", + "description": "" + }, + "label_12": { + "message": "Отваряне на въпросника", + "description": "" + }, + "description": { + "message": "Известител за няколко профила в пощата на Гугъл (Джимейл)", + "description": "" + }, + "popup_spam": { + "message": "Спам", + "description": "" + } +} \ No newline at end of file diff --git a/v1/src/_locales/el/messages.json b/v1/src/_locales/el/messages.json new file mode 100644 index 00000000..073c67ad --- /dev/null +++ b/v1/src/_locales/el/messages.json @@ -0,0 +1,690 @@ +{ + "label_9": { + "message": "Για 5 ώρες", + "description": "" + }, + "options_notifications_19": { + "message": "Windows email ειδοποίηση", + "description": "" + }, + "options_notifications_17": { + "message": "Checker Plus ειδοποίηση καμπάνας", + "description": "" + }, + "options_notifications_13": { + "message": "Ανοιγμα της γραμμής εργαλείων όταν κάνετε κλικ στο εικονίδιο ειδοποίησης στην γραμμή εργασιών (μόνο για Windows, beta)", + "description": "" + }, + "options_notifications_30": { + "message": "Συνδυάστε όλες τις ταυτόχρονες ειδοποιήσεις στην επιφάνεια εργασίας σε μια ενιαία κοινοποίηση", + "description": "" + }, + "settings_open_label": { + "message": "Ανοίξτε τις Επιλογές", + "description": "" + }, + "options_timings_l7": { + "message": "Να μην γίνεται έλεγχος για νέα email κατά την εκκίνηση για (σε δευτερόλεπτα):", + "description": "" + }, + "label_4": { + "message": "Για 5 λεπτά", + "description": "" + }, + "options_timings_l3": { + "message": "Υπενθύμιση για όλα τα μη αναγνωσμένα email κάθε (σε λεπτά):", + "description": "" + }, + "popup_msg_4": { + "message": "1 ώρα πριν", + "description": "" + }, + "options_gmail_1": { + "message": "Πρωτοβάθμιος λογαριασμός (/mail/u/0/)", + "description": "" + }, + "options_gmail_10": { + "message": "Λάβετε ειδοποιήσεις για τις εξής ετικέτες και τους λογαριασμούς:", + "description": "" + }, + "options_notifications_1": { + "message": "Κοινοποίηση επιφάνειας εργασίας οθόνης για νέα email", + "description": "" + }, + "options_notifications_9": { + "message": "Αναπαραγωγή ήχου ειδοποίησης για νέα email", + "description": "" + }, + "label_6": { + "message": "Για 30 λεπτά", + "description": "" + }, + "options_misc_8": { + "message": "Επαναφορά όλων των ρυθμίσεων στις εργοστασιακές ρυθμίσεις", + "description": "" + }, + "options_notifications_28": { + "message": "Απενεργοποίηση όλων των ειδοποιήσεων για μια προσαρμοσμένη χρονική περίοδο (σε λεπτά):", + "description": "" + }, + "options_timings_l4": { + "message": "Ρυθμίστε την τιμή στο μηδέν για μη-περιοδικές υπενθυμίσεις.", + "description": "" + }, + "options_notifications_32": { + "message": "περιέχει όνομα ή email", + "description": "" + }, + "options_tab_6": { + "message": "Άνοιγμα λογαριασμού Gmail σε νέο παράθυρο", + "description": "" + }, + "options_notifications_25": { + "message": "Στο safari πιθανότατα οι προεπιλεγμένες ειδοποιήσεις ήχου να μην παίζουν σωστά, αν ναι, χρησιμοποιήστε ένα αρχείο ήχου ως κοινοποίηση.", + "description": "" + }, + "options_toolbar_15": { + "message": "Μέσαιο κλικ στην μπάρα εργαλείων για", + "description": "" + }, + "options_toolbar_10": { + "message": "Το ελάχιστο ύψος είναι 500px.", + "description": "" + }, + "popup_msg_10": { + "message": "Ιανουάριος", + "description": "" + }, + "options_notifications_26": { + "message": "Εμφανιση πάντα κοινοποίησης στον δίσκο (μόνο για Windows)", + "description": "" + }, + "label_3": { + "message": "Απενεργοποίηση όλων των ειδοποιήσεων", + "description": "" + }, + "label_13": { + "message": "Για μια προσαρμοσμένη χρονική περίοδο", + "description": "" + }, + "options_empty": { + "message": "δεν ορίζεται", + "description": "" + }, + "options_notifications_3": { + "message": "Η επιλογή αυτή δεν μπορεί να λειτουργήσει με βάση το λειτουργικό σας σύστημα.", + "description": "" + }, + "options_timings": { + "message": "Χρονοδιάγραμμα", + "description": "" + }, + "options_gmail_5": { + "message": "Τεταρτογενής λογαριασμός (/mail/u/3/)", + "description": "" + }, + "label_5": { + "message": "Για 15 λεπτά", + "description": "" + }, + "options_misc_9": { + "message": "Κόκκινο χρώμα για \"Μη Αναγνωσμένα\" και γκρι χρώμα για \"Ασύνδετα\"", + "description": "" + }, + "popup_msg_5": { + "message": "ώρες πριν", + "description": "" + }, + "options_notifications_27": { + "message": "Κοινοποίηση στον δίσκος θα εμφανίζεται ακόμη και αν δεν υπάρχει μη αναγνωσμένο μήνυμα.", + "description": "" + }, + "options_misc_1": { + "message": "Ταξινόμηση λογαριασμών αλφαβητικά", + "description": "" + }, + "tooltip_1": { + "message": "Αριστερό κλικ: Ανοίξτε το Gmail ή το παράθυρο προεπισκόπησης αλληλογραφίας", + "description": "" + }, + "notification": { + "message": "Από: [author_email] [break] Τίτλος: [τίτλος] [break] Περίληψη: [περίληψη]", + "description": "" + }, + "popup_trash": { + "message": "Σκουπίδια", + "description": "" + }, + "options_tab": { + "message": "Άνοιγμα καρτέλας:", + "description": "" + }, + "log_into_your_account": { + "message": "Παρακαλούμε συνδεθείτε στον λογαριασμό σας ", + "description": "" + }, + "label_10": { + "message": "Ενεργοποίηση ειδοποιήσεων", + "description": "" + }, + "options_notifications_23": { + "message": "Ένταση ήχου κοινοποιήσεως ", + "description": "" + }, + "options_timings_l2": { + "message": "Ελάχιστο χρονικό διάστημα είναι 10 δευτερόλεπτα.", + "description": "" + }, + "options_toolbar_11": { + "message": "Συντομεύσεις πληκτρολογίου υποστήριξης στον πίνακα εργαλείων", + "description": "" + }, + "options_gmail_9": { + "message": "Μερικές δημοφιλείς ετικέτες: \"Εισερχόμενα\", \"σημαντικό\", \"^ smartlabel προσωπικά\", \"^ smartlabel ενημερωτικό δελτίο\", \"^ κοινοποίηση smartlabel\", και \"^ smartlabel_group\"", + "description": "" + }, + "popup_msg_17": { + "message": "Αύγουστος", + "description": "" + }, + "popup_msg_15": { + "message": "Ιούνιος", + "description": "" + }, + "options_notifications_34": { + "message": "περιέχει περίληψη email", + "description": "" + }, + "label_14": { + "message": "Σύνδεση στους λογαριασμούς", + "description": "" + }, + "options_misc_13": { + "message": "Από προεπιλογή, ο κοινοποιών ενημερώνει κείμενο επεξήγησης του κουμπιού γραμμής εργαλείων με πληροφορίες σύνδεσης. Με την απενεργοποίηση της επιλογής αυτής, στο κείμενο επεξήγησης παραμένει η προεπιλεγμένη τιμή.", + "description": "" + }, + "options_misc_6": { + "message": "Show desktop notification to warn that Gmail is already opened in the active tab", + "description": "" + }, + "popup_read": { + "message": "Σημείωσε ως Διαβασμένο", + "description": "" + }, + "options_notifications_4": { + "message": "Μορφή κοινοποίησης", + "description": "" + }, + "settings_open_title": { + "message": "Ανοίξτε τις επιλογές (ρυθμίσεις) σελίδας", + "description": "" + }, + "label_2": { + "message": "Ρυθμίσεις", + "description": "" + }, + "options_toolbar_14": { + "message": "Αν προτιμάτε μονο το κείμενο σε λειτουργία πλήρους περιεχομένου, αποεπιλέξτε το πλαίσιο.", + "description": "" + }, + "options_notifications_18": { + "message": "Checker Plus Ειδοποίηση κωδώνισματος", + "description": "" + }, + "options_tab_5": { + "message": "Άνοιγμα λογαριασμού Gmail σε μια καρτέλα στον φόντο", + "description": "" + }, + "label_7": { + "message": "Για 1 ώρα", + "description": "" + }, + "popup_archive": { + "message": "Αρχείο", + "description": "" + }, + "msg_2": { + "message": "Ο σύνδεσμος έχει αντιγραφεί στο πρόχειρο.", + "description": "" + }, + "options_title": { + "message": "Επιλογές - Gmail ™ Notifier", + "description": "" + }, + "popup_msg_13": { + "message": "Απρίλιος", + "description": "" + }, + "popup_msg_9_format": { + "message": "%d μήνα(ες) πρίν", + "description": "" + }, + "popup_msg_11": { + "message": "Φεβρουάριος", + "description": "" + }, + "popup_open_inbox": { + "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.", + "description": "" + }, + "gmail": { + "message": "Gmail™ Notifier", + "description": "" + }, + "popup_msg_6": { + "message": "Εχθές", + "description": "" + }, + "options_toolbar_8": { + "message": "Το ελάχιστο πλάτος είναι 500px.", + "description": "" + }, + "options_notifications_16": { + "message": "Gmail Notifier προεπιλεγμένη ειδοποίηση", + "description": "" + }, + "options_misc_14": { + "message": "Να μην εμφανίζεται ο ακριβής αριθμός σημάτων όταν ο αριθμός των μη αναγνωσμένων μηνυμάτων ηλεκτρονικού ταχυδρομείου είναι μεγαλύτερος από 999", + "description": "" + }, + "popup_msg_18": { + "message": "Σεπτέμβριος", + "description": "" + }, + "options_notifications_14": { + "message": "Αυτό το χαρακτηριστικό είναι ιδιαίτερα πειραματικό και θα μπορούσε να κάνει τον Firefox browser ασταθή. [Επανεκκίνηση απαιτείται].", + "description": "" + }, + "options_gmail_3": { + "message": "Δευτερεύον λογαριασμός (/mail/u/1/)", + "description": "" + }, + "options_notifications_11": { + "message": "Εμφανιση \"Ειδοποιήσεις της γραμμής εργασιών του Windows\" ή \"Mac OS Dock κοινοποίησης\"", + "description": "" + }, + "options_notifications_2": { + "message": "Εμφάνιση κοινοποίησης επιφάνειας εργασίας για (σε δευτερόλεπτα):", + "description": "" + }, + "log_in_to_your_account": { + "message": "Παρακαλούμε συνδεθείτε στον Gmail λογαριασμό σας ", + "description": "" + }, + "popup_of": { + "message": "από", + "description": "" + }, + "options_notifications_15": { + "message": "Ο προ επιλεγμένος ήχος ειδοποίησης είναι", + "description": "" + }, + "options_notifications_21": { + "message": "Προσδιορισμενος ηχος απο τον χρηστη", + "description": "" + }, + "options_toolbar_9": { + "message": "Το υψος της γραμμής εργαλείων σε κατάσταση πλήρους περιεχομένου είναι (σε εικονοστοιχεία):", + "description": "" + }, + "options_toolbar_1": { + "message": "Γραμμή εργαλείων συμπεριφορά κουμπιού", + "description": "" + }, + "unknown": { + "message": "άγνωστο", + "description": "" + }, + "popup_msg_21": { + "message": "Δεκέμβριος", + "description": "" + }, + "popup_read_all": { + "message": "Σημείωση όλων ως Αναγνωσμένα", + "description": "" + }, + "options_notifications_8": { + "message": "Για να μην έχουν καμία περικοπή τα αποσιωπητικά, χρησιμοποιήστε ένα μεγάλο αριθμό εδώ.", + "description": "" + }, + "options_donation": { + "message": "Κάντε μια δωρεά", + "description": "" + }, + "msg_3": { + "message": "Το επιλεγμένο κείμενο έχει αντιγράφει στο πρόχειρο.", + "description": "" + }, + "options_misc_7": { + "message": "Εμφάνιση σελίδας υποδοχής για αναβάθμιση", + "description": "" + }, + "options_gmail": { + "message": "Gmail:", + "description": "" + }, + "label_1": { + "message": "Ανανέωση", + "description": "" + }, + "options_notifications_5": { + "message": "Διαθέσιμες μεταβλητές:", + "description": "" + }, + "options_notifications_24": { + "message": "Ένταση είναι ένας αριθμός μεταξύ 0 έως 100, όπου 100 είναι η υψηλότερη ένταση (προεπιλογή).", + "description": "" + }, + "options_notifications_10": { + "message": "Σημείωση για τους χρήστες του Mac. Από το Firefox 28.0, όλες οι ειδοποιήσεις στην επιφάνεια εργασίας διεκπεραιώνονται από το Mac Κέντρο Ειδοποίησης που προκαλεί ένα επιπλέον ήχο ειδοποίησης. Θα πρέπει είτε να απενεργοποιήσετε αυτο τον ήχο ειδοποίησης ή αυτόν που παράγεται από το Κέντρο Ειδοποίησης.", + "description": "" + }, + "options_misc_2": { + "message": "Ο τύπος προεπιλεγμένης σειράς που έχει συνδεθεί", + "description": "" + }, + "options_toolbar_2": { + "message": "Πάντα ανοικτό παράθυρο προεπισκόπησης email", + "description": "" + }, + "popup_settings": { + "message": "Ρυθμίσεις", + "description": "" + }, + "options_gmail_4": { + "message": "Τριτοβάθμιος λογαριασμός (/mail/u/2/)", + "description": "" + }, + "options_toolbar_5": { + "message": "Εμφάνιση μόνο συνοπτικά", + "description": "" + }, + "options_notifications_12": { + "message": "Το Taskbar notifications δεν υποστηρίζεται απο το λειτουργικό σύστημα Linux αυτή τη στιγμή.", + "description": "" + }, + "options_notifications_35": { + "message": "Για να επιλέξετε ένα νέο προσαρμοσμένο ήχο, επιλέξτε ένα ενσωματωμένο ήχο και στη συνέχεια αλλάξτε την επιλογή με τον προσαρμοσμένο ήχο", + "description": "" + }, + "msg_1": { + "message": "Η καρτέλα είναι ήδη ανοικτή. Κάντε κλικ στο κουμπί της γραμμής εργαλείων για να ανοίξετε το Gmail σε μια νέα καρτέλα, ή να μεταβείτε σε μια υπάρχουσα Gmail καρτέλα.", + "description": "" + }, + "popup_refresh": { + "message": "Ανανεώνω", + "description": "" + }, + "options_misc_5": { + "message": "Μπλε χρώμα για \"Μη Αναγνωσμένα\" και γκρι χρώμα για \"Αποσυνδεση\"", + "description": "" + }, + "options_timings_l8": { + "message": "Ρυθμίστε την τιμή στο μηδέν για κανένα έλεγχο e-mail μέχρι την πρώτη χειροκίνητη ανανέωση [Δεν διατίθεται στο Safari].", + "description": "" + }, + "popup_msg_19": { + "message": "Οκτώβριος", + "description": "" + }, + "options_notifications_33": { + "message": "περιέχει τίτλο email", + "description": "" + }, + "tooltip_3": { + "message": "Δεξί κλικ: Επιλογές Λογαριασμού", + "description": "" + }, + "popup_date_format": { + "message": "%mm %dd, %yy", + "description": "" + }, + "options_notifications": { + "message": "Ειδοποιήσεις:", + "description": "" + }, + "options_timings_l6": { + "message": "Πυρκαγιές με μη μηδενική τιμή, κοινοποίηση και ηχητική ειδοποίηση τόσο στην επιφάνεια εργασίας (παρόμοιο με νέα άφιξη email) για πάντα, αν έχετε μη αναγνωσμένα email(s).", + "description": "" + }, + "popup_msg_12": { + "message": "Μάρτιος", + "description": "" + }, + "options_notifications_22": { + "message": "Αν ο browser σας δεν παίζει το προεπιλεγμένο ήχο ειδοποίησης, προσπαθήστε να το μετατρέψετε σε μια απλή μορφή WAV χρησιμοποιώντας ένα online εργαλείο μετατροπής.", + "description": "" + }, + "options_tab_1": { + "message": "Αναζήτηση για έναν ανοικτό λογαριασμό Gmail μόνο στο ενεργό παράθυρο", + "description": "" + }, + "popup_msg_7_format": { + "message": "%d ημέρες πριν", + "description": "" + }, + "options_timings_l1": { + "message": "Έλεγχος για νέα e-mail κάθε (σε δευτερόλεπτα):", + "description": "" + }, + "options_toolbar_4": { + "message": "Λειτουργία γραμμής εργαλείων", + "description": "" + }, + "toolbar_label": { + "message": "Gmail™ Notifier", + "description": "" + }, + "popup_msg_1": { + "message": "μόλις τώρα", + "description": "" + }, + "popup_open_settings": { + "message": "Ανοίξτε τις ρυθμίσεις", + "description": "" + }, + "options_misc_3": { + "message": "Το σχέδιο χρώματος γραμμής εργαλείων είναι", + "description": "" + }, + "options_gmail_12": { + "message": "Ξεχωριστές τροφοδοσίες με \",\" (κόμμα). Δείγμα τροφοδοσίας: https://mail.google.com/mail/u/0/feed/atom/inbox", + "description": "" + }, + "options_toolbar_12": { + "message": "!: Αναφορά ως ανεπιθύμητο, #: Απορρίμματα, και: Αρχείο, Shift + I: Επισήμανση ως διαβάσμενο", + "description": "" + }, + "options_px": { + "message": "px", + "description": "" + }, + "options_misc_11": { + "message": "Θέτοντας αυτήν την προτίμηση στο μηδέν, δεν θα λάμβανετε ειδοποιήσεις στην επιφάνεια εργασίας και ούτε ηχητικές ειδοποιήσεις. Ωστόσο, μπορείτε ακόμα να παίρνετε σήμα κοινοποιήσεων.", + "description": "" + }, + "options_notifications_20": { + "message": "Ο ήχος ορίζεται από τον χρήστη ", + "description": "" + }, + "and": { + "message": "και", + "description": "" + }, + "options_tab_7": { + "message": "Πάντα να χρησιμοποιείτε κενό καρτελών αντί να ανοίγει μια νέα καρτέλα, όταν είναι ανοικτή στην καρτέλα ενεργοποιείται", + "description": "" + }, + "options_toolbar_3": { + "message": "Άνοιγμα λογαριασμού Gmail αν μόνο ένας λογαριασμός είναι συνδεδεμένος ", + "description": "" + }, + "options_gmail_7": { + "message": "Σκηνικός λογαριασμός (/mail/u/5/)", + "description": "" + }, + "popup_msg_8_format": { + "message": "%d εβδομάδα(ες) πριν", + "description": "" + }, + "options_toolbar": { + "message": "Γραμμη Εργαλειων:", + "description": "" + }, + "options_notifications_6": { + "message": "Περικόψτε ειδοποιήσεις περισσότερο από", + "description": "" + }, + "popup_wait": { + "message": "Περιμένετε...", + "description": "" + }, + "tooltip_2": { + "message": "Μεσαίο (ή Ctrl + Left) κλικ: Ανανέωση όλων των λογαριασμών", + "description": "" + }, + "options_notifications_29": { + "message": "Αυτή η επιλογή σχετίζεται με το δεξί κλικ μενού στο κουμπί της γραμμής εργαλείων -> απενεργοποιήσετε όλες τις ειδοποιήσεις -> προσαρμοσμένης χρονικής περιόδου.", + "description": "" + }, + "options_tab_3": { + "message": "Άνοιγμα νέου λογαριασμού Gmail δίπλα στην ενεργή καρτέλα", + "description": "" + }, + "options_gmail_8": { + "message": "Σήμανση ως αναγνωσμένο μήνυμα κατά την αρχειοθέτηση", + "description": "" + }, + "options_toolbar_17": { + "message": "Άνοιγμα του κύριου Gmail λογαριασμου", + "description": "" + }, + "options_notifications_7": { + "message": "χαρακτήρες για [τίτλος] και [περίληψη] πεδία.", + "description": "" + }, + "options_misc_10": { + "message": "Μόνο εμφάνιση στην επιφάνεια εργασίας και ηχητικές ειδοποιήσεις, όταν το ηλεκτρονικό ταχυδρομείου έχει φτάσει σε λιγότερο από (σε λεπτά):", + "description": "" + }, + "options_tab_8": { + "message": "Ignore opened Gmail tabs", + "description": "" + }, + "popup_no_subject": { + "message": "(χωρίς θέμα)", + "description": "" + }, + "msg_5": { + "message": "Επιλέξτε ένα αρχείο ήχου", + "description": "" + }, + "popup_msg_2": { + "message": "1 λεπτό πριν", + "description": "" + }, + "popup_msg_16": { + "message": "Ιούλιος", + "description": "" + }, + "label_8": { + "message": "Για 2 ώρες", + "description": "" + }, + "msg_4": { + "message": "Σημείωση: Για να λειτουργήσει σωστά το notifier, θα πρέπει να είστε συνδεδεμένοι στον Google λογαριασμό σας.", + "description": "" + }, + "popup_msg_20": { + "message": "Νοέμβριος", + "description": "" + }, + "options_toolbar_6": { + "message": "Εμφάνιση πλήρους περιεχομένου", + "description": "" + }, + "options_gmail_11": { + "message": "Προσαρμοσμένες τροφοδοσίες:", + "description": "" + }, + "options_tab_2": { + "message": "Μην ψάξετε σε άλλα παράθυρα του προγράμματος περιήγησης για ανοικτούς λογαριασμούς Gmail. Εάν το Gmail δεν είναι ανοικτό στο ενεργό παράθυρο, ανοίξτε μια νέα καρτέλα.", + "description": "" + }, + "label_11": { + "message": "Συντάξτε ένα e-mail", + "description": "" + }, + "options_toolbar_7": { + "message": "Πλάτος γραμμής εργαλείων του πίνακα σε κατάσταση πλήρους περιεχομένου (σε εικονοστοιχεία):", + "description": "" + }, + "options_notifications_31": { + "message": "Προσαρμοσμένος ήχος ειδοποίησης", + "description": "" + }, + "options_timings_l5": { + "message": "Ελάχιστη περίοδος είναι 5 λεπτά.", + "description": "" + }, + "options_misc": { + "message": "Διάφορα:", + "description": "" + }, + "options_gmail_2": { + "message": "Ξεχωριστές ετικέτες με \",\" (κόμμα).", + "description": "" + }, + "options_misc_4": { + "message": "Γκρι χρώμα για \"Μη Αναγνωσμένα\" και μπλε χρώμα για \"Αποσυνδεση\"", + "description": "" + }, + "options_toolbar_13": { + "message": "Απόδοση e-mail ως HTML σε λειτουργία πλήρους περιεχομένου", + "description": "" + }, + "options_toolbar_16": { + "message": "Ανανέωση όλων των λογαριασμών", + "description": "" + }, + "options_gmail_6": { + "message": "Πενταδικός λογαριασμός (/mail/u/4/)", + "description": "" + }, + "popup_msg_14": { + "message": "Μάιος", + "description": "" + }, + "options_inshort": { + "message": "Πολλαπλές ετικέτες και λογαριασμοί κοινοποιών για το Google Mail (Gmail).", + "description": "" + }, + "options_misc_12": { + "message": "Δεν περιλαμβάνονται στοιχεία σύνδεσης στο κείμενο επεξήγησης", + "description": "" + }, + "options_tab_4": { + "message": "Άνοιγμα λογαριασμού Gmail στην ενεργή καρτέλα", + "description": "" + }, + "popup_msg_3_format": { + "message": "%d λεπτά πριν", + "description": "" + }, + "label_12": { + "message": "Άνοιγμα Συχνών Ερωτήσεων", + "description": "" + }, + "description": { + "message": "Πολλαπλές ετικέτες και κοινοποίηση λογαριασμού για το Google Mail (Gmail)", + "description": "" + }, + "popup_spam": { + "message": "Spam", + "description": "" + } +} \ No newline at end of file diff --git a/v1/src/_locales/en/messages.json b/v1/src/_locales/en/messages.json new file mode 100644 index 00000000..6bd7bb34 --- /dev/null +++ b/v1/src/_locales/en/messages.json @@ -0,0 +1,524 @@ +{ + "gmail": { + "message": "Notifier for Gmail™" + }, + "toolbar_label": { + "message": "Notifier for Gmail™" + }, + "tooltip_1": { + "message": "Left click: Open Gmail™ or mail preview panel" + }, + "tooltip_2": { + "message": "Middle (or Ctrl+Left) click: Refresh all accounts" + }, + "tooltip_3": { + "message": "Right click: Account selections" + }, + "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" + }, + + "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 a custom time period" + }, + "label_10": { + "message": "Enable notifications" + }, + "label_11": { + "message": "Compose an email" + }, + "label_12": { + "message": "Open FAQs" + }, + "label_14": { + "message": "Logged-in 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 - Gmail™ Notifier" + }, + "options_inshort": { + "message": "Multiple label and account notifier for Google Mail (Gmail™)." + }, + "options_donation": { + "message": "Make a Donation" + }, + "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 for 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_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 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_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_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 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 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" + }, + "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 is" + }, + "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 is" + }, + "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_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 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:" + }, + "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_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 is (in pixels):" + }, + "options_toolbar_8": { + "message": "Minimum width is 500px." + }, + "options_toolbar_9": { + "message": "Toolbar panel height in the full-content view mode is (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, e: Archive, Shift + i: 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 color pattern is" + }, + "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_px": { + "message": "px" + }, + "options_empty": { + "message": "not defined" + }, + + "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_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/v1/src/_locales/fr/messages.json b/v1/src/_locales/fr/messages.json new file mode 100644 index 00000000..1a1d1853 --- /dev/null +++ b/v1/src/_locales/fr/messages.json @@ -0,0 +1,690 @@ +{ + "label_9": { + "message": "Pour 5 heures", + "description": "" + }, + "options_notifications_19": { + "message": "Alerte e-mail Windows", + "description": "" + }, + "options_notifications_17": { + "message": "Alerte sonore \"Bell\" de l'extension \"Checker Plus\" pour Google Chrome", + "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)", + "description": "" + }, + "options_notifications_30": { + "message": "Combiner toutes les notifications de bureau simultanées en une seule notification", + "description": "" + }, + "settings_open_label": { + "message": "Ouvrir les options", + "description": "" + }, + "options_timings_l7": { + "message": "Ne pas relever les nouveaux e-mails au démarrage avant (en secondes) :", + "description": "" + }, + "label_4": { + "message": "Pour 5 min", + "description": "" + }, + "options_timings_l3": { + "message": "Rappeler les e-mails non lus toutes les (en minutes) :", + "description": "" + }, + "popup_msg_4": { + "message": "1 heure plus tôt", + "description": "" + }, + "options_gmail_1": { + "message": "Compte principal (/mail/u/0/)", + "description": "" + }, + "options_gmail_10": { + "message": "Recevoir les notifications pour les libellés et comptes suivants :", + "description": "" + }, + "options_notifications_1": { + "message": "Afficher la notification sur le bureau pour les nouveaux e-mails", + "description": "" + }, + "options_notifications_9": { + "message": "Jouer l'alerte sonore pour les nouveaux e-mails", + "description": "" + }, + "label_6": { + "message": "Pour 30 min", + "description": "" + }, + "options_misc_8": { + "message": "Réinitialiser tous les paramètres aux valeurs par défaut", + "description": "" + }, + "options_notifications_28": { + "message": "Désactiver toutes les notifications pendant une période de temps personnalisée (en minutes) :", + "description": "" + }, + "options_timings_l4": { + "message": "Positionner la valeur à zéro pour tous les rappels non périodiques.", + "description": "" + }, + "options_notifications_32": { + "message": "nom ou contenus d'e-mail", + "description": "" + }, + "options_tab_6": { + "message": "Ouvrir un compte Gmail™ dans une nouvelle fenêtre", + "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.", + "description": "" + }, + "options_toolbar_15": { + "message": "Cliquer avec le bouton du milieu sur bouton de la barre d'outils pour", + "description": "" + }, + "options_toolbar_10": { + "message": "La hauteur minimale est de 500 pixels.", + "description": "" + }, + "popup_msg_10": { + "message": "Janvier", + "description": "" + }, + "options_notifications_26": { + "message": "Toujours afficher la notification dans la zone de notification système (uniquement sous Windows)", + "description": "" + }, + "label_3": { + "message": "Désactiver toutes les notifications", + "description": "" + }, + "label_13": { + "message": "Pour une période de temps personnalisée", + "description": "" + }, + "options_empty": { + "message": "non défini", + "description": "" + }, + "options_notifications_3": { + "message": "Cette option peut ne pas fonctionner sur votre système d'exploitation.", + "description": "" + }, + "options_timings": { + "message": "Temporisations", + "description": "" + }, + "options_gmail_5": { + "message": "4ème compte (/mail/u/3/)", + "description": "" + }, + "label_5": { + "message": "Pour 15 min", + "description": "" + }, + "options_misc_9": { + "message": "Couleur rouge pour \"Tous lus\" et couleur gris pour \"Déconnecté\"", + "description": "" + }, + "popup_msg_5": { + "message": "heures plus tôt", + "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.", + "description": "" + }, + "options_misc_1": { + "message": "Trier les comptes par ordre alphabétique", + "description": "" + }, + "tooltip_1": { + "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]", + "description": "" + }, + "popup_trash": { + "message": "Corbeille", + "description": "" + }, + "options_tab": { + "message": "Ouverture d'onglet :", + "description": "" + }, + "log_into_your_account": { + "message": "Veuillez vous connecter à votre compte", + "description": "" + }, + "label_10": { + "message": "Activer les notifications", + "description": "" + }, + "options_notifications_23": { + "message": "Le volume de la notification sonore est", + "description": "" + }, + "options_timings_l2": { + "message": "La période minimum est de 10 secondes.", + "description": "" + }, + "options_toolbar_11": { + "message": "Support des raccourcis clavier dans le panneau de la barre d'outils", + "description": "" + }, + "options_gmail_9": { + "message": "Des libellés populaires : \"inbox\", \"important\", \"^smartlabel_personal\", \"^smartlabel_newsletter\", \"^smartlabel_notification\", et \"^smartlabel_group\"", + "description": "" + }, + "popup_msg_17": { + "message": "Août", + "description": "" + }, + "popup_msg_15": { + "message": "Juin", + "description": "" + }, + "options_notifications_34": { + "message": "sommaire de contenus d'e-mail", + "description": "" + }, + "label_14": { + "message": "Comptes connecté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.", + "description": "" + }, + "options_misc_6": { + "message": "Afficher une notification sur le bureau pour avertir que Gmail™ est déjà ouvert dans l'onglet actif", + "description": "" + }, + "popup_read": { + "message": "Marquer comme lu", + "description": "" + }, + "options_notifications_4": { + "message": "Format de notification", + "description": "" + }, + "settings_open_title": { + "message": "Ouvrir la page des options (paramètres)", + "description": "" + }, + "label_2": { + "message": "Paramètres", + "description": "" + }, + "options_toolbar_14": { + "message": "Si vous préférez le rendu \"texte uniquement\" dans le mode \"contenu total\", décochez cette case.", + "description": "" + }, + "options_notifications_18": { + "message": "Alerte sonore \"Ding\" de l'extension \"Checker Plus\" pour Google Chrome", + "description": "" + }, + "options_tab_5": { + "message": "Ouvrir un compte Gmail™ dans un onglet d'arrière-plan", + "description": "" + }, + "label_7": { + "message": "Pour 1 heure", + "description": "" + }, + "popup_archive": { + "message": "Archive", + "description": "" + }, + "msg_2": { + "message": "Le lien est copié dans le presse-papiers.", + "description": "" + }, + "options_title": { + "message": "Options - Notifieur Gmail™", + "description": "" + }, + "popup_msg_13": { + "message": "Avril", + "description": "" + }, + "popup_msg_9_format": { + "message": "%d mois plus tôt", + "description": "" + }, + "popup_msg_11": { + "message": "Février", + "description": "" + }, + "popup_open_inbox": { + "message": "Ouvrir la boîte de réception", + "description": "" + }, + "options_tab_9": { + "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": "Notifieur Gmail™", + "description": "" + }, + "popup_msg_6": { + "message": "Hier", + "description": "" + }, + "options_toolbar_8": { + "message": "La largeur minimale est de 500 pixels.", + "description": "" + }, + "options_notifications_16": { + "message": "Alerte par défaut du Notifieur Gmail™", + "description": "" + }, + "options_misc_14": { + "message": "Ne pas afficher le nombre badge exact quand le nombre d'e-mails non lus est supérieur à 999", + "description": "" + }, + "popup_msg_18": { + "message": "Septembre", + "description": "" + }, + "options_notifications_14": { + "message": "Cette fonctionnalité est hautement expérimentale et pourrait rendre instable votre navigateur Firefox. [Rédemarrage nécessaire].", + "description": "" + }, + "options_gmail_3": { + "message": "2ème compte (/mail/u/1/)", + "description": "" + }, + "options_notifications_11": { + "message": "Afficher la notification dans la barre de tâches Windows ou dans le dock Mac OS", + "description": "" + }, + "options_notifications_2": { + "message": "Présenter la notification de bureau pendant (en secondes) :", + "description": "" + }, + "log_in_to_your_account": { + "message": "Veuillez vous connecter à votre compte Gmail™", + "description": "" + }, + "popup_of": { + "message": "sur", + "description": "" + }, + "options_notifications_15": { + "message": "La notification sonore par défaut est", + "description": "" + }, + "options_notifications_21": { + "message": "La notification sonore définie par l'utilisateur est", + "description": "" + }, + "options_toolbar_9": { + "message": "La hauteur du panneau de la barre d'outils dans le mode \"contenu total\" est (en pixels) :", + "description": "" + }, + "options_toolbar_1": { + "message": "Comportement du bouton de la barre d'outils", + "description": "" + }, + "unknown": { + "message": "inconnu", + "description": "" + }, + "popup_msg_21": { + "message": "Décembre", + "description": "" + }, + "popup_read_all": { + "message": "Tout marquer comme lu", + "description": "" + }, + "options_notifications_8": { + "message": "Pour ne pas tronquer avec des points de suspension, utiliser un nombre élevé.", + "description": "" + }, + "options_donation": { + "message": "Faire un don", + "description": "" + }, + "msg_3": { + "message": "Le texte sélectionné est copié dans le presse-papiers.", + "description": "" + }, + "options_misc_7": { + "message": "Afficher la page de bienvenue après une mise à jour", + "description": "" + }, + "options_gmail": { + "message": "Gmail™ :", + "description": "" + }, + "label_1": { + "message": "Rafraîchir", + "description": "" + }, + "options_notifications_5": { + "message": "Variables disponibles :", + "description": "" + }, + "options_notifications_24": { + "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": "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": { + "message": "Le type de tri par défaut respecte l'ordre de connexions.", + "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/)", + "description": "" + }, + "options_toolbar_5": { + "message": "Afficher le résumé uniquement", + "description": "" + }, + "options_notifications_12": { + "message": "Les notifications dans la barre de tâches ne sont pas supportées sous Linux pour le moment.", + "description": "" + }, + "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": "" + }, + "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.", + "description": "" + }, + "popup_refresh": { + "message": "Rafraîchir", + "description": "" + }, + "options_misc_5": { + "message": "Couleur bleu pour \"Tous lus\" et couleur gris pour \"Déconnecté\"", + "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].", + "description": "" + }, + "popup_msg_19": { + "message": "Octobre", + "description": "" + }, + "options_notifications_33": { + "message": "titre des contenus d'e-mail", + "description": "" + }, + "tooltip_3": { + "message": "Clic droit : sélections des comptes", + "description": "" + }, + "popup_date_format": { + "message": "%dd %mm %yy", + "description": "" + }, + "options_notifications": { + "message": "Notifications :", + "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.", + "description": "" + }, + "popup_msg_12": { + "message": "Mars", + "description": "" + }, + "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_tab_1": { + "message": "Chercher un compte Gmail™ ouvert seulement dans la fenêtre active", + "description": "" + }, + "popup_msg_7_format": { + "message": "%d jours plus tôt", + "description": "" + }, + "options_timings_l1": { + "message": "Relever les nouveaux e-mails tous les (en secondes) :", + "description": "" + }, + "options_toolbar_4": { + "message": "Mode du panneau de la barre d'outils", + "description": "" + }, + "toolbar_label": { + "message": "Notifieur Gmail™", + "description": "" + }, + "popup_msg_1": { + "message": "à l'instant", + "description": "" + }, + "popup_open_settings": { + "message": "Ouvrir les paramètres", + "description": "" + }, + "options_misc_3": { + "message": "La légende de la barre d'outils est", + "description": "" + }, + "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_toolbar_12": { + "message": "! : Signaler comme spam, # : Mettre à la corbeille, e : Archiver, Shift + i : Marquer comme lu.", + "description": "" + }, + "options_px": { + "message": "pixel(s)", + "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", + "description": "" + }, + "and": { + "message": "et", + "description": "" + }, + "options_tab_7": { + "message": "Toujours utiliser des onglets vierges au lieu d'ouvrir un nouvel onglet quand ouvrir dans un onglet est activé.", + "description": "" + }, + "options_toolbar_3": { + "message": "Ouvrir un compte Gmail™ si un seul compte est connecté", + "description": "" + }, + "options_gmail_7": { + "message": "6ème compte (/mail/u/5/)", + "description": "" + }, + "popup_msg_8_format": { + "message": "%d semaines plus tôt", + "description": "" + }, + "options_toolbar": { + "message": "Barre d'outils :", + "description": "" + }, + "options_notifications_6": { + "message": "Tronquer les notifications plus longues que", + "description": "" + }, + "popup_wait": { + "message": "Patientez...", + "description": "" + }, + "tooltip_2": { + "message": "Clic milieu (ou Ctrl+clic gauche) : rafraîchir tous les comptes", + "description": "" + }, + "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_tab_3": { + "message": "Ouvrir un nouveau compte Gmail™ à côté de l'onglet actif", + "description": "" + }, + "options_gmail_8": { + "message": "Marquer le message comme lu en l'archivant", + "description": "" + }, + "options_toolbar_17": { + "message": "Ouvrir le premier compte Gmail™", + "description": "" + }, + "options_notifications_7": { + "message": "caractères pour les champs [objet] et [résumé].", + "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) :", + "description": "" + }, + "options_tab_8": { + "message": "Ignorer les onglets Gmail™ ouverts", + "description": "" + }, + "popup_no_subject": { + "message": "(aucun objet)", + "description": "" + }, + "msg_5": { + "message": "Choisir un fichier son", + "description": "" + }, + "popup_msg_2": { + "message": "1 minute plus tôt", + "description": "" + }, + "popup_msg_16": { + "message": "Juillet", + "description": "" + }, + "label_8": { + "message": "Pour 2 heures", + "description": "" + }, + "msg_4": { + "message": "Remarque : pour que le notifieur fonctionne correctement, vous devez être connecté à votre compte Google.", + "description": "" + }, + "popup_msg_20": { + "message": "Novembre", + "description": "" + }, + "options_toolbar_6": { + "message": "Afficher la totalité du contenu", + "description": "" + }, + "options_gmail_11": { + "message": "Flux personnalisés :", + "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": "" + }, + "label_11": { + "message": "Rédiger un e-mail", + "description": "" + }, + "options_toolbar_7": { + "message": "La largeur du panneau de la barre d'outils dans le mode \"contenu total\" est (en pixels) :", + "description": "" + }, + "options_notifications_31": { + "message": "Son de notification personnalisé", + "description": "" + }, + "options_timings_l5": { + "message": "La période minimum est de 5 minutes.", + "description": "" + }, + "options_misc": { + "message": "Divers :", + "description": "" + }, + "options_gmail_2": { + "message": "Séparer les libellés par \",\" (virgule).", + "description": "" + }, + "options_misc_4": { + "message": "Couleur gris pour \"Tous lus\" et couleur bleu pour \"Déconnecté\"", + "description": "" + }, + "options_toolbar_13": { + "message": "Rendre les e-mails en HTML dans le mode \"contenu total\"", + "description": "" + }, + "options_toolbar_16": { + "message": "Rafraîchir tous les comptes", + "description": "" + }, + "options_gmail_6": { + "message": "5ème compte (/mail/u/4/)", + "description": "" + }, + "popup_msg_14": { + "message": "Mai", + "description": "" + }, + "options_inshort": { + "message": "Notifieur multi-comptes et multi-libellés pour Google Mail (Gmail™).", + "description": "" + }, + "options_misc_12": { + "message": "Ne pas inclure de détails d'identifiant dans la bulle textuelle", + "description": "" + }, + "options_tab_4": { + "message": "Ouvrir un compte Gmail™ dans l'onglet actif", + "description": "" + }, + "popup_msg_3_format": { + "message": "%d minutes plus tôt", + "description": "" + }, + "label_12": { + "message": "Ouvrir la FAQ", + "description": "" + }, + "description": { + "message": "Notifieur multi-comptes et multi-libellés pour Google Mail (Gmail™)", + "description": "" + }, + "popup_spam": { + "message": "Spam", + "description": "" + } +} diff --git a/v1/src/_locales/hu/messages.json b/v1/src/_locales/hu/messages.json new file mode 100644 index 00000000..ce456f54 --- /dev/null +++ b/v1/src/_locales/hu/messages.json @@ -0,0 +1,690 @@ +{ + "label_9": { + "message": "5 órára", + "description": "" + }, + "options_notifications_19": { + "message": "Windows e-mail értesítés", + "description": "" + }, + "options_notifications_17": { + "message": "Checker Plus bell értesítés", + "description": "" + }, + "options_notifications_13": { + "message": "A tálcaértesítés ikonjára kattintás nyissa meg az eszközpanelt (Csak Windows, béta)", + "description": "" + }, + "options_notifications_30": { + "message": "Az összes egyidejű asztali értesítés összevonása egy értesítéssé", + "description": "" + }, + "settings_open_label": { + "message": "Beállítások megnyitása", + "description": "" + }, + "options_timings_l7": { + "message": "Ne keressen új leveleket induláskor ennyi másodpercig:", + "description": "" + }, + "label_4": { + "message": "5 percre", + "description": "" + }, + "options_timings_l3": { + "message": "Emlékeztessen az összes olvasatlan levélre (percenként):", + "description": "" + }, + "popup_msg_4": { + "message": "1 óra múlva", + "description": "" + }, + "options_gmail_1": { + "message": "Elsődleges fiók(/mail/u/0/)", + "description": "" + }, + "options_gmail_10": { + "message": "A következő címkék és fiókok esetén legyen értesítés:", + "description": "" + }, + "options_notifications_1": { + "message": "Asztali értesítések megjelenítése új levelek érkezésekor", + "description": "" + }, + "options_notifications_9": { + "message": "Hangjelzés lejátszása új levelek érkezésekor", + "description": "" + }, + "label_6": { + "message": "30 percre", + "description": "" + }, + "options_misc_8": { + "message": "Összes beállítás visszaállítása alapértelmezettre", + "description": "" + }, + "options_notifications_28": { + "message": "Összes értesítés tiltása egyéni időhosszra (percben):", + "description": "" + }, + "options_timings_l4": { + "message": "Állítsa az értéket 0-ra nem ismétlődő értesítésekhez.", + "description": "" + }, + "options_notifications_32": { + "message": "név vagy levél tartalmazza", + "description": "" + }, + "options_tab_6": { + "message": "Gmail-fiók megnyitása új ablakban", + "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.", + "description": "" + }, + "options_toolbar_15": { + "message": "Az eszköztár gombjára a középső egérgombbal kattintás", + "description": "" + }, + "options_toolbar_10": { + "message": "A legkisebb magasság is 500px.", + "description": "" + }, + "popup_msg_10": { + "message": "Január", + "description": "" + }, + "options_notifications_26": { + "message": "Mindig látszódjon a tálcaértesítő (Csak Windows)", + "description": "" + }, + "label_3": { + "message": "Összes értesítés tiltása", + "description": "" + }, + "label_13": { + "message": "Egyéni időhosszra", + "description": "" + }, + "options_empty": { + "message": "nincs megadva", + "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_timings": { + "message": "Időzítés:", + "description": "" + }, + "options_gmail_5": { + "message": "Negyedik fiók (/mail/u/3/)", + "description": "" + }, + "label_5": { + "message": "15 percre", + "description": "" + }, + "options_misc_9": { + "message": "Piros szín a \"Nincs olvasatlan\" és szürke szín a \"Szétkapcsolva\"", + "description": "" + }, + "popup_msg_5": { + "message": "órával ezelőtt", + "description": "" + }, + "options_notifications_27": { + "message": "A tálcaértesítő akkor is látszódjon, amikor nincs olvasatlan üzenet. ", + "description": "" + }, + "options_misc_1": { + "message": "Fiókok betűrendbe rendezése", + "description": "" + }, + "tooltip_1": { + "message": "Jobb egér: Gmail vagy előnézeti panel megnyitása", + "description": "" + }, + "notification": { + "message": "Feladó: [author_email][break]Tárgy: [title][break]Összegzés: [summary]", + "description": "" + }, + "popup_trash": { + "message": "Kuka", + "description": "" + }, + "options_tab": { + "message": "Lap megnyitása:", + "description": "" + }, + "log_into_your_account": { + "message": "Jelentkezzen be fiókjába", + "description": "" + }, + "label_10": { + "message": "Értesítések engedélyezése", + "description": "" + }, + "options_notifications_23": { + "message": "A hangértesítés hangereje", + "description": "" + }, + "options_timings_l2": { + "message": "A legkisebb időköz 10 másodperc.", + "description": "" + }, + "options_toolbar_11": { + "message": "Gyorsbillentyű támogatása az eszköztár gombján", + "description": "" + }, + "options_gmail_9": { + "message": "Néhány népszerű címke: \"beérkező\", \"fontos\", \"^smartlabel_personal\", \"^smartlabel_newsletter\", \"^smartlabel_notification\", and \"^smartlabel_group\"", + "description": "" + }, + "popup_msg_17": { + "message": "Augusztus", + "description": "" + }, + "popup_msg_15": { + "message": "Június", + "description": "" + }, + "options_notifications_34": { + "message": "levélösszegző tartalmazza", + "description": "" + }, + "label_14": { + "message": "Bejelentkezett fiókok", + "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.", + "description": "" + }, + "options_misc_6": { + "message": "Asztali figyelmeztetés megjelenítése, hogy Gmail már az aktív fülön nyitva van ", + "description": "" + }, + "popup_read": { + "message": "Megj. olvasottként", + "description": "" + }, + "options_notifications_4": { + "message": "Értesítés formátuma", + "description": "" + }, + "settings_open_title": { + "message": "Beállítások oldal megnyitása", + "description": "" + }, + "label_2": { + "message": "Beállítások", + "description": "" + }, + "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_notifications_18": { + "message": "Checker Plus ding értesítés", + "description": "" + }, + "options_tab_5": { + "message": "Gmail-fiók megnyitása egy háttér lapon", + "description": "" + }, + "label_7": { + "message": "1 órára", + "description": "" + }, + "popup_archive": { + "message": "Archív", + "description": "" + }, + "msg_2": { + "message": "A link a vágólapra került.", + "description": "" + }, + "options_title": { + "message": "Beállítások - Gmail™ Értesítő", + "description": "" + }, + "popup_msg_13": { + "message": "Április", + "description": "" + }, + "popup_msg_9_format": { + "message": "%d hónappal ezelőtt", + "description": "" + }, + "popup_msg_11": { + "message": "Február", + "description": "" + }, + "popup_open_inbox": { + "message": "Beérkező levelek megnyitása", + "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. ", + "description": "" + }, + "gmail": { + "message": "Gmail™ értesítő", + "description": "" + }, + "popup_msg_6": { + "message": "Tegnap", + "description": "" + }, + "options_toolbar_8": { + "message": "A legkisebb szélesség 500px.", + "description": "" + }, + "options_notifications_16": { + "message": "Gmail értesítő alapértelmezett jelzése", + "description": "" + }, + "options_misc_14": { + "message": "Ne pontos szám jelenjen meg, amikor az olvasatlan levelek száma nagyobb, mint 999. ", + "description": "" + }, + "popup_msg_18": { + "message": "Szeptember", + "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].", + "description": "" + }, + "options_gmail_3": { + "message": "Másodlagos fiók (/mail/u/1/)", + "description": "" + }, + "options_notifications_11": { + "message": "\"Windows tálcaértesítés\" vagy \"Mac OS Dock értesítés\" megjelenítése", + "description": "" + }, + "options_notifications_2": { + "message": "Asztali értesítés megjelenítése ennyi másodpercig:", + "description": "" + }, + "log_in_to_your_account": { + "message": "Jelentkezzen be Gmail-fiókjába", + "description": "" + }, + "popup_of": { + "message": "/", + "description": "" + }, + "options_notifications_15": { + "message": "Alapértelmezett hangértesítés bekapcsolva", + "description": "" + }, + "options_notifications_21": { + "message": "A felhasználó által megadott hang", + "description": "" + }, + "options_toolbar_9": { + "message": "Teljes tartalom megjelenítésekor az eszköztár panel magassága pixelben:", + "description": "" + }, + "options_toolbar_1": { + "message": "Eszköztárgomb viselkedése", + "description": "" + }, + "unknown": { + "message": "ismeretlen", + "description": "" + }, + "popup_msg_21": { + "message": "December", + "description": "" + }, + "popup_read_all": { + "message": "Összes megjelölése olvasottként", + "description": "" + }, + "options_notifications_8": { + "message": "Hogy ne lehessen szólevágás, nagy számot adjon meg.", + "description": "" + }, + "options_donation": { + "message": "Támogasd munkánkat", + "description": "" + }, + "msg_3": { + "message": "A kijelölt szöveg a vágólapra került.", + "description": "" + }, + "options_misc_7": { + "message": "Üdvözlő oldal megjelenítése frissítéskor", + "description": "" + }, + "options_gmail": { + "message": "Gmail:", + "description": "" + }, + "label_1": { + "message": "Frissítés", + "description": "" + }, + "options_notifications_5": { + "message": "Használható változók:", + "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).", + "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.", + "description": "" + }, + "options_misc_2": { + "message": "Az alapértelmezett rendezés a bejelentkezés sorrendje.", + "description": "" + }, + "options_toolbar_2": { + "message": "Mindig nyissa meg a levél előnézetpanelét", + "description": "" + }, + "popup_settings": { + "message": "beállítások", + "description": "" + }, + "options_gmail_4": { + "message": "Harmadik fiók (/mail/u/2/)", + "description": "" + }, + "options_toolbar_5": { + "message": "Csak az összegzés megjelenítése", + "description": "" + }, + "options_notifications_12": { + "message": "Tálcaértesítések nem támogatottak jelenleg Linux alatt.", + "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. ", + "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.", + "description": "" + }, + "popup_refresh": { + "message": "Frissítés", + "description": "" + }, + "options_misc_5": { + "message": "Kék szín a \"Nincs olvasatlan\" és szürke szín a \"Szétkapcsolva\"", + "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].", + "description": "" + }, + "popup_msg_19": { + "message": "Október", + "description": "" + }, + "options_notifications_33": { + "message": "levél címe tartalmazza", + "description": "" + }, + "tooltip_3": { + "message": "Jobb egér: fiókválasztás", + "description": "" + }, + "popup_date_format": { + "message": "%yy. %mm %dd.", + "description": "" + }, + "options_notifications": { + "message": "Értesítések:", + "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.", + "description": "" + }, + "popup_msg_12": { + "message": "Március", + "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..", + "description": "" + }, + "options_tab_1": { + "message": "Gmail-fiók keresése csak az aktív böngészőablakban", + "description": "" + }, + "popup_msg_7_format": { + "message": "%d nappal ezelőtt", + "description": "" + }, + "options_timings_l1": { + "message": "Új levelek ellenőrzése ennyi másodpercenként:", + "description": "" + }, + "options_toolbar_4": { + "message": "Eszköztár panel mód", + "description": "" + }, + "toolbar_label": { + "message": "Gmail™ értesítő", + "description": "" + }, + "popup_msg_1": { + "message": "éppen most", + "description": "" + }, + "popup_open_settings": { + "message": "Beállítások megnyitása", + "description": "" + }, + "options_misc_3": { + "message": "Eszköztár panel színmintája", + "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", + "description": "" + }, + "options_toolbar_12": { + "message": "!: Spam bejelentése, #: Kuka, e: Archiválás, Shift + i: Megjelölés olvasottként.", + "description": "" + }, + "options_px": { + "message": "px", + "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", + "description": "" + }, + "and": { + "message": "és", + "description": "" + }, + "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_3": { + "message": "Gmail-fiók megnyitása csak akkor, ha már egy fiókba bejelentkezett.", + "description": "" + }, + "options_gmail_7": { + "message": "Hatodik fiók (/mail/u/5/)", + "description": "" + }, + "popup_msg_8_format": { + "message": "%d héttel ezelőtt", + "description": "" + }, + "options_toolbar": { + "message": "Eszköztár:", + "description": "" + }, + "options_notifications_6": { + "message": "Értesítés levágása, ha hosszabb mint", + "description": "" + }, + "popup_wait": { + "message": "Várj...", + "description": "" + }, + "tooltip_2": { + "message": "Középső (vagy Ctrl+Bal) egér: Összes fiók frissítése", + "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.", + "description": "" + }, + "options_tab_3": { + "message": "Gmail-fiók megnyitása az aktív lap mellett", + "description": "" + }, + "options_gmail_8": { + "message": "Archiváláskor olvasottnak megjelölés", + "description": "" + }, + "options_toolbar_17": { + "message": "Elsődleges Gmail-fiók megnyitása", + "description": "" + }, + "options_notifications_7": { + "message": "karakternél a [cím] és az [összegzés] mező.", + "description": "" + }, + "options_misc_10": { + "message": "Csak asztali- és hangértesítés jelezzen amikor levél érkezett kevesebb, mint ennyi percen belül:", + "description": "" + }, + "options_tab_8": { + "message": "Már nyitva lévő Gmail lapok figyelmen kívül hagyása", + "description": "" + }, + "popup_no_subject": { + "message": "(nincs tárgy)", + "description": "" + }, + "msg_5": { + "message": "Válassz egy hangfájlt", + "description": "" + }, + "popup_msg_2": { + "message": "1 perccel ezelőtt", + "description": "" + }, + "popup_msg_16": { + "message": "Július", + "description": "" + }, + "label_8": { + "message": "2 órára", + "description": "" + }, + "msg_4": { + "message": "Megjegyzés: Az értesítő működéséhez szükséges, hogy Google-fiókjába bejelentkezzen.", + "description": "" + }, + "popup_msg_20": { + "message": "November", + "description": "" + }, + "options_toolbar_6": { + "message": "Teljes tartalom megjelenítése", + "description": "" + }, + "options_gmail_11": { + "message": "Egyéni hírforrások:", + "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.", + "description": "" + }, + "label_11": { + "message": "Levél írása", + "description": "" + }, + "options_toolbar_7": { + "message": "Teljes tartalom megjelenítésekor az eszköztár panel szélessége pixelben:", + "description": "" + }, + "options_notifications_31": { + "message": "Egyéni hangértesítés", + "description": "" + }, + "options_timings_l5": { + "message": "A legrövidebb időköz 5 perc.", + "description": "" + }, + "options_misc": { + "message": "Egyebek:", + "description": "" + }, + "options_gmail_2": { + "message": "A címkéket vesszővel (\",\"-vel) válassza el.", + "description": "" + }, + "options_misc_4": { + "message": "Szürke szín a \"Nincs olvasatlan\" és kék szín a \"Szétkapcsolva\"", + "description": "" + }, + "options_toolbar_13": { + "message": "Levél megjelenítése HTML-ként teljes tartalom módban", + "description": "" + }, + "options_toolbar_16": { + "message": "Összes fiók frissítése", + "description": "" + }, + "options_gmail_6": { + "message": "Ötödik fiók (/mail/u/4/)", + "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ő.", + "description": "" + }, + "options_misc_12": { + "message": "A buboréksúgó szövegébe ne helyezz bejelentkezési adatokat", + "description": "" + }, + "options_tab_4": { + "message": "Gmail-fiók megnyitása az aktív lapon", + "description": "" + }, + "popup_msg_3_format": { + "message": "%d perccel ezelőtt", + "description": "" + }, + "label_12": { + "message": "GyÍK megnyitása", + "description": "" + }, + "description": { + "message": "Egy vagy több Google Mail (Gmail) fiókhoz, illetve címkéhez értesítő", + "description": "" + }, + "popup_spam": { + "message": "Spam", + "description": "" + } +} \ No newline at end of file diff --git a/v1/src/_locales/nl/messages.json b/v1/src/_locales/nl/messages.json new file mode 100644 index 00000000..3bcae35e --- /dev/null +++ b/v1/src/_locales/nl/messages.json @@ -0,0 +1,690 @@ +{ + "label_9": { + "message": "Voor 5 uur", + "description": "" + }, + "options_notifications_19": { + "message": "Windows-e-mailgeluid", + "description": "" + }, + "options_notifications_17": { + "message": "Checker Plus-belgeluid", + "description": "" + }, + "options_notifications_13": { + "message": "Werkbalkpaneel openen bij klikken op taakbalkmeldingspictogram (alleen op Windows - beta)", + "description": "" + }, + "options_notifications_30": { + "message": "Alle bureaubladmeldingen samenvoegen in één melding", + "description": "" + }, + "settings_open_label": { + "message": "Opties openen", + "description": "" + }, + "options_timings_l7": { + "message": "Niet controleren op nieuwe e-mails bij opstarten voor de duur van (in seconden):", + "description": "" + }, + "label_4": { + "message": "Voor 5 minuten", + "description": "" + }, + "options_timings_l3": { + "message": "Herinnering voor alle ongelezen e-mails, elke (in minuten):", + "description": "" + }, + "popup_msg_4": { + "message": "1 uur geleden", + "description": "" + }, + "options_gmail_1": { + "message": "Hoofdaccount (/mail/u/0/)", + "description": "" + }, + "options_gmail_10": { + "message": "Meldingen ontvangen voor de volgende labels en accounts:", + "description": "" + }, + "options_notifications_1": { + "message": "Bureaubladmelding weergeven bij nieuwe e-mails", + "description": "" + }, + "options_notifications_9": { + "message": "Meldingsgeluid afspelen bij nieuwe e-mails", + "description": "" + }, + "label_6": { + "message": "Voor 30 minuten", + "description": "" + }, + "options_misc_8": { + "message": "Alle instellingen naar standaardwaarden herstellen", + "description": "" + }, + "options_notifications_28": { + "message": "Schakelt alle meldingen uit voor een aangepaste tijdsperiode (in minuten):", + "description": "" + }, + "options_timings_l4": { + "message": "Stel de waarde op nul in voor niet-periodieke herinneringen.", + "description": "" + }, + "options_notifications_32": { + "message": "naam of e-mail bevat", + "description": "" + }, + "options_tab_6": { + "message": "Gmail-account openen in een nieuw venster", + "description": "" + }, + "options_notifications_25": { + "message": "Waarschijnlijk werken de standaardmeldingsgeluiden niet goed in Safari. Als dit het geval is moet u een eigen geluidsbestand instellen.", + "description": "" + }, + "options_toolbar_15": { + "message": "Middelklikken op de werkbalkknop om", + "description": "" + }, + "options_toolbar_10": { + "message": "Minimale hoogte is 500px.", + "description": "" + }, + "popup_msg_10": { + "message": "januari", + "description": "" + }, + "options_notifications_26": { + "message": "Systeemvakmelding altijd weergeven (wordt alleen ondersteund op Windows)", + "description": "" + }, + "label_3": { + "message": "Alle meldingen uitschakelen", + "description": "" + }, + "label_13": { + "message": "Voor een aangepaste tijdsperiode", + "description": "" + }, + "options_empty": { + "message": "niet opgegeven", + "description": "" + }, + "options_notifications_3": { + "message": "Deze instellingen werkt mogelijk niet, afhankelijk van het door u gebruikte besturingssysteem.", + "description": "" + }, + "options_timings": { + "message": "Tijdstippen", + "description": "" + }, + "options_gmail_5": { + "message": "Vierde account (/mail/u/3)", + "description": "" + }, + "label_5": { + "message": "Voor 15 minuten", + "description": "" + }, + "options_misc_9": { + "message": "Rode kleur voor \"Geen ongelezen berichten\" en grijze kleur voor \"Niet verbonden\"", + "description": "" + }, + "popup_msg_5": { + "message": "uren geleden", + "description": "" + }, + "options_notifications_27": { + "message": "Er zal een systeemvakmelding worden weergegeven zelfs als er geen ongelezen bericht is.", + "description": "" + }, + "options_misc_1": { + "message": "Accounts alfabetisch sorteren", + "description": "" + }, + "tooltip_1": { + "message": "Linksklik: Gmail of het e-mailvoorbeeldpaneel openen", + "description": "" + }, + "notification": { + "message": "Van: [author_email][break]Titel: [title][break]Samenvatting: [summary]", + "description": "" + }, + "popup_trash": { + "message": "Prullenbak", + "description": "" + }, + "options_tab": { + "message": "Tabblad openen:", + "description": "" + }, + "log_into_your_account": { + "message": "Log alstublieft in op uw account", + "description": "" + }, + "label_10": { + "message": "Meldingen inschakelen", + "description": "" + }, + "options_notifications_23": { + "message": "Volume van het meldingsgeluid is", + "description": "" + }, + "options_timings_l2": { + "message": "Minimale tijdsduur is 10 seconden.", + "description": "" + }, + "options_toolbar_11": { + "message": "Toetsenbordsneltoetsen ondersteunen op het werkbalkpaneel", + "description": "" + }, + "options_gmail_9": { + "message": "Enkele populaire labels: \"postvakIN\", \"belangrijk\", \"^slimlabel_persoonlijk\", \"^slimlabel_nieuwsbrief\", \"^slimlabel_melding\" en \"^slimlabel_groep\"", + "description": "" + }, + "popup_msg_17": { + "message": "augustus", + "description": "" + }, + "popup_msg_15": { + "message": "juni", + "description": "" + }, + "options_notifications_34": { + "message": "e-mail-samenvatting bevat", + "description": "" + }, + "label_14": { + "message": "Ingelogde accounts", + "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.", + "description": "" + }, + "options_misc_6": { + "message": "Bureaubladmeldingen weergeven als waarschuwing wanneer Gmail al geopend is op het actieve tabblad", + "description": "" + }, + "popup_read": { + "message": "Als gelezen markeren", + "description": "" + }, + "options_notifications_4": { + "message": "Meldingopmaak", + "description": "" + }, + "settings_open_title": { + "message": "Open de opties-pagina (instellingen)", + "description": "" + }, + "label_2": { + "message": "Instellingen", + "description": "" + }, + "options_toolbar_14": { + "message": "Schakel deze optie uit als u platte tekst-opmaak prefereert in volledige-inhoudsmodus.", + "description": "" + }, + "options_notifications_18": { + "message": "Checker Plus-dinggeluid", + "description": "" + }, + "options_tab_5": { + "message": "Gmail-account openen op een achtergrondtabblad", + "description": "" + }, + "label_7": { + "message": "Voor 1 uur", + "description": "" + }, + "popup_archive": { + "message": "Archief", + "description": "" + }, + "msg_2": { + "message": "Link is gekopieerd naar het klembord.", + "description": "" + }, + "options_title": { + "message": "Voorkeuren - Gmail™-melder", + "description": "" + }, + "popup_msg_13": { + "message": "april", + "description": "" + }, + "popup_msg_9_format": { + "message": "%d maand(en) geleden", + "description": "" + }, + "popup_msg_11": { + "message": "februari", + "description": "" + }, + "popup_open_inbox": { + "message": "Postvak IN openen", + "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.", + "description": "" + }, + "gmail": { + "message": "Gmail™-melder", + "description": "" + }, + "popup_msg_6": { + "message": "Gisteren", + "description": "" + }, + "options_toolbar_8": { + "message": "Minimale breedte is 500px.", + "description": "" + }, + "options_notifications_16": { + "message": "Standaardwaarschuwing van Gmail-melder", + "description": "" + }, + "options_misc_14": { + "message": "Geen exact badgenummer weergeven wanneer het aantal ongelezen e-mails hoger is dan 999", + "description": "" + }, + "popup_msg_18": { + "message": "september", + "description": "" + }, + "options_notifications_14": { + "message": "Deze optie is zeer experimenteel en kan mogelijk instabiliteit veroorzaken in Firefox. [Herstart vereist].", + "description": "" + }, + "options_gmail_3": { + "message": "Tweede account (/mail/u/1)", + "description": "" + }, + "options_notifications_11": { + "message": "\"Windows-taakbalkmelding\" of \"Mac OS X-dockmelding\" weergeven", + "description": "" + }, + "options_notifications_2": { + "message": "Bureaubladmelding weergeven voor de duur van (in seconden):", + "description": "" + }, + "log_in_to_your_account": { + "message": "Log alstublieft in op uw Gmail-account", + "description": "" + }, + "popup_of": { + "message": "van", + "description": "" + }, + "options_notifications_15": { + "message": "Standaard meldingsgeluid is", + "description": "" + }, + "options_notifications_21": { + "message": "Eigen gekozen meldingsgeluid is", + "description": "" + }, + "options_toolbar_9": { + "message": "Werkbalkpaneel-hoogte in de volledige-inhoudsweergave is (in pixels):", + "description": "" + }, + "options_toolbar_1": { + "message": "Gedrag van werkbalkknop", + "description": "" + }, + "unknown": { + "message": "onbekend", + "description": "" + }, + "popup_msg_21": { + "message": "december", + "description": "" + }, + "popup_read_all": { + "message": "Alles als gelezen markeren", + "description": "" + }, + "options_notifications_8": { + "message": "Om te afbreking te voorkomen, vul hier een groot getal in.", + "description": "" + }, + "options_donation": { + "message": "Doe een donatie", + "description": "" + }, + "msg_3": { + "message": "Geselecteerde tekst is gekopieerd naar het klembord.", + "description": "" + }, + "options_misc_7": { + "message": "Welkomstpagina weergeven na update", + "description": "" + }, + "options_gmail": { + "message": "Gmail:", + "description": "" + }, + "label_1": { + "message": "Verversen", + "description": "" + }, + "options_notifications_5": { + "message": "Beschikbare variabelen", + "description": "" + }, + "options_notifications_24": { + "message": "Volumeniveau is een getal tussen de 0 en 100 waar 100 het hoogste volumeniveau is (standaard).", + "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.", + "description": "" + }, + "options_misc_2": { + "message": "De standaardsortering is sorteren op datum ingelogd.", + "description": "" + }, + "options_toolbar_2": { + "message": "Altijd e-mail-voorbeeldpaneel openen", + "description": "" + }, + "popup_settings": { + "message": "Instellingen", + "description": "" + }, + "options_gmail_4": { + "message": "Derde account (/mail/u/2)", + "description": "" + }, + "options_toolbar_5": { + "message": "Samenvatting weergeven", + "description": "" + }, + "options_notifications_12": { + "message": "Taakbalkmeldingen worden momenteel niet ondersteund op Linux-besturingssystemen.", + "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", + "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.", + "description": "" + }, + "popup_refresh": { + "message": "Verversen", + "description": "" + }, + "options_misc_5": { + "message": "Blauwe kleur voor \"Geen ongelezen berichten en grijze kleur voor \"Niet verbonden\"", + "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": "" + }, + "popup_msg_19": { + "message": "oktober", + "description": "" + }, + "options_notifications_33": { + "message": "e-mail-titel bevat", + "description": "" + }, + "tooltip_3": { + "message": "Rechtsklik: Accountselectie", + "description": "" + }, + "popup_date_format": { + "message": "%mm %dd, %yy", + "description": "" + }, + "options_notifications": { + "message": "Meldingen:", + "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.", + "description": "" + }, + "popup_msg_12": { + "message": "maart", + "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.", + "description": "" + }, + "options_tab_1": { + "message": "Alleen op het actieve venster zoeken naar een openstaand Gmail-account", + "description": "" + }, + "popup_msg_7_format": { + "message": "%d dagen geleden", + "description": "" + }, + "options_timings_l1": { + "message": "Op nieuwe e-mails controleren, elke (in seconden):", + "description": "" + }, + "options_toolbar_4": { + "message": "Werkbalkpaneel-modus", + "description": "" + }, + "toolbar_label": { + "message": "Gmail™-melder", + "description": "" + }, + "popup_msg_1": { + "message": "zojuist", + "description": "" + }, + "popup_open_settings": { + "message": "Instellingen openen", + "description": "" + }, + "options_misc_3": { + "message": "Kleurenpatroon van werkbalk is", + "description": "" + }, + "options_gmail_12": { + "message": "Scheidt feeds met het kommateken (\",\"). Voorbeeldfeed: https://mail.google.com/mail/u/0/feed/atom/inbox", + "description": "" + }, + "options_toolbar_12": { + "message": "!: Rapporteren als spam, #:Verplaatsen naar prullenbak, e:Archiveren, Shift + i: Markeren als ongelezen.", + "description": "" + }, + "options_px": { + "message": "px", + "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.", + "description": "" + }, + "options_notifications_20": { + "message": "Eigen gekozen geluid", + "description": "" + }, + "and": { + "message": "en", + "description": "" + }, + "options_tab_7": { + "message": "Altijd lege tabbladen gebruiken in plaats een nieuw tabblad te openen wanneer een tabblad is geactiveerd", + "description": "" + }, + "options_toolbar_3": { + "message": "Gmail-account openen wanneer er slechts één account is ingelogd", + "description": "" + }, + "options_gmail_7": { + "message": "Zesde account (/mail/u/5)", + "description": "" + }, + "popup_msg_8_format": { + "message": "%d we(e)k(en) geleden", + "description": "" + }, + "options_toolbar": { + "message": "Werkbalk:", + "description": "" + }, + "options_notifications_6": { + "message": "Meldingen afbreken die langer zijn dan", + "description": "" + }, + "popup_wait": { + "message": "Wachten...", + "description": "" + }, + "tooltip_2": { + "message": "Middelklik (of Ctrl+Links): Alle accounts verversen", + "description": "" + }, + "options_notifications_29": { + "message": "Deze optie is gerelateerd aan het rechtermuisknopmenu op de werkbalkknop -> Alle meldingen uitschakelen -> Aangepaste tijdsperiode.", + "description": "" + }, + "options_tab_3": { + "message": "Nieuw Gmail-account openen op tabblad naast actief tabblad", + "description": "" + }, + "options_gmail_8": { + "message": "Bericht als gelezen markeren na archiveren", + "description": "" + }, + "options_toolbar_17": { + "message": "Primair Gmail-account openen", + "description": "" + }, + "options_notifications_7": { + "message": "tekens voor [title] en [summary]-velden", + "description": "" + }, + "options_misc_10": { + "message": "Alleen bureaublad- en geluidsmeldingen weergeven wanneer een e-mail binnen is ontvangen in minder dan (in minuten):", + "description": "" + }, + "options_tab_8": { + "message": "Geopende Gmail-tabbladen negeren", + "description": "" + }, + "popup_no_subject": { + "message": "(geen onderwerp)", + "description": "" + }, + "msg_5": { + "message": "Selecteer een audiobestand", + "description": "" + }, + "popup_msg_2": { + "message": "1 minuut geleden", + "description": "" + }, + "popup_msg_16": { + "message": "juli", + "description": "" + }, + "label_8": { + "message": "Voor 2 uur", + "description": "" + }, + "msg_4": { + "message": "Let op: om de melder correct te laten werken moet u ingelogd zijn op uw Google-account.", + "description": "" + }, + "popup_msg_20": { + "message": "november", + "description": "" + }, + "options_toolbar_6": { + "message": "Volledige inhoud weergeven", + "description": "" + }, + "options_gmail_11": { + "message": "Aangepaste feeds:", + "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.", + "description": "" + }, + "label_11": { + "message": "Een e-mail opstellen", + "description": "" + }, + "options_toolbar_7": { + "message": "Breedte van werkbalkpaneel in volledige-inhoudsweergave is (in pixels):", + "description": "" + }, + "options_notifications_31": { + "message": "Aangepaste geluidsmelding", + "description": "" + }, + "options_timings_l5": { + "message": "Minimale tijdsduur is 5 minuten.", + "description": "" + }, + "options_misc": { + "message": "Diversen:", + "description": "" + }, + "options_gmail_2": { + "message": "Labels scheiden d.m.v. \",\" (komma).", + "description": "" + }, + "options_misc_4": { + "message": "Grijze kleur voor \"Geen ongelezen berichten\" en blauwe kleur voor \"Niet verbonden\"", + "description": "" + }, + "options_toolbar_13": { + "message": "E-mails opmaken in HTML in volledige-inhoudsmodus", + "description": "" + }, + "options_toolbar_16": { + "message": "Alle accounts verversen", + "description": "" + }, + "options_gmail_6": { + "message": "Vijfde account (/mail/u/4)", + "description": "" + }, + "popup_msg_14": { + "message": "mei", + "description": "" + }, + "options_inshort": { + "message": "Labels- en accountsmelder voor Google Mail (Gmail)", + "description": "" + }, + "options_misc_12": { + "message": "Geen inloggegevens in de tooltiptekst weergeven", + "description": "" + }, + "options_tab_4": { + "message": "Gmail-account openen op actief tabblad", + "description": "" + }, + "popup_msg_3_format": { + "message": "%d minuten geleden", + "description": "" + }, + "label_12": { + "message": "Veel gestelde vragen (FAQ) openen", + "description": "" + }, + "description": { + "message": "Labels- en accountsmelder voor Google Mail (Gmail)", + "description": "" + }, + "popup_spam": { + "message": "Spam", + "description": "" + } +} \ No newline at end of file diff --git a/v1/src/_locales/pl/messages.json b/v1/src/_locales/pl/messages.json new file mode 100644 index 00000000..8395b883 --- /dev/null +++ b/v1/src/_locales/pl/messages.json @@ -0,0 +1,690 @@ +{ + "label_9": { + "message": "Przez 5 godzin", + "description": "" + }, + "options_notifications_19": { + "message": "Sygnał e-mail Windows", + "description": "" + }, + "options_notifications_17": { + "message": "Dzwonek Checker Plus", + "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_30": { + "message": "Połącz wszystkie jednoczesne powiadomienia na pulpicie w pojedyncze", + "description": "" + }, + "settings_open_label": { + "message": "Otwórz opcje", + "description": "" + }, + "options_timings_l7": { + "message": "Sprawdzaj nowe wiadomości przy starcie po (sekundy):", + "description": "" + }, + "label_4": { + "message": "Przez 5 minut", + "description": "" + }, + "options_timings_l3": { + "message": "Przypominaj o nieprzeczytanych wiadomościach co (minuty):", + "description": "" + }, + "popup_msg_4": { + "message": "godzinę temu", + "description": "" + }, + "options_gmail_1": { + "message": "Konto główne (/mail/u/0/)", + "description": "" + }, + "options_gmail_10": { + "message": "Otrzymuj powiadomienia dla następujących etykiet oraz kont:", + "description": "" + }, + "options_notifications_1": { + "message": "Wyświetlaj na pulpicie powiadomienia o nowych wiadomościach", + "description": "" + }, + "options_notifications_9": { + "message": "Odtwórz dźwięk po otrzymaniu nowych wiadomości", + "description": "" + }, + "label_6": { + "message": "Przez 30 minut", + "description": "" + }, + "options_misc_8": { + "message": "Przywróć wszystkie ustawienia do fabrycznych", + "description": "" + }, + "options_notifications_28": { + "message": "Wyłącz wszystkie powiadomienia na własny odstęp czasowy (minuty):", + "description": "" + }, + "options_timings_l4": { + "message": "Ustaw wartość na zero, aby nie otrzymywać przypomnień.", + "description": "" + }, + "options_notifications_32": { + "message": "nazwa lub e-mail zawiera", + "description": "" + }, + "options_tab_6": { + "message": "Otwórz konto Gmail w nowym oknie", + "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_toolbar_15": { + "message": "Akcja środkowego przycisku myszy na pasku narzędzi:", + "description": "" + }, + "options_toolbar_10": { + "message": "Minimalna wysokość to 500px.", + "description": "" + }, + "popup_msg_10": { + "message": "stycznia", + "description": "" + }, + "options_notifications_26": { + "message": "Zawsze pokazuj ikony powiadomień (tylko Windows)", + "description": "" + }, + "label_3": { + "message": "Wyłącz wszystkie powiadomienia", + "description": "" + }, + "label_13": { + "message": "Na własny odstęp czasowy", + "description": "" + }, + "options_empty": { + "message": "nie określono", + "description": "" + }, + "options_notifications_3": { + "message": "Ta opcja może nie działać na twoim systemie operacyjnym.", + "description": "" + }, + "options_timings": { + "message": "Czasowe", + "description": "" + }, + "options_gmail_5": { + "message": "Czwarte konto (/mail/u/3/)", + "description": "" + }, + "label_5": { + "message": "Przez 15 minut", + "description": "" + }, + "options_misc_9": { + "message": "Czerwony dla \"Nieprzeczytane\" i szary dla \"Rozłączony\"", + "description": "" + }, + "popup_msg_5": { + "message": "godzin(y) temu", + "description": "" + }, + "options_notifications_27": { + "message": "Ikony obszaru powiadomień będą zawsze wyświetlane, nawet gdy brak nieprzeczytanych wiadomości.", + "description": "" + }, + "options_misc_1": { + "message": "Sortuj konta alfabetycznie", + "description": "" + }, + "tooltip_1": { + "message": "LPM: Otwórz Gmail lub panel podglądu wiadomości", + "description": "" + }, + "notification": { + "message": "Od: [author_email][break]Tytuł: [title][break]Streszczenie: [summary]", + "description": "" + }, + "popup_trash": { + "message": "Usuń", + "description": "" + }, + "options_tab": { + "message": "Otwieranie kart:", + "description": "" + }, + "log_into_your_account": { + "message": "Proszę się zalogować do swojego konta", + "description": "" + }, + "label_10": { + "message": "Włącz powiadomienia", + "description": "" + }, + "options_notifications_23": { + "message": "Głośność dźwięku powiadomienia", + "description": "" + }, + "options_timings_l2": { + "message": "Minimalny odstęp czasowy to 10 sekund.", + "description": "" + }, + "options_toolbar_11": { + "message": "Wsparcie skrótów klawiszowych w panelu paska narzędzi", + "description": "" + }, + "options_gmail_9": { + "message": "Popularne etykiety: \"inbox\", \"important\", \"^smartlabel_personal\", \"^smartlabel_newsletter\", \"^smartlabel_notification\" oraz \"^smartlabel_group\"", + "description": "" + }, + "popup_msg_17": { + "message": "sierpnia", + "description": "" + }, + "popup_msg_15": { + "message": "czerwca", + "description": "" + }, + "options_notifications_34": { + "message": "podsumowanie e-mail'a zawiera", + "description": "" + }, + "label_14": { + "message": "Zalogowane konta", + "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_6": { + "message": "Pokazuj powiadomienia na pulpicie, aby powiadomić, że Gmail jest już otwarty w aktywnej karcie", + "description": "" + }, + "popup_read": { + "message": "Przeczytane", + "description": "" + }, + "options_notifications_4": { + "message": "Format powiadomienia", + "description": "" + }, + "settings_open_title": { + "message": "Otwórz stronę opcji (ustawień)", + "description": "" + }, + "label_2": { + "message": "Ustawienia", + "description": "" + }, + "options_toolbar_14": { + "message": "Jeżeli wolisz surowy tekst w trybie pełnej zawartości, odznacz to pole.", + "description": "" + }, + "options_notifications_18": { + "message": "Dzwoneczek Checker Plus", + "description": "" + }, + "options_tab_5": { + "message": "Otwórz konto Gmail w karcie w tle", + "description": "" + }, + "label_7": { + "message": "Przez godzinę", + "description": "" + }, + "popup_archive": { + "message": "Archiwizuj", + "description": "" + }, + "msg_2": { + "message": "Link został skopiowany do schowka.", + "description": "" + }, + "options_title": { + "message": "Opcje - Powiadomienia Gmail™", + "description": "" + }, + "popup_msg_13": { + "message": "kwietnia", + "description": "" + }, + "popup_msg_9_format": { + "message": "miesięcy temu: %d", + "description": "" + }, + "popup_msg_11": { + "message": "lutego", + "description": "" + }, + "popup_open_inbox": { + "message": "Otwórz skrzynkę", + "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": "" + }, + "gmail": { + "message": "Powiadomienia Gmail™", + "description": "" + }, + "popup_msg_6": { + "message": "wczoraj", + "description": "" + }, + "options_toolbar_8": { + "message": "Minimalna szerokość to 500px.", + "description": "" + }, + "options_notifications_16": { + "message": "Domyślny sygnał Powiadomień Gmail™", + "description": "" + }, + "options_misc_14": { + "message": "Nie wyświetlaj szczegółowej liczby na znaczku, gdy liczba nieprzeczytanych wiadomości jest większa niż 999", + "description": "" + }, + "popup_msg_18": { + "message": "września", + "description": "" + }, + "options_notifications_14": { + "message": "Ta funkcjonalność jest eksperymentalna i może uczynić Twoją przeglądarkę Firefox niestabilną [wymagany restart].", + "description": "" + }, + "options_gmail_3": { + "message": "Drugie konto (/mail/u/1/)", + "description": "" + }, + "options_notifications_11": { + "message": "Wyświetlaj \"powiadomienia paska zadań Windows\" lub \"powiadomienia Mac OS Dock\"", + "description": "" + }, + "options_notifications_2": { + "message": "Pokazuj powiadomienia na pulpicie przez (sekundy):", + "description": "" + }, + "log_in_to_your_account": { + "message": "Proszę się zalogować do konta Gmail", + "description": "" + }, + "popup_of": { + "message": "z", + "description": "" + }, + "options_notifications_15": { + "message": "Domyślny dźwięk powiadomienia to", + "description": "" + }, + "options_notifications_21": { + "message": "Własny dźwięk powiadomień:", + "description": "" + }, + "options_toolbar_9": { + "message": "Wysokość panelu paska narzędzi w trybie pełnej zawartości (piksele):", + "description": "" + }, + "options_toolbar_1": { + "message": "Zachowanie przycisku paska narzędzi", + "description": "" + }, + "unknown": { + "message": "nieznane", + "description": "" + }, + "popup_msg_21": { + "message": "grudnia", + "description": "" + }, + "popup_read_all": { + "message": "Wszystkie przeczytane", + "description": "" + }, + "options_notifications_8": { + "message": "Jeżeli nie chcesz skracać, wpisz dużą liczbę.", + "description": "" + }, + "options_donation": { + "message": "Złóż dotację", + "description": "" + }, + "msg_3": { + "message": "Zaznaczony tekst został skopiowany do schowka.", + "description": "" + }, + "options_misc_7": { + "message": "Pokazuj stronę powitalną po aktualizacji", + "description": "" + }, + "options_gmail": { + "message": "Gmail:", + "description": "" + }, + "label_1": { + "message": "Odśwież", + "description": "" + }, + "options_notifications_5": { + "message": "Dostępne klucze:", + "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_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_misc_2": { + "message": "Domyślne sortowanie bazuje na kolejności zalogowania.", + "description": "" + }, + "options_toolbar_2": { + "message": "Zawsze otwieraj panel podglądu wiadomości", + "description": "" + }, + "popup_settings": { + "message": "Ustawienia", + "description": "" + }, + "options_gmail_4": { + "message": "Trzecie konto (/mail/u/2/)", + "description": "" + }, + "options_toolbar_5": { + "message": "Pokazuj tylko podsumowanie", + "description": "" + }, + "options_notifications_12": { + "message": "Obecnie, powiadomienia paska zadań nie są wspierane na systemach Linuks.", + "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": "" + }, + "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": "" + }, + "popup_refresh": { + "message": "Odśwież", + "description": "" + }, + "options_misc_5": { + "message": "Niebieski dla \"Nieprzeczytane\" i szary dla \"Rozłączony\"", + "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": "" + }, + "popup_msg_19": { + "message": "października", + "description": "" + }, + "options_notifications_33": { + "message": "tytuł e-mail'a zawiera", + "description": "" + }, + "tooltip_3": { + "message": "PPM: Wybór kont", + "description": "" + }, + "popup_date_format": { + "message": "%dd %mm %yy", + "description": "" + }, + "options_notifications": { + "message": "Powiadomienia:", + "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": "" + }, + "popup_msg_12": { + "message": "marca", + "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_tab_1": { + "message": "Szukaj w aktywnym oknie otwartej karty z kontem Gmail", + "description": "" + }, + "popup_msg_7_format": { + "message": "%d dni temu", + "description": "" + }, + "options_timings_l1": { + "message": "Sprawdzaj nowe wiadomości co (sekundy):", + "description": "" + }, + "options_toolbar_4": { + "message": "Tryb panelu paska narzędzi", + "description": "" + }, + "toolbar_label": { + "message": "Powiadomienia Gmail™", + "description": "" + }, + "popup_msg_1": { + "message": "przed chwilą", + "description": "" + }, + "popup_open_settings": { + "message": "Otwórz ustawienia", + "description": "" + }, + "options_misc_3": { + "message": "Kolor paska narzędzi:", + "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_toolbar_12": { + "message": "!: Zgłoś spam, #: Usuń, e: Archiwizuj, Shift + i: Oznacz jako przeczytane.", + "description": "" + }, + "options_px": { + "message": "px", + "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ł", + "description": "" + }, + "and": { + "message": "i", + "description": "" + }, + "options_tab_7": { + "message": "Zawsze używaj pustych kart zamiast otwierania nowej karty (gdy opcja otwierania na karcie jest aktywna)", + "description": "" + }, + "options_toolbar_3": { + "message": "Otwieraj konto Gmail, tylko jeżeli zalogowano na jednym", + "description": "" + }, + "options_gmail_7": { + "message": "Szóste konto (/mail/u/5/)", + "description": "" + }, + "popup_msg_8_format": { + "message": "%d tygodni(e) temu", + "description": "" + }, + "options_toolbar": { + "message": "Pasek narzędzi:", + "description": "" + }, + "options_notifications_6": { + "message": "Skracaj powiadomienia dłuższe niż", + "description": "" + }, + "popup_wait": { + "message": "Czekaj...", + "description": "" + }, + "tooltip_2": { + "message": "Kółko myszy (lub Ctrl+LPM): Odśwież wszystkie konta", + "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_tab_3": { + "message": "Otwórz kolejne konto Gmail za aktywną kartą", + "description": "" + }, + "options_gmail_8": { + "message": "Oznacz wiadomość jako przeczytaną podczas archiwizowania", + "description": "" + }, + "options_toolbar_17": { + "message": "Otwórz główne konto Gmail", + "description": "" + }, + "options_notifications_7": { + "message": "znaków dla pól [title] oraz [summary].", + "description": "" + }, + "options_misc_10": { + "message": "Uruchom powiadomienia na pulpicie oraz dźwiękowe, gdy e-mail został otrzymany poniżej (minut):", + "description": "" + }, + "options_tab_8": { + "message": "Ignoruj otwarte karty Gmail'a", + "description": "" + }, + "popup_no_subject": { + "message": "(brak tematu)", + "description": "" + }, + "msg_5": { + "message": "Wybierz plik z dźwiękiem audio", + "description": "" + }, + "popup_msg_2": { + "message": "minutę temu", + "description": "" + }, + "popup_msg_16": { + "message": "lipca", + "description": "" + }, + "label_8": { + "message": "Przez 2 godziny", + "description": "" + }, + "msg_4": { + "message": "Informacja: Aby powiadomienia działały poprawnie, musisz być zalogowany do swojego konta Google.", + "description": "" + }, + "popup_msg_20": { + "message": "listopada", + "description": "" + }, + "options_toolbar_6": { + "message": "Pokazuj pełną zawartość", + "description": "" + }, + "options_gmail_11": { + "message": "Własne kanały:", + "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": "" + }, + "label_11": { + "message": "Stwórz wiadomość", + "description": "" + }, + "options_toolbar_7": { + "message": "Szerokość panelu paska narzędzi w trybie pełnej zawartości (piksele):", + "description": "" + }, + "options_notifications_31": { + "message": "Własny dźwięk powiadomienia", + "description": "" + }, + "options_timings_l5": { + "message": "Minimalny odstęp czasowy to 5 minut.", + "description": "" + }, + "options_misc": { + "message": "Różności:", + "description": "" + }, + "options_gmail_2": { + "message": "Oddzielaj etykiety znakiem \",\" (przecinek).", + "description": "" + }, + "options_misc_4": { + "message": "Szary dla \"Nieprzeczytane\" i niebieski dla \"Rozłączony\"", + "description": "" + }, + "options_toolbar_13": { + "message": "Wyświetlaj wiadomości jako HTML w trybie pełnej zawartości", + "description": "" + }, + "options_toolbar_16": { + "message": "Odśwież wszystkie konta", + "description": "" + }, + "options_gmail_6": { + "message": "Piąte konto (/mail/u/4)", + "description": "" + }, + "popup_msg_14": { + "message": "maja", + "description": "" + }, + "options_inshort": { + "message": "Etykiety i powiadomienia kont dla Poczty Google (Gmail).", + "description": "" + }, + "options_misc_12": { + "message": "Nie uwzględniaj informacji o profilu w treści okienka podpowiedzi", + "description": "" + }, + "options_tab_4": { + "message": "Otwórz konto Gmail w aktywnej karcie", + "description": "" + }, + "popup_msg_3_format": { + "message": "%d minut(y) temu", + "description": "" + }, + "label_12": { + "message": "Otwórz FAQ", + "description": "" + }, + "description": { + "message": "Etykiety i powiadomienia kont dla Poczty Google (Gmail)", + "description": "" + }, + "popup_spam": { + "message": "Zgłoś spam", + "description": "" + } +} \ No newline at end of file diff --git a/v1/src/_locales/ru/messages.json b/v1/src/_locales/ru/messages.json new file mode 100644 index 00000000..01dc075d --- /dev/null +++ b/v1/src/_locales/ru/messages.json @@ -0,0 +1,690 @@ +{ + "label_9": { + "message": "на 5 часов", + "description": "" + }, + "options_notifications_19": { + "message": "Оповещение о новом сообщении из Windows", + "description": "" + }, + "options_notifications_17": { + "message": "Звонок из Checker Plus", + "description": "" + }, + "options_notifications_13": { + "message": "При клике на значок в трее открывать окно предварительного просмотра (только для Windows, beta)", + "description": "" + }, + "options_notifications_30": { + "message": "Объединять несколько параллельных уведомлений в одно", + "description": "" + }, + "settings_open_label": { + "message": "Открыть настройки", + "description": "" + }, + "options_timings_l7": { + "message": "Не проверять почту сразу после запуска в течении (в секундах):", + "description": "" + }, + "label_4": { + "message": "на 5 минут", + "description": "" + }, + "options_timings_l3": { + "message": "Напоминать о непрочитанных сообщениях каждые (в минутах):", + "description": "" + }, + "popup_msg_4": { + "message": "1 час назад", + "description": "" + }, + "options_gmail_1": { + "message": "Основной аккаунт (/mail/u/0/)", + "description": "" + }, + "options_gmail_10": { + "message": "Получать оповещения для следующих аккаунтов и ярлыков:", + "description": "" + }, + "options_notifications_1": { + "message": "Показывать всплывающие уведомления для новых сообщений", + "description": "" + }, + "options_notifications_9": { + "message": "Проигрывать звуковое оповещение при получении новых сообщений", + "description": "" + }, + "label_6": { + "message": "на 30 минут", + "description": "" + }, + "options_misc_8": { + "message": "Сбросить все настройки на начальные", + "description": "" + }, + "options_notifications_28": { + "message": "Отключить все уведомления на определенный период времени Х (в минутах)", + "description": "" + }, + "options_timings_l4": { + "message": "Установите ноль для отключения напоминаний.", + "description": "" + }, + "options_notifications_32": { + "message": "имя или адрес содержит", + "description": "" + }, + "options_tab_6": { + "message": "Открывать Gmail в новом окне", + "description": "" + }, + "options_notifications_25": { + "message": "В Safari обычно встроенные звуковые оповещения воспроизводятся не правильно, в этом случае используйте пользовательские звуковые файлы для оповещения.", + "description": "" + }, + "options_toolbar_15": { + "message": "Клик средней кнопкой мыши по значку в панели инструментов", + "description": "" + }, + "options_toolbar_10": { + "message": "Минимальная высота окна - 500px.", + "description": "" + }, + "popup_msg_10": { + "message": "Январь", + "description": "" + }, + "options_notifications_26": { + "message": "Всегда показывать значок уведомления в трее (Только Windows)", + "description": "" + }, + "label_3": { + "message": "Отключить все оповещения...", + "description": "" + }, + "label_13": { + "message": "на Х минут", + "description": "" + }, + "options_empty": { + "message": "не определен", + "description": "" + }, + "options_notifications_3": { + "message": "Эта функция может не работать в Вашей ОС.", + "description": "" + }, + "options_timings": { + "message": "Расписание:", + "description": "" + }, + "options_gmail_5": { + "message": "Четвертый аккаунт (/mail/u/3/)", + "description": "" + }, + "label_5": { + "message": "на 15 минут", + "description": "" + }, + "options_misc_9": { + "message": "Красный для \"Нет непрочитанных\" и серый для \"Отключен\"", + "description": "" + }, + "popup_msg_5": { + "message": "часов назад", + "description": "" + }, + "options_notifications_27": { + "message": "Значок в трее будет показан даже если нет не прочитанных сообщений.", + "description": "" + }, + "options_misc_1": { + "message": "Сортировать аккаунты по алфавиту", + "description": "" + }, + "tooltip_1": { + "message": "Левый клик: Открыть вкладку Gmail или окно предварительного просмотра", + "description": "" + }, + "notification": { + "message": "От: [author_email][break]Тема: [title][break]Сводка: [summary]", + "description": "" + }, + "popup_trash": { + "message": "Удалить", + "description": "" + }, + "options_tab": { + "message": "Открытие вкладки Gmail:", + "description": "" + }, + "log_into_your_account": { + "message": "Пожалуйста, войдите в свой аккаунт", + "description": "" + }, + "label_10": { + "message": "Включить оповещения", + "description": "" + }, + "options_notifications_23": { + "message": "Громкость звукового оповещения:", + "description": "" + }, + "options_timings_l2": { + "message": "Минимальный период - 10 сек.", + "description": "" + }, + "options_toolbar_11": { + "message": "Включить горячие клавиши в окне предварительного просмотра", + "description": "" + }, + "options_gmail_9": { + "message": "Некоторые популярные ярлыки: \"inbox\", \"important\", \"^smartlabel_personal\", \"^smartlabel_newsletter\", \"^smartlabel_notification\", and \"^smartlabel_group\"", + "description": "" + }, + "popup_msg_17": { + "message": "Август", + "description": "" + }, + "popup_msg_15": { + "message": "Июнь", + "description": "" + }, + "options_notifications_34": { + "message": "краткая сводка сообщения содержит", + "description": "" + }, + "label_14": { + "message": "Авторизованные аккаунты", + "description": "" + }, + "options_misc_13": { + "message": "По умолчанию в тексте всплывающей подсказки значка на панели инструментов показывается название учетной записи.", + "description": "" + }, + "options_misc_6": { + "message": "Показывать всплывающее уведомление о том, что Gmail уже открыт в активной вкладке", + "description": "" + }, + "popup_read": { + "message": "Прочтено", + "description": "" + }, + "options_notifications_4": { + "message": "Формат уведомления", + "description": "" + }, + "settings_open_title": { + "message": "Открыть страницу настроек", + "description": "" + }, + "label_2": { + "message": "Настройки", + "description": "" + }, + "options_toolbar_14": { + "message": "Если Вы предпочитаете отображение в виде простого текста в полном режиме - снимите эту галку.", + "description": "" + }, + "options_notifications_18": { + "message": "Динь из Checker Plus", + "description": "" + }, + "options_tab_5": { + "message": "Открывать Gmail в фоновой вкладке", + "description": "" + }, + "label_7": { + "message": "на 1 час", + "description": "" + }, + "popup_archive": { + "message": "Архивировать", + "description": "" + }, + "msg_2": { + "message": "Ссылка скопирована в буфер обмена.", + "description": "" + }, + "options_title": { + "message": "Настройки", + "description": "" + }, + "popup_msg_13": { + "message": "Апрель", + "description": "" + }, + "popup_msg_9_format": { + "message": "%d месяца(ев) назад", + "description": "" + }, + "popup_msg_11": { + "message": "Февраль", + "description": "" + }, + "popup_open_inbox": { + "message": "Открыть входящие", + "description": "" + }, + "options_tab_9": { + "message": "Если активировано, аддон проверяет на наличие открытого уже Gmail и переключает фокус на него.", + "description": "" + }, + "gmail": { + "message": "Оповещение для Gmail™", + "description": "" + }, + "popup_msg_6": { + "message": "Вчера", + "description": "" + }, + "options_toolbar_8": { + "message": "Минимальная ширина окна - 500px.", + "description": "" + }, + "options_notifications_16": { + "message": "По умолчанию", + "description": "" + }, + "options_misc_14": { + "message": "Не показывать точное количество непрочитанных сообщений на значке в панели инструментов, если оно превышает 999", + "description": "" + }, + "popup_msg_18": { + "message": "Сентябрь", + "description": "" + }, + "options_notifications_14": { + "message": "Эта экспериментальная функция и может вызвать нестабильность в работе Firefox. [Требуется перезапуск].", + "description": "" + }, + "options_gmail_3": { + "message": "Второй аккаунт (/mail/u/1/)", + "description": "" + }, + "options_notifications_11": { + "message": "Показывать \"Уведомления панели задач Windows\" или \"Уведомления в док-панели Mac OS\"", + "description": "" + }, + "options_notifications_2": { + "message": "Время показа всплывающих уведомлений (в секундах):", + "description": "" + }, + "log_in_to_your_account": { + "message": "Войдите, пожалуйста, в Ваш аккаунт Gmail", + "description": "" + }, + "popup_of": { + "message": "из", + "description": "" + }, + "options_notifications_15": { + "message": "Звук оповещений по умолчанию", + "description": "" + }, + "options_notifications_21": { + "message": "Пользовательский звук:", + "description": "" + }, + "options_toolbar_9": { + "message": "Высота окна просмотра в полном режиме (в пикселях):", + "description": "" + }, + "options_toolbar_1": { + "message": "Поведение кнопки на панели", + "description": "" + }, + "unknown": { + "message": "не определено", + "description": "" + }, + "popup_msg_21": { + "message": "Декабрь", + "description": "" + }, + "popup_read_all": { + "message": "Все прочтено", + "description": "" + }, + "options_notifications_8": { + "message": "Чтобы избежать обрезания сообщений, используйте здесь большие значения.", + "description": "" + }, + "options_donation": { + "message": "Сделать пожертвование", + "description": "" + }, + "msg_3": { + "message": "Выделенный текст скопирован в буфет обмена.", + "description": "" + }, + "options_misc_7": { + "message": "Показывать страницу приветствия при обновлении дополнения", + "description": "" + }, + "options_gmail": { + "message": "Аккаунты Gmail:", + "description": "" + }, + "label_1": { + "message": "Обновить", + "description": "" + }, + "options_notifications_5": { + "message": "Доступные переменные:", + "description": "" + }, + "options_notifications_24": { + "message": "Громкость - число от 0 до 100, где 100 соответствует максимальной громкости.", + "description": "" + }, + "options_notifications_10": { + "message": "Замечание для пользователей Mac. Начиная с Firefox 28.0, все всплывающие уведомления обрабатываются Mac Notification Center, что приводит к двойному звуковому оповещению. Вам следует отключить это звуковое оповещение или звуковое оповещение от Notification Center.", + "description": "" + }, + "options_misc_2": { + "message": "По умолчанию - сортировка по времени входа.", + "description": "" + }, + "options_toolbar_2": { + "message": "Всегда открывать окно предварительного просмотра", + "description": "" + }, + "popup_settings": { + "message": "настройки", + "description": "" + }, + "options_gmail_4": { + "message": "Третий аккаунт (/mail/u/2/)", + "description": "" + }, + "options_toolbar_5": { + "message": "Показывать только сводку", + "description": "" + }, + "options_notifications_12": { + "message": "Оповещения на панели задач для Linux OS пока не поддерживаются.", + "description": "" + }, + "options_notifications_35": { + "message": "Для выбора нового пользовательского звука сначала выберите встроенный звук, а затем измените опцию на пользовательский звук", + "description": "" + }, + "msg_1": { + "message": "Вкладка уже открыта. Нажмите на кнопку на панели инструментов чтобы открыть Gmail в новой вкладке или перейти на уже открытую вкладку Gmail.", + "description": "" + }, + "popup_refresh": { + "message": "Обновить", + "description": "" + }, + "options_misc_5": { + "message": "Голубой для \"Нет непрочитанных\" и серый для \"Отключен\"", + "description": "" + }, + "options_timings_l8": { + "message": "При установке нуля автоматическая проверка почты начнется только после первого ручного обновления (Не доступно в Safari).", + "description": "" + }, + "popup_msg_19": { + "message": "Октябрь", + "description": "" + }, + "options_notifications_33": { + "message": "заголовок сообщения содержит", + "description": "" + }, + "tooltip_3": { + "message": "Правый клик: Меню дополнения", + "description": "" + }, + "popup_date_format": { + "message": "%mm %dd, %yy", + "description": "" + }, + "options_notifications": { + "message": "Всплывающие уведомления:", + "description": "" + }, + "options_timings_l6": { + "message": "Ненулевое значение включает всплывающие уведомления и звуковое оповещение (как при получении нового сообщения).", + "description": "" + }, + "popup_msg_12": { + "message": "Март", + "description": "" + }, + "options_notifications_22": { + "message": "Если ваш браузер не воспроизводит звук оповещения, попробуйте конвертировать файл в формат WAV с помощью онлайн инструментов.", + "description": "" + }, + "options_tab_1": { + "message": "Отслеживать открытую вкладку Gmail только в активном окне браузера", + "description": "" + }, + "popup_msg_7_format": { + "message": "%d дней назад", + "description": "" + }, + "options_timings_l1": { + "message": "Проверять почту каждые (в секундах):", + "description": "" + }, + "options_toolbar_4": { + "message": "Режим окна предварительного просмотра", + "description": "" + }, + "toolbar_label": { + "message": "Оповещение для Gmail™", + "description": "" + }, + "popup_msg_1": { + "message": "только сейчас", + "description": "" + }, + "popup_open_settings": { + "message": "Настройки", + "description": "" + }, + "options_misc_3": { + "message": "Цвет значка на панели инструментов", + "description": "" + }, + "options_gmail_12": { + "message": "Разделяйте каналы \",\" (Запятой). Пример канала: https://mail.google.com/mail/u/0/feed/atom/inbox", + "description": "" + }, + "options_toolbar_12": { + "message": "!: Сообщить о спаме, #: Удалить, e: Архивировать, Shift + i: Отметить как прочитанное.", + "description": "" + }, + "options_px": { + "message": "px", + "description": "" + }, + "options_misc_11": { + "message": "Установив здесь нулевое значение, Вы не получите ни всплывающего уведомления, ни звукового оповещения; однако значок уведомления будет работать.", + "description": "" + }, + "options_notifications_20": { + "message": "Пользовательский звук", + "description": "" + }, + "and": { + "message": "и", + "description": "" + }, + "options_tab_7": { + "message": "Использовать имеющуюся пустую вкладку вместо открытия новой, если активна функция \"Открывать во вкладке\"", + "description": "" + }, + "options_toolbar_3": { + "message": "Открывать Gmail только если авторизован один аккаунт", + "description": "" + }, + "options_gmail_7": { + "message": "Шестой аккаунт (/mail/u/5/)", + "description": "" + }, + "popup_msg_8_format": { + "message": "%d недель назад", + "description": "" + }, + "options_toolbar": { + "message": "Окно предварительного просмотра:", + "description": "" + }, + "options_notifications_6": { + "message": "Обрезать текст уведомления длиннее чем", + "description": "" + }, + "popup_wait": { + "message": "Ожидайте...", + "description": "" + }, + "tooltip_2": { + "message": "Средний клик (или Ctrl+левый клик): Обновить все аккаунты", + "description": "" + }, + "options_notifications_29": { + "message": "Эта настройка относится к меню кнопки на панели инструментов -> Отключить все уведомления -> на Х минут", + "description": "" + }, + "options_tab_3": { + "message": "Открывать вкладку Gmail рядом с активной вкладкой", + "description": "" + }, + "options_gmail_8": { + "message": "Отмечать сообщения как прочитанные при архивации", + "description": "" + }, + "options_toolbar_17": { + "message": "Открыть основной аккаунт", + "description": "" + }, + "options_notifications_7": { + "message": "символов для полей [title] и [summary].", + "description": "" + }, + "options_misc_10": { + "message": "Всплывающие уведомления и звуковое оповещение только для сообщений, полученных менее чем (в минутах):", + "description": "" + }, + "options_tab_8": { + "message": "Игнорировать открытые с Gmail вкладки", + "description": "" + }, + "popup_no_subject": { + "message": "(без темы)", + "description": "" + }, + "msg_5": { + "message": "Выберите звуковой файл", + "description": "" + }, + "popup_msg_2": { + "message": "1 минуту назад", + "description": "" + }, + "popup_msg_16": { + "message": "Июль", + "description": "" + }, + "label_8": { + "message": "на 2 часа", + "description": "" + }, + "msg_4": { + "message": "Замечание: Чтобы оповещение работало правильно, вы должны быть залогинены в свой аккаунт Google.", + "description": "" + }, + "popup_msg_20": { + "message": "Ноябрь", + "description": "" + }, + "options_toolbar_6": { + "message": "Полный режим - показывать сообщение целиком", + "description": "" + }, + "options_gmail_11": { + "message": "Свои каналы:", + "description": "" + }, + "options_tab_2": { + "message": "Не производить поиск открытой вкладки с Gmail в других окнах браузера. Если Gmail не открыт во вкладке активного окна - открыть новую вкладку.", + "description": "" + }, + "label_11": { + "message": "Создать сообщение", + "description": "" + }, + "options_toolbar_7": { + "message": "Ширина окна просмотра в полном режиме (в пискелях):", + "description": "" + }, + "options_notifications_31": { + "message": "Пользовательское звуковое оповещение", + "description": "" + }, + "options_timings_l5": { + "message": "Минимальный период - 5 мин.", + "description": "" + }, + "options_misc": { + "message": "Дополнительно:", + "description": "" + }, + "options_gmail_2": { + "message": "Разделяйте ярлыки \",\" (Запятой).", + "description": "" + }, + "options_misc_4": { + "message": "Серый для \"Нет непрочитанных\" и голубой для \"Отключен\"", + "description": "" + }, + "options_toolbar_13": { + "message": "Отображать сообщения в HTML-формате в полном режиме", + "description": "" + }, + "options_toolbar_16": { + "message": "Обновить все аккаунты", + "description": "" + }, + "options_gmail_6": { + "message": "Пятый аккаунт (/mail/u/4/)", + "description": "" + }, + "popup_msg_14": { + "message": "Май", + "description": "" + }, + "options_inshort": { + "message": "Оповещение для нескольких аккаунтов Google Mail (Gmail).", + "description": "" + }, + "options_misc_12": { + "message": "Не включать информацию об учетной записи в текст всплывающей подсказки ", + "description": "" + }, + "options_tab_4": { + "message": "Открывать Gmail в активной вкладке", + "description": "" + }, + "popup_msg_3_format": { + "message": "%d минут назад", + "description": "" + }, + "label_12": { + "message": "Открыть FAQ", + "description": "" + }, + "description": { + "message": "Оповещение для нескольких аккаунтов Google Mail (Gmail)", + "description": "" + }, + "popup_spam": { + "message": "Спам", + "description": "" + } +} \ No newline at end of file diff --git a/v1/src/_locales/sr/messages.json b/v1/src/_locales/sr/messages.json new file mode 100644 index 00000000..da56f8e0 --- /dev/null +++ b/v1/src/_locales/sr/messages.json @@ -0,0 +1,690 @@ +{ + "label_9": { + "message": "На 5 сати", + "description": "" + }, + "options_notifications_19": { + "message": "Windows email звук", + "description": "" + }, + "options_notifications_17": { + "message": "Checker Plus bell", + "description": "" + }, + "options_notifications_13": { + "message": "Отвори панел прегледа поште када кликнем на иконицу обавештења на траци задатака (само Windows, бета)", + "description": "" + }, + "options_notifications_30": { + "message": "Споји сва истовремена десктоп обавештења у једно обавештење", + "description": "" + }, + "settings_open_label": { + "message": "Отвори опције", + "description": "" + }, + "options_timings_l7": { + "message": "Не проверавај нову пошту при покретању у року од (у секундама):", + "description": "" + }, + "label_4": { + "message": "На 5 минута", + "description": "" + }, + "options_timings_l3": { + "message": "Подсети на сву непрочитану пошту сваких (у минутима):", + "description": "" + }, + "popup_msg_4": { + "message": "пре 1 сат", + "description": "" + }, + "options_gmail_1": { + "message": "Основни налог (/mail/u/0/)", + "description": "" + }, + "options_gmail_10": { + "message": "Примај обавештења за следеће ознаке и налоге:", + "description": "" + }, + "options_notifications_1": { + "message": "Прикажи десктоп обавештења о новој пошти", + "description": "" + }, + "options_notifications_9": { + "message": "Пусти звучно обавештење о новој пошти", + "description": "" + }, + "label_6": { + "message": "На 30 минута", + "description": "" + }, + "options_misc_8": { + "message": "Врати сва подешавања на фабричка", + "description": "" + }, + "options_notifications_28": { + "message": "Онемогући сва обавештења у прилагођеном временском периоду (у минутима)", + "description": "" + }, + "options_timings_l4": { + "message": "Постави вредност на нула за искључивање подсетника.", + "description": "" + }, + "options_notifications_32": { + "message": "име или е-пошта садржи", + "description": "" + }, + "options_tab_6": { + "message": "Отвори Gmail налог у новом прозору", + "description": "" + }, + "options_notifications_25": { + "message": "У Ѕafari прегледачу највероватније се подразумевани звук обавештења неће емитовати исправно, у том случају употребите прилагођени звук за обавештење.", + "description": "" + }, + "options_toolbar_15": { + "message": "Средњи клик на дугме на алатној траци", + "description": "" + }, + "options_toolbar_10": { + "message": "Минимална висина је 500 пиксела.", + "description": "" + }, + "popup_msg_10": { + "message": "јануар", + "description": "" + }, + "options_notifications_26": { + "message": "Увек прикажи иконицу обавештења у системској траци (само Windows)", + "description": "" + }, + "label_3": { + "message": "Онемогући сва обавештења", + "description": "" + }, + "label_13": { + "message": "У прилагођеном временском периоду", + "description": "" + }, + "options_empty": { + "message": "недефинисано", + "description": "" + }, + "options_notifications_3": { + "message": "Ова опција можда неће радити на Вашем оперативном систему.", + "description": "" + }, + "options_timings": { + "message": "Подешавања времена", + "description": "" + }, + "options_gmail_5": { + "message": "Четврти налог (/mail/u/3/)", + "description": "" + }, + "label_5": { + "message": "На 15 минута", + "description": "" + }, + "options_misc_9": { + "message": "Црвена боја за \"Нема непрочитаних\" и сива за \"Неповезан\"", + "description": "" + }, + "popup_msg_5": { + "message": "сата/и раније", + "description": "" + }, + "options_notifications_27": { + "message": "Иконица обавештења у системској траци ће бити приказана чак и ако нема непрочитаних порука.", + "description": "" + }, + "options_misc_1": { + "message": "Поређај налоге по алфабету", + "description": "" + }, + "tooltip_1": { + "message": "Леви клик: Отвори Gmail или панел прегледа поште", + "description": "" + }, + "notification": { + "message": "Од: [author_email][break]Наслов: [title][break]Кратак преглед: [summary]", + "description": "" + }, + "popup_trash": { + "message": "Избриши", + "description": "" + }, + "options_tab": { + "message": "Отварање картица:", + "description": "" + }, + "log_into_your_account": { + "message": "Пријавите се својим Gmail налогом", + "description": "" + }, + "label_10": { + "message": "Омогући обавештења", + "description": "" + }, + "options_notifications_23": { + "message": "Јачина звука обавештења је", + "description": "" + }, + "options_timings_l2": { + "message": "Минимални период је 10 секунди.", + "description": "" + }, + "options_toolbar_11": { + "message": "Омогући тастерске пречице у панелу", + "description": "" + }, + "options_gmail_9": { + "message": "Неке популарне ознаке: \"inbox\", \"important\", \"^smartlabel_personal\", \"^smartlabel_newsletter\", \"^smartlabel_notification\" и \"^smartlabel_group\"", + "description": "" + }, + "popup_msg_17": { + "message": "август", + "description": "" + }, + "popup_msg_15": { + "message": "јун", + "description": "" + }, + "options_notifications_34": { + "message": "кратак преглед е-поште садржи", + "description": "" + }, + "label_14": { + "message": "Пријављени налози", + "description": "" + }, + "options_misc_13": { + "message": "Подразумевано, у опису алатке на дугмету на алатној траци се приказују информације о пријављивању. Одчекирањем ове опције, опис алатке остаје на подразумеваној вредности.", + "description": "" + }, + "options_misc_6": { + "message": "Прикажи десктоп обавештење као упозорење да је Gmail већ отворен у активној картици", + "description": "" + }, + "popup_read": { + "message": "Озн. као прочитано", + "description": "" + }, + "options_notifications_4": { + "message": "Формат обавештења", + "description": "" + }, + "settings_open_title": { + "message": "Отвори страницу опција (подешавања)", + "description": "" + }, + "label_2": { + "message": "Подешавања", + "description": "" + }, + "options_toolbar_14": { + "message": "Одчекирајте ако више волите приказ само текста у режиму приказа пуног садржаја.", + "description": "" + }, + "options_notifications_18": { + "message": "Checker Plus ding", + "description": "" + }, + "options_tab_5": { + "message": "Отвори Gmail налог у позадинској картици", + "description": "" + }, + "label_7": { + "message": "На 1 сат", + "description": "" + }, + "popup_archive": { + "message": "Архивирај", + "description": "" + }, + "msg_2": { + "message": "Линк је копиран у клипборд.", + "description": "" + }, + "options_title": { + "message": "Gmail™ Notifier - Опције", + "description": "" + }, + "popup_msg_13": { + "message": "април", + "description": "" + }, + "popup_msg_9_format": { + "message": "пре %d месеца", + "description": "" + }, + "popup_msg_11": { + "message": "фебруар", + "description": "" + }, + "popup_open_inbox": { + "message": "Отвори Примљене", + "description": "" + }, + "options_tab_9": { + "message": "Када је отчекирано, Gmail Notifier проверава у активном или свим отвореним прозорима да ли има отворених Gmail инстанци и пребацује на картицу када је отварање картице захтевано.", + "description": "" + }, + "gmail": { + "message": "Gmail™ Notifier", + "description": "" + }, + "popup_msg_6": { + "message": "јуче", + "description": "" + }, + "options_toolbar_8": { + "message": "Минимална ширина је 500 пиксела.", + "description": "" + }, + "options_notifications_16": { + "message": "Gmail Notifier подразумевани звук", + "description": "" + }, + "options_misc_14": { + "message": "Не приказуј тачан број непрочитаних порука на иконици ако је већи од 999", + "description": "" + }, + "popup_msg_18": { + "message": "септембар", + "description": "" + }, + "options_notifications_14": { + "message": "Ово је експериментална функција и може изазвати нестабилност Firefox прегледача. [Неопходно је поновно покретање].", + "description": "" + }, + "options_gmail_3": { + "message": "Други налог (/mail/u/1/)", + "description": "" + }, + "options_notifications_11": { + "message": "Прикажи \"Windows обавештења на траци задатака\" или \"Mac OS Dock обавештења\"", + "description": "" + }, + "options_notifications_2": { + "message": "Прикажи десктоп обавештења у трајању од (у секундама):", + "description": "" + }, + "log_in_to_your_account": { + "message": "Пријавите се својим Gmail налогом", + "description": "" + }, + "popup_of": { + "message": "од", + "description": "" + }, + "options_notifications_15": { + "message": "Подразумевано звучно обавештење је", + "description": "" + }, + "options_notifications_21": { + "message": "Кориснички дефинисани звук обавештења је", + "description": "" + }, + "options_toolbar_9": { + "message": "Висина панела у режиму приказа пуног садржаја (у пикселима):", + "description": "" + }, + "options_toolbar_1": { + "message": "Понашање дугмета на алатној картици", + "description": "" + }, + "unknown": { + "message": "непознат", + "description": "" + }, + "popup_msg_21": { + "message": "децембар", + "description": "" + }, + "popup_read_all": { + "message": "Означи све као прочитано", + "description": "" + }, + "options_notifications_8": { + "message": "Да би се избегло сечење поруке, употребите велики број.", + "description": "" + }, + "options_donation": { + "message": "Донирајте", + "description": "" + }, + "msg_3": { + "message": "Одабрани текст је копиран у клипборд.", + "description": "" + }, + "options_misc_7": { + "message": "Прикажи страницу добродошлице при надоградњи", + "description": "" + }, + "options_gmail": { + "message": "Gmail:", + "description": "" + }, + "label_1": { + "message": "Освежи", + "description": "" + }, + "options_notifications_5": { + "message": "Доступне варијабле:", + "description": "" + }, + "options_notifications_24": { + "message": "Јачина је број од 0 до 100 при чему је 100 најгласније (подразумевано).", + "description": "" + }, + "options_notifications_10": { + "message": "Савет за кориснике Mac система. Од Firefox 28.0 верзије, свим десктоп обавештењима управља Mac Notification Center који емитује додатни звучни сигнал. Потребно је да одчекирате ово звучно обавештење или оно које је генерисано од стране Notification Center Mac система.", + "description": "" + }, + "options_misc_2": { + "message": "Подразумевани редослед је по времену пријављивања.", + "description": "" + }, + "options_toolbar_2": { + "message": "Увек отвори панел прегледа поште", + "description": "" + }, + "popup_settings": { + "message": "подешавања", + "description": "" + }, + "options_gmail_4": { + "message": "Трећи налог (/mail/u/2/)", + "description": "" + }, + "options_toolbar_5": { + "message": "Прикажи кратак преглед", + "description": "" + }, + "options_notifications_12": { + "message": "Обавештења на траци задатака нису подржана у Linux систему.", + "description": "" + }, + "options_notifications_35": { + "message": "За избор новог прилагођеног звука, изаберите прво уграђени звук а затим промените опцију на прилагођени звук", + "description": "" + }, + "msg_1": { + "message": "Картица је већ отворена. Кликните на дугме на алатној траци да отворите Gmail у новој картици или да се пребаците на постојећу Gmail картицу.", + "description": "" + }, + "popup_refresh": { + "message": "Освежи", + "description": "" + }, + "options_misc_5": { + "message": "Плава боја за \"Нема непрочитаних\" и сива за \"Неповезан\"", + "description": "" + }, + "options_timings_l8": { + "message": "Постави вредност на нула за непроверавање поште до првог ручног ажурирања [није доступно у Safari прегледачу].", + "description": "" + }, + "popup_msg_19": { + "message": "октобар", + "description": "" + }, + "options_notifications_33": { + "message": "наслов е-поште садржи", + "description": "" + }, + "tooltip_3": { + "message": "Десни клик: Избор налога", + "description": "" + }, + "popup_date_format": { + "message": "%dd. %mm %yy.", + "description": "" + }, + "options_notifications": { + "message": "Обавештења:", + "description": "" + }, + "options_timings_l6": { + "message": "Све вредности осим нуле покрећу десктоп обавештење и звучни сигнал (као када пристигне нова пошта) у задатим временским периодима ако имате непрочитану пошту.", + "description": "" + }, + "popup_msg_12": { + "message": "март", + "description": "" + }, + "options_notifications_22": { + "message": "Ако ваш прегледач не емитује прилагођени звук обавештења, покушајте да га конвертујете у WAV формат користећи алат за конвертовање на мрежи.", + "description": "" + }, + "options_tab_1": { + "message": "Потражи отворени Gmail налог само у активном прозору", + "description": "" + }, + "popup_msg_7_format": { + "message": "пре %d дана", + "description": "" + }, + "options_timings_l1": { + "message": "Провери нову пошту сваких (у секундама):", + "description": "" + }, + "options_toolbar_4": { + "message": "Режим приказа панела", + "description": "" + }, + "toolbar_label": { + "message": "Gmail™ Notifier", + "description": "" + }, + "popup_msg_1": { + "message": "управо сада", + "description": "" + }, + "popup_open_settings": { + "message": "Подешавања", + "description": "" + }, + "options_misc_3": { + "message": "Боја иконице на алатној траци", + "description": "" + }, + "options_gmail_12": { + "message": "Одвоји канале \",\" (зарезом). Пример канала: https://mail.google.com/mail/u/0/feed/atom/inbox", + "description": "" + }, + "options_toolbar_12": { + "message": "!: Пријави непожељну поруку, #: Отпад, e: Архивирај, Shift + i: Означи као прочитано.", + "description": "" + }, + "options_px": { + "message": "px", + "description": "" + }, + "options_misc_11": { + "message": "Постављајући ову вредност на нула, нећете примати ни десктоп ни звучна обавештења; ипак, обавештење у виду ознаке на иконици ће бити приказано.", + "description": "" + }, + "options_notifications_20": { + "message": "Кориснички дефинисани звук", + "description": "" + }, + "and": { + "message": "и", + "description": "" + }, + "options_tab_7": { + "message": "Увек употреби празну картицу уместо отварања нове картице (када је отварање у картици активирано)", + "description": "" + }, + "options_toolbar_3": { + "message": "Отвори Gmail налог ако је само један налог пријављен", + "description": "" + }, + "options_gmail_7": { + "message": "Шести налог (/mail/u/5/)", + "description": "" + }, + "popup_msg_8_format": { + "message": "пре %d седмице/а", + "description": "" + }, + "options_toolbar": { + "message": "Алатна трака:", + "description": "" + }, + "options_notifications_6": { + "message": "Скрати обавештења дужа од", + "description": "" + }, + "popup_wait": { + "message": "Сачекај...", + "description": "" + }, + "tooltip_2": { + "message": "Средњи (или Ctrl+Леви) клик: Освежи све налоге", + "description": "" + }, + "options_notifications_29": { + "message": "Ова опција се односи на мени на десном клику на дугмету на алатној траци -> онемогући сва обавештења -> прилагођени временски период", + "description": "" + }, + "options_tab_3": { + "message": "Отвори нови Gmail налог поред активне картице", + "description": "" + }, + "options_gmail_8": { + "message": "Означи поруке као прочитане при архивирању", + "description": "" + }, + "options_toolbar_17": { + "message": "Отвара основни Gmail налог", + "description": "" + }, + "options_notifications_7": { + "message": "карактера у пољима [title] и [summary].", + "description": "" + }, + "options_misc_10": { + "message": "Покрени десктоп и звучна обавештења само за пошту пристиглу у последњих (у минутима): ", + "description": "" + }, + "options_tab_8": { + "message": "Занемари отворене Gmail картице", + "description": "" + }, + "popup_no_subject": { + "message": "(без наслова)", + "description": "" + }, + "msg_5": { + "message": "Изаберите датотеку звучног обавештења", + "description": "" + }, + "popup_msg_2": { + "message": "пре 1 минут", + "description": "" + }, + "popup_msg_16": { + "message": "јул", + "description": "" + }, + "label_8": { + "message": "На 2 сата", + "description": "" + }, + "msg_4": { + "message": "Напомена: Да би обавештења радила исправно, морате бити пријављени на свој Google налог.", + "description": "" + }, + "popup_msg_20": { + "message": "новембар", + "description": "" + }, + "options_toolbar_6": { + "message": "Прикажи пун садржај", + "description": "" + }, + "options_gmail_11": { + "message": "Прилагођени канали:", + "description": "" + }, + "options_tab_2": { + "message": "Не тражи у другим прозорима прегледача отворене Gmail налоге. Ако Gmail није отворен у активном прозору, отвориће се у новој картици.", + "description": "" + }, + "label_11": { + "message": "Напиши нову поруку", + "description": "" + }, + "options_toolbar_7": { + "message": "Ширина панела у режиму приказа пуног садржаја (у пикселима):", + "description": "" + }, + "options_notifications_31": { + "message": "Прилагођени звук обавештења", + "description": "" + }, + "options_timings_l5": { + "message": "Минимални период је 5 минута.", + "description": "" + }, + "options_misc": { + "message": "Остало:", + "description": "" + }, + "options_gmail_2": { + "message": "Одвоји ознаке \",\" (зарезом).", + "description": "" + }, + "options_misc_4": { + "message": "Сива боја за \"Нема непрочитаних\" и плава за \"Неповезан\"", + "description": "" + }, + "options_toolbar_13": { + "message": "Прикажи пошту као HTML у режиму приказа пуног садржаја", + "description": "" + }, + "options_toolbar_16": { + "message": "Освежава све налоге", + "description": "" + }, + "options_gmail_6": { + "message": "Пети налог (/mail/u/4/)", + "description": "" + }, + "popup_msg_14": { + "message": "мај", + "description": "" + }, + "options_inshort": { + "message": "Обавештења за више Google Mail (Gmail) налога.", + "description": "" + }, + "options_misc_12": { + "message": "Не обухватај детаље о пријављивању у опису алатке", + "description": "" + }, + "options_tab_4": { + "message": "Отвори Gmail налог у активној картици", + "description": "" + }, + "popup_msg_3_format": { + "message": "пре %d минута", + "description": "" + }, + "label_12": { + "message": "Отвори FAQ", + "description": "" + }, + "description": { + "message": "Обавештења за више Google Mail (Gmail) налога", + "description": "" + }, + "popup_spam": { + "message": "Пријави непожељну поруку", + "description": "" + } +} \ No newline at end of file diff --git a/v1/src/_locales/zh_CN/messages.json b/v1/src/_locales/zh_CN/messages.json new file mode 100644 index 00000000..13f52292 --- /dev/null +++ b/v1/src/_locales/zh_CN/messages.json @@ -0,0 +1,690 @@ +{ + "label_9": { + "message": "禁用 5 小时", + "description": "" + }, + "options_notifications_19": { + "message": "Windows 邮件提醒", + "description": "" + }, + "options_notifications_17": { + "message": "Checker Plus 钟声", + "description": "" + }, + "options_notifications_13": { + "message": "在点击任务栏通知图标时打开工具栏面板(仅 Windows,测试版)", + "description": "" + }, + "options_notifications_30": { + "message": "整合所有连续的桌面通知为单条通知", + "description": "" + }, + "settings_open_label": { + "message": "打开选项", + "description": "" + }, + "options_timings_l7": { + "message": "不检查新邮件,在刚启动的(秒):", + "description": "" + }, + "label_4": { + "message": "禁用 5 分钟", + "description": "" + }, + "options_timings_l3": { + "message": "提醒有未读邮件,每隔(分钟):", + "description": "" + }, + "popup_msg_4": { + "message": "1 小时前", + "description": "" + }, + "options_gmail_1": { + "message": "主帐户 (/mail/u/0/)", + "description": "" + }, + "options_gmail_10": { + "message": "接收下列标签和帐户的通知:", + "description": "" + }, + "options_notifications_1": { + "message": "为新邮件显示桌面通知", + "description": "" + }, + "options_notifications_9": { + "message": "为新邮件播放声音提醒", + "description": "" + }, + "label_6": { + "message": "禁用 30 分钟", + "description": "" + }, + "options_misc_8": { + "message": "重置所有设置到出厂设置", + "description": "" + }, + "options_notifications_28": { + "message": "指定时间内禁止所有通知 (分钟):", + "description": "" + }, + "options_timings_l4": { + "message": "设置值为 0 可禁用定期提醒。", + "description": "" + }, + "options_notifications_32": { + "message": "名称或电子邮件包含", + "description": "" + }, + "options_tab_6": { + "message": "在新窗口打开 Gmail 帐户", + "description": "" + }, + "options_notifications_25": { + "message": "在 Safari 下很可能默认的通知声音不能正常播放,如果您使用了一个自定义文件作为通知声音。", + "description": "" + }, + "options_toolbar_15": { + "message": "中键单击工具栏按钮", + "description": "" + }, + "options_toolbar_10": { + "message": "最小高度为 500px。", + "description": "" + }, + "popup_msg_10": { + "message": "1月", + "description": "" + }, + "options_notifications_26": { + "message": "始终显示托盘通知 (仅 Windows)", + "description": "" + }, + "label_3": { + "message": "禁用所有通知", + "description": "" + }, + "label_13": { + "message": "自定义时间长度", + "description": "" + }, + "options_empty": { + "message": "未定义", + "description": "" + }, + "options_notifications_3": { + "message": "此选项在您的操作系统上可能无法正常工作。", + "description": "" + }, + "options_timings": { + "message": "时间", + "description": "" + }, + "options_gmail_5": { + "message": "第四帐户 (/mail/u/3/)", + "description": "" + }, + "label_5": { + "message": "禁用 15 分钟", + "description": "" + }, + "options_misc_9": { + "message": "红色表示“无未读邮件”,灰色表示“已断开”", + "description": "" + }, + "popup_msg_5": { + "message": "小时前", + "description": "" + }, + "options_notifications_27": { + "message": "托盘通知图标将始终显示,即使没有未读邮件。", + "description": "" + }, + "options_misc_1": { + "message": "按字母排序帐户", + "description": "" + }, + "tooltip_1": { + "message": "左键单击:打开 Gmail 或邮件预览面板", + "description": "" + }, + "notification": { + "message": "来自: [author_email][break]标题: [title][break]摘要: [summary]", + "description": "" + }, + "popup_trash": { + "message": "删除", + "description": "" + }, + "options_tab": { + "message": "打开标签页:", + "description": "" + }, + "log_into_your_account": { + "message": "请登录您的帐户", + "description": "" + }, + "label_10": { + "message": "启用通知功能", + "description": "" + }, + "options_notifications_23": { + "message": "声音提醒的音量为", + "description": "" + }, + "options_timings_l2": { + "message": "最小周期为 10 秒。", + "description": "" + }, + "options_toolbar_11": { + "message": "工具栏面板上支持键盘快捷键", + "description": "" + }, + "options_gmail_9": { + "message": "部分常用标签: \"inbox\", \"important\", \"^smartlabel_personal\", \"^smartlabel_newsletter\", \"^smartlabel_notification\", \"^smartlabel_group\"", + "description": "" + }, + "popup_msg_17": { + "message": "8月", + "description": "" + }, + "popup_msg_15": { + "message": "6月", + "description": "" + }, + "options_notifications_34": { + "message": "邮件摘要包含", + "description": "" + }, + "label_14": { + "message": "已登录帐户", + "description": "" + }, + "options_misc_13": { + "message": "默认情况下,本扩展的工具栏按钮的工具提示带有登录信息。取消此选项时,工具提示文本将恢复默认值。", + "description": "" + }, + "options_misc_6": { + "message": "Show desktop notification to warn that Gmail is already opened in the active tab", + "description": "" + }, + "popup_read": { + "message": "标为已读", + "description": "" + }, + "options_notifications_4": { + "message": "通知格式", + "description": "" + }, + "settings_open_title": { + "message": "打开选项(设置)页面", + "description": "" + }, + "label_2": { + "message": "设置", + "description": "" + }, + "options_toolbar_14": { + "message": "如果您偏好在完整内容模式下只呈现文本形式,取消此框。", + "description": "" + }, + "options_notifications_18": { + "message": "Checker Plus 铃声", + "description": "" + }, + "options_tab_5": { + "message": "在后台标签页打开 Gmail 帐户", + "description": "" + }, + "label_7": { + "message": "禁用 1 小时", + "description": "" + }, + "popup_archive": { + "message": "归档", + "description": "" + }, + "msg_2": { + "message": "链接已复制到剪贴板。", + "description": "" + }, + "options_title": { + "message": "选项 - Gmail™ Notifier", + "description": "" + }, + "popup_msg_13": { + "message": "4月", + "description": "" + }, + "popup_msg_9_format": { + "message": "%d 个月前", + "description": "" + }, + "popup_msg_11": { + "message": "2月", + "description": "" + }, + "popup_open_inbox": { + "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.", + "description": "" + }, + "gmail": { + "message": "Gmail™ Notifier", + "description": "" + }, + "popup_msg_6": { + "message": "昨天", + "description": "" + }, + "options_toolbar_8": { + "message": "最小宽度为 500px。", + "description": "" + }, + "options_notifications_16": { + "message": "Gmail Notifier 默认声音", + "description": "" + }, + "options_misc_14": { + "message": "未读邮件超过 999 封时,不在徽章上显示确切数字", + "description": "" + }, + "popup_msg_18": { + "message": "9月", + "description": "" + }, + "options_notifications_14": { + "message": "此功能是实验性的,并可能导致您的 Firefox 浏览器不稳定 [需要重启]。", + "description": "" + }, + "options_gmail_3": { + "message": "第二帐户 (/mail/u/1/)", + "description": "" + }, + "options_notifications_11": { + "message": "显示“Windows 任务栏通知”或者“Mac OS Dock 通知”", + "description": "" + }, + "options_notifications_2": { + "message": "显示桌面通知(秒):", + "description": "" + }, + "log_in_to_your_account": { + "message": "请登录您的 Gmail 帐户", + "description": "" + }, + "popup_of": { + "message": "/", + "description": "" + }, + "options_notifications_15": { + "message": "默认声音是", + "description": "" + }, + "options_notifications_21": { + "message": "用户定义声音为", + "description": "" + }, + "options_toolbar_9": { + "message": "完整内容模式下的工具栏面板高度为(像素):", + "description": "" + }, + "options_toolbar_1": { + "message": "工具栏按钮行为", + "description": "" + }, + "unknown": { + "message": "未知", + "description": "" + }, + "popup_msg_21": { + "message": "12月", + "description": "" + }, + "popup_read_all": { + "message": "全部标为已读", + "description": "" + }, + "options_notifications_8": { + "message": "要想没有截断和省略号,在这里使用较大的数值。", + "description": "" + }, + "options_donation": { + "message": "捐款", + "description": "" + }, + "msg_3": { + "message": "选定文本已复制到剪贴板。", + "description": "" + }, + "options_misc_7": { + "message": "升级后显示欢迎页面", + "description": "" + }, + "options_gmail": { + "message": "Gmail:", + "description": "" + }, + "label_1": { + "message": "刷新", + "description": "" + }, + "options_notifications_5": { + "message": "可用变量:", + "description": "" + }, + "options_notifications_24": { + "message": "音量是 0 至 100 之间的一个数字,100 是最高音量(默认值)。", + "description": "" + }, + "options_notifications_10": { + "message": "Mac 用户请注意:从 Firefox 28.0 开始,所有桌面通知都经由 Mac 通知中心处理,包括触发一个额外的声音提醒。您需要取消这里的声音或者“通知中心”中的声音。", + "description": "" + }, + "options_misc_2": { + "message": "默认顺序是登录顺序。", + "description": "" + }, + "options_toolbar_2": { + "message": "总是打开邮件预览面板", + "description": "" + }, + "popup_settings": { + "message": "设置", + "description": "" + }, + "options_gmail_4": { + "message": "第三帐户 (/mail/u/2/)", + "description": "" + }, + "options_toolbar_5": { + "message": "只显示摘要", + "description": "" + }, + "options_notifications_12": { + "message": "任务栏通知目前不支持 Linux 操作系统。", + "description": "" + }, + "options_notifications_35": { + "message": "要选择一个新的自定义声音,选择一个内置声音,然后再更改此选项为自定义声音", + "description": "" + }, + "msg_1": { + "message": "标签页已经打开。点击工具栏上的按钮在新标签页中打开 Gmail,或者切换到现有的 Gmail 标签页。", + "description": "" + }, + "popup_refresh": { + "message": "刷新", + "description": "" + }, + "options_misc_5": { + "message": "蓝色表示“无未读邮件”,灰色表示“已断开”", + "description": "" + }, + "options_timings_l8": { + "message": "设置值为 0 将禁用邮件检查,除非手动刷新 [Safari 上不可用]。", + "description": "" + }, + "popup_msg_19": { + "message": "10月", + "description": "" + }, + "options_notifications_33": { + "message": "邮件标题包含", + "description": "" + }, + "tooltip_3": { + "message": "右键单击:选择帐户", + "description": "" + }, + "popup_date_format": { + "message": "%yy-%mm-%dd", + "description": "" + }, + "options_notifications": { + "message": "通知:", + "description": "" + }, + "options_timings_l6": { + "message": "非零的值将反复触发桌面通知和提醒声音(类似有新邮件到达),如果您有未读的邮件。", + "description": "" + }, + "popup_msg_12": { + "message": "3月", + "description": "" + }, + "options_notifications_22": { + "message": "如果您的浏览器不能播放自定义的声音,请尝试用在线转换工具将它转换为纯 WAV 格式。", + "description": "" + }, + "options_tab_1": { + "message": "只在活动窗口中搜索已打开的 Gmail 帐户", + "description": "" + }, + "popup_msg_7_format": { + "message": "%d 天前", + "description": "" + }, + "options_timings_l1": { + "message": "检查新邮件,每隔(秒):", + "description": "" + }, + "options_toolbar_4": { + "message": "工具栏面板模式", + "description": "" + }, + "toolbar_label": { + "message": "Gmail™ Notifier", + "description": "" + }, + "popup_msg_1": { + "message": "刚刚", + "description": "" + }, + "popup_open_settings": { + "message": "打开设置", + "description": "" + }, + "options_misc_3": { + "message": "工具栏颜色模式", + "description": "" + }, + "options_gmail_12": { + "message": "用 \",\" (半角逗号) 分隔收取点。收取点样例: https://mail.google.com/mail/u/0/feed/atom/inbox", + "description": "" + }, + "options_toolbar_12": { + "message": "!: 报告为垃圾邮件, #: 删除, e: 归档, Shift + i: 标记为已读。", + "description": "" + }, + "options_px": { + "message": "像素", + "description": "" + }, + "options_misc_11": { + "message": "如果将此选项设置为 0,您将不再收到桌面和声音通知,但仍可收到网址栏徽章通知。", + "description": "" + }, + "options_notifications_20": { + "message": "用户定义声音", + "description": "" + }, + "and": { + "message": "及", + "description": "" + }, + "options_tab_7": { + "message": "始终使用空白标签页而不是打开一个新标签页", + "description": "" + }, + "options_toolbar_3": { + "message": "打开 Gmail 帐户,如果只登录了一个帐户", + "description": "" + }, + "options_gmail_7": { + "message": "第六帐户 (/mail/u/5/)", + "description": "" + }, + "popup_msg_8_format": { + "message": "%d 周前", + "description": "" + }, + "options_toolbar": { + "message": "工具栏:", + "description": "" + }, + "options_notifications_6": { + "message": "截断通知中超过", + "description": "" + }, + "popup_wait": { + "message": "等待...", + "description": "" + }, + "tooltip_2": { + "message": "中键 (或 Ctrl+左键) 单击:刷新所有帐户", + "description": "" + }, + "options_notifications_29": { + "message": "此选项有关工具栏按钮的右键菜单 -> 禁止所有通知 -> 自定义时间长度。", + "description": "" + }, + "options_tab_3": { + "message": "在当前标签页后面打开新的 Gmail 帐户", + "description": "" + }, + "options_gmail_8": { + "message": "归档时标记邮件为已读", + "description": "" + }, + "options_toolbar_17": { + "message": "打开主要的 Gmail 帐户", + "description": "" + }, + "options_notifications_7": { + "message": "字符的标题和摘要。", + "description": "" + }, + "options_misc_10": { + "message": "仅在邮件抵达未超过x分钟时发出桌面和声音通知:", + "description": "" + }, + "options_tab_8": { + "message": "Ignore opened Gmail tabs", + "description": "" + }, + "popup_no_subject": { + "message": "(无主题)", + "description": "" + }, + "msg_5": { + "message": "选择一个声音文件", + "description": "" + }, + "popup_msg_2": { + "message": "1 分钟前", + "description": "" + }, + "popup_msg_16": { + "message": "7月", + "description": "" + }, + "label_8": { + "message": "禁用 2 小时", + "description": "" + }, + "msg_4": { + "message": "注意:为了通知能正常工作,您需要先登录到您的 Google 帐户。", + "description": "" + }, + "popup_msg_20": { + "message": "11月", + "description": "" + }, + "options_toolbar_6": { + "message": "显示完整内容", + "description": "" + }, + "options_gmail_11": { + "message": "自定义收取点:", + "description": "" + }, + "options_tab_2": { + "message": "不搜索其他浏览器窗口有无打开的 Gmail 帐户。如果活动窗口中没有已打开的 Gmail,打开一个新标签页。", + "description": "" + }, + "label_11": { + "message": "撰写邮件", + "description": "" + }, + "options_toolbar_7": { + "message": "完整内容模式下的工具栏面板宽度为(像素):", + "description": "" + }, + "options_notifications_31": { + "message": "自定义声音通知", + "description": "" + }, + "options_timings_l5": { + "message": "最小周期为 5 分钟。", + "description": "" + }, + "options_misc": { + "message": "杂项:", + "description": "" + }, + "options_gmail_2": { + "message": "用 \",\" (半角逗号) 分隔。", + "description": "" + }, + "options_misc_4": { + "message": "灰色表示“无未读邮件”,蓝色表示“已断开”", + "description": "" + }, + "options_toolbar_13": { + "message": "在完整内容模式下,呈现邮件为 HTML 形式", + "description": "" + }, + "options_toolbar_16": { + "message": "刷新所有帐户", + "description": "" + }, + "options_gmail_6": { + "message": "第五帐户 (/mail/u/4/)", + "description": "" + }, + "popup_msg_14": { + "message": "5月", + "description": "" + }, + "options_inshort": { + "message": "支持多个标签和帐户的通知工具,适用于 Google Mail (Gmail)。", + "description": "" + }, + "options_misc_12": { + "message": "不在工具提示中包含登录信息", + "description": "" + }, + "options_tab_4": { + "message": "在当前标签页打开 Gmail 帐户", + "description": "" + }, + "popup_msg_3_format": { + "message": "%d 分钟前", + "description": "" + }, + "label_12": { + "message": "打开常见问题", + "description": "" + }, + "description": { + "message": "支持多个标签和帐户的通知工具,适用于 Google Mail (Gmail)", + "description": "" + }, + "popup_spam": { + "message": "垃圾", + "description": "" + } +} \ No newline at end of file diff --git a/v1/src/chrome.manifest b/v1/src/chrome.manifest new file mode 100644 index 00000000..224cdf69 --- /dev/null +++ b/v1/src/chrome.manifest @@ -0,0 +1 @@ +content ignotifier ./ diff --git a/builds/unpacked/firefox/data/firefox/chrome/content/options-opener.xul b/v1/src/data/firefox/chrome/content/options-opener.xul similarity index 100% rename from builds/unpacked/firefox/data/firefox/chrome/content/options-opener.xul rename to v1/src/data/firefox/chrome/content/options-opener.xul diff --git a/builds/unpacked/firefox/data/firefox/notification.html b/v1/src/data/firefox/notification.html similarity index 100% rename from builds/unpacked/firefox/data/firefox/notification.html rename to v1/src/data/firefox/notification.html diff --git a/builds/unpacked/firefox/data/firefox/shared/connect.jsm b/v1/src/data/firefox/shared/connect.jsm similarity index 100% rename from builds/unpacked/firefox/data/firefox/shared/connect.jsm rename to v1/src/data/firefox/shared/connect.jsm diff --git a/builds/unpacked/firefox/data/firefox/sound.html b/v1/src/data/firefox/sound.html similarity index 100% rename from builds/unpacked/firefox/data/firefox/sound.html rename to v1/src/data/firefox/sound.html diff --git a/src/data/icons/blue/16.png b/v1/src/data/icons/blue/16.png similarity index 100% rename from src/data/icons/blue/16.png rename to v1/src/data/icons/blue/16.png diff --git a/src/data/icons/blue/19.png b/v1/src/data/icons/blue/19.png similarity index 100% rename from src/data/icons/blue/19.png rename to v1/src/data/icons/blue/19.png diff --git a/src/data/icons/blue/32.png b/v1/src/data/icons/blue/32.png similarity index 100% rename from src/data/icons/blue/32.png rename to v1/src/data/icons/blue/32.png diff --git a/src/data/icons/browsers/chrome.png b/v1/src/data/icons/browsers/chrome.png similarity index 100% rename from src/data/icons/browsers/chrome.png rename to v1/src/data/icons/browsers/chrome.png diff --git a/src/data/icons/browsers/firefox.png b/v1/src/data/icons/browsers/firefox.png similarity index 100% rename from src/data/icons/browsers/firefox.png rename to v1/src/data/icons/browsers/firefox.png diff --git a/src/data/icons/browsers/opera.png b/v1/src/data/icons/browsers/opera.png similarity index 100% rename from src/data/icons/browsers/opera.png rename to v1/src/data/icons/browsers/opera.png diff --git a/src/data/icons/browsers/safari.png b/v1/src/data/icons/browsers/safari.png similarity index 100% rename from src/data/icons/browsers/safari.png rename to v1/src/data/icons/browsers/safari.png diff --git a/src/data/icons/gray/16.png b/v1/src/data/icons/gray/16.png similarity index 100% rename from src/data/icons/gray/16.png rename to v1/src/data/icons/gray/16.png diff --git a/src/data/icons/gray/19.png b/v1/src/data/icons/gray/19.png similarity index 100% rename from src/data/icons/gray/19.png rename to v1/src/data/icons/gray/19.png diff --git a/src/data/icons/gray/32.png b/v1/src/data/icons/gray/32.png similarity index 100% rename from src/data/icons/gray/32.png rename to v1/src/data/icons/gray/32.png diff --git a/src/data/icons/load0/16.png b/v1/src/data/icons/load0/16.png similarity index 100% rename from src/data/icons/load0/16.png rename to v1/src/data/icons/load0/16.png diff --git a/src/data/icons/load0/19.png b/v1/src/data/icons/load0/19.png similarity index 100% rename from src/data/icons/load0/19.png rename to v1/src/data/icons/load0/19.png diff --git a/src/data/icons/load0/32.png b/v1/src/data/icons/load0/32.png similarity index 100% rename from src/data/icons/load0/32.png rename to v1/src/data/icons/load0/32.png diff --git a/src/data/icons/load1/16.png b/v1/src/data/icons/load1/16.png similarity index 100% rename from src/data/icons/load1/16.png rename to v1/src/data/icons/load1/16.png diff --git a/src/data/icons/load1/19.png b/v1/src/data/icons/load1/19.png similarity index 100% rename from src/data/icons/load1/19.png rename to v1/src/data/icons/load1/19.png diff --git a/src/data/icons/load1/32.png b/v1/src/data/icons/load1/32.png similarity index 100% rename from src/data/icons/load1/32.png rename to v1/src/data/icons/load1/32.png diff --git a/src/data/icons/load2/16.png b/v1/src/data/icons/load2/16.png similarity index 100% rename from src/data/icons/load2/16.png rename to v1/src/data/icons/load2/16.png diff --git a/src/data/icons/load2/19.png b/v1/src/data/icons/load2/19.png similarity index 100% rename from src/data/icons/load2/19.png rename to v1/src/data/icons/load2/19.png diff --git a/src/data/icons/load2/32.png b/v1/src/data/icons/load2/32.png similarity index 100% rename from src/data/icons/load2/32.png rename to v1/src/data/icons/load2/32.png diff --git a/src/data/icons/load3/16.png b/v1/src/data/icons/load3/16.png similarity index 100% rename from src/data/icons/load3/16.png rename to v1/src/data/icons/load3/16.png diff --git a/src/data/icons/load3/19.png b/v1/src/data/icons/load3/19.png similarity index 100% rename from src/data/icons/load3/19.png rename to v1/src/data/icons/load3/19.png diff --git a/src/data/icons/load3/32.png b/v1/src/data/icons/load3/32.png similarity index 100% rename from src/data/icons/load3/32.png rename to v1/src/data/icons/load3/32.png diff --git a/src/data/icons/new/16.png b/v1/src/data/icons/new/16.png similarity index 100% rename from src/data/icons/new/16.png rename to v1/src/data/icons/new/16.png diff --git a/src/data/icons/new/19.png b/v1/src/data/icons/new/19.png similarity index 100% rename from src/data/icons/new/19.png rename to v1/src/data/icons/new/19.png diff --git a/src/data/icons/new/32.png b/v1/src/data/icons/new/32.png similarity index 100% rename from src/data/icons/new/32.png rename to v1/src/data/icons/new/32.png diff --git a/src/data/icons/notification/16.png b/v1/src/data/icons/notification/16.png similarity index 100% rename from src/data/icons/notification/16.png rename to v1/src/data/icons/notification/16.png diff --git a/src/data/icons/notification/32.png b/v1/src/data/icons/notification/32.png similarity index 100% rename from src/data/icons/notification/32.png rename to v1/src/data/icons/notification/32.png diff --git a/src/data/icons/notification/48.png b/v1/src/data/icons/notification/48.png similarity index 100% rename from src/data/icons/notification/48.png rename to v1/src/data/icons/notification/48.png diff --git a/src/data/icons/notification/64.png b/v1/src/data/icons/notification/64.png similarity index 100% rename from src/data/icons/notification/64.png rename to v1/src/data/icons/notification/64.png diff --git a/src/data/icons/options/16.png b/v1/src/data/icons/options/16.png similarity index 100% rename from src/data/icons/options/16.png rename to v1/src/data/icons/options/16.png diff --git a/src/data/icons/options/64.png b/v1/src/data/icons/options/64.png similarity index 100% rename from src/data/icons/options/64.png rename to v1/src/data/icons/options/64.png diff --git a/src/data/icons/red/128.png b/v1/src/data/icons/red/128.png similarity index 100% rename from src/data/icons/red/128.png rename to v1/src/data/icons/red/128.png diff --git a/src/data/icons/red/16.png b/v1/src/data/icons/red/16.png similarity index 100% rename from src/data/icons/red/16.png rename to v1/src/data/icons/red/16.png diff --git a/src/data/icons/red/19.png b/v1/src/data/icons/red/19.png similarity index 100% rename from src/data/icons/red/19.png rename to v1/src/data/icons/red/19.png diff --git a/src/data/icons/red/32.png b/v1/src/data/icons/red/32.png similarity index 100% rename from src/data/icons/red/32.png rename to v1/src/data/icons/red/32.png diff --git a/src/data/icons/red/48.png b/v1/src/data/icons/red/48.png similarity index 100% rename from src/data/icons/red/48.png rename to v1/src/data/icons/red/48.png diff --git a/src/data/icons/red/64.png b/v1/src/data/icons/red/64.png similarity index 100% rename from src/data/icons/red/64.png rename to v1/src/data/icons/red/64.png diff --git a/src/data/icons/safari/clear.png b/v1/src/data/icons/safari/clear.png similarity index 100% rename from src/data/icons/safari/clear.png rename to v1/src/data/icons/safari/clear.png diff --git a/src/data/icons/safari/new.png b/v1/src/data/icons/safari/new.png similarity index 100% rename from src/data/icons/safari/new.png rename to v1/src/data/icons/safari/new.png diff --git a/src/data/icons/safari/unknown.png b/v1/src/data/icons/safari/unknown.png similarity index 100% rename from src/data/icons/safari/unknown.png rename to v1/src/data/icons/safari/unknown.png diff --git a/src/data/icons/tray/blue.png b/v1/src/data/icons/tray/blue.png similarity index 100% rename from src/data/icons/tray/blue.png rename to v1/src/data/icons/tray/blue.png diff --git a/src/data/icons/tray/gray.png b/v1/src/data/icons/tray/gray.png similarity index 100% rename from src/data/icons/tray/gray.png rename to v1/src/data/icons/tray/gray.png diff --git a/src/data/icons/tray/red.png b/v1/src/data/icons/tray/red.png similarity index 100% rename from src/data/icons/tray/red.png rename to v1/src/data/icons/tray/red.png diff --git a/v1/src/data/options/chrome/chrome.js b/v1/src/data/options/chrome/chrome.js new file mode 100644 index 00000000..ebe73abd --- /dev/null +++ b/v1/src/data/options/chrome/chrome.js @@ -0,0 +1,21 @@ +/* globals chrome */ +'use strict'; + +var background = { + send: function (id, data) { + chrome.extension.sendRequest({method: id, data: data}); + }, + receive: function (id, callback) { + chrome.runtime.onMessage.addListener(function (request) { + if (request.method === id) { + callback(request.data); + } + }); + } +}; + +(function (elems) { + [].forEach.call(elems, function (elem) { + elem.textContent = chrome.i18n.getMessage(elem.getAttribute('data-l10n-id')); + }); +})(document.querySelectorAll('*[data-l10n-id]')); diff --git a/src/data/options/css_browser_selector.js b/v1/src/data/options/css_browser_selector.js similarity index 100% rename from src/data/options/css_browser_selector.js rename to v1/src/data/options/css_browser_selector.js diff --git a/builds/unpacked/firefox/data/options/firefox/firefox.js b/v1/src/data/options/firefox/firefox.js similarity index 100% rename from builds/unpacked/firefox/data/options/firefox/firefox.js rename to v1/src/data/options/firefox/firefox.js diff --git a/src/data/options/index.css b/v1/src/data/options/index.css similarity index 83% rename from src/data/options/index.css rename to v1/src/data/options/index.css index 3cd40c39..b7dde699 100644 --- a/src/data/options/index.css +++ b/v1/src/data/options/index.css @@ -15,20 +15,28 @@ } .box { - width:100%; - display: table; -} -.box label { - display: table-cell; - width: 1px; - white-space: nowrap; - padding-right: 5px; + display: flex; + align-items: center; } .box input, .box select { display: table-cell; width:100%; } +.box div { + white-space: nowrap; + margin-right: 10px; +} + +.browse { + display: none; + font-weight: bold; + padding: 0 5px; + cursor: pointer; +} +.browse input { + display: none; +} .spacer { height: 18px; @@ -57,6 +65,24 @@ table { color: #222; font-family: arial,sans-serif; } +select, +input { + background-color: #fff; +} +input { + height: 24px; + border: 1px solid #C8C8C8; +} +select { + height: 22px; + border: 0; + outline: 1px solid #C8C8C8; +} + +input[type=checkbox] { + width: 20px; + height: 20px; +} input[type=number] { width: 55px; diff --git a/src/data/options/index.html b/v1/src/data/options/index.html similarity index 56% rename from src/data/options/index.html rename to v1/src/data/options/index.html index 8b2d56cb..0f7b5e24 100644 --- a/src/data/options/index.html +++ b/v1/src/data/options/index.html @@ -57,39 +57,39 @@

    - - +
    +

    - - +
    +

    - - +
    +

    - - +
    +

    - - +
    +

    - - +
    +

    - +

    @@ -99,14 +99,14 @@

    - +

    [author_name], [author_email], [title] [summary].

    @@ -115,76 +115,182 @@

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

    +
    +
    + + + + +
    +

    +
    +
    + + + + +
    +

    +
    +
    + + + + +
    +

    +
    +
    + + + + +
    +

    +
    +
    + + + + +
    +

    -
    - . -
    +

    +


    +

    + +
    +

    +

    +

    +

    +

    +

    @@ -192,7 +298,7 @@
    - +
    @@ -214,18 +320,18 @@

    - +
    +

    - +
    +

    @@ -264,21 +370,21 @@

    diff --git a/builds/unpacked/firefox/data/options/index.js b/v1/src/data/options/index.js similarity index 54% rename from builds/unpacked/firefox/data/options/index.js rename to v1/src/data/options/index.js index 0fade81f..5fd715bb 100644 --- a/builds/unpacked/firefox/data/options/index.js +++ b/v1/src/data/options/index.js @@ -18,46 +18,35 @@ var connect = function (elem, pref) { pref = pref || elem.getAttribute('data-pref'); background.send('get', pref); elem.addEventListener('change', function () { - if (pref === 'notification.sound.custom.file') { + if (pref.endsWith('.file')) { + var base = pref.replace('.file', ''); var file = this.files[0]; + var input = document.querySelector('[data-pref="' + pref + '"]'); + if (input) { + input.parentNode.style.display = 'none'; + } background.send('changed', { - pref: 'notification.sound.custom.file', - value: this.value - }); - background.send('changed', { - pref: 'notification.sound.type', - value: 4 - }); - background.send('changed', { - pref: 'notification.sound.custom.name', - value: file.name + pref: base + '.mime', + value: file.type }); + var reader = new FileReader(); + reader.onload = function (e) { + background.send('changed', { + pref, + value: e.target.result + }); + }; + reader.onerror = function (e) { + alert(e); + }; + reader.readAsDataURL(file); + } + else { background.send('changed', { - pref: 'notification.sound.custom.mime', - value: file.type + pref: pref, + value: this[att] }); - if (isFirefox) { - self.port.emit('get-sound-fullpath'); - } - else { - var reader = new FileReader(); - reader.onload = function (e) { - background.send('changed', { - pref: 'notification.sound.custom.file', - value: e.target.result - }); - }; - reader.onerror = function (e) { - alert(e); - }; - reader.readAsDataURL(file); - } - return; } - background.send('changed', { - pref: pref, - value: this[att] - }); }); } return { @@ -79,7 +68,19 @@ background.receive('set', function (o) { } }); -window.addEventListener('load', function () { +background.receive('custom-sound', function (pref) { + if (isFirefox) { + background.send('custom-sound', pref); + } + else { + var input = document.querySelector('[data-pref="' + pref + '"]'); + if (input) { + input.parentElement.style.display = 'inline-block'; + } + } +}); + +window.addEventListener('DOMContentLoaded', function () { var prefs = document.querySelectorAll('*[data-pref]'); [].forEach.call(prefs, function (elem) { var pref = elem.getAttribute('data-pref'); diff --git a/src/data/options/safari/safari.js b/v1/src/data/options/safari/safari.js similarity index 100% rename from src/data/options/safari/safari.js rename to v1/src/data/options/safari/safari.js diff --git a/v1/src/data/popup/body/email-chrome.css b/v1/src/data/popup/body/email-chrome.css new file mode 100644 index 00000000..d4c65155 --- /dev/null +++ b/v1/src/data/popup/body/email-chrome.css @@ -0,0 +1,14 @@ +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/builds/unpacked/firefox/data/popup/body/email-firefox.css b/v1/src/data/popup/body/email-firefox.css similarity index 79% rename from builds/unpacked/firefox/data/popup/body/email-firefox.css rename to v1/src/data/popup/body/email-firefox.css index 5355b3f0..7cec9b0e 100644 --- a/builds/unpacked/firefox/data/popup/body/email-firefox.css +++ b/v1/src/data/popup/body/email-firefox.css @@ -1,10 +1,17 @@ body { margin: 0; } +table { + color: inherit; +} body, td { font-family: arial,sans-serif; font-size: 12px; } +/* support black themes; #139 */ +html, body { + background-color: #fff; +} a { color: #1155CC; text-decoration: none; diff --git a/v1/src/data/popup/chrome/chrome.js b/v1/src/data/popup/chrome/chrome.js new file mode 100644 index 00000000..6da4afd4 --- /dev/null +++ b/v1/src/data/popup/chrome/chrome.js @@ -0,0 +1,38 @@ +/* globals chrome */ +'use strict'; + +var background = { + send: function (id, data) { + chrome.extension.sendRequest({method: id, data: data}); + }, + receive: function (id, callback) { + if (id === 'show') { + window.addEventListener('load', function () { + background.send('show'); + callback(); + }, false); + } + else { + chrome.extension.onRequest.addListener(function (request) { + if (request.method === id) { + callback(request.data); + } + }); + } + } +}; + +var manifest = { + url: chrome.extension.getURL(''), + locale: chrome.i18n.getMessage +}; + +(function (elems) { + [].forEach.call(elems, function (elem) { + elem.textContent = chrome.i18n.getMessage(elem.getAttribute('data-l10n-id')); + }); +})(document.querySelectorAll('*[data-l10n-id]')); + +chrome.extension.getBackgroundPage().userActions.forEach(function (callback) { + callback(); +}); diff --git a/src/data/popup/fetch.gif b/v1/src/data/popup/fetch.gif similarity index 100% rename from src/data/popup/fetch.gif rename to v1/src/data/popup/fetch.gif diff --git a/builds/unpacked/firefox/data/popup/firefox/firefox.js b/v1/src/data/popup/firefox/firefox.js similarity index 100% rename from builds/unpacked/firefox/data/popup/firefox/firefox.js rename to v1/src/data/popup/firefox/firefox.js diff --git a/src/data/popup/icons.png b/v1/src/data/popup/icons.png similarity index 100% rename from src/data/popup/icons.png rename to v1/src/data/popup/icons.png diff --git a/src/data/popup/index.css b/v1/src/data/popup/index.css similarity index 100% rename from src/data/popup/index.css rename to v1/src/data/popup/index.css diff --git a/src/data/popup/index.html b/v1/src/data/popup/index.html similarity index 93% rename from src/data/popup/index.html rename to v1/src/data/popup/index.html index c8d67a4a..2d0392ce 100644 --- a/src/data/popup/index.html +++ b/v1/src/data/popup/index.html @@ -3,6 +3,7 @@ + diff --git a/src/data/popup/index.js b/v1/src/data/popup/index.js similarity index 88% rename from src/data/popup/index.js rename to v1/src/data/popup/index.js index 0b829c97..4ec40f2e 100644 --- a/src/data/popup/index.js +++ b/v1/src/data/popup/index.js @@ -2,7 +2,11 @@ // (function (locales) { [].forEach.call(locales, function (locale) { - var elem = document.querySelector('[title=' + locale.dataset.l10nId); + var elem; + try { + elem = document.querySelector('[title="' + locale.dataset.l10nId + '"'); + } + catch (e) {} if (elem) { elem.title = locale.textContent; } @@ -14,6 +18,7 @@ var isOpera = typeof chrome !== 'undefined' && navigator.userAgent.indexOf('OPR' var isChrome = typeof chrome !== 'undefined' && navigator.userAgent.indexOf('OPR') === -1; var objs, contentCache = [], selected = {}; +var isPrivate = false; var qs = function (q, m) { var reserved = { @@ -102,19 +107,19 @@ var body = (function() { title = qs('title'); return { get date() { - return date.textContent + return date.textContent; }, set date(val) { date.textContent = val; }, get email() { - return email.textContent + return email.textContent; }, set email(val) { email.textContent = val; }, get name() { - return name.textContent + return name.textContent; }, set name(val) { name.textContent = val; @@ -125,7 +130,7 @@ var body = (function() { return title.textContent; }, set title(val) { - title.textContent = val || "(no subject)"; + title.textContent = val || manifest.locale('popup_no_subject'); }, set titleLink(val) { title.setAttribute("href", val) @@ -207,7 +212,7 @@ var update = (function () { if (!isAvailable) { // does the old account still have unread entries? var obj = objs.filter(function (o) { - return o.xml.link == selected.parent.xml.link; + return 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)]; @@ -225,6 +230,9 @@ var update = (function () { return o.xml.link == selected.parent.xml.link })[0]; } + if (!selected.parent) { + return; + } // updating current index selected.parent.xml.entries.forEach(function (entry, i) { if (entry.id == selected.entry.id) { @@ -270,6 +278,7 @@ var update = (function () { 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; @@ -316,7 +325,7 @@ new Listen('spam', "click", function(e) { }); }); new Listen('read', "click", function(e) { - qs('read').textContent = "Wait..."; + qs('read').textContent = manifest.locale('popup_wait'); qs('read').setAttribute("disabled", true); background.send("action", { links: selected.entry.link, @@ -346,7 +355,7 @@ new Listen('read-all', "click", function(e) { background.receive("action-response", function(cmd) { if (cmd == "rd") { - qs('read').textContent = "Mark as read"; + qs('read').textContent = manifest.locale('popup_read'); qs('read').removeAttribute("disabled"); } else { @@ -422,35 +431,26 @@ background.receive("body-response", function(o) { // Link opener for html function opener (e) { e.preventDefault(); + e.stopPropagation(); var target = e.originalTarget || e.target; - var selectedText = target.ownerDocument.getSelection() + ''; - - var link = target.href || target.src; - if (target.localName != "a" && target.parentNode && target.parentNode.localName == "a") { - link = target.parentNode.href || link; - } + var link = (target.closest('a') && target.closest('a').href) || target.src || target.href; if (link) { - if (e.button === 2) { - background.send("clipboard", { - str: link, - type: 0 - }); - } - else { - background.send("open", link); - } - } - else if (e.button === 2 && selectedText) { - background.send("clipboard", { - str: selectedText, - type: 1 + background.send("open", { + isPrivate: isPrivate, + link: link, + button: e.button, + ctrlKey: e.ctrlKey, + shiftKey: e.shiftKey, + altKey: e.altKey, + metaKey: e.metaKey }); } } window.addEventListener("click", opener); qs("iframe").contentDocument.addEventListener("click", opener); + function keyup (e) { if (!keyup.doKeyUp) return; @@ -470,7 +470,7 @@ background.receive("show", function () { obj.removeAttribute("wait"); obj.removeAttribute("disabled"); }); - qs('read').textContent = "Mark as read"; + qs('read').textContent = manifest.locale('popup_read'); background.send("resize"); background.send("keyUp"); @@ -549,26 +549,29 @@ function prettyDate(time) { return day_diff == 0 && ( diff < 60 && manifest.locale('popup_msg_1') || diff < 120 && manifest.locale('popup_msg_2') || - diff < 3600 && Math.floor(diff / 60) + " " + manifest.locale('popup_msg_3') || + diff < 3600 && manifest.locale('popup_msg_3_format').replace('%d', Math.floor(diff / 60)) || diff < 7200 && manifest.locale('popup_msg_4') || diff < 86400 && Math.floor(diff / 3600) + " " + manifest.locale('popup_msg_5')) || day_diff == 1 && manifest.locale('popup_msg_6') || - day_diff < 7 && day_diff + " " + manifest.locale('popup_msg_7') || - day_diff < 7 * 7 && Math.ceil(day_diff / 7) + " " + manifest.locale('popup_msg_8') || - day_diff < 7 * 4 * 3 && Math.ceil(day_diff / 7 / 4) + " " + manifest.locale('popup_msg_9') || - [ - manifest.locale('popup_msg_10'), - manifest.locale('popup_msg_11'), - manifest.locale('popup_msg_12'), - manifest.locale('popup_msg_13'), - manifest.locale('popup_msg_14'), - manifest.locale('popup_msg_15'), - manifest.locale('popup_msg_16'), - manifest.locale('popup_msg_17'), - manifest.locale('popup_msg_18'), - manifest.locale('popup_msg_19'), - manifest.locale('popup_msg_20'), - manifest.locale('popup_msg_21') - ][date.getMonth()] + " " + date.getDate() + ", " + date.getFullYear().toString(); + day_diff < 7 && manifest.locale('popup_msg_7_format').replace('%d', day_diff) || + day_diff < 7 * 7 && manifest.locale('popup_msg_8_format').replace('%d', Math.ceil(day_diff / 7)) || + day_diff < 7 * 4 * 3 && manifest.locale('popup_msg_9_format').replace('%d', Math.ceil(day_diff / 7 / 4)) || + manifest.locale('popup_date_format') + .replace('%dd', date.getDate()) + .replace('%yy', date.getFullYear().toString()) + .replace('%mm', [ + manifest.locale('popup_msg_10'), + manifest.locale('popup_msg_11'), + manifest.locale('popup_msg_12'), + manifest.locale('popup_msg_13'), + manifest.locale('popup_msg_14'), + manifest.locale('popup_msg_15'), + manifest.locale('popup_msg_16'), + manifest.locale('popup_msg_17'), + manifest.locale('popup_msg_18'), + manifest.locale('popup_msg_19'), + manifest.locale('popup_msg_20'), + manifest.locale('popup_msg_21') + ][date.getMonth()]); } diff --git a/src/data/popup/safari/safari.js b/v1/src/data/popup/safari/safari.js similarity index 100% rename from src/data/popup/safari/safari.js rename to v1/src/data/popup/safari/safari.js diff --git a/src/data/popup/wait.gif b/v1/src/data/popup/wait.gif similarity index 100% rename from src/data/popup/wait.gif rename to v1/src/data/popup/wait.gif diff --git a/src/data/sounds/0.wav b/v1/src/data/sounds/0.wav similarity index 100% rename from src/data/sounds/0.wav rename to v1/src/data/sounds/0.wav diff --git a/src/data/sounds/1.wav b/v1/src/data/sounds/1.wav similarity index 100% rename from src/data/sounds/1.wav rename to v1/src/data/sounds/1.wav diff --git a/src/data/sounds/2.wav b/v1/src/data/sounds/2.wav similarity index 100% rename from src/data/sounds/2.wav rename to v1/src/data/sounds/2.wav diff --git a/src/data/sounds/3.wav b/v1/src/data/sounds/3.wav similarity index 100% rename from src/data/sounds/3.wav rename to v1/src/data/sounds/3.wav diff --git a/builds/unpacked/firefox/lib/common.js b/v1/src/lib/common.js similarity index 76% rename from builds/unpacked/firefox/lib/common.js rename to v1/src/lib/common.js index 92b39514..05e6090b 100644 --- a/builds/unpacked/firefox/lib/common.js +++ b/v1/src/lib/common.js @@ -12,6 +12,11 @@ if (isFirefox) { var tab = require('./utils/tab'); } +// disable sound on a user action +app.actions(function () { + app.sound.stop(); +}); + // add a repeater to check all accounts var repeater = new timer.repeater( (config.email.check.first ? config.email.check.first : 5) * 1000, @@ -20,14 +25,15 @@ var repeater = new timer.repeater( var actions = { silent: function (time) { - if (config.notification.silent) { - app.timer.clearTimeout(config.notification.silent); - } + app.timer.clearTimeout(config.notification.silent); config.notification.silent = false; - if (time) { + if (time === 'custom') { + time = config.notification.silentTime * 60; + } + if (!isNaN(time)) { config.notification.silent = app.timer.setTimeout(function () { config.notification.silent = false; - }, time); + }, time * 1000); } }, reset: function () { @@ -65,6 +71,7 @@ var actions = { } } }; +app.on('open-options', actions.openOptions); if (isFirefox) { app.connect(actions); } @@ -136,7 +143,43 @@ var icon = (function () { }; })(); -function open (url, inBackground, refresh) { +function play (arr) { + var filters = [0, 1, 2, 3, 4].map(function (index) { + return { + filter: config.notification.sound.media['custom' + index].filter, + selector: config.notification.sound.media['custom' + index].selector, + index: index + }; + }). + filter(function (obj) { + return obj.filter; + }). + filter(function (obj) { + if (obj.selector === 0) { + return arr.reduce(function (p, c) { + return p || ( + c.author_email.toLowerCase().indexOf(obj.filter.toLowerCase()) !== -1 || + c.author_name.toLowerCase().indexOf(obj.filter.toLowerCase()) !== -1 + ); + }, false); + } + if (obj.selector === 1) { + return arr.reduce(function (p, c) { + return p || c.title.toLowerCase().indexOf(obj.filter.toLowerCase()) !== -1; + }, false); + } + if (obj.selector === 2) { + return arr.reduce(function (p, c) { + return p || c.summary.toLowerCase().indexOf(obj.filter.toLowerCase()) !== -1; + }, false); + } + return false; + }); + app.sound.play(filters.length ? filters[0].index : null); +} + +function open (url, inBackground, refresh, isPrivate) { + url = url.replace('@private', ''); // some urls might end with "@private" for private mode function parseUri (str) { str = str || ''; str = str.replace('gmail', 'mail.google'); @@ -176,9 +219,17 @@ function open (url, inBackground, refresh) { return uri; } - app.windows.active() + app.windows.active(isPrivate) .then(function () { - return app.windows.tabs.list(config.tabs.search); + if (config.tabs.ignoreOpens) { + return []; + } + var tabs = []; + try { // http://add0n.com/gmail-notifier.html#comment-2622018574 + tabs = app.windows.tabs.list(config.tabs.search); + } + catch (e) {} + return tabs; }) .then(function (tabs) { var parse2 = parseUri(url); @@ -252,7 +303,7 @@ function setBadge (val) { } var checkEmails = (function () { var color = 'blue', count = -1, cachedEmails; - var emails, feeds = ''; + var emails, feeds = '', isPrivate = app.isPrivate(); return { execute: function (forced) { @@ -267,19 +318,32 @@ var checkEmails = (function () { e.reject(); }); } - if (config.email.feeds.join(', ') !== feeds) { + + if (config.email.feeds.join(', ') !== feeds || isPrivate !== app.isPrivate()) { + isPrivate = app.isPrivate(); emails = config.email.feeds.map(function (feed) { return new server.Email(feed, config.email.timeout); }); + // supporting private mode + if (app.isPrivate()) { + emails = emails.concat(config.email.feeds.map(function (feed) { + return new server.Email(feed, config.email.timeout, true); + })); + } + feeds = config.email.feeds.join(', '); } // Execute fresh servers app.Promise.all(emails.map(function (e) { - return e.execute(); + return e.execute().catch (function () {}); })).then(function (objs) { + // Removing error objects + objs = objs.filter(function (o) { + return o; + }); // Make sure there is no duplicate account var tmp = objs.map(function (o) { - return o.notAuthorized === true || o.network === false ? null : o.xml.title + '/' + o.xml.label; + return o.notAuthorized === true || o.network === false ? null : (o.xml ? o.xml.title + '/' + o.xml.label : null); }) .map(function (l, i, a) { return !l ? false : a.indexOf(l) !== i; @@ -306,6 +370,7 @@ var checkEmails = (function () { color = 'blue'; count = -1; cachedEmails = []; + app.button.fireContext(); app.popup.detach(); } if (forced) { @@ -324,7 +389,7 @@ var checkEmails = (function () { } //Removing not logged-in accounts objs = objs.filter(function (o) { - return o.network && !o.notAuthorized; + return o.network && !o.notAuthorized && o.xml && o.xml.entries; }); //Sorting accounts objs.sort(function (a, b) { @@ -350,10 +415,11 @@ var checkEmails = (function () { count = newCount; // cachedEmails = objs; + app.button.fireContext(); // Preparing the report var tmp = []; objs.forEach (function (o) { - (o.xml.entries || []) + (o.xml && o.xml.entries ? o.xml.entries : []) .filter(function (e) { return anyNewEmails ? o.newIDs.indexOf(e.id) !== -1 : o.xml.fullcount !== 0; }) @@ -375,7 +441,10 @@ var checkEmails = (function () { .replace('[summary]', shorten(e.summary)) .replace('[title]', shorten(e.title)) .replace(/\[break\]/g, '\n'); - }).join('\n\n'); + }); + if (config.notification.combined) { + report = [report.join('\n\n')]; + } // Preparing the tooltip var tooltip = app.l10n('gmail') + '\n\n' + @@ -385,13 +454,32 @@ var checkEmails = (function () { (c.xml.label ? ' [' + c.xml.label + ']' : '') + ' (' + c.xml.fullcount + ')' + '\n'; }, '').replace(/\n$/, ''); + // Preparing tray tooltip; make sure length is less than 64 chars + var trayTooltip = (function () { + var name = objs.reduce(function (p, c) { + return p += + c.xml.title + + (c.xml.label ? ' [' + c.xml.label + ']' : '') + + ' (' + c.xml.fullcount + ')' + '\n'; + }, '').replace(/\n$/, ''); + + var title = app.l10n('gmail') + '\n\n'; + if (name.length + title.length < 64) { + name = title + name; + } + if (name.length > 64) { + name = name.replace(/\@.* \(/g , ' ('); + } + return name; + })(); if (!forced && !anyNewEmails) { if (newCount) { icon('red'); setBadge(newCount); + color = 'red'; if (config.tray.show) { - app.tray.set(newCount, tooltip); + app.tray.set(newCount, trayTooltip); } app.button.label = tooltip; app.popup.send('update', objs); @@ -441,24 +529,31 @@ var checkEmails = (function () { } if (config.notification.show) { app.notify(report, '', function () { - app.timer.setTimeout(function () { - // restore browser window first! - app.windows.active().then(function (win) { - win.focus(); - app.timer.setTimeout(actions.onCommand, 100, tmp.length ? tmp[0].link : null); - }); - }, 100); + if (isFirefox) { + app.timer.setTimeout(function () { + // restore browser window first! + app.windows.active().then(function (win) { + win.focus(); + app.timer.setTimeout(actions.onCommand, 1000, tmp.length ? tmp[0].link : null); + }); + }, 100); + } + else { + open('https://mail.google.com/'); + } }); } if (config.tray.show) { - app.tray.set(newCount, tooltip); + app.tray.set(newCount, trayTooltip); } if (config.notification.sound.play) { - app.play.now(); + play(tmp); } app.button.label = tooltip; app.popup.send('update-reset', objs); } + }, function () { + // this should not be called }); }, getCached: function () { @@ -521,15 +616,24 @@ app.popup.receive('show', function () { app.popup.send('update-reset', objs); } }); -app.popup.receive('open', function (link) { - app.popup.hide(); - if (link) { - open(link); +app.popup.receive('open', function (obj) { + // context menu + if (typeof obj === 'string') { + open(obj); + } + else if (obj.button === 2 || !obj.link) { + return; + } + else if (obj.button === 0 && (obj.ctrlKey || obj.metaKey)) { + open(obj.link, true, null, obj.isPrivate); + } + else if (obj.button === 1) { + open(obj.link, true, null, obj.isPrivate); + } + else { + open(obj.link, null, null, obj.isPrivate); + app.popup.hide(); } -}); -app.popup.receive('clipboard', function (o) { - app.clipboard(o.str); - app.notify(app.l10n(o.type ? 'msg_3' : 'msg_2')); }); app.popup.receive('update', function () { repeater.reset(true); @@ -540,7 +644,7 @@ app.popup.receive('action', function (o) { app.popup.send('action-response', o.cmd); }, function (e) { - app.notify(e); + app.notify(e.message || e); } ); }); @@ -574,73 +678,45 @@ app.button.onClick (function (e) { } } }); -app.button.onContext(function () { - // insert new items - var show = checkEmails.getCached().map(function (o) { - return o.xml.rootLink; - }).map(function (e, i, a) { - return a.indexOf(e) === i; - }); - var items = []; - if (isFirefox) { - items = checkEmails.getCached().filter(function (e, i) { + +app.button.onContext({ + get accounts () { + var show = checkEmails.getCached().map(function (o) { + return o.xml ? o.xml.rootLink : null; + }) + .filter(function (o) { + return o; + }) + .map(function (e, i, a) { + return a.indexOf(e) === i; + }); + return checkEmails.getCached().filter(function (e, i) { return show[i]; }).map(function (o) { return { - type: 'menuitem', label: o.xml.title, - command: function (link, e) { + command: function (link) { if (link) { open(link.replace(/\?.*/ , '')); } }.bind(this, o.xml.rootLink) }; }); - if (items.length) { - items.push({type: 'menuseparator'}); - } - - items = items.concat([ - {type: 'menu', label: app.l10n('label_3'), childs: [ - {type: 'menupopup', childs: [ - {type: 'menuitem', label: app.l10n('label_4'), value: 300}, - {type: 'menuitem', label: app.l10n('label_5'), value: 900}, - {type: 'menuitem', label: app.l10n('label_6'), value: 1800}, - {type: 'menuitem', label: app.l10n('label_7'), value: 3600}, - {type: 'menuitem', label: app.l10n('label_8'), value: 7200}, - {type: 'menuitem', label: app.l10n('label_9'), value: 18000} - ], command: function (e) { - actions.silent(parseInt(e.originalTarget.getAttribute('value')) * 1000); - }} - ]}, - {type: 'menuitem', label: app.l10n('label_10'), command: actions.silent}, - {type: 'menuseparator'} - ]); - } - else { - items = items.concat([ - {type: 'menuitem', label: app.l10n('label_3') + ' ' + app.l10n('label_4').toLowerCase(), command: actions.silent.bind(actions, 300 * 1000)}, - {type: 'menuitem', label: app.l10n('label_3') + ' ' + app.l10n('label_7').toLowerCase(), command: actions.silent.bind(actions, 3600 * 1000)}, - {type: 'menuitem', label: app.l10n('label_10'), command: actions.silent} - ]); - } - items = items.concat([ - {type: 'menuitem', label: app.l10n('label_11'), command: function () { - open(config.email.compose); - }}, - {type: 'menuitem', label: app.l10n('label_1'), command: actions.reset}, - ]); - if (isFirefox) { - items = items.concat([ - {type: 'menuitem', label: app.l10n('label_2'), command: actions.openOptions}, - {type: 'menuseparator'}, - {type: 'menuitem', label: app.l10n('label_12'), command: function () { - open(config.welcome.homepage + '?type=context'); - }} - ]); + }, + silent: actions.silent, + faq: function () { + open(config.welcome.homepage + '?type=context'); + }, + refresh: actions.reset, + compose: function () { + open(config.email.compose); + }, + options: actions.openOptions, + get state () { + return !config.notification.silent; } - return items; }); + // initialization app.startup(function () { //welcome @@ -650,11 +726,9 @@ app.startup(function () { '?type=' + (config.welcome.version ? 'upgrade' : 'install') + (config.welcome.version ? '&p=' + config.welcome.version : '') + '&v=' + app.version(); - app.timer.setTimeout(function () { - open(url, false); - }, config.welcome.time); + config.welcome.version = app.version(); + app.timer.setTimeout(open, config.welcome.time, url, false); } - config.welcome.version = app.version(); } }); if (!config.welcome.version) { @@ -687,15 +761,6 @@ app.options.receive('get', function (pref) { value: config.get(pref) }); }); -app.unload(function () { - app.windows.tabs.list().then(function (tabs) { - tabs.forEach(function (tab) { - if (tab.url === app.manifest.url + 'data/options/index.html') { - tab.close(); - } - }); - }); -}); // pref listeners config.on('email.check.resetPeriod', function () { if (config.email.check.resetPeriod) { @@ -706,6 +771,9 @@ config.on('email.check.resetPeriod', function () { resetTimer.stop(); } }); +config.on('email.check.period', function () { + repeater.fill(config.email.check.period * 1000); +}); config.on('email.openInboxOnOne', function () { var numberOfAccounts = checkEmails.getCached() .map(function (o) { @@ -747,4 +815,4 @@ app.on('update', function () { app.timer.setTimeout(function () { repeater.reset(); }, 500); -}) +}); diff --git a/builds/unpacked/firefox/lib/config.js b/v1/src/lib/config.js similarity index 63% rename from builds/unpacked/firefox/lib/config.js rename to v1/src/lib/config.js index 156eba4c..87cb2185 100644 --- a/builds/unpacked/firefox/lib/config.js +++ b/v1/src/lib/config.js @@ -157,7 +157,7 @@ config.email = (function () { } app.storage.write('notificationTruncate', Math.max(val, 20)); }, - maxReport: 1, //Maximum number of simultaneous reports from a single account + maxReport: 3, //Maximum number of simultaneous reports from a single account get alphabetic () { return app.storage.read('alphabetic') === 'true' ? true : false; }, @@ -182,10 +182,10 @@ config.email = (function () { get first () { var tmp = app.storage.read('initialPeriod'); if (tmp === null) { - return 5; + return 10; } tmp = +tmp; - return isNaN(tmp) ? 5 : tmp; + return isNaN(tmp) ? 10 : tmp; }, set first (val) { val = +val; @@ -198,11 +198,12 @@ config.email = (function () { app.storage.write('initialPeriod', val); }, get period () { - return +app.storage.read('period') || 15; + return +app.storage.read('period') || 60; }, set period (val) { val = parseInt(val); app.storage.write('period', val > 10 ? val : 10); + config.on.emit('email.check.period'); }, get resetPeriod () { var tmp = +app.storage.read('resetPeriod'); @@ -227,6 +228,12 @@ config.notification = { set show (val) { app.storage.write('notification', val); }, + get combined () { + return app.storage.read('combined') === 'true' ? true : false; + }, + set combined (val) { + app.storage.write('combined', val); + }, sound: { get play () { return app.storage.read('alert') === 'false' ? false : true; @@ -242,35 +249,204 @@ config.notification = { val = val < 100 ? val : 100; app.storage.write('soundVolume', val); }, - get type () { // 0-3: built-in, 4: user defined - return +app.storage.read('soundNotification') || 0; - }, - set type (val) { - app.storage.write('soundNotification', val); - app.play.reset(); - }, - get original () { - return (this.type % 4) + '.wav'; - }, - custom: { - get file () { - return app.storage.read('sound_file'); + media: { + default: { + get type () { // 0-3: built-in, 4: user defined + return +app.storage.read('notification.sound.media.default.type') || 0; + }, + set type (val) { + app.storage.write('notification.sound.media.default.type', val); + if (val === 4) { + app.options.send('custom-sound', 'notification.sound.media.default.file'); + } + }, + get file () { + return app.storage.read('notification.sound.media.default.file'); + }, + set file (val) { + app.storage.write('notification.sound.media.default.file', val); + }, + get mime () { + return app.storage.read('notification.sound.media.default.mime'); + }, + set mime (val) { + app.storage.write('notification.sound.media.default.mime', val); + } }, - set file (val) { - app.storage.write('sound_file', val); - app.play.reset(); + custom0: { + get type () { // 0-3: built-in, 4: user defined + return +app.storage.read('notification.sound.media.custom0.type') || 0; + }, + set type (val) { + app.storage.write('notification.sound.media.custom0.type', val); + if (val === 4) { + app.options.send('custom-sound', 'notification.sound.media.custom0.file'); + } + }, + get file () { + return app.storage.read('notification.sound.media.custom0.file'); + }, + set file (val) { + app.storage.write('notification.sound.media.custom0.file', val); + }, + get mime () { + return app.storage.read('notification.sound.media.custom0.mime'); + }, + set mime (val) { + app.storage.write('notification.sound.media.custom0.mime', val); + }, + get filter () { + return app.storage.read('notification.sound.media.custom0.filter') || ''; + }, + set filter (val) { + app.storage.write('notification.sound.media.custom0.filter', val); + }, + get selector () { + return +app.storage.read('notification.sound.media.custom0.selector') || 0; + }, + set selector (val) { + app.storage.write('notification.sound.media.custom0.selector', val); + }, }, - get name () { - return app.storage.read('sound_name') || app.l10n('unknown'); + custom1: { + get type () { // 0-3: built-in, 4: user defined + return +app.storage.read('notification.sound.media.custom1.type') || 0; + }, + set type (val) { + app.storage.write('notification.sound.media.custom1.type', val); + if (val === 4) { + app.options.send('custom-sound', 'notification.sound.media.custom1.file'); + } + }, + get file () { + return app.storage.read('notification.sound.media.custom1.file'); + }, + set file (val) { + app.storage.write('notification.sound.media.custom1.file', val); + }, + get mime () { + return app.storage.read('notification.sound.media.custom1.mime'); + }, + set mime (val) { + app.storage.write('notification.sound.media.custom1.mime', val); + }, + get filter () { + return app.storage.read('notification.sound.media.custom1.filter') || ''; + }, + set filter (val) { + app.storage.write('notification.sound.media.custom1.filter', val); + }, + get selector () { + return +app.storage.read('notification.sound.media.custom1.selector') || 0; + }, + set selector (val) { + app.storage.write('notification.sound.media.custom1.selector', val); + } }, - set name (val) { - app.storage.write('sound_name', val); + custom2: { + get type () { // 0-3: built-in, 4: user defined + return +app.storage.read('notification.sound.media.custom2.type') || 0; + }, + set type (val) { + app.storage.write('notification.sound.media.custom2.type', val); + if (val === 4) { + app.options.send('custom-sound', 'notification.sound.media.custom2.file'); + } + }, + get file () { + return app.storage.read('notification.sound.media.custom2.file'); + }, + set file (val) { + app.storage.write('notification.sound.media.custom2.file', val); + }, + get mime () { + return app.storage.read('notification.sound.media.custom2.mime'); + }, + set mime (val) { + app.storage.write('notification.sound.media.custom2.mime', val); + }, + get filter () { + return app.storage.read('notification.sound.media.custom2.filter') || ''; + }, + set filter (val) { + app.storage.write('notification.sound.media.custom2.filter', val); + }, + get selector () { + return +app.storage.read('notification.sound.media.custom2.selector') || 0; + }, + set selector (val) { + app.storage.write('notification.sound.media.custom2.selector', val); + } }, - get mime () { - return app.storage.read('sound_mime'); + custom3: { + get type () { // 0-3: built-in, 4: user defined + return +app.storage.read('notification.sound.media.custom3.type') || 0; + }, + set type (val) { + app.storage.write('notification.sound.media.custom3.type', val); + if (val === 4) { + app.options.send('custom-sound', 'notification.sound.media.custom3.file'); + } + }, + get file () { + return app.storage.read('notification.sound.media.custom3.file'); + }, + set file (val) { + app.storage.write('notification.sound.media.custom3.file', val); + }, + get mime () { + return app.storage.read('notification.sound.media.custom3.mime'); + }, + set mime (val) { + app.storage.write('notification.sound.media.custom3.mime', val); + }, + get filter () { + return app.storage.read('notification.sound.media.custom3.filter') || ''; + }, + set filter (val) { + app.storage.write('notification.sound.media.custom3.filter', val); + }, + get selector () { + return +app.storage.read('notification.sound.media.custom3.selector') || 0; + }, + set selector (val) { + app.storage.write('notification.sound.media.custom3.selector', val); + } }, - set mime (val) { - app.storage.write('sound_mime', val); + custom4: { + get type () { // 0-3: built-in, 4: user defined + return +app.storage.read('notification.sound.media.custom4.type') || 0; + }, + set type (val) { + app.storage.write('notification.sound.media.custom4.type', val); + if (val === 4) { + app.options.send('custom-sound', 'notification.sound.media.custom4.file'); + } + }, + get file () { + return app.storage.read('notification.sound.media.custom4.file'); + }, + set file (val) { + app.storage.write('notification.sound.media.custom4.file', val); + }, + get mime () { + return app.storage.read('notification.sound.media.custom4.mime'); + }, + set mime (val) { + app.storage.write('notification.sound.media.custom4.mime', val); + }, + get filter () { + return app.storage.read('notification.sound.media.custom4.filter') || ''; + }, + set filter (val) { + app.storage.write('notification.sound.media.custom4.filter', val); + }, + get selector () { + return +app.storage.read('notification.sound.media.custom4.selector') || 0; + }, + set selector (val) { + app.storage.write('notification.sound.media.custom4.selector', val); + } } } }, @@ -287,7 +463,23 @@ config.notification = { val = +val; app.storage.write('notificationTime', val > 3 ? val : 3); }, - silent: false, + get silentTime () { + return +app.storage.read('silentTime') || 10; // in minutes + }, + set silentTime (val) { + val = +val; + val = val > 1 ? val : 1; + val = val < 1000 ? val : 1000; + app.storage.write('silentTime', val); + }, + _silent: false, + get silent () { + return config.notification._silent; + }, + set silent (val) { + config.notification._silent = val; + app.button.onState(); + }, safari: { get oneTime () { return app.storage.read('safari-onetime') === 'false' ? false : true; @@ -473,7 +665,13 @@ config.popup = { }, set keyUp (val) { app.storage.write('keyUp', val); - } + }, + get populate () { // populate popup in background after a minute + return app.storage.read('populate') === 'false' ? false : true; + }, + set populate (val) { + app.storage.write('populate', val); + }, }; config.tabs = { @@ -483,6 +681,12 @@ config.tabs = { set search (val) { app.storage.write('searchMode', val); }, + get ignoreOpens () { // true: ignore opened Gmail tabs + return app.storage.read('ignoreOpens') === 'true' ? true : false; + }, + set ignoreOpens (val) { + app.storage.write('ignoreOpens', val); + }, get NotifyGmailIsOpen () { return app.storage.read('onGmailNotification') === 'false' ? false : true; }, diff --git a/v1/src/lib/utils/gmail.js b/v1/src/lib/utils/gmail.js new file mode 100644 index 00000000..58d03072 --- /dev/null +++ b/v1/src/lib/utils/gmail.js @@ -0,0 +1,141 @@ +'use strict'; + +var isFirefox = typeof require !== 'undefined'; +if (isFirefox) { + var app = require('../wrapper/firefox/app'); + var config = require('../config'); + var render = require('./render'); +} + +var gmail = typeof exports === 'undefined' ? {} : exports; + +gmail.body = (function () { + var iks = {}, contents = {}; + + function getIK (url) { + if (iks[url]) { + return app.Promise.resolve(iks[url]); + } + return new app.get(url).then(function (req) { + var tmp = /var GLOBALS\=\[(?:([^\,]*)\,){10}/.exec(req.responseText || ''); + var ik = tmp && tmp.length > 1 ? tmp[1].replace(/[\"\']/g, '') : null; + if (ik) { + iks[url] = ik; + return ik; + } + else { + return Error( + 'gmail.js -> body -> getIK -> ' + + 'Error at resolving user\'s static ID. Please switch back to the summary mode.' + ); + } + }); + } + + return function (link) { + link = link.replace('http://', 'https://'); + if (contents[link]) { + return app.Promise.resolve(contents[link]); + } + + var url = /[^\?]*/.exec(link)[0] + '/?ibxr=0'; + var thread = /message\_id\=([^\&]*)/.exec(link); + + if (!thread || !thread.length) { + return app.Promise.reject(Error( + 'gmail.js -> body -> Error at resolving thread. Please switch back to the summary mode.' + )); + } + return getIK(url).then(function (ik) { + return new app.get(url + '?ui=2&ik=' + ik + '&view=pt&dsqt=1&search=all&msg=' + thread[1]) + .then(function (req) { + if (req.status !== 200) { + return '...'; + } + var body = render[config.popup.display ? 'getHTMLText' : 'getPlainText'](req, url, link); + contents[link] = body; + return body; + }); + }); + }; +})(); + +/** + * Send archive, mark as read, mark as unread, and trash commands to Gmail server + * @param {String} link, xml.link address + * @param {String} cmd: rd, ur, rc_%5Ei, tr, sp + */ +gmail.action = (function () { + function getAt2 (url) { + return new app.get(url + 'h/' + Math.ceil(1000000 * Math.random())).then (function (req) { + if (!req) { + return Error('gmail.js -> action -> getAt2 -> server response is empty.'); + } + if (req.status === 200) { + var tmp = /at\=([^\"\&]*)/.exec(req.responseText); + return tmp && tmp.length > 1 ? tmp[1] : null; + } + else { + return Error('gmail.js -> action -> getAt2 -> got status of ' + req.status); + } + }); + } + function getAt (url) { + return new app.get(url).then(function (req) { + if (!req) { + return Error('gmail.js -> action -> getAt -> server response is empty.'); + } + if (req.status === 200) { + var tmp = /GM_ACTION_TOKEN\=\"([^\"]*)\"/.exec(req.responseText); + if (tmp && tmp.length) { + return tmp[1]; + } + else { + return getAt2(url); + } + } + else { + return Error('gmail.js -> action -> getAt -> got status of ' + req.status); + } + }); + } + + function sendCmd (url, at, threads, cmd) { + if (cmd === 'rc_%5Ei' && config.email.doReadOnArchive) { + sendCmd(url, at, threads, 'rd'); + } + var u = url + '&at=' + at + '&act=' + cmd.replace('rd-all', 'rd'); + u += '&t=' + threads.join('&t='); + + return new app.get(u).then(function (req) { + if (!req) { + return Error('gmail.js -> action -> sendCmd -> server response is empty.'); + } + if (req.status === 200) { + return true; + } + return Error('gmail.js -> action -> sendCmd -> got status of ' + req.status); + }); + } + + return function (links, cmd) { + links = typeof(links) === 'string' ? [links] : links; + var url = /[^\?]*/.exec(links[0])[0] + '/?ibxr=0'; + return getAt(url).then(function (at) { + if (at instanceof Error) { + return app.Promise.reject(at); + } + var threads = []; + links.forEach(function (link) { + var thread = /message\_id\=([^\&]*)/.exec(link); + if (thread && thread.length) { + threads.push(thread[1]); + } + }); + if (threads.length) { + return sendCmd(url, at, threads, cmd); + } + return app.Promise.reject(Error('gmail.js -> action -> Error at resolving thread.')); + }); + }; +})(); diff --git a/src/lib/utils/render.js b/v1/src/lib/utils/render.js similarity index 93% rename from src/lib/utils/render.js rename to v1/src/lib/utils/render.js index f97bafe2..c77161c1 100644 --- a/src/lib/utils/render.js +++ b/v1/src/lib/utils/render.js @@ -54,7 +54,7 @@ render.getHTMLText = function (req, link, feed) { .innerHTML .replace(/src\=\"\/mail\/u\//g, 'src="https://mail.google.com/mail/u/') .replace(/\?ui\=2\&/g, link + '?ui=2&') - .replace(/\/g, '') + .replace(//g, '') .replace(/display\:none\!important\;/g, '') .replace('[Quoted text hidden]', '[Quoted text hidden]'); } @@ -65,12 +65,16 @@ render.getHTMLText = function (req, link, feed) { else { var body = getLastMessage(req.responseText); return body ? - body.innerHTML.replace('[Quoted text hidden]', '[Quoted text hidden]') : + 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]') : req.responseText; } }; -render.getPlainText = function (req, link, feed) { +render.getPlainText = function (req) { var body = getLastMessage(req.responseText) || '...'; var normalize = function (a) { diff --git a/builds/unpacked/firefox/lib/utils/server.js b/v1/src/lib/utils/server.js similarity index 88% rename from builds/unpacked/firefox/lib/utils/server.js rename to v1/src/lib/utils/server.js index 13c80829..9a0c36b2 100644 --- a/builds/unpacked/firefox/lib/utils/server.js +++ b/v1/src/lib/utils/server.js @@ -9,7 +9,7 @@ else { } // -server.Parser = function(req, feed) { +server.Parser = function(req, feed, isPrivate) { var xml; if (req.responseXML) { xml = req.responseXML; @@ -20,9 +20,9 @@ server.Parser = function(req, feed) { } //Sometimes id is wrong in the feed structure! function fixID (link) { - var id = /u\/\d/.exec(feed); - if (id.length) { - return link.replace(/u\/\d/, id[0]); + var id = /u\/\d+/.exec(feed); + if (id && id.length) { + return link.replace(/u\/\d+/, id[0]); }; return link; } @@ -70,6 +70,10 @@ server.Parser = function(req, feed) { temp += "/?shva=1#label/" + label; } } catch(e) {} + // account selector uses this url as account identifier + if (isPrivate) { + temp += '@private'; + } return temp; }, @@ -121,6 +125,7 @@ server.Parser = function(req, feed) { get link () { var temp = entry.getElementsByTagName("link")[0].getAttribute("href").replace("http://", "https://"); temp = fixID (temp); + return temp; } } @@ -134,26 +139,26 @@ server.Parser = function(req, feed) { } } -server.Email = function (feed, timeout) { +server.Email = function (feed, timeout, isPrivate) { var d, ids = [], pCount = 0; - return { execute: function () { d = app.Promise.defer(); - var url = feed + "?rand=" + Math.round(Math.random() * 10000000); - new app.get(url, null, null, timeout).then( + var url = feed + '?rand=' + Math.round(Math.random() * 10000000); + new app.get(url, null, null, timeout, isPrivate).then( function (req) { if (req.status != 200) { return d.resolve({ + isPrivate: isPrivate, network: req.status !== 0, notAuthorized: req.status === 401, xml: null, newIDs: [] }); } - var xml = new server.Parser(req, feed); + var xml = new server.Parser(req, feed, isPrivate); //Cleaning old entries - var cIDs = xml.entries + var cIDs = (xml.entries || []) .filter(function (e) { var age = ((new Date()).getTime() - (new Date(e.modified)).getTime()); return age < 1000 * 60 * config.email.threatAsNew; @@ -171,13 +176,16 @@ server.Email = function (feed, timeout) { } pCount = xml.fullcount; d.resolve({ + isPrivate: isPrivate, network: true, notAuthorized: false, xml: xml, newIDs: newIDs }); } - ); + ).catch(function (e) { + d.reject(e) + }); return d.promise; }, reject: function () { diff --git a/src/lib/utils/tab.js b/v1/src/lib/utils/tab.js similarity index 100% rename from src/lib/utils/tab.js rename to v1/src/lib/utils/tab.js diff --git a/builds/unpacked/firefox/lib/utils/timer.js b/v1/src/lib/utils/timer.js similarity index 88% rename from builds/unpacked/firefox/lib/utils/timer.js rename to v1/src/lib/utils/timer.js index 7066d292..dc9bbb52 100644 --- a/builds/unpacked/firefox/lib/utils/timer.js +++ b/v1/src/lib/utils/timer.js @@ -1,14 +1,18 @@ +'use strict'; + +var app = app || require('../wrapper/firefox/app'); +var timer; + var isFirefox = typeof require !== 'undefined'; if (isFirefox) { - app = require('../wrapper/firefox/app'); timer = exports; } else { - var timer = {}; + timer = {}; } /** Repeater: Repeats a function infinity with an interval pattern - * Example: + * Example: * var repeater = new repeater(1000, 10000, 2000); * var i = 0; * repeater.on(function () { @@ -41,7 +45,7 @@ timer.repeater = function () { catch (e) {} }, t, arguments); } - + return { reset: function () { stop(); @@ -56,9 +60,9 @@ timer.repeater = function () { fill: function () { intervals = [].slice.call(arguments, 0); } - } -} + }; +}; timer.setTimeout = app.timer.setTimeout; timer.clearTimeout = app.timer.clearTimeout; -timer.setInterval = app.timer.setInterval; \ No newline at end of file +timer.setInterval = app.timer.setInterval; diff --git a/v1/src/lib/wrapper/chrome/EventEmitter.js b/v1/src/lib/wrapper/chrome/EventEmitter.js new file mode 100644 index 00000000..818df02d --- /dev/null +++ b/v1/src/lib/wrapper/chrome/EventEmitter.js @@ -0,0 +1,472 @@ +/*! + * EventEmitter v4.2.11 - git.io/ee + * Unlicense - http://unlicense.org/ + * Oliver Caldwell - http://oli.me.uk/ + * @preserve + */ + +;(function () { + 'use strict'; + + /** + * Class for managing events. + * Can be extended to provide event functionality in other classes. + * + * @class EventEmitter Manages event registering and emitting. + */ + function EventEmitter() {} + + // Shortcuts to improve speed and size + var proto = EventEmitter.prototype; + var exports = this; + var originalGlobalValue = exports.EventEmitter; + + /** + * Finds the index of the listener for the event in its storage array. + * + * @param {Function[]} listeners Array of listeners to search through. + * @param {Function} listener Method to look for. + * @return {Number} Index of the specified listener, -1 if not found + * @api private + */ + function indexOfListener(listeners, listener) { + var i = listeners.length; + while (i--) { + if (listeners[i].listener === listener) { + return i; + } + } + + return -1; + } + + /** + * Alias a method while keeping the context correct, to allow for overwriting of target method. + * + * @param {String} name The name of the target method. + * @return {Function} The aliased method + * @api private + */ + function alias(name) { + return function aliasClosure() { + return this[name].apply(this, arguments); + }; + } + + /** + * Returns the listener array for the specified event. + * Will initialise the event object and listener arrays if required. + * Will return an object if you use a regex search. The object contains keys for each matched event. So /ba[rz]/ might return an object containing bar and baz. But only if you have either defined them with defineEvent or added some listeners to them. + * Each property in the object response is an array of listener functions. + * + * @param {String|RegExp} evt Name of the event to return the listeners from. + * @return {Function[]|Object} All listener functions for the event. + */ + proto.getListeners = function getListeners(evt) { + var events = this._getEvents(); + var response; + var key; + + // Return a concatenated array of all matching events if + // the selector is a regular expression. + if (evt instanceof RegExp) { + response = {}; + for (key in events) { + if (events.hasOwnProperty(key) && evt.test(key)) { + response[key] = events[key]; + } + } + } + else { + response = events[evt] || (events[evt] = []); + } + + return response; + }; + + /** + * Takes a list of listener objects and flattens it into a list of listener functions. + * + * @param {Object[]} listeners Raw listener objects. + * @return {Function[]} Just the listener functions. + */ + proto.flattenListeners = function flattenListeners(listeners) { + var flatListeners = []; + var i; + + for (i = 0; i < listeners.length; i += 1) { + flatListeners.push(listeners[i].listener); + } + + return flatListeners; + }; + + /** + * Fetches the requested listeners via getListeners but will always return the results inside an object. This is mainly for internal use but others may find it useful. + * + * @param {String|RegExp} evt Name of the event to return the listeners from. + * @return {Object} All listener functions for an event in an object. + */ + proto.getListenersAsObject = function getListenersAsObject(evt) { + var listeners = this.getListeners(evt); + var response; + + if (listeners instanceof Array) { + response = {}; + response[evt] = listeners; + } + + return response || listeners; + }; + + /** + * Adds a listener function to the specified event. + * The listener will not be added if it is a duplicate. + * If the listener returns true then it will be removed after it is called. + * If you pass a regular expression as the event name then the listener will be added to all events that match it. + * + * @param {String|RegExp} evt Name of the event to attach the listener to. + * @param {Function} listener Method to be called when the event is emitted. If the function returns true then it will be removed after calling. + * @return {Object} Current instance of EventEmitter for chaining. + */ + proto.addListener = function addListener(evt, listener) { + var listeners = this.getListenersAsObject(evt); + var listenerIsWrapped = typeof listener === 'object'; + var key; + + for (key in listeners) { + if (listeners.hasOwnProperty(key) && indexOfListener(listeners[key], listener) === -1) { + listeners[key].push(listenerIsWrapped ? listener : { + listener: listener, + once: false + }); + } + } + + return this; + }; + + /** + * Alias of addListener + */ + proto.on = alias('addListener'); + + /** + * Semi-alias of addListener. It will add a listener that will be + * automatically removed after its first execution. + * + * @param {String|RegExp} evt Name of the event to attach the listener to. + * @param {Function} listener Method to be called when the event is emitted. If the function returns true then it will be removed after calling. + * @return {Object} Current instance of EventEmitter for chaining. + */ + proto.addOnceListener = function addOnceListener(evt, listener) { + return this.addListener(evt, { + listener: listener, + once: true + }); + }; + + /** + * Alias of addOnceListener. + */ + proto.once = alias('addOnceListener'); + + /** + * Defines an event name. This is required if you want to use a regex to add a listener to multiple events at once. If you don't do this then how do you expect it to know what event to add to? Should it just add to every possible match for a regex? No. That is scary and bad. + * You need to tell it what event names should be matched by a regex. + * + * @param {String} evt Name of the event to create. + * @return {Object} Current instance of EventEmitter for chaining. + */ + proto.defineEvent = function defineEvent(evt) { + this.getListeners(evt); + return this; + }; + + /** + * Uses defineEvent to define multiple events. + * + * @param {String[]} evts An array of event names to define. + * @return {Object} Current instance of EventEmitter for chaining. + */ + proto.defineEvents = function defineEvents(evts) { + for (var i = 0; i < evts.length; i += 1) { + this.defineEvent(evts[i]); + } + return this; + }; + + /** + * Removes a listener function from the specified event. + * When passed a regular expression as the event name, it will remove the listener from all events that match it. + * + * @param {String|RegExp} evt Name of the event to remove the listener from. + * @param {Function} listener Method to remove from the event. + * @return {Object} Current instance of EventEmitter for chaining. + */ + proto.removeListener = function removeListener(evt, listener) { + var listeners = this.getListenersAsObject(evt); + var index; + var key; + + for (key in listeners) { + if (listeners.hasOwnProperty(key)) { + index = indexOfListener(listeners[key], listener); + + if (index !== -1) { + listeners[key].splice(index, 1); + } + } + } + + return this; + }; + + /** + * Alias of removeListener + */ + proto.off = alias('removeListener'); + + /** + * Adds listeners in bulk using the manipulateListeners method. + * If you pass an object as the second argument you can add to multiple events at once. The object should contain key value pairs of events and listeners or listener arrays. You can also pass it an event name and an array of listeners to be added. + * You can also pass it a regular expression to add the array of listeners to all events that match it. + * Yeah, this function does quite a bit. That's probably a bad thing. + * + * @param {String|Object|RegExp} evt An event name if you will pass an array of listeners next. An object if you wish to add to multiple events at once. + * @param {Function[]} [listeners] An optional array of listener functions to add. + * @return {Object} Current instance of EventEmitter for chaining. + */ + proto.addListeners = function addListeners(evt, listeners) { + // Pass through to manipulateListeners + return this.manipulateListeners(false, evt, listeners); + }; + + /** + * Removes listeners in bulk using the manipulateListeners method. + * If you pass an object as the second argument you can remove from multiple events at once. The object should contain key value pairs of events and listeners or listener arrays. + * You can also pass it an event name and an array of listeners to be removed. + * You can also pass it a regular expression to remove the listeners from all events that match it. + * + * @param {String|Object|RegExp} evt An event name if you will pass an array of listeners next. An object if you wish to remove from multiple events at once. + * @param {Function[]} [listeners] An optional array of listener functions to remove. + * @return {Object} Current instance of EventEmitter for chaining. + */ + proto.removeListeners = function removeListeners(evt, listeners) { + // Pass through to manipulateListeners + return this.manipulateListeners(true, evt, listeners); + }; + + /** + * Edits listeners in bulk. The addListeners and removeListeners methods both use this to do their job. You should really use those instead, this is a little lower level. + * The first argument will determine if the listeners are removed (true) or added (false). + * If you pass an object as the second argument you can add/remove from multiple events at once. The object should contain key value pairs of events and listeners or listener arrays. + * You can also pass it an event name and an array of listeners to be added/removed. + * You can also pass it a regular expression to manipulate the listeners of all events that match it. + * + * @param {Boolean} remove True if you want to remove listeners, false if you want to add. + * @param {String|Object|RegExp} evt An event name if you will pass an array of listeners next. An object if you wish to add/remove from multiple events at once. + * @param {Function[]} [listeners] An optional array of listener functions to add/remove. + * @return {Object} Current instance of EventEmitter for chaining. + */ + proto.manipulateListeners = function manipulateListeners(remove, evt, listeners) { + var i; + var value; + var single = remove ? this.removeListener : this.addListener; + var multiple = remove ? this.removeListeners : this.addListeners; + + // If evt is an object then pass each of its properties to this method + if (typeof evt === 'object' && !(evt instanceof RegExp)) { + for (i in evt) { + if (evt.hasOwnProperty(i) && (value = evt[i])) { + // Pass the single listener straight through to the singular method + if (typeof value === 'function') { + single.call(this, i, value); + } + else { + // Otherwise pass back to the multiple function + multiple.call(this, i, value); + } + } + } + } + else { + // So evt must be a string + // And listeners must be an array of listeners + // Loop over it and pass each one to the multiple method + i = listeners.length; + while (i--) { + single.call(this, evt, listeners[i]); + } + } + + return this; + }; + + /** + * Removes all listeners from a specified event. + * If you do not specify an event then all listeners will be removed. + * That means every event will be emptied. + * You can also pass a regex to remove all events that match it. + * + * @param {String|RegExp} [evt] Optional name of the event to remove all listeners for. Will remove from every event if not passed. + * @return {Object} Current instance of EventEmitter for chaining. + */ + proto.removeEvent = function removeEvent(evt) { + var type = typeof evt; + var events = this._getEvents(); + var key; + + // Remove different things depending on the state of evt + if (type === 'string') { + // Remove all listeners for the specified event + delete events[evt]; + } + else if (evt instanceof RegExp) { + // Remove all events matching the regex. + for (key in events) { + if (events.hasOwnProperty(key) && evt.test(key)) { + delete events[key]; + } + } + } + else { + // Remove all listeners in all events + delete this._events; + } + + return this; + }; + + /** + * Alias of removeEvent. + * + * Added to mirror the node API. + */ + proto.removeAllListeners = alias('removeEvent'); + + /** + * Emits an event of your choice. + * When emitted, every listener attached to that event will be executed. + * If you pass the optional argument array then those arguments will be passed to every listener upon execution. + * Because it uses `apply`, your array of arguments will be passed as if you wrote them out separately. + * So they will not arrive within the array on the other side, they will be separate. + * You can also pass a regular expression to emit to all events that match it. + * + * @param {String|RegExp} evt Name of the event to emit and execute listeners for. + * @param {Array} [args] Optional array of arguments to be passed to each listener. + * @return {Object} Current instance of EventEmitter for chaining. + */ + proto.emitEvent = function emitEvent(evt, args) { + var listeners = this.getListenersAsObject(evt); + var listener; + var i; + var key; + var response; + + for (key in listeners) { + if (listeners.hasOwnProperty(key)) { + i = listeners[key].length; + + while (i--) { + // If the listener returns true then it shall be removed from the event + // The function is executed either with a basic call or an apply if there is an args array + listener = listeners[key][i]; + + if (listener.once === true) { + this.removeListener(evt, listener.listener); + } + + response = listener.listener.apply(this, args || []); + + if (response === this._getOnceReturnValue()) { + this.removeListener(evt, listener.listener); + } + } + } + } + + return this; + }; + + /** + * Alias of emitEvent + */ + proto.trigger = alias('emitEvent'); + + /** + * Subtly different from emitEvent in that it will pass its arguments on to the listeners, as opposed to taking a single array of arguments to pass on. + * As with emitEvent, you can pass a regex in place of the event name to emit to all events that match it. + * + * @param {String|RegExp} evt Name of the event to emit and execute listeners for. + * @param {...*} Optional additional arguments to be passed to each listener. + * @return {Object} Current instance of EventEmitter for chaining. + */ + proto.emit = function emit(evt) { + var args = Array.prototype.slice.call(arguments, 1); + return this.emitEvent(evt, args); + }; + + /** + * Sets the current value to check against when executing listeners. If a + * listeners return value matches the one set here then it will be removed + * after execution. This value defaults to true. + * + * @param {*} value The new value to check for when executing listeners. + * @return {Object} Current instance of EventEmitter for chaining. + */ + proto.setOnceReturnValue = function setOnceReturnValue(value) { + this._onceReturnValue = value; + return this; + }; + + /** + * Fetches the current value to check against when executing listeners. If + * the listeners return value matches this one then it should be removed + * automatically. It will return true by default. + * + * @return {*|Boolean} The current value to check for or the default, true. + * @api private + */ + proto._getOnceReturnValue = function _getOnceReturnValue() { + if (this.hasOwnProperty('_onceReturnValue')) { + return this._onceReturnValue; + } + else { + return true; + } + }; + + /** + * Fetches the events object and creates one if required. + * + * @return {Object} The events storage object. + * @api private + */ + proto._getEvents = function _getEvents() { + return this._events || (this._events = {}); + }; + + /** + * Reverts the global {@link EventEmitter} to its previous value and returns a reference to this version. + * + * @return {Function} Non conflicting EventEmitter class. + */ + EventEmitter.noConflict = function noConflict() { + exports.EventEmitter = originalGlobalValue; + return EventEmitter; + }; + + // Expose the class either via AMD, CommonJS or the global object + if (typeof define === 'function' && define.amd) { + define(function () { + return EventEmitter; + }); + } + else if (typeof module === 'object' && module.exports){ + module.exports = EventEmitter; + } + else { + exports.EventEmitter = EventEmitter; + } +}.call(this)); diff --git a/v1/src/lib/wrapper/chrome/app.js b/v1/src/lib/wrapper/chrome/app.js new file mode 100644 index 00000000..10ea0659 --- /dev/null +++ b/v1/src/lib/wrapper/chrome/app.js @@ -0,0 +1,556 @@ +/* globals config, chrome */ +'use strict'; + +var app = new EventEmitter(); +var userActions = []; + +app.once('load', function () { + var script = document.createElement('script'); + document.body.appendChild(script); + script.src = '../../common.js'; +}); + +/* exports */ +if (!Promise.defer) { + Promise.defer = function () { + var deferred = {}; + var promise = new Promise(function (resolve, reject) { + deferred.resolve = resolve; + deferred.reject = reject; + }); + deferred.promise = promise; + return deferred; + }; +} +app.Promise = Promise; + +app.actions = function (callback) { + userActions.push(callback); +}; +chrome.notifications.onClicked.addListener(function (id) { + chrome.notifications.clear(id, function () {}); + userActions.forEach(function (callback) { + callback(); + }); + if (app.notify[id]) { + app.notify[id](); + } +}); + +app.button = (function () { + var callback; + var onContext; + var ids = {childs: []}; + chrome.browserAction.onClicked.addListener(function () { + if (callback) { + callback(); + } + }); + + return { + onCommand: function (c) { + callback = c; + }, + onContext: function (c) { + onContext = c; + ids.root = chrome.contextMenus.create({ + title: app.l10n('label_14'), + contexts: ['browser_action'], + enabled: false + }); + ids.disable = chrome.contextMenus.create({ + title: app.l10n('label_3'), + contexts: ['browser_action'] + }); + chrome.contextMenus.create({ + parentId: ids.disable, + title: app.l10n('label_4'), + contexts: ['browser_action'], + onclick: function () { + onContext.silent(300); + } + }); + chrome.contextMenus.create({ + parentId: ids.disable, + title: app.l10n('label_5'), + contexts: ['browser_action'], + onclick: function () { + onContext.silent(900); + } + }); + chrome.contextMenus.create({ + parentId: ids.disable, + title: app.l10n('label_6'), + contexts: ['browser_action'], + onclick: function () { + onContext.silent(1800); + } + }); + chrome.contextMenus.create({ + parentId: ids.disable, + title: app.l10n('label_7'), + contexts: ['browser_action'], + onclick: function () { + onContext.silent(3600); + } + }); + chrome.contextMenus.create({ + parentId: ids.disable, + title: app.l10n('label_8'), + contexts: ['browser_action'], + onclick: function () { + onContext.silent(7200); + } + }); + chrome.contextMenus.create({ + parentId: ids.disable, + title: app.l10n('label_9'), + contexts: ['browser_action'], + onclick: function () { + onContext.silent(18000); + } + }); + chrome.contextMenus.create({ + parentId: ids.disable, + title: app.l10n('label_13'), + contexts: ['browser_action'], + onclick: function () { + onContext.silent('custom'); + } + }); + ids.silent = chrome.contextMenus.create({ + title: app.l10n('label_10'), + type: 'checkbox', + checked: onContext.state, + contexts: ['browser_action'], + onclick: function () { + onContext.silent(); + } + }); + chrome.contextMenus.create({ + title: app.l10n('label_11'), + contexts: ['browser_action'], + onclick: onContext.compose + }); + chrome.contextMenus.create({ + title: app.l10n('label_1'), + contexts: ['browser_action'], + onclick: onContext.refresh + }); + chrome.contextMenus.create({ + title: app.l10n('label_12'), + contexts: ['browser_action'], + onclick: onContext.faq + }); + }, + fireContext: function () { + ids.childs.forEach(function (obj) { + chrome.contextMenus.remove(obj.id); + }); + ids.childs = []; + var accounts = onContext.accounts; + if (accounts.length === 1) { + chrome.contextMenus.update(ids.root, { + title: accounts[0].label, + onclick: accounts[0].command + }); + } + else { + chrome.contextMenus.update(ids.root, { + title: app.l10n('label_14'), + onclick: null + }, () => { + accounts.forEach(function (obj) { + ids.childs.push({ + name: obj.name, + id: chrome.contextMenus.create({ + parentId: ids.root, + contexts: ['browser_action'], + title: obj.label, + onclick: obj.command + }) + }); + }); + }); + } + chrome.contextMenus.update(ids.root, { + enabled: accounts.length !== 0 + }); + }, + onState: function () { + chrome.contextMenus.update(ids.silent, { + checked: onContext.state + }); + }, + onClick: function () {}, + set label (val) { // jshint ignore:line + chrome.browserAction.setTitle({ + title: val + }); + }, + set badge (val) { // jshint ignore:line + chrome.browserAction.setBadgeText({ + text: (val ? val : '') + '' + }); + }, + set color (val) { // jshint ignore:line + chrome.browserAction.setIcon({ + path: '/data/icons/' + val + '/19.png' + }); + } + }; +})(); + +app.popup = (function () { + return { + show: function () { }, + hide: function () { + var popup = chrome.extension.getViews({type:'popup'})[0]; + if (popup) { + popup.close(); + } + }, + attach: function () { + chrome.browserAction.setPopup({ + popup: 'data/popup/index.html' + }); + }, + detach: function () { + this.hide(); + chrome.browserAction.setPopup({ + popup: '' + }); + }, + send: function (id, data) { + chrome.extension.sendRequest({method: id, data: data}); + }, + receive: function (id, callback) { + chrome.extension.onRequest.addListener(function (request, sender) { + if (request.method === id && !sender.tab) { + callback(request.data); + } + }); + } + }; +})(); + +app.timer = window; + +app.get = function (url, headers, data, timeout) { + headers = headers || {}; + + var xhr = new XMLHttpRequest(); + var d = app.Promise.defer(); + xhr.onreadystatechange = function () { + if (xhr.readyState === 4) { + d.resolve(xhr); + } + }; + xhr.open(data ? 'POST' : 'GET', url, true); + for (var id in headers) { + xhr.setRequestHeader(id, headers[id]); + } + if (data) { + var arr = []; + for (var e in data) { + arr.push(e + '=' + data[e]); + } + data = arr.join('&'); + } + xhr.timeout = timeout; + xhr.send(data ? data : ''); + return d.promise; +}; + +app.parser = function () { + return new DOMParser(); +}; + +app.l10n = function (id) { + return chrome.i18n.getMessage(id); +}; + +app.windows = (function () { + function toWindow (win) { + return { + obj: win, + focus: function () { + chrome.windows.update(win.id, { + focused: true + }); + } + }; + } + function toTab(tab) { + return { + get url () { + return tab.url; + }, + set url (val) { + chrome.tabs.update(tab.id, { + url: val + }); + }, + activate: function () { + chrome.tabs.update(tab.id, { + active: true + }); + }, + window: function () { + var d = app.Promise.defer(); + chrome.windows.get(tab.windowId, {}, function (win) { + d.resolve(toWindow(win)); + }); + return d.promise; + }, + get active () { + return tab.active; + }, + close: function () { + tab.close(); + } + }; + } + return { + active: function () { + var d = app.Promise.defer(); + chrome.windows.getCurrent({}, function (win) { + d.resolve(toWindow(win)); + }); + return d.promise; + }, + open: function (url, inBackground) { + chrome.windows.create({ + url: url, + focused: !inBackground + }); + }, + tabs: { + list: function (currentWindow) { + var d = app.Promise.defer(); + chrome.tabs.query({ + currentWindow: currentWindow + }, function (tabs) { + d.resolve(tabs.map(toTab)); + }); + return d.promise; + }, + active: function () { + var d = app.Promise.defer(); + chrome.tabs.query({ + active: true, + currentWindow: true + }, function (tabs) { + d.resolve(tabs && tabs.length ? toTab(tabs[0]) : null); + }); + return d.promise; + }, + open: function (url, inBackground) { + chrome.tabs.query({ + active: true, + currentWindow: true + }, function (tabs) { + (function () { + if (config.tabs.open.relatedToCurrent || !config.tabs.open.useBlankTabs) { + return app.Promise.resolve(null); + } + else { + return app.windows.tabs.list(true).then(function (tabs) { + return tabs.reduce(function (p, c) { + return p || (c.url === 'chrome://newtab/' ? c : null); + }, null); + }); + } + })().then(function (t) { + if (t) { + t.url = url; + if (!inBackground) { + t.activate(); + } + } + else { + chrome.tabs.create({ + url: url, + index: config.tabs.open.relatedToCurrent && tabs && tabs.length ? tabs[0].index + 1 : null, + active: !inBackground + }); + } + }); + }); + } + } + }; +})(); + +app.notify = function (text, title, callback) { + title = title || app.l10n('gmail'); + if (config.notification.silent) { + return; + } + var isArray = Array.isArray(text); + if (isArray && text.length === 1) { + isArray = false; + text = text[0]; + } + + chrome.notifications.create(null, { + type: isArray ? 'list' : 'basic', + iconUrl: '/data/icons/notification/48.png', + title: title, + message: isArray ? '' : text, + priority: 2, + eventTime: Date.now() + 30000, + items: isArray ? text.map(function (message) { + var tmp = message.split('\n'); + return { + title: tmp[1].replace('Title: ', ''), + message: tmp[0].replace('From: ', '') + }; + }): [], + isClickable: true, + requireInteraction: true + }, function (id) { + app.notify[id] = callback; + window.setTimeout(function (id) { + app.notify[id] = null; + chrome.notifications.clear(id, function () {}); + }, config.notification.time * 1000, id); + }); +}; + +app.sound = (function () { + var audio = document.createElement('audio'); + audio.setAttribute('preload', 'auto'); + audio.setAttribute('autobuffer', 'true'); + + return { + play: function (index) { + if (config.notification.silent) { + return; + } + var type = index === null ? config.notification.sound.media.default.type : config.notification.sound.media['custom' + index].type; + var path = '../../../data/sounds/' + type + '.wav'; + if (type === 4) { + path = index === null ? config.notification.sound.media.default.file : config.notification.sound.media['custom' + index].file; + } + audio.src = path; + audio.volume = config.notification.sound.volume / 100; + audio.play(); + }, + stop: function () { + audio.pause(); + audio.currentTime = 0; + } + }; +})(); + +app.version = function () { + return chrome[chrome.runtime && chrome.runtime.getManifest ? 'runtime' : 'extension'].getManifest().version; +}; + +app.startup = function (c) { + c(); +}; + +app.unload = (function () { + var callbacks = []; + window.addEventListener('unload', function () { + callbacks.forEach(function (c) { + c(); + }); + }, false); + return function (c) { + callbacks.push(c); + }; +})(); + +app.options = { + send: function (id, data) { + chrome.tabs.query({}, function (tabs) { + tabs.forEach(function (tab) { + chrome.tabs.sendMessage(tab.id, {method: id, data: data}, function () {}); + }); + }); + }, + receive: function (id, callback) { + chrome.extension.onRequest.addListener(function (request, sender) { + if (request.method === id && sender.tab) { + callback(request.data); + } + }); + } +}; + +app.storage = (function () { + var objs = {}; + chrome.storage.local.get(null, function (o) { + objs = o; + app.emit('load'); + }); + return { + read: function (id) { + return (objs[id] || !isNaN(objs[id])) ? objs[id] + '' : objs[id]; + }, + write: function (id, data) { + objs[id] = data; + var tmp = {}; + tmp[id] = data; + chrome.storage.local.set(tmp, function () {}); + } + }; +})(); + +app.manifest = { + url: chrome.extension.getURL('') +}; + +app.tray = { + set: function () {}, + remove: function () {}, + callback: function () {} +}; + +app.contentScript = (function () { + return { + send: function (id, data, global) { + if (global) { + chrome.tabs.query({}, function (tabs) { + tabs.forEach(function (tab) { + chrome.tabs.sendMessage(tab.id, {method: id, data: data}, function () {}); + }); + }); + } + else if ('id' in this && 'windowId' in this) { + chrome.tabs.sendMessage(this.id, {method: id, data: data}, function () {}); + } + else { + chrome.tabs.query({active: true, currentWindow: true}, function (tabs) { + tabs.forEach(function (tab) { + chrome.tabs.sendMessage(tab.id, {method: id, data: data}, function () {}); + }); + }); + } + }, + receive: function (id, callback) { + chrome.runtime.onMessage.addListener(function (message, sender) { + if (message.method === id && sender.tab && sender.tab.url.indexOf('http') === 0) { + callback.call(sender.tab, message.data); + } + }); + } + }; +})(); +/* updating badge when action is posted */ +chrome.webRequest.onCompleted.addListener( + function (info) { + if (info.type === 'main_frame' || info.url.indexOf('act=') !== -1) { + app.emit('update'); + } + }, + {urls: ['https://mail.google.com/mail/u*']}, + [] +); + +app.isPrivate = function () { + return false; +}; diff --git a/v1/src/lib/wrapper/chrome/background.html b/v1/src/lib/wrapper/chrome/background.html new file mode 100644 index 00000000..454edd98 --- /dev/null +++ b/v1/src/lib/wrapper/chrome/background.html @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/v1/src/lib/wrapper/firefox/app.js b/v1/src/lib/wrapper/firefox/app.js new file mode 100644 index 00000000..f4176387 --- /dev/null +++ b/v1/src/lib/wrapper/firefox/app.js @@ -0,0 +1,727 @@ +'use strict'; + +var {Cc, Ci, Cu} = require('chrome'), + {on, off, once, emit} = require('sdk/event/core'), + {ToggleButton} = require('sdk/ui/button/toggle'), + {viewFor} = require('sdk/view/core'), + tabs = require('sdk/tabs'), + self = require('sdk/self'), + loader = require('@loader/options'), + array = require('sdk/util/array'), + data = self.data, + Panel = require('sdk/panel').Panel, + l10n = require('sdk/l10n').get, + timer = require('sdk/timers'), + pageWorker = require('sdk/page-worker'), + pageMod = require('sdk/page-mod'), + sp = require('sdk/simple-prefs'), + prefs = sp.prefs, + unload = require('sdk/system/unload'), + pbrowsing = require('sdk/private-browsing'), + {all, defer, race, resolve, reject} = require('sdk/core/promise'), + config = require('../../config'), + tbExtra = require('./tbExtra'), + windows = { + utils: require('sdk/window/utils'), + browsers: require('sdk/windows').browserWindows, + get active () { // Chrome window + return this.utils.getMostRecentBrowserWindow(); + }, + get SDKWindow () { // SDK window + return require('sdk/windows').browserWindows.activeWindow; + }, + }; + +var userActions = []; + +Function.prototype.once = function () { //jshint ignore:line + var original = this; + var isItCalled = false; + return function () { + if (!isItCalled) { + isItCalled = true; + return original.apply(this, Array.from(arguments)); + } + }; +}; + +exports.Promise = function (callback) { + let d = defer(); + callback(d.resolve, d.reject); + return d.promise; +}; +exports.Promise.defer = defer; +exports.Promise.all = all; +exports.Promise.race = race; +exports.Promise.resolve = resolve; +exports.Promise.reject = reject; + +exports.actions = function (callback) { + userActions.push(callback); +}; + +var exportsHelper = {}; +var {XPCOMUtils} = require('resource://gre/modules/XPCOMUtils.jsm'); + +XPCOMUtils.defineLazyModuleGetter(exportsHelper, 'FileUtils', 'resource://gre/modules/FileUtils.jsm'); +XPCOMUtils.defineLazyModuleGetter(exportsHelper, 'Services', 'resource://gre/modules/Services.jsm'); +XPCOMUtils.defineLazyModuleGetter(exportsHelper, 'WebRequest', 'resource://gre/modules/WebRequest.jsm'); +XPCOMUtils.defineLazyModuleGetter(exportsHelper, 'MatchPattern', 'resource://gre/modules/MatchPattern.jsm'); + +// Event Emitter +exports.on = on.bind(null, exports); +exports.once = once.bind(null, exports); +exports.emit = emit.bind(null, exports); +exports.removeListener = (type, listener) => off(exports, type, listener); + +/* button */ +var button = new ToggleButton({ + id: self.name, + label: l10n('toolbar_label'), + icon: { + '16': './icons/blue/16.png', + '32': './icons/blue/32.png' + }, + onChange: function (state) { + if (button.onClick && state.checked) { + button.onClick(); + } + button.state('window', { + checked: false + }); + } +}); +tbExtra.attach(button); + +/** + * popup + * popup get populated once init is called. Before that listeners are stacked +*/ +var popup = (function (options) { + let panel, callbacks = []; + return { + init: function () { + if (panel) { + return panel; + } + else { + panel = new Panel(options); + callbacks.forEach(obj => panel.port.on(obj.id, obj.callback)); + panel.on('show', () => { + button.state('window', { + checked: true + }); + panel.port.emit('show'); + }); + panel.on('hide', () => { + button.state('window', { // private window issue + checked: false + }); + // making sure no window is still on checked state + for (let window of windows.browsers) { + button.state(window, { + checked: false + }); + } + }); + return panel; + } + }, + show: (options) => { + popup.init().show(options); + userActions.forEach(c => c()); + }, + hide: () => panel ? panel.hide() : null, + resize: (width, height) => panel.resize(width, height), + port: { + on: (id, callback) => panel ? panel.port.on(id, callback) : callbacks.push({id, callback}), + emit: (id, params) => panel ? panel.port.emit(id, params) : null + }, + get isShowing () { + return panel ? panel.isShowing : false; + } + }; +})({ + contextMenu: true, + contentURL: data.url('./popup/index.html'), + contentScriptFile: [ + data.url('./popup/firefox/firefox.js'), + data.url('./popup/index.js') + ], + contentScriptOptions: { + base: loader.prefixURI, + locales: { + 'popup_wait': l10n('popup_wait'), + 'popup_read': l10n('popup_read'), + 'popup_date_format': l10n('popup_date_format'), + 'popup_msg_3_format': l10n('popup_msg_3_format'), + 'popup_msg_7_format': l10n('popup_msg_7_format'), + 'popup_msg_8_format': l10n('popup_msg_8_format'), + 'popup_msg_9_format': l10n('popup_msg_9_format'), + 'popup_msg_1': l10n('popup_msg_1'), + 'popup_msg_2': l10n('popup_msg_2'), + 'popup_msg_3': l10n('popup_msg_3'), + 'popup_msg_4': l10n('popup_msg_4'), + 'popup_msg_5': l10n('popup_msg_5'), + 'popup_msg_6': l10n('popup_msg_6'), + 'popup_msg_7': l10n('popup_msg_7'), + 'popup_msg_8': l10n('popup_msg_8'), + 'popup_msg_9': l10n('popup_msg_9'), + 'popup_msg_10': l10n('popup_msg_10'), + 'popup_msg_11': l10n('popup_msg_11'), + 'popup_msg_12': l10n('popup_msg_12'), + 'popup_msg_13': l10n('popup_msg_13'), + 'popup_msg_14': l10n('popup_msg_14'), + 'popup_msg_15': l10n('popup_msg_15'), + 'popup_msg_16': l10n('popup_msg_16'), + 'popup_msg_17': l10n('popup_msg_17'), + 'popup_msg_18': l10n('popup_msg_18'), + 'popup_msg_19': l10n('popup_msg_19'), + 'popup_msg_20': l10n('popup_msg_20'), + 'popup_msg_21': l10n('popup_msg_21') + } + } +}); +/* option */ +var options = (function () { + let workers = [], options_arr = []; + pageMod.PageMod({ + include: data.url('options/index.html'), + contentScriptFile: [ + data.url('options/firefox/firefox.js'), + data.url('options/index.js') + ], + contentScriptWhen: 'start', + contentScriptOptions: { + base: loader.prefixURI + }, + onAttach: function(worker) { + array.add(workers, worker); + worker.on('pageshow', function() { + array.add(workers, this); + }); + worker.on('pagehide', function() { + array.remove(workers, this); + }); + worker.on('detach', function() { + array.remove(workers, this); + }); + // PageMod has no access to mozFullPath of input. + worker.port.on('custom-sound', function (pref) { + var browserWindow = Cc['@mozilla.org/appshell/window-mediator;1']. + getService(Ci.nsIWindowMediator). + getMostRecentWindow('navigator:browser'); + var filePicker = Cc['@mozilla.org/filepicker;1'].createInstance(Ci.nsIFilePicker); + var mimeService = Cc['@mozilla.org/mime;1'].getService(Ci.nsIMIMEService); + filePicker.init(browserWindow, l10n('msg_5'), Ci.nsIFilePicker.modeOpen); + filePicker.appendFilters(Ci.nsIFilePicker.filterAll | Ci.nsIFilePicker.filterAudio); + var rv = filePicker.show(); + if (rv === Ci.nsIFilePicker.returnOK) { + config.set(pref, filePicker.file.path); + config.set(pref.replace('.file', '.mime'), mimeService.getTypeFromFile(filePicker.file)); + } + }); + options_arr.forEach(function (arr) { + worker.port.on(arr[0], arr[1]); + }); + } + }); + unload.when(function (e) { + // https://github.com/inbasic/ignotifier/issues/400 + if (e === 'shutdown') { + return; + } + var tbs = windows.SDKWindow.tabs; + for (let tab of tbs) { + if (tab && tab.url && tab.url.startsWith(self.data.url(''))) { + tab.close(); + } + } + }); + return { + send: function (id, data) { + workers.forEach(function (worker) { + worker.port.emit(id, data); + }); + }, + receive: (id, callback) => options_arr.push([id, callback]) + }; +})(); +sp.on('settings_open', () => exports.emit('open-options')); + +function get (url, headers, data, timeout, isPrivate) { + headers = headers || {}; + + let d = defer(); + let req = Cc['@mozilla.org/xmlextras/xmlhttprequest;1'] + .createInstance(Ci.nsIXMLHttpRequest); + + req.mozBackgroundRequest = true; //No authentication + req.timeout = timeout; + req.open('GET', url, true); + for (let id in headers) { + req.setRequestHeader(id, headers[id]); + } + req.onreadystatechange = function () { + if (req.readyState === 4) { + d.resolve(req); + } + }; + req.channel + .QueryInterface(Ci.nsIHttpChannelInternal) + .forceAllowThirdPartyCookie = true; + if (isPrivate) { + try { + req.channel.QueryInterface(Ci.nsIPrivateBrowsingChannel).setPrivate(true); + } + catch (e) {} + } + if (data) { + let arr = []; + for (let e in data) { + arr.push(e + '=' + data[e]); + } + data = arr.join('&'); + } + req.send(data ? data : ''); + return d.promise; +} + +exports.button = (function () { + let populate = function () { + timer.setTimeout(popup.init, 30 * 1000); + }.once(); + return { + onCommand: function (c) { + button.onClick = c; + }, + onContext: function (ref) { + tbExtra.onContext(function (e, menupopup, menuitem, menuseparator, menu) { + let types = { + 'menupopup': menupopup, + 'menuitem': menuitem, + 'menuseparator': menuseparator, + 'menu': menu + }; + // remove old items + while (menupopup.firstChild) { + menupopup.removeChild(menupopup.firstChild); + } + var items = [ + ref.accounts.length === 1 ? { + type: 'menuitem', + label: ref.accounts[0].label, + command: ref.accounts[0].command + } : + {type: 'menu', label: l10n('label_14'), childs: [ + {type: 'menupopup', childs: ref.accounts.map(function (obj) { + return {type: 'menuitem', label: obj.label, command: obj.command}; + })} + ]}, + {type: 'menuseparator'}, + {type: 'menu', label: l10n('label_3'), childs: [ + {type: 'menupopup', childs: [ + {type: 'menuitem', label: l10n('label_4'), command: () => ref.silent(300)}, + {type: 'menuitem', label: l10n('label_5'), command: () => ref.silent(900)}, + {type: 'menuitem', label: l10n('label_6'), command: () => ref.silent(1800)}, + {type: 'menuitem', label: l10n('label_7'), command: () => ref.silent(3600)}, + {type: 'menuitem', label: l10n('label_8'), command: () => ref.silent(7200)}, + {type: 'menuitem', label: l10n('label_9'), command: () => ref.silent(18000)}, + {type: 'menuitem', label: l10n('label_13'), command: () => ref.silent('custom')}, + ]} + ]}, + { + type: 'menuitem', + label: l10n('label_10'), + command: () => ref.silent(), + state: ref.state + }, + {type: 'menuseparator'}, + {type: 'menuitem', label: l10n('label_11'), command: () => ref.compose()}, + {type: 'menuitem', label: l10n('label_1'), command: () => ref.refresh()}, + {type: 'menuseparator'}, + {type: 'menuitem', label: l10n('label_12'), command: () => ref.faq()}, + {type: 'menuitem', label: l10n('label_2'), command: () => ref.options()} + ]; + + function appendChilds (root, arr) { + arr.forEach(function (e) { + var element = types[e.type].cloneNode(false); + if (e.type === 'menu' && e.childs[0].childs.length === 0) { + element.setAttribute('disabled', 'true'); + } + if ('state' in e) { + element.setAttribute('type', 'checkbox'); + element.setAttribute('checked', e.state); + } + ['label', 'tooltip', 'value', 'link'].filter(function (i) { + return e[i]; + }).forEach(function (i) { + return element.setAttribute(i, e[i]); + }); + if (e.command) { + element.addEventListener('command', function (event) { + event.preventDefault(); + event.stopPropagation(); + e.command(event); + }, false); + } + root.appendChild (element); + if (e.childs && e.childs.length) { + appendChilds(element, e.childs); + } + }); + } + appendChilds(menupopup, items); + }); + }, + fireContext: function () {}, + onState: function () {}, + onClick: function (c) { + tbExtra.onClick(c); + }, + set label (val) { //jshint ignore:line + try { + button.label = config.ui.tooltip ? l10n('toolbar_label') : val; + } + catch (e) {} + }, + set badge (val) { //jshint ignore:line + if (config.ui.badge) { + button.badge = val ? val : ''; + button.badgeColor = config.ui.backgroundColor; + } + // populate the panel in background + if (config.popup.populate) { + populate(); + } + }, + set color (val) { //jshint ignore:line + button.icon = { + '16': './icons/' + val + '/16.png', + '32': './icons/' + val + '/32.png' + }; + } + }; +})(); + +exports.popup = { + show: function () { + popup.show({ + width: config.popup.width, + height: config.popup.height, + position: button + }); + }, + hide: () => popup.hide(), + attach: function () {}, + detach: () => popup.hide(), + send: function (id, data) { + if (id === 'resize') { + popup.resize(data.width, data.height); + } + if (popup.isShowing) { + popup.port.emit(id, data); + } + }, + receive: (id, callback) => popup.port.on(id, callback) +}; + +exports.timer = timer; + +exports.get = get; + +exports.parser = function () { + return Cc['@mozilla.org/xmlextras/domparser;1'] + .createInstance(Ci.nsIDOMParser); +}; + +exports.l10n = (id) => l10n(id); + +exports.windows = (function () { + function toWindow (win) { + return { + obj: win, + focus: function () { + try { + (win.focus || win.activate)(); + } + catch (e) { + try { + viewFor(win).focus(); + } + catch (e) {} + } + } + }; + } + function toTab (tab) { + return { + get url () { + return tab.url; + }, + set url (val) { + if (tab.url === val) { + tab.reload(); + } + else { + tab.url = val; + } + }, + activate: () => tab.activate(), + window: () => resolve(toWindow(tab.window)), + get active () { + return tab === tabs.activeTab; + }, + close: function () { + tab.close(); + } + }; + } + return { + active: function (isPrivate) { + if (isPrivate && !pbrowsing.isPrivate(tabs.activeTab)) { + for (let window of windows.browsers) { + if (pbrowsing.isPrivate(window)) { + window.activate(); + return resolve(toWindow(window)); + } + } + } + else if (!isPrivate && pbrowsing.isPrivate(tabs.activeTab)) { + for (let window of windows.browsers) { + if (!pbrowsing.isPrivate(window)) { + window.activate(); + return resolve(toWindow(window)); + } + } + } + + return resolve(toWindow(windows.active)); + }, + open: function (url, inBackground) { + var popup = windows.active.open(url); + if (inBackground) { + popup.blur(); + window.focus(); + } + }, + tabs: { + list: function (currentWindow) { + var tbs = currentWindow ? windows.SDKWindow.tabs : tabs; + var temp = []; + for (let tab of tbs) { + temp.push(tab); + } + return resolve(temp.map(toTab)); + }, + active: function () { + return resolve(toTab(tabs.activeTab)); + }, + open: function (url, inBackground) { + var gBrowser = windows.active.gBrowser; + // use old blank tabs? + (function () { + if (config.tabs.open.relatedToCurrent || !config.tabs.open.useBlankTabs) { + return resolve(null); + } + return exports.windows.tabs.list(true).then(function (tabs) { + return tabs.reduce(function (p, c) { + return p || (c.url === 'about:newtab' || c.url === 'about:blank' ? c : null); + }, null); + }); + })().then(function (t) { + if (t) { + t.url = url; + if (!inBackground) { + t.activate(); + } + } + else { + t = gBrowser.addTab(url, { + relatedToCurrent: config.tabs.open.relatedToCurrent + }); + if (!inBackground) { + gBrowser.selectedTab = t; + } + } + }); + } + } + }; +})(); + +exports.notify = (function () { + let stack = [], wait = false, notifications; + function doOne () { + if (wait) { + return; + } + if (stack.length === 0) { + return; + } + wait = true; + let obj = stack.shift(); + notifications = notifications || require('sdk/notifications'); + notifications.notify({ + title: obj.title || l10n('gmail'), + text: obj.text, + onClick: function () { + if (obj.onClick) { + obj.onClick(); + } + userActions.forEach(c => c()); + }, + iconURL: data.url('./icons/red/128.png') + }); + timer.setTimeout(function () { + wait = false; + doOne(); + }, 4000); + } + return function (text, title, onClick) { + if (config.notification.silent) { + return; + } + if (!Array.isArray(text)) { + text = [text]; + } + text.forEach(text => stack.push({text, title, onClick})); + if (!wait) { + doOne(); + } + }; +})(); + +exports.sound = (function () { + var worker; + + return { + play: function (index) { + if (config.notification.silent) { + return; + } + let type = index === null ? config.notification.sound.media.default.type : config.notification.sound.media['custom' + index].type; + let path = '../../data/sounds/' + type + '.wav'; + let cPath; + if (type === 4) { + cPath = index === null ? config.notification.sound.media.default.file : config.notification.sound.media['custom' + index].file; + let file = new exportsHelper.FileUtils.File(cPath); + if (file.exists()) { + let res = exportsHelper.Services.io.getProtocolHandler('resource').QueryInterface(Ci.nsIResProtocolHandler); + let name = 'igsound'; + res.setSubstitution(name, exportsHelper.Services.io.newURI(exportsHelper.Services.io.newFileURI(file).spec, null, null)); + path = 'resource://' + name; + } + } + exports.sound.stop(); + worker = pageWorker.Page({ + contentScript: ` + var audio = new Audio("${path}"); + audio.addEventListener('ended', function () { + self.postMessage(); + }); + audio.volume = ${(config.notification.sound.volume / 100)}; + audio.play(); + self.on('message', () => { + audio.pause(); + audio.currentTime = 0; + }); + `, + contentURL: data.url('firefox/sound.html'), + onMessage: () => worker.destroy() + }); + }, + stop: function () { + try { + worker.postMessage(); + worker.destroy(); + } + catch (e) {} + } + }; +})(); + +exports.version = () => self.version; + +exports.startup = function (c) { + if (self.loadReason === 'startup' || self.loadReason === 'install') { + c(); + } +}; + +exports.unload = (c) => unload.when(c); + +exports.options = options; + +exports.storage = { + read: function (id) { + return (prefs[id] || prefs[id] + '' === 'false' || !isNaN(prefs[id])) ? (prefs[id] + '') : null; + }, + write: function (id, data) { + data = data + ''; + if (data === 'true' || data === 'false') { + prefs[id] = data === 'true' ? true : false; + } + else if (parseInt(data) + '' === data) { + prefs[id] = parseInt(data); + } + else { + prefs[id] = data + ''; + } + } +}; + +exports.manifest = { + url: loader.prefixURI +}; + +exports.tray = require('./tray/wrapper').tray; + +/* updating badge when action is posted */ +(function () { + let pattern = new exportsHelper.MatchPattern(['https://mail.google.com/mail/u/*']); + function observe (details) { + if (details.type === 'main_frame' || details.url.indexOf('act=') !== -1) { + exports.emit('update'); + } + } + exportsHelper.WebRequest.onCompleted.addListener(observe, { + urls: pattern + }); + unload.when(() => exportsHelper.WebRequest.onCompleted.removeListener(observe)); +})(); + +// connect +exports.connect = function (actions) { + var connect = {}; + Cu.import(data.url('firefox/shared/connect.jsm'), connect); + connect.remote.actions = actions; + Object.freeze(connect); +}; + +// private mode +exports.isPrivate = (function () { + let exists = null; + let os = Cc['@mozilla.org/observer-service;1'].getService(Ci.nsIObserverService); + + function exit () { + exists = false; + exports.emit('update'); + } + os.addObserver(exit, 'last-pb-context-exiting', false); + unload.when(() => os.removeObserver(exit, 'last-pb-context-exiting')); + + tabs.on('open', tab => { + exists = exists || pbrowsing.isPrivate(tab); + }); + + return function () { + if (exists === null) { + for (let tab of tabs) { + exists = exists || pbrowsing.isPrivate(tab); + } + } + return exists; + }; +})(); diff --git a/v1/src/lib/wrapper/firefox/tbExtra.js b/v1/src/lib/wrapper/firefox/tbExtra.js new file mode 100644 index 00000000..f4cf8512 --- /dev/null +++ b/v1/src/lib/wrapper/firefox/tbExtra.js @@ -0,0 +1,63 @@ +'use strict'; + +var {Cu} = require('chrome'), + self = require('sdk/self'), + unload = require('sdk/system/unload'); + +const NS_XUL = 'http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul'; + +var onContext, onClick, button; + +(function (listen) { + let {CustomizableUI} = Cu.import('resource:///modules/CustomizableUI.jsm'); + CustomizableUI.addListener(listen); + unload.when(() => CustomizableUI.removeListener(listen)); +})({ + onWidgetBeforeDOMChange: function (tbb) { + if (tbb.id.indexOf(self.name) === -1) { + return; + } + // Install onContext if it is not installed + if (!tbb.isOnContextInstalled) { + tbb.isOnContextInstalled = true; + + let doc = tbb.ownerDocument.defaultView.document; + let menupopup = doc.createElementNS(NS_XUL, 'menupopup'); + let menu = doc.createElementNS(NS_XUL, 'menu'); + let menuitem = doc.createElementNS(NS_XUL, 'menuitem'); + let menuseparator = doc.createElementNS(NS_XUL, 'menuseparator'); + + tbb.addEventListener('contextmenu', function (e) { + if (onContext) { + //Prevent Firefox context menu + e.stopPropagation(); + e.preventDefault(); + try { + onContext(e, menupopup, menuitem, menuseparator, menu); + } + catch (e) { + console.error(e, '1'); + } + menupopup.openPopup(tbb , 'after_end', 0, 0, false); + } + }, true); + tbb.addEventListener('popuphidden', function () { + if (button) { + button.state('window', { + checked: false + }); + } + }); + tbb.addEventListener('click', function (e) { + if (onClick) { + onClick(e); + } + }, true); + tbb.appendChild(menupopup); + } + } +}); + +exports.onContext = (c) => onContext = c; +exports.onClick = (c) => onClick = c; +exports.attach = (b) => button = b; diff --git a/v1/src/lib/wrapper/firefox/tray/darwin/tray.js b/v1/src/lib/wrapper/firefox/tray/darwin/tray.js new file mode 100644 index 00000000..7a89655f --- /dev/null +++ b/v1/src/lib/wrapper/firefox/tray/darwin/tray.js @@ -0,0 +1,21 @@ +'use strict'; + +var {Cc, Ci} = require('chrome'), + unload = require('sdk/system/unload'), + config = require('../../../../config'); + +var dock = Cc['@mozilla.org/widget/macdocksupport;1'] + .getService(Ci.nsIMacDockSupport); + +exports.set = function (badge) { + if(!config.tray.show) { + return; + } + dock.badgeText = badge; +}; +exports.remove = function () { + dock.badgeText = ''; +}; +exports.callback = function () {}; + +unload.when(exports.remove); diff --git a/builds/unpacked/firefox/lib/wrapper/firefox/tray/winnt/tray.js b/v1/src/lib/wrapper/firefox/tray/winnt/tray.js similarity index 96% rename from builds/unpacked/firefox/lib/wrapper/firefox/tray/winnt/tray.js rename to v1/src/lib/wrapper/firefox/tray/winnt/tray.js index 6fc21eb3..d86094c2 100644 --- a/builds/unpacked/firefox/lib/wrapper/firefox/tray/winnt/tray.js +++ b/v1/src/lib/wrapper/firefox/tray/winnt/tray.js @@ -12,7 +12,7 @@ var {Cc, Ci, Cu} = require('chrome'), unload = require('sdk/system/unload'), oscpu = Cc['@mozilla.org/network/protocol;1?name=http'] .getService(Ci.nsIHttpProtocolHandler).oscpu, - version = parseInt((/\d\.\d/.exec(oscpu) || ['0'])[0].replace('.', '')), // Windows Version + version = parseInt((/\d+\.\d+/.exec(oscpu) || ['0'])[0].replace('.', '')), // Windows Version config = require('../../../../config'); var exportsHelper = {}; @@ -215,7 +215,12 @@ exports.set = function (badge, msg) { return; } //nid.szInfo = msg; - nid.szTip = msg.substring(0, 63); // maximum of 64 characters + if (version >= 50) { //2K + nid.szTip = msg.substring(0, 127); // maximum of 128 characters + } + else { + nid.szTip = msg.substring(0, 63); // maximum of 64 characters + } icon(badge).then(function (arr) { var uint8Array = new Uint8Array(arr); nid.hIcon = user32.CreateIcon(hWnd, 16, 16, 1, 32, uint8Array, uint8Array); diff --git a/v1/src/lib/wrapper/firefox/tray/wrapper.js b/v1/src/lib/wrapper/firefox/tray/wrapper.js new file mode 100644 index 00000000..298d305d --- /dev/null +++ b/v1/src/lib/wrapper/firefox/tray/wrapper.js @@ -0,0 +1,28 @@ +'use strict'; + +var os = require('sdk/system').platform; + +exports.tray = (function () { + let callback = function () {}; + let module; + + if (os !== 'winnt' && os !== 'darwin') { + return { + set: function () {}, + remove: function () {}, + callback: function () {} + }; + } + + return { + set: (a, b) => { + if (!module) { + module = require('./' + os + '/tray'); + module.callback(callback); + } + module.set(a, b); + }, + remove: () => module ? module.remove() : null, + callback: (c) => callback = c + }; +})(); diff --git a/builds/unpacked/firefox/lib/wrapper/firefox/userstyles.js b/v1/src/lib/wrapper/firefox/userstyles.js similarity index 100% rename from builds/unpacked/firefox/lib/wrapper/firefox/userstyles.js rename to v1/src/lib/wrapper/firefox/userstyles.js diff --git a/src/lib/wrapper/safari/app.js b/v1/src/lib/wrapper/safari/app.js similarity index 100% rename from src/lib/wrapper/safari/app.js rename to v1/src/lib/wrapper/safari/app.js diff --git a/src/lib/wrapper/safari/background.html b/v1/src/lib/wrapper/safari/background.html similarity index 100% rename from src/lib/wrapper/safari/background.html rename to v1/src/lib/wrapper/safari/background.html diff --git a/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 src/lib/wrapper/safari/i18next-1.7.4.js rename to v1/src/lib/wrapper/safari/i18next-1.7.4.js diff --git a/src/lib/wrapper/safari/q.js b/v1/src/lib/wrapper/safari/q.js similarity index 100% rename from src/lib/wrapper/safari/q.js rename to v1/src/lib/wrapper/safari/q.js diff --git a/v1/src/locale/bg.properties b/v1/src/locale/bg.properties new file mode 100644 index 00000000..574d627c --- /dev/null +++ b/v1/src/locale/bg.properties @@ -0,0 +1,172 @@ +label_9=За 5 часа +options_notifications_19=Оповестяване за поща на Уиндоус +options_notifications_17=Камбана +options_notifications_13=Отваряне на панела при щракване върху иконката в лентата на задачите (Само за Уиндоус, в бета) +options_notifications_30=Обединяване на всички едновременни известия на работния плот в едно известие +settings_open_label=Отваряне на настройките +options_timings_l7=Без проверка за нови писма при стартиране (в секунди): +label_4=За 5 минути +options_timings_l3=Напомняне за непрочетени писма на всеки (в минути): +popup_msg_4=Преди 1 час +options_gmail_1=Главна сметка (/mail/u/0/) +options_gmail_10=Получаване на известия за следните етикети и сметки: +options_notifications_1=Показване на известия на работния плот за нови писма +options_notifications_9=Свирене на звуково оповестяване за нови писма +label_6=За 30 минути +options_misc_8=Нулиране на всички настройки към първоначалните +options_notifications_28=Изключване на всички известия за избран период (в минути): +options_timings_l4=Задайте стойността на нула за непериодични напомняния. +options_notifications_32=името или писмото съдържа +options_tab_6=Отваряне на пощата в нов прозорец +options_notifications_25=В Сафари първоначалното звуково известяване може да не работи. Ако е така, използвайте потребителски файл. +options_toolbar_15=Натискане със средното копче върху лентата +options_toolbar_10=Минималната височина е 500 пиксела. +popup_msg_10=Януари +options_notifications_26=Винаги да се показват известия в областта за уведомяване (само за Уиндоус) +label_3=Изключване на известията +label_13=За избран период +options_empty=не е обозначено +options_notifications_3=Тази функция може да не работи на вашата операционна система. +options_timings=Разписание +options_gmail_5=Четвърта сметка (/mail/u/3/) +label_5=За 15 минути +options_misc_9=Червен цвят за "Няма непрочетени" и сив цвят за "Няма връзка" +popup_msg_5=часа назад +options_notifications_27=Известията в областта за уведомяване ще се показват дори ако няма непрочетени писма. +options_misc_1=Подреждане на сметките по азбучен ред +tooltip_1=Щракване с ляво копче: Отваряне на пощата или панела за предварителен преглед +notification=От: [author_email][break] Заглавие: [title][break] Обобщение: [summary] +popup_trash=Кошче +options_tab=Отваряне на подпрозорец: +log_into_your_account=Моля, влезте в сметката си +label_10=Включване на известията +options_notifications_23=Гръмкостта на звуковото оповестяване е +options_timings_l2=Минималният период е 10 секунди. +options_toolbar_11=Поддръжка на клавишни комбинации в панела +options_gmail_9=Някои популярни етикети: "Входяща поща", "Важни", "^smartlabel_personal", "^smartlabel_newsletter", "^smartlabel_notification" и "^smartlabel_group" +popup_msg_17=Август +popup_msg_15=Юни +options_notifications_34=обобщението на писмото съдържа +label_14=Вписани сметки +options_misc_13=По подразбиране, известителят обновява подсказките на копчето с входна информация. Ако изчистите отметката, текста в подсказката ще остане на първоначалната стойност. +options_misc_6=Show desktop notification to warn that Gmail is already opened in the active tab +popup_read=Отбелязване като прочетено +options_notifications_4=Формат на известията +settings_open_title=Отваряне на страницата с настройките +label_2=Настройки +options_toolbar_14=Ако предпочитате само текст в режима на цяло съдържание, махнете отметката. +options_notifications_18=Звънене +options_tab_5=Отваряне на пощата в подпрозорец на заден план +label_7=За 1 час +popup_archive=Архив +msg_2=Връзката е копирана в буфера. +options_title=Настройки +popup_msg_13=Април +popup_msg_9_format=Преди %d месец(а) +popup_msg_11=Февруари +popup_open_inbox=Отваряне на входящата кутия +options_tab_9=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. +gmail=Известител за пощата на Гугъл +popup_msg_6=Вчера +options_toolbar_8=Минималната ширина е 500 пиксела. +options_notifications_16=Оповестяване по подразбиране +options_misc_14=Без показване на точния брой в значката, когато непрочетените писма надхвърлят 999 +popup_msg_18=Септември +options_notifications_14=Тази функция е експериментална и може да направи разглеждача Файърфокс нестабилен. [Изисква се повторно пускане]. +options_gmail_3=Втора сметка (/mail/u/1/) +options_notifications_11=Показване на "Известие в лентата със задачи на Уиндоус" или "Известие в лентата на Макинтош" +options_notifications_2=Показване на известия на работния плот за (в секунди): +log_in_to_your_account=Моля, влезте в профила си в пощата на Гугъл +popup_of=of +options_notifications_15=Звуковото известие по подразбиране е +options_notifications_21=Потребителският оповестителен звук е +options_toolbar_9=Височина на панела в режим на преглед на цялото съдържание (в пиксели): +options_toolbar_1=Поведение на копчето на лентата +unknown=неизвестно +popup_msg_21=Декември +popup_read_all=Отбелязване на всички като прочетени +options_notifications_8=Ако искате да няма многоточие, използвайте по-голямо число. +options_donation=Направете дарение +msg_3=Избраният текст е копиран в буфера. +options_misc_7=Показване на приветстващата страница при надграждане +options_gmail=Поща на Гугъл: +label_1=Обновяване +options_notifications_5=Налични променливи: +options_notifications_24=Гръмкостта е число между 0 и 100, където 100 е най-високото (по подразбиране). +options_notifications_10=Бележка за потребителите на Макинтош. От Файърфокс 28.0, всички известия на работния плот ще се управляват от Центъра за известия, което поражда допълнително звуково оповестяване. Трябва да изключите или това оповестяване, или оповестяването в Центъра за известия. +options_misc_2=По подразбиране се сортира по ред на влизане. +options_toolbar_2=Винаги да се отваря панел с предварителен преглед +popup_settings=настройки +options_gmail_4=Трета сметка (/mail/u/2/) +options_toolbar_5=Показване само на обобщение +options_notifications_12=В момента не се поддържат известия в лентата със задачи под Линукс. +options_notifications_35=За да изберете нов потребителски звук, първо изберете вграден звук и след това променете настройката на потребителски. +msg_1=Подпрозорецът вече е отворен. Натиснете копчето на лентата, за да отворите пощата в нов подпрозорец или да преминете към вече отворен раздел. +popup_refresh=Презареждане +options_misc_5=Син цвят за "Няма непрочетени" и сив цвят за "Няма връзка" +options_timings_l8=Задайте стойността на нула, за да не се проверява за нови писма до първото ръчно обновяване [Не е налично в Сафари]. +popup_msg_19=Октомври +options_notifications_33=заглавието на писмото съдържа +tooltip_3=Щракване с дясно копче: Избор на сметка +popup_date_format=%mm %dd, %yy +options_notifications=Известия: +options_timings_l6=Ако имате непрочетени писма, стойностите, различни от нула, пускат оповестителен звук и известия на работния плот безкрайно. +popup_msg_12=Март +options_notifications_22=Ако четецът ви не възпроизвежда потребителския звук, опитайте се да го преобразувате във формат WAV. +options_tab_1=Търсене за отворена сметка само в активния прозорец +popup_msg_7_format=Преди %d дена +options_timings_l1=Проверка за нови писма на всеки (в секунди): +options_toolbar_4=Режим на панела +toolbar_label=Известител за пощата на Гугъл +popup_msg_1=Току-що +popup_open_settings=Отваряне на настройките +options_misc_3=Цвят на иконката на лентата +options_gmail_12=Отделяйте емисиите със "," (запетая). Примерна емисия: https://mail.google.com/mail/u/0/feed/atom/inbox +options_toolbar_12=!: Докладване като спам, #: Кошче, e: Архив, Shift + i: Отбелязване като прочетено. +options_px=px +options_misc_11=Ако стойността се зададе на нула, няма да получавате нито звукови оповестявания, нито известия на работния плот. Ще работи само значката за известия. +options_notifications_20=Потребителски звук +and=и +options_tab_7=Винаги да се използват празни подпрозорци вместо да се отваря нов, когато е включено отварянето в подпрозорци +options_toolbar_3=Отваряне на пощата ако се използва само една сметка +options_gmail_7=Шеста сметка (/mail/u/5/) +popup_msg_8_format=Преди %d седмица(и) +options_toolbar=Лента: +options_notifications_6=Съкращаване на известията, по-дълги от +popup_wait=Изчакайте... +tooltip_2=Щракване със средно копче (или Контрол + Ляво): Обновяване на всички сметки +options_notifications_29=Тази настройка е свързана с менюто на копчето -> изключване на всички известия -> избран период. +options_tab_3=Отваряне на пощата до активния подпрозорец +options_gmail_8=Отбелязване на писмото като прочетено при архвиране +options_toolbar_17=Отваряне на главната сметка +options_notifications_7=символа за полетата [заглавие] и [обобщение]. +options_misc_10=Да се появяват известия на работния плот и звукови оповестявания само за писма, пристигнали по-рано от (в минути): +options_tab_8=Ignore opened Gmail tabs +popup_no_subject=(няма тема) +msg_5=Изберете звуков файл +popup_msg_2=Преди 1 минута +popup_msg_16=Юли +label_8=За 2 часа +msg_4=Бележка: За да работи правилно известителя, трябва да сте влезли в профила си в Гугъл. +popup_msg_20=Ноември +options_toolbar_6=Показване на цялото съдържание +options_gmail_11=Потребителски емисии: +options_tab_2=Без търсене в други прозорци за отворени сметки. Ако пощата не е отворена в активния прозорец, да се отвори нов подпрозорец. +label_11=Писане на писмо +options_toolbar_7=Ширина на панела в режим на преглед на цялото съдържание (в пиксели): +options_notifications_31=Звуково известие по избор +options_timings_l5=Минималният период е 5 минути. +options_misc=Разни: +options_gmail_2=Разделяйте етикетите със "," (запетая). +options_misc_4=Сив цвят за "Няма непрочетени" и син цвят за "Няма връзка" +options_toolbar_13=Извеждане на писмата като ЕМХТ (HTML) в режима на цяло съдържание +options_toolbar_16=Обновяване на всички сметки +options_gmail_6=Пета сметка (/mail/u/4/) +popup_msg_14=Май +options_inshort=Известител за няколко профила в пощата на Гугъл (Джимейл). +options_misc_12=Без входни детайли в подсказките +options_tab_4=Отваряне на пощата в активния подпрозорец +popup_msg_3_format=Преди %d минути +label_12=Отваряне на въпросника +description=Известител за няколко профила в пощата на Гугъл (Джимейл) +popup_spam=Спам diff --git a/builds/unpacked/firefox/locale/el.properties b/v1/src/locale/el.properties similarity index 69% rename from builds/unpacked/firefox/locale/el.properties rename to v1/src/locale/el.properties index fdd64823..da07de22 100644 --- a/builds/unpacked/firefox/locale/el.properties +++ b/v1/src/locale/el.properties @@ -2,32 +2,41 @@ label_9=Για 5 ώρες options_notifications_19=Windows email ειδοποίηση options_notifications_17=Checker Plus ειδοποίηση καμπάνας options_notifications_13=Ανοιγμα της γραμμής εργαλείων όταν κάνετε κλικ στο εικονίδιο ειδοποίησης στην γραμμή εργασιών (μόνο για Windows, beta) +options_notifications_30=Συνδυάστε όλες τις ταυτόχρονες ειδοποιήσεις στην επιφάνεια εργασίας σε μια ενιαία κοινοποίηση +settings_open_label=Ανοίξτε τις Επιλογές options_timings_l7=Να μην γίνεται έλεγχος για νέα email κατά την εκκίνηση για (σε δευτερόλεπτα): label_4=Για 5 λεπτά options_timings_l3=Υπενθύμιση για όλα τα μη αναγνωσμένα email κάθε (σε λεπτά): +popup_msg_4=1 ώρα πριν options_gmail_1=Πρωτοβάθμιος λογαριασμός (/mail/u/0/) options_gmail_10=Λάβετε ειδοποιήσεις για τις εξής ετικέτες και τους λογαριασμούς: options_notifications_1=Κοινοποίηση επιφάνειας εργασίας οθόνης για νέα email options_notifications_9=Αναπαραγωγή ήχου ειδοποίησης για νέα email label_6=Για 30 λεπτά options_misc_8=Επαναφορά όλων των ρυθμίσεων στις εργοστασιακές ρυθμίσεις +options_notifications_28=Απενεργοποίηση όλων των ειδοποιήσεων για μια προσαρμοσμένη χρονική περίοδο (σε λεπτά): options_timings_l4=Ρυθμίστε την τιμή στο μηδέν για μη-περιοδικές υπενθυμίσεις. +options_notifications_32=περιέχει όνομα ή email options_tab_6=Άνοιγμα λογαριασμού Gmail σε νέο παράθυρο options_notifications_25=Στο safari πιθανότατα οι προεπιλεγμένες ειδοποιήσεις ήχου να μην παίζουν σωστά, αν ναι, χρησιμοποιήστε ένα αρχείο ήχου ως κοινοποίηση. options_toolbar_15=Μέσαιο κλικ στην μπάρα εργαλείων για options_toolbar_10=Το ελάχιστο ύψος είναι 500px. +popup_msg_10=Ιανουάριος options_notifications_26=Εμφανιση πάντα κοινοποίησης στον δίσκο (μόνο για Windows) label_3=Απενεργοποίηση όλων των ειδοποιήσεων +label_13=Για μια προσαρμοσμένη χρονική περίοδο options_empty=δεν ορίζεται options_notifications_3=Η επιλογή αυτή δεν μπορεί να λειτουργήσει με βάση το λειτουργικό σας σύστημα. options_timings=Χρονοδιάγραμμα options_gmail_5=Τεταρτογενής λογαριασμός (/mail/u/3/) label_5=Για 15 λεπτά -options_misc_9=Red color for "No Unread" and gray color for "Disconnected" +options_misc_9=Κόκκινο χρώμα για "Μη Αναγνωσμένα" και γκρι χρώμα για "Ασύνδετα" +popup_msg_5=ώρες πριν options_notifications_27=Κοινοποίηση στον δίσκος θα εμφανίζεται ακόμη και αν δεν υπάρχει μη αναγνωσμένο μήνυμα. options_misc_1=Ταξινόμηση λογαριασμών αλφαβητικά tooltip_1=Αριστερό κλικ: Ανοίξτε το Gmail ή το παράθυρο προεπισκόπησης αλληλογραφίας notification=Από: [author_email] [break] Τίτλος: [τίτλος] [break] Περίληψη: [περίληψη] +popup_trash=Σκουπίδια options_tab=Άνοιγμα καρτέλας: log_into_your_account=Παρακαλούμε συνδεθείτε στον λογαριασμό σας label_10=Ενεργοποίηση ειδοποιήσεων @@ -35,33 +44,50 @@ options_notifications_23=Ένταση ήχου κοινοποιήσεως options_timings_l2=Ελάχιστο χρονικό διάστημα είναι 10 δευτερόλεπτα. options_toolbar_11=Συντομεύσεις πληκτρολογίου υποστήριξης στον πίνακα εργαλείων options_gmail_9=Μερικές δημοφιλείς ετικέτες: "Εισερχόμενα", "σημαντικό", "^ smartlabel προσωπικά", "^ smartlabel ενημερωτικό δελτίο", "^ κοινοποίηση smartlabel", και "^ smartlabel_group" -options_misc_13=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_6=Να μην εμφανίζεται ειδοποίηση στην επιφάνεια εργασίας για να προειδοποιήσει ότι η ιστοσελίδα του Gmail είναι ήδη ανοικτή +popup_msg_17=Αύγουστος +popup_msg_15=Ιούνιος +options_notifications_34=περιέχει περίληψη email +label_14=Σύνδεση στους λογαριασμούς +options_misc_13=Από προεπιλογή, ο κοινοποιών ενημερώνει κείμενο επεξήγησης του κουμπιού γραμμής εργαλείων με πληροφορίες σύνδεσης. Με την απενεργοποίηση της επιλογής αυτής, στο κείμενο επεξήγησης παραμένει η προεπιλεγμένη τιμή. +options_misc_6=Show desktop notification to warn that Gmail is already opened in the active tab +popup_read=Σημείωσε ως Διαβασμένο options_notifications_4=Μορφή κοινοποίησης +settings_open_title=Ανοίξτε τις επιλογές (ρυθμίσεις) σελίδας label_2=Ρυθμίσεις options_toolbar_14=Αν προτιμάτε μονο το κείμενο σε λειτουργία πλήρους περιεχομένου, αποεπιλέξτε το πλαίσιο. options_notifications_18=Checker Plus Ειδοποίηση κωδώνισματος options_tab_5=Άνοιγμα λογαριασμού Gmail σε μια καρτέλα στον φόντο label_7=Για 1 ώρα +popup_archive=Αρχείο msg_2=Ο σύνδεσμος έχει αντιγραφεί στο πρόχειρο. options_title=Επιλογές - Gmail ™ Notifier +popup_msg_13=Απρίλιος +popup_msg_9_format=%d μήνα(ες) πρίν +popup_msg_11=Φεβρουάριος +popup_open_inbox=Ανοίξτε το φάκελο εισερχομένων +options_tab_9=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. gmail=Gmail™ Notifier +popup_msg_6=Εχθές options_toolbar_8=Το ελάχιστο πλάτος είναι 500px. options_notifications_16=Gmail Notifier προεπιλεγμένη ειδοποίηση -options_misc_14=Do not show the exact badge number when the number of unread emails is greater than 999 +options_misc_14=Να μην εμφανίζεται ο ακριβής αριθμός σημάτων όταν ο αριθμός των μη αναγνωσμένων μηνυμάτων ηλεκτρονικού ταχυδρομείου είναι μεγαλύτερος από 999 +popup_msg_18=Σεπτέμβριος options_notifications_14=Αυτό το χαρακτηριστικό είναι ιδιαίτερα πειραματικό και θα μπορούσε να κάνει τον Firefox browser ασταθή. [Επανεκκίνηση απαιτείται]. options_gmail_3=Δευτερεύον λογαριασμός (/mail/u/1/) options_notifications_11=Εμφανιση "Ειδοποιήσεις της γραμμής εργασιών του Windows" ή "Mac OS Dock κοινοποίησης" options_notifications_2=Εμφάνιση κοινοποίησης επιφάνειας εργασίας για (σε δευτερόλεπτα): log_in_to_your_account=Παρακαλούμε συνδεθείτε στον Gmail λογαριασμό σας -options_notifications_15=Ηχητική ειδοποίηση +popup_of=από +options_notifications_15=Ο προ επιλεγμένος ήχος ειδοποίησης είναι options_notifications_21=Προσδιορισμενος ηχος απο τον χρηστη options_toolbar_9=Το υψος της γραμμής εργαλείων σε κατάσταση πλήρους περιεχομένου είναι (σε εικονοστοιχεία): options_toolbar_1=Γραμμή εργαλείων συμπεριφορά κουμπιού unknown=άγνωστο +popup_msg_21=Δεκέμβριος +popup_read_all=Σημείωση όλων ως Αναγνωσμένα options_notifications_8=Για να μην έχουν καμία περικοπή τα αποσιωπητικά, χρησιμοποιήστε ένα μεγάλο αριθμό εδώ. options_donation=Κάντε μια δωρεά -msg_3=Το επιλεγμένο κείμενο εχει αντιγράφει στο πρόχειρο. +msg_3=Το επιλεγμένο κείμενο έχει αντιγράφει στο πρόχειρο. options_misc_7=Εμφάνιση σελίδας υποδοχής για αναβάθμιση options_gmail=Gmail: label_1=Ανανέωση @@ -74,42 +100,61 @@ popup_settings=Ρυθμίσεις options_gmail_4=Τριτοβάθμιος λογαριασμός (/mail/u/2/) options_toolbar_5=Εμφάνιση μόνο συνοπτικά options_notifications_12=Το Taskbar notifications δεν υποστηρίζεται απο το λειτουργικό σύστημα Linux αυτή τη στιγμή. +options_notifications_35=Για να επιλέξετε ένα νέο προσαρμοσμένο ήχο, επιλέξτε ένα ενσωματωμένο ήχο και στη συνέχεια αλλάξτε την επιλογή με τον προσαρμοσμένο ήχο msg_1=Η καρτέλα είναι ήδη ανοικτή. Κάντε κλικ στο κουμπί της γραμμής εργαλείων για να ανοίξετε το Gmail σε μια νέα καρτέλα, ή να μεταβείτε σε μια υπάρχουσα Gmail καρτέλα. +popup_refresh=Ανανεώνω options_misc_5=Μπλε χρώμα για "Μη Αναγνωσμένα" και γκρι χρώμα για "Αποσυνδεση" options_timings_l8=Ρυθμίστε την τιμή στο μηδέν για κανένα έλεγχο e-mail μέχρι την πρώτη χειροκίνητη ανανέωση [Δεν διατίθεται στο Safari]. +popup_msg_19=Οκτώβριος +options_notifications_33=περιέχει τίτλο email tooltip_3=Δεξί κλικ: Επιλογές Λογαριασμού +popup_date_format=%mm %dd, %yy options_notifications=Ειδοποιήσεις: options_timings_l6=Πυρκαγιές με μη μηδενική τιμή, κοινοποίηση και ηχητική ειδοποίηση τόσο στην επιφάνεια εργασίας (παρόμοιο με νέα άφιξη email) για πάντα, αν έχετε μη αναγνωσμένα email(s). -options_notifications_22=Αν το πρόγραμμα περιήγησης σας δεν παίζει τον ήχο κοινοποίησης, προσπαθήστε να τον μετατρέψετε σε μια απλή μορφή WAV χρησιμοποιώντας ένα online εργαλείο μετατροπής. +popup_msg_12=Μάρτιος +options_notifications_22=Αν ο browser σας δεν παίζει το προεπιλεγμένο ήχο ειδοποίησης, προσπαθήστε να το μετατρέψετε σε μια απλή μορφή WAV χρησιμοποιώντας ένα online εργαλείο μετατροπής. options_tab_1=Αναζήτηση για έναν ανοικτό λογαριασμό Gmail μόνο στο ενεργό παράθυρο +popup_msg_7_format=%d ημέρες πριν options_timings_l1=Έλεγχος για νέα e-mail κάθε (σε δευτερόλεπτα): options_toolbar_4=Λειτουργία γραμμής εργαλείων toolbar_label=Gmail™ Notifier +popup_msg_1=μόλις τώρα +popup_open_settings=Ανοίξτε τις ρυθμίσεις options_misc_3=Το σχέδιο χρώματος γραμμής εργαλείων είναι options_gmail_12=Ξεχωριστές τροφοδοσίες με "," (κόμμα). Δείγμα τροφοδοσίας: https://mail.google.com/mail/u/0/feed/atom/inbox options_toolbar_12=!: Αναφορά ως ανεπιθύμητο, #: Απορρίμματα, και: Αρχείο, Shift + I: Επισήμανση ως διαβάσμενο options_px=px -options_misc_11=By setting this preference to zero, you will receive neither desktop nor sound notifications; however, you will still get badge notification. +options_misc_11=Θέτοντας αυτήν την προτίμηση στο μηδέν, δεν θα λάμβανετε ειδοποιήσεις στην επιφάνεια εργασίας και ούτε ηχητικές ειδοποιήσεις. Ωστόσο, μπορείτε ακόμα να παίρνετε σήμα κοινοποιήσεων. options_notifications_20=Ο ήχος ορίζεται από τον χρήστη and=και options_tab_7=Πάντα να χρησιμοποιείτε κενό καρτελών αντί να ανοίγει μια νέα καρτέλα, όταν είναι ανοικτή στην καρτέλα ενεργοποιείται options_toolbar_3=Άνοιγμα λογαριασμού Gmail αν μόνο ένας λογαριασμός είναι συνδεδεμένος options_gmail_7=Σκηνικός λογαριασμός (/mail/u/5/) +popup_msg_8_format=%d εβδομάδα(ες) πριν options_toolbar=Γραμμη Εργαλειων: options_notifications_6=Περικόψτε ειδοποιήσεις περισσότερο από +popup_wait=Περιμένετε... tooltip_2=Μεσαίο (ή Ctrl + Left) κλικ: Ανανέωση όλων των λογαριασμών +options_notifications_29=Αυτή η επιλογή σχετίζεται με το δεξί κλικ μενού στο κουμπί της γραμμής εργαλείων -> απενεργοποιήσετε όλες τις ειδοποιήσεις -> προσαρμοσμένης χρονικής περιόδου. options_tab_3=Άνοιγμα νέου λογαριασμού Gmail δίπλα στην ενεργή καρτέλα options_gmail_8=Σήμανση ως αναγνωσμένο μήνυμα κατά την αρχειοθέτηση options_toolbar_17=Άνοιγμα του κύριου Gmail λογαριασμου options_notifications_7=χαρακτήρες για [τίτλος] και [περίληψη] πεδία. -options_misc_10=Only fire desktop and sound notifications when email has arrived in less than (in minutes): +options_misc_10=Μόνο εμφάνιση στην επιφάνεια εργασίας και ηχητικές ειδοποιήσεις, όταν το ηλεκτρονικό ταχυδρομείου έχει φτάσει σε λιγότερο από (σε λεπτά): +options_tab_8=Ignore opened Gmail tabs +popup_no_subject=(χωρίς θέμα) +msg_5=Επιλέξτε ένα αρχείο ήχου +popup_msg_2=1 λεπτό πριν +popup_msg_16=Ιούλιος label_8=Για 2 ώρες msg_4=Σημείωση: Για να λειτουργήσει σωστά το notifier, θα πρέπει να είστε συνδεδεμένοι στον Google λογαριασμό σας. +popup_msg_20=Νοέμβριος options_toolbar_6=Εμφάνιση πλήρους περιεχομένου options_gmail_11=Προσαρμοσμένες τροφοδοσίες: options_tab_2=Μην ψάξετε σε άλλα παράθυρα του προγράμματος περιήγησης για ανοικτούς λογαριασμούς Gmail. Εάν το Gmail δεν είναι ανοικτό στο ενεργό παράθυρο, ανοίξτε μια νέα καρτέλα. label_11=Συντάξτε ένα e-mail options_toolbar_7=Πλάτος γραμμής εργαλείων του πίνακα σε κατάσταση πλήρους περιεχομένου (σε εικονοστοιχεία): +options_notifications_31=Προσαρμοσμένος ήχος ειδοποίησης options_timings_l5=Ελάχιστη περίοδος είναι 5 λεπτά. options_misc=Διάφορα: options_gmail_2=Ξεχωριστές ετικέτες με "," (κόμμα). @@ -117,8 +162,11 @@ options_misc_4=Γκρι χρώμα για "Μη Αναγνωσμένα" και options_toolbar_13=Απόδοση e-mail ως HTML σε λειτουργία πλήρους περιεχομένου options_toolbar_16=Ανανέωση όλων των λογαριασμών options_gmail_6=Πενταδικός λογαριασμός (/mail/u/4/) -options_inshort=Πολλαπλές ετικέτες και λογαριασμοι κοινοποιών για το Google Mail (Gmail). -options_misc_12=Do not include login details in the tooltip text +popup_msg_14=Μάιος +options_inshort=Πολλαπλές ετικέτες και λογαριασμοί κοινοποιών για το Google Mail (Gmail). +options_misc_12=Δεν περιλαμβάνονται στοιχεία σύνδεσης στο κείμενο επεξήγησης options_tab_4=Άνοιγμα λογαριασμού Gmail στην ενεργή καρτέλα -label_12=Άνοιγμα αρχικής σελίδας -description=Πολλαπλές ετικέτες και κοινωποιηση λογαριασμού για το Google Mail (Gmail) +popup_msg_3_format=%d λεπτά πριν +label_12=Άνοιγμα Συχνών Ερωτήσεων +description=Πολλαπλές ετικέτες και κοινοποίηση λογαριασμού για το Google Mail (Gmail) +popup_spam=Spam diff --git a/src/locale/en.properties b/v1/src/locale/en-US.properties similarity index 83% rename from src/locale/en.properties rename to v1/src/locale/en-US.properties index 9164ae06..2787e257 100644 --- a/src/locale/en.properties +++ b/v1/src/locale/en-US.properties @@ -9,6 +9,7 @@ msg_1=Tab is already open. Click on the toolbar button to open Gmail in a new ta msg_2=Link is copied to the clipboard. msg_3=Selected text is copied to the clipboard. msg_4=Note: For the notifier to work properly, you need to be logged-in into your Google account. +msg_5=Select an audio sound file label_1=Refresh label_2=Settings label_3=Disable all notifications @@ -18,9 +19,11 @@ label_6=For 30 mins label_7=For 1 hour label_8=For 2 hours label_9=For 5 hours +label_13=For a custom time period label_10=Enable notifications label_11=Compose an email -label_12=Open homepage +label_12=Open FAQs +label_14=Logged-in accounts unknown=unknown and=and log_into_your_account=Please log into your account @@ -65,19 +68,27 @@ options_notifications_11=Display "Windows taskbar notification" or "Mac OS Dock options_notifications_12=Taskbar notifications are not supported on Linux OS at the moment. options_notifications_13=Open toolbar panel when click on the taskbar notification icon (Windows only, beta) options_notifications_14=This feature is highly experimental and might make your Firefox browser unstable. [Restart required]. -options_notifications_15=Sound notification is +options_notifications_15=Default sound notification is +options_notifications_31=Custom sound notification +options_notifications_32=name or email contains +options_notifications_33=email title contains +options_notifications_34=email summary contains options_notifications_16=Gmail Notifier default alert options_notifications_17=Checker Plus bell alert options_notifications_18=Checker Plus ding alert options_notifications_19=Windows email alert options_notifications_20=User defined sound options_notifications_21=User defined notification sound is -options_notifications_22=If your browser is not playing the notification sound, try to convert it into a plain WAV format using an online conversion tool. +options_notifications_22=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=To select a new custom sound, select a built-in sound first and then change the option to custom sound options_notifications_23=Volume of the sound notification is options_notifications_24=Volume is a number between 0 to 100 where 100 is the highest volume (default). options_notifications_25=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=Always show tray notification (Windows only) options_notifications_27=Tray notification will be shown even if there is no unread message. +options_notifications_28=Disable all notifications for a custom time period (in minutes): +options_notifications_29=This option is related to the right click menu on the toolbar button -> disable all notifications -> custom time period. +options_notifications_30=Combine all concurrent desktop notifications into a single notification options_tab=Tab Opening: options_tab_1=Search for an open Gmail account only on the active window options_tab_2=Do not search other browser windows for open Gmail accounts. If Gmail is not open in the active window, open a new tab. @@ -86,6 +97,8 @@ options_tab_4=Open Gmail account in the active tab options_tab_5=Open Gmail account in a background tab options_tab_6=Open Gmail account in a new window options_tab_7=Always use blank tabs instead of opening a new tab when open in tab is activated +options_tab_8=Ignore opened Gmail tabs +options_tab_9=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=Toolbar: options_toolbar_1=Toolbar button behaviour options_toolbar_2=Always open email preview panel @@ -111,7 +124,7 @@ options_misc_3=Toolbar color pattern is options_misc_4=Gray color for "No Unread" and blue color for "Disconnected" options_misc_5=Blue color for "No Unread" and gray color for "Disconnected" options_misc_9=Red color for "No Unread" and gray color for "Disconnected" -options_misc_6=Do not show desktop notification to warn that Gmail website is already open +options_misc_6=Show desktop notification to warn that Gmail is already opened in the active tab options_misc_7=Show welcome page on upgrade options_misc_8=Reset all settings back to factory options_misc_10=Only fire desktop and sound notifications when email has arrived in less than (in minutes): @@ -123,6 +136,9 @@ options_px=px options_empty=not defined popup_settings=settings popup_of=of +popup_wait=Wait... +popup_date_format=%mm %dd, %yy +popup_no_subject=(no subject) popup_open_settings=Open settings popup_open_inbox=Open inbox popup_archive=Archive @@ -133,13 +149,13 @@ popup_read=Mark as Read popup_read_all=Mark all as read popup_msg_1=just now popup_msg_2=1 minute ago -popup_msg_3=minutes ago +popup_msg_3_format=%d minutes ago popup_msg_4=1 hour ago popup_msg_5=hours ago popup_msg_6=Yesterday -popup_msg_7=days ago -popup_msg_8=weeks ago -popup_msg_9=months ago +popup_msg_7_format=%d days ago +popup_msg_8_format=%d week(s) ago +popup_msg_9_format=%d month(s) ago popup_msg_10=January popup_msg_11=February popup_msg_12=March @@ -152,3 +168,5 @@ popup_msg_18=September popup_msg_19=October popup_msg_20=November popup_msg_21=December +settings_open_title=Open options (settings) page +settings_open_label=Open Options diff --git a/builds/unpacked/firefox/locale/en.properties b/v1/src/locale/en.properties similarity index 83% rename from builds/unpacked/firefox/locale/en.properties rename to v1/src/locale/en.properties index 9164ae06..2787e257 100644 --- a/builds/unpacked/firefox/locale/en.properties +++ b/v1/src/locale/en.properties @@ -9,6 +9,7 @@ msg_1=Tab is already open. Click on the toolbar button to open Gmail in a new ta msg_2=Link is copied to the clipboard. msg_3=Selected text is copied to the clipboard. msg_4=Note: For the notifier to work properly, you need to be logged-in into your Google account. +msg_5=Select an audio sound file label_1=Refresh label_2=Settings label_3=Disable all notifications @@ -18,9 +19,11 @@ label_6=For 30 mins label_7=For 1 hour label_8=For 2 hours label_9=For 5 hours +label_13=For a custom time period label_10=Enable notifications label_11=Compose an email -label_12=Open homepage +label_12=Open FAQs +label_14=Logged-in accounts unknown=unknown and=and log_into_your_account=Please log into your account @@ -65,19 +68,27 @@ options_notifications_11=Display "Windows taskbar notification" or "Mac OS Dock options_notifications_12=Taskbar notifications are not supported on Linux OS at the moment. options_notifications_13=Open toolbar panel when click on the taskbar notification icon (Windows only, beta) options_notifications_14=This feature is highly experimental and might make your Firefox browser unstable. [Restart required]. -options_notifications_15=Sound notification is +options_notifications_15=Default sound notification is +options_notifications_31=Custom sound notification +options_notifications_32=name or email contains +options_notifications_33=email title contains +options_notifications_34=email summary contains options_notifications_16=Gmail Notifier default alert options_notifications_17=Checker Plus bell alert options_notifications_18=Checker Plus ding alert options_notifications_19=Windows email alert options_notifications_20=User defined sound options_notifications_21=User defined notification sound is -options_notifications_22=If your browser is not playing the notification sound, try to convert it into a plain WAV format using an online conversion tool. +options_notifications_22=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=To select a new custom sound, select a built-in sound first and then change the option to custom sound options_notifications_23=Volume of the sound notification is options_notifications_24=Volume is a number between 0 to 100 where 100 is the highest volume (default). options_notifications_25=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=Always show tray notification (Windows only) options_notifications_27=Tray notification will be shown even if there is no unread message. +options_notifications_28=Disable all notifications for a custom time period (in minutes): +options_notifications_29=This option is related to the right click menu on the toolbar button -> disable all notifications -> custom time period. +options_notifications_30=Combine all concurrent desktop notifications into a single notification options_tab=Tab Opening: options_tab_1=Search for an open Gmail account only on the active window options_tab_2=Do not search other browser windows for open Gmail accounts. If Gmail is not open in the active window, open a new tab. @@ -86,6 +97,8 @@ options_tab_4=Open Gmail account in the active tab options_tab_5=Open Gmail account in a background tab options_tab_6=Open Gmail account in a new window options_tab_7=Always use blank tabs instead of opening a new tab when open in tab is activated +options_tab_8=Ignore opened Gmail tabs +options_tab_9=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=Toolbar: options_toolbar_1=Toolbar button behaviour options_toolbar_2=Always open email preview panel @@ -111,7 +124,7 @@ options_misc_3=Toolbar color pattern is options_misc_4=Gray color for "No Unread" and blue color for "Disconnected" options_misc_5=Blue color for "No Unread" and gray color for "Disconnected" options_misc_9=Red color for "No Unread" and gray color for "Disconnected" -options_misc_6=Do not show desktop notification to warn that Gmail website is already open +options_misc_6=Show desktop notification to warn that Gmail is already opened in the active tab options_misc_7=Show welcome page on upgrade options_misc_8=Reset all settings back to factory options_misc_10=Only fire desktop and sound notifications when email has arrived in less than (in minutes): @@ -123,6 +136,9 @@ options_px=px options_empty=not defined popup_settings=settings popup_of=of +popup_wait=Wait... +popup_date_format=%mm %dd, %yy +popup_no_subject=(no subject) popup_open_settings=Open settings popup_open_inbox=Open inbox popup_archive=Archive @@ -133,13 +149,13 @@ popup_read=Mark as Read popup_read_all=Mark all as read popup_msg_1=just now popup_msg_2=1 minute ago -popup_msg_3=minutes ago +popup_msg_3_format=%d minutes ago popup_msg_4=1 hour ago popup_msg_5=hours ago popup_msg_6=Yesterday -popup_msg_7=days ago -popup_msg_8=weeks ago -popup_msg_9=months ago +popup_msg_7_format=%d days ago +popup_msg_8_format=%d week(s) ago +popup_msg_9_format=%d month(s) ago popup_msg_10=January popup_msg_11=February popup_msg_12=March @@ -152,3 +168,5 @@ popup_msg_18=September popup_msg_19=October popup_msg_20=November popup_msg_21=December +settings_open_title=Open options (settings) page +settings_open_label=Open Options diff --git a/v1/src/locale/fr.properties b/v1/src/locale/fr.properties new file mode 100644 index 00000000..1688cb5a --- /dev/null +++ b/v1/src/locale/fr.properties @@ -0,0 +1,172 @@ +label_9=Pour 5 heures +options_notifications_19=Alerte e-mail Windows +options_notifications_17=Alerte sonore "Bell" de l'extension "Checker Plus" pour Google Chrome +options_notifications_13=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) +options_notifications_30=Combine all concurrent desktop notifications into a single notification +settings_open_label=Open Options +options_timings_l7=Ne pas relever les nouveaux e-mails au démarrage avant (en secondes) : +label_4=Pour 5 min +options_timings_l3=Rappeler les e-mails non lus toutes les (en minutes) : +popup_msg_4=1 heure plus tôt +options_gmail_1=Compte principal (/mail/u/0/) +options_gmail_10=Recevoir les notifications pour les libellés et comptes suivants : +options_notifications_1=Afficher la notification sur le bureau pour les nouveaux e-mails +options_notifications_9=Jouer l'alerte sonore pour les nouveaux e-mails +label_6=Pour 30 min +options_misc_8=Réinitialiser tous les paramètres aux valeurs par défaut +options_notifications_28=Disable all notifications for a custom time period (in minutes): +options_timings_l4=Positionner la valeur à zéro pour tous les rappels non périodiques. +options_notifications_32=name or email contains +options_tab_6=Ouvrir un compte Gmail dans une nouvelle fenêtre +options_notifications_25=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. +options_toolbar_15=Cliquer avec le bouton du milieu sur bouton de la barre d'outils pour +options_toolbar_10=La hauteur minimale est de 500 pixels. +popup_msg_10=Janvier +options_notifications_26=Toujours afficher la notification dans la zone de notification système (uniquement sous Windows) +label_3=Désactiver toutes les notifications +label_13=For a custom time period +options_empty=non défini +options_notifications_3=Cette option peut ne pas fonctionner sur votre système d'exploitation. +options_timings=Temporisations +options_gmail_5=4ème compte (/mail/u/3/) +label_5=Pour 15 min +options_misc_9=Couleur rouge pour "Tous lus" et couleur gris pour "Déconnecté" +popup_msg_5=heures plus tôt +options_notifications_27=La notification dans la zone de notification système sera affichée même si tous les messages sont lus. +options_misc_1=Trier les comptes par ordre alphabétique +tooltip_1=Clic gauche : Ouvrir Gmail ou le panneau de prévisualisation d'e-mail +notification=De : [author_email][break]Objet : [title][break]Résumé : [summary] +popup_trash=Corbeille +options_tab=Ouverture d'onglet : +log_into_your_account=Veuillez vous connecter à votre compte +label_10=Activer les notifications +options_notifications_23=Le volume de la notification sonore est +options_timings_l2=La période minimum est de 10 secondes. +options_toolbar_11=Support des raccourcis clavier dans le panneau de la barre d'outils +options_gmail_9=Des libellés populaires : "inbox", "important", "^smartlabel_personal", "^smartlabel_newsletter", "^smartlabel_notification", et "^smartlabel_group" +popup_msg_17=Août +popup_msg_15=Juin +options_notifications_34=email summary contains +label_14=Logged-in accounts +options_misc_13=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_6=Show desktop notification to warn that Gmail is already opened in the active tab +popup_read=Marquer comme lu +options_notifications_4=Format de notification +settings_open_title=Open options (settings) page +label_2=Paramètres +options_toolbar_14=Si vous préférez le rendu "texte uniquement" dans le mode "contenu total", décochez cette case. +options_notifications_18=Alerte sonore "Ding" de l'extension "Checker Plus" pour Google Chrome +options_tab_5=Ouvrir un compte Gmail dans un onglet d'arrière-plan +label_7=Pour 1 heure +popup_archive=Archive +msg_2=Le lien est copié dans le presse-papiers. +options_title=Options - Gmail™ Notifier +popup_msg_13=Avril +popup_msg_9_format=%d mois plus tôt +popup_msg_11=Février +popup_open_inbox=Ouvrir la boîte de réception +options_tab_9=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. +gmail=Gmail™ Notifier +popup_msg_6=Hier +options_toolbar_8=La largeur minimale est de 500 pixels. +options_notifications_16=Alerte par défaut Gmail Notifier +options_misc_14=Ne pas afficher le nombre badge exact quand le nombre d'e-mails non lus est supérieur à 999 +popup_msg_18=Septembre +options_notifications_14=Cette fonctionnalité est hautement expérimentale et pourrait rendre instable votre navigateur Firefox. [Rédemarrage nécessaire]. +options_gmail_3=2ème compte (/mail/u/1/) +options_notifications_11=Afficher la notification dans la barre de tâches Windows ou dans le dock Mac OS +options_notifications_2=Présenter la notification de bureau pendant (en secondes) : +log_in_to_your_account=Veuillez vous connecter à votre compte Gmail +popup_of=sur +options_notifications_15=Default sound notification is +options_notifications_21=La notification sonore définie par l'utilisateur est +options_toolbar_9=La hauteur du panneau de la barre d'outils dans le mode "contenu total" est (en pixels) : +options_toolbar_1=Comportement du bouton de la barre d'outils +unknown=inconnu +popup_msg_21=Décembre +popup_read_all=Tout marquer comme lu +options_notifications_8=Pour ne pas tronquer avec des points de suspension, utiliser un nombre élevé. +options_donation=Faire un don +msg_3=Le texte sélectionné est copié dans le presse-papiers. +options_misc_7=Afficher la page de bienvenue après une mise à jour +options_gmail=Gmail : +label_1=Rafraîchir +options_notifications_5=Variables disponibles : +options_notifications_24=Le volume est un nombre entre 0 et 100 où 100 est le volume le plus fort (défaut). +options_notifications_10=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_misc_2=Le type de tri par défaut respecte l'ordre de connexions. +options_toolbar_2=Toujours ouvrir le panneau de prévisualisation d'e-mail +popup_settings=paramètres +options_gmail_4=3ème compte (/mail/u/2/) +options_toolbar_5=Afficher le résumé uniquement +options_notifications_12=Les notifications dans la barre de tâches ne sont pas supportées sous Linux pour le moment. +options_notifications_35=To select a new custom sound, select a built-in sound first and then change the option to custom sound +msg_1=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. +popup_refresh=Rafraîchir +options_misc_5=Couleur bleu pour "Tous lus" et couleur gris pour "Déconnecté" +options_timings_l8=Positionner la valeur à zéro pour éviter le relevé d'e-mails jusqu'au premier rafraîchissement manuel [Non disponible sous Safari]. +popup_msg_19=Octobre +options_notifications_33=email title contains +tooltip_3=Clic droit : Sélections des comptes +popup_date_format=%dd %mm %yy +options_notifications=Notifications : +options_timings_l6=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. +popup_msg_12=Mars +options_notifications_22=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_tab_1=Chercher un compte Gmail ouvert seulement dans la fenêtre active +popup_msg_7_format=%d jours plus tôt +options_timings_l1=Relever les nouveaux e-mails tous les (en secondes) : +options_toolbar_4=Mode du panneau de la barre d'outils +toolbar_label=Gmail™ Notifier +popup_msg_1=à l'instant +popup_open_settings=Ouvrir les paramètres +options_misc_3=La légende de la barre d'outils est +options_gmail_12=Séparer les flux par "," (Virgule). Exemple de flux : https://mail.google.com/mail/u/0/feed/atom/inbox +options_toolbar_12=! : Signaler comme spam, # : Mettre à la corbeille, e : Archiver, Shift + i : Marquer comme lu. +options_px=pixel(s) +options_misc_11=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. +options_notifications_20=Son défini par l'utilisateur +and=et +options_tab_7=Toujours utiliser des onglets vierges au lieu d'ouvrir un nouvel onglet quand ouvrir dans un onglet est activé. +options_toolbar_3=Ouvrir un compte Gmail si un seul compte est connecté +options_gmail_7=6ème compte (/mail/u/5/) +popup_msg_8_format=%d semaines plus tôt +options_toolbar=Barre d'outils : +options_notifications_6=Tronquer les notifications plus longues que +popup_wait=Patientez... +tooltip_2=Clic milieu (ou Ctrl+clic gauche) : Rafraîchir tous les comptes +options_notifications_29=This option is related to the right click menu on the toolbar button -> disable all notifications -> custom time period. +options_tab_3=Ouvrir un nouveau compte Gmail à côté de l'onglet actif +options_gmail_8=Marquer le message comme lu en l'archivant +options_toolbar_17=Ouvrir le premier compte Gmail +options_notifications_7=caractères pour les champs [objet] et [résumé]. +options_misc_10=Déclencher uniquement les notifications sonores et de bureau quand un e-mail est arrivé depuis moins de (en minutes) : +options_tab_8=Ignore opened Gmail tabs +popup_no_subject=(aucun objet) +msg_5=Select an audio sound file +popup_msg_2=1 minute plus tôt +popup_msg_16=Juillet +label_8=Pour 2 heures +msg_4=Note : Pour que le notifieur fonctionne correctement, vous devez être connecté à votre compte Google. +popup_msg_20=Novembre +options_toolbar_6=Afficher la totalité du contenu +options_gmail_11=Flux personnalisés : +options_tab_2=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. +label_11=Rédiger un e-mail +options_toolbar_7=La largeur du panneau de la barre d'outils dans le mode "contenu total" est (en pixels) : +options_notifications_31=Custom sound notification +options_timings_l5=La période minimum est de 5 minutes. +options_misc=Divers : +options_gmail_2=Séparer les libellés par "," (Virgule). +options_misc_4=Couleur gris pour "Tous lus" et couleur bleu pour "Déconnecté" +options_toolbar_13=Rendre les e-mails en HTML dans le mode "contenu total" +options_toolbar_16=Rafraîchir tous les comptes +options_gmail_6=5ème compte (/mail/u/4/) +popup_msg_14=Mai +options_inshort=Notifieur multi-comptes et multi-libellés pour Google Mail (Gmail). +options_misc_12=Ne pas inclure de détails d'identifiant dans la bulle textuelle +options_tab_4=Ouvrir un compte Gmail dans l'onglet actif +popup_msg_3_format=%d minutes plus tôt +label_12=Open FAQs +description=Notifieur multi-comptes et multi-libellés pour Google Mail (Gmail) +popup_spam=Spam diff --git a/v1/src/locale/hu.properties b/v1/src/locale/hu.properties new file mode 100644 index 00000000..954e0082 --- /dev/null +++ b/v1/src/locale/hu.properties @@ -0,0 +1,172 @@ +label_9=5 órára +options_notifications_19=Windows e-mail értesítés +options_notifications_17=Checker Plus bell értesítés +options_notifications_13=A tálcaértesítés ikonjára kattintás nyissa meg az eszközpanelt (Csak Windows, béta) +options_notifications_30=Az összes egyidejű asztali értesítés összevonása egy értesítéssé +settings_open_label=Beállítások megnyitása +options_timings_l7=Ne keressen új leveleket induláskor ennyi másodpercig: +label_4=5 percre +options_timings_l3=Emlékeztessen az összes olvasatlan levélre (percenként): +popup_msg_4=1 óra múlva +options_gmail_1=Elsődleges fiók(/mail/u/0/) +options_gmail_10=A következő címkék és fiókok esetén legyen értesítés: +options_notifications_1=Asztali értesítések megjelenítése új levelek érkezésekor +options_notifications_9=Hangjelzés lejátszása új levelek érkezésekor +label_6=30 percre +options_misc_8=Összes beállítás visszaállítása alapértelmezettre +options_notifications_28=Összes értesítés tiltása egyéni időhosszra (percben): +options_timings_l4=Állítsa az értéket 0-ra nem ismétlődő értesítésekhez. +options_notifications_32=név vagy levél tartalmazza +options_tab_6=Gmail-fiók megnyitása új ablakban +options_notifications_25=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_toolbar_15=Az eszköztár gombjára a középső egérgombbal kattintás +options_toolbar_10=A legkisebb magasság is 500px. +popup_msg_10=Január +options_notifications_26=Mindig látszódjon a tálcaértesítő (Csak Windows) +label_3=Összes értesítés tiltása +label_13=Egyéni időhosszra +options_empty=nincs megadva +options_notifications_3=Ez a beállítás lehet, hogy nem működik ezen az operációs rendszeren. +options_timings=Időzítés: +options_gmail_5=Negyedik fiók (/mail/u/3/) +label_5=15 percre +options_misc_9=Piros szín a "Nincs olvasatlan" és szürke szín a "Szétkapcsolva" +popup_msg_5=órával ezelőtt +options_notifications_27=A tálcaértesítő akkor is látszódjon, amikor nincs olvasatlan üzenet. +options_misc_1=Fiókok betűrendbe rendezése +tooltip_1=Jobb egér: Gmail vagy előnézeti panel megnyitása +notification=Feladó: [author_email][break]Tárgy: [title][break]Összegzés: [summary] +popup_trash=Kuka +options_tab=Lap megnyitása: +log_into_your_account=Jelentkezzen be fiókjába +label_10=Értesítések engedélyezése +options_notifications_23=A hangértesítés hangereje +options_timings_l2=A legkisebb időköz 10 másodperc. +options_toolbar_11=Gyorsbillentyű támogatása az eszköztár gombján +options_gmail_9=Néhány népszerű címke: "beérkező", "fontos", "^smartlabel_personal", "^smartlabel_newsletter", "^smartlabel_notification", and "^smartlabel_group" +popup_msg_17=Augusztus +popup_msg_15=Június +options_notifications_34=levélösszegző tartalmazza +label_14=Bejelentkezett fiókok +options_misc_13=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_6=Asztali figyelmeztetés megjelenítése, hogy Gmail már az aktív fülön nyitva van +popup_read=Megj. olvasottként +options_notifications_4=Értesítés formátuma +settings_open_title=Beállítások oldal megnyitása +label_2=Beállítások +options_toolbar_14=Amennyiben a levelet szövegként szeretné látni, nem jelölje be ezt a jelölőnégyzetet. +options_notifications_18=Checker Plus ding értesítés +options_tab_5=Gmail-fiók megnyitása egy háttér lapon +label_7=1 órára +popup_archive=Archív +msg_2=A link a vágólapra került. +options_title=Beállítások - Gmail™ Értesítő +popup_msg_13=Április +popup_msg_9_format=%d hónappal ezelőtt +popup_msg_11=Február +popup_open_inbox=Beérkező levelek megnyitása +options_tab_9=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. +gmail=Gmail™ értesítő +popup_msg_6=Tegnap +options_toolbar_8=A legkisebb szélesség 500px. +options_notifications_16=Gmail értesítő alapértelmezett jelzése +options_misc_14=Ne pontos szám jelenjen meg, amikor az olvasatlan levelek száma nagyobb, mint 999. +popup_msg_18=Szeptember +options_notifications_14=Ez a tulajdonság jelenleg komoly fejlesztés alatt áll, így a Forefox-ot instabillá teheti. [Újraindítás szükséges]. +options_gmail_3=Másodlagos fiók (/mail/u/1/) +options_notifications_11="Windows tálcaértesítés" vagy "Mac OS Dock értesítés" megjelenítése +options_notifications_2=Asztali értesítés megjelenítése ennyi másodpercig: +log_in_to_your_account=Jelentkezzen be Gmail-fiókjába +popup_of=/ +options_notifications_15=Alapértelmezett hangértesítés bekapcsolva +options_notifications_21=A felhasználó által megadott hang +options_toolbar_9=Teljes tartalom megjelenítésekor az eszköztár panel magassága pixelben: +options_toolbar_1=Eszköztárgomb viselkedése +unknown=ismeretlen +popup_msg_21=December +popup_read_all=Összes megjelölése olvasottként +options_notifications_8=Hogy ne lehessen szólevágás, nagy számot adjon meg. +options_donation=Támogasd munkánkat +msg_3=A kijelölt szöveg a vágólapra került. +options_misc_7=Üdvözlő oldal megjelenítése frissítéskor +options_gmail=Gmail: +label_1=Frissítés +options_notifications_5=Használható változók: +options_notifications_24=A hangerő 0 és 100 közötti szám, ahol 100 a leghangosabb (ez az alapértelmezett érték). +options_notifications_10=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_misc_2=Az alapértelmezett rendezés a bejelentkezés sorrendje. +options_toolbar_2=Mindig nyissa meg a levél előnézetpanelét +popup_settings=beállítások +options_gmail_4=Harmadik fiók (/mail/u/2/) +options_toolbar_5=Csak az összegzés megjelenítése +options_notifications_12=Tálcaértesítések nem támogatottak jelenleg Linux alatt. +options_notifications_35=Ú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. +msg_1=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. +popup_refresh=Frissítés +options_misc_5=Kék szín a "Nincs olvasatlan" és szürke szín a "Szétkapcsolva" +options_timings_l8=Á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]. +popup_msg_19=Október +options_notifications_33=levél címe tartalmazza +tooltip_3=Jobb egér: fiókválasztás +popup_date_format=%yy. %mm %dd. +options_notifications=Értesítések: +options_timings_l6=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. +popup_msg_12=Március +options_notifications_22=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_tab_1=Gmail-fiók keresése csak az aktív böngészőablakban +popup_msg_7_format=%d nappal ezelőtt +options_timings_l1=Új levelek ellenőrzése ennyi másodpercenként: +options_toolbar_4=Eszköztár panel mód +toolbar_label=Gmail™ értesítő +popup_msg_1=éppen most +popup_open_settings=Beállítások megnyitása +options_misc_3=Eszköztár panel színmintája +options_gmail_12=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_toolbar_12=!: Spam bejelentése, #: Kuka, e: Archiválás, Shift + i: Megjelölés olvasottként. +options_px=px +options_misc_11=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_notifications_20=Felhasználó által megadott hang +and=és +options_tab_7=Minden esetben új lap nyitása helyett üres lapot használjon, amikor a lapon megnyitás be van kapcsolva +options_toolbar_3=Gmail-fiók megnyitása csak akkor, ha már egy fiókba bejelentkezett. +options_gmail_7=Hatodik fiók (/mail/u/5/) +popup_msg_8_format=%d héttel ezelőtt +options_toolbar=Eszköztár: +options_notifications_6=Értesítés levágása, ha hosszabb mint +popup_wait=Várj... +tooltip_2=Középső (vagy Ctrl+Bal) egér: Összes fiók frissítése +options_notifications_29=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_tab_3=Gmail-fiók megnyitása az aktív lap mellett +options_gmail_8=Archiváláskor olvasottnak megjelölés +options_toolbar_17=Elsődleges Gmail-fiók megnyitása +options_notifications_7=karakternél a [cím] és az [összegzés] mező. +options_misc_10=Csak asztali- és hangértesítés jelezzen amikor levél érkezett kevesebb, mint ennyi percen belül: +options_tab_8=Már nyitva lévő Gmail lapok figyelmen kívül hagyása +popup_no_subject=(nincs tárgy) +msg_5=Válassz egy hangfájlt +popup_msg_2=1 perccel ezelőtt +popup_msg_16=Július +label_8=2 órára +msg_4=Megjegyzés: Az értesítő működéséhez szükséges, hogy Google-fiókjába bejelentkezzen. +popup_msg_20=November +options_toolbar_6=Teljes tartalom megjelenítése +options_gmail_11=Egyéni hírforrások: +options_tab_2=Ne keressen megnyitott Gmail-fiókokért más böngészőablakot. Ha a Gmail nincs megnyitva, új lapon nyissa meg. +label_11=Levél írása +options_toolbar_7=Teljes tartalom megjelenítésekor az eszköztár panel szélessége pixelben: +options_notifications_31=Egyéni hangértesítés +options_timings_l5=A legrövidebb időköz 5 perc. +options_misc=Egyebek: +options_gmail_2=A címkéket vesszővel (","-vel) válassza el. +options_misc_4=Szürke szín a "Nincs olvasatlan" és kék szín a "Szétkapcsolva" +options_toolbar_13=Levél megjelenítése HTML-ként teljes tartalom módban +options_toolbar_16=Összes fiók frissítése +options_gmail_6=Ötödik fiók (/mail/u/4/) +popup_msg_14=Május +options_inshort=Egy vagy több Google Mail (Gmail) fiókhoz, illetve címkéhez értesítő. +options_misc_12=A buboréksúgó szövegébe ne helyezz bejelentkezési adatokat +options_tab_4=Gmail-fiók megnyitása az aktív lapon +popup_msg_3_format=%d perccel ezelőtt +label_12=GyÍK megnyitása +description=Egy vagy több Google Mail (Gmail) fiókhoz, illetve címkéhez értesítő +popup_spam=Spam diff --git a/src/locale/nl.properties b/v1/src/locale/nl.properties similarity index 77% rename from src/locale/nl.properties rename to v1/src/locale/nl.properties index e43d2d32..6eee8f1a 100644 --- a/src/locale/nl.properties +++ b/v1/src/locale/nl.properties @@ -2,32 +2,41 @@ label_9=Voor 5 uur options_notifications_19=Windows-e-mailgeluid options_notifications_17=Checker Plus-belgeluid options_notifications_13=Werkbalkpaneel openen bij klikken op taakbalkmeldingspictogram (alleen op Windows - beta) +options_notifications_30=Alle bureaubladmeldingen samenvoegen in één melding +settings_open_label=Opties openen options_timings_l7=Niet controleren op nieuwe e-mails bij opstarten voor de duur van (in seconden): label_4=Voor 5 minuten options_timings_l3=Herinnering voor alle ongelezen e-mails, elke (in minuten): +popup_msg_4=1 uur geleden options_gmail_1=Hoofdaccount (/mail/u/0/) options_gmail_10=Meldingen ontvangen voor de volgende labels en accounts: options_notifications_1=Bureaubladmelding weergeven bij nieuwe e-mails options_notifications_9=Meldingsgeluid afspelen bij nieuwe e-mails label_6=Voor 30 minuten options_misc_8=Alle instellingen naar standaardwaarden herstellen +options_notifications_28=Schakelt alle meldingen uit voor een aangepaste tijdsperiode (in minuten): options_timings_l4=Stel de waarde op nul in voor niet-periodieke herinneringen. +options_notifications_32=naam of e-mail bevat options_tab_6=Gmail-account openen in een nieuw venster options_notifications_25=Waarschijnlijk werken de standaardmeldingsgeluiden niet goed in Safari. Als dit het geval is moet u een eigen geluidsbestand instellen. options_toolbar_15=Middelklikken op de werkbalkknop om options_toolbar_10=Minimale hoogte is 500px. +popup_msg_10=januari options_notifications_26=Systeemvakmelding altijd weergeven (wordt alleen ondersteund op Windows) label_3=Alle meldingen uitschakelen +label_13=Voor een aangepaste tijdsperiode options_empty=niet opgegeven options_notifications_3=Deze instellingen werkt mogelijk niet, afhankelijk van het door u gebruikte besturingssysteem. options_timings=Tijdstippen options_gmail_5=Vierde account (/mail/u/3) label_5=Voor 15 minuten options_misc_9=Rode kleur voor "Geen ongelezen berichten" en grijze kleur voor "Niet verbonden" +popup_msg_5=uren geleden options_notifications_27=Er zal een systeemvakmelding worden weergegeven zelfs als er geen ongelezen bericht is. options_misc_1=Accounts alfabetisch sorteren tooltip_1=Linksklik: Gmail of het e-mailvoorbeeldpaneel openen notification=Van: [author_email][break]Titel: [title][break]Samenvatting: [summary] +popup_trash=Prullenbak options_tab=Tabblad openen: log_into_your_account=Log alstublieft in op uw account label_10=Meldingen inschakelen @@ -35,30 +44,47 @@ options_notifications_23=Volume van het meldingsgeluid is options_timings_l2=Minimale tijdsduur is 10 seconden. options_toolbar_11=Toetsenbordsneltoetsen ondersteunen op het werkbalkpaneel options_gmail_9=Enkele populaire labels: "postvakIN", "belangrijk", "^slimlabel_persoonlijk", "^slimlabel_nieuwsbrief", "^slimlabel_melding" en "^slimlabel_groep" +popup_msg_17=augustus +popup_msg_15=juni +options_notifications_34=e-mail-samenvatting bevat +label_14=Ingelogde accounts options_misc_13=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_misc_6=Geen bureaubladmeldingen weergeven om te waarschuwen dat de Gmail-website al geopend is +options_misc_6=Bureaubladmeldingen weergeven als waarschuwing wanneer Gmail al geopend is op het actieve tabblad +popup_read=Als gelezen markeren options_notifications_4=Meldingopmaak +settings_open_title=Open de opties-pagina (instellingen) label_2=Instellingen options_toolbar_14=Schakel deze optie uit als u platte tekst-opmaak prefereert in volledige-inhoudsmodus. options_notifications_18=Checker Plus-dinggeluid options_tab_5=Gmail-account openen op een achtergrondtabblad label_7=Voor 1 uur +popup_archive=Archief msg_2=Link is gekopieerd naar het klembord. options_title=Voorkeuren - Gmail™-melder +popup_msg_13=april +popup_msg_9_format=%d maand(en) geleden +popup_msg_11=februari +popup_open_inbox=Postvak IN openen +options_tab_9=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. gmail=Gmail™-melder +popup_msg_6=Gisteren options_toolbar_8=Minimale breedte is 500px. options_notifications_16=Standaardwaarschuwing van Gmail-melder options_misc_14=Geen exact badgenummer weergeven wanneer het aantal ongelezen e-mails hoger is dan 999 +popup_msg_18=september options_notifications_14=Deze optie is zeer experimenteel en kan mogelijk instabiliteit veroorzaken in Firefox. [Herstart vereist]. options_gmail_3=Tweede account (/mail/u/1) options_notifications_11="Windows-taakbalkmelding" of "Mac OS X-dockmelding" weergeven options_notifications_2=Bureaubladmelding weergeven voor de duur van (in seconden): log_in_to_your_account=Log alstublieft in op uw Gmail-account -options_notifications_15=Meldingsgeluid is +popup_of=van +options_notifications_15=Standaard meldingsgeluid is options_notifications_21=Eigen gekozen meldingsgeluid is options_toolbar_9=Werkbalkpaneel-hoogte in de volledige-inhoudsweergave is (in pixels): options_toolbar_1=Gedrag van werkbalkknop unknown=onbekend +popup_msg_21=december +popup_read_all=Alles als gelezen markeren options_notifications_8=Om te afbreking te voorkomen, vul hier een groot getal in. options_donation=Doe een donatie msg_3=Geselecteerde tekst is gekopieerd naar het klembord. @@ -74,17 +100,26 @@ popup_settings=Instellingen options_gmail_4=Derde account (/mail/u/2) options_toolbar_5=Samenvatting weergeven options_notifications_12=Taakbalkmeldingen worden momenteel niet ondersteund op Linux-besturingssystemen. +options_notifications_35=Om een nieuw aangepast geluid te selecteren moet u eerst een ingebouwd geluid selecteren en deze wijzigen naar een aangepast geluid msg_1=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. +popup_refresh=Verversen options_misc_5=Blauwe kleur voor "Geen ongelezen berichten en grijze kleur voor "Niet verbonden" options_timings_l8=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]. +popup_msg_19=oktober +options_notifications_33=e-mail-titel bevat tooltip_3=Rechtsklik: Accountselectie +popup_date_format=%mm %dd, %yy options_notifications=Meldingen: options_timings_l6=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_notifications_22=Als uw browser geen meldingsgeluid afspeelt, probeer dan om het te converteren naar plat WAV-formaat middels een online converteerapplicatie. +popup_msg_12=maart +options_notifications_22=Als uw browser geen aangepast meldingsgeluid afspeelt, probeer dan om het te converteren naar plat WAV-formaat middels een online converteerapplicatie. options_tab_1=Alleen op het actieve venster zoeken naar een openstaand Gmail-account +popup_msg_7_format=%d dagen geleden options_timings_l1=Op nieuwe e-mails controleren, elke (in seconden): options_toolbar_4=Werkbalkpaneel-modus toolbar_label=Gmail™-melder +popup_msg_1=zojuist +popup_open_settings=Instellingen openen options_misc_3=Kleurenpatroon van werkbalk is options_gmail_12=Scheidt feeds met het kommateken (","). Voorbeeldfeed: https://mail.google.com/mail/u/0/feed/atom/inbox options_toolbar_12=!: Rapporteren als spam, #:Verplaatsen naar prullenbak, e:Archiveren, Shift + i: Markeren als ongelezen. @@ -95,21 +130,31 @@ and=en options_tab_7=Altijd lege tabbladen gebruiken in plaats een nieuw tabblad te openen wanneer een tabblad is geactiveerd options_toolbar_3=Gmail-account openen wanneer er slechts één account is ingelogd options_gmail_7=Zesde account (/mail/u/5) +popup_msg_8_format=%d we(e)k(en) geleden options_toolbar=Werkbalk: options_notifications_6=Meldingen afbreken die langer zijn dan +popup_wait=Wachten... tooltip_2=Middelklik (of Ctrl+Links): Alle accounts verversen +options_notifications_29=Deze optie is gerelateerd aan het rechtermuisknopmenu op de werkbalkknop -> Alle meldingen uitschakelen -> Aangepaste tijdsperiode. options_tab_3=Nieuw Gmail-account openen op tabblad naast actief tabblad options_gmail_8=Bericht als gelezen markeren na archiveren options_toolbar_17=Primair Gmail-account openen options_notifications_7=tekens voor [title] en [summary]-velden options_misc_10=Alleen bureaublad- en geluidsmeldingen weergeven wanneer een e-mail binnen is ontvangen in minder dan (in minuten): +options_tab_8=Geopende Gmail-tabbladen negeren +popup_no_subject=(geen onderwerp) +msg_5=Selecteer een audiobestand +popup_msg_2=1 minuut geleden +popup_msg_16=juli label_8=Voor 2 uur msg_4=Let op: om de melder correct te laten werken moet u ingelogd zijn op uw Google-account. +popup_msg_20=november options_toolbar_6=Volledige inhoud weergeven options_gmail_11=Aangepaste feeds: options_tab_2=Niet in andere browservensters zoeken naar openstaande Gmail-accounts. Als Gmail niet is geopend in het actieve venster, wordt een nieuw tabblad geopend. label_11=Een e-mail opstellen options_toolbar_7=Breedte van werkbalkpaneel in volledige-inhoudsweergave is (in pixels): +options_notifications_31=Aangepaste geluidsmelding options_timings_l5=Minimale tijdsduur is 5 minuten. options_misc=Diversen: options_gmail_2=Labels scheiden d.m.v. "," (komma). @@ -117,8 +162,11 @@ options_misc_4=Grijze kleur voor "Geen ongelezen berichten" en blauwe kleur voor options_toolbar_13=E-mails opmaken in HTML in volledige-inhoudsmodus options_toolbar_16=Alle accounts verversen options_gmail_6=Vijfde account (/mail/u/4) +popup_msg_14=mei options_inshort=Labels- en accountsmelder voor Google Mail (Gmail) options_misc_12=Geen inloggegevens in de tooltiptekst weergeven options_tab_4=Gmail-account openen op actief tabblad -label_12=Website openen +popup_msg_3_format=%d minuten geleden +label_12=Veel gestelde vragen (FAQ) openen description=Labels- en accountsmelder voor Google Mail (Gmail) +popup_spam=Spam diff --git a/src/locale/pl.properties b/v1/src/locale/pl.properties similarity index 73% rename from src/locale/pl.properties rename to v1/src/locale/pl.properties index 0f081277..bf2efdc0 100644 --- a/src/locale/pl.properties +++ b/v1/src/locale/pl.properties @@ -2,63 +2,89 @@ label_9=Przez 5 godzin options_notifications_19=Sygnał e-mail Windows options_notifications_17=Dzwonek Checker Plus options_notifications_13=Otwórz panel paska narzędzi podczas kliknięcia na ikonkę powiadomień paska zadań (tylko Windows, beta) -options_timings_l7=Nie sprawdzaj nowych wiadomości przy starcie przez (sekundy): +options_notifications_30=Połącz wszystkie jednoczesne powiadomienia na pulpicie w pojedyncze +settings_open_label=Otwórz opcje +options_timings_l7=Sprawdzaj nowe wiadomości przy starcie po (sekundy): label_4=Przez 5 minut options_timings_l3=Przypominaj o nieprzeczytanych wiadomościach co (minuty): +popup_msg_4=godzinę temu options_gmail_1=Konto główne (/mail/u/0/) options_gmail_10=Otrzymuj powiadomienia dla następujących etykiet oraz kont: options_notifications_1=Wyświetlaj na pulpicie powiadomienia o nowych wiadomościach options_notifications_9=Odtwórz dźwięk po otrzymaniu nowych wiadomości label_6=Przez 30 minut options_misc_8=Przywróć wszystkie ustawienia do fabrycznych +options_notifications_28=Wyłącz wszystkie powiadomienia na własny odstęp czasowy (minuty): options_timings_l4=Ustaw wartość na zero, aby nie otrzymywać przypomnień. +options_notifications_32=nazwa lub e-mail zawiera options_tab_6=Otwórz konto Gmail w nowym oknie options_notifications_25=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ń. options_toolbar_15=Akcja środkowego przycisku myszy na pasku narzędzi: options_toolbar_10=Minimalna wysokość to 500px. +popup_msg_10=stycznia options_notifications_26=Zawsze pokazuj ikony powiadomień (tylko Windows) label_3=Wyłącz wszystkie powiadomienia +label_13=Na własny odstęp czasowy options_empty=nie określono -options_notifications_3=Ta opcja może nie działać na Twoim systemie operacyjnym. +options_notifications_3=Ta opcja może nie działać na twoim systemie operacyjnym. options_timings=Czasowe options_gmail_5=Czwarte konto (/mail/u/3/) label_5=Przez 15 minut options_misc_9=Czerwony dla "Nieprzeczytane" i szary dla "Rozłączony" +popup_msg_5=godzin(y) temu options_notifications_27=Ikony obszaru powiadomień będą zawsze wyświetlane, nawet gdy brak nieprzeczytanych wiadomości. options_misc_1=Sortuj konta alfabetycznie tooltip_1=LPM: Otwórz Gmail lub panel podglądu wiadomości notification=Od: [author_email][break]Tytuł: [title][break]Streszczenie: [summary] +popup_trash=Usuń options_tab=Otwieranie kart: log_into_your_account=Proszę się zalogować do swojego konta label_10=Włącz powiadomienia options_notifications_23=Głośność dźwięku powiadomienia -options_timings_l2=Minimalny okres czasu to 10 sekund. +options_timings_l2=Minimalny odstęp czasowy to 10 sekund. options_toolbar_11=Wsparcie skrótów klawiszowych w panelu paska narzędzi options_gmail_9=Popularne etykiety: "inbox", "important", "^smartlabel_personal", "^smartlabel_newsletter", "^smartlabel_notification" oraz "^smartlabel_group" +popup_msg_17=sierpnia +popup_msg_15=czerwca +options_notifications_34=podsumowanie e-mail'a zawiera +label_14=Zalogowane konta options_misc_13=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_misc_6=Nie pokazuj powiadomień na pulpicie, jeśli strona Gmail jest już otworzona +options_misc_6=Pokazuj powiadomienia na pulpicie, aby powiadomić, że Gmail jest już otwarty w aktywnej karcie +popup_read=Przeczytane options_notifications_4=Format powiadomienia +settings_open_title=Otwórz stronę opcji (ustawień) label_2=Ustawienia -options_toolbar_14=Jeżeli wolisz sam tekst w trybie pełnej zawartości, odznacz to pole. +options_toolbar_14=Jeżeli wolisz surowy tekst w trybie pełnej zawartości, odznacz to pole. options_notifications_18=Dzwoneczek Checker Plus options_tab_5=Otwórz konto Gmail w karcie w tle label_7=Przez godzinę +popup_archive=Archiwizuj msg_2=Link został skopiowany do schowka. options_title=Opcje - Powiadomienia Gmail™ +popup_msg_13=kwietnia +popup_msg_9_format=miesięcy temu: %d +popup_msg_11=lutego +popup_open_inbox=Otwórz skrzynkę +options_tab_9=Jeżeli odznaczono, Powiadomienia Gmail sprawdzą wszystkie otwarte okna w poszukiwaniu karty z otwartym Gmail'em, a następnie otworzy ją na żądanie. gmail=Powiadomienia Gmail™ +popup_msg_6=wczoraj options_toolbar_8=Minimalna szerokość to 500px. options_notifications_16=Domyślny sygnał Powiadomień Gmail™ options_misc_14=Nie wyświetlaj szczegółowej liczby na znaczku, gdy liczba nieprzeczytanych wiadomości jest większa niż 999 +popup_msg_18=września options_notifications_14=Ta funkcjonalność jest eksperymentalna i może uczynić Twoją przeglądarkę Firefox niestabilną [wymagany restart]. options_gmail_3=Drugie konto (/mail/u/1/) options_notifications_11=Wyświetlaj "powiadomienia paska zadań Windows" lub "powiadomienia Mac OS Dock" options_notifications_2=Pokazuj powiadomienia na pulpicie przez (sekundy): log_in_to_your_account=Proszę się zalogować do konta Gmail -options_notifications_15=Dźwięk powiadomienia +popup_of=z +options_notifications_15=Domyślny dźwięk powiadomienia to options_notifications_21=Własny dźwięk powiadomień: options_toolbar_9=Wysokość panelu paska narzędzi w trybie pełnej zawartości (piksele): options_toolbar_1=Zachowanie przycisku paska narzędzi unknown=nieznane +popup_msg_21=grudnia +popup_read_all=Wszystkie przeczytane options_notifications_8=Jeżeli nie chcesz skracać, wpisz dużą liczbę. options_donation=Złóż dotację msg_3=Zaznaczony tekst został skopiowany do schowka. @@ -74,17 +100,26 @@ popup_settings=Ustawienia options_gmail_4=Trzecie konto (/mail/u/2/) options_toolbar_5=Pokazuj tylko podsumowanie options_notifications_12=Obecnie, powiadomienia paska zadań nie są wspierane na systemach Linuks. +options_notifications_35=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 msg_1=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. +popup_refresh=Odśwież options_misc_5=Niebieski dla "Nieprzeczytane" i szary dla "Rozłączony" options_timings_l8=Ustaw wartość na zero, aby nie sprawdzać nowych wiadomości przed pierwszym ręcznym odświeżeniem [niedostępne na Safari]. +popup_msg_19=października +options_notifications_33=tytuł e-mail'a zawiera tooltip_3=PPM: Wybór kont +popup_date_format=%dd %mm %yy options_notifications=Powiadomienia: -options_timings_l6=Wartości inne niż zero wyzwalają powiadomienia na pulpicie oraz dźwięk (podobnie jak otrzymanie nowej poczty), dopóki posiadasz nieprzeczytane wiadomości. -options_notifications_22=Jeżeli Twoja przeglądarka nie odtwarza dźwięku powiadomienia, spróbuj go przekonwertować do zwykłego formatu WAV przy pomocy narzędzi konwersji online. +options_timings_l6=Wartości inne niż zero wyzwalają powiadomienia na pulpicie oraz dźwięk, dopóki posiadasz nieprzeczytane wiadomości (podobnie jak otrzymanie nowej poczty). +popup_msg_12=marca +options_notifications_22=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_tab_1=Szukaj w aktywnym oknie otwartej karty z kontem Gmail +popup_msg_7_format=%d dni temu options_timings_l1=Sprawdzaj nowe wiadomości co (sekundy): options_toolbar_4=Tryb panelu paska narzędzi toolbar_label=Powiadomienia Gmail™ +popup_msg_1=przed chwilą +popup_open_settings=Otwórz ustawienia options_misc_3=Kolor paska narzędzi: options_gmail_12=Oddzielaj kanały znakiem "," (przecinek). Przykładowy kanał: https://mail.google.com/mail/u/0/feed/atom/inbox @@ -93,33 +128,46 @@ options_px=px options_misc_11=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. options_notifications_20=Własny sygnał and=i -options_tab_7=Zawsze używaj pustych kart zamiast otwierania nowej karty przy aktywnej takiej opcji +options_tab_7=Zawsze używaj pustych kart zamiast otwierania nowej karty (gdy opcja otwierania na karcie jest aktywna) options_toolbar_3=Otwieraj konto Gmail, tylko jeżeli zalogowano na jednym options_gmail_7=Szóste konto (/mail/u/5/) +popup_msg_8_format=%d tygodni(e) temu options_toolbar=Pasek narzędzi: options_notifications_6=Skracaj powiadomienia dłuższe niż +popup_wait=Czekaj... tooltip_2=Kółko myszy (lub Ctrl+LPM): Odśwież wszystkie konta +options_notifications_29=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_tab_3=Otwórz kolejne konto Gmail za aktywną kartą options_gmail_8=Oznacz wiadomość jako przeczytaną podczas archiwizowania options_toolbar_17=Otwórz główne konto Gmail options_notifications_7=znaków dla pól [title] oraz [summary]. options_misc_10=Uruchom powiadomienia na pulpicie oraz dźwiękowe, gdy e-mail został otrzymany poniżej (minut): +options_tab_8=Ignoruj otwarte karty Gmail'a +popup_no_subject=(brak tematu) +msg_5=Wybierz plik z dźwiękiem audio +popup_msg_2=minutę temu +popup_msg_16=lipca label_8=Przez 2 godziny msg_4=Informacja: Aby powiadomienia działały poprawnie, musisz być zalogowany do swojego konta Google. +popup_msg_20=listopada options_toolbar_6=Pokazuj pełną zawartość options_gmail_11=Własne kanały: options_tab_2=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ę. label_11=Stwórz wiadomość options_toolbar_7=Szerokość panelu paska narzędzi w trybie pełnej zawartości (piksele): -options_timings_l5=Minimalny czas to 5 minut. +options_notifications_31=Własny dźwięk powiadomienia +options_timings_l5=Minimalny odstęp czasowy to 5 minut. options_misc=Różności: options_gmail_2=Oddzielaj etykiety znakiem "," (przecinek). options_misc_4=Szary dla "Nieprzeczytane" i niebieski dla "Rozłączony" options_toolbar_13=Wyświetlaj wiadomości jako HTML w trybie pełnej zawartości options_toolbar_16=Odśwież wszystkie konta options_gmail_6=Piąte konto (/mail/u/4) +popup_msg_14=maja options_inshort=Etykiety i powiadomienia kont dla Poczty Google (Gmail). options_misc_12=Nie uwzględniaj informacji o profilu w treści okienka podpowiedzi options_tab_4=Otwórz konto Gmail w aktywnej karcie -label_12=Otwórz stronę domową +popup_msg_3_format=%d minut(y) temu +label_12=Otwórz FAQ description=Etykiety i powiadomienia kont dla Poczty Google (Gmail) +popup_spam=Zgłoś spam diff --git a/src/locale/ru.properties b/v1/src/locale/ru-RU.properties similarity index 78% rename from src/locale/ru.properties rename to v1/src/locale/ru-RU.properties index e472dc7b..2df2f496 100644 --- a/src/locale/ru.properties +++ b/v1/src/locale/ru-RU.properties @@ -2,32 +2,41 @@ label_9=на 5 часов options_notifications_19=Оповещение о новом сообщении из Windows options_notifications_17=Звонок из Checker Plus options_notifications_13=При клике на значок в трее открывать окно предварительного просмотра (только для Windows, beta) +options_notifications_30=Объединять несколько параллельных уведомлений в одно +settings_open_label=Открыть настройки options_timings_l7=Не проверять почту сразу после запуска в течении (в секундах): label_4=на 5 минут options_timings_l3=Напоминать о непрочитанных сообщениях каждые (в минутах): +popup_msg_4=1 час назад options_gmail_1=Основной аккаунт (/mail/u/0/) options_gmail_10=Получать оповещения для следующих аккаунтов и ярлыков: options_notifications_1=Показывать всплывающие уведомления для новых сообщений options_notifications_9=Проигрывать звуковое оповещение при получении новых сообщений label_6=на 30 минут options_misc_8=Сбросить все настройки на начальные +options_notifications_28=Отключить все уведомления на определенный период времени Х (в минутах) options_timings_l4=Установите ноль для отключения напоминаний. +options_notifications_32=имя или адрес содержит options_tab_6=Открывать Gmail в новом окне options_notifications_25=В Safari обычно встроенные звуковые оповещения воспроизводятся не правильно, в этом случае используйте пользовательские звуковые файлы для оповещения. options_toolbar_15=Клик средней кнопкой мыши по значку в панели инструментов options_toolbar_10=Минимальная высота окна - 500px. +popup_msg_10=Январь options_notifications_26=Всегда показывать значок уведомления в трее (Только Windows) label_3=Отключить все оповещения... +label_13=на Х минут options_empty=не определен options_notifications_3=Эта функция может не работать в Вашей ОС. options_timings=Расписание: options_gmail_5=Четвертый аккаунт (/mail/u/3/) label_5=на 15 минут options_misc_9=Красный для "Нет непрочитанных" и серый для "Отключен" +popup_msg_5=часов назад options_notifications_27=Значок в трее будет показан даже если нет не прочитанных сообщений. options_misc_1=Сортировать аккаунты по алфавиту tooltip_1=Левый клик: Открыть вкладку Gmail или окно предварительного просмотра notification=От: [author_email][break]Тема: [title][break]Сводка: [summary] +popup_trash=Удалить options_tab=Открытие вкладки Gmail: log_into_your_account=Пожалуйста, войдите в свой аккаунт label_10=Включить оповещения @@ -35,30 +44,47 @@ options_notifications_23=Громкость звукового оповещен options_timings_l2=Минимальный период - 10 сек. options_toolbar_11=Включить горячие клавиши в окне предварительного просмотра options_gmail_9=Некоторые популярные ярлыки: "inbox", "important", "^smartlabel_personal", "^smartlabel_newsletter", "^smartlabel_notification", and "^smartlabel_group" +popup_msg_17=Август +popup_msg_15=Июнь +options_notifications_34=краткая сводка сообщения содержит +label_14=Авторизованные аккаунты options_misc_13=По умолчанию в тексте всплывающей подсказки значка на панели инструментов показывается название учетной записи. -options_misc_6=Не показывать всплывающее уведомление о том, что вкладка Gmail уже открыта +options_misc_6=Показывать всплывающее уведомление о том, что Gmail уже открыт в активной вкладке +popup_read=Прочтено options_notifications_4=Формат уведомления +settings_open_title=Открыть страницу настроек label_2=Настройки options_toolbar_14=Если Вы предпочитаете отображение в виде простого текста в полном режиме - снимите эту галку. options_notifications_18=Динь из Checker Plus options_tab_5=Открывать Gmail в фоновой вкладке label_7=на 1 час +popup_archive=Архивировать msg_2=Ссылка скопирована в буфер обмена. options_title=Настройки +popup_msg_13=Апрель +popup_msg_9_format=%d месяца(ев) назад +popup_msg_11=Февраль +popup_open_inbox=Открыть входящие +options_tab_9=Если активировано, аддон проверяет на наличие открытого уже Gmail и переключает фокус на него. gmail=Оповещение для Gmail™ +popup_msg_6=Вчера options_toolbar_8=Минимальная ширина окна - 500px. -options_notifications_16=Звук оповещения по умолчанию +options_notifications_16=По умолчанию options_misc_14=Не показывать точное количество непрочитанных сообщений на значке в панели инструментов, если оно превышает 999 +popup_msg_18=Сентябрь options_notifications_14=Эта экспериментальная функция и может вызвать нестабильность в работе Firefox. [Требуется перезапуск]. options_gmail_3=Второй аккаунт (/mail/u/1/) options_notifications_11=Показывать "Уведомления панели задач Windows" или "Уведомления в док-панели Mac OS" options_notifications_2=Время показа всплывающих уведомлений (в секундах): log_in_to_your_account=Войдите, пожалуйста, в Ваш аккаунт Gmail -options_notifications_15=Звуковое оповещение: +popup_of=из +options_notifications_15=Звук оповещений по умолчанию options_notifications_21=Пользовательский звук: options_toolbar_9=Высота окна просмотра в полном режиме (в пикселях): options_toolbar_1=Поведение кнопки на панели unknown=не определено +popup_msg_21=Декабрь +popup_read_all=Все прочтено options_notifications_8=Чтобы избежать обрезания сообщений, используйте здесь большие значения. options_donation=Сделать пожертвование msg_3=Выделенный текст скопирован в буфет обмена. @@ -74,17 +100,26 @@ popup_settings=настройки options_gmail_4=Третий аккаунт (/mail/u/2/) options_toolbar_5=Показывать только сводку options_notifications_12=Оповещения на панели задач для Linux OS пока не поддерживаются. +options_notifications_35=Для выбора нового пользовательского звука сначала выберите встроенный звук, а затем измените опцию на пользовательский звук msg_1=Вкладка уже открыта. Нажмите на кнопку на панели инструментов чтобы открыть Gmail в новой вкладке или перейти на уже открытую вкладку Gmail. +popup_refresh=Обновить options_misc_5=Голубой для "Нет непрочитанных" и серый для "Отключен" -options_timings_l8=При установке нуля автоматическая проверка почты начнется только после первого ручного обновления [Не доступно в Safari]. +options_timings_l8=При установке нуля автоматическая проверка почты начнется только после первого ручного обновления (Не доступно в Safari). +popup_msg_19=Октябрь +options_notifications_33=заголовок сообщения содержит tooltip_3=Правый клик: Меню дополнения +popup_date_format=%mm %dd, %yy options_notifications=Всплывающие уведомления: options_timings_l6=Ненулевое значение включает всплывающие уведомления и звуковое оповещение (как при получении нового сообщения). -options_notifications_22=Если Ваш браузер не проигрывает звук, попробуйте конвертировать звуковой файл в формат WAV. +popup_msg_12=Март +options_notifications_22=Если ваш браузер не воспроизводит звук оповещения, попробуйте конвертировать файл в формат WAV с помощью онлайн инструментов. options_tab_1=Отслеживать открытую вкладку Gmail только в активном окне браузера +popup_msg_7_format=%d дней назад options_timings_l1=Проверять почту каждые (в секундах): options_toolbar_4=Режим окна предварительного просмотра toolbar_label=Оповещение для Gmail™ +popup_msg_1=только сейчас +popup_open_settings=Настройки options_misc_3=Цвет значка на панели инструментов options_gmail_12=Разделяйте каналы "," (Запятой). Пример канала: https://mail.google.com/mail/u/0/feed/atom/inbox options_toolbar_12=!: Сообщить о спаме, #: Удалить, e: Архивировать, Shift + i: Отметить как прочитанное. @@ -93,23 +128,33 @@ options_misc_11=Установив здесь нулевое значение, options_notifications_20=Пользовательский звук and=и options_tab_7=Использовать имеющуюся пустую вкладку вместо открытия новой, если активна функция "Открывать во вкладке" -options_toolbar_3=Открывать Gmail только если залогинен один аккаунт +options_toolbar_3=Открывать Gmail только если авторизован один аккаунт options_gmail_7=Шестой аккаунт (/mail/u/5/) +popup_msg_8_format=%d недель назад options_toolbar=Окно предварительного просмотра: options_notifications_6=Обрезать текст уведомления длиннее чем +popup_wait=Ожидайте... tooltip_2=Средний клик (или Ctrl+левый клик): Обновить все аккаунты +options_notifications_29=Эта настройка относится к меню кнопки на панели инструментов -> Отключить все уведомления -> на Х минут options_tab_3=Открывать вкладку Gmail рядом с активной вкладкой options_gmail_8=Отмечать сообщения как прочитанные при архивации options_toolbar_17=Открыть основной аккаунт options_notifications_7=символов для полей [title] и [summary]. options_misc_10=Всплывающие уведомления и звуковое оповещение только для сообщений, полученных менее чем (в минутах): +options_tab_8=Игнорировать открытые с Gmail вкладки +popup_no_subject=(без темы) +msg_5=Выберите звуковой файл +popup_msg_2=1 минуту назад +popup_msg_16=Июль label_8=на 2 часа msg_4=Замечание: Чтобы оповещение работало правильно, вы должны быть залогинены в свой аккаунт Google. +popup_msg_20=Ноябрь options_toolbar_6=Полный режим - показывать сообщение целиком options_gmail_11=Свои каналы: options_tab_2=Не производить поиск открытой вкладки с Gmail в других окнах браузера. Если Gmail не открыт во вкладке активного окна - открыть новую вкладку. label_11=Создать сообщение options_toolbar_7=Ширина окна просмотра в полном режиме (в пискелях): +options_notifications_31=Пользовательское звуковое оповещение options_timings_l5=Минимальный период - 5 мин. options_misc=Дополнительно: options_gmail_2=Разделяйте ярлыки "," (Запятой). @@ -117,8 +162,11 @@ options_misc_4=Серый для "Нет непрочитанных" и голу options_toolbar_13=Отображать сообщения в HTML-формате в полном режиме options_toolbar_16=Обновить все аккаунты options_gmail_6=Пятый аккаунт (/mail/u/4/) +popup_msg_14=Май options_inshort=Оповещение для нескольких аккаунтов Google Mail (Gmail). options_misc_12=Не включать информацию об учетной записи в текст всплывающей подсказки options_tab_4=Открывать Gmail в активной вкладке -label_12=Открыть домашнюю страницу +popup_msg_3_format=%d минут назад +label_12=Открыть FAQ description=Оповещение для нескольких аккаунтов Google Mail (Gmail) +popup_spam=Спам diff --git a/builds/unpacked/firefox/locale/ru.properties b/v1/src/locale/ru.properties similarity index 78% rename from builds/unpacked/firefox/locale/ru.properties rename to v1/src/locale/ru.properties index e472dc7b..2df2f496 100644 --- a/builds/unpacked/firefox/locale/ru.properties +++ b/v1/src/locale/ru.properties @@ -2,32 +2,41 @@ label_9=на 5 часов options_notifications_19=Оповещение о новом сообщении из Windows options_notifications_17=Звонок из Checker Plus options_notifications_13=При клике на значок в трее открывать окно предварительного просмотра (только для Windows, beta) +options_notifications_30=Объединять несколько параллельных уведомлений в одно +settings_open_label=Открыть настройки options_timings_l7=Не проверять почту сразу после запуска в течении (в секундах): label_4=на 5 минут options_timings_l3=Напоминать о непрочитанных сообщениях каждые (в минутах): +popup_msg_4=1 час назад options_gmail_1=Основной аккаунт (/mail/u/0/) options_gmail_10=Получать оповещения для следующих аккаунтов и ярлыков: options_notifications_1=Показывать всплывающие уведомления для новых сообщений options_notifications_9=Проигрывать звуковое оповещение при получении новых сообщений label_6=на 30 минут options_misc_8=Сбросить все настройки на начальные +options_notifications_28=Отключить все уведомления на определенный период времени Х (в минутах) options_timings_l4=Установите ноль для отключения напоминаний. +options_notifications_32=имя или адрес содержит options_tab_6=Открывать Gmail в новом окне options_notifications_25=В Safari обычно встроенные звуковые оповещения воспроизводятся не правильно, в этом случае используйте пользовательские звуковые файлы для оповещения. options_toolbar_15=Клик средней кнопкой мыши по значку в панели инструментов options_toolbar_10=Минимальная высота окна - 500px. +popup_msg_10=Январь options_notifications_26=Всегда показывать значок уведомления в трее (Только Windows) label_3=Отключить все оповещения... +label_13=на Х минут options_empty=не определен options_notifications_3=Эта функция может не работать в Вашей ОС. options_timings=Расписание: options_gmail_5=Четвертый аккаунт (/mail/u/3/) label_5=на 15 минут options_misc_9=Красный для "Нет непрочитанных" и серый для "Отключен" +popup_msg_5=часов назад options_notifications_27=Значок в трее будет показан даже если нет не прочитанных сообщений. options_misc_1=Сортировать аккаунты по алфавиту tooltip_1=Левый клик: Открыть вкладку Gmail или окно предварительного просмотра notification=От: [author_email][break]Тема: [title][break]Сводка: [summary] +popup_trash=Удалить options_tab=Открытие вкладки Gmail: log_into_your_account=Пожалуйста, войдите в свой аккаунт label_10=Включить оповещения @@ -35,30 +44,47 @@ options_notifications_23=Громкость звукового оповещен options_timings_l2=Минимальный период - 10 сек. options_toolbar_11=Включить горячие клавиши в окне предварительного просмотра options_gmail_9=Некоторые популярные ярлыки: "inbox", "important", "^smartlabel_personal", "^smartlabel_newsletter", "^smartlabel_notification", and "^smartlabel_group" +popup_msg_17=Август +popup_msg_15=Июнь +options_notifications_34=краткая сводка сообщения содержит +label_14=Авторизованные аккаунты options_misc_13=По умолчанию в тексте всплывающей подсказки значка на панели инструментов показывается название учетной записи. -options_misc_6=Не показывать всплывающее уведомление о том, что вкладка Gmail уже открыта +options_misc_6=Показывать всплывающее уведомление о том, что Gmail уже открыт в активной вкладке +popup_read=Прочтено options_notifications_4=Формат уведомления +settings_open_title=Открыть страницу настроек label_2=Настройки options_toolbar_14=Если Вы предпочитаете отображение в виде простого текста в полном режиме - снимите эту галку. options_notifications_18=Динь из Checker Plus options_tab_5=Открывать Gmail в фоновой вкладке label_7=на 1 час +popup_archive=Архивировать msg_2=Ссылка скопирована в буфер обмена. options_title=Настройки +popup_msg_13=Апрель +popup_msg_9_format=%d месяца(ев) назад +popup_msg_11=Февраль +popup_open_inbox=Открыть входящие +options_tab_9=Если активировано, аддон проверяет на наличие открытого уже Gmail и переключает фокус на него. gmail=Оповещение для Gmail™ +popup_msg_6=Вчера options_toolbar_8=Минимальная ширина окна - 500px. -options_notifications_16=Звук оповещения по умолчанию +options_notifications_16=По умолчанию options_misc_14=Не показывать точное количество непрочитанных сообщений на значке в панели инструментов, если оно превышает 999 +popup_msg_18=Сентябрь options_notifications_14=Эта экспериментальная функция и может вызвать нестабильность в работе Firefox. [Требуется перезапуск]. options_gmail_3=Второй аккаунт (/mail/u/1/) options_notifications_11=Показывать "Уведомления панели задач Windows" или "Уведомления в док-панели Mac OS" options_notifications_2=Время показа всплывающих уведомлений (в секундах): log_in_to_your_account=Войдите, пожалуйста, в Ваш аккаунт Gmail -options_notifications_15=Звуковое оповещение: +popup_of=из +options_notifications_15=Звук оповещений по умолчанию options_notifications_21=Пользовательский звук: options_toolbar_9=Высота окна просмотра в полном режиме (в пикселях): options_toolbar_1=Поведение кнопки на панели unknown=не определено +popup_msg_21=Декабрь +popup_read_all=Все прочтено options_notifications_8=Чтобы избежать обрезания сообщений, используйте здесь большие значения. options_donation=Сделать пожертвование msg_3=Выделенный текст скопирован в буфет обмена. @@ -74,17 +100,26 @@ popup_settings=настройки options_gmail_4=Третий аккаунт (/mail/u/2/) options_toolbar_5=Показывать только сводку options_notifications_12=Оповещения на панели задач для Linux OS пока не поддерживаются. +options_notifications_35=Для выбора нового пользовательского звука сначала выберите встроенный звук, а затем измените опцию на пользовательский звук msg_1=Вкладка уже открыта. Нажмите на кнопку на панели инструментов чтобы открыть Gmail в новой вкладке или перейти на уже открытую вкладку Gmail. +popup_refresh=Обновить options_misc_5=Голубой для "Нет непрочитанных" и серый для "Отключен" -options_timings_l8=При установке нуля автоматическая проверка почты начнется только после первого ручного обновления [Не доступно в Safari]. +options_timings_l8=При установке нуля автоматическая проверка почты начнется только после первого ручного обновления (Не доступно в Safari). +popup_msg_19=Октябрь +options_notifications_33=заголовок сообщения содержит tooltip_3=Правый клик: Меню дополнения +popup_date_format=%mm %dd, %yy options_notifications=Всплывающие уведомления: options_timings_l6=Ненулевое значение включает всплывающие уведомления и звуковое оповещение (как при получении нового сообщения). -options_notifications_22=Если Ваш браузер не проигрывает звук, попробуйте конвертировать звуковой файл в формат WAV. +popup_msg_12=Март +options_notifications_22=Если ваш браузер не воспроизводит звук оповещения, попробуйте конвертировать файл в формат WAV с помощью онлайн инструментов. options_tab_1=Отслеживать открытую вкладку Gmail только в активном окне браузера +popup_msg_7_format=%d дней назад options_timings_l1=Проверять почту каждые (в секундах): options_toolbar_4=Режим окна предварительного просмотра toolbar_label=Оповещение для Gmail™ +popup_msg_1=только сейчас +popup_open_settings=Настройки options_misc_3=Цвет значка на панели инструментов options_gmail_12=Разделяйте каналы "," (Запятой). Пример канала: https://mail.google.com/mail/u/0/feed/atom/inbox options_toolbar_12=!: Сообщить о спаме, #: Удалить, e: Архивировать, Shift + i: Отметить как прочитанное. @@ -93,23 +128,33 @@ options_misc_11=Установив здесь нулевое значение, options_notifications_20=Пользовательский звук and=и options_tab_7=Использовать имеющуюся пустую вкладку вместо открытия новой, если активна функция "Открывать во вкладке" -options_toolbar_3=Открывать Gmail только если залогинен один аккаунт +options_toolbar_3=Открывать Gmail только если авторизован один аккаунт options_gmail_7=Шестой аккаунт (/mail/u/5/) +popup_msg_8_format=%d недель назад options_toolbar=Окно предварительного просмотра: options_notifications_6=Обрезать текст уведомления длиннее чем +popup_wait=Ожидайте... tooltip_2=Средний клик (или Ctrl+левый клик): Обновить все аккаунты +options_notifications_29=Эта настройка относится к меню кнопки на панели инструментов -> Отключить все уведомления -> на Х минут options_tab_3=Открывать вкладку Gmail рядом с активной вкладкой options_gmail_8=Отмечать сообщения как прочитанные при архивации options_toolbar_17=Открыть основной аккаунт options_notifications_7=символов для полей [title] и [summary]. options_misc_10=Всплывающие уведомления и звуковое оповещение только для сообщений, полученных менее чем (в минутах): +options_tab_8=Игнорировать открытые с Gmail вкладки +popup_no_subject=(без темы) +msg_5=Выберите звуковой файл +popup_msg_2=1 минуту назад +popup_msg_16=Июль label_8=на 2 часа msg_4=Замечание: Чтобы оповещение работало правильно, вы должны быть залогинены в свой аккаунт Google. +popup_msg_20=Ноябрь options_toolbar_6=Полный режим - показывать сообщение целиком options_gmail_11=Свои каналы: options_tab_2=Не производить поиск открытой вкладки с Gmail в других окнах браузера. Если Gmail не открыт во вкладке активного окна - открыть новую вкладку. label_11=Создать сообщение options_toolbar_7=Ширина окна просмотра в полном режиме (в пискелях): +options_notifications_31=Пользовательское звуковое оповещение options_timings_l5=Минимальный период - 5 мин. options_misc=Дополнительно: options_gmail_2=Разделяйте ярлыки "," (Запятой). @@ -117,8 +162,11 @@ options_misc_4=Серый для "Нет непрочитанных" и голу options_toolbar_13=Отображать сообщения в HTML-формате в полном режиме options_toolbar_16=Обновить все аккаунты options_gmail_6=Пятый аккаунт (/mail/u/4/) +popup_msg_14=Май options_inshort=Оповещение для нескольких аккаунтов Google Mail (Gmail). options_misc_12=Не включать информацию об учетной записи в текст всплывающей подсказки options_tab_4=Открывать Gmail в активной вкладке -label_12=Открыть домашнюю страницу +popup_msg_3_format=%d минут назад +label_12=Открыть FAQ description=Оповещение для нескольких аккаунтов Google Mail (Gmail) +popup_spam=Спам diff --git a/v1/src/locale/sr.properties b/v1/src/locale/sr.properties new file mode 100644 index 00000000..6ac53fc5 --- /dev/null +++ b/v1/src/locale/sr.properties @@ -0,0 +1,172 @@ +label_9=На 5 сати +options_notifications_19=Windows email звук +options_notifications_17=Checker Plus bell +options_notifications_13=Отвори панел прегледа поште када кликнем на иконицу обавештења на траци задатака (само Windows, бета) +options_notifications_30=Споји сва истовремена десктоп обавештења у једно обавештење +settings_open_label=Отвори опције +options_timings_l7=Не проверавај нову пошту при покретању у року од (у секундама): +label_4=На 5 минута +options_timings_l3=Подсети на сву непрочитану пошту сваких (у минутима): +popup_msg_4=пре 1 сат +options_gmail_1=Основни налог (/mail/u/0/) +options_gmail_10=Примај обавештења за следеће ознаке и налоге: +options_notifications_1=Прикажи десктоп обавештења о новој пошти +options_notifications_9=Пусти звучно обавештење о новој пошти +label_6=На 30 минута +options_misc_8=Врати сва подешавања на фабричка +options_notifications_28=Онемогући сва обавештења у прилагођеном временском периоду (у минутима) +options_timings_l4=Постави вредност на нула за искључивање подсетника. +options_notifications_32=име или е-пошта садржи +options_tab_6=Отвори Gmail налог у новом прозору +options_notifications_25=У Ѕafari прегледачу највероватније се подразумевани звук обавештења неће емитовати исправно, у том случају употребите прилагођени звук за обавештење. +options_toolbar_15=Средњи клик на дугме на алатној траци +options_toolbar_10=Минимална висина је 500 пиксела. +popup_msg_10=јануар +options_notifications_26=Увек прикажи иконицу обавештења у системској траци (само Windows) +label_3=Онемогући сва обавештења +label_13=У прилагођеном временском периоду +options_empty=недефинисано +options_notifications_3=Ова опција можда неће радити на Вашем оперативном систему. +options_timings=Подешавања времена +options_gmail_5=Четврти налог (/mail/u/3/) +label_5=На 15 минута +options_misc_9=Црвена боја за "Нема непрочитаних" и сива за "Неповезан" +popup_msg_5=сата/и раније +options_notifications_27=Иконица обавештења у системској траци ће бити приказана чак и ако нема непрочитаних порука. +options_misc_1=Поређај налоге по алфабету +tooltip_1=Леви клик: Отвори Gmail или панел прегледа поште +notification=Од: [author_email][break]Наслов: [title][break]Кратак преглед: [summary] +popup_trash=Избриши +options_tab=Отварање картица: +log_into_your_account=Пријавите се својим Gmail налогом +label_10=Омогући обавештења +options_notifications_23=Јачина звука обавештења је +options_timings_l2=Минимални период је 10 секунди. +options_toolbar_11=Омогући тастерске пречице у панелу +options_gmail_9=Неке популарне ознаке: "inbox", "important", "^smartlabel_personal", "^smartlabel_newsletter", "^smartlabel_notification" и "^smartlabel_group" +popup_msg_17=август +popup_msg_15=јун +options_notifications_34=кратак преглед е-поште садржи +label_14=Пријављени налози +options_misc_13=Подразумевано, у опису алатке на дугмету на алатној траци се приказују информације о пријављивању. Одчекирањем ове опције, опис алатке остаје на подразумеваној вредности. +options_misc_6=Прикажи десктоп обавештење као упозорење да је Gmail већ отворен у активној картици +popup_read=Озн. као прочитано +options_notifications_4=Формат обавештења +settings_open_title=Отвори страницу опција (подешавања) +label_2=Подешавања +options_toolbar_14=Одчекирајте ако више волите приказ само текста у режиму приказа пуног садржаја. +options_notifications_18=Checker Plus ding +options_tab_5=Отвори Gmail налог у позадинској картици +label_7=На 1 сат +popup_archive=Архивирај +msg_2=Линк је копиран у клипборд. +options_title=Gmail™ Notifier - Опције +popup_msg_13=април +popup_msg_9_format=пре %d месеца +popup_msg_11=фебруар +popup_open_inbox=Отвори Примљене +options_tab_9=Када је отчекирано, Gmail Notifier проверава у активном или свим отвореним прозорима да ли има отворених Gmail инстанци и пребацује на картицу када је отварање картице захтевано. +gmail=Gmail™ Notifier +popup_msg_6=јуче +options_toolbar_8=Минимална ширина је 500 пиксела. +options_notifications_16=Gmail Notifier подразумевани звук +options_misc_14=Не приказуј тачан број непрочитаних порука на иконици ако је већи од 999 +popup_msg_18=септембар +options_notifications_14=Ово је експериментална функција и може изазвати нестабилност Firefox прегледача. [Неопходно је поновно покретање]. +options_gmail_3=Други налог (/mail/u/1/) +options_notifications_11=Прикажи "Windows обавештења на траци задатака" или "Mac OS Dock обавештења" +options_notifications_2=Прикажи десктоп обавештења у трајању од (у секундама): +log_in_to_your_account=Пријавите се својим Gmail налогом +popup_of=од +options_notifications_15=Подразумевано звучно обавештење је +options_notifications_21=Кориснички дефинисани звук обавештења је +options_toolbar_9=Висина панела у режиму приказа пуног садржаја (у пикселима): +options_toolbar_1=Понашање дугмета на алатној картици +unknown=непознат +popup_msg_21=децембар +popup_read_all=Означи све као прочитано +options_notifications_8=Да би се избегло сечење поруке, употребите велики број. +options_donation=Донирајте +msg_3=Одабрани текст је копиран у клипборд. +options_misc_7=Прикажи страницу добродошлице при надоградњи +options_gmail=Gmail: +label_1=Освежи +options_notifications_5=Доступне варијабле: +options_notifications_24=Јачина је број од 0 до 100 при чему је 100 најгласније (подразумевано). +options_notifications_10=Савет за кориснике Mac система. Од Firefox 28.0 верзије, свим десктоп обавештењима управља Mac Notification Center који емитује додатни звучни сигнал. Потребно је да одчекирате ово звучно обавештење или оно које је генерисано од стране Notification Center Mac система. +options_misc_2=Подразумевани редослед је по времену пријављивања. +options_toolbar_2=Увек отвори панел прегледа поште +popup_settings=подешавања +options_gmail_4=Трећи налог (/mail/u/2/) +options_toolbar_5=Прикажи кратак преглед +options_notifications_12=Обавештења на траци задатака нису подржана у Linux систему. +options_notifications_35=За избор новог прилагођеног звука, изаберите прво уграђени звук а затим промените опцију на прилагођени звук +msg_1=Картица је већ отворена. Кликните на дугме на алатној траци да отворите Gmail у новој картици или да се пребаците на постојећу Gmail картицу. +popup_refresh=Освежи +options_misc_5=Плава боја за "Нема непрочитаних" и сива за "Неповезан" +options_timings_l8=Постави вредност на нула за непроверавање поште до првог ручног ажурирања [није доступно у Safari прегледачу]. +popup_msg_19=октобар +options_notifications_33=наслов е-поште садржи +tooltip_3=Десни клик: Избор налога +popup_date_format=%dd. %mm %yy. +options_notifications=Обавештења: +options_timings_l6=Све вредности осим нуле покрећу десктоп обавештење и звучни сигнал (као када пристигне нова пошта) у задатим временским периодима ако имате непрочитану пошту. +popup_msg_12=март +options_notifications_22=Ако ваш прегледач не емитује прилагођени звук обавештења, покушајте да га конвертујете у WAV формат користећи алат за конвертовање на мрежи. +options_tab_1=Потражи отворени Gmail налог само у активном прозору +popup_msg_7_format=пре %d дана +options_timings_l1=Провери нову пошту сваких (у секундама): +options_toolbar_4=Режим приказа панела +toolbar_label=Gmail™ Notifier +popup_msg_1=управо сада +popup_open_settings=Подешавања +options_misc_3=Боја иконице на алатној траци +options_gmail_12=Одвоји канале "," (зарезом). Пример канала: https://mail.google.com/mail/u/0/feed/atom/inbox +options_toolbar_12=!: Пријави непожељну поруку, #: Отпад, e: Архивирај, Shift + i: Означи као прочитано. +options_px=px +options_misc_11=Постављајући ову вредност на нула, нећете примати ни десктоп ни звучна обавештења; ипак, обавештење у виду ознаке на иконици ће бити приказано. +options_notifications_20=Кориснички дефинисани звук +and=и +options_tab_7=Увек употреби празну картицу уместо отварања нове картице (када је отварање у картици активирано) +options_toolbar_3=Отвори Gmail налог ако је само један налог пријављен +options_gmail_7=Шести налог (/mail/u/5/) +popup_msg_8_format=пре %d седмице/а +options_toolbar=Алатна трака: +options_notifications_6=Скрати обавештења дужа од +popup_wait=Сачекај... +tooltip_2=Средњи (или Ctrl+Леви) клик: Освежи све налоге +options_notifications_29=Ова опција се односи на мени на десном клику на дугмету на алатној траци -> онемогући сва обавештења -> прилагођени временски период +options_tab_3=Отвори нови Gmail налог поред активне картице +options_gmail_8=Означи поруке као прочитане при архивирању +options_toolbar_17=Отвара основни Gmail налог +options_notifications_7=карактера у пољима [title] и [summary]. +options_misc_10=Покрени десктоп и звучна обавештења само за пошту пристиглу у последњих (у минутима): +options_tab_8=Занемари отворене Gmail картице +popup_no_subject=(без наслова) +msg_5=Изаберите датотеку звучног обавештења +popup_msg_2=пре 1 минут +popup_msg_16=јул +label_8=На 2 сата +msg_4=Напомена: Да би обавештења радила исправно, морате бити пријављени на свој Google налог. +popup_msg_20=новембар +options_toolbar_6=Прикажи пун садржај +options_gmail_11=Прилагођени канали: +options_tab_2=Не тражи у другим прозорима прегледача отворене Gmail налоге. Ако Gmail није отворен у активном прозору, отвориће се у новој картици. +label_11=Напиши нову поруку +options_toolbar_7=Ширина панела у режиму приказа пуног садржаја (у пикселима): +options_notifications_31=Прилагођени звук обавештења +options_timings_l5=Минимални период је 5 минута. +options_misc=Остало: +options_gmail_2=Одвоји ознаке "," (зарезом). +options_misc_4=Сива боја за "Нема непрочитаних" и плава за "Неповезан" +options_toolbar_13=Прикажи пошту као HTML у режиму приказа пуног садржаја +options_toolbar_16=Освежава све налоге +options_gmail_6=Пети налог (/mail/u/4/) +popup_msg_14=мај +options_inshort=Обавештења за више Google Mail (Gmail) налога. +options_misc_12=Не обухватај детаље о пријављивању у опису алатке +options_tab_4=Отвори Gmail налог у активној картици +popup_msg_3_format=пре %d минута +label_12=Отвори FAQ +description=Обавештења за више Google Mail (Gmail) налога +popup_spam=Пријави непожељну поруку diff --git a/src/locale/zh-CN.properties b/v1/src/locale/zh-CN.properties similarity index 77% rename from src/locale/zh-CN.properties rename to v1/src/locale/zh-CN.properties index a8b0a218..d6584993 100644 --- a/src/locale/zh-CN.properties +++ b/v1/src/locale/zh-CN.properties @@ -2,32 +2,41 @@ label_9=禁用 5 小时 options_notifications_19=Windows 邮件提醒 options_notifications_17=Checker Plus 钟声 options_notifications_13=在点击任务栏通知图标时打开工具栏面板(仅 Windows,测试版) +options_notifications_30=整合所有连续的桌面通知为单条通知 +settings_open_label=打开选项 options_timings_l7=不检查新邮件,在刚启动的(秒): label_4=禁用 5 分钟 options_timings_l3=提醒有未读邮件,每隔(分钟): +popup_msg_4=1 小时前 options_gmail_1=主帐户 (/mail/u/0/) options_gmail_10=接收下列标签和帐户的通知: options_notifications_1=为新邮件显示桌面通知 options_notifications_9=为新邮件播放声音提醒 label_6=禁用 30 分钟 options_misc_8=重置所有设置到出厂设置 +options_notifications_28=指定时间内禁止所有通知 (分钟): options_timings_l4=设置值为 0 可禁用定期提醒。 +options_notifications_32=名称或电子邮件包含 options_tab_6=在新窗口打开 Gmail 帐户 options_notifications_25=在 Safari 下很可能默认的通知声音不能正常播放,如果您使用了一个自定义文件作为通知声音。 options_toolbar_15=中键单击工具栏按钮 options_toolbar_10=最小高度为 500px。 +popup_msg_10=1月 options_notifications_26=始终显示托盘通知 (仅 Windows) label_3=禁用所有通知 +label_13=自定义时间长度 options_empty=未定义 options_notifications_3=此选项在您的操作系统上可能无法正常工作。 options_timings=时间 options_gmail_5=第四帐户 (/mail/u/3/) label_5=禁用 15 分钟 options_misc_9=红色表示“无未读邮件”,灰色表示“已断开” +popup_msg_5=小时前 options_notifications_27=托盘通知图标将始终显示,即使没有未读邮件。 options_misc_1=按字母排序帐户 tooltip_1=左键单击:打开 Gmail 或邮件预览面板 notification=来自: [author_email][break]标题: [title][break]摘要: [summary] +popup_trash=删除 options_tab=打开标签页: log_into_your_account=请登录您的帐户 label_10=启用通知功能 @@ -35,30 +44,47 @@ options_notifications_23=声音提醒的音量为 options_timings_l2=最小周期为 10 秒。 options_toolbar_11=工具栏面板上支持键盘快捷键 options_gmail_9=部分常用标签: "inbox", "important", "^smartlabel_personal", "^smartlabel_newsletter", "^smartlabel_notification", "^smartlabel_group" +popup_msg_17=8月 +popup_msg_15=6月 +options_notifications_34=邮件摘要包含 +label_14=已登录帐户 options_misc_13=默认情况下,本扩展的工具栏按钮的工具提示带有登录信息。取消此选项时,工具提示文本将恢复默认值。 -options_misc_6=不在 Gmail 网站已经打开时显示桌面通知 +options_misc_6=Show desktop notification to warn that Gmail is already opened in the active tab +popup_read=标为已读 options_notifications_4=通知格式 +settings_open_title=打开选项(设置)页面 label_2=设置 options_toolbar_14=如果您偏好在完整内容模式下只呈现文本形式,取消此框。 options_notifications_18=Checker Plus 铃声 options_tab_5=在后台标签页打开 Gmail 帐户 label_7=禁用 1 小时 +popup_archive=归档 msg_2=链接已复制到剪贴板。 options_title=选项 - Gmail™ Notifier +popup_msg_13=4月 +popup_msg_9_format=%d 个月前 +popup_msg_11=2月 +popup_open_inbox=打开收件箱 +options_tab_9=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. gmail=Gmail™ Notifier +popup_msg_6=昨天 options_toolbar_8=最小宽度为 500px。 options_notifications_16=Gmail Notifier 默认声音 options_misc_14=未读邮件超过 999 封时,不在徽章上显示确切数字 +popup_msg_18=9月 options_notifications_14=此功能是实验性的,并可能导致您的 Firefox 浏览器不稳定 [需要重启]。 options_gmail_3=第二帐户 (/mail/u/1/) options_notifications_11=显示“Windows 任务栏通知”或者“Mac OS Dock 通知” options_notifications_2=显示桌面通知(秒): log_in_to_your_account=请登录您的 Gmail 帐户 -options_notifications_15=声音通知为 +popup_of=/ +options_notifications_15=默认声音是 options_notifications_21=用户定义声音为 options_toolbar_9=完整内容模式下的工具栏面板高度为(像素): options_toolbar_1=工具栏按钮行为 unknown=未知 +popup_msg_21=12月 +popup_read_all=全部标为已读 options_notifications_8=要想没有截断和省略号,在这里使用较大的数值。 options_donation=捐款 msg_3=选定文本已复制到剪贴板。 @@ -74,17 +100,26 @@ popup_settings=设置 options_gmail_4=第三帐户 (/mail/u/2/) options_toolbar_5=只显示摘要 options_notifications_12=任务栏通知目前不支持 Linux 操作系统。 +options_notifications_35=要选择一个新的自定义声音,选择一个内置声音,然后再更改此选项为自定义声音 msg_1=标签页已经打开。点击工具栏上的按钮在新标签页中打开 Gmail,或者切换到现有的 Gmail 标签页。 +popup_refresh=刷新 options_misc_5=蓝色表示“无未读邮件”,灰色表示“已断开” options_timings_l8=设置值为 0 将禁用邮件检查,除非手动刷新 [Safari 上不可用]。 +popup_msg_19=10月 +options_notifications_33=邮件标题包含 tooltip_3=右键单击:选择帐户 +popup_date_format=%yy-%mm-%dd options_notifications=通知: options_timings_l6=非零的值将反复触发桌面通知和提醒声音(类似有新邮件到达),如果您有未读的邮件。 -options_notifications_22=如果您的浏览器没有播放通知声音,尝试使用一种在线转换工具,将它转换为一个纯净的 WAV 格式。 +popup_msg_12=3月 +options_notifications_22=如果您的浏览器不能播放自定义的声音,请尝试用在线转换工具将它转换为纯 WAV 格式。 options_tab_1=只在活动窗口中搜索已打开的 Gmail 帐户 +popup_msg_7_format=%d 天前 options_timings_l1=检查新邮件,每隔(秒): options_toolbar_4=工具栏面板模式 toolbar_label=Gmail™ Notifier +popup_msg_1=刚刚 +popup_open_settings=打开设置 options_misc_3=工具栏颜色模式 options_gmail_12=用 "," (半角逗号) 分隔收取点。收取点样例: https://mail.google.com/mail/u/0/feed/atom/inbox options_toolbar_12=!: 报告为垃圾邮件, #: 删除, e: 归档, Shift + i: 标记为已读。 @@ -95,21 +130,31 @@ and=及 options_tab_7=始终使用空白标签页而不是打开一个新标签页 options_toolbar_3=打开 Gmail 帐户,如果只登录了一个帐户 options_gmail_7=第六帐户 (/mail/u/5/) +popup_msg_8_format=%d 周前 options_toolbar=工具栏: options_notifications_6=截断通知中超过 +popup_wait=等待... tooltip_2=中键 (或 Ctrl+左键) 单击:刷新所有帐户 +options_notifications_29=此选项有关工具栏按钮的右键菜单 -> 禁止所有通知 -> 自定义时间长度。 options_tab_3=在当前标签页后面打开新的 Gmail 帐户 options_gmail_8=归档时标记邮件为已读 options_toolbar_17=打开主要的 Gmail 帐户 options_notifications_7=字符的标题和摘要。 options_misc_10=仅在邮件抵达未超过x分钟时发出桌面和声音通知: +options_tab_8=Ignore opened Gmail tabs +popup_no_subject=(无主题) +msg_5=选择一个声音文件 +popup_msg_2=1 分钟前 +popup_msg_16=7月 label_8=禁用 2 小时 msg_4=注意:为了通知能正常工作,您需要先登录到您的 Google 帐户。 +popup_msg_20=11月 options_toolbar_6=显示完整内容 options_gmail_11=自定义收取点: options_tab_2=不搜索其他浏览器窗口有无打开的 Gmail 帐户。如果活动窗口中没有已打开的 Gmail,打开一个新标签页。 label_11=撰写邮件 options_toolbar_7=完整内容模式下的工具栏面板宽度为(像素): +options_notifications_31=自定义声音通知 options_timings_l5=最小周期为 5 分钟。 options_misc=杂项: options_gmail_2=用 "," (半角逗号) 分隔。 @@ -117,8 +162,11 @@ options_misc_4=灰色表示“无未读邮件”,蓝色表示“已断开” options_toolbar_13=在完整内容模式下,呈现邮件为 HTML 形式 options_toolbar_16=刷新所有帐户 options_gmail_6=第五帐户 (/mail/u/4/) +popup_msg_14=5月 options_inshort=支持多个标签和帐户的通知工具,适用于 Google Mail (Gmail)。 options_misc_12=不在工具提示中包含登录信息 options_tab_4=在当前标签页打开 Gmail 帐户 -label_12=打开主页 +popup_msg_3_format=%d 分钟前 +label_12=打开常见问题 description=支持多个标签和帐户的通知工具,适用于 Google Mail (Gmail) +popup_spam=垃圾 diff --git a/v1/src/manifest.json b/v1/src/manifest.json new file mode 100644 index 00000000..81691613 --- /dev/null +++ b/v1/src/manifest.json @@ -0,0 +1,33 @@ +{ + "name": "Notifier for Gmail™", + "short_name": "ignotifier", + "description": "__MSG_description__", + "author": "InBasic", + "version": "0.7.4", + "manifest_version": 2, + "default_locale": "en", + "permissions": [ + "https://mail.google.com/mail/", + "tabs", + "notifications", + "contextMenus", + "webRequest", + "storage" + ], + "web_accessible_resources": [ + "notification.png" + ], + "browser_action": { + "default_icon": "data/icons/blue/19.png" + }, + "background": { + "page": "lib/wrapper/chrome/background.html" + }, + "options_page": "data/options/index.html", + "homepage_url": "http://add0n.com/gmail-notifier.html", + "icons": { + "16": "data/icons/red/16.png", + "48": "data/icons/red/48.png", + "128": "data/icons/red/128.png" + } +} diff --git a/v1/src/package.json b/v1/src/package.json new file mode 100644 index 00000000..8224f0f7 --- /dev/null +++ b/v1/src/package.json @@ -0,0 +1,28 @@ +{ + "title": "Gmail™ Notifier (restartless)", + "name": "ignotifier", + "description": "Multiple label and account notifier for Google Mail (Gmail)", + "id": "jid0-GjwrPchS3Ugt7xydvqVK4DQk8Ls@jetpack", + "license": "MPLv2.0", + "version": "0.7.4", + "author": "InBasic", + "contributors": [ + "CaTz", + "ecaron" + ], + "lib": "lib", + "main": "./lib/common.js", + "url": "http://add0n.com/gmail-notifier.html", + "permissions": { + "private-browsing": true, + "unsafe-content-script": true, + "cross-domain-content": ["file:///"], + "multiprocess": true + }, + "preferences": [{ + "type": "control", + "label": "Open Options", + "name": "settings_open", + "title": "Open options (settings) page" + }] +} diff --git a/src/update.plist b/v1/src/update.plist similarity index 100% rename from src/update.plist rename to v1/src/update.plist diff --git a/v2/LICENSE b/v2/LICENSE new file mode 120000 index 00000000..ea5b6064 --- /dev/null +++ b/v2/LICENSE @@ -0,0 +1 @@ +../LICENSE \ No newline at end of file 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/v2/_locales/bg/messages.json b/v2/_locales/bg/messages.json new file mode 100644 index 00000000..08d80db6 --- /dev/null +++ b/v2/_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/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/v2/_locales/el/messages.json b/v2/_locales/el/messages.json new file mode 100644 index 00000000..772880c4 --- /dev/null +++ b/v2/_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/v2/_locales/en/messages.json b/v2/_locales/en/messages.json new file mode 100644 index 00000000..c8807a1a --- /dev/null +++ b/v2/_locales/en/messages.json @@ -0,0 +1,576 @@ +{ + "gmail": { + "message": "Notifier for Gmail™" + }, + "toolbar_label": { + "message": "Notifier for Gmail™" + }, + "tooltip_1": { + "message": "Left click: Open Gmail™ or mail preview panel" + }, + "tooltip_2": { + "message": "Middle (or Ctrl+Left) click: Refresh all accounts" + }, + "tooltip_3": { + "message": "Right click: Account selections" + }, + "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" + }, + + "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 a custom time period" + }, + "label_10": { + "message": "Enable notifications (session)" + }, + "label_11": { + "message": "Compose an email" + }, + "label_12": { + "message": "Open FAQs" + }, + "label_14": { + "message": "Logged-in 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 - 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 for 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_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 message as read when archiving it" + }, + "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 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 is" + }, + "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 is" + }, + "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 is" + }, + "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" + }, + "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" + }, + "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 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:" + }, + "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 is (in pixels):" + }, + "options_toolbar_8": { + "message": "Minimum width is 500px." + }, + "options_toolbar_9": { + "message": "Toolbar panel height in the full-content view mode is (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, e: Archive, Shift + i: 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 color pattern is" + }, + "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_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" + }, + "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_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/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/v2/_locales/fr/messages.json b/v2/_locales/fr/messages.json new file mode 100644 index 00000000..11391aaf --- /dev/null +++ b/v2/_locales/fr/messages.json @@ -0,0 +1,769 @@ +{ + "gmail": { + "message": "Notifieur pour Gmail™", + "description": "" + }, + "toolbar_label": { + "message": "Notifieur pour Gmail™", + "description": "" + }, + "tooltip_1": { + "message": "Clic gauche : Ouvrir Gmail™ ou le panneau de prévisualisation d'e-mail", + "description": "" + }, + "tooltip_2": { + "message": "Clic milieu (ou Ctrl+clic gauche) : Rafraîchir tous les comptes", + "description": "" + }, + "tooltip_3": { + "message": "Clic droit : Sélections des comptes", + "description": "" + }, + "description": { + "message": "Notifieur multi-comptes et multi-libellés pour Google Mail (Gmail™)", + "description": "" + }, + "log_in_to_your_account": { + "message": "Veuillez vous connecter à votre compte Gmail™", + "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 basculer sur un onglet Gmail™ existant.", + "description": "" + }, + "msg_2": { + "message": "Le lien est copié dans le presse-papiers.", + "description": "" + }, + "msg_3": { + "message": "Le texte sélectionné est copié dans le presse-papiers.", + "description": "" + }, + "msg_4": { + "message": "Remarque : Pour que le notifieur fonctionne correctement, vous devez être connecté à votre compte Google.", + "description": "" + }, + "msg_5": { + "message": "Choisir un fichier son audio", + "description": "" + }, + "label_1": { + "message": "Rafraîchir", + "description": "" + }, + "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": "" + }, + "label_7": { + "message": "Pour 1 heure", + "description": "" + }, + "label_8": { + "message": "Pour 2 heures", + "description": "" + }, + "label_9": { + "message": "Pour 5 heures", + "description": "" + }, + "label_13": { + "message": "Pour une période de temps personnalisée", + "description": "" + }, + "label_10": { + "message": "Activer les notifications (session)", + "description": "" + }, + "label_11": { + "message": "Rédiger un e-mail", + "description": "" + }, + "label_12": { + "message": "Ouvrir la FAQ", + "description": "" + }, + "label_14": { + "message": "Comptes connectés", + "description": "" + }, + "unknown": { + "message": "inconnu", + "description": "" + }, + "and": { + "message": " et ", + "description": "" + }, + "log_into_your_account": { + "message": "Veuillez vous connecter à votre compte", + "description": "" + }, + "notification": { + "message": "De : [author_email][break] Objet : [title][break] Résumé : [summary]", + "description": "" + }, + "options_title": { + "message": "Options - Gmail™ Notifier", + "description": "" + }, + "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 ", + "description": "" + }, + "options_timings_l1": { + "message": "Relever les nouveaux e-mails tous les (en secondes) :", + "description": "" + }, + "options_timings_l2": { + "message": "La période minimum est de 10 secondes.", + "description": "" + }, + "options_timings_l3": { + "message": "Rappeler les e-mails non lus toutes les (en minutes) :", + "description": "" + }, + "options_timings_l4": { + "message": "Positionner la valeur à zéro pour tous les rappels non périodiques.", + "description": "" + }, + "options_timings_l5": { + "message": "La période minimum est de 5 minutes.", + "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.", + "description": "" + }, + "options_timings_l7": { + "message": "Ne pas relever les nouveaux e-mails au démarrage avant (en secondes) :", + "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 dans Safari].", + "description": "" + }, + "options_gmail": { + "message": "Gmail™ ", + "description": "" + }, + "options_gmail_1": { + "message": "Compte principal (/mail/u/0/)", + "description": "" + }, + "options_gmail_2": { + "message": "Séparer les libellés par \",\" (virgule).", + "description": "" + }, + "options_gmail_3": { + "message": "2ème compte (/mail/u/1/)", + "description": "" + }, + "options_gmail_4": { + "message": "3ème compte (/mail/u/2/)", + "description": "" + }, + "options_gmail_5": { + "message": "4ème compte (/mail/u/3/)", + "description": "" + }, + "options_gmail_6": { + "message": "5ème compte (/mail/u/4/)", + "description": "" + }, + "options_gmail_7": { + "message": "6ème compte (/mail/u/5/)", + "description": "" + }, + "options_gmail_8": { + "message": "Marquer les messages comme lu en les archivant", + "description": "" + }, + "options_gmail_15": { + "message": "Quelques libellés populaires :", + "description": "" + }, + "options_gmail_10": { + "message": "Recevoir les notifications pour les libellés et comptes suivants :", + "description": "" + }, + "options_gmail_11": { + "message": "Flux personnalisés :", + "description": "" + }, + "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_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": "" + }, + "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": "" + }, + "options_notifications_5": { + "message": "Variables disponibles : ", + "description": "" + }, + "options_notifications_6": { + "message": "Tronquer les notifications plus longues que ", + "description": "" + }, + "options_notifications_7": { + "message": " caractères pour les champs [objet] et [résumé].", + "description": "" + }, + "options_notifications_8": { + "message": "Pour ne pas tronquer avec des points de suspension, utilisez un nombre élevé.", + "description": "" + }, + "options_notifications_9": { + "message": "Jouer l'alerte sonore pour les nouveaux e-mails", + "description": "" + }, + "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": "" + }, + "options_notifications_11": { + "message": "Afficher la notification dans la barre de tâches Windows ou dans le dock Mac OS", + "description": "" + }, + "options_notifications_12": { + "message": "Les notifications dans la barre de tâches ne sont pas supportées sous Linux pour le moment.", + "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)", + "description": "" + }, + "options_notifications_14": { + "message": "Cette fonctionnalité est hautement expérimentale et pourrait rendre instable votre navigateur Firefox. [Redémarrage nécessaire].", + "description": "" + }, + "options_notifications_15": { + "message": "La notification sonore par défaut est", + "description": "" + }, + "options_notifications_16": { + "message": "Alerte par défaut Gmail™ Notifier", + "description": "" + }, + "options_notifications_17": { + "message": "Alerte sonore \"Bell\" de l'extension \"Checker Plus\" pour Google Chrome", + "description": "" + }, + "options_notifications_18": { + "message": "Alerte sonore \"Ding\" de l'extension \"Checker Plus\" pour Google Chrome", + "description": "" + }, + "options_notifications_19": { + "message": "Alerte e-mail Windows", + "description": "" + }, + "options_notifications_20": { + "message": "Son défini par l'utilisateur", + "description": "" + }, + "options_notifications_21": { + "message": "La notification sonore définie par l'utilisateur est", + "description": "" + }, + "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_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": "" + }, + "options_notifications_23": { + "message": "Le volume de la notification sonore est", + "description": "" + }, + "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_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_26": { + "message": "Toujours afficher la notification dans la zone de notification système (uniquement sous Windows)", + "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.", + "description": "" + }, + "options_notifications_28": { + "message": "Désactiver toutes les notifications pendant une période de temps personnalisée (en minutes) :", + "description": "" + }, + "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_30": { + "message": "Combiner toutes les notifications simultanées de bureau en une seule notification", + "description": "" + }, + "options_notifications_31": { + "message": "Son de notification personnalisé", + "description": "" + }, + "options_notifications_32": { + "message": "Nom ou contenus d'e-mail", + "description": "" + }, + "options_notifications_33": { + "message": "Titre des contenus d'e-mail", + "description": "" + }, + "options_notifications_34": { + "message": "Sommaire de contenus d'e-mail", + "description": "" + }, + "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": "" + }, + "options_notifications_36": { + "message": "Demander à Gmail™ d'empêcher la redirection vers 'inbox.google.com'", + "description": "" + }, + "options_notifications_37": { + "message": "Afficher le numéro de badge", + "description": "" + }, + "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": "" + }, + "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_tab_6": { + "message": "Ouvrir un compte Gmail™ dans une nouvelle fenêtre", + "description": "" + }, + "options_tab_7": { + "message": "Toujours utiliser des onglets vierges au lieu d'ouvrir un nouvel onglet quand ouvrir dans un onglet est activé.", + "description": "" + }, + "options_tab_8": { + "message": "Ignorer les onglets Gmail™ ouverts", + "description": "" + }, + "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_tab_10": { + "message": "Ouvrir les e-mails en mode HTML basique", + "description": "" + }, + "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_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": "" + }, + "options_toolbar_3": { + "message": "Ouvrir un compte Gmail™ si un seul compte est connecté", + "description": "" + }, + "options_toolbar_18": { + "message": "Ouvrir un compte Gmail™ (mode forcé)", + "description": "" + }, + "options_toolbar_4": { + "message": "Mode du panneau de la barre d'outils", + "description": "" + }, + "options_toolbar_5": { + "message": "Afficher le résumé uniquement", + "description": "" + }, + "options_toolbar_6": { + "message": "Afficher la totalité du contenu", + "description": "" + }, + "options_toolbar_7": { + "message": "La largeur du panneau de la barre d'outils dans le mode \"contenu total\" est (en pixels) :", + "description": "" + }, + "options_toolbar_8": { + "message": "La largeur minimale est de 500 pixels.", + "description": "" + }, + "options_toolbar_9": { + "message": "La hauteur du panneau de la barre d'outils dans le mode \"contenu total\" est (en pixels) :", + "description": "" + }, + "options_toolbar_10": { + "message": "La hauteur minimale est de 500 pixels.", + "description": "" + }, + "options_toolbar_11": { + "message": "Support des raccourcis clavier dans le panneau de la barre d'outils", + "description": "" + }, + "options_toolbar_12": { + "message": "! : Signaler en spam, # : Mettre à la corbeille, e : Archiver, Shift + i : Marquer comme lu.", + "description": "" + }, + "options_toolbar_13": { + "message": "Rendre les e-mails en HTML dans le mode \"contenu total\"", + "description": "" + }, + "options_toolbar_14": { + "message": "Si vous préférez le rendu \"texte uniquement\" dans le mode \"contenu total\", décochez cette case.", + "description": "" + }, + "options_toolbar_15": { + "message": "Cliquer avec le bouton du milieu sur bouton de la barre d'outils pour", + "description": "" + }, + "options_toolbar_16": { + "message": "Rafraîchir tous les comptes", + "description": "" + }, + "options_toolbar_17": { + "message": "Ouvrir le premier compte Gmail™", + "description": "" + }, + "options_misc": { + "message": "Divers ", + "description": "" + }, + "options_misc_1": { + "message": "Trier les comptes par ordre alphabétique", + "description": "" + }, + "options_misc_2": { + "message": "Le type de tri par défaut respecte l'ordre de connexions.", + "description": "" + }, + "options_misc_3": { + "message": "Couleur de l’icône de la barre d'outils :", + "description": "" + }, + "options_misc_4": { + "message": "Gris pour \"Tous lus\" et Bleu pour \"Déconnecté\"", + "description": "" + }, + "options_misc_5": { + "message": "Bleu pour \"Tous lus\" et Gris pour \"Déconnecté\"", + "description": "" + }, + "options_misc_9": { + "message": "Rouge pour \"Tous lus\" et Gris pour \"Déconnecté\"", + "description": "" + }, + "options_misc_6": { + "message": "Afficher une notification sur le bureau pour avertir que Gmail™ est déjà ouvert dans l'onglet actif", + "description": "" + }, + "options_misc_7": { + "message": "Afficher la page de bienvenue après une mise à jour", + "description": "" + }, + "options_misc_8": { + "message": "Réinitialiser tous les paramètres aux valeurs par défaut", + "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) :", + "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_misc_12": { + "message": "Ne pas inclure de détails d'identifiant dans la bulle textuelle", + "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.", + "description": "" + }, + "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_misc_15": { + "message": "Ouvrir la page FAQ sur les mises à jour", + "description": "" + }, + "options_plugins": { + "message": "Plug-ins ", + "description": "" + }, + "options_plugins_1": { + "message": "Libellés Gmail™ et bouton étoile (expérimental)", + "description": "" + }, + "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_px": { + "message": "pixel(s)", + "description": "" + }, + "options_empty": { + "message": "non défini", + "description": "" + }, + "options_button_test": { + "message": "Jouer le son", + "description": "" + }, + "options_button_reset": { + "message": "Remise à zéro des préférences", + "description": "" + }, + "popup_settings": { + "message": "Paramètres", + "description": "" + }, + "popup_of": { + "message": "sur", + "description": "" + }, + "popup_wait": { + "message": "Patientez...", + "description": "" + }, + "popup_date_format": { + "message": "%dd %mm %yy", + "description": "" + }, + "popup_no_subject": { + "message": "(aucun objet)", + "description": "" + }, + "popup_open_settings": { + "message": "Ouvrir les paramètres", + "description": "" + }, + "popup_open_inbox": { + "message": "Ouvrir la boîte de réception", + "description": "" + }, + "popup_archive": { + "message": "Archiver", + "description": "" + }, + "popup_spam": { + "message": "Signaler en spam", + "description": "" + }, + "popup_trash": { + "message": "Mettre à la corbeille", + "description": "" + }, + "popup_refresh": { + "message": "Rafraîchir", + "description": "" + }, + "popup_read": { + "message": "Marquer comme lu", + "description": "" + }, + "popup_read_all": { + "message": "Tout marquer comme lu", + "description": "" + }, + "popup_toggle_dark": { + "message": "Basculer thème sombre ou clair" + "description": "" + }, + "popup_msg_1": { + "message": "à l'instant", + "description": "" + }, + "popup_msg_2": { + "message": "1 minute plus tôt", + "description": "" + }, + "popup_msg_3_format": { + "message": "%d minutes plus tôt", + "description": "" + }, + "popup_msg_4": { + "message": "1 heure plus tôt", + "description": "" + }, + "popup_msg_5": { + "message": "heures plus tôt", + "description": "" + }, + "popup_msg_6": { + "message": "Hier", + "description": "" + }, + "popup_msg_7_format": { + "message": "%d jours plus tôt", + "description": "" + }, + "popup_msg_8_format": { + "message": "%d semaines plus tôt", + "description": "" + }, + "popup_msg_9_format": { + "message": "%d mois plus tôt", + "description": "" + }, + "popup_msg_10": { + "message": "Janvier", + "description": "" + }, + "popup_msg_11": { + "message": "Février", + "description": "" + }, + "popup_msg_12": { + "message": "Mars", + "description": "" + }, + "popup_msg_13": { + "message": "Avril", + "description": "" + }, + "popup_msg_14": { + "message": "Mai", + "description": "" + }, + "popup_msg_15": { + "message": "Juin", + "description": "" + }, + "popup_msg_16": { + "message": "Juillet", + "description": "" + }, + "popup_msg_17": { + "message": "Août", + "description": "" + }, + "popup_msg_18": { + "message": "Septembre", + "description": "" + }, + "popup_msg_19": { + "message": "Octobre", + "description": "" + }, + "popup_msg_20": { + "message": "Novembre", + "description": "" + }, + "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": "" + } +} 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/v2/_locales/hu/messages.json b/v2/_locales/hu/messages.json new file mode 100644 index 00000000..a1477728 --- /dev/null +++ b/v2/_locales/hu/messages.json @@ -0,0 +1,762 @@ +{ + "toolbar_label": { + "message": "Gmail™ értesítő", + "description": "" + }, + "tooltip_1": { + "message": "Jobb egér: Gmail vagy előnézeti panel megnyitása", + "description": "" + }, + "tooltip_2": { + "message": "Középső (vagy Ctrl+Bal) egér: Összes fiók frissítése", + "description": "" + }, + "tooltip_3": { + "message": "Jobb egér: fiókválasztás", + "description": "" + }, + "description": { + "message": "Egy vagy több Google Mail (Gmail) fiókhoz, illetve címkéhez értesítő", + "description": "" + }, + "log_in_to_your_account": { + "message": "Jelentkezzen be Gmail-fiókjába", + "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.", + "description": "" + }, + "msg_2": { + "message": "A link a vágólapra került.", + "description": "" + }, + "msg_3": { + "message": "A kijelölt szöveg a vágólapra került.", + "description": "" + }, + "msg_4": { + "message": "Megjegyzés: Az értesítő működéséhez szükséges, hogy Google-fiókjába bejelentkezzen.", + "description": "" + }, + "msg_5": { + "message": "Válassz egy hangfájlt", + "description": "" + }, + "label_1": { + "message": "Frissítés", + "description": "" + }, + "label_2": { + "message": "Beállítások", + "description": "" + }, + "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": "" + }, + "label_7": { + "message": "1 órára", + "description": "" + }, + "label_8": { + "message": "2 órára", + "description": "" + }, + "label_9": { + "message": "5 órára", + "description": "" + }, + "label_13": { + "message": "Egyéni időhosszra", + "description": "" + }, + "label_10": { + "message": "Értesítések engedélyezése (munkamenet)", + "description": "" + }, + "label_11": { + "message": "Levél írása", + "description": "" + }, + "label_12": { + "message": "GyÍK megnyitása", + "description": "" + }, + "label_14": { + "message": "Bejelentkezett fiókok", + "description": "" + }, + "unknown": { + "message": "ismeretlen", + "description": "" + }, + "and": { + "message": "és", + "description": "" + }, + "log_into_your_account": { + "message": "Jelentkezzen be fiókjába", + "description": "" + }, + "notification": { + "message": "Feladó: [author_email][break]Tárgy: [title][break]Összegzés: [summary]", + "description": "" + }, + "options_title": { + "message": "Beállítások - Gmail™ Értesítő", + "description": "" + }, + "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_timings_l1": { + "message": "Új levelek ellenőrzése ennyi másodpercenként:", + "description": "" + }, + "options_timings_l2": { + "message": "A legkisebb időköz 10 másodperc.", + "description": "" + }, + "options_timings_l3": { + "message": "Emlékeztessen az összes olvasatlan levélre (percenként):", + "description": "" + }, + "options_timings_l4": { + "message": "Állítsa az értéket 0-ra nem ismétlődő értesítésekhez.", + "description": "" + }, + "options_timings_l5": { + "message": "A legrövidebb időköz 5 perc.", + "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.", + "description": "" + }, + "options_timings_l7": { + "message": "Ne keressen új leveleket induláskor ennyi másodpercig:", + "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].", + "description": "" + }, + "options_gmail": { + "message": "Gmail:", + "description": "" + }, + "options_gmail_1": { + "message": "Elsődleges fiók(/mail/u/0/)", + "description": "" + }, + "options_gmail_2": { + "message": "A címkéket vesszővel (\",\"-vel) válassza el.", + "description": "" + }, + "options_gmail_3": { + "message": "Másodlagos fiók (/mail/u/1/)", + "description": "" + }, + "options_gmail_4": { + "message": "Harmadik fiók (/mail/u/2/)", + "description": "" + }, + "options_gmail_5": { + "message": "Negyedik fiók (/mail/u/3/)", + "description": "" + }, + "options_gmail_6": { + "message": "Ötödik fiók (/mail/u/4/)", + "description": "" + }, + "options_gmail_7": { + "message": "Hatodik fiók (/mail/u/5/)", + "description": "" + }, + "options_gmail_8": { + "message": "Archiváláskor olvasottnak megjelölés", + "description": "" + }, + "options_gmail_15": { + "message": "Néhány népszerű címke:", + "description": "" + }, + "options_gmail_10": { + "message": "A következő címkék és fiókok esetén legyen értesítés:", + "description": "" + }, + "options_gmail_11": { + "message": "Egyéni hírcsatornák:", + "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", + "description": "" + }, + "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": "" + }, + "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": "" + }, + "options_notifications_5": { + "message": "Használható változók:", + "description": "" + }, + "options_notifications_6": { + "message": "Értesítés levágása, ha hosszabb mint", + "description": "" + }, + "options_notifications_7": { + "message": "karakternél a [cím] és az [összegzés] mező.", + "description": "" + }, + "options_notifications_8": { + "message": "Hogy ne lehessen szólevágás, nagy számot adjon meg.", + "description": "" + }, + "options_notifications_9": { + "message": "Hangjelzés lejátszása új levelek érkezésekor", + "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.", + "description": "" + }, + "options_notifications_11": { + "message": "\"Windows tálcaértesítés\" vagy \"Mac OS Dock értesítés\" megjelenítése", + "description": "" + }, + "options_notifications_12": { + "message": "Tálcaértesítések nem támogatottak jelenleg Linux alatt.", + "description": "" + }, + "options_notifications_13": { + "message": "A tálcaértesítés ikonjára kattintás nyissa meg az eszközpanelt (Csak Windows, béta)", + "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].", + "description": "" + }, + "options_notifications_15": { + "message": "Alapértelmezett hangértesítés bekapcsolva", + "description": "" + }, + "options_notifications_16": { + "message": "Gmail értesítő alapértelmezett jelzése", + "description": "" + }, + "options_notifications_17": { + "message": "Checker Plus bell értesítés", + "description": "" + }, + "options_notifications_18": { + "message": "Checker Plus ding értesítés", + "description": "" + }, + "options_notifications_19": { + "message": "Windows e-mail értesítés", + "description": "" + }, + "options_notifications_20": { + "message": "Felhasználó által megadott hang", + "description": "" + }, + "options_notifications_21": { + "message": "A felhasználó által megadott hang", + "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..", + "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. ", + "description": "" + }, + "options_notifications_23": { + "message": "A hangértesítés hangereje", + "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).", + "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.", + "description": "" + }, + "options_notifications_26": { + "message": "Mindig látszódjon a tálcaértesítő (Csak Windows)", + "description": "" + }, + "options_notifications_27": { + "message": "A tálcaértesítő akkor is látszódjon, amikor nincs olvasatlan üzenet. ", + "description": "" + }, + "options_notifications_28": { + "message": "Összes értesítés tiltása egyéni időhosszra (percben):", + "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.", + "description": "" + }, + "options_notifications_30": { + "message": "Az összes egyidejű asztali értesítés összevonása egy értesítéssé", + "description": "" + }, + "options_notifications_31": { + "message": "Értesítés egyéni hangja", + "description": "" + }, + "options_notifications_32": { + "message": "név vagy e-mail cím tartalmazza", + "description": "" + }, + "options_notifications_33": { + "message": "levél címe tartalmazza", + "description": "" + }, + "options_notifications_34": { + "message": "levélösszegző tartalmazza", + "description": "" + }, + "options_notifications_36": { + "message": "Gmail kérése az 'inbox.google.com' átirányítás megakadályozására", + "description": "" + }, + "options_notifications_37": { + "message": "Jelvény számának megjelenítése", + "description": "" + }, + "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_notifications_40": { + "message": "Gyorsműveletek bekapcsolása az értesítési dobozból (maximálisan kettő művelet) (csak Chrome)", + "description": "" + }, + "options_notifications_41": { + "message": "Megj. olvasottként", + "description": "" + }, + "options_notifications_42": { + "message": "Archív", + "description": "" + }, + "options_notifications_43": { + "message": "Kuka", + "description": "" + }, + "options_tab": { + "message": "Lap megnyitása:", + "description": "" + }, + "options_tab_1": { + "message": "Gmail-fiók keresése csak az aktív böngészőablakban", + "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.", + "description": "" + }, + "options_tab_3": { + "message": "Gmail-fiók megnyitása az aktív lap mellett", + "description": "" + }, + "options_tab_4": { + "message": "Gmail-fiók megnyitása az aktív lapon", + "description": "" + }, + "options_tab_5": { + "message": "Gmail-fiók megnyitása egy háttér lapon", + "description": "" + }, + "options_tab_6": { + "message": "Gmail-fiók megnyitása új ablakban", + "description": "" + }, + "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_tab_8": { + "message": "Már nyitva lévő Gmail lapok figyelmen kívül hagyása", + "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. ", + "description": "" + }, + "options_tab_10": { + "message": "Levelek megnyitása alap HTML módban", + "description": "" + }, + "options_tab_11": { + "message": "Open the newest unread email instead of opening the INBOX folder", + "description": "" + }, + "options_toolbar": { + "message": "Eszköztár:", + "description": "" + }, + "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_toolbar_9": { + "message": "Teljes tartalom megjelenítésekor az eszköztár panel magassága pixelben:", + "description": "" + }, + "options_toolbar_10": { + "message": "A legkisebb magasság is 500px.", + "description": "" + }, + "options_toolbar_11": { + "message": "Gyorsbillentyű támogatása az eszköztár gombján", + "description": "" + }, + "options_toolbar_12": { + "message": "!: Spam bejelentése, #: Kuka, e: Archiválás, Shift + i: Megjelölés olvasottként.", + "description": "" + }, + "options_toolbar_13": { + "message": "Levél megjelenítése HTML-ként teljes tartalom módban", + "description": "" + }, + "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_toolbar_15": { + "message": "Az eszköztár gombjára a középső egérgombbal kattintás", + "description": "" + }, + "options_toolbar_16": { + "message": "Összes fiók frissítése", + "description": "" + }, + "options_toolbar_17": { + "message": "Elsődleges Gmail-fiók megnyitása", + "description": "" + }, + "options_misc": { + "message": "Egyebek:", + "description": "" + }, + "options_misc_1": { + "message": "Fiókok betűrendbe rendezése", + "description": "" + }, + "options_misc_2": { + "message": "Az alapértelmezett rendezés a bejelentkezés sorrendje.", + "description": "" + }, + "options_misc_3": { + "message": "Eszköztár panel színmintája", + "description": "" + }, + "options_misc_4": { + "message": "Szürke szín a \"Nincs olvasatlan\" és kék szín a \"Szétkapcsolva\"", + "description": "" + }, + "options_misc_5": { + "message": "Kék szín a \"Nincs olvasatlan\" és szürke szín a \"Szétkapcsolva\"", + "description": "" + }, + "options_misc_9": { + "message": "Piros szín a \"Nincs olvasatlan\" és szürke szín a \"Szétkapcsolva\"", + "description": "" + }, + "options_misc_6": { + "message": "Asztali figyelmeztetés megjelenítése, hogy Gmail már az aktív fülön nyitva van ", + "description": "" + }, + "options_misc_7": { + "message": "Üdvözlő oldal megjelenítése frissítéskor", + "description": "" + }, + "options_misc_8": { + "message": "Összes beállítás visszaállítása alapértelmezettre", + "description": "" + }, + "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_misc_12": { + "message": "A buboréksúgó szövegébe ne helyezz bejelentkezési adatokat", + "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.", + "description": "" + }, + "options_misc_14": { + "message": "Ne pontos szám jelenjen meg, amikor az olvasatlan levelek száma nagyobb, mint 999. ", + "description": "" + }, + "options_misc_15": { + "message": "Frissítéskor a GyÍK oldal megnyitása", + "description": "" + }, + "options_plugins": { + "message": "Bővítmények:", + "description": "" + }, + "options_plugins_1": { + "message": "Gmail címkék és csillagok (kísérleti)", + "description": "" + }, + "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_px": { + "message": "px", + "description": "" + }, + "options_empty": { + "message": "nincs megadva", + "description": "" + }, + "options_button_test": { + "message": "Lejátszás", + "description": "" + }, + "options_button_reset": { + "message": "Tulajdonságok alapértelmezettre állítása", + "description": "" + }, + "popup_settings": { + "message": "beállítások", + "description": "" + }, + "popup_of": { + "message": "/", + "description": "" + }, + "popup_wait": { + "message": "Várj...", + "description": "" + }, + "popup_date_format": { + "message": "%yy. %mm %dd.", + "description": "" + }, + "popup_no_subject": { + "message": "(nincs tárgy)", + "description": "" + }, + "popup_open_settings": { + "message": "Beállítások megnyitása", + "description": "" + }, + "popup_open_inbox": { + "message": " Beérkező levelek megnyitása", + "description": "" + }, + "popup_archive": { + "message": "Archív", + "description": "" + }, + "popup_spam": { + "message": "Spam", + "description": "" + }, + "popup_trash": { + "message": "Kuka", + "description": "" + }, + "popup_refresh": { + "message": "Frissítés", + "description": "" + }, + "popup_read": { + "message": "Megj. olvasottként", + "description": "" + }, + "popup_read_all": { + "message": "Összes megjelölése olvasottként", + "description": "" + }, + "popup_msg_1": { + "message": "éppen most", + "description": "" + }, + "popup_msg_2": { + "message": "1 perccel ezelőtt", + "description": "" + }, + "popup_msg_3_format": { + "message": "%d perccel ezelőtt", + "description": "" + }, + "popup_msg_4": { + "message": "1 óra múlva", + "description": "" + }, + "popup_msg_5": { + "message": "órával ezelőtt", + "description": "" + }, + "popup_msg_6": { + "message": "Tegnap", + "description": "" + }, + "popup_msg_7_format": { + "message": "%d nappal ezelőtt", + "description": "" + }, + "popup_msg_8_format": { + "message": "%d héttel ezelőtt", + "description": "" + }, + "popup_msg_9_format": { + "message": "%d hónappal ezelőtt", + "description": "" + }, + "popup_msg_10": { + "message": "Január", + "description": "" + }, + "popup_msg_11": { + "message": "Február", + "description": "" + }, + "popup_msg_12": { + "message": "Március", + "description": "" + }, + "popup_msg_13": { + "message": "Április", + "description": "" + }, + "popup_msg_14": { + "message": "Május", + "description": "" + }, + "popup_msg_15": { + "message": "Június", + "description": "" + }, + "popup_msg_16": { + "message": "Július", + "description": "" + }, + "popup_msg_17": { + "message": "Augusztus", + "description": "" + }, + "popup_msg_18": { + "message": "Szeptember", + "description": "" + }, + "popup_msg_19": { + "message": "Október", + "description": "" + }, + "popup_msg_20": { + "message": "November", + "description": "" + }, + "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/v2/_locales/nl/messages.json b/v2/_locales/nl/messages.json new file mode 100644 index 00000000..6dc380e4 --- /dev/null +++ b/v2/_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/v2/_locales/pl/messages.json b/v2/_locales/pl/messages.json new file mode 100644 index 00000000..ecc52345 --- /dev/null +++ b/v2/_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/v2/_locales/ru/messages.json b/v2/_locales/ru/messages.json new file mode 100644 index 00000000..0adcb5f2 --- /dev/null +++ b/v2/_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/v2/_locales/sr/messages.json b/v2/_locales/sr/messages.json new file mode 100644 index 00000000..6814218b --- /dev/null +++ b/v2/_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/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/v2/_locales/zh_CN/messages.json b/v2/_locales/zh_CN/messages.json new file mode 100644 index 00000000..703c47cf --- /dev/null +++ b/v2/_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/v2/config.js b/v2/config.js new file mode 100644 index 00000000..8d4873d6 --- /dev/null +++ b/v2/config.js @@ -0,0 +1,93 @@ +'use strict'; + +var config = {}; + +config.map = { + number: [ + 'period', 'resetPeriod', 'initialPeriod', 'notificationTime', 'notificationTruncate', + 'notification.sound.media.default.type', 'notification.sound.media.custom0.type', + 'notification.sound.media.custom1.type', 'notification.sound.media.custom2.type', + 'notification.sound.media.custom3.type', 'notification.sound.media.custom4.type', + 'notification.sound.media.custom0.selector', 'notification.sound.media.custom1.selector', + 'notification.sound.media.custom2.selector', 'notification.sound.media.custom3.selector', + 'notification.sound.media.custom4.selector', + 'soundVolume', 'silentTime', 'oldFashion', 'size', 'fullWidth', 'fullHeight', + 'clrPattern', 'threatAsNew' + ], + checkbox: [ + 'notification', 'alert', 'combined', 'searchMode', 'ignoreOpens', + 'relatedToCurrent', 'currentTab', 'background', 'useBlankTabs', + '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' + ] +}; + +config.prefs = { + 'period': 60, // seconds + 'initialPeriod': 3, // seconds + 'resetPeriod': 0, // minutes + 'feeds_0': '', + 'feeds_1': '', + 'feeds_2': '', + 'feeds_3': '', + 'feeds_4': '', + 'feeds_5': '', + 'feeds_custom': '', + 'notification': true, + 'notificationTime': 8, // seconds + 'notificationFormat': chrome.i18n.getMessage('notification'), + 'notificationTruncate': 70, + 'alert': 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': '', + 'soundVolume': 80, + 'silentTime': 10, // minutes + 'combined': navigator.userAgent.indexOf('Firefox') !== -1, + 'searchMode': true, + 'ignoreOpens': false, + 'relatedToCurrent': false, + 'currentTab': false, + 'background': false, + 'useBlankTabs': false, + 'newWindow': false, + 'oldFashion': 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, + '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/v2/data/icons/blue/16.png b/v2/data/icons/blue/16.png new file mode 100644 index 00000000..939325e6 Binary files /dev/null and b/v2/data/icons/blue/16.png differ 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/v2/data/icons/blue/19.png b/v2/data/icons/blue/19.png new file mode 100644 index 00000000..04edc467 Binary files /dev/null and b/v2/data/icons/blue/19.png differ diff --git a/v2/data/icons/blue/32.png b/v2/data/icons/blue/32.png new file mode 100644 index 00000000..93cfc929 Binary files /dev/null and b/v2/data/icons/blue/32.png differ diff --git a/v2/data/icons/browsers/chrome.png b/v2/data/icons/browsers/chrome.png new file mode 100644 index 00000000..b5f0858b Binary files /dev/null and b/v2/data/icons/browsers/chrome.png differ diff --git a/v2/data/icons/browsers/firefox.png b/v2/data/icons/browsers/firefox.png new file mode 100644 index 00000000..43d70b15 Binary files /dev/null and b/v2/data/icons/browsers/firefox.png differ diff --git a/v2/data/icons/browsers/opera.png b/v2/data/icons/browsers/opera.png new file mode 100644 index 00000000..af263ecb Binary files /dev/null and b/v2/data/icons/browsers/opera.png differ diff --git a/v2/data/icons/gray/16.png b/v2/data/icons/gray/16.png new file mode 100644 index 00000000..3016815f Binary files /dev/null and b/v2/data/icons/gray/16.png differ 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/v2/data/icons/gray/32.png b/v2/data/icons/gray/32.png new file mode 100644 index 00000000..be207cb9 Binary files /dev/null and b/v2/data/icons/gray/32.png differ diff --git a/v2/data/icons/load0/16.png b/v2/data/icons/load0/16.png new file mode 100644 index 00000000..a1538d7e Binary files /dev/null and b/v2/data/icons/load0/16.png differ 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/v2/data/icons/load0/19.png b/v2/data/icons/load0/19.png new file mode 100644 index 00000000..c536774d Binary files /dev/null and b/v2/data/icons/load0/19.png differ diff --git a/v2/data/icons/load0/32.png b/v2/data/icons/load0/32.png new file mode 100644 index 00000000..417d1a53 Binary files /dev/null and b/v2/data/icons/load0/32.png differ diff --git a/v2/data/icons/load1/16.png b/v2/data/icons/load1/16.png new file mode 100644 index 00000000..bf33c615 Binary files /dev/null and b/v2/data/icons/load1/16.png differ 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/v2/data/icons/load1/19.png b/v2/data/icons/load1/19.png new file mode 100644 index 00000000..1061ae28 Binary files /dev/null and b/v2/data/icons/load1/19.png differ diff --git a/v2/data/icons/load1/32.png b/v2/data/icons/load1/32.png new file mode 100644 index 00000000..53d8514b Binary files /dev/null and b/v2/data/icons/load1/32.png differ diff --git a/v2/data/icons/load2/16.png b/v2/data/icons/load2/16.png new file mode 100644 index 00000000..884c0456 Binary files /dev/null and b/v2/data/icons/load2/16.png differ 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/v2/data/icons/load2/19.png b/v2/data/icons/load2/19.png new file mode 100644 index 00000000..e80b4d6e Binary files /dev/null and b/v2/data/icons/load2/19.png differ diff --git a/v2/data/icons/load2/32.png b/v2/data/icons/load2/32.png new file mode 100644 index 00000000..30fc0b32 Binary files /dev/null and b/v2/data/icons/load2/32.png differ diff --git a/v2/data/icons/load3/16.png b/v2/data/icons/load3/16.png new file mode 100644 index 00000000..c3004883 Binary files /dev/null and b/v2/data/icons/load3/16.png differ 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/v2/data/icons/load3/19.png b/v2/data/icons/load3/19.png new file mode 100644 index 00000000..65d53754 Binary files /dev/null and b/v2/data/icons/load3/19.png differ diff --git a/v2/data/icons/load3/32.png b/v2/data/icons/load3/32.png new file mode 100644 index 00000000..6e50e0b0 Binary files /dev/null and b/v2/data/icons/load3/32.png differ diff --git a/v2/data/icons/new/16.png b/v2/data/icons/new/16.png new file mode 100644 index 00000000..13f5f5bb Binary files /dev/null and b/v2/data/icons/new/16.png differ 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/v2/data/icons/new/32.png b/v2/data/icons/new/32.png new file mode 100644 index 00000000..f97c3bb6 Binary files /dev/null and b/v2/data/icons/new/32.png differ diff --git a/v2/data/icons/notification/16.png b/v2/data/icons/notification/16.png new file mode 100644 index 00000000..6c4a9c6d Binary files /dev/null and b/v2/data/icons/notification/16.png differ diff --git a/v2/data/icons/notification/32.png b/v2/data/icons/notification/32.png new file mode 100644 index 00000000..d823c40f Binary files /dev/null and b/v2/data/icons/notification/32.png differ diff --git a/v2/data/icons/notification/48.png b/v2/data/icons/notification/48.png new file mode 100644 index 00000000..a20818c5 Binary files /dev/null and b/v2/data/icons/notification/48.png differ diff --git a/v2/data/icons/notification/64.png b/v2/data/icons/notification/64.png new file mode 100644 index 00000000..8794f468 Binary files /dev/null and b/v2/data/icons/notification/64.png differ 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/v2/data/icons/options/64.png b/v2/data/icons/options/64.png new file mode 100644 index 00000000..89470e40 Binary files /dev/null and b/v2/data/icons/options/64.png differ diff --git a/v2/data/icons/red/128.png b/v2/data/icons/red/128.png new file mode 100644 index 00000000..1ab860e8 Binary files /dev/null and b/v2/data/icons/red/128.png differ diff --git a/v2/data/icons/red/16.png b/v2/data/icons/red/16.png new file mode 100644 index 00000000..6c4a9c6d Binary files /dev/null and b/v2/data/icons/red/16.png differ 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/v2/data/icons/red/19.png b/v2/data/icons/red/19.png new file mode 100644 index 00000000..5fa05287 Binary files /dev/null and b/v2/data/icons/red/19.png differ diff --git a/v2/data/icons/red/32.png b/v2/data/icons/red/32.png new file mode 100644 index 00000000..d823c40f Binary files /dev/null and b/v2/data/icons/red/32.png differ diff --git a/v2/data/icons/red/48.png b/v2/data/icons/red/48.png new file mode 100644 index 00000000..a20818c5 Binary files /dev/null and b/v2/data/icons/red/48.png differ diff --git a/v2/data/icons/red/64.png b/v2/data/icons/red/64.png new file mode 100644 index 00000000..8794f468 Binary files /dev/null and b/v2/data/icons/red/64.png differ diff --git a/v2/data/icons/tray/blue.png b/v2/data/icons/tray/blue.png new file mode 100644 index 00000000..316aeb8d Binary files /dev/null and b/v2/data/icons/tray/blue.png differ diff --git a/v2/data/icons/tray/gray.png b/v2/data/icons/tray/gray.png new file mode 100644 index 00000000..2214b121 Binary files /dev/null and b/v2/data/icons/tray/gray.png differ diff --git a/v2/data/icons/tray/red.png b/v2/data/icons/tray/red.png new file mode 100644 index 00000000..145d1c9f Binary files /dev/null and b/v2/data/icons/tray/red.png differ 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/v2/data/locale.js b/v2/data/locale.js new file mode 100644 index 00000000..ee02ab75 --- /dev/null +++ b/v2/data/locale.js @@ -0,0 +1,18 @@ +'use strict'; + +var locale = { + get: chrome.i18n.getMessage +}; + +(elems => { + elems.forEach(elem => { + const att = elem.dataset.l10nValue; + const value = locale.get(elem.dataset.l10nId); + if (att) { + elem.setAttribute(att, value); + } + else { + elem.textContent = value; + } + }); +})([...document.querySelectorAll('[data-l10n-id]')]); diff --git a/v2/data/options/index.css b/v2/data/options/index.css new file mode 100644 index 00000000..b7976dec --- /dev/null +++ b/v2/data/options/index.css @@ -0,0 +1,212 @@ +[hbox] { + display: flex; + flex-direction: row; +} +[vbox] { + display: flex; + flex-direction: column; +} +[pack=center] { + justify-content: center; +} +[align=center] { + align-items: center; +} +[pack=end] { + justify-content: flex-end; +} +[align=end] { + align-items: flex-end; +} +[flex="1"] { + flex: 1; +} + +.note { + color: #707070; + padding: 0; + font-size: 85%; + margin-top: -5px; +} + +.browse { + display: none; + font-weight: bold; + padding: 0 5px; + cursor: pointer; +} +.browse input { + display: none; +} + +body { + align-items: center; + -webkit-align-items: center; + margin: 0; +} +body, +table { + font-size: 14px; + color: #222; + font-family: arial,sans-serif; +} +select, +input { + background-color: #fff; +} +input { + height: 24px; + border: 1px solid #C8C8C8; +} +select { + height: 22px; + border: 0; + outline: 1px solid #C8C8C8; +} + +input[type=checkbox] { + width: 20px; +} + +input[type=number] { + width: 55px; +} + +label>input { + vertical-align: middle; +} + +p { + margin: 0 0 10px 0; + font-size: 110%; +} +label { + align-items: center; + display: flex; +} +#content { + max-width: 800px; +} +.fixed { + width: 120px; + font-size: 120%; +} +@media screen and (max-width: 800px) { + .fixed { + display: none; + } +} +#content>div:not(:last-child) { + border-bottom: solid 1px #E5E5E5; + padding: 10px 0; + margin-bottom: 10px; +} +.content { + padding: 0 10px; +} +.content>* { + display: flex; + margin-bottom: 10px; +} +.content input[type=text], +.content select { + flex: 1; + box-sizing: border-box; +} +.content input, +.content select { + margin-left: 5px; +} +.content input[type=number] { + margin-right: 5px; +} + +#header { + width: 100%; + box-sizing: border-box; + background-color: #F1F1F1; + border-bottom: solid 1px #E5E5E5; + justify-content: center; + -webkit-justify-content: center; +} +#header>div>span { + padding-left: 105px; +} +#header>div:nth-child(1)>span:nth-child(1) { + font-size: 140%; +} + +#header [type=icon] { + width: 90px; + background-image: url(../icons/options/64.png); + background-position: right 10px center; + background-repeat: no-repeat; +} +#header [type=title], +#header [type=description] { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + width: 100%; +} +#header [type=title] { + font-size: 150%; + margin-bottom: 5px; +} +#header [type=description] { + font-size: 85%; + color: #707070 !important; +} +#header ul { + list-style: none; + margin: 0; + padding: 10px; +} +#donation input[type=button] { + background-color: #F07600; + color: #FFF; + border: 1px solid transparent; + border-radius: 0px; + cursor: pointer; + height: 32px; + line-height: 20px; + min-height: 32px; + min-width: 90px; + outline: medium none; + text-align: center; + vertical-align: middle !important; + -webkit-appearance: none; +} + +input:invalid { + border-color: red; + background-color: rgba(255, 0, 0, 0.2); +} + +#notify { + position: fixed; + width: 80%; + max-width: 400px; + height: 100px; + margin: auto; + top: 100px; + background-color: #fff; + box-shadow: 0 0 0 100000px rgba(0, 0, 0, 0.5); + padding: 10px; + font-size: 12px; +} +#notify[data-hidden=true] { + display: none; +} +#notify input { + border: solid 1px rgba(0, 0, 0, 0.1); + background-color: #fff; + margin-left: 5px; + width: 80px; +} + +#donation { + text-decoration: none; + color: #fff; + font-weight: bold; +} diff --git a/v2/data/options/index.html b/v2/data/options/index.html new file mode 100644 index 00000000..51e730d8 --- /dev/null +++ b/v2/data/options/index.html @@ -0,0 +1,429 @@ + + + + + + + + + + + +
    +
    +
    +
    +
    + + +
    +

    +
    + + +
    +

    +

    +

    +
    + + +
    +

    +
    +
    +
    +
    +
    +

    +
    +
    + +
    +

    +

    + +

    +            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
    +          
    +

    +
    +
    + +
    +
    +
    + +
    +
    +
    + +
    +
    +
    + +
    +
    +
    + +
    +
    +
    + +
    +

    +

    +

    +
    +
    +
    +
    +
    + + +
    + + +
    + +

    +
    +
    + +
    +

    [author_name], [author_email], [title] [summary].

    +
    + + + +
    +

    + + +

    + +
    +
    + + + +
    +
    +
    + + + + +
    +
    +
    + + + + +
    +
    +
    + + + + +
    +
    +
    + + + + +
    +
    +
    + + + + +
    + +

    + +

    +

    +
    + +
    +
    + + +
    +

    +
    + + + + +
    +

    + +
    +
    +
    +
    +
    + +

    + +

    + + + + + + + +
    +
    +
    +
    +
    +
    +
    + +
    +
    +
    + +
    +
    + + +
    +

    +
    + + +
    +

    + +

    + +

    +
    +
    +
    +
    +
    + + + + +

    +
    +
    + +
    + +
    + + +
    +

    + + +
    + : + +
    +
    +
    + +
    +
    +
    + +

    +
    +
    +
    + +
    +
    This is message
    +
    + + +
    +
    + + + + + + diff --git a/v2/data/options/index.js b/v2/data/options/index.js new file mode 100644 index 00000000..5c314264 --- /dev/null +++ b/v2/data/options/index.js @@ -0,0 +1,188 @@ +/* globals config */ +'use strict'; + +var notify = (notify => { + let resolve = ''; + notify.addEventListener('click', ({target}) => { + const cmd = target.dataset.cmd; + if (cmd) { + notify.dataset.hidden = true; + } + if (cmd === 'yes' && resolve) { + resolve(); + } + }); + return msg => { + notify.querySelector('div').textContent = msg; + notify.dataset.hidden = false; + return new Promise(r => resolve = r); + }; +})(document.getElementById('notify')); + +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/')) { + 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, () => 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/v2/data/popup/accessibility.js b/v2/data/popup/accessibility.js new file mode 100644 index 00000000..a835399f --- /dev/null +++ b/v2/data/popup/accessibility.js @@ -0,0 +1,68 @@ +/* global qs */ +'use strict'; + +// Link opener for html +{ + const opener = e => { + const target = e.target; + + 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: { + link, + button: e.button, + ctrlKey: e.ctrlKey, + shiftKey: e.shiftKey, + altKey: e.altKey, + metaKey: e.metaKey + } + }, () => e.button === 0 ? window.close() : null); + } + }; + window.addEventListener('click', opener); + qs('iframe').addEventListener('load', () => { + qs('iframe').contentDocument.addEventListener('mousedown', opener); + }); +} + +{ + function 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); + + window.addEventListener('keyup', keyup); + qs('iframe').contentDocument.addEventListener('keyup', keyup); +} + +window.focus(); + +chrome.runtime.getBackgroundPage(b => b.userActions.forEach(c => c())); 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/v2/data/popup/body/index.html b/v2/data/popup/body/index.html new file mode 100644 index 00000000..bb25b04b --- /dev/null +++ b/v2/data/popup/body/index.html @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/v2/data/popup/fetch.gif b/v2/data/popup/fetch.gif new file mode 100644 index 00000000..d896b070 Binary files /dev/null and b/v2/data/popup/fetch.gif differ 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/v2/data/popup/icons.png b/v2/data/popup/icons.png new file mode 100644 index 00000000..e87d387e Binary files /dev/null and b/v2/data/popup/icons.png differ 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/v2/data/popup/index.css b/v2/data/popup/index.css new file mode 100644 index 00000000..59e43274 --- /dev/null +++ b/v2/data/popup/index.css @@ -0,0 +1,325 @@ +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: 30px; + 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; +} +#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-top: 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; +} +#content div[name="body"] > iframe { + border-width: 0; + width: 100%; + height: 50px; + padding-top: 8px; +} + +body[mode="expanded"] #content div[name="body"] > iframe { + height: calc(100% - 145px); + width: calc(100% - 24px); + position: absolute; +} + +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'); +} + +#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: 4px 8px 4px 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/v2/data/popup/index.html b/v2/data/popup/index.html new file mode 100644 index 00000000..e5bcd5f0 --- /dev/null +++ b/v2/data/popup/index.html @@ -0,0 +1,71 @@ + + + + + + + + + +
    +
    Email
    +
    - -
    +
    +
    +
    +
    +
    +
    +
    + Title +
    + +
    + +
    +
    + Sender +
    +
    Email
    +
    date
    +
    +
    + +
    +
    + + + +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
      +
      + + + + + + + + diff --git a/v2/data/popup/index.js b/v2/data/popup/index.js new file mode 100644 index 00000000..4a0f62a6 --- /dev/null +++ b/v2/data/popup/index.js @@ -0,0 +1,538 @@ +/* globals 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' + })); + } +}); + +const notify = msg => chrome.notifications.create(null, { + type: 'basic', + iconUrl: '/data/icons/notification/48.png', + title: chrome.i18n.getMessage('gmail'), + message: msg.message || msg +}); + +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"]', + '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'); + + function addContent(elem, txt) { + if (txt) { + elem.textContent = txt; + } + return elem; + } + return function(tag, txt) { + var 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 +})); + +function updateContent() { + const doSummary = () => { + if (selected.entry) { + qs('iframe').contentDocument.body.textContent = selected.entry.summary + ' ...'; + } + }; + + 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'); + 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'); + 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 { + qs('content').removeAttribute('loading'); + } + } + }).catch(notify)); + } + } + else { + doSummary(); + } +} + +// 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(); + } +}); + +// 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); + } +}); + +// init +qs('iframe').addEventListener('load', () => chrome.runtime.getBackgroundPage(b => { + objs = b.checkEmails.getCached(); + 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/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/v2/data/popup/utils.js b/v2/data/popup/utils.js new file mode 100644 index 00000000..dc0dc039 --- /dev/null +++ b/v2/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/v2/data/popup/wait.gif b/v2/data/popup/wait.gif new file mode 100644 index 00000000..75534e13 Binary files /dev/null and b/v2/data/popup/wait.gif differ diff --git a/v2/data/sounds/0.wav b/v2/data/sounds/0.wav new file mode 100644 index 00000000..9bdc4a28 Binary files /dev/null and b/v2/data/sounds/0.wav differ diff --git a/v2/data/sounds/1.wav b/v2/data/sounds/1.wav new file mode 100644 index 00000000..aea0e6fe Binary files /dev/null and b/v2/data/sounds/1.wav differ diff --git a/v2/data/sounds/2.wav b/v2/data/sounds/2.wav new file mode 100644 index 00000000..c9462afc Binary files /dev/null and b/v2/data/sounds/2.wav differ diff --git a/v2/data/sounds/3.wav b/v2/data/sounds/3.wav new file mode 100644 index 00000000..4640f29c Binary files /dev/null and b/v2/data/sounds/3.wav differ diff --git a/v2/lib/common.js b/v2/lib/common.js new file mode 100644 index 00000000..47f00e01 --- /dev/null +++ b/v2/lib/common.js @@ -0,0 +1,589 @@ +/* eslint-disable */ + +/* global app, config, timer, server, contextmenu, toolbar, gmail */ +'use strict'; + +var repeater; // main repeater +var resetTimer; // periodic repeater + +// disable sound on a user action +app.actions(() => app.sound.stop()); + +var actions = { + silent: time => { + if (time === 'custom') { + time = config.notification.silentTime * 60; + } + config.notification.silent = window + .setTimeout(() => config.notification.silent = false, time * 1000); + }, + reset: () => repeater.reset(true), + 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 = []) { + console.log('PLAY', arr); + + const media = config.notification.sound.media; + 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 => { + if (obj.selector === 0) { + return arr.reduce(function(p, c) { + return p || ( + c.author_email.toLowerCase().indexOf(obj.filter.toLowerCase()) !== -1 || + c.author_name.toLowerCase().indexOf(obj.filter.toLowerCase()) !== -1 + ); + }, false); + } + if (obj.selector === 1) { + return arr.reduce(function(p, c) { + return p || c.title.toLowerCase().indexOf(obj.filter.toLowerCase()) !== -1; + }, false); + } + if (obj.selector === 2) { + return arr.reduce(function(p, c) { + return p || c.summary.toLowerCase().indexOf(obj.filter.toLowerCase()) !== -1; + }, false); + } + return false; + }); + app.sound.play(filters.length ? filters[0].index : null); +} + +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.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; + } + + (new Promise(resolve => { + if (config.tabs.ignoreOpens) { + resolve([]); + } + const options = {}; + if (config.tabs.search) { + options.currentWindow = true; + } + 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]; + if (tab.url === url) { + if (config.tabs.NotifyGmailIsOpen && tab.active) { + app.notify(app.l10n('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 (config.tabs.NotifyGmailIsOpen) { + app.notify(app.l10n('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 (config.tabs.open.mode === 2) { + chrome.tabs.query({ + active: true, + currentWindow: true + }, ([tab]) => chrome.tabs.update(tab.id, {url})); + } + else if (config.tabs.open.mode === 0) { + chrome.tabs.query({ + active: true, + currentWindow: true + }, ([tab]) => { + const options = { + url, + active: typeof inBackground === 'undefined' ? !config.tabs.open.background : !inBackground + }; + if (config.tabs.open.relatedToCurrent) { + options.index = tab.index + 1; + } + chrome.tabs.create(options); + }); + } + else { + chrome.windows.create({ + url, + focused: typeof inBackground === 'undefined' ? !config.tabs.open.background : !inBackground + }); + } + }); +} + +var checkEmails = (function() { + let color = 'blue'; + let count = -1; + let cachedEmails; + let emails; + let feeds = ''; + let isPrivate = app.isPrivate(); + + return { + execute: function(forced) { + if (forced) { + toolbar.icon = 'load'; + toolbar.badge = 0; + color = 'load'; + } + // Cancel previous execution? + if (emails && emails.length) { + emails.forEach(e => e.reject()); + } + + if (config.email.feeds.join(', ') !== feeds || isPrivate !== app.isPrivate()) { + isPrivate = app.isPrivate(); + emails = config.email.feeds.map(function(feed) { + return new server.Email(feed, config.email.timeout); + }); + // supporting private mode + if (app.isPrivate()) { + emails = emails.concat(config.email.feeds.map(function(feed) { + return new server.Email(feed, config.email.timeout, true); + })); + } + + feeds = config.email.feeds.join(', '); + } + // Execute fresh servers + Promise.all(emails.map(function(e) { + return e.execute().catch(() => {}); + })).then(objs => { // Removing error objects + objs = objs.filter(o => o); + // Make sure there is no duplicate account + let tmp = objs + .map(o => (o.notAuthorized === true || o.network === false) ? null : (o.xml ? o.xml.title + '/' + o.xml.label : null)) + .map((l, i, a) => !l ? false : a.indexOf(l) !== i); + tmp.forEach(function(v, i) { + if (!v) { + return; + } + objs[i].notAuthorized = true; + objs[i].xml = null; + objs[i].newIDs = []; + }); + + var isAuthorized = objs.reduce(function(p, c) { + return p || (!c.notAuthorized && c.network); + }, false); + var anyNewEmails = objs.reduce(function(p, c) { + return p || (c.newIDs.length !== 0); + }, false); + if (!isAuthorized) { + if (color !== 'blue') { + toolbar.icon = 'blue'; + toolbar.badge = 0; + color = 'blue'; + count = -1; + cachedEmails = []; + contextmenu.fireContext(); + app.popup.detach(); + } + if (forced) { + open(config.email.url); + app.notify(app.l10n('log_into_your_account')); + } + toolbar.label = config.labels.tooltip; + app.popup.detach(); + return; + } + // Removing not logged-in accounts + objs = objs.filter(function(o) { + return o.network && !o.notAuthorized && o.xml && o.xml.entries; + }); + // 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; + if (var1 > var2) { + return 1; + } + if (var1 < var2) { + return -1; + } + return 0; + }); + // New total count number + var newCount = objs.reduce(function(p, c) { + 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 + 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; + // + contextmenu.fireContext(); + // Preparing the report + tmp = []; + objs.forEach(function(o) { + (o.xml && o.xml.entries ? o.xml.entries : []) + .filter(function(e) { + return anyNewEmails ? o.newIDs.indexOf(e.id) !== -1 : o.xml.fullcount !== 0; + }) + .splice(0, config.email.maxReport) + .forEach(e => { + e.parent = o; + tmp.push(e); + }); + }); + function shorten(str) { + if (str.length < config.email.truncate) { + return str; + } + return str.substr(0, config.email.truncate / 2) + '...' + str.substr(str.length - config.email.truncate / 2); + } + var report = tmp.map(e => config.notification.format + .replace('[author_name]', e.author_name) + .replace('[author_email]', e.author_email) + .replace('[summary]', shorten(e.summary)) + .replace('[title]', shorten(e.title)) + .replace(/\[break\]/g, '\n')); + + if (config.notification.combined) { + report = [report.join('\n\n')]; + } + // Preparing the tooltip + var tooltip = + app.l10n('gmail') + '\n\n' + + objs.reduce(function(p, c) { + return p += + c.xml.title + + (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) { + toolbar.icon = 'red'; + toolbar.badge = newCount; + color = 'red'; + toolbar.label = tooltip; + app.popup.send('update', objs); + if (singleAccount) { + app.popup.detach(); + } + else { + app.popup.attach(); + } + } + else { + toolbar.icon = 'gray'; + toolbar.badge = 0; + color = 'gray'; + toolbar.label = tooltip; + app.popup.detach(); + } + } + else if (forced && !newCount) { + toolbar.icon = 'gray'; + toolbar.badge = 0; + color = 'gray'; + toolbar.label = tooltip; + app.popup.detach(); + } + else { + toolbar.icon = 'new'; + toolbar.badge = newCount; + color = 'new'; + if (singleAccount) { + app.popup.detach(); + } + else { + app.popup.attach(); + } + if (config.notification.show) { + 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); + } + toolbar.label = tooltip; + app.popup.send('update-reset', objs); + } + }, function() { + // this should not be called + }); + }, + getCached: () => cachedEmails || [] + }; +})(); + +// user interactions +chrome.browserAction.onClicked.addListener(() => actions.onCommand()); + +// start up +app.on('load', () => { + // add a repeater to check all accounts + 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 + repeater.stop(); + } + // periodic reset + resetTimer = new timer.Repeater( + config.email.check.resetPeriod * 1000 * 60, + config.email.check.resetPeriod * 1000 * 60 + ); + resetTimer.on(actions.reset); + if (config.email.check.resetPeriod === 0) { + resetTimer.stop(); + } +}); + +// updates +app.on('update', () => repeater && repeater.reset()); +// messaging +chrome.runtime.onMessage.addListener((request, sender, response) => { + const method = request.method; + if (method === 'update' && request.forced) { + repeater.reset(true); + } + else if (method === 'update') { + window.setTimeout(() => repeater.reset(), 500); + } + else if (method === 'open') { + const url = request.url; + if (typeof url === 'string') { + open(url); + } + else if (url.button === 2 || !url.link) { + return; + } + else if (url.button === 0 && (url.ctrlKey || url.metaKey)) { + open(url.link, true, null, url.isPrivate); + } + else if (url.button === 1) { + open(url.link, true, null, url.isPrivate); + } + else { + open(url.link, null, null, url.isPrivate); + } + } + else if (method === 'test-play') { + play(null); + } + else if (method === 'gmail.action') { + gmail.action(request).then(() => { + response(); + }).catch(e => { + + notify(e.message); + response(e); + }); + return true; + } + 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; + } +}); + +// init +app.on('load', () => { + const prefs = config.prefs; + // init; + toolbar.color = prefs.backgroundColor; +}); + +/* FAQs & Feedback */ +{ + 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/v2/lib/config.js b/v2/lib/config.js new file mode 100644 index 00000000..fc40bad3 --- /dev/null +++ b/v2/lib/config.js @@ -0,0 +1,333 @@ +/* globals app, config, contextmenu */ +'use strict'; + +Object.assign(config.prefs, { + '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.onChanged.addListener(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']; + }, + get feeds_1() { + return config.prefs['feeds_1']; + }, + get feeds_2() { + return config.prefs['feeds_2']; + }, + get feeds_3() { + return config.prefs['feeds_3']; + }, + get feeds_4() { + return config.prefs['feeds_4']; + }, + get feeds_5() { + return config.prefs['feeds_5']; + }, + get feeds_custom() { + return config.prefs['feeds_custom']; + }, + 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/' + 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 (config.email.feeds_custom) { + merged = [ + ...merged, + ...config.email.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' + ]; + } + return merged; + }, + get timeout() { + return config.prefs.timeout; + }, + get maxReport() { // Maximum number of simultaneous reports from a single account + return config.prefs.maxReport; + }, + get threatAsNew() { // in minutes + return config.prefs.threatAsNew; + }, + get truncate() { + return config.prefs.notificationTruncate; + }, + get alphabetic() { + return config.prefs.alphabetic; + }, + get doReadOnArchive() { + return config.prefs.doReadOnArchive; + }, + get inboxRedirection() { + return config.prefs.inboxRedirection; + }, + get openInboxOnOne() { + return config.prefs.oldFashion; + }, + check: { + get first() { + return config.prefs.initialPeriod; + }, + get period() { + return config.prefs.period; + }, + get resetPeriod() { + return config.prefs.resetPeriod; + } + } +}; + +config.notification = { + get show() { + return config.prefs.notification; + }, + get combined() { + return config.prefs.combined; + }, + sound: { + get play() { + return config.prefs.alert; + }, + get volume() { + return config.prefs.soundVolume; + }, + media: { + default: { + get type() { // 0-3: built-in, 4: user defined + return config.prefs['notification.sound.media.default.type']; + }, + get file() { + return config.prefs['notification.sound.media.default.file']; + }, + get mime() { + return config.prefs['notification.sound.media.default.mime']; + } + }, + custom0: { + get type() { // 0-3: built-in, 4: user defined + return config.prefs['notification.sound.media.custom0.type']; + }, + get file() { + return config.prefs['notification.sound.media.custom0.file']; + }, + get mime() { + return config.prefs['notification.sound.media.custom0.mime']; + }, + get filter() { + return config.prefs['notification.sound.media.custom0.filter']; + }, + get selector() { + return config.prefs['notification.sound.media.custom0.selector']; + } + }, + custom1: { + get type() { // 0-3: built-in, 4: user defined + return config.prefs['notification.sound.media.custom1.type']; + }, + get file() { + return config.prefs['notification.sound.media.custom1.file']; + }, + get mime() { + return config.prefs['notification.sound.media.custom1.mime']; + }, + get filter() { + return config.prefs['notification.sound.media.custom1.filter']; + }, + get selector() { + return config.prefs['notification.sound.media.custom1.selector']; + } + }, + custom2: { + get type() { // 0-3: built-in, 4: user defined + return config.prefs['notification.sound.media.custom2.type']; + }, + get file() { + return config.prefs['notification.sound.media.custom2.file']; + }, + get mime() { + return config.prefs['notification.sound.media.custom2.mime']; + }, + get filter() { + return config.prefs['notification.sound.media.custom2.filter']; + }, + get selector() { + return config.prefs['notification.sound.media.custom2.selector']; + } + }, + custom3: { + get type() { // 0-3: built-in, 4: user defined + return config.prefs['notification.sound.media.custom3.type']; + }, + get file() { + return config.prefs['notification.sound.media.custom3.file']; + }, + get mime() { + return config.prefs['notification.sound.media.custom3.mime']; + }, + get filter() { + return config.prefs['notification.sound.media.custom3.filter']; + }, + get selector() { + return config.prefs['notification.sound.media.custom3.selector']; + } + }, + custom4: { + get type() { // 0-3: built-in, 4: user defined + return config.prefs['notification.sound.media.custom4.type']; + }, + get file() { + return config.prefs['notification.sound.media.custom4.file']; + }, + get mime() { + return config.prefs['notification.sound.media.custom4.mime']; + }, + get filter() { + return config.prefs['notification.sound.media.custom4.filter']; + }, + get selector() { + return config.prefs['notification.sound.media.custom4.selector']; + } + } + } + }, + get format() { + return config.prefs.notificationFormat; + }, + get time() { + return config.prefs.notificationTime; + }, + get silentTime() { + return config.prefs.silentTime; // in minutes + }, + _silent: false, + get silent() { + return config.notification._silent; + }, + set silent(val) { + window.clearTimeout(config.notification._silent); + config.notification._silent = val; + chrome.contextMenus.update(contextmenu.ids.silent, { + 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 = { + get tooltip() { + return app.l10n('gmail'); + } +}; + +config.ui = { + get badge() { + return config.prefs.badge; + }, + get tooltip() { + return config.prefs.tooltip; + }, + get minimal() { + return config.prefs.minimal; + }, + get pattern() { // 0: normal color scheme, 1: reverse color scheme + return config.prefs.clrPattern; + }, + get backgroundColor() { // 0: normal color scheme, 1: reverse color scheme + return config.prefs.backgroundColor; + } +}; + +config.tabs = { + get search() { // true: current window only, false: all open windows + return config.prefs.searchMode; + }, + get ignoreOpens() { // true: ignore opened Gmail tabs + return config.prefs.ignoreOpens; + }, + get NotifyGmailIsOpen() { + return config.prefs.onGmailNotification; + }, + open: { + get useBlankTabs() { + return config.prefs.useBlankTabs; + }, + get background() { + return config.prefs.background; + }, + get relatedToCurrent() { + return config.prefs.relatedToCurrent; + }, + get _current() { + return config.prefs.currentTab; + }, + get _newWindow() { + return config.prefs.newWindow; + }, + get mode() { // 0: new tab, 1: new window, 2: current tab + if (this._current) { + return 2; + } + if (this._newWindow) { + return 1; + } + return 0; + }, + get smart() { + return config.prefs['smartOpen']; + } + } +}; + +config['plug-ins'] = { + get labels() { + return config.prefs['plug-in/labels']; + } +}; diff --git a/v2/lib/context-menu.js b/v2/lib/context-menu.js new file mode 100644 index 00000000..c07956cb --- /dev/null +++ b/v2/lib/context-menu.js @@ -0,0 +1,135 @@ +/* globals actions, config, open, checkEmails */ +'use strict'; + +var contextmenu = {}; + +{ + const l10n = chrome.i18n.getMessage; + const ids = { + childs: [] + }; + ids.root = chrome.contextMenus.create({ + title: l10n('label_14'), + contexts: ['browser_action'], + enabled: false + }); + ids.disable = chrome.contextMenus.create({ + title: l10n('label_3'), + contexts: ['browser_action'] + }); + ids.silent = chrome.contextMenus.create({ + title: l10n('label_10'), + type: 'checkbox', + contexts: ['browser_action'], + id: 'label_10', + checked: true + }); + + chrome.contextMenus.create({ + title: l10n('label_11'), + contexts: ['browser_action'], + id: 'label_11' + }); + chrome.contextMenus.create({ + title: l10n('label_1'), + contexts: ['browser_action'], + id: 'label_1' + }); + chrome.contextMenus.create({ + title: l10n('label_12'), + contexts: ['browser_action'], + id: 'label_12' + }); + + ['label_4', 'label_5', 'label_6', 'label_7', 'label_8', 'label_9', 'label_13'] + .forEach(id => chrome.contextMenus.create({ + parentId: ids.disable, + id, + title: l10n(id), + contexts: ['browser_action'] + })); + + chrome.contextMenus.onClicked.addListener(info => { + const method = info.menuItemId; + if (method === 'label_4') { + actions.silent(300); + } + else if (method === 'label_5') { + actions.silent(900); + } + else if (method === 'label_6') { + actions.silent(1800); + } + else if (method === 'label_7') { + actions.silent(3600); + } + else if (method === 'label_8') { + actions.silent(7200); + } + else if (method === 'label_9') { + actions.silent(18000); + } + else if (method === 'label_13') { + actions.silent('custom'); + } + else if (method === 'label_11') { + open(config.email.compose); + } + else if (method === 'label_10') { + config.notification.silent = !info.checked; + } + else if (method === 'label_1') { + actions.reset(); + } + else if (method === 'label_12') { + open(chrome.runtime.getManifest().homepage_url); + } + }); + + // public methods + contextmenu.ids = ids; + + let cache = []; + contextmenu.fireContext = () => { + const accounts = (show => checkEmails.getCached().filter((e, i) => show[i]).map(o => ({ + title: o.xml.title, + onclick: function(link) { + if (link) { + open(link.replace(/\?.*/, '')); + } + }.bind(this, o.xml.rootLink) + })))(checkEmails.getCached().map(o => o.xml ? o.xml.rootLink : null) + .filter(o => o) + .map((e, i, a) => a.indexOf(e) === i)); + + if ( + accounts.length === cache.length && + accounts.filter(a => cache.indexOf(a.title) !== -1).length === cache.length + ) { + return; + } + cache = accounts.map(a => a.title); + ids.childs.forEach(o => chrome.contextMenus.remove(o.id)); + ids.childs = []; + + if (accounts.length === 1) { + chrome.contextMenus.update(ids.root, accounts[0]); + } + else { + chrome.contextMenus.update(ids.root, { + title: l10n('label_14') + }, () => { + accounts.forEach(account => ids.childs.push({ + name: account.name, + id: chrome.contextMenus.create(Object.assign({ + parentId: ids.root, + contexts: ['browser_action'], + }, account)) + })); + }); + } + chrome.contextMenus.update(ids.root, { + enabled: accounts.length !== 0 + }); + }; +} 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/v2/lib/toolbar.js b/v2/lib/toolbar.js new file mode 100644 index 00000000..85762db6 --- /dev/null +++ b/v2/lib/toolbar.js @@ -0,0 +1,108 @@ +/* globals config, app */ +'use strict'; + +var toolbar = {}; + +Object.defineProperty(toolbar, 'badge', { + set(val) { + if (val > 999 && config.ui.minimal) { + val = '>' + Math.round(val / 1000) + 'K'; + } + chrome.browserAction.setBadgeText({ + text: val === 0 || config.ui.badge === false ? '' : String(val) + }); + } +}); + +Object.defineProperty(toolbar, 'color', { + set(val) { + chrome.browserAction.setBadgeBackgroundColor({ + color: val + }); + } +}); + +{ + let i = 0; + const t = []; + function clearTimeout() { + t.forEach(_t => { + window.clearTimeout(_t); + t.splice(t.indexOf(_t), 1); + }); + } + Object.defineProperty(toolbar, 'icon', { + set(clr) { + function set(clr) { + // Change color pattern? + if (config.ui.pattern === 1) { + switch (clr) { + case 'blue': + clr = 'gray'; + break; + case 'gray': + clr = 'blue'; + break; + } + } + if (config.ui.pattern === 2) { + switch (clr) { + case 'blue': + clr = 'gray'; + break; + case 'red': + clr = 'blue'; + break; + case 'gray': + clr = 'red'; + break; + } + } + chrome.browserAction.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' + } + }); + } + + clearTimeout(); + if (clr === 'load') { + t.push(window.setTimeout(function() { + set('load' + i); + i += 1; + i = i % 4; + toolbar.icon = 'load'; + }, 200)); + } + else if (clr === 'new') { + t.push(window.setTimeout(function() { + set(i % 2 ? 'red' : 'new'); + if (i < 7) { + i += 1; + toolbar.icon = 'new'; + } + else { + i = 0; + } + }, 300)); + } + else { + i = 0; + set(clr); + } + } + }); +} + +Object.defineProperty(toolbar, 'label', { + set(title) { + chrome.browserAction.setTitle({title}); + } +}); + +app.on('load', () => { + toolbar.color = config.prefs.backgroundColor; +}); diff --git a/v2/lib/utils/server.js b/v2/lib/utils/server.js new file mode 100644 index 00000000..6af346c4 --- /dev/null +++ b/v2/lib/utils/server.js @@ -0,0 +1,183 @@ +var server = {}; +// +server.Parser = function(req, feed, isPrivate) { + var xml; + if (req.responseXML) { + xml = req.responseXML; + } + else { + if (!req.responseText) return; + xml = app.parser().parseFromString(req.responseText, "text/xml"); + } + //Sometimes id is wrong in the feed structure! + function fixID (link) { + var id = /u\/\d+/.exec(feed); + if (id && id.length) { + return link.replace(/u\/\d+/, id[0]); + }; + return link; + } + return { + get fullcount () { + var temp = 0; + var tags = xml.getElementsByTagName("fullcount"); + var entries = xml.getElementsByTagName("entry"); + try { + var temp = (tags && tags.length) ? parseInt(tags[0].textContent) : 0; + temp = Math.max(temp, (entries && entries.length) ? entries.length : 0); + } catch(e) {} + return temp; + }, + get title () { + var temp = ""; + try { + temp = xml.getElementsByTagName("title")[0].childNodes[0].nodeValue; + temp = temp.match(/[^ ]+@.+\.[^ ]+/)[0]; + } catch(e) {} + return temp; + }, + get label () { + var label = ""; + try { + var tagline = xml.getElementsByTagName("tagline")[0].childNodes[0].nodeValue; + if (tagline) { + var match = tagline.match(/\'(.*)\' label/); + if (match.length == 2) { + label = match[1]; + } + } + } catch(e) {} + return label; + }, + get link () { + var temp = config.email.url, + label; + try { + //Inbox href + temp = xml.getElementsByTagName("link")[0].getAttribute("href").replace("http://", "https://"); + temp = fixID (temp); + label = this.label; + if (label) { + temp += "/?shva=1#label/" + label; + } + } catch(e) {} + // account selector uses this url as account identifier + if (isPrivate) { + temp += '@private'; + } + + return temp; + }, + get rootLink () { + var temp = config.email.url, + label; + try { + //Inbox href + temp = xml.getElementsByTagName("link")[0].getAttribute("href").replace("http://", "https://"); + temp = fixID (temp); + } catch(e) {} + + return temp; + }, + get authorized () { + var temp = ""; + try { + temp = xml.getElementsByTagName("TITLE")[0].childNodes[0].nodeValue; + } catch(e){} + return temp; + }, + get entries () { + var tmp = Array.prototype.slice.call(xml.getElementsByTagName("entry")); + function toObj (entry) { + return { + get title () { + return entry.getElementsByTagName("title")[0].textContent; + }, + get summary () { + return entry.getElementsByTagName("summary")[0].textContent; + }, + get modified () { + return entry.getElementsByTagName("modified")[0].textContent; + }, + get issued () { + return entry.getElementsByTagName("issued")[0].textContent; + }, + get author_name () { // author might be empty. + return entry.getElementsByTagName("author")[0] ? + entry.getElementsByTagName("author")[0].getElementsByTagName("name")[0].textContent : app.l10n("msg_1"); + }, + get author_email () { + return entry.getElementsByTagName("author")[0] ? + entry.getElementsByTagName("author")[0].getElementsByTagName("email")[0].textContent : ""; + }, + get id () { + return entry.getElementsByTagName("id")[0].textContent; + }, + get link () { + var temp = entry.getElementsByTagName("link")[0].getAttribute("href").replace("http://", "https://"); + temp = fixID (temp); + + return temp; + } + } + } + var rtn = []; + tmp.forEach(function (entry) { + rtn.push(new toObj(entry)); + }); + return rtn; + } + } +} + +server.Email = function (feed, timeout, isPrivate) { + var reject; + var ids = []; + var pCount = 0; + return { + execute: function () { + return new Promise((resolve, r) => { + reject = r; + const url = feed + '?rand=' + Math.round(Math.random() * 10000000); + app.get(url, null, null, timeout, isPrivate).then( + function (req) { + if (req.status !== 200) { + return resolve({ + isPrivate: isPrivate, + network: req.status !== 0, + notAuthorized: req.status === 401, + xml: null, + newIDs: [] + }); + } + var xml = new server.Parser(req, feed, isPrivate); + //Cleaning old entries + var cIDs = (xml.entries || []) + .filter(function (e) { + var age = ((new Date()).getTime() - (new Date(e.modified)).getTime()); + return age < 1000 * 60 * config.email.threatAsNew; + }) + .map(e => e.id); + //Finding new ids + var newIDs = cIDs.filter(function (id) { + return ids.indexOf(id) === -1; + }); + ids.push.apply(ids, newIDs); + if (pCount >= 20 && pCount >= xml.fullcount) { + newIDs = []; + } + pCount = xml.fullcount; + resolve({ + isPrivate: isPrivate, + network: true, + notAuthorized: false, + xml: xml, + newIDs: newIDs + }); + } + ).catch(reject); + }); + }, + reject: () => reject && reject() + }; +}; diff --git a/v2/lib/utils/tab.js b/v2/lib/utils/tab.js new file mode 100644 index 00000000..0e6cfe85 --- /dev/null +++ b/v2/lib/utils/tab.js @@ -0,0 +1 @@ +var tab = {}; diff --git a/v2/lib/utils/timer.js b/v2/lib/utils/timer.js new file mode 100644 index 00000000..a61070b2 --- /dev/null +++ b/v2/lib/utils/timer.js @@ -0,0 +1,55 @@ +'use strict'; + +var timer = {}; + +/** Repeater: Repeats a function infinity with an interval pattern + * Example: + * var repeater = new repeater(1000, 10000, 2000); + * var i = 0; + * repeater.on(function() { + * i += 1; + * console.error(i); + * if (i == 6) { + * repeater.reset(); + * } + * if (i == 10) { + * repeater.stop(); + * } + * }); + **/ +timer.Repeater = function() { + let id, callback; + let intervals = [].slice.call(arguments, 0); + function stop() { + if (id) { + window.clearTimeout(id); + } + } + function run() { + const t = intervals.length > 1 ? intervals.shift() : intervals[0]; + stop(); + id = window.setTimeout(function(args) { + run(); + try { + callback.apply(null, args); + } + catch (e) {} + }, t, arguments); + } + + return { + reset: function() { + stop(); + intervals.unshift(0); + run.apply(null, arguments); + }, + stop: stop, + on: function(c) { + callback = c; + run(); + }, + fill: function() { + intervals = [].slice.call(arguments, 0); + } + }; +}; diff --git a/v2/lib/wrapper/chrome/app.js b/v2/lib/wrapper/chrome/app.js new file mode 100644 index 00000000..0e77e3e5 --- /dev/null +++ b/v2/lib/wrapper/chrome/app.js @@ -0,0 +1,188 @@ +/* globals config, chrome */ +'use strict'; + +var isFirefox = navigator.userAgent.indexOf('Firefox') !== -1; +var isOpera = navigator.userAgent.indexOf('OPR') !== -1; + +var EventEmitter = function() { + this.callbacks = {}; +}; +EventEmitter.prototype.on = function(name, callback) { + this.callbacks[name] = this.callbacks[name] || []; + this.callbacks[name].push(callback); +}; +EventEmitter.prototype.emit = function(name, data) { + (this.callbacks[name] || []).forEach(c => c(data)); +}; + +var app = new EventEmitter(); +var userActions = []; + +app.actions = c => userActions.push(c); + +chrome.notifications.onClicked.addListener(function(id) { + chrome.notifications.clear(id, function() {}); + userActions.forEach(c => c()); + if (app.notify[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({ + popup: '/data/popup/index.html' + }), + detach: () => { + const popup = chrome.extension.getViews({type:'popup'})[0]; + if (popup) { + popup.close(); + } + chrome.browserAction.setPopup({ + popup: '' + }); + }, + send: (id, data) => chrome.runtime.sendMessage({method: id, data: data}, () => chrome.runtime.lastError) +}; + +app.get = (url, headers = {}, data, timeout) => new Promise(resolve => { + const req = new XMLHttpRequest(); + req.onreadystatechange = () => req.readyState === 4 && resolve(req); + + req.open(data ? 'POST' : 'GET', url, true); + for (const id in headers) { + req.setRequestHeader(id, headers[id]); + } + if (data) { + const arr = []; + for (const e in data) { + arr.push(e + '=' + data[e]); + } + data = arr.join('&'); + } + req.timeout = timeout; + req.send(data ? data : ''); +}); + +app.l10n = chrome.i18n.getMessage; + +app.notify = function(text, title, callback, buttons = []) { + title = title || app.l10n('gmail'); + if (config.notification.silent) { + return; + } + var isArray = Array.isArray(text); + if (isArray && text.length === 1) { + 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, + message: isArray ? '' : text, + priority: 2, + eventTime: Date.now() + 30000, + items: isArray ? text.map(function(message) { + var tmp = message.split('\n'); + return { + title: (tmp[1] || '').replace('Title: ', ''), + message: tmp[0].replace('From: ', '') + }; + }) : [], + isClickable: 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); + }, config.notification.time * 1000, id); + }); +}; + +app.sound = (function() { + var audio = document.createElement('audio'); + audio.setAttribute('preload', 'auto'); + audio.setAttribute('autobuffer', 'true'); + + return { + play: function(index) { + if (config.notification.silent) { + return; + } + const sound = config.notification.sound; + const type = index === null ? sound.media.default.type : sound.media['custom' + index].type; + var path = '/data/sounds/' + type + '.wav'; + if (type === 4) { + path = index === null ? sound.media.default.file : sound.media['custom' + index].file; + } + audio.src = path; + audio.volume = sound.volume / 100; + audio.play(); + }, + stop: () => { + audio.pause(); + audio.currentTime = 0; + } + }; +})(); + +/* updating badge when action is posted */ +{ + let id; + chrome.webRequest.onCompleted.addListener(d => { + 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(() => { + app.emit('update'); + }, 2000); + } + } + }, + {urls: [ + '*://mail.google.com/mail/u*', + '*://mail.google.com/sync/u/*/i/s*' + ]}, + [] + ); +} + +app.isPrivate = () => false; diff --git a/v2/lib/wrapper/chrome/background.html b/v2/lib/wrapper/chrome/background.html new file mode 100644 index 00000000..a01fa20f --- /dev/null +++ b/v2/lib/wrapper/chrome/background.html @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/v2/manifest.json b/v2/manifest.json new file mode 100644 index 00000000..1138d2e1 --- /dev/null +++ b/v2/manifest.json @@ -0,0 +1,45 @@ +{ + "name": "Notifier for Gmail™", + "description": "__MSG_description__", + "author": "InBasic", + "version": "1.0.5", + "manifest_version": 2, + "default_locale": "en", + "permissions": [ + "*://mail.google.com/mail/", + "*://mail.google.com/sync/", + "notifications", + "contextMenus", + "webRequest", + "storage" + ], + "web_accessible_resources": [ + "notification.png" + ], + "browser_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": { + "page": "lib/wrapper/chrome/background.html" + }, + "options_ui": { + "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" + } +} 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++, //