mirror of
https://hubproxy.babadafafafafa.cn/https://github.com/1Panel-dev/1Panel.git
synced 2026-09-20 08:03:55 +08:00
630 lines
52 KiB
YAML
630 lines
52 KiB
YAML
# базовые ошибки
|
||
ErrInvalidParams: 'Неверный запрос: {{ .detail }}'
|
||
ErrMcpGatewayArgsParse: 'Неверный формат пользовательских аргументов MCP'
|
||
ErrMcpGatewayArgsConflict: 'Аргумент {{ .name }} управляется 1Panel и не может быть задан в пользовательских аргументах'
|
||
ErrTokenParse: 'Ошибка токена: {{ .detail }}'
|
||
ErrInitialPassword: 'Исходный пароль неверен'
|
||
ErrInternalServer: 'Внутренняя ошибка: {{ .detail }}'
|
||
ErrRecordExist: 'Запись уже существует'
|
||
ErrRecordNotFound: 'Запись не найдена'
|
||
WafLogExport: 'Экспорт журналов WAF'
|
||
MonitorLogExport: 'Экспорт журналов мониторинга веб-сайтов'
|
||
LogExportNoData: 'Нет журналов, соответствующих выбранным фильтрам'
|
||
LogExportDiskSpace: 'Доступно менее 1 GiB; экспорт остановлен'
|
||
LogExportRetentionInvalid: 'Срок хранения истории экспорта должен быть от 1 до 30 дней'
|
||
ErrStructTransform: 'Ошибка преобразования: {{ .err }}'
|
||
ErrNotSupportType: 'Тип не поддерживается: {{ .name }}'
|
||
|
||
# файловый AI
|
||
ErrFileAINotEnabled: 'Поиск с AI в файлах выключен или не выбран аккаунт. В управлении файлами откройте «AI-аккаунт», включите и выберите аккаунт.'
|
||
ErrFileAISearchBadPattern: 'Недопустимый шаблон поиска (regex и т.п.): {{ .detail }}'
|
||
FileAISearchEmptyDir: 'В этом пути нет файлов или каталогов для отображения (или все отфильтрованы).'
|
||
|
||
# удаленная загрузка
|
||
ErrWgetRemoteFailed: 'Неверный или недоступный URL удалённой загрузки: {{ .detail }}'
|
||
ErrWgetInvalidContentType: 'Удалённый сервер вернул не файл (возможно, страницу ошибки), {{ .detail }}'
|
||
ErrWgetProxyNotConfigured: 'Сначала настройте прокси-сервер в настройках панели'
|
||
ErrWgetProxyInvalid: 'Недопустимый адрес прокси-сервера: {{ .detail }}'
|
||
|
||
# вход и безопасность
|
||
ErrNotLogin: 'Не авторизован: {{ .detail }}'
|
||
ErrPasswordExpired: 'Пароль истёк: {{ .detail }}'
|
||
|
||
# запрос и API
|
||
ErrProxy: 'Запрос не удался: {{ .detail }}'
|
||
ErrApiConfigStatusInvalid: 'API отключено: {{ .detail }}'
|
||
ErrApiConfigKeyInvalid: 'Неверный API-ключ: {{ .detail }}'
|
||
ErrApiConfigIPInvalid: 'IP не в списке: {{ .detail }}'
|
||
ErrApiConfigDisable: 'Доступ по API запрещён: {{ .detail }}'
|
||
ErrApiConfigKeyTimeInvalid: 'Неверная метка времени: {{ .detail }}'
|
||
ErrCreateHttpClient: 'Не удалось создать запрос {{ .err }}'
|
||
ErrHttpReqTimeOut: 'Истекло время ожидания запроса {{ .err }}'
|
||
ErrHttpReqFailed: 'Запрос не выполнен {{ .err }}'
|
||
ErrNoSuchHost: 'Не удалось найти запрошенный сервер {{ .err }}'
|
||
ErrHttpReqNotFound: 'Запрошенный ресурс {{ .err }} не найден'
|
||
|
||
# быстрый переход
|
||
ErrMinQuickJump: 'Добавьте хотя бы одну быструю ссылку'
|
||
ErrMaxQuickJump: 'Не более 4 быстрых ссылок'
|
||
|
||
# общее
|
||
ErrShutDown: 'Команда остановлена вручную'
|
||
ErrUsernameIsExist: 'Имя пользователя занято'
|
||
ErrNameIsExist: 'Имя уже занято'
|
||
ErrDemoEnvironment: 'Недоступно в демо'
|
||
ErrCmdTimeout: 'Команда завершилась по тайм-ауту'
|
||
ErrCmdIllegal: 'Команда содержит недопустимые символы'
|
||
ErrPortExist: 'Порт {{ .port }} занят {{ .type }} [{{ .name }}]'
|
||
TYPE_APP: 'Приложение'
|
||
TYPE_RUNTIME: 'Среда выполнения'
|
||
TYPE_DOMAIN: 'Доменное имя'
|
||
ErrTypePort: 'Формат порта {{ .name }} неверен'
|
||
ErrTypePortRange: 'Диапазон портов должен быть в пределах 1-65535'
|
||
Success: 'Успех'
|
||
Failed: 'Не удалось'
|
||
SystemRestart: 'Задача прервана из-за перезапуска системы'
|
||
ErrGroupIsDefault: 'Группа по умолчанию, не может быть удалена'
|
||
ErrGroupIsInWebsiteUse: 'Группа используется другим веб-сайтом и не может быть удалена.'
|
||
Decrypt: 'Расшифровать'
|
||
|
||
# агент
|
||
ErrAgentAccountBound: 'Акаунт привязан к агенту'
|
||
ErrTerminalAIAccountInUse: 'Эта учетная запись модели сейчас используется Terminal AI. Смените учетную запись в настройках Terminal AI или отключите Terminal AI и повторите попытку.'
|
||
ErrAgentAccountUnavailable: 'Связь с аккаунтом недоступна: {{ .err }}'
|
||
ErrAgentProviderNotSupported: 'Провайдер агента не поддерживается'
|
||
ErrAgentAccountRequired: 'Выберите аккаунт агента'
|
||
ErrAgentAccountNotVerified: 'Аккаунт не подтверждён'
|
||
ErrAgentAccountModelsRequired: 'Настройте хотя бы одну модель'
|
||
ErrAgentAccountSingleInitialModel: 'При создании аккаунта можно указать только одну начальную модель'
|
||
ErrAgentModelNotInAccount: 'Модель не настроена в выбранном аккаунте'
|
||
ErrAgentFallbackModelDuplicate: 'Резервные модели не могут дублироваться'
|
||
ErrAgentFallbackModelPrimary: 'Резервная модель не может совпадать с основной'
|
||
ErrAgentModelInUse: 'Эта модель всё ещё используется агентом: {{ .name }}'
|
||
ErrAgentBaseURLRequired: 'Нужен базовый URL'
|
||
ErrAgentApiKeyRequired: 'Нужен API-ключ'
|
||
ErrAgentComposeRequired: 'Нужен compose'
|
||
ErrAgentIDRequired: 'Нужен ID агента'
|
||
ErrAgentAccountIDRequired: 'Нужен ID аккаунта'
|
||
ErrAgentLimitReached: 'Community Edition поддерживает до {{ .max }} AI-агентов. Обновитесь до Business Edition, чтобы использовать их без ограничений'
|
||
ErrAgentWebsiteBound: 'Этот агент уже связан с сайтом'
|
||
ErrAgentWebsiteTypeUnsupported: 'Можно связывать только proxy- или static-сайты'
|
||
ErrAgentWebsiteInUse: 'Этот сайт уже связан с другим агентом'
|
||
ErrAgentWebsiteUnbindUnsupported: 'Сайты one-click deployment нельзя отвязать вручную'
|
||
ErrHermesPairingCodeUnavailable: 'Код сопряжения временно недоступен в Hermes, возможно из-за проблем с сетью. Повторите попытку позже.'
|
||
ErrHermesFeishuGroupAllowlistRequiresAllowlist: 'Когда групповая политика Feishu — белый список, политика личных сообщений не может быть кодом сопряжения.'
|
||
|
||
# резервное копирование и настройки оповещений
|
||
Localhost: 'Локальная машина'
|
||
ErrBackupInUsed: 'Аккаунт бэкапа занят задачей'
|
||
ErrBackupCheck: 'Проверка подключения не удалась: {{ .err }}'
|
||
ErrBackupLocalDelete: 'Нельзя удалить локальные бэкапы'
|
||
ErrBackupLocalCreate: 'Нельзя создать локальные бэкапы'
|
||
ErrAlertConfigInUse: 'Конфигурация оповещений используется и не может быть удалена'
|
||
ErrAlertConfigPhoneExist: 'Номер телефона уже существует'
|
||
|
||
# приложение
|
||
ErrPortInUsed: '{{ .detail }} порт уже занят'
|
||
ErrAppLimit: 'Количество установленных приложений превысило лимит'
|
||
ErrNotInstall: 'Приложение не установлено'
|
||
ErrPortInOtherApp: 'Порт {{ .port }} уже занят приложением {{ .apps }}'
|
||
ErrDbUserNotValid: 'Существующая база данных, имя пользователя и пароль не совпадают'
|
||
ErrUpdateBuWebsite: 'Приложение успешно обновлено, но изменение файла конфигурации веб-сайта не удалось. Пожалуйста, проверьте конфигурацию'
|
||
Err1PanelNetworkFailed: 'Создание сети контейнеров по умолчанию не удалось {{ .detail }}'
|
||
ErrFileParse: 'Ошибка анализа файла docker-compose приложения'
|
||
ErrInstallDirNotFound: 'Каталог установки не существует. Если вам необходимо удалить, выберите Принудительное удаление.'
|
||
AppStoreIsUpToDate: 'В магазине приложений уже установлена последняя версия'
|
||
LocalAppVersionNull: 'Приложение {{ .name }} не синхронизировано с версией Невозможно добавить в список приложений.'
|
||
LocalAppVersionErr: 'Синхронизация версии {{ .version }} {{ .name }} не удалась {{ .err }}'
|
||
ErrFileNotFound: 'Файл {{ .name }} не существует'
|
||
ErrFileParseApp: '{{ .name }} анализ файла не удался {{ .err }}'
|
||
ErrAppDirNull: 'Папка версии не существует'
|
||
LocalAppErr: 'Синхронизация приложения {{ .name }} не удалась {{ .err }}'
|
||
ErrContainerName: 'Имя контейнера уже существует'
|
||
ErrContainerNotFound: 'Контейнер {{ .name }} не существует'
|
||
ErrContainerMsg: 'Контейнер {{ .name }} ненормален. Подробности смотрите в журнале на странице контейнера.'
|
||
ErrAppBackup: '{{ .name }} резервное копирование приложения не удалось {{ .err }}'
|
||
ErrVersionTooLow: 'Текущая версия 1Panel слишком низкая для обновления App Store. Пожалуйста, обновите версию перед началом работы.'
|
||
ErrAppNameExist: 'Имя приложения уже существует'
|
||
ErrAppInstallNameExist: 'Имя установки приложения {{ .name }} уже существует'
|
||
AppStoreIsSyncing: 'App Store синхронизируется, повторите попытку позже'
|
||
ErrGetCompose: 'Не удалось получить файл docker-compose.yml {{ .detail }}'
|
||
ErrAppWarn: 'Ненормальное состояние, проверьте журнал'
|
||
ErrAppParamKey: 'Поле параметра {{ .name }} ненормально'
|
||
ErrAppUpgrade: 'Обновление приложения {{ .name }} не удалось {{ .err }}'
|
||
AppRecover: 'Откатить приложение {{ .name }}'
|
||
PullImageStart: 'Начать извлечение изображения [{{ .name }}]'
|
||
PullImageSuccess: 'Изображение извлечено успешно'
|
||
AppStoreSyncSuccess: 'Синхронизация с App Store прошла успешно'
|
||
SyncAppDetail: 'Синхронизировать конфигурацию приложения'
|
||
AppVersionNotMatch: 'Приложению {{ .name }} требуется более высокая версия 1Panel, синхронизация пропускается'
|
||
MoveSiteDir: 'Обнаружено изменение каталога сайта. Необходимо перенести каталог сайта OpenResty в {{ .name }}'
|
||
MoveSiteDirSuccess: 'Успешная миграция каталога веб-сайта'
|
||
DeleteRuntimePHP: 'Удалить среду выполнения PHP'
|
||
CustomAppStoreFileValid: 'Пакеты магазина приложений должны быть в формате.tar.gz'
|
||
PullImageTimeout: 'Истекло время ожидания извлечения изображения. Попробуйте увеличить ускорение изображения или выбрать другое ускорение изображения'
|
||
ErrAppIsDown: '{{ .name }} статус приложения ненормальный, проверьте'
|
||
ErrCustomApps: 'Установлено приложение. Сначала удалите его'
|
||
ErrCustomRuntimes: 'Установлена среда выполнения. Сначала удалите ее'
|
||
ErrAppVersionDeprecated: 'Приложение {{ .name }} несовместимо с текущей версией 1Panel, пропущено'
|
||
ErrDockerFailed: 'Состояние Docker аномально, проверьте состояние сервиса'
|
||
ErrDockerComposeCmdNotFound: 'Команда Docker Compose отсутствует, пожалуйста, установите эту команду на хост-машине сначала'
|
||
UseExistImage: 'Образ уже существует, используется существующий образ'
|
||
ErrDatabaseNotFound: 'База данных {{ .name }} не существует'
|
||
|
||
# SSH
|
||
ExportIP: 'IP входа'
|
||
ExportArea: 'Местоположение'
|
||
ExportPort: 'Порт'
|
||
ExportAuthMode: 'Способ входа'
|
||
ExportUser: 'Пользователь'
|
||
ExportStatus: 'Статус входа'
|
||
ExportDate: 'Время'
|
||
|
||
# файл
|
||
ErrFileCanNotRead: 'Этот файл не поддерживает предварительный просмотр'
|
||
ErrSensitiveFileRead: 'Чтение конфиденциальных файлов запрещено'
|
||
ErrFileToLarge: 'Файл больше 10 МБ и не может быть открыт'
|
||
ErrPathNotFound: 'Каталог не существует'
|
||
ErrMovePathFailed: 'Целевой путь не может содержать исходный путь'
|
||
ErrLinkPathNotFound: 'Целевой путь не существует'
|
||
ErrFileIsExist: 'Файл или папка уже существует'
|
||
ErrFileUpload: '{{ .name }} не удалось загрузить файл {{ .detail }}'
|
||
ErrFileDownloadDir: 'Папка загрузки не поддерживается'
|
||
ErrFileSharePath: 'Неверный путь или цель не является файлом'
|
||
ErrFileShareInvalid: 'Недействительная или просроченная ссылка'
|
||
ErrFileShareExpired: 'Срок действия ссылки истёк'
|
||
ErrFileSharePassword: 'Неверный пароль доступа'
|
||
ErrFileShareExhausted: 'Лимит скачиваний по этой ссылке исчерпан'
|
||
ErrFileSharePasswordPolicy: 'Пароль должен содержать не менее 4 символов'
|
||
ErrFileShareRateLimit: 'Слишком много запросов, попробуйте позже'
|
||
ErrCmdNotFound: 'Команда {{ .name }} не существует, сначала установите эту команду на хосте'
|
||
ErrSourcePathNotFound: 'Исходный каталог не существует'
|
||
ErrFavoriteExist: 'Этот путь уже добавлен в избранное'
|
||
ErrInvalidChar: 'Недопустимые символы не допускаются'
|
||
ErrPathNotDelete: 'Выбранный каталог не может быть удален'
|
||
ErrLogFileToLarge: 'Файл журнала превышает 500MB и не может быть открыт'
|
||
FileDropFailed: 'Не удалось очистить файл {{ .name }}: {{ .err }}'
|
||
FileDropSuccess: 'Файл {{ .name }} успешно очищен, удалено {{ .count }} файлов, освобождено {{ .size }} дискового пространства'
|
||
FileDropSum: 'Очистка файлов завершена успешно, всего удалено {{ .count }} файлов, освобождено {{ .size }} дискового пространства'
|
||
ErrBadDecrypt: 'Ошибка пароля расшифровки сжатого пакета, распаковка не удалась, проверьте и повторите попытку'
|
||
|
||
# сайт
|
||
ErrAliasIsExist: 'Псевдоним уже существует'
|
||
ErrBackupMatch: 'Файл резервной копии не соответствует некоторым текущим данным веб-сайта {{ .detail }}'
|
||
ErrBackupExist: 'Соответствующая часть исходных данных в файле резервной копии не существует {{ .detail }}'
|
||
ErrPHPResource: 'Локальная операционная среда не поддерживает переключение'
|
||
ErrPathPermission: 'В каталоге index обнаружена папка с разрешениями, отличными от 1000:1000, что может привести к ошибке Отказано в доступе на веб-сайте. Пожалуйста, нажмите кнопку Сохранить выше.'
|
||
ErrDomainIsUsed: 'Доменное имя уже используется веб-сайтом [{{ .name }}]'
|
||
ErrDomainFormat: 'Неверный формат доменного имени {{ .name }}'
|
||
ErrDefaultAlias: 'по умолчанию зарезервирован код, используйте другой код'
|
||
ErrParentWebsite: 'Сначала вам необходимо удалить дочерний сайт {{ .name }}'
|
||
ErrBuildDirNotFound: 'Каталог сборки не существует'
|
||
ErrImageNotExist: 'Образ операционной среды {{ .name }} не существует, пожалуйста, отредактируйте операционную среду заново'
|
||
ErrProxyIsUsed: 'Балансировка нагрузки используется обратным прокси, невозможно удалить'
|
||
ErrSSLValid: 'Файл сертификата аномален, проверьте статус сертификата'
|
||
ErrWebsiteDir: 'Пожалуйста, выберите директорию внутри директории сайта.'
|
||
ErrComposerFileNotFound: 'Файл composer.json не существует'
|
||
ErrRuntimeNoPort: 'Среда выполнения не настроена с портом, сначала отредактируйте среду выполнения.'
|
||
ErrRuntimeProjectDirContainsCodeDir: 'Каталог среды выполнения содержит выбранный каталог проекта. Выберите другой каталог проекта и создайте его заново.'
|
||
Status: 'Статус'
|
||
start: 'Запустить'
|
||
stop: 'Остановить'
|
||
restart: 'Перезапустить'
|
||
kill: 'Принудительно Остановить'
|
||
pause: 'Приостановить'
|
||
unpause: 'Возобновить'
|
||
remove: 'Удалить'
|
||
delete: 'Удалить'
|
||
ErrDefaultWebsite: 'Веб-сайт по умолчанию уже установлен, отмените его перед настройкой'
|
||
SSL: 'Сертификат'
|
||
Set: 'Настройки'
|
||
|
||
# SSL-сертификат
|
||
ErrSSLCannotDelete: 'Сертификат {{ .name }} используется веб-сайтом и не может быть удален'
|
||
ErrAccountCannotDelete: 'Учетная запись связана с сертификатом и не может быть удалена'
|
||
ErrSSLApply: 'Обновление сертификата прошло успешно, перезагрузка OpenResty не удалась, проверьте конфигурацию'
|
||
ErrEmailIsExist: 'Почтовый ящик уже существует'
|
||
ErrSSLKeyNotFound: 'Файл закрытого ключа не существует'
|
||
ErrSSLCertificateNotFound: 'Файл сертификата не существует'
|
||
ErrSSLKeyFormat: 'Проверка файла закрытого ключа не удалась'
|
||
ErrSSLCertificateFormat: 'Неверный формат файла сертификата, используйте формат pem'
|
||
ErrEabKidOrEabHmacKeyCannotBlank: 'EabKid или EabHmacKey не могут быть пустыми'
|
||
ErrOpenrestyNotFound: 'Для режима HTTP требуется OpenResty'
|
||
ApplySSLStart: 'Начать подачу заявки на сертификат, доменное имя [{{ .domain }}], метод подачи заявки [{{ .type }}]'
|
||
dnsAccount: 'DNS Авто'
|
||
dnsManual: 'Руководство по DNS'
|
||
http: 'HTTP'
|
||
ApplySSLFailed: 'Заявка на сертификат [{{ .domain }}] не выполнена, {{ .detail }}'
|
||
ApplySSLSuccess: 'Заявка на сертификат [{{ .domain }}] успешно подана'
|
||
DNSAccountName: 'DNS-аккаунт [{{ .name }}] поставщик [{{ .type }}]'
|
||
PushDirLog: 'Сертификат перемещен в каталог [{{ .path }}] {{ .status }}'
|
||
ErrDeleteCAWithSSL: 'Текущая организация имеет сертификат, который был выдан и не может быть удален.'
|
||
ErrDeleteWithPanelSSL: 'Конфигурация SSL панели использует этот сертификат и не может быть удалена'
|
||
ErrDefaultCA: 'Невозможно удалить полномочия по умолчанию'
|
||
ApplyWebSiteSSLLog: 'Начинается обновление сертификата веб-сайта {{ .name }}'
|
||
ErrUpdateWebsiteSSL: 'Обновление сертификата веб-сайта {{ .name }} не удалось: {{ .err }}'
|
||
ApplyWebSiteSSLSuccess: 'Сертификат веб-сайта успешно обновлен'
|
||
ErrExecShell: 'Не удалось выполнить скрипт {{ .err }}'
|
||
ExecShellStart: 'Начать выполнение скрипта'
|
||
ExecShellSuccess: 'Скрипт выполнен успешно'
|
||
StartUpdateSystemSSL: 'Начать обновление системного сертификата'
|
||
UpdateSystemSSLSuccess: 'Сертификат системы обновлен успешно'
|
||
ErrWildcardDomain: 'Невозможно подать заявку на получение подстановочного сертификата доменного имени в режиме HTTP'
|
||
ErrApplySSLCanNotDelete: 'Нельзя удалить сертификат {{ .name }}, который находится в процессе выпуска. Пожалуйста, попробуйте позже.'
|
||
StartPushSSLToNode: 'Начало отправки сертификата на узел'
|
||
PushSSLToNodeFailed: 'Не удалось отправить сертификат на узел: {{ .err }}'
|
||
PushSSLToNodeSuccess: 'Сертификат успешно отправлен на узел'
|
||
|
||
# MySQL
|
||
ErrUserIsExist: 'Текущий пользователь уже существует, пожалуйста, введите еще раз'
|
||
ErrDatabaseIsExist: 'Текущая база данных уже существует, пожалуйста, введите ее повторно'
|
||
ErrExecTimeOut: 'Время выполнения SQL истекло, проверьте базу данных'
|
||
ErrRemoteExist: 'Удаленная база данных с таким именем уже существует. Измените его и повторите попытку'
|
||
ErrLocalExist: 'Имя уже существует в локальной базе данных, измените его и повторите попытку'
|
||
RemoteBackup: 'Для резервного копирования удаленной базы данных необходимо сначала запустить службу базы данных локального контейнера с помощью образа {{ .name }}, пожалуйста, подождите...'
|
||
RemoteRecover: 'Для восстановления удаленной базы данных необходимо сначала запустить службу базы данных локального контейнера с помощью образа {{ .name }}, пожалуйста, подождите...'
|
||
Arg: 'Аргумент'
|
||
|
||
# Redis
|
||
ErrTypeOfRedis: 'Тип файла восстановления не соответствует текущему методу сохранения. Измените его и повторите попытку'
|
||
|
||
# контейнер
|
||
ErrInUsed: '{{ .detail }} используется и не может быть удалено'
|
||
ErrObjectInUsed: 'Этот объект используется и не может быть удален'
|
||
ErrObjectBeDependent: 'Этот образ зависит от других образов и не может быть удален'
|
||
ErrPortRules: 'Номер порта не совпадает, введите заново'
|
||
ErrPgImagePull: 'Время извлечения изображения истекло. Настройте ускорение изображения или вручную извлеките изображение {{ .name }} и повторите попытку'
|
||
PruneHelper: 'Эта очистка {{ .name }} освободила дисковое пространство {{ .size }}'
|
||
ImageRemoveHelper: 'Удалён образ {{ .name }}, освобождено {{ .size }} дискового пространства'
|
||
BuildCache: 'Кэш сборки'
|
||
Volume: 'Том хранилища'
|
||
Network: 'Сеть'
|
||
PruneStart: 'Очистка выполняется, пожалуйста, подождите...'
|
||
ContainerBackupPrepare: 'Подготовить рабочую область резервной копии контейнера'
|
||
ContainerBackupStop: 'Остановить контейнер перед резервным копированием'
|
||
ContainerBackupInspect: 'Сделать резервную копию inspect и сети контейнера'
|
||
ContainerBackupMounts: 'Сделать резервную копию точек монтирования контейнера'
|
||
ContainerBackupMeta: 'Записать метаданные резервной копии контейнера'
|
||
ContainerBackupStart: 'Запустить контейнер после резервного копирования'
|
||
ContainerRecoverPrepare: 'Подготовить рабочую область восстановления контейнера'
|
||
ContainerRecoverExtract: 'Распаковать архив резервной копии контейнера'
|
||
ContainerRecoverParse: 'Загрузить метаданные резервной копии контейнера'
|
||
ContainerRecoverCreate: 'Пересоздать контейнер'
|
||
ContainerRecoverMounts: 'Восстановить точки монтирования контейнера'
|
||
ContainerRecoverStart: 'Запустить восстановленный контейнер'
|
||
ContainerRecoverCleanup: 'Очистить рабочую область восстановления контейнера'
|
||
ComposeBackupPrepare: 'Подготовить рабочую область резервной копии compose'
|
||
ComposeBackupStop: 'Остановить compose перед резервным копированием'
|
||
ComposeBackupFiles: 'Сделать резервную копию файлов compose'
|
||
ComposeBackupContainers: 'Сделать резервную копию контейнеров compose'
|
||
ComposeBackupMeta: 'Записать метаданные резервной копии compose'
|
||
ComposeBackupStart: 'Запустить compose после резервного копирования'
|
||
ComposeBackupCleanup: 'Очистить рабочую область резервного копирования compose'
|
||
ComposeRecoverPrepare: 'Подготовить рабочую область восстановления compose'
|
||
ComposeRecoverExtract: 'Распаковать архив резервной копии compose'
|
||
ComposeRecoverMeta: 'Загрузить метаданные резервной копии compose'
|
||
ComposeRecoverMetaLogName: 'Метаданные восстановления compose: имя={{ .name }}'
|
||
ComposeRecoverMetaLogPath: 'Метаданные восстановления compose: путьБэкапа={{ .backupPath }} путьНазначения={{ .targetDir }}'
|
||
ComposeRecoverMetaLogCount: 'Метаданные восстановления compose: файлов={{ .files }} контейнеров={{ .containers }}'
|
||
ComposeRecoverFiles: 'Восстановить файлы compose'
|
||
ComposeRecoverContainers: 'Восстановить контейнеры compose'
|
||
ComposeRecoverRecord: 'Сохранить запись compose'
|
||
ComposeRecoverCleanup: 'Очистить рабочую область восстановления compose'
|
||
|
||
# среда выполнения
|
||
ErrFileNotExist: 'Файл {{ .detail }} не существует Проверьте целостность исходного файла'
|
||
ErrImageBuildErr: 'Сборка образа не удалась'
|
||
ErrImageExist: 'Изображение уже существует Пожалуйста, измените имя изображения.'
|
||
ErrDelWithWebsite: 'Операционная среда уже связана с веб-сайтом и не может быть удалена'
|
||
ErrRuntimeStart: 'Запуск не удался'
|
||
ErrPackageJsonNotFound: 'файл package.json не существует'
|
||
ErrScriptsNotFound: 'Элемент конфигурации скриптов не найден в package.json'
|
||
ErrContainerNameNotFound: 'Не удалось получить имя контейнера, проверьте файл.env'
|
||
ErrNodeModulesNotFound: 'Папка node_modules не существует Измените среду выполнения или дождитесь ее успешного запуска'
|
||
ErrContainerNameIsNull: 'Имя контейнера не существует'
|
||
ErrPHPPortIsDefault: 'Порт 9000 зарезервирован как стандартный. Укажите другой порт'
|
||
ErrPHPRuntimePortFailed: 'Порт {{ .name }} уже используется этой средой выполнения'
|
||
|
||
# инструмент
|
||
ErrConfigNotFound: 'Файл конфигурации не существует'
|
||
ErrConfigParse: 'Неверный формат файла конфигурации'
|
||
ErrConfigIsNull: 'Файл конфигурации не может быть пустым'
|
||
ErrConfigDirNotFound: 'Рабочий каталог не существует'
|
||
ErrConfigAlreadyExist: 'Файл конфигурации с таким именем уже существует'
|
||
ErrUserFindErr: 'Поиск пользователя {{ .name }} не удался {{ .err }}'
|
||
|
||
# задание cron
|
||
CutWebsiteLogSuccess: 'Журнал веб-сайта {{ .name }} успешно вырезан, путь к резервной копии {{ .path }}'
|
||
HandleShell: 'Выполнить скрипт {{ .name }}'
|
||
HandleCurl: 'Доступ к URL {{ .name }}'
|
||
HandleNtpSync: 'Синхронизация системного времени'
|
||
HandleSystemClean: 'Очистка системного кэша'
|
||
SystemLog: 'Системный лог'
|
||
CutWebsiteLog: 'Ротация логов сайта'
|
||
FileOrDir: 'Каталог / Файл'
|
||
UploadFile: 'Загрузка файла резервной копии {{ .file }} в {{ .backup }}'
|
||
Upload: 'Загрузить'
|
||
IgnoreBackupErr: 'Ошибка резервного копирования: {{ .detail }}, игнорируем эту ошибку...'
|
||
IgnoreUploadErr: 'Ошибка загрузки: {{ .detail }}, игнорируем эту ошибку...'
|
||
LoadBackupFailed: 'Не удалось получить подключение к учетной записи резервной копии, ошибка: {{ .detail }}'
|
||
InExecuting: 'Текущая задача выполняется, не повторяйте выполнение'
|
||
NoSuchResource: 'В базе данных не найдено содержимое резервной копии, пропускаем...'
|
||
CleanLog: 'Очистить журнал'
|
||
CleanLogByName: 'Очистить журнал {{ .name }}'
|
||
WafIpGroupNotFound: 'Группа IP WAF не найдена. Пожалуйста, перейдите в [Расширенные функции - WAF - Черный/Белый список - Группа IP], чтобы добавить группу IP с помощью метода удаленной загрузки.'
|
||
|
||
# панель инструментов
|
||
ErrNotExistUser: 'Текущий пользователь не существует, измените его и повторите попытку'
|
||
ErrBanAction: 'Настройка не удалась. Текущая служба {{ .name }} недоступна. Проверьте и повторите попытку'
|
||
ErrClamdscanNotFound: 'Команда clamdscan не обнаружена, обратитесь к документации, чтобы установить ее'
|
||
TaskSwapSet: 'Настройка Swap'
|
||
SetSwap: 'Настроить Swap {{ .path }} - {{ .size }}'
|
||
CreateSwap: 'Создать Файл Swap'
|
||
FormatSwap: 'Форматировать Файл Swap'
|
||
EnableSwap: 'Включить Swap'
|
||
|
||
# защита от изменений
|
||
CleanTamperSetting: 'Очистить исторические настройки защиты'
|
||
SetTamperWithRules: 'Запустить защиту каталога согласно правилам'
|
||
ProtectDir: 'Защитить каталог {{ .name }}'
|
||
IgnoreFile: 'Защитить файл {{ .name }}'
|
||
TamperSetSuccessful: 'Настройки защиты завершены, начинаю мониторинг следующих каталогов:'
|
||
|
||
# WAF
|
||
ErrScope: 'Изменение этой конфигурации не поддерживается'
|
||
ErrStateChange: 'He удалось изменить состояние'
|
||
ErrRuleExist: 'Правило уже существует'
|
||
ErrRuleNotExist: 'Правило не существует'
|
||
ErrParseIP: 'Неправильный формат IP'
|
||
ErrDefaultIP: 'по умолчанию это зарезервированное имя, пожалуйста, измените его на другое имя'
|
||
ErrGroupInUse: 'IP-группа используется черным/белым списком и не может быть удалена'
|
||
ErrIPGroupAclUse: 'Группа IP используется пользовательскими правилами сайта {{ .name }}, невозможно удалить'
|
||
ErrGroupExist: 'Имя группы IP уже существует'
|
||
ErrIPRange: 'Неверный диапазон IP-адресов'
|
||
ErrIPExist: 'IP-адрес уже существует'
|
||
urlDefense: 'Правила URL'
|
||
urlHelper: 'Запрещенный URL'
|
||
dirFilter: 'Фильтр каталогов'
|
||
xss: 'XSS'
|
||
phpExec: 'Выполнение PHP-скрипта'
|
||
oneWordTrojan: 'Троян из одного слова'
|
||
appFilter: 'Применить фильтрацию опасных каталогов'
|
||
webShell: 'Be6-оболочка'
|
||
args: 'Правила параметров'
|
||
protocolFilter: 'Фильтрация протоколов'
|
||
javaFilter: 'Фильтр опасных файлов Java'
|
||
scannerFilter: 'Фильтр сканера'
|
||
escapeFilter: 'фильтр побега'
|
||
customRule: 'Пользовательское правило'
|
||
httpMethod: 'Фильтрация метода HTTP'
|
||
fileExt: 'Ограничения на загрузку файлов'
|
||
defaultIpBlack: 'Вредоносная группа IP'
|
||
cookie: 'Правила использования файлов cookie'
|
||
urlBlack: 'Черный список URL'
|
||
uaBlack: 'Черный список User-Agent'
|
||
attackCount: 'Ограничение частоты атак'
|
||
fileExtCheck: 'Ограничения на загрузку файлов'
|
||
geoRestrict: 'Региональные ограничения доступа'
|
||
unknownWebsite: 'Несанкционированный доступ к доменному имени'
|
||
notFoundCount: 'Ограничение скорости 404'
|
||
headerDefense: 'Правила заголовка'
|
||
defaultUaBlack: 'Правила User-Agent'
|
||
methodWhite: 'Правила HTTP'
|
||
captcha: 'человеко-машинная верификация'
|
||
fiveSeconds: '5 секунд проверки'
|
||
vulnCheck: 'Дополнительные правила'
|
||
acl: 'Пользовательские правила'
|
||
sql: 'SQL-инъекция'
|
||
cc: 'Ограничение частоты доступа'
|
||
defaultUrlBlack: 'Правила URL'
|
||
sqlInject: 'SQL-инъекция'
|
||
ErrDBNotExist: 'База данных не существует'
|
||
allow: 'разрешить'
|
||
deny: 'отрицать'
|
||
OpenrestyNotFound: 'OpenResty не установлен'
|
||
remoteIpIsNull: 'Список IP пуст'
|
||
OpenrestyVersionErr: 'Версия OpenResty слишком старая. Обновите до 1.27.1.2-2-2-focal'
|
||
ErrFileTooLarge: 'Файл больше 1 МБ и не может быть загружен'
|
||
|
||
# задача
|
||
TaskStart: '{{ .name }} Задача начинается [START]'
|
||
TaskEnd: '{{ .name }} Задача выполнена [ЗАВЕРШЕНО]'
|
||
TaskFailed: 'Задача {{ .name }} не выполнена'
|
||
TaskTimeout: '{{ .name }} истекло время ожидания'
|
||
TaskSuccess: '{{ .name }} Задача выполнена успешно'
|
||
TaskRetry: 'Начать {{ .name }}-ю повторную попытку'
|
||
SubTaskSuccess: '{{ .name }} выполнено успешно'
|
||
SubTaskFailed: '{{ .name }} не удалось: {{ .err }}'
|
||
TaskInstall: 'Установить'
|
||
TaskUninstall: 'Удалить'
|
||
TaskCreate: 'Создать'
|
||
TaskDelete: 'Удалить'
|
||
TaskUpgrade: 'Обновить'
|
||
TaskUpdate: 'Обновить'
|
||
TaskRestart: 'Перезапуск'
|
||
TaskProtect: 'Защита'
|
||
TaskBackup: 'Резервное копирование'
|
||
TaskRecover: 'Восстановить'
|
||
TaskRollback: 'Откат'
|
||
TaskPull: 'Вытянуть'
|
||
TaskCommit: 'Kоммит'
|
||
TaskBuild: 'Сборка'
|
||
TaskPush: 'Отправить'
|
||
TaskClean: 'Очистка'
|
||
TaskHandle: 'Выполнить'
|
||
TaskImport: 'Импорт'
|
||
TaskExport: 'Экспорт'
|
||
Website: 'Be6-сайт'
|
||
App: 'Приложение'
|
||
Runtime: 'Среда выполнения'
|
||
Database: 'База данных'
|
||
ConfigFTP: 'Создать пользователя FTP {{ .name }}'
|
||
ConfigOpenresty: 'Создать файл конфигурации OpenResty'
|
||
InstallAppSuccess: 'Приложение {{ .name }} успешно установлено'
|
||
ConfigRuntime: 'Настройка среды выполнения'
|
||
ConfigApp: 'Приложение конфигурации'
|
||
SuccessStatus: '{{ .name }} успешно'
|
||
FailedStatus: '{{ .name }} не удалось {{ .err }}'
|
||
HandleLink: 'Обработка ассоциации приложений'
|
||
HandleDatabaseApp: 'Обработка параметров приложения'
|
||
ExecShell: 'Выполнить скрипт {{ .name }}'
|
||
PullImage: 'Вытянуть изображение'
|
||
Start: 'Старт'
|
||
Run: 'Старт'
|
||
Stop: 'Стоп'
|
||
Image: 'Зеркало'
|
||
Compose: 'Оркестровка'
|
||
Container: 'Контейнер'
|
||
AppLink: 'Связанное приложение'
|
||
EnableSSL: 'Включить HTTPS'
|
||
AppStore: 'Магазин приложений'
|
||
TaskSync: 'Синхронизировать'
|
||
LocalApp: 'Локальное приложение'
|
||
SubTask: 'Подзадача'
|
||
RuntimeExtension: 'Расширение среды выполнения'
|
||
TaskIsExecuting: 'Задача выполняется'
|
||
CustomAppstore: 'Хранилище пользовательских приложений'
|
||
TaskExec: 'Выполнить'
|
||
TaskBatch: 'Пакетная операция'
|
||
FileConvert: 'Преобразование формата файла'
|
||
|
||
# задача - ClamAV
|
||
Clamscan: 'Сканировать {{ .name }}'
|
||
TaskScan: 'Сканировать'
|
||
|
||
# задача - AI
|
||
OllamaModelPull: 'Вытянуть модель Ollama {{ .name }}'
|
||
OllamaModelSize: 'Получить размер модели Ollama {{ .name }}'
|
||
AIBenchmarkRun: "Выполнить тест производительности AI"
|
||
|
||
# задача - снимок
|
||
Snapshot: 'Снимок'
|
||
SnapDBInfo: 'Запись информации о базе данных 1Panel'
|
||
SnapCopy: 'Копировать файлы и каталоги {{ .name }}'
|
||
SnapNewDB: 'Инициализировать соединение с базой данных {{ .name }}'
|
||
SnapDeleteOperationLog: 'Удалить журнал операций'
|
||
SnapDeleteLoginLog: 'Удалить журнал доступа'
|
||
SnapDeleteMonitor: 'Удалить данные мониторинга'
|
||
SnapRemoveSystemIP: 'Удалить системный IP'
|
||
SnapBaseInfo: 'Записать основную информацию 1Panel'
|
||
SnapInstallAppImageEmpty: 'Образы приложений не выбраны, пропускаем...'
|
||
SnapInstallApp: 'Резервное копирование приложений, установленных в 1Panel'
|
||
SnapDockerSave: 'Сжать установленные приложения'
|
||
SnapLocalBackup: 'Резервное копирование локального каталога резервных копий 1Panel'
|
||
SnapCompressBackup: 'Сжать локальный каталог резервных копий'
|
||
SnapPanelData: 'Резервное копирование каталога данных 1Panel'
|
||
SnapCompressPanel: 'Каталог сжатых данных'
|
||
SnapWebsite: 'Резервное копирование каталога веб-сайта 1Panel'
|
||
SnapCloseDBConn: 'Закрыть соединение с базой данных'
|
||
SnapCompress: 'Создание файлов моментальных снимков'
|
||
SnapCompressFile: 'Сжать файл моментального снимка'
|
||
SnapCheckCompress: 'Проверить файл сжатия снимка'
|
||
SnapCompressSize: 'Размер файла снимка {{ .name }}'
|
||
SnapUpload: 'Загрузить файл снимка'
|
||
SnapUploadTo: 'Загрузить файл снимка в {{ .name }}'
|
||
SnapUploadRes: 'Загрузить файл снимка в {{ .name }}'
|
||
SnapshotRecover: 'Восстановление моментального снимка'
|
||
RecoverDownload: 'Загрузить файл снимка'
|
||
Download: 'Скачать'
|
||
RecoverDownloadAccount: 'Получить резервную копию учетной записи для загрузки моментального снимка {{ .name }}'
|
||
RecoverDecompress: 'Распаковка сжатых файлов моментальных снимков'
|
||
Decompress: 'Декомпрессия'
|
||
BackupBeforeRecover: 'Резервное копирование системных данных перед созданием снимка'
|
||
ReadJson: 'Прочитать файл JSON в снимке'
|
||
ReadJsonPath: 'Получить путь к файлу JSON в снимке'
|
||
ReadJsonContent: 'Прочитать файл Json'
|
||
ReadJsonMarshal: 'Обработка Json escape'
|
||
RecoverApp: 'Восстановить установленные приложения'
|
||
RecoverWebsite: 'Восстановить каталог веб-сайта'
|
||
RecoverAppImage: 'Восстановить резервную копию образа снимка'
|
||
RecoverCompose: 'Восстановить содержимое другого композитора'
|
||
RecoverComposeList: 'Восстановить всех композиторов'
|
||
RecoverComposeItem: 'Восстановить сообщение {{ .name }}'
|
||
RecoverAppEmpty: 'В файле снимка не найдено резервной копии образа приложения'
|
||
RecoverBaseData: 'Восстановить базовые данные и файлы'
|
||
RecoverDaemonJsonEmpty: 'Ни файл снимка, ни текущая машина не имеют файла конфигурации контейнера daemon.json'
|
||
RecoverDaemonJson: 'Восстановить файл конфигурации контейнера daemon.json'
|
||
RecoverDBData: 'Восстановить данные базы данных'
|
||
RecoverBackups: 'Восстановить локальный каталог резервных копий'
|
||
RecoverPanelData: 'Каталог данных восстановления'
|
||
|
||
# задача - контейнер
|
||
ContainerImagePull: 'Извлечь изображение контейнера {{ .name }}'
|
||
ContainerRemoveOld: 'Удалить исходный контейнер {{ .name }}'
|
||
ContainerImageCheck: 'Проверьте, нормально ли извлекается изображение'
|
||
ContainerLoadInfo: 'Получить основную информацию о контейнере'
|
||
ContainerRecreate: 'Обновление контейнера не удалось, сейчас начну восстанавливать исходный контейнер'
|
||
ContainerCreate: 'Создать новый контейнер {{ .name }}'
|
||
ContainerCreateFailed: 'Создание контейнера не удалось, удалите неудавшийся контейнер'
|
||
ContainerStartCheck: 'Проверить, запущен ли контейнер'
|
||
|
||
# задача - образ
|
||
ImageBuild: 'Создание изображения'
|
||
ImagePull: 'Вытащить изображение'
|
||
ImageRepoAuthFromDB: 'Получить информацию об аутентификации репозитория из базы данных'
|
||
ImagePush: 'Отправить изображение'
|
||
ImageRenameTag: 'Изменить тег изображения'
|
||
ImageNewTag: 'Новый тег изображения {{ .name }}'
|
||
ComposeCreate: 'Создать композицию'
|
||
|
||
# задача - сайт
|
||
BackupNginxConfig: 'Резервное копирование файла конфигурации OpenResty веб-сайта'
|
||
CompressFileSuccess: 'Каталог успешно сжат, сжат в {{ .name }}'
|
||
CompressDir: 'Каталог сжатия'
|
||
DeCompressFile: 'Распаковать файл {{ .name }}'
|
||
ErrCheckValid: 'Проверка файла резервной копии не удалась, {{ .name }}'
|
||
Rollback: 'Откат'
|
||
websiteDir: 'Каталог веб-сайтов'
|
||
RecoverFailedStartRollBack: 'Восстановление не удалось, начать откат'
|
||
AppBackupFileIncomplete: 'Файл резервной копии неполный и в нем отсутствуют файлы app.json или app.tar.gz'
|
||
AppAttributesNotMatch: 'Тип или имя приложения не совпадают'
|
||
|
||
# оповещение
|
||
ErrAlertMethodNotSupported: 'Эта версия не поддерживает данный способ оповещения'
|
||
ErrAlertSync: 'Ошибка синхронизации информации о тревоге, проверьте и повторите попытку'
|
||
|
||
# задача - среда выполнения
|
||
ErrInstallExtension: 'Уже выполняется задача установки, подождите, пока задача завершится'
|
||
|
||
# шаблон письма оповещения
|
||
PanelAlertTitle: 'Уведомление панели'
|
||
TestAlertTitle: 'Тестовое письмо - проверка подключения'
|
||
TestAlert: 'Это тестовое письмо для проверки правильности настройки отправки писем.'
|
||
LicenseExpirationAlert: 'Ваш панель {{ .node }}{{ .ip }}, лицензия истечет через {{ .day }} дней. Войдите в панель для получения деталей.'
|
||
CronJobFailedAlert: 'Ваш панель {{ .node }}{{ .ip }}, выполнение запланированной задачи {{ .name }} не удалось. Войдите в панель для получения деталей.'
|
||
ClamAlert: 'Ваш панель {{ .node }}{{ .ip }}, задача сканирования на вирусы обнаружила {{ .num }} зараженных файлов. Войдите в панель для получения деталей.'
|
||
WebSiteAlert: 'Ваш панель {{ .node }}{{ .ip }}, {{ .num }} веб-сайтов истечут через {{ .day }} дней. Войдите в панель для получения деталей.'
|
||
SSLAlert: 'Ваш панель {{ .node }}{{ .ip }}, {{ .num }} сертификатов SSL истечут через {{ .day }} дней. Войдите в панель для получения деталей.'
|
||
DiskUsedAlert: 'Ваш панель {{ .node }}{{ .ip }}, использование диска {{ .name }} достигло {{ .used }}. Войдите в панель для получения деталей.'
|
||
ResourceAlert: 'Ваш панель {{ .node }}{{ .ip }}, средний уровень использования {{ .name }} за {{ .time }} минут составляет {{ .used }}. Войдите в панель для получения деталей.'
|
||
PanelVersionAlert: 'Ваш панель {{ .node }}{{ .ip }}, доступна последняя версия панели для обновления. Войдите в панель для получения деталей.'
|
||
PanelPwdExpirationAlert: 'Ваш панель {{ .node }}{{ .ip }}, пароль панели истечет через {{ .day }} дней. Войдите в панель для получения деталей.'
|
||
CommonAlert: 'Ваш панель {{ .node }}{{ .ip }}, {{ .msg }}. Войдите в панель для получения деталей.'
|
||
NodeExceptionAlert: 'Ваш панель {{ .node }}{{ .ip }}, {{ .num }} узлов работают с ошибками. Войдите в панель для получения деталей.'
|
||
LicenseExceptionAlert: 'Ваш панель {{ .node }}{{ .ip }}, {{ .num }} лицензий имеют ошибки. Войдите в панель для получения деталей.'
|
||
SSHAndPanelLoginAlert: 'Ваш панель {{ .node }}{{ .ip }}, вход {{ .name }} с адреса {{ .loginIp }} является аномальным. Войдите в панель для получения деталей.'
|
||
|
||
# диск
|
||
DeviceNotFound: 'Устройство {{ .name }} не найдено'
|
||
DeviceIsMounted: 'Устройство {{ .name }} подключено, сначала отключите'
|
||
PartitionDiskErr: 'Не удалось разделить, {{ .err }}'
|
||
FormatDiskErr: 'Не удалось отформатировать диск, {{ .err }}'
|
||
MountDiskErr: 'Не удалось подключить диск, {{ .err }}'
|
||
XfsNotFound: 'Файловая система xfs не обнаружена, сначала установите xfsprogs'
|
||
|
||
# терминал
|
||
TerminalAIBlockedRiskyCommand: 'Опасная команда заблокирована: {{ .command }}'
|
||
TerminalAIThinking: 'AI думает...'
|
||
TerminalAIReadyToExecute: 'Обдумывание завершено, нажмите Enter для выполнения (время: {{ .duration }}, token: {{ .tokens }})'
|
||
TerminalAIRequestFailed: 'Ошибка запроса AI: {{ .err }}'
|
||
|
||
# AI-шлюз
|
||
ErrAIProxyServiceNotInstalled: 'Сервис {{ .name }} не установлен'
|
||
ErrAIProxyModelAccountNotFound: 'Аккаунт модели {{ .id }} не найден'
|
||
ErrAIProxyModelMapRequired: 'Это поле обязательно.'
|
||
ErrAIProxyModelMapInvalid: 'Сопоставление моделей должно быть допустимым JSON-объектом: {{ .err }}'
|
||
ErrAIProxyModelMapEmpty: 'Сопоставление моделей не может быть пустым'
|
||
ErrAIProxyModelMapEmptyExternalModel: 'Сопоставление моделей содержит пустую запрошенную модель'
|
||
ErrAIProxyModelMapEmptyUpstreamModel: 'Upstream-модель для {{ .model }} не может быть пустой'
|
||
AIProxyUserFallback: 'Удаленный пользователь (ID: {{ .id }})'
|