feat(docker-watcher): phase 14 - frontend polish & modern UI
Design system with CSS custom properties (light/dark themes). 38 Lucide SVG icon components. Dark mode with system preference. EN/RU localization with i18n store. Skeleton loaders, empty states, toggle switches, micro-interactions. Responsive sidebar with mobile hamburger menu. All pages polished with consistent styling.
This commit is contained in:
@@ -0,0 +1,351 @@
|
||||
{
|
||||
"app": {
|
||||
"name": "Docker Watcher",
|
||||
"version": "v0.1"
|
||||
},
|
||||
"nav": {
|
||||
"dashboard": "Панель",
|
||||
"projects": "Проекты",
|
||||
"deploy": "Деплой",
|
||||
"settings": "Настройки"
|
||||
},
|
||||
"dashboard": {
|
||||
"title": "Панель управления",
|
||||
"quickDeploy": "Быстрый деплой",
|
||||
"totalProjects": "Всего проектов",
|
||||
"runningInstances": "Запущенных экземпляров",
|
||||
"failedInstances": "Сбойных экземпляров",
|
||||
"projects": "Проекты",
|
||||
"retry": "Повторить",
|
||||
"noProjects": "Проектов пока нет.",
|
||||
"addFirst": "Добавьте первый проект",
|
||||
"loadFailed": "Не удалось загрузить панель"
|
||||
},
|
||||
"projects": {
|
||||
"title": "Проекты",
|
||||
"addProject": "Добавить проект",
|
||||
"cancel": "Отмена",
|
||||
"newProject": "Новый проект",
|
||||
"name": "Название",
|
||||
"image": "Образ",
|
||||
"port": "Порт",
|
||||
"registry": "Реестр",
|
||||
"created": "Создан",
|
||||
"view": "Открыть",
|
||||
"noProjects": "Проекты ещё не настроены.",
|
||||
"getStarted": "Нажмите «Добавить проект» для начала.",
|
||||
"createProject": "Создать проект",
|
||||
"creating": "Создание...",
|
||||
"healthcheck": "Путь проверки здоровья",
|
||||
"nameRequired": "Название и образ обязательны.",
|
||||
"loadFailed": "Не удалось загрузить проекты",
|
||||
"createFailed": "Не удалось создать проект"
|
||||
},
|
||||
"projectDetail": {
|
||||
"deleteProject": "Удалить проект",
|
||||
"envVars": "Переменные окружения",
|
||||
"volumes": "Тома",
|
||||
"stages": "Стадии",
|
||||
"noStages": "Для этого проекта не настроены стадии.",
|
||||
"pattern": "Шаблон",
|
||||
"autoDeploy": "авто-деплой",
|
||||
"requiresConfirm": "нужно подтверждение",
|
||||
"instances": "экземпляров",
|
||||
"deployNewVersion": "Развернуть новую версию",
|
||||
"selectTag": "Выберите тег для деплоя",
|
||||
"loadingTags": "Загрузка тегов...",
|
||||
"chooseTag": "Выберите тег...",
|
||||
"enterTag": "Введите тег образа (напр., dev-abc123)",
|
||||
"deploy": "Развернуть",
|
||||
"deploying": "Развёртывание...",
|
||||
"recentDeploys": "Последние деплои",
|
||||
"noDeployHistory": "Нет истории деплоев для этого проекта.",
|
||||
"tag": "Тег",
|
||||
"status": "Статус",
|
||||
"started": "Начат",
|
||||
"finished": "Завершён",
|
||||
"error": "Ошибка",
|
||||
"noInstancesRunning": "Нет запущенных экземпляров",
|
||||
"deleteConfirmTitle": "Удалить проект",
|
||||
"deleteConfirmMessage": "Это безвозвратно удалит проект '{name}' и все его стадии, экземпляры и историю деплоев.",
|
||||
"loadFailed": "Не удалось загрузить проект",
|
||||
"deleteFailed": "Не удалось удалить проект",
|
||||
"deployFailed": "Деплой не удался"
|
||||
},
|
||||
"envEditor": {
|
||||
"title": "Переменные окружения",
|
||||
"description": "Управление переопределениями переменных окружения на уровне стадий. Значения стадий переопределяют значения проекта.",
|
||||
"stage": "Стадия",
|
||||
"projectDefaults": "Значения проекта по умолчанию",
|
||||
"stageOverrides": "Переопределения стадии",
|
||||
"key": "Ключ",
|
||||
"value": "Значение",
|
||||
"secret": "Секрет",
|
||||
"source": "Источник",
|
||||
"actions": "Действия",
|
||||
"overridden": "переопределено",
|
||||
"inherited": "наследуется",
|
||||
"overridesProject": "переопределяет проект",
|
||||
"stageOnly": "только стадия",
|
||||
"edit": "Изменить",
|
||||
"change": "Изменить",
|
||||
"delete": "Удалить",
|
||||
"save": "Сохранить",
|
||||
"add": "Добавить",
|
||||
"adding": "Добавление...",
|
||||
"noStages": "Стадии не настроены. Сначала добавьте стадии к проекту.",
|
||||
"loadFailed": "Не удалось загрузить проект",
|
||||
"envAdded": "Переменная окружения добавлена",
|
||||
"envUpdated": "Переменная окружения обновлена",
|
||||
"envDeleted": "Переменная окружения удалена",
|
||||
"addFailed": "Не удалось добавить переменную",
|
||||
"updateFailed": "Не удалось обновить переменную",
|
||||
"deleteFailed": "Не удалось удалить переменную",
|
||||
"loadEnvFailed": "Не удалось загрузить переменные"
|
||||
},
|
||||
"volumeEditor": {
|
||||
"title": "Тома",
|
||||
"description": "Настройка монтирования томов для контейнеров.",
|
||||
"sharedDesc": "Режим «Общий» использует путь источника как есть для всех экземпляров.",
|
||||
"isolatedDesc": "Режим «Изолированный» добавляет /{stage}-{tag}/ к источнику, создавая свою директорию для каждого экземпляра.",
|
||||
"sourceHost": "Источник (хост)",
|
||||
"targetContainer": "Цель (контейнер)",
|
||||
"mode": "Режим",
|
||||
"actions": "Действия",
|
||||
"shared": "Общий",
|
||||
"isolated": "Изолированный",
|
||||
"edit": "Изменить",
|
||||
"delete": "Удалить",
|
||||
"save": "Сохранить",
|
||||
"add": "Добавить",
|
||||
"adding": "Добавление...",
|
||||
"noVolumes": "Тома ещё не настроены. Добавьте один выше.",
|
||||
"volumeAdded": "Том добавлен",
|
||||
"volumeUpdated": "Том обновлён",
|
||||
"volumeDeleted": "Том удалён",
|
||||
"loadFailed": "Не удалось загрузить тома",
|
||||
"addFailed": "Не удалось добавить том",
|
||||
"updateFailed": "Не удалось обновить том",
|
||||
"deleteFailed": "Не удалось удалить том"
|
||||
},
|
||||
"quickDeploy": {
|
||||
"title": "Быстрый деплой",
|
||||
"description": "Разверните образ контейнера без настройки. Вставьте URL образа, проверьте параметры и разверните.",
|
||||
"step1": "1. Введите URL образа",
|
||||
"imageUrl": "URL образа",
|
||||
"imageUrlHelp": "Полный URL образа с тегом (напр., git.example.com/user/app:dev-abc123)",
|
||||
"inspect": "Проверить",
|
||||
"inspecting": "Проверка...",
|
||||
"step2": "2. Проверка конфигурации",
|
||||
"reviewDesc": "Эти параметры были обнаружены из образа. Измените при необходимости перед деплоем.",
|
||||
"projectName": "Имя проекта",
|
||||
"port": "Порт",
|
||||
"portHelp": "Порт контейнера (1-65535)",
|
||||
"healthCheckPath": "Путь проверки здоровья",
|
||||
"healthCheckHelp": "Необязательный HTTP-путь для проверки работоспособности",
|
||||
"stage": "Стадия",
|
||||
"development": "Разработка",
|
||||
"release": "Релиз",
|
||||
"production": "Продакшн",
|
||||
"stageHelp": "Стадия развёртывания для этого образа",
|
||||
"subdomainOverride": "Переопределение поддомена",
|
||||
"subdomainHelp": "Оставьте пустым для использования шаблона по умолчанию",
|
||||
"envVars": "Переменные окружения",
|
||||
"envVarsHelp": "По одной на строку, формат KEY=VALUE",
|
||||
"step3": "3. Развёртывание",
|
||||
"deployDesc": "Будет создан новый проект и контейнер будет развёрнут немедленно.",
|
||||
"deployBtn": "Развернуть",
|
||||
"inspectedSuccess": "Образ успешно проверен",
|
||||
"deployedSuccess": "{name} успешно развёрнут!",
|
||||
"inspectFailed": "Не удалось проверить образ",
|
||||
"deployFailed": "Развёртывание не удалось"
|
||||
},
|
||||
"settings": {
|
||||
"title": "Настройки",
|
||||
"general": "Общие",
|
||||
"registries": "Реестры",
|
||||
"credentials": "Учётные данные",
|
||||
"authentication": "Аутентификация",
|
||||
"appearance": "Внешний вид"
|
||||
},
|
||||
"settingsGeneral": {
|
||||
"title": "Общие настройки",
|
||||
"globalConfig": "Глобальная конфигурация",
|
||||
"domain": "Домен",
|
||||
"domainHelp": "Базовый домен для маршрутизации поддоменов",
|
||||
"serverIp": "IP сервера",
|
||||
"serverIpHelp": "Публичный IP-адрес сервера",
|
||||
"dockerNetwork": "Docker-сеть",
|
||||
"dockerNetworkHelp": "Docker-сеть для развёрнутых контейнеров",
|
||||
"subdomainPattern": "Шаблон поддомена",
|
||||
"subdomainPatternHelp": "Шаблон для автоматически генерируемых поддоменов",
|
||||
"pollingInterval": "Интервал опроса (секунды)",
|
||||
"pollingIntervalHelp": "Как часто проверять реестры на новые теги (10-86400)",
|
||||
"notificationUrl": "URL уведомлений",
|
||||
"notificationUrlHelp": "URL вебхука для уведомлений о деплоях",
|
||||
"saveSettings": "Сохранить настройки",
|
||||
"saving": "Сохранение...",
|
||||
"saved": "Настройки успешно сохранены",
|
||||
"saveFailed": "Не удалось сохранить настройки",
|
||||
"loadFailed": "Не удалось загрузить настройки",
|
||||
"webhookUrl": "URL вебхука",
|
||||
"webhookDesc": "Этот секретный URL получает уведомления о push-событиях из вашего CI-пайплайна.",
|
||||
"noWebhookUrl": "URL вебхука не настроен",
|
||||
"copy": "Копировать",
|
||||
"copied": "URL вебхука скопирован в буфер обмена",
|
||||
"regenerateUrl": "Перегенерировать URL",
|
||||
"regenerating": "Перегенерация...",
|
||||
"regenerated": "URL вебхука перегенерирован",
|
||||
"regenerateFailed": "Не удалось перегенерировать URL вебхука",
|
||||
"regenerateWarning": "Внимание: перегенерация сделает текущий URL недействительным. Обновите ваши CI-пайплайны."
|
||||
},
|
||||
"settingsRegistries": {
|
||||
"title": "Реестры контейнеров",
|
||||
"description": "Управление реестрами контейнеров для обнаружения образов.",
|
||||
"addRegistry": "Добавить реестр",
|
||||
"editRegistry": "Редактировать реестр",
|
||||
"addNewRegistry": "Добавить новый реестр",
|
||||
"name": "Название",
|
||||
"nameHelp": "Понятное название для этого реестра",
|
||||
"url": "URL",
|
||||
"urlHelp": "Базовый URL реестра",
|
||||
"type": "Тип",
|
||||
"typeHelp": "Тип реестра для совместимости API",
|
||||
"token": "Токен",
|
||||
"tokenHelpNew": "API-токен для аутентификации",
|
||||
"tokenHelpEdit": "Оставьте пустым, чтобы сохранить текущий токен",
|
||||
"save": "Сохранить",
|
||||
"saving": "Сохранение...",
|
||||
"update": "Обновить",
|
||||
"test": "Тест",
|
||||
"testing": "Тестирование...",
|
||||
"edit": "Изменить",
|
||||
"delete": "Удалить",
|
||||
"noRegistries": "Реестры ещё не настроены.",
|
||||
"addFirst": "Добавьте первый реестр",
|
||||
"registryUpdated": "Реестр обновлён",
|
||||
"registryAdded": "Реестр добавлен",
|
||||
"registryDeleted": "Реестр «{name}» удалён",
|
||||
"testSuccess": "Подключение к «{name}» успешно",
|
||||
"saveFailed": "Не удалось сохранить реестр",
|
||||
"deleteFailed": "Не удалось удалить реестр",
|
||||
"testFailed": "Тест подключения не удался",
|
||||
"loadFailed": "Не удалось загрузить реестры",
|
||||
"deleteConfirm": "Удалить реестр «{name}»? Это действие необратимо."
|
||||
},
|
||||
"settingsCredentials": {
|
||||
"title": "Учётные данные",
|
||||
"description": "Управление учётными данными для Nginx Proxy Manager и токенами реестров. Все значения зашифрованы.",
|
||||
"npm": "Nginx Proxy Manager",
|
||||
"npmDesc": "Учётные данные для управления прокси-хостами через NPM API",
|
||||
"configured": "Настроено",
|
||||
"npmUrl": "URL NPM",
|
||||
"npmUrlHelp": "URL API Nginx Proxy Manager",
|
||||
"email": "Email",
|
||||
"emailHelp": "Email администратора NPM",
|
||||
"password": "Пароль",
|
||||
"passwordHelpNew": "Пароль администратора NPM (будет зашифрован)",
|
||||
"passwordHelpEdit": "Введите новый пароль для замены текущего",
|
||||
"changeCredentials": "Изменить учётные данные",
|
||||
"save": "Сохранить",
|
||||
"saving": "Сохранение...",
|
||||
"saved": "Учётные данные NPM сохранены",
|
||||
"saveFailed": "Не удалось сохранить учётные данные NPM",
|
||||
"loadFailed": "Не удалось загрузить учётные данные",
|
||||
"registryTokens": "Токены реестров",
|
||||
"registryTokensDesc": "Токены аутентификации реестров управляются для каждого реестра в разделе",
|
||||
"registriesLink": "Реестры",
|
||||
"registryTokensSuffix": ". Каждый реестр хранит свой токен в зашифрованном виде."
|
||||
},
|
||||
"settingsAuth": {
|
||||
"title": "Настройки аутентификации",
|
||||
"description": "Настройка режима аутентификации и управление пользователями.",
|
||||
"authMode": "Режим аутентификации",
|
||||
"local": "Локальный (логин/пароль)",
|
||||
"oidc": "OIDC (SSO)",
|
||||
"oidcConfig": "Конфигурация OIDC-провайдера",
|
||||
"issuerUrl": "URL издателя",
|
||||
"clientId": "ID клиента",
|
||||
"clientSecret": "Секрет клиента",
|
||||
"redirectUrl": "URL перенаправления",
|
||||
"saveSettings": "Сохранить настройки",
|
||||
"saving": "Сохранение...",
|
||||
"saved": "Настройки сохранены",
|
||||
"saveFailed": "Не удалось сохранить",
|
||||
"loadFailed": "Не удалось загрузить настройки",
|
||||
"localUsers": "Локальные пользователи",
|
||||
"username": "Имя пользователя",
|
||||
"email": "Email",
|
||||
"role": "Роль",
|
||||
"created": "Создан",
|
||||
"noUsers": "Пользователи не найдены.",
|
||||
"addUser": "Добавить пользователя",
|
||||
"viewer": "Наблюдатель",
|
||||
"admin": "Администратор",
|
||||
"userCreated": "Пользователь создан",
|
||||
"userDeleted": "Пользователь удалён",
|
||||
"createFailed": "Не удалось создать пользователя",
|
||||
"deleteFailed": "Не удалось удалить пользователя",
|
||||
"deleteConfirm": "Вы уверены, что хотите удалить этого пользователя?",
|
||||
"usernameRequired": "Имя пользователя и пароль обязательны"
|
||||
},
|
||||
"login": {
|
||||
"title": "Docker Watcher",
|
||||
"subtitle": "Войдите в свой аккаунт",
|
||||
"username": "Имя пользователя",
|
||||
"password": "Пароль",
|
||||
"signIn": "Войти",
|
||||
"signingIn": "Вход...",
|
||||
"or": "или",
|
||||
"ssoButton": "Войти через SSO (OIDC)",
|
||||
"loginFailed": "Ошибка входа",
|
||||
"networkError": "Ошибка сети"
|
||||
},
|
||||
"common": {
|
||||
"cancel": "Отмена",
|
||||
"confirm": "Подтвердить",
|
||||
"delete": "Удалить",
|
||||
"edit": "Изменить",
|
||||
"save": "Сохранить",
|
||||
"retry": "Повторить",
|
||||
"loading": "Загрузка...",
|
||||
"noData": "Нет данных",
|
||||
"project": "Проект",
|
||||
"back": "Назад",
|
||||
"actions": "Действия",
|
||||
"stop": "Остановить",
|
||||
"start": "Запустить",
|
||||
"restart": "Перезапустить",
|
||||
"remove": "Удалить"
|
||||
},
|
||||
"instance": {
|
||||
"stopConfirm": "Контейнер будет остановлен. Экземпляр можно будет запустить снова позже.",
|
||||
"restartConfirm": "Контейнер будет перезапущен с кратковременным простоем.",
|
||||
"removeConfirm": "Контейнер и его прокси-конфигурация будут безвозвратно удалены.",
|
||||
"actionFailed": "Действие не удалось"
|
||||
},
|
||||
"empty": {
|
||||
"noProjects": "Проектов пока нет",
|
||||
"noProjectsDesc": "Начните с создания первого проекта или используйте быстрый деплой.",
|
||||
"createProject": "Создать проект",
|
||||
"noInstances": "Нет экземпляров",
|
||||
"noInstancesDesc": "Разверните новую версию, чтобы увидеть экземпляры здесь.",
|
||||
"noDeploys": "Нет истории деплоев",
|
||||
"noDeploysDesc": "История деплоев появится здесь после первого развёртывания.",
|
||||
"noRegistries": "Нет реестров",
|
||||
"noRegistriesDesc": "Добавьте реестр контейнеров для обнаружения образов.",
|
||||
"noVolumes": "Нет томов",
|
||||
"noVolumesDesc": "Настройте монтирование томов для постоянных данных.",
|
||||
"noUsers": "Нет пользователей",
|
||||
"noUsersDesc": "Добавьте локальных пользователей для управления доступом."
|
||||
},
|
||||
"theme": {
|
||||
"light": "Светлая",
|
||||
"dark": "Тёмная",
|
||||
"system": "Системная"
|
||||
},
|
||||
"language": {
|
||||
"en": "Английский",
|
||||
"ru": "Русский"
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user