From cf37de66fc94d4dd2ff5a170eceedccc68a3be73 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=98=AD?= Date: Tue, 28 Jul 2026 14:20:42 +0800 Subject: [PATCH] feat(auth): add LDAP authentication support and related configurations (#13385) * feat(auth): add LDAP authentication support and related configurations * feat(ldap): implement LDAP synchronization features and enhance user import logic * feat(auth): add authSource and authSourceStatus to user information * feat(i18n): update LDAP synchronization error messages in multiple languages * feat(i18n): update LDAP synchronization error messages in multiple languages * feat(i18n): update LDAP synchronization error messages in multiple languages --- core/app/auth/auth.go | 20 +- core/app/dto/auth.go | 2 + core/constant/common.go | 11 + core/go.mod | 3 + core/go.sum | 6 + core/i18n/lang/en.yaml | 48 +++ core/i18n/lang/es-ES.yaml | 48 +++ core/i18n/lang/fa.yaml | 48 +++ core/i18n/lang/ja.yaml | 48 +++ core/i18n/lang/ko.yaml | 48 +++ core/i18n/lang/lo.yaml | 48 +++ core/i18n/lang/ms.yaml | 48 +++ core/i18n/lang/pt-BR.yaml | 52 +++- core/i18n/lang/ru.yaml | 48 +++ core/i18n/lang/tr.yaml | 48 +++ core/i18n/lang/zh-Hant.yaml | 48 +++ core/i18n/lang/zh.yaml | 48 +++ core/middleware/password_expired.go | 9 + core/utils/xpack/helper/auth_helper.go | 3 + core/utils/xpack/providers/auth.go | 1 + frontend/src/api/interface/auth.ts | 2 + frontend/src/lang/modules/en.ts | 276 +++++++++++++++++ frontend/src/lang/modules/es-es.ts | 284 ++++++++++++++++++ frontend/src/lang/modules/fa.ts | 276 +++++++++++++++++ frontend/src/lang/modules/ja.ts | 277 +++++++++++++++++ frontend/src/lang/modules/ko.ts | 275 +++++++++++++++++ frontend/src/lang/modules/lo.ts | 275 +++++++++++++++++ frontend/src/lang/modules/ms.ts | 279 +++++++++++++++++ frontend/src/lang/modules/pt-br.ts | 281 +++++++++++++++++ frontend/src/lang/modules/ru.ts | 282 +++++++++++++++++ frontend/src/lang/modules/tr.ts | 282 +++++++++++++++++ frontend/src/lang/modules/zh-Hant.ts | 256 ++++++++++++++++ frontend/src/lang/modules/zh.ts | 255 ++++++++++++++++ .../Sidebar/components/user-info/index.vue | 25 +- 34 files changed, 3949 insertions(+), 11 deletions(-) diff --git a/core/app/auth/auth.go b/core/app/auth/auth.go index 76f600e36..21bbc1509 100644 --- a/core/app/auth/auth.go +++ b/core/app/auth/auth.go @@ -167,11 +167,7 @@ func CheckEntrance(entrance string) error { } func CheckPassword(priKey, password, passwordFromDB string) error { - privateKey, err := encrypt.ParseRSAPrivateKey(priKey) - if err != nil { - return err - } - loginPassword, err := encrypt.DecryptPassword(password, privateKey) + loginPassword, err := DecryptLoginPassword(priKey, password) if err != nil { return err } @@ -185,6 +181,18 @@ func CheckPassword(priKey, password, passwordFromDB string) error { return nil } +func DecryptLoginPassword(priKey, password string) (string, error) { + privateKey, err := encrypt.ParseRSAPrivateKey(priKey) + if err != nil { + return "", err + } + loginPassword, err := encrypt.DecryptPassword(password, privateKey) + if err != nil { + return "", err + } + return loginPassword, nil +} + func LoadMFA(req dto.MfaRequest) (mfa.Otp, error) { settingRepo := repo.NewISettingRepo() username, err := settingRepo.GetValueByKey("UserName") @@ -248,6 +256,8 @@ func GetCurrentUserInfo() (*dto.CurrentUserInfo, error) { info.MFAInterval, _ = strconv.Atoi(settingMap["MFAInterval"]) info.ApiKeyValidityTime, _ = strconv.Atoi(settingMap["ApiKeyValidityTime"]) info.Name = settingMap["UserName"] + info.AuthSource = "local" + info.AuthSourceStatus = "active" info.Role = "ADMIN" info.Permissions = []string{} info.NodeRoles = []dto.CurrentUserNodeRole{} diff --git a/core/app/dto/auth.go b/core/app/dto/auth.go index 36fbd94a7..2e46a743b 100644 --- a/core/app/dto/auth.go +++ b/core/app/dto/auth.go @@ -65,6 +65,8 @@ type CurrentUserInfo struct { MFAStatus string `json:"mfaStatus"` MFAInterval int `json:"mfaInterval"` ComplexitySetting string `json:"complexitySetting"` + AuthSource string `json:"authSource"` + AuthSourceStatus string `json:"authSourceStatus"` ApiInterfaceStatus string `json:"apiInterfaceStatus"` ApiKey string `json:"apiKey"` diff --git a/core/constant/common.go b/core/constant/common.go index 0a029ec65..e70b0e7ab 100644 --- a/core/constant/common.go +++ b/core/constant/common.go @@ -199,6 +199,17 @@ var WebUrlMap = map[string]struct{}{ "/enterprise/users/list": {}, "/enterprise/users/roles": {}, + "/enterprise/users/auth": {}, + "/enterprise/users/auth/ldap": {}, + "/enterprise/users/auth/passkey": {}, + "/enterprise/users/auth/radius": {}, + "/enterprise/users/auth/oidc": {}, + "/enterprise/users/auth/saml2": {}, + "/enterprise/users/auth/cas": {}, + "/enterprise/users/auth/oauth2": {}, + "/enterprise/users/auth/dingtalk": {}, + "/enterprise/users/auth/feishu": {}, + "/enterprise/users/auth/wecom": {}, "/enterprise/license": {}, "/enterprise/license-required": {}, "/enterprise/ops-report": {}, diff --git a/core/go.mod b/core/go.mod index 91f9b0dca..4d31627c3 100644 --- a/core/go.mod +++ b/core/go.mod @@ -10,6 +10,7 @@ require ( 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.13 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 @@ -43,6 +44,7 @@ require ( ) require ( + github.com/Azure/go-ntlmssp v0.1.0 // indirect github.com/KyleBanks/depth v1.2.1 // indirect github.com/boombuler/barcode v1.1.0 // indirect github.com/bytedance/gopkg v0.1.4 // indirect @@ -57,6 +59,7 @@ require ( github.com/gabriel-vasile/mimetype v1.4.13 // indirect github.com/gin-contrib/sse v1.1.1 // indirect github.com/glebarez/go-sqlite v1.22.0 // indirect + github.com/go-asn1-ber/asn1-ber v1.5.8-0.20250403174932-29230038a667 // indirect github.com/go-ole/go-ole v1.2.6 // indirect github.com/go-openapi/jsonpointer v0.23.0 // indirect github.com/go-openapi/jsonreference v0.21.5 // indirect diff --git a/core/go.sum b/core/go.sum index 2cab76981..9a318bb20 100644 --- a/core/go.sum +++ b/core/go.sum @@ -1,5 +1,7 @@ github.com/1panel-dev/base64Captcha v1.3.8 h1:GbQ2IuGMp4ai4erpwf4BMjm5eLC8Efb+dATVwgpPIII= github.com/1panel-dev/base64Captcha v1.3.8/go.mod h1:gVpwyGm9+g4rg3pXdYnsFAouP73qMOSBfnT3bxCFzco= +github.com/Azure/go-ntlmssp v0.1.0 h1:DjFo6YtWzNqNvQdrwEyr/e4nhU3vRiwenz5QX7sFz+A= +github.com/Azure/go-ntlmssp v0.1.0/go.mod h1:NYqdhxd/8aAct/s4qSYZEerdPuH1liG2/X9DiVTbhpk= github.com/BurntSushi/toml v1.6.0 h1:dRaEfpa2VI55EwlIW72hMRHdWouJeRF7TPYhI+AUQjk= github.com/BurntSushi/toml v1.6.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho= github.com/KyleBanks/depth v1.2.1 h1:5h8fQADFrWtarTdtDudMmGsC7GPbOAu6RVB3ffsVFHc= @@ -47,8 +49,12 @@ github.com/glebarez/go-sqlite v1.22.0 h1:uAcMJhaA6r3LHMTFgP0SifzgXg46yJkgxqyuyec github.com/glebarez/go-sqlite v1.22.0/go.mod h1:PlBIdHe0+aUEFn+r2/uthrWq4FxbzugL0L8Li6yQJbc= github.com/glebarez/sqlite v1.11.0 h1:wSG0irqzP6VurnMEpFGer5Li19RpIRi2qvQz++w0GMw= github.com/glebarez/sqlite v1.11.0/go.mod h1:h8/o8j5wiAsqSPoWELDUdJXhjAhsVliSn7bWZjOhrgQ= +github.com/go-asn1-ber/asn1-ber v1.5.8-0.20250403174932-29230038a667 h1:BP4M0CvQ4S3TGls2FvczZtj5Re/2ZzkV9VwqPHH/3Bo= +github.com/go-asn1-ber/asn1-ber v1.5.8-0.20250403174932-29230038a667/go.mod h1:hEBeB/ic+5LoWskz+yKT7vGhhPYkProFKoKdwZRWMe0= github.com/go-gormigrate/gormigrate/v2 v2.1.6 h1:VtX+l1Stj2v5RGubVQk0LS/8EPGXR+ldcOyCmlmKoyg= github.com/go-gormigrate/gormigrate/v2 v2.1.6/go.mod h1:PZpedQc4tWaxn6kvXicwhinh3L0seLpMc5ReKRX5id4= +github.com/go-ldap/ldap/v3 v3.4.13 h1:+x1nG9h+MZN7h/lUi5Q3UZ0fJ1GyDQYbPvbuH38baDQ= +github.com/go-ldap/ldap/v3 v3.4.13/go.mod h1:LxsGZV6vbaK0sIvYfsv47rfh4ca0JXokCoKjZxsszv0= 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= diff --git a/core/i18n/lang/en.yaml b/core/i18n/lang/en.yaml index c31a3fb3c..3c2a8e55f 100644 --- a/core/i18n/lang/en.yaml +++ b/core/i18n/lang/en.yaml @@ -424,3 +424,51 @@ ErrExpiredToken: 'Token expired. Reset and scan again.' # command export Name: "Name" Command: "Command" + +# LDAP +ErrLDAPConnectionTest: "LDAP connection test failed. Check the server address, bind account, and network settings." +LDAPConnectionTestSuccess: "LDAP connection test succeeded." +ErrLDAPDirectorySearch: "Failed to read LDAP users. Check the connection and search settings." +ErrLDAPConfigLoad: "Failed to load the LDAP configuration." +ErrLDAPConfigSave: "Failed to save the LDAP configuration." +ErrLDAPURLInvalid: "The LDAP server address must use ldap:// or ldaps:// and include a valid host." +ErrLDAPBindDNRequired: "The bind DN is required." +ErrLDAPBindPasswordRequired: "The bind password is required." +ErrLDAPUserOURequired: "The user OU is required." +ErrLDAPConnectTimeoutRange: "The connection timeout must be between 1 and 120 seconds." +ErrLDAPSearchPageSizeRange: "The LDAP query page size must be between 1 and 10000." +ErrLDAPResultPageSizeRange: "The result page size cannot exceed 200." +ErrLDAPAttributeMapOnlyName: "The attribute mapping supports only the name field." +ErrLDAPNameAttributeRequired: "The LDAP attribute mapped to name is required." +ErrLDAPAttributeNameInvalid: "The attribute mapping contains an invalid LDAP attribute name." +ErrLDAPUserFilterRequired: "The user filter is required." +ErrLDAPUserFilterInvalid: "The user filter is not a valid LDAP filter." +ErrLDAPAttributeMapObject: "The attribute mapping must be a valid JSON object." +ErrLDAPImportModeInvalid: "The import mode must be selected users or all users." +ErrLDAPImportSelectionRequired: "Select at least one LDAP user to import." +ErrLDAPImportSelectionInvalid: "The selected LDAP users are invalid or no longer exist. Read the directory again." +ErrLDAPConfigChanged: "The LDAP configuration has changed. Read the directory and preview the import again." +ErrLDAPRoleRequired: "Select a role for new LDAP users." +ErrLDAPImportPlanIncomplete: "An incomplete LDAP import plan cannot be executed." +ErrLDAPQueryTokenInvalid: "The LDAP query result has expired. Read the directory again." +ErrLDAPPlanTokenInvalid: "The LDAP import preview has expired. Preview the import again." +ErrLDAPOperationFailed: "The LDAP operation failed. Try again." +ErrLDAPEntryIdentityMissing: "The LDAP entry is missing a stable ID or username." +ErrLDAPDuplicateExternalID: "LDAP returned duplicate user IDs." +ErrLDAPUsernameConflict: "The username is already used by another user." +ErrLDAPUsernameSourceConflict: "The username is already used by a local user or another authentication source." +ErrLDAPUsernameConcurrentConflict: "The username was claimed by another user during import." +ErrLDAPLocalCredentialsReadonly: "LDAP usernames and passwords are managed by LDAP and cannot be changed locally." +ErrLDAPPasswordExpirationUnsupported: "LDAP users do not use the local password expiration policy." +ErrLDAPSyncSourceDisabled: "Enable AD/LDAP before enabling or running synchronization." +ErrLDAPSyncConfigSave: "Failed to save the LDAP synchronization settings." +ErrLDAPSyncSchedule: "Failed to update the LDAP synchronization schedule." +ErrLDAPSyncCronInvalid: "Enter a valid five-field Cron expression." +ErrLDAPSyncWeekdayInvalid: "Select a valid weekday." +ErrLDAPSyncCronRequired: "Enter a Cron expression." +ErrLDAPSyncScheduleTypeInvalid: "Select a valid synchronization schedule type." +ErrLDAPSyncTimeInvalid: "Enter a valid execution time." +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." diff --git a/core/i18n/lang/es-ES.yaml b/core/i18n/lang/es-ES.yaml index c84164c84..d9d3c9b53 100644 --- a/core/i18n/lang/es-ES.yaml +++ b/core/i18n/lang/es-ES.yaml @@ -424,3 +424,51 @@ ErrExpiredToken: 'El token ha expirado, por favor restablezca y escanee de nuevo # exportación de comandos Name: "Nombre" Command: "Comando" + +# LDAP +ErrLDAPConnectionTest: "La prueba de conexión LDAP falló. Compruebe la dirección del servidor, la cuenta de enlace y la configuración de red." +LDAPConnectionTestSuccess: "La prueba de conexión LDAP se realizó correctamente." +ErrLDAPDirectorySearch: "No se pudieron leer los usuarios LDAP. Compruebe la conexión y la configuración de búsqueda." +ErrLDAPConfigLoad: "No se pudo cargar la configuración LDAP." +ErrLDAPConfigSave: "No se pudo guardar la configuración LDAP." +ErrLDAPURLInvalid: "La dirección del servidor LDAP debe usar ldap:// o ldaps:// e incluir un host válido." +ErrLDAPBindDNRequired: "El DN de enlace es obligatorio." +ErrLDAPBindPasswordRequired: "La contraseña de enlace es obligatoria." +ErrLDAPUserOURequired: "La OU de usuarios es obligatoria." +ErrLDAPConnectTimeoutRange: "El tiempo de espera de conexión debe estar entre 1 y 120 segundos." +ErrLDAPSearchPageSizeRange: "El tamaño de página de la consulta LDAP debe estar entre 1 y 10000." +ErrLDAPResultPageSizeRange: "El tamaño de página de resultados no puede superar 200." +ErrLDAPAttributeMapOnlyName: "La asignación de atributos solo admite el campo name." +ErrLDAPNameAttributeRequired: "El atributo LDAP asignado a name es obligatorio." +ErrLDAPAttributeNameInvalid: "La asignación contiene un nombre de atributo LDAP no válido." +ErrLDAPUserFilterRequired: "El filtro de usuarios es obligatorio." +ErrLDAPUserFilterInvalid: "El filtro de usuarios no es un filtro LDAP válido." +ErrLDAPAttributeMapObject: "La asignación de atributos debe ser un objeto JSON válido." +ErrLDAPImportModeInvalid: "El modo de importación debe ser usuarios seleccionados o todos los usuarios." +ErrLDAPImportSelectionRequired: "Seleccione al menos un usuario LDAP para importar." +ErrLDAPImportSelectionInvalid: "Los usuarios LDAP seleccionados no son válidos o ya no existen. Vuelva a leer el directorio." +ErrLDAPConfigChanged: "La configuración LDAP ha cambiado. Vuelva a leer el directorio y a previsualizar la importación." +ErrLDAPRoleRequired: "Seleccione un rol para los nuevos usuarios LDAP." +ErrLDAPImportPlanIncomplete: "No se puede ejecutar un plan de importación LDAP incompleto." +ErrLDAPQueryTokenInvalid: "El resultado de la consulta LDAP ha caducado. Vuelva a leer el directorio." +ErrLDAPPlanTokenInvalid: "La vista previa de importación LDAP ha caducado. Vuelva a previsualizar la importación." +ErrLDAPOperationFailed: "La operación LDAP falló. Inténtelo de nuevo." +ErrLDAPEntryIdentityMissing: "A la entrada LDAP le falta un ID estable o un nombre de usuario." +ErrLDAPDuplicateExternalID: "LDAP devolvió IDs de usuario duplicados." +ErrLDAPUsernameConflict: "El nombre de usuario ya está siendo utilizado por otro usuario." +ErrLDAPUsernameSourceConflict: "El nombre de usuario ya está siendo utilizado por un usuario local u otra fuente de autenticación." +ErrLDAPUsernameConcurrentConflict: "Otro usuario ocupó el nombre de usuario durante la importación." +ErrLDAPLocalCredentialsReadonly: "Los nombres de usuario y contraseñas LDAP se administran en LDAP y no pueden modificarse localmente." +ErrLDAPPasswordExpirationUnsupported: "Los usuarios LDAP no utilizan la política local de caducidad de contraseñas." +ErrLDAPSyncSourceDisabled: "Habilite AD/LDAP antes de activar o ejecutar la sincronización." +ErrLDAPSyncConfigSave: "No se pudo guardar la configuración de sincronización LDAP." +ErrLDAPSyncSchedule: "No se pudo actualizar la programación de sincronización LDAP." +ErrLDAPSyncCronInvalid: "Introduzca una expresión Cron válida de cinco campos." +ErrLDAPSyncWeekdayInvalid: "Seleccione un día de la semana válido." +ErrLDAPSyncCronRequired: "Introduzca una expresión Cron." +ErrLDAPSyncScheduleTypeInvalid: "Seleccione un tipo de programación de sincronización válido." +ErrLDAPSyncTimeInvalid: "Introduzca una hora de ejecución válida." +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." diff --git a/core/i18n/lang/fa.yaml b/core/i18n/lang/fa.yaml index 459296eec..ca31004ce 100644 --- a/core/i18n/lang/fa.yaml +++ b/core/i18n/lang/fa.yaml @@ -424,3 +424,51 @@ ErrExpiredToken: 'توکن منقضی شده است. بازنشانی کرده # خروجی فرمان Name: "نام" Command: "دستور" + +# LDAP +ErrLDAPConnectionTest: "آزمایش اتصال LDAP ناموفق بود. نشانی سرور، حساب اتصال و تنظیمات شبکه را بررسی کنید." +LDAPConnectionTestSuccess: "آزمایش اتصال LDAP با موفقیت انجام شد." +ErrLDAPDirectorySearch: "خواندن کاربران LDAP ناموفق بود. تنظیمات اتصال و جستجو را بررسی کنید." +ErrLDAPConfigLoad: "بارگذاری پیکربندی LDAP ناموفق بود." +ErrLDAPConfigSave: "ذخیره پیکربندی LDAP ناموفق بود." +ErrLDAPURLInvalid: "نشانی سرور LDAP باید از ldap:// یا ldaps:// استفاده کند و شامل میزبان معتبر باشد." +ErrLDAPBindDNRequired: "DN اتصال الزامی است." +ErrLDAPBindPasswordRequired: "رمز عبور اتصال الزامی است." +ErrLDAPUserOURequired: "OU کاربران الزامی است." +ErrLDAPConnectTimeoutRange: "مهلت اتصال باید بین ۱ تا ۱۲۰ ثانیه باشد." +ErrLDAPSearchPageSizeRange: "اندازه صفحه پرس‌وجوی LDAP باید بین ۱ تا ۱۰۰۰۰ باشد." +ErrLDAPResultPageSizeRange: "اندازه صفحه نتایج نمی‌تواند بیشتر از ۲۰۰ باشد." +ErrLDAPAttributeMapOnlyName: "نگاشت ویژگی فقط از فیلد name پشتیبانی می‌کند." +ErrLDAPNameAttributeRequired: "ویژگی LDAP نگاشت‌شده به name الزامی است." +ErrLDAPAttributeNameInvalid: "نگاشت ویژگی شامل نام ویژگی LDAP نامعتبر است." +ErrLDAPUserFilterRequired: "فیلتر کاربر الزامی است." +ErrLDAPUserFilterInvalid: "فیلتر کاربر یک فیلتر LDAP معتبر نیست." +ErrLDAPAttributeMapObject: "نگاشت ویژگی باید یک شیء JSON معتبر باشد." +ErrLDAPImportModeInvalid: "حالت درون‌ریزی باید کاربران انتخاب‌شده یا همه کاربران باشد." +ErrLDAPImportSelectionRequired: "حداقل یک کاربر LDAP را برای درون‌ریزی انتخاب کنید." +ErrLDAPImportSelectionInvalid: "کاربران LDAP انتخاب‌شده نامعتبرند یا دیگر وجود ندارند. فهرست را دوباره بخوانید." +ErrLDAPConfigChanged: "پیکربندی LDAP تغییر کرده است. فهرست را دوباره بخوانید و پیش‌نمایش درون‌ریزی را تکرار کنید." +ErrLDAPRoleRequired: "برای کاربران جدید LDAP یک نقش انتخاب کنید." +ErrLDAPImportPlanIncomplete: "طرح ناقص درون‌ریزی LDAP قابل اجرا نیست." +ErrLDAPQueryTokenInvalid: "نتیجه پرس‌وجوی LDAP منقضی شده است. فهرست را دوباره بخوانید." +ErrLDAPPlanTokenInvalid: "پیش‌نمایش درون‌ریزی LDAP منقضی شده است. دوباره پیش‌نمایش بگیرید." +ErrLDAPOperationFailed: "عملیات LDAP ناموفق بود. دوباره تلاش کنید." +ErrLDAPEntryIdentityMissing: "ورودی LDAP فاقد شناسه پایدار یا نام کاربری است." +ErrLDAPDuplicateExternalID: "LDAP شناسه‌های کاربری تکراری برگرداند." +ErrLDAPUsernameConflict: "نام کاربری قبلاً توسط کاربر دیگری استفاده شده است." +ErrLDAPUsernameSourceConflict: "نام کاربری قبلاً توسط کاربر محلی یا منبع احراز هویت دیگری استفاده شده است." +ErrLDAPUsernameConcurrentConflict: "هنگام درون‌ریزی، نام کاربری توسط کاربر دیگری گرفته شد." +ErrLDAPLocalCredentialsReadonly: "نام کاربری و رمز عبور LDAP توسط LDAP مدیریت می‌شوند و به‌صورت محلی قابل تغییر نیستند." +ErrLDAPPasswordExpirationUnsupported: "کاربران LDAP از سیاست محلی انقضای رمز عبور استفاده نمی‌کنند." +ErrLDAPSyncSourceDisabled: "پیش از فعال‌سازی یا اجرای همگام‌سازی، AD/LDAP را فعال کنید." +ErrLDAPSyncConfigSave: "ذخیره تنظیمات همگام‌سازی LDAP ناموفق بود." +ErrLDAPSyncSchedule: "به‌روزرسانی زمان‌بندی همگام‌سازی LDAP ناموفق بود." +ErrLDAPSyncCronInvalid: "یک عبارت Cron معتبر پنج‌بخشی وارد کنید." +ErrLDAPSyncWeekdayInvalid: "یک روز معتبر از هفته را انتخاب کنید." +ErrLDAPSyncCronRequired: "یک عبارت Cron وارد کنید." +ErrLDAPSyncScheduleTypeInvalid: "یک نوع زمان‌بندی معتبر برای همگام‌سازی انتخاب کنید." +ErrLDAPSyncTimeInvalid: "یک زمان اجرای معتبر وارد کنید." +ErrLDAPSyncRunning: "یک وظیفه همگام‌سازی LDAP در حال اجرا است." +ErrLDAPSyncDirectoryIncomplete: "LDAP نتیجه ناقصی از پرس‌وجوی کامل برگرداند. وضعیت هیچ کاربری تغییر نکرد." +ErrLDAPSyncFailed: "همگام‌سازی کاربران LDAP ناموفق بود." +LDAPSyncSuccess: "همگام‌سازی کاربران LDAP با موفقیت انجام شد." diff --git a/core/i18n/lang/ja.yaml b/core/i18n/lang/ja.yaml index fa368ac79..408b2a646 100644 --- a/core/i18n/lang/ja.yaml +++ b/core/i18n/lang/ja.yaml @@ -424,3 +424,51 @@ ErrExpiredToken: 'トークンの有効期限が切れました。リセット # コマンドエクスポート Name: "名前" Command: "コマンド" + +# LDAP +ErrLDAPConnectionTest: "LDAP 接続テストに失敗しました。サーバーアドレス、バインドアカウント、ネットワーク設定を確認してください。" +LDAPConnectionTestSuccess: "LDAP 接続テストに成功しました。" +ErrLDAPDirectorySearch: "LDAP ユーザーの読み取りに失敗しました。接続と検索設定を確認してください。" +ErrLDAPConfigLoad: "LDAP 設定の読み込みに失敗しました。" +ErrLDAPConfigSave: "LDAP 設定の保存に失敗しました。" +ErrLDAPURLInvalid: "LDAP サーバーアドレスには ldap:// または ldaps:// を使用し、有効なホストを含める必要があります。" +ErrLDAPBindDNRequired: "バインド DN は必須です。" +ErrLDAPBindPasswordRequired: "バインドパスワードは必須です。" +ErrLDAPUserOURequired: "ユーザー OU は必須です。" +ErrLDAPConnectTimeoutRange: "接続タイムアウトは 1~120 秒の範囲で指定してください。" +ErrLDAPSearchPageSizeRange: "LDAP クエリのページサイズは 1~10000 の範囲で指定してください。" +ErrLDAPResultPageSizeRange: "結果のページサイズは 200 以下にしてください。" +ErrLDAPAttributeMapOnlyName: "属性マッピングでは name フィールドのみサポートされます。" +ErrLDAPNameAttributeRequired: "name にマッピングする LDAP 属性は必須です。" +ErrLDAPAttributeNameInvalid: "属性マッピングに無効な LDAP 属性名が含まれています。" +ErrLDAPUserFilterRequired: "ユーザーフィルターは必須です。" +ErrLDAPUserFilterInvalid: "ユーザーフィルターが有効な LDAP フィルターではありません。" +ErrLDAPAttributeMapObject: "属性マッピングは有効な JSON オブジェクトである必要があります。" +ErrLDAPImportModeInvalid: "インポートモードは、選択したユーザーまたはすべてのユーザーである必要があります。" +ErrLDAPImportSelectionRequired: "インポートする LDAP ユーザーを 1 人以上選択してください。" +ErrLDAPImportSelectionInvalid: "選択した LDAP ユーザーが無効か、存在しません。ディレクトリを再度読み取ってください。" +ErrLDAPConfigChanged: "LDAP 設定が変更されました。ディレクトリを再度読み取り、インポートを再プレビューしてください。" +ErrLDAPRoleRequired: "新しい LDAP ユーザーのロールを選択してください。" +ErrLDAPImportPlanIncomplete: "不完全な LDAP インポートプランは実行できません。" +ErrLDAPQueryTokenInvalid: "LDAP クエリ結果の有効期限が切れました。ディレクトリを再度読み取ってください。" +ErrLDAPPlanTokenInvalid: "LDAP インポートプレビューの有効期限が切れました。再度プレビューしてください。" +ErrLDAPOperationFailed: "LDAP 操作に失敗しました。再試行してください。" +ErrLDAPEntryIdentityMissing: "LDAP エントリに安定した ID またはユーザー名がありません。" +ErrLDAPDuplicateExternalID: "LDAP から重複したユーザー ID が返されました。" +ErrLDAPUsernameConflict: "このユーザー名は別のユーザーが既に使用しています。" +ErrLDAPUsernameSourceConflict: "このユーザー名はローカルユーザーまたは別の認証ソースが既に使用しています。" +ErrLDAPUsernameConcurrentConflict: "インポート中に別のユーザーがこのユーザー名を使用しました。" +ErrLDAPLocalCredentialsReadonly: "LDAP のユーザー名とパスワードは LDAP で管理されるため、ローカルでは変更できません。" +ErrLDAPPasswordExpirationUnsupported: "LDAP ユーザーにはローカルのパスワード有効期限ポリシーは適用されません。" +ErrLDAPSyncSourceDisabled: "同期を有効化または実行する前に、AD/LDAP を有効にしてください。" +ErrLDAPSyncConfigSave: "LDAP 同期設定の保存に失敗しました。" +ErrLDAPSyncSchedule: "LDAP 同期スケジュールの更新に失敗しました。" +ErrLDAPSyncCronInvalid: "有効な 5 フィールドの Cron 式を入力してください。" +ErrLDAPSyncWeekdayInvalid: "有効な曜日を選択してください。" +ErrLDAPSyncCronRequired: "Cron 式を入力してください。" +ErrLDAPSyncScheduleTypeInvalid: "有効な同期スケジュールの種類を選択してください。" +ErrLDAPSyncTimeInvalid: "有効な実行時刻を入力してください。" +ErrLDAPSyncRunning: "LDAP 同期タスクはすでに実行中です。" +ErrLDAPSyncDirectoryIncomplete: "LDAP の全件クエリ結果が不完全です。ユーザーの状態は変更されませんでした。" +ErrLDAPSyncFailed: "LDAP ユーザーの同期に失敗しました。" +LDAPSyncSuccess: "LDAP ユーザーの同期が正常に完了しました。" diff --git a/core/i18n/lang/ko.yaml b/core/i18n/lang/ko.yaml index ca80845ca..273cbe4e0 100644 --- a/core/i18n/lang/ko.yaml +++ b/core/i18n/lang/ko.yaml @@ -424,3 +424,51 @@ ErrExpiredToken: '토큰이 만료되었습니다. 재설정 후 다시 스캔 # 명령 내보내기 Name: "이름" Command: "명령어" + +# LDAP +ErrLDAPConnectionTest: "LDAP 연결 테스트에 실패했습니다. 서버 주소, 바인드 계정 및 네트워크 설정을 확인하세요." +LDAPConnectionTestSuccess: "LDAP 연결 테스트에 성공했습니다." +ErrLDAPDirectorySearch: "LDAP 사용자를 읽지 못했습니다. 연결 및 검색 설정을 확인하세요." +ErrLDAPConfigLoad: "LDAP 설정을 불러오지 못했습니다." +ErrLDAPConfigSave: "LDAP 설정을 저장하지 못했습니다." +ErrLDAPURLInvalid: "LDAP 서버 주소는 ldap:// 또는 ldaps://를 사용하고 유효한 호스트를 포함해야 합니다." +ErrLDAPBindDNRequired: "바인드 DN은 필수입니다." +ErrLDAPBindPasswordRequired: "바인드 비밀번호는 필수입니다." +ErrLDAPUserOURequired: "사용자 OU는 필수입니다." +ErrLDAPConnectTimeoutRange: "연결 시간 제한은 1초에서 120초 사이여야 합니다." +ErrLDAPSearchPageSizeRange: "LDAP 조회 페이지 크기는 1에서 10000 사이여야 합니다." +ErrLDAPResultPageSizeRange: "결과 페이지 크기는 200을 초과할 수 없습니다." +ErrLDAPAttributeMapOnlyName: "속성 매핑은 name 필드만 지원합니다." +ErrLDAPNameAttributeRequired: "name에 매핑할 LDAP 속성은 필수입니다." +ErrLDAPAttributeNameInvalid: "속성 매핑에 잘못된 LDAP 속성 이름이 포함되어 있습니다." +ErrLDAPUserFilterRequired: "사용자 필터는 필수입니다." +ErrLDAPUserFilterInvalid: "사용자 필터가 올바른 LDAP 필터가 아닙니다." +ErrLDAPAttributeMapObject: "속성 매핑은 올바른 JSON 객체여야 합니다." +ErrLDAPImportModeInvalid: "가져오기 모드는 선택한 사용자 또는 모든 사용자여야 합니다." +ErrLDAPImportSelectionRequired: "가져올 LDAP 사용자를 한 명 이상 선택하세요." +ErrLDAPImportSelectionInvalid: "선택한 LDAP 사용자가 잘못되었거나 더 이상 존재하지 않습니다. 디렉터리를 다시 읽으세요." +ErrLDAPConfigChanged: "LDAP 설정이 변경되었습니다. 디렉터리를 다시 읽고 가져오기를 다시 미리 보세요." +ErrLDAPRoleRequired: "새 LDAP 사용자의 역할을 선택하세요." +ErrLDAPImportPlanIncomplete: "완전하지 않은 LDAP 가져오기 계획은 실행할 수 없습니다." +ErrLDAPQueryTokenInvalid: "LDAP 조회 결과가 만료되었습니다. 디렉터리를 다시 읽으세요." +ErrLDAPPlanTokenInvalid: "LDAP 가져오기 미리 보기가 만료되었습니다. 다시 미리 보세요." +ErrLDAPOperationFailed: "LDAP 작업에 실패했습니다. 다시 시도하세요." +ErrLDAPEntryIdentityMissing: "LDAP 항목에 안정적인 ID 또는 사용자 이름이 없습니다." +ErrLDAPDuplicateExternalID: "LDAP가 중복된 사용자 ID를 반환했습니다." +ErrLDAPUsernameConflict: "이 사용자 이름은 다른 사용자가 이미 사용 중입니다." +ErrLDAPUsernameSourceConflict: "이 사용자 이름은 로컬 사용자 또는 다른 인증 소스가 이미 사용 중입니다." +ErrLDAPUsernameConcurrentConflict: "가져오는 동안 다른 사용자가 이 사용자 이름을 사용했습니다." +ErrLDAPLocalCredentialsReadonly: "LDAP 사용자 이름과 비밀번호는 LDAP에서 관리되므로 로컬에서 변경할 수 없습니다." +ErrLDAPPasswordExpirationUnsupported: "LDAP 사용자는 로컬 비밀번호 만료 정책을 사용하지 않습니다." +ErrLDAPSyncSourceDisabled: "동기화를 활성화하거나 실행하기 전에 AD/LDAP를 활성화하세요." +ErrLDAPSyncConfigSave: "LDAP 동기화 설정을 저장하지 못했습니다." +ErrLDAPSyncSchedule: "LDAP 동기화 일정을 업데이트하지 못했습니다." +ErrLDAPSyncCronInvalid: "유효한 5필드 Cron 표현식을 입력하세요." +ErrLDAPSyncWeekdayInvalid: "유효한 요일을 선택하세요." +ErrLDAPSyncCronRequired: "Cron 표현식을 입력하세요." +ErrLDAPSyncScheduleTypeInvalid: "유효한 동기화 일정 유형을 선택하세요." +ErrLDAPSyncTimeInvalid: "유효한 실행 시간을 입력하세요." +ErrLDAPSyncRunning: "LDAP 동기화 작업이 이미 실행 중입니다." +ErrLDAPSyncDirectoryIncomplete: "LDAP 전체 조회 결과가 불완전하여 사용자 상태를 변경하지 않았습니다." +ErrLDAPSyncFailed: "LDAP 사용자 동기화에 실패했습니다." +LDAPSyncSuccess: "LDAP 사용자 동기화가 완료되었습니다." diff --git a/core/i18n/lang/lo.yaml b/core/i18n/lang/lo.yaml index d8368d7af..7541817e7 100644 --- a/core/i18n/lang/lo.yaml +++ b/core/i18n/lang/lo.yaml @@ -424,3 +424,51 @@ ErrExpiredToken: 'ໂທເຄັນໝົດອາຍຸແລ້ວ. ກະລ # command export Name: "ຊື່" Command: "ຄຳສັ່ງ" + +# LDAP +ErrLDAPConnectionTest: "ການທົດສອບການເຊື່ອມຕໍ່ LDAP ບໍ່ສຳເລັດ. ກະລຸນາກວດສອບທີ່ຢູ່ເຊີບເວີ, ບັນຊີຜູກມັດ ແລະການຕັ້ງຄ່າເຄືອຂ່າຍ." +LDAPConnectionTestSuccess: "ການທົດສອບການເຊື່ອມຕໍ່ LDAP ສຳເລັດແລ້ວ." +ErrLDAPDirectorySearch: "ອ່ານຜູ້ໃຊ້ LDAP ບໍ່ສຳເລັດ. ກະລຸນາກວດສອບການເຊື່ອມຕໍ່ ແລະການຕັ້ງຄ່າການຄົ້ນຫາ." +ErrLDAPConfigLoad: "ໂຫຼດການຕັ້ງຄ່າ LDAP ບໍ່ສຳເລັດ." +ErrLDAPConfigSave: "ບັນທຶກການຕັ້ງຄ່າ LDAP ບໍ່ສຳເລັດ." +ErrLDAPURLInvalid: "ທີ່ຢູ່ເຊີບເວີ LDAP ຕ້ອງໃຊ້ ldap:// ຫຼື ldaps:// ແລະມີໂຮສທີ່ຖືກຕ້ອງ." +ErrLDAPBindDNRequired: "ຈຳເປັນຕ້ອງມີ Bind DN." +ErrLDAPBindPasswordRequired: "ຈຳເປັນຕ້ອງມີລະຫັດຜ່ານສຳລັບການຜູກມັດ." +ErrLDAPUserOURequired: "ຈຳເປັນຕ້ອງມີ OU ຂອງຜູ້ໃຊ້." +ErrLDAPConnectTimeoutRange: "ໄລຍະເວລາໝົດການເຊື່ອມຕໍ່ຕ້ອງຢູ່ລະຫວ່າງ 1 ຫາ 120 ວິນາທີ." +ErrLDAPSearchPageSizeRange: "ຂະໜາດໜ້າການສອບຖາມ LDAP ຕ້ອງຢູ່ລະຫວ່າງ 1 ຫາ 10000." +ErrLDAPResultPageSizeRange: "ຂະໜາດໜ້າຜົນລັບຕ້ອງບໍ່ເກີນ 200." +ErrLDAPAttributeMapOnlyName: "ການສ້າງແຜນທີ່ຄຸນສົມບັດຮອງຮັບສະເພາະຊ່ອງຂໍ້ມູນ name." +ErrLDAPNameAttributeRequired: "ຈຳເປັນຕ້ອງລະບຸຄຸນສົມບັດ LDAP ທີ່ຈັບຄູ່ກັບ name." +ErrLDAPAttributeNameInvalid: "ການສ້າງແຜນທີ່ຄຸນສົມບັດມີຊື່ຄຸນສົມບັດ LDAP ທີ່ບໍ່ຖືກຕ້ອງ." +ErrLDAPUserFilterRequired: "ຈຳເປັນຕ້ອງມີຕົວກອງຜູ້ໃຊ້." +ErrLDAPUserFilterInvalid: "ຕົວກອງຜູ້ໃຊ້ບໍ່ແມ່ນຕົວກອງ LDAP ທີ່ຖືກຕ້ອງ." +ErrLDAPAttributeMapObject: "ການສ້າງແຜນທີ່ຄຸນສົມບັດຕ້ອງເປັນວັດຖຸ JSON ທີ່ຖືກຕ້ອງ." +ErrLDAPImportModeInvalid: "ຮູບແບບການນຳເຂົ້າຕ້ອງເປັນຜູ້ໃຊ້ທີ່ເລືອກ ຫຼືຜູ້ໃຊ້ທັງໝົດ." +ErrLDAPImportSelectionRequired: "ກະລຸນາເລືອກຜູ້ໃຊ້ LDAP ຢ່າງໜ້ອຍໜຶ່ງຄົນເພື່ອນຳເຂົ້າ." +ErrLDAPImportSelectionInvalid: "ຜູ້ໃຊ້ LDAP ທີ່ເລືອກບໍ່ຖືກຕ້ອງ ຫຼືບໍ່ມີຢູ່ແລ້ວ. ກະລຸນາອ່ານໄດເລກະທໍລີອີກຄັ້ງ." +ErrLDAPConfigChanged: "ການຕັ້ງຄ່າ LDAP ມີການປ່ຽນແປງ. ກະລຸນາອ່ານໄດເລກະທໍລີ ແລະເບິ່ງຕົວຢ່າງການນຳເຂົ້າອີກຄັ້ງ." +ErrLDAPRoleRequired: "ກະລຸນາເລືອກບົດບາດສຳລັບຜູ້ໃຊ້ LDAP ໃໝ່." +ErrLDAPImportPlanIncomplete: "ບໍ່ສາມາດດຳເນີນແຜນການນຳເຂົ້າ LDAP ທີ່ບໍ່ຄົບຖ້ວນໄດ້." +ErrLDAPQueryTokenInvalid: "ຜົນການສອບຖາມ LDAP ໝົດອາຍຸແລ້ວ. ກະລຸນາອ່ານໄດເລກະທໍລີອີກຄັ້ງ." +ErrLDAPPlanTokenInvalid: "ຕົວຢ່າງການນຳເຂົ້າ LDAP ໝົດອາຍຸແລ້ວ. ກະລຸນາເບິ່ງຕົວຢ່າງການນຳເຂົ້າອີກຄັ້ງ." +ErrLDAPOperationFailed: "ການດຳເນີນງານ LDAP ບໍ່ສຳເລັດ. ກະລຸນາລອງໃໝ່." +ErrLDAPEntryIdentityMissing: "ລາຍການ LDAP ຂາດ ID ທີ່ຄົງທີ່ ຫຼືຊື່ຜູ້ໃຊ້." +ErrLDAPDuplicateExternalID: "LDAP ສົ່ງຄືນ ID ຜູ້ໃຊ້ທີ່ຊ້ຳກັນ." +ErrLDAPUsernameConflict: "ຊື່ຜູ້ໃຊ້ນີ້ຖືກໃຊ້ໂດຍຜູ້ໃຊ້ອື່ນແລ້ວ." +ErrLDAPUsernameSourceConflict: "ຊື່ຜູ້ໃຊ້ນີ້ຖືກໃຊ້ໂດຍຜູ້ໃຊ້ພາຍໃນ ຫຼືແຫຼ່ງການພິສູດຢືນຢັນອື່ນແລ້ວ." +ErrLDAPUsernameConcurrentConflict: "ຊື່ຜູ້ໃຊ້ນີ້ຖືກຜູ້ໃຊ້ອື່ນນຳໄປໃຊ້ໃນລະຫວ່າງການນຳເຂົ້າ." +ErrLDAPLocalCredentialsReadonly: "ຊື່ຜູ້ໃຊ້ ແລະລະຫັດຜ່ານ LDAP ຖືກຈັດການໂດຍ LDAP ແລະບໍ່ສາມາດປ່ຽນແປງພາຍໃນໄດ້." +ErrLDAPPasswordExpirationUnsupported: "ຜູ້ໃຊ້ LDAP ບໍ່ໃຊ້ນະໂຍບາຍການໝົດອາຍຸລະຫັດຜ່ານພາຍໃນ." +ErrLDAPSyncSourceDisabled: "ກະລຸນາເປີດໃຊ້ AD/LDAP ກ່ອນເປີດໃຊ້ ຫຼື ດຳເນີນການຊິງຂໍ້ມູນ." +ErrLDAPSyncConfigSave: "ບັນທຶກການຕັ້ງຄ່າການຊິງຂໍ້ມູນ LDAP ບໍ່ສຳເລັດ." +ErrLDAPSyncSchedule: "ອັບເດດຕາຕະລາງການຊິງຂໍ້ມູນ LDAP ບໍ່ສຳເລັດ." +ErrLDAPSyncCronInvalid: "ກະລຸນາປ້ອນນິພົດ Cron ແບບ 5 ຊ່ອງທີ່ຖືກຕ້ອງ." +ErrLDAPSyncWeekdayInvalid: "ກະລຸນາເລືອກມື້ໃນອາທິດທີ່ຖືກຕ້ອງ." +ErrLDAPSyncCronRequired: "ກະລຸນາປ້ອນນິພົດ Cron." +ErrLDAPSyncScheduleTypeInvalid: "ກະລຸນາເລືອກປະເພດຕາຕະລາງການຊິງຂໍ້ມູນທີ່ຖືກຕ້ອງ." +ErrLDAPSyncTimeInvalid: "ກະລຸນາປ້ອນເວລາດຳເນີນການທີ່ຖືກຕ້ອງ." +ErrLDAPSyncRunning: "ມີວຽກຊິງຂໍ້ມູນ LDAP ກຳລັງເຮັດວຽກຢູ່ແລ້ວ." +ErrLDAPSyncDirectoryIncomplete: "LDAP ສົ່ງຄືນຜົນການຄົ້ນຫາທັງໝົດທີ່ບໍ່ຄົບຖ້ວນ. ບໍ່ມີການປ່ຽນແປງສະຖານະຜູ້ໃຊ້." +ErrLDAPSyncFailed: "ການຊິງຂໍ້ມູນຜູ້ໃຊ້ LDAP ບໍ່ສຳເລັດ." +LDAPSyncSuccess: "ການຊິງຂໍ້ມູນຜູ້ໃຊ້ LDAP ສຳເລັດແລ້ວ." diff --git a/core/i18n/lang/ms.yaml b/core/i18n/lang/ms.yaml index b3b3ca73b..63f87f14a 100644 --- a/core/i18n/lang/ms.yaml +++ b/core/i18n/lang/ms.yaml @@ -424,3 +424,51 @@ ErrExpiredToken: "Token telah tamat tempoh, sila tetapkan semula dan imbas semul # eksport perintah Name: "Nama" Command: "Arahan" + +# LDAP +ErrLDAPConnectionTest: "Ujian sambungan LDAP gagal. Semak alamat pelayan, akaun pengikatan dan tetapan rangkaian." +LDAPConnectionTestSuccess: "Ujian sambungan LDAP berjaya." +ErrLDAPDirectorySearch: "Gagal membaca pengguna LDAP. Semak tetapan sambungan dan carian." +ErrLDAPConfigLoad: "Gagal memuatkan konfigurasi LDAP." +ErrLDAPConfigSave: "Gagal menyimpan konfigurasi LDAP." +ErrLDAPURLInvalid: "Alamat pelayan LDAP mesti menggunakan ldap:// atau ldaps:// dan mengandungi hos yang sah." +ErrLDAPBindDNRequired: "DN pengikatan diperlukan." +ErrLDAPBindPasswordRequired: "Kata laluan pengikatan diperlukan." +ErrLDAPUserOURequired: "OU pengguna diperlukan." +ErrLDAPConnectTimeoutRange: "Had masa sambungan mestilah antara 1 hingga 120 saat." +ErrLDAPSearchPageSizeRange: "Saiz halaman pertanyaan LDAP mestilah antara 1 hingga 10000." +ErrLDAPResultPageSizeRange: "Saiz halaman hasil tidak boleh melebihi 200." +ErrLDAPAttributeMapOnlyName: "Pemetaan atribut hanya menyokong medan name." +ErrLDAPNameAttributeRequired: "Atribut LDAP yang dipetakan kepada name diperlukan." +ErrLDAPAttributeNameInvalid: "Pemetaan atribut mengandungi nama atribut LDAP yang tidak sah." +ErrLDAPUserFilterRequired: "Penapis pengguna diperlukan." +ErrLDAPUserFilterInvalid: "Penapis pengguna bukan penapis LDAP yang sah." +ErrLDAPAttributeMapObject: "Pemetaan atribut mestilah objek JSON yang sah." +ErrLDAPImportModeInvalid: "Mod import mestilah pengguna terpilih atau semua pengguna." +ErrLDAPImportSelectionRequired: "Pilih sekurang-kurangnya seorang pengguna LDAP untuk diimport." +ErrLDAPImportSelectionInvalid: "Pengguna LDAP yang dipilih tidak sah atau tidak lagi wujud. Baca semula direktori." +ErrLDAPConfigChanged: "Konfigurasi LDAP telah berubah. Baca semula direktori dan pratonton import sekali lagi." +ErrLDAPRoleRequired: "Pilih peranan untuk pengguna LDAP baharu." +ErrLDAPImportPlanIncomplete: "Pelan import LDAP yang tidak lengkap tidak boleh dilaksanakan." +ErrLDAPQueryTokenInvalid: "Hasil pertanyaan LDAP telah tamat tempoh. Baca semula direktori." +ErrLDAPPlanTokenInvalid: "Pratonton import LDAP telah tamat tempoh. Pratonton semula import." +ErrLDAPOperationFailed: "Operasi LDAP gagal. Cuba lagi." +ErrLDAPEntryIdentityMissing: "Entri LDAP tiada ID stabil atau nama pengguna." +ErrLDAPDuplicateExternalID: "LDAP mengembalikan ID pengguna yang berulang." +ErrLDAPUsernameConflict: "Nama pengguna telah digunakan oleh pengguna lain." +ErrLDAPUsernameSourceConflict: "Nama pengguna telah digunakan oleh pengguna tempatan atau sumber pengesahan lain." +ErrLDAPUsernameConcurrentConflict: "Nama pengguna telah diambil oleh pengguna lain semasa import." +ErrLDAPLocalCredentialsReadonly: "Nama pengguna dan kata laluan LDAP diurus oleh LDAP dan tidak boleh diubah secara tempatan." +ErrLDAPPasswordExpirationUnsupported: "Pengguna LDAP tidak menggunakan dasar tamat tempoh kata laluan tempatan." +ErrLDAPSyncSourceDisabled: "Dayakan AD/LDAP sebelum mendayakan atau menjalankan penyegerakan." +ErrLDAPSyncConfigSave: "Gagal menyimpan tetapan penyegerakan LDAP." +ErrLDAPSyncSchedule: "Gagal mengemas kini jadual penyegerakan LDAP." +ErrLDAPSyncCronInvalid: "Masukkan ungkapan Cron lima medan yang sah." +ErrLDAPSyncWeekdayInvalid: "Pilih hari dalam minggu yang sah." +ErrLDAPSyncCronRequired: "Masukkan ungkapan Cron." +ErrLDAPSyncScheduleTypeInvalid: "Pilih jenis jadual penyegerakan yang sah." +ErrLDAPSyncTimeInvalid: "Masukkan masa pelaksanaan yang sah." +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." diff --git a/core/i18n/lang/pt-BR.yaml b/core/i18n/lang/pt-BR.yaml index b7357fcc7..b563a7828 100644 --- a/core/i18n/lang/pt-BR.yaml +++ b/core/i18n/lang/pt-BR.yaml @@ -422,5 +422,53 @@ ErrInvalidToken: 'Token inválido, por favor, reinicie e escaneie novamente.' ErrExpiredToken: 'O token expirou, por favor, reinicie e escaneie novamente.' # exportação de comandos -Name: "Название" -Command: "Команда" +Name: "Nome" +Command: "Comando" + +# LDAP +ErrLDAPConnectionTest: "Falha no teste de conexão LDAP. Verifique o endereço do servidor, a conta de vinculação e as configurações de rede." +LDAPConnectionTestSuccess: "Teste de conexão LDAP concluído com sucesso." +ErrLDAPDirectorySearch: "Falha ao ler os usuários LDAP. Verifique as configurações de conexão e pesquisa." +ErrLDAPConfigLoad: "Falha ao carregar a configuração LDAP." +ErrLDAPConfigSave: "Falha ao salvar a configuração LDAP." +ErrLDAPURLInvalid: "O endereço do servidor LDAP deve usar ldap:// ou ldaps:// e incluir um host válido." +ErrLDAPBindDNRequired: "O DN de vinculação é obrigatório." +ErrLDAPBindPasswordRequired: "A senha de vinculação é obrigatória." +ErrLDAPUserOURequired: "A OU de usuários é obrigatória." +ErrLDAPConnectTimeoutRange: "O tempo limite da conexão deve estar entre 1 e 120 segundos." +ErrLDAPSearchPageSizeRange: "O tamanho da página da consulta LDAP deve estar entre 1 e 10000." +ErrLDAPResultPageSizeRange: "O tamanho da página de resultados não pode exceder 200." +ErrLDAPAttributeMapOnlyName: "O mapeamento de atributos aceita apenas o campo name." +ErrLDAPNameAttributeRequired: "O atributo LDAP mapeado para name é obrigatório." +ErrLDAPAttributeNameInvalid: "O mapeamento contém um nome de atributo LDAP inválido." +ErrLDAPUserFilterRequired: "O filtro de usuários é obrigatório." +ErrLDAPUserFilterInvalid: "O filtro de usuários não é um filtro LDAP válido." +ErrLDAPAttributeMapObject: "O mapeamento de atributos deve ser um objeto JSON válido." +ErrLDAPImportModeInvalid: "O modo de importação deve ser usuários selecionados ou todos os usuários." +ErrLDAPImportSelectionRequired: "Selecione pelo menos um usuário LDAP para importar." +ErrLDAPImportSelectionInvalid: "Os usuários LDAP selecionados são inválidos ou não existem mais. Leia o diretório novamente." +ErrLDAPConfigChanged: "A configuração LDAP foi alterada. Leia o diretório e visualize a importação novamente." +ErrLDAPRoleRequired: "Selecione uma função para os novos usuários LDAP." +ErrLDAPImportPlanIncomplete: "Um plano de importação LDAP incompleto não pode ser executado." +ErrLDAPQueryTokenInvalid: "O resultado da consulta LDAP expirou. Leia o diretório novamente." +ErrLDAPPlanTokenInvalid: "A visualização da importação LDAP expirou. Visualize a importação novamente." +ErrLDAPOperationFailed: "A operação LDAP falhou. Tente novamente." +ErrLDAPEntryIdentityMissing: "A entrada LDAP não possui um ID estável ou nome de usuário." +ErrLDAPDuplicateExternalID: "O LDAP retornou IDs de usuário duplicados." +ErrLDAPUsernameConflict: "O nome de usuário já é usado por outro usuário." +ErrLDAPUsernameSourceConflict: "O nome de usuário já é usado por um usuário local ou outra fonte de autenticação." +ErrLDAPUsernameConcurrentConflict: "O nome de usuário foi ocupado por outro usuário durante a importação." +ErrLDAPLocalCredentialsReadonly: "Os nomes de usuário e senhas LDAP são gerenciados pelo LDAP e não podem ser alterados localmente." +ErrLDAPPasswordExpirationUnsupported: "Usuários LDAP não usam a política local de expiração de senha." +ErrLDAPSyncSourceDisabled: "Ative o AD/LDAP antes de ativar ou executar a sincronização." +ErrLDAPSyncConfigSave: "Falha ao salvar as configurações de sincronização LDAP." +ErrLDAPSyncSchedule: "Falha ao atualizar o agendamento da sincronização LDAP." +ErrLDAPSyncCronInvalid: "Insira uma expressão Cron válida de cinco campos." +ErrLDAPSyncWeekdayInvalid: "Selecione um dia da semana válido." +ErrLDAPSyncCronRequired: "Insira uma expressão Cron." +ErrLDAPSyncScheduleTypeInvalid: "Selecione um tipo de agendamento de sincronização válido." +ErrLDAPSyncTimeInvalid: "Insira um horário de execução válido." +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." diff --git a/core/i18n/lang/ru.yaml b/core/i18n/lang/ru.yaml index 488923d37..fdd48a7df 100644 --- a/core/i18n/lang/ru.yaml +++ b/core/i18n/lang/ru.yaml @@ -424,3 +424,51 @@ ErrExpiredToken: 'Токен истек, пожалуйста, сбросьте # экспорт команд Name: "Название" Command: "Команда" + +# LDAP +ErrLDAPConnectionTest: "Не удалось выполнить проверку подключения LDAP. Проверьте адрес сервера, учетную запись привязки и настройки сети." +LDAPConnectionTestSuccess: "Проверка подключения LDAP выполнена успешно." +ErrLDAPDirectorySearch: "Не удалось прочитать пользователей LDAP. Проверьте подключение и настройки поиска." +ErrLDAPConfigLoad: "Не удалось загрузить конфигурацию LDAP." +ErrLDAPConfigSave: "Не удалось сохранить конфигурацию LDAP." +ErrLDAPURLInvalid: "Адрес сервера LDAP должен использовать ldap:// или ldaps:// и содержать допустимый хост." +ErrLDAPBindDNRequired: "Требуется DN привязки." +ErrLDAPBindPasswordRequired: "Требуется пароль привязки." +ErrLDAPUserOURequired: "Требуется OU пользователей." +ErrLDAPConnectTimeoutRange: "Время ожидания подключения должно быть от 1 до 120 секунд." +ErrLDAPSearchPageSizeRange: "Размер страницы запроса LDAP должен быть от 1 до 10000." +ErrLDAPResultPageSizeRange: "Размер страницы результатов не может превышать 200." +ErrLDAPAttributeMapOnlyName: "Сопоставление атрибутов поддерживает только поле name." +ErrLDAPNameAttributeRequired: "Требуется атрибут LDAP, сопоставленный с name." +ErrLDAPAttributeNameInvalid: "Сопоставление содержит недопустимое имя атрибута LDAP." +ErrLDAPUserFilterRequired: "Требуется фильтр пользователей." +ErrLDAPUserFilterInvalid: "Фильтр пользователей не является допустимым фильтром LDAP." +ErrLDAPAttributeMapObject: "Сопоставление атрибутов должно быть допустимым объектом JSON." +ErrLDAPImportModeInvalid: "Режим импорта должен включать выбранных или всех пользователей." +ErrLDAPImportSelectionRequired: "Выберите хотя бы одного пользователя LDAP для импорта." +ErrLDAPImportSelectionInvalid: "Выбранные пользователи LDAP недействительны или больше не существуют. Повторно прочитайте каталог." +ErrLDAPConfigChanged: "Конфигурация LDAP изменилась. Повторно прочитайте каталог и просмотрите импорт." +ErrLDAPRoleRequired: "Выберите роль для новых пользователей LDAP." +ErrLDAPImportPlanIncomplete: "Неполный план импорта LDAP нельзя выполнить." +ErrLDAPQueryTokenInvalid: "Результат запроса LDAP истек. Повторно прочитайте каталог." +ErrLDAPPlanTokenInvalid: "Предварительный просмотр импорта LDAP истек. Выполните его повторно." +ErrLDAPOperationFailed: "Операция LDAP завершилась ошибкой. Повторите попытку." +ErrLDAPEntryIdentityMissing: "В записи LDAP отсутствует стабильный идентификатор или имя пользователя." +ErrLDAPDuplicateExternalID: "LDAP вернул повторяющиеся идентификаторы пользователей." +ErrLDAPUsernameConflict: "Имя пользователя уже используется другим пользователем." +ErrLDAPUsernameSourceConflict: "Имя пользователя уже используется локальным пользователем или другим источником аутентификации." +ErrLDAPUsernameConcurrentConflict: "Во время импорта имя пользователя было занято другим пользователем." +ErrLDAPLocalCredentialsReadonly: "Имена и пароли пользователей LDAP управляются LDAP и не могут быть изменены локально." +ErrLDAPPasswordExpirationUnsupported: "Для пользователей LDAP не применяется локальная политика срока действия пароля." +ErrLDAPSyncSourceDisabled: "Включите AD/LDAP перед включением или запуском синхронизации." +ErrLDAPSyncConfigSave: "Не удалось сохранить настройки синхронизации LDAP." +ErrLDAPSyncSchedule: "Не удалось обновить расписание синхронизации LDAP." +ErrLDAPSyncCronInvalid: "Введите корректное пятикомпонентное выражение Cron." +ErrLDAPSyncWeekdayInvalid: "Выберите корректный день недели." +ErrLDAPSyncCronRequired: "Введите выражение Cron." +ErrLDAPSyncScheduleTypeInvalid: "Выберите корректный тип расписания синхронизации." +ErrLDAPSyncTimeInvalid: "Введите корректное время выполнения." +ErrLDAPSyncRunning: "Задача синхронизации LDAP уже выполняется." +ErrLDAPSyncDirectoryIncomplete: "LDAP вернул неполный результат полного запроса. Статусы пользователей не были изменены." +ErrLDAPSyncFailed: "Не удалось синхронизировать пользователей LDAP." +LDAPSyncSuccess: "Синхронизация пользователей LDAP успешно завершена." diff --git a/core/i18n/lang/tr.yaml b/core/i18n/lang/tr.yaml index 73a2dd9d8..6e62c825b 100644 --- a/core/i18n/lang/tr.yaml +++ b/core/i18n/lang/tr.yaml @@ -424,3 +424,51 @@ ErrExpiredToken: 'Token süresi dolmuş, lütfen sıfırlayın ve tekrar tarayı # komut dışa aktarma Name: "Ad" Command: "Komut" + +# LDAP +ErrLDAPConnectionTest: "LDAP bağlantı testi başarısız oldu. Sunucu adresini, bağlama hesabını ve ağ ayarlarını kontrol edin." +LDAPConnectionTestSuccess: "LDAP bağlantı testi başarılı oldu." +ErrLDAPDirectorySearch: "LDAP kullanıcıları okunamadı. Bağlantı ve arama ayarlarını kontrol edin." +ErrLDAPConfigLoad: "LDAP yapılandırması yüklenemedi." +ErrLDAPConfigSave: "LDAP yapılandırması kaydedilemedi." +ErrLDAPURLInvalid: "LDAP sunucu adresi ldap:// veya ldaps:// kullanmalı ve geçerli bir ana bilgisayar içermelidir." +ErrLDAPBindDNRequired: "Bağlama DN'i gereklidir." +ErrLDAPBindPasswordRequired: "Bağlama parolası gereklidir." +ErrLDAPUserOURequired: "Kullanıcı OU'su gereklidir." +ErrLDAPConnectTimeoutRange: "Bağlantı zaman aşımı 1 ile 120 saniye arasında olmalıdır." +ErrLDAPSearchPageSizeRange: "LDAP sorgu sayfası boyutu 1 ile 10000 arasında olmalıdır." +ErrLDAPResultPageSizeRange: "Sonuç sayfası boyutu 200'ü aşamaz." +ErrLDAPAttributeMapOnlyName: "Öznitelik eşlemesi yalnızca name alanını destekler." +ErrLDAPNameAttributeRequired: "name alanına eşlenen LDAP özniteliği gereklidir." +ErrLDAPAttributeNameInvalid: "Öznitelik eşlemesi geçersiz bir LDAP öznitelik adı içeriyor." +ErrLDAPUserFilterRequired: "Kullanıcı filtresi gereklidir." +ErrLDAPUserFilterInvalid: "Kullanıcı filtresi geçerli bir LDAP filtresi değildir." +ErrLDAPAttributeMapObject: "Öznitelik eşlemesi geçerli bir JSON nesnesi olmalıdır." +ErrLDAPImportModeInvalid: "İçe aktarma modu seçili kullanıcılar veya tüm kullanıcılar olmalıdır." +ErrLDAPImportSelectionRequired: "İçe aktarmak için en az bir LDAP kullanıcısı seçin." +ErrLDAPImportSelectionInvalid: "Seçilen LDAP kullanıcıları geçersiz veya artık mevcut değil. Dizini yeniden okuyun." +ErrLDAPConfigChanged: "LDAP yapılandırması değişti. Dizini yeniden okuyun ve içe aktarmayı tekrar önizleyin." +ErrLDAPRoleRequired: "Yeni LDAP kullanıcıları için bir rol seçin." +ErrLDAPImportPlanIncomplete: "Tamamlanmamış bir LDAP içe aktarma planı çalıştırılamaz." +ErrLDAPQueryTokenInvalid: "LDAP sorgu sonucunun süresi doldu. Dizini yeniden okuyun." +ErrLDAPPlanTokenInvalid: "LDAP içe aktarma önizlemesinin süresi doldu. Yeniden önizleyin." +ErrLDAPOperationFailed: "LDAP işlemi başarısız oldu. Tekrar deneyin." +ErrLDAPEntryIdentityMissing: "LDAP girdisinde kararlı bir kimlik veya kullanıcı adı eksik." +ErrLDAPDuplicateExternalID: "LDAP yinelenen kullanıcı kimlikleri döndürdü." +ErrLDAPUsernameConflict: "Kullanıcı adı başka bir kullanıcı tarafından zaten kullanılıyor." +ErrLDAPUsernameSourceConflict: "Kullanıcı adı yerel bir kullanıcı veya başka bir kimlik doğrulama kaynağı tarafından zaten kullanılıyor." +ErrLDAPUsernameConcurrentConflict: "İçe aktarma sırasında kullanıcı adı başka bir kullanıcı tarafından alındı." +ErrLDAPLocalCredentialsReadonly: "LDAP kullanıcı adları ve parolaları LDAP tarafından yönetilir ve yerel olarak değiştirilemez." +ErrLDAPPasswordExpirationUnsupported: "LDAP kullanıcıları yerel parola sona erme politikasını kullanmaz." +ErrLDAPSyncSourceDisabled: "Senkronizasyonu etkinleştirmeden veya çalıştırmadan önce AD/LDAP'yi etkinleştirin." +ErrLDAPSyncConfigSave: "LDAP senkronizasyon ayarları kaydedilemedi." +ErrLDAPSyncSchedule: "LDAP senkronizasyon zamanlaması güncellenemedi." +ErrLDAPSyncCronInvalid: "Geçerli, beş alanlı bir Cron ifadesi girin." +ErrLDAPSyncWeekdayInvalid: "Geçerli bir hafta günü seçin." +ErrLDAPSyncCronRequired: "Bir Cron ifadesi girin." +ErrLDAPSyncScheduleTypeInvalid: "Geçerli bir senkronizasyon zamanlama türü seçin." +ErrLDAPSyncTimeInvalid: "Geçerli bir çalıştırma saati girin." +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ı." diff --git a/core/i18n/lang/zh-Hant.yaml b/core/i18n/lang/zh-Hant.yaml index 356d2504b..dc8ca4b61 100644 --- a/core/i18n/lang/zh-Hant.yaml +++ b/core/i18n/lang/zh-Hant.yaml @@ -424,3 +424,51 @@ ErrExpiredToken: '令牌過期,請重設後再次掃碼' # 命令匯出 Name: "名稱" Command: "指令" + +# LDAP +ErrLDAPConnectionTest: "LDAP 連線測試失敗,請檢查服務位址、綁定帳號和網路設定。" +LDAPConnectionTestSuccess: "LDAP 連線測試成功。" +ErrLDAPDirectorySearch: "讀取 LDAP 使用者失敗,請檢查連線和搜尋設定。" +ErrLDAPConfigLoad: "載入 LDAP 設定失敗。" +ErrLDAPConfigSave: "儲存 LDAP 設定失敗。" +ErrLDAPURLInvalid: "LDAP 服務位址必須使用 ldap:// 或 ldaps://,並包含有效的主機位址。" +ErrLDAPBindDNRequired: "請輸入綁定 DN。" +ErrLDAPBindPasswordRequired: "請輸入綁定密碼。" +ErrLDAPUserOURequired: "請輸入使用者 OU。" +ErrLDAPConnectTimeoutRange: "連線逾時時間必須介於 1 到 120 秒。" +ErrLDAPSearchPageSizeRange: "LDAP 查詢分頁大小必須介於 1 到 10000。" +ErrLDAPResultPageSizeRange: "結果分頁大小不能超過 200。" +ErrLDAPAttributeMapOnlyName: "屬性對應僅支援 name 欄位。" +ErrLDAPNameAttributeRequired: "請輸入對應到 name 的 LDAP 屬性。" +ErrLDAPAttributeNameInvalid: "屬性對應中包含無效的 LDAP 屬性名稱。" +ErrLDAPUserFilterRequired: "請輸入使用者篩選器。" +ErrLDAPUserFilterInvalid: "使用者篩選器不是有效的 LDAP 篩選器。" +ErrLDAPAttributeMapObject: "屬性對應必須是有效的 JSON 物件。" +ErrLDAPImportModeInvalid: "匯入模式必須為匯入選取使用者或匯入全部使用者。" +ErrLDAPImportSelectionRequired: "請至少選取一個要匯入的 LDAP 使用者。" +ErrLDAPImportSelectionInvalid: "選取的 LDAP 使用者無效或已不存在,請重新讀取目錄。" +ErrLDAPConfigChanged: "LDAP 設定已變更,請重新讀取目錄並預覽匯入。" +ErrLDAPRoleRequired: "請選取新 LDAP 使用者的角色。" +ErrLDAPImportPlanIncomplete: "無法執行不完整的 LDAP 匯入計畫。" +ErrLDAPQueryTokenInvalid: "LDAP 查詢結果已過期,請重新讀取目錄。" +ErrLDAPPlanTokenInvalid: "LDAP 匯入預覽已過期,請重新預覽。" +ErrLDAPOperationFailed: "LDAP 操作失敗,請重試。" +ErrLDAPEntryIdentityMissing: "LDAP 項目缺少穩定 ID 或使用者名稱。" +ErrLDAPDuplicateExternalID: "LDAP 傳回了重複的使用者 ID。" +ErrLDAPUsernameConflict: "此使用者名稱已被其他使用者使用。" +ErrLDAPUsernameSourceConflict: "此使用者名稱已被本機使用者或其他驗證來源使用。" +ErrLDAPUsernameConcurrentConflict: "匯入期間此使用者名稱已被其他使用者占用。" +ErrLDAPLocalCredentialsReadonly: "LDAP 使用者名稱和密碼由 LDAP 管理,無法在本機修改。" +ErrLDAPPasswordExpirationUnsupported: "LDAP 使用者不使用本機密碼到期原則。" +ErrLDAPSyncSourceDisabled: "請先啟用 AD/LDAP,再開啟或執行同步。" +ErrLDAPSyncConfigSave: "儲存 LDAP 同步設定失敗。" +ErrLDAPSyncSchedule: "更新 LDAP 同步排程失敗。" +ErrLDAPSyncCronInvalid: "請輸入有效的五段式 Cron 運算式。" +ErrLDAPSyncWeekdayInvalid: "請選擇有效的星期。" +ErrLDAPSyncCronRequired: "請輸入 Cron 運算式。" +ErrLDAPSyncScheduleTypeInvalid: "請選擇有效的同步執行週期。" +ErrLDAPSyncTimeInvalid: "請輸入有效的執行時間。" +ErrLDAPSyncRunning: "已有 LDAP 同步工作正在執行。" +ErrLDAPSyncDirectoryIncomplete: "LDAP 全量查詢結果不完整,本次未變更任何使用者狀態。" +ErrLDAPSyncFailed: "LDAP 使用者同步失敗。" +LDAPSyncSuccess: "LDAP 使用者同步成功。" diff --git a/core/i18n/lang/zh.yaml b/core/i18n/lang/zh.yaml index 90d427e88..339c97364 100644 --- a/core/i18n/lang/zh.yaml +++ b/core/i18n/lang/zh.yaml @@ -424,3 +424,51 @@ ErrExpiredToken: '令牌过期,请重置后再次扫码' # 命令导出 Name: "名称" Command: "命令" + +# LDAP +ErrLDAPConnectionTest: "LDAP 连接测试失败,请检查服务地址、绑定账号和网络设置。" +LDAPConnectionTestSuccess: "LDAP 连接测试成功。" +ErrLDAPDirectorySearch: "读取 LDAP 用户失败,请检查连接和搜索设置。" +ErrLDAPConfigLoad: "加载 LDAP 配置失败。" +ErrLDAPConfigSave: "保存 LDAP 配置失败。" +ErrLDAPURLInvalid: "LDAP 服务地址必须使用 ldap:// 或 ldaps://,并包含有效的主机地址。" +ErrLDAPBindDNRequired: "请输入绑定 DN。" +ErrLDAPBindPasswordRequired: "请输入绑定密码。" +ErrLDAPUserOURequired: "请输入用户 OU。" +ErrLDAPConnectTimeoutRange: "连接超时时间必须在 1 到 120 秒之间。" +ErrLDAPSearchPageSizeRange: "LDAP 查询分页大小必须在 1 到 10000 之间。" +ErrLDAPResultPageSizeRange: "结果分页大小不能超过 200。" +ErrLDAPAttributeMapOnlyName: "属性映射仅支持 name 字段。" +ErrLDAPNameAttributeRequired: "请输入映射到 name 的 LDAP 属性。" +ErrLDAPAttributeNameInvalid: "属性映射中包含无效的 LDAP 属性名。" +ErrLDAPUserFilterRequired: "请输入用户过滤器。" +ErrLDAPUserFilterInvalid: "用户过滤器不是有效的 LDAP 过滤器。" +ErrLDAPAttributeMapObject: "属性映射必须是有效的 JSON 对象。" +ErrLDAPImportModeInvalid: "导入模式必须为导入选中用户或导入全部用户。" +ErrLDAPImportSelectionRequired: "请至少选择一个要导入的 LDAP 用户。" +ErrLDAPImportSelectionInvalid: "选中的 LDAP 用户无效或已不存在,请重新读取目录。" +ErrLDAPConfigChanged: "LDAP 配置已变更,请重新读取目录并预览导入。" +ErrLDAPRoleRequired: "请选择新 LDAP 用户的角色。" +ErrLDAPImportPlanIncomplete: "不能执行不完整的 LDAP 导入计划。" +ErrLDAPQueryTokenInvalid: "LDAP 查询结果已过期,请重新读取目录。" +ErrLDAPPlanTokenInvalid: "LDAP 导入预览已过期,请重新预览。" +ErrLDAPOperationFailed: "LDAP 操作失败,请重试。" +ErrLDAPEntryIdentityMissing: "LDAP 条目缺少稳定 ID 或用户名。" +ErrLDAPDuplicateExternalID: "LDAP 返回了重复的用户 ID。" +ErrLDAPUsernameConflict: "该用户名已被其他用户使用。" +ErrLDAPUsernameSourceConflict: "该用户名已被本地用户或其他认证源使用。" +ErrLDAPUsernameConcurrentConflict: "导入期间该用户名已被其他用户占用。" +ErrLDAPLocalCredentialsReadonly: "LDAP 用户名和密码由 LDAP 管理,不能在本地修改。" +ErrLDAPPasswordExpirationUnsupported: "LDAP 用户不使用本地密码过期策略。" +ErrLDAPSyncSourceDisabled: "请先启用 AD/LDAP,再开启或执行同步。" +ErrLDAPSyncConfigSave: "保存 LDAP 同步设置失败。" +ErrLDAPSyncSchedule: "更新 LDAP 同步计划失败。" +ErrLDAPSyncCronInvalid: "请输入有效的五段式 Cron 表达式。" +ErrLDAPSyncWeekdayInvalid: "请选择有效的星期。" +ErrLDAPSyncCronRequired: "请输入 Cron 表达式。" +ErrLDAPSyncScheduleTypeInvalid: "请选择有效的同步执行周期。" +ErrLDAPSyncTimeInvalid: "请输入有效的执行时间。" +ErrLDAPSyncRunning: "已有 LDAP 同步任务正在执行。" +ErrLDAPSyncDirectoryIncomplete: "LDAP 全量查询结果不完整,本次未改变任何用户状态。" +ErrLDAPSyncFailed: "LDAP 用户同步失败。" +LDAPSyncSuccess: "LDAP 用户同步成功。" diff --git a/core/middleware/password_expired.go b/core/middleware/password_expired.go index 3bbb79565..249f0fab6 100644 --- a/core/middleware/password_expired.go +++ b/core/middleware/password_expired.go @@ -74,6 +74,15 @@ func PasswordExpired() gin.HandlerFunc { c.Next() return } + shouldCheck, err := xpack.AuthProvider.ShouldCheckPasswordExpiration(c) + if err != nil { + helper.ErrorWithDetail(c, http.StatusInternalServerError, "ErrPasswordExpired", err) + return + } + if !shouldCheck { + c.Next() + return + } expirationTime, err := xpack.AuthProvider.LoadPasswordExpirationTime(c) if err != nil { helper.ErrorWithDetail(c, http.StatusInternalServerError, "ErrPasswordExpired", err) diff --git a/core/utils/xpack/helper/auth_helper.go b/core/utils/xpack/helper/auth_helper.go index e77277626..06aaccc35 100644 --- a/core/utils/xpack/helper/auth_helper.go +++ b/core/utils/xpack/helper/auth_helper.go @@ -76,6 +76,9 @@ func (a *authHelper) UpdateApiConfig(c *gin.Context, req baseDto.ApiInterfaceCon func (a *authHelper) GetCurrentUserInfo(_ *gin.Context) (*baseDto.CurrentUserInfo, error) { return auth.GetCurrentUserInfo() } +func (a *authHelper) ShouldCheckPasswordExpiration(_ *gin.Context) (bool, error) { + return true, nil +} func (a *authHelper) LoadPasswordExpirationTime(c *gin.Context) (string, error) { return auth.LoadPasswordExpirationTime(c) } diff --git a/core/utils/xpack/providers/auth.go b/core/utils/xpack/providers/auth.go index db2d4a802..83ab309a0 100644 --- a/core/utils/xpack/providers/auth.go +++ b/core/utils/xpack/providers/auth.go @@ -29,6 +29,7 @@ type AuthProvider interface { ClearPasskeys() error GetCurrentUserInfo(c *gin.Context) (*dto.CurrentUserInfo, error) + ShouldCheckPasswordExpiration(c *gin.Context) (bool, error) LoadPasswordExpirationTime(c *gin.Context) (string, error) SyncPasswordExpirationTime(expirationDays string) error UpdateCurrentUserInfo(c *gin.Context, req dto.CurrentUserUpdate) error diff --git a/frontend/src/api/interface/auth.ts b/frontend/src/api/interface/auth.ts index 994f59a90..73bb14dbd 100644 --- a/frontend/src/api/interface/auth.ts +++ b/frontend/src/api/interface/auth.ts @@ -55,6 +55,8 @@ export namespace Login { permissions: string[]; masterOnlyPermissions?: string[]; nodeRoles: Array<{ nodeId: number; nodeName: string; roleId: number; roleName: string }>; + authSource: string; + authSourceStatus: string; apiInterfaceStatus: string; apiKey: string; diff --git a/frontend/src/lang/modules/en.ts b/frontend/src/lang/modules/en.ts index 5516b0c83..1f54d6329 100644 --- a/frontend/src/lang/modules/en.ts +++ b/frontend/src/lang/modules/en.ts @@ -4218,6 +4218,69 @@ const message = { noFail: 'Mount failure does not affect system startup', }, xpack: { + ldap: { + source: 'Source', + directoryMissing: 'Not found in LDAP', + localCredentialsManaged: 'Username and password are managed by LDAP and cannot be changed locally.', + sources: { + local: 'Local', + ldap: 'LDAP', + }, + importUsers: 'Import AD/LDAP users', + searchUsersPlaceholder: 'Search username', + readFromLDAP: 'Read from LDAP', + selectedUsers: '{0} selected', + queriedAt: 'Read at', + cachedResult: 'Cached result', + roleForNewUsers: 'Role for new users', + selectRole: 'Select a role', + roleOnlyForNewUsers: 'A role is required only when the import creates users.', + roleRequiredForNewUsers: 'Select a role for new LDAP users.', + changedFields: 'Changed fields', + importSelected: 'Import selected', + importAll: 'Import all', + importPreview: 'AD/LDAP import preview', + importCompleted: 'AD/LDAP import completed', + incompletePreview: 'The LDAP directory read was incomplete. Read from LDAP again.', + missingUsersWarning: 'Users missing from LDAP will be disabled by strict synchronization.', + missingUsersWarningDetail: '{0} local LDAP user(s) will no longer be able to sign in.', + action: 'Action', + reason: 'Reason', + noImportChanges: 'No import changes', + confirmImport: 'Confirm import', + created: 'Create', + updated: 'Update', + reactivated: 'Reactivate', + unchanged: 'Unchanged', + conflicts: 'Conflicts', + missing: 'Missing', + missingUsersConfirm: '{0} user(s) missing from LDAP will be disabled and signed out. Continue?', + strictSyncConfirm: 'Confirm strict synchronization', + status: { + importable: 'New user', + update_available: 'Update available', + up_to_date: 'Up to date', + conflict: 'Conflict', + }, + fields: { + name: 'Username', + externalDN: 'Directory DN', + externalID: 'External ID', + authSourceStatus: 'Authentication status', + }, + actions: { + created: 'Create', + updated: 'Update', + reactivated: 'Reactivate', + unchanged: 'Unchanged', + skipped: 'Skipped', + conflicts: 'Conflict', + conflict: 'Conflict', + missing: 'Disable', + errors: 'Error', + error: 'Error', + }, + }, expiresEnterpriseAlert: 'Friendly reminder: Your Enterprise Edition license will expire in {0} days, and all Enterprise Edition features will no longer be accessible. Please renew promptly to ensure continued usage.', expiresProAlert: @@ -4778,6 +4841,219 @@ const message = { masterOnlyPermissionHelper: 'This permission only takes effect on the master node.', view: 'View', manage: 'Manage', + authManage: 'Authentication', + auth: { + providerNavigation: 'Authentication providers', + providers: { + ldap: 'AD/LDAP', + passkey: 'Passkey', + radius: 'Radius', + oidc: 'OIDC', + saml2: 'SAML2', + cas: 'CAS', + oauth2: 'OAuth2', + dingtalk: 'DingTalk', + feishu: 'Feishu', + wecom: 'WeCom', + }, + providerDescriptions: { + ldap: 'Compatible with Active Directory, OpenLDAP, and other LDAP services', + passkey: 'Use device credentials for passwordless sign-in', + radius: 'Authenticate network access through a Radius service', + oidc: 'Connect enterprise single sign-on with OpenID Connect', + saml2: 'Use SAML2 for enterprise identity federation', + cas: 'Connect a centralized authentication service for single sign-on', + oauth2: 'Connect a compatible OAuth2 identity service', + dingtalk: 'Use DingTalk organization identity and QR sign-in', + feishu: 'Use Feishu organization identity and account synchronization', + wecom: 'Authenticate with WeCom member identity', + }, + planned: 'Planned', + plannedTitle: '{0} authentication settings', + plannedDesc: 'This authentication provider is planned and is not available yet.', + ldap: { + enable: 'Enable', + enabled: 'Enabled', + disabled: 'Disabled', + connection: 'Basic connection', + connectionDesc: 'Configure the directory service and the bind account used to search for users.', + serverURL: 'Server URL', + serverURLHelper: 'Supports ldap:// and ldaps:// URLs.', + userBaseDN: 'User Base DN', + userBaseDNHelper: 'Starting DN for LDAP user searches; it can be an OU, CN, or domain root DN.', + bindDN: 'Bind DN', + bindPassword: 'Password', + passwordSaved: 'Leave blank to keep the saved password', + userSearch: 'User search', + userSearchDesc: + 'Set the user search base and filter, then map the LDAP attribute used as the 1Panel name.', + userFilter: 'User filter', + userFilterTooltip: + 'Replace %(user)s with the escaped username, or with * for a full directory read.', + userFilterHelper: 'Usernames are escaped before they are inserted into the LDAP filter.', + attributeMap: 'Attribute mapping', + attributeMapTooltip: 'JSON mapping from the 1Panel name field to an LDAP attribute.', + attributeMapHelper: 'Set the LDAP attribute mapped to the 1Panel name field.', + advanced: 'Advanced settings', + advancedDesc: 'Configure TLS and LDAP query paging.', + strictSync: 'Strict synchronization', + strictSyncTooltip: + 'After a complete full import, users missing from this LDAP source are disabled but not deleted.', + strictSyncHelper: + 'Only applies to a complete full import. Importing selected users never disables other users.', + skipTLSVerify: 'Skip TLS verification', + skipTLSVerifyTooltip: 'Disable certificate verification for LDAPS connections.', + skipTLSVerifyHelper: + 'Use only with a trusted self-signed certificate. This setting is independent of strict synchronization.', + connectTimeout: 'Connection timeout (seconds)', + searchPageSize: 'LDAP query page size', + restore: 'Restore', + testConnection: 'Test connection', + testLogin: 'Test login', + userImport: 'Import users', + saveBeforeImport: 'Save the current AD/LDAP settings before importing users.', + format: 'Format', + restoreExample: 'Restore example', + mappingValid: 'Valid JSON; name is configured.', + mappingInvalid: 'Enter valid JSON.', + mappingObject: 'The attribute mapping must be a JSON object.', + mappingOnlyName: 'Only the name mapping is supported.', + mappingStringValues: 'Every mapped attribute must be a string.', + mappingNameRequired: 'name must be a non-empty string.', + restored: 'The last saved settings were restored.', + connectionTestSuccess: 'LDAP connection test succeeded.', + recentTestSuccess: 'Last test succeeded: {0}', + recentTestFailed: 'Last test failed: {0}', + serverURLRequired: 'Enter the LDAP server URL.', + serverURLInvalid: 'Use a valid ldap:// or ldaps:// URL.', + userBaseDNRequired: 'Enter the User Base DN.', + bindDNRequired: 'Enter the Bind DN.', + passwordRequired: 'Enter the password.', + userFilterRequired: 'Enter the user filter.', + connectTimeoutRequired: 'Enter the connection timeout.', + searchPageSizeRequired: 'Enter the LDAP query page size.', + sync: { + title: 'Scheduled sync', + description: + 'Read the full LDAP directory on a schedule and maintain imported LDAP users in 1Panel.', + enable: 'Enable schedule', + enableHelper: + 'When disabled, automatic execution stops; manual synchronization remains available.', + schedule: 'Schedule', + daily: 'Daily', + weekly: 'Weekly', + customCron: 'Custom Cron', + preview: 'Preview', + previewTitle: 'Next 5 runs', + previewEmpty: 'No execution time available', + cronHelper: 'Use a standard five-field Cron expression: minute, hour, day, month, weekday.', + autoImport: 'Import new users', + autoImportHelper: + 'When disabled, only directory identifiers and status are maintained for imported LDAP users; no new users are created.', + defaultRole: 'New user role', + defaultRolePlaceholder: 'Select a role', + defaultRoleHelper: 'Only applies to users created by scheduled synchronization.', + defaultRoleRequired: 'Select a role for new LDAP users.', + strictSyncHelper: + 'Users missing from a complete full query are disabled and their sessions are cleared; users, roles, and permissions are not deleted.', + safetyTitle: 'Missing users are processed only after a complete LDAP full query', + safetyDescription: + 'A failed query, timeout, or incomplete paged result never changes user status. The synchronization scope follows the User Base DN, filter, and attribute mapping.', + runNow: 'Sync now', + lastRunSuccess: 'Last sync succeeded: {0}', + lastRunFailed: 'Last sync failed: {0}', + lastRunRunning: 'Sync started: {0}', + sourceDisabled: 'Enable and save AD/LDAP before running synchronization.', + cronRequired: 'Enter a Cron expression.', + saveBeforeRun: 'Save the synchronization settings before running the task.', + runConfirmTitle: 'Run strict synchronization', + runConfirmDescription: + 'LDAP users missing from a complete full query will be disabled and their active sessions cleared. Continue?', + runSuccess: 'LDAP synchronization completed.', + weekdays: { + 0: 'Sunday', + 1: 'Monday', + 2: 'Tuesday', + 3: 'Wednesday', + 4: 'Thursday', + 5: 'Friday', + 6: 'Saturday', + }, + }, + syncLogs: { + title: 'Sync logs', + description: 'Review scheduled and manual LDAP synchronization results.', + startedAt: 'Start time', + trigger: 'Trigger', + manual: 'Manual', + scheduled: 'Scheduled', + success: 'Success', + failed: 'Failed', + running: 'Running', + result: 'Result', + resultSummary: 'Created {0}, updated {1}, missing {2}', + duration: 'Duration', + action: 'Action', + }, + testLoginTitle: 'Test AD/LDAP login', + testLoginDesc: + 'Bind with an AD/LDAP user credential to test authentication only. No 1Panel session is created.', + ldapUsername: 'LDAP username', + usernameRequired: 'Enter the LDAP username.', + startTest: 'Start test', + testLoginSuccess: 'Authentication succeeded.', + testLoginSuccessWithDN: 'Authentication succeeded. User DN: {0}', + import: { + title: 'Import AD/LDAP users', + source: 'Data source: AD/LDAP directory', + lastRead: 'Last read: {0}', + cacheHit: 'Cached result', + keywordPlaceholder: 'Search username', + search: 'Search', + refresh: 'Read from LDAP', + refreshTip: 'Ignore the short-term cache and read the LDAP directory again.', + loadFailed: 'Failed to read the LDAP directory.', + retry: 'Retry', + noData: 'No directory users found.', + username: 'Username', + status: 'Status', + changes: 'Changes', + noChanges: 'No changes', + importable: 'Ready to import', + updateAvailable: 'Update available', + upToDate: 'Up to date', + conflict: 'Name conflict', + selectedCount: '{0} selected', + totalCount: '{0} users', + newUserRole: 'New user role', + newUserRoleRequired: 'Select a role for new users.', + noNewUsers: 'There are no new users in this operation.', + roleOnlyForNewUsers: 'The selected role is applied only to newly created users.', + strictOff: 'Strict synchronization is disabled. A full import will not disable users.', + importSelected: 'Import/update selected ({0})', + importAll: 'Import/update all ({0})', + previewTitle: 'Confirm full import', + previewDesc: + 'The complete LDAP directory was read. The search keyword does not limit this operation.', + created: 'Create', + updated: 'Update', + unchanged: 'Unchanged', + conflicts: 'Conflicts', + missing: 'Disable', + reactivated: 'Reactivate', + strictWarning: + 'Strict synchronization is enabled. Users missing from LDAP cannot sign in, but their records, roles, and permissions are retained.', + missingUsers: 'Users missing from LDAP', + missingScope: 'Only this LDAP source is affected.', + willDisable: 'Will be disabled', + confirmAll: 'Confirm import', + confirmAllWithMissing: 'Confirm import and disable {0} users', + executeSuccess: 'LDAP users were processed successfully.', + queryExpired: 'The directory result expired. Read from LDAP again.', + planIncomplete: 'The full directory read is incomplete and cannot be executed.', + }, + }, + }, }, app: { app: 'APP', diff --git a/frontend/src/lang/modules/es-es.ts b/frontend/src/lang/modules/es-es.ts index 9a59a7ba5..255129965 100644 --- a/frontend/src/lang/modules/es-es.ts +++ b/frontend/src/lang/modules/es-es.ts @@ -4266,6 +4266,72 @@ const message = { noFail: 'El fallo de montaje no afecta al inicio del sistema', }, xpack: { + ldap: { + source: 'Origen', + directoryMissing: 'No existe en LDAP', + localCredentialsManaged: + 'El nombre de usuario y la contraseña se administran mediante LDAP y no pueden modificarse localmente.', + sources: { + local: 'Local', + ldap: 'LDAP', + }, + importUsers: 'Importar usuarios de AD/LDAP', + searchUsersPlaceholder: 'Buscar nombre de usuario', + readFromLDAP: 'Leer de LDAP', + selectedUsers: '{0} seleccionados', + queriedAt: 'Leído el', + cachedResult: 'Resultado almacenado en caché', + roleForNewUsers: 'Rol para nuevos usuarios', + selectRole: 'Seleccione un rol', + roleOnlyForNewUsers: 'Solo se requiere un rol cuando la importación crea usuarios.', + roleRequiredForNewUsers: 'Seleccione un rol para los nuevos usuarios de LDAP.', + changedFields: 'Campos modificados', + importSelected: 'Importar seleccionado', + importAll: 'Importar todo', + importPreview: 'Vista previa de importación de AD/LDAP', + importCompleted: 'Importación de AD/LDAP completada', + incompletePreview: 'La lectura del directorio LDAP estuvo incompleta. Lea de LDAP nuevamente.', + missingUsersWarning: + 'Los usuarios que falten en LDAP serán deshabilitados mediante sincronización estricta.', + missingUsersWarningDetail: '{0} usuarios LDAP locales ya no podrán iniciar sesión.', + action: 'Acción', + reason: 'Razón', + noImportChanges: 'Sin cambios de importación', + confirmImport: 'Confirmar importación', + created: 'Crear', + updated: 'Actualizar', + reactivated: 'Reactivar', + unchanged: 'Sin cambios', + conflicts: 'Conflictos', + missing: 'Ausentes', + missingUsersConfirm: + '{0} usuarios ausentes en LDAP serán deshabilitados y se cerrarán sus sesiones. ¿Continuar?', + strictSyncConfirm: 'Confirmar sincronización estricta', + status: { + importable: 'Nuevo usuario', + update_available: 'Actualización disponible', + up_to_date: 'Actualizado', + conflict: 'Conflicto', + }, + fields: { + name: 'Nombre de usuario', + externalDN: 'Directorio DN', + externalID: 'Identificación externa', + authSourceStatus: 'Estado de autenticación', + }, + actions: { + created: 'Crear', + updated: 'Actualizar', + reactivated: 'Reactivar', + unchanged: 'Sin cambios', + skipped: 'Saltado', + conflicts: 'Conflicto', + conflict: 'Conflicto', + missing: 'Desactivar', + errors: 'Error', + error: 'Error', + }, + }, expiresEnterpriseAlert: 'Aviso: Tu licencia de Enterprise Edition expirará en {0} días y todas las funciones de Enterprise Edition dejarán de estar disponibles. Renueva pronto para asegurar el uso continuo.', expiresProAlert: @@ -4832,6 +4898,224 @@ const message = { masterOnlyPermissionHelper: 'Este permiso solo tiene efecto en el nodo principal.', view: 'Ver', manage: 'Gestionar', + authManage: 'Gestión de autenticación', + auth: { + providerNavigation: 'Proveedores de autenticación', + providers: { + ldap: 'AD/LDAP', + passkey: 'Passkey', + radius: 'Radius', + oidc: 'OIDC', + saml2: 'SAML2', + cas: 'CAS', + oauth2: 'OAuth2', + dingtalk: 'DingTalk', + feishu: 'Feishu', + wecom: 'WeCom', + }, + providerDescriptions: { + ldap: 'Compatible con Active Directory, OpenLDAP y otros servicios LDAP', + passkey: 'Utilice las credenciales del dispositivo para iniciar sesión sin contraseña', + radius: 'Autenticar el acceso a la red a través de un servicio Radius', + oidc: 'Conecte el inicio de sesión único empresarial con OpenID Connect', + saml2: 'Utilice SAML2 para la federación de identidades empresariales', + cas: 'Conecte un servicio de autenticación centralizado para inicio de sesión único', + oauth2: 'Conecte un servicio de identidad OAuth2 compatible', + dingtalk: 'Utilice la identidad de la organización DingTalk y el inicio de sesión QR', + feishu: 'Utilice la identidad de la organización Feishu y la sincronización de cuentas', + wecom: 'Autenticar con identidad de miembro de WeCom', + }, + planned: 'Planificado', + plannedTitle: 'Configuración de autenticación {0}', + plannedDesc: 'Este proveedor de autenticación está planificado y aún no está disponible.', + ldap: { + enable: 'Habilitar', + enabled: 'Habilitado', + disabled: 'Deshabilitado', + connection: 'Conexión básica', + connectionDesc: + 'Configure el servicio de directorio y la cuenta de vinculación utilizada para buscar usuarios.', + serverURL: 'URL del servidor', + serverURLHelper: 'Admite URL ldap:// y ldaps://.', + userBaseDN: 'Base DN de usuario', + userBaseDNHelper: + 'DN inicial para las búsquedas de usuarios LDAP; puede ser una OU, un CN o el DN raíz del dominio.', + bindDN: 'DN de enlace', + bindPassword: 'Contraseña', + passwordSaved: 'Déjelo en blanco para conservar la contraseña guardada.', + userSearch: 'Búsqueda de usuarios', + userSearchDesc: + 'Configure la base y el filtro de búsqueda, y asigne el atributo LDAP al campo name de 1Panel.', + userFilter: 'Filtro de usuario', + userFilterTooltip: + 'Reemplace %(user)s con el nombre de usuario con carácter de escape o con * para leer el directorio completo.', + userFilterHelper: + 'Los nombres de usuario tienen caracteres de escape antes de insertarlos en el filtro LDAP.', + attributeMap: 'Mapeo de atributos', + attributeMapTooltip: 'Mapeo JSON del campo name de 1Panel a un atributo LDAP.', + attributeMapHelper: 'Configure el atributo LDAP asignado al campo name de 1Panel.', + advanced: 'Configuraciones avanzadas', + advancedDesc: 'Configure la paginación de consultas TLS y LDAP.', + strictSync: 'Sincronización estricta', + strictSyncTooltip: + 'Después de una importación completa, los usuarios que faltan en esta fuente LDAP se deshabilitan pero no se eliminan.', + strictSyncHelper: + 'Solo se aplica a una importación completa. Importar usuarios seleccionados nunca deshabilita a otros usuarios.', + skipTLSVerify: 'Saltar la verificación TLS', + skipTLSVerifyTooltip: 'Deshabilite la verificación de certificados para conexiones LDAPS.', + skipTLSVerifyHelper: + 'Úselo únicamente con un certificado autofirmado confiable. Esta configuración es independiente de la sincronización estricta.', + connectTimeout: 'Tiempo de espera de conexión (segundos)', + searchPageSize: 'Tamaño de página de consulta LDAP', + restore: 'Restaurar', + testConnection: 'Probar conexión', + testLogin: 'Probar inicio de sesión', + userImport: 'Importar usuarios', + saveBeforeImport: 'Guarde la configuración actual de AD/LDAP antes de importar usuarios.', + format: 'Formato', + restoreExample: 'Ejemplo de restauración', + mappingValid: 'JSON válido; el campo name está configurado.', + mappingInvalid: 'Introduzca un JSON válido.', + mappingObject: 'La asignación de atributos debe ser un objeto JSON.', + mappingOnlyName: 'Solo se admite la asignación name.', + mappingStringValues: 'Cada atributo asignado debe ser una cadena.', + mappingNameRequired: 'name debe ser una cadena que no esté vacía.', + restored: 'Se restauraron las últimas configuraciones guardadas.', + connectionTestSuccess: 'La prueba de conexión LDAP fue exitosa.', + recentTestSuccess: 'Última prueba exitosa: {0}', + recentTestFailed: 'Última prueba fallida: {0}', + serverURLRequired: 'Ingrese la URL del servidor LDAP.', + serverURLInvalid: 'Utilice una URL ldap:// o ldaps:// válida.', + userBaseDNRequired: 'Ingrese la Base DN de usuario.', + bindDNRequired: 'Ingrese el DN de enlace.', + passwordRequired: 'Ingrese la contraseña.', + userFilterRequired: 'Ingrese el filtro de usuario.', + connectTimeoutRequired: 'Introduzca el tiempo de espera de la conexión.', + searchPageSizeRequired: 'Ingrese el tamaño de la página de consulta LDAP.', + sync: { + title: 'Sincronización programada', + description: + 'Lea el directorio LDAP completo de forma programada y mantenga los usuarios LDAP importados en 1Panel.', + enable: 'Habilitar horario', + enableHelper: + 'Cuando está deshabilitado, la ejecución automática se detiene; la sincronización manual permanece disponible.', + schedule: 'Horario', + daily: 'Diariamente', + weekly: 'Semanal', + customCron: 'Personalizado Cron', + preview: 'Vista previa', + previewTitle: 'Próximas 5 ejecuciones', + previewEmpty: 'No hay tiempo de ejecución disponible', + cronHelper: + 'Utilice una expresión Cron estándar de cinco campos: minuto, hora, día, mes y día de la semana.', + autoImport: 'Importar nuevos usuarios', + autoImportHelper: + 'Cuando está deshabilitado, solo se mantienen los identificadores y el estado del directorio para los usuarios LDAP importados; no se crean nuevos usuarios.', + defaultRole: 'Nuevo rol de usuario', + defaultRolePlaceholder: 'Seleccione un rol', + defaultRoleHelper: 'Solo se aplica a usuarios creados mediante sincronización programada.', + defaultRoleRequired: 'Seleccione un rol para los nuevos usuarios de LDAP.', + strictSyncHelper: + 'Los usuarios que faltan en una consulta completa se deshabilitan y sus sesiones se borran; Los usuarios, roles y permisos no se eliminan.', + safetyTitle: 'Los usuarios faltantes se procesan solo después de una consulta completa LDAP', + safetyDescription: + 'Una consulta fallida, un tiempo de espera o un resultado paginado incompleto nunca cambian el estado del usuario. El alcance de la sincronización sigue el usuario Base DN, el filtro y la asignación de atributos.', + runNow: 'Sincronizar ahora', + lastRunSuccess: 'Última sincronización exitosa: {0}', + lastRunFailed: 'La última sincronización falló: {0}', + lastRunRunning: 'Sincronización iniciada: {0}', + sourceDisabled: 'Habilite y guarde AD/LDAP antes de ejecutar la sincronización.', + cronRequired: 'Introduzca una expresión Cron.', + saveBeforeRun: 'Guarde la configuración de sincronización antes de ejecutar la tarea.', + runConfirmTitle: 'Ejecutar sincronización estricta', + runConfirmDescription: + 'Los usuarios de LDAP que falten en una consulta completa serán deshabilitados y sus sesiones activas se borrarán. ¿Continuar?', + runSuccess: 'Sincronización LDAP completada.', + weekdays: { + 0: 'domingo', + 1: 'lunes', + 2: 'martes', + 3: 'miércoles', + 4: 'jueves', + 5: 'viernes', + 6: 'sábado', + }, + }, + syncLogs: { + title: 'Registros de sincronización', + description: 'Revise los resultados de la sincronización manual y programada de LDAP.', + startedAt: 'Hora de inicio', + trigger: 'Tipo de ejecución', + manual: 'Manual', + scheduled: 'Programado', + success: 'Éxito', + failed: 'Fallido', + running: 'En ejecución', + result: 'Resultado', + resultSummary: 'Creados {0}, actualizados {1}, ausentes {2}', + duration: 'Duración', + action: 'acción', + }, + testLoginTitle: 'Probar inicio de sesión AD/LDAP', + testLoginDesc: + 'Vincule con una credencial de usuario AD/LDAP para probar solo la autenticación. No se crea ninguna sesión 1Panel.', + ldapUsername: 'nombre de usuario LDAP', + usernameRequired: 'Ingrese el nombre de usuario LDAP.', + startTest: 'Iniciar prueba', + testLoginSuccess: 'La autenticación fue exitosa.', + testLoginSuccessWithDN: 'La autenticación fue exitosa. Usuario DN: {0}', + import: { + title: 'Importar usuarios de AD/LDAP', + source: 'Fuente de datos: directorio AD/LDAP', + lastRead: 'Última lectura: {0}', + cacheHit: 'Resultado almacenado en caché', + keywordPlaceholder: 'Buscar nombre de usuario', + search: 'Buscar', + refresh: 'Leer de LDAP', + refreshTip: 'Ignore el caché a corto plazo y vuelva a leer el directorio LDAP.', + loadFailed: 'No se pudo leer el directorio LDAP.', + retry: 'Reintentar', + noData: 'No se encontraron usuarios del directorio.', + username: 'Nombre de usuario', + status: 'Estado', + changes: 'Cambios', + noChanges: 'Sin cambios', + importable: 'Listo para importar', + updateAvailable: 'Actualización disponible', + upToDate: 'actualizado', + conflict: 'Conflicto de nombres', + selectedCount: '{0} seleccionado', + totalCount: '{0} usuarios', + newUserRole: 'Nuevo rol de usuario', + newUserRoleRequired: 'Seleccione un rol para nuevos usuarios.', + noNewUsers: 'No hay nuevos usuarios en esta operación.', + roleOnlyForNewUsers: 'El rol seleccionado se aplica solo a los usuarios recién creados.', + strictOff: + 'La sincronización estricta está deshabilitada. Una importación completa no deshabilitará a los usuarios.', + importSelected: 'Importar/actualizar seleccionado ({0})', + importAll: 'Importar/actualizar todo ({0})', + previewTitle: 'Confirmar importación completa', + previewDesc: + 'Se leyó el directorio LDAP completo. La palabra clave de búsqueda no limita esta operación.', + created: 'crear', + updated: 'Actualizar', + unchanged: 'Sin cambios', + conflicts: 'Conflictos', + missing: 'Desactivar', + reactivated: 'Reactivar', + strictWarning: + 'La sincronización estricta está habilitada. Los usuarios que faltan en LDAP no pueden iniciar sesión, pero se conservan sus registros, roles y permisos.', + missingUsers: 'Usuarios que faltan en LDAP', + missingScope: 'Sólo esta fuente LDAP se ve afectada.', + willDisable: 'Estará deshabilitado', + confirmAll: 'Confirmar importación', + confirmAllWithMissing: 'Confirmar importación y deshabilitar {0} usuarios', + executeSuccess: 'Los usuarios de LDAP se procesaron exitosamente.', + queryExpired: 'El resultado del directorio expiró. Lea de LDAP nuevamente.', + planIncomplete: 'La lectura completa del directorio está incompleta y no se puede ejecutar.', + }, + }, + }, }, app: { app: 'APP', diff --git a/frontend/src/lang/modules/fa.ts b/frontend/src/lang/modules/fa.ts index 58d9cdf63..63d0837a7 100644 --- a/frontend/src/lang/modules/fa.ts +++ b/frontend/src/lang/modules/fa.ts @@ -4187,6 +4187,70 @@ const message = { noFail: 'شکست اتصال بر راه‌اندازی سیستم تأثیری نمی‌گذارد', }, xpack: { + ldap: { + source: 'منبع', + directoryMissing: 'در LDAP یافت نشد', + localCredentialsManaged: 'نام کاربری و رمز عبور توسط LDAP مدیریت می‌شوند و به‌صورت محلی قابل تغییر نیستند.', + sources: { + local: 'محلی', + ldap: 'LDAP', + }, + importUsers: 'وارد کردن کاربران AD/LDAP', + searchUsersPlaceholder: 'جستجوی نام کاربری', + readFromLDAP: 'از LDAP بخوانید', + selectedUsers: '{0} انتخاب شد', + queriedAt: 'زمان خواندن', + cachedResult: 'نتیجه ذخیره شده', + roleForNewUsers: 'نقش برای کاربران جدید', + selectRole: 'یک نقش را انتخاب کنید', + roleOnlyForNewUsers: 'یک نقش تنها زمانی مورد نیاز است که وارد کردن کاربران ایجاد کند.', + roleRequiredForNewUsers: 'نقشی را برای کاربران جدید LDAP انتخاب کنید.', + changedFields: 'فیلدها را تغییر داد', + importSelected: 'واردات انتخاب شد', + importAll: 'همه را وارد کنید', + importPreview: 'پیش‌نمایش وارد کردن AD/LDAP', + importCompleted: 'وارد کردن AD/LDAP تکمیل شد', + incompletePreview: 'دایرکتوری LDAP خوانده شده ناقص بود. دوباره از LDAP بخوانید.', + missingUsersWarning: 'کاربرانی که از LDAP غایب هستند با همگام سازی دقیق غیرفعال می شوند.', + missingUsersWarningDetail: '{0} کاربر محلی LDAP دیگر نمی‌توانند وارد سیستم شوند.', + action: 'اقدام', + reason: 'دلیل', + noImportChanges: 'بدون تغییر واردات', + confirmImport: 'واردات را تایید کنید', + created: 'ایجاد کنید', + updated: 'به روز رسانی', + reactivated: 'دوباره فعال کنید', + unchanged: 'بدون تغییر', + conflicts: 'درگیری ها', + missing: 'گم شده', + missingUsersConfirm: + 'کاربر(های) {0} که از LDAP مفقود شده اند غیرفعال می شوند و از سیستم خارج می شوند. ادامه دهید؟', + strictSyncConfirm: 'همگام سازی دقیق را تأیید کنید', + status: { + importable: 'کاربر جدید', + update_available: 'به روز رسانی موجود است', + up_to_date: 'به روز', + conflict: 'درگیری', + }, + fields: { + name: 'نام کاربری', + externalDN: 'دایرکتوری DN', + externalID: 'شناسه خارجی', + authSourceStatus: 'وضعیت احراز هویت', + }, + actions: { + created: 'ایجاد کنید', + updated: 'به روز رسانی', + reactivated: 'دوباره فعال کنید', + unchanged: 'بدون تغییر', + skipped: 'رد شد', + conflicts: 'درگیری', + conflict: 'درگیری', + missing: 'غیر فعال کردن', + errors: 'خطا', + error: 'خطا', + }, + }, expiresEnterpriseAlert: 'یادآوری دوستانه: مجوز نسخه سازمانی شما در {0} روز منقضی می‌شود و همه ویژگی‌های نسخه سازمانی دیگر قابل دسترسی نخواهند بود. لطفاً به موقع تمدید کنید تا استفاده ادامه یابد.', expiresProAlert: @@ -4745,6 +4809,218 @@ const message = { masterOnlyPermissionHelper: 'این مجوز فقط در گره اصلی اعمال می‌شود.', view: 'مشاهده', manage: 'مدیریت', + authManage: 'مدیریت احراز هویت', + auth: { + providerNavigation: 'ارائه دهندگان احراز هویت', + providers: { + ldap: 'AD/LDAP', + passkey: 'Passkey', + radius: 'Radius', + oidc: 'OIDC', + saml2: 'SAML2', + cas: 'CAS', + oauth2: 'OAuth2', + dingtalk: 'دینگ تاک', + feishu: 'فیشو', + wecom: 'WeCom', + }, + providerDescriptions: { + ldap: 'سازگار با Active Directory، OpenLDAP و سایر خدمات LDAP', + passkey: 'از اعتبار دستگاه برای ورود بدون رمز عبور استفاده کنید', + radius: 'دسترسی به شبکه را از طریق سرویس Radius تأیید اعتبار کنید', + oidc: 'با OpenID Connect به یک ورود به سیستم سازمانی متصل شوید', + saml2: 'از SAML2 برای فدراسیون هویت سازمانی استفاده کنید', + cas: 'یک سرویس احراز هویت متمرکز را برای یک ورود به سیستم متصل کنید', + oauth2: 'یک سرویس هویت سازگار OAuth2 را وصل کنید', + dingtalk: 'از هویت سازمانی DingTalk و ورود به سیستم QR استفاده کنید', + feishu: 'از هویت سازمانی فیشو و همگام سازی حساب استفاده کنید', + wecom: 'با هویت عضو WeCom احراز هویت کنید', + }, + planned: 'برنامه ریزی شده است', + plannedTitle: 'تنظیمات احراز هویت {0}', + plannedDesc: 'این ارائه دهنده احراز هویت برنامه ریزی شده است و هنوز در دسترس نیست.', + ldap: { + enable: 'فعال کردن', + enabled: 'فعال شد', + disabled: 'غیرفعال', + connection: 'اتصال اولیه', + connectionDesc: 'سرویس دایرکتوری و حساب bind مورد استفاده برای جستجوی کاربران را پیکربندی کنید.', + serverURL: 'آدرس سرور', + serverURLHelper: 'از URL های ldap:// و ldaps:// پشتیبانی می کند.', + userBaseDN: 'کاربر Base DN', + userBaseDNHelper: 'شروع DN برای جستجوهای کاربر LDAP. این می تواند یک OU، CN یا ریشه دامنه DN باشد.', + bindDN: 'DN را ببندید', + bindPassword: 'رمز عبور', + passwordSaved: 'برای حفظ رمز عبور ذخیره شده خالی بگذارید', + userSearch: 'جستجوی کاربر', + userSearchDesc: + 'پایه و فیلتر جستجوی کاربر را تنظیم کنید، سپس ویژگی LDAP مورد استفاده به عنوان 1Panel name را ترسیم کنید.', + userFilter: 'فیلتر کاربر', + userFilterTooltip: + '%(user)s را با نام کاربری فرار شده جایگزین کنید، یا برای خواندن فهرست کامل، با * استفاده کنید.', + userFilterHelper: 'نام‌های کاربری قبل از درج در فیلتر LDAP حذف می‌شوند.', + attributeMap: 'نگاشت صفت', + attributeMapTooltip: 'نقشه برداری JSON از فیلد 1Panel name به ویژگی LDAP.', + attributeMapHelper: 'ویژگی LDAP نگاشت شده را روی فیلد 1Panel name تنظیم کنید.', + advanced: 'تنظیمات پیشرفته', + advancedDesc: 'صفحه بندی پرس و جو TLS و LDAP را پیکربندی کنید.', + strictSync: 'همگام سازی دقیق', + strictSyncTooltip: + 'پس از وارد کردن کامل، کاربرانی که از این منبع LDAP غایب هستند غیرفعال می شوند اما حذف نمی شوند.', + strictSyncHelper: + 'فقط برای یک واردات کامل کامل اعمال می شود. وارد کردن کاربران انتخابی هرگز سایر کاربران را غیرفعال نمی کند.', + skipTLSVerify: 'رد شدن از تأیید TLS', + skipTLSVerifyTooltip: 'تأیید گواهی را برای اتصالات LDAPS غیرفعال کنید.', + skipTLSVerifyHelper: + 'فقط با یک گواهی خودامضا مورد اعتماد استفاده کنید. این تنظیم مستقل از همگام سازی دقیق است.', + connectTimeout: 'پایان زمان اتصال (ثانیه)', + searchPageSize: 'اندازه صفحه پرس و جو LDAP', + restore: 'بازیابی کنید', + testConnection: 'تست اتصال', + testLogin: 'تست ورود', + userImport: 'کاربران را وارد کنید', + saveBeforeImport: 'تنظیمات فعلی AD/LDAP را قبل از وارد کردن کاربران ذخیره کنید.', + format: 'قالب', + restoreExample: 'نمونه را بازیابی کنید', + mappingValid: 'معتبر JSON; name پیکربندی شده است.', + mappingInvalid: 'JSON معتبر وارد کنید.', + mappingObject: 'نگاشت ویژگی باید یک شی JSON باشد.', + mappingOnlyName: 'فقط نقشه برداری name پشتیبانی می شود.', + mappingStringValues: 'هر ویژگی نگاشت شده باید یک رشته باشد.', + mappingNameRequired: 'name باید یک رشته غیر خالی باشد.', + restored: 'آخرین تنظیمات ذخیره شده بازیابی شدند.', + connectionTestSuccess: 'تست اتصال LDAP با موفقیت انجام شد.', + recentTestSuccess: 'آخرین آزمایش موفق: {0}', + recentTestFailed: 'آخرین آزمایش ناموفق: {0}', + serverURLRequired: 'آدرس سرور LDAP را وارد کنید.', + serverURLInvalid: 'از یک URL معتبر ldap:// یا ldaps:// استفاده کنید.', + userBaseDNRequired: 'کاربر Base DN را وارد کنید.', + bindDNRequired: 'Bind DN را وارد کنید.', + passwordRequired: 'رمز عبور را وارد کنید.', + userFilterRequired: 'فیلتر کاربر را وارد کنید.', + connectTimeoutRequired: 'زمان اتصال را وارد کنید.', + searchPageSizeRequired: 'اندازه صفحه پرس و جو LDAP را وارد کنید.', + sync: { + title: 'همگام سازی برنامه ریزی شده', + description: + 'فهرست کامل LDAP را بر اساس یک برنامه زمان بندی بخوانید و کاربران LDAP وارد شده را در 1Panel حفظ کنید.', + enable: 'زمانبندی را فعال کنید', + enableHelper: + 'در صورت غیرفعال شدن، اجرای خودکار متوقف می شود. همگام سازی دستی در دسترس باقی می ماند.', + schedule: 'برنامه ریزی کنید', + daily: 'روزانه', + weekly: 'هفتگی', + customCron: 'سفارشی Cron', + preview: 'پیش نمایش', + previewTitle: '5 اجرا بعدی', + previewEmpty: 'زمان اجرا در دسترس نیست', + cronHelper: 'از عبارت استاندارد پنج فیلدی Cron استفاده کنید: دقیقه، ساعت، روز، ماه، روز هفته.', + autoImport: 'وارد کردن کاربران جدید', + autoImportHelper: + 'وقتی غیرفعال است، فقط شناسه‌های دایرکتوری و وضعیت برای کاربران وارداتی LDAP حفظ می‌شود. کاربر جدیدی ایجاد نمی شود', + defaultRole: 'نقش کاربر جدید', + defaultRolePlaceholder: 'یک نقش را انتخاب کنید', + defaultRoleHelper: 'فقط برای کاربران ایجاد شده توسط همگام سازی برنامه ریزی شده اعمال می شود.', + defaultRoleRequired: 'نقشی را برای کاربران جدید LDAP انتخاب کنید.', + strictSyncHelper: + 'کاربرانی که از یک پرس و جو کامل کامل غایب هستند غیرفعال می شوند و جلسات آنها پاک می شود. کاربران، نقش‌ها و مجوزها حذف نمی‌شوند.', + safetyTitle: 'کاربران گمشده فقط پس از یک پرس و جو کامل LDAP پردازش می شوند', + safetyDescription: + 'پرس و جو ناموفق، مهلت زمانی، یا نتیجه صفحه ناقص هرگز وضعیت کاربر را تغییر نمی دهد. محدوده همگام سازی از نگاشت کاربر Base DN، فیلتر و ویژگی پیروی می کند.', + runNow: 'اکنون همگام سازی کنید', + lastRunSuccess: 'آخرین همگام سازی موفقیت آمیز: {0}', + lastRunFailed: 'آخرین همگام سازی ناموفق بود: {0}', + lastRunRunning: 'همگام سازی شروع شد: {0}', + sourceDisabled: 'قبل از اجرای همگام سازی، AD/LDAP را فعال و ذخیره کنید.', + cronRequired: 'عبارت Cron را وارد کنید.', + saveBeforeRun: 'قبل از اجرای کار، تنظیمات همگام سازی را ذخیره کنید.', + runConfirmTitle: 'همگام سازی دقیق را اجرا کنید', + runConfirmDescription: + 'کاربران LDAP که یک پرس و جو کامل کامل ندارند غیرفعال می شوند و جلسات فعال آنها پاک می شود. ادامه دهید؟', + runSuccess: 'همگام سازی LDAP تکمیل شد.', + weekdays: { + 0: 'یکشنبه', + 1: 'دوشنبه', + 2: 'سه شنبه', + 3: 'چهارشنبه', + 4: 'پنج شنبه', + 5: 'جمعه', + 6: 'شنبه', + }, + }, + syncLogs: { + title: 'همگام سازی گزارش ها', + description: 'نتایج همگام سازی زمان بندی شده و دستی LDAP را مرور کنید.', + startedAt: 'زمان شروع', + trigger: 'نوع اجرا', + manual: 'دستی', + scheduled: 'برنامه ریزی شده است', + success: 'موفقیت', + failed: 'شکست خورد', + running: 'در حال اجرا', + result: 'نتیجه', + resultSummary: '{0} ایجاد شد، {1} به‌روزرسانی شد، {2} موجود نیست', + duration: 'مدت زمان', + action: 'اقدام', + }, + testLoginTitle: 'آزمایش ورود AD/LDAP', + testLoginDesc: + 'فقط برای آزمایش احراز هویت، با یک اعتبار کاربری AD/LDAP متصل شوید. هیچ جلسه 1Panel ایجاد نشده است.', + ldapUsername: 'نام کاربری LDAP', + usernameRequired: 'نام کاربری LDAP را وارد کنید.', + startTest: 'شروع تست', + testLoginSuccess: 'احراز هویت با موفقیت انجام شد.', + testLoginSuccessWithDN: 'احراز هویت با موفقیت انجام شد. کاربر DN: {0}', + import: { + title: 'وارد کردن کاربران AD/LDAP', + source: 'منبع داده: دایرکتوری AD/LDAP', + lastRead: 'آخرین خوانده شده: {0}', + cacheHit: 'نتیجه ذخیره شده', + keywordPlaceholder: 'جستجوی نام کاربری', + search: 'جستجو کنید', + refresh: 'از LDAP بخوانید', + refreshTip: 'کش کوتاه مدت را نادیده بگیرید و فهرست LDAP را دوباره بخوانید.', + loadFailed: 'دایرکتوری LDAP خوانده نشد.', + retry: 'دوباره امتحان کنید', + noData: 'هیچ کاربر دایرکتوری پیدا نشد.', + username: 'نام کاربری', + status: 'وضعیت', + changes: 'تغییرات', + noChanges: 'بدون تغییر', + importable: 'آماده واردات', + updateAvailable: 'به روز رسانی موجود است', + upToDate: 'به روز', + conflict: 'تضاد نام', + selectedCount: '{0} انتخاب شد', + totalCount: '{0} کاربر', + newUserRole: 'نقش کاربر جدید', + newUserRoleRequired: 'نقشی را برای کاربران جدید انتخاب کنید.', + noNewUsers: 'هیچ کاربر جدیدی در این عملیات وجود ندارد.', + roleOnlyForNewUsers: 'نقش انتخاب شده فقط برای کاربران تازه ایجاد شده اعمال می شود.', + strictOff: 'همگام سازی دقیق غیرفعال است. وارد کردن کامل کاربران را غیرفعال نمی کند.', + importSelected: 'وارد کردن/به‌روزرسانی انتخاب شد ({0})', + importAll: 'وارد کردن/به‌روزرسانی همه ({0})', + previewTitle: 'واردات کامل را تأیید کنید', + previewDesc: 'فهرست کامل LDAP خوانده شد. کلمه کلیدی جستجو این عملیات را محدود نمی کند.', + created: 'ایجاد کنید', + updated: 'به روز رسانی', + unchanged: 'بدون تغییر', + conflicts: 'درگیری ها', + missing: 'غیر فعال کردن', + reactivated: 'دوباره فعال کنید', + strictWarning: + 'همگام سازی دقیق فعال است. کاربرانی که در LDAP گم شده اند نمی توانند وارد سیستم شوند، اما سوابق، نقش ها و مجوزهای آنها حفظ می شود.', + missingUsers: 'کاربرانی که از LDAP غایب هستند', + missingScope: 'فقط این منبع LDAP تحت تأثیر قرار می گیرد.', + willDisable: 'غیر فعال خواهد شد', + confirmAll: 'واردات را تایید کنید', + confirmAllWithMissing: 'درون‌ریزی را تأیید و {0} کاربر را غیرفعال کنید', + executeSuccess: 'کاربران LDAP با موفقیت پردازش شدند.', + queryExpired: 'نتیجه دایرکتوری منقضی شد. دوباره از LDAP بخوانید.', + planIncomplete: 'دایرکتوری کامل خوانده شده ناقص است و قابل اجرا نیست.', + }, + }, + }, }, app: { app: 'برنامه', diff --git a/frontend/src/lang/modules/ja.ts b/frontend/src/lang/modules/ja.ts index 35e0c0c43..1284430e9 100644 --- a/frontend/src/lang/modules/ja.ts +++ b/frontend/src/lang/modules/ja.ts @@ -4235,6 +4235,70 @@ const message = { noFail: 'マウント失敗はシステム起動に影響しません', }, xpack: { + ldap: { + source: 'ソース', + directoryMissing: 'LDAP に存在しません', + localCredentialsManaged: + 'このユーザーのユーザー名とパスワードは LDAP で管理されているため、ローカルでは変更できません。', + sources: { + local: 'ローカル', + ldap: 'LDAP', + }, + importUsers: 'AD/LDAP ユーザーをインポート', + searchUsersPlaceholder: 'ユーザー名を検索', + readFromLDAP: 'LDAP から読み取る', + selectedUsers: '{0} が選択されました', + queriedAt: '読み取り時刻', + cachedResult: 'キャッシュされた結果', + roleForNewUsers: '新規ユーザーの役割', + selectRole: '役割を選択してください', + roleOnlyForNewUsers: 'ロールは、インポートによってユーザーが作成される場合にのみ必要です。', + roleRequiredForNewUsers: '新しい LDAP ユーザーのロールを選択します。', + changedFields: '変更されたフィールド', + importSelected: '選択したインポート', + importAll: 'すべてインポート', + importPreview: 'AD/LDAP インポートプレビュー', + importCompleted: 'AD/LDAP インポート完了', + incompletePreview: 'LDAP ディレクトリの読み取りが不完全でした。再び LDAP から読み取ります。', + missingUsersWarning: 'LDAP にないユーザーは、厳密な同期によって無効になります。', + missingUsersWarningDetail: 'ローカル LDAP ユーザー {0} 人がサインインできなくなります。', + action: 'アクション', + reason: '理由', + noImportChanges: 'インポートの変更はありません', + confirmImport: 'インポートの確認', + created: '作成', + updated: '更新', + reactivated: '再有効化', + unchanged: '変更なし', + conflicts: '競合', + missing: '欠落', + missingUsersConfirm: 'LDAP に存在しない {0} 人のユーザーを無効化し、セッションを終了します。続行しますか?', + strictSyncConfirm: '厳密な同期を確認する', + status: { + importable: '新規ユーザー', + update_available: '利用可能なアップデート', + up_to_date: '最新の状態', + conflict: '競合', + }, + fields: { + name: 'ユーザー名', + externalDN: 'ディレクトリ DN', + externalID: '外部ID', + authSourceStatus: '認証状態', + }, + actions: { + created: '作成', + updated: '更新', + reactivated: '再有効化', + unchanged: '変更なし', + skipped: 'スキップされました', + conflicts: '競合', + conflict: '競合', + missing: '無効にする', + errors: 'エラー', + error: 'エラー', + }, + }, expiresEnterpriseAlert: 'ご注意: あなたのEnterprise Editionライセンスは{0}日後に終了し、すべてのEnterprise Edition機能が使用できなくなります。継続的な使用のために速やかに更新してください。', expiresProAlert: @@ -4792,6 +4856,219 @@ const message = { masterOnlyPermissionHelper: 'この権限はマスターノードでのみ有効です。', view: '表示', manage: '管理', + authManage: '認証管理', + auth: { + providerNavigation: '認証プロバイダー', + providers: { + ldap: 'AD/LDAP', + passkey: 'Passkey', + radius: 'Radius', + oidc: 'OIDC', + saml2: 'SAML2', + cas: 'CAS', + oauth2: 'OAuth2', + dingtalk: 'DingTalk', + feishu: 'Feishu', + wecom: 'WeCom', + }, + providerDescriptions: { + ldap: 'Active Directory、OpenLDAP、およびその他の LDAP サービスと互換性があります', + passkey: 'パスワードなしのサインインにデバイス資格情報を使用する', + radius: 'Radius サービスを介したネットワーク アクセスの認証', + oidc: 'OpenID Connect を使用してエンタープライズ シングル サインオンを接続する', + saml2: 'エンタープライズ ID フェデレーションに SAML2 を使用する', + cas: 'シングル サインオンのための集中認証サービスに接続する', + oauth2: '互換性のある OAuth2 ID サービスに接続する', + dingtalk: 'DingTalk 組織 ID と QR サインインを使用する', + feishu: 'Feishu 組織 ID とアカウント同期を使用する', + wecom: 'WeCom メンバー ID で認証する', + }, + planned: '計画済み', + plannedTitle: '{0} 認証設定', + plannedDesc: 'この認証プロバイダーは計画されており、まだ利用できません。', + ldap: { + enable: '有効にする', + enabled: '有効', + disabled: '無効', + connection: '基本接続', + connectionDesc: 'ユーザーの検索に使用するディレクトリ サービスとバインド アカウントを構成します。', + serverURL: 'サーバーURL', + serverURLHelper: 'ldap:// および ldaps:// URL をサポートします。', + userBaseDN: 'ユーザー Base DN', + userBaseDNHelper: + 'LDAP ユーザー検索のために DN を開始します。 OU、CN、またはドメイン ルート DN にすることができます。', + bindDN: 'バインド DN', + bindPassword: 'パスワード', + passwordSaved: '保存したパスワードを保持するには空白のままにしてください', + userSearch: 'ユーザー検索', + userSearchDesc: + 'ユーザー検索ベースとフィルターを設定し、1Panel name として使用される LDAP 属性をマップします。', + userFilter: 'ユーザーフィルター', + userFilterTooltip: + '%(user)s をエスケープされたユーザー名に置き換えるか、ディレクトリ全体を読み取る場合は * に置き換えます。', + userFilterHelper: 'ユーザー名は、LDAP フィルターに挿入される前にエスケープされます。', + attributeMap: '属性マッピング', + attributeMapTooltip: '1Panel name フィールドから LDAP 属性への JSON マッピング。', + attributeMapHelper: '1Panel name フィールドにマップされる LDAP 属性を設定します。', + advanced: '詳細設定', + advancedDesc: 'TLS および LDAP クエリ ページングを構成します。', + strictSync: '厳密な同期', + strictSyncTooltip: + '完全なインポートが完了すると、この LDAP ソースから欠落しているユーザーは無効になりますが、削除されません。', + strictSyncHelper: + '完全な全件インポートにのみ適用されます。選択したユーザーのインポートでは、他のユーザーは無効化されません。', + skipTLSVerify: 'TLS検証をスキップする', + skipTLSVerifyTooltip: 'LDAPS 接続の証明書検証を無効にします。', + skipTLSVerifyHelper: + '信頼できる自己署名証明書のみを使用してください。この設定は厳密な同期とは独立しています。', + connectTimeout: '接続タイムアウト (秒)', + searchPageSize: 'LDAP クエリ ページ サイズ', + restore: '復元', + testConnection: '接続テスト', + testLogin: 'ログインテスト', + userImport: 'ユーザーをインポートする', + saveBeforeImport: 'ユーザーをインポートする前に、現在の AD/LDAP 設定を保存します。', + format: 'フォーマット', + restoreExample: '復元の例', + mappingValid: '有効なJSON; name が設定されています。', + mappingInvalid: '有効な JSON を入力してください。', + mappingObject: '属性マッピングは JSON オブジェクトである必要があります。', + mappingOnlyName: 'name マッピングのみがサポートされます。', + mappingStringValues: 'マッピングされたすべての属性は文字列である必要があります。', + mappingNameRequired: 'name は空ではない文字列である必要があります。', + restored: '最後に保存された設定が復元されました。', + connectionTestSuccess: 'LDAP 接続テストに成功しました。', + recentTestSuccess: '最後のテストが成功しました: {0}', + recentTestFailed: '最後のテストが失敗しました: {0}', + serverURLRequired: 'LDAP サーバーの URL を入力します。', + serverURLInvalid: '有効な ldap:// または ldaps:// URL を使用してください。', + userBaseDNRequired: 'ユーザー Base DN を入力します。', + bindDNRequired: 'バインド DN を入力してください。', + passwordRequired: 'パスワードを入力します。', + userFilterRequired: 'ユーザーフィルターを入力します。', + connectTimeoutRequired: '接続タイムアウトを入力します。', + searchPageSizeRequired: 'LDAP クエリのページ サイズを入力します。', + sync: { + title: 'スケジュールされた同期', + description: + 'スケジュールに従って完全な LDAP ディレクトリを読み取り、インポートされた LDAP ユーザーを 1Panel に維持します。', + enable: 'スケジュールを有効にする', + enableHelper: '無効にすると、自動実行が停止します。手動同期は引き続き利用可能です。', + schedule: 'スケジュール', + daily: '毎日', + weekly: '毎週', + customCron: 'カスタムCron', + preview: 'プレビュー', + previewTitle: '次の 5 回の実行', + previewEmpty: '利用可能な実行時間がありません', + cronHelper: '標準の 5 フィールド Cron 式 (分、時、日、月、曜日) を使用します。', + autoImport: '新しいユーザーをインポートする', + autoImportHelper: + '無効にすると、インポートされた LDAP ユーザーのディレクトリ識別子とステータスのみが維持されます。新しいユーザーは作成されません。', + defaultRole: '新しいユーザーの役割', + defaultRolePlaceholder: '役割を選択してください', + defaultRoleHelper: 'スケジュールされた同期によって作成されたユーザーにのみ適用されます。', + defaultRoleRequired: '新しい LDAP ユーザーのロールを選択します。', + strictSyncHelper: + '完全な全件クエリで見つからないユーザーは無効化され、セッションが終了します。ユーザー、ロール、権限は削除されません。', + safetyTitle: 'LDAP の全件クエリが正常に完了した場合のみ、欠落ユーザーを処理します。', + safetyDescription: + 'クエリの失敗、タイムアウト、または不完全なページング結果によっても、ユーザーのステータスは変更されません。同期スコープは、ユーザー Base DN、フィルター、および属性マッピングに従います。', + runNow: '今すぐ同期する', + lastRunSuccess: '最後に成功した同期: {0}', + lastRunFailed: '前回の同期失敗: {0}', + lastRunRunning: '同期が開始されました: {0}', + sourceDisabled: '同期を実行する前に、AD/LDAP を有効にして保存します。', + cronRequired: 'Cron 式を入力します。', + saveBeforeRun: 'タスクを実行する前に同期設定を保存します。', + runConfirmTitle: '厳密な同期を実行する', + runConfirmDescription: + 'LDAP の全件クエリで見つからないユーザーを無効化し、アクティブなセッションを終了します。続行しますか?', + runSuccess: 'LDAP の同期が完了しました。', + weekdays: { + 0: '日曜日', + 1: '月曜日', + 2: '火曜日', + 3: '水曜日', + 4: '木曜日', + 5: '金曜日', + 6: '土曜日', + }, + }, + syncLogs: { + title: 'ログを同期する', + description: 'スケジュールされたおよび手動の LDAP 同期結果を確認します。', + startedAt: '開始時間', + trigger: '実行方式', + manual: '手動', + scheduled: '予定されている', + success: '成功', + failed: '失敗しました', + running: '実行中', + result: '結果', + resultSummary: '作成 {0}、更新 {1}、欠落 {2}', + duration: '所要時間', + action: 'アクション', + }, + testLoginTitle: 'AD/LDAP ログインテスト', + testLoginDesc: + '認証のみをテストするために、AD/LDAP ユーザー資格情報をバインドします。 1Panel セッションは作成されません。', + ldapUsername: 'LDAP ユーザー名', + usernameRequired: 'LDAP ユーザー名を入力します。', + startTest: 'テストの開始', + testLoginSuccess: '認証に成功しました。', + testLoginSuccessWithDN: '認証に成功しました。ユーザー DN: {0}', + import: { + title: 'AD/LDAP ユーザーをインポート', + source: 'データソース: AD/LDAP ディレクトリ', + lastRead: '最終読み取り: {0}', + cacheHit: 'キャッシュされた結果', + keywordPlaceholder: 'ユーザー名を検索', + search: '検索', + refresh: 'LDAP から読み取る', + refreshTip: '短期キャッシュを無視して、LDAP ディレクトリを再度読み取ります。', + loadFailed: 'LDAP ディレクトリの読み取りに失敗しました。', + retry: '再試行', + noData: 'ディレクトリ ユーザーが見つかりません。', + username: 'ユーザー名', + status: 'ステータス', + changes: '変更点', + noChanges: '変更なし', + importable: 'インポートの準備ができました', + updateAvailable: '利用可能なアップデート', + upToDate: '最新の状態', + conflict: '名前の競合', + selectedCount: '{0} が選択されました', + totalCount: '{0} 人のユーザー', + newUserRole: '新しいユーザーの役割', + newUserRoleRequired: '新しいユーザーの役割を選択します。', + noNewUsers: 'この操作には新規ユーザーはいません。', + roleOnlyForNewUsers: '選択したロールは、新しく作成されたユーザーにのみ適用されます。', + strictOff: '厳密な同期は無効になっています。完全インポートではユーザーは無効になりません。', + importSelected: '選択されたインポート/更新 ({0})', + importAll: 'すべてインポート/更新 ({0})', + previewTitle: '完全なインポートを確認する', + previewDesc: + '完全な LDAP ディレクトリが読み取られました。検索キーワードによる制限はありません。', + created: '作成', + updated: 'アップデート', + unchanged: '変わらない', + conflicts: '紛争', + missing: '無効にする', + reactivated: '再アクティブ化', + strictWarning: + '厳密な同期が有効になっています。 LDAP にいないユーザーはサインインできませんが、レコード、ロール、権限は保持されます。', + missingUsers: 'LDAP からユーザーが欠落しています', + missingScope: 'この LDAP ソースのみが影響を受けます。', + willDisable: '無効になります', + confirmAll: 'インポートの確認', + confirmAllWithMissing: 'インポートを確認し、{0} 人のユーザーを無効化する', + executeSuccess: 'LDAP ユーザーは正常に処理されました。', + queryExpired: 'ディレクトリ結果の有効期限が切れました。再び LDAP から読み取ります。', + planIncomplete: 'ディレクトリ全体の読み取りは不完全であるため、実行できません。', + }, + }, + }, }, app: { app: 'APP', diff --git a/frontend/src/lang/modules/ko.ts b/frontend/src/lang/modules/ko.ts index dd0372c95..aae78e8d3 100644 --- a/frontend/src/lang/modules/ko.ts +++ b/frontend/src/lang/modules/ko.ts @@ -4148,6 +4148,70 @@ const message = { noFail: '마운트 실패는 시스템 시작에 영향을 미치지 않습니다', }, xpack: { + ldap: { + source: '소스', + directoryMissing: 'LDAP에 없음', + localCredentialsManaged: + '이 사용자의 사용자 이름과 비밀번호는 LDAP에서 관리되므로 로컬에서 변경할 수 없습니다.', + sources: { + local: '로컬', + ldap: 'LDAP', + }, + importUsers: 'AD/LDAP 사용자 가져오기', + searchUsersPlaceholder: '사용자 이름 검색', + readFromLDAP: 'LDAP에서 읽기', + selectedUsers: '{0} 선택됨', + queriedAt: '읽기 시간', + cachedResult: '캐시된 결과', + roleForNewUsers: '신규 사용자의 역할', + selectRole: '역할 선택', + roleOnlyForNewUsers: '가져오기를 통해 사용자가 생성되는 경우에만 역할이 필요합니다.', + roleRequiredForNewUsers: '새로운 LDAP 사용자의 역할을 선택합니다.', + changedFields: '변경된 필드', + importSelected: '선택 항목 가져오기', + importAll: '모두 가져오기', + importPreview: 'AD/LDAP 가져오기 미리보기', + importCompleted: 'AD/LDAP 가져오기 완료', + incompletePreview: 'LDAP 디렉터리 읽기가 완료되지 않았습니다. LDAP에서 다시 읽어보세요.', + missingUsersWarning: 'LDAP에서 누락된 사용자는 엄격한 동기화로 인해 비활성화됩니다.', + missingUsersWarningDetail: '{0} 로컬 LDAP 사용자는 더 이상 로그인할 수 없습니다.', + action: '액션', + reason: '이유', + noImportChanges: '가져오기 변경사항 없음', + confirmImport: '가져오기 확인', + created: '만들기', + updated: '업데이트', + reactivated: '재활성화', + unchanged: '변경되지 않음', + conflicts: '충돌', + missing: '누락', + missingUsersConfirm: 'LDAP에서 누락된 {0}명의 사용자를 비활성화하고 로그아웃합니다. 계속하시겠습니까?', + strictSyncConfirm: '엄격한 동기화 확인', + status: { + importable: '신규 사용자', + update_available: '업데이트 가능', + up_to_date: '최신', + conflict: '충돌', + }, + fields: { + name: '사용자 이름', + externalDN: '디렉토리 DN', + externalID: '외부 ID', + authSourceStatus: '인증 상태', + }, + actions: { + created: '만들기', + updated: '업데이트', + reactivated: '재활성화', + unchanged: '변경되지 않음', + skipped: '건너뛰었습니다.', + conflicts: '충돌', + conflict: '충돌', + missing: '비활성화', + errors: '오류', + error: '오류', + }, + }, expiresEnterpriseAlert: '친절한 알림: 귀하의 Enterprise Edition 라이선스가 {0}일 후 만료되며, 모든 Enterprise Edition 기능에 더 이상 접근할 수 없습니다. 지속적인 사용을 위해 신속하게 갱신하시기 바랍니다.', expiresProAlert: @@ -4699,6 +4763,217 @@ const message = { masterOnlyPermissionHelper: '이 권한은 마스터 노드에서만 적용됩니다.', view: '보기', manage: '관리', + authManage: '인증 관리', + auth: { + providerNavigation: '인증 공급자', + providers: { + ldap: 'AD/LDAP', + passkey: 'Passkey', + radius: 'Radius', + oidc: 'OIDC', + saml2: 'SAML2', + cas: 'CAS', + oauth2: 'OAuth2', + dingtalk: 'DingTalk', + feishu: 'Feishu', + wecom: 'WeCom', + }, + providerDescriptions: { + ldap: 'Active Directory, OpenLDAP 및 기타 LDAP 서비스와 호환 가능', + passkey: '비밀번호 없는 로그인을 위해 장치 자격 증명 사용', + radius: 'Radius 서비스를 통해 네트워크 액세스 인증', + oidc: 'OpenID Connect로 엔터프라이즈 Single Sign-On 연결', + saml2: '기업 ID 연동을 위해 SAML2 사용', + cas: 'Single Sign-On을 위한 중앙 집중식 인증 서비스 연결', + oauth2: '호환 가능한 OAuth2 ID 서비스 연결', + dingtalk: 'DingTalk 조직 ID 및 QR 로그인 사용', + feishu: 'Feishu 조직 ID 및 계정 동기화 사용', + wecom: 'WeCom 회원 본인 인증', + }, + planned: '예정', + plannedTitle: '{0} 인증 설정', + plannedDesc: '이 인증 공급자는 계획되어 있으며 아직 사용할 수 없습니다.', + ldap: { + enable: '활성화', + enabled: '활성화됨', + disabled: '비활성화됨', + connection: '기본 연결', + connectionDesc: '사용자 검색에 사용되는 디렉터리 서비스와 바인딩 계정을 구성합니다.', + serverURL: '서버 URL', + serverURLHelper: 'ldap:// 및 ldaps:// URL을 지원합니다.', + userBaseDN: '사용자 Base DN', + userBaseDNHelper: 'LDAP 사용자 검색을 위해 DN 시작 OU, CN 또는 도메인 루트 DN일 수 있습니다.', + bindDN: 'DN 바인딩', + bindPassword: '비밀번호', + passwordSaved: '저장된 비밀번호를 유지하려면 비워두세요.', + userSearch: '사용자 검색', + userSearchDesc: + '사용자 검색 기반 및 필터를 설정한 다음 1Panel name로 사용되는 LDAP 속성을 매핑합니다.', + userFilter: '사용자 필터', + userFilterTooltip: + '%(user)s를 이스케이프된 사용자 이름으로 바꾸거나 전체 디렉터리 읽기를 위해 *로 바꿉니다.', + userFilterHelper: '사용자 이름은 LDAP 필터에 삽입되기 전에 이스케이프됩니다.', + attributeMap: '속성 매핑', + attributeMapTooltip: '1Panel name 필드에서 LDAP 속성으로 매핑되는 JSON.', + attributeMapHelper: '1Panel name 필드에 매핑된 LDAP 속성을 설정합니다.', + advanced: '고급 설정', + advancedDesc: 'TLS 및 LDAP 쿼리 페이징을 구성합니다.', + strictSync: '엄격한 동기화', + strictSyncTooltip: + '전체 가져오기가 완료된 후 이 LDAP 소스에서 누락된 사용자는 비활성화되지만 삭제되지는 않습니다.', + strictSyncHelper: + '완전한 전체 가져오기에만 적용됩니다. 선택한 사용자를 가져와도 다른 사용자는 비활성화되지 않습니다.', + skipTLSVerify: 'TLS 확인 건너뛰기', + skipTLSVerifyTooltip: 'LDAPS 연결에 대한 인증서 확인을 비활성화합니다.', + skipTLSVerifyHelper: + '신뢰할 수 있는 자체 서명된 인증서에만 사용하세요. 이 설정은 엄격한 동기화와 무관합니다.', + connectTimeout: '연결 시간 초과(초)', + searchPageSize: 'LDAP 쿼리 페이지 크기', + restore: '복원', + testConnection: '연결 테스트', + testLogin: '로그인 테스트', + userImport: '사용자 가져오기', + saveBeforeImport: '사용자를 가져오기 전에 현재 AD/LDAP 설정을 저장하십시오.', + format: '형식', + restoreExample: '복원 예시', + mappingValid: '유효한 JSON; name가 구성되었습니다.', + mappingInvalid: '유효한 JSON를 입력하세요.', + mappingObject: '속성 매핑은 JSON 개체여야 합니다.', + mappingOnlyName: 'name 매핑만 지원됩니다.', + mappingStringValues: '매핑된 모든 속성은 문자열이어야 합니다.', + mappingNameRequired: 'name는 비어 있지 않은 문자열이어야 합니다.', + restored: '마지막으로 저장된 설정이 복원되었습니다.', + connectionTestSuccess: 'LDAP 연결 테스트에 성공했습니다.', + recentTestSuccess: '마지막 테스트 성공: {0}', + recentTestFailed: '마지막 테스트 실패: {0}', + serverURLRequired: 'LDAP 서버 URL을 입력하세요.', + serverURLInvalid: '유효한 ldap:// 또는 ldaps:// URL을 사용하세요.', + userBaseDNRequired: '사용자 Base DN를 입력합니다.', + bindDNRequired: '바인딩 DN를 입력합니다.', + passwordRequired: '비밀번호를 입력하세요.', + userFilterRequired: '사용자 필터를 입력하세요.', + connectTimeoutRequired: '연결 시간 초과를 입력합니다.', + searchPageSizeRequired: 'LDAP 쿼리 페이지 크기를 입력합니다.', + sync: { + title: '예약된 동기화', + description: '일정에 따라 전체 LDAP 디렉터리를 읽고 가져온 LDAP 사용자를 1Panel에 유지합니다.', + enable: '일정 활성화', + enableHelper: '비활성화되면 자동 실행이 중지됩니다. 수동 동기화는 계속 사용할 수 있습니다.', + schedule: '일정', + daily: '매일', + weekly: '주간', + customCron: '커스텀 Cron', + preview: '미리보기', + previewTitle: '다음 5회 실행', + previewEmpty: '사용 가능한 실행 시간이 없습니다.', + cronHelper: '표준 5개 필드 Cron 표현식(분, 시, 일, 월, 요일)을 사용합니다.', + autoImport: '새 사용자 가져오기', + autoImportHelper: + '비활성화되면 가져온 LDAP 사용자에 대해 디렉터리 식별자와 상태만 유지됩니다. 새로운 사용자가 생성되지 않습니다.', + defaultRole: '새로운 사용자 역할', + defaultRolePlaceholder: '역할 선택', + defaultRoleHelper: '예약된 동기화로 생성된 사용자에게만 적용됩니다.', + defaultRoleRequired: '새로운 LDAP 사용자의 역할을 선택합니다.', + strictSyncHelper: + '완전한 전체 쿼리에서 누락된 사용자는 비활성화되고 해당 세션이 지워집니다. 사용자, 역할 및 권한은 삭제되지 않습니다.', + safetyTitle: '누락된 사용자는 완전한 LDAP 전체 쿼리 후에만 처리됩니다.', + safetyDescription: + '실패한 쿼리, 시간 초과 또는 불완전한 페이징 결과는 사용자 상태를 변경하지 않습니다. 동기화 범위는 사용자 Base DN, 필터 및 특성 매핑을 따릅니다.', + runNow: '지금 동기화', + lastRunSuccess: '마지막 동기화 성공: {0}', + lastRunFailed: '마지막 동기화 실패: {0}', + lastRunRunning: '동기화 시작됨: {0}', + sourceDisabled: '동기화를 실행하기 전에 AD/LDAP를 활성화하고 저장하세요.', + cronRequired: 'Cron 표현식을 입력하세요.', + saveBeforeRun: '작업을 실행하기 전에 동기화 설정을 저장하십시오.', + runConfirmTitle: '엄격한 동기화 실행', + runConfirmDescription: + '완전한 전체 쿼리에서 누락된 LDAP 사용자를 비활성화하고 활성 세션을 종료합니다. 계속하시겠습니까?', + runSuccess: 'LDAP 동기화가 완료되었습니다.', + weekdays: { + 0: '일요일', + 1: '월요일', + 2: '화요일', + 3: '수요일', + 4: '목요일', + 5: '금요일', + 6: '토요일', + }, + }, + syncLogs: { + title: '동기화 로그', + description: '예약된 및 수동 LDAP 동기화 결과를 검토합니다.', + startedAt: '시작 시간', + trigger: '실행 방식', + manual: '수동', + scheduled: '예정됨', + success: '성공', + failed: '실패', + running: '실행 중', + result: '결과', + resultSummary: '{0} 생성, {1} 업데이트, {2} 누락', + duration: '기간', + action: '액션', + }, + testLoginTitle: 'AD/LDAP 로그인 테스트', + testLoginDesc: + '인증을 테스트하기 위해 AD/LDAP 사용자 자격 증명으로 바인딩합니다. 1Panel 세션이 생성되지 않습니다.', + ldapUsername: 'LDAP 사용자 이름', + usernameRequired: 'LDAP 사용자 이름을 입력하세요.', + startTest: '테스트 시작', + testLoginSuccess: '인증에 성공했습니다.', + testLoginSuccessWithDN: '인증에 성공했습니다. 사용자 DN: {0}', + import: { + title: 'AD/LDAP 사용자 가져오기', + source: '데이터 소스: AD/LDAP 디렉토리', + lastRead: '마지막으로 읽은 날짜: {0}', + cacheHit: '캐시된 결과', + keywordPlaceholder: '사용자 이름 검색', + search: '검색', + refresh: 'LDAP에서 읽기', + refreshTip: '단기 캐시를 무시하고 LDAP 디렉토리를 다시 읽으십시오.', + loadFailed: 'LDAP 디렉터리를 읽지 못했습니다.', + retry: '재시도', + noData: '디렉터리 사용자를 찾을 수 없습니다.', + username: '사용자 이름', + status: '상태', + changes: '변경 사항', + noChanges: '변경사항 없음', + importable: '가져올 준비가 되었습니다.', + updateAvailable: '업데이트 가능', + upToDate: '최신', + conflict: '이름 충돌', + selectedCount: '{0} 선택됨', + totalCount: '{0}명', + newUserRole: '새로운 사용자 역할', + newUserRoleRequired: '새 사용자의 역할을 선택합니다.', + noNewUsers: '이 작업에는 새로운 사용자가 없습니다.', + roleOnlyForNewUsers: '선택한 역할은 새로 생성된 사용자에게만 적용됩니다.', + strictOff: + '엄격한 동기화가 비활성화되었습니다. 전체 가져오기는 사용자를 비활성화하지 않습니다.', + importSelected: '가져오기/업데이트 선택됨({0})', + importAll: '모두 가져오기/업데이트({0})', + previewTitle: '전체 가져오기 확인', + previewDesc: '전체 LDAP 디렉토리를 읽었습니다. 검색 키워드는 이 작업을 제한하지 않습니다.', + created: '만들기', + updated: '업데이트', + unchanged: '변경되지 않음', + conflicts: '충돌', + missing: '비활성화', + reactivated: '재활성화', + strictWarning: + '엄격한 동기화가 활성화되었습니다. LDAP에서 누락된 사용자는 로그인할 수 없지만 해당 기록, 역할 및 권한은 유지됩니다.', + missingUsers: 'LDAP에서 누락된 사용자', + missingScope: '이 LDAP 소스만 영향을 받습니다.', + willDisable: '비활성화됩니다', + confirmAll: '가져오기 확인', + confirmAllWithMissing: '가져오기를 확인하고 {0}명의 사용자 비활성화', + executeSuccess: 'LDAP 사용자가 성공적으로 처리되었습니다.', + queryExpired: '디렉터리 결과가 만료되었습니다. LDAP에서 다시 읽어보세요.', + planIncomplete: '전체 디렉터리 읽기가 불완전하여 실행할 수 없습니다.', + }, + }, + }, }, app: { app: 'APP', diff --git a/frontend/src/lang/modules/lo.ts b/frontend/src/lang/modules/lo.ts index 8f68180e4..a475b41dc 100644 --- a/frontend/src/lang/modules/lo.ts +++ b/frontend/src/lang/modules/lo.ts @@ -4112,6 +4112,69 @@ const message = { noFail: 'ຄວາມລົ້ມເຫຼວໃນການ Mount ຈະບໍ່ມີຜົນຕໍ່ການເລີ່ມຕົ້ນລະບົບ', }, xpack: { + ldap: { + source: 'ທີ່ມາ', + directoryMissing: 'ບໍ່ພົບໃນ LDAP', + localCredentialsManaged: 'ຊື່ຜູ້ໃຊ້ ແລະລະຫັດຜ່ານຖືກຈັດການໂດຍ LDAP ແລະບໍ່ສາມາດປ່ຽນຢູ່ໃນທ້ອງຖິ່ນໄດ້.', + sources: { + local: 'ທ້ອງຖິ່ນ', + ldap: 'LDAP', + }, + importUsers: 'ນໍາເຂົ້າຜູ້ໃຊ້ AD/LDAP', + searchUsersPlaceholder: 'ຊອກຫາຊື່ຜູ້ໃຊ້', + readFromLDAP: 'ອ່ານຈາກ LDAP', + selectedUsers: 'ເລືອກ {0} ແລ້ວ', + queriedAt: 'ເວລາອ່ານ', + cachedResult: 'ຜົນໄດ້ຮັບຈາກຖານຄວາມຈໍາ', + roleForNewUsers: 'ບົດບາດສໍາລັບຜູ້ໃຊ້ໃຫມ່', + selectRole: 'ເລືອກບົດບາດ', + roleOnlyForNewUsers: 'ພາລະບົດບາດແມ່ນຕ້ອງການພຽງແຕ່ໃນເວລາທີ່ການນໍາເຂົ້າສ້າງຜູ້ໃຊ້.', + roleRequiredForNewUsers: 'ເລືອກບົດບາດສຳລັບຜູ້ໃຊ້ LDAP ໃໝ່.', + changedFields: 'ຊ່ອງຂໍ້ມູນທີ່ມີການປ່ຽນແປງ', + importSelected: 'ເລືອກການນໍາເຂົ້າ', + importAll: 'ນຳເຂົ້າທັງໝົດ', + importPreview: 'ຕົວຢ່າງການນໍາເຂົ້າ AD/LDAP', + importCompleted: 'ການນໍາເຂົ້າ AD/LDAP ສໍາເລັດ', + incompletePreview: 'ໄດເຣັກທໍຣີ LDAP ອ່ານບໍ່ຄົບຖ້ວນ. ອ່ານຈາກ LDAP ອີກເທື່ອຫນຶ່ງ.', + missingUsersWarning: 'ຜູ້ໃຊ້ທີ່ຂາດຫາຍໄປຈາກ LDAP ຈະຖືກປິດໃຊ້ງານໂດຍການຊິ້ງຂໍ້ມູນຢ່າງເຂັ້ມງວດ.', + missingUsersWarningDetail: 'ຜູ້ໃຊ້ LDAP ທ້ອງຖິ່ນ {0} ຄົນຈະບໍ່ສາມາດເຂົ້າລະບົບໄດ້.', + action: 'ການປະຕິບັດ', + reason: 'ເຫດຜົນ', + noImportChanges: 'ບໍ່ມີການປ່ຽນແປງການນໍາເຂົ້າ', + confirmImport: 'ຢືນຢັນການນໍາເຂົ້າ', + created: 'ສ້າງ', + updated: 'ອັບເດດ', + reactivated: 'ເປີດໃຊ້ຄືນໃໝ່', + unchanged: 'ບໍ່ປ່ຽນແປງ', + conflicts: 'ຂໍ້ຂັດແຍ່ງ', + missing: 'ຫາຍໄປ', + missingUsersConfirm: 'ຜູ້ໃຊ້ {0} ຫາຍໄປຈາກ LDAP ຈະຖືກປິດການນຳໃຊ້ ແລະອອກຈາກລະບົບ. ສືບຕໍ່?', + strictSyncConfirm: 'ຢືນຢັນການ synchronization ທີ່ເຄັ່ງຄັດ', + status: { + importable: 'ຜູ້ໃຊ້ໃຫມ່', + update_available: 'ມີອັບເດດ', + up_to_date: 'ເຖິງວັນທີ', + conflict: 'ການຂັດແຍ້ງ', + }, + fields: { + name: 'ຊື່ຜູ້ໃຊ້', + externalDN: 'ໄດເລກະທໍລີ DN', + externalID: 'ID ພາຍນອກ', + authSourceStatus: 'ສະຖານະການກວດສອບ', + }, + actions: { + created: 'ສ້າງ', + updated: 'ອັບເດດ', + reactivated: 'ເປີດໃຊ້ຄືນໃໝ່', + unchanged: 'ບໍ່ປ່ຽນແປງ', + skipped: 'ຂ້າມ', + conflicts: 'ການຂັດແຍ້ງ', + conflict: 'ການຂັດແຍ້ງ', + missing: 'ປິດໃຊ້ງານ', + errors: 'ຜິດພາດ', + error: 'ຜິດພາດ', + }, + }, expiresEnterpriseAlert: 'ຄຳເຕືອນ: ໃບອະນຸຍາດເວີຊັນ Enterprise ຂອງທ່ານຈະໝົດອາຍຸໃນອີກ {0} ວັນ, ຟີເຈີທັງໝົດຂອງເວີຊັນ Enterprise ຈະບໍ່ສາມາດໃຊ້ໄດ້. ກະລຸນາຕໍ່ອາຍຸໃຫ້ທັນເວລາ.', expiresProAlert: @@ -4664,6 +4727,218 @@ const message = { masterOnlyPermissionHelper: 'ສິດນີ້ມີຜົນສະເພາະຢູ່ໃນໂນດຫຼັກເທົ່ານັ້ນ.', view: 'ເບິ່ງ', manage: 'ຈັດການ', + authManage: 'ການຢືນຢັນ', + auth: { + providerNavigation: 'ຜູ້ໃຫ້ບໍລິການຢັ້ງຢືນ', + providers: { + ldap: 'AD/LDAP', + passkey: 'Passkey', + radius: 'Radius', + oidc: 'OIDC', + saml2: 'SAML2', + cas: 'CAS', + oauth2: 'OAuth2', + dingtalk: 'DingTalk', + feishu: 'Feishu', + wecom: 'WeCom', + }, + providerDescriptions: { + ldap: 'ເຂົ້າກັນໄດ້ກັບ Active Directory, OpenLDAP, ແລະບໍລິການ LDAP ອື່ນໆ', + passkey: 'ໃຊ້ຂໍ້ມູນປະຈຳຕົວຂອງອຸປະກອນສຳລັບການເຂົ້າສູ່ລະບົບແບບບໍ່ມີລະຫັດຜ່ານ', + radius: 'ກວດສອບການເຂົ້າເຖິງເຄືອຂ່າຍຜ່ານບໍລິການ Radius', + oidc: 'ເຊື່ອມຕໍ່ວິສາຫະກິດດຽວເຂົ້າສູ່ລະບົບດ້ວຍ OpenID Connect', + saml2: 'ໃຊ້ SAML2 ສໍາລັບສະຫະພັນເອກກະລັກວິສາຫະກິດ', + cas: 'ເຊື່ອມຕໍ່ການບໍລິການການພິສູດຢືນຢັນແບບສູນກາງສໍາລັບການເຂົ້າສູ່ລະບົບດຽວ', + oauth2: 'ເຊື່ອມຕໍ່ການບໍລິການຕົວຕົນ OAuth2 ທີ່ເຂົ້າກັນໄດ້', + dingtalk: 'ໃຊ້ຕົວຕົນຂອງອົງການ DingTalk ແລະການເຂົ້າສູ່ລະບົບ QR', + feishu: 'ໃຊ້ຕົວຕົນຂອງອົງການ Feishu ແລະ synchronization ບັນຊີ', + wecom: 'ພິສູດຢືນຢັນຕົວຕົນຂອງສະມາຊິກ WeCom', + }, + planned: 'ວາງແຜນ', + plannedTitle: 'ການຕັ້ງຄ່າການພິສູດຢືນຢັນ {0}', + plannedDesc: 'ຜູ້ໃຫ້ບໍລິການການພິສູດຢືນຢັນນີ້ຖືກວາງແຜນໄວ້ ແລະຍັງບໍ່ສາມາດໃຊ້ໄດ້ເທື່ອ.', + ldap: { + enable: 'ເປີດໃຊ້', + enabled: 'ເປີດໃຊ້ແລ້ວ', + disabled: 'ປິດໃຊ້ງານ', + connection: 'ການເຊື່ອມຕໍ່ພື້ນຖານ', + connectionDesc: 'ຕັ້ງຄ່າບໍລິການໄດເລກະທໍລີ ແລະບັນຊີຜູກມັດທີ່ໃຊ້ເພື່ອຊອກຫາຜູ້ໃຊ້.', + serverURL: 'URL ເຊີບເວີ', + serverURLHelper: 'ຮອງຮັບ ldap:// ແລະ ldaps:// URLs.', + userBaseDN: 'ຜູ້ໃຊ້ Base DN', + userBaseDNHelper: + 'ເລີ່ມຕົ້ນ DN ສໍາລັບການຄົ້ນຫາຂອງຜູ້ໃຊ້ LDAP; ມັນສາມາດເປັນ OU, CN, ຫຼືຮາກໂດເມນ DN.', + bindDN: 'ຜູກມັດ DN', + bindPassword: 'ລະຫັດຜ່ານ', + passwordSaved: 'ປ່ອຍຫວ່າງໄວ້ເພື່ອຮັກສາລະຫັດຜ່ານທີ່ບັນທຶກໄວ້', + userSearch: 'ຄົ້ນຫາຜູ້ໃຊ້', + userSearchDesc: + 'ກໍານົດຖານຄົ້ນຫາຂອງຜູ້ໃຊ້ແລະການກັ່ນຕອງ, ຫຼັງຈາກນັ້ນສ້າງແຜນທີ່ຄຸນລັກສະນະ LDAP ທີ່ໃຊ້ເປັນ 1Panel name.', + userFilter: 'ຕົວກອງຜູ້ໃຊ້', + userFilterTooltip: 'ແທນທີ່ %(user)s ດ້ວຍຊື່ຜູ້ໃຊ້ທີ່ໜີໄປ, ຫຼືດ້ວຍ * ສໍາລັບການອ່ານໄດເລກະທໍລີເຕັມ.', + userFilterHelper: 'ຊື່ຜູ້ໃຊ້ຖືກຫລົບຫນີກ່ອນທີ່ພວກມັນຈະຖືກໃສ່ເຂົ້າໄປໃນຕົວກອງ LDAP.', + attributeMap: 'ການສ້າງແຜນທີ່ຄຸນສົມບັດ', + attributeMapTooltip: 'ການສ້າງແຜນທີ່ JSON ຈາກຊ່ອງຂໍ້ມູນ 1Panel name ໄປຫາຄຸນສົມບັດ LDAP.', + attributeMapHelper: 'ຕັ້ງຄຸນສົມບັດ LDAP ແຜນທີ່ໃສ່ກັບຊ່ອງຂໍ້ມູນ 1Panel name.', + advanced: 'ການຕັ້ງຄ່າຂັ້ນສູງ', + advancedDesc: 'ຕັ້ງຄ່າ TLS ແລະ LDAP query paging.', + strictSync: 'synchronization ຢ່າງເຂັ້ມງວດ', + strictSyncTooltip: + 'ຫຼັງຈາກການນໍາເຂົ້າຄົບຖ້ວນສົມບູນ, ຜູ້ໃຊ້ທີ່ຂາດຫາຍໄປຈາກແຫຼ່ງ LDAP ນີ້ຖືກປິດໃຊ້ງານແຕ່ບໍ່ໄດ້ຖືກລຶບຖິ້ມ.', + strictSyncHelper: + 'ນຳໃຊ້ກັບການນຳເຂົ້າເຕັມຮູບແບບເທົ່ານັ້ນ. ການນໍາເຂົ້າຜູ້ໃຊ້ທີ່ເລືອກບໍ່ເຄີຍປິດຜູ້ໃຊ້ອື່ນ.', + skipTLSVerify: 'ຂ້າມການຢັ້ງຢືນ TLS', + skipTLSVerifyTooltip: 'ປິດການໃຊ້ງານການຢັ້ງຢືນໃບຢັ້ງຢືນສໍາລັບການເຊື່ອມຕໍ່ LDAPS.', + skipTLSVerifyHelper: + 'ໃຊ້ພຽງແຕ່ມີໃບຢັ້ງຢືນການເຊັນດ້ວຍຕົນເອງທີ່ເຊື່ອຖືໄດ້. ການຕັ້ງຄ່ານີ້ແມ່ນເປັນເອກະລາດຂອງການ synchronization ທີ່ເຄັ່ງຄັດ.', + connectTimeout: 'ໝົດເວລາການເຊື່ອມຕໍ່ (ວິນາທີ)', + searchPageSize: 'LDAP ຂະໜາດໜ້າສອບຖາມ', + restore: 'ຟື້ນຟູ', + testConnection: 'ທົດສອບການເຊື່ອມຕໍ່', + testLogin: 'ທົດສອບການເຂົ້າສູ່ລະບົບ', + userImport: 'ນໍາເຂົ້າຜູ້ໃຊ້', + saveBeforeImport: 'ບັນທຶກການຕັ້ງຄ່າ AD/LDAP ໃນປັດຈຸບັນກ່ອນທີ່ຈະນໍາເຂົ້າຜູ້ໃຊ້.', + format: 'ຮູບແບບ', + restoreExample: 'ຟື້ນຟູຕົວຢ່າງ', + mappingValid: 'ຖືກຕ້ອງ JSON; name ຖືກຕັ້ງຄ່າ.', + mappingInvalid: 'ໃສ່ JSON ທີ່ຖືກຕ້ອງ.', + mappingObject: 'ການສ້າງແຜນທີ່ຄຸນລັກສະນະຕ້ອງເປັນວັດຖຸ JSON.', + mappingOnlyName: 'ຮອງຮັບພຽງແຕ່ການສ້າງແຜນທີ່ name.', + mappingStringValues: 'ທຸກໆຄຸນລັກສະນະທີ່ເຮັດແຜນທີ່ຕ້ອງເປັນສະຕຣິງ.', + mappingNameRequired: 'name ຕ້ອງເປັນສະຕຣິງທີ່ບໍ່ຫວ່າງເປົ່າ.', + restored: 'ການຕັ້ງຄ່າທີ່ບັນທຶກໄວ້ຫຼ້າສຸດໄດ້ຖືກຟື້ນຟູຄືນມາ.', + connectionTestSuccess: 'ການທົດສອບການເຊື່ອມຕໍ່ LDAP ສຳເລັດແລ້ວ.', + recentTestSuccess: 'ການທົດສອບຄັ້ງສຸດທ້າຍປະສົບຜົນສໍາເລັດ: {0}', + recentTestFailed: 'ການທົດສອບຄັ້ງສຸດທ້າຍລົ້ມເຫລວ: {0}', + serverURLRequired: 'ໃສ່ URL ເຊີບເວີ LDAP.', + serverURLInvalid: 'ໃຊ້ ldap:// ຫຼື ldaps:// URL ທີ່ຖືກຕ້ອງ.', + userBaseDNRequired: 'ໃສ່ຜູ້ໃຊ້ Base DN.', + bindDNRequired: 'ໃສ່ Bind DN.', + passwordRequired: 'ໃສ່ລະຫັດຜ່ານ.', + userFilterRequired: 'ໃສ່ຕົວກອງຜູ້ໃຊ້.', + connectTimeoutRequired: 'ກະລຸນາໃສ່ການໝົດເວລາການເຊື່ອມຕໍ່.', + searchPageSizeRequired: 'ໃສ່ຂະໜາດຂອງໜ້າສອບຖາມ LDAP.', + sync: { + title: 'ການ​ຊິງ​ຄ໌​ທີ່​ກໍາ​ນົດ​ເວ​ລາ​', + description: 'ອ່ານລາຍຊື່ LDAP ເຕັມໃນຕາຕະລາງແລະຮັກສາຜູ້ໃຊ້ LDAP ທີ່ນໍາເຂົ້າໃນ 1Panel.', + enable: 'ເປີດໃຊ້ຕາຕະລາງ', + enableHelper: + 'ເມື່ອປິດການໃຊ້ງານ, ການປະຕິບັດອັດຕະໂນມັດຢຸດເຊົາ; ການ synchronization ຄູ່ມືຍັງມີຢູ່.', + schedule: 'ຕາຕະລາງ', + daily: 'ປະຈໍາວັນ', + weekly: 'ອາທິດ', + customCron: 'Cron ແບບກຳນົດເອງ', + preview: 'ເບິ່ງຕົວຢ່າງ', + previewTitle: 'ການດຳເນີນການ 5 ຄັ້ງຕໍ່ໄປ', + previewEmpty: 'ບໍ່ມີເວລາປະຕິບັດ', + cronHelper: 'ໃຊ້ການສະແດງອອກ Cron ຫ້າຊ່ອງມາດຕະຖານ: ນາທີ, ຊົ່ວໂມງ, ມື້, ເດືອນ, ມື້ເຮັດວຽກ.', + autoImport: 'ນໍາເຂົ້າຜູ້ໃຊ້ໃຫມ່', + autoImportHelper: + 'ເມື່ອປິດໃຊ້ງານ, ມີພຽງແຕ່ຕົວລະບຸໄດເລກະທໍລີ ແລະສະຖານະທີ່ຖືກຮັກສາໄວ້ສໍາລັບຜູ້ໃຊ້ LDAP ທີ່ນໍາເຂົ້າມາ; ບໍ່ມີຜູ້ໃຊ້ໃຫມ່ຖືກສ້າງຂຶ້ນ.', + defaultRole: 'ບົດບາດຜູ້ໃຊ້ໃຫມ່', + defaultRolePlaceholder: 'ເລືອກບົດບາດ', + defaultRoleHelper: 'ນຳໃຊ້ກັບຜູ້ໃຊ້ທີ່ສ້າງຂຶ້ນໂດຍການຊິງໂຄຣໄນກຳນົດເວລາເທົ່ານັ້ນ.', + defaultRoleRequired: 'ເລືອກບົດບາດສຳລັບຜູ້ໃຊ້ LDAP ໃໝ່.', + strictSyncHelper: + 'ຜູ້ໃຊ້ທີ່ຂາດຫາຍໄປຈາກການສອບຖາມເຕັມທີ່ຖືກປິດໃຊ້ງານແລະເຊດຊັນຂອງພວກເຂົາຖືກລຶບລ້າງ; ຜູ້ໃຊ້, ພາລະບົດບາດ, ແລະການອະນຸຍາດບໍ່ໄດ້ຖືກລຶບ.', + safetyTitle: + 'ຜູ້​ໃຊ້​ທີ່​ຂາດ​ໄປ​ແມ່ນ​ໄດ້​ຮັບ​ການ​ປະ​ຕິ​ບັດ​ພຽງ​ແຕ່​ຫຼັງ​ຈາກ​ການ​ສອບ​ຖາມ​ເຕັມ LDAP ທີ່​ສົມ​ບູນ​', + safetyDescription: + 'ການສອບຖາມທີ່ລົ້ມເຫລວ, ໝົດເວລາ, ຫຼືຜົນຂອງ paged ບໍ່ຄົບຖ້ວນບໍ່ເຄີຍປ່ຽນສະຖານະຜູ້ໃຊ້. ຂອບເຂດການຊິ້ງຂໍ້ມູນປະຕິບັດຕາມຜູ້ໃຊ້ Base DN, ການກັ່ນຕອງ, ແລະການສ້າງແຜນທີ່ຄຸນລັກສະນະ.', + runNow: 'ຊິ້ງຂໍ້ມູນດຽວນີ້', + lastRunSuccess: 'ການຊິ້ງຂໍ້ມູນຫຼ້າສຸດສຳເລັດແລ້ວ: {0}', + lastRunFailed: 'ການຊິ້ງຂໍ້ມູນຫຼ້າສຸດລົ້ມເຫລວ: {0}', + lastRunRunning: 'ເລີ່ມການຊິ້ງຂໍ້ມູນ: {0}', + sourceDisabled: 'ເປີດໃຊ້ ແລະບັນທຶກ AD/LDAP ກ່ອນທີ່ຈະດໍາເນີນການ synchronization.', + cronRequired: 'ໃສ່ການສະແດງອອກ Cron.', + saveBeforeRun: 'ບັນທຶກການຕັ້ງຄ່າ synchronization ກ່ອນທີ່ຈະດໍາເນີນການວຽກງານ.', + runConfirmTitle: 'ດໍາເນີນການ synchronization ທີ່ເຄັ່ງຄັດ', + runConfirmDescription: + 'ຜູ້ໃຊ້ LDAP ຫາຍໄປຈາກການສອບຖາມເຕັມທີ່ຈະຖືກປິດໃຊ້ງານ ແລະເຊດຊັນທີ່ເຄື່ອນໄຫວຂອງເຂົາເຈົ້າຖືກລຶບລ້າງ. ສືບຕໍ່?', + runSuccess: 'ການຊິ້ງຂໍ້ມູນ LDAP ສຳເລັດແລ້ວ.', + weekdays: { + 0: 'ວັນອາທິດ', + 1: 'ວັນຈັນ', + 2: 'ວັນອັງຄານ', + 3: 'ວັນພຸດ', + 4: 'ວັນພະຫັດ', + 5: 'ວັນສຸກ', + 6: 'ວັນເສົາ', + }, + }, + syncLogs: { + title: 'ບັນທຶກການຊິ້ງຂໍ້ມູນ', + description: 'ກວດເບິ່ງຜົນການຊິງຄ໌ LDAP ທີ່ກຳນົດເວລາ ແລະຄູ່ມື.', + startedAt: 'ເວລາເລີ່ມຕົ້ນ', + trigger: 'ວິທີເລີ່ມ', + manual: 'ດ້ວຍຕົນເອງ', + scheduled: 'ກຳນົດເວລາ', + success: 'ສຳເລັດ', + failed: 'ລົ້ມເຫລວ', + running: 'ກຳລັງດຳເນີນການ', + result: 'ຜົນໄດ້ຮັບ', + resultSummary: 'ສ້າງ {0}, ອັບເດດ {1}, ຂາດ {2}', + duration: 'ໄລຍະເວລາ', + action: 'ການປະຕິບັດ', + }, + testLoginTitle: 'ທົດສອບການເຂົ້າສູ່ລະບົບ AD/LDAP', + testLoginDesc: + 'ຜູກມັດກັບຂໍ້ມູນປະຈຳຕົວຜູ້ໃຊ້ AD/LDAP ເພື່ອທົດສອບການພິສູດຢືນຢັນເທົ່ານັ້ນ. ບໍ່ມີເຊດຊັນ 1Panel ຖືກສ້າງຂຶ້ນ.', + ldapUsername: 'ຊື່ຜູ້ໃຊ້ LDAP', + usernameRequired: 'ໃສ່ຊື່ຜູ້ໃຊ້ LDAP.', + startTest: 'ເລີ່ມການທົດສອບ', + testLoginSuccess: 'ການພິສູດຢືນຢັນສຳເລັດແລ້ວ.', + testLoginSuccessWithDN: 'ການພິສູດຢືນຢັນສຳເລັດແລ້ວ. ຜູ້ໃຊ້ DN: {0}', + import: { + title: 'ນໍາເຂົ້າຜູ້ໃຊ້ AD/LDAP', + source: 'ແຫຼ່ງຂໍ້ມູນ: AD/LDAP directory', + lastRead: 'ອ່ານຫຼ້າສຸດ: {0}', + cacheHit: 'ຜົນໄດ້ຮັບຈາກຖານຄວາມຈໍາ', + keywordPlaceholder: 'ຊອກຫາຊື່ຜູ້ໃຊ້', + search: 'ຊອກຫາ', + refresh: 'ອ່ານຈາກ LDAP', + refreshTip: 'ບໍ່ສົນໃຈ cache ໄລຍະສັ້ນແລະອ່ານລາຍຊື່ LDAP ອີກເທື່ອຫນຶ່ງ.', + loadFailed: 'ລົ້ມເຫລວໃນການອ່ານລາຍຊື່ LDAP.', + retry: 'ລອງໃໝ່', + noData: 'ບໍ່ພົບຜູ້ໃຊ້ໄດເລກະທໍລີ.', + username: 'ຊື່ຜູ້ໃຊ້', + status: 'ສະຖານະ', + changes: 'ການປ່ຽນແປງ', + noChanges: 'ບໍ່ມີການປ່ຽນແປງ', + importable: 'ພ້ອມທີ່ຈະນໍາເຂົ້າ', + updateAvailable: 'ມີອັບເດດ', + upToDate: 'ເຖິງວັນທີ', + conflict: 'ຊື່ຂັດກັນ', + selectedCount: 'ເລືອກ {0} ແລ້ວ', + totalCount: '{0} ຜູ້ໃຊ້', + newUserRole: 'ບົດບາດຜູ້ໃຊ້ໃຫມ່', + newUserRoleRequired: 'ເລືອກບົດບາດສຳລັບຜູ້ໃຊ້ໃໝ່.', + noNewUsers: 'ບໍ່ມີຜູ້ໃຊ້ໃຫມ່ໃນການດໍາເນີນງານນີ້.', + roleOnlyForNewUsers: 'ບົດບາດທີ່ເລືອກແມ່ນໃຊ້ກັບຜູ້ໃຊ້ທີ່ສ້າງຂຶ້ນໃໝ່ເທົ່ານັ້ນ.', + strictOff: 'ການຊິ້ງຂໍ້ມູນຢ່າງເຂັ້ມງວດຖືກປິດໄວ້. ການນໍາເຂົ້າຢ່າງເຕັມທີ່ຈະບໍ່ປິດຜູ້ໃຊ້.', + importSelected: 'ເລືອກການນຳເຂົ້າ/ອັບເດດ ({0})', + importAll: 'ນຳເຂົ້າ/ອັບເດດທັງໝົດ ({0})', + previewTitle: 'ຢືນຢັນການນໍາເຂົ້າເຕັມ', + previewDesc: 'ລາຍຊື່ LDAP ຄົບຖ້ວນໄດ້ຖືກອ່ານແລ້ວ. ຄໍາຄົ້ນຫາບໍ່ຈໍາກັດການປະຕິບັດນີ້.', + created: 'ສ້າງ', + updated: 'ອັບເດດ', + unchanged: 'ບໍ່ປ່ຽນແປງ', + conflicts: 'ຂໍ້ຂັດແຍ່ງ', + missing: 'ປິດໃຊ້ງານ', + reactivated: 'ເປີດໃຊ້ຄືນໃໝ່', + strictWarning: + 'ການຊິ້ງຂໍ້ມູນຢ່າງເຂັ້ມງວດຖືກເປີດໃຊ້ງານ. ຜູ້ໃຊ້ທີ່ຂາດຫາຍໄປຈາກ LDAP ບໍ່ສາມາດເຂົ້າສູ່ລະບົບໄດ້, ແຕ່ບັນທຶກ, ບົດບາດ, ແລະການອະນຸຍາດຂອງເຂົາເຈົ້າຖືກຮັກສາໄວ້.', + missingUsers: 'ຜູ້ໃຊ້ຫາຍໄປຈາກ LDAP', + missingScope: 'ພຽງແຕ່ແຫຼ່ງ LDAP ນີ້ໄດ້ຮັບຜົນກະທົບ.', + willDisable: 'ຈະຖືກປິດໃຊ້ງານ', + confirmAll: 'ຢືນຢັນການນໍາເຂົ້າ', + confirmAllWithMissing: 'ຢືນຢັນການນຳເຂົ້າ ແລະປິດໃຊ້ງານຜູ້ໃຊ້ {0} ຄົນ', + executeSuccess: 'ຜູ້ໃຊ້ LDAP ຖືກປະມວນຜົນສຳເລັດແລ້ວ.', + queryExpired: 'ຜົນການຄົ້ນຫາໄດເລກະທໍລີຫມົດອາຍຸ. ອ່ານຈາກ LDAP ອີກເທື່ອຫນຶ່ງ.', + planIncomplete: 'ການອ່ານໄດເລກະທໍລີເຕັມບໍ່ຄົບຖ້ວນ ແລະບໍ່ສາມາດດໍາເນີນການໄດ້.', + }, + }, + }, }, app: { app: 'ແອັບ', diff --git a/frontend/src/lang/modules/ms.ts b/frontend/src/lang/modules/ms.ts index 319e7fbce..eb935c947 100644 --- a/frontend/src/lang/modules/ms.ts +++ b/frontend/src/lang/modules/ms.ts @@ -4298,6 +4298,70 @@ const message = { mountPoint: 'Titik lekap', }, xpack: { + ldap: { + source: 'Sumber', + directoryMissing: 'Tiada dalam LDAP', + localCredentialsManaged: + 'Nama pengguna dan kata laluan diurus oleh LDAP dan tidak boleh diubah secara setempat.', + sources: { + local: 'Setempat', + ldap: 'LDAP', + }, + importUsers: 'Import pengguna AD/LDAP', + searchUsersPlaceholder: 'Cari nama pengguna', + readFromLDAP: 'Baca daripada LDAP', + selectedUsers: '{0} dipilih', + queriedAt: 'Masa dibaca', + cachedResult: 'Hasil cache', + roleForNewUsers: 'Peranan untuk pengguna baharu', + selectRole: 'Pilih peranan', + roleOnlyForNewUsers: 'Peranan diperlukan hanya apabila import mencipta pengguna.', + roleRequiredForNewUsers: 'Pilih peranan untuk pengguna LDAP baharu.', + changedFields: 'Medan ditukar', + importSelected: 'Import dipilih', + importAll: 'Import semua', + importPreview: 'Pratonton import AD/LDAP', + importCompleted: 'Import AD/LDAP selesai', + incompletePreview: 'Direktori LDAP dibaca tidak lengkap. Baca dari LDAP sekali lagi.', + missingUsersWarning: 'Pengguna yang hilang dari LDAP akan dilumpuhkan oleh penyegerakan yang ketat.', + missingUsersWarningDetail: '{0} pengguna LDAP tempatan tidak akan dapat log masuk lagi.', + action: 'Tindakan', + reason: 'Sebab', + noImportChanges: 'Tiada perubahan import', + confirmImport: 'Sahkan import', + created: 'Buat', + updated: 'Kemas kini', + reactivated: 'Aktifkan semula', + unchanged: 'Tidak berubah', + conflicts: 'Konflik', + missing: 'hilang', + missingUsersConfirm: '{0} pengguna yang tiada dalam LDAP akan dinyahdayakan dan dilog keluar. Teruskan?', + strictSyncConfirm: 'Sahkan penyegerakan yang ketat', + status: { + importable: 'Pengguna baharu', + update_available: 'Kemas kini tersedia', + up_to_date: 'Terkini', + conflict: 'Konflik', + }, + fields: { + name: 'Nama pengguna', + externalDN: 'Direktori DN', + externalID: 'ID Luaran', + authSourceStatus: 'Status pengesahan', + }, + actions: { + created: 'Buat', + updated: 'Kemas kini', + reactivated: 'Aktifkan semula', + unchanged: 'Tidak berubah', + skipped: 'Dilangkau', + conflicts: 'Konflik', + conflict: 'Konflik', + missing: 'Lumpuhkan', + errors: 'ralat', + error: 'ralat', + }, + }, expiresEnterpriseAlert: 'Peringatan mesra: Lesen Enterprise Edition anda akan tamat dalam {0} hari, dan semua ciri Enterprise Edition tidak lagi dapat diakses. Sila perbaharui segera untuk memastikan penggunaan berterusan.', expiresProAlert: @@ -4855,6 +4919,221 @@ const message = { masterOnlyPermissionHelper: 'Kebenaran ini hanya berkuat kuasa pada nod utama.', view: 'Lihat', manage: 'Urus', + authManage: 'Pengurusan pengesahan', + auth: { + providerNavigation: 'Pembekal pengesahan', + providers: { + ldap: 'AD/LDAP', + passkey: 'Passkey', + radius: 'Radius', + oidc: 'OIDC', + saml2: 'SAML2', + cas: 'CAS', + oauth2: 'OAuth2', + dingtalk: 'DingTalk', + feishu: 'Feishu', + wecom: 'WeCom', + }, + providerDescriptions: { + ldap: 'Serasi dengan Active Directory, OpenLDAP dan perkhidmatan LDAP yang lain', + passkey: 'Gunakan bukti kelayakan peranti untuk log masuk tanpa kata laluan', + radius: 'Sahkan akses rangkaian melalui perkhidmatan Radius', + oidc: 'Sambungkan log masuk tunggal perusahaan dengan OpenID Connect', + saml2: 'Gunakan SAML2 untuk persekutuan identiti perusahaan', + cas: 'Sambungkan perkhidmatan pengesahan berpusat untuk log masuk tunggal', + oauth2: 'Sambungkan perkhidmatan identiti OAuth2 yang serasi', + dingtalk: 'Gunakan identiti organisasi DingTalk dan log masuk QR', + feishu: 'Gunakan identiti organisasi Feishu dan penyegerakan akaun', + wecom: 'Sahkan dengan identiti ahli WeCom', + }, + planned: 'Terancang', + plannedTitle: 'Tetapan pengesahan {0}', + plannedDesc: 'Pembekal pengesahan ini telah dirancang dan belum tersedia lagi.', + ldap: { + enable: 'Dayakan', + enabled: 'Didayakan', + disabled: 'Dilumpuhkan', + connection: 'Sambungan asas', + connectionDesc: + 'Konfigurasikan perkhidmatan direktori dan akaun bind yang digunakan untuk mencari pengguna.', + serverURL: 'URL pelayan', + serverURLHelper: 'Menyokong URL ldap:// dan ldaps://.', + userBaseDN: 'Pengguna Base DN', + userBaseDNHelper: + 'Memulakan DN untuk carian pengguna LDAP; ia boleh menjadi OU, CN atau akar domain DN.', + bindDN: 'Ikat DN', + bindPassword: 'Kata laluan', + passwordSaved: 'Biarkan kosong untuk menyimpan kata laluan yang disimpan', + userSearch: 'Carian pengguna', + userSearchDesc: + 'Tetapkan pangkalan carian dan penapis pengguna, kemudian petakan atribut LDAP yang digunakan sebagai 1Panel name.', + userFilter: 'Penapis pengguna', + userFilterTooltip: + 'Gantikan %(user)s dengan nama pengguna yang dilepaskan, atau dengan * untuk membaca direktori penuh.', + userFilterHelper: 'Nama pengguna dikeluarkan sebelum ia dimasukkan ke dalam penapis LDAP.', + attributeMap: 'Pemetaan atribut', + attributeMapTooltip: 'Pemetaan JSON daripada medan 1Panel name kepada atribut LDAP.', + attributeMapHelper: 'Tetapkan atribut LDAP yang dipetakan ke medan 1Panel name.', + advanced: 'Tetapan lanjutan', + advancedDesc: 'Konfigurasikan halaman pertanyaan TLS dan LDAP.', + strictSync: 'Penyegerakan yang ketat', + strictSyncTooltip: + 'Selepas import penuh lengkap, pengguna yang tiada daripada sumber LDAP ini dilumpuhkan tetapi tidak dipadamkan.', + strictSyncHelper: + 'Hanya digunakan untuk import penuh yang lengkap. Mengimport pengguna terpilih tidak sekali-kali melumpuhkan pengguna lain.', + skipTLSVerify: 'Langkau pengesahan TLS', + skipTLSVerifyTooltip: 'Lumpuhkan pengesahan sijil untuk sambungan LDAPS.', + skipTLSVerifyHelper: + 'Gunakan hanya dengan sijil yang ditandatangani sendiri yang dipercayai. Tetapan ini bebas daripada penyegerakan yang ketat.', + connectTimeout: 'Tamat masa sambungan (saat)', + searchPageSize: 'LDAP saiz halaman pertanyaan', + restore: 'Pulihkan', + testConnection: 'Uji sambungan', + testLogin: 'Uji log masuk', + userImport: 'Import pengguna', + saveBeforeImport: 'Simpan tetapan AD/LDAP semasa sebelum mengimport pengguna.', + format: 'Format', + restoreExample: 'Pulihkan contoh', + mappingValid: 'JSON sah; name dikonfigurasikan.', + mappingInvalid: 'Masukkan JSON yang sah.', + mappingObject: 'Pemetaan atribut mestilah objek JSON.', + mappingOnlyName: 'Hanya pemetaan name disokong.', + mappingStringValues: 'Setiap atribut yang dipetakan mestilah rentetan.', + mappingNameRequired: 'name mestilah rentetan bukan kosong.', + restored: 'Tetapan terakhir yang disimpan telah dipulihkan.', + connectionTestSuccess: 'Ujian sambungan LDAP berjaya.', + recentTestSuccess: 'Ujian terakhir berjaya: {0}', + recentTestFailed: 'Ujian terakhir gagal: {0}', + serverURLRequired: 'Masukkan URL pelayan LDAP.', + serverURLInvalid: 'Gunakan URL ldap:// atau ldaps:// yang sah.', + userBaseDNRequired: 'Masukkan Pengguna Base DN.', + bindDNRequired: 'Masukkan Bind DN.', + passwordRequired: 'Masukkan kata laluan.', + userFilterRequired: 'Masukkan penapis pengguna.', + connectTimeoutRequired: 'Masukkan tamat masa sambungan.', + searchPageSizeRequired: 'Masukkan saiz halaman pertanyaan LDAP.', + sync: { + title: 'Penyegerakan berjadual', + description: + 'Baca direktori LDAP penuh mengikut jadual dan kekalkan pengguna LDAP yang diimport dalam 1Panel.', + enable: 'Dayakan jadual', + enableHelper: + 'Apabila dilumpuhkan, pelaksanaan automatik berhenti; penyegerakan manual masih tersedia.', + schedule: 'Jadual', + daily: 'Setiap hari', + weekly: 'Mingguan', + customCron: 'Cron tersuai', + preview: 'Pratonton', + previewTitle: '5 pelaksanaan seterusnya', + previewEmpty: 'Tiada masa pelaksanaan tersedia', + cronHelper: 'Gunakan ungkapan Cron lima medan standard: minit, jam, hari, bulan, hari bekerja.', + autoImport: 'Import pengguna baharu', + autoImportHelper: + 'Apabila dilumpuhkan, hanya pengecam dan status direktori dikekalkan untuk pengguna LDAP yang diimport; tiada pengguna baharu dibuat.', + defaultRole: 'Peranan pengguna baharu', + defaultRolePlaceholder: 'Pilih peranan', + defaultRoleHelper: 'Hanya terpakai kepada pengguna yang dibuat melalui penyegerakan berjadual.', + defaultRoleRequired: 'Pilih peranan untuk pengguna LDAP baharu.', + strictSyncHelper: + 'Pengguna yang tiada daripada pertanyaan penuh lengkap dilumpuhkan dan sesi mereka dikosongkan; pengguna, peranan dan kebenaran tidak dipadamkan.', + safetyTitle: 'Pengguna yang hilang diproses hanya selepas pertanyaan penuh LDAP lengkap', + safetyDescription: + 'Pertanyaan yang gagal, tamat masa atau hasil halaman yang tidak lengkap tidak pernah mengubah status pengguna. Skop penyegerakan mengikut Base DN Pengguna, penapis dan pemetaan atribut.', + runNow: 'Segerakkan sekarang', + lastRunSuccess: 'Penyegerakan terakhir berjaya: {0}', + lastRunFailed: 'Penyegerakan terakhir gagal: {0}', + lastRunRunning: 'Penyegerakan dimulakan: {0}', + sourceDisabled: 'Dayakan dan simpan AD/LDAP sebelum menjalankan penyegerakan.', + cronRequired: 'Masukkan ungkapan Cron.', + saveBeforeRun: 'Simpan tetapan penyegerakan sebelum menjalankan tugas.', + runConfirmTitle: 'Jalankan penyegerakan yang ketat', + runConfirmDescription: + 'Pengguna LDAP yang hilang daripada pertanyaan penuh yang lengkap akan dilumpuhkan dan sesi aktif mereka dikosongkan. teruskan?', + runSuccess: 'Penyegerakan LDAP selesai.', + weekdays: { + 0: 'Ahad', + 1: 'Isnin', + 2: 'Selasa', + 3: 'Rabu', + 4: 'Khamis', + 5: 'Jumaat', + 6: 'Sabtu', + }, + }, + syncLogs: { + title: 'Segerakkan log', + description: 'Semak keputusan penyegerakan LDAP yang dijadualkan dan manual.', + startedAt: 'Masa mula', + trigger: 'Cara pelaksanaan', + manual: 'Manual', + scheduled: 'Dijadualkan', + success: 'Kejayaan', + failed: 'gagal', + running: 'Sedang berjalan', + result: 'Hasilnya', + resultSummary: 'Dicipta {0}, dikemas kini {1}, tiada {2}', + duration: 'Tempoh', + action: 'Tindakan', + }, + testLoginTitle: 'Uji log masuk AD/LDAP', + testLoginDesc: + 'Ikat dengan bukti kelayakan pengguna AD/LDAP untuk menguji pengesahan sahaja. Tiada sesi 1Panel dibuat.', + ldapUsername: 'Nama pengguna LDAP', + usernameRequired: 'Masukkan nama pengguna LDAP.', + startTest: 'Mulakan ujian', + testLoginSuccess: 'Pengesahan berjaya.', + testLoginSuccessWithDN: 'Pengesahan berjaya. Pengguna DN: {0}', + import: { + title: 'Import pengguna AD/LDAP', + source: 'Sumber data: direktori AD/LDAP', + lastRead: 'Bacaan terakhir: {0}', + cacheHit: 'Hasil cache', + keywordPlaceholder: 'Cari nama pengguna', + search: 'Cari', + refresh: 'Baca daripada LDAP', + refreshTip: 'Abaikan cache jangka pendek dan baca direktori LDAP sekali lagi.', + loadFailed: 'Gagal membaca direktori LDAP.', + retry: 'Cuba semula', + noData: 'Tiada pengguna direktori ditemui.', + username: 'Nama pengguna', + status: 'Status', + changes: 'Perubahan', + noChanges: 'Tiada perubahan', + importable: 'Sedia untuk diimport', + updateAvailable: 'Kemas kini tersedia', + upToDate: 'Terkini', + conflict: 'Konflik nama', + selectedCount: '{0} dipilih', + totalCount: '{0} pengguna', + newUserRole: 'Peranan pengguna baharu', + newUserRoleRequired: 'Pilih peranan untuk pengguna baharu.', + noNewUsers: 'Tiada pengguna baharu dalam operasi ini.', + roleOnlyForNewUsers: 'Peranan yang dipilih hanya digunakan kepada pengguna yang baru dibuat.', + strictOff: 'Penyegerakan yang ketat dilumpuhkan. Import penuh tidak akan melumpuhkan pengguna.', + importSelected: 'Import/kemas kini dipilih ({0})', + importAll: 'Import/kemas kini semua ({0})', + previewTitle: 'Sahkan import penuh', + previewDesc: + 'Direktori LDAP lengkap telah dibaca. Kata kunci carian tidak mengehadkan operasi ini.', + created: 'Buat', + updated: 'Kemas kini', + unchanged: 'Tidak berubah', + conflicts: 'Konflik', + missing: 'Lumpuhkan', + reactivated: 'Aktifkan semula', + strictWarning: + 'Penyegerakan yang ketat didayakan. Pengguna yang tiada dari LDAP tidak boleh log masuk, tetapi rekod, peranan dan kebenaran mereka dikekalkan.', + missingUsers: 'Pengguna hilang dari LDAP', + missingScope: 'Hanya sumber LDAP ini terjejas.', + willDisable: 'Akan dilumpuhkan', + confirmAll: 'Sahkan import', + confirmAllWithMissing: 'Sahkan import dan nyahdayakan {0} pengguna', + executeSuccess: 'Pengguna LDAP telah berjaya diproses.', + queryExpired: 'Keputusan direktori telah tamat tempoh. Baca dari LDAP sekali lagi.', + planIncomplete: 'Direktori penuh dibaca tidak lengkap dan tidak boleh dilaksanakan.', + }, + }, + }, }, app: { app: 'APP', diff --git a/frontend/src/lang/modules/pt-br.ts b/frontend/src/lang/modules/pt-br.ts index 8a837cdcd..d8c9fadd1 100644 --- a/frontend/src/lang/modules/pt-br.ts +++ b/frontend/src/lang/modules/pt-br.ts @@ -4438,6 +4438,70 @@ const message = { noFail: 'Falha na montagem não afeta a inicialização do sistema', }, xpack: { + ldap: { + source: 'Origem', + directoryMissing: 'Não encontrado no LDAP', + localCredentialsManaged: + 'O nome de usuário e a senha são gerenciados pelo LDAP e não podem ser alterados localmente.', + sources: { + local: 'Local', + ldap: 'LDAP', + }, + importUsers: 'Importar usuários AD/LDAP', + searchUsersPlaceholder: 'Pesquisar nome de usuário', + readFromLDAP: 'Leia de LDAP', + selectedUsers: '{0} selecionado', + queriedAt: 'Lido em', + cachedResult: 'Resultado armazenado em cache', + roleForNewUsers: 'Função para novos usuários', + selectRole: 'Selecione uma função', + roleOnlyForNewUsers: 'Uma função é necessária somente quando a importação cria usuários.', + roleRequiredForNewUsers: 'Selecione uma função para novos usuários LDAP.', + changedFields: 'Campos alterados', + importSelected: 'Importação selecionada', + importAll: 'Importar tudo', + importPreview: 'Pré-visualização da importação AD/LDAP', + importCompleted: 'Importação AD/LDAP concluída', + incompletePreview: 'A leitura do diretório LDAP estava incompleta. Leia LDAP novamente.', + missingUsersWarning: 'Os usuários ausentes de LDAP serão desabilitados pela sincronização estrita.', + missingUsersWarningDetail: '{0} usuários LDAP locais não poderão mais fazer login.', + action: 'Ação', + reason: 'Razão', + noImportChanges: 'Nenhuma alteração de importação', + confirmImport: 'Confirmar importação', + created: 'Criar', + updated: 'Atualizar', + reactivated: 'Reativar', + unchanged: 'Inalterado', + conflicts: 'Conflitos', + missing: 'Desaparecido', + missingUsersConfirm: 'Usuários {0} ausentes em LDAP serão desabilitados e desconectados. Continuar?', + strictSyncConfirm: 'Confirme a sincronização estrita', + status: { + importable: 'Novo usuário', + update_available: 'Atualização disponível', + up_to_date: 'Atualizado', + conflict: 'Conflito', + }, + fields: { + name: 'Nome de usuário', + externalDN: 'Diretório DN', + externalID: 'ID externo', + authSourceStatus: 'Status de autenticação', + }, + actions: { + created: 'Criar', + updated: 'Atualizar', + reactivated: 'Reativar', + unchanged: 'Inalterado', + skipped: 'Ignorado', + conflicts: 'Conflito', + conflict: 'Conflito', + missing: 'Desativar', + errors: 'Erro', + error: 'Erro', + }, + }, expiresEnterpriseAlert: 'Lembrete: Sua licença da Enterprise Edition expira em {0} dias. Depois disso, todos os recursos da Enterprise Edition deixarão de ficar disponíveis. Renove a licença para manter o uso contínuo.', expiresProAlert: @@ -4996,6 +5060,223 @@ const message = { masterOnlyPermissionHelper: 'Esta permissão só tem efeito no nó principal.', view: 'Visualizar', manage: 'Gerenciar', + authManage: 'Gerenciamento de autenticação', + auth: { + providerNavigation: 'Provedores de autenticação', + providers: { + ldap: 'AD/LDAP', + passkey: 'Passkey', + radius: 'Radius', + oidc: 'OIDC', + saml2: 'SAML2', + cas: 'CAS', + oauth2: 'OAuth2', + dingtalk: 'DingTalk', + feishu: 'Feishu', + wecom: 'WeCom', + }, + providerDescriptions: { + ldap: 'Compatível com Active Directory, OpenLDAP e outros serviços LDAP', + passkey: 'Use credenciais do dispositivo para login sem senha', + radius: 'Autenticar o acesso à rede através de um serviço Radius', + oidc: 'Conecte o logon único empresarial com OpenID Connect', + saml2: 'Use SAML2 para federação de identidade corporativa', + cas: 'Conecte um serviço de autenticação centralizado para logon único', + oauth2: 'Conecte um serviço de identidade OAuth2 compatível', + dingtalk: 'Use a identidade da organização DingTalk e login QR', + feishu: 'Use a identidade da organização Feishu e a sincronização de contas', + wecom: 'Autenticar com identidade de membro WeCom', + }, + planned: 'Planejado', + plannedTitle: 'Configurações de autenticação {0}', + plannedDesc: 'Este provedor de autenticação está planejado e ainda não está disponível.', + ldap: { + enable: 'Habilitar', + enabled: 'Habilitado', + disabled: 'Desativado', + connection: 'Conexão básica', + connectionDesc: + 'Configure o serviço de diretório e a conta de ligação usada para procurar usuários.', + serverURL: 'URL do servidor', + serverURLHelper: 'Suporta URLs ldap:// e ldaps://.', + userBaseDN: 'Base DN do usuário', + userBaseDNHelper: + 'DN inicial para pesquisas de usuários LDAP; pode ser uma OU, um CN ou o DN raiz do domínio.', + bindDN: 'DN de vínculo', + bindPassword: 'Senha', + passwordSaved: 'Deixe em branco para manter a senha salva', + userSearch: 'Pesquisa de usuário', + userSearchDesc: + 'Configure a base e o filtro de pesquisa e mapeie o atributo LDAP para o campo name do 1Panel.', + userFilter: 'Filtro de usuário', + userFilterTooltip: + 'Substitua %(user)s pelo nome de usuário com escape ou por * para uma leitura completa do diretório.', + userFilterHelper: 'Os nomes de usuário têm escape antes de serem inseridos no filtro LDAP.', + attributeMap: 'Mapeamento de atributos', + attributeMapTooltip: 'Mapeamento JSON do campo name do 1Panel para um atributo LDAP.', + attributeMapHelper: 'Configure o atributo LDAP mapeado para o campo name do 1Panel.', + advanced: 'Configurações avançadas', + advancedDesc: 'Configure a paginação de consulta TLS e LDAP.', + strictSync: 'Sincronização estrita', + strictSyncTooltip: + 'Após uma importação completa, os usuários ausentes nesta origem LDAP serão desativados, mas não excluídos.', + strictSyncHelper: + 'Aplica-se apenas a uma importação completa. A importação de usuários selecionados nunca desabilita outros usuários.', + skipTLSVerify: 'Ignorar verificação TLS', + skipTLSVerifyTooltip: 'Desative a verificação de certificado para conexões LDAPS.', + skipTLSVerifyHelper: + 'Use somente com um certificado autoassinado confiável. Esta configuração é independente da sincronização estrita.', + connectTimeout: 'Tempo limite de conexão (segundos)', + searchPageSize: 'Tamanho da página de consulta LDAP', + restore: 'Restaurar', + testConnection: 'Testar conexão', + testLogin: 'Testar login', + userImport: 'Importar usuários', + saveBeforeImport: 'Salve as configurações AD/LDAP atuais antes de importar usuários.', + format: 'Formato', + restoreExample: 'Exemplo de restauração', + mappingValid: 'JSON válido; name está configurado.', + mappingInvalid: 'Insira JSON válido.', + mappingObject: 'O mapeamento de atributos deve ser um objeto JSON.', + mappingOnlyName: 'Somente o mapeamento name é suportado.', + mappingStringValues: 'Cada atributo mapeado deve ser uma string.', + mappingNameRequired: 'name deve ser uma sequência não vazia.', + restored: 'As últimas configurações salvas foram restauradas.', + connectionTestSuccess: 'O teste de conexão LDAP foi bem-sucedido.', + recentTestSuccess: 'Último teste bem-sucedido: {0}', + recentTestFailed: 'Último teste falhou: {0}', + serverURLRequired: 'Insira a URL do servidor LDAP.', + serverURLInvalid: 'Use um URL ldap:// ou ldaps:// válido.', + userBaseDNRequired: 'Informe a Base DN do usuário.', + bindDNRequired: 'Insira a ligação DN.', + passwordRequired: 'Digite a senha.', + userFilterRequired: 'Insira o filtro do usuário.', + connectTimeoutRequired: 'Insira o tempo limite de conexão.', + searchPageSizeRequired: 'Insira o tamanho da página de consulta LDAP.', + sync: { + title: 'Sincronização agendada', + description: + 'Leia o diretório LDAP completo de acordo com uma programação e mantenha os usuários LDAP importados em 1Panel.', + enable: 'Ativar agendamento', + enableHelper: + 'Quando desativado, a execução automática é interrompida; a sincronização manual permanece disponível.', + schedule: 'Cronograma', + daily: 'Diariamente', + weekly: 'Semanalmente', + customCron: 'Cron personalizado', + preview: 'Visualização', + previewTitle: 'Próximas 5 execuções', + previewEmpty: 'Não há tempo de execução disponível', + cronHelper: + 'Use uma expressão Cron padrão de cinco campos: minuto, hora, dia, mês, dia da semana.', + autoImport: 'Importar novos usuários', + autoImportHelper: + 'Quando desativado, apenas os identificadores e o status do diretório são mantidos para usuários LDAP importados; nenhum novo usuário é criado.', + defaultRole: 'Nova função de usuário', + defaultRolePlaceholder: 'Selecione uma função', + defaultRoleHelper: 'Aplica-se apenas a usuários criados por sincronização agendada.', + defaultRoleRequired: 'Selecione uma função para novos usuários LDAP.', + strictSyncHelper: + 'Os usuários ausentes em uma consulta completa são desabilitados e suas sessões são apagadas; usuários, funções e permissões não são excluídos.', + safetyTitle: 'Usuários ausentes são processados somente após uma consulta completa LDAP', + safetyDescription: + 'Uma consulta com falha, tempo limite ou resultado paginado incompleto nunca altera o status do usuário. O escopo de sincronização segue o usuário Base DN, filtro e mapeamento de atributos.', + runNow: 'Sincronize agora', + lastRunSuccess: 'Última sincronização bem-sucedida: {0}', + lastRunFailed: 'Falha na última sincronização: {0}', + lastRunRunning: 'Sincronização iniciada: {0}', + sourceDisabled: 'Habilite e salve AD/LDAP antes de executar a sincronização.', + cronRequired: 'Insira uma expressão Cron.', + saveBeforeRun: 'Salve as configurações de sincronização antes de executar a tarefa.', + runConfirmTitle: 'Execute a sincronização estrita', + runConfirmDescription: + 'Os usuários LDAP ausentes em uma consulta completa serão desabilitados e suas sessões ativas serão apagadas. Continuar?', + runSuccess: 'Sincronização LDAP concluída.', + weekdays: { + 0: 'Domingo', + 1: 'Segunda-feira', + 2: 'Terça-feira', + 3: 'Quarta-feira', + 4: 'Quinta-feira', + 5: 'Sexta-feira', + 6: 'Sábado', + }, + }, + syncLogs: { + title: 'Sincronizar registros', + description: 'Revise os resultados da sincronização LDAP programada e manual.', + startedAt: 'Hora de início', + trigger: 'Tipo de execução', + manual: 'Manual', + scheduled: 'Agendado', + success: 'Sucesso', + failed: 'Falha', + running: 'Em execução', + result: 'Resultado', + resultSummary: 'Criados {0}, atualizados {1}, ausentes {2}', + duration: 'Duração', + action: 'Ação', + }, + testLoginTitle: 'Testar login AD/LDAP', + testLoginDesc: + 'Vincule com uma credencial de usuário AD/LDAP apenas para testar a autenticação. Nenhuma sessão 1Panel é criada.', + ldapUsername: 'Nome de usuário LDAP', + usernameRequired: 'Digite o nome de usuário LDAP.', + startTest: 'Iniciar teste', + testLoginSuccess: 'Autenticação bem-sucedida.', + testLoginSuccessWithDN: 'Autenticação bem-sucedida. Usuário DN: {0}', + import: { + title: 'Importar usuários AD/LDAP', + source: 'Fonte de dados: diretório AD/LDAP', + lastRead: 'Última leitura: {0}', + cacheHit: 'Resultado armazenado em cache', + keywordPlaceholder: 'Pesquisar nome de usuário', + search: 'Pesquisar', + refresh: 'Leia de LDAP', + refreshTip: 'Ignore o cache de curto prazo e leia o diretório LDAP novamente.', + loadFailed: 'Falha ao ler o diretório LDAP.', + retry: 'Tentar novamente', + noData: 'Nenhum usuário do diretório encontrado.', + username: 'Nome de usuário', + status: 'Estado', + changes: 'Mudanças', + noChanges: 'Sem alterações', + importable: 'Pronto para importar', + updateAvailable: 'Atualização disponível', + upToDate: 'Atualizado', + conflict: 'Conflito de nome', + selectedCount: '{0} selecionado', + totalCount: '{0} usuários', + newUserRole: 'Nova função de usuário', + newUserRoleRequired: 'Selecione uma função para novos usuários.', + noNewUsers: 'Não há novos usuários nesta operação.', + roleOnlyForNewUsers: 'A função selecionada é aplicada somente aos usuários recém-criados.', + strictOff: + 'A sincronização estrita está desativada. Uma importação completa não desativará os usuários.', + importSelected: 'Importação/atualização selecionada ({0})', + importAll: 'Importar/atualizar tudo ({0})', + previewTitle: 'Confirme a importação completa', + previewDesc: + 'O diretório LDAP completo foi lido. A palavra-chave de pesquisa não limita esta operação.', + created: 'Criar', + updated: 'Atualizar', + unchanged: 'Inalterado', + conflicts: 'Conflitos', + missing: 'Desativar', + reactivated: 'Reativar', + strictWarning: + 'A sincronização estrita está habilitada. Os usuários ausentes de LDAP não podem fazer login, mas seus registros, funções e permissões são mantidos.', + missingUsers: 'Usuários ausentes em LDAP', + missingScope: 'Somente esta fonte LDAP é afetada.', + willDisable: 'Será desativado', + confirmAll: 'Confirmar importação', + confirmAllWithMissing: 'Confirmar importação e desabilitar {0} usuários', + executeSuccess: 'Os usuários LDAP foram processados com sucesso.', + queryExpired: 'O resultado do diretório expirou. Leia LDAP novamente.', + planIncomplete: 'A leitura completa do diretório está incompleta e não pode ser executada.', + }, + }, + }, }, app: { app: 'APP', diff --git a/frontend/src/lang/modules/ru.ts b/frontend/src/lang/modules/ru.ts index 32868e30b..94d8d0038 100644 --- a/frontend/src/lang/modules/ru.ts +++ b/frontend/src/lang/modules/ru.ts @@ -4285,6 +4285,71 @@ const message = { noFail: 'Сбой монтирования не влияет на запуск системы', }, xpack: { + ldap: { + source: 'Источник', + directoryMissing: 'Отсутствует в LDAP', + localCredentialsManaged: 'Имя пользователя и пароль управляются LDAP и не могут быть изменены локально.', + sources: { + local: 'Локальный', + ldap: 'LDAP', + }, + importUsers: 'Импорт пользователей AD/LDAP', + searchUsersPlaceholder: 'Поиск имени пользователя', + readFromLDAP: 'Читать из LDAP', + selectedUsers: '{0} выбрано', + queriedAt: 'Время чтения', + cachedResult: 'Кэшированный результат', + roleForNewUsers: 'Роль для новых пользователей', + selectRole: 'Выберите роль', + roleOnlyForNewUsers: 'Роль требуется только тогда, когда при импорте создаются пользователи.', + roleRequiredForNewUsers: 'Выберите роль для новых пользователей LDAP.', + changedFields: 'Измененные поля', + importSelected: 'Импортировать выбранное', + importAll: 'Импортировать все', + importPreview: 'Предпросмотр импорта AD/LDAP', + importCompleted: 'Импорт AD/LDAP завершён', + incompletePreview: 'Чтение каталога LDAP было неполным. Прочтите еще раз LDAP.', + missingUsersWarning: + 'Пользователи, отсутствующие в LDAP, будут отключены посредством строгой синхронизации.', + missingUsersWarningDetail: '{0} локальных пользователей LDAP больше не смогут войти в систему.', + action: 'Действие', + reason: 'Причина', + noImportChanges: 'Никаких изменений импорта', + confirmImport: 'Подтвердить импорт', + created: 'Создать', + updated: 'Обновить', + reactivated: 'Повторно активировать', + unchanged: 'Без изменений', + conflicts: 'Конфликты', + missing: 'Отсутствует', + missingUsersConfirm: + '{0} пользователей, отсутствующих в LDAP, будут отключены, а их сеансы завершены. Продолжить?', + strictSyncConfirm: 'Подтвердить строгую синхронизацию', + status: { + importable: 'Новый пользователь', + update_available: 'Доступно обновление', + up_to_date: 'Актуально', + conflict: 'Конфликт', + }, + fields: { + name: 'Имя пользователя', + externalDN: 'Каталог DN', + externalID: 'Внешний идентификатор', + authSourceStatus: 'Статус аутентификации', + }, + actions: { + created: 'Создать', + updated: 'Обновить', + reactivated: 'Повторно активировать', + unchanged: 'Без изменений', + skipped: 'Пропущено', + conflicts: 'Конфликт', + conflict: 'Конфликт', + missing: 'Отключить', + errors: 'Ошибка', + error: 'Ошибка', + }, + }, expiresEnterpriseAlert: 'Дружеское напоминание: ваша лицензия Enterprise Edition истечет через {0} дней, и все функции Enterprise Edition станут недоступны. Пожалуйста, продлите лицензию вовремя, чтобы обеспечить дальнейшее использование.', expiresProAlert: @@ -4843,6 +4908,223 @@ const message = { masterOnlyPermissionHelper: 'Это право действует только на главном узле.', view: 'Просмотр', manage: 'Управление', + authManage: 'Управление аутентификацией', + auth: { + providerNavigation: 'Поставщики аутентификации', + providers: { + ldap: 'AD/LDAP', + passkey: 'Passkey', + radius: 'Radius', + oidc: 'OIDC', + saml2: 'SAML2', + cas: 'CAS', + oauth2: 'OAuth2', + dingtalk: 'DingTalk', + feishu: 'Feishu', + wecom: 'WeCom', + }, + providerDescriptions: { + ldap: 'Совместимость с Active Directory, OpenLDAP и другими службами LDAP.', + passkey: 'Используйте учетные данные устройства для входа без пароля', + radius: 'Аутентификация доступа к сети через службу Radius', + oidc: 'Подключите корпоративный единый вход с помощью OpenID Connect', + saml2: 'Используйте SAML2 для федерации корпоративных удостоверений.', + cas: 'Подключите централизованную службу аутентификации для единого входа', + oauth2: 'Подключите совместимую службу идентификации OAuth2.', + dingtalk: 'Используйте идентификатор организации DingTalk и вход с помощью QR', + feishu: 'Используйте идентификацию организации Feishu и синхронизацию учетных записей.', + wecom: 'Аутентификация с использованием удостоверения участника WeCom', + }, + planned: 'Планируется', + plannedTitle: 'Настройки аутентификации {0}', + plannedDesc: 'Этот поставщик аутентификации запланирован и пока недоступен.', + ldap: { + enable: 'Включить', + enabled: 'Включено', + disabled: 'Отключено', + connection: 'Базовое подключение', + connectionDesc: + 'Настройте службу каталогов и учетную запись привязки, используемую для поиска пользователей.', + serverURL: 'URL-адрес сервера', + serverURLHelper: 'Поддерживает URL-адреса ldap:// и ldaps://.', + userBaseDN: 'Пользователь Base DN', + userBaseDNHelper: + 'Запуск DN для поиска пользователей LDAP; это может быть OU, CN или корень домена DN.', + bindDN: 'Привязать DN', + bindPassword: 'Пароль', + passwordSaved: 'Оставьте поле пустым, чтобы сохранить сохраненный пароль.', + userSearch: 'Поиск пользователей', + userSearchDesc: + 'Установите базу поиска пользователей и фильтр, затем сопоставьте атрибут LDAP, используемый как 1Panel name.', + userFilter: 'Пользовательский фильтр', + userFilterTooltip: + 'Замените %(user)s экранированным именем пользователя или на * для полного чтения каталога.', + userFilterHelper: 'Имена пользователей экранируются перед вставкой в ​​фильтр LDAP.', + attributeMap: 'Сопоставление атрибутов', + attributeMapTooltip: 'Сопоставление JSON поля 1Panel name с атрибутом LDAP.', + attributeMapHelper: 'Установите атрибут LDAP, сопоставленный с полем 1Panel name.', + advanced: 'Расширенные настройки', + advancedDesc: 'Настройте разбиение запросов TLS и LDAP.', + strictSync: 'Строгая синхронизация', + strictSyncTooltip: + 'После полного импорта пользователи, отсутствующие в этом источнике LDAP, отключаются, но не удаляются.', + strictSyncHelper: + 'Применяется только к полному импорту. Импорт выбранных пользователей никогда не отключает других пользователей.', + skipTLSVerify: 'Пропустить проверку TLS', + skipTLSVerifyTooltip: 'Отключите проверку сертификата для соединений LDAPS.', + skipTLSVerifyHelper: + 'Используйте только с доверенным самозаверяющим сертификатом. Этот параметр не зависит от строгой синхронизации.', + connectTimeout: 'Таймаут соединения (секунды)', + searchPageSize: 'Размер страницы запроса LDAP', + restore: 'Восстановить', + testConnection: 'Тестовое соединение', + testLogin: 'Тестовый вход', + userImport: 'Импортировать пользователей', + saveBeforeImport: 'Сохраните текущие настройки AD/LDAP перед импортом пользователей.', + format: 'Формат', + restoreExample: 'Пример восстановления', + mappingValid: 'Действителен JSON; name настроен.', + mappingInvalid: 'Введите действительный JSON.', + mappingObject: 'Сопоставление атрибутов должно быть объектом JSON.', + mappingOnlyName: 'Поддерживается только сопоставление name.', + mappingStringValues: 'Каждый сопоставленный атрибут должен быть строкой.', + mappingNameRequired: 'name должен быть непустой строкой.', + restored: 'Последние сохраненные настройки были восстановлены.', + connectionTestSuccess: 'Проверка соединения LDAP прошла успешно.', + recentTestSuccess: 'Последний тест прошел успешно: {0}', + recentTestFailed: 'Последний тест не пройден: {0}', + serverURLRequired: 'Введите URL-адрес сервера LDAP.', + serverURLInvalid: 'Используйте действительный URL-адрес ldap:// или ldaps://.', + userBaseDNRequired: 'Введите пользователя Base DN.', + bindDNRequired: 'Введите привязку DN.', + passwordRequired: 'Введите пароль.', + userFilterRequired: 'Введите фильтр пользователей.', + connectTimeoutRequired: 'Введите тайм-аут соединения.', + searchPageSizeRequired: 'Введите размер страницы запроса LDAP.', + sync: { + title: 'Запланированная синхронизация', + description: + 'Чтение полного каталога LDAP по расписанию и поддержка импортированных пользователей LDAP в 1Panel.', + enable: 'Включить расписание', + enableHelper: + 'При отключении автоматическое выполнение останавливается; ручная синхронизация остается доступной.', + schedule: 'Расписание', + daily: 'Ежедневно', + weekly: 'Еженедельно', + customCron: 'Пользовательский Cron', + preview: 'Предварительный просмотр', + previewTitle: 'Следующие 5 запусков', + previewEmpty: 'Нет времени выполнения', + cronHelper: + 'Используйте стандартное выражение Cron из пяти полей: минуты, часы, день, месяц, день недели.', + autoImport: 'Импортировать новых пользователей', + autoImportHelper: + 'Если этот параметр отключен, для импортированных пользователей LDAP сохраняются только идентификаторы каталогов и статус; новые пользователи не создаются.', + defaultRole: 'Новая роль пользователя', + defaultRolePlaceholder: 'Выберите роль', + defaultRoleHelper: + 'Применяется только к пользователям, созданным с помощью запланированной синхронизации.', + defaultRoleRequired: 'Выберите роль для новых пользователей LDAP.', + strictSyncHelper: + 'Пользователи, отсутствующие в полном запросе, отключаются, а их сеансы очищаются; пользователи, роли и разрешения не удаляются.', + safetyTitle: 'Отсутствующие пользователи обрабатываются только после полного запроса LDAP.', + safetyDescription: + 'Неудачный запрос, тайм-аут или неполный постраничный результат никогда не меняют статус пользователя. Область синхронизации соответствует пользователю Base DN, фильтру и сопоставлению атрибутов.', + runNow: 'Синхронизировать сейчас', + lastRunSuccess: 'Последняя синхронизация завершилась успешно: {0}.', + lastRunFailed: 'Последняя синхронизация не удалась: {0}.', + lastRunRunning: 'Синхронизация началась: {0}', + sourceDisabled: 'Включите и сохраните AD/LDAP перед запуском синхронизации.', + cronRequired: 'Введите выражение Cron.', + saveBeforeRun: 'Сохраните настройки синхронизации перед запуском задачи.', + runConfirmTitle: 'Запустить строгую синхронизацию', + runConfirmDescription: + 'Пользователи LDAP, отсутствующие в полном запросе, будут отключены, а их активные сеансы удалены. Продолжать?', + runSuccess: 'Синхронизация LDAP завершена.', + weekdays: { + 0: 'воскресенье', + 1: 'понедельник', + 2: 'вторник', + 3: 'среда', + 4: 'Четверг', + 5: 'пятница', + 6: 'Суббота', + }, + }, + syncLogs: { + title: 'Синхронизировать журналы', + description: 'Просмотрите результаты запланированной и ручной синхронизации LDAP.', + startedAt: 'Время начала', + trigger: 'Тип запуска', + manual: 'Вручную', + scheduled: 'Запланировано', + success: 'Успех', + failed: 'Не удалось', + running: 'Выполняется', + result: 'Результат', + resultSummary: 'Создано {0}, обновлено {1}, отсутствует {2}', + duration: 'Продолжительность', + action: 'Действие', + }, + testLoginTitle: 'Проверка входа AD/LDAP', + testLoginDesc: + 'Привяжите учетные данные пользователя AD/LDAP только для проверки аутентификации. Сеанс 1Panel не создается.', + ldapUsername: 'Имя пользователя LDAP', + usernameRequired: 'Введите имя пользователя LDAP.', + startTest: 'Начать тест', + testLoginSuccess: 'Аутентификация прошла успешно.', + testLoginSuccessWithDN: 'Аутентификация прошла успешно. Пользователь DN: {0}', + import: { + title: 'Импорт пользователей AD/LDAP', + source: 'Источник данных: каталог AD/LDAP.', + lastRead: 'Последнее чтение: {0}', + cacheHit: 'Кэшированный результат', + keywordPlaceholder: 'Поиск имени пользователя', + search: 'Поиск', + refresh: 'Читать из LDAP', + refreshTip: 'Игнорируйте кратковременный кеш и снова прочитайте каталог LDAP.', + loadFailed: 'Не удалось прочитать каталог LDAP.', + retry: 'Повторить попытку', + noData: 'Пользователи каталога не найдены.', + username: 'Имя пользователя', + status: 'Статус', + changes: 'Изменения', + noChanges: 'Никаких изменений', + importable: 'Готов к импорту', + updateAvailable: 'Доступно обновление', + upToDate: 'Актуально', + conflict: 'Конфликт имен', + selectedCount: '{0} выбрано', + totalCount: '{0} пользователей', + newUserRole: 'Новая роль пользователя', + newUserRoleRequired: 'Выберите роль для новых пользователей.', + noNewUsers: 'В этой операции нет новых пользователей.', + roleOnlyForNewUsers: 'Выбранная роль применяется только к вновь созданным пользователям.', + strictOff: 'Строгая синхронизация отключена. Полный импорт не отключит пользователей.', + importSelected: 'Выбран импорт/обновление ({0})', + importAll: 'Импортировать/обновить все ({0})', + previewTitle: 'Подтвердить полный импорт', + previewDesc: + 'Полный каталог LDAP был прочитан. Ключевое слово поиска не ограничивает эту операцию.', + created: 'Создать', + updated: 'Обновить', + unchanged: 'Без изменений', + conflicts: 'Конфликты', + missing: 'Отключить', + reactivated: 'Повторно активировать', + strictWarning: + 'Строгая синхронизация включена. Пользователи, отсутствующие в LDAP, не могут войти в систему, но их записи, роли и разрешения сохраняются.', + missingUsers: 'Пользователи отсутствуют в LDAP', + missingScope: 'Затрагивается только этот источник LDAP.', + willDisable: 'Будет отключен', + confirmAll: 'Подтвердить импорт', + confirmAllWithMissing: 'Подтвердить импорт и отключить {0} пользователей', + executeSuccess: 'Пользователи LDAP обработаны успешно.', + queryExpired: 'Срок действия каталога истек. Прочтите еще раз LDAP.', + planIncomplete: 'Полное чтение каталога неполное и не может быть выполнено.', + }, + }, + }, }, app: { app: 'APP', diff --git a/frontend/src/lang/modules/tr.ts b/frontend/src/lang/modules/tr.ts index e7a6a3f87..3fed8ad2b 100644 --- a/frontend/src/lang/modules/tr.ts +++ b/frontend/src/lang/modules/tr.ts @@ -4286,6 +4286,71 @@ const message = { noFail: 'Bağlama hatası sistem başlangıcını etkilemez', }, xpack: { + ldap: { + source: 'Kaynak', + directoryMissing: "LDAP'te bulunamadı", + localCredentialsManaged: + 'Kullanıcı adı ve parola LDAP tarafından yönetilir ve yerel olarak değiştirilemez.', + sources: { + local: 'Yerel', + ldap: 'LDAP', + }, + importUsers: 'AD/LDAP kullanıcılarını içe aktar', + searchUsersPlaceholder: 'Kullanıcı adını ara', + readFromLDAP: "LDAP'dan okuyun", + selectedUsers: '{0} seçildi', + queriedAt: 'Okuma zamanı', + cachedResult: 'Önbelleğe alınmış sonuç', + roleForNewUsers: 'Yeni kullanıcılar için rol', + selectRole: 'Bir rol seçin', + roleOnlyForNewUsers: 'Bir rol yalnızca içe aktarma işleminde kullanıcılar oluşturduğunda gereklidir.', + roleRequiredForNewUsers: 'Yeni LDAP kullanıcıları için bir rol seçin.', + changedFields: 'Değiştirilen alanlar', + importSelected: 'Seçileni içe aktar', + importAll: 'Tümünü içe aktar', + importPreview: 'AD/LDAP içe aktarma önizlemesi', + importCompleted: 'AD/LDAP içe aktarma tamamlandı', + incompletePreview: "LDAP dizin okuması tamamlanmadı. LDAP'dan tekrar okuyun.", + missingUsersWarning: "LDAP'da eksik olan kullanıcılar katı senkronizasyonla devre dışı bırakılacak.", + missingUsersWarningDetail: '{0} yerel LDAP kullanıcıları artık oturum açamayacak.', + action: 'Eylem', + reason: 'Sebep', + noImportChanges: 'İçe aktarma değişikliği yok', + confirmImport: 'İçe aktarmayı onayla', + created: 'Oluştur', + updated: 'Güncelleme', + reactivated: 'Yeniden etkinleştir', + unchanged: 'değişmedi', + conflicts: 'Çatışmalar', + missing: 'Eksik', + missingUsersConfirm: + "LDAP'da bulunmayan {0} kullanıcı devre dışı bırakılacak ve oturumları kapatılacak. Devam edilsin mi?", + strictSyncConfirm: 'Kesin senkronizasyonu onaylayın', + status: { + importable: 'Yeni kullanıcı', + update_available: 'Güncelleme mevcut', + up_to_date: 'güncel', + conflict: 'Çatışma', + }, + fields: { + name: 'Kullanıcı adı', + externalDN: 'Dizin DN', + externalID: 'Harici Kimlik', + authSourceStatus: 'Kimlik doğrulama durumu', + }, + actions: { + created: 'Oluştur', + updated: 'Güncelleme', + reactivated: 'Yeniden etkinleştir', + unchanged: 'değişmedi', + skipped: 'Atlandı', + conflicts: 'Çatışma', + conflict: 'Çatışma', + missing: 'Devre dışı bırak', + errors: 'Hata', + error: 'Hata', + }, + }, expiresEnterpriseAlert: 'Nazik hatırlatma: Enterprise Edition lisansınız {0} gün içinde sona erecek ve tüm Enterprise Edition özellikleri kullanılamaz hale gelecektir. Lütfen devam eden kullanım için zamanında yenileyin.', expiresProAlert: @@ -4840,6 +4905,223 @@ const message = { masterOnlyPermissionHelper: 'Bu izin yalnızca ana düğümde geçerlidir.', view: 'Görüntüle', manage: 'Yönet', + authManage: 'Kimlik doğrulama yönetimi', + auth: { + providerNavigation: 'Kimlik doğrulama sağlayıcıları', + providers: { + ldap: 'AD/LDAP', + passkey: 'Passkey', + radius: 'Radius', + oidc: 'OIDC', + saml2: 'SAML2', + cas: 'CAS', + oauth2: 'OAuth2', + dingtalk: 'DingTalk', + feishu: 'Feishu', + wecom: 'WeCom', + }, + providerDescriptions: { + ldap: 'Active Directory, OpenLDAP ve diğer LDAP hizmetleriyle uyumludur', + passkey: 'Parolasız oturum açmak için cihaz kimlik bilgilerini kullanın', + radius: 'Radius hizmeti aracılığıyla ağ erişimini doğrulayın', + oidc: 'Kurumsal çoklu oturum açmayı OpenID Connect ile bağlayın', + saml2: "Kurumsal kimlik federasyonu için SAML2'yi kullanın", + cas: 'Tek oturum açma için merkezi bir kimlik doğrulama hizmetine bağlanın', + oauth2: 'Uyumlu bir OAuth2 kimlik hizmetine bağlanın', + dingtalk: 'DingTalk kuruluş kimliğini ve QR ile oturum açmayı kullanın', + feishu: 'Feishu kuruluş kimliğini ve hesap senkronizasyonunu kullanma', + wecom: 'WeCom üye kimliğiyle kimlik doğrulama', + }, + 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.', + ldap: { + enable: 'Etkinleştir', + enabled: 'Etkin', + disabled: 'Devre dışı', + connection: 'Temel bağlantı', + connectionDesc: + 'Kullanıcıları aramak için kullanılan dizin hizmetini ve bağlama hesabını yapılandırın.', + serverURL: "Sunucu URL'si", + serverURLHelper: "ldap:// ve ldaps:// URL'lerini destekler.", + userBaseDN: 'Kullanıcı Base DN', + userBaseDNHelper: + "LDAP kullanıcı aramaları için DN'nun başlatılması; bu bir OU, CN veya etki alanı kökü DN olabilir.", + bindDN: "DN'yu bağla", + bindPassword: 'Şifre', + passwordSaved: 'Kaydedilen şifreyi korumak için boş bırakın', + userSearch: 'Kullanıcı arama', + userSearchDesc: + 'Kullanıcı arama tabanını ve filtreyi ayarlayın, ardından 1Panel name olarak kullanılan LDAP niteliğini eşleyin.', + userFilter: 'Kullanıcı filtresi', + userFilterTooltip: + "Tam dizin okunması için %(user)s'yu çıkışlı kullanıcı adıyla veya * ile değiştirin.", + userFilterHelper: 'Kullanıcı adları LDAP filtresine eklenmeden önce çıkış karakteri kullanılır.', + attributeMap: 'Özellik eşleme', + attributeMapTooltip: 'JSON, 1Panel name alanından bir LDAP özniteliğine eşleme.', + attributeMapHelper: '1Panel name alanına eşlenen LDAP niteliğini ayarlayın.', + advanced: 'Gelişmiş ayarlar', + advancedDesc: 'TLS ve LDAP sorgu sayfalamayı yapılandırın.', + strictSync: 'Sıkı senkronizasyon', + strictSyncTooltip: + 'Tam bir içe aktarma işleminin ardından, bu LDAP kaynağında eksik olan kullanıcılar devre dışı bırakılır ancak silinmez.', + strictSyncHelper: + 'Yalnızca tam bir tam içe aktarma için geçerlidir. Seçilen kullanıcıları içe aktarmak hiçbir zaman diğer kullanıcıları devre dışı bırakmaz.', + skipTLSVerify: 'TLS doğrulamasını atla', + skipTLSVerifyTooltip: 'LDAPS bağlantıları için sertifika doğrulamayı devre dışı bırakın.', + skipTLSVerifyHelper: + 'Yalnızca güvenilir, kendinden imzalı bir sertifikayla kullanın. Bu ayar katı senkronizasyondan bağımsızdır.', + connectTimeout: 'Bağlantı zaman aşımı (saniye)', + searchPageSize: 'LDAP sorgu sayfası boyutu', + restore: 'Geri yükle', + testConnection: 'Bağlantıyı test edin', + testLogin: 'Oturum açmayı test edin', + userImport: 'Kullanıcıları içe aktar', + saveBeforeImport: 'Kullanıcıları içe aktarmadan önce mevcut AD/LDAP ayarlarını kaydedin.', + format: 'Biçim', + restoreExample: 'Örneği geri yükle', + mappingValid: 'Geçerli JSON; name yapılandırıldı.', + mappingInvalid: 'Geçerli JSON girin.', + mappingObject: 'Öznitelik eşlemesi bir JSON nesnesi olmalıdır.', + mappingOnlyName: 'Yalnızca name eşlemesi desteklenir.', + mappingStringValues: 'Her eşlenen öznitelik bir dize olmalıdır.', + mappingNameRequired: 'name boş olmayan bir dize olmalıdır.', + restored: 'Son kaydedilen ayarlar geri yüklendi.', + connectionTestSuccess: 'LDAP bağlantı testi başarılı oldu.', + recentTestSuccess: 'Son test başarılı oldu: {0}', + recentTestFailed: 'Son test başarısız oldu: {0}', + serverURLRequired: "LDAP sunucu URL'sini girin.", + serverURLInvalid: "Geçerli bir ldap:// veya ldaps:// URL'si kullanın.", + userBaseDNRequired: 'Base DN Kullanıcısını girin.', + bindDNRequired: 'DN bağlamasını girin.', + passwordRequired: 'Şifreyi girin.', + userFilterRequired: 'Kullanıcı filtresini girin.', + connectTimeoutRequired: 'Bağlantı zaman aşımını girin.', + searchPageSizeRequired: 'LDAP sorgu sayfası boyutunu girin.', + sync: { + title: 'Planlanmış senkronizasyon', + description: + "LDAP dizininin tamamını bir programa göre okuyun ve 1Panel'da içe aktarılan LDAP kullanıcılarını koruyun.", + enable: 'Programı etkinleştir', + enableHelper: + 'Devre dışı bırakıldığında otomatik yürütme durur; manuel senkronizasyon kullanılabilir durumda kalır.', + schedule: 'Program', + daily: 'Günlük', + weekly: 'Haftalık', + customCron: 'Özel Cron', + preview: 'Önizleme', + previewTitle: 'Sonraki 5 çalıştırma', + previewEmpty: 'Yürütme süresi yok', + cronHelper: + 'Standart beş alanlı Cron ifadesini kullanın: dakika, saat, gün, ay, haftanın günü.', + autoImport: 'Yeni kullanıcıları içe aktar', + autoImportHelper: + 'Devre dışı bırakıldığında, içe aktarılan LDAP kullanıcıları için yalnızca dizin tanımlayıcıları ve durumu korunur; yeni kullanıcı oluşturulmaz.', + defaultRole: 'Yeni kullanıcı rolü', + defaultRolePlaceholder: 'Bir rol seçin', + defaultRoleHelper: + 'Yalnızca zamanlanmış senkronizasyonla oluşturulan kullanıcılar için geçerlidir.', + defaultRoleRequired: 'Yeni LDAP kullanıcıları için bir rol seçin.', + strictSyncHelper: + 'Tam sorguda eksik olan kullanıcılar devre dışı bırakılır ve oturumları temizlenir; kullanıcılar, roller ve izinler silinmez.', + safetyTitle: 'Eksik kullanıcılar yalnızca LDAP tam sorgusunun tamamlanmasından sonra işlenir', + safetyDescription: + 'Başarısız bir sorgu, zaman aşımı veya tamamlanmamış sayfalanmış sonuç, kullanıcı durumunu hiçbir zaman değiştirmez. Senkronizasyon kapsamı Kullanıcı Base DN, filtre ve öznitelik eşlemesini takip eder.', + runNow: 'Şimdi senkronize et', + lastRunSuccess: 'Son senkronizasyon başarılı oldu: {0}', + lastRunFailed: 'Son senkronizasyon başarısız oldu: {0}', + lastRunRunning: 'Senkronizasyon başladı: {0}', + sourceDisabled: "Senkronizasyonu çalıştırmadan önce AD/LDAP'yu etkinleştirin ve kaydedin.", + cronRequired: 'Bir Cron ifadesi girin.', + saveBeforeRun: 'Görevi çalıştırmadan önce senkronizasyon ayarlarını kaydedin.', + runConfirmTitle: 'Kesin senkronizasyonu çalıştır', + runConfirmDescription: + 'Tam sorguda bulunmayan LDAP kullanıcıları devre dışı bırakılacak ve etkin oturumları kapatılacaktır. Devam edilsin mi?', + runSuccess: 'LDAP senkronizasyonu tamamlandı.', + weekdays: { + 0: 'Pazar', + 1: 'Pazartesi', + 2: 'Salı', + 3: 'Çarşamba', + 4: 'perşembe', + 5: 'Cuma', + 6: 'Cumartesi', + }, + }, + syncLogs: { + title: 'Günlükleri senkronize et', + description: 'Planlanmış ve manuel LDAP senkronizasyon sonuçlarını inceleyin.', + startedAt: 'Başlangıç zamanı', + trigger: 'Çalıştırma türü', + manual: 'Manuel', + scheduled: 'planlanmış', + success: 'Başarı', + failed: 'Başarısız', + running: 'Çalışıyor', + result: 'Sonuç', + resultSummary: '{0} oluşturuldu, {1} güncellendi, {2} eksik', + duration: 'Süre', + action: 'Eylem', + }, + testLoginTitle: 'AD/LDAP oturum açmayı test et', + testLoginDesc: + 'Yalnızca kimlik doğrulamayı test etmek için AD/LDAP kullanıcı kimlik bilgileriyle bağlantı kurun. 1Panel oturumu oluşturulmadı.', + ldapUsername: 'LDAP kullanıcı adı', + usernameRequired: 'LDAP kullanıcı adını girin.', + startTest: 'Testi başlat', + testLoginSuccess: 'Kimlik doğrulama başarılı oldu.', + testLoginSuccessWithDN: 'Kimlik doğrulama başarılı oldu. Kullanıcı DN: {0}', + import: { + title: 'AD/LDAP kullanıcılarını içe aktar', + source: 'Veri kaynağı: AD/LDAP dizini', + lastRead: 'Son okuma: {0}', + cacheHit: 'Önbelleğe alınmış sonuç', + keywordPlaceholder: 'Kullanıcı adını ara', + search: 'Ara', + refresh: "LDAP'dan okuyun", + refreshTip: 'Kısa süreli önbelleği göz ardı edin ve LDAP dizinini yeniden okuyun.', + loadFailed: 'LDAP dizini okunamadı.', + retry: 'Yeniden dene', + noData: 'Hiçbir dizin kullanıcısı bulunamadı.', + username: 'Kullanıcı adı', + status: 'Durum', + changes: 'Değişiklikler', + noChanges: 'Değişiklik yok', + importable: 'İçe aktarmaya hazır', + updateAvailable: 'Güncelleme mevcut', + upToDate: 'güncel', + conflict: 'Ad çakışması', + selectedCount: '{0} seçildi', + totalCount: '{0} kullanıcı', + newUserRole: 'Yeni kullanıcı rolü', + newUserRoleRequired: 'Yeni kullanıcılar için bir rol seçin.', + noNewUsers: 'Bu operasyonda yeni kullanıcı yok.', + roleOnlyForNewUsers: 'Seçilen rol yalnızca yeni oluşturulan kullanıcılara uygulanır.', + strictOff: + 'Katı senkronizasyon devre dışı bırakıldı. Tam içe aktarma, kullanıcıları devre dışı bırakmaz.', + importSelected: 'İçe aktarma/güncelleme seçildi ({0})', + importAll: 'Tümünü içe aktar/güncelle ({0})', + previewTitle: 'Tam içe aktarmayı onaylayın', + previewDesc: 'LDAP dizininin tamamı okundu. Arama anahtar sözcüğü bu işlemi sınırlamaz.', + created: 'Oluştur', + updated: 'Güncelleme', + unchanged: 'değişmedi', + conflicts: 'Çatışmalar', + missing: 'Devre dışı bırak', + reactivated: 'Yeniden etkinleştir', + strictWarning: + "Katı senkronizasyon etkinleştirildi. LDAP'da bulunmayan kullanıcılar oturum açamaz ancak kayıtları, rolleri ve izinleri korunur.", + missingUsers: "LDAP'da eksik olan kullanıcılar", + missingScope: 'Yalnızca bu LDAP kaynağı etkilenir.', + willDisable: 'Devre dışı bırakılacak', + confirmAll: 'İçe aktarmayı onayla', + confirmAllWithMissing: 'İçe aktarmayı onayla ve {0} kullanıcıyı devre dışı bırak', + executeSuccess: 'LDAP kullanıcıları başarıyla işlendi.', + queryExpired: "Dizin sonucunun süresi doldu. LDAP'dan tekrar okuyun.", + planIncomplete: 'Tam dizin okuması tamamlanmadı ve yürütülemiyor.', + }, + }, + }, }, app: { app: 'Uygulama', diff --git a/frontend/src/lang/modules/zh-Hant.ts b/frontend/src/lang/modules/zh-Hant.ts index 446e3c0fb..e64aa63e7 100644 --- a/frontend/src/lang/modules/zh-Hant.ts +++ b/frontend/src/lang/modules/zh-Hant.ts @@ -3910,6 +3910,59 @@ const message = { noFail: '掛載失敗不影響系統啟動', }, xpack: { + ldap: { + source: '來源', + directoryMissing: 'LDAP 中不存在', + localCredentialsManaged: '此使用者的使用者名稱和密碼由 LDAP 管理,無法在本機修改。', + sources: { + local: '本機', + ldap: 'LDAP', + }, + importUsers: '匯入 AD/LDAP 使用者', + searchUsersPlaceholder: '搜尋使用者名稱', + readFromLDAP: '從 LDAP 讀取', + selectedUsers: '已選擇 {0} 項', + queriedAt: '讀取時間', + cachedResult: '快取結果', + roleForNewUsers: '新使用者角色', + selectRole: '請選擇角色', + roleOnlyForNewUsers: '僅在本次處理包含新使用者時需要選擇角色。', + roleRequiredForNewUsers: '請為新的 LDAP 使用者選擇角色。', + changedFields: '變更欄位', + importSelected: '匯入/更新所選', + importAll: '匯入/更新全部', + importPreview: 'AD/LDAP 匯入預覽', + importCompleted: 'AD/LDAP 使用者處理完成', + incompletePreview: 'LDAP 目錄未完整讀取,請重新從 LDAP 讀取。', + missingUsersWarning: '嚴格同步將停用 LDAP 中不存在的使用者。', + missingUsersWarningDetail: '{0} 個本機 LDAP 使用者將無法繼續登入。', + action: '處理結果', + reason: '原因', + noImportChanges: '沒有需要處理的變更', + confirmImport: '確認匯入', + created: '新增', + updated: '更新', + reactivated: '恢復', + unchanged: '無變更', + conflicts: '衝突', + missing: '將停用', + missingUsersConfirm: 'LDAP 中不存在的 {0} 個使用者將被停用並登出,是否繼續?', + strictSyncConfirm: '確認嚴格同步', + status: { importable: '可匯入', update_available: '待更新', up_to_date: '已是最新', conflict: '同名衝突' }, + fields: { name: '使用者名稱', externalDN: '目錄 DN', externalID: '外部識別', authSourceStatus: '認證狀態' }, + actions: { + created: '新增', + updated: '更新', + reactivated: '恢復', + unchanged: '無變更', + skipped: '略過', + conflicts: '衝突', + conflict: '衝突', + missing: '停用', + errors: '錯誤', + error: '錯誤', + }, + }, expiresEnterpriseAlert: '溫馨提醒:您的企業版許可證將在 {0} 天後到期,屆時所有企業版功能將無法繼續使用。', expiresProAlert: '溫馨提醒:您的專業版許可證將在 {0} 天後到期,屆時所有專業版功能將無法繼續使用。', name: '商業版', @@ -4455,6 +4508,209 @@ const message = { masterOnlyPermissionHelper: '該權限僅在主節點生效。', view: '檢視', manage: '管理', + authManage: '認證管理', + auth: { + providerNavigation: '認證類型', + providers: { + ldap: 'AD/LDAP', + passkey: 'Passkey', + radius: 'Radius', + oidc: 'OIDC', + saml2: 'SAML2', + cas: 'CAS', + oauth2: 'OAuth2', + dingtalk: '釘釘', + feishu: '飛書', + wecom: '企業微信', + }, + providerDescriptions: { + ldap: '相容 Active Directory、OpenLDAP 等 LDAP 服務', + passkey: '使用裝置憑證進行無密碼安全登入', + radius: '透過 Radius 服務完成網路存取認證', + oidc: '使用 OpenID Connect 接入企業單一登入', + saml2: '透過 SAML2 完成企業身分聯合登入', + cas: '接入集中式認證服務實現單一登入', + oauth2: '接入相容 OAuth2 的第三方身分服務', + dingtalk: '使用釘釘組織身分和掃碼登入', + feishu: '使用飛書組織身分和帳號同步', + wecom: '使用企業微信成員身分認證', + }, + planned: '待接入', + plannedTitle: '{0} 認證設定', + plannedDesc: '該認證方式正在規劃中,暫不可用。', + ldap: { + enable: '是否啟用', + enabled: '已啟用', + disabled: '未啟用', + connection: '基礎連線', + connectionDesc: '設定目錄服務和用於搜尋使用者的綁定帳號。', + serverURL: '伺服器位址', + serverURLHelper: '支援 ldap:// 和 ldaps:// 位址。', + userBaseDN: '使用者 Base DN', + userBaseDNHelper: 'LDAP 使用者搜尋的起始 DN,可使用 OU、CN 或網域根 DN。', + bindDN: '綁定 DN', + bindPassword: '密碼', + passwordSaved: '留空則保留已儲存的密碼', + userSearch: '使用者搜尋', + userSearchDesc: '設定使用者搜尋基準與過濾器,並映射到 1Panel 使用者名稱欄位。', + userFilter: '使用者篩選器', + userFilterTooltip: '按使用者名稱查詢時替換 %(user)s,全量讀取時替換為 *。', + userFilterHelper: '搜尋和認證時會對使用者名稱執行 LDAP filter escaping。', + attributeMap: '映射屬性', + attributeMapTooltip: '1Panel 使用者名稱欄位(name)到 LDAP 屬性的 JSON 映射。', + attributeMapHelper: '填寫映射到 1Panel 使用者名稱欄位(name)的 LDAP 屬性。', + advanced: '進階設定', + advancedDesc: '設定 TLS 和 LDAP 查詢分頁。', + strictSync: '嚴格同步', + strictSyncTooltip: '完整全量處理後,LDAP 中不存在的同源使用者將被停用但不會刪除。', + strictSyncHelper: '僅作用於完整成功的全量處理;匯入選中使用者時不會停用其他使用者。', + skipTLSVerify: '略過 TLS 憑證驗證', + skipTLSVerifyTooltip: '連線 LDAPS 時不驗證伺服器端憑證。', + skipTLSVerifyHelper: '僅用於可信任的自簽憑證;此設定與嚴格同步互相獨立。', + connectTimeout: '連線逾時(秒)', + searchPageSize: 'LDAP 查詢分頁大小', + restore: '還原', + testConnection: '測試連線', + testLogin: '測試登入', + userImport: '使用者匯入', + saveBeforeImport: '請先儲存目前 AD/LDAP 設定,再匯入使用者。', + format: '格式化', + restoreExample: '還原範例', + mappingValid: 'JSON 格式正確,name 已設定。', + mappingInvalid: '請輸入有效的 JSON。', + mappingObject: '映射屬性必須是 JSON 物件。', + mappingOnlyName: '僅支援 name 映射。', + mappingStringValues: '每個映射屬性都必須是字串。', + mappingNameRequired: 'name 必須是非空字串。', + restored: '已還原為上次儲存的設定。', + connectionTestSuccess: 'LDAP 連線測試成功。', + recentTestSuccess: '最近測試成功:{0}', + recentTestFailed: '最近測試失敗:{0}', + serverURLRequired: '請輸入 LDAP 伺服器位址。', + serverURLInvalid: '請輸入有效的 ldap:// 或 ldaps:// 位址。', + userBaseDNRequired: '請輸入使用者 Base DN。', + bindDNRequired: '請輸入綁定 DN。', + passwordRequired: '請輸入密碼。', + userFilterRequired: '請輸入使用者篩選器。', + connectTimeoutRequired: '請輸入連線逾時時間。', + searchPageSizeRequired: '請輸入 LDAP 查詢分頁大小。', + sync: { + title: '定時同步', + description: '定期讀取 LDAP 全量使用者,並維護 1Panel 中的 LDAP 使用者。', + enable: '是否啟用', + enableHelper: '關閉後不再自動執行,仍可手動立即同步。', + schedule: '執行週期', + daily: '每天', + weekly: '每週', + customCron: '自訂 Cron', + preview: '預覽', + previewTitle: '未來 5 次執行', + previewEmpty: '暫無可用執行時間', + cronHelper: '使用「分 時 日 月 週」五段式 Cron 運算式。', + autoImport: '自動匯入新使用者', + autoImportHelper: '關閉後,僅維護已匯入 LDAP 使用者的目錄識別與狀態,不會自動建立新使用者。', + defaultRole: '新使用者角色', + defaultRolePlaceholder: '請選擇角色', + defaultRoleHelper: '僅用於定時同步中新建立的使用者,後續可在使用者管理中調整。', + defaultRoleRequired: '請選擇新 LDAP 使用者的角色。', + strictSyncHelper: + '全量查詢中缺失的同源 LDAP 使用者將被停用並清理工作階段,但不會刪除使用者、角色和權限。', + safetyTitle: '僅在 LDAP 全量查詢完整成功後處理缺失使用者', + safetyDescription: + '查詢失敗、逾時或分頁結果不完整時,本次工作不會變更使用者狀態。同步範圍沿用使用者搜尋中的 Base DN、篩選器和屬性對應。', + runNow: '立即同步', + lastRunSuccess: '最近同步成功:{0}', + lastRunFailed: '最近同步失敗:{0}', + lastRunRunning: '同步開始時間:{0}', + sourceDisabled: '請先啟用並儲存 AD/LDAP,再執行同步。', + cronRequired: '請輸入 Cron 運算式。', + saveBeforeRun: '請先儲存同步設定,再執行同步。', + runConfirmTitle: '執行嚴格同步', + runConfirmDescription: '完整全量查詢中缺失的 LDAP 使用者將被停用並清理活動工作階段,是否繼續?', + runSuccess: 'LDAP 同步完成。', + weekdays: { + 0: '週日', + 1: '週一', + 2: '週二', + 3: '週三', + 4: '週四', + 5: '週五', + 6: '週六', + }, + }, + syncLogs: { + title: '同步記錄', + description: '查看定時和手動 LDAP 同步的執行結果。', + startedAt: '開始時間', + trigger: '觸發方式', + manual: '手動執行', + scheduled: '定時執行', + success: '成功', + failed: '失敗', + running: '執行中', + result: '執行結果', + resultSummary: '新增 {0},更新 {1},缺失 {2}', + duration: '耗時', + action: '處理動作', + }, + testLoginTitle: '測試 AD/LDAP 登入', + testLoginDesc: + '使用 AD/LDAP 使用者憑證執行 bind 驗證,僅測試認證能力,不建立 1Panel 登入工作階段。', + ldapUsername: 'LDAP 使用者名稱', + usernameRequired: '請輸入 LDAP 使用者名稱。', + startTest: '開始測試', + testLoginSuccess: '認證成功。', + testLoginSuccessWithDN: '認證成功,使用者 DN:{0}', + import: { + title: '匯入 AD/LDAP 使用者', + source: '資料來源:AD/LDAP 目錄', + lastRead: '最近讀取:{0}', + cacheHit: '使用快取結果', + keywordPlaceholder: '搜尋使用者名稱', + search: '搜尋', + refresh: '從 LDAP 讀取', + refreshTip: '忽略短期快取並重新讀取 LDAP 目錄。', + loadFailed: 'LDAP 目錄讀取失敗。', + retry: '重試', + noData: '未找到目錄使用者。', + username: '使用者名稱', + status: '狀態', + changes: '變更欄位', + noChanges: '無變化', + importable: '可匯入', + updateAvailable: '待更新', + upToDate: '已是最新', + conflict: '同名衝突', + selectedCount: '已選擇 {0} 項', + totalCount: '共 {0} 個使用者', + newUserRole: '新使用者角色', + newUserRoleRequired: '請選擇新使用者角色。', + noNewUsers: '本次無新使用者。', + roleOnlyForNewUsers: '所選角色僅套用於本次新建使用者。', + strictOff: '嚴格同步未啟用,全量處理不會停用使用者。', + importSelected: '匯入/更新選中({0})', + importAll: '匯入/更新全部({0})', + previewTitle: '確認全量處理', + previewDesc: '已完整讀取 LDAP 目錄,目前搜尋關鍵字不會縮小本次處理範圍。', + created: '新建', + updated: '更新', + unchanged: '無變化', + conflicts: '衝突', + missing: '將停用', + reactivated: '恢復', + strictWarning: + '嚴格同步已啟用。LDAP 中不存在的同源使用者將無法繼續登入,但不會刪除使用者、角色和本機權限。', + missingUsers: 'LDAP 中不存在的使用者', + missingScope: '僅處理目前 LDAP 認證來源。', + willDisable: '將停用', + confirmAll: '確認匯入', + confirmAllWithMissing: '確認匯入並停用 {0} 個使用者', + executeSuccess: 'LDAP 使用者處理成功。', + queryExpired: '目錄查詢結果已過期,請重新從 LDAP 讀取。', + planIncomplete: 'LDAP 目錄未完整讀取,無法執行全量處理。', + }, + }, + }, }, logExport: { title: '匯出日誌', diff --git a/frontend/src/lang/modules/zh.ts b/frontend/src/lang/modules/zh.ts index 909946b76..60c1f91ef 100644 --- a/frontend/src/lang/modules/zh.ts +++ b/frontend/src/lang/modules/zh.ts @@ -3910,6 +3910,59 @@ const message = { noFail: '挂载失败不影响系统启动', }, xpack: { + ldap: { + source: '来源', + directoryMissing: 'LDAP 中不存在', + localCredentialsManaged: '该用户的用户名和密码由 LDAP 管理,无法在本地修改。', + sources: { + local: '本地', + ldap: 'LDAP', + }, + importUsers: '导入 AD/LDAP 用户', + searchUsersPlaceholder: '搜索用户名', + readFromLDAP: '从 LDAP 读取', + selectedUsers: '已选择 {0} 项', + queriedAt: '读取时间', + cachedResult: '缓存结果', + roleForNewUsers: '新用户角色', + selectRole: '请选择角色', + roleOnlyForNewUsers: '仅在本次处理包含新用户时需要选择角色。', + roleRequiredForNewUsers: '请为新的 LDAP 用户选择角色。', + changedFields: '变更字段', + importSelected: '导入/更新选中', + importAll: '导入/更新全部', + importPreview: 'AD/LDAP 导入预览', + importCompleted: 'AD/LDAP 用户处理完成', + incompletePreview: 'LDAP 目录未完整读取,请重新从 LDAP 读取。', + missingUsersWarning: '严格同步将停用 LDAP 中不存在的用户。', + missingUsersWarningDetail: '{0} 个本地 LDAP 用户将无法继续登录。', + action: '处理结果', + reason: '原因', + noImportChanges: '没有需要处理的变更', + confirmImport: '确认导入', + created: '新建', + updated: '更新', + reactivated: '恢复', + unchanged: '无变化', + conflicts: '冲突', + missing: '将停用', + missingUsersConfirm: 'LDAP 中不存在的 {0} 个用户将被停用并退出登录,是否继续?', + strictSyncConfirm: '确认严格同步', + status: { importable: '可导入', update_available: '待更新', up_to_date: '已是最新', conflict: '同名冲突' }, + fields: { name: '用户名', externalDN: '目录 DN', externalID: '外部标识', authSourceStatus: '认证状态' }, + actions: { + created: '新建', + updated: '更新', + reactivated: '恢复', + unchanged: '无变化', + skipped: '跳过', + conflicts: '冲突', + conflict: '冲突', + missing: '停用', + errors: '错误', + error: '错误', + }, + }, expiresEnterpriseAlert: '温馨提醒:企业版许可证将于 [{0}] 天后到期,届时将停止使用所有企业版功能。', expiresProAlert: '温馨提醒:专业版许可证将于 [{0}] 天后到期,届时将停止使用所有专业版功能。', menu: '高级功能', @@ -5120,6 +5173,208 @@ const message = { masterOnlyPermissionHelper: '该权限仅在主节点生效。', view: '查看', manage: '管理', + authManage: '认证管理', + auth: { + providerNavigation: '认证类型', + providers: { + ldap: 'AD/LDAP', + passkey: 'Passkey', + radius: 'Radius', + oidc: 'OIDC', + saml2: 'SAML2', + cas: 'CAS', + oauth2: 'OAuth2', + dingtalk: '钉钉', + feishu: '飞书', + wecom: '企业微信', + }, + providerDescriptions: { + ldap: '兼容 Active Directory、OpenLDAP 等 LDAP 服务', + passkey: '使用设备凭据进行无密码安全登录', + radius: '通过 Radius 服务完成网络访问认证', + oidc: '使用 OpenID Connect 接入企业单点登录', + saml2: '通过 SAML2 完成企业身份联合登录', + cas: '接入集中式认证服务实现单点登录', + oauth2: '接入兼容 OAuth2 的第三方身份服务', + dingtalk: '使用钉钉组织身份和扫码登录', + feishu: '使用飞书组织身份和账号同步', + wecom: '使用企业微信成员身份认证', + }, + planned: '待接入', + plannedTitle: '{0} 认证设置', + plannedDesc: '该认证方式正在规划中,暂不可用。', + ldap: { + enable: '是否开启', + enabled: '已启用', + disabled: '未启用', + connection: '基础连接', + connectionDesc: '配置目录服务和用于搜索用户的绑定账号。', + serverURL: '服务端地址', + serverURLHelper: '支持 ldap:// 和 ldaps:// 地址。', + userBaseDN: '用户 Base DN', + userBaseDNHelper: 'LDAP 用户搜索的起始 DN,可使用 OU、CN 或域根 DN。', + bindDN: '绑定 DN', + bindPassword: '密码', + passwordSaved: '留空则保留已保存的密码', + userSearch: '用户搜索', + userSearchDesc: '配置用户搜索基准与过滤器,并映射到 1Panel 用户名字段。', + userFilter: '用户过滤器', + userFilterTooltip: '按用户名查询时替换 %(user)s,全量读取时替换为 *。', + userFilterHelper: '搜索和认证时会对用户名执行 LDAP filter escaping。', + attributeMap: '映射属性', + attributeMapTooltip: '1Panel 用户名字段(name)到 LDAP 属性的 JSON 映射。', + attributeMapHelper: '填写映射到 1Panel 用户名字段(name)的 LDAP 属性。', + advanced: '高级设置', + advancedDesc: '配置 TLS 和 LDAP 查询分页。', + strictSync: '严格同步', + strictSyncTooltip: '完整全量处理后,LDAP 中不存在的同源用户将被停用但不会删除。', + strictSyncHelper: '仅作用于完整成功的全量处理;导入选中用户时不会停用其他用户。', + skipTLSVerify: '跳过 TLS 证书校验', + skipTLSVerifyTooltip: '连接 LDAPS 时不校验服务端证书。', + skipTLSVerifyHelper: '仅用于可信的自签名证书;该设置与严格同步相互独立。', + connectTimeout: '连接超时(秒)', + searchPageSize: 'LDAP 查询分页大小', + restore: '还原', + testConnection: '测试连接', + testLogin: '测试登录', + userImport: '用户导入', + saveBeforeImport: '请先保存当前 AD/LDAP 配置,再导入用户。', + format: '格式化', + restoreExample: '恢复示例', + mappingValid: 'JSON 格式正确,name 已配置。', + mappingInvalid: '请输入有效的 JSON。', + mappingObject: '映射属性必须是 JSON 对象。', + mappingOnlyName: '仅支持 name 映射。', + mappingStringValues: '每个映射属性都必须是字符串。', + mappingNameRequired: 'name 必须是非空字符串。', + restored: '已还原为上次保存的配置。', + connectionTestSuccess: 'LDAP 连接测试成功。', + recentTestSuccess: '最近测试成功:{0}', + recentTestFailed: '最近测试失败:{0}', + serverURLRequired: '请输入 LDAP 服务端地址。', + serverURLInvalid: '请输入有效的 ldap:// 或 ldaps:// 地址。', + userBaseDNRequired: '请输入用户 Base DN。', + bindDNRequired: '请输入绑定 DN。', + passwordRequired: '请输入密码。', + userFilterRequired: '请输入用户过滤器。', + connectTimeoutRequired: '请输入连接超时时间。', + searchPageSizeRequired: '请输入 LDAP 查询分页大小。', + sync: { + title: '定时同步', + description: '定期读取 LDAP 全量用户,并维护 1Panel 中的 LDAP 用户。', + enable: '是否启用', + enableHelper: '关闭后不再自动执行,仍可手动立即同步。', + schedule: '执行周期', + daily: '每天', + weekly: '每周', + customCron: '自定义 Cron', + preview: '预览', + previewTitle: '未来 5 次执行', + previewEmpty: '暂无可用执行时间', + cronHelper: '使用“分 时 日 月 周”五段式 Cron 表达式。', + autoImport: '自动导入新用户', + autoImportHelper: '关闭后,仅维护已导入 LDAP 用户的目录标识和状态,不会自动创建新用户。', + defaultRole: '新用户角色', + defaultRolePlaceholder: '请选择角色', + defaultRoleHelper: '仅用于定时同步中新创建的用户,后续可在用户管理中调整。', + defaultRoleRequired: '请选择新 LDAP 用户的角色。', + strictSyncHelper: + '全量查询中缺失的同源 LDAP 用户将被停用并清理会话,但不会删除用户、角色和权限。', + safetyTitle: '仅在 LDAP 全量查询完整成功后处理缺失用户', + safetyDescription: + '查询失败、超时或分页结果不完整时,本次任务不会改变用户状态。同步范围沿用用户搜索中的 Base DN、过滤器和属性映射。', + runNow: '立即同步', + lastRunSuccess: '最近同步成功:{0}', + lastRunFailed: '最近同步失败:{0}', + lastRunRunning: '同步开始时间:{0}', + sourceDisabled: '请先启用并保存 AD/LDAP,再执行同步。', + cronRequired: '请输入 Cron 表达式。', + saveBeforeRun: '请先保存同步设置,再执行同步。', + runConfirmTitle: '执行严格同步', + runConfirmDescription: '完整全量查询中缺失的 LDAP 用户将被停用并清理活动会话,是否继续?', + runSuccess: 'LDAP 同步完成。', + weekdays: { + 0: '周日', + 1: '周一', + 2: '周二', + 3: '周三', + 4: '周四', + 5: '周五', + 6: '周六', + }, + }, + syncLogs: { + title: '同步记录', + description: '查看定时和手动 LDAP 同步的执行结果。', + startedAt: '开始时间', + trigger: '触发方式', + manual: '手动执行', + scheduled: '定时执行', + success: '成功', + failed: '失败', + running: '执行中', + result: '执行结果', + resultSummary: '新增 {0},更新 {1},缺失 {2}', + duration: '耗时', + action: '处理动作', + }, + testLoginTitle: '测试 AD/LDAP 登录', + testLoginDesc: '使用 AD/LDAP 用户凭据执行 bind 验证,仅测试认证能力,不创建 1Panel 登录会话。', + ldapUsername: 'LDAP 用户名', + usernameRequired: '请输入 LDAP 用户名。', + startTest: '开始测试', + testLoginSuccess: '认证成功。', + testLoginSuccessWithDN: '认证成功,用户 DN:{0}', + import: { + title: '导入 AD/LDAP 用户', + source: '数据来源:AD/LDAP 目录', + lastRead: '最近读取:{0}', + cacheHit: '使用缓存结果', + keywordPlaceholder: '搜索用户名', + search: '搜索', + refresh: '从 LDAP 读取', + refreshTip: '忽略短时缓存并重新读取 LDAP 目录。', + loadFailed: 'LDAP 目录读取失败。', + retry: '重试', + noData: '未找到目录用户。', + username: '用户名', + status: '状态', + changes: '变更字段', + noChanges: '无变化', + importable: '可导入', + updateAvailable: '待更新', + upToDate: '已是最新', + conflict: '同名冲突', + selectedCount: '已选择 {0} 项', + totalCount: '共 {0} 个用户', + newUserRole: '新用户角色', + newUserRoleRequired: '请选择新用户角色。', + noNewUsers: '本次无新用户。', + roleOnlyForNewUsers: '所选角色仅应用于本次新建用户。', + strictOff: '严格同步未启用,全量处理不会停用用户。', + importSelected: '导入/更新选中({0})', + importAll: '导入/更新全部({0})', + previewTitle: '确认全量处理', + previewDesc: '已完整读取 LDAP 目录,当前搜索关键字不会缩小本次处理范围。', + created: '新建', + updated: '更新', + unchanged: '无变化', + conflicts: '冲突', + missing: '将停用', + reactivated: '恢复', + strictWarning: + '严格同步已启用。LDAP 中不存在的同源用户将无法继续登录,但不会删除用户、角色和本地权限。', + missingUsers: 'LDAP 中不存在的用户', + missingScope: '仅处理当前 LDAP 认证源。', + willDisable: '将停用', + confirmAll: '确认导入', + confirmAllWithMissing: '确认导入并停用 {0} 个用户', + executeSuccess: 'LDAP 用户处理成功。', + queryExpired: '目录查询结果已过期,请重新从 LDAP 读取。', + planIncomplete: 'LDAP 目录未完整读取,不能执行全量处理。', + }, + }, + }, }, customApp: { name: '自定义仓库', diff --git a/frontend/src/layout/components/Sidebar/components/user-info/index.vue b/frontend/src/layout/components/Sidebar/components/user-info/index.vue index 465658781..5db385ae1 100644 --- a/frontend/src/layout/components/Sidebar/components/user-info/index.vue +++ b/frontend/src/layout/components/Sidebar/components/user-info/index.vue @@ -1,6 +1,14 @@ @@ -442,6 +457,7 @@ const mfaForm = reactive({ const passkeyForm = reactive({ name: '', }); +const isLDAPUser = computed(() => (props.currentUser?.authSource || '').toLowerCase() === 'ldap'); const passkeyPrereqBindDomain = computed(() => hasBindDomain.value); const passkeyPrereqHttps = computed(() => window.isSecureContext); @@ -812,6 +828,7 @@ const buildPasskeyAttestation = (credential: PublicKeyCredential) => { const onSubmit = async (formEl: FormInstance | undefined) => { if (!formEl) return; + if (isLDAPUser.value) return; const valid = await formEl.validateField(getUserFormFields(), () => {}); if (!valid) return; const needReLogin = form.name !== props.currentUser?.name || !!form.password;