Compare commits

...

36 Commits

Author SHA1 Message Date
Robin Ye
2493ae9cfe feat: fix issue that a user can belong to two physical groups at the same time (#4084) 2025-08-15 23:42:09 +08:00
Attack825
b5c80513fb feat: change username too when "username as email" switch is enabled in ResetEmailOrPhone API (#4081) 2025-08-14 21:03:45 +08:00
Attack825
0653353be1 feat: update social_osonsms.svg URL (#4082) 2025-08-14 20:35:39 +08:00
Robin Ye
d6778fb4e6 feat: improve inline captcha UI by increasing spacing (#4079) 2025-08-14 16:15:34 +08:00
DacongDA
fee7773839 feat: add First name and Last name to account items (#4077) 2025-08-14 08:41:18 +08:00
Robin Ye
d47ac6b957 feat: add support for Azerbaijani language (az) (#4073) 2025-08-14 00:13:01 +08:00
Robin Ye
857824df19 feat: sync i18n texts (#4075) 2025-08-13 23:10:58 +08:00
Attack825
1e98d1e11b feat: fix MinIO provider logo URL (#4076) 2025-08-13 22:20:50 +08:00
Yang Luo
48ba88de2d feat: improve error handling in AutoSigninFilter 2025-08-13 15:27:52 +08:00
Yang Luo
a3a142db39 feat: fix error message in VerificationForm.CheckParameter() 2025-08-12 10:13:00 +08:00
hamidreza abedi
3bb7cc6b81 feat: increase LDAP's "basedn" field to 500 chars (#4062) 2025-08-11 16:46:15 +08:00
Robin Ye
1fb3249bfd fix: improve "Copy signup page URL" button UI in invitation edit page (#4038) 2025-08-10 23:03:13 +08:00
DacongDA
ff8f61a84c feat: fix missing search params bug in switchLoginOrganization() (#4058) 2025-08-10 22:11:06 +08:00
DacongDA
a118879dc0 feat: allow user to select organization in login page when using shared app (#4053) 2025-08-10 20:40:30 +08:00
DacongDA
386b673446 feat: support scanning code to login in the login page (#4052) 2025-08-10 00:09:43 +08:00
DacongDA
6abd46fe81 feat: fix issue that signing up with shared application will create user in wrong org (#4051) 2025-08-09 22:25:01 +08:00
IsAurora6
49d734d249 feat: standardize Resource APIs by handling path prefix internally and returning clean paths (#4047) 2025-08-08 23:31:22 +08:00
iderr
f5b4cd7fab feat: Fix GetFilteredPoliciesMulti when filtering only by ptype (#4039) 2025-08-05 22:51:40 +08:00
iderr
76f322861a feat: Refactor GetFilteredPolicies to support multiple filters via POST (#4037) 2025-08-04 19:51:25 +08:00
Seele.Clover
124c28f1e1 feat: allow Custom OAuth provider to not fill in email and avatarUrl in configuring user_mapping (#4035) 2025-08-04 12:26:12 +08:00
DacongDA
e0d9cc7ed1 feat: improve error handling on signInWithWebAuthn (#4033) 2025-08-03 01:26:18 +08:00
Seele.Clover
75c1ae4366 feat: support nested fields for configuring user_mapping in the Custom OAuth provider (#4032) 2025-08-03 00:33:52 +08:00
DacongDA
d537377b31 feat: show placeholder QR code with loading instead of "Loading" text in QR code login page (#4031) 2025-08-02 15:58:49 +08:00
raiki02
462ecce43b feat: check args in Enforce and BatchEnforce APIs (#4029) 2025-08-02 13:39:05 +08:00
raiki02
a84664b55d feat: remove toLower conversion in getPolicies() (#4030) 2025-08-02 13:38:49 +08:00
Justin Judd
941c56e69e feat(jwt): Enable using User Properties as custom claims (#3571) 2025-08-02 10:34:11 +08:00
DacongDA
a28b871a46 feat: add useGroupPathInToken boolean field in app.conf (#4026) 2025-08-02 01:40:26 +08:00
Robin Ye
387f5d58f7 feat: prevent two captcha providers are added to one single application (#4025) 2025-08-01 22:50:12 +08:00
Xiao Mao
7d846b2060 feat: implement root DSE handling and schema query in LDAP server (#4020) 2025-07-31 01:23:25 +08:00
raiki02
c1c2dcab38 feat: can disable signin within application and organization (#4012) 2025-07-30 21:07:35 +08:00
Robin Ye
f9264f700b feat: add get-filtered-policies API, improve Swagger docs (#4006) 2025-07-29 23:51:01 +08:00
Xiao Mao
f3af2a26aa feat: add posixAccount and posixGroup filter logic for more versatile usage in LDAP (#4014) 2025-07-29 21:49:39 +08:00
DacongDA
0ac69bde53 feat: fix objectClass filter will return empty response (#4011) 2025-07-28 23:39:04 +08:00
Yang Luo
70c99f0e59 feat: fix "Key text" multi-line input box for Apple OAuth provider 2025-07-28 17:49:36 +08:00
kevin kwok
8d1fdc3a08 feat: add support for casbin-python-cli auto-download (#4004) 2025-07-27 14:00:00 +08:00
DacongDA
30c15b8135 feat: fix the error effect of form post response type (#4003) 2025-07-26 23:26:37 +08:00
101 changed files with 4390 additions and 157 deletions

View File

@@ -70,6 +70,16 @@ func (c *ApiController) HandleLoggedIn(application *object.Application, user *ob
return
}
if application.DisableSignin {
c.ResponseError(fmt.Sprintf(c.T("auth:The application: %s has disabled users to signin"), application.Name))
return
}
if application.OrganizationObj != nil && application.OrganizationObj.DisableSignin {
c.ResponseError(fmt.Sprintf(c.T("auth:The organization: %s has disabled users to signin"), application.Organization))
return
}
allowed, err := object.CheckLoginPermission(userId, application)
if err != nil {
c.ResponseError(err.Error(), nil)

View File

@@ -40,6 +40,18 @@ func (c *ApiController) Enforce() {
enforcerId := c.Input().Get("enforcerId")
owner := c.Input().Get("owner")
params := []string{permissionId, modelId, resourceId, enforcerId, owner}
nonEmpty := 0
for _, param := range params {
if param != "" {
nonEmpty++
}
}
if nonEmpty > 1 {
c.ResponseError("Only one of the parameters (permissionId, modelId, resourceId, enforcerId, owner) should be provided")
return
}
if len(c.Ctx.Input.RequestBody) == 0 {
c.ResponseError("The request body should not be empty")
return
@@ -169,6 +181,18 @@ func (c *ApiController) BatchEnforce() {
enforcerId := c.Input().Get("enforcerId")
owner := c.Input().Get("owner")
params := []string{permissionId, modelId, enforcerId, owner}
nonEmpty := 0
for _, param := range params {
if param != "" {
nonEmpty++
}
}
if nonEmpty > 1 {
c.ResponseError("Only one of the parameters (permissionId, modelId, enforcerId, owner) should be provided")
return
}
var requests [][]string
err := json.Unmarshal(c.Ctx.Input.RequestBody, &requests)
if err != nil {

View File

@@ -24,6 +24,7 @@ const (
javaCliRepo = "https://api.github.com/repos/jcasbin/casbin-java-cli/releases/latest"
goCliRepo = "https://api.github.com/repos/casbin/casbin-go-cli/releases/latest"
rustCliRepo = "https://api.github.com/repos/casbin-rs/casbin-rust-cli/releases/latest"
pythonCliRepo = "https://api.github.com/repos/casbin/casbin-python-cli/releases/latest"
downloadFolder = "bin"
)
@@ -43,6 +44,7 @@ func getBinaryNames() map[string]string {
golang = "go"
java = "java"
rust = "rust"
python = "python"
)
arch := runtime.GOARCH
@@ -62,18 +64,21 @@ func getBinaryNames() map[string]string {
golang: fmt.Sprintf("casbin-go-cli_Windows_%s.zip", archNames.goArch),
java: "casbin-java-cli.jar",
rust: fmt.Sprintf("casbin-rust-cli-%s-pc-windows-gnu", archNames.rustArch),
python: fmt.Sprintf("casbin-python-cli-windows-%s.exe", archNames.goArch),
}
case "darwin":
return map[string]string{
golang: fmt.Sprintf("casbin-go-cli_Darwin_%s.tar.gz", archNames.goArch),
java: "casbin-java-cli.jar",
rust: fmt.Sprintf("casbin-rust-cli-%s-apple-darwin", archNames.rustArch),
python: fmt.Sprintf("casbin-python-cli-darwin-%s", archNames.goArch),
}
case "linux":
return map[string]string{
golang: fmt.Sprintf("casbin-go-cli_Linux_%s.tar.gz", archNames.goArch),
java: "casbin-java-cli.jar",
rust: fmt.Sprintf("casbin-rust-cli-%s-unknown-linux-gnu", archNames.rustArch),
python: fmt.Sprintf("casbin-python-cli-linux-%s", archNames.goArch),
}
default:
return nil
@@ -98,6 +103,11 @@ func getFinalBinaryName(lang string) string {
return "casbin-rust-cli.exe"
}
return "casbin-rust-cli"
case "python":
if runtime.GOOS == "windows" {
return "casbin-python-cli.exe"
}
return "casbin-python-cli"
default:
return ""
}
@@ -333,9 +343,10 @@ func downloadCLI() error {
}
repos := map[string]string{
"java": javaCliRepo,
"go": goCliRepo,
"rust": rustCliRepo,
"java": javaCliRepo,
"go": goCliRepo,
"rust": rustCliRepo,
"python": pythonCliRepo,
}
for lang, repo := range repos {

View File

@@ -154,6 +154,14 @@ func (c *ApiController) DeleteEnforcer() {
c.ServeJSON()
}
// GetPolicies
// @Title GetPolicies
// @Tag Enforcer API
// @Description get policies
// @Param id query string true "The id ( owner/name ) of enforcer"
// @Param adapterId query string false "The adapter id"
// @Success 200 {array} xormadapter.CasbinRule
// @router /get-policies [get]
func (c *ApiController) GetPolicies() {
id := c.Input().Get("id")
adapterId := c.Input().Get("adapterId")
@@ -188,6 +196,41 @@ func (c *ApiController) GetPolicies() {
c.ResponseOk(policies)
}
// GetFilteredPolicies
// @Title GetFilteredPolicies
// @Tag Enforcer API
// @Description get filtered policies with support for multiple filters via POST body
// @Param id query string true "The id ( owner/name ) of enforcer"
// @Param body body []object.Filter true "Array of filter objects for multiple filters"
// @Success 200 {array} xormadapter.CasbinRule
// @router /get-filtered-policies [post]
func (c *ApiController) GetFilteredPolicies() {
id := c.Input().Get("id")
var filters []object.Filter
err := json.Unmarshal(c.Ctx.Input.RequestBody, &filters)
if err != nil {
c.ResponseError(err.Error())
return
}
filteredPolicies, err := object.GetFilteredPoliciesMulti(id, filters)
if err != nil {
c.ResponseError(err.Error())
return
}
c.ResponseOk(filteredPolicies)
}
// UpdatePolicy
// @Title UpdatePolicy
// @Tag Enforcer API
// @Description update policy
// @Param id query string true "The id ( owner/name ) of enforcer"
// @Param body body []xormadapter.CasbinRule true "Array containing old and new policy"
// @Success 200 {object} Response
// @router /update-policy [post]
func (c *ApiController) UpdatePolicy() {
id := c.Input().Get("id")
@@ -207,6 +250,14 @@ func (c *ApiController) UpdatePolicy() {
c.ServeJSON()
}
// AddPolicy
// @Title AddPolicy
// @Tag Enforcer API
// @Description add policy
// @Param id query string true "The id ( owner/name ) of enforcer"
// @Param body body xormadapter.CasbinRule true "The policy to add"
// @Success 200 {object} Response
// @router /add-policy [post]
func (c *ApiController) AddPolicy() {
id := c.Input().Get("id")
@@ -226,6 +277,14 @@ func (c *ApiController) AddPolicy() {
c.ServeJSON()
}
// RemovePolicy
// @Title RemovePolicy
// @Tag Enforcer API
// @Description remove policy
// @Param id query string true "The id ( owner/name ) of enforcer"
// @Param body body xormadapter.CasbinRule true "The policy to remove"
// @Success 200 {object} Response
// @router /remove-policy [post]
func (c *ApiController) RemovePolicy() {
id := c.Input().Get("id")

View File

@@ -20,6 +20,7 @@ import (
"fmt"
"io"
"mime"
"path"
"path/filepath"
"strings"
@@ -187,6 +188,11 @@ func (c *ApiController) DeleteResource() {
}
_, resource.Name = refineFullFilePath(resource.Name)
tag := c.Input().Get("tag")
if tag == "Direct" {
resource.Name = path.Join(provider.PathPrefix, resource.Name)
}
err = object.DeleteFile(provider, resource.Name, c.GetAcceptLanguage())
if err != nil {
c.ResponseError(err.Error())

View File

@@ -435,9 +435,15 @@ func (c *ApiController) ResetEmailOrPhone() {
switch destType {
case object.VerifyTypeEmail:
id := user.GetId()
user.Email = dest
user.EmailVerified = true
_, err = object.UpdateUser(user.GetId(), user, []string{"email", "email_verified"}, false)
columns := []string{"email", "email_verified"}
if organization.UseEmailAsUsername {
user.Name = user.Email
columns = append(columns, "name")
}
_, err = object.UpdateUser(id, user, columns, false)
case object.VerifyTypePhone:
user.Phone = dest
_, err = object.SetUserField(user, "phone", user.Phone)
@@ -449,6 +455,9 @@ func (c *ApiController) ResetEmailOrPhone() {
c.ResponseError(err.Error())
return
}
if organization.UseEmailAsUsername {
c.SetSessionUsername(user.GetId())
}
err = object.DisableVerificationCode(checkDest)
if err != nil {

View File

@@ -47,7 +47,7 @@ func (form *VerificationForm) CheckParameter(checkType int, lang string) string
return i18n.Translate(lang, "general:Missing parameter") + ": dest."
}
if form.CaptchaType == "" {
return i18n.Translate(lang, "general:Missing parameter") + ": checkType."
return i18n.Translate(lang, "general:Missing parameter") + ": captchaType."
}
if !strings.Contains(form.ApplicationId, "/") {
return i18n.Translate(lang, "verification:Wrong parameter") + ": applicationId."

1
go.mod
View File

@@ -52,7 +52,6 @@ require (
github.com/sendgrid/sendgrid-go v3.14.0+incompatible
github.com/shirou/gopsutil v3.21.11+incompatible
github.com/siddontang/go-log v0.0.0-20190221022429-1e957dd83bed
github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e
github.com/stretchr/testify v1.10.0
github.com/stripe/stripe-go/v74 v74.29.0
github.com/tealeg/xlsx v1.0.5

2
go.sum
View File

@@ -872,8 +872,6 @@ github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0
github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
github.com/skeema/knownhosts v1.3.0 h1:AM+y0rI04VksttfwjkSTNQorvGqmwATnvnAHpSgc0LY=
github.com/skeema/knownhosts v1.3.0/go.mod h1:sPINvnADmT/qYH1kfv+ePMmOBTH6Tbl7b5LvTDjFK7M=
github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e h1:MRM5ITcdelLK2j1vwZ3Je0FKVCfqOLp5zO6trqMLYs0=
github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e/go.mod h1:XV66xRDqSt+GTGFMVlhk3ULuV0y9ZmzeVGR4mloJI3M=
github.com/slack-go/slack v0.12.3 h1:92/dfFU8Q5XP6Wp5rr5/T5JHLM5c5Smtn53fhToAP88=
github.com/slack-go/slack v0.12.3/go.mod h1:hlGi5oXA+Gt+yWTPP0plCdRKmjsDxecdHxYQdlMQKOw=
github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=

View File

@@ -47,6 +47,7 @@ func TestGenerateI18nFrontend(t *testing.T) {
applyToOtherLanguage("frontend", "fa", data)
applyToOtherLanguage("frontend", "cs", data)
applyToOtherLanguage("frontend", "sk", data)
applyToOtherLanguage("frontend", "az", data)
}
func TestGenerateI18nBackend(t *testing.T) {
@@ -77,4 +78,5 @@ func TestGenerateI18nBackend(t *testing.T) {
applyToOtherLanguage("backend", "fa", data)
applyToOtherLanguage("backend", "cs", data)
applyToOtherLanguage("backend", "sk", data)
applyToOtherLanguage("backend", "az", data)
}

View File

@@ -16,12 +16,14 @@
"The account for provider: %s and username: %s (%s) does not exist and is not allowed to sign up as new account, please contact your IT support": "الحساب الخاص بالمزود: %s واسم المستخدم: %s (%s) غير موجود ولا يُسمح بالتسجيل كحساب جديد، يرجى الاتصال بدعم تكنولوجيا المعلومات",
"The account for provider: %s and username: %s (%s) is already linked to another account: %s (%s)": "الحساب الخاص بالمزود: %s واسم المستخدم: %s (%s) مرتبط بالفعل بحساب آخر: %s (%s)",
"The application: %s does not exist": "التطبيق: %s غير موجود",
"The application: %s has disabled users to signin": "The application: %s has disabled users to signin",
"The login method: login with LDAP is not enabled for the application": "طريقة تسجيل الدخول: تسجيل الدخول باستخدام LDAP غير مفعّلة لهذا التطبيق",
"The login method: login with SMS is not enabled for the application": "طريقة تسجيل الدخول: تسجيل الدخول باستخدام الرسائل النصية غير مفعّلة لهذا التطبيق",
"The login method: login with email is not enabled for the application": "طريقة تسجيل الدخول: تسجيل الدخول باستخدام البريد الإلكتروني غير مفعّلة لهذا التطبيق",
"The login method: login with face is not enabled for the application": "طريقة تسجيل الدخول: تسجيل الدخول باستخدام الوجه غير مفعّلة لهذا التطبيق",
"The login method: login with password is not enabled for the application": "طريقة تسجيل الدخول: تسجيل الدخول باستخدام كلمة المرور غير مفعّلة لهذا التطبيق",
"The organization: %s does not exist": "المنظمة: %s غير موجودة",
"The organization: %s has disabled users to signin": "The organization: %s has disabled users to signin",
"The provider: %s does not exist": "المزود: %s غير موجود",
"The provider: %s is not enabled for the application": "المزود: %s غير مفعّل لهذا التطبيق",
"Unauthorized operation": "عملية غير مصرح بها",

193
i18n/locales/az/data.json Normal file
View File

@@ -0,0 +1,193 @@
{
"account": {
"Failed to add user": "İstifadəçi əlavə etmə uğursuz oldu",
"Get init score failed, error: %w": "Başlanğıc xal alınması uğursuz oldu, xəta: %w",
"Please sign out first": "Xahiş edirik əvvəlcə çıxış edin",
"The application does not allow to sign up new account": "Tətbiq yeni hesab qeydiyyatına icazə vermir"
},
"auth": {
"Challenge method should be S256": "Çağırış metodu S256 olmalıdır",
"DeviceCode Invalid": "Cihaz Kodu Etibarsızdır",
"Failed to create user, user information is invalid: %s": "İstifadəçi yaratma uğursuz oldu, istifadəçi məlumatları etibarsızdır: %s",
"Failed to login in: %s": "Giriş uğursuz oldu: %s",
"Invalid token": "Etibarsız token",
"State expected: %s, but got: %s": "Gözlənilən vəziyyət: %s, lakin alınan: %s",
"The account for provider: %s and username: %s (%s) does not exist and is not allowed to sign up as new account via %%s, please use another way to sign up": "Provayder üçün hesab: %s və istifadəçi adı: %s (%s) mövcud deyil və %%s vasitəsilə yeni hesab olaraq qeydiyyatdan keçməyə icazə verilmir, xahiş edirik qeydiyyat üçün başqa üsul istifadə edin",
"The account for provider: %s and username: %s (%s) does not exist and is not allowed to sign up as new account, please contact your IT support": "Provayder üçün hesab: %s və istifadəçi adı: %s (%s) mövcud deyil və yeni hesab olaraq qeydiyyatdan keçməyə icazə verilmir, xahiş edirik IT dəstəyinizlə əlaqə saxlayın",
"The account for provider: %s and username: %s (%s) is already linked to another account: %s (%s)": "Provayder üçün hesab: %s və istifadəçi adı: %s (%s) artıq başqa hesabla əlaqələndirilmişdir: %s (%s)",
"The application: %s does not exist": "Tətbiq: %s mövcud deyil",
"The application: %s has disabled users to signin": "Tətbiq: %s istifadəçilərin girişini söndürmüşdür",
"The login method: login with LDAP is not enabled for the application": "Giriş metodu: LDAP ilə giriş bu tətbiq üçün aktiv deyil",
"The login method: login with SMS is not enabled for the application": "Giriş metodu: SMS ilə giriş bu tətbiq üçün aktiv deyil",
"The login method: login with email is not enabled for the application": "Giriş metodu: email ilə giriş bu tətbiq üçün aktiv deyil",
"The login method: login with face is not enabled for the application": "Giriş metodu: üz ilə giriş bu tətbiq üçün aktiv deyil",
"The login method: login with password is not enabled for the application": "Giriş metodu: şifrə ilə giriş bu tətbiq üçün aktiv deyil",
"The organization: %s does not exist": "Təşkilat: %s mövcud deyil",
"The organization: %s has disabled users to signin": "Təşkilat: %s istifadəçilərin girişini söndürmüşdür",
"The provider: %s does not exist": "Provayder: %s mövcud deyil",
"The provider: %s is not enabled for the application": "Provayder: %s bu tətbiq üçün aktiv deyil",
"Unauthorized operation": "İcazəsiz əməliyyat",
"Unknown authentication type (not password or provider), form = %s": "Naməlum təsdiq növü (şifrə və ya provayder deyil), forma = %s",
"User's tag: %s is not listed in the application's tags": "İstifadəçinin teqi: %s tətbiqin teqləri siyahısında yoxdur",
"UserCode Expired": "İstifadəçi Kodunun Vaxtı Keçib",
"UserCode Invalid": "İstifadəçi Kodu Etibarsızdır",
"paid-user %s does not have active or pending subscription and the application: %s does not have default pricing": "ödənişli istifadəçi %s aktiv və ya gözləyən abunəyə malik deyil və tətbiq: %s defolt qiymətləndirməyə malik deyil",
"the application for user %s is not found": "istifadəçi %s üçün tətbiq tapılmadı",
"the organization: %s is not found": "təşkilat: %s tapılmadı"
},
"cas": {
"Service %s and %s do not match": "Xidmət %s və %s uyğun gəlmir"
},
"check": {
"%s does not meet the CIDR format requirements: %s": "%s CIDR format tələblərinə cavab vermir: %s",
"Affiliation cannot be blank": "Mənsub sahəsi boş ola bilməz",
"CIDR for IP: %s should not be empty": "IP üçün CIDR: %s boş olmamalıdır",
"Default code does not match the code's matching rules": "Defolt kod kodun uyğunluq qaydalara uyğun gəlmir",
"DisplayName cannot be blank": "Göstərilən Ad boş ola bilməz",
"DisplayName is not valid real name": "Göstərilən Ad etibarlı həqiqi ad deyil",
"Email already exists": "Email artıq mövcuddur",
"Email cannot be empty": "Email boş ola bilməz",
"Email is invalid": "Email etibarsızdır",
"Empty username.": "Boş istifadəçi adı.",
"Face data does not exist, cannot log in": "Üz məlumatları mövcud deyil, giriş edilə bilməz",
"Face data mismatch": "Üz məlumatları uyğun gəlmir",
"Failed to parse client IP: %s": "Müştəri IP-ni təhlil etmək uğursuz oldu: %s",
"FirstName cannot be blank": "Ad boş ola bilməz",
"Invitation code cannot be blank": "Dəvət kodu boş ola bilməz",
"Invitation code exhausted": "Dəvət kodu tükənib",
"Invitation code is invalid": "Dəvət kodu etibarsızdır",
"Invitation code suspended": "Dəvət kodu dayandırılıb",
"LDAP user name or password incorrect": "LDAP istifadəçi adı və ya şifrə yanlışdır",
"LastName cannot be blank": "Soyad boş ola bilməz",
"Multiple accounts with same uid, please check your ldap server": "Eyni uid ilə çoxlu hesablar, xahiş edirik ldap serverinizi yoxlayın",
"Organization does not exist": "Təşkilat mövcud deyil",
"Password cannot be empty": "Şifrə boş ola bilməz",
"Phone already exists": "Telefon artıq mövcuddur",
"Phone cannot be empty": "Telefon boş ola bilməz",
"Phone number is invalid": "Telefon nömrəsi etibarsızdır",
"Please register using the email corresponding to the invitation code": "Xahiş edirik dəvət koduna uyğun email istifadə edərək qeydiyyatdan keçin",
"Please register using the phone corresponding to the invitation code": "Xahiş edirik dəvət koduna uyğun telefon istifadə edərək qeydiyyatdan keçin",
"Please register using the username corresponding to the invitation code": "Xahiş edirik dəvət koduna uyğun istifadəçi adı istifadə edərək qeydiyyatdan keçin",
"Session outdated, please login again": "Sessiyanın vaxtı keçib, xahiş edirik yenidən daxil olun",
"The invitation code has already been used": "Dəvət kodu artıq istifadə edilib",
"The user is forbidden to sign in, please contact the administrator": "İstifadəçinin girişi qadağandır, xahiş edirik administratorla əlaqə saxlayın",
"The user: %s doesn't exist in LDAP server": "İstifadəçi: %s LDAP serverində mövcud deyil",
"The username may only contain alphanumeric characters, underlines or hyphens, cannot have consecutive hyphens or underlines, and cannot begin or end with a hyphen or underline.": "İstifadəçi adı yalnız hərf-rəqəm simvolları, alt xətt və ya defis ehtiva edə bilər, ardıcıl defis və ya alt xətt ola bilməz və defis və ya alt xəttlə başlaya və ya bitə bilməz.",
"The value \\\"%s\\\" for account field \\\"%s\\\" doesn't match the account item regex": "Hesab sahəsi \\\"%s\\\" üçün dəyər \\\"%s\\\" hesab elementi regex-inə uyğun gəlmir",
"The value \\\"%s\\\" for signup field \\\"%s\\\" doesn't match the signup item regex of the application \\\"%s\\\"": "Qeydiyyat sahəsi \\\"%s\\\" üçün dəyər \\\"%s\\\" tətbiq \\\"%s\\\"in qeydiyyat elementi regex-inə uyğun gəlmir",
"Username already exists": "İstifadəçi adı artıq mövcuddur",
"Username cannot be an email address": "İstifadəçi adı email ünvanı ola bilməz",
"Username cannot contain white spaces": "İstifadəçi adı boşluqlar ehtiva edə bilməz",
"Username cannot start with a digit": "İstifadəçi adı rəqəmlə başlaya bilməz",
"Username is too long (maximum is 255 characters).": "İstifadəçi adı çox uzundur (maksimum 255 simvoldur).",
"Username must have at least 2 characters": "İstifadəçi adı ən azı 2 simvola malik olmalıdır",
"Username supports email format. Also The username may only contain alphanumeric characters, underlines or hyphens, cannot have consecutive hyphens or underlines, and cannot begin or end with a hyphen or underline. Also pay attention to the email format.": "İstifadəçi adı email formatını dəstəkləyir. Həmçinin istifadəçi adı yalnız hərf-rəqəm simvolları, alt xətt və ya defis ehtiva edə bilər, ardıcıl defis və ya alt xətt ola bilməz və defis və ya alt xəttlə başlaya və ya bitə bilməz. Həmçinin email formatına diqqət edin.",
"You have entered the wrong password or code too many times, please wait for %d minutes and try again": "Yanlış şifrə və ya kod dəfələrlə daxil etmisiniz, xahiş edirik %d dəqiqə gözləyin və yenidən cəhd edin",
"Your IP address: %s has been banned according to the configuration of: ": "IP ünvanınız: %s konfiqurasiyaya görə qadağan edilib: ",
"Your password has expired. Please reset your password by clicking \\\"Forgot password\\\"": "Şifrənizin vaxtı keçib. Xahiş edirik \\\"Şifrəni unutdum\\\" düyməsinə basaraq şifrənizi sıfırlayın",
"Your region is not allow to signup by phone": "Regionunuzda telefonla qeydiyyata icazə verilmir",
"password or code is incorrect": "şifrə və ya kod yanlışdır",
"password or code is incorrect, you have %s remaining chances": "şifrə və ya kod yanlışdır, %s şansınız qalıb",
"unsupported password type: %s": "dəstəklənməyən şifrə növü: %s"
},
"enforcer": {
"the adapter: %s is not found": "adapter: %s tapılmadı"
},
"general": {
"Failed to import groups": "Qrupları idxal etmək uğursuz oldu",
"Failed to import users": "İstifadəçiləri idxal etmək uğursuz oldu",
"Missing parameter": "Parametr çatışmır",
"Only admin user can specify user": "Yalnız admin istifadəçi başqa istifadəçini təyin edə bilər",
"Please login first": "Xahiş edirik əvvəlcə daxil olun",
"The organization: %s should have one application at least": "Təşkilat: %s ən azı bir tətbiqə malik olmalıdır",
"The user: %s doesn't exist": "İstifadəçi: %s mövcud deyil",
"Wrong userId": "Yanlış istifadəçi ID-si",
"don't support captchaProvider: ": "captcha provayderini dəstəkləmir: ",
"this operation is not allowed in demo mode": "bu əməliyyat demo rejimində icazə verilmir",
"this operation requires administrator to perform": "bu əməliyyat administrator tərəfindən yerinə yetirilməsini tələb edir"
},
"ldap": {
"Ldap server exist": "LDAP serveri mövcuddur"
},
"link": {
"Please link first": "Xahiş edirik əvvəlcə əlaqələndirin",
"This application has no providers": "Bu tətbiqin provayderləri yoxdur",
"This application has no providers of type": "Bu tətbiqin bu növdə provayderi yoxdur",
"This provider can't be unlinked": "Bu provayderin əlaqəsi kəsilə bilməz",
"You are not the global admin, you can't unlink other users": "Siz qlobal admin deyilsiniz, digər istifadəçilərin əlaqəsini kəsə bilməzsiniz",
"You can't unlink yourself, you are not a member of any application": "Öz əlaqənizi kəsə bilməzsiniz, heç bir tətbiqin üzvü deyilsiniz"
},
"organization": {
"Only admin can modify the %s.": "Yalnız admin %s-ni dəyişdirə bilər.",
"The %s is immutable.": "%s dəyişilməzdir.",
"Unknown modify rule %s.": "Naməlum dəyişdirmə qaydası %s.",
"adding a new user to the 'built-in' organization is currently disabled. Please note: all users in the 'built-in' organization are global administrators in Casdoor. Refer to the docs: https://casdoor.org/docs/basic/core-concepts#how-does-casdoor-manage-itself. If you still wish to create a user for the 'built-in' organization, go to the organization's settings page and enable the 'Has privilege consent' option.": "'built-in' təşkilatına yeni istifadəçi əlavə etmək hazırda söndürülüb. Qeyd edin: 'built-in' təşkilatındakı bütün istifadəçilər Casdoor-da qlobal administratorlardır. Sənədlərə baxın: https://casdoor.org/docs/basic/core-concepts#how-does-casdoor-manage-itself. Əgər hələ də 'built-in' təşkilat üçün istifadəçi yaratmaq istəyirsinizsə, təşkilatın tənzimləmələr səhifəsinə gedib 'İmtiyaz razılığına malikdir' seçimini aktiv edin."
},
"permission": {
"The permission: \\\"%s\\\" doesn't exist": "İcazə: \\\"%s\\\" mövcud deyil"
},
"provider": {
"Invalid application id": "Etibarsız tətbiq id-si",
"the provider: %s does not exist": "provayder: %s mövcud deyil"
},
"resource": {
"User is nil for tag: avatar": "Avatar teqi üçün istifadəçi nil-dir",
"Username or fullFilePath is empty: username = %s, fullFilePath = %s": "İstifadəçi adı və ya tam fayl yolu boşdur: istifadəçi adı = %s, tam fayl yolu = %s"
},
"saml": {
"Application %s not found": "Tətbiq %s tapılmadı"
},
"saml_sp": {
"provider %s's category is not SAML": "provayder %s-in kateqoriyası SAML deyil"
},
"service": {
"Empty parameters for emailForm: %v": "emailForm üçün boş parametrlər: %v",
"Invalid Email receivers: %s": "Etibarsız Email qəbuledicilər: %s",
"Invalid phone receivers: %s": "Etibarsız telefon qəbuledicilər: %s"
},
"storage": {
"The objectKey: %s is not allowed": "obyekt açarı: %s icazə verilmir",
"The provider type: %s is not supported": "provayder növü: %s dəstəklənmir"
},
"subscription": {
"Error": "Xəta"
},
"token": {
"Grant_type: %s is not supported in this application": "Grant_type: %s bu tətbiqdə dəstəklənmir",
"Invalid application or wrong clientSecret": "Etibarsız tətbiq və ya yanlış müştəri sirri",
"Invalid client_id": "Etibarsız client_id",
"Redirect URI: %s doesn't exist in the allowed Redirect URI list": "Yönləndirmə URI: %s icazə verilən Yönləndirmə URI siyahısında mövcud deyil",
"Token not found, invalid accessToken": "Token tapılmadı, etibarsız accessToken"
},
"user": {
"Display name cannot be empty": "Göstərilən ad boş ola bilməz",
"MFA email is enabled but email is empty": "MFA email aktiv edilib, lakin email boşdur",
"MFA phone is enabled but phone number is empty": "MFA telefon aktiv edilib, lakin telefon nömrəsi boşdur",
"New password cannot contain blank space.": "Yeni şifrə boş yer ehtiva edə bilməz.",
"the user's owner and name should not be empty": "istifadəçinin sahibi və adı boş olmamalıdır"
},
"util": {
"No application is found for userId: %s": "İstifadəçi ID-si üçün heç bir tətbiq tapılmadı: %s",
"No provider for category: %s is found for application: %s": "Tətbiq üçün kateqoriya üçün heç bir provayder tapılmadı: %s: %s",
"The provider: %s is not found": "Provayder: %s tapılmadı"
},
"verification": {
"Invalid captcha provider.": "Etibarsız captcha provaydeři.",
"Phone number is invalid in your region %s": "Telefon nömrəsi sizin regionunuzda etibarsızdır %s",
"The verification code has already been used!": "Doğrulama kodu artıq istifadə edilib!",
"The verification code has not been sent yet!": "Doğrulama kodu hələ göndərilməyib!",
"Turing test failed.": "Türinq testi uğursuz oldu.",
"Unable to get the email modify rule.": "Email dəyişdirmə qaydasını əldə etmək mümkün olmadı.",
"Unable to get the phone modify rule.": "Telefon dəyişdirmə qaydasını əldə etmək mümkün olmadı.",
"Unknown type": "Naməlum növ",
"Wrong verification code!": "Yanlış doğrulama kodu!",
"You should verify your code in %d min!": "Kodunuzu %d dəqiqə içində doğrulamalısınız!",
"please add a SMS provider to the \\\"Providers\\\" list for the application: %s": "xahiş edirik tətbiq üçün \\\"Provaydeerlər\\\" siyahısına SMS provaydeři əlavə edin: %s",
"please add an Email provider to the \\\"Providers\\\" list for the application: %s": "xahiş edirik tətbiq üçün \\\"Provaydeerlər\\\" siyahısına Email provaydeři əlavə edin: %s",
"the user does not exist, please sign up first": "istifadəçi mövcud deyil, xahiş edirik əvvəlcə qeydiyyatdan keçin"
},
"webauthn": {
"Found no credentials for this user": "Bu istifadəçi üçün heç bir etimadnamə tapılmadı",
"Please call WebAuthnSigninBegin first": "Xahiş edirik əvvəlcə WebAuthnSigninBegin çağırın"
}
}

View File

@@ -16,12 +16,14 @@
"The account for provider: %s and username: %s (%s) does not exist and is not allowed to sign up as new account, please contact your IT support": "Účet pro poskytovatele: %s a uživatelské jméno: %s (%s) neexistuje a není povoleno se registrovat jako nový účet, prosím kontaktujte svou IT podporu",
"The account for provider: %s and username: %s (%s) is already linked to another account: %s (%s)": "Účet pro poskytovatele: %s a uživatelské jméno: %s (%s) je již propojen s jiným účtem: %s (%s)",
"The application: %s does not exist": "Aplikace: %s neexistuje",
"The application: %s has disabled users to signin": "The application: %s has disabled users to signin",
"The login method: login with LDAP is not enabled for the application": "Přihlašovací metoda: přihlášení pomocí LDAP není pro aplikaci povolena",
"The login method: login with SMS is not enabled for the application": "Přihlašovací metoda: přihlášení pomocí SMS není pro aplikaci povolena",
"The login method: login with email is not enabled for the application": "Přihlašovací metoda: přihlášení pomocí e-mailu není pro aplikaci povolena",
"The login method: login with face is not enabled for the application": "Přihlašovací metoda: přihlášení pomocí obličeje není pro aplikaci povolena",
"The login method: login with password is not enabled for the application": "Metoda přihlášení: přihlášení pomocí hesla není pro aplikaci povolena",
"The organization: %s does not exist": "Organizace: %s neexistuje",
"The organization: %s has disabled users to signin": "The organization: %s has disabled users to signin",
"The provider: %s does not exist": "Poskytovatel: %s neexistuje",
"The provider: %s is not enabled for the application": "Poskytovatel: %s není pro aplikaci povolen",
"Unauthorized operation": "Neoprávněná operace",

View File

@@ -16,12 +16,14 @@
"The account for provider: %s and username: %s (%s) does not exist and is not allowed to sign up as new account, please contact your IT support": "Das Konto für den Anbieter %s und Benutzernamen %s (%s) existiert nicht und es ist nicht erlaubt, ein neues Konto anzumelden. Bitte wenden Sie sich an Ihren IT-Support",
"The account for provider: %s and username: %s (%s) is already linked to another account: %s (%s)": "Das Konto für den Anbieter %s und Benutzernamen %s (%s) ist bereits mit einem anderen Konto verknüpft: %s (%s)",
"The application: %s does not exist": "Die Anwendung: %s existiert nicht",
"The application: %s has disabled users to signin": "The application: %s has disabled users to signin",
"The login method: login with LDAP is not enabled for the application": "Die Anmeldemethode: Anmeldung mit LDAP ist für die Anwendung nicht aktiviert",
"The login method: login with SMS is not enabled for the application": "Die Anmeldemethode: Anmeldung per SMS ist für die Anwendung nicht aktiviert",
"The login method: login with email is not enabled for the application": "Die Anmeldemethode: Anmeldung per E-Mail ist für die Anwendung nicht aktiviert",
"The login method: login with face is not enabled for the application": "Die Anmeldemethode: Anmeldung per Gesicht ist für die Anwendung nicht aktiviert",
"The login method: login with password is not enabled for the application": "Die Anmeldeart \"Anmeldung mit Passwort\" ist für die Anwendung nicht aktiviert",
"The organization: %s does not exist": "Die Organisation: %s existiert nicht",
"The organization: %s has disabled users to signin": "The organization: %s has disabled users to signin",
"The provider: %s does not exist": "Der Anbieter: %s existiert nicht",
"The provider: %s is not enabled for the application": "Der Anbieter: %s ist nicht für die Anwendung aktiviert",
"Unauthorized operation": "Nicht autorisierte Operation",

View File

@@ -16,12 +16,14 @@
"The account for provider: %s and username: %s (%s) does not exist and is not allowed to sign up as new account, please contact your IT support": "The account for provider: %s and username: %s (%s) does not exist and is not allowed to sign up as new account, please contact your IT support",
"The account for provider: %s and username: %s (%s) is already linked to another account: %s (%s)": "The account for provider: %s and username: %s (%s) is already linked to another account: %s (%s)",
"The application: %s does not exist": "The application: %s does not exist",
"The application: %s has disabled users to signin": "The application: %s has disabled users to signin",
"The login method: login with LDAP is not enabled for the application": "The login method: login with LDAP is not enabled for the application",
"The login method: login with SMS is not enabled for the application": "The login method: login with SMS is not enabled for the application",
"The login method: login with email is not enabled for the application": "The login method: login with email is not enabled for the application",
"The login method: login with face is not enabled for the application": "The login method: login with face is not enabled for the application",
"The login method: login with password is not enabled for the application": "The login method: login with password is not enabled for the application",
"The organization: %s does not exist": "The organization: %s does not exist",
"The organization: %s has disabled users to signin": "The organization: %s has disabled users to signin",
"The provider: %s does not exist": "The provider: %s does not exist",
"The provider: %s is not enabled for the application": "The provider: %s is not enabled for the application",
"Unauthorized operation": "Unauthorized operation",

View File

@@ -16,12 +16,14 @@
"The account for provider: %s and username: %s (%s) does not exist and is not allowed to sign up as new account, please contact your IT support": "La cuenta para el proveedor: %s y el nombre de usuario: %s (%s) no existe y no se permite registrarse como una nueva cuenta, por favor contacte a su soporte de TI",
"The account for provider: %s and username: %s (%s) is already linked to another account: %s (%s)": "La cuenta para proveedor: %s y nombre de usuario: %s (%s) ya está vinculada a otra cuenta: %s (%s)",
"The application: %s does not exist": "La aplicación: %s no existe",
"The application: %s has disabled users to signin": "The application: %s has disabled users to signin",
"The login method: login with LDAP is not enabled for the application": "El método de inicio de sesión: inicio de sesión con LDAP no está habilitado para la aplicación",
"The login method: login with SMS is not enabled for the application": "El método de inicio de sesión: inicio de sesión con SMS no está habilitado para la aplicación",
"The login method: login with email is not enabled for the application": "El método de inicio de sesión: inicio de sesión con correo electrónico no está habilitado para la aplicación",
"The login method: login with face is not enabled for the application": "El método de inicio de sesión: inicio de sesión con reconocimiento facial no está habilitado para la aplicación",
"The login method: login with password is not enabled for the application": "El método de inicio de sesión: inicio de sesión con contraseña no está habilitado para la aplicación",
"The organization: %s does not exist": "La organización: %s no existe",
"The organization: %s has disabled users to signin": "The organization: %s has disabled users to signin",
"The provider: %s does not exist": "El proveedor: %s no existe",
"The provider: %s is not enabled for the application": "El proveedor: %s no está habilitado para la aplicación",
"Unauthorized operation": "Operación no autorizada",

View File

@@ -16,12 +16,14 @@
"The account for provider: %s and username: %s (%s) does not exist and is not allowed to sign up as new account, please contact your IT support": "حساب برای ارائه‌دهنده: %s و نام کاربری: %s (%s) وجود ندارد و مجاز به ثبت‌نام به‌عنوان حساب جدید نیست، لطفاً با پشتیبانی IT خود تماس بگیرید",
"The account for provider: %s and username: %s (%s) is already linked to another account: %s (%s)": "حساب برای ارائه‌دهنده: %s و نام کاربری: %s (%s) در حال حاضر به حساب دیگری مرتبط است: %s (%s)",
"The application: %s does not exist": "برنامه: %s وجود ندارد",
"The application: %s has disabled users to signin": "The application: %s has disabled users to signin",
"The login method: login with LDAP is not enabled for the application": "روش ورود: ورود با LDAP برای برنامه فعال نیست",
"The login method: login with SMS is not enabled for the application": "روش ورود: ورود با پیامک برای برنامه فعال نیست",
"The login method: login with email is not enabled for the application": "روش ورود: ورود با ایمیل برای برنامه فعال نیست",
"The login method: login with face is not enabled for the application": "روش ورود: ورود با چهره برای برنامه فعال نیست",
"The login method: login with password is not enabled for the application": "روش ورود: ورود با رمز عبور برای برنامه فعال نیست",
"The organization: %s does not exist": "سازمان: %s وجود ندارد",
"The organization: %s has disabled users to signin": "The organization: %s has disabled users to signin",
"The provider: %s does not exist": "ارائه‌کننده: %s وجود ندارد",
"The provider: %s is not enabled for the application": "ارائه‌دهنده: %s برای برنامه فعال نیست",
"Unauthorized operation": "عملیات غیرمجاز",

View File

@@ -16,12 +16,14 @@
"The account for provider: %s and username: %s (%s) does not exist and is not allowed to sign up as new account, please contact your IT support": "Tiliä providerille: %s ja käyttäjälle: %s (%s) ei ole olemassa, eikä sitä voi rekisteröidä uutena tilinä, ota yhteyttä IT-tukeen",
"The account for provider: %s and username: %s (%s) is already linked to another account: %s (%s)": "Tili providerille: %s ja käyttäjälle: %s (%s) on jo linkitetty toiseen tiliin: %s (%s)",
"The application: %s does not exist": "Sovellus: %s ei ole olemassa",
"The application: %s has disabled users to signin": "The application: %s has disabled users to signin",
"The login method: login with LDAP is not enabled for the application": "Kirjautumistapa: kirjautuminen LDAP:n kautta ei ole käytössä sovelluksessa",
"The login method: login with SMS is not enabled for the application": "Kirjautumistapa: kirjautuminen SMS:n kautta ei ole käytössä sovelluksessa",
"The login method: login with email is not enabled for the application": "Kirjautumistapa: kirjautuminen sähköpostin kautta ei ole käytössä sovelluksessa",
"The login method: login with face is not enabled for the application": "Kirjautumistapa: kirjautuminen kasvotunnistuksella ei ole käytössä sovelluksessa",
"The login method: login with password is not enabled for the application": "Kirjautumistapa: kirjautuminen salasanalla ei ole käytössä sovelluksessa",
"The organization: %s does not exist": "Organisaatio: %s ei ole olemassa",
"The organization: %s has disabled users to signin": "The organization: %s has disabled users to signin",
"The provider: %s does not exist": "Provider: %s ei ole olemassa",
"The provider: %s is not enabled for the application": "Provider: %s ei ole käytössä sovelluksessa",
"Unauthorized operation": "Luvaton toiminto",

View File

@@ -16,12 +16,14 @@
"The account for provider: %s and username: %s (%s) does not exist and is not allowed to sign up as new account, please contact your IT support": "Le compte pour le fournisseur : %s et le nom d'utilisateur : %s (%s) n'existe pas et n'est pas autorisé à s'inscrire comme nouveau compte, veuillez contacter votre support informatique",
"The account for provider: %s and username: %s (%s) is already linked to another account: %s (%s)": "Le compte du fournisseur : %s et le nom d'utilisateur : %s (%s) sont déjà liés à un autre compte : %s (%s)",
"The application: %s does not exist": "L'application : %s n'existe pas",
"The application: %s has disabled users to signin": "The application: %s has disabled users to signin",
"The login method: login with LDAP is not enabled for the application": "La méthode de connexion : connexion LDAP n'est pas activée pour l'application",
"The login method: login with SMS is not enabled for the application": "La méthode de connexion : connexion par SMS n'est pas activée pour l'application",
"The login method: login with email is not enabled for the application": "La méthode de connexion : connexion par e-mail n'est pas activée pour l'application",
"The login method: login with face is not enabled for the application": "La méthode de connexion : connexion par visage n'est pas activée pour l'application",
"The login method: login with password is not enabled for the application": "La méthode de connexion : connexion avec mot de passe n'est pas activée pour l'application",
"The organization: %s does not exist": "L'organisation : %s n'existe pas",
"The organization: %s has disabled users to signin": "The organization: %s has disabled users to signin",
"The provider: %s does not exist": "Le fournisseur : %s n'existe pas",
"The provider: %s is not enabled for the application": "Le fournisseur :%s n'est pas activé pour l'application",
"Unauthorized operation": "Opération non autorisée",

View File

@@ -16,12 +16,14 @@
"The account for provider: %s and username: %s (%s) does not exist and is not allowed to sign up as new account, please contact your IT support": "החשבון עבור ספק: %s ושם משתמש: %s (%s) אינו קיים ואינו מאופשר להרשמה כחשבון חדש, אנא צור קשר עם התמיכה הטכנית",
"The account for provider: %s and username: %s (%s) is already linked to another account: %s (%s)": "החשבון עבור ספק: %s ושם משתמש: %s (%s) כבר מקושר לחשבון אחר: %s (%s)",
"The application: %s does not exist": "האפליקציה: %s אינה קיימת",
"The application: %s has disabled users to signin": "The application: %s has disabled users to signin",
"The login method: login with LDAP is not enabled for the application": "שיטת הכניסה: כניסה עם LDAP אינה מאופשרת לאפליקציה",
"The login method: login with SMS is not enabled for the application": "שיטת הכניסה: כניסה עם SMS אינה מאופשרת לאפליקציה",
"The login method: login with email is not enabled for the application": "שיטת הכניסה: כניסה עם אימייל אינה מאופשרת לאפליקציה",
"The login method: login with face is not enabled for the application": "שיטת הכניסה: כניסה עם פנים אינה מאופשרת לאפליקציה",
"The login method: login with password is not enabled for the application": "שיטת הכניסה: כניסה עם סיסמה אינה מאופשרת לאפליקציה",
"The organization: %s does not exist": "הארגון: %s אינו קיים",
"The organization: %s has disabled users to signin": "The organization: %s has disabled users to signin",
"The provider: %s does not exist": "הספק: %s אינו קיים",
"The provider: %s is not enabled for the application": "הספק: %s אינו מאופשר לאפליקציה",
"Unauthorized operation": "פעולה לא מורשית",

View File

@@ -16,12 +16,14 @@
"The account for provider: %s and username: %s (%s) does not exist and is not allowed to sign up as new account, please contact your IT support": "Akun untuk penyedia: %s dan nama pengguna: %s (%s) tidak ada dan tidak diizinkan untuk mendaftar sebagai akun baru, silakan hubungi dukungan IT Anda",
"The account for provider: %s and username: %s (%s) is already linked to another account: %s (%s)": "Akun untuk penyedia: %s dan username: %s (%s) sudah terhubung dengan akun lain: %s (%s)",
"The application: %s does not exist": "Aplikasi: %s tidak ada",
"The application: %s has disabled users to signin": "The application: %s has disabled users to signin",
"The login method: login with LDAP is not enabled for the application": "Metode masuk: masuk dengan LDAP tidak diaktifkan untuk aplikasi ini",
"The login method: login with SMS is not enabled for the application": "Metode masuk: masuk dengan SMS tidak diaktifkan untuk aplikasi ini",
"The login method: login with email is not enabled for the application": "Metode masuk: masuk dengan email tidak diaktifkan untuk aplikasi ini",
"The login method: login with face is not enabled for the application": "Metode masuk: masuk dengan wajah tidak diaktifkan untuk aplikasi ini",
"The login method: login with password is not enabled for the application": "Metode login: login dengan sandi tidak diaktifkan untuk aplikasi tersebut",
"The organization: %s does not exist": "Organisasi: %s tidak ada",
"The organization: %s has disabled users to signin": "The organization: %s has disabled users to signin",
"The provider: %s does not exist": "Penyedia: %s tidak ada",
"The provider: %s is not enabled for the application": "Penyedia: %s tidak diaktifkan untuk aplikasi ini",
"Unauthorized operation": "Operasi tidak sah",

View File

@@ -16,12 +16,14 @@
"The account for provider: %s and username: %s (%s) does not exist and is not allowed to sign up as new account, please contact your IT support": "Account per provider: %s e utente: %s (%s) non esiste, registrazione non consentita: contatta l'assistenza IT",
"The account for provider: %s and username: %s (%s) is already linked to another account: %s (%s)": "Account per provider: %s e utente: %s (%s) già collegato a un altro account: %s (%s)",
"The application: %s does not exist": "L'app: %s non esiste",
"The application: %s has disabled users to signin": "The application: %s has disabled users to signin",
"The login method: login with LDAP is not enabled for the application": "Metodo di accesso: login con LDAP non abilitato per l'applicazione",
"The login method: login with SMS is not enabled for the application": "Metodo di accesso: login con SMS non abilitato per l'applicazione",
"The login method: login with email is not enabled for the application": "Metodo di accesso: login con email non abilitato per l'applicazione",
"The login method: login with face is not enabled for the application": "Metodo di accesso: login con riconoscimento facciale non abilitato per l'applicazione",
"The login method: login with password is not enabled for the application": "Login con password non abilitato per questa app",
"The organization: %s does not exist": "L'organizzazione: %s non esiste",
"The organization: %s has disabled users to signin": "The organization: %s has disabled users to signin",
"The provider: %s does not exist": "Il provider: %s non esiste",
"The provider: %s is not enabled for the application": "Il provider: %s non è abilitato per l'app",
"Unauthorized operation": "Operazione non autorizzata",

View File

@@ -16,12 +16,14 @@
"The account for provider: %s and username: %s (%s) does not exist and is not allowed to sign up as new account, please contact your IT support": "プロバイダー名:%sとユーザー名%s%sのアカウントは存在しません。新しいアカウントとしてサインアップすることはできません。 ITサポートに連絡してください",
"The account for provider: %s and username: %s (%s) is already linked to another account: %s (%s)": "プロバイダのアカウント:%s とユーザー名:%s (%s) は既に別のアカウント:%s (%s) にリンクされています",
"The application: %s does not exist": "アプリケーション: %sは存在しません",
"The application: %s has disabled users to signin": "The application: %s has disabled users to signin",
"The login method: login with LDAP is not enabled for the application": "このアプリケーションでは LDAP ログインは有効になっていません",
"The login method: login with SMS is not enabled for the application": "このアプリケーションでは SMS ログインは有効になっていません",
"The login method: login with email is not enabled for the application": "このアプリケーションではメールログインは有効になっていません",
"The login method: login with face is not enabled for the application": "このアプリケーションでは顔認証ログインは有効になっていません",
"The login method: login with password is not enabled for the application": "ログイン方法:パスワードでのログインはアプリケーションで有効になっていません",
"The organization: %s does not exist": "組織「%s」は存在しません",
"The organization: %s has disabled users to signin": "The organization: %s has disabled users to signin",
"The provider: %s does not exist": "プロバイダ「%s」は存在しません",
"The provider: %s is not enabled for the application": "プロバイダー:%sはアプリケーションでは有効化されていません",
"Unauthorized operation": "不正操作",

View File

@@ -16,12 +16,14 @@
"The account for provider: %s and username: %s (%s) does not exist and is not allowed to sign up as new account, please contact your IT support": "Account voor provider: %s en gebruikersnaam: %s (%s) bestaat niet en mag niet registreren, contacteer IT-support",
"The account for provider: %s and username: %s (%s) is already linked to another account: %s (%s)": "Account voor provider: %s en gebruikersnaam: %s (%s) is al gelinkt aan ander account: %s (%s)",
"The application: %s does not exist": "Applicatie: %s bestaat niet",
"The application: %s has disabled users to signin": "The application: %s has disabled users to signin",
"The login method: login with LDAP is not enabled for the application": "Inloggen via LDAP is niet ingeschakeld voor deze applicatie",
"The login method: login with SMS is not enabled for the application": "Inloggen via SMS is niet ingeschakeld voor deze applicatie",
"The login method: login with email is not enabled for the application": "Inloggen via e-mail is niet ingeschakeld voor deze applicatie",
"The login method: login with face is not enabled for the application": "Inloggen via gezichtsherkenning is niet ingeschakeld voor deze applicatie",
"The login method: login with password is not enabled for the application": "Inloggen via wachtwoord is niet ingeschakeld voor deze applicatie",
"The organization: %s does not exist": "Organisatie: %s bestaat niet",
"The organization: %s has disabled users to signin": "The organization: %s has disabled users to signin",
"The provider: %s does not exist": "Provider: %s bestaat niet",
"The provider: %s is not enabled for the application": "Provider: %s is niet ingeschakeld voor de applicatie",
"Unauthorized operation": "Ongeautoriseerde handeling",

View File

@@ -16,12 +16,14 @@
"The account for provider: %s and username: %s (%s) does not exist and is not allowed to sign up as new account, please contact your IT support": "공급자 계정 %s과 사용자 이름 %s (%s)는 존재하지 않으며 새 계정으로 등록할 수 없습니다. IT 지원팀에 문의하십시오",
"The account for provider: %s and username: %s (%s) is already linked to another account: %s (%s)": "공급자 계정 %s과 사용자 이름 %s(%s)는 이미 다른 계정 %s(%s)에 연결되어 있습니다",
"The application: %s does not exist": "해당 애플리케이션(%s)이 존재하지 않습니다",
"The application: %s has disabled users to signin": "The application: %s has disabled users to signin",
"The login method: login with LDAP is not enabled for the application": "LDAP를 이용한 로그인 방식이 이 애플리케이션에 활성화되어 있지 않습니다",
"The login method: login with SMS is not enabled for the application": "SMS를 이용한 로그인 방식이 이 애플리케이션에 활성화되어 있지 않습니다",
"The login method: login with email is not enabled for the application": "이메일을 이용한 로그인 방식이 이 애플리케이션에 활성화되어 있지 않습니다",
"The login method: login with face is not enabled for the application": "얼굴 인식을 이용한 로그인 방식이 이 애플리케이션에 활성화되어 있지 않습니다",
"The login method: login with password is not enabled for the application": "어플리케이션에서는 암호를 사용한 로그인 방법이 활성화되어 있지 않습니다",
"The organization: %s does not exist": "조직 %s이(가) 존재하지 않습니다",
"The organization: %s has disabled users to signin": "The organization: %s has disabled users to signin",
"The provider: %s does not exist": "제공자 %s이(가) 존재하지 않습니다",
"The provider: %s is not enabled for the application": "제공자 %s은(는) 응용 프로그램에서 활성화되어 있지 않습니다",
"Unauthorized operation": "무단 조작",

View File

@@ -16,12 +16,14 @@
"The account for provider: %s and username: %s (%s) does not exist and is not allowed to sign up as new account, please contact your IT support": "Akaun untuk pembekal: %s dan nama pengguna: %s (%s) tidak wujud dan tidak dibenarkan daftar, sila hubungi sokongan IT",
"The account for provider: %s and username: %s (%s) is already linked to another account: %s (%s)": "Akaun untuk pembekal: %s dan nama pengguna: %s (%s) sudah dipautkan kepada akaun lain: %s (%s)",
"The application: %s does not exist": "Aplikasi: %s tidak wujud",
"The application: %s has disabled users to signin": "The application: %s has disabled users to signin",
"The login method: login with LDAP is not enabled for the application": "Kaedah log masuk LDAP tidak dibenarkan untuk aplikasi ini",
"The login method: login with SMS is not enabled for the application": "Kaedah log masuk SMS tidak dibenarkan untuk aplikasi ini",
"The login method: login with email is not enabled for the application": "Kaedah log masuk emel tidak dibenarkan untuk aplikasi ini",
"The login method: login with face is not enabled for the application": "Kaedah log masuk muka tidak dibenarkan untuk aplikasi ini",
"The login method: login with password is not enabled for the application": "Kaedah log masuk kata laluan tidak dibenarkan untuk aplikasi ini",
"The organization: %s does not exist": "Organisasi: %s tidak wujud",
"The organization: %s has disabled users to signin": "The organization: %s has disabled users to signin",
"The provider: %s does not exist": "Pembekal: %s tidak wujud",
"The provider: %s is not enabled for the application": "Pembekal: %s tidak dibenarkan untuk aplikasi ini",
"Unauthorized operation": "Operasi tidak dibenarkan",

View File

@@ -16,12 +16,14 @@
"The account for provider: %s and username: %s (%s) does not exist and is not allowed to sign up as new account, please contact your IT support": "Gebruiker bestaat niet; aanmelden niet toegestaan, neem contact op met IT",
"The account for provider: %s and username: %s (%s) is already linked to another account: %s (%s)": "Account al gekoppeld aan andere gebruiker: %s (%s)",
"The application: %s does not exist": "Applicatie %s bestaat niet",
"The application: %s has disabled users to signin": "The application: %s has disabled users to signin",
"The login method: login with LDAP is not enabled for the application": "LDAP-login uitgeschakeld voor deze app",
"The login method: login with SMS is not enabled for the application": "SMS-login uitgeschakeld voor deze app",
"The login method: login with email is not enabled for the application": "E-mail-login uitgeschakeld voor deze app",
"The login method: login with face is not enabled for the application": "Face-login uitgeschakeld voor deze app",
"The login method: login with password is not enabled for the application": "Wachtwoord-login uitgeschakeld voor deze app",
"The organization: %s does not exist": "Organisatie %s bestaat niet",
"The organization: %s has disabled users to signin": "The organization: %s has disabled users to signin",
"The provider: %s does not exist": "Provider %s bestaat niet",
"The provider: %s is not enabled for the application": "Provider %s uitgeschakeld voor deze app",
"Unauthorized operation": "Niet toegestane handeling",

View File

@@ -16,12 +16,14 @@
"The account for provider: %s and username: %s (%s) does not exist and is not allowed to sign up as new account, please contact your IT support": "Konto dla dostawcy: %s i nazwy użytkownika: %s (%s) nie istnieje i nie można się zarejestrować jako nowe konto, skontaktuj się z pomocą IT",
"The account for provider: %s and username: %s (%s) is already linked to another account: %s (%s)": "Konto dla dostawcy: %s i nazwy użytkownika: %s (%s) jest już powiązane z innym kontem: %s (%s)",
"The application: %s does not exist": "Aplikacja: %s nie istnieje",
"The application: %s has disabled users to signin": "The application: %s has disabled users to signin",
"The login method: login with LDAP is not enabled for the application": "Metoda logowania: logowanie przez LDAP nie jest włączone dla aplikacji",
"The login method: login with SMS is not enabled for the application": "Metoda logowania: logowanie przez SMS nie jest włączona dla aplikacji",
"The login method: login with email is not enabled for the application": "Metoda logowania: logowanie przez email nie jest włączona dla aplikacji",
"The login method: login with face is not enabled for the application": "Metoda logowania: logowanie przez twarz nie jest włączona dla aplikacji",
"The login method: login with password is not enabled for the application": "Metoda logowania: logowanie przez hasło nie jest włączone dla aplikacji",
"The organization: %s does not exist": "Organizacja: %s nie istnieje",
"The organization: %s has disabled users to signin": "The organization: %s has disabled users to signin",
"The provider: %s does not exist": "Dostawca: %s nie istnieje",
"The provider: %s is not enabled for the application": "Dostawca: %s nie jest włączony dla aplikacji",
"Unauthorized operation": "Nieautoryzowana operacja",

View File

@@ -16,12 +16,14 @@
"The account for provider: %s and username: %s (%s) does not exist and is not allowed to sign up as new account, please contact your IT support": "A conta para o provedor: %s e nome de usuário: %s (%s) não existe e não é permitido inscrever-se como uma nova conta entre em contato com seu suporte de TI",
"The account for provider: %s and username: %s (%s) is already linked to another account: %s (%s)": "A conta do provedor: %s e nome de usuário: %s (%s) já está vinculada a outra conta: %s (%s)",
"The application: %s does not exist": "O aplicativo: %s não existe",
"The application: %s has disabled users to signin": "The application: %s has disabled users to signin",
"The login method: login with LDAP is not enabled for the application": "O método de login: login com LDAP não está ativado para a aplicação",
"The login method: login with SMS is not enabled for the application": "O método de login: login com SMS não está ativado para a aplicação",
"The login method: login with email is not enabled for the application": "O método de login: login com e-mail não está ativado para a aplicação",
"The login method: login with face is not enabled for the application": "O método de login: login com reconhecimento facial não está ativado para a aplicação",
"The login method: login with password is not enabled for the application": "O método de login: login com senha não está habilitado para o aplicativo",
"The organization: %s does not exist": "A organização: %s não existe",
"The organization: %s has disabled users to signin": "The organization: %s has disabled users to signin",
"The provider: %s does not exist": "O provedor: %s não existe",
"The provider: %s is not enabled for the application": "O provedor: %s não está habilitado para o aplicativo",
"Unauthorized operation": "Operação não autorizada",

View File

@@ -16,12 +16,14 @@
"The account for provider: %s and username: %s (%s) does not exist and is not allowed to sign up as new account, please contact your IT support": "Аккаунт для провайдера: %s и имя пользователя: %s (%s) не существует и не может быть зарегистрирован как новый аккаунт. Пожалуйста, обратитесь в службу поддержки IT",
"The account for provider: %s and username: %s (%s) is already linked to another account: %s (%s)": "Аккаунт поставщика: %s и имя пользователя: %s (%s) уже связаны с другим аккаунтом: %s (%s)",
"The application: %s does not exist": "Приложение: %s не существует",
"The application: %s has disabled users to signin": "The application: %s has disabled users to signin",
"The login method: login with LDAP is not enabled for the application": "Метод входа через LDAP отключен для этого приложения",
"The login method: login with SMS is not enabled for the application": "Метод входа через SMS отключен для этого приложения",
"The login method: login with email is not enabled for the application": "Метод входа через электронную почту отключен для этого приложения",
"The login method: login with face is not enabled for the application": "Метод входа через распознавание лица отключен для этого приложения",
"The login method: login with password is not enabled for the application": "Метод входа: вход с паролем не включен для приложения",
"The organization: %s does not exist": "Организация: %s не существует",
"The organization: %s has disabled users to signin": "The organization: %s has disabled users to signin",
"The provider: %s does not exist": "Провайдер: %s не существует",
"The provider: %s is not enabled for the application": "Провайдер: %s не включен для приложения",
"Unauthorized operation": "Несанкционированная операция",

View File

@@ -16,12 +16,14 @@
"The account for provider: %s and username: %s (%s) does not exist and is not allowed to sign up as new account, please contact your IT support": "Účet pre poskytovateľa: %s a používateľské meno: %s (%s) neexistuje a nie je povolené zaregistrovať nový účet, prosím kontaktujte vašu IT podporu",
"The account for provider: %s and username: %s (%s) is already linked to another account: %s (%s)": "Účet pre poskytovateľa: %s a používateľské meno: %s (%s) je už prepojený s iným účtom: %s (%s)",
"The application: %s does not exist": "Aplikácia: %s neexistuje",
"The application: %s has disabled users to signin": "The application: %s has disabled users to signin",
"The login method: login with LDAP is not enabled for the application": "Metóda prihlásenia: prihlásenie pomocou LDAP nie je pre aplikáciu povolená",
"The login method: login with SMS is not enabled for the application": "Metóda prihlásenia: prihlásenie pomocou SMS nie je pre aplikáciu povolená",
"The login method: login with email is not enabled for the application": "Metóda prihlásenia: prihlásenie pomocou e-mailu nie je pre aplikáciu povolená",
"The login method: login with face is not enabled for the application": "Metóda prihlásenia: prihlásenie pomocou tváre nie je pre aplikáciu povolená",
"The login method: login with password is not enabled for the application": "Metóda prihlásenia: prihlásenie pomocou hesla nie je pre aplikáciu povolená",
"The organization: %s does not exist": "Organizácia: %s neexistuje",
"The organization: %s has disabled users to signin": "The organization: %s has disabled users to signin",
"The provider: %s does not exist": "Poskytovatel: %s neexistuje",
"The provider: %s is not enabled for the application": "Poskytovateľ: %s nie je pre aplikáciu povolený",
"Unauthorized operation": "Neautorizovaná operácia",

View File

@@ -16,12 +16,14 @@
"The account for provider: %s and username: %s (%s) does not exist and is not allowed to sign up as new account, please contact your IT support": "Kontot för leverantör: %s och användarnamn: %s (%s) finns inte och det är inte tillåtet att registrera ett nytt konto, kontakta din IT-support",
"The account for provider: %s and username: %s (%s) is already linked to another account: %s (%s)": "Kontot för leverantör: %s och användarnamn: %s (%s) är redan länkat till ett annat konto: %s (%s)",
"The application: %s does not exist": "Applikationen: %s finns inte",
"The application: %s has disabled users to signin": "The application: %s has disabled users to signin",
"The login method: login with LDAP is not enabled for the application": "Inloggningsmetoden: inloggning med LDAP är inte aktiverad för applikationen",
"The login method: login with SMS is not enabled for the application": "Inloggningsmetoden: inloggning med SMS är inte aktiverad för applikationen",
"The login method: login with email is not enabled for the application": "Inloggningsmetoden: inloggning med e-post är inte aktiverad för applikationen",
"The login method: login with face is not enabled for the application": "Inloggningsmetoden: inloggning med ansikte är inte aktiverad för applikationen",
"The login method: login with password is not enabled for the application": "Inloggningsmetoden: inloggning med lösenord är inte aktiverad för applikationen",
"The organization: %s does not exist": "Organisationen: %s finns inte",
"The organization: %s has disabled users to signin": "The organization: %s has disabled users to signin",
"The provider: %s does not exist": "Leverantören: %s finns inte",
"The provider: %s is not enabled for the application": "Leverantören: %s är inte aktiverad för applikationen",
"Unauthorized operation": "Obehörig åtgärd",

View File

@@ -16,12 +16,14 @@
"The account for provider: %s and username: %s (%s) does not exist and is not allowed to sign up as new account, please contact your IT support": "Provider: %s ve kullanıcı adı: %s (%s) için hesap mevcut değil ve yeni hesap açılmasına izin verilmiyor, lütfen BT destek ile iletişime geçin",
"The account for provider: %s and username: %s (%s) is already linked to another account: %s (%s)": "Provider: %s ve kullanıcı adı: %s (%s) zaten başka bir hesaba bağlı: %s (%s)",
"The application: %s does not exist": "Uygulama: %s bulunamadı",
"The application: %s has disabled users to signin": "The application: %s has disabled users to signin",
"The login method: login with LDAP is not enabled for the application": "Uygulama için LDAP ile giriş yöntemi etkin değil",
"The login method: login with SMS is not enabled for the application": "Uygulama için SMS ile giriş yöntemi etkin değil",
"The login method: login with email is not enabled for the application": "Uygulama için e-posta ile giriş yöntemi etkin değil",
"The login method: login with face is not enabled for the application": "Uygulama için yüz ile giriş yöntemi etkin değil",
"The login method: login with password is not enabled for the application": "Şifre ile giriş yöntemi bu uygulama için etkin değil",
"The organization: %s does not exist": "Organizasyon: %s mevcut değil",
"The organization: %s has disabled users to signin": "The organization: %s has disabled users to signin",
"The provider: %s does not exist": "Sağlayıcı: %s mevcut değil",
"The provider: %s is not enabled for the application": "Provider: %s bu uygulama için etkin değil",
"Unauthorized operation": "Yetkisiz işlem",

View File

@@ -16,12 +16,14 @@
"The account for provider: %s and username: %s (%s) does not exist and is not allowed to sign up as new account, please contact your IT support": "Обліковий запис для провайдера: %s та імені користувача: %s (%s) не існує і не дозволяється реєструвати як новий, зверніться до IT-підтримки",
"The account for provider: %s and username: %s (%s) is already linked to another account: %s (%s)": "Обліковий запис для провайдера: %s та імені користувача: %s (%s) уже пов’язаний з іншим обліковим записом: %s (%s)",
"The application: %s does not exist": "Додаток: %s не існує",
"The application: %s has disabled users to signin": "The application: %s has disabled users to signin",
"The login method: login with LDAP is not enabled for the application": "Метод входу через LDAP не увімкнено для цього додатка",
"The login method: login with SMS is not enabled for the application": "Метод входу через SMS не увімкнено для цього додатка",
"The login method: login with email is not enabled for the application": "Метод входу через email не увімкнено для цього додатка",
"The login method: login with face is not enabled for the application": "Метод входу через обличчя не увімкнено для цього додатка",
"The login method: login with password is not enabled for the application": "Метод входу через пароль не увімкнено для цього додатка",
"The organization: %s does not exist": "Організація: %s не існує",
"The organization: %s has disabled users to signin": "The organization: %s has disabled users to signin",
"The provider: %s does not exist": "Провайдер: %s не існує",
"The provider: %s is not enabled for the application": "Провайдер: %s не увімкнено для цього додатка",
"Unauthorized operation": "Неавторизована операція",

View File

@@ -16,12 +16,14 @@
"The account for provider: %s and username: %s (%s) does not exist and is not allowed to sign up as new account, please contact your IT support": "Tài khoản cho nhà cung cấp: %s và tên người dùng: %s (%s) không tồn tại và không được phép đăng ký như một tài khoản mới, vui lòng liên hệ với bộ phận hỗ trợ công nghệ thông tin của bạn",
"The account for provider: %s and username: %s (%s) is already linked to another account: %s (%s)": "Tài khoản cho nhà cung cấp: %s và tên người dùng: %s (%s) đã được liên kết với tài khoản khác: %s (%s)",
"The application: %s does not exist": "Ứng dụng: %s không tồn tại",
"The application: %s has disabled users to signin": "The application: %s has disabled users to signin",
"The login method: login with LDAP is not enabled for the application": "Phương thức đăng nhập bằng LDAP chưa được bật cho ứng dụng",
"The login method: login with SMS is not enabled for the application": "Phương thức đăng nhập bằng SMS chưa được bật cho ứng dụng",
"The login method: login with email is not enabled for the application": "Phương thức đăng nhập bằng email chưa được bật cho ứng dụng",
"The login method: login with face is not enabled for the application": "Phương thức đăng nhập bằng khuôn mặt chưa được bật cho ứng dụng",
"The login method: login with password is not enabled for the application": "Phương thức đăng nhập: đăng nhập bằng mật khẩu không được kích hoạt cho ứng dụng",
"The organization: %s does not exist": "Tổ chức: %s không tồn tại",
"The organization: %s has disabled users to signin": "The organization: %s has disabled users to signin",
"The provider: %s does not exist": "Nhà cung cấp: %s không tồn tại",
"The provider: %s is not enabled for the application": "Nhà cung cấp: %s không được kích hoạt cho ứng dụng",
"Unauthorized operation": "Hoạt động không được ủy quyền",

View File

@@ -16,12 +16,14 @@
"The account for provider: %s and username: %s (%s) does not exist and is not allowed to sign up as new account, please contact your IT support": "提供商账户: %s 与用户名: %s (%s) 不存在且 不允许注册新账户, 请联系IT支持",
"The account for provider: %s and username: %s (%s) is already linked to another account: %s (%s)": "提供商账户: %s与用户名: %s (%s)已经与其他账户绑定: %s (%s)",
"The application: %s does not exist": "应用%s不存在",
"The application: %s has disabled users to signin": "应用: %s 禁止用户登录",
"The login method: login with LDAP is not enabled for the application": "该应用禁止采用LDAP登录方式",
"The login method: login with SMS is not enabled for the application": "该应用禁止采用短信登录方式",
"The login method: login with email is not enabled for the application": "该应用禁止采用邮箱登录方式",
"The login method: login with face is not enabled for the application": "该应用禁止采用人脸登录",
"The login method: login with password is not enabled for the application": "该应用禁止采用密码登录方式",
"The organization: %s does not exist": "组织: %s 不存在",
"The organization: %s has disabled users to signin": "组织: %s 禁止用户登录",
"The provider: %s does not exist": "提供商: %s 不存在",
"The provider: %s is not enabled for the application": "该应用的提供商: %s未被启用",
"Unauthorized operation": "未授权的操作",

View File

@@ -20,6 +20,7 @@ import (
"fmt"
"io"
"net/http"
"strings"
"github.com/casdoor/casdoor/util"
"github.com/mitchellh/mapstructure"
@@ -64,6 +65,25 @@ func (idp *CustomIdProvider) GetToken(code string) (*oauth2.Token, error) {
return idp.Config.Exchange(ctx, code)
}
func getNestedValue(data map[string]interface{}, path string) (interface{}, error) {
keys := strings.Split(path, ".")
var val interface{} = data
for _, key := range keys {
m, ok := val.(map[string]interface{})
if !ok {
return nil, fmt.Errorf("path '%s' is not valid: %s is not a map", path, key)
}
val, ok = m[key]
if !ok {
return nil, fmt.Errorf("key '%s' not found in path '%s'", key, path)
}
}
return val, nil
}
type CustomUserInfo struct {
Id string `mapstructure:"id"`
Username string `mapstructure:"username"`
@@ -108,11 +128,11 @@ func (idp *CustomIdProvider) GetUserInfo(token *oauth2.Token) (*UserInfo, error)
// map user info
for k, v := range idp.UserMapping {
_, ok := dataMap[v]
if !ok {
return nil, fmt.Errorf("cannot find %s in user from custom provider", v)
val, err := getNestedValue(dataMap, v)
if err != nil {
return nil, fmt.Errorf("cannot find %s in user from custom provider: %v", v, err)
}
dataMap[k] = dataMap[v]
dataMap[k] = val
}
// try to parse id to string

View File

@@ -17,7 +17,6 @@ package idp
import (
"bytes"
"crypto/sha1"
"encoding/base64"
"encoding/hex"
"encoding/json"
"fmt"
@@ -29,7 +28,6 @@ import (
"sync"
"time"
"github.com/skip2/go-qrcode"
"golang.org/x/oauth2"
)
@@ -324,10 +322,7 @@ func GetWechatOfficialAccountQRCode(clientId string, clientSecret string, provid
return "", "", err
}
var png []byte
png, err = qrcode.Encode(data.URL, qrcode.Medium, 256)
base64Image := base64.StdEncoding.EncodeToString(png)
return base64Image, data.Ticket, nil
return data.URL, data.Ticket, nil
}
func VerifyWechatSignature(token string, nonce string, timestamp string, signature string) bool {

View File

@@ -37,7 +37,8 @@
"UA",
"KZ",
"CZ",
"SK"
"SK",
"AZ"
],
"defaultAvatar": "",
"defaultApplication": "",
@@ -66,13 +67,15 @@
"kk",
"fa",
"cs",
"sk"
"sk",
"az"
],
"masterPassword": "",
"defaultPassword": "",
"initScore": 2000,
"enableSoftDeletion": false,
"isProfilePublic": true,
"disableSignin": false,
"accountItems": []
}
],
@@ -87,6 +90,7 @@
"cert": "",
"enablePassword": true,
"enableSignUp": true,
"disableSignin": false,
"clientId": "",
"clientSecret": "",
"providers": [

View File

@@ -19,6 +19,7 @@ import (
"fmt"
"hash/fnv"
"log"
"strings"
"github.com/casdoor/casdoor/conf"
"github.com/casdoor/casdoor/object"
@@ -149,10 +150,6 @@ func handleSearch(w ldap.ResponseWriter, m *ldap.Message) {
}
r := m.GetSearchRequest()
if r.FilterString() == "(objectClass=*)" {
w.Write(res)
return
}
// Handle Stop Signal (server stop / client disconnected / Abandoned request....)
select {
@@ -162,6 +159,43 @@ func handleSearch(w ldap.ResponseWriter, m *ldap.Message) {
default:
}
if strings.EqualFold(r.FilterString(), "(objectClass=*)") && (string(r.BaseObject()) == "" || strings.EqualFold(string(r.BaseObject()), "cn=Subschema")) {
handleRootSearch(w, &r, &res, m)
return
}
var isGroupSearch bool = false
filter := r.Filter()
if eq, ok := filter.(message.FilterEqualityMatch); ok && strings.EqualFold(string(eq.AttributeDesc()), "objectClass") && strings.EqualFold(string(eq.AssertionValue()), "posixGroup") {
isGroupSearch = true
}
if isGroupSearch {
groups, code := GetFilteredGroups(m, string(r.BaseObject()), r.FilterString())
if code != ldap.LDAPResultSuccess {
res.SetResultCode(code)
w.Write(res)
return
}
for _, group := range groups {
dn := fmt.Sprintf("cn=%s,%s", group.Name, string(r.BaseObject()))
e := ldap.NewSearchResultEntry(dn)
e.AddAttribute("cn", message.AttributeValue(group.Name))
gidNumberStr := fmt.Sprintf("%v", hash(group.Name))
e.AddAttribute("gidNumber", message.AttributeValue(gidNumberStr))
users := object.GetGroupUsersWithoutError(group.GetId())
for _, user := range users {
e.AddAttribute("memberUid", message.AttributeValue(user.Name))
}
e.AddAttribute("objectClass", "posixGroup")
w.Write(e)
}
w.Write(res)
return
}
users, code := GetFilteredUsers(m)
if code != ldap.LDAPResultSuccess {
res.SetResultCode(code)
@@ -200,6 +234,46 @@ func handleSearch(w ldap.ResponseWriter, m *ldap.Message) {
w.Write(res)
}
func handleRootSearch(w ldap.ResponseWriter, r *message.SearchRequest, res *message.SearchResultDone, m *ldap.Message) {
if len(r.Attributes()) == 0 {
w.Write(res)
return
}
firstAttr := string(r.Attributes()[0])
if string(r.BaseObject()) == "" {
// Handle special root DSE requests
if strings.EqualFold(firstAttr, "namingContexts") {
orgs, code := GetFilteredOrganizations(m)
if code != ldap.LDAPResultSuccess {
res.SetResultCode(code)
w.Write(res)
return
}
e := ldap.NewSearchResultEntry(string(r.BaseObject()))
dnlist := make([]message.AttributeValue, len(orgs))
for i, org := range orgs {
dnlist[i] = message.AttributeValue(fmt.Sprintf("ou=%s", org.Name))
}
e.AddAttribute("namingContexts", dnlist...)
w.Write(e)
} else if strings.EqualFold(firstAttr, "subschemaSubentry") {
e := ldap.NewSearchResultEntry(string(r.BaseObject()))
e.AddAttribute("subschemaSubentry", message.AttributeValue("cn=Subschema"))
w.Write(e)
}
} else if strings.EqualFold(firstAttr, "objectclasses") && strings.EqualFold(string(r.BaseObject()), "cn=Subschema") {
e := ldap.NewSearchResultEntry(string(r.BaseObject()))
e.AddAttribute("objectClasses", []message.AttributeValue{
"( 1.3.6.1.1.1.2.0 NAME 'posixAccount' DESC 'Abstraction of an account with POSIX attributes' SUP top AUXILIARY MUST ( cn $ uid $ uidNumber $ gidNumber $ homeDirectory ) MAY ( userPassword $ loginShell $ gecos $ description ) )",
"( 1.3.6.1.1.1.2.2 NAME 'posixGroup' DESC 'Abstraction of a group of accounts' SUP top STRUCTURAL MUST ( cn $ gidNumber ) MAY ( userPassword $ memberUid $ description ) )",
}...)
w.Write(e)
}
w.Write(res)
}
func hash(s string) uint32 {
h := fnv.New32a()
h.Write([]byte(s))

View File

@@ -184,6 +184,10 @@ func buildUserFilterCondition(filter interface{}) (builder.Cond, error) {
case message.FilterEqualityMatch:
attr := string(f.AttributeDesc())
if strings.EqualFold(attr, "objectclass") && strings.EqualFold(string(f.AssertionValue()), "posixAccount") {
return builder.Expr("1 = 1"), nil
}
if attr == ldapMemberOfAttr {
var names []string
groupId := string(f.AssertionValue())
@@ -200,6 +204,9 @@ func buildUserFilterCondition(filter interface{}) (builder.Cond, error) {
}
return builder.Eq{field: string(f.AssertionValue())}, nil
case message.FilterPresent:
if strings.EqualFold(string(f), "objectclass") {
return builder.Expr("1 = 1"), nil
}
field, err := getUserFieldFromAttribute(string(f))
if err != nil {
return nil, err
@@ -321,6 +328,59 @@ func GetFilteredUsers(m *ldap.Message) (filteredUsers []*object.User, code int)
}
}
func GetFilteredGroups(m *ldap.Message, baseDN string, filterStr string) ([]*object.Group, int) {
name, org, code := getNameAndOrgFromFilter(baseDN, filterStr)
if code != ldap.LDAPResultSuccess {
return nil, code
}
var groups []*object.Group
var err error
if name == "*" {
if m.Client.IsGlobalAdmin && org == "*" {
groups, err = object.GetGlobalGroups()
if err != nil {
panic(err)
}
} else if m.Client.IsGlobalAdmin || org == m.Client.OrgName {
groups, err = object.GetGroups(org)
if err != nil {
panic(err)
}
} else {
return nil, ldap.LDAPResultInsufficientAccessRights
}
} else {
return nil, ldap.LDAPResultNoSuchObject
}
return groups, ldap.LDAPResultSuccess
}
func GetFilteredOrganizations(m *ldap.Message) ([]*object.Organization, int) {
if m.Client.IsGlobalAdmin {
organizations, err := object.GetOrganizations("")
if err != nil {
panic(err)
}
return organizations, ldap.LDAPResultSuccess
} else if m.Client.IsOrgAdmin {
requestUserId := util.GetId(m.Client.OrgName, m.Client.UserName)
user, err := object.GetUser(requestUserId)
if err != nil {
panic(err)
}
organization, err := object.GetOrganizationByUser(user)
if err != nil {
panic(err)
}
return []*object.Organization{organization}, ldap.LDAPResultSuccess
} else {
return nil, ldap.LDAPResultInsufficientAccessRights
}
}
// get user password with hash type prefix
// TODO not handle salt yet
// @return {md5}5f4dcc3b5aa765d61d8327deb882cf99

View File

@@ -75,6 +75,7 @@ type Application struct {
HeaderHtml string `xorm:"mediumtext" json:"headerHtml"`
EnablePassword bool `json:"enablePassword"`
EnableSignUp bool `json:"enableSignUp"`
DisableSignin bool `json:"disableSignin"`
EnableSigninSession bool `json:"enableSigninSession"`
EnableAutoSignin bool `json:"enableAutoSignin"`
EnableCodeSignin bool `json:"enableCodeSignin"`

View File

@@ -16,6 +16,7 @@ package object
import (
"fmt"
"slices"
"github.com/casbin/casbin/v2"
"github.com/casdoor/casdoor/util"
@@ -206,6 +207,115 @@ func GetPolicies(id string) ([]*xormadapter.CasbinRule, error) {
return res, nil
}
// Filter represents filter criteria with optional policy type
type Filter struct {
Ptype string `json:"ptype,omitempty"`
FieldIndex *int `json:"fieldIndex,omitempty"`
FieldValues []string `json:"fieldValues"`
}
func GetFilteredPolicies(id string, ptype string, fieldIndex int, fieldValues ...string) ([]*xormadapter.CasbinRule, error) {
enforcer, err := GetInitializedEnforcer(id)
if err != nil {
return nil, err
}
var allRules [][]string
if len(fieldValues) == 0 {
if ptype == "g" {
allRules = enforcer.GetFilteredGroupingPolicy(fieldIndex)
} else {
allRules = enforcer.GetFilteredPolicy(fieldIndex)
}
} else {
for _, value := range fieldValues {
if ptype == "g" {
rules := enforcer.GetFilteredGroupingPolicy(fieldIndex, value)
allRules = append(allRules, rules...)
} else {
rules := enforcer.GetFilteredPolicy(fieldIndex, value)
allRules = append(allRules, rules...)
}
}
}
res := util.MatrixToCasbinRules(ptype, allRules)
return res, nil
}
// GetFilteredPoliciesMulti applies multiple filters to policies
// Doing this in our loop is more efficient than using GetFilteredGroupingPolicy / GetFilteredPolicy which
// iterates over all policies again and again
func GetFilteredPoliciesMulti(id string, filters []Filter) ([]*xormadapter.CasbinRule, error) {
// Get all policies first
allPolicies, err := GetPolicies(id)
if err != nil {
return nil, err
}
// Filter policies based on multiple criteria
var filteredPolicies []*xormadapter.CasbinRule
if len(filters) == 0 {
// No filters, return all policies
return allPolicies, nil
} else {
for _, policy := range allPolicies {
matchesAllFilters := true
for _, filter := range filters {
// Default policy type if unspecified
if filter.Ptype == "" {
filter.Ptype = "p"
}
// Always check policy type
if policy.Ptype != filter.Ptype {
matchesAllFilters = false
break
}
// If FieldIndex is nil, only filter via ptype (skip field-value checks)
if filter.FieldIndex == nil {
continue
}
fieldIndex := *filter.FieldIndex
// If FieldIndex is out of range, also only filter via ptype
if fieldIndex < 0 || fieldIndex > 5 {
continue
}
var fieldValue string
switch fieldIndex {
case 0:
fieldValue = policy.V0
case 1:
fieldValue = policy.V1
case 2:
fieldValue = policy.V2
case 3:
fieldValue = policy.V3
case 4:
fieldValue = policy.V4
case 5:
fieldValue = policy.V5
}
// When FieldIndex is provided and valid, enforce FieldValues (if any)
if len(filter.FieldValues) > 0 && !slices.Contains(filter.FieldValues, fieldValue) {
matchesAllFilters = false
break
}
}
if matchesAllFilters {
filteredPolicies = append(filteredPolicies, policy)
}
}
}
return filteredPolicies, nil
}
func UpdatePolicy(id string, ptype string, oldPolicy []string, newPolicy []string) (bool, error) {
enforcer, err := GetInitializedEnforcer(id)
if err != nil {

View File

@@ -70,6 +70,16 @@ func GetGroups(owner string) ([]*Group, error) {
return groups, nil
}
func GetGlobalGroups() ([]*Group, error) {
groups := []*Group{}
err := ormer.Engine.Desc("created_time").Find(&groups)
if err != nil {
return nil, err
}
return groups, nil
}
func GetPaginationGroups(owner string, offset, limit int, field, value, sortField, sortOrder string) ([]*Group, error) {
groups := []*Group{}
session := GetSession(owner, offset, limit, field, value, sortField, sortOrder)

View File

@@ -30,7 +30,7 @@ type Ldap struct {
AllowSelfSignedCert bool `xorm:"bool" json:"allowSelfSignedCert"`
Username string `xorm:"varchar(100)" json:"username"`
Password string `xorm:"varchar(100)" json:"password"`
BaseDn string `xorm:"varchar(100)" json:"baseDn"`
BaseDn string `xorm:"varchar(500)" json:"baseDn"`
Filter string `xorm:"varchar(200)" json:"filter"`
FilterFields []string `xorm:"varchar(100)" json:"filterFields"`
DefaultGroup string `xorm:"varchar(100)" json:"defaultGroup"`

View File

@@ -80,6 +80,7 @@ type Organization struct {
IsProfilePublic bool `json:"isProfilePublic"`
UseEmailAsUsername bool `json:"useEmailAsUsername"`
EnableTour bool `json:"enableTour"`
DisableSignin bool `json:"disableSignin"`
IpRestriction string `json:"ipRestriction"`
NavItems []string `xorm:"mediumtext" json:"navItems"`
WidgetItems []string `xorm:"mediumtext" json:"widgetItems"`

View File

@@ -125,10 +125,10 @@ func getPolicies(permission *Permission) [][]string {
for _, action := range permission.Actions {
if domainExist {
for _, domain := range permission.Domains {
policies = append(policies, []string{userOrRole, domain, resource, strings.ToLower(action), strings.ToLower(permission.Effect), permissionId})
policies = append(policies, []string{userOrRole, domain, resource, action, strings.ToLower(permission.Effect), permissionId})
}
} else {
policies = append(policies, []string{userOrRole, resource, strings.ToLower(action), strings.ToLower(permission.Effect), "", permissionId})
policies = append(policies, []string{userOrRole, resource, action, strings.ToLower(permission.Effect), "", permissionId})
}
}
}

View File

@@ -31,9 +31,11 @@ func GetDirectResources(owner string, user string, provider *Provider, prefix st
fullPathPrefix := util.UrlJoin(provider.PathPrefix, prefix)
objects, err := storageProvider.List(fullPathPrefix)
for _, obj := range objects {
name := strings.TrimPrefix(obj.Path, "/")
name = strings.TrimPrefix(name, provider.PathPrefix+"/")
resource := &Resource{
Owner: owner,
Name: strings.TrimPrefix(obj.Path, "/"),
Name: name,
CreatedTime: obj.LastModified.Local().Format(time.RFC3339),
User: user,
Provider: "",

View File

@@ -20,6 +20,7 @@ import (
"strings"
"time"
"github.com/casdoor/casdoor/conf"
"github.com/casdoor/casdoor/util"
"github.com/golang-jwt/jwt/v5"
)
@@ -341,10 +342,31 @@ func getClaimsCustom(claims Claims, tokenField []string) jwt.MapClaims {
res["provider"] = claims.Provider
for _, field := range tokenField {
userField := userValue.FieldByName(field)
if userField.IsValid() {
newfield := util.SnakeToCamel(util.CamelToSnakeCase(field))
res[newfield] = userField.Interface()
if strings.HasPrefix(field, "Properties") {
/*
Use selected properties fields as custom claims.
Converts `Properties.my_field` to custom claim with name `my_field`.
*/
parts := strings.Split(field, ".")
if len(parts) != 2 || parts[0] != "Properties" { // Either too many segments, or not properly scoped to `Properties`, so skip.
continue
}
base, fieldName := parts[0], parts[1]
mField := userValue.FieldByName(base)
if !mField.IsValid() { // Can't find `Properties` field, so skip.
continue
}
finalField := mField.MapIndex(reflect.ValueOf(fieldName))
if finalField.IsValid() { // // Provided field within `Properties` exists, add claim.
res[fieldName] = finalField.Interface()
}
} else { // Use selected user field as claims.
userField := userValue.FieldByName(field)
if userField.IsValid() {
newfield := util.SnakeToCamel(util.CamelToSnakeCase(field))
res[newfield] = userField.Interface()
}
}
}
@@ -381,6 +403,14 @@ func generateJwtToken(application *Application, user *User, provider string, non
refreshExpireTime = expireTime
}
if conf.GetConfigBool("useGroupPathInToken") {
groupPath, err := user.GetUserFullGroupPath()
if err != nil {
return "", "", "", err
}
user.Groups = groupPath
}
user = refineUser(user)
_, originBackend := getOriginFromHost(host)

View File

@@ -1331,6 +1331,56 @@ func (user *User) CheckUserFace(faceIdImage []string, provider *Provider) (bool,
return false, nil
}
func (user *User) GetUserFullGroupPath() ([]string, error) {
if len(user.Groups) == 0 {
return []string{}, nil
}
var orgGroups []*Group
orgGroups, err := GetGroups(user.Owner)
if err != nil {
return nil, err
}
groupMap := make(map[string]Group)
for _, group := range orgGroups {
groupMap[group.Name] = *group
}
var groupFullPath []string
for _, groupId := range user.Groups {
_, groupName := util.GetOwnerAndNameFromIdNoCheck(groupId)
group, ok := groupMap[groupName]
if !ok {
continue
}
groupPath := groupName
curGroup, ok := groupMap[group.ParentId]
if !ok {
return []string{}, fmt.Errorf("group:Group %s not exist", group.ParentId)
}
for {
groupPath = util.GetId(curGroup.Name, groupPath)
if curGroup.IsTopGroup {
break
}
curGroup, ok = groupMap[curGroup.ParentId]
if !ok {
return []string{}, fmt.Errorf("group:Group %s not exist", curGroup.ParentId)
}
}
groupPath = util.GetId(curGroup.Owner, groupPath)
groupFullPath = append(groupFullPath, groupPath)
}
return groupFullPath, nil
}
func GenerateIdForNewUser(application *Application) (string, error) {
if application == nil || application.GetSignupItemRule("ID") != "Incremental" {
return util.GenerateId(), nil

View File

@@ -102,7 +102,12 @@ func AutoSigninFilter(ctx *context.Context) {
userId = ctx.Input.Query("username")
password := ctx.Input.Query("password")
if userId != "" && password != "" && ctx.Input.Query("grant_type") == "" {
owner, name := util.GetOwnerAndNameFromId(userId)
owner, name, err := util.GetOwnerAndNameFromIdWithError(userId)
if err != nil {
responseError(ctx, err.Error())
return
}
_, err = object.CheckUserPassword(owner, name, password, "en")
if err != nil {
responseError(ctx, err.Error())

View File

@@ -160,6 +160,7 @@ func initAPI() {
beego.Router("/api/add-adapter", &controllers.ApiController{}, "POST:AddAdapter")
beego.Router("/api/delete-adapter", &controllers.ApiController{}, "POST:DeleteAdapter")
beego.Router("/api/get-policies", &controllers.ApiController{}, "GET:GetPolicies")
beego.Router("/api/get-filtered-policies", &controllers.ApiController{}, "POST:GetFilteredPolicies")
beego.Router("/api/update-policy", &controllers.ApiController{}, "POST:UpdatePolicy")
beego.Router("/api/add-policy", &controllers.ApiController{}, "POST:AddPolicy")
beego.Router("/api/remove-policy", &controllers.ApiController{}, "POST:RemovePolicy")

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -543,6 +543,16 @@ class ApplicationEditPage extends React.Component {
}} />
</Col>
</Row>
<Row style={{marginTop: "20px"}} >
<Col style={{marginTop: "5px"}} span={(Setting.isMobile()) ? 19 : 2}>
{Setting.getLabel(i18next.t("application:Disable signin"), i18next.t("application:Disable signin - Tooltip"))} :
</Col>
<Col span={1} >
<Switch checked={this.state.application.disableSignin} onChange={checked => {
this.updateApplicationField("disableSignin", checked);
}} />
</Col>
</Row>
<Row style={{marginTop: "20px"}} >
<Col style={{marginTop: "5px"}} span={(Setting.isMobile()) ? 19 : 2}>
{Setting.getLabel(i18next.t("application:Signin session"), i18next.t("application:Enable signin session - Tooltip"))} :

View File

@@ -41,6 +41,7 @@ class ApplicationListPage extends BaseListPage {
logo: `${Setting.StaticBaseUrl}/img/casdoor-logo_1185x256.png`,
enablePassword: true,
enableSignUp: true,
disableSignin: false,
enableSigninSession: false,
enableCodeSignin: false,
enableSamlCompress: false,

View File

@@ -14,6 +14,7 @@
import React from "react";
import {Button, Card, Col, Input, InputNumber, Row, Select} from "antd";
import {CopyOutlined} from "@ant-design/icons";
import * as InvitationBackend from "./backend/InvitationBackend";
import * as OrganizationBackend from "./backend/OrganizationBackend";
import * as ApplicationBackend from "./backend/ApplicationBackend";
@@ -130,9 +131,6 @@ class InvitationEditPage extends React.Component {
{this.state.mode === "add" ? i18next.t("invitation:New Invitation") : i18next.t("invitation:Edit Invitation")}&nbsp;&nbsp;&nbsp;&nbsp;
<Button onClick={() => this.submitInvitationEdit(false)}>{i18next.t("general:Save")}</Button>
<Button style={{marginLeft: "20px"}} type="primary" onClick={() => this.submitInvitationEdit(true)}>{i18next.t("general:Save & Exit")}</Button>
<Button style={{marginLeft: "20px"}} onClick={_ => this.copySignupLink()}>
{i18next.t("application:Copy signup page URL")}
</Button>
{this.state.mode === "add" ? <Button style={{marginLeft: "20px"}} onClick={() => this.deleteInvitation()}>{i18next.t("general:Cancel")}</Button> : null}
</div>
} style={(Setting.isMobile()) ? {margin: "5px"} : {}} type="inner">
@@ -192,6 +190,15 @@ class InvitationEditPage extends React.Component {
}} />
</Col>
</Row>
<Row style={{marginTop: "20px"}} >
<Col style={{marginTop: "5px"}} span={(Setting.isMobile()) ? 22 : 2}>
</Col>
<Col span={22} >
<Button style={{marginBottom: "10px"}} type="primary" shape="round" icon={<CopyOutlined />} onClick={_ => this.copySignupLink()}>
{i18next.t("application:Copy signup page URL")}
</Button>
</Col>
</Row>
<Row style={{marginTop: "20px"}} >
<Col style={{marginTop: "5px"}} span={(Setting.isMobile()) ? 22 : 2}>
{Setting.getLabel(i18next.t("invitation:Quota"), i18next.t("invitation:Quota - Tooltip"))} :
@@ -337,9 +344,6 @@ class InvitationEditPage extends React.Component {
<div style={{marginTop: "20px", marginLeft: "40px"}}>
<Button size="large" onClick={() => this.submitInvitationEdit(false)}>{i18next.t("general:Save")}</Button>
<Button style={{marginLeft: "20px"}} type="primary" size="large" onClick={() => this.submitInvitationEdit(true)}>{i18next.t("general:Save & Exit")}</Button>
<Button style={{marginLeft: "20px"}} size="large" onClick={_ => this.copySignupLink()}>
{i18next.t("application:Copy signup page URL")}
</Button>
{this.state.mode === "add" ? <Button style={{marginLeft: "20px"}} size="large" onClick={() => this.deleteInvitation()}>{i18next.t("general:Cancel")}</Button> : null}
</div>
</div>

View File

@@ -561,6 +561,16 @@ class OrganizationEditPage extends React.Component {
}} />
</Col>
</Row>
<Row style={{marginTop: "20px"}} >
<Col style={{marginTop: "5px"}} span={(Setting.isMobile()) ? 19 : 2}>
{Setting.getLabel(i18next.t("application:Disable signin"), i18next.t("application:Disable signin - Tooltip"))} :
</Col>
<Col span={1} >
<Switch checked={this.state.organization.disableSignin} onChange={checked => {
this.updateOrganizationField("disableSignin", checked);
}} />
</Col>
</Row>
<Row style={{marginTop: "20px"}} >
<Col style={{marginTop: "5px"}} span={(Setting.isMobile()) ? 22 : 2}>
{Setting.getLabel(i18next.t("organization:Navbar items"), i18next.t("organization:Navbar items - Tooltip"))} :

View File

@@ -49,6 +49,7 @@ class OrganizationListPage extends BaseListPage {
enableSoftDeletion: false,
isProfilePublic: true,
enableTour: true,
disableSignin: false,
mfaRememberInHours: DefaultMfaRememberInHours,
accountItems: [
{name: "Organization", visible: true, viewRule: "Public", modifyRule: "Admin"},

View File

@@ -174,7 +174,11 @@ class ProviderEditPage extends React.Component {
}
}
provider.userMapping[key] = value;
if (value === "") {
delete provider.userMapping[key];
} else {
provider.userMapping[key] = value;
}
this.setState({
provider: provider,
@@ -878,9 +882,17 @@ class ProviderEditPage extends React.Component {
{this.getClientSecret2Label(this.state.provider)} :
</Col>
<Col span={22} >
<Input value={this.state.provider.clientSecret2} onChange={e => {
this.updateProviderField("clientSecret2", e.target.value);
}} />
{
(this.state.provider.category === "OAuth" && this.state.provider.type === "Apple") ? (
<TextArea autoSize={{minRows: 1, maxRows: 20}} value={this.state.provider.clientSecret2} onChange={e => {
this.updateProviderField("clientSecret2", e.target.value);
}} />
) : (
<Input value={this.state.provider.clientSecret2} onChange={e => {
this.updateProviderField("clientSecret2", e.target.value);
}} />
)
}
</Col>
</Row>
)

View File

@@ -60,6 +60,7 @@ export const Countries = [
{label: "فارسی", key: "fa", country: "IR", alt: "فارسی"},
{label: "Čeština", key: "cs", country: "CZ", alt: "Čeština"},
{label: "Slovenčina", key: "sk", country: "SK", alt: "Slovenčina"},
{label: "Azərbaycan dili", key: "az", country: "AZ", alt: "Azərbaycan dili"},
];
export function getThemeData(organization, application) {
@@ -156,7 +157,7 @@ export const OtherProviderInfo = {
url: "https://control.msg91.com/app/",
},
"OSON SMS": {
logo: "https://osonsms.com/images/osonsms-logo.svg",
logo: `${StaticBaseUrl}/img/social_osonsms.svg`,
url: "https://osonsms.com/",
},
"Custom HTTP SMS": {
@@ -204,7 +205,7 @@ export const OtherProviderInfo = {
url: "https://aws.amazon.com/s3",
},
"MinIO": {
logo: "https://min.io/resources/img/logo.svg",
logo: `${StaticBaseUrl}/img/social_minio.png`,
url: "https://min.io/",
},
"Aliyun OSS": {
@@ -1296,6 +1297,9 @@ export function renderSignupLink(application, text) {
} else {
if (application.signupUrl === "") {
url = `/signup/${application.name}`;
if (application.isShared) {
url = `/signup/${application.name}-org-${application.organization}`;
}
} else {
url = application.signupUrl;
}
@@ -1816,3 +1820,24 @@ export function renderLoginPanel(application, getInnerComponent, componentThis)
</div>
);
}
export function createFormAndSubmit(url, params) {
const form = document.createElement("form");
form.method = "post";
form.action = url;
for (const k in params) {
if (!params[k]) {
continue;
}
const input = document.createElement("input");
input.type = "hidden";
input.name = k;
input.value = params[k];
form.appendChild(input);
}
document.body.appendChild(form);
form.submit();
setTimeout(() => {form.remove();}, 500);
}

View File

@@ -326,7 +326,7 @@ class UserEditPage extends React.Component {
</Col>
<Col span={22} >
<Select virtual={false} mode="multiple" style={{width: "100%"}} disabled={disabled} value={this.state.user.groups ?? []} onChange={(value => {
if (this.state.groups?.filter(group => value.includes(group.name))
if (this.state.groups?.filter(group => value.includes(`${group.owner}/${group.name}`))
.filter(group => group.type === "Physical").length > 1) {
Setting.showMessage("error", i18next.t("general:You can only select one physical group"));
return;
@@ -1117,6 +1117,32 @@ class UserEditPage extends React.Component {
</Col>
</Row>
);
} else if (accountItem.name === "First name") {
return (
<Row style={{marginTop: "20px"}} >
<Col style={{marginTop: "5px"}} span={(Setting.isMobile()) ? 22 : 2}>
{Setting.getLabel(i18next.t("general:First name"), i18next.t("general:First name - Tooltip"))} :
</Col>
<Col span={22}>
<Input value={this.state.user.firstName} onChange={e => {
this.updateUserField("firstName", e.target.value);
}} />
</Col>
</Row>
);
} else if (accountItem.name === "Last name") {
return (
<Row style={{marginTop: "20px"}} >
<Col style={{marginTop: "5px"}} span={(Setting.isMobile()) ? 22 : 2}>
{Setting.getLabel(i18next.t("general:Last name"), i18next.t("general:Last name - Tooltip"))} :
</Col>
<Col span={22}>
<Input value={this.state.user.lastName} onChange={e => {
this.updateUserField("lastName", e.target.value);
}} />
</Col>
</Row>
);
}
}

View File

@@ -34,6 +34,7 @@ const applicationTemplate = {
logo: `${Setting.StaticBaseUrl}/img/casdoor-logo_1185x256.png`,
enablePassword: true,
enableSignUp: true,
disableSignin: false,
enableSigninSession: false,
enableCodeSignin: false,
enableSamlCompress: false,

View File

@@ -21,7 +21,7 @@ import {authConfig} from "./Auth";
import * as Setting from "../Setting";
import i18next from "i18next";
import RedirectForm from "../common/RedirectForm";
import {renderLoginPanel} from "../Setting";
import {createFormAndSubmit, renderLoginPanel} from "../Setting";
class AuthCallback extends React.Component {
constructor(props) {
@@ -35,30 +35,6 @@ class AuthCallback extends React.Component {
};
}
submitFormPost(redirectUri, code, state) {
const form = document.createElement("form");
form.method = "post";
form.action = redirectUri;
const codeInput = document.createElement("input");
codeInput.type = "hidden";
codeInput.name = "code";
codeInput.value = code;
form.appendChild(codeInput);
if (state) {
const stateInput = document.createElement("input");
stateInput.type = "hidden";
stateInput.name = "state";
stateInput.value = state;
form.appendChild(stateInput);
}
document.body.appendChild(form);
form.submit();
setTimeout(() => form.remove(), 1000);
}
getInnerParams() {
// For example, for Casbin-OA, realRedirectUri = "http://localhost:9000/login"
// realRedirectUrl = "http://localhost:9000"
@@ -189,6 +165,7 @@ class AuthCallback extends React.Component {
.then((res) => {
if (res.status === "ok") {
const responseType = this.getResponseType();
const responseTypes = responseType.split(" ");
const handleLogin = (res) => {
if (responseType === "login") {
if (res.data3) {
@@ -208,20 +185,35 @@ class AuthCallback extends React.Component {
}
if (responseMode === "form_post") {
this.submitFormPost(oAuthParams?.redirectUri, res.data, oAuthParams?.state);
const params = {
code: res.data,
state: oAuthParams?.state,
};
createFormAndSubmit(oAuthParams?.redirectUri, params);
} else {
const code = res.data;
Setting.goToLink(`${oAuthParams.redirectUri}${concatChar}code=${code}&state=${oAuthParams.state}`);
}
// Setting.showMessage("success", `Authorization code: ${res.data}`);
} else if (responseType === "token" || responseType === "id_token") {
} else if (responseTypes.includes("token") || responseTypes.includes("id_token")) {
if (res.data3) {
sessionStorage.setItem("signinUrl", signinUrl);
Setting.goToLinkSoft(this, `/forget/${applicationName}`);
return;
}
const token = res.data;
Setting.goToLink(`${oAuthParams.redirectUri}${concatChar}${responseType}=${token}&state=${oAuthParams.state}&token_type=bearer`);
if (responseMode === "form_post") {
const params = {
token: responseTypes.includes("token") ? res.data : null,
id_token: responseTypes.includes("id_token") ? res.data : null,
token_type: "bearer",
state: oAuthParams?.state,
};
createFormAndSubmit(oAuthParams?.redirectUri, params);
} else {
const token = res.data;
Setting.goToLink(`${oAuthParams.redirectUri}${concatChar}${responseType}=${token}&state=${oAuthParams.state}&token_type=bearer`);
}
} else if (responseType === "link") {
let from = innerParams.get("from");
const oauth = innerParams.get("oauth");

View File

@@ -37,7 +37,7 @@ import RedirectForm from "../common/RedirectForm";
import {RequiredMfa} from "./mfa/MfaAuthVerifyForm";
import {GoogleOneTapLoginVirtualButton} from "./GoogleLoginButton";
import * as ProviderButton from "./ProviderButton";
import {goToLink} from "../Setting";
import {createFormAndSubmit, goToLink} from "../Setting";
import WeChatLoginPanel from "./WeChatLoginPanel";
const FaceRecognitionCommonModal = lazy(() => import("../common/modal/FaceRecognitionCommonModal"));
const FaceRecognitionModal = lazy(() => import("../common/modal/FaceRecognitionModal"));
@@ -503,7 +503,8 @@ class LoginPage extends React.Component {
.then((res) => {
const loginHandler = (res) => {
const responseType = values["type"];
const responseTypes = responseType.split(" ");
const responseMode = oAuthParams?.responseMode || "query";
if (responseType === "login") {
if (res.data3) {
sessionStorage.setItem("signinUrl", window.location.pathname + window.location.search);
@@ -518,14 +519,24 @@ class LoginPage extends React.Component {
this.setState({
userCodeStatus: "success",
});
} else if (responseType === "token" || responseType === "id_token") {
} else if (responseTypes.includes("token") || responseTypes.includes("id_token")) {
if (res.data3) {
sessionStorage.setItem("signinUrl", window.location.pathname + window.location.search);
Setting.goToLinkSoft(this, `/forget/${this.state.applicationName}`);
}
const amendatoryResponseType = responseType === "token" ? "access_token" : responseType;
const accessToken = res.data;
Setting.goToLink(`${oAuthParams.redirectUri}#${amendatoryResponseType}=${accessToken}&state=${oAuthParams.state}&token_type=bearer`);
if (responseMode === "form_post") {
const params = {
token: responseTypes.includes("token") ? res.data : null,
id_token: responseTypes.includes("id_token") ? res.data : null,
token_type: "bearer",
state: oAuthParams?.state,
};
createFormAndSubmit(oAuthParams?.redirectUri, params);
} else {
Setting.goToLink(`${oAuthParams.redirectUri}#${amendatoryResponseType}=${accessToken}&state=${oAuthParams.state}&token_type=bearer`);
}
} else if (responseType === "saml") {
if (res.data === RequiredMfa) {
this.props.onLoginSuccess(window.location.href);
@@ -584,6 +595,32 @@ class LoginPage extends React.Component {
return null;
}
switchLoginOrganization(name) {
const searchParams = new URLSearchParams(window.location.search);
const clientId = searchParams.get("client_id");
if (clientId) {
const clientIdSplited = clientId.split("-org-");
searchParams.set("client_id", `${clientIdSplited[0]}-org-${name}`);
Setting.goToLink(`/login/oauth/authorize?${searchParams.toString()}`);
return;
}
const application = this.getApplicationObj();
if (window.location.pathname.startsWith("/login/saml/authorize")) {
Setting.goToLink(`/login/saml/authorize/${name}/${application.name}-org-${name}?${searchParams.toString()}`);
return;
}
if (window.location.pathname.startsWith("/cas")) {
Setting.goToLink(`/cas/${application.name}-org-${name}/${name}/login?${searchParams.toString()}`);
return;
}
searchParams.set("orgChoiceMode", "None");
Setting.goToLink(`/login/${name}?${searchParams.toString()}`);
}
renderFormItem(application, signinItem) {
if (!signinItem.visible && signinItem.name !== "Forgot password?") {
return null;
@@ -637,6 +674,9 @@ class LoginPage extends React.Component {
)
;
} else if (signinItem.name === "Username") {
if (this.state.loginMethod === "wechat") {
return (<WeChatLoginPanel application={application} loginMethod={this.state.loginMethod} />);
}
return (
<div key={resultItemKey}>
<div dangerouslySetInnerHTML={{__html: ("<style>" + signinItem.customCss?.replaceAll("<style>", "").replaceAll("</style>", "") + "</style>")}} />
@@ -739,6 +779,9 @@ class LoginPage extends React.Component {
} else if (signinItem.name === "Agreement") {
return AgreementModal.isAgreementRequired(application) ? AgreementModal.renderAgreementFormItem(application, true, {}, this) : null;
} else if (signinItem.name === "Login button") {
if (this.state.loginMethod === "wechat") {
return null;
}
return (
<Form.Item key={resultItemKey} className="login-button-box">
<div dangerouslySetInnerHTML={{__html: ("<style>" + signinItem.customCss?.replaceAll("<style>", "").replaceAll("</style>", "") + "</style>")}} />
@@ -837,6 +880,17 @@ class LoginPage extends React.Component {
{this.renderFooter(application, signinItem)}
</div>
);
} else if (signinItem.name === "Select organization") {
return (
<Form.Item>
<div key={resultItemKey} style={{width: "100%"}} className="login-organization-select">
<OrganizationSelect style={{width: "100%"}} initValue={application.organization}
onSelect={(value) => {
this.switchLoginOrganization(value);
}} />
</div>
</Form.Item>
);
}
}
@@ -885,10 +939,6 @@ class LoginPage extends React.Component {
loginWidth += 10;
}
if (this.state.loginMethod === "wechat") {
return (<WeChatLoginPanel application={application} renderFormItem={this.renderFormItem.bind(this)} loginMethod={this.state.loginMethod} loginWidth={loginWidth} renderMethodChoiceBox={this.renderMethodChoiceBox.bind(this)} />);
}
return (
<Form
name="normal_login"
@@ -1098,8 +1148,7 @@ class LoginPage extends React.Component {
.then(res => res.json())
.then((credentialRequestOptions) => {
if ("status" in credentialRequestOptions) {
Setting.showMessage("error", credentialRequestOptions.msg);
throw credentialRequestOptions.status.msg;
return Promise.reject(new Error(credentialRequestOptions.msg));
}
credentialRequestOptions.publicKey.challenge = UserWebauthnBackend.webAuthnBufferDecode(credentialRequestOptions.publicKey.challenge);
@@ -1158,7 +1207,7 @@ class LoginPage extends React.Component {
Setting.showMessage("error", `${i18next.t("general:Failed to connect to server")}${error}`);
});
}).catch(error => {
Setting.showMessage("error", `${error}`);
Setting.showMessage("error", `${error.message}`);
}).finally(() => {
this.setState({
loginLoading: false,
@@ -1229,6 +1278,7 @@ class LoginPage extends React.Component {
[generateItemKey("WebAuthn", "None"), {label: i18next.t("login:WebAuthn"), key: "webAuthn"}],
[generateItemKey("LDAP", "None"), {label: i18next.t("login:LDAP"), key: "ldap"}],
[generateItemKey("Face ID", "None"), {label: i18next.t("login:Face ID"), key: "faceId"}],
[generateItemKey("WeChat", "Tab"), {label: i18next.t("login:WeChat"), key: "wechat"}],
[generateItemKey("WeChat", "None"), {label: i18next.t("login:WeChat"), key: "wechat"}],
]);
@@ -1393,6 +1443,8 @@ class LoginPage extends React.Component {
);
}
const wechatSigninMethods = application.signinMethods?.filter(method => method.name === "WeChat" && method.rule === "Login page");
return (
<React.Fragment>
<CustomGithubCorner />
@@ -1410,6 +1462,15 @@ class LoginPage extends React.Component {
}
</div>
</div>
{
wechatSigninMethods?.length > 0 ? (<div style={{display: "flex", justifyContent: "center", alignItems: "center"}}>
<div>
<h3 style={{textAlign: "center", width: 320}}>{i18next.t("provider:Please use WeChat to scan the QR code and follow the official account for sign in")}</h3>
<WeChatLoginPanel application={application} loginMethod={this.state.loginMethod} />
</div>
</div>
) : null
}
</div>
</div>
</React.Fragment>

View File

@@ -364,6 +364,40 @@ class SignupPage extends React.Component {
<Input className="signup-name-input" placeholder={signupItem.placeholder} />
</Form.Item>
);
} else if (signupItem.name === "First name" && this.state?.displayNameRule !== "First, last") {
return (
<Form.Item
name="firstName"
className="signup-first-name"
label={signupItem.label ? signupItem.label : i18next.t("general:First name")}
rules={[
{
required: required,
message: i18next.t("signup:Please input your first name!"),
whitespace: true,
},
]}
>
<Input className="signup-first-name-input" placeholder={signupItem.placeholder} />
</Form.Item>
);
} else if (signupItem.name === "Last name" && this.state?.displayNameRule !== "First, last") {
return (
<Form.Item
name="lastName"
className="signup-last-name"
label={signupItem.label ? signupItem.label : i18next.t("general:Last name")}
rules={[
{
required: required,
message: i18next.t("signup:Please input your last name!"),
whitespace: true,
},
]}
>
<Input className="signup-last-name-input" placeholder={signupItem.placeholder} />
</Form.Item>
);
} else if (signupItem.name === "Affiliation") {
return (
<Form.Item
@@ -776,6 +810,12 @@ class SignupPage extends React.Component {
this.form.current?.setFieldValue("invitationCode", this.state.invitationCode);
}
}
const displayNameItem = application.signupItems?.find(item => item.name === "Display name");
if (displayNameItem && !this.state.displayNameRule) {
this.setState({displayNameRule: displayNameItem.rule});
}
return (
<Form
{...formItemLayout}

View File

@@ -13,7 +13,7 @@
// limitations under the License.
import React from "react";
import {Alert, Button, Modal, Result} from "antd";
import {Alert, Button, Modal, QRCode, Result} from "antd";
import i18next from "i18next";
import {getWechatMessageEvent} from "./AuthBackend";
import * as Setting from "../Setting";
@@ -217,7 +217,7 @@ export async function WechatOfficialAccountModal(application, provider, method)
title: i18next.t("provider:Please use WeChat to scan the QR code and follow the official account for sign in"),
content: (
<div style={{marginRight: "34px"}}>
<img src = {"data:image/png;base64," + res.data} alt="Wechat QR code" style={{width: "100%"}} />
<QRCode style={{padding: "20px", margin: "auto"}} bordered={false} value={res.data} size={230} />
</div>
),
onOk() {

View File

@@ -16,13 +16,14 @@ import React from "react";
import * as AuthBackend from "./AuthBackend";
import i18next from "i18next";
import * as Util from "./Util";
import {QRCode} from "antd";
class WeChatLoginPanel extends React.Component {
constructor(props) {
super(props);
this.state = {
qrCode: null,
loading: false,
status: "loading",
ticket: null,
};
this.pollingTimer = null;
@@ -57,47 +58,38 @@ class WeChatLoginPanel extends React.Component {
const {application} = this.props;
const wechatProviderItem = application?.providers?.find(p => p.provider?.type === "WeChat");
if (wechatProviderItem) {
this.setState({loading: true, qrCode: null, ticket: null});
this.setState({status: "loading", qrCode: null, ticket: null});
AuthBackend.getWechatQRCode(`${wechatProviderItem.provider.owner}/${wechatProviderItem.provider.name}`).then(res => {
if (res.status === "ok" && res.data) {
this.setState({qrCode: res.data, loading: false, ticket: res.data2});
this.setState({qrCode: res.data, status: "active", ticket: res.data2});
this.clearPolling();
this.pollingTimer = setInterval(() => {
Util.getEvent(application, wechatProviderItem.provider, res.data2, "signup");
}, 1000);
} else {
this.setState({qrCode: null, loading: false, ticket: null});
this.setState({qrCode: null, status: "expired", ticket: null});
this.clearPolling();
}
}).catch(() => {
this.setState({qrCode: null, loading: false, ticket: null});
this.setState({qrCode: null, status: "expired", ticket: null});
this.clearPolling();
});
}
}
render() {
const {application, loginWidth = 320} = this.props;
const {loading, qrCode} = this.state;
const {loginWidth = 320} = this.props;
const {status, qrCode} = this.state;
return (
<div style={{width: loginWidth, margin: "0 auto", textAlign: "center", marginTop: 16}}>
{application.signinItems?.filter(item => item.name === "Logo").map(signinItem => this.props.renderFormItem(application, signinItem))}
{this.props.renderMethodChoiceBox()}
{application.signinItems?.filter(item => item.name === "Languages").map(signinItem => this.props.renderFormItem(application, signinItem))}
{loading ? (
<div style={{marginTop: 16}}>
<span>{i18next.t("login:Loading")}</span>
<div style={{marginTop: 2}}>
<QRCode style={{margin: "auto", marginTop: "20px", marginBottom: "20px"}} bordered={false} status={status} value={qrCode ?? " "} size={230} />
<div style={{marginTop: 8}}>
<a onClick={e => {e.preventDefault(); this.fetchQrCode();}}>
{i18next.t("login:Refresh")}
</a>
</div>
) : qrCode ? (
<div style={{marginTop: 2}}>
<img src={`data:image/png;base64,${qrCode}`} alt="WeChat QR code" style={{width: 250, height: 250}} />
<div style={{marginTop: 8}}>
<a onClick={e => {e.preventDefault(); this.fetchQrCode();}}>
{i18next.t("login:Refresh")}
</a>
</div>
</div>
) : null}
</div>
</div>
);
}

View File

@@ -83,7 +83,7 @@ export const CaptchaModal = (props) => {
const renderDefaultCaptcha = () => {
if (noModal) {
return (
<Row style={{textAlign: "center"}}>
<Row style={{textAlign: "center"}} gutter={10}>
<Col
style={{flex: noModal ? "70%" : "100%"}}>
<Input

View File

@@ -133,6 +133,9 @@ function initLanguage() {
case "sk-SK":
language = "sk";
break;
case "az":
language = "az";
break;
default:
language = Conf.DefaultLanguage;
}

View File

@@ -40,6 +40,8 @@
"Custom CSS Mobile": "CSS مخصص للجوال",
"Custom CSS Mobile - Edit": "تعديل CSS مخصص للجوال",
"Custom CSS Mobile - Tooltip": "CSS مخصص للجوال - تلميح",
"Disable signin": "Disable signin",
"Disable signin - Tooltip": "Disable signin - Tooltip",
"Dynamic": "ديناميكي",
"Edit Application": "تحرير التطبيق",
"Enable Email linking": "تمكين ربط البريد الإلكتروني",
@@ -329,6 +331,7 @@
"Last name": "الاسم الأخير",
"Later": "لاحقًا",
"Logging & Auditing": "التسجيل والمراجعة",
"Login page": "Login page",
"Logo": "الشعار",
"Logo - Tooltip": "الأيقونات التي يعرضها التطبيق للعالم الخارجي",
"Logo dark": "الشعار المظلم",
@@ -441,6 +444,7 @@
"Sync": "مزامنة",
"Syncers": "المزامنات",
"System Info": "معلومات النظام",
"Tab": "Tab",
"There was a problem signing you in..": "حدثت مشكلة أثناء تسجيل دخولك..",
"This is a read-only demo site!": "هذا موقع تجريبي للقراءة فقط!",
"Timestamp": "الطابع الزمني",
@@ -573,6 +577,7 @@
"Please type an organization to sign in": "يرجى كتابة منظمة لتسجيل الدخول",
"Redirecting, please wait.": "جار إعادة التوجيه، يرجى الانتظار.",
"Refresh": "تحديث",
"Select organization": "Select organization",
"Sign In": "تسجيل الدخول",
"Sign in with Face ID": "تسجيل الدخول باستخدام معرف الوجه",
"Sign in with WebAuthn": "تسجيل الدخول باستخدام WebAuthn",

1326
web/src/locales/az/data.json Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -40,6 +40,8 @@
"Custom CSS Mobile": "Vlastní CSS pro mobil",
"Custom CSS Mobile - Edit": "Vlastní CSS pro mobil - úprava",
"Custom CSS Mobile - Tooltip": "Vlastní CSS pro mobil - popisek",
"Disable signin": "Disable signin",
"Disable signin - Tooltip": "Disable signin - Tooltip",
"Dynamic": "Dynamický",
"Edit Application": "Upravit aplikaci",
"Enable Email linking": "Povolit propojení e-mailu",
@@ -329,6 +331,7 @@
"Last name": "Příjmení",
"Later": "Později",
"Logging & Auditing": "Logování a audit",
"Login page": "Login page",
"Logo": "Logo",
"Logo - Tooltip": "Ikony, které aplikace prezentuje světu",
"Logo dark": "Tmavé logo",
@@ -441,6 +444,7 @@
"Sync": "Synchronizovat",
"Syncers": "Synchronizátory",
"System Info": "Systémové informace",
"Tab": "Tab",
"There was a problem signing you in..": "Při přihlašování nastal problém..",
"This is a read-only demo site!": "Toto je demo stránka pouze pro čtení!",
"Timestamp": "Časová značka",
@@ -573,6 +577,7 @@
"Please type an organization to sign in": "Prosím zadejte organizaci pro přihlášení",
"Redirecting, please wait.": "Přesměrování, prosím čekejte.",
"Refresh": "Obnovit",
"Select organization": "Select organization",
"Sign In": "Přihlásit se",
"Sign in with Face ID": "Přihlásit se pomocí Face ID",
"Sign in with WebAuthn": "Přihlásit se pomocí WebAuthn",

View File

@@ -40,6 +40,8 @@
"Custom CSS Mobile": "Benutzerdefiniertes CSS mobil",
"Custom CSS Mobile - Edit": "Benutzerdefiniertes CSS mobil Bearbeiten",
"Custom CSS Mobile - Tooltip": "Benutzerdefiniertes CSS mobil Tooltip",
"Disable signin": "Disable signin",
"Disable signin - Tooltip": "Disable signin - Tooltip",
"Dynamic": "Dynamisch",
"Edit Application": "Bearbeitungsanwendung",
"Enable Email linking": "E-Mail-Verknüpfung aktivieren",
@@ -329,6 +331,7 @@
"Last name": "Nachname",
"Later": "Später",
"Logging & Auditing": "Protokollierung & Audit",
"Login page": "Login page",
"Logo": "Logo",
"Logo - Tooltip": "Symbole, die die Anwendung der Außenwelt präsentiert",
"Logo dark": "Dunkles Logo",
@@ -441,6 +444,7 @@
"Sync": "Synchronisieren",
"Syncers": "Syncer",
"System Info": "Systeminformationen",
"Tab": "Tab",
"There was a problem signing you in..": "Es gab ein Problem beim Anmelden...",
"This is a read-only demo site!": "Dies ist eine schreibgeschützte Demo-Seite!",
"Timestamp": "Zeitstempel",
@@ -573,6 +577,7 @@
"Please type an organization to sign in": "Bitte geben Sie eine Organisation zum Anmelden ein.",
"Redirecting, please wait.": "Umleitung, bitte warten.",
"Refresh": "Aktualisieren",
"Select organization": "Select organization",
"Sign In": "Anmelden",
"Sign in with Face ID": "Mit Face ID anmelden",
"Sign in with WebAuthn": "Melden Sie sich mit WebAuthn an",

View File

@@ -40,6 +40,8 @@
"Custom CSS Mobile": "Custom CSS Mobile",
"Custom CSS Mobile - Edit": "Custom CSS Mobile - Edit",
"Custom CSS Mobile - Tooltip": "Custom CSS Mobile - Tooltip",
"Disable signin": "Disable signin",
"Disable signin - Tooltip": "Disable signin - Tooltip",
"Dynamic": "Dynamic",
"Edit Application": "Edit Application",
"Enable Email linking": "Enable Email linking",
@@ -329,6 +331,7 @@
"Last name": "Last name",
"Later": "Later",
"Logging & Auditing": "Logging & Auditing",
"Login page": "Login page",
"Logo": "Logo",
"Logo - Tooltip": "Icons that the application presents to the outside world",
"Logo dark": "Logo dark",
@@ -441,6 +444,7 @@
"Sync": "Sync",
"Syncers": "Syncers",
"System Info": "System Info",
"Tab": "Tab",
"There was a problem signing you in..": "There was a problem signing you in..",
"This is a read-only demo site!": "This is a read-only demo site!",
"Timestamp": "Timestamp",
@@ -573,6 +577,7 @@
"Please type an organization to sign in": "Please type an organization to sign in",
"Redirecting, please wait.": "Redirecting, please wait.",
"Refresh": "Refresh",
"Select organization": "Select organization",
"Sign In": "Sign In",
"Sign in with Face ID": "Sign in with Face ID",
"Sign in with WebAuthn": "Sign in with WebAuthn",

View File

@@ -40,6 +40,8 @@
"Custom CSS Mobile": "CSS personalizado para móvil",
"Custom CSS Mobile - Edit": "CSS personalizado para móvil - Editar",
"Custom CSS Mobile - Tooltip": "CSS personalizado para móvil - Información adicional",
"Disable signin": "Disable signin",
"Disable signin - Tooltip": "Disable signin - Tooltip",
"Dynamic": "Dinámico",
"Edit Application": "Editar solicitud",
"Enable Email linking": "Habilitar enlace de correo electrónico",
@@ -329,6 +331,7 @@
"Last name": "Apellido",
"Later": "Más tarde",
"Logging & Auditing": "Registro y auditoría",
"Login page": "Login page",
"Logo": "Logotipo",
"Logo - Tooltip": "Iconos que la aplicación presenta al mundo exterior",
"Logo dark": "Logo oscuro",
@@ -441,6 +444,7 @@
"Sync": "Sincronización",
"Syncers": "Sincronizadores",
"System Info": "Información del Sistema",
"Tab": "Tab",
"There was a problem signing you in..": "Hubo un problema al iniciar sesión...",
"This is a read-only demo site!": "¡Este es un sitio de demostración solo de lectura!",
"Timestamp": "Marca de tiempo",
@@ -573,6 +577,7 @@
"Please type an organization to sign in": "Por favor escribe una organización para iniciar sesión",
"Redirecting, please wait.": "Redirigiendo, por favor espera.",
"Refresh": "Actualizar",
"Select organization": "Select organization",
"Sign In": "Iniciar sesión",
"Sign in with Face ID": "Iniciar sesión con Face ID",
"Sign in with WebAuthn": "Iniciar sesión con WebAuthn",

View File

@@ -40,6 +40,8 @@
"Custom CSS Mobile": "CSS سفارشی موبایل",
"Custom CSS Mobile - Edit": "ویرایش CSS سفارشی موبایل",
"Custom CSS Mobile - Tooltip": "CSS سفارشی برای موبایل",
"Disable signin": "Disable signin",
"Disable signin - Tooltip": "Disable signin - Tooltip",
"Dynamic": "پویا",
"Edit Application": "ویرایش برنامه",
"Enable Email linking": "فعال‌سازی اتصال ایمیل",
@@ -329,6 +331,7 @@
"Last name": "نام خانوادگی",
"Later": "بعداً",
"Logging & Auditing": "ورود و حسابرسی",
"Login page": "Login page",
"Logo": "لوگو",
"Logo - Tooltip": "آیکون‌هایی که برنامه به بیرون ارائه می‌دهد",
"Logo dark": "لوگوی تیره",
@@ -441,6 +444,7 @@
"Sync": "همگام‌سازی",
"Syncers": "همگام‌سازها",
"System Info": "اطلاعات سیستم",
"Tab": "Tab",
"There was a problem signing you in..": "مشکلی در ورود شما وجود داشت...",
"This is a read-only demo site!": "این یک سایت دمو فقط خواندنی است!",
"Timestamp": "مهر زمان",
@@ -573,6 +577,7 @@
"Please type an organization to sign in": "لطفاً یک سازمان برای ورود تایپ کنید",
"Redirecting, please wait.": "در حال هدایت، لطفاً صبر کنید.",
"Refresh": "به روزرسانی",
"Select organization": "Select organization",
"Sign In": "ورود",
"Sign in with Face ID": "ورود با شناسه چهره",
"Sign in with WebAuthn": "ورود با WebAuthn",

View File

@@ -40,6 +40,8 @@
"Custom CSS Mobile": "Mukautettu CSS - matkaviestit",
"Custom CSS Mobile - Edit": "Muokkaa mukautettua CSS:ää - matkaviestit",
"Custom CSS Mobile - Tooltip": "Mukautettu CSS - matkaviestit - työkalupala",
"Disable signin": "Disable signin",
"Disable signin - Tooltip": "Disable signin - Tooltip",
"Dynamic": "Dynaaminen",
"Edit Application": "Muokkaa sovellusta",
"Enable Email linking": "Ota sähköpostiinkkoutuminen käyttöön",
@@ -329,6 +331,7 @@
"Last name": "Sukunimi",
"Later": "Myöhemmin",
"Logging & Auditing": "Kirjaaminen ja tarkastus",
"Login page": "Login page",
"Logo": "Logo",
"Logo - Tooltip": "Kuvakkeet, joita sovellus esittää ulkopuolelle",
"Logo dark": "Tumma logo",
@@ -441,6 +444,7 @@
"Sync": "Synkronoi",
"Syncers": "Synkronointitoiminnot",
"System Info": "Järjestelmätiedot",
"Tab": "Tab",
"There was a problem signing you in..": "Kirjautumisessasi ilmeni ongelma..",
"This is a read-only demo site!": "Tämä on vain luku -muotoinen demo-sivusto!",
"Timestamp": "Aikaleima",
@@ -573,6 +577,7 @@
"Please type an organization to sign in": "Kirjoita organisaatio kirjautumista varten",
"Redirecting, please wait.": "Ohjataan uudelleen, odota hetki.",
"Refresh": "Päivitä",
"Select organization": "Select organization",
"Sign In": "Kirjaudu sisään",
"Sign in with Face ID": "Kirjaudu Face ID:llä",
"Sign in with WebAuthn": "Kirjaudu WebAuthn-tunnisteella",

View File

@@ -40,6 +40,8 @@
"Custom CSS Mobile": "CSS personnalisé mobile",
"Custom CSS Mobile - Edit": "CSS personnalisé mobile - Modifier",
"Custom CSS Mobile - Tooltip": "CSS personnalisé mobile - Infobulle",
"Disable signin": "Disable signin",
"Disable signin - Tooltip": "Disable signin - Tooltip",
"Dynamic": "Dynamique",
"Edit Application": "Modifier l'application",
"Enable Email linking": "Autoriser à lier l'e-mail",
@@ -329,6 +331,7 @@
"Last name": "Nom de famille",
"Later": "Plus tard",
"Logging & Auditing": "Journalisation et audit",
"Login page": "Login page",
"Logo": "Logo",
"Logo - Tooltip": "Icônes que l'application présente au monde extérieur",
"Logo dark": "Logo sombre",
@@ -441,6 +444,7 @@
"Sync": "Synchronisation",
"Syncers": "Synchroniseurs",
"System Info": "Informations système",
"Tab": "Tab",
"There was a problem signing you in..": "Un problème est survenu lors de votre connexion..",
"This is a read-only demo site!": "Ceci est un site de démonstration en lecture seule !",
"Timestamp": "Horodatage",
@@ -573,6 +577,7 @@
"Please type an organization to sign in": "Veuillez entrer une organisation pour vous connecter",
"Redirecting, please wait.": "Redirection en cours, veuillez patienter.",
"Refresh": "Actualiser",
"Select organization": "Select organization",
"Sign In": "Se connecter",
"Sign in with Face ID": "Se connecter avec Face ID",
"Sign in with WebAuthn": "Connectez-vous avec WebAuthn",

View File

@@ -40,6 +40,8 @@
"Custom CSS Mobile": "CSS מותאם אישית לנייד",
"Custom CSS Mobile - Edit": "ערוך CSS מותאם אישית לנייד",
"Custom CSS Mobile - Tooltip": "CSS מותאם אישית לנייד - תיאור",
"Disable signin": "Disable signin",
"Disable signin - Tooltip": "Disable signin - Tooltip",
"Dynamic": "דינמי",
"Edit Application": "ערוך יישום",
"Enable Email linking": "אפשר קישור דוא\"ל",
@@ -329,6 +331,7 @@
"Last name": "שם משפחה",
"Later": "מאוחר יותר",
"Logging & Auditing": "רישום וביקורת",
"Login page": "Login page",
"Logo": "לוגו",
"Logo - Tooltip": "סמלים שהיישום מציג לעולם החיצון",
"Logo dark": "לוגו כהה",
@@ -441,6 +444,7 @@
"Sync": "סנכרן",
"Syncers": "מסנכרנים",
"System Info": "מידע מערכת",
"Tab": "Tab",
"There was a problem signing you in..": "הייתה בעיה בכניסה שלך..",
"This is a read-only demo site!": "זהו אתר הדגמה לקריאה בלבד!",
"Timestamp": "חותמת זמן",
@@ -573,6 +577,7 @@
"Please type an organization to sign in": "אנא הקלד ארגון להתחברות",
"Redirecting, please wait.": "מעביר, אנא המתן.",
"Refresh": "רענן",
"Select organization": "Select organization",
"Sign In": "התחבר",
"Sign in with Face ID": "התחבר עם זיהוי פנים",
"Sign in with WebAuthn": "התחבר עם WebAuthn",

View File

@@ -40,6 +40,8 @@
"Custom CSS Mobile": "CSS Seluler Khusus",
"Custom CSS Mobile - Edit": "CSS Seluler Khusus - Edit",
"Custom CSS Mobile - Tooltip": "CSS Seluler Khusus - Tooltip",
"Disable signin": "Disable signin",
"Disable signin - Tooltip": "Disable signin - Tooltip",
"Dynamic": "Dinamis",
"Edit Application": "Mengedit aplikasi",
"Enable Email linking": "Aktifkan pengaitan email",
@@ -329,6 +331,7 @@
"Last name": "Nama belakang",
"Later": "Nanti",
"Logging & Auditing": "Pencatatan & Audit",
"Login page": "Login page",
"Logo": "Logo",
"Logo - Tooltip": "Ikon-ikon yang disajikan aplikasi ke dunia luar",
"Logo dark": "Logo gelap",
@@ -441,6 +444,7 @@
"Sync": "Sinkronisasi",
"Syncers": "Sinkronisasi",
"System Info": "Informasi Sistem",
"Tab": "Tab",
"There was a problem signing you in..": "Ada masalah saat masuk...",
"This is a read-only demo site!": "Ini adalah situs demo hanya untuk dibaca saja!",
"Timestamp": "Stempel waktu",
@@ -573,6 +577,7 @@
"Please type an organization to sign in": "Silakan ketik organisasi untuk masuk",
"Redirecting, please wait.": "Mengalihkan, harap tunggu.",
"Refresh": "Segarkan",
"Select organization": "Select organization",
"Sign In": "Masuk",
"Sign in with Face ID": "Masuk dengan Face ID",
"Sign in with WebAuthn": "Masuk dengan WebAuthn",

View File

@@ -40,6 +40,8 @@
"Custom CSS Mobile": "CSS personalizzato mobile",
"Custom CSS Mobile - Edit": "CSS personalizzato mobile - Modifica",
"Custom CSS Mobile - Tooltip": "CSS personalizzato mobile - Tooltip",
"Disable signin": "Disable signin",
"Disable signin - Tooltip": "Disable signin - Tooltip",
"Dynamic": "Dinamico",
"Edit Application": "Modifica Applicazione",
"Enable Email linking": "Abilita collegamento Email",
@@ -329,6 +331,7 @@
"Last name": "Cognome",
"Later": "Più tardi",
"Logging & Auditing": "Registrazione e audit",
"Login page": "Login page",
"Logo": "Logo",
"Logo - Tooltip": "Icone che l'applicazione presenta all'esterno",
"Logo dark": "Logo scuro",
@@ -441,6 +444,7 @@
"Sync": "Sincronizza",
"Syncers": "Syncers",
"System Info": "Informazioni di sistema",
"Tab": "Tab",
"There was a problem signing you in..": "C'è stato un problema nell'accesso...",
"This is a read-only demo site!": "Questo è un sito demo in sola lettura!",
"Timestamp": "Timestamp",
@@ -573,6 +577,7 @@
"Please type an organization to sign in": "Digita un'organizzazione per accedere",
"Redirecting, please wait.": "Reindirizzamento in corso, attendi.",
"Refresh": "Aggiorna",
"Select organization": "Select organization",
"Sign In": "Accedi",
"Sign in with Face ID": "Accedi con Face ID",
"Sign in with WebAuthn": "Accedi con WebAuthn",

View File

@@ -40,6 +40,8 @@
"Custom CSS Mobile": "カスタムCSSモバイル",
"Custom CSS Mobile - Edit": "カスタムCSSモバイル- 編集",
"Custom CSS Mobile - Tooltip": "カスタムCSSモバイル- ツールチップ",
"Disable signin": "Disable signin",
"Disable signin - Tooltip": "Disable signin - Tooltip",
"Dynamic": "動的",
"Edit Application": "アプリケーションを編集する",
"Enable Email linking": "イーメールリンクの有効化",
@@ -329,6 +331,7 @@
"Last name": "苗字",
"Later": "後で",
"Logging & Auditing": "ログと監査",
"Login page": "Login page",
"Logo": "ロゴ",
"Logo - Tooltip": "アプリケーションが外部世界に示すアイコン",
"Logo dark": "ダークロゴ",
@@ -441,6 +444,7 @@
"Sync": "同期",
"Syncers": "同期ツール",
"System Info": "システム情報",
"Tab": "Tab",
"There was a problem signing you in..": "サインインに問題が発生しました...",
"This is a read-only demo site!": "これは読み取り専用のデモサイトです!",
"Timestamp": "タイムスタンプ",
@@ -573,6 +577,7 @@
"Please type an organization to sign in": "サインインする組織を入力してください",
"Redirecting, please wait.": "リダイレクト中、お待ちください。",
"Refresh": "更新",
"Select organization": "Select organization",
"Sign In": "サインイン",
"Sign in with Face ID": "顔IDでサインイン",
"Sign in with WebAuthn": "WebAuthnでサインインしてください",

View File

@@ -40,6 +40,8 @@
"Custom CSS Mobile": "Теңшеу CSS (мобильді)",
"Custom CSS Mobile - Edit": "Теңшеу CSS (мобильді) - Өңдеу",
"Custom CSS Mobile - Tooltip": "Теңшеу CSS (мобильді) - Қысқаша түсінік",
"Disable signin": "Disable signin",
"Disable signin - Tooltip": "Disable signin - Tooltip",
"Dynamic": "Динамикалық",
"Edit Application": "Қолданбаны өңдеу",
"Enable Email linking": "Email байланысын қосу",
@@ -329,6 +331,7 @@
"Last name": "Тегі",
"Later": "Кейінірек",
"Logging & Auditing": "Журналдау және аудит",
"Login page": "Login page",
"Logo": "Логотип",
"Logo - Tooltip": "Қолданбаның сыртқы көріністегі белгілері",
"Logo dark": "Қараңғы логотип",
@@ -441,6 +444,7 @@
"Sync": "Синхрондау",
"Syncers": "Синхрондаушылар",
"System Info": "Жүйе ақпараты",
"Tab": "Tab",
"There was a problem signing you in..": "Кіруде қиындық туындады..",
"This is a read-only demo site!": "Бұл тек оқуға арналған демо сайт!",
"Timestamp": "Уақыт мөрі",
@@ -573,6 +577,7 @@
"Please type an organization to sign in": "Кіру үшін ұйымды енгізіңіз",
"Redirecting, please wait.": "Қайта бағытталуда, күте тұрыңыз.",
"Refresh": "Жаңарту",
"Select organization": "Select organization",
"Sign In": "Кіру",
"Sign in with Face ID": "Face ID арқылы кіру",
"Sign in with WebAuthn": "WebAuthn арқылы кіру",

View File

@@ -40,6 +40,8 @@
"Custom CSS Mobile": "모바일 사용자 정의 CSS",
"Custom CSS Mobile - Edit": "모바일 사용자 정의 CSS - 편집",
"Custom CSS Mobile - Tooltip": "모바일 사용자 정의 CSS - 툴팁",
"Disable signin": "Disable signin",
"Disable signin - Tooltip": "Disable signin - Tooltip",
"Dynamic": "동적",
"Edit Application": "앱 편집하기",
"Enable Email linking": "이메일 링크 사용 가능하도록 설정하기",
@@ -329,6 +331,7 @@
"Last name": "성",
"Later": "나중에",
"Logging & Auditing": "로깅 및 감사",
"Login page": "Login page",
"Logo": "로고",
"Logo - Tooltip": "애플리케이션이 외부 세계에 제시하는 아이콘들",
"Logo dark": "다크 로고",
@@ -441,6 +444,7 @@
"Sync": "싱크",
"Syncers": "동기화 도구",
"System Info": "시스템 정보",
"Tab": "Tab",
"There was a problem signing you in..": "로그인하는 데 문제가 발생했습니다.",
"This is a read-only demo site!": "이것은 읽기 전용 데모 사이트입니다!",
"Timestamp": "타임스탬프",
@@ -573,6 +577,7 @@
"Please type an organization to sign in": "로그인할 조직을 입력하세요.",
"Redirecting, please wait.": "리디렉팅 중입니다. 잠시 기다려주세요.",
"Refresh": "새로 고침",
"Select organization": "Select organization",
"Sign In": "로그인",
"Sign in with Face ID": "얼굴 ID로 로그인",
"Sign in with WebAuthn": "WebAuthn으로 로그인하세요",

View File

@@ -40,6 +40,8 @@
"Custom CSS Mobile": "CSS Tersuai Mudah Alih",
"Custom CSS Mobile - Edit": "CSS Tersuai Mudah Alih - Edit",
"Custom CSS Mobile - Tooltip": "CSS Tersuai Mudah Alih - Tooltip",
"Disable signin": "Disable signin",
"Disable signin - Tooltip": "Disable signin - Tooltip",
"Dynamic": "Dinamik",
"Edit Application": "Edit Aplikasi",
"Enable Email linking": "Dayakan pautan Emel",
@@ -329,6 +331,7 @@
"Last name": "Nama terakhir",
"Later": "Kemudian",
"Logging & Auditing": "Log & Audit",
"Login page": "Login page",
"Logo": "Logo",
"Logo - Tooltip": "Ikon yang aplikasi paparkan ke luar",
"Logo dark": "Logo gelap",
@@ -441,6 +444,7 @@
"Sync": "Segerak",
"Syncers": "Penyegerak",
"System Info": "Maklumat Sistem",
"Tab": "Tab",
"There was a problem signing you in..": "Terdapat masalah untuk log masuk anda..",
"This is a read-only demo site!": "Ini adalah tapak demo baca sahaja!",
"Timestamp": "Cap masa",
@@ -573,6 +577,7 @@
"Please type an organization to sign in": "Sila taip organisasi untuk log masuk",
"Redirecting, please wait.": "Mengalihkan, sila tunggu.",
"Refresh": "Segarkan",
"Select organization": "Select organization",
"Sign In": "Log Masuk",
"Sign in with Face ID": "Log masuk dengan ID Wajah",
"Sign in with WebAuthn": "Log masuk dengan WebAuthn",

View File

@@ -40,6 +40,8 @@
"Custom CSS Mobile": "Aangepaste CSS mobiel",
"Custom CSS Mobile - Edit": "Aangepaste CSS mobiel - Bewerken",
"Custom CSS Mobile - Tooltip": "Aangepaste CSS mobiel - Tooltip",
"Disable signin": "Disable signin",
"Disable signin - Tooltip": "Disable signin - Tooltip",
"Dynamic": "Dynamisch",
"Edit Application": "Applicatie bewerken",
"Enable Email linking": "E-mailkoppeling inschakelen",
@@ -329,6 +331,7 @@
"Last name": "Achternaam",
"Later": "Later",
"Logging & Auditing": "Logboekregistratie & Audit",
"Login page": "Login page",
"Logo": "Logo",
"Logo - Tooltip": "Pictogrammen die de applicatie naar buiten toe presenteert",
"Logo dark": "Donker logo",
@@ -441,6 +444,7 @@
"Sync": "Synchroniseren",
"Syncers": "Synchroniseerders",
"System Info": "Systeeminfo",
"Tab": "Tab",
"There was a problem signing you in..": "Er was een probleem met het inloggen..",
"This is a read-only demo site!": "Dit is een alleen-lezen demo-site!",
"Timestamp": "Tijdstempel",
@@ -573,6 +577,7 @@
"Please type an organization to sign in": "Typ een organisatie om in te loggen",
"Redirecting, please wait.": "Doorverwijzen, even geduld...",
"Refresh": "Vernieuwen",
"Select organization": "Select organization",
"Sign In": "Inloggen",
"Sign in with Face ID": "Inloggen met gezichtsherkenning",
"Sign in with WebAuthn": "Inloggen met WebAuthn",

View File

@@ -40,6 +40,8 @@
"Custom CSS Mobile": "Niestandardowy CSS (wersja mobilna)",
"Custom CSS Mobile - Edit": "Edycja niestandardowego CSS (wersja mobilna)",
"Custom CSS Mobile - Tooltip": "Niestandardowy CSS (wersja mobilna) - Tooltip",
"Disable signin": "Disable signin",
"Disable signin - Tooltip": "Disable signin - Tooltip",
"Dynamic": "Dynamiczny",
"Edit Application": "Edytuj aplikację",
"Enable Email linking": "Włącz łączenie e-maili",
@@ -329,6 +331,7 @@
"Last name": "Nazwisko",
"Later": "Później",
"Logging & Auditing": "Logowanie i audyt",
"Login page": "Login page",
"Logo": "Logo",
"Logo - Tooltip": "Ikony, które aplikacja prezentuje na zewnątrz",
"Logo dark": "Ciemne logo",
@@ -441,6 +444,7 @@
"Sync": "Synchronizuj",
"Syncers": "Synchronizatory",
"System Info": "Informacje o systemie",
"Tab": "Tab",
"There was a problem signing you in..": "Wystąpił problem podczas logowania..",
"This is a read-only demo site!": "To jest tylko demonstracyjna strona tylko do odczytu!",
"Timestamp": "Znacznik czasu",
@@ -573,6 +577,7 @@
"Please type an organization to sign in": "Wpisz nazwę organizacji, aby się zalogować",
"Redirecting, please wait.": "Przekierowywanie, proszę czekać.",
"Refresh": "Odśwież",
"Select organization": "Select organization",
"Sign In": "Zaloguj się",
"Sign in with Face ID": "Zaloguj się za pomocą Face ID",
"Sign in with WebAuthn": "Zaloguj się za pomocą WebAuthn",

View File

@@ -40,6 +40,8 @@
"Custom CSS Mobile": "CSS personalizado para dispositivos móveis",
"Custom CSS Mobile - Edit": "Editar CSS personalizado para dispositivos móveis",
"Custom CSS Mobile - Tooltip": "Dica: CSS personalizado para dispositivos móveis",
"Disable signin": "Disable signin",
"Disable signin - Tooltip": "Disable signin - Tooltip",
"Dynamic": "Dinâmico",
"Edit Application": "Editar Aplicação",
"Enable Email linking": "Ativar vinculação de e-mail",
@@ -329,6 +331,7 @@
"Last name": "Sobrenome",
"Later": "Depois",
"Logging & Auditing": "Registro e Auditoria",
"Login page": "Login page",
"Logo": "Logotipo",
"Logo - Tooltip": "Ícones que o aplicativo apresenta para o mundo externo",
"Logo dark": "Logo escuro",
@@ -441,6 +444,7 @@
"Sync": "Sincronizar",
"Syncers": "Sincronizadores",
"System Info": "Informações do Sistema",
"Tab": "Tab",
"There was a problem signing you in..": "Ocorreu um problema ao fazer login...",
"This is a read-only demo site!": "Este é um site de demonstração apenas para leitura!",
"Timestamp": "Carimbo de data/hora",
@@ -573,6 +577,7 @@
"Please type an organization to sign in": "Por favor, digite uma organização para entrar",
"Redirecting, please wait.": "Redirecionando, por favor aguarde.",
"Refresh": "Atualizar",
"Select organization": "Select organization",
"Sign In": "Entrar",
"Sign in with Face ID": "Entrar com Face ID",
"Sign in with WebAuthn": "Entrar com WebAuthn",

View File

@@ -40,6 +40,8 @@
"Custom CSS Mobile": "Пользовательский CSS (мобильный)",
"Custom CSS Mobile - Edit": "Редактировать пользовательский CSS (мобильный)",
"Custom CSS Mobile - Tooltip": "Подсказка: пользовательский CSS (мобильный)",
"Disable signin": "Disable signin",
"Disable signin - Tooltip": "Disable signin - Tooltip",
"Dynamic": "Динамический",
"Edit Application": "Изменить приложение",
"Enable Email linking": "Включить связывание электронной почты",
@@ -329,6 +331,7 @@
"Last name": "Фамилия",
"Later": "Позже",
"Logging & Auditing": "Логирование и аудит",
"Login page": "Login page",
"Logo": "Логотип",
"Logo - Tooltip": "Иконки, которые приложение представляет во внешний мир",
"Logo dark": "Темный логотип",
@@ -441,6 +444,7 @@
"Sync": "Синхронизация",
"Syncers": "Синхронизаторы",
"System Info": "Системная информация",
"Tab": "Tab",
"There was a problem signing you in..": "Возникла проблема при входе...",
"This is a read-only demo site!": "Это демонстрационный сайт только для чтения!",
"Timestamp": "Метка времени",
@@ -573,6 +577,7 @@
"Please type an organization to sign in": "Пожалуйста, введите организацию для входа",
"Redirecting, please wait.": "Перенаправление, пожалуйста, подождите.",
"Refresh": "Обновить",
"Select organization": "Select organization",
"Sign In": "Войти",
"Sign in with Face ID": "Войти с Face ID",
"Sign in with WebAuthn": "Войти с помощью WebAuthn",

View File

@@ -40,6 +40,8 @@
"Custom CSS Mobile": "Vlastný CSS pre mobilné zariadenia",
"Custom CSS Mobile - Edit": "Vlastný CSS pre mobilné zariadenia - Upraviť",
"Custom CSS Mobile - Tooltip": "Vlastný CSS pre mobilné zariadenia - Tooltip",
"Disable signin": "Disable signin",
"Disable signin - Tooltip": "Disable signin - Tooltip",
"Dynamic": "Dynamické",
"Edit Application": "Upraviť aplikáciu",
"Enable Email linking": "Povoliť prepojenie e-mailu",
@@ -329,6 +331,7 @@
"Last name": "Priezvisko",
"Later": "Neskôr",
"Logging & Auditing": "Zaznamenávanie a audit",
"Login page": "Login page",
"Logo": "Logo",
"Logo - Tooltip": "Ikony, ktoré aplikácia prezentuje vonkajšiemu svetu",
"Logo dark": "Tmavé logo",
@@ -441,6 +444,7 @@
"Sync": "Synchronizovať",
"Syncers": "Synchronizátory",
"System Info": "Informácie o systéme",
"Tab": "Tab",
"There was a problem signing you in..": "Prihlásenie sa nepodarilo..",
"This is a read-only demo site!": "Toto je stránka len na čítanie!",
"Timestamp": "Časová značka",
@@ -573,6 +577,7 @@
"Please type an organization to sign in": "Zadajte organizáciu na prihlásenie",
"Redirecting, please wait.": "Prebieha presmerovanie, prosím čakajte.",
"Refresh": "Obnoviť",
"Select organization": "Select organization",
"Sign In": "Prihlásiť sa",
"Sign in with Face ID": "Prihlásiť sa pomocou Face ID",
"Sign in with WebAuthn": "Prihlásiť sa pomocou WebAuthn",

View File

@@ -40,6 +40,8 @@
"Custom CSS Mobile": "CSS Tersuai Mudah Alih",
"Custom CSS Mobile - Edit": "CSS Tersuai Mudah Alih - Edit",
"Custom CSS Mobile - Tooltip": "CSS Tersuai Mudah Alih - Tooltip",
"Disable signin": "Disable signin",
"Disable signin - Tooltip": "Disable signin - Tooltip",
"Dynamic": "Dinamik",
"Edit Application": "Edit Aplikasi",
"Enable Email linking": "Dayakan pautan Emel",
@@ -329,6 +331,7 @@
"Last name": "Nama terakhir",
"Later": "Kemudian",
"Logging & Auditing": "Log & Audit",
"Login page": "Login page",
"Logo": "Logotyp",
"Logo - Tooltip": "Ikon yang aplikasi paparkan ke luar",
"Logo dark": "Logo gelap",
@@ -441,6 +444,7 @@
"Sync": "Segerak",
"Syncers": "Penyegerak",
"System Info": "Maklumat Sistem",
"Tab": "Tab",
"There was a problem signing you in..": "Terdapat masalah untuk log masuk anda..",
"This is a read-only demo site!": "Ini adalah tapak demo baca sahaja!",
"Timestamp": "Cap masa",
@@ -573,6 +577,7 @@
"Please type an organization to sign in": "Skriv en organisation att logga in med",
"Redirecting, please wait.": "Omdirigerar, vänta.",
"Refresh": "Uppdatera",
"Select organization": "Select organization",
"Sign In": "Logga in",
"Sign in with Face ID": "Logga in med Face ID",
"Sign in with WebAuthn": "Logga in med WebAuthn",

View File

@@ -40,6 +40,8 @@
"Custom CSS Mobile": "Özel CSS (Mobil)",
"Custom CSS Mobile - Edit": "Özel CSS (Mobil) - Düzenle",
"Custom CSS Mobile - Tooltip": "Özel CSS (Mobil) - Araç ipucu",
"Disable signin": "Disable signin",
"Disable signin - Tooltip": "Disable signin - Tooltip",
"Dynamic": "Dinamik",
"Edit Application": "Uygulamayı düzenle",
"Enable Email linking": "Eposta bağlantısı aktif",
@@ -329,6 +331,7 @@
"Last name": "Soyisim",
"Later": "Sonra",
"Logging & Auditing": "Günlük ve Denetim",
"Login page": "Login page",
"Logo": "Logo",
"Logo - Tooltip": "Uygulamanın dışarıya suntuğu simgeler",
"Logo dark": "Koyu logo",
@@ -441,6 +444,7 @@
"Sync": "Senkronizasyon",
"Syncers": "Senkronizörler",
"System Info": "Sistem Bilgisi",
"Tab": "Tab",
"There was a problem signing you in..": "Oturum açarken bir sorun oluştu...",
"This is a read-only demo site!": "Bu site sadece görüntüleme amaçlıdır!",
"Timestamp": "Zaman damgası",
@@ -573,6 +577,7 @@
"Please type an organization to sign in": "Lütfen oturum açmak için bir organizasyon yazın",
"Redirecting, please wait.": "Yönlendiriliyor, lütfen bekleyiniz.",
"Refresh": "Yenile",
"Select organization": "Select organization",
"Sign In": "Oturum aç",
"Sign in with Face ID": "Face ID ile oturum aç",
"Sign in with WebAuthn": "WebAuthn ile giriş yap",

View File

@@ -40,6 +40,8 @@
"Custom CSS Mobile": "Мобільний спеціальний CSS",
"Custom CSS Mobile - Edit": "Редагувати мобільний спеціальний CSS",
"Custom CSS Mobile - Tooltip": "Мобільний спеціальний CSS - Підказка",
"Disable signin": "Disable signin",
"Disable signin - Tooltip": "Disable signin - Tooltip",
"Dynamic": "Динамічний",
"Edit Application": "Редагувати програму",
"Enable Email linking": "Дозволити зв’язок з Email",
@@ -329,6 +331,7 @@
"Last name": "Прізвище",
"Later": "Пізніше",
"Logging & Auditing": "Лісозаготівля",
"Login page": "Login page",
"Logo": "логотип",
"Logo - Tooltip": "Значки, які програма представляє зовнішньому світу",
"Logo dark": "Логотип темний",
@@ -441,6 +444,7 @@
"Sync": "Синхронізувати",
"Syncers": "Синхронизатори",
"System Info": "Інформація про систему",
"Tab": "Tab",
"There was a problem signing you in..": "Під час входу виникла проблема.",
"This is a read-only demo site!": "Це демо-сайт лише для читання!",
"Timestamp": "Мітка часу",
@@ -573,6 +577,7 @@
"Please type an organization to sign in": "Будь ласка, введіть організацію, щоб увійти",
"Redirecting, please wait.": "Перенаправлення, будь ласка, зачекайте.",
"Refresh": "Оновити",
"Select organization": "Select organization",
"Sign In": "Увійти",
"Sign in with Face ID": "Увійдіть за допомогою Face ID",
"Sign in with WebAuthn": "Увійдіть за допомогою WebAuthn",

View File

@@ -40,6 +40,8 @@
"Custom CSS Mobile": "CSS tùy chỉnh Mobile",
"Custom CSS Mobile - Edit": "Chỉnh sửa CSS tùy chỉnh Mobile",
"Custom CSS Mobile - Tooltip": "Gợi ý CSS tùy chỉnh Mobile",
"Disable signin": "Disable signin",
"Disable signin - Tooltip": "Disable signin - Tooltip",
"Dynamic": "Động",
"Edit Application": "Sửa ứng dụng",
"Enable Email linking": "Cho phép liên kết Email",
@@ -329,6 +331,7 @@
"Last name": "Họ",
"Later": "Để sau",
"Logging & Auditing": "Nhật ký & Kiểm toán",
"Login page": "Login page",
"Logo": "Logo",
"Logo - Tooltip": "Biểu tượng mà ứng dụng hiển thị ra ngoài thế giới",
"Logo dark": "Logo tối",
@@ -441,6 +444,7 @@
"Sync": "Đồng bộ",
"Syncers": "Công cụ đồng bộ",
"System Info": "Thông tin hệ thống",
"Tab": "Tab",
"There was a problem signing you in..": "Đã xảy ra lỗi khi đăng nhập..",
"This is a read-only demo site!": "Đây là trang web giới thiệu chỉ có chức năng đọc!",
"Timestamp": "Dấu thời gian",
@@ -573,6 +577,7 @@
"Please type an organization to sign in": "Vui lòng nhập tên tổ chức để đăng nhập",
"Redirecting, please wait.": "Đang chuyển hướng, vui lòng đợi.",
"Refresh": "Làm mới",
"Select organization": "Select organization",
"Sign In": "Đăng nhập",
"Sign in with Face ID": "Đăng nhập bằng Face ID",
"Sign in with WebAuthn": "Đăng nhập với WebAuthn",

View File

@@ -40,6 +40,8 @@
"Custom CSS Mobile": "表单CSS移动端",
"Custom CSS Mobile - Edit": "编辑表单CSS移动端",
"Custom CSS Mobile - Tooltip": "注册、登录、忘记密码等表单的CSS样式如增加边框和阴影移动端",
"Disable signin": "禁止登录",
"Disable signin - Tooltip": "禁止用户进行登录操作",
"Dynamic": "动态开启",
"Edit Application": "编辑应用",
"Enable Email linking": "自动关联邮箱相同的账号",
@@ -329,6 +331,7 @@
"Last name": "姓氏",
"Later": "稍后",
"Logging & Auditing": "日志 & 审计",
"Login page": "登录页面",
"Logo": "Logo",
"Logo - Tooltip": "应用程序向外展示的图标",
"Logo dark": "暗黑logo",
@@ -441,6 +444,7 @@
"Sync": "同步",
"Syncers": "同步器",
"System Info": "系统信息",
"Tab": "选项卡",
"There was a problem signing you in..": "登录时遇到问题..",
"This is a read-only demo site!": "这是一个只读演示站点!",
"Timestamp": "时间",
@@ -573,6 +577,7 @@
"Please type an organization to sign in": "请输入要登录的组织",
"Redirecting, please wait.": "正在跳转, 请稍等.",
"Refresh": "刷新",
"Select organization": "选择组织",
"Sign In": "登录",
"Sign in with Face ID": "人脸登录",
"Sign in with WebAuthn": "WebAuthn登录",

View File

@@ -67,6 +67,8 @@ class AccountTable extends React.Component {
{name: "ID", label: i18next.t("general:ID")},
{name: "Name", label: i18next.t("general:Name")},
{name: "Display name", label: i18next.t("general:Display name")},
{name: "First name", label: i18next.t("general:First name")},
{name: "Last name", label: i18next.t("general:Last name")},
{name: "Avatar", label: i18next.t("general:Avatar")},
{name: "User type", label: i18next.t("general:User type")},
{name: "Password", label: i18next.t("general:Password")},

View File

@@ -88,7 +88,10 @@ class ProviderTable extends React.Component {
}
}} >
{
Setting.getDeduplicatedArray(this.props.providers, table, "name").map((provider, index) => <Option key={index} value={provider.name}>{provider.name}</Option>)
Setting.getDeduplicatedArray(this.props.providers, table, "name").filter(provider => provider.category !== "Captcha" || !table.some(tableItem => {
const existingProvider = Setting.getArrayItem(this.props.providers, "name", tableItem.name);
return existingProvider && existingProvider.category === "Captcha";
})).map((provider, index) => <Option key={index} value={provider.name}>{provider.name}</Option>)
}
</Select>
);

View File

@@ -96,6 +96,8 @@ class SigninMethodTable extends React.Component {
this.updateField(table, index, "displayName", value);
if (value === "Verification code" || value === "Password") {
this.updateField(table, index, "rule", "All");
} else if (value === "WeChat") {
this.updateField(table, index, "rule", "Tab");
} else {
this.updateField(table, index, "rule", "None");
}
@@ -139,6 +141,11 @@ class SigninMethodTable extends React.Component {
{id: "Non-LDAP", name: i18next.t("general:Non-LDAP")},
{id: "Hide password", name: i18next.t("general:Hide password")},
];
} else if (record.name === "WeChat") {
options = [
{id: "Tab", name: i18next.t("general:Tab")},
{id: "Login page", name: i18next.t("general:Login page")},
];
}
if (options.length === 0) {

View File

@@ -119,6 +119,7 @@ class SigninTable extends React.Component {
{name: "Signup link", displayName: i18next.t("general:Signup link")},
{name: "Captcha", displayName: i18next.t("general:Captcha")},
{name: "Auto sign in", displayName: i18next.t("login:Auto sign in")},
{name: "Select organization", displayName: i18next.t("login:Select organization")},
];
const getItemDisplayName = (text) => {

Some files were not shown because too many files have changed in this diff Show More