From b83680eb1d38d948242a9d7c9aea2319a287bf59 Mon Sep 17 00:00:00 2001 From: Avi Kohn Date: Thu, 11 Jun 2015 13:19:10 -0400 Subject: [PATCH 01/30] Added support for color inputs in widget settings --- app/js/widgets/settings.js | 14 ++++++++++++++ app/templates/widget-settings.inputs.hjs | 9 +++++++++ 2 files changed, 23 insertions(+) diff --git a/app/js/widgets/settings.js b/app/js/widgets/settings.js index 1ec98043..0985ba3e 100644 --- a/app/js/widgets/settings.js +++ b/app/js/widgets/settings.js @@ -40,6 +40,20 @@ define( "input-textarea": _.pick(input, "nicename", "label", "value", "help", "placeholder") })); }, + color: function(input, elm) { + input.value = _.result(input, "value"); + + elm.html(render("widget-settings.inputs", { + "input-color": _.pick(input, "nicename", "label", "value", "help") + })).find("input").spectrum({ + showInput: true, + showAlpha: true, + showInitial: true, + showButtons: false, + preferredFormat: "rgb", + clickoutFiresChange: true + }); + }, select: function(input, elm, widget, form) { var loop = function(options, level) { level = level || 0; diff --git a/app/templates/widget-settings.inputs.hjs b/app/templates/widget-settings.inputs.hjs index cdfb4a1b..26750558 100644 --- a/app/templates/widget-settings.inputs.hjs +++ b/app/templates/widget-settings.inputs.hjs @@ -16,6 +16,15 @@ {{/input-textarea}} +{{#input-color}} + + + +{{/input-color}} + {{#input-select}} - + {{/input-color}} {{#input-select}} From 35d01d1f7acfc579a5f40f4afb0e01737800d2ab Mon Sep 17 00:00:00 2001 From: Avi Kohn Date: Sun, 14 Jun 2015 21:36:53 -0400 Subject: [PATCH 10/30] Added a debug tools dialog to the settings This is for use while working with users to troubleshoot a variety of issues. It doesn't need to be translated since support is only available in English and the dialog is not intended to be used without direct instruction. --- app/css/style.css | 88 +++++++++++++ app/js/core/templates.js | 2 +- app/js/i18n/locales/en/main.json | 5 +- app/js/settings/advanced.js | 15 ++- app/js/settings/debug.js | 189 ++++++++++++++++++++++++++++ app/templates/settings/advanced.hjs | 1 + app/templates/settings/debug.hjs | 34 +++++ 7 files changed, 330 insertions(+), 4 deletions(-) create mode 100644 app/js/settings/debug.js create mode 100644 app/templates/settings/debug.hjs diff --git a/app/css/style.css b/app/css/style.css index 67183cfe..c88c2695 100644 --- a/app/css/style.css +++ b/app/css/style.css @@ -3143,6 +3143,94 @@ body.no-edit .widgets-container .widget.tabbed:before { color: #D43F3A; } +.settings .advanced .debug { + float: left; + padding-left: 15px; +} + + + + + + + +/*--------------------------------------------- + / Settings / Advanced / Debug +*/ +.debug .content { + font-family: Roboto, sans-serif; +} + +.debug .section { + margin: 0 25px; + padding: 15px 0; +} + +.debug .section h3 { + font-size: 15px; + font-weight: 500; + margin-bottom: 15px; + font-family: inherit; +} + +.debug button { + border: 0; + outline: 0; + margin: 0 2px; + color: #2196F3; + padding: 0 10px; + font-size: 14px; + min-width: 64px; + font-weight: 500; + line-height: 34px; + text-align: center; + border-radius: 2px; + font-family: inherit; + background: transparent; + text-transform: uppercase; + transition: all .25s cubic-bezier(0, 0, .2, 1); +} + +.debug button:hover, +.debug button:focus { + background: rgba(153, 153, 153, .2); +} + +.debug button:active { + background: rgba(153, 153, 153, .4); +} + +.debug .status { + margin: 0; + font-size: 13px; + padding: 20px 25px 10px; + transition: all .25s cubic-bezier(0, 0, .2, 1); +} + +.debug .status.no-status { + font-size: 0; + padding: 0 25px; +} + +.debug .console { + position: relative; +} + +.debug .console textarea { + width: 100%; + height: 75px; + resize: none; + border-radius: 0; + border-width: 0 0 1px 0!important; +} + +.debug .console button { + right: 0; + top: 12px; + color: #4CAF50; + position: absolute; +} + diff --git a/app/js/core/templates.js b/app/js/core/templates.js index 3b5ed0fc..0aac46ba 100644 --- a/app/js/core/templates.js +++ b/app/js/core/templates.js @@ -9,7 +9,7 @@ var templates = [ "getting-started", "donate", "translate-request", "settings", "menu", "settings/new-tab", "settings/general", "settings/visual", "settings/advanced", - "settings/tab-specific","widget-settings.inputs", + "settings/tab-specific","widget-settings.inputs","settings/debug", "widgets.weather", "widgets.weather.desc", "widgets.stocks", "widgets.stocks.desc", diff --git a/app/js/i18n/locales/en/main.json b/app/js/i18n/locales/en/main.json index 884f37b7..e4a9ac9d 100644 --- a/app/js/i18n/locales/en/main.json +++ b/app/js/i18n/locales/en/main.json @@ -179,7 +179,10 @@ "css_desc": "You can use this field to customize almost any visual part of iChrome using CSS (for a definition please see the MDN).

Since this will be synced, you can only enter a maximum of 1000 characters, including whitespace.", "reset": "Reset iChrome", - "reset_confirm": "Are you really sure you want to reset iChrome?\r\nThis will erase all local and synced data, there is no backup and no way to undo this. You will lose your ENTIRE current configuration on all computers signed into this Google account." + "reset_confirm": "Are you really sure you want to reset iChrome?\r\nThis will erase all local and synced data, there is no backup and no way to undo this. You will lose your ENTIRE current configuration on all computers signed into this Google account.", + + "debug": "Debug Tools", + "debug_confirm": "WARNING: These tools can erase your configuration in a single click, only use them if your developer instructs you to.\r\nAre you sure you want to continue?" } }, diff --git a/app/js/settings/advanced.js b/app/js/settings/advanced.js index c96a0710..26fdedc9 100644 --- a/app/js/settings/advanced.js +++ b/app/js/settings/advanced.js @@ -1,7 +1,7 @@ /** * This is the Advanced tab in the settings */ -define(["jquery", "backbone", "storage/storage", "i18n/i18n", "core/render", "lib/jquery.spectrum"], function($, Backbone, Storage, Translate, render) { +define(["jquery", "backbone", "settings/debug", "storage/storage", "i18n/i18n", "core/render", "lib/jquery.spectrum"], function($, Backbone, Debug, Storage, Translate, render) { var Model = Backbone.Model.extend({ save: function(d, cb) { if (d.tabs) this.storage.tabs = d.tabs; @@ -32,7 +32,18 @@ define(["jquery", "backbone", "storage/storage", "i18n/i18n", "core/render", "li })); }, "click .btn.restore": "restore", - "click .reset": "reset" + "click .reset": "reset", + "click .debug" :"debug" + }, + debug: function(e) { + if (confirm(Translate("settings.advanced.debug_confirm"))) { + if (!this.Debug) { + this.Debug = new Debug(); + } + else { + this.Debug.show(); + } + } }, restore: function(e) { e.preventDefault(); diff --git a/app/js/settings/debug.js b/app/js/settings/debug.js new file mode 100644 index 00000000..22ae5b50 --- /dev/null +++ b/app/js/settings/debug.js @@ -0,0 +1,189 @@ +/** + * The debug dialog. This contains advanced tools that users can be instructed to use for troubleshooting. + */ +define(["lodash", "backbone", "modals/modals", "core/render"], function(_, Backbone, Modal, render) { + var modal = new (Modal.extend({ + width: 800, + classes: "debug" + }))(); + + var View = Backbone.View.extend({ + el: modal.content, + + events: { + "click button": "execute" + }, + + + /** + * Takes a click event from one of the dialog buttons and executes its appropriate action + * + * @api private + * @param {Event} e + */ + execute: function(e) { + var action = e.currentTarget.getAttribute("data-action"); + + if (!action) return; + + switch (action) { + case "clear-sync": + chrome.storage.sync.clear(); + + this.setStatus("Chrome Sync storage cleared, reload the page to resync"); + break; + + case "clear-local": + chrome.storage.local.clear(); + + this.setStatus("Chrome Local storage cleared, reload the page to resync"); + break; + + case "clear-localstorage": + localStorage.clear(); + + this.setStatus("LocalStorage cleared"); + break; + + case "clear-fs": + var next = function() { + this.setStatus("FileSystem cleared"); + }.bind(this); + + // Erase all FileSystem entries + FileSystem.get(function(fs) { + var reader = fs.root.createReader(), + length = 0; + + (function read() { // Recursive and self executing, necessary as per the specs + reader.readEntries(function(results) { + if (results.length) { + results.forEach(function(e, i) { + length++; + + if (e.isDirectory) { + e.removeRecursively(function() { + length--; + + if (!length) { + next(); + } + }); + } + else { + e.remove(function() { + length--; + + if (!length) { + next(); + } + }); + } + }); + + read(); + } + else if (!length) { + next(); + } + }, next); + })(); + }, next); // In the event of an error continue anyway + break; + + case "clear-oauth": + delete localStorage.oauth; + + this.setStatus("OAuth cache cleared"); + break; + + case "get-info": + this.setStatus("Compiling information, please wait"); + + var that = this; + + chrome.runtime.getPlatformInfo(function(info) { + chrome.storage.local.get(function(local) { + chrome.storage.sync.getBytesInUse(function(syncUsage) { + alert(` + Debug info (hit Ctrl+C or Cmd+C to copy): + iChrome Version: ${chrome.runtime.getManifest().version} + Chrome Version: ${(/Chrome\/([0-9.]+)/.exec(navigator.userAgent) || [])[1]} + Operating System: ${info.os} + OAuth keys: ${Object.keys(JSON.parse(localStorage.oauth || "{}")).join(", ")} + User ID: ${localStorage.uid} + Uses: ${localStorage.uses} + Cached themes: ${Object.keys(local.cached || {}).length} + Tabs: ${local.tabs.length} + Sync bytes in use: ${syncUsage} / ${chrome.storage.sync.QUOTA_BYTES} + `.replace(/^\t+/g, "")); + + that.setStatus(); + }); + }); + }); + break; + + case "update": + if (confirm( + "If an update is available, this may reload the extension in Chrome, closing any open iChrome tabs. Before executing this, ensure that a tab other" + + " than iChrome is open otherwise Chrome itself will close.\r\nHit cancel to open a new tab and avoid this or OK to continue." + )) { + chrome.runtime.requestUpdateCheck(function(status, details) { + if (status == "throttled") { + this.setStatus("Update check failed due to throttling, try again later"); + } + else if (status == "update_available") { + this.setStatus((details && details.version) + " available. Update is pending and should install momentarily."); + } + else { + this.setStatus("No updates available"); + } + }.bind(this)); + } + break; + + case "reload-extension": + if (confirm( + "This will reload the extension in Chrome, closing any open iChrome tabs. Before executing this, ensure that a tab other" + + " than iChrome is open otherwise Chrome itself will close.\r\nHit cancel to open a new tab and avoid this or OK to continue." + )) { + chrome.runtime.reload(); + } + break; + + case "execute": + var out = eval($(".console textarea").val()); + + if (out) { + $(".console textarea").val("Output: " + out.toString()); + } + break; + } + }, + + /** + * Populates the status text area in the dialog with the provided text + * + * @api private + * @param {String} [status] + */ + setStatus: function(status) { + this.$(".status").text(status || "").toggleClass("no-status", !status); + }, + + show: function() { + modal.show(); + }, + + initialize: function() { + this.$el.html(render("settings/debug")); + + modal.mo.appendTo(document.body); + + modal.show(); + } + }); + + return View; +}); \ No newline at end of file diff --git a/app/templates/settings/advanced.hjs b/app/templates/settings/advanced.hjs index e8520931..12c39f28 100644 --- a/app/templates/settings/advanced.hjs +++ b/app/templates/settings/advanced.hjs @@ -37,5 +37,6 @@ \ No newline at end of file diff --git a/app/templates/settings/debug.hjs b/app/templates/settings/debug.hjs new file mode 100644 index 00000000..ddd5d8b8 --- /dev/null +++ b/app/templates/settings/debug.hjs @@ -0,0 +1,34 @@ +

Debug Tools

+ +

+ +
+

Storage

+ + + + + +
+ +
+

OAuth

+ + +
+ +
+

Extension

+ + + + +
+ +
+

Console

+ + + + +
\ No newline at end of file From 03d3950b1423f7829c5f8bf87ad8c1baebc9d6a6 Mon Sep 17 00:00:00 2001 From: Avi Kohn Date: Sun, 14 Jun 2015 21:48:12 -0400 Subject: [PATCH 11/30] Replaced ES6 template string with normal one JSHint doesn't appear to support them yet so to allow builds, they must be ES5 strings. --- app/js/settings/debug.js | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/app/js/settings/debug.js b/app/js/settings/debug.js index 22ae5b50..6bbb09ef 100644 --- a/app/js/settings/debug.js +++ b/app/js/settings/debug.js @@ -105,18 +105,18 @@ define(["lodash", "backbone", "modals/modals", "core/render"], function(_, Backb chrome.runtime.getPlatformInfo(function(info) { chrome.storage.local.get(function(local) { chrome.storage.sync.getBytesInUse(function(syncUsage) { - alert(` - Debug info (hit Ctrl+C or Cmd+C to copy): - iChrome Version: ${chrome.runtime.getManifest().version} - Chrome Version: ${(/Chrome\/([0-9.]+)/.exec(navigator.userAgent) || [])[1]} - Operating System: ${info.os} - OAuth keys: ${Object.keys(JSON.parse(localStorage.oauth || "{}")).join(", ")} - User ID: ${localStorage.uid} - Uses: ${localStorage.uses} - Cached themes: ${Object.keys(local.cached || {}).length} - Tabs: ${local.tabs.length} - Sync bytes in use: ${syncUsage} / ${chrome.storage.sync.QUOTA_BYTES} - `.replace(/^\t+/g, "")); + alert( + "Debug info (hit Ctrl+C or Cmd+C to copy):" + "\n" + + "iChrome Version: " + chrome.runtime.getManifest().version + "\n" + + "Chrome Version: " + (/Chrome\/([0-9.]+)/.exec(navigator.userAgent) || [])[1] + "\n" + + "Operating System: " + info.os + "\n" + + "OAuth keys: " + Object.keys(JSON.parse(localStorage.oauth || "{}")).join(", ") + "\n" + + "User ID: " + localStorage.uid + "\n" + + "Uses: " + localStorage.uses + "\n" + + "Cached themes: " + Object.keys(local.cached || {}).length + "\n" + + "Tabs: " + local.tabs.length + "\n" + + "Sync bytes in use: " + syncUsage + " / " + chrome.storage.sync.QUOTA_BYTES + ); that.setStatus(); }); From b381b9c75d0cfcd93f9248af3ea35f74d1bc8848 Mon Sep 17 00:00:00 2001 From: Avi Kohn Date: Sun, 14 Jun 2015 21:51:28 -0400 Subject: [PATCH 12/30] Fixed undeclared dependencies and ignored eval --- app/js/settings/debug.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/js/settings/debug.js b/app/js/settings/debug.js index 6bbb09ef..062e6f5f 100644 --- a/app/js/settings/debug.js +++ b/app/js/settings/debug.js @@ -1,7 +1,7 @@ /** * The debug dialog. This contains advanced tools that users can be instructed to use for troubleshooting. */ -define(["lodash", "backbone", "modals/modals", "core/render"], function(_, Backbone, Modal, render) { +define(["lodash", "jquery", "backbone", "storage/filesystem", "modals/modals", "core/render"], function(_, $, Backbone, FileSystem, Modal, render) { var modal = new (Modal.extend({ width: 800, classes: "debug" @@ -153,7 +153,7 @@ define(["lodash", "backbone", "modals/modals", "core/render"], function(_, Backb break; case "execute": - var out = eval($(".console textarea").val()); + var out = eval($(".console textarea").val()); // jshint ignore:line if (out) { $(".console textarea").val("Output: " + out.toString()); From 4b8b0d8b16f1c9b50e9e5542915210924beef4b3 Mon Sep 17 00:00:00 2001 From: Avi Kohn Date: Mon, 22 Jun 2015 19:11:36 -0400 Subject: [PATCH 13/30] Added a system statistics widget http://i.imgur.com/XTB8car.png --- app/css/widgets.css | 75 ++++++++++ app/icons/stats.png | Bin 0 -> 4095 bytes app/js/core/templates.js | 3 +- app/js/i18n/locales/en/widgets.json | 17 +++ app/js/widgets/widgets.js | 2 +- app/manifest.json | 3 + app/templates/widgets/stats/desc.hjs | 1 + app/templates/widgets/stats/template.hjs | 53 +++++++ app/widgets/stats.js | 179 +++++++++++++++++++++++ 9 files changed, 331 insertions(+), 2 deletions(-) create mode 100644 app/icons/stats.png create mode 100644 app/templates/widgets/stats/desc.hjs create mode 100644 app/templates/widgets/stats/template.hjs create mode 100644 app/widgets/stats.js diff --git a/app/css/widgets.css b/app/css/widgets.css index 1f59d79d..3f24a984 100644 --- a/app/css/widgets.css +++ b/app/css/widgets.css @@ -3433,4 +3433,79 @@ body.no-edit .bookmarks .tools { .sitelink .thumbnail.fill img { display: none; +} + + + + + + + +/*--------------------------------------------- + / System Stats +*/ +.stats { + font-family: Roboto, sans-serif; +} + +.stats .header { + margin-bottom: 15px; +} + +.stats .cpu, +.stats .memory { + margin-bottom: 20px; +} + +.stats .label { + width: 60px; + padding-right: 5px; + display: inline-block; + vertical-align: middle; +} + +.stats h3 { + font-size: 13px; + font-weight: 500; + text-align: center; + margin-bottom: 5px; + font-family: inherit; +} + +.stats .icon { + width: 100%; + opacity: .6; + height: 36px; + display: inline-block; +} + +.stats .status { + display: inline-block; + vertical-align: middle; + width: calc(100% - 65px); +} + +.stats .name, +.stats .summary { + font-size: 13px; + margin-bottom: 2px; +} + +.stats progress { + width: auto; + height: 6px; + margin: 6px 0; + display: block; + overflow: hidden; + border-radius: 2px; + -webkit-appearance: none; +} + +.stats progress::-webkit-progress-value { + background: #2196F3; + transition: width .5s ease; +} + +.stats progress::-webkit-progress-bar { + background: #BBDEFB; } \ No newline at end of file diff --git a/app/icons/stats.png b/app/icons/stats.png new file mode 100644 index 0000000000000000000000000000000000000000..35102bbf2acc5cd6134d0090adbfd33e18853f24 GIT binary patch literal 4095 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 literal 0 HcmV?d00001 diff --git a/app/js/core/templates.js b/app/js/core/templates.js index 0aac46ba..fda24e82 100644 --- a/app/js/core/templates.js +++ b/app/js/core/templates.js @@ -48,7 +48,8 @@ var templates = [ "widgets.quotes", "widgets.quotes.desc", "widgets.html", "widgets.html.desc", "widgets.notifications", "widgets.notifications.desc", - "widgets.sitelink", "widgets.sitelink.desc" + "widgets.sitelink", "widgets.sitelink.desc", + "widgets.stats", "widgets.stats.desc" ], deps = []; diff --git a/app/js/i18n/locales/en/widgets.json b/app/js/i18n/locales/en/widgets.json index 60004696..a8eaff02 100644 --- a/app/js/i18n/locales/en/widgets.json +++ b/app/js/i18n/locales/en/widgets.json @@ -673,5 +673,22 @@ "style_fill": "Fill", "style_center": "Center" } + }, + + "stats": { + "name": "System Statistics", + "desc": "Keep an eye on your system with realtime statistics", + + "memory": "Memory", + "battery": "Battery", + + "usage": "usage", + "in_use": "in use", + "remaining": "remaining", + + "charged": "Fully Charged", + "idle": "Idle", + "charging": "Charging", + "discharging": "Discharging" } } \ No newline at end of file diff --git a/app/js/widgets/widgets.js b/app/js/widgets/widgets.js index 39880153..cf32f1ea 100644 --- a/app/js/widgets/widgets.js +++ b/app/js/widgets/widgets.js @@ -17,7 +17,7 @@ define([ "w/voice", "w/weather", "w/wolfram", "w/youtube", "w/recentlyclosed", "w/chrome_bookmarks", "w/tasks", "w/quotes", "w/html", - "w/notifications", "w/sitelink", + "w/notifications", "w/sitelink", "w/stats", "lib/jquery.numberformatter", "lib/jquery.sortable" ], function(_, Utils) { diff --git a/app/manifest.json b/app/manifest.json index cf8f073a..1776c4cd 100644 --- a/app/manifest.json +++ b/app/manifest.json @@ -50,6 +50,9 @@ "http://*/", "https://*/", "webRequest", + "system.cpu", + "system.memory", + "system.storage", "unlimitedStorage", "chrome://favicon/", "webRequestBlocking" diff --git a/app/templates/widgets/stats/desc.hjs b/app/templates/widgets/stats/desc.hjs new file mode 100644 index 00000000..9c15fe84 --- /dev/null +++ b/app/templates/widgets/stats/desc.hjs @@ -0,0 +1 @@ +Use this widget to keep an eye on your system with realtime statistics. \ No newline at end of file diff --git a/app/templates/widgets/stats/template.hjs b/app/templates/widgets/stats/template.hjs new file mode 100644 index 00000000..aab04447 --- /dev/null +++ b/app/templates/widgets/stats/template.hjs @@ -0,0 +1,53 @@ +

{{i18n.name}}

+ +
+
+

CPU

+ + + + +
+ +
+

{{cpu.name}}

+ +

{{cpu.usage}}% {{i18n.usage}}

+ + {{#cpu.cores}} + + {{/cpu.cores}} +
+
+ +
+
+

{{i18n.memory}}

+ + + + +
+ +
+

{{ram.usage}} / {{ram.total}} {{i18n.in_use}}

+ + +
+
+ +
+
+

{{i18n.battery}}

+ + + + +
+ +
+

{{battery.status}} ({{battery.percent}}%{{#battery.remaining}}, {{battery.remaining}} {{i18n.remaining}}{{/battery.remaining}})

+ + +
+
\ No newline at end of file diff --git a/app/widgets/stats.js b/app/widgets/stats.js new file mode 100644 index 00000000..64cb1929 --- /dev/null +++ b/app/widgets/stats.js @@ -0,0 +1,179 @@ +/* + * System Stats + */ +define(["lodash", "jquery", "moment"], function(_, $, moment) { + return { + id: 39, + size: 1, + interval: 300000, + nicename: "stats", + sizes: ["small"], + + config: { + size: "small" + }, + + + /** + * These are element and data caches for the CPU usage updater function + */ + cpuUsage: null, + cpuCores: null, + cpuCoreInfo: [], + cpuInterval: null, + + + /** + * Updates the CPU usage indicators + */ + updateCPU: function() { + chrome.system.cpu.getInfo(function(d) { + var val; + + this.cpuUsage.innerText = Math.floor( + _.reduce( + _.map(d.processors, function(d, i) { + val = ((d.usage.user + d.usage.kernel) - this.cpuCoreInfo[i].usage) / (d.usage.total - this.cpuCoreInfo[i].total) * 100; + + if (val) { + (this.cpuCores[i] || {}).value = val; + } + + this.cpuCoreInfo[i] = { usage: (d.usage.user + d.usage.kernel), total: d.usage.total }; + + return val; + }.bind(this)), + function(r, d) { + return r + d; + }, + 0 + ) / d.processors.length + ); + }.bind(this)); + }, + + + refresh: function() { + clearInterval(this.cpuInterval); + + var battery; + + var queries = { + battery: function(cb) { + navigator.getBattery().then(function(d) { + var data = { + status: d.charging ? (d.level == 1 ? this.utils.translate("charged") : this.utils.translate("charging")) : (d.level == 1 ? this.utils.translate("idle") : this.utils.translate("discharging")), + percent: Math.floor(d.level * 100) + }; + + var time = d.dischargingTime == Infinity ? d.chargingTime : d.dischargingTime; + + if (time != Infinity && time !== 0) { + data.remaining = moment.duration(time, "seconds").humanize(); + } + + battery = d; + + cb.call(this, data); + }.bind(this)); + }, + + cpu: function(cb) { + chrome.system.cpu.getInfo(function(d) { + var coreInfo = this.cpuCoreInfo; + + var data = { + name: d.modelName, + cores: d.processors.map(function(d, i) { + if (coreInfo[i]) { + var val = ((d.usage.user + d.usage.kernel) - coreInfo[i].usage) / (d.usage.total - coreInfo[i].total) * 100; + + coreInfo[i] = { usage: (d.usage.user + d.usage.kernel), total: d.usage.total }; + + return val; + } + else { + coreInfo.push({ usage: (d.usage.user + d.usage.kernel), total: d.usage.total }); + + return (d.usage.user + d.usage.kernel) / d.usage.total * 100; + } + }) + }; + + data.usage = Math.floor(_.reduce(data.cores, function(r, d) { return r + d; }, 0) / d.processors.length); + + cb.call(this, data); + }.bind(this)); + }, + + ram: function(cb) { + chrome.system.memory.getInfo(function(d) { + var formatNum = function(num) { + var exp = Math.floor(Math.log(num) / Math.log(1024)); + + return (num / Math.pow(1024, exp)).toFixed(2) * 1 + " " + (exp == 0 ? "bytes": "KMGTPEZY"[exp - 1] + "iB"); + }; + + var data = { + usage: formatNum(d.capacity - d.availableCapacity), + total: formatNum(d.capacity), + usagePercent: ((d.capacity - d.availableCapacity) / d.capacity) * 100 + }; + + cb.call(this, data); + }.bind(this)); + } + }; + + + var i = 0, + result = {}, + total = Object.keys(queries).length; + + _.each(queries, function(type, key) { + type.call(this, function(data) { + result[key] = data; + + if (++i === total) { + if (battery) { + var updateStatus = _.throttle(function() { + battery.removeEventListener("levelchange", updateStatus); + battery.removeEventListener("chargingchange", updateStatus); + battery.removeEventListener("chargingtimechange", updateStatus); + battery.removeEventListener("dischargingtimechange", updateStatus); + + this.refresh(); + }.bind(this), 30000); + + battery.addEventListener("levelchange", updateStatus); + battery.addEventListener("chargingchange", updateStatus); + battery.addEventListener("chargingtimechange", updateStatus); + battery.addEventListener("dischargingtimechange", updateStatus); + } + + // Cache this so the widget renders immediately instead of flashing + this.data = result; + + this.render(); + + this.utils.saveData(this.data); + } + }); + }, this); + }, + + render: function(demo) { + if (demo) this.refresh(); + + this.utils.render(this.data); + + if (this.cpuCoreInfo.length) { + this.cpuUsage = this.elm.find(".cpu .usage")[0]; + this.cpuCores = this.elm.find(".cpu progress"); + this.cpuInterval = setInterval(this.updateCPU.bind(this), 1000); + + this.updateCPU(); + } + } + }; +}); \ No newline at end of file From 5be60d60b60b28cdc922139ad884154cd8aed2bc Mon Sep 17 00:00:00 2001 From: Avi Kohn Date: Mon, 22 Jun 2015 19:14:10 -0400 Subject: [PATCH 14/30] System stats: Fixed improper code --- app/widgets/stats.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/widgets/stats.js b/app/widgets/stats.js index 64cb1929..583df119 100644 --- a/app/widgets/stats.js +++ b/app/widgets/stats.js @@ -111,7 +111,7 @@ define(["lodash", "jquery", "moment"], function(_, $, moment) { var formatNum = function(num) { var exp = Math.floor(Math.log(num) / Math.log(1024)); - return (num / Math.pow(1024, exp)).toFixed(2) * 1 + " " + (exp == 0 ? "bytes": "KMGTPEZY"[exp - 1] + "iB"); + return (num / Math.pow(1024, exp)).toFixed(2) * 1 + " " + (exp === 0 ? "bytes": "KMGTPEZY"[exp - 1] + "iB"); }; var data = { From a59f76f812b075ff70ae3de1ce290526aec0f5ec Mon Sep 17 00:00:00 2001 From: Avi Kohn Date: Wed, 1 Jul 2015 13:18:42 -0400 Subject: [PATCH 15/30] Enhanced support for date and time inputs --- app/css/style.css | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/app/css/style.css b/app/css/style.css index c88c2695..b4b031bb 100644 --- a/app/css/style.css +++ b/app/css/style.css @@ -187,6 +187,7 @@ body > .loading h2 { input[type="tel"], input[type="text"], input[type="time"], +input[type="date"], input[type="email"], input[type="search"], input[type="number"], @@ -206,6 +207,7 @@ textarea { .widget input[type="tel"], .widget input[type="text"], .widget input[type="time"], +.widget input[type="date"], .widget input[type="email"], .widget input[type="search"], .widget input[type="number"], @@ -217,6 +219,7 @@ textarea { input[type="tel"]:hover, input[type="text"]:hover, input[type="time"]:hover, +input[type="date"]:hover, input[type="email"]:hover, input[type="search"]:hover, input[type="number"]:hover, @@ -229,6 +232,7 @@ textarea:hover { input[type="tel"]:focus, input[type="text"]:focus, input[type="time"]:focus, +input[type="date"]:focus, input[type="email"]:focus, input[type="search"]:focus, input[type="number"]:focus, @@ -240,10 +244,44 @@ textarea:focus { input[type="time"]::-webkit-clear-button, input[type="time"]::-webkit-inner-spin-button, +input[type="date"]::-webkit-clear-button, +input[type="date"]::-webkit-inner-spin-button, input[type="number"]::-webkit-inner-spin-button { display: none; } +input[readonly]::-webkit-datetime-edit-ampm-field:focus, +input[readonly]::-webkit-datetime-edit-hour-field:focus, +input[readonly]::-webkit-datetime-edit-minute-field:focus { + color: inherit; + background-color: inherit; +} + +input[type="date"]::-webkit-calendar-picker-indicator { + opacity: 1; + overflow: hidden; + color: transparent; + position: relative; + margin-left: -1.3em; + margin-right: 0.3em; +} + +input[type="date"]::-webkit-calendar-picker-indicator:before { + top: 0; + left: 0; + right: 0; + bottom: 0; + color: #333; + line-height: 1; + content: "\e6ce"; + position: absolute; + font-family: Entypo; +} + +input[type="date"]::-webkit-calendar-picker-indicator:hover { + background: none; +} + form:not(.form-horizontal) .color label { display: block; } From e4712bdb02004751ff7144b9b1dacff929800afb Mon Sep 17 00:00:00 2001 From: Avi Kohn Date: Wed, 1 Jul 2015 13:19:02 -0400 Subject: [PATCH 16/30] Added Material Design button styles --- app/css/style.css | 193 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 193 insertions(+) diff --git a/app/css/style.css b/app/css/style.css index b4b031bb..a539b63b 100644 --- a/app/css/style.css +++ b/app/css/style.css @@ -319,6 +319,199 @@ form:not(.form-horizontal) .color label { + + +/*--------------------------------------------- + / Material Buttons +*/ +button.material { + border: 0; + outline: 0; + margin: 0 8px; + padding: 0 16px; + cursor: pointer; + min-width: 80px; + font-size: 13px; + background: #EEE; + font-weight: 500; + line-height: 32px; + border-radius: 2px; + text-align: center; + text-transform: uppercase; + font-family: Roboto, sans-serif; + transition: all .15s ease-in-out; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12), 0 1px 2px rgba(0, 0, 0, 0.24); +} + +button.material:hover, +button.material:focus, +button.material:active { + box-shadow: 0 3px 6px rgba(0, 0, 0, 0.16), 0 3px 6px rgba(0, 0, 0, 0.23); +} + +button.material:active { + background: #E0E0E0; +} + +button.material.disabled, +button.material[disabled] { + cursor: default; + box-shadow: none; + color: rgba(0, 0, 0, 0.5); + background: rgba(0, 0, 0, 0.12); +} + +button.material svg { + width: 24px; + height: 24px; + fill: currentColor; +} + + + + + + + +/*--------------------------------------------- + / Material Buttons / Floating Action Button +*/ +button.material.fab { + width: 40px; + height: 40px; + padding: 8px; + min-width: initial; + border-radius: 50%; +} + + + + + + + +/*--------------------------------------------- + / Material Buttons / Colors +*/ +button.material.red, +button.material.blue, +button.material.green, +button.material.orange { + color: #FFF; +} + +button.material.red { background: #F44336; } +button.material.red:active { background: #E53935; } + +button.material.blue { background: #2196F3; } +button.material.blue:active { background: #1E88E5; } + +button.material.green { background: #4CAF50; } +button.material.green:active { background: #43A047; } + +button.material.orange { background: #FF9800; } +button.material.orange:active { background: #FB8C00; } + + + + + + + +/*--------------------------------------------- + / Material Buttons / Flat +*/ +button.material.flat { + background: none; + box-shadow: none; + border-radius: 0; + line-height: 32px; +} + +button.material.flat:hover, +button.material.flat:focus { + background: rgba(0, 0, 0, 0.075); +} + +button.material.flat:active { + background: rgba(0, 0, 0, 0.15); +} + +button.material.flat.red { color: #F44336; } +button.material.flat.blue { color: #2196F3; } +button.material.flat.green { color: #4CAF50; } +button.material.flat.orange { color: #FF9800; } + + + + + + + + +/*--------------------------------------------- + / Material Buttons / Icon Toggle +*/ +button.material.toggle { + width: 36px; + color: #000; + height: 36px; + padding: 6px; + margin: 0 4px; + box-shadow: none; + position: relative; + min-width: initial; + border-radius: 50%; + background: transparent; + transition: all .2s ease; +} + +button.material.toggle svg { + opacity: .7; +} + +button.material.toggle:after, +button.material.toggle:before { + position: absolute; + border-radius: 50%; + background: currentColor; + transition: opacity .2s ease; +} + +button.material.toggle:before { + top: 50%; + width: 0; + left: 50%; + height: 0; + content: ""; + opacity: 0.1; + border-radius: 50%; + transform: translateX(-50%) translateY(-50%); +} + +button.material.toggle:active:before { + width: 100%; + height: 100%; + opacity: .05; + transition: width .2s ease, height .2s ease; +} + +button.material.toggle:hover:after, +button.material.toggle:focus:after { + top: 0; + left: 0; + right: 0; + bottom: 0; + content: ""; + opacity: .05; +} + + + + + + + /*--------------------------------------------- / Forms / Checkbox and Radio Styles */ From 01adbafa597f155c5ca2f4a42a649c3b341addbd Mon Sep 17 00:00:00 2001 From: Avi Kohn Date: Wed, 1 Jul 2015 13:20:00 -0400 Subject: [PATCH 17/30] Updated Number.pad to only pad to two characters --- app/js/lib/extends.js | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/app/js/lib/extends.js b/app/js/lib/extends.js index a45625b8..e2783e3d 100644 --- a/app/js/lib/extends.js +++ b/app/js/lib/extends.js @@ -32,12 +32,10 @@ require(["jquery"], function($) { return newValue; }; - Number.prototype.pad = function(width, char) { - char = char || "0"; - num = this + ""; - width = width || 2; + Number.prototype.pad = function() { + var num = this.toString(); - return ((num.length >= width) ? num : new Array(width - num.length + 1).join(char) + num); + return (num.length == 1) ? "0" + num : num; }; $.animateNumber = function(from, to, speed, elm, prefix) { From 623ef2fc19529f3527368a30b0b78674c151a128 Mon Sep 17 00:00:00 2001 From: Avi Kohn Date: Wed, 1 Jul 2015 13:29:26 -0400 Subject: [PATCH 18/30] Clock: Updated the Time & Date widget Renamed the Time & Date widget to Clock and added alarm, timer, and stopwatch functionalities. Screenshots: http://i.imgur.com/ZZteGcg.png http://i.imgur.com/8ePz7Nt.png http://i.imgur.com/Bu3wQgN.png --- app/css/widgets.css | 225 ++++++++- app/js/i18n/locales/en/widgets.json | 20 +- app/templates/widgets/clock/desc.hjs | 4 +- app/templates/widgets/clock/template.hjs | 115 ++++- app/widgets/clock.js | 571 +++++++++++++++++++---- 5 files changed, 832 insertions(+), 103 deletions(-) diff --git a/app/css/widgets.css b/app/css/widgets.css index 3f24a984..7778f15b 100644 --- a/app/css/widgets.css +++ b/app/css/widgets.css @@ -954,6 +954,31 @@ /*--------------------------------------------- / Clock */ +.widget.clock { + font-family: Roboto, sans-serif; +} + +.widget.clock.small { + background: #FAFAFA; +} + +.clock .section { + padding: 15px; + position: absolute; + margin: 0 -15px -15px; + transform: translateX(-100%); + transition: transform .2s ease-in-out; +} + +.clock .section.active { + position: static; + transform: translateX(0); +} + +.clock .section.active ~ .section { + transform: translateX(100%); +} + .clock .time { color: #555; font-size: 85px; @@ -963,6 +988,23 @@ font-family: Open Sans, sans-serif; } +.clock input:not([type="checkbox"]) { + border-radius: 0; + border-width: 0 0 1px 0!important; +} + +.clock input.time { + width: 100%; + font-size: 80px; + border-radius: 0; + border: 0!important; + padding: 0 0 5px!important; +} + +.clock input.date { + font-size: 16px; +} + .clock .time:after { color: #67A9E2; font-size: 25px; @@ -980,16 +1022,197 @@ .clock .time.no-seconds { font-size: 120px; - line-height: 150px; + line-height: 115px; } .clock .date { color: #428BCA; font-size: 18px; + margin-top: 20px; + text-align: center; +} + +.clock .controls { + display: flex; + margin-top: 15px; + align-items: flex-end; + justify-content: space-between; +} + +.clock .controls button.material { + margin: 0; +} + +.clock .controls button.material.toggle { + margin: -6px 4px; +} + +.clock .controls button.material.toggle:first-child { + margin-left: -6px; +} + +.clock .start-stop.started #start, +.clock .start-stop:not(.started) #stop { + display: none; +} + + + + + + + +/*--------------------------------------------- + / Clock / Header +*/ +.clock header.tabs { + height: 44px; + display: flex; + background: #FFF; + margin: -15px -15px 0; + border-bottom: 1px solid rgba(0, 0, 0, .1); +} + +.clock .tabs .item { + flex: 1 25%; + padding: 10px 0; + cursor: pointer; + text-align: center; +} + +.clock .tabs svg { + width: 22px; + height: 22px; + fill: #757575; + display: inline-block; + vertical-align: middle; +} + +.clock .tabs .item:hover svg { + fill: #444; +} + +.clock .tabs .item.active svg { + opacity: 1; + fill: #2196F3; +} + + + + + + + + +/*--------------------------------------------- + / Clock / Clock +*/ +.clock .section.clock { + padding-top: 25px; +} + + + + + + +/*--------------------------------------------- + / Clock / Alarm +*/ +.clock .alarm.running input.time, +.clock .alarm:not(.running) div.time { + display: none; +} + +.clock .alarm input.time { + padding: 3px 0 3px!important; +} + +.clock .alarm .date { + color: #333; + flex: 0 145px; + margin-top: 0; + border: 0!important; + padding: 0!important; +} + +.clock .alarm .audio { + margin-left: 5px; + font-weight: 500; +} + + + + + + + +/*--------------------------------------------- + / Clock / Timer +*/ +.clock .timer .controls { margin-top: 10px; +} + +.clock .timer.running input.time, +.clock .timer:not(.running) div.time { + display: none; +} + + + + + + + +/*--------------------------------------------- + / Clock / Alert +*/ +.clock .alert { + left: 0; + right: 0; + top: 100%; + margin: 0; + border: 0; + bottom: 0; + z-index: 1; + color: #FFF; + width: 100%; + height: 100%; + display: flex; + border-radius: 0; + position: absolute; text-align: center; + background: #FB8C00; + flex-flow: row wrap; + align-content: space-around; + transition: top .2s ease-in-out; +} + +.clock .alert.visible { + top: 0; +} + +.clock .alert > * { + flex-basis: 100%; } +.clock .alert h3 { + font-weight: 300; + font-family: inherit; +} + +.clock .alert .time, +.clock .alert button.flat { + color: inherit; +} + +.clock .alert .time { + margin: 0; +} + + + diff --git a/app/js/i18n/locales/en/widgets.json b/app/js/i18n/locales/en/widgets.json index a8eaff02..c8f6fff4 100644 --- a/app/js/i18n/locales/en/widgets.json +++ b/app/js/i18n/locales/en/widgets.json @@ -126,8 +126,8 @@ }, "clock": { - "name": "Time & Date", - "desc": "Shows the current date and time. Optionally for a different timezone.", + "name": "Clock", + "desc": "Offers alarm, time, timer, and stopwatch functionality.", "settings": { "timezone": "Time Zone", @@ -140,10 +140,22 @@ "analog": "12 Hour - Analog", "ampmseconds": "AM/PM - Digital, No Seconds", "24hourseconds": "24 Hour - Digital, No Seconds" - } + }, + + "sound": "Alert Sound" }, - "title": "Clock" + "title": "Clock", + + "alarm": "Alarm", + "clock": "Clock", + "timer": "Timer", + "stopwatch": "Stopwatch", + + "set": "Set", + "unset": "Unset", + "dismiss": "Dismiss", + "enable_audio": "Enable audio" }, "currency": { diff --git a/app/templates/widgets/clock/desc.hjs b/app/templates/widgets/clock/desc.hjs index 3b04f220..1066f9a1 100644 --- a/app/templates/widgets/clock/desc.hjs +++ b/app/templates/widgets/clock/desc.hjs @@ -1,3 +1,3 @@ -The Time & Date widget displays the current time and date for the local or any other timezone.
+The Clock widget displays the current time and date and offers alarm, timer, and stopwatch functionality.

-After installation, pick your format preferences in the settings. \ No newline at end of file +After installation, pick your format preferences and alert sound in the settings. \ No newline at end of file diff --git a/app/templates/widgets/clock/template.hjs b/app/templates/widgets/clock/template.hjs index 144db529..6290334d 100644 --- a/app/templates/widgets/clock/template.hjs +++ b/app/templates/widgets/clock/template.hjs @@ -1,5 +1,3 @@ -{{#title}}

{{title}}

{{/title}} - {{#analog}}
@@ -42,5 +40,116 @@
{{/analog}} {{^analog}} -
{{{html}}}
+ {{#small}} +
+
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+
+ +
+
{{alarm.html}}
+ + + +
+ + + + + +
+
+ +
+

{{i18n.alarm}}

+ +

+ +
+ +
+
+ +
{{{html}}}
+ +
+
{{timer.html}}
+ + + +
+ + + + + +
+
+ +
+

{{i18n.timer}}

+ +

+ +
+ +
+
+ +
+
{{stopwatch.html}}{{^stopwatch.html}}0:00{{/stopwatch.html}}
+ +
+ + + +
+
+ {{/small}} + {{^small}} + {{#title}}

{{title}}

{{/title}} + +
{{{html}}}
+ {{/small}} {{/analog}} \ No newline at end of file diff --git a/app/widgets/clock.js b/app/widgets/clock.js index 6c7fa9fb..326d0755 100644 --- a/app/widgets/clock.js +++ b/app/widgets/clock.js @@ -1,12 +1,438 @@ /* * The Clock widget. */ -define(["jquery", "moment"], function($, moment) { +define(["jquery", "lodash", "moment", "backbone"], function($, _, moment, Backbone) { + var View = Backbone.View.extend({ + events: { + "click header.tabs .item": function(e) { + var tab = e.currentTarget.getAttribute("data-id"); + + $(e.currentTarget).add(this.$(".section." + tab)).addClass("active").siblings().removeClass("active"); + + this.data.tab = tab; + + this.utils.saveData(); + }, + + "click .alert .dismiss": function(e) { + $(e.currentTarget).parents(".alert").first().removeClass("visible"); + + if (this.audio) { + this.audio.pause(); + } + }, + + "change .audio input[type=checkbox]": function(e) { + this.config.audio = e.currentTarget.checked; + + this.utils.saveConfig(); + }, + + "click .stopwatch .start-stop": function(e) { + if (this.data.stopwatch && this.data.stopwatch.start) { + this.data.stopwatch.running = !this.data.stopwatch.running; + + if (!this.data.stopwatch.running) { + this.data.stopwatch.paused = new Date().getTime(); + } + else if (this.data.stopwatch.paused) { + this.data.stopwatch.start += new Date().getTime() - this.data.stopwatch.paused; + + delete this.data.stopwatch.paused; + } + } + else { + this.data.stopwatch = { + running: true, + start: new Date().getTime() + }; + } + + e.currentTarget.classList.toggle("started", this.data.stopwatch.running); + + this.utils.saveData(); + }, + + "click .stopwatch .reset": function(e) { + delete this.data.stopwatch; + + this.stopwatchElm.innerHTML = "0:00"; + + this.$(".stopwatch .start-stop").removeClass("started"); + + this.utils.saveData(); + }, + + "click .timer .start-stop": "startTimer", + + "keydown .timer input.time": function(e) { + if (e.which === 13) { + this.startTimer(e); + } + }, + + "click .timer .reset": function(e) { + delete this.data.timer; + + this.timerElm.innerHTML = "0:00"; + + this.$(".section.timer").removeClass("running"); + this.$(".timer .start-stop").removeClass("started"); + + this.utils.saveData(); + }, + + "keydown .alarm input.time": function(e) { + if (e.which === 13) { + this.startAlarm(e); + } + }, + + "click .alarm .set": "startAlarm" + }, + + interval: null, + + formatTime: function(time) { + time = Math.floor(time / 1000); + + var days = parseInt(time / 86400), + hours = parseInt((time % 86400) / 3600), + minutes = parseInt((time % 3600) / 60); + + if (days) { + return days + ":" + hours.pad() + ":" + minutes.pad() + ":" + (time % 60).pad(); + } + else if (hours) { + return hours + ":" + minutes.pad() + ":" + (time % 60).pad(); + } + else { + return minutes + ":" + (time % 60).pad(); + } + }, + + updateClock: function(returnHTML) { + var html = '
12 ? hours - 12 : hours); + + if (hours === 0) hours = 12; + + html += (am ? " am" : " pm") + (this.config.format == "ampms" ? " no-seconds" : ""); + } + else { + html += " full" + (this.config.format == "fulls" ? " no-seconds" : ""); + } + + html += '">' + hours + ":" + minutes.pad(); + + if (this.config.size == "tiny" && this.config.format.indexOf("ampm") === 0) { + html += "" + (this.config.format == "ampm" ? seconds.pad() : "") + "
"; + } + else if (this.config.size != "tiny") { + // moment(dt) is slower so avoid it when possible + var date = (this.config.timezone !== "auto" ? moment(dt).format("dddd, MMMM Do YYYY") : moment().format("dddd, MMMM Do YYYY")); + + if (this.config.format == "ampm" || this.config.format == "full") { + html += ":" + seconds.pad(); + } + + html += '
' + date + "
"; + } + + if (returnHTML) { + return html; + } + else { + this.clockElm.innerHTML = html; + } + }, + + updateStopwatch: function(ret) { + var formatted = this.formatTime(new Date().getTime() - this.data.stopwatch.start); + + if (ret) { + return formatted; + } + + this.stopwatchElm.innerHTML = formatted; + }, + + startTimer: function(e) { + if (this.data.timer && this.data.timer.start) { + this.data.timer.running = !this.data.timer.running; + + if (!this.data.timer.running) { + this.data.timer.paused = new Date().getTime(); + } + else if (this.data.timer.paused) { + this.data.timer.start += new Date().getTime() - this.data.timer.paused; + + delete this.data.timer.paused; + } + } + else { + var input = this.$(".timer input.time")[0]; + + input.value = input.value.replace(/[^0-9:\.]/g, ""); + + + var multiples = [1E3, 6E4, 36E5, 864E5]; + + // This splits 0:00:00:00.00 into ["0", "00", "00", "00.00"]. + // + // Then it reverses it, so it's [seconds, minutes, hours, days] and limits + // it to 4 values. + // + // Each value is then multiplied in order by its ms multiplier. They're combined + // leaving a single total ms value for the time input + var duration = _(input.value.split(":")).compact().reverse().take(4).reduce(function(total, e, i) { + total += Math.floor(e * multiples[i]); + + return total; + }, 0); + + if (duration) { + input.value = ""; + + this.data.timer = { + running: true, + duration: duration, + start: new Date().getTime() + }; + } + } + + var running = !!(this.data.timer && this.data.timer.running); + + this.$(".timer .start-stop").toggleClass("started", running); + this.$(".section.timer").toggleClass("running", !!this.data.timer); + + if (running) { + this.updateTimer(); + } + + this.utils.saveData(); + }, + + updateTimer: function(ret) { + var time = (this.data.timer.start + this.data.timer.duration) - new Date().getTime(); + + if (time <= 0) { + var formatted = "0:00"; + + this.trigger("timer:ended"); + + delete this.data.timer; + + this.$(".section.timer").removeClass("running"); + this.$(".timer .start-stop").removeClass("started"); + + this.utils.saveData(); + } + else { + var formatted = this.formatTime(time); + } + + if (ret) { + return formatted; + } + + this.timerElm.innerHTML = formatted; + }, + + startAlarm: function(e) { + if (this.data.alarm && this.data.alarm.set) { + this.data.alarm.set = !this.data.alarm.set; + } + else { + var time = new Date().setHours(0, 0, 0, 0) + this.$(".alarm input.time")[0].valueAsNumber; + + if (time <= new Date().getTime()) { + time += 86400000; + } + + this.data.alarm = { + set: true, + time: time + }; + } + + this.$(".alarm .set").text(this.data.alarm && this.data.alarm.set ? this.utils.translate("unset") : this.utils.translate("set")); + this.$(".section.alarm").toggleClass("running", this.data.alarm && this.data.alarm.set); + + if (this.data.alarm && this.data.alarm.set) { + this.updateAlarm(); + } + + this.utils.saveData(); + }, + + updateAlarm: function(ret) { + var time = this.data.alarm.time - new Date().getTime(); + + if (this.data.alarm.time <= new Date().getTime()) { + var formatted = "0:00"; + + this.trigger("alarm:ended"); + + // Don't delete the entire element, preserve the last used time + this.data.alarm.set = false; + + this.$(".alarm .set").text(this.utils.translate("set")); + this.$(".section.alarm").removeClass("running"); + + this.utils.saveData(); + } + else { + var formatted = this.formatTime(time); + } + + if (ret) { + return formatted; + } + + this.alarmElm.innerHTML = formatted; + }, + + setCache: function() { + this.timerElm = this.$(".timer div.time")[0]; + this.alarmElm = this.$(".alarm div.time")[0]; + this.stopwatchElm = this.$(".stopwatch .time")[0]; + }, + + update: function() { + this.updateClock(); + + if (this.data.alarm && this.data.alarm.set) this.updateAlarm(); + if (this.data.timer && this.data.timer.running) this.updateTimer(); + if (this.data.stopwatch && this.data.stopwatch.running) this.updateStopwatch(); + }, + + playAudio: function() { + if (this.config.audio) { + this.audio = new Audio(); + + this.audio.loop = true; + this.audio.volume = .3; + this.audio.autoplay = true; + this.audio.src = "http://ichro.me/widgets/clock/audio/" + this.config.sound + ".ogg"; + } + }, + + initialize: function() { + this.on("alarm:ended", function() { + this.$(".alert.alarm .time").text(moment(this.data.alarm.time).format("h:mm A")); + + this.$(".alert.alarm").addClass("visible"); + + this.playAudio(); + }).on("timer:ended", function() { + this.$(".alert.timer .time").text(this.formatTime(this.data.timer.duration)); + + this.$(".alert.timer").addClass("visible"); + + this.playAudio(); + }); + }, + + render: function() { + clearInterval(this.interval); + + this.isAnalog = (this.config.format == "analog"); + + this.$el.toggleClass("analog", this.isAnalog); + + if (this.isAnalog) { + var dt = new Date(); + + if (this.config.timezone !== "auto") { + dt = new Date(dt.getTime() + dt.getTimezoneOffset() * 60000 + parseInt(this.config.timezone) * 60000); + } + + var data = { + analog: true, + mPos: dt.getMinutes() * 6 + (dt.getSeconds() / 60 * 6), + hPos: dt.getHours() * 30 + (dt.getMinutes() / 60 * 30), + sPos: dt.getSeconds() * 6 + }; + + return this.utils.render(data); + } + + var data = JSON.parse(JSON.stringify(this.data)); + + data.html = this.updateClock(true); + + data.audio = this.config.audio; + + if (this.config.size === "tiny") { + if (this.config.title) { + data.title = this.config.title; + } + } + else { + if (data.stopwatch) { + if (data.stopwatch.paused) { + data.stopwatch.start += new Date().getTime() - data.stopwatch.paused; + } + + data.stopwatch.html = this.updateStopwatch.call({ data: data, formatTime: this.formatTime }, true); + } + + if (data.timer) { + if (data.timer.paused) { + data.timer.start += new Date().getTime() - data.timer.paused; + } + + data.timer.html = this.updateTimer.call({ data: data, formatTime: this.formatTime }, true); + } + + if (data.alarm) { + if (data.alarm.set) { + data.alarm.html = this.updateTimer.call({ data: data, formatTime: this.formatTime }, true); + } + } + + data.alarm = data.alarm || {}; + + data.alarm.timeStr = data.alarm.time ? new Date(data.alarm.time).getHours().pad() + ":" + new Date(data.alarm.time).getMinutes().pad() : "07:00"; + } + + this.utils.render(data); + + if (this.data.tab) { + this.$(".tabs .item[data-id=" + this.data.tab + "], .section." + this.data.tab).addClass("active").siblings().removeClass("active"); + } + + + this.clockElm = this.$(".clock")[0]; + + if (this.config.size === "tiny") { + this.interval = setInterval(this.updateClock.bind(this), 1000); + } + else { + this.setCache(); + + this.interval = setInterval(this.update.bind(this), 1000); + } + } + }); + return { id: 2, size: 2, - order: 10, - interval: 1000, nicename: "clock", sizes: ["tiny", "small"], settings: [ @@ -78,105 +504,64 @@ define(["jquery", "moment"], function($, moment) { ampms: "i18n.settings.format_options.ampmseconds", fulls: "i18n.settings.format_options.24hourseconds", } + }, + { + type: "select", + nicename: "sound", + label: "i18n.settings.sound", + options: { + urban_beat: "Urban Beat", + argon: "Argon", + ariel: "Ariel", + carbon: "Carbon", + carme: "Carme", + ceres: "Ceres", + dione: "Dione", + elara: "Elara", + europa: "Europa", + ganymede: "Ganymede", + helium: "Helium", + iapetus: "Iapetus", + io: "Io", + krypton: "Krypton", + luna: "Luna", + neon: "Neon", + oberon: "Oberon", + osmium: "Osmium", + oxygen: "Oxygen", + phobos: "Phobos", + platinum: "Platinum", + rhea: "Rhea", + salacia: "Salacia", + sedna: "Sedna", + tethys: "Tethys", + titan: "Titan", + triton: "Triton", + umbriel: "Umbriel" + } } ], config: { title: "i18n.title", size: "small", timezone: "auto", - format: "ampm" - }, - isAnalog: false, - getHTML: function() { - var html = '
12 ? hours - 12 : hours); - - if (hours === 0) hours = 12; - - html += (am ? " am" : " pm") + (this.config.format == "ampms" ? " no-seconds" : ""); - } - else { - html += " full" + (this.config.format == "fulls" ? " no-seconds" : ""); - } - - html += '">' + hours + ":" + minutes.pad(); - - if (this.config.size == "tiny" && this.config.format.indexOf("ampm") === 0) { - html += "" + (this.config.format == "ampm" ? seconds.pad() : "") + "
"; - } - else if (this.config.size != "tiny") { - // moment(dt) is slower so avoid it when possible - var date = (this.config.timezone !== "auto" ? moment(dt).format("dddd, MMMM Do YYYY") : moment().format("dddd, MMMM Do YYYY")); - - if (this.config.format == "ampm" || this.config.format == "full") { - html += ":" + seconds.pad(); - } - - html += '
' + date + "
"; - } - - return html; - }, - refresh: function(settings) { - if (settings) { - this.elm.removeClass("analog"); - - this.render(); - } - else if (!this.isAnalog) { - this.clockElm.innerHTML = this.getHTML(); - } + format: "ampm", + audio: true, + sound: "urban_beat" }, + data: {}, render: function() { - var data = { - analog: this.config.format == "analog" - }; - - this.isAnalog = data.analog; - - if (data.analog) { - var dt = new Date(); - - if (this.config.timezone !== "auto") { - dt = new Date(dt.getTime() + dt.getTimezoneOffset() * 60000 + parseInt(this.config.timezone) * 60000); - } - - var min = dt.getMinutes(); - - data = { - analog: true, - mPos: min * 6 + (dt.getSeconds() / 60 * 6), - hPos: dt.getHours() * 30 + (min / 60 * 30), - sPos: dt.getSeconds() * 6 - }; - - this.elm.addClass("analog"); - - this.utils.render(data); - } - else { - data.html = this.getHTML(); - - if (this.config.title && this.config.title !== "") { - data.title = this.config.title; - } - - this.utils.render(data); - - this.clockElm = this.elm.find(".clock")[0]; + if (!this.view) { + this.view = new (View.extend({ + utils: this.utils, + config: this.config, + data: this.data || {} + }))({ + el: this.elm + }); } + + this.view.render(); } }; }); \ No newline at end of file From 82e980c508ce594e9c4b9d9ce55c5c5733df94bf Mon Sep 17 00:00:00 2001 From: Avi Kohn Date: Wed, 1 Jul 2015 13:34:20 -0400 Subject: [PATCH 19/30] Fixed JSHint errors --- app/widgets/clock.js | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/app/widgets/clock.js b/app/widgets/clock.js index 326d0755..bf7249d1 100644 --- a/app/widgets/clock.js +++ b/app/widgets/clock.js @@ -227,10 +227,11 @@ define(["jquery", "lodash", "moment", "backbone"], function($, _, moment, Backbo }, updateTimer: function(ret) { - var time = (this.data.timer.start + this.data.timer.duration) - new Date().getTime(); + var formatted, + time = (this.data.timer.start + this.data.timer.duration) - new Date().getTime(); if (time <= 0) { - var formatted = "0:00"; + formatted = "0:00"; this.trigger("timer:ended"); @@ -242,7 +243,7 @@ define(["jquery", "lodash", "moment", "backbone"], function($, _, moment, Backbo this.utils.saveData(); } else { - var formatted = this.formatTime(time); + formatted = this.formatTime(time); } if (ret) { @@ -280,10 +281,11 @@ define(["jquery", "lodash", "moment", "backbone"], function($, _, moment, Backbo }, updateAlarm: function(ret) { - var time = this.data.alarm.time - new Date().getTime(); + var formatted, + time = this.data.alarm.time - new Date().getTime(); if (this.data.alarm.time <= new Date().getTime()) { - var formatted = "0:00"; + formatted = "0:00"; this.trigger("alarm:ended"); @@ -296,7 +298,7 @@ define(["jquery", "lodash", "moment", "backbone"], function($, _, moment, Backbo this.utils.saveData(); } else { - var formatted = this.formatTime(time); + formatted = this.formatTime(time); } if (ret) { @@ -325,7 +327,7 @@ define(["jquery", "lodash", "moment", "backbone"], function($, _, moment, Backbo this.audio = new Audio(); this.audio.loop = true; - this.audio.volume = .3; + this.audio.volume = 0.3; this.audio.autoplay = true; this.audio.src = "http://ichro.me/widgets/clock/audio/" + this.config.sound + ".ogg"; } @@ -354,6 +356,9 @@ define(["jquery", "lodash", "moment", "backbone"], function($, _, moment, Backbo this.$el.toggleClass("analog", this.isAnalog); + + var data; + if (this.isAnalog) { var dt = new Date(); @@ -361,7 +366,7 @@ define(["jquery", "lodash", "moment", "backbone"], function($, _, moment, Backbo dt = new Date(dt.getTime() + dt.getTimezoneOffset() * 60000 + parseInt(this.config.timezone) * 60000); } - var data = { + data = { analog: true, mPos: dt.getMinutes() * 6 + (dt.getSeconds() / 60 * 6), hPos: dt.getHours() * 30 + (dt.getMinutes() / 60 * 30), @@ -371,7 +376,7 @@ define(["jquery", "lodash", "moment", "backbone"], function($, _, moment, Backbo return this.utils.render(data); } - var data = JSON.parse(JSON.stringify(this.data)); + data = JSON.parse(JSON.stringify(this.data)); data.html = this.updateClock(true); From de1a1cf8ab996f04dacb989211af4287de5d5089 Mon Sep 17 00:00:00 2001 From: Avi Kohn Date: Wed, 1 Jul 2015 13:48:43 -0400 Subject: [PATCH 20/30] Updated license to proper SPDX code --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index dcf27aaa..e01a3442 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,7 @@ "url": "https://github.com/AMKohn/iChrome.git" }, "author": "Avi Kohn", - "license": "Creative Commons Attribution-ShareAlike 3.0 Unported", + "license": "CC-BY-SA-3.0", "bugs": { "url": "https://github.com/AMKohn/iChrome/issues" }, From 746dedd5a11af2280ad016139abb7d79e6a28857 Mon Sep 17 00:00:00 2001 From: Avi Kohn Date: Wed, 1 Jul 2015 14:03:43 -0400 Subject: [PATCH 21/30] Feedly; Fixed mark as read handler --- app/widgets/feedly.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/widgets/feedly.js b/app/widgets/feedly.js index e78af10c..d4888a3e 100644 --- a/app/widgets/feedly.js +++ b/app/widgets/feedly.js @@ -657,7 +657,9 @@ define(["jquery", "moment", "oauth"], function($, moment, OAuth) { last = new Date().getTime(); }; - this.elm.find(".items").on("click", ".item", function(e) { + this.elm.find(".items").on("mousedown", ".item", function(e) { + // mousedown handles left, middle, and right clicks + var id = $(this).attr("data-id"); if (!sent.hasOwnProperty(id)) { From 6b6de6bc8b113c2670f931dcf0c9b0013621c48c Mon Sep 17 00:00:00 2001 From: Avi Kohn Date: Thu, 2 Jul 2015 11:32:11 -0400 Subject: [PATCH 22/30] Added support for empty widget descriptions --- app/js/core/render.js | 2 +- app/templates/store-detail.hjs | 14 ++++++++------ 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/app/js/core/render.js b/app/js/core/render.js index c2e03515..6f43332a 100644 --- a/app/js/core/render.js +++ b/app/js/core/render.js @@ -11,7 +11,7 @@ define(["lodash", "hogan", "core/status", "i18n/i18n", "core/templates"], functi // Partials don't work with precompiled templates if (!compiled || partials) { - if (raw[template]) { + if (typeof raw[template] !== "undefined") { try { compiled = cache[template] = Hogan.compile(raw[template]); } diff --git a/app/templates/store-detail.hjs b/app/templates/store-detail.hjs index 2fc5e783..99169133 100644 --- a/app/templates/store-detail.hjs +++ b/app/templates/store-detail.hjs @@ -11,13 +11,15 @@ -
-

{{i18n.store.description}}

+ {{#desc}} +
+

{{i18n.store.description}}

-
- {{{desc}}} -
-
+
+ {{{desc}}} +
+
+ {{/desc}}

{{i18n.store.preview}}

From 515ecbd872d05ba916569b5ae3281306add07dad Mon Sep 17 00:00:00 2001 From: Avi Kohn Date: Thu, 2 Jul 2015 11:33:12 -0400 Subject: [PATCH 23/30] Added a Search widget Screenshot: http://i.imgur.com/D4sEYbD.png --- app/css/widgets.css | 46 ++++++++++++++++++++++ app/icons/search.png | Bin 0 -> 7068 bytes app/js/core/templates.js | 3 +- app/js/i18n/locales/en/widgets.json | 16 ++++++++ app/js/widgets/widgets.js | 1 + app/templates/widgets/search/desc.hjs | 0 app/templates/widgets/search/template.hjs | 7 ++++ app/widgets/search.js | 46 ++++++++++++++++++++++ 8 files changed, 118 insertions(+), 1 deletion(-) create mode 100644 app/icons/search.png create mode 100644 app/templates/widgets/search/desc.hjs create mode 100644 app/templates/widgets/search/template.hjs create mode 100644 app/widgets/search.js diff --git a/app/css/widgets.css b/app/css/widgets.css index 7778f15b..ae9d42d0 100644 --- a/app/css/widgets.css +++ b/app/css/widgets.css @@ -3731,4 +3731,50 @@ body.no-edit .bookmarks .tools { .stats progress::-webkit-progress-bar { background: #BBDEFB; +} + + + + + + + +/*--------------------------------------------- + / Search +*/ +.widget.search form { + height: 50px; + margin: -15px; + position: relative; +} + +.widget.search .searchbox { + top: 0; + left: 0; + right: 0; + bottom: 0; + width: 100%; + border-radius: 0; + position: absolute; + border: 0!important; + font-family: Roboto; + padding: 6px 18px!important; +} + +.widget.search .searchbox:focus, +.widget.search .searchbox:active { + background: rgba(0, 0, 0, .015)!important; +} + +.widget.search button.submit { + top: 0; + right: 0; + bottom: 0; + margin: 0; + border-radius: 0; + position: absolute; +} + +.widget.search.tiny form { + height: 65px; } \ No newline at end of file diff --git a/app/icons/search.png b/app/icons/search.png new file mode 100644 index 0000000000000000000000000000000000000000..cc5d859dd51e03bc39ff473533aeb8f3c7bbeaa0 GIT binary patch literal 7068 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 rfLmxk!Un7pO!L + + + {{#small}} + + {{/small}} + \ No newline at end of file diff --git a/app/widgets/search.js b/app/widgets/search.js new file mode 100644 index 00000000..4c5b525b --- /dev/null +++ b/app/widgets/search.js @@ -0,0 +1,46 @@ +/* + * Search + */ +define([], function() { + return { + id: 40, + size: 1, + nicename: "search", + sizes: ["tiny", "small"], + + config: { + param: "q", + size: "small", + url: "https://www.google.com/search", + placeholder: "i18n.default_placeholder" + }, + + settings: [ + { + type: "size" + }, + { + type: "text", + nicename: "placeholder", + label: "i18n.settings.placeholder", + placeholder: "i18n.default_placeholder" + }, + { + type: "text", + nicename: "url", + label: "i18n.settings.search_url", + placeholder: "https://www.google.com/search" + }, + { + type: "text", + nicename: "param", + label: "i18n.settings.param", + placeholder: "i18n.settings.param_placeholder" + } + ], + + render: function() { + this.utils.render(this.config); + } + }; +}); \ No newline at end of file From 41481a20c79d0c7fea8a13782cf0d67cec79d24e Mon Sep 17 00:00:00 2001 From: Avi Kohn Date: Thu, 2 Jul 2015 12:12:57 -0400 Subject: [PATCH 24/30] Traffic: Added a link to directions --- app/css/widgets.css | 5 +++++ app/templates/widgets/traffic/template.hjs | 6 ++++-- app/widgets/traffic.js | 8 ++++++-- 3 files changed, 15 insertions(+), 4 deletions(-) diff --git a/app/css/widgets.css b/app/css/widgets.css index ae9d42d0..144f839b 100644 --- a/app/css/widgets.css +++ b/app/css/widgets.css @@ -1455,6 +1455,11 @@ cursor: pointer; } +.widget.traffic a { + color: inherit; + text-decoration: none; +} + .widget.traffic .dest { font-size: 16px; margin-top: 10px; diff --git a/app/templates/widgets/traffic/template.hjs b/app/templates/widgets/traffic/template.hjs index 98d664fe..55ea0b29 100644 --- a/app/templates/widgets/traffic/template.hjs +++ b/app/templates/widgets/traffic/template.hjs @@ -1,3 +1,5 @@ -
{{time}}
+ +
{{time}}
-

{{dest}}

\ No newline at end of file +

{{dest}}

+
\ No newline at end of file diff --git a/app/widgets/traffic.js b/app/widgets/traffic.js index ed607adf..75afc3d6 100644 --- a/app/widgets/traffic.js +++ b/app/widgets/traffic.js @@ -120,7 +120,9 @@ define(["jquery", "moment"], function($, moment) { } var data = { - dest: this.utils.translate("to_" + dest) + dest: this.utils.translate("to_" + dest), + toEnc: encodeURIComponent(this.config[dest]), + fromEnc: encodeURIComponent(this.config[dest == "work" ? "home" : "work"]) }; var time = moment.duration(this.data[dest] || 0, "seconds"), @@ -158,7 +160,9 @@ define(["jquery", "moment"], function($, moment) { this.utils.render(data); - this.elm.off("click.traffic").on("click.traffic", ".time, .dest", function() { + this.elm.off("click.traffic").on("click.traffic", ".dest", function(e) { + e.preventDefault(); + if (this.elm.find(".dest").text().trim() == this.utils.translate("to_work")) { this.render("home"); } From 2eb87f4c59ab8a645c92f3cdcf31a4a080bf0ebb Mon Sep 17 00:00:00 2001 From: Avi Kohn Date: Tue, 7 Jul 2015 19:18:51 -0400 Subject: [PATCH 25/30] Added a Classroom widget --- app/css/widgets.css | 17 ++++++- app/icons/classroom.png | Bin 0 -> 5041 bytes app/inject/js/classroom.js | 49 +++++++++++++++++++ app/js/core/templates.js | 3 +- app/js/i18n/locales/en/widgets.json | 11 +++++ app/js/widgets/widgets.js | 2 +- app/manifest.json | 6 +++ app/templates/widgets/classroom/desc.hjs | 3 ++ app/templates/widgets/classroom/template.hjs | 1 + app/widgets/classroom.js | 43 ++++++++++++++++ 10 files changed, 132 insertions(+), 3 deletions(-) create mode 100644 app/icons/classroom.png create mode 100644 app/inject/js/classroom.js create mode 100644 app/templates/widgets/classroom/desc.hjs create mode 100644 app/templates/widgets/classroom/template.hjs create mode 100644 app/widgets/classroom.js diff --git a/app/css/widgets.css b/app/css/widgets.css index 144f839b..e5aa0627 100644 --- a/app/css/widgets.css +++ b/app/css/widgets.css @@ -2849,13 +2849,14 @@ body.no-edit .bookmarks .tools { /*--------------------------------------------- - / iFrame, HTML, Keep, Plus and Facebook shared + / iFrame, HTML, Keep, Plus, Classroom and Facebook shared */ .widget.html, .widget.keep, .widget.plus, .widget.iframe, .widget.facebook, +.widget.classroom, .widget.notifications { padding: 0!important; } @@ -2865,6 +2866,7 @@ body.no-edit .bookmarks .tools { .plus iframe, .iframe iframe, .facebook iframe, +.classroom iframe, .notifications iframe { width: 100%; height: 100%; @@ -3782,4 +3784,17 @@ body.no-edit .bookmarks .tools { .widget.search.tiny form { height: 65px; +} + + + + + + + +/*--------------------------------------------- + / Classroom +*/ +.widget.classroom { + height: 450px; } \ No newline at end of file diff --git a/app/icons/classroom.png b/app/icons/classroom.png new file mode 100644 index 0000000000000000000000000000000000000000..55dc44980ec411671f6835a4be9d199a5077967d GIT binary patch literal 5041 zcmbVQXHe7Mw*65Iz4xY}M>^6wBy<8ulOQ#;phy*|f#%xq==AT@jhgWbRH;^E`*)WyRStOJ9AJ-t1gA3bpb0RQ67^cI7z5=qdD{D7>qh;G&Bg=26Ceb5)#ny z3`Roav81y^o1FOxVeg}3zx-Vbdha^jirXH(s-IEbDL>As8zt%>CQsFtFp@%(mq2gR ztcLaX^sQ}*sD_gAcmmYKb&i}*FS+r6vk*l^L9Py>b^y2M@}Qul33V_$lP4yHe^JHNswL| ziI2=w73m7dV7V76Nws=B1OU0o3^&ytU;2+wR*sBFCp1vn3h#XaU31ynZ(MDSmU*fI zz?x6U_?3`o9V=P^gm$~i=RG8Ju_4QShKqBqrBba2a(Cy=k3IkKMk6l?J2$trxjC!b z1GPkcF%P~%b=h{9Uq1O0qIiKjU2R|I3B6|>szrFV+BI|n|G+-_nk3wQaXV4#qLJ+S zf@6}aN5>wE5TM^MqV-Bp&x}95_kk-0`uc7!@5Hs^`ijtB0_7Dcp!%^gUQn`dv9$xi zZ#{l$gipsh4gh|&cyxY+5EGzX!q!Ipu8&kMwQ_j@w6o4@F95Jn=MgdeQm4{S3;^o6 zp#s%vY$u(}LLDIX&RdI}WEXbQ;ZUBQE+{pW)Dg|@ZFjf)B@_}lT+Jb1C;C;DL$brj zB{Id6Ql!hQiBidv>KsXo>4da~k`Ss55Yr(!=cDoLV-eg5#7r3xXPlkdgtT!y;Lp+Y zMqGNyQrhCiv8G@%ZH`|`-uQA+R+`Pp3Io8smlu((THZgbdX3B`a!|S+iKbfIKp67yBN&QBS|w)B11wDZq&ukl~Szt zk*}HNPY<*GJ@F`nwh;F;Z6cj0bx<^{M}~(s26m4hn}n}ZQ(!tlJE1w@Zp^(aRFWmB z&B~qfdEU{rmPqc65Lj>^Vl!v6dsAYQZIkntC25Yms#n38$vVXN%VS-ZE$S`FEs#_C zJvFoUnZ`@Sd8RZ{i4UO_c@4%@Mp4CdlFu^bhQkBOtbX% zwn5sM`NZI^*0;281Sfvv6p;*J{n020OBOQ`Gm6EJxhfrA$TAtn(r+pzBfg)$lR=f? zVTKTB5O~gz{Dt(b?pwaMYyzUDC8dR>%cW#y$7X}3i6u5B!Ihe35+)lZBwtg@%t~|a z@0+lhph^^qqe@Z59;PYHp)(MG!0S+$qu9_?KmWMnf~bR`dzj{ zNjO&A$;!1fH7ylUrd?)KrnTQDU3pNHQ`n}_V(~YWQmtQ?--=%gl{j)MXUAmDWT}X> zh*4ij{ZlC-(7H~uBBz3Px}~C}h^7c@kYZ4VnMQS2|7`f&P}0a!y)_G3 zsBCa+2u7mpnNW?rmEDIaZ7IRc!LKfrh$y1wD9bn=a)dnn=uI#GKz=!MB>PY$xc4M= zR}_U9r5>G?*l3^|yxa3A$0Tb~3&n)OJ`FpLj*HQIIVh5*ERx06w=~eUsq1syqpfijvUhLATvy6N3}J?$sQMjl zQ3ugv^NN}3#t(j_IOGwN@^5ADcN@wZiZaXhmMv_DWI7rL8V3!#JutQrE3g;b*N)eL z*W*ADnimg65EH5vYKi~%Ebuw!rvw%G1*hM&a|deixmYy@wZxYdFSj}?I9&$5CslCb zcG5?ZM;=i|+z5qlr6P|N=Vh8Dn^pQmoGpf?5IG2)CwlC1A_A4t?oZlRE)I^P)^pa$HiDSa zMF*@s1M)_?P9lmJOGIdepk zwG1OTd@xk^Wg$r>`{>>E0c{uU+Utf7k$UFB9Ek0<^2c(uie3Q=q#F#k1S21S$`zYp z8wA{@49gD8(<(#S_yYA^Lv1?0yzH#UbKNI1Bi)J!-d~(Kur@@9TCCI~&m(i#lo?`T zE9n=Q(imRMLKgkE*rGhXe9BmS^Rc9?2kSWMJmI{%y)2Beq)aVM+fJi&ru<^L zQwx@@xJ%{F?F(jjX8KdkQ%-+%{?_4CDq~7_&r<)oSyvdic^&i>V(%!P!a7cN4dT%-KLTlj;Rkoy}MS$+H>E}oDyDukGP`^gwbKd3z zhlu=Hv|Gq;2-_HaSkT=w1g1_rbYz#7iel|33X{wF0HPH zjjAHdHUOQL-wM|FflouFeapBDHkIEH-SE*0np2>!Zm-Z6(}tVN$PuJ+=W4_rOa=W7 z5e=Emk*M3b*j8A<4y9{U6>w8?$Eli$%|~awfDp$s#&ZE`_|!Z%kOUBts3rkD+M@)D z>E00JxI{@G2rX9<9lrYP0a|0UN5)-ItzH4R2)q#WhhufD|3~<5_5X)|lKng5e*kjf z_2Nsr5kkkWgvPN6%xQRl?<$vVmHpCP?r12j9b)d?(ApeU)ImA}_E0?6o5T*i5j0zD z?pfl)QN(y1PWFL;)-HWa{Z>CJVRds6-#-6&|4wsHo}R$%X}{H<-`O#?ig6O=Hn8EU z6rg+TOy#`COX&MKk8F_V7dkqp=hw+qtE%3lqis)}zwt7k^ZYm)N{(cE;fkrQ-lxW7 z%0b_w)tsd>xz$s4+OvqH_b#ZfdmZj-~{e z1!xI8cjnyh4_Gtg0~uSk7z^-ezBMJC_ATHWk>x$2|;{=i1|-ZKQ)` z+0<05|(?dx3xXRZvOYZLUe23{FwKNAFbO*C9 zf34UiGlF1cxDU>=bw)5qkxyO3INC|Mm|8VVX_fs@apnhUo>25`N;-Pz4m-l>s?+b5 z*T-AYaRP7)SKaiec=B)%A4=rSgC7?yD9eZIH+q#9xZX%}5DPQksU-cff0%$(PXVUg zwSbugZ=!VhzC(zQ%XG0Msl%?s2HL;efbyc48$E z1M2#-q%93m9j@BI`i-m>?bxE1RHZ$LL_&P8aA#gAf}yX$(8rwFje(0}@%WC*^Ss*n z?B>V&vcbE&t?j;e{LLRZ)d5$CT-*D7J8~#h3mQYVs>SIz{hav82is4G=7c*J2R`Nv z;TqA@8b*_}>PBBDtIklhsbp1?h@3QBzq1slnv>IOL*^x+pXe=vvqJ)9Sq%z=I0>*0Cc&ye>#jshKLX zhJH+I09>{i-yey-PMu*r3@XDc{rs_XSJ$0FZ|XF%u=G8o%lH`wZ=>`)om%7hF%BjxzlZIUw&a>j5uu!} z1I3{A*Z3o{iyc~X_0?;p$Ug=qoDEFsM&V|HiTNfGB|XW;6vgY??S%cfBtHSjbVWm9 zag;IIa!GA@&Z>7`+uwnl#p&rl+5_^TM1AD)V#LpM5|ae(yRKq93HuMp*yhZHr_oG0-t>_tL@6xgn9P4;`>*WfvYxDMQ!I38FY6Ttw;RXhQAQjTpD9*jmsM7u1Jq1q!DtBf(EB)21pm!aUL5c4B&CNW~>G}riQAGS+PkwTx}9c$nF ze;fq&yRTTZIm4&Do}Y`|iw#||xfIL>Mfu}9WG#$f!^O>3;Ib85LMxA4?mfySw6oJL z1M!{GzmfjEuX67wgM-SE)t|31h55e>zYiVh=?t!J}(>9&qvY5;e_S&&!6CDz{$c#<($%UBV7&hx zm`Bny{0LyNNa^JL&sfpas`u-2JgTA@`kO!Ey7>dW4^cKM5slI!CQSclO#6Ts+g>M( zby)5V=7npF79dvva)O-#F50fktIrIsHh_KcVbK3xjS#F2yd(r`(*1nD0e#5@h(j-4 Z0PLmPW=0|tOE)_aprc`+UJ12(`7e}fI{W|t literal 0 HcmV?d00001 diff --git a/app/inject/js/classroom.js b/app/inject/js/classroom.js new file mode 100644 index 00000000..2836067a --- /dev/null +++ b/app/inject/js/classroom.js @@ -0,0 +1,49 @@ +var s = document.createElement("script"); + +s.textContent = "(" + (function() { + var oEval = window.eval, + oOpen = window.open; + + window.eval = function(js) { + if (js == "win.frameElement.src") { + document.write( + "" + + "" + ); + + throw "Framebusting busted"; + } + else { + return oEval.apply(window, arguments); + } + }; + + window.open = function(url, target) { + if (url === window.location && (target == "_top" || target == "_parent")) { + throw "Framebusting busted"; + } + else { + return oOpen.apply(window, arguments); + } + }; +}).toString() + ")()"; + +document.documentElement.appendChild(s); \ No newline at end of file diff --git a/app/js/core/templates.js b/app/js/core/templates.js index a63e31d6..a8439776 100644 --- a/app/js/core/templates.js +++ b/app/js/core/templates.js @@ -50,7 +50,8 @@ var templates = [ "widgets.notifications", "widgets.notifications.desc", "widgets.sitelink", "widgets.sitelink.desc", "widgets.stats", "widgets.stats.desc", - "widgets.search", "widgets.search.desc" + "widgets.search", "widgets.search.desc", + "widgets.classroom", "widgets.classroom.desc" ], deps = []; diff --git a/app/js/i18n/locales/en/widgets.json b/app/js/i18n/locales/en/widgets.json index f00d2137..a26c14ad 100644 --- a/app/js/i18n/locales/en/widgets.json +++ b/app/js/i18n/locales/en/widgets.json @@ -718,5 +718,16 @@ }, "default_placeholder": "Search Google" + }, + + "classroom": { + "name": "Classroom", + "desc": "Keep up to date with your Google Classroom assignments and classes", + + "settings": { + "mode": "Widget Mode", + "mode_teacher": "Teacher", + "mode_student": "Student" + } } } \ No newline at end of file diff --git a/app/js/widgets/widgets.js b/app/js/widgets/widgets.js index 3ae33965..c3f7d403 100644 --- a/app/js/widgets/widgets.js +++ b/app/js/widgets/widgets.js @@ -18,7 +18,7 @@ define([ "w/youtube", "w/recentlyclosed", "w/chrome_bookmarks", "w/tasks", "w/quotes", "w/html", "w/notifications", "w/sitelink", "w/stats", - "w/search", + "w/search", "w/classroom", "lib/jquery.numberformatter", "lib/jquery.sortable" ], function(_, Utils) { diff --git a/app/manifest.json b/app/manifest.json index 1776c4cd..e207e4ac 100644 --- a/app/manifest.json +++ b/app/manifest.json @@ -16,6 +16,12 @@ "matches": [ "https://plus.google.com/app/basic*" ], "all_frames": true }, + { + "js": [ "inject/js/classroom.js" ], + "matches": [ "https://classroom.google.com/*" ], + "run_at": "document_start", + "all_frames": true + }, { "js": [ "inject/js/facebook.js" ], "matches": [ "https://m.facebook.com/*" ], diff --git a/app/templates/widgets/classroom/desc.hjs b/app/templates/widgets/classroom/desc.hjs new file mode 100644 index 00000000..39d7db22 --- /dev/null +++ b/app/templates/widgets/classroom/desc.hjs @@ -0,0 +1,3 @@ +Use this widget to keep up with your assignments and class changes in Google Classroom.<br /> +<br /> +Please note that this widget isn't available when you're offline. \ No newline at end of file diff --git a/app/templates/widgets/classroom/template.hjs b/app/templates/widgets/classroom/template.hjs new file mode 100644 index 00000000..cc11daf2 --- /dev/null +++ b/app/templates/widgets/classroom/template.hjs @@ -0,0 +1 @@ +<iframe src="{{url}}" style="height:450px" sandbox="allow-same-origin allow-popups allow-forms allow-scripts" seamless>For some strange reason it seems your browser doesn't support iFrames!</iframe> \ No newline at end of file diff --git a/app/widgets/classroom.js b/app/widgets/classroom.js new file mode 100644 index 00000000..070f3160 --- /dev/null +++ b/app/widgets/classroom.js @@ -0,0 +1,43 @@ +/* + * The Classroom widget. + */ +define(["jquery", "widgets/framefix"], function($, frameFix) { + return { + id: 41, + size: 4, + nicename: "classroom", + sizes: ["variable"], + settings: [ + { + type: "text", + nicename: "user", + label: "i18n.settings.account", + help: "i18n.settings.account_help", + placeholder: "i18n.settings.account_placeholder" + }, + { + type: "select", + label: "i18n.settings.mode", + nicename: "mode", + options: { + "teacher": "i18n.settings.mode_teacher", + "student": "i18n.settings.mode_student" + } + } + ], + config: { + user: "0", + mode: "student", + size: "variable" + }, + render: function() { + if (!frameFix(this.render, this, arguments)) return; + + this.utils.render({ + url: "https://classroom.google.com/u/" + (this.config.user || 0) + (this.config.mode == "teacher" ? "/ta/not-reviewed/all" : "/a/not-turned-in/all") + }); + + this.elm.addClass("tabbed"); + } + }; +}); \ No newline at end of file From d86685d2faa0aa2d90aff0c375516053b77492d5 Mon Sep 17 00:00:00 2001 From: Avi Kohn <avi@ichro.me> Date: Tue, 7 Jul 2015 19:19:10 -0400 Subject: [PATCH 26/30] Keep: Fixed spelling mistakes --- app/templates/widgets/keep/desc.hjs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/templates/widgets/keep/desc.hjs b/app/templates/widgets/keep/desc.hjs index a45e5e7b..865b39ac 100644 --- a/app/templates/widgets/keep/desc.hjs +++ b/app/templates/widgets/keep/desc.hjs @@ -1,3 +1,3 @@ Use this widget to display your Google Keep.<br /> <br /> -Please not that it won't work offline unless you install the Google Keep Chrome extension. \ No newline at end of file +Please note that this widget won't work offline unless you install the Google Keep Chrome extension. \ No newline at end of file From 269b0b19e4b146d86857ad0a9efab6d88b635d77 Mon Sep 17 00:00:00 2001 From: Avi Kohn <avi@ichro.me> Date: Tue, 7 Jul 2015 19:20:54 -0400 Subject: [PATCH 27/30] Gmail: Merged styles with other iframe widgets' --- app/css/widgets.css | 20 +++----------------- 1 file changed, 3 insertions(+), 17 deletions(-) diff --git a/app/css/widgets.css b/app/css/widgets.css index e5aa0627..a7cdcd10 100644 --- a/app/css/widgets.css +++ b/app/css/widgets.css @@ -2849,11 +2849,12 @@ body.no-edit .bookmarks .tools { /*--------------------------------------------- - / iFrame, HTML, Keep, Plus, Classroom and Facebook shared + / iframe widgets shared */ .widget.html, .widget.keep, .widget.plus, +.widget.gmail, .widget.iframe, .widget.facebook, .widget.classroom, @@ -2864,6 +2865,7 @@ body.no-edit .bookmarks .tools { .html iframe, .keep iframe, .plus iframe, +.gmail iframe, .iframe iframe, .facebook iframe, .classroom iframe, @@ -3044,22 +3046,6 @@ body.no-edit .bookmarks .tools { -/*--------------------------------------------- - / Gmail -*/ -.widget.gmail { - padding: 0!important; -} - -.gmail iframe { - width: 100%; - height: 100%; -} - - - - - /*--------------------------------------------- / Twitter */ From bf2b54691ed3c40076c9ec9f56611b915f4ef716 Mon Sep 17 00:00:00 2001 From: Avi Kohn <avi@ichro.me> Date: Tue, 7 Jul 2015 19:33:14 -0400 Subject: [PATCH 28/30] Classroom: Fixed JSHint eval warnings --- app/inject/js/classroom.js | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/app/inject/js/classroom.js b/app/inject/js/classroom.js index 2836067a..5fb45c3a 100644 --- a/app/inject/js/classroom.js +++ b/app/inject/js/classroom.js @@ -1,6 +1,10 @@ var s = document.createElement("script"); s.textContent = "(" + (function() { + // Ignore eval + /* jshint -W060 */ + /* jshint -W061 */ + var oEval = window.eval, oOpen = window.open; @@ -36,6 +40,9 @@ s.textContent = "(" + (function() { } }; + /*jshint +W060 */ + /*jshint +W061 */ + window.open = function(url, target) { if (url === window.location && (target == "_top" || target == "_parent")) { throw "Framebusting busted"; From 5524ec4f2426d1798102414ae6e5a7c92c49e1d9 Mon Sep 17 00:00:00 2001 From: Avi Kohn <avi@ichro.me> Date: Sun, 12 Jul 2015 20:05:39 -0400 Subject: [PATCH 29/30] Updated locale files --- app/js/i18n/locales/bn/main.json | 4 +- app/js/i18n/locales/bn/widgets.json | 64 ++++++++++- app/js/i18n/locales/ca/main.json | 4 +- app/js/i18n/locales/ca/widgets.json | 64 ++++++++++- app/js/i18n/locales/cs/description.json | 16 +-- app/js/i18n/locales/cs/main.json | 64 +++++------ app/js/i18n/locales/cs/widgets.json | 142 +++++++++++++++++------- app/js/i18n/locales/da/main.json | 4 +- app/js/i18n/locales/da/widgets.json | 64 ++++++++++- app/js/i18n/locales/de/main.json | 4 +- app/js/i18n/locales/de/widgets.json | 64 ++++++++++- app/js/i18n/locales/es-ES/main.json | 4 +- app/js/i18n/locales/es-ES/widgets.json | 64 ++++++++++- app/js/i18n/locales/fr/main.json | 4 +- app/js/i18n/locales/fr/widgets.json | 78 +++++++++++-- app/js/i18n/locales/hi/main.json | 4 +- app/js/i18n/locales/hi/widgets.json | 64 ++++++++++- app/js/i18n/locales/hr/main.json | 4 +- app/js/i18n/locales/hr/widgets.json | 64 ++++++++++- app/js/i18n/locales/id/main.json | 4 +- app/js/i18n/locales/id/widgets.json | 64 ++++++++++- app/js/i18n/locales/it/main.json | 4 +- app/js/i18n/locales/it/widgets.json | 64 ++++++++++- app/js/i18n/locales/ja/main.json | 4 +- app/js/i18n/locales/ja/widgets.json | 64 ++++++++++- app/js/i18n/locales/nl/main.json | 4 +- app/js/i18n/locales/nl/widgets.json | 64 ++++++++++- app/js/i18n/locales/pl/main.json | 4 +- app/js/i18n/locales/pl/widgets.json | 64 ++++++++++- app/js/i18n/locales/pt-PT/main.json | 4 +- app/js/i18n/locales/pt-PT/widgets.json | 64 ++++++++++- app/js/i18n/locales/ru/main.json | 4 +- app/js/i18n/locales/ru/widgets.json | 62 ++++++++++- app/js/i18n/locales/sr/main.json | 4 +- app/js/i18n/locales/sr/widgets.json | 64 ++++++++++- app/js/i18n/locales/tr/main.json | 4 +- app/js/i18n/locales/tr/widgets.json | 64 ++++++++++- app/js/i18n/locales/uk/main.json | 4 +- app/js/i18n/locales/uk/widgets.json | 64 ++++++++++- app/js/i18n/locales/zh-CN/main.json | 4 +- app/js/i18n/locales/zh-CN/widgets.json | 64 ++++++++++- app/js/i18n/locales/zh-TW/main.json | 4 +- app/js/i18n/locales/zh-TW/widgets.json | 64 ++++++++++- 43 files changed, 1406 insertions(+), 188 deletions(-) diff --git a/app/js/i18n/locales/bn/main.json b/app/js/i18n/locales/bn/main.json index c91e5781..8fda0654 100644 --- a/app/js/i18n/locales/bn/main.json +++ b/app/js/i18n/locales/bn/main.json @@ -145,7 +145,9 @@ "css":"স্বনির্ধারিত CSS", "css_desc":"You can use this field to customize almost any visual part of iChrome using CSS (for a definition please see the <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/CSS\" target=\"_blank\">MDN<\/a>).<br \/><br \/>Since this will be synced, you can only enter a maximum of 1000 characters, including whitespace.", "reset":"Reset iChrome", - "reset_confirm":"Are you really sure you want to reset iChrome?\r\nThis will erase all local and synced data, there is no backup and no way to undo this. You will lose your ENTIRE current configuration on all computers signed into this Google account." + "reset_confirm":"Are you really sure you want to reset iChrome?\r\nThis will erase all local and synced data, there is no backup and no way to undo this. You will lose your ENTIRE current configuration on all computers signed into this Google account.", + "debug":"Debug Tools", + "debug_confirm":"WARNING: These tools can erase your configuration in a single click, only use them if your developer instructs you to.\r\nAre you sure you want to continue?" } }, "store":{ diff --git a/app/js/i18n/locales/bn/widgets.json b/app/js/i18n/locales/bn/widgets.json index 0273942a..2f0ccbab 100644 --- a/app/js/i18n/locales/bn/widgets.json +++ b/app/js/i18n/locales/bn/widgets.json @@ -95,8 +95,8 @@ "noevents":"It doesn't look like there are any events in the near future.\n<br \/><br \/>\nTry selecting a calendar via the wrench icon in the top right." }, "clock":{ - "name":"সময় ও তারিখ", - "desc":"বর্তমান তারিখ এবং সময় প্রদর্শন করে। বিভিন্ন সময় অঞ্চল জন্য বিকল্পনীয়।", + "name":"ঘড়ি", + "desc":"Offers alarm, time, timer, and stopwatch functionality.", "settings":{ "timezone":"সময় অঞ্চল", "timezone_local":"স্থানীয়", @@ -107,9 +107,18 @@ "analog":"১২ ঘণ্টা - এনালগ", "ampmseconds":"পুর্বাহ্ন\/অপরাহ্ন - ডিজিটাল, সেকেন্ডবিহীন", "24hourseconds":"২৪ ঘণ্টা - ডিজিটাল, সেকেন্ডবিহীন" - } + }, + "sound":"Alert Sound" }, - "title":"ঘড়ি" + "title":"ঘড়ি", + "alarm":"Alarm", + "clock":"ঘড়ি", + "timer":"Timer", + "stopwatch":"Stopwatch", + "set":"Set", + "unset":"Unset", + "dismiss":"Dismiss", + "enable_audio":"Enable audio" }, "currency":{ "name":"মুদ্রা", @@ -500,5 +509,52 @@ "js":"JavaScript", "height":"উইজেটের উচ্চতা" } + }, + "sitelink":{ + "name":"Site Link", + "desc":"Displays a link, optionally with a title and thumbnail", + "settings":{ + "link":"Link URL", + "link_placeholder":"http:\/\/www.google.com.bd\/", + "image":"চিত্রের URL", + "image_placeholder":"http:\/\/www.example.com\/image.png", + "color":"Image Background Color", + "style":"Image Style", + "style_fill":"Fill", + "style_center":"কেন্দ্রে" + } + }, + "stats":{ + "name":"System Statistics", + "desc":"Keep an eye on your system with realtime statistics", + "memory":"Memory", + "battery":"Battery", + "usage":"usage", + "in_use":"in use", + "remaining":"remaining", + "charged":"Fully Charged", + "idle":"Idle", + "charging":"Charging", + "discharging":"Discharging" + }, + "search":{ + "name":"অনুসন্ধান", + "desc":"Embed a search box in your page for easy access", + "settings":{ + "placeholder":"Search Field Placeholder", + "search_url":"URL অনুসন্ধান", + "param":"Query Parameter", + "param_placeholder":"The parameter where the query goes, i.e. \"q\"" + }, + "default_placeholder":"Search Google" + }, + "classroom":{ + "name":"Classroom", + "desc":"Keep up to date with your Google Classroom assignments and classes", + "settings":{ + "mode":"Widget Mode", + "mode_teacher":"Teacher", + "mode_student":"Student" + } } } \ No newline at end of file diff --git a/app/js/i18n/locales/ca/main.json b/app/js/i18n/locales/ca/main.json index c12c7f98..3339d50d 100644 --- a/app/js/i18n/locales/ca/main.json +++ b/app/js/i18n/locales/ca/main.json @@ -145,7 +145,9 @@ "css":"Custom CSS", "css_desc":"You can use this field to customize almost any visual part of iChrome using CSS (for a definition please see the <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/CSS\" target=\"_blank\">MDN<\/a>).<br \/><br \/>Since this will be synced, you can only enter a maximum of 1000 characters, including whitespace.", "reset":"Reset iChrome", - "reset_confirm":"Are you really sure you want to reset iChrome?\r\nThis will erase all local and synced data, there is no backup and no way to undo this. You will lose your ENTIRE current configuration on all computers signed into this Google account." + "reset_confirm":"Are you really sure you want to reset iChrome?\r\nThis will erase all local and synced data, there is no backup and no way to undo this. You will lose your ENTIRE current configuration on all computers signed into this Google account.", + "debug":"Debug Tools", + "debug_confirm":"WARNING: These tools can erase your configuration in a single click, only use them if your developer instructs you to.\r\nAre you sure you want to continue?" } }, "store":{ diff --git a/app/js/i18n/locales/ca/widgets.json b/app/js/i18n/locales/ca/widgets.json index b17d189a..d688504c 100644 --- a/app/js/i18n/locales/ca/widgets.json +++ b/app/js/i18n/locales/ca/widgets.json @@ -95,8 +95,8 @@ "noevents":"It doesn't look like there are any events in the near future.\n<br \/><br \/>\nTry selecting a calendar via the wrench icon in the top right." }, "clock":{ - "name":"Time & Date", - "desc":"Shows the current date and time. Optionally for a different timezone.", + "name":"Clock", + "desc":"Offers alarm, time, timer, and stopwatch functionality.", "settings":{ "timezone":"Time Zone", "timezone_local":"Local", @@ -107,9 +107,18 @@ "analog":"12 Hour - Analog", "ampmseconds":"AM\/PM - Digital, No Seconds", "24hourseconds":"24 Hour - Digital, No Seconds" - } + }, + "sound":"Alert Sound" }, - "title":"Clock" + "title":"Clock", + "alarm":"Alarm", + "clock":"Clock", + "timer":"Timer", + "stopwatch":"Stopwatch", + "set":"Set", + "unset":"Unset", + "dismiss":"Dismiss", + "enable_audio":"Enable audio" }, "currency":{ "name":"Currency", @@ -500,5 +509,52 @@ "js":"JavaScript", "height":"Widget Height" } + }, + "sitelink":{ + "name":"Site Link", + "desc":"Displays a link, optionally with a title and thumbnail", + "settings":{ + "link":"Link URL", + "link_placeholder":"http:\/\/www.google.com\/", + "image":"Image URL", + "image_placeholder":"http:\/\/www.example.com\/image.png", + "color":"Image Background Color", + "style":"Image Style", + "style_fill":"Fill", + "style_center":"Center" + } + }, + "stats":{ + "name":"System Statistics", + "desc":"Keep an eye on your system with realtime statistics", + "memory":"Memory", + "battery":"Battery", + "usage":"usage", + "in_use":"in use", + "remaining":"remaining", + "charged":"Fully Charged", + "idle":"Idle", + "charging":"Charging", + "discharging":"Discharging" + }, + "search":{ + "name":"Search", + "desc":"Embed a search box in your page for easy access", + "settings":{ + "placeholder":"Search Field Placeholder", + "search_url":"Search URL", + "param":"Query Parameter", + "param_placeholder":"The parameter where the query goes, i.e. \"q\"" + }, + "default_placeholder":"Search Google" + }, + "classroom":{ + "name":"Classroom", + "desc":"Keep up to date with your Google Classroom assignments and classes", + "settings":{ + "mode":"Widget Mode", + "mode_teacher":"Teacher", + "mode_student":"Student" + } } } \ No newline at end of file diff --git a/app/js/i18n/locales/cs/description.json b/app/js/i18n/locales/cs/description.json index 15499111..933906b4 100644 --- a/app/js/i18n/locales/cs/description.json +++ b/app/js/i18n/locales/cs/description.json @@ -4,24 +4,24 @@ "link":"Jeslti hledáš doplněk pouze pro novou záložku a nikoli domovskou stránku, koukni na náš iChrome New Tab doplněk zde: https:\/\/chrome.google.com\/webstore\/detail\/ichrome-new-tab\/iccjgbbjckehppnpajnmplcccjcgbdep", "newtab_line_1":"iChrome je doplněk nahrazující domovskou stránku a má za cíl vytvořit takovou domovskou stránku, jakou si představuješ = rychlou, customizovatelnou, hezkou a podporující produktivitu ", "newtab_link":"Jeslti hledáš doplněk pouze pro novou záložku a nikoli domovskou stránku, koukni na náš iChrome New Tab doplněk zde: https:\/\/chrome.google.com\/webstore\/detail\/ichrome-your-homepage-for\/oghkljobbhapacbahlneolfclkniiami", - "line_2":"Vytvořte si VLASTNÍ úvodní stránku s více než 30 widgety a desítky ohromujících témat. Mimo tyto iChrome obsahuje další stovky vylepšení:", + "line_2":"Vytvořte si VLASTNÍ úvodní stránku s více než 30 widgety a desítky ohromujících témat. Mimo tyto iChrome obsahuje mnoho dalších vylepšení:", "features":[ "Desítky krásných tapet a témat, včetně těch z Bing a z Webshots ty nejlepší fotky každý den", "Kompletní synchronizace mezi počítači, včetně seznamu úkolů, poznámek a vlastních témat", - "Více možností rozložení, s možností 1-5 pevných či variabilních šířek sloupců (nebo je přeskočte a použíjte mřížku!)", + "Více možností rozložení, s možností 1-5 pevných či nastavitelných šířek sloupců (nebo je přeskočte a použijte mřížku!)", "Správné informace ve správný čas s integrací Chytrých karet Google", - "Plně integrované hlasové vyhledávání a včetně \"OK Google\" detekce", - "Celosvětové zprávy o počasí v reálném čase, včetně předpovědí s Weather widgetem", + "Plně integrované hlasové vyhledávání s možností \"OK Google\" detekce", + "Celosvětové zprávy o počasí v reálném čase, včetně předpovědí s widgetem Počasí", "Jednoduchá instalace a přeuspořádání widgetů pouhým přetažením", "Sleduj vývoj akcií v realném čase pomocí tohoto jednoduchého widgetu", "Získejte novinky pro konkrétní vydání a téma, nebo použíjte vlastní RSS kanál", "Jednoduše přístupujte ke všem svým Chrome aplikacím s widgetem aplikace", - "Sledujte váše nejnavštěvovanější webové stránky a nedávno zavřené panely v jednoduchých widgetech", - "Pohybujte se mezi přizpůsobitelnými kartami, kde každá má své vlastní téma a widgety, pomocí klávesnice", + "Sledujte vaše nejnavštěvovanější webové stránky a nedávno zavřené panely v jednoduchých widgetech", + "Pohybujte se mezi přizpůsobitelnými kartami, kde každá má své vlastní motiv a widgety, pomocí klávesnice", "Sledujte nejnovější obsah na YouTube nebo Reddit díky plně podporovaným widgetům", - "Pracuje zcela v režimu offline, kdykoli, všechno (i vaše téma) je připraveno vždy!" + "Pracuje zcela v režimu offline, kdykoli, všechno (i váš motiv) je připraveno vždy!" ], "line_3":"iChrome je open source projekt, podívejte se na Github: https:\/\/github.com\/AMKohn\/iChrome", "line_4":"Zpětná vazba a návrhy jsou vždy vítány, na: http:\/\/ichrome.uservoice.com", - "line_5":"Jste otrávení z rozšíření domovských stránkek, která Vás nenchají je upravovat? Otrávení z reklamy? Stále hledáte náhradu za iGoogle? Hledáte krásnou úvodní stránku, která se stále zlepšuje? iChrome je pro vás!" + "line_5":"Jste otrávení z rozšíření domovských stránek, která Vás nenechají je upravovat? Otrávení z reklamy? Stále hledáte náhradu za iGoogle? Hledáte krásnou úvodní stránku, která se stále zlepšuje? iChrome je pro vás!" } \ No newline at end of file diff --git a/app/js/i18n/locales/cs/main.json b/app/js/i18n/locales/cs/main.json index 1fe7b1e2..73313dd2 100644 --- a/app/js/i18n/locales/cs/main.json +++ b/app/js/i18n/locales/cs/main.json @@ -1,10 +1,10 @@ { "lang_code":"cs", "language":"Česky", - "newtabName":"iChrome Nová Karta", + "newtabName":"Nová karta iChrome", "extName":"iChrome - Vaše domovská stránka pro chrome", "extDescription":"NEJLEPŠÍ domovská stránka pro Chrome. Nádherné motivy, desítky widgetů, bleskově rychlý, šíleně přizpůsobitelný!", - "newtabDescription":"Nejlepší výchozí stránka pro Chrome. Nyní i pro nově otevřený tab. Krásná témata, hromada widgetů, rychlý a konfigurovatelný!", + "newtabDescription":"Nejlepší výchozí stránka pro Chrome. Nyní i pro nově otevřený panel. Krásná témata, hromada widgetů, rychlý a konfigurovatelný!", "defaults":{ "tab":"Domovská stránka", "me":"Já" @@ -14,7 +14,7 @@ "grid_to_column_warning":"Změnili jste rozložení z rastrového (grid) na sloupcové. Pokud budete pokračovat, ztratíte rozložení všech svých widgetů; vše bude přesunuto do prvního sloupce.\nOpravdu to chcete udělat?", "storage_warning":"Více než 90% synchronizovaného úložného prostoru bylo použito.\nPokud překročíte tento limit, iChrome přestane synchronizovat data a může i přestat fungovat.\nSituaci můžete zlepšit smazáním vlastních témat, poznámek a to-do listů, které nepoužíváte.", "toolbar":{ - "placeholder":"Zadejte své podmínky", + "placeholder":"Co hledáte?\n", "placeholder_ok":"Zadejte dotaz, nebo řekněte \"OK, Google\"", "apps":{ "search":"Hledat", @@ -23,7 +23,7 @@ "play":"Play", "news":"Zprávy", "gmail":"Gmail", - "drive":"Drive", + "drive":"Disk", "calendar":"Kalendář", "more":"Více" } @@ -43,7 +43,7 @@ "review":"Recenze", "twitter":"Twitter", "webstore":"Webový obchod", - "donate":"Darovat", + "donate":"Přispět", "by":"Avi Kohn" } }, @@ -56,7 +56,7 @@ "save":"Uložit a zavřít", "new_tab":"Vytvořit novou", "labels":{ - "general":"Obecný", + "general":"Obecné", "visual":"Vzhled", "specific":"Specifické pro záložku (tab).", "advanced":"Pokročilé" @@ -64,14 +64,14 @@ "general":{ "search_url":"Hledat URL", "search_url_desc":"Toto je adresa, na kterou se budou odesílat dotazy vyhledáváni. V adrese se <b>%s<\/b> nahradí vyhledávaným textem", - "profile":"Profilová fotka", + "profile":"Profilový obrázek", "profile_desc":"Tento obrázek se zobrazí na pravé straně horního panelu. Automaticky se doplní z Google profilu", "name":"Jméno", "name_desc":"Jméno použité v odkazu na Google+ v horním panelu. Doplní se automaticky z Google profilu", - "ltab":"Link Behavior", - "ltab_label":"Open links in a new tab by default", + "ltab":"Chování odkazů", + "ltab_label":"Jako výchozí otevírat odkazy v nové záložce", "search":"Chování vyhledávání", - "search_label":"Otevřít výsledky hledání v novém okně", + "search_label":"Otevřít výsledky hledání v nové záložce", "voice":"Vyhledávání pomocí hlasu", "voice_search":"Povolit vyhledávání pomocí hlasu", "voice_ok":"Povolte detekci výrazu \"OK Google\"", @@ -88,15 +88,15 @@ "link_holder":"Adresa odkazu. Příklad: http:\/\/www.google.com\/" }, "guide":"Instalační manuál", - "guide_desc":"Zobrazit znovu průvodce, který se zobrazuje po první instalaci" + "guide_desc":"Znovu zobrazit průvodce, který byl byl zobrazen při prvním startu iChrome" }, "visual":{ "layout":"Uspořádání", "layout_options":{ "1_fixed":"Jeden sloupec, pevná šířka", - "1_fluid":"Jeden sloupec, pružná šířka", + "1_fluid":"Jeden sloupec, nastavitelná šířka", "2_fixed":"Dva sloupce, pevná šířka", - "2_fluid":"Dva sloupce, pružná šířka", + "2_fluid":"Dva sloupce, nastavitelná šířka", "3_fixed":"Tři sloupce, pevná šířka", "3_fluid":"Tři sloupce, pružná šířka", "4_fixed":"Čtyři sloupce, pevná šířka", @@ -120,7 +120,7 @@ "toolbar":"Styl panelu nástrojů", "toolbar_desc":"Toto nastavuje styl panelů nástrojů. Buď je zobrazen normálně a nebo jako tlačítko.", "toolbar_normal":"Normální", - "toolbar_button":"Tlačítka", + "toolbar_button":"Tlačítko", "animation":"Úvodní animace", "animation_desc":"Toto nastavení umožňuje zapnout nebo vypnout úvodní animaci, která se spustí po načtení stránky", "animation_label":"Povolit animaci" @@ -145,7 +145,9 @@ "css":"Vlastní CSS", "css_desc":"Toto pole můžete použít k upravení téměř každé vizuální část iChrome pomocí CSS (definice viz <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/CSS\" \ntarget=\"_blank\">MDN<\/a>).<br \/><br \/>Z důvodu synchronizace nastavení, lze zadat maximálně 1000 znaků včetně mezer.", "reset":"Resetovat iChrome", - "reset_confirm":"Jste si opravdu jisti, že chcete obnovit základní nastavení iChrome?\nTímto budou vymazány všechny data, jak lokální tak synchronizované, tato změna je nevratná. Smažete kompletní nastavení a to na všech počítačích, které používají tento účet Google." + "reset_confirm":"Jste si opravdu jisti, že chcete obnovit základní nastavení iChrome?\nTímto budou vymazány všechny data, jak lokální tak synchronizované, tato změna je nevratná. Smažete kompletní nastavení a to na všech počítačích, které používají tento účet Google.", + "debug":"Debug Tools", + "debug_confirm":"WARNING: These tools can erase your configuration in a single click, only use them if your developer instructs you to.\r\nAre you sure you want to continue?" } }, "store":{ @@ -160,7 +162,7 @@ "small":"Malé", "medium":"Střední", "large":"Velké", - "variable":"Pružní" + "variable":"Proměnná" }, "settings":{ "title":"Nastavení widgetu", @@ -205,25 +207,25 @@ "images":"%s obrázků", "resolution":"Rozlišení", "categories":"Kategorie", - "cached":"Motiv je uložen ve vyrovnávací paměti a je dostupný offline", - "random":"Motiv zobrazuje náhodný obrázek pří každém načtení stránky", + "cached":"Tento motiv je uložen ve vyrovnávací paměti a je dostupný offline", + "random":"Tento motiv zobrazuje náhodný obrázek pří každém načtení stránky", "random_daily":"Motiv zobrazuje každý den náhodný obrázek", - "sunrise_sunset":"Motiv zobrazuje náhodný obrázek dle aktuálního času", - "feed":"Toto téma zobrazí obrázek z externího kanálu dle denního výběru", + "sunrise_sunset":"Tento motiv zobrazuje náhodný obrázek dle aktuálního času", + "feed":"Tento motiv zobrazí obrázek z externího kanálu dle denního výběru", "delete_confirm":"Jste si opravdu jisti, že chcete vymazat toto téma?\nTato akce je nevratná; celé téma bude navždy ztraceno.", - "delete_error":"Došlo k chybě při pokusu odstranit téma. Opakujte akci později.", + "delete_error":"Došlo k chybě při pokusu odstranit motiv. Prosím opakujte akci později.", "feed_fetching":"Počkejte prosím, stahuji kanál...", "feed_error":"Při pokusu o načtení informačního kanálu došlo k chybě. Opakujte prosím akci později.", "caching":"Čekejte prosím, stahuji motiv...", "cache_status":"%s z %s obrázků uložených v mezipaměti", - "cache_error":"Došlo k chybě při pokusu načíst téma do mezipaměti. Prosím opakujte akci později", + "cache_error":"Došlo k chybě při pokusu načíst motiv do mezipaměti. Prosím opakujte akci později", "edit":{ "title":"Upravit motiv", "create_title":"Vytvořit motiv", "name":"Název motivu", "default_name":"Nový motiv", "name_placeholder":"Zadejte název motivu", - "image":"Adresa URL obrázku", + "image":"URL adresa obrázku", "image_placeholder":"Zadejte URL obrázku pozadí", "image_help":"Nahrané obrázky <b>nelze synchronizovat<\/b> mezi počítači.<br \/><br \/>Pokud je to pro vás důležité, prosím nahrajte obrázek na webovou službu jako například <a href=\"http:\/\/imgur.com\/\" target=\"_blank\">imgur<\/a>. Poté zkopírujte a vložte URL adresu s příponou (tj. jpg) a vložte ji do pole vlevo.", "color":"Základní barva", @@ -231,19 +233,19 @@ "position":"Pozice", "position_options":{ "center":"Uprostřed", - "top_left":"Nahoře, vlevo", - "top_center":"Nahoře, uprostřed", - "top_right":"Nahoře, vpravo", - "bottom_left":"Dole, vlevo", - "bottom_center":"Dole, uprostřed", - "bottom_right":"Dole, vpravo" + "top_left":"Vlevo nahoře", + "top_center":"Uprostřed nahoře", + "top_right":"Vpravo nahoře", + "bottom_left":"Vlevo dole", + "bottom_center":"Uprostřed dole", + "bottom_right":"Vpravo dole" }, "scaling":"Velikost", "scaling_options":{ - "auto":"Automatická", + "auto":"Automatická detekce", "width":"Plná šířka", "height":"Plná výška", - "none":"Pevná (náhled může být nepřesný)" + "none":"Bez zoomování (náhled může být nepřesný)" }, "repeat":"Opakování obrázku", "repeat_options":{ diff --git a/app/js/i18n/locales/cs/widgets.json b/app/js/i18n/locales/cs/widgets.json index 32604316..1501fd22 100644 --- a/app/js/i18n/locales/cs/widgets.json +++ b/app/js/i18n/locales/cs/widgets.json @@ -1,26 +1,26 @@ { "lang_code":"cs-widgets", "analytics":{ - "name":"Analytika", + "name":"Analytics", "desc":"Zobrazit různé metriky z profilu Google Analytics.", "sessions":"zasedání", "pageviews":"Zobrazení stránek", - "pagesvisit":"Stránky \/ návštěva", + "pagesvisit":"Stránky \/ zobrazení", "bouncerate":"Bounce Rate", "completions":"Dokončené", - "noprofile":"Nevypadá to, že jste vybrali profil! <br \/><br \/> Vyberte jeden přes ikonu klíče v pravém horním rohu.", + "noprofile":"Vypadá to, že jste ještě nevybrali profil! <br \/><br \/> Vyberte jeden přes ikonu klíče v pravém horním rohu.", "settings":{ "profile":"Profil" } }, "apps":{ "name":"Aplikace", - "desc":"Zobrazit Google Chrome aplikace aktuálně nainstalované.", + "desc":"Zobrazit aktuálně nainstalované Google Chrome aplikace.", "settings":{ - "format":"Widget formát ", + "format":"Formát widgetu", "format_options":{ "tiles":"Dlaždice", - "list":"seznam" + "list":"Seznam" }, "display":"Zobrazit", "display_options":{ @@ -34,7 +34,7 @@ "offline":"Použitelné offline", "available":"Dostupnost" }, - "open":"Otevřené aplikace v" + "open":"Otevírat aplikace v" }, "store_app":"Obchod" }, @@ -48,7 +48,7 @@ "single":"Jeden sloupec", "double":"Dva sloupce" }, - "open":"Otevři záložky v" + "open":"Otevřít záložky v" }, "edit":{ "dialog_title":"Upravit záložku", @@ -56,7 +56,7 @@ "title_placeholder":"Google", "url":"URL záložky", "url_placeholder":"http:\/\/www.google.com\/", - "save":"Ulož" + "save":"Uložit" }, "new_caption":"Nový", "new_bookmark":"Záložka", @@ -65,10 +65,10 @@ }, "chrome_bookmarks":{ "name":"Záložky", - "desc":"Displays your Chrome bookmarks, optionally from a specific folder.", + "desc":"Zobrazí Vaše záložky z Chrome, volitelně z určité složky.", "settings":{ "title_placeholder":"Zadejte název widgetu", - "from":"Show bookmarks from", + "from":"Zobrazit záložky z", "open":"Otevři záložky v" } }, @@ -85,18 +85,18 @@ "settings":{ "calendar":"Kalendář", "events":"Zobrazené události", - "show":"Show events from", + "show":"Zobrazit události z", "show_options":{ - "all":"All time", - "today":"Today only" + "all":"Kdykoli", + "today":"Pouze dnes" } }, "title":"Můj kalendář", "noevents":"Nevypadá to, že existují nějaké události v blízké budoucnosti. <br \/><br \/> Vyberte kalendář přes ikonu klíče v pravém horním rohu." }, "clock":{ - "name":"Datum & čas", - "desc":"Zobrazuje aktuální datum a čas. Volitelně pro jiné časové pásmo.", + "name":"Hodiny", + "desc":"Offers alarm, time, timer, and stopwatch functionality.", "settings":{ "timezone":"Časové pásmo", "timezone_local":"Místní", @@ -107,9 +107,18 @@ "analog":"12 hodinové - analogové", "ampmseconds":"DOP\/ODP - Digitální, bez sekund", "24hourseconds":"24 hodin - - Digitální, bez sekund" - } + }, + "sound":"Alert Sound" }, - "title":"Hodiny" + "title":"Hodiny", + "alarm":"Alarm", + "clock":"Hodiny", + "timer":"Timer", + "stopwatch":"Stopwatch", + "set":"Set", + "unset":"Unset", + "dismiss":"Dismiss", + "enable_audio":"Enable audio" }, "currency":{ "name":"Měna", @@ -174,7 +183,7 @@ "desc":"Zobrazí webovou stránku dle vašeho výběru v rámci objektu iframe.", "settings":{ "url":"URL rámečku", - "url_placeholder":"tj. http:\/\/www.google.com\/", + "url_placeholder":"např. http:\/\/www.google.com\/", "height":"Výška rámečku", "padding":"Odsazení" } @@ -229,7 +238,7 @@ } }, "now":{ - "name":"Google nyní", + "name":"Google Now", "desc":"Zobrazí karty z Google Now včetně letového provozu a sledování zásilek.", "authorize":"Budete muset dát iChrome oprávnění k zobrazení karet Google Now dříve, než se tady něco objeví.", "authorize_btn":"Povolit", @@ -237,12 +246,12 @@ "no_title":"Bez názvu" }, "plus":{ - "name":"Google +", + "name":"Google+", "desc":"Vloží Google Plus widget" }, "notifications":{ - "name":"Google Notifications", - "desc":"Displays your Google Notifications from services such as Google+" + "name":"upozornění Google", + "desc":"Zobrazuje Vaše upozornění Google ze služeb jako Google+" }, "recentlyclosed":{ "name":"Nedávno zavřené", @@ -348,26 +357,26 @@ "important":"Důležité" }, "tasks":{ - "name":"Tasks", - "desc":"Displays an editable list of tasks from one of your Google Tasks lists.", - "title":"Tasks", + "name":"Úkoly", + "desc":"Zobrazuje upravitelný list úkolů z jednoho Vašeho listu Google Tasks.", + "title":"Úkoly", "settings":{ "list":"seznam" }, - "task_title":"Title", - "due_date":"Due date", + "task_title":"Nadpis", + "due_date":"Datum konce", "notes":"Poznámky", "add":"Přidat položku", - "delete_task":"Delete Task", - "move_up":"Move Up", - "move_down":"Move Down", - "done":"Done", - "due_today":"Due today", - "overdue":"Overdue", - "authorize":"You'll need to select a list from your Google Tasks via the settings before anything can be displayed here." + "delete_task":"Odstranit úkol", + "move_up":"Posunout nahoru", + "move_down":"Posunout dolu", + "done":"Hotovo", + "due_today":"Končící dnes", + "overdue":"Po konci", + "authorize":"Před tím, než zde může být cokoliv zobrazeno, v nastavení musíte vybrat list z Vašeho Google Tasks." }, "topsites":{ - "name":"Weby na nejvyšší úrovni", + "name":"Oblíbené weby", "desc":"Zobrazí vaše nejnavštěvovanější stránky.", "settings":{ "show":"Počet zobrazovaných stránek", @@ -480,25 +489,72 @@ "num_views":"zhlédnutí" }, "quotes":{ - "name":"Quotes", - "desc":"Displays a quote picked either every time you load the page or once daily.", + "name":"Nabídky", + "desc":"Zobrazí nabídku buď při každém načtení stránky, nebo jednou denně.", "settings":{ - "source":"Source", - "method":"Load new quotes", + "source":"Zdroj", + "method":"Nahrát nové nabídky", "method_options":{ - "daily":"Once daily", - "random":"Every time I load the page" + "daily":"Jednou za den", + "random":"Pokaždé, když načtu stránku" } }, "unknown_author":"Neznámý" }, "html":{ "name":"HTML", - "desc":"Displays completely custom HTML in an iframe.", + "desc":"Zobrazuje Váš HTML kód v iFramu.", "settings":{ "html":"HTML", "js":"JavaScript", "height":"Výška widgetu" } + }, + "sitelink":{ + "name":"Site Link", + "desc":"Displays a link, optionally with a title and thumbnail", + "settings":{ + "link":"Link URL", + "link_placeholder":"http:\/\/www.google.com\/", + "image":"URL adresa obrázku", + "image_placeholder":"http:\/\/www.example.com\/image.png", + "color":"Image Background Color", + "style":"Image Style", + "style_fill":"Fill", + "style_center":"Uprostřed" + } + }, + "stats":{ + "name":"System Statistics", + "desc":"Keep an eye on your system with realtime statistics", + "memory":"Memory", + "battery":"Battery", + "usage":"usage", + "in_use":"in use", + "remaining":"remaining", + "charged":"Fully Charged", + "idle":"Idle", + "charging":"Charging", + "discharging":"Discharging" + }, + "search":{ + "name":"Hledat", + "desc":"Embed a search box in your page for easy access", + "settings":{ + "placeholder":"Search Field Placeholder", + "search_url":"Hledat URL", + "param":"Query Parameter", + "param_placeholder":"The parameter where the query goes, i.e. \"q\"" + }, + "default_placeholder":"Search Google" + }, + "classroom":{ + "name":"Classroom", + "desc":"Keep up to date with your Google Classroom assignments and classes", + "settings":{ + "mode":"Widget Mode", + "mode_teacher":"Teacher", + "mode_student":"Student" + } } } \ No newline at end of file diff --git a/app/js/i18n/locales/da/main.json b/app/js/i18n/locales/da/main.json index ad8c3e01..f54cf283 100644 --- a/app/js/i18n/locales/da/main.json +++ b/app/js/i18n/locales/da/main.json @@ -145,7 +145,9 @@ "css":"Custom CSS", "css_desc":"You can use this field to customize almost any visual part of iChrome using CSS (for a definition please see the <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/CSS\" target=\"_blank\">MDN<\/a>).<br \/><br \/>Since this will be synced, you can only enter a maximum of 1000 characters, including whitespace.", "reset":"Reset iChrome", - "reset_confirm":"Are you really sure you want to reset iChrome?\r\nThis will erase all local and synced data, there is no backup and no way to undo this. You will lose your ENTIRE current configuration on all computers signed into this Google account." + "reset_confirm":"Are you really sure you want to reset iChrome?\r\nThis will erase all local and synced data, there is no backup and no way to undo this. You will lose your ENTIRE current configuration on all computers signed into this Google account.", + "debug":"Debug Tools", + "debug_confirm":"WARNING: These tools can erase your configuration in a single click, only use them if your developer instructs you to.\r\nAre you sure you want to continue?" } }, "store":{ diff --git a/app/js/i18n/locales/da/widgets.json b/app/js/i18n/locales/da/widgets.json index 9f2b6b68..e92a3e7b 100644 --- a/app/js/i18n/locales/da/widgets.json +++ b/app/js/i18n/locales/da/widgets.json @@ -95,8 +95,8 @@ "noevents":"It doesn't look like there are any events in the near future.\n<br \/><br \/>\nTry selecting a calendar via the wrench icon in the top right." }, "clock":{ - "name":"Time & Date", - "desc":"Shows the current date and time. Optionally for a different timezone.", + "name":"Clock", + "desc":"Offers alarm, time, timer, and stopwatch functionality.", "settings":{ "timezone":"Time Zone", "timezone_local":"Local", @@ -107,9 +107,18 @@ "analog":"12 Hour - Analog", "ampmseconds":"AM\/PM - Digital, No Seconds", "24hourseconds":"24 Hour - Digital, No Seconds" - } + }, + "sound":"Alert Sound" }, - "title":"Clock" + "title":"Clock", + "alarm":"Alarm", + "clock":"Clock", + "timer":"Timer", + "stopwatch":"Stopwatch", + "set":"Set", + "unset":"Unset", + "dismiss":"Dismiss", + "enable_audio":"Enable audio" }, "currency":{ "name":"Currency", @@ -500,5 +509,52 @@ "js":"JavaScript", "height":"Widget Height" } + }, + "sitelink":{ + "name":"Site Link", + "desc":"Displays a link, optionally with a title and thumbnail", + "settings":{ + "link":"Link URL", + "link_placeholder":"http:\/\/www.google.com\/", + "image":"Image URL", + "image_placeholder":"http:\/\/www.example.com\/image.png", + "color":"Image Background Color", + "style":"Image Style", + "style_fill":"Fill", + "style_center":"Center" + } + }, + "stats":{ + "name":"System Statistics", + "desc":"Keep an eye on your system with realtime statistics", + "memory":"Memory", + "battery":"Battery", + "usage":"usage", + "in_use":"in use", + "remaining":"remaining", + "charged":"Fully Charged", + "idle":"Idle", + "charging":"Charging", + "discharging":"Discharging" + }, + "search":{ + "name":"Search", + "desc":"Embed a search box in your page for easy access", + "settings":{ + "placeholder":"Search Field Placeholder", + "search_url":"Search URL", + "param":"Query Parameter", + "param_placeholder":"The parameter where the query goes, i.e. \"q\"" + }, + "default_placeholder":"Search Google" + }, + "classroom":{ + "name":"Classroom", + "desc":"Keep up to date with your Google Classroom assignments and classes", + "settings":{ + "mode":"Widget Mode", + "mode_teacher":"Teacher", + "mode_student":"Student" + } } } \ No newline at end of file diff --git a/app/js/i18n/locales/de/main.json b/app/js/i18n/locales/de/main.json index 359baa81..a033b96b 100644 --- a/app/js/i18n/locales/de/main.json +++ b/app/js/i18n/locales/de/main.json @@ -145,7 +145,9 @@ "css":"Benutzerdefiniertes CSS", "css_desc":"In diesem Feld kann fast jeder sichtbare Teil von iChrome mittels CSS angepasst werden (für eine Beschreibung bitte die <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/CSS\" target=\"_blank\"> MDN<\/a> beachten). <br \/> <br \/> Da dies synchronisiert wird, können nur maximal 1000 Zeichen, einschließlich Leerzeichen, eingegeben werden.", "reset":"IChrome zurücksetzen", - "reset_confirm":"Bist du wirklich, wirklich sicher, dass Du iChrome zurücksetzen willst? Damit werden alle lokalen und synchronisierten Daten überschrieben, es gibt keine Sicherung und keine Möglichkeit dies rückgängig zu machen. Sie verlieren Ihre gesamte aktuelle Konfiguration auf allen Computern, die mit diesem Google-Konto angemeldet sind." + "reset_confirm":"Bist du wirklich, wirklich sicher, dass Du iChrome zurücksetzen willst? Damit werden alle lokalen und synchronisierten Daten überschrieben, es gibt keine Sicherung und keine Möglichkeit dies rückgängig zu machen. Sie verlieren Ihre gesamte aktuelle Konfiguration auf allen Computern, die mit diesem Google-Konto angemeldet sind.", + "debug":"Debug Tools", + "debug_confirm":"WARNING: These tools can erase your configuration in a single click, only use them if your developer instructs you to.\r\nAre you sure you want to continue?" } }, "store":{ diff --git a/app/js/i18n/locales/de/widgets.json b/app/js/i18n/locales/de/widgets.json index ba83850d..6163a6f2 100644 --- a/app/js/i18n/locales/de/widgets.json +++ b/app/js/i18n/locales/de/widgets.json @@ -95,8 +95,8 @@ "noevents":"Es gibt keine Ereignisse in naher Zukunft.<br \/><br \/>Versuche einen Kalender über das Schraubenschlüssel-Symbol oben rechts auszuwählen." }, "clock":{ - "name":"Datum & Zeit", - "desc":"Zeigt das aktuelle Datum und die Uhrzeit. Wahlweise für eine andere Zeitzone.", + "name":"Uhr", + "desc":"Offers alarm, time, timer, and stopwatch functionality.", "settings":{ "timezone":"Zeitzone", "timezone_local":"lokal", @@ -107,9 +107,18 @@ "analog":"12-Stunden - Analog", "ampmseconds":"AM\/PM - Digital, keine Sekunden", "24hourseconds":"24-Stunden - Digital, keine Sekunden" - } + }, + "sound":"Alert Sound" }, - "title":"Uhr" + "title":"Uhr", + "alarm":"Alarm", + "clock":"Uhr", + "timer":"Timer", + "stopwatch":"Stopwatch", + "set":"Set", + "unset":"Unset", + "dismiss":"Dismiss", + "enable_audio":"Enable audio" }, "currency":{ "name":"Währung", @@ -500,5 +509,52 @@ "js":"JavaScript", "height":"Widget Höhe" } + }, + "sitelink":{ + "name":"Site Link", + "desc":"Displays a link, optionally with a title and thumbnail", + "settings":{ + "link":"Link URL", + "link_placeholder":"http:\/\/www.google.com\/", + "image":"Bild-URL", + "image_placeholder":"http:\/\/www.example.com\/image.png", + "color":"Image Background Color", + "style":"Image Style", + "style_fill":"Fill", + "style_center":"Mitte" + } + }, + "stats":{ + "name":"System Statistics", + "desc":"Keep an eye on your system with realtime statistics", + "memory":"Memory", + "battery":"Battery", + "usage":"usage", + "in_use":"in use", + "remaining":"remaining", + "charged":"Fully Charged", + "idle":"Idle", + "charging":"Charging", + "discharging":"Discharging" + }, + "search":{ + "name":"Suche", + "desc":"Embed a search box in your page for easy access", + "settings":{ + "placeholder":"Search Field Placeholder", + "search_url":"Such URL", + "param":"Query Parameter", + "param_placeholder":"The parameter where the query goes, i.e. \"q\"" + }, + "default_placeholder":"Search Google" + }, + "classroom":{ + "name":"Classroom", + "desc":"Keep up to date with your Google Classroom assignments and classes", + "settings":{ + "mode":"Widget Mode", + "mode_teacher":"Teacher", + "mode_student":"Student" + } } } \ No newline at end of file diff --git a/app/js/i18n/locales/es-ES/main.json b/app/js/i18n/locales/es-ES/main.json index 2fe9c9ca..0a41b8ab 100644 --- a/app/js/i18n/locales/es-ES/main.json +++ b/app/js/i18n/locales/es-ES/main.json @@ -145,7 +145,9 @@ "css":"CSS personalizado", "css_desc":"Puede utilizar este campo para personalizar casi cualquier elemento visual de iChrome usando CSS (para una definición, por favor vea el <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/CSS\" target=\"_blank\"> MDN<\/a>). <br \/><br \/> puesto que esto se sincronizarán, sólo puede ingresar un máximo de 1000 caracteres, incluyendo espacios en blanco.", "reset":"Resetear iChrome", - "reset_confirm":"¿Estás seguro de que desea restablecer iChrome? Esto borrará todos los datos locales y sincronizados, no hay ninguna copia de seguridad y no hay forma de deshacer esto. Perderá la configuración actual de todo en todos los equipos firmada en esta cuenta de Google." + "reset_confirm":"¿Estás seguro de que desea restablecer iChrome? Esto borrará todos los datos locales y sincronizados, no hay ninguna copia de seguridad y no hay forma de deshacer esto. Perderá la configuración actual de todo en todos los equipos firmada en esta cuenta de Google.", + "debug":"Debug Tools", + "debug_confirm":"WARNING: These tools can erase your configuration in a single click, only use them if your developer instructs you to.\r\nAre you sure you want to continue?" } }, "store":{ diff --git a/app/js/i18n/locales/es-ES/widgets.json b/app/js/i18n/locales/es-ES/widgets.json index a1859cdd..251125fd 100644 --- a/app/js/i18n/locales/es-ES/widgets.json +++ b/app/js/i18n/locales/es-ES/widgets.json @@ -95,8 +95,8 @@ "noevents":"No parece que hay algún evento en el futuro cercano. \n<br \/><br \/>\npruebe a seleccionar un calendario mediante el icono de llave inglesa en la parte superior derecha." }, "clock":{ - "name":"Fecha & Hora", - "desc":"Muestra la fecha y hora actuales. Opcionalmente para una zona horaria diferente.", + "name":"Reloj", + "desc":"Offers alarm, time, timer, and stopwatch functionality.", "settings":{ "timezone":"Zona horaria", "timezone_local":"Local", @@ -107,9 +107,18 @@ "analog":"12 horas - analógico", "ampmseconds":"AM\/PM - Digital, No segundos", "24hourseconds":"24 horas - Digital, No segundos" - } + }, + "sound":"Alert Sound" }, - "title":"Reloj" + "title":"Reloj", + "alarm":"Alarm", + "clock":"Reloj", + "timer":"Timer", + "stopwatch":"Stopwatch", + "set":"Set", + "unset":"Unset", + "dismiss":"Dismiss", + "enable_audio":"Enable audio" }, "currency":{ "name":"Monedas", @@ -500,5 +509,52 @@ "js":"JavaScript", "height":"Altura de Widget" } + }, + "sitelink":{ + "name":"Site Link", + "desc":"Displays a link, optionally with a title and thumbnail", + "settings":{ + "link":"Link URL", + "link_placeholder":"http:\/\/www.google.com\/", + "image":"URL de la imagen", + "image_placeholder":"http:\/\/www.example.com\/image.png", + "color":"Image Background Color", + "style":"Image Style", + "style_fill":"Fill", + "style_center":"Centro" + } + }, + "stats":{ + "name":"System Statistics", + "desc":"Keep an eye on your system with realtime statistics", + "memory":"Memory", + "battery":"Battery", + "usage":"usage", + "in_use":"in use", + "remaining":"remaining", + "charged":"Fully Charged", + "idle":"Idle", + "charging":"Charging", + "discharging":"Discharging" + }, + "search":{ + "name":"Buscar", + "desc":"Embed a search box in your page for easy access", + "settings":{ + "placeholder":"Search Field Placeholder", + "search_url":"URL de búsqueda", + "param":"Query Parameter", + "param_placeholder":"The parameter where the query goes, i.e. \"q\"" + }, + "default_placeholder":"Search Google" + }, + "classroom":{ + "name":"Classroom", + "desc":"Keep up to date with your Google Classroom assignments and classes", + "settings":{ + "mode":"Widget Mode", + "mode_teacher":"Teacher", + "mode_student":"Student" + } } } \ No newline at end of file diff --git a/app/js/i18n/locales/fr/main.json b/app/js/i18n/locales/fr/main.json index 6ef85714..0bf0128f 100644 --- a/app/js/i18n/locales/fr/main.json +++ b/app/js/i18n/locales/fr/main.json @@ -145,7 +145,9 @@ "css":"CSS personnalisé", "css_desc":"Vous pouvez utiliser ceci pour personnaliser tout les aspects visuels de iChrome en utilisant du CSS (Pour plus d'informations sur le CSS, veuillez cliquer sur ce lien : <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/CSS\" target=\"_blank\">MDN<\/a>). <br \/><br \/> Puis-ce que le CSS sera synchronisé vous pouvez seulement entrer 1000 caractères, incluant les espaces vides.", "reset":"Configuration par défaut d'iChrome", - "reset_confirm":"Etes vous vraiment sur de vouloir remettre la configuration d'iChrome par défaut ? \nCeci va supprimer toutes les données locales et synchronisés, il n'y a pas de sauvegarde possible et aucun moyen d'annuler ceci. Vous allez perdre la configuration sur tout les ordinateurs qui sont actuellement synchronisés sur votre compte Google." + "reset_confirm":"Etes vous vraiment sur de vouloir remettre la configuration d'iChrome par défaut ? \nCeci va supprimer toutes les données locales et synchronisés, il n'y a pas de sauvegarde possible et aucun moyen d'annuler ceci. Vous allez perdre la configuration sur tout les ordinateurs qui sont actuellement synchronisés sur votre compte Google.", + "debug":"Debug Tools", + "debug_confirm":"WARNING: These tools can erase your configuration in a single click, only use them if your developer instructs you to.\r\nAre you sure you want to continue?" } }, "store":{ diff --git a/app/js/i18n/locales/fr/widgets.json b/app/js/i18n/locales/fr/widgets.json index 6c46a0b1..cc828e4f 100644 --- a/app/js/i18n/locales/fr/widgets.json +++ b/app/js/i18n/locales/fr/widgets.json @@ -95,8 +95,8 @@ "noevents":"Il ne semble pas y avoir d’événements à venir. <br\/> <br\/> Essayez de sélectionner un agenda en cliquant sur la clé en haut à droite." }, "clock":{ - "name":"Date & Heure", - "desc":"Affiche la date et l'heure. Optionnellement dans un différent fuseau horaire.", + "name":"Horloge", + "desc":"Offers alarm, time, timer, and stopwatch functionality.", "settings":{ "timezone":"Fuseau horaire", "timezone_local":"Mon appareil", @@ -107,9 +107,18 @@ "analog":"12 Heures - Analogique", "ampmseconds":"AM\/PM - Digitale, Sans Secondes", "24hourseconds":"24 Heures - Digitale, Sans Secondes" - } + }, + "sound":"Alert Sound" }, - "title":"Horloge" + "title":"Horloge", + "alarm":"Alarm", + "clock":"Horloge", + "timer":"Timer", + "stopwatch":"Stopwatch", + "set":"Set", + "unset":"Unset", + "dismiss":"Dismiss", + "enable_audio":"Enable audio" }, "currency":{ "name":"Devise ", @@ -241,8 +250,8 @@ "desc":"Intègre Google Plus dans un widget" }, "notifications":{ - "name":"Google Notifications", - "desc":"Displays your Google Notifications from services such as Google+" + "name":"Notifications Google", + "desc":"Affiche vos notifications Google à partir de services tel que Google+" }, "recentlyclosed":{ "name":"Récemment fermés", @@ -285,7 +294,7 @@ "link_placeholder":"Entrez un lien pour le nom du widget", "url":"URL du flux", "url_placeholder":"L'URL du flux RSS à afficher", - "articles":"Affiché les articles", + "articles":"Articles affichés", "view":"Voir", "view_options":{ "images":"Compatible avec images", @@ -297,7 +306,7 @@ "feed_error":"Une erreur s'est produite en essayant d'aller chercher de le flux à: %s. S'il vous plaît vérifier l'URL et\/ou modifier les paramètres du widget." }, "sports":{ - "name":"Sport", + "name":"Sports", "desc":"Afficher les informations des scores et games pour la ligue\/équipe choisis.", "settings":{ "league":"Ligue", @@ -352,12 +361,12 @@ "desc":"Affiche une liste modifiable de tâches à partir d'un de vos listes de Google Tasks.", "title":"tâches", "settings":{ - "list":"Listes" + "list":"Liste" }, "task_title":"Titre", "due_date":"date d'échéance", "notes":"Notes", - "add":"Ajouter une note", + "add":"Ajouter un élément", "delete_task":"effacez la tâche", "move_up":"déplacer vers le haut", "move_down":"descendre", @@ -498,7 +507,54 @@ "settings":{ "html":"HTML", "js":"JavaScript", - "height":"Hauteur du widget" + "height":"Hauteur du Widget" + } + }, + "sitelink":{ + "name":"Site Link", + "desc":"Displays a link, optionally with a title and thumbnail", + "settings":{ + "link":"Link URL", + "link_placeholder":"http:\/\/www.google.com\/", + "image":"URL de l'image", + "image_placeholder":"http:\/\/www.example.com\/image.png", + "color":"Image Background Color", + "style":"Image Style", + "style_fill":"Fill", + "style_center":"Centre" + } + }, + "stats":{ + "name":"System Statistics", + "desc":"Keep an eye on your system with realtime statistics", + "memory":"Memory", + "battery":"Battery", + "usage":"usage", + "in_use":"in use", + "remaining":"remaining", + "charged":"Fully Charged", + "idle":"Idle", + "charging":"Charging", + "discharging":"Discharging" + }, + "search":{ + "name":"Rechercher", + "desc":"Embed a search box in your page for easy access", + "settings":{ + "placeholder":"Search Field Placeholder", + "search_url":"URL de recherche", + "param":"Query Parameter", + "param_placeholder":"The parameter where the query goes, i.e. \"q\"" + }, + "default_placeholder":"Search Google" + }, + "classroom":{ + "name":"Classroom", + "desc":"Keep up to date with your Google Classroom assignments and classes", + "settings":{ + "mode":"Widget Mode", + "mode_teacher":"Teacher", + "mode_student":"Student" } } } \ No newline at end of file diff --git a/app/js/i18n/locales/hi/main.json b/app/js/i18n/locales/hi/main.json index 8cbaf6f8..ee45566f 100644 --- a/app/js/i18n/locales/hi/main.json +++ b/app/js/i18n/locales/hi/main.json @@ -145,7 +145,9 @@ "css":"Custom CSS", "css_desc":"You can use this field to customize almost any visual part of iChrome using CSS (for a definition please see the <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/CSS\" target=\"_blank\">MDN<\/a>).<br \/><br \/>Since this will be synced, you can only enter a maximum of 1000 characters, including whitespace.", "reset":"IChrome रीसेट करें", - "reset_confirm":"Are you really sure you want to reset iChrome?\r\nThis will erase all local and synced data, there is no backup and no way to undo this. You will lose your ENTIRE current configuration on all computers signed into this Google account." + "reset_confirm":"Are you really sure you want to reset iChrome?\r\nThis will erase all local and synced data, there is no backup and no way to undo this. You will lose your ENTIRE current configuration on all computers signed into this Google account.", + "debug":"Debug Tools", + "debug_confirm":"WARNING: These tools can erase your configuration in a single click, only use them if your developer instructs you to.\r\nAre you sure you want to continue?" } }, "store":{ diff --git a/app/js/i18n/locales/hi/widgets.json b/app/js/i18n/locales/hi/widgets.json index 497e2735..cb31fc9d 100644 --- a/app/js/i18n/locales/hi/widgets.json +++ b/app/js/i18n/locales/hi/widgets.json @@ -95,8 +95,8 @@ "noevents":"It doesn't look like there are any events in the near future.\n<br \/><br \/>\nTry selecting a calendar via the wrench icon in the top right." }, "clock":{ - "name":"Time & Date", - "desc":"Shows the current date and time. Optionally for a different timezone.", + "name":"Clock", + "desc":"Offers alarm, time, timer, and stopwatch functionality.", "settings":{ "timezone":"Time Zone", "timezone_local":"Local", @@ -107,9 +107,18 @@ "analog":"12 Hour - Analog", "ampmseconds":"AM\/PM - Digital, No Seconds", "24hourseconds":"24 Hour - Digital, No Seconds" - } + }, + "sound":"Alert Sound" }, - "title":"Clock" + "title":"Clock", + "alarm":"Alarm", + "clock":"Clock", + "timer":"Timer", + "stopwatch":"Stopwatch", + "set":"Set", + "unset":"Unset", + "dismiss":"Dismiss", + "enable_audio":"Enable audio" }, "currency":{ "name":"Currency", @@ -500,5 +509,52 @@ "js":"JavaScript", "height":"Widget Height" } + }, + "sitelink":{ + "name":"Site Link", + "desc":"Displays a link, optionally with a title and thumbnail", + "settings":{ + "link":"Link URL", + "link_placeholder":"http:\/\/www.google.com\/", + "image":"छवि URL", + "image_placeholder":"http:\/\/www.example.com\/image.png", + "color":"Image Background Color", + "style":"Image Style", + "style_fill":"Fill", + "style_center":"मध्य" + } + }, + "stats":{ + "name":"System Statistics", + "desc":"Keep an eye on your system with realtime statistics", + "memory":"Memory", + "battery":"Battery", + "usage":"usage", + "in_use":"in use", + "remaining":"remaining", + "charged":"Fully Charged", + "idle":"Idle", + "charging":"Charging", + "discharging":"Discharging" + }, + "search":{ + "name":"खोज", + "desc":"Embed a search box in your page for easy access", + "settings":{ + "placeholder":"Search Field Placeholder", + "search_url":"खोजें यूआरएल", + "param":"Query Parameter", + "param_placeholder":"The parameter where the query goes, i.e. \"q\"" + }, + "default_placeholder":"Search Google" + }, + "classroom":{ + "name":"Classroom", + "desc":"Keep up to date with your Google Classroom assignments and classes", + "settings":{ + "mode":"Widget Mode", + "mode_teacher":"Teacher", + "mode_student":"Student" + } } } \ No newline at end of file diff --git a/app/js/i18n/locales/hr/main.json b/app/js/i18n/locales/hr/main.json index 41f0943a..0558a87e 100644 --- a/app/js/i18n/locales/hr/main.json +++ b/app/js/i18n/locales/hr/main.json @@ -145,7 +145,9 @@ "css":"Custom CSS", "css_desc":"You can use this field to customize almost any visual part of iChrome using CSS (for a definition please see the <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/CSS\" target=\"_blank\">MDN<\/a>).<br \/><br \/>Since this will be synced, you can only enter a maximum of 1000 characters, including whitespace.", "reset":"Reset iChrome", - "reset_confirm":"Are you really sure you want to reset iChrome?\r\nThis will erase all local and synced data, there is no backup and no way to undo this. You will lose your ENTIRE current configuration on all computers signed into this Google account." + "reset_confirm":"Are you really sure you want to reset iChrome?\r\nThis will erase all local and synced data, there is no backup and no way to undo this. You will lose your ENTIRE current configuration on all computers signed into this Google account.", + "debug":"Debug Tools", + "debug_confirm":"WARNING: These tools can erase your configuration in a single click, only use them if your developer instructs you to.\r\nAre you sure you want to continue?" } }, "store":{ diff --git a/app/js/i18n/locales/hr/widgets.json b/app/js/i18n/locales/hr/widgets.json index 625e41ad..1cc8d85a 100644 --- a/app/js/i18n/locales/hr/widgets.json +++ b/app/js/i18n/locales/hr/widgets.json @@ -95,8 +95,8 @@ "noevents":"It doesn't look like there are any events in the near future.\n<br \/><br \/>\nTry selecting a calendar via the wrench icon in the top right." }, "clock":{ - "name":"Time & Date", - "desc":"Shows the current date and time. Optionally for a different timezone.", + "name":"Clock", + "desc":"Offers alarm, time, timer, and stopwatch functionality.", "settings":{ "timezone":"Time Zone", "timezone_local":"Local", @@ -107,9 +107,18 @@ "analog":"12 Hour - Analog", "ampmseconds":"AM\/PM - Digital, No Seconds", "24hourseconds":"24 Hour - Digital, No Seconds" - } + }, + "sound":"Alert Sound" }, - "title":"Clock" + "title":"Clock", + "alarm":"Alarm", + "clock":"Clock", + "timer":"Timer", + "stopwatch":"Stopwatch", + "set":"Set", + "unset":"Unset", + "dismiss":"Dismiss", + "enable_audio":"Enable audio" }, "currency":{ "name":"Currency", @@ -500,5 +509,52 @@ "js":"JavaScript", "height":"Widget Height" } + }, + "sitelink":{ + "name":"Site Link", + "desc":"Displays a link, optionally with a title and thumbnail", + "settings":{ + "link":"Link URL", + "link_placeholder":"http:\/\/www.google.com\/", + "image":"Image URL", + "image_placeholder":"http:\/\/www.example.com\/image.png", + "color":"Image Background Color", + "style":"Image Style", + "style_fill":"Fill", + "style_center":"Center" + } + }, + "stats":{ + "name":"System Statistics", + "desc":"Keep an eye on your system with realtime statistics", + "memory":"Memory", + "battery":"Battery", + "usage":"usage", + "in_use":"in use", + "remaining":"remaining", + "charged":"Fully Charged", + "idle":"Idle", + "charging":"Charging", + "discharging":"Discharging" + }, + "search":{ + "name":"Search", + "desc":"Embed a search box in your page for easy access", + "settings":{ + "placeholder":"Search Field Placeholder", + "search_url":"Search URL", + "param":"Query Parameter", + "param_placeholder":"The parameter where the query goes, i.e. \"q\"" + }, + "default_placeholder":"Search Google" + }, + "classroom":{ + "name":"Classroom", + "desc":"Keep up to date with your Google Classroom assignments and classes", + "settings":{ + "mode":"Widget Mode", + "mode_teacher":"Teacher", + "mode_student":"Student" + } } } \ No newline at end of file diff --git a/app/js/i18n/locales/id/main.json b/app/js/i18n/locales/id/main.json index e120ea4a..93fb63fe 100644 --- a/app/js/i18n/locales/id/main.json +++ b/app/js/i18n/locales/id/main.json @@ -145,7 +145,9 @@ "css":"Custom CSS", "css_desc":"You can use this field to customize almost any visual part of iChrome using CSS (for a definition please see the <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/CSS\" target=\"_blank\">MDN<\/a>).<br \/><br \/>Since this will be synced, you can only enter a maximum of 1000 characters, including whitespace.", "reset":"Reset iChrome", - "reset_confirm":"Are you really sure you want to reset iChrome?\r\nThis will erase all local and synced data, there is no backup and no way to undo this. You will lose your ENTIRE current configuration on all computers signed into this Google account." + "reset_confirm":"Are you really sure you want to reset iChrome?\r\nThis will erase all local and synced data, there is no backup and no way to undo this. You will lose your ENTIRE current configuration on all computers signed into this Google account.", + "debug":"Debug Tools", + "debug_confirm":"WARNING: These tools can erase your configuration in a single click, only use them if your developer instructs you to.\r\nAre you sure you want to continue?" } }, "store":{ diff --git a/app/js/i18n/locales/id/widgets.json b/app/js/i18n/locales/id/widgets.json index 59cc2a11..87f6a96a 100644 --- a/app/js/i18n/locales/id/widgets.json +++ b/app/js/i18n/locales/id/widgets.json @@ -95,8 +95,8 @@ "noevents":"It doesn't look like there are any events in the near future.\n<br \/><br \/>\nTry selecting a calendar via the wrench icon in the top right." }, "clock":{ - "name":"Time & Date", - "desc":"Shows the current date and time. Optionally for a different timezone.", + "name":"Clock", + "desc":"Offers alarm, time, timer, and stopwatch functionality.", "settings":{ "timezone":"Time Zone", "timezone_local":"Local", @@ -107,9 +107,18 @@ "analog":"12 Hour - Analog", "ampmseconds":"AM\/PM - Digital, No Seconds", "24hourseconds":"24 Hour - Digital, No Seconds" - } + }, + "sound":"Alert Sound" }, - "title":"Clock" + "title":"Clock", + "alarm":"Alarm", + "clock":"Clock", + "timer":"Timer", + "stopwatch":"Stopwatch", + "set":"Set", + "unset":"Unset", + "dismiss":"Dismiss", + "enable_audio":"Enable audio" }, "currency":{ "name":"Currency", @@ -500,5 +509,52 @@ "js":"JavaScript", "height":"Widget Height" } + }, + "sitelink":{ + "name":"Site Link", + "desc":"Displays a link, optionally with a title and thumbnail", + "settings":{ + "link":"Link URL", + "link_placeholder":"http:\/\/www.google.com\/", + "image":"Image URL", + "image_placeholder":"http:\/\/www.example.com\/image.png", + "color":"Image Background Color", + "style":"Image Style", + "style_fill":"Fill", + "style_center":"Center" + } + }, + "stats":{ + "name":"System Statistics", + "desc":"Keep an eye on your system with realtime statistics", + "memory":"Memory", + "battery":"Battery", + "usage":"usage", + "in_use":"in use", + "remaining":"remaining", + "charged":"Fully Charged", + "idle":"Idle", + "charging":"Charging", + "discharging":"Discharging" + }, + "search":{ + "name":"Search", + "desc":"Embed a search box in your page for easy access", + "settings":{ + "placeholder":"Search Field Placeholder", + "search_url":"Search URL", + "param":"Query Parameter", + "param_placeholder":"The parameter where the query goes, i.e. \"q\"" + }, + "default_placeholder":"Search Google" + }, + "classroom":{ + "name":"Classroom", + "desc":"Keep up to date with your Google Classroom assignments and classes", + "settings":{ + "mode":"Widget Mode", + "mode_teacher":"Teacher", + "mode_student":"Student" + } } } \ No newline at end of file diff --git a/app/js/i18n/locales/it/main.json b/app/js/i18n/locales/it/main.json index 756992c1..ccdb7a17 100644 --- a/app/js/i18n/locales/it/main.json +++ b/app/js/i18n/locales/it/main.json @@ -145,7 +145,9 @@ "css":"CSS personalizzato", "css_desc":"Puoi usare questo campo per personalizzare praticamente la presentazione di ogni parte di iChrome usando il CSS (per una definizione dai un occhiata a <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/CSS\" target=\"_blank\">MDN<\/a>).<br \/><br \/>Dato che il campo sarà sincronizzato, ti è possibile immettere un massimo di 1000 caratteri, inclusi spazzi.", "reset":"Resetta iChrome", - "reset_confirm":"Sei assolutamente sicuro di voler resettare iChrome?\nQuesta operazione cancellerà tutti i dati sincronizzati e locali, non c'è modo di annullare questa operazione. Perderai tutta la tua configurazione corrente su tutti i computers connessi in questo profilo Google." + "reset_confirm":"Sei assolutamente sicuro di voler resettare iChrome?\nQuesta operazione cancellerà tutti i dati sincronizzati e locali, non c'è modo di annullare questa operazione. Perderai tutta la tua configurazione corrente su tutti i computers connessi in questo profilo Google.", + "debug":"Debug Tools", + "debug_confirm":"WARNING: These tools can erase your configuration in a single click, only use them if your developer instructs you to.\r\nAre you sure you want to continue?" } }, "store":{ diff --git a/app/js/i18n/locales/it/widgets.json b/app/js/i18n/locales/it/widgets.json index 774471f3..d9810765 100644 --- a/app/js/i18n/locales/it/widgets.json +++ b/app/js/i18n/locales/it/widgets.json @@ -95,8 +95,8 @@ "noevents":"Non sembra che ci sia qualche evento nel prossimo futuro.\n<br \/><br \/>\nProvare a selezionare un calendario tramite l'icona della chiave inglese in alto a destra." }, "clock":{ - "name":"Ora e data", - "desc":"Mostra la data e l'ora correnti. Facoltativamente per un fuso orario differente.", + "name":"Orologio", + "desc":"Offers alarm, time, timer, and stopwatch functionality.", "settings":{ "timezone":"Fuso orario", "timezone_local":"Locale", @@ -107,9 +107,18 @@ "analog":"12 ore - analogico", "ampmseconds":"AM\/PM - digitale, senza secondi", "24hourseconds":"24 ore - digitale, senza secondi" - } + }, + "sound":"Alert Sound" }, - "title":"Orologio" + "title":"Orologio", + "alarm":"Alarm", + "clock":"Orologio", + "timer":"Timer", + "stopwatch":"Stopwatch", + "set":"Set", + "unset":"Unset", + "dismiss":"Dismiss", + "enable_audio":"Enable audio" }, "currency":{ "name":"Valuta", @@ -500,5 +509,52 @@ "js":"JavaScript", "height":"Altezza del widget" } + }, + "sitelink":{ + "name":"Site Link", + "desc":"Displays a link, optionally with a title and thumbnail", + "settings":{ + "link":"Link URL", + "link_placeholder":"http:\/\/www.google.com\/", + "image":"URL dell'immagine", + "image_placeholder":"http:\/\/www.example.com\/image.png", + "color":"Image Background Color", + "style":"Image Style", + "style_fill":"Fill", + "style_center":"Al centro" + } + }, + "stats":{ + "name":"System Statistics", + "desc":"Keep an eye on your system with realtime statistics", + "memory":"Memory", + "battery":"Battery", + "usage":"usage", + "in_use":"in use", + "remaining":"remaining", + "charged":"Fully Charged", + "idle":"Idle", + "charging":"Charging", + "discharging":"Discharging" + }, + "search":{ + "name":"Cerca", + "desc":"Embed a search box in your page for easy access", + "settings":{ + "placeholder":"Search Field Placeholder", + "search_url":"URL di ricerca", + "param":"Query Parameter", + "param_placeholder":"The parameter where the query goes, i.e. \"q\"" + }, + "default_placeholder":"Search Google" + }, + "classroom":{ + "name":"Classroom", + "desc":"Keep up to date with your Google Classroom assignments and classes", + "settings":{ + "mode":"Widget Mode", + "mode_teacher":"Teacher", + "mode_student":"Student" + } } } \ No newline at end of file diff --git a/app/js/i18n/locales/ja/main.json b/app/js/i18n/locales/ja/main.json index e410cac7..60a12cb5 100644 --- a/app/js/i18n/locales/ja/main.json +++ b/app/js/i18n/locales/ja/main.json @@ -145,7 +145,9 @@ "css":"カスタム CSS", "css_desc":"CSS(定義については <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/CSS\" target=\"_blank\">MDN<\/a>を参照)を使ってiChromeのほとんどのビジュアル部分をカスタマイズするためにこのフィールドを使用することができます。<br \/><br \/>これは同期されるため、スペースを含み最大1,000文字まで入力できます。", "reset":"iChromeを初期化する", - "reset_confirm":"iChromeを本当にリセットしますか?\nこれによりすべての同期されたローカルデータが消え、バックアップも無ければ取り消すこともできません。このGoogleアカウントに関連付けられたすべてのコンピューターの全設定を失います。" + "reset_confirm":"iChromeを本当にリセットしますか?\nこれによりすべての同期されたローカルデータが消え、バックアップも無ければ取り消すこともできません。このGoogleアカウントに関連付けられたすべてのコンピューターの全設定を失います。", + "debug":"Debug Tools", + "debug_confirm":"WARNING: These tools can erase your configuration in a single click, only use them if your developer instructs you to.\r\nAre you sure you want to continue?" } }, "store":{ diff --git a/app/js/i18n/locales/ja/widgets.json b/app/js/i18n/locales/ja/widgets.json index 0dac27f9..8d7b6968 100644 --- a/app/js/i18n/locales/ja/widgets.json +++ b/app/js/i18n/locales/ja/widgets.json @@ -95,8 +95,8 @@ "noevents":"近日中に設定されているイベントは特にないようです。\n<br \/><br \/>\n右上の設定アイコンからカレンダーを選択してみてください。" }, "clock":{ - "name":"時間 & 日付", - "desc":"現在の日付と時刻を表示。異なるタイムゾーンのために必要に応じて設定。", + "name":"時計", + "desc":"Offers alarm, time, timer, and stopwatch functionality.", "settings":{ "timezone":"タイムゾーン", "timezone_local":"ローカル", @@ -107,9 +107,18 @@ "analog":"12時間 - アナログ", "ampmseconds":"AM\/PM - デジタル (秒表示なし)", "24hourseconds":"24 時間表示 - デジタル(秒表示なし)" - } + }, + "sound":"Alert Sound" }, - "title":"時計" + "title":"時計", + "alarm":"Alarm", + "clock":"時計", + "timer":"Timer", + "stopwatch":"Stopwatch", + "set":"Set", + "unset":"Unset", + "dismiss":"Dismiss", + "enable_audio":"Enable audio" }, "currency":{ "name":"通貨", @@ -500,5 +509,52 @@ "js":"JavaScript", "height":"ウィジェットの高さ" } + }, + "sitelink":{ + "name":"Site Link", + "desc":"Displays a link, optionally with a title and thumbnail", + "settings":{ + "link":"Link URL", + "link_placeholder":"http:\/\/www.google.com\/", + "image":"画像 URL", + "image_placeholder":"http:\/\/www.example.com\/image.png", + "color":"Image Background Color", + "style":"Image Style", + "style_fill":"Fill", + "style_center":"中央揃え" + } + }, + "stats":{ + "name":"System Statistics", + "desc":"Keep an eye on your system with realtime statistics", + "memory":"Memory", + "battery":"Battery", + "usage":"usage", + "in_use":"in use", + "remaining":"remaining", + "charged":"Fully Charged", + "idle":"Idle", + "charging":"Charging", + "discharging":"Discharging" + }, + "search":{ + "name":"検索", + "desc":"Embed a search box in your page for easy access", + "settings":{ + "placeholder":"Search Field Placeholder", + "search_url":"検索エンジンURL", + "param":"Query Parameter", + "param_placeholder":"The parameter where the query goes, i.e. \"q\"" + }, + "default_placeholder":"Search Google" + }, + "classroom":{ + "name":"Classroom", + "desc":"Keep up to date with your Google Classroom assignments and classes", + "settings":{ + "mode":"Widget Mode", + "mode_teacher":"Teacher", + "mode_student":"Student" + } } } \ No newline at end of file diff --git a/app/js/i18n/locales/nl/main.json b/app/js/i18n/locales/nl/main.json index ac4a3068..ada8c1e3 100644 --- a/app/js/i18n/locales/nl/main.json +++ b/app/js/i18n/locales/nl/main.json @@ -145,7 +145,9 @@ "css":"Aangepaste CSS", "css_desc":"U kan dit veld gebruiken voor het aanpassen van bijna elk visueel deel van iChrome met behulp van CSS (voor de definitie zie <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/CSS\" target=\"_blank\">MDN<\/a>).<br \/><br \/>Omdat dit zal worden gesynchroniseerd, kunt u maximum 1000 karakters invoeren, inclusief spaties.", "reset":"Reset iChrome", - "reset_confirm":"Weet u heel zeker dat u iChrome wil resetten?\nDit zal alle lokale en gesynchroniseerde data overschrijven, er is geen back-up en geen enkele manier om dit ongedaan te maken. U zult uw volledige huidige configuratie verliezen op alle computers die ingelogd zijn op dit Google account." + "reset_confirm":"Weet u heel zeker dat u iChrome wil resetten?\nDit zal alle lokale en gesynchroniseerde data overschrijven, er is geen back-up en geen enkele manier om dit ongedaan te maken. U zult uw volledige huidige configuratie verliezen op alle computers die ingelogd zijn op dit Google account.", + "debug":"Debug Tools", + "debug_confirm":"WARNING: These tools can erase your configuration in a single click, only use them if your developer instructs you to.\r\nAre you sure you want to continue?" } }, "store":{ diff --git a/app/js/i18n/locales/nl/widgets.json b/app/js/i18n/locales/nl/widgets.json index 49cad515..10c5107d 100644 --- a/app/js/i18n/locales/nl/widgets.json +++ b/app/js/i18n/locales/nl/widgets.json @@ -95,8 +95,8 @@ "noevents":"Het lijkt dat er geen evenementen in de nabije toekomst zijn.\n<br \/><br\/>\nProbeer een agenda te selecteren via het moersleutelpictogram in de rechterbovenhoek." }, "clock":{ - "name":"Tijd & datum", - "desc":"Geeft de huidige datum en tijd weer. Mogelijk voor een andere tijdzone.", + "name":"Klok", + "desc":"Offers alarm, time, timer, and stopwatch functionality.", "settings":{ "timezone":"Tijdzone", "timezone_local":"Lokaal", @@ -107,9 +107,18 @@ "analog":"12-uurs - Analoog", "ampmseconds":"AM\/PM - Digitaal, geen Seconden", "24hourseconds":"24-uurs - Digitaal, geen Seconden" - } + }, + "sound":"Alert Sound" }, - "title":"Klok" + "title":"Klok", + "alarm":"Alarm", + "clock":"Klok", + "timer":"Timer", + "stopwatch":"Stopwatch", + "set":"Set", + "unset":"Unset", + "dismiss":"Dismiss", + "enable_audio":"Enable audio" }, "currency":{ "name":"Munteenheid", @@ -500,5 +509,52 @@ "js":"JavaScript", "height":"Widget hoogte" } + }, + "sitelink":{ + "name":"Site Link", + "desc":"Displays a link, optionally with a title and thumbnail", + "settings":{ + "link":"Link URL", + "link_placeholder":"http:\/\/www.google.com\/", + "image":"Afbeelding-URL", + "image_placeholder":"http:\/\/www.example.com\/image.png", + "color":"Image Background Color", + "style":"Image Style", + "style_fill":"Fill", + "style_center":"Gecentreerd" + } + }, + "stats":{ + "name":"System Statistics", + "desc":"Keep an eye on your system with realtime statistics", + "memory":"Memory", + "battery":"Battery", + "usage":"usage", + "in_use":"in use", + "remaining":"remaining", + "charged":"Fully Charged", + "idle":"Idle", + "charging":"Charging", + "discharging":"Discharging" + }, + "search":{ + "name":"Zoeken", + "desc":"Embed a search box in your page for easy access", + "settings":{ + "placeholder":"Search Field Placeholder", + "search_url":"Zoek-URL", + "param":"Query Parameter", + "param_placeholder":"The parameter where the query goes, i.e. \"q\"" + }, + "default_placeholder":"Search Google" + }, + "classroom":{ + "name":"Classroom", + "desc":"Keep up to date with your Google Classroom assignments and classes", + "settings":{ + "mode":"Widget Mode", + "mode_teacher":"Teacher", + "mode_student":"Student" + } } } \ No newline at end of file diff --git a/app/js/i18n/locales/pl/main.json b/app/js/i18n/locales/pl/main.json index 11efe849..a16e6d93 100644 --- a/app/js/i18n/locales/pl/main.json +++ b/app/js/i18n/locales/pl/main.json @@ -145,7 +145,9 @@ "css":"Niestandardowy CSS", "css_desc":"Możesz użyć tego pola aby spersonalizować prawie każdą wizualną część iChrome używając CSS (dla definicji zobacz <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/CSS\" target=\"_blank\">MDN<\/a>).<br \/><br \/>Ponieważ te pole zostanie zsynchronizowane, można wprowadzić jedynie 1000 znaków, łącznie z spacją.", "reset":"Zresetuj iChrome", - "reset_confirm":"Czy naprawdę chcesz zresetować iChrome? Spowoduje to nadpisanie wszystkich lokalnych i zsynchronizowanych danych, nie ma kopii zapasowej ani możliwości by to cofnąć. Stracisz CAŁĄ aktualną konfigurację na wszystkich komputerach zalogowanych do tego samego konta Google." + "reset_confirm":"Czy naprawdę chcesz zresetować iChrome? Spowoduje to nadpisanie wszystkich lokalnych i zsynchronizowanych danych, nie ma kopii zapasowej ani możliwości by to cofnąć. Stracisz CAŁĄ aktualną konfigurację na wszystkich komputerach zalogowanych do tego samego konta Google.", + "debug":"Debug Tools", + "debug_confirm":"WARNING: These tools can erase your configuration in a single click, only use them if your developer instructs you to.\r\nAre you sure you want to continue?" } }, "store":{ diff --git a/app/js/i18n/locales/pl/widgets.json b/app/js/i18n/locales/pl/widgets.json index ebd62a45..fedbf2ad 100644 --- a/app/js/i18n/locales/pl/widgets.json +++ b/app/js/i18n/locales/pl/widgets.json @@ -95,8 +95,8 @@ "noevents":"It doesn't look like there are any events in the near future.\n<br \/><br \/>\nTry selecting a calendar via the wrench icon in the top right." }, "clock":{ - "name":"Data i czas", - "desc":"Shows the current date and time. Optionally for a different timezone.", + "name":"Zegar", + "desc":"Offers alarm, time, timer, and stopwatch functionality.", "settings":{ "timezone":"Strefa czasowa", "timezone_local":"Lokalny", @@ -107,9 +107,18 @@ "analog":"12 godzinny - analogowy", "ampmseconds":"AM\/PM - cyfrowy, bez sekund", "24hourseconds":"24 godzinny - cyfrowy, bez sekund" - } + }, + "sound":"Alert Sound" }, - "title":"Zegar" + "title":"Zegar", + "alarm":"Alarm", + "clock":"Zegar", + "timer":"Timer", + "stopwatch":"Stopwatch", + "set":"Set", + "unset":"Unset", + "dismiss":"Dismiss", + "enable_audio":"Enable audio" }, "currency":{ "name":"Currency", @@ -500,5 +509,52 @@ "js":"JavaScript", "height":"Wysokość widżetu" } + }, + "sitelink":{ + "name":"Site Link", + "desc":"Displays a link, optionally with a title and thumbnail", + "settings":{ + "link":"Link URL", + "link_placeholder":"http:\/\/www.google.com\/", + "image":"Adres URL obrazu", + "image_placeholder":"http:\/\/www.example.com\/image.png", + "color":"Image Background Color", + "style":"Image Style", + "style_fill":"Fill", + "style_center":"Środek" + } + }, + "stats":{ + "name":"System Statistics", + "desc":"Keep an eye on your system with realtime statistics", + "memory":"Memory", + "battery":"Battery", + "usage":"usage", + "in_use":"in use", + "remaining":"remaining", + "charged":"Fully Charged", + "idle":"Idle", + "charging":"Charging", + "discharging":"Discharging" + }, + "search":{ + "name":"Szukaj", + "desc":"Embed a search box in your page for easy access", + "settings":{ + "placeholder":"Search Field Placeholder", + "search_url":"Adres URL wyszukiwania", + "param":"Query Parameter", + "param_placeholder":"The parameter where the query goes, i.e. \"q\"" + }, + "default_placeholder":"Search Google" + }, + "classroom":{ + "name":"Classroom", + "desc":"Keep up to date with your Google Classroom assignments and classes", + "settings":{ + "mode":"Widget Mode", + "mode_teacher":"Teacher", + "mode_student":"Student" + } } } \ No newline at end of file diff --git a/app/js/i18n/locales/pt-PT/main.json b/app/js/i18n/locales/pt-PT/main.json index ee579aed..0e250b9d 100644 --- a/app/js/i18n/locales/pt-PT/main.json +++ b/app/js/i18n/locales/pt-PT/main.json @@ -145,7 +145,9 @@ "css":"Custom CSS", "css_desc":"Você pode usar este campo para personalizar quase qualquer parte visual iChrome usando CSS (para uma definição consulte o <a href = \"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/CSS\" target = \" _blank \"> MDN <\/a> ). <br \/> <br \/> Uma vez que este será sincronizado, você só pode inserir um máximo de 1.000 caracteres, incluindo espaços em branco.", "reset":"Reset iChrome", - "reset_confirm":"Tem a certeza que pretende repor iChrome? \nIsto irá apagar todos os dados locais e sincronizados, não há backup e não há maneira de desfazer isso. Você vai perder a sua configuração atual INTEIRA em todos os computadores assinados nesta conta Google." + "reset_confirm":"Tem a certeza que pretende repor iChrome? \nIsto irá apagar todos os dados locais e sincronizados, não há backup e não há maneira de desfazer isso. Você vai perder a sua configuração atual INTEIRA em todos os computadores assinados nesta conta Google.", + "debug":"Debug Tools", + "debug_confirm":"WARNING: These tools can erase your configuration in a single click, only use them if your developer instructs you to.\r\nAre you sure you want to continue?" } }, "store":{ diff --git a/app/js/i18n/locales/pt-PT/widgets.json b/app/js/i18n/locales/pt-PT/widgets.json index 9702a053..7d53d05c 100644 --- a/app/js/i18n/locales/pt-PT/widgets.json +++ b/app/js/i18n/locales/pt-PT/widgets.json @@ -95,8 +95,8 @@ "noevents":"Ele não se parece existem eventos em um futuro próximo. <br \/> <br \/> \nTente selecionar um calendário através do ícone de chave inglesa no canto superior direito.\n" }, "clock":{ - "name":"Data e Hora", - "desc":"Mostra a data ea hora atual. Opcionalmente para um fuso horário diferente.", + "name":"Relógio", + "desc":"Offers alarm, time, timer, and stopwatch functionality.", "settings":{ "timezone":"Fuso horário", "timezone_local":"Local", @@ -107,9 +107,18 @@ "analog":"12 horas - Analógico", "ampmseconds":"AM \/ PM - Digital, não há Segundos", "24hourseconds":"24 horas - Digital, não há Segundos" - } + }, + "sound":"Alert Sound" }, - "title":"Relógio" + "title":"Relógio", + "alarm":"Alarm", + "clock":"Relógio", + "timer":"Timer", + "stopwatch":"Stopwatch", + "set":"Set", + "unset":"Unset", + "dismiss":"Dismiss", + "enable_audio":"Enable audio" }, "currency":{ "name":"Moeda", @@ -500,5 +509,52 @@ "js":"JavaScript", "height":"Altura do widget" } + }, + "sitelink":{ + "name":"Site Link", + "desc":"Displays a link, optionally with a title and thumbnail", + "settings":{ + "link":"Link URL", + "link_placeholder":"http:\/\/www.google.com", + "image":"URL da imagem", + "image_placeholder":"http:\/\/www.example.com\/image.png", + "color":"Image Background Color", + "style":"Image Style", + "style_fill":"Fill", + "style_center":"Centro" + } + }, + "stats":{ + "name":"System Statistics", + "desc":"Keep an eye on your system with realtime statistics", + "memory":"Memory", + "battery":"Battery", + "usage":"usage", + "in_use":"in use", + "remaining":"remaining", + "charged":"Fully Charged", + "idle":"Idle", + "charging":"Charging", + "discharging":"Discharging" + }, + "search":{ + "name":"Pesquisar", + "desc":"Embed a search box in your page for easy access", + "settings":{ + "placeholder":"Search Field Placeholder", + "search_url":"Procurar por URL", + "param":"Query Parameter", + "param_placeholder":"The parameter where the query goes, i.e. \"q\"" + }, + "default_placeholder":"Search Google" + }, + "classroom":{ + "name":"Classroom", + "desc":"Keep up to date with your Google Classroom assignments and classes", + "settings":{ + "mode":"Widget Mode", + "mode_teacher":"Teacher", + "mode_student":"Student" + } } } \ No newline at end of file diff --git a/app/js/i18n/locales/ru/main.json b/app/js/i18n/locales/ru/main.json index b2be1851..49ab3485 100644 --- a/app/js/i18n/locales/ru/main.json +++ b/app/js/i18n/locales/ru/main.json @@ -145,7 +145,9 @@ "css":"Пользовательские CSS", "css_desc":"Вы можете использовать это поле для настройки почти любой визуальной части iChrome с помощью CSS (подробно о CSS вы можете почитать на <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/CSS\" target=\"_blank\">MDN<\/a>).<br \/><br \/>Поскольку эта настройка синхронизируется - максимальная длина поля ограничена 1000 символами, включая пробелы.", "reset":"Сбросить все настройки iChrome", - "reset_confirm":"Вы уверены что хотите сбросить все настройки iChrome?\nЭто действие перезапишет все локальные и синхронизируемые данные без возможности восстановления. Текущие настройки будут потеряны ПОЛНОСТЬЮ на ВСЕХ компьютерах, которые синхронизированы с этим аккаунтом Google." + "reset_confirm":"Вы уверены что хотите сбросить все настройки iChrome?\nЭто действие перезапишет все локальные и синхронизируемые данные без возможности восстановления. Текущие настройки будут потеряны ПОЛНОСТЬЮ на ВСЕХ компьютерах, которые синхронизированы с этим аккаунтом Google.", + "debug":"Debug Tools", + "debug_confirm":"WARNING: These tools can erase your configuration in a single click, only use them if your developer instructs you to.\r\nAre you sure you want to continue?" } }, "store":{ diff --git a/app/js/i18n/locales/ru/widgets.json b/app/js/i18n/locales/ru/widgets.json index 8329396d..0da37c32 100644 --- a/app/js/i18n/locales/ru/widgets.json +++ b/app/js/i18n/locales/ru/widgets.json @@ -96,7 +96,7 @@ }, "clock":{ "name":"Часы", - "desc":"Отображают дату и время. Опционально можно задать другой часовой пояс.", + "desc":"Offers alarm, time, timer, and stopwatch functionality.", "settings":{ "timezone":"Часовой пояс", "timezone_local":"Системный", @@ -107,9 +107,18 @@ "analog":"12-часовые аналоговые", "ampmseconds":"AM\/PM - цифровые, без секунд", "24hourseconds":"24-часовые цифровые, без секунд" - } + }, + "sound":"Alert Sound" }, - "title":"Часы" + "title":"Часы", + "alarm":"Alarm", + "clock":"Часы", + "timer":"Timer", + "stopwatch":"Stopwatch", + "set":"Set", + "unset":"Unset", + "dismiss":"Dismiss", + "enable_audio":"Enable audio" }, "currency":{ "name":"Валюта", @@ -500,5 +509,52 @@ "js":"JavaScript", "height":"Высота виджета" } + }, + "sitelink":{ + "name":"Site Link", + "desc":"Displays a link, optionally with a title and thumbnail", + "settings":{ + "link":"Link URL", + "link_placeholder":"http:\/\/www.google.com\/", + "image":"Адрес изображения", + "image_placeholder":"http:\/\/www.example.com\/image.png", + "color":"Image Background Color", + "style":"Image Style", + "style_fill":"Fill", + "style_center":"По центру" + } + }, + "stats":{ + "name":"System Statistics", + "desc":"Keep an eye on your system with realtime statistics", + "memory":"Memory", + "battery":"Battery", + "usage":"usage", + "in_use":"in use", + "remaining":"remaining", + "charged":"Fully Charged", + "idle":"Idle", + "charging":"Charging", + "discharging":"Discharging" + }, + "search":{ + "name":"Поиск", + "desc":"Embed a search box in your page for easy access", + "settings":{ + "placeholder":"Search Field Placeholder", + "search_url":"URL для поиска", + "param":"Query Parameter", + "param_placeholder":"The parameter where the query goes, i.e. \"q\"" + }, + "default_placeholder":"Search Google" + }, + "classroom":{ + "name":"Classroom", + "desc":"Keep up to date with your Google Classroom assignments and classes", + "settings":{ + "mode":"Widget Mode", + "mode_teacher":"Teacher", + "mode_student":"Student" + } } } \ No newline at end of file diff --git a/app/js/i18n/locales/sr/main.json b/app/js/i18n/locales/sr/main.json index 0eccef22..cf2a2575 100644 --- a/app/js/i18n/locales/sr/main.json +++ b/app/js/i18n/locales/sr/main.json @@ -145,7 +145,9 @@ "css":"Подесиви ЦСС", "css_desc":"Можеш да користиш ово поље да прилагодиш скоро сваки визуални део iChrome-а користећи ЦСС(за дефиницију молимо погледајте <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/CSS\" target=\"_blank\">MDN<\/a>).<br \/><br \/>Пошто ће ово бити синхронизовано, можеш да унесеш максимално 1000 карактера, укључујући и празан простор између знакова.", "reset":"Ресетуј iChrome", - "reset_confirm":"Да ли си стварно сигуран да желиш да ресетујеш iChrome?\nОво ће обрисати све локалне и синхронизоване податке, не постоји резервна копија нити било који други начин да поништиш ову акцију.Изгубићеш СВУ тренутну конфигурацију на свим рачунарима уписаним на овај Google рачун." + "reset_confirm":"Да ли си стварно сигуран да желиш да ресетујеш iChrome?\nОво ће обрисати све локалне и синхронизоване податке, не постоји резервна копија нити било који други начин да поништиш ову акцију.Изгубићеш СВУ тренутну конфигурацију на свим рачунарима уписаним на овај Google рачун.", + "debug":"Debug Tools", + "debug_confirm":"WARNING: These tools can erase your configuration in a single click, only use them if your developer instructs you to.\r\nAre you sure you want to continue?" } }, "store":{ diff --git a/app/js/i18n/locales/sr/widgets.json b/app/js/i18n/locales/sr/widgets.json index 4a7e9b6a..64da4ed8 100644 --- a/app/js/i18n/locales/sr/widgets.json +++ b/app/js/i18n/locales/sr/widgets.json @@ -95,8 +95,8 @@ "noevents":"Изгледа да немаш догађаје у блиској будућности.\n<br \/><br \/>\nПробај да одабереш календар уз помоћ кључа у горњем десном углу." }, "clock":{ - "name":"Време и Датум", - "desc":"Прикажи тренутни датум и време. По избору за различиту временску зону.", + "name":"Сат", + "desc":"Offers alarm, time, timer, and stopwatch functionality.", "settings":{ "timezone":"Временска зона", "timezone_local":"Локално", @@ -107,9 +107,18 @@ "analog":"12 сати - Аналогни", "ampmseconds":"Пре подне\/После подне - Дигитални, Без Секунди", "24hourseconds":"24 Часовни - Дигитални, Без Секунди" - } + }, + "sound":"Alert Sound" }, - "title":"Сат" + "title":"Сат", + "alarm":"Alarm", + "clock":"Сат", + "timer":"Timer", + "stopwatch":"Stopwatch", + "set":"Set", + "unset":"Unset", + "dismiss":"Dismiss", + "enable_audio":"Enable audio" }, "currency":{ "name":"Валута", @@ -500,5 +509,52 @@ "js":"JavaScript", "height":"Висина додатка" } + }, + "sitelink":{ + "name":"Site Link", + "desc":"Displays a link, optionally with a title and thumbnail", + "settings":{ + "link":"Link URL", + "link_placeholder":"http:\/\/www.google.com\/", + "image":"УРЛ слике", + "image_placeholder":"http:\/\/www.example.com\/image.png", + "color":"Image Background Color", + "style":"Image Style", + "style_fill":"Fill", + "style_center":"Средина" + } + }, + "stats":{ + "name":"System Statistics", + "desc":"Keep an eye on your system with realtime statistics", + "memory":"Memory", + "battery":"Battery", + "usage":"usage", + "in_use":"in use", + "remaining":"remaining", + "charged":"Fully Charged", + "idle":"Idle", + "charging":"Charging", + "discharging":"Discharging" + }, + "search":{ + "name":"Претражи", + "desc":"Embed a search box in your page for easy access", + "settings":{ + "placeholder":"Search Field Placeholder", + "search_url":"Претрага УРЛ-а", + "param":"Query Parameter", + "param_placeholder":"The parameter where the query goes, i.e. \"q\"" + }, + "default_placeholder":"Search Google" + }, + "classroom":{ + "name":"Classroom", + "desc":"Keep up to date with your Google Classroom assignments and classes", + "settings":{ + "mode":"Widget Mode", + "mode_teacher":"Teacher", + "mode_student":"Student" + } } } \ No newline at end of file diff --git a/app/js/i18n/locales/tr/main.json b/app/js/i18n/locales/tr/main.json index 041239b6..d73b7ca2 100644 --- a/app/js/i18n/locales/tr/main.json +++ b/app/js/i18n/locales/tr/main.json @@ -145,7 +145,9 @@ "css":"Özel CSS", "css_desc":"You can use this field to customize almost any visual part of iChrome using CSS (for a definition please see the <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/CSS\" target=\"_blank\">MDN<\/a>).<br \/><br \/>Since this will be synced, you can only enter a maximum of 1000 characters, including whitespace.", "reset":"iChrome'u Sıfırla", - "reset_confirm":"Are you really sure you want to reset iChrome?\r\nThis will erase all local and synced data, there is no backup and no way to undo this. You will lose your ENTIRE current configuration on all computers signed into this Google account." + "reset_confirm":"Are you really sure you want to reset iChrome?\r\nThis will erase all local and synced data, there is no backup and no way to undo this. You will lose your ENTIRE current configuration on all computers signed into this Google account.", + "debug":"Debug Tools", + "debug_confirm":"WARNING: These tools can erase your configuration in a single click, only use them if your developer instructs you to.\r\nAre you sure you want to continue?" } }, "store":{ diff --git a/app/js/i18n/locales/tr/widgets.json b/app/js/i18n/locales/tr/widgets.json index 68086d62..53e20178 100644 --- a/app/js/i18n/locales/tr/widgets.json +++ b/app/js/i18n/locales/tr/widgets.json @@ -95,8 +95,8 @@ "noevents":"Yakın bir gelecekte herhangi bir olayı var gibi görünmüyor.\n<br\/><br\/> \nSağ üstteki ingiliz anahtarı ile seçmeyi deneyin." }, "clock":{ - "name":"Saat & Tarih", - "desc":"Geçerli tarih ve saati gösterir. İsteğe bağlı olarak farklı bir zaman dilimi için kullanılabilir.", + "name":"Clock", + "desc":"Offers alarm, time, timer, and stopwatch functionality.", "settings":{ "timezone":"Saat dilimi", "timezone_local":"Yerel", @@ -107,9 +107,18 @@ "analog":"12 Hour - Analog", "ampmseconds":"AM\/PM - Digital, No Seconds", "24hourseconds":"24 Hour - Digital, No Seconds" - } + }, + "sound":"Alert Sound" }, - "title":"Clock" + "title":"Clock", + "alarm":"Alarm", + "clock":"Clock", + "timer":"Timer", + "stopwatch":"Stopwatch", + "set":"Set", + "unset":"Unset", + "dismiss":"Dismiss", + "enable_audio":"Enable audio" }, "currency":{ "name":"Currency", @@ -500,5 +509,52 @@ "js":"JavaScript", "height":"Widget yüksekliği" } + }, + "sitelink":{ + "name":"Site Link", + "desc":"Displays a link, optionally with a title and thumbnail", + "settings":{ + "link":"Link URL", + "link_placeholder":"http:\/\/www.google.com\/", + "image":"Resim URL'si", + "image_placeholder":"http:\/\/www.example.com\/image.png", + "color":"Image Background Color", + "style":"Image Style", + "style_fill":"Fill", + "style_center":"Merkez" + } + }, + "stats":{ + "name":"System Statistics", + "desc":"Keep an eye on your system with realtime statistics", + "memory":"Memory", + "battery":"Battery", + "usage":"usage", + "in_use":"in use", + "remaining":"remaining", + "charged":"Fully Charged", + "idle":"Idle", + "charging":"Charging", + "discharging":"Discharging" + }, + "search":{ + "name":"Ara", + "desc":"Embed a search box in your page for easy access", + "settings":{ + "placeholder":"Search Field Placeholder", + "search_url":"Arama URL'si", + "param":"Query Parameter", + "param_placeholder":"The parameter where the query goes, i.e. \"q\"" + }, + "default_placeholder":"Search Google" + }, + "classroom":{ + "name":"Classroom", + "desc":"Keep up to date with your Google Classroom assignments and classes", + "settings":{ + "mode":"Widget Mode", + "mode_teacher":"Teacher", + "mode_student":"Student" + } } } \ No newline at end of file diff --git a/app/js/i18n/locales/uk/main.json b/app/js/i18n/locales/uk/main.json index f83ef5a8..0ed3cdd4 100644 --- a/app/js/i18n/locales/uk/main.json +++ b/app/js/i18n/locales/uk/main.json @@ -145,7 +145,9 @@ "css":"Custom CSS", "css_desc":"You can use this field to customize almost any visual part of iChrome using CSS (for a definition please see the <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/CSS\" target=\"_blank\">MDN<\/a>).<br \/><br \/>Since this will be synced, you can only enter a maximum of 1000 characters, including whitespace.", "reset":"Reset iChrome", - "reset_confirm":"Are you really sure you want to reset iChrome?\r\nThis will erase all local and synced data, there is no backup and no way to undo this. You will lose your ENTIRE current configuration on all computers signed into this Google account." + "reset_confirm":"Are you really sure you want to reset iChrome?\r\nThis will erase all local and synced data, there is no backup and no way to undo this. You will lose your ENTIRE current configuration on all computers signed into this Google account.", + "debug":"Debug Tools", + "debug_confirm":"WARNING: These tools can erase your configuration in a single click, only use them if your developer instructs you to.\r\nAre you sure you want to continue?" } }, "store":{ diff --git a/app/js/i18n/locales/uk/widgets.json b/app/js/i18n/locales/uk/widgets.json index cb416984..ef2f5f49 100644 --- a/app/js/i18n/locales/uk/widgets.json +++ b/app/js/i18n/locales/uk/widgets.json @@ -95,8 +95,8 @@ "noevents":"It doesn't look like there are any events in the near future.\n<br \/><br \/>\nTry selecting a calendar via the wrench icon in the top right." }, "clock":{ - "name":"Time & Date", - "desc":"Shows the current date and time. Optionally for a different timezone.", + "name":"Clock", + "desc":"Offers alarm, time, timer, and stopwatch functionality.", "settings":{ "timezone":"Time Zone", "timezone_local":"Local", @@ -107,9 +107,18 @@ "analog":"12 Hour - Analog", "ampmseconds":"AM\/PM - Digital, No Seconds", "24hourseconds":"24 Hour - Digital, No Seconds" - } + }, + "sound":"Alert Sound" }, - "title":"Clock" + "title":"Clock", + "alarm":"Alarm", + "clock":"Clock", + "timer":"Timer", + "stopwatch":"Stopwatch", + "set":"Set", + "unset":"Unset", + "dismiss":"Dismiss", + "enable_audio":"Enable audio" }, "currency":{ "name":"Валюта", @@ -500,5 +509,52 @@ "js":"JavaScript", "height":"Widget Height" } + }, + "sitelink":{ + "name":"Site Link", + "desc":"Displays a link, optionally with a title and thumbnail", + "settings":{ + "link":"Link URL", + "link_placeholder":"http:\/\/www.google.com\/", + "image":"Image URL", + "image_placeholder":"http:\/\/www.example.com\/image.png", + "color":"Image Background Color", + "style":"Image Style", + "style_fill":"Fill", + "style_center":"Center" + } + }, + "stats":{ + "name":"System Statistics", + "desc":"Keep an eye on your system with realtime statistics", + "memory":"Memory", + "battery":"Battery", + "usage":"usage", + "in_use":"in use", + "remaining":"remaining", + "charged":"Fully Charged", + "idle":"Idle", + "charging":"Charging", + "discharging":"Discharging" + }, + "search":{ + "name":"Пошук", + "desc":"Embed a search box in your page for easy access", + "settings":{ + "placeholder":"Search Field Placeholder", + "search_url":"Пошук посилання", + "param":"Query Parameter", + "param_placeholder":"The parameter where the query goes, i.e. \"q\"" + }, + "default_placeholder":"Search Google" + }, + "classroom":{ + "name":"Classroom", + "desc":"Keep up to date with your Google Classroom assignments and classes", + "settings":{ + "mode":"Widget Mode", + "mode_teacher":"Teacher", + "mode_student":"Student" + } } } \ No newline at end of file diff --git a/app/js/i18n/locales/zh-CN/main.json b/app/js/i18n/locales/zh-CN/main.json index d6614e1c..54e2aecd 100644 --- a/app/js/i18n/locales/zh-CN/main.json +++ b/app/js/i18n/locales/zh-CN/main.json @@ -145,7 +145,9 @@ "css":"自定义 CSS", "css_desc":"您可以使用此功能自定义CSS (有关指引请见 <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/CSS\"target=\"_blank\"> MDN<\/a>) 以自由改变 iChrome 几乎所有可视的部分。<br\/><br\/> 因为此选项将会同步而同步有空间限制的缘故,您最多只能输入包括空格在内的1000个字符。", "reset":"重置 iChrome", - "reset_confirm":"是否真的要重置 iChrome?这将清除所有的本地和同步的数据,没有备份也无法撤消该操作。您将丢失您所有同步此谷歌帐户计算机上的当前配置。" + "reset_confirm":"是否真的要重置 iChrome?这将清除所有的本地和同步的数据,没有备份也无法撤消该操作。您将丢失您所有同步此谷歌帐户计算机上的当前配置。", + "debug":"Debug Tools", + "debug_confirm":"WARNING: These tools can erase your configuration in a single click, only use them if your developer instructs you to.\r\nAre you sure you want to continue?" } }, "store":{ diff --git a/app/js/i18n/locales/zh-CN/widgets.json b/app/js/i18n/locales/zh-CN/widgets.json index 8406c691..9b5b791d 100644 --- a/app/js/i18n/locales/zh-CN/widgets.json +++ b/app/js/i18n/locales/zh-CN/widgets.json @@ -95,8 +95,8 @@ "noevents":"未来暂无安排。\n<br \/><br \/>\n请尝试通过右上角的扳手图标选择日历。" }, "clock":{ - "name":"日期和时间", - "desc":"显示当前日期和时间,在时区不同时可选 。", + "name":"时钟", + "desc":"Offers alarm, time, timer, and stopwatch functionality.", "settings":{ "timezone":"时区", "timezone_local":"本地", @@ -107,9 +107,18 @@ "analog":"12 小时-模拟", "ampmseconds":"AM\/PM-数字(无“秒”)", "24hourseconds":"24 小时-数字(无“秒”)" - } + }, + "sound":"Alert Sound" }, - "title":"时钟" + "title":"时钟", + "alarm":"Alarm", + "clock":"时钟", + "timer":"Timer", + "stopwatch":"Stopwatch", + "set":"Set", + "unset":"Unset", + "dismiss":"Dismiss", + "enable_audio":"Enable audio" }, "currency":{ "name":"货币转换", @@ -500,5 +509,52 @@ "js":"JavaScript", "height":"小部件高度" } + }, + "sitelink":{ + "name":"Site Link", + "desc":"Displays a link, optionally with a title and thumbnail", + "settings":{ + "link":"Link URL", + "link_placeholder":"http:\/\/www.google.com\/", + "image":"图像地址", + "image_placeholder":"http:\/\/www.example.com\/image.png", + "color":"Image Background Color", + "style":"Image Style", + "style_fill":"Fill", + "style_center":"中" + } + }, + "stats":{ + "name":"System Statistics", + "desc":"Keep an eye on your system with realtime statistics", + "memory":"Memory", + "battery":"Battery", + "usage":"usage", + "in_use":"in use", + "remaining":"remaining", + "charged":"Fully Charged", + "idle":"Idle", + "charging":"Charging", + "discharging":"Discharging" + }, + "search":{ + "name":"搜索", + "desc":"Embed a search box in your page for easy access", + "settings":{ + "placeholder":"Search Field Placeholder", + "search_url":"搜索链接", + "param":"Query Parameter", + "param_placeholder":"The parameter where the query goes, i.e. \"q\"" + }, + "default_placeholder":"Search Google" + }, + "classroom":{ + "name":"Classroom", + "desc":"Keep up to date with your Google Classroom assignments and classes", + "settings":{ + "mode":"Widget Mode", + "mode_teacher":"Teacher", + "mode_student":"Student" + } } } \ No newline at end of file diff --git a/app/js/i18n/locales/zh-TW/main.json b/app/js/i18n/locales/zh-TW/main.json index 00eaa56d..d2ca8744 100644 --- a/app/js/i18n/locales/zh-TW/main.json +++ b/app/js/i18n/locales/zh-TW/main.json @@ -145,7 +145,9 @@ "css":"自訂 CSS", "css_desc":"您可以通過這裡使用CSS自定義iChrome幾乎所有可見的部分(如果您需要詳細的解釋,請查看<a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/CSS\" target=\"_blank\">MDN<\/a>)。<br \/><br \/>因為這些內容將會被同步,因此,你只能輸入包括空格在內的最多1000個字符。", "reset":"重置 iChrome", - "reset_confirm":"您確定要重設您的iChrome嗎?\n重設後所有這部裝置上以及網路同步的資料皆將被清除,且此步驟將無法復原。另外,所有使用當前登入之Google帳號的電腦中的設定也將被移除。" + "reset_confirm":"您確定要重設您的iChrome嗎?\n重設後所有這部裝置上以及網路同步的資料皆將被清除,且此步驟將無法復原。另外,所有使用當前登入之Google帳號的電腦中的設定也將被移除。", + "debug":"Debug Tools", + "debug_confirm":"WARNING: These tools can erase your configuration in a single click, only use them if your developer instructs you to.\r\nAre you sure you want to continue?" } }, "store":{ diff --git a/app/js/i18n/locales/zh-TW/widgets.json b/app/js/i18n/locales/zh-TW/widgets.json index 1d34f0ae..462d143a 100644 --- a/app/js/i18n/locales/zh-TW/widgets.json +++ b/app/js/i18n/locales/zh-TW/widgets.json @@ -95,8 +95,8 @@ "noevents":"近期似乎沒有任何事件。\n<br \/><br \/>\n試著透過右上角的設定圖示來選取一個日曆。" }, "clock":{ - "name":"時間 & 日期", - "desc":"顯示當前日期和時間。可選另外的時區。", + "name":"時鐘", + "desc":"Offers alarm, time, timer, and stopwatch functionality.", "settings":{ "timezone":"時區", "timezone_local":"本地", @@ -107,9 +107,18 @@ "analog":"12 小時 - 類比時鐘", "ampmseconds":"上午\/下午 - 數位時鐘,沒有「秒」", "24hourseconds":"24 小時 - 數位時鐘,沒有「秒」" - } + }, + "sound":"Alert Sound" }, - "title":"時鐘" + "title":"時鐘", + "alarm":"Alarm", + "clock":"時鐘", + "timer":"Timer", + "stopwatch":"Stopwatch", + "set":"Set", + "unset":"Unset", + "dismiss":"Dismiss", + "enable_audio":"Enable audio" }, "currency":{ "name":"貨幣", @@ -500,5 +509,52 @@ "js":"JavaScript", "height":"小工具高度" } + }, + "sitelink":{ + "name":"Site Link", + "desc":"Displays a link, optionally with a title and thumbnail", + "settings":{ + "link":"Link URL", + "link_placeholder":"http:\/\/www.google.com\/", + "image":"圖像 URL", + "image_placeholder":"http:\/\/www.example.com\/image.png", + "color":"Image Background Color", + "style":"Image Style", + "style_fill":"Fill", + "style_center":"置中" + } + }, + "stats":{ + "name":"System Statistics", + "desc":"Keep an eye on your system with realtime statistics", + "memory":"Memory", + "battery":"Battery", + "usage":"usage", + "in_use":"in use", + "remaining":"remaining", + "charged":"Fully Charged", + "idle":"Idle", + "charging":"Charging", + "discharging":"Discharging" + }, + "search":{ + "name":"搜尋", + "desc":"Embed a search box in your page for easy access", + "settings":{ + "placeholder":"Search Field Placeholder", + "search_url":"搜尋網址", + "param":"Query Parameter", + "param_placeholder":"The parameter where the query goes, i.e. \"q\"" + }, + "default_placeholder":"Search Google" + }, + "classroom":{ + "name":"Classroom", + "desc":"Keep up to date with your Google Classroom assignments and classes", + "settings":{ + "mode":"Widget Mode", + "mode_teacher":"Teacher", + "mode_student":"Student" + } } } \ No newline at end of file From 8ef446331c8102796e25d01b5fc22b0a903ea445 Mon Sep 17 00:00:00 2001 From: Avi Kohn <avi@ichro.me> Date: Sun, 12 Jul 2015 20:06:02 -0400 Subject: [PATCH 30/30] Incremented the version --- app/manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/manifest.json b/app/manifest.json index e207e4ac..4eac5fcc 100644 --- a/app/manifest.json +++ b/app/manifest.json @@ -68,7 +68,7 @@ "bookmarks", "management" ], - "version": "2.1.18", + "version": "2.1.19", "manifest_version": 2, "default_locale": "en", "short_name": "iChrome",