diff --git a/app/css/style.css b/app/css/style.css index feba6940..a539b63b 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; } @@ -281,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 */ @@ -1349,8 +1580,8 @@ body.resizing .medley { /*--------------------------------------------- / Widgets Layout / Widgets */ -.widget-preview .widget, -.widgets-container .widget { +.widgets-container .widget, +.store-detail .preview .widget { margin: 2%; z-index: 1; flex: 2 100%; @@ -1363,24 +1594,24 @@ body.resizing .medley { box-shadow: 0 2px 1px rgba(102, 102, 102, 0.1); } -.widget-preview .widget.tiny, -.widgets-container .widget.tiny { +.widgets-container .widget.tiny, +.store-detail .preview .widget.tiny { flex: 1 46%; max-width: 46%; } -.widget-preview .widget .handle, -.widget-preview .widget .settings, .widgets-container .widget .handle, -.widgets-container .widget .settings { +.widgets-container .widget .settings, +.store-detail .preview .widget .handle, +.store-detail .preview .widget .settings { opacity: 0; z-index: 9; position: absolute; transition: opacity .3s ease-in-out; } -.widget-preview .widget .handle, -.widgets-container .widget .handle { +.widgets-container .widget .handle, +.store-detail .preview .widget .handle { top: 15px; right: 8px; width: 4px; @@ -1394,20 +1625,18 @@ body.resizing .medley { 0 -6px 3px rgba(255, 255, 255, 0.8); } -.widget-preview .widget:hover .handle, -.widget-preview .widget:hover .settings, .widgets-container .widget:hover .handle, .widgets-container .widget:hover .settings, -.widget-preview .widget .handle, -.widget-preview .widget .settings { +.store-detail .preview .widget:hover .handle, +.store-detail .preview .widget:hover .settings { opacity: 1; } -.widget-preview .widget .handle:before, -.widget-preview .widget .settings:before, .widgets-container .widget .handle:before, -.widgets-container .widget .settings:before { +.widgets-container .widget .settings:before, +.store-detail .preview .widget .handle:before, +.store-detail .preview .widget .settings:before { top: -15px; left: -15px; right: -10px; @@ -1418,8 +1647,8 @@ body.resizing .medley { background: rgba(0, 0, 0, 0); } -.widget-preview .widget .settings, -.widgets-container .widget .settings { +.widgets-container .widget .settings, +.store-detail .preview .widget .settings { top: 30px; right: 5px; color: #666; @@ -1429,15 +1658,15 @@ body.resizing .medley { text-shadow: 0 0 3px rgba(255, 255, 255, 0.8); } -.widget-preview .widget .settings:before, -.widgets-container .widget .settings:before { +.widgets-container .widget .settings:before, +.store-detail .preview .widget .settings:before { top: -1px; left: -6px; bottom: -5px; } -.widget-preview .widget .settings:hover, -.widgets-container .widget .settings:hover { +.widgets-container .widget .settings:hover, +.store-detail .preview .widget .settings:hover { color: #428BCA; } @@ -1742,7 +1971,7 @@ body.no-edit .widgets-container .widget.tabbed:before { opacity: 0; outline: 0; margin: auto; - z-index: 99999; + z-index: 9999; position: fixed; overflow: hidden; background: #FFF; @@ -1995,14 +2224,12 @@ body.no-edit .widgets-container .widget.tabbed:before { / Getting Started */ .modal-overlay.getting-started { - z-index: 99999; background: rgba(0, 0, 0, .3); } .modal.getting-started { width: 800px; height: 600px; - z-index: 999999; max-height: 100%; overflow: visible; border-radius: 6px; @@ -2206,7 +2433,6 @@ body.no-edit .widgets-container .widget.tabbed:before { /*--------------------------------------------- / Widget Store - These are direct selectors so they don't interfere with the widget previews */ .modal.store { overflow: visible; /* This fixes the 1px white gap above the close button caused by subpixel rounding in the automatic modal centering. */ @@ -2214,41 +2440,32 @@ body.no-edit .widgets-container .widget.tabbed:before { max-height: 700px; } -.store > .wrapper { +.store .wrapper { height: 100%; } -.store > .wrapper > .title, -.store > .wrapper > .detail > .title { - z-index: 9; +.store .wrapper > .title { height: 70px; font-size: 20px; padding: 25px 30px; border-bottom: 1px solid #EEE; font-family: Open Sans, sans-serif; -} - -.store > .wrapper > .title { box-shadow: 0 4px 3px -2px rgba(0, 0, 0, .05); } -.store > .close { - z-index: 999; -} - -.store > .wrapper > .content, -.store > .wrapper > .title { +.store .content, +.store .title { position: relative; } -.store > .wrapper > .content { +.store .content { overflow: auto; padding: 10px 15px; background: #F5F5F5; height: calc(100% - 70px); } -.store > .wrapper > .content:before { +.store .content:before { top: 0; left: 0; right: 0; @@ -2259,7 +2476,7 @@ body.no-edit .widgets-container .widget.tabbed:before { background: #F5F5F5; } -.store > .wrapper > .content .widget { +.store .content .widget { margin: 5px; cursor: pointer; overflow: hidden; @@ -2271,11 +2488,11 @@ body.no-edit .widgets-container .widget.tabbed:before { box-shadow: 0 1px 2px rgba(102, 102, 102, 0.1); } -.store > .wrapper > .content .widget:hover { +.store .content .widget:hover { background: #FCFCFC; } -.store > .wrapper > .content .widget img { +.store .content .widget img { width: 80px; float: left; height: 80px; @@ -2285,7 +2502,7 @@ body.no-edit .widgets-container .widget.tabbed:before { box-shadow: 0 1px 1px 0 rgba(0, 0, 0, 0.1); } -.store > .wrapper > .content .widget h2.title { +.store .content .widget h2.title { font-size: 16px; overflow: hidden; line-height: 20px; @@ -2295,7 +2512,7 @@ body.no-edit .widgets-container .widget.tabbed:before { font-family: Open Sans, sans-serif; } -.store > .wrapper > .content .widget .desc { +.store .content .widget .desc { color: #666; font-size: 12px; overflow: hidden; @@ -2309,109 +2526,104 @@ body.no-edit .widgets-container .widget.tabbed:before { + + /*--------------------------------------------- / Store Detail - These ALL need to be direct selectors so they don't interfere with the previews + These need to be direct-descendant selectors so they don't interfere with widget previews */ -.store.detail > .wrapper > .detail { - visibility: visible; - -webkit-transform: scale(1) translateZ(0); - transition: -webkit-transform .3s 0s ease-in-out, visibility 0s 0s linear; +.modal.store-detail { + width: 490px; + max-height: 700px; } -.store > .wrapper > .detail { - top: 0; - left: 0; - right: 0; - bottom: 0; - z-index: 99; /* Just over the store, but under the close button so the JS is simpler */ - background: #FFF; - position: absolute; - visibility: hidden; - -webkit-transform: scale(0) translateZ(0); - transition: -webkit-transform .3s 0s ease-in-out, visibility 0s .3s linear; +.store-detail > .content { + overflow: auto; + padding: 25px 30px; + background: #F8F8F8; + height: calc(100% - 70px); } -.store > .wrapper > .detail > div > h4 { - font-size: 13px; - margin-top: 25px; - min-height: 16px; - font-weight: 600; - margin-bottom: 15px; - text-transform: uppercase; - font-family: Open Sans, sans-serif; +.store-detail > .content > section { + margin-bottom: 25px; } -.store > .wrapper > .detail > .desc-container { - float: left; - margin-left: 25px; - width: calc(100% - 550px); - height: calc(100% - 85px); +.store-detail > .content > section > h3 { + font-size: 13px; + font-weight: 500; + margin-bottom: 15px; + font-family: Roboto, sans-serif; } -.store > .wrapper > .detail > .desc-container h4 .legend { +.store-detail > .content > section > h3 .legend { float: right; - font-size: 13px; font-weight: 400; - padding-right: 25px; - text-transform: none; } -.store > .wrapper > .detail > .desc-container .handle { +.store-detail > .content > .installation .handle { + font-size: 13px; background: #FFF; + font-weight: 500; padding: 10px 25px; margin-right: 10px; border-radius: 2px; display: inline-block; + text-transform: uppercase; + font-family: Roboto, sans-serif; transition: all .15s ease-in-out; - border: 1px solid rgba(0, 0, 0, 0.08); - box-shadow: 0 2px 1px rgba(102, 102, 102, 0.1); + box-shadow: 0 1px 3px rgba(0, 0, 0, .12), + 0 1px 2px rgba(0, 0, 0, .2); } -.store > .wrapper > .detail > .desc-container .handle:first-of-type { +.store-detail > .content > .installation .handle:first-of-type { margin-left: 20px; } -.store > .wrapper > .detail > .desc-container .handle:hover { - opacity: .8; +.store-detail > .content > .installation .handle:focus, +.store-detail > .content > .installation .handle:hover, +.store-detail > .content > .installation .handle:active { + color: #FFF; cursor: move; - background-color: #FAFAFA; + background: #2196F3; + box-shadow: 0 3px 6px rgba(0, 0, 0, .16), + 0 3px 6px rgba(0, 0, 0, .23); +} + +.store-detail > .content > .installation .handle:focus, +.store-detail > .content > .installation .handle:active { + background: #1E88E5; } -.store > .wrapper > .detail > .desc-container .desc { +.store-detail > .content > .description .desc { overflow: auto; + max-height: 250px; margin-left: 15px; margin-right: 5px; padding-right: 15px; - height: calc(100% - 155px); -} - -.store > .wrapper > .detail > .preview-container { - width: 440px; - float: right; - margin-right: 25px; - height: calc(100% - 85px); } -.store > .wrapper > .detail > .preview-container > .preview { - overflow-x: hidden; - padding-right: 15px; - height: calc(100% - 55px); +.store-detail > .content > section.preview { + padding-bottom: 10px; } -.store > .wrapper > .detail > .preview-container > .preview > .widget { +.store-detail > .content > section.preview > .widget { width: 410px; padding: 15px; font-size: 14px; overflow: hidden; background: #FFF; border-radius: 2px; - margin: 0 10px 10px; - border: 1px solid rgba(0, 0, 0, 0.08); - box-shadow: 0 2px 1px rgba(102, 102, 102, 0.1); + box-shadow: 0 1px 3px rgba(0, 0, 0, .12), + 0 1px 2px rgba(0, 0, 0, .2); } -.store > .wrapper > .detail > .preview-container > .preview > .widget.tiny { +/* This doesn't have to use direct-desendant because widgets need to be tolerant of the handle and settings classes */ +.store-detail .preview .widget .handle, +.store-detail .preview .widget .settings { + pointer-events: none; +} + +.store-detail > .content > section.preview > .widget.tiny { width: 210px; } @@ -2424,17 +2636,12 @@ body.no-edit .widgets-container .widget.tabbed:before { /*--------------------------------------------- / Themes */ -.modal-overlay.themes { - z-index: 999996; /* Just under the themes modal but over the settings */ -} - .modal.themes { top: 25px; left: 25px; right: 25px; bottom: 25px; cursor: default; - z-index: 999997; max-width: 1400px; max-height: 700px; } @@ -2680,14 +2887,6 @@ body.no-edit .widgets-container .widget.tabbed:before { /*--------------------------------------------- / Themes / Create */ -.modal-overlay.themes.create { - z-index: 999998; -} - -.modal.themes.create { - z-index: 999999; -} - .themes.create .content .title { box-shadow: none; } @@ -3175,6 +3374,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; +} + @@ -3189,7 +3476,9 @@ body.no-edit .widgets-container .widget.tabbed:before { .tooltip:lang(zh), .getting-started .slide:lang(zh), .toolbar .apps-toggle .apps:lang(zh), -.toolbar .search .suggestions div:lang(zh) { +.toolbar .search .suggestions div:lang(zh), +.store-detail > .content > section > h3:lang(zh), +.store-detail > .content > .installation .handle:lang(zh) { font-family: "微軟正黑體", "Microsoft JhengHei", Roboto; } @@ -3197,7 +3486,9 @@ body.no-edit .widgets-container .widget.tabbed:before { .tooltip:lang(ja), .getting-started .slide:lang(ja), .toolbar .apps-toggle .apps:lang(ja), -.toolbar .search .suggestions div:lang(ja) { +.toolbar .search .suggestions div:lang(ja), +.store-detail > .content > section > h3:lang(ja), +.store-detail > .content > .installation .handle:lang(ja) { font-family: "ヒラギノ角ゴ Pro W3", "Hiragino Kaku Gothic Pro", Osaka, "メイリオ", Meiryo, "MS Pゴシック", "MS PGothic", Roboto; } @@ -3216,10 +3507,8 @@ body.no-edit .widgets-container .widget.tabbed:before { .modal > .content > .title:lang(zh), .store > .wrapper > .title:lang(zh), .widget-settings .list .item:lang(zh), -.store > .wrapper > .detail > .title:lang(zh), -.store > .wrapper > .detail > div > h4:lang(zh), -.store > .wrapper > .content .widget .desc:lang(zh), -.store > .wrapper > .content .widget h2.title:lang(zh) { +.store .content .widget .desc:lang(zh), +.store .content .widget h2.title:lang(zh) { font-family: "微軟正黑體", "Microsoft JhengHei", Open Sans; } @@ -3238,10 +3527,8 @@ body.no-edit .widgets-container .widget.tabbed:before { .modal > .content > .title:lang(ja), .store > .wrapper > .title:lang(ja), .widget-settings .list .item:lang(ja), -.store > .wrapper > .detail > .title:lang(ja), -.store > .wrapper > .detail > div > h4:lang(ja), -.store > .wrapper > .content .widget .desc:lang(ja), -.store > .wrapper > .content .widget h2.title:lang(ja) { +.store .content .widget .desc:lang(ja), +.store .content .widget h2.title:lang(ja) { font-family: "ヒラギノ角ゴ Pro W3", "Hiragino Kaku Gothic Pro", Osaka, "メイリオ", Meiryo, "MS Pゴシック", "MS PGothic", Open Sans; } diff --git a/app/css/widgets.css b/app/css/widgets.css index 21683362..a7cdcd10 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; +} + + + @@ -1232,6 +1455,11 @@ cursor: pointer; } +.widget.traffic a { + color: inherit; + text-decoration: none; +} + .widget.traffic .dest { font-size: 16px; margin-top: 10px; @@ -2621,13 +2849,15 @@ body.no-edit .bookmarks .tools { /*--------------------------------------------- - / iFrame, HTML, Keep, Plus and Facebook shared + / iframe widgets shared */ .widget.html, .widget.keep, .widget.plus, +.widget.gmail, .widget.iframe, .widget.facebook, +.widget.classroom, .widget.notifications { padding: 0!important; } @@ -2635,8 +2865,10 @@ body.no-edit .bookmarks .tools { .html iframe, .keep iframe, .plus iframe, +.gmail iframe, .iframe iframe, .facebook iframe, +.classroom iframe, .notifications iframe { width: 100%; height: 100%; @@ -2650,7 +2882,7 @@ body.no-edit .bookmarks .tools { / Now */ .widgets-container .widget.now, -.preview-container .widget.now { +.store-detail .preview .widget.now { padding: 0!important; border: none!important; box-shadow: none!important; @@ -2814,22 +3046,6 @@ body.no-edit .bookmarks .tools { -/*--------------------------------------------- - / Gmail -*/ -.widget.gmail { - padding: 0!important; -} - -.gmail iframe { - width: 100%; - height: 100%; -} - - - - - /*--------------------------------------------- / Twitter */ @@ -3375,4 +3591,196 @@ body.no-edit .bookmarks .tools { .quotes footer .refresh:hover svg { fill: #222; +} + + + + + + + +/*--------------------------------------------- + / Site Link +*/ +.widget.sitelink { + padding: 0!important; + border-radius: 4px 4px 2px 2px; +} + +.sitelink a { + display: block; + text-decoration: none; +} +.widget.sitelink h2.header { + margin: 0; + padding: 12px; +} + +.sitelink .thumbnail { + display: block; + overflow: hidden; + position: relative; + background: #F8F8F8; + padding-bottom: 65%; + border-radius: 4px 4px 0 0; + box-shadow: 0 0 4px rgba(0, 0, 0, .2); +} + +.sitelink .thumbnail:not(.fill) { + background-image: none!important; +} + +.sitelink .thumbnail img { + top: 0; + left: 0; + right: 0; + bottom: 0; + margin: auto; + max-width: 100%; + max-height: 100%; + position: absolute; +} + +.sitelink .thumbnail.fill { + background-size: cover; + background-position: center; + background-repeat: no-repeat; +} + +.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; +} + + + + + + + +/*--------------------------------------------- + / 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; +} + + + + + + + +/*--------------------------------------------- + / 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 00000000..55dc4498 Binary files /dev/null and b/app/icons/classroom.png differ diff --git a/app/icons/search.png b/app/icons/search.png new file mode 100644 index 00000000..cc5d859d Binary files /dev/null and b/app/icons/search.png differ diff --git a/app/icons/sitelink.png b/app/icons/sitelink.png new file mode 100644 index 00000000..0110a8ab Binary files /dev/null and b/app/icons/sitelink.png differ diff --git a/app/icons/stats.png b/app/icons/stats.png new file mode 100644 index 00000000..35102bbf Binary files /dev/null and b/app/icons/stats.png differ diff --git a/app/images/sitelink_demo.png b/app/images/sitelink_demo.png new file mode 100644 index 00000000..50024d0f Binary files /dev/null and b/app/images/sitelink_demo.png differ diff --git a/app/inject/js/classroom.js b/app/inject/js/classroom.js new file mode 100644 index 00000000..5fb45c3a --- /dev/null +++ b/app/inject/js/classroom.js @@ -0,0 +1,56 @@ +var s = document.createElement("script"); + +s.textContent = "(" + (function() { + // Ignore eval + /* jshint -W060 */ + /* jshint -W061 */ + + 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); + } + }; + + /*jshint +W060 */ + /*jshint +W061 */ + + 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/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/js/core/templates.js b/app/js/core/templates.js index 6223614e..a8439776 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", @@ -47,7 +47,11 @@ var templates = [ "widgets.recentlyclosed", "widgets.recentlyclosed.desc", "widgets.quotes", "widgets.quotes.desc", "widgets.html", "widgets.html.desc", - "widgets.notifications", "widgets.notifications.desc" + "widgets.notifications", "widgets.notifications.desc", + "widgets.sitelink", "widgets.sitelink.desc", + "widgets.stats", "widgets.stats.desc", + "widgets.search", "widgets.search.desc", + "widgets.classroom", "widgets.classroom.desc" ], deps = []; 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/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 <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?" } }, diff --git a/app/js/i18n/locales/en/widgets.json b/app/js/i18n/locales/en/widgets.json index d031f411..a26c14ad 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": { @@ -654,5 +666,68 @@ "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/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 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) { diff --git a/app/js/modals/modals.js b/app/js/modals/modals.js index bb0812d9..b9cb95d4 100644 --- a/app/js/modals/modals.js +++ b/app/js/modals/modals.js @@ -9,6 +9,14 @@ define(["jquery", "backbone"], function($, Backbone) { var Modal = Backbone.View.extend({ el: '<div class="modal" tabindex="-1"><div class="close"></div><div class="content"></div></div>', overlay: '<div class="modal-overlay" tabindex="-1"></div>', + + /** + * Whether or not to destroy the modal when it's hidden. Used to clean up temporary modals. + * + * @type {Boolean} + */ + destroyOnHide: false, + show: function() { this.mo.addClass("visible").end().focus(); @@ -17,12 +25,18 @@ define(["jquery", "backbone"], function($, Backbone) { hide: function() { this.mo.removeClass("visible"); + if (this.destroyOnHide) { + setTimeout(this.destroy.bind(this), 400); + } + return this; }, close: function(e) { // This is an overridable close method that is called from event handlers, it lets the content intercept closes. return this.hide(); }, destroy: function() { + this.trigger("destroy"); + this.mo.off().remove(); this.stopListening(); @@ -34,7 +48,7 @@ define(["jquery", "backbone"], function($, Backbone) { this.overlay = $(this.overlay); // Set this.(modal + overlay = mo) shortcut - this.mo = this.$el.add(this.overlay); + this.mo = this.overlay.add(this.$el); // Construct an object of CSS properties based on the options passed diff --git a/app/js/settings/advanced.js b/app/js/settings/advanced.js index ac75b1c4..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(); @@ -74,7 +85,14 @@ define(["jquery", "backbone", "storage/storage", "i18n/i18n", "core/render", "li this.model.on("change", this.render, this).init(); }, + remove: function() { + this.$("input.color").spectrum("destroy"); + + Backbone.View.prototype.remove.call(this); + }, render: function() { + this.$("input.color").spectrum("destroy"); + this.$el .html(render("settings/advanced", this.model.get("settings"))) .find("input.color").spectrum({ diff --git a/app/js/settings/debug.js b/app/js/settings/debug.js new file mode 100644 index 00000000..062e6f5f --- /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", "jquery", "backbone", "storage/filesystem", "modals/modals", "core/render"], function(_, $, Backbone, FileSystem, 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):" + "\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(); + }); + }); + }); + 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()); // jshint ignore:line + + 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/js/themes/custom.js b/app/js/themes/custom.js index f9d3e7d7..ef7f2a8c 100644 --- a/app/js/themes/custom.js +++ b/app/js/themes/custom.js @@ -204,22 +204,16 @@ define(["lodash", "jquery", "backbone", "core/analytics", "modals/modals", "them * @api public */ destroy: function() { - this.remove(); - - this.modal.destroy(); + // modal.hide() triggers a destroy which in turn calls this.remove(); + this.modal.hide(); }, constructor: function() { this.modal = new (Modal.extend({ - classes: "themes create", - - close: function() { - this.modal.hide(); - - setTimeout(this.destroy.bind(this), 400); - }.bind(this) - }))(); + destroyOnHide: true, + classes: "themes create" + }))().on("destroy", this.remove, this); return Backbone.View.apply(this, arguments); }, @@ -242,6 +236,12 @@ define(["lodash", "jquery", "backbone", "core/analytics", "modals/modals", "them requestAnimationFrame(this.modal.show.bind(this.modal)); }, + remove: function() { + this.$("#color").spectrum("destroy"); + + Backbone.View.prototype.remove.call(this); + }, + render: function() { this.$("#color").spectrum("destroy"); diff --git a/app/js/themes/themes.js b/app/js/themes/themes.js index f61215d4..fdf4be36 100644 --- a/app/js/themes/themes.js +++ b/app/js/themes/themes.js @@ -322,7 +322,7 @@ define( var previewOverlay = this.previewOverlay = $('<div class="preview-overlay"></div>'); - modal.mo.appendTo(document.body).after(this.previewOverlay); + modal.mo.appendTo(document.body).last().after(this.previewOverlay); this.on("use", function() { diff --git a/app/js/widgets/settings.js b/app/js/widgets/settings.js index 1ec98043..3bd687fd 100644 --- a/app/js/widgets/settings.js +++ b/app/js/widgets/settings.js @@ -16,6 +16,7 @@ define( var modal = Modal.extend({ width: 400, height: 535, + destroyOnHide: true, classes: "widget-settings" }); @@ -40,6 +41,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.color").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; @@ -408,8 +423,6 @@ define( }, show: function() { - this.render(); - this.modal.show(); Track.pageview("/widget/" + this.widget.nicename + "/settings"); @@ -418,6 +431,10 @@ define( constructor: function() { this.modal = new modal(); + this.modal.on("destroy", function() { + this.$("input.color").spectrum("destroy"); + }, this); + this.modal.mo.appendTo(document.body); return Backbone.View.apply(this, arguments); @@ -425,6 +442,10 @@ define( initialize: function(opts) { this.widget = opts.widget; + + this.render(); + + requestAnimationFrame(this.show.bind(this)); }, diff --git a/app/js/widgets/store.js b/app/js/widgets/store.js index 9605f4d6..fe049f8a 100644 --- a/app/js/widgets/store.js +++ b/app/js/widgets/store.js @@ -44,23 +44,20 @@ define( } }), modal = new (Modal.extend({ - classes: "store", - close: function() { - if (this.$el.hasClass("detail")) { - this.$el.removeClass("detail"); - } - else { - this.hide(); - } - } + classes: "store" }))(), View = Backbone.View.extend({ el: modal.content, events: { "click > .content .widget": function(e) { - var elm = $(e.currentTarget), - id = parseInt(elm.attr("data-id")), + var wModal = new (Modal.extend({ + destroyOnHide: true, + classes: "store-detail" + }))(); + + + var id = parseInt($(e.currentTarget).attr("data-id")), widget = Widgets[id], view = new Widget({ model: new WidgetModel({ @@ -70,17 +67,19 @@ define( preview: true }); - this.$(".detail").html( + wModal.content.replaceWith( render("store-detail", { name: widget.name ? resolve(widget, widget.name) : translate(widget, "name"), sizes: widget.sizes.map(function(e) { return [e, sizes[e]]; }), desc: Utils.prototype.renderTemplate.call({ widget: widget }, "desc") }) - ).find(".preview").prepend(view.el); + ); + + wModal.content = wModal.$(".content"); Track.pageview("Store: " + widget.nicename, "/store/" + widget.nicename); - modal.$el.addClass("detail").find(".detail .desc-container").sortable({ + wModal.content.find(".sizes").sortable({ group: "columns", drop: false }).find("section.handle").on("sortabledragstart", function(e, item, container, _super) { @@ -112,7 +111,8 @@ define( // This way any events attached by jquery.sortable stay intact item[0] = newView.el; - modal.hide().$el.removeClass("detail"); + wModal.close(); + modal.hide(); item.css(css).addClass("dragged").appendTo("body > .widgets-container"); @@ -120,6 +120,12 @@ define( return item; }); + + wModal.content.find("section.preview").append(view.el); + + wModal.mo.appendTo(document.body); + + requestAnimationFrame(wModal.show.bind(wModal)); } }, diff --git a/app/js/widgets/view.js b/app/js/widgets/view.js index 48730554..df09c955 100644 --- a/app/js/widgets/view.js +++ b/app/js/widgets/view.js @@ -35,13 +35,9 @@ define(["jquery", "lodash", "backbone", "core/status", "core/analytics", "widget events: { "click .settings": function(e) { - if (!this.settings) { - this.settings = new Settings({ - widget: this.widget - }); - } - - this.settings.show(); + new Settings({ + widget: this.widget + }); } }, diff --git a/app/js/widgets/widgets.js b/app/js/widgets/widgets.js index 4d6f4e77..c3f7d403 100644 --- a/app/js/widgets/widgets.js +++ b/app/js/widgets/widgets.js @@ -3,7 +3,8 @@ */ define([ "lodash", "widgets/utils", - // These have to be w/ so r.js inlines them + + // These have to be w/ so r.js can inline them "w/analytics", "w/apps", "w/bookmarks", "w/calc", "w/calendar", "w/clock", "w/currency", "w/drive", "w/facebook", @@ -16,7 +17,8 @@ define([ "w/voice", "w/weather", "w/wolfram", "w/youtube", "w/recentlyclosed", "w/chrome_bookmarks", "w/tasks", "w/quotes", "w/html", - "w/notifications", + "w/notifications", "w/sitelink", "w/stats", + "w/search", "w/classroom", "lib/jquery.numberformatter", "lib/jquery.sortable" ], function(_, Utils) { diff --git a/app/manifest.json b/app/manifest.json index cbb18173..587ea4bd 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/*" ], @@ -50,6 +56,9 @@ "http://*/", "https://*/", "webRequest", + "system.cpu", + "system.memory", + "system.storage", "unlimitedStorage", "chrome://favicon/", "webRequestBlocking" @@ -59,7 +68,7 @@ "bookmarks", "management" ], - "version": "2.1.18", + "version": "2.1.19", "manifest_version": 2, "default_locale": "en", "short_name": "iChrome", diff --git a/app/templates/css.hjs b/app/templates/css.hjs index d664f21b..44399761 100644 --- a/app/templates/css.hjs +++ b/app/templates/css.hjs @@ -1,7 +1,7 @@ {{#wcolor}} .widget-preview .widget, .widgets-container .widget, - .store > .wrapper > .detail > .preview-container > .preview > .widget { + .store-detail > .content > section.preview > .widget { background: {{wcolor}}; } {{/wcolor}} 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 @@ <div class="col-sm-11 btns"> <a class="reset">{{i18n.settings.advanced.reset}}</a> + <a class="debug">{{i18n.settings.advanced.debug}}</a> </div> </div> \ 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 @@ +<h2 class="title">Debug Tools</h2> + +<p class="section status no-status"></p> + +<div class="section storage"> + <h3 class="title">Storage</h3> + + <button type="button" data-action="clear-sync">Clear Sync</button> + <button type="button" data-action="clear-local">Clear Local</button> + <button type="button" data-action="clear-localstorage">Clear LocalStorage</button> + <button type="button" data-action="clear-fs">Clear FileSystem</button> +</div> + +<div class="section oauth"> + <h3 class="title">OAuth</h3> + + <button type="button" data-action="clear-oauth">Clear Cache</button> +</div> + +<div class="section extension"> + <h3 class="title">Extension</h3> + + <button type="button" data-action="get-info">Info</button> + <button type="button" data-action="update">Check for updates</button> + <button type="button" data-action="reload-extension">Reload</button> +</div> + +<div class="section console"> + <h3 class="title">Console</h3> + + <textarea placeholder="Enter code here"></textarea> + + <button type="button" data-action="execute">Execute</button> +</div> \ No newline at end of file diff --git a/app/templates/store-detail.hjs b/app/templates/store-detail.hjs index 8fb6c1d4..99169133 100644 --- a/app/templates/store-detail.hjs +++ b/app/templates/store-detail.hjs @@ -1,21 +1,27 @@ -<h3 class="title">{{name}}</h3> +<h2 class="title">{{name}}</h2> -<div class="desc-container"> - <h4>{{i18n.store.installation}} <span class="legend">{{i18n.store.instructions}}</span></h4> +<div class="content"> + <section class="installation"> + <h3>{{i18n.store.installation}} <span class="legend">{{i18n.store.instructions}}</span></h3> - {{#sizes}} - <section class="handle" data-size="{{0}}">{{1}}</section> - {{/sizes}} + <div class="sizes"> + {{#sizes}} + <section class="handle" data-size="{{0}}">{{1}}</section> + {{/sizes}} + </div> + </section> - <h4>{{i18n.store.description}}</h4> + {{#desc}} + <section class="description"> + <h3>{{i18n.store.description}}</h3> - <div class="desc"> - {{{desc}}} - </div> -</div> + <div class="desc"> + {{{desc}}} + </div> + </section> + {{/desc}} -<div class="preview-container"> - <h4>{{i18n.store.preview}}</h4> - - <div class="preview"></div> + <section class="preview"> + <h3>{{i18n.store.preview}}</h3> + </section> </div> \ No newline at end of file diff --git a/app/templates/store.hjs b/app/templates/store.hjs index 35d18066..762a4798 100644 --- a/app/templates/store.hjs +++ b/app/templates/store.hjs @@ -10,7 +10,4 @@ <div class="desc">{{desc}}</div> </div> {{/widgets}} -</div> - -<div class="detail"> </div> \ No newline at end of file diff --git a/app/templates/widget-settings.inputs.hjs b/app/templates/widget-settings.inputs.hjs index cdfb4a1b..dc023f9b 100644 --- a/app/templates/widget-settings.inputs.hjs +++ b/app/templates/widget-settings.inputs.hjs @@ -16,6 +16,15 @@ <textarea class="form-control" id="widget-{{nicename}}" name="{{nicename}}" placeholder="{{placeholder}}">{{value}}</textarea> {{/input-textarea}} +{{#input-color}} + <label for="widget-{{nicename}}"> + {{label}} + {{#help}}<div class="help" data-tooltip="{{help}}"></div>{{/help}} + </label> + + <input type="text" class="form-control color" id="widget-{{nicename}}" name="{{nicename}}" value="{{value}}" /> +{{/input-color}} + {{#input-select}} <label for="widget-{{nicename}}"> {{label}} diff --git a/app/templates/widgets/analytics/desc.hjs b/app/templates/widgets/analytics/desc.hjs index ed287d7e..ef7054b2 100644 --- a/app/templates/widgets/analytics/desc.hjs +++ b/app/templates/widgets/analytics/desc.hjs @@ -1,15 +1,3 @@ -The Analytics widget lets you monitor the day's statistics for any Google Analytics account.<br /> +Use this widget to keep track of how your analytics are doing today.<br /> <br /> -Setup:<br /> -<br /> -<ol> - <li>Install the widget in your preferred size</li> - <li>Hover over the widget and click the settings icon that appears</li> - <li>Select a profile from the profile dropdown</li> - <li>Enter an optional title for this widget</li> - <li>Click "Save"</li> -</ol> -Variations:<br /> -<br /> -Tiny: Displays the number of visits so far today and a tooltip with the current number of pageviews, pages/visit, bounce rate and first goal completions<br /> -Small: Displays the current number of visits, pageviews, pages/visit, bounce rate and first goal completions. \ No newline at end of file +After installation, you'll need to select a profile from the widget settings. \ No newline at end of file diff --git a/app/templates/widgets/apps/desc.hjs b/app/templates/widgets/apps/desc.hjs index 7ff97fe9..dcde55f2 100644 --- a/app/templates/widgets/apps/desc.hjs +++ b/app/templates/widgets/apps/desc.hjs @@ -1,5 +1,3 @@ -The Apps widget displays your currently installed Google Chrome applications in either a list or tile view.<br /> +The Apps widget displays your Chrome apps in a list or tile view.<br /> <br /> -No setup is necessary for this widget.<br /> -<br /> -There are no variations available for this widget. \ No newline at end of file +You can drag-and-drop widgets or pick a default display order in the settings. \ No newline at end of file diff --git a/app/templates/widgets/bookmarks/desc.hjs b/app/templates/widgets/bookmarks/desc.hjs index 261ab9f9..632fde97 100644 --- a/app/templates/widgets/bookmarks/desc.hjs +++ b/app/templates/widgets/bookmarks/desc.hjs @@ -1,16 +1,3 @@ The Bookmarks widget contains an editable list of bookmarks in either a one or two column layout.<br /> <br /> -To add a bookmark:<br /> -<br /> -<ol> - <li>Install the widget in your preferred size</li> - <li>Hover over the widget and click the "New..." link that appears in the top right corner</li> - <li>Fill out the URL and bookmark title fields in the modal that pops up</li> - <li>Click "Save"</li> -</ol> -To delete or reorder bookmarks use the buttons that appear on the right of each bookmark when they are hovered over.<br /> -<br /> -Variations:<br /> -<br /> -Tiny: Displays a one column only list of editable bookmarks.<br /> -Variable: Displays a one or two column list of editable bookmarks. \ No newline at end of file +Use the buttons at the right of each of the bookmarks to delete or reorder them. \ No newline at end of file diff --git a/app/templates/widgets/calc/desc.hjs b/app/templates/widgets/calc/desc.hjs index 1726b01a..1b6d6b52 100644 --- a/app/templates/widgets/calc/desc.hjs +++ b/app/templates/widgets/calc/desc.hjs @@ -1,9 +1 @@ -The Calculator widget displays a simple, calculator.<br /> -<br /> -No setup is necessary for this widget.<br /> -<br /> -Variations:<br /> -<br /> -Tiny: Displays only an input box where you can enter simple problems.<br /> -Small: Displays an input box plus keys that can't be entered easily through the keyboard.<br /> -Medium: Displays an input box, full keypad and basic functions (add, subtract, multiply, divide, parentheses). \ No newline at end of file +This widget contains a calculator with basic functionality. \ No newline at end of file diff --git a/app/templates/widgets/calendar/desc.hjs b/app/templates/widgets/calendar/desc.hjs index 87b854fd..ea27283c 100644 --- a/app/templates/widgets/calendar/desc.hjs +++ b/app/templates/widgets/calendar/desc.hjs @@ -1,11 +1,3 @@ -The Calendar widget displays a list of events from your Google Calendar.<br /> +The Calendar widget displays a list of events from one or more of your Google Calendars.<br /> <br /> -Setup:<br /> -<br /> -<ol> - <li>Install the widget in your preferred size</li> - <li>Hover over the widget and click the settings icon that appears</li> - <li>Under calendar select the calendar that you would like to be shown</li> - <li>Click "Save"</li> -</ol> -There are no variations available for this widget. \ No newline at end of file +After installation, select the calendars you want shown from the settings. \ No newline at end of file diff --git a/app/templates/widgets/chrome_bookmarks/desc.hjs b/app/templates/widgets/chrome_bookmarks/desc.hjs index 240bca63..a5ee7128 100644 --- a/app/templates/widgets/chrome_bookmarks/desc.hjs +++ b/app/templates/widgets/chrome_bookmarks/desc.hjs @@ -1,3 +1,3 @@ -The Bookmarks widget displays your Chrome bookmarks, optionally from a specific folder.<br /> +This widget displays your Chrome bookmarks, optionally from a specific folder.<br /> <br /> -Bookmarks can be added, removed, edited and reordered via Chrome's interface at <b>chrome://bookmarks</b>. \ No newline at end of file +You can add, remove, edit, and reorder bookmarks through Chrome's interface at <b>chrome://bookmarks</b>. \ No newline at end of file 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/templates/widgets/clock/desc.hjs b/app/templates/widgets/clock/desc.hjs index 5c344492..1066f9a1 100644 --- a/app/templates/widgets/clock/desc.hjs +++ b/app/templates/widgets/clock/desc.hjs @@ -1,8 +1,3 @@ -The Time &amp; Date widget displays the current time and date for either the local timezone or any other timezone.<br /> +The Clock widget displays the current time and date and offers alarm, timer, and stopwatch functionality.<br /> <br /> -No setup is required for this widget, however you can select a timezone using the settings menu. You can also choose to display a 24 hour or analog clock via the settings menu.<br /> -<br /> -Variations:<br /> -<br /> -Tiny: Displays the current time in either a 12 hour, 24 hour or analog clock format.<br /> -Small: Displays the current time in either a 12 hour, 24 hour or analog clock format and the date in the selected timezone. \ 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}}<h2 class="header">{{title}}</h2>{{/title}} - {{#analog}} <div class="clock"> <!-- Hands --> @@ -42,5 +40,116 @@ </div> {{/analog}} {{^analog}} - <div class="clock">{{{html}}}</div> + {{#small}} + <header class="tabs"> + <div class="item" data-id="alarm" title="{{i18n.alarm}}"> + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M22 5.72l-4.6-3.86-1.29 1.53 4.6 3.86L22 5.72zM7.88 3.39L6.6 1.86 2 5.71l1.29 1.53 4.59-3.85zM12.5 8H11v6l4.75 2.85.75-1.23-4-2.37V8zM12 4c-4.97 0-9 4.03-9 9s4.02 9 9 9c4.97 0 9-4.03 9-9s-4.03-9-9-9zm0 16c-3.87 0-7-3.13-7-7s3.13-7 7-7 7 3.13 7 7-3.13 7-7 7z"/></svg> + </div> + + <div class="item active" data-id="clock" title="{{i18n.clock}}"> + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-opacity=".9" d="M11.99 2C6.47 2 2 6.48 2 12s4.47 10 9.99 10C17.52 22 22 17.52 22 12S17.52 2 11.99 2zM12 20c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8zM12.5 7H11v6l5.25 3.15.75-1.23-4.5-2.67z"/></svg> + </div> + + <div class="item" data-id="timer" title="{{i18n.timer}}"> + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M6 2v6h.01L6 8.01 10 12l-4 4 .01.01H6V22h12v-5.99h-.01L18 16l-4-4 4-3.99-.01-.01H18V2H6zm10 14.5V20H8v-3.5l4-4 4 4zm-4-5l-4-4V4h8v3.5l-4 4z"/></svg> + </div> + + <div class="item" data-id="stopwatch" title="{{i18n.stopwatch}}"> + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M15 1H9v2h6V1zm-4 13h2V8h-2v6zm8.03-6.61l1.42-1.42c-.43-.51-.9-.99-1.41-1.41l-1.42 1.42C16.07 4.74 14.12 4 12 4c-4.97 0-9 4.03-9 9s4.02 9 9 9 9-4.03 9-9c0-2.12-.74-4.07-1.97-5.61zM12 20c-3.87 0-7-3.13-7-7s3.13-7 7-7 7 3.13 7 7-3.13 7-7 7z"/></svg> + </div> + </header> + + <div class="section alarm {{#alarm.set}}running{{/alarm.set}}"> + <div class="time">{{alarm.html}}</div> + + <input type="time" class="time" value="{{alarm.timeStr}}" /> + + <div class="controls"> + <label class="audio"> + <input type="checkbox" {{#audio}}checked{{/audio}} /> + + {{i18n.enable_audio}} + </label> + + <!-- <input type="date" class="date" min="2015-06-24" value="2015-06-24" /> --> + + <button type="button" class="material blue set">{{#alarm.set}}{{i18n.unset}}{{/alarm.set}}{{^alarm.set}}{{i18n.set}}{{/alarm.set}}</button> + </div> + </div> + + <div class="alert alarm"> + <h3 class="type">{{i18n.alarm}}</h3> + + <h4 class="time"></h4> + + <div class="btn-container"> + <button type="button" class="material flat dismiss">{{i18n.dismiss}}</button> + </div> + </div> + + <div class="section clock active">{{{html}}}</div> + + <div class="section timer {{#timer.duration}}running{{/timer.duration}}"> + <div class="time">{{timer.html}}</div> + + <input type="text" class="time" placeholder="0:00:00" /> + + <div class="controls"> + <button type="button" class="material toggle reset"> + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"> + <path d="M12 5V1L7 6l5 5V7c3.31 0 6 2.69 6 6s-2.69 6-6 6-6-2.69-6-6H4c0 4.42 3.58 8 8 8s8-3.58 8-8-3.58-8-8-8z"/> + </svg> + </button> + + <label class="audio"> + <input type="checkbox" {{#audio}}checked{{/audio}} /> + + {{i18n.enable_audio}} + </label> + + <button type="button" class="material fab blue start-stop {{#timer.running}}started{{/timer.running}}"> + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48"> + <path id="start" d="M16 10v28l22-14z"/> + + <path id="stop" d="M12 12h24v24H12z"/> + </svg> + </button> + </div> + </div> + + <div class="alert timer"> + <h3 class="type">{{i18n.timer}}</h3> + + <h4 class="time"></h4> + + <div class="btn-container"> + <button type="button" class="material flat dismiss">{{i18n.dismiss}}</button> + </div> + </div> + + <div class="section stopwatch"> + <div class="time">{{stopwatch.html}}{{^stopwatch.html}}0:00{{/stopwatch.html}}</div> + + <div class="controls"> + <button type="button" class="material toggle reset"> + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"> + <path d="M12 5V1L7 6l5 5V7c3.31 0 6 2.69 6 6s-2.69 6-6 6-6-2.69-6-6H4c0 4.42 3.58 8 8 8s8-3.58 8-8-3.58-8-8-8z"/> + </svg> + </button> + + <button type="button" class="material fab blue start-stop {{#stopwatch.running}}started{{/stopwatch.running}}"> + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48"> + <path id="start" d="M16 10v28l22-14z"/> + + <path id="stop" d="M12 12h24v24H12z"/> + </svg> + </button> + </div> + </div> + {{/small}} + {{^small}} + {{#title}}<h2 class="header">{{title}}</h2>{{/title}} + + <div class="clock">{{{html}}}</div> + {{/small}} {{/analog}} \ No newline at end of file diff --git a/app/templates/widgets/currency/desc.hjs b/app/templates/widgets/currency/desc.hjs index d059983d..72192f6c 100644 --- a/app/templates/widgets/currency/desc.hjs +++ b/app/templates/widgets/currency/desc.hjs @@ -1,5 +1 @@ -The currency widget lets you convert to and from 169 currencies including Bitcoin.<br /> -<br /> -No setup is necessary for this widget.<br /> -<br /> -There are no variations available for this widget. \ No newline at end of file +This widget lets you convert to and from any of 169 currencies, including Bitcoin. It'll also remember which ones you used last. \ No newline at end of file diff --git a/app/templates/widgets/drive/desc.hjs b/app/templates/widgets/drive/desc.hjs index a5f9b05b..cea0fc5a 100644 --- a/app/templates/widgets/drive/desc.hjs +++ b/app/templates/widgets/drive/desc.hjs @@ -1,10 +1,3 @@ -The Drive widget displays recently changed files from your Google Drive.<br /> +The Drive widget displays recently changed files from your Google Drive account.<br /> <br /> -Setup:<br /> -<br /> -<ol> - <li>Install the widget in your preferred size</li> - <li>Click the large Authorize button that is shown in the widget</li> - <li>After the window opens on Google, follow the steps and click Authorize</li> -</ol> -There are no variations available for this widget. \ No newline at end of file +You'll need to grant it access to your account after installation by clicking the Authorize button. \ No newline at end of file diff --git a/app/templates/widgets/facebook/desc.hjs b/app/templates/widgets/facebook/desc.hjs index 1830c03b..a23c0ea3 100644 --- a/app/templates/widgets/facebook/desc.hjs +++ b/app/templates/widgets/facebook/desc.hjs @@ -1,7 +1,3 @@ -The Facebook widget displays your Facebook home timeline in a widget.<br /> +This widget displays your Facebook home feed.<br /> <br /> -<b>This widget is not available offline and, since it loads from a third-party site that is not as optimized as iChrome, it may cause iChrome to load slowly.</b><br /> -<br /> -No setup is necessary for this widget.<br /> -<br /> -There are no variations available for this widget. \ No newline at end of file +Please note that since this widget loads a third-party site, it won't be available offline and could cause iChrome to load slowly. \ No newline at end of file diff --git a/app/templates/widgets/feedly/desc.hjs b/app/templates/widgets/feedly/desc.hjs index 69d0e955..31c5741a 100644 --- a/app/templates/widgets/feedly/desc.hjs +++ b/app/templates/widgets/feedly/desc.hjs @@ -1,9 +1,3 @@ -The Feedly widget displays an infinite-scrolling list of articles from any category or feed in your Feedly account with images, when available.<br /> +This widget displays a list of articles from any category or feed in your Feedly account, with images.<br /> <br /> -Articles can be displayed as full width cards, half width cards (two columns), a list or a "magazine" view like the News or RSS widgets.<br /> -<br /> -You can also optionally select to show only unread articles, sort articles oldest first and mark articles as read when either clicked or scrolled past.<br /> -<br /> -To save an article and recommend it just click the recommendation count that's displayed in green on every article.<br /> -<br /> -There are no variations available for this widget. \ No newline at end of file +Go into the settings after installation to choose a display format and set other preferences. \ No newline at end of file diff --git a/app/templates/widgets/gmail/desc.hjs b/app/templates/widgets/gmail/desc.hjs index 9f9e6ba9..e32f4739 100644 --- a/app/templates/widgets/gmail/desc.hjs +++ b/app/templates/widgets/gmail/desc.hjs @@ -1,13 +1,3 @@ The Gmail widget displays your Gmail inbox in an iFrame where you can manage your email.<br /> <br /> -<b>This widget will not work offline unless you install the Gmail extension for Chrome.</b><br /> -<br /> -No setup is required for this widget, however you can follow these steps to select an alternate email account:<br /> -<br /> -<ol> - <li>Install the widget in your preferred size</li> - <li>Hover over the widget and click the settings icon that appears</li> - <li>Enter an account ID (an explanation is available under the question mark icon)</li> - <li>Click "Save"</li> -</ol> -There are no variations available for this widget. \ No newline at end of file +This widget won't work offline unless you install the Gmail extension for Chrome. \ No newline at end of file diff --git a/app/templates/widgets/html/desc.hjs b/app/templates/widgets/html/desc.hjs index f00a9248..7e7a9a9e 100644 --- a/app/templates/widgets/html/desc.hjs +++ b/app/templates/widgets/html/desc.hjs @@ -1,3 +1,3 @@ -The HTML widget lets you embed completely custom HTML in a widget.<br /> +This widget lets you display completely custom HTML.<br /> <br /> -<b>If used incorrectly this widget can make it impossible to access your homepage. Only install use this widget if you know what you're doing.</b> \ No newline at end of file +<b>Please note that if this widget is used incorrectly, it can make it impossible to access your homepage. Only install use this widget if you know what you're doing.</b> \ No newline at end of file diff --git a/app/templates/widgets/iframe/desc.hjs b/app/templates/widgets/iframe/desc.hjs index 46f4574a..1e7e95d0 100644 --- a/app/templates/widgets/iframe/desc.hjs +++ b/app/templates/widgets/iframe/desc.hjs @@ -1,13 +1,3 @@ -The iFrame widget can contain another webpage or even an entire other website, all inside a widget.<br /> +The iFrame widget displays another webpage, or even an entire other website, inside a widget. You can use this to embed things like the Gmail offline app or a mobile website.<br /> <br /> -This lets you embed things like the Gmail offline app or a mobile website.<br /> -<br /> -To set what webpage is shown:<br /> -<br /> -<ol> - <li>Install the widget in your preferred size</li> - <li>Hover over the widget and click the settings icon that appears <b>next to the widget</b></li> - <li>Under "Frame URL" enter the URL of the webpage you would like shown</li> - <li>Click "Save"</li> -</ol> -There are no variations available for this widget. \ No newline at end of file +Go into the settings after installation to enter a URL to display. \ No newline at end of file diff --git a/app/templates/widgets/keep/desc.hjs b/app/templates/widgets/keep/desc.hjs index 6aec29b4..865b39ac 100644 --- a/app/templates/widgets/keep/desc.hjs +++ b/app/templates/widgets/keep/desc.hjs @@ -1,7 +1,3 @@ -The Keep widget embeds Google Keep inside a widget.<br /> +Use this widget to display your Google Keep.<br /> <br /> -<b>This widget is not available offline unless you also install the <a href="https://chrome.google.com/webstore/detail/google-keep/hmjkmjkepdijhoojdojkdfohbdgmmhki" target="_blank">Google Keep Chrome extension</a>.</b><br /> -<br /> -This widget also loads from a third-party site that is not as optimized as iChrome, it may cause iChrome to load slowly.<br /> -<br /> -There are no variations available for this widget. \ 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 diff --git a/app/templates/widgets/news/desc.hjs b/app/templates/widgets/news/desc.hjs index 927641df..7da38187 100644 --- a/app/templates/widgets/news/desc.hjs +++ b/app/templates/widgets/news/desc.hjs @@ -1,19 +1,3 @@ -The News widget shows top news for a selected topic and edition from Google News.<br /> +Use this widget to keep up-to-date on the latest news via Google News.<br /> <br /> -Via the settings menu you can:<br /> -<br /> -<ul> - <li>Choose the number of articles shown</li> - <li>Select a news topic</li> - <li>Select a news edition</li> - <li>Enter a custom RSS feed URL</li> -</ul> -To select a topic/edition:<br /> -<br /> -<ol> - <li>Install the widget in your preferred size</li> - <li>Hover over the widget and click the settings icon that appears</li> - <li>Select a topic or edition from their respective dropdown menus</li> - <li>Click "Save"</li> -</ol> -There are no variations available for this widget. \ No newline at end of file +After installation, pick a topic and edition in the settings. \ No newline at end of file diff --git a/app/templates/widgets/notes/desc.hjs b/app/templates/widgets/notes/desc.hjs index c7325a8b..917f1126 100644 --- a/app/templates/widgets/notes/desc.hjs +++ b/app/templates/widgets/notes/desc.hjs @@ -1,7 +1,3 @@ -The Notes widget contains a rich text sticky note.<br /> +This widget contains a rich text sticky note.<br /> <br /> -Via the settings menu you can select what color, font face and font size are used.<br /> -<br /> -No setup is necessary for this widget.<br /> -<br /> -There are no variations available for this widget. \ No newline at end of file +You can pick a color, font face, or font size in the settings. \ No newline at end of file diff --git a/app/templates/widgets/notifications/desc.hjs b/app/templates/widgets/notifications/desc.hjs index 92c04ffb..1bfb5d66 100644 --- a/app/templates/widgets/notifications/desc.hjs +++ b/app/templates/widgets/notifications/desc.hjs @@ -1,3 +1,3 @@ -The Notifications widget displays your Google notifications as shown on Google+ and Gmail.<br /> +This widget displays your Google notifications, as shown on Google+ and Gmail.<br /> <br /> -<b>This widget is not available offline and, since it loads from a third-party site that is not as optimized as iChrome, it may cause iChrome to load slowly.</b> \ No newline at end of file +Please note that since this widget loads a third-party site, it won't be available offline and could cause iChrome to load slowly. \ No newline at end of file diff --git a/app/templates/widgets/now/desc.hjs b/app/templates/widgets/now/desc.hjs index 8ad0567b..f2895ef2 100644 --- a/app/templates/widgets/now/desc.hjs +++ b/app/templates/widgets/now/desc.hjs @@ -1,10 +1,3 @@ -The Now widget displays cards from Google Now.<br /> +This widget displays cards from your Google Now.<br /> <br /> -Setup:<br /> -<br /> -<ol> - <li>Install the widget in your preferred size</li> - <li>Click the blue Authorize button</li> - <li>Follow the prompts and allow access</li> -</ol> -There are no variations available for this widget. \ No newline at end of file +After installation, you'll need to grant it access to your account by clicking the Authorize button. \ No newline at end of file diff --git a/app/templates/widgets/plus/desc.hjs b/app/templates/widgets/plus/desc.hjs index bcff9808..08bae380 100644 --- a/app/templates/widgets/plus/desc.hjs +++ b/app/templates/widgets/plus/desc.hjs @@ -1,7 +1,3 @@ -The Google Plus widget displays your Google+ home stream in a widget.<br /> +This widget displays your Google+ home stream.<br /> <br /> -<b>This widget is not available offline and, since it loads from a third-party site that is not as optimized as iChrome, it may cause iChrome to load slowly.</b><br /> -<br /> -No setup is necessary for this widget.<br /> -<br /> -There are no variations available for this widget. \ No newline at end of file +Please note that since this widget loads a third-party site, it won't be available offline and could cause iChrome to load slowly. \ No newline at end of file diff --git a/app/templates/widgets/quotes/desc.hjs b/app/templates/widgets/quotes/desc.hjs index e9b94255..fce7120d 100644 --- a/app/templates/widgets/quotes/desc.hjs +++ b/app/templates/widgets/quotes/desc.hjs @@ -1 +1 @@ -The Quotes widget displays a quote from the source of your choosing picked either every time you load the page or once daily. \ No newline at end of file +Use this widget to keep inspired with quotes picked every time you load the page or once daily. \ No newline at end of file diff --git a/app/templates/widgets/recentlyclosed/desc.hjs b/app/templates/widgets/recentlyclosed/desc.hjs index 74c339f7..16151f61 100644 --- a/app/templates/widgets/recentlyclosed/desc.hjs +++ b/app/templates/widgets/recentlyclosed/desc.hjs @@ -1 +1 @@ -The Recently Closed widget displays a list of your recently closed tabs. \ No newline at end of file +Use this widget to display a list of your recently closed tabs. \ No newline at end of file diff --git a/app/templates/widgets/reddit/desc.hjs b/app/templates/widgets/reddit/desc.hjs index b1c79374..016aa361 100644 --- a/app/templates/widgets/reddit/desc.hjs +++ b/app/templates/widgets/reddit/desc.hjs @@ -1,11 +1 @@ -The Reddit widget displays items in a selected sort order from any given subreddit. Images will also be displayed when available.<br /> -<br /> -To select a subreddit:<br /> -<br /> -<ol> - <li>Install the widget in your preferred size</li> - <li>Hover over the widget and click the settings icon that appears</li> - <li>Under "Subreddit" enter the subreddit name</li> - <li>Click "Save"</li> -</ol> -There are no variations available for this widget. \ No newline at end of file +Use this widget to keep up with one of your subreddits. After installation, enter the subreddit name in the settings. \ No newline at end of file diff --git a/app/templates/widgets/rss/desc.hjs b/app/templates/widgets/rss/desc.hjs index 5ecf2fe9..a07ad232 100644 --- a/app/templates/widgets/rss/desc.hjs +++ b/app/templates/widgets/rss/desc.hjs @@ -1,12 +1,3 @@ -The RSS widget lets you display items with images, descriptions and/or titles in a list format from either a RSS or Atom feed.<br /> +Use this widget to display an RSS or Atom feed. It'll display items with titles, images, and descriptions.<br /> <br /> -To setup a RSS or Atom feed:<br /> -<br /> -<ol> - <li>Install the widget in your preferred size</li> - <li>Hover over the widget and click the settings icon that appears</li> - <li>Enter the feed URL</li> - <li>Enable or disable images and/or descriptions</li> - <li>Click "Save"</li> -</ol> -There are no variations available for this widget. \ No newline at end of file +After installation, go into the settings and enter your feed URL. You can also customize what's shown. \ No newline at end of file diff --git a/app/templates/widgets/search/desc.hjs b/app/templates/widgets/search/desc.hjs new file mode 100644 index 00000000..e69de29b diff --git a/app/templates/widgets/search/template.hjs b/app/templates/widgets/search/template.hjs new file mode 100644 index 00000000..cff15f1b --- /dev/null +++ b/app/templates/widgets/search/template.hjs @@ -0,0 +1,7 @@ +<form action="{{url}}"> + <input type="text" name="{{param}}" class="searchbox" placeholder="{{placeholder}}" /> + + {{#small}} + <button class="material blue submit">Search</button> + {{/small}} +</form> \ No newline at end of file diff --git a/app/templates/widgets/sitelink/desc.hjs b/app/templates/widgets/sitelink/desc.hjs new file mode 100644 index 00000000..d6a8e527 --- /dev/null +++ b/app/templates/widgets/sitelink/desc.hjs @@ -0,0 +1,3 @@ +Use this widget to display a link on your page.<br /> +<br /> +After installation, you can choose an image and title in the settings. You can use this widget to create a speed-dial like page. \ No newline at end of file diff --git a/app/templates/widgets/sitelink/template.hjs b/app/templates/widgets/sitelink/template.hjs new file mode 100644 index 00000000..cb21fce4 --- /dev/null +++ b/app/templates/widgets/sitelink/template.hjs @@ -0,0 +1,9 @@ +<a href="{{link}}"> + {{#hasIcon}} + <div class="thumbnail {{style}}" style="background-image: url({{image}}); background-color: {{color}};"> + <img src="{{image}}" /> + </div> + {{/hasIcon}} + + {{#title}}<h2 class="header">{{title}}</h2>{{/title}} +</a> \ No newline at end of file diff --git a/app/templates/widgets/sports/desc.hjs b/app/templates/widgets/sports/desc.hjs index 9c17eb9a..48b71aa7 100644 --- a/app/templates/widgets/sports/desc.hjs +++ b/app/templates/widgets/sports/desc.hjs @@ -1,14 +1,3 @@ -The Sports widget displays recent and live sports scores or schedules for selected leagues and teams.<br /> +Keep track of recent and live sports scores or schedules with this widget.<br /> <br /> -To select a league or team:<br /> -<br /> -<ol> - <li>Install the widget in your preferred size</li> - <li>Hover over the widget and click the settings icon that appears</li> - <li>Under league or team select your preferred option, you need to select a league before selecting a team</li> - <li>Click "Save"</li> -</ol> -Variations:<br /> -<br /> -Tiny: Displays either the most recent score or next scheduled game for the selected teams with more game information in a tooltip.<br /> -Variable: Displays the most recent scores, schedules, TV coverage and game statuses for anywhere between 1 and 10 games. \ No newline at end of file +After installation, go into the settings and pick your favorite league or teams. \ No newline at end of file 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 @@ +<h2 class="header">{{i18n.name}}</h2> + +<div class="section cpu"> + <div class="label"> + <h3 class="title">CPU</h3> + + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48" class="icon"> + <path d="M40 4.17H8c-2.21 0-4 1.79-4 4v32c0 2.21 1.79 4 4 4h32c2.21 0 4-1.79 4-4v-32c0-2.21-1.79-4-4-4zm0 36H8v-32h32v32zm-4-28H26c-2.21 0-4 1.79-4 4v4.55c-1.19.69-2 1.97-2 3.45 0 2.21 1.79 4 4 4s4-1.79 4-4c0-1.48-.81-2.75-2-3.45v-4.55h6v16H16v-16h4v-4h-8v24h24v-24z"/> + </svg> + </div> + + <div class="status"> + <p class="name">{{cpu.name}}</p> + + <p class="summary"><span class="usage">{{cpu.usage}}</span>% {{i18n.usage}}</p> + + {{#cpu.cores}} + <progress value="{{.}}" max="100"></progress> + {{/cpu.cores}} + </div> +</div> + +<div class="section memory"> + <div class="label"> + <h3 class="title">{{i18n.memory}}</h3> + + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48" class="icon"> + <path d="M4 40h40v-8H4v8zm4-6h4v4H8v-4zM4 8v8h40V8H4zm8 6H8v-4h4v4zM4 28h40v-8H4v8zm4-6h4v4H8v-4z"/> + </svg> + </div> + + <div class="status"> + <p class="summary">{{ram.usage}} / {{ram.total}} {{i18n.in_use}}</p> + + <progress value="{{ram.usagePercent}}" max="100"></progress> + </div> +</div> + +<div class="section battery"> + <div class="label"> + <h3 class="title">{{i18n.battery}}</h3> + + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48" class="icon"> + <path d="M31.33 8H28V4h-8v4h-3.33C15.19 8 14 9.19 14 10.67v30.67c0 1.47 1.19 2.67 2.67 2.67h14.67c1.47 0 2.67-1.19 2.67-2.67V10.67C34 9.19 32.81 8 31.33 8z"/> + </svg> + </div> + + <div class="status"> + <p class="summary">{{battery.status}} ({{battery.percent}}%{{#battery.remaining}}, {{battery.remaining}} {{i18n.remaining}}{{/battery.remaining}})</p> + + <progress value="{{battery.percent}}" max="100"></progress> + </div> +</div> \ No newline at end of file diff --git a/app/templates/widgets/stocks/desc.hjs b/app/templates/widgets/stocks/desc.hjs index 98fb24ef..fd0b41a3 100644 --- a/app/templates/widgets/stocks/desc.hjs +++ b/app/templates/widgets/stocks/desc.hjs @@ -1,14 +1,3 @@ -The Stocks widget displays the latest prices and other information for given stock symbols.<br /> +Keep track of the latest prices and information on your stocks.<br /> <br /> -To select stock symbols:<br /> -<br /> -<ol> - <li>Install the widget in your preferred size</li> - <li>Hover over the widget and click the settings icon that appears</li> - <li>Enter the stock symbols in a comma-separated EXCHANGE:TICKER format</li> - <li>Click "Save"</li> -</ol> -Variations:<br /> -<br /> -Tiny: Displays the most recent trade price and a tooltip with the relative change.<br /> -Small: Displays the most recent trade absolute and relative prices, opening, high and low prices and the volume. Alternatively, if multiple stocks have been entered, displays a table of symbols, current prices and change amounts. \ No newline at end of file +After installation, go into the settings and enter your tickers. \ No newline at end of file diff --git a/app/templates/widgets/tasks/desc.hjs b/app/templates/widgets/tasks/desc.hjs index c26c774f..7acf6b50 100644 --- a/app/templates/widgets/tasks/desc.hjs +++ b/app/templates/widgets/tasks/desc.hjs @@ -1,5 +1,3 @@ -The Tasks widget displays one of your todo lists from Google Tasks.<br /> +Keep focused by displaying your todo lists from your Google Tasks account.<br /> <br /> -Items can be edited by clicking anywhere on the text and moved using the buttons once an item is being edited.<br /> -<br /> -<b>Please note that changes made while offline will not be saved or synced.</b> \ No newline at end of file +Click any item to edit, move, or delete it. This widget does not save changes that are made while offline. \ No newline at end of file diff --git a/app/templates/widgets/todo/desc.hjs b/app/templates/widgets/todo/desc.hjs index da5c822a..be5e1f77 100644 --- a/app/templates/widgets/todo/desc.hjs +++ b/app/templates/widgets/todo/desc.hjs @@ -1,12 +1,3 @@ -The To-do widget displays an editable list of to-do items with important and completed statuses.<br /> +Keep track of what you need to do with this simple to-do list.<br /> <br /> -To add an item:<br /> -<br /> -<ol> - <li>Install the widget in your preferred size</li> - <li>Hover over the widget and click the "Add Item" link that appears in the top right corner</li> - <li>At the bottom of your to-do list a new, blank, item will appear</li> -</ol> -To delete or reorder items use the buttons that appear on the right of the item when it is hovered over.<br /> -<br /> -There are no variations available for this widget. \ No newline at end of file +To add an item click the Add Item link in the top right corner of the widget. \ No newline at end of file diff --git a/app/templates/widgets/topsites/desc.hjs b/app/templates/widgets/topsites/desc.hjs index fdfe33fd..1af9ed6e 100644 --- a/app/templates/widgets/topsites/desc.hjs +++ b/app/templates/widgets/topsites/desc.hjs @@ -1,5 +1 @@ -The Top Sites widget displays a list of your most visited websites and pages as determined by Chrome.<br /> -<br /> -No setup is necessary for this widget.<br /> -<br /> -There are no variations available for this widget. \ No newline at end of file +This widget displays a list of your most visited websites and pages as determined by Chrome. \ No newline at end of file diff --git a/app/templates/widgets/traffic/desc.hjs b/app/templates/widgets/traffic/desc.hjs index 08f4198c..33de9356 100644 --- a/app/templates/widgets/traffic/desc.hjs +++ b/app/templates/widgets/traffic/desc.hjs @@ -1,15 +1,3 @@ -The Traffic widget displays the current time in traffic to either home or work depending on the time of day.<br /> +Keep up to date with the current time in traffic to either home or work.<br /> <br /> -Setup:<br /> -<br /> -<ol> - <li>Install the widget in your preferred size</li> - <li>Hover over the widget and click the settings icon that appears</li> - <li>Under the home and work address fields, enter your home and work addresses</li> - <li>Select a preferred method of transit, either Driving, Walking or Public Transit</li> - <li>Click "Save"</li> -</ol> -Variations:<br /> -<br /> -Tiny: Displays the current time to either home or work in an abbreviated form.<br /> -Small: Displays the current time to either home or work in a full form. \ No newline at end of file +After installation, enter your home and work addresses and when you leave. \ No newline at end of file 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 @@ -<div class="time">{{time}}</div> +<a href="https://www.google.com/maps/dir/{{fromEnc}}/{{toEnc}}"> + <div class="time">{{time}}</div> -<h2 class="dest">{{dest}}</h2> \ No newline at end of file + <h2 class="dest">{{dest}}</h2> +</a> \ No newline at end of file diff --git a/app/templates/widgets/translate/desc.hjs b/app/templates/widgets/translate/desc.hjs index 5b98a05a..8590558d 100644 --- a/app/templates/widgets/translate/desc.hjs +++ b/app/templates/widgets/translate/desc.hjs @@ -1,5 +1 @@ -The translate widget offers live in-page translation for words, sentences and paragraphs in 80 languages.<br /> -<br /> -No setup is necessary for this widget.<br /> -<br /> -There are no variations available for this widget. \ No newline at end of file +Translate anything between 80 languages, right in your page, with this widget. \ No newline at end of file diff --git a/app/templates/widgets/twitter/desc.hjs b/app/templates/widgets/twitter/desc.hjs index a29d3f8d..4f939379 100644 --- a/app/templates/widgets/twitter/desc.hjs +++ b/app/templates/widgets/twitter/desc.hjs @@ -1,10 +1,3 @@ -The Twitter widget displays tweets from either your home stream or a list of your choice. Alternatively, it can display tweets you've been mentioned in or tweets of yours that have been retweeted.<br /> +Use this widget to keep track of what's going on on Twitter, and who's mentioned you.<br /> <br /> -Setup:<br /> -<br /> -<ol> - <li>Install the widget in your preferred size</li> - <li>Click the large Authorize button that is shown in the widget</li> - <li>After the window opens on Twitter, accept and click Authorize</li> -</ol> -There are no variations available for this widget. \ No newline at end of file +You'll need to grant access to your account after installation by clicking the Authorize button. \ No newline at end of file diff --git a/app/templates/widgets/unread/desc.hjs b/app/templates/widgets/unread/desc.hjs index c10a0e04..92c27abd 100644 --- a/app/templates/widgets/unread/desc.hjs +++ b/app/templates/widgets/unread/desc.hjs @@ -1,16 +1,3 @@ -The Unread widget displays the current number of unread emails in your Gmail inbox.<br /> +Use this widget to keep track of your unread emails in Gmail.<br /> <br /> -<b>Please note that this widget can't pull an unread message count from your inbox if you aren't signed in.</b><br /> -<br /> -No setup is required for this widget, however you can follow these steps to select an alternate email account:<br /> -<br /> -<ol> - <li>Install the widget in your preferred size</li> - <li>Hover over the widget and click the settings icon that appears</li> - <li>Enter an account ID (an explanation is available under the question mark icon)</li> - <li>Click "Save"</li> -</ol> -Variations:<br /> -<br /> -Tiny: Displays the current number of unread messages in your Gmail account in a compressed format.<br /> -Small: Displays the current number of unread messages in your Gmail account in an expanded format. \ No newline at end of file +Please note that you'll need to be signed in for this widget to get your unread messages. \ No newline at end of file diff --git a/app/templates/widgets/voice/desc.hjs b/app/templates/widgets/voice/desc.hjs index 0169ee92..05d45a05 100644 --- a/app/templates/widgets/voice/desc.hjs +++ b/app/templates/widgets/voice/desc.hjs @@ -1,14 +1,3 @@ -The Voice widget displays the current number of missed calls and unread text messages in your Google Voice account.<br /> +Use this widget to keep track of your missed calls and text messages in Google Voice.<br /> <br /> -No setup is required for this widget, however you can follow these steps to select an alternate Google account:<br /> -<br /> -<ol> - <li>Install the widget in your preferred size</li> - <li>Hover over the widget and click the settings icon that appears</li> - <li>Enter an account ID (an explanation is available under the question mark icon)</li> - <li>Click "Save"</li> -</ol> -Variations:<br /> -<br /> -Tiny: Displays the current number of missed calls and unread text messages in a compressed format.<br /> -Small: Displays the current number of missed calls and unread text messages in an expanded format. \ No newline at end of file +Please note that this widget can't get your missed calls and messages if you aren't signed in. \ No newline at end of file diff --git a/app/templates/widgets/weather/desc.hjs b/app/templates/widgets/weather/desc.hjs index 281b39ec..7f60220b 100644 --- a/app/templates/widgets/weather/desc.hjs +++ b/app/templates/widgets/weather/desc.hjs @@ -1,15 +1 @@ -The Weather widget displays the current weather and forecast for the next 4 days.<br /> -<br /> -Setup:<br /> -<br /> -<ol> - <li>Install the widget in your preferred size</li> - <li>Hover over the widget and click the settings icon that appears</li> - <li>Enter your location</li> - <li>Click "Save"</li> -</ol> -Variations:<br /> -<br /> -Tiny: Displays the current temperature and a conditions tooltip.<br /> -Small: Displays the current temperature, conditions, wind, humidity and the "Feels Like" temperature.<br /> -Medium: Displays all of the above plus the conditions, high and low for the next 5 days. \ No newline at end of file +Use this widget to display the weather and a forecast for the next 4 days on your page. After installation, enter your location in the settings. \ No newline at end of file diff --git a/app/templates/widgets/wolfram/desc.hjs b/app/templates/widgets/wolfram/desc.hjs index e43af407..7e3f9d6d 100644 --- a/app/templates/widgets/wolfram/desc.hjs +++ b/app/templates/widgets/wolfram/desc.hjs @@ -1,9 +1 @@ -The Wolfram|Alpha widget displays a Wolfram|Alpha search box.<br /> -<br /> -Wolfram|Alpha is a computational knowledge engine developed by Wolfram Research.<br /> -<br /> -It is an online service that answers factual queries directly by computing the answer from externally sourced "curated data", rather than providing a list of documents or web pages that might contain the answer as a search engine might. (Source: <a href="http://en.wikipedia.org/wiki/Wolfram_alpha">Wikipedia</a>)<br /> -<br /> -No setup is necessary for this widget.<br /> -<br /> -There are no variations available for this widget. \ No newline at end of file +Use this widget to display a Wolfram|Alpha search box on your page. \ No newline at end of file diff --git a/app/templates/widgets/youtube/desc.hjs b/app/templates/widgets/youtube/desc.hjs index f135b9b8..ef2254cf 100644 --- a/app/templates/widgets/youtube/desc.hjs +++ b/app/templates/widgets/youtube/desc.hjs @@ -1,7 +1,3 @@ -The YouTube widget displays a searchbox and videos from either the worldwide "Popular on YouTube" channel or a specified username.<br /> +Use this widget to keep track of what's popular on YouTube, or a channel's recent uploads.<br /> <br /> -You can choose for videos to be displayed as one large video, optionally with 2 or 4 small ones or 4/6 small videos.<br /> -<br /> -No setup is necessary for this widget.<br /> -<br /> -There are no variations available for this widget. \ No newline at end of file +After installation, go into the settings to choose how you see videos. \ 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 diff --git a/app/widgets/clock.js b/app/widgets/clock.js index 6c7fa9fb..bf7249d1 100644 --- a/app/widgets/clock.js +++ b/app/widgets/clock.js @@ -1,12 +1,443 @@ /* * 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 = '<div class="time', + dt = new Date(); + + if (this.config.timezone !== "auto") { + dt = new Date(dt.getTime() + dt.getTimezoneOffset() * 60000 + parseInt(this.config.timezone) * 60000); + } + + var hours = dt.getHours(), + minutes = dt.getMinutes(), + seconds = dt.getSeconds(), + am = hours < 12; + + if (this.config.format.indexOf("ampm") === 0) { + hours = (hours > 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 += "<span>" + (this.config.format == "ampm" ? seconds.pad() : "") + "</span></div>"; + } + 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 += '</div><div class="date">' + date + "</div>"; + } + + 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 formatted, + time = (this.data.timer.start + this.data.timer.duration) - new Date().getTime(); + + if (time <= 0) { + 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 { + 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 formatted, + time = this.data.alarm.time - new Date().getTime(); + + if (this.data.alarm.time <= new Date().getTime()) { + 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 { + 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 = 0.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); + + + var data; + + 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); + } + + 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); + } + + 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 +509,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 = '<div class="time', - dt = new Date(); - - if (this.config.timezone !== "auto") { - dt = new Date(dt.getTime() + dt.getTimezoneOffset() * 60000 + parseInt(this.config.timezone) * 60000); - } - - var hours = dt.getHours(), - minutes = dt.getMinutes(), - seconds = dt.getSeconds(), - am = hours < 12; - - if (this.config.format.indexOf("ampm") === 0) { - hours = (hours > 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 += "<span>" + (this.config.format == "ampm" ? seconds.pad() : "") + "</span></div>"; - } - 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 += '</div><div class="date">' + date + "</div>"; - } - - 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 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)) { 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 diff --git a/app/widgets/sitelink.js b/app/widgets/sitelink.js new file mode 100644 index 00000000..8714830c --- /dev/null +++ b/app/widgets/sitelink.js @@ -0,0 +1,63 @@ +/* + * Site Link + */ +define(["lodash"], function(_) { + return { + id: 38, + size: 1, + nicename: "sitelink", + sizes: ["tiny", "medium"], + settings: [ + { + type: "text", + nicename: "title", + label: "i18n.settings.title", + placeholder: "i18n.settings.title_placeholder" + }, + { + type: "size" + }, + { + type: "text", + nicename: "link", + label: "i18n.settings.link", + placeholder: "i18n.settings.link_placeholder" + }, + { + type: "text", + nicename: "image", + label: "i18n.settings.image", + placeholder: "i18n.settings.image_placeholder" + }, + { + type: "color", + label: "i18n.settings.color", + nicename: "color" + }, + { + type: "select", + nicename: "style", + label: "i18n.settings.style", + options: { + fill: "i18n.settings.style_fill", + center: "i18n.settings.style_center" + } + }, + ], + config: { + size: "tiny", + style: "center", + color: "#E62D27", + title: "YouTube", + link: "https://www.youtube.com/", + image: "/images/sitelink_demo.png" + }, + render: function() { + var data = _.clone(this.config); + + data.hasIcon = data.image || data.color; + + this.utils.render(data); + } + }; +}); \ No newline at end of file diff --git a/app/widgets/stats.js b/app/widgets/stats.js new file mode 100644 index 00000000..583df119 --- /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 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"); } diff --git a/package.json b/package.json index 5b572282..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" }, @@ -24,7 +24,7 @@ "grunt-hogan": "^0.3.0", "grunt-string-replace": "^1.0.0", "hogan.js": "^3.0.2", - "jshint-stylish": "^1.0.1", + "jshint-stylish": "^2.0.0", "lodash": "^3.3.1" } }