diff --git a/.docker/dev/nginx/ssl.sh b/.docker/dev/nginx/ssl.sh old mode 100644 new mode 100755 diff --git a/.docker/release/files/usr/local/include/application.ini b/.docker/release/files/usr/local/include/application.ini index a235178f5..14ca29e46 100644 --- a/.docker/release/files/usr/local/include/application.ini +++ b/.docker/release/files/usr/local/include/application.ini @@ -304,5 +304,5 @@ dev_email = "" dev_password = "" [version] -current = "2.17.0" +current = "2.17.4" saved = "Fri, 04 Mar 2022 08:55:26 +0000" diff --git a/LICENSE b/LICENSE index 2def0e883..dba13ed2d 100644 --- a/LICENSE +++ b/LICENSE @@ -658,4 +658,4 @@ specific requirements. You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU AGPL, see -. \ No newline at end of file +. diff --git a/Makefile b/Makefile index 22871b0e8..bc1bc3eab 100644 --- a/Makefile +++ b/Makefile @@ -61,8 +61,6 @@ rl-watch-js: rl-build: @docker compose run --no-deps --rm node gulp all -rl-build-pro: - @docker compose run --no-deps --rm node gulp all --pro yarn-install: @docker compose run --no-deps --rm node yarn install diff --git a/README.md b/README.md index fc47ef358..d9c4521bc 100644 --- a/README.md +++ b/README.md @@ -35,7 +35,7 @@ And don't forget to read the [RainLoop documentation](https://www.rainloop.net/d http://www.gnu.org/licenses/agpl-3.0.html Copyright (c) 2020 - 2022 SnappyMail -Copyright (c) 2013 - 2021 RainLoop +Copyright (c) 2013 - 2022 RainLoop ## Modifications @@ -93,11 +93,11 @@ This fork of RainLoop has the following changes: This fork uses downsized/simplified versions of scripts and has no support for Internet Explorer nor Edge Legacy. Supported are: -* Chrome 69+ -* Edge 79+ +* Chrome 80+ +* Edge 80+ * Firefox 78+ -* Opera 56+ -* Safari 12+ +* Opera 67+ +* Safari 13.1+ ### Removal of old JavaScript @@ -136,30 +136,30 @@ The result is faster and smaller download code (good for mobile networks). * Removed ProgressJS -RainLoop 1.15 vs SnappyMail +RainLoop 1.17 vs SnappyMail |js/* |RainLoop |Snappy | |--------------- |--------: |--------: | -|admin.js |2.158.025 | 80.521 | -|app.js |4.215.733 | 404.700 | -|boot.js | 672.433 | 2.050 | -|libs.js | 647.679 | 197.160 | -|sieve.js | 0 | 86.362 | -|polyfills.js | 325.908 | 0 | +|admin.js |2.170.153 | 81.750 | +|app.js |4.207.787 | 404.253 | +|boot.js | 868.735 | 2.050 | +|libs.js | 658.812 | 197.270 | +|sieve.js | 0 | 86.196 | +|polyfills.js | 334.608 | 0 | |serviceworker.js | 0 | 285 | -|TOTAL |8.019.778 | 771.078 | +|TOTAL |8.240.095 | 771.804 | |js/min/* |RainLoop |Snappy |RL gzip |SM gzip |RL brotli |SM brotli | |--------------- |--------: |--------: |------: |------: |--------: |--------: | -|admin.min.js | 255.514 | 40.289 | 73.899 | 13.383 | 60.674 | 11.971 | -|app.min.js | 516.000 | 191.607 |140.430 | 62.036 |110.657 | 53.258 | -|boot.min.js | 66.456 | 1.252 | 22.553 | 778 | 20.043 | 628 | -|libs.min.js | 574.626 | 95.110 |177.280 | 35.149 |151.855 | 31.461 | -|sieve.min.js | 0 | 42.091 | 0 | 10.543 | 0 | 9.511 | -|polyfills.min.js | 32.608 | 0 | 11.315 | 0 | 10.072 | 0 | -|TOTAL user |1.189.690 | 287.969 |351.061 | 97.963 |292.627 | 85.347 | -|TOTAL user+sieve |1.189.690 | 330.060 |351.061 |108.506 |292.627 | 94.858 | -|TOTAL admin | 929.204 | 136.651 |285.047 | 49.310 |242.644 | 44.060 | +|admin.min.js | 256.831 | 40.814 | 73.606 | 13.591 | 60.877 | 12.166 | +|app.min.js | 515.367 | 190.898 |139.456 | 61.959 |110.485 | 53.232 | +|boot.min.js | 84.659 | 1.252 | 26.998 | 778 | 23.643 | 628 | +|libs.min.js | 584.772 | 95.026 |180.901 | 35.140 |155.182 | 31.455 | +|sieve.min.js | 0 | 41.963 | 0 | 10.494 | 0 | 9.460 | +|polyfills.min.js | 32.837 | 0 | 11.406 | 0 | 10.175 | 0 | +|TOTAL user |1.217.635 | 287.176 |358.761 | 97.877 |299.485 | 85.315 | +|TOTAL user+sieve |1.217.635 | 329.139 |358.761 |108.371 |299.485 | 94.775 | +|TOTAL admin | 959.099 | 137.092 |292.911 | 49.509 |249.877 | 44.249 | For a user its around 70% smaller and faster than traditional RainLoop. @@ -187,12 +187,12 @@ For a user its around 70% smaller and faster than traditional RainLoop. |css/* |RainLoop |Snappy |RL gzip |SM gzip |SM brotli | |------------ |-------: |------: |------: |------: |--------: | -|app.css | 340.334 | 82.180 | 46.959 | 16.944 | 14.591 | -|app.min.css | 274.791 | 66.070 | 39.618 | 15.014 | 13.212 | +|app.css | 340.331 | 81.838 | 46.946 | 16.907 | 14.541 | +|app.min.css | 274.947 | 65.769 | 39.647 | 14.962 | 13.163 | |boot.css | | 1.326 | | 664 | 545 | |boot.min.css | | 1.071 | | 590 | 474 | -|admin.css | | 29.828 | | 6.777 | 5.875 | -|admin.min.css | | 23.991 | | 6.156 | 5.419 | +|admin.css | | 29.721 | | 6.762 | 5.867 | +|admin.min.css | | 23.880 | | 6.124 | 5.382 | ### PGP RainLoop uses the old OpenPGP.js v2 diff --git a/build/plugins.php b/build/plugins.php index 36fcc1f7a..5c34bb38f 100755 --- a/build/plugins.php +++ b/build/plugins.php @@ -2,8 +2,15 @@ define('ROOT_DIR', dirname(__DIR__)); define('PLUGINS_DEST_DIR', __DIR__ . '/dist/releases/plugins'); -$destPath = __DIR__ . 'build/dist/releases/plugins/'; is_dir(PLUGINS_DEST_DIR) || mkdir(PLUGINS_DEST_DIR, 0777, true); +$files = new RecursiveIteratorIterator( + new RecursiveDirectoryIterator(PLUGINS_DEST_DIR, RecursiveDirectoryIterator::SKIP_DOTS), + RecursiveIteratorIterator::CHILD_FIRST +); +foreach ($files as $fileinfo) { + $fileinfo->isDir() || unlink($fileinfo->getRealPath()); +} + $manifest = []; require ROOT_DIR . '/snappymail/v/0.0.0/app/libraries/RainLoop/Plugins/AbstractPlugin.php'; $keys = [ @@ -38,8 +45,6 @@ foreach (glob(ROOT_DIR . '/plugins/*', GLOB_NOSORT | GLOB_ONLYDIR) as $dir) { $manifest_item['type'] = 'plugin'; $manifest_item['id'] = $name; $manifest_item['file'] = "plugins/{$name}-{$version}.tgz"; - ksort($manifest_item); - $manifest[$name] = $manifest_item; $tar_destination = PLUGINS_DEST_DIR . "/{$name}-{$version}.tar"; $tgz_destination = PLUGINS_DEST_DIR . "/{$name}-{$version}.tgz"; @unlink($tgz_destination); @@ -58,6 +63,13 @@ foreach (glob(ROOT_DIR . '/plugins/*', GLOB_NOSORT | GLOB_ONLYDIR) as $dir) { unlink($phar_destination); rename("{$phar_destination}.gz", $phar_destination); } + if (isset($options['sign'])) { + passthru('gpg --local-user 1016E47079145542F8BA133548208BA13290F3EB --armor --detach-sign '.escapeshellarg($tgz_destination), $return_var); + $manifest_item['pgp_sig'] = trim(preg_replace('/-----(BEGIN|END) PGP SIGNATURE-----/', '', file_get_contents($tgz_destination.'.asc'))); + } + ksort($manifest_item); + $manifest[$name] = $manifest_item; + } else { echo "- {$name} {$version}\n"; } diff --git a/dev/App/User.js b/dev/App/User.js index 58f65c737..2419d86c7 100644 --- a/dev/App/User.js +++ b/dev/App/User.js @@ -24,7 +24,6 @@ import { import { UNUSED_OPTION_VALUE } from 'Common/Consts'; import { - MessageFlagsCache, getFolderInboxName, getFolderFromCacheList } from 'Common/Cache'; @@ -60,11 +59,11 @@ import { FolderSystemPopupView } from 'View/Popup/FolderSystem'; import { AskPopupView } from 'View/Popup/Ask'; import { + folderInformation, folderInformationMultiply, refreshFoldersInterval, messagesMoveHelper, - messagesDeleteHelper, - fetchFolderInformation + messagesDeleteHelper } from 'Common/Folders'; import { loadFolders } from 'Model/FolderCollection'; @@ -216,51 +215,7 @@ export class AppUser extends AbstractApp { * @param {Array=} list = [] */ folderInformation(folder, list) { - if (folder && folder.trim()) { - fetchFolderInformation( - (iError, data) => { - if (!iError && data.Result) { - const result = data.Result, - folderFromCache = getFolderFromCacheList(result.Folder); - if (folderFromCache) { - const oldHash = folderFromCache.hash, - unreadCountChange = (folderFromCache.unreadEmails() !== result.unreadEmails); - -// folderFromCache.revivePropertiesFromJson(result); - folderFromCache.expires = Date.now(); - folderFromCache.uidNext = result.UidNext; - folderFromCache.hash = result.Hash; - folderFromCache.totalEmails(result.totalEmails); - folderFromCache.unreadEmails(result.unreadEmails); - - if (unreadCountChange) { - MessageFlagsCache.clearFolder(folderFromCache.fullName); - } - - if (result.MessagesFlags.length) { - result.MessagesFlags.forEach(message => - MessageFlagsCache.setFor(folderFromCache.fullName, message.Uid.toString(), message.Flags) - ); - - MessagelistUserStore.reloadFlagsAndCachedMessage(); - } - - MessagelistUserStore.notifyNewMessages(folderFromCache.fullName, result.NewMessages); - - if (!oldHash || unreadCountChange || result.Hash !== oldHash) { - if (folderFromCache.fullName === FolderUserStore.currentFolderFullName()) { - MessagelistUserStore.reload(); - } else if (getFolderInboxName() === folderFromCache.fullName) { - Remote.messageList(null, {Folder: getFolderInboxName()}, true); - } - } - } - } - }, - folder, - list - ); - } + folderInformation(folder, list); } logout() { @@ -309,9 +264,9 @@ export class AppUser extends AbstractApp { setInterval(() => { const cF = FolderUserStore.currentFolderFullName(), iF = getFolderInboxName(); - this.folderInformation(iF); + folderInformation(iF); if (iF !== cF) { - this.folderInformation(cF); + folderInformation(cF); } folderInformationMultiply(); }, refreshFoldersInterval); @@ -323,7 +278,7 @@ export class AppUser extends AbstractApp { setTimeout(() => { const cF = FolderUserStore.currentFolderFullName(); if (getFolderInboxName() !== cF) { - this.folderInformation(cF); + folderInformation(cF); } FolderUserStore.hasCapability('LIST-STATUS') || folderInformationMultiply(true); }, 1000); diff --git a/dev/Common/Audio.js b/dev/Common/Audio.js index 4d7d5a862..2a34fc6d0 100644 --- a/dev/Common/Audio.js +++ b/dev/Common/Audio.js @@ -4,7 +4,7 @@ import { addObservablesTo } from 'External/ko'; let notificator = null, player = null, - canPlay = type => player && !!player.canPlayType(type).replace('no', ''), + canPlay = type => !!player?.canPlayType(type).replace('no', ''), audioCtx = window.AudioContext || window.webkitAudioContext, @@ -92,7 +92,7 @@ export const SMAudio = new class { } pause() { - player && player.pause(); + player?.pause(); fireEvent('audio.stop'); } diff --git a/dev/Common/Cache.js b/dev/Common/Cache.js index 3e7ff57b6..c0d9cc9c8 100644 --- a/dev/Common/Cache.js +++ b/dev/Common/Cache.js @@ -37,8 +37,7 @@ export const * @param {string} folderHash * @returns {string} */ - getFolderFullName = folderHash => - folderHash && FOLDERS_NAME_CACHE[folderHash] ? FOLDERS_NAME_CACHE[folderHash] : '', + getFolderFullName = folderHash => (folderHash && FOLDERS_NAME_CACHE[folderHash]) || '', /** * @param {string} folderHash @@ -79,9 +78,7 @@ export class MessageFlagsCache * @returns {bool} */ static hasFlag(folderFullName, uid, flag) { - return MESSAGE_FLAGS_CACHE[folderFullName] - && MESSAGE_FLAGS_CACHE[folderFullName][uid] - && MESSAGE_FLAGS_CACHE[folderFullName][uid].includes(flag); + return MESSAGE_FLAGS_CACHE[folderFullName]?.[uid]?.includes(flag); } /** @@ -90,7 +87,7 @@ export class MessageFlagsCache * @returns {?Array} */ static getFor(folderFullName, uid) { - return MESSAGE_FLAGS_CACHE[folderFullName] && MESSAGE_FLAGS_CACHE[folderFullName][uid]; + return MESSAGE_FLAGS_CACHE[folderFullName]?.[uid]; } /** diff --git a/dev/Common/EnumsUser.js b/dev/Common/EnumsUser.js index 142ee27b5..178bdc773 100644 --- a/dev/Common/EnumsUser.js +++ b/dev/Common/EnumsUser.js @@ -76,7 +76,6 @@ export const ClientSideKeyNameExpandedFolders = 3, ClientSideKeyNameFolderListSize = 4, ClientSideKeyNameMessageListSize = 5, - ClientSideKeyNameLastReplyAction = 6, ClientSideKeyNameLastSignMe = 7, ClientSideKeyNameMessageHeaderFullInfo = 9, ClientSideKeyNameMessageAttachmentControls = 10; diff --git a/dev/Common/File.js b/dev/Common/File.js index aab390c4d..9cf850106 100644 --- a/dev/Common/File.js +++ b/dev/Common/File.js @@ -256,7 +256,7 @@ export const FileInfo = { .map(item => item ? FileInfo.getIconClass(FileInfo.getExtension(item.fileName), item.mimeType) : '') .validUnique(); - return (icons && 1 === icons.length && 'icon-file' !== icons[0]) + return (1 === icons?.length && 'icon-file' !== icons[0]) ? icons[0] : 'icon-attachment'; } diff --git a/dev/Common/Folders.js b/dev/Common/Folders.js index 85eff9d29..86f77451b 100644 --- a/dev/Common/Folders.js +++ b/dev/Common/Folders.js @@ -56,7 +56,7 @@ fetchFolderInformation = (fCallback, folder, list = []) => { Remote.request('FolderInformation', fCallback, { Folder: folder, FlagsUids: uids, - UidNext: (folderFromCache && folderFromCache.uidNext) || 0 // Used to check for new messages + UidNext: folderFromCache?.uidNext || 0 // Used to check for new messages }); } else if (SettingsUserStore.useThreads()) { MessagelistUserStore.reloadFlagsAndCachedMessage(); @@ -129,6 +129,58 @@ folderListOptionsBuilder = ( // Every 5 minutes refreshFoldersInterval = 300000, +/** + * @param {string} folder + * @param {Array=} list = [] + */ +folderInformation = (folder, list) => { + if (folder?.trim()) { + fetchFolderInformation( + (iError, data) => { + if (!iError && data.Result) { + const result = data.Result, + folderFromCache = getFolderFromCacheList(result.Folder); + if (folderFromCache) { + const oldHash = folderFromCache.hash, + unreadCountChange = (folderFromCache.unreadEmails() !== result.unreadEmails); + +// folderFromCache.revivePropertiesFromJson(result); + folderFromCache.expires = Date.now(); + folderFromCache.uidNext = result.UidNext; + folderFromCache.hash = result.Hash; + folderFromCache.totalEmails(result.totalEmails); + folderFromCache.unreadEmails(result.unreadEmails); + + if (unreadCountChange) { + MessageFlagsCache.clearFolder(folderFromCache.fullName); + } + + if (result.MessagesFlags.length) { + result.MessagesFlags.forEach(message => + MessageFlagsCache.setFor(folderFromCache.fullName, message.Uid.toString(), message.Flags) + ); + + MessagelistUserStore.reloadFlagsAndCachedMessage(); + } + + MessagelistUserStore.notifyNewMessages(folderFromCache.fullName, result.NewMessages); + + if (!oldHash || unreadCountChange || result.Hash !== oldHash) { + if (folderFromCache.fullName === FolderUserStore.currentFolderFullName()) { + MessagelistUserStore.reload(); + } else if (getFolderInboxName() === folderFromCache.fullName) { + Remote.messageList(null, {Folder: getFolderInboxName()}, true); + } + } + } + } + }, + folder, + list + ); + } +}, + /** * @param {boolean=} boot = false */ @@ -162,7 +214,7 @@ folderInformationMultiply = (boot = false) => { } else if (unreadCountChange && folder.fullName === FolderUserStore.currentFolderFullName() && MessagelistUserStore.length) { - rl.app.folderInformation(folder.fullName, MessagelistUserStore()); + folderInformation(folder.fullName, MessagelistUserStore()); } } }); @@ -197,7 +249,7 @@ messagesMoveHelper = (fromFolderFullName, toFolderFullName, uidsForMove) => { isSpam = sSpamFolder === toFolderFullName, isHam = !isSpam && sSpamFolder === fromFolderFullName && getFolderInboxName() === toFolderFullName; - Remote.request('MessageMove', + Remote.abort('MessageList').request('MessageMove', moveOrDeleteResponseHelper, { FromFolder: fromFolderFullName, @@ -205,23 +257,17 @@ messagesMoveHelper = (fromFolderFullName, toFolderFullName, uidsForMove) => { Uids: uidsForMove.join(','), MarkAsRead: (isSpam || FolderUserStore.trashFolder() === toFolderFullName) ? 1 : 0, Learning: isSpam ? 'SPAM' : isHam ? 'HAM' : '' - }, - null, - '', - ['MessageList'] + } ); }, messagesDeleteHelper = (sFromFolderFullName, aUidForRemove) => { - Remote.request('MessageDelete', + Remote.abort('MessageList').request('MessageDelete', moveOrDeleteResponseHelper, { Folder: sFromFolderFullName, Uids: aUidForRemove.join(',') - }, - null, - '', - ['MessageList'] + } ); }, diff --git a/dev/Common/Globals.js b/dev/Common/Globals.js index 48f860880..22f4b4e94 100644 --- a/dev/Common/Globals.js +++ b/dev/Common/Globals.js @@ -31,7 +31,7 @@ export const new CustomEvent(name, {detail:detail, cancelable: !!cancelable}) ), - formFieldFocused = () => doc.activeElement && doc.activeElement.matches('input,textarea'), + formFieldFocused = () => doc.activeElement?.matches('input,textarea'), addShortcut = (...args) => shortcuts.add(...args), diff --git a/dev/Common/Html.js b/dev/Common/Html.js index dafb0991a..30df92788 100644 --- a/dev/Common/Html.js +++ b/dev/Common/Html.js @@ -1,6 +1,5 @@ -import { createElement, SettingsGet } from 'Common/Globals'; +import { createElement } from 'Common/Globals'; import { forEachObjectEntry, pInt } from 'Common/Utils'; -import { proxy } from 'Common/Links'; const tpl = createElement('template'), @@ -29,7 +28,7 @@ export const * @param {string} text * @returns {string} */ - encodeHtml = text => (text && text.toString ? text.toString() : '' + text).replace(htmlre, m => htmlmap[m]), + encodeHtml = text => (text?.toString?.() || '' + text).replace(htmlre, m => htmlmap[m]), /** * Clears the Message Html for viewing @@ -39,7 +38,6 @@ export const cleanHtml = (html, oAttachments, removeColors) => { const debug = false, // Config()->Get('debug', 'enable', false); - useProxy = !!SettingsGet('UseLocalProxyForExternalImages'), detectHiddenImages = true, // !!SettingsGet('try_to_detect_hidden_images'), result = { @@ -49,7 +47,7 @@ export const findAttachmentByCid = cid => oAttachments.findByCid(cid), findLocationByCid = cid => { const attachment = findAttachmentByCid(cid); - return attachment && attachment.contentLocation ? attachment : 0; + return attachment?.contentLocation ? attachment : 0; }, // convert body attributes to CSS @@ -100,7 +98,7 @@ export const 'BGSOUND','KEYGEN','SOURCE','OBJECT','EMBED','APPLET','IFRAME','FRAME','FRAMESET','VIDEO','AUDIO','AREA','MAP' ], nonEmptyTags = [ - 'A','B','EM','I','SPAN','STRONG','TABLE' + 'A','B','EM','I','SPAN','STRONG' ]; tpl.innerHTML = html @@ -138,7 +136,7 @@ export const } // if (['CENTER','FORM'].includes(name)) { if ('FORM' === name || 'O:P' === name || (nonEmptyTags.includes(name) && ('' == oElement.textContent.trim()))) { - replaceWithChildren(oElement); + ('A' !== name || !oElement.querySelector('IMG')) && replaceWithChildren(oElement); return; } /* @@ -229,52 +227,58 @@ export const value = getAttribute('src'); delAttribute('src'); - let attachment; - - if (detectHiddenImages - && 'IMG' === name - && (('' != getAttribute('height') && 3 > pInt(getAttribute('height'))) - || ('' != getAttribute('width') && 3 > pInt(getAttribute('width'))) - || [ - 'email.microsoftemail.com/open', - 'github.com/notifications/beacon/', - 'mandrillapp.com/track/open', - 'list-manage.com/track/open' - ].filter(uri => value.toLowerCase().includes(uri)).length - )) { - skipStyle = true; - setAttribute('style', 'display:none'); - setAttribute('data-x-hidden-src', value); - } - else if ((attachment = findLocationByCid(value))) - { - if (attachment.download) { - oElement.loading = 'lazy'; - oElement.src = attachment.linkPreview(); - attachment.isLinked(true); + if ('IMG' === name) { + let attachment; + if (detectHiddenImages + && (('' != getAttribute('height') && 3 > pInt(getAttribute('height'))) + || ('' != getAttribute('width') && 3 > pInt(getAttribute('width'))) + || [ + 'email.microsoftemail.com/open', + 'github.com/notifications/beacon/', + 'mandrillapp.com/track/open', + 'list-manage.com/track/open' + ].filter(uri => value.toLowerCase().includes(uri)).length + )) { + skipStyle = true; + setAttribute('style', 'display:none'); + setAttribute('data-x-src-hidden', value); } - } - else if ('cid:' === value.slice(0, 4)) - { - attachment = findAttachmentByCid(value.slice(4)); - if (attachment && attachment.download) { - oElement.src = attachment.linkPreview(); - attachment.isInline(true); - attachment.isLinked(true); + else if ((attachment = findLocationByCid(value))) + { + if (attachment.download) { + oElement.loading = 'lazy'; + oElement.src = attachment.linkPreview(); + attachment.isLinked(true); + } + } + else if ('cid:' === value.slice(0, 4)) + { + value = value.slice(4); + setAttribute('data-x-src-cid', value); + attachment = findAttachmentByCid(value); + if (attachment?.download) { + oElement.src = attachment.linkPreview(); + attachment.isInline(true); + attachment.isLinked(true); + } + } + else if (/^(https?:)?\/\//i.test(value)) + { + setAttribute('data-x-src', value); + result.hasExternals = true; + } + else if ('data:image/' === value.slice(0, 11)) + { + oElement.src = value; + } + else + { + setAttribute('data-x-src-broken', value); } - } - else if (/^(https?:)?\/\//i.test(value)) - { - setAttribute('data-x-src', useProxy ? proxy(value) : value); - result.hasExternals = true; - } - else if ('data:image/' === value.slice(0, 11)) - { - setAttribute('src', value); } else { - setAttribute('data-x-broken-src', value); + setAttribute('data-x-src-broken', value); } } @@ -316,14 +320,14 @@ export const let lowerUrl = found.toLowerCase(); if ('cid:' === lowerUrl.slice(0, 4)) { const attachment = findAttachmentByCid(found); - if (attachment && attachment.linkPreview && name) { + if (attachment?.linkPreview && name) { oStyle[property] = "url('" + attachment.linkPreview() + "')"; attachment.isInline(true); attachment.isLinked(true); } } else if (/^(https?:)?\/\//.test(lowerUrl)) { result.hasExternals = true; - urls_remote.push([property, useProxy ? proxy(found) : value]); + urls_remote.push([property, found]); } else if ('data:image/' === lowerUrl.slice(0, 11)) { oStyle[property] = value; } else { @@ -430,9 +434,8 @@ export const parent = node, ordered = 'OL' == node.tagName, i = 0; - while (parent && parent.parentNode && parent.parentNode.closest) { - parent = parent.parentNode.closest('ol,ul'); - parent && (prefix = ' ' + prefix); + while ((parent = parent?.parentNode?.closest('ol,ul'))) { + prefix = ' ' + prefix; } node.querySelectorAll(':scope > li').forEach(li => { li.prepend('\n' + prefix + (ordered ? `${++i}. ` : ' * ')); @@ -563,7 +566,7 @@ export class HtmlEditor { editor.on('focus', () => this.blurTimer && clearTimeout(this.blurTimer)); editor.on('mode', () => { this.blurTrigger(); - this.onModeChange && this.onModeChange(!this.isPlain()); + this.onModeChange?.(!this.isPlain()); }); } } @@ -571,7 +574,7 @@ export class HtmlEditor { blurTrigger() { if (this.onBlur) { clearTimeout(this.blurTimer); - this.blurTimer = setTimeout(() => this.onBlur && this.onBlur(), 200); + this.blurTimer = setTimeout(() => this.onBlur?.(), 200); } } @@ -681,7 +684,7 @@ export class HtmlEditor { hasFocus() { try { - return this.editor && !!this.editor.focusManager.hasFocus; + return !!this.editor?.focusManager.hasFocus; } catch (e) { return false; } diff --git a/dev/Common/Plugins.js b/dev/Common/Plugins.js index 694930c1f..ed0469ba8 100644 --- a/dev/Common/Plugins.js +++ b/dev/Common/Plugins.js @@ -49,10 +49,7 @@ export function runSettingsViewModelHooks(admin) { * @param {string} name * @returns {?} */ -rl.pluginSettingsGet = (pluginSection, name) => { - let plugins = SettingsGet('Plugins'); - plugins = plugins && null != plugins[pluginSection] ? plugins[pluginSection] : null; - return plugins ? (null == plugins[name] ? null : plugins[name]) : null; -}; +rl.pluginSettingsGet = (pluginSection, name) => + SettingsGet('Plugins')?.[pluginSection]?.[name]; rl.pluginPopupView = AbstractViewPopup; diff --git a/dev/Common/Selector.js b/dev/Common/Selector.js index f413fd76c..8d0921384 100644 --- a/dev/Common/Selector.js +++ b/dev/Common/Selector.js @@ -422,7 +422,7 @@ export class Selector { lineUid = ''; const uid = this.getItemUid(item); - if (event && event.shiftKey) { + if (event?.shiftKey) { if (uid && this.sLastUid && uid !== this.sLastUid) { list = this.list(); checked = item.checked(); diff --git a/dev/Common/Translator.js b/dev/Common/Translator.js index 852bd36d1..933f22302 100644 --- a/dev/Common/Translator.js +++ b/dev/Common/Translator.js @@ -142,7 +142,7 @@ export const * @param {Function=} langCallback = null */ initOnStartOrLangChange = (startCallback, langCallback = null) => { - startCallback && startCallback(); + startCallback?.(); startCallback && trigger.subscribe(startCallback); langCallback && trigger.subscribe(langCallback); }, diff --git a/dev/Common/Utils.js b/dev/Common/Utils.js index 98cc9cffd..862f4c9fc 100644 --- a/dev/Common/Utils.js +++ b/dev/Common/Utils.js @@ -26,8 +26,7 @@ export const .trim(), defaultOptionsAfterRender = (domItem, item) => - domItem && item && undefined !== item.disabled - && domItem.classList.toggle('disabled', domItem.disabled = item.disabled), + item && undefined !== item.disabled && domItem?.classList.toggle('disabled', domItem.disabled = item.disabled), // unescape(encodeURIComponent()) makes the UTF-16 DOMString to an UTF-8 string b64EncodeJSON = data => btoa(unescape(encodeURIComponent(JSON.stringify(data)))), diff --git a/dev/Common/UtilsUser.js b/dev/Common/UtilsUser.js index a45fee974..09a894194 100644 --- a/dev/Common/UtilsUser.js +++ b/dev/Common/UtilsUser.js @@ -131,7 +131,7 @@ computedPaginatorHelper = (koCurrentPage, koPageCount) => { * @returns {boolean} */ mailToHelper = mailToUrl => { - if (mailToUrl && 'mailto:' === mailToUrl.slice(0, 7).toLowerCase()) { + if ('mailto:' === mailToUrl?.slice(0, 7).toLowerCase()) { mailToUrl = mailToUrl.slice(7).split('?'); const @@ -181,7 +181,7 @@ setLayoutResizer = (source, target, sClientSideKeyName, mode) => target.removeAttribute('style'); source.removeAttribute('style'); } - source.observer && source.observer.disconnect(); + source.observer?.disconnect(); // source.classList.toggle('resizable', mode); if (mode) { const length = Local.get(sClientSideKeyName + mode) || SettingsGet('Resizer' + sClientSideKeyName + mode), @@ -248,7 +248,7 @@ setLayoutResizer = (source, target, sClientSideKeyName, mode) => } source.layoutResizer.mode = mode; source.layoutResizer.key = sClientSideKeyName; - source.observer && source.observer.observe(source, { box: 'border-box' }); + source.observer?.observe(source, { box: 'border-box' }); } }, @@ -266,7 +266,7 @@ populateMessageBody = (oMessage, preload) => { oMessage = preload ? oMessage : null; let isNew = false, - json = oData && oData.Result, + json = oData?.Result, message = oMessage || MessageUserStore.message(); if ( diff --git a/dev/Component/AbstractInput.js b/dev/Component/AbstractInput.js index 63a8830db..b262fab22 100644 --- a/dev/Component/AbstractInput.js +++ b/dev/Component/AbstractInput.js @@ -12,7 +12,7 @@ export class AbstractInput { this.value = params.value || ''; this.label = params.label || ''; this.enable = null == params.enable ? true : params.enable; - this.trigger = params.trigger && params.trigger.subscribe ? params.trigger : null; + this.trigger = params.trigger?.subscribe ? params.trigger : null; this.placeholder = params.placeholder || ''; this.labeled = null != params.label; diff --git a/dev/Component/EmailAddresses.js b/dev/Component/EmailAddresses.js index 316d06936..b176e5969 100644 --- a/dev/Component/EmailAddresses.js +++ b/dev/Component/EmailAddresses.js @@ -2,7 +2,7 @@ import { doc, createElement, addEventsListeners } from 'Common/Globals'; import { EmailModel } from 'Model/Email'; const contentType = 'snappymail/emailaddress', - getAddressKey = li => li && li.emailaddress && li.emailaddress.key; + getAddressKey = li => li?.emailaddress?.key; let dragAddress, datalist; @@ -19,7 +19,7 @@ export class EmailAddressesComponent { const self = this, // In Chrome we have no access to dataTransfer.getData unless it's the 'drop' event // In Chrome Mobile dataTransfer.types.includes(contentType) fails, only text/plain is set - validDropzone = () => dragAddress && dragAddress.li.parentNode !== self.ul, + validDropzone = () => dragAddress?.li.parentNode !== self.ul, fnDrag = e => validDropzone() && e.preventDefault(); self.element = element; @@ -116,7 +116,7 @@ export class EmailAddressesComponent { value, items => { self._resetDatalist(); - items && items.forEach(item => datalist.append(new Option(item))); + items?.forEach(item => datalist.append(new Option(item))); } ) } @@ -262,7 +262,7 @@ export class EmailAddressesComponent { if (v.obj) { let li = createElement('li',{title:v.obj.toLine(),draggable:'true'}), el = createElement('span'); - el.append(v.obj.toLine(true, false, true)); + el.append(v.obj.toLine(true)); li.append(el); el = createElement('a',{href:'#', class:'ficon'}); diff --git a/dev/External/SquireUI.js b/dev/External/SquireUI.js index a647e86a6..eb4c015f0 100644 --- a/dev/External/SquireUI.js +++ b/dev/External/SquireUI.js @@ -176,8 +176,8 @@ class SquireUI quote: { html: '"', cmd: () => { - let parent = this.getParentNodeName('UL,OL'); - (parent && 'BLOCKQUOTE' == parent) ? squire.decreaseQuoteLevel() : squire.increaseQuoteLevel(); + let parent = squire.getSelectionClosest('UL,OL,BLOCKQUOTE')?.nodeName; + ('BLOCKQUOTE' == parent) ? squire.decreaseQuoteLevel() : squire.increaseQuoteLevel(); }, hint: 'Blockquote' }, @@ -198,11 +198,10 @@ class SquireUI link: { html: '🔗', cmd: () => { - if ('A' === this.getParentNodeName()) { - squire.removeLink(); - } else { - let url = prompt("Link","https://"); - url != null && url.length && squire.makeLink(url); + let node = squire.getSelectionClosest('A'), + url = prompt("Link", node?.href || "https://"); + if (url != null) { + url.length ? squire.makeLink(url) : (node && squire.removeLink()); } }, hint: 'Link' @@ -210,12 +209,9 @@ class SquireUI imageUrl: { html: '🖼️', cmd: () => { - if ('IMG' === this.getParentNodeName()) { -// squire.removeLink(); - } else { - let src = prompt("Image","https://"); - src != null && src.length && squire.insertImage(src); - } + let node = squire.getSelectionClosest('IMG'), + src = prompt("Image", node?.src || "https://"); + src.length ? squire.insertImage(src) : (node && squire.detach(node)); }, hint: 'Image URL' }, @@ -385,15 +381,10 @@ class SquireUI this.squire.focus(); } - getParentNodeName(selector) { - let parent = this.squire.getSelectionClosest(selector); - return parent ? parent.nodeName : null; - } - doList(type) { - let parent = this.getParentNodeName('UL,OL'), + let parent = this.squire.getSelectionClosest('UL,OL')?.nodeName, fn = {UL:'makeUnorderedList',OL:'makeOrderedList'}; - (parent && parent == type) ? this.squire.removeList() : this.squire[fn[type]](); + (parent == type) ? this.squire.removeList() : this.squire[fn[type]](); } testPresenceinSelection(format, validation) { @@ -412,7 +403,7 @@ class SquireUI } this.mode = mode; // 'wysiwyg' or 'plain' cl.add('squire-mode-'+mode); - this.onModeChange && this.onModeChange(); + this.onModeChange?.(); setTimeout(()=>this.focus(),1); } } diff --git a/dev/External/User/ko.js b/dev/External/User/ko.js index a75a58d10..2ba6b78f7 100644 --- a/dev/External/User/ko.js +++ b/dev/External/User/ko.js @@ -14,8 +14,8 @@ const rlContentType = 'snappymail/action', // In Chrome we have no access to dataTransfer.getData unless it's the 'drop' event // In Chrome Mobile dataTransfer.types.includes(rlContentType) fails, only text/plain is set - dragMessages = () => dragData && 'messages' === dragData.action, - dragSortable = () => dragData && 'sortable' === dragData.action, + dragMessages = () => 'messages' === dragData?.action, + dragSortable = () => 'sortable' === dragData?.action, setDragAction = (e, action, effect, data, img) => { dragData = { action: action, @@ -45,8 +45,8 @@ Object.assign(ko.bindingHandlers, { let editor = null; const fValue = fValueAccessor(), - fUpdateEditorValue = () => fValue && fValue.__editor && fValue.__editor.setHtmlOrPlain(fValue()), - fUpdateKoValue = () => fValue && fValue.__editor && fValue(fValue.__editor.getDataWithHtmlMark()), + fUpdateEditorValue = () => fValue?.__editor?.setHtmlOrPlain(fValue()), + fUpdateKoValue = () => fValue?.__editor && fValue(fValue.__editor.getDataWithHtmlMark()), fOnReady = () => { fValue.__editor = editor; fUpdateEditorValue(); @@ -76,7 +76,7 @@ Object.assign(ko.bindingHandlers, { focused = fValue.focused; element.addresses = new EmailAddressesComponent(element, { - focusCallback: value => focused && focused(!!value), + focusCallback: value => focused?.(!!value), autoCompleteSource: fAllBindings.get('autoCompleteSource'), onChange: value => fValue(value) }); @@ -137,7 +137,7 @@ Object.assign(ko.bindingHandlers, { if (dragMessages()) { fnStop(e); element.classList.add('droppableHover'); - if (folder && folder.collapsed()) { + if (folder?.collapsed()) { dragTimer.start(() => { folder.collapsed(false); setExpandedFolder(folder.fullName, true); @@ -153,7 +153,7 @@ Object.assign(ko.bindingHandlers, { fnStop(e); if (dragMessages() && ['move','copy'].includes(e.dataTransfer.effectAllowed)) { let data = dragData.data; - if (folder && data && data.folder && isArray(data.uids)) { + if (folder && data?.folder && isArray(data.uids)) { moveMessagesToFolder(data.folder, data.uids, folder.fullName, data.copy && e.ctrlKey); } } @@ -220,7 +220,7 @@ Object.assign(ko.bindingHandlers, { options.list(arr); } dragData = null; - options.afterMove && options.afterMove(); + options.afterMove?.(); } } }); diff --git a/dev/External/ko.js b/dev/External/ko.js index dcdb5fa7d..7044ab55e 100644 --- a/dev/External/ko.js +++ b/dev/External/ko.js @@ -26,14 +26,14 @@ export const addSubscribablesTo = (target, subscribables) => forEachObjectEntry(subscribables, (key, fn) => target[key].subscribe(fn)), - dispose = disposable => disposable && isFunction(disposable.dispose) && disposable.dispose(), + dispose = disposable => isFunction(disposable?.dispose) && disposable.dispose(), // With this we don't need delegateRunOnDestroy koArrayWithDestroy = data => { data = ko.observableArray(data); data.subscribe(changes => changes.forEach(item => - 'deleted' === item.status && null == item.moved && item.value.onDestroy && item.value.onDestroy() + 'deleted' === item.status && null == item.moved && item.value.onDestroy?.() ) , data, 'arrayChange'); return data; @@ -172,12 +172,12 @@ ko.extenders.toggleSubscribeProperty = (target, options) => { const prop = options[1]; if (prop) { target.subscribe( - prev => prev && prev[prop] && prev[prop](false), + prev => prev?.[prop]?.(false), options[0], 'beforeChange' ); - target.subscribe(next => next && next[prop] && next[prop](true), options[0]); + target.subscribe(next => next?.[prop]?.(true), options[0]); } return target; diff --git a/dev/Knoin/AbstractModel.js b/dev/Knoin/AbstractModel.js index 95d0b2600..f98deade1 100644 --- a/dev/Knoin/AbstractModel.js +++ b/dev/Knoin/AbstractModel.js @@ -50,8 +50,7 @@ export class AbstractModel { // forEachObjectEntry(this, (key, value) => { forEachObjectValue(this, value => { /** clear CollectionModel */ - let arr = ko.isObservableArray(value) ? value() : value; - arr && arr.onDestroy && arr.onDestroy(); + (ko.isObservableArray(value) ? value() : value)?.onDestroy?.(); /** destroy ko.observable/ko.computed? */ // dispose(value); /** clear object value */ @@ -76,7 +75,7 @@ export class AbstractModel { */ static reviveFromJson(json) { let obj = this.validJson(json) ? new this() : null; - obj && obj.revivePropertiesFromJson(json); + obj?.revivePropertiesFromJson(json); return obj; } diff --git a/dev/Knoin/AbstractViews.js b/dev/Knoin/AbstractViews.js index 51ca41b72..d3722e216 100644 --- a/dev/Knoin/AbstractViews.js +++ b/dev/Knoin/AbstractViews.js @@ -128,7 +128,7 @@ export class AbstractViewSettings addSubscribablesTo(this, { [prop]: (value => { this[trigger](SaveSettingsStep.Animate); - valueCb && valueCb(value); + valueCb?.(value); rl.app.Remote.saveSetting(name, value, iError => { this[trigger](iError ? SaveSettingsStep.FalseResult : SaveSettingsStep.TrueResult); diff --git a/dev/Knoin/Knoin.js b/dev/Knoin/Knoin.js index 5196782f1..0ee9dba05 100644 --- a/dev/Knoin/Knoin.js +++ b/dev/Knoin/Knoin.js @@ -10,10 +10,7 @@ let defaultScreenName = ''; const - autofocus = dom => { - const af = dom.querySelector('[autofocus]'); - af && af.focus(); - }, + autofocus = dom => dom.querySelector('[autofocus]')?.focus(), visiblePopups = new Set, @@ -21,7 +18,7 @@ const * @param {string} screenName * @returns {?Object} */ - screen = screenName => screenName && null != SCREENS[screenName] ? SCREENS[screenName] : null, + screen = screenName => (screenName && SCREENS[screenName]) || null, /** * @param {Function} ViewModelClass @@ -77,10 +74,10 @@ const if (e.target === vmDom) { if (vmDom.classList.contains('animate')) { autofocus(vmDom); - vm.afterShow && vm.afterShow(); + vm.afterShow?.(); } else { vmDom.close(); - vm.afterHide && vm.afterHide(); + vm.afterHide?.(); } } }; @@ -101,7 +98,7 @@ const }); } else { visiblePopups.delete(vm); - vm.onHide && vm.onHide(); + vm.onHide?.(); vm.keyScope.unset(); vmDom.classList.remove('animate'); // trigger the transitions } @@ -118,7 +115,7 @@ const vm ); - vm.onBuild && vm.onBuild(vmDom); + vm.onBuild?.(vmDom); fireEvent('rl-view-model', vm); } else { @@ -142,10 +139,10 @@ const }, hideScreen = (screenToHide, destroy) => { - screenToHide.onHide && screenToHide.onHide(); + screenToHide.onHide?.(); forEachViewModel(screenToHide, (vm, dom) => { dom.hidden = true; - vm.onHide && vm.onHide(); + vm.onHide?.(); destroy && vm.viewModelDom.remove(); }); }, @@ -155,7 +152,7 @@ const * @returns {void} */ hideScreenPopup = ViewModelClassToHide => { - if (ViewModelClassToHide && ViewModelClassToHide.__vm && ViewModelClassToHide.__dom) { + if (ViewModelClassToHide?.__vm && ViewModelClassToHide?.__dom) { ViewModelClassToHide.__vm.modalVisible(false); } }, @@ -190,7 +187,7 @@ const } } - if (vmScreen && vmScreen.__started) { + if (vmScreen?.__started) { isSameScreen = currentScreen && vmScreen === currentScreen; if (!vmScreen.__builded) { @@ -200,7 +197,7 @@ const buildViewModel(ViewModelClass, vmScreen) ); - vmScreen.onBuild && vmScreen.onBuild(); + vmScreen.onBuild?.(); } setTimeout(() => { @@ -214,19 +211,19 @@ const // show screen if (!isSameScreen) { - vmScreen.onShow && vmScreen.onShow(); + vmScreen.onShow?.(); forEachViewModel(vmScreen, (vm, dom) => { - vm.beforeShow && vm.beforeShow(); + vm.beforeShow?.(); i18nToNodes(dom); dom.hidden = false; - vm.onShow && vm.onShow(); + vm.onShow?.(); autofocus(dom); }); } // -- - vmScreen.__cross && vmScreen.__cross.parse(subPart); + vmScreen.__cross?.parse(subPart); }, 1); } } @@ -248,11 +245,11 @@ export const if (vm) { params = params || []; - vm.beforeShow && vm.beforeShow(...params); + vm.beforeShow?.(...params); vm.modalVisible(true); - vm.onShow && vm.onShow(...params); + vm.onShow?.(...params); } }, @@ -295,7 +292,7 @@ export const const c = elementById('rl-content'), l = elementById('rl-loading'); c && (c.hidden = false); - l && l.remove(); + l?.remove(); }, /** diff --git a/dev/Mime/Parser.js b/dev/Mime/Parser.js index 59ed4c408..4fae1e482 100644 --- a/dev/Mime/Parser.js +++ b/dev/Mime/Parser.js @@ -8,12 +8,26 @@ export function ParseMime(text) { class MimePart { +/* + constructor() { + this.id = 0; + this.start = 0; + this.end = 0; + this.parts = []; + this.bodyStart = 0; + this.bodyEnd = 0; + this.boundary = ''; + this.bodyText = ''; + this.headers = {}; + } +*/ + header(name) { - return this.headers && this.headers[name]; + return this.headers[name]; } headerValue(name) { - return (this.header(name) || {value:null}).value; + return this.header(name)?.value; } get raw() { @@ -26,12 +40,21 @@ export function ParseMime(text) get body() { let body = this.bodyRaw, +// charset = this.header('content-type')?.params.charset, encoding = this.headerValue('content-transfer-encoding'); if ('quoted-printable' == encoding) { body = body.replace(/=\r?\n/g, '').replace(QPDecodeIn, QPDecodeOut); } else if ('base64' == encoding) { body = atob(body.replace(/\r?\n/g, '')); } +/* + try { + // https://developer.mozilla.org/en-US/docs/Web/API/Encoding_API/Encodings + return new TextDecoder(charset).decode(Uint8Array.from(body, c => c.charCodeAt(0))); +// return new TextDecoder(charset).decode(new TextEncoder().encode(body)); + } catch (e) { + } +*/ return body; } @@ -51,21 +74,17 @@ export function ParseMime(text) forEach(fn) { fn(this); - if (this.parts) { - this.parts.forEach(part => part.forEach(fn)); - } + this.parts.forEach(part => part.forEach(fn)); } getByContentType(type) { if (type == this.headerValue('content-type')) { return this; } - if (this.parts) { - let i = 0, p = this.parts, part; - for (i; i < p.length; ++i) { - if ((part = p[i].getByContentType(type))) { - return part; - } + let i = 0, p = this.parts, part; + for (i; i < p.length; ++i) { + if ((part = p[i].getByContentType(type))) { + return part; } } } @@ -73,18 +92,19 @@ export function ParseMime(text) const ParsePart = (mimePart, start_pos = 0, id = '') => { - let part = new MimePart; + let part = new MimePart, + headers = {}; if (id) { part.id = id; part.start = start_pos; part.end = start_pos + mimePart.length; } + part.parts = []; // get headers let head = mimePart.match(/^[\s\S]+?\r?\n\r?\n/); if (head) { head = head[0]; - let headers = {}; head.replace(/\r?\n\s+/g, ' ').split(/\r?\n/).forEach(header => { let match = header.match(/^([^:]+):\s*([^;]+)/), params = {}; @@ -96,7 +116,6 @@ export function ParseMime(text) params: params }; }); - part.headers = headers; // get body part.bodyStart = start_pos + head.length; @@ -106,7 +125,6 @@ export function ParseMime(text) let boundary = headers['content-type'].params.boundary; if (boundary) { part.boundary = boundary; - part.parts = []; let regex = new RegExp('(?:^|\r?\n)--' + boundary + '(?:--)?(?:\r?\n|$)', 'g'), body = mimePart.slice(head.length), bodies = body.split(regex), @@ -125,6 +143,8 @@ export function ParseMime(text) } } + part.headers = headers; + return part; }; diff --git a/dev/Model/AbstractCollection.js b/dev/Model/AbstractCollection.js index 85dd57449..919dc6154 100644 --- a/dev/Model/AbstractCollection.js +++ b/dev/Model/AbstractCollection.js @@ -12,7 +12,7 @@ export class AbstractCollectionModel extends Array } onDestroy() { - this.forEach(item => item.onDestroy && item.onDestroy()); + this.forEach(item => item.onDestroy?.()); } /** diff --git a/dev/Model/Email.js b/dev/Model/Email.js index 6502e105e..61b5ed2c5 100644 --- a/dev/Model/Email.js +++ b/dev/Model/Email.js @@ -1,4 +1,3 @@ -import { encodeHtml } from 'Common/Html'; import { AbstractModel } from 'Knoin/AbstractModel'; @@ -284,7 +283,7 @@ export class EmailModel extends AbstractModel { */ static reviveFromJson(json) { const email = super.reviveFromJson(json); - email && email.clearDuplicateName(); + email?.clearDuplicateName(); return email; } @@ -333,45 +332,13 @@ export class EmailModel extends AbstractModel { /** * @param {boolean} friendlyView = false - * @param {boolean=} wrapWithLink = false - * @param {boolean=} useEncodeHtml = false * @returns {string} */ - toLine(friendlyView, wrapWithLink, useEncodeHtml) { - let result = '', - toLink = (to, txt) => '' + encodeHtml(txt) + ''; - if (this.email) { - if (friendlyView && this.name) { - result = wrapWithLink - ? toLink( - encodeHtml(this.email) + '?to=' + encodeURIComponent('"' + this.name + '" <' + this.email + '>'), - this.name - ) - : (useEncodeHtml ? encodeHtml(this.name) : this.name); - } else { - result = this.email; - if (this.name) { - if (wrapWithLink) { - result = - encodeHtml('"' + this.name + '" <') - + toLink( - encodeHtml(this.email) + '?to=' + encodeURIComponent('"' + this.name + '" <' + this.email + '>'), - result - ) - + encodeHtml('>'); - } else { - result = '"' + this.name + '" <' + result + '>'; - if (useEncodeHtml) { - result = encodeHtml(result); - } - } - } else if (wrapWithLink) { - result = toLink(encodeHtml(this.email), this.email); - } - } - } - - return result; + toLine(friendlyView) { + let result = this.email; + return (result && this.name) + ? (friendlyView ? this.name : '"' + this.name + '" <' + result + '>') + : result; } static splitEmailLine(line) { @@ -384,7 +351,7 @@ export class EmailModel extends AbstractModel { ? new EmailModel(item.address.replace(/^[<]+(.*)[>]+$/g, '$1'), item.name || '') : null; - if (address && address.email) { + if (address?.email) { exists = true; } diff --git a/dev/Model/EmailCollection.js b/dev/Model/EmailCollection.js index a79feaa83..5e4744ef8 100644 --- a/dev/Model/EmailCollection.js +++ b/dev/Model/EmailCollection.js @@ -30,7 +30,7 @@ export class EmailCollectionModel extends AbstractCollectionModel toStringClear() { const result = []; this.forEach(email => { - if (email && email.email && email.name) { + if (email?.email && email?.name) { result.push(email.email); } }); diff --git a/dev/Model/FolderCollection.js b/dev/Model/FolderCollection.js index ec86891f8..bd303ca51 100644 --- a/dev/Model/FolderCollection.js +++ b/dev/Model/FolderCollection.js @@ -100,8 +100,8 @@ export const .post('Folders', FolderUserStore.foldersLoading) .then(data => { data = FolderCollectionModel.reviveFromJson(data.Result); - data && data.storeIt(); - fCallback && fCallback(true); + data?.storeIt(); + fCallback?.(true); // Repeat every 15 minutes? // this.foldersTimeout = setTimeout(loadFolders, 900000); }) @@ -128,7 +128,7 @@ export class FolderCollectionModel extends AbstractCollectionModel */ static reviveFromJson(object) { const expandedFolders = Local.get(ClientSideKeyNameExpandedFolders); - if (object && object.SystemFolders) { + if (object?.SystemFolders) { forEachObjectEntry(SystemFolders, key => SystemFolders[key] = SettingsGet(key+'Folder') || object.SystemFolders[FolderType[key]] ); diff --git a/dev/Model/Message.js b/dev/Model/Message.js index 4c19e1826..38ef408bb 100644 --- a/dev/Model/Message.js +++ b/dev/Model/Message.js @@ -3,10 +3,10 @@ import ko from 'ko'; import { MessagePriority } from 'Common/EnumsUser'; import { i18n } from 'Common/Translator'; -import { doc } from 'Common/Globals'; +import { doc, SettingsGet } from 'Common/Globals'; import { encodeHtml, plainToHtml, cleanHtml } from 'Common/Html'; import { isArray, arrayLength, forEachObjectEntry } from 'Common/Utils'; -import { serverRequestRaw } from 'Common/Links'; +import { serverRequestRaw, proxy } from 'Common/Links'; import { FolderUserStore } from 'Stores/User/Folder'; import { SettingsUserStore } from 'Stores/User/Settings'; @@ -89,11 +89,15 @@ const }) }, + /** + * @param {EmailCollectionModel} emails + * @param {Object} unic + * @param {Map} localEmails + */ replyHelper = (emails, unic, localEmails) => { emails.forEach(email => { - if (undefined === unic[email.email]) { - unic[email.email] = true; - localEmails.push(email); + if (!unic[email.email] && !localEmails.has(email.email)) { + localEmails.set(email.email, email); } }); }; @@ -319,7 +323,7 @@ export class MessageModel extends AbstractModel { */ fromDkimData() { let result = ['none', '']; - if (1 === arrayLength(this.from) && this.from[0] && this.from[0].dkimStatus) { + if (1 === arrayLength(this.from) && this.from[0]?.dkimStatus) { result = [this.from[0].dkimStatus, this.from[0].dkimValue || '']; } @@ -375,7 +379,6 @@ export class MessageModel extends AbstractModel { focused: this.focused(), important: this.isImportant(), withAttachments: !!this.attachments().length, - emptySubject: !this.subject(), // hasChildrenMessage: 1 < this.threadsLen(), hasUnseenSubMessage: this.hasUnseenSubMessage(), hasFlaggedSubMessage: this.hasFlaggedSubMessage() @@ -396,7 +399,7 @@ export class MessageModel extends AbstractModel { * @returns {string} */ fromAsSingleEmail() { - return isArray(this.from) && this.from[0] ? this.from[0].email : ''; + return (isArray(this.from) && this.from[0]?.email) || ''; } /** @@ -415,50 +418,36 @@ export class MessageModel extends AbstractModel { /** * @param {Object} excludeEmails - * @param {boolean=} last = false * @returns {Array} */ - replyEmails(excludeEmails, last) { - const result = [], - unic = undefined === excludeEmails ? {} : excludeEmails; - + replyEmails(excludeEmails) { + const + result = new Map(), + unic = excludeEmails || {}; replyHelper(this.replyTo, unic, result); - if (!result.length) { - replyHelper(this.from, unic, result); - } - - if (!result.length && !last) { - return this.replyEmails({}, true); - } - - return result; + result.size || replyHelper(this.from, unic, result); + return result.size ? [...result.values()] : [this.to[0]]; } /** * @param {Object} excludeEmails - * @param {boolean=} last = false * @returns {Array.} */ - replyAllEmails(excludeEmails, last) { - let data = []; - const toResult = [], - ccResult = [], - unic = undefined === excludeEmails ? {} : excludeEmails; + replyAllEmails(excludeEmails) { + const + toResult = new Map(), + ccResult = new Map(), + unic = excludeEmails || {}; replyHelper(this.replyTo, unic, toResult); - if (!toResult.length) { + if (!toResult.size) { replyHelper(this.from, unic, toResult); } - replyHelper(this.to, unic, toResult); + replyHelper(this.cc, unic, ccResult); - if (!toResult.length && !last) { - data = this.replyAllEmails({}, true); - return [data[0], ccResult]; - } - - return [toResult, ccResult]; + return [[...toResult.values()], [...ccResult.values()]]; } viewHtml() { @@ -617,16 +606,18 @@ export class MessageModel extends AbstractModel { this.hasImages(false); body.rlHasImages = false; - let attr = 'data-x-src'; - body.querySelectorAll('[' + attr + ']').forEach(node => { - if (node.matches('img')) { - node.loading = 'lazy'; - } - node.src = node.getAttribute(attr); + let attr = 'data-x-src', + src, useProxy = !!SettingsGet('UseLocalProxyForExternalImages'); + body.querySelectorAll('img[' + attr + ']').forEach(node => { + node.loading = 'lazy'; + src = node.getAttribute(attr); + node.src = useProxy ? proxy(src) : src; }); body.querySelectorAll('[data-x-style-url]').forEach(node => { - JSON.parse(node.dataset.xStyleUrl).forEach(data => node.style[data[0]] = "url('" + data[1] + "')"); + JSON.parse(node.dataset.xStyleUrl).forEach(data => + node.style[data[0]] = "url('" + (useProxy ? proxy(data[1]) : data[1]) + "')" + ); }); } } diff --git a/dev/Remote/AbstractFetch.js b/dev/Remote/AbstractFetch.js index 72c0fdc09..a90f27f8f 100644 --- a/dev/Remote/AbstractFetch.js +++ b/dev/Remote/AbstractFetch.js @@ -49,7 +49,7 @@ fetchJSON = (action, sGetAdd, params, timeout, jsonCallback) => { } else { params.Action = action; } - abort(action); +// abort(action); const controller = new AbortController(), signal = controller.signal; oRequests[action] = controller; @@ -123,23 +123,20 @@ export class AbstractFetchRemote * @param {Object=} oParameters * @param {?number=} iTimeout * @param {string=} sGetAdd = '' - * @param {Array=} aAbortActions = [] */ request(sAction, fCallback, params, iTimeout, sGetAdd, abortActions) { params = params || {}; const start = Date.now(); - if (sAction && abortActions) { - abortActions.forEach(actionToAbort => abort(actionToAbort)); - } + abortActions && console.error('abortActions is obsolete'); fetchJSON(sAction, pString(sGetAdd), params, undefined === iTimeout ? 30000 : pInt(iTimeout), data => { let cached = false; - if (data && data.Time) { + if (data?.Time) { cached = pInt(data.Time) > Date.now() - start; } @@ -194,7 +191,7 @@ export class AbstractFetchRemote if (trigger) { value = !!value; (isArray(trigger) ? trigger : [trigger]).forEach(fTrigger => { - fTrigger && fTrigger(value); + fTrigger?.(value); }); } } @@ -210,12 +207,12 @@ export class AbstractFetchRemote } /* let isCached = false, type = ''; - if (data && data.Time) { + if (data?.Time) { isCached = pInt(data.Time) > microtime() - start; } // backward capability switch (true) { - case 'success' === textStatus && data && data.Result && action === data.Action: + case 'success' === textStatus && data?.Result && action === data.Action: type = AbstractFetchRemote.SUCCESS; break; case 'abort' === textStatus && (!data || !data.__aborted__): diff --git a/dev/Remote/User/Fetch.js b/dev/Remote/User/Fetch.js index 7122b677f..4eab1b392 100644 --- a/dev/Remote/User/Fetch.js +++ b/dev/Remote/User/Fetch.js @@ -24,13 +24,13 @@ class RemoteUserFetch extends AbstractFetchRemote { const sFolderFullName = pString(params.Folder), folder = getFolderFromCacheList(sFolderFullName), - folderHash = (folder && folder.hash) || ''; + folderHash = folder?.hash || ''; params = Object.assign({ Offset: 0, Limit: SettingsUserStore.messagesPerPage(), Search: '', - UidNext: (folder && folder.uidNext) || 0, // Used to check for new messages + UidNext: folder?.uidNext || 0, // Used to check for new messages Sort: FolderUserStore.sortMode(), Hash: folderHash + SettingsGet('AccountHash') }, params); @@ -51,12 +51,12 @@ class RemoteUserFetch extends AbstractFetchRemote { params = {}; } + bSilent || this.abort('MessageList'); this.request('MessageList', fCallback, params, 60000, // 60 seconds before aborting - sGetAdd, - bSilent ? [] : ['MessageList'] + sGetAdd ); } @@ -71,7 +71,7 @@ class RemoteUserFetch extends AbstractFetchRemote { iUid = pInt(iUid); if (getFolderFromCacheList(sFolderFullName) && 0 < iUid) { - this.request('Message', + this.abort('Message').request('Message', fCallback, {}, null, @@ -83,8 +83,7 @@ class RemoteUserFetch extends AbstractFetchRemote { iUid, AppUserStore.threadsAllowed() && SettingsUserStore.useThreads() ? 1 : 0, SettingsGet('AccountHash') - ]), - ['Message'] + ]) ); return true; diff --git a/dev/Screen/AbstractSettings.js b/dev/Screen/AbstractSettings.js index 4619f21e4..57d1661b5 100644 --- a/dev/Screen/AbstractSettings.js +++ b/dev/Screen/AbstractSettings.js @@ -53,7 +53,7 @@ export class AbstractSettingsScreen extends AbstractScreen { settingsScreen ); - settingsScreen.onBuild && settingsScreen.onBuild(viewModelDom); + settingsScreen.onBuild?.(viewModelDom); } else { console.log('Cannot find sub settings view model position: SettingsSubScreen'); } @@ -67,10 +67,10 @@ export class AbstractSettingsScreen extends AbstractScreen { this.oCurrentSubScreen = settingsScreen; // show - settingsScreen.beforeShow && settingsScreen.beforeShow(); + settingsScreen.beforeShow?.(); i18nToNodes(settingsScreen.viewModelDom); settingsScreen.viewModelDom.hidden = false; - settingsScreen.onShow && settingsScreen.onShow(); + settingsScreen.onShow?.(); this.menu.forEach(item => { item.selected( @@ -90,7 +90,7 @@ export class AbstractSettingsScreen extends AbstractScreen { onHide() { let subScreen = this.oCurrentSubScreen; if (subScreen) { - subScreen.onHide && subScreen.onHide(); + subScreen.onHide?.(); subScreen.viewModelDom.hidden = true; } } diff --git a/dev/Screen/User/MailBox.js b/dev/Screen/User/MailBox.js index 851e23ff4..a6f3f0054 100644 --- a/dev/Screen/User/MailBox.js +++ b/dev/Screen/User/MailBox.js @@ -1,10 +1,10 @@ import { Scope } from 'Common/Enums'; import { Layout, ClientSideKeyNameMessageListSize } from 'Common/EnumsUser'; -import { doc, leftPanelDisabled, moveAction, Settings, elementById } from 'Common/Globals'; +import { doc, createElement, leftPanelDisabled, moveAction, Settings, elementById } from 'Common/Globals'; import { pString, pInt } from 'Common/Utils'; import { setLayoutResizer } from 'Common/UtilsUser'; import { getFolderFromCacheList, getFolderFullName, getFolderInboxName } from 'Common/Cache'; -import { i18n } from 'Common/Translator'; +import { i18n, initOnStartOrLangChange } from 'Common/Translator'; import { SettingsUserStore } from 'Stores/User/Settings'; import { AppUserStore } from 'Stores/User/App'; @@ -22,6 +22,12 @@ import { AbstractScreen } from 'Knoin/AbstractScreen'; export class MailBoxUserScreen extends AbstractScreen { constructor() { + var styleSheet = createElement('style'); + doc.head.appendChild(styleSheet); + initOnStartOrLangChange(() => + styleSheet.innerText = '.subjectParent:empty::after,.subjectParent .subject:empty::after' + +'{content:"'+i18n('MESSAGE/EMPTY_SUBJECT_TEXT')+'"}' + ); super('mailbox', [ SystemDropDownUserView, MailFolderList, @@ -89,7 +95,7 @@ export class MailBoxUserScreen extends AbstractScreen { /* // Disabled in SystemDropDown.html const email = AccountUserStore.email(); AccountUserStore.accounts.forEach(item => - item && email === item.email && item.count(e.detail) + email === item?.email && item?.count(e.detail) ); */ this.updateWindowTitle(); diff --git a/dev/Settings/Admin/About.js b/dev/Settings/Admin/About.js index f90f1cacd..398f3235e 100644 --- a/dev/Settings/Admin/About.js +++ b/dev/Settings/Admin/About.js @@ -57,7 +57,7 @@ export class AdminSettingsAbout /*extends AbstractViewSettings*/ { this.coreChecking(true); Remote.request('AdminUpdateInfo', (iError, data) => { this.coreChecking(false); - if (!iError && data && data.Result) { + if (!iError && data?.Result) { this.coreReal(true); this.coreUpdatable(!!data.Result.Updatable); this.coreWarning(!!data.Result.Warning); @@ -79,7 +79,7 @@ export class AdminSettingsAbout /*extends AbstractViewSettings*/ { this.coreUpdating(false); this.coreVersion(''); this.coreVersionCompare(-2); - if (!iError && data && data.Result) { + if (!iError && data?.Result) { this.coreReal(true); window.location.reload(); } else { diff --git a/dev/Settings/Admin/Contacts.js b/dev/Settings/Admin/Contacts.js index 1cb0d0d1d..fb5f43635 100644 --- a/dev/Settings/Admin/Contacts.js +++ b/dev/Settings/Admin/Contacts.js @@ -85,7 +85,7 @@ export class AdminSettingsContacts extends AbstractViewSettings { this.testContactsSuccess(true); } else { this.testContactsError(true); - if (data && data.Result) { + if (data?.Result) { this.testContactsErrorMessage(data.Result.Message || ''); } else { this.testContactsErrorMessage(''); diff --git a/dev/Settings/Admin/General.js b/dev/Settings/Admin/General.js index 66127ca21..bb4a26171 100644 --- a/dev/Settings/Admin/General.js +++ b/dev/Settings/Admin/General.js @@ -68,7 +68,7 @@ export class AdminSettingsGeneral extends AbstractViewSettings { this.uploadData = SettingsGet('PhpUploadSizes'); this.uploadDataDesc = - this.uploadData && (this.uploadData.upload_max_filesize || this.uploadData.post_max_size) + (this.uploadData?.upload_max_filesize || this.uploadData?.post_max_size) ? [ this.uploadData.upload_max_filesize ? 'upload_max_filesize = ' + this.uploadData.upload_max_filesize + '; ' diff --git a/dev/Settings/Admin/Packages.js b/dev/Settings/Admin/Packages.js index 7a161e5b1..d204859f1 100644 --- a/dev/Settings/Admin/Packages.js +++ b/dev/Settings/Admin/Packages.js @@ -24,9 +24,9 @@ export class AdminSettingsPackages extends AbstractViewSettings { this.packages = PackageAdminStore; addComputablesTo(this, { - packagesCurrent: () => PackageAdminStore().filter(item => item && item.installed && !item.canBeUpdated), - packagesUpdate: () => PackageAdminStore().filter(item => item && item.installed && item.canBeUpdated), - packagesAvailable: () => PackageAdminStore().filter(item => item && !item.installed), + packagesCurrent: () => PackageAdminStore().filter(item => item?.installed && !item.canBeUpdated), + packagesUpdate: () => PackageAdminStore().filter(item => item?.installed && item.canBeUpdated), + packagesAvailable: () => PackageAdminStore().filter(item => !item?.installed), visibility: () => (PackageAdminStore.loading() ? 'visible' : 'hidden') }); @@ -59,7 +59,7 @@ export class AdminSettingsPackages extends AbstractViewSettings { requestHelper(packageToRequest, install) { return (iError, data) => { PackageAdminStore.forEach(item => { - if (item && packageToRequest && item.loading && item.loading() && packageToRequest.file === item.file) { + if (packageToRequest && item?.loading?.() && packageToRequest.file === item.file) { packageToRequest.loading(false); item.loading(false); } @@ -109,11 +109,11 @@ export class AdminSettingsPackages extends AbstractViewSettings { let disable = plugin.enabled(); plugin.enabled(!disable); Remote.request('AdminPluginDisable', - (iError, data) => { + (iError, data) => { if (iError) { plugin.enabled(disable); this.packagesError( - (Notification.UnsupportedPluginPackage === iError && data && data.ErrorMessage) + (Notification.UnsupportedPluginPackage === iError && data?.ErrorMessage) ? data.ErrorMessage : getNotification(iError) ); diff --git a/dev/Settings/Admin/Security.js b/dev/Settings/Admin/Security.js index a1ba65b6f..1d7641713 100644 --- a/dev/Settings/Admin/Security.js +++ b/dev/Settings/Admin/Security.js @@ -21,28 +21,46 @@ export class AdminSettingsSecurity extends AbstractViewSettings { adminPasswordNew: '', adminPasswordNew2: '', adminPasswordNewError: false, - adminTOTP: SettingsGet('AdminTOTP'), + adminTOTP: '', - adminPasswordUpdateError: false, - adminPasswordUpdateSuccess: false, + saveError: false, + saveSuccess: false, + + viewQRCode: '', capaOpenPGP: SettingsCapa('OpenPGP') }); const reset = () => { - this.adminPasswordUpdateError(false); - this.adminPasswordUpdateSuccess(false); + this.saveError(false); + this.saveSuccess(false); this.adminPasswordNewError(false); }; addSubscribablesTo(this, { adminPassword: () => { - this.adminPasswordUpdateError(false); - this.adminPasswordUpdateSuccess(false); + this.saveError(false); + this.saveSuccess(false); }, adminLogin: () => this.adminLoginError(false), + adminTOTP: value => { + if (/[A-Z2-7]{16,}/.test(value) && 0 == value.length * 5 % 8) { + Remote.request('AdminQRCode', (iError, data) => { + if (!iError) { + console.dir({data:data}); + this.viewQRCode(data.Result); + } + }, { + 'username': this.adminLogin(), + 'TOTP': this.adminTOTP() + }); + } else { + this.viewQRCode(''); + } + }, + adminPasswordNew: reset, adminPasswordNew2: reset, @@ -50,12 +68,14 @@ export class AdminSettingsSecurity extends AbstractViewSettings { capaOpenPGP: value => Remote.saveSetting('CapaOpenPGP', value) }); + this.adminTOTP(SettingsGet('AdminTOTP')); + decorateKoCommands(this, { - saveNewAdminPasswordCommand: self => self.adminLogin().trim() && self.adminPassword() + saveAdminUserCommand: self => self.adminLogin().trim() && self.adminPassword() }); } - saveNewAdminPasswordCommand() { + saveAdminUserCommand() { if (!this.adminLogin().trim()) { this.adminLoginError(true); return false; @@ -66,18 +86,18 @@ export class AdminSettingsSecurity extends AbstractViewSettings { return false; } - this.adminPasswordUpdateError(false); - this.adminPasswordUpdateSuccess(false); + this.saveError(false); + this.saveSuccess(false); Remote.request('AdminPasswordUpdate', (iError, data) => { if (iError) { - this.adminPasswordUpdateError(true); + this.saveError(true); } else { this.adminPassword(''); this.adminPasswordNew(''); this.adminPasswordNew2(''); - this.adminPasswordUpdateSuccess(true); + this.saveSuccess(true); this.weakPassword(!!data.Result.Weak); } diff --git a/dev/Settings/User/Accounts.js b/dev/Settings/User/Accounts.js index 014d0be73..590bc3aa1 100644 --- a/dev/Settings/User/Accounts.js +++ b/dev/Settings/User/Accounts.js @@ -30,7 +30,7 @@ export class UserSettingsAccounts /*extends AbstractViewSettings*/ { } editAccount(account) { - if (account && account.isAdditional()) { + if (account?.isAdditional()) { showScreenPopup(AccountPopupView, [account]); } } @@ -48,7 +48,7 @@ export class UserSettingsAccounts /*extends AbstractViewSettings*/ { * @returns {void} */ deleteAccount(accountToRemove) { - if (accountToRemove && accountToRemove.askDelete()) { + if (accountToRemove?.askDelete()) { this.accountForDeletion(null); if (accountToRemove) { this.accounts.remove((account) => accountToRemove === account); @@ -72,7 +72,7 @@ export class UserSettingsAccounts /*extends AbstractViewSettings*/ { * @returns {void} */ deleteIdentity(identityToRemove) { - if (identityToRemove && identityToRemove.askDelete()) { + if (identityToRemove?.askDelete()) { this.identityForDeletion(null); if (identityToRemove) { diff --git a/dev/Settings/User/Contacts.js b/dev/Settings/User/Contacts.js index a274873e3..1c14303dc 100644 --- a/dev/Settings/User/Contacts.js +++ b/dev/Settings/User/Contacts.js @@ -16,13 +16,12 @@ export class UserSettingsContacts /*extends AbstractViewSettings*/ { this.syncUser = ContactUserStore.syncUser; this.syncPass = ContactUserStore.syncPass; - const i18nSyncMode = key => i18n('SETTINGS_CONTACTS/SYNC_' + key); this.syncModeOptions = koComputable(() => { translatorTrigger(); return [ - { id: 0, name: i18nSyncMode('NO') }, - { id: 1, name: i18nSyncMode('YES') }, - { id: 2, name: i18nSyncMode('READ') }, + { id: 0, name: i18n('GLOBAL/NO') }, + { id: 1, name: i18n('GLOBAL/YES') }, + { id: 2, name: i18n('SETTINGS_CONTACTS/SYNC_READ') }, ]; }); diff --git a/dev/Settings/User/Filters.js b/dev/Settings/User/Filters.js index dd2e1bf63..e43ef044e 100644 --- a/dev/Settings/User/Filters.js +++ b/dev/Settings/User/Filters.js @@ -50,6 +50,6 @@ export class UserSettingsFilters /*extends AbstractViewSettings*/ { } onShow() { - window.Sieve && window.Sieve.updateList(); + window.Sieve?.updateList(); } } diff --git a/dev/Settings/User/Folders.js b/dev/Settings/User/Folders.js index 5e4b097c6..729ec8d49 100644 --- a/dev/Settings/User/Folders.js +++ b/dev/Settings/User/Folders.js @@ -1,5 +1,4 @@ import ko from 'ko'; -import { koComputable } from 'External/ko'; import { Notification } from 'Common/Enums'; import { FolderMetadataKeys } from 'Common/EnumsUser'; @@ -48,14 +47,7 @@ export class UserSettingsFolders /*extends AbstractViewSettings*/ { this.folderListError = FolderUserStore.folderListError; this.hideUnsubscribed = SettingsUserStore.hideUnsubscribed; - this.loading = koComputable(() => { - const loading = FolderUserStore.foldersLoading(), - creating = FolderUserStore.foldersCreating(), - deleting = FolderUserStore.foldersDeleting(), - renaming = FolderUserStore.foldersRenaming(); - - return loading || creating || deleting || renaming; - }); + this.loading = FolderUserStore.foldersChanging; this.folderForDeletion = folderForDeletion; diff --git a/dev/Settings/User/General.js b/dev/Settings/User/General.js index f67d8c0b1..324acd0eb 100644 --- a/dev/Settings/User/General.js +++ b/dev/Settings/User/General.js @@ -30,11 +30,6 @@ export class UserSettingsGeneral extends AbstractViewSettings { this.language = LanguageStore.language; this.languages = LanguageStore.languages; - this.messageReadDelay = SettingsUserStore.messageReadDelay; - this.messagesPerPage = SettingsUserStore.messagesPerPage; - - this.editorDefaultType = SettingsUserStore.editorDefaultType; - this.layout = SettingsUserStore.layout; this.soundNotification = SMAudio.notifications; this.notificationSound = ko.observable(SettingsGet('NotificationSound')); @@ -43,14 +38,14 @@ export class UserSettingsGeneral extends AbstractViewSettings { this.desktopNotification = NotificationUserStore.enabled; this.isDesktopNotificationAllowed = NotificationUserStore.allowed; - this.viewHTML = SettingsUserStore.viewHTML; - this.showImages = SettingsUserStore.showImages; - this.removeColors = SettingsUserStore.removeColors; - this.hideDeleted = SettingsUserStore.hideDeleted; - this.useCheckboxesInList = SettingsUserStore.useCheckboxesInList; this.threadsAllowed = AppUserStore.threadsAllowed; - this.useThreads = SettingsUserStore.useThreads; - this.replySameFolder = SettingsUserStore.replySameFolder; + + ['layout', 'messageReadDelay', 'messagesPerPage', + 'editorDefaultType', 'requestReadReceipt', 'requestDsn', 'pgpSign', 'pgpEncrypt', + 'viewHTML', 'showImages', 'removeColors', 'hideDeleted', + 'useCheckboxesInList', 'useThreads', 'replySameFolder', 'msgDefaultAction' + ].forEach(name => this[name] = SettingsUserStore[name]); + this.allowLanguagesOnSettings = !!SettingsGet('AllowLanguagesOnSettings'); this.languageTrigger = ko.observable(SaveSettingsStep.Idle); @@ -78,6 +73,14 @@ export class UserSettingsGeneral extends AbstractViewSettings { ]; }, + msgDefaultActions: () => { + translatorTrigger(); + return [ + { id: 1, name: i18n('MESSAGE/BUTTON_REPLY') }, // ComposeType.Reply, + { id: 2, name: i18n('MESSAGE/BUTTON_REPLY_ALL') } // ComposeType.ReplyAll + ]; + }, + layoutTypes: () => { translatorTrigger(); return [ @@ -89,11 +92,13 @@ export class UserSettingsGeneral extends AbstractViewSettings { }); this.addSetting('EditorDefaultType'); + this.addSetting('MsgDefaultAction'); this.addSetting('MessageReadDelay'); this.addSetting('MessagesPerPage'); this.addSetting('Layout', () => MessagelistUserStore([])); this.addSettings(['ViewHTML', 'ShowImages', 'HideDeleted', 'UseCheckboxesInList', 'ReplySameFolder', + 'requestReadReceipt', 'requestDsn', 'pgpSign', 'pgpEncrypt', 'DesktopNotifications', 'SoundNotification']); const fReloadLanguageHelper = (saveSettingsStep) => () => { diff --git a/dev/Settings/User/Themes.js b/dev/Settings/User/Themes.js index 5e61f8b97..38676a770 100644 --- a/dev/Settings/User/Themes.js +++ b/dev/Settings/User/Themes.js @@ -74,7 +74,7 @@ export class UserSettingsThemes /*extends AbstractViewSettings*/ { .on('onComplete', (id, result, data) => { themeBackground.loading(false); - if (result && id && data && data.Result && data.Result.Name && data.Result.Hash) { + if (result && id && data?.Result?.Name && data?.Result?.Hash) { themeBackground.name(data.Result.Name); themeBackground.hash(data.Result.Hash); } else { @@ -94,11 +94,7 @@ export class UserSettingsThemes /*extends AbstractViewSettings*/ { } } - if (!errorMsg && data.ErrorMessage) { - errorMsg = data.ErrorMessage; - } - - themeBackground.error(errorMsg || i18n('SETTINGS_THEMES/ERROR_UNKNOWN')); + themeBackground.error(errorMsg || data.ErrorMessage || i18n('SETTINGS_THEMES/ERROR_UNKNOWN')); } return true; diff --git a/dev/Sieve/Model/Script.js b/dev/Sieve/Model/Script.js index 9747ec931..ed559348a 100644 --- a/dev/Sieve/Model/Script.js +++ b/dev/Sieve/Model/Script.js @@ -17,7 +17,7 @@ function filtersToSieveScript(filters) '' ]; - const quote = string => '"' + string.trim().replace(/(\\|")/, '\\\\$1') + '"'; + const quote = string => '"' + string.trim().replace(/(\\|")/g, '\\$1') + '"'; const StripSpaces = string => string.replace(/\s+/, ' ').trim(); // conditionToSieveScript @@ -294,8 +294,9 @@ export class SieveScriptModel extends AbstractModel return { name: this.name(), active: this.active() ? 1 : 0, - body: this.body(), - filters: this.filters.map(item => item.toJson()) + body: this.body() +// body: this.allowFilters() ? this.body() : this.filtersToRaw() +// filters: this.filters.map(item => item.toJson()) }; } diff --git a/dev/Sieve/View/Filter.js b/dev/Sieve/View/Filter.js index cf5a2a03a..d541a584e 100644 --- a/dev/Sieve/View/Filter.js +++ b/dev/Sieve/View/Filter.js @@ -13,8 +13,7 @@ import { const // import { defaultOptionsAfterRender } from 'Common/Utils'; defaultOptionsAfterRender = (domItem, item) => - domItem && item && undefined !== item.disabled - && domItem.classList.toggle('disabled', domItem.disabled = item.disabled), + item && undefined !== item.disabled && domItem?.classList.toggle('disabled', domItem.disabled = item.disabled), // import { folderListOptionsBuilder } from 'Common/Folders'; /** diff --git a/dev/Sieve/View/Script.js b/dev/Sieve/View/Script.js index 0cda4e705..615451b61 100644 --- a/dev/Sieve/View/Script.js +++ b/dev/Sieve/View/Script.js @@ -22,8 +22,8 @@ export class SieveScriptPopupView extends rl.pluginPopupView { saveError: false, errorText: '', rawActive: false, - allowToggle: false, script: null, + saving: false, sieveCapabilities: '', availableActions: '', @@ -31,8 +31,6 @@ export class SieveScriptPopupView extends rl.pluginPopupView { availableTests: '' }); - this.saving = false; - this.filterForDeletion = ko.observable(null).askDeleteHelper(); } @@ -48,7 +46,7 @@ export class SieveScriptPopupView extends rl.pluginPopupView { saveScript() { let self = this, script = self.script(); - if (!self.saving/* && script.hasChanges()*/) { + if (!self.saving()/* && script.hasChanges()*/) { this.errorText(''); self.saveError(false); @@ -62,21 +60,21 @@ export class SieveScriptPopupView extends rl.pluginPopupView { } try { - parseScript(this.script().body()); + parseScript(script.body()); } catch (e) { this.errorText(e.message); return; } - self.saving = true; + self.saving(true); - if (self.allowToggle()) { + if (script.allowFilters()) { script.body(script.filtersToRaw()); } Remote.request('FiltersScriptSave', (iError, data) => { - self.saving = false; + self.saving(false); if (iError) { self.saveError(true); @@ -85,6 +83,7 @@ export class SieveScriptPopupView extends rl.pluginPopupView { script.exists() || scripts.push(script); script.exists(true); script.hasChanges(false); +// this.close(); } }, script.toJson() @@ -110,17 +109,18 @@ export class SieveScriptPopupView extends rl.pluginPopupView { const clonedFilter = filter.assignTo(); FilterPopupView.showModal([ clonedFilter, - () => clonedFilter.assignTo(filter), + () => { + clonedFilter.assignTo(filter); + const script = this.script(); + script.hasChanges(script.body() != script.filtersToRaw()); + }, true ]); } toggleFiltersRaw() { - let script = this.script(), notRaw = !this.rawActive(); - if (notRaw) { - script.body(script.filtersToRaw()); - script.hasChanges(script.hasChanges()); - } + const script = this.script(), notRaw = !this.rawActive(); + notRaw && script.body(script.filtersToRaw()); this.rawActive(notRaw); } @@ -140,10 +140,8 @@ export class SieveScriptPopupView extends rl.pluginPopupView { this.availableTests([...Object.keys(availableTests())].join(', ')); oScript = oScript || new SieveScriptModel(); - let raw = !oScript.allowFilters(); this.script(oScript); - this.rawActive(raw); - this.allowToggle(!raw); + this.rawActive(!oScript.allowFilters()); this.saveError(false); this.errorText(''); diff --git a/dev/Stores/Admin/Package.js b/dev/Stores/Admin/Package.js index 3f4136338..19ddf9705 100644 --- a/dev/Stores/Admin/Package.js +++ b/dev/Stores/Admin/Package.js @@ -22,7 +22,7 @@ PackageAdminStore.fetch = () => { const loading = {}; PackageAdminStore.forEach(item => { - if (item && item.loading()) { + if (item?.loading()) { loading[item.file] = item; } }); diff --git a/dev/Stores/User/App.js b/dev/Stores/User/App.js index a38880570..6315b6e61 100644 --- a/dev/Stores/User/App.js +++ b/dev/Stores/User/App.js @@ -21,6 +21,6 @@ AppUserStore.focusedState.subscribe(value => { ThemeStore.isMobile() && leftPanelDisabled('FolderList' !== value); } let dom = elementById('V-Mail'+name); - dom && dom.classList.toggle('focused', name === value); + dom?.classList.toggle('focused', name === value); }); }); diff --git a/dev/Stores/User/Contact.js b/dev/Stores/User/Contact.js index f9db211ae..28ec7c5ed 100644 --- a/dev/Stores/User/Contact.js +++ b/dev/Stores/User/Contact.js @@ -33,12 +33,12 @@ ContactUserStore.sync = fResultFunc => { line = JSON.parse(line); if ('ContactsSync' === line.Action) { ContactUserStore.syncing(false); - fResultFunc && fResultFunc(line.ErrorCode, line); + fResultFunc?.(line.ErrorCode, line); } } catch (e) { ContactUserStore.syncing(false); console.error(e); - fResultFunc && fResultFunc(Notification.UnknownError); + fResultFunc?.(Notification.UnknownError); } }, 'ContactsSync'); } diff --git a/dev/Stores/User/Folder.js b/dev/Stores/User/Folder.js index ba9e3512e..aec4bf758 100644 --- a/dev/Stores/User/Folder.js +++ b/dev/Stores/User/Folder.js @@ -64,7 +64,7 @@ export const FolderUserStore = new class { foldersChanging: () => self.foldersLoading() | self.foldersCreating() | self.foldersDeleting() | self.foldersRenaming(), - folderListSystemNames: () => { + systemFoldersNames: () => { const list = [getFolderInboxName()], others = [self.sentFolder(), self.draftsFolder(), self.spamFolder(), self.trashFolder(), self.archiveFolder()]; @@ -74,21 +74,15 @@ export const FolderUserStore = new class { return list; }, - folderListSystem: () => - self.folderListSystemNames().map(name => getFolderFromCacheList(name)).filter(v => v) + systemFolders: () => + self.systemFoldersNames().map(name => getFolderFromCacheList(name)).filter(v => v) }); const subscribeRemoveSystemFolder = observable => { - observable.subscribe(() => { - const folder = getFolderFromCacheList(observable()); - folder && folder.type(FolderType.User); - }, self, 'beforeChange'); + observable.subscribe(() => getFolderFromCacheList(observable())?.type(FolderType.User), self, 'beforeChange'); }, - fSetSystemFolderType = type => value => { - const folder = getFolderFromCacheList(value); - folder && folder.type(type); - }; + fSetSystemFolderType = type => value => getFolderFromCacheList(value)?.type(type); subscribeRemoveSystemFolder(self.sentFolder); subscribeRemoveSystemFolder(self.draftsFolder); @@ -134,8 +128,7 @@ export const FolderUserStore = new class { fSearchFunction = (list) => { list.forEach(folder => { if ( - folder && - folder.selectable() && + folder?.selectable() && folder.exists && timeout > folder.expires && (folder.isSystemFolder() || (folder.isSubscribed() && (folder.checkable() || !bDisplaySpecSetting))) @@ -143,7 +136,7 @@ export const FolderUserStore = new class { timeouts.push([folder.expires, folder.fullName]); } - if (folder && folder.subFolders.length) { + if (folder?.subFolders.length) { fSearchFunction(folder.subFolders()); } }); @@ -157,13 +150,14 @@ export const FolderUserStore = new class { const folder = getFolderFromCacheList(aItem[1]); if (folder) { folder.expires = utc; +// result.indexOf(aItem[1]) || result.push(aItem[1]); } return limit <= result.length; }); - return result.filter((value, index, self) => self.indexOf(value) == index); + return result; } saveSystemFolders(folders) { diff --git a/dev/Stores/User/GnuPG.js b/dev/Stores/User/GnuPG.js index 6352c8789..248880588 100644 --- a/dev/Stores/User/GnuPG.js +++ b/dev/Stores/User/GnuPG.js @@ -38,7 +38,7 @@ export const GnuPGUserStore = new class { this.privateKeys([]); Remote.request('GnupgGetKeys', (iError, oData) => { - if (oData && oData.Result) { + if (oData?.Result) { this.keyring = oData.Result; const initKey = (key, isPrivate) => { const aEmails = []; @@ -73,7 +73,7 @@ export const GnuPGUserStore = new class { key.view = () => { const fetch = pass => Remote.request('GnupgExportKey', (iError, oData) => { - if (oData && oData.Result) { + if (oData?.Result) { key.armor = oData.Result; showScreenPopup(OpenPgpKeyPopupView, [key]); } @@ -111,10 +111,10 @@ export const GnuPGUserStore = new class { importKey(key, callback) { Remote.request('GnupgImportKey', (iError, oData) => { - if (oData && oData.Result/* && (oData.Result.imported || oData.Result.secretimported)*/) { + if (oData?.Result/* && (oData.Result.imported || oData.Result.secretimported)*/) { this.loadKeyrings(); } - callback && callback(iError, oData); + callback?.(iError, oData); }, { Key: key } @@ -131,10 +131,10 @@ export const GnuPGUserStore = new class { storeKeyPair(keyPair, callback) { Remote.request('PgpStoreKeyPair', (iError, oData) => { - if (oData && oData.Result) { + if (oData?.Result) { // this.gnupgKeyring = oData.Result; } - callback && callback(iError, oData); + callback?.(iError, oData); }, keyPair ); } @@ -187,7 +187,7 @@ export const GnuPGUserStore = new class { } if (null !== params.Passphrase) { const result = await Remote.post('GnupgDecrypt', null, params); - if (result && result.Result) { + if (result?.Result) { return result.Result; } } @@ -208,7 +208,7 @@ export const GnuPGUserStore = new class { data.SigPart = data.SigPart.body; } let response = await Remote.post('MessagePgpVerify', null, data); - if (response && response.Result) { + if (response?.Result) { return { fingerprint: response.Result.fingerprint, success: 0 == response.Result.status // GOODSIG diff --git a/dev/Stores/User/Message.js b/dev/Stores/User/Message.js index e6c44d530..a012f03d1 100644 --- a/dev/Stores/User/Message.js +++ b/dev/Stores/User/Message.js @@ -42,7 +42,7 @@ export const MessageUserStore = new class { purgeMessageBodyCache() { const messagesDom = this.bodiesDom(), - children = messagesDom && messagesDom.children; + children = messagesDom?.children; if (children) { while (15 < children.length) { children[0].remove(); diff --git a/dev/Stores/User/Messagelist.js b/dev/Stores/User/Messagelist.js index 2bc7cbcc5..20fee8a71 100644 --- a/dev/Stores/User/Messagelist.js +++ b/dev/Stores/User/Messagelist.js @@ -270,8 +270,7 @@ MessagelistUserStore.setAction = (sFolderFullName, iSetAction, messages) => { let folder, alreadyUnread = 0, - rootUids = messages.map(oMessage => oMessage && oMessage.uid ? oMessage.uid : null) - .validUnique(), + rootUids = messages.map(oMessage => oMessage?.uid).validUnique(), length = rootUids.length; if (sFolderFullName && length) { @@ -333,7 +332,7 @@ MessagelistUserStore.removeMessagesFromList = ( ? messageList.filter(item => item && uidForRemove.includes(pInt(item.uid))) : []; - messages.forEach(item => item && item.isUnseen() && ++unseenCount); + messages.forEach(item => item?.isUnseen() && ++unseenCount); if (fromFolder) { fromFolder.hash = ''; @@ -387,7 +386,7 @@ MessagelistUserStore.removeMessagesFromList = ( if (MessagelistUserStore.threadUid()) { if ( messageList.length && - messageList.find(item => item && item.deleted() && item.uid == MessagelistUserStore.threadUid()) + messageList.find(item => item?.deleted() && item.uid == MessagelistUserStore.threadUid()) ) { const message = messageList.find(item => item && !item.deleted()); let setHash; diff --git a/dev/Stores/User/Notification.js b/dev/Stores/User/Notification.js index 403460caa..0ad7d28e8 100644 --- a/dev/Stores/User/Notification.js +++ b/dev/Stores/User/Notification.js @@ -6,7 +6,7 @@ import { fireEvent } from 'Common/Globals'; * Might not work due to the new ServiceWorkerRegistration.showNotification */ const HTML5Notification = window.Notification, - HTML5NotificationStatus = () => (HTML5Notification && HTML5Notification.permission) || 'denied', + HTML5NotificationStatus = () => HTML5Notification?.permission || 'denied', NotificationsDenied = () => 'denied' === HTML5NotificationStatus(), NotificationsGranted = () => 'granted' === HTML5NotificationStatus(), dispatchMessage = data => { @@ -26,7 +26,7 @@ if (WorkerNotifications && ServiceWorkerRegistration && ServiceWorkerRegistratio /* Listen for close requests from the ServiceWorker */ WorkerNotifications.addEventListener('message', event => { const obj = JSON.parse(event.data); - obj && 'notificationclick' === obj.action && dispatchMessage(obj.data); + 'notificationclick' === obj?.action && dispatchMessage(obj.data); }); } else { WorkerNotifications = null; @@ -60,7 +60,7 @@ export const NotificationUserStore = new class { icon: imageSrc || Links.staticLink('css/images/icon-message-notification.png'), data: messageData }; - if (messageData && messageData.Uid) { + if (messageData?.Uid) { options.tag = messageData.Uid; } if (WorkerNotifications) { @@ -83,7 +83,7 @@ export const NotificationUserStore = new class { .catch(e => console.error(e)); } else { const notification = new HTML5Notification(title, options); - notification.show && notification.show(); + notification.show?.(); notification.onclick = messageData ? () => dispatchMessage(messageData) : null; setTimeout(() => notification.close(), 7000); } diff --git a/dev/Stores/User/OpenPGP.js b/dev/Stores/User/OpenPGP.js index 5e929ec13..be15ac2e4 100644 --- a/dev/Stores/User/OpenPGP.js +++ b/dev/Stores/User/OpenPGP.js @@ -18,8 +18,21 @@ const key.emails.includes(query) || query == key.id || query == key.fingerprint ), - askPassphrase = async (privateKey, btnTxt = 'LABEL_SIGN') => - await AskPopupView.password('OpenPGP.js key
' + privateKey.id + ' ' + privateKey.emails[0], 'OPENPGP/'+btnTxt), + decryptKey = async (privateKey, btnTxt = 'LABEL_SIGN') => { + if (privateKey.key.isDecrypted()) { + return privateKey.key; + } + const passphrase = await AskPopupView.password( + 'OpenPGP.js key
' + privateKey.id + ' ' + privateKey.emails[0], + 'OPENPGP/'+btnTxt + ); + if (null !== passphrase) { + return await openpgp.decryptKey({ + privateKey: privateKey.key, + passphrase + }); + } + }, /** * OpenPGP.js v5 removed the localStorage (keyring) @@ -178,19 +191,12 @@ export const OpenPGPUserStore = new class { } } if (privateKey) try { - const passphrase = await askPassphrase(privateKey, 'BUTTON_DECRYPT'); - - if (null !== passphrase) { - const - publicKey = findOpenPGPKey(this.publicKeys, sender/*, sign*/), - decryptedKey = await openpgp.decryptKey({ - privateKey: privateKey.key, - passphrase - }); - + const decryptedKey = await decryptKey(privateKey, 'BUTTON_DECRYPT'); + if (decryptedKey) { + const publicKey = findOpenPGPKey(this.publicKeys, sender/*, sign*/); return await openpgp.decrypt({ message, - verificationKeys: publicKey && publicKey.key, + verificationKeys: publicKey?.key, // expectSigned: true, // signature: '', // Detached signature decryptionKeys: decryptedKey @@ -246,18 +252,14 @@ export const OpenPGPUserStore = new class { * https://docs.openpgpjs.org/global.html#sign */ async sign(text, privateKey, detached) { - const passphrase = await askPassphrase(privateKey); - if (null !== passphrase) { - privateKey = await openpgp.decryptKey({ - privateKey: privateKey.key, - passphrase - }); + const signingKey = await decryptKey(privateKey); + if (signingKey) { const message = detached ? await openpgp.createMessage({ text: text }) : await openpgp.createCleartextMessage({ text: text }); return await openpgp.sign({ message: message, - signingKeys: privateKey, + signingKeys: signingKey, detached: !!detached }); } @@ -272,14 +274,10 @@ export const OpenPGPUserStore = new class { recipients = recipients.map(email => this.publicKeys().find(key => key.emails.includes(email))).filter(key => key); if (count === recipients.length) { if (signPrivateKey) { - const passphrase = await askPassphrase(signPrivateKey); - if (null === passphrase) { + signPrivateKey = await decryptKey(signPrivateKey); + if (!signPrivateKey) { return; } - signPrivateKey = await openpgp.decryptKey({ - privateKey: signPrivateKey.key, - passphrase - }); } return await openpgp.encrypt({ message: await openpgp.createMessage({ text: text }), diff --git a/dev/Stores/User/Pgp.js b/dev/Stores/User/Pgp.js index b5291e851..f21a1cfe9 100644 --- a/dev/Stores/User/Pgp.js +++ b/dev/Stores/User/Pgp.js @@ -169,7 +169,7 @@ export const } ); if (result) { - if (result.error && result.error.message) { + if (result.error?.message) { if ('PWD_DIALOG_CANCEL' !== result.error.code) { alert(result.error.code + ': ' + result.error.message); } diff --git a/dev/Stores/User/Settings.js b/dev/Stores/User/Settings.js index 07f792a27..8d7ad9d90 100644 --- a/dev/Stores/User/Settings.js +++ b/dev/Stores/User/Settings.js @@ -1,7 +1,7 @@ import ko from 'ko'; import { koComputable } from 'External/ko'; -import { Layout, EditorDefaultType } from 'Common/EnumsUser'; +import { Layout, EditorDefaultType, ComposeType } from 'Common/EnumsUser'; import { pInt } from 'Common/Utils'; import { addObservablesTo } from 'External/ko'; import { $htmlCL, SettingsGet, fireEvent } from 'Common/Globals'; @@ -22,6 +22,13 @@ export const SettingsUserStore = new class { ] }); + self.msgDefaultAction = ko.observable(1).extend({ + limitedList: [ + ComposeType.Reply, + ComposeType.ReplyAll + ] + }); + self.messagesPerPage = ko.observable(25).extend({ debounce: 999 }); self.messageReadDelay = ko.observable(5).extend({ debounce: 999 }); @@ -36,7 +43,12 @@ export const SettingsUserStore = new class { replySameFolder: 0, hideUnsubscribed: 0, hideDeleted: 1, - autoLogout: 0 + autoLogout: 0, + + requestReadReceipt: 0, + requestDsn: 0, + pgpSign: 0, + pgpEncrypt: 0 }); self.init(); @@ -74,6 +86,7 @@ export const SettingsUserStore = new class { self.messagesPerPage(pInt(SettingsGet('MessagesPerPage'))); self.messageReadDelay(pInt(SettingsGet('MessageReadDelay'))); self.autoLogout(pInt(SettingsGet('AutoLogout'))); + self.msgDefaultAction(SettingsGet('MsgDefaultAction')); self.viewHTML(SettingsGet('ViewHTML')); self.showImages(SettingsGet('ShowImages')); @@ -85,5 +98,10 @@ export const SettingsUserStore = new class { self.hideUnsubscribed(SettingsGet('HideUnsubscribed')); self.hideDeleted(SettingsGet('HideDeleted')); + + self.requestReadReceipt(SettingsGet('requestReadReceipt')); + self.requestDsn(SettingsGet('requestDsn')); + self.pgpSign(SettingsGet('pgpSign')); + self.pgpEncrypt(SettingsGet('pgpEncrypt')); } }; diff --git a/dev/Styles/Admin/Layout.less b/dev/Styles/Admin/Layout.less index 83294f1d8..71ab17ea7 100644 --- a/dev/Styles/Admin/Layout.less +++ b/dev/Styles/Admin/Layout.less @@ -1,10 +1,4 @@ -.UserBackground body { - background-size: contain; - background-repeat: no-repeat; - background-position: center; -} - #rl-content { display:flex; height: 100%; diff --git a/dev/Styles/Ask.less b/dev/Styles/Ask.less index 7f7d569bc..9373fa801 100644 --- a/dev/Styles/Ask.less +++ b/dev/Styles/Ask.less @@ -5,4 +5,9 @@ padding: 3em 15px; text-align: center; } + + button:focus { + box-shadow: 0 0 1px inset; + } + } diff --git a/dev/Styles/Login.less b/dev/Styles/Login.less index eae355e40..37b2587a1 100644 --- a/dev/Styles/Login.less +++ b/dev/Styles/Login.less @@ -86,9 +86,8 @@ } input, .btn { - background: none !important; + background: none; border: 1px solid @glass-m-color; - color: @glass-color; } .fontastic + input { diff --git a/dev/Styles/User/Layout.less b/dev/Styles/User/Layout.less index 3be2db9b2..24d6ef584 100644 --- a/dev/Styles/User/Layout.less +++ b/dev/Styles/User/Layout.less @@ -1,6 +1,6 @@ .UserBackground body { - background-size: contain; + background-size: cover; background-repeat: no-repeat; background-position: center; } diff --git a/dev/Styles/User/MessageList.less b/dev/Styles/User/MessageList.less index cc66fbc0e..47af6e44e 100644 --- a/dev/Styles/User/MessageList.less +++ b/dev/Styles/User/MessageList.less @@ -246,6 +246,11 @@ html:not(rl-mobile) { white-space: nowrap; } + .subjectParent:empty { + font-style: italic; + opacity: 0.5; + } + .threadsCountParent { display: inline; overflow: hidden; @@ -266,11 +271,6 @@ html:not(rl-mobile) { border-color: #666; } - &.emptySubject .subjectParent { - font-style: italic; - opacity: 0.5; - } - .threads-len { border-radius: 6px; border: 1px solid #ccc; diff --git a/dev/Styles/User/MessageView.less b/dev/Styles/User/MessageView.less index e376fc409..958452b0c 100644 --- a/dev/Styles/User/MessageView.less +++ b/dev/Styles/User/MessageView.less @@ -113,12 +113,16 @@ html.rl-no-preview-pane { margin-bottom: 8px; } - .subject, .emptySubjectText { + .subject { flex-grow: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } + .subject:empty { + font-style: italic; + opacity: 0.5; + } .messageButtons { margin-top: 5px; @@ -166,12 +170,6 @@ html.rl-no-preview-pane { } } - .emptySubjectText { - font-style: italic; - font-weight: normal; - color: #999; - } - .hasVirus { background: #f00; color: #fff; diff --git a/dev/View/Popup/Account.js b/dev/View/Popup/Account.js index 71e8ab12e..6117803fa 100644 --- a/dev/View/Popup/Account.js +++ b/dev/View/Popup/Account.js @@ -38,7 +38,7 @@ export class AccountPopupView extends AbstractViewPopup { this.submitRequest(false); if (iError) { this.submitError(getNotification(iError)); - this.submitErrorAdditional((data && data.ErrorMessageAdditional) || ''); + this.submitErrorAdditional(data?.ErrorMessageAdditional); } else { rl.app.accountsAndIdentities(); this.close(); @@ -54,7 +54,7 @@ export class AccountPopupView extends AbstractViewPopup { } onShow(account) { - if (account && account.isAdditional()) { + if (account?.isAdditional()) { this.isNew(false); this.email(account.email); } else { diff --git a/dev/View/Popup/AdvancedSearch.js b/dev/View/Popup/AdvancedSearch.js index 74800a7ed..00c86058b 100644 --- a/dev/View/Popup/AdvancedSearch.js +++ b/dev/View/Popup/AdvancedSearch.js @@ -1,6 +1,7 @@ import { koComputable } from 'External/ko'; import { i18n, trigger as translatorTrigger } from 'Common/Translator'; +import { pString } from 'Common/Utils'; import { MessagelistUserStore } from 'Stores/User/Messagelist'; @@ -16,6 +17,7 @@ export class AdvancedSearchPopupView extends AbstractViewPopup { to: '', subject: '', text: '', + repliedValue: -1, selectedDateValue: -1, selectedTreeValue: '', @@ -26,9 +28,18 @@ export class AdvancedSearchPopupView extends AbstractViewPopup { this.showMultisearch = koComputable(() => FolderUserStore.hasCapability('MULTISEARCH')); + this.repliedOptions = koComputable(() => { + translatorTrigger(); + return [ + { id: -1, name: '' }, + { id: 1, name: i18n('GLOBAL/YES') }, + { id: 0, name: i18n('GLOBAL/NO') } + ]; + }); + this.selectedDates = koComputable(() => { translatorTrigger(); - let prefix = 'SEARCH/LABEL_ADV_DATE_'; + let prefix = 'SEARCH/LABEL_DATE_'; return [ { id: -1, name: i18n(prefix + 'ALL') }, { id: 3, name: i18n(prefix + '3_DAYS') }, @@ -42,7 +53,7 @@ export class AdvancedSearchPopupView extends AbstractViewPopup { this.selectedTree = koComputable(() => { translatorTrigger(); - let prefix = 'SEARCH/LABEL_ADV_SUBFOLDERS_'; + let prefix = 'SEARCH/LABEL_SUBFOLDERS_'; return [ { id: '', name: i18n(prefix + 'NONE') }, { id: 'subtree-one', name: i18n(prefix + 'SUBTREE_ONE') }, @@ -60,66 +71,61 @@ export class AdvancedSearchPopupView extends AbstractViewPopup { this.close(); } - parseSearchStringValue(search) { - const parts = (search || '').split(/[\s]+/g); - parts.forEach(part => { - switch (part) { - case 'has:attachment': - this.hasAttachment(true); - break; - case 'is:unseen,flagged': - this.starred(true); - /* falls through */ - case 'is:unseen': - this.unseen(true); - break; - // no default - } - }); - } - buildSearchString() { const + self = this, data = new FormData(), append = (key, value) => value.length && data.append(key, value); - append('from', this.from().trim()); - append('to', this.to().trim()); - append('subject', this.subject().trim()); - append('text', this.text().trim()); - append('in', this.selectedTreeValue()); - if (-1 < this.selectedDateValue()) { + append('from', self.from().trim()); + append('to', self.to().trim()); + append('subject', self.subject().trim()); + append('text', self.text().trim()); + append('in', self.selectedTreeValue()); + if (-1 < self.selectedDateValue()) { let d = new Date(); - d.setDate(d.getDate() - this.selectedDateValue()); + d.setDate(d.getDate() - self.selectedDateValue()); append('since', d.toISOString().split('T')[0]); } let result = new URLSearchParams(data).toString(); - if (this.hasAttachment()) { + if (self.hasAttachment()) { result += '&attachment'; } - if (this.unseen()) { + if (self.unseen()) { result += '&unseen'; } - if (this.starred()) { + if (self.starred()) { result += '&flagged'; } + if (1 == self.repliedValue()) { + result += '&answered'; + } + if (0 == self.repliedValue()) { + result += '&unanswered'; + } return result.replace(/^&+/, ''); } onShow(search) { - this.from(''); - this.to(''); - this.subject(''); - this.text(''); - - this.selectedDateValue(-1); - this.hasAttachment(false); - this.starred(false); - this.unseen(false); - - this.parseSearchStringValue(search); + const self = this, + params = new URLSearchParams('?'+search); + self.from(pString(params.get('from'))); + self.to(pString(params.get('to'))); + self.subject(pString(params.get('subject'))); + self.text(pString(params.get('text'))); + self.selectedTreeValue(pString(params.get('in'))); +// self.selectedDateValue(params.get('since')); + self.selectedDateValue(-1); + self.hasAttachment(params.has('attachment')); + self.starred(params.has('flagged')); + self.unseen(params.has('unseen')); + if (params.has('answered')) { + self.repliedValue(1); + } else if (params.has('unanswered')) { + self.repliedValue(0); + } } } diff --git a/dev/View/Popup/Ask.js b/dev/View/Popup/Ask.js index ae1f8388e..ba1c0d8c5 100644 --- a/dev/View/Popup/Ask.js +++ b/dev/View/Popup/Ask.js @@ -11,6 +11,8 @@ export class AskPopupView extends AbstractViewPopup { askDesc: '', yesButton: '', noButton: '', + username: '', + askUsername: false, passphrase: '', askPass: false }); @@ -40,15 +42,19 @@ export class AskPopupView extends AbstractViewPopup { * @param {boolean=} focusOnShow = true * @returns {void} */ - onShow(sAskDesc, fYesFunc = null, fNoFunc = null, focusOnShow = true, askPass = false, btnText = '') { + onShow(sAskDesc, fYesFunc = null, fNoFunc = null, focusOnShow = true, ask = 0, btnText = '') { this.askDesc(sAskDesc || ''); - this.askPass(askPass); + this.askUsername(ask & 2); + this.askPass(ask & 1); + this.username(''); this.passphrase(''); - this.yesButton(i18n(btnText || 'POPUPS_ASK/BUTTON_YES')); - this.noButton(i18n(askPass ? 'GLOBAL/CANCEL' : 'POPUPS_ASK/BUTTON_NO')); + this.yesButton(i18n(btnText || 'GLOBAL/YES')); + this.noButton(i18n(ask ? 'GLOBAL/CANCEL' : 'GLOBAL/NO')); this.fYesAction = fYesFunc; this.fNoAction = fNoFunc; - this.focusOnShow = focusOnShow ? (askPass ? 'input[type="password"]' : '.buttonYes') : ''; + this.focusOnShow = focusOnShow + ? (ask ? 'input[type="'+(ask&2?'text':'password')+'"]' : '.buttonYes') + : ''; } afterShow() { @@ -63,12 +69,15 @@ export class AskPopupView extends AbstractViewPopup { onBuild() { // shortcuts.add('tab', 'shift', 'Ask', () => { shortcuts.add('tab,arrowright,arrowleft', '', 'Ask', () => { - let btn = this.querySelector('.buttonYes'); - if (btn.matches(':focus')) { - btn = this.querySelector('.buttonNo'); + let yes = this.querySelector('.buttonYes'), + no = this.querySelector('.buttonNo'); + if (yes.matches(':focus')) { + no.focus(); + return false; + } else if (no.matches(':focus')) { + yes.focus(); + return false; } - btn.focus(); - return false; }); } } @@ -80,7 +89,20 @@ AskPopupView.password = function(sAskDesc, btnText) { () => resolve(this.__vm.passphrase()), () => resolve(null), true, - true, + 1, + btnText + ]); + }); +} + +AskPopupView.credentials = function(sAskDesc, btnText) { + return new Promise(resolve => { + this.showModal([ + sAskDesc, + () => resolve({username:this.__vm.username(), password:this.__vm.passphrase()}), + () => resolve(null), + true, + 3, btnText ]); }); diff --git a/dev/View/Popup/Compose.js b/dev/View/Popup/Compose.js index 75e252571..1f56d11b1 100644 --- a/dev/View/Popup/Compose.js +++ b/dev/View/Popup/Compose.js @@ -16,11 +16,11 @@ import { encodeHtml, HtmlEditor, htmlToPlain } from 'Common/Html'; import { koArrayWithDestroy } from 'External/ko'; import { UNUSED_OPTION_VALUE } from 'Common/Consts'; -import { messagesDeleteHelper } from 'Common/Folders'; +import { folderInformation, messagesDeleteHelper } from 'Common/Folders'; import { serverRequest } from 'Common/Links'; import { i18n, getNotification, getUploadErrorDescByCode, timestampToString } from 'Common/Translator'; import { MessageFlagsCache, setFolderHash } from 'Common/Cache'; -import { Settings, SettingsCapa, SettingsGet, elementById, addShortcut } from 'Common/Globals'; +import { Settings, SettingsCapa, SettingsGet, elementById, addShortcut, createElement } from 'Common/Globals'; //import { exitFullscreen, isFullscreen, toggleFullscreen } from 'Common/Fullscreen'; import { AppUserStore } from 'Stores/User/App'; @@ -50,9 +50,13 @@ import { ThemeStore } from 'Stores/Theme'; let alreadyFullscreen; */ +let oLastMessage; + const ScopeCompose = 'Compose', + tpl = createElement('template'), + base64_encode = text => btoa(unescape(encodeURIComponent(text))).match(/.{1,76}/g).join('\r\n'), email = new EmailModel(), @@ -77,7 +81,7 @@ const if (FolderUserStore.currentFolderFullName() === draftsFolder) { MessagelistUserStore.reload(true); } else { - rl.app.folderInformation(draftsFolder); + folderInformation(draftsFolder); } } }, @@ -209,8 +213,8 @@ export class ComposePopupView extends AbstractViewPopup { super('Compose'); const fEmailOutInHelper = (context, identity, name, isIn) => { - if (identity && context && identity[name]() && (isIn ? true : context[name]())) { - const identityEmail = identity[name](); + const identityEmail = context && identity?.[name](); + if (identityEmail && (isIn ? true : context[name]())) { let list = context[name]().trim().split(','); list = list.filter(email => { @@ -218,15 +222,12 @@ export class ComposePopupView extends AbstractViewPopup { return email && identityEmail.trim() !== email; }); - if (isIn) { - list.push(identityEmail); - } + isIn && list.push(identityEmail); context[name](list.join(',')); } }; - this.oLastMessage = null; this.oEditor = null; this.aDraftInfo = null; this.sInReplyTo = ''; @@ -352,7 +353,7 @@ export class ComposePopupView extends AbstractViewPopup { }, attachmentsInProcess: () => this.attachments.filter(item => item && !item.complete()), - attachmentsInError: () => this.attachments.filter(item => item && item.error()), + attachmentsInError: () => this.attachments.filter(item => item?.error()), attachmentsCount: () => this.attachments.length, attachmentsInErrorCount: () => this.attachmentsInError.length, @@ -508,7 +509,7 @@ export class ComposePopupView extends AbstractViewPopup { alternative.children.push(data); data = alternative; } - if (sign && !draft && sign[1]) { + if (!draft && sign?.[1]) { if ('openpgp' == sign[0]) { // Doesn't sign attachments params.Html = params.Text = ''; @@ -608,7 +609,7 @@ export class ComposePopupView extends AbstractViewPopup { this.savedErrorDesc(i18n('COMPOSE/SAVED_ERROR_ON_SEND').trim()); } else { this.sendError(true); - this.sendErrorDesc(getNotification(iError, data && data.ErrorMessage) + this.sendErrorDesc(getNotification(iError, data?.ErrorMessage) || getNotification(Notification.CantSendMessage)); } } else { @@ -755,11 +756,11 @@ export class ComposePopupView extends AbstractViewPopup { // getAutocomplete emailsSource(value, fResponse) { - Remote.request('Suggestions', + Remote.abort('Suggestions').request('Suggestions', (iError, data) => { if (!iError && isArray(data.Result)) { fResponse( - data.Result.map(item => (item && item[0] ? (new EmailModel(item[0], item[1])).toLine() : null)) + data.Result.map(item => (item?.[0] ? (new EmailModel(item[0], item[1])).toLine() : null)) .filter(v => v) ); } else if (Notification.RequestAborted !== iError) { @@ -769,15 +770,12 @@ export class ComposePopupView extends AbstractViewPopup { { Query: value // ,Page: 1 - }, - null, - '', - ['Suggestions'] + } ); } selectIdentity(identity) { - identity = identity && identity.item; + identity = identity?.item; if (identity) { this.currentIdentity(identity); this.setSignatureFromIdentity(identity); @@ -828,7 +826,7 @@ export class ComposePopupView extends AbstractViewPopup { this.editor(editor => { let signature = identity.signature() || '', isHtml = ':HTML:' === signature.slice(0, 6), - fromLine = this.oLastMessage ? emailArrayToStringLineHelper(this.oLastMessage.from, true) : ''; + fromLine = oLastMessage ? emailArrayToStringLineHelper(oLastMessage.from, true) : ''; if (fromLine) { signature = signature.replace(/{{FROM-FULL}}/g, fromLine); if (!fromLine.includes(' ') && 0 < fromLine.indexOf('@')) { @@ -909,24 +907,20 @@ export class ComposePopupView extends AbstractViewPopup { sText = '', identity = null, aDraftInfo = null, - message = null; + message = 1 === arrayLength(oMessageOrArray) + ? oMessageOrArray[0] + : (isArray(oMessageOrArray) ? null : oMessageOrArray); - const excludeEmail = {}, + const +// excludeEmail = new Set(), + excludeEmail = {}, mEmail = AccountUserStore.email(), lineComposeType = sType || ComposeType.Empty; - if (oMessageOrArray) { - message = - 1 === arrayLength(oMessageOrArray) - ? oMessageOrArray[0] - : isArray(oMessageOrArray) - ? null - : oMessageOrArray; - } + oLastMessage = message; - this.oLastMessage = message; - - if (null !== mEmail) { + if (mEmail) { +// excludeEmail.add(mEmail); excludeEmail[mEmail] = true; } @@ -934,6 +928,7 @@ export class ComposePopupView extends AbstractViewPopup { identity = findIdentityByMessage(lineComposeType, message); if (identity) { +// excludeEmail.add(identity.email()); excludeEmail[identity.email()] = true; } @@ -1030,16 +1025,22 @@ export class ComposePopupView extends AbstractViewPopup { // no default } - sText = message.bodyAsHTML(); let encrypted; + // https://github.com/the-djmaze/snappymail/issues/491 + tpl.innerHTML = message.bodyAsHTML(); + tpl.content.querySelectorAll('img').forEach(img => + img.dataset.xSrcCid || img.dataset.xSrc || img.replaceWith(img.alt || img.title) + ); + sText = tpl.innerHTML.trim(); + switch (lineComposeType) { case ComposeType.Reply: case ComposeType.ReplyAll: sFrom = message.fromToLine(false, true); sText = '

' + i18n('COMPOSE/REPLY_MESSAGE_TITLE', { DATETIME: sDate, EMAIL: sFrom }) + ':

' - + sText.replace(/]+>/g, '').replace(/]+><\/a>/g, '').trim() + + sText.trim() + '
'; break; @@ -1068,6 +1069,7 @@ export class ComposePopupView extends AbstractViewPopup { case ComposeType.ForwardAsAttachment: sText = ''; break; + default: encrypted = PgpUserStore.isEncrypted(sText); if (encrypted) { @@ -1131,7 +1133,8 @@ export class ComposePopupView extends AbstractViewPopup { this.setFocusInPopup(); } - const downloads = this.getAttachmentsDownloadsForUpload(); + // item.CID item.isInline item.isLinked + const downloads = this.attachments.filter(item => item && !item.tempName()).map(item => item.id); if (arrayLength(downloads)) { Remote.request('MessageUploadAttachments', (iError, oData) => { @@ -1148,7 +1151,7 @@ export class ComposePopupView extends AbstractViewPopup { }); } else { this.attachments.forEach(attachment => { - if (attachment && attachment.fromMessage) { + if (attachment?.fromMessage) { attachment .waiting(false) .uploading(false) @@ -1175,7 +1178,7 @@ export class ComposePopupView extends AbstractViewPopup { if (!this.to()) { this.to.focused(true); } else if (!this.to.focused()) { - this.oEditor && this.oEditor.focus(); + this.oEditor?.focus(); } }, 100); } @@ -1261,7 +1264,7 @@ export class ComposePopupView extends AbstractViewPopup { }) .on('onComplete', (id, result, data) => { const attachment = this.getAttachmentById(id), - response = (data && data.Result) || {}, + response = data?.Result || {}, errorCode = response.ErrorCode, attachmentJson = result && response.Attachment; @@ -1349,7 +1352,7 @@ export class ComposePopupView extends AbstractViewPopup { prepareAttachmentsForSendOrSave() { const result = {}; this.attachments.forEach(item => { - if (item && item.complete() && item.tempName() && item.enabled()) { + if (item?.complete() && item?.tempName() && item?.enabled()) { result[item.tempName()] = [item.fileName(), item.isInline ? '1' : '0', item.CID, item.contentLocation]; } }); @@ -1376,7 +1379,7 @@ export class ComposePopupView extends AbstractViewPopup { oJua || attachment.waiting(false).uploading(true); attachment.cancel = () => { this.attachments.remove(attachment); - oJua && oJua.cancel(attachment.id); + oJua?.cancel(attachment.id); }; this.attachments.push(attachment); view && this.attachmentsArea(); @@ -1402,35 +1405,22 @@ export class ComposePopupView extends AbstractViewPopup { if (message) { if (ComposeType.ForwardAsAttachment === type) { this.addMessageAsAttachment(message); - } else { + } else if ([ + ComposeType.Reply, ComposeType.ReplyAll, + ComposeType.Forward, ComposeType.Draft, ComposeType.EditAsNew + ].includes(type)) { message.attachments.forEach(item => { - let add = false; - switch (type) { - case ComposeType.Reply: - case ComposeType.ReplyAll: - break; - - case ComposeType.Forward: - case ComposeType.Draft: - case ComposeType.EditAsNew: - add = true; - break; - // no default - } - - if (add) { - const attachment = new ComposeAttachmentModel( - item.download, - item.fileName, - item.estimatedSize, - item.isInline(), - item.isLinked(), - item.cid, - item.contentLocation - ); - attachment.fromMessage = true; - this.addAttachment(attachment); - } + const attachment = new ComposeAttachmentModel( + item.download, + item.fileName, + item.estimatedSize, + item.isInline(), + item.isLinked(), + item.cid, + item.contentLocation + ); + attachment.fromMessage = true; + this.addAttachment(attachment); }); } } @@ -1443,7 +1433,7 @@ export class ComposePopupView extends AbstractViewPopup { isEmptyForm(includeAttachmentInProgress = true) { const withoutAttachment = includeAttachmentInProgress ? !this.attachments.length - : !this.attachments.some(item => item && item.complete()); + : !this.attachments.some(item => item?.complete()); return ( !this.to.length && @@ -1463,8 +1453,8 @@ export class ComposePopupView extends AbstractViewPopup { this.replyTo(''); this.subject(''); - this.requestDsn(false); - this.requestReadReceipt(false); + this.requestDsn(SettingsUserStore.requestDsn()); + this.requestReadReceipt(SettingsUserStore.requestReadReceipt()); this.markAsImportant(false); this.bodyArea(); @@ -1485,8 +1475,8 @@ export class ComposePopupView extends AbstractViewPopup { this.showBcc(false); this.showReplyTo(false); - this.pgpSign(false); - this.pgpEncrypt(false); + this.pgpSign(SettingsUserStore.pgpSign()); + this.pgpEncrypt(SettingsUserStore.pgpEncrypt()); this.attachments([]); @@ -1499,20 +1489,11 @@ export class ComposePopupView extends AbstractViewPopup { this.sending(false); this.saving(false); - this.oEditor && this.oEditor.clear(); + this.oEditor?.clear(); this.dropMailvelope(); } - /** - * @returns {Array} - */ - getAttachmentsDownloadsForUpload() { - return this.attachments.filter(item => item && !item.tempName()).map( - item => item.id - ); - } - mailvelopeArea() { if (!this.mailvelope) { /** diff --git a/dev/View/Popup/Contacts.js b/dev/View/Popup/Contacts.js index 9f1d81ded..5d86f6cf3 100644 --- a/dev/View/Popup/Contacts.js +++ b/dev/View/Popup/Contacts.js @@ -78,7 +78,7 @@ export class ContactsPopupView extends AbstractViewPopup { contactsPaginator: computedPaginatorHelper(this.contactsPage, pagecount), contactsCheckedOrSelected: () => { - const checked = ContactUserStore.filter(item => item.checked && item.checked()), + const checked = ContactUserStore.filter(item => item.checked?.()), selected = this.selectorContact(); return selected @@ -128,7 +128,7 @@ export class ContactsPopupView extends AbstractViewPopup { const data = oItem.getNameAndEmailHelper(), email = data ? new EmailModel(data[0], data[1]) : null; - if (email && email.validate()) { + if (email?.validate()) { return email; } } @@ -235,7 +235,7 @@ export class ContactsPopupView extends AbstractViewPopup { if (this.contactsCheckedOrSelected().length) { Remote.request('ContactsDelete', (iError, oData) => { - if (500 < (!iError && oData && oData.Time ? pInt(oData.Time) : 0)) { + if (500 < (!iError && oData?.Time) ? pInt(oData.Time) : 0) { this.reloadContactList(this.bDropPageAfterDelete); } else { setTimeout(() => this.reloadContactList(this.bDropPageAfterDelete), 500); @@ -274,7 +274,7 @@ export class ContactsPopupView extends AbstractViewPopup { } ContactUserStore.loading(true); - Remote.request('Contacts', + Remote.abort('Contacts').request('Contacts', (iError, data) => { let count = 0, list = []; @@ -299,10 +299,7 @@ export class ContactsPopupView extends AbstractViewPopup { Offset: offset, Limit: CONTACTS_PER_PAGE, Search: this.search() - }, - null, - '', - ['Contacts'] + } ); } diff --git a/dev/View/Popup/Domain.js b/dev/View/Popup/Domain.js index dbe07bc03..d5bc6151b 100644 --- a/dev/View/Popup/Domain.js +++ b/dev/View/Popup/Domain.js @@ -8,6 +8,8 @@ import { AbstractViewPopup } from 'Knoin/AbstractViews'; import { DomainAdminStore } from 'Stores/Admin/Domain'; +import { AskPopupView } from 'View/Popup/Ask'; + const domainToParams = oDomain => ({ Name: oDomain.name(), @@ -179,39 +181,46 @@ export class DomainPopupView extends AbstractViewPopup { testConnectionCommand() { this.clearTesting(false); - this.testing(true); + // https://github.com/the-djmaze/snappymail/issues/477 + AskPopupView.credentials('IMAP', 'GLOBAL/TEST').then(credentials => { + if (credentials) { + this.testing(true); + const params = domainToParams(this); + params.username = credentials.username; + params.password = credentials.password; + Remote.request('AdminDomainTest', + (iError, oData) => { + this.testing(false); + if (iError) { + this.testingImapError(true); + this.testingSieveError(true); + this.testingSmtpError(true); + } else { + this.testingDone(true); + this.testingImapError(true !== oData.Result.Imap); + this.testingSieveError(true !== oData.Result.Sieve); + this.testingSmtpError(true !== oData.Result.Smtp); - Remote.request('AdminDomainTest', - (iError, oData) => { - this.testing(false); - if (iError) { - this.testingImapError(true); - this.testingSieveError(true); - this.testingSmtpError(true); - } else { - this.testingDone(true); - this.testingImapError(true !== oData.Result.Imap); - this.testingSieveError(true !== oData.Result.Sieve); - this.testingSmtpError(true !== oData.Result.Smtp); + if (this.testingImapError() && oData.Result.Imap) { + this.testingImapErrorDesc(''); + this.testingImapErrorDesc(oData.Result.Imap); + } - if (this.testingImapError() && oData.Result.Imap) { - this.testingImapErrorDesc(''); - this.testingImapErrorDesc(oData.Result.Imap); - } + if (this.testingSieveError() && oData.Result.Sieve) { + this.testingSieveErrorDesc(''); + this.testingSieveErrorDesc(oData.Result.Sieve); + } - if (this.testingSieveError() && oData.Result.Sieve) { - this.testingSieveErrorDesc(''); - this.testingSieveErrorDesc(oData.Result.Sieve); - } - - if (this.testingSmtpError() && oData.Result.Smtp) { - this.testingSmtpErrorDesc(''); - this.testingSmtpErrorDesc(oData.Result.Smtp); - } - } - }, - domainToParams(this) - ); + if (this.testingSmtpError() && oData.Result.Smtp) { + this.testingSmtpErrorDesc(''); + this.testingSmtpErrorDesc(oData.Result.Smtp); + } + } + }, + params + ); + } + }); } onDomainCreateOrSaveResponse(iError) { @@ -239,7 +248,7 @@ export class DomainPopupView extends AbstractViewPopup { if (oDomain) { this.enableSmartPorts(false); this.edit(true); - forEachObjectEntry(oDomain, (key, value) => this[key] && this[key](value)); + forEachObjectEntry(oDomain, (key, value) => this[key]?.(value)); this.enableSmartPorts(true); } } diff --git a/dev/View/Popup/FolderSystem.js b/dev/View/Popup/FolderSystem.js index a5186a3f2..3b6994cbe 100644 --- a/dev/View/Popup/FolderSystem.js +++ b/dev/View/Popup/FolderSystem.js @@ -19,7 +19,7 @@ export class FolderSystemPopupView extends AbstractViewPopup { this.folderSelectList = koComputable(() => folderListOptionsBuilder( - FolderUserStore.folderListSystemNames(), + FolderUserStore.systemFoldersNames(), [ ['', i18n('POPUPS_SYSTEM_FOLDERS/SELECT_CHOOSE_ONE')], [UNUSED_OPTION_VALUE, i18n('POPUPS_SYSTEM_FOLDERS/SELECT_UNUSE_NAME')] diff --git a/dev/View/Popup/Identity.js b/dev/View/Popup/Identity.js index dcdbde8bc..2972f7ad8 100644 --- a/dev/View/Popup/Identity.js +++ b/dev/View/Popup/Identity.js @@ -63,9 +63,7 @@ export class IdentityPopupView extends AbstractViewPopup { submitForm() { if (!this.submitRequest()) { - if (this.signature && this.signature.__fetchEditorValue) { - this.signature.__fetchEditorValue(); - } + this.signature?.__fetchEditorValue?.(); if (!this.emailHasError()) { this.emailHasError(!this.email().trim()); diff --git a/dev/View/Popup/Languages.js b/dev/View/Popup/Languages.js index ff62f63e3..f7d33327c 100644 --- a/dev/View/Popup/Languages.js +++ b/dev/View/Popup/Languages.js @@ -51,7 +51,7 @@ export class LanguagesPopupView extends AbstractViewPopup { } changeLanguage(lang) { - this.fLang && this.fLang(lang); + this.fLang?.(lang); this.close(); } } diff --git a/dev/View/Popup/OpenPgpGenerate.js b/dev/View/Popup/OpenPgpGenerate.js index 6d50d8dd8..0b392c586 100644 --- a/dev/View/Popup/OpenPgpGenerate.js +++ b/dev/View/Popup/OpenPgpGenerate.js @@ -94,7 +94,7 @@ export class OpenPgpGeneratePopupView extends AbstractViewPopup { showError(e) { console.log(e); - if (e && e.message) { + if (e?.message) { this.submitError(e.message); } } diff --git a/dev/View/User/Login.js b/dev/View/User/Login.js index 51eb9aed6..03066afb0 100644 --- a/dev/View/User/Login.js +++ b/dev/View/User/Login.js @@ -114,9 +114,9 @@ export class LoginUserView extends AbstractViewLogin { if (Notification.InvalidInputArgument == iError) { iError = Notification.AuthError; } - this.submitError(getNotification(iError, (oData ? oData.ErrorMessage : ''), + this.submitError(getNotification(iError, oData?.ErrorMessage, Notification.UnknownNotification)); - this.submitErrorAdditional((oData && oData.ErrorMessageAdditional) || ''); + this.submitErrorAdditional(oData?.ErrorMessageAdditional); } else { rl.setData(oData.Result); } diff --git a/dev/View/User/MailBox/FolderList.js b/dev/View/User/MailBox/FolderList.js index 7b05be5b5..113f3d98d 100644 --- a/dev/View/User/MailBox/FolderList.js +++ b/dev/View/User/MailBox/FolderList.js @@ -31,9 +31,7 @@ export class MailFolderList extends AbstractViewLeft { this.composeInEdit = AppUserStore.composeInEdit; - this.folderList = FolderUserStore.folderList; - this.folderListSystem = FolderUserStore.folderListSystem; - this.foldersChanging = FolderUserStore.foldersChanging; + this.systemFolders = FolderUserStore.systemFolders; this.moveAction = moveAction; @@ -84,7 +82,7 @@ export class MailFolderList extends AbstractViewLeft { } el = eqs(event, 'a'); - if (el && el.matches('.selectable')) { + if (el?.matches('.selectable')) { event.preventDefault(); const folder = ko.dataFor(el); if (folder) { @@ -172,10 +170,10 @@ export class MailFolderList extends AbstractViewLeft { AppUserStore.focusedState.subscribe(value => { let el = qs('li a.focused'); - el && el.classList.remove('focused'); + el?.classList.remove('focused'); if (Scope.FolderList === value) { el = qs('li a.selected'); - el && el.classList.add('focused'); + el?.classList.add('focused'); } }); } diff --git a/dev/View/User/MailBox/MessageList.js b/dev/View/User/MailBox/MessageList.js index b023e0c95..d94831820 100644 --- a/dev/View/User/MailBox/MessageList.js +++ b/dev/View/User/MailBox/MessageList.js @@ -20,7 +20,7 @@ import { isFullscreen, toggleFullscreen } from 'Common/Fullscreen'; import { mailBox, serverRequest } from 'Common/Links'; import { Selector } from 'Common/Selector'; -import { i18n, initOnStartOrLangChange } from 'Common/Translator'; +import { i18n } from 'Common/Translator'; import { getFolderFromCacheList, @@ -55,14 +55,14 @@ const */ listAction = (...args) => MessagelistUserStore.setAction(...args); +let + iGoToUpOrDownTimeout = 0, + sLastSearchValue = ''; + export class MailMessageList extends AbstractViewRight { constructor() { super(); - this.emptySubjectValue = ''; - - this.iGoToUpOrDownTimeout = 0; - this.newMoveToFolder = !!SettingsGet('NewMoveToFolder'); this.allowSearch = SettingsCapa('Search'); @@ -76,19 +76,10 @@ export class MailMessageList extends AbstractViewRight { this.isMobile = ThemeStore.isMobile; this.leftPanelDisabled = leftPanelDisabled; - this.messageListSearch = MessagelistUserStore.listSearch; - this.messageListError = MessagelistUserStore.error; - this.popupVisibility = arePopupsVisible; this.useCheckboxesInList = SettingsUserStore.useCheckboxesInList; - this.messageListThreadUid = MessagelistUserStore.endThreadUid; - - this.messageListIsLoading = MessagelistUserStore.isLoading; - - initOnStartOrLangChange(() => this.emptySubjectValue = i18n('MESSAGE_LIST/EMPTY_SUBJECT_TEXT')); - this.userUsageProc = FolderUserStore.quotaPercentage; this.addObservables({ @@ -99,15 +90,13 @@ export class MailMessageList extends AbstractViewRight { dragOverArea: null, dragOverBodyArea: null, - inputMessageListSearchFocus: false + focusSearch: false }); // append drag and drop this.dragOver = ko.observable(false).extend({ throttle: 1 }); this.dragOverEnter = ko.observable(false).extend({ throttle: 1 }); - this.sLastSearchValue = ''; - this.addComputables({ sortSupported: () => @@ -136,9 +125,9 @@ export class MailMessageList extends AbstractViewRight { } }, - inputProxyMessageListSearch: { + inputSearch: { read: MessagelistUserStore.mainSearch, - write: value => this.sLastSearchValue = value + write: value => sLastSearchValue = value }, isIncompleteChecked: () => { @@ -146,33 +135,28 @@ export class MailMessageList extends AbstractViewRight { return c && MessagelistUserStore().length > c; }, - hasMessages: () => 0 < MessagelistUserStore().length, - isSpamFolder: () => (FolderUserStore.spamFolder() || 0) === MessagelistUserStore().Folder, - isSpamDisabled: () => UNUSED_OPTION_VALUE === FolderUserStore.spamFolder(), - isTrashFolder: () => (FolderUserStore.trashFolder() || 0) === MessagelistUserStore().Folder, isDraftFolder: () => (FolderUserStore.draftsFolder() || 0) === MessagelistUserStore().Folder, - isSentFolder: () => (FolderUserStore.sentFolder() || 0) === MessagelistUserStore().Folder, + archiveAllowed: () => + (FolderUserStore.archiveFolder() || 0) !== MessagelistUserStore().Folder + && UNUSED_OPTION_VALUE !== FolderUserStore.archiveFolder() + && !this.isDraftFolder(), - isArchiveFolder: () => (FolderUserStore.archiveFolder() || 0) === MessagelistUserStore().Folder, + spamAllowed: () => UNUSED_OPTION_VALUE !== FolderUserStore.spamFolder() + && (FolderUserStore.sentFolder() || 0) !== MessagelistUserStore().Folder + && !this.isDraftFolder(), - isArchiveDisabled: () => UNUSED_OPTION_VALUE === FolderUserStore.archiveFolder(), + isSpamVisible: () => !this.isSpamFolder() && this.spamAllowed(), - isArchiveVisible: () => !this.isArchiveFolder() && !this.isArchiveDisabled() && !this.isDraftFolder(), + isUnSpamVisible: () => this.isSpamFolder() && this.spamAllowed(), - isSpamVisible: () => - !this.isSpamFolder() && !this.isSpamDisabled() && !this.isDraftFolder() && !this.isSentFolder(), + mobileCheckedStateShow: () => ThemeStore.isMobile() ? MessagelistUserStore.listChecked().length : 1, - isUnSpamVisible: () => - this.isSpamFolder() && !this.isSpamDisabled() && !this.isDraftFolder() && !this.isSentFolder(), - - mobileCheckedStateShow: () => ThemeStore.isMobile() ? 0 < MessagelistUserStore.listChecked().length : true, - - mobileCheckedStateHide: () => ThemeStore.isMobile() ? !MessagelistUserStore.listChecked().length : true, + mobileCheckedStateHide: () => ThemeStore.isMobile() ? !MessagelistUserStore.listChecked().length : 1, sortText: () => { let mode = FolderUserStore.sortMode(), @@ -188,8 +172,6 @@ export class MailMessageList extends AbstractViewRight { } }); - this.hasCheckedOrSelectedLines = MessagelistUserStore.hasCheckedOrSelected, - this.selector = new Selector( MessagelistUserStore, MessagelistUserStore.selectedMessage, @@ -228,7 +210,7 @@ export class MailMessageList extends AbstractViewRight { const sFolder = e.detail.Folder, iUid = e.detail.Uid; const message = MessagelistUserStore.find( - item => item && sFolder === item.folder && iUid == item.uid + item => sFolder === item?.folder && iUid == item?.uid ); if ('INBOX' === sFolder) { @@ -344,7 +326,7 @@ export class MailMessageList extends AbstractViewRight { moveNewCommand(vm, event) { if (this.newMoveToFolder && this.mobileCheckedStateShow()) { - if (vm && event && event.preventDefault) { + if (vm && event?.preventDefault) { event.preventDefault(); event.stopPropagation(); } @@ -364,8 +346,8 @@ export class MailMessageList extends AbstractViewRight { return false; } - clearTimeout(this.iGoToUpOrDownTimeout); - this.iGoToUpOrDownTimeout = setTimeout(() => { + clearTimeout(iGoToUpOrDownTimeout); + iGoToUpOrDownTimeout = setTimeout(() => { let prev, next, temp, current; this.messageListPaginator().find(item => { @@ -412,7 +394,7 @@ export class MailMessageList extends AbstractViewRight { cancelSearch() { MessagelistUserStore.mainSearch(''); - this.inputMessageListSearchFocus(false); + this.focusSearch(false); } cancelThreadUid() { @@ -446,7 +428,7 @@ export class MailMessageList extends AbstractViewRight { getDragData(event) { const item = ko.dataFor(doc.elementFromPoint(event.clientX, event.clientY)); - item && item.checked && item.checked(true); + item?.checked?.(true); const uids = MessagelistUserStore.listCheckedOrSelectedUidsWithSubMails(); item && !uids.includes(item.uid) && uids.push(item.uid); return uids.length ? { @@ -589,7 +571,7 @@ export class MailMessageList extends AbstractViewRight { } gotoThread(message) { - if (message && 0 < message.threadsLen()) { + if (0 < message?.threadsLen()) { MessagelistUserStore.pageBeforeThread(MessagelistUserStore.page()); hasher.setHash( @@ -643,7 +625,7 @@ export class MailMessageList extends AbstractViewRight { el && this.gotoThread(ko.dataFor(el)); }, dblclick: event => { - let el = eqs(event, '.actionHandle'); + let el = eqs(event, '.actionHandle'); el && this.gotoThread(ko.dataFor(el)); } }); @@ -684,7 +666,7 @@ export class MailMessageList extends AbstractViewRight { addShortcut('enter,open', '', Scope.MessageList, () => { if (formFieldFocused()) { - MessagelistUserStore.mainSearch(this.sLastSearchValue); + MessagelistUserStore.mainSearch(sLastSearchValue); return false; } if (MessageUserStore.message() && this.useAutoSelect()) { @@ -735,15 +717,10 @@ export class MailMessageList extends AbstractViewRight { }); registerShortcut('t', '', [Scope.MessageList], () => { - let message = MessagelistUserStore.selectedMessage(); - if (!message) { - message = MessagelistUserStore.focusedMessage(); - } - - if (message && 0 < message.threadsLen()) { + let message = MessagelistUserStore.selectedMessage() || MessagelistUserStore.focusedMessage(); + if (0 < message?.threadsLen()) { this.gotoThread(message); } - return false; }); @@ -778,7 +755,7 @@ export class MailMessageList extends AbstractViewRight { if (SettingsCapa('Search')) { // search input focus addShortcut('/', '', [Scope.MessageList, Scope.MessageView], () => { - this.inputMessageListSearchFocus(true); + this.focusSearch(true); return false; }); } diff --git a/dev/View/User/MailBox/MessageView.js b/dev/View/User/MailBox/MessageView.js index 3c0d039f9..20b4d7613 100644 --- a/dev/View/User/MailBox/MessageView.js +++ b/dev/View/User/MailBox/MessageView.js @@ -7,7 +7,6 @@ import { Scope } from 'Common/Enums'; import { ComposeType, - ClientSideKeyNameLastReplyAction, ClientSideKeyNameMessageHeaderFullInfo, ClientSideKeyNameMessageAttachmentControls, FolderType, @@ -94,10 +93,11 @@ export class MailMessageView extends AbstractViewRight { } }, this.messageVisibility); + this.msgDefaultAction = SettingsUserStore.msgDefaultAction; + this.addObservables({ showAttachmentControls: !!Local.get(ClientSideKeyNameMessageAttachmentControls), downloadAsZipLoading: false, - lastReplyAction_: '', showFullInfo: '1' === Local.get(ClientSideKeyNameMessageHeaderFullInfo), moreDropdownTrigger: false, @@ -134,19 +134,10 @@ export class MailMessageView extends AbstractViewRight { allowAttachmentControls: () => arrayLength(attachmentsActions) && SettingsCapa('AttachmentsActions'), downloadAsZipAllowed: () => this.attachmentsActions.includes('zip') - && (currentMessage() ? currentMessage().attachments : []) - .filter(item => item && !item.isLinked() && item.checked() && item.download) + && (currentMessage()?.attachments || []) + .filter(item => item?.download && !item?.isLinked() && item?.checked()) .length, - lastReplyAction: { - read: this.lastReplyAction_, - write: value => this.lastReplyAction_( - [ComposeType.Reply, ComposeType.ReplyAll, ComposeType.Forward].includes(value) - ? ComposeType.Reply - : value - ) - }, - tagsAllowed: () => FolderUserStore.currentFolder() ? FolderUserStore.currentFolder().tagsAllowed() : false, messageVisibility: () => !MessageUserStore.loading() && !!currentMessage(), @@ -182,8 +173,6 @@ export class MailMessageView extends AbstractViewRight { }); this.addSubscribables({ - lastReplyAction_: value => Local.set(ClientSideKeyNameLastReplyAction, value), - message: message => { MessageUserStore.activeDom(null); @@ -207,8 +196,6 @@ export class MailMessageView extends AbstractViewRight { showFullInfo: value => Local.set(ClientSideKeyNameMessageHeaderFullInfo, value ? '1' : '0') }); - this.lastReplyAction(Local.get(ClientSideKeyNameLastReplyAction) || ComposeType.Reply); - // commands this.replyCommand = createCommandReplyHelper(ComposeType.Reply); this.replyAllCommand = createCommandReplyHelper(ComposeType.ReplyAll); @@ -256,7 +243,6 @@ export class MailMessageView extends AbstractViewRight { * @returns {void} */ replyOrforward(sType) { - this.lastReplyAction(sType); showMessageComposer([sType, currentMessage()]); } @@ -300,7 +286,7 @@ export class MailMessageView extends AbstractViewRight { el = eqs(event, '.attachmentsPlace .attachmentItem .attachmentNameParent'); if (el) { const attachment = ko.dataFor(el); - if (attachment && attachment.linkDownload()) { + if (attachment?.linkDownload()) { if ('message/rfc822' == attachment.mimeType) { // TODO rl.fetch(attachment.linkDownload()).then(response => { @@ -407,7 +393,7 @@ export class MailMessageView extends AbstractViewRight { // toggle message blockquotes registerShortcut('b', '', [Scope.MessageList, Scope.MessageView], () => { const message = currentMessage(); - if (message && message.body) { + if (message?.body) { message.body.querySelectorAll('.rlBlockquoteSwitcher').forEach(node => node.click()); return false; } @@ -425,7 +411,7 @@ export class MailMessageView extends AbstractViewRight { // print addShortcut('p,printscreen', 'meta', [Scope.MessageView, Scope.MessageList], () => { - currentMessage() && currentMessage().printMessage(); + currentMessage()?.printMessage(); return false; }); @@ -524,7 +510,7 @@ export class MailMessageView extends AbstractViewRight { downloadAsZip() { const hashes = (currentMessage() ? currentMessage().attachments : []) - .map(item => (item && !item.isLinked() && item.checked() ? item.download : '')) + .map(item => item?.checked() && !item?.isLinked() ? item.download : '') .filter(v => v); if (hashes.length) { Remote.post('AttachmentsActions', this.downloadAsZipLoading, { @@ -532,7 +518,7 @@ export class MailMessageView extends AbstractViewRight { Hashes: hashes }) .then(result => { - let hash = result && result.Result && result.Result.FileHash; + let hash = result?.Result?.FileHash; if (hash) { download(attachmentDownload(hash), hash+'.zip'); } else { @@ -591,7 +577,7 @@ export class MailMessageView extends AbstractViewRight { if (result.data) { MimeToMessage(result.data, oMessage); oMessage.html() ? oMessage.viewHtml() : oMessage.viewPlain(); - if (result.signatures && result.signatures.length) { + if (result.signatures?.length) { oMessage.pgpSigned(true); oMessage.pgpVerified({ signatures: result.signatures, @@ -610,7 +596,7 @@ export class MailMessageView extends AbstractViewRight { oMessage.pgpVerified(result); } /* - if (result && result.success) { + if (result?.success) { i18n('OPENPGP/GOOD_SIGNATURE', { USER: validKey.user + ' (' + validKey.id + ')' }); @@ -618,7 +604,7 @@ export class MailMessageView extends AbstractViewRight { } else { const keyIds = arrayLength(signingKeyIds) ? signingKeyIds : null, additional = keyIds - ? keyIds.map(item => (item && item.toHex ? item.toHex() : null)).filter(v => v).join(', ') + ? keyIds.map(item => item?.toHex?.()).filter(v => v).join(', ') : ''; i18n('OPENPGP/ERROR', { diff --git a/dev/View/User/SystemDropDown.js b/dev/View/User/SystemDropDown.js index b56eefc53..b3e5560f1 100644 --- a/dev/View/User/SystemDropDown.js +++ b/dev/View/User/SystemDropDown.js @@ -52,7 +52,7 @@ export class SystemDropDownUserView extends AbstractViewRight { } accountClick(account, event) { - let email = account && account.email; + let email = account?.email; if (email && 0 === event.button && AccountUserStore.email() != email) { AccountUserStore.loading(true); event.preventDefault(); diff --git a/dev/dragdropgecko.js b/dev/dragdropgecko.js index e48ea3f8f..65836b5e9 100644 --- a/dev/dragdropgecko.js +++ b/dev/dragdropgecko.js @@ -70,7 +70,7 @@ htmlDrag = b => doc.documentElement.classList.toggle('firefox-drag', b), setDragImage = (src, xOffset, yOffset) => { - img && img.remove(); + img?.remove(); if (src) { // create drag image from custom element or drag source img = src.cloneNode(true); @@ -85,7 +85,7 @@ if (dragSource) { clearInterval(holdInterval); // dispose of drag image element - img && img.remove(); + img?.remove(); isDragging && dispatchEvent(lastTouch, 'dragend', dragSource); img = dragSource = lastTouch = lastTarget = dataTransfer = holdInterval = null; isDragging = allowDrop = false; @@ -163,6 +163,17 @@ return false; }; +/* + doc.addEventListener('pointerdown', e => { + doc.addEventListener('pointermove', e => { + e.clientX + }); + doc.setPointerCapture(e.pointerId); + }); + doc.addEventListener('pointerup', e => { + doc.releasePointerCapture(e.pointerId); + }); +*/ doc.addEventListener('touchstart', e => { // clear all variables reset(); diff --git a/dev/shortcuts.js b/dev/shortcuts.js index 794cfd2bf..0ff31b78d 100644 --- a/dev/shortcuts.js +++ b/dev/shortcuts.js @@ -64,9 +64,8 @@ const keydown = event => { let key = (event.key || '').toLowerCase().replace(' ','space'), modifiers = ['alt','ctrl','meta','shift'].filter(v => event[v+'Key']).join('+'); - scope[key] && scope[key][modifiers] && scope[key][modifiers].forEach(cmd => exec(event, cmd)); - !event.defaultPrevented && _scope !== 'all' && _scopes.all[key] && _scopes.all[key][modifiers] - && _scopes.all[key][modifiers].forEach(cmd => exec(event, cmd)); + scope[key]?.[modifiers]?.forEach(cmd => exec(event, cmd)); + !event.defaultPrevented && _scope !== 'all' && _scopes.all[key]?.[modifiers]?.forEach(cmd => exec(event, cmd)); }; win.shortcuts = shortcuts; diff --git a/dev/sieve.js b/dev/sieve.js index fcae436f7..e28639e08 100644 --- a/dev/sieve.js +++ b/dev/sieve.js @@ -17,7 +17,6 @@ import { SieveScriptPopupView } from 'Sieve/View/Script'; window.Sieve = { capa: capa, scripts: scripts, - setError: setError, loading: loading, serverError: serverError, serverErrorDesc: serverErrorDesc, diff --git a/gulpfile.js b/gulpfile.js index c614fb21a..e6cf1c2ed 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -1,4 +1,4 @@ -/* RainLoop Webmail (c) RainLoop Team | Licensed under AGPL 3 */ +/* RainLoop Webmail (c) RainLoop Team | Licensed under MIT */ const gulp = require('gulp'); const { cleanStatic } = require('./tasks/common'); diff --git a/index.php b/index.php index efcc8acd1..bce64d161 100644 --- a/index.php +++ b/index.php @@ -6,9 +6,9 @@ if (!defined('APP_VERSION')) define('APP_INDEX_ROOT_PATH', __DIR__ . DIRECTORY_SEPARATOR); } -if (file_exists('snappymail/v/'.APP_VERSION.'/include.php')) +if (file_exists(APP_INDEX_ROOT_PATH.'snappymail/v/'.APP_VERSION.'/include.php')) { - include 'snappymail/v/'.APP_VERSION.'/include.php'; + include APP_INDEX_ROOT_PATH.'snappymail/v/'.APP_VERSION.'/include.php'; } else { diff --git a/integrations/cloudron/DESCRIPTION.md b/integrations/cloudron/DESCRIPTION.md index d34828c42..d9c178956 100644 --- a/integrations/cloudron/DESCRIPTION.md +++ b/integrations/cloudron/DESCRIPTION.md @@ -1,4 +1,4 @@ -This app packages SnappyMail 2.17.0. +This app packages SnappyMail 2.17.4. SnappyMail is a simple, modern, lightweight & fast web-based email client. diff --git a/integrations/cloudron/Dockerfile b/integrations/cloudron/Dockerfile index e9aa443ef..681893b51 100644 --- a/integrations/cloudron/Dockerfile +++ b/integrations/cloudron/Dockerfile @@ -4,7 +4,7 @@ RUN mkdir -p /app/code WORKDIR /app/code # If you change the extraction below, be sure to test on scaleway -VERSION=2.17.0 +VERSION=2.17.4 RUN wget https://github.com/the-djmaze/snappymail/releases/download/v${VERSION}/snappymail-${VERSION}.zip -O /tmp/snappymail.zip && \ unzip /tmp/snappymail.zip -d /app/code && \ rm /tmp/snappymail.zip && \ diff --git a/integrations/nextcloud/snappymail/VERSION b/integrations/nextcloud/snappymail/VERSION index 6618ab545..d14c10042 100755 --- a/integrations/nextcloud/snappymail/VERSION +++ b/integrations/nextcloud/snappymail/VERSION @@ -1 +1 @@ -2.17.0 \ No newline at end of file +2.17.4 \ No newline at end of file diff --git a/integrations/nextcloud/snappymail/appinfo/info.xml b/integrations/nextcloud/snappymail/appinfo/info.xml index bc056e059..8b3ad24f8 100644 --- a/integrations/nextcloud/snappymail/appinfo/info.xml +++ b/integrations/nextcloud/snappymail/appinfo/info.xml @@ -4,7 +4,7 @@ SnappyMail SnappyMail Webmail Simple, modern and fast web-based email client. After enabling in Nextcloud, go to Nextcloud admin panel, "Additionnal settings" and you will see a "SnappyMail webmail" section. There, click on the link to go to the SnappyMail admin panel. The default user/password is admin/12345. This version is based on SnappyMail 2.6.0 (2021-07). - 2.17.0 + 2.17.4 agpl SnappyMail Team, Nextgen-Networks, Tab Fitts, Nathan Kinkade, Pierre-Alain Bandinelli SnappyMail diff --git a/integrations/virtualmin/snappymail.pl b/integrations/virtualmin/snappymail.pl index 0c12e6c99..15d395823 100644 --- a/integrations/virtualmin/snappymail.pl +++ b/integrations/virtualmin/snappymail.pl @@ -20,7 +20,7 @@ return "SnappyMail Webmail is a browser-based multilingual IMAP client with an a # script_snappymail_versions() sub script_snappymail_versions { -return ( "2.17.0" ); +return ( "2.17.4" ); } sub script_snappymail_version_desc diff --git a/package.json b/package.json index 14c4fe864..f632d14ee 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "title": "SnappyMail", "description": "Simple, modern & fast web-based email client", "private": true, - "version": "2.17.0", + "version": "2.17.4", "homepage": "https://snappymail.eu", "author": { "name": "DJ Maze", diff --git a/snappymail/v/0.0.0/app/libraries/MailSo/Base/HtmlUtils.php b/snappymail/v/0.0.0/app/libraries/MailSo/Base/HtmlUtils.php index 742782f9d..c4e67a674 100644 --- a/snappymail/v/0.0.0/app/libraries/MailSo/Base/HtmlUtils.php +++ b/snappymail/v/0.0.0/app/libraries/MailSo/Base/HtmlUtils.php @@ -107,6 +107,8 @@ abstract class HtmlUtils $aRemove = array(); + $sIdRight = \md5(\microtime()); + $aNodes = $oBody->getElementsByTagName('*'); foreach ($aNodes as /* @var $oElement \DOMElement */ $oElement) { @@ -114,56 +116,30 @@ abstract class HtmlUtils if (\in_array($sTagNameLower, $aRemoveTags)) { - $aRemove[] = @$oElement; + $aRemove[] = $oElement; continue; } - if ($oElement->hasAttribute('data-x-src-cid')) - { + // images + if ($oElement->hasAttribute('data-x-src-broken') || $oElement->hasAttribute('data-x-src-hidden')) { + $aRemove[] = $oElement; + continue; + } + if ($oElement->hasAttribute('data-x-src-cid')) { $sCid = $oElement->getAttribute('data-x-src-cid'); $oElement->removeAttribute('data-x-src-cid'); - - if (!empty($sCid)) - { + if (!empty($sCid)) { $aFoundCids[] = $sCid; - - @$oElement->removeAttribute('src'); $oElement->setAttribute('src', 'cid:'.$sCid); } } - - if ($oElement->hasAttribute('data-x-src-location')) - { - $sSrc = $oElement->getAttribute('data-x-src-location'); - $oElement->removeAttribute('data-x-src-location'); - - if (!empty($sSrc)) - { - $aFoundContentLocationUrls[] = $sSrc; - - @$oElement->removeAttribute('src'); - $oElement->setAttribute('src', $sSrc); - } - } - - if ($oElement->hasAttribute('data-x-broken-src')) - { - $oElement->setAttribute('src', $oElement->getAttribute('data-x-broken-src')); - $oElement->removeAttribute('data-x-broken-src'); - } - - if ($oElement->hasAttribute('data-x-src')) - { + if ($oElement->hasAttribute('data-x-src')) { $oElement->setAttribute('src', $oElement->getAttribute('data-x-src')); $oElement->removeAttribute('data-x-src'); } // style attribute images $aCid = array(); - if ($oElement->hasAttribute('data-x-style-cid')) { - $aCid = \json_decode($oElement->getAttribute('data-x-style-cid'), true); - $oElement->removeAttribute('data-x-style-cid'); - } if ($oElement->hasAttribute('data-x-style-url')) { $aCid = \array_merge($aCid, \json_decode($oElement->getAttribute('data-x-style-url'), true)); $oElement->removeAttribute('data-x-style-url'); @@ -205,7 +181,7 @@ abstract class HtmlUtils $sSrc = $oElement->getAttribute('src'); if ('data:image/' === \strtolower(\substr($sSrc, 0, 11))) { - $sHash = \md5($sSrc); + $sHash = \md5($sSrc) . '@' . $sIdRight; $aFoundDataURL[$sHash] = $sSrc; $oElement->setAttribute('src', 'cid:'.$sHash); diff --git a/snappymail/v/0.0.0/app/libraries/MailSo/Base/Utils.php b/snappymail/v/0.0.0/app/libraries/MailSo/Base/Utils.php index 6239edf0f..80697c0ac 100644 --- a/snappymail/v/0.0.0/app/libraries/MailSo/Base/Utils.php +++ b/snappymail/v/0.0.0/app/libraries/MailSo/Base/Utils.php @@ -59,10 +59,7 @@ abstract class Utils return 'iso-8859-8'; } - $sEncoding = \preg_replace('/^cp-([\d])/', 'cp$1', $sEncoding); - $sEncoding = \preg_replace('/^windows?12/', 'windows-12', $sEncoding); - - return $sEncoding; + return \preg_replace('/^(cp-?|windows?)(12[\d])/', 'windows-$1', $sEncoding); } public static function NormalizeCharsetByValue(string $sCharset, string $sValue) : string @@ -159,14 +156,13 @@ abstract class Utils $sInputFromEncoding = static::$RenameEncoding[$sInputFromEncoding]; } if (!static::MbSupportedEncoding($sInputFromEncoding)) { + if (\function_exists('iconv')) { + $sResult = \iconv($sInputFromEncoding, "{$sInputToEncoding}//IGNORE", $sInputString); + return (false !== $sResult) ? $sResult : $sInputString; + } \error_log("Unsupported encoding {$sInputFromEncoding}"); $sInputFromEncoding = null; // return $sInputString; -/* - if (\function_exists('iconv')) { - return \iconv($sInputFromEncoding, $sInputToEncoding, $sInputString); - } -*/ } } @@ -179,12 +175,10 @@ abstract class Utils public static function ConvertEncoding(string $sInputString, string $sInputFromEncoding, string $sInputToEncoding) : string { - $sResult = $sInputString; - $sFromEncoding = static::NormalizeCharset($sInputFromEncoding); $sToEncoding = static::NormalizeCharset($sInputToEncoding); - if ('' === \trim($sResult) || ($sFromEncoding === $sToEncoding && Enumerations\Charset::UTF_8 !== $sFromEncoding)) + if ('' === \trim($sInputString) || ($sFromEncoding === $sToEncoding && Enumerations\Charset::UTF_8 !== $sFromEncoding)) { return $sInputString; } diff --git a/snappymail/v/0.0.0/app/libraries/MailSo/Imap/SearchCriterias.php b/snappymail/v/0.0.0/app/libraries/MailSo/Imap/SearchCriterias.php index 43d4b6839..b2ce499d5 100644 --- a/snappymail/v/0.0.0/app/libraries/MailSo/Imap/SearchCriterias.php +++ b/snappymail/v/0.0.0/app/libraries/MailSo/Imap/SearchCriterias.php @@ -116,8 +116,8 @@ abstract class SearchCriterias ✔ UNFLAGGED ✔ SEEN ✔ UNSEEN - ☐ ANSWERED - ☐ UNANSWERED + ✔ ANSWERED + ✔ UNANSWERED ☐ DELETED ☐ UNDELETED ☐ DRAFT @@ -129,7 +129,6 @@ abstract class SearchCriterias public static function fromString(\MailSo\Imap\ImapClient $oImapClient, string $sFolderName, string $sSearch, bool $bHideDeleted, bool &$bUseCache = true) : string { - $bUseCache = true; $iTimeFilter = 0; $aCriteriasResult = array(); @@ -281,7 +280,7 @@ abstract class SearchCriterias } if ($bHideDeleted && !\in_array('DELETED', $aCriteriasResult) && !\in_array('UNDELETED', $aCriteriasResult)) { - $aCriteriasResult['UNDELETED'] = true; + $aCriteriasResult[] = 'UNDELETED'; } if (\MailSo\Config::$MessageListPermanentFilter) { @@ -387,7 +386,7 @@ abstract class SearchCriterias $aCache = array(); $sSearch = \MailSo\Base\Utils::StripSpaces($sSearch); - $sSearch = \trim(\preg_replace('/('.static::RegEx.'): /i', '\\1:', $sSearch)); + $sSearch = \trim(\preg_replace('/('.static::RegEx.'):\\s+/i', '\\1:', $sSearch)); $mMatch = array(); if (\preg_match_all('/".*?(?IsInited(); $sSerializedHash = ''; $sSerializedLog = ''; @@ -756,25 +756,23 @@ class MailClient $bUseSortIfSupported = $bUseSortIfSupported && !\strlen($sSearch) && $this->oImapClient->IsSupported('SORT'); $sSearchCriterias = \MailSo\Imap\SearchCriterias::fromString($this->oImapClient, $sFolderName, $sSearch, $oParams->bHideDeleted, $bUseCacheAfterSearch); - if ($bUseCacheAfterSearch && $oCacher && $oCacher->IsInited()) - { + // Disabled for now as there are many cases that change the result + $bUseCacheAfterSearch = false; + if ($bUseCacheAfterSearch) { $sSerializedHash = 'GetUids/'. ($bUseSortIfSupported ? 'S' . $sSort : 'N').'/'. $this->GenerateImapClientHash().'/'. $sFolderName.'/'.$sSearchCriterias; $sSerializedLog = '"'.$sFolderName.'" / '.$sSearchCriterias.''; -// $sSerialized = $oCacher->Get($sSerializedHash); - if (!empty($sSerialized)) - { + $sSerialized = $oCacher->Get($sSerializedHash); + if (!empty($sSerialized)) { $aSerialized = \json_decode($sSerialized, true); if (\is_array($aSerialized) && isset($aSerialized['FolderHash'], $aSerialized['Uids']) && $sFolderHash === $aSerialized['FolderHash'] && \is_array($aSerialized['Uids']) - ) - { - if ($this->oLogger) - { + ) { + if ($this->oLogger) { $this->oLogger->Write('Get Serialized UIDS from cache ('.$sSerializedLog.') [count:'.\count($aSerialized['Uids']).']'); } @@ -784,8 +782,7 @@ class MailClient } } - if (!\is_array($aResultUids)) - { + if (!$bUidsFromCacher) { if ($bUseSortIfSupported) { // $this->oImapClient->IsSupported('ESORT') // $aResultUids = $this->oImapClient->MessageSimpleESort(array($sSort ?: 'REVERSE DATE'), $sSearchCriterias)['ALL']; @@ -796,15 +793,13 @@ class MailClient $aResultUids = $this->oImapClient->MessageSimpleSearch($sSearchCriterias, true, \MailSo\Base\Utils::IsAscii($sSearchCriterias) ? '' : 'UTF-8'); } - if (!$bUidsFromCacher && $bUseCacheAfterSearch && \is_array($aResultUids) && $oCacher && $oCacher->IsInited() && \strlen($sSerializedHash)) - { + if ($bUseCacheAfterSearch) { $oCacher->Set($sSerializedHash, \json_encode(array( 'FolderHash' => $sFolderHash, 'Uids' => $aResultUids ))); - if ($this->oLogger) - { + if ($this->oLogger) { $this->oLogger->Write('Save Serialized UIDS to cache ('.$sSerializedLog.') [count:'.\count($aResultUids).']'); } } diff --git a/snappymail/v/0.0.0/app/libraries/MailSo/Sieve/ManageSieveClient.php b/snappymail/v/0.0.0/app/libraries/MailSo/Sieve/ManageSieveClient.php index 2721fa848..f37ed69e0 100644 --- a/snappymail/v/0.0.0/app/libraries/MailSo/Sieve/ManageSieveClient.php +++ b/snappymail/v/0.0.0/app/libraries/MailSo/Sieve/ManageSieveClient.php @@ -284,7 +284,7 @@ class ManageSieveClient extends \MailSo\Net\NetClient \array_pop($aResponse); } - $sScript = \implode("\n", $aResponse); + $sScript = \implode("\r\n", $aResponse); } return $sScript; @@ -296,6 +296,7 @@ class ManageSieveClient extends \MailSo\Net\NetClient */ public function PutScript(string $sScriptName, string $sScriptSource) : self { + $sScriptSource = \preg_replace('/\r?\n/', "\r\n", $sScriptSource); $this->sendRequest('PUTSCRIPT "'.$sScriptName.'" {'.\strlen($sScriptSource).'+}'); $this->sendRequestWithCheck($sScriptSource); @@ -308,6 +309,7 @@ class ManageSieveClient extends \MailSo\Net\NetClient */ public function CheckScript(string $sScriptSource) : self { + $sScriptSource = \preg_replace('/\r?\n/', "\r\n", $sScriptSource); $this->sendRequest('CHECKSCRIPT {'.\strlen($sScriptSource).'+}'); $this->sendRequestWithCheck($sScriptSource); diff --git a/snappymail/v/0.0.0/app/libraries/RainLoop/Actions.php b/snappymail/v/0.0.0/app/libraries/RainLoop/Actions.php index cfdd63fb8..c6876b460 100644 --- a/snappymail/v/0.0.0/app/libraries/RainLoop/Actions.php +++ b/snappymail/v/0.0.0/app/libraries/RainLoop/Actions.php @@ -724,6 +724,7 @@ class Actions 'RemoveColors' => (bool) $oConfig->Get('defaults', 'remove_colors', false), 'MessagesPerPage' => (int) $oConfig->Get('webmail', 'messages_per_page', 25), 'MessageReadDelay' => (int) $oConfig->Get('webmail', 'message_read_delay', 5), + 'MsgDefaultAction' => 1, 'SoundNotification' => true, 'NotificationSound' => 'new-mail', 'DesktopNotifications' => true, @@ -851,12 +852,18 @@ class Actions } $aResult['EditorDefaultType'] = \str_replace('Forced', '', $oSettings->GetConf('EditorDefaultType', $aResult['EditorDefaultType'])); + $aResult['requestReadReceipt'] = (bool) $oSettings->GetConf('requestReadReceipt', false); + $aResult['requestDsn'] = (bool) $oSettings->GetConf('requestDsn', false); + $aResult['pgpSign'] = (bool) $oSettings->GetConf('pgpSign', false); + $aResult['pgpEncrypt'] = (bool) $oSettings->GetConf('pgpEncrypt', false); + $aResult['ViewHTML'] = (bool)$oSettings->GetConf('ViewHTML', $aResult['ViewHTML']); $aResult['ShowImages'] = (bool)$oSettings->GetConf('ShowImages', $aResult['ShowImages']); $aResult['RemoveColors'] = (bool)$oSettings->GetConf('RemoveColors', $aResult['RemoveColors']); $aResult['ContactsAutosave'] = (bool)$oSettings->GetConf('ContactsAutosave', $aResult['ContactsAutosave']); $aResult['MessagesPerPage'] = (int)$oSettings->GetConf('MessagesPerPage', $aResult['MessagesPerPage']); $aResult['MessageReadDelay'] = (int)$oSettings->GetConf('MessageReadDelay', $aResult['MessageReadDelay']); + $aResult['MsgDefaultAction'] = (int)$oSettings->GetConf('MsgDefaultAction', $aResult['MsgDefaultAction']); $aResult['SoundNotification'] = (bool)$oSettings->GetConf('SoundNotification', $aResult['SoundNotification']); $aResult['NotificationSound'] = (string)$oSettings->GetConf('NotificationSound', $aResult['NotificationSound']); $aResult['DesktopNotifications'] = (bool)$oSettings->GetConf('DesktopNotifications', $aResult['DesktopNotifications']); diff --git a/snappymail/v/0.0.0/app/libraries/RainLoop/Actions/Filters.php b/snappymail/v/0.0.0/app/libraries/RainLoop/Actions/Filters.php index 8bd635a80..b3706b690 100644 --- a/snappymail/v/0.0.0/app/libraries/RainLoop/Actions/Filters.php +++ b/snappymail/v/0.0.0/app/libraries/RainLoop/Actions/Filters.php @@ -39,25 +39,12 @@ trait Filters $sName = $this->GetActionParam('name', ''); - $aFilters = array(); - if (\RainLoop\Providers\Filters\SieveStorage::SIEVE_FILE_NAME === $sName) { - $aIncFilters = $this->GetActionParam('filters', array()); - foreach ($aIncFilters as $aFilter) { - if (\is_array($aFilter)) { - $oFilter = new \RainLoop\Providers\Filters\Classes\Filter(); - if ($oFilter->FromJSON($aFilter)) { - $aFilters[] = $oFilter; - } - } - } - } - if ($this->GetActionParam('active', false)) { // $this->FiltersProvider()->ActivateScript($oAccount, $sName); } return $this->DefaultResponse(__FUNCTION__, $this->FiltersProvider()->Save( - $oAccount, $sName, $aFilters, $this->GetActionParam('body', '') + $oAccount, $sName, $this->GetActionParam('body', '') )); } diff --git a/snappymail/v/0.0.0/app/libraries/RainLoop/Actions/Messages.php b/snappymail/v/0.0.0/app/libraries/RainLoop/Actions/Messages.php index 7aaeab620..6cb11dea7 100644 --- a/snappymail/v/0.0.0/app/libraries/RainLoop/Actions/Messages.php +++ b/snappymail/v/0.0.0/app/libraries/RainLoop/Actions/Messages.php @@ -74,7 +74,7 @@ trait Messages $oSettingsLocal = $this->SettingsProvider(true)->Load($oAccount); if ($oSettingsLocal instanceof \RainLoop\Settings) { - $oParams->bHideDeleted = empty($oSettingsLocal->GetConf('HideDeleted', 1)); + $oParams->bHideDeleted = !empty($oSettingsLocal->GetConf('HideDeleted', 1)); } $oMessageList = $this->MailClient()->MessageList($oParams); diff --git a/snappymail/v/0.0.0/app/libraries/RainLoop/Actions/Pgp.php b/snappymail/v/0.0.0/app/libraries/RainLoop/Actions/Pgp.php index b25450891..c5faeeee0 100644 --- a/snappymail/v/0.0.0/app/libraries/RainLoop/Actions/Pgp.php +++ b/snappymail/v/0.0.0/app/libraries/RainLoop/Actions/Pgp.php @@ -18,10 +18,10 @@ trait Pgp return null; } - $homedir = $this->StorageProvider()->GenerateFilePath( + $homedir = \rtrim($this->StorageProvider()->GenerateFilePath( $oAccount, \RainLoop\Providers\Storage\Enumerations\StorageType::ROOT - ) . '/.gnupg'; + ), '/') . '/.gnupg'; if (!\is_dir($homedir)) { \mkdir($homedir, 0700, true); @@ -43,6 +43,8 @@ trait Pgp $link = $tmpdir . '/' . \md5($homedir); if (\is_link($link) || \symlink($homedir, $link)) { $homedir = $link; + } else { + \error_log("symlink('{$homedir}', '{$link}') failed"); } } // Else try ~/.gnupg/ + hash(email address) diff --git a/snappymail/v/0.0.0/app/libraries/RainLoop/Actions/Response.php b/snappymail/v/0.0.0/app/libraries/RainLoop/Actions/Response.php index b3b28ff54..9900f7dab 100644 --- a/snappymail/v/0.0.0/app/libraries/RainLoop/Actions/Response.php +++ b/snappymail/v/0.0.0/app/libraries/RainLoop/Actions/Response.php @@ -179,7 +179,7 @@ trait Response } // \MailSo\Mime\EmailCollection - foreach (['ReplyTo','From','To','Cc','Bcc','Sender','DeliveredTo','ReplyTo'] as $prop) { + foreach (['ReplyTo','From','To','Cc','Bcc','Sender','DeliveredTo'] as $prop) { $mResult[$prop] = $this->responseObject($mResult[$prop], $sParent); } diff --git a/snappymail/v/0.0.0/app/libraries/RainLoop/Actions/User.php b/snappymail/v/0.0.0/app/libraries/RainLoop/Actions/User.php index 1d2765b12..2ebcfc5ee 100644 --- a/snappymail/v/0.0.0/app/libraries/RainLoop/Actions/User.php +++ b/snappymail/v/0.0.0/app/libraries/RainLoop/Actions/User.php @@ -330,6 +330,11 @@ trait User }); $this->setSettingsFromParams($oSettings, 'EditorDefaultType', 'string'); + $this->setSettingsFromParams($oSettings, 'requestReadReceipt', 'bool'); + $this->setSettingsFromParams($oSettings, 'requestDsn', 'bool'); + $this->setSettingsFromParams($oSettings, 'pgpSign', 'bool'); + $this->setSettingsFromParams($oSettings, 'pgpEncrypt', 'bool'); + $this->setSettingsFromParams($oSettings, 'ViewHTML', 'bool'); $this->setSettingsFromParams($oSettings, 'ShowImages', 'bool'); $this->setSettingsFromParams($oSettings, 'RemoveColors', 'bool'); @@ -341,6 +346,7 @@ trait User $this->setSettingsFromParams($oSettings, 'AllowDraftAutosave', 'bool'); $this->setSettingsFromParams($oSettings, 'AutoLogout', 'int'); $this->setSettingsFromParams($oSettings, 'MessageReadDelay', 'int'); + $this->setSettingsFromParams($oSettings, 'MsgDefaultAction', 'int'); $this->setSettingsFromParams($oSettings, 'Resizer4Width', 'int'); $this->setSettingsFromParams($oSettings, 'Resizer5Width', 'int'); diff --git a/snappymail/v/0.0.0/app/libraries/RainLoop/ActionsAdmin.php b/snappymail/v/0.0.0/app/libraries/RainLoop/ActionsAdmin.php index 101a9b9bb..28503d0c6 100644 --- a/snappymail/v/0.0.0/app/libraries/RainLoop/ActionsAdmin.php +++ b/snappymail/v/0.0.0/app/libraries/RainLoop/ActionsAdmin.php @@ -181,29 +181,25 @@ class ActionsAdmin extends Actions $bResult = false; $oConfig = $this->Config(); - $sLogin = \trim($this->GetActionParam('Login', '')); $sPassword = $this->GetActionParam('Password', ''); $this->Logger()->AddSecret($sPassword); $sNewPassword = $this->GetActionParam('NewPassword', ''); - if (\strlen(\trim($sNewPassword))) - { + if (\strlen($sNewPassword)) { $this->Logger()->AddSecret($sNewPassword); } $passfile = APP_PRIVATE_DATA.'admin_password.txt'; - $oConfig->Set('security', 'admin_totp', $this->GetActionParam('TOTP', '')); - - if ($oConfig->ValidatePassword($sPassword)) - { - if (\strlen($sLogin)) - { + if ($oConfig->ValidatePassword($sPassword)) { + $sLogin = \trim($this->GetActionParam('Login', '')); + if (\strlen($sLogin)) { $oConfig->Set('security', 'admin_login', $sLogin); } - if (\strlen(\trim($sNewPassword))) - { + $oConfig->Set('security', 'admin_totp', $this->GetActionParam('TOTP', '')); + + if (\strlen($sNewPassword)) { $oConfig->SetPassword($sNewPassword); if (\is_file($passfile) && \trim(\file_get_contents($passfile)) !== $sNewPassword) { \unlink($passfile); @@ -300,6 +296,14 @@ class ActionsAdmin extends Actions $oSettings->type = $oDomain->IncSecure(); $oImapClient->Connect($oSettings); + $sUsername = $this->GetActionParam('username', ''); + if ($sUsername) { + $oImapClient->Login([ + 'Login' => $sUsername, + 'Password' => $this->GetActionParam('password', '') + ]); + } + $oImapClient->Disconnect(); $bImapResult = true; } @@ -660,6 +664,19 @@ class ActionsAdmin extends Actions return $this->DefaultResponse(__FUNCTION__, true); } + public function DoAdminQRCode() : array + { + $user = (string) $this->GetActionParam('username', ''); + $secret = (string) $this->GetActionParam('TOTP', ''); + $issuer = \rawurlencode(\RainLoop\API::Config()->Get('webmail', 'title', 'SnappyMail')); + $QR = \SnappyMail\QRCode::getMinimumQRCode( + "otpauth://totp/{$issuer}:{$user}?secret={$secret}&issuer={$issuer}", +// "otpauth://totp/{$user}?secret={$secret}", + \SnappyMail\QRCode::ERROR_CORRECT_LEVEL_M + ); + return $this->DefaultResponse(__FUNCTION__, $QR->__toString()); + } + private function setAdminAuthToken(string $sToken) : void { Utils::SetCookie(static::$AUTH_ADMIN_TOKEN_KEY, $sToken, 0); diff --git a/snappymail/v/0.0.0/app/libraries/RainLoop/Plugins/AbstractPlugin.php b/snappymail/v/0.0.0/app/libraries/RainLoop/Plugins/AbstractPlugin.php index eb89a19dd..43fcf742f 100644 --- a/snappymail/v/0.0.0/app/libraries/RainLoop/Plugins/AbstractPlugin.php +++ b/snappymail/v/0.0.0/app/libraries/RainLoop/Plugins/AbstractPlugin.php @@ -12,7 +12,7 @@ abstract class AbstractPlugin RELEASE = '2020-11-01', REQUIRED = '2.0.0', CATEGORY = 'General', - LICENSE = 'MIT', + LICENSE = 'AGPL v3', DESCRIPTION = ''; /** diff --git a/snappymail/v/0.0.0/app/libraries/RainLoop/Providers/Domain/DefaultDomain.php b/snappymail/v/0.0.0/app/libraries/RainLoop/Providers/Domain/DefaultDomain.php index 0e0ac02d2..c4881658c 100644 --- a/snappymail/v/0.0.0/app/libraries/RainLoop/Providers/Domain/DefaultDomain.php +++ b/snappymail/v/0.0.0/app/libraries/RainLoop/Providers/Domain/DefaultDomain.php @@ -20,7 +20,7 @@ class DefaultDomain implements DomainInterface $this->oCacher = $oCacher; } - public function codeFileName(string $sName, bool $bBack = false) : string + private static function codeFileName(string $sName, bool $bBack = false) : string { if ($bBack && 'default' === $sName) { return '*'; @@ -35,7 +35,7 @@ class DefaultDomain implements DomainInterface : \str_replace('*', '_wildcard_', \MailSo\Base\Utils::IdnToAscii($sName, true)); } - private function wildcardDomainsCacheKey() : string + private static function wildcardDomainsCacheKey() : string { return '/WildCard/DomainCache/'.\md5(APP_VERSION.APP_PRIVATE_DATA_NAME).'/'; } @@ -44,7 +44,7 @@ class DefaultDomain implements DomainInterface { if ($this->oCacher) { - $sResult = $this->oCacher->Get($this->wildcardDomainsCacheKey()); + $sResult = $this->oCacher->Get(static::wildcardDomainsCacheKey()); if (\strlen($sResult)) { return $sResult; @@ -60,7 +60,7 @@ class DefaultDomain implements DomainInterface $sName = \substr(\basename($sFile), 0, -4); if ('default' === $sName || false !== \strpos($sName, '_wildcard_')) { - $aNames[] = $this->codeFileName($sName, true); + $aNames[] = static::codeFileName($sName, true); } } @@ -72,7 +72,7 @@ class DefaultDomain implements DomainInterface if ($this->oCacher) { - $this->oCacher->Set($this->wildcardDomainsCacheKey(), $sResult); + $this->oCacher->Set(static::wildcardDomainsCacheKey(), $sResult); } return $sResult; @@ -85,7 +85,7 @@ class DefaultDomain implements DomainInterface $aDisabled = []; $sFoundValue = ''; - $sRealFileName = $this->codeFileName($sName); + $sRealFileName = static::codeFileName($sName); if (\file_exists($this->sDomainPath.'/disabled')) { $aDisabled = \explode(',', \file_get_contents($this->sDomainPath.'/disabled')); @@ -140,11 +140,11 @@ class DefaultDomain implements DomainInterface public function Save(\RainLoop\Model\Domain $oDomain) : bool { - $sRealFileName = $this->codeFileName($oDomain->Name()); + $sRealFileName = static::codeFileName($oDomain->Name()); if ($this->oCacher) { - $this->oCacher->Delete($this->wildcardDomainsCacheKey()); + $this->oCacher->Delete(static::wildcardDomainsCacheKey()); } \RainLoop\Utils::saveFile($this->sDomainPath.'/'.$sRealFileName.'.ini', $oDomain->ToIniString()); @@ -154,11 +154,11 @@ class DefaultDomain implements DomainInterface public function SaveAlias(string $sName, string $sAlias) : bool { - $sRealFileName = $this->codeFileName($sName); + $sRealFileName = static::codeFileName($sName); if ($this->oCacher) { - $this->oCacher->Delete($this->wildcardDomainsCacheKey()); + $this->oCacher->Delete(static::wildcardDomainsCacheKey()); } \RainLoop\Utils::saveFile($this->sDomainPath.'/'.$sRealFileName.'.alias', $sAlias); @@ -200,7 +200,7 @@ class DefaultDomain implements DomainInterface public function Delete(string $sName) : bool { $bResult = true; - $sRealFileName = $this->codeFileName($sName); + $sRealFileName = static::codeFileName($sName); if (\strlen($sName)) { @@ -221,7 +221,7 @@ class DefaultDomain implements DomainInterface if ($this->oCacher) { - $this->oCacher->Delete($this->wildcardDomainsCacheKey()); + $this->oCacher->Delete(static::wildcardDomainsCacheKey()); } return $bResult; @@ -229,71 +229,55 @@ class DefaultDomain implements DomainInterface public function GetList(bool $bIncludeAliases = true) : array { + $aDisabledNames = array(); + if (\file_exists($this->sDomainPath.'/disabled')) { + $sDisabled = \file_get_contents($this->sDomainPath.'/disabled'); + if (\strlen($sDisabled)) { + $aDisabledNames = \explode(',', $sDisabled); + foreach ($aDisabledNames as &$sValue) { + $sValue = \MailSo\Base\Utils::IdnToUtf8($sValue, true); + } + $aDisabledNames = \array_unique($aDisabledNames); + } + } + $aResult = array(); $aWildCards = array(); $aAliases = array(); // $aList = \glob($this->sDomainPath.'/*.{ini,alias}', GLOB_BRACE); $aList = \array_diff(\scandir($this->sDomainPath), array('.', '..')); - foreach ($aList as $sFile) - { - $sName = $sFile; - if ('.ini' === \substr($sName, -4) || '.alias' === \substr($sName, -6)) - { - $bAlias = '.alias' === \substr($sName, -6); - - $sName = \preg_replace('/\.(ini|alias)$/', '', $sName); - $sName = $this->codeFileName($sName, true); - - if ($bAlias) - { - if ($bIncludeAliases) - { - $aAliases[] = $sName; + foreach ($aList as $sFile) { + $bAlias = '.alias' === \substr($sFile, -6); + if ($bAlias || '.ini' === \substr($sFile, -4)) { + $sName = static::codeFileName(\preg_replace('/\.(ini|alias)$/', '', $sFile), true); + if ($bAlias) { + if ($bIncludeAliases) { + $aAliases[$sName] = array( + 'name' => $sName, + 'disabled' => \in_array($sName, $aDisabledNames), + 'alias' => true + ); } - } - else if (false !== \strpos($sName, '*')) - { - $aWildCards[] = $sName; - } - else - { - $aResult[] = $sName; + } else if (false !== \strpos($sName, '*')) { + $aWildCards[$sName] = array( + 'name' => $sName, + 'disabled' => \in_array($sName, $aDisabledNames), + 'alias' => false + ); + } else { + $aResult[$sName] = array( + 'name' => $sName, + 'disabled' => \in_array($sName, $aDisabledNames), + 'alias' => false + ); } } } - \sort($aResult, SORT_STRING); - \sort($aAliases, SORT_STRING); - \rsort($aWildCards, SORT_STRING); - - $aResult = \array_merge($aResult, $aAliases, $aWildCards); - - $aDisabledNames = array(); - if (\count($aResult) && \file_exists($this->sDomainPath.'/disabled')) - { - $sDisabled = \file_get_contents($this->sDomainPath.'/disabled'); - if (false !== $sDisabled && \strlen($sDisabled)) - { - $aDisabledNames = \explode(',', $sDisabled); - $aDisabledNames = \array_unique($aDisabledNames); - foreach ($aDisabledNames as $iIndex => $sValue) - { - $aDisabledNames[$iIndex] = \MailSo\Base\Utils::IdnToUtf8($sValue, true); - } - } - } - - $aReturn = array(); - foreach ($aResult as $sName) - { - $aReturn[] = array( - 'name' => $sName, - 'disabled' => \in_array($sName, $aDisabledNames), - 'alias' => \in_array($sName, $aAliases) - ); - } - - return $aReturn; + \ksort($aResult, SORT_STRING); + \ksort($aAliases, SORT_STRING); + \krsort($aWildCards, SORT_STRING); + return \array_values(\array_merge($aResult, $aAliases, $aWildCards)); } } diff --git a/snappymail/v/0.0.0/app/libraries/RainLoop/Providers/Filters.php b/snappymail/v/0.0.0/app/libraries/RainLoop/Providers/Filters.php index ff1571036..0e80d12cd 100644 --- a/snappymail/v/0.0.0/app/libraries/RainLoop/Providers/Filters.php +++ b/snappymail/v/0.0.0/app/libraries/RainLoop/Providers/Filters.php @@ -41,12 +41,12 @@ class Filters extends \RainLoop\Providers\AbstractProvider } } - public function Save(\RainLoop\Model\Account $oAccount, string $sScriptName, array $aFilters, string $sRaw = '') : bool + public function Save(\RainLoop\Model\Account $oAccount, string $sScriptName, string $sRaw) : bool { try { return $this->IsActive() - ? $this->oDriver->Save($oAccount, $sScriptName, $aFilters, $sRaw) + ? $this->oDriver->Save($oAccount, $sScriptName, $sRaw) : false; } catch (\Throwable $oException) diff --git a/snappymail/v/0.0.0/app/libraries/RainLoop/Providers/Filters/Classes/Filter.php b/snappymail/v/0.0.0/app/libraries/RainLoop/Providers/Filters/Classes/Filter.php deleted file mode 100644 index 905b80caf..000000000 --- a/snappymail/v/0.0.0/app/libraries/RainLoop/Providers/Filters/Classes/Filter.php +++ /dev/null @@ -1,227 +0,0 @@ -Clear(); - } - - public function Clear() - { - $this->sID = ''; - $this->sName = ''; - - $this->bEnabled = true; - - $this->aConditions = array(); - - $this->sConditionsType = \RainLoop\Providers\Filters\Enumerations\ConditionsType::ANY; - - $this->sActionType = \RainLoop\Providers\Filters\Enumerations\ActionType::MOVE_TO; - $this->sActionValue = ''; - $this->sActionValueSecond = ''; - $this->sActionValueThird = ''; - $this->sActionValueFourth = ''; - - $this->bMarkAsRead = false; - $this->bKeep = true; - $this->bStop = true; - } - - public function ID() : string - { - return $this->sID; - } - - public function Enabled() : bool - { - return $this->bEnabled; - } - - public function Name() : string - { - return $this->sName; - } - - public function Conditions() : array - { - return $this->aConditions; - } - - public function ConditionsType() : string - { - return $this->sConditionsType; - } - - public function ActionType() : string - { - return $this->sActionType; - } - - public function ActionValue() : string - { - return $this->sActionValue; - } - - public function ActionValueSecond() : string - { - return $this->sActionValueSecond; - } - - public function ActionValueThird() : string - { - return $this->sActionValueThird; - } - - public function ActionValueFourth() : string - { - return $this->sActionValueFourth; - } - - public function MarkAsRead() : bool - { - return $this->bMarkAsRead; - } - - public function Stop() : bool - { - return $this->bStop; - } - - public function Keep() : bool - { - return $this->bKeep; - } - - public function unserializeFromJson(string $sFilterJson) - { - $aFilterJson = \json_decode(\trim($sFilterJson), true); - if (\is_array($aFilterJson)) - { - return $this->FromJSON($aFilterJson); - } - - return false; - } - - public function FromJSON(array $aFilter) : bool - { - $this->sID = $aFilter['ID'] ?? ''; - $this->sName = $aFilter['Name'] ?? ''; - - $this->bEnabled = !isset($aFilter['Enabled']) || !empty($aFilter['Enabled']); - - $this->sConditionsType = $aFilter['ConditionsType'] - ?? \RainLoop\Providers\Filters\Enumerations\ConditionsType::ANY; - - $this->sActionType = $aFilter['ActionType'] - ?? \RainLoop\Providers\Filters\Enumerations\ActionType::MOVE_TO; - - $this->sActionValue = $aFilter['ActionValue'] ?? ''; - $this->sActionValueSecond = $aFilter['ActionValueSecond'] ?? ''; - $this->sActionValueThird = $aFilter['ActionValueThird'] ?? ''; - $this->sActionValueFourth = $aFilter['ActionValueFourth'] ?? ''; - - $this->bKeep = !isset($aFilter['Keep']) || !empty($aFilter['Keep']); - $this->bStop = !isset($aFilter['Stop']) || !empty($aFilter['Stop']); - $this->bMarkAsRead = !isset($aFilter['MarkAsRead']) || !empty($aFilter['MarkAsRead']); - - $this->aConditions = empty($aFilter['Conditions']) ? array() : FilterCondition::CollectionFromJSON($aFilter['Conditions']); - - return !empty($this->aConditions); - } - - #[\ReturnTypeWillChange] - public function jsonSerialize() - { - return array( - '@Object' => 'Object/Filter', - 'ID' => $this->ID(), - 'Enabled' => $this->Enabled(), - 'Name' => $this->Name(), - 'Conditions' => $this->Conditions(), - 'ConditionsType' => $this->ConditionsType(), - 'ActionType' => $this->ActionType(), - 'ActionValue' => $this->ActionValue(), - 'ActionValueSecond' => $this->ActionValueSecond(), - 'ActionValueThird' => $this->ActionValueThird(), - 'ActionValueFourth' => $this->ActionValueFourth(), - 'Keep' => $this->Keep(), - 'Stop' => $this->Stop(), - 'MarkAsRead' => $this->MarkAsRead() - ); - } -} diff --git a/snappymail/v/0.0.0/app/libraries/RainLoop/Providers/Filters/Classes/FilterCondition.php b/snappymail/v/0.0.0/app/libraries/RainLoop/Providers/Filters/Classes/FilterCondition.php deleted file mode 100644 index c5453d51a..000000000 --- a/snappymail/v/0.0.0/app/libraries/RainLoop/Providers/Filters/Classes/FilterCondition.php +++ /dev/null @@ -1,88 +0,0 @@ -sField; - } - - public function Type() : string - { - return $this->sType; - } - - public function Value() : string - { - return $this->sValue; - } - - public function ValueSecond() : string - { - return $this->sValueSecond; - } - - public function FromJSON(array $aData) : bool - { - if (empty($aData['Field']) || empty($aData['Type']) || empty($aData['Value'])) { - return false; - } - $this->sField = $aData['Field']; - $this->sType = $aData['Type']; - $this->sValue = (string) $aData['Value']; - $this->sValueSecond = isset($aData['ValueSecond']) ? (string) $aData['ValueSecond'] : ''; - - return true; - } - - public static function CollectionFromJSON(array $aCollection) : array - { - $aResult = array(); - foreach ($aCollection as $aItem) - { - if (\is_array($aItem) && \count($aItem)) - { - $oItem = new \RainLoop\Providers\Filters\Classes\FilterCondition(); - if ($oItem->FromJSON($aItem)) - { - $aResult[] = $oItem; - } - } - } - return $aResult; - } - - #[\ReturnTypeWillChange] - public function jsonSerialize() - { - return array( - '@Object' => 'Object/FilterCondition', - 'Field' => $this->Field(), - 'Type' => $this->Type(), - 'Value' => $this->Value(), - 'ValueSecond' => $this->ValueSecond() - ); - } -} diff --git a/snappymail/v/0.0.0/app/libraries/RainLoop/Providers/Filters/Enumerations/ActionType.php b/snappymail/v/0.0.0/app/libraries/RainLoop/Providers/Filters/Enumerations/ActionType.php deleted file mode 100644 index c5b87d9b3..000000000 --- a/snappymail/v/0.0.0/app/libraries/RainLoop/Providers/Filters/Enumerations/ActionType.php +++ /dev/null @@ -1,13 +0,0 @@ -ID(), - 'BEGIN:HEADER', - \chunk_split(\base64_encode(\json_encode($oItem)), 74, $sNL).'END:HEADER', - '*/', - $oItem->Enabled() ? '' : '/* @Filter is disabled ', - static::filterToSieveScript($oItem, $aCapa), - $oItem->Enabled() ? '' : '*/', - '/* END:FILTER */', - '' - ]); - } - - $aCapa = \array_keys($aCapa); - $sCapa = \count($aCapa) - ? $sNL . 'require ' . \str_replace('","', '", "', \json_encode($aCapa)).';' . $sNL - : ''; - - return $sCapa . $sNL . \implode($sNL, $aParts); - } - - public static function fileStringToCollection(string $sFileString) : array - { - $aResult = array(); - if (!empty($sFileString) && false !== \strpos($sFileString, 'RAINLOOP:SIEVE')) - { - $aMatch = array(); - if (\preg_match_all('/BEGIN:FILTER(.+?)BEGIN:HEADER(.+?)END:HEADER/s', $sFileString, $aMatch) && - isset($aMatch[2]) && \is_array($aMatch[2])) - { - foreach ($aMatch[2] as $sEncodedLine) - { - if (!empty($sEncodedLine)) - { - $sDecodedLine = \base64_decode(\preg_replace('/\\s+/s', '', $sEncodedLine)); - if (!empty($sDecodedLine)) - { - $oItem = new Classes\Filter(); - if ($oItem && $oItem->unserializeFromJson($sDecodedLine)) - { - $aResult[] = $oItem; - } - } - } - } - } - } - - return $aResult; - } - - private static function conditionToSieveScript(Classes\FilterCondition $oCondition, array &$aCapa) : string - { - $sResult = ''; - $sTypeWord = ''; - $bTrue = true; - - $sValue = \trim($oCondition->Value()); - $sValueSecond = \trim($oCondition->ValueSecond()); - - if (\strlen($sValue) || - (\strlen($sValue) && \strlen($sValueSecond) && - Enumerations\ConditionField::HEADER === $oCondition->Field())) - { - switch ($oCondition->Type()) - { - case Enumerations\ConditionType::TEXT: - case Enumerations\ConditionType::RAW: - case Enumerations\ConditionType::OVER: - case Enumerations\ConditionType::UNDER: - $sTypeWord = ':' . \strtolower($oCondition->Type()); - break; - case Enumerations\ConditionType::NOT_EQUAL_TO: - $sResult .= 'not '; - case Enumerations\ConditionType::EQUAL_TO: - $sTypeWord = ':is'; - break; - case Enumerations\ConditionType::NOT_CONTAINS: - $sResult .= 'not '; - case Enumerations\ConditionType::CONTAINS: - $sTypeWord = ':contains'; - break; - case Enumerations\ConditionType::REGEX: - $sTypeWord = ':regex'; - $aCapa['regex'] = true; - break; - default: - $bTrue = false; - $sResult = '/* @Error: unknown type value */ false'; - break; - } - - switch ($oCondition->Field()) - { - case Enumerations\ConditionField::FROM: - $sResult .= 'header '.$sTypeWord.' ["From"]'; - break; - case Enumerations\ConditionField::RECIPIENT: - $sResult .= 'header '.$sTypeWord.' ["To", "CC"]'; - break; - case Enumerations\ConditionField::SUBJECT: - $sResult .= 'header '.$sTypeWord.' ["Subject"]'; - break; - case Enumerations\ConditionField::HEADER: - $sResult .= 'header '.$sTypeWord.' ["'.static::quote($sValueSecond).'"]'; - break; - case Enumerations\ConditionField::BODY: - // :text :raw :content - $sResult .= 'body '.$sTypeWord.' :contains'; - $aCapa['body'] = true; - break; - case Enumerations\ConditionField::SIZE: - $sResult .= 'size '.$sTypeWord; - break; - default: - $bTrue = false; - $sResult = '/* @Error: unknown field value */ false'; - break; - } - - if ($bTrue) - { - if (\in_array($oCondition->Field(), array( - Enumerations\ConditionField::FROM, - Enumerations\ConditionField::RECIPIENT - )) && false !== \strpos($sValue, ',')) - { - $aValue = \array_map(function ($sValue) use ($self) { - return '"'.static::quote(\trim($sValue)).'"'; - }, \explode(',', $sValue)); - - $sResult .= ' ['.\trim(\implode(', ', $aValue)).']'; - } - else if (Enumerations\ConditionField::SIZE === $oCondition->Field()) - { - $sResult .= ' '.static::quote($sValue); - } - else - { - $sResult .= ' "'.static::quote($sValue).'"'; - } - - $sResult = \MailSo\Base\Utils::StripSpaces($sResult); - } - } - else - { - $sResult = '/* @Error: empty condition value */ false'; - } - - return $sResult; - } - - private static function filterToSieveScript(Classes\Filter $oFilter, array &$aCapa) : string - { - $sNL = static::NEW_LINE; - $sTab = ' '; - - $bBlock = true; - $aResult = array(); - - // Conditions - $aConditions = $oFilter->Conditions(); - if (1 < \count($aConditions)) - { - if (Enumerations\ConditionsType::ANY === - $oFilter->ConditionsType()) - { - $aResult[] = 'if anyof('; - - $bTrim = false; - foreach ($aConditions as $oCond) - { - $bTrim = true; - $sCons = static::conditionToSieveScript($oCond, $aCapa); - if (!empty($sCons)) - { - $aResult[] = $sTab.$sCons.','; - } - } - if ($bTrim) - { - $aResult[\count($aResult) - 1] = \rtrim($aResult[\count($aResult) - 1], ','); - } - - $aResult[] = ')'; - } - else - { - $aResult[] = 'if allof('; - foreach ($aConditions as $oCond) - { - $aResult[] = $sTab . static::conditionToSieveScript($oCond, $aCapa) . ','; - } - - $aResult[\count($aResult) - 1] = \rtrim($aResult[\count($aResult) - 1], ','); - $aResult[] = ')'; - } - } - else if (1 === \count($aConditions)) - { - $aResult[] = 'if ' . static::conditionToSieveScript($aConditions[0], $aCapa); - } - else - { - $bBlock = false; - } - - // actions - if ($bBlock) - { - $aResult[] = '{'; - } - else - { - $sTab = ''; - } - - if ($oFilter->MarkAsRead() && \in_array($oFilter->ActionType(), array( - Enumerations\ActionType::NONE, - Enumerations\ActionType::MOVE_TO, - Enumerations\ActionType::FORWARD - ))) - { - $aCapa['imap4flags'] = true; - $aResult[] = $sTab.'addflag "\\\\Seen";'; - } - - switch ($oFilter->ActionType()) - { - case Enumerations\ActionType::NONE: - if ($oFilter->Stop()) - { - $aResult[] = $sTab.'stop;'; - } - break; - case Enumerations\ActionType::DISCARD: - $aResult[] = $sTab.'discard;'; - if ($oFilter->Stop()) - { - $aResult[] = $sTab.'stop;'; - } - break; - case Enumerations\ActionType::VACATION: - $sValue = \trim($oFilter->ActionValue()); - $sValueSecond = \trim($oFilter->ActionValueSecond()); - $sValueThird = \trim($oFilter->ActionValueThird()); - $sValueFourth = \trim($oFilter->ActionValueFourth()); - if (\strlen($sValue)) - { - $aCapa['vacation'] = true; - - $iDays = 1; - $sSubject = ''; - if (\strlen($sValueSecond)) - { - $sSubject = ':subject "'. - static::quote(\MailSo\Base\Utils::StripSpaces($sValueSecond)).'" '; - } - - if (\strlen($sValueThird) && \is_numeric($sValueThird) && 1 < (int) $sValueThird) - { - $iDays = (int) $sValueThird; - } - - $sAddresses = ''; - if (\strlen($sValueFourth)) - { - $aAddresses = \explode(',', $sValueFourth); - $aAddresses = \array_filter(\array_map(function ($sEmail) use ($self) { - $sEmail = \trim($sEmail); - return \strlen($sEmail) ? '"'.static::quote($sEmail).'"' : ''; - }, $aAddresses), 'strlen'); - - if (\count($aAddresses)) - { - $sAddresses = ':addresses ['.\implode(', ', $aAddresses).'] '; - } - } - - $aResult[] = $sTab.'vacation :days '.$iDays.' '.$sAddresses.$sSubject.'"'.static::quote($sValue).'";'; - if ($oFilter->Stop()) - { - $aResult[] = $sTab.'stop;'; - } - } - else - { - $aResult[] = $sTab.'# @Error (vacation): empty action value'; - } - break; - case Enumerations\ActionType::REJECT: - $sValue = \trim($oFilter->ActionValue()); - if (\strlen($sValue)) - { - $aCapa['reject'] = true; - - $aResult[] = $sTab.'reject "'.static::quote($sValue).'";'; - if ($oFilter->Stop()) - { - $aResult[] = $sTab.'stop;'; - } - } - else - { - $aResult[] = $sTab.'# @Error (reject): empty action value'; - } - break; - case Enumerations\ActionType::FORWARD: - $sValue = $oFilter->ActionValue(); - if (\strlen($sValue)) - { - if ($oFilter->Keep()) - { - $aCapa['fileinto'] = true; - $aResult[] = $sTab.'fileinto "INBOX";'; - } - - $aResult[] = $sTab.'redirect "'.static::quote($sValue).'";'; - if ($oFilter->Stop()) - { - $aResult[] = $sTab.'stop;'; - } - } - else - { - $aResult[] = $sTab.'# @Error (redirect): empty action value'; - } - break; - case Enumerations\ActionType::MOVE_TO: - $sFolderName = $oFilter->ActionValue(); - if (\strlen($sFolderName)) - { - $aCapa['fileinto'] = true; - $aResult[] = $sTab.'fileinto "'.static::quote($sFolderName).'";'; - if ($oFilter->Stop()) - { - $aResult[] = $sTab.'stop;'; - } - } - else - { - $aResult[] = $sTab.'# @Error (fileinto): empty action value'; - } - break; - } - - if ($bBlock) - { - $aResult[] = '}'; - } - - return \implode($sNL, $aResult); - } - - private static function quote(string $sValue) : string - { - return \str_replace(array('\\', '"'), array('\\\\', '\\"'), \trim($sValue)); - } -} diff --git a/snappymail/v/0.0.0/app/libraries/RainLoop/Providers/Filters/SieveStorage.php b/snappymail/v/0.0.0/app/libraries/RainLoop/Providers/Filters/SieveStorage.php index 915e89b9b..4b4bc5f2f 100644 --- a/snappymail/v/0.0.0/app/libraries/RainLoop/Providers/Filters/SieveStorage.php +++ b/snappymail/v/0.0.0/app/libraries/RainLoop/Providers/Filters/SieveStorage.php @@ -81,22 +81,11 @@ class SieveStorage implements FiltersInterface ); } - public function Save(\RainLoop\Model\Account $oAccount, string $sScriptName, array $aFilters, string $sRaw = '') : bool + public function Save(\RainLoop\Model\Account $oAccount, string $sScriptName, string $sRaw) : bool { - if ($aFilters && !$sRaw) { - $sRaw = Sieve::collectionToFileString($aFilters); - } $oSieveClient = $this->getConnection($oAccount); if ($oSieveClient) { - if (empty($sRaw)) { - $aList = $oSieveClient->ListScripts(); - if (isset($aList[$sScriptName])) { - $oSieveClient->DeleteScript($sScriptName); - } - } else { - $oSieveClient->PutScript($sScriptName, $sRaw); - } - $oSieveClient->Disconnect(); + $oSieveClient->PutScript($sScriptName, $sRaw); return true; } return false; @@ -129,7 +118,9 @@ class SieveStorage implements FiltersInterface { $oSieveClient = $this->getConnection($oAccount); if ($oSieveClient) { - $oSieveClient->DeleteScript(\trim($sScriptName)); + if (isset($oSieveClient->ListScripts()[$sScriptName])) { + $oSieveClient->DeleteScript(\trim($sScriptName)); + } return true; } return false; diff --git a/snappymail/v/0.0.0/app/localization/ar-SA/user.json b/snappymail/v/0.0.0/app/localization/ar-SA/user.json index 255db33b8..6d83c7d42 100644 --- a/snappymail/v/0.0.0/app/localization/ar-SA/user.json +++ b/snappymail/v/0.0.0/app/localization/ar-SA/user.json @@ -20,6 +20,7 @@ "NAME": "البريد الوارد", "NONE": "None", "NOT_SPAM": "ليست رسائل غير مرغوب فيها", + "USERNAME": "اسم المستخدم", "PASSWORD": "كلمة السر", "REPLY_TO": "الرد-الى", "SAVE": "حفظ", @@ -28,7 +29,9 @@ "SUBJECT": "الموضوع", "TEST": "تجريب", "TO": "الى", - "SERVER_MESSAGE": "Server message" + "SERVER_MESSAGE": "Server message", + "YES": "نعم", + "NO": "لا" }, "LOGIN": { "LABEL_LOGIN": "تسيجيل الدخول", @@ -46,23 +49,24 @@ }, "SEARCH": { "TITLE_ADV": "البحث المطور", - "LABEL_ADV_TEXT": "النص", - "LABEL_ADV_HAS_ATTACHMENT": "يحتوي على مرفق", - "LABEL_ADV_HAS_ATTACHMENTS": "يحتوي مرفقات", - "LABEL_ADV_FLAGGED": "عليه علم", - "LABEL_ADV_UNSEEN": "لم يقرأ", - "LABEL_ADV_DATE": "التاريخ", - "LABEL_ADV_DATE_ALL": "الكل", - "LABEL_ADV_DATE_3_DAYS": "منذ 3 أيام", - "LABEL_ADV_DATE_7_DAYS": "منذ أسبوع", - "LABEL_ADV_DATE_MONTH": "منذ شهر", - "LABEL_ADV_DATE_3_MONTHS": "منذ 3 أشهر", - "LABEL_ADV_DATE_6_MONTHS": "منذ 6 أشهر", - "LABEL_ADV_DATE_YEAR": "منذ سنة", - "LABEL_ADV_SUBFOLDERS": "Subfolders", - "LABEL_ADV_SUBFOLDERS_NONE": "None", - "LABEL_ADV_SUBFOLDERS_SUBTREE": "All", - "LABEL_ADV_SUBFOLDERS_SUBTREE_ONE": "One level" + "LABEL_TEXT": "النص", + "LABEL_HAS_ATTACHMENT": "يحتوي على مرفق", + "LABEL_HAS_ATTACHMENTS": "يحتوي مرفقات", + "LABEL_FLAGGED": "عليه علم", + "LABEL_UNSEEN": "لم يقرأ", + "LABEL_DATE": "التاريخ", + "LABEL_DATE_ALL": "الكل", + "LABEL_DATE_3_DAYS": "منذ 3 أيام", + "LABEL_DATE_7_DAYS": "منذ أسبوع", + "LABEL_DATE_MONTH": "منذ شهر", + "LABEL_DATE_3_MONTHS": "منذ 3 أشهر", + "LABEL_DATE_6_MONTHS": "منذ 6 أشهر", + "LABEL_DATE_YEAR": "منذ سنة", + "LABEL_SUBFOLDERS": "Subfolders", + "LABEL_SUBFOLDERS_NONE": "None", + "LABEL_SUBFOLDERS_SUBTREE": "All", + "LABEL_SUBFOLDERS_SUBTREE_ONE": "One level", + "LABEL_REPLIED": "أجاب" }, "PREVIEW_POPUP": { "FULLSCREEN": "إعداد افتراضي لوضع ملء الشاشة", @@ -104,7 +108,6 @@ "EMPTY_SEARCH_LIST": "ليست هناك أية رسائل تطابق بحثك.", "SEARCH_RESULT_FOR": "نتيجة البحث لـ \"%SEARCH%\"", "BACK_TO_MESSAGE_LIST": "العودة الى قائمة الرسائل", - "EMPTY_SUBJECT_TEXT": "(لايوجدموضوع)", "PUT_MESSAGE_HERE": "حرك الرسالة الى هنا.. لكي تراها في قائمة الرسائل", "TODAY_AT": "اليوم عند %TIME%", "YESTERDAY_AT": "البارحة عند %TIME%", @@ -224,8 +227,6 @@ "BUTTON_REQUEST_DSN": "اطلب اعلاماً بايصال البريد" }, "POPUPS_ASK": { - "BUTTON_YES": "نعم", - "BUTTON_NO": "لا", "DESC_WANT_CLOSE_THIS_WINDOW": "هل أنت متأكد من رغبتك باغلاق هذه النافذة؟", "DESC_WANT_DELETE_MESSAGES": "هل أنت متأكد من رغبتك بحذف هذه الرسائل؟" }, @@ -402,6 +403,7 @@ "LABEL_REMOVE_COLORS": "Remove background and text colors from message body", "LABEL_MESSAGE_PER_PAGE": "الرسائل في الصفحة", "LABEL_MARK_MESSAGE_READ_AFTER": "Mark message as read after", + "LABEL_MSG_DEFAULT_ACTION": "Default action", "SECONDS": "seconds", "LABEL_NOTIFICATIONS": "التنبيهات", "LABEL_SOUND_NOTIFICATION": "صوت التنبيهات", @@ -415,8 +417,6 @@ "LABEL_CONTACTS_SYNC_SERVER": "المخدم", "LABEL_CONTACTS_SYNC_AB_URL": "وصلة دفتر العناوين", "LABEL_CONTACTS_SYNC_USER": "المستخدم", - "SYNC_NO": "لا", - "SYNC_YES": "نعم", "SYNC_READ": "Read only" }, "SETTINGS_THEMES": { diff --git a/snappymail/v/0.0.0/app/localization/bg-BG/user.json b/snappymail/v/0.0.0/app/localization/bg-BG/user.json index ccf5d8930..e89a097a9 100644 --- a/snappymail/v/0.0.0/app/localization/bg-BG/user.json +++ b/snappymail/v/0.0.0/app/localization/bg-BG/user.json @@ -20,6 +20,7 @@ "NAME": "Вх. кутия", "NONE": "Няма", "NOT_SPAM": "Не е спам", + "USERNAME": "Потребителско име", "PASSWORD": "Парола", "REPLY_TO": "Отговори на", "SAVE": "Запази", @@ -28,7 +29,9 @@ "SUBJECT": "Заглавие", "TEST": "Тест", "TO": "До", - "SERVER_MESSAGE": "Server message" + "SERVER_MESSAGE": "Server message", + "YES": "Да", + "NO": "Не" }, "LOGIN": { "LABEL_LOGIN": "Логин", @@ -46,23 +49,24 @@ }, "SEARCH": { "TITLE_ADV": "Разширено търсене", - "LABEL_ADV_TEXT": "Текст", - "LABEL_ADV_HAS_ATTACHMENT": "Има приложен файл", - "LABEL_ADV_HAS_ATTACHMENTS": "Има приложени файлове", - "LABEL_ADV_FLAGGED": "Отбелязано с флаг", - "LABEL_ADV_UNSEEN": "Невидяно", - "LABEL_ADV_DATE": "Дата", - "LABEL_ADV_DATE_ALL": "Всички", - "LABEL_ADV_DATE_3_DAYS": "До 3 дена", - "LABEL_ADV_DATE_7_DAYS": "До 1 седмица", - "LABEL_ADV_DATE_MONTH": "До 1 месец", - "LABEL_ADV_DATE_3_MONTHS": "До 3 месеца", - "LABEL_ADV_DATE_6_MONTHS": "До 6 месеца", - "LABEL_ADV_DATE_YEAR": "До 1 година", - "LABEL_ADV_SUBFOLDERS": "Subfolders", - "LABEL_ADV_SUBFOLDERS_NONE": "None", - "LABEL_ADV_SUBFOLDERS_SUBTREE": "All", - "LABEL_ADV_SUBFOLDERS_SUBTREE_ONE": "One level" + "LABEL_TEXT": "Текст", + "LABEL_HAS_ATTACHMENT": "Има приложен файл", + "LABEL_HAS_ATTACHMENTS": "Има приложени файлове", + "LABEL_FLAGGED": "Отбелязано с флаг", + "LABEL_UNSEEN": "Невидяно", + "LABEL_DATE": "Дата", + "LABEL_DATE_ALL": "Всички", + "LABEL_DATE_3_DAYS": "До 3 дена", + "LABEL_DATE_7_DAYS": "До 1 седмица", + "LABEL_DATE_MONTH": "До 1 месец", + "LABEL_DATE_3_MONTHS": "До 3 месеца", + "LABEL_DATE_6_MONTHS": "До 6 месеца", + "LABEL_DATE_YEAR": "До 1 година", + "LABEL_SUBFOLDERS": "Subfolders", + "LABEL_SUBFOLDERS_NONE": "None", + "LABEL_SUBFOLDERS_SUBTREE": "All", + "LABEL_SUBFOLDERS_SUBTREE_ONE": "One level", + "LABEL_REPLIED": "Отговорено" }, "PREVIEW_POPUP": { "FULLSCREEN": "На цял екран", @@ -104,7 +108,6 @@ "EMPTY_SEARCH_LIST": "Няма съобщения, които да отговарят на търсенето.", "SEARCH_RESULT_FOR": "Резултати от търсенето за \"%SEARCH%\"", "BACK_TO_MESSAGE_LIST": "Обратно при съобщенията", - "EMPTY_SUBJECT_TEXT": "(Няма заглавие)", "PUT_MESSAGE_HERE": "Пуснете съобщението тук, за да го видите в списъка", "TODAY_AT": "днес в %TIME%", "YESTERDAY_AT": "вчера в %TIME%", @@ -224,8 +227,6 @@ "BUTTON_REQUEST_DSN": "Уведомяване при доставка" }, "POPUPS_ASK": { - "BUTTON_YES": "Да", - "BUTTON_NO": "Не", "DESC_WANT_CLOSE_THIS_WINDOW": "Сигурни ли сте, че желаете да затворите този прозорец?", "DESC_WANT_DELETE_MESSAGES": "Сигурни ли сте, че желаете да изтриете съобщението\/съобщенията?" }, @@ -402,6 +403,7 @@ "LABEL_REMOVE_COLORS": "Remove background and text colors from message body", "LABEL_MESSAGE_PER_PAGE": "Съобщения на страница", "LABEL_MARK_MESSAGE_READ_AFTER": "Mark message as read after", + "LABEL_MSG_DEFAULT_ACTION": "Default action", "SECONDS": "seconds", "LABEL_NOTIFICATIONS": "Известия", "LABEL_SOUND_NOTIFICATION": "Звуково известяване", @@ -415,8 +417,6 @@ "LABEL_CONTACTS_SYNC_SERVER": "Сървър", "LABEL_CONTACTS_SYNC_AB_URL": "URL на адресната книга", "LABEL_CONTACTS_SYNC_USER": "Потребител", - "SYNC_NO": "Не", - "SYNC_YES": "Да", "SYNC_READ": "Read only" }, "SETTINGS_THEMES": { diff --git a/snappymail/v/0.0.0/app/localization/cs-CZ/admin.json b/snappymail/v/0.0.0/app/localization/cs-CZ/admin.json index 34d6f3b72..29b81856a 100644 --- a/snappymail/v/0.0.0/app/localization/cs-CZ/admin.json +++ b/snappymail/v/0.0.0/app/localization/cs-CZ/admin.json @@ -4,7 +4,10 @@ "CLOSE": "Zavřít", "SAVE": "Uložit", "TEST": "Test", - "UPDATE": "Aktualizovat" + "UPDATE": "Aktualizovat", + "USERNAME": "Uživatelské jméno", + "PASSWORD": "Heslo", + "CANCEL": "Zrušit" }, "LOGIN": { "LABEL_LOGIN": "Login", @@ -84,10 +87,8 @@ "LABEL_SHOW_PHP_INFO": "Zobrazit PHP informace (php_info)", "LEGEND_ADMIN_PANEL_ACCESS_CREDENTIALS": "Přístupové údaje administrace", "LABEL_CURRENT_PASSWORD": "Současné heslo", - "LABEL_NEW_LOGIN": "Nový login", "LABEL_NEW_PASSWORD": "Nové heslo", "LABEL_REPEAT_PASSWORD": "Znovu", - "BUTTON_UPDATE_PASSWORD": "Aktualizovat heslo", "LEGEND_SSL": "SSL", "LABEL_REQUIRE_VERIFICATION": "Vyžadovat ověření SSL certifikátu (IMAP\/SMTP)", "LABEL_ALLOW_SELF_SIGNED": "Povolit self-signed certifikáty" diff --git a/snappymail/v/0.0.0/app/localization/cs-CZ/user.json b/snappymail/v/0.0.0/app/localization/cs-CZ/user.json index 57ae39b0e..6ae4b05e5 100644 --- a/snappymail/v/0.0.0/app/localization/cs-CZ/user.json +++ b/snappymail/v/0.0.0/app/localization/cs-CZ/user.json @@ -20,6 +20,7 @@ "NAME": "Přijaté", "NONE": "Žádný", "NOT_SPAM": "Není to spam", + "USERNAME": "Uživatelské jméno", "PASSWORD": "Heslo", "REPLY_TO": "Adresa odpovědi", "SAVE": "Uložit", @@ -28,7 +29,9 @@ "SUBJECT": "Předmět", "TEST": "Test", "TO": "Příjemce", - "SERVER_MESSAGE": "Server message" + "SERVER_MESSAGE": "Server message", + "YES": "Ano", + "NO": "Ne" }, "LOGIN": { "LABEL_LOGIN": "Uživatelské jméno", @@ -46,23 +49,24 @@ }, "SEARCH": { "TITLE_ADV": "Rozšířené hledání", - "LABEL_ADV_TEXT": "Text", - "LABEL_ADV_HAS_ATTACHMENT": "S přílohou", - "LABEL_ADV_HAS_ATTACHMENTS": "S přílohami", - "LABEL_ADV_FLAGGED": "Označené hvězdičkou", - "LABEL_ADV_UNSEEN": "Nepřečtené", - "LABEL_ADV_DATE": "Datum", - "LABEL_ADV_DATE_ALL": "Kdykoliv", - "LABEL_ADV_DATE_3_DAYS": "Ne starší než 3 dny", - "LABEL_ADV_DATE_7_DAYS": "Ne starší než týden", - "LABEL_ADV_DATE_MONTH": "Ne starší než měsíc", - "LABEL_ADV_DATE_3_MONTHS": "Ne starší než 3 měsíce", - "LABEL_ADV_DATE_6_MONTHS": "Ne starší než 6 měsíců", - "LABEL_ADV_DATE_YEAR": "Ne starší než 1 rok", - "LABEL_ADV_SUBFOLDERS": "Subfolders", - "LABEL_ADV_SUBFOLDERS_NONE": "None", - "LABEL_ADV_SUBFOLDERS_SUBTREE": "All", - "LABEL_ADV_SUBFOLDERS_SUBTREE_ONE": "One level" + "LABEL_TEXT": "Text", + "LABEL_HAS_ATTACHMENT": "S přílohou", + "LABEL_HAS_ATTACHMENTS": "S přílohami", + "LABEL_FLAGGED": "Označené hvězdičkou", + "LABEL_UNSEEN": "Nepřečtené", + "LABEL_DATE": "Datum", + "LABEL_DATE_ALL": "Kdykoliv", + "LABEL_DATE_3_DAYS": "Ne starší než 3 dny", + "LABEL_DATE_7_DAYS": "Ne starší než týden", + "LABEL_DATE_MONTH": "Ne starší než měsíc", + "LABEL_DATE_3_MONTHS": "Ne starší než 3 měsíce", + "LABEL_DATE_6_MONTHS": "Ne starší než 6 měsíců", + "LABEL_DATE_YEAR": "Ne starší než 1 rok", + "LABEL_SUBFOLDERS": "Subfolders", + "LABEL_SUBFOLDERS_NONE": "None", + "LABEL_SUBFOLDERS_SUBTREE": "All", + "LABEL_SUBFOLDERS_SUBTREE_ONE": "One level", + "LABEL_REPLIED": "Odpovězeno" }, "PREVIEW_POPUP": { "FULLSCREEN": "Celá obrazovka", @@ -104,7 +108,6 @@ "EMPTY_SEARCH_LIST": "Vašemu vyhledávání neodpovídají žádné zprávy.", "SEARCH_RESULT_FOR": "Výsledky vyhledávání pro \"%SEARCH%\"", "BACK_TO_MESSAGE_LIST": "Zpět na seznam zpráv", - "EMPTY_SUBJECT_TEXT": "(Bez předmětu)", "PUT_MESSAGE_HERE": "Přesuňte zprávu sem pro její zobrazení v seznamu", "TODAY_AT": "Dnes v %TIME%", "YESTERDAY_AT": "Včera v %TIME%", @@ -224,8 +227,6 @@ "BUTTON_REQUEST_DSN": "Vyžádat si potvrzení o přijetí" }, "POPUPS_ASK": { - "BUTTON_YES": "Ano", - "BUTTON_NO": "Ne", "DESC_WANT_CLOSE_THIS_WINDOW": "Opravdu chcete zavřít toto okno?", "DESC_WANT_DELETE_MESSAGES": "Opravdu chcete odstranit tyto zprávy?" }, @@ -402,6 +403,7 @@ "LABEL_REMOVE_COLORS": "Remove background and text colors from message body", "LABEL_MESSAGE_PER_PAGE": "Zpráv na stranu", "LABEL_MARK_MESSAGE_READ_AFTER": "Mark message as read after", + "LABEL_MSG_DEFAULT_ACTION": "Default action", "SECONDS": "seconds", "LABEL_NOTIFICATIONS": "Notifikace", "LABEL_SOUND_NOTIFICATION": "Zvukové notifikace", @@ -415,8 +417,6 @@ "LABEL_CONTACTS_SYNC_SERVER": "Server", "LABEL_CONTACTS_SYNC_AB_URL": "URL adresáře", "LABEL_CONTACTS_SYNC_USER": "Uživatel", - "SYNC_NO": "Ne", - "SYNC_YES": "Ano", "SYNC_READ": "Read only" }, "SETTINGS_THEMES": { diff --git a/snappymail/v/0.0.0/app/localization/da-DK/admin.json b/snappymail/v/0.0.0/app/localization/da-DK/admin.json index 41c1f2ff4..0a0e800fd 100644 --- a/snappymail/v/0.0.0/app/localization/da-DK/admin.json +++ b/snappymail/v/0.0.0/app/localization/da-DK/admin.json @@ -4,7 +4,10 @@ "CLOSE": "Luk", "SAVE": "Gem", "TEST": "Test", - "UPDATE": "Opdater" + "UPDATE": "Opdater", + "USERNAME": "Brugernavn", + "PASSWORD": "Adgangskode", + "CANCEL": "Annuller" }, "LOGIN": { "LABEL_LOGIN": "Log ind", @@ -84,10 +87,8 @@ "LABEL_SHOW_PHP_INFO": "Vis PHP informationer", "LEGEND_ADMIN_PANEL_ACCESS_CREDENTIALS": "Admin Panel Adgangsoplysninger", "LABEL_CURRENT_PASSWORD": "Nuværende adgangskode", - "LABEL_NEW_LOGIN": "Nyt log ind", "LABEL_NEW_PASSWORD": "Ny adgangskode", "LABEL_REPEAT_PASSWORD": "Gentag", - "BUTTON_UPDATE_PASSWORD": "Opdater adgangskode", "LEGEND_SSL": "SSL", "LABEL_REQUIRE_VERIFICATION": "Kræv verifikation af brugt SSL certifikat (IMAP\/SMTP)", "LABEL_ALLOW_SELF_SIGNED": "Tillad selvsignerede certifikater" diff --git a/snappymail/v/0.0.0/app/localization/da-DK/user.json b/snappymail/v/0.0.0/app/localization/da-DK/user.json index 40d8a0a87..21a61175a 100644 --- a/snappymail/v/0.0.0/app/localization/da-DK/user.json +++ b/snappymail/v/0.0.0/app/localization/da-DK/user.json @@ -20,6 +20,7 @@ "NAME": "Indbakke", "NONE": "Ingen", "NOT_SPAM": "Ikke uønsket", + "USERNAME": "Brugernavn", "PASSWORD": "Adgangskode", "REPLY_TO": "Svar til", "SAVE": "Gem", @@ -28,7 +29,9 @@ "SUBJECT": "Emne", "TEST": "Test", "TO": "Til", - "SERVER_MESSAGE": "Server message" + "SERVER_MESSAGE": "Server message", + "YES": "Ja", + "NO": "Nej" }, "LOGIN": { "LABEL_LOGIN": "Brugernavn", @@ -46,23 +49,24 @@ }, "SEARCH": { "TITLE_ADV": "Avanceret søgning", - "LABEL_ADV_TEXT": "Tekst", - "LABEL_ADV_HAS_ATTACHMENT": "Har vedhæftet fil", - "LABEL_ADV_HAS_ATTACHMENTS": "Har vedhæftede filer", - "LABEL_ADV_FLAGGED": "Markeret med flag", - "LABEL_ADV_UNSEEN": "Ulæst", - "LABEL_ADV_DATE": "Dato", - "LABEL_ADV_DATE_ALL": "Alle", - "LABEL_ADV_DATE_3_DAYS": "Nyere end 3 dage", - "LABEL_ADV_DATE_7_DAYS": "Nyere end 1 uge", - "LABEL_ADV_DATE_MONTH": "Nyere end 1 måned", - "LABEL_ADV_DATE_3_MONTHS": "Nyere end 3 måneder", - "LABEL_ADV_DATE_6_MONTHS": "Nyere end 6 måneder", - "LABEL_ADV_DATE_YEAR": "Nyere end 1 år", - "LABEL_ADV_SUBFOLDERS": "Subfolders", - "LABEL_ADV_SUBFOLDERS_NONE": "None", - "LABEL_ADV_SUBFOLDERS_SUBTREE": "All", - "LABEL_ADV_SUBFOLDERS_SUBTREE_ONE": "One level" + "LABEL_TEXT": "Tekst", + "LABEL_HAS_ATTACHMENT": "Har vedhæftet fil", + "LABEL_HAS_ATTACHMENTS": "Har vedhæftede filer", + "LABEL_FLAGGED": "Markeret med flag", + "LABEL_UNSEEN": "Ulæst", + "LABEL_DATE": "Dato", + "LABEL_DATE_ALL": "Alle", + "LABEL_DATE_3_DAYS": "Nyere end 3 dage", + "LABEL_DATE_7_DAYS": "Nyere end 1 uge", + "LABEL_DATE_MONTH": "Nyere end 1 måned", + "LABEL_DATE_3_MONTHS": "Nyere end 3 måneder", + "LABEL_DATE_6_MONTHS": "Nyere end 6 måneder", + "LABEL_DATE_YEAR": "Nyere end 1 år", + "LABEL_SUBFOLDERS": "Subfolders", + "LABEL_SUBFOLDERS_NONE": "None", + "LABEL_SUBFOLDERS_SUBTREE": "All", + "LABEL_SUBFOLDERS_SUBTREE_ONE": "One level", + "LABEL_REPLIED": "Besvarede" }, "PREVIEW_POPUP": { "FULLSCREEN": "Fuld skærm", @@ -104,7 +108,6 @@ "EMPTY_SEARCH_LIST": "Ingen meddelelser passede på søgningen.", "SEARCH_RESULT_FOR": "Resultat for søgningen på \"%SEARCH%\"", "BACK_TO_MESSAGE_LIST": "Tilbage til meddelelsesoversigt", - "EMPTY_SUBJECT_TEXT": "(Intet emne)", "PUT_MESSAGE_HERE": "Slip meddelelse her for visning i oversigten", "TODAY_AT": "i dag klokken %TIME%", "YESTERDAY_AT": "i går klokken %TIME%", @@ -224,8 +227,6 @@ "BUTTON_REQUEST_DSN": "Bed om kvittering for modtagelse" }, "POPUPS_ASK": { - "BUTTON_YES": "Ja", - "BUTTON_NO": "Nej", "DESC_WANT_CLOSE_THIS_WINDOW": "Vil du lukke vinduet?", "DESC_WANT_DELETE_MESSAGES": "Vil du slette denne\/disse meddelelse(r)?" }, @@ -402,6 +403,7 @@ "LABEL_REMOVE_COLORS": "Remove background and text colors from message body", "LABEL_MESSAGE_PER_PAGE": "Meddelelser per side", "LABEL_MARK_MESSAGE_READ_AFTER": "Mark message as read after", + "LABEL_MSG_DEFAULT_ACTION": "Default action", "SECONDS": "seconds", "LABEL_NOTIFICATIONS": "Notifikationer", "LABEL_SOUND_NOTIFICATION": "Lyd notifikationer", @@ -415,8 +417,6 @@ "LABEL_CONTACTS_SYNC_SERVER": "Server", "LABEL_CONTACTS_SYNC_AB_URL": "Adressebogs URL", "LABEL_CONTACTS_SYNC_USER": "Bruger", - "SYNC_NO": "Nej", - "SYNC_YES": "Ja", "SYNC_READ": "Read only" }, "SETTINGS_THEMES": { diff --git a/snappymail/v/0.0.0/app/localization/de-DE/admin.json b/snappymail/v/0.0.0/app/localization/de-DE/admin.json index 68d4e5e84..d4f152a62 100644 --- a/snappymail/v/0.0.0/app/localization/de-DE/admin.json +++ b/snappymail/v/0.0.0/app/localization/de-DE/admin.json @@ -4,7 +4,10 @@ "CLOSE": "Schließen", "SAVE": "Speichern", "TEST": "Testen", - "UPDATE": "Aktualisieren" + "UPDATE": "Aktualisieren", + "USERNAME": "Nutzername", + "PASSWORD": "Passwort", + "CANCEL": "Abbrechen" }, "LOGIN": { "LABEL_LOGIN": "Benutzer", @@ -84,10 +87,8 @@ "LABEL_SHOW_PHP_INFO": "PHP-Informationen anzeigen", "LEGEND_ADMIN_PANEL_ACCESS_CREDENTIALS": "Adminpanel-Zugangsdaten", "LABEL_CURRENT_PASSWORD": "Aktuelles Passwort", - "LABEL_NEW_LOGIN": "Neuer Benutzer", "LABEL_NEW_PASSWORD": "Neues Passwort", "LABEL_REPEAT_PASSWORD": "Wiederholen", - "BUTTON_UPDATE_PASSWORD": "Passwort aktualisieren", "LEGEND_SSL": "SSL", "LABEL_REQUIRE_VERIFICATION": "Verlangen, dass das verwendete SSL-Zertifikat signiert ist (IMAP\/SMTP)", "LABEL_ALLOW_SELF_SIGNED": "Selbst-signierte Zertifikate erlauben" diff --git a/snappymail/v/0.0.0/app/localization/de-DE/user.json b/snappymail/v/0.0.0/app/localization/de-DE/user.json index 8323bc1d2..4ba33d7f5 100644 --- a/snappymail/v/0.0.0/app/localization/de-DE/user.json +++ b/snappymail/v/0.0.0/app/localization/de-DE/user.json @@ -20,6 +20,7 @@ "NAME": "Name", "NONE": "Keine", "NOT_SPAM": "Kein Spam", + "USERNAME": "Nutzername", "PASSWORD": "Passwort", "REPLY_TO": "Antwort an", "SAVE": "Speichern", @@ -28,7 +29,9 @@ "SUBJECT": "Betreff", "TEST": "Testen", "TO": "An", - "SERVER_MESSAGE": "Server message" + "SERVER_MESSAGE": "Server message", + "YES": "Ja", + "NO": "Nein" }, "LOGIN": { "LABEL_LOGIN": "Login", @@ -46,23 +49,24 @@ }, "SEARCH": { "TITLE_ADV": "Erweiterte Suche", - "LABEL_ADV_TEXT": "Text", - "LABEL_ADV_HAS_ATTACHMENT": "Anhang vorhanden", - "LABEL_ADV_HAS_ATTACHMENTS": "Anhänge vorhanden", - "LABEL_ADV_FLAGGED": "Markiert", - "LABEL_ADV_UNSEEN": "Ungelesen", - "LABEL_ADV_DATE": "Datum", - "LABEL_ADV_DATE_ALL": "Alle", - "LABEL_ADV_DATE_3_DAYS": "Nicht älter als 3 Tage", - "LABEL_ADV_DATE_7_DAYS": "Nicht älter als 1 Woche", - "LABEL_ADV_DATE_MONTH": "Nicht älter als 1 Monat", - "LABEL_ADV_DATE_3_MONTHS": "Nicht älter als 3 Monate", - "LABEL_ADV_DATE_6_MONTHS": "Nicht älter als 6 Monate", - "LABEL_ADV_DATE_YEAR": "Nicht älter als 1 Jahr", - "LABEL_ADV_SUBFOLDERS": "Unterordner", - "LABEL_ADV_SUBFOLDERS_NONE": "Keine", - "LABEL_ADV_SUBFOLDERS_SUBTREE": "Alle", - "LABEL_ADV_SUBFOLDERS_SUBTREE_ONE": "One level" + "LABEL_TEXT": "Text", + "LABEL_HAS_ATTACHMENT": "Anhang vorhanden", + "LABEL_HAS_ATTACHMENTS": "Anhänge vorhanden", + "LABEL_FLAGGED": "Markiert", + "LABEL_UNSEEN": "Ungelesen", + "LABEL_DATE": "Datum", + "LABEL_DATE_ALL": "Alle", + "LABEL_DATE_3_DAYS": "Nicht älter als 3 Tage", + "LABEL_DATE_7_DAYS": "Nicht älter als 1 Woche", + "LABEL_DATE_MONTH": "Nicht älter als 1 Monat", + "LABEL_DATE_3_MONTHS": "Nicht älter als 3 Monate", + "LABEL_DATE_6_MONTHS": "Nicht älter als 6 Monate", + "LABEL_DATE_YEAR": "Nicht älter als 1 Jahr", + "LABEL_SUBFOLDERS": "Unterordner", + "LABEL_SUBFOLDERS_NONE": "Keine", + "LABEL_SUBFOLDERS_SUBTREE": "Alle", + "LABEL_SUBFOLDERS_SUBTREE_ONE": "One level", + "LABEL_REPLIED": "Antwortete" }, "PREVIEW_POPUP": { "FULLSCREEN": "Vollbild umschalten", @@ -104,7 +108,6 @@ "EMPTY_SEARCH_LIST": "Keine Treffer für Ihre Suche.", "SEARCH_RESULT_FOR": "Suchergebnisse für \"%SEARCH%\"", "BACK_TO_MESSAGE_LIST": "Zurück zur Nachrichtenliste", - "EMPTY_SUBJECT_TEXT": "(Kein Betreff)", "PUT_MESSAGE_HERE": "Ziehen Sie die Nachricht hierhin, um sie in der Liste anzuzeigen", "TODAY_AT": "Heute um %TIME%", "YESTERDAY_AT": "Gestern um %TIME%", @@ -224,8 +227,6 @@ "BUTTON_REQUEST_DSN": "Übermittlungsstatus anfordern" }, "POPUPS_ASK": { - "BUTTON_YES": "Ja", - "BUTTON_NO": "Nein", "DESC_WANT_CLOSE_THIS_WINDOW": "Sind Sie sicher, dass Sie dieses Fenster schließen möchten?", "DESC_WANT_DELETE_MESSAGES": "Sind Sie sicher, dass Sie diese Nachricht(en) löschen möchten?" }, @@ -402,6 +403,7 @@ "LABEL_REMOVE_COLORS": "Entferne Hintergrund- und Textfarben aus der Nachricht", "LABEL_MESSAGE_PER_PAGE": "Nachrichten pro Seite", "LABEL_MARK_MESSAGE_READ_AFTER": "Nachricht als gelesen markieren nach", + "LABEL_MSG_DEFAULT_ACTION": "Default action", "SECONDS": "Sekunden", "LABEL_NOTIFICATIONS": "Benachrichtigungen", "LABEL_SOUND_NOTIFICATION": "Benachrichtigungston", @@ -415,8 +417,6 @@ "LABEL_CONTACTS_SYNC_SERVER": "Server", "LABEL_CONTACTS_SYNC_AB_URL": "Adressbuch-URL", "LABEL_CONTACTS_SYNC_USER": "Benutzer", - "SYNC_NO": "Nein", - "SYNC_YES": "Ja", "SYNC_READ": "Nur lesend" }, "SETTINGS_THEMES": { diff --git a/snappymail/v/0.0.0/app/localization/el-GR/user.json b/snappymail/v/0.0.0/app/localization/el-GR/user.json index f0fbe46d6..17d3427c0 100644 --- a/snappymail/v/0.0.0/app/localization/el-GR/user.json +++ b/snappymail/v/0.0.0/app/localization/el-GR/user.json @@ -20,6 +20,7 @@ "NAME": "Εισερχόμενα", "NONE": "Κανένα", "NOT_SPAM": "Όχι ανεπιθύμητο", + "USERNAME": "Όνομα χρήστη", "PASSWORD": "Κωδικός πρόσβασης", "REPLY_TO": "Απάντηση στον", "SAVE": "Αποθήκευση", @@ -28,7 +29,9 @@ "SUBJECT": "Θέμα", "TEST": "Τεστ", "TO": "Προς", - "SERVER_MESSAGE": "Server message" + "SERVER_MESSAGE": "Server message", + "YES": "Ναι", + "NO": "Όχι" }, "LOGIN": { "LABEL_LOGIN": "Είσοδος", @@ -46,23 +49,24 @@ }, "SEARCH": { "TITLE_ADV": "Προχωρημένη αναζήτηση", - "LABEL_ADV_TEXT": "Κείμενο", - "LABEL_ADV_HAS_ATTACHMENT": "Έχει συνημμένο", - "LABEL_ADV_HAS_ATTACHMENTS": "Έχει συνημμένα", - "LABEL_ADV_FLAGGED": "Με σημαία", - "LABEL_ADV_UNSEEN": "Δεν έχουν διαβαστεί", - "LABEL_ADV_DATE": "Ημερομηνία", - "LABEL_ADV_DATE_ALL": "Όλα", - "LABEL_ADV_DATE_3_DAYS": "Έως 3 ημέρες πρίν", - "LABEL_ADV_DATE_7_DAYS": "Έως 1 εβδομάδα πριν", - "LABEL_ADV_DATE_MONTH": "Έως 1 μήνα πριν", - "LABEL_ADV_DATE_3_MONTHS": "Έως 3 μήνες πριν", - "LABEL_ADV_DATE_6_MONTHS": "Έως 6 μήνες πριν", - "LABEL_ADV_DATE_YEAR": "Έως 1 χρόνο πριν", - "LABEL_ADV_SUBFOLDERS": "Subfolders", - "LABEL_ADV_SUBFOLDERS_NONE": "None", - "LABEL_ADV_SUBFOLDERS_SUBTREE": "All", - "LABEL_ADV_SUBFOLDERS_SUBTREE_ONE": "One level" + "LABEL_TEXT": "Κείμενο", + "LABEL_HAS_ATTACHMENT": "Έχει συνημμένο", + "LABEL_HAS_ATTACHMENTS": "Έχει συνημμένα", + "LABEL_FLAGGED": "Με σημαία", + "LABEL_UNSEEN": "Δεν έχουν διαβαστεί", + "LABEL_DATE": "Ημερομηνία", + "LABEL_DATE_ALL": "Όλα", + "LABEL_DATE_3_DAYS": "Έως 3 ημέρες πρίν", + "LABEL_DATE_7_DAYS": "Έως 1 εβδομάδα πριν", + "LABEL_DATE_MONTH": "Έως 1 μήνα πριν", + "LABEL_DATE_3_MONTHS": "Έως 3 μήνες πριν", + "LABEL_DATE_6_MONTHS": "Έως 6 μήνες πριν", + "LABEL_DATE_YEAR": "Έως 1 χρόνο πριν", + "LABEL_SUBFOLDERS": "Subfolders", + "LABEL_SUBFOLDERS_NONE": "None", + "LABEL_SUBFOLDERS_SUBTREE": "All", + "LABEL_SUBFOLDERS_SUBTREE_ONE": "One level", + "LABEL_REPLIED": "Απάντησε" }, "PREVIEW_POPUP": { "FULLSCREEN": "Ενναλαγή πλήρους οθόνης", @@ -104,7 +108,6 @@ "EMPTY_SEARCH_LIST": "Δεν υπάρχουν μηνύματα που να ταιριάζουν στην αναζήτηση.", "SEARCH_RESULT_FOR": "Αποτελέσματα αναζήτησης για \"%SEARCH%\"", "BACK_TO_MESSAGE_LIST": "πίσω στη λίστα των μηνυμάτων", - "EMPTY_SUBJECT_TEXT": "(Κανένα θέμα)", "PUT_MESSAGE_HERE": "Σύρετε εδώ το μήνυμα για να φανεί στη λίστα", "TODAY_AT": "σήμερα στις %TIME%", "YESTERDAY_AT": "εχθές στις %TIME% ", @@ -224,8 +227,6 @@ "BUTTON_REQUEST_DSN": "Ζητήστε αποδεικτικό παράδοσης" }, "POPUPS_ASK": { - "BUTTON_YES": "Ναι", - "BUTTON_NO": "Όχι", "DESC_WANT_CLOSE_THIS_WINDOW": "Είστε σίγουροι πως θέλετε να κλείσετε αυτό το παράθυρο;", "DESC_WANT_DELETE_MESSAGES": "Είστε σίγουροι πως θέλετε να διαγράψετε το (τα) μήνυμα(τα);" }, @@ -402,6 +403,7 @@ "LABEL_REMOVE_COLORS": "Remove background and text colors from message body", "LABEL_MESSAGE_PER_PAGE": "Μηνύματα στη σελίδα", "LABEL_MARK_MESSAGE_READ_AFTER": "Mark message as read after", + "LABEL_MSG_DEFAULT_ACTION": "Default action", "SECONDS": "seconds", "LABEL_NOTIFICATIONS": "Επισημάνσεις", "LABEL_SOUND_NOTIFICATION": "Ηχητική επισήμανση", @@ -415,8 +417,6 @@ "LABEL_CONTACTS_SYNC_SERVER": "Εξυπηρετητής", "LABEL_CONTACTS_SYNC_AB_URL": "URL του καταλόγου διεθύνσεων", "LABEL_CONTACTS_SYNC_USER": "Χρήστης", - "SYNC_NO": "Όχι", - "SYNC_YES": "Ναι", "SYNC_READ": "Read only" }, "SETTINGS_THEMES": { diff --git a/snappymail/v/0.0.0/app/localization/en-GB/user.json b/snappymail/v/0.0.0/app/localization/en-GB/user.json index 1e96bc358..461e90940 100644 --- a/snappymail/v/0.0.0/app/localization/en-GB/user.json +++ b/snappymail/v/0.0.0/app/localization/en-GB/user.json @@ -20,6 +20,7 @@ "NAME": "Name", "NONE": "None", "NOT_SPAM": "Not Spam", + "USERNAME": "Username", "PASSWORD": "Password", "REPLY_TO": "Reply-To", "SAVE": "Save", @@ -28,7 +29,9 @@ "SUBJECT": "Subject", "TEST": "Test", "TO": "To", - "SERVER_MESSAGE": "Server message" + "SERVER_MESSAGE": "Server message", + "YES": "Yes", + "NO": "No" }, "LOGIN": { "LABEL_LOGIN": "Login", @@ -46,23 +49,24 @@ }, "SEARCH": { "TITLE_ADV": "Advanced Search", - "LABEL_ADV_TEXT": "Text", - "LABEL_ADV_HAS_ATTACHMENT": "Has attachment", - "LABEL_ADV_HAS_ATTACHMENTS": "Has attachments", - "LABEL_ADV_FLAGGED": "Flagged", - "LABEL_ADV_UNSEEN": "Unseen", - "LABEL_ADV_DATE": "Date", - "LABEL_ADV_DATE_ALL": "All", - "LABEL_ADV_DATE_3_DAYS": "Up to 3 days old", - "LABEL_ADV_DATE_7_DAYS": "Up to 1 week old", - "LABEL_ADV_DATE_MONTH": "Up to 1 month old", - "LABEL_ADV_DATE_3_MONTHS": "Up to 3 months old", - "LABEL_ADV_DATE_6_MONTHS": "Up to 6 months old", - "LABEL_ADV_DATE_YEAR": "Up to 1 year old", - "LABEL_ADV_SUBFOLDERS": "Subfolders", - "LABEL_ADV_SUBFOLDERS_NONE": "None", - "LABEL_ADV_SUBFOLDERS_SUBTREE": "All", - "LABEL_ADV_SUBFOLDERS_SUBTREE_ONE": "One level" + "LABEL_TEXT": "Text", + "LABEL_HAS_ATTACHMENT": "Has attachment", + "LABEL_HAS_ATTACHMENTS": "Has attachments", + "LABEL_FLAGGED": "Flagged", + "LABEL_UNSEEN": "Unseen", + "LABEL_DATE": "Date", + "LABEL_DATE_ALL": "All", + "LABEL_DATE_3_DAYS": "Up to 3 days old", + "LABEL_DATE_7_DAYS": "Up to 1 week old", + "LABEL_DATE_MONTH": "Up to 1 month old", + "LABEL_DATE_3_MONTHS": "Up to 3 months old", + "LABEL_DATE_6_MONTHS": "Up to 6 months old", + "LABEL_DATE_YEAR": "Up to 1 year old", + "LABEL_SUBFOLDERS": "Subfolders", + "LABEL_SUBFOLDERS_NONE": "None", + "LABEL_SUBFOLDERS_SUBTREE": "All", + "LABEL_SUBFOLDERS_SUBTREE_ONE": "One level", + "LABEL_REPLIED": "Answered" }, "PREVIEW_POPUP": { "FULLSCREEN": "Toggle fullscreen", @@ -78,7 +82,7 @@ "INBOX_NAME": "Inbox", "SENT_NAME": "Sent", "DRAFTS_NAME": "Drafts", - "TRASH_NAME": "Trash", + "TRASH_NAME": "Bin", "ARCHIVE_NAME": "Archive" }, "QUOTA": { @@ -104,7 +108,6 @@ "EMPTY_SEARCH_LIST": "No messages matched your search.", "SEARCH_RESULT_FOR": "Search results for \"%SEARCH%\"", "BACK_TO_MESSAGE_LIST": "back to message list", - "EMPTY_SUBJECT_TEXT": "(No subject)", "PUT_MESSAGE_HERE": "Drop message here to view it in the list", "TODAY_AT": "today at %TIME%", "YESTERDAY_AT": "yesterday at %TIME%", @@ -224,8 +227,6 @@ "BUTTON_REQUEST_DSN": "Request a delivery receipt" }, "POPUPS_ASK": { - "BUTTON_YES": "Yes", - "BUTTON_NO": "No", "DESC_WANT_CLOSE_THIS_WINDOW": "Are you sure you want to close this window?", "DESC_WANT_DELETE_MESSAGES": "Are you sure you want to delete the message(s)?" }, @@ -331,7 +332,7 @@ "NOTIFICATION_SENT": "You haven't selected \"Sent\" system folder messages are put to after sending.\nIf you don't want to save sent message, please select \"Do not use\" option.\n", "NOTIFICATION_DRAFTS": "You haven't selected \"Drafts\" system folder messages are saved to while composing.", "NOTIFICATION_SPAM": "You haven't selected \"Spam\" system folder spamed messages are placed to.\nIf you wish to remove messages permanently, please select \"Do not use\" option.\n", - "NOTIFICATION_TRASH": "You haven't selected \"Trash\" system folder deleted messages are placed to.\nIf you wish to remove messages permanently, please select \"Do not use\" option.\n", + "NOTIFICATION_TRASH": "You haven't selected \"Bin\" system folder deleted messages are placed to.\nIf you wish to remove messages permanently, please select \"Do not use\" option.\n", "NOTIFICATION_ARCHIVE": "You haven't selected \"Archive\" system folder achived messages are placed to." }, "TITLES": { @@ -402,6 +403,7 @@ "LABEL_REMOVE_COLORS": "Remove background and text colors from message body", "LABEL_MESSAGE_PER_PAGE": "Messages on page", "LABEL_MARK_MESSAGE_READ_AFTER": "Mark message as read after", + "LABEL_MSG_DEFAULT_ACTION": "Default action", "SECONDS": "seconds", "LABEL_NOTIFICATIONS": "Notifications", "LABEL_SOUND_NOTIFICATION": "Sound notification", @@ -415,8 +417,6 @@ "LABEL_CONTACTS_SYNC_SERVER": "Server", "LABEL_CONTACTS_SYNC_AB_URL": "Addressbook URL", "LABEL_CONTACTS_SYNC_USER": "User", - "SYNC_NO": "No", - "SYNC_YES": "Yes", "SYNC_READ": "Read only" }, "SETTINGS_THEMES": { diff --git a/snappymail/v/0.0.0/app/localization/en/admin.json b/snappymail/v/0.0.0/app/localization/en/admin.json index 512af6812..65c41458a 100644 --- a/snappymail/v/0.0.0/app/localization/en/admin.json +++ b/snappymail/v/0.0.0/app/localization/en/admin.json @@ -4,7 +4,10 @@ "CLOSE": "Close", "SAVE": "Save", "TEST": "Test", - "UPDATE": "Update" + "UPDATE": "Update", + "USERNAME": "Username", + "PASSWORD": "Password", + "CANCEL": "Cancel" }, "LOGIN": { "LABEL_LOGIN": "Login", @@ -84,10 +87,8 @@ "LABEL_SHOW_PHP_INFO": "Show PHP information", "LEGEND_ADMIN_PANEL_ACCESS_CREDENTIALS": "Admin Panel Access Credentials", "LABEL_CURRENT_PASSWORD": "Current password", - "LABEL_NEW_LOGIN": "New login", "LABEL_NEW_PASSWORD": "New password", "LABEL_REPEAT_PASSWORD": "Repeat", - "BUTTON_UPDATE_PASSWORD": "Update Password", "LEGEND_SSL": "SSL", "LABEL_REQUIRE_VERIFICATION": "Require verification of SSL certificate used (IMAP\/SMTP)", "LABEL_ALLOW_SELF_SIGNED": "Allow self signed certificates" diff --git a/snappymail/v/0.0.0/app/localization/en/user.json b/snappymail/v/0.0.0/app/localization/en/user.json index 0b8bb7782..78834a28b 100644 --- a/snappymail/v/0.0.0/app/localization/en/user.json +++ b/snappymail/v/0.0.0/app/localization/en/user.json @@ -20,6 +20,7 @@ "NAME": "Name", "NONE": "None", "NOT_SPAM": "Not Spam", + "USERNAME": "Username", "PASSWORD": "Password", "REPLY_TO": "Reply-To", "SAVE": "Save", @@ -28,7 +29,9 @@ "SUBJECT": "Subject", "TEST": "Test", "TO": "To", - "SERVER_MESSAGE": "Server message" + "SERVER_MESSAGE": "Server message", + "YES": "Yes", + "NO": "No" }, "LOGIN": { "LABEL_LOGIN": "Login", @@ -46,23 +49,24 @@ }, "SEARCH": { "TITLE_ADV": "Advanced Search", - "LABEL_ADV_TEXT": "Text", - "LABEL_ADV_HAS_ATTACHMENT": "Has attachment", - "LABEL_ADV_HAS_ATTACHMENTS": "Has attachments", - "LABEL_ADV_FLAGGED": "Flagged", - "LABEL_ADV_UNSEEN": "Unseen", - "LABEL_ADV_DATE": "Date", - "LABEL_ADV_DATE_ALL": "All", - "LABEL_ADV_DATE_3_DAYS": "Up to 3 days old", - "LABEL_ADV_DATE_7_DAYS": "Up to 1 week old", - "LABEL_ADV_DATE_MONTH": "Up to 1 month old", - "LABEL_ADV_DATE_3_MONTHS": "Up to 3 months old", - "LABEL_ADV_DATE_6_MONTHS": "Up to 6 months old", - "LABEL_ADV_DATE_YEAR": "Up to 1 year old", - "LABEL_ADV_SUBFOLDERS": "Subfolders", - "LABEL_ADV_SUBFOLDERS_NONE": "None", - "LABEL_ADV_SUBFOLDERS_SUBTREE": "All", - "LABEL_ADV_SUBFOLDERS_SUBTREE_ONE": "One level" + "LABEL_TEXT": "Text", + "LABEL_HAS_ATTACHMENT": "Has attachment", + "LABEL_HAS_ATTACHMENTS": "Has attachments", + "LABEL_FLAGGED": "Flagged", + "LABEL_UNSEEN": "Unseen", + "LABEL_DATE": "Date", + "LABEL_DATE_ALL": "All", + "LABEL_DATE_3_DAYS": "Up to 3 days old", + "LABEL_DATE_7_DAYS": "Up to 1 week old", + "LABEL_DATE_MONTH": "Up to 1 month old", + "LABEL_DATE_3_MONTHS": "Up to 3 months old", + "LABEL_DATE_6_MONTHS": "Up to 6 months old", + "LABEL_DATE_YEAR": "Up to 1 year old", + "LABEL_SUBFOLDERS": "Subfolders", + "LABEL_SUBFOLDERS_NONE": "None", + "LABEL_SUBFOLDERS_SUBTREE": "All", + "LABEL_SUBFOLDERS_SUBTREE_ONE": "One level", + "LABEL_REPLIED": "Answered" }, "PREVIEW_POPUP": { "FULLSCREEN": "Toggle fullscreen", @@ -104,7 +108,6 @@ "EMPTY_SEARCH_LIST": "No messages matched your search.", "SEARCH_RESULT_FOR": "Search results for \"%SEARCH%\"", "BACK_TO_MESSAGE_LIST": "back to message list", - "EMPTY_SUBJECT_TEXT": "(No subject)", "PUT_MESSAGE_HERE": "Drop message here to view it in the list", "TODAY_AT": "today at %TIME%", "YESTERDAY_AT": "yesterday at %TIME%", @@ -224,8 +227,6 @@ "BUTTON_REQUEST_DSN": "Request a delivery receipt" }, "POPUPS_ASK": { - "BUTTON_YES": "Yes", - "BUTTON_NO": "No", "DESC_WANT_CLOSE_THIS_WINDOW": "Are you sure you want to close this window?", "DESC_WANT_DELETE_MESSAGES": "Are you sure you want to delete the message(s)?" }, @@ -402,6 +403,7 @@ "LABEL_REMOVE_COLORS": "Remove background and text colors from message body", "LABEL_MESSAGE_PER_PAGE": "Messages on page", "LABEL_MARK_MESSAGE_READ_AFTER": "Mark message as read after", + "LABEL_MSG_DEFAULT_ACTION": "Default action", "SECONDS": "seconds", "LABEL_NOTIFICATIONS": "Notifications", "LABEL_SOUND_NOTIFICATION": "Sound notification", @@ -415,8 +417,6 @@ "LABEL_CONTACTS_SYNC_SERVER": "Server", "LABEL_CONTACTS_SYNC_AB_URL": "Addressbook URL", "LABEL_CONTACTS_SYNC_USER": "User", - "SYNC_NO": "No", - "SYNC_YES": "Yes", "SYNC_READ": "Read only" }, "SETTINGS_THEMES": { diff --git a/snappymail/v/0.0.0/app/localization/es-ES/admin.json b/snappymail/v/0.0.0/app/localization/es-ES/admin.json index 70536a3ae..d7813cce3 100644 --- a/snappymail/v/0.0.0/app/localization/es-ES/admin.json +++ b/snappymail/v/0.0.0/app/localization/es-ES/admin.json @@ -4,7 +4,10 @@ "CLOSE": "Cerrar", "SAVE": "Guardar", "TEST": "Probar", - "UPDATE": "Actualizar" + "UPDATE": "Actualizar", + "USERNAME": "Nombre de usuario", + "PASSWORD": "Contraseña", + "CANCEL": "Cancelar" }, "LOGIN": { "LABEL_LOGIN": "Ingresar", @@ -84,10 +87,8 @@ "LABEL_SHOW_PHP_INFO": "Mostrar información de PHP", "LEGEND_ADMIN_PANEL_ACCESS_CREDENTIALS": "Credenciales de Acceso al panel de control", "LABEL_CURRENT_PASSWORD": "Contraseña actual", - "LABEL_NEW_LOGIN": "Nuevo login", "LABEL_NEW_PASSWORD": "Nueva contraseña", "LABEL_REPEAT_PASSWORD": "Re-ingresar", - "BUTTON_UPDATE_PASSWORD": "Actualizar contraseña", "LEGEND_SSL": "SSL", "LABEL_REQUIRE_VERIFICATION": "Requerir verificación del certificado SSL (IMAP \/ SMTP)", "LABEL_ALLOW_SELF_SIGNED": "Permitir certificados auto-firmados" diff --git a/snappymail/v/0.0.0/app/localization/es-ES/user.json b/snappymail/v/0.0.0/app/localization/es-ES/user.json index a2c7c3aea..9ed01c9f3 100644 --- a/snappymail/v/0.0.0/app/localization/es-ES/user.json +++ b/snappymail/v/0.0.0/app/localization/es-ES/user.json @@ -20,6 +20,7 @@ "NAME": "Nombre", "NONE": "Ninguno", "NOT_SPAM": "Correo no deseado", + "USERNAME": "Nombre de usuario", "PASSWORD": "Contraseña", "REPLY_TO": "Responder", "SAVE": "Guardar", @@ -28,7 +29,9 @@ "SUBJECT": "Asunto", "TEST": "Probar", "TO": "Para", - "SERVER_MESSAGE": "Server message" + "SERVER_MESSAGE": "Server message", + "YES": "Sí", + "NO": "No" }, "LOGIN": { "LABEL_LOGIN": "Login", @@ -46,23 +49,24 @@ }, "SEARCH": { "TITLE_ADV": "Búsqueda avanzada", - "LABEL_ADV_TEXT": "Texto", - "LABEL_ADV_HAS_ATTACHMENT": "Tiene adjunto", - "LABEL_ADV_HAS_ATTACHMENTS": "Tiene adjuntos", - "LABEL_ADV_FLAGGED": "Seleccionado", - "LABEL_ADV_UNSEEN": "No leído", - "LABEL_ADV_DATE": "Fecha", - "LABEL_ADV_DATE_ALL": "Todo", - "LABEL_ADV_DATE_3_DAYS": "Hasta 3 días de antigüedad", - "LABEL_ADV_DATE_7_DAYS": "Hasta una semana de antigüedad", - "LABEL_ADV_DATE_MONTH": "Hasta 1 mes de antigüedad", - "LABEL_ADV_DATE_3_MONTHS": "Hasta 3 meses de antigüedad", - "LABEL_ADV_DATE_6_MONTHS": "Hasta 6 meses de antigüedad", - "LABEL_ADV_DATE_YEAR": "Hasta 1 año de antigüedad", - "LABEL_ADV_SUBFOLDERS": "Subfolders", - "LABEL_ADV_SUBFOLDERS_NONE": "None", - "LABEL_ADV_SUBFOLDERS_SUBTREE": "All", - "LABEL_ADV_SUBFOLDERS_SUBTREE_ONE": "One level" + "LABEL_TEXT": "Texto", + "LABEL_HAS_ATTACHMENT": "Tiene adjunto", + "LABEL_HAS_ATTACHMENTS": "Tiene adjuntos", + "LABEL_FLAGGED": "Seleccionado", + "LABEL_UNSEEN": "No leído", + "LABEL_DATE": "Fecha", + "LABEL_DATE_ALL": "Todo", + "LABEL_DATE_3_DAYS": "Hasta 3 días de antigüedad", + "LABEL_DATE_7_DAYS": "Hasta una semana de antigüedad", + "LABEL_DATE_MONTH": "Hasta 1 mes de antigüedad", + "LABEL_DATE_3_MONTHS": "Hasta 3 meses de antigüedad", + "LABEL_DATE_6_MONTHS": "Hasta 6 meses de antigüedad", + "LABEL_DATE_YEAR": "Hasta 1 año de antigüedad", + "LABEL_SUBFOLDERS": "Subfolders", + "LABEL_SUBFOLDERS_NONE": "None", + "LABEL_SUBFOLDERS_SUBTREE": "All", + "LABEL_SUBFOLDERS_SUBTREE_ONE": "One level", + "LABEL_REPLIED": "Contestada" }, "PREVIEW_POPUP": { "FULLSCREEN": "Cambiar a pantalla completa", @@ -104,7 +108,6 @@ "EMPTY_SEARCH_LIST": "La búsqueda no ha producido resultados.", "SEARCH_RESULT_FOR": "Resultados de búsqueda para \"%SEARCH%\"", "BACK_TO_MESSAGE_LIST": "volver a la lista de mensajes", - "EMPTY_SUBJECT_TEXT": "(Sin asunto)", "PUT_MESSAGE_HERE": "Arrastre su mensaje aquí para verlo en la lista", "TODAY_AT": "hoy a las %TIME%", "YESTERDAY_AT": "ayer a las %TIME%", @@ -224,8 +227,6 @@ "BUTTON_REQUEST_DSN": "Solicitar una confirmación de entrega" }, "POPUPS_ASK": { - "BUTTON_YES": "Sí", - "BUTTON_NO": "No", "DESC_WANT_CLOSE_THIS_WINDOW": "¿Está seguro de que desea cerrar esta ventana?", "DESC_WANT_DELETE_MESSAGES": "¿Está seguro de que desea eliminar los mensajes?" }, @@ -402,6 +403,7 @@ "LABEL_REMOVE_COLORS": "Eliminar el fondo y los colores del texto del mensaje", "LABEL_MESSAGE_PER_PAGE": "Mensajes en página", "LABEL_MARK_MESSAGE_READ_AFTER": "Marcar el mensaje como leído después de", + "LABEL_MSG_DEFAULT_ACTION": "Default action", "SECONDS": "segundos", "LABEL_NOTIFICATIONS": "Notificaciones", "LABEL_SOUND_NOTIFICATION": "Sonido de la notificación", @@ -415,8 +417,6 @@ "LABEL_CONTACTS_SYNC_SERVER": "Servidor", "LABEL_CONTACTS_SYNC_AB_URL": "Libreta de direcciones URL", "LABEL_CONTACTS_SYNC_USER": "Usuario", - "SYNC_NO": "No", - "SYNC_YES": "Sí", "SYNC_READ": "Read only" }, "SETTINGS_THEMES": { diff --git a/snappymail/v/0.0.0/app/localization/et-EE/user.json b/snappymail/v/0.0.0/app/localization/et-EE/user.json index 4cbb17abc..1e494c345 100644 --- a/snappymail/v/0.0.0/app/localization/et-EE/user.json +++ b/snappymail/v/0.0.0/app/localization/et-EE/user.json @@ -20,6 +20,7 @@ "NAME": "Saabunud kirjad", "NONE": "Puuduvad", "NOT_SPAM": "Ei ole rämpspost", + "USERNAME": "Kasutajanimi", "PASSWORD": "Salasõna", "REPLY_TO": "Vastuse saaja", "SAVE": "Salvesta", @@ -28,7 +29,9 @@ "SUBJECT": "Pealkiri", "TEST": "Kontrolli", "TO": "Saaja", - "SERVER_MESSAGE": "Server message" + "SERVER_MESSAGE": "Server message", + "YES": "Jah", + "NO": "Ei" }, "LOGIN": { "LABEL_LOGIN": "Logi sisse", @@ -46,23 +49,24 @@ }, "SEARCH": { "TITLE_ADV": "Täpsem otsing", - "LABEL_ADV_TEXT": "Tekst", - "LABEL_ADV_HAS_ATTACHMENT": "Manusega", - "LABEL_ADV_HAS_ATTACHMENTS": "Manustega", - "LABEL_ADV_FLAGGED": "Lipuga tähistatud", - "LABEL_ADV_UNSEEN": "Lugemata", - "LABEL_ADV_DATE": "Kuupäev", - "LABEL_ADV_DATE_ALL": "Kõik", - "LABEL_ADV_DATE_3_DAYS": "Kuni 3 päeva vanune", - "LABEL_ADV_DATE_7_DAYS": "Kuni 1 nädal vanune", - "LABEL_ADV_DATE_MONTH": "Kuni 1 kuu vanune", - "LABEL_ADV_DATE_3_MONTHS": "Kuni 3 kuu vanune ", - "LABEL_ADV_DATE_6_MONTHS": "Kuni 6 kuu vanune", - "LABEL_ADV_DATE_YEAR": "Kuni 1 aasta vanune", - "LABEL_ADV_SUBFOLDERS": "Subfolders", - "LABEL_ADV_SUBFOLDERS_NONE": "None", - "LABEL_ADV_SUBFOLDERS_SUBTREE": "All", - "LABEL_ADV_SUBFOLDERS_SUBTREE_ONE": "One level" + "LABEL_TEXT": "Tekst", + "LABEL_HAS_ATTACHMENT": "Manusega", + "LABEL_HAS_ATTACHMENTS": "Manustega", + "LABEL_FLAGGED": "Lipuga tähistatud", + "LABEL_UNSEEN": "Lugemata", + "LABEL_DATE": "Kuupäev", + "LABEL_DATE_ALL": "Kõik", + "LABEL_DATE_3_DAYS": "Kuni 3 päeva vanune", + "LABEL_DATE_7_DAYS": "Kuni 1 nädal vanune", + "LABEL_DATE_MONTH": "Kuni 1 kuu vanune", + "LABEL_DATE_3_MONTHS": "Kuni 3 kuu vanune ", + "LABEL_DATE_6_MONTHS": "Kuni 6 kuu vanune", + "LABEL_DATE_YEAR": "Kuni 1 aasta vanune", + "LABEL_SUBFOLDERS": "Subfolders", + "LABEL_SUBFOLDERS_NONE": "None", + "LABEL_SUBFOLDERS_SUBTREE": "All", + "LABEL_SUBFOLDERS_SUBTREE_ONE": "One level", + "LABEL_REPLIED": "Vastatud" }, "PREVIEW_POPUP": { "FULLSCREEN": "Täisekraan sisse\/välja", @@ -104,7 +108,6 @@ "EMPTY_SEARCH_LIST": "Otsingule ei vastanud ühtegi kirja", "SEARCH_RESULT_FOR": "Vasted otsingule \"%SEARCH%\"", "BACK_TO_MESSAGE_LIST": "tagasi kirjade nimekirja", - "EMPTY_SUBJECT_TEXT": "(Pealkiri puudub)", "PUT_MESSAGE_HERE": "Sikuta siia kiri, mida soovid nimekirjas näha", "TODAY_AT": "täna kell %TIME%", "YESTERDAY_AT": "eile kell %TIME%", @@ -224,8 +227,6 @@ "BUTTON_REQUEST_DSN": "Palu kättesaamise kohta kinnitust" }, "POPUPS_ASK": { - "BUTTON_YES": "Jah", - "BUTTON_NO": "Ei", "DESC_WANT_CLOSE_THIS_WINDOW": "Kas oled kindel, et soovid akna sulgeda?", "DESC_WANT_DELETE_MESSAGES": "Kas oled kindel, et soovid sõnumi(d) kustutada?" }, @@ -402,6 +403,7 @@ "LABEL_REMOVE_COLORS": "Remove background and text colors from message body", "LABEL_MESSAGE_PER_PAGE": "Lehel kuvatavate kirjade arv", "LABEL_MARK_MESSAGE_READ_AFTER": "Mark message as read after", + "LABEL_MSG_DEFAULT_ACTION": "Default action", "SECONDS": "seconds", "LABEL_NOTIFICATIONS": "Teavitused", "LABEL_SOUND_NOTIFICATION": "Teavitused heliga", @@ -415,8 +417,6 @@ "LABEL_CONTACTS_SYNC_SERVER": "Server", "LABEL_CONTACTS_SYNC_AB_URL": "Aadressiraamatu URL", "LABEL_CONTACTS_SYNC_USER": "Kasutaja", - "SYNC_NO": "Ei", - "SYNC_YES": "Jah", "SYNC_READ": "Read only" }, "SETTINGS_THEMES": { diff --git a/snappymail/v/0.0.0/app/localization/fa-IR/admin.json b/snappymail/v/0.0.0/app/localization/fa-IR/admin.json index 8ede5a534..c9329d1d6 100644 --- a/snappymail/v/0.0.0/app/localization/fa-IR/admin.json +++ b/snappymail/v/0.0.0/app/localization/fa-IR/admin.json @@ -4,7 +4,10 @@ "CLOSE": "بستن", "SAVE": "ذخیره", "TEST": "تست", - "UPDATE": "بروزرسانی" + "UPDATE": "بروزرسانی", + "USERNAME": "نام کاربری", + "PASSWORD": "گذرواژه", + "CANCEL": "انصراف" }, "LOGIN": { "LABEL_LOGIN": "ورود", @@ -84,10 +87,8 @@ "LABEL_SHOW_PHP_INFO": "نمایش اطلاعات PHP", "LEGEND_ADMIN_PANEL_ACCESS_CREDENTIALS": "اعتبار مجوز دسترسی به صفحه مدیریت", "LABEL_CURRENT_PASSWORD": "گذرواژه فعلی", - "LABEL_NEW_LOGIN": "نام کاربری جدید", "LABEL_NEW_PASSWORD": "گذرواژه جدید", "LABEL_REPEAT_PASSWORD": "تکرار", - "BUTTON_UPDATE_PASSWORD": "بروز‌رسانی گذرواژه", "LEGEND_SSL": "SSL", "LABEL_REQUIRE_VERIFICATION": "به بررسی گواهینامه SSL نیاز داشته باشد (IMAP\/SMTP)", "LABEL_ALLOW_SELF_SIGNED": "به گواهی‌نامه‌هایی که توسط خودشان امضاء شده‌اند اجازه بده" diff --git a/snappymail/v/0.0.0/app/localization/fa-IR/user.json b/snappymail/v/0.0.0/app/localization/fa-IR/user.json index 4718e772f..e78644c67 100644 --- a/snappymail/v/0.0.0/app/localization/fa-IR/user.json +++ b/snappymail/v/0.0.0/app/localization/fa-IR/user.json @@ -20,6 +20,7 @@ "NAME": "صندوق ورودی", "NONE": "هیچ‌کدام", "NOT_SPAM": "هرزنامه نیست", + "USERNAME": "نام کاربری", "PASSWORD": "گذرواژه", "REPLY_TO": "پاسخ به", "SAVE": "ذخیره کن", @@ -28,7 +29,9 @@ "SUBJECT": "موضوع", "TEST": "تست", "TO": "به", - "SERVER_MESSAGE": "Server message" + "SERVER_MESSAGE": "Server message", + "YES": "بلی", + "NO": "خیر" }, "LOGIN": { "LABEL_LOGIN": "ورود", @@ -46,23 +49,24 @@ }, "SEARCH": { "TITLE_ADV": "جستجوی پیشرفته", - "LABEL_ADV_TEXT": "متن", - "LABEL_ADV_HAS_ATTACHMENT": "داشتن پیوست", - "LABEL_ADV_HAS_ATTACHMENTS": "داشتن پیوست‌ها", - "LABEL_ADV_FLAGGED": "پرچم", - "LABEL_ADV_UNSEEN": "خوانده نشده", - "LABEL_ADV_DATE": "تاریخ", - "LABEL_ADV_DATE_ALL": "همه", - "LABEL_ADV_DATE_3_DAYS": "تا 3 روز گذشته", - "LABEL_ADV_DATE_7_DAYS": "تا 1 هفته گذشته", - "LABEL_ADV_DATE_MONTH": "تا 1 ماه گذشته", - "LABEL_ADV_DATE_3_MONTHS": "تا 3 ماه گذشته", - "LABEL_ADV_DATE_6_MONTHS": "تا 6 ماه گذشته", - "LABEL_ADV_DATE_YEAR": "تا 1 سال گذشته", - "LABEL_ADV_SUBFOLDERS": "Subfolders", - "LABEL_ADV_SUBFOLDERS_NONE": "None", - "LABEL_ADV_SUBFOLDERS_SUBTREE": "All", - "LABEL_ADV_SUBFOLDERS_SUBTREE_ONE": "One level" + "LABEL_TEXT": "متن", + "LABEL_HAS_ATTACHMENT": "داشتن پیوست", + "LABEL_HAS_ATTACHMENTS": "داشتن پیوست‌ها", + "LABEL_FLAGGED": "پرچم", + "LABEL_UNSEEN": "خوانده نشده", + "LABEL_DATE": "تاریخ", + "LABEL_DATE_ALL": "همه", + "LABEL_DATE_3_DAYS": "تا 3 روز گذشته", + "LABEL_DATE_7_DAYS": "تا 1 هفته گذشته", + "LABEL_DATE_MONTH": "تا 1 ماه گذشته", + "LABEL_DATE_3_MONTHS": "تا 3 ماه گذشته", + "LABEL_DATE_6_MONTHS": "تا 6 ماه گذشته", + "LABEL_DATE_YEAR": "تا 1 سال گذشته", + "LABEL_SUBFOLDERS": "Subfolders", + "LABEL_SUBFOLDERS_NONE": "None", + "LABEL_SUBFOLDERS_SUBTREE": "All", + "LABEL_SUBFOLDERS_SUBTREE_ONE": "One level", + "LABEL_REPLIED": "جواب داد" }, "PREVIEW_POPUP": { "FULLSCREEN": "ضامن تمام صفحه", @@ -104,7 +108,6 @@ "EMPTY_SEARCH_LIST": "پیامی مطابق جستجوی شما پیدا نشد", "SEARCH_RESULT_FOR": "نتایج جستجو مطابق \"%SEARCH%\"", "BACK_TO_MESSAGE_LIST": "برگشت به لیست پیام‌ها", - "EMPTY_SUBJECT_TEXT": "(بدون موضوع)", "PUT_MESSAGE_HERE": "برای دیدن پیام در این لیست آن را به اینجا بکشید", "TODAY_AT": "امروز در %TIME%", "YESTERDAY_AT": " دیروز در %TIME%", @@ -224,8 +227,6 @@ "BUTTON_REQUEST_DSN": "درخواست دریافت رسید تحویل درمقصد" }, "POPUPS_ASK": { - "BUTTON_YES": "بلی", - "BUTTON_NO": "خیر", "DESC_WANT_CLOSE_THIS_WINDOW": "آیا از بستن این پنجره مطمئن هستید؟", "DESC_WANT_DELETE_MESSAGES": "آیا از حذف این پیام(ها) اطمینان دارید؟" }, @@ -402,6 +403,7 @@ "LABEL_REMOVE_COLORS": "Remove background and text colors from message body", "LABEL_MESSAGE_PER_PAGE": "پیام‌ها در صفحه", "LABEL_MARK_MESSAGE_READ_AFTER": "Mark message as read after", + "LABEL_MSG_DEFAULT_ACTION": "Default action", "SECONDS": "seconds", "LABEL_NOTIFICATIONS": "اطلاعیه‌ها", "LABEL_SOUND_NOTIFICATION": "آگاه‌سازی با صدا", @@ -415,8 +417,6 @@ "LABEL_CONTACTS_SYNC_SERVER": "سرور", "LABEL_CONTACTS_SYNC_AB_URL": "تارنمای آدرس‌بوک", "LABEL_CONTACTS_SYNC_USER": "کاربر", - "SYNC_NO": "خیر", - "SYNC_YES": "بلی", "SYNC_READ": "Read only" }, "SETTINGS_THEMES": { diff --git a/snappymail/v/0.0.0/app/localization/fi-FI/admin.json b/snappymail/v/0.0.0/app/localization/fi-FI/admin.json index 2eb92feac..9a2edcbe3 100644 --- a/snappymail/v/0.0.0/app/localization/fi-FI/admin.json +++ b/snappymail/v/0.0.0/app/localization/fi-FI/admin.json @@ -4,7 +4,10 @@ "CLOSE": "Sulje", "SAVE": "Tallenna", "TEST": "Testi", - "UPDATE": "Päivitä" + "UPDATE": "Päivitä", + "USERNAME": "Käyttäjätunnus", + "PASSWORD": "Salasana", + "CANCEL": "Peruuta" }, "LOGIN": { "LABEL_LOGIN": "Tunnus", @@ -84,10 +87,8 @@ "LABEL_SHOW_PHP_INFO": "Näytä PHP tiedot", "LEGEND_ADMIN_PANEL_ACCESS_CREDENTIALS": "Hallintapaneeli kirjautumistiedot", "LABEL_CURRENT_PASSWORD": "Nykyinen salasana", - "LABEL_NEW_LOGIN": "Uusi tunnus", "LABEL_NEW_PASSWORD": "Uusi salasana", "LABEL_REPEAT_PASSWORD": "Toista", - "BUTTON_UPDATE_PASSWORD": "Päivitä salasana", "LEGEND_SSL": "SSL", "LABEL_REQUIRE_VERIFICATION": "Vaadi SSL sertifikaatin varmistus (IMAP\/SMTP)", "LABEL_ALLOW_SELF_SIGNED": "Salli itse-allekirjoitetut sertifikaatit" diff --git a/snappymail/v/0.0.0/app/localization/fi-FI/user.json b/snappymail/v/0.0.0/app/localization/fi-FI/user.json index d2d5e6792..bc858cccc 100644 --- a/snappymail/v/0.0.0/app/localization/fi-FI/user.json +++ b/snappymail/v/0.0.0/app/localization/fi-FI/user.json @@ -20,6 +20,7 @@ "NAME": "Postilaatikko", "NONE": "Ei mitään", "NOT_SPAM": "Ei roskapostia", + "USERNAME": "Käyttäjätunnus", "PASSWORD": "Salasana", "REPLY_TO": "Vastaa", "SAVE": "Tallenna", @@ -28,7 +29,9 @@ "SUBJECT": "Aihe", "TEST": "Testaa", "TO": "Vastaanottaja", - "SERVER_MESSAGE": "Server message" + "SERVER_MESSAGE": "Server message", + "YES": "Kyllä", + "NO": "Ei" }, "LOGIN": { "LABEL_LOGIN": "Tunnus", @@ -46,23 +49,24 @@ }, "SEARCH": { "TITLE_ADV": "Tarkka haku", - "LABEL_ADV_TEXT": "Teksti", - "LABEL_ADV_HAS_ATTACHMENT": "Sisältää liitteen", - "LABEL_ADV_HAS_ATTACHMENTS": "Sisältää liitteitä", - "LABEL_ADV_FLAGGED": "Merkitty", - "LABEL_ADV_UNSEEN": "Ei luettu", - "LABEL_ADV_DATE": "Pvm", - "LABEL_ADV_DATE_ALL": "Kaikki", - "LABEL_ADV_DATE_3_DAYS": "3 päivän ajalta", - "LABEL_ADV_DATE_7_DAYS": "1 viikon ajalta", - "LABEL_ADV_DATE_MONTH": "1 kk ajalta", - "LABEL_ADV_DATE_3_MONTHS": "3 kk ajalta", - "LABEL_ADV_DATE_6_MONTHS": "6 kk ajalta", - "LABEL_ADV_DATE_YEAR": "1 vuoden ajalta", - "LABEL_ADV_SUBFOLDERS": "Subfolders", - "LABEL_ADV_SUBFOLDERS_NONE": "None", - "LABEL_ADV_SUBFOLDERS_SUBTREE": "All", - "LABEL_ADV_SUBFOLDERS_SUBTREE_ONE": "One level" + "LABEL_TEXT": "Teksti", + "LABEL_HAS_ATTACHMENT": "Sisältää liitteen", + "LABEL_HAS_ATTACHMENTS": "Sisältää liitteitä", + "LABEL_FLAGGED": "Merkitty", + "LABEL_UNSEEN": "Ei luettu", + "LABEL_DATE": "Pvm", + "LABEL_DATE_ALL": "Kaikki", + "LABEL_DATE_3_DAYS": "3 päivän ajalta", + "LABEL_DATE_7_DAYS": "1 viikon ajalta", + "LABEL_DATE_MONTH": "1 kk ajalta", + "LABEL_DATE_3_MONTHS": "3 kk ajalta", + "LABEL_DATE_6_MONTHS": "6 kk ajalta", + "LABEL_DATE_YEAR": "1 vuoden ajalta", + "LABEL_SUBFOLDERS": "Subfolders", + "LABEL_SUBFOLDERS_NONE": "None", + "LABEL_SUBFOLDERS_SUBTREE": "All", + "LABEL_SUBFOLDERS_SUBTREE_ONE": "One level", + "LABEL_REPLIED": "Vastattu" }, "PREVIEW_POPUP": { "FULLSCREEN": "Koko ruutu", @@ -104,7 +108,6 @@ "EMPTY_SEARCH_LIST": "Yhtään viestiä ei löytynyt ehdoillasi.", "SEARCH_RESULT_FOR": "Hakutulokset haulle \"%SEARCH%\"", "BACK_TO_MESSAGE_LIST": "Takaisin viestilistaan", - "EMPTY_SUBJECT_TEXT": "(Ei aihetta)", "PUT_MESSAGE_HERE": "Pudota viesti tähän nähdäksesi sen listassa", "TODAY_AT": "tänään klo %TIME%", "YESTERDAY_AT": "eilen klo %TIME%", @@ -224,8 +227,6 @@ "BUTTON_REQUEST_DSN": "Pyydä toimituskuittaus" }, "POPUPS_ASK": { - "BUTTON_YES": "Kyllä", - "BUTTON_NO": "Ei", "DESC_WANT_CLOSE_THIS_WINDOW": "Haluatko varmasti sulkea tämän ikkunan?", "DESC_WANT_DELETE_MESSAGES": "Haluatko varmasti poistaa viestin\/viestit?" }, @@ -402,6 +403,7 @@ "LABEL_REMOVE_COLORS": "Remove background and text colors from message body", "LABEL_MESSAGE_PER_PAGE": "Viestiä sivulla", "LABEL_MARK_MESSAGE_READ_AFTER": "Mark message as read after", + "LABEL_MSG_DEFAULT_ACTION": "Default action", "SECONDS": "seconds", "LABEL_NOTIFICATIONS": "Ilmoitukset", "LABEL_SOUND_NOTIFICATION": "Äänimerkit", @@ -415,8 +417,6 @@ "LABEL_CONTACTS_SYNC_SERVER": "Palvelin", "LABEL_CONTACTS_SYNC_AB_URL": "Osoitekirjan URL", "LABEL_CONTACTS_SYNC_USER": "Käyttäjä", - "SYNC_NO": "Ei", - "SYNC_YES": "Kyllä", "SYNC_READ": "Read only" }, "SETTINGS_THEMES": { diff --git a/snappymail/v/0.0.0/app/localization/fr-FR/admin.json b/snappymail/v/0.0.0/app/localization/fr-FR/admin.json index 6fcf73008..0ca8f855b 100644 --- a/snappymail/v/0.0.0/app/localization/fr-FR/admin.json +++ b/snappymail/v/0.0.0/app/localization/fr-FR/admin.json @@ -4,7 +4,10 @@ "CLOSE": "Fermer", "SAVE": "Enregistrer", "TEST": "Test", - "UPDATE": "Mettre à jour" + "UPDATE": "Mettre à jour", + "USERNAME": "Nom d'utilisateur", + "PASSWORD": "Mot de passe", + "CANCEL": "Annuler" }, "LOGIN": { "LABEL_LOGIN": "Identifiant", @@ -84,10 +87,8 @@ "LABEL_SHOW_PHP_INFO": "Voir les informations PHP", "LEGEND_ADMIN_PANEL_ACCESS_CREDENTIALS": "Codes d'accès au panneau d'administration", "LABEL_CURRENT_PASSWORD": "Mot de passe actuel", - "LABEL_NEW_LOGIN": "Nouvel identifiant", "LABEL_NEW_PASSWORD": "Nouveau mot de passe", "LABEL_REPEAT_PASSWORD": "Répéter", - "BUTTON_UPDATE_PASSWORD": "Changer le mot de passe", "LEGEND_SSL": "SSL", "LABEL_REQUIRE_VERIFICATION": "S'assurer qu'un certificat SSL (IMAP\/SMTP) est utilisé", "LABEL_ALLOW_SELF_SIGNED": "Autoriser les certificats auto-signés" diff --git a/snappymail/v/0.0.0/app/localization/fr-FR/user.json b/snappymail/v/0.0.0/app/localization/fr-FR/user.json index 3689f62fb..6b17de69d 100644 --- a/snappymail/v/0.0.0/app/localization/fr-FR/user.json +++ b/snappymail/v/0.0.0/app/localization/fr-FR/user.json @@ -20,6 +20,7 @@ "NAME": "Nom", "NONE": "Aucun", "NOT_SPAM": "Acceptable", + "USERNAME": "Nom d'utilisateur", "PASSWORD": "Mot de passe", "REPLY_TO": "Répondre à", "SAVE": "Enregistrer", @@ -28,7 +29,9 @@ "SUBJECT": "Sujet", "TEST": "Test", "TO": "À", - "SERVER_MESSAGE": "Server message" + "SERVER_MESSAGE": "Server message", + "YES": "Oui", + "NO": "Non" }, "LOGIN": { "LABEL_LOGIN": "Identifiant", @@ -46,23 +49,24 @@ }, "SEARCH": { "TITLE_ADV": "Recherche avancée", - "LABEL_ADV_TEXT": "Texte", - "LABEL_ADV_HAS_ATTACHMENT": "Pièce jointe", - "LABEL_ADV_HAS_ATTACHMENTS": "Pièces jointes", - "LABEL_ADV_FLAGGED": "Signalé", - "LABEL_ADV_UNSEEN": "Non lu", - "LABEL_ADV_DATE": "Date", - "LABEL_ADV_DATE_ALL": "Tous", - "LABEL_ADV_DATE_3_DAYS": "Jusqu'à 3 jours", - "LABEL_ADV_DATE_7_DAYS": "Jusqu'à 1 semaine", - "LABEL_ADV_DATE_MONTH": "Jusqu'à 1 mois", - "LABEL_ADV_DATE_3_MONTHS": "Jusqu'à 3 mois", - "LABEL_ADV_DATE_6_MONTHS": "Jusqu'à 6 mois", - "LABEL_ADV_DATE_YEAR": "Jusqu'à 1 an", - "LABEL_ADV_SUBFOLDERS": "Subfolders", - "LABEL_ADV_SUBFOLDERS_NONE": "None", - "LABEL_ADV_SUBFOLDERS_SUBTREE": "All", - "LABEL_ADV_SUBFOLDERS_SUBTREE_ONE": "One level" + "LABEL_TEXT": "Texte", + "LABEL_HAS_ATTACHMENT": "Pièce jointe", + "LABEL_HAS_ATTACHMENTS": "Pièces jointes", + "LABEL_FLAGGED": "Signalé", + "LABEL_UNSEEN": "Non lu", + "LABEL_DATE": "Date", + "LABEL_DATE_ALL": "Tous", + "LABEL_DATE_3_DAYS": "Jusqu'à 3 jours", + "LABEL_DATE_7_DAYS": "Jusqu'à 1 semaine", + "LABEL_DATE_MONTH": "Jusqu'à 1 mois", + "LABEL_DATE_3_MONTHS": "Jusqu'à 3 mois", + "LABEL_DATE_6_MONTHS": "Jusqu'à 6 mois", + "LABEL_DATE_YEAR": "Jusqu'à 1 an", + "LABEL_SUBFOLDERS": "Subfolders", + "LABEL_SUBFOLDERS_NONE": "None", + "LABEL_SUBFOLDERS_SUBTREE": "All", + "LABEL_SUBFOLDERS_SUBTREE_ONE": "One level", + "LABEL_REPLIED": "Répondu" }, "PREVIEW_POPUP": { "FULLSCREEN": "Basculer en plein écran", @@ -104,7 +108,6 @@ "EMPTY_SEARCH_LIST": "Aucun message ne correspond à votre recherche.", "SEARCH_RESULT_FOR": "Résultats de recherche pour \"%SEARCH%\"", "BACK_TO_MESSAGE_LIST": "retour à la liste des messages", - "EMPTY_SUBJECT_TEXT": "(Pas d'objet)", "PUT_MESSAGE_HERE": "Glisser un message ici pour l'afficher dans la liste", "TODAY_AT": "aujourd'hui à %TIME%", "YESTERDAY_AT": "hier à %TIME%", @@ -224,8 +227,6 @@ "BUTTON_REQUEST_DSN": "Demander un accusé de réception" }, "POPUPS_ASK": { - "BUTTON_YES": "Oui", - "BUTTON_NO": "Non", "DESC_WANT_CLOSE_THIS_WINDOW": "Êtes-vous sûr de vouloir fermer cette fenêtre ?", "DESC_WANT_DELETE_MESSAGES": "Êtes-vous sûr de vouloir supprimer ce(s) message(s) ?" }, @@ -402,6 +403,7 @@ "LABEL_REMOVE_COLORS": "Supprimer les couleurs d'arrière-plan et de texte du message", "LABEL_MESSAGE_PER_PAGE": "Messages par page", "LABEL_MARK_MESSAGE_READ_AFTER": "Marquer le message comme lu après", + "LABEL_MSG_DEFAULT_ACTION": "Default action", "SECONDS": "secondes", "LABEL_NOTIFICATIONS": "Notifications", "LABEL_SOUND_NOTIFICATION": "Son de notification", @@ -415,8 +417,6 @@ "LABEL_CONTACTS_SYNC_SERVER": "Serveur", "LABEL_CONTACTS_SYNC_AB_URL": "URL du carnet d'adresses", "LABEL_CONTACTS_SYNC_USER": "Utilisateur", - "SYNC_NO": "Non", - "SYNC_YES": "Oui", "SYNC_READ": "Lecture seulement" }, "SETTINGS_THEMES": { diff --git a/snappymail/v/0.0.0/app/localization/hu-HU/admin.json b/snappymail/v/0.0.0/app/localization/hu-HU/admin.json index 596d9f08b..0a6161033 100644 --- a/snappymail/v/0.0.0/app/localization/hu-HU/admin.json +++ b/snappymail/v/0.0.0/app/localization/hu-HU/admin.json @@ -4,7 +4,10 @@ "CLOSE": "Bezár", "SAVE": "Mentés", "TEST": "Teszt", - "UPDATE": "Frissítés" + "UPDATE": "Frissítés", + "USERNAME": "Felhasználónév", + "PASSWORD": "Jelszó", + "CANCEL": "Mégse" }, "LOGIN": { "LABEL_LOGIN": "Belépés", @@ -84,10 +87,8 @@ "LABEL_SHOW_PHP_INFO": "PHP információ megjelenítése", "LEGEND_ADMIN_PANEL_ACCESS_CREDENTIALS": "Admin panel hozzáférés hitelesítés", "LABEL_CURRENT_PASSWORD": "Jelenlegi jelszó", - "LABEL_NEW_LOGIN": "Új felhasználó", "LABEL_NEW_PASSWORD": "Új jelszó", "LABEL_REPEAT_PASSWORD": "Újra", - "BUTTON_UPDATE_PASSWORD": "Jelszó frissítés", "LEGEND_SSL": "SSL", "LABEL_REQUIRE_VERIFICATION": "A használt (IMAP\/SMTP) tanúsítvány ellenőrzés megkövetelése", "LABEL_ALLOW_SELF_SIGNED": "Saját aláírt tanúsítványok engedélyezése" diff --git a/snappymail/v/0.0.0/app/localization/hu-HU/user.json b/snappymail/v/0.0.0/app/localization/hu-HU/user.json index 0cf4667b0..c6919a224 100644 --- a/snappymail/v/0.0.0/app/localization/hu-HU/user.json +++ b/snappymail/v/0.0.0/app/localization/hu-HU/user.json @@ -20,6 +20,7 @@ "NAME": "Beérkező levelek", "NONE": "Semmi", "NOT_SPAM": "Nem szemét", + "USERNAME": "Felhasználónév", "PASSWORD": "Jelszó", "REPLY_TO": "Válaszcím", "SAVE": "Mentés", @@ -28,7 +29,9 @@ "SUBJECT": "Tárgy", "TEST": "Tesztelés", "TO": "Címzett", - "SERVER_MESSAGE": "Server message" + "SERVER_MESSAGE": "Server message", + "YES": "Igen", + "NO": "Nem" }, "LOGIN": { "LABEL_LOGIN": "Bejelentkezés", @@ -46,23 +49,24 @@ }, "SEARCH": { "TITLE_ADV": "Részletes keresés", - "LABEL_ADV_TEXT": "Szöveg", - "LABEL_ADV_HAS_ATTACHMENT": "Van melléklete", - "LABEL_ADV_HAS_ATTACHMENTS": "Vannak mellékletei", - "LABEL_ADV_FLAGGED": "Megjelölve", - "LABEL_ADV_UNSEEN": "Észrevétlen", - "LABEL_ADV_DATE": "Dátum", - "LABEL_ADV_DATE_ALL": "Összes", - "LABEL_ADV_DATE_3_DAYS": "Legfeljebb 3 napos", - "LABEL_ADV_DATE_7_DAYS": "Legfeljebb 1 hetes", - "LABEL_ADV_DATE_MONTH": "Legfeljebb 1 hónapos", - "LABEL_ADV_DATE_3_MONTHS": "Legfeljebb 3 hónapos", - "LABEL_ADV_DATE_6_MONTHS": "Legfeljebb 6 hónapos", - "LABEL_ADV_DATE_YEAR": "Legfeljebb 1 éves", - "LABEL_ADV_SUBFOLDERS": "Subfolders", - "LABEL_ADV_SUBFOLDERS_NONE": "None", - "LABEL_ADV_SUBFOLDERS_SUBTREE": "All", - "LABEL_ADV_SUBFOLDERS_SUBTREE_ONE": "One level" + "LABEL_TEXT": "Szöveg", + "LABEL_HAS_ATTACHMENT": "Van melléklete", + "LABEL_HAS_ATTACHMENTS": "Vannak mellékletei", + "LABEL_FLAGGED": "Megjelölve", + "LABEL_UNSEEN": "Észrevétlen", + "LABEL_DATE": "Dátum", + "LABEL_DATE_ALL": "Összes", + "LABEL_DATE_3_DAYS": "Legfeljebb 3 napos", + "LABEL_DATE_7_DAYS": "Legfeljebb 1 hetes", + "LABEL_DATE_MONTH": "Legfeljebb 1 hónapos", + "LABEL_DATE_3_MONTHS": "Legfeljebb 3 hónapos", + "LABEL_DATE_6_MONTHS": "Legfeljebb 6 hónapos", + "LABEL_DATE_YEAR": "Legfeljebb 1 éves", + "LABEL_SUBFOLDERS": "Subfolders", + "LABEL_SUBFOLDERS_NONE": "None", + "LABEL_SUBFOLDERS_SUBTREE": "All", + "LABEL_SUBFOLDERS_SUBTREE_ONE": "One level", + "LABEL_REPLIED": "Válaszolt" }, "PREVIEW_POPUP": { "FULLSCREEN": "Teljes képernyő váltása", @@ -104,7 +108,6 @@ "EMPTY_SEARCH_LIST": "Nincs a keresésnek megfelelő levél.", "SEARCH_RESULT_FOR": "Keresési eredmények ehhez: \"%SEARCH%\"", "BACK_TO_MESSAGE_LIST": "vissza az üzenetlistához", - "EMPTY_SUBJECT_TEXT": "(Nincs tárgy)", "PUT_MESSAGE_HERE": "Húzz ide egy üzenetet, hogy megjelenjen a listában", "TODAY_AT": "ma ekkor: %TIME%", "YESTERDAY_AT": "tegnap ekkor: %TIME%", @@ -224,8 +227,6 @@ "BUTTON_REQUEST_DSN": "Továbbítási visszaigazolás kérés" }, "POPUPS_ASK": { - "BUTTON_YES": "Igen", - "BUTTON_NO": "Nem", "DESC_WANT_CLOSE_THIS_WINDOW": "Biztos, hogy be akarod zárni ezt az ablakot?", "DESC_WANT_DELETE_MESSAGES": "Biztos, hogy törölni akarod az üzenete(ke)t?" }, @@ -402,6 +403,7 @@ "LABEL_REMOVE_COLORS": "Remove background and text colors from message body", "LABEL_MESSAGE_PER_PAGE": "Üzenetek egy oldalon", "LABEL_MARK_MESSAGE_READ_AFTER": "Jelölje meg az üzenetet olvasottként", + "LABEL_MSG_DEFAULT_ACTION": "Default action", "SECONDS": "másodperc után", "LABEL_NOTIFICATIONS": "Értesítések", "LABEL_SOUND_NOTIFICATION": "Hangos értesítés", @@ -415,8 +417,6 @@ "LABEL_CONTACTS_SYNC_SERVER": "Szerver", "LABEL_CONTACTS_SYNC_AB_URL": "Címtár URL", "LABEL_CONTACTS_SYNC_USER": "Felhasználó", - "SYNC_NO": "Nem", - "SYNC_YES": "Igen", "SYNC_READ": "Read only" }, "SETTINGS_THEMES": { diff --git a/snappymail/v/0.0.0/app/localization/id-ID/admin.json b/snappymail/v/0.0.0/app/localization/id-ID/admin.json index 5b94512e6..b2d9f5ec4 100644 --- a/snappymail/v/0.0.0/app/localization/id-ID/admin.json +++ b/snappymail/v/0.0.0/app/localization/id-ID/admin.json @@ -4,7 +4,10 @@ "CLOSE": "Tutup", "SAVE": "Simpan", "TEST": "Ujicoba", - "UPDATE": "Pembaruan" + "UPDATE": "Pembaruan", + "USERNAME": "Nama belakang", + "PASSWORD": "Sandi", + "CANCEL": "Batal" }, "LOGIN": { "LABEL_LOGIN": "Login", @@ -84,10 +87,8 @@ "LABEL_SHOW_PHP_INFO": "Tampilkan informasi PHP", "LEGEND_ADMIN_PANEL_ACCESS_CREDENTIALS": "Hak Akses Panel Admin", "LABEL_CURRENT_PASSWORD": "Password saat ini", - "LABEL_NEW_LOGIN": "Login baru", "LABEL_NEW_PASSWORD": "Password baru", "LABEL_REPEAT_PASSWORD": "Ulangi", - "BUTTON_UPDATE_PASSWORD": "Perbarui Password", "LEGEND_SSL": "SSL", "LABEL_REQUIRE_VERIFICATION": "Diperlukan verifikasi sertifikat SSL dengan (IMAP\/SMTP) ", "LABEL_ALLOW_SELF_SIGNED": "Izinkan sertifikat yang dibuat sendiri" diff --git a/snappymail/v/0.0.0/app/localization/id-ID/user.json b/snappymail/v/0.0.0/app/localization/id-ID/user.json index 6aac09689..8e9536da4 100644 --- a/snappymail/v/0.0.0/app/localization/id-ID/user.json +++ b/snappymail/v/0.0.0/app/localization/id-ID/user.json @@ -20,6 +20,7 @@ "NAME": "Kotak Masuk", "NONE": "Tidak ada", "NOT_SPAM": "Bukan Spam", + "USERNAME": "Nama belakang", "PASSWORD": "Sandi", "REPLY_TO": "Balas-Ke", "SAVE": "Simpan", @@ -28,7 +29,9 @@ "SUBJECT": "Judul", "TEST": "Uji", "TO": "Kepada", - "SERVER_MESSAGE": "Server message" + "SERVER_MESSAGE": "Server message", + "YES": "Ya", + "NO": "Tidak" }, "LOGIN": { "LABEL_LOGIN": "Login", @@ -46,23 +49,24 @@ }, "SEARCH": { "TITLE_ADV": "Pencarian Rinci", - "LABEL_ADV_TEXT": "Teks", - "LABEL_ADV_HAS_ATTACHMENT": "Memiliki lampiran", - "LABEL_ADV_HAS_ATTACHMENTS": "Memiliki lampiran", - "LABEL_ADV_FLAGGED": "Ditandai", - "LABEL_ADV_UNSEEN": "Belum dilihat", - "LABEL_ADV_DATE": "Tanggal", - "LABEL_ADV_DATE_ALL": "Semua", - "LABEL_ADV_DATE_3_DAYS": "Sudah 3 hari lalu", - "LABEL_ADV_DATE_7_DAYS": "Sudah 1 bulan lalu", - "LABEL_ADV_DATE_MONTH": "Lebih dari 1 bulan lalu", - "LABEL_ADV_DATE_3_MONTHS": "Lebih dari 3 bulan lalu", - "LABEL_ADV_DATE_6_MONTHS": "Lebih dari 6 bulan lalu", - "LABEL_ADV_DATE_YEAR": "Lebih dari 1 tahun lalu", - "LABEL_ADV_SUBFOLDERS": "Subfolders", - "LABEL_ADV_SUBFOLDERS_NONE": "None", - "LABEL_ADV_SUBFOLDERS_SUBTREE": "All", - "LABEL_ADV_SUBFOLDERS_SUBTREE_ONE": "One level" + "LABEL_TEXT": "Teks", + "LABEL_HAS_ATTACHMENT": "Memiliki lampiran", + "LABEL_HAS_ATTACHMENTS": "Memiliki lampiran", + "LABEL_FLAGGED": "Ditandai", + "LABEL_UNSEEN": "Belum dilihat", + "LABEL_DATE": "Tanggal", + "LABEL_DATE_ALL": "Semua", + "LABEL_DATE_3_DAYS": "Sudah 3 hari lalu", + "LABEL_DATE_7_DAYS": "Sudah 1 bulan lalu", + "LABEL_DATE_MONTH": "Lebih dari 1 bulan lalu", + "LABEL_DATE_3_MONTHS": "Lebih dari 3 bulan lalu", + "LABEL_DATE_6_MONTHS": "Lebih dari 6 bulan lalu", + "LABEL_DATE_YEAR": "Lebih dari 1 tahun lalu", + "LABEL_SUBFOLDERS": "Subfolders", + "LABEL_SUBFOLDERS_NONE": "None", + "LABEL_SUBFOLDERS_SUBTREE": "All", + "LABEL_SUBFOLDERS_SUBTREE_ONE": "One level", + "LABEL_REPLIED": "Dijawab" }, "PREVIEW_POPUP": { "FULLSCREEN": "Beralih ke layar penuh", @@ -104,7 +108,6 @@ "EMPTY_SEARCH_LIST": "Tidak ada pesan yang sesuai dengan pencarian", "SEARCH_RESULT_FOR": "Hasil pencarian untuk \"%SEARCH%\"", "BACK_TO_MESSAGE_LIST": "Kembali ke daftar pesan", - "EMPTY_SUBJECT_TEXT": "(Tanpa Judul)", "PUT_MESSAGE_HERE": "Taruh pesan di sini untuk melihatnya dalam daftar", "TODAY_AT": "hari ini pada %TIME%", "YESTERDAY_AT": "Kemarin pada %TIME%", @@ -224,8 +227,6 @@ "BUTTON_REQUEST_DSN": "Minta pemberitahuan berhasil kirim" }, "POPUPS_ASK": { - "BUTTON_YES": "Ya", - "BUTTON_NO": "Tidak", "DESC_WANT_CLOSE_THIS_WINDOW": "Anda yakin untuk menutup jendela ini?", "DESC_WANT_DELETE_MESSAGES": "Anda yakin menghapus permanen pesan ini?" }, @@ -402,6 +403,7 @@ "LABEL_REMOVE_COLORS": "Remove background and text colors from message body", "LABEL_MESSAGE_PER_PAGE": "Pesan di halaman", "LABEL_MARK_MESSAGE_READ_AFTER": "Mark message as read after", + "LABEL_MSG_DEFAULT_ACTION": "Default action", "SECONDS": "seconds", "LABEL_NOTIFICATIONS": "Notifikasi", "LABEL_SOUND_NOTIFICATION": "Notifikasi suara", @@ -415,8 +417,6 @@ "LABEL_CONTACTS_SYNC_SERVER": "Server", "LABEL_CONTACTS_SYNC_AB_URL": "URL Buku alamat", "LABEL_CONTACTS_SYNC_USER": "User", - "SYNC_NO": "Tidak", - "SYNC_YES": "Ya", "SYNC_READ": "Read only" }, "SETTINGS_THEMES": { diff --git a/snappymail/v/0.0.0/app/localization/is-IS/user.json b/snappymail/v/0.0.0/app/localization/is-IS/user.json index c25e06d40..91966f042 100644 --- a/snappymail/v/0.0.0/app/localization/is-IS/user.json +++ b/snappymail/v/0.0.0/app/localization/is-IS/user.json @@ -20,6 +20,7 @@ "NAME": "Innhólf", "NONE": "Ekkert", "NOT_SPAM": "Ekki ruslpóstur", + "USERNAME": "Notendanafn", "PASSWORD": "Lykilorð", "REPLY_TO": "Svara-til", "SAVE": "Vista", @@ -28,7 +29,9 @@ "SUBJECT": "Viðfangsefni", "TEST": "Prófa", "TO": "Til", - "SERVER_MESSAGE": "Server message" + "SERVER_MESSAGE": "Server message", + "YES": "Já", + "NO": "Nei" }, "LOGIN": { "LABEL_LOGIN": "Innskráning", @@ -46,23 +49,24 @@ }, "SEARCH": { "TITLE_ADV": "Ítarleg leit", - "LABEL_ADV_TEXT": "Texti", - "LABEL_ADV_HAS_ATTACHMENT": "Er með viðhengi", - "LABEL_ADV_HAS_ATTACHMENTS": "Er með viðhengi", - "LABEL_ADV_FLAGGED": "Flaggað", - "LABEL_ADV_UNSEEN": "Ólesið", - "LABEL_ADV_DATE": "Dagsetning", - "LABEL_ADV_DATE_ALL": "Allt", - "LABEL_ADV_DATE_3_DAYS": "Allt að 3 daga gömlu", - "LABEL_ADV_DATE_7_DAYS": "Allt að viku gömlu", - "LABEL_ADV_DATE_MONTH": "Allt að mánaðar gömlu", - "LABEL_ADV_DATE_3_MONTHS": "Allt að 3 mánaða gömlu", - "LABEL_ADV_DATE_6_MONTHS": "Allt að 6 mánaða gömlu", - "LABEL_ADV_DATE_YEAR": "Allt að 1 árs gömlu", - "LABEL_ADV_SUBFOLDERS": "Subfolders", - "LABEL_ADV_SUBFOLDERS_NONE": "None", - "LABEL_ADV_SUBFOLDERS_SUBTREE": "All", - "LABEL_ADV_SUBFOLDERS_SUBTREE_ONE": "One level" + "LABEL_TEXT": "Texti", + "LABEL_HAS_ATTACHMENT": "Er með viðhengi", + "LABEL_HAS_ATTACHMENTS": "Er með viðhengi", + "LABEL_FLAGGED": "Flaggað", + "LABEL_UNSEEN": "Ólesið", + "LABEL_DATE": "Dagsetning", + "LABEL_DATE_ALL": "Allt", + "LABEL_DATE_3_DAYS": "Allt að 3 daga gömlu", + "LABEL_DATE_7_DAYS": "Allt að viku gömlu", + "LABEL_DATE_MONTH": "Allt að mánaðar gömlu", + "LABEL_DATE_3_MONTHS": "Allt að 3 mánaða gömlu", + "LABEL_DATE_6_MONTHS": "Allt að 6 mánaða gömlu", + "LABEL_DATE_YEAR": "Allt að 1 árs gömlu", + "LABEL_SUBFOLDERS": "Subfolders", + "LABEL_SUBFOLDERS_NONE": "None", + "LABEL_SUBFOLDERS_SUBTREE": "All", + "LABEL_SUBFOLDERS_SUBTREE_ONE": "One level", + "LABEL_REPLIED": "Svarað" }, "PREVIEW_POPUP": { "FULLSCREEN": "Víxla heilskjá af\/á", @@ -104,7 +108,6 @@ "EMPTY_SEARCH_LIST": "Engin skilaboð stemmdu við leitina þína.", "SEARCH_RESULT_FOR": "Leitarniðurstöður fyrir \"%SEARCH%\"", "BACK_TO_MESSAGE_LIST": "til baka í skilaboðalista", - "EMPTY_SUBJECT_TEXT": "(Ekkert viðfangsefni)", "PUT_MESSAGE_HERE": "Slepptu skilaboðum hér til að skoða það í listanum", "TODAY_AT": "í dag kl. %TIME%", "YESTERDAY_AT": "í gær kl. %TIME%", @@ -224,8 +227,6 @@ "BUTTON_REQUEST_DSN": "Biðja um staðfestingu á afhendingu" }, "POPUPS_ASK": { - "BUTTON_YES": "Já", - "BUTTON_NO": "Nei", "DESC_WANT_CLOSE_THIS_WINDOW": "Ertu viss um að þú viljir loka þessum glugga?", "DESC_WANT_DELETE_MESSAGES": "Ertu viss um að þú viljir eyða skeytunum?" }, @@ -402,6 +403,7 @@ "LABEL_REMOVE_COLORS": "Remove background and text colors from message body", "LABEL_MESSAGE_PER_PAGE": "Skilaboð á síðu", "LABEL_MARK_MESSAGE_READ_AFTER": "Mark message as read after", + "LABEL_MSG_DEFAULT_ACTION": "Default action", "SECONDS": "seconds", "LABEL_NOTIFICATIONS": "Tilkynningar", "LABEL_SOUND_NOTIFICATION": "Tilkynningarhljóð", @@ -415,8 +417,6 @@ "LABEL_CONTACTS_SYNC_SERVER": "Þjónn", "LABEL_CONTACTS_SYNC_AB_URL": "Slóð á nafnaskrá", "LABEL_CONTACTS_SYNC_USER": "Notandi", - "SYNC_NO": "Nei", - "SYNC_YES": "Já", "SYNC_READ": "Read only" }, "SETTINGS_THEMES": { diff --git a/snappymail/v/0.0.0/app/localization/it-IT/admin.json b/snappymail/v/0.0.0/app/localization/it-IT/admin.json index d979858ef..32269b8e3 100644 --- a/snappymail/v/0.0.0/app/localization/it-IT/admin.json +++ b/snappymail/v/0.0.0/app/localization/it-IT/admin.json @@ -4,7 +4,10 @@ "CLOSE": "Close", "SAVE": "Save", "TEST": "Test", - "UPDATE": "Aggiorna" + "UPDATE": "Aggiorna", + "USERNAME": "Nome utente", + "PASSWORD": "Parola d'ordine", + "CANCEL": "Annulla" }, "LOGIN": { "LABEL_LOGIN": "Login", @@ -84,10 +87,8 @@ "LABEL_SHOW_PHP_INFO": "Show PHP information", "LEGEND_ADMIN_PANEL_ACCESS_CREDENTIALS": "Admin Panel Access Credentials", "LABEL_CURRENT_PASSWORD": "Current password", - "LABEL_NEW_LOGIN": "New login", "LABEL_NEW_PASSWORD": "New password", "LABEL_REPEAT_PASSWORD": "Repeat", - "BUTTON_UPDATE_PASSWORD": "Update Password", "LEGEND_SSL": "SSL", "LABEL_REQUIRE_VERIFICATION": "Require verification of SSL certificate used (IMAP\/SMTP)", "LABEL_ALLOW_SELF_SIGNED": "Allow self signed certificates" diff --git a/snappymail/v/0.0.0/app/localization/it-IT/user.json b/snappymail/v/0.0.0/app/localization/it-IT/user.json index 3fbe0127a..d40b17e22 100644 --- a/snappymail/v/0.0.0/app/localization/it-IT/user.json +++ b/snappymail/v/0.0.0/app/localization/it-IT/user.json @@ -20,7 +20,8 @@ "NAME": "Nome", "NONE": "Nessuno", "NOT_SPAM": "Segnala come non spam", - "PASSWORD": "Password", + "USERNAME": "Nome utente", + "PASSWORD": "Parola d'ordine", "REPLY_TO": "Rispondi a", "SAVE": "Salva", "SEARCH": "Cerca", @@ -28,7 +29,9 @@ "SUBJECT": "Oggetto", "TEST": "Esegui test", "TO": "A", - "SERVER_MESSAGE": "Server message" + "SERVER_MESSAGE": "Server message", + "YES": "Sì", + "NO": "No" }, "LOGIN": { "LABEL_LOGIN": "Login", @@ -46,23 +49,24 @@ }, "SEARCH": { "TITLE_ADV": "Ricerca avanzata", - "LABEL_ADV_TEXT": "Messaggio", - "LABEL_ADV_HAS_ATTACHMENT": "Ha un allegato", - "LABEL_ADV_HAS_ATTACHMENTS": "Ha più allegati", - "LABEL_ADV_FLAGGED": "Preferiti", - "LABEL_ADV_UNSEEN": "Non letti", - "LABEL_ADV_DATE": "Data", - "LABEL_ADV_DATE_ALL": "Tutte", - "LABEL_ADV_DATE_3_DAYS": "Meno di 3 giorni fa", - "LABEL_ADV_DATE_7_DAYS": "Meno di una settimana fa", - "LABEL_ADV_DATE_MONTH": "Meno di un mese fa", - "LABEL_ADV_DATE_3_MONTHS": "Meno di 3 mesi fa", - "LABEL_ADV_DATE_6_MONTHS": "Meno di 6 mesi fa", - "LABEL_ADV_DATE_YEAR": "Meno di un anno fa", - "LABEL_ADV_SUBFOLDERS": "Sottocartelle", - "LABEL_ADV_SUBFOLDERS_NONE": "Nessuna", - "LABEL_ADV_SUBFOLDERS_SUBTREE": "Tutte", - "LABEL_ADV_SUBFOLDERS_SUBTREE_ONE": "Primo livello" + "LABEL_TEXT": "Messaggio", + "LABEL_HAS_ATTACHMENT": "Ha un allegato", + "LABEL_HAS_ATTACHMENTS": "Ha più allegati", + "LABEL_FLAGGED": "Preferiti", + "LABEL_UNSEEN": "Non letti", + "LABEL_DATE": "Data", + "LABEL_DATE_ALL": "Tutte", + "LABEL_DATE_3_DAYS": "Meno di 3 giorni fa", + "LABEL_DATE_7_DAYS": "Meno di una settimana fa", + "LABEL_DATE_MONTH": "Meno di un mese fa", + "LABEL_DATE_3_MONTHS": "Meno di 3 mesi fa", + "LABEL_DATE_6_MONTHS": "Meno di 6 mesi fa", + "LABEL_DATE_YEAR": "Meno di un anno fa", + "LABEL_SUBFOLDERS": "Sottocartelle", + "LABEL_SUBFOLDERS_NONE": "Nessuna", + "LABEL_SUBFOLDERS_SUBTREE": "Tutte", + "LABEL_SUBFOLDERS_SUBTREE_ONE": "Primo livello", + "LABEL_REPLIED": "Risposto" }, "PREVIEW_POPUP": { "FULLSCREEN": "Passa a schermo intero", @@ -104,7 +108,6 @@ "EMPTY_SEARCH_LIST": "Nessun messaggio corrisponde alla tua ricerca", "SEARCH_RESULT_FOR": "Risultati di ricerca per \"%SEARCH%\"", "BACK_TO_MESSAGE_LIST": "ritorna alla lista dei messaggi", - "EMPTY_SUBJECT_TEXT": "(Nessun oggetto)", "PUT_MESSAGE_HERE": "Trascina il messaggio qui per vederlo nella lista", "TODAY_AT": "oggi alle %TIME%", "YESTERDAY_AT": "ieri alle %TIME%", @@ -224,8 +227,6 @@ "BUTTON_REQUEST_DSN": "Richiedi conferma del ricevimento" }, "POPUPS_ASK": { - "BUTTON_YES": "Sì", - "BUTTON_NO": "No", "DESC_WANT_CLOSE_THIS_WINDOW": "Sei sicuro di voler chiudere questa finestra?", "DESC_WANT_DELETE_MESSAGES": "Sei sicuro di voler eliminare il messaggio?" }, @@ -402,6 +403,7 @@ "LABEL_REMOVE_COLORS": "Rimuovi lo sfondo e i colori del testo dal messaggio", "LABEL_MESSAGE_PER_PAGE": "Messaggi per pagina", "LABEL_MARK_MESSAGE_READ_AFTER": "Contrassegna il messaggio come letto dopo", + "LABEL_MSG_DEFAULT_ACTION": "Default action", "SECONDS": "seconds", "LABEL_NOTIFICATIONS": "Notifiche", "LABEL_SOUND_NOTIFICATION": "Notifica sonora", @@ -415,8 +417,6 @@ "LABEL_CONTACTS_SYNC_SERVER": "Server", "LABEL_CONTACTS_SYNC_AB_URL": "Indirizzo della rubrica", "LABEL_CONTACTS_SYNC_USER": "Utente", - "SYNC_NO": "No", - "SYNC_YES": "Sì", "SYNC_READ": "Read only" }, "SETTINGS_THEMES": { diff --git a/snappymail/v/0.0.0/app/localization/ja-JP/admin.json b/snappymail/v/0.0.0/app/localization/ja-JP/admin.json index 5d8d5d26c..f217e8ce5 100644 --- a/snappymail/v/0.0.0/app/localization/ja-JP/admin.json +++ b/snappymail/v/0.0.0/app/localization/ja-JP/admin.json @@ -4,7 +4,10 @@ "CLOSE": "閉じる", "SAVE": "保存", "TEST": "テスト", - "UPDATE": "更新" + "UPDATE": "更新", + "USERNAME": "ユーザー名", + "PASSWORD": "パスワード", + "CANCEL": "キャンセル" }, "LOGIN": { "LABEL_LOGIN": "ログイン", @@ -84,10 +87,8 @@ "LABEL_SHOW_PHP_INFO": "PHP情報を表示", "LEGEND_ADMIN_PANEL_ACCESS_CREDENTIALS": "管理画面アクセス情報", "LABEL_CURRENT_PASSWORD": "現在のパスワード", - "LABEL_NEW_LOGIN": "新しいログイン名", "LABEL_NEW_PASSWORD": "新しいパスワード", "LABEL_REPEAT_PASSWORD": "再入力", - "BUTTON_UPDATE_PASSWORD": "パスワード更新", "LEGEND_SSL": "SSL", "LABEL_REQUIRE_VERIFICATION": "(IMAP\/SMTP)のSSL証明書の検証を有効にする", "LABEL_ALLOW_SELF_SIGNED": "自己署名証明書を使う" @@ -166,9 +167,9 @@ "UNKNOWN_ERROR": "不明なエラー" }, "NOTIFICATIONS": { - "REQUEST_ERROR": "Request failed", - "REQUEST_ABORTED": "Request is aborted", - "REQUEST_TIMEOUT": "Request timed out", + "REQUEST_ERROR": "要求は失敗しました", + "REQUEST_ABORTED": "要求は中断されました", + "REQUEST_TIMEOUT": "要求はタイムアウトしました", "INVALID_TOKEN": "無効なトークン", "AUTH_ERROR": "認証に失敗しました", "DOMAIN_ALREADY_EXISTS": "ドメインが既に存在しています", diff --git a/snappymail/v/0.0.0/app/localization/ja-JP/user.json b/snappymail/v/0.0.0/app/localization/ja-JP/user.json index 02f8f8ac8..d2718dc15 100644 --- a/snappymail/v/0.0.0/app/localization/ja-JP/user.json +++ b/snappymail/v/0.0.0/app/localization/ja-JP/user.json @@ -20,6 +20,7 @@ "NAME": "受信トレイ", "NONE": "なし", "NOT_SPAM": "迷惑メールを解除", + "USERNAME": "ユーザー名", "PASSWORD": "パスワード", "REPLY_TO": "Reply-To", "SAVE": "保存", @@ -28,7 +29,9 @@ "SUBJECT": "件名", "TEST": "テスト", "TO": "宛先", - "SERVER_MESSAGE": "Server message" + "SERVER_MESSAGE": "Server message", + "YES": "はい", + "NO": "いいえ" }, "LOGIN": { "LABEL_LOGIN": "ログイン", @@ -46,23 +49,24 @@ }, "SEARCH": { "TITLE_ADV": "高度な検索", - "LABEL_ADV_TEXT": "キーワード", - "LABEL_ADV_HAS_ATTACHMENT": "添付ファイルあり", - "LABEL_ADV_HAS_ATTACHMENTS": "添付ファイルあり", - "LABEL_ADV_FLAGGED": "スター付き", - "LABEL_ADV_UNSEEN": "未読メール", - "LABEL_ADV_DATE": "日付", - "LABEL_ADV_DATE_ALL": "全て", - "LABEL_ADV_DATE_3_DAYS": "3日前まで", - "LABEL_ADV_DATE_7_DAYS": "1週間前まで", - "LABEL_ADV_DATE_MONTH": "1ヶ月前まで", - "LABEL_ADV_DATE_3_MONTHS": "3ヶ月前まで", - "LABEL_ADV_DATE_6_MONTHS": "6ヶ月前まで", - "LABEL_ADV_DATE_YEAR": "1年前まで", - "LABEL_ADV_SUBFOLDERS": "サブフォルダ", - "LABEL_ADV_SUBFOLDERS_NONE": "なし", - "LABEL_ADV_SUBFOLDERS_SUBTREE": "全て", - "LABEL_ADV_SUBFOLDERS_SUBTREE_ONE": "一段のみ" + "LABEL_TEXT": "キーワード", + "LABEL_HAS_ATTACHMENT": "添付ファイルあり", + "LABEL_HAS_ATTACHMENTS": "添付ファイルあり", + "LABEL_FLAGGED": "スター付き", + "LABEL_UNSEEN": "未読メール", + "LABEL_DATE": "日付", + "LABEL_DATE_ALL": "全て", + "LABEL_DATE_3_DAYS": "3日前まで", + "LABEL_DATE_7_DAYS": "1週間前まで", + "LABEL_DATE_MONTH": "1ヶ月前まで", + "LABEL_DATE_3_MONTHS": "3ヶ月前まで", + "LABEL_DATE_6_MONTHS": "6ヶ月前まで", + "LABEL_DATE_YEAR": "1年前まで", + "LABEL_SUBFOLDERS": "サブフォルダ", + "LABEL_SUBFOLDERS_NONE": "なし", + "LABEL_SUBFOLDERS_SUBTREE": "全て", + "LABEL_SUBFOLDERS_SUBTREE_ONE": "一段のみ", + "LABEL_REPLIED": "回答済み" }, "PREVIEW_POPUP": { "FULLSCREEN": "フルスクリーン", @@ -104,7 +108,6 @@ "EMPTY_SEARCH_LIST": "検索条件に一致するメールは見つかりませんでした。高度な検索を試してみてください。", "SEARCH_RESULT_FOR": "\"%SEARCH%\"の検索結果", "BACK_TO_MESSAGE_LIST": "メッセージ一覧に戻る", - "EMPTY_SUBJECT_TEXT": "(件名なし)", "PUT_MESSAGE_HERE": "ここにメッセージをドロップ", "TODAY_AT": "今日 %TIME%", "YESTERDAY_AT": "昨日 %TIME%", @@ -213,7 +216,7 @@ "ATTACH_FILES": "ファイルを添付", "ATTACH_DROP_FILES_DESC": "ここにファイルをドロップ", "REPLY_MESSAGE_TITLE": "%DATETIME%, %EMAIL% wrote", - "FORWARD_MESSAGE_TOP_TITLE": "-------- Forwarded message -------", + "FORWARD_MESSAGE_TOP_TITLE": "-------- 転送されたメッセージ -------", "FORWARD_MESSAGE_TOP_SENT": "送信済み", "EMPTY_TO_ERROR_DESC": "少なくとも一つの受信者を指定してください", "NO_ATTACHMENTS_HERE_DESC": "添付ファイルがありません", @@ -224,8 +227,6 @@ "BUTTON_REQUEST_DSN": "配信確認を要求する" }, "POPUPS_ASK": { - "BUTTON_YES": "はい", - "BUTTON_NO": "いいえ", "DESC_WANT_CLOSE_THIS_WINDOW": "このウインドウを閉じていいですか?", "DESC_WANT_DELETE_MESSAGES": "メッセージを削除していいですか?" }, @@ -402,6 +403,7 @@ "LABEL_REMOVE_COLORS": "本文の文字色及び背景色の設定を無視する", "LABEL_MESSAGE_PER_PAGE": "1ページに表示する件数", "LABEL_MARK_MESSAGE_READ_AFTER": "メッセージが既読となるまでの秒数", + "LABEL_MSG_DEFAULT_ACTION": "Default action", "SECONDS": "秒", "LABEL_NOTIFICATIONS": "通知設定", "LABEL_SOUND_NOTIFICATION": "サウンド通知", @@ -415,8 +417,6 @@ "LABEL_CONTACTS_SYNC_SERVER": "サーバー", "LABEL_CONTACTS_SYNC_AB_URL": "アドレス帳URL", "LABEL_CONTACTS_SYNC_USER": "ユーザー", - "SYNC_NO": "いいえ", - "SYNC_YES": "はい", "SYNC_READ": "読み取り専用" }, "SETTINGS_THEMES": { @@ -512,9 +512,9 @@ "LABEL_CLOSE_COMPOSE": "作成画面を閉じる" }, "NOTIFICATIONS": { - "REQUEST_ERROR": "Request failed", - "REQUEST_ABORTED": "Request is aborted", - "REQUEST_TIMEOUT": "Request timed out", + "REQUEST_ERROR": "要求は失敗しました", + "REQUEST_ABORTED": "要求は中断されました", + "REQUEST_TIMEOUT": "要求はタイムアウトしました", "INVALID_TOKEN": "無効なトークン", "AUTH_ERROR": "認証に失敗しました", "CONNECTION_ERROR": "サーバーへ接続できません", diff --git a/snappymail/v/0.0.0/app/localization/ko-KR/user.json b/snappymail/v/0.0.0/app/localization/ko-KR/user.json index e959bd4fd..a3e262367 100644 --- a/snappymail/v/0.0.0/app/localization/ko-KR/user.json +++ b/snappymail/v/0.0.0/app/localization/ko-KR/user.json @@ -20,6 +20,7 @@ "NAME": "받은 편지함", "NONE": "없음", "NOT_SPAM": "스팸 아님", + "USERNAME": "사용자 이름", "PASSWORD": "비밀번호", "REPLY_TO": "회신 주소", "SAVE": "저장", @@ -28,7 +29,9 @@ "SUBJECT": "제목", "TEST": "테스트", "TO": "받는 사람", - "SERVER_MESSAGE": "Server message" + "SERVER_MESSAGE": "Server message", + "YES": "예", + "NO": "아니요" }, "LOGIN": { "LABEL_LOGIN": "아이디", @@ -46,23 +49,24 @@ }, "SEARCH": { "TITLE_ADV": "고급 검색", - "LABEL_ADV_TEXT": "본문", - "LABEL_ADV_HAS_ATTACHMENT": "첨부파일이 있음", - "LABEL_ADV_HAS_ATTACHMENTS": "첨부파일이 있음", - "LABEL_ADV_FLAGGED": "중요", - "LABEL_ADV_UNSEEN": "읽지 않음", - "LABEL_ADV_DATE": "날짜", - "LABEL_ADV_DATE_ALL": "모두", - "LABEL_ADV_DATE_3_DAYS": "3일 이내", - "LABEL_ADV_DATE_7_DAYS": "1주일 이내", - "LABEL_ADV_DATE_MONTH": "1개월 이내", - "LABEL_ADV_DATE_3_MONTHS": "3개월 이내", - "LABEL_ADV_DATE_6_MONTHS": "6개월 이내", - "LABEL_ADV_DATE_YEAR": "1년 이내", - "LABEL_ADV_SUBFOLDERS": "Subfolders", - "LABEL_ADV_SUBFOLDERS_NONE": "None", - "LABEL_ADV_SUBFOLDERS_SUBTREE": "All", - "LABEL_ADV_SUBFOLDERS_SUBTREE_ONE": "One level" + "LABEL_TEXT": "본문", + "LABEL_HAS_ATTACHMENT": "첨부파일이 있음", + "LABEL_HAS_ATTACHMENTS": "첨부파일이 있음", + "LABEL_FLAGGED": "중요", + "LABEL_UNSEEN": "읽지 않음", + "LABEL_DATE": "날짜", + "LABEL_DATE_ALL": "모두", + "LABEL_DATE_3_DAYS": "3일 이내", + "LABEL_DATE_7_DAYS": "1주일 이내", + "LABEL_DATE_MONTH": "1개월 이내", + "LABEL_DATE_3_MONTHS": "3개월 이내", + "LABEL_DATE_6_MONTHS": "6개월 이내", + "LABEL_DATE_YEAR": "1년 이내", + "LABEL_SUBFOLDERS": "Subfolders", + "LABEL_SUBFOLDERS_NONE": "None", + "LABEL_SUBFOLDERS_SUBTREE": "All", + "LABEL_SUBFOLDERS_SUBTREE_ONE": "One level", + "LABEL_REPLIED": "Odgovoreno" }, "PREVIEW_POPUP": { "FULLSCREEN": "전체화면으로 보기", @@ -104,7 +108,6 @@ "EMPTY_SEARCH_LIST": "검색 조건에 맞는 결과가 없습니다..", "SEARCH_RESULT_FOR": "\"%SEARCH%\"에 대한 검색 결과", "BACK_TO_MESSAGE_LIST": "메시지 목록으로 돌아가기", - "EMPTY_SUBJECT_TEXT": "(제목 없음)", "PUT_MESSAGE_HERE": "목록에 표시할 메시지를 여기로 끌어다 놓으세요.", "TODAY_AT": "오늘 %TIME%", "YESTERDAY_AT": "어제 %TIME%", @@ -224,8 +227,6 @@ "BUTTON_REQUEST_DSN": "수신 확인 요청" }, "POPUPS_ASK": { - "BUTTON_YES": "예", - "BUTTON_NO": "아니요", "DESC_WANT_CLOSE_THIS_WINDOW": "정말로 이 페이지를 닫으시겠습니까 ?", "DESC_WANT_DELETE_MESSAGES": "정말로 선택한 메세지를 삭제하시겠습니까 ?" }, @@ -402,6 +403,7 @@ "LABEL_REMOVE_COLORS": "Remove background and text colors from message body", "LABEL_MESSAGE_PER_PAGE": "페이지 당 메시지 개수", "LABEL_MARK_MESSAGE_READ_AFTER": "Mark message as read after", + "LABEL_MSG_DEFAULT_ACTION": "Default action", "SECONDS": "seconds", "LABEL_NOTIFICATIONS": "알림", "LABEL_SOUND_NOTIFICATION": "소리 알림", @@ -415,8 +417,6 @@ "LABEL_CONTACTS_SYNC_SERVER": "서버", "LABEL_CONTACTS_SYNC_AB_URL": "주소록 URL", "LABEL_CONTACTS_SYNC_USER": "사용자", - "SYNC_NO": "아니요", - "SYNC_YES": "예", "SYNC_READ": "Read only" }, "SETTINGS_THEMES": { diff --git a/snappymail/v/0.0.0/app/localization/langs.json b/snappymail/v/0.0.0/app/localization/langs.json index 8161268df..41f10ccff 100644 --- a/snappymail/v/0.0.0/app/localization/langs.json +++ b/snappymail/v/0.0.0/app/localization/langs.json @@ -10,6 +10,7 @@ "en-CA": "English (Canada)", "en-GB": "English (Great Britain)", "en-US": "English (United States)", + "eo": "Esperanto", "es-ES": "Español (España)", "es-LA": "Español (América Latina)", "et-EE": "Eesti", @@ -54,6 +55,7 @@ "en-CA": "English (Canada)", "en-GB": "English (Great Britain)", "en-US": "English (United States)", + "eo": "Esperanto", "es-ES": "Spanish (Spain)", "es-LA": "Spanish (Latin America)", "et-EE": "Estonian", diff --git a/snappymail/v/0.0.0/app/localization/lt-LT/admin.json b/snappymail/v/0.0.0/app/localization/lt-LT/admin.json index b9f3cb8b8..e8a9cd2c2 100644 --- a/snappymail/v/0.0.0/app/localization/lt-LT/admin.json +++ b/snappymail/v/0.0.0/app/localization/lt-LT/admin.json @@ -4,7 +4,10 @@ "CLOSE": "Uždaryti", "SAVE": "Saugoti", "TEST": "Bandymas", - "UPDATE": "Atnaujinti" + "UPDATE": "Atnaujinti", + "USERNAME": "Vartotojo vardas", + "PASSWORD": "Slaptažodis", + "CANCEL": "Atšaukti" }, "LOGIN": { "LABEL_LOGIN": "Prisijungimo vardas", @@ -84,10 +87,8 @@ "LABEL_SHOW_PHP_INFO": "Rodyti PHP informaciją", "LEGEND_ADMIN_PANEL_ACCESS_CREDENTIALS": "Valdymo skydo prieigos rekvizitai", "LABEL_CURRENT_PASSWORD": "Dabartinis slaptažodis", - "LABEL_NEW_LOGIN": "Naujas prisijungimo vardas", "LABEL_NEW_PASSWORD": "Naujas slaptažodis", "LABEL_REPEAT_PASSWORD": "Pakartokite", - "BUTTON_UPDATE_PASSWORD": "Atnaujinti slaptažodį", "LEGEND_SSL": "SSL", "LABEL_REQUIRE_VERIFICATION": "Reikalauti SSL sertifikato (IMAP\/SMTP)", "LABEL_ALLOW_SELF_SIGNED": "Leisti pačių sukurtus sertifikatus" diff --git a/snappymail/v/0.0.0/app/localization/lt-LT/user.json b/snappymail/v/0.0.0/app/localization/lt-LT/user.json index 845791793..54655381e 100644 --- a/snappymail/v/0.0.0/app/localization/lt-LT/user.json +++ b/snappymail/v/0.0.0/app/localization/lt-LT/user.json @@ -20,6 +20,7 @@ "NAME": "Gautieji", "NONE": "Nieko", "NOT_SPAM": "Ne šlamštas", + "USERNAME": "Vartotojo vardas", "PASSWORD": "Slaptažodis", "REPLY_TO": "Kam atsakyti", "SAVE": "Išsaugoti", @@ -28,7 +29,9 @@ "SUBJECT": "Tema", "TEST": "Bandyti", "TO": "Kam", - "SERVER_MESSAGE": "Server message" + "SERVER_MESSAGE": "Server message", + "YES": "Taip", + "NO": "Ne" }, "LOGIN": { "LABEL_LOGIN": "Prisijungimo vardas", @@ -46,23 +49,24 @@ }, "SEARCH": { "TITLE_ADV": "Detali paieška", - "LABEL_ADV_TEXT": "Laiško Tekstas", - "LABEL_ADV_HAS_ATTACHMENT": "Turi priedą", - "LABEL_ADV_HAS_ATTACHMENTS": "Turi priedą", - "LABEL_ADV_FLAGGED": "Pažymėtas", - "LABEL_ADV_UNSEEN": "Neskaitytas", - "LABEL_ADV_DATE": "Data", - "LABEL_ADV_DATE_ALL": "Visi", - "LABEL_ADV_DATE_3_DAYS": "Nesenesni kaip 3 dienų", - "LABEL_ADV_DATE_7_DAYS": "Nesenesni kaip 1 savaitės", - "LABEL_ADV_DATE_MONTH": "Nesenesni kaip 1 mėnesio", - "LABEL_ADV_DATE_3_MONTHS": "Nesenesni kaip 3 mėnesių", - "LABEL_ADV_DATE_6_MONTHS": "Nesenesni kaip 6 mėnesių", - "LABEL_ADV_DATE_YEAR": "Nesenesni kaip 1 metų", - "LABEL_ADV_SUBFOLDERS": "Subfolders", - "LABEL_ADV_SUBFOLDERS_NONE": "None", - "LABEL_ADV_SUBFOLDERS_SUBTREE": "All", - "LABEL_ADV_SUBFOLDERS_SUBTREE_ONE": "One level" + "LABEL_TEXT": "Laiško Tekstas", + "LABEL_HAS_ATTACHMENT": "Turi priedą", + "LABEL_HAS_ATTACHMENTS": "Turi priedą", + "LABEL_FLAGGED": "Pažymėtas", + "LABEL_UNSEEN": "Neskaitytas", + "LABEL_DATE": "Data", + "LABEL_DATE_ALL": "Visi", + "LABEL_DATE_3_DAYS": "Nesenesni kaip 3 dienų", + "LABEL_DATE_7_DAYS": "Nesenesni kaip 1 savaitės", + "LABEL_DATE_MONTH": "Nesenesni kaip 1 mėnesio", + "LABEL_DATE_3_MONTHS": "Nesenesni kaip 3 mėnesių", + "LABEL_DATE_6_MONTHS": "Nesenesni kaip 6 mėnesių", + "LABEL_DATE_YEAR": "Nesenesni kaip 1 metų", + "LABEL_SUBFOLDERS": "Subfolders", + "LABEL_SUBFOLDERS_NONE": "None", + "LABEL_SUBFOLDERS_SUBTREE": "All", + "LABEL_SUBFOLDERS_SUBTREE_ONE": "One level", + "LABEL_REPLIED": "Atsakyta" }, "PREVIEW_POPUP": { "FULLSCREEN": "Perjungti viso ekrano režimą", @@ -104,7 +108,6 @@ "EMPTY_SEARCH_LIST": "Nėra pranešimų, atitinkančių jūsų paiešką.", "SEARCH_RESULT_FOR": "Ieškoti \"%SEARCH%\" rezultatuose", "BACK_TO_MESSAGE_LIST": "grįžti į sąrašą", - "EMPTY_SUBJECT_TEXT": "(Be temos)", "PUT_MESSAGE_HERE": "Įkelkite žinutę čia, kad matytumėte ją sąraše", "TODAY_AT": "šiandien %TIME%", "YESTERDAY_AT": "vakar %TIME%", @@ -224,8 +227,6 @@ "BUTTON_REQUEST_DSN": "Prašyti laiško gavimo pažymos" }, "POPUPS_ASK": { - "BUTTON_YES": "Taip", - "BUTTON_NO": "Ne", "DESC_WANT_CLOSE_THIS_WINDOW": "Ar tikrai norite uždaryti šį langą??", "DESC_WANT_DELETE_MESSAGES": "Ar tikrai norite ištrinti pranešimą(us)?" }, @@ -402,6 +403,7 @@ "LABEL_REMOVE_COLORS": "Remove background and text colors from message body", "LABEL_MESSAGE_PER_PAGE": "Žinučių lape", "LABEL_MARK_MESSAGE_READ_AFTER": "Mark message as read after", + "LABEL_MSG_DEFAULT_ACTION": "Default action", "SECONDS": "seconds", "LABEL_NOTIFICATIONS": "Pranešimai", "LABEL_SOUND_NOTIFICATION": "Garsinis pranešimas", @@ -415,8 +417,6 @@ "LABEL_CONTACTS_SYNC_SERVER": "Serveris", "LABEL_CONTACTS_SYNC_AB_URL": "Adresų knygos URL adresas", "LABEL_CONTACTS_SYNC_USER": "Vartotojas", - "SYNC_NO": "Ne", - "SYNC_YES": "Taip", "SYNC_READ": "Read only" }, "SETTINGS_THEMES": { diff --git a/snappymail/v/0.0.0/app/localization/lv-LV/user.json b/snappymail/v/0.0.0/app/localization/lv-LV/user.json index 7857e5ba4..28a6b4ebf 100644 --- a/snappymail/v/0.0.0/app/localization/lv-LV/user.json +++ b/snappymail/v/0.0.0/app/localization/lv-LV/user.json @@ -20,6 +20,7 @@ "NAME": "Iesūtne", "NONE": "None", "NOT_SPAM": "Not Spam", + "USERNAME": "Lietotājvārds", "PASSWORD": "Parole", "REPLY_TO": "Reply-To", "SAVE": "Saglabāt", @@ -28,7 +29,9 @@ "SUBJECT": "Tēma", "TEST": "Test", "TO": "Kam", - "SERVER_MESSAGE": "Server message" + "SERVER_MESSAGE": "Server message", + "YES": "Jā", + "NO": "Nē" }, "LOGIN": { "LABEL_LOGIN": "Ielogoties", @@ -46,23 +49,24 @@ }, "SEARCH": { "TITLE_ADV": "Papildus meklēšana", - "LABEL_ADV_TEXT": "Teksts", - "LABEL_ADV_HAS_ATTACHMENT": "Ir pielikums", - "LABEL_ADV_HAS_ATTACHMENTS": "Ir pielikumi", - "LABEL_ADV_FLAGGED": "Atzīmētie", - "LABEL_ADV_UNSEEN": "Unseen", - "LABEL_ADV_DATE": "Datums", - "LABEL_ADV_DATE_ALL": "Viss periods", - "LABEL_ADV_DATE_3_DAYS": "Līdz 3 dienas vecs", - "LABEL_ADV_DATE_7_DAYS": "Līdz 1 nedēļu vecs", - "LABEL_ADV_DATE_MONTH": "Līdz 1 mēnesi vecs", - "LABEL_ADV_DATE_3_MONTHS": "Līdz 3 mēnešus vecs", - "LABEL_ADV_DATE_6_MONTHS": "Līdz 6 mēnešus vecs", - "LABEL_ADV_DATE_YEAR": "Līdz 1 gadu vecs", - "LABEL_ADV_SUBFOLDERS": "Subfolders", - "LABEL_ADV_SUBFOLDERS_NONE": "None", - "LABEL_ADV_SUBFOLDERS_SUBTREE": "All", - "LABEL_ADV_SUBFOLDERS_SUBTREE_ONE": "One level" + "LABEL_TEXT": "Teksts", + "LABEL_HAS_ATTACHMENT": "Ir pielikums", + "LABEL_HAS_ATTACHMENTS": "Ir pielikumi", + "LABEL_FLAGGED": "Atzīmētie", + "LABEL_UNSEEN": "Unseen", + "LABEL_DATE": "Datums", + "LABEL_DATE_ALL": "Viss periods", + "LABEL_DATE_3_DAYS": "Līdz 3 dienas vecs", + "LABEL_DATE_7_DAYS": "Līdz 1 nedēļu vecs", + "LABEL_DATE_MONTH": "Līdz 1 mēnesi vecs", + "LABEL_DATE_3_MONTHS": "Līdz 3 mēnešus vecs", + "LABEL_DATE_6_MONTHS": "Līdz 6 mēnešus vecs", + "LABEL_DATE_YEAR": "Līdz 1 gadu vecs", + "LABEL_SUBFOLDERS": "Subfolders", + "LABEL_SUBFOLDERS_NONE": "None", + "LABEL_SUBFOLDERS_SUBTREE": "All", + "LABEL_SUBFOLDERS_SUBTREE_ONE": "One level", + "LABEL_REPLIED": "Atbildēja" }, "PREVIEW_POPUP": { "FULLSCREEN": "Toggle fullscreen", @@ -104,7 +108,6 @@ "EMPTY_SEARCH_LIST": "Neviens ziņojums neatbilda jūsu meklētajiem kritērijiem.", "SEARCH_RESULT_FOR": "Meklēšanas rezultāti: \"%SEARCH%\"", "BACK_TO_MESSAGE_LIST": "back to message list", - "EMPTY_SUBJECT_TEXT": "(Nav virsraksta)", "PUT_MESSAGE_HERE": "Ievelciet ziņojumus šeit lai tos apskatītu.", "TODAY_AT": "šodien %TIME%", "YESTERDAY_AT": "vakardien %TIME%", @@ -224,8 +227,6 @@ "BUTTON_REQUEST_DSN": "Request a delivery receipt" }, "POPUPS_ASK": { - "BUTTON_YES": "Jā", - "BUTTON_NO": "Nē", "DESC_WANT_CLOSE_THIS_WINDOW": "Are you sure you want to close this window?", "DESC_WANT_DELETE_MESSAGES": "Are you sure you want to delete the message(s)?" }, @@ -402,6 +403,7 @@ "LABEL_REMOVE_COLORS": "Remove background and text colors from message body", "LABEL_MESSAGE_PER_PAGE": "Ziņojumi lapā", "LABEL_MARK_MESSAGE_READ_AFTER": "Mark message as read after", + "LABEL_MSG_DEFAULT_ACTION": "Default action", "SECONDS": "seconds", "LABEL_NOTIFICATIONS": "Paziņojumi", "LABEL_SOUND_NOTIFICATION": "Sound notification", @@ -415,8 +417,6 @@ "LABEL_CONTACTS_SYNC_SERVER": "Server", "LABEL_CONTACTS_SYNC_AB_URL": "Addressbook URL", "LABEL_CONTACTS_SYNC_USER": "User", - "SYNC_NO": "Nē", - "SYNC_YES": "Jā", "SYNC_READ": "Read only" }, "SETTINGS_THEMES": { diff --git a/snappymail/v/0.0.0/app/localization/nb-NO/admin.json b/snappymail/v/0.0.0/app/localization/nb-NO/admin.json index 78c0f25b4..4f92b2a07 100644 --- a/snappymail/v/0.0.0/app/localization/nb-NO/admin.json +++ b/snappymail/v/0.0.0/app/localization/nb-NO/admin.json @@ -4,7 +4,10 @@ "CLOSE": "Lukk", "SAVE": "Lagre", "TEST": "Test", - "UPDATE": "Oppdater" + "UPDATE": "Oppdater", + "USERNAME": "Brukernavn", + "PASSWORD": "Passord", + "CANCEL": "Avbryt" }, "LOGIN": { "LABEL_LOGIN": "Brukernavn", @@ -84,10 +87,8 @@ "LABEL_SHOW_PHP_INFO": "Vis PHP-informasjon", "LEGEND_ADMIN_PANEL_ACCESS_CREDENTIALS": "Akkreditiver for admin-panel", "LABEL_CURRENT_PASSWORD": "Gjeldende passord", - "LABEL_NEW_LOGIN": "Nytt brukernavn", "LABEL_NEW_PASSWORD": "Nytt passord", "LABEL_REPEAT_PASSWORD": "Gjenta", - "BUTTON_UPDATE_PASSWORD": "Oppdater passord", "LEGEND_SSL": "SSL", "LABEL_REQUIRE_VERIFICATION": "Krev bekreftelse av SSL-sertifikat (IMAP\/SMTP)", "LABEL_ALLOW_SELF_SIGNED": "Tillat selvutstedt sertifikat" diff --git a/snappymail/v/0.0.0/app/localization/nb-NO/user.json b/snappymail/v/0.0.0/app/localization/nb-NO/user.json index 60c14c8e8..69b5f12ac 100644 --- a/snappymail/v/0.0.0/app/localization/nb-NO/user.json +++ b/snappymail/v/0.0.0/app/localization/nb-NO/user.json @@ -20,6 +20,7 @@ "NAME": "Innboks", "NONE": "Ingen", "NOT_SPAM": "Ikke søppelpost", + "USERNAME": "Brukernavn", "PASSWORD": "Passord", "REPLY_TO": "Svar til", "SAVE": "Lagre", @@ -28,7 +29,9 @@ "SUBJECT": "Emne", "TEST": "Test", "TO": "Til", - "SERVER_MESSAGE": "Tjenermelding" + "SERVER_MESSAGE": "Tjenermelding", + "YES": "Ja", + "NO": "Nei" }, "LOGIN": { "LABEL_LOGIN": "Logg inn", @@ -46,23 +49,24 @@ }, "SEARCH": { "TITLE_ADV": "Avansert søk", - "LABEL_ADV_TEXT": "Tekst", - "LABEL_ADV_HAS_ATTACHMENT": "Har vedlegg", - "LABEL_ADV_HAS_ATTACHMENTS": "Har vedlegg", - "LABEL_ADV_FLAGGED": "Stjernemerket", - "LABEL_ADV_UNSEEN": "Ulest", - "LABEL_ADV_DATE": "Dato", - "LABEL_ADV_DATE_ALL": "Alle", - "LABEL_ADV_DATE_3_DAYS": "Inntil 3 dager gamle", - "LABEL_ADV_DATE_7_DAYS": "Inntil 1 uke gamle", - "LABEL_ADV_DATE_MONTH": "Inntil 1 måned gamle", - "LABEL_ADV_DATE_3_MONTHS": "Inntil 3 måneder gamle", - "LABEL_ADV_DATE_6_MONTHS": "Inntil 6 måneder gamle", - "LABEL_ADV_DATE_YEAR": "Inntil 1 år gamle", - "LABEL_ADV_SUBFOLDERS": "Subfolders", - "LABEL_ADV_SUBFOLDERS_NONE": "None", - "LABEL_ADV_SUBFOLDERS_SUBTREE": "Alle", - "LABEL_ADV_SUBFOLDERS_SUBTREE_ONE": "Ett nivå" + "LABEL_TEXT": "Tekst", + "LABEL_HAS_ATTACHMENT": "Har vedlegg", + "LABEL_HAS_ATTACHMENTS": "Har vedlegg", + "LABEL_FLAGGED": "Stjernemerket", + "LABEL_UNSEEN": "Ulest", + "LABEL_DATE": "Dato", + "LABEL_DATE_ALL": "Alle", + "LABEL_DATE_3_DAYS": "Inntil 3 dager gamle", + "LABEL_DATE_7_DAYS": "Inntil 1 uke gamle", + "LABEL_DATE_MONTH": "Inntil 1 måned gamle", + "LABEL_DATE_3_MONTHS": "Inntil 3 måneder gamle", + "LABEL_DATE_6_MONTHS": "Inntil 6 måneder gamle", + "LABEL_DATE_YEAR": "Inntil 1 år gamle", + "LABEL_SUBFOLDERS": "Subfolders", + "LABEL_SUBFOLDERS_NONE": "None", + "LABEL_SUBFOLDERS_SUBTREE": "Alle", + "LABEL_SUBFOLDERS_SUBTREE_ONE": "Ett nivå", + "LABEL_REPLIED": "Besvart" }, "PREVIEW_POPUP": { "FULLSCREEN": "Fullskjerm av\/på", @@ -104,7 +108,6 @@ "EMPTY_SEARCH_LIST": "Søket ga ingen treff.", "SEARCH_RESULT_FOR": "Søketreff for «%SEARCH%»", "BACK_TO_MESSAGE_LIST": "tilbake til meldingsliste", - "EMPTY_SUBJECT_TEXT": "(uten emne)", "PUT_MESSAGE_HERE": "Dra en melding hit for å vise den i lista", "TODAY_AT": "i dag, %TIME%", "YESTERDAY_AT": "i går, %TIME%", @@ -224,8 +227,6 @@ "BUTTON_REQUEST_DSN": "Be om leveringsbekreftelse" }, "POPUPS_ASK": { - "BUTTON_YES": "Ja", - "BUTTON_NO": "Nei", "DESC_WANT_CLOSE_THIS_WINDOW": "Er du sikker på at du vil lukke dette vinduet?", "DESC_WANT_DELETE_MESSAGES": "Er du sikker på at du vil slette meldingen(e)?" }, @@ -402,6 +403,7 @@ "LABEL_REMOVE_COLORS": "Fjern bakgrunn og tekstfarger fra brødtekst", "LABEL_MESSAGE_PER_PAGE": "Meldinger per side", "LABEL_MARK_MESSAGE_READ_AFTER": "Marker melding som lest etter", + "LABEL_MSG_DEFAULT_ACTION": "Default action", "SECONDS": "sekunder", "LABEL_NOTIFICATIONS": "Varsler", "LABEL_SOUND_NOTIFICATION": "Lydvarsel", @@ -415,8 +417,6 @@ "LABEL_CONTACTS_SYNC_SERVER": "Tjener", "LABEL_CONTACTS_SYNC_AB_URL": "Nettadresse til adressebok", "LABEL_CONTACTS_SYNC_USER": "Bruker", - "SYNC_NO": "Nei", - "SYNC_YES": "Ja", "SYNC_READ": "Skrivebeskyttet" }, "SETTINGS_THEMES": { diff --git a/snappymail/v/0.0.0/app/localization/nl-NL/admin.json b/snappymail/v/0.0.0/app/localization/nl-NL/admin.json index c0fcb1274..ae1e06d6a 100644 --- a/snappymail/v/0.0.0/app/localization/nl-NL/admin.json +++ b/snappymail/v/0.0.0/app/localization/nl-NL/admin.json @@ -4,7 +4,10 @@ "CLOSE": "Sluiten", "SAVE": "Opslaan", "TEST": "Test", - "UPDATE": "Updaten" + "UPDATE": "Updaten", + "USERNAME": "Gebruikersnaam", + "PASSWORD": "Wachtwoord", + "CANCEL": "Annuleer" }, "LOGIN": { "LABEL_LOGIN": "Inlognaam", @@ -84,10 +87,8 @@ "LABEL_SHOW_PHP_INFO": "PHP informatie tonen", "LEGEND_ADMIN_PANEL_ACCESS_CREDENTIALS": "Toegangsgegevens beheer paneel", "LABEL_CURRENT_PASSWORD": "Huidig wachtwoord", - "LABEL_NEW_LOGIN": "Nieuwe gebruikersnaam", "LABEL_NEW_PASSWORD": "Nieuw wachtwoord", "LABEL_REPEAT_PASSWORD": "Herhaal nieuw wachtwoord", - "BUTTON_UPDATE_PASSWORD": "Gegevens bijwerken", "LEGEND_SSL": "SSL", "LABEL_REQUIRE_VERIFICATION": "Verificatie van SSL certificaten (IMAP\/SMTP)", "LABEL_ALLOW_SELF_SIGNED": "Sta zelf ondertekende certificaten toe" diff --git a/snappymail/v/0.0.0/app/localization/nl-NL/user.json b/snappymail/v/0.0.0/app/localization/nl-NL/user.json index 18520d572..b04ead094 100644 --- a/snappymail/v/0.0.0/app/localization/nl-NL/user.json +++ b/snappymail/v/0.0.0/app/localization/nl-NL/user.json @@ -20,6 +20,7 @@ "NAME": "Naam", "NONE": "Geen", "NOT_SPAM": "Geen ongewenste e-mail", + "USERNAME": "Gebruikersnaam", "PASSWORD": "Wachtwoord", "REPLY_TO": "Antwoordadres", "SAVE": "Opslaan", @@ -28,7 +29,9 @@ "SUBJECT": "Onderwerp", "TEST": "Test", "TO": "Naar", - "SERVER_MESSAGE": "Server message" + "SERVER_MESSAGE": "Server message", + "YES": "Ja", + "NO": "Nee" }, "LOGIN": { "LABEL_LOGIN": "Inlognaam", @@ -46,23 +49,24 @@ }, "SEARCH": { "TITLE_ADV": "Geavanceerd zoeken", - "LABEL_ADV_TEXT": "Tekst", - "LABEL_ADV_HAS_ATTACHMENT": "Heeft bijlage", - "LABEL_ADV_HAS_ATTACHMENTS": "Heeft bijlages", - "LABEL_ADV_FLAGGED": "Gemarkeerd", - "LABEL_ADV_UNSEEN": "Ongelezen", - "LABEL_ADV_DATE": "Datum", - "LABEL_ADV_DATE_ALL": "Alles", - "LABEL_ADV_DATE_3_DAYS": "Tot 3 dagen oud", - "LABEL_ADV_DATE_7_DAYS": "Tot 1 week oud", - "LABEL_ADV_DATE_MONTH": "Tot 1 maand oud", - "LABEL_ADV_DATE_3_MONTHS": "Tot 3 maanden oud", - "LABEL_ADV_DATE_6_MONTHS": "Tot 6 maanden oud", - "LABEL_ADV_DATE_YEAR": "Tot 1 jaar oud", - "LABEL_ADV_SUBFOLDERS": "Subfolders", - "LABEL_ADV_SUBFOLDERS_NONE": "None", - "LABEL_ADV_SUBFOLDERS_SUBTREE": "All", - "LABEL_ADV_SUBFOLDERS_SUBTREE_ONE": "One level" + "LABEL_TEXT": "Tekst", + "LABEL_HAS_ATTACHMENT": "Heeft bijlage", + "LABEL_HAS_ATTACHMENTS": "Heeft bijlages", + "LABEL_FLAGGED": "Gemarkeerd", + "LABEL_UNSEEN": "Ongelezen", + "LABEL_DATE": "Datum", + "LABEL_DATE_ALL": "Alles", + "LABEL_DATE_3_DAYS": "Tot 3 dagen oud", + "LABEL_DATE_7_DAYS": "Tot 1 week oud", + "LABEL_DATE_MONTH": "Tot 1 maand oud", + "LABEL_DATE_3_MONTHS": "Tot 3 maanden oud", + "LABEL_DATE_6_MONTHS": "Tot 6 maanden oud", + "LABEL_DATE_YEAR": "Tot 1 jaar oud", + "LABEL_SUBFOLDERS": "Subfolders", + "LABEL_SUBFOLDERS_NONE": "None", + "LABEL_SUBFOLDERS_SUBTREE": "All", + "LABEL_SUBFOLDERS_SUBTREE_ONE": "One level", + "LABEL_REPLIED": "Beantwoord" }, "PREVIEW_POPUP": { "FULLSCREEN": "Schakel volledig scherm in\/uit", @@ -104,7 +108,6 @@ "EMPTY_SEARCH_LIST": "Geen items gevonden", "SEARCH_RESULT_FOR": "Zoekresultaten voor \"%SEARCH%\"", "BACK_TO_MESSAGE_LIST": "terug naar berichtenlijst", - "EMPTY_SUBJECT_TEXT": "(Geen onderwerp)", "PUT_MESSAGE_HERE": "Sleep bericht hier om ze te bekijken in de lijst", "TODAY_AT": "vandaag om %TIME%", "YESTERDAY_AT": "gisteren om %TIME%", @@ -224,8 +227,6 @@ "BUTTON_REQUEST_DSN": "Ontvangstbevestiging vragen" }, "POPUPS_ASK": { - "BUTTON_YES": "Ja", - "BUTTON_NO": "Nee", "DESC_WANT_CLOSE_THIS_WINDOW": "Weet u zeker dat u dit venster wilt sluiten?", "DESC_WANT_DELETE_MESSAGES": "Weet u zeker dat u dit\/deze bericht\/berichten wilt verwijderen?" }, @@ -402,6 +403,7 @@ "LABEL_REMOVE_COLORS": "Verwijder achtergrond- en tekstkleuren uit het bericht", "LABEL_MESSAGE_PER_PAGE": "Berichten op pagina", "LABEL_MARK_MESSAGE_READ_AFTER": "Bericht markeren als gelezen na", + "LABEL_MSG_DEFAULT_ACTION": "Default action", "SECONDS": "seconden", "LABEL_NOTIFICATIONS": "Notificaties", "LABEL_SOUND_NOTIFICATION": "Notificatie geluid", @@ -415,8 +417,6 @@ "LABEL_CONTACTS_SYNC_SERVER": "Server", "LABEL_CONTACTS_SYNC_AB_URL": "Adresboek URL", "LABEL_CONTACTS_SYNC_USER": "Gebruikersnaam", - "SYNC_NO": "Nee", - "SYNC_YES": "Ja", "SYNC_READ": "Read only" }, "SETTINGS_THEMES": { diff --git a/snappymail/v/0.0.0/app/localization/pl-PL/admin.json b/snappymail/v/0.0.0/app/localization/pl-PL/admin.json index eef7aeace..d35e2d19c 100644 --- a/snappymail/v/0.0.0/app/localization/pl-PL/admin.json +++ b/snappymail/v/0.0.0/app/localization/pl-PL/admin.json @@ -4,7 +4,10 @@ "CLOSE": "Zamknij", "SAVE": "Zapisz", "TEST": "Testuj", - "UPDATE": "Zaktualizuj" + "UPDATE": "Zaktualizuj", + "USERNAME": "Nazwa użytkownika", + "PASSWORD": "Hasło", + "CANCEL": "Anuluj" }, "LOGIN": { "LABEL_LOGIN": "Login", @@ -84,10 +87,8 @@ "LABEL_SHOW_PHP_INFO": "Pokaż informacje o wersji PHP", "LEGEND_ADMIN_PANEL_ACCESS_CREDENTIALS": "Poświadczenia dostępu do panelu administracyjnego", "LABEL_CURRENT_PASSWORD": "Bieżące hasło", - "LABEL_NEW_LOGIN": "Nowy login", "LABEL_NEW_PASSWORD": "Nowe hasło", "LABEL_REPEAT_PASSWORD": "Powtórz hasło", - "BUTTON_UPDATE_PASSWORD": "Zaktualizuj hasło", "LEGEND_SSL": "SSL", "LABEL_REQUIRE_VERIFICATION": "Wymagaj weryfikacji używanego certyfikatu SSL (IMAP\/SMTP)", "LABEL_ALLOW_SELF_SIGNED": "Zezwól na certyfikaty z podpisem własnym" diff --git a/snappymail/v/0.0.0/app/localization/pl-PL/user.json b/snappymail/v/0.0.0/app/localization/pl-PL/user.json index 5c8246828..bca5295a1 100644 --- a/snappymail/v/0.0.0/app/localization/pl-PL/user.json +++ b/snappymail/v/0.0.0/app/localization/pl-PL/user.json @@ -20,6 +20,7 @@ "NAME": "Odebrane", "NONE": "Brak", "NOT_SPAM": "Oznacz jako pożądane", + "USERNAME": "Nazwa użytkownika", "PASSWORD": "Hasło", "REPLY_TO": "Odpisz do", "SAVE": "Zapisz", @@ -28,7 +29,9 @@ "SUBJECT": "Temat", "TEST": "Testuj", "TO": "Do", - "SERVER_MESSAGE": "Server message" + "SERVER_MESSAGE": "Server message", + "YES": "Tak", + "NO": "Nie" }, "LOGIN": { "LABEL_LOGIN": "Login", @@ -46,23 +49,24 @@ }, "SEARCH": { "TITLE_ADV": "Wyszukiwanie zaawansowane", - "LABEL_ADV_TEXT": "Tekst", - "LABEL_ADV_HAS_ATTACHMENT": "Posiada załącznik", - "LABEL_ADV_HAS_ATTACHMENTS": "Posiada załączniki", - "LABEL_ADV_FLAGGED": "Oznaczona", - "LABEL_ADV_UNSEEN": "Nieprzeczytana", - "LABEL_ADV_DATE": "Data", - "LABEL_ADV_DATE_ALL": "Wszystkie", - "LABEL_ADV_DATE_3_DAYS": "do 3 dni", - "LABEL_ADV_DATE_7_DAYS": "do tygodnia", - "LABEL_ADV_DATE_MONTH": "do miesiąca", - "LABEL_ADV_DATE_3_MONTHS": "do 3 miesięcy", - "LABEL_ADV_DATE_6_MONTHS": "do 6 miesięcy", - "LABEL_ADV_DATE_YEAR": "do roku", - "LABEL_ADV_SUBFOLDERS": "Subfolders", - "LABEL_ADV_SUBFOLDERS_NONE": "None", - "LABEL_ADV_SUBFOLDERS_SUBTREE": "All", - "LABEL_ADV_SUBFOLDERS_SUBTREE_ONE": "One level" + "LABEL_TEXT": "Tekst", + "LABEL_HAS_ATTACHMENT": "Posiada załącznik", + "LABEL_HAS_ATTACHMENTS": "Posiada załączniki", + "LABEL_FLAGGED": "Oznaczona", + "LABEL_UNSEEN": "Nieprzeczytana", + "LABEL_DATE": "Data", + "LABEL_DATE_ALL": "Wszystkie", + "LABEL_DATE_3_DAYS": "do 3 dni", + "LABEL_DATE_7_DAYS": "do tygodnia", + "LABEL_DATE_MONTH": "do miesiąca", + "LABEL_DATE_3_MONTHS": "do 3 miesięcy", + "LABEL_DATE_6_MONTHS": "do 6 miesięcy", + "LABEL_DATE_YEAR": "do roku", + "LABEL_SUBFOLDERS": "Subfolders", + "LABEL_SUBFOLDERS_NONE": "None", + "LABEL_SUBFOLDERS_SUBTREE": "All", + "LABEL_SUBFOLDERS_SUBTREE_ONE": "One level", + "LABEL_REPLIED": "Odebrano" }, "PREVIEW_POPUP": { "FULLSCREEN": "Pełny ekran", @@ -104,7 +108,6 @@ "EMPTY_SEARCH_LIST": "Brak wiadomości spełniających kryteria wyszukiwania.", "SEARCH_RESULT_FOR": "Wyniki wyszukiwania dla \"%SEARCH%\"", "BACK_TO_MESSAGE_LIST": "powrót do listy wiadomości", - "EMPTY_SUBJECT_TEXT": "(Brak tematu)", "PUT_MESSAGE_HERE": "Upuść wiadomość tutaj, aby zobaczyć ją na liście", "TODAY_AT": "dzisiaj o %TIME%", "YESTERDAY_AT": "wczoraj o %TIME%", @@ -224,8 +227,6 @@ "BUTTON_REQUEST_DSN": "Żądaj potwierdzenia dostarczenia wiadomości" }, "POPUPS_ASK": { - "BUTTON_YES": "Tak", - "BUTTON_NO": "Nie", "DESC_WANT_CLOSE_THIS_WINDOW": "Na pewno chcesz zamknąć to okno?", "DESC_WANT_DELETE_MESSAGES": "Na pewno chcesz usunąć wiadomość(-ci)?" }, @@ -402,6 +403,7 @@ "LABEL_REMOVE_COLORS": "Remove background and text colors from message body", "LABEL_MESSAGE_PER_PAGE": "Wiadomości na stronę", "LABEL_MARK_MESSAGE_READ_AFTER": "Mark message as read after", + "LABEL_MSG_DEFAULT_ACTION": "Default action", "SECONDS": "seconds", "LABEL_NOTIFICATIONS": "Powiadomienia", "LABEL_SOUND_NOTIFICATION": "Powiadomienia dźwiękowe", @@ -415,8 +417,6 @@ "LABEL_CONTACTS_SYNC_SERVER": "Serwer", "LABEL_CONTACTS_SYNC_AB_URL": "URL książki adresowej", "LABEL_CONTACTS_SYNC_USER": "Użytkownik", - "SYNC_NO": "Nie", - "SYNC_YES": "Tak", "SYNC_READ": "Read only" }, "SETTINGS_THEMES": { diff --git a/snappymail/v/0.0.0/app/localization/pt-BR/admin.json b/snappymail/v/0.0.0/app/localization/pt-BR/admin.json index dc39f03b8..7454c0025 100644 --- a/snappymail/v/0.0.0/app/localization/pt-BR/admin.json +++ b/snappymail/v/0.0.0/app/localization/pt-BR/admin.json @@ -4,7 +4,10 @@ "CLOSE": "Fechar", "SAVE": "Salvar", "TEST": "Testar", - "UPDATE": "Atualizar" + "UPDATE": "Atualizar", + "USERNAME": "Nome de usuário", + "PASSWORD": "Senha", + "CANCEL": "Cancelar" }, "LOGIN": { "LABEL_LOGIN": "Usuário", @@ -84,10 +87,8 @@ "LABEL_SHOW_PHP_INFO": "Mostar informações PHP", "LEGEND_ADMIN_PANEL_ACCESS_CREDENTIALS": "Credenciais de acesso ao Painel Administrativo", "LABEL_CURRENT_PASSWORD": "Senha atual", - "LABEL_NEW_LOGIN": "Usuário", "LABEL_NEW_PASSWORD": "Nova senha", "LABEL_REPEAT_PASSWORD": "Confirmar nova senha", - "BUTTON_UPDATE_PASSWORD": "Atualizar", "LEGEND_SSL": "SSL", "LABEL_REQUIRE_VERIFICATION": "Exigir verificação do certificado SSL (IMAP\/SMTP)", "LABEL_ALLOW_SELF_SIGNED": "Permitir certificados auto-assinados" diff --git a/snappymail/v/0.0.0/app/localization/pt-BR/user.json b/snappymail/v/0.0.0/app/localization/pt-BR/user.json index 48ebcb1b7..914b46d19 100644 --- a/snappymail/v/0.0.0/app/localization/pt-BR/user.json +++ b/snappymail/v/0.0.0/app/localization/pt-BR/user.json @@ -20,6 +20,7 @@ "NAME": "Caixa de Entrada", "NONE": "Nenhum", "NOT_SPAM": "Não é Lixo Eletrônico", + "USERNAME": "Nome de usuário", "PASSWORD": "Senha", "REPLY_TO": "Responder para", "SAVE": "Salvar", @@ -28,7 +29,9 @@ "SUBJECT": "Assunto", "TEST": "Testar", "TO": "Para", - "SERVER_MESSAGE": "Server message" + "SERVER_MESSAGE": "Server message", + "YES": "Sim", + "NO": "Não" }, "LOGIN": { "LABEL_LOGIN": "Usuário", @@ -46,23 +49,24 @@ }, "SEARCH": { "TITLE_ADV": "Pesquisa Avançada", - "LABEL_ADV_TEXT": "Texto", - "LABEL_ADV_HAS_ATTACHMENT": "Com anexo", - "LABEL_ADV_HAS_ATTACHMENTS": "Com anexos", - "LABEL_ADV_FLAGGED": "Sinalizada", - "LABEL_ADV_UNSEEN": "Não Lida", - "LABEL_ADV_DATE": "Data", - "LABEL_ADV_DATE_ALL": "Qualquer", - "LABEL_ADV_DATE_3_DAYS": "Até 3 dias atrás", - "LABEL_ADV_DATE_7_DAYS": "Até 1 semana atrás", - "LABEL_ADV_DATE_MONTH": "Até 1 mês atrás", - "LABEL_ADV_DATE_3_MONTHS": "Até 3 meses atrás", - "LABEL_ADV_DATE_6_MONTHS": "Até 6 meses atrás", - "LABEL_ADV_DATE_YEAR": "Até 1 ano atrás", - "LABEL_ADV_SUBFOLDERS": "Subfolders", - "LABEL_ADV_SUBFOLDERS_NONE": "None", - "LABEL_ADV_SUBFOLDERS_SUBTREE": "All", - "LABEL_ADV_SUBFOLDERS_SUBTREE_ONE": "One level" + "LABEL_TEXT": "Texto", + "LABEL_HAS_ATTACHMENT": "Com anexo", + "LABEL_HAS_ATTACHMENTS": "Com anexos", + "LABEL_FLAGGED": "Sinalizada", + "LABEL_UNSEEN": "Não Lida", + "LABEL_DATE": "Data", + "LABEL_DATE_ALL": "Qualquer", + "LABEL_DATE_3_DAYS": "Até 3 dias atrás", + "LABEL_DATE_7_DAYS": "Até 1 semana atrás", + "LABEL_DATE_MONTH": "Até 1 mês atrás", + "LABEL_DATE_3_MONTHS": "Até 3 meses atrás", + "LABEL_DATE_6_MONTHS": "Até 6 meses atrás", + "LABEL_DATE_YEAR": "Até 1 ano atrás", + "LABEL_SUBFOLDERS": "Subfolders", + "LABEL_SUBFOLDERS_NONE": "None", + "LABEL_SUBFOLDERS_SUBTREE": "All", + "LABEL_SUBFOLDERS_SUBTREE_ONE": "One level", + "LABEL_REPLIED": "Respondidas" }, "PREVIEW_POPUP": { "FULLSCREEN": "Em tela cheia", @@ -104,7 +108,6 @@ "EMPTY_SEARCH_LIST": "Nenhuma mensagem corresponde a sua pesquisa.", "SEARCH_RESULT_FOR": "Resultados de pesquisa para \"%SEARCH%\"", "BACK_TO_MESSAGE_LIST": "Voltar para a lista de mensagens", - "EMPTY_SUBJECT_TEXT": "(Sem assunto)", "PUT_MESSAGE_HERE": "Coloque a mensagem aqui para vê-la na lista", "TODAY_AT": "Hoje as %TIME%", "YESTERDAY_AT": "Ontem as %TIME%", @@ -224,8 +227,6 @@ "BUTTON_REQUEST_DSN": "Pedir recibo de entrega" }, "POPUPS_ASK": { - "BUTTON_YES": "Sim", - "BUTTON_NO": "Não", "DESC_WANT_CLOSE_THIS_WINDOW": "Você tem certeza que deseja fechar esta janela?", "DESC_WANT_DELETE_MESSAGES": "Você tem certeza de que deseja excluir essa(s) mensagem(s)?" }, @@ -402,6 +403,7 @@ "LABEL_REMOVE_COLORS": "Remove background and text colors from message body", "LABEL_MESSAGE_PER_PAGE": "Mensagens por Página", "LABEL_MARK_MESSAGE_READ_AFTER": "Mark message as read after", + "LABEL_MSG_DEFAULT_ACTION": "Default action", "SECONDS": "seconds", "LABEL_NOTIFICATIONS": "Notificações", "LABEL_SOUND_NOTIFICATION": "Notificação sonora", @@ -415,8 +417,6 @@ "LABEL_CONTACTS_SYNC_SERVER": "Servidor", "LABEL_CONTACTS_SYNC_AB_URL": "URL da lista de contatos", "LABEL_CONTACTS_SYNC_USER": "Usuário", - "SYNC_NO": "Não", - "SYNC_YES": "Sim", "SYNC_READ": "Read only" }, "SETTINGS_THEMES": { diff --git a/snappymail/v/0.0.0/app/localization/pt-PT/admin.json b/snappymail/v/0.0.0/app/localization/pt-PT/admin.json index 856aab164..4dbb99ba2 100644 --- a/snappymail/v/0.0.0/app/localization/pt-PT/admin.json +++ b/snappymail/v/0.0.0/app/localization/pt-PT/admin.json @@ -4,7 +4,10 @@ "CLOSE": "Fechar", "SAVE": "Guardar", "TEST": "Testar", - "UPDATE": "Atualizar" + "UPDATE": "Atualizar", + "USERNAME": "Nome de usuário", + "PASSWORD": "Palavra-passe", + "CANCEL": "Cancelar" }, "LOGIN": { "LABEL_LOGIN": "Utilizador", @@ -84,10 +87,8 @@ "LABEL_SHOW_PHP_INFO": "Mostrar informação do PHP", "LEGEND_ADMIN_PANEL_ACCESS_CREDENTIALS": "Credenciais de acesso ao Painel de Admin", "LABEL_CURRENT_PASSWORD": "Palavra-passe atual", - "LABEL_NEW_LOGIN": "Novo nome", "LABEL_NEW_PASSWORD": "Nova palavra-passe", "LABEL_REPEAT_PASSWORD": "Repetir", - "BUTTON_UPDATE_PASSWORD": "Atualizar a palavra-passe", "LEGEND_SSL": "SSL", "LABEL_REQUIRE_VERIFICATION": "Obrigar a verificação dos certificados SSL utilizados (IMAP\/SMTP)", "LABEL_ALLOW_SELF_SIGNED": "Permitir certificados autoassinados" diff --git a/snappymail/v/0.0.0/app/localization/pt-PT/user.json b/snappymail/v/0.0.0/app/localization/pt-PT/user.json index e460ec646..76ed4a3d1 100644 --- a/snappymail/v/0.0.0/app/localization/pt-PT/user.json +++ b/snappymail/v/0.0.0/app/localization/pt-PT/user.json @@ -20,6 +20,7 @@ "NAME": "Nome", "NONE": "Nenhum", "NOT_SPAM": "Não é spam", + "USERNAME": "Nome de usuário", "PASSWORD": "Palavra-passe", "REPLY_TO": "Resp.-Para", "SAVE": "Guardar", @@ -28,7 +29,9 @@ "SUBJECT": "Assunto", "TEST": "Testar", "TO": "Para", - "SERVER_MESSAGE": "Mensagem do servidor" + "SERVER_MESSAGE": "Mensagem do servidor", + "YES": "Sim", + "NO": "Não" }, "LOGIN": { "LABEL_LOGIN": "Utilizador", @@ -46,23 +49,24 @@ }, "SEARCH": { "TITLE_ADV": "Pesquisa avançada", - "LABEL_ADV_TEXT": "Texto", - "LABEL_ADV_HAS_ATTACHMENT": "Tem anexo", - "LABEL_ADV_HAS_ATTACHMENTS": "Tem anexos", - "LABEL_ADV_FLAGGED": "Sinalizada", - "LABEL_ADV_UNSEEN": "Não lida", - "LABEL_ADV_DATE": "Data", - "LABEL_ADV_DATE_ALL": "Qualquer", - "LABEL_ADV_DATE_3_DAYS": "Até 3 dias atrás", - "LABEL_ADV_DATE_7_DAYS": "Até 1 semana atrás", - "LABEL_ADV_DATE_MONTH": "Até 1 mês atrás", - "LABEL_ADV_DATE_3_MONTHS": "Até 3 meses atrás", - "LABEL_ADV_DATE_6_MONTHS": "Até 6 meses atrás", - "LABEL_ADV_DATE_YEAR": "Até 1 ano atrás", - "LABEL_ADV_SUBFOLDERS": "Subpastas", - "LABEL_ADV_SUBFOLDERS_NONE": "Nenhuma", - "LABEL_ADV_SUBFOLDERS_SUBTREE": "Todas", - "LABEL_ADV_SUBFOLDERS_SUBTREE_ONE": "Um nível" + "LABEL_TEXT": "Texto", + "LABEL_HAS_ATTACHMENT": "Tem anexo", + "LABEL_HAS_ATTACHMENTS": "Tem anexos", + "LABEL_FLAGGED": "Sinalizada", + "LABEL_UNSEEN": "Não lida", + "LABEL_DATE": "Data", + "LABEL_DATE_ALL": "Qualquer", + "LABEL_DATE_3_DAYS": "Até 3 dias atrás", + "LABEL_DATE_7_DAYS": "Até 1 semana atrás", + "LABEL_DATE_MONTH": "Até 1 mês atrás", + "LABEL_DATE_3_MONTHS": "Até 3 meses atrás", + "LABEL_DATE_6_MONTHS": "Até 6 meses atrás", + "LABEL_DATE_YEAR": "Até 1 ano atrás", + "LABEL_SUBFOLDERS": "Subpastas", + "LABEL_SUBFOLDERS_NONE": "Nenhuma", + "LABEL_SUBFOLDERS_SUBTREE": "Todas", + "LABEL_SUBFOLDERS_SUBTREE_ONE": "Um nível", + "LABEL_REPLIED": "Respondidas" }, "PREVIEW_POPUP": { "FULLSCREEN": "Alternar ecrã-inteiro", @@ -104,7 +108,6 @@ "EMPTY_SEARCH_LIST": "Nenhuma mensagem corresponde à sua pesquisa.", "SEARCH_RESULT_FOR": "Resultados de pesquisa para \"%SEARCH%\"", "BACK_TO_MESSAGE_LIST": "voltar à lista de mensagens", - "EMPTY_SUBJECT_TEXT": "(Sem assunto)", "PUT_MESSAGE_HERE": "Coloque a mensagem aqui para vê-la na lista", "TODAY_AT": "hoje às %TIME%", "YESTERDAY_AT": "ontem às %TIME%", @@ -224,8 +227,6 @@ "BUTTON_REQUEST_DSN": "Pedir um recibo de entrega" }, "POPUPS_ASK": { - "BUTTON_YES": "Sim", - "BUTTON_NO": "Não", "DESC_WANT_CLOSE_THIS_WINDOW": "Tem a certeza de que quer fechar esta janela?", "DESC_WANT_DELETE_MESSAGES": "Tem a certeza de que quer eliminar a(s) mensagem(s)?" }, @@ -402,6 +403,7 @@ "LABEL_REMOVE_COLORS": "Retirar imagens de fundo e coloração de texto do corpo das mensagens", "LABEL_MESSAGE_PER_PAGE": "Mensagens por página", "LABEL_MARK_MESSAGE_READ_AFTER": "Marcar mensagem como lida após", + "LABEL_MSG_DEFAULT_ACTION": "Default action", "SECONDS": "segundos", "LABEL_NOTIFICATIONS": "Notificações", "LABEL_SOUND_NOTIFICATION": "Notificações sonoras", @@ -415,8 +417,6 @@ "LABEL_CONTACTS_SYNC_SERVER": "Servidor", "LABEL_CONTACTS_SYNC_AB_URL": "URL do livro de endereços", "LABEL_CONTACTS_SYNC_USER": "Utilizador", - "SYNC_NO": "Não", - "SYNC_YES": "Sim", "SYNC_READ": "Só de leitura" }, "SETTINGS_THEMES": { diff --git a/snappymail/v/0.0.0/app/localization/pt/admin.json b/snappymail/v/0.0.0/app/localization/pt/admin.json index 856aab164..4dbb99ba2 100644 --- a/snappymail/v/0.0.0/app/localization/pt/admin.json +++ b/snappymail/v/0.0.0/app/localization/pt/admin.json @@ -4,7 +4,10 @@ "CLOSE": "Fechar", "SAVE": "Guardar", "TEST": "Testar", - "UPDATE": "Atualizar" + "UPDATE": "Atualizar", + "USERNAME": "Nome de usuário", + "PASSWORD": "Palavra-passe", + "CANCEL": "Cancelar" }, "LOGIN": { "LABEL_LOGIN": "Utilizador", @@ -84,10 +87,8 @@ "LABEL_SHOW_PHP_INFO": "Mostrar informação do PHP", "LEGEND_ADMIN_PANEL_ACCESS_CREDENTIALS": "Credenciais de acesso ao Painel de Admin", "LABEL_CURRENT_PASSWORD": "Palavra-passe atual", - "LABEL_NEW_LOGIN": "Novo nome", "LABEL_NEW_PASSWORD": "Nova palavra-passe", "LABEL_REPEAT_PASSWORD": "Repetir", - "BUTTON_UPDATE_PASSWORD": "Atualizar a palavra-passe", "LEGEND_SSL": "SSL", "LABEL_REQUIRE_VERIFICATION": "Obrigar a verificação dos certificados SSL utilizados (IMAP\/SMTP)", "LABEL_ALLOW_SELF_SIGNED": "Permitir certificados autoassinados" diff --git a/snappymail/v/0.0.0/app/localization/pt/user.json b/snappymail/v/0.0.0/app/localization/pt/user.json index e460ec646..76ed4a3d1 100644 --- a/snappymail/v/0.0.0/app/localization/pt/user.json +++ b/snappymail/v/0.0.0/app/localization/pt/user.json @@ -20,6 +20,7 @@ "NAME": "Nome", "NONE": "Nenhum", "NOT_SPAM": "Não é spam", + "USERNAME": "Nome de usuário", "PASSWORD": "Palavra-passe", "REPLY_TO": "Resp.-Para", "SAVE": "Guardar", @@ -28,7 +29,9 @@ "SUBJECT": "Assunto", "TEST": "Testar", "TO": "Para", - "SERVER_MESSAGE": "Mensagem do servidor" + "SERVER_MESSAGE": "Mensagem do servidor", + "YES": "Sim", + "NO": "Não" }, "LOGIN": { "LABEL_LOGIN": "Utilizador", @@ -46,23 +49,24 @@ }, "SEARCH": { "TITLE_ADV": "Pesquisa avançada", - "LABEL_ADV_TEXT": "Texto", - "LABEL_ADV_HAS_ATTACHMENT": "Tem anexo", - "LABEL_ADV_HAS_ATTACHMENTS": "Tem anexos", - "LABEL_ADV_FLAGGED": "Sinalizada", - "LABEL_ADV_UNSEEN": "Não lida", - "LABEL_ADV_DATE": "Data", - "LABEL_ADV_DATE_ALL": "Qualquer", - "LABEL_ADV_DATE_3_DAYS": "Até 3 dias atrás", - "LABEL_ADV_DATE_7_DAYS": "Até 1 semana atrás", - "LABEL_ADV_DATE_MONTH": "Até 1 mês atrás", - "LABEL_ADV_DATE_3_MONTHS": "Até 3 meses atrás", - "LABEL_ADV_DATE_6_MONTHS": "Até 6 meses atrás", - "LABEL_ADV_DATE_YEAR": "Até 1 ano atrás", - "LABEL_ADV_SUBFOLDERS": "Subpastas", - "LABEL_ADV_SUBFOLDERS_NONE": "Nenhuma", - "LABEL_ADV_SUBFOLDERS_SUBTREE": "Todas", - "LABEL_ADV_SUBFOLDERS_SUBTREE_ONE": "Um nível" + "LABEL_TEXT": "Texto", + "LABEL_HAS_ATTACHMENT": "Tem anexo", + "LABEL_HAS_ATTACHMENTS": "Tem anexos", + "LABEL_FLAGGED": "Sinalizada", + "LABEL_UNSEEN": "Não lida", + "LABEL_DATE": "Data", + "LABEL_DATE_ALL": "Qualquer", + "LABEL_DATE_3_DAYS": "Até 3 dias atrás", + "LABEL_DATE_7_DAYS": "Até 1 semana atrás", + "LABEL_DATE_MONTH": "Até 1 mês atrás", + "LABEL_DATE_3_MONTHS": "Até 3 meses atrás", + "LABEL_DATE_6_MONTHS": "Até 6 meses atrás", + "LABEL_DATE_YEAR": "Até 1 ano atrás", + "LABEL_SUBFOLDERS": "Subpastas", + "LABEL_SUBFOLDERS_NONE": "Nenhuma", + "LABEL_SUBFOLDERS_SUBTREE": "Todas", + "LABEL_SUBFOLDERS_SUBTREE_ONE": "Um nível", + "LABEL_REPLIED": "Respondidas" }, "PREVIEW_POPUP": { "FULLSCREEN": "Alternar ecrã-inteiro", @@ -104,7 +108,6 @@ "EMPTY_SEARCH_LIST": "Nenhuma mensagem corresponde à sua pesquisa.", "SEARCH_RESULT_FOR": "Resultados de pesquisa para \"%SEARCH%\"", "BACK_TO_MESSAGE_LIST": "voltar à lista de mensagens", - "EMPTY_SUBJECT_TEXT": "(Sem assunto)", "PUT_MESSAGE_HERE": "Coloque a mensagem aqui para vê-la na lista", "TODAY_AT": "hoje às %TIME%", "YESTERDAY_AT": "ontem às %TIME%", @@ -224,8 +227,6 @@ "BUTTON_REQUEST_DSN": "Pedir um recibo de entrega" }, "POPUPS_ASK": { - "BUTTON_YES": "Sim", - "BUTTON_NO": "Não", "DESC_WANT_CLOSE_THIS_WINDOW": "Tem a certeza de que quer fechar esta janela?", "DESC_WANT_DELETE_MESSAGES": "Tem a certeza de que quer eliminar a(s) mensagem(s)?" }, @@ -402,6 +403,7 @@ "LABEL_REMOVE_COLORS": "Retirar imagens de fundo e coloração de texto do corpo das mensagens", "LABEL_MESSAGE_PER_PAGE": "Mensagens por página", "LABEL_MARK_MESSAGE_READ_AFTER": "Marcar mensagem como lida após", + "LABEL_MSG_DEFAULT_ACTION": "Default action", "SECONDS": "segundos", "LABEL_NOTIFICATIONS": "Notificações", "LABEL_SOUND_NOTIFICATION": "Notificações sonoras", @@ -415,8 +417,6 @@ "LABEL_CONTACTS_SYNC_SERVER": "Servidor", "LABEL_CONTACTS_SYNC_AB_URL": "URL do livro de endereços", "LABEL_CONTACTS_SYNC_USER": "Utilizador", - "SYNC_NO": "Não", - "SYNC_YES": "Sim", "SYNC_READ": "Só de leitura" }, "SETTINGS_THEMES": { diff --git a/snappymail/v/0.0.0/app/localization/ro-RO/user.json b/snappymail/v/0.0.0/app/localization/ro-RO/user.json index b30c64771..87c2342c0 100644 --- a/snappymail/v/0.0.0/app/localization/ro-RO/user.json +++ b/snappymail/v/0.0.0/app/localization/ro-RO/user.json @@ -20,6 +20,7 @@ "NAME": "Intrări", "NONE": "None", "NOT_SPAM": "Not SPAM", + "USERNAME": "Nume de utilizator", "PASSWORD": "Parolă", "REPLY_TO": "Reply-To", "SAVE": "Salvează", @@ -28,7 +29,9 @@ "SUBJECT": "Subiect", "TEST": "Test", "TO": "către", - "SERVER_MESSAGE": "Server message" + "SERVER_MESSAGE": "Server message", + "YES": "Da", + "NO": "Nu" }, "LOGIN": { "LABEL_LOGIN": "Conectare", @@ -46,23 +49,24 @@ }, "SEARCH": { "TITLE_ADV": "Căutare avansată", - "LABEL_ADV_TEXT": "Conținut", - "LABEL_ADV_HAS_ATTACHMENT": "Are atașament", - "LABEL_ADV_HAS_ATTACHMENTS": "Atașamente", - "LABEL_ADV_FLAGGED": "Importante", - "LABEL_ADV_UNSEEN": "Necitit", - "LABEL_ADV_DATE": "Data", - "LABEL_ADV_DATE_ALL": "Tot timpul", - "LABEL_ADV_DATE_3_DAYS": "З zile", - "LABEL_ADV_DATE_7_DAYS": "7 zile", - "LABEL_ADV_DATE_MONTH": "în această lună", - "LABEL_ADV_DATE_3_MONTHS": "3 luni", - "LABEL_ADV_DATE_6_MONTHS": "6 luni", - "LABEL_ADV_DATE_YEAR": "în acest an", - "LABEL_ADV_SUBFOLDERS": "Subfolders", - "LABEL_ADV_SUBFOLDERS_NONE": "None", - "LABEL_ADV_SUBFOLDERS_SUBTREE": "All", - "LABEL_ADV_SUBFOLDERS_SUBTREE_ONE": "One level" + "LABEL_TEXT": "Conținut", + "LABEL_HAS_ATTACHMENT": "Are atașament", + "LABEL_HAS_ATTACHMENTS": "Atașamente", + "LABEL_FLAGGED": "Importante", + "LABEL_UNSEEN": "Necitit", + "LABEL_DATE": "Data", + "LABEL_DATE_ALL": "Tot timpul", + "LABEL_DATE_3_DAYS": "З zile", + "LABEL_DATE_7_DAYS": "7 zile", + "LABEL_DATE_MONTH": "în această lună", + "LABEL_DATE_3_MONTHS": "3 luni", + "LABEL_DATE_6_MONTHS": "6 luni", + "LABEL_DATE_YEAR": "în acest an", + "LABEL_SUBFOLDERS": "Subfolders", + "LABEL_SUBFOLDERS_NONE": "None", + "LABEL_SUBFOLDERS_SUBTREE": "All", + "LABEL_SUBFOLDERS_SUBTREE_ONE": "One level", + "LABEL_REPLIED": "Răspuns" }, "PREVIEW_POPUP": { "FULLSCREEN": "Toggle fullscreen", @@ -104,7 +108,6 @@ "EMPTY_SEARCH_LIST": "Nu am găsit nimic.", "SEARCH_RESULT_FOR": "Rezultat căutare \"%SEARCH%\"", "BACK_TO_MESSAGE_LIST": "înapoi la lista de mesaje", - "EMPTY_SUBJECT_TEXT": "(nici un subiect)", "PUT_MESSAGE_HERE": "EROARE! CONTACTAȚI ADIMISTRATORUL! (trimiteți un prt.scr)", "TODAY_AT": "azi %TIME%", "YESTERDAY_AT": "ieri %TIME%", @@ -224,8 +227,6 @@ "BUTTON_REQUEST_DSN": "Request a delivery receipt" }, "POPUPS_ASK": { - "BUTTON_YES": "Da", - "BUTTON_NO": "Nu", "DESC_WANT_CLOSE_THIS_WINDOW": "Sigur doriți să închideți această fereastră?", "DESC_WANT_DELETE_MESSAGES": "Sigur doriți să ștergeți mesajul(e)?" }, @@ -402,6 +403,7 @@ "LABEL_REMOVE_COLORS": "Remove background and text colors from message body", "LABEL_MESSAGE_PER_PAGE": "Mesaje pe o pagină", "LABEL_MARK_MESSAGE_READ_AFTER": "Mark message as read after", + "LABEL_MSG_DEFAULT_ACTION": "Default action", "SECONDS": "seconds", "LABEL_NOTIFICATIONS": "Notificări", "LABEL_SOUND_NOTIFICATION": "Sound notification", @@ -415,8 +417,6 @@ "LABEL_CONTACTS_SYNC_SERVER": "Server", "LABEL_CONTACTS_SYNC_AB_URL": "Addressbook URL", "LABEL_CONTACTS_SYNC_USER": "User", - "SYNC_NO": "Nu", - "SYNC_YES": "Da", "SYNC_READ": "Read only" }, "SETTINGS_THEMES": { diff --git a/snappymail/v/0.0.0/app/localization/ru-RU/admin.json b/snappymail/v/0.0.0/app/localization/ru-RU/admin.json index 74cea96f3..33f18c98d 100644 --- a/snappymail/v/0.0.0/app/localization/ru-RU/admin.json +++ b/snappymail/v/0.0.0/app/localization/ru-RU/admin.json @@ -4,7 +4,10 @@ "CLOSE": "Закрыть", "SAVE": "Сохранить", "TEST": "Тест", - "UPDATE": "Обновить" + "UPDATE": "Обновить", + "USERNAME": "Имя пользователя", + "PASSWORD": "Пароль", + "CANCEL": "Отменить" }, "LOGIN": { "LABEL_LOGIN": "Логин", @@ -84,10 +87,8 @@ "LABEL_SHOW_PHP_INFO": "Показать PHP информацию", "LEGEND_ADMIN_PANEL_ACCESS_CREDENTIALS": "Admin Panel Access Credentials", "LABEL_CURRENT_PASSWORD": "Текущий пароль", - "LABEL_NEW_LOGIN": "Новый логин", "LABEL_NEW_PASSWORD": "Новый пароль", "LABEL_REPEAT_PASSWORD": "Повторить пароль", - "BUTTON_UPDATE_PASSWORD": "Обновить пароль", "LEGEND_SSL": "SSL", "LABEL_REQUIRE_VERIFICATION": "Требовать проверку SSL сертификата для IMAP и SMTP", "LABEL_ALLOW_SELF_SIGNED": "Разрешить cамоподписанные сертификаты" diff --git a/snappymail/v/0.0.0/app/localization/ru-RU/user.json b/snappymail/v/0.0.0/app/localization/ru-RU/user.json index 7f814e0b6..f0701a14f 100644 --- a/snappymail/v/0.0.0/app/localization/ru-RU/user.json +++ b/snappymail/v/0.0.0/app/localization/ru-RU/user.json @@ -20,6 +20,7 @@ "NAME": "Входящие", "NONE": "Ничего", "NOT_SPAM": "Не спам", + "USERNAME": "Имя пользователя", "PASSWORD": "Пароль", "REPLY_TO": "Ответить-на", "SAVE": "Сохранить", @@ -28,7 +29,9 @@ "SUBJECT": "Тема", "TEST": "Тест", "TO": "Кому", - "SERVER_MESSAGE": "Server message" + "SERVER_MESSAGE": "Server message", + "YES": "Да", + "NO": "Нет" }, "LOGIN": { "LABEL_LOGIN": "Логин", @@ -46,23 +49,24 @@ }, "SEARCH": { "TITLE_ADV": "Расширенный поиск писем", - "LABEL_ADV_TEXT": "Текст", - "LABEL_ADV_HAS_ATTACHMENT": "С файлами", - "LABEL_ADV_HAS_ATTACHMENTS": "С файлами", - "LABEL_ADV_FLAGGED": "Помеченные", - "LABEL_ADV_UNSEEN": "Непрочитанные", - "LABEL_ADV_DATE": "Дата", - "LABEL_ADV_DATE_ALL": "За все время", - "LABEL_ADV_DATE_3_DAYS": "За три дня", - "LABEL_ADV_DATE_7_DAYS": "За неделю", - "LABEL_ADV_DATE_MONTH": "За месяц", - "LABEL_ADV_DATE_3_MONTHS": "За 3 месяца", - "LABEL_ADV_DATE_6_MONTHS": "За полгода", - "LABEL_ADV_DATE_YEAR": "За год", - "LABEL_ADV_SUBFOLDERS": "Subfolders", - "LABEL_ADV_SUBFOLDERS_NONE": "None", - "LABEL_ADV_SUBFOLDERS_SUBTREE": "All", - "LABEL_ADV_SUBFOLDERS_SUBTREE_ONE": "One level" + "LABEL_TEXT": "Текст", + "LABEL_HAS_ATTACHMENT": "С файлами", + "LABEL_HAS_ATTACHMENTS": "С файлами", + "LABEL_FLAGGED": "Помеченные", + "LABEL_UNSEEN": "Непрочитанные", + "LABEL_DATE": "Дата", + "LABEL_DATE_ALL": "За все время", + "LABEL_DATE_3_DAYS": "За три дня", + "LABEL_DATE_7_DAYS": "За неделю", + "LABEL_DATE_MONTH": "За месяц", + "LABEL_DATE_3_MONTHS": "За 3 месяца", + "LABEL_DATE_6_MONTHS": "За полгода", + "LABEL_DATE_YEAR": "За год", + "LABEL_SUBFOLDERS": "Subfolders", + "LABEL_SUBFOLDERS_NONE": "None", + "LABEL_SUBFOLDERS_SUBTREE": "All", + "LABEL_SUBFOLDERS_SUBTREE_ONE": "One level", + "LABEL_REPLIED": "Ответил" }, "PREVIEW_POPUP": { "FULLSCREEN": "Полный экран", @@ -104,7 +108,6 @@ "EMPTY_SEARCH_LIST": "Письма не найдены.", "SEARCH_RESULT_FOR": "Результат поиска \"%SEARCH%\"", "BACK_TO_MESSAGE_LIST": "back to message list", - "EMPTY_SUBJECT_TEXT": "(Без темы)", "PUT_MESSAGE_HERE": "Киньте сообщение сюда, чтобы посмотреть его в списке", "TODAY_AT": "сегодня в %TIME%", "YESTERDAY_AT": "вчера в %TIME%", @@ -224,8 +227,6 @@ "BUTTON_REQUEST_DSN": "Запросить уведомление о доставке" }, "POPUPS_ASK": { - "BUTTON_YES": "Да", - "BUTTON_NO": "Нет", "DESC_WANT_CLOSE_THIS_WINDOW": "Вы уверены, что хотите закрыть это окно?", "DESC_WANT_DELETE_MESSAGES": "Вы уверены, что хотите удалить сообщение(я)?" }, @@ -402,6 +403,7 @@ "LABEL_REMOVE_COLORS": "Remove background and text colors from message body", "LABEL_MESSAGE_PER_PAGE": "Cообщений на одной странице", "LABEL_MARK_MESSAGE_READ_AFTER": "Mark message as read after", + "LABEL_MSG_DEFAULT_ACTION": "Default action", "SECONDS": "seconds", "LABEL_NOTIFICATIONS": "Уведомления", "LABEL_SOUND_NOTIFICATION": "Звуковые уведомления", @@ -415,8 +417,6 @@ "LABEL_CONTACTS_SYNC_SERVER": "Сервер", "LABEL_CONTACTS_SYNC_AB_URL": "Адресная книга (URL)", "LABEL_CONTACTS_SYNC_USER": "Пользователь", - "SYNC_NO": "Нет", - "SYNC_YES": "Да", "SYNC_READ": "Read only" }, "SETTINGS_THEMES": { diff --git a/snappymail/v/0.0.0/app/localization/sk-SK/admin.json b/snappymail/v/0.0.0/app/localization/sk-SK/admin.json index 7eae867ca..23dce3bb9 100644 --- a/snappymail/v/0.0.0/app/localization/sk-SK/admin.json +++ b/snappymail/v/0.0.0/app/localization/sk-SK/admin.json @@ -4,7 +4,10 @@ "CLOSE": "Zatvoriť", "SAVE": "Uložiť", "TEST": "Test", - "UPDATE": "Aktualizovať" + "UPDATE": "Aktualizovať", + "USERNAME": "Používateľské men", + "PASSWORD": "Heslo", + "CANCEL": "Zrušiť" }, "LOGIN": { "LABEL_LOGIN": "Prihlasovanie", @@ -84,10 +87,8 @@ "LABEL_SHOW_PHP_INFO": "Zobraziť informácie o PHP", "LEGEND_ADMIN_PANEL_ACCESS_CREDENTIALS": "Admin Panel Access Credentials", "LABEL_CURRENT_PASSWORD": "Súčasné heslo", - "LABEL_NEW_LOGIN": "Nový login", "LABEL_NEW_PASSWORD": "Nové heslo", "LABEL_REPEAT_PASSWORD": "Opakovať", - "BUTTON_UPDATE_PASSWORD": "Zmeniť heslo", "LEGEND_SSL": "SSL", "LABEL_REQUIRE_VERIFICATION": "Require verification of SSL certificate used (IMAP\/SMTP)", "LABEL_ALLOW_SELF_SIGNED": "Allow self signed certificates" diff --git a/snappymail/v/0.0.0/app/localization/sk-SK/user.json b/snappymail/v/0.0.0/app/localization/sk-SK/user.json index d03a90a7d..92229e5b9 100644 --- a/snappymail/v/0.0.0/app/localization/sk-SK/user.json +++ b/snappymail/v/0.0.0/app/localization/sk-SK/user.json @@ -20,6 +20,7 @@ "NAME": "Prijaté", "NONE": "Žiadny", "NOT_SPAM": "Nie je spam", + "USERNAME": "Používateľské men", "PASSWORD": "Heslo", "REPLY_TO": "Adresa pre odpoveď", "SAVE": "Uložiť", @@ -28,7 +29,9 @@ "SUBJECT": "Predmet", "TEST": "Test", "TO": "Príjemca", - "SERVER_MESSAGE": "Server message" + "SERVER_MESSAGE": "Server message", + "YES": "Áno", + "NO": "Nie" }, "LOGIN": { "LABEL_LOGIN": "Používateľské meno", @@ -46,23 +49,24 @@ }, "SEARCH": { "TITLE_ADV": "Rozšírené hľadanie", - "LABEL_ADV_TEXT": "Text", - "LABEL_ADV_HAS_ATTACHMENT": "S prílohou", - "LABEL_ADV_HAS_ATTACHMENTS": "S prílohami", - "LABEL_ADV_FLAGGED": "Označené hviezdičkou", - "LABEL_ADV_UNSEEN": "Neprečítané", - "LABEL_ADV_DATE": "Dátum", - "LABEL_ADV_DATE_ALL": "Kedykoľvek", - "LABEL_ADV_DATE_3_DAYS": "Nie staršie ako 3 dni", - "LABEL_ADV_DATE_7_DAYS": "Nie staršie ako týždeň", - "LABEL_ADV_DATE_MONTH": "Nie staršie ako mesiac", - "LABEL_ADV_DATE_3_MONTHS": "Nie staršie ako 3 mesiace", - "LABEL_ADV_DATE_6_MONTHS": "Nie staršie ako 6 mesiacov", - "LABEL_ADV_DATE_YEAR": "Nie staršie ako 1 rok", - "LABEL_ADV_SUBFOLDERS": "Subfolders", - "LABEL_ADV_SUBFOLDERS_NONE": "None", - "LABEL_ADV_SUBFOLDERS_SUBTREE": "All", - "LABEL_ADV_SUBFOLDERS_SUBTREE_ONE": "One level" + "LABEL_TEXT": "Text", + "LABEL_HAS_ATTACHMENT": "S prílohou", + "LABEL_HAS_ATTACHMENTS": "S prílohami", + "LABEL_FLAGGED": "Označené hviezdičkou", + "LABEL_UNSEEN": "Neprečítané", + "LABEL_DATE": "Dátum", + "LABEL_DATE_ALL": "Kedykoľvek", + "LABEL_DATE_3_DAYS": "Nie staršie ako 3 dni", + "LABEL_DATE_7_DAYS": "Nie staršie ako týždeň", + "LABEL_DATE_MONTH": "Nie staršie ako mesiac", + "LABEL_DATE_3_MONTHS": "Nie staršie ako 3 mesiace", + "LABEL_DATE_6_MONTHS": "Nie staršie ako 6 mesiacov", + "LABEL_DATE_YEAR": "Nie staršie ako 1 rok", + "LABEL_SUBFOLDERS": "Subfolders", + "LABEL_SUBFOLDERS_NONE": "None", + "LABEL_SUBFOLDERS_SUBTREE": "All", + "LABEL_SUBFOLDERS_SUBTREE_ONE": "One level", + "LABEL_REPLIED": "Odpovedané" }, "PREVIEW_POPUP": { "FULLSCREEN": "Prepnúť na celú obrazovku", @@ -104,7 +108,6 @@ "EMPTY_SEARCH_LIST": "Vášmu vyhľadávaniu nezodpovedajú žiadne správy.", "SEARCH_RESULT_FOR": "Výsledky vyhľadávania pre \"%SEARCH%\"", "BACK_TO_MESSAGE_LIST": "späť do zoznamu správ", - "EMPTY_SUBJECT_TEXT": "(Bez predmetu)", "PUT_MESSAGE_HERE": "Pusťte správu tu pre jej zobrazenie v zozname", "TODAY_AT": "dnes o %TIME%", "YESTERDAY_AT": "včera o %TIME%", @@ -224,8 +227,6 @@ "BUTTON_REQUEST_DSN": "Vyžiadať potvrdenie o doručení" }, "POPUPS_ASK": { - "BUTTON_YES": "Áno", - "BUTTON_NO": "Nie", "DESC_WANT_CLOSE_THIS_WINDOW": "Ste si istý že chcete zatvoriť toto okno?", "DESC_WANT_DELETE_MESSAGES": "Ste si istý že chcete odstrániť tieto správy?" }, @@ -402,6 +403,7 @@ "LABEL_REMOVE_COLORS": "Remove background and text colors from message body", "LABEL_MESSAGE_PER_PAGE": "Správ na stranu", "LABEL_MARK_MESSAGE_READ_AFTER": "Mark message as read after", + "LABEL_MSG_DEFAULT_ACTION": "Default action", "SECONDS": "seconds", "LABEL_NOTIFICATIONS": "Notifikácie", "LABEL_SOUND_NOTIFICATION": "Sound notification", @@ -415,8 +417,6 @@ "LABEL_CONTACTS_SYNC_SERVER": "Server", "LABEL_CONTACTS_SYNC_AB_URL": "Addressbook URL", "LABEL_CONTACTS_SYNC_USER": "User", - "SYNC_NO": "Nie", - "SYNC_YES": "Áno", "SYNC_READ": "Read only" }, "SETTINGS_THEMES": { diff --git a/snappymail/v/0.0.0/app/localization/sl-SI/admin.json b/snappymail/v/0.0.0/app/localization/sl-SI/admin.json index c0f314c92..889dfbfb8 100644 --- a/snappymail/v/0.0.0/app/localization/sl-SI/admin.json +++ b/snappymail/v/0.0.0/app/localization/sl-SI/admin.json @@ -4,7 +4,10 @@ "CLOSE": "Zapri", "SAVE": "Shrani", "TEST": "Preizkus", - "UPDATE": "Posodobi" + "UPDATE": "Posodobi", + "USERNAME": "Uporabniško ime", + "PASSWORD": "Geslo", + "CANCEL": "Prekliči" }, "LOGIN": { "LABEL_LOGIN": "Prijava", @@ -84,10 +87,8 @@ "LABEL_SHOW_PHP_INFO": "Prikaz PHP informacij", "LEGEND_ADMIN_PANEL_ACCESS_CREDENTIALS": "Prijavni podatki za administracijsko ploščo", "LABEL_CURRENT_PASSWORD": "Trenutno geslo", - "LABEL_NEW_LOGIN": "Novo uporabniško ime", "LABEL_NEW_PASSWORD": "Novo geslo", "LABEL_REPEAT_PASSWORD": "Ponovno", - "BUTTON_UPDATE_PASSWORD": "Posodobi geslo", "LEGEND_SSL": "SSL", "LABEL_REQUIRE_VERIFICATION": "Obvezno overjanje uporabljenega SSL certifikata (IMAP\/SMTP)", "LABEL_ALLOW_SELF_SIGNED": "Dovoli samopodpisane certifikate" diff --git a/snappymail/v/0.0.0/app/localization/sl-SI/user.json b/snappymail/v/0.0.0/app/localization/sl-SI/user.json index 5b6b57aed..198a9b582 100644 --- a/snappymail/v/0.0.0/app/localization/sl-SI/user.json +++ b/snappymail/v/0.0.0/app/localization/sl-SI/user.json @@ -20,6 +20,7 @@ "NAME": "Prejeto", "NONE": "Nobeno", "NOT_SPAM": "Ni vsiljena pošta", + "USERNAME": "Uporabniško ime", "PASSWORD": "Geslo", "REPLY_TO": "Odgovor na", "SAVE": "Shrani", @@ -28,7 +29,9 @@ "SUBJECT": "Zadeva", "TEST": "Preizkusi", "TO": "Za", - "SERVER_MESSAGE": "Server message" + "SERVER_MESSAGE": "Server message", + "YES": "Da", + "NO": "Ne" }, "LOGIN": { "LABEL_LOGIN": "Prijava", @@ -46,23 +49,24 @@ }, "SEARCH": { "TITLE_ADV": "Napredno iskanje", - "LABEL_ADV_TEXT": "Besedilo", - "LABEL_ADV_HAS_ATTACHMENT": "Ima prilogo", - "LABEL_ADV_HAS_ATTACHMENTS": "Ima prilogi\/-e", - "LABEL_ADV_FLAGGED": "Z zvezdico", - "LABEL_ADV_UNSEEN": "Neprebrano", - "LABEL_ADV_DATE": "Datum", - "LABEL_ADV_DATE_ALL": "Vsa", - "LABEL_ADV_DATE_3_DAYS": "Do 3 dni nazaj", - "LABEL_ADV_DATE_7_DAYS": "Do 1 tedna nazaj", - "LABEL_ADV_DATE_MONTH": "Do 1 meseca nazaj", - "LABEL_ADV_DATE_3_MONTHS": "Do 3 mesecev nazaj", - "LABEL_ADV_DATE_6_MONTHS": "Do 6 mesecev nazaj", - "LABEL_ADV_DATE_YEAR": "Do 1 leta nazaj", - "LABEL_ADV_SUBFOLDERS": "Subfolders", - "LABEL_ADV_SUBFOLDERS_NONE": "None", - "LABEL_ADV_SUBFOLDERS_SUBTREE": "All", - "LABEL_ADV_SUBFOLDERS_SUBTREE_ONE": "One level" + "LABEL_TEXT": "Besedilo", + "LABEL_HAS_ATTACHMENT": "Ima prilogo", + "LABEL_HAS_ATTACHMENTS": "Ima prilogi\/-e", + "LABEL_FLAGGED": "Z zvezdico", + "LABEL_UNSEEN": "Neprebrano", + "LABEL_DATE": "Datum", + "LABEL_DATE_ALL": "Vsa", + "LABEL_DATE_3_DAYS": "Do 3 dni nazaj", + "LABEL_DATE_7_DAYS": "Do 1 tedna nazaj", + "LABEL_DATE_MONTH": "Do 1 meseca nazaj", + "LABEL_DATE_3_MONTHS": "Do 3 mesecev nazaj", + "LABEL_DATE_6_MONTHS": "Do 6 mesecev nazaj", + "LABEL_DATE_YEAR": "Do 1 leta nazaj", + "LABEL_SUBFOLDERS": "Subfolders", + "LABEL_SUBFOLDERS_NONE": "None", + "LABEL_SUBFOLDERS_SUBTREE": "All", + "LABEL_SUBFOLDERS_SUBTREE_ONE": "One level", + "LABEL_REPLIED": "Odgovoril" }, "PREVIEW_POPUP": { "FULLSCREEN": "Preklopi celozaslonski pogled", @@ -104,7 +108,6 @@ "EMPTY_SEARCH_LIST": "Brez ujemanj.", "SEARCH_RESULT_FOR": "Ujemanja za \"%SEARCH%\"", "BACK_TO_MESSAGE_LIST": "nazaj na seznam sporočil", - "EMPTY_SUBJECT_TEXT": "(Brez zadeve)", "PUT_MESSAGE_HERE": "Spustite sporočilo tu za ogled na seznamu", "TODAY_AT": "danes ob %TIME%", "YESTERDAY_AT": "včeraj ob %TIME%", @@ -224,8 +227,6 @@ "BUTTON_REQUEST_DSN": "Zahtevaj potrdilo o dostavi" }, "POPUPS_ASK": { - "BUTTON_YES": "Da", - "BUTTON_NO": "Ne", "DESC_WANT_CLOSE_THIS_WINDOW": "Želite zapreti to okno?", "DESC_WANT_DELETE_MESSAGES": "Želite izbrisati sporočilo\/-a?" }, @@ -402,6 +403,7 @@ "LABEL_REMOVE_COLORS": "Remove background and text colors from message body", "LABEL_MESSAGE_PER_PAGE": "Sporočil na strani", "LABEL_MARK_MESSAGE_READ_AFTER": "Mark message as read after", + "LABEL_MSG_DEFAULT_ACTION": "Default action", "SECONDS": "seconds", "LABEL_NOTIFICATIONS": "Obvestila", "LABEL_SOUND_NOTIFICATION": "Zvočno obvestilo", @@ -415,8 +417,6 @@ "LABEL_CONTACTS_SYNC_SERVER": "Strežnik", "LABEL_CONTACTS_SYNC_AB_URL": "URL imenika", "LABEL_CONTACTS_SYNC_USER": "Uporabnik", - "SYNC_NO": "Ne", - "SYNC_YES": "Da", "SYNC_READ": "Read only" }, "SETTINGS_THEMES": { diff --git a/snappymail/v/0.0.0/app/localization/sv-SE/admin.json b/snappymail/v/0.0.0/app/localization/sv-SE/admin.json index 358585cbe..397d3e4eb 100644 --- a/snappymail/v/0.0.0/app/localization/sv-SE/admin.json +++ b/snappymail/v/0.0.0/app/localization/sv-SE/admin.json @@ -4,7 +4,10 @@ "CLOSE": "Stäng", "SAVE": "Spara", "TEST": "Test", - "UPDATE": "Uppdatera" + "UPDATE": "Uppdatera", + "USERNAME": "Användarnamn", + "PASSWORD": "Lösenord", + "CANCEL": "Avbryt" }, "LOGIN": { "LABEL_LOGIN": "Logga in", @@ -84,10 +87,8 @@ "LABEL_SHOW_PHP_INFO": "Visa PHP-information", "LEGEND_ADMIN_PANEL_ACCESS_CREDENTIALS": "Administrativsuppgifter", "LABEL_CURRENT_PASSWORD": "Nuvarande lösenord", - "LABEL_NEW_LOGIN": "Ny inloggning", "LABEL_NEW_PASSWORD": "Nytt lösenord", "LABEL_REPEAT_PASSWORD": "Upprepa", - "BUTTON_UPDATE_PASSWORD": "Uppdatera lösenord", "LEGEND_SSL": "SSL", "LABEL_REQUIRE_VERIFICATION": "Kräver verifiering av SSL-certifikat som används (IMAP\/SMTP)", "LABEL_ALLOW_SELF_SIGNED": "Låt självsignerade certifikat" diff --git a/snappymail/v/0.0.0/app/localization/sv-SE/user.json b/snappymail/v/0.0.0/app/localization/sv-SE/user.json index dd8d194f0..dc8255a48 100644 --- a/snappymail/v/0.0.0/app/localization/sv-SE/user.json +++ b/snappymail/v/0.0.0/app/localization/sv-SE/user.json @@ -20,6 +20,7 @@ "NAME": "Inkorg", "NONE": "Ingen", "NOT_SPAM": "Inte spam", + "USERNAME": "Användarnamn", "PASSWORD": "Lösenord", "REPLY_TO": "Svara till", "SAVE": "Spara", @@ -28,7 +29,9 @@ "SUBJECT": "Ämne", "TEST": "Test", "TO": "Till", - "SERVER_MESSAGE": "Server message" + "SERVER_MESSAGE": "Server message", + "YES": "Ja", + "NO": "Nej" }, "LOGIN": { "LABEL_LOGIN": "Användarnamn", @@ -46,23 +49,24 @@ }, "SEARCH": { "TITLE_ADV": "Avancerad sök", - "LABEL_ADV_TEXT": "Text", - "LABEL_ADV_HAS_ATTACHMENT": "Har bilaga", - "LABEL_ADV_HAS_ATTACHMENTS": "Har bilagor", - "LABEL_ADV_FLAGGED": "Flaggad", - "LABEL_ADV_UNSEEN": "Oläst", - "LABEL_ADV_DATE": "Datum", - "LABEL_ADV_DATE_ALL": "Alla", - "LABEL_ADV_DATE_3_DAYS": "Upp till 3 dagar gammalt", - "LABEL_ADV_DATE_7_DAYS": "Upp till 1 vecka gammalt", - "LABEL_ADV_DATE_MONTH": "Upp till 1 månad gammalt", - "LABEL_ADV_DATE_3_MONTHS": "Upp till 3 månader gammalt", - "LABEL_ADV_DATE_6_MONTHS": "Upp till 6 månader gammalt", - "LABEL_ADV_DATE_YEAR": "Upp till 1 år gammalt", - "LABEL_ADV_SUBFOLDERS": "Subfolders", - "LABEL_ADV_SUBFOLDERS_NONE": "None", - "LABEL_ADV_SUBFOLDERS_SUBTREE": "All", - "LABEL_ADV_SUBFOLDERS_SUBTREE_ONE": "One level" + "LABEL_TEXT": "Text", + "LABEL_HAS_ATTACHMENT": "Har bilaga", + "LABEL_HAS_ATTACHMENTS": "Har bilagor", + "LABEL_FLAGGED": "Flaggad", + "LABEL_UNSEEN": "Oläst", + "LABEL_DATE": "Datum", + "LABEL_DATE_ALL": "Alla", + "LABEL_DATE_3_DAYS": "Upp till 3 dagar gammalt", + "LABEL_DATE_7_DAYS": "Upp till 1 vecka gammalt", + "LABEL_DATE_MONTH": "Upp till 1 månad gammalt", + "LABEL_DATE_3_MONTHS": "Upp till 3 månader gammalt", + "LABEL_DATE_6_MONTHS": "Upp till 6 månader gammalt", + "LABEL_DATE_YEAR": "Upp till 1 år gammalt", + "LABEL_SUBFOLDERS": "Subfolders", + "LABEL_SUBFOLDERS_NONE": "None", + "LABEL_SUBFOLDERS_SUBTREE": "All", + "LABEL_SUBFOLDERS_SUBTREE_ONE": "One level", + "LABEL_REPLIED": "Svarade" }, "PREVIEW_POPUP": { "FULLSCREEN": "Växla fullskärmsläge", @@ -104,7 +108,6 @@ "EMPTY_SEARCH_LIST": "Inga meddelanden matchar din sökning.", "SEARCH_RESULT_FOR": "Sök resultat för \"%SEARCH%\"", "BACK_TO_MESSAGE_LIST": "Tillbaka till meddelanden", - "EMPTY_SUBJECT_TEXT": "(Inget ämne)", "PUT_MESSAGE_HERE": "Släpp meddelandet för att se det i listan", "TODAY_AT": "idag kl %TIME%", "YESTERDAY_AT": "igår kl %TIME%", @@ -224,8 +227,6 @@ "BUTTON_REQUEST_DSN": "Begär ett leveranskvitto" }, "POPUPS_ASK": { - "BUTTON_YES": "Ja", - "BUTTON_NO": "Nej", "DESC_WANT_CLOSE_THIS_WINDOW": "Vill du stänga detta fönster?", "DESC_WANT_DELETE_MESSAGES": "Är du säker att du vill ta bort meddelandet?" }, @@ -402,6 +403,7 @@ "LABEL_REMOVE_COLORS": "Remove background and text colors from message body", "LABEL_MESSAGE_PER_PAGE": "Meddelanden per sida", "LABEL_MARK_MESSAGE_READ_AFTER": "Markera meddelandet som läst efter", + "LABEL_MSG_DEFAULT_ACTION": "Default action", "SECONDS": "sekunder", "LABEL_NOTIFICATIONS": "Aviseringar", "LABEL_SOUND_NOTIFICATION": "Ljudnotifikation", @@ -415,8 +417,6 @@ "LABEL_CONTACTS_SYNC_SERVER": "Server", "LABEL_CONTACTS_SYNC_AB_URL": "Adressboks-URL", "LABEL_CONTACTS_SYNC_USER": "Användare", - "SYNC_NO": "Nej", - "SYNC_YES": "Ja", "SYNC_READ": "Read only" }, "SETTINGS_THEMES": { diff --git a/snappymail/v/0.0.0/app/localization/tr-TR/user.json b/snappymail/v/0.0.0/app/localization/tr-TR/user.json index ca64b7740..d8e763aaf 100644 --- a/snappymail/v/0.0.0/app/localization/tr-TR/user.json +++ b/snappymail/v/0.0.0/app/localization/tr-TR/user.json @@ -20,6 +20,7 @@ "NAME": "Gelen Kutusu", "NONE": "None", "NOT_SPAM": "Spam Değil", + "USERNAME": "Kullanıcı adı", "PASSWORD": "Şifre", "REPLY_TO": "Reply-To", "SAVE": "Kaydet", @@ -28,7 +29,9 @@ "SUBJECT": "Konu", "TEST": "Test", "TO": "Kime", - "SERVER_MESSAGE": "Server message" + "SERVER_MESSAGE": "Server message", + "YES": "Evet", + "NO": "Hayır" }, "LOGIN": { "LABEL_LOGIN": "Giriş", @@ -46,23 +49,24 @@ }, "SEARCH": { "TITLE_ADV": "Detaylı Arama", - "LABEL_ADV_TEXT": "Metin", - "LABEL_ADV_HAS_ATTACHMENT": "Eki", - "LABEL_ADV_HAS_ATTACHMENTS": "Ekleri", - "LABEL_ADV_FLAGGED": "İşaretli", - "LABEL_ADV_UNSEEN": "Görünmeyen", - "LABEL_ADV_DATE": "Tarih", - "LABEL_ADV_DATE_ALL": "Hepsi", - "LABEL_ADV_DATE_3_DAYS": "3 gün önceki", - "LABEL_ADV_DATE_7_DAYS": "1 hafta önceki", - "LABEL_ADV_DATE_MONTH": "1 ay önceki", - "LABEL_ADV_DATE_3_MONTHS": "3 ay önceki", - "LABEL_ADV_DATE_6_MONTHS": "6 ay önceki", - "LABEL_ADV_DATE_YEAR": "1 yıl önceki", - "LABEL_ADV_SUBFOLDERS": "Subfolders", - "LABEL_ADV_SUBFOLDERS_NONE": "None", - "LABEL_ADV_SUBFOLDERS_SUBTREE": "All", - "LABEL_ADV_SUBFOLDERS_SUBTREE_ONE": "One level" + "LABEL_TEXT": "Metin", + "LABEL_HAS_ATTACHMENT": "Eki", + "LABEL_HAS_ATTACHMENTS": "Ekleri", + "LABEL_FLAGGED": "İşaretli", + "LABEL_UNSEEN": "Görünmeyen", + "LABEL_DATE": "Tarih", + "LABEL_DATE_ALL": "Hepsi", + "LABEL_DATE_3_DAYS": "3 gün önceki", + "LABEL_DATE_7_DAYS": "1 hafta önceki", + "LABEL_DATE_MONTH": "1 ay önceki", + "LABEL_DATE_3_MONTHS": "3 ay önceki", + "LABEL_DATE_6_MONTHS": "6 ay önceki", + "LABEL_DATE_YEAR": "1 yıl önceki", + "LABEL_SUBFOLDERS": "Subfolders", + "LABEL_SUBFOLDERS_NONE": "None", + "LABEL_SUBFOLDERS_SUBTREE": "All", + "LABEL_SUBFOLDERS_SUBTREE_ONE": "One level", + "LABEL_REPLIED": "cevaplandı" }, "PREVIEW_POPUP": { "FULLSCREEN": "Toggle fullscreen", @@ -104,7 +108,6 @@ "EMPTY_SEARCH_LIST": "Arama sonuçlarına uyan herhangi bir mesaj bulunamadı.", "SEARCH_RESULT_FOR": "\"%SEARCH%\" için arama sonuçları", "BACK_TO_MESSAGE_LIST": "mesaj listesine geri dön", - "EMPTY_SUBJECT_TEXT": "(Konu Yok)", "PUT_MESSAGE_HERE": "Listede görüntülemek istediğiniz mesajı buraya sürükleyin.", "TODAY_AT": "bugün %TIME%", "YESTERDAY_AT": "dün %TIME%", @@ -224,8 +227,6 @@ "BUTTON_REQUEST_DSN": "Request a delivery receipt" }, "POPUPS_ASK": { - "BUTTON_YES": "Evet", - "BUTTON_NO": "Hayır", "DESC_WANT_CLOSE_THIS_WINDOW": "Bu pencereyi kapatmak istediğinizden emin misiniz?", "DESC_WANT_DELETE_MESSAGES": "Mesaj(ları) silmek istediğinizden emin misiniz?" }, @@ -402,6 +403,7 @@ "LABEL_REMOVE_COLORS": "Remove background and text colors from message body", "LABEL_MESSAGE_PER_PAGE": "Messages on page", "LABEL_MARK_MESSAGE_READ_AFTER": "Mark message as read after", + "LABEL_MSG_DEFAULT_ACTION": "Default action", "SECONDS": "seconds", "LABEL_NOTIFICATIONS": "Bildirimler", "LABEL_SOUND_NOTIFICATION": "Sound notification", @@ -415,8 +417,6 @@ "LABEL_CONTACTS_SYNC_SERVER": "Sunucu", "LABEL_CONTACTS_SYNC_AB_URL": "Adres Defteri URL", "LABEL_CONTACTS_SYNC_USER": "Kullanıcı Adı", - "SYNC_NO": "Hayır", - "SYNC_YES": "Evet", "SYNC_READ": "Read only" }, "SETTINGS_THEMES": { diff --git a/snappymail/v/0.0.0/app/localization/uk-UA/user.json b/snappymail/v/0.0.0/app/localization/uk-UA/user.json index 62df930e3..6f03cbdc0 100644 --- a/snappymail/v/0.0.0/app/localization/uk-UA/user.json +++ b/snappymail/v/0.0.0/app/localization/uk-UA/user.json @@ -20,6 +20,7 @@ "NAME": "Вхідні", "NONE": "None", "NOT_SPAM": "Не спам", + "USERNAME": "Ім'я користувача", "PASSWORD": "Пароль", "REPLY_TO": "Reply-To", "SAVE": "Зберегти", @@ -28,7 +29,9 @@ "SUBJECT": "Тема", "TEST": "Тест", "TO": "Кому", - "SERVER_MESSAGE": "Server message" + "SERVER_MESSAGE": "Server message", + "YES": "Так", + "NO": "Ні" }, "LOGIN": { "LABEL_LOGIN": "Логін", @@ -46,23 +49,24 @@ }, "SEARCH": { "TITLE_ADV": "Розширений пошук листів", - "LABEL_ADV_TEXT": "Текст", - "LABEL_ADV_HAS_ATTACHMENT": "З файлами", - "LABEL_ADV_HAS_ATTACHMENTS": "З файлами", - "LABEL_ADV_FLAGGED": "Відмічені", - "LABEL_ADV_UNSEEN": "Непрочитані", - "LABEL_ADV_DATE": "Дата", - "LABEL_ADV_DATE_ALL": "За весь час", - "LABEL_ADV_DATE_3_DAYS": "За три дні", - "LABEL_ADV_DATE_7_DAYS": "За тиждень", - "LABEL_ADV_DATE_MONTH": "За місяць", - "LABEL_ADV_DATE_3_MONTHS": "За 3 місяці", - "LABEL_ADV_DATE_6_MONTHS": "За півроку", - "LABEL_ADV_DATE_YEAR": "За рік", - "LABEL_ADV_SUBFOLDERS": "Subfolders", - "LABEL_ADV_SUBFOLDERS_NONE": "None", - "LABEL_ADV_SUBFOLDERS_SUBTREE": "All", - "LABEL_ADV_SUBFOLDERS_SUBTREE_ONE": "One level" + "LABEL_TEXT": "Текст", + "LABEL_HAS_ATTACHMENT": "З файлами", + "LABEL_HAS_ATTACHMENTS": "З файлами", + "LABEL_FLAGGED": "Відмічені", + "LABEL_UNSEEN": "Непрочитані", + "LABEL_DATE": "Дата", + "LABEL_DATE_ALL": "За весь час", + "LABEL_DATE_3_DAYS": "За три дні", + "LABEL_DATE_7_DAYS": "За тиждень", + "LABEL_DATE_MONTH": "За місяць", + "LABEL_DATE_3_MONTHS": "За 3 місяці", + "LABEL_DATE_6_MONTHS": "За півроку", + "LABEL_DATE_YEAR": "За рік", + "LABEL_SUBFOLDERS": "Subfolders", + "LABEL_SUBFOLDERS_NONE": "None", + "LABEL_SUBFOLDERS_SUBTREE": "All", + "LABEL_SUBFOLDERS_SUBTREE_ONE": "One level", + "LABEL_REPLIED": "відповів" }, "PREVIEW_POPUP": { "FULLSCREEN": "Toggle fullscreen", @@ -104,7 +108,6 @@ "EMPTY_SEARCH_LIST": "Листи не знайдено.", "SEARCH_RESULT_FOR": "Результат пошуку \"%SEARCH%\"", "BACK_TO_MESSAGE_LIST": "повернутись до списку листів", - "EMPTY_SUBJECT_TEXT": "(Без теми)", "PUT_MESSAGE_HERE": "Киньте повідомлення сюди, щоб подивитися його в списку", "TODAY_AT": "сьогодні в %TIME%", "YESTERDAY_AT": "вчора в %TIME%", @@ -224,8 +227,6 @@ "BUTTON_REQUEST_DSN": "Request a delivery receipt" }, "POPUPS_ASK": { - "BUTTON_YES": "Так", - "BUTTON_NO": "Ні", "DESC_WANT_CLOSE_THIS_WINDOW": "Ви впевнені, що хочете закрити це вікно?", "DESC_WANT_DELETE_MESSAGES": "Ви впевнені, що хочете видалити повідомлення?" }, @@ -402,6 +403,7 @@ "LABEL_REMOVE_COLORS": "Remove background and text colors from message body", "LABEL_MESSAGE_PER_PAGE": "Повідомлень на одній сторінці", "LABEL_MARK_MESSAGE_READ_AFTER": "Mark message as read after", + "LABEL_MSG_DEFAULT_ACTION": "Default action", "SECONDS": "seconds", "LABEL_NOTIFICATIONS": "Сповіщення", "LABEL_SOUND_NOTIFICATION": "Звукове сповіщення", @@ -415,8 +417,6 @@ "LABEL_CONTACTS_SYNC_SERVER": "Сервер", "LABEL_CONTACTS_SYNC_AB_URL": "Адресна книга (URL)", "LABEL_CONTACTS_SYNC_USER": "Користувач", - "SYNC_NO": "Ні", - "SYNC_YES": "Так", "SYNC_READ": "Read only" }, "SETTINGS_THEMES": { diff --git a/snappymail/v/0.0.0/app/localization/vi-VN/admin.json b/snappymail/v/0.0.0/app/localization/vi-VN/admin.json index 61067b500..45efac211 100644 --- a/snappymail/v/0.0.0/app/localization/vi-VN/admin.json +++ b/snappymail/v/0.0.0/app/localization/vi-VN/admin.json @@ -4,7 +4,10 @@ "CLOSE": "Đóng", "SAVE": "Lưu", "TEST": "Thử", - "UPDATE": "Cập nhật" + "UPDATE": "Cập nhật", + "USERNAME": "Tên tài khoản", + "PASSWORD": "Mật khẩu", + "CANCEL": "Hủy" }, "LOGIN": { "LABEL_LOGIN": "Đăng nhập", @@ -84,10 +87,8 @@ "LABEL_SHOW_PHP_INFO": "Hiển thị thông tin PHP", "LEGEND_ADMIN_PANEL_ACCESS_CREDENTIALS": "Thông tin truy cập bảng quản trị", "LABEL_CURRENT_PASSWORD": "Mật khẩu hiện tại", - "LABEL_NEW_LOGIN": "Đăng nhập mới", "LABEL_NEW_PASSWORD": "Mật khẩu mới", "LABEL_REPEAT_PASSWORD": "Lập lại mật khẩu", - "BUTTON_UPDATE_PASSWORD": "Cập nhật mật khẩu", "LEGEND_SSL": "Chứng chỉ số SSL", "LABEL_REQUIRE_VERIFICATION": "Yêu cầu xác minh chứng chỉ SSL được dùng (IMAP\/SMTP)", "LABEL_ALLOW_SELF_SIGNED": "Cho phép chứng chỉ tự ký" diff --git a/snappymail/v/0.0.0/app/localization/vi-VN/user.json b/snappymail/v/0.0.0/app/localization/vi-VN/user.json index 0cc7013af..fbaf06187 100644 --- a/snappymail/v/0.0.0/app/localization/vi-VN/user.json +++ b/snappymail/v/0.0.0/app/localization/vi-VN/user.json @@ -20,6 +20,7 @@ "NAME": "Tên gọi", "NONE": "Trống", "NOT_SPAM": "Không phải thư rác", + "USERNAME": "Tên tài khoản", "PASSWORD": "Mật khẩu", "REPLY_TO": "Nhận thư phản hồi về", "SAVE": "Lưu", @@ -28,7 +29,9 @@ "SUBJECT": "Tiêu đề", "TEST": "Thử nghiệm", "TO": "Gửi đến", - "SERVER_MESSAGE": "Tin nhắn từ máy chủ" + "SERVER_MESSAGE": "Tin nhắn từ máy chủ", + "YES": "Ok", + "NO": "Không" }, "LOGIN": { "LABEL_LOGIN": "Đăng nhập", @@ -46,23 +49,24 @@ }, "SEARCH": { "TITLE_ADV": "Tìm kiếm nâng cao", - "LABEL_ADV_TEXT": "Nội dung trong mail", - "LABEL_ADV_HAS_ATTACHMENT": "Có đính kèm", - "LABEL_ADV_HAS_ATTACHMENTS": "Có đính kèm", - "LABEL_ADV_FLAGGED": "Được đánh dấu sao", - "LABEL_ADV_UNSEEN": "Chưa được xem", - "LABEL_ADV_DATE": "Ngày", - "LABEL_ADV_DATE_ALL": "Tất cả", - "LABEL_ADV_DATE_3_DAYS": "Khoảng 3 ngày trước", - "LABEL_ADV_DATE_7_DAYS": "Khoảng 1 tuần trước", - "LABEL_ADV_DATE_MONTH": "Khoảng 1 tháng trước", - "LABEL_ADV_DATE_3_MONTHS": "Khoảng 3 tháng trước", - "LABEL_ADV_DATE_6_MONTHS": "Khoảng 6 tháng trước", - "LABEL_ADV_DATE_YEAR": "Khoảng 1 năm trước", - "LABEL_ADV_SUBFOLDERS": "Thư mục con", - "LABEL_ADV_SUBFOLDERS_NONE": "Trống", - "LABEL_ADV_SUBFOLDERS_SUBTREE": "Tất cả", - "LABEL_ADV_SUBFOLDERS_SUBTREE_ONE": "Một cấp độ" + "LABEL_TEXT": "Nội dung trong mail", + "LABEL_HAS_ATTACHMENT": "Có đính kèm", + "LABEL_HAS_ATTACHMENTS": "Có đính kèm", + "LABEL_FLAGGED": "Được đánh dấu sao", + "LABEL_UNSEEN": "Chưa được xem", + "LABEL_DATE": "Ngày", + "LABEL_DATE_ALL": "Tất cả", + "LABEL_DATE_3_DAYS": "Khoảng 3 ngày trước", + "LABEL_DATE_7_DAYS": "Khoảng 1 tuần trước", + "LABEL_DATE_MONTH": "Khoảng 1 tháng trước", + "LABEL_DATE_3_MONTHS": "Khoảng 3 tháng trước", + "LABEL_DATE_6_MONTHS": "Khoảng 6 tháng trước", + "LABEL_DATE_YEAR": "Khoảng 1 năm trước", + "LABEL_SUBFOLDERS": "Thư mục con", + "LABEL_SUBFOLDERS_NONE": "Trống", + "LABEL_SUBFOLDERS_SUBTREE": "Tất cả", + "LABEL_SUBFOLDERS_SUBTREE_ONE": "Một cấp độ", + "LABEL_REPLIED": "Đã trả lời" }, "PREVIEW_POPUP": { "FULLSCREEN": "Đóng\/mở toàn màn hình", @@ -104,7 +108,6 @@ "EMPTY_SEARCH_LIST": "Không tìm thấy thư trùng khớp.", "SEARCH_RESULT_FOR": "Kết quả tìm kiếm cho \"%SEARCH%\"", "BACK_TO_MESSAGE_LIST": "trở về danh sách thư", - "EMPTY_SUBJECT_TEXT": "(Chưa có tiêu đề)", "PUT_MESSAGE_HERE": "Bỏ thư vào đây để xem nó trong danh sách", "TODAY_AT": "hôm nay lúc %TIME%", "YESTERDAY_AT": "hôm qua lúc %TIME%", @@ -224,8 +227,6 @@ "BUTTON_REQUEST_DSN": "Yêu cầu thông báo thư đã gửi thành công" }, "POPUPS_ASK": { - "BUTTON_YES": "Ok", - "BUTTON_NO": "Không", "DESC_WANT_CLOSE_THIS_WINDOW": "Bạn có chắc muốn đóng bảng này chứ?", "DESC_WANT_DELETE_MESSAGES": "Bạn có chắc muốn xóa thư này chứ?" }, @@ -402,6 +403,7 @@ "LABEL_REMOVE_COLORS": "Loại bỏ hình nền và màu chữ trong phần thân của thư", "LABEL_MESSAGE_PER_PAGE": "Số thư hiển thị trên trang", "LABEL_MARK_MESSAGE_READ_AFTER": "Đánh dấu thư là để đọc sau", + "LABEL_MSG_DEFAULT_ACTION": "Default action", "SECONDS": "giây", "LABEL_NOTIFICATIONS": "Thông báo", "LABEL_SOUND_NOTIFICATION": "Thông báo âm thanh", @@ -415,8 +417,6 @@ "LABEL_CONTACTS_SYNC_SERVER": "Máy chủ", "LABEL_CONTACTS_SYNC_AB_URL": "Đường link của sổ địa chỉ", "LABEL_CONTACTS_SYNC_USER": "Người dùng", - "SYNC_NO": "Không", - "SYNC_YES": "Ok", "SYNC_READ": "Chỉ cho phép đọc" }, "SETTINGS_THEMES": { diff --git a/snappymail/v/0.0.0/app/localization/zh-CN/admin.json b/snappymail/v/0.0.0/app/localization/zh-CN/admin.json index eeeb36229..80d82b8f6 100644 --- a/snappymail/v/0.0.0/app/localization/zh-CN/admin.json +++ b/snappymail/v/0.0.0/app/localization/zh-CN/admin.json @@ -4,7 +4,10 @@ "CLOSE": "关闭", "SAVE": "保存", "TEST": "测试", - "UPDATE": "更新" + "UPDATE": "更新", + "USERNAME": "用户名", + "PASSWORD": "密码", + "CANCEL": "取消" }, "LOGIN": { "LABEL_LOGIN": "登录", @@ -84,10 +87,8 @@ "LABEL_SHOW_PHP_INFO": "显示 PHP 信息", "LEGEND_ADMIN_PANEL_ACCESS_CREDENTIALS": "管理员面板访问凭据", "LABEL_CURRENT_PASSWORD": "当前密码", - "LABEL_NEW_LOGIN": "新的登录用户名", "LABEL_NEW_PASSWORD": "新密码", "LABEL_REPEAT_PASSWORD": "重复输入新密码", - "BUTTON_UPDATE_PASSWORD": "更新密码", "LEGEND_SSL": "SSL", "LABEL_REQUIRE_VERIFICATION": "要求验证 SSL 证书(IMAP\/SMTP)", "LABEL_ALLOW_SELF_SIGNED": "允许自签名证书" diff --git a/snappymail/v/0.0.0/app/localization/zh-CN/user.json b/snappymail/v/0.0.0/app/localization/zh-CN/user.json index 7e7808bde..de897228d 100644 --- a/snappymail/v/0.0.0/app/localization/zh-CN/user.json +++ b/snappymail/v/0.0.0/app/localization/zh-CN/user.json @@ -20,6 +20,7 @@ "NAME": "名称", "NONE": "无", "NOT_SPAM": "这不是垃圾邮件", + "USERNAME": "用户名", "PASSWORD": "密码", "REPLY_TO": "回复", "SAVE": "保存", @@ -28,7 +29,9 @@ "SUBJECT": "主题", "TEST": "测试", "TO": "发送到", - "SERVER_MESSAGE": "Server message" + "SERVER_MESSAGE": "Server message", + "YES": "是", + "NO": "否" }, "LOGIN": { "LABEL_LOGIN": "登录", @@ -46,23 +49,24 @@ }, "SEARCH": { "TITLE_ADV": "高级搜索", - "LABEL_ADV_TEXT": "内容", - "LABEL_ADV_HAS_ATTACHMENT": "有附件", - "LABEL_ADV_HAS_ATTACHMENTS": "有附件", - "LABEL_ADV_FLAGGED": "标记", - "LABEL_ADV_UNSEEN": "不可见", - "LABEL_ADV_DATE": "日期", - "LABEL_ADV_DATE_ALL": "所有邮件", - "LABEL_ADV_DATE_3_DAYS": "3天以内", - "LABEL_ADV_DATE_7_DAYS": "1周以内", - "LABEL_ADV_DATE_MONTH": "1个月以内", - "LABEL_ADV_DATE_3_MONTHS": "3个月以内", - "LABEL_ADV_DATE_6_MONTHS": "半年以内", - "LABEL_ADV_DATE_YEAR": "1年以内", - "LABEL_ADV_SUBFOLDERS": "Subfolders", - "LABEL_ADV_SUBFOLDERS_NONE": "None", - "LABEL_ADV_SUBFOLDERS_SUBTREE": "All", - "LABEL_ADV_SUBFOLDERS_SUBTREE_ONE": "One level" + "LABEL_TEXT": "内容", + "LABEL_HAS_ATTACHMENT": "有附件", + "LABEL_HAS_ATTACHMENTS": "有附件", + "LABEL_FLAGGED": "标记", + "LABEL_UNSEEN": "不可见", + "LABEL_DATE": "日期", + "LABEL_DATE_ALL": "所有邮件", + "LABEL_DATE_3_DAYS": "3天以内", + "LABEL_DATE_7_DAYS": "1周以内", + "LABEL_DATE_MONTH": "1个月以内", + "LABEL_DATE_3_MONTHS": "3个月以内", + "LABEL_DATE_6_MONTHS": "半年以内", + "LABEL_DATE_YEAR": "1年以内", + "LABEL_SUBFOLDERS": "Subfolders", + "LABEL_SUBFOLDERS_NONE": "None", + "LABEL_SUBFOLDERS_SUBTREE": "All", + "LABEL_SUBFOLDERS_SUBTREE_ONE": "One level", + "LABEL_REPLIED": "已回答" }, "PREVIEW_POPUP": { "FULLSCREEN": "切换全屏", @@ -104,7 +108,6 @@ "EMPTY_SEARCH_LIST": "未找到您想要的。", "SEARCH_RESULT_FOR": "搜索 \"%SEARCH%\" 的结果", "BACK_TO_MESSAGE_LIST": "回到信息列表", - "EMPTY_SUBJECT_TEXT": "(无主题)", "PUT_MESSAGE_HERE": "在这里查看邮件", "TODAY_AT": "今日于 %TIME%", "YESTERDAY_AT": "昨天 %TIME%", @@ -224,8 +227,6 @@ "BUTTON_REQUEST_DSN": "要求送达回执" }, "POPUPS_ASK": { - "BUTTON_YES": "是", - "BUTTON_NO": "否", "DESC_WANT_CLOSE_THIS_WINDOW": "你确定要关闭此窗口吗?", "DESC_WANT_DELETE_MESSAGES": "你确定你要删除这条消息吗?" }, @@ -402,6 +403,7 @@ "LABEL_REMOVE_COLORS": "从消息中删除背景和文本颜色", "LABEL_MESSAGE_PER_PAGE": "封邮件每页", "LABEL_MARK_MESSAGE_READ_AFTER": "将消息标记为已读", + "LABEL_MSG_DEFAULT_ACTION": "Default action", "SECONDS": "秒", "LABEL_NOTIFICATIONS": "通知", "LABEL_SOUND_NOTIFICATION": "提示音", @@ -415,8 +417,6 @@ "LABEL_CONTACTS_SYNC_SERVER": "服务器", "LABEL_CONTACTS_SYNC_AB_URL": "地址簿 URL", "LABEL_CONTACTS_SYNC_USER": "用户名", - "SYNC_NO": "否", - "SYNC_YES": "是", "SYNC_READ": "Read only" }, "SETTINGS_THEMES": { diff --git a/snappymail/v/0.0.0/app/localization/zh-TW/user.json b/snappymail/v/0.0.0/app/localization/zh-TW/user.json index 67f91ed5d..cf230368c 100644 --- a/snappymail/v/0.0.0/app/localization/zh-TW/user.json +++ b/snappymail/v/0.0.0/app/localization/zh-TW/user.json @@ -20,6 +20,7 @@ "NAME": "收件箱", "NONE": "None", "NOT_SPAM": "Not Spam", + "USERNAME": "用户名", "PASSWORD": "密碼", "REPLY_TO": "Reply-To", "SAVE": "保存", @@ -28,7 +29,9 @@ "SUBJECT": "主題", "TEST": "測試", "TO": "發送到", - "SERVER_MESSAGE": "Server message" + "SERVER_MESSAGE": "Server message", + "YES": "是", + "NO": "否" }, "LOGIN": { "LABEL_LOGIN": "登錄", @@ -46,23 +49,24 @@ }, "SEARCH": { "TITLE_ADV": "高級搜索", - "LABEL_ADV_TEXT": "內容", - "LABEL_ADV_HAS_ATTACHMENT": "有附件", - "LABEL_ADV_HAS_ATTACHMENTS": "有附件", - "LABEL_ADV_FLAGGED": "標記", - "LABEL_ADV_UNSEEN": "Unseen", - "LABEL_ADV_DATE": "日期", - "LABEL_ADV_DATE_ALL": "所有郵件", - "LABEL_ADV_DATE_3_DAYS": "3天以內", - "LABEL_ADV_DATE_7_DAYS": "1周以內", - "LABEL_ADV_DATE_MONTH": "1月以內", - "LABEL_ADV_DATE_3_MONTHS": "3月以內", - "LABEL_ADV_DATE_6_MONTHS": "半年以內", - "LABEL_ADV_DATE_YEAR": "1年以內", - "LABEL_ADV_SUBFOLDERS": "Subfolders", - "LABEL_ADV_SUBFOLDERS_NONE": "None", - "LABEL_ADV_SUBFOLDERS_SUBTREE": "All", - "LABEL_ADV_SUBFOLDERS_SUBTREE_ONE": "One level" + "LABEL_TEXT": "內容", + "LABEL_HAS_ATTACHMENT": "有附件", + "LABEL_HAS_ATTACHMENTS": "有附件", + "LABEL_FLAGGED": "標記", + "LABEL_UNSEEN": "Unseen", + "LABEL_DATE": "日期", + "LABEL_DATE_ALL": "所有郵件", + "LABEL_DATE_3_DAYS": "3天以內", + "LABEL_DATE_7_DAYS": "1周以內", + "LABEL_DATE_MONTH": "1月以內", + "LABEL_DATE_3_MONTHS": "3月以內", + "LABEL_DATE_6_MONTHS": "半年以內", + "LABEL_DATE_YEAR": "1年以內", + "LABEL_SUBFOLDERS": "Subfolders", + "LABEL_SUBFOLDERS_NONE": "None", + "LABEL_SUBFOLDERS_SUBTREE": "All", + "LABEL_SUBFOLDERS_SUBTREE_ONE": "One level", + "LABEL_REPLIED": "已回答" }, "PREVIEW_POPUP": { "FULLSCREEN": "Toggle fullscreen", @@ -104,7 +108,6 @@ "EMPTY_SEARCH_LIST": "未找到您想要的。", "SEARCH_RESULT_FOR": "搜索 \"%SEARCH%\" 的結果", "BACK_TO_MESSAGE_LIST": "back to message list", - "EMPTY_SUBJECT_TEXT": "(無主題)", "PUT_MESSAGE_HERE": "在這裡查看郵件", "TODAY_AT": "今日於 %TIME%", "YESTERDAY_AT": "昨天 %TIME%", @@ -224,8 +227,6 @@ "BUTTON_REQUEST_DSN": "Request a delivery receipt" }, "POPUPS_ASK": { - "BUTTON_YES": "是", - "BUTTON_NO": "否", "DESC_WANT_CLOSE_THIS_WINDOW": "你確定要關閉此窗口嗎?", "DESC_WANT_DELETE_MESSAGES": "你確定你要刪除這條消息嗎?" }, @@ -402,6 +403,7 @@ "LABEL_REMOVE_COLORS": "Remove background and text colors from message body", "LABEL_MESSAGE_PER_PAGE": "封郵件每頁", "LABEL_MARK_MESSAGE_READ_AFTER": "Mark message as read after", + "LABEL_MSG_DEFAULT_ACTION": "Default action", "SECONDS": "seconds", "LABEL_NOTIFICATIONS": "通知", "LABEL_SOUND_NOTIFICATION": "Sound notification", @@ -415,8 +417,6 @@ "LABEL_CONTACTS_SYNC_SERVER": "伺服器", "LABEL_CONTACTS_SYNC_AB_URL": "地址簿URL", "LABEL_CONTACTS_SYNC_USER": "用戶名", - "SYNC_NO": "否", - "SYNC_YES": "是", "SYNC_READ": "Read only" }, "SETTINGS_THEMES": { diff --git a/snappymail/v/0.0.0/app/templates/Views/Admin/AdminSettingsSecurity.html b/snappymail/v/0.0.0/app/templates/Views/Admin/AdminSettingsSecurity.html index 711348514..d2eddfe67 100644 --- a/snappymail/v/0.0.0/app/templates/Views/Admin/AdminSettingsSecurity.html +++ b/snappymail/v/0.0.0/app/templates/Views/Admin/AdminSettingsSecurity.html @@ -22,16 +22,16 @@
+
+ + +
-
- - -
- + +

+	
+
+
diff --git a/snappymail/v/0.0.0/app/templates/Views/Common/PopupsAsk.html b/snappymail/v/0.0.0/app/templates/Views/Common/PopupsAsk.html index 68781b61e..137c4f95c 100644 --- a/snappymail/v/0.0.0/app/templates/Views/Common/PopupsAsk.html +++ b/snappymail/v/0.0.0/app/templates/Views/Common/PopupsAsk.html @@ -1,13 +1,17 @@ diff --git a/snappymail/v/0.0.0/app/templates/Views/User/MailMessageList.html b/snappymail/v/0.0.0/app/templates/Views/User/MailMessageList.html index 0c391e845..d4f96ccb9 100644 --- a/snappymail/v/0.0.0/app/templates/Views/User/MailMessageList.html +++ b/snappymail/v/0.0.0/app/templates/Views/User/MailMessageList.html @@ -30,7 +30,7 @@
- 🗄 + 🗄 @@ -40,19 +40,19 @@
-
-
-
+
+ messageList.isLoading() && !messageList.error()">
@@ -136,7 +136,7 @@
-
+
diff --git a/snappymail/v/0.0.0/app/templates/Views/User/MailMessageView.html b/snappymail/v/0.0.0/app/templates/Views/User/MailMessageView.html index e634943fd..b795ce803 100644 --- a/snappymail/v/0.0.0/app/templates/Views/User/MailMessageView.html +++ b/snappymail/v/0.0.0/app/templates/Views/User/MailMessageView.html @@ -40,11 +40,9 @@
+ data-bind="visible: 1 == msgDefaultAction(), command: replyCommand" data-i18n="[title]MESSAGE/BUTTON_REPLY">← - + data-bind="visible: 2 == msgDefaultAction(), command: replyAllCommand" data-i18n="[title]MESSAGE/BUTTON_REPLY_ALL">↞
@@ -66,7 +64,7 @@
-
+
  • @@ -120,13 +118,12 @@
    -
    +
    ! - - + ×
    diff --git a/snappymail/v/0.0.0/app/templates/Views/User/PopupsAccount.html b/snappymail/v/0.0.0/app/templates/Views/User/PopupsAccount.html index 00edf9e5c..2875b6e6d 100644 --- a/snappymail/v/0.0.0/app/templates/Views/User/PopupsAccount.html +++ b/snappymail/v/0.0.0/app/templates/Views/User/PopupsAccount.html @@ -14,7 +14,7 @@
    -
    diff --git a/snappymail/v/0.0.0/app/templates/Views/User/PopupsAdvancedSearch.html b/snappymail/v/0.0.0/app/templates/Views/User/PopupsAdvancedSearch.html index 4a8dd039e..bb2087167 100644 --- a/snappymail/v/0.0.0/app/templates/Views/User/PopupsAdvancedSearch.html +++ b/snappymail/v/0.0.0/app/templates/Views/User/PopupsAdvancedSearch.html @@ -21,14 +21,14 @@ data-bind="value: subject">
    - +
    - +
    +
    + +
    +
    - +
    diff --git a/snappymail/v/0.0.0/app/templates/Views/User/PopupsSieveScript.html b/snappymail/v/0.0.0/app/templates/Views/User/PopupsSieveScript.html index bc03f5e79..8689cfb9c 100644 --- a/snappymail/v/0.0.0/app/templates/Views/User/PopupsSieveScript.html +++ b/snappymail/v/0.0.0/app/templates/Views/User/PopupsSieveScript.html @@ -70,7 +70,7 @@
    - + - + 💾 diff --git a/snappymail/v/0.0.0/app/templates/Views/User/SettingsFilters.html b/snappymail/v/0.0.0/app/templates/Views/User/SettingsFilters.html index 122a82472..9c44a6b3b 100644 --- a/snappymail/v/0.0.0/app/templates/Views/User/SettingsFilters.html +++ b/snappymail/v/0.0.0/app/templates/Views/User/SettingsFilters.html @@ -5,7 +5,7 @@
    -
    +
    diff --git a/snappymail/v/0.0.0/app/templates/Views/User/SettingsFolderItem.html b/snappymail/v/0.0.0/app/templates/Views/User/SettingsFolderItem.html index 2086f8a19..7588a4f10 100644 --- a/snappymail/v/0.0.0/app/templates/Views/User/SettingsFolderItem.html +++ b/snappymail/v/0.0.0/app/templates/Views/User/SettingsFolderItem.html @@ -19,9 +19,7 @@ diff --git a/snappymail/v/0.0.0/app/templates/Views/User/SettingsGeneral.html b/snappymail/v/0.0.0/app/templates/Views/User/SettingsGeneral.html index f62cb91fa..421a57079 100644 --- a/snappymail/v/0.0.0/app/templates/Views/User/SettingsGeneral.html +++ b/snappymail/v/0.0.0/app/templates/Views/User/SettingsGeneral.html @@ -24,19 +24,6 @@ } }"> -
    - -
    -
    @@ -78,6 +65,53 @@
    +
    +
    + +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    @@ -88,6 +122,19 @@
    +
    + +
    +
    node.getAttribute(k) === v); }, getClosest = ( node, root, selector ) => { - node = (!node || node.closest ? node : node.parentElement); + node = (node && !node.closest) ? node.parentElement : node; node = node && node.closest(selector); return (node && root.contains(node)) ? node : null; },
    - - - +