diff --git a/dashboard/public/translation/en.json b/dashboard/public/translation/en.json
index 38cd58dab..b649aa12f 100644
--- a/dashboard/public/translation/en.json
+++ b/dashboard/public/translation/en.json
@@ -1711,7 +1711,7 @@
},
"taskError": {
"title": "Task Error",
- "description": "If a configuration, update, restore or backup action resulted in an error, you can retry the task.",
+ "description": "If an installation, configuration, update, restore or backup action resulted in an error, you can retry the task.",
"retryAction": "Retry {{ task }} task"
},
"appIsBusyTooltip": "App is busy"
diff --git a/dashboard/public/translation/pt.json b/dashboard/public/translation/pt.json
index 239394ce6..7d5bba497 100644
--- a/dashboard/public/translation/pt.json
+++ b/dashboard/public/translation/pt.json
@@ -443,7 +443,10 @@
"mailmanager": "Gestor de E-mails e Utilizadores"
},
"transferOwnershipDialog": {
- "newOwner": "Novo Proprietário"
+ "newOwner": "Novo Proprietário",
+ "title": "Deseja transferir a propriedade?",
+ "transferAction": "Transferir Propriedade",
+ "description": "Isto tornará o utilizador selecionado o proprietário e o administrador deste Cloudron e removerá os direitos de administrador do proprietário atual."
},
"setGhostDialog": {
"password": "Palavra-passe",
@@ -836,7 +839,12 @@
"subscriptionChangeAction": "Gerir Subscrição",
"subscriptionReactivateAction": "Reativar Subscrição",
"emailNotVerified": "E-mail ainda não foi verificado",
- "subscriptionSetupAction": "Atualizar para Premium"
+ "subscriptionSetupAction": "Atualizar para Premium",
+ "resetDialog": {
+ "title": "Deseja redefinir a Id. do Cloudron",
+ "description": "Isto desligará o Cloudron da conta Cloudron.io atual."
+ },
+ "resetAction": "Reiniciar Registo"
},
"updates": {
"checkForUpdatesAction": "Procurar por Atualizações",
diff --git a/dashboard/public/translation/ru.json b/dashboard/public/translation/ru.json
index b437a6759..25c4ef357 100644
--- a/dashboard/public/translation/ru.json
+++ b/dashboard/public/translation/ru.json
@@ -15,7 +15,7 @@
"description": "После открытия доступа приложения отобразятся здесь.",
"title": "У Вас ещё нет доступа к каким-либо приложениям."
},
- "configActionTooltip": "Настройки",
+ "configActionTooltip": "Конфигурация",
"logsActionTooltip": "Логи",
"infoActionTooltip": "Подробнее",
"adminPageActionTooltip": "Панель администратора",
@@ -148,7 +148,7 @@
"lowOnResources": "Недостаточно системных ресурсов.",
"subscriptionRequired": "Для установки дополнительных приложений требуется платная подписка.",
"setupSubscriptionAction": "Настроить подписку",
- "manualWarning": "Вручную добавьте A запись для {{ location }}, указав публичный IP Вашего Cloudron",
+ "manualWarning": "Вручную добавьте A (IPv4) и AAAA (IPv6) запись DNS для {{ location }}, указав публичный IP вашего сервера",
"userManagementMailbox": "Все пользователи этого Cloudron с почтовым ящиком имеют доступ.",
"installAction": "Установить",
"titleAndVersion": "Приложение {{ title }} {{ version }}",
@@ -524,10 +524,10 @@
},
"enable2FANotAvailable": "Недоступно для пользователей из удалённых источников",
"removeApiToken": {
- "title": "Вы точно хотите удалить этот токен?"
+ "title": "Вы точно хотите удалить токен {{ name }}?"
},
"removeAppPassword": {
- "title": "Вы точно хотите удалить этот пароль?"
+ "title": "Вы точно хотите удалить пароль {{ name }}?"
}
},
"app": {
@@ -602,7 +602,8 @@
"saveAction": "Сохранить",
"aliases": "Псевдонимы",
"addAliasAction": "Добавить псевдоним",
- "noAliases": "Не настроено ни одного домена-псевдонима."
+ "noAliases": "Не настроено ни одного домена-псевдонима.",
+ "dnsoverwrite": "Некоторые DNS записи уже существуют. Подтвердите перезапись."
},
"accessControl": {
"sftp": {
@@ -724,7 +725,9 @@
"7d": "7 дней",
"30d": "30 дней",
"24h": "24 часа",
- "6h": "6 часов"
+ "6h": "6 часов",
+ "live": "Онлайн",
+ "1h": "1 час"
},
"memoryTitle": "Память (RAM + Swap) в МБ",
"diskTitle": "Использование диска",
@@ -869,12 +872,14 @@
"turn": {
"title": "Настроить TURN",
"enable": "Настроить использование встроенного TURN сервера в приложении",
- "disable": "Не настраивать TURN сервер для данного приложения. Вы можете настроить его самостоятельно внутри самого приложения."
+ "disable": "Не настраивать TURN сервер для данного приложения. Вы можете настроить его самостоятельно внутри самого приложения.",
+ "info": "Включите эту опцию, чтобы настроить приложение на использование встроенного TURN сервера. Если отключено, настройки TURN приложения остаются неизменными."
},
"redis": {
"title": "Настроить Redis",
"enable": "Настроить использование Redis в приложении",
- "disable": "Отключить Redis"
+ "disable": "Отключить Redis",
+ "info": "Если включено, приложение будет использовать встроенную службу Redis. Если отключено, настройки Redis приложения остаются неизменными."
},
"infoTabTitle": "Информация",
"info": {
@@ -893,7 +898,8 @@
"title": "Архивирование {{app}}",
"description": "Это действие удалит приложение и поместит его последнюю резервную копию от {{date}} в Архив."
},
- "updateAvailableTooltip": "Доступно обновление"
+ "updateAvailableTooltip": "Доступно обновление",
+ "configureTooltip": "Настроить"
},
"backups": {
"location": {
@@ -1045,7 +1051,7 @@
}
},
"branding": {
- "title": "Брендинг",
+ "title": "Внешний вид",
"cloudronName": "Имя Cloudron",
"logo": "Логотип",
"footer": {
@@ -1099,8 +1105,8 @@
"bounce": "Возвращено",
"spamFilterTrained": "Спам фильтр обучен",
"deferredInfo": "Ошибка доставки, повторная попытка через {{ delay }}сек.",
- "inboundInfo": "Получено",
- "outboundInfo": "Поставлен в очередь на доставку",
+ "inboundInfo": "Поставлено во входящую очередь",
+ "outboundInfo": "Поставлено в исходящую очередь",
"outgoing": "Исходящие",
"incoming": "Входящие",
"deferred": "Отсрочено",
@@ -1109,7 +1115,9 @@
"spamFilterTrainedInfo": "Спам фильтр обучен с использованием содержимого почтового ящика",
"overQuotaInfo": "Почтовый ящик {{ mailbox }} использует {{ quotaPercent }}% квоты",
"underQuotaInfo": "Почтовый ящик {{ mailbox }} превысил квоту на {{ quotaPercent }}%",
- "quota": "Квота почтового ящика"
+ "quota": "Квота почтового ящика",
+ "sentInfo": "Отправлено",
+ "savedInfo": "Сохранено"
},
"searchPlaceholder": "Поиск",
"from": "От",
@@ -1121,7 +1129,7 @@
"description": "Данное действие перенесёт IMAP и SMTP сервер в указанное расположение.",
"location": "Расположение",
"locationPlaceholder": "Оставьте пустым, чтобы использовать основной домен",
- "manualInfo": "Вручную добавьте A запись для {{ domain }}, указав публичный IP Вашего Cloudron"
+ "manualInfo": "Вручную добавьте A (IPv4) и AAAA (IPv6) DNS запись для {{ domain }}, указав публичный IP вашего сервера"
},
"changeMailSizeDialog": {
"title": "Изменить максимальный размер письма",
@@ -1251,7 +1259,7 @@
"refresh": "Обновить"
},
"settings": {
- "title": "Настройки",
+ "title": "Система",
"appstoreAccount": {
"title": "Учётная запись Cloudron.io",
"description": "Учётная запись Cloudron.io открывает доступ к Магазину приложений и управлению подпиской.",
@@ -1263,7 +1271,12 @@
"subscriptionSetupAction": "Обновить до Premium",
"subscriptionChangeAction": "Управление подпиской",
"subscriptionReactivateAction": "Реактивировать подписку",
- "emailNotVerified": "Электронная почта не подтверждена"
+ "emailNotVerified": "Электронная почта не подтверждена",
+ "resetDialog": {
+ "title": "Полностью сбросить Cloudron ID",
+ "description": "Это действие отвяжет настоящий аккаунт cloudron.io от данного Cloudron."
+ },
+ "resetAction": "Сбросить регистрацию"
},
"timezone": {
"title": "Системный часовой пояс",
@@ -1290,7 +1303,8 @@
"username": "Имя пользователя",
"configureAction": "Настроить реестр",
"serverNotSet": "Не настроено",
- "usernameNotSet": "Не настроено"
+ "usernameNotSet": "Не настроено",
+ "deleteQuestion": "Вы действительно хотите удалить этот реестр?"
},
"privateDockerRegistryDialog": {
"title": "Настройка частного реестра",
@@ -1379,7 +1393,7 @@
"graphSubtext": "Отображаются приложения, использующие более {{ threshold }} памяти"
},
"cpuUsage": {
- "title": "Использование CPU",
+ "title": "CPU",
"graphTitle": "Процент",
"graphSubtext": "Отображаются приложения, использующие более {{ threshold }} CPU"
},
@@ -1395,6 +1409,9 @@
},
"graphs": {
"title": "Графики"
+ },
+ "locale": {
+ "title": "Настройки локализации"
}
},
"eventlog": {
@@ -1457,7 +1474,7 @@
"addDescription": "Добавление домена даст возможность устанавливать приложения на его поддомены. Настроить электронную почту для выбранного домена можно в специальном разделе.",
"linodeToken": "Токен Linode",
"namecheapInfo": "IP-адрес сервера должен быть разрешён для этого ключа API.",
- "wildcardInfo": "Настройте A записи для *.{{ domain }}. и {{ domain }}. на IP-адрес данного сервера.",
+ "wildcardInfo": "Вручную настройте A (IPv4) и AAAA (IPv6) DNS записи для *.{{ domain }}. и {{ domain }}. на IP-адрес данного сервера",
"fallbackCert": "Резервный сертификат (необязательно)",
"fallbackCertCustomCert": "Сторонний сертификат",
"fallbackCertCustomCertInfo": "Этот wildcard-сертификат будет использоваться для всех приложений на данном домене. В случае его отсутствия будет использован автоматически сгенерированный самоподписанный сертификат.",
@@ -1522,11 +1539,12 @@
"certificateRenewalFailed": "Сбой обновления сертификата",
"appOutOfMemory": "Приложению не хватило памяти",
"appUp": "Приложение снова в онлайне",
- "appDown": "Приложение не работает"
+ "appDown": "Приложение не работает",
+ "diskSpace": "Мало места на диске"
},
"allCaughtUp": "Уведомления отсутствуют",
"settingsDialog": {
- "description": "Здесь вы можете управлять вашими личными настройками уведомлений. Cloudron будет отправлять электронные письма для выбранных событий на главный адрес электронной почты."
+ "description": "Для выбранных событий будут отправляться уведомления на главный адрес электронной почты."
}
},
"logs": {
@@ -1769,7 +1787,7 @@
"title": "Подпись",
"subscriptionRequired": "Данная функция доступна только в платной подписке. Настроить подписку",
"plainTextFormat": "Обычный текст",
- "htmlFormat": "Текст HTML (Необязательно)",
+ "htmlFormat": "Формат HTML",
"saveAction": "Сохранить",
"description": "Данный текст будет прикреплён ко всем письмам, отправляемым с выбранного домена."
},
@@ -1779,7 +1797,9 @@
"smtpStatus": {
"title": "Статус SMTP",
"notBlacklisted": "IP-адрес сервера {{ ip }} не обнаружен в списках заблокированных.",
- "blacklisted": "IP-адрес сервера {{ ip }} обнаружен в списке заблокированных."
+ "blacklisted": "IP-адрес сервера {{ ip }} обнаружен в списке заблокированных.",
+ "outboundSmtp": "Исходящий SMTP",
+ "rblCheck": "Проверка чёрного списка DNS"
},
"subscriptionDialog": {
"title": "Требуется подписка",
@@ -2036,5 +2056,10 @@
"authEndpoint": "Конечная точка аутентификации"
}
},
- "automation": "Автоматизация"
+ "automation": "Автоматизация",
+ "userdirectory": {
+ "settings": {
+ "title": "Настройки"
+ }
+ }
}
diff --git a/dashboard/public/translation/vi.json b/dashboard/public/translation/vi.json
index 290a76092..2c31fb8ca 100644
--- a/dashboard/public/translation/vi.json
+++ b/dashboard/public/translation/vi.json
@@ -1122,7 +1122,7 @@
"uninstalledApp": "App đã xoá",
"diskSpeed": "Tốc độ: {{ speed }} MB/s"
},
- "title": "Chỉ số đo lường",
+ "title": "Hệ thống",
"info": {
"activationTime": "Ngày tạo Cloudron",
"platformVersion": "Phiên bản hệ thống",
@@ -1247,7 +1247,12 @@
"setupAction": "Cài đặt tài khoản",
"description": "Tài khoản Cloudron.io được dùng để truy cập Cửa hàng App và quản lý gói đăng ký.",
"title": "Tài khoản Cloudron.io",
- "emailNotVerified": "Địa chỉ email chưa được xác minh"
+ "emailNotVerified": "Địa chỉ email chưa được xác minh",
+ "resetDialog": {
+ "title": "Chắc chắn cài đặt lại Cloudron ID",
+ "description": "Việc này sẽ ngắt kết nối Cloudron khỏi tài khoản cloudron.io hiện tại."
+ },
+ "resetAction": "Cài đặt lại Đăng ký"
},
"title": "Hệ thống"
},
@@ -1829,7 +1834,7 @@
},
"uninstallDialog": {
"uninstallAction": "Xoá",
- "description": "Lựa chọn này sẽ ngay lập tức xoá app {{ app }} và xoá toàn bộ dữ liệu trong đó.",
+ "description": "Lựa chọn này sẽ xoá {{ app }} và xoá toàn bộ dữ liệu trong đó.",
"title": "Xoá {{ app }}"
},
"stopDialog": {
@@ -1898,7 +1903,9 @@
"archiveDialog": {
"title": "Lưu trữ {{app}}",
"description": "Việc này sẽ xóa app và đặt bản sao lưu app mới nhất được tạo ra lúc {{date}} trong Kho lưu trữ App."
- }
+ },
+ "updateAvailableTooltip": "Có phiên bản cập nhật mới",
+ "configureTooltip": "Cấu hình"
},
"volumes": {
"name": "Tên volume",
@@ -2049,5 +2056,10 @@
"tokenEndpoint": "Điểm cuối token"
}
},
- "automation": "Tự động hoá"
+ "automation": "Tự động hoá",
+ "userdirectory": {
+ "settings": {
+ "title": "Cài đặt"
+ }
+ }
}
diff --git a/dashboard/src/views/AppConfigureView.vue b/dashboard/src/views/AppConfigureView.vue
index f6ae721de..e4594c64f 100644
--- a/dashboard/src/views/AppConfigureView.vue
+++ b/dashboard/src/views/AppConfigureView.vue
@@ -52,6 +52,12 @@ const isAppStopped = computed(() => {
});
function onSetView(newView) {
+ if (!isViewEnabled(newView, app.value.error?.details?.installationState)) {
+ currentView.value = 'info';
+ window.location.hash = `/app/${id.value}/info`;
+ return;
+ }
+
currentView.value = newView;
window.location.hash = `/app/${id.value}/${newView}`;
}
@@ -151,16 +157,18 @@ async function refresh() {
function isViewEnabled(view, errorState) {
if (!errorState) return true;
- if (view === 'info'
- || view === 'display'
- || view === 'uninstall'
+ if (view === 'info' || view === 'uninstall' || view === 'eventlog') return true;
+
+ if (errorState === ISTATES.PENDING_INSTALL) return view === 'repair';
+ if (errorState === ISTATES.PENDING_UNINSTALL) return false;
+
+ if (view === 'display'
|| view === 'backups'
|| view === 'access'
|| view === 'proxy'
|| view === 'graphs'
|| view === 'security'
|| view === 'cron'
- || view === 'eventlog'
) return true;
if (view === 'location') {