From bb581893521ae8df83c83141173184654813ae3f Mon Sep 17 00:00:00 2001 From: Dominik Schulz Date: Fri, 2 Jul 2021 12:28:51 +0200 Subject: [PATCH 01/72] Fix RestChangePasswordDriver The RestChangePasswordDriver had a few issues and wasn't useable. This commit fixes these issues. Signed-off-by: Dominik Schulz --- .../RestChangePasswordDriver.php | 14 ++++++++------ plugins/rest-change-password/index.php | 2 +- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/plugins/rest-change-password/RestChangePasswordDriver.php b/plugins/rest-change-password/RestChangePasswordDriver.php index 72a77fefb..cc7a2f41c 100644 --- a/plugins/rest-change-password/RestChangePasswordDriver.php +++ b/plugins/rest-change-password/RestChangePasswordDriver.php @@ -38,8 +38,8 @@ class RestChangePasswordDriver implements \RainLoop\Providers\ChangePassword\Cha private $oLogger = null; /** - * @param string $sHost - * @param int $iPort + * @param string $sUrl + * @param string $sKey * * @return \RestChangePasswordDriver */ @@ -51,8 +51,6 @@ class RestChangePasswordDriver implements \RainLoop\Providers\ChangePassword\Cha return $this; } - $oProvider->SetFieldNames($sFieldEmail, $sFieldOldpassword, $sFieldNewpassword); - /** * @param string $sFieldEmail * @param string $sFieldOldpassword @@ -120,12 +118,16 @@ class RestChangePasswordDriver implements \RainLoop\Providers\ChangePassword\Cha } $bResult = false; - if (!empty($this->sHost) && 0 < $this->iPort && $oAccount) + if (!empty($this->sUrl) && $oAccount) { $sEmail = \trim(\strtolower($oAccount->Email())); + $sUrl = $this->sUrl; # Adding the REST Api key to the url, try to use always https - $sUrl = str_replace('://', '://'+$this->sKey+"@", $this->sUrl); + if (!empty($this->sKey)) + { + $sUrl = str_replace('://', '://'+$this->sKey+"@", $this->sUrl); + } $iCode = 0; $oHttp = \MailSo\Base\Http::SingletonInstance(); diff --git a/plugins/rest-change-password/index.php b/plugins/rest-change-password/index.php index 63aeaa446..7fd973bfa 100644 --- a/plugins/rest-change-password/index.php +++ b/plugins/rest-change-password/index.php @@ -24,7 +24,7 @@ class RestChangePasswordPlugin extends \RainLoop\Plugins\AbstractPlugin $sFieldOldpassword = \trim($this->Config()->Get('plugin', 'rest_field_oldpassword', '')); $sFieldNewpassword = \trim($this->Config()->Get('plugin', 'rest_field_newpassword', '')); - if (!empty($sHost) && (!empty($sKey))) + if (!empty($sUrl)) { include_once __DIR__.'/RestChangePasswordDriver.php'; From 0a68512055d88f6d63226363288acf364e382cd5 Mon Sep 17 00:00:00 2001 From: Master3395 Date: Sun, 3 Oct 2021 02:41:14 +0200 Subject: [PATCH 02/72] Updated copyright for 2021 --- build/owncloud/rainloop-app/INSTALL | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/owncloud/rainloop-app/INSTALL b/build/owncloud/rainloop-app/INSTALL index 55e0ad3ee..c81264224 100755 --- a/build/owncloud/rainloop-app/INSTALL +++ b/build/owncloud/rainloop-app/INSTALL @@ -3,7 +3,7 @@ * ownCloud/Nextcloud - RainLoop Webmail package * * @author RainLoop Team -* @copyright 2019 RainLoop Team +* @copyright 2021 RainLoop Team * * https://github.com/RainLoop/rainloop-webmail/tree/master/build/owncloud * From b4fe7527a6c727da75fc680104b5c165a78d0f0e Mon Sep 17 00:00:00 2001 From: FreemoX Date: Fri, 17 Dec 2021 13:25:13 +0100 Subject: [PATCH 03/72] Update README Added more useful information regarding the usage of this plugin --- plugins/custom-login-mapping/README | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/plugins/custom-login-mapping/README b/plugins/custom-login-mapping/README index 39aafa739..e260527b2 100644 --- a/plugins/custom-login-mapping/README +++ b/plugins/custom-login-mapping/README @@ -1 +1,8 @@ -Plugin which allows you to set up custom username (login) by email address \ No newline at end of file +Plugin which allows you to set up custom username (login) by email address. + +Some mail servers use arbitrary usernames for logging in to the email service. +This plugin replaces pre-@ email address with the predefined username for logging in. + +Usage: : +Example: bob.jackson@mydomain.com:mydomain3 +By doing the above, users can log in with "bob.jackson@mydomain.com" instead of "mydomain3@mydomain.com" From 18dc2889cef9d3b1846ac29603873136c3aeca57 Mon Sep 17 00:00:00 2001 From: the-djmaze <> Date: Wed, 3 Aug 2022 11:06:09 +0200 Subject: [PATCH 04/72] Cleanup folder handling a bit --- dev/Settings/User/Folders.js | 10 +--------- dev/Stores/User/Folder.js | 6 +++--- dev/View/Popup/FolderSystem.js | 2 +- dev/View/User/MailBox/FolderList.js | 4 +--- .../0.0.0/app/templates/Views/User/MailFolderList.html | 4 ++-- vendors/fontastic/styles.css | 4 ++-- 6 files changed, 10 insertions(+), 20 deletions(-) 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/Stores/User/Folder.js b/dev/Stores/User/Folder.js index ba9e3512e..d92d447cd 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,8 +74,8 @@ 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 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/User/MailBox/FolderList.js b/dev/View/User/MailBox/FolderList.js index 7b05be5b5..cc6345827 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; diff --git a/snappymail/v/0.0.0/app/templates/Views/User/MailFolderList.html b/snappymail/v/0.0.0/app/templates/Views/User/MailFolderList.html index 0f540a3b3..7d480a68d 100644 --- a/snappymail/v/0.0.0/app/templates/Views/User/MailFolderList.html +++ b/snappymail/v/0.0.0/app/templates/Views/User/MailFolderList.html @@ -7,7 +7,7 @@ 📇 diff --git a/vendors/fontastic/styles.css b/vendors/fontastic/styles.css index 27bfeee6d..e24d71924 100644 --- a/vendors/fontastic/styles.css +++ b/vendors/fontastic/styles.css @@ -68,10 +68,10 @@ content: "\e033"; } .icon-file-text::before { - content: "\e034"; + content: "\e034"; /* 🖹 | 🖺 */ } .icon-file-image::before { - content: "\e036"; + content: "\e036"; /* 🖻 */ } .icon-file-certificate::before { content: "\e038"; From 9bd3049ba020b5b69455b5e21fdcb83efc3d828c Mon Sep 17 00:00:00 2001 From: the-djmaze <> Date: Wed, 3 Aug 2022 12:03:34 +0200 Subject: [PATCH 05/72] Added: search for "replied" yes/no --- dev/View/Popup/AdvancedSearch.js | 21 +++++++++- .../libraries/MailSo/Imap/SearchCriterias.php | 4 +- .../v/0.0.0/app/localization/ar-SA/user.json | 39 ++++++++++--------- .../v/0.0.0/app/localization/bg-BG/user.json | 39 ++++++++++--------- .../v/0.0.0/app/localization/cs-CZ/user.json | 39 ++++++++++--------- .../v/0.0.0/app/localization/da-DK/user.json | 39 ++++++++++--------- .../v/0.0.0/app/localization/de-DE/user.json | 39 ++++++++++--------- .../v/0.0.0/app/localization/el-GR/user.json | 39 ++++++++++--------- .../v/0.0.0/app/localization/en-GB/user.json | 39 ++++++++++--------- .../v/0.0.0/app/localization/en/user.json | 39 ++++++++++--------- .../v/0.0.0/app/localization/es-ES/user.json | 39 ++++++++++--------- .../v/0.0.0/app/localization/et-EE/user.json | 39 ++++++++++--------- .../v/0.0.0/app/localization/fa-IR/user.json | 39 ++++++++++--------- .../v/0.0.0/app/localization/fi-FI/user.json | 39 ++++++++++--------- .../v/0.0.0/app/localization/fr-FR/user.json | 39 ++++++++++--------- .../v/0.0.0/app/localization/hu-HU/user.json | 39 ++++++++++--------- .../v/0.0.0/app/localization/id-ID/user.json | 39 ++++++++++--------- .../v/0.0.0/app/localization/is-IS/user.json | 39 ++++++++++--------- .../v/0.0.0/app/localization/it-IT/user.json | 39 ++++++++++--------- .../v/0.0.0/app/localization/ja-JP/user.json | 39 ++++++++++--------- .../v/0.0.0/app/localization/ko-KR/user.json | 39 ++++++++++--------- .../v/0.0.0/app/localization/lt-LT/user.json | 39 ++++++++++--------- .../v/0.0.0/app/localization/lv-LV/user.json | 39 ++++++++++--------- .../v/0.0.0/app/localization/nb-NO/user.json | 39 ++++++++++--------- .../v/0.0.0/app/localization/nl-NL/user.json | 39 ++++++++++--------- .../v/0.0.0/app/localization/pl-PL/user.json | 39 ++++++++++--------- .../v/0.0.0/app/localization/pt-BR/user.json | 39 ++++++++++--------- .../v/0.0.0/app/localization/pt-PT/user.json | 39 ++++++++++--------- .../v/0.0.0/app/localization/pt/user.json | 39 ++++++++++--------- .../v/0.0.0/app/localization/ro-RO/user.json | 39 ++++++++++--------- .../v/0.0.0/app/localization/ru-RU/user.json | 39 ++++++++++--------- .../v/0.0.0/app/localization/sk-SK/user.json | 39 ++++++++++--------- .../v/0.0.0/app/localization/sl-SI/user.json | 39 ++++++++++--------- .../v/0.0.0/app/localization/sv-SE/user.json | 39 ++++++++++--------- .../v/0.0.0/app/localization/tr-TR/user.json | 39 ++++++++++--------- .../v/0.0.0/app/localization/uk-UA/user.json | 39 ++++++++++--------- .../v/0.0.0/app/localization/vi-VN/user.json | 39 ++++++++++--------- .../v/0.0.0/app/localization/zh-CN/user.json | 39 ++++++++++--------- .../v/0.0.0/app/localization/zh-TW/user.json | 39 ++++++++++--------- .../Views/User/PopupsAdvancedSearch.html | 24 +++++++++--- 40 files changed, 816 insertions(+), 676 deletions(-) diff --git a/dev/View/Popup/AdvancedSearch.js b/dev/View/Popup/AdvancedSearch.js index 74800a7ed..220d12477 100644 --- a/dev/View/Popup/AdvancedSearch.js +++ b/dev/View/Popup/AdvancedSearch.js @@ -16,6 +16,7 @@ export class AdvancedSearchPopupView extends AbstractViewPopup { to: '', subject: '', text: '', + repliedValue: -1, selectedDateValue: -1, selectedTreeValue: '', @@ -26,9 +27,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 +52,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') }, @@ -105,6 +115,12 @@ export class AdvancedSearchPopupView extends AbstractViewPopup { if (this.starred()) { result += '&flagged'; } + if (1 == this.repliedValue()) { + result += '&answered'; + } + if (0 == this.repliedValue()) { + result += '&unanswered'; + } return result.replace(/^&+/, ''); } @@ -115,6 +131,7 @@ export class AdvancedSearchPopupView extends AbstractViewPopup { this.subject(''); this.text(''); + this.repliedValue(-1); this.selectedDateValue(-1); this.hasAttachment(false); this.starred(false); 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..17e02a409 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 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..5b90cd02f 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 @@ -28,7 +28,9 @@ "SUBJECT": "الموضوع", "TEST": "تجريب", "TO": "الى", - "SERVER_MESSAGE": "Server message" + "SERVER_MESSAGE": "Server message", + "YES": "نعم", + "NO": "لا" }, "LOGIN": { "LABEL_LOGIN": "تسيجيل الدخول", @@ -46,23 +48,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": "Replied" }, "PREVIEW_POPUP": { "FULLSCREEN": "إعداد افتراضي لوضع ملء الشاشة", 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..65164cac9 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 @@ -28,7 +28,9 @@ "SUBJECT": "Заглавие", "TEST": "Тест", "TO": "До", - "SERVER_MESSAGE": "Server message" + "SERVER_MESSAGE": "Server message", + "YES": "Да", + "NO": "Не" }, "LOGIN": { "LABEL_LOGIN": "Логин", @@ -46,23 +48,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": "Replied" }, "PREVIEW_POPUP": { "FULLSCREEN": "На цял екран", 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..4c3d27b3e 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 @@ -28,7 +28,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 +48,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": "Replied" }, "PREVIEW_POPUP": { "FULLSCREEN": "Celá obrazovka", 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..c4e198d08 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 @@ -28,7 +28,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 +48,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": "Replied" }, "PREVIEW_POPUP": { "FULLSCREEN": "Fuld skærm", 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..4489e0b4f 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 @@ -28,7 +28,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 +48,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": "Replied" }, "PREVIEW_POPUP": { "FULLSCREEN": "Vollbild umschalten", 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..7f73b1d5e 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 @@ -28,7 +28,9 @@ "SUBJECT": "Θέμα", "TEST": "Τεστ", "TO": "Προς", - "SERVER_MESSAGE": "Server message" + "SERVER_MESSAGE": "Server message", + "YES": "Ναι", + "NO": "Όχι" }, "LOGIN": { "LABEL_LOGIN": "Είσοδος", @@ -46,23 +48,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": "Replied" }, "PREVIEW_POPUP": { "FULLSCREEN": "Ενναλαγή πλήρους οθόνης", 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..3a5d78fc0 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 @@ -28,7 +28,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 +48,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": "Replied" }, "PREVIEW_POPUP": { "FULLSCREEN": "Toggle fullscreen", 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..b09b6cac9 100644 --- a/snappymail/v/0.0.0/app/localization/en/user.json +++ b/snappymail/v/0.0.0/app/localization/en/user.json @@ -28,7 +28,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 +48,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": "Replied" }, "PREVIEW_POPUP": { "FULLSCREEN": "Toggle fullscreen", 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..2b10e214b 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 @@ -28,7 +28,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 +48,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": "Replied" }, "PREVIEW_POPUP": { "FULLSCREEN": "Cambiar a pantalla completa", 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..6c5a4e198 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 @@ -28,7 +28,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 +48,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": "Replied" }, "PREVIEW_POPUP": { "FULLSCREEN": "Täisekraan sisse\/välja", 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..ff2064047 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 @@ -28,7 +28,9 @@ "SUBJECT": "موضوع", "TEST": "تست", "TO": "به", - "SERVER_MESSAGE": "Server message" + "SERVER_MESSAGE": "Server message", + "YES": "بلی", + "NO": "خیر" }, "LOGIN": { "LABEL_LOGIN": "ورود", @@ -46,23 +48,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": "Replied" }, "PREVIEW_POPUP": { "FULLSCREEN": "ضامن تمام صفحه", 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..8f30ac211 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 @@ -28,7 +28,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 +48,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": "Replied" }, "PREVIEW_POPUP": { "FULLSCREEN": "Koko ruutu", 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..431bdcafd 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 @@ -28,7 +28,9 @@ "SUBJECT": "Sujet", "TEST": "Test", "TO": "À", - "SERVER_MESSAGE": "Server message" + "SERVER_MESSAGE": "Server message", + "YES": "Oui", + "NO": "Non" }, "LOGIN": { "LABEL_LOGIN": "Identifiant", @@ -46,23 +48,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": "Replied" }, "PREVIEW_POPUP": { "FULLSCREEN": "Basculer en plein écran", 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..b2cc331e2 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 @@ -28,7 +28,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 +48,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": "Replied" }, "PREVIEW_POPUP": { "FULLSCREEN": "Teljes képernyő váltása", 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..1521b55b2 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 @@ -28,7 +28,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 +48,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": "Replied" }, "PREVIEW_POPUP": { "FULLSCREEN": "Beralih ke layar penuh", 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..9233a9cf3 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 @@ -28,7 +28,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 +48,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": "Replied" }, "PREVIEW_POPUP": { "FULLSCREEN": "Víxla heilskjá af\/á", 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..33b343a39 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 @@ -28,7 +28,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 +48,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": "Replied" }, "PREVIEW_POPUP": { "FULLSCREEN": "Passa a schermo intero", 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..ee5aaddb7 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 @@ -28,7 +28,9 @@ "SUBJECT": "件名", "TEST": "テスト", "TO": "宛先", - "SERVER_MESSAGE": "Server message" + "SERVER_MESSAGE": "Server message", + "YES": "はい", + "NO": "いいえ" }, "LOGIN": { "LABEL_LOGIN": "ログイン", @@ -46,23 +48,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": "Replied" }, "PREVIEW_POPUP": { "FULLSCREEN": "フルスクリーン", 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..59d961444 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 @@ -28,7 +28,9 @@ "SUBJECT": "제목", "TEST": "테스트", "TO": "받는 사람", - "SERVER_MESSAGE": "Server message" + "SERVER_MESSAGE": "Server message", + "YES": "예", + "NO": "아니요" }, "LOGIN": { "LABEL_LOGIN": "아이디", @@ -46,23 +48,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": "Replied" }, "PREVIEW_POPUP": { "FULLSCREEN": "전체화면으로 보기", 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..076b8e63d 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 @@ -28,7 +28,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 +48,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": "Replied" }, "PREVIEW_POPUP": { "FULLSCREEN": "Perjungti viso ekrano režimą", 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..ee0a7fe61 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 @@ -28,7 +28,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 +48,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": "Replied" }, "PREVIEW_POPUP": { "FULLSCREEN": "Toggle fullscreen", 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..4b3d0ff12 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 @@ -28,7 +28,9 @@ "SUBJECT": "Emne", "TEST": "Test", "TO": "Til", - "SERVER_MESSAGE": "Tjenermelding" + "SERVER_MESSAGE": "Tjenermelding", + "YES": "Ja", + "NO": "Nei" }, "LOGIN": { "LABEL_LOGIN": "Logg inn", @@ -46,23 +48,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": "Replied" }, "PREVIEW_POPUP": { "FULLSCREEN": "Fullskjerm av\/på", 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..0d74f6de1 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 @@ -28,7 +28,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 +48,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": "Replied" }, "PREVIEW_POPUP": { "FULLSCREEN": "Schakel volledig scherm in\/uit", 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..5b2bb57f7 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 @@ -28,7 +28,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 +48,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": "Replied" }, "PREVIEW_POPUP": { "FULLSCREEN": "Pełny ekran", 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..928ca1268 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 @@ -28,7 +28,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 +48,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": "Replied" }, "PREVIEW_POPUP": { "FULLSCREEN": "Em tela cheia", 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..913707ce8 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 @@ -28,7 +28,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 +48,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": "Replied" }, "PREVIEW_POPUP": { "FULLSCREEN": "Alternar ecrã-inteiro", 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..913707ce8 100644 --- a/snappymail/v/0.0.0/app/localization/pt/user.json +++ b/snappymail/v/0.0.0/app/localization/pt/user.json @@ -28,7 +28,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 +48,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": "Replied" }, "PREVIEW_POPUP": { "FULLSCREEN": "Alternar ecrã-inteiro", 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..6bd78220f 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 @@ -28,7 +28,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 +48,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": "Replied" }, "PREVIEW_POPUP": { "FULLSCREEN": "Toggle fullscreen", 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..ac9eb29b4 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 @@ -28,7 +28,9 @@ "SUBJECT": "Тема", "TEST": "Тест", "TO": "Кому", - "SERVER_MESSAGE": "Server message" + "SERVER_MESSAGE": "Server message", + "YES": "Да", + "NO": "Нет" }, "LOGIN": { "LABEL_LOGIN": "Логин", @@ -46,23 +48,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": "Replied" }, "PREVIEW_POPUP": { "FULLSCREEN": "Полный экран", 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..c17ecfef2 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 @@ -28,7 +28,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 +48,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": "Replied" }, "PREVIEW_POPUP": { "FULLSCREEN": "Prepnúť na celú obrazovku", 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..52ea0a50b 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 @@ -28,7 +28,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 +48,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": "Replied" }, "PREVIEW_POPUP": { "FULLSCREEN": "Preklopi celozaslonski pogled", 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..c49fea297 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 @@ -28,7 +28,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 +48,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": "Replied" }, "PREVIEW_POPUP": { "FULLSCREEN": "Växla fullskärmsläge", 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..3044567f8 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 @@ -28,7 +28,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 +48,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": "Replied" }, "PREVIEW_POPUP": { "FULLSCREEN": "Toggle fullscreen", 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..180f31a95 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 @@ -28,7 +28,9 @@ "SUBJECT": "Тема", "TEST": "Тест", "TO": "Кому", - "SERVER_MESSAGE": "Server message" + "SERVER_MESSAGE": "Server message", + "YES": "Так", + "NO": "Ні" }, "LOGIN": { "LABEL_LOGIN": "Логін", @@ -46,23 +48,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": "Replied" }, "PREVIEW_POPUP": { "FULLSCREEN": "Toggle fullscreen", 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..98bcbaf39 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 @@ -28,7 +28,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 +48,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": "Replied" }, "PREVIEW_POPUP": { "FULLSCREEN": "Đóng\/mở toàn màn hình", 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..44936e4df 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 @@ -28,7 +28,9 @@ "SUBJECT": "主题", "TEST": "测试", "TO": "发送到", - "SERVER_MESSAGE": "Server message" + "SERVER_MESSAGE": "Server message", + "YES": "是", + "NO": "否" }, "LOGIN": { "LABEL_LOGIN": "登录", @@ -46,23 +48,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": "Replied" }, "PREVIEW_POPUP": { "FULLSCREEN": "切换全屏", 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..cd16b4713 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 @@ -28,7 +28,9 @@ "SUBJECT": "主題", "TEST": "測試", "TO": "發送到", - "SERVER_MESSAGE": "Server message" + "SERVER_MESSAGE": "Server message", + "YES": "是", + "NO": "否" }, "LOGIN": { "LABEL_LOGIN": "登錄", @@ -46,23 +48,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": "Replied" }, "PREVIEW_POPUP": { "FULLSCREEN": "Toggle fullscreen", 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">
- +
- +
+
+ +
+
- +
From 9559986499bbd34d28022e7c6ff3e20fafb70a09 Mon Sep 17 00:00:00 2001 From: the-djmaze <> Date: Wed, 3 Aug 2022 22:23:32 +0200 Subject: [PATCH 06/72] Bugfix/Improved AdvancedSearch popup by prefill the values --- dev/View/Popup/AdvancedSearch.js | 73 ++++++++----------- .../libraries/MailSo/Imap/SearchCriterias.php | 4 +- 2 files changed, 33 insertions(+), 44 deletions(-) diff --git a/dev/View/Popup/AdvancedSearch.js b/dev/View/Popup/AdvancedSearch.js index 220d12477..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'; @@ -70,55 +71,38 @@ 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 == this.repliedValue()) { + if (1 == self.repliedValue()) { result += '&answered'; } - if (0 == this.repliedValue()) { + if (0 == self.repliedValue()) { result += '&unanswered'; } @@ -126,17 +110,22 @@ export class AdvancedSearchPopupView extends AbstractViewPopup { } onShow(search) { - this.from(''); - this.to(''); - this.subject(''); - this.text(''); - - this.repliedValue(-1); - 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/snappymail/v/0.0.0/app/libraries/MailSo/Imap/SearchCriterias.php b/snappymail/v/0.0.0/app/libraries/MailSo/Imap/SearchCriterias.php index 17e02a409..2976d511a 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 @@ -387,7 +387,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('/".*?(? Date: Thu, 4 Aug 2022 12:18:07 +0200 Subject: [PATCH 07/72] Improved mailbox handling of empty message subject and messagelist folder detection --- dev/Model/Message.js | 1 - dev/Screen/User/MailBox.js | 10 ++- dev/Styles/User/MessageList.less | 10 +-- dev/Styles/User/MessageView.less | 12 ++-- dev/View/User/MailBox/MessageList.js | 66 +++++++------------ .../v/0.0.0/app/localization/en/user.json | 1 - .../templates/Views/User/MailMessageList.html | 24 +++---- .../templates/Views/User/MailMessageView.html | 5 +- 8 files changed, 56 insertions(+), 73 deletions(-) diff --git a/dev/Model/Message.js b/dev/Model/Message.js index 4c19e1826..252e0a039 100644 --- a/dev/Model/Message.js +++ b/dev/Model/Message.js @@ -375,7 +375,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() diff --git a/dev/Screen/User/MailBox.js b/dev/Screen/User/MailBox.js index 851e23ff4..b40134792 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, 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/User/MailBox/MessageList.js b/dev/View/User/MailBox/MessageList.js index b023e0c95..f963189f3 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, @@ -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() { @@ -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()) { @@ -778,7 +760,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/snappymail/v/0.0.0/app/localization/en/user.json b/snappymail/v/0.0.0/app/localization/en/user.json index b09b6cac9..fe4dc8ae9 100644 --- a/snappymail/v/0.0.0/app/localization/en/user.json +++ b/snappymail/v/0.0.0/app/localization/en/user.json @@ -107,7 +107,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%", 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..79f568b16 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 @@ -120,13 +120,12 @@
-
+
! - - + ×
From b5920cbc3220caa0e4080e02314801e6743bbd39 Mon Sep 17 00:00:00 2001 From: the-djmaze <> Date: Thu, 4 Aug 2022 13:24:30 +0200 Subject: [PATCH 08/72] Improved domains `.ini` files handling --- .../Providers/Domain/DefaultDomain.php | 118 ++++++++---------- snappymail/v/0.0.0/setup.php | 23 ++-- 2 files changed, 64 insertions(+), 77 deletions(-) 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/setup.php b/snappymail/v/0.0.0/setup.php index c8186e54e..b80ca7d18 100644 --- a/snappymail/v/0.0.0/setup.php +++ b/snappymail/v/0.0.0/setup.php @@ -142,22 +142,25 @@ if (defined('APP_VERSION')) if (!file_exists(APP_PRIVATE_DATA.'domains/disabled') && is_dir(APP_PRIVATE_DATA.'domains')) { - $sFile = $sNewFile = ''; $aFiles = glob(APP_VERSION_ROOT_PATH.'app/domains/*'); - if ($aFiles) - { - foreach ($aFiles as $sFile) - { - if (is_file($sFile)) - { + if ($aFiles) { + foreach ($aFiles as $sFile) { + if (is_file($sFile)) { $sNewFile = APP_PRIVATE_DATA.'domains/'.basename($sFile); - if (!file_exists($sNewFile)) - { + if (!file_exists($sNewFile)) { copy($sFile, $sNewFile); } } } } - unset($aFiles, $sFile, $sNewFile); + /* + $sNewFile = APP_PRIVATE_DATA.'domains/'.gethostname().'.ini'; + if (!file_exists($sNewFile)) { + \file_put_contents( + $sNewFile, + \str_replace('short_login = Off', 'short_login = On', \file_get_contents(APP_VERSION_ROOT_PATH.'app/domains/default.ini')) + ); + } + */ } } From db95565b703ef0a9a6f343a90ea5201e1cc7136b Mon Sep 17 00:00:00 2001 From: the-djmaze <> Date: Thu, 4 Aug 2022 14:08:58 +0200 Subject: [PATCH 09/72] Cleanup some localications and added Esperanto --- dev/Settings/User/Contacts.js | 7 +++---- dev/View/Popup/Ask.js | 4 ++-- snappymail/v/0.0.0/app/localization/ar-SA/user.json | 7 +------ snappymail/v/0.0.0/app/localization/bg-BG/user.json | 7 +------ snappymail/v/0.0.0/app/localization/cs-CZ/user.json | 7 +------ snappymail/v/0.0.0/app/localization/da-DK/user.json | 7 +------ snappymail/v/0.0.0/app/localization/de-DE/user.json | 7 +------ snappymail/v/0.0.0/app/localization/el-GR/user.json | 7 +------ snappymail/v/0.0.0/app/localization/en-GB/user.json | 7 +------ snappymail/v/0.0.0/app/localization/en/user.json | 6 +----- snappymail/v/0.0.0/app/localization/es-ES/user.json | 7 +------ snappymail/v/0.0.0/app/localization/et-EE/user.json | 7 +------ snappymail/v/0.0.0/app/localization/fa-IR/user.json | 7 +------ snappymail/v/0.0.0/app/localization/fi-FI/user.json | 7 +------ snappymail/v/0.0.0/app/localization/fr-FR/user.json | 7 +------ snappymail/v/0.0.0/app/localization/hu-HU/user.json | 7 +------ snappymail/v/0.0.0/app/localization/id-ID/user.json | 7 +------ snappymail/v/0.0.0/app/localization/is-IS/user.json | 7 +------ snappymail/v/0.0.0/app/localization/it-IT/user.json | 7 +------ snappymail/v/0.0.0/app/localization/ja-JP/user.json | 7 +------ snappymail/v/0.0.0/app/localization/ko-KR/user.json | 7 +------ snappymail/v/0.0.0/app/localization/langs.json | 2 ++ snappymail/v/0.0.0/app/localization/lt-LT/user.json | 7 +------ snappymail/v/0.0.0/app/localization/lv-LV/user.json | 7 +------ snappymail/v/0.0.0/app/localization/nb-NO/user.json | 7 +------ snappymail/v/0.0.0/app/localization/nl-NL/user.json | 7 +------ snappymail/v/0.0.0/app/localization/pl-PL/user.json | 7 +------ snappymail/v/0.0.0/app/localization/pt-BR/user.json | 7 +------ snappymail/v/0.0.0/app/localization/pt-PT/user.json | 7 +------ snappymail/v/0.0.0/app/localization/pt/user.json | 7 +------ snappymail/v/0.0.0/app/localization/ro-RO/user.json | 7 +------ snappymail/v/0.0.0/app/localization/ru-RU/user.json | 7 +------ snappymail/v/0.0.0/app/localization/sk-SK/user.json | 7 +------ snappymail/v/0.0.0/app/localization/sl-SI/user.json | 7 +------ snappymail/v/0.0.0/app/localization/sv-SE/user.json | 7 +------ snappymail/v/0.0.0/app/localization/tr-TR/user.json | 7 +------ snappymail/v/0.0.0/app/localization/uk-UA/user.json | 7 +------ snappymail/v/0.0.0/app/localization/vi-VN/user.json | 7 +------ snappymail/v/0.0.0/app/localization/zh-CN/user.json | 7 +------ snappymail/v/0.0.0/app/localization/zh-TW/user.json | 7 +------ 40 files changed, 44 insertions(+), 227 deletions(-) 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/View/Popup/Ask.js b/dev/View/Popup/Ask.js index ae1f8388e..680139f49 100644 --- a/dev/View/Popup/Ask.js +++ b/dev/View/Popup/Ask.js @@ -44,8 +44,8 @@ export class AskPopupView extends AbstractViewPopup { this.askDesc(sAskDesc || ''); this.askPass(askPass); 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(askPass ? 'GLOBAL/CANCEL' : 'GLOBAL/NO')); this.fYesAction = fYesFunc; this.fNoAction = fNoFunc; this.focusOnShow = focusOnShow ? (askPass ? 'input[type="password"]' : '.buttonYes') : ''; 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 5b90cd02f..e9cf30be6 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 @@ -65,7 +65,7 @@ "LABEL_SUBFOLDERS_NONE": "None", "LABEL_SUBFOLDERS_SUBTREE": "All", "LABEL_SUBFOLDERS_SUBTREE_ONE": "One level", - "LABEL_REPLIED": "Replied" + "LABEL_REPLIED": "أجاب" }, "PREVIEW_POPUP": { "FULLSCREEN": "إعداد افتراضي لوضع ملء الشاشة", @@ -107,7 +107,6 @@ "EMPTY_SEARCH_LIST": "ليست هناك أية رسائل تطابق بحثك.", "SEARCH_RESULT_FOR": "نتيجة البحث لـ \"%SEARCH%\"", "BACK_TO_MESSAGE_LIST": "العودة الى قائمة الرسائل", - "EMPTY_SUBJECT_TEXT": "(لايوجدموضوع)", "PUT_MESSAGE_HERE": "حرك الرسالة الى هنا.. لكي تراها في قائمة الرسائل", "TODAY_AT": "اليوم عند %TIME%", "YESTERDAY_AT": "البارحة عند %TIME%", @@ -227,8 +226,6 @@ "BUTTON_REQUEST_DSN": "اطلب اعلاماً بايصال البريد" }, "POPUPS_ASK": { - "BUTTON_YES": "نعم", - "BUTTON_NO": "لا", "DESC_WANT_CLOSE_THIS_WINDOW": "هل أنت متأكد من رغبتك باغلاق هذه النافذة؟", "DESC_WANT_DELETE_MESSAGES": "هل أنت متأكد من رغبتك بحذف هذه الرسائل؟" }, @@ -418,8 +415,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 65164cac9..b2f3911fa 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 @@ -65,7 +65,7 @@ "LABEL_SUBFOLDERS_NONE": "None", "LABEL_SUBFOLDERS_SUBTREE": "All", "LABEL_SUBFOLDERS_SUBTREE_ONE": "One level", - "LABEL_REPLIED": "Replied" + "LABEL_REPLIED": "Отговорено" }, "PREVIEW_POPUP": { "FULLSCREEN": "На цял екран", @@ -107,7 +107,6 @@ "EMPTY_SEARCH_LIST": "Няма съобщения, които да отговарят на търсенето.", "SEARCH_RESULT_FOR": "Резултати от търсенето за \"%SEARCH%\"", "BACK_TO_MESSAGE_LIST": "Обратно при съобщенията", - "EMPTY_SUBJECT_TEXT": "(Няма заглавие)", "PUT_MESSAGE_HERE": "Пуснете съобщението тук, за да го видите в списъка", "TODAY_AT": "днес в %TIME%", "YESTERDAY_AT": "вчера в %TIME%", @@ -227,8 +226,6 @@ "BUTTON_REQUEST_DSN": "Уведомяване при доставка" }, "POPUPS_ASK": { - "BUTTON_YES": "Да", - "BUTTON_NO": "Не", "DESC_WANT_CLOSE_THIS_WINDOW": "Сигурни ли сте, че желаете да затворите този прозорец?", "DESC_WANT_DELETE_MESSAGES": "Сигурни ли сте, че желаете да изтриете съобщението\/съобщенията?" }, @@ -418,8 +415,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/user.json b/snappymail/v/0.0.0/app/localization/cs-CZ/user.json index 4c3d27b3e..e78d1a732 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 @@ -65,7 +65,7 @@ "LABEL_SUBFOLDERS_NONE": "None", "LABEL_SUBFOLDERS_SUBTREE": "All", "LABEL_SUBFOLDERS_SUBTREE_ONE": "One level", - "LABEL_REPLIED": "Replied" + "LABEL_REPLIED": "Odpovězeno" }, "PREVIEW_POPUP": { "FULLSCREEN": "Celá obrazovka", @@ -107,7 +107,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%", @@ -227,8 +226,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?" }, @@ -418,8 +415,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/user.json b/snappymail/v/0.0.0/app/localization/da-DK/user.json index c4e198d08..a2c73afd7 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 @@ -65,7 +65,7 @@ "LABEL_SUBFOLDERS_NONE": "None", "LABEL_SUBFOLDERS_SUBTREE": "All", "LABEL_SUBFOLDERS_SUBTREE_ONE": "One level", - "LABEL_REPLIED": "Replied" + "LABEL_REPLIED": "Besvarede" }, "PREVIEW_POPUP": { "FULLSCREEN": "Fuld skærm", @@ -107,7 +107,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%", @@ -227,8 +226,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)?" }, @@ -418,8 +415,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/user.json b/snappymail/v/0.0.0/app/localization/de-DE/user.json index 4489e0b4f..193808512 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 @@ -65,7 +65,7 @@ "LABEL_SUBFOLDERS_NONE": "Keine", "LABEL_SUBFOLDERS_SUBTREE": "Alle", "LABEL_SUBFOLDERS_SUBTREE_ONE": "One level", - "LABEL_REPLIED": "Replied" + "LABEL_REPLIED": "Antwortete" }, "PREVIEW_POPUP": { "FULLSCREEN": "Vollbild umschalten", @@ -107,7 +107,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%", @@ -227,8 +226,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?" }, @@ -418,8 +415,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 7f73b1d5e..26b2f5d4c 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 @@ -65,7 +65,7 @@ "LABEL_SUBFOLDERS_NONE": "None", "LABEL_SUBFOLDERS_SUBTREE": "All", "LABEL_SUBFOLDERS_SUBTREE_ONE": "One level", - "LABEL_REPLIED": "Replied" + "LABEL_REPLIED": "Απάντησε" }, "PREVIEW_POPUP": { "FULLSCREEN": "Ενναλαγή πλήρους οθόνης", @@ -107,7 +107,6 @@ "EMPTY_SEARCH_LIST": "Δεν υπάρχουν μηνύματα που να ταιριάζουν στην αναζήτηση.", "SEARCH_RESULT_FOR": "Αποτελέσματα αναζήτησης για \"%SEARCH%\"", "BACK_TO_MESSAGE_LIST": "πίσω στη λίστα των μηνυμάτων", - "EMPTY_SUBJECT_TEXT": "(Κανένα θέμα)", "PUT_MESSAGE_HERE": "Σύρετε εδώ το μήνυμα για να φανεί στη λίστα", "TODAY_AT": "σήμερα στις %TIME%", "YESTERDAY_AT": "εχθές στις %TIME% ", @@ -227,8 +226,6 @@ "BUTTON_REQUEST_DSN": "Ζητήστε αποδεικτικό παράδοσης" }, "POPUPS_ASK": { - "BUTTON_YES": "Ναι", - "BUTTON_NO": "Όχι", "DESC_WANT_CLOSE_THIS_WINDOW": "Είστε σίγουροι πως θέλετε να κλείσετε αυτό το παράθυρο;", "DESC_WANT_DELETE_MESSAGES": "Είστε σίγουροι πως θέλετε να διαγράψετε το (τα) μήνυμα(τα);" }, @@ -418,8 +415,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 3a5d78fc0..ac9abce8d 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 @@ -65,7 +65,7 @@ "LABEL_SUBFOLDERS_NONE": "None", "LABEL_SUBFOLDERS_SUBTREE": "All", "LABEL_SUBFOLDERS_SUBTREE_ONE": "One level", - "LABEL_REPLIED": "Replied" + "LABEL_REPLIED": "Answered" }, "PREVIEW_POPUP": { "FULLSCREEN": "Toggle fullscreen", @@ -107,7 +107,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%", @@ -227,8 +226,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)?" }, @@ -418,8 +415,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/user.json b/snappymail/v/0.0.0/app/localization/en/user.json index fe4dc8ae9..6f40b748e 100644 --- a/snappymail/v/0.0.0/app/localization/en/user.json +++ b/snappymail/v/0.0.0/app/localization/en/user.json @@ -65,7 +65,7 @@ "LABEL_SUBFOLDERS_NONE": "None", "LABEL_SUBFOLDERS_SUBTREE": "All", "LABEL_SUBFOLDERS_SUBTREE_ONE": "One level", - "LABEL_REPLIED": "Replied" + "LABEL_REPLIED": "Answered" }, "PREVIEW_POPUP": { "FULLSCREEN": "Toggle fullscreen", @@ -226,8 +226,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)?" }, @@ -417,8 +415,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/user.json b/snappymail/v/0.0.0/app/localization/es-ES/user.json index 2b10e214b..0392437c8 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 @@ -65,7 +65,7 @@ "LABEL_SUBFOLDERS_NONE": "None", "LABEL_SUBFOLDERS_SUBTREE": "All", "LABEL_SUBFOLDERS_SUBTREE_ONE": "One level", - "LABEL_REPLIED": "Replied" + "LABEL_REPLIED": "Contestada" }, "PREVIEW_POPUP": { "FULLSCREEN": "Cambiar a pantalla completa", @@ -107,7 +107,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%", @@ -227,8 +226,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?" }, @@ -418,8 +415,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 6c5a4e198..c84999bba 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 @@ -65,7 +65,7 @@ "LABEL_SUBFOLDERS_NONE": "None", "LABEL_SUBFOLDERS_SUBTREE": "All", "LABEL_SUBFOLDERS_SUBTREE_ONE": "One level", - "LABEL_REPLIED": "Replied" + "LABEL_REPLIED": "Vastatud" }, "PREVIEW_POPUP": { "FULLSCREEN": "Täisekraan sisse\/välja", @@ -107,7 +107,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%", @@ -227,8 +226,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?" }, @@ -418,8 +415,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/user.json b/snappymail/v/0.0.0/app/localization/fa-IR/user.json index ff2064047..1480d191a 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 @@ -65,7 +65,7 @@ "LABEL_SUBFOLDERS_NONE": "None", "LABEL_SUBFOLDERS_SUBTREE": "All", "LABEL_SUBFOLDERS_SUBTREE_ONE": "One level", - "LABEL_REPLIED": "Replied" + "LABEL_REPLIED": "جواب داد" }, "PREVIEW_POPUP": { "FULLSCREEN": "ضامن تمام صفحه", @@ -107,7 +107,6 @@ "EMPTY_SEARCH_LIST": "پیامی مطابق جستجوی شما پیدا نشد", "SEARCH_RESULT_FOR": "نتایج جستجو مطابق \"%SEARCH%\"", "BACK_TO_MESSAGE_LIST": "برگشت به لیست پیام‌ها", - "EMPTY_SUBJECT_TEXT": "(بدون موضوع)", "PUT_MESSAGE_HERE": "برای دیدن پیام در این لیست آن را به اینجا بکشید", "TODAY_AT": "امروز در %TIME%", "YESTERDAY_AT": " دیروز در %TIME%", @@ -227,8 +226,6 @@ "BUTTON_REQUEST_DSN": "درخواست دریافت رسید تحویل درمقصد" }, "POPUPS_ASK": { - "BUTTON_YES": "بلی", - "BUTTON_NO": "خیر", "DESC_WANT_CLOSE_THIS_WINDOW": "آیا از بستن این پنجره مطمئن هستید؟", "DESC_WANT_DELETE_MESSAGES": "آیا از حذف این پیام(ها) اطمینان دارید؟" }, @@ -418,8 +415,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/user.json b/snappymail/v/0.0.0/app/localization/fi-FI/user.json index 8f30ac211..7116958eb 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 @@ -65,7 +65,7 @@ "LABEL_SUBFOLDERS_NONE": "None", "LABEL_SUBFOLDERS_SUBTREE": "All", "LABEL_SUBFOLDERS_SUBTREE_ONE": "One level", - "LABEL_REPLIED": "Replied" + "LABEL_REPLIED": "Vastattu" }, "PREVIEW_POPUP": { "FULLSCREEN": "Koko ruutu", @@ -107,7 +107,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%", @@ -227,8 +226,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?" }, @@ -418,8 +415,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/user.json b/snappymail/v/0.0.0/app/localization/fr-FR/user.json index 431bdcafd..f64d33372 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 @@ -65,7 +65,7 @@ "LABEL_SUBFOLDERS_NONE": "None", "LABEL_SUBFOLDERS_SUBTREE": "All", "LABEL_SUBFOLDERS_SUBTREE_ONE": "One level", - "LABEL_REPLIED": "Replied" + "LABEL_REPLIED": "Répondu" }, "PREVIEW_POPUP": { "FULLSCREEN": "Basculer en plein écran", @@ -107,7 +107,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%", @@ -227,8 +226,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) ?" }, @@ -418,8 +415,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/user.json b/snappymail/v/0.0.0/app/localization/hu-HU/user.json index b2cc331e2..8678ce058 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 @@ -65,7 +65,7 @@ "LABEL_SUBFOLDERS_NONE": "None", "LABEL_SUBFOLDERS_SUBTREE": "All", "LABEL_SUBFOLDERS_SUBTREE_ONE": "One level", - "LABEL_REPLIED": "Replied" + "LABEL_REPLIED": "Válaszolt" }, "PREVIEW_POPUP": { "FULLSCREEN": "Teljes képernyő váltása", @@ -107,7 +107,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%", @@ -227,8 +226,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?" }, @@ -418,8 +415,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/user.json b/snappymail/v/0.0.0/app/localization/id-ID/user.json index 1521b55b2..c98ac4357 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 @@ -65,7 +65,7 @@ "LABEL_SUBFOLDERS_NONE": "None", "LABEL_SUBFOLDERS_SUBTREE": "All", "LABEL_SUBFOLDERS_SUBTREE_ONE": "One level", - "LABEL_REPLIED": "Replied" + "LABEL_REPLIED": "Dijawab" }, "PREVIEW_POPUP": { "FULLSCREEN": "Beralih ke layar penuh", @@ -107,7 +107,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%", @@ -227,8 +226,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?" }, @@ -418,8 +415,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 9233a9cf3..ed4ff4254 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 @@ -65,7 +65,7 @@ "LABEL_SUBFOLDERS_NONE": "None", "LABEL_SUBFOLDERS_SUBTREE": "All", "LABEL_SUBFOLDERS_SUBTREE_ONE": "One level", - "LABEL_REPLIED": "Replied" + "LABEL_REPLIED": "Svarað" }, "PREVIEW_POPUP": { "FULLSCREEN": "Víxla heilskjá af\/á", @@ -107,7 +107,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%", @@ -227,8 +226,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?" }, @@ -418,8 +415,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/user.json b/snappymail/v/0.0.0/app/localization/it-IT/user.json index 33b343a39..8fcc3b73e 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 @@ -65,7 +65,7 @@ "LABEL_SUBFOLDERS_NONE": "Nessuna", "LABEL_SUBFOLDERS_SUBTREE": "Tutte", "LABEL_SUBFOLDERS_SUBTREE_ONE": "Primo livello", - "LABEL_REPLIED": "Replied" + "LABEL_REPLIED": "Risposto" }, "PREVIEW_POPUP": { "FULLSCREEN": "Passa a schermo intero", @@ -107,7 +107,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%", @@ -227,8 +226,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?" }, @@ -418,8 +415,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/user.json b/snappymail/v/0.0.0/app/localization/ja-JP/user.json index ee5aaddb7..b0531eca6 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 @@ -65,7 +65,7 @@ "LABEL_SUBFOLDERS_NONE": "なし", "LABEL_SUBFOLDERS_SUBTREE": "全て", "LABEL_SUBFOLDERS_SUBTREE_ONE": "一段のみ", - "LABEL_REPLIED": "Replied" + "LABEL_REPLIED": "回答済み" }, "PREVIEW_POPUP": { "FULLSCREEN": "フルスクリーン", @@ -107,7 +107,6 @@ "EMPTY_SEARCH_LIST": "検索条件に一致するメールは見つかりませんでした。高度な検索を試してみてください。", "SEARCH_RESULT_FOR": "\"%SEARCH%\"の検索結果", "BACK_TO_MESSAGE_LIST": "メッセージ一覧に戻る", - "EMPTY_SUBJECT_TEXT": "(件名なし)", "PUT_MESSAGE_HERE": "ここにメッセージをドロップ", "TODAY_AT": "今日 %TIME%", "YESTERDAY_AT": "昨日 %TIME%", @@ -227,8 +226,6 @@ "BUTTON_REQUEST_DSN": "配信確認を要求する" }, "POPUPS_ASK": { - "BUTTON_YES": "はい", - "BUTTON_NO": "いいえ", "DESC_WANT_CLOSE_THIS_WINDOW": "このウインドウを閉じていいですか?", "DESC_WANT_DELETE_MESSAGES": "メッセージを削除していいですか?" }, @@ -418,8 +415,6 @@ "LABEL_CONTACTS_SYNC_SERVER": "サーバー", "LABEL_CONTACTS_SYNC_AB_URL": "アドレス帳URL", "LABEL_CONTACTS_SYNC_USER": "ユーザー", - "SYNC_NO": "いいえ", - "SYNC_YES": "はい", "SYNC_READ": "読み取り専用" }, "SETTINGS_THEMES": { 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 59d961444..91c332c9c 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 @@ -65,7 +65,7 @@ "LABEL_SUBFOLDERS_NONE": "None", "LABEL_SUBFOLDERS_SUBTREE": "All", "LABEL_SUBFOLDERS_SUBTREE_ONE": "One level", - "LABEL_REPLIED": "Replied" + "LABEL_REPLIED": "Odgovoreno" }, "PREVIEW_POPUP": { "FULLSCREEN": "전체화면으로 보기", @@ -107,7 +107,6 @@ "EMPTY_SEARCH_LIST": "검색 조건에 맞는 결과가 없습니다..", "SEARCH_RESULT_FOR": "\"%SEARCH%\"에 대한 검색 결과", "BACK_TO_MESSAGE_LIST": "메시지 목록으로 돌아가기", - "EMPTY_SUBJECT_TEXT": "(제목 없음)", "PUT_MESSAGE_HERE": "목록에 표시할 메시지를 여기로 끌어다 놓으세요.", "TODAY_AT": "오늘 %TIME%", "YESTERDAY_AT": "어제 %TIME%", @@ -227,8 +226,6 @@ "BUTTON_REQUEST_DSN": "수신 확인 요청" }, "POPUPS_ASK": { - "BUTTON_YES": "예", - "BUTTON_NO": "아니요", "DESC_WANT_CLOSE_THIS_WINDOW": "정말로 이 페이지를 닫으시겠습니까 ?", "DESC_WANT_DELETE_MESSAGES": "정말로 선택한 메세지를 삭제하시겠습니까 ?" }, @@ -418,8 +415,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/user.json b/snappymail/v/0.0.0/app/localization/lt-LT/user.json index 076b8e63d..293ff87a8 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 @@ -65,7 +65,7 @@ "LABEL_SUBFOLDERS_NONE": "None", "LABEL_SUBFOLDERS_SUBTREE": "All", "LABEL_SUBFOLDERS_SUBTREE_ONE": "One level", - "LABEL_REPLIED": "Replied" + "LABEL_REPLIED": "Atsakyta" }, "PREVIEW_POPUP": { "FULLSCREEN": "Perjungti viso ekrano režimą", @@ -107,7 +107,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%", @@ -227,8 +226,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)?" }, @@ -418,8 +415,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 ee0a7fe61..53b71efc1 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 @@ -65,7 +65,7 @@ "LABEL_SUBFOLDERS_NONE": "None", "LABEL_SUBFOLDERS_SUBTREE": "All", "LABEL_SUBFOLDERS_SUBTREE_ONE": "One level", - "LABEL_REPLIED": "Replied" + "LABEL_REPLIED": "Atbildēja" }, "PREVIEW_POPUP": { "FULLSCREEN": "Toggle fullscreen", @@ -107,7 +107,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%", @@ -227,8 +226,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)?" }, @@ -418,8 +415,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/user.json b/snappymail/v/0.0.0/app/localization/nb-NO/user.json index 4b3d0ff12..e88a2b1e0 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 @@ -65,7 +65,7 @@ "LABEL_SUBFOLDERS_NONE": "None", "LABEL_SUBFOLDERS_SUBTREE": "Alle", "LABEL_SUBFOLDERS_SUBTREE_ONE": "Ett nivå", - "LABEL_REPLIED": "Replied" + "LABEL_REPLIED": "Besvart" }, "PREVIEW_POPUP": { "FULLSCREEN": "Fullskjerm av\/på", @@ -107,7 +107,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%", @@ -227,8 +226,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)?" }, @@ -418,8 +415,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/user.json b/snappymail/v/0.0.0/app/localization/nl-NL/user.json index 0d74f6de1..bbf4bdc9d 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 @@ -65,7 +65,7 @@ "LABEL_SUBFOLDERS_NONE": "None", "LABEL_SUBFOLDERS_SUBTREE": "All", "LABEL_SUBFOLDERS_SUBTREE_ONE": "One level", - "LABEL_REPLIED": "Replied" + "LABEL_REPLIED": "Beantwoord" }, "PREVIEW_POPUP": { "FULLSCREEN": "Schakel volledig scherm in\/uit", @@ -107,7 +107,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%", @@ -227,8 +226,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?" }, @@ -418,8 +415,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/user.json b/snappymail/v/0.0.0/app/localization/pl-PL/user.json index 5b2bb57f7..39d9d15ca 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 @@ -65,7 +65,7 @@ "LABEL_SUBFOLDERS_NONE": "None", "LABEL_SUBFOLDERS_SUBTREE": "All", "LABEL_SUBFOLDERS_SUBTREE_ONE": "One level", - "LABEL_REPLIED": "Replied" + "LABEL_REPLIED": "Odebrano" }, "PREVIEW_POPUP": { "FULLSCREEN": "Pełny ekran", @@ -107,7 +107,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%", @@ -227,8 +226,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)?" }, @@ -418,8 +415,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/user.json b/snappymail/v/0.0.0/app/localization/pt-BR/user.json index 928ca1268..a5414d80b 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 @@ -65,7 +65,7 @@ "LABEL_SUBFOLDERS_NONE": "None", "LABEL_SUBFOLDERS_SUBTREE": "All", "LABEL_SUBFOLDERS_SUBTREE_ONE": "One level", - "LABEL_REPLIED": "Replied" + "LABEL_REPLIED": "Respondidas" }, "PREVIEW_POPUP": { "FULLSCREEN": "Em tela cheia", @@ -107,7 +107,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%", @@ -227,8 +226,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)?" }, @@ -418,8 +415,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/user.json b/snappymail/v/0.0.0/app/localization/pt-PT/user.json index 913707ce8..994c068c8 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 @@ -65,7 +65,7 @@ "LABEL_SUBFOLDERS_NONE": "Nenhuma", "LABEL_SUBFOLDERS_SUBTREE": "Todas", "LABEL_SUBFOLDERS_SUBTREE_ONE": "Um nível", - "LABEL_REPLIED": "Replied" + "LABEL_REPLIED": "Respondidas" }, "PREVIEW_POPUP": { "FULLSCREEN": "Alternar ecrã-inteiro", @@ -107,7 +107,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%", @@ -227,8 +226,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)?" }, @@ -418,8 +415,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/user.json b/snappymail/v/0.0.0/app/localization/pt/user.json index 913707ce8..994c068c8 100644 --- a/snappymail/v/0.0.0/app/localization/pt/user.json +++ b/snappymail/v/0.0.0/app/localization/pt/user.json @@ -65,7 +65,7 @@ "LABEL_SUBFOLDERS_NONE": "Nenhuma", "LABEL_SUBFOLDERS_SUBTREE": "Todas", "LABEL_SUBFOLDERS_SUBTREE_ONE": "Um nível", - "LABEL_REPLIED": "Replied" + "LABEL_REPLIED": "Respondidas" }, "PREVIEW_POPUP": { "FULLSCREEN": "Alternar ecrã-inteiro", @@ -107,7 +107,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%", @@ -227,8 +226,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)?" }, @@ -418,8 +415,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 6bd78220f..f6a0dcf27 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 @@ -65,7 +65,7 @@ "LABEL_SUBFOLDERS_NONE": "None", "LABEL_SUBFOLDERS_SUBTREE": "All", "LABEL_SUBFOLDERS_SUBTREE_ONE": "One level", - "LABEL_REPLIED": "Replied" + "LABEL_REPLIED": "Răspuns" }, "PREVIEW_POPUP": { "FULLSCREEN": "Toggle fullscreen", @@ -107,7 +107,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%", @@ -227,8 +226,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)?" }, @@ -418,8 +415,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/user.json b/snappymail/v/0.0.0/app/localization/ru-RU/user.json index ac9eb29b4..d5b24b0fa 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 @@ -65,7 +65,7 @@ "LABEL_SUBFOLDERS_NONE": "None", "LABEL_SUBFOLDERS_SUBTREE": "All", "LABEL_SUBFOLDERS_SUBTREE_ONE": "One level", - "LABEL_REPLIED": "Replied" + "LABEL_REPLIED": "Ответил" }, "PREVIEW_POPUP": { "FULLSCREEN": "Полный экран", @@ -107,7 +107,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%", @@ -227,8 +226,6 @@ "BUTTON_REQUEST_DSN": "Запросить уведомление о доставке" }, "POPUPS_ASK": { - "BUTTON_YES": "Да", - "BUTTON_NO": "Нет", "DESC_WANT_CLOSE_THIS_WINDOW": "Вы уверены, что хотите закрыть это окно?", "DESC_WANT_DELETE_MESSAGES": "Вы уверены, что хотите удалить сообщение(я)?" }, @@ -418,8 +415,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/user.json b/snappymail/v/0.0.0/app/localization/sk-SK/user.json index c17ecfef2..b7f65b03e 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 @@ -65,7 +65,7 @@ "LABEL_SUBFOLDERS_NONE": "None", "LABEL_SUBFOLDERS_SUBTREE": "All", "LABEL_SUBFOLDERS_SUBTREE_ONE": "One level", - "LABEL_REPLIED": "Replied" + "LABEL_REPLIED": "Odpovedané" }, "PREVIEW_POPUP": { "FULLSCREEN": "Prepnúť na celú obrazovku", @@ -107,7 +107,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%", @@ -227,8 +226,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?" }, @@ -418,8 +415,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/user.json b/snappymail/v/0.0.0/app/localization/sl-SI/user.json index 52ea0a50b..9c7b36ccc 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 @@ -65,7 +65,7 @@ "LABEL_SUBFOLDERS_NONE": "None", "LABEL_SUBFOLDERS_SUBTREE": "All", "LABEL_SUBFOLDERS_SUBTREE_ONE": "One level", - "LABEL_REPLIED": "Replied" + "LABEL_REPLIED": "Odgovoril" }, "PREVIEW_POPUP": { "FULLSCREEN": "Preklopi celozaslonski pogled", @@ -107,7 +107,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%", @@ -227,8 +226,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?" }, @@ -418,8 +415,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/user.json b/snappymail/v/0.0.0/app/localization/sv-SE/user.json index c49fea297..ecbf077b4 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 @@ -65,7 +65,7 @@ "LABEL_SUBFOLDERS_NONE": "None", "LABEL_SUBFOLDERS_SUBTREE": "All", "LABEL_SUBFOLDERS_SUBTREE_ONE": "One level", - "LABEL_REPLIED": "Replied" + "LABEL_REPLIED": "Svarade" }, "PREVIEW_POPUP": { "FULLSCREEN": "Växla fullskärmsläge", @@ -107,7 +107,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%", @@ -227,8 +226,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?" }, @@ -418,8 +415,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 3044567f8..96b201562 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 @@ -65,7 +65,7 @@ "LABEL_SUBFOLDERS_NONE": "None", "LABEL_SUBFOLDERS_SUBTREE": "All", "LABEL_SUBFOLDERS_SUBTREE_ONE": "One level", - "LABEL_REPLIED": "Replied" + "LABEL_REPLIED": "cevaplandı" }, "PREVIEW_POPUP": { "FULLSCREEN": "Toggle fullscreen", @@ -107,7 +107,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%", @@ -227,8 +226,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?" }, @@ -418,8 +415,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 180f31a95..0052c5375 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 @@ -65,7 +65,7 @@ "LABEL_SUBFOLDERS_NONE": "None", "LABEL_SUBFOLDERS_SUBTREE": "All", "LABEL_SUBFOLDERS_SUBTREE_ONE": "One level", - "LABEL_REPLIED": "Replied" + "LABEL_REPLIED": "відповів" }, "PREVIEW_POPUP": { "FULLSCREEN": "Toggle fullscreen", @@ -107,7 +107,6 @@ "EMPTY_SEARCH_LIST": "Листи не знайдено.", "SEARCH_RESULT_FOR": "Результат пошуку \"%SEARCH%\"", "BACK_TO_MESSAGE_LIST": "повернутись до списку листів", - "EMPTY_SUBJECT_TEXT": "(Без теми)", "PUT_MESSAGE_HERE": "Киньте повідомлення сюди, щоб подивитися його в списку", "TODAY_AT": "сьогодні в %TIME%", "YESTERDAY_AT": "вчора в %TIME%", @@ -227,8 +226,6 @@ "BUTTON_REQUEST_DSN": "Request a delivery receipt" }, "POPUPS_ASK": { - "BUTTON_YES": "Так", - "BUTTON_NO": "Ні", "DESC_WANT_CLOSE_THIS_WINDOW": "Ви впевнені, що хочете закрити це вікно?", "DESC_WANT_DELETE_MESSAGES": "Ви впевнені, що хочете видалити повідомлення?" }, @@ -418,8 +415,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/user.json b/snappymail/v/0.0.0/app/localization/vi-VN/user.json index 98bcbaf39..89049db22 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 @@ -65,7 +65,7 @@ "LABEL_SUBFOLDERS_NONE": "Trống", "LABEL_SUBFOLDERS_SUBTREE": "Tất cả", "LABEL_SUBFOLDERS_SUBTREE_ONE": "Một cấp độ", - "LABEL_REPLIED": "Replied" + "LABEL_REPLIED": "Đã trả lời" }, "PREVIEW_POPUP": { "FULLSCREEN": "Đóng\/mở toàn màn hình", @@ -107,7 +107,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%", @@ -227,8 +226,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ứ?" }, @@ -418,8 +415,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/user.json b/snappymail/v/0.0.0/app/localization/zh-CN/user.json index 44936e4df..f89a3dc85 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 @@ -65,7 +65,7 @@ "LABEL_SUBFOLDERS_NONE": "None", "LABEL_SUBFOLDERS_SUBTREE": "All", "LABEL_SUBFOLDERS_SUBTREE_ONE": "One level", - "LABEL_REPLIED": "Replied" + "LABEL_REPLIED": "已回答" }, "PREVIEW_POPUP": { "FULLSCREEN": "切换全屏", @@ -107,7 +107,6 @@ "EMPTY_SEARCH_LIST": "未找到您想要的。", "SEARCH_RESULT_FOR": "搜索 \"%SEARCH%\" 的结果", "BACK_TO_MESSAGE_LIST": "回到信息列表", - "EMPTY_SUBJECT_TEXT": "(无主题)", "PUT_MESSAGE_HERE": "在这里查看邮件", "TODAY_AT": "今日于 %TIME%", "YESTERDAY_AT": "昨天 %TIME%", @@ -227,8 +226,6 @@ "BUTTON_REQUEST_DSN": "要求送达回执" }, "POPUPS_ASK": { - "BUTTON_YES": "是", - "BUTTON_NO": "否", "DESC_WANT_CLOSE_THIS_WINDOW": "你确定要关闭此窗口吗?", "DESC_WANT_DELETE_MESSAGES": "你确定你要删除这条消息吗?" }, @@ -418,8 +415,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 cd16b4713..48a76dbe5 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 @@ -65,7 +65,7 @@ "LABEL_SUBFOLDERS_NONE": "None", "LABEL_SUBFOLDERS_SUBTREE": "All", "LABEL_SUBFOLDERS_SUBTREE_ONE": "One level", - "LABEL_REPLIED": "Replied" + "LABEL_REPLIED": "已回答" }, "PREVIEW_POPUP": { "FULLSCREEN": "Toggle fullscreen", @@ -107,7 +107,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%", @@ -227,8 +226,6 @@ "BUTTON_REQUEST_DSN": "Request a delivery receipt" }, "POPUPS_ASK": { - "BUTTON_YES": "是", - "BUTTON_NO": "否", "DESC_WANT_CLOSE_THIS_WINDOW": "你確定要關閉此窗口嗎?", "DESC_WANT_DELETE_MESSAGES": "你確定你要刪除這條消息嗎?" }, @@ -418,8 +415,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": { From aff9ba29e7b5506a86fec79976694e313733e1fd Mon Sep 17 00:00:00 2001 From: the-djmaze <> Date: Thu, 4 Aug 2022 14:58:13 +0200 Subject: [PATCH 10/72] Admin: Ask for IMAP login credentials when testing, idea for #477 --- dev/View/Popup/Ask.js | 29 ++++++-- dev/View/Popup/Domain.js | 69 +++++++++++-------- .../app/libraries/RainLoop/ActionsAdmin.php | 8 +++ .../v/0.0.0/app/localization/ar-SA/user.json | 1 + .../v/0.0.0/app/localization/bg-BG/user.json | 1 + .../v/0.0.0/app/localization/cs-CZ/admin.json | 5 +- .../v/0.0.0/app/localization/cs-CZ/user.json | 1 + .../v/0.0.0/app/localization/da-DK/admin.json | 5 +- .../v/0.0.0/app/localization/da-DK/user.json | 1 + .../v/0.0.0/app/localization/de-DE/admin.json | 5 +- .../v/0.0.0/app/localization/de-DE/user.json | 1 + .../v/0.0.0/app/localization/el-GR/user.json | 1 + .../v/0.0.0/app/localization/en-GB/user.json | 1 + .../v/0.0.0/app/localization/en/admin.json | 5 +- .../v/0.0.0/app/localization/en/user.json | 1 + .../v/0.0.0/app/localization/es-ES/admin.json | 5 +- .../v/0.0.0/app/localization/es-ES/user.json | 1 + .../v/0.0.0/app/localization/et-EE/user.json | 1 + .../v/0.0.0/app/localization/fa-IR/admin.json | 5 +- .../v/0.0.0/app/localization/fa-IR/user.json | 1 + .../v/0.0.0/app/localization/fi-FI/admin.json | 5 +- .../v/0.0.0/app/localization/fi-FI/user.json | 1 + .../v/0.0.0/app/localization/fr-FR/admin.json | 5 +- .../v/0.0.0/app/localization/fr-FR/user.json | 1 + .../v/0.0.0/app/localization/hu-HU/admin.json | 5 +- .../v/0.0.0/app/localization/hu-HU/user.json | 1 + .../v/0.0.0/app/localization/id-ID/admin.json | 5 +- .../v/0.0.0/app/localization/id-ID/user.json | 1 + .../v/0.0.0/app/localization/is-IS/user.json | 1 + .../v/0.0.0/app/localization/it-IT/admin.json | 5 +- .../v/0.0.0/app/localization/it-IT/user.json | 1 + .../v/0.0.0/app/localization/ja-JP/admin.json | 5 +- .../v/0.0.0/app/localization/ja-JP/user.json | 1 + .../v/0.0.0/app/localization/ko-KR/user.json | 1 + .../v/0.0.0/app/localization/lt-LT/admin.json | 5 +- .../v/0.0.0/app/localization/lt-LT/user.json | 1 + .../v/0.0.0/app/localization/lv-LV/user.json | 1 + .../v/0.0.0/app/localization/nb-NO/admin.json | 5 +- .../v/0.0.0/app/localization/nb-NO/user.json | 1 + .../v/0.0.0/app/localization/nl-NL/admin.json | 5 +- .../v/0.0.0/app/localization/nl-NL/user.json | 1 + .../v/0.0.0/app/localization/pl-PL/admin.json | 5 +- .../v/0.0.0/app/localization/pl-PL/user.json | 1 + .../v/0.0.0/app/localization/pt-BR/admin.json | 5 +- .../v/0.0.0/app/localization/pt-BR/user.json | 1 + .../v/0.0.0/app/localization/pt-PT/admin.json | 5 +- .../v/0.0.0/app/localization/pt-PT/user.json | 1 + .../v/0.0.0/app/localization/pt/admin.json | 5 +- .../v/0.0.0/app/localization/pt/user.json | 1 + .../v/0.0.0/app/localization/ro-RO/user.json | 1 + .../v/0.0.0/app/localization/ru-RU/admin.json | 5 +- .../v/0.0.0/app/localization/ru-RU/user.json | 1 + .../v/0.0.0/app/localization/sk-SK/admin.json | 5 +- .../v/0.0.0/app/localization/sk-SK/user.json | 1 + .../v/0.0.0/app/localization/sl-SI/admin.json | 5 +- .../v/0.0.0/app/localization/sl-SI/user.json | 1 + .../v/0.0.0/app/localization/sv-SE/admin.json | 5 +- .../v/0.0.0/app/localization/sv-SE/user.json | 1 + .../v/0.0.0/app/localization/tr-TR/user.json | 1 + .../v/0.0.0/app/localization/uk-UA/user.json | 1 + .../v/0.0.0/app/localization/vi-VN/admin.json | 5 +- .../v/0.0.0/app/localization/vi-VN/user.json | 1 + .../v/0.0.0/app/localization/zh-CN/admin.json | 5 +- .../v/0.0.0/app/localization/zh-CN/user.json | 1 + .../v/0.0.0/app/localization/zh-TW/user.json | 1 + .../app/templates/Views/Common/PopupsAsk.html | 8 ++- 66 files changed, 214 insertions(+), 62 deletions(-) diff --git a/dev/View/Popup/Ask.js b/dev/View/Popup/Ask.js index 680139f49..cb848e3f5 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 || 'GLOBAL/YES')); - this.noButton(i18n(askPass ? 'GLOBAL/CANCEL' : 'GLOBAL/NO')); + 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() { @@ -80,7 +86,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/Domain.js b/dev/View/Popup/Domain.js index dbe07bc03..258f4552b 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) { 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..e26f0cd59 100644 --- a/snappymail/v/0.0.0/app/libraries/RainLoop/ActionsAdmin.php +++ b/snappymail/v/0.0.0/app/libraries/RainLoop/ActionsAdmin.php @@ -300,6 +300,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; } 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 e9cf30be6..3de5af250 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": "Username", "PASSWORD": "كلمة السر", "REPLY_TO": "الرد-الى", "SAVE": "حفظ", 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 b2f3911fa..37c611ab2 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": "Username", "PASSWORD": "Парола", "REPLY_TO": "Отговори на", "SAVE": "Запази", 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..1c197dff6 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": "Username", + "PASSWORD": "Password", + "CANCEL": "Cancel" }, "LOGIN": { "LABEL_LOGIN": "Login", 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 e78d1a732..6933703ca 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": "Username", "PASSWORD": "Heslo", "REPLY_TO": "Adresa odpovědi", "SAVE": "Uložit", 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..0c9861507 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": "Username", + "PASSWORD": "Password", + "CANCEL": "Cancel" }, "LOGIN": { "LABEL_LOGIN": "Log ind", 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 a2c73afd7..0e85b8b0c 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": "Username", "PASSWORD": "Adgangskode", "REPLY_TO": "Svar til", "SAVE": "Gem", 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..11d0a3e9a 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": "Username", + "PASSWORD": "Password", + "CANCEL": "Cancel" }, "LOGIN": { "LABEL_LOGIN": "Benutzer", 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 193808512..efcf8fb5f 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": "Username", "PASSWORD": "Passwort", "REPLY_TO": "Antwort an", "SAVE": "Speichern", 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 26b2f5d4c..6ae799dc0 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": "Username", "PASSWORD": "Κωδικός πρόσβασης", "REPLY_TO": "Απάντηση στον", "SAVE": "Αποθήκευση", 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 ac9abce8d..0200e4a9a 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", 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..e709c1778 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", 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 6f40b748e..48119d670 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", 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..dea6724f5 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": "Username", + "PASSWORD": "Password", + "CANCEL": "Cancel" }, "LOGIN": { "LABEL_LOGIN": "Ingresar", 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 0392437c8..b0a0e2c24 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": "Username", "PASSWORD": "Contraseña", "REPLY_TO": "Responder", "SAVE": "Guardar", 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 c84999bba..fdded9b7c 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": "Username", "PASSWORD": "Salasõna", "REPLY_TO": "Vastuse saaja", "SAVE": "Salvesta", 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..9ed304a98 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": "Username", + "PASSWORD": "Password", + "CANCEL": "Cancel" }, "LOGIN": { "LABEL_LOGIN": "ورود", 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 1480d191a..917c12389 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": "Username", "PASSWORD": "گذرواژه", "REPLY_TO": "پاسخ به", "SAVE": "ذخیره کن", 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..ba48b014e 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": "Username", + "PASSWORD": "Password", + "CANCEL": "Cancel" }, "LOGIN": { "LABEL_LOGIN": "Tunnus", 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 7116958eb..ef7f757ee 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": "Username", "PASSWORD": "Salasana", "REPLY_TO": "Vastaa", "SAVE": "Tallenna", 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..5f122ab25 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": "Username", + "PASSWORD": "Password", + "CANCEL": "Cancel" }, "LOGIN": { "LABEL_LOGIN": "Identifiant", 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 f64d33372..c28f6c073 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": "Username", "PASSWORD": "Mot de passe", "REPLY_TO": "Répondre à", "SAVE": "Enregistrer", 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..b468bb148 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": "Username", + "PASSWORD": "Password", + "CANCEL": "Cancel" }, "LOGIN": { "LABEL_LOGIN": "Belépés", 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 8678ce058..488db7e00 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": "Username", "PASSWORD": "Jelszó", "REPLY_TO": "Válaszcím", "SAVE": "Mentés", 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..9aec205b2 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": "Username", + "PASSWORD": "Password", + "CANCEL": "Cancel" }, "LOGIN": { "LABEL_LOGIN": "Login", 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 c98ac4357..c5fbde9ca 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": "Username", "PASSWORD": "Sandi", "REPLY_TO": "Balas-Ke", "SAVE": "Simpan", 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 ed4ff4254..53fdf34e7 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": "Username", "PASSWORD": "Lykilorð", "REPLY_TO": "Svara-til", "SAVE": "Vista", 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..7d1f6d49f 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": "Username", + "PASSWORD": "Password", + "CANCEL": "Cancel" }, "LOGIN": { "LABEL_LOGIN": "Login", 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 8fcc3b73e..0d57e1147 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,6 +20,7 @@ "NAME": "Nome", "NONE": "Nessuno", "NOT_SPAM": "Segnala come non spam", + "USERNAME": "Username", "PASSWORD": "Password", "REPLY_TO": "Rispondi a", "SAVE": "Salva", 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..ea5741d25 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": "Username", + "PASSWORD": "Password", + "CANCEL": "Cancel" }, "LOGIN": { "LABEL_LOGIN": "ログイン", 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 b0531eca6..741102a24 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": "Username", "PASSWORD": "パスワード", "REPLY_TO": "Reply-To", "SAVE": "保存", 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 91c332c9c..fa4a03795 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": "Username", "PASSWORD": "비밀번호", "REPLY_TO": "회신 주소", "SAVE": "저장", 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..a6fca5802 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": "Username", + "PASSWORD": "Password", + "CANCEL": "Cancel" }, "LOGIN": { "LABEL_LOGIN": "Prisijungimo vardas", 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 293ff87a8..a53ce4974 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": "Username", "PASSWORD": "Slaptažodis", "REPLY_TO": "Kam atsakyti", "SAVE": "Išsaugoti", 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 53b71efc1..64cae419e 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": "Username", "PASSWORD": "Parole", "REPLY_TO": "Reply-To", "SAVE": "Saglabāt", 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..11e4d37d0 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": "Username", + "PASSWORD": "Password", + "CANCEL": "Cancel" }, "LOGIN": { "LABEL_LOGIN": "Brukernavn", 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 e88a2b1e0..a0d5600e9 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": "Username", "PASSWORD": "Passord", "REPLY_TO": "Svar til", "SAVE": "Lagre", 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..824b87dc2 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": "Username", + "PASSWORD": "Password", + "CANCEL": "Cancel" }, "LOGIN": { "LABEL_LOGIN": "Inlognaam", 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 bbf4bdc9d..96fc63aed 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": "Username", "PASSWORD": "Wachtwoord", "REPLY_TO": "Antwoordadres", "SAVE": "Opslaan", 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..e6ebce913 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": "Username", + "PASSWORD": "Password", + "CANCEL": "Cancel" }, "LOGIN": { "LABEL_LOGIN": "Login", 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 39d9d15ca..46bbfb1d0 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": "Username", "PASSWORD": "Hasło", "REPLY_TO": "Odpisz do", "SAVE": "Zapisz", 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..e794ca8e7 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": "Username", + "PASSWORD": "Password", + "CANCEL": "Cancel" }, "LOGIN": { "LABEL_LOGIN": "Usuário", 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 a5414d80b..156f51392 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": "Username", "PASSWORD": "Senha", "REPLY_TO": "Responder para", "SAVE": "Salvar", 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..d5d31f738 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": "Username", + "PASSWORD": "Password", + "CANCEL": "Cancel" }, "LOGIN": { "LABEL_LOGIN": "Utilizador", 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 994c068c8..5f45a36ae 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": "Username", "PASSWORD": "Palavra-passe", "REPLY_TO": "Resp.-Para", "SAVE": "Guardar", 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..d5d31f738 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": "Username", + "PASSWORD": "Password", + "CANCEL": "Cancel" }, "LOGIN": { "LABEL_LOGIN": "Utilizador", 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 994c068c8..5f45a36ae 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": "Username", "PASSWORD": "Palavra-passe", "REPLY_TO": "Resp.-Para", "SAVE": "Guardar", 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 f6a0dcf27..b32f34a79 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": "Username", "PASSWORD": "Parolă", "REPLY_TO": "Reply-To", "SAVE": "Salvează", 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..d4d157b92 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": "Username", + "PASSWORD": "Password", + "CANCEL": "Cancel" }, "LOGIN": { "LABEL_LOGIN": "Логин", 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 d5b24b0fa..8fe08f996 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": "Username", "PASSWORD": "Пароль", "REPLY_TO": "Ответить-на", "SAVE": "Сохранить", 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..598417ace 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": "Username", + "PASSWORD": "Password", + "CANCEL": "Cancel" }, "LOGIN": { "LABEL_LOGIN": "Prihlasovanie", 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 b7f65b03e..e1d1372ad 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": "Username", "PASSWORD": "Heslo", "REPLY_TO": "Adresa pre odpoveď", "SAVE": "Uložiť", 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..6345f7922 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": "Username", + "PASSWORD": "Password", + "CANCEL": "Cancel" }, "LOGIN": { "LABEL_LOGIN": "Prijava", 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 9c7b36ccc..5f5f7c398 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": "Username", "PASSWORD": "Geslo", "REPLY_TO": "Odgovor na", "SAVE": "Shrani", 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..86acfbefc 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": "Username", + "PASSWORD": "Password", + "CANCEL": "Cancel" }, "LOGIN": { "LABEL_LOGIN": "Logga in", 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 ecbf077b4..76fc9e2e7 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": "Username", "PASSWORD": "Lösenord", "REPLY_TO": "Svara till", "SAVE": "Spara", 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 96b201562..60b239d5e 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": "Username", "PASSWORD": "Şifre", "REPLY_TO": "Reply-To", "SAVE": "Kaydet", 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 0052c5375..b240cf625 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": "Username", "PASSWORD": "Пароль", "REPLY_TO": "Reply-To", "SAVE": "Зберегти", 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..b244bf1a5 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": "Username", + "PASSWORD": "Password", + "CANCEL": "Cancel" }, "LOGIN": { "LABEL_LOGIN": "Đăng nhập", 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 89049db22..352117b3b 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": "Username", "PASSWORD": "Mật khẩu", "REPLY_TO": "Nhận thư phản hồi về", "SAVE": "Lưu", 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..0ea3caf01 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": "Username", + "PASSWORD": "Password", + "CANCEL": "Cancel" }, "LOGIN": { "LABEL_LOGIN": "登录", 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 f89a3dc85..6301857af 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": "Username", "PASSWORD": "密码", "REPLY_TO": "回复", "SAVE": "保存", 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 48a76dbe5..104013c7c 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": "Username", "PASSWORD": "密碼", "REPLY_TO": "Reply-To", "SAVE": "保存", 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..0398a9f1f 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,7 +1,11 @@ -
+
From 21bbbf312f0855304403b4be0f36a0e9b0a4fde3 Mon Sep 17 00:00:00 2001 From: the-djmaze <> Date: Tue, 23 Aug 2022 09:22:39 +0200 Subject: [PATCH 32/72] Allow only `username` as additional account --- snappymail/v/0.0.0/app/templates/Views/User/PopupsAccount.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 @@
-
From 61908dd0c0699427f1171d10ea4f379dca2cef90 Mon Sep 17 00:00:00 2001 From: the-djmaze <> Date: Tue, 23 Aug 2022 09:24:32 +0200 Subject: [PATCH 33/72] Replace admin translation TAB_SECURITY/BUTTON_UPDATE_PASSWORD with GLOBAL/SAVE --- snappymail/v/0.0.0/app/localization/cs-CZ/admin.json | 1 - snappymail/v/0.0.0/app/localization/da-DK/admin.json | 1 - snappymail/v/0.0.0/app/localization/de-DE/admin.json | 1 - snappymail/v/0.0.0/app/localization/en/admin.json | 1 - snappymail/v/0.0.0/app/localization/es-ES/admin.json | 1 - snappymail/v/0.0.0/app/localization/fa-IR/admin.json | 1 - snappymail/v/0.0.0/app/localization/fi-FI/admin.json | 1 - snappymail/v/0.0.0/app/localization/fr-FR/admin.json | 1 - snappymail/v/0.0.0/app/localization/hu-HU/admin.json | 1 - snappymail/v/0.0.0/app/localization/id-ID/admin.json | 1 - snappymail/v/0.0.0/app/localization/it-IT/admin.json | 1 - snappymail/v/0.0.0/app/localization/ja-JP/admin.json | 1 - snappymail/v/0.0.0/app/localization/lt-LT/admin.json | 1 - snappymail/v/0.0.0/app/localization/nb-NO/admin.json | 1 - snappymail/v/0.0.0/app/localization/nl-NL/admin.json | 1 - snappymail/v/0.0.0/app/localization/pl-PL/admin.json | 1 - snappymail/v/0.0.0/app/localization/pt-BR/admin.json | 1 - snappymail/v/0.0.0/app/localization/pt-PT/admin.json | 1 - snappymail/v/0.0.0/app/localization/pt/admin.json | 1 - snappymail/v/0.0.0/app/localization/ru-RU/admin.json | 1 - snappymail/v/0.0.0/app/localization/sk-SK/admin.json | 1 - snappymail/v/0.0.0/app/localization/sl-SI/admin.json | 1 - snappymail/v/0.0.0/app/localization/sv-SE/admin.json | 1 - snappymail/v/0.0.0/app/localization/vi-VN/admin.json | 1 - snappymail/v/0.0.0/app/localization/zh-CN/admin.json | 1 - .../0.0.0/app/templates/Views/Admin/AdminSettingsSecurity.html | 2 +- 26 files changed, 1 insertion(+), 26 deletions(-) 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 1c197dff6..683f42df5 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 @@ -90,7 +90,6 @@ "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/da-DK/admin.json b/snappymail/v/0.0.0/app/localization/da-DK/admin.json index 0c9861507..a7cb1eb77 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 @@ -90,7 +90,6 @@ "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/de-DE/admin.json b/snappymail/v/0.0.0/app/localization/de-DE/admin.json index 11d0a3e9a..573270f8c 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 @@ -90,7 +90,6 @@ "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/en/admin.json b/snappymail/v/0.0.0/app/localization/en/admin.json index e709c1778..6c16263c6 100644 --- a/snappymail/v/0.0.0/app/localization/en/admin.json +++ b/snappymail/v/0.0.0/app/localization/en/admin.json @@ -90,7 +90,6 @@ "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/es-ES/admin.json b/snappymail/v/0.0.0/app/localization/es-ES/admin.json index dea6724f5..a574004ac 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 @@ -90,7 +90,6 @@ "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/fa-IR/admin.json b/snappymail/v/0.0.0/app/localization/fa-IR/admin.json index 9ed304a98..e71ce40d8 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 @@ -90,7 +90,6 @@ "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/fi-FI/admin.json b/snappymail/v/0.0.0/app/localization/fi-FI/admin.json index ba48b014e..2a341386c 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 @@ -90,7 +90,6 @@ "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/fr-FR/admin.json b/snappymail/v/0.0.0/app/localization/fr-FR/admin.json index 5f122ab25..1eaefcf54 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 @@ -90,7 +90,6 @@ "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/hu-HU/admin.json b/snappymail/v/0.0.0/app/localization/hu-HU/admin.json index b468bb148..502b64ce4 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 @@ -90,7 +90,6 @@ "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/id-ID/admin.json b/snappymail/v/0.0.0/app/localization/id-ID/admin.json index 9aec205b2..e1d873b8c 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 @@ -90,7 +90,6 @@ "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/it-IT/admin.json b/snappymail/v/0.0.0/app/localization/it-IT/admin.json index 7d1f6d49f..eb62f17ab 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 @@ -90,7 +90,6 @@ "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/ja-JP/admin.json b/snappymail/v/0.0.0/app/localization/ja-JP/admin.json index 3b4084c5f..185aac226 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 @@ -90,7 +90,6 @@ "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": "自己署名証明書を使う" 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 a6fca5802..27a2b9288 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 @@ -90,7 +90,6 @@ "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/nb-NO/admin.json b/snappymail/v/0.0.0/app/localization/nb-NO/admin.json index 11e4d37d0..cd5502e62 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 @@ -90,7 +90,6 @@ "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/nl-NL/admin.json b/snappymail/v/0.0.0/app/localization/nl-NL/admin.json index 824b87dc2..b07630bba 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 @@ -90,7 +90,6 @@ "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/pl-PL/admin.json b/snappymail/v/0.0.0/app/localization/pl-PL/admin.json index e6ebce913..6ddedc87b 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 @@ -90,7 +90,6 @@ "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/pt-BR/admin.json b/snappymail/v/0.0.0/app/localization/pt-BR/admin.json index e794ca8e7..917ad5f57 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 @@ -90,7 +90,6 @@ "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-PT/admin.json b/snappymail/v/0.0.0/app/localization/pt-PT/admin.json index d5d31f738..efe626771 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 @@ -90,7 +90,6 @@ "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/admin.json b/snappymail/v/0.0.0/app/localization/pt/admin.json index d5d31f738..efe626771 100644 --- a/snappymail/v/0.0.0/app/localization/pt/admin.json +++ b/snappymail/v/0.0.0/app/localization/pt/admin.json @@ -90,7 +90,6 @@ "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/ru-RU/admin.json b/snappymail/v/0.0.0/app/localization/ru-RU/admin.json index d4d157b92..f721d2594 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 @@ -90,7 +90,6 @@ "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/sk-SK/admin.json b/snappymail/v/0.0.0/app/localization/sk-SK/admin.json index 598417ace..efbd03a78 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 @@ -90,7 +90,6 @@ "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/sl-SI/admin.json b/snappymail/v/0.0.0/app/localization/sl-SI/admin.json index 6345f7922..b9610771e 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 @@ -90,7 +90,6 @@ "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/sv-SE/admin.json b/snappymail/v/0.0.0/app/localization/sv-SE/admin.json index 86acfbefc..61afefc43 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 @@ -90,7 +90,6 @@ "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/vi-VN/admin.json b/snappymail/v/0.0.0/app/localization/vi-VN/admin.json index b244bf1a5..0f996e130 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 @@ -90,7 +90,6 @@ "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/zh-CN/admin.json b/snappymail/v/0.0.0/app/localization/zh-CN/admin.json index 0ea3caf01..6e8c42137 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 @@ -90,7 +90,6 @@ "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/templates/Views/Admin/AdminSettingsSecurity.html b/snappymail/v/0.0.0/app/templates/Views/Admin/AdminSettingsSecurity.html index 711348514..12c8b05ac 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 @@ -50,7 +50,7 @@
+ data-icon="🔑" data-i18n="GLOBAL/SAVE">
From 58cd2fcacb87cb1b131127584043b5331abe3752 Mon Sep 17 00:00:00 2001 From: the-djmaze <> Date: Tue, 23 Aug 2022 10:52:23 +0200 Subject: [PATCH 34/72] Cleanup and improved handling of Sieve scripts --- dev/Sieve/Model/Script.js | 5 +- dev/Sieve/View/Script.js | 32 +- .../libraries/RainLoop/Actions/Filters.php | 15 +- .../libraries/RainLoop/Providers/Filters.php | 4 +- .../Providers/Filters/Classes/Filter.php | 227 ----------- .../Filters/Classes/FilterCondition.php | 88 ---- .../Filters/Enumerations/ActionType.php | 13 - .../Filters/Enumerations/ConditionField.php | 14 - .../Filters/Enumerations/ConditionType.php | 17 - .../Filters/Enumerations/ConditionsType.php | 9 - .../Providers/Filters/FiltersInterface.php | 2 +- .../RainLoop/Providers/Filters/Sieve.php | 383 ------------------ .../Providers/Filters/SieveStorage.php | 19 +- .../Views/User/PopupsSieveScript.html | 2 +- 14 files changed, 28 insertions(+), 802 deletions(-) delete mode 100644 snappymail/v/0.0.0/app/libraries/RainLoop/Providers/Filters/Classes/Filter.php delete mode 100644 snappymail/v/0.0.0/app/libraries/RainLoop/Providers/Filters/Classes/FilterCondition.php delete mode 100644 snappymail/v/0.0.0/app/libraries/RainLoop/Providers/Filters/Enumerations/ActionType.php delete mode 100644 snappymail/v/0.0.0/app/libraries/RainLoop/Providers/Filters/Enumerations/ConditionField.php delete mode 100644 snappymail/v/0.0.0/app/libraries/RainLoop/Providers/Filters/Enumerations/ConditionType.php delete mode 100644 snappymail/v/0.0.0/app/libraries/RainLoop/Providers/Filters/Enumerations/ConditionsType.php delete mode 100644 snappymail/v/0.0.0/app/libraries/RainLoop/Providers/Filters/Sieve.php diff --git a/dev/Sieve/Model/Script.js b/dev/Sieve/Model/Script.js index 1dba27eab..ed559348a 100644 --- a/dev/Sieve/Model/Script.js +++ b/dev/Sieve/Model/Script.js @@ -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/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/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/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/templates/Views/User/PopupsSieveScript.html b/snappymail/v/0.0.0/app/templates/Views/User/PopupsSieveScript.html index 3e0879567..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 @@
- + - - - - \ No newline at end of file diff --git a/rainloop/v/0.0.0/app/templates/Views/Admin/AdminSettingsSocial.html b/rainloop/v/0.0.0/app/templates/Views/Admin/AdminSettingsSocial.html index 7fece3d3a..091b5a769 100644 --- a/rainloop/v/0.0.0/app/templates/Views/Admin/AdminSettingsSocial.html +++ b/rainloop/v/0.0.0/app/templates/Views/Admin/AdminSettingsSocial.html @@ -3,7 +3,7 @@
diff --git a/rainloop/v/0.0.0/app/templates/Views/Admin/PopupsActivate.html b/rainloop/v/0.0.0/app/templates/Views/Admin/PopupsActivate.html deleted file mode 100644 index a50fe6dfb..000000000 --- a/rainloop/v/0.0.0/app/templates/Views/Admin/PopupsActivate.html +++ /dev/null @@ -1,50 +0,0 @@ -
- -
diff --git a/rainloop/v/0.0.0/app/templates/Views/User/About.html b/rainloop/v/0.0.0/app/templates/Views/User/About.html index 9c3cbce8f..e1b57af09 100644 --- a/rainloop/v/0.0.0/app/templates/Views/User/About.html +++ b/rainloop/v/0.0.0/app/templates/Views/User/About.html @@ -2,5 +2,5 @@

RainLoop Webmail

   

()

-

http://rainloop.net

+

https://www.rainloop.net

\ No newline at end of file diff --git a/rainloop/v/0.0.0/include.php b/rainloop/v/0.0.0/include.php index 9d7fdc2e9..605fd6e05 100644 --- a/rainloop/v/0.0.0/include.php +++ b/rainloop/v/0.0.0/include.php @@ -40,9 +40,6 @@ define('APP_DUMMY', '********'); define('APP_DEV_VERSION', '0.0.0'); define('APP_GOOGLE_ACCESS_TOKEN_PREFIX', ':GAT:'); - define('APP_WEB_SITE', 'http://www.rainloop.net/'); - define('APP_API_PATH', 'http://api.rainloop.net/'); - define('APP_STATUS_PATH', 'http://status.rainloop.net/'); define('APP_REPOSITORY_PATH', 'http://repository.rainloop.net/v1/'); define('APP_REPO_CORE_FILE', 'http://repository.rainloop.net/v2/core.{{channel}}.json'); diff --git a/tasks/assets.js b/tasks/assets.js index bf8759635..0f967dc84 100644 --- a/tasks/assets.js +++ b/tasks/assets.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 { config } = require('./config'); diff --git a/tasks/common.js b/tasks/common.js index df934a3d2..62e2ea20c 100644 --- a/tasks/common.js +++ b/tasks/common.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 rimraf = require('gulp-rimraf'); const fs = require('node-fs'); @@ -18,6 +18,6 @@ exports.zip = (srcDir, destDir, fileName) => .pipe(require('gulp-zip')(fileName)) .pipe(gulp.dest(destDir)); -exports.getHead = () => (!config.community ? config.head.rainloop : config.head.agpl); +exports.getHead = () => config.head.mit; exports.cleanStatic = () => exports.del(config.paths.static); diff --git a/tasks/config.js b/tasks/config.js index b03841cc1..ddc137fa0 100644 --- a/tasks/config.js +++ b/tasks/config.js @@ -1,15 +1,13 @@ -/* RainLoop Webmail (c) RainLoop Team | Licensed under AGPL 3 */ +/* RainLoop Webmail (c) RainLoop Team | Licensed under MIT */ const path = require('path'); const { argv } = require('yargs'); const config = { head: { - rainloop: '/* RainLoop Webmail (c) RainLoop Team | Licensed under RainLoop Software License */', - agpl: '/* RainLoop Webmail (c) RainLoop Team | Licensed under AGPL v3 */' + mit: '/* RainLoop Webmail (c) RainLoop Team | Licensed under MIT */' }, devVersion: '0.0.0', releasesPath: 'build/dist/releases', - community: !argv.pro, source: !!argv.source, watch: false, watchInterval: 1000, @@ -20,7 +18,6 @@ const config = { cleanPath: '', zipSrcPath: '', zipFile: '', - // zipFileShort: '', paths: {} }; diff --git a/tasks/css.js b/tasks/css.js index 5a2d3e1ff..f178e3cb7 100644 --- a/tasks/css.js +++ b/tasks/css.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 concat = require('gulp-concat-util'); diff --git a/tasks/js.js b/tasks/js.js index 66542b36e..e32295d90 100644 --- a/tasks/js.js +++ b/tasks/js.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 concat = require('gulp-concat-util'), diff --git a/tasks/owncloud.js b/tasks/owncloud.js index 864b4eb9e..2d418771e 100644 --- a/tasks/owncloud.js +++ b/tasks/owncloud.js @@ -1,4 +1,4 @@ -/* RainLoop Webmail (c) RainLoop Team | Licensed under AGPL 3 */ +/* RainLoop Webmail (c) RainLoop Team | Licensed under MIT */ /* eslint-disable consistent-return */ const gulp = require('gulp'); @@ -48,7 +48,7 @@ const owncloudSetup = (done) => { .replace('0.0', '' + versionFull + '') .replace( '', - '' + (config.community ? 'AGPLv3' : 'RainLoop Software License') + '' + 'MIT' ) ); @@ -58,8 +58,7 @@ const owncloudSetup = (done) => { config.destPath = config.releasesPath + '/owncloud/' + versionFull + '/'; config.cleanPath = dist; config.zipSrcPath = dist; - config.zipFile = 'rainloop-owncloud-app-' + (config.community ? '' : 'standard-') + versionFull + '.zip'; - // config.zipFileShort = 'rainloop' + (config.community ? '' : '-standard') + '.zip'; + config.zipFile = 'rainloop-owncloud-app-legacy-' + versionFull + '.zip'; done(); }; @@ -80,10 +79,6 @@ const owncloudClean = (done) => { done(); }; -// const owncloudShortname = (done) => { -// copy(config.destPath + config.zipFile, config.destPath + config.zipFileShort, done); -// }; - exports.owncloud = gulp.series( owncloudCopy, rainloopBuild, @@ -92,5 +87,4 @@ exports.owncloud = gulp.series( owncloudSetup, owncloudZip, owncloudClean - // owncloudShortname ); diff --git a/tasks/rainloop.js b/tasks/rainloop.js index 814882a8e..76f7929e4 100644 --- a/tasks/rainloop.js +++ b/tasks/rainloop.js @@ -1,4 +1,4 @@ -/* RainLoop Webmail (c) RainLoop Team | Licensed under AGPL 3 */ +/* RainLoop Webmail (c) RainLoop Team | Licensed under MIT */ /* eslint-disable consistent-return */ const gulp = require('gulp'); const fs = require('node-fs'); @@ -6,7 +6,7 @@ const chmod = require('gulp-chmod'); const pkg = require('../package.json'); const { config } = require('./config'); -const { copy, zip, del } = require('./common'); +const { zip, del } = require('./common'); const rainloopCopy = () => { const versionFull = pkg.version, @@ -32,23 +32,14 @@ const rainloopSetup = (done) => { fs .readFileSync('index.php', 'utf8') .replace("'APP_VERSION', '0.0.0'", "'APP_VERSION', '" + versionFull + "'") - .replace( - "'APP_VERSION_TYPE', 'source'", - "'APP_VERSION_TYPE', '" + (config.community ? 'community' : 'standard') + "'" - ) ); fs.writeFileSync(dist + 'rainloop/v/' + versionFull + '/index.php.root', fs.readFileSync(dist + 'index.php')); - if (config.community) { - require('rimraf').sync(dist + 'rainloop/v/' + versionFull + '/app/libraries/RainLoop/Providers/Prem.php'); - } - config.destPath = config.releasesPath + '/webmail/' + versionFull + '/'; config.cleanPath = dist; config.zipSrcPath = dist; - config.zipFile = 'rainloop-' + (config.community ? 'community-' : '') + versionFull + '.zip'; - // config.zipFileShort = 'rainloop-' + (config.community ? 'community-' : '') + 'latest.zip'; + config.zipFile = 'rainloop-legacy-' + versionFull + '.zip'; config.rainloopBuilded = true; @@ -71,8 +62,6 @@ const rainloopClean = (done) => { done(); }; -// const rainloopShortName = (done) => copy(config.destPath + config.zipFile, config.destPath + config.zipFileShort, done); - exports.rainloopBuild = gulp.series(rainloopCopy, rainloopSetup); -exports.rainloop = gulp.series(exports.rainloopBuild, rainloopZip, rainloopClean /*, rainloopShortName*/); +exports.rainloop = gulp.series(exports.rainloopBuild, rainloopZip, rainloopClean); diff --git a/tasks/vendors.js b/tasks/vendors.js index 41a26f172..ee3668696 100644 --- a/tasks/vendors.js +++ b/tasks/vendors.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 header = require('gulp-header'); const stripbom = require('gulp-stripbom'); diff --git a/tasks/watch.js b/tasks/watch.js index bba3a4431..33e65f06b 100644 --- a/tasks/watch.js +++ b/tasks/watch.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 { config } = require('./config'); diff --git a/tasks/webpack.js b/tasks/webpack.js index 4452dfd21..3327cc8cf 100644 --- a/tasks/webpack.js +++ b/tasks/webpack.js @@ -1,4 +1,4 @@ -/* RainLoop Webmail (c) RainLoop Team | Licensed under AGPL 3 */ +/* RainLoop Webmail (c) RainLoop Team | Licensed under MIT */ const webpack = require('webpack'); const gutil = require('gulp-util'); @@ -34,5 +34,5 @@ const webpackCallback = (done) => (err, stats) => { }; exports.webpack = (done) => { - webpack(webpackCfgBuilder(config.paths.staticJS, !config.community, 'production'), webpackCallback(done)); + webpack(webpackCfgBuilder(config.paths.staticJS, 'production'), webpackCallback(done)); }; diff --git a/webpack.config.builder.js b/webpack.config.builder.js index 9d88f56f3..e67612c68 100644 --- a/webpack.config.builder.js +++ b/webpack.config.builder.js @@ -55,7 +55,7 @@ const babelLoaderOptions = function() { }; process.noDeprecation = true; -module.exports = function(publicPath, pro, mode) { +module.exports = function(publicPath, mode) { return { mode: mode || 'development', devtool: 'inline-source-map', @@ -80,7 +80,6 @@ module.exports = function(publicPath, pro, mode) { }, plugins: [ new webpack.DefinePlugin({ - 'RL_COMMUNITY': !pro, 'process.env.NODE_ENV': JSON.stringify('production'), 'process.env': { NODE_ENV: JSON.stringify('production') From a146d73f4b20eb21cbb43059f47158404859e58b Mon Sep 17 00:00:00 2001 From: the-djmaze <> Date: Thu, 1 Sep 2022 00:25:05 +0200 Subject: [PATCH 63/72] Licensed under MIT --- tasks/common.js | 2 +- tasks/config.js | 2 +- tasks/rollup.js | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/tasks/common.js b/tasks/common.js index 1f88d14ed..6ed596229 100644 --- a/tasks/common.js +++ b/tasks/common.js @@ -12,6 +12,6 @@ exports.copy = (sFile, sNewFile, done) => { done(); }; -exports.getHead = () => config.head.agpl; +exports.getHead = () => config.head.mit; exports.cleanStatic = () => del(config.paths.static); diff --git a/tasks/config.js b/tasks/config.js index 8c3d2c6b8..1d5aa7931 100644 --- a/tasks/config.js +++ b/tasks/config.js @@ -3,7 +3,7 @@ const path = require('path'); const config = { head: { - agpl: '/* SnappyMail Webmail (c) SnappyMail | Licensed under AGPL v3 */' + mit: '/* SnappyMail Webmail (c) SnappyMail | Licensed under MIT */' }, devVersion: '0.0.0', diff --git a/tasks/rollup.js b/tasks/rollup.js index ebf8407c3..6c47c4684 100644 --- a/tasks/rollup.js +++ b/tasks/rollup.js @@ -1,4 +1,4 @@ -/* SnappyMail Webmail (c) SnappyMail Team | Licensed under AGPL 3 */ +/* SnappyMail Webmail (c) SnappyMail Team | Licensed under MIT */ const rollup2 = require('gulp-rollup-2'); const includePaths = require('rollup-plugin-includepaths'); const externalGlobals = require('rollup-plugin-external-globals'); From 17fa03106456f7315bb32380ac14cc2806250f46 Mon Sep 17 00:00:00 2001 From: the-djmaze <> Date: Thu, 1 Sep 2022 21:16:52 +0200 Subject: [PATCH 64/72] Revert RainLoop merge that caused MIT vs AGPL --- LICENSE | 674 +++++++++++++++++- README.md | 4 +- .../RainLoop/Plugins/AbstractPlugin.php | 2 +- tasks/common.js | 2 +- tasks/config.js | 2 +- tasks/rollup.js | 2 +- 6 files changed, 663 insertions(+), 23 deletions(-) diff --git a/LICENSE b/LICENSE index 1a6999c1a..dba13ed2d 100644 --- a/LICENSE +++ b/LICENSE @@ -1,21 +1,661 @@ -MIT License + GNU AFFERO GENERAL PUBLIC LICENSE + Version 3, 19 November 2007 -Copyright (c) 2022 RainLoopTeam + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: + Preamble -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. + The GNU Affero General Public License is a free, copyleft license for +software and other kinds of works, specifically designed to ensure +cooperation with the community in the case of network server software. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. \ No newline at end of file + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +our General Public Licenses are intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + Developers that use our General Public Licenses protect your rights +with two steps: (1) assert copyright on the software, and (2) offer +you this License which gives you legal permission to copy, distribute +and/or modify the software. + + A secondary benefit of defending all users' freedom is that +improvements made in alternate versions of the program, if they +receive widespread use, become available for other developers to +incorporate. Many developers of free software are heartened and +encouraged by the resulting cooperation. However, in the case of +software used on network servers, this result may fail to come about. +The GNU General Public License permits making a modified version and +letting the public access it on a server without ever releasing its +source code to the public. + + The GNU Affero General Public License is designed specifically to +ensure that, in such cases, the modified source code becomes available +to the community. It requires the operator of a network server to +provide the source code of the modified version running there to the +users of that server. Therefore, public use of a modified version, on +a publicly accessible server, gives the public access to the source +code of the modified version. + + An older license, called the Affero General Public License and +published by Affero, was designed to accomplish similar goals. This is +a different license, not a version of the Affero GPL, but Affero has +released a new version of the Affero GPL which permits relicensing under +this license. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU Affero General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Remote Network Interaction; Use with the GNU General Public License. + + Notwithstanding any other provision of this License, if you modify the +Program, your modified version must prominently offer all users +interacting with it remotely through a computer network (if your version +supports such interaction) an opportunity to receive the Corresponding +Source of your version by providing access to the Corresponding Source +from a network server at no charge, through some standard or customary +means of facilitating copying of software. This Corresponding Source +shall include the Corresponding Source for any work covered by version 3 +of the GNU General Public License that is incorporated pursuant to the +following paragraph. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the work with which it is combined will remain governed by version +3 of the GNU General Public License. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU Affero General Public License from time to time. Such new versions +will be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU Affero General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU Affero General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU Affero General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If your software can interact with users remotely through a computer +network, you should also make sure that it provides a way for users to +get its source. For example, if your program is a web application, its +interface could display a "Source" link that leads users to an archive +of the code. There are many ways you could offer source, and different +solutions will be better for different programs; see section 13 for the +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 +. diff --git a/README.md b/README.md index 40145ab77..e4780db9f 100644 --- a/README.md +++ b/README.md @@ -31,8 +31,8 @@ And don't forget to read the [RainLoop documentation](https://www.rainloop.net/d ## License **SnappyMail** is released under -**MIT License**. -https://choosealicense.com/licenses/mit/ +**GNU AFFERO GENERAL PUBLIC LICENSE Version 3 (AGPL)**. +http://www.gnu.org/licenses/agpl-3.0.html Copyright (c) 2020 - 2022 SnappyMail Copyright (c) 2013 - 2021 RainLoop 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/tasks/common.js b/tasks/common.js index 6ed596229..1f88d14ed 100644 --- a/tasks/common.js +++ b/tasks/common.js @@ -12,6 +12,6 @@ exports.copy = (sFile, sNewFile, done) => { done(); }; -exports.getHead = () => config.head.mit; +exports.getHead = () => config.head.agpl; exports.cleanStatic = () => del(config.paths.static); diff --git a/tasks/config.js b/tasks/config.js index 1d5aa7931..8c3d2c6b8 100644 --- a/tasks/config.js +++ b/tasks/config.js @@ -3,7 +3,7 @@ const path = require('path'); const config = { head: { - mit: '/* SnappyMail Webmail (c) SnappyMail | Licensed under MIT */' + agpl: '/* SnappyMail Webmail (c) SnappyMail | Licensed under AGPL v3 */' }, devVersion: '0.0.0', diff --git a/tasks/rollup.js b/tasks/rollup.js index 6c47c4684..097d5ca5c 100644 --- a/tasks/rollup.js +++ b/tasks/rollup.js @@ -1,4 +1,4 @@ -/* SnappyMail Webmail (c) SnappyMail Team | Licensed under MIT */ +/* SnappyMail Webmail (c) SnappyMail Team | Licensed under AGPL v3 */ const rollup2 = require('gulp-rollup-2'); const includePaths = require('rollup-plugin-includepaths'); const externalGlobals = require('rollup-plugin-external-globals'); From 1a130d0be3c27c3f5095bde2257fa22cfa93a562 Mon Sep 17 00:00:00 2001 From: the-djmaze <> Date: Thu, 1 Sep 2022 21:28:37 +0200 Subject: [PATCH 65/72] ?admin use JavaScript Optional chaining --- dev/Settings/Admin/About.js | 4 ++-- dev/Settings/Admin/Contacts.js | 2 +- dev/Settings/Admin/General.js | 2 +- dev/Settings/Admin/Packages.js | 10 +++++----- 4 files changed, 9 insertions(+), 9 deletions(-) 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..7e33241db 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); } @@ -113,7 +113,7 @@ export class AdminSettingsPackages extends AbstractViewSettings { if (iError) { plugin.enabled(disable); this.packagesError( - (Notification.UnsupportedPluginPackage === iError && data && data.ErrorMessage) + (Notification.UnsupportedPluginPackage === iError && data?.ErrorMessage) ? data.ErrorMessage : getNotification(iError) ); From 8d192445a781de4b2184011dde3cebd48f2f4478 Mon Sep 17 00:00:00 2001 From: the-djmaze <> Date: Thu, 1 Sep 2022 21:37:32 +0200 Subject: [PATCH 66/72] v2.17.4 --- .../files/usr/local/include/application.ini | 2 +- README.md | 48 +++++++++---------- dev/View/User/MailBox/MessageList.js | 18 +++---- integrations/cloudron/DESCRIPTION.md | 2 +- integrations/cloudron/Dockerfile | 2 +- integrations/nextcloud/snappymail/VERSION | 2 +- .../nextcloud/snappymail/appinfo/info.xml | 2 +- integrations/virtualmin/snappymail.pl | 2 +- package.json | 2 +- 9 files changed, 38 insertions(+), 42 deletions(-) diff --git a/.docker/release/files/usr/local/include/application.ini b/.docker/release/files/usr/local/include/application.ini index 4bb31a7f9..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.3" +current = "2.17.4" saved = "Fri, 04 Mar 2022 08:55:26 +0000" diff --git a/README.md b/README.md index e4780db9f..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 | 81.839 | -|app.js |4.215.733 | 403.769 | -|boot.js | 672.433 | 2.050 | -|libs.js | 647.679 | 197.015 | +|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 | 325.908 | 0 | +|polyfills.js | 334.608 | 0 | |serviceworker.js | 0 | 285 | -|TOTAL |8.019.778 | 771.154 | +|TOTAL |8.240.095 | 771.804 | |js/min/* |RainLoop |Snappy |RL gzip |SM gzip |RL brotli |SM brotli | |--------------- |--------: |--------: |------: |------: |--------: |--------: | -|admin.min.js | 255.514 | 40.858 | 73.899 | 13.598 | 60.674 | 12.171 | -|app.min.js | 516.000 | 190.891 |140.430 | 61.956 |110.657 | 53.244 | -|boot.min.js | 66.456 | 1.252 | 22.553 | 778 | 20.043 | 628 | -|libs.min.js | 574.626 | 95.026 |177.280 | 35.140 |151.855 | 31.455 | +|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.608 | 0 | 11.315 | 0 | 10.072 | 0 | -|TOTAL user |1.189.690 | 287.169 |351.061 | 97.874 |292.627 | 85.327 | -|TOTAL user+sieve |1.189.690 | 329.132 |351.061 |108.368 |292.627 | 94.787 | -|TOTAL admin | 929.204 | 137.136 |285.047 | 49.516 |242.644 | 44.254 | +|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 | 81.864 | 46.959 | 16.905 | 14.559 | -|app.min.css | 274.791 | 65.790 | 39.618 | 14.965 | 13.162 | +|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.747 | | 6.763 | 5.870 | -|admin.min.css | | 23.901 | | 6.128 | 5.389 | +|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/dev/View/User/MailBox/MessageList.js b/dev/View/User/MailBox/MessageList.js index f963189f3..570199f39 100644 --- a/dev/View/User/MailBox/MessageList.js +++ b/dev/View/User/MailBox/MessageList.js @@ -613,19 +613,20 @@ export class MailMessageList extends AbstractViewRight { AppUserStore.focusedState(Scope.MessageList); } - let el = eqs(event, '.e-paginator a'); - el && this.gotoPage(ko.dataFor(el)); + let data = ko.dataFor(el), + el = eqs(event, '.e-paginator a'); + el && this.gotoPage(data); eqs(event, '.checkboxCheckAll') && this.checkAll(!this.checkAll()); el = eqs(event, '.flagParent'); - el && this.flagMessages(ko.dataFor(el)); + el && this.flagMessages(data); el = eqs(event, '.threads-len'); - el && this.gotoThread(ko.dataFor(el)); + el && this.gotoThread(data); }, dblclick: event => { - let el = eqs(event, '.actionHandle'); + let el = eqs(event, '.actionHandle'); el && this.gotoThread(ko.dataFor(el)); } }); @@ -717,15 +718,10 @@ export class MailMessageList extends AbstractViewRight { }); registerShortcut('t', '', [Scope.MessageList], () => { - let message = MessagelistUserStore.selectedMessage(); - if (!message) { - message = MessagelistUserStore.focusedMessage(); - } - + let message = MessagelistUserStore.selectedMessage() || MessagelistUserStore.focusedMessage(); if (message && 0 < message.threadsLen()) { this.gotoThread(message); } - return false; }); diff --git a/integrations/cloudron/DESCRIPTION.md b/integrations/cloudron/DESCRIPTION.md index 933e5b885..d9c178956 100644 --- a/integrations/cloudron/DESCRIPTION.md +++ b/integrations/cloudron/DESCRIPTION.md @@ -1,4 +1,4 @@ -This app packages SnappyMail 2.17.3. +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 11833ddfc..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.3 +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 5d3908e28..d14c10042 100755 --- a/integrations/nextcloud/snappymail/VERSION +++ b/integrations/nextcloud/snappymail/VERSION @@ -1 +1 @@ -2.17.3 \ 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 847b7bafd..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.3 + 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 8fb692ba6..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.3" ); +return ( "2.17.4" ); } sub script_snappymail_version_desc diff --git a/package.json b/package.json index 85ce369c6..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.3", + "version": "2.17.4", "homepage": "https://snappymail.eu", "author": { "name": "DJ Maze", From bae103257cd4f4fb1517a6bbd0d564e0d4d17e5b Mon Sep 17 00:00:00 2001 From: the-djmaze <> Date: Fri, 2 Sep 2022 09:06:07 +0200 Subject: [PATCH 67/72] Bugfix: i broke the messagelist click function --- dev/View/User/MailBox/MessageList.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dev/View/User/MailBox/MessageList.js b/dev/View/User/MailBox/MessageList.js index 570199f39..90ffc93a8 100644 --- a/dev/View/User/MailBox/MessageList.js +++ b/dev/View/User/MailBox/MessageList.js @@ -613,8 +613,8 @@ export class MailMessageList extends AbstractViewRight { AppUserStore.focusedState(Scope.MessageList); } - let data = ko.dataFor(el), - el = eqs(event, '.e-paginator a'); + let el = eqs(event, '.e-paginator a'), + data = ko.dataFor(el); el && this.gotoPage(data); eqs(event, '.checkboxCheckAll') && this.checkAll(!this.checkAll()); From afd65c809da4b8fa003a88ece2728f022498e220 Mon Sep 17 00:00:00 2001 From: the-djmaze <> Date: Fri, 2 Sep 2022 09:56:31 +0200 Subject: [PATCH 68/72] Drop Remote.request() aAbortActions parameter --- dev/Common/Folders.js | 14 ++++---------- dev/Remote/AbstractFetch.js | 5 +---- dev/Remote/User/Fetch.js | 9 ++++----- dev/Settings/Admin/Packages.js | 4 ++-- dev/View/Popup/Compose.js | 7 ++----- dev/View/Popup/Contacts.js | 7 ++----- 6 files changed, 15 insertions(+), 31 deletions(-) diff --git a/dev/Common/Folders.js b/dev/Common/Folders.js index 45d037a6b..b75bf7cfc 100644 --- a/dev/Common/Folders.js +++ b/dev/Common/Folders.js @@ -249,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, @@ -257,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/Remote/AbstractFetch.js b/dev/Remote/AbstractFetch.js index 72c0fdc09..544a7ea04 100644 --- a/dev/Remote/AbstractFetch.js +++ b/dev/Remote/AbstractFetch.js @@ -123,16 +123,13 @@ 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, diff --git a/dev/Remote/User/Fetch.js b/dev/Remote/User/Fetch.js index 7122b677f..b8d00ad62 100644 --- a/dev/Remote/User/Fetch.js +++ b/dev/Remote/User/Fetch.js @@ -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/Settings/Admin/Packages.js b/dev/Settings/Admin/Packages.js index 7e33241db..d204859f1 100644 --- a/dev/Settings/Admin/Packages.js +++ b/dev/Settings/Admin/Packages.js @@ -59,7 +59,7 @@ export class AdminSettingsPackages extends AbstractViewSettings { requestHelper(packageToRequest, install) { return (iError, data) => { PackageAdminStore.forEach(item => { - if (packageToRequest && item?.loading() && packageToRequest.file === item.file) { + if (packageToRequest && item?.loading?.() && packageToRequest.file === item.file) { packageToRequest.loading(false); item.loading(false); } @@ -109,7 +109,7 @@ 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( diff --git a/dev/View/Popup/Compose.js b/dev/View/Popup/Compose.js index e192d7e2a..065792db1 100644 --- a/dev/View/Popup/Compose.js +++ b/dev/View/Popup/Compose.js @@ -758,7 +758,7 @@ 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( @@ -772,10 +772,7 @@ export class ComposePopupView extends AbstractViewPopup { { Query: value // ,Page: 1 - }, - null, - '', - ['Suggestions'] + } ); } diff --git a/dev/View/Popup/Contacts.js b/dev/View/Popup/Contacts.js index 16a76e988..443935390 100644 --- a/dev/View/Popup/Contacts.js +++ b/dev/View/Popup/Contacts.js @@ -403,7 +403,7 @@ export class ContactsPopupView extends AbstractViewPopup { } ContactUserStore.loading(true); - Remote.request('Contacts', + Remote.abort('Contacts').request('Contacts', (iError, data) => { let count = 0, list = []; @@ -429,10 +429,7 @@ export class ContactsPopupView extends AbstractViewPopup { Offset: offset, Limit: CONTACTS_PER_PAGE, Search: this.search() - }, - null, - '', - ['Contacts'] + } ); } From ab0b2b152cf6960943742bdc4f3ce92bce68f6d9 Mon Sep 17 00:00:00 2001 From: the-djmaze <> Date: Fri, 2 Sep 2022 09:57:30 +0200 Subject: [PATCH 69/72] Solution for #487 ? --- dev/Remote/AbstractFetch.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev/Remote/AbstractFetch.js b/dev/Remote/AbstractFetch.js index 544a7ea04..02c2d9efc 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; From d9bc435e2c8cbf9e182b010020651216154a1368 Mon Sep 17 00:00:00 2001 From: the-djmaze <> Date: Fri, 2 Sep 2022 10:38:42 +0200 Subject: [PATCH 70/72] MessageList click was really broken --- dev/View/User/MailBox/MessageList.js | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/dev/View/User/MailBox/MessageList.js b/dev/View/User/MailBox/MessageList.js index 90ffc93a8..2ca3705d8 100644 --- a/dev/View/User/MailBox/MessageList.js +++ b/dev/View/User/MailBox/MessageList.js @@ -613,17 +613,16 @@ export class MailMessageList extends AbstractViewRight { AppUserStore.focusedState(Scope.MessageList); } - let el = eqs(event, '.e-paginator a'), - data = ko.dataFor(el); - el && this.gotoPage(data); + let el = eqs(event, '.e-paginator a'); + el && this.gotoPage(ko.dataFor(el)); eqs(event, '.checkboxCheckAll') && this.checkAll(!this.checkAll()); el = eqs(event, '.flagParent'); - el && this.flagMessages(data); + el && this.flagMessages(ko.dataFor(el)); el = eqs(event, '.threads-len'); - el && this.gotoThread(data); + el && this.gotoThread(ko.dataFor(el)); }, dblclick: event => { let el = eqs(event, '.actionHandle'); From 732b6eb64175e225a5c9448de510e9c759959648 Mon Sep 17 00:00:00 2001 From: the-djmaze <> Date: Fri, 2 Sep 2022 11:52:07 +0200 Subject: [PATCH 71/72] Use JavaScript Optional chaining --- dev/Common/Audio.js | 4 +-- dev/Common/Cache.js | 9 +++---- dev/Common/File.js | 2 +- dev/Common/Folders.js | 4 +-- dev/Common/Globals.js | 2 +- dev/Common/Html.js | 19 +++++++------- dev/Common/Plugins.js | 7 ++--- dev/Common/Selector.js | 2 +- dev/Common/Translator.js | 2 +- dev/Common/Utils.js | 3 +-- dev/Common/UtilsUser.js | 8 +++--- dev/Component/AbstractInput.js | 2 +- dev/Component/EmailAddresses.js | 6 ++--- dev/External/User/ko.js | 16 ++++++------ dev/External/ko.js | 8 +++--- dev/Knoin/AbstractModel.js | 5 ++-- dev/Knoin/AbstractViews.js | 2 +- dev/Knoin/Knoin.js | 39 +++++++++++++--------------- dev/Model/AbstractCollection.js | 2 +- dev/Model/Email.js | 4 +-- dev/Model/EmailCollection.js | 2 +- dev/Model/FolderCollection.js | 6 ++--- dev/Model/Message.js | 4 +-- dev/Remote/AbstractFetch.js | 12 ++++----- dev/Remote/User/Fetch.js | 4 +-- dev/Screen/AbstractSettings.js | 8 +++--- dev/Screen/User/MailBox.js | 2 +- dev/Settings/User/Accounts.js | 6 ++--- dev/Settings/User/Filters.js | 2 +- dev/Settings/User/Themes.js | 8 ++---- dev/Sieve/View/Filter.js | 3 +-- dev/Stores/Admin/Package.js | 2 +- dev/Stores/User/App.js | 2 +- dev/Stores/User/Contact.js | 4 +-- dev/Stores/User/Folder.js | 15 +++-------- dev/Stores/User/GnuPG.js | 16 ++++++------ dev/Stores/User/Message.js | 2 +- dev/Stores/User/Messagelist.js | 7 +++-- dev/Stores/User/Notification.js | 8 +++--- dev/Stores/User/OpenPGP.js | 2 +- dev/Stores/User/Pgp.js | 2 +- dev/View/Popup/Account.js | 4 +-- dev/View/Popup/Compose.js | 32 +++++++++++------------ dev/View/Popup/Contacts.js | 8 +++--- dev/View/Popup/Domain.js | 2 +- dev/View/Popup/Identity.js | 4 +-- dev/View/Popup/Languages.js | 2 +- dev/View/Popup/OpenPgpGenerate.js | 2 +- dev/View/User/Login.js | 4 +-- dev/View/User/MailBox/FolderList.js | 6 ++--- dev/View/User/MailBox/MessageList.js | 10 +++---- dev/View/User/MailBox/MessageView.js | 20 +++++++------- dev/View/User/SystemDropDown.js | 2 +- dev/dragdropgecko.js | 4 +-- dev/shortcuts.js | 5 ++-- 55 files changed, 169 insertions(+), 199 deletions(-) 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/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 b75bf7cfc..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(); @@ -134,7 +134,7 @@ refreshFoldersInterval = 300000, * @param {Array=} list = [] */ folderInformation = (folder, list) => { - if (folder && folder.trim()) { + if (folder?.trim()) { fetchFolderInformation( (iError, data) => { if (!iError && data.Result) { 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 1d8254ca4..30df92788 100644 --- a/dev/Common/Html.js +++ b/dev/Common/Html.js @@ -28,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 @@ -47,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 @@ -256,7 +256,7 @@ export const value = value.slice(4); setAttribute('data-x-src-cid', value); attachment = findAttachmentByCid(value); - if (attachment && attachment.download) { + if (attachment?.download) { oElement.src = attachment.linkPreview(); attachment.isInline(true); attachment.isLinked(true); @@ -320,7 +320,7 @@ 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); @@ -434,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}. ` : ' * ')); @@ -567,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()); }); } } @@ -575,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); } } @@ -685,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 afc294ad2..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))); } ) } 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/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 9edd51477..61b5ed2c5 100644 --- a/dev/Model/Email.js +++ b/dev/Model/Email.js @@ -283,7 +283,7 @@ export class EmailModel extends AbstractModel { */ static reviveFromJson(json) { const email = super.reviveFromJson(json); - email && email.clearDuplicateName(); + email?.clearDuplicateName(); return email; } @@ -351,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 af05d3e2f..2a91f2b74 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 cdc27aad0..38ef408bb 100644 --- a/dev/Model/Message.js +++ b/dev/Model/Message.js @@ -323,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 || '']; } @@ -399,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) || ''; } /** diff --git a/dev/Remote/AbstractFetch.js b/dev/Remote/AbstractFetch.js index 02c2d9efc..19046b364 100644 --- a/dev/Remote/AbstractFetch.js +++ b/dev/Remote/AbstractFetch.js @@ -136,7 +136,7 @@ export class AbstractFetchRemote undefined === iTimeout ? 30000 : pInt(iTimeout), data => { let cached = false; - if (data && data.Time) { + if (data?.Time) { cached = pInt(data.Time) > Date.now() - start; } @@ -162,7 +162,7 @@ export class AbstractFetchRemote } } - fCallback && fCallback( + fCallback?.( iError, data, cached, @@ -173,7 +173,7 @@ export class AbstractFetchRemote ) .catch(err => { console.error({fetchError:err}); - fCallback && fCallback( + fCallback?.( 'TimeoutError' == err.reason ? 3 : (err.name == 'AbortError' ? 2 : 1), err ); @@ -191,7 +191,7 @@ export class AbstractFetchRemote if (trigger) { value = !!value; (isArray(trigger) ? trigger : [trigger]).forEach(fTrigger => { - fTrigger && fTrigger(value); + fTrigger?.(value); }); } } @@ -207,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 b8d00ad62..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); 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 b40134792..a6f3f0054 100644 --- a/dev/Screen/User/MailBox.js +++ b/dev/Screen/User/MailBox.js @@ -95,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/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/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/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/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/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 6f7534850..aec4bf758 100644 --- a/dev/Stores/User/Folder.js +++ b/dev/Stores/User/Folder.js @@ -80,15 +80,9 @@ export const FolderUserStore = new class { 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()); } }); 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 652537fe8..be15ac2e4 100644 --- a/dev/Stores/User/OpenPGP.js +++ b/dev/Stores/User/OpenPGP.js @@ -196,7 +196,7 @@ export const OpenPGPUserStore = new class { 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 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/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/Compose.js b/dev/View/Popup/Compose.js index 065792db1..1f56d11b1 100644 --- a/dev/View/Popup/Compose.js +++ b/dev/View/Popup/Compose.js @@ -213,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 => { @@ -222,9 +222,7 @@ export class ComposePopupView extends AbstractViewPopup { return email && identityEmail.trim() !== email; }); - if (isIn) { - list.push(identityEmail); - } + isIn && list.push(identityEmail); context[name](list.join(',')); } @@ -355,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, @@ -511,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 = ''; @@ -611,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 { @@ -762,7 +760,7 @@ export class ComposePopupView extends AbstractViewPopup { (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) { @@ -777,7 +775,7 @@ export class ComposePopupView extends AbstractViewPopup { } selectIdentity(identity) { - identity = identity && identity.item; + identity = identity?.item; if (identity) { this.currentIdentity(identity); this.setSignatureFromIdentity(identity); @@ -1153,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) @@ -1180,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); } @@ -1266,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; @@ -1354,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]; } }); @@ -1381,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(); @@ -1435,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 && @@ -1491,7 +1489,7 @@ export class ComposePopupView extends AbstractViewPopup { this.sending(false); this.saving(false); - this.oEditor && this.oEditor.clear(); + this.oEditor?.clear(); this.dropMailvelope(); } diff --git a/dev/View/Popup/Contacts.js b/dev/View/Popup/Contacts.js index 443935390..e727870eb 100644 --- a/dev/View/Popup/Contacts.js +++ b/dev/View/Popup/Contacts.js @@ -108,7 +108,7 @@ export class ContactsPopupView extends AbstractViewPopup { contactHasValidName: () => !!this.viewProperties.find(prop => propertyIsName(prop) && prop.isValid()), contactsCheckedOrSelected: () => { - const checked = ContactUserStore.filter(item => item.checked && item.checked()), + const checked = ContactUserStore.filter(item => item.checked?.()), selected = this.currentContact(); return selected @@ -120,7 +120,7 @@ export class ContactsPopupView extends AbstractViewPopup { contactsSyncEnabled: () => ContactUserStore.allowSync() && ContactUserStore.syncMode(), - viewHash: () => '' + this.viewProperties.map(property => property.value && property.value()).join('') + viewHash: () => '' + this.viewProperties.map(property => property.value?.()).join('') }); this.search.subscribe(() => this.reloadContactList()); @@ -164,7 +164,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; } } @@ -344,7 +344,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); diff --git a/dev/View/Popup/Domain.js b/dev/View/Popup/Domain.js index 258f4552b..d5bc6151b 100644 --- a/dev/View/Popup/Domain.js +++ b/dev/View/Popup/Domain.js @@ -248,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/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 cc6345827..113f3d98d 100644 --- a/dev/View/User/MailBox/FolderList.js +++ b/dev/View/User/MailBox/FolderList.js @@ -82,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) { @@ -170,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 2ca3705d8..d94831820 100644 --- a/dev/View/User/MailBox/MessageList.js +++ b/dev/View/User/MailBox/MessageList.js @@ -210,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) { @@ -326,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(); } @@ -428,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 ? { @@ -571,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( @@ -718,7 +718,7 @@ export class MailMessageList extends AbstractViewRight { registerShortcut('t', '', [Scope.MessageList], () => { let message = MessagelistUserStore.selectedMessage() || MessagelistUserStore.focusedMessage(); - if (message && 0 < message.threadsLen()) { + if (0 < message?.threadsLen()) { this.gotoThread(message); } return false; diff --git a/dev/View/User/MailBox/MessageView.js b/dev/View/User/MailBox/MessageView.js index 3cfa04522..20b4d7613 100644 --- a/dev/View/User/MailBox/MessageView.js +++ b/dev/View/User/MailBox/MessageView.js @@ -134,8 +134,8 @@ 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, tagsAllowed: () => FolderUserStore.currentFolder() ? FolderUserStore.currentFolder().tagsAllowed() : false, @@ -286,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 => { @@ -393,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; } @@ -411,7 +411,7 @@ export class MailMessageView extends AbstractViewRight { // print addShortcut('p,printscreen', 'meta', [Scope.MessageView, Scope.MessageList], () => { - currentMessage() && currentMessage().printMessage(); + currentMessage()?.printMessage(); return false; }); @@ -510,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, { @@ -518,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 { @@ -577,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, @@ -596,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 + ')' }); @@ -604,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 7013f8c5d..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; 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; From 3553bfa2d92c7d208f5a1742586d50aaa3cf352b Mon Sep 17 00:00:00 2001 From: the-djmaze <> Date: Fri, 2 Sep 2022 12:11:47 +0200 Subject: [PATCH 72/72] TypeError fCallback not a function --- dev/Remote/AbstractFetch.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dev/Remote/AbstractFetch.js b/dev/Remote/AbstractFetch.js index 19046b364..a90f27f8f 100644 --- a/dev/Remote/AbstractFetch.js +++ b/dev/Remote/AbstractFetch.js @@ -162,7 +162,7 @@ export class AbstractFetchRemote } } - fCallback?.( + fCallback && fCallback( iError, data, cached, @@ -173,7 +173,7 @@ export class AbstractFetchRemote ) .catch(err => { console.error({fetchError:err}); - fCallback?.( + fCallback && fCallback( 'TimeoutError' == err.reason ? 3 : (err.name == 'AbortError' ? 2 : 1), err );