feat:Support logging in with oidc and saml2 (#13441)

* feat(auth): implement OIDC authentication endpoints and error handling

* feat(auth): add OIDC provider discovery endpoint and related functionality

* feat(auth): add SAML2 authentication support and related functionality

* feat(auth): add LDAP authentication support and related functionality

* fix(auth): improve login keydown handler for better event handling
This commit is contained in:
2026-08-03 13:43:01 +08:00
committed by GitHub
parent 16e3d496eb
commit be672d604f
61 changed files with 7900 additions and 1736 deletions

View File

@@ -142,7 +142,7 @@ PullImageSuccess: 'Descarga de imagen exitosa'
AppStoreSyncSuccess: 'Sincronización de la tienda de aplicaciones exitosa'
SyncAppDetail: 'Sincronizar configuración de la aplicación'
AppVersionNotMatch: 'La aplicación {{ .name }} requiere una versión superior de 1Panel, se omite la sincronización'
MoveSiteDir: 'La actualización actual requiere migrar el directorio del sitio web OpenResty'
MoveSiteDir: 'Se detectó un cambio en el directorio del sitio web. Es necesario migrar el directorio de OpenResty a {{ .name }}'
MoveSiteDirSuccess: 'Migración del directorio del sitio exitosa'
DeleteRuntimePHP: 'Eliminar entorno de ejecución PHP'
CustomAppStoreFileValid: 'Los paquetes de la tienda de aplicaciones deben estar en formato.tar.gz'
@@ -192,7 +192,7 @@ ErrSourcePathNotFound: 'El directorio fuente no existe'
ErrFavoriteExist: 'Esta ruta ya ha sido marcada como favorita'
ErrInvalidChar: 'No se permiten caracteres ilegales'
ErrPathNotDelete: 'No se puede eliminar el directorio seleccionado'
ErrLogFileToLarge: 'Log file exceeds 500 MB'
ErrLogFileToLarge: 'El archivo de registro supera los 500 MB y no se puede abrir'
FileDropFailed: 'Error al limpiar el archivo {{ .name }}: {{ .err }}'
FileDropSuccess: 'Archivo {{ .name }} limpiado correctamente, {{ .count }} archivos eliminados, {{ .size }} de espacio liberado'
FileDropSum: 'Limpieza de archivos completada, total {{ .count }} archivos eliminados, {{ .size }} de espacio liberado'
@@ -242,7 +242,7 @@ ErrEabKidOrEabHmacKeyCannotBlank: 'EabKid o EabHmacKey no pueden estar en blanco
ErrOpenrestyNotFound: 'El modo HTTP requiere OpenResty'
ApplySSLStart: 'Iniciando solicitud de certificado, dominio [{{ .domain }}] método de solicitud [{{ .type }}]'
dnsAccount: 'DNS Automático'
dnsManual: 'DNS Manual'
dnsManual: 'DNS manual'
http: 'HTTP'
ApplySSLFailed: 'Solicitud de certificado para [{{ .domain }}] fallida, {{ .detail }}'
ApplySSLSuccess: 'Solicitud de certificado para [{{ .domain }}] exitosa'
@@ -346,7 +346,7 @@ ErrUserFindErr: 'Búsqueda del usuario {{ .name }} fallida {{ .err }}'
# tarea programada
CutWebsiteLogSuccess: 'Log del sitio web {{ .name }} cortado con éxito, ruta de respaldo {{ .path }}'
HandleShell: 'Ejecutar script {{ .name }}'
HandleCurl: 'URL {{ .name }} にアクセス'
HandleCurl: 'Acceder a la URL {{ .name }}'
HandleNtpSync: 'Sincronizar hora del sistema'
HandleSystemClean: 'Limpiar caché del sistema'
SystemLog: 'Log del sistema'
@@ -465,7 +465,7 @@ TaskBackup: 'Respaldar'
TaskRecover: 'Recuperar'
TaskRollback: 'Revertir'
TaskPull: 'Descargar'
TaskCommit: 'Commit'
TaskCommit: 'Crear imagen'
TaskBuild: 'Construir'
TaskPush: 'Enviar'
TaskClean: 'Limpieza'

View File

@@ -436,7 +436,7 @@ allow: 'مجاز'
deny: 'ممنوع'
OpenrestyNotFound: 'OpenResty نصب نشده است'
remoteIpIsNull: "لیست IP خالی است"
OpenrestyVersionErr: 'نسخه OpenResty بسیار پایین است؛ به ۱.۲۷.۱.۲-۲-۲-focal ارتقاء دهید'
OpenrestyVersionErr: 'نسخه OpenResty بسیار پایین است؛ به 1.27.1.2-2-2-focal ارتقاء دهید'
ErrFileTooLarge: 'فایل بزرگتر از ۱ مگابایت است و قابل بارگذاری نیست'
# وظیفه

View File

@@ -113,7 +113,7 @@ ErrPortInOtherApp: '{{ .port }} 포트는 이미 {{ .apps }} 애플리케이션
ErrDbUserNotValid: '기존 데이터베이스, 사용자 이름 및 비밀번호가 일치하지 않습니다'
ErrMysqlUserUsedByApps: '이 데이터베이스 사용자는 [{{ .detail }}]에서 사용 중이므로 호스트 변경, 삭제 또는 권한 해제를 할 수 없습니다'
ErrUpdateBuWebsite: '응용 프로그램이 성공적으로 업데이트되었지만, 웹사이트 구성 파일 수정에 실패했습니다. 구성을 확인하세요'
Err1PanelNetworkFailed: '기본 컨테이너 네트워크 생성에 실패했습니다 {{ .세부 사항 }}'
Err1PanelNetworkFailed: '기본 컨테이너 네트워크 생성에 실패했습니다 {{ .detail }}'
ErrFileParse: '응용 프로그램 docker-compose 파일 구문 분석에 실패했습니다'
ErrInstallDirNotFound: '설치 디렉토리가 존재하지 않습니다. 제거를 원하실 경우 강제 제거 를 선택해주세요.'
AppStoreIsUpToDate: '앱 스토어가 이미 최신 버전입니다'

View File

@@ -276,7 +276,7 @@ ErrPortRules: 'ຈຳນວນພອດບໍ່ກົງກັນ'
ErrPgImagePull: 'ດຶງຮູບພາບເກີນກຳນົດເວລາ; ກະລຸນາກຳນົດຄ່າການເລັ່ງ (Acceleration) ຫຼື ດຶງ {{ .name }} ດ້ວຍຕົນເອງ'
PruneHelper: "ທຳຄວາມສະອາດ {{ .name }} ຄືນພື້ນທີ່ດິສກ໌ {{ .size }}"
ImageRemoveHelper: "ລຶບຮູບພາບ {{ .name }} ແລ້ວ, ຄືນພື້ນທີ່ດິສກ໌ {{ .size }}"
BuildCache: 'Build Cache'
BuildCache: 'ແຄດການສ້າງ'
Volume: 'ວໍລຸມ (Volume)'
Network: "ເຄືອຂ່າຍ"
PruneStart: 'ກຳລັງດຳເນີນການທຳຄວາມສະອາດ'
@@ -417,10 +417,10 @@ captcha: 'ການຢືນຢັນຕົວຕົນ (CAPTCHA)'
fiveSeconds: 'ການຢືນຢັນ 5 ວິນາທີ'
vulnCheck: 'ກົດລະບຽບເພີ່ມເຕີມ'
acl: 'ກົດລະບຽບປັບແຕ່ງເອງ'
sql: 'SQL injection'
sql: 'ການໂຈມຕີແບບສອດແຊກ SQL'
cc: 'ຂີດຈຳກັດຄວາມຖີ່ຂອງການເຂົ້າເຖິງ'
defaultUrlBlack: 'ກົດລະບຽບ URL'
sqlInject: 'SQL injection'
sqlInject: 'ການໂຈມຕີແບບສອດແຊກ SQL'
ErrDBNotExist: 'ຖານຂໍ້ມູນບໍ່ມີຢູ່'
allow: 'ອະນຸຍາດ'
deny: 'ປະຕິເສດ'
@@ -464,7 +464,7 @@ TaskImport: "ນຳເຂົ້າ"
TaskExport: "ສົ່ງອອກ"
Website: 'ເວັບໄຊ'
App: 'ແອັບພລິເຄຊັນ'
Runtime: 'Runtime'
Runtime: 'ສະພາບແວດລ້ອມຣັນທາມ'
Database: 'ຖານຂໍ້ມູນ'
ConfigFTP: 'ສ້າງຜູ້ໃຊ້ FTP {{ .name }}'
ConfigOpenresty: 'ສ້າງໄຟລ໌ການຕັ້ງຄ່າ OpenResty'
@@ -485,7 +485,7 @@ Compose: 'Compose'
Container: 'ຄອນເທນເນີ'
AppLink: 'ແອັບພລິເຄຊັນທີ່ເຊື່ອມໂຍງ'
EnableSSL: 'ເປີດໃຊ້ HTTPS'
AppStore: 'App Store'
AppStore: 'ຮ້ານແອັບ'
TaskSync: 'ຊິງຄ໌'
LocalApp: 'ແອັບພລິເຄຊັນພາຍໃນເຄື່ອງ'
SubTask: 'ວຽກຍ່ອຍ'

View File

@@ -164,7 +164,7 @@ ErrDatabaseNotFound: 'Pangkalan data {{ .name }} tidak wujud'
# SSH
ExportIP: 'IP Log Masuk'
ExportArea: 'Lokasi'
ExportPort: 'Port'
ExportPort: 'Nombor port'
ExportAuthMode: 'Kaedah Log Masuk'
ExportUser: 'Pengguna'
ExportStatus: 'Status Log Masuk'
@@ -216,7 +216,7 @@ ErrWebsiteDir: 'Sila pilih direktori dalam direktori laman web.'
ErrComposerFileNotFound: 'Fail composer.json tidak wujud'
ErrRuntimeNoPort: 'Persekitaran runtime tidak diset dengan port, sila edit persekitaran runtime terlebih dahulu.'
ErrRuntimeProjectDirContainsCodeDir: 'Direktori runtime mengandungi direktori projek yang dipilih. Sila pilih direktori projek lain dan cipta semula.'
Status: 'Status'
Status: 'Keadaan'
start: 'Mulakan'
stop: 'Berhenti'
restart: 'Mulakan Semula'
@@ -241,7 +241,7 @@ ErrSSLCertificateFormat: 'Format fail sijil tidak betul, sila gunakan format pem
ErrEabKidOrEabHmacKeyCannotBlank: 'EabKid atau EabHmacKey tidak boleh kosong'
ErrOpenrestyNotFound: 'Mod HTTP memerlukan OpenResty dipasang terlebih dahulu'
ApplySSLStart: 'Mula memohon sijil, nama domain [{{ .domain }}] kaedah permohonan [{{ .type }}]'
dnsAccount: 'DNS Auto'
dnsAccount: 'DNS automatik'
dnsManual: 'Manual DNS'
http: 'HTTP'
ApplySSLFailed: 'Permohonan untuk sijil [{{ .domain }}] gagal, {{ .detail }}'
@@ -400,7 +400,7 @@ urlHelper: 'URL Terlarang'
dirFilter: 'Penapis direktori'
xss: 'XSS'
phpExec: 'Pelaksanaan skrip PHP'
oneWordTrojan: 'One Word Trojan'
oneWordTrojan: 'Trojan satu baris'
appFilter: 'Gunakan penapisan direktori berbahaya'
webShell: 'Webshell'
args: 'Peraturan parameter'
@@ -463,14 +463,14 @@ TaskRestart: 'Mulakan semula'
TaskProtect: 'Lindungi'
TaskBackup: 'Sandaran'
TaskRecover: 'Pulihkan'
TaskRollback: 'Rollback'
TaskRollback: 'Pulangkan semula'
TaskPull: 'Tarik'
TaskCommit: 'Komit'
TaskBuild: 'Bina'
TaskPush: 'Hantar'
TaskClean: 'Pembersihan'
TaskHandle: 'Laksanakan'
TaskImport: 'Import'
TaskImport: 'Import data'
TaskExport: 'Eksport'
Website: 'Laman web'
App: 'Aplikasi'
@@ -495,7 +495,7 @@ Compose: 'Orkestrasi'
Container: 'Bekas'
AppLink: 'Aplikasi Terpaut'
EnableSSL: 'Dayakan HTTPS'
AppStore: 'App Store'
AppStore: 'Kedai aplikasi'
TaskSync: 'Segerakkan'
LocalApp: 'Aplikasi Tempatan'
SubTask: 'Subtugas'
@@ -516,7 +516,7 @@ OllamaModelSize: 'Dapatkan saiz model Ollama {{ .name }}'
AIBenchmarkRun: "Jalankan penanda aras AI"
# tugas - syot kilat
Snapshot: 'Snapshot'
Snapshot: 'Syot kilat'
SnapDBInfo: 'Tulis maklumat pangkalan data 1Panel'
SnapCopy: 'Salin fail & direktori {{ .name }}'
SnapNewDB: 'Mulakan sambungan {{ .name }} pangkalan data'
@@ -557,7 +557,7 @@ RecoverWebsite: 'Pulihkan direktori tapak web'
RecoverAppImage: 'Pulihkan sandaran imej syot kilat'
RecoverCompose: 'Pulihkan kandungan komposer lain'
RecoverComposeList: 'Dapatkan semua komposer untuk dipulihkan'
RecoverComposeItem: 'Recover compose {{ .name }}'
RecoverComposeItem: 'Pulihkan orkestrasi {{ .name }}'
RecoverAppEmpty: 'Tiada sandaran imej aplikasi ditemui dalam fail syot kilat'
RecoverBaseData: 'Pulihkan data asas dan fail'
RecoverDaemonJsonEmpty: 'Kedua-dua fail syot kilat dan mesin semasa tidak mempunyai fail daemon.json konfigurasi bekas'

View File

@@ -113,7 +113,7 @@ ErrPortInOtherApp: 'A porta {{ .port }} já está ocupada pelo aplicativo {{ .ap
ErrDbUserNotValid: 'Banco de dados existente, nome de usuário e senha não correspondem'
ErrMysqlUserUsedByApps: 'Este usuário do banco de dados está sendo usado por [{{ .detail }}]; seu host não pode ser alterado, e ele não pode ser excluído nem ter sua autorização revogada'
ErrUpdateBuWebsite: 'O aplicativo foi atualizado com sucesso, mas a modificação do arquivo de configuração do site falhou., verifique a configuração'
Err1PanelNetworkFailed: 'Falha na criação da rede de contêiner padrão {{ .detalhe }}'
Err1PanelNetworkFailed: 'Falha na criação da rede de contêiner padrão {{ .detail }}'
ErrFileParse: 'Falha na análise do arquivo docker-compose do aplicativo'
ErrInstallDirNotFound: 'O diretório de instalação não existe. Se precisar desinstalar, selecione Forçar desinstalação'
AppStoreIsUpToDate: 'A loja de aplicativos já é a versão mais recente'
@@ -192,7 +192,7 @@ ErrSourcePathNotFound: 'O diretório de origem não existe'
ErrFavoriteExist: 'Este caminho já foi favorito'
ErrInvalidChar: 'Caracteres ilegais não são permitidos'
ErrPathNotDelete: 'O diretório selecionado não pode ser excluído'
ErrLogFileToLarge: 'Fail log melebihi 500MB, tidak boleh dibuka'
ErrLogFileToLarge: 'O arquivo de log excede 500 MB e não pode ser aberto'
FileDropFailed: 'Falha ao limpar arquivo {{ .name }}: {{ .err }}'
FileDropSuccess: 'Arquivo {{ .name }} limpo com sucesso, {{ .count }} arquivos removidos, {{ .size }} de espaço em disco liberado'
FileDropSum: 'Limpeza de arquivos concluída com sucesso, total de {{ .count }} arquivos removidos, total de {{ .size }} de espaço em disco liberado'
@@ -216,7 +216,7 @@ ErrWebsiteDir: ', selecione um diretório dentro do diretório do site.'
ErrComposerFileNotFound: 'O arquivo composer.json não existe'
ErrRuntimeNoPort: 'O ambiente de tempo de execução não está configurado com uma porta, edite o ambiente de tempo de execução primeiro.'
ErrRuntimeProjectDirContainsCodeDir: 'O diretório de execução inclui o diretório de projeto selecionado. Escolha outro diretório de projeto e crie novamente.'
Status: 'Status'
Status: 'Estado'
start: 'Iniciar'
stop: 'Parar'
restart: 'Reiniciar'
@@ -461,11 +461,11 @@ AgentPluginUpdate: 'Atualizar plugin'
AgentPluginUninstall: 'Desinstalar plugin'
TaskRestart: 'Reiniciar'
TaskProtect: 'Proteger'
TaskBackup: 'Backup'
TaskBackup: 'Fazer cópia de segurança'
TaskRecover: 'Recuperar'
TaskRollback: 'Reverter'
TaskPull: 'Puxar'
TaskCommit: 'Commit'
TaskCommit: 'Criar imagem'
TaskBuild: 'Construir'
TaskPush: 'Enviar'
TaskClean: 'Limpeza'

View File

@@ -402,7 +402,7 @@ xss: 'XSS'
phpExec: 'Выполнение PHP-скрипта'
oneWordTrojan: 'Троян из одного слова'
appFilter: 'Применить фильтрацию опасных каталогов'
webShell: 'Be6-оболочка'
webShell: 'Веб-оболочка'
args: 'Правила параметров'
protocolFilter: 'Фильтрация протоколов'
javaFilter: 'Фильтр опасных файлов Java'
@@ -472,7 +472,7 @@ TaskClean: 'Очистка'
TaskHandle: 'Выполнить'
TaskImport: 'Импорт'
TaskExport: 'Экспорт'
Website: 'Be6-сайт'
Website: 'Веб-сайт'
App: 'Приложение'
Runtime: 'Среда выполнения'
Database: 'База данных'

View File

@@ -164,7 +164,7 @@ ErrDatabaseNotFound: '{{ .name }} veritabanı mevcut değil'
# SSH
ExportIP: 'Giriş IP'
ExportArea: 'Konum'
ExportPort: 'Port'
ExportPort: 'Bağlantı noktası'
ExportAuthMode: 'Giriş Yöntemi'
ExportUser: 'Kullanıcı'
ExportStatus: 'Giriş Durumu'

View File

@@ -196,11 +196,19 @@ func (b *BaseApi) PasskeyFinishLogin(c *gin.Context) {
// @Security Timestamp
// @Router /core/auth/logout [post]
func (b *BaseApi) LogOut(c *gin.Context) {
result, prepareErr := xpack.AuthProvider.PrepareLogout(c)
if err := authService.LogOut(c); err != nil {
helper.InternalServer(c, err)
return
}
helper.Success(c)
if prepareErr != nil {
global.LOG.Warnf("prepare external logout failed: %v", prepareErr)
result = &dto.LogoutResult{}
}
if result == nil {
result = &dto.LogoutResult{}
}
helper.SuccessWithData(c, result)
}
// @Tags Auth

View File

@@ -90,6 +90,43 @@ func BeginMFALogin(c *gin.Context, name, entrance, mfaStatus string) *dto.UserLo
return &dto.UserLoginInfo{Name: name, MfaStatus: mfaStatus, MfaSession: mfaSession}
}
func BeginAuthSourceMFALogin(
c *gin.Context,
name, entrance, mfaStatus, authSource string,
authSourceID uint,
authSourceConfigVersion uint64,
) *dto.UserLoginInfo {
ip := common.GetRealClientIP(c)
mfaSession := initauth.GetMFASessionStore().SetWithAuthSource(
name,
entrance,
ip,
authSource,
authSourceID,
authSourceConfigVersion,
)
return &dto.UserLoginInfo{Name: name, MfaStatus: mfaStatus, MfaSession: mfaSession}
}
func BeginAuthSourceMFALoginWithSession(
c *gin.Context,
name, entrance, mfaStatus, authSource string,
authSourceID uint,
authSourceConfigVersion uint64,
externalIssuer, externalNameID, externalNameIDFormat, externalSessionIndex string,
externalSessionExpiresAt time.Time,
externalSessionRequired bool,
) *dto.UserLoginInfo {
ip := common.GetRealClientIP(c)
mfaSession := initauth.GetMFASessionStore().SetWithAuthSourceSession(
name, entrance, ip, authSource, authSourceID, authSourceConfigVersion,
externalIssuer, externalNameID, externalNameIDFormat, externalSessionIndex,
externalSessionExpiresAt,
externalSessionRequired,
)
return &dto.UserLoginInfo{Name: name, MfaStatus: mfaStatus, MfaSession: mfaSession}
}
func VerifyMFALogin(c *gin.Context, sessionID, code, entrance string) (string, string, error) {
settingRepo := repo.NewISettingRepo()
mfaSessions := initauth.GetMFASessionStore()

View File

@@ -13,17 +13,32 @@ type UserLoginInfo struct {
MfaSession string `json:"mfaSession"`
}
// AuthNavigation describes a browser handoff to an external identity provider.
// RedirectURL is used for HTTP-Redirect binding; PostURL and Fields are used
// for an auto-submitted HTTP-POST form.
type AuthNavigation struct {
Binding string `json:"binding"`
RedirectURL string `json:"redirectURL,omitempty"`
PostURL string `json:"postURL,omitempty"`
Fields map[string]string `json:"fields,omitempty"`
}
type LogoutResult struct {
SAML2Navigation *AuthNavigation `json:"saml2Navigation,omitempty"`
}
type PasskeyBeginResponse struct {
SessionID string `json:"sessionId"`
PublicKey interface{} `json:"publicKey"`
}
type Login struct {
Name string `json:"name" validate:"required"`
Password string `json:"password" validate:"required"`
Captcha string `json:"captcha"`
CaptchaID string `json:"captchaID"`
Language string `json:"language" validate:"required,oneof=zh en 'zh-Hant' ko ja ru ms 'pt-BR' tr 'es-ES' fa lo"`
Name string `json:"name" validate:"required"`
Password string `json:"password" validate:"required"`
Captcha string `json:"captcha"`
CaptchaID string `json:"captchaID"`
Language string `json:"language" validate:"required,oneof=zh en 'zh-Hant' ko ja ru ms 'pt-BR' tr 'es-ES' fa lo"`
AuthSource string `json:"authSource,omitempty"`
}
type SystemSetting struct {

View File

@@ -10,6 +10,13 @@ type AgentRepo struct{}
type IAgentRepo interface {
GetWebsiteSSL(opts ...global.DBOption) (model.WebsiteSSL, error)
GetCA(opts ...global.DBOption) (model.WebsiteCA, error)
GetSettingValue(key string) (string, error)
}
func (a *AgentRepo) GetSettingValue(key string) (string, error) {
var setting model.Setting
err := global.AgentDB.Model(&model.Setting{}).Where("key = ?", key).First(&setting).Error
return setting.Value, err
}
func NewIAgentRepo() IAgentRepo {

View File

@@ -4,13 +4,17 @@ go 1.26.1
require (
github.com/1panel-dev/base64Captcha v1.3.8
github.com/beevik/etree v1.5.0
github.com/coreos/go-oidc/v3 v3.20.0
github.com/creack/pty v1.1.24
github.com/crewjam/saml v0.5.1
github.com/fsnotify/fsnotify v1.10.1
github.com/gin-contrib/gzip v1.2.6
github.com/gin-gonic/gin v1.12.0
github.com/glebarez/sqlite v1.11.0
github.com/go-gormigrate/gormigrate/v2 v2.1.6
github.com/go-ldap/ldap/v3 v3.4.14
github.com/go-jose/go-jose/v4 v4.1.4
github.com/go-playground/validator/v10 v10.30.3
github.com/go-resty/resty/v2 v2.17.2
github.com/go-webauthn/webauthn v0.17.4
@@ -18,12 +22,14 @@ require (
github.com/gorilla/websocket v1.5.3
github.com/jinzhu/copier v0.4.0
github.com/johnfercher/maroto/v2 v2.4.0
github.com/mattermost/xml-roundtrip-validator v0.1.0
github.com/nicksnyder/go-i18n/v2 v2.6.1
github.com/oschwald/maxminddb-golang v1.13.1
github.com/patrickmn/go-cache v2.1.0+incompatible
github.com/pkg/errors v0.9.1
github.com/pkg/sftp v1.13.11
github.com/robfig/cron/v3 v3.0.1
github.com/russellhaering/goxmldsig v1.4.0
github.com/shirou/gopsutil/v4 v4.26.6
github.com/sirupsen/logrus v1.9.4
github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e
@@ -35,6 +41,7 @@ require (
github.com/xlzd/gotp v0.1.0
golang.org/x/crypto v0.54.0
golang.org/x/net v0.57.0
golang.org/x/oauth2 v0.36.0
golang.org/x/sys v0.47.0
golang.org/x/term v0.45.0
golang.org/x/text v0.40.0
@@ -77,6 +84,7 @@ require (
github.com/go-webauthn/x v0.2.6 // indirect
github.com/goccy/go-json v0.10.6 // indirect
github.com/goccy/go-yaml v1.19.2 // indirect
github.com/golang-jwt/jwt/v4 v4.5.2 // indirect
github.com/golang-jwt/jwt/v5 v5.3.1 // indirect
github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 // indirect
github.com/google/go-tpm v0.9.8 // indirect
@@ -87,6 +95,7 @@ require (
github.com/jinzhu/inflection v1.0.0 // indirect
github.com/jinzhu/now v1.1.5 // indirect
github.com/johnfercher/go-tree v1.1.0 // indirect
github.com/jonboulle/clockwork v0.2.2 // indirect
github.com/json-iterator/go v1.1.12 // indirect
github.com/klauspost/cpuid/v2 v2.3.0 // indirect
github.com/kr/fs v0.1.0 // indirect

View File

@@ -8,6 +8,9 @@ github.com/KyleBanks/depth v1.2.1 h1:5h8fQADFrWtarTdtDudMmGsC7GPbOAu6RVB3ffsVFHc
github.com/KyleBanks/depth v1.2.1/go.mod h1:jzSb9d0L43HxTQfT+oSA1EEp2q+ne2uh6XgeJcm8brE=
github.com/alexbrainman/sspi v0.0.0-20250919150558-7d374ff0d59e h1:4dAU9FXIyQktpoUAgOJK3OTFc/xug0PCXYCqU0FgDKI=
github.com/alexbrainman/sspi v0.0.0-20250919150558-7d374ff0d59e/go.mod h1:cEWa1LVoE5KvSD9ONXsZrj0z6KqySlCCNKHlLzbqAt4=
github.com/beevik/etree v1.1.0/go.mod h1:r8Aw8JqVegEf0w2fDnATrX9VpkMcyFeM0FhwO62wh+A=
github.com/beevik/etree v1.5.0 h1:iaQZFSDS+3kYZiGoc9uKeOkUY3nYMXOKLl6KIJxiJWs=
github.com/beevik/etree v1.5.0/go.mod h1:gPNJNaBGVZ9AwsidazFZyygnd+0pAU38N4D+WemwKNs=
github.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=
github.com/boombuler/barcode v1.1.0 h1:ChaYjBR63fr4LFyGn8E8nt7dBSt3MiU3zMOZqFvVkHo=
github.com/boombuler/barcode v1.1.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=
@@ -21,9 +24,14 @@ github.com/clipperhouse/uax29/v2 v2.7.0 h1:+gs4oBZ2gPfVrKPthwbMzWZDaAFPGYK72F0NJ
github.com/clipperhouse/uax29/v2 v2.7.0/go.mod h1:EFJ2TJMRUaplDxHKj1qAEhCtQPW2tJSwu5BF98AuoVM=
github.com/cloudwego/base64x v0.1.6 h1:t11wG9AECkCDk5fMSoxmufanudBtJ+/HemLstXDLI2M=
github.com/cloudwego/base64x v0.1.6/go.mod h1:OFcloc187FXDaYHvrNIjxSe8ncn0OOM8gEHfghB2IPU=
github.com/coreos/go-oidc/v3 v3.20.0 h1:EtE0WIBHk03N+DqGkY4+UONzzZHk7amKt6IyNd7OsZE=
github.com/coreos/go-oidc/v3 v3.20.0/go.mod h1:DYCf24+ncYi+XkIH97GY1+dqoRlbaSI26KVTCI9SrY4=
github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g=
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
github.com/creack/pty v1.1.24 h1:bJrF4RRfyJnbTJqzRLHzcGaZK1NeM5kTC9jGgovnR1s=
github.com/creack/pty v1.1.24/go.mod h1:08sCNb52WyoAwi2QDyzUCTgcvVFhUzewun7wtTfvcwE=
github.com/crewjam/saml v0.5.1 h1:g+mfp0CrLuLRZCK793PgJcZeg5dS/0CDwoeAX2zcwNI=
github.com/crewjam/saml v0.5.1/go.mod h1:r0fDkmFe5URDgPrmtH0IYokva6fac3AUdstiPhyEolQ=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
@@ -57,6 +65,8 @@ github.com/go-gormigrate/gormigrate/v2 v2.1.6 h1:VtX+l1Stj2v5RGubVQk0LS/8EPGXR+l
github.com/go-gormigrate/gormigrate/v2 v2.1.6/go.mod h1:PZpedQc4tWaxn6kvXicwhinh3L0seLpMc5ReKRX5id4=
github.com/go-ldap/ldap/v3 v3.4.14 h1:D6PYdEgsaVzsXyr6w/yDC06Ria4uUhWm+Rb+er8lfAs=
github.com/go-ldap/ldap/v3 v3.4.14/go.mod h1:S4eJUMUNjDkE0ZJtIZdybwyb03sGGLW6gxXT1Hs8VKA=
github.com/go-jose/go-jose/v4 v4.1.4 h1:moDMcTHmvE6Groj34emNPLs/qtYXRVcd6S7NHbHz3kA=
github.com/go-jose/go-jose/v4 v4.1.4/go.mod h1:x4oUasVrzR7071A4TnHLGSPpNOm2a21K9Kf04k1rs08=
github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY=
github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0=
github.com/go-openapi/jsonpointer v0.23.0 h1:c25HFTJ6uWGmoe5BQI6p72p4o7KnlWYsy1MeFlAumsw=
@@ -106,6 +116,8 @@ github.com/goccy/go-json v0.10.6 h1:p8HrPJzOakx/mn/bQtjgNjdTcN+/S6FcG2CTtQOrHVU=
github.com/goccy/go-json v0.10.6/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M=
github.com/goccy/go-yaml v1.19.2 h1:PmFC1S6h8ljIz6gMRBopkjP1TVT7xuwrButHID66PoM=
github.com/goccy/go-yaml v1.19.2/go.mod h1:XBurs7gK8ATbW4ZPGKgcbrY1Br56PdM69F7LkFRi1kA=
github.com/golang-jwt/jwt/v4 v4.5.2 h1:YtQM7lnr8iZ+j5q71MGKkNw9Mn7AjHM68uc9g5fXeUI=
github.com/golang-jwt/jwt/v4 v4.5.2/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0=
github.com/golang-jwt/jwt/v5 v5.3.1 h1:kYf81DTWFe7t+1VvL7eS+jKFVWaUnK9cB1qbwn63YCY=
github.com/golang-jwt/jwt/v5 v5.3.1/go.mod h1:fxCRLWMO43lRc8nhHWY6LGqRcf+1gQWArsqaEUEa5bE=
github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 h1:DACJavvAHhabrF08vX0COfcOBJRhZ8lUbR+ZWIs0Y5g=
@@ -158,6 +170,8 @@ github.com/johnfercher/go-tree v1.1.0 h1:L0Fs5jLR1uA2e/CwfHjNdO/Lt4IGQ46QgxarAC1
github.com/johnfercher/go-tree v1.1.0/go.mod h1:DUO6QkXIFh1K7jeGBIkLCZaeUgnkdQAsB64FDSoHswg=
github.com/johnfercher/maroto/v2 v2.4.0 h1:Nc/jA2RCZvNZESrQj41HJOgtkwmerSHd5FUbP4dRrIE=
github.com/johnfercher/maroto/v2 v2.4.0/go.mod h1:Nnxa3g4f+vzdx/u/dUgx/52HnrCOCt5QBPSdeSlkFZQ=
github.com/jonboulle/clockwork v0.2.2 h1:UOGuzwb1PwsrDAObMuhUnj0p5ULPj8V/xJ7Kx9qUBdQ=
github.com/jonboulle/clockwork v0.2.2/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8=
github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=
github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
github.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=
@@ -165,14 +179,21 @@ github.com/klauspost/cpuid/v2 v2.3.0 h1:S4CRMLnYUhGeDFDqkGriYKdfoFlDnMtqTiI/sFzh
github.com/klauspost/cpuid/v2 v2.3.0/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0=
github.com/kr/fs v0.1.0 h1:Jskdu9ieNAYnjxsi0LbQp1ulIKZV1LAFgK1tWhpZgl8=
github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg=
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk=
github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ=
github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI=
github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 h1:6E+4a0GO5zZEnZ81pIr0yLvtUWk2if982qA3F3QD6H4=
github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I=
github.com/mattermost/xml-roundtrip-validator v0.1.0 h1:RXbVD2UAl7A7nOTR4u7E3ILa4IbtvKBHw64LDsmu9hU=
github.com/mattermost/xml-roundtrip-validator v0.1.0/go.mod h1:qccnGMcpgwcNaBnxqpJpWWUiPNr5H3O8eDgGV9gT5To=
github.com/mattn/go-isatty v0.0.21 h1:xYae+lCNBP7QuW4PUnNG61ffM4hVIfm+zUzDuSzYLGs=
github.com/mattn/go-isatty v0.0.21/go.mod h1:ZXfXG4SQHsB/w3ZeOYbR0PrPwLy+n6xiMrJlRFqopa4=
github.com/mattn/go-runewidth v0.0.21 h1:jJKAZiQH+2mIinzCJIaIG9Be1+0NR+5sz/lYEEjdM8w=
@@ -201,6 +222,7 @@ github.com/philhofer/fwd v1.2.0/go.mod h1:RqIHx9QI14HlwKwm98g9Re5prTQ6LdeRQn+gXJ
github.com/phpdave11/gofpdf v1.4.3 h1:M/zHvS8FO3zh9tUd2RCOPEjyuVcs281FCyF22Qlz/IA=
github.com/phpdave11/gofpdf v1.4.3/go.mod h1:MAwzoUIgD3J55u0rxIG2eu37c+XWhBtXSpPAhnQXf/o=
github.com/phpdave11/gofpdi v1.0.15/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=
github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
@@ -218,8 +240,12 @@ github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94
github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo=
github.com/robfig/cron/v3 v3.0.1 h1:WdRxkvbJztn8LMz/QEvLN5sBU+xKpSqwwUO1Pjr4qDs=
github.com/robfig/cron/v3 v3.0.1/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro=
github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc=
github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE=
github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ=
github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog=
github.com/russellhaering/goxmldsig v1.4.0 h1:8UcDh/xGyQiyrW+Fq5t8f+l2DLB1+zlhYzkPUJ7Qhys=
github.com/russellhaering/goxmldsig v1.4.0/go.mod h1:gM4MDENBQf7M+V824SGfyIUVFWydB7n0KkEubVJl+Tw=
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
github.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w=
github.com/sagikazarmark/locafero v0.12.0 h1:/NQhBAkUb4+fH1jivKHWusDYFjMOOKU88eegjfxfHb4=
@@ -251,6 +277,7 @@ github.com/stretchr/objx v0.5.3 h1:jmXUvGomnU1o3W/V5h2VEradbpJDwGrzugQQvL0POH4=
github.com/stretchr/objx v0.5.3/go.mod h1:rDQraq+vQZU7Fde9LOZLr8Tax6zZvy4kuNKF+QYS+U0=
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
@@ -300,6 +327,8 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn
golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
golang.org/x/net v0.57.0 h1:K5+3DljvIuDG9/Jv9rvyMywYNFCQ9RSUY6OOTTkT+tE=
golang.org/x/net v0.57.0/go.mod h1:KpXc8iv+r3XplLAG/f7Jsf9RPszJzdR0f58q9vGOuEU=
golang.org/x/oauth2 v0.36.0 h1:peZ/1z27fi9hUOFCAZaHyrpWG5lwe0RJEEEeH0ThlIs=
golang.org/x/oauth2 v0.36.0/go.mod h1:YDBUJMTkDnJS+A4BP4eZBjCqtokkg1hODuPjwiGPO7Q=
golang.org/x/sync v0.22.0 h1:SZjpbeLmrCk4xhRSZFNZW5gFUeCeFgjekvI/+gfScek=
golang.org/x/sync v0.22.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
@@ -324,11 +353,14 @@ golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8T
google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE=
google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gorm.io/driver/sqlite v1.6.0 h1:WHRRrIiulaPiPFmDcod6prc4l2VGVWHz80KspNsxSfQ=

View File

@@ -42,6 +42,29 @@ ErrPasskeyLimit: "Passkey limit reached (max 5)"
ErrPasskeySession: "Passkey session expired or invalid"
ErrPasskeyDuplicate: "Passkey already exists"
ErrPasskeyVerify: "Passkey verification failed"
ErrOIDCNotEnabled: "OIDC authentication is not enabled"
ErrOIDCConfigInvalid: "OIDC configuration is invalid"
ErrOIDCConfigChanged: "OIDC configuration changed; start authentication again"
ErrOIDCDiscoveryFailed: "Failed to discover the OIDC provider configuration"
ErrOIDCIssuerMismatch: "The OIDC issuer does not match the configured issuer"
ErrOIDCUnsupportedPKCE: "The OIDC provider does not support the required PKCE method"
ErrOIDCUnsupportedSigningAlgorithm: "The OIDC signing algorithm is not supported"
ErrOIDCInvalidState: "The OIDC login state is invalid or has already been used"
ErrOIDCLoginExpired: "The OIDC login request has expired; try again"
ErrOIDCTokenExchange: "Failed to exchange the OIDC authorization code"
ErrOIDCTokenValidation: "Failed to validate the OIDC token"
ErrOIDCUserInfoValidation: "Failed to validate OIDC user information"
ErrOIDCNameClaimMissing: "The configured OIDC user name claim is missing or invalid"
ErrOIDCNameConflictLocal: "The OIDC user name conflicts with a local user"
ErrOIDCNameConflictLDAP: "The OIDC user name conflicts with an LDAP user"
ErrOIDCNameConflictOIDC: "The OIDC user name conflicts with another OIDC identity"
ErrOIDCDefaultRoleInvalid: "The default role configured for OIDC is unavailable"
ErrOIDCPrivateAddressDenied: "The OIDC endpoint address is not allowed by the network security policy"
ErrOIDCTLSValidation: "OIDC TLS certificate validation failed"
ErrOIDCTestExpired: "The OIDC browser test has expired; run the test again"
ErrOIDCLocalCredentialsReadonly: "OIDC user names and passwords are managed by the identity provider and cannot be changed locally."
ErrOIDCPasswordExpirationUnsupported: "OIDC users do not use the local password expiration policy."
ErrOIDCInternal: "OIDC authentication encountered an internal error. Please try again later."
# user and permission
ErrNoSuchUser: "User information not found, check and try again!"
@@ -121,11 +144,11 @@ ErrVMStorageInUse: "Storage pool is in use and cannot be deleted"
ErrVMStorageNameCannotChange: "Storage pool name cannot be changed"
ErrVMStoragePathCannotChange: "Storage pool path cannot be changed"
ErrVMRunning: "Virtual machine is running"
ErrVMLibvirtConnect: "Failed to connect to libvirt"
ErrVMLibvirtConnect: "Failed to connect to libvirt: {{ .detail }}"
ErrVMPermission: "No permission to operate virtual machine: {{ .detail }}"
ErrVMNetworkNotFound: "Virtual machine network does not exist"
ErrVMInvalidPath: "Invalid virtual machine path"
ErrVMInvalidInput: "Invalid virtual machine parameter"
ErrVMNetworkNotFound: "Virtual machine network does not exist: {{ .detail }}"
ErrVMInvalidPath: "Invalid virtual machine path: {{ .detail }}"
ErrVMInvalidInput: "Invalid virtual machine parameter: {{ .detail }}"
ErrVMCommandFailed: "Virtual machine command failed: {{ .err }}"
VMCreateTask: "Create virtual machine [{{ .name }}]"
VMCreateFromTemplateTask: "Create virtual machine [{{ .name }}] from template"
@@ -255,7 +278,7 @@ PushAppInstallTaskToNode: "Push app installation task to node [{{ .name }}]"
AppInstallTask: "App installation task"
PushAppFailed: "Failed to push app installation task"
SkillHubInstallTask: "Install skill [{{ .name }}]"
SkillHubInstallToTarget: "Install skill to target [{{ .name }}]"
SkillHubInstallToTarget: "Install skill [{{ .name }}] to target [{{ .target }}]"
# script library
ScriptLibrary: "Script Library"
@@ -472,3 +495,33 @@ ErrLDAPSyncRunning: "An LDAP synchronization task is already running."
ErrLDAPSyncDirectoryIncomplete: "LDAP returned an incomplete full query result. No user status was changed."
ErrLDAPSyncFailed: "LDAP user synchronization failed."
LDAPSyncSuccess: "LDAP user synchronization completed successfully."
ErrSAML2NotEnabled: "SAML2 authentication is not enabled."
ErrSAML2ConfigInvalid: "The SAML2 configuration is invalid."
ErrSAML2ConfigChanged: "The SAML2 configuration has changed. Start authentication again."
ErrSAML2PanelOriginMissing: "Enter a valid 1Panel public URL containing only scheme, host, and optional port."
ErrSAML2MetadataInvalid: "The IdP Metadata is missing or invalid."
ErrSAML2MetadataURLInvalid: "The IdP Metadata URL or an endpoint in the Metadata is not allowed."
ErrSAML2MetadataFetch: "Failed to load the IdP Metadata."
ErrSAML2MetadataCertificate: "The IdP Metadata does not contain a usable signing certificate."
ErrSAML2KeyPairInvalid: "The SP private key and certificate are invalid or do not match."
ErrSAML2NameAttributeMissing: "The configured SAML2 username attribute is missing or invalid."
ErrSAML2DefaultRoleInvalid: "The default role configured for SAML2 is unavailable."
ErrSAML2SLOUnavailable: "The IdP does not provide a supported Single Logout service."
ErrSAML2TestExpired: "The SAML2 test has expired. Run it again."
ErrSAML2LoginExpired: "The SAML2 login request has expired. Try again."
ErrSAML2InvalidState: "The SAML2 login state is invalid or has already been used."
ErrSAML2RequestBuild: "Failed to build the SAML2 request."
ErrSAML2ResponseInvalid: "The SAML2 response is invalid."
ErrSAML2SignatureInvalid: "The SAML2 signature is invalid."
ErrSAML2Replay: "The SAML2 message has already been used."
ErrSAML2NameIDMissing: "The SAML2 NameID is missing or invalid."
ErrSAML2SessionIndexMissing: "The SAML2 SessionIndex is missing or invalid."
ErrSAML2NameConflictLocal: "The SAML2 username conflicts with a local user."
ErrSAML2NameConflictLDAP: "The SAML2 username conflicts with an LDAP user."
ErrSAML2NameConflictOIDC: "The SAML2 username conflicts with an OIDC user."
ErrSAML2NameConflictSAML2: "The SAML2 username conflicts with another SAML2 identity."
ErrSAML2Internal: "An internal error occurred during SAML2 authentication. Try again later."
ErrSAML2LogoutExpired: "The SAML2 logout request has expired."
ErrSAML2LogoutInvalid: "The SAML2 logout message is invalid."
ErrSAML2LocalCredentialsReadonly: "SAML2 usernames and passwords are managed by the identity provider and cannot be changed locally."
ErrSAML2PasswordExpirationUnsupported: "SAML2 users do not use the local password expiration policy."

View File

@@ -6,7 +6,7 @@ ErrInternalServer: 'Error interno: {{ .detail }}'
ErrInternalServerKey: "Error interno del servidor:"
ErrRecordExist: 'Registro ya existe'
ErrRecordNotFound: 'Registro no encontrado'
ErrStructTransform: 'Error de conversión: {{ .err }}'
ErrStructTransform: 'Error de conversión: {{ .detail }}'
ErrNotSupportType: 'Tipo no soportado: {{ .name }}'
ErrDemoEnvironment: 'No disponible en demo'
ErrCmdTimeout: 'Comando agotó tiempo'
@@ -42,6 +42,29 @@ ErrPasskeyLimit: "Límite de Passkey alcanzado (máximo 5)"
ErrPasskeySession: "La sesión de Passkey ha expirado o no es válida"
ErrPasskeyDuplicate: "Passkey ya existe"
ErrPasskeyVerify: "Error al verificar Passkey"
ErrOIDCNotEnabled: "La autenticación OIDC no está habilitada"
ErrOIDCConfigInvalid: "La configuración de OIDC no es válida"
ErrOIDCConfigChanged: "La configuración de OIDC ha cambiado; inicie la autenticación de nuevo"
ErrOIDCDiscoveryFailed: "No se pudo descubrir la configuración del Provider OIDC"
ErrOIDCIssuerMismatch: "El Issuer de OIDC no coincide con el Issuer configurado"
ErrOIDCUnsupportedPKCE: "El Provider OIDC no admite el método PKCE requerido"
ErrOIDCUnsupportedSigningAlgorithm: "El algoritmo de firma OIDC no es compatible"
ErrOIDCInvalidState: "El estado de inicio de sesión OIDC no es válido o ya se ha utilizado"
ErrOIDCLoginExpired: "La solicitud de inicio de sesión OIDC ha caducado; inténtelo de nuevo"
ErrOIDCTokenExchange: "No se pudo intercambiar el código de autorización OIDC"
ErrOIDCTokenValidation: "No se pudo validar el Token OIDC"
ErrOIDCUserInfoValidation: "No se pudo validar la información del usuario OIDC"
ErrOIDCNameClaimMissing: "El Claim de nombre de usuario OIDC configurado no existe o no es válido"
ErrOIDCNameConflictLocal: "El nombre de usuario OIDC entra en conflicto con un usuario local"
ErrOIDCNameConflictLDAP: "El nombre de usuario OIDC entra en conflicto con un usuario LDAP"
ErrOIDCNameConflictOIDC: "El nombre de usuario OIDC entra en conflicto con otra identidad OIDC"
ErrOIDCDefaultRoleInvalid: "El rol predeterminado configurado para OIDC no está disponible"
ErrOIDCPrivateAddressDenied: "La dirección del Endpoint OIDC no está permitida por la política de seguridad de red"
ErrOIDCTLSValidation: "Error al validar el certificado TLS de OIDC"
ErrOIDCTestExpired: "La prueba de OIDC en el navegador ha caducado; vuelva a ejecutarla"
ErrOIDCLocalCredentialsReadonly: "Los nombres de usuario y las contraseñas OIDC los administra el Provider de identidad y no se pueden cambiar localmente."
ErrOIDCPasswordExpirationUnsupported: "Los usuarios OIDC no utilizan la política local de caducidad de contraseñas."
ErrOIDCInternal: "Se produjo un error interno durante la autenticación OIDC. Inténtelo de nuevo más tarde."
# usuario y permisos
ErrNoSuchUser: "No se encontró la información del usuario. Verifique e intente de nuevo."
@@ -114,12 +137,12 @@ ErrVMNotFound: "La máquina virtual no existe"
ErrVMAlreadyExists: "La máquina virtual ya existe"
ErrVMImageAlreadyExists: "La imagen de la máquina virtual ya existe: {{ .detail }}"
ErrVMStoragePathInUse: "La ruta del pool de almacenamiento ya está usada por [{{ .name }}]"
ErrVMHelperNotFound: "1panel-kvm not found"
ErrVMBridgeManaged: "Bridge name is already managed by libvirt or Docker"
ErrVMNetworkInUse: "Network is in use and cannot be deleted"
ErrVMStorageInUse: "Storage pool is in use and cannot be deleted"
ErrVMStorageNameCannotChange: "Storage pool name cannot be changed"
ErrVMStoragePathCannotChange: "Storage pool path cannot be changed"
ErrVMHelperNotFound: "No se encontró 1panel-kvm"
ErrVMBridgeManaged: "El nombre del bridge ya está administrado por libvirt o Docker"
ErrVMNetworkInUse: "La red está en uso y no se puede eliminar"
ErrVMStorageInUse: "El pool de almacenamiento está en uso y no se puede eliminar"
ErrVMStorageNameCannotChange: "El nombre del pool de almacenamiento no se puede cambiar"
ErrVMStoragePathCannotChange: "La ruta del pool de almacenamiento no se puede cambiar"
ErrVMRunning: "La máquina virtual está en ejecución"
ErrVMLibvirtConnect: "Error al conectar con libvirt: {{ .detail }}"
ErrVMPermission: "Sin permiso para operar la máquina virtual: {{ .detail }}"
@@ -190,7 +213,7 @@ TaskSync: 'Sincronizar'
TaskSyncForNode: "Sincronizar Datos del Nodo"
TaskBackup: "Respaldar"
TaskPush: "Enviar"
TaskRsync: "Sync"
TaskRsync: "Sincronizar"
SuccessStatus: "{{ .name }} correcta"
FailedStatus: "{{ .name }} fallida {{ .err }}"
Start: "Iniciar"
@@ -255,7 +278,7 @@ PushAppInstallTaskToNode: "Enviar tarea de instalación de aplicación al nodo [
AppInstallTask: "Tarea de instalación de aplicación"
PushAppFailed: "Error al enviar tarea de instalación de aplicación"
SkillHubInstallTask: "Instalar skill [{{ .name }}]"
SkillHubInstallToTarget: "Instalar skill en destino [{{ .name }}]"
SkillHubInstallToTarget: "Instalar skill [{{ .name }}] en el destino [{{ .target }}]"
# biblioteca de scripts
ScriptLibrary: "Biblioteca de scripts"
@@ -266,9 +289,9 @@ DownloadPackage: "Descargando paquete de la biblioteca de scripts"
AnalyticCompletion: "Análisis completado, sincronizando con la base de datos..."
# sincronización de nodos
SyncNode: "Sincronizar datos del nodo"
SyncNode: "Sincronizar datos con el nodo {{ .name }}"
LocalName: "El nombre 'local' solo se utiliza para la identificación local del sistema"
SyncPackageData: "Sincronizar datos del paquete [{{ .detail }}]"
SyncPackageData: "Empaquetar los datos de sincronización"
SyncPackageEncrypt: "Encriptación del paquete de datos"
SyncRequest: "Solicitar API de sincronización de nodos"
SyncFailedRetry: "Tiempo de espera en la sincronización de datos del nodo (intento {{ .index }}), reintentando..."
@@ -312,25 +335,25 @@ StartService: "Iniciar servicio"
NoBackupNode: "Actualmente no hay nodo de respaldo. Seleccione uno para guardar e intente de nuevo."
# sincronización de archivos e imágenes de nodo
LocalNodeIpFailed: "Failed to get master node IP. Edit the master node and add IP address and SSH authentication information."
HandlePrivateKey: "Handle node private key"
HandlePublicKey: "Handle node public key"
ExchangeFile: "Start syncing {{ .sourcePath }} from node {{ .source }} to node {{ .dest }}:{{ .destPath }}"
NodeFile: "Node file"
ImageSyncTaskName: "Image sync {{ .count }} images"
SSLSyncTaskName: "Certificate sync {{ .count }} certificates"
AppSyncTaskName: "App sync {{ .name }}"
SSLSyncToNode: "Push certificate [{{ .cert }}] to node [{{ .node }}]"
ImageSyncSave: "Save image {{ .image }}"
ImageSyncSaveTags: "Save image tags {{ .tags }}"
ImageSyncToNode: "Sync image {{ .image }} to node {{ .node }}"
ImageSyncLoad: "Load image {{ .image }} on node {{ .node }}"
ImageSyncClean: "Clean temporary files for image {{ .image }}"
ImageSyncNoTag: "Image {{ .image }} has no tag and will be saved by image ID"
ImageSyncFrontendTagsIgnored: "No tags were found for image {{ .image }} on the source node. Frontend tags were ignored."
ImageSyncHandlePrivateKey: "Handle image sync node private key"
ImageSyncHandlePublicKey: "Handle image sync node public key"
ImageSyncTransfer: "Start transferring image temporary file: {{ .source }}:{{ .sourcePath }} -> {{ .dest }}:{{ .destPath }}"
LocalNodeIpFailed: "No se pudo obtener la IP del nodo principal. Edite el nodo principal y añada la dirección IP y la información de autenticación SSH."
HandlePrivateKey: "Procesar la clave privada del nodo"
HandlePublicKey: "Procesar la clave pública del nodo"
ExchangeFile: "Iniciar la sincronización de {{ .sourcePath }} desde el nodo {{ .source }} al nodo {{ .dest }}:{{ .destPath }}"
NodeFile: "Archivo del nodo"
ImageSyncTaskName: "Sincronizar {{ .count }} imágenes"
SSLSyncTaskName: "Sincronizar {{ .count }} certificados"
AppSyncTaskName: "Sincronizar la aplicación {{ .name }}"
SSLSyncToNode: "Enviar el certificado [{{ .cert }}] al nodo [{{ .node }}]"
ImageSyncSave: "Guardar la imagen {{ .image }}"
ImageSyncSaveTags: "Guardar las etiquetas de la imagen {{ .tags }}"
ImageSyncToNode: "Sincronizar la imagen {{ .image }} con el nodo {{ .node }}"
ImageSyncLoad: "Cargar la imagen {{ .image }} en el nodo {{ .node }}"
ImageSyncClean: "Limpiar los archivos temporales de la imagen {{ .image }}"
ImageSyncNoTag: "La imagen {{ .image }} no tiene etiqueta y se guardará mediante su ID"
ImageSyncFrontendTagsIgnored: "No se encontraron etiquetas para la imagen {{ .image }} en el nodo de origen. Se ignoraron las etiquetas del frontend."
ImageSyncHandlePrivateKey: "Procesar la clave privada del nodo de sincronización de imágenes"
ImageSyncHandlePublicKey: "Procesar la clave pública del nodo de sincronización de imágenes"
ImageSyncTransfer: "Iniciar la transferencia del archivo temporal de la imagen: {{ .source }}:{{ .sourcePath }} -> {{ .dest }}:{{ .destPath }}"
# línea de comandos
SudoHelper: "Por favor use {{ .cmd }} o cambie al usuario root"
@@ -472,3 +495,33 @@ ErrLDAPSyncRunning: "Ya hay una tarea de sincronización LDAP en ejecución."
ErrLDAPSyncDirectoryIncomplete: "LDAP devolvió un resultado incompleto de la consulta completa. No se modificó el estado de ningún usuario."
ErrLDAPSyncFailed: "La sincronización de usuarios LDAP falló."
LDAPSyncSuccess: "La sincronización de usuarios LDAP se completó correctamente."
ErrSAML2NotEnabled: "La autenticación SAML2 no está activada."
ErrSAML2ConfigInvalid: "La configuración de SAML2 no es válida."
ErrSAML2ConfigChanged: "La configuración de SAML2 ha cambiado. Inicie de nuevo la autenticación."
ErrSAML2PanelOriginMissing: "Introduzca una URL pública de 1Panel válida que solo contenga el esquema, el host y un puerto opcional."
ErrSAML2MetadataInvalid: "Faltan los metadatos del IdP o no son válidos."
ErrSAML2MetadataURLInvalid: "La URL de metadatos del IdP o uno de sus puntos de conexión no está permitido."
ErrSAML2MetadataFetch: "No se pudieron cargar los metadatos del IdP."
ErrSAML2MetadataCertificate: "Los metadatos del IdP no contienen un certificado de firma utilizable."
ErrSAML2KeyPairInvalid: "La clave privada y el certificado del SP no son válidos o no coinciden."
ErrSAML2NameAttributeMissing: "Falta el atributo de nombre de usuario SAML2 configurado o no es válido."
ErrSAML2DefaultRoleInvalid: "El rol predeterminado configurado para SAML2 no está disponible."
ErrSAML2SLOUnavailable: "El IdP no proporciona un servicio de cierre de sesión único compatible."
ErrSAML2TestExpired: "La prueba de SAML2 ha caducado. Ejecútela de nuevo."
ErrSAML2LoginExpired: "La solicitud de inicio de sesión SAML2 ha caducado. Inténtelo de nuevo."
ErrSAML2InvalidState: "El estado de inicio de sesión SAML2 no es válido o ya se utilizó."
ErrSAML2RequestBuild: "No se pudo crear la solicitud SAML2."
ErrSAML2ResponseInvalid: "La respuesta SAML2 no es válida."
ErrSAML2SignatureInvalid: "La firma SAML2 no es válida."
ErrSAML2Replay: "El mensaje SAML2 ya se utilizó."
ErrSAML2NameIDMissing: "Falta el NameID de SAML2 o no es válido."
ErrSAML2SessionIndexMissing: "Falta el SessionIndex de SAML2 o no es válido."
ErrSAML2NameConflictLocal: "El nombre de usuario SAML2 entra en conflicto con un usuario local."
ErrSAML2NameConflictLDAP: "El nombre de usuario SAML2 entra en conflicto con un usuario LDAP."
ErrSAML2NameConflictOIDC: "El nombre de usuario SAML2 entra en conflicto con un usuario OIDC."
ErrSAML2NameConflictSAML2: "El nombre de usuario SAML2 entra en conflicto con otra identidad SAML2."
ErrSAML2Internal: "Se produjo un error interno durante la autenticación SAML2. Inténtelo más tarde."
ErrSAML2LogoutExpired: "La solicitud de cierre de sesión SAML2 ha caducado."
ErrSAML2LogoutInvalid: "El mensaje de cierre de sesión SAML2 no es válido."
ErrSAML2LocalCredentialsReadonly: "Los nombres de usuario y las contraseñas SAML2 los gestiona el proveedor de identidad y no pueden modificarse localmente."
ErrSAML2PasswordExpirationUnsupported: "Los usuarios SAML2 no utilizan la política local de caducidad de contraseñas."

View File

@@ -42,6 +42,29 @@ ErrPasskeyLimit: "محدودیت کلید عبور رسیده است (حداکث
ErrPasskeySession: "جلسه کلید عبور منقضی یا نامعتبر است"
ErrPasskeyDuplicate: "کلید عبور از قبل وجود دارد"
ErrPasskeyVerify: "تأیید کلید عبور ناموفق بود"
ErrOIDCNotEnabled: "احراز هویت OIDC فعال نیست"
ErrOIDCConfigInvalid: "پیکربندی OIDC نامعتبر است"
ErrOIDCConfigChanged: "پیکربندی OIDC تغییر کرده است؛ احراز هویت را دوباره آغاز کنید"
ErrOIDCDiscoveryFailed: "کشف پیکربندی Provider OIDC ناموفق بود"
ErrOIDCIssuerMismatch: "Issuer OIDC با Issuer پیکربندی‌شده مطابقت ندارد"
ErrOIDCUnsupportedPKCE: "Provider OIDC از روش PKCE موردنیاز پشتیبانی نمی‌کند"
ErrOIDCUnsupportedSigningAlgorithm: "الگوریتم امضای OIDC پشتیبانی نمی‌شود"
ErrOIDCInvalidState: "وضعیت ورود OIDC نامعتبر است یا قبلاً استفاده شده است"
ErrOIDCLoginExpired: "درخواست ورود OIDC منقضی شده است؛ دوباره تلاش کنید"
ErrOIDCTokenExchange: "تبادل کد مجوز OIDC ناموفق بود"
ErrOIDCTokenValidation: "اعتبارسنجی Token OIDC ناموفق بود"
ErrOIDCUserInfoValidation: "اعتبارسنجی اطلاعات کاربر OIDC ناموفق بود"
ErrOIDCNameClaimMissing: "Claim نام کاربری OIDC پیکربندی‌شده وجود ندارد یا نامعتبر است"
ErrOIDCNameConflictLocal: "نام کاربری OIDC با یک کاربر محلی تداخل دارد"
ErrOIDCNameConflictLDAP: "نام کاربری OIDC با یک کاربر LDAP تداخل دارد"
ErrOIDCNameConflictOIDC: "نام کاربری OIDC با هویت OIDC دیگری تداخل دارد"
ErrOIDCDefaultRoleInvalid: "نقش پیش‌فرض پیکربندی‌شده برای OIDC در دسترس نیست"
ErrOIDCPrivateAddressDenied: "نشانی Endpoint OIDC طبق سیاست امنیت شبکه مجاز نیست"
ErrOIDCTLSValidation: "اعتبارسنجی گواهی TLS OIDC ناموفق بود"
ErrOIDCTestExpired: "آزمایش مرورگری OIDC منقضی شده است؛ آن را دوباره اجرا کنید"
ErrOIDCLocalCredentialsReadonly: "نام کاربری و رمز عبور OIDC توسط Provider هویت مدیریت می‌شوند و به‌صورت محلی قابل تغییر نیستند."
ErrOIDCPasswordExpirationUnsupported: "کاربران OIDC از سیاست انقضای رمز عبور محلی استفاده نمی‌کنند."
ErrOIDCInternal: "در احراز هویت OIDC خطای داخلی رخ داد. بعداً دوباره تلاش کنید."
# کاربر و مجوزها
ErrNoSuchUser: "اطلاعات کاربر یافت نشد، بررسی و دوباره تلاش کنید!"
@@ -114,12 +137,12 @@ ErrVMNotFound: "ماشین مجازی وجود ندارد"
ErrVMAlreadyExists: "ماشین مجازی از قبل وجود دارد"
ErrVMImageAlreadyExists: "فایل ایمیج ماشین مجازی از قبل وجود دارد: {{ .detail }}"
ErrVMStoragePathInUse: "مسیر استخر ذخیره‌سازی قبلاً توسط [{{ .name }}] استفاده شده است"
ErrVMHelperNotFound: "1panel-kvm not found"
ErrVMBridgeManaged: "Bridge name is already managed by libvirt or Docker"
ErrVMNetworkInUse: "Network is in use and cannot be deleted"
ErrVMStorageInUse: "Storage pool is in use and cannot be deleted"
ErrVMStorageNameCannotChange: "Storage pool name cannot be changed"
ErrVMStoragePathCannotChange: "Storage pool path cannot be changed"
ErrVMHelperNotFound: "1panel-kvm یافت نشد"
ErrVMBridgeManaged: "نام bridge از قبل توسط libvirt یا Docker مدیریت می‌شود"
ErrVMNetworkInUse: "شبکه در حال استفاده است و قابل حذف نیست"
ErrVMStorageInUse: "مخزن ذخیره‌سازی در حال استفاده است و قابل حذف نیست"
ErrVMStorageNameCannotChange: "نام مخزن ذخیره‌سازی قابل تغییر نیست"
ErrVMStoragePathCannotChange: "مسیر مخزن ذخیره‌سازی قابل تغییر نیست"
ErrVMRunning: "ماشین مجازی در حال اجرا است"
ErrVMLibvirtConnect: "اتصال به libvirt ناموفق بود: {{ .detail }}"
ErrVMPermission: "مجوز عملیات ماشین مجازی وجود ندارد: {{ .detail }}"
@@ -255,7 +278,7 @@ PushAppInstallTaskToNode: "ارسال وظیفه نصب برنامه به گره
AppInstallTask: "وظیفه نصب برنامه"
PushAppFailed: "ارسال وظیفه نصب برنامه ناموفق بود"
SkillHubInstallTask: "نصب مهارت [{{ .name }}]"
SkillHubInstallToTarget: "نصب مهارت به هدف [{{ .name }}]"
SkillHubInstallToTarget: "نصب مهارت [{{ .name }}] روی هدف [{{ .target }}]"
# کتابخانه اسکریپت
ScriptLibrary: "کتابخانه اسکریپت"
@@ -317,10 +340,10 @@ HandlePrivateKey: "مدیریت کلید خصوصی گره"
HandlePublicKey: "مدیریت کلید عمومی گره"
ExchangeFile: "شروع همگام‌سازی {{ .sourcePath }} از گره {{ .source }} به گره {{ .dest }}:{{ .destPath }}"
NodeFile: "فایل گره"
ImageSyncTaskName: "Image sync {{ .count }} images"
SSLSyncTaskName: "Certificate sync {{ .count }} certificates"
AppSyncTaskName: "App sync {{ .name }}"
SSLSyncToNode: "Push certificate [{{ .cert }}] to node [{{ .node }}]"
ImageSyncTaskName: "همگام‌سازی {{ .count }} تصویر"
SSLSyncTaskName: "همگام‌سازی {{ .count }} گواهی"
AppSyncTaskName: "همگام‌سازی برنامه {{ .name }}"
SSLSyncToNode: "ارسال گواهی [{{ .cert }}] به گره [{{ .node }}]"
ImageSyncSave: "ذخیره تصویر {{ .image }}"
ImageSyncSaveTags: "ذخیره برچسب‌های تصویر {{ .tags }}"
ImageSyncToNode: "همگام‌سازی تصویر {{ .image }} به گره {{ .node }}"
@@ -472,3 +495,33 @@ ErrLDAPSyncRunning: "یک وظیفه همگام‌سازی LDAP در حال اج
ErrLDAPSyncDirectoryIncomplete: "LDAP نتیجه ناقصی از پرس‌وجوی کامل برگرداند. وضعیت هیچ کاربری تغییر نکرد."
ErrLDAPSyncFailed: "همگام‌سازی کاربران LDAP ناموفق بود."
LDAPSyncSuccess: "همگام‌سازی کاربران LDAP با موفقیت انجام شد."
ErrSAML2NotEnabled: "احراز هویت SAML2 فعال نیست."
ErrSAML2ConfigInvalid: "پیکربندی SAML2 نامعتبر است."
ErrSAML2ConfigChanged: "پیکربندی SAML2 تغییر کرده است. احراز هویت را دوباره آغاز کنید."
ErrSAML2PanelOriginMissing: "یک URL عمومی معتبر برای 1Panel وارد کنید که فقط شامل طرح، میزبان و در صورت نیاز درگاه باشد."
ErrSAML2MetadataInvalid: "فراداده IdP وجود ندارد یا نامعتبر است."
ErrSAML2MetadataURLInvalid: "URL فراداده IdP یا یکی از نقاط پایانی موجود در فراداده مجاز نیست."
ErrSAML2MetadataFetch: "بارگیری فراداده IdP ناموفق بود."
ErrSAML2MetadataCertificate: "فراداده IdP شامل گواهی امضای قابل استفاده نیست."
ErrSAML2KeyPairInvalid: "کلید خصوصی و گواهی SP نامعتبر هستند یا با هم مطابقت ندارند."
ErrSAML2NameAttributeMissing: "ویژگی نام کاربری SAML2 پیکربندی‌شده وجود ندارد یا نامعتبر است."
ErrSAML2DefaultRoleInvalid: "نقش پیش‌فرض پیکربندی‌شده برای SAML2 در دسترس نیست."
ErrSAML2SLOUnavailable: "IdP سرویس خروج یکپارچه پشتیبانی‌شده‌ای ارائه نمی‌کند."
ErrSAML2TestExpired: "آزمایش SAML2 منقضی شده است. دوباره آن را اجرا کنید."
ErrSAML2LoginExpired: "درخواست ورود SAML2 منقضی شده است. دوباره تلاش کنید."
ErrSAML2InvalidState: "وضعیت ورود SAML2 نامعتبر است یا قبلاً استفاده شده است."
ErrSAML2RequestBuild: "ساخت درخواست SAML2 ناموفق بود."
ErrSAML2ResponseInvalid: "پاسخ SAML2 نامعتبر است."
ErrSAML2SignatureInvalid: "امضای SAML2 نامعتبر است."
ErrSAML2Replay: "پیام SAML2 قبلاً استفاده شده است."
ErrSAML2NameIDMissing: "NameID مربوط به SAML2 وجود ندارد یا نامعتبر است."
ErrSAML2SessionIndexMissing: "SessionIndex مربوط به SAML2 وجود ندارد یا نامعتبر است."
ErrSAML2NameConflictLocal: "نام کاربری SAML2 با یک کاربر محلی تداخل دارد."
ErrSAML2NameConflictLDAP: "نام کاربری SAML2 با یک کاربر LDAP تداخل دارد."
ErrSAML2NameConflictOIDC: "نام کاربری SAML2 با یک کاربر OIDC تداخل دارد."
ErrSAML2NameConflictSAML2: "نام کاربری SAML2 با هویت SAML2 دیگری تداخل دارد."
ErrSAML2Internal: "هنگام احراز هویت SAML2 خطای داخلی رخ داد. بعداً دوباره تلاش کنید."
ErrSAML2LogoutExpired: "درخواست خروج SAML2 منقضی شده است."
ErrSAML2LogoutInvalid: "پیام خروج SAML2 نامعتبر است."
ErrSAML2LocalCredentialsReadonly: "نام‌های کاربری و گذرواژه‌های SAML2 توسط ارائه‌دهنده هویت مدیریت می‌شوند و در محل قابل تغییر نیستند."
ErrSAML2PasswordExpirationUnsupported: "کاربران SAML2 از سیاست محلی انقضای گذرواژه استفاده نمی‌کنند."

View File

@@ -6,7 +6,7 @@ ErrInternalServer: '内部エラー: {{ .detail }}'
ErrInternalServerKey: "サーバー内部エラー: "
ErrRecordExist: 'レコードが既に存在します'
ErrRecordNotFound: 'レコードが見つかりません'
ErrStructTransform: '型変換エラー: {{ .err }}'
ErrStructTransform: '型変換エラー: {{ .detail }}'
ErrNotSupportType: '未対応のタイプ: {{ .name }}'
ErrDemoEnvironment: 'デモ環境では利用できません'
ErrCmdTimeout: 'コマンドがタイムアウトしました'
@@ -42,6 +42,29 @@ ErrPasskeyLimit: "Passkeyの上限に達しました最大5個"
ErrPasskeySession: "Passkeyセッションの有効期限が切れているか無効です"
ErrPasskeyDuplicate: "Passkeyは既に存在します"
ErrPasskeyVerify: "Passkeyの検証に失敗しました"
ErrOIDCNotEnabled: "OIDC 認証が有効になっていません"
ErrOIDCConfigInvalid: "OIDC 設定が無効です"
ErrOIDCConfigChanged: "OIDC 設定が変更されました。認証をやり直してください"
ErrOIDCDiscoveryFailed: "OIDC Provider 設定の検出に失敗しました"
ErrOIDCIssuerMismatch: "OIDC の Issuer が設定済みの Issuer と一致しません"
ErrOIDCUnsupportedPKCE: "OIDC Provider は必要な PKCE 方式をサポートしていません"
ErrOIDCUnsupportedSigningAlgorithm: "OIDC の署名アルゴリズムはサポートされていません"
ErrOIDCInvalidState: "OIDC のログイン状態が無効であるか、すでに使用されています"
ErrOIDCLoginExpired: "OIDC ログイン要求の有効期限が切れました。もう一度お試しください"
ErrOIDCTokenExchange: "OIDC 認可コードの交換に失敗しました"
ErrOIDCTokenValidation: "OIDC Token の検証に失敗しました"
ErrOIDCUserInfoValidation: "OIDC ユーザー情報の検証に失敗しました"
ErrOIDCNameClaimMissing: "設定された OIDC ユーザー名 Claim が存在しないか無効です"
ErrOIDCNameConflictLocal: "OIDC ユーザー名がローカルユーザーと競合しています"
ErrOIDCNameConflictLDAP: "OIDC ユーザー名が LDAP ユーザーと競合しています"
ErrOIDCNameConflictOIDC: "OIDC ユーザー名が別の OIDC アイデンティティと競合しています"
ErrOIDCDefaultRoleInvalid: "OIDC に設定されたデフォルトロールは利用できません"
ErrOIDCPrivateAddressDenied: "OIDC Endpoint のアドレスはネットワークセキュリティポリシーで許可されていません"
ErrOIDCTLSValidation: "OIDC の TLS 証明書検証に失敗しました"
ErrOIDCTestExpired: "OIDC のブラウザーテストは期限切れです。もう一度実行してください"
ErrOIDCLocalCredentialsReadonly: "OIDC のユーザー名とパスワードは ID Provider によって管理されるため、ローカルでは変更できません。"
ErrOIDCPasswordExpirationUnsupported: "OIDC ユーザーにはローカルのパスワード有効期限ポリシーは適用されません。"
ErrOIDCInternal: "OIDC 認証で内部エラーが発生しました。しばらくしてからもう一度お試しください。"
# ユーザーと権限
ErrNoSuchUser: "ユーザー情報が見つかりません。確認して再試行してください!"
@@ -114,12 +137,12 @@ ErrVMNotFound: "仮想マシンが存在しません"
ErrVMAlreadyExists: "仮想マシンは既に存在します"
ErrVMImageAlreadyExists: "仮想マシンのイメージファイルは既に存在します: {{ .detail }}"
ErrVMStoragePathInUse: "ストレージプールのパスは既に [{{ .name }}] で使用されています"
ErrVMHelperNotFound: "1panel-kvm not found"
ErrVMBridgeManaged: "Bridge name is already managed by libvirt or Docker"
ErrVMNetworkInUse: "Network is in use and cannot be deleted"
ErrVMStorageInUse: "Storage pool is in use and cannot be deleted"
ErrVMStorageNameCannotChange: "Storage pool name cannot be changed"
ErrVMStoragePathCannotChange: "Storage pool path cannot be changed"
ErrVMHelperNotFound: "1panel-kvm が見つかりません"
ErrVMBridgeManaged: "ブリッジ名はすでに libvirt または Docker によって管理されています"
ErrVMNetworkInUse: "ネットワークは使用中のため削除できません"
ErrVMStorageInUse: "ストレージプールは使用中のため削除できません"
ErrVMStorageNameCannotChange: "ストレージプール名は変更できません"
ErrVMStoragePathCannotChange: "ストレージプールのパスは変更できません"
ErrVMRunning: "仮想マシンは実行中です"
ErrVMLibvirtConnect: "libvirt への接続に失敗しました: {{ .detail }}"
ErrVMPermission: "仮想マシンを操作する権限がありません: {{ .detail }}"
@@ -190,7 +213,7 @@ TaskSync: '同期'
TaskSyncForNode: "ノードデータを同期"
TaskBackup: "バックアップ"
TaskPush: "送信"
TaskRsync: "Sync"
TaskRsync: "同期"
SuccessStatus: "{{ .name }} 成功"
FailedStatus: "{{ .name }} 失敗 {{ .err }}"
Start: "開始"
@@ -255,7 +278,7 @@ PushAppInstallTaskToNode: "ノード [{{ .name }}] にアプリインストー
AppInstallTask: "アプリインストールタスク"
PushAppFailed: "アプリインストールタスクの送信に失敗しました"
SkillHubInstallTask: "スキルをインストール [{{ .name }}]"
SkillHubInstallToTarget: "ターゲットにスキルをインストール [{{ .name }}]"
SkillHubInstallToTarget: "スキル [{{ .name }}] をターゲット [{{ .target }}] にインストール"
# スクリプトライブラリ
ScriptLibrary: "スクリプトライブラリ"
@@ -312,25 +335,25 @@ StartService: "サービスを開始"
NoBackupNode: "現在バックアップノードが空です。保存するバックアップノードを選択して再試行してください!"
# ノードファイルとイメージ同期
LocalNodeIpFailed: "Failed to get master node IP. Edit the master node and add IP address and SSH authentication information."
HandlePrivateKey: "Handle node private key"
HandlePublicKey: "Handle node public key"
ExchangeFile: "Start syncing {{ .sourcePath }} from node {{ .source }} to node {{ .dest }}:{{ .destPath }}"
NodeFile: "Node file"
ImageSyncTaskName: "Image sync {{ .count }} images"
SSLSyncTaskName: "Certificate sync {{ .count }} certificates"
AppSyncTaskName: "App sync {{ .name }}"
SSLSyncToNode: "Push certificate [{{ .cert }}] to node [{{ .node }}]"
ImageSyncSave: "Save image {{ .image }}"
ImageSyncSaveTags: "Save image tags {{ .tags }}"
ImageSyncToNode: "Sync image {{ .image }} to node {{ .node }}"
ImageSyncLoad: "Load image {{ .image }} on node {{ .node }}"
ImageSyncClean: "Clean temporary files for image {{ .image }}"
ImageSyncNoTag: "Image {{ .image }} has no tag and will be saved by image ID"
ImageSyncFrontendTagsIgnored: "No tags were found for image {{ .image }} on the source node. Frontend tags were ignored."
ImageSyncHandlePrivateKey: "Handle image sync node private key"
ImageSyncHandlePublicKey: "Handle image sync node public key"
ImageSyncTransfer: "Start transferring image temporary file: {{ .source }}:{{ .sourcePath }} -> {{ .dest }}:{{ .destPath }}"
LocalNodeIpFailed: "マスターノードの IP を取得できませんでした。マスターードを編集し、IP アドレスと SSH 認証情報を追加してください。"
HandlePrivateKey: "ノードの秘密鍵を処理"
HandlePublicKey: "ノードの公開鍵を処理"
ExchangeFile: "ノード {{ .source }} の {{ .sourcePath }} からノード {{ .dest }}:{{ .destPath }} への同期を開始"
NodeFile: "ノードファイル"
ImageSyncTaskName: "{{ .count }} 個のイメージを同期"
SSLSyncTaskName: "{{ .count }} 件の証明書を同期"
AppSyncTaskName: "アプリケーション {{ .name }} を同期"
SSLSyncToNode: "証明書 [{{ .cert }}] をノード [{{ .node }}] に送信"
ImageSyncSave: "イメージ {{ .image }} を保存"
ImageSyncSaveTags: "イメージタグ {{ .tags }} を保存"
ImageSyncToNode: "イメージ {{ .image }} をノード {{ .node }} に同期"
ImageSyncLoad: "ノード {{ .node }} にイメージ {{ .image }} を読み込み"
ImageSyncClean: "イメージ {{ .image }} の一時ファイルを削除"
ImageSyncNoTag: "イメージ {{ .image }} にはタグがないため、イメージ ID で保存します"
ImageSyncFrontendTagsIgnored: "ソースノードのイメージ {{ .image }} にタグが見つからなかったため、フロントエンドからのタグを無視しました。"
ImageSyncHandlePrivateKey: "イメージ同期ノードの秘密鍵を処理"
ImageSyncHandlePublicKey: "イメージ同期ノードの公開鍵を処理"
ImageSyncTransfer: "イメージ一時ファイルの転送を開始: {{ .source }}:{{ .sourcePath }} -> {{ .dest }}:{{ .destPath }}"
# コマンドライン
SudoHelper: "{{.cmd}}を使用するか、ルートユーザーに切り替えてください"
@@ -350,21 +373,21 @@ AppMissKey: "アプリキーがありません、-kを使用して指定しま
AppMissVersion: "アプリバージョンがありません、-vを使用して指定します"
AppVersionExist: "バージョンはすでに存在します!"
AppCreateSuccessful: "創造は成功しました!"
AppWriteErr: "file {{ .name }} write failed {{ .err }}"
AppWriteErr: "ファイル {{ .name }} の書き込みに失敗しました {{ .err }}"
# コマンドライン - 監視IP
ListenIPCommands: "リスニングIPを切り替えます"
ListenIPv4: "IPv4で聞いてください"
ListenIPv6: "IPv6で聞く"
ListenChangeSuccessful: "切り替え成功{{.Value}}で聞いています"
ListenChangeSuccessful: "切り替え成功しました。現在 {{ .value }} で待ち受けています"
# コマンドライン - リセット
ResetCommands: "システム情報をリセットします"
ResetMFA: "1パネルの2要素認証をキャンセルします"
ResetMFA: "1Panel の二要素認証を解除"
ResetHttps: "1Panel HTTPSログインをキャンセルします"
ResetEntrance: "1パネルの安全な入り口をキャンセルします"
ResetIPs: "1パネル認定IP制限をキャンセルします"
ResetDomain: "1パネルドメインバインディングをキャンセルします"
ResetEntrance: "1Panel のセキュリティエントランスを解除"
ResetIPs: "1Panel の許可 IP 制限を解除"
ResetDomain: "1Panel のドメインバインドを解除"
ResetPasskey: "1Panel のパスキーをクリアします"
# コマンドライン - ユーザー
@@ -472,3 +495,33 @@ ErrLDAPSyncRunning: "LDAP 同期タスクはすでに実行中です。"
ErrLDAPSyncDirectoryIncomplete: "LDAP の全件クエリ結果が不完全です。ユーザーの状態は変更されませんでした。"
ErrLDAPSyncFailed: "LDAP ユーザーの同期に失敗しました。"
LDAPSyncSuccess: "LDAP ユーザーの同期が正常に完了しました。"
ErrSAML2NotEnabled: "SAML2 認証が有効になっていません。"
ErrSAML2ConfigInvalid: "SAML2 設定が無効です。"
ErrSAML2ConfigChanged: "SAML2 設定が変更されました。認証をやり直してください。"
ErrSAML2PanelOriginMissing: "スキーム、ホスト、任意のポートのみを含む有効な 1Panel 公開 URL を入力してください。"
ErrSAML2MetadataInvalid: "IdP メタデータがないか、無効です。"
ErrSAML2MetadataURLInvalid: "IdP メタデータ URL またはメタデータ内のエンドポイントは許可されていません。"
ErrSAML2MetadataFetch: "IdP メタデータの読み込みに失敗しました。"
ErrSAML2MetadataCertificate: "IdP メタデータに使用可能な署名証明書がありません。"
ErrSAML2KeyPairInvalid: "SP 秘密鍵と証明書が無効か、一致していません。"
ErrSAML2NameAttributeMissing: "設定された SAML2 ユーザー名属性がないか、無効です。"
ErrSAML2DefaultRoleInvalid: "SAML2 に設定されたデフォルトロールを利用できません。"
ErrSAML2SLOUnavailable: "IdP はサポート対象のシングルログアウトサービスを提供していません。"
ErrSAML2TestExpired: "SAML2 テストの有効期限が切れました。もう一度実行してください。"
ErrSAML2LoginExpired: "SAML2 ログイン要求の有効期限が切れました。もう一度お試しください。"
ErrSAML2InvalidState: "SAML2 ログイン状態が無効か、すでに使用されています。"
ErrSAML2RequestBuild: "SAML2 要求の作成に失敗しました。"
ErrSAML2ResponseInvalid: "SAML2 応答が無効です。"
ErrSAML2SignatureInvalid: "SAML2 署名が無効です。"
ErrSAML2Replay: "SAML2 メッセージはすでに使用されています。"
ErrSAML2NameIDMissing: "SAML2 NameID がないか、無効です。"
ErrSAML2SessionIndexMissing: "SAML2 SessionIndex がないか、無効です。"
ErrSAML2NameConflictLocal: "SAML2 ユーザー名がローカルユーザーと競合しています。"
ErrSAML2NameConflictLDAP: "SAML2 ユーザー名が LDAP ユーザーと競合しています。"
ErrSAML2NameConflictOIDC: "SAML2 ユーザー名が OIDC ユーザーと競合しています。"
ErrSAML2NameConflictSAML2: "SAML2 ユーザー名が別の SAML2 ID と競合しています。"
ErrSAML2Internal: "SAML2 認証中に内部エラーが発生しました。後でもう一度お試しください。"
ErrSAML2LogoutExpired: "SAML2 ログアウト要求の有効期限が切れました。"
ErrSAML2LogoutInvalid: "SAML2 ログアウトメッセージが無効です。"
ErrSAML2LocalCredentialsReadonly: "SAML2 のユーザー名とパスワードは IdP によって管理されるため、ローカルでは変更できません。"
ErrSAML2PasswordExpirationUnsupported: "SAML2 ユーザーにはローカルのパスワード有効期限ポリシーが適用されません。"

View File

@@ -6,7 +6,7 @@ ErrInternalServer: '서버 오류: {{ .detail }}'
ErrInternalServerKey: "서버 내부 오류:"
ErrRecordExist: '레코드가 이미 있습니다'
ErrRecordNotFound: '레코드를 찾을 수 없습니다'
ErrStructTransform: '형 변환 실패: {{ .err }}'
ErrStructTransform: '형 변환 실패: {{ .detail }}'
ErrNotSupportType: '지원하지 않는 타입: {{ .name }}'
ErrDemoEnvironment: '데모 환경에서는 불가'
ErrCmdTimeout: '명령이 시간 초과했습니다'
@@ -42,6 +42,29 @@ ErrPasskeyLimit: "Passkey 개수가 한도에 도달했습니다(최대 5개)"
ErrPasskeySession: "Passkey 세션이 만료되었거나 유효하지 않습니다"
ErrPasskeyDuplicate: "Passkey가 이미 존재합니다"
ErrPasskeyVerify: "Passkey 검증에 실패했습니다"
ErrOIDCNotEnabled: "OIDC 인증이 활성화되지 않았습니다"
ErrOIDCConfigInvalid: "OIDC 설정이 올바르지 않습니다"
ErrOIDCConfigChanged: "OIDC 설정이 변경되었습니다. 인증을 다시 시작하세요"
ErrOIDCDiscoveryFailed: "OIDC Provider 설정을 검색하지 못했습니다"
ErrOIDCIssuerMismatch: "OIDC Issuer가 설정된 Issuer와 일치하지 않습니다"
ErrOIDCUnsupportedPKCE: "OIDC Provider가 필요한 PKCE 방식을 지원하지 않습니다"
ErrOIDCUnsupportedSigningAlgorithm: "OIDC 서명 알고리즘이 지원되지 않습니다"
ErrOIDCInvalidState: "OIDC 로그인 상태가 올바르지 않거나 이미 사용되었습니다"
ErrOIDCLoginExpired: "OIDC 로그인 요청이 만료되었습니다. 다시 시도하세요"
ErrOIDCTokenExchange: "OIDC 인증 코드 교환에 실패했습니다"
ErrOIDCTokenValidation: "OIDC Token 검증에 실패했습니다"
ErrOIDCUserInfoValidation: "OIDC 사용자 정보 검증에 실패했습니다"
ErrOIDCNameClaimMissing: "설정된 OIDC 사용자 이름 Claim이 없거나 올바르지 않습니다"
ErrOIDCNameConflictLocal: "OIDC 사용자 이름이 로컬 사용자와 충돌합니다"
ErrOIDCNameConflictLDAP: "OIDC 사용자 이름이 LDAP 사용자와 충돌합니다"
ErrOIDCNameConflictOIDC: "OIDC 사용자 이름이 다른 OIDC ID와 충돌합니다"
ErrOIDCDefaultRoleInvalid: "OIDC에 설정된 기본 역할을 사용할 수 없습니다"
ErrOIDCPrivateAddressDenied: "OIDC Endpoint 주소가 네트워크 보안 정책에서 허용되지 않습니다"
ErrOIDCTLSValidation: "OIDC TLS 인증서 검증에 실패했습니다"
ErrOIDCTestExpired: "OIDC 브라우저 테스트가 만료되었습니다. 다시 실행하세요"
ErrOIDCLocalCredentialsReadonly: "OIDC 사용자 이름과 비밀번호는 ID Provider에서 관리하므로 로컬에서 변경할 수 없습니다."
ErrOIDCPasswordExpirationUnsupported: "OIDC 사용자는 로컬 비밀번호 만료 정책을 사용하지 않습니다."
ErrOIDCInternal: "OIDC 인증 중 내부 오류가 발생했습니다. 잠시 후 다시 시도하세요."
# 사용자 및 권한
ErrNoSuchUser: "사용자 정보를 찾을 수 없습니다. 확인 후 다시 시도하세요"
@@ -114,12 +137,12 @@ ErrVMNotFound: "가상 머신이 존재하지 않습니다"
ErrVMAlreadyExists: "가상 머신이 이미 존재합니다"
ErrVMImageAlreadyExists: "가상 머신 이미지 파일이 이미 존재합니다: {{ .detail }}"
ErrVMStoragePathInUse: "스토리지 풀 경로가 이미 [{{ .name }}]에서 사용 중입니다"
ErrVMHelperNotFound: "1panel-kvm not found"
ErrVMBridgeManaged: "Bridge name is already managed by libvirt or Docker"
ErrVMNetworkInUse: "Network is in use and cannot be deleted"
ErrVMStorageInUse: "Storage pool is in use and cannot be deleted"
ErrVMStorageNameCannotChange: "Storage pool name cannot be changed"
ErrVMStoragePathCannotChange: "Storage pool path cannot be changed"
ErrVMHelperNotFound: "1panel-kvm을 찾을 수 없습니다"
ErrVMBridgeManaged: "브리지 이름이 이미 libvirt 또는 Docker에서 관리되고 있습니다"
ErrVMNetworkInUse: "네트워크가 사용 중이므로 삭제할 수 없습니다"
ErrVMStorageInUse: "스토리지 풀이 사용 중이므로 삭제할 수 없습니다"
ErrVMStorageNameCannotChange: "스토리지 풀 이름은 변경할 수 없습니다"
ErrVMStoragePathCannotChange: "스토리지 풀 경로는 변경할 수 없습니다"
ErrVMRunning: "가상 머신이 실행 중입니다"
ErrVMLibvirtConnect: "libvirt 연결 실패: {{ .detail }}"
ErrVMPermission: "가상 머신 작업 권한이 없습니다: {{ .detail }}"
@@ -190,7 +213,7 @@ TaskSync: '동기화'
TaskSyncForNode: "노드 데이터 동기화"
TaskBackup: "백업"
TaskPush: "전송"
TaskRsync: "Sync"
TaskRsync: "동기화"
SuccessStatus: "{{ .name }} 성공"
FailedStatus: "{{ .name }} 실패 {{ .err }}"
Start: "시작"
@@ -255,7 +278,7 @@ PushAppInstallTaskToNode: "노드 [{{ .name }}]로 앱 설치 작업 전송"
AppInstallTask: "앱 설치 작업"
PushAppFailed: "앱 설치 작업 전송 실패"
SkillHubInstallTask: "스킬 설치 [{{ .name }}]"
SkillHubInstallToTarget: "대상에 스킬 설치 [{{ .name }}]"
SkillHubInstallToTarget: "스킬 [{{ .name }}]을 대상 [{{ .target }}]에 설치"
# 스크립트 라이브러리
ScriptLibrary: "스크립트 라이브러리"
@@ -312,25 +335,25 @@ StartService: "서비스 시작"
NoBackupNode: "현재 백업 노드가 비어 있습니다. 저장할 백업 노드를 선택한 후 다시 시도하십시오"
# 노드 파일 및 이미지 동기화
LocalNodeIpFailed: "Failed to get master node IP. Edit the master node and add IP address and SSH authentication information."
HandlePrivateKey: "Handle node private key"
HandlePublicKey: "Handle node public key"
ExchangeFile: "Start syncing {{ .sourcePath }} from node {{ .source }} to node {{ .dest }}:{{ .destPath }}"
NodeFile: "Node file"
ImageSyncTaskName: "Image sync {{ .count }} images"
SSLSyncTaskName: "Certificate sync {{ .count }} certificates"
AppSyncTaskName: "App sync {{ .name }}"
SSLSyncToNode: "Push certificate [{{ .cert }}] to node [{{ .node }}]"
ImageSyncSave: "Save image {{ .image }}"
ImageSyncSaveTags: "Save image tags {{ .tags }}"
ImageSyncToNode: "Sync image {{ .image }} to node {{ .node }}"
ImageSyncLoad: "Load image {{ .image }} on node {{ .node }}"
ImageSyncClean: "Clean temporary files for image {{ .image }}"
ImageSyncNoTag: "Image {{ .image }} has no tag and will be saved by image ID"
ImageSyncFrontendTagsIgnored: "No tags were found for image {{ .image }} on the source node. Frontend tags were ignored."
ImageSyncHandlePrivateKey: "Handle image sync node private key"
ImageSyncHandlePublicKey: "Handle image sync node public key"
ImageSyncTransfer: "Start transferring image temporary file: {{ .source }}:{{ .sourcePath }} -> {{ .dest }}:{{ .destPath }}"
LocalNodeIpFailed: "마스터 노드 IP를 가져오지 못했습니다. 마스터 노드를 편집하여 IP 주소와 SSH 인증 정보를 추가하세요."
HandlePrivateKey: "노드 개인 키 처리"
HandlePublicKey: "노드 공개 키 처리"
ExchangeFile: "노드 {{ .source }}의 {{ .sourcePath }}에서 노드 {{ .dest }}:{{ .destPath }}(으)로 동기화 시작"
NodeFile: "노드 파일"
ImageSyncTaskName: "이미지 {{ .count }}개 동기화"
SSLSyncTaskName: "인증서 {{ .count }}개 동기화"
AppSyncTaskName: "애플리케이션 {{ .name }} 동기화"
SSLSyncToNode: "인증서 [{{ .cert }}]을(를) 노드 [{{ .node }}]에 전송"
ImageSyncSave: "이미지 {{ .image }} 저장"
ImageSyncSaveTags: "이미지 태그 {{ .tags }} 저장"
ImageSyncToNode: "이미지 {{ .image }}을(를) 노드 {{ .node }}에 동기화"
ImageSyncLoad: "이미지 {{ .image }}을(를) 노드 {{ .node }}에 로드"
ImageSyncClean: "이미지 {{ .image }}의 임시 파일 정리"
ImageSyncNoTag: "이미지 {{ .image }}에 태그가 없어 이미지 ID로 저장합니다"
ImageSyncFrontendTagsIgnored: "소스 노드의 이미지 {{ .image }}에서 태그를 찾지 못해 프론트엔드 태그를 무시했습니다."
ImageSyncHandlePrivateKey: "이미지 동기화 노드 개인 키 처리"
ImageSyncHandlePublicKey: "이미지 동기화 노드 공개 키 처리"
ImageSyncTransfer: "이미지 임시 파일 전송 시작: {{ .source }}:{{ .sourcePath }} -> {{ .dest }}:{{ .destPath }}"
# 명령줄
SudoHelper: "{{ .cmd }} 명령을 사용하거나 root 사용자로 전환하세요."
@@ -472,3 +495,33 @@ ErrLDAPSyncRunning: "LDAP 동기화 작업이 이미 실행 중입니다."
ErrLDAPSyncDirectoryIncomplete: "LDAP 전체 조회 결과가 불완전하여 사용자 상태를 변경하지 않았습니다."
ErrLDAPSyncFailed: "LDAP 사용자 동기화에 실패했습니다."
LDAPSyncSuccess: "LDAP 사용자 동기화가 완료되었습니다."
ErrSAML2NotEnabled: "SAML2 인증이 활성화되지 않았습니다."
ErrSAML2ConfigInvalid: "SAML2 구성이 올바르지 않습니다."
ErrSAML2ConfigChanged: "SAML2 구성이 변경되었습니다. 인증을 다시 시작하세요."
ErrSAML2PanelOriginMissing: "스킴, 호스트 및 선택적 포트만 포함하는 유효한 1Panel 공개 URL을 입력하세요."
ErrSAML2MetadataInvalid: "IdP 메타데이터가 없거나 올바르지 않습니다."
ErrSAML2MetadataURLInvalid: "IdP 메타데이터 URL 또는 메타데이터의 엔드포인트가 허용되지 않습니다."
ErrSAML2MetadataFetch: "IdP 메타데이터를 불러오지 못했습니다."
ErrSAML2MetadataCertificate: "IdP 메타데이터에 사용할 수 있는 서명 인증서가 없습니다."
ErrSAML2KeyPairInvalid: "SP 개인 키와 인증서가 올바르지 않거나 서로 일치하지 않습니다."
ErrSAML2NameAttributeMissing: "구성된 SAML2 사용자 이름 속성이 없거나 올바르지 않습니다."
ErrSAML2DefaultRoleInvalid: "SAML2에 구성된 기본 역할을 사용할 수 없습니다."
ErrSAML2SLOUnavailable: "IdP가 지원되는 Single Logout 서비스를 제공하지 않습니다."
ErrSAML2TestExpired: "SAML2 테스트가 만료되었습니다. 다시 실행하세요."
ErrSAML2LoginExpired: "SAML2 로그인 요청이 만료되었습니다. 다시 시도하세요."
ErrSAML2InvalidState: "SAML2 로그인 상태가 올바르지 않거나 이미 사용되었습니다."
ErrSAML2RequestBuild: "SAML2 요청을 생성하지 못했습니다."
ErrSAML2ResponseInvalid: "SAML2 응답이 올바르지 않습니다."
ErrSAML2SignatureInvalid: "SAML2 서명이 올바르지 않습니다."
ErrSAML2Replay: "SAML2 메시지가 이미 사용되었습니다."
ErrSAML2NameIDMissing: "SAML2 NameID가 없거나 올바르지 않습니다."
ErrSAML2SessionIndexMissing: "SAML2 SessionIndex가 없거나 올바르지 않습니다."
ErrSAML2NameConflictLocal: "SAML2 사용자 이름이 로컬 사용자와 충돌합니다."
ErrSAML2NameConflictLDAP: "SAML2 사용자 이름이 LDAP 사용자와 충돌합니다."
ErrSAML2NameConflictOIDC: "SAML2 사용자 이름이 OIDC 사용자와 충돌합니다."
ErrSAML2NameConflictSAML2: "SAML2 사용자 이름이 다른 SAML2 ID와 충돌합니다."
ErrSAML2Internal: "SAML2 인증 중 내부 오류가 발생했습니다. 나중에 다시 시도하세요."
ErrSAML2LogoutExpired: "SAML2 로그아웃 요청이 만료되었습니다."
ErrSAML2LogoutInvalid: "SAML2 로그아웃 메시지가 올바르지 않습니다."
ErrSAML2LocalCredentialsReadonly: "SAML2 사용자 이름과 비밀번호는 ID 공급자가 관리하므로 로컬에서 변경할 수 없습니다."
ErrSAML2PasswordExpirationUnsupported: "SAML2 사용자는 로컬 비밀번호 만료 정책을 사용하지 않습니다."

View File

@@ -42,6 +42,29 @@ ErrPasskeyLimit: "ຈຳນວນ Passkey ຮອດຂີດຈຳກັດແ
ErrPasskeySession: "ເຊດຊັນ Passkey ໝົດອາຍຸ ຫຼື ບໍ່ຖືກຕ້ອງ"
ErrPasskeyDuplicate: "ມີ Passkey ນີ້ຢູ່ແລ້ວ"
ErrPasskeyVerify: "ການຢືນຢັນ Passkey ລົ້ມເຫຼວ"
ErrOIDCNotEnabled: "ຍັງບໍ່ໄດ້ເປີດໃຊ້ການຢືນຢັນຕົວຕົນ OIDC"
ErrOIDCConfigInvalid: "ການຕັ້ງຄ່າ OIDC ບໍ່ຖືກຕ້ອງ"
ErrOIDCConfigChanged: "ການຕັ້ງຄ່າ OIDC ຖືກປ່ຽນແປງ; ກະລຸນາເລີ່ມການຢືນຢັນຕົວຕົນໃໝ່"
ErrOIDCDiscoveryFailed: "ຄົ້ນຫາການຕັ້ງຄ່າ Provider OIDC ບໍ່ສຳເລັດ"
ErrOIDCIssuerMismatch: "Issuer OIDC ບໍ່ກົງກັບ Issuer ທີ່ຕັ້ງຄ່າໄວ້"
ErrOIDCUnsupportedPKCE: "Provider OIDC ບໍ່ຮອງຮັບວິທີ PKCE ທີ່ຈຳເປັນ"
ErrOIDCUnsupportedSigningAlgorithm: "ບໍ່ຮອງຮັບອັນກໍຣິທຶມລາຍເຊັນ OIDC"
ErrOIDCInvalidState: "ສະຖານະການເຂົ້າລະບົບ OIDC ບໍ່ຖືກຕ້ອງຫຼືຖືກໃຊ້ແລ້ວ"
ErrOIDCLoginExpired: "ຄຳຂໍເຂົ້າລະບົບ OIDC ໝົດອາຍຸແລ້ວ; ກະລຸນາລອງໃໝ່"
ErrOIDCTokenExchange: "ແລກປ່ຽນລະຫັດອະນຸຍາດ OIDC ບໍ່ສຳເລັດ"
ErrOIDCTokenValidation: "ກວດສອບ Token OIDC ບໍ່ສຳເລັດ"
ErrOIDCUserInfoValidation: "ກວດສອບຂໍ້ມູນຜູ້ໃຊ້ OIDC ບໍ່ສຳເລັດ"
ErrOIDCNameClaimMissing: "Claim ຊື່ຜູ້ໃຊ້ OIDC ທີ່ຕັ້ງຄ່າໄວ້ບໍ່ມີຫຼືບໍ່ຖືກຕ້ອງ"
ErrOIDCNameConflictLocal: "ຊື່ຜູ້ໃຊ້ OIDC ຂັດແຍ່ງກັບຜູ້ໃຊ້ທ້ອງຖິ່ນ"
ErrOIDCNameConflictLDAP: "ຊື່ຜູ້ໃຊ້ OIDC ຂັດແຍ່ງກັບຜູ້ໃຊ້ LDAP"
ErrOIDCNameConflictOIDC: "ຊື່ຜູ້ໃຊ້ OIDC ຂັດແຍ່ງກັບຕົວຕົນ OIDC ອື່ນ"
ErrOIDCDefaultRoleInvalid: "ບົດບາດເລີ່ມຕົ້ນທີ່ຕັ້ງຄ່າສຳລັບ OIDC ບໍ່ສາມາດໃຊ້ງານໄດ້"
ErrOIDCPrivateAddressDenied: "ທີ່ຢູ່ Endpoint OIDC ບໍ່ໄດ້ຮັບອະນຸຍາດຈາກນະໂຍບາຍຄວາມປອດໄພເຄືອຂ່າຍ"
ErrOIDCTLSValidation: "ການກວດສອບໃບຢັ້ງຢືນ TLS ຂອງ OIDC ບໍ່ສຳເລັດ"
ErrOIDCTestExpired: "ການທົດສອບ OIDC ຜ່ານເບຣົາເຊີໝົດອາຍຸແລ້ວ; ກະລຸນາທົດສອບໃໝ່"
ErrOIDCLocalCredentialsReadonly: "ຊື່ຜູ້ໃຊ້ແລະລະຫັດຜ່ານ OIDC ຖືກຈັດການໂດຍ Provider ຕົວຕົນ ແລະບໍ່ສາມາດປ່ຽນໃນເຄື່ອງໄດ້."
ErrOIDCPasswordExpirationUnsupported: "ຜູ້ໃຊ້ OIDC ບໍ່ໃຊ້ນະໂຍບາຍອາຍຸລະຫັດຜ່ານທ້ອງຖິ່ນ."
ErrOIDCInternal: "ການຢືນຢັນຕົວຕົນ OIDC ເກີດຂໍ້ຜິດພາດພາຍໃນ; ກະລຸນາລອງໃໝ່ພາຍຫຼັງ."
# user and permission
ErrNoSuchUser: "ບໍ່ພົບຂໍ້ມູນຜູ້ໃຊ້, ກະລຸນາກວດສອບແລ້ວລອງໃໝ່!"
@@ -121,11 +144,11 @@ ErrVMStorageInUse: "ພູນຈັດເກັບກຳລັງຖືກໃຊ
ErrVMStorageNameCannotChange: "ບໍ່ສາມາດປ່ຽນຊື່ພູນຈັດເກັບໄດ້"
ErrVMStoragePathCannotChange: "ບໍ່ສາມາດປ່ຽນເສັ້ນທາງພູນຈັດເກັບໄດ້"
ErrVMRunning: "ເຄື່ອງສະເໝືອນກຳລັງເຮັດວຽກ"
ErrVMLibvirtConnect: "ເຊື່ອມຕໍ່ກັບ libvirt ບໍ່ສຳເລັດ"
ErrVMLibvirtConnect: "ເຊື່ອມຕໍ່ກັບ libvirt ບໍ່ສຳເລັດ: {{ .detail }}"
ErrVMPermission: "ບໍ່ມີສິດດຳເນີນການກັບເຄື່ອງສະເໝືອນ: {{ .detail }}"
ErrVMNetworkNotFound: "ບໍ່ມີເຄືອຂ່າຍເຄື່ອງສະເໝືອນ"
ErrVMInvalidPath: "ເສັ້ນທາງເຄື່ອງສະເໝືອນບໍ່ຖືກຕ້ອງ"
ErrVMInvalidInput: "ພາລາມິເຕີເຄື່ອງສະເໝືອນບໍ່ຖືກຕ້ອງ"
ErrVMNetworkNotFound: "ບໍ່ມີເຄືອຂ່າຍເຄື່ອງສະເໝືອນ: {{ .detail }}"
ErrVMInvalidPath: "ເສັ້ນທາງເຄື່ອງສະເໝືອນບໍ່ຖືກຕ້ອງ: {{ .detail }}"
ErrVMInvalidInput: "ພາລາມິເຕີເຄື່ອງສະເໝືອນບໍ່ຖືກຕ້ອງ: {{ .detail }}"
ErrVMCommandFailed: "ຄຳສັ່ງເຄື່ອງສະເໝືອນລົ້ມເຫຼວ: {{ .err }}"
VMCreateTask: "ສ້າງເຄື່ອງສະເໝືອນ [{{ .name }}]"
VMCreateFromTemplateTask: "ສ້າງເຄື່ອງສະເໝືອນ [{{ .name }}] ຈາກແມ່ແບບ"
@@ -255,7 +278,7 @@ PushAppInstallTaskToNode: "ສົ່ງວຽກຕິດຕັ້ງແອັ
AppInstallTask: "ວຽກຕິດຕັ້ງແອັບ"
PushAppFailed: "ສົ່ງວຽກຕິດຕັ້ງແອັບບໍ່ສຳເລັດ"
SkillHubInstallTask: "ຕິດຕັ້ງ Skill [{{ .name }}]"
SkillHubInstallToTarget: "ຕິດຕັ້ງ Skill ໄປຍັງເປົ້າໝາຍ [{{ .name }}]"
SkillHubInstallToTarget: "ຕິດຕັ້ງ Skill [{{ .name }}] ໄປຍັງເປົ້າໝາຍ [{{ .target }}]"
# script library
ScriptLibrary: "ຄັງສະຄຣິບ"
@@ -472,3 +495,33 @@ ErrLDAPSyncRunning: "ມີວຽກຊິງຂໍ້ມູນ LDAP ກຳລ
ErrLDAPSyncDirectoryIncomplete: "LDAP ສົ່ງຄືນຜົນການຄົ້ນຫາທັງໝົດທີ່ບໍ່ຄົບຖ້ວນ. ບໍ່ມີການປ່ຽນແປງສະຖານະຜູ້ໃຊ້."
ErrLDAPSyncFailed: "ການຊິງຂໍ້ມູນຜູ້ໃຊ້ LDAP ບໍ່ສຳເລັດ."
LDAPSyncSuccess: "ການຊິງຂໍ້ມູນຜູ້ໃຊ້ LDAP ສຳເລັດແລ້ວ."
ErrSAML2NotEnabled: "ການຢືນຢັນ SAML2 ຍັງບໍ່ໄດ້ເປີດໃຊ້."
ErrSAML2ConfigInvalid: "ການຕັ້ງຄ່າ SAML2 ບໍ່ຖືກຕ້ອງ."
ErrSAML2ConfigChanged: "ການຕັ້ງຄ່າ SAML2 ມີການປ່ຽນແປງ. ເລີ່ມການຢືນຢັນໃໝ່."
ErrSAML2PanelOriginMissing: "ໃສ່ URL ສາທາລະນະຂອງ 1Panel ທີ່ຖືກຕ້ອງ ໂດຍມີສະເພາະ scheme, host ແລະ port ທາງເລືອກ."
ErrSAML2MetadataInvalid: "ຂໍ້ມູນເມຕາຂອງ IdP ຂາດຫາຍ ຫຼືບໍ່ຖືກຕ້ອງ."
ErrSAML2MetadataURLInvalid: "Metadata URL ຂອງ IdP ຫຼື endpoint ໃນ Metadata ບໍ່ໄດ້ຮັບອະນຸຍາດ."
ErrSAML2MetadataFetch: "ບໍ່ສາມາດໂຫຼດຂໍ້ມູນເມຕາຂອງ IdP ໄດ້."
ErrSAML2MetadataCertificate: "ຂໍ້ມູນເມຕາຂອງ IdP ບໍ່ມີໃບຢັ້ງຢືນລາຍເຊັນທີ່ໃຊ້ໄດ້."
ErrSAML2KeyPairInvalid: "ກະແຈສ່ວນຕົວ ແລະໃບຢັ້ງຢືນຂອງ SP ບໍ່ຖືກຕ້ອງ ຫຼືບໍ່ກົງກັນ."
ErrSAML2NameAttributeMissing: "Attribute ຊື່ຜູ້ໃຊ້ SAML2 ທີ່ຕັ້ງຄ່າໄວ້ຂາດຫາຍ ຫຼືບໍ່ຖືກຕ້ອງ."
ErrSAML2DefaultRoleInvalid: "ບົດບາດເລີ່ມຕົ້ນທີ່ຕັ້ງຄ່າສຳລັບ SAML2 ບໍ່ສາມາດໃຊ້ໄດ້."
ErrSAML2SLOUnavailable: "IdP ບໍ່ມີບໍລິການ Single Logout ທີ່ຮອງຮັບ."
ErrSAML2TestExpired: "ການທົດສອບ SAML2 ໝົດອາຍຸແລ້ວ. ດຳເນີນການໃໝ່."
ErrSAML2LoginExpired: "ຄຳຮ້ອງຂໍເຂົ້າລະບົບ SAML2 ໝົດອາຍຸແລ້ວ. ລອງໃໝ່."
ErrSAML2InvalidState: "ສະຖານະເຂົ້າລະບົບ SAML2 ບໍ່ຖືກຕ້ອງ ຫຼືຖືກໃຊ້ແລ້ວ."
ErrSAML2RequestBuild: "ບໍ່ສາມາດສ້າງຄຳຮ້ອງຂໍ SAML2 ໄດ້."
ErrSAML2ResponseInvalid: "ການຕອບກັບ SAML2 ບໍ່ຖືກຕ້ອງ."
ErrSAML2SignatureInvalid: "ລາຍເຊັນ SAML2 ບໍ່ຖືກຕ້ອງ."
ErrSAML2Replay: "ຂໍ້ຄວາມ SAML2 ນີ້ຖືກໃຊ້ແລ້ວ."
ErrSAML2NameIDMissing: "NameID ຂອງ SAML2 ຂາດຫາຍ ຫຼືບໍ່ຖືກຕ້ອງ."
ErrSAML2SessionIndexMissing: "SessionIndex ຂອງ SAML2 ຂາດຫາຍ ຫຼືບໍ່ຖືກຕ້ອງ."
ErrSAML2NameConflictLocal: "ຊື່ຜູ້ໃຊ້ SAML2 ຂັດກັບຜູ້ໃຊ້ທ້ອງຖິ່ນ."
ErrSAML2NameConflictLDAP: "ຊື່ຜູ້ໃຊ້ SAML2 ຂັດກັບຜູ້ໃຊ້ LDAP."
ErrSAML2NameConflictOIDC: "ຊື່ຜູ້ໃຊ້ SAML2 ຂັດກັບຜູ້ໃຊ້ OIDC."
ErrSAML2NameConflictSAML2: "ຊື່ຜູ້ໃຊ້ SAML2 ຂັດກັບຕົວຕົນ SAML2 ອື່ນ."
ErrSAML2Internal: "ເກີດຂໍ້ຜິດພາດພາຍໃນລະຫວ່າງການຢືນຢັນ SAML2. ລອງໃໝ່ພາຍຫຼັງ."
ErrSAML2LogoutExpired: "ຄຳຮ້ອງຂໍອອກລະບົບ SAML2 ໝົດອາຍຸແລ້ວ."
ErrSAML2LogoutInvalid: "ຂໍ້ຄວາມອອກລະບົບ SAML2 ບໍ່ຖືກຕ້ອງ."
ErrSAML2LocalCredentialsReadonly: "ຊື່ຜູ້ໃຊ້ ແລະລະຫັດຜ່ານ SAML2 ຖືກຈັດການໂດຍຜູ້ໃຫ້ບໍລິການຕົວຕົນ ແລະບໍ່ສາມາດປ່ຽນໃນເຄື່ອງໄດ້."
ErrSAML2PasswordExpirationUnsupported: "ຜູ້ໃຊ້ SAML2 ບໍ່ໄດ້ໃຊ້ນະໂຍບາຍການໝົດອາຍຸລະຫັດຜ່ານທ້ອງຖິ່ນ."

View File

@@ -6,7 +6,7 @@ ErrInternalServer: 'Ralat pelayan: {{ .detail }}'
ErrInternalServerKey: "Ralat dalaman pelayan:"
ErrRecordExist: 'Rekod sudah wujud'
ErrRecordNotFound: 'Rekod tidak ditemui'
ErrStructTransform: 'Ralat penukaran: {{ .err }}'
ErrStructTransform: 'Ralat penukaran: {{ .detail }}'
ErrNotSupportType: 'Jenis tidak disokong: {{ .name }}'
ErrDemoEnvironment: 'Tidak tersedia dalam demo'
ErrCmdTimeout: 'Arahan tamat masa'
@@ -42,6 +42,29 @@ ErrPasskeyLimit: "Had Passkey telah dicapai (maksimum 5)"
ErrPasskeySession: "Sesi Passkey telah tamat tempoh atau tidak sah"
ErrPasskeyDuplicate: "Passkey sudah wujud"
ErrPasskeyVerify: "Pengesahan Passkey gagal"
ErrOIDCNotEnabled: "Pengesahan OIDC belum diaktifkan"
ErrOIDCConfigInvalid: "Konfigurasi OIDC tidak sah"
ErrOIDCConfigChanged: "Konfigurasi OIDC telah berubah; mulakan semula pengesahan"
ErrOIDCDiscoveryFailed: "Gagal menemui konfigurasi Provider OIDC"
ErrOIDCIssuerMismatch: "Issuer OIDC tidak sepadan dengan Issuer yang dikonfigurasi"
ErrOIDCUnsupportedPKCE: "Provider OIDC tidak menyokong kaedah PKCE yang diperlukan"
ErrOIDCUnsupportedSigningAlgorithm: "Algoritma tandatangan OIDC tidak disokong"
ErrOIDCInvalidState: "Status log masuk OIDC tidak sah atau telah digunakan"
ErrOIDCLoginExpired: "Permintaan log masuk OIDC telah tamat tempoh; cuba lagi"
ErrOIDCTokenExchange: "Gagal menukar kod kebenaran OIDC"
ErrOIDCTokenValidation: "Gagal mengesahkan Token OIDC"
ErrOIDCUserInfoValidation: "Gagal mengesahkan maklumat pengguna OIDC"
ErrOIDCNameClaimMissing: "Claim nama pengguna OIDC yang dikonfigurasi tiada atau tidak sah"
ErrOIDCNameConflictLocal: "Nama pengguna OIDC bercanggah dengan pengguna tempatan"
ErrOIDCNameConflictLDAP: "Nama pengguna OIDC bercanggah dengan pengguna LDAP"
ErrOIDCNameConflictOIDC: "Nama pengguna OIDC bercanggah dengan identiti OIDC lain"
ErrOIDCDefaultRoleInvalid: "Peranan lalai yang dikonfigurasi untuk OIDC tidak tersedia"
ErrOIDCPrivateAddressDenied: "Alamat Endpoint OIDC tidak dibenarkan oleh dasar keselamatan rangkaian"
ErrOIDCTLSValidation: "Pengesahan sijil TLS OIDC gagal"
ErrOIDCTestExpired: "Ujian pelayar OIDC telah tamat tempoh; jalankan semula ujian"
ErrOIDCLocalCredentialsReadonly: "Nama pengguna dan kata laluan OIDC diurus oleh Provider identiti dan tidak boleh diubah secara tempatan."
ErrOIDCPasswordExpirationUnsupported: "Pengguna OIDC tidak menggunakan dasar tamat tempoh kata laluan tempatan."
ErrOIDCInternal: "Pengesahan OIDC mengalami ralat dalaman. Cuba lagi kemudian."
# pengguna dan kebenaran
ErrNoSuchUser: "Maklumat pengguna tidak ditemui, sila semak dan cuba lagi"
@@ -114,12 +137,12 @@ ErrVMNotFound: "Mesin maya tidak wujud"
ErrVMAlreadyExists: "Mesin maya sudah wujud"
ErrVMImageAlreadyExists: "Fail imej mesin maya sudah wujud: {{ .detail }}"
ErrVMStoragePathInUse: "Laluan kolam storan sudah digunakan oleh [{{ .name }}]"
ErrVMHelperNotFound: "1panel-kvm not found"
ErrVMBridgeManaged: "Bridge name is already managed by libvirt or Docker"
ErrVMNetworkInUse: "Network is in use and cannot be deleted"
ErrVMStorageInUse: "Storage pool is in use and cannot be deleted"
ErrVMStorageNameCannotChange: "Storage pool name cannot be changed"
ErrVMStoragePathCannotChange: "Storage pool path cannot be changed"
ErrVMHelperNotFound: "1panel-kvm tidak ditemui"
ErrVMBridgeManaged: "Nama bridge telah diurus oleh libvirt atau Docker"
ErrVMNetworkInUse: "Rangkaian sedang digunakan dan tidak boleh dipadamkan"
ErrVMStorageInUse: "Kumpulan storan sedang digunakan dan tidak boleh dipadamkan"
ErrVMStorageNameCannotChange: "Nama kumpulan storan tidak boleh diubah"
ErrVMStoragePathCannotChange: "Laluan kumpulan storan tidak boleh diubah"
ErrVMRunning: "Mesin maya sedang berjalan"
ErrVMLibvirtConnect: "Gagal menyambung ke libvirt: {{ .detail }}"
ErrVMPermission: "Tiada kebenaran untuk mengendalikan mesin maya: {{ .detail }}"
@@ -190,7 +213,7 @@ TaskSync: 'Selaraskan'
TaskSyncForNode: "Segerakan Data Nod"
TaskBackup: "Sandaran"
TaskPush: "Hantar"
TaskRsync: "Sync"
TaskRsync: "Selaraskan"
SuccessStatus: "{{ .name }} berjaya"
FailedStatus: "{{ .name }} gagal {{ .err }}"
Start: "Mula"
@@ -255,7 +278,7 @@ PushAppInstallTaskToNode: "Hantar tugas pemasangan aplikasi ke nod [{{ .name }}]
AppInstallTask: "Tugas pemasangan aplikasi"
PushAppFailed: "Gagal menghantar tugas pemasangan aplikasi"
SkillHubInstallTask: "Pasang kemahiran [{{ .name }}]"
SkillHubInstallToTarget: "Pasang kemahiran ke sasaran [{{ .name }}]"
SkillHubInstallToTarget: "Pasang kemahiran [{{ .name }}] ke sasaran [{{ .target }}]"
# pustaka skrip
ScriptLibrary: "Pustaka Skrip"
@@ -312,25 +335,25 @@ StartService: "Mulakan perkhidmatan"
NoBackupNode: "Nod sandaran kosong. Sila pilih nod sandaran untuk disimpan dan cuba lagi"
# penyegerakan fail dan imej nod
LocalNodeIpFailed: "Failed to get master node IP. Edit the master node and add IP address and SSH authentication information."
HandlePrivateKey: "Handle node private key"
HandlePublicKey: "Handle node public key"
ExchangeFile: "Start syncing {{ .sourcePath }} from node {{ .source }} to node {{ .dest }}:{{ .destPath }}"
NodeFile: "Node file"
ImageSyncTaskName: "Image sync {{ .count }} images"
SSLSyncTaskName: "Certificate sync {{ .count }} certificates"
AppSyncTaskName: "App sync {{ .name }}"
SSLSyncToNode: "Push certificate [{{ .cert }}] to node [{{ .node }}]"
ImageSyncSave: "Save image {{ .image }}"
ImageSyncSaveTags: "Save image tags {{ .tags }}"
ImageSyncToNode: "Sync image {{ .image }} to node {{ .node }}"
ImageSyncLoad: "Load image {{ .image }} on node {{ .node }}"
ImageSyncClean: "Clean temporary files for image {{ .image }}"
ImageSyncNoTag: "Image {{ .image }} has no tag and will be saved by image ID"
ImageSyncFrontendTagsIgnored: "No tags were found for image {{ .image }} on the source node. Frontend tags were ignored."
ImageSyncHandlePrivateKey: "Handle image sync node private key"
ImageSyncHandlePublicKey: "Handle image sync node public key"
ImageSyncTransfer: "Start transferring image temporary file: {{ .source }}:{{ .sourcePath }} -> {{ .dest }}:{{ .destPath }}"
LocalNodeIpFailed: "Gagal mendapatkan IP nod induk. Edit nod induk dan tambahkan alamat IP serta maklumat pengesahan SSH."
HandlePrivateKey: "Kendalikan kunci peribadi nod"
HandlePublicKey: "Kendalikan kunci awam nod"
ExchangeFile: "Mulakan penyegerakan {{ .sourcePath }} dari nod {{ .source }} ke nod {{ .dest }}:{{ .destPath }}"
NodeFile: "Fail nod"
ImageSyncTaskName: "Segerakkan {{ .count }} imej"
SSLSyncTaskName: "Segerakkan {{ .count }} sijil"
AppSyncTaskName: "Segerakkan aplikasi {{ .name }}"
SSLSyncToNode: "Hantar sijil [{{ .cert }}] ke nod [{{ .node }}]"
ImageSyncSave: "Simpan imej {{ .image }}"
ImageSyncSaveTags: "Simpan tag imej {{ .tags }}"
ImageSyncToNode: "Segerakkan imej {{ .image }} ke nod {{ .node }}"
ImageSyncLoad: "Muatkan imej {{ .image }} pada nod {{ .node }}"
ImageSyncClean: "Bersihkan fail sementara imej {{ .image }}"
ImageSyncNoTag: "Imej {{ .image }} tidak mempunyai tag dan akan disimpan menggunakan ID imej"
ImageSyncFrontendTagsIgnored: "Tiada tag ditemui untuk imej {{ .image }} pada nod sumber. Tag frontend telah diabaikan."
ImageSyncHandlePrivateKey: "Kendalikan kunci peribadi nod penyegerakan imej"
ImageSyncHandlePublicKey: "Kendalikan kunci awam nod penyegerakan imej"
ImageSyncTransfer: "Mulakan pemindahan fail sementara imej: {{ .source }}:{{ .sourcePath }} -> {{ .dest }}:{{ .destPath }}"
# baris perintah
SudoHelper: "Sila gunakan {{ .cmd }} atau tukar ke pengguna root"
@@ -472,3 +495,33 @@ ErrLDAPSyncRunning: "Tugas penyegerakan LDAP sedang berjalan."
ErrLDAPSyncDirectoryIncomplete: "LDAP mengembalikan hasil pertanyaan penuh yang tidak lengkap. Tiada status pengguna diubah."
ErrLDAPSyncFailed: "Penyegerakan pengguna LDAP gagal."
LDAPSyncSuccess: "Penyegerakan pengguna LDAP berjaya diselesaikan."
ErrSAML2NotEnabled: "Pengesahan SAML2 tidak didayakan."
ErrSAML2ConfigInvalid: "Konfigurasi SAML2 tidak sah."
ErrSAML2ConfigChanged: "Konfigurasi SAML2 telah berubah. Mulakan pengesahan sekali lagi."
ErrSAML2PanelOriginMissing: "Masukkan URL awam 1Panel yang sah dan hanya mengandungi skema, hos serta port pilihan."
ErrSAML2MetadataInvalid: "Metadata IdP tiada atau tidak sah."
ErrSAML2MetadataURLInvalid: "URL metadata IdP atau titik akhir dalam metadata tidak dibenarkan."
ErrSAML2MetadataFetch: "Gagal memuatkan metadata IdP."
ErrSAML2MetadataCertificate: "Metadata IdP tidak mengandungi sijil tandatangan yang boleh digunakan."
ErrSAML2KeyPairInvalid: "Kunci peribadi dan sijil SP tidak sah atau tidak sepadan."
ErrSAML2NameAttributeMissing: "Atribut nama pengguna SAML2 yang dikonfigurasikan tiada atau tidak sah."
ErrSAML2DefaultRoleInvalid: "Peranan lalai yang dikonfigurasikan untuk SAML2 tidak tersedia."
ErrSAML2SLOUnavailable: "IdP tidak menyediakan perkhidmatan Single Logout yang disokong."
ErrSAML2TestExpired: "Ujian SAML2 telah tamat tempoh. Jalankan sekali lagi."
ErrSAML2LoginExpired: "Permintaan log masuk SAML2 telah tamat tempoh. Cuba lagi."
ErrSAML2InvalidState: "Keadaan log masuk SAML2 tidak sah atau telah digunakan."
ErrSAML2RequestBuild: "Gagal membina permintaan SAML2."
ErrSAML2ResponseInvalid: "Respons SAML2 tidak sah."
ErrSAML2SignatureInvalid: "Tandatangan SAML2 tidak sah."
ErrSAML2Replay: "Mesej SAML2 telah digunakan."
ErrSAML2NameIDMissing: "NameID SAML2 tiada atau tidak sah."
ErrSAML2SessionIndexMissing: "SessionIndex SAML2 tiada atau tidak sah."
ErrSAML2NameConflictLocal: "Nama pengguna SAML2 bercanggah dengan pengguna setempat."
ErrSAML2NameConflictLDAP: "Nama pengguna SAML2 bercanggah dengan pengguna LDAP."
ErrSAML2NameConflictOIDC: "Nama pengguna SAML2 bercanggah dengan pengguna OIDC."
ErrSAML2NameConflictSAML2: "Nama pengguna SAML2 bercanggah dengan identiti SAML2 lain."
ErrSAML2Internal: "Ralat dalaman berlaku semasa pengesahan SAML2. Cuba lagi kemudian."
ErrSAML2LogoutExpired: "Permintaan log keluar SAML2 telah tamat tempoh."
ErrSAML2LogoutInvalid: "Mesej log keluar SAML2 tidak sah."
ErrSAML2LocalCredentialsReadonly: "Nama pengguna dan kata laluan SAML2 diurus oleh penyedia identiti dan tidak boleh diubah secara setempat."
ErrSAML2PasswordExpirationUnsupported: "Pengguna SAML2 tidak menggunakan dasar tamat tempoh kata laluan setempat."

View File

@@ -6,7 +6,7 @@ ErrInternalServer: 'Erro interno: {{ .detail }}'
ErrInternalServerKey: "Erro interno do servidor:"
ErrRecordExist: 'Registro já existe'
ErrRecordNotFound: 'Registro não encontrado'
ErrStructTransform: 'Erro de conversão: {{ .err }}'
ErrStructTransform: 'Erro de conversão: {{ .detail }}'
ErrNotSupportType: 'Tipo não suportado: {{ .name }}'
ErrDemoEnvironment: 'Indisponível em demo'
ErrCmdTimeout: 'Comando expirou'
@@ -42,6 +42,29 @@ ErrPasskeyLimit: "Limite de Passkeys atingido (máximo 5)"
ErrPasskeySession: "Sessão do Passkey expirada ou inválida"
ErrPasskeyDuplicate: "Passkey já existe"
ErrPasskeyVerify: "Falha na verificação do Passkey"
ErrOIDCNotEnabled: "A autenticação OIDC não está habilitada"
ErrOIDCConfigInvalid: "A configuração OIDC é inválida"
ErrOIDCConfigChanged: "A configuração OIDC foi alterada; inicie a autenticação novamente"
ErrOIDCDiscoveryFailed: "Falha ao descobrir a configuração do Provider OIDC"
ErrOIDCIssuerMismatch: "O Issuer OIDC não corresponde ao Issuer configurado"
ErrOIDCUnsupportedPKCE: "O Provider OIDC não oferece suporte ao método PKCE necessário"
ErrOIDCUnsupportedSigningAlgorithm: "O algoritmo de assinatura OIDC não é suportado"
ErrOIDCInvalidState: "O estado de login OIDC é inválido ou já foi utilizado"
ErrOIDCLoginExpired: "A solicitação de login OIDC expirou; tente novamente"
ErrOIDCTokenExchange: "Falha ao trocar o código de autorização OIDC"
ErrOIDCTokenValidation: "Falha ao validar o Token OIDC"
ErrOIDCUserInfoValidation: "Falha ao validar as informações do usuário OIDC"
ErrOIDCNameClaimMissing: "O Claim de nome de usuário OIDC configurado está ausente ou é inválido"
ErrOIDCNameConflictLocal: "O nome de usuário OIDC entra em conflito com um usuário local"
ErrOIDCNameConflictLDAP: "O nome de usuário OIDC entra em conflito com um usuário LDAP"
ErrOIDCNameConflictOIDC: "O nome de usuário OIDC entra em conflito com outra identidade OIDC"
ErrOIDCDefaultRoleInvalid: "A função padrão configurada para OIDC não está disponível"
ErrOIDCPrivateAddressDenied: "O endereço do Endpoint OIDC não é permitido pela política de segurança de rede"
ErrOIDCTLSValidation: "Falha na validação do certificado TLS OIDC"
ErrOIDCTestExpired: "O teste OIDC no navegador expirou; execute-o novamente"
ErrOIDCLocalCredentialsReadonly: "Os nomes de usuário e as senhas OIDC são gerenciados pelo Provider de identidade e não podem ser alterados localmente."
ErrOIDCPasswordExpirationUnsupported: "Os usuários OIDC não utilizam a política local de expiração de senha."
ErrOIDCInternal: "Ocorreu um erro interno na autenticação OIDC. Tente novamente mais tarde."
# usuário e permissão
ErrNoSuchUser: "Informações do usuário não encontradas. Verifique e tente novamente."
@@ -114,12 +137,12 @@ ErrVMNotFound: "Máquina virtual não existe"
ErrVMAlreadyExists: "Máquina virtual já existe"
ErrVMImageAlreadyExists: "A imagem da máquina virtual já existe: {{ .detail }}"
ErrVMStoragePathInUse: "O caminho do pool de armazenamento já é usado por [{{ .name }}]"
ErrVMHelperNotFound: "1panel-kvm not found"
ErrVMBridgeManaged: "Bridge name is already managed by libvirt or Docker"
ErrVMNetworkInUse: "Network is in use and cannot be deleted"
ErrVMStorageInUse: "Storage pool is in use and cannot be deleted"
ErrVMStorageNameCannotChange: "Storage pool name cannot be changed"
ErrVMStoragePathCannotChange: "Storage pool path cannot be changed"
ErrVMHelperNotFound: "1panel-kvm não encontrado"
ErrVMBridgeManaged: "O nome da bridge já é gerenciado pelo libvirt ou Docker"
ErrVMNetworkInUse: "A rede está em uso e não pode ser excluída"
ErrVMStorageInUse: "O pool de armazenamento está em uso e não pode ser excluído"
ErrVMStorageNameCannotChange: "O nome do pool de armazenamento não pode ser alterado"
ErrVMStoragePathCannotChange: "O caminho do pool de armazenamento não pode ser alterado"
ErrVMRunning: "Máquina virtual está em execução"
ErrVMLibvirtConnect: "Falha ao conectar ao libvirt: {{ .detail }}"
ErrVMPermission: "Sem permissão para operar a máquina virtual: {{ .detail }}"
@@ -188,9 +211,9 @@ TaskInstall: "Instalar"
TaskUpgrade: "Atualizar"
TaskSync: 'Sincronizar'
TaskSyncForNode: "Sincronizar Dados do Nó"
TaskBackup: "Backup"
TaskBackup: "Fazer cópia de segurança"
TaskPush: "Enviar"
TaskRsync: "Sync"
TaskRsync: "Sincronizar"
SuccessStatus: "{{ .name }} bem-sucedido"
FailedStatus: "{{ .name }} falhou {{ .err }}"
Start: "Iniciar"
@@ -255,7 +278,7 @@ PushAppInstallTaskToNode: "Enviar tarefa de instalação de aplicativo para o n
AppInstallTask: "Tarefa de instalação de aplicativo"
PushAppFailed: "Falha ao enviar tarefa de instalação de aplicativo"
SkillHubInstallTask: "Instalar skill [{{ .name }}]"
SkillHubInstallToTarget: "Instalar skill no destino [{{ .name }}]"
SkillHubInstallToTarget: "Instalar skill [{{ .name }}] no destino [{{ .target }}]"
# biblioteca de scripts
ScriptLibrary: "Biblioteca de Scripts"
@@ -312,25 +335,25 @@ StartService: "Iniciando serviço"
NoBackupNode: "O nó de backup está vazio atualmente. Selecione um nó de backup para salvar e tente novamente"
# sincronização de arquivos e imagens do nó
LocalNodeIpFailed: "Failed to get master node IP. Edit the master node and add IP address and SSH authentication information."
HandlePrivateKey: "Handle node private key"
HandlePublicKey: "Handle node public key"
ExchangeFile: "Start syncing {{ .sourcePath }} from node {{ .source }} to node {{ .dest }}:{{ .destPath }}"
NodeFile: "Node file"
ImageSyncTaskName: "Image sync {{ .count }} images"
SSLSyncTaskName: "Certificate sync {{ .count }} certificates"
AppSyncTaskName: "App sync {{ .name }}"
SSLSyncToNode: "Push certificate [{{ .cert }}] to node [{{ .node }}]"
ImageSyncSave: "Save image {{ .image }}"
ImageSyncSaveTags: "Save image tags {{ .tags }}"
ImageSyncToNode: "Sync image {{ .image }} to node {{ .node }}"
ImageSyncLoad: "Load image {{ .image }} on node {{ .node }}"
ImageSyncClean: "Clean temporary files for image {{ .image }}"
ImageSyncNoTag: "Image {{ .image }} has no tag and will be saved by image ID"
ImageSyncFrontendTagsIgnored: "No tags were found for image {{ .image }} on the source node. Frontend tags were ignored."
ImageSyncHandlePrivateKey: "Handle image sync node private key"
ImageSyncHandlePublicKey: "Handle image sync node public key"
ImageSyncTransfer: "Start transferring image temporary file: {{ .source }}:{{ .sourcePath }} -> {{ .dest }}:{{ .destPath }}"
LocalNodeIpFailed: "Falha ao obter o IP do nó mestre. Edite o nó mestre e adicione o endereço IP e as informações de autenticação SSH."
HandlePrivateKey: "Processar a chave privada do nó"
HandlePublicKey: "Processar a chave pública do nó"
ExchangeFile: "Iniciar a sincronização de {{ .sourcePath }} do nó {{ .source }} para o nó {{ .dest }}:{{ .destPath }}"
NodeFile: "Arquivo do nó"
ImageSyncTaskName: "Sincronizar {{ .count }} imagens"
SSLSyncTaskName: "Sincronizar {{ .count }} certificados"
AppSyncTaskName: "Sincronizar o aplicativo {{ .name }}"
SSLSyncToNode: "Enviar o certificado [{{ .cert }}] para o nó [{{ .node }}]"
ImageSyncSave: "Salvar a imagem {{ .image }}"
ImageSyncSaveTags: "Salvar as tags da imagem {{ .tags }}"
ImageSyncToNode: "Sincronizar a imagem {{ .image }} com o nó {{ .node }}"
ImageSyncLoad: "Carregar a imagem {{ .image }} no nó {{ .node }}"
ImageSyncClean: "Limpar os arquivos temporários da imagem {{ .image }}"
ImageSyncNoTag: "A imagem {{ .image }} não tem tag e será salva pelo ID da imagem"
ImageSyncFrontendTagsIgnored: "Nenhuma tag foi encontrada para a imagem {{ .image }} no nó de origem. As tags do frontend foram ignoradas."
ImageSyncHandlePrivateKey: "Processar a chave privada do nó de sincronização de imagens"
ImageSyncHandlePublicKey: "Processar a chave pública do nó de sincronização de imagens"
ImageSyncTransfer: "Iniciar a transferência do arquivo temporário da imagem: {{ .source }}:{{ .sourcePath }} -> {{ .dest }}:{{ .destPath }}"
# linha de comando
SudoHelper: "Por favor, use {{ .cmd }} ou altere para o usuário root"
@@ -472,3 +495,33 @@ ErrLDAPSyncRunning: "Uma tarefa de sincronização LDAP já está em execução.
ErrLDAPSyncDirectoryIncomplete: "O LDAP retornou um resultado incompleto da consulta completa. Nenhum status de usuário foi alterado."
ErrLDAPSyncFailed: "Falha na sincronização de usuários LDAP."
LDAPSyncSuccess: "A sincronização de usuários LDAP foi concluída com sucesso."
ErrSAML2NotEnabled: "A autenticação SAML2 não está ativada."
ErrSAML2ConfigInvalid: "A configuração do SAML2 é inválida."
ErrSAML2ConfigChanged: "A configuração do SAML2 foi alterada. Inicie a autenticação novamente."
ErrSAML2PanelOriginMissing: "Insira uma URL pública válida do 1Panel contendo apenas o esquema, o host e uma porta opcional."
ErrSAML2MetadataInvalid: "Os metadados do IdP estão ausentes ou são inválidos."
ErrSAML2MetadataURLInvalid: "A URL de metadados do IdP ou um endpoint contido neles não é permitido."
ErrSAML2MetadataFetch: "Falha ao carregar os metadados do IdP."
ErrSAML2MetadataCertificate: "Os metadados do IdP não contêm um certificado de assinatura utilizável."
ErrSAML2KeyPairInvalid: "A chave privada e o certificado do SP são inválidos ou não correspondem."
ErrSAML2NameAttributeMissing: "O atributo de nome de usuário SAML2 configurado está ausente ou é inválido."
ErrSAML2DefaultRoleInvalid: "A função padrão configurada para o SAML2 não está disponível."
ErrSAML2SLOUnavailable: "O IdP não fornece um serviço de logout único compatível."
ErrSAML2TestExpired: "O teste do SAML2 expirou. Execute-o novamente."
ErrSAML2LoginExpired: "A solicitação de login do SAML2 expirou. Tente novamente."
ErrSAML2InvalidState: "O estado de login do SAML2 é inválido ou já foi utilizado."
ErrSAML2RequestBuild: "Falha ao criar a solicitação SAML2."
ErrSAML2ResponseInvalid: "A resposta SAML2 é inválida."
ErrSAML2SignatureInvalid: "A assinatura SAML2 é inválida."
ErrSAML2Replay: "A mensagem SAML2 já foi utilizada."
ErrSAML2NameIDMissing: "O NameID do SAML2 está ausente ou é inválido."
ErrSAML2SessionIndexMissing: "O SessionIndex do SAML2 está ausente ou é inválido."
ErrSAML2NameConflictLocal: "O nome de usuário SAML2 entra em conflito com um usuário local."
ErrSAML2NameConflictLDAP: "O nome de usuário SAML2 entra em conflito com um usuário LDAP."
ErrSAML2NameConflictOIDC: "O nome de usuário SAML2 entra em conflito com um usuário OIDC."
ErrSAML2NameConflictSAML2: "O nome de usuário SAML2 entra em conflito com outra identidade SAML2."
ErrSAML2Internal: "Ocorreu um erro interno durante a autenticação SAML2. Tente novamente mais tarde."
ErrSAML2LogoutExpired: "A solicitação de logout do SAML2 expirou."
ErrSAML2LogoutInvalid: "A mensagem de logout do SAML2 é inválida."
ErrSAML2LocalCredentialsReadonly: "Os nomes de usuário e as senhas SAML2 são gerenciados pelo provedor de identidade e não podem ser alterados localmente."
ErrSAML2PasswordExpirationUnsupported: "Os usuários SAML2 não usam a política local de expiração de senha."

View File

@@ -6,7 +6,7 @@ ErrInternalServer: 'Внутренняя ошибка: {{ .detail }}'
ErrInternalServerKey: "Внутренняя ошибка сервера:"
ErrRecordExist: 'Запись уже существует'
ErrRecordNotFound: 'Запись не найдена'
ErrStructTransform: 'Ошибка преобразования: {{ .err }}'
ErrStructTransform: 'Ошибка преобразования: {{ .detail }}'
ErrNotSupportType: 'Тип не поддерживается: {{ .name }}'
ErrDemoEnvironment: 'Недоступно в демо'
ErrCmdTimeout: 'Команда завершилась по тайм-ауту'
@@ -42,6 +42,29 @@ ErrPasskeyLimit: "Достигнут лимит Passkey (максимум 5)"
ErrPasskeySession: "Сеанс Passkey истек или недействителен"
ErrPasskeyDuplicate: "Passkey уже существует"
ErrPasskeyVerify: "Не удалось проверить Passkey"
ErrOIDCNotEnabled: "Аутентификация OIDC не включена"
ErrOIDCConfigInvalid: "Конфигурация OIDC недействительна"
ErrOIDCConfigChanged: "Конфигурация OIDC изменилась; запустите аутентификацию заново"
ErrOIDCDiscoveryFailed: "Не удалось обнаружить конфигурацию Provider OIDC"
ErrOIDCIssuerMismatch: "Issuer OIDC не совпадает с настроенным Issuer"
ErrOIDCUnsupportedPKCE: "Provider OIDC не поддерживает требуемый метод PKCE"
ErrOIDCUnsupportedSigningAlgorithm: "Алгоритм подписи OIDC не поддерживается"
ErrOIDCInvalidState: "Состояние входа OIDC недействительно или уже использовано"
ErrOIDCLoginExpired: "Срок действия запроса на вход OIDC истёк; повторите попытку"
ErrOIDCTokenExchange: "Не удалось обменять код авторизации OIDC"
ErrOIDCTokenValidation: "Не удалось проверить Token OIDC"
ErrOIDCUserInfoValidation: "Не удалось проверить сведения о пользователе OIDC"
ErrOIDCNameClaimMissing: "Настроенный Claim имени пользователя OIDC отсутствует или недействителен"
ErrOIDCNameConflictLocal: "Имя пользователя OIDC конфликтует с локальным пользователем"
ErrOIDCNameConflictLDAP: "Имя пользователя OIDC конфликтует с пользователем LDAP"
ErrOIDCNameConflictOIDC: "Имя пользователя OIDC конфликтует с другой идентичностью OIDC"
ErrOIDCDefaultRoleInvalid: "Роль по умолчанию, настроенная для OIDC, недоступна"
ErrOIDCPrivateAddressDenied: "Адрес Endpoint OIDC запрещён политикой сетевой безопасности"
ErrOIDCTLSValidation: "Не удалось проверить сертификат TLS OIDC"
ErrOIDCTestExpired: "Срок действия браузерного теста OIDC истёк; запустите тест снова"
ErrOIDCLocalCredentialsReadonly: "Имена пользователей и пароли OIDC управляются Provider идентификации и не могут быть изменены локально."
ErrOIDCPasswordExpirationUnsupported: "Для пользователей OIDC не применяется локальная политика истечения срока действия пароля."
ErrOIDCInternal: "Во время аутентификации OIDC произошла внутренняя ошибка. Повторите попытку позже."
# пользователь и права
ErrNoSuchUser: "Информация о пользователе не найдена. Проверьте и повторите попытку."
@@ -114,12 +137,12 @@ ErrVMNotFound: "Виртуальная машина не существует"
ErrVMAlreadyExists: "Виртуальная машина уже существует"
ErrVMImageAlreadyExists: "Файл образа виртуальной машины уже существует: {{ .detail }}"
ErrVMStoragePathInUse: "Путь пула хранения уже используется [{{ .name }}]"
ErrVMHelperNotFound: "1panel-kvm not found"
ErrVMBridgeManaged: "Bridge name is already managed by libvirt or Docker"
ErrVMNetworkInUse: "Network is in use and cannot be deleted"
ErrVMStorageInUse: "Storage pool is in use and cannot be deleted"
ErrVMStorageNameCannotChange: "Storage pool name cannot be changed"
ErrVMStoragePathCannotChange: "Storage pool path cannot be changed"
ErrVMHelperNotFound: "1panel-kvm не найден"
ErrVMBridgeManaged: "Имя моста уже управляется libvirt или Docker"
ErrVMNetworkInUse: "Сеть используется и не может быть удалена"
ErrVMStorageInUse: "Пул хранилища используется и не может быть удалён"
ErrVMStorageNameCannotChange: "Имя пула хранилища нельзя изменить"
ErrVMStoragePathCannotChange: "Путь к пулу хранилища нельзя изменить"
ErrVMRunning: "Виртуальная машина запущена"
ErrVMLibvirtConnect: "Не удалось подключиться к libvirt: {{ .detail }}"
ErrVMPermission: "Нет разрешения на операцию с виртуальной машиной: {{ .detail }}"
@@ -190,7 +213,7 @@ TaskSync: 'Синхронизация'
TaskSyncForNode: "Синхронизировать Данные Узла"
TaskBackup: "Резервная копия"
TaskPush: "Отправить"
TaskRsync: "Sync"
TaskRsync: "Синхронизация"
SuccessStatus: "{{ .name }} успешно"
FailedStatus: "{{ .name }} не удалось {{ .err }}"
Start: "Начать"
@@ -255,7 +278,7 @@ PushAppInstallTaskToNode: "Отправить задачу установки п
AppInstallTask: "Задача установки приложения"
PushAppFailed: "Не удалось отправить задачу установки приложения"
SkillHubInstallTask: "Установить навык [{{ .name }}]"
SkillHubInstallToTarget: "Установить навык в цель [{{ .name }}]"
SkillHubInstallToTarget: "Установить навык [{{ .name }}] в цель [{{ .target }}]"
# библиотека скриптов
ScriptLibrary: "Библиотека скриптов"
@@ -312,25 +335,25 @@ StartService: "Запустить сервис"
NoBackupNode: "Резервный узел в настоящее время пуст. Выберите резервный узел для сохранения и повторите попытку"
# синхронизация файлов и образов узла
LocalNodeIpFailed: "Failed to get master node IP. Edit the master node and add IP address and SSH authentication information."
HandlePrivateKey: "Handle node private key"
HandlePublicKey: "Handle node public key"
ExchangeFile: "Start syncing {{ .sourcePath }} from node {{ .source }} to node {{ .dest }}:{{ .destPath }}"
NodeFile: "Node file"
ImageSyncTaskName: "Image sync {{ .count }} images"
SSLSyncTaskName: "Certificate sync {{ .count }} certificates"
AppSyncTaskName: "App sync {{ .name }}"
SSLSyncToNode: "Push certificate [{{ .cert }}] to node [{{ .node }}]"
ImageSyncSave: "Save image {{ .image }}"
ImageSyncSaveTags: "Save image tags {{ .tags }}"
ImageSyncToNode: "Sync image {{ .image }} to node {{ .node }}"
ImageSyncLoad: "Load image {{ .image }} on node {{ .node }}"
ImageSyncClean: "Clean temporary files for image {{ .image }}"
ImageSyncNoTag: "Image {{ .image }} has no tag and will be saved by image ID"
ImageSyncFrontendTagsIgnored: "No tags were found for image {{ .image }} on the source node. Frontend tags were ignored."
ImageSyncHandlePrivateKey: "Handle image sync node private key"
ImageSyncHandlePublicKey: "Handle image sync node public key"
ImageSyncTransfer: "Start transferring image temporary file: {{ .source }}:{{ .sourcePath }} -> {{ .dest }}:{{ .destPath }}"
LocalNodeIpFailed: "Не удалось получить IP главного узла. Измените главный узел и добавьте IP-адрес и данные аутентификации SSH."
HandlePrivateKey: "Обработать закрытый ключ узла"
HandlePublicKey: "Обработать открытый ключ узла"
ExchangeFile: "Начать синхронизацию {{ .sourcePath }} с узла {{ .source }} на узел {{ .dest }}:{{ .destPath }}"
NodeFile: "Файл узла"
ImageSyncTaskName: "Синхронизировать образы: {{ .count }}"
SSLSyncTaskName: "Синхронизировать сертификаты: {{ .count }}"
AppSyncTaskName: "Синхронизировать приложение {{ .name }}"
SSLSyncToNode: "Отправить сертификат [{{ .cert }}] на узел [{{ .node }}]"
ImageSyncSave: "Сохранить образ {{ .image }}"
ImageSyncSaveTags: "Сохранить теги образа {{ .tags }}"
ImageSyncToNode: "Синхронизировать образ {{ .image }} с узлом {{ .node }}"
ImageSyncLoad: "Загрузить образ {{ .image }} на узел {{ .node }}"
ImageSyncClean: "Очистить временные файлы образа {{ .image }}"
ImageSyncNoTag: "У образа {{ .image }} нет тега, поэтому он будет сохранён по ID образа"
ImageSyncFrontendTagsIgnored: "На исходном узле не найдены теги образа {{ .image }}. Теги из frontend проигнорированы."
ImageSyncHandlePrivateKey: "Обработать закрытый ключ узла синхронизации образов"
ImageSyncHandlePublicKey: "Обработать открытый ключ узла синхронизации образов"
ImageSyncTransfer: "Начать передачу временного файла образа: {{ .source }}:{{ .sourcePath }} -> {{ .dest }}:{{ .destPath }}"
# командная строка
SudoHelper: "Пожалуйста, используйте {{ .cmd }} или переключитесь на пользователя root"
@@ -472,3 +495,33 @@ ErrLDAPSyncRunning: "Задача синхронизации LDAP уже вып
ErrLDAPSyncDirectoryIncomplete: "LDAP вернул неполный результат полного запроса. Статусы пользователей не были изменены."
ErrLDAPSyncFailed: "Не удалось синхронизировать пользователей LDAP."
LDAPSyncSuccess: "Синхронизация пользователей LDAP успешно завершена."
ErrSAML2NotEnabled: "Аутентификация SAML2 не включена."
ErrSAML2ConfigInvalid: "Конфигурация SAML2 недействительна."
ErrSAML2ConfigChanged: "Конфигурация SAML2 изменилась. Запустите аутентификацию заново."
ErrSAML2PanelOriginMissing: "Введите корректный публичный URL 1Panel, содержащий только схему, хост и необязательный порт."
ErrSAML2MetadataInvalid: "Метаданные IdP отсутствуют или недействительны."
ErrSAML2MetadataURLInvalid: "URL метаданных IdP или одна из конечных точек в метаданных не разрешены."
ErrSAML2MetadataFetch: "Не удалось загрузить метаданные IdP."
ErrSAML2MetadataCertificate: "Метаданные IdP не содержат подходящего сертификата подписи."
ErrSAML2KeyPairInvalid: "Закрытый ключ и сертификат SP недействительны или не соответствуют друг другу."
ErrSAML2NameAttributeMissing: "Настроенный атрибут имени пользователя SAML2 отсутствует или недействителен."
ErrSAML2DefaultRoleInvalid: "Роль по умолчанию, настроенная для SAML2, недоступна."
ErrSAML2SLOUnavailable: "IdP не предоставляет поддерживаемую службу единого выхода."
ErrSAML2TestExpired: "Срок действия теста SAML2 истек. Запустите его снова."
ErrSAML2LoginExpired: "Срок действия запроса на вход SAML2 истек. Повторите попытку."
ErrSAML2InvalidState: "Состояние входа SAML2 недействительно или уже использовано."
ErrSAML2RequestBuild: "Не удалось сформировать запрос SAML2."
ErrSAML2ResponseInvalid: "Ответ SAML2 недействителен."
ErrSAML2SignatureInvalid: "Подпись SAML2 недействительна."
ErrSAML2Replay: "Сообщение SAML2 уже было использовано."
ErrSAML2NameIDMissing: "NameID SAML2 отсутствует или недействителен."
ErrSAML2SessionIndexMissing: "SessionIndex SAML2 отсутствует или недействителен."
ErrSAML2NameConflictLocal: "Имя пользователя SAML2 конфликтует с локальным пользователем."
ErrSAML2NameConflictLDAP: "Имя пользователя SAML2 конфликтует с пользователем LDAP."
ErrSAML2NameConflictOIDC: "Имя пользователя SAML2 конфликтует с пользователем OIDC."
ErrSAML2NameConflictSAML2: "Имя пользователя SAML2 конфликтует с другой учетной записью SAML2."
ErrSAML2Internal: "Во время аутентификации SAML2 произошла внутренняя ошибка. Повторите попытку позже."
ErrSAML2LogoutExpired: "Срок действия запроса на выход SAML2 истек."
ErrSAML2LogoutInvalid: "Сообщение выхода SAML2 недействительно."
ErrSAML2LocalCredentialsReadonly: "Имена пользователей и пароли SAML2 управляются поставщиком удостоверений и не могут быть изменены локально."
ErrSAML2PasswordExpirationUnsupported: "Для пользователей SAML2 не применяется локальная политика срока действия паролей."

View File

@@ -6,7 +6,7 @@ ErrInternalServer: 'Sunucu hatası: {{ .detail }}'
ErrInternalServerKey: "İç sunucu hatası:"
ErrRecordExist: 'Kayıt zaten var'
ErrRecordNotFound: 'Kayıt bulunamadı'
ErrStructTransform: 'Dönüşüm hatası: {{ .err }}'
ErrStructTransform: 'Dönüşüm hatası: {{ .detail }}'
ErrNotSupportType: 'Bu tür desteklenmiyor: {{ .name }}'
ErrDemoEnvironment: 'Demo modunda yok'
ErrCmdTimeout: 'Komut zaman aşımına uğradı'
@@ -42,6 +42,29 @@ ErrPasskeyLimit: "Passkey sınırına ulaşıldı (en fazla 5)"
ErrPasskeySession: "Passkey oturumu süresi dolmuş veya geçersiz"
ErrPasskeyDuplicate: "Passkey zaten mevcut"
ErrPasskeyVerify: "Passkey doğrulaması başarısız"
ErrOIDCNotEnabled: "OIDC kimlik doğrulaması etkin değil"
ErrOIDCConfigInvalid: "OIDC yapılandırması geçersiz"
ErrOIDCConfigChanged: "OIDC yapılandırması değişti; kimlik doğrulamayı yeniden başlatın"
ErrOIDCDiscoveryFailed: "OIDC Provider yapılandırması keşfedilemedi"
ErrOIDCIssuerMismatch: "OIDC Issuer, yapılandırılan Issuer ile eşleşmiyor"
ErrOIDCUnsupportedPKCE: "OIDC Provider gerekli PKCE yöntemini desteklemiyor"
ErrOIDCUnsupportedSigningAlgorithm: "OIDC imza algoritması desteklenmiyor"
ErrOIDCInvalidState: "OIDC oturum açma durumu geçersiz veya daha önce kullanılmış"
ErrOIDCLoginExpired: "OIDC oturum açma isteğinin süresi doldu; tekrar deneyin"
ErrOIDCTokenExchange: "OIDC yetkilendirme kodu değişimi başarısız oldu"
ErrOIDCTokenValidation: "OIDC Token doğrulaması başarısız oldu"
ErrOIDCUserInfoValidation: "OIDC kullanıcı bilgileri doğrulanamadı"
ErrOIDCNameClaimMissing: "Yapılandırılan OIDC kullanıcı adı Claim alanı eksik veya geçersiz"
ErrOIDCNameConflictLocal: "OIDC kullanıcı adı yerel bir kullanıcıyla çakışıyor"
ErrOIDCNameConflictLDAP: "OIDC kullanıcı adı bir LDAP kullanıcısıyla çakışıyor"
ErrOIDCNameConflictOIDC: "OIDC kullanıcı adı başka bir OIDC kimliğiyle çakışıyor"
ErrOIDCDefaultRoleInvalid: "OIDC için yapılandırılan varsayılan rol kullanılamıyor"
ErrOIDCPrivateAddressDenied: "OIDC Endpoint adresine ağ güvenliği ilkesi tarafından izin verilmiyor"
ErrOIDCTLSValidation: "OIDC TLS sertifikası doğrulanamadı"
ErrOIDCTestExpired: "OIDC tarayıcı testinin süresi doldu; testi yeniden çalıştırın"
ErrOIDCLocalCredentialsReadonly: "OIDC kullanıcı adları ve parolaları kimlik Provider tarafından yönetilir ve yerel olarak değiştirilemez."
ErrOIDCPasswordExpirationUnsupported: "OIDC kullanıcıları yerel parola sona erme ilkesini kullanmaz."
ErrOIDCInternal: "OIDC kimlik doğrulamasında dahili bir hata oluştu. Lütfen daha sonra tekrar deneyin."
# kullanıcı ve izin
ErrNoSuchUser: "Kullanıcı bilgisi bulunamadı, lütfen kontrol edip tekrar deneyin"
@@ -114,12 +137,12 @@ ErrVMNotFound: "Sanal makine mevcut değil"
ErrVMAlreadyExists: "Sanal makine zaten mevcut"
ErrVMImageAlreadyExists: "Sanal makine imaj dosyası zaten mevcut: {{ .detail }}"
ErrVMStoragePathInUse: "Depolama havuzu yolu zaten [{{ .name }}] tarafından kullanılıyor"
ErrVMHelperNotFound: "1panel-kvm not found"
ErrVMBridgeManaged: "Bridge name is already managed by libvirt or Docker"
ErrVMNetworkInUse: "Network is in use and cannot be deleted"
ErrVMStorageInUse: "Storage pool is in use and cannot be deleted"
ErrVMStorageNameCannotChange: "Storage pool name cannot be changed"
ErrVMStoragePathCannotChange: "Storage pool path cannot be changed"
ErrVMHelperNotFound: "1panel-kvm bulunamadı"
ErrVMBridgeManaged: "Bridge adı zaten libvirt veya Docker tarafından yönetiliyor"
ErrVMNetworkInUse: "Ağ kullanımda ve silinemez"
ErrVMStorageInUse: "Depolama havuzu kullanımda ve silinemez"
ErrVMStorageNameCannotChange: "Depolama havuzunun adı değiştirilemez"
ErrVMStoragePathCannotChange: "Depolama havuzunun yolu değiştirilemez"
ErrVMRunning: "Sanal makine çalışıyor"
ErrVMLibvirtConnect: "libvirt bağlantısı başarısız: {{ .detail }}"
ErrVMPermission: "Sanal makine işlemi için izin yok: {{ .detail }}"
@@ -190,7 +213,7 @@ TaskSync: 'Senkronize'
TaskSyncForNode: "Düğüm Verilerini Senkronize Et"
TaskBackup: "Yedekleme"
TaskPush: "Gönder"
TaskRsync: "Sync"
TaskRsync: "Senkronize"
SuccessStatus: "{{ .name }} başarılı"
FailedStatus: "{{ .name }} başarısız {{ .err }}"
Start: "Başla"
@@ -255,7 +278,7 @@ PushAppInstallTaskToNode: "Uygulama kurulum görevini düğüme [{{ .name }}] g
AppInstallTask: "Uygulama kurulum görevi"
PushAppFailed: "Uygulama kurulum görevi gönderilemedi"
SkillHubInstallTask: "Skill yükle [{{ .name }}]"
SkillHubInstallToTarget: "Skill hedefe yükle [{{ .name }}]"
SkillHubInstallToTarget: "[{{ .name }}] skillini [{{ .target }}] hedefine yükle"
# betik kitaplığı
ScriptLibrary: "Betik Kütüphanesi"
@@ -312,25 +335,25 @@ StartService: "Servisi başlat"
NoBackupNode: "Yedek düğüm şu anda boş. Lütfen kaydetmek için bir yedek düğüm seçin ve tekrar deneyin"
# düğüm dosyası ve imaj senkronizasyonu
LocalNodeIpFailed: "Failed to get master node IP. Edit the master node and add IP address and SSH authentication information."
HandlePrivateKey: "Handle node private key"
HandlePublicKey: "Handle node public key"
ExchangeFile: "Start syncing {{ .sourcePath }} from node {{ .source }} to node {{ .dest }}:{{ .destPath }}"
NodeFile: "Node file"
ImageSyncTaskName: "Image sync {{ .count }} images"
SSLSyncTaskName: "Certificate sync {{ .count }} certificates"
AppSyncTaskName: "App sync {{ .name }}"
SSLSyncToNode: "Push certificate [{{ .cert }}] to node [{{ .node }}]"
ImageSyncSave: "Save image {{ .image }}"
ImageSyncSaveTags: "Save image tags {{ .tags }}"
ImageSyncToNode: "Sync image {{ .image }} to node {{ .node }}"
ImageSyncLoad: "Load image {{ .image }} on node {{ .node }}"
ImageSyncClean: "Clean temporary files for image {{ .image }}"
ImageSyncNoTag: "Image {{ .image }} has no tag and will be saved by image ID"
ImageSyncFrontendTagsIgnored: "No tags were found for image {{ .image }} on the source node. Frontend tags were ignored."
ImageSyncHandlePrivateKey: "Handle image sync node private key"
ImageSyncHandlePublicKey: "Handle image sync node public key"
ImageSyncTransfer: "Start transferring image temporary file: {{ .source }}:{{ .sourcePath }} -> {{ .dest }}:{{ .destPath }}"
LocalNodeIpFailed: "Ana düğüm IP adresi alınamadı. Ana düğümü düzenleyip IP adresini ve SSH kimlik doğrulama bilgilerini ekleyin."
HandlePrivateKey: "Düğüm özel anahtarını işle"
HandlePublicKey: "Düğüm genel anahtarını işle"
ExchangeFile: "{{ .source }} düğümündeki {{ .sourcePath }} yolundan {{ .dest }} düğümündeki {{ .destPath }} yoluna senkronizasyonu başlat"
NodeFile: "Düğüm dosyası"
ImageSyncTaskName: "{{ .count }} imajı senkronize et"
SSLSyncTaskName: "{{ .count }} sertifikayı senkronize et"
AppSyncTaskName: "{{ .name }} uygulamasını senkronize et"
SSLSyncToNode: "[{{ .cert }}] sertifikasını [{{ .node }}] düğümüne gönder"
ImageSyncSave: "{{ .image }} imajını kaydet"
ImageSyncSaveTags: "{{ .tags }} imaj etiketlerini kaydet"
ImageSyncToNode: "{{ .image }} imajını {{ .node }} düğümüne senkronize et"
ImageSyncLoad: "{{ .image }} imajını {{ .node }} düğümüne yükle"
ImageSyncClean: "{{ .image }} imajının geçici dosyalarını temizle"
ImageSyncNoTag: "{{ .image }} imajının etiketi yok; imaj ID'si ile kaydedilecek"
ImageSyncFrontendTagsIgnored: "Kaynak düğümde {{ .image }} imajı için etiket bulunamadı. Frontend etiketleri yok sayıldı."
ImageSyncHandlePrivateKey: "İmaj senkronizasyon düğümünün özel anahtarını işle"
ImageSyncHandlePublicKey: "İmaj senkronizasyon düğümünün genel anahtarını işle"
ImageSyncTransfer: "Geçici imaj dosyasını aktarmaya başla: {{ .source }}:{{ .sourcePath }} -> {{ .dest }}:{{ .destPath }}"
# komut satırı
SudoHelper: "Lütfen {{ .cmd }} kullanın veya root kullanıcısına geçin"
@@ -472,3 +495,33 @@ ErrLDAPSyncRunning: "Bir LDAP senkronizasyon görevi zaten çalışıyor."
ErrLDAPSyncDirectoryIncomplete: "LDAP eksik bir tam sorgu sonucu döndürdü. Hiçbir kullanıcının durumu değiştirilmedi."
ErrLDAPSyncFailed: "LDAP kullanıcı senkronizasyonu başarısız oldu."
LDAPSyncSuccess: "LDAP kullanıcı senkronizasyonu başarıyla tamamlandı."
ErrSAML2NotEnabled: "SAML2 kimlik doğrulaması etkin değil."
ErrSAML2ConfigInvalid: "SAML2 yapılandırması geçersiz."
ErrSAML2ConfigChanged: "SAML2 yapılandırması değişti. Kimlik doğrulamayı yeniden başlatın."
ErrSAML2PanelOriginMissing: "Yalnızca şema, ana bilgisayar ve isteğe bağlı bağlantı noktası içeren geçerli bir 1Panel genel URLsi girin."
ErrSAML2MetadataInvalid: "IdP meta verileri eksik veya geçersiz."
ErrSAML2MetadataURLInvalid: "IdP meta veri URLsine veya meta verilerdeki bir uç noktaya izin verilmiyor."
ErrSAML2MetadataFetch: "IdP meta verileri yüklenemedi."
ErrSAML2MetadataCertificate: "IdP meta verileri kullanılabilir bir imzalama sertifikası içermiyor."
ErrSAML2KeyPairInvalid: "SP özel anahtarı ve sertifikası geçersiz veya birbiriyle eşleşmiyor."
ErrSAML2NameAttributeMissing: "Yapılandırılmış SAML2 kullanıcı adı özniteliği eksik veya geçersiz."
ErrSAML2DefaultRoleInvalid: "SAML2 için yapılandırılmış varsayılan rol kullanılamıyor."
ErrSAML2SLOUnavailable: "IdP desteklenen bir Single Logout hizmeti sağlamıyor."
ErrSAML2TestExpired: "SAML2 testinin süresi doldu. Yeniden çalıştırın."
ErrSAML2LoginExpired: "SAML2 oturum açma isteğinin süresi doldu. Yeniden deneyin."
ErrSAML2InvalidState: "SAML2 oturum açma durumu geçersiz veya daha önce kullanılmış."
ErrSAML2RequestBuild: "SAML2 isteği oluşturulamadı."
ErrSAML2ResponseInvalid: "SAML2 yanıtı geçersiz."
ErrSAML2SignatureInvalid: "SAML2 imzası geçersiz."
ErrSAML2Replay: "SAML2 mesajı daha önce kullanılmış."
ErrSAML2NameIDMissing: "SAML2 NameID eksik veya geçersiz."
ErrSAML2SessionIndexMissing: "SAML2 SessionIndex eksik veya geçersiz."
ErrSAML2NameConflictLocal: "SAML2 kullanıcı adı yerel bir kullanıcıyla çakışıyor."
ErrSAML2NameConflictLDAP: "SAML2 kullanıcı adı bir LDAP kullanıcısıyla çakışıyor."
ErrSAML2NameConflictOIDC: "SAML2 kullanıcı adı bir OIDC kullanıcısıyla çakışıyor."
ErrSAML2NameConflictSAML2: "SAML2 kullanıcı adı başka bir SAML2 kimliğiyle çakışıyor."
ErrSAML2Internal: "SAML2 kimlik doğrulaması sırasında dahili bir hata oluştu. Daha sonra yeniden deneyin."
ErrSAML2LogoutExpired: "SAML2 oturum kapatma isteğinin süresi doldu."
ErrSAML2LogoutInvalid: "SAML2 oturum kapatma mesajı geçersiz."
ErrSAML2LocalCredentialsReadonly: "SAML2 kullanıcı adları ve parolaları kimlik sağlayıcı tarafından yönetilir ve yerel olarak değiştirilemez."
ErrSAML2PasswordExpirationUnsupported: "SAML2 kullanıcıları yerel parola süresi dolma ilkesini kullanmaz."

View File

@@ -42,6 +42,29 @@ ErrPasskeyLimit: "Passkey 數量已達上限(最多 5 個)"
ErrPasskeySession: "Passkey 會話已過期或無效"
ErrPasskeyDuplicate: "Passkey 已存在"
ErrPasskeyVerify: "Passkey 驗證失敗"
ErrOIDCNotEnabled: "OIDC 驗證尚未啟用"
ErrOIDCConfigInvalid: "OIDC 設定無效"
ErrOIDCConfigChanged: "OIDC 設定已變更,請重新發起驗證"
ErrOIDCDiscoveryFailed: "OIDC Provider 設定探索失敗"
ErrOIDCIssuerMismatch: "OIDC Issuer 與設定的 Issuer 不一致"
ErrOIDCUnsupportedPKCE: "OIDC Provider 不支援要求的 PKCE 方式"
ErrOIDCUnsupportedSigningAlgorithm: "不支援此 OIDC 簽章演算法"
ErrOIDCInvalidState: "OIDC 登入狀態無效或已被使用"
ErrOIDCLoginExpired: "OIDC 登入請求已過期,請重試"
ErrOIDCTokenExchange: "OIDC 授權碼交換 Token 失敗"
ErrOIDCTokenValidation: "OIDC Token 驗證失敗"
ErrOIDCUserInfoValidation: "OIDC 使用者資訊驗證失敗"
ErrOIDCNameClaimMissing: "設定的 OIDC 使用者名稱 Claim 缺失或無效"
ErrOIDCNameConflictLocal: "OIDC 使用者名稱與本機使用者衝突"
ErrOIDCNameConflictLDAP: "OIDC 使用者名稱與 LDAP 使用者衝突"
ErrOIDCNameConflictOIDC: "OIDC 使用者名稱與其他 OIDC 身分衝突"
ErrOIDCDefaultRoleInvalid: "OIDC 設定的預設角色不可用"
ErrOIDCPrivateAddressDenied: "OIDC 端點位址不符合網路安全原則"
ErrOIDCTLSValidation: "OIDC TLS 憑證驗證失敗"
ErrOIDCTestExpired: "OIDC 瀏覽器測試已過期,請重新測試"
ErrOIDCLocalCredentialsReadonly: "OIDC 使用者名稱和密碼由身分提供者管理,無法在本機修改。"
ErrOIDCPasswordExpirationUnsupported: "OIDC 使用者不使用本機密碼到期原則。"
ErrOIDCInternal: "OIDC 認證發生內部錯誤,請稍後重試。"
# 使用者與權限
ErrNoSuchUser: "未能找到該使用者資訊,請檢查後重試!"
@@ -255,7 +278,7 @@ PushAppInstallTaskToNode: "傳送應用安裝任務到節點 [{{ .name }}]"
AppInstallTask: "應用安裝任務"
PushAppFailed: "傳送應用安裝任務失敗"
SkillHubInstallTask: "安裝技能 [{{ .name }}]"
SkillHubInstallToTarget: "安裝技能到目標 [{{ .name }}]"
SkillHubInstallToTarget: "安裝技能 [{{ .name }}] 到目標 [{{ .target }}]"
# 腳本庫
ScriptLibrary: "腳本庫"
@@ -472,3 +495,33 @@ ErrLDAPSyncRunning: "已有 LDAP 同步工作正在執行。"
ErrLDAPSyncDirectoryIncomplete: "LDAP 全量查詢結果不完整,本次未變更任何使用者狀態。"
ErrLDAPSyncFailed: "LDAP 使用者同步失敗。"
LDAPSyncSuccess: "LDAP 使用者同步成功。"
ErrSAML2NotEnabled: "SAML2 驗證尚未啟用"
ErrSAML2ConfigInvalid: "SAML2 設定無效"
ErrSAML2ConfigChanged: "SAML2 設定已變更,請重新發起驗證"
ErrSAML2PanelOriginMissing: "請輸入有效的面板對外存取位址,僅包含協定、主機和選用連接埠"
ErrSAML2MetadataInvalid: "IdP Metadata 缺失或無效"
ErrSAML2MetadataURLInvalid: "IdP Metadata URL 或 Metadata 中的端點位址不符合安全策略"
ErrSAML2MetadataFetch: "取得 IdP Metadata 失敗"
ErrSAML2MetadataCertificate: "IdP Metadata 中沒有可用的簽章憑證"
ErrSAML2KeyPairInvalid: "SP 私鑰和憑證無效或不相符"
ErrSAML2NameAttributeMissing: "設定的 SAML2 使用者名稱屬性缺失或無效"
ErrSAML2DefaultRoleInvalid: "SAML2 設定的預設角色不可用"
ErrSAML2SLOUnavailable: "IdP 未提供支援的單一登出服務"
ErrSAML2TestExpired: "SAML2 測試已過期,請重新測試"
ErrSAML2LoginExpired: "SAML2 登入要求已過期,請重試"
ErrSAML2InvalidState: "SAML2 登入狀態無效或已被使用"
ErrSAML2RequestBuild: "產生 SAML2 要求失敗"
ErrSAML2ResponseInvalid: "SAML2 回應無效"
ErrSAML2SignatureInvalid: "SAML2 簽章驗證失敗"
ErrSAML2Replay: "SAML2 訊息已被使用"
ErrSAML2NameIDMissing: "SAML2 NameID 缺失或無效"
ErrSAML2SessionIndexMissing: "SAML2 SessionIndex 缺失或無效"
ErrSAML2NameConflictLocal: "SAML2 使用者名稱與本機使用者衝突"
ErrSAML2NameConflictLDAP: "SAML2 使用者名稱與 LDAP 使用者衝突"
ErrSAML2NameConflictOIDC: "SAML2 使用者名稱與 OIDC 使用者衝突"
ErrSAML2NameConflictSAML2: "SAML2 使用者名稱與其他 SAML2 身分衝突"
ErrSAML2Internal: "SAML2 驗證發生內部錯誤,請稍後重試"
ErrSAML2LogoutExpired: "SAML2 登出要求已過期"
ErrSAML2LogoutInvalid: "SAML2 登出訊息無效"
ErrSAML2LocalCredentialsReadonly: "SAML2 使用者名稱和密碼由身分提供者管理,無法在本機修改。"
ErrSAML2PasswordExpirationUnsupported: "SAML2 使用者不使用本機密碼到期原則。"

View File

@@ -42,6 +42,29 @@ ErrPasskeyLimit: "Passkey 数量已达上限(最多 5 个)"
ErrPasskeySession: "Passkey 会话已过期或无效"
ErrPasskeyDuplicate: "Passkey 已存在"
ErrPasskeyVerify: "Passkey 验证失败"
ErrOIDCNotEnabled: "OIDC 认证尚未启用"
ErrOIDCConfigInvalid: "OIDC 配置无效"
ErrOIDCConfigChanged: "OIDC 配置已变更,请重新发起认证"
ErrOIDCDiscoveryFailed: "OIDC Provider 配置发现失败"
ErrOIDCIssuerMismatch: "OIDC Issuer 与配置的 Issuer 不一致"
ErrOIDCUnsupportedPKCE: "OIDC Provider 不支持要求的 PKCE 方式"
ErrOIDCUnsupportedSigningAlgorithm: "不支持该 OIDC 签名算法"
ErrOIDCInvalidState: "OIDC 登录状态无效或已被使用"
ErrOIDCLoginExpired: "OIDC 登录请求已过期,请重试"
ErrOIDCTokenExchange: "OIDC 授权码换取 Token 失败"
ErrOIDCTokenValidation: "OIDC Token 校验失败"
ErrOIDCUserInfoValidation: "OIDC 用户信息校验失败"
ErrOIDCNameClaimMissing: "配置的 OIDC 用户名 Claim 缺失或无效"
ErrOIDCNameConflictLocal: "OIDC 用户名与本地用户冲突"
ErrOIDCNameConflictLDAP: "OIDC 用户名与 LDAP 用户冲突"
ErrOIDCNameConflictOIDC: "OIDC 用户名与其他 OIDC 身份冲突"
ErrOIDCDefaultRoleInvalid: "OIDC 配置的默认角色不可用"
ErrOIDCPrivateAddressDenied: "OIDC 端点地址不符合网络安全策略"
ErrOIDCTLSValidation: "OIDC TLS 证书校验失败"
ErrOIDCTestExpired: "OIDC 浏览器测试已过期,请重新测试"
ErrOIDCLocalCredentialsReadonly: "OIDC 用户名和密码由身份提供方管理,不能在本地修改。"
ErrOIDCPasswordExpirationUnsupported: "OIDC 用户不使用本地密码过期策略。"
ErrOIDCInternal: "OIDC 认证发生内部错误,请稍后重试。"
# 用户与权限
ErrNoSuchUser: "未能找到该用户信息,请检查后重试!"
@@ -255,7 +278,7 @@ PushAppInstallTaskToNode: "推送应用安装任务到节点 [{{ .name }}]"
AppInstallTask: "应用安装任务"
PushAppFailed: "推送应用安装任务失败"
SkillHubInstallTask: "安装技能 [{{ .name }}]"
SkillHubInstallToTarget: "安装技能 {{ .name }} 到目标 {{ .target }}"
SkillHubInstallToTarget: "安装技能 [{{ .name }}] 到目标 [{{ .target }}]"
# 脚本库
ScriptLibrary: "脚本库"
@@ -472,3 +495,33 @@ ErrLDAPSyncRunning: "已有 LDAP 同步任务正在执行。"
ErrLDAPSyncDirectoryIncomplete: "LDAP 全量查询结果不完整,本次未改变任何用户状态。"
ErrLDAPSyncFailed: "LDAP 用户同步失败。"
LDAPSyncSuccess: "LDAP 用户同步成功。"
ErrSAML2NotEnabled: "SAML2 认证尚未启用"
ErrSAML2ConfigInvalid: "SAML2 配置无效"
ErrSAML2ConfigChanged: "SAML2 配置已变更,请重新发起认证"
ErrSAML2PanelOriginMissing: "请输入有效的面板对外访问地址,仅包含协议、主机和可选端口"
ErrSAML2MetadataInvalid: "IdP Metadata 缺失或无效"
ErrSAML2MetadataURLInvalid: "IdP Metadata URL 或 Metadata 中的端点地址不符合安全策略"
ErrSAML2MetadataFetch: "获取 IdP Metadata 失败"
ErrSAML2MetadataCertificate: "IdP Metadata 中没有可用的签名证书"
ErrSAML2KeyPairInvalid: "SP 私钥和证书无效或不匹配"
ErrSAML2NameAttributeMissing: "配置的 SAML2 用户名属性缺失或无效"
ErrSAML2DefaultRoleInvalid: "SAML2 配置的默认角色不可用"
ErrSAML2SLOUnavailable: "IdP 未提供支持的单点注销服务"
ErrSAML2TestExpired: "SAML2 测试已过期,请重新测试"
ErrSAML2LoginExpired: "SAML2 登录请求已过期,请重试"
ErrSAML2InvalidState: "SAML2 登录状态无效或已被使用"
ErrSAML2RequestBuild: "生成 SAML2 请求失败"
ErrSAML2ResponseInvalid: "SAML2 响应无效"
ErrSAML2SignatureInvalid: "SAML2 签名校验失败"
ErrSAML2Replay: "SAML2 消息已被使用"
ErrSAML2NameIDMissing: "SAML2 NameID 缺失或无效"
ErrSAML2SessionIndexMissing: "SAML2 SessionIndex 缺失或无效"
ErrSAML2NameConflictLocal: "SAML2 用户名与本地用户冲突"
ErrSAML2NameConflictLDAP: "SAML2 用户名与 LDAP 用户冲突"
ErrSAML2NameConflictOIDC: "SAML2 用户名与 OIDC 用户冲突"
ErrSAML2NameConflictSAML2: "SAML2 用户名与其他 SAML2 身份冲突"
ErrSAML2Internal: "SAML2 认证发生内部错误,请稍后重试"
ErrSAML2LogoutExpired: "SAML2 注销请求已过期"
ErrSAML2LogoutInvalid: "SAML2 注销消息无效"
ErrSAML2LocalCredentialsReadonly: "SAML2 用户名和密码由身份提供商管理,无法在本地修改。"
ErrSAML2PasswordExpirationUnsupported: "SAML2 用户不使用本地密码过期策略。"

View File

@@ -21,11 +21,20 @@ func GetMFASessionStore() *mfaSessionStore {
}
type mfaSession struct {
Name string
Entrance string
IP string
Failures int
ExpiresAt time.Time
Name string
Entrance string
IP string
AuthSource string
AuthSourceID uint
AuthSourceConfigVersion uint64
ExternalIssuer string
ExternalNameID string
ExternalNameIDFormat string
ExternalSessionIndex string
ExternalSessionExpiresAt time.Time
ExternalSessionRequired bool
Failures int
ExpiresAt time.Time
}
type mfaSessionStore struct {
@@ -46,6 +55,41 @@ func (s *mfaSessionStore) Set(name, entrance, ip string) string {
})
}
func (s *mfaSessionStore) SetWithAuthSource(
name, entrance, ip, authSource string,
authSourceID uint,
authSourceConfigVersion uint64,
) string {
return s.store.Set(mfaSession{
Name: name,
Entrance: entrance,
IP: ip,
AuthSource: authSource,
AuthSourceID: authSourceID,
AuthSourceConfigVersion: authSourceConfigVersion,
})
}
func (s *mfaSessionStore) SetWithAuthSourceSession(
name, entrance, ip, authSource string,
authSourceID uint,
authSourceConfigVersion uint64,
externalIssuer, externalNameID, externalNameIDFormat, externalSessionIndex string,
externalSessionExpiresAt time.Time,
externalSessionRequired bool,
) string {
return s.store.Set(mfaSession{
Name: name, Entrance: entrance, IP: ip,
AuthSource: authSource, AuthSourceID: authSourceID,
AuthSourceConfigVersion: authSourceConfigVersion,
ExternalIssuer: externalIssuer, ExternalNameID: externalNameID,
ExternalNameIDFormat: externalNameIDFormat,
ExternalSessionIndex: externalSessionIndex,
ExternalSessionExpiresAt: externalSessionExpiresAt,
ExternalSessionRequired: externalSessionRequired,
})
}
func (s *mfaSessionStore) Get(sessionID string) (mfaSession, bool) {
return s.store.Get(sessionID)
}

View File

@@ -2,6 +2,7 @@ package psession
import (
"crypto/rand"
"crypto/sha256"
"encoding/hex"
"errors"
"net/http"
@@ -220,6 +221,22 @@ func (p *PSession) DeleteByID(id string) error {
return nil
}
func (p *PSession) DeleteByHash(sessionHash string) error {
if sessionHash == "" {
return nil
}
p.mu.Lock()
defer p.mu.Unlock()
for sessionID := range p.sessions {
sum := sha256.Sum256([]byte(sessionID))
if hex.EncodeToString(sum[:]) == sessionHash {
delete(p.sessions, sessionID)
return nil
}
}
return nil
}
func (p *PSession) ApplyTimeout(ttlSeconds int) {
now := time.Now()
ttl := time.Duration(ttlSeconds) * time.Second

View File

@@ -50,7 +50,14 @@ func requiresCSRFTokenCheck(c *gin.Context) bool {
case "/api/v2/core/auth/login",
"/api/v2/core/auth/mfalogin",
"/api/v2/core/auth/passkey/begin",
"/api/v2/core/auth/passkey/finish":
"/api/v2/core/auth/passkey/finish",
"/api/v2/core/auth/oidc/begin",
"/api/v2/core/auth/oidc/finish":
return false
case "/api/v2/core/auth/saml2/begin",
"/api/v2/core/auth/saml2/acs",
"/api/v2/core/auth/saml2/finish",
"/api/v2/core/auth/saml2/logout":
return false
}
if c.GetBool("API_AUTH") {

View File

@@ -63,6 +63,25 @@ func (s *Store[T]) Get(itemID string) (T, bool) {
return item.Value, true
}
// Take atomically returns and removes an item. It is intended for one-time
// credentials such as authentication state and handoff tickets.
func (s *Store[T]) Take(itemID string) (T, bool) {
s.mu.Lock()
defer s.mu.Unlock()
item, ok := s.items[itemID]
if !ok {
var zero T
return zero, false
}
delete(s.items, itemID)
if s.now().After(item.ExpiresAt) {
var zero T
return zero, false
}
return item.Value, true
}
func (s *Store[T]) Update(itemID string, fn func(*T) bool) bool {
s.mu.Lock()
defer s.mu.Unlock()

View File

@@ -22,6 +22,10 @@ func (a *authHelper) MFALogin(c *gin.Context, info baseDto.MFALogin, entrance st
return auth.MFALogin(c, info, entrance)
}
func (a *authHelper) PrepareLogout(_ *gin.Context) (*baseDto.LogoutResult, error) {
return &baseDto.LogoutResult{}, nil
}
func (a *authHelper) PasskeyBeginLogin(c *gin.Context, entrance string) (*baseDto.PasskeyBeginResponse, string, error) {
return auth.PasskeyBeginLogin(c, entrance)
}

View File

@@ -9,6 +9,7 @@ import (
type AuthProvider interface {
Login(c *gin.Context, info dto.Login, entrance string) (*dto.UserLoginInfo, string, error)
MFALogin(c *gin.Context, info dto.MFALogin, entrance string) (*dto.UserLoginInfo, string, error)
PrepareLogout(c *gin.Context) (*dto.LogoutResult, error)
ResetSuperAdminUser(name, password string) error

View File

@@ -49,7 +49,11 @@ class RequestHttp {
config.url === '/core/auth/login' ||
config.url === '/core/auth/mfalogin' ||
config.url === '/core/auth/passkey/begin' ||
config.url === '/core/auth/passkey/finish'
config.url === '/core/auth/passkey/finish' ||
config.url === '/core/auth/oidc/begin' ||
config.url === '/core/auth/oidc/finish' ||
config.url === '/core/auth/saml2/begin' ||
config.url === '/core/auth/saml2/finish'
) {
config.headers.EntranceCode = encodeBase64(globalStore.entrance);
}

View File

@@ -5,6 +5,7 @@ export namespace Login {
captcha: string;
captchaID: string;
authMethod: string;
authSource: 'local' | 'ldap';
}
export interface MFALoginForm {
sessionId: string;
@@ -22,6 +23,44 @@ export namespace Login {
sessionId: string;
publicKey: Record<string, any>;
}
export interface OIDCStatus {
enabled: boolean;
displayName: string;
authorizationCode: boolean;
}
export interface LDAPStatus {
enabled: boolean;
}
export interface OIDCBeginResponse {
authorizationURL: string;
}
export interface OIDCFinishRequest {
ticket: string;
}
export interface SAML2Status {
enabled: boolean;
displayName: string;
syncLogout: boolean;
}
export interface SAML2RedirectNavigation {
binding: 'redirect';
redirectURL: string;
}
export interface SAML2PostNavigation {
binding: 'post';
postURL: string;
fields: Record<string, string>;
}
export type SAML2Navigation = SAML2RedirectNavigation | SAML2PostNavigation;
export interface SAML2BeginResponse {
navigation: SAML2Navigation;
}
export interface SAML2FinishRequest {
ticket: string;
}
export interface LogOutResponse {
saml2Navigation?: SAML2Navigation;
}
export interface ResCaptcha {
imagePath: string;
captchaID: string;

View File

@@ -19,12 +19,40 @@ export const passkeyFinishApi = (params: Record<string, any>, sessionId: string)
return http.post<Login.ResLogin>(`/core/auth/passkey/finish`, params, undefined, { 'Passkey-Session': sessionId });
};
export const ldapStatusApi = () => {
return http.get<Login.LDAPStatus>(`/core/auth/ldap/status`, undefined, { skipErrorMessage: true });
};
export const oidcStatusApi = () => {
return http.get<Login.OIDCStatus>(`/core/auth/oidc/status`, undefined, { skipErrorMessage: true });
};
export const oidcBeginApi = () => {
return http.post<Login.OIDCBeginResponse>(`/core/auth/oidc/begin`);
};
export const oidcFinishApi = (params: Login.OIDCFinishRequest) => {
return http.post<Login.ResLogin>(`/core/auth/oidc/finish`, params);
};
export const saml2StatusApi = () => {
return http.get<Login.SAML2Status>(`/core/auth/saml2/status`, undefined, { skipErrorMessage: true });
};
export const saml2BeginApi = () => {
return http.post<Login.SAML2BeginResponse>(`/core/auth/saml2/begin`);
};
export const saml2FinishApi = (params: Login.SAML2FinishRequest) => {
return http.post<Login.ResLogin>(`/core/auth/saml2/finish`, params);
};
export const getCaptcha = () => {
return http.get<Login.ResCaptcha>(`/core/auth/captcha`);
};
export const logOutApi = () => {
return http.post<any>(`/core/auth/logout`);
return http.post<Login.LogOutResponse>(`/core/auth/logout`);
};
export const getLoginSetting = () => {

View File

@@ -61,7 +61,7 @@ const fuLocales: Record<string, FuLocaleMessage> = {
fu: {
table: {
more: 'ເບິ່ງຕື່ມ',
custom_table_rows: 'ກຳນົດແຖວຕາຕະລາງເອງ',
custom_table_rows: 'ຖັນກຳນົດເອງ',
},
steps: {
cancel: 'ຍົກເລີກ',

View File

@@ -167,6 +167,7 @@ const message = {
deleteSuccess: 'Deleted successfully',
loginSuccess: 'Logged in successfully',
operationSuccess: 'Completed successfully',
operationFailed: 'Operation failed',
copySuccess: 'Copied successfully',
notSupportOperation: 'This operation is not supported',
requestTimeout: 'Request timed out, try again later',
@@ -208,6 +209,7 @@ const message = {
username: 'Username',
password: 'Password',
passkey: 'Passkey Login',
otherLoginMethods: 'Other sign-in methods',
welcome: 'Welcome back. Sign in with your username and password.',
errorAuthInfo: 'Incorrect username or password, try again.',
errorMfaInfo: 'Invalid authentication info, try again.',
@@ -477,7 +479,7 @@ const message = {
cpuSteal: 'Steal',
cpuTop: 'Top 5 Processes by CPU Usage',
memTop: 'Top 5 Processes by Memory Usage',
loadAverage: 'Load average in the last 1 minute | Load average in the last {n} minutes',
loadAverage: 'Load average over the last {0} minutes',
load: 'Load',
mount: 'Mount point',
fileSystem: 'File system',
@@ -1758,7 +1760,8 @@ const message = {
dockerStatus: 'Docker Service',
daemonJsonPathHelper: 'Ensure that the configuration path is the same as that specified in docker.service.',
mirrors: 'Registry mirrors',
mirrorsHelper: '',
mirrorsHelper:
'Use registry mirror URLs first for image operations. Leave this empty to disable registry mirrors.',
mirrorsHelper2: 'For details, see the official documentation.',
registries: 'Insecure registries',
ipv6Helper:
@@ -3754,9 +3757,9 @@ const message = {
staticChangePHPHelper: 'Currently a static website, you can switch to a PHP website',
proxyCache: 'Reverse Proxy Cache',
cacheLimit: 'Cache Space Limit',
shareCahe: 'Cache Count Memory Size',
shareCache: 'Cache Count Memory Size',
cacheExpire: 'Cache Expiration Time',
shareCaheHelper: 'Approximately 8000 cache objects can be stored per 1M of memory',
shareCacheHelper: 'Approximately 8000 cache objects can be stored per 1M of memory',
cacheLimitHelper: 'Old cache will be automatically deleted when the limit is exceeded',
cacheExpireJHelper: 'Cache will be deleted if it misses after the expiration time',
realIP: 'Real IP',
@@ -4105,6 +4108,7 @@ const message = {
},
runtime: {
runtime: 'Runtime',
default: 'Default',
workDir: 'Working directory',
localHelper: 'For local environment installation and offline environment usage issues, see ',
versionHelper: 'PHP version, e.g. v8.0',
@@ -4907,6 +4911,14 @@ const message = {
authManage: 'Authentication',
auth: {
providerNavigation: 'Authentication providers',
defaultNode: 'Default node',
defaultNodePlaceholder: 'Select a node',
defaultNodeHelper: 'Only for new users.',
defaultNodeRequired: 'Select a valid default node.',
nodesLoadFailed: 'Failed to load nodes. Retry before selecting the default node.',
nodeHandling: 'Node handling',
assignDefaultNode: 'Assign default node: {node}',
keepExistingNode: 'Keep the existing node permissions',
providers: {
ldap: 'AD/LDAP',
passkey: 'Passkey',
@@ -4934,7 +4946,395 @@ const message = {
planned: 'Planned',
plannedTitle: '{0} authentication settings',
plannedDesc: 'This authentication provider is planned and is not available yet.',
oidc: {
accessMode: 'Connection mode',
accessModeDesc: 'Use standard Discovery whenever the identity provider supports it.',
actionCreate: 'Create user',
actionKeepName: 'Keep the current name',
actionPending: 'Waiting for result',
actionReject: 'Reject login',
actionUpdate: 'Update identity information',
advanced: 'Advanced settings',
advancedDesc: 'Keep the secure defaults unless the provider requires a compatibility option.',
assignDefaultRole: 'Assign default role: {role}',
authorizationEndpoint: 'Authorization Endpoint',
authorizationEndpointInvalid: 'Enter a valid Authorization Endpoint.',
authorizationFlow: 'Authorization flow',
automatic: 'Automatic',
automaticPolicy: 'Automatic handling policy',
automaticPolicyDesc: 'These rules are enforced by the backend and are not administrator switches.',
basic: 'Basic settings',
basicDesc: 'Select the provider mode, then configure the client and callback.',
browserTest: 'Browser test login',
browserTestConflict: 'Identity verified, but the name conflicts',
browserTestConflictHelper: 'The mapped name belongs to another identity and will not be claimed.',
browserTestExpired: 'Browser test expired',
browserTestExpiredHelper: 'Start a new browser test and complete authorization before it expires.',
browserTestFailed: 'Browser test failed',
browserTestFailedHelper:
'The identity preview could not be completed. Review the localized backend error.',
browserTestIsolation:
'This performs a real authorization round trip but does not create or update users, assign roles, or create an authenticated panel session.',
browserTestPopupBlocked: 'Allow pop-ups for this site, then start the browser test again.',
browserTestPopupClosed: 'The authorization window was closed before the test completed.',
browserTestSuccess: 'Provider verification succeeded',
browserTestSuccessHelper: 'Identity mapping was previewed without changing users or sessions.',
browserTestTitle: 'OIDC browser test login',
browserTestWaiting: 'Waiting for Provider authorization',
browserTestWaitingHelper:
'Complete sign-in in the new browser window. This page will update automatically.',
callbackCopied: 'OIDC callback URL copied.',
callbackURL: 'Callback URL',
callbackURLHelper: "Add this URL to the client's allowed callback URLs in the identity provider.",
cancelClearSecret: 'Cancel clearing',
clearSecret: 'Clear secret',
clearSecretConfirm: 'The Client Secret will be removed only after you save. Continue?',
clientAuthMethod: 'Client authentication method',
clientAuthMethodHelper:
'Select the authentication method configured for this client in the identity provider.',
clientAuthMethodRequired: 'Select a client authentication method.',
clientID: 'Client ID',
clientIDRequired: 'Enter the Client ID.',
clientSecret: 'Client Secret',
clockSkew: 'Token time tolerance',
clockSkewHelper:
'Allows a small time difference between the identity provider and 1Panel. Keep the default 60 seconds.',
clockSkewRequired: 'Enter the token time tolerance.',
compatibilityMode: 'Compatibility mode',
compatibilityModeHelper:
'Use only for incomplete Discovery or rewritten endpoints. Core OIDC validation remains enabled.',
configurationFailedHelper: 'The test failed. The page only displays the localized backend error.',
configurationFailedTag: 'Test failed',
configurationHighRiskPassed:
'The configuration passed, but contains high-risk compatibility options.',
configurationHighRiskTag: 'High-risk configuration passed',
configurationNotTested: 'The current configuration has not been tested.',
configurationNotTestedTag: 'Not tested',
configurationPassed: 'The current configuration passed the security and capability checks.',
configurationPassedTag: 'Test passed',
configurationStaleHelper: 'Configuration changed. Test it again before saving.',
configurationStaleTag: 'Result expired',
configurationTestMeta:
'Tested at {time}; completed in {duration} ms. Raw Provider responses are not stored.',
configurationTestResult: 'Configuration test result',
configurationTestResultDesc:
'This checks Discovery and capabilities only; it does not exchange an authorization code or prove the Client Secret. Use browser test login for end-to-end verification.',
configurationTestSuccess: 'OIDC configuration test succeeded.',
configurationTesting: 'Testing the current OIDC configuration',
configurationTestingTag: 'Testing',
configureSecret: 'Configure secret',
conflictExistingRename: 'A bound subject returns a new name that is occupied',
conflictExistingRenameResult: 'Keep the existing User.Name and allow the bound user to sign in',
conflictLDAP: 'LDAP user',
conflictLocal: 'Local user',
conflictNewAvailable: 'New subject and the mapped name are available',
conflictNewAvailableResult: 'Create an enterprise user and assign the default role',
conflictNone: 'No conflict',
conflictOIDC: 'Another OIDC identity',
conflictOccupied: 'The mapped name belongs to a local, LDAP, or another OIDC identity',
conflictOccupiedResult: 'Reject the new identity; never bind or merge automatically',
conflictType: 'Conflict type',
connectionSecurity: 'Connection security',
connectionSecurityDesc:
'Certificates are verified by default; private IdP addresses are detected automatically.',
connectionTest: 'Connection and configuration test',
connectionTestCompatibilityDesc: 'Validate custom endpoints and the protocol security policy.',
connectionTestStandardDesc:
'Endpoints and capabilities are discovered automatically from the Issuer.',
connectionTestTab: 'Connection test',
customCA: 'Custom CA',
customCAHelper: 'Applies only to this authentication source and is never written to logs.',
customCARequired: 'Provide the custom CA certificate.',
defaultRole: 'Default role',
defaultRoleHelper:
'Assigned only when the user is first created; later sign-ins do not change the role.',
defaultRolePlaceholder: 'Select a role',
defaultRoleRequired: 'Select a valid default role.',
disableAfterSave: 'OIDC will be disabled after saving.',
disableConfirm: 'Disabling OIDC immediately invalidates access for users of this source. Continue?',
disableDiscardConfirm:
'Disabling OIDC is an emergency action: it only closes the login entry and immediately invalidates access for users of this source. Other unsaved changes on this page, including Client Secret changes, will be discarded. Continue?',
disableTitle: 'Disable OIDC',
disabled: 'Disabled',
discoveryAllowlist: 'Discovery security allowlist',
enable: 'Enable',
enableAfterSave: 'OIDC will be enabled after a successful save.',
enabled: 'Enabled',
endSessionEndpoint: 'End Session Endpoint',
endSessionEndpointHelper:
'Saved for future use; Provider-initiated logout is not included in this release.',
endSessionEndpointInvalid: 'Enter a valid End Session Endpoint.',
endpointDiscoveryPlaceholder: 'Shown after connection test',
firstLogin: 'First login',
firstLoginPolicy: 'Create a local enterprise user and assign the configured default role.',
fixedAuthorizationCode: 'Authorization Code Flow',
fixedNoTokenPersistence: 'Tokens, Claims, and the verifier are never persisted',
fixedSecurityPolicy: 'Always enforced; no configuration required',
fixedStateNonce: 'One-time state and nonce',
fixedTokenValidation: 'ID Token signature and Claims validation',
highRiskSaveConfirm:
'This enabled configuration contains high-risk compatibility options. Confirm that the isolated environment requires them.',
highRiskTitle: 'High-risk OIDC configuration',
hs256Compatibility: 'HS256 (compatibility)',
hs256KeyHelper:
'HS256 always uses this sources Client Secret and does not accept a separate signing key.',
hs256Warning:
'HS256 uses a shared symmetric secret for ID Token signatures. Use it only when the Provider cannot use an asymmetric algorithm.',
identityBindingPolicy:
'Identity is fixed to AuthSourceID + issuer + subject. A matching user name never claims another account.',
identityMissing: 'Identity inactive',
issuer: 'Issuer URL',
issuerHelper: 'The ID Token iss value and Discovery issuer must match this value exactly.',
issuerInvalid: 'Enter a valid HTTP or HTTPS Issuer URL without query or fragment.',
issuerRequired: 'Enter the Issuer URL.',
jwksRotation: 'Automatic JWKS rotation',
jwksURI: 'JWKS URI',
jwksURIHelper: 'Required for asymmetric signing when the key source is JWKS.',
jwksURIInvalid: 'Enter a valid JWKS URI for the selected signing key source.',
keepExistingRole: 'Keep existing roles and local permissions',
localSecurityData: 'Local security data',
localSecurityDataPolicy: 'Never overwrite roles, MFA, API Keys, Passkeys, or local permissions.',
localCredentialsManaged:
'The user name and local password are managed by OIDC and cannot be edited here. Roles, permissions, MFA, API Keys, and Passkeys remain local.',
localUserFields: 'Local user fields',
localUserFieldsDesc:
'The first release maps only User.Name and does not use a JSON mapping expression.',
loginWith: 'Sign in with {provider}',
manualEndpoints: 'Custom endpoints',
manualEndpointsDesc:
'Use only when Discovery is incomplete or an upstream gateway rewrites endpoints.',
mappingResult: 'Mapping result',
mode: 'Connection mode',
modeRequired: 'Select a connection mode.',
nameClaim: 'Username Claim',
nameClaimHelper: 'Enter the field containing the username, such as preferred_username.',
nameClaimRequired: 'Enter the Username Claim.',
nameConflict: 'Name conflict policy',
panelURL: '1Panel public URL',
panelURLHTTPWarning:
'HTTP does not protect the authorization response. Use it only in an isolated private environment accepted by the Provider.',
panelURLHelper:
'Enter the address users use to access 1Panel. It is used to generate the callback URL.',
panelURLInvalid: 'Enter an origin containing only scheme, host, and optional port.',
panelURLRequired: 'Enter the 1Panel public URL.',
pkceDisabled: 'Disabled (compatibility only)',
pkceDisabledWarning: 'Disabling PKCE reduces protection against authorization-code interception.',
pkceHelper: 'Prefer S256. The plain challenge method is never offered.',
pkceS256: 'S256 (recommended)',
plannedHandling: 'Planned handling',
privateNetworkIdP: 'Private-network IdP',
privateNetworkIdPHelper:
'Explicitly permits private addresses; metadata, loopback, link-local, redirects, and DNS rebinding remain blocked.',
privateNetworkWarning: 'Private-network access is enabled for this authentication source.',
protocolCompatibility: 'Protocol compatibility',
protocolCompatibilityDesc: 'ID Token signature validation can never be disabled.',
providerAndClient: 'Provider and client',
providerAndClientDesc:
'The Client Secret can only be replaced or cleared and is never returned by the page.',
providerCapabilities: 'Provider capabilities',
recentTestSuccess: 'Last test succeeded: {0}',
recommended: 'Recommended',
rejectPlain: 'plain rejected',
replaceSecret: 'Replace secret',
requestAndClaims: 'Requests and attributes',
requestAndClaimsDesc: 'Configure authorization scopes, UserInfo fallback, and request parameters.',
requestTimeout: 'Request timeout',
requestTimeoutRequired: 'Enter the request timeout.',
restore: 'Restore',
restored: 'The last saved OIDC settings were restored.',
result: 'Result',
rolesLoadFailed: 'Roles could not be loaded. Retry before selecting the default role.',
roleHandling: 'Role handling',
scenario: 'Scenario',
scopes: 'Authorization scopes',
scopesHelper: 'Must include openid. Separate multiple scopes with spaces.',
scopesRequired: 'Scopes must include openid.',
seconds: 'seconds',
secretClearHelper:
'After clearing, a new Client Secret is required before OIDC can be enabled again.',
secretConfigured: 'Configured',
secretNotConfigured: 'Not configured',
secretPlaceholder: 'Enter a new Client Secret',
secretReplaceHelper:
'The new secret replaces the saved value when you save. Update the Client Secret in the OIDC Provider as well.',
secretRequiredHelper: 'Configure a Client Secret before enabling OIDC.',
secretRequiredToEnable: 'Configure a Client Secret before enabling OIDC.',
secretSavedHelper: 'Stored encrypted. Leave blank to keep the current client secret.',
secretWaiting: 'Waiting for input',
secretWillClear: 'Will be cleared',
secretWillReplace: 'Will be replaced',
signingAlgorithm: 'ID Token signing algorithm',
signingAlgorithmHelper: 'Only algorithms in the backend security allowlist are available.',
signingKey: 'Signing key',
signingKeyClientSecret: 'Client Secret (HS256 only)',
signingKeyJWKS: 'JWKS URI with automatic rotation',
signingKeySource: 'Signing key source',
signingKeySourceHelper: 'Prefer JWKS. A static public key cannot rotate automatically.',
signingKeyStatic: 'Static JWK or PEM public key',
standardDiscovery: 'Standard OIDC Discovery',
standardDiscoveryDesc:
'1Panel discovers endpoints and capabilities and does not store the raw document.',
standardMode: 'Standard mode',
standardModeHelper: 'Discover endpoints, signing capabilities, and PKCE support from the Issuer.',
standardProtocolPolicy: 'Standard protocol policy',
standardProtocolPolicyDesc:
'Signing capabilities are negotiated automatically; no signing key is entered here.',
staticSigningKey: 'Static signing public key',
staticSigningKeyHelper:
'Only public-key material is accepted. Rotate it manually when the Provider key changes.',
staticSigningKeyPlaceholder: 'Paste a JWK, JWKS JSON, or PEM public key',
staticSigningKeyRequired: 'Provide the static signing public key.',
staticSigningKeyWarning:
'A static signing key cannot rotate automatically; update it before the Provider rotates keys.',
settingLoadFailed: 'OIDC settings could not be loaded',
settingLoadFailedHelper:
'The form is locked to avoid saving an empty default configuration over the current settings. Retry after the connection recovers.',
subsequentLogin: 'Subsequent login',
subsequentLoginPolicy:
'Find the binding by subject and update only User.Name when the new name is available.',
testBeforeBrowserTest: 'Test the current configuration before starting a browser login test.',
testBeforeEnable: 'Test the current configuration before saving configuration changes.',
testConfiguration: 'Test configuration',
testDiscovery: 'Test Discovery',
tlsCustomCA: 'HTTPS · Custom CA certificate',
tlsPrivateHTTP: 'HTTP · Private network only (dangerous)',
tlsPrivateHTTPWarning:
'HTTP provides no transport encryption and is restricted to explicitly allowed private targets.',
tlsSkipVerify: 'Ignore SSL certificate verification',
tlsSystem: 'HTTPS · System certificate verification (recommended)',
tokenEndpoint: 'Token Endpoint',
tokenEndpointInvalid: 'Enter a valid Token Endpoint.',
transportSecurity: 'Transport security',
transportSecurityHelper:
'Prefer HTTPS. Private HTTP also requires explicit private-network access.',
unsavedChanges: 'There are unsaved OIDC setting changes.',
usedClaim: 'Claim used',
userInfoEndpoint: 'UserInfo Endpoint',
userInfoEndpointHelper:
'When the username field is missing, the system retrieves it from this endpoint. Leave blank to skip fallback.',
userInfoEndpointInvalid: 'Enter a valid UserInfo Endpoint.',
userMapping: 'User settings',
userMappingDesc:
'Configure OIDC username mapping and the default node and role used to create a user on first sign-in.',
},
saml2: {
actionCreate: 'Create user',
actionPending: 'Waiting for result',
actionReject: 'Reject sign-in',
actionReuse: 'Use bound user',
assignDefaultRole: 'Assign default role: {role}',
basic: 'Basic settings',
basicDesc: 'Configure the common options required by most standard SAML2 identity providers.',
browserTest: 'Test sign-in',
browserTestConflict: 'Identity verified, but the username conflicts',
browserTestConflictHelper:
'The mapped username belongs to another identity and will not be linked automatically.',
browserTestExpired: 'Browser test expired',
browserTestExpiredHelper: 'Start a new test and complete sign-in before it expires.',
browserTestFailed: 'Browser test failed',
browserTestFailedHelper:
'The identity preview could not be completed. Check the localized backend error.',
browserTestIsolation:
'Performs a real SAML2 round trip without creating users, assigning roles, or creating a session.',
browserTestPopupBlocked: 'Allow pop-ups for this site, then run the test again.',
browserTestPopupClosed: 'The sign-in window was closed before the test completed.',
browserTestSuccess: 'SAML2 identity verified',
browserTestSuccessHelper:
'The identity mapping preview completed without modifying users or sessions.',
browserTestTitle: 'SAML2 test sign-in',
browserTestWaiting: 'Waiting for IdP sign-in',
browserTestWaitingHelper: 'Complete sign-in in the new window. This page updates automatically.',
certificateFileInvalid: 'Select a valid PEM, CRT, or CER certificate file.',
configured: 'Configured',
configurationFailedHelper: 'The test failed. Only the localized backend error is displayed.',
configurationNotTested: 'The current configuration has not been tested.',
configurationPassed: 'The current configuration passed validation.',
configurationStaleHelper: 'Authentication settings changed. Test the current draft again.',
configurationTestSuccess: 'SAML2 configuration test succeeded.',
configurationTesting: 'Testing the current SAML2 configuration',
conflictLDAP: 'LDAP user',
conflictLocal: 'Local user',
conflictNone: 'No conflict',
conflictOIDC: 'OIDC identity',
conflictSAML2: 'Another SAML2 identity',
conflictType: 'Conflict type',
credentialFileReadFailed: 'The credential file could not be read.',
credentialFileTooLarge: 'Credential files must not exceed 256 KiB.',
credentialsRequired: 'Configure both the SP private key and certificate.',
defaultRole: 'New user role',
defaultRoleHelper:
'Assigned only when the user is first created. Later sign-ins keep local roles, MFA, and permissions.',
defaultRolePlaceholder: 'Select a role',
defaultRoleRequired: 'Select a valid new-user role.',
disableConfirm:
'Disabling SAML2 immediately rejects new sign-ins and invalidates its user sessions. Continue?',
disableDiscardConfirm:
'Disabling SAML2 discards other unsaved changes on this page and immediately invalidates its user sessions. Continue?',
disableTitle: 'Disable SAML2',
disabled: 'Disabled',
enable: 'Enable',
enabled: 'Enabled',
idpMetadata: 'IdP Metadata',
idpMetadataDesc: 'Enter a URL or paste XML. When both are present, the URL takes precedence.',
keepExistingRole: 'Keep the existing role and local permissions',
loginWith: 'Sign in with {provider}',
mappingResult: 'Mapping result',
metadataRequired: 'Enter an IdP Metadata URL or XML.',
metadataURLHelper: 'The backend downloads and validates Metadata during testing and saving.',
metadataURLInvalid: 'Enter a valid HTTPS Metadata URL without credentials or a fragment.',
metadataURLRecommended: 'Metadata URL (recommended)',
metadataXML: 'Metadata XML',
metadataXMLHelper: 'Use this when the IdP does not expose a reachable Metadata URL.',
metadataXMLInvalid: 'Enter valid EntityDescriptor Metadata XML.',
metadataXMLPlaceholder: 'Paste <EntityDescriptor>...</EntityDescriptor>',
nameAttribute: 'Username attribute',
nameAttributeHelper:
'Reads this Attribute from the verified SAML Assertion and maps it to the 1Panel username.',
nameAttributePlaceholder: 'For example: uid, username, or account',
nameAttributeRequired: 'Enter the username attribute.',
notConfigured: 'Not configured',
or: 'or',
pageDesc:
'Connect enterprise single sign-on through IdP Metadata with the common settings on one page.',
plannedHandling: 'Planned handling',
privateKeyFileInvalid: 'Select a valid PEM private-key file.',
recentTestSuccess: 'Last successful test: {0}',
restore: 'Restore',
restored: 'Restored the last saved SAML2 configuration.',
roleHandling: 'Role handling',
rolesLoadFailed: 'Failed to load roles. Retry before selecting the new-user role.',
selectFile: 'Select file',
serviceStatus: 'Service status',
serviceStatusDesc: 'The current configuration must pass a test before SAML2 can be enabled.',
settingLoadFailed: 'Failed to load SAML2 settings',
settingLoadFailedHelper:
'The form is locked to avoid overwriting saved settings with empty defaults. Retry after connectivity is restored.',
spCertificate: 'SP certificate',
spCertificateHelper: 'Published in SP Metadata so the IdP can verify sign-in and logout requests.',
spCredentials: 'SP private key and certificate',
spCredentialsDesc:
'Used to sign sign-in and logout messages. Signature and validation policy is fixed by the backend.',
spPrivateKey: 'SP private key',
spPrivateKeyHelper:
'Used to sign AuthnRequest and logout messages. It is encrypted at rest and never displayed.',
syncLogout: 'Synchronized logout',
syncLogoutHelper:
'Signing out of either 1Panel or the identity provider also signs out the other side.',
testBeforeBrowserTest: 'Test the current configuration before running a browser sign-in test.',
testBeforeEnable:
'Test the current configuration before enabling SAML2 or saving authentication-sensitive changes.',
testConfiguration: 'Test configuration',
unsavedChanges: 'The SAML2 configuration has unsaved changes.',
usedAttribute: 'Username mapping',
usersAndRoles: 'Users and roles',
usersAndRolesDesc:
'Configure panel username mapping and the default node and role used to create a user on first sign-in.',
},
ldap: {
basic: 'Basic settings',
loginTitle: 'LDAP sign-in',
loginWith: 'Sign in with LDAP',
backToLocalLogin: 'Back to panel sign-in',
enable: 'Enable',
enabled: 'Enabled',
disabled: 'Disabled',
@@ -5152,6 +5552,7 @@ const message = {
deleteConfirm: 'Delete this export record and file?',
},
waf: {
WAF: 'WAF',
name: 'WAF',
blackWhite: 'Black and White List',
globalSetting: 'Global Settings',

File diff suppressed because it is too large Load Diff

View File

@@ -14,6 +14,7 @@ const message = {
next: 'بعدی',
create: 'ایجاد',
add: 'افزودن',
select: 'انتخاب',
save: 'ذخیره',
set: 'تنظیمات',
sync: 'همگام‌سازی',
@@ -90,6 +91,7 @@ const message = {
visit: 'باز کردن',
migrate: 'مهاجرت',
tip: 'نکته',
reconnect: 'اتصال مجدد',
},
operate: {
start: 'شروع',
@@ -115,6 +117,8 @@ const message = {
total: 'مجموع {0}',
name: 'نام',
type: 'نوع',
card: 'کارت',
table: 'جدول',
status: 'وضعیت',
statusSuccess: 'موفق',
statusFailed: 'ناموفق',
@@ -163,6 +167,7 @@ const message = {
deleteSuccess: 'حذف با موفقیت انجام شد',
loginSuccess: 'ورود با موفقیت انجام شد',
operationSuccess: 'عملیات با موفقیت انجام شد',
operationFailed: 'عملیات ناموفق بود',
copySuccess: 'کپی با موفقیت انجام شد',
notSupportOperation: 'این عملیات پشتیبانی نمی‌شود',
requestTimeout: 'زمان درخواست به پایان رسید، بعداً تلاش کنید',
@@ -204,6 +209,7 @@ const message = {
username: 'نام کاربری',
password: 'رمز عبور',
passkey: 'ورود با کلید عبور',
otherLoginMethods: 'سایر روش‌های ورود',
welcome: 'خوش آمدید. با نام کاربری و رمز عبور خود وارد شوید.',
errorAuthInfo: 'نام کاربری یا رمز عبور اشتباه است، دوباره تلاش کنید.',
errorMfaInfo: 'اطلاعات احراز هویت نامعتبر است، دوباره تلاش کنید.',
@@ -283,6 +289,9 @@ const message = {
authBasicPassword: 'پشتیبانی از حروف، اعداد و کاراکترهای ویژه رایج، طول ۱-۷۲',
length128Err: 'طول نمی‌تواند از ۱۲۸ کاراکتر بیشتر باشد',
maxLength: 'طول نمی‌تواند از {0} کاراکتر بیشتر باشد',
vmName: 'از حروف انگلیسی، اعداد، "."، "-" و "_" پشتیبانی می‌کند؛ طول ۱ تا ۶۴؛ باید با حرف یا عدد شروع شود.',
vmNetwork:
'از حروف انگلیسی، اعداد، "."، ":"، "-" و "_" پشتیبانی می‌کند؛ طول ۱ تا ۶۴؛ باید با حرف یا عدد شروع شود.',
alias: 'پشتیبانی از حروف انگلیسی، اعداد، - و _، طول ۱-۱۲۸، و نمی‌تواند با -_ شروع یا پایان یابد.',
},
res: {
@@ -466,7 +475,7 @@ const message = {
cpuSteal: 'ربایش',
cpuTop: '۵ فرآیند برتر بر اساس مصرف CPU',
memTop: '۵ فرآیند برتر بر اساس مصرف حافظه',
loadAverage: 'میانگین بار در دقیقه آخر | میانگین بار در {n} دقیقه گذشته',
loadAverage: 'میانگین بار در دقیقه آخر | میانگین بار در {0} دقیقه گذشته',
load: 'بار',
mount: 'نقطه اتصال',
fileSystem: 'سیستم فایل',
@@ -502,6 +511,7 @@ const message = {
deleteBackupHelper: 'همزمان پشتیبان‌های پایگاه داده را حذف کنید',
delete: 'عملیات حذف قابل بازگشت نیست، لطفاً عبارت "',
deleteHelper: '" را برای حذف این پایگاه داده وارد کنید',
deleteUserHelper: '" را برای حذف این کاربر وارد کنید',
userBoundDatabases: 'به پایگاه‌های داده زیر دسترسی دارد:',
noMysql: 'سرویس پایگاه داده (MySQL یا MariaDB)',
noPostgresql: 'سرویس پایگاه داده PostgreSQL',
@@ -540,6 +550,7 @@ const message = {
'این پورت، پورت نمایش داده شده کانتینر است. باید تغییرات را جداگانه ذخیره و کانتینر را مجدداً راه‌اندازی کنید!',
loadFromRemote: 'همگام‌سازی از سرور',
userBind: 'اتصال کاربر',
noUserBind: 'بدون اتصال',
userAuthorization: 'مجوز کاربر',
noUserAuthorization: 'بدون اعطای مجوز',
authorizedDatabaseCount: '{0} پایگاه داده مجاز',
@@ -803,16 +814,12 @@ const message = {
roleMarkdownDescriptions: {
'AGENTS.md': [
'دستورالعمل‌های عملیاتی برای عامل و نحوه استفاده از حافظه.',
'در ابتدای هر جلسه بارگذاری می‌شود.',
'مکان خوب برای قوانین، اولویت‌ها و جزئیات "نحوه رفتار".',
],
'SOUL.md': ['شخصیت، لحن و مرزها.', 'هر جلسه بارگذاری می‌شود.'],
'USER.md': ['کاربر کیست و چگونه خطاب شود.', 'هر جلسه بارگذاری می‌شود.'],
'IDENTITY.md': ['نام، حالت و ایموجی عامل.', 'در طول مراسم بوت‌استرپ ایجاد یا به‌روزرسانی می‌شود.'],
'TOOLS.md': [
'یادداشت‌هایی درباره ابزارها و قراردادهای محلی شما.',
'کنترل در دسترس بودن ابزار را ندارد؛ فقط راهنما است.',
],
'SOUL.md': ['شخصیت، لحن و مرزها.'],
'USER.md': ['کاربر کیست و چگونه خطاب شود.'],
'IDENTITY.md': ['نام، حالت و ایموجی عامل.'],
'TOOLS.md': ['یادداشت‌هایی درباره ابزارها و قراردادهای محلی شما.'],
'HEARTBEAT.md': [
'لیست کوچک اختیاری برای اجرای ضربان قلب.',
'برای جلوگیری از سوختن توکن، کوتاه نگه دارید.',
@@ -821,11 +828,7 @@ const message = {
'لیست شروع اختیاری که هنگام راه‌اندازی مجدد دروازه و فعال بودن هوک‌های داخلی اجرا می‌شود.',
'کوتاه نگه دارید؛ برای ارسال‌های خروجی از ابزار پیام استفاده کنید.',
],
'BOOTSTRAP.md': [
'مراسم یک‌باره اولین اجرا.',
'فقط برای یک فضای کار کاملاً جدید ایجاد می‌شود.',
'پس از اتمام مراسم، آن را حذف کنید.',
],
'BOOTSTRAP.md': ['مراسم یک‌باره اولین اجرا.', 'فقط برای یک فضای کار کاملاً جدید ایجاد می‌شود.'],
},
duplicateBinding: 'ترکیب کانال و شناسه حساب باید یکتا باشد',
accountIdOptional: 'شناسه حساب (اختیاری)',
@@ -905,6 +908,8 @@ const message = {
scanConnectHelper:
'برای شروع کار ورود با QR کلیک کنید. کد QR در لاگ وظیفه ظاهر می‌شود و پس از اسکان موفق، کانتینر به طور خودکار مجدداً راه‌اندازی می‌شود.',
channelAutoRestartHelper: 'ذخیره به طور خودکار کانتینر را مجدداً راه‌اندازی می‌کند تا تغییرات اعمال شوند.',
dashboardAuthAutoRebuildHelper:
'ذخیره نام کاربری یا رمز عبور، کانتینر را به‌طور خودکار بازسازی می‌کند تا تغییرات اعمال شوند.',
channelDeleteConfirm: 'پیکربندی کانال {0} حذف شود؟',
apiTypeBaseURLHelper: 'این نوع درخواست‌ها را به {0} ارسال می‌کند. Base URL پیشنهادی: {1}',
apiTypeBaseURLMismatch: 'Base URL فعلی شبیه مسیر {0} است، اما {1} انتخاب شده است. URL پیشنهادی: {2}',
@@ -1209,13 +1214,11 @@ const message = {
latencyMs: 'تاخیر(ms)',
smartRouteSettingGuide:
'پس از فعال‌سازی، فقط درخواست‌های model=auto مسیریابی هوشمند را فعال می‌کنند. گروه ساده برای وظایف کم‌هزینه و گروه پیچیده برای تحلیل کد، طراحی معماری و عیب‌یابی است.',
sampleLabelPlaceholder: 'simple / complex / high',
sampleLabelPlaceholder: 'ساده / پیچیده / بالا',
sampleImportPlaceholder: 'هر خط یک نمونه',
},
skillsHub: {
title: 'مرکز مهارت',
skillList: 'لیست مهارت',
serverTab: 'سرور',
upload: 'بارگذاری مهارت',
importSkill: 'واردات مهارت',
repositoryAddress: 'آدرس مخزن',
@@ -1228,6 +1231,13 @@ const message = {
importSuccess: 'مهارت با موفقیت وارد شد و در انتظار بررسی است.',
source: 'منبع',
applicableAgent: 'عامل قابل اجرا',
overview: 'نمای کلی',
versionHistory: 'تاریخچه نسخه',
publishedAt: 'زمان انتشار',
versionMarker: 'نشان',
currentVersion: 'فعلی',
latestVersion: 'آخرین نسخه',
latestPublished: 'آخرین نسخه منتشرشده',
riskLevel: 'سطح ریسک',
riskReferenceHint:
'سطح ریسک به طور خودکار از محتوای بسته مهارت تولید می‌شود و فقط برای مرجع بررسی است.\nکم: هیچ ریسک آشکاری یافت نشد\nمتوسط: اسکریپت، وابستگی‌ها، URLهای خارجی یا متغیرهای محیطی\nبالا: اجرای از راه دور، اطلاعات حساس یا دستورات خطرناک',
@@ -1262,6 +1272,12 @@ const message = {
onlySupportedArchive: 'فقط بسته‌های مهارت .zip, .7z, .tar, .tar.gz قابل بارگذاری هستند',
uploadSizeExceeded: 'یک بسته مهارت نباید از ۵ مگابایت بیشتر باشد',
uploadSuccess: 'مهارت با موفقیت بارگذاری شد و در انتظار بررسی است.',
versionAutoFillPlaceholder:
'در صورت امکان از نام فایل به‌طور خودکار تشخیص داده می‌شود؛ آن را تأیید یا به‌صورت دستی وارد کنید',
metadataOverwriteConfirm:
'نسخه موجود در بسته Skill با مقدار فعلی متفاوت است. از مقدار واردشده فعلی استفاده شود؟',
metadataOverwriteConfirmWithVersions:
'نسخه موجود در بسته Skill با مقدار فعلی متفاوت است. نسخه بسته: {packageVersion}؛ نسخه واردشده: {inputVersion}. از مقدار واردشده فعلی استفاده شود؟',
offlineNotice: 'محیط فعلی آفلاین است. فقط مهارت‌های فروشگاه محلی مهارت قابل نصب هستند.',
publishConfirm: 'این مهارت منتشر شود؟ مهارت‌های منتشر شده از فروشگاه محلی مهارت قابل نصب هستند.',
disableConfirm: 'انتشار این مهارت لغو شود؟ مهارت‌های نصب شده در عامل‌ها تحت تأثیر قرار نمی‌گیرند.',
@@ -1272,24 +1288,6 @@ const message = {
deleteTargetConfirm: 'این عامل سفارشی حذف شود؟ کاربران دیگر نمی‌توانند آن را انتخاب کنند.',
noInstallTarget: 'هیچ عامل سفارشی در دسترس نیست. ابتدا یک هدف نصب پیکربندی کنید.',
postInstallConfirm: 'این هدف دارای دستور پس از نصب است. قبل از اجرا مطمئن شوید که دستور قابل اعتماد است.',
serverStatusTitle: 'سرور مرکز مهارت',
serverServiceOperateConfirm: 'آیا مطمئن هستید که می‌خواهید سرور مرکز مهارت را {0} کنید؟',
serverAccessSetting: 'تنظیمات دسترسی سرویس',
serverInfo: 'اطلاعات سرور',
tokenSetting: 'تنظیمات توکن',
externalUrl: 'URL خارجی',
externalUrlRequired: 'ابتدا URL خارجی را وارد کنید.',
skillctlDownloadUrl: 'URL دانلود skillctl',
skillctlArchitecture: 'معماری سرور',
registryUrl: 'URL ثبت‌نامه',
loginCommand: 'دستور ورود',
installCommand: 'دستور نصب',
createToken: 'ایجاد توکن',
tokenCreated: 'توکن ایجاد شد',
tokenVisibleOnce: 'توکن فقط یک بار نشان داده می‌شود. اکنون آن را کپی و ذخیره کنید.',
disableTokenConfirm:
'این توکن غیرفعال شود؟ کلاینت‌های skillctl که از آن استفاده می‌کنند دیگر نمی‌توانند مهارت نصب کنند.',
deleteTokenConfirm: 'این توکن حذف شود؟ این عمل قابل بازگشت نیست.',
status: {
pending: 'در انتظار',
approved: 'تأیید شده',
@@ -1747,7 +1745,8 @@ const message = {
dockerStatus: 'سرویس Docker',
daemonJsonPathHelper: 'اطمینان حاصل کنید که مسیر پیکربندی با مسیر مشخص شده در docker.service یکسان است.',
mirrors: 'آینه‌های مخزن',
mirrorsHelper: '',
mirrorsHelper:
'برای عملیات ایمیج ابتدا از URLهای آینه رجیستری استفاده کنید. برای غیرفعال کردن آینه‌ها این بخش را خالی بگذارید.',
mirrorsHelper2: 'برای جزئیات، به مستندات رسمی مراجعه کنید.',
registries: 'مخازن ناامن',
ipv6Helper:
@@ -2060,7 +2059,7 @@ const message = {
'از حساب مدل انتخاب شده برای تولید و پر کردن دستورات استفاده کنید. برای مدل‌های محلی مانند Ollama و vLLM، از یک حساب مدل سفارشی استفاده کنید.',
aiPrefix: 'پیشوند محرک',
aiPrefixHelper:
'"{0} + space" را وارد کرده و Enter را بزنید تا تولید دستور AI فعال شود، مثلاً: {0} کمک کن استفاده از دیسک را بررسی کنم.',
'«پیشوند + فاصله» را وارد کرده و Enter را بزنید تا تولید دستور AI فعال شود؛ برای نمونه: {0} کمک کن میزان استفاده از دیسک را بررسی کنم.',
aiRiskCommands: 'راه‌اندازی دستورات پرخطر',
aiRiskCommandsHelper:
'دستورات پرخطر را برای راه‌اندازی پیکربندی کنید، هر خط یک دستور. در صورت تطابق، تولید مسدود شده و به عنوان نظر بازگردانده می‌شود.',
@@ -2259,6 +2258,7 @@ const message = {
nodes: 'گره',
commands: 'دستورات سریع',
opsReport: 'گزارش عملیات',
ops_report: 'گزارش عملیات',
users: 'مدیریت کاربران',
roles: 'نقش',
auth: 'احراز هویت ورود',
@@ -3724,9 +3724,9 @@ const message = {
staticChangePHPHelper: 'در حال حاضر یک وب‌سایت استاتیک است، می‌توانید به وب‌سایت PHP تغییر دهید',
proxyCache: 'کش پراکسی معکوس',
cacheLimit: 'محدودیت فضای کش',
shareCahe: 'اندازه حافظه کش شمارش',
shareCache: 'اندازه حافظه کش شمارش',
cacheExpire: 'زمان انقضای کش',
shareCaheHelper: 'تقریباً ۸۰۰۰ شیء کش در هر ۱ مگابایت حافظه قابل ذخیره است',
shareCacheHelper: 'تقریباً ۸۰۰۰ شیء کش در هر ۱ مگابایت حافظه قابل ذخیره است',
cacheLimitHelper: 'کش قدیمی در صورت تجاوز از حد به طور خودکار حذف می‌شود',
cacheExpireJHelper: 'کش در صورت عدم بازدید پس از زمان انقضا حذف می‌شود',
realIP: 'IP واقعی',
@@ -4075,6 +4075,7 @@ const message = {
},
runtime: {
runtime: 'محیط اجرا',
default: 'پیش‌فرض',
workDir: 'دایرکتوری کاری',
localHelper: 'برای مشکلات نصب محیط محلی و استفاده در محیط آفلاین، به ',
versionHelper: 'نسخه PHP، مثلاً v8.0',
@@ -4875,6 +4876,14 @@ const message = {
authManage: 'مدیریت احراز هویت',
auth: {
providerNavigation: 'ارائه دهندگان احراز هویت',
defaultNode: 'گره پیش فرض',
defaultNodePlaceholder: 'یک گره انتخاب کنید',
defaultNodeHelper: 'فقط برای کاربران جدید.',
defaultNodeRequired: 'یک گره پیش فرض معتبر انتخاب کنید.',
nodesLoadFailed: 'بارگیری گره ها ناموفق بود. پیش از انتخاب گره پیش فرض دوباره تلاش کنید.',
nodeHandling: 'مدیریت گره',
assignDefaultNode: 'اختصاص گره پیش فرض: {node}',
keepExistingNode: 'حفظ مجوزهای گره موجود',
providers: {
ldap: 'AD/LDAP',
passkey: 'Passkey',
@@ -4902,7 +4911,399 @@ const message = {
planned: 'برنامه ریزی شده است',
plannedTitle: 'تنظیمات احراز هویت {0}',
plannedDesc: 'این ارائه دهنده احراز هویت برنامه ریزی شده است و هنوز در دسترس نیست.',
oidc: {
accessMode: 'حالت اتصال',
accessModeDesc:
'هر زمان که ارائه دهنده هویت از آن پشتیبانی می کند، از Discovery استاندارد استفاده کنید.',
actionCreate: 'کاربر ایجاد کنید',
actionKeepName: 'نام کاربری فعلی را حفظ کنید',
actionPending: 'منتظر نتیجه',
actionReject: 'رد ورود',
actionUpdate: 'اطلاعات هویتی را به روز کنید',
advanced: 'تنظیمات پیشرفته',
advancedDesc:
'پیش فرض های ایمن را حفظ کنید مگر اینکه ارائه دهنده به گزینه سازگاری نیاز داشته باشد.',
assignDefaultRole: 'نقش پیش فرض را تعیین کنید: {role}',
authorizationEndpoint: 'Authorization Endpoint',
authorizationEndpointInvalid: 'یک Authorization Endpoint معتبر وارد کنید.',
authorizationFlow: 'جریان مجوز',
automatic: 'خودکار',
automaticPolicy: 'سیاست کنترل خودکار',
automaticPolicyDesc: 'این قوانین توسط بک‌اند اجرا می‌شوند و گزینه‌های قابل تنظیم توسط مدیر نیستند.',
basic: 'تنظیمات پایه',
basicDesc: 'حالت ارائه دهنده را انتخاب کنید، سپس مشتری و پاسخ به تماس را پیکربندی کنید.',
browserTest: 'آزمون ورود در مرورگر',
browserTestConflict: 'هویت تأیید شد، اما نام کاربری تداخل دارد',
browserTestConflictHelper:
'نام کاربری نگاشت‌شده متعلق به هویت دیگری است و به‌طور خودکار متصل نمی‌شود.',
browserTestExpired: 'تست مرورگر منقضی شد',
browserTestExpiredHelper: 'یک آزمایش مرورگر جدید را شروع کنید و مجوز را قبل از انقضا کامل کنید.',
browserTestFailed: 'تست مرورگر ناموفق بود',
browserTestFailedHelper:
'پیش‌نمایش هویت تکمیل نشد. خطای بومی‌سازی‌شده بازگشتی از بک‌اند را بررسی کنید.',
browserTestIsolation:
'این فرایند یک رفت‌وبرگشت واقعی مجوز را انجام می‌دهد، اما کاربری ایجاد یا به‌روزرسانی نمی‌کند، نقشی اختصاص نمی‌دهد و نشست ورود واقعی ایجاد نمی‌کند.',
browserTestPopupBlocked:
'به پنجره‌های بازشو برای این سایت اجازه دهید، سپس تست مرورگر را دوباره شروع کنید.',
browserTestPopupClosed: 'پنجره مجوز قبل از اتمام آزمایش بسته شد.',
browserTestSuccess: 'تأیید ارائه‌دهنده با موفقیت انجام شد',
browserTestSuccessHelper: 'نگاشت هویت بدون تغییر کاربران یا جلسات پیش نمایش شد.',
browserTestTitle: 'ورود آزمایشی مرورگر OIDC',
browserTestWaiting: 'در انتظار تأیید ارائه‌دهنده',
browserTestWaitingHelper:
'ورود به سیستم را در پنجره مرورگر جدید کامل کنید. این صفحه به طور خودکار به روز می شود.',
callbackCopied: 'URL بازگشت OIDC کپی شد.',
callbackURL: 'URL بازگشت',
callbackURLHelper:
'این نشانی را به فهرست نشانی‌های بازگشت مجاز کلاینت در ارائه‌دهنده هویت اضافه کنید.',
cancelClearSecret: 'لغو پاکسازی',
clearSecret: 'پاک کردن Client Secret',
clearSecretConfirm: 'Client Secret فقط پس از ذخیره حذف خواهد شد. ادامه دهید؟',
clientAuthMethod: 'روش احراز هویت مشتری',
clientAuthMethodHelper:
'روش احراز هویت پیکربندی‌شده برای این کلاینت در ارائه‌دهنده هویت را انتخاب کنید.',
clientAuthMethodRequired: 'یک روش احراز هویت مشتری را انتخاب کنید.',
clientID: 'Client ID',
clientIDRequired: 'Client ID را وارد کنید.',
clientSecret: 'Client Secret',
clockSkew: 'تحمل اختلاف زمانی توکن',
clockSkewHelper:
'اختلاف زمانی اندکی میان ارائه‌دهنده هویت و 1Panel را مجاز می‌کند. مقدار پیش‌فرض 60 ثانیه را حفظ کنید.',
clockSkewRequired: 'تحمل اختلاف زمانی توکن را وارد کنید.',
compatibilityMode: 'حالت سازگاری',
compatibilityModeHelper:
'فقط برای Discovery ناقص یا نقاط پایانی بازنویسی شده استفاده کنید. اعتبار سنجی Core OIDC همچنان فعال است.',
configurationFailedHelper:
'آزمایش ناموفق بود. صفحه فقط خطای بومی‌سازی‌شده بازگشتی از بک‌اند را نمایش می‌دهد.',
configurationFailedTag: 'تست ناموفق بود',
configurationHighRiskPassed: 'پیکربندی تصویب شد، اما حاوی گزینه‌های سازگاری پرخطر است.',
configurationHighRiskTag: 'پیکربندی پرخطر تصویب شد',
configurationNotTested: 'پیکربندی فعلی آزمایش نشده است.',
configurationNotTestedTag: 'تست نشده',
configurationPassed: 'پیکربندی فعلی بررسی‌های امنیتی و قابلیت را پشت سر گذاشت.',
configurationPassedTag: 'آزمون قبول شد',
configurationStaleHelper: 'پیکربندی تغییر کرده است. پیش از ذخیره دوباره آن را آزمایش کنید.',
configurationStaleTag: 'نتیجه منقضی شده است',
configurationTestMeta:
'در {time} آزمایش شد و در {duration} میلی‌ثانیه تکمیل شد. پاسخ خام ارائه‌دهنده ذخیره نمی‌شود.',
configurationTestResult: 'نتیجه تست پیکربندی',
configurationTestResultDesc:
'این فقط Discovery و قابلیت ها را بررسی می کند. کد مجوز را مبادله نمی کند یا Client Secret را اثبات نمی کند. از لاگین آزمایشی مرورگر برای تایید سرتاسر استفاده کنید.',
configurationTestSuccess: 'تست پیکربندی OIDC با موفقیت انجام شد.',
configurationTesting: 'آزمایش پیکربندی فعلی OIDC…',
configurationTestingTag: 'تست کردن',
configureSecret: 'پیکربندی Client Secret',
conflictExistingRename: 'subject متصل، نام کاربری جدیدی را برمی‌گرداند که قبلاً استفاده شده است.',
conflictExistingRenameResult:
'User.Name موجود را حفظ کنید و به کاربر مقید اجازه ورود به سیستم را بدهید',
conflictLDAP: 'کاربر LDAP',
conflictLocal: 'کاربر محلی',
conflictNewAvailable: 'subject جدید و نام کاربری نگاشت‌شده در دسترس هستند',
conflictNewAvailableResult: 'یک کاربر سازمانی ایجاد کنید و نقش پیش فرض را تعیین کنید',
conflictNone: 'بدون درگیری',
conflictOIDC: 'هویت دیگر OIDC',
conflictOccupied: 'نام کاربری نگاشت‌شده متعلق به کاربر محلی، کاربر LDAP یا هویت OIDC دیگری است.',
conflictOccupiedResult: 'رد هویت جدید؛ هرگز به طور خودکار متصل یا ادغام نمی شود',
conflictType: 'نوع تضاد',
connectionSecurity: 'امنیت اتصال',
connectionSecurityDesc:
'خط‌مشی TLS برای درخواست‌های Discovery، Token، JWKS، و UserInfo اعمال می‌شود.',
connectionTest: 'تست اتصال و پیکربندی',
connectionTestCompatibilityDesc: 'نقاط پایانی سفارشی و خط‌مشی امنیتی پروتکل را اعتبارسنجی کنید.',
connectionTestStandardDesc: 'نقاط پایانی و قابلیت ها به طور خودکار از Issuer کشف می شوند.',
connectionTestTab: 'آزمون اتصال',
customCA: 'CA سفارشی',
customCAHelper: 'فقط برای این منبع احراز هویت اعمال می شود و هرگز در گزارش ها نوشته نمی شود.',
customCARequired: 'گواهی سفارشی CA را ارائه دهید.',
defaultRole: 'نقش پیش فرض',
defaultRoleHelper:
'فقط هنگام ایجاد کاربر برای نخستین بار اختصاص می‌یابد؛ ورودهای بعدی نقش را تغییر نمی‌دهند.',
defaultRolePlaceholder: 'یک نقش را انتخاب کنید',
defaultRoleRequired: 'یک نقش پیش فرض معتبر انتخاب کنید.',
disableAfterSave: 'OIDC پس از ذخیره غیرفعال می شود.',
disableConfirm: 'غیرفعال کردن OIDC بلافاصله دسترسی کاربران این منبع را باطل می کند. ادامه دهید؟',
disableDiscardConfirm:
'غیرفعال کردن OIDC یک اقدام اضطراری است: فقط ورودی ورود به سیستم را می بندد و بلافاصله دسترسی کاربران این منبع را باطل می کند. سایر تغییرات ذخیره نشده در این صفحه، از جمله تغییرات Client Secret، نادیده گرفته خواهند شد. ادامه دهید؟',
disableTitle: 'OIDC را غیرفعال کنید',
disabled: 'غیرفعال',
discoveryAllowlist: 'فهرست مجاز امنیتی Discovery',
enable: 'فعال‌سازی',
enableAfterSave: 'OIDC پس از ذخیره موفقیت آمیز فعال می شود.',
enabled: 'فعال',
endSessionEndpoint: 'End Session Endpoint',
endSessionEndpointHelper:
'برای استفاده در آینده ذخیره می‌شود؛ خروج از سیستم آغازشده توسط ارائه‌دهنده در این نسخه گنجانده نشده است.',
endSessionEndpointInvalid: 'یک End Session Endpoint معتبر وارد کنید.',
endpointDiscoveryPlaceholder: 'پس از آزمایش اتصال نمایش داده می‌شود',
firstLogin: 'ابتدا وارد شوید',
firstLoginPolicy: 'یک کاربر سازمانی محلی ایجاد کنید و نقش پیش فرض پیکربندی شده را تعیین کنید.',
fixedAuthorizationCode: 'Authorization Code Flow',
fixedNoTokenPersistence: 'Token، Claims، و verifier هرگز باقی نمی مانند',
fixedSecurityPolicy: 'همیشه اجرا می شود؛ بدون نیاز به پیکربندی',
fixedStateNonce: 'یکبار مصرف state و nonce',
fixedTokenValidation: 'امضای ID Token و اعتبار Claims',
highRiskSaveConfirm:
'این پیکربندی فعال شامل گزینه‌های سازگاری پرخطر است. تأیید کنید که محیط ایزوله به آنها نیاز دارد.',
highRiskTitle: 'پیکربندی پرخطر OIDC',
hs256Compatibility: 'HS256 (سازگاری)',
hs256KeyHelper:
'HS256 همیشه از Client Secret این منبع استفاده می کند و کلید امضای جداگانه را نمی پذیرد.',
hs256Warning:
'HS256 برای امضای ID Token از یک راز متقارن مشترک استفاده می‌کند. فقط زمانی از آن استفاده کنید که ارائه‌دهنده نتواند از الگوریتم نامتقارن استفاده کند.',
identityBindingPolicy:
'هویت به AuthSourceID + issuer + subject متصل است. تطابق نام کاربری هرگز حساب دیگری را به‌طور خودکار متصل نمی‌کند.',
identityMissing: 'هویت غیرفعال',
issuer: 'Issuer URL',
issuerHelper: 'مقدار ID Token است و Discovery issuer باید دقیقاً با این مقدار مطابقت داشته باشد.',
issuerInvalid: 'یک HTTP یا HTTPS Issuer URL معتبر بدون پرس و جو یا قطعه وارد کنید.',
issuerRequired: 'Issuer URL را وارد کنید.',
jwksRotation: 'چرخش خودکار JWKS',
jwksURI: 'JWKS URI',
jwksURIHelper: 'زمانی که منبع کلید JWKS باشد برای امضای نامتقارن مورد نیاز است.',
jwksURIInvalid: 'یک JWKS URI معتبر برای منبع کلید امضای انتخاب شده وارد کنید.',
keepExistingRole: 'نقش های موجود و مجوزهای محلی را حفظ کنید',
localSecurityData: 'داده های امنیتی محلی',
localSecurityDataPolicy: 'هرگز نقش‌ها، MFA، API Keys، Passkeys یا مجوزهای محلی را بازنویسی نکنید.',
localCredentialsManaged:
'نام کاربری و رمز عبور محلی توسط OIDC مدیریت می‌شوند و در اینجا قابل ویرایش نیستند. نقش‌ها، مجوزها، MFA، API Keys و Passkeys محلی باقی می‌مانند.',
localUserFields: 'فیلدهای کاربری محلی',
localUserFieldsDesc:
'اولین نسخه فقط User.Name را نقشه برداری می کند و از عبارت نقشه برداری JSON استفاده نمی کند.',
loginWith: 'ورود با {provider}',
manualEndpoints: 'نقاط پایانی سفارشی',
manualEndpointsDesc:
'فقط زمانی استفاده کنید که Discovery ناقص باشد یا یک دروازه بالادست نقاط انتهایی را بازنویسی کند.',
mappingResult: 'نتیجه نقشه برداری',
mode: 'حالت اتصال',
modeRequired: 'یک حالت اتصال را انتخاب کنید.',
nameClaim: 'Claim نام کاربری',
nameClaimHelper: 'فیلد حاوی نام کاربری، مانند preferred_username، را وارد کنید.',
nameClaimRequired: 'Claim نام کاربری را وارد کنید.',
nameConflict: 'خط مشی تضاد نام',
panelURL: 'URL عمومی 1Panel',
panelURLHTTPWarning:
'HTTP از پاسخ مجوز محافظت نمی‌کند. فقط در محیط خصوصی ایزوله‌ای که ارائه‌دهنده می‌پذیرد از آن استفاده کنید.',
panelURLHelper:
'نشانی دسترسی کاربران به 1Panel را وارد کنید. این نشانی برای ایجاد نشانی بازگشت استفاده می‌شود.',
panelURLInvalid: 'مبدایی را وارد کنید که فقط شامل طرح، میزبان و پورت اختیاری است.',
panelURLRequired: 'URL عمومی 1Panel را وارد کنید.',
pkceDisabled: 'غیرفعال (فقط سازگاری)',
pkceDisabledWarning: 'غیرفعال کردن PKCE حفاظت در برابر رهگیری کد مجوز را کاهش می دهد.',
pkceHelper: 'S256 را ترجیح دهید. روش چالش plain هرگز ارائه نمی شود.',
pkceS256: 'S256 (توصیه می شود)',
plannedHandling: 'جابجایی برنامه ریزی شده',
privateNetworkIdP: 'IdP شبکه خصوصی',
privateNetworkIdPHelper:
'به صراحت آدرس های خصوصی را مجاز می کند. ابرداده، لوپ بک، پیوند محلی، تغییر مسیرها و پیوند مجدد DNS مسدود می‌مانند.',
privateNetworkWarning: 'دسترسی به شبکه خصوصی برای این منبع احراز هویت فعال است.',
protocolCompatibility: 'سازگاری پروتکل',
protocolCompatibilityDesc: 'اعتبار سنجی امضای ID Token هرگز نمی تواند غیرفعال شود.',
providerAndClient: 'ارائه‌دهنده و کلاینت',
providerAndClientDesc:
'Client Secret فقط می تواند جایگزین یا پاک شود و هرگز توسط صفحه بازگردانده نمی شود.',
providerCapabilities: 'قابلیت‌های ارائه‌دهنده',
recentTestSuccess: 'آخرین آزمایش موفق: {0}',
recommended: 'توصیه می شود',
rejectPlain: 'plain رد شد',
replaceSecret: 'راز را جایگزین کنید',
requestAndClaims: 'درخواست ها و صفات',
requestAndClaimsDesc: 'دامنه‌های مجوز، تکمیل اطلاعات کاربر و پارامترهای درخواست را پیکربندی کنید.',
requestTimeout: 'مهلت زمانی درخواست',
requestTimeoutRequired: 'زمان درخواست را وارد کنید.',
restore: 'بازیابی',
restored: 'آخرین تنظیمات ذخیره شده OIDC بازیابی شدند.',
result: 'نتیجه',
rolesLoadFailed: 'نقش ها بارگیری نشدند. قبل از انتخاب نقش پیش فرض، دوباره امتحان کنید.',
roleHandling: 'رسیدگی به نقش',
scenario: 'سناریو',
scopes: 'دامنه‌های مجوز',
scopesHelper: 'باید شامل openid باشد. دامنه‌های متعدد را با فاصله جدا کنید.',
scopesRequired: 'Scopes باید شامل openid باشد.',
seconds: 'ثانیه',
secretClearHelper:
'پس از پاکسازی، قبل از اینکه OIDC بتواند دوباره فعال شود، یک Client Secret جدید لازم است.',
secretConfigured: 'پیکربندی شده است',
secretNotConfigured: 'پیکربندی نشده است',
secretPlaceholder: 'یک Client Secret جدید وارد کنید',
secretReplaceHelper:
'مقدار جدید هنگام ذخیره جایگزین مقدار قبلی می‌شود. Client Secret را در Provider OIDC نیز به‌روزرسانی کنید.',
secretRequiredHelper: 'قبل از فعال کردن OIDC یک Client Secret را پیکربندی کنید.',
secretRequiredToEnable: 'قبل از فعال کردن OIDC یک Client Secret را پیکربندی کنید.',
secretSavedHelper: 'به‌صورت رمزگذاری‌شده ذخیره می‌شود. برای حفظ رمز فعلی، فیلد را خالی بگذارید.',
secretWaiting: 'در انتظار ورودی',
secretWillClear: 'پاک خواهد شد',
secretWillReplace: 'جایگزین خواهد شد',
signingAlgorithm: 'الگوریتم امضای ID Token',
signingAlgorithmHelper: 'فقط الگوریتم‌های موجود در لیست مجوزهای امنیتی Backend در دسترس هستند.',
signingKey: 'کلید امضا',
signingKeyClientSecret: 'Client Secret (فقط HS256)',
signingKeyJWKS: 'JWKS URI با چرخش خودکار',
signingKeySource: 'منبع کلید امضا',
signingKeySourceHelper: 'JWKS را ترجیح دهید. یک کلید عمومی ثابت نمی تواند به طور خودکار بچرخد.',
signingKeyStatic: 'کلید عمومی ثابت JWK یا PEM',
standardDiscovery: 'استاندارد OIDC Discovery',
standardDiscoveryDesc: '1Panel نقاط پایانی و قابلیت‌ها را کشف می‌کند و سند خام را ذخیره نمی‌کند.',
standardMode: 'حالت استاندارد',
standardModeHelper: 'نقاط پایانی، قابلیت‌های امضا و پشتیبانی PKCE را از Issuer کشف کنید.',
standardProtocolPolicy: 'خط مشی پروتکل استاندارد',
standardProtocolPolicyDesc:
'قابلیت های امضا به طور خودکار مذاکره می شود. هیچ کلید امضایی در اینجا وارد نشده است.',
staticSigningKey: 'کلید عمومی امضای ایستا',
staticSigningKeyHelper:
'فقط کلید عمومی پذیرفته می‌شود. هنگام تغییر کلید ارائه‌دهنده، آن را به‌صورت دستی جایگزین کنید.',
staticSigningKeyPlaceholder: 'یک کلید عمومی JWK، JWKS JSON، یا PEM جایگذاری کنید',
staticSigningKeyRequired: 'کلید عمومی امضای ثابت را ارائه دهید.',
staticSigningKeyWarning:
'کلید امضای ثابت نمی‌تواند خودکار بچرخد. پیش از چرخش کلیدهای ارائه‌دهنده، آن را به‌روزرسانی کنید.',
settingLoadFailed: 'تنظیمات OIDC بارگیری نشد',
settingLoadFailedHelper:
'فرم قفل شده است تا از ذخیره یک پیکربندی پیش فرض خالی روی تنظیمات فعلی جلوگیری شود. پس از بازیابی اتصال دوباره سعی کنید.',
subsequentLogin: 'ورود بعدی',
subsequentLoginPolicy:
'اتصال را با subject پیدا کنید و فقط زمانی که نام کاربری جدید در دسترس است User.Name را به‌روزرسانی کنید.',
testBeforeBrowserTest: 'قبل از شروع تست ورود به مرورگر، پیکربندی فعلی را آزمایش کنید.',
testBeforeEnable: 'پیش از ذخیره تغییرات پیکربندی، پیکربندی فعلی را آزمایش کنید.',
testConfiguration: 'آزمون پیکربندی',
testDiscovery: 'آزمون Discovery',
tlsCustomCA: 'HTTPS · گواهی سفارشی CA',
tlsPrivateHTTP: 'HTTP · فقط شبکه خصوصی (خطرناک)',
tlsPrivateHTTPWarning:
'HTTP هیچ رمزگذاری حمل و نقلی ارائه نمی دهد و محدود به اهداف خصوصی مجاز است.',
tlsSkipVerify: 'HTTPS · رد شدن از تأیید گواهی (خطرناک)',
tlsSystem: 'HTTPS · تأیید گواهی سیستم (توصیه می شود)',
tokenEndpoint: 'Token Endpoint',
tokenEndpointInvalid: 'یک Token Endpoint معتبر وارد کنید.',
transportSecurity: 'امنیت حمل و نقل',
transportSecurityHelper:
'HTTPS را ترجیح دهید. HTTP خصوصی همچنین به دسترسی صریح private-network نیاز دارد.',
unsavedChanges: 'تغییرات ذخیره‌نشده OIDC وجود دارد.',
usedClaim: 'Claim استفاده شده است',
userInfoEndpoint: 'UserInfo Endpoint',
userInfoEndpointHelper:
'اگر فیلد نام کاربری موجود نباشد، سیستم آن را از این نقطه پایانی دریافت می‌کند؛ برای عدم تکمیل، خالی بگذارید.',
userInfoEndpointInvalid: 'یک UserInfo Endpoint معتبر وارد کنید.',
userMapping: 'تنظیمات کاربر',
userMappingDesc:
'نگاشت نام کاربری OIDC و گره و نقش پیش‌فرض مورد استفاده برای ایجاد کاربر در نخستین ورود را تنظیم کنید.',
},
saml2: {
actionCreate: 'کاربر ایجاد کنید',
actionPending: 'منتظر نتیجه',
actionReject: 'رد ورود',
actionReuse: 'استفاده از کاربر پیوندخورده',
assignDefaultRole: 'نقش پیش فرض را تعیین کنید: {role}',
basic: 'تنظیمات پایه',
basicDesc: 'گزینه‌های رایج مورد نیاز بیشتر ارائه‌دهندگان استاندارد SAML2 را پیکربندی کنید.',
browserTest: 'آزمایش ورود',
browserTestConflict: 'هویت تأیید شد، اما نام کاربری تداخل دارد',
browserTestConflictHelper:
'نام کاربری نگاشت‌شده متعلق به هویت دیگری است و به‌طور خودکار متصل نمی‌شود.',
browserTestExpired: 'تست مرورگر منقضی شد',
browserTestExpiredHelper: 'یک آزمایش مرورگر جدید را شروع کنید و مجوز را قبل از انقضا کامل کنید.',
browserTestFailed: 'تست مرورگر ناموفق بود',
browserTestFailedHelper:
'پیش‌نمایش هویت تکمیل نشد. خطای بومی‌سازی‌شده بازگشتی از بک‌اند را بررسی کنید.',
browserTestIsolation:
'این فرایند یک رفت‌وبرگشت واقعی مجوز را انجام می‌دهد، اما کاربری ایجاد یا به‌روزرسانی نمی‌کند، نقشی اختصاص نمی‌دهد و نشست ورود واقعی ایجاد نمی‌کند.',
browserTestPopupBlocked:
'به پنجره‌های بازشو برای این سایت اجازه دهید، سپس تست مرورگر را دوباره شروع کنید.',
browserTestPopupClosed: 'پنجره مجوز قبل از اتمام آزمایش بسته شد.',
browserTestSuccess: 'تأیید ارائه‌دهنده با موفقیت انجام شد',
browserTestSuccessHelper: 'نگاشت هویت بدون تغییر کاربران یا جلسات پیش نمایش شد.',
browserTestTitle: 'ورود آزمایشی مرورگر SAML2',
browserTestWaiting: 'در انتظار تأیید ارائه‌دهنده',
browserTestWaitingHelper:
'ورود به سیستم را در پنجره مرورگر جدید کامل کنید. این صفحه به طور خودکار به روز می شود.',
certificateFileInvalid: 'یک فایل گواهی معتبر با فرمت PEM، CRT یا CER انتخاب کنید.',
configured: 'پیکربندی شده',
configurationFailedHelper:
'آزمایش ناموفق بود. صفحه فقط خطای بومی‌سازی‌شده بازگشتی از بک‌اند را نمایش می‌دهد.',
configurationNotTested: 'پیکربندی فعلی آزمایش نشده است.',
configurationPassed: 'پیکربندی فعلی بررسی‌های امنیتی و قابلیت را پشت سر گذاشت.',
configurationStaleHelper: 'تنظیمات حساس به احراز هویت تغییر کرد. دوباره پیش نویس فعلی را تست کنید.',
configurationTestSuccess: 'تست پیکربندی SAML2 با موفقیت انجام شد.',
configurationTesting: 'آزمایش پیکربندی فعلی SAML2…',
conflictLDAP: 'کاربر LDAP',
conflictLocal: 'کاربر محلی',
conflictNone: 'بدون درگیری',
conflictOIDC: 'هویت دیگر OIDC',
conflictSAML2: 'هویت SAML2 دیگر',
conflictType: 'نوع تضاد',
credentialFileReadFailed: 'فایل اطلاعات اعتبارسنجی قابل خواندن نیست.',
credentialFileTooLarge: 'حجم فایل‌های اطلاعات اعتبارسنجی نباید از 256 KiB بیشتر باشد.',
credentialsRequired: 'کلید خصوصی و گواهی SP را پیکربندی کنید.',
defaultRole: 'نقش کاربر جدید',
defaultRoleHelper:
'فقط هنگام ایجاد اولیه اختصاص می‌یابد؛ ورودهای بعدی نقش‌ها، MFA و مجوزهای محلی را حفظ می‌کنند.',
defaultRolePlaceholder: 'یک نقش را انتخاب کنید',
defaultRoleRequired: 'یک نقش پیش فرض معتبر انتخاب کنید.',
disableConfirm:
'غیرفعال کردن SAML2 بلافاصله ورودهای جدید را رد و نشست‌های کاربران آن را بی‌اعتبار می‌کند. ادامه می‌دهید؟',
disableDiscardConfirm:
'غیرفعال کردن SAML2 سایر تغییرات ذخیره‌نشده این صفحه را کنار می‌گذارد و بلافاصله نشست‌های کاربران آن را بی‌اعتبار می‌کند. ادامه می‌دهید؟',
disableTitle: 'SAML2 را غیرفعال کنید',
disabled: 'غیرفعال',
enable: 'فعال‌سازی',
enabled: 'فعال',
idpMetadata: 'فراداده IdP',
idpMetadataDesc: 'یک URL وارد کنید یا XML را بچسبانید. اگر هر دو موجود باشند URL اولویت دارد.',
keepExistingRole: 'نقش های موجود و مجوزهای محلی را حفظ کنید',
loginWith: 'ورود با {provider}',
mappingResult: 'نتیجه نقشه برداری',
metadataRequired: 'URL یا XML فراداده IdP را وارد کنید.',
metadataURLHelper: 'بخش پشتیبان هنگام آزمایش و ذخیره، فراداده را دانلود و اعتبارسنجی می‌کند.',
metadataURLInvalid: 'یک URL فراداده HTTPS معتبر و بدون اطلاعات ورود یا قطعه وارد کنید.',
metadataURLRecommended: 'URL فراداده (پیشنهادی)',
metadataXML: 'XML فراداده',
metadataXMLHelper: 'وقتی IdP یک URL فراداده در دسترس ارائه نمی‌کند از این گزینه استفاده کنید.',
metadataXMLInvalid: 'XML فراداده EntityDescriptor معتبری وارد کنید.',
metadataXMLPlaceholder: '<EntityDescriptor>...</EntityDescriptor> را جای‌گذاری کنید',
nameAttribute: 'ویژگی نام کاربری',
nameAttributeHelper:
'این ویژگی را از SAML Assertion تأییدشده می‌خواند و به نام کاربری 1Panel نگاشت می‌کند.',
nameAttributePlaceholder: 'برای مثال: uid، username یا account',
nameAttributeRequired: 'ویژگی نام کاربری را وارد کنید.',
notConfigured: 'پیکربندی نشده',
or: 'یا',
pageDesc: 'ورود یکپارچه سازمانی را از طریق فراداده IdP با تنظیمات رایج در یک صفحه متصل کنید.',
plannedHandling: 'جابجایی برنامه ریزی شده',
privateKeyFileInvalid: 'یک فایل کلید خصوصی PEM معتبر انتخاب کنید.',
recentTestSuccess: 'آخرین آزمایش موفق: {0}',
restore: 'بازیابی',
restored: 'آخرین تنظیمات ذخیره شده SAML2 بازیابی شدند.',
roleHandling: 'رسیدگی به نقش',
rolesLoadFailed: 'نقش ها بارگیری نشدند. قبل از انتخاب نقش پیش فرض، دوباره امتحان کنید.',
selectFile: 'انتخاب فایل',
serviceStatus: 'وضعیت سرویس',
serviceStatusDesc: 'پیکربندی فعلی باید پیش از فعال‌سازی SAML2 آزمایش را با موفقیت بگذراند.',
settingLoadFailed: 'تنظیمات SAML2 بارگیری نشد',
settingLoadFailedHelper:
'فرم قفل شده است تا از ذخیره یک پیکربندی پیش فرض خالی روی تنظیمات فعلی جلوگیری شود. پس از بازیابی اتصال دوباره سعی کنید.',
spCertificate: 'گواهی SP',
spCertificateHelper:
'در فراداده SP منتشر می‌شود تا IdP بتواند درخواست‌های ورود و خروج را تأیید کند.',
spCredentials: 'کلید خصوصی و گواهی SP',
spCredentialsDesc:
'برای امضای پیام‌های ورود و خروج استفاده می‌شود. سیاست امضا و اعتبارسنجی در بخش پشتیبان ثابت است.',
spPrivateKey: 'کلید خصوصی SP',
spPrivateKeyHelper:
'برای امضای AuthnRequest و پیام‌های خروج استفاده می‌شود. در حالت ذخیره رمزنگاری شده و هرگز نمایش داده نمی‌شود.',
syncLogout: 'خروج همگام',
syncLogoutHelper: 'خروج از 1Panel یا ارائه‌دهنده هویت، نشست سمت دیگر را نیز خاتمه می‌دهد.',
testBeforeBrowserTest: 'قبل از شروع تست ورود به مرورگر، پیکربندی فعلی را آزمایش کنید.',
testBeforeEnable: 'قبل از فعال کردن یا ذخیره تغییرات حساس، پیکربندی فعلی را آزمایش کنید.',
testConfiguration: 'آزمایش پیکربندی',
unsavedChanges: 'تغییرات ذخیره‌نشده SAML2 وجود دارد.',
usedAttribute: 'نگاشت نام کاربری',
usersAndRoles: 'کاربران و نقش‌ها',
usersAndRolesDesc:
'نگاشت نام کاربری پنل و گره و نقش پیش‌فرض مورد استفاده برای ایجاد کاربر در نخستین ورود را تنظیم کنید.',
},
ldap: {
basic: 'تنظیمات پایه',
loginTitle: 'ورود LDAP',
loginWith: 'ورود با LDAP',
backToLocalLogin: 'بازگشت به ورود پنل',
enable: 'فعال کردن',
enabled: 'فعال شد',
disabled: 'غیرفعال',
@@ -4931,7 +5332,7 @@ const message = {
strictSyncTooltip:
'پس از وارد کردن کامل، کاربرانی که از این منبع LDAP غایب هستند غیرفعال می شوند اما حذف نمی شوند.',
strictSyncHelper:
'فقط برای یک واردات کامل کامل اعمال می شود. وارد کردن کاربران انتخابی هرگز سایر کاربران را غیرفعال نمی کند.',
'فقط برای یک واردات کامل اعمال میشود. وارد کردن کاربران انتخابی هرگز سایر کاربران را غیرفعال نمیکند.',
skipTLSVerify: 'رد شدن از تأیید TLS',
skipTLSVerifyTooltip: 'تأیید گواهی را برای اتصالات LDAPS غیرفعال کنید.',
skipTLSVerifyHelper:
@@ -4986,7 +5387,7 @@ const message = {
defaultRoleHelper: 'فقط برای کاربران ایجاد شده توسط همگام سازی برنامه ریزی شده اعمال می شود.',
defaultRoleRequired: 'نقشی را برای کاربران جدید LDAP انتخاب کنید.',
strictSyncHelper:
'کاربرانی که از یک پرس و جو کامل کامل غایب هستند غیرفعال می شوند و جلسات آنها پاک می شود. کاربران، نقش‌ها و مجوزها حذف نمی‌شوند.',
'کاربرانی که در یک پرس‌وجوی کامل وجود ندارند غیرفعال میشوند و نشست‌های آنها پاک میشود. کاربران، نقش‌ها و مجوزها حذف نمی‌شوند.',
safetyTitle: 'کاربران گمشده فقط پس از یک پرس و جو کامل LDAP پردازش می شوند',
safetyDescription:
'پرس و جو ناموفق، مهلت زمانی، یا نتیجه صفحه ناقص هرگز وضعیت کاربر را تغییر نمی دهد. محدوده همگام سازی از نگاشت کاربر Base DN، فیلتر و ویژگی پیروی می کند.',
@@ -4999,7 +5400,7 @@ const message = {
saveBeforeRun: 'قبل از اجرای کار، تنظیمات همگام سازی را ذخیره کنید.',
runConfirmTitle: 'همگام سازی دقیق را اجرا کنید',
runConfirmDescription:
'کاربران LDAP که یک پرس و جو کامل کامل ندارند غیرفعال می شوند و جلسات فعال آنها پاک می شود. ادامه دهید؟',
'کاربران LDAP که در یک پرس‌وجوی کامل وجود ندارند غیرفعال میشوند و نشست‌های فعال آنها پاک میشود. ادامه دهید؟',
runSuccess: 'همگام سازی LDAP تکمیل شد.',
weekdays: {
0: 'یکشنبه',
@@ -5118,6 +5519,7 @@ const message = {
deleteConfirm: 'این سابقه و فایل خروجی حذف شود؟',
},
waf: {
WAF: 'WAF',
name: 'WAF',
blackWhite: 'لیست سیاه و سفید',
globalSetting: 'تنظیمات جهانی',
@@ -5178,7 +5580,9 @@ const message = {
geoRule: 'محدودیت دسترسی منطقه‌ای',
geoHelper:
'دسترسی به وب‌سایت خود را از برخی مناطق محدود کنید، مثلاً: اگر دسترسی از سرزمین اصلی چین مجاز است، درخواست‌های خارج از سرزمین اصلی چین مسدود می‌شوند',
regionPolicy: 'سیاست منطقه',
provincePolicy: 'سیاست استان',
provinceRuleLabel: 'استان',
openRestyFeatureVersionAlert: 'برای فعال شدن {0}، نسخه OpenResty باید جدیدتر از 1.31.1.1-0 باشد.',
ipLocation: 'مکان IP',
ipLocationSearchHelper: 'موقعیت IP را وارد کنید؛ جست‌وجوی تقریبی پشتیبانی می‌شود',
@@ -5213,6 +5617,7 @@ const message = {
fileExtHelper: 'پسوندهای فایل ممنوع برای آپلود',
deny: 'ممنوع',
allow: 'مجاز',
allowOnly: 'فقط مجاز',
field: 'شیء',
pattern: 'شرط',
ruleContent: 'محتوا',
@@ -5383,9 +5788,11 @@ const message = {
protectionMode: 'حالت محافظت',
observationMode: 'حالت مشاهده',
standardMode: 'حالت استاندارد',
observationModeHelper: 'درخواست‌ها را بدون مسدود کردن شناسایی و ثبت می‌کند',
observationModeConfirm:
'در حالت مشاهده، تمام موارد منطبق WAF فقط ثبت می‌شوند و درخواست‌ها مسدود نمی‌شوند. ادامه می‌دهید؟',
globalStrictRequired: 'ابتدا حالت سخت‌گیرانه را در تنظیمات سراسری فعال کنید',
observe: 'مشاهده',
websiteSearchHelper: 'دامنه، نام مستعار یا توضیحات وب‌سایت را وارد کنید',
configReadFailed: 'بارگذاری پیکربندی ناموفق بود',
detailSetting: 'تنظیمات دقیق',
@@ -5724,6 +6131,13 @@ const message = {
nodeUpgradePackageCleanHelper: 'همه بسته‌های به‌روزرسانی نسخه پایین‌تر پاک‌سازی می‌شوند. ادامه می‌دهید؟',
nodeUpgradeOfflinePackageHelper:
'در محیط‌های آفلاین، گره‌های با معماری‌های مختلف باید قبل از به‌روزرسانی، بسته به‌روزرسانی متناسب را آپلود کنند.',
healthCheck: 'بررسی سلامت',
healthCheckFrequency: 'دوره بررسی',
healthCheckFrequencyHelper:
'سلامت گره‌های پشتیبان را به‌صورت دوره‌ای بررسی می‌کند. برای غیرفعال‌سازی، ۰ را وارد کنید.',
healthCheckFrequencyLimit: 'دوره بررسی نباید بیش از یک روز باشد و باید یک عدد صحیح نامنفی باشد.',
loadFailedNodeResources: 'بارگیری منابع گره‌های ناموفق',
loadFailedNodeResourcesHelper: 'هنگام باز کردن فهرست گره‌ها، اطلاعات منابع گره‌های ناموفق نیز بارگیری شود.',
nodeUnhealthy: 'وضعیت گره غیرعادی',
deletedNode: 'گره حذف شده {0} در حال حاضر از عملیات ارتقاء پشتیبانی نمی‌کند!',
nodeUnhealthyHelper:
@@ -6211,35 +6625,34 @@ const message = {
cpu: 'CPU',
memory: 'حافظه',
disk: 'دیسک',
overview: 'Overview',
kvmUnavailable: 'No available KVM hardware virtualization capability was detected.',
kvmCheckCpu: 'Confirm that the host CPU supports Intel VT-x or AMD-V virtualization.',
kvmCheckBios: 'Enable virtualization options in BIOS/UEFI.',
kvmCheckModule: 'Confirm that the kvm, kvm_intel, or kvm_amd kernel module is loaded correctly.',
kvmCheckDevice:
'Confirm that /dev/kvm exists and the current environment is not a container or cloud host without KVM support.',
abnormal: 'Abnormal',
resourceOverview: 'Resource Overview',
cpuAllocated: 'CPU Allocated',
memoryAllocated: 'Memory Allocated',
storageUsed: 'Storage Used',
riskReminder: 'Risk Reminders',
noRisk: 'No risks',
runtimeHealth: 'Runtime Health',
runtimeAbnormal: 'VM runtime is abnormal',
noDependency: 'No dependency check data',
storageOverview: 'Storage Overview',
totalAllocated: 'Calculated by total VM configuration',
runningAllocated: 'Running allocation: {0}',
storageAvailable: 'Available: {0}',
inProgress: 'In progress',
needAttention: 'Needs attention',
normal: 'Normal',
environmentRisk: 'The VM runtime is not ready. Fix dependencies or virtualization services.',
storageRisk: 'Storage pool {0} usage has reached {1}%.',
abnormalRisk: '{0} VMs are in an abnormal state.',
pausedRisk: '{0} VMs are paused.',
memoryRisk: 'VM memory allocation has reached {0}%.',
overview: 'نمای کلی',
kvmUnavailable: 'هیچ قابلیت مجازی‌سازی سخت‌افزاری KVM در دسترس شناسایی نشد.',
kvmCheckCpu: 'بررسی کنید CPU میزبان از مجازی‌سازی Intel VT-x یا AMD-V پشتیبانی می‌کند.',
kvmCheckBios: 'گزینه‌های مجازی‌سازی را در BIOS/UEFI فعال کنید.',
kvmCheckModule: 'بررسی کنید ماژول کرنل kvm، kvm_intel یا kvm_amd به‌درستی بارگذاری شده است.',
kvmCheckDevice: 'بررسی کنید /dev/kvm وجود دارد و محیط فعلی کانتینر یا میزبان ابری فاقد پشتیبانی KVM نیست.',
abnormal: 'غیرعادی',
resourceOverview: 'نمای کلی منابع',
cpuAllocated: 'CPU تخصیص‌یافته',
memoryAllocated: 'حافظه تخصیص‌یافته',
storageUsed: 'فضای ذخیره‌سازی استفاده‌شده',
riskReminder: 'هشدارهای خطر',
noRisk: 'بدون خطر',
runtimeHealth: 'سلامت محیط اجرا',
runtimeAbnormal: 'محیط اجرای VM غیرعادی است',
noDependency: 'داده‌ای از بررسی وابستگی‌ها وجود ندارد',
storageOverview: 'نمای کلی فضای ذخیره‌سازی',
totalAllocated: 'بر اساس مجموع پیکربندی VMها محاسبه شده است',
runningAllocated: 'تخصیص در حال اجرا: {0}',
storageAvailable: 'در دسترس: {0}',
inProgress: 'در حال انجام',
needAttention: 'نیازمند توجه',
normal: 'عادی',
environmentRisk: 'محیط اجرای VM آماده نیست. وابستگی‌ها یا سرویس‌های مجازی‌سازی را اصلاح کنید.',
storageRisk: 'استفاده از مخزن ذخیره‌سازی {0} به {1}% رسیده است.',
abnormalRisk: '{0} ماشین مجازی در وضعیت غیرعادی هستند.',
pausedRisk: '{0} ماشین مجازی متوقف موقت هستند.',
memoryRisk: 'تخصیص حافظه ماشین‌های مجازی به {0}% رسیده است.',
cpuLimitHelper: 'CPU در حال حاضر در دسترس: {0} هسته',
cpuLimitExceeded: 'CPU از حد مجاز بیشتر است. حداکثر فعلی قابل استفاده: {0} هسته.',
memoryLimitHelper: 'حافظه قابل تخصیص فعلی: {0} (میزبان باید {1} حافظه رزرو کند)',
@@ -6326,7 +6739,9 @@ const message = {
currentSnapshot: 'فعلی',
snapshotEmpty: 'اسنپ‌شاتی وجود ندارد',
snapshotHelper:
'A snapshot saves the current VM state as a restore point. Subsequent data changes are recorded in a delta file without changing the original disk. Restoring a snapshot returns the VM to that point in time.',
'اسنپ‌شات وضعیت فعلی VM را به‌عنوان نقطه بازیابی ذخیره می‌کند. تغییرات بعدی بدون تغییر دیسک اصلی در یک فایل دلتا ثبت می‌شوند. بازیابی اسنپ‌شات، VM را به همان زمان بازمی‌گرداند.',
snapshotOperationHelper:
'اسنپ‌شات فعلی قابل حذف نیست. بازیابی اسنپ‌شات فقط زمانی ممکن است که ماشین مجازی خاموش باشد.',
snapshotRecoverConfirm:
'ماشین مجازی [{1}] به اسنپ‌شات [{0}] بازیابی شود؟ پس از بازیابی، دیسک ماشین مجازی به وضعیت آن اسنپ‌شات برمی‌گردد.',
interface: 'رابط شبکه',

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -167,6 +167,7 @@ const message = {
deleteSuccess: 'ລຶບສຳເລັດແລ້ວ',
loginSuccess: 'ເຂົ້າສູ່ລະບົບສຳເລັດແລ້ວ',
operationSuccess: 'ດຳເນີນການສຳເລັດແລ້ວ',
operationFailed: 'ດຳເນີນການລົ້ມເຫຼວ',
copySuccess: 'ຄັດລອກສຳເລັດແລ້ວ',
notSupportOperation: 'ບໍ່ຮອງຮັບການດຳເນີນການນີ້',
requestTimeout: 'ການຮ້ອງຂໍໝົດເວລາ, ກະລຸນາລອງໃໝ່ພາຍຫຼັງ',
@@ -209,6 +210,7 @@ const message = {
username: 'ຊື່ຜູ້ໃຊ້',
password: 'ລະຫັດຜ່ານ',
passkey: 'ເຂົ້າສູ່ລະບົບດ້ວຍ Passkey',
otherLoginMethods: 'ວິທີເຂົ້າລະບົບອື່ນ',
welcome: 'ຍິນດີຕ້ອນຮັບກັບຄືນ. ເຂົ້າສູ່ລະບົບດ້ວຍຊື່ຜູ້ໃຊ້ ແລະ ລະຫັດຜ່ານຂອງທ່ານ.',
errorAuthInfo: 'ຊື່ຜູ້ໃຊ້ ຫຼື ລະຫັດຜ່ານບໍ່ຖືກຕ້ອງ, ກະລຸນາລອງໃໝ່.',
errorMfaInfo: 'ຂໍ້ມູນການຢືນຢັນຕົວຕົນບໍ່ຖືກຕ້ອງ, ກະລຸນາລອງໃໝ່.',
@@ -475,7 +477,7 @@ const message = {
cpuSteal: 'Steal',
cpuTop: '5 ອັນດັບໂປຣເຊສທີ່ໃຊ້ CPU ສູງສຸດ',
memTop: '5 ອັນດັບໂປຣເຊສທີ່ໃຊ້ໜ່ວຍຄວາມຈຳສູງສຸດ',
loadAverage: 'ພາລະສະເລ່ຍໃນ 1 ນາທີຜ່ານມາ | ພາລະສະເລ່ຍໃນ {n} ນາທີຜ່ານມາ',
loadAverage: 'ພາລະສະເລ່ຍໃນ 1 ນາທີຜ່ານມາ | ພາລະສະເລ່ຍໃນ {0} ນາທີຜ່ານມາ',
load: 'ພາລະ',
mount: 'ຈຸດເຊື່ອມຕໍ່ (Mount point)',
fileSystem: 'ລະບົບໄຟລ໌',
@@ -584,8 +586,8 @@ const message = {
mongodbPermissionUserAdmin: 'ຜູ້ຈັດການຜູ້ໃຊ້',
pgUserHelper: 'ໃຊ້ບັນຊີຊຸບເປີຢູເຊີຂອງຖານຂໍ້ມູນ.',
ssl: 'ໃຊ້ SSL',
clientKey: 'Client private key',
clientCert: 'Client certificate',
clientKey: 'ກະແຈສ່ວນຕົວຂອງ Client',
clientCert: 'ໃບຢັ້ງຢືນຂອງ Client',
caCert: 'CA certificate',
hasCA: 'ມີໃບຢັ້ງຢືນ CA',
skipVerify: 'ຂ້າມການກວດສອບໃບຢັ້ງຢືນ',
@@ -611,11 +613,11 @@ const message = {
threadCacheHitHelper: 'ຫາກຕ່ຳເກີນໄປ, ໃຫ້ເພີ່ມ "thread_cache_size".',
indexHit: 'Index hit',
indexHitHelper: 'ຫາກຕ່ຳເກີນໄປ, ໃຫ້ເພີ່ມ "key_buffer_size".',
innodbIndexHit: 'Innodb index hit rate',
innodbIndexHit: 'ອັດຕາການຈັບຄູ່ດັດຊະນີ Innodb',
innodbIndexHitHelper: 'ຫາກຕ່ຳເກີນໄປ, ໃຫ້ເພີ່ມ "innodb_buffer_pool_size".',
cacheHit: 'Query cache hit rate',
cacheHit: 'ອັດຕາການຈັບຄູ່ Query cache',
cacheHitHelper: 'ຫາກຕ່ຳເກີນໄປ, ໃຫ້ເພີ່ມ "query_cache_size".',
tmpTableToDB: 'Temporary table to disk',
tmpTableToDB: 'ຕາຕະລາງຊົ່ວຄາວໄປຍັງດິສກ໌',
tmpTableToDBHelper: 'ຫາກໃຫຍ່ເກີນໄປ, ໃຫ້ເພີ່ມ "tmp_table_size".',
openTables: 'Open tables',
openTablesHelper: 'ຄ່າການຕັ້ງຄ່າຂອງ "table_open_cache" ຕ້ອງຫຼາຍກວ່າ ຫຼື ເທົ່າກັບຄ່ານີ້.',
@@ -722,8 +724,6 @@ const message = {
appVersion: 'ເວີຊັນແອັບ',
webuiPort: 'ພອດ WebUI',
tokenOrAuth: 'Token/ຊື່ຜູ້ໃຊ້ ແລະ ລະຫັດຜ່ານ',
dashboardUsername: 'ຊື່ຜູ້ໃຊ້ Dashboard',
dashboardPassword: 'ລະຫັດຜ່ານ Dashboard',
allowedOrigins: 'ທີ່ຢູ່ການເຂົ້າເຖິງ',
allowedOriginsRequired: 'ປ້ອນທີ່ຢູ່ການເຂົ້າເຖິງຢ່າງໜ້ອຍໜຶ່ງບ່ອນ',
allowedOriginsInvalid: 'ໃຊ້ຮູບແບບ http(s)://host-or-ip[:port]',
@@ -798,7 +798,7 @@ const message = {
versionUnsupportedHelper: 'ກະລຸນາອັບເກຣດ OpenClaw ເປັນເວີຊັນ {0} ຫຼື ສູງກວ່າ.',
skillsGroupBuiltIn: 'ມາພ້ອມກັບລະບົບ',
skillsGroupExternal: 'ພາຍນອກ',
skillsGroupWorkspace: 'Workspace',
skillsGroupWorkspace: 'ພື້ນທີ່ເຮັດວຽກ',
switchModelSuccess: 'ປ່ຽນໂມເດວສຳເລັດແລ້ວ',
channelsTab: 'ຊ່ອງທາງ',
agentRoleTab: 'ຕົວແທນ',
@@ -808,16 +808,12 @@ const message = {
roleMarkdownDescriptions: {
'AGENTS.md': [
'ຄຳແນະນຳການເຮັດວຽກຂອງຕົວແທນ ແລະ ວິທີການໃຊ້ໜ່ວຍຄວາມຈຳ.',
'ໂຫຼດເມື່ອເລີ່ມທຸກເຊດຊັນ.',
'ບ່ອນທີ່ດີສຳລັບກົດເກນ, ລຳດັບຄວາມສຳຄັນ ແລະ ລາຍລະອຽດ "ວິທີການສະແດງອອກ".',
],
'SOUL.md': ['ຕົວຕົນ, ນ້ຳສຽງ ແລະ ຂອບເຂດ.', 'ໂຫຼດໃນທຸກເຊດຊັນ.'],
'USER.md': ['ຜູ້ໃຊ້ແມ່ນໃຜ ແລະ ຄວນເອີ້ນພວກເຂົາແນວໃດ.', 'ໂຫຼດໃນທຸກເຊດຊັນ.'],
'IDENTITY.md': ['ຊື່ຂອງຕົວແທນ, ບຸກຄະລິກ ແລະ ອີໂມຈິ.', 'ສ້າງ ຫຼື ອັບເດດໃນລະຫວ່າງຂັ້ນຕອນ bootstrap.'],
'TOOLS.md': [
'ໝາຍເຫດກ່ຽວກັບເຄື່ອງມືທ້ອງຖິ່ນ ແລະ ຂໍ້ຕົກລົງຕ່າງໆ.',
'ບໍ່ໄດ້ຄວບຄຸມການມີຢູ່ຂອງເຄື່ອງມື; ເປັນພຽງຄຳແນະນຳເທົ່ານັ້ນ.',
],
'SOUL.md': ['ຕົວຕົນ, ນ້ຳສຽງ ແລະ ຂອບເຂດ.'],
'USER.md': ['ຜູ້ໃຊ້ແມ່ນໃຜ ແລະ ຄວນເອີ້ນພວກເຂົາແນວໃດ.'],
'IDENTITY.md': ['ຊື່ຂອງຕົວແທນ, ບຸກຄະລິກ ແລະ ອີໂມຈິ.'],
'TOOLS.md': ['ໝາຍເຫດກ່ຽວກັບເຄື່ອງມືທ້ອງຖິ່ນ ແລະ ຂໍ້ຕົກລົງຕ່າງໆ.'],
'HEARTBEAT.md': [
'ລາຍການກວດສອບສຳລັບການເຮັດວຽກແບບ heartbeat (ເລືອກໄດ້).',
'ຄວນຂຽນໃຫ້ສັ້ນເພື່ອປະຢັດ token.',
@@ -826,11 +822,7 @@ const message = {
'ລາຍການກວດສອບຕອນເລີ່ມຕົ້ນລະບົບ ເມື່ອ gateway ຣີສະຕາດ (ເລືອກໄດ້).',
'ຄວນຂຽນໃຫ້ສັ້ນ; ໃຊ້ເຄື່ອງມືຂໍ້ຄວາມສຳລັບການສົ່ງອອກ.',
],
'BOOTSTRAP.md': [
'ຂັ້ນຕອນການເລີ່ມຕົ້ນຄັ້ງທຳອິດ.',
'ສ້າງສະເພາະ workspace ໃໝ່ເທົ່ານັ້ນ.',
'ລຶບອອກຫຼັງຈາກຂັ້ນຕອນສຳເລັດ.',
],
'BOOTSTRAP.md': ['ຂັ້ນຕອນການເລີ່ມຕົ້ນຄັ້ງທຳອິດ.', 'ສ້າງສະເພາະ workspace ໃໝ່ເທົ່ານັ້ນ.'],
},
duplicateBinding: 'ການລວມກັນຂອງຊ່ອງທາງ ແລະ ID ບັນຊີ ຕ້ອງບໍ່ຊ້ຳກັນ',
accountIdOptional: 'ID ບັນຊີ (ເລືອກໄດ້)',
@@ -862,7 +854,7 @@ const message = {
feishu: 'Feishu',
pluginNotInstalled: 'ຍັງບໍ່ໄດ້ຕິດຕັ້ງປລັກອິນ. ກະລຸນາຕິດຕັ້ງກ່ອນ.',
dmPolicy: 'ນະໂຍບາຍ DM',
threadSession: 'Thread Session',
threadSession: 'ເຊດຊັນເທຣດ',
replyMode: 'ໂໝດການຕອບກັບ',
requireMention: 'ຕ້ອງມີການກ່າວເຖິງ (Mention)',
requireMentionTrue: "ຕ້ອງ {'@'}",
@@ -880,11 +872,11 @@ const message = {
botDuplicateField: '{field} ມີຢູ່ແລ້ວ',
botRequired: 'ເພີ່ມຢ່າງໜ້ອຍໜຶ່ງບັອດ',
botId: 'ID ບັອດ',
allowFrom: 'DM Allowlist',
allowFrom: 'ລາຍຊື່ອະນຸຍາດ DM',
allowFromPlaceholder: 'ໜຶ່ງ ID ຜູ້ສົ່ງຕໍ່ແຖວ',
allowlistPolicyHelper: '{0}. ໃຊ້ສະເພາະເມື່ອ {1} ເປັນ Allowlist.',
systemPrompt: 'System Prompt',
groupAllowFrom: 'Group Allowlist',
systemPrompt: 'ຄຳສັ່ງລະບົບ',
groupAllowFrom: 'ລາຍຊື່ອະນຸຍາດກຸ່ມ',
groupAllowFromPlaceholder: 'ໜຶ່ງ ID ກຸ່ມຕໍ່ແຖວ',
separateSessionByConversation: 'ແຍກເຊດຊັນຕາມການສົນທະນາ',
groupSessionScope: 'ຂອບເຂດເຊດຊັນກຸ່ມ',
@@ -894,7 +886,7 @@ const message = {
asyncMode: 'ໂໝດ Async',
ackText: 'ຂໍ້ຄວາມຮັບຊາບ (Ack Text)',
ackTextDefault: 'ໄດ້ຮັບໜ້າວຽກແລ້ວ, ກຳລັງດຳເນີນການ...',
streaming: 'Streaming',
streaming: 'ການສົ່ງແບບສະຕຣີມ',
streamingOff: 'ປິດ',
streamingPartial: 'ບາງສ່ວນ',
streamingBlock: 'ຂັດຂວາງ (Blocking)',
@@ -913,7 +905,6 @@ const message = {
dashboardAuthAutoRebuildHelper:
'ການບັນທຶກຊື່ຜູ້ໃຊ້ ຫຼື ລະຫັດຜ່ານ Dashboard ຈະສ້າງຄອນເທນເນີໃໝ່ອັດຕະໂນມັດເພື່ອໃຫ້ການປ່ຽນແປງມີຜົນ.',
channelDeleteConfirm: 'ລຶບການຕັ້ງຄ່າຊ່ອງທາງ {0}?',
customProviderHelper: 'ຜູ້ໃຫ້ບໍລິການແບບກຳນົດເອງຈະບໍ່ກວດສອບວ່າບັນຊີສາມາດໃຊ້ງານໄດ້ຫຼືບໍ່.',
apiTypeBaseURLHelper: 'ປະເພດນີ້ຈະສົ່ງການຮ້ອງຂໍໄປທີ່ {0}. Base URL ທີ່ແນະນຳ: {1}',
customImageURLHelper:
'ສຳລັບບັນຊີ Custom ໃຫ້ປ້ອນ URL ຂອງ endpoint ສ້າງຮູບທີ່ຄົບຖ້ວນ. ລະບົບຈະບໍ່ເພີ່ມ path ອັດຕະໂນມັດ. ຕົວຢ່າງ: {0}',
@@ -942,7 +933,7 @@ const message = {
modelDir: 'ໄດເຣັກທໍຣີໂມເດວ',
manualDownload: 'ດາວໂຫຼດດ້ວຍຕົນເອງ',
modelSource: 'ແຫຼ່ງທີ່ມາໂມເດວ',
repoID: 'Repository ID',
repoID: 'ID ຄັງເກັບ',
endpointLabel: 'ຈຸດເຊື່ອມຕໍ່ (Endpoint) {0}',
acceleratedEndpointLabel: 'ຈຸດເຊື່ອມຕໍ່ເລັ່ງຄວາມໄວ {0}',
tokenOptionalLabel: '{0} Token (ເລືອກໄດ້)',
@@ -1025,7 +1016,7 @@ const message = {
'ການປ່ຽນໂປຣໂຕຄອນບໍ່ຮັບປະກັນວ່າຈະບໍ່ສູນເສຍຂໍ້ມູນ. ຟິວສະເພາະ, ການເອີ້ນໃຊ້ເຄື່ອງມື, ການໃຫ້ເຫດຜົນ ຫຼືເນື້ອຫາຫຼາຍຮູບແບບອາດຖືກຫຼຸດຄຸນນະພາບ ຫຼືສູນເສຍ. ກະລຸນາພິຈາລະນາຄວາມສ່ຽງກ່ອນນຳໃຊ້.',
lbPolicyRoundRobin: 'Round Robin',
lbPolicyRoundRobinDesc: 'ເລືອກບັນຊີໂມເດວຕາມລຳດັບ. ໃຊ້ເມື່ອລະບົບຫຼັງບ້ານມີຄວາມສາມາດໃກ້ຄຽງກັນ.',
lbPolicyWeightedRoundRobin: 'Weighted Round Robin',
lbPolicyWeightedRoundRobin: 'Round Robin ແບບຖ່ວງນ້ຳໜັກ',
lbPolicyWeightedRoundRobinDesc:
'ກະຈາຍການຮ້ອງຂໍຕາມນ້ຳໜັກຂອງບັນຊີໂມເດວ. ນ້ຳໜັກສູງກວ່າຈະໄດ້ຮັບ traffic ຫຼາຍກວ່າ.',
lbPolicyFailover: 'Failover',
@@ -1051,10 +1042,11 @@ const message = {
requestBodyLogIndexPrefix: 'ຄຳນຳໜ້າ Index',
requestBodyLogRetentionDays: 'ໄລຍະການເກັບຮັກສາລັອກ Request Body (ມື້)',
requestBodyLogMaxBodyKb: 'ຂະໜາດ Request Body ສູງສຸດ (KB)',
requestBody: 'Request Body',
requestBody: 'ເນື້ອຫາຄຳຮ້ອງຂໍ',
requestBodySize: 'ຂະໜາດ Request Body',
requestBodyTruncated: 'ຖືກຕັດບາງສ່ວນ',
responseBody: 'Response Body',
requestBodyHash: 'Hash ຂອງ Request Body',
responseBody: 'ເນື້ອຫາຄຳຕອບ',
responseBodySize: 'ຂະໜາດ Response Body',
responseBodyTruncated: 'Response Body ຖືກຕັດບາງສ່ວນ',
readableContent: 'ເນື້ອໃນທີ່ອ່ານໄດ້',
@@ -1067,7 +1059,7 @@ const message = {
statusMessage: 'ຂໍ້ຄວາມສະຖານະ',
esLogDropped: 'ລັອກ ES ທີ່ຖືກຖິ້ມ',
esLogLastSuccessAt: 'ການຂຽນ ES ລ່າສຸດ',
esLogCircuitOpen: 'Circuit Open',
esLogCircuitOpen: 'ຕົວຕັດວົງຈອນເປີດ',
esLogCircuitUntil: 'ES Circuit ຈົນເຖິງ',
serviceOperateConfirm: 'ຢືນຢັນທີ່ຈະ {0} ບໍລິການ AI Gateway?',
deleteTargetConfirm: 'ລຶບ {0} {1}?',
@@ -1090,10 +1082,10 @@ const message = {
percent: 'ເປີເຊັນ',
ranking: 'ການຈັດອັນດັບ',
rank: 'ອັນດັບ',
promptToken: 'Prompt Tokens',
completionToken: 'Completion Tokens',
promptToken: 'Token ຂອງ Prompt',
completionToken: 'Token ຂອງ Completion',
totalToken: 'Token ທັງໝົດ',
cachedToken: 'Cached Tokens',
cachedToken: 'Token ທີ່ແຄດໄວ້',
cacheHitRate: 'ອັດຕາການພົບ Cache',
activeUsers: 'ຜູ້ໃຊ້ທີ່ເຄື່ອນໄຫວ',
activeModels: 'ໂມເດວທີ່ເຄື່ອນໄຫວ',
@@ -1117,8 +1109,6 @@ const message = {
healthUnknown: 'ບໍ່ຮູ້ຈັກ',
validationModelMapEmpty: 'ຊື່ການຈັບຄູ່ໂມເດວບໍ່ສາມາດຫວ່າງໄດ້',
validationModelMapDuplicate: 'ໂມເດວທີ່ຮ້ອງຂໍ {0} ຊ້ຳກັນ',
validateAvailability: 'ກວດສອບການພ້ອມໃຊ້ງານຂອງບັນຊີ',
validateAvailabilityHelper: 'ສົ່ງຂໍ້ຄວາມຂະໜາດນ້ອຍກ່ອນບັນທຶກເພື່ອຢືນຢັນການໃຊ້ງານ API',
modelGroup: 'ກຸ່ມໂມເດວ',
modelCapability: 'ຄວາມສາມາດຂອງໂມເດວ',
textGeneration: 'ການສ້າງຂໍ້ຄວາມ',
@@ -1152,7 +1142,7 @@ const message = {
matchedGroups: 'ກຸ່ມທີ່ກົງກັນ',
importResult: 'ນຳເຂົ້າແລ້ວ {0}, ຊ້ຳກັນ {1}, ບໍ່ຖືກຕ້ອງ {2}',
auditLogs: 'ບັນທຶກການກວດສອບ',
smartRoute: 'Smart Route',
smartRoute: 'ການຈັດເສັ້ນທາງອັດສະລິຍະ',
smartRouteGuideTitle: 'ໃຊ້ model=auto ຢູ່ Client ເພື່ອເຂົ້າ Smart Route',
smartRouteGuideReady:
'model=auto ຈະເລືອກຈາກກຸ່ມໂມເດວແບບງ່າຍ ຫຼື ຊັບຊ້ອນຕາມຄວາມຊັບຊ້ອນຂອງຄຳຮ້ອງຂໍ. ໂມເດວອື່ນຈະຖືກສົ່ງຕໍ່ຕາມປົກກະຕິ.',
@@ -1215,7 +1205,7 @@ const message = {
latencyMs: 'ຄວາມຫຼ້າຊ້າ (ms)',
smartRouteSettingGuide:
'ຫຼັງຈາກເປີດໃຊ້ ມີພຽງຄຳຮ້ອງຂໍທີ່ໃຊ້ model=auto ເທົ່ານັ້ນທີ່ຈະເປີດ Smart Route. ກຸ່ມແບບງ່າຍໃຊ້ສຳລັບວຽກຕົ້ນທຶນຕ່ຳ; ກຸ່ມແບບຊັບຊ້ອນໃຊ້ສຳລັບວິເຄາະໂຄດ, ອອກແບບສະຖາປັດຕະຍະກຳ, ແກ້ໄຂບັນຫາ ແລະ ວຽກຄ້າຍຄືກັນ.',
sampleLabelPlaceholder: 'simple / complex / high',
sampleLabelPlaceholder: 'ງ່າຍ / ຊັບຊ້ອນ / ສູງ',
sampleImportPlaceholder: 'ໜຶ່ງຕົວຢ່າງຕໍ່ແຖວ',
},
skillsHub: {
@@ -1361,9 +1351,9 @@ const message = {
resultMetrics: 'ຕົວຊີ້ວັດຜົນລັບ',
contextTokens: 'ຄວາມຍາວ Context',
contextTokensHelper: 'ຂີດຈຳກັດ input token ບວກກັບ output token ສຳລັບການທົດສອບນີ້.',
outputThroughput: 'Output Throughput',
outputThroughput: 'ອັດຕາການສົ່ງອອກ',
outputThroughputHelper: 'ຈຳນວນ output tokens ທີ່ສ້າງໄດ້ຕໍ່ວິນາທີ. ຍິ່ງສູງຍິ່ງໄວ.',
totalThroughput: 'Total Throughput',
totalThroughput: 'ອັດຕາການປະມວນຜົນລວມ',
totalThroughputHelper: 'ຈຳນວນ input ແລະ output tokens ທີ່ປະມວນຜົນຕໍ່ວິນາທີ. ໃຊ້ວັດແທກຄວາມສາມາດໂດຍລວມ.',
firstTokenLatency: 'ຄວາມໜ່ວງຂອງ Token ທຳອິດ',
firstTokenLatencyHelper: 'ເວລາຕັ້ງແຕ່ສົ່ງຄຳຂໍຈົນເຖິງການໄດ້ຮັບ token ທຳອິດ. ຍິ່ງຕ່ຳຍິ່ງຕອບສະໜອງໄວ.',
@@ -1375,7 +1365,7 @@ const message = {
requestRateCustom: 'ກຳນົດ QPS ເອງ',
requestRateCustomPlaceholder: 'ຄຳຂໍຕໍ່ວິນາທີ, ເຊັ່ນ: 2.5',
successfulRequests: 'ຄຳຂໍທີ່ສຳເລັດ',
requestThroughput: 'Request Throughput',
requestThroughput: 'ອັດຕາຄຳຮ້ອງຂໍ',
mean: 'ຄ່າສະເລ່ຍ',
median: 'ຄ່າມັດທະຍະຖານ',
timeout: 'ໝົດເວລາ (ວິນາທີ)',
@@ -1389,11 +1379,11 @@ const message = {
process: 'ຂໍ້ມູນໂປຣເຊສ',
processCount: 'ຈຳນວນໂປຣເຊສ',
type: 'ປະເພດ',
typeG: 'Graphics',
typeC: 'Compute',
typeCG: 'Compute+Graphics',
typeG: 'ກຣາຟິກ',
typeC: 'ການຄຳນວນ',
typeCG: 'ການຄຳນວນ + ກຣາຟິກ',
processName: 'ຊື່ໂປຣເຊສ',
shr: 'Shared Memory',
shr: 'ໜ່ວຍຄວາມຈຳຮ່ວມ',
temperatureHelper: 'ອຸນຫະພູມ GPU ທີ່ສູງເກີນໄປອາດເຮັດໃຫ້ປະສິດທິພາບຫຼຸດລົງ',
gpuUtil: 'ການໃຊ້ງານ GPU',
temperature: 'ອຸນຫະພູມ',
@@ -1413,24 +1403,24 @@ const message = {
cudaVersion: 'ເວີຊັນ CUDA',
processMemoryUsage: 'ການໃຊ້ໜ່ວຍຄວາມຈຳ',
performanceStateHelper: 'ຈາກ P0 (ປະສິດທິພາບສູງສຸດ) ເຖິງ P12 (ຕ່ຳສຸດ)',
busID: 'Bus Address',
persistenceMode: 'Persistence Mode',
busID: 'ທີ່ຢູ່ Bus',
persistenceMode: 'ໂໝດຄົງສະພາບ',
enabled: 'ເປີດໃຊ້ງານ',
disabled: 'ປິດໃຊ້ງານ',
persistenceModeHelper: 'Persistence mode ຊ່ວຍໃຫ້ຕອບສະໜອງງານໄດ້ໄວຂຶ້ນ ແຕ່ຈະກິນໄຟໃນໂໝດ Standby ຫຼາຍຂຶ້ນ',
displayActive: 'GPU Initialization',
persistenceModeHelper: 'ໂໝດຄົງສະພາບຊ່ວຍໃຫ້ຕອບສະໜອງວຽກໄດ້ໄວຂຶ້ນ ແຕ່ຈະໃຊ້ໄຟໃນໂໝດສະແຕນບາຍຫຼາຍຂຶ້ນ',
displayActive: 'ການເລີ່ມຕົ້ນ GPU',
displayActiveT: 'ແມ່ນ',
displayActiveF: 'ບໍ່',
ecc: 'ເຕັກໂນໂລຊີ ECC',
computeMode: 'ໂໝດການຄຳນວນ',
default: 'ເລີ່ມຕົ້ນ',
exclusiveProcess: 'Exclusive Process',
exclusiveThread: 'Exclusive Thread',
exclusiveProcess: 'ໂປຣເຊສສະເພາະ',
exclusiveThread: 'ເທຣດສະເພາະ',
prohibited: 'ຖືກຫ້າມ',
defaultHelper: 'Default: ໂປຣເຊສສາມາດລັນພ້ອມກັນໄດ້',
exclusiveProcessHelper: 'Exclusive Process: ມີພຽງ context ດຽວທີ່ໃຊ້ GPU ໄດ້ ແຕ່ແບ່ງປັນໃຫ້ຫຼາຍ thread ໄດ້',
exclusiveThreadHelper: 'Exclusive Thread: ມີພຽງ thread ດຽວໃນ context ທີ່ໃຊ້ GPU ໄດ້',
prohibitedHelper: 'Prohibited: ບໍ່ອະນຸຍາດໃຫ້ລັນໂປຣເຊສພ້ອມກັນ',
defaultHelper: 'ຄ່າເລີ່ມຕົ້ນ: ໂປຣເຊສສາມາດລັນພ້ອມກັນໄດ້',
exclusiveProcessHelper: 'ໂປຣເຊສສະເພາະ: ມີພຽງ context ດຽວທີ່ໃຊ້ GPU ໄດ້ ແຕ່ແບ່ງປັນໃຫ້ຫຼາຍ thread ໄດ້',
exclusiveThreadHelper: 'ເທຣດສະເພາະ: ມີພຽງ thread ດຽວໃນ context ທີ່ໃຊ້ GPU ໄດ້',
prohibitedHelper: 'ຫ້າມ: ບໍ່ອະນຸຍາດໃຫ້ລັນໂປຣເຊສພ້ອມກັນ',
migModeHelper: 'ໃຊ້ສຳລັບສ້າງ MIG instances ເພື່ອແຍກສ່ວນ GPU ທາງກາຍະພາບ.',
migModeNA: 'ບໍ່ຮອງຮັບ',
current: 'ຕິດຕາມແບບ Real-time',
@@ -1645,7 +1635,7 @@ const message = {
imagePush: 'ສົ່ງ Image (Push)',
imagePushHelper: 'ກວດພົບວ່າ Image ນີ້ມີຫຼາຍແທັກ. ກະລຸນາຢືນຢັນຊື່ Image ທີ່ຈະສົ່ງ: {0}',
imageDelete: 'ລຶບ Image',
repoName: 'Container registry',
repoName: 'Registry ຂອງ Container',
imageName: 'ຊື່ Image',
pull: 'ດຶງຂໍ້ມູນ (Pull)',
path: 'ເສັ້ນທາງ',
@@ -1730,9 +1720,9 @@ const message = {
dockerStatus: 'ບໍລິການ Docker',
daemonJsonPathHelper: 'ຢືນຢັນວ່າເສັ້ນທາງກຳນົດຄ່າກົງກັບທີ່ລະບຸໃນ docker.service.',
mirrors: 'Registry mirrors',
mirrorsHelper: '',
mirrorsHelper: 'ໃຊ້ URL ຂອງ registry mirror ກ່ອນສຳລັບການດຳເນີນງານ image. ປ່ອຍຫວ່າງເພື່ອປິດ registry mirror.',
mirrorsHelper2: 'ສຳລັບລາຍລະອຽດ, ເບິ່ງເອກະສານທາງການ.',
registries: 'Insecure registries',
registries: 'Registry ທີ່ບໍ່ປອດໄພ',
ipv6Helper:
'ເມື່ອເປີດໃຊ້ IPv6, ທ່ານຕ້ອງເພີ່ມ IPv6 network ໃຫ້ຄອນເທນເນີ. ອີງຕາມເອກະສານທາງການສຳລັບຂັ້ນຕອນການຕັ້ງຄ່າ.',
ipv6CidrHelper: 'ຊ່ວງ IPv6 address pool ສຳລັບຄອນເທນເນີ',
@@ -3668,9 +3658,9 @@ const message = {
staticChangePHPHelper: 'ປະຈຸບັນເປັນເວັບໄຊ Static, ທ່ານສາມາດປ່ຽນເປັນເວັບໄຊ PHP ໄດ້',
proxyCache: 'ແຄຊ Reverse Proxy',
cacheLimit: 'ຂີດຈຳກັດພື້ນທີ່ແຄຊ',
shareCahe: 'ຂະໜາດໜ່ວຍຄວາມຈຳຂອງຈຳນວນແຄຊ',
shareCache: 'ຂະໜາດໜ່ວຍຄວາມຈຳຂອງຈຳນວນແຄຊ',
cacheExpire: 'ເວລາໝົດອາຍຸຂອງແຄຊ',
shareCaheHelper: 'ສາມາດເກັບວັດຖຸແຄຊໄດ້ປະມານ 8000 ອັນຕໍ່ 1MB ຂອງໜ່ວຍຄວາມຈຳ',
shareCacheHelper: 'ສາມາດເກັບວັດຖຸແຄຊໄດ້ປະມານ 8000 ອັນຕໍ່ 1MB ຂອງໜ່ວຍຄວາມຈຳ',
cacheLimitHelper: 'ແຄຊເກົ່າຈະຖືກລຶບໂດຍອັດຕະໂນມັດເມື່ອພື້ນທີ່ເກີນກຳນົດ',
cacheExpireJHelper: 'ແຄຊຈະຖືກລຶບຖ້າບໍ່ມີການເຂົ້າເຖິງຫຼັງຈາກເວລາໝົດອາຍຸ',
realIP: 'IP ທີ່ແທ້ຈິງ',
@@ -4004,6 +3994,7 @@ const message = {
},
runtime: {
runtime: 'ຣັນທາມ (Runtime)',
default: 'ຄ່າເລີ່ມຕົ້ນ',
workDir: 'ໂຟນເດີທີ່ເຮັດວຽກ',
localHelper: 'ສຳລັບບັນຫາການຕິດຕັ້ງໃນເຄື່ອງ ຫຼື ການໃຊ້ງານແບບອອຟລາຍ, ເບິ່ງ ',
versionHelper: 'ເວີຊັນ PHP ຕົວຢ່າງ: v8.0',
@@ -4792,6 +4783,14 @@ const message = {
authManage: 'ການຢືນຢັນ',
auth: {
providerNavigation: 'ຜູ້ໃຫ້ບໍລິການຢັ້ງຢືນ',
defaultNode: 'ໂນດເລີ່ມຕົ້ນ',
defaultNodePlaceholder: 'ເລືອກໂນດ',
defaultNodeHelper: 'ໃຊ້ສຳລັບຜູ້ໃຊ້ໃໝ່ເທົ່ານັ້ນ.',
defaultNodeRequired: 'ເລືອກໂນດເລີ່ມຕົ້ນທີ່ຖືກຕ້ອງ.',
nodesLoadFailed: 'ໂຫຼດໂນດບໍ່ສຳເລັດ. ລອງໃໝ່ກ່ອນເລືອກໂນດເລີ່ມຕົ້ນ.',
nodeHandling: 'ການຈັດການໂນດ',
assignDefaultNode: 'ກຳນົດໂນດເລີ່ມຕົ້ນ: {node}',
keepExistingNode: 'ຮັກສາສິດໂນດເດີມ',
providers: {
ldap: 'AD/LDAP',
passkey: 'Passkey',
@@ -4819,7 +4818,388 @@ const message = {
planned: 'ວາງແຜນ',
plannedTitle: 'ການຕັ້ງຄ່າການພິສູດຢືນຢັນ {0}',
plannedDesc: 'ຜູ້ໃຫ້ບໍລິການການພິສູດຢືນຢັນນີ້ຖືກວາງແຜນໄວ້ ແລະຍັງບໍ່ສາມາດໃຊ້ໄດ້ເທື່ອ.',
oidc: {
accessMode: 'ໂໝດການເຊື່ອມຕໍ່',
accessModeDesc: 'ໃຊ້ມາດຕະຖານ Discovery ທຸກຄັ້ງທີ່ຜູ້ໃຫ້ບໍລິການຕົວຕົນສະຫນັບສະຫນູນມັນ.',
actionCreate: 'ສ້າງຜູ້ໃຊ້',
actionKeepName: 'ຮັກສາຊື່ຜູ້ໃຊ້ປັດຈຸບັນ',
actionPending: 'ລໍຖ້າຜົນໄດ້ຮັບ',
actionReject: 'ປະຕິເສດການເຂົ້າສູ່ລະບົບ',
actionUpdate: 'ອັບເດດຂໍ້ມູນຕົວຕົນ',
advanced: 'ການຕັ້ງຄ່າຂັ້ນສູງ',
advancedDesc: 'ຮັກສາຄ່າເລີ່ມຕົ້ນທີ່ປອດໄພເວັ້ນເສຍແຕ່ວ່າຜູ້ໃຫ້ບໍລິການຕ້ອງການທາງເລືອກທີ່ເຂົ້າກັນໄດ້.',
assignDefaultRole: 'ກຳນົດບົດບາດເລີ່ມຕົ້ນ: {role}',
authorizationEndpoint: 'Authorization Endpoint',
authorizationEndpointInvalid: 'ໃສ່ Authorization Endpoint ທີ່ຖືກຕ້ອງ.',
authorizationFlow: 'ກະແສການອະນຸຍາດ',
automatic: 'ອັດຕະໂນມັດ',
automaticPolicy: 'ນະໂຍບາຍການຈັດການອັດຕະໂນມັດ',
automaticPolicyDesc: 'ກົດລະບຽບເຫຼົ່ານີ້ຖືກບັງຄັບໃຊ້ໂດຍ backend ແລະບໍ່ແມ່ນສະຫຼັບຜູ້ບໍລິຫານ.',
basic: 'ການຕັ້ງຄ່າພື້ນຖານ',
basicDesc: 'ເລືອກຮູບແບບຜູ້ໃຫ້ບໍລິການ, ຈາກນັ້ນກຳນົດຄ່າລູກຄ້າ ແລະໂທກັບ.',
browserTest: 'ທົດສອບເຂົ້າລະບົບຜ່ານບຣາວເຊີ',
browserTestConflict: 'ຢັ້ງຢືນຕົວຕົນແລ້ວ ແຕ່ຊື່ຜູ້ໃຊ້ຂັດກັນ',
browserTestConflictHelper:
'ຊື່ຜູ້ໃຊ້ທີ່ຈັບຄູ່ໄວ້ເປັນຂອງຕົວຕົນອື່ນ ແລະ ຈະບໍ່ຖືກເຊື່ອມຕໍ່ອັດຕະໂນມັດ.',
browserTestExpired: 'ການທົດສອບໂປຣແກຣມທ່ອງເວັບໝົດອາຍຸແລ້ວ',
browserTestExpiredHelper: 'ເລີ່ມການທົດສອບຕົວທ່ອງເວັບໃຫມ່ແລະສໍາເລັດການອະນຸຍາດກ່ອນທີ່ມັນຈະຫມົດອາຍຸ.',
browserTestFailed: 'ການທົດສອບຕົວທ່ອງເວັບລົ້ມເຫລວ',
browserTestFailedHelper:
'ບໍ່ສາມາດສະແດງຕົວຢ່າງຂໍ້ມູນຕົວຕົນໄດ້. ກວດສອບຂໍ້ຜິດພາດທີ່ backend ສົ່ງກັບມາໃນພາສາປະຈຸບັນ.',
browserTestIsolation:
'ດຳເນີນການອະນຸຍາດແບບໄປ-ກັບຈິງ ແຕ່ຈະບໍ່ສ້າງ ຫຼື ອັບເດດຜູ້ໃຊ້, ມອບໝາຍບົດບາດ ຫຼື ສ້າງເຊດຊັນເຂົ້າລະບົບຈິງ.',
browserTestPopupBlocked:
'ອະນຸຍາດໃຫ້ປັອບອັບສໍາລັບເວັບໄຊທ໌ນີ້, ຈາກນັ້ນເລີ່ມການທົດສອບຕົວທ່ອງເວັບອີກຄັ້ງ.',
browserTestPopupClosed: 'ປ່ອງຢ້ຽມການອະນຸຍາດຖືກປິດກ່ອນການທົດສອບສໍາເລັດ.',
browserTestSuccess: 'ຢັ້ງຢືນຜູ້ໃຫ້ບໍລິການສຳເລັດແລ້ວ',
browserTestSuccessHelper: 'ແຜນທີ່ການລະບຸຕົວຕົນໄດ້ຖືກສະແດງຕົວຢ່າງໂດຍບໍ່ມີການປ່ຽນຜູ້ໃຊ້ ຫຼືເຊດຊັນ.',
browserTestTitle: 'OIDC ທົດສອບການເຂົ້າສູ່ລະບົບຂອງຕົວທ່ອງເວັບ',
browserTestWaiting: 'ກຳລັງລໍຖ້າການອະນຸຍາດຈາກຜູ້ໃຫ້ບໍລິການ',
browserTestWaitingHelper:
'ສຳເລັດການເຂົ້າສູ່ລະບົບໃນໜ້າຈໍໂປຣແກຣມທ່ອງເວັບໃໝ່. ໜ້ານີ້ຈະອັບເດດໂດຍອັດຕະໂນມັດ.',
callbackCopied: 'ສຳເນົາ OIDC ໂທກັບ URL ແລ້ວ.',
callbackURL: 'ໂທກັບ URL',
callbackURLHelper: 'ເພີ່ມທີ່ຢູ່ນີ້ໃສ່ລາຍການທີ່ຢູ່ຮຽກກັບທີ່ອະນຸຍາດຂອງໄຄລເອັນໃນຜູ້ໃຫ້ບໍລິການຕົວຕົນ.',
cancelClearSecret: 'ຍົກເລີກການລຶບລ້າງ',
clearSecret: 'ລ້າງ Client Secret',
clearSecretConfirm: 'Client Secret ຈະຖືກລຶບອອກຫຼັງຈາກທີ່ທ່ານບັນທຶກເທົ່ານັ້ນ. ສືບຕໍ່?',
clientAuthMethod: 'ວິທີການກວດສອບລູກຄ້າ',
clientAuthMethodHelper: 'ເລືອກວິທີຢືນຢັນຕົວຕົນທີ່ກຳນົດໄວ້ສຳລັບໄຄລເອັນນີ້ໃນຜູ້ໃຫ້ບໍລິການຕົວຕົນ.',
clientAuthMethodRequired: 'ເລືອກວິທີການກວດສອບລູກຄ້າ.',
clientID: 'Client ID',
clientIDRequired: 'ໃສ່ Client ID.',
clientSecret: 'Client Secret',
clockSkew: 'ຄ່າຍອມຮັບຄວາມຄາດເຄື່ອນເວລາຂອງໂທເຄັນ',
clockSkewHelper:
'ອະນຸຍາດໃຫ້ເວລາຂອງຜູ້ໃຫ້ບໍລິການຕົວຕົນ ແລະ 1Panel ແຕກຕ່າງກັນເລັກນ້ອຍ. ແນະນຳໃຫ້ຄົງຄ່າເລີ່ມຕົ້ນ 60 ວິນາທີ.',
clockSkewRequired: 'ໃສ່ຄ່າຍອມຮັບຄວາມຄາດເຄື່ອນເວລາຂອງໂທເຄັນ.',
compatibilityMode: 'ໂໝດຄວາມເຂົ້າກັນໄດ້',
compatibilityModeHelper:
'ໃຊ້ພຽງແຕ່ສໍາລັບ Discovery ທີ່ບໍ່ຄົບຖ້ວນຫຼືຈຸດສິ້ນສຸດທີ່ຂຽນໃຫມ່. ການກວດສອບ Core OIDC ຍັງຄົງເປີດໃຊ້ຢູ່.',
configurationFailedHelper:
'ການທົດສອບລົ້ມເຫຼວ. ໜ້ານີ້ສະແດງສະເພາະຂໍ້ຜິດພາດທີ່ backend ສົ່ງກັບມາໃນພາສາປະຈຸບັນ.',
configurationFailedTag: 'ການທົດສອບລົ້ມເຫລວ',
configurationHighRiskPassed: 'ການຕັ້ງຄ່າຜ່ານໄປ, ແຕ່ມີທາງເລືອກທີ່ເຂົ້າກັນໄດ້ທີ່ມີຄວາມສ່ຽງສູງ.',
configurationHighRiskTag: 'ຜ່ານການຕັ້ງຄ່າຄວາມສ່ຽງສູງ',
configurationNotTested: 'ການຕັ້ງຄ່າປັດຈຸບັນຍັງບໍ່ໄດ້ຖືກທົດສອບ.',
configurationNotTestedTag: 'ບໍ່ໄດ້ທົດສອບ',
configurationPassed: 'ການຕັ້ງຄ່າປັດຈຸບັນຜ່ານການກວດສອບຄວາມປອດໄພ ແລະຄວາມສາມາດ.',
configurationPassedTag: 'ການທົດສອບຜ່ານ',
configurationStaleHelper: 'ການຕັ້ງຄ່າຖືກປ່ຽນແປງແລ້ວ. ກະລຸນາທົດສອບອີກຄັ້ງກ່ອນບັນທຶກ.',
configurationStaleTag: 'ຜົນໄດ້ຮັບໝົດອາຍຸ',
configurationTestMeta:
'ທົດສອບຢູ່ {time}; ສໍາເລັດໃນ {duration} ms. ການຕອບ Provider ດິບບໍ່ໄດ້ຖືກເກັບຮັກສາໄວ້.',
configurationTestResult: 'ຜົນ​ການ​ທົດ​ສອບ​ການ​ຕັ້ງ​ຄ່າ​',
configurationTestResultDesc:
'ນີ້ກວດເບິ່ງ Discovery ແລະຄວາມສາມາດເທົ່ານັ້ນ; ມັນບໍ່ແລກປ່ຽນລະຫັດການອະນຸຍາດ ຫຼືພິສູດ Client Secret. ໃຊ້ການເຂົ້າສູ່ລະບົບການທົດສອບຂອງຕົວທ່ອງເວັບສໍາລັບການຢັ້ງຢືນໃນຕອນທ້າຍ.',
configurationTestSuccess: 'ການທົດສອບການຕັ້ງຄ່າ OIDC ສຳເລັດແລ້ວ.',
configurationTesting: 'ກຳລັງທົດສອບການຕັ້ງຄ່າ OIDC ໃນປັດຈຸບັນ...',
configurationTestingTag: 'ການທົດສອບ',
configureSecret: 'ຕັ້ງຄ່າລັບ',
conflictExistingRename: 'subject ທີ່ຜູກໄວ້ສົ່ງຄືນຊື່ຜູ້ໃຊ້ໃໝ່ທີ່ຖືກໃຊ້ແລ້ວ',
conflictExistingRenameResult:
'ຮັກສາ User.Name ທີ່ມີຢູ່ແລ້ວແລະອະນຸຍາດໃຫ້ຜູ້ໃຊ້ທີ່ຖືກຜູກມັດເຂົ້າສູ່ລະບົບ',
conflictLDAP: 'ຜູ້ໃຊ້ LDAP',
conflictLocal: 'ຜູ້ໃຊ້ທ້ອງຖິ່ນ',
conflictNewAvailable: 'subject ໃໝ່ ແລະ ຊື່ຜູ້ໃຊ້ທີ່ຈັບຄູ່ໄວ້ສາມາດໃຊ້ໄດ້',
conflictNewAvailableResult: 'ສ້າງຜູ້ໃຊ້ວິສາຫະກິດແລະມອບຫມາຍບົດບາດເລີ່ມຕົ້ນ',
conflictNone: 'ບໍ່ມີຂໍ້ຂັດແຍ່ງ',
conflictOIDC: 'ຕົວຕົນ OIDC ອື່ນ',
conflictOccupied: 'ຊື່ຜູ້ໃຊ້ທີ່ຈັບຄູ່ໄວ້ເປັນຂອງຜູ້ໃຊ້ທ້ອງຖິ່ນ, LDAP ຫຼື ຕົວຕົນ OIDC ອື່ນ.',
conflictOccupiedResult: 'ປະຕິເສດຕົວຕົນໃຫມ່; ບໍ່ເຄີຍຜູກມັດ ຫຼືລວມອັດຕະໂນມັດ',
conflictType: 'ປະເພດການຂັດແຍ້ງ',
connectionSecurity: 'ຄວາມ​ປອດ​ໄພ​ການ​ເຊື່ອມ​ຕໍ່​',
connectionSecurityDesc: 'ນະໂຍບາຍ TLS ນຳໃຊ້ກັບຄຳຮ້ອງຂໍ Discovery, Token, JWKS, ແລະ UserInfo.',
connectionTest: 'ການ​ເຊື່ອມ​ຕໍ່​ແລະ​ການ​ທົດ​ສອບ​ການ​ຕັ້ງ​ຄ່າ​',
connectionTestCompatibilityDesc: 'ກວດສອບຈຸດສິ້ນສຸດແບບກຳນົດເອງ ແລະນະໂຍບາຍຄວາມປອດໄພຂອງໂປຣໂຕຄໍ.',
connectionTestStandardDesc: 'ຈຸດສິ້ນສຸດ ແລະຄວາມສາມາດຖືກຄົ້ນພົບໂດຍອັດຕະໂນມັດຈາກ Issuer.',
connectionTestTab: 'ທົດສອບການເຊື່ອມຕໍ່',
customCA: 'CA ແບບກຳນົດເອງ',
customCAHelper: 'ນຳໃຊ້ກັບແຫຼ່ງການພິສູດຢືນຢັນນີ້ເທົ່ານັ້ນ ແລະບໍ່ເຄີຍຂຽນໃສ່ບັນທຶກ.',
customCARequired: 'ສະໜອງໃບຢັ້ງຢືນ CA ແບບກຳນົດເອງ.',
defaultRole: 'ບົດບາດເລີ່ມຕົ້ນ',
defaultRoleHelper: 'ມອບໃຫ້ສະເພາະເມື່ອສ້າງຜູ້ໃຊ້ຄັ້ງທຳອິດ; ການເຂົ້າລະບົບຄັ້ງຕໍ່ໄປຈະບໍ່ປ່ຽນບົດບາດ.',
defaultRolePlaceholder: 'ເລືອກບົດບາດ',
defaultRoleRequired: 'ເລືອກບົດບາດເລີ່ມຕົ້ນທີ່ຖືກຕ້ອງ.',
disableAfterSave: 'OIDC ຈະຖືກປິດໃຊ້ງານຫຼັງຈາກບັນທຶກ.',
disableConfirm: 'ການປິດໃຊ້ງານ OIDC ທັນທີເຮັດໃຫ້ການເຂົ້າເຖິງຜູ້ໃຊ້ຂອງແຫຼ່ງນີ້ບໍ່ຖືກຕ້ອງ. ສືບຕໍ່?',
disableDiscardConfirm:
'ການປິດການນຳໃຊ້ OIDC ເປັນການກະທຳສຸກເສີນ: ມັນພຽງແຕ່ປິດການເຂົ້າລະບົບ ແລະເຮັດໃຫ້ການເຂົ້າເຖິງບໍ່ຖືກຕ້ອງສຳລັບຜູ້ໃຊ້ແຫຼ່ງທີ່ມານີ້ໃນທັນທີ. ການປ່ຽນແປງອື່ນໆທີ່ຍັງບໍ່ໄດ້ບັນທຶກໄວ້ໃນໜ້ານີ້, ລວມທັງການປ່ຽນແປງ Client Secret, ຈະຖືກຍົກເລີກ. ສືບຕໍ່?',
disableTitle: 'ປິດໃຊ້ງານ OIDC',
disabled: 'ປິດໃຊ້',
discoveryAllowlist: 'ບັນຊີອະນຸຍາດຄວາມປອດໄພສຳລັບ Discovery',
enable: 'ເປີດໃຊ້',
enableAfterSave: 'OIDC ຈະຖືກເປີດໃຊ້ຫຼັງຈາກບັນທຶກສຳເລັດ.',
enabled: 'ເປີດໃຊ້ແລ້ວ',
endSessionEndpoint: 'End Session Endpoint',
endSessionEndpointHelper:
'ບັນທຶກສໍາລັບການນໍາໃຊ້ໃນອະນາຄົດ; ການອອກຈາກລະບົບທີ່ລິເລີ່ມ Provider ບໍ່ໄດ້ລວມຢູ່ໃນລຸ້ນນີ້.',
endSessionEndpointInvalid: 'ໃສ່ End Session Endpoint ທີ່ຖືກຕ້ອງ.',
endpointDiscoveryPlaceholder: 'ສະແດງຫຼັງຈາກທົດສອບການເຊື່ອມຕໍ່',
firstLogin: 'ເຂົ້າ​ສູ່​ລະ​ບົບ​ຄັ້ງ​ທໍາ​ອິດ​',
firstLoginPolicy: 'ສ້າງຜູ້ໃຊ້ວິສາຫະກິດໃນທ້ອງຖິ່ນແລະມອບຫມາຍບົດບາດເລີ່ມຕົ້ນທີ່ໄດ້ກໍານົດໄວ້.',
fixedAuthorizationCode: 'Authorization Code Flow',
fixedNoTokenPersistence: 'Tokens, Claims, ແລະ verifier ບໍ່ເຄີຍຄົງຢູ່',
fixedSecurityPolicy: 'ບັງຄັບໃຊ້ສະເໝີ; ບໍ່​ມີ​ການ​ຕັ້ງ​ຄ່າ​ທີ່​ຕ້ອງ​ການ​',
fixedStateNonce: 'state ແລະ nonce ຄັ້ງດຽວ',
fixedTokenValidation: 'ລາຍເຊັນ ID Token ແລະການກວດສອບຄວາມຖືກຕ້ອງຂອງ Claims',
highRiskSaveConfirm:
'ການຕັ້ງຄ່າທີ່ເປີດໃຊ້ງານນີ້ມີທາງເລືອກຄວາມເຂົ້າກັນໄດ້ທີ່ມີຄວາມສ່ຽງສູງ. ຢືນຢັນວ່າສະພາບແວດລ້ອມທີ່ໂດດດ່ຽວຮຽກຮ້ອງໃຫ້ມີພວກມັນ.',
highRiskTitle: 'ການຕັ້ງຄ່າ OIDC ມີຄວາມສ່ຽງສູງ',
hs256Compatibility: 'HS256 (ເຂົ້າກັນໄດ້)',
hs256KeyHelper: 'HS256 ໃຊ້ Client Secret ຂອງແຫຼ່ງນີ້ສະເໝີ ແລະ ບໍ່ຍອມຮັບລະຫັດການເຊັນແຍກຕ່າງຫາກ.',
hs256Warning:
'HS256 ໃຊ້ຄວາມລັບ symmetric ຮ່ວມກັນສໍາລັບລາຍເຊັນ ID Token. ໃຊ້ມັນພຽງແຕ່ເມື່ອ Provider ບໍ່ສາມາດໃຊ້ສູດການຄິດໄລ່ທີ່ບໍ່ສົມມາດ.',
identityBindingPolicy:
'ການລະບຸຕົວຕົນຖືກແກ້ໄຂເປັນ AuthSourceID + issuer + subject. ຜູ້ໃຊ້ທີ່ກົງກັນ name ບໍ່ເຄີຍອ້າງສິດບັນຊີອື່ນ.',
identityMissing: 'ຕົວຕົນບໍ່ມີຜົນ',
issuer: 'Issuer URL',
issuerHelper: 'ID Token iss ຄ່າ ແລະ Discovery issuer ຕ້ອງກົງກັບຄ່ານີ້ແນ່ນອນ.',
issuerInvalid: 'ປ້ອນ HTTP ຫຼື HTTPS Issuer URL ທີ່ຖືກຕ້ອງໂດຍບໍ່ມີການສອບຖາມ ຫຼື fragment.',
issuerRequired: 'ໃສ່ Issuer URL.',
jwksRotation: 'ການຫມຸນ JWKS ອັດຕະໂນມັດ',
jwksURI: 'JWKS URI',
jwksURIHelper: 'ຕ້ອງການສໍາລັບການເຊັນຊື່ທີ່ບໍ່ສົມມາດວັດແທກເມື່ອແຫຼ່ງທີ່ສໍາຄັນແມ່ນ JWKS.',
jwksURIInvalid: 'ໃສ່ JWKS URI ທີ່ຖືກຕ້ອງສໍາລັບແຫຼ່ງລະຫັດການລົງນາມທີ່ເລືອກ.',
keepExistingRole: 'ຮັກສາບົດບາດທີ່ມີຢູ່ແລ້ວແລະການອະນຸຍາດທ້ອງຖິ່ນ',
localSecurityData: 'ຂໍ້ມູນຄວາມປອດໄພໃນທ້ອງຖິ່ນ',
localSecurityDataPolicy: 'ຢ່າຂຽນທັບບົດບາດ, MFA, API Keys, Passkeys, ຫຼືການອະນຸຍາດທ້ອງຖິ່ນ.',
localCredentialsManaged:
'ຊື່ຜູ້ໃຊ້ ແລະ ລະຫັດຜ່ານທ້ອງຖິ່ນຖືກຈັດການໂດຍ OIDC ແລະ ບໍ່ສາມາດແກ້ໄຂຢູ່ບ່ອນນີ້. ບົດບາດ, ສິດອະນຸຍາດ, MFA, API Keys ແລະ Passkeys ຍັງຄົງເປັນຂໍ້ມູນທ້ອງຖິ່ນ.',
localUserFields: 'ຊ່ອງຂໍ້ມູນຜູ້ໃຊ້ໃນທ້ອງຖິ່ນ',
localUserFieldsDesc: 'ການປ່ອຍຕົວທໍາອິດເຮັດແຜນທີ່ພຽງແຕ່ User.Name ແລະບໍ່ໃຊ້ການສະແດງແຜນທີ່ JSON.',
loginWith: 'ເຂົ້າລະບົບດ້ວຍ {provider}',
manualEndpoints: 'ຈຸດສິ້ນສຸດແບບກຳນົດເອງ',
manualEndpointsDesc: 'ໃຊ້ພຽງແຕ່ເມື່ອ Discovery ບໍ່ສົມບູນ ຫຼືປະຕູທາງເທິງຂຽນຈຸດສິ້ນສຸດຄືນໃໝ່.',
mappingResult: 'ຜົນແຜນທີ່',
mode: 'ໂໝດການເຊື່ອມຕໍ່',
modeRequired: 'ເລືອກຮູບແບບການເຊື່ອມຕໍ່.',
nameClaim: 'Claim ຊື່ຜູ້ໃຊ້',
nameClaimHelper: 'ໃສ່ຊ່ອງຂໍ້ມູນທີ່ມີຊື່ຜູ້ໃຊ້ ເຊັ່ນ preferred_username.',
nameClaimRequired: 'ປ້ອນ Claim ຊື່ຜູ້ໃຊ້.',
nameConflict: 'ນະໂຍບາຍການຂັດແຍ້ງກ່ຽວກັບຊື່',
panelURL: '1Panel ສາທາລະນະ URL',
panelURLHTTPWarning:
'HTTP ບໍ່ປົກປ້ອງການຕອບຮັບການອະນຸຍາດ. ໃຊ້ມັນຢູ່ໃນສະພາບແວດລ້ອມສ່ວນຕົວທີ່ໂດດດ່ຽວທີ່ຍອມຮັບໂດຍ Provider.',
panelURLHelper: 'ໃສ່ທີ່ຢູ່ທີ່ຜູ້ໃຊ້ໃຊ້ເຂົ້າເຖິງ 1Panel. ລະບົບໃຊ້ທີ່ຢູ່ນີ້ເພື່ອສ້າງທີ່ຢູ່ຮຽກກັບ.',
panelURLInvalid: 'ປ້ອນຕົ້ນກຳເນີດທີ່ປະກອບມີພຽງແຕ່ໂຄງການ, ໂຮສ, ແລະພອດທາງເລືອກ.',
panelURLRequired: 'ປ້ອນ 1Panel ສາທາລະນະ URL.',
pkceDisabled: 'ປິດໃຊ້ງານ (ຄວາມເຂົ້າກັນໄດ້ເທົ່ານັ້ນ)',
pkceDisabledWarning: 'ການປິດໃຊ້ງານ PKCE ຫຼຸດຜ່ອນການປ້ອງກັນການຂັດຂວາງລະຫັດການອະນຸຍາດ.',
pkceHelper: 'ຕ້ອງການ S256. ວິທີການທ້າທາຍ plain ແມ່ນບໍ່ເຄີຍສະເຫນີ.',
pkceS256: 'S256 (ແນະນໍາ)',
plannedHandling: 'ການຈັດການແຜນການ',
privateNetworkIdP: 'IDP ເຄືອຂ່າຍສ່ວນຕົວ',
privateNetworkIdPHelper:
'ອະນຸຍາດໃຫ້ທີ່ຢູ່ສ່ວນຕົວຢ່າງຊັດເຈນ; metadata, loopback, link-local, redirects, ແລະການ rebinding DNS ຍັງຄົງຖືກບລັອກ.',
privateNetworkWarning:
'ການ​ເຂົ້າ​ເຖິງ​ເຄືອ​ຂ່າຍ​ສ່ວນ​ຕົວ​ແມ່ນ​ເປີດ​ໃຊ້​ງານ​ສໍາ​ລັບ​ແຫຼ່ງ​ການ​ກວດ​ສອບ​ນີ້​.',
protocolCompatibility: 'ຄວາມເຂົ້າກັນໄດ້ຂອງພິທີການ',
protocolCompatibilityDesc: 'ການກວດສອບລາຍເຊັນ ID Token ບໍ່ສາມາດປິດການໃຊ້ງານໄດ້.',
providerAndClient: 'ຜູ້ໃຫ້ບໍລິການ ແລະ Client',
providerAndClientDesc: 'Client Secret ພຽງແຕ່ສາມາດຖືກແທນທີ່ຫຼືລ້າງແລະບໍ່ເຄີຍຖືກສົ່ງຄືນໂດຍຫນ້າ.',
providerCapabilities: 'ຄວາມສາມາດຂອງຜູ້ໃຫ້ບໍລິການ',
recentTestSuccess: 'ການທົດສອບຄັ້ງສຸດທ້າຍປະສົບຜົນສໍາເລັດ: {0}',
recommended: 'ແນະນຳ',
rejectPlain: 'plain ປະຕິເສດ',
replaceSecret: 'ທົດແທນຄວາມລັບ',
requestAndClaims: 'ການຮ້ອງຂໍແລະຄຸນລັກສະນະ',
requestAndClaimsDesc: 'ກຳນົດຂອບເຂດການອະນຸຍາດ, ການເຕີມຂໍ້ມູນຜູ້ໃຊ້ ແລະພາລາມິເຕີຄຳຮ້ອງຂໍ.',
requestTimeout: 'ການຮ້ອງຂໍໝົດເວລາ',
requestTimeoutRequired: 'ປ້ອນການໝົດເວລາການຮ້ອງຂໍ.',
restore: 'ກູ້ຄືນ',
restored: 'ການຕັ້ງຄ່າ OIDC ທີ່ບັນທຶກໄວ້ຫຼ້າສຸດໄດ້ຖືກຟື້ນຟູຄືນມາ.',
result: 'ຜົນໄດ້ຮັບ',
rolesLoadFailed: 'ບໍ່ສາມາດໂຫຼດບົດບາດໄດ້. ລອງອີກຄັ້ງກ່ອນທີ່ຈະເລືອກບົດບາດເລີ່ມຕົ້ນ.',
roleHandling: 'ການຈັດການພາລະບົດບາດ',
scenario: 'ສະຖານະການ',
scopes: 'ຂອບເຂດການອະນຸຍາດ',
scopesHelper: 'ຕ້ອງມີ openid. ໃຊ້ຊ່ອງຫວ່າງແຍກຫຼາຍຂອບເຂດ.',
scopesRequired: 'Scopes ຕ້ອງມີ openid.',
seconds: 'ວິນາທີ',
secretClearHelper: 'ຫຼັງຈາກການລຶບລ້າງ, ຕ້ອງການ Client Secret ໃໝ່ ກ່ອນທີ່ຈະເປີດ OIDC ອີກຄັ້ງ.',
secretConfigured: 'ຕັ້ງຄ່າແລ້ວ',
secretNotConfigured: 'ບໍ່ໄດ້ຕັ້ງຄ່າ',
secretPlaceholder: 'ໃສ່ Client Secret ໃຫມ່',
secretReplaceHelper:
'Client Secret ໃໝ່ຈະແທນຄ່າເກົ່າເມື່ອບັນທຶກ. ກະລຸນາອັບເດດ Client Secret ໃນ OIDC Provider ພ້ອມກັນ.',
secretRequiredHelper: 'ຕັ້ງຄ່າ Client Secret ກ່ອນທີ່ຈະເປີດໃຊ້ OIDC.',
secretRequiredToEnable: 'ຕັ້ງຄ່າ Client Secret ກ່ອນທີ່ຈະເປີດໃຊ້ OIDC.',
secretSavedHelper: 'ຈັດເກັບແບບເຂົ້າລະຫັດ. ປ່ອຍຫວ່າງເພື່ອຮັກສາ Client Secret ປັດຈຸບັນ.',
secretWaiting: 'ລໍຖ້າການປ້ອນຂໍ້ມູນ',
secretWillClear: 'ຈະຖືກລຶບລ້າງ',
secretWillReplace: 'ຈະຖືກປ່ຽນແທນ',
signingAlgorithm: 'ອັນກໍຣິທຶມການເຊັນ ID Token',
signingAlgorithmHelper: 'ເລືອກໄດ້ສະເພາະອັນກໍຣິທຶມທີ່ຢູ່ໃນລາຍຊື່ອະນຸຍາດດ້ານຄວາມປອດໄພຂອງ backend.',
signingKey: 'ກະແຈລາຍເຊັນ',
signingKeyClientSecret: 'Client Secret (HS256 ເທົ່ານັ້ນ)',
signingKeyJWKS: 'JWKS URI ພ້ອມການໝູນວຽນອັດຕະໂນມັດ',
signingKeySource: 'ແຫຼ່ງກະແຈລາຍເຊັນ',
signingKeySourceHelper: 'ແນະນຳໃຫ້ໃຊ້ JWKS. ກະແຈສາທາລະນະແບບຄົງທີ່ບໍ່ສາມາດໝູນວຽນອັດຕະໂນມັດໄດ້.',
signingKeyStatic: 'ກະແຈສາທາລະນະ JWK ຫຼື PEM ແບບຄົງທີ່',
standardDiscovery: 'ມາດຕະຖານ OIDC Discovery',
standardDiscoveryDesc: '1Panel ຄົ້ນພົບຈຸດສິ້ນສຸດ ແລະຄວາມສາມາດ ແລະບໍ່ໄດ້ເກັບຮັກສາເອກະສານດິບ.',
standardMode: 'ໂໝດມາດຕະຖານ',
standardModeHelper: 'ຄົ້ນພົບຈຸດສິ້ນສຸດ, ຄວາມສາມາດໃນການເຊັນ, ແລະການສະຫນັບສະຫນູນ PKCE ຈາກ Issuer.',
standardProtocolPolicy: 'ນະໂຍບາຍໂປໂຕຄອນມາດຕະຖານ',
standardProtocolPolicyDesc:
'ຄວາມສາມາດໃນການເຊັນຖືກເຈລະຈາອັດຕະໂນມັດ; ບໍ່ຕ້ອງປ້ອນອັນກໍຣິທຶມ ຫຼື ກະແຈລາຍເຊັນຢູ່ບ່ອນນີ້.',
staticSigningKey: 'ກະແຈສາທາລະນະລາຍເຊັນແບບຄົງທີ່',
staticSigningKeyHelper: 'ຮັບສະເພາະຂໍ້ມູນກະແຈສາທາລະນະ. ຕ້ອງອັບເດດເອງເມື່ອ Provider ປ່ຽນກະແຈ.',
staticSigningKeyPlaceholder: 'ວາງກະແຈສາທາລະນະ JWK, JWKS JSON ຫຼື PEM',
staticSigningKeyRequired: 'ກະລຸນາລະບຸກະແຈສາທາລະນະລາຍເຊັນແບບຄົງທີ່.',
staticSigningKeyWarning:
'ກະແຈລາຍເຊັນແບບຄົງທີ່ບໍ່ສາມາດໝູນວຽນອັດຕະໂນມັດໄດ້; ອັບເດດກ່ອນທີ່ Provider ຈະໝູນວຽນກະແຈ.',
settingLoadFailed: 'ການຕັ້ງຄ່າ OIDC ບໍ່ສາມາດໂຫຼດໄດ້',
settingLoadFailedHelper:
'ແບບຟອມຖືກລັອກເພື່ອຫຼີກເວັ້ນການບັນທຶກການຕັ້ງຄ່າເລີ່ມຕົ້ນທີ່ຫວ່າງເປົ່າໃສ່ກັບການຕັ້ງຄ່າປັດຈຸບັນ. ລອງໃໝ່ຫຼັງຈາກການເຊື່ອມຕໍ່ຟື້ນຕົວ.',
subsequentLogin: 'ເຂົ້າສູ່ລະບົບຕໍ່ມາ',
subsequentLoginPolicy:
'ຊອກຫາການຜູກມັດດ້ວຍ subject ແລະ ອັບເດດສະເພາະ User.Name ເມື່ອຊື່ຜູ້ໃຊ້ໃໝ່ສາມາດໃຊ້ໄດ້.',
testBeforeBrowserTest:
'ທົດສອບການຕັ້ງຄ່າປັດຈຸບັນກ່ອນທີ່ຈະເລີ່ມການທົດສອບການເຂົ້າສູ່ລະບົບຂອງຕົວທ່ອງເວັບ.',
testBeforeEnable: 'ທົດສອບການຕັ້ງຄ່າປັດຈຸບັນກ່ອນບັນທຶກການປ່ຽນແປງການຕັ້ງຄ່າ.',
testConfiguration: 'ທົດສອບການຕັ້ງຄ່າ',
testDiscovery: 'ທົດສອບ Discovery',
tlsCustomCA: 'HTTPS · ໃບຢັ້ງຢືນ CA ແບບກຳນົດເອງ',
tlsPrivateHTTP: 'HTTP · ເຄືອຂ່າຍສ່ວນຕົວເທົ່ານັ້ນ (ອັນຕະລາຍ)',
tlsPrivateHTTPWarning:
'HTTP ບໍ່ມີການເຂົ້າລະຫັດການຂົນສົ່ງ ແລະຖືກຈຳກັດໃຫ້ເປົ້າໝາຍສ່ວນຕົວທີ່ອະນຸຍາດຢ່າງຈະແຈ້ງ.',
tlsSkipVerify: 'HTTPS · ຂ້າມການຢັ້ງຢືນໃບຢັ້ງຢືນ (ອັນຕະລາຍ)',
tlsSystem: 'HTTPS · ການຢັ້ງຢືນລະບົບ (ແນະນຳ)',
tokenEndpoint: 'Token Endpoint',
tokenEndpointInvalid: 'ໃສ່ Token Endpoint ທີ່ຖືກຕ້ອງ.',
transportSecurity: 'ຄວາມປອດໄພການຂົນສົ່ງ',
transportSecurityHelper:
'ຕ້ອງການ HTTPS. HTTP ສ່ວນຕົວຍັງຕ້ອງການການເຂົ້າເຖິງ private-network ຢ່າງຊັດເຈນ.',
unsavedChanges: 'ມີການປ່ຽນແປງ OIDC ທີ່ຍັງບໍ່ໄດ້ບັນທຶກ.',
usedClaim: 'Claim ໃຊ້ແລ້ວ',
userInfoEndpoint: 'UserInfo Endpoint',
userInfoEndpointHelper:
'ເມື່ອບໍ່ມີຟິວຊື່ຜູ້ໃຊ້ ລະບົບຈະເຕີມຈາກ endpoint ນີ້; ປ່ອຍຫວ່າງເພື່ອບໍ່ເຕີມ.',
userInfoEndpointInvalid: 'ໃສ່ UserInfo Endpoint ທີ່ຖືກຕ້ອງ.',
userMapping: 'ການຕັ້ງຄ່າຜູ້ໃຊ້',
userMappingDesc:
'ກຳນົດການຈັບຄູ່ຊື່ຜູ້ໃຊ້ OIDC ແລະໂນດກັບບົດບາດເລີ່ມຕົ້ນທີ່ໃຊ້ສ້າງຜູ້ໃຊ້ໃນການເຂົ້າລະບົບຄັ້ງທຳອິດ.',
},
saml2: {
actionCreate: 'ສ້າງຜູ້ໃຊ້',
actionPending: 'ລໍຖ້າຜົນໄດ້ຮັບ',
actionReject: 'ປະຕິເສດການເຂົ້າສູ່ລະບົບ',
actionReuse: 'ໃຊ້ຜູ້ໃຊ້ທີ່ຜູກມັດແລ້ວ',
assignDefaultRole: 'ກຳນົດບົດບາດເລີ່ມຕົ້ນ: {role}',
basic: 'ການຕັ້ງຄ່າພື້ນຖານ',
basicDesc: 'ຕັ້ງຄ່າຕົວເລືອກທີ່ຈຳເປັນສຳລັບຜູ້ໃຫ້ບໍລິການ SAML2 ມາດຕະຖານ.',
browserTest: 'ທົດສອບເຂົ້າລະບົບ',
browserTestConflict: 'ຢັ້ງຢືນຕົວຕົນແລ້ວ ແຕ່ຊື່ຜູ້ໃຊ້ຂັດກັນ',
browserTestConflictHelper:
'ຊື່ຜູ້ໃຊ້ທີ່ຈັບຄູ່ໄວ້ເປັນຂອງຕົວຕົນອື່ນ ແລະ ຈະບໍ່ຖືກເຊື່ອມຕໍ່ອັດຕະໂນມັດ.',
browserTestExpired: 'ການທົດສອບໂປຣແກຣມທ່ອງເວັບໝົດອາຍຸແລ້ວ',
browserTestExpiredHelper: 'ເລີ່ມການທົດສອບຕົວທ່ອງເວັບໃຫມ່ແລະສໍາເລັດການອະນຸຍາດກ່ອນທີ່ມັນຈະຫມົດອາຍຸ.',
browserTestFailed: 'ການທົດສອບຕົວທ່ອງເວັບລົ້ມເຫລວ',
browserTestFailedHelper:
'ບໍ່ສາມາດສະແດງຕົວຢ່າງຂໍ້ມູນຕົວຕົນໄດ້. ກວດສອບຂໍ້ຜິດພາດທີ່ backend ສົ່ງກັບມາໃນພາສາປະຈຸບັນ.',
browserTestIsolation:
'ດຳເນີນການອະນຸຍາດແບບໄປ-ກັບຈິງ ແຕ່ຈະບໍ່ສ້າງ ຫຼື ອັບເດດຜູ້ໃຊ້, ມອບໝາຍບົດບາດ ຫຼື ສ້າງເຊດຊັນເຂົ້າລະບົບຈິງ.',
browserTestPopupBlocked:
'ອະນຸຍາດໃຫ້ປັອບອັບສໍາລັບເວັບໄຊທ໌ນີ້, ຈາກນັ້ນເລີ່ມການທົດສອບຕົວທ່ອງເວັບອີກຄັ້ງ.',
browserTestPopupClosed: 'ປ່ອງຢ້ຽມການອະນຸຍາດຖືກປິດກ່ອນການທົດສອບສໍາເລັດ.',
browserTestSuccess: 'ຢັ້ງຢືນຜູ້ໃຫ້ບໍລິການສຳເລັດແລ້ວ',
browserTestSuccessHelper: 'ແຜນທີ່ການລະບຸຕົວຕົນໄດ້ຖືກສະແດງຕົວຢ່າງໂດຍບໍ່ມີການປ່ຽນຜູ້ໃຊ້ ຫຼືເຊດຊັນ.',
browserTestTitle: 'SAML2 ທົດສອບການເຂົ້າສູ່ລະບົບຂອງຕົວທ່ອງເວັບ',
browserTestWaiting: 'ກຳລັງລໍຖ້າການອະນຸຍາດຈາກຜູ້ໃຫ້ບໍລິການ',
browserTestWaitingHelper:
'ສຳເລັດການເຂົ້າສູ່ລະບົບໃນໜ້າຈໍໂປຣແກຣມທ່ອງເວັບໃໝ່. ໜ້ານີ້ຈະອັບເດດໂດຍອັດຕະໂນມັດ.',
certificateFileInvalid: 'ເລືອກໄຟລ໌ໃບຢັ້ງຢືນ PEM, CRT ຫຼື CER ທີ່ຖືກຕ້ອງ.',
configured: 'ຕັ້ງຄ່າແລ້ວ',
configurationFailedHelper:
'ການທົດສອບລົ້ມເຫຼວ. ໜ້ານີ້ສະແດງສະເພາະຂໍ້ຜິດພາດທີ່ backend ສົ່ງກັບມາໃນພາສາປະຈຸບັນ.',
configurationNotTested: 'ການຕັ້ງຄ່າປັດຈຸບັນຍັງບໍ່ໄດ້ຖືກທົດສອບ.',
configurationPassed: 'ການຕັ້ງຄ່າປັດຈຸບັນຜ່ານການກວດສອບຄວາມປອດໄພ ແລະຄວາມສາມາດ.',
configurationStaleHelper:
'ການ​ຕັ້ງ​ຄ່າ​ທີ່​ລະ​ອຽດ​ອ່ອນ​ການ​ກວດ​ສອບ​ໄດ້​ປ່ຽນ​ແປງ​. ທົດສອບສະບັບຮ່າງປະຈຸບັນອີກຄັ້ງ.',
configurationTestSuccess: 'ການທົດສອບການຕັ້ງຄ່າ SAML2 ສຳເລັດແລ້ວ.',
configurationTesting: 'ກຳລັງທົດສອບການຕັ້ງຄ່າ SAML2 ໃນປັດຈຸບັນ...',
conflictLDAP: 'ຜູ້ໃຊ້ LDAP',
conflictLocal: 'ຜູ້ໃຊ້ທ້ອງຖິ່ນ',
conflictNone: 'ບໍ່ມີຂໍ້ຂັດແຍ່ງ',
conflictOIDC: 'ຕົວຕົນ OIDC ອື່ນ',
conflictSAML2: 'ຕົວຕົນ SAML2 ອື່ນ',
conflictType: 'ປະເພດການຂັດແຍ້ງ',
credentialFileReadFailed: 'ບໍ່ສາມາດອ່ານໄຟລ໌ຂໍ້ມູນຢັ້ງຢືນໄດ້.',
credentialFileTooLarge: 'ໄຟລ໌ຂໍ້ມູນຢັ້ງຢືນຕ້ອງມີຂະໜາດບໍ່ເກີນ 256 KiB.',
credentialsRequired: 'ຕັ້ງຄ່າທັງກະແຈສ່ວນຕົວ ແລະໃບຢັ້ງຢືນຂອງ SP.',
defaultRole: 'ບົດບາດຜູ້ໃຊ້ໃໝ່',
defaultRoleHelper: 'ກຳນົດພຽງຄັ້ງທຳອິດ; ການເຂົ້າຄັ້ງຕໍ່ໄປຮັກສາບົດບາດ, MFA ແລະສິດທ້ອງຖິ່ນ.',
defaultRolePlaceholder: 'ເລືອກບົດບາດ',
defaultRoleRequired: 'ເລືອກບົດບາດເລີ່ມຕົ້ນທີ່ຖືກຕ້ອງ.',
disableConfirm:
'ການປິດໃຊ້ງານ SAML2 ຈະປະຕິເສດການເຂົ້າລະບົບໃໝ່ ແລະເຮັດໃຫ້ເຊດຊັນຜູ້ໃຊ້ໝົດຜົນທັນທີ. ສືບຕໍ່?',
disableDiscardConfirm:
'ການປິດໃຊ້ງານ SAML2 ຈະຍົກເລີກການປ່ຽນແປງອື່ນທີ່ຍັງບໍ່ໄດ້ບັນທຶກໃນໜ້ານີ້ ແລະເຮັດໃຫ້ເຊດຊັນຜູ້ໃຊ້ໝົດຜົນທັນທີ. ສືບຕໍ່?',
disableTitle: 'ປິດໃຊ້ງານ SAML2',
disabled: 'ປິດໃຊ້ງານ',
enable: 'ເປີດໃຊ້ງານ',
enabled: 'ເປີດໃຊ້ງານແລ້ວ',
idpMetadata: 'ຂໍ້ມູນເມຕາຂອງ IdP',
idpMetadataDesc: 'ໃສ່ URL ຫຼືວາງ XML. ຖ້າມີທັງສອງ URL ຈະຖືກໃຊ້ກ່ອນ.',
keepExistingRole: 'ຮັກສາບົດບາດທີ່ມີຢູ່ແລ້ວແລະການອະນຸຍາດທ້ອງຖິ່ນ',
loginWith: 'ເຂົ້າລະບົບດ້ວຍ {provider}',
mappingResult: 'ຜົນແຜນທີ່',
metadataRequired: 'ໃສ່ URL ຫຼື XML ຂອງ IdP Metadata.',
metadataURLHelper: 'backend ດາວໂຫຼດ ແລະກວດສອບ Metadata ໃນຂະນະທົດສອບ ແລະບັນທຶກ.',
metadataURLInvalid: 'ໃສ່ Metadata URL ແບບ HTTPS ທີ່ຖືກຕ້ອງ ໂດຍບໍ່ມີຂໍ້ມູນຢັ້ງຢືນ ຫຼື fragment.',
metadataURLRecommended: 'Metadata URL (ແນະນຳ)',
metadataXML: 'ຂໍ້ມູນເມຕາ XML',
metadataXMLHelper: 'ໃຊ້ເມື່ອ IdP ບໍ່ມີ Metadata URL ທີ່ສາມາດເຂົ້າເຖິງໄດ້.',
metadataXMLInvalid: 'ໃສ່ XML Metadata ແບບ EntityDescriptor ທີ່ຖືກຕ້ອງ.',
metadataXMLPlaceholder: 'ວາງ <EntityDescriptor>...</EntityDescriptor>',
nameAttribute: 'Attribute ຊື່ຜູ້ໃຊ້',
nameAttributeHelper:
'ອ່ານ Attribute ນີ້ຈາກ SAML Assertion ທີ່ກວດສອບແລ້ວ ແລະຈັບຄູ່ກັບຊື່ຜູ້ໃຊ້ 1Panel.',
nameAttributePlaceholder: 'ຕົວຢ່າງ: uid, username ຫຼື account',
nameAttributeRequired: 'ໃສ່ Attribute ຊື່ຜູ້ໃຊ້.',
notConfigured: 'ຍັງບໍ່ໄດ້ຕັ້ງຄ່າ',
or: 'ຫຼື',
pageDesc: 'ເຊື່ອມຕໍ່ SSO ອົງກອນຜ່ານ IdP Metadata ໃນໜ້າດຽວ.',
plannedHandling: 'ການຈັດການແຜນການ',
privateKeyFileInvalid: 'ເລືອກໄຟລ໌ກະແຈສ່ວນຕົວ PEM ທີ່ຖືກຕ້ອງ.',
recentTestSuccess: 'ການທົດສອບຄັ້ງສຸດທ້າຍປະສົບຜົນສໍາເລັດ: {0}',
restore: 'ກູ້ຄືນ',
restored: 'ການຕັ້ງຄ່າ SAML2 ທີ່ບັນທຶກໄວ້ຫຼ້າສຸດໄດ້ຖືກຟື້ນຟູຄືນມາ.',
roleHandling: 'ການຈັດການພາລະບົດບາດ',
rolesLoadFailed: 'ບໍ່ສາມາດໂຫຼດບົດບາດໄດ້. ລອງອີກຄັ້ງກ່ອນທີ່ຈະເລືອກບົດບາດເລີ່ມຕົ້ນ.',
selectFile: 'ເລືອກໄຟລ໌',
serviceStatus: 'ສະຖານະບໍລິການ',
serviceStatusDesc: 'ການຕັ້ງຄ່າປັດຈຸບັນຕ້ອງຜ່ານການທົດສອບກ່ອນເປີດໃຊ້ SAML2.',
settingLoadFailed: 'ການຕັ້ງຄ່າ SAML2 ບໍ່ສາມາດໂຫຼດໄດ້',
settingLoadFailedHelper:
'ແບບຟອມຖືກລັອກເພື່ອຫຼີກເວັ້ນການບັນທຶກການຕັ້ງຄ່າເລີ່ມຕົ້ນທີ່ຫວ່າງເປົ່າໃສ່ກັບການຕັ້ງຄ່າປັດຈຸບັນ. ລອງໃໝ່ຫຼັງຈາກການເຊື່ອມຕໍ່ຟື້ນຕົວ.',
spCertificate: 'ໃບຢັ້ງຢືນ SP',
spCertificateHelper: 'ເຜີຍແຜ່ໃນ SP Metadata ເພື່ອໃຫ້ IdP ກວດສອບຄຳຮ້ອງຂໍເຂົ້າ ແລະອອກລະບົບ.',
spCredentials: 'ກະແຈສ່ວນຕົວ ແລະໃບຢັ້ງຢືນ SP',
spCredentialsDesc:
'ໃຊ້ເພື່ອເຊັນຂໍ້ຄວາມເຂົ້າ ແລະອອກລະບົບ. ນະໂຍບາຍລາຍເຊັນ ແລະການກວດສອບຖືກກຳນົດໂດຍ backend.',
spPrivateKey: 'ກະແຈສ່ວນຕົວ SP',
spPrivateKeyHelper:
'ໃຊ້ເພື່ອເຊັນ AuthnRequest ແລະຂໍ້ຄວາມອອກລະບົບ. ກະແຈຈະຖືກເຂົ້າລະຫັດເມື່ອຈັດເກັບ ແລະບໍ່ຖືກສະແດງ.',
syncLogout: 'ອອກລະບົບແບບຊິງຄ໌',
syncLogoutHelper: 'ການອອກຈາກ 1Panel ຫຼື IdP ຈະອອກຈາກອີກຝ່າຍດ້ວຍ.',
testBeforeBrowserTest:
'ທົດສອບການຕັ້ງຄ່າປັດຈຸບັນກ່ອນທີ່ຈະເລີ່ມການທົດສອບການເຂົ້າສູ່ລະບົບຂອງຕົວທ່ອງເວັບ.',
testBeforeEnable: 'ທົດສອບການຕັ້ງຄ່າປັດຈຸບັນກ່ອນທີ່ຈະເປີດ ຫຼືບັນທຶກການປ່ຽນແປງທີ່ລະອຽດອ່ອນ.',
testConfiguration: 'ທົດສອບການຕັ້ງຄ່າ',
unsavedChanges: 'ມີການປ່ຽນແປງ SAML2 ທີ່ຍັງບໍ່ໄດ້ບັນທຶກ.',
usedAttribute: 'ການຈັບຄູ່ຊື່ຜູ້ໃຊ້',
usersAndRoles: 'ຜູ້ໃຊ້ ແລະບົດບາດ',
usersAndRolesDesc:
'ກຳນົດການຈັບຄູ່ຊື່ຜູ້ໃຊ້ແຜງ ແລະໂນດກັບບົດບາດເລີ່ມຕົ້ນທີ່ໃຊ້ສ້າງຜູ້ໃຊ້ໃນການເຂົ້າລະບົບຄັ້ງທຳອິດ.',
},
ldap: {
basic: 'ການຕັ້ງຄ່າພື້ນຖານ',
loginTitle: 'ເຂົ້າລະບົບ LDAP',
loginWith: 'ເຂົ້າລະບົບດ້ວຍ LDAP',
backToLocalLogin: 'ກັບໄປການເຂົ້າລະບົບແຜງ',
enable: 'ເປີດໃຊ້',
enabled: 'ເປີດໃຊ້ແລ້ວ',
disabled: 'ປິດໃຊ້ງານ',
@@ -5025,8 +5405,8 @@ const message = {
black: 'ຢູ່ໃນບັນຊີດຳ',
notBlack: 'ບໍ່ຢູ່ໃນບັນຊີດຳ',
fuzzy: 'ການຈັບຄູ່ແບບຄຸມເຄືອ',
regex: 'Regular Expression',
invalidRegex: 'ປ້ອນ RE2 Regular Expression ທີ່ຖືກຕ້ອງ ແລະ ຍາວບໍ່ເກີນ 256 ຕົວອັກສອນ',
regex: 'ນິພົດປົກກະຕິ',
invalidRegex: 'ປ້ອນນິພົດປົກກະຕິ RE2 ທີ່ຖືກຕ້ອງ ແລະ ຍາວບໍ່ເກີນ 256 ຕົວອັກສອນ',
created: 'ສ້າງວຽກສົ່ງອອກແລ້ວ',
fileName: 'ຊື່ໄຟລ໌',
fileSize: 'ຂະໜາດໄຟລ໌',
@@ -5035,6 +5415,7 @@ const message = {
deleteConfirm: 'ລຶບບັນທຶກການສົ່ງອອກ ແລະ ໄຟລ໌ນີ້ບໍ?',
},
waf: {
WAF: 'WAF',
name: 'WAF',
blackWhite: 'ລາຍຊື່ດຳ ແລະ ຂາວ',
globalSetting: 'ຕັ້ງຄ່າທົ່ວໄປ',
@@ -5099,6 +5480,7 @@ const message = {
provinceRuleLabel: 'ແຂວງ',
openRestyFeatureVersionAlert: 'OpenResty ຕ້ອງໃໝ່ກວ່າ 1.31.1.1-0 ເພື່ອໃຫ້ {0} ມີຜົນ.',
ipLocation: 'ທີ່ຕັ້ງ IP',
ipLocationSearchHelper: 'ປ້ອນທີ່ຕັ້ງ IP, ຮອງຮັບການຄົ້ນຫາແບບຄ້າຍຄື',
action: 'ການດຳເນີນການ',
ruleType: 'ປະເພດການໂຈມຕີ',
ipHelper: 'ປ້ອນທີ່ຢູ່ IP',
@@ -5136,7 +5518,7 @@ const message = {
ruleContent: 'ເນື້ອໃນ',
contain: 'ລວມມີ',
equal: 'ເທົ່າກັບ',
regex: 'Regular Expression',
regex: 'ນິພົດປົກກະຕິ',
notEqual: 'ບໍ່ເທົ່າກັບ',
customRuleHelper: 'ດຳເນີນການຕາມເງື່ອນໄຂທີ່ກຳນົດ',
actionAllow: 'ອະນຸຍາດ',
@@ -5258,7 +5640,7 @@ const message = {
attackCountNum: 'ຈຳນວນຄັ້ງ',
percent: 'ເປີເຊັນ',
addblackUrlHelper: 'ຕ້ອງການເພີ່ມ URL: {0} ເຂົ້າໃນບັນຊີດຳເລີ່ມຕົ້ນບໍ?',
rce: 'Remote Code Execution',
rce: 'ການປະຕິບັດໂຄດຈາກໄລຍະໄກ',
software: 'ຊອບແວ',
cveHelper: 'ລວມມີຊ່ອງໂຫວ່ຂອງຊອບແວ ແລະ Framework ທີ່ພົບເລື້ອຍ',
vulnCheck: 'ກົດເກນເພີ່ມເຕີມ',
@@ -5267,7 +5649,7 @@ const message = {
ua: 'ການເຂົ້າເຖິງໂດຍບໍ່ໄດ້ຮັບອະນຸຍາດ',
id: 'ຂໍ້ມູນຮົ່ວໄຫຼ',
aa: 'ການຂ້າມຜ່ານການຢືນຢັນຕົວຕົນ',
dr: 'Directory Traversal',
dr: 'ການຂ້າມໄດເຣັກທໍຣີ',
xxe: 'ຊ່ອງໂຫວ່ XXE',
suid: 'ຊ່ອງໂຫວ່ Serialization',
dos: 'ຊ່ອງໂຫວ່ Denial of Service',
@@ -5299,6 +5681,9 @@ const message = {
observationModeConfirm: 'ໃນໂໝດສັງເກດການ ການຈັບຄູ່ WAF ທັງໝົດຈະຖືກບັນທຶກໂດຍບໍ່ບລັອກຄຳຮ້ອງຂໍ. ຕ້ອງການຕໍ່ບໍ?',
globalStrictRequired: 'ກະລຸນາເປີດໂໝດເຂັ້ມງວດໃນການຕັ້ງຄ່າສ່ວນກາງກ່ອນ',
observe: 'ສັງເກດການ',
websiteSearchHelper: 'ປ້ອນໂດເມນ, ນາມແຝງ ຫຼື ໝາຍເຫດຂອງເວັບໄຊ',
configReadFailed: 'ໂຫຼດການຕັ້ງຄ່າບໍ່ສຳເລັດ',
detailSetting: 'ການຕັ້ງຄ່າລະອຽດ',
saveLog: 'ບັນທຶກ Log',
remoteURLHelper: 'Remote URL ຕ້ອງມີໜຶ່ງ IP ຕໍ່ແຖວ ແລະ ບໍ່ມີຕົວອັກສອນອື່ນ',
notFound: 'ບໍ່ພົບ (404)',
@@ -6054,7 +6439,7 @@ const message = {
dependencyPurpose: 'ຈຸດປະສົງ',
dependencyPurposeMap: {
libvirt: 'ໃຫ້ບໍລິການຈັດການ VM ສຳລັບຄວບຄຸມວົງຈອນຊີວິດ ແລະ ຈັດສັນຊັບພະຍາກອນ.',
storage: 'ສະໜອງໄດເຣັກທໍຣີ ຫຼື Storage Pool ເລີ່ມຕົ້ນສຳລັບໄຟລ໌ດິສກ໌ຂອງ VM.',
storage: 'ສະໜອງໄດເຣັກທໍຣີ ຫຼື ພູລຈັດເກັບເລີ່ມຕົ້ນສຳລັບໄຟລ໌ດິສກ໌ຂອງ VM.',
},
dependencyNotReady: 'ການກວດສອບສິ່ງຂຶ້ນກັບຂອງ VM ລົ້ມເຫຼວ. ກະລຸນາແກ້ໄຂກ່ອນໃຊ້ເຄື່ອງສະເໝືອນ.',
helperUnavailable: 'ເລີ່ມຕົ້ນຄວາມສາມາດ VM ລົ້ມເຫຼວ. ກວດສອບ Core Log ຫຼື ອັບເກຣດອີກຄັ້ງກ່ອນໃຊ້ VM.',
@@ -6085,7 +6470,7 @@ const message = {
needAttention: 'ຕ້ອງເອົາໃຈໃສ່',
normal: 'ປົກກະຕິ',
environmentRisk: 'ຣັນທາມ VM ຍັງບໍ່ພ້ອມ. ກະລຸນາແກ້ໄຂສິ່ງຂຶ້ນກັບ ຫຼື ບໍລິການ Virtualization.',
storageRisk: 'ການໃຊ້ Storage Pool {0} ຮອດ {1}% ແລ້ວ.',
storageRisk: 'ການໃຊ້ພູລຈັດເກັບ {0} ຮອດ {1}% ແລ້ວ.',
abnormalRisk: 'ມີ VM {0} ເຄື່ອງຢູ່ໃນສະຖານະຜິດປົກກະຕິ.',
pausedRisk: 'ມີ VM {0} ເຄື່ອງຖືກຢຸດຊົ່ວຄາວ.',
memoryRisk: 'ການຈັດສັນໜ່ວຍຄວາມຈຳຂອງ VM ຮອດ {0}% ແລ້ວ.',
@@ -6093,7 +6478,7 @@ const message = {
cpuLimitExceeded: 'CPU ເກີນຂີດຈຳກັດ. ສູງສຸດທີ່ໃຊ້ໄດ້ໃນປັດຈຸບັນ: {0} Core.',
memoryLimitHelper: 'ໜ່ວຍຄວາມຈຳທີ່ຈັດສັນໄດ້ໃນປັດຈຸບັນ: {0} (Host ຕ້ອງສຳຮອງໜ່ວຍຄວາມຈຳ {1})',
memoryLimitExceeded: 'ໜ່ວຍຄວາມຈຳເກີນຂີດຈຳກັດ. ສູງສຸດທີ່ຈັດສັນໄດ້ໃນປັດຈຸບັນ: {0}.',
storageLimitHelper: 'ພື້ນທີ່ວ່າງໃນ Storage Pool ເປົ້າໝາຍປັດຈຸບັນ: {0}',
storageLimitHelper: 'ພື້ນທີ່ວ່າງໃນພູລຈັດເກັບເປົ້າໝາຍປັດຈຸບັນ: {0}',
storageLimitExceeded: 'ຄວາມຈຸດິສກ໌ເກີນຂີດຈຳກັດ. ສູງສຸດທີ່ໃຊ້ໄດ້ໃນປັດຈຸບັນ: {0}.',
iso: 'ISO',
createFromTemplate: 'ສ້າງຈາກແມ່ແບບ',
@@ -6119,7 +6504,7 @@ const message = {
diskSize: 'ຂະໜາດດິສກ໌',
diskPath: 'ເສັ້ນທາງດິສກ໌',
isoPath: 'ເສັ້ນທາງ ISO',
storagePool: 'Storage Pool',
storagePool: 'ພູລຈັດເກັບ',
network: 'ເຄືອຂ່າຍ',
bridgeName: 'ຊື່ Bridge',
natNetworkHelper: 'VM ສາມາດເຂົ້າເຄືອຂ່າຍຜ່ານ Host, ແຕ່ອຸປະກອນພາຍນອກໂດຍທົ່ວໄປບໍ່ສາມາດເຂົ້າ VM ໂດຍກົງໄດ້.',
@@ -6127,9 +6512,9 @@ const message = {
'ເຊື່ອມຕໍ່ VM ກັບ Bridge ທີ່ມີຢູ່ໃນ Host (ເຊັ່ນ br0). ຖ້າ Host ມີ NIC ເພີ່ມເຕີມທີ່ບໍ່ໄດ້ໃຊ້ ໃຫ້ສ້າງ Bridge ສຳລັບມັນແລ້ວນຳມາໃຊ້.',
bridgeNameHelper:
'ເລືອກ Linux Bridge ທີ່ມີຢູ່ໃນ Host ເຊັ່ນ br0. NIC ກາຍະພາບບໍ່ແມ່ນ Bridge ແລະ ບໍ່ສາມາດເລືອກ Bridge ທີ່ docker/libvirt ຈັດການໄດ້.',
natCIDRHelper: 'CIDR, Gateway ແລະ ຊ່ວງ DHCP ຈະຖືກໃຊ້ໂດຍເຄືອຂ່າຍສະເໝືອນ NAT ໃໝ່.',
natCIDRHelper: 'CIDR, ປະຕູເຄືອຂ່າຍ ແລະ ຊ່ວງ DHCP ຈະຖືກໃຊ້ໂດຍເຄືອຂ່າຍສະເໝືອນ NAT ໃໝ່.',
networkCIDR: 'CIDR ເຄືອຂ່າຍ',
gateway: 'Gateway',
gateway: 'ປະຕູເຄືອຂ່າຍ',
dhcpStart: 'DHCP ເລີ່ມຕົ້ນ',
dhcpEnd: 'DHCP ສິ້ນສຸດ',
bootOrder: 'ລຳດັບການບູດ',
@@ -6155,17 +6540,17 @@ const message = {
renameRunningHelper: 'ກະລຸນາປິດເຄື່ອງສະເໝືອນກ່ອນປ່ຽນຊື່.',
cpuUsage: 'ການໃຊ້ CPU',
memoryUsage: 'ການໃຊ້ໜ່ວຍຄວາມຈຳ',
diskIO: 'Disk IO',
networkIO: 'Network IO',
diskIO: 'I/O ດິສກ໌',
networkIO: 'I/O ເຄືອຂ່າຍ',
diskReadWrite: 'ອ່ານ / ຂຽນດິສກ໌',
networkRxTx: 'Network RX / TX',
networkRxTx: 'RX / TX ເຄືອຂ່າຍ',
rx: 'RX',
tx: 'TX',
console: 'Console',
consoleNotReady: 'VNC Console ໃຊ້ງານບໍ່ໄດ້. ກະລຸນາເລີ່ມ VM ແລະ ກວດສອບການຕັ້ງຄ່າກຣາຟິກ VNC.',
consoleDisconnected: 'VNC Console ຖືກຕັດການເຊື່ອມຕໍ່ແລ້ວ.',
consoleConnectFailed: 'ເຊື່ອມຕໍ່ VNC Console ລົ້ມເຫຼວ. ກວດສອບບໍລິການ Console Proxy.',
consoleCredentialsRequired: 'VNC Console ຕ້ອງການຂໍ້ມູນຢືນຢັນ. ກວດສອບການຕັ້ງຄ່າ Backend Proxy.',
console: 'ຄອນໂຊນ',
consoleNotReady: 'ຄອນໂຊນ VNC ໃຊ້ງານບໍ່ໄດ້. ກະລຸນາເລີ່ມ VM ແລະ ກວດສອບການຕັ້ງຄ່າກຣາຟິກ VNC.',
consoleDisconnected: 'ຄອນໂຊນ VNC ຖືກຕັດການເຊື່ອມຕໍ່ແລ້ວ.',
consoleConnectFailed: 'ເຊື່ອມຕໍ່ຄອນໂຊນ VNC ລົ້ມເຫຼວ. ກວດສອບບໍລິການພຣັອກຊີຄອນໂຊນ.',
consoleCredentialsRequired: 'ຄອນໂຊນ VNC ຕ້ອງການຂໍ້ມູນຢືນຢັນ. ກວດສອບການຕັ້ງຄ່າພຣັອກຊີ backend.',
snapshot: 'ສະແນັບຊັອດ',
createSnapshot: 'ສ້າງສະແນັບຊັອດ',
recoverSnapshot: 'ກູ້ຄືນສະແນັບຊັອດ',
@@ -6178,7 +6563,7 @@ const message = {
'ບໍ່ສາມາດລຶບສະແນັບຊັອດປັດຈຸບັນໄດ້. ກູ້ຄືນສະແນັບຊັອດໄດ້ສະເພາະເມື່ອປິດເຄື່ອງສະເໝືອນ.',
snapshotRecoverConfirm:
'ກູ້ຄືນເຄື່ອງສະເໝືອນ [{1}] ໄປທີ່ສະແນັບຊັອດ [{0}] ບໍ? ດິສກ໌ VM ຈະຖືກກູ້ຄືນເປັນສະຖານະຂອງສະແນັບຊັອດ.',
interface: 'Network Interface',
interface: 'ສ່ວນຕິດຕໍ່ເຄືອຂ່າຍ',
device: 'ອຸປະກອນ',
path: 'ເສັ້ນທາງ',
start: 'ເລີ່ມ',

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -14,6 +14,7 @@ const message = {
next: 'Sonraki',
create: 'Oluştur',
add: 'Ekle',
select: 'Seç',
save: 'Kaydet',
set: 'Ayarlar',
sync: 'Senkronize Et',
@@ -27,7 +28,6 @@ const message = {
setDefault: 'Varsayılanları Geri Yükle',
restart: 'Yeniden Başlat',
conn: 'Bağlan',
disconn: 'Bağlantıyı Kes',
clean: 'Temizle',
cleanAll: 'Tümünü temizle',
selectAll: 'Tümünü seç',
@@ -57,6 +57,7 @@ const message = {
power: 'Gönder',
search: 'Ara',
refresh: 'Yenile',
reconnect: 'Yeniden bağlan',
get: 'Al',
upgrade: 'Yükselt',
update: 'Güncelle',
@@ -166,6 +167,7 @@ const message = {
deleteSuccess: 'Başarıyla silindi',
loginSuccess: 'Başarıyla giriş yapıldı',
operationSuccess: 'Başarıyla tamamlandı',
operationFailed: 'İşlem başarısız',
copySuccess: 'Başarıyla kopyalandı',
notSupportOperation: 'Bu işlem desteklenmiyor',
requestTimeout: 'İstek zaman ımına uğradı, lütfen daha sonra tekrar deneyin',
@@ -198,7 +200,7 @@ const message = {
creatingInfo: 'Oluşturuluyor, bu işlem gerekli değil',
installSuccess: 'Yükleme başarılı',
uninstallSuccess: 'Kaldırma başarılı',
offlineTips: 'A versão offline não suporta esta operação',
offlineTips: 'Çevrimdışı sürüm bu işlemi desteklemiyor',
errImportFormat: 'İçe aktarma verisi veya biçimi anormal, lütfen kontrol edip tekrar deneyin!',
importHelper:
'Çakışan veya yinelenen verileri içe aktarırken, içe aktarılan içerik orijinal veritabanı verilerini güncellemek için standart olarak kullanılacaktır.',
@@ -210,6 +212,7 @@ const message = {
username: 'Kullanıcı adı',
password: 'Şifre',
passkey: 'Passkey ile giriş',
otherLoginMethods: 'Diğer giriş yöntemleri',
welcome: 'Tekrar hoş geldiniz, giriş yapmak için kullanıcı adınızı ve şifrenizi girin!',
errorAuthInfo: 'Girdiğiniz kullanıcı adı veya şifre yanlış, lütfen tekrar girin!',
errorMfaInfo: 'Yanlış kimlik doğrulama bilgisi, lütfen tekrar deneyin!',
@@ -291,6 +294,9 @@ const message = {
length128Err: 'Uzunluk 128 karakteri geçemez',
maxLength: 'Uzunluk {0} karakteri geçemez',
alias: 'İngilizce, rakamlar, - ve _ destekler, uzunluk 1-128, ve -_ ile başlayamaz veya bitiremez.',
vmName: 'İngilizce harfler, sayılar, ".", "-" ve "_" desteklenir; uzunluk 1-64 olmalı ve bir harf veya sayıyla başlamalıdır.',
vmNetwork:
'İngilizce harfler, sayılar, ".", ":", "-" ve "_" desteklenir; uzunluk 1-64 olmalı ve bir harf veya sayıyla başlamalıdır.',
},
res: {
paramError: 'İstek başarısız, lütfen daha sonra tekrar deneyin!',
@@ -472,7 +478,7 @@ const message = {
cpuSteal: 'Çalıntı',
cpuTop: 'CPU Kullanımına Göre İlk 5 İşlem',
memTop: 'Bellek Kullanımına Göre İlk 5 İşlem',
loadAverage: 'Son 1 dakikadaki yük ortalaması | Son {n} dakikadaki yük ortalaması',
loadAverage: 'Son {0} dakikadaki yük ortalaması',
load: 'Yük',
mount: 'Bağlama noktası',
fileSystem: 'Dosya sistemi',
@@ -508,6 +514,7 @@ const message = {
deleteBackupHelper: 'Veritabanı yedeklerini aynı anda sil',
delete: 'Silme işlemi geri alınamaz, lütfen "',
deleteHelper: '" girerek bu veritabanını silin',
deleteUserHelper: '" girerek bu kullanıcıyı silin',
userBoundDatabases: 'aşağıdaki veritabanlarına erişebilir:',
noMysql: 'Veritabanı hizmeti (MySQL veya MariaDB)',
noPostgresql: 'Veritabanı hizmeti PostgreSQL',
@@ -558,6 +565,7 @@ const message = {
revokeAuthorizationHelper: '{0} kullanıcısının {1} veritabanına erişimi kaldırılsın mı?',
supplementPassword: 'Parola ekle',
supplementPasswordHelper: 'Yalnızca mevcut parolayı 1Panel içine kaydeder; MySQL parolasını değiştirmez.',
noUserBind: 'Bağlantı yok',
pgBindHelper:
'Bu işlem yeni bir kullanıcı oluşturmak ve hedef veritabanına bağlamak için kullanılır. Şu anda veritabanında mevcut olan kullanıcıları seçmek desteklenmiyor.',
pgSuperUser: 'Süper Kullanıcı',
@@ -1005,9 +1013,6 @@ const message = {
failureCount: 'Hata sayısı',
lastError: 'Son hata',
modelMap: 'Model eşlemesi',
apiKeyKeepEmpty: 'API Key (değiştirmemek için boş bırakın)',
apiKeyOnceHint: 'API Key oluşturulduktan sonra yalnızca bir kez gösterilir. Şimdi kopyalayıp kaydedin.',
apiKeyOnceSave: 'API Key yalnızca bir kez gösterilir. Şimdi kaydedin:',
qpsLimit: 'QPS sınırı',
tokenLimit: 'Token sınırı',
tokenUsed: 'Kullanılan Token',
@@ -1149,23 +1154,23 @@ const message = {
modelGroupGuide:
'Model grupları AI Ağ Geçidinin sunduğu istek modeli adlarını içerir. Üst modelleri hesap havuzundaki model eşlemesinde yapılandırın. auto sanal bir model adıdır ve model grubuna eklenmez.',
modelGroupModelCount: '{0} model',
contentCompliance: 'Content Compliance',
contentAction: 'Action',
actionBlock: 'Block',
actionAuditOnly: 'Audit only',
contentCompliance: 'İçerik Uyumluluğu',
contentAction: 'Eylem',
actionBlock: 'Engelle',
actionAuditOnly: 'Yalnızca denetle',
actionDropHistory: 'Geçmişi sil',
severity: 'Severity',
severityHigh: 'High',
severityMedium: 'Medium',
severityLow: 'Low',
sensitiveWord: 'Sensitive word',
sensitiveGroup: 'Sensitive word group',
sensitiveWordCount: 'Words',
normalizedWord: 'Normalized word',
matchedWords: 'Matched words',
matchedGroups: 'Matched groups',
importResult: 'Imported {0}, duplicated {1}, invalid {2}',
auditLogs: 'Audit Logs',
severity: 'Önem Derecesi',
severityHigh: 'Yüksek',
severityMedium: 'Orta',
severityLow: 'Düşük',
sensitiveWord: 'Hassas kelime',
sensitiveGroup: 'Hassas kelime grubu',
sensitiveWordCount: 'Kelimeler',
normalizedWord: 'Normalleştirilmiş kelime',
matchedWords: 'Eşleşen kelimeler',
matchedGroups: 'Eşleşen gruplar',
importResult: 'İçe aktarılan {0}, yinelenen {1}, geçersiz {2}',
auditLogs: 'Denetim Günlükleri',
smartRoute: 'Akıllı Yönlendirme',
smartRouteGuideTitle: 'Akıllı yönlendirme için istemcide model=auto kullanın',
smartRouteGuideReady:
@@ -1485,14 +1490,14 @@ const message = {
streamableHttpPathHelper: 'Örneğin: /mcp, diğer Sunucularla çakışmaması gerektiğine dikkat edin',
npxHelper: 'npx veya ikili dosya ile başlatılan mcp için uygundur',
uvxHelper: 'uvx ile başlatılan mcp için uygundur',
protocolVersion: 'Protocol Version',
protocolVersion: 'Protokol Sürümü',
protocolVersionHelper:
'Only used by stateless Streamable HTTP to auto-initialize the downstream stdio MCP Server',
"Yalnızca durum bilgisi tutmayan Streamable HTTP tarafından aşağı akış stdio MCP Server'ı otomatik olarak başlatmak için kullanılır",
gatewayArgsHelper:
'Bağımsız değişkenler supergateway komutuna eklenir. 1Panel tarafından yönetilen aktarım, bağlantı noktası, yol ve protokol bağımsız değişkenleri değiştirilemez',
testConnection: 'Test Connection',
connectionSuccess: 'Connection succeeded',
connectionFailed: 'Connection failed',
testConnection: 'Bağlantıyı Test Et',
connectionSuccess: 'Bağlantı başarılı',
connectionFailed: 'Bağlantı başarısız',
},
tensorRT: {
llm: 'TensorRT LLM',
@@ -1567,8 +1572,9 @@ const message = {
lastHour: 'Son saat',
last10Min: 'Son 10 dakika',
cleanLog: 'Log temizle',
cleanLogscope: 'Temizleme türü',
downLogHelper1: 'Bu, {0} konteynerinden tüm logları indirecektir. Devam etmek istiyor musunuz?',
downLogHelper2: 'Bu, {0} konteynerinden son {0} logunu indirecektir. Devam etmek istiyor musunuz?',
downLogHelper2: 'Bu, {0} konteynerindeki en son {1} günlük kaydını indirecektir. Devam etmek istiyor musunuz?',
cleanLogHelper:
'Bu, konteynerin yeniden başlatılmasını gerektirir ve geri alınamaz. Devam etmek istiyor musunuz?',
newName: 'Yeni ad',
@@ -1773,7 +1779,8 @@ const message = {
dockerStatus: 'Docker Servisi',
daemonJsonPathHelper: 'Yapılandırma yolunun docker.servicede belirtilen ile aynı olduğundan emin olun.',
mirrors: 'Kayıt defteri aynaları',
mirrorsHelper: '',
mirrorsHelper:
"İmaj işlemlerinde önce kayıt defteri yansıtma URL'lerini kullanın. Kayıt defteri yansıtmalarını devre dışı bırakmak için boş bırakın.",
mirrorsHelper2: 'Ayrıntılar için resmi belgelere bakın. ',
registries: 'Güvenli olmayan kayıt defterleri',
ipv6Helper:
@@ -1837,7 +1844,6 @@ const message = {
stopHelper: 'Bu işlem mevcut görev yürütmesini zorla durduracaktır. Devam etmek istiyor musunuz?',
log: 'Yedekleme logları',
logHelper: 'Sistem logunu yedekle',
ogHelper1: '1.1Panel Sistem logu ',
logHelper2: '2. Sunucunun SSH giriş logu ',
logHelper3: '3. Tüm site logları ',
containerCheckBox: 'Konteynerde (konteyner komutunu girmeye gerek yok)',
@@ -2302,6 +2308,7 @@ const message = {
nodes: 'Düğüm',
commands: 'Hızlı Komutlar',
opsReport: 'Operasyon Raporu',
ops_report: 'Operasyon Raporu',
users: 'Kullanıcı yönetimi',
roles: 'Rol',
auth: 'Giriş kimlik doğrulaması',
@@ -2491,42 +2498,42 @@ const message = {
'Sol tarafta geçmiş sürümünün içeriği, sağ tarafta seçilen dosyanın en son sürümü gösterilir',
copyDir: 'Kopyala',
shareFile: 'Dosyayı paylaş',
shareExpire: 'Expires in',
shareExpire1h: '1 hour',
shareExpire6h: '6 hours',
shareExpire24h: '24 hours',
shareExpire3d: '3 days',
shareExpire7d: '7 days',
sharePassword: 'Password',
sharePasswordPlaceholder: 'Leave empty for no password',
shareMaxDownloads: 'Max downloads',
shareMaxDownloadsHint: '0 means unlimited',
shareGenerate: 'Create link',
shareRegenerate: 'Share again',
shareClose: 'Close',
shareExpire: 'Geçerlilik süresi',
shareExpire1h: '1 saat',
shareExpire6h: '6 saat',
shareExpire24h: '24 saat',
shareExpire3d: '3 gün',
shareExpire7d: '7 gün',
sharePassword: 'Parola',
sharePasswordPlaceholder: 'Parola kullanmamak için boş bırakın',
shareMaxDownloads: 'En fazla indirme',
shareMaxDownloadsHint: '0 sınırsız anlamına gelir',
shareGenerate: 'Bağlantı oluştur',
shareRegenerate: 'Yeniden paylaş',
shareClose: 'Kapat',
shareCancel: 'Paylaşımı iptal et',
shareCancelConfirm: 'Bu dosya paylaşımını iptal etmek istediğinize emin misiniz?',
shareDetail: 'Details',
shareCopyLink: 'Copy link',
shareLinkLabel: 'Share link',
shareQrCode: 'QR code',
shareQrDialogTitle: 'Share link QR code',
shareQrDialogHelper: 'Scan this QR code with your mobile device',
shareSaveImage: 'Save image',
shareOpenImage: 'Open image',
shareExtractFile: 'Extract file',
shareDownloadingHint: 'Preparing your file, download will begin shortly.',
shareInvalid: 'Invalid or expired share link',
shareDownloadFailed: 'Download failed, please try again later',
sharePasswordRequired: 'Password',
sharePasswordRequiredInput: 'Please enter the share password',
sharePasswordLengthHint: 'Share password length must be 4-256 characters',
shareDownloadPasswordTip: 'This link is password-protected. Enter the password before downloading.',
shareDetail: 'Ayrıntılar',
shareCopyLink: 'Bağlantıyı kopyala',
shareLinkLabel: 'Paylaşım bağlantısı',
shareQrCode: 'QR kodu',
shareQrDialogTitle: 'Paylaşım bağlantısı QR kodu',
shareQrDialogHelper: 'Bu QR kodunu mobil cihazınızla tarayın',
shareSaveImage: 'Görüntüyü kaydet',
shareOpenImage: 'Görüntüyü aç',
shareExtractFile: 'Dosyayı al',
shareDownloadingHint: 'Dosyanız hazırlanıyor. İndirme kısa süre içinde başlayacak.',
shareInvalid: 'Geçersiz veya süresi dolmuş paylaşım bağlantısı',
shareDownloadFailed: 'İndirme başarısız oldu. Daha sonra tekrar deneyin',
sharePasswordRequired: 'Erişim parolası',
sharePasswordRequiredInput: 'Paylaşım parolasını girin',
sharePasswordLengthHint: 'Paylaşım parolası 4-256 karakter uzunluğunda olmalıdır',
shareDownloadPasswordTip: 'Bu bağlantı parola korumalıdır. İndirmeden önce parolayı girin.',
shareRiskAlert:
'Shared links may carry security risks. Only share with trusted people and avoid exposing sensitive information.',
'Paylaşılan bağlantılar güvenlik riski taşıyabilir. Yalnızca güvendiğiniz kişilerle paylaşın ve hassas bilgileri açığa çıkarmayın.',
sharePasswordSeparate:
'A password is set. Share it securely. Recipients must add &password=... to the URL or use a client that can pass the password query parameter.',
shareExpiresAt: 'Expires at',
'Bir parola ayarlandı. Güvenli biçimde paylaşın. Alıcılar URLye &password=... eklemeli veya parola sorgu parametresini iletebilen bir istemci kullanmalıdır.',
shareExpiresAt: 'Bitiş zamanı',
paste: 'Yapıştır',
changeOwner: 'Kullanıcı ve kullanıcı grubunu değiştir',
containSub: 'İzin değişikliğini özyinelemeli olarak uygula',
@@ -3135,7 +3142,7 @@ const message = {
recoverHelper3:
'Sunucu mimarisinin, anlık görüntünün oluşturulduğu sunucu mimarisiyle eşleştiğinden emin olun (Geçerli sunucu mimarisi: {0})',
recoverHelper4:
'Bu işlem yalnızca ana düğümü geri alır. Yükseltilmiş alt düğümler varsa, devam etmeden önce önce bunları geri alın.',
'Bu işlem yalnızca ana düğümü geri alır. Yükseltilmiş alt düğümler varsa, devam etmeden önce bunları geri alın.',
rollback: 'Geri al',
rollbackHelper:
'Bu kurtarmayı geri almak, bu kurtarmadan gelen tüm dosyaları değiştirecek ve Docker ile 1Panel servislerinin yeniden başlatılmasını gerektirebilir. Devam etmek istiyor musunuz?',
@@ -3280,6 +3287,7 @@ const message = {
fileExchange: 'Ticari sürüme yükselterek birden fazla sunucu arasında dosyaları hızlıca aktarabilirsiniz.',
app: 'Ticari sürüme yükselterek mobil uygulamada hizmet bilgilerini ve anormallik izlemeyi görüntüleyebilirsiniz.',
cluster: 'Ticari sürüme yükselterek MySQL/Postgres/Redis birincil-kopya kümelerini yönetebilirsiniz.',
vllm: 'Ticari sürüme yükselterek vLLM hizmetlerini 1Panel içinde merkezi olarak dağıtabilir, yapılandırabilir, yaşam döngüsünü yönetebilir ve görevleri izleyebilirsiniz.',
'model-downloader':
'Ticari sürüme yükselterek HuggingFace, ModelScope veya uyumlu aynalardan yerel model dosyalarını arayabilir, indirebilir ve yönetebilir; model dizinlerini ve indirme görevlerini merkezi olarak takip edebilirsiniz.',
},
@@ -3289,7 +3297,6 @@ const message = {
clean: 'Şimdi temizle',
reScan: 'Yeniden tara',
cleanHelper: 'Seçilen dosya ve dizinler temizlendikten sonra geri alınamaz. Devam etmek istiyor musunuz?',
statusStatusSuggest: '(Temizlik Önerilir)',
statusClean: '(Çok temiz)',
statusEmpty: 'Çok temiz, temizlik gerekmiyor!',
statusWarning: '(Dikkatli İlerleyin)',
@@ -3804,16 +3811,16 @@ const message = {
strategy: 'Strateji',
strategyDown: 'Kapalı',
strategyBackup: 'Yedek',
ipHashBackupErr: 'IP 哈希不支持备用节点',
ipHashBackupErr: 'IP hash yedek düğümleri desteklemez',
failTimeout: 'Hata zaman aşımı',
failTimeoutHelper:
'Sunucu sağlık kontrolleri için zaman penceresi uzunluğu. Bu süre içinde biriken hata sayısı eşiğe ulaştığında, sunucu geçici olarak kaldırılacak ve aynı süre sonunda yeniden denenir. Varsayılan 10 saniye',
staticChangePHPHelper: 'Şu anda statik bir web sitesi, PHP web sitesine geçiş yapabilirsiniz',
proxyCache: 'Ters Vekil Önbelleği',
cacheLimit: 'Önbellek Alanı Sınırı',
shareCahe: 'Önbellek Sayısı Bellek Boyutu',
shareCache: 'Önbellek Sayısı Bellek Boyutu',
cacheExpire: 'Önbellek Son Kullanma Süresi',
shareCaheHelper: 'Yaklaşık olarak 1M bellek başına 8000 önbellek nesnesi saklanabilir',
shareCacheHelper: 'Yaklaşık olarak 1M bellek başına 8000 önbellek nesnesi saklanabilir',
cacheLimitHelper: 'Sınır aşıldığında eski önbellek otomatik olarak silinir',
cacheExpireJHelper: 'Önbellek, son kullanma süresinden sonra kaçırılırsa silinir',
realIP: 'Gerçek IP',
@@ -3890,7 +3897,7 @@ const message = {
max_file_uploads: 'Aynı anda yüklenebilecek maksimum dosya sayısı',
default_socket_timeout: 'Soket zaman aşımı',
error_reporting: 'Hata seviyesi',
display_errors: 'Ayrıntılı hata bilgilerinin 출력lenip 출력lenmeyeceği',
display_errors: 'Ayrıntılı hata bilgilerinin görüntülenip görüntülenmeyeceği',
cgi_fix_pathinfo: 'Pathinfonun açılıp açılmayacağı',
date_timezone: 'Zaman dilimi',
disableFunction: 'Devre dışı bırakma fonksiyonu',
@@ -4171,6 +4178,7 @@ const message = {
},
runtime: {
runtime: 'Çalışma Zamanı',
default: 'Varsayılan',
workDir: 'Çalışma dizini',
localHelper: 'Yerel ortam kurulumu ve çevrimdışı ortam kullanımı sorunları için lütfen bakın ',
versionHelper: 'PHP sürümü, ör. v8.0',
@@ -4477,8 +4485,10 @@ const message = {
scorePanelHTTPSDisabled: 'Panel HTTPS devre dışı',
scoreSSHRootLogin: 'SSH root girişi etkin',
scoreSSHPasswordAuth: 'SSH şifre doğrulaması etkin, anahtar doğrulaması devre dışı',
scoreSSLExpired: '{0} sertifikasının süresi doldu',
scoreSSLHigh: '{0} sertifikasının {1} günü kaldı',
scoreSSLMedium: '{0} sertifikasının {1} günü kaldı',
scoreWebsiteExpired: '{0} web sitesinin süresi doldu',
scoreWebsiteExpire: '{0} web sitesinin {1} günü kaldı',
scoreWebsiteHTTP: '{0} HTTPS kullanmıyor',
scoreWebsiteStopped: '{0} durumu anormal',
@@ -4524,6 +4534,7 @@ const message = {
panelLogin: 'Panel Girişi',
sshLogin: 'SSH Girişi',
failedRecord: 'Başarısız Kayıtlar',
expired: 'Süresi doldu',
expiredDays: '{0} gün önce süresi doldu',
remainingDays: '{0} · {1} gün kaldı',
enabled: 'Etkin',
@@ -4788,9 +4799,9 @@ const message = {
abnormalSites: 'Anormal Siteler',
count5xxSource: '5xx isteklere göre sayılır',
wafIntercept: 'WAF Engelleme',
highRiskHit: 'Yüksek Riskli Eşleşme',
websiteMonitorDisabledOrNoData: 'Web sitesi izleme devre dışı veya izleme verisi yok',
wafDisabledOrNoData: 'WAF devre dışı veya engelleme verisi yok',
serviceEnabledButAbnormal: 'Etkin, ancak durumu anormal',
noWafData: 'WAF engelleme verisi yok',
sourceIP: 'Kaynak IP',
hitCount: 'Eşleşme Sayısı',
@@ -4851,6 +4862,7 @@ const message = {
successRate: 'Başarı Oranı',
failedJobs: 'Başarısız Görevler',
recentRecoveryPoint: 'Son Kurtarma Noktası',
disabledCronjobTasks: 'Devre dışı zamanlanmış görevler',
remoteCoverage: 'Uzak Kapsama',
recent7Days: 'Son 7 gün',
taskTypeStats: 'Görev Türü İstatistikleri',
@@ -4872,6 +4884,7 @@ const message = {
cronjobReasonDisabled: '{0} görev devre dışı',
cronjobReasonLocalOnlyBackup: '{0} yalnızca yerel yedek görevi',
cronjobReasonNormal: 'Görev yürütme ve yedekleme kapsamı normal',
riskLow: 'Düşük Risk',
viewFailedRecords: 'Başarısız Görevleri Gör',
viewCronjobTasks: 'Zamanlanmış Görevleri Gör',
checkBackupTasks: 'Yedek Görevlerini Kontrol Et',
@@ -4972,6 +4985,14 @@ const message = {
authManage: 'Kimlik doğrulama yönetimi',
auth: {
providerNavigation: 'Kimlik doğrulama sağlayıcıları',
defaultNode: 'Varsayılan düğüm',
defaultNodePlaceholder: 'Bir düğüm seçin',
defaultNodeHelper: 'Yalnızca yeni kullanıcılar için.',
defaultNodeRequired: 'Geçerli bir varsayılan düğüm seçin.',
nodesLoadFailed: 'Düğümler yüklenemedi. Varsayılan düğümü seçmeden önce yeniden deneyin.',
nodeHandling: 'Düğüm işlemi',
assignDefaultNode: 'Varsayılan düğümü ata: {node}',
keepExistingNode: 'Mevcut düğüm izinlerini koru',
providers: {
ldap: 'AD/LDAP',
passkey: 'Passkey',
@@ -4999,7 +5020,416 @@ const message = {
planned: 'Planlanan',
plannedTitle: '{0} kimlik doğrulama ayarları',
plannedDesc: 'Bu kimlik doğrulama sağlayıcısı planlanmıştır ve henüz kullanılamamaktadır.',
oidc: {
accessMode: 'Bağlantı modu',
accessModeDesc: "Kimlik sağlayıcının desteklediği durumlarda standart Discovery'i kullanın.",
actionCreate: 'Kullanıcı oluştur',
actionKeepName: 'Mevcut kullanıcı adını koruyun',
actionPending: 'Sonuç bekleniyor',
actionReject: 'Giriş yapmayı reddet',
actionUpdate: 'Kimlik bilgilerini güncelle',
advanced: 'Gelişmiş ayarlar',
advancedDesc:
'Sağlayıcı bir uyumluluk seçeneği gerektirmediği sürece güvenli varsayılanları koruyun.',
assignDefaultRole: 'Varsayılan rolü ata: {role}',
authorizationEndpoint: 'Authorization Endpoint',
authorizationEndpointInvalid: 'Geçerli bir Authorization Endpoint girin.',
authorizationFlow: 'Yetkilendirme akışı',
automatic: 'Otomatik',
automaticPolicy: 'Otomatik işleme politikası',
automaticPolicyDesc: 'Bu kurallar arka uç tarafından uygulanır ve yönetici anahtarları değildir.',
basic: 'Temel ayarlar',
basicDesc: 'Sağlayıcı modunu seçin, ardından istemciyi ve geri aramayı yapılandırın.',
browserTest: 'Tarayıcı test girişi',
browserTestConflict: 'Kimlik doğrulandı ancak kullanıcı adı çakışıyor',
browserTestConflictHelper:
'Eşlenen kullanıcı adı başka bir kimliğe aittir ve talep edilmeyecektir.',
browserTestExpired: 'Tarayıcı testinin süresi doldu',
browserTestExpiredHelper:
'Yeni bir tarayıcı testi başlatın ve süresi dolmadan yetkilendirmeyi tamamlayın.',
browserTestFailed: 'Tarayıcı testi başarısız oldu',
browserTestFailedHelper:
'Kimlik önizlemesi tamamlanamadı. Yerelleştirilmiş arka uç hatasını inceleyin.',
browserTestIsolation:
'Bu işlem gerçek bir yetkilendirme gidiş-dönüşü gerçekleştirir ancak kullanıcı oluşturmaz veya güncellemez, rol atamaz ya da kimliği doğrulanmış bir panel oturumu oluşturmaz.',
browserTestPopupBlocked:
'Bu site için açılır pencerelere izin verin, ardından tarayıcı testini yeniden başlatın.',
browserTestPopupClosed: 'Yetkilendirme penceresi test tamamlanmadan kapatıldı.',
browserTestSuccess: 'Provider doğrulaması başarılı oldu',
browserTestSuccessHelper:
'Kimlik eşlemenin önizlemesi, kullanıcıları veya oturumları değiştirmeden yapıldı.',
browserTestTitle: 'OIDC tarayıcı testi girişi',
browserTestWaiting: 'Provider yetkilendirmesi bekleniyor',
browserTestWaitingHelper:
'Yeni tarayıcı penceresinde oturum açma işlemini tamamlayın. Bu sayfa otomatik olarak güncellenecektir.',
callbackCopied: 'OIDC geri arama URL kopyalandı.',
callbackURL: 'Geri arama URL',
callbackURLHelper:
"Bu URL'yi kimlik sağlayıcıdaki istemcinin izin verilen geri çağırma URL'lerine ekleyin.",
cancelClearSecret: 'Temizlemeyi iptal et',
clearSecret: 'Sırrı temizle',
clearSecretConfirm: 'Client Secret yalnızca kaydettikten sonra kaldırılacaktır. Devam etmek?',
clientAuthMethod: 'İstemci kimlik doğrulama yöntemi',
clientAuthMethodHelper:
'Kimlik sağlayıcıda bu istemci için yapılandırılan kimlik doğrulama yöntemini seçin.',
clientAuthMethodRequired: 'Bir istemci kimlik doğrulama yöntemi seçin.',
clientID: 'Client ID',
clientIDRequired: "Client ID'i girin.",
clientSecret: 'Client Secret',
clockSkew: 'Token zaman toleransı',
clockSkewHelper:
'Kimlik sağlayıcı ile 1Panel arasındaki küçük zaman farklarına izin verir. Varsayılan 60 saniyeyi koruyun.',
clockSkewRequired: 'Token zaman toleransını girin.',
compatibilityMode: 'Uyumluluk modu',
compatibilityModeHelper:
'Yalnızca eksik Discovery veya yeniden yazılmış uç noktalar için kullanın. Temel OIDC doğrulaması etkin kalır.',
configurationFailedHelper:
'Test başarısız oldu. Sayfa yalnızca yerelleştirilmiş arka uç hatasını görüntüler.',
configurationFailedTag: 'Test başarısız oldu',
configurationHighRiskPassed:
'Yapılandırma başarılı ancak yüksek riskli uyumluluk seçenekleri içeriyor.',
configurationHighRiskTag: 'Yüksek riskli yapılandırma başarılı oldu',
configurationNotTested: 'Mevcut konfigürasyon test edilmemiştir.',
configurationNotTestedTag: 'Test edilmedi',
configurationPassed: 'Mevcut yapılandırma güvenlik ve yetenek kontrollerini geçti.',
configurationPassedTag: 'Test geçti',
configurationStaleHelper: 'Yapılandırma değiştirildi. Kaydetmeden önce yeniden test edin.',
configurationStaleTag: 'Sonucun süresi doldu',
configurationTestMeta:
'Test zamanı: {time}; {duration} ms içinde tamamlandı. Ham Provider yanıtları saklanmaz.',
configurationTestResult: 'Yapılandırma testi sonucu',
configurationTestResultDesc:
"Bu, yalnızca Discovery'i ve yeteneklerini kontrol eder; yetkilendirme kodunu değiştirmez veya Client Secret'i kanıtlamaz. Uçtan uca doğrulama için tarayıcı testi girişini kullanın.",
configurationTestSuccess: 'OIDC yapılandırma testi başarılı oldu.',
configurationTesting: 'Mevcut OIDC yapılandırması test ediliyor…',
configurationTestingTag: 'Test',
configureSecret: 'Sırrı yapılandır',
conflictExistingRename: "Bağlı bir subject, dolu olan yeni bir name'i döndürür",
conflictExistingRenameResult:
"Mevcut User.Name'i koruyun ve bağlı kullanıcının oturum açmasına izin verin",
conflictLDAP: 'LDAP kullanıcısı',
conflictLocal: 'Yerel kullanıcı',
conflictNewAvailable: 'Yeni subject ve eşlenen name mevcut',
conflictNewAvailableResult: 'Kurumsal kullanıcı oluşturun ve varsayılan rolü atayın',
conflictNone: 'Çatışma yok',
conflictOIDC: 'Başka bir OIDC kimliği',
conflictOccupied: 'Eşlenen name yerel bir LDAP veya başka bir OIDC kimliğine aittir',
conflictOccupiedResult: 'Yeni kimliği reddet; asla otomatik olarak bağlama veya birleştirme',
conflictType: 'Çatışma türü',
connectionSecurity: 'Bağlantı güvenliği',
connectionSecurityDesc:
'TLS politikası Discovery, Token, JWKS ve UserInfo istekleri için geçerlidir.',
connectionTest: 'Bağlantı ve konfigürasyon testi',
connectionTestCompatibilityDesc: 'Özel uç noktaları ve protokol güvenlik ilkesini doğrulayın.',
connectionTestStandardDesc: "Uç noktalar ve yetenekler Issuer'ten otomatik olarak keşfedilir.",
connectionTestTab: 'Bağlantı testi',
customCA: 'Özel CA',
customCAHelper:
'Yalnızca bu kimlik doğrulama kaynağı için geçerlidir ve hiçbir zaman günlüklere yazılmaz.',
customCARequired: 'Özel CA sertifikasını sağlayın.',
defaultRole: 'Varsayılan rol',
defaultRoleHelper:
'Yalnızca kullanıcı ilk oluşturulduğunda atanır; sonraki oturum açmalar rolü değiştirmez.',
defaultRolePlaceholder: 'Bir rol seçin',
defaultRoleRequired: 'Geçerli bir varsayılan rol seçin.',
disableAfterSave: 'Kaydettikten sonra OIDC devre dışı bırakılacak.',
disableConfirm:
"OIDC'in devre dışı bırakılması, bu kaynağın kullanıcılarının erişimini anında geçersiz kılar. Devam etmek?",
disableDiscardConfirm:
"OIDC'in devre dışı bırakılması acil bir eylemdir: yalnızca oturum açma girişini kapatır ve bu kaynağın kullanıcıları için erişimi anında geçersiz kılar. Client Secret değişiklikleri de dahil olmak üzere bu sayfadaki diğer kaydedilmemiş değişiklikler silinecektir. Devam etmek?",
disableTitle: "OIDC'i devre dışı bırakın",
disabled: 'Devre dışı',
discoveryAllowlist: 'Discovery ∩ güvenlik izin verilenler listesi',
enable: 'Etkinleştir',
enableAfterSave: 'Başarılı bir kaydetme işleminden sonra OIDC etkinleştirilecektir.',
enabled: 'Etkin',
endSessionEndpoint: 'End Session Endpoint',
endSessionEndpointHelper:
'Gelecekte kullanılmak üzere kaydedildi; Provider tarafından başlatılan oturum kapatma bu sürüme dahil değildir.',
endSessionEndpointInvalid: 'Geçerli bir End Session Endpoint girin.',
endpointDiscoveryPlaceholder: 'Bağlantı testinden sonra gösterilir',
firstLogin: 'İlk giriş',
firstLoginPolicy:
'Yerel bir kurumsal kullanıcı oluşturun ve yapılandırılmış varsayılan rolü atayın.',
fixedAuthorizationCode: 'Authorization Code Flow',
fixedNoTokenPersistence: "Token'ler, Claims ve verifier hiçbir zaman kalıcı olmaz",
fixedSecurityPolicy: 'Her zaman uygulanır; yapılandırma gerekmez',
fixedStateNonce: 'Bir kerelik state ve nonce',
fixedTokenValidation: 'ID Token imzası ve Claims doğrulaması',
highRiskSaveConfirm:
'Bu etkinleştirilmiş yapılandırma, yüksek riskli uyumluluk seçeneklerini içerir. Yalıtılmış ortamın bunları gerektirdiğini doğrulayın.',
highRiskTitle: 'Yüksek riskli OIDC yapılandırması',
hs256Compatibility: 'HS256 (uyumluluk)',
hs256KeyHelper:
"HS256 her zaman bu kaynağın Client Secret'ini kullanır ve ayrı bir imzalama anahtarını kabul etmez.",
hs256Warning:
"HS256, ID Token imzaları için paylaşılan bir simetrik sır kullanır. Bunu yalnızca Provider'in asimetrik bir algoritma kullanamadığı durumlarda kullanın.",
identityBindingPolicy:
"Kimlik AuthSourceID + issuer + subject'e sabitlenmiştir. Kullanıcı adının eşleşmesi başka bir hesabın otomatik olarak sahiplenilmesine yol açmaz.",
identityMissing: 'Kimlik etkin değil',
issuer: 'Issuer URL',
issuerHelper: 'ID Token iss değeri ve Discovery issuer bu değerle tam olarak eşleşmelidir.',
issuerInvalid: 'Sorgu veya parça olmadan geçerli bir HTTP veya HTTPS Issuer URL girin.',
issuerRequired: "Issuer URL'i girin.",
jwksRotation: 'Otomatik JWKS dönüşü',
jwksURI: 'JWKS URI',
jwksURIHelper: 'Anahtar kaynağı JWKS olduğunda asimetrik imzalama için gereklidir.',
jwksURIInvalid: 'Seçilen imzalama anahtarı kaynağı için geçerli bir JWKS URI girin.',
keepExistingRole: 'Mevcut rolleri ve yerel izinleri koruyun',
localSecurityData: 'Yerel güvenlik verileri',
localSecurityDataPolicy:
"Hiçbir zaman rollerin, MFA, API Keys, Passkeys'in veya yerel izinlerin üzerine yazmayın.",
localCredentialsManaged:
'Kullanıcı adı ve yerel parola OIDC tarafından yönetilir ve burada düzenlenemez. Roller, izinler, MFA, API Keys ve Passkeys yerel olarak yönetilmeye devam eder.',
localUserFields: 'Yerel kullanıcı alanları',
localUserFieldsDesc: "İlk sürüm yalnızca User.Name'i eşler ve bir JSON eşleme ifadesi kullanmaz.",
loginWith: '{provider} ile giriş yap',
manualEndpoints: 'Özel uç noktalar',
manualEndpointsDesc:
'Yalnızca Discovery eksik olduğunda veya bir yukarı akış ağ geçidi uç noktaları yeniden yazdığında kullanın.',
mappingResult: 'Eşleme sonucu',
mode: 'Bağlantı modu',
modeRequired: 'Bir bağlantı modu seçin.',
nameClaim: "Kullanıcı adı Claim'i",
nameClaimHelper: 'Kullanıcı adını içeren alanı girin (ör. preferred_username).',
nameClaimRequired: "Kullanıcı adı Claim'ini girin.",
nameConflict: 'Ad çakışması politikası',
panelURL: '1Panel halka açık URL',
panelURLHTTPWarning:
'HTTP yetkilendirme yanıtını korumaz. Bunu yalnızca Provider tarafından kabul edilen yalıtılmış bir özel ortamda kullanın.',
panelURLHelper:
"Kullanıcıların 1Panel'e eriştiği adresi girin. Geri çağırma URL'sini oluşturmak için kullanılır.",
panelURLInvalid:
'Yalnızca şema, ana bilgisayar ve isteğe bağlı bağlantı noktasını içeren bir kaynak girin.',
panelURLRequired: "1Panel genel URL'i girin.",
pkceDisabled: 'Devre dışı (yalnızca uyumluluk)',
pkceDisabledWarning:
"PKCE'in devre dışı bırakılması, yetkilendirme kodu müdahalesine karşı korumayı azaltır.",
pkceHelper: "S256'i tercih edin. plain sınama yöntemi hiçbir zaman sunulmaz.",
pkceS256: 'S256 (önerilir)',
plannedHandling: 'Planlı kullanım',
privateNetworkIdP: "Özel ağ IdP'si",
privateNetworkIdPHelper:
'Açıkça özel adreslere izin verir; meta veriler, geridöngü, yerel bağlantı, yönlendirmeler ve DNS yeniden bağlama engellenmeye devam eder.',
privateNetworkWarning: 'Bu kimlik doğrulama kaynağı için özel ağ erişimi etkinleştirildi.',
protocolCompatibility: 'Protokol uyumluluğu',
protocolCompatibilityDesc: 'ID Token imza doğrulaması hiçbir zaman devre dışı bırakılamaz.',
providerAndClient: 'Provider ve istemci',
providerAndClientDesc:
'Client Secret yalnızca değiştirilebilir veya silinebilir ve sayfa tarafından asla geri döndürülmez.',
providerCapabilities: 'Provider yetenekleri',
recentTestSuccess: 'Son test başarılı oldu: {0}',
recommended: 'Tavsiye edilen',
rejectPlain: 'plain reddedildi',
replaceSecret: 'Sırrı değiştir',
requestAndClaims: 'İstekler ve özellikler',
requestAndClaimsDesc:
'Yetkilendirme kapsamlarını, kullanıcı bilgisi tamamlamayı ve istek parametrelerini yapılandırın.',
requestTimeout: 'İstek zaman aşımı',
requestTimeoutRequired: 'İstek zaman aşımını girin.',
restore: 'Geri yükle',
restored: 'Son kaydedilen OIDC ayarları geri yüklendi.',
result: 'Sonuç',
rolesLoadFailed: 'Roller yüklenemedi. Varsayılan rolü seçmeden önce yeniden deneyin.',
roleHandling: 'Rol yönetimi',
scenario: 'Senaryo',
scopes: 'Yetkilendirme kapsamları',
scopesHelper: 'openid içermelidir. Birden fazla kapsamı boşluklarla ayırın.',
scopesRequired: "Scopes, openid'i içermelidir.",
seconds: 'saniye',
secretClearHelper:
"Temizledikten sonra, OIDC'in yeniden etkinleştirilebilmesi için yeni bir Client Secret gereklidir.",
secretConfigured: 'Yapılandırılmış',
secretNotConfigured: 'Yapılandırılmadı',
secretPlaceholder: 'Yeni bir Client Secret girin',
secretReplaceHelper:
"Kaydettiğinizde yeni gizli anahtar mevcut değerin yerini alır. OIDC Provider'daki Client Secret değerini de güncelleyin.",
secretRequiredHelper: "OIDC'i etkinleştirmeden önce bir Client Secret'i yapılandırın.",
secretRequiredToEnable: "OIDC'i etkinleştirmeden önce bir Client Secret'i yapılandırın.",
secretSavedHelper: 'Şifrelenmiş olarak saklanır. Mevcut sırrı korumak için boş bırakın.',
secretWaiting: 'Giriş bekleniyor',
secretWillClear: 'Temizlenecek',
secretWillReplace: 'Değiştirilecek',
signingAlgorithm: 'ID Token imzalama algoritması',
signingAlgorithmHelper:
'Yalnızca arka uç güvenliği izin verilenler listesindeki algoritmalar kullanılabilir.',
signingKey: 'İmza anahtarı',
signingKeyClientSecret: 'Client Secret (yalnızca HS256)',
signingKeyJWKS: 'Otomatik rotasyonlu JWKS URI',
signingKeySource: 'İmza anahtarı kaynağı',
signingKeySourceHelper:
"JWKS'i tercih edin. Statik açık anahtar otomatik olarak rotasyona tabi tutulamaz.",
signingKeyStatic: 'Statik JWK veya PEM açık anahtarı',
standardDiscovery: 'Standart OIDC Discovery',
standardDiscoveryDesc: '1Panel uç noktaları ve yetenekleri keşfeder ve ham belgeyi saklamaz.',
standardMode: 'Standart mod',
standardModeHelper: "Issuer'in uç noktalarını, imzalama yeteneklerini ve PKCE desteğini keşfedin.",
standardProtocolPolicy: 'Standart protokol politikası',
standardProtocolPolicyDesc:
'İmzalama yetenekleri otomatik olarak müzakere edilir; buraya herhangi bir imzalama anahtarı girilmez.',
staticSigningKey: 'Statik imzalama açık anahtarı',
staticSigningKeyHelper:
'Yalnızca açık anahtar materyali kabul edilir. Provider anahtarı değiştiğinde manuel olarak güncelleyin.',
staticSigningKeyPlaceholder: 'JWK, JWKS JSON veya PEM açık anahtarını yapıştırın',
staticSigningKeyRequired: 'Statik imzalama açık anahtarını sağlayın.',
staticSigningKeyWarning:
'Statik imzalama anahtarı otomatik olarak yenilenemez; Provider anahtar rotasyonu yapmadan önce güncelleyin.',
settingLoadFailed: 'OIDC ayarları yüklenemedi',
settingLoadFailedHelper:
'Geçerli ayarların üzerine boş bir varsayılan yapılandırmanın kaydedilmesini önlemek için form kilitlendi. Bağlantı kurtarıldıktan sonra yeniden deneyin.',
subsequentLogin: 'Sonraki giriş',
subsequentLoginPolicy:
"subject ile bağlamayı bulun ve yalnızca yeni ad kullanılabilir olduğunda User.Name'i güncelleyin.",
testBeforeBrowserTest:
'Tarayıcı oturum açma testine başlamadan önce mevcut yapılandırmayı test edin.',
testBeforeEnable: 'Yapılandırma değişikliklerini kaydetmeden önce mevcut yapılandırmayı test edin.',
testConfiguration: 'Yapılandırmayı test et',
testDiscovery: 'Discovery testi',
tlsCustomCA: 'HTTPS · Özel CA sertifikası',
tlsPrivateHTTP: 'HTTP · Yalnızca özel ağ (tehlikeli)',
tlsPrivateHTTPWarning:
'HTTP aktarım şifrelemesi sağlamaz ve açıkça izin verilen özel hedeflerle sınırlıdır.',
tlsSkipVerify: 'HTTPS · Sertifika doğrulamasını atla (tehlikeli)',
tlsSystem: 'HTTPS · Sistem sertifikası doğrulaması (önerilir)',
tokenEndpoint: 'Token Endpoint',
tokenEndpointInvalid: 'Geçerli bir Token Endpoint girin.',
transportSecurity: 'Taşıma güvenliği',
transportSecurityHelper:
"HTTPS'i tercih edin. Özel HTTP ayrıca açık private-network erişimi gerektirir.",
unsavedChanges: 'Kaydedilmemiş OIDC değişiklikleri var.',
usedClaim: 'Claim kullanılmış',
userInfoEndpoint: 'UserInfo Endpoint',
userInfoEndpointHelper:
'Kullanıcı adı alanı eksikse sistem bu endpoint üzerinden tamamlar. Tamamlama istemiyorsanız boş bırakın.',
userInfoEndpointInvalid: 'Geçerli bir UserInfo Endpoint girin.',
userMapping: 'Kullanıcı ayarları',
userMappingDesc:
'OIDC kullanıcı adı eşlemesini ve ilk oturum açmada kullanıcı oluşturmak için kullanılacak varsayılan düğüm ile rolü ayarlayın.',
},
saml2: {
actionCreate: 'Kullanıcı oluştur',
actionPending: 'Sonuç bekleniyor',
actionReject: 'Giriş yapmayı reddet',
actionReuse: 'Bağlı kullanıcıyı kullan',
assignDefaultRole: 'Varsayılan rolü ata: {role}',
basic: 'Temel ayarlar',
basicDesc: 'Çoğu standart SAML2 kimlik sağlayıcısı için gereken ortak seçenekleri yapılandırın.',
browserTest: 'Oturum açmayı test et',
browserTestConflict: 'Kimlik doğrulandı ancak kullanıcı adı çakışıyor',
browserTestConflictHelper:
'Eşlenen kullanıcı adı başka bir kimliğe aittir ve talep edilmeyecektir.',
browserTestExpired: 'Tarayıcı testinin süresi doldu',
browserTestExpiredHelper:
'Yeni bir tarayıcı testi başlatın ve süresi dolmadan yetkilendirmeyi tamamlayın.',
browserTestFailed: 'Tarayıcı testi başarısız oldu',
browserTestFailedHelper:
'Kimlik önizlemesi tamamlanamadı. Yerelleştirilmiş arka uç hatasını inceleyin.',
browserTestIsolation:
'Bu işlem gerçek bir yetkilendirme gidiş-dönüşü gerçekleştirir ancak kullanıcı oluşturmaz veya güncellemez, rol atamaz ya da kimliği doğrulanmış bir panel oturumu oluşturmaz.',
browserTestPopupBlocked:
'Bu site için açılır pencerelere izin verin, ardından tarayıcı testini yeniden başlatın.',
browserTestPopupClosed: 'Yetkilendirme penceresi test tamamlanmadan kapatıldı.',
browserTestSuccess: 'Provider doğrulaması başarılı oldu',
browserTestSuccessHelper:
'Kimlik eşlemenin önizlemesi, kullanıcıları veya oturumları değiştirmeden yapıldı.',
browserTestTitle: 'SAML2 tarayıcı testi girişi',
browserTestWaiting: 'Provider yetkilendirmesi bekleniyor',
browserTestWaitingHelper:
'Yeni tarayıcı penceresinde oturum açma işlemini tamamlayın. Bu sayfa otomatik olarak güncellenecektir.',
certificateFileInvalid: 'Geçerli bir PEM, CRT veya CER sertifika dosyası seçin.',
configured: 'Yapılandırıldı',
configurationFailedHelper:
'Test başarısız oldu. Sayfa yalnızca yerelleştirilmiş arka uç hatasını görüntüler.',
configurationNotTested: 'Mevcut konfigürasyon test edilmemiştir.',
configurationPassed: 'Mevcut yapılandırma güvenlik ve yetenek kontrollerini geçti.',
configurationStaleHelper:
'Kimlik doğrulamaya duyarlı ayarlar değiştirildi. Mevcut taslağı tekrar test edin.',
configurationTestSuccess: 'SAML2 yapılandırma testi başarılı oldu.',
configurationTesting: 'Mevcut SAML2 yapılandırması test ediliyor…',
conflictLDAP: 'LDAP kullanıcısı',
conflictLocal: 'Yerel kullanıcı',
conflictNone: 'Çatışma yok',
conflictOIDC: 'Başka bir OIDC kimliği',
conflictSAML2: 'Başka bir SAML2 kimliği',
conflictType: 'Çatışma türü',
credentialFileReadFailed: 'Kimlik bilgisi dosyası okunamadı.',
credentialFileTooLarge: 'Kimlik bilgisi dosyaları 256 KiB boyutunu aşmamalıdır.',
credentialsRequired: 'SP özel anahtarını ve sertifikasını yapılandırın.',
defaultRole: 'Yeni kullanıcı rolü',
defaultRoleHelper:
'Yalnızca ilk oluşturmada atanır; sonraki oturum açmalar yerel rolleri, MFA ve izinleri korur.',
defaultRolePlaceholder: 'Bir rol seçin',
defaultRoleRequired: 'Geçerli bir varsayılan rol seçin.',
disableConfirm:
'SAML2 devre dışı bırakıldığında yeni oturum açmalar hemen reddedilir ve kullanıcı oturumları geçersiz kılınır. Devam edilsin mi?',
disableDiscardConfirm:
'SAML2 devre dışı bırakıldığında bu sayfadaki diğer kaydedilmemiş değişiklikler atılır ve kullanıcı oturumları hemen geçersiz kılınır. Devam edilsin mi?',
disableTitle: 'SAML2yi devre dışı bırak',
disabled: 'Devre dışı',
enable: 'Etkinleştir',
enabled: 'Etkin',
idpMetadata: 'IdP meta verileri',
idpMetadataDesc: 'Bir URL girin veya XML yapıştırın. İkisi de varsa URL önceliklidir.',
keepExistingRole: 'Mevcut rolleri ve yerel izinleri koruyun',
loginWith: '{provider} ile oturum aç',
mappingResult: 'Eşleme sonucu',
metadataRequired: 'IdP Metadata URL veya XML girin.',
metadataURLHelper: 'Arka uç, test ve kaydetme sırasında meta verileri indirip doğrular.',
metadataURLInvalid: 'Kimlik bilgisi veya parça içermeyen geçerli bir HTTPS meta veri URLsi girin.',
metadataURLRecommended: 'Meta veri URLsi (önerilen)',
metadataXML: 'XML meta verileri',
metadataXMLHelper: 'IdP erişilebilir bir meta veri URLsi sunmuyorsa bunu kullanın.',
metadataXMLInvalid: 'Geçerli bir EntityDescriptor meta veri XMLi girin.',
metadataXMLPlaceholder: '<EntityDescriptor>...</EntityDescriptor> içeriğini yapıştırın',
nameAttribute: 'Kullanıcı adı özniteliği',
nameAttributeHelper:
'Bu özniteliği doğrulanmış SAML Assertion içinden okur ve 1Panel kullanıcı adına eşler.',
nameAttributePlaceholder: 'Örneğin: uid, username veya account',
nameAttributeRequired: 'Kullanıcı adı özniteliğini girin.',
notConfigured: 'Yapılandırılmadı',
or: 'veya',
pageDesc: 'IdP Metadata ile kurumsal SSO bağlantısını ortak ayarlarla tek sayfada yapılandırın.',
plannedHandling: 'Planlı kullanım',
privateKeyFileInvalid: 'Geçerli bir PEM özel anahtar dosyası seçin.',
recentTestSuccess: 'Son test başarılı oldu: {0}',
restore: 'Geri yükle',
restored: 'Son kaydedilen SAML2 ayarları geri yüklendi.',
roleHandling: 'Rol yönetimi',
rolesLoadFailed: 'Roller yüklenemedi. Varsayılan rolü seçmeden önce yeniden deneyin.',
selectFile: 'Dosya seç',
serviceStatus: 'Hizmet durumu',
serviceStatusDesc: 'SAML2 etkinleştirilmeden önce mevcut yapılandırma testi geçmelidir.',
settingLoadFailed: 'SAML2 ayarları yüklenemedi',
settingLoadFailedHelper:
'Geçerli ayarların üzerine boş bir varsayılan yapılandırmanın kaydedilmesini önlemek için form kilitlendi. Bağlantı kurtarıldıktan sonra yeniden deneyin.',
spCertificate: 'SP sertifikası',
spCertificateHelper:
'IdPnin oturum açma ve kapatma isteklerini doğrulayabilmesi için SP meta verilerinde yayımlanır.',
spCredentials: 'SP özel anahtarı ve sertifikası',
spCredentialsDesc:
'Oturum açma ve kapatma mesajlarını imzalamak için kullanılır. İmza ve doğrulama ilkesi arka uç tarafından sabitlenir.',
spPrivateKey: 'SP özel anahtarı',
spPrivateKeyHelper:
'AuthnRequest ve oturum kapatma mesajlarını imzalamak için kullanılır. Saklanırken şifrelenir ve hiçbir zaman gösterilmez.',
syncLogout: 'Eşzamanlı oturum kapatma',
syncLogoutHelper:
"1Panel'den veya kimlik sağlayıcıdan çıkış yapmak diğer taraftaki oturumu da kapatır.",
testBeforeBrowserTest:
'Tarayıcı oturum açma testine başlamadan önce mevcut yapılandırmayı test edin.',
testBeforeEnable:
'Hassas değişiklikleri etkinleştirmeden veya kaydetmeden önce mevcut yapılandırmayı test edin.',
testConfiguration: 'Yapılandırmayı test et',
unsavedChanges: 'Kaydedilmemiş SAML2 değişiklikleri var.',
usedAttribute: 'Kullanıcı adı eşlemesi',
usersAndRoles: 'Kullanıcılar ve roller',
usersAndRolesDesc:
'Panel kullanıcı adı eşlemesini ve ilk oturum açmada kullanıcı oluşturmak için kullanılacak varsayılan düğüm ile rolü ayarlayın.',
},
ldap: {
basic: 'Temel ayarlar',
loginTitle: 'LDAP ile giriş',
loginWith: 'LDAP ile giriş yap',
backToLocalLogin: 'Panel girişine dön',
enable: 'Etkinleştir',
enabled: 'Etkin',
disabled: 'Devre dışı',
@@ -5221,6 +5651,7 @@ const message = {
deleteConfirm: 'Bu dışa aktarma kaydı ve dosyası silinsin mi?',
},
waf: {
WAF: 'WAF',
name: 'WAF',
blackWhite: 'Kara ve Beyaz Liste',
globalSetting: 'Genel Ayarlar',
@@ -5941,6 +6372,8 @@ const message = {
offlineHelper: 'Düğüm çevrimdışı bir ortamda olduğunda kullanılır',
appUpgrade: 'Uygulama Yükseltme',
appUpgradeHelper: 'Yükseltilmesi gereken {0} uygulama var',
dashboardSetting: 'Genel Bakış Ayarları',
keepOneDashboardComponent: 'En az bir genel bakış bölümü bırakın',
},
customApp: {
name: 'Özel Uygulama Deposu',
@@ -6075,7 +6508,7 @@ const message = {
success: 'Uyarı Başarılı',
pushing: 'Gönderiliyor...',
error: 'Uyarı Başarısız',
cleanLog: 'Zamanlanmış görev yürütmesi {0} hatası',
cleanLog: 'Günlükleri temizle',
cleanAlertLogs: 'Uyarı Günlüklerini Temizle',
daily: 'Günlük Uyarı Sayısı: {0}',
cumulative: 'Toplam Uyarı Sayısı: {0}',
@@ -6083,7 +6516,7 @@ const message = {
taskName: 'Görev Adı',
cronJobType: 'Görev Türü',
clamPath: 'Tarama Dizini',
cronjob: 'Zamanlanmış Görev',
cronjob: 'Zamanlanmış görev yürütmesi {0} başarısız oldu',
app: 'Yedekleme Uygulaması',
web: 'Yedekleme Web Sitesi',
database: 'Yedekleme Veritabanı',
@@ -6339,35 +6772,35 @@ const message = {
cpu: 'CPU',
memory: 'Bellek',
disk: 'Disk',
overview: 'Overview',
kvmUnavailable: 'No available KVM hardware virtualization capability was detected.',
kvmCheckCpu: 'Confirm that the host CPU supports Intel VT-x or AMD-V virtualization.',
kvmCheckBios: 'Enable virtualization options in BIOS/UEFI.',
kvmCheckModule: 'Confirm that the kvm, kvm_intel, or kvm_amd kernel module is loaded correctly.',
overview: 'Genel bakış',
kvmUnavailable: 'Kullanılabilir KVM donanım sanallaştırma yeteneği algılanmadı.',
kvmCheckCpu: 'Ana makine CPUsunun Intel VT-x veya AMD-V sanallaştırmasını desteklediğini doğrulayın.',
kvmCheckBios: 'BIOS/UEFI içindeki sanallaştırma seçeneklerini etkinleştirin.',
kvmCheckModule: 'kvm, kvm_intel veya kvm_amd çekirdek modülünün doğru yüklendiğini doğrulayın.',
kvmCheckDevice:
'Confirm that /dev/kvm exists and the current environment is not a container or cloud host without KVM support.',
abnormal: 'Abnormal',
resourceOverview: 'Resource Overview',
cpuAllocated: 'CPU Allocated',
memoryAllocated: 'Memory Allocated',
storageUsed: 'Storage Used',
riskReminder: 'Risk Reminders',
noRisk: 'No risks',
runtimeHealth: 'Runtime Health',
runtimeAbnormal: 'VM runtime is abnormal',
noDependency: 'No dependency check data',
storageOverview: 'Storage Overview',
totalAllocated: 'Calculated by total VM configuration',
runningAllocated: 'Running allocation: {0}',
storageAvailable: 'Available: {0}',
inProgress: 'In progress',
needAttention: 'Needs attention',
'/dev/kvm dosyasının bulunduğunu ve mevcut ortamın KVM desteği olmayan bir konteyner ya da bulut ana makinesi olmadığını doğrulayın.',
abnormal: 'Anormal',
resourceOverview: 'Kaynak genel bakışı',
cpuAllocated: 'Ayrılan CPU',
memoryAllocated: 'Ayrılan bellek',
storageUsed: 'Kullanılan depolama',
riskReminder: 'Risk uyarıları',
noRisk: 'Risk yok',
runtimeHealth: 'Çalışma zamanı sağlığı',
runtimeAbnormal: 'VM çalışma zamanı anormal',
noDependency: 'Bağımlılık denetimi verisi yok',
storageOverview: 'Depolama genel bakışı',
totalAllocated: 'Toplam VM yapılandırmasına göre hesaplanır',
runningAllocated: 'Çalışanlara ayrılan: {0}',
storageAvailable: 'Kullanılabilir: {0}',
inProgress: 'Devam ediyor',
needAttention: 'İlgilenilmesi gerekiyor',
normal: 'Normal',
environmentRisk: 'The VM runtime is not ready. Fix dependencies or virtualization services.',
storageRisk: 'Storage pool {0} usage has reached {1}%.',
abnormalRisk: '{0} VMs are in an abnormal state.',
pausedRisk: '{0} VMs are paused.',
memoryRisk: 'VM memory allocation has reached {0}%.',
environmentRisk: 'VM çalışma zamanı hazır değil. Bağımlılıkları veya sanallaştırma hizmetlerini düzeltin.',
storageRisk: '{0} depolama havuzunun kullanımı %{1} düzeyine ulaştı.',
abnormalRisk: '{0} VM anormal durumda.',
pausedRisk: '{0} VM duraklatıldı.',
memoryRisk: 'VM bellek ayırma oranı %{0} düzeyine ulaştı.',
cpuLimitHelper: 'Şu anda kullanılabilir CPU: {0} çekirdek',
cpuLimitExceeded: 'CPU sınırı ıyor. Şu anki maksimum kullanılabilir: {0} çekirdek.',
memoryLimitHelper: 'Şu anda ayrılabilir bellek: {0} (ana makine {1} bellek ayırmalıdır)',
@@ -6376,11 +6809,11 @@ const message = {
storageLimitExceeded: 'Disk kapasitesi sınırı ıyor. Şu anki maksimum kullanılabilir: {0}.',
iso: 'ISO',
createFromTemplate: 'Şablondan oluştur',
template: 'Template',
templateName: 'Template Name',
convertToTemplate: 'Convert to Template',
sourceVM: 'Source VM',
templateSize: 'Template Size',
template: 'Şablon',
templateName: 'Şablon adı',
convertToTemplate: 'Şablona dönüştür',
sourceVM: 'Kaynak VM',
templateSize: 'Şablon boyutu',
deleteTemplateConfirm: '{0} şablonu silinsin. Bu işlem geri alınamaz. Devam edilsin mi?',
orphanClean: 'Sahipsiz veri temizliği',
orphanScan: 'Yeniden tara',
@@ -6424,21 +6857,21 @@ const message = {
available: 'Kullanılabilir',
vmCount: 'Bağlı VMler',
usedIPs: 'Kullanılan IPler',
monitor: 'Monitor',
monitorNotReady: 'The virtual machine is not running. Monitoring data is unavailable.',
monitorLoadFailed: 'Failed to get VM monitoring data.',
monitorLoadFailedWithReason: 'Failed to get VM monitoring data: {0}',
rename: 'Rename',
monitor: 'İzleme',
monitorNotReady: 'Sanal makine çalışmıyor. İzleme verileri kullanılamıyor.',
monitorLoadFailed: 'VM izleme verileri alınamadı.',
monitorLoadFailedWithReason: 'VM izleme verileri alınamadı: {0}',
rename: 'Yeniden adlandır',
newName: 'Yeni ad',
renameHelper: 'Enter a new VM name. The VM must be shut down before renaming.',
renameConfirm: 'Rename virtual machine [{0}] to [{1}]?',
renameRunningHelper: 'Shut down the virtual machine before renaming it.',
cpuUsage: 'CPU Usage',
memoryUsage: 'Memory Usage',
diskIO: 'Disk IO',
networkIO: 'Network IO',
diskReadWrite: 'Disk Read / Write',
networkRxTx: 'Network RX / TX',
renameHelper: 'Yeni bir VM adı girin. Yeniden adlandırmadan önce VM kapatılmalıdır.',
renameConfirm: '[{0}] sanal makinesini [{1}] olarak yeniden adlandırmak istiyor musunuz?',
renameRunningHelper: 'Yeniden adlandırmadan önce sanal makineyi kapatın.',
cpuUsage: 'CPU kullanımı',
memoryUsage: 'Bellek kullanımı',
diskIO: 'Disk G/Ç',
networkIO: ' G/Ç',
diskReadWrite: 'Disk okuma / yazma',
networkRxTx: ' RX / TX',
rx: 'RX',
tx: 'TX',
console: 'Konsol',
@@ -6447,16 +6880,18 @@ const message = {
consoleConnectFailed: 'VNC konsoluna bağlanılamadı. Konsol proxy hizmetini kontrol edin.',
consoleCredentialsRequired:
'VNC konsolu kimlik bilgileri gerektiriyor. Backend proxy yapılandırmasını kontrol edin.',
snapshot: 'Snapshot',
createSnapshot: 'Create Snapshot',
recoverSnapshot: 'Recover Snapshot',
snapshot: 'Anlık görüntü',
createSnapshot: 'Anlık görüntü oluştur',
recoverSnapshot: 'Anlık görüntüyü geri yükle',
snapshotSize: 'Kullanım',
currentSnapshot: 'Current',
snapshotEmpty: 'No snapshots',
currentSnapshot: 'Geçerli',
snapshotEmpty: 'Anlık görüntü yok',
snapshotHelper:
'A snapshot saves the current VM state as a restore point. Subsequent data changes are recorded in a delta file without changing the original disk. Restoring a snapshot returns the VM to that point in time.',
'Anlık görüntü, geçerli VM durumunu geri yükleme noktası olarak kaydeder. Sonraki veri değişiklikleri özgün diski değiştirmeden bir fark dosyasına kaydedilir. Anlık görüntünün geri yüklenmesi VMyi bu duruma döndürür.',
snapshotOperationHelper:
'Geçerli anlık görüntü silinemez. Anlık görüntüler yalnızca sanal makine kapalıyken geri yüklenebilir.',
snapshotRecoverConfirm:
'Recover virtual machine [{1}] to snapshot [{0}]? The VM disk will be restored to the snapshot state.',
'[{1}] sanal makinesini [{0}] anlık görüntüsüne geri yüklemek istiyor musunuz? VM diski anlık görüntü durumuna döndürülecektir.',
interface: ' Arayüzü',
device: 'Aygıt',
path: 'Yol',
@@ -6485,12 +6920,12 @@ const message = {
dir: 'Yerel Dizin',
},
cluster: {
cluster: 'Высокая доступность приложений',
name: 'Имя кластера',
addCluster: 'Добавить кластер',
installNode: 'Установить узел',
master: 'Главный узел',
slave: 'Подчиненный узел',
cluster: 'Uygulama yüksek kullanılabilirliği',
name: 'Küme adı',
addCluster: 'Küme ekle',
installNode: 'Düğüm kur',
master: 'Ana düğüm',
slave: 'İkincil düğüm',
replicaStatus: 'Ana-Çalışan Durumu',
unhealthyDeleteError:
'Yükleme düğümü durumu anormal, lütfen düğüm listesini kontrol edin ve tekrar deneyin!',

View File

@@ -14,6 +14,7 @@ const message = {
next: '下一步',
create: '建立',
add: '新增',
select: '選擇',
save: '儲存',
set: '設定',
sync: '同步',
@@ -57,6 +58,7 @@ const message = {
power: '提交',
search: '搜尋',
refresh: '重新整理',
reconnect: '重新連線',
get: '取得',
upgrade: '升級',
update: '更新',
@@ -118,6 +120,9 @@ const message = {
card: '卡片',
table: '表格',
status: '狀態',
statusSuccess: '成功',
statusFailed: '失敗',
statusWaiting: '等待中...',
records: '任務輸出',
group: '分組',
default: '預設',
@@ -162,6 +167,7 @@ const message = {
deleteSuccess: '刪除成功',
loginSuccess: '登入成功',
operationSuccess: '操作成功',
operationFailed: '操作失敗',
copySuccess: '複製成功',
notSupportOperation: '不支援此操作',
requestTimeout: '請求逾時請稍後重試',
@@ -203,6 +209,7 @@ const message = {
username: '使用者名稱',
password: '密碼',
passkey: '通行金鑰登入',
otherLoginMethods: '其他方式登入',
welcome: '歡迎回來請輸入帳號密碼',
errorAuthInfo: '您輸入的使用者名稱或密碼不正確請重新輸入',
errorMfaInfo: '錯誤的驗證資訊請重試',
@@ -271,8 +278,10 @@ const message = {
length128Err: '長度不能超過128位',
maxLength: '長度不能超過 {0} 位',
alias: '支援英文、數字、-和_,長度1-128,並且不能以-、_開頭或結尾',
vmName: '支援英文字母、數字、「.」、「-」和「_」長度為 1-64必須以字母或數字開頭。',
vmNetwork: '支援英文字母、數字、「.」、「:」、「-」和「_」長度為 1-64必須以字母或數字開頭。',
duplicate: '不能重複',
selectHelper: '請選擇',
selectHelper: '請選擇正確的 {0} 檔案',
ipErr: '請輸入正確的 IP 位址',
},
res: {
@@ -382,6 +391,7 @@ const message = {
ssh: 'SSH 設定',
firewall: '防火牆',
ssl: '憑證',
security: '安全',
database: '資料庫',
aiTools: 'AI',
mcp: 'MCP',
@@ -490,6 +500,7 @@ const message = {
deleteBackupHelper: '同時刪除資料庫備份',
delete: '刪除操作無法回滾,請輸入 "',
deleteHelper: '" 刪除此資料庫',
deleteUserHelper: '" 刪除此使用者',
userBoundDatabases: '使用者已取得以下資料庫的存取授權:',
noMysql: '資料庫服務 (MySQL 或 MariaDB)',
noPostgresql: '資料庫服務 PostgreSQL',
@@ -535,6 +546,7 @@ const message = {
revokeAuthorizationHelper: '確定撤銷使用者 {0} 對資料庫 {1} 的存取授權嗎?',
supplementPassword: '補充密碼',
supplementPasswordHelper: '僅將現有密碼儲存到 1Panel不會修改 MySQL 使用者密碼。',
noUserBind: '未綁定',
pgBindHelper: '此操作用於建立新使用者並將其綁定到目標資料庫,暫不支援選擇已存在於資料庫中的使用者。',
pgSuperUser: '超級使用者',
loadFromRemoteHelper: '此操作將同步伺服器上的資料庫、使用者及授權資訊到 1Panel是否繼續',
@@ -941,9 +953,6 @@ const message = {
failureCount: '失敗次數',
lastError: '最近錯誤',
modelMap: '模型映射',
apiKeyKeepEmpty: 'API Key留空不改',
apiKeyOnceHint: 'API Key 僅建立時顯示一次,請及時複製保存。',
apiKeyOnceSave: 'API Key 只顯示一次,請立即保存:',
qpsLimit: 'QPS 限制',
tokenLimit: 'Token 限制',
tokenUsed: '已用 Token',
@@ -1475,6 +1484,7 @@ const message = {
lastHour: '最近 1 小時',
last10Min: '最近 10 分鐘',
cleanLog: '清空日誌',
cleanLogscope: '清理類型',
downLogHelper1: '即將下載 {0} 容器所有日誌,是否繼續?',
downLogHelper2: '即將下載 {0} 容器最近 {1} 條日誌,是否繼續?',
cleanLogHelper: '清空日誌需要重新啟動容器,該操作無法回滾,是否繼續?',
@@ -1700,7 +1710,7 @@ const message = {
ifPause: '製作過程中是否暫停容器',
ifMakeImageWithContainer: '是否根據此容器製作新映像?',
finishTime: '上一次停止時間',
exportHelper: '即將匯出 {0} 條編排範本,是否繼續?',
exportHelper: '將選取的映像匯出為一個 tar 檔案。',
},
cronjob: {
importHelper:
@@ -1728,6 +1738,9 @@ const message = {
website: '備份網站',
rulesHelper: '支援多個排除規則,使用英文逗號 , 分隔,例:*.log,*.sql',
lastRecordTime: '上次執行情況',
all: '全部',
failedRecord: '失敗記錄',
successRecord: '成功記錄',
database: '備份資料庫',
backupArgs: '備份參數',
backupArgsHelper: '未列出的備份參數可手動輸入並選擇,例:輸入 --no-data 後選擇下拉列表中的第一個選項',
@@ -1916,6 +1929,7 @@ const message = {
fold: '全部收縮',
batchInput: '批次輸入',
quickCommand: '快速指令',
quickCmd: '快速指令',
noSuchCommand: '匯入的CSV檔案中未能發現快速指令資料請檢查後重試',
quickCommandHelper: '常用命令列表,用於在終端介面底部快速選擇',
groupDeleteHelper: '移除組後,組內所有連接將遷移到 default 組內,是否繼續?',
@@ -2152,13 +2166,10 @@ const message = {
taskRunning: '執行中',
},
file: {
name: '名稱',
fileDirNum: '共 {0} 個目錄,{1} 個檔案,',
currentDir: '當前目錄',
dir: '資料夾',
upload: '上傳',
download: '下載',
uploadFile: '@:file.upload@:file.file',
uploadDirectory: '@:file.upload@:file.dir',
fileName: '檔案名',
search: '在當前目錄下尋找',
mode: '權限',
@@ -2622,6 +2633,17 @@ const message = {
restartLater: '稍後手動重新啟動',
systemIPWarning: '當前節點尚未設定預設存取地址,請前往面板設定進行設定',
systemIPWarning1: '當前伺服器地址為 {0},無法快速跳轉',
syncTime: '伺服器時間',
timeZone: '時區',
timeZoneChangeHelper: '修改時區需要重新啟動服務,是否繼續?',
timeZoneHelper: '時區修改依賴系統 timedatectl 服務,重新啟動 1Panel 服務後生效。',
timeZoneCN: '北京',
timeZoneAM: '洛杉磯',
timeZoneNY: '紐約',
ntpALi: '阿里雲',
ntpGoogle: 'Google',
syncSite: 'NTP 伺服器',
syncSiteHelper: '該操作將使用 {0} 作為來源同步系統時間,是否繼續?',
changePassword: '密碼修改',
oldPassword: '原密碼',
newPassword: '新密碼',
@@ -2954,6 +2976,7 @@ const message = {
lostHelper: '許可證已達到最大重試次數,請手動點選同步按鈕,以確保商業版功能正常使用,詳情:',
exceptionalHelper: '許可證同步驗證異常,請手動點選同步按鈕,以確保商業版功能正常使用,詳情:',
quickUpdate: '快速更新',
import: '匯入',
power: '授權',
unbindHelper: '解除綁定後將清除該節點所有商業版相關設定,是否繼續?',
importLicense: '匯入許可證',
@@ -3075,6 +3098,10 @@ const message = {
backupdate: '備份時間',
versionSelect: '請選擇版本',
operatorHelper: '將對選中應用進行 {0} 操作,是否繼續?',
startOperatorHelper: '即將啟動應用,是否繼續?',
stopOperatorHelper: '即將停止應用,是否繼續?',
restartOperatorHelper: '即將重新啟動應用,是否繼續?',
reloadOperatorHelper: '即將重新載入應用,是否繼續?',
checkInstalledWarn: '未偵測到 {0} ,請進入應用商店點選安裝',
limitHelper: '該應用已安裝,不支援重複安裝',
deleteHelper: '{0}已經關聯以下資源,請檢查後重試',
@@ -3484,9 +3511,9 @@ const message = {
staticChangePHPHelper: '目前為靜態網站,可切換為 PHP 網站',
proxyCache: '反向代理快取',
cacheLimit: '快取空間限制',
shareCahe: '快取計數記憶體大小',
shareCache: '快取計數記憶體大小',
cacheExpire: '快取過期時間',
shareCaheHelper: '每1M記憶體可以儲存約8000個快取物件',
shareCacheHelper: '每1M記憶體可以儲存約8000個快取物件',
cacheLimitHelper: '超過限制會自動刪除舊的快取',
cacheExpireJHelper: '超出時間快取未命中將會被刪除',
realIP: '真實 IP',
@@ -3740,6 +3767,7 @@ const message = {
portFormatError: '請輸入正確的埠資訊',
portHelper1: '多個埠8080,8081',
portHelper2: '範圍埠8080-8089',
changeStrategyHelper: '即將把 [{1}] 的 {0} 策略修改為 [{2}],設定後 {0} 將依 [{2}] 策略對外存取,是否繼續?',
strategy: '策略',
accept: '允許',
drop: '拒絕',
@@ -3803,6 +3831,7 @@ const message = {
},
runtime: {
runtime: '執行環境',
default: '預設',
workDir: '工作目錄',
localHelper: '本機環境安裝及離線環境使用相關問題,可參考 ',
versionHelper: 'PHP的版本,例 v8.0',
@@ -4023,7 +4052,6 @@ const message = {
},
expiresEnterpriseAlert: '溫馨提醒:您的企業版許可證將在 {0} 天後到期,屆時所有企業版功能將無法繼續使用。',
expiresProAlert: '溫馨提醒:您的專業版許可證將在 {0} 天後到期,屆時所有專業版功能將無法繼續使用。',
name: '商業版',
menu: '進階功能',
upage: 'AI 建站',
proAlert: '升級商業版以使用此功能',
@@ -4130,7 +4158,6 @@ const message = {
panelLogin: '面板登入',
sshLogin: 'SSH 登入',
failedRecord: '失敗記錄',
successRecord: '成功記錄',
expired: '已到期',
expiredDays: '已過期 {0} 天',
remainingDays: '{0} · 剩餘 {1} 天',
@@ -4569,6 +4596,14 @@ const message = {
authManage: '認證管理',
auth: {
providerNavigation: '認證類型',
defaultNode: '預設節點',
defaultNodePlaceholder: '請選擇節點',
defaultNodeHelper: '僅用於新使用者。',
defaultNodeRequired: '請選擇有效的預設節點。',
nodesLoadFailed: '節點清單載入失敗,請重試後再選擇預設節點。',
nodeHandling: '節點處理',
assignDefaultNode: '分配預設節點:{node}',
keepExistingNode: '保留已有節點權限',
providers: {
ldap: 'AD/LDAP',
passkey: 'Passkey',
@@ -4596,7 +4631,348 @@ const message = {
planned: '待接入',
plannedTitle: '{0} 認證設定',
plannedDesc: '該認證方式正在規劃中,暫不可用。',
oidc: {
accessMode: '存取方式',
accessModeDesc: '身分提供者支援 Discovery 時優先使用標準模式。',
actionCreate: '建立使用者',
actionKeepName: '保留目前名稱',
actionPending: '等待結果',
actionReject: '拒絕登入',
actionUpdate: '更新身分資訊',
advanced: '進階設定',
advancedDesc: '預設值適用於標準 Provider只有不相容時才調整。',
assignDefaultRole: '指派預設角色:{role}',
authorizationEndpoint: '授權端點',
authorizationEndpointInvalid: '請輸入有效的授權端點位址。',
authorizationFlow: '授權流程',
automatic: '自動',
automaticPolicy: '自動處理策略',
automaticPolicyDesc: '以下規則由後端固定執行,不作為管理員開關。',
basic: '基礎設定',
basicDesc: '先選擇 Provider 模式,再設定客戶端和回呼位址。',
browserTest: '瀏覽器測試登入',
browserTestConflict: '身分驗證成功,但使用者名稱衝突',
browserTestConflictHelper: '對映名稱屬於其他身分,不會自動認領。',
browserTestExpired: '瀏覽器測試已過期',
browserTestExpiredHelper: '請重新開始測試,並在有效期限內完成授權。',
browserTestFailed: '瀏覽器測試失敗',
browserTestFailedHelper: '無法完成身分預覽,請檢視後端傳回的在地化錯誤。',
browserTestIsolation: '執行真實授權往返,但不會建立或更新使用者、指派角色或產生正式 Session。',
browserTestPopupBlocked: '請允許目前站點開啟彈跳窗,然後重新測試。',
browserTestPopupClosed: '授權視窗在測試完成前被關閉。',
browserTestSuccess: 'Provider 驗證成功',
browserTestSuccessHelper: '已完成身分對映預覽,沒有修改使用者或 Session。',
browserTestTitle: 'OIDC 瀏覽器測試登入',
browserTestWaiting: '等待 Provider 授權',
browserTestWaitingHelper: '請在新視窗完成登入,本頁面會自動更新。',
callbackCopied: 'OIDC 回呼位址已複製。',
callbackURL: '回呼位址',
callbackURLHelper: '請將此位址加入身分提供方客戶端的允許回呼清單。',
cancelClearSecret: '取消清除',
clearSecret: '清除金鑰',
clearSecretConfirm: '客戶端金鑰只會在儲存後刪除,是否繼續?',
clientAuthMethod: '客戶端認證方式',
clientAuthMethodHelper: '請選擇身分提供方為該客戶端設定的認證方式。',
clientAuthMethodRequired: '請選擇客戶端認證方式。',
clientID: '客戶端 ID',
clientIDRequired: '請輸入客戶端 ID。',
clientSecret: '客戶端金鑰',
clockSkew: '權杖時間偏差',
clockSkewHelper: '允許身分提供者與面板存在少量時間偏差,建議保持 60 秒。',
clockSkewRequired: '請輸入權杖時間偏差。',
compatibilityMode: '相容模式',
compatibilityModeHelper: '僅用於 Discovery 不完整或端點被改寫的 Provider核心 OIDC 驗證不會關閉。',
configurationFailedHelper: '測試失敗,頁面只顯示後端在地化錯誤。',
configurationFailedTag: '測試失敗',
configurationHighRiskPassed: '設定測試通過,但包含高風險相容項。',
configurationHighRiskTag: '高風險設定通過',
configurationNotTested: '目前設定尚未測試。',
configurationNotTestedTag: '尚未測試',
configurationPassed: '目前設定已通過安全性和能力檢查。',
configurationPassedTag: '測試通過',
configurationStaleHelper: '設定已修改,請重新測試後儲存。',
configurationStaleTag: '結果已過期',
configurationTestMeta: '測試時間 {time},耗時 {duration} ms不儲存 Provider 原始回應。',
configurationTestResult: '設定測試結果',
configurationTestResultDesc:
'此處只檢查自動發現結果與身分提供方能力,不交換授權碼,也無法證明客戶端金鑰正確;請使用「瀏覽器測試登入」完成端對端驗證。',
configurationTestSuccess: 'OIDC 設定測試成功。',
configurationTesting: '正在測試目前 OIDC 設定…',
configurationTestingTag: '正在測試',
configureSecret: '設定金鑰',
conflictExistingRename: '已有 subject 回傳的新 name 已被佔用',
conflictExistingRenameResult: '保留原 User.Name並允許已繫結使用者繼續登入',
conflictLDAP: 'LDAP 使用者',
conflictLocal: '本機使用者',
conflictNewAvailable: '新 subject對映後的 name 未佔用',
conflictNewAvailableResult: '建立本機企業使用者並指派預設角色',
conflictNone: '無衝突',
conflictOIDC: '其他 OIDC 身分',
conflictOccupied: '對映 name 已被本機、LDAP 或其他 OIDC 身分佔用',
conflictOccupiedResult: '拒絕新身分,不自動繫結或合併',
conflictType: '衝突型別',
connectionSecurity: '連線安全',
connectionSecurityDesc: '預設驗證憑證,私有 IdP 位址由系統自動識別。',
connectionTest: '連線與設定測試',
connectionTestCompatibilityDesc: '驗證自訂端點和協定安全性策略。',
connectionTestStandardDesc: '根據簽發者位址自動發現端點和能力。',
connectionTestTab: '連線測試',
customCA: '自訂 CA',
customCAHelper: '僅作用於目前認證來源,且不會寫入日誌。',
customCARequired: '請提供自訂 CA 憑證。',
defaultRole: '預設角色',
defaultRoleHelper: '僅首次建立使用者時指派,後續登入不修改角色。',
defaultRolePlaceholder: '請選擇角色',
defaultRoleRequired: '請選擇有效的預設角色。',
disableAfterSave: '儲存後將停用 OIDC。',
disableConfirm: '停用 OIDC 會立即使該認證來源使用者的存取失效,是否繼續?',
disableDiscardConfirm:
'停用 OIDC 屬於故障兜底操作:只關閉登入入口,並立即使此認證來源使用者的存取失效。本頁其他未儲存修改(包括客戶端金鑰修改)將被丟棄。是否繼續?',
disableTitle: '停用 OIDC',
disabled: '未啟用',
discoveryAllowlist: 'Discovery ∩ 安全白名單',
enable: '是否啟用',
enableAfterSave: '儲存成功後啟用 OIDC。',
enabled: '已啟用',
endSessionEndpoint: '會話登出端點',
endSessionEndpointHelper: '首期只儲存,不執行身分提供方發起的單點登出。',
endSessionEndpointInvalid: '請輸入有效的會話登出端點位址。',
endpointDiscoveryPlaceholder: '測試連線後顯示',
firstLogin: '首次登入',
firstLoginPolicy: '建立本機企業使用者,並指派設定的預設角色。',
fixedAuthorizationCode: 'Authorization Code Flow',
fixedNoTokenPersistence: '不持久化 Token、Claims 和 verifier',
fixedSecurityPolicy: '系統固定執行,無需設定',
fixedStateNonce: '一次性 state 與 nonce',
fixedTokenValidation: 'ID Token 簽章與 Claims 驗證',
highRiskSaveConfirm: '目前啟用設定包含高風險相容項,請確認隔離環境確實需要這些設定。',
highRiskTitle: '高風險 OIDC 設定',
hs256Compatibility: 'HS256相容模式',
hs256KeyHelper: 'HS256 固定使用目前認證來源的客戶端金鑰,不接受另一份簽章金鑰。',
hs256Warning: 'HS256 使用共享對稱金鑰驗證 ID Token僅在 Provider 無法使用非對稱演算法時啟用。',
identityBindingPolicy: '身分主鍵固定為 AuthSourceID + issuer + subject同名不會認領其他帳號。',
identityMissing: '身分已失效',
issuer: '簽發者位址',
issuerHelper: '用於 OIDC 自動發現,回傳的 issuer 必須與該位址一致。',
issuerInvalid: '請輸入不含查詢參數和片段的有效 HTTP 或 HTTPS 簽發者位址。',
issuerRequired: '請輸入簽發者位址。',
jwksRotation: 'JWKS 自動輪替',
jwksURI: 'JWKS 位址',
jwksURIHelper: '使用非對稱簽章且金鑰來源為 JWKS 時必填。',
jwksURIInvalid: '請為目前簽章金鑰來源填寫有效的 JWKS 位址。',
keepExistingRole: '保留已有角色和本機權限',
localSecurityData: '本機安全資料',
localSecurityDataPolicy: '不覆寫角色、MFA、API Key、Passkey 和本機權限。',
localCredentialsManaged:
'使用者名稱和本機密碼由 OIDC 身分管理無法在此修改角色、權限、MFA、API Key 與 Passkey 仍由本機管理。',
localUserFields: '本機使用者欄位',
localUserFieldsDesc: '首期只對映 User.Name不使用 JSON 對映表示式。',
loginWith: '使用 {provider} 登入',
manualEndpoints: '自訂端點',
manualEndpointsDesc: '僅用於自動發現不完整或上游閘道改寫端點的身分提供方。',
mappingResult: '對映結果',
mode: '接入模式',
modeRequired: '請選擇接入模式。',
nameClaim: '使用者名稱 Claim',
nameClaimHelper: '填寫身分提供方傳回使用者名稱的欄位,如 preferred_username。',
nameClaimRequired: '請輸入使用者名稱 Claim。',
nameConflict: '同名衝突策略',
panelURL: '面板對外位址',
panelURLHTTPWarning: 'HTTP 不保護授權回應,僅用於 Provider 接受的隔離私有環境。',
panelURLHelper: '填寫使用者實際存取面板的位址,用於產生回呼位址。',
panelURLInvalid: '請輸入只包含協定、主機和選用連線埠的對外位址。',
panelURLRequired: '請輸入面板對外位址。',
pkceDisabled: '不使用 PKCE僅相容模式',
pkceDisabledWarning: '關閉 PKCE 會降低授權碼流程的抗截獲能力。',
pkceHelper: '優先使用 S256永不提供 plain。',
pkceS256: 'S256建議',
plannedHandling: '預計處理',
privateNetworkIdP: '私有網路 IdP',
privateNetworkIdPHelper:
'明確允許私有位址;元資料、迴路、連結本機、異常重新導向和 DNS 重新繫結仍會阻止。',
privateNetworkWarning: '目前認證來源已允許存取私有網路。',
protocolCompatibility: '協定相容',
protocolCompatibilityDesc: 'ID Token 簽章驗證始終無法關閉。',
providerAndClient: '身分提供方與客戶端',
providerAndClientDesc: '客戶端金鑰只允許替換或清除,頁面不會回顯。',
providerCapabilities: 'Provider 能力',
recentTestSuccess: '最近測試成功:{0}',
recommended: '推薦',
rejectPlain: '拒絕 plain',
replaceSecret: '更換金鑰',
requestAndClaims: '請求與屬性',
requestAndClaimsDesc: '設定授權範圍、使用者資訊補充和請求參數。',
requestTimeout: '請求逾時',
requestTimeoutRequired: '請輸入請求逾時時間。',
restore: '還原',
restored: '已還原到上次儲存的 OIDC 設定。',
result: '處理結果',
rolesLoadFailed: '角色清單載入失敗,請重試後再選擇預設角色。',
roleHandling: '角色處理',
scenario: '場景',
scopes: '授權範圍',
scopesHelper: '必須包含 openid多個範圍請使用空格分隔。',
scopesRequired: 'Scopes 必須包含 openid。',
seconds: '秒',
secretClearHelper: '清除後,重新啟用 OIDC 前必須設定新的客戶端金鑰。',
secretConfigured: '已設定',
secretNotConfigured: '未設定',
secretPlaceholder: '輸入新的客戶端金鑰',
secretReplaceHelper: '新金鑰會在儲存時取代原值,請同步更新身分提供方中的客戶端金鑰。',
secretRequiredHelper: '啟用 OIDC 前需要設定客戶端金鑰。',
secretRequiredToEnable: '請先設定客戶端金鑰,再啟用 OIDC。',
secretSavedHelper: '已加密儲存,留空則繼續使用目前金鑰。',
secretWaiting: '等待輸入',
secretWillClear: '儲存後清除',
secretWillReplace: '待替換',
signingAlgorithm: 'ID Token 簽章演算法',
signingAlgorithmHelper: '只能選擇後端安全白名單中的演算法。',
signingKey: '簽章金鑰',
signingKeyClientSecret: '客戶端金鑰(僅 HS256',
signingKeyJWKS: 'JWKS URI 自動取得與輪替',
signingKeySource: '簽章金鑰來源',
signingKeySourceHelper: '優先使用 JWKS靜態公鑰無法自動輪替。',
signingKeyStatic: '靜態 JWK 或 PEM 公鑰',
standardDiscovery: '標準模式(自動發現)',
standardDiscoveryDesc: '面板自動發現端點和能力,不儲存自動發現原文。',
standardMode: '標準模式',
standardModeHelper: '根據 Issuer 自動發現端點、簽章能力和 PKCE 支援。',
standardProtocolPolicy: '標準協定策略',
standardProtocolPolicyDesc: '自動協商簽章能力,不需要填寫簽章演算法和金鑰。',
staticSigningKey: '靜態簽章公鑰',
staticSigningKeyHelper: '只接受公鑰材料Provider 換 Key 後需要手動更新。',
staticSigningKeyPlaceholder: '貼上 JWK、JWKS JSON 或 PEM 公鑰',
staticSigningKeyRequired: '請提供靜態簽章公鑰。',
staticSigningKeyWarning: '靜態簽章公鑰無法自動輪替Provider 換 Key 前必須手動更新。',
settingLoadFailed: 'OIDC 設定載入失敗',
settingLoadFailedHelper: '為避免以空白預設值覆寫已有設定,目前表單已鎖定。請在連線恢復後重試。',
subsequentLogin: '後續登入',
subsequentLoginPolicy: '按 subject 找到繫結,僅在新名稱可用時更新 User.Name。',
testBeforeBrowserTest: '請先測試目前設定,再進行瀏覽器測試登入。',
testBeforeEnable: '儲存設定變更前,請先測試目前設定。',
testConfiguration: '測試設定',
testDiscovery: '測試連線',
tlsCustomCA: 'HTTPS · 自訂 CA 憑證',
tlsPrivateHTTP: 'HTTP · 僅私人網路(危險)',
tlsPrivateHTTPWarning: 'HTTP 不提供傳輸加密,只允許明確放行的私有目標。',
tlsSkipVerify: '略過 TLS 憑證驗證',
tlsSystem: 'HTTPS · 系統憑證驗證(建議)',
tokenEndpoint: '權杖端點',
tokenEndpointInvalid: '請輸入有效的權杖端點位址。',
transportSecurity: '傳輸安全',
transportSecurityHelper: '優先使用 HTTPS私有 HTTP 還需要明確允許私有網路。',
unsavedChanges: 'OIDC 設定有尚未儲存的變更。',
usedClaim: '使用 Claim',
userInfoEndpoint: '使用者資訊端點',
userInfoEndpointHelper: '使用者名稱欄位缺少時,系統將從此端點補充;留空則不補充。',
userInfoEndpointInvalid: '請輸入有效的使用者資訊端點位址。',
userMapping: '使用者設定',
userMappingDesc: '設定 OIDC 使用者名稱映射,以及首次登入建立使用者時使用的預設節點和角色。',
},
saml2: {
actionCreate: '建立使用者',
actionPending: '等待結果',
actionReject: '拒絕登入',
actionReuse: '使用已綁定使用者',
assignDefaultRole: '分配新使用者角色:{role}',
basic: '基礎設定',
basicDesc: '設定大多數標準 SAML2 身分提供者所需的常用選項。',
browserTest: '測試登入',
browserTestConflict: '身分驗證成功,但使用者名稱衝突',
browserTestConflictHelper: '映射後的使用者名稱屬於其他身分,不會自動關聯。',
browserTestExpired: '瀏覽器測試已過期',
browserTestExpiredHelper: '請重新開始測試,並在有效期內完成登入。',
browserTestFailed: '瀏覽器測試失敗',
browserTestFailedHelper: '無法完成身分預覽,請查看後端傳回的本地化錯誤。',
browserTestIsolation: '執行真實 SAML2 往返,但不會建立使用者、分配角色或產生正式工作階段。',
browserTestPopupBlocked: '請允許目前網站開啟彈出視窗,然後重新測試。',
browserTestPopupClosed: '登入視窗在測試完成前已關閉。',
browserTestSuccess: 'SAML2 身分驗證成功',
browserTestSuccessHelper: '身分映射預覽已完成,沒有修改使用者或工作階段。',
browserTestTitle: 'SAML2 測試登入',
browserTestWaiting: '等待 IdP 登入',
browserTestWaitingHelper: '請在新視窗完成登入,本頁會自動更新。',
certificateFileInvalid: '請選擇有效的 PEM、CRT 或 CER 憑證檔案。',
configured: '已設定',
configurationFailedHelper: '測試失敗,頁面只顯示後端本地化錯誤。',
configurationNotTested: '目前設定尚未測試。',
configurationPassed: '目前設定已通過驗證。',
configurationStaleHelper: '影響驗證的設定已修改,請重新測試目前草稿。',
configurationTestSuccess: 'SAML2 設定測試成功。',
configurationTesting: '正在測試目前 SAML2 設定…',
conflictLDAP: 'LDAP 使用者',
conflictLocal: '本機使用者',
conflictNone: '無衝突',
conflictOIDC: 'OIDC 身分',
conflictSAML2: '其他 SAML2 身分',
conflictType: '衝突類型',
credentialFileReadFailed: '無法讀取憑證檔案。',
credentialFileTooLarge: '憑證檔案不能超過 256 KiB。',
credentialsRequired: '請同時設定 SP 私鑰和 SP 憑證。',
defaultRole: '新使用者角色',
defaultRoleHelper: '僅在首次建立時設定後續登入保留本機角色、MFA 和權限。',
defaultRolePlaceholder: '請選擇角色',
defaultRoleRequired: '請選擇有效的新使用者角色。',
disableConfirm: '停用 SAML2 會立即拒絕新登入並使其使用者工作階段失效,是否繼續?',
disableDiscardConfirm:
'停用 SAML2 會捨棄本頁其他未儲存修改,並立即使其使用者工作階段失效,是否繼續?',
disableTitle: '停用 SAML2',
disabled: '未啟用',
enable: '是否啟用',
enabled: '已啟用',
idpMetadata: 'IdP 元資料',
idpMetadataDesc: '填寫 URL 或貼上 XML擇一即可同時填寫時優先讀取 URL。',
keepExistingRole: '保留現有角色和本機權限',
loginWith: '使用 {provider} 登入',
mappingResult: '映射結果',
metadataRequired: '請填寫 IdP 元資料 URL 或 XML。',
metadataURLHelper: '測試和儲存時由後端讀取並驗證元資料。',
metadataURLInvalid: '請輸入不含憑證和片段的有效 HTTPS 元資料 URL。',
metadataURLRecommended: '元資料 URL建議',
metadataXML: '元資料 XML',
metadataXMLHelper: '適用於身分提供者IdP沒有可存取的元資料 URL 的情況。',
metadataXMLInvalid: '請輸入包含有效 EntityDescriptor 的元資料 XML。',
metadataXMLPlaceholder: '貼上 <EntityDescriptor>...</EntityDescriptor>',
nameAttribute: '使用者名稱屬性',
nameAttributeHelper: '從已驗證的 SAML 斷言中讀取該屬性,並映射為面板使用者名稱。',
nameAttributePlaceholder: '例如 uid、username 或 account',
nameAttributeRequired: '請填寫使用者名稱屬性。',
notConfigured: '未設定',
or: '或',
pageDesc: '透過 IdP 元資料接入企業單一登入,常用設定可在一頁完成。',
plannedHandling: '預計處理',
privateKeyFileInvalid: '請選擇有效的 PEM 私鑰檔案。',
recentTestSuccess: '最近測試成功:{0}',
restore: '還原',
restored: '已還原至上次儲存的 SAML2 設定。',
roleHandling: '角色處理',
rolesLoadFailed: '角色清單載入失敗,請重試後再選擇新使用者角色。',
selectFile: '選擇檔案',
serviceStatus: '服務狀態',
serviceStatusDesc: '首次啟用前需要先通過目前設定測試。',
settingLoadFailed: 'SAML2 設定載入失敗',
settingLoadFailedHelper: '為避免以空白預設值覆寫現有設定,目前表單已鎖定。請在連線恢復後重試。',
spCertificate: 'SP 憑證',
spCertificateHelper: '透過 SP 元資料提供給身分提供者IdP用於驗證登入和登出請求。',
spCredentials: 'SP 私鑰與憑證',
spCredentialsDesc: '用於簽署登入和登出訊息;簽署與安全驗證策略由後端固定處理。',
spPrivateKey: 'SP 私鑰',
spPrivateKeyHelper: '用於簽署 SAML 登入請求和登出訊息,加密儲存且不會回顯。',
syncLogout: '同步登出',
syncLogoutHelper: '從面板或身分提供者任一方登出時,也會同步登出另一方。',
testBeforeBrowserTest: '請先測試目前設定,再執行瀏覽器測試登入。',
testBeforeEnable: '啟用 SAML2 或儲存驗證敏感變更前,請先測試目前設定。',
testConfiguration: '測試設定',
unsavedChanges: 'SAML2 設定有未儲存的變更。',
usedAttribute: '使用者名稱映射',
usersAndRoles: '使用者與角色',
usersAndRolesDesc: '設定面板使用者名稱映射,以及首次登入建立使用者時使用的預設節點和角色。',
},
ldap: {
basic: '基礎設定',
loginTitle: 'LDAP 登入',
loginWith: '使用 LDAP 登入',
backToLocalLogin: '返回面板登入',
enable: '是否啟用',
enabled: '已啟用',
disabled: '未啟用',
@@ -4610,13 +4986,13 @@ const message = {
bindPassword: '密碼',
passwordSaved: '留空則保留已儲存的密碼',
userSearch: '使用者搜尋',
userSearchDesc: '設定使用者搜尋基準與過濾器,並映射到 1Panel 使用者名稱欄位。',
userSearchDesc: '設定使用者搜尋基準與過濾器,並映射到面板使用者名稱欄位。',
userFilter: '使用者篩選器',
userFilterTooltip: '按使用者名稱查詢時替換 %(user)s全量讀取時替換為 *。',
userFilterHelper: '搜尋和認證時會對使用者名稱執行 LDAP filter escaping。',
attributeMap: '映射屬性',
attributeMapTooltip: '1Panel 使用者名稱欄位name到 LDAP 屬性的 JSON 映射。',
attributeMapHelper: '填寫映射到 1Panel 使用者名稱欄位name的 LDAP 屬性。',
attributeMapTooltip: '面板使用者名稱欄位name到 LDAP 屬性的 JSON 映射。',
attributeMapHelper: '填寫映射到面板使用者名稱欄位name的 LDAP 屬性。',
advanced: '進階設定',
advancedDesc: '設定 TLS 和 LDAP 查詢分頁。',
strictSync: '嚴格同步',
@@ -4654,7 +5030,7 @@ const message = {
searchPageSizeRequired: '請輸入 LDAP 查詢分頁大小。',
sync: {
title: '定時同步',
description: '定期讀取 LDAP 全量使用者,並維護 1Panel 中的 LDAP 使用者。',
description: '定期讀取 LDAP 全量使用者,並維護面板中的 LDAP 使用者。',
enable: '是否啟用',
enableHelper: '關閉後不再自動執行,仍可手動立即同步。',
schedule: '執行週期',
@@ -4712,8 +5088,7 @@ const message = {
action: '處理動作',
},
testLoginTitle: '測試 AD/LDAP 登入',
testLoginDesc:
'使用 AD/LDAP 使用者憑證執行 bind 驗證,僅測試認證能力,不建立 1Panel 登入工作階段。',
testLoginDesc: '使用 AD/LDAP 使用者憑證執行 bind 驗證,僅測試認證能力,不建立面板登入工作階段。',
ldapUsername: 'LDAP 使用者名稱',
usernameRequired: '請輸入 LDAP 使用者名稱。',
startTest: '開始測試',
@@ -4791,6 +5166,7 @@ const message = {
deleteConfirm: '確認刪除此匯出記錄及檔案?',
},
waf: {
WAF: 'WAF',
name: 'WAF',
blackWhite: '黑白名單',
globalSetting: '全域設定',
@@ -5145,7 +5521,6 @@ const message = {
duckduckgo: 'DuckDuckGo',
yandex: 'Yandex',
gptbot: 'GPTBot',
exceptUri: '排除 Uri',
top100Helper: '顯示 Top 100 的資料',
logSaveDay: '日誌儲存天數',
cros: 'Chrome OS',
@@ -5349,6 +5724,12 @@ const message = {
nodeUpgradePackageHostConfirm: '即將選擇伺服器檔案{0}是否繼續',
nodeUpgradePackageCleanHelper: '即將清理所有低版本升級包是否繼續',
nodeUpgradeOfflinePackageHelper: '離線環境中異構節點需先上傳對應更新包後再更新',
healthCheck: '健康檢查',
healthCheckFrequency: '檢查頻率',
healthCheckFrequencyHelper: '定期檢查後端節點健康狀態輸入 0 可停用檢查',
healthCheckFrequencyLimit: '檢查頻率不能超過一天且必須為非負整數',
loadFailedNodeResources: '載入失敗節點資源',
loadFailedNodeResourcesHelper: '開啟節點列表時同時載入失敗節點的資源資訊',
nodeUnhealthy: '節點狀態異常',
deletedNode: '已刪除節點 {0} 暫不支援升級操作',
nodeUnhealthyHelper: '偵測到該節點狀態異常請在 [節點管理] 中檢查後重試',
@@ -5428,6 +5809,8 @@ const message = {
offlineHelper: '當節點處於離線環境時使用',
appUpgrade: '應用程式升級',
appUpgradeHelper: ' {0} 個應用程式需要升級',
dashboardSetting: '概覽設定',
keepOneDashboardComponent: '至少保留一個概覽區塊',
},
customApp: {
name: '自訂應用倉庫',
@@ -5596,7 +5979,7 @@ const message = {
alertSmsHelper: '簡訊額度總量{0}已使用{1}',
goBuy: '去購買',
phone: '手機號碼',
phoneHelper: '填寫真實的手機號碼以免不能正常接收告警資訊',
phoneHelper: '請填寫真實的手機號碼以免不能正常接收告警資訊',
dailyAlertNum: '每日告警次數',
dailyAlertNumHelper: '每日告警通知的總次數最多通知 100 ',
timeRange: '時間範圍',
@@ -5926,6 +6309,7 @@ const message = {
snapshotEmpty: '暫無快照',
snapshotHelper:
'快照會將虛擬機目前狀態儲存為還原點後續資料變更會記錄在差異檔案中不會影響原始磁碟還原快照時虛擬機會回到該時間點狀態',
snapshotOperationHelper: '目前快照無法刪除僅能在虛擬機關機時還原快照',
snapshotRecoverConfirm: '確認將虛擬機 [{1}] 恢復到快照 [{0}]恢復後虛擬機磁碟會回到該快照狀態',
interface: '網路介面',
device: '裝置',

View File

@@ -107,19 +107,28 @@ const message = {
search: {
timeStart: '开始时间',
timeEnd: '结束时间',
timeRange: '至',
dateStart: '开始日期',
dateEnd: '结束日期',
date: '日期',
},
table: {
all: '所有',
total: ' {0} ',
name: '名称',
type: '类型',
card: '卡片',
table: '表格',
status: '状态',
statusSuccess: '成功',
statusFailed: '失败',
statusWaiting: '等待中...',
records: '记录',
group: '分组',
default: '默认',
createdAt: '创建时间',
creator: '创建人',
publishedAt: '发布时间',
date: '时间',
updatedAt: '更新时间',
updater: '更新人',
@@ -130,7 +139,10 @@ const message = {
user: '用户',
title: '标题',
port: '端口',
forward: '转发',
protocol: '协议',
tableSetting: '表格设置',
refreshRate: '刷新频率',
noRefresh: '不刷新',
selectColumn: '选择列',
local: '本地',
@@ -155,6 +167,7 @@ const message = {
deleteSuccess: '删除成功',
loginSuccess: '登录成功',
operationSuccess: '操作成功',
operationFailed: '操作失败',
copySuccess: '复制成功',
notSupportOperation: '不支持的当前操作',
requestTimeout: '请求超时请稍后重试',
@@ -195,13 +208,17 @@ const message = {
login: {
username: '用户名',
password: '密码',
welcome: '欢迎回来请使用用户名和密码登录',
errorAuthInfo: '您输入的用户名或密码不正确请重新输入',
errorMfaInfo: '错误的验证信息请重试',
captchaHelper: '验证码',
errorCaptcha: '验证码错误',
codeInput: '请输入 6 MFA 验证码',
mfaTitle: 'MFA 认证',
mfaCode: 'MFA 验证码',
title: 'Linux 服务器运维管理面板',
passkey: '使用通行密钥',
otherLoginMethods: '其他方式登录',
passkeyFailed: '通行密钥登录失败请重试',
passkeyNotSupported: '当前浏览器或环境不支持通行密钥',
passkeyToPassword: '无法使用通行密钥? 使用账号密码登录',
@@ -231,6 +248,7 @@ const message = {
volumeName: '支持英文、数字、.-和_,长度2-30',
supervisorName: '支持非特殊字符开头,英文、数字、-和_,长度1-128',
complexityPassword: '支持长度为 8-30 位且包含字母、数字、特殊字符中至少两项的密码组合',
commonPassword: '长度必须大于 6 位',
linuxName: '长度1-128名称不能含有{0}等符号',
email: '请输入正确的邮箱',
number: '请输入正确的数字',
@@ -239,8 +257,10 @@ const message = {
host: '请输入正确的 IP 或域名',
hostHelper: '支持输入 ip 或域名',
port: '请输入正确的端口,1-65535',
selectHelper: '请选择正确的 {0} 文件',
domain: '域名格式错误',
databaseName: '支持英文、数字、_,长度1-30',
ipErr: '请输入正确的 IP 地址',
numberRange: '数字范围: {0} - {1}',
paramName: '支持英文、数字、.-和_,长度2-64',
paramComplexity: '支持英文、数字、{0},长度6-128特殊字符不能在首尾',
@@ -372,6 +392,7 @@ const message = {
firewall: '防火墙',
filter: '过滤器',
ssl: '证书',
security: '安全',
database: '数据库',
aiTools: 'AI',
mcp: 'MCP',
@@ -396,6 +417,7 @@ const message = {
template: '模板',
},
home: {
recommend: '推荐',
dir: '目录',
alias: '别名',
quickDir: '快捷目录',
@@ -455,6 +477,7 @@ const message = {
shard: '共享',
available: '可用',
percent: '使用率',
goInstall: '去安装',
networkCard: '网卡',
disk: '磁盘',
@@ -469,10 +492,13 @@ const message = {
hide: '收起',
closeLeft: '关闭左侧',
closeRight: '关闭右侧',
closeCurrent: '关闭当前',
closeOther: '关闭其它',
closeAll: '关闭所有',
},
header: {},
header: {
logout: '退出登录',
},
database: {
manage: '管理',
deleteBackupHelper: '同时删除数据库备份',
@@ -1472,6 +1498,7 @@ const message = {
lastHour: '最近 1 小时',
last10Min: '最近 10 分钟',
cleanLog: '清空日志',
cleanLogscope: '清理类型',
downLogHelper1: '即将下载 {0} 容器所有日志,是否继续?',
downLogHelper2: '即将下载 {0} 容器最近 {1} 条日志,是否继续?',
cleanLogHelper: '清空日志需要重启容器,该操作无法回滚,是否继续?',
@@ -1648,7 +1675,7 @@ const message = {
composeDirectory: '编排目录',
template: '模版',
composeTemplate: '编排模版',
exportHelper: '即将导出 {0} 条编排模版,是否继续?',
exportHelper: '将选中的镜像导出为一个 tar 文件。',
content: '内容',
contentEmpty: '编排内容不能为空,请输入后重试!',
containerNumber: '容器数量',
@@ -1738,6 +1765,9 @@ const message = {
website: '备份网站',
rulesHelper: '支持多个排除规则,使用英文逗号 , 分隔,例如:*.log,*.sql',
lastRecordTime: '上次执行情况',
all: '全部',
failedRecord: '失败记录',
successRecord: '成功记录',
database: '备份数据库',
backupArgs: '备份参数',
backupArgsHelper: '未列出的备份参数可手动输入并选择,如: 输入 --no-data 后选择下拉列表中的第一个',
@@ -1846,6 +1876,7 @@ const message = {
cleanLogscope: '清理类型',
},
monitor: {
globalFilter: '全局筛选',
enableMonitor: '监控状态',
storeDays: '保存天数',
defaultNetwork: '默认网卡',
@@ -1858,6 +1889,7 @@ const message = {
avgLoad: '平均负载',
loadDetail: '负载详情',
resourceUsage: '资源使用率',
networkCard: '网卡',
read: '读取',
write: '写入',
readWriteCount: '读写次数',
@@ -1869,6 +1901,7 @@ const message = {
lastHalfYear: '近半年',
memory: '内存',
percent: '占比',
cache: '缓存',
disk: '磁盘',
network: '网络',
up: '上行',
@@ -1922,12 +1955,16 @@ const message = {
createConn: '新建连接',
noHost: '暂无主机',
groupChange: '切换分组',
expand: '全部展开',
fold: '全部收起',
batchInput: '批量输入',
quickCommand: '快速命令',
noSuchCommand: '导入的 csv 文件中未能发现快速命令数据,请检查后重试!',
quickCommandHelper: '常用命令列表,用于在终端界面底部快速选择',
groupDeleteHelper: '移除分组后,分组内所有连接将迁移到 default 分组,是否继续?',
quickCommandBatchHelper: '每行一条快速命令,以 名称---命令 格式,例如:查看磁盘---df -h',
command: '命令',
quickCmd: '快速命令',
addHost: '添加主机',
localhost: '本地服务器',
ip: '主机地址',
@@ -1968,11 +2005,15 @@ const message = {
toolboxHelper: '部分安装和使用问题,可参考',
},
swap: {
swap: 'Swap 分区',
swapHelper1: 'Swap 的大小应该是物理内存的 1 到 2 倍,可根据具体情况进行调整;',
swapHelper2: '在创建 Swap 文件之前请确保系统硬盘有足够的可用空间Swap 文件的大小将占用相应的磁盘空间;',
swapHelper3:
'Swap 可以帮助缓解内存压力,但仅是一个备选项,过多依赖可能导致系统性能下降,建议优先考虑增加内存或优化应用程序内存使用;',
swapHelper4: '建议定期监控 Swap 的使用情况,以确保系统正常运行。',
swapDeleteHelper:
'该操作将移除 Swap 分区 {0}。出于系统安全考虑,不会自动删除对应文件,如需删除请手动处理!',
saveHelper: '请先保存当前设置!',
saveSwap: '保存当前配置将调整 Swap 分区 {0} 大小到 {1},是否继续?',
swapMin: '分区大小最小值为 40 KB请修改后重试',
swapMax: '分区大小最大值为 {0},请修改后重试!',
@@ -1984,6 +2025,7 @@ const message = {
dnsHelper1: '当存在多个 DNS 时,需换行显示,例:\n114.114.114.114\n8.8.8.8',
hostsHelper: '主机名解析',
hosts: '域名',
hostAlert: '已隐藏注释记录,点击“全部配置”按钮可查看或设置',
toolbox: '快速设置',
hostname: '主机名',
passwd: '系统密码',
@@ -2155,6 +2197,7 @@ const message = {
taskRunning: '执行中',
},
file: {
name: '名称',
fileDirNum: '共 {0} 个目录,{1} 个文件,',
currentDir: '当前目录',
dir: '文件夹',
@@ -2563,6 +2606,10 @@ const message = {
cn: '中国大陆',
intl: '全球',
regionHelper: '该操作可能影响后续资源下载与访问,是否继续?',
regionHelper1: '系统安装包',
regionHelper2: '应用商店和脚本库',
regionHelper3: '用户手册及相关文档',
regionHelper4: '该操作可能影响后续下载与访问,请谨慎操作。',
regionTip: '运行区域影响系统更新源以及安装包下载地址。',
docSourceTip: '文档来源决定文档与更新日志的跳转语言。',
languageHelper: '默认跟随浏览器语言,设置后只对当前浏览器生效,更换浏览器后需要重新设置',
@@ -2617,6 +2664,17 @@ const message = {
restartLater: '稍后手动重启',
systemIPWarning: '当前节点尚未配置默认访问地址,请前往面板设置进行设置!',
systemIPWarning1: '当前服务器地址设置为 {0},无法快速跳转!',
syncTime: '服务器时间',
timeZone: '时区',
timeZoneChangeHelper: '修改时区需要重启服务,是否继续?',
timeZoneHelper: '时区修改依赖系统 timedatectl 服务,重启 1Panel 服务后生效。',
timeZoneCN: '北京',
timeZoneAM: '洛杉矶',
timeZoneNY: '纽约',
ntpALi: '阿里云',
ntpGoogle: 'Google',
syncSite: 'NTP 服务器',
syncSiteHelper: '该操作将使用 {0} 作为源同步系统时间,是否继续?',
changePassword: '密码修改',
oldPassword: '原密码',
newPassword: '新密码',
@@ -2723,6 +2781,10 @@ const message = {
stepPanelData: '系统数据',
stepBackupData: '备份数据',
stepOtherData: '其他数据',
operationLog: '保留操作日志',
loginLog: '保留访问日志',
systemLog: '保留系统日志',
taskLog: '保留任务日志',
monitorData: '监控数据',
dockerConf: 'Docker 配置',
selectAllImage: '备份所有应用镜像',
@@ -2950,6 +3012,8 @@ const message = {
lostHelper: '许可证已达到最大重试次数,请手动点击同步按钮,以确保商业版功能正常使用,详情:',
exceptionalHelper: '许可证同步验证异常,请手动点击同步按钮,以确保商业版功能正常使用,详情:',
quickUpdate: '快速更新',
import: '导入',
power: '授权',
unbindHelper: '解除绑定后将清除该节点所有商业版相关设置,是否继续?',
importLicense: '导入许可证',
securityWarningTitle: '请勿使用破解版或来源不明的许可证!',
@@ -3002,6 +3066,7 @@ const message = {
scan: '开始扫描',
scanHelper: '轻松梳理 1Panel 运行期间积累的垃圾文件',
clean: '立即清理',
reScan: '重新扫描',
cleanHelper: '已勾选文件及目录清理后无法回滚,是否继续?',
statusSuggest: '( 建议清理 )',
statusClean: '( 很干净 )',
@@ -3011,6 +3076,7 @@ const message = {
lastCleanHelper: '清理文件及目录:{0} 个, 总计清理:{1}',
cleanSuccessful: '清理成功!',
currentCleanHelper: '本次清理文件及目录:{0} 个, 总计清理:{1}',
suggest: '(建议)',
totalScan: '待清理垃圾文件共计: ',
selectScan: '已选中垃圾文件共计: ',
@@ -3041,6 +3107,7 @@ const message = {
systemLog: '日志文件',
systemLogHelper: '系统日志、任务日志、网站日志文件',
dockerLog: '容器操作日志文件',
taskLog: '计划任务执行日志文件',
shell: 'Shell 脚本计划任务',
containerShell: '容器内执行 Shell 脚本计划任务',
curl: 'CURL 计划任务',
@@ -3072,6 +3139,10 @@ const message = {
backupdate: '备份时间',
versionSelect: '请选择版本',
operatorHelper: '将对选中应用进行 {0} 操作,是否继续?',
startOperatorHelper: '即将启动应用,是否继续?',
stopOperatorHelper: '即将停止应用,是否继续?',
restartOperatorHelper: '即将重启应用,是否继续?',
reloadOperatorHelper: '即将重载应用,是否继续?',
checkInstalledWarn: '未检测到 {0} ,请进入应用商店点击安装!',
limitHelper: '该应用已安装,不支持重复安装',
deleteHelper: '{0}已经关联以下资源,请检查后重试!',
@@ -3483,9 +3554,9 @@ const message = {
staticChangePHPHelper: '当前为静态网站,可以切换为 PHP 网站',
proxyCache: '反代缓存',
cacheLimit: '缓存空间限制',
shareCahe: '缓存计数内存大小',
shareCache: '缓存计数内存大小',
cacheExpire: '缓存过期时间',
shareCaheHelper: '每1M内存可以存储约8000个缓存对象',
shareCacheHelper: '每1M内存可以存储约8000个缓存对象',
cacheLimitHelper: '超过限制会自动删除旧的缓存',
cacheExpireJHelper: '超出时间缓存未命中将会被删除',
realIP: '真实 IP',
@@ -3557,6 +3628,8 @@ const message = {
default_socket_timeout: 'Socket超时时间',
error_reporting: '错误级别',
display_errors: '是否输出详细错误信息',
cgi_fix_pathinfo: '是否开启 pathinfo',
date_timezone: '时区',
disableFunction: '禁用函数',
disableFunctionHelper: '输入要禁用的函数例如exec多个请用,分割',
uploadMaxSize: '上传限制',
@@ -3564,6 +3637,7 @@ const message = {
extensions: '扩展模版',
extension: '扩展',
extensionsHelper: '多个扩展请用,分割',
extensionHelper: '多个扩展请使用英文逗号分隔',
toExtensionsList: '查看扩展列表',
containerConfig: '容器配置',
containerConfigHelper: '环境变量等信息可以在创建完成之后在配置-容器配置中修改',
@@ -3741,6 +3815,7 @@ const message = {
portFormatError: '请输入正确的端口信息!',
portHelper1: '多个端口8080,8081',
portHelper2: '范围端口8080-8089',
changeStrategyHelper: '即将把 [{1}] 的 {0} 策略修改为 [{2}],设置后 {0} 将按 [{2}] 策略对外访问,是否继续?',
strategy: '策略',
accept: '允许',
drop: '拒绝',
@@ -3778,6 +3853,7 @@ const message = {
initHelper: '检测到 {0} 未初始化,请点击顶部状态栏的初始化按钮进行配置!',
bindHelper: '绑定 仅当状态为绑定时,防火墙规则才能生效,是否确认?',
unbindHelper: '解绑 解除绑定时,已添加的所有防火墙规则将失效,请谨慎操作,是否确认?',
whiteList: '白名单',
portWhiteList: '端口白名单',
portWhiteListAlter: '防火墙初始化或启动时,将自动放行白名单端口',
portWhiteListHelper: '支持指定协议(如 80/tcp、443/udp未指定时默认使用 TCP。',
@@ -3802,6 +3878,7 @@ const message = {
},
runtime: {
runtime: '运行环境',
default: '默认',
workDir: '工作目录',
localHelper: '本地环境安装及离线环境使用相关问题,可参考 ',
versionHelper: 'PHP的版本,例 v8.0',
@@ -4046,7 +4123,9 @@ const message = {
deleteConfirm: '确认删除此导出记录及文件?',
},
waf: {
WAF: 'WAF',
name: 'WAF',
resource: '资源',
blackWhite: '黑白名单',
globalSetting: '全局设置',
websiteSetting: '网站设置',
@@ -4328,6 +4407,10 @@ const message = {
ip: '独立 IP',
spider: '蜘蛛',
visitors: '访客趋势',
today: '今天',
last7days: '最近 7 天',
last30days: '最近 30 天',
all: '全部',
uvMap: '访客地图 (30日)',
qps: '实时请求数1分钟',
flowSec: '实时流量1分钟',
@@ -4459,25 +4542,31 @@ const message = {
},
setting: {
setting: '界面设置',
title: '面板描述',
titleHelper: '将显示在用户登录页面例如Linux 服务器运维管理面板,建议 8-15 个字符)',
logo: 'Logo (不带文字)',
logoHelper: '将会显示在菜单收缩时管理页面左上方 (建议图片大小为: 82px*82px)',
logoWithText: 'Logo (带文字)',
logoWithTextHelper: '将会显示在菜单展开时管理页面左上方 (建议图片大小为: 185px*55px)',
favicon: '网站图标',
faviconHelper: '网站图标 (建议图片大小为: 16px*16px)',
setDefault: '恢复默认',
setHelper: '即将保存当前界面设置内容,是否继续?',
setDefaultHelper: '即将恢复所有界面设置到初始状态,是否继续?',
logoGroup: 'Logo',
imageGroup: '图片',
loginImage: '图片',
loginImageHelper: '将会显示在登录页面(建议图片大小为: 500*416px)',
loginBgType: '背景类型',
loginBgImage: '背景图片',
loginBgImageHelper: '将会显示在登录页面背景图片(建议图片大小为: 1920*1080px)',
loginBgColor: '背景颜色',
loginBgColorHelper: '将在登录页面显示为背景颜色',
image: '图片',
bgColor: '背景色',
loginGroup: '登录页',
loginBtnLinkColor: '按钮/链接颜色',
loginBtnLinkColorHelper: '将在登录页面显示为按钮和链接颜色',
},
helper: {
wafTitle1: '拦截地图',
@@ -5233,6 +5322,14 @@ const message = {
authManage: '认证管理',
auth: {
providerNavigation: '认证类型',
defaultNode: '默认节点',
defaultNodePlaceholder: '请选择节点',
defaultNodeHelper: '仅用于新用户',
defaultNodeRequired: '请选择有效的默认节点',
nodesLoadFailed: '节点列表加载失败请重试后再选择默认节点',
nodeHandling: '节点处理',
assignDefaultNode: '分配默认节点{node}',
keepExistingNode: '保留已有节点权限',
providers: {
ldap: 'AD/LDAP',
passkey: 'Passkey',
@@ -5260,7 +5357,347 @@ const message = {
planned: '待接入',
plannedTitle: '{0} 认证设置',
plannedDesc: '该认证方式正在规划中暂不可用',
oidc: {
accessMode: '接入方式',
accessModeDesc: '身份提供方支持 Discovery 时优先使用标准模式',
actionCreate: '创建用户',
actionKeepName: '保留当前名称',
actionPending: '等待结果',
actionReject: '拒绝登录',
actionUpdate: '更新身份信息',
advanced: '高级设置',
advancedDesc: '默认值适用于标准 Provider只有不兼容时才调整',
assignDefaultRole: '分配默认角色{role}',
authorizationEndpoint: '授权端点',
authorizationEndpointInvalid: '请输入有效的授权端点地址',
authorizationFlow: '授权流程',
automatic: '自动',
automaticPolicy: '自动处理策略',
automaticPolicyDesc: '以下规则由后端固定执行不作为管理员开关',
basic: '基础配置',
basicDesc: '先选择 Provider 模式再配置客户端和回调地址',
browserTest: '测试登录',
browserTestConflict: '身份验证成功但用户名冲突',
browserTestConflictHelper: '映射名称属于其他身份不会自动认领',
browserTestExpired: '浏览器测试已过期',
browserTestExpiredHelper: '请重新开始测试并在有效期内完成授权',
browserTestFailed: '浏览器测试失败',
browserTestFailedHelper: '无法完成身份预览请查看后端返回的本地化错误',
browserTestIsolation: '执行真实授权往返但不会创建或更新用户分配角色或生成正式 Session',
browserTestPopupBlocked: '请允许当前站点打开弹窗然后重新测试',
browserTestPopupClosed: '授权窗口在测试完成前被关闭',
browserTestSuccess: 'Provider 验证成功',
browserTestSuccessHelper: '已完成身份映射预览没有修改用户或 Session',
browserTestTitle: 'OIDC 浏览器测试登录',
browserTestWaiting: '等待 Provider 授权',
browserTestWaitingHelper: '请在新窗口完成登录本页面会自动更新',
callbackCopied: 'OIDC 回调地址已复制',
callbackURL: '回调地址',
callbackURLHelper: '请将此地址添加到身份提供方客户端的允许回调列表',
cancelClearSecret: '取消清除',
clearSecret: '清除密钥',
clearSecretConfirm: '客户端密钥只会在保存后删除是否继续',
clientAuthMethod: '客户端认证方式',
clientAuthMethodHelper: '请选择身份提供方为该客户端配置的认证方式',
clientAuthMethodRequired: '请选择客户端认证方式',
clientID: '客户端 ID',
clientIDRequired: '请输入客户端 ID',
clientSecret: '客户端密钥',
clockSkew: '令牌时间偏差',
clockSkewHelper: '允许身份提供方与面板存在少量时间偏差建议保持 60 ',
clockSkewRequired: '请输入令牌时间偏差',
compatibilityMode: '兼容模式',
compatibilityModeHelper: '仅用于 Discovery 不完整或端点被改写的 Provider核心 OIDC 校验不会关闭',
configurationFailedHelper: '测试失败页面只显示后端本地化错误',
configurationFailedTag: '测试失败',
configurationHighRiskPassed: '配置测试通过但包含高风险兼容项',
configurationHighRiskTag: '高风险配置通过',
configurationNotTested: '当前配置尚未测试',
configurationNotTestedTag: '尚未测试',
configurationPassed: '当前配置已通过安全和能力检查',
configurationPassedTag: '测试通过',
configurationStaleHelper: '配置已修改请重新测试保存',
configurationStaleTag: '结果已过期',
configurationTestMeta: '测试时间 {time}耗时 {duration} ms不保存 Provider 原始响应',
configurationTestResult: '配置测试结果',
configurationTestResultDesc:
'这里只检查自动发现结果与身份提供方能力不交换授权码也不能证明客户端密钥正确请使用浏览器测试登录完成端到端验证',
configurationTestSuccess: 'OIDC 配置测试成功',
configurationTesting: '正在测试当前 OIDC 配置',
configurationTestingTag: '正在测试',
configureSecret: '配置密钥',
conflictExistingRename: '已有 subject 返回的新 name 已被占用',
conflictExistingRenameResult: '保留原 User.Name并允许已绑定用户继续登录',
conflictLDAP: 'LDAP 用户',
conflictLocal: '本地用户',
conflictNewAvailable: ' subject映射后的 name 未占用',
conflictNewAvailableResult: '创建本地企业用户并分配默认角色',
conflictNone: '无冲突',
conflictOIDC: '其他 OIDC 身份',
conflictOccupied: '映射 name 已被本地LDAP 或其他 OIDC 身份占用',
conflictOccupiedResult: '拒绝新身份不自动绑定或合并',
conflictType: '冲突类型',
connectionSecurity: '连接安全',
connectionSecurityDesc: '默认校验证书私有 IdP 地址由系统自动识别',
connectionTest: '连接与配置测试',
connectionTestCompatibilityDesc: '验证自定义端点和协议安全策略',
connectionTestStandardDesc: '根据签发者地址自动发现端点和能力',
connectionTestTab: '连接测试',
customCA: '自定义 CA',
customCAHelper: '仅作用于当前认证源且不会写入日志',
customCARequired: '请提供自定义 CA 证书',
defaultRole: '默认角色',
defaultRoleHelper: '仅首次创建用户时分配后续登录不修改角色',
defaultRolePlaceholder: '请选择角色',
defaultRoleRequired: '请选择有效的默认角色',
disableAfterSave: '保存后将停用 OIDC',
disableConfirm: '停用 OIDC 会立即使该认证源用户的访问失效是否继续',
disableDiscardConfirm:
'停用 OIDC 属于故障兜底操作只关闭登录入口并立即使该认证源用户的访问失效本页其他未保存修改包括客户端密钥修改将被丢弃是否继续',
disableTitle: '停用 OIDC',
disabled: '未启用',
discoveryAllowlist: 'Discovery 安全白名单',
enable: '是否开启',
enableAfterSave: '保存成功后启用 OIDC',
enabled: '已启用',
endSessionEndpoint: '会话注销端点',
endSessionEndpointHelper: '首期只保存不执行身份提供方发起的单点登出',
endSessionEndpointInvalid: '请输入有效的会话注销端点地址',
endpointDiscoveryPlaceholder: '测试连接后显示',
firstLogin: '首次登录',
firstLoginPolicy: '创建本地企业用户并分配配置的默认角色',
fixedAuthorizationCode: 'Authorization Code Flow',
fixedNoTokenPersistence: '不持久化 TokenClaims verifier',
fixedSecurityPolicy: '系统固定执行无需配置',
fixedStateNonce: '一次性 state nonce',
fixedTokenValidation: 'ID Token 签名与 Claims 校验',
highRiskSaveConfirm: '当前启用配置包含高风险兼容项请确认隔离环境确实需要这些设置',
highRiskTitle: '高风险 OIDC 配置',
hs256Compatibility: 'HS256兼容模式',
hs256KeyHelper: 'HS256 固定使用当前认证源的客户端密钥不接受另一份签名密钥',
hs256Warning: 'HS256 使用共享对称密钥验证 ID Token仅在 Provider 无法使用非对称算法时启用',
identityBindingPolicy: '身份主键固定为 AuthSourceID + issuer + subject同名不会认领其他账号',
identityMissing: '身份已失效',
issuer: '签发者地址',
issuerHelper: '用于 OIDC 自动发现返回的 issuer 必须与该地址一致',
issuerInvalid: '请输入不含查询参数和片段的有效 HTTP HTTPS 签发者地址',
issuerRequired: '请输入签发者地址',
jwksRotation: 'JWKS 自动轮换',
jwksURI: 'JWKS 地址',
jwksURIHelper: '使用非对称签名且密钥来源为 JWKS 时必填',
jwksURIInvalid: '请为当前签名密钥来源填写有效的 JWKS 地址',
keepExistingRole: '保留已有角色和本地权限',
localSecurityData: '本地安全数据',
localSecurityDataPolicy: '不覆盖角色MFAAPI KeyPasskey 和本地权限',
localCredentialsManaged:
'用户名和本地密码由 OIDC 身份管理不能在此修改角色权限MFAAPI Key Passkey 仍由本地管理',
localUserFields: '本地用户字段',
localUserFieldsDesc: '首期只映射 User.Name不使用 JSON 映射表达式',
loginWith: '使用 {provider} 登录',
manualEndpoints: '自定义端点',
manualEndpointsDesc: '仅用于自动发现不完整或上游网关改写端点的身份提供方',
mappingResult: '映射结果',
mode: '接入模式',
modeRequired: '请选择接入模式',
nameClaim: '用户名 Claim',
nameClaimHelper: '填写身份提供方返回用户名的字段 preferred_username',
nameClaimRequired: '请输入用户名 Claim',
nameConflict: '同名冲突策略',
panelURL: '面板对外地址',
panelURLHTTPWarning: 'HTTP 不保护授权响应仅用于 Provider 接受的隔离私有环境',
panelURLHelper: '填写用户实际访问面板的地址用于生成回调地址',
panelURLInvalid: '请输入只包含协议主机和可选端口的对外地址',
panelURLRequired: '请输入面板对外地址',
pkceDisabled: '不使用 PKCE仅兼容模式',
pkceDisabledWarning: '关闭 PKCE 会降低授权码流程的抗截获能力',
pkceHelper: '优先使用 S256永不提供 plain',
pkceS256: 'S256推荐',
plannedHandling: '预计处理',
privateNetworkIdP: '私有网络 IdP',
privateNetworkIdPHelper:
'显式允许私有地址元数据回环链路本地异常重定向和 DNS 重绑定仍会阻止',
privateNetworkWarning: '当前认证源已允许访问私有网络',
protocolCompatibility: '协议兼容',
protocolCompatibilityDesc: 'ID Token 签名校验始终不能关闭',
providerAndClient: '身份提供方与客户端',
providerAndClientDesc: '客户端密钥只允许替换或清除页面不会回显',
providerCapabilities: 'Provider 能力',
recentTestSuccess: '最近测试成功{0}',
recommended: '推荐',
rejectPlain: '拒绝 plain',
replaceSecret: '更换密钥',
requestAndClaims: '请求与属性',
requestAndClaimsDesc: '配置授权范围用户信息补充和请求参数',
requestTimeout: '请求超时',
requestTimeoutRequired: '请输入请求超时时间',
restore: '还原',
restored: '已还原到上次保存的 OIDC 配置',
result: '处理结果',
rolesLoadFailed: '角色列表加载失败请重试后再选择默认角色',
roleHandling: '角色处理',
scenario: '场景',
scopes: '授权范围',
scopesHelper: '必须包含 openid多个范围使用空格分隔',
scopesRequired: 'Scopes 必须包含 openid',
seconds: '秒',
secretClearHelper: '清除后重新启用 OIDC 前必须配置新的客户端密钥',
secretConfigured: '已配置',
secretNotConfigured: '未配置',
secretPlaceholder: '输入新的客户端密钥',
secretReplaceHelper: '新密钥将在保存时替换原值请同时更新身份提供方中的客户端密钥',
secretRequiredHelper: '启用 OIDC 前需要配置客户端密钥',
secretRequiredToEnable: '请先配置客户端密钥再启用 OIDC',
secretSavedHelper: '已加密保存留空则继续使用当前密钥',
secretWaiting: '等待输入',
secretWillClear: '保存后清除',
secretWillReplace: '待替换',
signingAlgorithm: 'ID Token 签名算法',
signingAlgorithmHelper: '只能选择后端安全白名单中的算法',
signingKey: '签名密钥',
signingKeyClientSecret: '客户端密钥 HS256',
signingKeyJWKS: 'JWKS URI 自动获取和轮换',
signingKeySource: '签名密钥来源',
signingKeySourceHelper: '优先使用 JWKS静态公钥无法自动轮换',
signingKeyStatic: '静态 JWK PEM 公钥',
standardDiscovery: '标准模式自动发现',
standardDiscoveryDesc: '面板自动发现端点和能力不保存自动发现原文',
standardMode: '标准模式',
standardModeHelper: '根据 Issuer 自动发现端点签名能力和 PKCE 支持',
standardProtocolPolicy: '标准协议策略',
standardProtocolPolicyDesc: '自动协商签名能力不需要填写签名算法和 Key',
staticSigningKey: '静态签名公钥',
staticSigningKeyHelper: '只接受公钥材料Provider Key 后需要手动更新',
staticSigningKeyPlaceholder: '粘贴 JWKJWKS JSON PEM 公钥',
staticSigningKeyRequired: '请提供静态签名公钥',
staticSigningKeyWarning: '静态签名公钥无法自动轮换Provider Key 前必须手动更新',
settingLoadFailed: 'OIDC 配置加载失败',
settingLoadFailedHelper: '为避免用空白默认值覆盖已有配置当前表单已锁定请在连接恢复后重试',
subsequentLogin: '后续登录',
subsequentLoginPolicy: ' subject 找到绑定仅在新名称可用时更新 User.Name',
testBeforeBrowserTest: '请先测试当前配置再进行浏览器测试登录',
testBeforeEnable: '保存变更配置前请先测试当前配置',
testConfiguration: '测试连接',
testDiscovery: '测试连接',
tlsCustomCA: 'HTTPS · 自定义 CA 证书',
tlsPrivateHTTP: 'HTTP · 仅私有网络危险',
tlsPrivateHTTPWarning: 'HTTP 不提供传输加密只允许显式放行的私有目标',
tlsSkipVerify: '跳过 TLS 证书校验',
tlsSystem: 'HTTPS · 系统证书校验推荐',
tokenEndpoint: '令牌端点',
tokenEndpointInvalid: '请输入有效的令牌端点地址',
transportSecurity: '传输安全',
transportSecurityHelper: '优先使用 HTTPS私有 HTTP 还需要显式允许私有网络',
unsavedChanges: 'OIDC 配置有未保存的更改',
usedClaim: '使用 Claim',
userInfoEndpoint: '用户信息端点',
userInfoEndpointHelper: '用户名字段缺失时系统将从该端点补充留空则不补充',
userInfoEndpointInvalid: '请输入有效的用户信息端点地址',
userMapping: '用户配置',
userMappingDesc: '设置 OIDC 用户名映射以及首次登录创建用户时使用的默认节点和角色',
},
saml2: {
actionCreate: '创建用户',
actionPending: '等待结果',
actionReject: '拒绝登录',
actionReuse: '使用已绑定用户',
assignDefaultRole: '分配新用户角色{role}',
basic: '基础配置',
basicDesc: '配置大多数标准 SAML2 身份提供商所需的常用选项',
browserTest: '测试登录',
browserTestConflict: '身份验证成功但用户名冲突',
browserTestConflictHelper: '映射后的用户名属于其他身份不会自动关联',
browserTestExpired: '浏览器测试已过期',
browserTestExpiredHelper: '请重新开始测试并在有效期内完成登录',
browserTestFailed: '浏览器测试失败',
browserTestFailedHelper: '无法完成身份预览请查看后端返回的本地化错误',
browserTestIsolation: '执行真实 SAML2 往返但不会创建用户分配角色或生成正式会话',
browserTestPopupBlocked: '请允许当前站点打开弹窗然后重新测试',
browserTestPopupClosed: '登录窗口在测试完成前被关闭',
browserTestSuccess: 'SAML2 身份验证成功',
browserTestSuccessHelper: '身份映射预览已完成没有修改用户或会话',
browserTestTitle: 'SAML2 测试登录',
browserTestWaiting: '等待 IdP 登录',
browserTestWaitingHelper: '请在新窗口完成登录本页面会自动更新',
certificateFileInvalid: '请选择有效的 PEMCRT CER 证书文件',
configured: '已配置',
configurationFailedHelper: '测试失败页面只显示后端本地化错误',
configurationNotTested: '当前配置尚未测试',
configurationPassed: '当前配置已通过校验',
configurationStaleHelper: '影响认证的配置已经修改请重新测试当前草稿',
configurationTestSuccess: 'SAML2 配置测试成功',
configurationTesting: '正在测试当前 SAML2 配置',
conflictLDAP: 'LDAP 用户',
conflictLocal: '本地用户',
conflictNone: '无冲突',
conflictOIDC: 'OIDC 身份',
conflictSAML2: '其他 SAML2 身份',
conflictType: '冲突类型',
credentialFileReadFailed: '无法读取凭据文件',
credentialFileTooLarge: '凭据文件不能超过 256 KiB',
credentialsRequired: '请同时配置 SP 私钥和 SP 证书',
defaultRole: '新用户角色',
defaultRoleHelper: '仅首次创建时设置后续登录保留本地角色MFA 和权限',
defaultRolePlaceholder: '请选择角色',
defaultRoleRequired: '请选择有效的新用户角色',
disableConfirm: '停用 SAML2 会立即拒绝新登录并使其用户会话失效是否继续',
disableDiscardConfirm: '停用 SAML2 会丢弃本页其他未保存修改并立即使其用户会话失效是否继续',
disableTitle: '停用 SAML2',
disabled: '未启用',
enable: '是否开启',
enabled: '已启用',
idpMetadata: 'IdP 元数据',
idpMetadataDesc: '填写 URL 或粘贴 XML二选一即可同时填写时优先读取 URL',
keepExistingRole: '保留已有角色和本地权限',
loginWith: '使用 {provider} 登录',
mappingResult: '映射结果',
metadataRequired: '请填写 IdP 元数据 URL XML',
metadataURLHelper: '测试和保存时由后端读取并校验元数据',
metadataURLInvalid: '请输入不含凭据和片段的有效 HTTPS 元数据 URL',
metadataURLRecommended: '元数据 URL推荐',
metadataXML: '元数据 XML',
metadataXMLHelper: '适用于身份提供商IdP没有可访问的元数据 URL 的场景',
metadataXMLInvalid: '请输入包含有效 EntityDescriptor 的元数据 XML',
metadataXMLPlaceholder: '粘贴 <EntityDescriptor>...</EntityDescriptor>',
nameAttribute: '用户名属性',
nameAttributeHelper: '从已验证的 SAML 断言中读取该属性并映射为面板用户名',
nameAttributePlaceholder: '例如 uidusername account',
nameAttributeRequired: '请填写用户名属性',
notConfigured: '未配置',
or: '或',
pageDesc: '通过 IdP 元数据接入企业单点登录常用配置在一个页面完成',
plannedHandling: '预计处理',
privateKeyFileInvalid: '请选择有效的 PEM 私钥文件',
recentTestSuccess: '最近测试成功{0}',
restore: '还原',
restored: '已还原到上次保存的 SAML2 配置',
roleHandling: '角色处理',
rolesLoadFailed: '角色列表加载失败请重试后再选择新用户角色',
selectFile: '选择文件',
serviceStatus: '服务状态',
serviceStatusDesc: '首次启用前需要先通过当前配置测试',
settingLoadFailed: 'SAML2 配置加载失败',
settingLoadFailedHelper: '为避免用空白默认值覆盖已有配置当前表单已锁定请在连接恢复后重试',
spCertificate: 'SP 证书',
spCertificateHelper: '通过 SP 元数据提供给身份提供商IdP用于验证登录和注销请求',
spCredentials: 'SP 私钥与证书',
spCredentialsDesc: '用于签名登录和注销消息具体签名与安全校验策略由后端固定处理',
spPrivateKey: 'SP 私钥',
spPrivateKeyHelper: '用于签名 SAML 登录请求和注销消息加密保存且不会回显',
syncLogout: '同步注销',
syncLogoutHelper: '用户退出面板时同时退出身份提供商从身份提供商注销时也会同步退出面板',
testBeforeBrowserTest: '请先测试当前配置再进行浏览器测试登录',
testBeforeEnable: '启用 SAML2 或保存认证敏感变更前请先测试当前配置',
testConfiguration: '测试配置',
unsavedChanges: 'SAML2 配置有未保存的更改',
usedAttribute: '用户名映射',
usersAndRoles: '用户与角色',
usersAndRolesDesc: '设置面板用户名映射以及首次登录创建用户时使用的默认节点和角色',
},
ldap: {
basic: '基础配置',
loginTitle: 'LDAP 登录',
loginWith: '使用 LDAP 登录',
backToLocalLogin: '返回面板登录',
enable: '是否开启',
enabled: '已启用',
disabled: '未启用',
@@ -5274,13 +5711,13 @@ const message = {
bindPassword: '密码',
passwordSaved: '留空则保留已保存的密码',
userSearch: '用户搜索',
userSearchDesc: '配置用户搜索基准与过滤器并映射到 1Panel 用户名字段',
userSearchDesc: '配置用户搜索基准与过滤器并映射到面板用户名字段',
userFilter: '用户过滤器',
userFilterTooltip: '按用户名查询时替换 %(user)s全量读取时替换为 *',
userFilterHelper: '搜索和认证时会对用户名执行 LDAP filter escaping',
attributeMap: '映射属性',
attributeMapTooltip: '1Panel 用户名字段name LDAP 属性的 JSON 映射',
attributeMapHelper: '填写映射到 1Panel 用户名字段name LDAP 属性',
attributeMapTooltip: '面板用户名字段name LDAP 属性的 JSON 映射',
attributeMapHelper: '填写映射到面板用户名字段name LDAP 属性',
advanced: '高级设置',
advancedDesc: '配置 TLS LDAP 查询分页',
strictSync: '严格同步',
@@ -5318,7 +5755,7 @@ const message = {
searchPageSizeRequired: '请输入 LDAP 查询分页大小',
sync: {
title: '定时同步',
description: '定期读取 LDAP 全量用户并维护 1Panel 中的 LDAP 用户',
description: '定期读取 LDAP 全量用户并维护面板中的 LDAP 用户',
enable: '是否启用',
enableHelper: '关闭后不再自动执行仍可手动立即同步',
schedule: '执行周期',
@@ -5376,7 +5813,7 @@ const message = {
action: '处理动作',
},
testLoginTitle: '测试 AD/LDAP 登录',
testLoginDesc: '使用 AD/LDAP 用户凭据执行 bind 验证仅测试认证能力不创建 1Panel 登录会话',
testLoginDesc: '使用 AD/LDAP 用户凭据执行 bind 验证仅测试认证能力不创建面板登录会话',
ldapUsername: 'LDAP 用户名',
usernameRequired: '请输入 LDAP 用户名',
startTest: '开始测试',
@@ -5444,7 +5881,11 @@ const message = {
'用于自定义镜像前缀自动修改 Compose 文件中的镜像字段\n 例如当镜像前缀设置为 1panel/custom MaxKB 的镜像将变更为 1panel/custom/maxkb:v1.10.0',
closeHelper: '是否取消使用自定义仓库',
appStoreUrlHelper: '仅支持 .tar.gz 格式',
postNode: '同步至子节点',
postNodeHelper: '将自定义应用仓库包同步到子节点安装目录下的 tmp/customApp/apps.tar.gz',
nodes: '节点',
selectNode: '选择节点',
selectNodeError: '请选择节点',
licenseHelper: '商业版支持自定义应用仓库功能',
databaseHelper: '应用关联数据库请选择目标节点数据库',
nodeHelper: '不能选择当前节点',
@@ -5478,6 +5919,7 @@ const message = {
memory: '面板服务器内存过高告警',
load: '面板服务器负载过高告警',
disk: '面板服务器磁盘过高告警',
website: '网站',
certificate: '证书',
remainingDays: '剩余天数',
sendCount: '告警次数',
@@ -5598,6 +6040,9 @@ const message = {
timeRange: '时间范围',
sendTimeRange: '可发送时间范围',
sendTimeRangeHelper: '可推送{0}时间范围',
to: '至',
startTime: '开始时间',
endTime: '结束时间',
defaultPhone: '默认使用与许可证绑定的账户手机号',
noticeAlert: '通知告警',
resourceAlert: '资源告警',
@@ -5674,6 +6119,7 @@ const message = {
classicBlue: '经典蓝',
freshGreen: '清新绿',
customColor: '自定义主题色',
setDefault: '恢复默认',
setDefaultHelper: '即将恢复主题配色到初始状态是否继续',
setHelper: '即将保存当前选定的主题配色是否继续',
},
@@ -5925,6 +6371,7 @@ const message = {
snapshotEmpty: '暂无快照',
snapshotHelper:
'快照会保存虚拟机当前状态作为还原点后续数据变化会记录在差分文件中不影响原始磁盘恢复快照时虚拟机会回到该时间点状态',
snapshotOperationHelper: '当前快照无法删除仅可在虚拟机关机时恢复快照',
snapshotRecoverConfirm: '确认将虚拟机 [{1}] 恢复到快照 [{0}]恢复后虚拟机磁盘会回到该快照状态',
interface: '网络接口',
device: '设备',

View File

@@ -101,6 +101,7 @@ import { getAgentSettingInfo } from '@/api/modules/setting';
import { computed, onMounted, ref } from 'vue';
import bus from '@/global/bus';
import { logOutApi } from '@/api/modules/auth';
import { submitSAML2Navigation } from '@/utils/saml2';
import router from '@/routers';
import { loadProductProFromDB } from '@/utils/xpack';
import { routerToNameWithQuery } from '@/utils/router';
@@ -277,9 +278,15 @@ const logout = () => {
type: 'warning',
})
.then(async () => {
await logOutApi();
const res = await logOutApi();
globalStore.setLogStatus(false);
globalStore.clearAuthInfo();
if (res.data?.saml2Navigation) {
try {
submitSAML2Navigation(res.data.saml2Navigation);
return;
} catch {}
}
router.push({ name: 'entrance', params: { code: entrance.value } });
MsgSuccess(i18n.global.t('commons.msg.operationSuccess'));
})

View File

@@ -26,7 +26,7 @@
/>
<el-form-item :label="$t('commons.login.username')" prop="name">
<el-input
type="primary"
type="text"
v-model="form.name"
name="profile-name"
autocomplete="off"

View File

@@ -0,0 +1,45 @@
export type SAML2Navigation =
| {
binding: 'redirect';
redirectURL: string;
}
| {
binding: 'post';
postURL: string;
fields: Record<string, string>;
};
const validateNavigationURL = (value: string) => {
const url = new URL(value, window.location.origin);
if (!['http:', 'https:'].includes(url.protocol)) {
throw new Error('Unsupported SAML2 navigation protocol');
}
return url.toString();
};
export const submitSAML2Navigation = (navigation: SAML2Navigation, targetWindow: Window = window) => {
if (navigation.binding === 'redirect' && navigation.redirectURL) {
targetWindow.location.assign(validateNavigationURL(navigation.redirectURL));
return;
}
if (navigation.binding !== 'post' || !navigation.postURL || !navigation.fields) {
throw new Error('Invalid SAML2 navigation response');
}
const form = targetWindow.document.createElement('form');
form.method = 'POST';
form.action = validateNavigationURL(navigation.postURL);
form.style.display = 'none';
Object.entries(navigation.fields || {}).forEach(([name, value]) => {
const input = targetWindow.document.createElement('input');
input.type = 'hidden';
input.name = name;
input.value = value;
form.appendChild(input);
});
targetWindow.document.body.appendChild(form);
form.submit();
form.remove();
};

View File

@@ -72,7 +72,7 @@
<CopyButton :content="getEnvValue(env)" />
</el-collapse-item>
</el-collapse>
<el-empty v-if="!inspectData?.Config?.Env?.length" :description="$t('commons.msg.noData')" />
<el-empty v-if="!inspectData?.Config?.Env?.length" :description="$t('commons.msg.noneData')" />
</el-tab-pane>
<el-tab-pane :label="$t('container.network')" name="network">

View File

@@ -136,14 +136,14 @@ const fileOnChange = (_uploadFile: UploadFile, uploadFiles: UploadFiles) => {
const parsed = JSON.parse(content);
if (!Array.isArray(parsed)) {
MsgError(i18n.global.t('commons.msg.errJsonImportFormat'));
MsgError(i18n.global.t('commons.msg.errImportFormat'));
loading.value = false;
return;
}
for (const item of parsed) {
if (!checkDataFormat(item)) {
MsgError(i18n.global.t('commons.msg.errJsonImportFormat'));
MsgError(i18n.global.t('commons.msg.errImportFormat'));
loading.value = false;
return;
}

View File

@@ -277,8 +277,8 @@ const exactReplacements: Record<string, string> = {
OpsReportAutoExport: 'xpack.opsReport.page.autoExport',
ComplexityVerification: 'setting.complexity',
MFAStatus: 'setting.mfa',
MonitorStatus: 'setting.enableMonitor',
MonitorStoreDays: 'setting.monitor',
MonitorStatus: 'monitor.enableMonitor',
MonitorStoreDays: 'monitor.storeDays',
ApiInterfaceStatus: 'setting.apiInterface',
ComponentSize: 'setting.componentSize',
Region: 'setting.region',

View File

@@ -76,6 +76,55 @@
{{ $t('commons.login.passkey') }}
</el-button>
</el-form-item>
<div v-if="hasExternalLoginMethods" class="external-login-section">
<div class="external-login-divider">
<span>{{ $t('commons.login.otherLoginMethods') }}</span>
</div>
<div class="external-login-methods">
<el-button
v-if="ldapEnabled"
class="external-login-button ldap-login-button"
link
native-type="button"
:aria-label="$t('xpack.user.auth.ldap.loginWith')"
@click="switchToLDAPLogin"
>
<span>LDAP</span>
</el-button>
<span
v-if="ldapEnabled && (oidcEnabled || saml2Enabled)"
class="external-login-separator"
aria-hidden="true"
></span>
<el-button
v-if="oidcEnabled"
class="external-login-button oidc-login-button"
link
native-type="button"
:aria-label="$t('xpack.user.auth.oidc.loginWith', { provider: oidcDisplayName })"
:loading="oidcStarting"
@click="beginOIDCLogin"
>
<span>{{ oidcDisplayName }}</span>
</el-button>
<span
v-if="oidcEnabled && saml2Enabled"
class="external-login-separator"
aria-hidden="true"
></span>
<el-button
v-if="saml2Enabled"
class="external-login-button saml2-login-button"
link
native-type="button"
:aria-label="$t('xpack.user.auth.saml2.loginWith', { provider: saml2DisplayName })"
:loading="saml2Starting"
@click="beginSAML2Login"
>
<span>{{ saml2DisplayName }}</span>
</el-button>
</div>
</div>
<el-form-item>
<el-link type="primary" :underline="false" @click="switchToPasswordLogin">
{{ $t('commons.login.passkeyToPassword') }}
@@ -101,7 +150,24 @@
</div>
<div v-else>
<div class="flex justify-between items-center mb-6">
<div class="text-2xl font-medium text-gray-900">{{ $t('commons.button.login') }}</div>
<div>
<div class="text-2xl font-medium text-gray-900">
{{
loginSource === 'ldap'
? $t('xpack.user.auth.ldap.loginTitle')
: $t('commons.button.login')
}}
</div>
<el-link
v-if="loginSource === 'ldap'"
class="local-login-link"
type="primary"
:underline="false"
@click="switchToLocalLogin"
>
{{ $t('xpack.user.auth.ldap.backToLocalLogin') }}
</el-link>
</div>
<div class="cursor-pointer">
<el-dropdown @command="handleCommand">
<span class="flex items-center space-x-1">
@@ -194,6 +260,55 @@
{{ $t('commons.button.login') }}
</el-button>
</el-form-item>
<div v-if="loginSource === 'local' && hasExternalLoginMethods" class="external-login-section">
<div class="external-login-divider">
<span>{{ $t('commons.login.otherLoginMethods') }}</span>
</div>
<div class="external-login-methods">
<el-button
v-if="ldapEnabled"
class="external-login-button ldap-login-button"
link
native-type="button"
:aria-label="$t('xpack.user.auth.ldap.loginWith')"
@click="switchToLDAPLogin"
>
<span>LDAP</span>
</el-button>
<span
v-if="ldapEnabled && (oidcEnabled || saml2Enabled)"
class="external-login-separator"
aria-hidden="true"
></span>
<el-button
v-if="oidcEnabled"
class="external-login-button oidc-login-button"
link
native-type="button"
:aria-label="$t('xpack.user.auth.oidc.loginWith', { provider: oidcDisplayName })"
:loading="oidcStarting"
@click="beginOIDCLogin"
>
<span>{{ oidcDisplayName }}</span>
</el-button>
<span
v-if="oidcEnabled && saml2Enabled"
class="external-login-separator"
aria-hidden="true"
></span>
<el-button
v-if="saml2Enabled"
class="external-login-button saml2-login-button"
link
native-type="button"
:aria-label="$t('xpack.user.auth.saml2.loginWith', { provider: saml2DisplayName })"
:loading="saml2Starting"
@click="beginSAML2Login"
>
<span>{{ saml2DisplayName }}</span>
</el-button>
</div>
</div>
<el-text v-if="isDemo" type="danger" class="demo">
{{ $t('commons.login.username') }}:demo {{ $t('commons.login.password') }}:1panel
</el-text>
@@ -242,7 +357,7 @@
</template>
<script setup lang="ts">
import { ref, reactive, onMounted, computed, nextTick } from 'vue';
import { ref, reactive, onMounted, onBeforeUnmount, computed, nextTick } from 'vue';
import type { ElForm } from 'element-plus';
import {
loginApi,
@@ -251,7 +366,15 @@ import {
getLoginSetting,
passkeyBeginApi,
passkeyFinishApi,
ldapStatusApi,
oidcStatusApi,
oidcBeginApi,
oidcFinishApi,
saml2StatusApi,
saml2BeginApi,
saml2FinishApi,
} from '@/api/modules/auth';
import type { Login as LoginModel } from '@/api/interface/auth';
import { MenuStore, TabsStore } from '@/store';
import { MsgError, MsgSuccess } from '@/utils/message';
import { useI18n } from 'vue-i18n';
@@ -263,6 +386,7 @@ import { changeToLocal } from '@/utils/node';
import { syncAuthInfo } from '@/utils/rbac';
import { adjustColorToRGBA } from '@/utils/color';
import { useGlobalStore } from '@/composables/useGlobalStore';
import { submitSAML2Navigation } from '@/utils/saml2';
const i18n = useI18n();
const {
@@ -290,11 +414,41 @@ const errCaptcha = ref(false);
const errMfaInfo = ref(false);
const passkeySetting = ref(false);
const passkeySupported = ref(false);
const ldapEnabled = ref(false);
const oidcEnabled = ref(false);
const oidcDisplayName = ref('OIDC');
const oidcStarting = ref(false);
const saml2Enabled = ref(false);
const saml2DisplayName = ref('SAML2');
const saml2Starting = ref(false);
const autoPasskeyEnabledKey = '1panel-passkey-auto-enabled';
const showPasswordLogin = ref(false);
const loginSource = ref<'local' | 'ldap'>('local');
const isDemo = ref(false);
const open = ref(false);
const loginBtnLinkColor = ref<string | null>(null);
let loginViewActive = true;
const takeExternalTicketsFromURL = () => {
const url = new URL(window.location.href);
const fragmentParams = new URLSearchParams(url.hash.startsWith('#') ? url.hash.slice(1) : url.hash);
const oidcTicket = fragmentParams.get('oidc_ticket') || url.searchParams.get('oidc_ticket') || '';
const saml2Ticket = fragmentParams.get('saml2_ticket') || url.searchParams.get('saml2_ticket') || '';
if (!oidcTicket && !saml2Ticket) return { oidcTicket: '', saml2Ticket: '' };
fragmentParams.delete('oidc_ticket');
fragmentParams.delete('saml2_ticket');
url.searchParams.delete('oidc_ticket');
url.searchParams.delete('saml2_ticket');
const sanitizedFragment = fragmentParams.toString();
url.hash = sanitizedFragment ? `#${sanitizedFragment}` : '';
const sanitizedURL = `${url.pathname}${url.search}${url.hash}`;
window.history.replaceState(window.history.state, '', sanitizedURL);
return { oidcTicket, saml2Ticket };
};
const pendingExternalTickets = takeExternalTicketsFromURL();
const pendingOIDCTicket = pendingExternalTickets.oidcTicket;
const pendingSAML2Ticket = pendingOIDCTicket ? '' : pendingExternalTickets.saml2Ticket;
const hasPendingExternalTicket = Boolean(pendingOIDCTicket || pendingSAML2Ticket);
type FormInstance = InstanceType<typeof ElForm>;
const _isMobile = () => {
@@ -413,14 +567,65 @@ const agreeWithLogin = () => {
const showPasskeyOnly = computed(() => {
return passkeySetting.value && passkeySupported.value && !showPasswordLogin.value;
});
const hasExternalLoginMethods = computed(() => ldapEnabled.value || oidcEnabled.value || saml2Enabled.value);
const switchToPasswordLogin = () => {
loginSource.value = 'local';
showPasswordLogin.value = true;
nextTick(() => {
userNameRef.value?.focus();
});
};
const switchToLDAPLogin = () => {
loginSource.value = 'ldap';
showPasswordLogin.value = true;
errAuthInfo.value = false;
errCaptcha.value = false;
nextTick(() => {
userNameRef.value?.focus();
});
};
const switchToLocalLogin = () => {
loginSource.value = 'local';
errAuthInfo.value = false;
errCaptcha.value = false;
nextTick(() => {
userNameRef.value?.focus();
});
};
const completeLogin = async (result: LoginModel.ResLogin) => {
isLogin.value = true;
agreeLicense.value = true;
menuStore.setMenuList([]);
tabsStore.removeAllTabs();
isAdmin.value = result.role === 'ADMIN';
await changeToLocal();
await syncAuthInfo(currentNode.value);
MsgSuccess(i18n.t('commons.msg.loginSuccess'));
localStorage.removeItem('dashboardCache');
localStorage.removeItem('upgradeChecked');
routerToName('home');
clearLoginKeydownHandler();
};
const handleLoginResult = async (result: LoginModel.ResLogin) => {
if (result.mfaStatus === 'Enable') {
mfaLoginForm.sessionId = result.mfaSession || '';
mfaLoginForm.code = '';
mfaShow.value = true;
errMfaInfo.value = false;
errCaptcha.value = false;
nextTick(() => {
mfaLoginRef.value?.focus();
});
return;
}
await completeLogin(result);
};
const login = (formEl: FormInstance | undefined) => {
if (!formEl || isLoggingIn) return;
errAuthInfo.value = false;
@@ -443,6 +648,7 @@ const login = (formEl: FormInstance | undefined) => {
captcha: loginForm.captcha,
captchaID: captcha.captchaID,
authMethod: 'session',
authSource: loginSource.value,
language: loginForm.language,
};
if (!ignoreCaptcha.value && requestLoginForm.captcha == '') {
@@ -454,29 +660,7 @@ const login = (formEl: FormInstance | undefined) => {
loading.value = true;
const res = await loginApi(requestLoginForm);
ignoreCaptcha.value = true;
if (res.data.mfaStatus === 'Enable') {
mfaLoginForm.sessionId = res.data.mfaSession || '';
mfaLoginForm.code = '';
mfaShow.value = true;
errMfaInfo.value = false;
errCaptcha.value = false;
nextTick(() => {
mfaLoginRef.value?.focus();
});
return;
}
isLogin.value = true;
agreeLicense.value = true;
menuStore.setMenuList([]);
tabsStore.removeAllTabs();
isAdmin.value = res.data.role === 'ADMIN';
await changeToLocal();
await syncAuthInfo(currentNode.value);
MsgSuccess(i18n.t('commons.msg.loginSuccess'));
localStorage.removeItem('dashboardCache');
localStorage.removeItem('upgradeChecked');
routerToName('home');
document.onkeydown = null;
await handleLoginResult(res.data);
} catch (res) {
if (res.code === 401) {
if (res.message === 'ErrCaptchaCode') {
@@ -511,17 +695,7 @@ const mfaLogin = async (auto: boolean) => {
try {
errMfaInfo.value = false;
const res = await mfaLoginApi(mfaLoginForm);
isLogin.value = true;
menuStore.setMenuList([]);
tabsStore.removeAllTabs();
MsgSuccess(i18n.t('commons.msg.loginSuccess'));
isAdmin.value = res.data.role === 'ADMIN';
await changeToLocal();
await syncAuthInfo(currentNode.value);
localStorage.removeItem('dashboardCache');
localStorage.removeItem('upgradeChecked');
routerToName('home');
document.onkeydown = null;
await completeLogin(res.data);
} catch (res) {
if (res.code === 401) {
if (res.message === 'ErrCaptchaCode') {
@@ -578,18 +752,7 @@ const passkeyLogin = async () => {
const loginRes = await passkeyFinishApi(payload, res.data.sessionId);
enableAutoPasskey();
ignoreCaptcha.value = true;
isLogin.value = true;
agreeLicense.value = true;
menuStore.setMenuList([]);
tabsStore.removeAllTabs();
isAdmin.value = loginRes.data.role === 'ADMIN';
await changeToLocal();
await syncAuthInfo(currentNode.value);
MsgSuccess(i18n.t('commons.msg.loginSuccess'));
localStorage.removeItem('dashboardCache');
localStorage.removeItem('upgradeChecked');
routerToName('home');
document.onkeydown = null;
await handleLoginResult(loginRes.data);
} catch (res: any) {
disableAutoPasskey();
if (res?.message) {
@@ -601,6 +764,111 @@ const passkeyLogin = async () => {
}
};
const loadLDAPStatus = async () => {
ldapEnabled.value = false;
if (!isEnterprise.value) return;
try {
const res = await ldapStatusApi();
ldapEnabled.value = Boolean(res.data.enabled);
} catch {
// LDAP is optional. A status failure must not affect local or any other login method.
ldapEnabled.value = false;
}
};
const loadOIDCStatus = async () => {
oidcEnabled.value = false;
if (!isEnterprise.value) return;
try {
const res = await oidcStatusApi();
oidcEnabled.value = Boolean(res.data.enabled && res.data.authorizationCode);
oidcDisplayName.value = res.data.displayName?.trim() || 'OIDC';
} catch {
// OIDC is optional. A status failure must not affect local password or Passkey login.
oidcEnabled.value = false;
}
};
const beginOIDCLogin = async () => {
if (isLoggingIn || !oidcEnabled.value) return;
try {
isLoggingIn = true;
oidcStarting.value = true;
const res = await oidcBeginApi();
if (!res.data.authorizationURL) return;
window.location.assign(res.data.authorizationURL);
} catch {
// The request layer displays the backend-localized error.
} finally {
isLoggingIn = false;
oidcStarting.value = false;
}
};
const finishOIDCLogin = async (ticket: string) => {
if (!ticket) return;
try {
isLoggingIn = true;
loading.value = true;
const res = await oidcFinishApi({ ticket });
ignoreCaptcha.value = true;
await handleLoginResult(res.data);
} catch {
// The ticket was already removed from the URL; the request layer displays the localized failure.
} finally {
isLoggingIn = false;
loading.value = false;
}
};
const loadSAML2Status = async () => {
saml2Enabled.value = false;
if (!isEnterprise.value) return;
try {
const res = await saml2StatusApi();
saml2Enabled.value = Boolean(res.data.enabled);
saml2DisplayName.value = res.data.displayName?.trim() || 'SAML2';
} catch {
// SAML2 is optional. A status failure must not affect any other login method.
saml2Enabled.value = false;
}
};
const beginSAML2Login = async () => {
if (isLoggingIn || !saml2Enabled.value) return;
try {
isLoggingIn = true;
saml2Starting.value = true;
const res = await saml2BeginApi();
try {
submitSAML2Navigation(res.data.navigation);
} catch {
MsgError(i18n.t('commons.msg.operationFailed'));
}
} catch {
// The request layer displays the backend-localized error.
} finally {
isLoggingIn = false;
saml2Starting.value = false;
}
};
const finishSAML2Login = async (ticket: string) => {
if (!ticket) return;
try {
isLoggingIn = true;
loading.value = true;
const res = await saml2FinishApi({ ticket });
ignoreCaptcha.value = true;
await handleLoginResult(res.data);
} catch {
// The ticket was already removed from the URL; the request layer displays the localized failure.
} finally {
isLoggingIn = false;
loading.value = false;
}
};
const normalizePasskeyRequest = (publicKey: Record<string, any>): PublicKeyCredentialRequestOptions => {
const request = { ...publicKey };
request.challenge = base64UrlToBuffer(request.challenge);
@@ -665,7 +933,7 @@ const getSetting = async () => {
if (res.data.passkeySetting && !isIntl.value && !isFxplay.value) {
loginForm.agreeLicense = true;
}
if (passkeySetting.value && passkeySupported.value && isAutoPasskeyEnabled()) {
if (passkeySetting.value && passkeySupported.value && isAutoPasskeyEnabled() && !hasPendingExternalTicket) {
passkeyLogin();
}
} catch (error) {}
@@ -684,16 +952,48 @@ const applyLoginButtonTheme = () => {
);
};
function loginKeydownHandler(event: KeyboardEvent) {
const target = event.target;
if (event.defaultPrevented || (target instanceof Element && target.closest('.external-login-button'))) return;
if (event.key === 'Enter' || event.keyCode === 13) {
if (!mfaShow.value) {
if (!loginButtonFocused.value) {
login(loginFormRef.value);
}
}
if (mfaShow.value && !mfaButtonFocused.value) {
mfaLogin(false);
}
}
}
function clearLoginKeydownHandler() {
if (document.onkeydown === loginKeydownHandler) {
document.onkeydown = null;
}
}
onMounted(async () => {
isOnRestart.value = false;
passkeySupported.value = !!window.PublicKeyCredential && window.isSecureContext;
applyLoginButtonTheme();
await getSetting();
if (!loginViewActive) return;
if (pendingOIDCTicket) {
await finishOIDCLogin(pendingOIDCTicket);
} else if (pendingSAML2Ticket) {
await finishSAML2Login(pendingSAML2Ticket);
}
if (!loginViewActive || isLogin.value) return;
if (!isLogin.value && !mfaShow.value) {
await Promise.all([loadLDAPStatus(), loadOIDCStatus(), loadSAML2Status()]);
}
try {
await getXpackSettingForTheme();
} catch (error) {
// 即使获取失败也不影响登录,默认为之前的主题配置
}
if (!loginViewActive) return;
applyLoginButtonTheme();
if (!ignoreCaptcha.value) {
loginVerify();
@@ -703,19 +1003,12 @@ onMounted(async () => {
userNameRef.value?.focus();
});
loginForm.agreeLicense = agreeLicense.value;
document.onkeydown = (e: any) => {
e = window.event || e;
if (e.keyCode === 13) {
if (!mfaShow.value) {
if (!loginButtonFocused.value) {
login(loginFormRef.value);
}
}
if (mfaShow.value && !mfaButtonFocused.value) {
mfaLogin(false);
}
}
};
document.onkeydown = loginKeydownHandler;
});
onBeforeUnmount(() => {
loginViewActive = false;
clearLoginKeydownHandler();
});
</script>
<style scoped lang="scss">
@@ -753,6 +1046,68 @@ onMounted(async () => {
}
}
.external-login-section {
width: 100%;
padding-top: 2px;
}
.local-login-link {
height: auto;
margin-top: 6px;
font-size: 13px;
}
.external-login-divider {
display: flex;
align-items: center;
gap: 14px;
color: var(--el-text-color-secondary);
font-size: 13px;
white-space: nowrap;
&::before,
&::after {
width: 100%;
border-top: 1px dashed var(--el-border-color-light);
content: '';
}
}
.external-login-methods {
display: flex;
flex-wrap: wrap;
align-items: center;
justify-content: center;
gap: 10px 12px;
margin-top: 12px;
}
.external-login-separator {
width: 1px;
height: 14px;
background-color: var(--el-border-color);
}
.external-login-button {
height: auto;
margin: 0 !important;
padding: 5px 2px;
border: 0;
background: transparent !important;
color: var(--login-btn-link-color);
font-size: 14px;
&:hover {
color: var(--login-btn-link-hover-color) !important;
}
&:focus-visible {
border-radius: 3px;
outline: 2px solid var(--login-btn-link-color) !important;
outline-offset: 2px;
}
}
:deep(.el-input) {
--el-input-border-color: #dcdfe6;
background: none !important;

View File

@@ -268,7 +268,7 @@ const formatMethod = (row: Alert.AlertLog) => {
case 'sms':
return t('xpack.alert.sms');
case 'webhook':
return t('xpack.alert.webhook');
return t('xpack.alert.webhookItem');
case 'bark':
return t('xpack.alert.bark');
default:

View File

@@ -54,7 +54,7 @@ const initializing = ref(true);
const errorMessage = ref('');
const shareInfo = ref<File.FileSharePublicInfo | null>(null);
const shareLocale = ref('en');
const supportedLocales = ['zh', 'zh-Hant', 'en', 'pt-BR', 'ja', 'ru', 'ms', 'ko', 'tr', 'es-ES', 'lo'];
const supportedLocales = ['zh', 'zh-Hant', 'en', 'pt-BR', 'ja', 'ru', 'ms', 'ko', 'tr', 'es-ES', 'fa', 'lo'];
const code = computed(() => String(route.params.code || '').trim());
const currentNode = computed(() => String(route.query.operateNode || 'local'));

View File

@@ -386,7 +386,7 @@ const verifySpec = (rule: any, value: any, callback: any) => {
!Number.isInteger(item.second) ||
!Number.isInteger(item.week)
) {
callback(new Error(i18n.global.t('cronjob.specErr')));
callback(new Error(i18n.global.t('toolbox.clam.specErr')));
return;
}
switch (item.specType) {
@@ -399,7 +399,7 @@ const verifySpec = (rule: any, value: any, callback: any) => {
item.minute < 0 ||
item.minute > 59
) {
callback(new Error(i18n.global.t('cronjob.specErr')));
callback(new Error(i18n.global.t('toolbox.clam.specErr')));
return;
}
break;
@@ -412,7 +412,7 @@ const verifySpec = (rule: any, value: any, callback: any) => {
item.minute < 0 ||
item.minute > 59
) {
callback(new Error(i18n.global.t('cronjob.specErr')));
callback(new Error(i18n.global.t('toolbox.clam.specErr')));
return;
}
break;
@@ -425,36 +425,36 @@ const verifySpec = (rule: any, value: any, callback: any) => {
item.minute < 0 ||
item.minute > 59
) {
callback(new Error(i18n.global.t('cronjob.specErr')));
callback(new Error(i18n.global.t('toolbox.clam.specErr')));
return;
}
break;
case 'perDay':
if (item.hour < 0 || item.hour > 23 || item.minute < 0 || item.minute > 59) {
callback(new Error(i18n.global.t('cronjob.specErr')));
callback(new Error(i18n.global.t('toolbox.clam.specErr')));
return;
}
break;
case 'perNHour':
if (item.hour < 0 || item.hour > 8784 || item.minute < 0 || item.minute > 59) {
callback(new Error(i18n.global.t('cronjob.specErr')));
callback(new Error(i18n.global.t('toolbox.clam.specErr')));
return;
}
break;
case 'perHour':
if (item.minute < 0 || item.minute > 59) {
callback(new Error(i18n.global.t('cronjob.specErr')));
callback(new Error(i18n.global.t('toolbox.clam.specErr')));
return;
}
case 'perNMinute':
if (item.minute < 0 || item.minute > 527040) {
callback(new Error(i18n.global.t('cronjob.specErr')));
callback(new Error(i18n.global.t('toolbox.clam.specErr')));
return;
}
break;
case 'perNSecond':
if (item.second < 0 || item.second > 31622400) {
callback(new Error(i18n.global.t('cronjob.specErr')));
callback(new Error(i18n.global.t('toolbox.clam.specErr')));
return;
}
break;

View File

@@ -578,7 +578,7 @@ function load18n(label: string) {
case 'CustomAppstore':
return i18n.global.t('xpack.customApp.name');
case 'NodeFile':
return i18n.global.t('xpack.exchange.exchange');
return i18n.global.t('xpack.sync.file');
case 'RuntimeExtension':
return i18n.global.t('website.runtime');
case 'Image':

View File

@@ -3,7 +3,7 @@
<el-card v-if="showStopped" class="mask-prompt">
<span>{{ $t('tool.supervisor.notStartWarn') }}</span>
</el-card>
<LayoutContent :title="$t(' tool.supervisor.list', 2)" v-loading="loading">
<LayoutContent :title="$t('tool.supervisor.list', 2)" v-loading="loading">
<template #prompt v-if="!isFxplay">
<el-alert type="info" :closable="false">
<template #title>

View File

@@ -28,7 +28,7 @@
</el-input>
<span class="input-help">{{ $t('website.cacheLimitHelper') }}</span>
</el-form-item>
<el-form-item :label="$t('website.shareCahe')" prop="shareCache">
<el-form-item :label="$t('website.shareCache')" prop="shareCache">
<el-input v-model.number="req.shareCache" class="p-w-200">
<template #append>
<el-select v-model="req.shareCacheUnit" class="p-w-100">
@@ -41,7 +41,7 @@
</el-select>
</template>
</el-input>
<span class="input-help">{{ $t('website.shareCaheHelper') }}</span>
<span class="input-help">{{ $t('website.shareCacheHelper') }}</span>
</el-form-item>
<el-form-item :label="$t('website.cacheExpire')" prop="cacheExpire">
<el-input v-model.number="req.cacheExpire" class="p-w-200">