home-hosted 0.8.2 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +9 -5
- package/README.md +50 -14
- package/dist/cli.js +1331 -282
- package/dist/cli.js.map +1 -1
- package/docs/DDNS.md +2 -1
- package/docs/NOTIFICATIONS.md +72 -20
- package/docs/SERVERS.md +20 -1
- package/docs/UI_CREATION.md +22 -7
- package/docs/branding/logo.svg +33 -0
- package/docs/branding/social-preview.png +0 -0
- package/package.json +27 -24
- package/uis/stock/dist/assets/de-DL4xkOYj.js +1 -0
- package/uis/stock/dist/assets/es-CKj-v3FY.js +1 -0
- package/uis/stock/dist/assets/fr-72WremqT.js +1 -0
- package/uis/stock/dist/assets/index-BNSSU69y.js +47 -0
- package/uis/stock/dist/assets/index-GxTN2fYn.css +2 -0
- package/uis/stock/dist/assets/ja-BU4XyMbC.js +1 -0
- package/uis/stock/dist/assets/ko-Db8xtJ0N.js +1 -0
- package/uis/stock/dist/assets/ru-Bs8KXP2O.js +1 -0
- package/uis/stock/dist/assets/vi-DdQD4h7B.js +1 -0
- package/uis/stock/dist/assets/zh-CN-DIrw2Ubv.js +1 -0
- package/uis/stock/dist/favicon.ico +0 -0
- package/uis/stock/dist/favicon.svg +14 -0
- package/uis/stock/dist/index.html +6 -2
- package/uis/stock/dist/ui.json +3 -3
- package/uis/stock/dist/assets/de-DQxDtYp2.js +0 -1
- package/uis/stock/dist/assets/es-BP0qzCTU.js +0 -1
- package/uis/stock/dist/assets/fr-DHCvxiys.js +0 -1
- package/uis/stock/dist/assets/index-C02FUAwz.js +0 -46
- package/uis/stock/dist/assets/index-Skf2FzpK.css +0 -2
- package/uis/stock/dist/assets/ja-DseIeS1D.js +0 -1
- package/uis/stock/dist/assets/ko-Dcu2b6c2.js +0 -1
- package/uis/stock/dist/assets/ru-DaAAVw09.js +0 -1
- package/uis/stock/dist/assets/vi-D780h-t9.js +0 -1
- package/uis/stock/dist/assets/zh-CN-C8OC-N1b.js +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
var e={"activity.emptyTitle":`За последние 24 часа событий нет`,"activity.emptyDescription":`Запуски, завершения, аварии и восстановления появляются здесь по мере происходящего.`,"activity.ran":`работал {duration}`,"addServer.title":`Добавить сервер`,"addServer.description":`Добавляет запись в servers.config.json рабочего пространства {workspace}; каждая пропущенная политика наследуется от значений по умолчанию.`,"addServer.thisWorkspace":`этого рабочего пространства`,"addServer.identity":`Идентификация`,"addServer.id":`Id`,"addServer.idHint":`Строчные буквы, цифры, дефисы и подчёркивания; используется в URL и журналах.`,"addServer.labelHint":`Показывается в панели; по умолчанию совпадает с id.`,"addServer.process":`Процесс`,"addServer.commandHint":`Запускается без оболочки.`,"addServer.argumentsHint":`Один аргумент на строку; пробелы внутри строки сохраняются.`,"addServer.portLifecycle":`Порт и жизненный цикл`,"addServer.bindHint":`lan открывает его в сети; делайте это только за аутентификацией.`,"addServer.advanced":`Дополнительные параметры`,"addServer.advancedHint":`окружение, резервные копии, политика, жизненный цикл, bootstrap`,"addServer.backups":`Резервные копии`,"addServer.backupIgnore":`Игнорировать известные генерируемые файлы`,"addServer.bootstrapDescription":`Разовый командный запуск перед первым стартом.`,"addServer.bootstrapHint":`Установки, миграции, загрузки — перед первым стартом, а не при каждом.`,"addServer.policyResources":`Политика и ресурсы`,"addServer.logBufferHint":`Пустое значение сохраняет значение по умолчанию.`,"addServer.inheritNote":`Перезапуск, исправность и остановка сначала соответствуют {settings}; измените значение здесь — и оно будет записано в этот элемент, а не останется унаследованным.`,"addServer.serverDefaults":`Настройки → Серверные значения по умолчанию`,"addServer.placeholdersTitle":`Доступные подстановки аргументов`,"addServer.submit":`Добавить в servers.config.json`,"app.name":`home-hosted`,"app.tagline":`Панель управления супервизором процессов`,"bind.local":`local — 127.0.0.1`,"bind.lan":`lan — 0.0.0.0`,"bind.explicit":`{bind} — явно`,"common.cancel":`Отмена`,"common.confirm":`Подтвердить`,"common.reset":`Сбросить`,"common.keepIt":`Оставить`,"common.remove":`Убрать`,"common.close":`Закрыть`,"common.save":`Сохранить`,"common.saving":`Сохранение…`,"common.discard":`Отменить изменения`,"common.delete":`Удалить`,"common.edit":`Изменить`,"common.add":`Добавить`,"common.retry":`Повторить`,"common.copy":`Копировать`,"common.copied":`Скопировано`,"common.enabled":`Включено`,"common.disabled":`Отключено`,"common.none":`Нет`,"common.unknown":`неизвестно`,"common.loading":`Загрузка…`,"common.selectAll":`Выбрать все`,"common.selectNone":`Снять выделение`,"common.name":`Название`,"common.label":`Метка`,"common.hostname":`Имя хоста`,"common.port":`Порт`,"common.command":`Команда`,"common.environment":`Окружение`,"common.memory":`Память`,"common.cpu":`ЦП`,"common.disk":`Диск`,"common.uptime":`Время работы`,"common.status":`Состояние`,"common.actions":`Действия`,"common.details":`Подробности`,"common.overview":`Обзор`,"common.warning":`Предупреждение`,"common.error":`Ошибка`,"common.confirmQuestion":`{label}?`,"common.unset":`не задано`,"common.never":`никогда`,"common.now":`только что`,"common.dismiss":`Скрыть`,"connection.live":`В реальном времени`,"connection.connecting":`Подключение`,"connection.reconnecting":`Переподключение`,"connection.liveUpdates":`Обновления в реальном времени`,"editor.title":`Изменить конфигурацию`,"editor.description":`Записывает переопределения в {file}; всё нетронутое продолжает наследовать значения по умолчанию.`,"editor.inSync":`синхронизировано`,"editor.process":`Процесс`,"editor.processDescription":`Что запускается, где и с каким окружением.`,"editor.labelPlaceholder":`иначе используется id`,"editor.argumentsHint":`По одному на строку; {port} {host} {home} {projectDir} {dataRoot} {id} {label} {cwd} {bind} {lanIp} подставляются.`,"editor.portTitle":`Порт и привязка`,"editor.portDescription":`Как порт проверяется заранее и где процесс доступен.`,"editor.bindHint":`Собственный IPv4, уже заданный в конфигурации, остаётся доступным для выбора.`,"editor.lifecycle":`Жизненный цикл`,"editor.lifecycleDescription":`Владеет ли супервизор этим элементом вообще.`,"editor.save":`Сохранить в servers.config.json`,"editor.changesTitle":`Несохранённые изменения`,"editor.changesDescription":`Что «Сохранить» записало бы в servers.config.json.`,"editor.nothingToSave":`Нечего сохранять.`,"health.disabled":`Не проверяется`,"health.unknown":`Не проверен`,"health.healthy":`Исправен`,"health.unhealthy":`Неисправен`,"history.start":`Запущен`,"history.exit":`Завершён`,"history.crash":`Аварийно завершился`,"history.forcedRestart":`Принудительный перезапуск`,"history.unhealthy":`Неисправен`,"history.recovered":`Восстановлен`,"host.loadPerCpu":`Нагрузка / цп`,"host.cpuTemp":`Темп. ЦП`,"host.samplingOff":`Опрос хоста выключен`,"host.samplingOffDescription":`Включите его в настройках, чтобы собирать нагрузку, память, диск и температуру.`,"host.swap":`Подкачка`,"host.cpus":`ЦП`,"host.loadAverage":`Нагрузка 1 / 5 / 15`,"host.memoryUsed":`Память занята`,"host.sampled":`Собрано`,"host.filesystems":`Файловые системы`,"host.thresholdsBreached":`Пороги превышены`,"killPort.trigger":`Завершить процесс на порту {port}`,"killPort.title":`Завершить процесс на порту {port}?`,"killPort.body":`Сначала его просят остановиться, и завершают только если он это игнорирует. Всё, что находится под управлением этой панели, отклоняется, поэтому управляемый сервер так не потерять.`,"killPort.confirm":`Завершить`,"language.label":`Язык`,"language.select":`Выберите язык`,"lifecycle.restartTitle":`Политика перезапуска`,"lifecycle.restartDescription":`Задержка между попытками после аварии.`,"lifecycle.restartOnCrash":`Перезапуск при аварии`,"lifecycle.maxRetries":`Макс. попыток`,"lifecycle.maxRetriesHint":`Попытки, после которых сервер остаётся аварийно завершённым.`,"lifecycle.baseDelay":`Базовая задержка (мс)`,"lifecycle.factor":`Коэффициент задержки`,"lifecycle.maxDelay":`Макс. задержка (мс)`,"lifecycle.resetAfter":`Сброс после (мс)`,"lifecycle.resetAfterHint":`Запуск такой длительности сбрасывает счётчик попыток.`,"lifecycle.healthTitle":`Проверка исправности`,"lifecycle.healthDescription":`Как проверяется готовность, когда процесс запущен.`,"lifecycle.probe":`Проверять этот сервер`,"lifecycle.probeType":`Тип проверки`,"lifecycle.probePort":`TCP-порт — только соединение`,"lifecycle.probeHttp":`HTTP-запрос — проверка ответа`,"lifecycle.interval":`Интервал (мс)`,"lifecycle.timeout":`Тайм-аут (мс)`,"lifecycle.unhealthyAfter":`Неисправен после`,"lifecycle.unhealthyAfterHint":`Подряд неудачных проверок.`,"lifecycle.forceRestartAfter":`Принудительный перезапуск через (мс)`,"lifecycle.forceRestartAfterHint":`0 отключает его.`,"lifecycle.startTimeout":`Тайм-аут запуска (мс)`,"lifecycle.httpPath":`HTTP-путь`,"lifecycle.httpMethod":`HTTP-метод`,"lifecycle.expectStatus":`Ожидать статус`,"lifecycle.expectStatusHint":`Пусто принимает любой статус ниже.`,"lifecycle.expectStatusBelow":`Исправен ниже статуса`,"lifecycle.expectBody":`Тело должно содержать`,"lifecycle.expectBodyPlaceholder":`необязательная подстрока`,"lifecycle.headBodyHint":`У HEAD нет тела ответа, поэтому эта проверка игнорируется — используйте GET или очистите её.`,"lifecycle.stopTitle":`Поведение при остановке`,"lifecycle.stopDescription":`Как дереву процессов предлагается завершиться.`,"lifecycle.signal":`Сигнал`,"lifecycle.signalTerm":`SIGTERM — попросить остановиться`,"lifecycle.signalInt":`SIGINT — прервать (Ctrl-C)`,"lifecycle.signalKill":`SIGKILL — завершить немедленно`,"lifecycle.grace":`Льготный период (мс)`,"lifecycle.killGroup":`Завершить всю группу процессов`,"lifecycle.killPortHolders":`Также завершить всё, что занимает порт`,"login.title":`Войдите, чтобы продолжить`,"login.firstRunTitle":`У этой панели ещё нет пароля`,"login.firstRunSubtitle":`Доступ к ней может получить что угодно на этой машине. Задайте пароль сразу после входа.`,"login.authOffTitle":`Аутентификация отключена`,"login.authOffSubtitle":`Панель слушает только loopback — сейчас это единственная её защита.`,"login.subtitle":`Панель управления защищена. Введите пароль, чтобы продолжить.`,"login.password":`Пароль`,"login.showPassword":`Показать пароль`,"login.hidePassword":`Скрыть пароль`,"login.signIn":`Войти`,"login.openDashboard":`Открыть панель`,"login.exposed":`Открыта наружу`,"login.defaultPasswordWarning":`Всё ещё используется пароль по умолчанию {password}. Смените его в настройках — до этого прослушивание за пределами 127.0.0.1 отклоняется.`,"login.noPasswordWarning":`Пароль не задан. Откройте настройки на этой машине, чтобы добавить его, или выполните {command}.`,"login.sessionNote":`Сеанс остаётся активным {days} дней после последнего визита — каждый запрос продлевает этот срок. Выход очищает только этот браузер.`,"login.servedFromThisMachine":`обслуживается с этой машины`,"logs.emptyHint":`Вывода пока нет.`,"logs.noMatches":`Ничего не соответствует этому поиску или фильтру потоков.`,"logs.searchPlaceholder":`Искать в этом выводе`,"logs.searchLabel":`Искать в выводе журнала`,"logs.clearSearch":`Очистить поиск`,"logs.prevMatch":`Предыдущее совпадение`,"logs.nextMatch":`Следующее совпадение`,"logs.showTimestamps":`Показать отметки времени`,"logs.hideTimestamps":`Скрыть отметки времени`,"logs.timestampsShort":`ts`,"logs.pause":`Пауза`,"logs.follow":`Следить`,"logs.clearHint":`Очистить буфер в памяти`,"logs.clearLabel":`Очистить буфер журнала`,"logs.downloadHint":`Скачать сохранённый файл`,"logs.downloadLabel":`Скачать файл журнала`,"logs.outputLabel":`Вывод журнала`,"logs.jumpToLatest":`Перейти к последнему`,"logs.streaming":`поток`,"logs.paused":`пауза`,"logs.snapshot":`снимок`,"logs.linesOf":`{count} из {total} строк`,"logs.matches":`{count} совпадений`,"logs.rowHeight":`высота строки {height}px · окно`,"logs.streamAll":`Все`,"logs.streamOut":`out`,"logs.streamErr":`err`,"logs.streamSys":`sys`,"metric.emptyHint":`сбор…`,"nav.global":`Общее`,"nav.workspace":`Рабочее пространство`,"nav.others":`Прочее`,"nav.overview":`Обзор`,"nav.servers":`Серверы`,"nav.logs":`Журналы`,"nav.workspaceSettings":`Настройки рабочего пространства`,"nav.globalOverview":`Общий обзор`,"nav.globalSettings":`Общие настройки`,"nav.reverseProxy":`Обратный прокси`,"nav.navigation":`Навигация`,"nav.closeNavigation":`Закрыть навигацию`,"nav.hostVitals":`Показатели хоста`,"notice.configError":`Не удалось прочитать конфигурацию: {error}`,"notice.configErrorHint":`Панель продолжает работать с прежней конфигурацией; исправьте {path}, и она перечитается сама.`,"notice.defaultPassword":`Эта панель всё ещё использует пароль по умолчанию.`,"notice.defaultPasswordHint":`Смените его в общих настройках — до этого прослушивание за пределами 127.0.0.1 отклоняется.`,"notice.noPassword":`Аутентификация включена, но пароль не задан, поэтому ничего не запрашивается.`,"notice.noPasswordHint":`Задайте его в общих настройках, чтобы действительно закрыть панель.`,"notice.exposed":`Эта панель доступна за пределами 127.0.0.1.`,"notice.exposedHint":`Держите пароль надёжным или поставьте перед панелью прокси, завершающий TLS.`,"notice.authOff":`Аутентификация отключена — панель защищена только привязкой к loopback.`,"onPortConflict.block":`block — отказаться запускать`,"onPortConflict.warn":`warn — всё равно запустить`,"onPortConflict.follow":`follow — принять отсоединённый перезапуск самого себя`,"onPortConflict.reclaim":`reclaim — заменить управляемой копией`,"onPortConflict.kill":`kill — остановить всё, что занимает порт`,"palette.placeholder":`Перейти к серверу, выполнить действие, открыть настройку…`,"palette.openServer":`Открыть {label}`,"palette.serverLogs":`Журналы {label}`,"palette.startServer":`Запустить {label}`,"palette.stopServer":`Остановить {label}`,"palette.restartServer":`Перезапустить {label}`,"palette.goOverview":`Перейти к обзору`,"palette.goGlobalOverview":`Перейти к общему обзору`,"palette.goGlobalSettings":`Перейти к общим настройкам`,"palette.goProxy":`Перейти к обратному прокси`,"palette.goServers":`Перейти к серверам`,"palette.goLogs":`Перейти к журналам`,"palette.goWorkspaceSettings":`Перейти к настройкам рабочего пространства`,"palette.startAll":`Запустить все включённые серверы здесь`,"palette.stopAll":`Остановить все серверы здесь`,"palette.switchWorkspace":`Переключиться на {label}`,"palette.globalSetting":`Общая настройка: {label}`,"palette.workspaceSetting":`Настройка рабочего пространства: {label}`,"palette.theme":`Тема: {theme}`,"palette.groupServers":`Серверы`,"palette.groupActions":`Действия`,"palette.groupNavigate":`Навигация`,"palette.groupWorkspaces":`Рабочие пространства`,"palette.groupAppearance":`Внешний вид`,"palette.navigate":`перемещение`,"palette.run":`запуск`,"palette.noMatches":`Ничего не найдено по «{query}».`,"proxy.account.automatic":`Автоматически (единственная учётная запись, которая может ответить)`,"proxy.account.noTxt":`нет поддержки TXT`,"proxy.account.noCredentials":`нет учётных данных`,"proxy.account.gone":`Эта учётная запись больше не настроена.`,"proxy.account.emptyHint":`DNS-01 записывает проверочную запись сюда. Пусто использует единственную учётную запись, которая может ответить на проверку, если она есть.`,"proxy.account.cannotWrite":`Учётная запись {provider} не может записывать TXT-записи, поэтому не может ответить на проверку DNS-01.`,"proxy.account.noCredentialsYet":`Для этой учётной записи {provider} пока не сохранено учётных данных.`,"proxy.account.through":`Проверка записывается через эту учётную запись {provider}.`,"proxy.certificate.title":`Загруженные сертификаты`,"proxy.certificate.description":`Отдаются маршрутами, установленными на «Загруженный сертификат». Всё остальное — публичное или локальное — движок сертифицирует сам.`,"proxy.certificate.add":`Добавить сертификат`,"proxy.certificate.emptyTitle":`Сертификат не загружен`,"proxy.certificate.emptyDescription":`Маршруту, установленному на «Загруженный сертификат», нужна пара, покрывающая его имя хоста, иначе движку нечего для него отдавать.`,"proxy.certificate.daysLeft":`осталось {days} дней`,"proxy.certificate.subject":`Субъект`,"proxy.certificate.issuer":`Издатель`,"proxy.certificate.validUntil":`Действителен до`,"proxy.certificate.covers":`Покрывает`,"proxy.certificate.noSans":`в его SAN нет имён хостов`,"proxy.certificate.removeAria":`Удалить {name}`,"proxy.certificate.removeQuestion":`Удалить «{name}»?`,"proxy.certificate.removeBody":`Пара удаляется с диска. Маршрут, всё ещё установленный на «Загруженный сертификат», продолжит отдавать собственный сертификат движка, пока вы это не измените, а панель отказывает в удалении, пока хоть один маршрут его использует.`,"proxy.certificate.removeIt":`Удалить`,"proxy.certificate.stored":`«{label}» сохранён.`,"proxy.certificate.removed":`«{name}» удалён.`,"proxy.certificateDialog.title":`Добавить сертификат`,"proxy.certificateDialog.description":`Пара сохраняется на диск под своим id, и маршрут, установленный на «Загруженный сертификат», может её отдавать.`,"proxy.certificateDialog.label":`Метка`,"proxy.certificateDialog.labelPlaceholder":`Домашний wildcard-сертификат`,"proxy.certificateDialog.id":`Id`,"proxy.certificateDialog.idHint":`задаёт имена файлов на диске`,"proxy.certificateDialog.certFile":`Файл сертификата (.pem, .crt)`,"proxy.certificateDialog.keyFile":`Файл закрытого ключа (.pem, .key)`,"proxy.certificateDialog.pasteCert":`Или вставьте сертификат`,"proxy.certificateDialog.pasteKey":`Или вставьте закрытый ключ`,"proxy.certificateDialog.certPlaceholder":`-----BEGIN CERTIFICATE-----`,"proxy.certificateDialog.keyPlaceholder":`-----BEGIN PRIVATE KEY-----`,"proxy.certificateDialog.store":`Сохранить сертификат`,"proxy.certificateDialog.errorLabel":`требуется метка`,"proxy.certificateDialog.errorId":`id должен начинаться с буквы или цифры, далее буквы, цифры, дефис или подчёркивание`,"proxy.certificateDialog.errorTaken":`«{id}» уже используется другим сертификатом`,"proxy.certificateDialog.errorCertificate":`вставьте или выберите сертификат`,"proxy.certificateDialog.errorPrivateKey":`вставьте или выберите закрытый ключ`,"proxy.engine.title":`Движок`,"proxy.engine.description":`Сам обратный прокси. Панель скачивает текущую сборку, управляет ею и применяет её конфигурацию через собственный admin-API движка.`,"proxy.engine.notInFrame":`Состояние прокси пока не попадает в кадр этой панели.`,"proxy.engine.readFailed":`Не удалось прочитать данные движка`,"proxy.engine.notInstalled":`Движок не установлен`,"proxy.engine.installNote":`Установка скачивает текущий выпуск {engine}, которым управляет панель — около 46 МБ, однократно. Ничего не открывается наружу, пока не добавлен маршрут и не включён прокси.`,"proxy.engine.version":`Версия`,"proxy.engine.notProbed":`ещё не проверялся`,"proxy.engine.source":`Источник`,"proxy.engine.sourceCustom":`путь, заданный вручную`,"proxy.engine.sourceDownloaded":`скачан панелью`,"proxy.engine.size":`Размер`,"proxy.engine.binary":`Исполняемый файл`,"proxy.engine.copyPath":`Скопировать путь к исполняемому файлу`,"proxy.engine.address":`Текущий адрес`,"proxy.engine.process":`Процесс`,"proxy.engine.certificates":`Сертификаты`,"proxy.engine.noCert":`публичного сертификата пока нет`,"proxy.engine.expiresSoon":`ближайший истекает через {days} дней`,"proxy.engine.acme":`Сертификаты ACME`,"proxy.engine.localCa":`Локальная CA`,"proxy.engine.dns01":`DNS-01`,"proxy.engine.tcpUdp":`TCP/UDP`,"proxy.engine.documentation":`Документация {engine}`,"proxy.engine.failed":`Движок сообщил об ошибке`,"proxy.engine.setcapHint":`Привилегированный порт (ниже 1024) требует этого один раз в Linux:`,"proxy.engine.copyCommand":`Скопировать команду`,"proxy.engine.install":`Установить движок`,"proxy.engine.start":`Запустить`,"proxy.engine.stop":`Остановить`,"proxy.engine.apply":`Применить конфигурацию`,"proxy.engine.revert":`Откатить`,"proxy.engine.revertHint":`Вернуться к конфигурации, действовавшей до последней`,"proxy.engine.update":`Обновить движок`,"proxy.listener.title":`Прослушиватель и сертификаты`,"proxy.listener.description":`Где слушает прокси. 80 и 443 — это то, что переадресует роутер и чего ожидает проверка ACME; порт ниже 1024 требует привилегированной привязки.`,"proxy.listener.unprivilegedPorts":`непривилегированные порты`,"proxy.listener.run":`Запускать обратный прокси`,"proxy.listener.runHint":`Сохраняется вместе с «Сохранить настройки»; панель запускает или останавливает движок соответственно.`,"proxy.listener.httpPort":`Порт HTTP`,"proxy.listener.httpPortHint":`Проверки ACME HTTP-01 и перенаправление на HTTPS.`,"proxy.listener.httpsPort":`Порт HTTPS`,"proxy.listener.httpsPortHint":`Где отдаются сертификаты.`,"proxy.listener.useFallback":`Использовать {http} / {https}`,"proxy.listener.useStandard":`Использовать 80 / 443`,"proxy.listener.forwardHint":`Работает без привилегий — переадресуйте 80 и 443 на эти порты в роутере.`,"proxy.listener.privilegedTitle":`Порт ниже 1024 требует привилегированной привязки`,"proxy.listener.privilegedBody":`Запущенная от вашего пользователя панель не может привязать 80 или 443 без разрешения. Либо выдайте его один раз {how} и перезапустите движок, либо оставьте {http}/{https} и переадресуйте 80/443 в роутере. В Windows порт можно занять свободно, но что-то другое может его удерживать.`,"proxy.listener.privilegedWithSetcap":`с помощью {command} для исполняемого файла движка`,"proxy.listener.email":`Эл. почта учётной записи ACME`,"proxy.listener.emailPlaceholder":`you@example.com`,"proxy.listener.emailHint":`Let's Encrypt использует её, чтобы предупредить об истекающем сертификате. Локальному имени достаётся собственная CA движка, и почта не нужна.`,"proxy.listener.emailNeededTitle":`Для автоматического HTTPS нужна электронная почта`,"proxy.listener.emailNeededBody":`«{host}» — публичное имя хоста, поэтому движок запрашивает сертификат у CA, и адрес учётной записи обязателен. Впишите его, отключите TLS у маршрута или включите staging-эндпоинт, пока пробуете.`,"proxy.listener.staging":`Использовать staging-эндпоинт ACME`,"proxy.listener.stagingHint":`Недоверенные сертификаты и никакого расхода лимита запросов, пока вы пробуете.`,"proxy.listener.dns01":`Отвечать на проверки через DNS-01`,"proxy.listener.dns01Hint":`Панель записывает проверочную запись через DNS-учётную запись маршрута, поэтому для получения сертификата входящий порт не нужен.`,"proxy.listener.resolvers":`Сверять запись с`,"proxy.listener.resolversPlaceholder":`1.1.1.1, 8.8.8.8`,"proxy.listener.resolversHint":`Серверы имён, с которых движок читает запись; пусто — использует свои. Нужно там, где split-horizon DNS показывает ему другую картину.`,"proxy.listener.noAccountTitle":`Ни одна DNS-учётная запись не может ответить на проверку`,"proxy.listener.noAccountBody":`DNS-01 включён, но ни у одной учётной записи нет подходящих учётных данных. Добавьте её в разделе «Настройки рабочего пространства» → Dynamic DNS, иначе публичные имена останутся на портовых проверках и будут ждать CA, которая до них не дотянется.`,"proxy.listener.manyAccountsTitle":`Каждый публичный маршрут должен выбрать учётную запись`,"proxy.listener.manyAccountsBody":`Ответить может больше одной учётной записи, поэтому «Автоматически» не может выбрать. Выберите по одной на маршрут, иначе эти имена останутся на портовых проверках.`,"proxy.listener.accountNote":`Каждый маршрут выбирает свою учётную запись, поэтому имена в разных зонах получают нужную. Маршрут, оставленный на «Автоматически», использует единственную учётную запись, названную в таблице. Имя, на которое не отвечает ни одна запись, остаётся на портовых проверках.`,"proxy.listener.pendingNote":`Публичное имя, сертификат которого ещё выписывается, временно доступно — по HTTPS с временным недоверенным сертификатом или по обычному HTTP со страницей, называющей порты для переадресации.`,"proxy.retry.inFallback":`~8 часов`,"proxy.retryButton.force":`Принудительно повторить получение сертификата`,"proxy.retryButton.question":`Снова запросить у CA сертификат для {host}?`,"proxy.retryButton.body":`Ранее движку не удалось получить сертификат CA для этого имени хоста, и он использует свою локальную CA. Он повторяет попытку автоматически каждые {retryIn}.`,"proxy.retryButton.warning":`Повтор сейчас убьёт этот маршрут и на некоторое время сделает его недоступным — продолжить?`,"proxy.retryButton.leave":`Оставить`,"proxy.retryButton.now":`Повторить сейчас`,"proxy.routeDialog.titleEdit":`Изменить маршрут`,"proxy.routeDialog.titleAdd":`Добавить маршрут`,"proxy.routeDialog.description":`Имя хоста, куда оно перенаправляет и как отдаётся по TLS.`,"proxy.routeDialog.hostname":`Имя хоста`,"proxy.routeDialog.hostnamePlaceholder":`gitea.example.com`,"proxy.routeDialog.path":`Префикс пути`,"proxy.routeDialog.pathPlaceholder":`/optional`,"proxy.routeDialog.pathHint":`Пусто обслуживает весь хост.`,"proxy.routeDialog.target":`Цель`,"proxy.routeDialog.tls":`TLS`,"proxy.routeDialog.dnsAccount":`DNS-учётная запись`,"proxy.routeDialog.localNote":`Локальное имя подписывается собственной CA движка, поэтому DNS-учётная запись не участвует.`,"proxy.routeDialog.workspace":`Рабочее пространство`,"proxy.routeDialog.server":`Сервер`,"proxy.routeDialog.noServers":`в этом рабочем пространстве нет серверов`,"proxy.routeDialog.stoppedNote":`Остановленный сервер не направляется: строка показывает «Нет восходящего узла», пока он снова не заработает.`,"proxy.routeDialog.upstream":`Восходящий узел`,"proxy.routeDialog.upstreamPlaceholder":`http://10.0.0.5:8080`,"proxy.routeDialog.upstreamHint":`Буквальный адрес, включая порт. Схема необязательна.`,"proxy.routeDialog.panelNote":`Для отдачи панели управления нужны включённая аутентификация и пароль, не являющийся значением по умолчанию — иначе панель откажет в сохранении.`,"proxy.routeDialog.save":`Сохранить маршрут`,"proxy.routes.title":`Маршруты`,"proxy.routes.description":`Одно публичное имя хоста на сервис. Маршрут может указывать на управляемый сервер в любом рабочем пространстве, на эту панель или на буквальный восходящий узел.`,"proxy.routes.add":`Добавить маршрут`,"proxy.routes.cannotSaveTitle":`Эти маршруты нельзя сохранить в текущем виде`,"proxy.routes.cannotRoute":`{host} невозможно направить`,"proxy.routes.emptyTitle":`Маршрутов пока нет`,"proxy.routes.emptyDescription":`Добавьте один, чтобы открыть сервер через домен — движок сам получит сертификат.`,"proxy.routes.addFirst":`Добавить первый маршрут`,"proxy.routes.columnHostname":`Имя хоста`,"proxy.routes.columnTarget":`Цель`,"proxy.routes.columnUpstream":`Восходящий узел`,"proxy.routes.columnTls":`TLS`,"proxy.routes.columnState":`Состояние`,"proxy.routes.columnOn":`Вкл.`,"proxy.routes.openInTab":`Открыть {url} в новой вкладке`,"proxy.routes.noHostname":`имя хоста пока не задано`,"proxy.routes.toggle":`Маршрут {name}`,"proxy.routes.edit":`Изменить {name}`,"proxy.routes.remove":`Удалить {name}`,"proxy.status.certified":`сертификат готов`,"proxy.status.localCa":`CA движка`,"proxy.status.uploaded":`загруженная пара`,"proxy.status.awaitingCa":`ожидание CA`,"proxy.status.failed":`сертификат не получен`,"proxy.status.fellBack":`Возврат к локальной CA`,"proxy.status.serving":`Обслуживает`,"proxy.status.disabled":`Отключено`,"proxy.status.noUpstream":`Нет восходящего узла`,"proxy.status.error":`Ошибка`,"proxy.status.unapplied":`Ещё не применено`,"proxy.status.off":`Выкл.`,"proxy.status.stopped":`Остановлен`,"proxy.status.starting":`Запускается`,"proxy.status.running":`Работает`,"proxy.status.unsupported":`Не поддерживается`,"proxy.target.server":`Управляемый сервер`,"proxy.target.panel":`Эта панель управления`,"proxy.target.external":`Буквальный восходящий узел`,"proxy.target.controlPanel":`панель управления`,"proxy.target.noServer":`сервер не выбран`,"proxy.target.noUpstream":`нет восходящего узла`,"proxy.tls.auto":`Автоматически — решает движок`,"proxy.tls.off":`Выкл. — обычный HTTP`,"proxy.tls.manual":`Загруженный сертификат`,"proxy.tls.plain":`обычный HTTP`,"proxy.tls.uploaded":`загруженный сертификат`,"proxy.tls.letsEncrypt":`Let’s Encrypt`,"proxy.tls.engineCa":`CA движка (локальная)`,"proxy.tls.hintOff":`Обычный HTTP: для этого имени хоста сертификат не отдаётся.`,"proxy.tls.hintManual":`Отдаёт пару сертификатов, загруженную ниже.`,"proxy.tls.hintEmpty":`Публичное имя хоста получает сертификат ACME; локальное имя получает собственную CA движка.`,"proxy.tls.hintPublic":`Публичное имя хоста, поэтому движок запрашивает сертификат у CA — нужен адрес электронной почты учётной записи ACME.`,"proxy.tls.hintLocal":`Локальное имя, поэтому движок подписывает его собственной локально доверенной CA.`,"proxy.validation.labelRequired":`требуется метка`,"proxy.validation.idPattern":`id должен начинаться с буквы или цифры, далее буквы, цифры, дефис или подчёркивание`,"proxy.validation.hostRequired":`требуется имя хоста`,"proxy.validation.hostPattern":`имя хоста из букв, цифр, точек и дефисов, например home.example.com`,"proxy.validation.hostTaken":`«{host}» уже направлен на этот путь`,"proxy.validation.pathSlash":`префикс пути начинается с /`,"proxy.validation.pathSpace":`префикс пути не может содержать пробел`,"proxy.validation.idTaken":`id маршрута «{id}» используется дважды`,"proxy.validation.workspaceRequired":`выберите рабочее пространство, которому принадлежит сервер`,"proxy.validation.serverRequired":`выберите сервер в этом рабочем пространстве`,"proxy.validation.url":`восходящий узел вида http://10.0.0.5:8080`,"proxy.view.title":`Обратный прокси`,"proxy.view.description":`Открывайте свои серверы через домены, с автоматическим HTTPS через 80/443 или DNS-проверку.`,"proxy.view.dnsNote":`Для DNS-01 добавьте DNS-провайдера домена в любое рабочее пространство в разделе «Настройки рабочего пространства» → Dynamic DNS; тогда маршрут сможет выбрать эту учётную запись из любого рабочего пространства.`,"proxy.view.readFailed":`Не удалось прочитать данные обратного прокси`,"proxy.view.reading":`Чтение обратного прокси…`,"proxy.view.engineInstalled":`Движок установлен`,"proxy.view.engineStarting":`Движок запускается`,"proxy.view.engineStopping":`Движок останавливается`,"proxy.view.configApplied":`Конфигурация применена`,"proxy.view.configReverted":`Конфигурация откачена`,"proxy.view.settingsSaved":`Настройки сохранены.`,"proxy.view.settingsSavedToast":`Настройки сохранены`,"proxy.view.retryFailed":`повторная попытка не удалась`,"proxy.view.retryAsked":`у CA снова запрашивается сертификат для {host}`,"proxy.view.fieldChanged":`поле изменено`,"proxy.view.fieldsChanged":`поля изменены`,"proxy.view.noChanges":`Нет несохранённых изменений`,"proxy.view.discard":`Отменить изменения`,"proxy.view.save":`Сохранить настройки`,"serverCard.open":`Открыть {url}`,"serverCard.adoptedHint":`Этот процесс заменил сам себя: панель приняла преемника, а не запустила вторую копию. Остановка всё ещё работает, его вывод остаётся там, куда его направил преемник.`,"serverCard.detached":`отсоединён`,"serverCard.persistentHint":"Этот элемент работает под управлением собственной няни (nanny), поэтому продолжает работать, когда панель останавливается, перезапускается или уничтожается. `home-hosted down` сообщает о нём, а не останавливает его; останавливает только явная команда.","serverCard.persistent":`постоянный`,"serverCard.disabled":`отключён`,"serverCard.autostart":`автозапуск`,"serverCard.healthProbe":`Проверка исправности`,"serverCard.notProbed":`не проверялся`,"serverCard.restarts":`Перезапуски`,"serverCard.pid":`PID`,"serverCard.rss":`RSS`,"serverCard.procs":`Процессы`,"serverCard.portFree":`свободен`,"serverCard.portInUse":`занят`,"serverCard.uptime24h":`24 ч работы`,"serverCard.probe":`Проверка`,"serverCard.crashes24h":`Аварии за 24 ч`,"serverCard.lastCrash":`Последняя авария`,"serverCard.unhealthyFor":`Неисправен уже {duration}`,"serverCard.nextAttempt":`Следующая попытка {when}`,"serverCard.start":`Запустить`,"serverCard.stop":`Остановить`,"serverCard.restart":`Перезапустить`,"serverCard.detailsHint":`Живые журналы и полная телеметрия`,"serverCard.moreActions":`Дополнительные действия для {label}`,"serverCard.disable":`Отключить сервер`,"serverCard.enable":`Включить сервер`,"serverCard.removeFromAutostart":`Убрать из автозапуска`,"serverCard.autostartWithPanel":`Автозапуск вместе с панелью`,"serverCard.clearLogBuffer":`Очистить буфер журнала`,"serverCard.removeServer":`Удалить сервер`,"serverCard.removeTitle":`Удалить этот сервер?`,"serverCard.removeDescription":`{label} удаляется из servers.config.json: его процесс останавливается, а журналы и история аварий удаляются вместе с ним.`,"serverCard.statusField":`состояние`,"serverForm.workingDirectory":`Рабочий каталог`,"serverForm.cwdHint":`Относительные пути разрешаются внутри projectDir.`,"serverForm.arguments":`Аргументы`,"serverForm.portHint":`Пусто означает, что у сервера нет порта для проверки или предварительного контроля.`,"serverForm.bindAddress":`Адрес привязки`,"serverForm.autostart":`Автозапуск вместе с up`,"serverForm.autostartHint":`Запускать его при каждом подъёме управляющего узла.`,"serverForm.persistent":`Постоянный`,"serverForm.persistentHint":"Продолжает работать, когда панель останавливается; `down` сообщает о нём, а не останавливает его.","serverForm.envHint":`KEY=value по строке на переменную, экспортируется в процесс.`,"serverForm.dataEnvs":`Переменные данных`,"serverForm.dataEnvsHint":`ENV=путь по строке — экспортируется в процесс и автоматически резервируется.`,"serverForm.envFile":`Файл окружения`,"serverForm.envFilePlaceholder":`необязательный файл KEY=value`,"serverForm.envFileHint":`Загружается при запуске; его значения переопределяют env.`,"serverForm.dependsOn":`Зависит от`,"serverForm.dependsOnHint":`Через запятую; запускаются первыми и ожидаются до исправности, останавливаются последними.`,"serverForm.backupPaths":`Дополнительные пути резервных копий`,"serverForm.backupPathsHint":`По одному на строку, подстановки допускаются; переменные данных и так включаются.`,"serverForm.backupIgnore":`Игнорировать известные генерируемые файлы при резервировании`,"serverForm.backupIgnoreHint":`Пропускает node_modules, dist, .next и прочие кэши, из которых ничего не восстанавливается.`,"serverForm.bootstrap":`Bootstrap`,"serverForm.bootstrapDescription":`Разовый командный запуск перед первым стартом — установки, миграции, загрузки.`,"serverForm.runBootstrap":`Выполнить bootstrap`,"serverForm.bootstrapHint":`Выключено означает, что у элемента его нет и ключ отправляется как null.`,"serverForm.timeoutMs":`Тайм-аут (мс)`,"serverForm.runOnce":`Только раз за сеанс`,"serverForm.runOnceHint":`Выключено означает, что он выполняется при каждом запуске.`,"serverForm.bootstrapArgs":`Аргументы bootstrap`,"serverForm.bootstrapArgsHint":`По одному на строку; те же подстановки, что и у основных аргументов.`,"serverForm.bootstrapEnv":`Окружение bootstrap`,"serverForm.bootstrapEnvHint":`KEY=value по строке, экспортируется только в процесс bootstrap.`,"serverForm.onPortConflict":`При конфликте портов`,"serverForm.logBufferLines":`Строк в буфере журнала`,"serverForm.maxRssMb":`Макс. RSS (МБ)`,"serverForm.maxRssHint":`Перезапуск при превышении; пусто или 0 отключает.`,"serverForm.enabledHint":`Выключено сохраняет элемент в конфигурации, но отказывается его запускать.`,"settings.auth.policyTitle":`Политика доступа`,"settings.auth.policyDescription":`Аутентификация действует независимо от того, слушает панель loopback или открыта в сеть.`,"settings.auth.requirePassword":`Требовать пароль`,"settings.auth.requirePasswordHint":`Для каждого запроса нужен сеанс с выполненным входом.`,"settings.auth.sessionLifetime":`Время жизни сеанса (мс)`,"settings.auth.sessionLifetimeHint":`Тайм-аут простоя: 604800000 — это неделя без активности. Каждый запрос продлевает его.`,"settings.auth.cookieSecure":`Cookie Secure`,"settings.auth.cookieSecureAuto":`Авто — только по HTTPS`,"settings.auth.cookieSecureAlways":`Всегда`,"settings.auth.cookieSecureNever":`Никогда — обычный HTTP`,"settings.auth.trustProxy":`За обратным прокси`,"settings.auth.trustProxyOff":`Нет — игнорировать x-forwarded-*`,"settings.auth.trustProxyLoopback":`Да, только с этой машины`,"settings.auth.trustProxyAny":`Да, от любого вызывающего`,"settings.auth.trustProxyHint":`Доверять x-forwarded-* для адреса клиента и протокола. «Только с этой машины» — безопасный выбор для прокси на том же хосте. «От любого вызывающего» верит собственному заголовку вызывающего, поэтому блокировка входа считается по подделанному адресу и её можно обойти.`,"settings.auth.maxLoginAttempts":`Макс. попыток входа`,"settings.auth.maxLoginAttemptsHint":`Неудачные попытки до временной блокировки.`,"settings.auth.lockout":`Блокировка (мс)`,"settings.auth.apiTokenSet":`API-токен задан`,"settings.auth.apiTokenMissing":`Нет API-токена`,"settings.auth.apiTokenNote":`Скрипты могут вызывать API с помощью {code} вместо входа в систему.`,"settings.auth.noTokenNote":`Для shell-скриптов и агентов создайте его командой {command}.`,"settings.auth.defaultPasswordTitle":`Всё ещё используется пароль по умолчанию`,"settings.auth.defaultPasswordText":`Задайте собственный пароль ниже. До этого прослушивание за пределами {address} отклоняется.`,"settings.auth.blockedTitle":`Этот прослушиватель отклоняется`,"settings.auth.noPasswordTitle":`Аутентификация включена, но пароль не задан`,"settings.auth.noPasswordText":`Пока ничего не требуется, и прослушивание за пределами {address} остаётся отклонённым, пока нет пароля.`,"settings.auth.exposedTitle":`Доступна за пределами 127.0.0.1`,"settings.auth.exposedText":`Держите пароль надёжным или поставьте перед панелью прокси, завершающий TLS.`,"settings.auth.changePassword":`Сменить пароль`,"settings.auth.setPassword":`Задать пароль`,"settings.auth.passwordDescription":`Хранится как scrypt-хеш в файле секретов, никогда в конфигурации.`,"settings.auth.currentPassword":`Текущий пароль`,"settings.auth.newPassword":`Новый пароль`,"settings.auth.repeatPassword":`Повторите новый пароль`,"settings.auth.passwordMismatch":`Два пароля не совпадают.`,"settings.auth.updatePassword":`Обновить пароль`,"settings.auth.setPasswordAndEnable":`Задать пароль и включить аутентификацию`,"settings.auth.clearPassword":`Очистить пароль`,"settings.auth.clearPasswordConfirm":`Подтвердить очистку`,"settings.auth.clearPasswordTitle":`Очистить пароль?`,"settings.auth.clearPasswordHint":`Вместе с ним отключается аутентификация, и любой, кто дотянется до панели, попадёт прямо внутрь.`,"settings.auth.shortPasswordTitle":`Это короткий пароль`,"settings.auth.shortPasswordText":`Он допускается, но длина — единственное, что стоит между сетью и этой панелью.`,"settings.auth.passwordUpdated":`Пароль обновлён. Другие сеансы были завершены.`,"settings.auth.passwordCleared":`Пароль очищен, аутентификация отключена.`,"settings.backup.createTitle":`Создать резервную копию`,"settings.backup.createDescription":`Выберите, что захватывает этот архив. Ничего не записывается, пока вы его не создадите.`,"settings.backup.chooseItems":`Выбрать элементы`,"settings.backup.partialCapture":`Захватываются только выбранные элементы.`,"settings.backup.withoutGlobalSettings":`Без глобальных настроек восстановление может разместить рабочее пространство только там, где целевая панель его уже объявляет.`,"settings.backup.password":`Пароль (необязательно)`,"settings.backup.passwordHint":`Шифрует архив; при восстановлении запрашивается тот же пароль.`,"settings.backup.create":`Создать резервную копию`,"settings.backup.chooseItemsFor":`{label} — выбрать элементы`,"settings.backup.subDescription":`Рабочее пространство можно захватить целиком или только его настройки, серверы, секреты и объявленные пути данных.`,"settings.backup.selectedOf":`выбрано {selected} из {total}`,"settings.backup.nothingSelectable":`Это рабочее пространство пока ничего не объявляет для выбора.`,"settings.backup.apply":`Применить`,"settings.backup.created":`Резервная копия создана.`,"settings.backup.leafSettingsHint":`Серверные значения по умолчанию, хранение журналов и уведомления`,"settings.backup.leafServersHint":`Каждая запись в servers.config.json`,"settings.backup.leafSecretsHint":`Токен бота Telegram и учётные данные DDNS`,"settings.backup.leafDataHint":`Объявленный путь данных`,"settings.backup.pathFromOrigin":`{path} — из {origin}`,"settings.backup.entrySettingsHint":`Прослушиватель, аутентификация, показатели хоста и политика резервных копий`,"settings.backup.entrySecretsHint":`Хеш пароля и хеш API-токена`,"settings.backup.entryTlsHint":`Собственная пара сертификатов панели`,"settings.backup.entryWorkspaceHint":`Его настройки, серверы, секреты и объявленные пути данных`,"settings.backup.entryGlobalSettings":`Общие настройки`,"settings.backup.entryGlobalSecrets":`Общие секреты (пароль, API-токен)`,"settings.backup.entryTlsCertificate":`Сертификат TLS`,"settings.backup.leafSettings":`Настройки`,"settings.backup.leafServers":`Серверы`,"settings.backup.leafSecrets":`Секреты`,"settings.backup.restoreItemLabel":`{workspace}: {item}`,"settings.backup.noteMissing":`ещё не существует`,"settings.backup.noteCovered":`покрыто {path}`,"settings.backup.noteAlreadyDeclared":`уже объявлено в {origin}`,"settings.backup.noteContainsBackupDir":`содержит каталог резервных копий`,"settings.backup.noteUnknownWorkspace":`неизвестное рабочее пространство`,"settings.backup.noteMissingFromArchive":`отсутствует в архиве`,"settings.backup.noteDeclaredByBackup":`объявлено конфигурацией резервной копии, которая не восстанавливается`,"settings.backup.noteNotDeclared":`не объявлено ни этой конфигурацией, ни резервной копией`,"settings.backup.noteRestoredFrom":`восстановлено из {path}`,"settings.backups.policyTitle":`Политика`,"settings.backups.policyDescription":`Сколько архивов хранит панель и какие дополнительные пути захватывает каждый из них.`,"settings.backups.allow":`Разрешить резервные копии`,"settings.backups.allowHint":`Выключено останавливает новые архивы; всё, что уже на диске, остаётся доступным для скачивания и восстановления.`,"settings.backups.offTitle":`Резервные копии выключены`,"settings.backups.offText":`Ничего нового не архивируется, пока это не будет включено снова. Архивы ниже по-прежнему можно скачать, восстановить и удалить.`,"settings.backups.keep":`Хранить`,"settings.backups.keepHint":`Старые архивы удаляются после каждой резервной копии.`,"settings.backups.extraPaths":`Дополнительные пути`,"settings.backups.extraPathsHint":`Через запятую, захватываются в каждом архиве сверх того, что объявляет каждое рабочее пространство.`,"settings.backups.extraPathsPlaceholder":`{home}/myapp-data`,"settings.backups.archiveDirectory":`Каталог архивов`,"settings.backups.copyArchiveDirectory":`Скопировать каталог архивов`,"settings.backups.changeDirectory":`Его изменение — решение на уровне файлов: отредактируйте {path}.`,"settings.backups.theSettingsFile":`файл настроек`,"settings.backups.capturesTitle":`Что захватывает резервная копия`,"settings.backups.capturesDescription":`Выберите это в диалоге создания. Рабочее пространство можно взять целиком или только его настройки, серверы, секреты и объявленные пути данных.`,"settings.backups.nothingSelectable":`Пока ничего нельзя выбрать.`,"settings.backups.fromOrigin":`из {origin}`,"settings.backups.notCaptured":`не захвачено`,"settings.backups.generatedSkipped":`генерируемые каталоги пропущены`,"settings.backups.included":`включено`,"settings.backups.skipped":`пропущено`,"settings.backups.workspacesNote":`Эта панель обслуживает {count} рабочих пространств; каждое — отдельная запись для выбора.`,"settings.backups.archivesTitle":`Архивы`,"settings.backups.archivesDescription":`Хранятся в каталоге резервных копий и доступны для скачивания в любой момент.`,"settings.backups.create":`Создать резервную копию…`,"settings.backups.restore":`Восстановить…`,"settings.backups.noArchives":`Архивов пока нет`,"settings.backups.noArchivesEnabled":`Создайте её сейчас, чтобы захватить панель и выбранные рабочие пространства.`,"settings.backups.noArchivesDisabled":`Пока ничего не архивировано, а резервные копии выключены.`,"settings.backups.encrypted":`зашифровано`,"settings.backups.download":`Скачать`,"settings.backups.restoreAction":`Восстановить`,"settings.backups.confirmDelete":`Подтвердить удаление`,"settings.backups.deleted":`{name} удалён.`,"settings.backups.kindSettings":`настройки`,"settings.backups.kindServers":`серверы`,"settings.backups.kindSecrets":`секреты`,"settings.backups.kindTls":`tls`,"settings.backups.kindData":`данные`,"settings.backups.kindWorkspace":`рабочее пространство`,"settings.ddns.statePending":`Ожидание`,"settings.ddns.stateOk":`Обновлено`,"settings.ddns.stateUnchanged":`Актуально`,"settings.ddns.stateSkipped":`Пропущено`,"settings.ddns.stateError":`Не удалось`,"settings.ddns.passFinished":`Проход Dynamic DNS завершён`,"settings.ddns.credentialsSaved":`Учётные данные сохранены для {account}`,"settings.ddns.credentialsRemoved":`Учётные данные удалены для {account}`,"settings.ddns.loadErrorTitle":`Не удалось загрузить настройки Dynamic DNS`,"settings.ddns.title":`Dynamic DNS`,"settings.ddns.description":`Держите эти имена хостов указывающими на публичный адрес этой машины. Учётные данные лежат в файле секретов, никогда в servers.config.json.`,"settings.ddns.checking":`проверка`,"settings.ddns.needsAttention":`требует внимания`,"settings.ddns.watching":`наблюдение`,"settings.ddns.updateNow":`Обновить сейчас`,"settings.ddns.enabled":`Поддерживать Dynamic DNS в актуальном состоянии`,"settings.ddns.enabledHint":`Проход выполняется с интервалом ниже; провайдер вызывается только тогда, когда адрес действительно изменился.`,"settings.ddns.interval":`Проверять каждые (мс)`,"settings.ddns.intervalHint":`60000 — это одна минута; значение по умолчанию — пять.`,"settings.ddns.ttl":`TTL (с)`,"settings.ddns.ttlHint":`1 означает автоматически там, где провайдер это поддерживает.`,"settings.ddns.detectIpv4":`Определять IPv4`,"settings.ddns.detectIpv4Hint":`Нужно для записей A.`,"settings.ddns.detectIpv6":`Определять IPv6`,"settings.ddns.detectIpv6Hint":`Нужно для записей AAAA.`,"settings.ddns.accountsTitle":`Учётные записи провайдеров`,"settings.ddns.accountsDescription":`Одна запись на API-токен. Учётные данные хранятся на сервере и никогда не возвращаются.`,"settings.ddns.credentialsSet":`учётные данные сохранены`,"settings.ddns.noCredentials":`нет учётных данных`,"settings.ddns.credentials":`Учётные данные`,"settings.ddns.removeAccountBlocked":`Сначала удалите имена хостов, использующие эту учётную запись`,"settings.ddns.noAccounts":`Учётных записей пока нет. Выберите провайдера и добавьте её.`,"settings.ddns.provider":`Провайдер`,"settings.ddns.accountId":`Id учётной записи`,"settings.ddns.accountIdPlaceholder":`cloudflare-home`,"settings.ddns.accountIdHint":"Id учётной записи называет её и служит ключом для сохранённых учётных данных; строчные буквы, цифры, `-` и `_`.","settings.ddns.hostnamesTitle":`Имена хостов`,"settings.ddns.hostnamesDescription":`Весь список для поддержания в актуальном состоянии — suba.domain.com, domain.xyz и так далее.`,"settings.ddns.account":`Учётная запись`,"settings.ddns.recordA":`A (IPv4)`,"settings.ddns.recordAaaa":`AAAA (IPv6)`,"settings.ddns.aaaaUnsupported":`Этот провайдер не умеет управлять записями AAAA.`,"settings.ddns.proxied":`Проксируется`,"settings.ddns.proxiedHint":`Cloudflare отдаёт эту запись через собственную сеть.`,"settings.ddns.ipv6Off":`Определение IPv6 выключено`,"settings.ddns.advanced":`Дополнительно`,"settings.ddns.advancedHint":`зарегистрированный домен и переопределение TTL`,"settings.ddns.registeredDomain":`Зарегистрированный домен`,"settings.ddns.registeredDomainPlaceholder":`example.co.uk`,"settings.ddns.registeredDomainHint":`Только когда провайдеру нужно сообщить apex, например для доменов из трёх меток.`,"settings.ddns.ttlOverride":`Переопределение TTL (с)`,"settings.ddns.ttlOverrideHint":`Пусто использует значение выше.`,"settings.ddns.noHostnames":`Имён хостов пока нет.`,"settings.ddns.hostnamePlaceholder":`home.example.com`,"settings.ddns.lastPass":`Последний проход`,"settings.ddns.ipv4Value":`IPv4 {address}`,"settings.ddns.ipv6Value":`IPv6 {address}`,"settings.ddns.type":`Тип`,"settings.ddns.state":`Состояние`,"settings.ddns.address":`Адрес`,"settings.ddns.detail":`Детали`,"settings.ddns.credentialsTitle":`Учётные данные провайдера`,"settings.ddns.credentialsDescription":`Сохранённые поля никогда не отправляются обратно. Сохранение заменяет все поля этой учётной записи и сразу выполняет проход.`,"settings.ddns.optional":`Необязательно.`,"settings.ddns.whereToGet":`Где их взять`,"settings.ddns.forget":`Забыть`,"settings.ddns.forgetConfirm":`Забыть их`,"settings.ddns.forgetTitle":`Забыть сохранённые учётные данные?`,"settings.ddns.forgetHint":`Они удаляются с диска, и прочитать их обратно нельзя; их придётся вставить заново.`,"settings.ddns.saveCredentials":`Сохранить учётные данные`,"settings.defaults.title":`Серверные значения по умолчанию`,"settings.defaults.description":`Применяются к каждой записи, которая не задаёт собственное значение.`,"settings.defaults.enabledHint":`Новые записи создаются включёнными.`,"settings.defaults.autostart":`Автозапуск вместе с панелью`,"settings.defaults.bind":`Привязка`,"settings.defaults.bindLocal":`Локально — 127.0.0.1`,"settings.defaults.bindLan":`LAN — 0.0.0.0`,"settings.defaults.onPortConflict":`При конфликте портов`,"settings.defaults.conflictBlock":`Блокировать запуск`,"settings.defaults.conflictWarn":`Предупредить и всё равно запустить`,"settings.defaults.conflictFollow":`Следовать за отсоединённым перезапуском самого себя`,"settings.defaults.conflictReclaim":`Заменить отсоединённый перезапуск управляемой копией`,"settings.defaults.conflictKill":`Завершить всё, что занимает порт`,"settings.defaults.logBufferLines":`Строк в буфере журнала`,"settings.defaults.logBufferLinesHint":`Хранится в памяти для каждого сервера.`,"settings.host.title":`Пороги`,"settings.host.description":`Порог 0 отключает это оповещение. Превышения уведомляют один раз и ещё раз при восстановлении.`,"settings.host.enabled":`Опрошивать эту машину`,"settings.host.enabledHint":`Нагрузка, память, подкачка, диск и температура ЦП, с интервалом ниже.`,"settings.host.interval":`Интервал (мс)`,"settings.host.intervalHint":`Как часто опрашивается хост и проверяются оповещения.`,"settings.host.diskPaths":`Пути для диска`,"settings.host.diskPathsHint":`Через запятую; шаблоны вроде {home} раскрываются.`,"settings.host.diskUsed":`Диск занят (%)`,"settings.host.memoryUsed":`Память занята (%)`,"settings.host.swapUsed":`Подкачка занята (%)`,"settings.host.zeroDisables":`0 отключает оповещение.`,"settings.host.loadPerCpu":`Нагрузка на ЦП`,"settings.host.loadPerCpuHint":`Средняя нагрузка за 1 минуту, делённая на число ядер.`,"settings.host.tempCelsius":`Температура ЦП (°C)`,"settings.host.tempCelsiusHint":`Только Linux; игнорируется там, где ОС её не предоставляет.`,"settings.host.breachingNow":`Превышено сейчас:`,"settings.host.nothingBreaching":`Сейчас ничего не превышено.`,"settings.interface.title":`Интерфейс`,"settings.interface.description":`Панель — это статический сайт: оставьте штатный или отдавайте собственную сборку из каталога состояния.`,"settings.interface.currentlyServing":`Сейчас отдаётся`,"settings.interface.copyDirectory":`Скопировать каталог UI`,"settings.interface.fileCount":`{count} файлов`,"settings.interface.sourceStock":`штатный`,"settings.interface.sourceCustom":`свой`,"settings.interface.unnamed":`без имени`,"settings.interface.panelVersion":`Версия панели`,"settings.interface.copyPanelVersion":`Скопировать версию панели`,"settings.interface.panelVersionHint":`Выпуск, который выполняет этот процесс панели — {command} выводит то же число.`,"settings.interface.panelName":`Имя панели`,"settings.interface.panelNameHint":`Показывается в боковой панели штатным UI. Собственный UI может показывать своё имя.`,"settings.interface.uploadLabel":`Загрузить сборку UI (.zip с index.html)`,"settings.interface.docsHint":`См. {docs} о контракте API. Если собственный UI ломает панель, {command} вернёт штатный из терминала.`,"settings.interface.resetName":`Сбросить имя`,"settings.interface.confirmRevert":`Подтвердить возврат`,"settings.interface.revertToStock":`Вернуть штатный`,"settings.interface.install":`Установить UI`,"settings.interface.installed":`UI заменён на {name} — обновите страницу`,"settings.interface.yourBuild":`ваша сборка`,"settings.interface.restored":`штатный UI восстановлен — обновите страницу`,"settings.interface.nothingInstalled":`собственный UI не был установлен`,"settings.listener.title":`Прослушиватель`,"settings.listener.description":`Где панель отвечает. Перенос перезапускает панель и отправляет эту страницу на новый адрес.`,"settings.listener.port":`Порт управления`,"settings.listener.portHint":`По умолчанию 3999.`,"settings.listener.bind":`Привязка`,"settings.listener.bindLocal":`Локально`,"settings.listener.bindLan":`LAN`,"settings.listener.bindCustom":`Свой`,"settings.listener.bindLanHint":`0.0.0.0 — доступно из всей сети.`,"settings.listener.bindLocalHint":`127.0.0.1 — только эта машина.`,"settings.listener.bindCustomHint":`Конкретный адрес интерфейса, который вы вводите ниже.`,"settings.listener.ipv4":`Адрес IPv4`,"settings.listener.ipv4Placeholder":`192.168.1.20`,"settings.listener.ipv4Error":`Введите адрес IPv4, например 192.168.1.20.`,"settings.listener.ipv4Hint":`Для прослушивания за пределами 127.0.0.1 нужен настоящий пароль.`,"settings.listener.openBrowser":`Открывать браузер при запуске панели`,"settings.listener.liveAddress":`Текущий адрес`,"settings.listener.restartRequired":`требуется перезапуск`,"settings.listener.copyLiveAddress":`Скопировать текущий адрес`,"settings.listener.liveAddressHint":`К чему привязан прослушиватель сейчас; сохранённые изменения вступят в силу после повторной привязки панели.`,"settings.logs.title":`Хранение`,"settings.logs.description":`Живой просмотр всегда идёт из памяти; эти файлы переживают перезапуск и питают страницу журналов.`,"settings.logs.persist":`Хранить журналы на диске`,"settings.logs.persistHint":`Выключите, чтобы держать всё только в памяти.`,"settings.logs.maxBytes":`Ротация при (байт)`,"settings.logs.maxBytesHint":`Для каждого сервера, перед переходом к .1, .2, …`,"settings.logs.keep":`Хранить ротированные файлы`,"settings.logs.directory":`Каталог журналов`,"settings.logs.copyDirectory":`Скопировать каталог журналов`,"settings.logs.browseHint":`Просматривайте и скачивайте эти файлы на странице {logs}.`,"settings.paths.dataRoot":`Корень данных`,"settings.paths.dataRootHint":`HHOSTED_HOME — глобальные настройки, рабочие пространства, TLS, резервные копии и UI.`,"settings.paths.globalSettings":`Глобальные настройки`,"settings.paths.globalSettingsHint":`settings.json — прослушиватель, аутентификация, политика TLS, показатели хоста, резервные копии.`,"settings.paths.projectDir":`Каталог проекта`,"settings.paths.projectDirHint":`Основа для относительных путей записей.`,"settings.paths.panelAddress":`Адрес панели`,"settings.paths.panelAddressHint":`Где эта панель управления работает прямо сейчас.`,"settings.paths.serversConfig":`Конфигурация серверов`,"settings.paths.serversConfigHint":`servers.config.json для {label}.`,"settings.paths.workspaceSettings":`Настройки рабочего пространства`,"settings.paths.workspaceSettingsHint":`Серверные значения по умолчанию, хранение журналов, уведомления, DDNS.`,"settings.paths.logs":`Журналы`,"settings.paths.logsHint":`Сохранённый вывод для этого рабочего пространства.`,"settings.paths.copyPath":`Скопировать {label}`,"settings.paths.whereThingsLive":`Где что лежит`,"settings.paths.whereThingsLiveDescription":`Только чтение. Копируйте путь прямо в оболочку или редактор.`,"settings.paths.workspaceFiles":`Файлы рабочего пространства`,"settings.paths.workspaceFilesDescription":`Каждое рабочее пространство владеет своей конфигурацией, настройками и каталогом журналов; между ними ничего не разделяется.`,"settings.rebind.failed":`Панель управления не ответила на {target}. Проверьте консоль, чтобы узнать новый прослушиватель.`,"settings.restore.title":`Восстановить резервную копию`,"settings.restore.description":`Ничего не записывается, пока план не применён.`,"settings.restore.archive":`Архив`,"settings.restore.archiveHint":`Сохранённый архив или .zip с этой машины.`,"settings.restore.encryptedName":`{name} — зашифровано`,"settings.restore.uploadOption":`Загрузить файл…`,"settings.restore.archiveFile":`Файл архива (.zip)`,"settings.restore.unchangedTitle":`Пока ничего не изменилось`,"settings.restore.archiveLine":`Архив {name}.`,"settings.restore.uploadedArchive":`Загруженный архив.`,"settings.restore.passwordProtected":`Эта резервная копия защищена паролем.`,"settings.restore.password":`Пароль`,"settings.restore.checkAgain":`Проверить снова с паролем`,"settings.restore.choosePrompt":`Выберите, что восстанавливать — выбрано {selected} из {total}.`,"settings.restore.willRestore":`Будет восстановлено: {items}.`,"settings.restore.skipped":`Пропущено: {items}.`,"settings.restore.nothing":`ничего`,"settings.restore.restartNote":`Собственные настройки панели отличаются, поэтому после этого перезапустите панель.`,"settings.restore.reloadedNote":`Восстановленные рабочие пространства перезагружаются сразу; записи с автозапуском стартуют сами.`,"settings.restore.applyStored":`Применить это восстановление`,"settings.restore.applyUpload":`Восстановить из загруженного файла`,"settings.restore.restored":`Восстановлено элементов: {count}.`,"settings.restore.restoredWithNotes":`Восстановлено элементов: {count} — {notes}.`,"settings.restore.noteReloaded":`восстановленные серверы работают, записи автозапуска стартуют`,"settings.restore.noteRestart":`перезапустите панель, чтобы применить её собственные настройки`,"settings.restore.reasonSymbolicLink":`символическая ссылка, пропущено`,"settings.restore.reasonNotSelected":`не выбрано`,"settings.restore.reasonUnrestorable":`здесь восстановить нельзя`,"settings.restore.reasonInvalidSettings":`настройки в архиве недействительны`,"settings.restore.reasonInvalidServers":`серверы в архиве недействительны`,"settings.shell.noUnsavedChanges":`Нет несохранённых изменений`,"settings.shell.discard":`Отменить изменения`,"settings.shell.save":`Сохранить настройки`,"settings.shell.unsavedTitle":`Несохранённые изменения`,"settings.shell.nothingToSave":`Нечего сохранять.`,"settings.telegram.title":`Telegram`,"settings.telegram.description":`Политика лежит в конфигурации; токен бота — это секрет и никогда не возвращается с сервера.`,"settings.telegram.enabled":`Отправлять уведомления`,"settings.telegram.enabledHint":`Одно сообщение на событие, ограниченное временем ожидания ниже.`,"settings.telegram.chatId":`Id чата`,"settings.telegram.chatIdPlaceholder":`123456789 или @channel`,"settings.telegram.chatIdHint":`Используйте «Определить чаты», чтобы заполнить это из обновлений бота.`,"settings.telegram.cooldown":`Время ожидания на событие (мс)`,"settings.telegram.cooldownHint":`Для каждого сервера и причины, чтобы часто падающий сервер не мог спамить.`,"settings.telegram.onCrash":`Попытки исчерпаны`,"settings.telegram.onUnhealthy":`Порт неисправен`,"settings.telegram.onForcedRestart":`Принудительный перезапуск`,"settings.telegram.onRecovered":`Восстановлен`,"settings.telegram.onHost":`Показатели хоста превышены`,"settings.telegram.onHostHint":`Диск, память, подкачка, нагрузка и температура ЦП, согласно порогам в разделе «Показатели хоста».`,"settings.telegram.onDdns":`Dynamic DNS изменился или дал сбой`,"settings.telegram.onDdnsHint":`Одно сообщение на проход, изменивший запись, и одно для прохода, который завершился сбоем.`,"settings.telegram.botToken":`Токен бота`,"settings.telegram.tokenSet":`токен задан`,"settings.telegram.noToken":`нет токена`,"settings.telegram.tokenNote":`От @BotFather — секрет, никогда в servers.config.json.`,"settings.telegram.tokenPlaceholder":`123456789:AA…`,"settings.telegram.tokenSavedPlaceholder":`Сохранён — введите новый токен, чтобы заменить его`,"settings.telegram.saveToken":`Сохранить токен`,"settings.telegram.detectChats":`Определить чаты`,"settings.telegram.sendTest":`Отправить тест`,"settings.telegram.removeToken":`Удалить токен`,"settings.telegram.removeTokenConfirm":`Подтвердить удаление`,"settings.telegram.removeTokenTitle":`Удалить токен бота?`,"settings.telegram.removeTokenHint":`Уведомления прекратятся, пока вы снова не вставите токен.`,"settings.telegram.tokenSaved":`Токен сохранён.`,"settings.telegram.tokenSavedFor":`Токен сохранён для @{username}.`,"settings.telegram.tokenRemoved":`Токен удалён.`,"settings.telegram.noChats":`Чаты не найдены. Сначала отправьте боту /start, затем определите снова.`,"settings.telegram.testSent":`Тестовое сообщение отправлено.`,"settings.telegram.testFailed":`Тестовое сообщение не удалось отправить.`,"settings.telegram.chatsSeen":`Чаты, которые видел бот:`,"settings.telegram.lastSend":`Последняя отправка: {result}`,"settings.tls.title":`HTTPS`,"settings.tls.description":`Загрузите пару PEM, и панель начнёт отдавать TLS на своём прослушивателе. Самоподписанный сертификат вполне годится для домашней сети.`,"settings.tls.serve":`Отдавать панель по HTTPS`,"settings.tls.serveHint":`Сохраняется вместе с «Сохранить настройки»; панель перепривязывается, и эта страница следует за ней.`,"settings.tls.certificateTitle":`Сертификат`,"settings.tls.certificateDescription":`Сертификат в кодировке PEM и его закрытый ключ. Оба остаются в файле секретов.`,"settings.tls.unusableTitle":`Сохранённый сертификат нельзя использовать`,"settings.tls.subject":`Субъект`,"settings.tls.issuer":`Издатель`,"settings.tls.validUntil":`Действителен до`,"settings.tls.days":`{count} дней`,"settings.tls.privateKey":`Закрытый ключ`,"settings.tls.keyMatches":`соответствует сертификату`,"settings.tls.keyMismatch":`не соответствует`,"settings.tls.fingerprint":`Отпечаток`,"settings.tls.copyFingerprint":`Скопировать отпечаток`,"settings.tls.noCertificateTitle":`Сертификат не загружен`,"settings.tls.noCertificateText":`Загрузите ниже сертификат PEM и ключ, затем сохраните. HTTPS не отдаётся, пока нет сертификата.`,"settings.tls.certFile":`Файл сертификата (.pem, .crt)`,"settings.tls.keyFile":`Файл закрытого ключа (.pem, .key)`,"settings.tls.pasteCertificate":`Или вставьте сертификат`,"settings.tls.pasteKey":`Или вставьте закрытый ключ`,"settings.tls.saveCertificate":`Сохранить сертификат`,"settings.tls.removeCertificate":`Удалить сертификат`,"settings.tls.confirmRemove":`Подтвердить удаление`,"settings.tls.removeTitle":`Удалить сертификат?`,"settings.tls.removeHint":`TLS остаётся включённым, но отдавать нечего, поэтому после повторной привязки прослушивателя панель вернётся к http.`,"settings.tls.stored":`Сертификат сохранён.`,"settings.tls.removed":`Сертификат удалён.`,"status.stopped":`Остановлен`,"status.starting":`Запускается`,"status.running":`Работает`,"status.stopping":`Останавливается`,"status.backoff":`Перезапускается`,"status.crashed":`Аварийно завершился`,"status.conflict":`Конфликт портов`,"theme.label":`Тема: {theme}`,"theme.light":`светлая`,"theme.dark":`тёмная`,"theme.system":`системная`,"topbar.search":`Поиск или выполнение команды`,"topbar.openNavigation":`Открыть навигацию`,"topbar.commandPalette":`Палитра команд`,"topbar.account":`Учётная запись`,"topbar.signedIn":`Выполнен вход`,"topbar.signOut":`Выйти`,"topbar.workspaceLabel":`Рабочее пространство: {name}`,"validation.port":`Порт должен быть целым числом от 1 до 65535.`,"validation.idRequired":`Требуется id — это ключ, под которым живёт сервер.`,"validation.idPattern":`Id должен начинаться со строчной буквы или цифры и содержать только строчные буквы, цифры, дефисы и подчёркивания.`,"validation.commandRequired":`Требуется команда — исполняемый файл, который запускает супервизор.`,"validation.bootstrapCommand":`Для bootstrap нужна команда для запуска.`,"views.actions.addAServer":`Добавить сервер`,"views.actions.addServer":`Добавить сервер`,"views.actions.startAll":`Запустить все`,"views.actions.stopAll":`Остановить все`,"views.common.thisWorkspace":`это рабочее пространство`,"views.globalOverview.configError":`Не удалось прочитать конфигурацию: {error}`,"views.globalOverview.degraded":`деградация`,"views.globalOverview.description":`Показатели хоста и все серверы из всех рабочих пространств, сгруппированные по месту размещения.`,"views.globalOverview.emptyDescription":`Выберите рабочее пространство в верхней панели и добавьте первый процесс, который оно должно поддерживать.`,"views.globalOverview.emptyTitle":`Серверов пока нигде нет`,"views.globalOverview.groupEmptyDescription":`Добавьте один, и он появится здесь и на странице рабочего пространства.`,"views.globalOverview.groupRunning":`{running}/{total} работают`,"views.globalOverview.hostUptime":`Время работы хоста`,"views.globalOverview.hostVitals":`Показатели хоста`,"views.globalOverview.hostVitalsNote":`Эта машина, общая для всех рабочих пространств.`,"views.globalOverview.openWorkspace":`Открыть рабочее пространство`,"views.globalOverview.panelUptime":`Время работы панели`,"views.globalOverview.samplingOff":`опрос выключен`,"views.globalOverview.samplingOn":`опрос включён`,"views.globalOverview.serversTotal":`всего {count} серверов`,"views.globalOverview.serving":`обслуживание`,"views.globalOverview.workspaces":`Рабочие пространства`,"views.globalSettings.authenticationDescription":`Кому разрешено входить в эту панель и как проверяется доверие к сеансу.`,"views.globalSettings.backupsDescription":`Один архив на захват, охватывающий панель и любое выбранное рабочее пространство.`,"views.globalSettings.changesDescription":`Что «Сохранить» записало бы в файл настроек панели.`,"views.globalSettings.description":`Прослушиватель, доступ, показатели хоста, резервные копии, TLS и пути для этой панели — общие для всех рабочих пространств.`,"views.globalSettings.hostDescription":`Пороги оповещений для собственных ресурсов этой машины.`,"views.globalSettings.interfaceDescription":`Отдавайте собственный UI панели вместо штатного.`,"views.globalSettings.languageDescription":`Язык, на котором показывается эта панель, для этого браузера.`,"views.globalSettings.languageNote":`Ваш выбор хранится в этом браузере и применяется также к странице входа. Он не меняет собственный вывод журнала панели и её сообщения API.`,"views.globalSettings.listenerDescription":`Где слушает панель управления и как она себя объявляет.`,"views.globalSettings.loadErrorTitle":`Некоторые значения, хранимые только в файле, не удалось загрузить`,"views.globalSettings.navLabel":`Разделы глобальных настроек`,"views.globalSettings.pathsDescription":`Где home-hosted хранит свои файлы — глобально и для каждого рабочего пространства.`,"views.globalSettings.saveFailed":`Не удалось сохранить настройки.`,"views.globalSettings.saved":`Настройки сохранены.`,"views.globalSettings.savedRebinding":`Настройки сохранены — панель переходит на новый адрес.`,"views.globalSettings.savedToast":`Настройки сохранены`,"views.globalSettings.sectionAuthentication":`Аутентификация`,"views.globalSettings.sectionBackups":`Резервные копии`,"views.globalSettings.sectionHost":`Показатели хоста`,"views.globalSettings.sectionInterface":`Интерфейс`,"views.globalSettings.sectionListener":`Прослушиватель`,"views.globalSettings.sectionPaths":`Пути`,"views.globalSettings.sectionTls":`TLS`,"views.globalSettings.title":`Глобальные настройки`,"views.globalSettings.tlsDescription":`Отдавайте панель по HTTPS с собственным сертификатом.`,"views.logs.allStreams":`Все потоки`,"views.logs.clear":`Очистить`,"views.logs.clearDescription":`{server} — файл на диске усекается. Процесс продолжает работать, и новые строки записываются начиная с этого места.`,"views.logs.clearFile":`Очистить файл`,"views.logs.clearNote":`Сначала скачайте его, если вывод ещё нужен — отменить это из панели нельзя.`,"views.logs.clearTitle":`Очистить сохранённый файл журнала?`,"views.logs.fileEmpty":`Сохранённый файл пуст.`,"views.logs.loadedLines":`загружено {count} строк`,"views.logs.modeLive":`Живой поток`,"views.logs.modePersisted":`Сохранённое`,"views.logs.noServersDescription":`Добавьте один, и его вывод будет сохраняться здесь.`,"views.logs.noServersTitle":`Нет серверов`,"views.logs.nothingOnDisk":`Для этого сервера на диске ничего нет — сохранение выключено или он ещё ничего не записал.`,"views.logs.nothingPersisted":`ничего не сохранено`,"views.logs.persistedSummary":`{workspace} · {persisted} из {total} серверов на диске · {size}`,"views.logs.persistedTitle":`Сохранённые журналы`,"views.logs.pickServerDescription":`Сохранённый вывод и живые потоки ведутся по каждому серверу. Выберите один из списка.`,"views.logs.pickServerTitle":`Выберите сервер`,"views.logs.reload":`Перезагрузить`,"views.logs.retentionNote":`Ротация и хранение задаются в разделе «Настройки рабочего пространства» → «Журналы».`,"views.logs.searchAria":`Искать в журнале`,"views.logs.searchPlaceholder":`искать в окне хвоста`,"views.logs.searchedLines":`просмотрено {count} строк`,"views.logs.streamAria":`Поток`,"views.logs.tailAria":`Размер хвоста`,"views.logs.waitingOutput":`Подключено — ожидание вывода.`,"views.overview.acrossTree":`по всему дереву`,"views.overview.cpuNow":`{value}% ЦП сейчас`,"views.overview.crashedOrUnhealthy":`авария или неисправность`,"views.overview.description":`Живое состояние каждого сервера в этом рабочем пространстве, обновляемое через один поток событий.`,"views.overview.emptyDescription":`Добавьте первый процесс, который это рабочее пространство должно поддерживать.`,"views.overview.emptyTitle":`В этом рабочем пространстве нет серверов`,"views.overview.enabled":`включено: {count}`,"views.overview.longestUptime":`Наибольшее время работы`,"views.overview.needsAttention":`Требует внимания`,"views.overview.notUp":`не работают: {count}`,"views.overview.nothingBroken":`ничего не сломано`,"views.overview.nothingRunning":`ничего не работает`,"views.overview.openFullList":`Открыть полный список`,"views.overview.peak":`пик {value}`,"views.overview.processMemory":`Память процессов`,"views.overview.recentActivity":`Недавняя активность`,"views.overview.running":`Работает`,"views.overview.sampling":`история ресурсов собирается каждые 5 с и хранится до конца сеанса`,"views.overview.stopped":`Остановлен`,"views.overview.workspaceLabel":`рабочее пространство {id}`,"views.route.server":`Сервер`,"views.serverDetail.allServers":`Все серверы`,"views.serverDetail.autostart":`Автозапуск вместе с панелью`,"views.serverDetail.backToServers":`Назад к серверам`,"views.serverDetail.bind":`Привязка`,"views.serverDetail.bindCustom":`{bind} — свой`,"views.serverDetail.bindLan":`0.0.0.0 — все интерфейсы`,"views.serverDetail.bindLocal":`127.0.0.1 — только эта машина`,"views.serverDetail.closeEditor":`Закрыть редактор`,"views.serverDetail.copyJson":`Скопировать конфигурацию JSON`,"views.serverDetail.crashes24":`Аварии за 24 ч`,"views.serverDetail.dependencies":`Зависимости`,"views.serverDetail.detached":`отсоединён`,"views.serverDetail.detachedHint":`Этот процесс заменил сам себя: панель приняла преемника, а не запустила вторую копию. Остановка всё ещё работает, его вывод остаётся там, куда его направил преемник.`,"views.serverDetail.disableServer":`Отключить сервер`,"views.serverDetail.editHint":`Изменить каждое поле этой записи`,"views.serverDetail.effectiveConfig":`Действующая конфигурация`,"views.serverDetail.effectiveConfigNote":`Значения по умолчанию из настроек уже включены в эти значения.`,"views.serverDetail.enableServer":`Включить сервер`,"views.serverDetail.eventHistory":`История событий`,"views.serverDetail.eventHistoryNote":`Хранится панелью 24 часа.`,"views.serverDetail.fieldArgs":`args`,"views.serverDetail.fieldBackupPaths":`пути резервных копий`,"views.serverDetail.fieldBootstrap":`bootstrap`,"views.serverDetail.fieldCommand":`command`,"views.serverDetail.fieldCwd":`cwd`,"views.serverDetail.fieldDataEnvs":`переменные данных`,"views.serverDetail.fieldDependsOn":`зависит от`,"views.serverDetail.fieldEnv":`env`,"views.serverDetail.fieldEnvFile":`файл окружения`,"views.serverDetail.fieldHealth":`исправность`,"views.serverDetail.fieldLogBuffer":`буфер журнала`,"views.serverDetail.fieldOnPortConflict":`при конфликте портов`,"views.serverDetail.fieldPortBind":`порт · привязка`,"views.serverDetail.fieldRestart":`перезапуск`,"views.serverDetail.fieldRssLimit":`лимит RSS`,"views.serverDetail.fieldStop":`остановка`,"views.serverDetail.fields":`Поля`,"views.serverDetail.goneDescription":`{id} больше нет в servers.config.json. Возможно, он был удалён на другой вкладке.`,"views.serverDetail.goneTitle":`Этот сервер исчез`,"views.serverDetail.health":`Исправность`,"views.serverDetail.healthProbe":`Проверка исправности`,"views.serverDetail.lastCrash":`Последняя авария`,"views.serverDetail.lastProbe":`Последняя проверка`,"views.serverDetail.logBufferLines":`{count} строк`,"views.serverDetail.memoryRss":`Память (RSS)`,"views.serverDetail.moreActions":`Дополнительные действия для {label}`,"views.serverDetail.neverWritten":`Этот сервер ещё ничего не записал.`,"views.serverDetail.nextAttempt":`Следующая попытка`,"views.serverDetail.none":`нет`,"views.serverDetail.off":`выкл.`,"views.serverDetail.persistent":`постоянный`,"views.serverDetail.persistentHint":"Этот элемент работает под управлением собственной няни (nanny), поэтому продолжает работать, когда панель останавливается, перезапускается или уничтожается. `home-hosted down` сообщает о нём, а не останавливает его; останавливает только «Остановить».","views.serverDetail.pid":`PID`,"views.serverDetail.portFree":`свободен`,"views.serverDetail.portInUse":`занят`,"views.serverDetail.portState":`Состояние порта`,"views.serverDetail.probeFailed":`Проверка исправности ещё не прошла.`,"views.serverDetail.probeFailedFor":`Проверка исправности не проходит уже {duration}.`,"views.serverDetail.processes":`Процессы`,"views.serverDetail.rawJson":`Необработанный JSON`,"views.serverDetail.removeAutostart":`Убрать из автозапуска`,"views.serverDetail.removeDescription":`{label} удаляется из servers.config.json: его процесс останавливается, а журналы и история аварий удаляются вместе с ним.`,"views.serverDetail.removeNote":`Отменить это из панели нельзя — запись придётся добавить вручную или из резервной копии.`,"views.serverDetail.removeServer":`Удалить сервер`,"views.serverDetail.removeTitle":`Удалить этот сервер?`,"views.serverDetail.restart":`Перезапустить`,"views.serverDetail.restarts":`Перезапуски`,"views.serverDetail.sectionConfig":`Конфигурация`,"views.serverDetail.sectionHistory":`История`,"views.serverDetail.sectionOutput":`Живой вывод`,"views.serverDetail.start":`Запустить`,"views.serverDetail.startsOnItsOwn":`Запускается сам. Добавьте id в {code}, чтобы упорядочить его после других серверов.`,"views.serverDetail.stop":`Остановить`,"views.serverDetail.telemetry":`Телеметрия`,"views.serverDetail.telemetryNote":`Собирается каждые 5 с, пока эта страница открыта.`,"views.serverDetail.unhealthyFor":`Неисправен уже`,"views.serverDetail.uptime24":`Время работы за 24 ч`,"views.serverDetail.waitingFirstLine":`Ожидание первой строки…`,"views.servers.clearFilter":`Очистить фильтр`,"views.servers.clearFilters":`Очистить фильтры`,"views.servers.description":`Каждая запись в servers.config.json рабочего пространства {workspace}, с живыми ресурсами, исправностью и историей.`,"views.servers.emptyDescription":`Добавьте первый процесс, которым должна управлять эта панель. Его команда, аргументы, окружение и рабочий каталог задаются в файле конфигурации.`,"views.servers.emptyTitle":`Серверы не настроены`,"views.servers.filterAll":`Все`,"views.servers.filterAria":`Фильтр серверов`,"views.servers.filterAttention":`Внимание`,"views.servers.filterDisabled":`Отключённые`,"views.servers.filterPlaceholder":`Фильтр по id, метке, команде или порту`,"views.servers.filterRunning":`Работают`,"views.servers.filterStopped":`Остановленные`,"views.servers.noMatchDescription":`Попробуйте другое состояние или очистите поиск.`,"views.servers.noMatchTitle":`Ничего не соответствует этому фильтру`,"views.settings.changesDescription":`Что «Сохранить» записало бы в настройки рабочего пространства {workspace}.`,"views.settings.configErrorNote":`Панель продолжает управлять с прежней конфигурацией; исправление файла перезагрузит её само.`,"views.settings.configErrorTitle":`Не удалось прочитать конфигурацию рабочего пространства`,"views.settings.configWarningTitle":`В конфигурации этого рабочего пространства есть предупреждение`,"views.settings.ddnsDescription":`Держите имена хостов указывающими на публичный адрес этой машины, у какого бы регистратора они ни были.`,"views.settings.defaultsDescription":`Применяются к каждой записи в этом рабочем пространстве, которая не задаёт собственное значение.`,"views.settings.description":`Серверные значения по умолчанию, хранение журналов, уведомления и Dynamic DNS для {workspace}.`,"views.settings.logsDescription":`Сколько вывода это рабочее пространство хранит на диске и как долго.`,"views.settings.navLabel":`Разделы настроек рабочего пространства`,"views.settings.notificationsDescription":`Оповещения об авариях и исправности для этого рабочего пространства, отправляемые в чат Telegram.`,"views.settings.saveFailed":`Не удалось сохранить настройки.`,"views.settings.saved":`Настройки рабочего пространства сохранены.`,"views.settings.savedToast":`Настройки рабочего пространства сохранены`,"views.settings.sectionDdns":`Dynamic DNS`,"views.settings.sectionDefaults":`Серверные значения по умолчанию`,"views.settings.sectionLogs":`Журналы`,"views.settings.sectionNotifications":`Уведомления`,"workspace.new":`Новое рабочее пространство`,"workspace.rename":`Переименовать рабочее пространство`,"workspace.create":`Создать рабочее пространство`,"workspace.renameAction":`Переименовать`,"workspace.createHint":`Собственные настройки, серверы, журналы, секреты и запись резервной копии — обслуживается той же панелью.`,"workspace.renameHint":`Меняется только название; id рабочего пространства сохраняется, поэтому URL и пути продолжают работать.`,"workspace.nameHint":`Показывается в верхней панели.`,"workspace.nameHintId":`Показывается в верхней панели. Id: {id}`,"workspace.none":`Нет рабочего пространства`,"workspace.delete":`Удалить рабочее пространство`,"days.remaining":{one:`{count} день`,few:`{count} дня`,many:`{count} дней`,other:`{count} дня`},"editor.unsaved":{one:`несохранённое изменение`,few:`несохранённых изменения`,many:`несохранённых изменений`,other:`несохранённых изменения`},"editor.saveChanges":{one:`Сохранить {count} изменение`,few:`Сохранить {count} изменения`,many:`Сохранить {count} изменений`,other:`Сохранить {count} изменения`},"logs.lines":{one:`{count} строка`,few:`{count} строки`,many:`{count} строк`,other:`{count} строки`},"palette.results":{one:`{count} результат`,few:`{count} результата`,many:`{count} результатов`,other:`{count} результата`},"proxy.retry.inMinutes":{one:`~{count} минуту`,few:`~{count} минуты`,many:`~{count} минут`,other:`~{count} минуты`},"proxy.retry.inHours":{one:`~{count} час`,few:`~{count} часа`,many:`~{count} часов`,other:`~{count} часа`},"servers.total":{one:`{count} сервер`,few:`{count} сервера`,many:`{count} серверов`,other:`{count} сервера`},"servers.running":{one:`{count} работает`,few:`{count} работают`,many:`{count} работают`,other:`{count} работают`},"settings.backup.entriesCount":{one:`{count} запись`,few:`{count} записи`,many:`{count} записей`,other:`{count} записи`},"settings.backup.itemsSelected":{one:`выбран {count} элемент`,few:`выбрано {count} элемента`,many:`выбрано {count} элементов`,other:`выбрано {count} элемента`},"settings.ddns.hostnameCount":{one:`{count} имя хоста`,few:`{count} имени хоста`,many:`{count} имён хостов`,other:`{count} имени хоста`},"settings.shell.fieldsChanged":{one:`поле изменено`,few:`поля изменены`,many:`полей изменено`,other:`поля изменены`},"settings.shell.saveChanges":{one:`Сохранить {count} изменение`,few:`Сохранить {count} изменения`,many:`Сохранить {count} изменений`,other:`Сохранить {count} изменения`},"views.globalOverview.needLook":{one:`{count} сервер требует внимания`,few:`{count} сервера требуют внимания`,many:`{count} серверов требуют внимания`,other:`{count} сервера требуют внимания`},"views.logs.filesOnDisk":{one:`{count} файл`,few:`{count} файла`,many:`{count} файлов`,other:`{count} файла`},"views.overview.needLook":{one:`{count} сервер требует внимания`,few:`{count} сервера требуют внимания`,many:`{count} серверов требуют внимания`,other:`{count} сервера требуют внимания`}};export{e as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
var e={"activity.emptyTitle":`Không có sự kiện nào trong 24 giờ qua`,"activity.emptyDescription":`Khởi động, thoát, sự cố và phục hồi xuất hiện ở đây khi chúng xảy ra.`,"activity.ran":`đã chạy {duration}`,"addServer.title":`Thêm máy chủ`,"addServer.description":`Thêm một mục vào servers.config.json của {workspace}; mọi chính sách bạn bỏ trống đều kế thừa từ giá trị mặc định.`,"addServer.thisWorkspace":`không gian làm việc này`,"addServer.identity":`Nhận dạng`,"addServer.id":`Id`,"addServer.idHint":`Chữ thường, chữ số, dấu gạch ngang và gạch dưới; được dùng trong URL và nhật ký.`,"addServer.labelHint":`Hiển thị trong bảng điều khiển; mặc định là id.`,"addServer.process":`Tiến trình`,"addServer.commandHint":`Được spawn không qua shell.`,"addServer.argumentsHint":`Mỗi dòng một tham số; khoảng trắng trong dòng được giữ nguyên.`,"addServer.portLifecycle":`Cổng & vòng đời`,"addServer.bindHint":`lan mở nó ra mạng; chỉ làm vậy khi đã có xác thực.`,"addServer.advanced":`Cài đặt nâng cao`,"addServer.advancedHint":`môi trường, sao lưu, chính sách, vòng đời, bootstrap`,"addServer.backups":`Sao lưu`,"addServer.backupIgnore":`Bỏ qua các tệp sinh tự động đã biết`,"addServer.bootstrapDescription":`Một lệnh chạy một lần trước lần khởi động đầu tiên.`,"addServer.bootstrapHint":`Cài đặt, migration, tải xuống — trước lần khởi động đầu tiên, không phải mọi lần.`,"addServer.policyResources":`Chính sách & tài nguyên`,"addServer.logBufferHint":`Để trống là dùng mặc định.`,"addServer.inheritNote":`Khởi động lại, tình trạng và dừng ban đầu khớp với {settings}; đổi một mục ở đây thì nó được ghi vào mục này thay vì tiếp tục kế thừa.`,"addServer.serverDefaults":`Cài đặt → Mặc định máy chủ`,"addServer.placeholdersTitle":`Các placeholder có sẵn cho tham số`,"addServer.submit":`Thêm vào servers.config.json`,"app.name":`home-hosted`,"app.tagline":`Bảng điều khiển giám sát tiến trình`,"bind.local":`local — 127.0.0.1`,"bind.lan":`lan — 0.0.0.0`,"bind.explicit":`{bind} — chỉ định rõ`,"common.cancel":`Huỷ`,"common.confirm":`Xác nhận`,"common.reset":`Đặt lại`,"common.keepIt":`Giữ nguyên`,"common.remove":`Gỡ bỏ`,"common.close":`Đóng`,"common.save":`Lưu`,"common.saving":`Đang lưu…`,"common.discard":`Bỏ thay đổi`,"common.delete":`Xoá`,"common.edit":`Sửa`,"common.add":`Thêm`,"common.retry":`Thử lại`,"common.copy":`Sao chép`,"common.copied":`Đã sao chép`,"common.enabled":`Đang bật`,"common.disabled":`Đang tắt`,"common.none":`Không có`,"common.unknown":`không rõ`,"common.loading":`Đang tải…`,"common.selectAll":`Chọn tất cả`,"common.selectNone":`Bỏ chọn tất cả`,"common.name":`Tên`,"common.label":`Nhãn`,"common.hostname":`Tên máy chủ`,"common.port":`Cổng`,"common.command":`Lệnh`,"common.environment":`Biến môi trường`,"common.memory":`Bộ nhớ`,"common.cpu":`CPU`,"common.disk":`Đĩa`,"common.uptime":`Thời gian hoạt động`,"common.status":`Trạng thái`,"common.actions":`Thao tác`,"common.details":`Chi tiết`,"common.overview":`Tổng quan`,"common.warning":`Cảnh báo`,"common.error":`Lỗi`,"common.confirmQuestion":`{label}?`,"common.unset":`chưa đặt`,"common.never":`chưa bao giờ`,"common.now":`vừa xong`,"common.dismiss":`Bỏ qua`,"connection.live":`Trực tiếp`,"connection.connecting":`Đang kết nối`,"connection.reconnecting":`Đang kết nối lại`,"connection.liveUpdates":`Cập nhật trực tiếp`,"editor.title":`Sửa cấu hình`,"editor.description":`Ghi các ghi đè vào {file}; phần nào để nguyên sẽ tiếp tục kế thừa giá trị mặc định.`,"editor.inSync":`đã đồng bộ`,"editor.process":`Tiến trình`,"editor.processDescription":`Thứ được spawn, ở đâu, và với môi trường nào.`,"editor.labelPlaceholder":`quay về dùng id`,"editor.argumentsHint":`Mỗi dòng một tham số; {port} {host} {home} {projectDir} {dataRoot} {id} {label} {cwd} {bind} {lanIp} sẽ được thay thế.`,"editor.portTitle":`Cổng & bind`,"editor.portDescription":`Cách cổng được preflight và nơi tiến trình truy cập được.`,"editor.bindHint":`Một IPv4 tuỳ chỉnh mà cấu hình đã đặt vẫn chọn được.`,"editor.lifecycle":`Vòng đời`,"editor.lifecycleDescription":`Supervisor có quản lý mục này hay không.`,"editor.save":`Lưu vào servers.config.json`,"editor.changesTitle":`Thay đổi chưa lưu`,"editor.changesDescription":`Những gì nút Lưu sẽ ghi vào servers.config.json.`,"editor.nothingToSave":`Không có gì để lưu.`,"health.disabled":`Không kiểm tra`,"health.unknown":`Chưa dò`,"health.healthy":`Bình thường`,"health.unhealthy":`Bất thường`,"history.start":`Đã khởi động`,"history.exit":`Đã thoát`,"history.crash":`Gặp sự cố`,"history.forcedRestart":`Buộc khởi động lại`,"history.unhealthy":`Bất thường`,"history.recovered":`Đã phục hồi`,"host.loadPerCpu":`Tải / cpu`,"host.cpuTemp":`Nhiệt độ CPU`,"host.samplingOff":`Lấy mẫu máy chủ đang tắt`,"host.samplingOffDescription":`Bật trong Cài đặt để thu thập tải, bộ nhớ, đĩa và nhiệt độ.`,"host.swap":`Swap`,"host.cpus":`CPU`,"host.loadAverage":`Tải 1 / 5 / 15`,"host.memoryUsed":`Bộ nhớ đã dùng`,"host.sampled":`Đã lấy mẫu`,"host.filesystems":`Hệ thống tệp`,"host.thresholdsBreached":`Ngưỡng bị vượt`,"killPort.trigger":`Kill thứ đang giữ cổng {port}`,"killPort.title":`Kill tiến trình trên cổng {port}?`,"killPort.body":`Nó được yêu cầu dừng trước, và chỉ bị kill nếu bỏ qua yêu cầu đó. Mọi thứ bảng điều khiển này giám sát đều bị từ chối, nên một máy chủ được quản lý không thể mất theo cách này.`,"killPort.confirm":`Kill nó`,"language.label":`Ngôn ngữ`,"language.select":`Chọn ngôn ngữ`,"lifecycle.restartTitle":`Chính sách khởi động lại`,"lifecycle.restartDescription":`Thời gian chờ tăng dần giữa các lần thử sau khi sự cố.`,"lifecycle.restartOnCrash":`Khởi động lại khi sự cố`,"lifecycle.maxRetries":`Số lần thử tối đa`,"lifecycle.maxRetriesHint":`Số lần thử trước khi máy chủ bị bỏ ở trạng thái sự cố.`,"lifecycle.baseDelay":`Độ trễ cơ sở (ms)`,"lifecycle.factor":`Hệ số tăng dần`,"lifecycle.maxDelay":`Độ trễ tối đa (ms)`,"lifecycle.resetAfter":`Đặt lại sau (ms)`,"lifecycle.resetAfterHint":`Một lần chạy dài đến mức này sẽ xoá bộ đếm số lần thử.`,"lifecycle.healthTitle":`Dò tình trạng`,"lifecycle.healthDescription":`Cách dò mức sẵn sàng sau khi tiến trình chạy lên.`,"lifecycle.probe":`Dò máy chủ này`,"lifecycle.probeType":`Kiểu dò`,"lifecycle.probePort":`Cổng TCP — chỉ kết nối`,"lifecycle.probeHttp":`Yêu cầu HTTP — kiểm tra phản hồi`,"lifecycle.interval":`Khoảng thời gian (ms)`,"lifecycle.timeout":`Thời gian chờ (ms)`,"lifecycle.unhealthyAfter":`Bất thường sau`,"lifecycle.unhealthyAfterHint":`Số lần dò thất bại liên tiếp.`,"lifecycle.forceRestartAfter":`Buộc khởi động lại sau (ms)`,"lifecycle.forceRestartAfterHint":`0 là tắt.`,"lifecycle.startTimeout":`Thời gian chờ khởi động (ms)`,"lifecycle.httpPath":`Đường dẫn HTTP`,"lifecycle.httpMethod":`Phương thức HTTP`,"lifecycle.expectStatus":`Mong đợi mã trạng thái`,"lifecycle.expectStatusHint":`Để trống là chấp nhận mọi mã thấp hơn.`,"lifecycle.expectStatusBelow":`Khoẻ khi trạng thái thấp hơn`,"lifecycle.expectBody":`Nội dung phải chứa`,"lifecycle.expectBodyPlaceholder":`chuỗi con không bắt buộc`,"lifecycle.headBodyHint":`HEAD không có nội dung phản hồi, nên phép dò này bị bỏ qua — hãy dùng GET hoặc xoá trống.`,"lifecycle.stopTitle":`Hành vi khi dừng`,"lifecycle.stopDescription":`Cách yêu cầu cây tiến trình kết thúc.`,"lifecycle.signal":`Tín hiệu`,"lifecycle.signalTerm":`SIGTERM — yêu cầu dừng`,"lifecycle.signalInt":`SIGINT — ngắt (Ctrl-C)`,"lifecycle.signalKill":`SIGKILL — kill ngay`,"lifecycle.grace":`Thời gian gia hạn (ms)`,"lifecycle.killGroup":`Kill toàn bộ nhóm tiến trình`,"lifecycle.killPortHolders":`Cũng kill bất cứ thứ gì đang giữ cổng`,"login.title":`Đăng nhập để tiếp tục`,"login.firstRunTitle":`Bảng điều khiển này chưa có mật khẩu`,"login.firstRunSubtitle":`Bất kỳ thứ gì trên máy này đều truy cập được. Hãy đặt mật khẩu ngay sau khi vào.`,"login.authOffTitle":`Xác thực đang tắt`,"login.authOffSubtitle":`Bảng điều khiển chỉ lắng nghe trên loopback, và đó là thứ duy nhất bảo vệ nó lúc này.`,"login.subtitle":`Bảng điều khiển đã được bảo vệ. Nhập mật khẩu để tiếp tục.`,"login.password":`Mật khẩu`,"login.showPassword":`Hiện mật khẩu`,"login.hidePassword":`Ẩn mật khẩu`,"login.signIn":`Đăng nhập`,"login.openDashboard":`Mở bảng điều khiển`,"login.exposed":`Đang phơi bày`,"login.defaultPasswordWarning":`Vẫn đang dùng mật khẩu mặc định {password}. Hãy đổi trong Cài đặt — việc lắng nghe ngoài 127.0.0.1 vẫn bị từ chối cho đến khi bạn đổi.`,"login.noPasswordWarning":`Chưa đặt mật khẩu. Mở Cài đặt từ máy này để thêm, hoặc chạy {command}.`,"login.sessionNote":`Phiên đăng nhập kéo dài {days} ngày sau lần truy cập cuối — mỗi yêu cầu gia hạn thêm. Đăng xuất chỉ xoá trên trình duyệt này.`,"login.servedFromThisMachine":`phục vụ từ máy này`,"logs.emptyHint":`Chưa có đầu ra.`,"logs.noMatches":`Không có gì khớp với tìm kiếm hoặc bộ lọc luồng đó.`,"logs.searchPlaceholder":`Tìm trong đầu ra này`,"logs.searchLabel":`Tìm trong đầu ra nhật ký`,"logs.clearSearch":`Xoá tìm kiếm`,"logs.prevMatch":`Kết quả trước`,"logs.nextMatch":`Kết quả tiếp theo`,"logs.showTimestamps":`Hiện dấu thời gian`,"logs.hideTimestamps":`Ẩn dấu thời gian`,"logs.timestampsShort":`ts`,"logs.pause":`Tạm dừng`,"logs.follow":`Bám theo`,"logs.clearHint":`Xoá bộ đệm trong bộ nhớ`,"logs.clearLabel":`Xoá bộ đệm nhật ký`,"logs.downloadHint":`Tải tệp đã lưu`,"logs.downloadLabel":`Tải tệp nhật ký`,"logs.outputLabel":`Đầu ra nhật ký`,"logs.jumpToLatest":`Nhảy tới mới nhất`,"logs.streaming":`đang truyền`,"logs.paused":`đã tạm dừng`,"logs.snapshot":`ảnh chụp`,"logs.linesOf":`{count} trong {total} dòng`,"logs.matches":`{count} kết quả`,"logs.rowHeight":`chiều cao dòng {height}px · dạng cửa sổ`,"logs.streamAll":`Tất cả`,"logs.streamOut":`out`,"logs.streamErr":`err`,"logs.streamSys":`sys`,"metric.emptyHint":`đang thu thập…`,"nav.global":`Toàn cục`,"nav.workspace":`Không gian làm việc`,"nav.others":`Khác`,"nav.overview":`Tổng quan`,"nav.servers":`Máy chủ`,"nav.logs":`Nhật ký`,"nav.workspaceSettings":`Cài đặt không gian làm việc`,"nav.globalOverview":`Tổng quan toàn cục`,"nav.globalSettings":`Cài đặt toàn cục`,"nav.reverseProxy":`Reverse Proxy`,"nav.navigation":`Điều hướng`,"nav.closeNavigation":`Đóng điều hướng`,"nav.hostVitals":`Chỉ số máy chủ`,"notice.configError":`Không đọc được tệp cấu hình: {error}`,"notice.configErrorHint":`Bảng điều khiển vẫn chạy cấu hình cũ; sửa {path} là nó tự nạp lại.`,"notice.defaultPassword":`Bảng điều khiển này vẫn dùng mật khẩu mặc định.`,"notice.defaultPasswordHint":`Hãy đổi trong Cài đặt toàn cục — việc lắng nghe ngoài 127.0.0.1 vẫn bị từ chối cho đến khi bạn đổi.`,"notice.noPassword":`Xác thực đang bật nhưng chưa đặt mật khẩu, nên không có gì được yêu cầu.`,"notice.noPasswordHint":`Đặt mật khẩu trong Cài đặt toàn cục để thực sự khoá bảng điều khiển.`,"notice.exposed":`Bảng điều khiển này truy cập được từ ngoài 127.0.0.1.`,"notice.exposedHint":`Hãy giữ mật khẩu mạnh, hoặc đặt một proxy kết thúc TLS phía trước.`,"notice.authOff":`Xác thực đang tắt — bảng điều khiển chỉ được bảo vệ bởi việc lắng nghe trên loopback.`,"onPortConflict.block":`block — từ chối khởi động`,"onPortConflict.warn":`warn — vẫn khởi động`,"onPortConflict.follow":`follow — tiếp nhận bản khởi động lại tách rời của chính nó`,"onPortConflict.reclaim":`reclaim — thay bằng một bản sao được giám sát`,"onPortConflict.kill":`kill — dừng bất cứ thứ gì đang giữ cổng`,"palette.placeholder":`Chuyển tới máy chủ, chạy thao tác, mở cài đặt…`,"palette.openServer":`Mở {label}`,"palette.serverLogs":`Nhật ký của {label}`,"palette.startServer":`Khởi động {label}`,"palette.stopServer":`Dừng {label}`,"palette.restartServer":`Khởi động lại {label}`,"palette.goOverview":`Tới Tổng quan`,"palette.goGlobalOverview":`Tới Tổng quan toàn cục`,"palette.goGlobalSettings":`Tới Cài đặt toàn cục`,"palette.goProxy":`Tới Reverse Proxy`,"palette.goServers":`Tới Máy chủ`,"palette.goLogs":`Tới Nhật ký`,"palette.goWorkspaceSettings":`Tới Cài đặt không gian làm việc`,"palette.startAll":`Khởi động mọi máy chủ đang bật ở đây`,"palette.stopAll":`Dừng mọi máy chủ ở đây`,"palette.switchWorkspace":`Chuyển sang {label}`,"palette.globalSetting":`Cài đặt toàn cục: {label}`,"palette.workspaceSetting":`Cài đặt không gian làm việc: {label}`,"palette.theme":`Giao diện {theme}`,"palette.groupServers":`Máy chủ`,"palette.groupActions":`Thao tác`,"palette.groupNavigate":`Điều hướng`,"palette.groupWorkspaces":`Không gian làm việc`,"palette.groupAppearance":`Giao diện`,"palette.navigate":`di chuyển`,"palette.run":`chạy`,"palette.noMatches":`Không có kết quả cho “{query}”.`,"proxy.account.automatic":`Tự động (tài khoản duy nhất có thể trả lời)`,"proxy.account.noTxt":`không hỗ trợ TXT`,"proxy.account.noCredentials":`chưa có thông tin đăng nhập`,"proxy.account.gone":`Tài khoản đó không còn được cấu hình.`,"proxy.account.emptyHint":`DNS-01 ghi bản ghi thử thách ở đây. Để trống là dùng tài khoản duy nhất có thể trả lời thử thách, nếu có.`,"proxy.account.cannotWrite":`Tài khoản {provider} không ghi được bản ghi TXT, nên không thể trả lời thử thách DNS-01.`,"proxy.account.noCredentialsYet":`Chưa có thông tin đăng nhập nào được lưu cho tài khoản {provider} này.`,"proxy.account.through":`Thử thách được ghi qua tài khoản {provider} này.`,"proxy.certificate.title":`Chứng chỉ đã tải lên`,"proxy.certificate.description":`Được phục vụ bởi các tuyến đường đặt ở “Chứng chỉ đã tải lên”. Mọi thứ khác — công khai hay nội bộ — đều do engine tự cấp chứng chỉ.`,"proxy.certificate.add":`Thêm chứng chỉ`,"proxy.certificate.emptyTitle":`Chưa tải lên chứng chỉ nào`,"proxy.certificate.emptyDescription":`Route đặt ở “Chứng chỉ đã tải lên” cần một cặp bao phủ hostname của nó, nếu không engine không có gì để phục vụ.`,"proxy.certificate.daysLeft":`còn {days} ngày`,"proxy.certificate.subject":`Chủ thể`,"proxy.certificate.issuer":`Nhà phát hành`,"proxy.certificate.validUntil":`Có hiệu lực đến`,"proxy.certificate.covers":`Bao phủ`,"proxy.certificate.noSans":`không có hostname nào trong SAN`,"proxy.certificate.removeAria":`Gỡ {name}`,"proxy.certificate.removeQuestion":`Gỡ “{name}”?`,"proxy.certificate.removeBody":`Cặp chứng chỉ bị xoá khỏi đĩa. Tuyến đường vẫn đặt ở “Chứng chỉ đã tải lên” sẽ tiếp tục phục vụ chứng chỉ riêng của engine cho đến khi bạn đổi, và bảng điều khiển từ chối thao tác này khi còn tuyến đường đang dùng nó.`,"proxy.certificate.removeIt":`Gỡ nó`,"proxy.certificate.stored":`Đã lưu “{label}”.`,"proxy.certificate.removed":`Đã gỡ “{name}”.`,"proxy.certificateDialog.title":`Thêm chứng chỉ`,"proxy.certificateDialog.description":`Cặp chứng chỉ được lưu trên đĩa dưới id của nó, và tuyến đường đặt ở “Chứng chỉ đã tải lên” có thể phục vụ nó.`,"proxy.certificateDialog.label":`Nhãn`,"proxy.certificateDialog.labelPlaceholder":`Wildcard gia đình`,"proxy.certificateDialog.id":`Id`,"proxy.certificateDialog.idHint":`đặt tên cho các tệp trên đĩa`,"proxy.certificateDialog.certFile":`Tệp chứng chỉ (.pem, .crt)`,"proxy.certificateDialog.keyFile":`Tệp khoá riêng (.pem, .key)`,"proxy.certificateDialog.pasteCert":`Hoặc dán chứng chỉ`,"proxy.certificateDialog.pasteKey":`Hoặc dán khoá riêng`,"proxy.certificateDialog.certPlaceholder":`-----BEGIN CERTIFICATE-----`,"proxy.certificateDialog.keyPlaceholder":`-----BEGIN PRIVATE KEY-----`,"proxy.certificateDialog.store":`Lưu chứng chỉ`,"proxy.certificateDialog.errorLabel":`cần có nhãn`,"proxy.certificateDialog.errorId":`id phải bắt đầu bằng chữ cái hoặc chữ số, sau đó là chữ cái, chữ số, gạch ngang hoặc gạch dưới`,"proxy.certificateDialog.errorTaken":`“{id}” đã được một chứng chỉ khác dùng`,"proxy.certificateDialog.errorCertificate":`hãy dán hoặc chọn chứng chỉ`,"proxy.certificateDialog.errorPrivateKey":`hãy dán hoặc chọn khoá riêng`,"proxy.engine.title":`Bộ máy`,"proxy.engine.description":`Bản thân proxy nghịch đảo. Bảng điều khiển tải bản build hiện tại, giám sát nó và áp dụng cấu hình qua API quản trị riêng của engine.`,"proxy.engine.notInFrame":`Trạng thái proxy chưa nằm trong khung của bảng điều khiển này.`,"proxy.engine.readFailed":`Không đọc được engine`,"proxy.engine.notInstalled":`Chưa cài engine`,"proxy.engine.installNote":`Cài đặt sẽ tải bản phát hành {engine} hiện tại mà bảng điều khiển giám sát — khoảng 46 MB, một lần. Không có gì được mở ra cho đến khi thêm tuyến đường và bật proxy.`,"proxy.engine.version":`Phiên bản`,"proxy.engine.notProbed":`chưa dò`,"proxy.engine.source":`Nguồn`,"proxy.engine.sourceCustom":`một đường dẫn được cấu hình thủ công`,"proxy.engine.sourceDownloaded":`do bảng điều khiển tải về`,"proxy.engine.size":`Kích thước`,"proxy.engine.binary":`Tệp nhị phân`,"proxy.engine.copyPath":`Sao chép đường dẫn nhị phân`,"proxy.engine.address":`Địa chỉ đang hoạt động`,"proxy.engine.process":`Tiến trình`,"proxy.engine.certificates":`Chứng chỉ`,"proxy.engine.noCert":`chưa có chứng chỉ công khai`,"proxy.engine.expiresSoon":`cái sớm nhất hết hạn sau {days} ngày`,"proxy.engine.acme":`Chứng chỉ ACME`,"proxy.engine.localCa":`CA cục bộ`,"proxy.engine.dns01":`DNS-01`,"proxy.engine.tcpUdp":`TCP/UDP`,"proxy.engine.documentation":`Tài liệu {engine}`,"proxy.engine.failed":`Engine báo lỗi`,"proxy.engine.setcapHint":`Cổng đặc quyền (dưới 1024) cần lệnh này một lần trên Linux:`,"proxy.engine.copyCommand":`Sao chép lệnh`,"proxy.engine.install":`Cài engine`,"proxy.engine.start":`Khởi động`,"proxy.engine.stop":`Dừng`,"proxy.engine.apply":`Áp dụng cấu hình`,"proxy.engine.revert":`Hoàn tác`,"proxy.engine.revertHint":`Quay về cấu hình đã được áp dụng trước lần gần nhất`,"proxy.engine.update":`Cập nhật engine`,"proxy.listener.title":`Listener & chứng chỉ`,"proxy.listener.description":`Nơi proxy lắng nghe. 80 và 443 là những cổng router chuyển tiếp và thử thách ACME mong đợi; cổng dưới 1024 cần bind đặc quyền.`,"proxy.listener.unprivilegedPorts":`cổng không đặc quyền`,"proxy.listener.run":`Chạy proxy nghịch đảo`,"proxy.listener.runHint":`Được lưu cùng nút Lưu cài đặt; bảng điều khiển khởi động hoặc dừng engine cho khớp.`,"proxy.listener.httpPort":`Cổng HTTP`,"proxy.listener.httpPortHint":`Thử thách HTTP-01 của ACME và chuyển hướng sang HTTPS.`,"proxy.listener.httpsPort":`Cổng HTTPS`,"proxy.listener.httpsPortHint":`Nơi phục vụ chứng chỉ.`,"proxy.listener.useFallback":`Dùng {http} / {https}`,"proxy.listener.useStandard":`Dùng 80 / 443`,"proxy.listener.forwardHint":`Đang chạy không đặc quyền — hãy chuyển tiếp 80 và 443 tới các cổng này trên router.`,"proxy.listener.privilegedTitle":`Cổng dưới 1024 cần bind đặc quyền`,"proxy.listener.privilegedBody":`Chạy bảng điều khiển dưới người dùng của bạn không thể bind 80 hay 443 nếu không có quyền. Hoặc cấp quyền một lần {how} rồi khởi động lại engine, hoặc giữ {http}/{https} và chuyển tiếp 80/443 từ router. Trên Windows, cổng này bind được tự do, nhưng thứ khác có thể đang giữ nó.`,"proxy.listener.privilegedWithSetcap":`bằng {command} trên tệp nhị phân của engine`,"proxy.listener.email":`Email tài khoản ACME`,"proxy.listener.emailPlaceholder":`you@example.com`,"proxy.listener.emailHint":`Let's Encrypt dùng địa chỉ này để cảnh báo khi chứng chỉ sắp hết hạn. Tên chỉ dùng nội bộ sẽ nhận CA riêng của engine và không cần địa chỉ nào.`,"proxy.listener.emailNeededTitle":`Cần một email cho HTTPS tự động`,"proxy.listener.emailNeededBody":`“{host}” là hostname công khai, nên engine hỏi một CA để lấy chứng chỉ và địa chỉ tài khoản là bắt buộc. Hãy điền vào, tắt TLS của tuyến đường, hoặc bật endpoint staging trong lúc thử nghiệm.`,"proxy.listener.staging":`Dùng endpoint staging của ACME`,"proxy.listener.stagingHint":`Chứng chỉ không được tin cậy và không tiêu tốn hạn mức trong lúc bạn thử nghiệm.`,"proxy.listener.dns01":`Trả lời thử thách bằng DNS-01`,"proxy.listener.dns01Hint":`Bảng điều khiển ghi bản ghi thử thách qua tài khoản DNS của tuyến đường, nên không cần cổng vào để lấy chứng chỉ.`,"proxy.listener.resolvers":`Kiểm tra bản ghi dựa trên`,"proxy.listener.resolversPlaceholder":`1.1.1.1, 8.8.8.8`,"proxy.listener.resolversHint":`Các nameserver mà engine đọc bản ghi từ đó; để trống là dùng của chính nó. Cần thiết khi DNS split-horizon cho nó thấy một góc nhìn khác.`,"proxy.listener.noAccountTitle":`Không có tài khoản DNS nào trả lời được thử thách`,"proxy.listener.noAccountBody":`DNS-01 đang bật, nhưng không tài khoản nào có thông tin đăng nhập dùng được. Hãy thêm một tài khoản trong Cài đặt không gian làm việc → Dynamic DNS, nếu không các tên công khai vẫn dùng thử thách qua cổng và chờ một CA không thể tiếp cận chúng.`,"proxy.listener.manyAccountsTitle":`Mỗi tuyến đường công khai phải chọn một tài khoản`,"proxy.listener.manyAccountsBody":`Có nhiều tài khoản có thể trả lời, nên “Tự động” không thể chọn. Hãy chọn một tài khoản cho mỗi tuyến đường, nếu không những tên đó vẫn dùng thử thách qua cổng.`,"proxy.listener.accountNote":`Mỗi tuyến đường tự chọn tài khoản của nó, nên các tên trong vùng khác nhau đều nhận đúng tài khoản. Tuyến đường để ở “Tự động” sẽ dùng tài khoản duy nhất mà bảng liệt kê. Tên không tài khoản nào trả lời được vẫn dùng thử thách qua cổng.`,"proxy.listener.pendingNote":`Tên công khai có chứng chỉ vẫn đang được cấp vẫn truy cập được trong lúc chờ — qua HTTPS với chứng chỉ tạm thời không được tin cậy, hoặc qua HTTP thuần với một trang nêu các cổng cần chuyển tiếp.`,"proxy.retry.inFallback":`~8 giờ`,"proxy.retryButton.force":`Buộc thử lại chứng chỉ`,"proxy.retryButton.question":`Hỏi lại CA cho {host}?`,"proxy.retryButton.body":`Trước đó engine không lấy được chứng chỉ CA cho hostname này và đang dùng CA cục bộ của nó. Nó tự thử lại mỗi {retryIn}.`,"proxy.retryButton.warning":`Thử lại ngay sẽ kill tuyến đường này và khiến nó không truy cập được một lúc, bạn có chắc muốn tiếp tục?`,"proxy.retryButton.leave":`Để vậy`,"proxy.retryButton.now":`Thử lại ngay`,"proxy.routeDialog.titleEdit":`Sửa tuyến đường`,"proxy.routeDialog.titleAdd":`Thêm tuyến đường`,"proxy.routeDialog.description":`Một hostname, đích chuyển tiếp, và cách phục vụ qua TLS.`,"proxy.routeDialog.hostname":`Hostname`,"proxy.routeDialog.hostnamePlaceholder":`gitea.example.com`,"proxy.routeDialog.path":`Tiền tố đường dẫn`,"proxy.routeDialog.pathPlaceholder":`/optional`,"proxy.routeDialog.pathHint":`Để trống là phục vụ toàn bộ host.`,"proxy.routeDialog.target":`Đích`,"proxy.routeDialog.tls":`TLS`,"proxy.routeDialog.dnsAccount":`Tài khoản DNS`,"proxy.routeDialog.localNote":`Tên chỉ dùng nội bộ được CA riêng của engine ký, nên không liên quan tài khoản DNS.`,"proxy.routeDialog.workspace":`Không gian làm việc`,"proxy.routeDialog.server":`Máy chủ`,"proxy.routeDialog.noServers":`không gian làm việc này không có máy chủ nào`,"proxy.routeDialog.stoppedNote":`Máy chủ đã dừng thì không được định tuyến: dòng đó hiển thị “Không có upstream” cho đến khi nó chạy lại.`,"proxy.routeDialog.upstream":`Upstream`,"proxy.routeDialog.upstreamPlaceholder":`http://10.0.0.5:8080`,"proxy.routeDialog.upstreamHint":`Một địa chỉ cụ thể, bao gồm cả cổng. Phần scheme là không bắt buộc.`,"proxy.routeDialog.panelNote":`Phục vụ bảng điều khiển cần bật xác thực và một mật khẩu không phải mặc định — nếu không bảng điều khiển sẽ từ chối lưu.`,"proxy.routeDialog.save":`Lưu tuyến đường`,"proxy.routes.title":`Tuyến đường`,"proxy.routes.description":`Mỗi dịch vụ một hostname công khai. Một tuyến đường có thể trỏ tới máy chủ được giám sát trong bất kỳ không gian làm việc nào, tới bảng điều khiển này, hoặc tới một upstream cụ thể.`,"proxy.routes.add":`Thêm tuyến đường`,"proxy.routes.cannotSaveTitle":`Không thể lưu các tuyến đường này ở trạng thái hiện tại`,"proxy.routes.cannotRoute":`Không thể định tuyến {host}`,"proxy.routes.emptyTitle":`Chưa có tuyến đường nào`,"proxy.routes.emptyDescription":`Hãy thêm một tuyến đường để mở một máy chủ ra qua tên miền — engine tự lấy chứng chỉ.`,"proxy.routes.addFirst":`Thêm tuyến đường đầu tiên`,"proxy.routes.columnHostname":`Hostname`,"proxy.routes.columnTarget":`Đích`,"proxy.routes.columnUpstream":`Upstream`,"proxy.routes.columnTls":`TLS`,"proxy.routes.columnState":`Trạng thái`,"proxy.routes.columnOn":`Bật`,"proxy.routes.openInTab":`Mở {url} trong thẻ mới`,"proxy.routes.noHostname":`chưa có hostname`,"proxy.routes.toggle":`Tuyến đường {name}`,"proxy.routes.edit":`Sửa {name}`,"proxy.routes.remove":`Gỡ {name}`,"proxy.status.certified":`chứng chỉ đã sẵn sàng`,"proxy.status.localCa":`CA của engine`,"proxy.status.uploaded":`cặp đã tải lên`,"proxy.status.awaitingCa":`đang chờ CA`,"proxy.status.failed":`chứng chỉ thất bại`,"proxy.status.fellBack":`Đã quay về Local CA`,"proxy.status.serving":`Đang phục vụ`,"proxy.status.disabled":`Đã tắt`,"proxy.status.noUpstream":`Không có upstream`,"proxy.status.error":`Lỗi`,"proxy.status.unapplied":`Chưa được áp dụng`,"proxy.status.off":`Tắt`,"proxy.status.stopped":`Đã dừng`,"proxy.status.starting":`Đang khởi động`,"proxy.status.running":`Đang chạy`,"proxy.status.unsupported":`Không được hỗ trợ`,"proxy.target.server":`Một máy chủ được giám sát`,"proxy.target.panel":`Bảng điều khiển này`,"proxy.target.external":`Một upstream cụ thể`,"proxy.target.controlPanel":`bảng điều khiển`,"proxy.target.noServer":`chưa chọn máy chủ`,"proxy.target.noUpstream":`không có upstream`,"proxy.tls.auto":`Tự động — engine quyết định`,"proxy.tls.off":`Tắt — HTTP thuần`,"proxy.tls.manual":`Chứng chỉ đã tải lên`,"proxy.tls.plain":`HTTP thuần`,"proxy.tls.uploaded":`chứng chỉ đã tải lên`,"proxy.tls.letsEncrypt":`Let’s Encrypt`,"proxy.tls.engineCa":`CA của engine (cục bộ)`,"proxy.tls.hintOff":`HTTP thuần: không có chứng chỉ nào được phục vụ cho hostname này.`,"proxy.tls.hintManual":`Phục vụ cặp chứng chỉ được tải lên bên dưới.`,"proxy.tls.hintEmpty":`Hostname công khai sẽ nhận chứng chỉ ACME; tên chỉ dùng nội bộ sẽ nhận CA riêng của engine.`,"proxy.tls.hintPublic":`Đây là hostname công khai, nên engine sẽ hỏi một CA để lấy chứng chỉ — cần có email tài khoản ACME.`,"proxy.tls.hintLocal":`Đây là tên chỉ dùng nội bộ, nên engine tự ký bằng CA được tin cậy cục bộ của nó.`,"proxy.validation.labelRequired":`cần có nhãn`,"proxy.validation.idPattern":`id phải bắt đầu bằng chữ cái hoặc chữ số, sau đó là chữ cái, chữ số, gạch ngang hoặc gạch dưới`,"proxy.validation.hostRequired":`cần có hostname`,"proxy.validation.hostPattern":`hostname gồm chữ cái, chữ số, dấu chấm và gạch ngang, ví dụ home.example.com`,"proxy.validation.hostTaken":`"{host}" đã được định tuyến cho đường dẫn này`,"proxy.validation.pathSlash":`tiền tố đường dẫn bắt đầu bằng /`,"proxy.validation.pathSpace":`tiền tố đường dẫn không được chứa dấu cách`,"proxy.validation.idTaken":`id tuyến đường "{id}" bị dùng hai lần`,"proxy.validation.workspaceRequired":`hãy chọn không gian làm việc sở hữu máy chủ`,"proxy.validation.serverRequired":`hãy chọn một máy chủ trong không gian làm việc đó`,"proxy.validation.url":`upstream dạng như http://10.0.0.5:8080`,"proxy.view.title":`Proxy nghịch đảo`,"proxy.view.description":`Mở các máy chủ của bạn ra qua tên miền, với HTTPS tự động qua 80/443 hoặc thử thách DNS.`,"proxy.view.dnsNote":`Với DNS-01, hãy thêm nhà cung cấp DNS của tên miền vào bất kỳ không gian làm việc nào trong Cài đặt không gian làm việc → Dynamic DNS; sau đó một tuyến đường có thể chọn tài khoản đó, từ bất kỳ không gian làm việc nào.`,"proxy.view.readFailed":`Không đọc được proxy nghịch đảo`,"proxy.view.reading":`Đang đọc proxy nghịch đảo…`,"proxy.view.engineInstalled":`Đã cài engine`,"proxy.view.engineStarting":`Engine đang khởi động`,"proxy.view.engineStopping":`Engine đang dừng`,"proxy.view.configApplied":`Đã áp dụng cấu hình`,"proxy.view.configReverted":`Đã hoàn tác cấu hình`,"proxy.view.settingsSaved":`Đã lưu cài đặt.`,"proxy.view.settingsSavedToast":`Đã lưu cài đặt`,"proxy.view.retryFailed":`thử lại thất bại`,"proxy.view.retryAsked":`đang hỏi lại CA cho {host}`,"proxy.view.fieldChanged":`trường đã thay đổi`,"proxy.view.fieldsChanged":`trường đã thay đổi`,"proxy.view.noChanges":`Không có thay đổi chưa lưu`,"proxy.view.discard":`Bỏ thay đổi`,"proxy.view.save":`Lưu cài đặt`,"serverCard.open":`Mở {url}`,"serverCard.adoptedHint":`Tiến trình này tự thay thế chính nó: bảng điều khiển tiếp nhận tiến trình kế nhiệm thay vì khởi động thêm một bản sao. Nút Dừng vẫn hoạt động, đầu ra của nó vẫn ở nơi tiến trình kế nhiệm gửi tới.`,"serverCard.detached":`tách rời`,"serverCard.persistentHint":"Mục này chạy dưới nanny riêng, nên nó vẫn chạy khi bảng điều khiển dừng, khởi động lại hoặc bị kill. `home-hosted down` báo cáo nó thay vì dừng nó; chỉ lệnh dừng tường minh mới dừng được.","serverCard.persistent":`thường trú`,"serverCard.disabled":`đã tắt`,"serverCard.autostart":`tự khởi động`,"serverCard.healthProbe":`Dò tình trạng`,"serverCard.notProbed":`chưa dò`,"serverCard.restarts":`Số lần khởi động lại`,"serverCard.pid":`PID`,"serverCard.rss":`RSS`,"serverCard.procs":`Tiến trình`,"serverCard.portFree":`trống`,"serverCard.portInUse":`đang dùng`,"serverCard.uptime24h":`24 giờ hoạt động`,"serverCard.probe":`Kiểm tra`,"serverCard.crashes24h":`sự cố trong 24 giờ`,"serverCard.lastCrash":`Sự cố gần nhất`,"serverCard.unhealthyFor":`Bất thường trong {duration}`,"serverCard.nextAttempt":`Lần thử tiếp theo {when}`,"serverCard.start":`Khởi động`,"serverCard.stop":`Dừng`,"serverCard.restart":`Khởi động lại`,"serverCard.detailsHint":`Nhật ký trực tiếp và toàn bộ telemetry`,"serverCard.moreActions":`Thêm thao tác cho {label}`,"serverCard.disable":`Tắt máy chủ`,"serverCard.enable":`Bật máy chủ`,"serverCard.removeFromAutostart":`Bỏ khỏi tự khởi động`,"serverCard.autostartWithPanel":`Tự khởi động cùng bảng điều khiển`,"serverCard.clearLogBuffer":`Xoá bộ đệm nhật ký`,"serverCard.removeServer":`Gỡ máy chủ`,"serverCard.removeTitle":`Gỡ máy chủ này?`,"serverCard.removeDescription":`{label} sẽ bị gỡ khỏi servers.config.json: tiến trình của nó bị dừng, nhật ký và lịch sử sự cố của nó cũng bị xoá theo.`,"serverCard.statusField":`trạng thái`,"serverForm.workingDirectory":`Thư mục làm việc`,"serverForm.cwdHint":`Đường dẫn tương đối được giải theo projectDir.`,"serverForm.arguments":`Tham số`,"serverForm.portHint":`Để trống nghĩa là máy chủ không có cổng để kiểm tra hay preflight.`,"serverForm.bindAddress":`Địa chỉ lắng nghe`,"serverForm.autostart":`Tự khởi động cùng up`,"serverForm.autostartHint":`Khởi động nó mỗi khi control plane chạy lên.`,"serverForm.persistent":`Thường trú`,"serverForm.persistentHint":"Vẫn chạy khi bảng điều khiển dừng; `down` báo cáo nó thay vì dừng nó.","serverForm.envHint":`KEY=value mỗi dòng, được export cho tiến trình.`,"serverForm.dataEnvs":`Data env`,"serverForm.dataEnvsHint":`ENV=path mỗi dòng — được export cho tiến trình và tự động sao lưu.`,"serverForm.envFile":`Tệp env`,"serverForm.envFilePlaceholder":`tệp KEY=value không bắt buộc`,"serverForm.envFileHint":`Được nạp khi spawn; giá trị trong đó ghi đè env.`,"serverForm.dependsOn":`Phụ thuộc vào`,"serverForm.dependsOnHint":`Phân tách bằng dấu phẩy; được khởi động trước và chờ đến khi bình thường, dừng sau cùng.`,"serverForm.backupPaths":`Đường dẫn sao lưu thêm`,"serverForm.backupPathsHint":`Mỗi dòng một đường dẫn, cho phép placeholder; data env đã được sao lưu sẵn.`,"serverForm.backupIgnore":`Bỏ qua các tệp sinh tự động đã biết khi sao lưu mục này`,"serverForm.backupIgnoreHint":`Bỏ qua node_modules, dist, .next và các cache khác mà không bản khôi phục nào dùng tới.`,"serverForm.bootstrap":`Bootstrap`,"serverForm.bootstrapDescription":`Một lệnh chạy một lần trước lần khởi động đầu tiên — cài đặt, migration, tải xuống.`,"serverForm.runBootstrap":`Chạy một bootstrap`,"serverForm.bootstrapHint":`Tắt nghĩa là mục này không có bootstrap và khoá được gửi dưới dạng null.`,"serverForm.timeoutMs":`Thời gian chờ (ms)`,"serverForm.runOnce":`Chỉ một lần mỗi phiên`,"serverForm.runOnceHint":`Tắt nghĩa là mỗi lần khởi động đều chạy lại.`,"serverForm.bootstrapArgs":`Tham số bootstrap`,"serverForm.bootstrapArgsHint":`Mỗi dòng một tham số; placeholder giống tham số chính.`,"serverForm.bootstrapEnv":`Môi trường bootstrap`,"serverForm.bootstrapEnvHint":`KEY=value mỗi dòng, chỉ export cho tiến trình bootstrap.`,"serverForm.onPortConflict":`Khi trùng cổng`,"serverForm.logBufferLines":`Số dòng đệm nhật ký`,"serverForm.maxRssMb":`RSS tối đa (MB)`,"serverForm.maxRssHint":`Khởi động lại khi vượt mức này; để trống hoặc 0 là tắt.`,"serverForm.enabledHint":`Tắt vẫn giữ mục trong cấu hình nhưng từ chối khởi động nó.`,"settings.auth.policyTitle":`Chính sách truy cập`,"settings.auth.policyDescription":`Xác thực luôn được áp dụng, dù bảng điều khiển ở loopback hay được mở ra mạng.`,"settings.auth.requirePassword":`Yêu cầu mật khẩu`,"settings.auth.requirePasswordHint":`Mọi yêu cầu đều cần một phiên đã đăng nhập.`,"settings.auth.sessionLifetime":`Thời hạn phiên (ms)`,"settings.auth.sessionLifetimeHint":`Thời gian chờ không hoạt động: 604800000 là một tuần không có hoạt động. Mỗi yêu cầu đặt lại đồng hồ này.`,"settings.auth.cookieSecure":`Cookie Secure`,"settings.auth.cookieSecureAuto":`Tự động — chỉ qua HTTPS`,"settings.auth.cookieSecureAlways":`Luôn luôn`,"settings.auth.cookieSecureNever":`Không bao giờ — HTTP thuần`,"settings.auth.trustProxy":`Đứng sau proxy nghịch đảo`,"settings.auth.trustProxyOff":`Không — bỏ qua x-forwarded-*`,"settings.auth.trustProxyLoopback":`Có, chỉ từ máy này`,"settings.auth.trustProxyAny":`Có, từ mọi nguồn gọi`,"settings.auth.trustProxyHint":`Tin x-forwarded-* cho địa chỉ và giao thức của client. 'Chỉ từ máy này' là lựa chọn an toàn cho proxy trên cùng máy. 'Từ mọi nguồn gọi' tin vào header do chính người gọi gửi, nên việc khoá đăng nhập sẽ đếm theo địa chỉ giả và có thể bị vượt qua.`,"settings.auth.maxLoginAttempts":`Số lần đăng nhập tối đa`,"settings.auth.maxLoginAttemptsHint":`Số lần thất bại trước khi bị khoá tạm thời.`,"settings.auth.lockout":`Thời gian khoá (ms)`,"settings.auth.apiTokenSet":`Đã đặt API token`,"settings.auth.apiTokenMissing":`Chưa có API token`,"settings.auth.apiTokenNote":`Script có thể gọi API bằng {code} thay vì đăng nhập.`,"settings.auth.noTokenNote":`Với script shell và agent, hãy tạo một cái bằng {command}.`,"settings.auth.defaultPasswordTitle":`Mật khẩu mặc định vẫn đang được dùng`,"settings.auth.defaultPasswordText":`Hãy đặt mật khẩu riêng ở bên dưới. Việc bind ra ngoài {address} vẫn bị từ chối cho đến khi bạn làm vậy.`,"settings.auth.blockedTitle":`Listener này đang bị từ chối`,"settings.auth.noPasswordTitle":`Xác thực đang bật nhưng chưa đặt mật khẩu`,"settings.auth.noPasswordText":`Thực tế vẫn chưa có gì được yêu cầu, và việc bind ra ngoài {address} vẫn bị từ chối cho đến khi có mật khẩu.`,"settings.auth.exposedTitle":`Truy cập được từ ngoài 127.0.0.1`,"settings.auth.exposedText":`Hãy giữ mật khẩu mạnh, hoặc đặt một proxy kết thúc TLS phía trước bảng điều khiển.`,"settings.auth.changePassword":`Đổi mật khẩu`,"settings.auth.setPassword":`Đặt mật khẩu`,"settings.auth.passwordDescription":`Được lưu dưới dạng hash scrypt trong tệp bí mật, không bao giờ trong cấu hình.`,"settings.auth.currentPassword":`Mật khẩu hiện tại`,"settings.auth.newPassword":`Mật khẩu mới`,"settings.auth.repeatPassword":`Nhập lại mật khẩu mới`,"settings.auth.passwordMismatch":`Hai mật khẩu không khớp.`,"settings.auth.updatePassword":`Cập nhật mật khẩu`,"settings.auth.setPasswordAndEnable":`Đặt mật khẩu và bật xác thực`,"settings.auth.clearPassword":`Xoá mật khẩu`,"settings.auth.clearPasswordConfirm":`Xác nhận xoá`,"settings.auth.clearPasswordTitle":`Xoá mật khẩu?`,"settings.auth.clearPasswordHint":`Xác thực sẽ bị tắt theo, và bất kỳ ai truy cập được bảng điều khiển đều vào thẳng.`,"settings.auth.shortPasswordTitle":`Đó là một mật khẩu ngắn`,"settings.auth.shortPasswordText":`Vẫn được chấp nhận, nhưng mật khẩu dài hơn là thứ duy nhất đứng giữa mạng và bảng điều khiển này.`,"settings.auth.passwordUpdated":`Đã cập nhật mật khẩu. Các phiên khác đã bị đăng xuất.`,"settings.auth.passwordCleared":`Đã xoá mật khẩu và tắt xác thực.`,"settings.backup.createTitle":`Tạo bản sao lưu`,"settings.backup.createDescription":`Chọn những gì bản lưu này sẽ ghi lại. Không có gì được ghi cho đến khi bạn tạo nó.`,"settings.backup.chooseItems":`Chọn các mục`,"settings.backup.partialCapture":`Chỉ những mục được chọn mới được ghi lại.`,"settings.backup.withoutGlobalSettings":`Nếu không có cài đặt toàn cục, bản khôi phục chỉ có thể đặt một không gian làm việc ở nơi bảng điều khiển đích đã khai báo nó.`,"settings.backup.password":`Mật khẩu (không bắt buộc)`,"settings.backup.passwordHint":`Mã hoá bản lưu; khi khôi phục sẽ hỏi đúng mật khẩu đó.`,"settings.backup.create":`Tạo bản sao lưu`,"settings.backup.chooseItemsFor":`{label} — chọn các mục`,"settings.backup.subDescription":`Một không gian làm việc có thể được lưu toàn bộ hoặc chỉ phần cài đặt, máy chủ, bí mật và các đường dẫn dữ liệu đã khai báo.`,"settings.backup.selectedOf":`đã chọn {selected} trên {total}`,"settings.backup.nothingSelectable":`Không gian làm việc này chưa khai báo gì có thể chọn.`,"settings.backup.apply":`Áp dụng`,"settings.backup.created":`Đã tạo bản sao lưu.`,"settings.backup.leafSettingsHint":`Mặc định máy chủ, thời gian giữ nhật ký và thông báo`,"settings.backup.leafServersHint":`Mọi mục trong servers.config.json`,"settings.backup.leafSecretsHint":`Token bot Telegram và thông tin đăng nhập DDNS`,"settings.backup.leafDataHint":`Một đường dẫn dữ liệu đã khai báo`,"settings.backup.pathFromOrigin":`{path} — từ {origin}`,"settings.backup.entrySettingsHint":`Listener, xác thực, thông tin máy chủ và chính sách sao lưu`,"settings.backup.entrySecretsHint":`Hash mật khẩu và hash API token`,"settings.backup.entryTlsHint":`Cặp chứng chỉ của chính bảng điều khiển`,"settings.backup.entryWorkspaceHint":`Cài đặt, máy chủ, bí mật và các đường dẫn dữ liệu đã khai báo của nó`,"settings.backup.entryGlobalSettings":`Cài đặt toàn cục`,"settings.backup.entryGlobalSecrets":`Bí mật toàn cục (mật khẩu, API token)`,"settings.backup.entryTlsCertificate":`Chứng chỉ TLS`,"settings.backup.leafSettings":`Cài đặt`,"settings.backup.leafServers":`Máy chủ`,"settings.backup.leafSecrets":`Bí mật`,"settings.backup.restoreItemLabel":`{workspace}: {item}`,"settings.backup.noteMissing":`chưa tồn tại`,"settings.backup.noteCovered":`được bao phủ bởi {path}`,"settings.backup.noteAlreadyDeclared":`đã được khai báo bởi {origin}`,"settings.backup.noteContainsBackupDir":`chứa thư mục sao lưu`,"settings.backup.noteUnknownWorkspace":`không gian làm việc không rõ`,"settings.backup.noteMissingFromArchive":`không có trong tệp lưu trữ`,"settings.backup.noteDeclaredByBackup":`được khai báo bởi cấu hình của bản sao lưu, mà bản này không khôi phục`,"settings.backup.noteNotDeclared":`không được khai báo bởi cấu hình này, cũng không bởi bản sao lưu`,"settings.backup.noteRestoredFrom":`được khôi phục từ {path}`,"settings.backups.policyTitle":`Chính sách`,"settings.backups.policyDescription":`Số bản lưu bảng điều khiển giữ lại, và các đường dẫn thêm mà mọi bản lưu đều ghi lại.`,"settings.backups.allow":`Cho phép sao lưu`,"settings.backups.allowHint":`Tắt sẽ dừng tạo bản lưu mới; những gì đã có trên đĩa vẫn tải về và khôi phục được.`,"settings.backups.offTitle":`Sao lưu đang tắt`,"settings.backups.offText":`Không có bản lưu mới nào được tạo cho đến khi bật lại. Các bản lưu bên dưới vẫn tải về, khôi phục và xoá được.`,"settings.backups.keep":`Giữ lại`,"settings.backups.keepHint":`Các bản lưu cũ hơn bị dọn sau mỗi lần sao lưu.`,"settings.backups.extraPaths":`Đường dẫn thêm`,"settings.backups.extraPathsHint":`Phân tách bằng dấu phẩy, được ghi trong mọi bản lưu ngoài những gì mỗi không gian làm việc khai báo.`,"settings.backups.extraPathsPlaceholder":`{home}/myapp-data`,"settings.backups.archiveDirectory":`Thư mục lưu trữ`,"settings.backups.copyArchiveDirectory":`Sao chép thư mục lưu trữ`,"settings.backups.changeDirectory":`Đổi nó là quyết định ở mức tệp: hãy sửa {path}.`,"settings.backups.theSettingsFile":`tệp cài đặt`,"settings.backups.capturesTitle":`Bản sao lưu ghi lại những gì`,"settings.backups.capturesDescription":`Chọn những mục này trong hộp thoại tạo. Một không gian làm việc có thể được lấy toàn bộ hoặc chỉ phần cài đặt, máy chủ, bí mật và các đường dẫn dữ liệu đã khai báo.`,"settings.backups.nothingSelectable":`Chưa có gì có thể chọn.`,"settings.backups.fromOrigin":`từ {origin}`,"settings.backups.notCaptured":`không được ghi lại`,"settings.backups.generatedSkipped":`đã bỏ qua các thư mục sinh tự động`,"settings.backups.included":`đã bao gồm`,"settings.backups.skipped":`đã bỏ qua`,"settings.backups.workspacesNote":`Bảng điều khiển này phục vụ {count} không gian làm việc; mỗi không gian làm việc là một mục có thể chọn riêng.`,"settings.backups.archivesTitle":`Bản lưu trữ`,"settings.backups.archivesDescription":`Được lưu trong thư mục sao lưu và có thể tải về bất cứ lúc nào.`,"settings.backups.create":`Tạo bản sao lưu…`,"settings.backups.restore":`Khôi phục…`,"settings.backups.noArchives":`Chưa có bản lưu nào`,"settings.backups.noArchivesEnabled":`Hãy tạo ngay một bản để ghi lại bảng điều khiển và những không gian làm việc bạn chọn.`,"settings.backups.noArchivesDisabled":`Chưa có gì được lưu trữ, và sao lưu đang tắt.`,"settings.backups.encrypted":`đã mã hoá`,"settings.backups.download":`Tải về`,"settings.backups.restoreAction":`Khôi phục`,"settings.backups.confirmDelete":`Xác nhận xoá`,"settings.backups.deleted":`Đã xoá {name}.`,"settings.backups.kindSettings":`cài đặt`,"settings.backups.kindServers":`máy chủ`,"settings.backups.kindSecrets":`bí mật`,"settings.backups.kindTls":`tls`,"settings.backups.kindData":`dữ liệu`,"settings.backups.kindWorkspace":`không gian làm việc`,"settings.ddns.statePending":`Đang chờ`,"settings.ddns.stateOk":`Đã cập nhật`,"settings.ddns.stateUnchanged":`Hiện tại`,"settings.ddns.stateSkipped":`Đã bỏ qua`,"settings.ddns.stateError":`Thất bại`,"settings.ddns.passFinished":`Lượt cập nhật Dynamic DNS đã xong`,"settings.ddns.credentialsSaved":`Đã lưu thông tin đăng nhập cho {account}`,"settings.ddns.credentialsRemoved":`Đã gỡ thông tin đăng nhập của {account}`,"settings.ddns.loadErrorTitle":`Không tải được cài đặt Dynamic DNS`,"settings.ddns.title":`Dynamic DNS`,"settings.ddns.description":`Giữ các hostname này trỏ về địa chỉ công khai của máy này. Thông tin đăng nhập nằm trong tệp bí mật, không bao giờ trong servers.config.json.`,"settings.ddns.checking":`đang kiểm tra`,"settings.ddns.needsAttention":`cần chú ý`,"settings.ddns.watching":`đang theo dõi`,"settings.ddns.updateNow":`Cập nhật ngay`,"settings.ddns.enabled":`Giữ Dynamic DNS luôn được cập nhật`,"settings.ddns.enabledHint":`Một lượt chạy theo khoảng thời gian bên dưới; nhà cung cấp chỉ được gọi khi địa chỉ thực sự thay đổi.`,"settings.ddns.interval":`Kiểm tra mỗi (ms)`,"settings.ddns.intervalHint":`60000 là một phút; mặc định là năm phút.`,"settings.ddns.ttl":`TTL (giây)`,"settings.ddns.ttlHint":`1 nghĩa là tự động ở nơi nhà cung cấp hỗ trợ.`,"settings.ddns.detectIpv4":`Phát hiện IPv4`,"settings.ddns.detectIpv4Hint":`Cần cho bản ghi A.`,"settings.ddns.detectIpv6":`Phát hiện IPv6`,"settings.ddns.detectIpv6Hint":`Cần cho bản ghi AAAA.`,"settings.ddns.accountsTitle":`Tài khoản nhà cung cấp`,"settings.ddns.accountsDescription":`Mỗi API token một mục. Thông tin đăng nhập được lưu trên máy chủ và không bao giờ trả về.`,"settings.ddns.credentialsSet":`đã lưu thông tin đăng nhập`,"settings.ddns.noCredentials":`chưa có thông tin đăng nhập`,"settings.ddns.credentials":`Thông tin đăng nhập`,"settings.ddns.removeAccountBlocked":`Hãy gỡ các hostname đang dùng tài khoản này trước`,"settings.ddns.noAccounts":`Chưa có tài khoản nào. Hãy chọn một nhà cung cấp và thêm tài khoản.`,"settings.ddns.provider":`Nhà cung cấp`,"settings.ddns.accountId":`Id tài khoản`,"settings.ddns.accountIdPlaceholder":`cloudflare-home`,"settings.ddns.accountIdHint":"Id tài khoản đặt tên cho tài khoản và là khoá lưu thông tin đăng nhập; chữ thường, chữ số, `-` và `_`.","settings.ddns.hostnamesTitle":`Hostname`,"settings.ddns.hostnamesDescription":`Toàn bộ danh sách cần giữ cập nhật — suba.domain.com, domain.xyz, v.v.`,"settings.ddns.account":`Tài khoản`,"settings.ddns.recordA":`A (IPv4)`,"settings.ddns.recordAaaa":`AAAA (IPv6)`,"settings.ddns.aaaaUnsupported":`Nhà cung cấp này không quản lý được bản ghi AAAA.`,"settings.ddns.proxied":`Qua proxy`,"settings.ddns.proxiedHint":`Cloudflare phục vụ bản ghi này qua mạng của chính nó.`,"settings.ddns.ipv6Off":`Phát hiện IPv6 đang tắt`,"settings.ddns.advanced":`Nâng cao`,"settings.ddns.advancedHint":`tên miền đã đăng ký và ghi đè TTL`,"settings.ddns.registeredDomain":`Tên miền đã đăng ký`,"settings.ddns.registeredDomainPlaceholder":`example.co.uk`,"settings.ddns.registeredDomainHint":`Chỉ dùng khi cần cho nhà cung cấp biết tên miền gốc, ví dụ tên miền ba nhãn.`,"settings.ddns.ttlOverride":`Ghi đè TTL (giây)`,"settings.ddns.ttlOverrideHint":`Để trống là dùng giá trị bên trên.`,"settings.ddns.noHostnames":`Chưa có hostname nào.`,"settings.ddns.hostnamePlaceholder":`home.example.com`,"settings.ddns.lastPass":`Lượt gần nhất`,"settings.ddns.ipv4Value":`IPv4 {address}`,"settings.ddns.ipv6Value":`IPv6 {address}`,"settings.ddns.type":`Loại`,"settings.ddns.state":`Trạng thái`,"settings.ddns.address":`Địa chỉ`,"settings.ddns.detail":`Chi tiết`,"settings.ddns.credentialsTitle":`Thông tin đăng nhập nhà cung cấp`,"settings.ddns.credentialsDescription":`Các trường đã lưu không bao giờ được gửi trả lại. Lưu sẽ thay thế toàn bộ trường của tài khoản này và chạy một lượt ngay lập tức.`,"settings.ddns.optional":`Không bắt buộc.`,"settings.ddns.whereToGet":`Lấy những thứ này ở đâu`,"settings.ddns.forget":`Quên`,"settings.ddns.forgetConfirm":`Quên chúng`,"settings.ddns.forgetTitle":`Quên thông tin đăng nhập đã lưu?`,"settings.ddns.forgetHint":`Chúng bị xoá khỏi đĩa và không đọc lại được; bạn sẽ phải dán lại.`,"settings.ddns.saveCredentials":`Lưu thông tin đăng nhập`,"settings.defaults.title":`Mặc định máy chủ`,"settings.defaults.description":`Áp dụng cho mọi mục không tự đặt giá trị riêng.`,"settings.defaults.enabledHint":`Mục mới bắt đầu ở trạng thái bật.`,"settings.defaults.autostart":`Tự khởi động cùng bảng điều khiển`,"settings.defaults.bind":`Lắng nghe trên`,"settings.defaults.bindLocal":`Local — 127.0.0.1`,"settings.defaults.bindLan":`LAN — 0.0.0.0`,"settings.defaults.onPortConflict":`Khi trùng cổng`,"settings.defaults.conflictBlock":`Chặn việc khởi động`,"settings.defaults.conflictWarn":`Cảnh báo và vẫn khởi động`,"settings.defaults.conflictFollow":`Bám theo bản khởi động lại tách rời của chính nó`,"settings.defaults.conflictReclaim":`Thay bản khởi động lại tách rời bằng một bản sao được giám sát`,"settings.defaults.conflictKill":`Kill bất cứ thứ gì đang giữ cổng`,"settings.defaults.logBufferLines":`Số dòng đệm nhật ký`,"settings.defaults.logBufferLinesHint":`Được giữ trong bộ nhớ cho mỗi máy chủ.`,"settings.host.title":`Ngưỡng`,"settings.host.description":`Ngưỡng 0 sẽ tắt cảnh báo đó. Khi vượt ngưỡng sẽ thông báo một lần, và một lần nữa khi hồi phục.`,"settings.host.enabled":`Lấy mẫu máy này`,"settings.host.enabledHint":`Tải, bộ nhớ, swap, đĩa và nhiệt độ CPU, theo khoảng thời gian bên dưới.`,"settings.host.interval":`Khoảng thời gian (ms)`,"settings.host.intervalHint":`Tần suất lấy mẫu máy chủ và kiểm tra cảnh báo.`,"settings.host.diskPaths":`Đường dẫn đĩa`,"settings.host.diskPathsHint":`Phân tách bằng dấu phẩy; các mẫu như {home} được mở rộng.`,"settings.host.diskUsed":`Đĩa đã dùng (%)`,"settings.host.memoryUsed":`Bộ nhớ đã dùng (%)`,"settings.host.swapUsed":`Swap đã dùng (%)`,"settings.host.zeroDisables":`0 sẽ tắt cảnh báo.`,"settings.host.loadPerCpu":`Tải trên mỗi CPU`,"settings.host.loadPerCpuHint":`Tải trung bình 1 phút chia cho số nhân.`,"settings.host.tempCelsius":`Nhiệt độ CPU (°C)`,"settings.host.tempCelsiusHint":`Chỉ trên Linux; bị bỏ qua ở nơi hệ điều hành không cung cấp.`,"settings.host.breachingNow":`Đang vượt ngưỡng:`,"settings.host.nothingBreaching":`Hiện không có gì vượt ngưỡng.`,"settings.interface.title":`Giao diện`,"settings.interface.description":`Bảng điều khiển là một trang tĩnh: giữ bản mặc định, hoặc phục vụ bản build của riêng bạn từ thư mục state.`,"settings.interface.currentlyServing":`Đang phục vụ`,"settings.interface.copyDirectory":`Sao chép thư mục UI`,"settings.interface.fileCount":`{count} tệp`,"settings.interface.sourceStock":`mặc định`,"settings.interface.sourceCustom":`tuỳ chỉnh`,"settings.interface.unnamed":`chưa đặt tên`,"settings.interface.panelVersion":`Phiên bản bảng điều khiển`,"settings.interface.copyPanelVersion":`Sao chép phiên bản bảng điều khiển`,"settings.interface.panelVersionHint":`Bản phát hành mà tiến trình bảng điều khiển này đang chạy — {command} in ra cùng con số đó.`,"settings.interface.panelName":`Tên bảng điều khiển`,"settings.interface.panelNameHint":`Được UI mặc định hiển thị ở thanh bên. UI tuỳ chỉnh có thể hiển thị tên riêng.`,"settings.interface.uploadLabel":`Tải lên bản build UI (.zip có index.html)`,"settings.interface.docsHint":`Xem {docs} để biết hợp đồng API. Nếu UI tuỳ chỉnh làm hỏng bảng điều khiển, {command} sẽ đưa bản mặc định trở lại từ terminal.`,"settings.interface.resetName":`Đặt lại tên`,"settings.interface.confirmRevert":`Xác nhận hoàn tác`,"settings.interface.revertToStock":`Quay về bản mặc định`,"settings.interface.install":`Cài đặt UI`,"settings.interface.installed":`Đã thay UI bằng {name} — hãy tải lại trang`,"settings.interface.yourBuild":`bản build của bạn`,"settings.interface.restored":`đã khôi phục UI mặc định — hãy tải lại trang`,"settings.interface.nothingInstalled":`chưa cài UI tuỳ chỉnh nào`,"settings.listener.title":`Bộ lắng nghe`,"settings.listener.description":`Nơi bảng điều khiển trả lời. Thay đổi đây sẽ khởi động lại bảng điều khiển và đưa trang này tới địa chỉ mới.`,"settings.listener.port":`Cổng điều khiển`,"settings.listener.portHint":`Mặc định 3999.`,"settings.listener.bind":`Lắng nghe trên`,"settings.listener.bindLocal":`Nội bộ`,"settings.listener.bindLan":`Mạng LAN`,"settings.listener.bindCustom":`Tuỳ chỉnh`,"settings.listener.bindLanHint":`0.0.0.0 — truy cập được từ toàn bộ mạng.`,"settings.listener.bindLocalHint":`127.0.0.1 — chỉ máy này.`,"settings.listener.bindCustomHint":`Một địa chỉ giao diện cụ thể do bạn nhập bên dưới.`,"settings.listener.ipv4":`Địa chỉ IPv4`,"settings.listener.ipv4Placeholder":`192.168.1.20`,"settings.listener.ipv4Error":`Hãy nhập một địa chỉ IPv4, ví dụ 192.168.1.20.`,"settings.listener.ipv4Hint":`Bind ra ngoài 127.0.0.1 cần một mật khẩu thật.`,"settings.listener.openBrowser":`Mở trình duyệt khi bảng điều khiển chạy lên`,"settings.listener.liveAddress":`Địa chỉ đang hoạt động`,"settings.listener.restartRequired":`cần khởi động lại`,"settings.listener.copyLiveAddress":`Sao chép địa chỉ đang hoạt động`,"settings.listener.liveAddressHint":`Địa chỉ listener đang bind hiện tại; thay đổi đã lưu có hiệu lực sau khi bảng điều khiển bind lại.`,"settings.logs.title":`Thời gian giữ`,"settings.logs.description":`Chế độ xem trực tiếp luôn lấy từ bộ nhớ; các tệp này tồn tại qua lần khởi động lại và nuôi trang Nhật ký.`,"settings.logs.persist":`Giữ nhật ký trên đĩa`,"settings.logs.persistHint":`Tắt để chỉ giữ mọi thứ trong bộ nhớ.`,"settings.logs.maxBytes":`Xoay vòng khi (byte)`,"settings.logs.maxBytesHint":`Mỗi máy chủ, trước khi chuyển sang .1, .2, …`,"settings.logs.keep":`Giữ các tệp đã xoay vòng`,"settings.logs.directory":`Thư mục nhật ký`,"settings.logs.copyDirectory":`Sao chép thư mục nhật ký`,"settings.logs.browseHint":`Duyệt và tải các tệp này ở trang {logs}.`,"settings.paths.dataRoot":`Thư mục gốc dữ liệu`,"settings.paths.dataRootHint":`HHOSTED_HOME — cài đặt toàn cục, không gian làm việc, TLS, bản sao lưu và UI.`,"settings.paths.globalSettings":`Cài đặt toàn cục`,"settings.paths.globalSettingsHint":`settings.json — listener, xác thực, chính sách TLS, thông tin máy chủ, sao lưu.`,"settings.paths.projectDir":`Thư mục dự án`,"settings.paths.projectDirHint":`Cơ sở cho các đường dẫn mục tương đối.`,"settings.paths.panelAddress":`Địa chỉ bảng điều khiển`,"settings.paths.panelAddressHint":`Nơi bảng điều khiển này đang hoạt động.`,"settings.paths.serversConfig":`Cấu hình máy chủ`,"settings.paths.serversConfigHint":`servers.config.json của {label}.`,"settings.paths.workspaceSettings":`Cài đặt không gian làm việc`,"settings.paths.workspaceSettingsHint":`Mặc định máy chủ, thời gian giữ nhật ký, thông báo, DDNS.`,"settings.paths.logs":`Nhật ký`,"settings.paths.logsHint":`Đầu ra được lưu cho không gian làm việc này.`,"settings.paths.copyPath":`Sao chép {label}`,"settings.paths.whereThingsLive":`Mọi thứ nằm ở đâu`,"settings.paths.whereThingsLiveDescription":`Chỉ đọc. Sao chép đường dẫn thẳng vào shell hoặc trình soạn thảo.`,"settings.paths.workspaceFiles":`Tệp của không gian làm việc`,"settings.paths.workspaceFilesDescription":`Mỗi không gian làm việc sở hữu cấu hình, cài đặt và thư mục nhật ký của riêng nó; không có gì được chia sẻ giữa chúng.`,"settings.rebind.failed":`Bảng điều khiển không trả lời tại {target}. Hãy xem console để biết listener mới.`,"settings.restore.title":`Khôi phục bản sao lưu`,"settings.restore.description":`Không có gì được ghi cho đến khi kế hoạch được áp dụng.`,"settings.restore.archive":`Bản lưu trữ`,"settings.restore.archiveHint":`Một bản lưu đã có, hoặc một tệp .zip từ máy này.`,"settings.restore.encryptedName":`{name} — đã mã hoá`,"settings.restore.uploadOption":`Tải lên một tệp…`,"settings.restore.archiveFile":`Tệp lưu trữ (.zip)`,"settings.restore.unchangedTitle":`Chưa có gì thay đổi`,"settings.restore.archiveLine":`Bản lưu trữ {name}.`,"settings.restore.uploadedArchive":`Bản lưu trữ đã tải lên.`,"settings.restore.passwordProtected":`Bản sao lưu này được bảo vệ bằng mật khẩu.`,"settings.restore.password":`Mật khẩu`,"settings.restore.checkAgain":`Kiểm tra lại với mật khẩu`,"settings.restore.choosePrompt":`Chọn những gì cần khôi phục — đã chọn {selected} trên {total}.`,"settings.restore.willRestore":`Sẽ khôi phục: {items}.`,"settings.restore.skipped":`Đã bỏ qua: {items}.`,"settings.restore.nothing":`không có gì`,"settings.restore.restartNote":`Cài đặt của chính bảng điều khiển khác đi, nên hãy khởi động lại bảng điều khiển sau đó.`,"settings.restore.reloadedNote":`Các không gian làm việc được khôi phục sẽ tải lại ngay; những mục được đánh dấu tự khởi động sẽ tự chạy.`,"settings.restore.applyStored":`Áp dụng bản khôi phục này`,"settings.restore.applyUpload":`Khôi phục tệp đã tải lên`,"settings.restore.restored":`Đã khôi phục {count} mục.`,"settings.restore.restoredWithNotes":`Đã khôi phục {count} mục — {notes}.`,"settings.restore.noteReloaded":`các máy chủ đã khôi phục đang chạy, các mục tự khởi động đang được khởi động`,"settings.restore.noteRestart":`khởi động lại bảng điều khiển để áp dụng cài đặt của chính nó`,"settings.restore.reasonSymbolicLink":`liên kết tượng trưng, đã bỏ qua`,"settings.restore.reasonNotSelected":`không được chọn`,"settings.restore.reasonUnrestorable":`không thể khôi phục ở đây`,"settings.restore.reasonInvalidSettings":`cài đặt trong tệp lưu trữ không hợp lệ`,"settings.restore.reasonInvalidServers":`máy chủ trong tệp lưu trữ không hợp lệ`,"settings.shell.noUnsavedChanges":`Không có thay đổi chưa lưu`,"settings.shell.discard":`Bỏ thay đổi`,"settings.shell.save":`Lưu cài đặt`,"settings.shell.unsavedTitle":`Thay đổi chưa lưu`,"settings.shell.nothingToSave":`Không có gì để lưu.`,"settings.telegram.title":`Telegram`,"settings.telegram.description":`Chính sách nằm trong cấu hình; token bot là một secret và không bao giờ được máy chủ trả về.`,"settings.telegram.enabled":`Gửi thông báo`,"settings.telegram.enabledHint":`Mỗi sự kiện một tin nhắn, được điều tiết bởi thời gian chờ bên dưới.`,"settings.telegram.chatId":`Id chat`,"settings.telegram.chatIdPlaceholder":`123456789 hoặc @channel`,"settings.telegram.chatIdHint":`Dùng Detect chats để điền từ các cập nhật của bot.`,"settings.telegram.cooldown":`Thời gian chờ mỗi sự kiện (ms)`,"settings.telegram.cooldownHint":`Theo từng máy chủ và lý do, nên một máy chủ dao động liên tục không thể spam.`,"settings.telegram.onCrash":`Đã hết số lần thử`,"settings.telegram.onUnhealthy":`Cổng bất thường`,"settings.telegram.onForcedRestart":`Buộc khởi động lại`,"settings.telegram.onRecovered":`Đã hồi phục`,"settings.telegram.onHost":`Chỉ số máy chủ vượt ngưỡng`,"settings.telegram.onHostHint":`Đĩa, bộ nhớ, swap, tải và nhiệt độ CPU, theo các ngưỡng trong mục Chỉ số máy chủ.`,"settings.telegram.onDdns":`Dynamic DNS thay đổi hoặc thất bại`,"settings.telegram.onDdnsHint":`Một tin nhắn cho mỗi lượt có thay đổi bản ghi, và một tin cho lượt thất bại.`,"settings.telegram.botToken":`Token bot`,"settings.telegram.tokenSet":`đã đặt token`,"settings.telegram.noToken":`chưa có token`,"settings.telegram.tokenNote":`Lấy từ @BotFather — là secret, không bao giờ nằm trong servers.config.json.`,"settings.telegram.tokenPlaceholder":`123456789:AA…`,"settings.telegram.tokenSavedPlaceholder":`Đã lưu — nhập token mới để thay thế`,"settings.telegram.saveToken":`Lưu token`,"settings.telegram.detectChats":`Phát hiện chat`,"settings.telegram.sendTest":`Gửi thử`,"settings.telegram.removeToken":`Gỡ token`,"settings.telegram.removeTokenConfirm":`Xác nhận gỡ`,"settings.telegram.removeTokenTitle":`Gỡ token bot?`,"settings.telegram.removeTokenHint":`Thông báo sẽ dừng cho đến khi bạn dán token trở lại.`,"settings.telegram.tokenSaved":`Đã lưu token.`,"settings.telegram.tokenSavedFor":`Đã lưu token cho @{username}.`,"settings.telegram.tokenRemoved":`Đã gỡ token.`,"settings.telegram.noChats":`Không tìm thấy chat nào. Hãy gửi /start cho bot trước, rồi phát hiện lại.`,"settings.telegram.testSent":`Đã gửi tin nhắn thử.`,"settings.telegram.testFailed":`Gửi tin nhắn thử thất bại.`,"settings.telegram.chatsSeen":`Các chat bot đã thấy:`,"settings.telegram.lastSend":`Lần gửi gần nhất: {result}`,"settings.tls.title":`HTTPS`,"settings.tls.description":`Tải lên một cặp PEM và bảng điều khiển sẽ phục vụ TLS trên listener của chính nó. Chứng chỉ tự ký là ổn trong mạng gia đình.`,"settings.tls.serve":`Phục vụ bảng điều khiển qua HTTPS`,"settings.tls.serveHint":`Được lưu cùng nút Lưu cài đặt; bảng điều khiển bind lại và trang này đi theo nó.`,"settings.tls.certificateTitle":`Chứng chỉ`,"settings.tls.certificateDescription":`Chứng chỉ mã hoá PEM và khoá riêng của nó. Cả hai đều nằm trong tệp bí mật.`,"settings.tls.unusableTitle":`Không dùng được chứng chỉ đã lưu`,"settings.tls.subject":`Chủ thể`,"settings.tls.issuer":`Nhà phát hành`,"settings.tls.validUntil":`Có hiệu lực đến`,"settings.tls.days":`{count} ngày`,"settings.tls.privateKey":`Khoá riêng`,"settings.tls.keyMatches":`khớp với chứng chỉ`,"settings.tls.keyMismatch":`không khớp`,"settings.tls.fingerprint":`Vân tay`,"settings.tls.copyFingerprint":`Sao chép vân tay`,"settings.tls.noCertificateTitle":`Chưa tải lên chứng chỉ`,"settings.tls.noCertificateText":`Hãy tải lên chứng chỉ PEM và khoá bên dưới, rồi lưu. HTTPS không được phục vụ cho đến khi có chứng chỉ.`,"settings.tls.certFile":`Tệp chứng chỉ (.pem, .crt)`,"settings.tls.keyFile":`Tệp khoá riêng (.pem, .key)`,"settings.tls.pasteCertificate":`Hoặc dán chứng chỉ`,"settings.tls.pasteKey":`Hoặc dán khoá riêng`,"settings.tls.saveCertificate":`Lưu chứng chỉ`,"settings.tls.removeCertificate":`Gỡ chứng chỉ`,"settings.tls.confirmRemove":`Xác nhận gỡ`,"settings.tls.removeTitle":`Gỡ chứng chỉ?`,"settings.tls.removeHint":`TLS vẫn bật nhưng không có gì để phục vụ, nên bảng điều khiển quay về http sau khi listener bind lại.`,"settings.tls.stored":`Đã lưu chứng chỉ.`,"settings.tls.removed":`Đã gỡ chứng chỉ.`,"status.stopped":`Đã dừng`,"status.starting":`Đang khởi động`,"status.running":`Đang chạy`,"status.stopping":`Đang dừng`,"status.backoff":`Đang khởi động lại`,"status.crashed":`Đã gặp sự cố`,"status.conflict":`Xung đột cổng`,"theme.label":`Giao diện: {theme}`,"theme.light":`sáng`,"theme.dark":`tối`,"theme.system":`theo hệ thống`,"topbar.search":`Tìm kiếm hoặc chạy lệnh`,"topbar.openNavigation":`Mở điều hướng`,"topbar.commandPalette":`Bảng lệnh`,"topbar.account":`Tài khoản`,"topbar.signedIn":`Đã đăng nhập`,"topbar.signOut":`Đăng xuất`,"topbar.workspaceLabel":`Không gian làm việc: {name}`,"validation.port":`Cổng phải là số nguyên từ 1 đến 65535.`,"validation.idRequired":`Cần có id — đó là khoá mà máy chủ này nằm dưới.`,"validation.idPattern":`Id phải bắt đầu bằng chữ thường hoặc chữ số và chỉ chứa chữ thường, chữ số, dấu gạch ngang và gạch dưới.`,"validation.commandRequired":`Cần có command — tệp thực thi mà supervisor spawn.`,"validation.bootstrapCommand":`Bootstrap cần có lệnh để chạy.`,"views.actions.addAServer":`Thêm một máy chủ`,"views.actions.addServer":`Thêm máy chủ`,"views.actions.startAll":`Khởi động tất cả`,"views.actions.stopAll":`Dừng tất cả`,"views.common.thisWorkspace":`không gian làm việc này`,"views.globalOverview.configError":`Không đọc được cấu hình: {error}`,"views.globalOverview.degraded":`suy giảm`,"views.globalOverview.description":`Chỉ số máy chủ và mọi máy chủ của mọi không gian làm việc, nhóm theo nơi chúng nằm.`,"views.globalOverview.emptyDescription":`Hãy chọn một không gian làm việc ở thanh trên và thêm tiến trình đầu tiên cần được giữ chạy.`,"views.globalOverview.emptyTitle":`Chưa có máy chủ nào ở bất kỳ đâu`,"views.globalOverview.groupEmptyDescription":`Hãy thêm một cái, nó sẽ xuất hiện ở đây và trên trang không gian làm việc.`,"views.globalOverview.groupRunning":`{running}/{total} đang chạy`,"views.globalOverview.hostUptime":`Thời gian hoạt động của máy chủ`,"views.globalOverview.hostVitals":`Chỉ số máy chủ`,"views.globalOverview.hostVitalsNote":`Máy này, được mọi không gian làm việc chia sẻ.`,"views.globalOverview.openWorkspace":`Mở không gian làm việc`,"views.globalOverview.panelUptime":`Thời gian hoạt động của bảng điều khiển`,"views.globalOverview.samplingOff":`đã tắt lấy mẫu`,"views.globalOverview.samplingOn":`đang lấy mẫu`,"views.globalOverview.serversTotal":`tổng cộng {count} máy chủ`,"views.globalOverview.serving":`đang phục vụ`,"views.globalOverview.workspaces":`Không gian làm việc`,"views.globalSettings.authenticationDescription":`Ai được đăng nhập vào bảng điều khiển này, và cách một phiên được tin cậy.`,"views.globalSettings.backupsDescription":`Mỗi lần lưu một bản lưu trữ, bao gồm bảng điều khiển và bất kỳ không gian làm việc bạn chọn.`,"views.globalSettings.changesDescription":`Những gì nút Lưu sẽ ghi vào tệp cài đặt của bảng điều khiển.`,"views.globalSettings.description":`Listener, truy cập, thông tin máy chủ, sao lưu, TLS và đường dẫn cho bảng điều khiển này — được mọi không gian làm việc chia sẻ.`,"views.globalSettings.hostDescription":`Ngưỡng cảnh báo cho tài nguyên của chính máy này.`,"views.globalSettings.interfaceDescription":`Phục vụ UI bảng điều khiển của riêng bạn thay vì bản mặc định.`,"views.globalSettings.languageDescription":`Ngôn ngữ hiển thị của bảng điều khiển này, cho trình duyệt này.`,"views.globalSettings.languageNote":`Lựa chọn của bạn được giữ trong trình duyệt này và áp dụng cả cho trang đăng nhập. Nó không thay đổi đầu ra nhật ký hay thông báo API của chính bảng điều khiển.`,"views.globalSettings.listenerDescription":`Nơi bảng điều khiển lắng nghe và cách nó tự công bố.`,"views.globalSettings.loadErrorTitle":`Không tải được một số giá trị chỉ có trong tệp`,"views.globalSettings.navLabel":`Các mục cài đặt toàn cục`,"views.globalSettings.pathsDescription":`Nơi home-hosted lưu các tệp của nó, toàn cục và theo từng không gian làm việc.`,"views.globalSettings.saveFailed":`Không lưu được cài đặt.`,"views.globalSettings.saved":`Đã lưu cài đặt.`,"views.globalSettings.savedRebinding":`Đã lưu cài đặt — bảng điều khiển đang chuyển sang địa chỉ mới.`,"views.globalSettings.savedToast":`Đã lưu cài đặt`,"views.globalSettings.sectionAuthentication":`Xác thực`,"views.globalSettings.sectionBackups":`Sao lưu`,"views.globalSettings.sectionHost":`Chỉ số máy chủ`,"views.globalSettings.sectionInterface":`Giao diện`,"views.globalSettings.sectionListener":`Bộ lắng nghe`,"views.globalSettings.sectionPaths":`Đường dẫn`,"views.globalSettings.sectionTls":`TLS`,"views.globalSettings.title":`Cài đặt toàn cục`,"views.globalSettings.tlsDescription":`Phục vụ bảng điều khiển qua HTTPS bằng chứng chỉ của riêng bạn.`,"views.logs.allStreams":`Mọi luồng`,"views.logs.clear":`Xoá`,"views.logs.clearDescription":`{server} — tệp trên đĩa bị cắt ngắn. Tiến trình vẫn chạy và các dòng mới được ghi từ đây trở đi.`,"views.logs.clearFile":`Xoá tệp`,"views.logs.clearNote":`Hãy tải về trước nếu vẫn cần đầu ra — thao tác này không thể hoàn tác từ bảng điều khiển.`,"views.logs.clearTitle":`Xoá tệp nhật ký đã lưu?`,"views.logs.fileEmpty":`Tệp đã lưu đang trống.`,"views.logs.loadedLines":`đã nạp {count} dòng`,"views.logs.modeLive":`Luồng trực tiếp`,"views.logs.modePersisted":`Đã lưu`,"views.logs.noServersDescription":`Hãy thêm một cái, đầu ra của nó sẽ được lưu ở đây.`,"views.logs.noServersTitle":`Không có máy chủ`,"views.logs.nothingOnDisk":`Không có gì trên đĩa cho máy chủ này — tính năng lưu đang tắt, hoặc nó chưa ghi gì.`,"views.logs.nothingPersisted":`không có gì được lưu`,"views.logs.persistedSummary":`{workspace} · {persisted} trên {total} máy chủ có trên đĩa · {size}`,"views.logs.persistedTitle":`Nhật ký đã lưu`,"views.logs.pickServerDescription":`Đầu ra đã lưu và luồng trực tiếp là theo từng máy chủ. Hãy chọn một cái trong danh sách.`,"views.logs.pickServerTitle":`Chọn một máy chủ`,"views.logs.reload":`Tải lại`,"views.logs.retentionNote":`Việc xoay vòng và thời gian giữ được đặt trong Cài đặt không gian làm việc → Nhật ký.`,"views.logs.searchAria":`Tìm trong nhật ký`,"views.logs.searchPlaceholder":`tìm trong cửa sổ đuôi`,"views.logs.searchedLines":`đã tìm trong {count} dòng`,"views.logs.streamAria":`Luồng`,"views.logs.tailAria":`Kích thước đuôi`,"views.logs.waitingOutput":`Đã kết nối — đang chờ đầu ra.`,"views.overview.acrossTree":`trên toàn bộ cây`,"views.overview.cpuNow":`{value}% cpu hiện tại`,"views.overview.crashedOrUnhealthy":`sự cố hoặc bất thường`,"views.overview.description":`Trạng thái trực tiếp của mọi máy chủ trong không gian làm việc này, được làm mới qua một luồng sự kiện duy nhất.`,"views.overview.emptyDescription":`Hãy thêm tiến trình đầu tiên mà không gian làm việc này cần giữ chạy.`,"views.overview.emptyTitle":`Không gian làm việc này không có máy chủ nào`,"views.overview.enabled":`{count} đang bật`,"views.overview.longestUptime":`Hoạt động lâu nhất`,"views.overview.needsAttention":`Cần chú ý`,"views.overview.notUp":`{count} không hoạt động`,"views.overview.nothingBroken":`không có gì hỏng`,"views.overview.nothingRunning":`không có gì đang chạy`,"views.overview.openFullList":`Mở danh sách đầy đủ`,"views.overview.peak":`đỉnh {value}`,"views.overview.processMemory":`Bộ nhớ tiến trình`,"views.overview.recentActivity":`Hoạt động gần đây`,"views.overview.running":`Đang chạy`,"views.overview.sampling":`lịch sử tài nguyên được lấy mẫu mỗi 5 giây và giữ trong phiên này`,"views.overview.stopped":`Đã dừng`,"views.overview.workspaceLabel":`không gian làm việc {id}`,"views.route.server":`Máy chủ`,"views.serverDetail.allServers":`Mọi máy chủ`,"views.serverDetail.autostart":`Tự khởi động cùng bảng điều khiển`,"views.serverDetail.backToServers":`Quay lại danh sách máy chủ`,"views.serverDetail.bind":`lắng nghe trên`,"views.serverDetail.bindCustom":`{bind} — tuỳ chỉnh`,"views.serverDetail.bindLan":`0.0.0.0 — mọi giao diện`,"views.serverDetail.bindLocal":`127.0.0.1 — chỉ máy này`,"views.serverDetail.closeEditor":`Đóng trình soạn thảo`,"views.serverDetail.copyJson":`Sao chép cấu hình JSON`,"views.serverDetail.crashes24":`sự cố trong 24 giờ`,"views.serverDetail.dependencies":`Phụ thuộc`,"views.serverDetail.detached":`tách rời`,"views.serverDetail.detachedHint":`Tiến trình này tự thay thế chính nó: bảng điều khiển tiếp nhận tiến trình kế nhiệm thay vì khởi động thêm một bản sao. Nút Dừng vẫn hoạt động, đầu ra của nó vẫn ở nơi tiến trình kế nhiệm gửi tới.`,"views.serverDetail.disableServer":`Tắt máy chủ`,"views.serverDetail.editHint":`Sửa mọi trường của mục này`,"views.serverDetail.effectiveConfig":`Cấu hình hiệu lực`,"views.serverDetail.effectiveConfigNote":`Giá trị mặc định từ Cài đặt đã được hợp nhất vào các giá trị này.`,"views.serverDetail.enableServer":`Bật máy chủ`,"views.serverDetail.eventHistory":`Lịch sử sự kiện`,"views.serverDetail.eventHistoryNote":`Được bảng điều khiển giữ trong 24 giờ.`,"views.serverDetail.fieldArgs":`args`,"views.serverDetail.fieldBackupPaths":`đường dẫn sao lưu`,"views.serverDetail.fieldBootstrap":`bootstrap`,"views.serverDetail.fieldCommand":`command`,"views.serverDetail.fieldCwd":`cwd`,"views.serverDetail.fieldDataEnvs":`data envs`,"views.serverDetail.fieldDependsOn":`phụ thuộc vào`,"views.serverDetail.fieldEnv":`env`,"views.serverDetail.fieldEnvFile":`tệp env`,"views.serverDetail.fieldHealth":`tình trạng`,"views.serverDetail.fieldLogBuffer":`bộ đệm nhật ký`,"views.serverDetail.fieldOnPortConflict":`khi trùng cổng`,"views.serverDetail.fieldPortBind":`cổng · bind`,"views.serverDetail.fieldRestart":`khởi động lại`,"views.serverDetail.fieldRssLimit":`giới hạn RSS`,"views.serverDetail.fieldStop":`dừng`,"views.serverDetail.fields":`Trường`,"views.serverDetail.goneDescription":`{id} không còn trong servers.config.json nữa. Nó có thể đã bị gỡ từ một thẻ khác.`,"views.serverDetail.goneTitle":`Máy chủ đó đã biến mất`,"views.serverDetail.health":`Tình trạng`,"views.serverDetail.healthProbe":`Dò tình trạng`,"views.serverDetail.lastCrash":`Sự cố gần nhất`,"views.serverDetail.lastProbe":`Lần dò gần nhất`,"views.serverDetail.logBufferLines":`{count} dòng`,"views.serverDetail.memoryRss":`Bộ nhớ (RSS)`,"views.serverDetail.moreActions":`Thêm thao tác cho {label}`,"views.serverDetail.neverWritten":`Máy chủ này chưa ghi gì cả.`,"views.serverDetail.nextAttempt":`Lần thử tiếp theo`,"views.serverDetail.none":`không có`,"views.serverDetail.off":`tắt`,"views.serverDetail.persistent":`thường trú`,"views.serverDetail.persistentHint":"Mục này chạy dưới nanny riêng, nên nó vẫn chạy khi bảng điều khiển dừng, khởi động lại hoặc bị kill. `home-hosted down` báo cáo nó thay vì dừng nó; chỉ nút Dừng mới làm được.","views.serverDetail.pid":`PID`,"views.serverDetail.portFree":`trống`,"views.serverDetail.portInUse":`đang dùng`,"views.serverDetail.portState":`Trạng thái cổng`,"views.serverDetail.probeFailed":`Phép dò tình trạng chưa đạt.`,"views.serverDetail.probeFailedFor":`Phép dò tình trạng chưa đạt trong {duration}.`,"views.serverDetail.processes":`Tiến trình`,"views.serverDetail.rawJson":`JSON thô`,"views.serverDetail.removeAutostart":`Bỏ khỏi tự khởi động`,"views.serverDetail.removeDescription":`{label} sẽ bị gỡ khỏi servers.config.json: tiến trình của nó bị dừng, nhật ký và lịch sử sự cố của nó cũng bị xoá theo.`,"views.serverDetail.removeNote":`Thao tác này không thể hoàn tác từ bảng điều khiển — mục đó phải được thêm lại bằng tay hoặc từ một bản sao lưu.`,"views.serverDetail.removeServer":`Gỡ máy chủ`,"views.serverDetail.removeTitle":`Gỡ máy chủ này?`,"views.serverDetail.restart":`Khởi động lại`,"views.serverDetail.restarts":`Số lần khởi động lại`,"views.serverDetail.sectionConfig":`Cấu hình`,"views.serverDetail.sectionHistory":`Lịch sử`,"views.serverDetail.sectionOutput":`Đầu ra trực tiếp`,"views.serverDetail.start":`Khởi động`,"views.serverDetail.startsOnItsOwn":`Tự khởi động. Thêm id trong {code} để sắp nó sau các máy chủ khác.`,"views.serverDetail.stop":`Dừng`,"views.serverDetail.telemetry":`Đo từ xa`,"views.serverDetail.telemetryNote":`Được lấy mẫu mỗi 5 giây khi trang này mở.`,"views.serverDetail.unhealthyFor":`Bất thường trong`,"views.serverDetail.uptime24":`Hoạt động 24 giờ`,"views.serverDetail.waitingFirstLine":`Đang chờ dòng đầu tiên…`,"views.servers.clearFilter":`Xoá bộ lọc`,"views.servers.clearFilters":`Xoá các bộ lọc`,"views.servers.description":`Mọi mục trong servers.config.json của {workspace}, kèm tài nguyên trực tiếp, tình trạng và lịch sử.`,"views.servers.emptyDescription":`Hãy thêm tiến trình đầu tiên mà bảng điều khiển này cần giám sát. Command, args, env và thư mục làm việc của nó đều nằm trong tệp cấu hình.`,"views.servers.emptyTitle":`Chưa cấu hình máy chủ nào`,"views.servers.filterAll":`Tất cả`,"views.servers.filterAria":`Lọc máy chủ`,"views.servers.filterAttention":`Cần chú ý`,"views.servers.filterDisabled":`Đã tắt`,"views.servers.filterPlaceholder":`Lọc theo id, nhãn, command hoặc cổng`,"views.servers.filterRunning":`Đang chạy`,"views.servers.filterStopped":`Đã dừng`,"views.servers.noMatchDescription":`Hãy thử trạng thái khác hoặc xoá tìm kiếm.`,"views.servers.noMatchTitle":`Không có gì khớp với bộ lọc đó`,"views.settings.changesDescription":`Những gì nút Lưu sẽ ghi vào cài đặt của {workspace}.`,"views.settings.configErrorNote":`Bảng điều khiển tiếp tục giám sát với cấu hình nó đã có; sửa tệp sẽ tự động nạp lại.`,"views.settings.configErrorTitle":`Không đọc được cấu hình của không gian làm việc`,"views.settings.configWarningTitle":`Cấu hình của không gian làm việc này có cảnh báo`,"views.settings.ddnsDescription":`Giữ các hostname luôn trỏ về địa chỉ công khai của máy này, bất kể nhà đăng ký nào đang giữ chúng.`,"views.settings.defaultsDescription":`Áp dụng cho mọi mục trong không gian làm việc này không tự đặt giá trị riêng.`,"views.settings.description":`Mặc định máy chủ, thời gian giữ nhật ký, thông báo và dynamic DNS cho {workspace}.`,"views.settings.logsDescription":`Không gian làm việc này giữ bao nhiêu đầu ra trên đĩa và trong bao lâu.`,"views.settings.navLabel":`Các mục cài đặt không gian làm việc`,"views.settings.notificationsDescription":`Cảnh báo sự cố và tình trạng cho không gian làm việc này, gửi tới một chat Telegram.`,"views.settings.saveFailed":`Không lưu được cài đặt.`,"views.settings.saved":`Đã lưu cài đặt không gian làm việc.`,"views.settings.savedToast":`Đã lưu cài đặt không gian làm việc`,"views.settings.sectionDdns":`Dynamic DNS`,"views.settings.sectionDefaults":`Mặc định máy chủ`,"views.settings.sectionLogs":`Nhật ký`,"views.settings.sectionNotifications":`Thông báo`,"workspace.new":`Không gian làm việc mới`,"workspace.rename":`Đổi tên không gian làm việc`,"workspace.create":`Tạo không gian làm việc`,"workspace.renameAction":`Đổi tên`,"workspace.createHint":`Có cài đặt, máy chủ, nhật ký, bí mật và bản sao lưu riêng — do chính bảng điều khiển này phục vụ.`,"workspace.renameHint":`Chỉ tên thay đổi; id không gian làm việc giữ nguyên nên URL và đường dẫn vẫn hoạt động.`,"workspace.nameHint":`Hiển thị ở thanh trên.`,"workspace.nameHintId":`Hiển thị ở thanh trên. Id: {id}`,"workspace.none":`Không có không gian làm việc`,"workspace.delete":`Xoá không gian làm việc`,"days.remaining":{other:`{count} ngày`},"editor.unsaved":{one:`thay đổi chưa lưu`,other:`thay đổi chưa lưu`},"editor.saveChanges":{one:`Lưu {count} thay đổi`,other:`Lưu {count} thay đổi`},"logs.lines":{other:`{count} dòng`},"palette.results":{other:`{count} kết quả`},"proxy.retry.inMinutes":{one:`~{count} phút`,other:`~{count} phút`},"proxy.retry.inHours":{one:`~{count} giờ`,other:`~{count} giờ`},"servers.total":{other:`{count} máy chủ`},"servers.running":{other:`{count} đang chạy`},"settings.backup.entriesCount":{one:`{count} mục`,other:`{count} mục`},"settings.backup.itemsSelected":{one:`đã chọn {count} mục`,other:`đã chọn {count} mục`},"settings.ddns.hostnameCount":{one:`{count} hostname`,other:`{count} hostname`},"settings.shell.fieldsChanged":{one:`trường đã thay đổi`,other:`trường đã thay đổi`},"settings.shell.saveChanges":{one:`Lưu {count} thay đổi`,other:`Lưu {count} thay đổi`},"views.globalOverview.needLook":{one:`{count} máy chủ cần xem xét`,other:`{count} máy chủ cần xem xét`},"views.logs.filesOnDisk":{one:`{count} tệp`,other:`{count} tệp`},"views.overview.needLook":{one:`{count} máy chủ cần xem xét`,other:`{count} máy chủ cần xem xét`}};export{e as default};
|