diff --git a/dashboard/public/translation/en.json b/dashboard/public/translation/en.json
index 5d83fe3d7..311067f69 100644
--- a/dashboard/public/translation/en.json
+++ b/dashboard/public/translation/en.json
@@ -63,7 +63,10 @@
"groups": "Groups"
},
"statusEnabled": "Enabled",
- "loadingPlaceholder": "Loading"
+ "loadingPlaceholder": "Loading",
+ "platform": {
+ "startupFailed": "Platform startup failed"
+ }
},
"appstore": {
"title": "App Store",
diff --git a/dashboard/public/translation/nl.json b/dashboard/public/translation/nl.json
index a973c53ea..d737e92e2 100644
--- a/dashboard/public/translation/nl.json
+++ b/dashboard/public/translation/nl.json
@@ -44,7 +44,8 @@
"edit": "Bewerk",
"add": "Toevoegen",
"next": "Volgende",
- "configure": "Configureer"
+ "configure": "Configureer",
+ "restart": "Herstart"
},
"rebootDialog": {
"title": "Herstart Server",
@@ -1074,7 +1075,8 @@
"unlinkDialog": {
"title": "Ontkoppel Cloudron.io Account",
"description": "Ontkoppel deze Cloudron van het huidige Cloudron.io-account. Het kan daarna gelinkt worden aan een ander account."
- }
+ },
+ "expired": "Abonnement verlopen"
},
"timezone": {
"title": "Systeem tijdzone",
diff --git a/dashboard/public/translation/ru.json b/dashboard/public/translation/ru.json
index 5a9bfd62e..3778f1346 100644
--- a/dashboard/public/translation/ru.json
+++ b/dashboard/public/translation/ru.json
@@ -50,7 +50,8 @@
"edit": "Редактировать",
"add": "Добавить",
"next": "Следующий",
- "configure": "Настроить"
+ "configure": "Настроить",
+ "restart": "Перезапуск"
},
"searchPlaceholder": "Поиск",
"multiselect": {
@@ -343,13 +344,13 @@
"app": {
"uninstallDialog": {
"uninstallAction": "Удалить",
- "title": "Удалить {{ app }}",
+ "title": "Удалить приложение",
"description": "Удалить \"{{ app }}\" и все его данные?"
},
"updates": {
"info": {
"customAppUpdateInfo": "Для сторонних приложений автообновления недоступны.",
- "description": "Название и версия приложения",
+ "description": "Название & версия приложения",
"appId": "ID приложения",
"packageVersion": "Версия контейнера",
"lastUpdated": "Обновлен",
@@ -360,12 +361,12 @@
"description": "Обновления приложения применяются периодически, в соответствии с расписанием обновлений"
},
"updates": {
- "description": "Cloudron периодически проверяет Магазин приложений на наличие обновлений."
+ "description": "Cloudron автоматически проверяет Магазин приложений на наличие обновлений. Вы также можете проверить их вручную."
}
},
"backups": {
"backups": {
- "description": "Резервные копии - это полные снимки ваших приложений. Вы можете использовать резервные копии для восстановления работы приложения или для его клонирования.",
+ "description": "Создать полный снимок приложения.",
"title": "Резервные копии",
"time": "Создан",
"downloadConfigTooltip": "Скачать конфигурацию",
@@ -377,8 +378,8 @@
"checkIntegrity": "Проверить целостность"
},
"import": {
- "title": "Импортировать из внешней резервной копии",
- "description": "Используйте данную опцию для переноса приложения с другого Cloudron. Другое приложение должно иметь ту же версию контейнера и настройки контроля доступа, что и это."
+ "title": "Импортировать",
+ "description": "Импортировать приложение из внешней резервной копии."
},
"auto": {
"title": "Автоматические резервные копии",
@@ -520,7 +521,7 @@
"email": {
"from": {
"saveAction": "Сохранить",
- "enable": "Использовать электронную почту Cloudron для отправки писем",
+ "enable": "Использовать электронную почту Cloudron для отправки email",
"mailboxPlaceholder": "Имя почтового ящика",
"title": "Адрес исходящей почты",
"disable": "Не настраивайте отправку электронной почты в приложении",
@@ -555,7 +556,7 @@
"repair": {
"recovery": {
"title": "Режим восстановления",
- "description": "Чтобы исправить сломанные плагины или неправильно внесённые изменения в конфигурацию, поместите приложение в Режим восстановления.",
+ "description": "Чтобы исправить сломанные плагины или неправильно внесённые изменения в конфигурацию, поместите приложение в режим восстановления.",
"restartAction": "Запустить повторно",
"disableAction": "Деактивировать режим восстановления",
"enableAction": "Активировать режим восстановления"
@@ -608,7 +609,7 @@
"unstableWarning": "Данное обновление является пред-релизным и не может гарантировать полную стабильность. Применяйте его на свой страх и риск."
},
"restoreDialog": {
- "title": "Восстановить {{ app }}",
+ "title": "Восстановить приложение",
"restoreAction": "Восстановить",
"description": "Восстановить \"{{ fqdn }}\" из резервной копии, созданной {{ creationTime }}?",
"warning": "Любые данные, созданные между настоящим моментом и последней известной резервной копией будут безвозвратно утеряны. Рекомендуем создать резервную копию текущих данных перед восстановлением.",
@@ -616,7 +617,7 @@
"cloneActionOverwrite": "Клонировать и перезаписать DNS"
},
"cloneDialog": {
- "title": "Клонировать {{ app }}",
+ "title": "Клонировать приложение",
"location": "Расположение",
"description": "Используется резервная копия версии v{{ packageVersion }} от {{ creationTime }}"
},
@@ -632,11 +633,11 @@
},
"servicesTabTitle": "Службы",
"turn": {
- "title": "Настроить TURN",
+ "title": "Автонастройка TURN",
"info": "Включите эту опцию, чтобы настроить приложение на использование встроенного TURN сервера. Если отключено, настройки TURN приложения остаются неизменными."
},
"redis": {
- "title": "Настроить Redis",
+ "title": "Автонастройка Redis",
"info": "Если включено, приложение будет использовать встроенную службу Redis. Если отключено, настройки Redis приложения остаются неизменными."
},
"infoTabTitle": "Информация",
@@ -653,7 +654,7 @@
"noBackup": "Приложение не имеет резервных копий. Архивирование требует по крайней мере одну резервную копию."
},
"archiveDialog": {
- "title": "Архивирование {{app}}",
+ "title": "Архивировать приложение",
"description": "Это действие удалит приложение и поместит его последнюю резервную копию от {{date}} в Архив."
},
"updateAvailableTooltip": "Доступно обновление",
@@ -984,7 +985,8 @@
"unlinkDialog": {
"title": "Отвязать Аккаунт Cloudron.io",
"description": "Данное действие отвяжет этот Cloudron от действующего аккаунта Cloudron.io. После он может быть привязан к другому аккаунту."
- }
+ },
+ "expired": "Подписка истекла"
},
"timezone": {
"title": "Системный часовой пояс",
@@ -1460,7 +1462,7 @@
"title": "Сброс пароля",
"resetAction": "Сбросить",
"backToLoginAction": "Вернуться к входу в систему",
- "usernameOrEmail": "Имя пользователя или адрес электронной почты",
+ "usernameOrEmail": "Имя пользователя или email",
"passwordChanged": {
"submitAction": "Отправить"
},
@@ -1470,7 +1472,7 @@
},
"newPassword": {
"password": "Новый пароль",
- "passwordRepeat": "Повторите пароль",
+ "passwordRepeat": "Повторить пароль",
"title": "Установить новый пароль"
},
"emailSent": {
@@ -1482,7 +1484,7 @@
"openFileManagerActionTooltip": "Файловый менеджер",
"addVolumeDialog": {
"title": "Добавить том",
- "server": "IP сервера или Имя хоста",
+ "server": "IP сервера / Имя хоста",
"remoteDirectory": "Удалённый каталог",
"username": "Имя пользователя",
"password": "Пароль",
@@ -1510,9 +1512,9 @@
"username": "Имя пользователя",
"welcomeTo": "Добро пожаловать в",
"description": "Пожалуйста, настройте Ваш аккаунт",
- "fullName": "Полное Имя",
+ "fullName": "Полное имя",
"password": "Новый пароль",
- "passwordRepeat": "Повторите пароль",
+ "passwordRepeat": "Повторить пароль",
"errorPassword": "Пароль должен содержать не менее 8 символов",
"errorPasswordNoMatch": "Пароли не совпадают",
"setupAction": "Настроить",
@@ -1526,7 +1528,7 @@
},
"noUsername": {
"title": "Не получается установить аккаунт",
- "description": "Аккаунт не может быть без имени пользователя."
+ "description": "Аккаунт не может быть настроен без имени пользователя."
}
},
"welcomeEmail": {
@@ -1564,12 +1566,12 @@
"title": "Добавить клиента OIDC"
},
"client": {
- "name": "Имя",
+ "name": "Имя клиента",
"id": "ID Клиента",
- "secret": "Секрет",
+ "secret": "Секрет клиента",
"signingAlgorithm": "Метод подписи",
"loginRedirectUri": "URLs обратного вызова",
- "loginRedirectUriPlaceholder": "URLs адреса, разделённые запятой"
+ "loginRedirectUriPlaceholder": "URLs, разделённые запятой"
},
"description": "Провайдер OpenID Cloudron может быть использован для единого входа во внешние приложения.",
"editClientDialog": {
@@ -1603,7 +1605,7 @@
},
"backup": {
"target": {
- "label": "Локация резервных копий",
+ "label": "Локация",
"size": "Размер",
"fileCount": "Файлы"
},
@@ -1615,7 +1617,7 @@
"site": {
"removeDialog": {
"description": "Это действие также удалить любые резервные копии, находящиеся в данной локации.",
- "title": "Вы точно хотите удалить эту локацию резервных копий?"
+ "title": "Удалить локацию резервных копий"
}
}
},
@@ -1649,7 +1651,7 @@
},
"externallinks": {
"label": "Внешние ссылки",
- "description": "Добавляет ярлык на внешние сервисы в панель управления."
+ "description": "Добавляет ярлык на внешние сервисы в панель управления"
},
"server": {
"title": "Сервер"
diff --git a/dashboard/src/components/Headerbar.vue b/dashboard/src/components/Headerbar.vue
index d63528845..00c3f4064 100644
--- a/dashboard/src/components/Headerbar.vue
+++ b/dashboard/src/components/Headerbar.vue
@@ -7,12 +7,12 @@ const t = i18n.t;
import { onMounted, onUnmounted, ref, useTemplateRef, inject } from 'vue';
import { marked } from 'marked';
import { eachLimit } from 'async';
-import { Button, Popover, Icon, Spinner } from '@cloudron/pankow';
+import { Button, Popover, Icon, InputDialog, Spinner } from '@cloudron/pankow';
import { prettyDate, prettyLongDate } from '@cloudron/pankow/utils';
import NotificationsModel from '../models/NotificationsModel.js';
import ServicesModel from '../models/ServicesModel.js';
-const props = defineProps(['config', 'subscription']);
+defineProps(['config', 'subscription']);
const profile = inject('profile');
@@ -98,6 +98,15 @@ async function trackPlatformStatus() {
if (result.state === 'starting') platformTimeoutId = setTimeout(trackPlatformStatus, 5000);
}
+const inputDialog = useTemplateRef('inputDialog');
+function onShowPlatformError() {
+ inputDialog.value.info({
+ confirmLabel: t('main.dialog.close'),
+ title: t('main.platform.startupFailed'),
+ message: platformStatus.value.message,
+ });
+}
+
const description = marked.parse(t('support.help.description', {
docsLink: 'https://docs.cloudron.io',
packagingLink: 'https://docs.cloudron.io/packaging/tutorial',
@@ -119,6 +128,7 @@ onUnmounted(() => {