mirror of https://github.com/1Panel-dev/1Panel
Russian language support. (#7554)
* Add Russian language * Use prettier --------- Co-authored-by: Bubblegum <jack_benq@selfhosted.lan>pull/7560/head
parent
14095affa9
commit
d96ccd06a3
|
@ -29,7 +29,7 @@ type Login struct {
|
||||||
Captcha string `json:"captcha"`
|
Captcha string `json:"captcha"`
|
||||||
CaptchaID string `json:"captchaID"`
|
CaptchaID string `json:"captchaID"`
|
||||||
AuthMethod string `json:"authMethod" validate:"required,oneof=jwt session"`
|
AuthMethod string `json:"authMethod" validate:"required,oneof=jwt session"`
|
||||||
Language string `json:"language" validate:"required,oneof=zh en tw"`
|
Language string `json:"language" validate:"required,oneof=zh en tw ru"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type MFALogin struct {
|
type MFALogin struct {
|
||||||
|
|
|
@ -75,7 +75,6 @@ func GetMsgByKey(key string) string {
|
||||||
return content
|
return content
|
||||||
}
|
}
|
||||||
|
|
||||||
//go:embed lang/*
|
|
||||||
var fs embed.FS
|
var fs embed.FS
|
||||||
var bundle *i18n.Bundle
|
var bundle *i18n.Bundle
|
||||||
|
|
||||||
|
@ -100,6 +99,7 @@ func Init() {
|
||||||
_, _ = bundle.LoadMessageFileFS(fs, "lang/zh-Hant.yaml")
|
_, _ = bundle.LoadMessageFileFS(fs, "lang/zh-Hant.yaml")
|
||||||
_, _ = bundle.LoadMessageFileFS(fs, "lang/fa.yaml")
|
_, _ = bundle.LoadMessageFileFS(fs, "lang/fa.yaml")
|
||||||
_, _ = bundle.LoadMessageFileFS(fs, "lang/pt.yaml")
|
_, _ = bundle.LoadMessageFileFS(fs, "lang/pt.yaml")
|
||||||
|
_, _ = bundle.LoadMessageFileFS(fs, "lang/ru.yaml")
|
||||||
}
|
}
|
||||||
|
|
||||||
func UseI18nForCmd(lang string) {
|
func UseI18nForCmd(lang string) {
|
||||||
|
|
|
@ -0,0 +1,283 @@
|
||||||
|
ErrInvalidParams: "Ошибка параметра запроса: {{ .detail }}"
|
||||||
|
ErrTokenParse: "Ошибка генерации токена: {{ .detail }}"
|
||||||
|
ErrInitialPassword: "Ошибка исходного пароля"
|
||||||
|
ErrInternalServer: "Внутренняя ошибка сервиса: {{ .detail }}"
|
||||||
|
ErrRecordExist: "Запись уже существует"
|
||||||
|
ErrRecordNotFound: "Записи не найдены"
|
||||||
|
ErrStructTransform: "Ошибка преобразования типа: {{ .detail }}"
|
||||||
|
ErrNotLogin: "Пользователь не вошел в систему: {{ .detail }}"
|
||||||
|
ErrPasswordExpired: "Текущий пароль истек: {{ .detail }}"
|
||||||
|
ErrNotSupportType: "Система не поддерживает текущий тип: {{ .detail }}"
|
||||||
|
ErrApiConfigStatusInvalid: "Доступ к API интерфейсу запрещен: {{ .detail }}"
|
||||||
|
ErrApiConfigKeyInvalid: "Ошибка ключа API интерфейса: {{ .detail }}"
|
||||||
|
ErrApiConfigIPInvalid: "IP API интерфейса отсутствует в белом списке: {{ .detail }}"
|
||||||
|
ErrApiConfigDisable: "Этот интерфейс запрещает использование вызовов API интерфейса: {{ .detail }}"
|
||||||
|
|
||||||
|
#common
|
||||||
|
ErrNameIsExist: "Имя уже существует"
|
||||||
|
ErrDemoEnvironment: "Демо-сервер, операция запрещена!"
|
||||||
|
ErrCmdTimeout: "Время выполнения команды истекло!"
|
||||||
|
ErrCmdIllegal: "Команда содержит недопустимые символы. Пожалуйста, измените и попробуйте снова!"
|
||||||
|
ErrPortExist: "{{ .port }} порт уже занят {{ .type }} [{{ .name }}]"
|
||||||
|
TYPE_APP: "Приложение"
|
||||||
|
TYPE_RUNTIME: "Среда выполнения"
|
||||||
|
TYPE_DOMAIN: "Доменное имя"
|
||||||
|
ErrTypePort: "Ошибка формата порта {{ .name }}"
|
||||||
|
ErrTypePortRange: "Диапазон портов должен быть между 1-65535"
|
||||||
|
Success: "Успех"
|
||||||
|
Failed: "Неудача"
|
||||||
|
SystemRestart: "Перезагрузка системы приводит к прерыванию задачи"
|
||||||
|
|
||||||
|
#app
|
||||||
|
ErrPortInUsed: "Порт {{ .detail }} уже используется"
|
||||||
|
ErrAppLimit: "Превышен лимит установки приложения"
|
||||||
|
ErrAppRequired: "Требуется приложение {{ .detail }}"
|
||||||
|
ErrNotInstall: "Приложение не установлено"
|
||||||
|
ErrPortInOtherApp: "Порт {{ .port }} уже используется приложением {{ .apps }}"
|
||||||
|
ErrDbUserNotValid: "База данных акций, имя пользователя и пароль не совпадают!"
|
||||||
|
ErrDockerComposeNotValid: "Ошибка формата файла docker-compose!"
|
||||||
|
ErrUpdateBuWebsite: "Приложение успешно обновлено, но изменение конфигурационного файла веб-сайта не удалось, пожалуйста, проверьте конфигурацию!"
|
||||||
|
Err1PanelNetworkFailed: "Не удалось создать сеть контейнера по умолчанию! {{ .detail }}"
|
||||||
|
ErrFileParse: "Не удалось разобрать файл docker-compose приложения!"
|
||||||
|
ErrInstallDirNotFound: "Директория установки не существует"
|
||||||
|
AppStoreIsUpToDate: "Обновлено"
|
||||||
|
LocalAppVersionNull: "Приложение {{.name}} не синхронизировано с версией! Невозможно добавить в список приложений"
|
||||||
|
LocalAppVersionErr: "{{.name}} не удалось синхронизировать версию {{.version}}! {{.err}}"
|
||||||
|
ErrFileNotFound: "Файл {{.name}} не существует"
|
||||||
|
ErrFileParseApp: "Не удалось проанализировать файл {{.name}} {{.err}}"
|
||||||
|
ErrAppDirNull: "Папка версии не существует"
|
||||||
|
LocalAppErr: "Синхронизация приложения {{.name}} не удалась! {{.err}}"
|
||||||
|
ErrContainerName: "Имя контейнера уже существует"
|
||||||
|
ErrAppSystemRestart: "Перезапуск 1Panel приводит к завершению задачи"
|
||||||
|
ErrCreateHttpClient: "Не удалось создать HTTP-запрос {{.err}}"
|
||||||
|
ErrHttpReqTimeOut: "Превышено время ожидания запроса {{.err}}"
|
||||||
|
ErrHttpReqFailed: "Запрос не выполнен {{.err}}"
|
||||||
|
ErrHttpReqNotFound: "Файл не существует"
|
||||||
|
ErrNoSuchHost: "Сбой сетевого подключения"
|
||||||
|
ErrImagePullTimeOut: "Тайм-аут загрузки образа"
|
||||||
|
ErrContainerNotFound: "Контейнер {{ .name }} не существует"
|
||||||
|
ErrContainerMsg: "Контейнер {{ .name }} работает ненормально, пожалуйста, проверьте журнал на странице контейнера для подробностей"
|
||||||
|
ErrAppBackup: "Резервное копирование приложения {{ .name }} не удалось, ошибка {{.err}}"
|
||||||
|
ErrImagePull: "Не удалось загрузить образ {{ .name }}, ошибка {{.err}}"
|
||||||
|
ErrVersionTooLow: "Текущая версия 1Panel слишком стара для обновления магазина приложений, пожалуйста, обновите версию"
|
||||||
|
ErrAppNameExist: "Имя приложения уже существует"
|
||||||
|
AppStoreIsSyncing: "Магазин приложений синхронизируется, пожалуйста, попробуйте позже"
|
||||||
|
ErrGetCompose: "Не удалось получить файл docker-compose.yml! {{ .detail }}"
|
||||||
|
ErrAppWarn: "Аномальный статус, пожалуйста, проверьте журнал"
|
||||||
|
ErrAppParamKey: "Исключение в поле параметра {{ .name }}"
|
||||||
|
ErrAppUpgrade: "Не удалось обновить приложение {{ .name }} {{ .err }}"
|
||||||
|
AppRecover: "Приложение {{ .name }} откатилось "
|
||||||
|
PullImageStart: "Начало загрузки образа {{ .name }}"
|
||||||
|
PullImageSuccess: "Образ успешно загружен"
|
||||||
|
UpgradeAppStart: "Начало обновления приложения {{ .name }}"
|
||||||
|
UpgradeAppSuccess: "Приложение {{ .name }} успешно обновлено"
|
||||||
|
|
||||||
|
#file
|
||||||
|
ErrFileCanNotRead: "Файл недоступен для чтения"
|
||||||
|
ErrFileToLarge: "Файл слишком большой"
|
||||||
|
ErrPathNotFound: "Путь не найден"
|
||||||
|
ErrMovePathFailed: "Целевой путь не может содержать исходный путь!"
|
||||||
|
ErrLinkPathNotFound: "Целевой путь не существует!"
|
||||||
|
ErrFileIsExist: "Файл или каталог уже существует!"
|
||||||
|
ErrFileUpload: "Не удалось загрузить файл {{.name}} {{.detail}}"
|
||||||
|
ErrFileDownloadDir: "Скачивание папки не поддерживается"
|
||||||
|
ErrCmdNotFound: "Команда {{ .name}} не существует, пожалуйста, сначала установите эту команду на хосте"
|
||||||
|
ErrSourcePathNotFound: "Исходный каталог не существует"
|
||||||
|
ErrFavoriteExist: "Этот путь уже в избранном"
|
||||||
|
ErrInvalidChar: "Недопустимые символы запрещены"
|
||||||
|
ErrPathNotDelete: "Выбранный каталог не может быть удален"
|
||||||
|
|
||||||
|
#website
|
||||||
|
ErrDomainIsExist: "Доменное имя уже существует"
|
||||||
|
ErrAliasIsExist: "Псевдоним уже существует"
|
||||||
|
ErrAppDelete: "Другой веб-сайт использует это приложение"
|
||||||
|
ErrGroupIsUsed: "Группа используется и не может быть удалена"
|
||||||
|
ErrBackupMatch: "файл резервной копии не соответствует текущим данным части сайта: {{ .detail}}"
|
||||||
|
ErrBackupExist: "файл резервной копии соответствует части исходных данных, которая не существует: {{ .detail}}"
|
||||||
|
ErrPHPResource: "Локальная среда выполнения не поддерживает переключение!"
|
||||||
|
ErrPathPermission: "Обнаружена папка с правами доступа не 1000:1000 в каталоге индекса, что может вызвать ошибку отказа в доступе при доступе к веб-сайту. Пожалуйста, нажмите кнопку сохранения выше"
|
||||||
|
ErrDomainIsUsed: "Домен уже используется веб-сайтом {{ .name }}"
|
||||||
|
ErrDomainFormat: "Ошибка формата домена {{ .name }}"
|
||||||
|
ErrDefaultAlias: "default — зарезервированное кодовое имя, пожалуйста, используйте другое кодовое имя"
|
||||||
|
ErrImageNotExist: "Образ рабочей среды {{.name}} не существует, пожалуйста, перенастройте рабочую среду"
|
||||||
|
|
||||||
|
#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: "Системный сертификат успешно обновлен"
|
||||||
|
|
||||||
|
#mysql
|
||||||
|
ErrUserIsExist: "Текущий пользователь уже существует. Пожалуйста, введите нового пользователя"
|
||||||
|
ErrDatabaseIsExist: "Текущая база данных уже существует. Пожалуйста, введите новую базу данных"
|
||||||
|
ErrExecTimeOut: "Время выполнения SQL запроса истекло, пожалуйста, проверьте базу данных"
|
||||||
|
ErrRemoteExist: "Удаленная база данных с таким именем уже существует, пожалуйста, измените и попробуйте снова"
|
||||||
|
ErrLocalExist: "Локальная база данных с таким именем уже существует, пожалуйста, измените и попробуйте снова"
|
||||||
|
|
||||||
|
#redis
|
||||||
|
ErrTypeOfRedis: "Тип восстановленного файла не соответствует текущему режиму сохранения. Измените тип файла и попробуйте снова"
|
||||||
|
|
||||||
|
#container
|
||||||
|
ErrInUsed: "{{ .detail }} используется и не может быть удален"
|
||||||
|
ErrObjectInUsed: "Этот объект используется и не может быть удален"
|
||||||
|
ErrPortRules: "Количество портов не совпадает, пожалуйста, введите заново!"
|
||||||
|
ErrPgImagePull: "Тайм-аут загрузки образа. Пожалуйста, настройте ускорение загрузки образа или вручную загрузите образ postgres:16.0-alpine и попробуйте снова"
|
||||||
|
|
||||||
|
#runtime
|
||||||
|
ErrDirNotFound: "Папка сборки не существует! Пожалуйста, проверьте целостность файла!"
|
||||||
|
ErrFileNotExist: "Файл {{ .detail }} не существует! Пожалуйста, проверьте целостность исходного файла!"
|
||||||
|
ErrImageBuildErr: "Не удалось создать образ"
|
||||||
|
ErrImageExist: "Образ уже существует!"
|
||||||
|
ErrDelWithWebsite: "Рабочая среда уже связана с веб-сайтом и не может быть удалена"
|
||||||
|
ErrRuntimeStart: "Не удалось запустить"
|
||||||
|
ErrPackageJsonNotFound: "Файл package.json не существует"
|
||||||
|
ErrScriptsNotFound: "Конфигурационный элемент scripts не найден в package.json"
|
||||||
|
ErrContainerNameNotFound: "Не удалось получить имя контейнера, пожалуйста, проверьте файл .env"
|
||||||
|
ErrNodeModulesNotFound: "Папка node_modules не существует! Пожалуйста, отредактируйте среду выполнения или дождитесь успешного запуска среды выполнения"
|
||||||
|
|
||||||
|
#setting
|
||||||
|
ErrBackupInUsed: "Учетная запись резервного копирования уже используется в cronjob и не может быть удалена."
|
||||||
|
ErrBackupCheck: "Проверка подключения учетной записи резервного копирования не выполнена {{ .err}}"
|
||||||
|
ErrOSSConn: "Не удалось получить последнюю версию, пожалуйста, проверьте возможность подключения сервера к внешней сети."
|
||||||
|
ErrEntrance: "Информация о безопасном входе неверна. Пожалуйста, проверьте и попробуйте снова!"
|
||||||
|
|
||||||
|
#tool
|
||||||
|
ErrConfigNotFound: "Конфигурационный файл не существует"
|
||||||
|
ErrConfigParse: "Ошибка формата конфигурационного файла"
|
||||||
|
ErrConfigIsNull: "Конфигурационный файл не может быть пустым"
|
||||||
|
ErrConfigDirNotFound: "Каталог выполнения не существует"
|
||||||
|
ErrConfigAlreadyExist: "Конфигурационный файл с таким именем уже существует"
|
||||||
|
ErrUserFindErr: "Не удалось найти пользователя {{ .name }} {{ .err }}"
|
||||||
|
|
||||||
|
#ssh
|
||||||
|
ErrFirewallNone: "На системе не обнаружен сервис firewalld или ufw. Пожалуйста, проверьте и попробуйте снова!"
|
||||||
|
ErrFirewallBoth: "На системе обнаружены оба сервиса firewalld и ufw. Чтобы избежать конфликтов, удалите один и попробуйте снова!"
|
||||||
|
|
||||||
|
#cronjob
|
||||||
|
ErrBashExecute: "Ошибка выполнения скрипта, пожалуйста, проверьте конкретную информацию в области вывода задачи."
|
||||||
|
ErrCutWebsiteLog: "Не удалось разрезать лог веб-сайта {{ .name }}, ошибка {{ .err }}"
|
||||||
|
CutWebsiteLogSuccess: "Лог веб-сайта {{ .name }} успешно разрезан, путь к резервной копии {{ .path }}"
|
||||||
|
|
||||||
|
#toolbox
|
||||||
|
ErrNotExistUser: "Текущий пользователь не существует. Пожалуйста, измените и попробуйте снова!"
|
||||||
|
ErrBanAction: "Установка не выполнена, текущий сервис {{ .name }} недоступен, пожалуйста, проверьте и попробуйте снова!"
|
||||||
|
ErrClamdscanNotFound: "Команда clamdscan не обнаружена, пожалуйста, обратитесь к документации для установки!"
|
||||||
|
|
||||||
|
#waf
|
||||||
|
ErrScope: "Изменение этой конфигурации не поддерживается"
|
||||||
|
ErrStateChange: "Не удалось изменить состояние"
|
||||||
|
ErrRuleExist: "Правило уже существует"
|
||||||
|
ErrRuleNotExist: "Правило не существует"
|
||||||
|
ErrParseIP: "Ошибка формата IP"
|
||||||
|
ErrDefaultIP: "default — зарезервированное имя, пожалуйста, измените на другое имя"
|
||||||
|
ErrGroupInUse: "IP-группа используется в черно/белом списке и не может быть удалена"
|
||||||
|
ErrGroupExist: "Имя IP-группы уже существует"
|
||||||
|
ErrIPRange: "Неверный диапазон IP"
|
||||||
|
ErrIPExist: "IP уже существует"
|
||||||
|
|
||||||
|
#license
|
||||||
|
ErrLicense: "Ошибка формата лицензии, пожалуйста, проверьте и попробуйте снова!"
|
||||||
|
ErrLicenseCheck: "Проверка лицензии не выполнена, пожалуйста, проверьте и попробуйте снова!"
|
||||||
|
ErrLicenseSave: "Не удалось сохранить информацию о лицензии, ошибка {{ .err }}, пожалуйста, попробуйте снова!"
|
||||||
|
ErrLicenseSync: "Не удалось синхронизировать информацию о лицензии, в базе данных не обнаружена информация о лицензии!"
|
||||||
|
ErrXpackNotFound: "Этот раздел является функцией профессионального издания, пожалуйста, сначала импортируйте лицензию в интерфейсе Настройки панели — Лицензия"
|
||||||
|
ErrXpackNotActive: "Этот раздел является функцией профессионального издания, пожалуйста, сначала синхронизируйте статус лицензии в интерфейсе Настройки панели — Лицензия"
|
||||||
|
ErrXpackOutOfDate: "Текущая лицензия истекла, пожалуйста, повторно импортируйте лицензию в интерфейсе Настройки панели — Лицензия"
|
||||||
|
ErrXpackLost: "Лицензия достигла максимального числа попыток повторной попытки. Пожалуйста, перейдите на страницу [Настройки] [Лицензия] и вручную нажмите кнопку синхронизации, чтобы обеспечить корректную работу функций профессиональной версии."
|
||||||
|
ErrXpackTimeout: "Превышено время ожидания запроса, возможно, нестабильное сетевое соединение, пожалуйста, повторите попытку позже!"
|
||||||
|
|
||||||
|
#license
|
||||||
|
ErrAlert: "Ошибка формата информации об оповещении, пожалуйста, проверьте и попробуйте снова!"
|
||||||
|
ErrAlertPush: "Ошибка отправки оповещения, пожалуйста, проверьте и попробуйте снова!"
|
||||||
|
ErrAlertSave: "Ошибка сохранения оповещения, пожалуйста, проверьте и попробуйте снова!"
|
||||||
|
ErrAlertSync: "Ошибка синхронизации оповещения, пожалуйста, проверьте и попробуйте снова!"
|
||||||
|
ErrAlertRemote: "Ошибка удаленного оповещения, пожалуйста, проверьте и попробуйте снова!"
|
||||||
|
|
||||||
|
#cmd
|
||||||
|
AppVersion: "Версия приложения"
|
||||||
|
AppCommands: "Команды, связанные с приложением"
|
||||||
|
AppInit: "Инициализировать приложение"
|
||||||
|
AppKeyVal: "Ключ приложения (поддерживает только английский)"
|
||||||
|
AppCreateFileErr: "Не удалось создать файл {{ .name }} {{ .err }}"
|
||||||
|
AppCreateDirErr: "Не удалось создать папку {{ .name }} {{ .err }}"
|
||||||
|
AppMissKey: "Отсутствует ключ приложения, используйте -k для указания"
|
||||||
|
AppMissVersion: "Отсутствует версия приложения, используйте -v для указания"
|
||||||
|
AppVersionExist: "Версия уже существует!"
|
||||||
|
AppCreateSuccessful: "Создание прошло успешно!"
|
||||||
|
AppWriteErr: "Ошибка записи файла {{ .name }} {{ .err }}"
|
||||||
|
SudoHelper: "Пожалуйста, используйте {{ .cmd }} или переключитесь на пользователя root"
|
||||||
|
ListenIPCommands: "Переключить IP прослушивания"
|
||||||
|
ListenIPv4: "Прослушивать IPv4"
|
||||||
|
ListenIPv6: "Прослушивать IPv6"
|
||||||
|
ListenChangeSuccessful: "Переключение успешно! Теперь прослушивается {{ .value }}"
|
||||||
|
ResetCommands: "Сбросить информацию системы"
|
||||||
|
ResetMFA: "Отменить двухфакторную аутентификацию 1Panel"
|
||||||
|
ResetHttps: "Отменить вход в 1Panel по https"
|
||||||
|
ResetEntrance: "Отменить безопасный вход в 1Panel"
|
||||||
|
ResetIPs: "Отменить авторизованные IP-ограничения 1Panel"
|
||||||
|
ResetDomain: "Отменить привязку домена 1Panel"
|
||||||
|
RestoreCommands: "Откатить сервис и данные 1Panel"
|
||||||
|
RestoreNoSuchFile: "Нет доступных файлов для отката"
|
||||||
|
RestoreStep1: "(1/5) Начало отката сервиса и данных 1Panel из каталога {{ .name }}..."
|
||||||
|
RestoreStep2: "(2/5) Откат бинарного файла 1Panel успешен"
|
||||||
|
RestoreStep3: "(3/5) Откат скрипта 1Panel успешен"
|
||||||
|
RestoreStep4: "(4/5) Откат сервиса 1Panel успешен"
|
||||||
|
RestoreStep5: "(5/5) Откат данных 1Panel успешен"
|
||||||
|
RestoreSuccessful: "Откат успешен! Перезапуск службы, пожалуйста, подождите..."
|
||||||
|
UpdateCommands: "Обновить информацию панели"
|
||||||
|
UpdateUser: "Обновить пользователя панели"
|
||||||
|
UpdatePassword: "Обновить пароль панели"
|
||||||
|
UpdatePort: "Обновить порт панели"
|
||||||
|
UpdateUserNull: "Ошибка: пользователь панели пуст!"
|
||||||
|
UpdateUserBlank: "Ошибка: пользователь панели содержит пробелы!"
|
||||||
|
UpdateUserFormat: "Ошибка: неверный формат пользователя панели! Поддерживаются только английский, китайский, цифры и , длина 3-30"
|
||||||
|
UpdateUserErr: "Ошибка: не удалось обновить пользователя панели, {{ .err }}"
|
||||||
|
UpdateSuccessful: "Обновление успешно!"
|
||||||
|
UpdateUserResult: "Пользователь панели: {{ .name }}"
|
||||||
|
UpdatePasswordRead: "Ошибка: не удалось прочитать информацию о пароле панели, {{ .err }}"
|
||||||
|
UpdatePasswordNull: "Ошибка: пароль панели пуст!"
|
||||||
|
UpdateUPasswordBlank: "Ошибка: пароль панели содержит пробелы!"
|
||||||
|
UpdatePasswordFormat: "Ошибка: пароль панели поддерживает только буквы, цифры, специальные символы !@#$%* ,., длина 8-30!"
|
||||||
|
UpdatePasswordLen: "Ошибка: Пожалуйста, введите пароль длиной более 6 символов!"
|
||||||
|
UpdatePasswordRe: "Подтвердите пароль:"
|
||||||
|
UpdatePasswordErr: "Ошибка: не удалось обновить пароль панели, {{ .err }}"
|
||||||
|
UpdatePasswordSame: "Ошибка: два пароля не совпадают, пожалуйста, проверьте и попробуйте снова!"
|
||||||
|
UpdatePasswordResult: "Пароль панели: {{ .name }}"
|
||||||
|
UpdatePortFormat: "Ошибка: введенный номер порта должен быть между 1 и 65535!"
|
||||||
|
UpdatePortUsed: "Ошибка: номер порта уже используется, пожалуйста, проверьте и попробуйте снова!"
|
||||||
|
UpdatePortErr: "Ошибка: не удалось обновить порт панели, {{ .err }}"
|
||||||
|
UpdatePortResult: "Порт панели: {{ .name }}"
|
||||||
|
UpdatePortFirewallAdd: "Не удалось добавить правило порта брандмауэра, {{ .err }}, пожалуйста, вручную добавьте порт {{ .name }} в правила брандмауэра."
|
||||||
|
UpdatePortFirewallDel: "Ошибка: не удалось удалить порт брандмауэра, {{ .err }}"
|
||||||
|
UpdatePortFirewallReload: "Не удалось перезагрузить брандмауэр, {{ .err }}, пожалуйста, вручную перезагрузите брандмауэр."
|
||||||
|
UserInfo: "Получить информацию панели"
|
||||||
|
UserInfoAddr: "Адрес панели: "
|
||||||
|
UserInfoPassHelp: "Подсказка: чтобы изменить пароль, вы можете выполнить команду: "
|
||||||
|
DBConnErr: "Ошибка: не удалось инициализировать подключение к базе данных, {{ .err }}"
|
||||||
|
SystemVersion: "версия: "
|
||||||
|
SystemMode: "режим: "
|
|
@ -2,6 +2,7 @@ import { createI18n } from 'vue-i18n';
|
||||||
import zh from './modules/zh';
|
import zh from './modules/zh';
|
||||||
import tw from './modules/tw';
|
import tw from './modules/tw';
|
||||||
import en from './modules/en';
|
import en from './modules/en';
|
||||||
|
import ru from './modules/ru';
|
||||||
|
|
||||||
const i18n = createI18n({
|
const i18n = createI18n({
|
||||||
legacy: false,
|
legacy: false,
|
||||||
|
@ -12,6 +13,7 @@ const i18n = createI18n({
|
||||||
zh,
|
zh,
|
||||||
tw,
|
tw,
|
||||||
en,
|
en,
|
||||||
|
ru,
|
||||||
},
|
},
|
||||||
warnHtmlMessage: false,
|
warnHtmlMessage: false,
|
||||||
});
|
});
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1,5 +1,5 @@
|
||||||
<template>
|
<template>
|
||||||
<el-row :gutter="10">
|
<el-row :gutter="10" class="status-container">
|
||||||
<el-col :xs="12" :sm="12" :md="6" :lg="6" :xl="6" align="center">
|
<el-col :xs="12" :sm="12" :md="6" :lg="6" :xl="6" align="center">
|
||||||
<el-popover placement="bottom" :width="loadWidth()" trigger="hover" v-if="chartsOption['cpu']">
|
<el-popover placement="bottom" :width="loadWidth()" trigger="hover" v-if="chartsOption['cpu']">
|
||||||
<div>
|
<div>
|
||||||
|
@ -52,7 +52,7 @@
|
||||||
</span>
|
</span>
|
||||||
</el-col>
|
</el-col>
|
||||||
<el-col :xs="12" :sm="12" :md="6" :lg="6" :xl="6" align="center">
|
<el-col :xs="12" :sm="12" :md="6" :lg="6" :xl="6" align="center">
|
||||||
<el-popover placement="bottom" :width="160" trigger="hover" v-if="chartsOption['memory']">
|
<el-popover placement="bottom" :width="200" trigger="hover" v-if="chartsOption['memory']">
|
||||||
<el-tag style="font-weight: 500">{{ $t('home.mem') }}:</el-tag>
|
<el-tag style="font-weight: 500">{{ $t('home.mem') }}:</el-tag>
|
||||||
<el-tag class="tagClass">{{ $t('home.total') }}: {{ computeSize(currentInfo.memoryTotal) }}</el-tag>
|
<el-tag class="tagClass">{{ $t('home.total') }}: {{ computeSize(currentInfo.memoryTotal) }}</el-tag>
|
||||||
<el-tag class="tagClass">{{ $t('home.used') }}: {{ computeSize(currentInfo.memoryUsed) }}</el-tag>
|
<el-tag class="tagClass">{{ $t('home.used') }}: {{ computeSize(currentInfo.memoryUsed) }}</el-tag>
|
||||||
|
@ -431,6 +431,39 @@ defineExpose({
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style scoped lang="scss">
|
<style scoped lang="scss">
|
||||||
|
.status-container {
|
||||||
|
:deep(.el-button) {
|
||||||
|
min-width: 180px;
|
||||||
|
padding: 8px 16px;
|
||||||
|
height: auto;
|
||||||
|
white-space: normal;
|
||||||
|
line-height: 1.5;
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
:deep(.el-tag) {
|
||||||
|
min-width: 180px;
|
||||||
|
padding: 8px 12px;
|
||||||
|
height: auto;
|
||||||
|
white-space: normal;
|
||||||
|
line-height: 1.5;
|
||||||
|
margin: 4px;
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
:deep(.el-button--primary) {
|
||||||
|
background-color: var(--el-color-primary);
|
||||||
|
&.is-plain {
|
||||||
|
background: var(--el-color-primary-light-9);
|
||||||
|
color: var(--el-color-primary);
|
||||||
|
&:hover {
|
||||||
|
background: var(--el-color-primary);
|
||||||
|
color: white;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
.cpuModeTag {
|
.cpuModeTag {
|
||||||
justify-content: flex-start !important;
|
justify-content: flex-start !important;
|
||||||
text-align: left !important;
|
text-align: left !important;
|
||||||
|
@ -445,6 +478,10 @@ defineExpose({
|
||||||
}
|
}
|
||||||
.tagClass {
|
.tagClass {
|
||||||
margin-top: 3px;
|
margin-top: 3px;
|
||||||
|
min-width: 140px;
|
||||||
|
white-space: normal;
|
||||||
|
height: auto;
|
||||||
|
line-height: 1.5;
|
||||||
}
|
}
|
||||||
|
|
||||||
.tagCPUClass {
|
.tagCPUClass {
|
||||||
|
@ -460,6 +497,14 @@ defineExpose({
|
||||||
margin-top: 28%;
|
margin-top: 28%;
|
||||||
font-size: 14px;
|
font-size: 14px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.input-help {
|
||||||
|
display: inline-block;
|
||||||
|
min-width: 120px;
|
||||||
|
white-space: normal;
|
||||||
|
line-height: 1.2;
|
||||||
|
padding: 2px 4px;
|
||||||
|
}
|
||||||
.nameTag {
|
.nameTag {
|
||||||
margin-top: 3px;
|
margin-top: 3px;
|
||||||
height: auto;
|
height: auto;
|
||||||
|
|
|
@ -55,12 +55,16 @@
|
||||||
<el-dropdown-item v-if="globalStore.isIntl" command="en">
|
<el-dropdown-item v-if="globalStore.isIntl" command="en">
|
||||||
English
|
English
|
||||||
</el-dropdown-item>
|
</el-dropdown-item>
|
||||||
|
<el-dropdown-item v-if="globalStore.isIntl" command="ru">
|
||||||
|
Русский
|
||||||
|
</el-dropdown-item>
|
||||||
<el-dropdown-item command="zh">中文(简体)</el-dropdown-item>
|
<el-dropdown-item command="zh">中文(简体)</el-dropdown-item>
|
||||||
<el-dropdown-item command="tw">中文(繁體)</el-dropdown-item>
|
<el-dropdown-item command="tw">中文(繁體)</el-dropdown-item>
|
||||||
<el-dropdown-item v-if="!globalStore.isIntl" command="en">
|
<el-dropdown-item v-if="!globalStore.isIntl" command="en">
|
||||||
English
|
English
|
||||||
</el-dropdown-item>
|
</el-dropdown-item>
|
||||||
</el-dropdown-menu>
|
</el-dropdown-menu>
|
||||||
|
<el-dropdown-item v-if="!globalStore.isIntl" command="ru">Русский</el-dropdown-item>
|
||||||
</template>
|
</template>
|
||||||
</el-dropdown>
|
</el-dropdown>
|
||||||
</div>
|
</div>
|
||||||
|
@ -272,6 +276,8 @@ function handleCommand(command: string) {
|
||||||
dropdownText.value = 'English';
|
dropdownText.value = 'English';
|
||||||
} else if (command === 'tw') {
|
} else if (command === 'tw') {
|
||||||
dropdownText.value = '中文(繁體)';
|
dropdownText.value = '中文(繁體)';
|
||||||
|
} else if (command === 'ru') {
|
||||||
|
dropdownText.value = 'Русский';
|
||||||
}
|
}
|
||||||
nextTick(() => {
|
nextTick(() => {
|
||||||
loginFormRef.value.clearValidate();
|
loginFormRef.value.clearValidate();
|
||||||
|
|
|
@ -78,9 +78,11 @@
|
||||||
v-model="form.language"
|
v-model="form.language"
|
||||||
>
|
>
|
||||||
<el-radio v-if="globalStore.isIntl" value="en">English</el-radio>
|
<el-radio v-if="globalStore.isIntl" value="en">English</el-radio>
|
||||||
|
<el-radio v-if="globalStore.isIntl" value="ru">Русский</el-radio>
|
||||||
<el-radio value="zh">中文(简体)</el-radio>
|
<el-radio value="zh">中文(简体)</el-radio>
|
||||||
<el-radio value="tw">中文(繁體)</el-radio>
|
<el-radio value="tw">中文(繁體)</el-radio>
|
||||||
<el-radio v-if="!globalStore.isIntl" value="en">English</el-radio>
|
<el-radio v-if="!globalStore.isIntl" value="en">English</el-radio>
|
||||||
|
<el-radio v-if="!globalStore.isIntl" value="ru">Русский</el-radio>
|
||||||
</el-radio-group>
|
</el-radio-group>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue