diff --git a/dashboard/public/translation/de.json b/dashboard/public/translation/de.json index ccfeb5534..55f38bcce 100644 --- a/dashboard/public/translation/de.json +++ b/dashboard/public/translation/de.json @@ -610,7 +610,7 @@ "bounce": "Bounce", "incoming": "Eingehend", "queued": "Warteschlange", - "deferredInfo": "Die Zustellung von E-Mail ist fehlgeschlagen. Wird in {{ details.delay }} Sekunden erneut versucht.", + "deferredInfo": "Die Zustellung von E-Mail ist fehlgeschlagen. Wird in {{ delay }} Sekunden erneut versucht.", "deliveredInfo": "Zugestellte E-Mail", "receivedInfo": "Gespeichert", "deniedInfo": "Verbindung verweigert", diff --git a/dashboard/public/translation/nl.json b/dashboard/public/translation/nl.json index 8c9ca31b1..efe965be2 100644 --- a/dashboard/public/translation/nl.json +++ b/dashboard/public/translation/nl.json @@ -215,7 +215,8 @@ "users": "Gebruikers", "externalLdapTooltip": "Van extern LDAP adresboek", "newGroupAction": "Nieuwe groep", - "count": "Totaal groepen: {{ count }}" + "count": "Totaal groepen: {{ count }}", + "emptyPlaceholder": "Nog geen groepen" }, "settings": { "title": "Gebruiker instellingen", @@ -1524,7 +1525,8 @@ }, "settingsDialog": { "description": "Beheer hier je persoonlijke notificatie -instellingen. Cloudron zal een e-mail versturen voor de geselecteerde gebeurtenissen naar je primaire e-mailadres." - } + }, + "allCaughtUp": "Alles bijgewerkt" }, "logs": { "title": "Logbestanden", diff --git a/dashboard/public/translation/ru.json b/dashboard/public/translation/ru.json index c5bc022cb..6770b737d 100644 --- a/dashboard/public/translation/ru.json +++ b/dashboard/public/translation/ru.json @@ -62,7 +62,9 @@ "close": "Закрыть", "no": "Нет", "yes": "Да", - "delete": "Удалить" + "delete": "Удалить", + "edit": "Редактировать", + "done": "Готово" }, "username": "Имя пользователя", "displayName": "Отображаемое имя", @@ -212,7 +214,9 @@ "newGroupAction": "Новая группа", "name": "Имя", "users": "Пользователи", - "externalLdapTooltip": "Из внешнего LDAP каталога" + "externalLdapTooltip": "Из внешнего LDAP каталога", + "count": "Итого групп: {{ count }}", + "emptyPlaceholder": "Группы отсутствуют" }, "settings": { "title": "Настройки пользователя", @@ -457,7 +461,9 @@ "neverUsed": "никогда", "scope": "Область", "readonly": "Только для чтения", - "readwrite": "Чтение и запись" + "readwrite": "Чтение и запись", + "allowedIpRangesPlaceholder": "IP адреса или подсети, разделённые запятой", + "allowedIpRanges": "Разрешённые IP адреса" }, "loginTokens": { "title": "Токены для входа в систему", @@ -502,7 +508,8 @@ "name": "Имя API Токена", "description": "Новый API Токен:", "generateToken": "Сгенерировать API Токен", - "access": "API доступ" + "access": "API доступ", + "allowedIpRanges": "Разрешённые диапазоны IP" }, "changePasswordAction": "Изменить пароль", "disable2FAAction": "Выключить 2FA", @@ -515,7 +522,13 @@ "changeBackgroundImage": { "title": "Установить фоновое изображение" }, - "enable2FANotAvailable": "Недоступно для пользователей из удалённых источников" + "enable2FANotAvailable": "Недоступно для пользователей из удалённых источников", + "removeApiToken": { + "title": "Вы точно хотите удалить этот токен?" + }, + "removeAppPassword": { + "title": "Вы точно хотите удалить этот пароль?" + } }, "app": { "uninstallDialog": { @@ -662,7 +675,7 @@ "addMountAction": "Добавить том", "saveAction": "Сохранить", "readOnly": "Только чтение", - "title": "Монтирование", + "title": "Смонтированные тома", "permissions": { "readOnly": "Только для чтения", "readWrite": "Чтение и Запись", @@ -759,7 +772,7 @@ "recovery": { "title": "Восстановление работы приложения", "description": "Если приложение не отвечает, попробуйте перезагрузить его. Если же приложение циклично перезапускается из-за ошибок в настройке или сломанного плагина, включите режим восстановления для дальнейшей работы в консоли.\nСоветуем ознакомиться с инструкцией для восстановления работы приложения.", - "restartAction": "Перезагрузить приложение", + "restartAction": "Запустить повторно", "enableRecoveryModeAction": "Включить режим восстановления", "disableRecoveryModeAction": "Выключить режим восстановления" }, @@ -774,12 +787,12 @@ "startStop": { "title": "Запуск / Остановка", "description": "Вместо удаления, приложение может быть остановлено для освобождения ресурсов сервера. Будущие резервные копии не сохранят текущее состояние приложения до момента остановки. Рекомендуется запустить процесс резервного копирования вручную до остановки работы приложения.", - "startAction": "Запустить приложение", - "stopAction": "Остановить приложение" + "startAction": "Запустить", + "stopAction": "Остановить" }, "uninstall": { "title": "Удаление", - "description": "Данное действие приведёт к полному удалению приложения и его данных. Сайт перестанет быть доступным.", + "description": "Данное действие приведёт к полному удалению приложения и его данных. Резервные копии будут очищены в соответствии с политикой резервного копирования.", "uninstallAction": "Удалить" } }, @@ -793,7 +806,9 @@ "sso": "Данное приложение настроено на аутентификацию с каталогом пользователей Cloudron. Пользователи Cloudron могут войти в систему и использовать её без дополнительных настроек.", "customAppUpdateWarning": "Это стороннее приложение не будет получать автоматических обновлений из магазина. Советуем ознакомиться с Документацией, чтобы узнать о том, как обновить приложение самостоятельно.", "appDocsUrl": "Пожалуйста, ознакомьтесь с нашей документацией для получения полезной информации о работе системы и конкретного приложения. Если Вам необходима дополнительная помощь, Вы можете задать свой вопрос на форуме Cloudron.", - "checklist": "Чеклист администратора" + "checklist": "Чеклист администратора", + "checklistShow": "Показать чек-лист", + "checklistHide": "Скрыть чек-лист" }, "repairDialog": { "title": "Восстановить {{ app }}", @@ -864,6 +879,17 @@ "notes": { "title": "Заметки администратора" } + }, + "archive": { + "action": "Архивировать", + "latestBackupInfo": "Последняя резервная копия создана {{date}}.", + "title": "Архив", + "description": "Последняя резервная копия будет добавлена в Архив. Приложение будет удалено, но его можно восстановить из интерфейса Резервного копирования. Другие резервные копии будут очищены в соответствии с политикой резервного копирования.", + "noBackup": "Приложение не имеет резервных копий. Архивирование требует по крайней мере одну резервную копию." + }, + "archiveDialog": { + "title": "Архивирование {{app}}", + "description": "Это действие удалит приложение и поместит его последнюю резервную копию от {{date}} в Архив." } }, "backups": { @@ -961,7 +987,8 @@ "cifsSealSupport": "Использовать SEAL шифрование. Требуется SMB v3", "chown": "Удалённая файловая система поддерживает chown", "encryptedFilenames": "Зашифрованные имена файлов", - "encryptFilenames": "Шифровать имена файлов" + "encryptFilenames": "Шифровать имена файлов", + "preserveAttributesLabel": "Сохранить атрибуты файла" }, "title": "Резервные копии", "logs": { @@ -992,6 +1019,26 @@ "tooltip": "Также будет сохранена почта и {{ appsLength } резервных копий." }, "remotePath": "Удаленный путь" + }, + "restoreArchiveDialog": { + "title": "Восстановить из Архива", + "restoreActionOverwrite": "Восстановить и перезаписать DNS", + "restoreAction": "Восстановить", + "description": "Это действие установит {{appId}} на выбранный адрес из резервной копии от {{creationTime}}." + }, + "archives": { + "title": "Архив приложения", + "info": "Информация" + }, + "archive": { + "description": "Удаленные архивы очищаются в соответствии с политикой резервного копирования." + }, + "deleteArchiveDialog": { + "title": "Удаление Архива {{appTitle}} ({{fqdn}})", + "description": "После удаления, архивы будут очищены в соответствии с политикой резервного копирования." + }, + "deleteArchive": { + "deleteAction": "Удалить" } }, "branding": { @@ -1034,7 +1081,7 @@ "solrNotRunning": "Не запущено", "acl": "Почтовый ACL (Access Control List)", "maxMailSize": "Максимальный размер письма", - "solrFts": "Полный поиск по тексту (Solr)", + "solrFts": "Полнотекстовый поиск", "aclOverview": "{{ dnsblZonesCount }} DNSBL зон", "virtualAllMail": "Папка \"Вся почта\"" }, @@ -1096,10 +1143,10 @@ "sendAction": "Отправить" }, "solrConfig": { - "title": "Полный поиск по тексту (Solr)", - "enableSolrCheckbox": "Включить полный поиск по тексту (Solr)", + "title": "Полнотекстовый поиск", + "enableSolrCheckbox": "Включить полнотекстовый поиск", "notEnoughMemory": "Пожалуйста, выделите не менее 3ГБ оперативной памяти для почтовой службы, чтобы включить solr.", - "description": "Solr может быть использовать для обеспечение быстрого поиска по тексту писем. Solr может быть запущен только в том случае, если почтовой службебыло предоставлено не менее 3ГБ оперативной памяти." + "description": "Solr&Tika предоставляют быстрый полнотекстовый поиск по электронным письмам и вложениям. Solr может быть запущен только в том случае, если почтовой службевыделено не менее 3ГБ оперативной памяти." }, "typeFilterHeader": "Все события", "aclDialog": { @@ -1439,7 +1486,8 @@ "gandiTokenTypeApiKey": "API Ключ (Устарело)", "gandiTokenTypePAT": "Персональный токен доступа (PAT)", "inwxUsername": "Имя пользователя", - "inwxPassword": "Пароль" + "inwxPassword": "Пароль", + "customNameservers": "Домен использует пользовательские серверы имён" }, "addDomain": "Добавить домен", "removeDialog": { @@ -1464,7 +1512,21 @@ "dismissTooltip": "Отклонить", "clearAll": "Очистить все", "markAllAsRead": "Пометить все как прочитанные", - "nonePending": "Новых уведомлений нет!" + "nonePending": "Новых уведомлений нет!", + "settings": { + "rebootRequired": "Требуется перезагрузка сервера", + "cloudronUpdateFailed": "Сбой обновления Cloudron", + "title": "Настройки уведомлений", + "backupFailed": "Сбой резервного копирования", + "certificateRenewalFailed": "Сбой обновления сертификата", + "appOutOfMemory": "Приложению не хватило памяти", + "appUp": "Приложение снова в онлайне", + "appDown": "Приложение не работает" + }, + "allCaughtUp": "Уведомления отсутствуют", + "settingsDialog": { + "description": "Здесь вы можете управлять вашими личными настройками уведомлений. Cloudron будет отправлять электронные письма для выбранных событий на главный адрес электронной почты." + } }, "logs": { "title": "Логи", @@ -1795,7 +1857,7 @@ "resetPasswordAction": "Сбросить пароль", "loginTo": "Войти в", "username": "Имя пользователя", - "2faToken": "2FA Токен (если включен)", + "2faToken": "2FA Токен", "errorIncorrectCredentials": "Неправильное имя пользователя или пароль", "errorIncorrect2FAToken": "Неверный 2FA токен", "errorInternal": "Внутренняя ошибка, попробуйте позже", @@ -1941,21 +2003,21 @@ }, "oidc": { "newClientDialog": { - "createAction": "Создать", - "title": "Добавить клиента", - "description": "Добавить настройки нового клиента OpenID connect." + "createAction": "Добавить", + "title": "Добавить клиента OIDC", + "description": "Внесите настройки нового клиента OIDC" }, "client": { "name": "Имя", "id": "ID Клиента", "secret": "Секрет", "signingAlgorithm": "Метод подписи", - "loginRedirectUri": "URL обратного вызова (если больше одного, отделите их запятой)", + "loginRedirectUri": "URL обратного вызова (разделённые запятой)", "logoutRedirectUri": "URL обратного вызова для выхода из системы (необязательно)" }, "clients": { "title": "Клиенты", - "newClient": "Новый клиент", + "newClient": "Новый Клиент", "empty": "Клиенты не найдены" }, "title": "Поставщик OpenID Сonnect", @@ -1965,7 +2027,7 @@ }, "deleteClientDialog": { "title": "Вы точно хотите удалить клиента {{ client }}?", - "description": "Это действие отключит все внешние OpenID приложения, использующие данный клиент ID, от Cloudron." + "description": "Удаление этого клиента OIDC приведет к аннулированию всех токенов доступа. Приложения, использующие этот клиент OIDC, больше не смогут проходить аутентификацию." }, "env": { "discoveryUrl": "URL обнаружения", diff --git a/dashboard/src/models/MailModel.js b/dashboard/src/models/MailModel.js index 244daa907..a6e60a8bf 100644 --- a/dashboard/src/models/MailModel.js +++ b/dashboard/src/models/MailModel.js @@ -290,6 +290,12 @@ function create() { } if (result.status !== 200) return [result]; + + // some eventlogs miss uuid so lets make a unique id `uuid-ts` + result.body.eventlogs.forEach(e => { + e._id = `${e.uuid}-${e.ts}`; + }); + return [null, result.body.eventlogs]; }, async setMailRelay(domain, data) { diff --git a/dashboard/src/views/EmailsEventlogView.vue b/dashboard/src/views/EmailsEventlogView.vue index 96720da18..057465d10 100644 --- a/dashboard/src/views/EmailsEventlogView.vue +++ b/dashboard/src/views/EmailsEventlogView.vue @@ -1,13 +1,8 @@