Compare commits

..

30 Commits

Author SHA1 Message Date
Jerry
fe5aa1f214 feat: Add Phantom web3 onboard wallet support (#4100) 2025-08-19 13:31:35 +08:00
DacongDA
eda742a848 feat: support e164 phone number in GetUserByPhone() (#4099) 2025-08-19 02:19:15 +08:00
Attack825
83df077a02 feat: add Application.Order for sorting in Apps page (#4085) 2025-08-18 08:34:32 +08:00
DacongDA
ad6080e763 feat: fix issue that signing up via provider in shared application will sign up to built-in app (#4093) 2025-08-17 22:32:47 +08:00
DacongDA
c179324de4 feat: fix bug that SelfLoginButton will re-render when username field updates (#4091) 2025-08-17 19:50:34 +08:00
DacongDA
645716e485 feat: add country code to validate phone number when Code method's rule is Phone only (#4089) 2025-08-17 16:56:25 +08:00
IsAurora6
955e73ddd1 feat: fix the asynchronous issue in handleOrganizationChange in BaseListPage (#4090) 2025-08-17 14:59:49 +08:00
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
69 changed files with 2182 additions and 102 deletions

View File

@@ -719,7 +719,8 @@ func (c *ApiController) Login() {
setHttpClient(idProvider, provider.Type) setHttpClient(idProvider, provider.Type)
if authForm.State != conf.GetConfigString("authState") && authForm.State != application.Name { stateApplicationName := strings.Split(authForm.State, "-org-")[0]
if authForm.State != conf.GetConfigString("authState") && stateApplicationName != application.Name {
c.ResponseError(fmt.Sprintf(c.T("auth:State expected: %s, but got: %s"), conf.GetConfigString("authState"), authForm.State)) c.ResponseError(fmt.Sprintf(c.T("auth:State expected: %s, but got: %s"), conf.GetConfigString("authState"), authForm.State))
return return
} }

View File

@@ -17,7 +17,6 @@ package controllers
import ( import (
"encoding/json" "encoding/json"
"fmt" "fmt"
"strings"
"github.com/beego/beego/utils/pagination" "github.com/beego/beego/utils/pagination"
"github.com/casdoor/casdoor/object" "github.com/casdoor/casdoor/object"
@@ -200,37 +199,28 @@ func (c *ApiController) GetPolicies() {
// GetFilteredPolicies // GetFilteredPolicies
// @Title GetFilteredPolicies // @Title GetFilteredPolicies
// @Tag Enforcer API // @Tag Enforcer API
// @Description get filtered policies // @Description get filtered policies with support for multiple filters via POST body
// @Param id query string true "The id ( owner/name ) of enforcer" // @Param id query string true "The id ( owner/name ) of enforcer"
// @Param ptype query string false "Policy type, default is 'p'" // @Param body body []object.Filter true "Array of filter objects for multiple filters"
// @Param fieldIndex query int false "Field index for filtering"
// @Param fieldValues query string false "Field values for filtering, comma-separated"
// @Success 200 {array} xormadapter.CasbinRule // @Success 200 {array} xormadapter.CasbinRule
// @router /get-filtered-policies [get] // @router /get-filtered-policies [post]
func (c *ApiController) GetFilteredPolicies() { func (c *ApiController) GetFilteredPolicies() {
id := c.Input().Get("id") id := c.Input().Get("id")
ptype := c.Input().Get("ptype")
fieldIndexStr := c.Input().Get("fieldIndex")
fieldValuesStr := c.Input().Get("fieldValues")
if ptype == "" { var filters []object.Filter
ptype = "p" err := json.Unmarshal(c.Ctx.Input.RequestBody, &filters)
}
fieldIndex := util.ParseInt(fieldIndexStr)
var fieldValues []string
if fieldValuesStr != "" {
fieldValues = strings.Split(fieldValuesStr, ",")
}
policies, err := object.GetFilteredPolicies(id, ptype, fieldIndex, fieldValues...)
if err != nil { if err != nil {
c.ResponseError(err.Error()) c.ResponseError(err.Error())
return return
} }
c.ResponseOk(policies) filteredPolicies, err := object.GetFilteredPoliciesMulti(id, filters)
if err != nil {
c.ResponseError(err.Error())
return
}
c.ResponseOk(filteredPolicies)
} }
// UpdatePolicy // UpdatePolicy

View File

@@ -20,6 +20,7 @@ import (
"fmt" "fmt"
"io" "io"
"mime" "mime"
"path"
"path/filepath" "path/filepath"
"strings" "strings"
@@ -187,6 +188,11 @@ func (c *ApiController) DeleteResource() {
} }
_, resource.Name = refineFullFilePath(resource.Name) _, 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()) err = object.DeleteFile(provider, resource.Name, c.GetAcceptLanguage())
if err != nil { if err != nil {
c.ResponseError(err.Error()) c.ResponseError(err.Error())

View File

@@ -435,9 +435,15 @@ func (c *ApiController) ResetEmailOrPhone() {
switch destType { switch destType {
case object.VerifyTypeEmail: case object.VerifyTypeEmail:
id := user.GetId()
user.Email = dest user.Email = dest
user.EmailVerified = true 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: case object.VerifyTypePhone:
user.Phone = dest user.Phone = dest
_, err = object.SetUserField(user, "phone", user.Phone) _, err = object.SetUserField(user, "phone", user.Phone)
@@ -449,6 +455,9 @@ func (c *ApiController) ResetEmailOrPhone() {
c.ResponseError(err.Error()) c.ResponseError(err.Error())
return return
} }
if organization.UseEmailAsUsername {
c.SetSessionUsername(user.GetId())
}
err = object.DisableVerificationCode(checkDest) err = object.DisableVerificationCode(checkDest)
if err != nil { 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." return i18n.Translate(lang, "general:Missing parameter") + ": dest."
} }
if form.CaptchaType == "" { if form.CaptchaType == "" {
return i18n.Translate(lang, "general:Missing parameter") + ": checkType." return i18n.Translate(lang, "general:Missing parameter") + ": captchaType."
} }
if !strings.Contains(form.ApplicationId, "/") { if !strings.Contains(form.ApplicationId, "/") {
return i18n.Translate(lang, "verification:Wrong parameter") + ": 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/sendgrid/sendgrid-go v3.14.0+incompatible
github.com/shirou/gopsutil v3.21.11+incompatible github.com/shirou/gopsutil v3.21.11+incompatible
github.com/siddontang/go-log v0.0.0-20190221022429-1e957dd83bed 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/stretchr/testify v1.10.0
github.com/stripe/stripe-go/v74 v74.29.0 github.com/stripe/stripe-go/v74 v74.29.0
github.com/tealeg/xlsx v1.0.5 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/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 h1:AM+y0rI04VksttfwjkSTNQorvGqmwATnvnAHpSgc0LY=
github.com/skeema/knownhosts v1.3.0/go.mod h1:sPINvnADmT/qYH1kfv+ePMmOBTH6Tbl7b5LvTDjFK7M= 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 h1:92/dfFU8Q5XP6Wp5rr5/T5JHLM5c5Smtn53fhToAP88=
github.com/slack-go/slack v0.12.3/go.mod h1:hlGi5oXA+Gt+yWTPP0plCdRKmjsDxecdHxYQdlMQKOw= 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= 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", "fa", data)
applyToOtherLanguage("frontend", "cs", data) applyToOtherLanguage("frontend", "cs", data)
applyToOtherLanguage("frontend", "sk", data) applyToOtherLanguage("frontend", "sk", data)
applyToOtherLanguage("frontend", "az", data)
} }
func TestGenerateI18nBackend(t *testing.T) { func TestGenerateI18nBackend(t *testing.T) {
@@ -77,4 +78,5 @@ func TestGenerateI18nBackend(t *testing.T) {
applyToOtherLanguage("backend", "fa", data) applyToOtherLanguage("backend", "fa", data)
applyToOtherLanguage("backend", "cs", data) applyToOtherLanguage("backend", "cs", data)
applyToOtherLanguage("backend", "sk", data) applyToOtherLanguage("backend", "sk", data)
applyToOtherLanguage("backend", "az", data)
} }

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

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

View File

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

View File

@@ -37,7 +37,8 @@
"UA", "UA",
"KZ", "KZ",
"CZ", "CZ",
"SK" "SK",
"AZ"
], ],
"defaultAvatar": "", "defaultAvatar": "",
"defaultApplication": "", "defaultApplication": "",
@@ -66,7 +67,8 @@
"kk", "kk",
"fa", "fa",
"cs", "cs",
"sk" "sk",
"az"
], ],
"masterPassword": "", "masterPassword": "",
"defaultPassword": "", "defaultPassword": "",

View File

@@ -67,6 +67,7 @@ type Application struct {
DisplayName string `xorm:"varchar(100)" json:"displayName"` DisplayName string `xorm:"varchar(100)" json:"displayName"`
Logo string `xorm:"varchar(200)" json:"logo"` Logo string `xorm:"varchar(200)" json:"logo"`
Order int `json:"order"`
HomepageUrl string `xorm:"varchar(100)" json:"homepageUrl"` HomepageUrl string `xorm:"varchar(100)" json:"homepageUrl"`
Description string `xorm:"varchar(100)" json:"description"` Description string `xorm:"varchar(100)" json:"description"`
Organization string `xorm:"varchar(100)" json:"organization"` Organization string `xorm:"varchar(100)" json:"organization"`

View File

@@ -16,6 +16,7 @@ package object
import ( import (
"fmt" "fmt"
"slices"
"github.com/casbin/casbin/v2" "github.com/casbin/casbin/v2"
"github.com/casdoor/casdoor/util" "github.com/casdoor/casdoor/util"
@@ -206,6 +207,13 @@ func GetPolicies(id string) ([]*xormadapter.CasbinRule, error) {
return res, nil 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) { func GetFilteredPolicies(id string, ptype string, fieldIndex int, fieldValues ...string) ([]*xormadapter.CasbinRule, error) {
enforcer, err := GetInitializedEnforcer(id) enforcer, err := GetInitializedEnforcer(id)
if err != nil { if err != nil {
@@ -236,6 +244,78 @@ func GetFilteredPolicies(id string, ptype string, fieldIndex int, fieldValues ..
return res, nil 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) { func UpdatePolicy(id string, ptype string, oldPolicy []string, newPolicy []string) (bool, error) {
enforcer, err := GetInitializedEnforcer(id) enforcer, err := GetInitializedEnforcer(id)
if err != nil { if err != nil {

View File

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

View File

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

View File

@@ -510,6 +510,8 @@ func GetUserByPhone(owner string, phone string) (*User, error) {
return nil, nil return nil, nil
} }
phone = util.GetSeperatedPhone(phone)
user := User{Owner: owner, Phone: phone} user := User{Owner: owner, Phone: phone}
existed, err := ormer.Engine.Get(&user) existed, err := ormer.Engine.Get(&user)
if err != nil { if err != nil {
@@ -528,6 +530,8 @@ func GetUserByPhoneOnly(phone string) (*User, error) {
return nil, nil return nil, nil
} }
phone = util.GetSeperatedPhone(phone)
user := User{Phone: phone} user := User{Phone: phone}
existed, err := ormer.Engine.Get(&user) existed, err := ormer.Engine.Get(&user)
if err != nil { if err != nil {

View File

@@ -80,7 +80,8 @@ func GetUserByFields(organization string, field string) (*User, error) {
} }
// check phone // check phone
user, err = GetUserByField(organization, "phone", field) phone := util.GetSeperatedPhone(field)
user, err = GetUserByField(organization, "phone", phone)
if user != nil || err != nil { if user != nil || err != nil {
return user, err return user, err
} }

View File

@@ -102,7 +102,12 @@ func AutoSigninFilter(ctx *context.Context) {
userId = ctx.Input.Query("username") userId = ctx.Input.Query("username")
password := ctx.Input.Query("password") password := ctx.Input.Query("password")
if userId != "" && password != "" && ctx.Input.Query("grant_type") == "" { 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") _, err = object.CheckUserPassword(owner, name, password, "en")
if err != nil { if err != nil {
responseError(ctx, err.Error()) responseError(ctx, err.Error())

View File

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

View File

@@ -30,6 +30,7 @@ import (
"unicode" "unicode"
"github.com/google/uuid" "github.com/google/uuid"
"github.com/nyaruka/phonenumbers"
) )
func ParseInt(s string) int { func ParseInt(s string) int {
@@ -278,6 +279,19 @@ func GetMaskedPhone(phone string) string {
return rePhone.ReplaceAllString(phone, "$1****$2") return rePhone.ReplaceAllString(phone, "$1****$2")
} }
func GetSeperatedPhone(phone string) string {
if strings.HasPrefix(phone, "+") {
phoneNumberParsed, err := phonenumbers.Parse(phone, "")
if err != nil {
return phone
}
phone = fmt.Sprintf("%d", phoneNumberParsed.GetNationalNumber())
}
return phone
}
func GetMaskedEmail(email string) string { func GetMaskedEmail(email string) string {
if email == "" { if email == "" {
return "" return ""

View File

@@ -19,6 +19,7 @@
"@web3-onboard/gnosis": "^2.1.10", "@web3-onboard/gnosis": "^2.1.10",
"@web3-onboard/infinity-wallet": "^2.0.4", "@web3-onboard/infinity-wallet": "^2.0.4",
"@web3-onboard/injected-wallets": "^2.10.4", "@web3-onboard/injected-wallets": "^2.10.4",
"@web3-onboard/phantom": "^2.1.1",
"@web3-onboard/react": "^2.8.10", "@web3-onboard/react": "^2.8.10",
"@web3-onboard/sequence": "^2.0.8", "@web3-onboard/sequence": "^2.0.8",
"@web3-onboard/taho": "^2.0.5", "@web3-onboard/taho": "^2.0.5",

View File

@@ -468,6 +468,16 @@ class ApplicationEditPage extends React.Component {
</Select> </Select>
</Col> </Col>
</Row> </Row>
<Row style={{marginTop: "20px"}} >
<Col style={{marginTop: "5px"}} span={(Setting.isMobile()) ? 22 : 2}>
{Setting.getLabel(i18next.t("application:Order"), i18next.t("application:Order - Tooltip"))} :
</Col>
<Col span={22} >
<InputNumber style={{width: "150px"}} value={this.state.application.order} min={0} step={1} precision={0} addonAfter="" onChange={value => {
this.updateApplicationField("order", value);
}} />
</Col>
</Row>
<Row style={{marginTop: "20px"}} > <Row style={{marginTop: "20px"}} >
<Col style={{marginTop: "5px"}} span={(Setting.isMobile()) ? 22 : 2}> <Col style={{marginTop: "5px"}} span={(Setting.isMobile()) ? 22 : 2}>
{Setting.getLabel(i18next.t("application:Token expire"), i18next.t("application:Token expire - Tooltip"))} : {Setting.getLabel(i18next.t("application:Token expire"), i18next.t("application:Token expire - Tooltip"))} :

View File

@@ -42,10 +42,11 @@ class BaseListPage extends React.Component {
handleOrganizationChange = () => { handleOrganizationChange = () => {
this.setState({ this.setState({
organizationName: this.props.match?.params.organizationName || Setting.getRequestOrganization(this.props.account), organizationName: this.props.match?.params.organizationName || Setting.getRequestOrganization(this.props.account),
},
() => {
const {pagination} = this.state;
this.fetch({pagination});
}); });
const {pagination} = this.state;
this.fetch({pagination});
}; };
handleTourChange = () => { handleTourChange = () => {

View File

@@ -14,6 +14,7 @@
import React from "react"; import React from "react";
import {Button, Card, Col, Input, InputNumber, Row, Select} from "antd"; import {Button, Card, Col, Input, InputNumber, Row, Select} from "antd";
import {CopyOutlined} from "@ant-design/icons";
import * as InvitationBackend from "./backend/InvitationBackend"; import * as InvitationBackend from "./backend/InvitationBackend";
import * as OrganizationBackend from "./backend/OrganizationBackend"; import * as OrganizationBackend from "./backend/OrganizationBackend";
import * as ApplicationBackend from "./backend/ApplicationBackend"; 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; {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 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"}} 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} {this.state.mode === "add" ? <Button style={{marginLeft: "20px"}} onClick={() => this.deleteInvitation()}>{i18next.t("general:Cancel")}</Button> : null}
</div> </div>
} style={(Setting.isMobile()) ? {margin: "5px"} : {}} type="inner"> } style={(Setting.isMobile()) ? {margin: "5px"} : {}} type="inner">
@@ -192,6 +190,15 @@ class InvitationEditPage extends React.Component {
}} /> }} />
</Col> </Col>
</Row> </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"}} > <Row style={{marginTop: "20px"}} >
<Col style={{marginTop: "5px"}} span={(Setting.isMobile()) ? 22 : 2}> <Col style={{marginTop: "5px"}} span={(Setting.isMobile()) ? 22 : 2}>
{Setting.getLabel(i18next.t("invitation:Quota"), i18next.t("invitation:Quota - Tooltip"))} : {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"}}> <div style={{marginTop: "20px", marginLeft: "40px"}}>
<Button size="large" onClick={() => this.submitInvitationEdit(false)}>{i18next.t("general:Save")}</Button> <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"}} 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} {this.state.mode === "add" ? <Button style={{marginLeft: "20px"}} size="large" onClick={() => this.deleteInvitation()}>{i18next.t("general:Cancel")}</Button> : null}
</div> </div>
</div> </div>

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({ this.setState({
provider: provider, provider: provider,

View File

@@ -60,6 +60,7 @@ export const Countries = [
{label: "فارسی", key: "fa", country: "IR", alt: "فارسی"}, {label: "فارسی", key: "fa", country: "IR", alt: "فارسی"},
{label: "Čeština", key: "cs", country: "CZ", alt: "Čeština"}, {label: "Čeština", key: "cs", country: "CZ", alt: "Čeština"},
{label: "Slovenčina", key: "sk", country: "SK", alt: "Slovenčina"}, {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) { export function getThemeData(organization, application) {
@@ -156,7 +157,7 @@ export const OtherProviderInfo = {
url: "https://control.msg91.com/app/", url: "https://control.msg91.com/app/",
}, },
"OSON SMS": { "OSON SMS": {
logo: "https://osonsms.com/images/osonsms-logo.svg", logo: `${StaticBaseUrl}/img/social_osonsms.svg`,
url: "https://osonsms.com/", url: "https://osonsms.com/",
}, },
"Custom HTTP SMS": { "Custom HTTP SMS": {
@@ -204,7 +205,7 @@ export const OtherProviderInfo = {
url: "https://aws.amazon.com/s3", url: "https://aws.amazon.com/s3",
}, },
"MinIO": { "MinIO": {
logo: "https://min.io/resources/img/logo.svg", logo: `${StaticBaseUrl}/img/social_minio.png`,
url: "https://min.io/", url: "https://min.io/",
}, },
"Aliyun OSS": { "Aliyun OSS": {
@@ -1296,6 +1297,9 @@ export function renderSignupLink(application, text) {
} else { } else {
if (application.signupUrl === "") { if (application.signupUrl === "") {
url = `/signup/${application.name}`; url = `/signup/${application.name}`;
if (application.isShared) {
url = `/signup/${application.name}-org-${application.organization}`;
}
} else { } else {
url = application.signupUrl; url = application.signupUrl;
} }

View File

@@ -326,7 +326,7 @@ class UserEditPage extends React.Component {
</Col> </Col>
<Col span={22} > <Col span={22} >
<Select virtual={false} mode="multiple" style={{width: "100%"}} disabled={disabled} value={this.state.user.groups ?? []} onChange={(value => { <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) { .filter(group => group.type === "Physical").length > 1) {
Setting.showMessage("error", i18next.t("general:You can only select one physical group")); Setting.showMessage("error", i18next.t("general:You can only select one physical group"));
return; return;
@@ -1117,6 +1117,32 @@ class UserEditPage extends React.Component {
</Col> </Col>
</Row> </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

@@ -39,6 +39,7 @@ import {GoogleOneTapLoginVirtualButton} from "./GoogleLoginButton";
import * as ProviderButton from "./ProviderButton"; import * as ProviderButton from "./ProviderButton";
import {createFormAndSubmit, goToLink} from "../Setting"; import {createFormAndSubmit, goToLink} from "../Setting";
import WeChatLoginPanel from "./WeChatLoginPanel"; import WeChatLoginPanel from "./WeChatLoginPanel";
import {CountryCodeSelect} from "../common/select/CountryCodeSelect";
const FaceRecognitionCommonModal = lazy(() => import("../common/modal/FaceRecognitionCommonModal")); const FaceRecognitionCommonModal = lazy(() => import("../common/modal/FaceRecognitionCommonModal"));
const FaceRecognitionModal = lazy(() => import("../common/modal/FaceRecognitionModal")); const FaceRecognitionModal = lazy(() => import("../common/modal/FaceRecognitionModal"));
@@ -595,6 +596,32 @@ class LoginPage extends React.Component {
return null; 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) { renderFormItem(application, signinItem) {
if (!signinItem.visible && signinItem.name !== "Forgot password?") { if (!signinItem.visible && signinItem.name !== "Forgot password?") {
return null; return null;
@@ -648,6 +675,65 @@ class LoginPage extends React.Component {
) )
; ;
} else if (signinItem.name === "Username") { } else if (signinItem.name === "Username") {
if (this.state.loginMethod === "wechat") {
return (<WeChatLoginPanel application={application} loginMethod={this.state.loginMethod} />);
}
if (this.state.loginMethod === "verificationCodePhone") {
return <Form.Item className="signin-phone" required={true}>
<Input.Group compact>
<Form.Item
name="countryCode"
noStyle
rules={[
{
required: true,
message: i18next.t("signup:Please select your country code!"),
},
]}
>
<CountryCodeSelect
style={{width: "35%"}}
countryCodes={this.getApplicationObj().organizationObj.countryCodes}
/>
</Form.Item>
<Form.Item
name="username"
dependencies={["countryCode"]}
noStyle
rules={[
{
required: true,
message: i18next.t("signup:Please input your phone number!"),
},
({getFieldValue}) => ({
validator: (_, value) => {
if (!value) {
return Promise.resolve();
}
if (value && !Setting.isValidPhone(value, getFieldValue("countryCode"))) {
this.setState({validEmailOrPhone: false});
return Promise.reject(i18next.t("signup:The input is not valid Phone!"));
}
this.setState({validEmailOrPhone: true});
return Promise.resolve();
},
}),
]}
>
<Input
className="signup-phone-input"
placeholder={signinItem.placeholder}
style={{width: "65%", textAlign: "left"}}
onChange={e => this.setState({username: e.target.value})}
/>
</Form.Item>
</Input.Group>
</Form.Item>;
}
return ( return (
<div key={resultItemKey}> <div key={resultItemKey}>
<div dangerouslySetInnerHTML={{__html: ("<style>" + signinItem.customCss?.replaceAll("<style>", "").replaceAll("</style>", "") + "</style>")}} /> <div dangerouslySetInnerHTML={{__html: ("<style>" + signinItem.customCss?.replaceAll("<style>", "").replaceAll("</style>", "") + "</style>")}} />
@@ -750,6 +836,9 @@ class LoginPage extends React.Component {
} else if (signinItem.name === "Agreement") { } else if (signinItem.name === "Agreement") {
return AgreementModal.isAgreementRequired(application) ? AgreementModal.renderAgreementFormItem(application, true, {}, this) : null; return AgreementModal.isAgreementRequired(application) ? AgreementModal.renderAgreementFormItem(application, true, {}, this) : null;
} else if (signinItem.name === "Login button") { } else if (signinItem.name === "Login button") {
if (this.state.loginMethod === "wechat") {
return null;
}
return ( return (
<Form.Item key={resultItemKey} className="login-button-box"> <Form.Item key={resultItemKey} className="login-button-box">
<div dangerouslySetInnerHTML={{__html: ("<style>" + signinItem.customCss?.replaceAll("<style>", "").replaceAll("</style>", "") + "</style>")}} /> <div dangerouslySetInnerHTML={{__html: ("<style>" + signinItem.customCss?.replaceAll("<style>", "").replaceAll("</style>", "") + "</style>")}} />
@@ -848,6 +937,17 @@ class LoginPage extends React.Component {
{this.renderFooter(application, signinItem)} {this.renderFooter(application, signinItem)}
</div> </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>
);
} }
} }
@@ -896,10 +996,6 @@ class LoginPage extends React.Component {
loginWidth += 10; 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 ( return (
<Form <Form
name="normal_login" name="normal_login"
@@ -1083,11 +1179,13 @@ class LoginPage extends React.Component {
{i18next.t("login:Continue with")}&nbsp;: {i18next.t("login:Continue with")}&nbsp;:
</div> </div>
<br /> <br />
<SelfLoginButton account={this.props.account} onClick={() => { <div onClick={() => {
const values = {}; const values = {};
values["application"] = application.name; values["application"] = application.name;
this.login(values); this.login(values);
}} /> }}>
<SelfLoginButton account={this.props.account} />
</div>
<br /> <br />
<br /> <br />
<div style={{fontSize: 16, textAlign: "left"}}> <div style={{fontSize: 16, textAlign: "left"}}>
@@ -1109,8 +1207,7 @@ class LoginPage extends React.Component {
.then(res => res.json()) .then(res => res.json())
.then((credentialRequestOptions) => { .then((credentialRequestOptions) => {
if ("status" in credentialRequestOptions) { if ("status" in credentialRequestOptions) {
Setting.showMessage("error", credentialRequestOptions.msg); return Promise.reject(new Error(credentialRequestOptions.msg));
throw credentialRequestOptions.status.msg;
} }
credentialRequestOptions.publicKey.challenge = UserWebauthnBackend.webAuthnBufferDecode(credentialRequestOptions.publicKey.challenge); credentialRequestOptions.publicKey.challenge = UserWebauthnBackend.webAuthnBufferDecode(credentialRequestOptions.publicKey.challenge);
@@ -1169,7 +1266,7 @@ class LoginPage extends React.Component {
Setting.showMessage("error", `${i18next.t("general:Failed to connect to server")}${error}`); Setting.showMessage("error", `${i18next.t("general:Failed to connect to server")}${error}`);
}); });
}).catch(error => { }).catch(error => {
Setting.showMessage("error", `${error}`); Setting.showMessage("error", `${error.message}`);
}).finally(() => { }).finally(() => {
this.setState({ this.setState({
loginLoading: false, loginLoading: false,
@@ -1240,6 +1337,7 @@ class LoginPage extends React.Component {
[generateItemKey("WebAuthn", "None"), {label: i18next.t("login:WebAuthn"), key: "webAuthn"}], [generateItemKey("WebAuthn", "None"), {label: i18next.t("login:WebAuthn"), key: "webAuthn"}],
[generateItemKey("LDAP", "None"), {label: i18next.t("login:LDAP"), key: "ldap"}], [generateItemKey("LDAP", "None"), {label: i18next.t("login:LDAP"), key: "ldap"}],
[generateItemKey("Face ID", "None"), {label: i18next.t("login:Face ID"), key: "faceId"}], [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"}], [generateItemKey("WeChat", "None"), {label: i18next.t("login:WeChat"), key: "wechat"}],
]); ]);
@@ -1404,6 +1502,8 @@ class LoginPage extends React.Component {
); );
} }
const wechatSigninMethods = application.signinMethods?.filter(method => method.name === "WeChat" && method.rule === "Login page");
return ( return (
<React.Fragment> <React.Fragment>
<CustomGithubCorner /> <CustomGithubCorner />
@@ -1421,6 +1521,15 @@ class LoginPage extends React.Component {
} }
</div> </div>
</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>
</div> </div>
</React.Fragment> </React.Fragment>

View File

@@ -392,7 +392,11 @@ export function getAuthUrl(application, provider, method, code) {
let redirectUri = `${redirectOrigin}/callback`; let redirectUri = `${redirectOrigin}/callback`;
let scope = authInfo[provider.type].scope; let scope = authInfo[provider.type].scope;
const isShortState = (provider.type === "WeChat" && navigator.userAgent.includes("MicroMessenger")) || (provider.type === "Twitter"); const isShortState = (provider.type === "WeChat" && navigator.userAgent.includes("MicroMessenger")) || (provider.type === "Twitter");
const state = Util.getStateFromQueryParams(application.name, provider.name, method, isShortState); let applicationName = application.name;
if (application?.isShared) {
applicationName = `${application.name}-org-${application.organization}`;
}
const state = Util.getStateFromQueryParams(applicationName, provider.name, method, isShortState);
const codeChallenge = "P3S-a7dr8bgM4bF6vOyiKkKETDl16rcAzao9F8UIL1Y"; // SHA256(Base64-URL-encode("casdoor-verifier")) const codeChallenge = "P3S-a7dr8bgM4bF6vOyiKkKETDl16rcAzao9F8UIL1Y"; // SHA256(Base64-URL-encode("casdoor-verifier"))
if (provider.type === "AzureAD") { if (provider.type === "AzureAD") {

View File

@@ -12,7 +12,7 @@
// See the License for the specific language governing permissions and // See the License for the specific language governing permissions and
// limitations under the License. // limitations under the License.
import React from "react"; import React, {memo} from "react";
import {createButton} from "react-social-login-buttons"; import {createButton} from "react-social-login-buttons";
class SelfLoginButton extends React.Component { class SelfLoginButton extends React.Component {
@@ -44,4 +44,4 @@ class SelfLoginButton extends React.Component {
} }
} }
export default SelfLoginButton; export default memo(SelfLoginButton);

View File

@@ -364,6 +364,40 @@ class SignupPage extends React.Component {
<Input className="signup-name-input" placeholder={signupItem.placeholder} /> <Input className="signup-name-input" placeholder={signupItem.placeholder} />
</Form.Item> </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") { } else if (signupItem.name === "Affiliation") {
return ( return (
<Form.Item <Form.Item
@@ -776,6 +810,12 @@ class SignupPage extends React.Component {
this.form.current?.setFieldValue("invitationCode", this.state.invitationCode); 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 ( return (
<Form <Form
{...formItemLayout} {...formItemLayout}

View File

@@ -13,7 +13,7 @@
// limitations under the License. // limitations under the License.
import React from "react"; import React from "react";
import {Alert, Button, Modal, Result} from "antd"; import {Alert, Button, Modal, QRCode, Result} from "antd";
import i18next from "i18next"; import i18next from "i18next";
import {getWechatMessageEvent} from "./AuthBackend"; import {getWechatMessageEvent} from "./AuthBackend";
import * as Setting from "../Setting"; 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"), title: i18next.t("provider:Please use WeChat to scan the QR code and follow the official account for sign in"),
content: ( content: (
<div style={{marginRight: "34px"}}> <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> </div>
), ),
onOk() { onOk() {

View File

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

@@ -27,6 +27,7 @@ import frontierModule from "@web3-onboard/frontier";
import tahoModule from "@web3-onboard/taho"; import tahoModule from "@web3-onboard/taho";
import coinbaseModule from "@web3-onboard/coinbase"; import coinbaseModule from "@web3-onboard/coinbase";
import gnosisModule from "@web3-onboard/gnosis"; import gnosisModule from "@web3-onboard/gnosis";
import phantomModule from "@web3-onboard/phantom";
// import keystoneModule from "@web3-onboard/keystone"; // import keystoneModule from "@web3-onboard/keystone";
// import keepkeyModule from "@web3-onboard/keepkey"; // import keepkeyModule from "@web3-onboard/keepkey";
// import dcentModule from "@web3-onboard/dcent"; // import dcentModule from "@web3-onboard/dcent";
@@ -172,6 +173,10 @@ const web3Wallets = {
label: "Injected", label: "Injected",
wallet: injectedModule(), wallet: injectedModule(),
}, },
phantom: {
label: "Phantom",
wallet: phantomModule(),
},
// sdk wallets // sdk wallets
coinbase: { coinbase: {
label: "Coinbase", label: "Coinbase",
@@ -296,6 +301,12 @@ export function initWeb3Onboard(application, provider) {
label: "Arbitrum", label: "Arbitrum",
rpcUrl: "https://rpc.ankr.com/arbitrum", rpcUrl: "https://rpc.ankr.com/arbitrum",
}, },
{
id: "0x1",
token: "SOL",
label: "Solana Mainnet",
rpcUrl: "https://api.mainnet-beta.solana.com",
},
]; ];
const appMetadata = { const appMetadata = {
@@ -304,6 +315,7 @@ export function initWeb3Onboard(application, provider) {
recommendedInjectedWallets: [ recommendedInjectedWallets: [
{name: "MetaMask", url: "https://metamask.io"}, {name: "MetaMask", url: "https://metamask.io"},
{name: "Coinbase", url: "https://www.coinbase.com/wallet"}, {name: "Coinbase", url: "https://www.coinbase.com/wallet"},
{name: "Phantom", url: "https://phantom.app"},
], ],
}; };

View File

@@ -19,13 +19,21 @@ import GridCards from "./GridCards";
const AppListPage = (props) => { const AppListPage = (props) => {
const [applications, setApplications] = React.useState(null); const [applications, setApplications] = React.useState(null);
const sort = (applications) => {
applications.sort((a, b) => {
return a.order - b.order;
});
};
React.useEffect(() => { React.useEffect(() => {
if (props.account === null) { if (props.account === null) {
return; return;
} }
ApplicationBackend.getApplicationsByOrganization("admin", props.account.owner) ApplicationBackend.getApplicationsByOrganization("admin", props.account.owner)
.then((res) => { .then((res) => {
setApplications(res.data || []); const applications = res.data || [];
sort(applications);
setApplications(applications);
}); });
}, [props.account]); }, [props.account]);

View File

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

View File

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

View File

@@ -92,6 +92,8 @@
"No verification": "لا توجد مصادقة", "No verification": "لا توجد مصادقة",
"Normal": "عادي", "Normal": "عادي",
"Only signup": "التسجيل فقط", "Only signup": "التسجيل فقط",
"Order": "Order",
"Order - Tooltip": "Order - Tooltip",
"Org choice mode": "وضع اختيار المنظمة", "Org choice mode": "وضع اختيار المنظمة",
"Org choice mode - Tooltip": "وضع اختيار المنظمة - تلميح", "Org choice mode - Tooltip": "وضع اختيار المنظمة - تلميح",
"Please enable \\\"Signin session\\\" first before enabling \\\"Auto signin\\\"": "يرجى تشغيل \\\"جلسة الدخول\\\" أولاً قبل تشغيل \\\"الدخول التلقائي\\\"", "Please enable \\\"Signin session\\\" first before enabling \\\"Auto signin\\\"": "يرجى تشغيل \\\"جلسة الدخول\\\" أولاً قبل تشغيل \\\"الدخول التلقائي\\\"",
@@ -331,6 +333,7 @@
"Last name": "الاسم الأخير", "Last name": "الاسم الأخير",
"Later": "لاحقًا", "Later": "لاحقًا",
"Logging & Auditing": "التسجيل والمراجعة", "Logging & Auditing": "التسجيل والمراجعة",
"Login page": "Login page",
"Logo": "الشعار", "Logo": "الشعار",
"Logo - Tooltip": "الأيقونات التي يعرضها التطبيق للعالم الخارجي", "Logo - Tooltip": "الأيقونات التي يعرضها التطبيق للعالم الخارجي",
"Logo dark": "الشعار المظلم", "Logo dark": "الشعار المظلم",
@@ -443,6 +446,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": "الطابع الزمني",
@@ -575,6 +579,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": "تسجيل الدخول باستخدام WebAuthn", "Sign in with WebAuthn": "تسجيل الدخول باستخدام WebAuthn",

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

File diff suppressed because it is too large Load Diff

View File

@@ -92,6 +92,8 @@
"No verification": "Žádná verifikace", "No verification": "Žádná verifikace",
"Normal": "Normální", "Normal": "Normální",
"Only signup": "Pouze registrace", "Only signup": "Pouze registrace",
"Order": "Order",
"Order - Tooltip": "Order - Tooltip",
"Org choice mode": "Režim výběru organizace", "Org choice mode": "Režim výběru organizace",
"Org choice mode - Tooltip": "Režim výběru organizace - popisek", "Org choice mode - Tooltip": "Režim výběru organizace - popisek",
"Please enable \\\"Signin session\\\" first before enabling \\\"Auto signin\\\"": "Nejprve povolte \\\"Přihlašovací relaci\\\" před povolením \\\"Automatického přihlášení\\\"", "Please enable \\\"Signin session\\\" first before enabling \\\"Auto signin\\\"": "Nejprve povolte \\\"Přihlašovací relaci\\\" před povolením \\\"Automatického přihlášení\\\"",
@@ -331,6 +333,7 @@
"Last name": "Příjmení", "Last name": "Příjmení",
"Later": "Později", "Later": "Později",
"Logging & Auditing": "Logování a audit", "Logging & Auditing": "Logování a audit",
"Login page": "Login page",
"Logo": "Logo", "Logo": "Logo",
"Logo - Tooltip": "Ikony, které aplikace prezentuje světu", "Logo - Tooltip": "Ikony, které aplikace prezentuje světu",
"Logo dark": "Tmavé logo", "Logo dark": "Tmavé logo",
@@ -443,6 +446,7 @@
"Sync": "Synchronizovat", "Sync": "Synchronizovat",
"Syncers": "Synchronizátory", "Syncers": "Synchronizátory",
"System Info": "Systémové informace", "System Info": "Systémové informace",
"Tab": "Tab",
"There was a problem signing you in..": "Při přihlašování nastal problém..", "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í!", "This is a read-only demo site!": "Toto je demo stránka pouze pro čtení!",
"Timestamp": "Časová značka", "Timestamp": "Časová značka",
@@ -575,6 +579,7 @@
"Please type an organization to sign in": "Prosím zadejte organizaci pro přihlášení", "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.", "Redirecting, please wait.": "Přesměrování, prosím čekejte.",
"Refresh": "Obnovit", "Refresh": "Obnovit",
"Select organization": "Select organization",
"Sign In": "Přihlásit se", "Sign In": "Přihlásit se",
"Sign in with Face ID": "Přihlásit se pomocí Face ID", "Sign in with Face ID": "Přihlásit se pomocí Face ID",
"Sign in with WebAuthn": "Přihlásit se pomocí WebAuthn", "Sign in with WebAuthn": "Přihlásit se pomocí WebAuthn",

View File

@@ -92,6 +92,8 @@
"No verification": "Keine Verifizierung", "No verification": "Keine Verifizierung",
"Normal": "Normal", "Normal": "Normal",
"Only signup": "Nur Registrierung", "Only signup": "Nur Registrierung",
"Order": "Order",
"Order - Tooltip": "Order - Tooltip",
"Org choice mode": "Organisationsauswahlmodus", "Org choice mode": "Organisationsauswahlmodus",
"Org choice mode - Tooltip": "Organisationsauswahlmodus Tooltip", "Org choice mode - Tooltip": "Organisationsauswahlmodus Tooltip",
"Please enable \\\"Signin session\\\" first before enabling \\\"Auto signin\\\"": "Bitte aktivieren Sie zuerst \\\"Anmeldesitzung\\\", bevor Sie \\\"Automatische Anmeldung\\\" aktivieren.", "Please enable \\\"Signin session\\\" first before enabling \\\"Auto signin\\\"": "Bitte aktivieren Sie zuerst \\\"Anmeldesitzung\\\", bevor Sie \\\"Automatische Anmeldung\\\" aktivieren.",
@@ -331,6 +333,7 @@
"Last name": "Nachname", "Last name": "Nachname",
"Later": "Später", "Later": "Später",
"Logging & Auditing": "Protokollierung & Audit", "Logging & Auditing": "Protokollierung & Audit",
"Login page": "Login page",
"Logo": "Logo", "Logo": "Logo",
"Logo - Tooltip": "Symbole, die die Anwendung der Außenwelt präsentiert", "Logo - Tooltip": "Symbole, die die Anwendung der Außenwelt präsentiert",
"Logo dark": "Dunkles Logo", "Logo dark": "Dunkles Logo",
@@ -443,6 +446,7 @@
"Sync": "Synchronisieren", "Sync": "Synchronisieren",
"Syncers": "Syncer", "Syncers": "Syncer",
"System Info": "Systeminformationen", "System Info": "Systeminformationen",
"Tab": "Tab",
"There was a problem signing you in..": "Es gab ein Problem beim Anmelden...", "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!", "This is a read-only demo site!": "Dies ist eine schreibgeschützte Demo-Seite!",
"Timestamp": "Zeitstempel", "Timestamp": "Zeitstempel",
@@ -575,6 +579,7 @@
"Please type an organization to sign in": "Bitte geben Sie eine Organisation zum Anmelden ein.", "Please type an organization to sign in": "Bitte geben Sie eine Organisation zum Anmelden ein.",
"Redirecting, please wait.": "Umleitung, bitte warten.", "Redirecting, please wait.": "Umleitung, bitte warten.",
"Refresh": "Aktualisieren", "Refresh": "Aktualisieren",
"Select organization": "Select organization",
"Sign In": "Anmelden", "Sign In": "Anmelden",
"Sign in with Face ID": "Mit Face ID anmelden", "Sign in with Face ID": "Mit Face ID anmelden",
"Sign in with WebAuthn": "Melden Sie sich mit WebAuthn an", "Sign in with WebAuthn": "Melden Sie sich mit WebAuthn an",

View File

@@ -92,6 +92,8 @@
"No verification": "No verification", "No verification": "No verification",
"Normal": "Normal", "Normal": "Normal",
"Only signup": "Only signup", "Only signup": "Only signup",
"Order": "Order",
"Order - Tooltip": "The smaller the value, the higher it ranks in the Apps page",
"Org choice mode": "Org choice mode", "Org choice mode": "Org choice mode",
"Org choice mode - Tooltip": "Org choice mode - Tooltip", "Org choice mode - Tooltip": "Org choice mode - Tooltip",
"Please enable \\\"Signin session\\\" first before enabling \\\"Auto signin\\\"": "Please enable \\\"Signin session\\\" first before enabling \\\"Auto signin\\\"", "Please enable \\\"Signin session\\\" first before enabling \\\"Auto signin\\\"": "Please enable \\\"Signin session\\\" first before enabling \\\"Auto signin\\\"",
@@ -331,6 +333,7 @@
"Last name": "Last name", "Last name": "Last name",
"Later": "Later", "Later": "Later",
"Logging & Auditing": "Logging & Auditing", "Logging & Auditing": "Logging & Auditing",
"Login page": "Login page",
"Logo": "Logo", "Logo": "Logo",
"Logo - Tooltip": "Icons that the application presents to the outside world", "Logo - Tooltip": "Icons that the application presents to the outside world",
"Logo dark": "Logo dark", "Logo dark": "Logo dark",
@@ -443,6 +446,7 @@
"Sync": "Sync", "Sync": "Sync",
"Syncers": "Syncers", "Syncers": "Syncers",
"System Info": "System Info", "System Info": "System Info",
"Tab": "Tab",
"There was a problem signing you in..": "There was a problem signing you in..", "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!", "This is a read-only demo site!": "This is a read-only demo site!",
"Timestamp": "Timestamp", "Timestamp": "Timestamp",
@@ -575,6 +579,7 @@
"Please type an organization to sign in": "Please type an organization to sign in", "Please type an organization to sign in": "Please type an organization to sign in",
"Redirecting, please wait.": "Redirecting, please wait.", "Redirecting, please wait.": "Redirecting, please wait.",
"Refresh": "Refresh", "Refresh": "Refresh",
"Select organization": "Select organization",
"Sign In": "Sign In", "Sign In": "Sign In",
"Sign in with Face ID": "Sign in with Face ID", "Sign in with Face ID": "Sign in with Face ID",
"Sign in with WebAuthn": "Sign in with WebAuthn", "Sign in with WebAuthn": "Sign in with WebAuthn",

View File

@@ -92,6 +92,8 @@
"No verification": "Sin verificación", "No verification": "Sin verificación",
"Normal": "Normal", "Normal": "Normal",
"Only signup": "Solo registro", "Only signup": "Solo registro",
"Order": "Order",
"Order - Tooltip": "Order - Tooltip",
"Org choice mode": "Modo de selección de organización", "Org choice mode": "Modo de selección de organización",
"Org choice mode - Tooltip": "Modo de selección de organización - Información adicional", "Org choice mode - Tooltip": "Modo de selección de organización - Información adicional",
"Please enable \\\"Signin session\\\" first before enabling \\\"Auto signin\\\"": "Por favor, habilita \\\"Sesión de inicio de sesión\\\" primero antes de habilitar \\\"Inicio de sesión automático\\\"", "Please enable \\\"Signin session\\\" first before enabling \\\"Auto signin\\\"": "Por favor, habilita \\\"Sesión de inicio de sesión\\\" primero antes de habilitar \\\"Inicio de sesión automático\\\"",
@@ -331,6 +333,7 @@
"Last name": "Apellido", "Last name": "Apellido",
"Later": "Más tarde", "Later": "Más tarde",
"Logging & Auditing": "Registro y auditoría", "Logging & Auditing": "Registro y auditoría",
"Login page": "Login page",
"Logo": "Logotipo", "Logo": "Logotipo",
"Logo - Tooltip": "Iconos que la aplicación presenta al mundo exterior", "Logo - Tooltip": "Iconos que la aplicación presenta al mundo exterior",
"Logo dark": "Logo oscuro", "Logo dark": "Logo oscuro",
@@ -443,6 +446,7 @@
"Sync": "Sincronización", "Sync": "Sincronización",
"Syncers": "Sincronizadores", "Syncers": "Sincronizadores",
"System Info": "Información del Sistema", "System Info": "Información del Sistema",
"Tab": "Tab",
"There was a problem signing you in..": "Hubo un problema al iniciar sesión...", "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!", "This is a read-only demo site!": "¡Este es un sitio de demostración solo de lectura!",
"Timestamp": "Marca de tiempo", "Timestamp": "Marca de tiempo",
@@ -575,6 +579,7 @@
"Please type an organization to sign in": "Por favor escribe una organización para iniciar sesión", "Please type an organization to sign in": "Por favor escribe una organización para iniciar sesión",
"Redirecting, please wait.": "Redirigiendo, por favor espera.", "Redirecting, please wait.": "Redirigiendo, por favor espera.",
"Refresh": "Actualizar", "Refresh": "Actualizar",
"Select organization": "Select organization",
"Sign In": "Iniciar sesión", "Sign In": "Iniciar sesión",
"Sign in with Face ID": "Iniciar sesión con Face ID", "Sign in with Face ID": "Iniciar sesión con Face ID",
"Sign in with WebAuthn": "Iniciar sesión con WebAuthn", "Sign in with WebAuthn": "Iniciar sesión con WebAuthn",

View File

@@ -92,6 +92,8 @@
"No verification": "بدون تأیید", "No verification": "بدون تأیید",
"Normal": "عادی", "Normal": "عادی",
"Only signup": "فقط ثبت‌نام", "Only signup": "فقط ثبت‌نام",
"Order": "Order",
"Order - Tooltip": "Order - Tooltip",
"Org choice mode": "حالت انتخاب سازمان", "Org choice mode": "حالت انتخاب سازمان",
"Org choice mode - Tooltip": "حالت انتخاب سازمان - راهنمای ابزار", "Org choice mode - Tooltip": "حالت انتخاب سازمان - راهنمای ابزار",
"Please enable \\\"Signin session\\\" first before enabling \\\"Auto signin\\\"": "لطفاً قبل فعال‌سازی «ورود خودکار»، ابتدا «جلسه ورود» را فعال کنید", "Please enable \\\"Signin session\\\" first before enabling \\\"Auto signin\\\"": "لطفاً قبل فعال‌سازی «ورود خودکار»، ابتدا «جلسه ورود» را فعال کنید",
@@ -331,6 +333,7 @@
"Last name": "نام خانوادگی", "Last name": "نام خانوادگی",
"Later": "بعداً", "Later": "بعداً",
"Logging & Auditing": "ورود و حسابرسی", "Logging & Auditing": "ورود و حسابرسی",
"Login page": "Login page",
"Logo": "لوگو", "Logo": "لوگو",
"Logo - Tooltip": "آیکون‌هایی که برنامه به بیرون ارائه می‌دهد", "Logo - Tooltip": "آیکون‌هایی که برنامه به بیرون ارائه می‌دهد",
"Logo dark": "لوگوی تیره", "Logo dark": "لوگوی تیره",
@@ -443,6 +446,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": "مهر زمان",
@@ -575,6 +579,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": "ورود با WebAuthn", "Sign in with WebAuthn": "ورود با WebAuthn",

View File

@@ -92,6 +92,8 @@
"No verification": "Ei vahvistusta", "No verification": "Ei vahvistusta",
"Normal": "Normaali", "Normal": "Normaali",
"Only signup": "Vain rekisteröityminen", "Only signup": "Vain rekisteröityminen",
"Order": "Order",
"Order - Tooltip": "Order - Tooltip",
"Org choice mode": "Organisaation valintatila", "Org choice mode": "Organisaation valintatila",
"Org choice mode - Tooltip": "Organisaation valintatila - työkalupala", "Org choice mode - Tooltip": "Organisaation valintatila - työkalupala",
"Please enable \\\"Signin session\\\" first before enabling \\\"Auto signin\\\"": "Ota \\\"Kirjautumisession\\\" käyttöön ennen \\\"Automaattisen kirjautumisen\\\" ottamista käyttöön", "Please enable \\\"Signin session\\\" first before enabling \\\"Auto signin\\\"": "Ota \\\"Kirjautumisession\\\" käyttöön ennen \\\"Automaattisen kirjautumisen\\\" ottamista käyttöön",
@@ -331,6 +333,7 @@
"Last name": "Sukunimi", "Last name": "Sukunimi",
"Later": "Myöhemmin", "Later": "Myöhemmin",
"Logging & Auditing": "Kirjaaminen ja tarkastus", "Logging & Auditing": "Kirjaaminen ja tarkastus",
"Login page": "Login page",
"Logo": "Logo", "Logo": "Logo",
"Logo - Tooltip": "Kuvakkeet, joita sovellus esittää ulkopuolelle", "Logo - Tooltip": "Kuvakkeet, joita sovellus esittää ulkopuolelle",
"Logo dark": "Tumma logo", "Logo dark": "Tumma logo",
@@ -443,6 +446,7 @@
"Sync": "Synkronoi", "Sync": "Synkronoi",
"Syncers": "Synkronointitoiminnot", "Syncers": "Synkronointitoiminnot",
"System Info": "Järjestelmätiedot", "System Info": "Järjestelmätiedot",
"Tab": "Tab",
"There was a problem signing you in..": "Kirjautumisessasi ilmeni ongelma..", "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!", "This is a read-only demo site!": "Tämä on vain luku -muotoinen demo-sivusto!",
"Timestamp": "Aikaleima", "Timestamp": "Aikaleima",
@@ -575,6 +579,7 @@
"Please type an organization to sign in": "Kirjoita organisaatio kirjautumista varten", "Please type an organization to sign in": "Kirjoita organisaatio kirjautumista varten",
"Redirecting, please wait.": "Ohjataan uudelleen, odota hetki.", "Redirecting, please wait.": "Ohjataan uudelleen, odota hetki.",
"Refresh": "Päivitä", "Refresh": "Päivitä",
"Select organization": "Select organization",
"Sign In": "Kirjaudu sisään", "Sign In": "Kirjaudu sisään",
"Sign in with Face ID": "Kirjaudu Face ID:llä", "Sign in with Face ID": "Kirjaudu Face ID:llä",
"Sign in with WebAuthn": "Kirjaudu WebAuthn-tunnisteella", "Sign in with WebAuthn": "Kirjaudu WebAuthn-tunnisteella",

View File

@@ -92,6 +92,8 @@
"No verification": "Aucune vérification", "No verification": "Aucune vérification",
"Normal": "Normal", "Normal": "Normal",
"Only signup": "Inscription uniquement", "Only signup": "Inscription uniquement",
"Order": "Order",
"Order - Tooltip": "Order - Tooltip",
"Org choice mode": "Mode de choix d'organisation", "Org choice mode": "Mode de choix d'organisation",
"Org choice mode - Tooltip": "Mode de choix d'organisation - Infobulle", "Org choice mode - Tooltip": "Mode de choix d'organisation - Infobulle",
"Please enable \\\"Signin session\\\" first before enabling \\\"Auto signin\\\"": "Veuillez activer \\\"Session de connexion\\\" avant d'activer \\\"Connexion automatique\\\"", "Please enable \\\"Signin session\\\" first before enabling \\\"Auto signin\\\"": "Veuillez activer \\\"Session de connexion\\\" avant d'activer \\\"Connexion automatique\\\"",
@@ -331,6 +333,7 @@
"Last name": "Nom de famille", "Last name": "Nom de famille",
"Later": "Plus tard", "Later": "Plus tard",
"Logging & Auditing": "Journalisation et audit", "Logging & Auditing": "Journalisation et audit",
"Login page": "Login page",
"Logo": "Logo", "Logo": "Logo",
"Logo - Tooltip": "Icônes que l'application présente au monde extérieur", "Logo - Tooltip": "Icônes que l'application présente au monde extérieur",
"Logo dark": "Logo sombre", "Logo dark": "Logo sombre",
@@ -443,6 +446,7 @@
"Sync": "Synchronisation", "Sync": "Synchronisation",
"Syncers": "Synchroniseurs", "Syncers": "Synchroniseurs",
"System Info": "Informations système", "System Info": "Informations système",
"Tab": "Tab",
"There was a problem signing you in..": "Un problème est survenu lors de votre connexion..", "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 !", "This is a read-only demo site!": "Ceci est un site de démonstration en lecture seule !",
"Timestamp": "Horodatage", "Timestamp": "Horodatage",
@@ -575,6 +579,7 @@
"Please type an organization to sign in": "Veuillez entrer une organisation pour vous connecter", "Please type an organization to sign in": "Veuillez entrer une organisation pour vous connecter",
"Redirecting, please wait.": "Redirection en cours, veuillez patienter.", "Redirecting, please wait.": "Redirection en cours, veuillez patienter.",
"Refresh": "Actualiser", "Refresh": "Actualiser",
"Select organization": "Select organization",
"Sign In": "Se connecter", "Sign In": "Se connecter",
"Sign in with Face ID": "Se connecter avec Face ID", "Sign in with Face ID": "Se connecter avec Face ID",
"Sign in with WebAuthn": "Connectez-vous avec WebAuthn", "Sign in with WebAuthn": "Connectez-vous avec WebAuthn",

View File

@@ -92,6 +92,8 @@
"No verification": "ללא אימות", "No verification": "ללא אימות",
"Normal": "רגיל", "Normal": "רגיל",
"Only signup": "הרשמה בלבד", "Only signup": "הרשמה בלבד",
"Order": "Order",
"Order - Tooltip": "Order - Tooltip",
"Org choice mode": "מצב בחירת ארגון", "Org choice mode": "מצב בחירת ארגון",
"Org choice mode - Tooltip": "מצב בחירת ארגון - תיאור", "Org choice mode - Tooltip": "מצב בחירת ארגון - תיאור",
"Please enable \\\"Signin session\\\" first before enabling \\\"Auto signin\\\"": "אנא הפעל \\\"פתיחת جلسة כניסה\\\" תחילה לפני הפעלת \\\"כניסה אוטומטית\\\"", "Please enable \\\"Signin session\\\" first before enabling \\\"Auto signin\\\"": "אנא הפעל \\\"פתיחת جلسة כניסה\\\" תחילה לפני הפעלת \\\"כניסה אוטומטית\\\"",
@@ -331,6 +333,7 @@
"Last name": "שם משפחה", "Last name": "שם משפחה",
"Later": "מאוחר יותר", "Later": "מאוחר יותר",
"Logging & Auditing": "רישום וביקורת", "Logging & Auditing": "רישום וביקורת",
"Login page": "Login page",
"Logo": "לוגו", "Logo": "לוגו",
"Logo - Tooltip": "סמלים שהיישום מציג לעולם החיצון", "Logo - Tooltip": "סמלים שהיישום מציג לעולם החיצון",
"Logo dark": "לוגו כהה", "Logo dark": "לוגו כהה",
@@ -443,6 +446,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": "חותמת זמן",
@@ -575,6 +579,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": "התחבר עם WebAuthn", "Sign in with WebAuthn": "התחבר עם WebAuthn",

View File

@@ -92,6 +92,8 @@
"No verification": "Tidak ada verifikasi", "No verification": "Tidak ada verifikasi",
"Normal": "Normal", "Normal": "Normal",
"Only signup": "Hanya mendaftar", "Only signup": "Hanya mendaftar",
"Order": "Order",
"Order - Tooltip": "Order - Tooltip",
"Org choice mode": "Mode pilihan organisasi", "Org choice mode": "Mode pilihan organisasi",
"Org choice mode - Tooltip": "Mode pilihan organisasi - Tooltip", "Org choice mode - Tooltip": "Mode pilihan organisasi - Tooltip",
"Please enable \\\"Signin session\\\" first before enabling \\\"Auto signin\\\"": "Harap aktifkan \\\"Sesi masuk\\\" terlebih dahulu sebelum mengaktifkan \\\"Masuk otomatis\\\"", "Please enable \\\"Signin session\\\" first before enabling \\\"Auto signin\\\"": "Harap aktifkan \\\"Sesi masuk\\\" terlebih dahulu sebelum mengaktifkan \\\"Masuk otomatis\\\"",
@@ -331,6 +333,7 @@
"Last name": "Nama belakang", "Last name": "Nama belakang",
"Later": "Nanti", "Later": "Nanti",
"Logging & Auditing": "Pencatatan & Audit", "Logging & Auditing": "Pencatatan & Audit",
"Login page": "Login page",
"Logo": "Logo", "Logo": "Logo",
"Logo - Tooltip": "Ikon-ikon yang disajikan aplikasi ke dunia luar", "Logo - Tooltip": "Ikon-ikon yang disajikan aplikasi ke dunia luar",
"Logo dark": "Logo gelap", "Logo dark": "Logo gelap",
@@ -443,6 +446,7 @@
"Sync": "Sinkronisasi", "Sync": "Sinkronisasi",
"Syncers": "Sinkronisasi", "Syncers": "Sinkronisasi",
"System Info": "Informasi Sistem", "System Info": "Informasi Sistem",
"Tab": "Tab",
"There was a problem signing you in..": "Ada masalah saat masuk...", "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!", "This is a read-only demo site!": "Ini adalah situs demo hanya untuk dibaca saja!",
"Timestamp": "Stempel waktu", "Timestamp": "Stempel waktu",
@@ -575,6 +579,7 @@
"Please type an organization to sign in": "Silakan ketik organisasi untuk masuk", "Please type an organization to sign in": "Silakan ketik organisasi untuk masuk",
"Redirecting, please wait.": "Mengalihkan, harap tunggu.", "Redirecting, please wait.": "Mengalihkan, harap tunggu.",
"Refresh": "Segarkan", "Refresh": "Segarkan",
"Select organization": "Select organization",
"Sign In": "Masuk", "Sign In": "Masuk",
"Sign in with Face ID": "Masuk dengan Face ID", "Sign in with Face ID": "Masuk dengan Face ID",
"Sign in with WebAuthn": "Masuk dengan WebAuthn", "Sign in with WebAuthn": "Masuk dengan WebAuthn",

View File

@@ -92,6 +92,8 @@
"No verification": "Nessuna verifica", "No verification": "Nessuna verifica",
"Normal": "Normale", "Normal": "Normale",
"Only signup": "Solo registrazione", "Only signup": "Solo registrazione",
"Order": "Order",
"Order - Tooltip": "Order - Tooltip",
"Org choice mode": "Modalità scelta organizzazione", "Org choice mode": "Modalità scelta organizzazione",
"Org choice mode - Tooltip": "Modalità scelta organizzazione - Tooltip", "Org choice mode - Tooltip": "Modalità scelta organizzazione - Tooltip",
"Please enable \\\"Signin session\\\" first before enabling \\\"Auto signin\\\"": "Abilita prima \\\"Sessione di accesso\\\" prima di abilitare \\\"Accesso automatico\\\"", "Please enable \\\"Signin session\\\" first before enabling \\\"Auto signin\\\"": "Abilita prima \\\"Sessione di accesso\\\" prima di abilitare \\\"Accesso automatico\\\"",
@@ -331,6 +333,7 @@
"Last name": "Cognome", "Last name": "Cognome",
"Later": "Più tardi", "Later": "Più tardi",
"Logging & Auditing": "Registrazione e audit", "Logging & Auditing": "Registrazione e audit",
"Login page": "Login page",
"Logo": "Logo", "Logo": "Logo",
"Logo - Tooltip": "Icone che l'applicazione presenta all'esterno", "Logo - Tooltip": "Icone che l'applicazione presenta all'esterno",
"Logo dark": "Logo scuro", "Logo dark": "Logo scuro",
@@ -443,6 +446,7 @@
"Sync": "Sincronizza", "Sync": "Sincronizza",
"Syncers": "Syncers", "Syncers": "Syncers",
"System Info": "Informazioni di sistema", "System Info": "Informazioni di sistema",
"Tab": "Tab",
"There was a problem signing you in..": "C'è stato un problema nell'accesso...", "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!", "This is a read-only demo site!": "Questo è un sito demo in sola lettura!",
"Timestamp": "Timestamp", "Timestamp": "Timestamp",
@@ -575,6 +579,7 @@
"Please type an organization to sign in": "Digita un'organizzazione per accedere", "Please type an organization to sign in": "Digita un'organizzazione per accedere",
"Redirecting, please wait.": "Reindirizzamento in corso, attendi.", "Redirecting, please wait.": "Reindirizzamento in corso, attendi.",
"Refresh": "Aggiorna", "Refresh": "Aggiorna",
"Select organization": "Select organization",
"Sign In": "Accedi", "Sign In": "Accedi",
"Sign in with Face ID": "Accedi con Face ID", "Sign in with Face ID": "Accedi con Face ID",
"Sign in with WebAuthn": "Accedi con WebAuthn", "Sign in with WebAuthn": "Accedi con WebAuthn",

View File

@@ -92,6 +92,8 @@
"No verification": "検証なし", "No verification": "検証なし",
"Normal": "通常", "Normal": "通常",
"Only signup": "サインアップのみ", "Only signup": "サインアップのみ",
"Order": "Order",
"Order - Tooltip": "Order - Tooltip",
"Org choice mode": "組織選択モード", "Org choice mode": "組織選択モード",
"Org choice mode - Tooltip": "組織選択モード - ツールチップ", "Org choice mode - Tooltip": "組織選択モード - ツールチップ",
"Please enable \\\"Signin session\\\" first before enabling \\\"Auto signin\\\"": "\\\"自動サインイン\\\"を有効にする前に、まず\\\"サインインセッション\\\"を有効にしてください", "Please enable \\\"Signin session\\\" first before enabling \\\"Auto signin\\\"": "\\\"自動サインイン\\\"を有効にする前に、まず\\\"サインインセッション\\\"を有効にしてください",
@@ -331,6 +333,7 @@
"Last name": "苗字", "Last name": "苗字",
"Later": "後で", "Later": "後で",
"Logging & Auditing": "ログと監査", "Logging & Auditing": "ログと監査",
"Login page": "Login page",
"Logo": "ロゴ", "Logo": "ロゴ",
"Logo - Tooltip": "アプリケーションが外部世界に示すアイコン", "Logo - Tooltip": "アプリケーションが外部世界に示すアイコン",
"Logo dark": "ダークロゴ", "Logo dark": "ダークロゴ",
@@ -443,6 +446,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": "タイムスタンプ",
@@ -575,6 +579,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": "顔IDでサインイン", "Sign in with Face ID": "顔IDでサインイン",
"Sign in with WebAuthn": "WebAuthnでサインインしてください", "Sign in with WebAuthn": "WebAuthnでサインインしてください",

View File

@@ -92,6 +92,8 @@
"No verification": "Тексерусіз", "No verification": "Тексерусіз",
"Normal": "Қалыпты", "Normal": "Қалыпты",
"Only signup": "Тек тіркелу", "Only signup": "Тек тіркелу",
"Order": "Order",
"Order - Tooltip": "Order - Tooltip",
"Org choice mode": "Ұйым таңдау режимі", "Org choice mode": "Ұйым таңдау режимі",
"Org choice mode - Tooltip": "Ұйым таңдау режимі - Қысқаша түсінік", "Org choice mode - Tooltip": "Ұйым таңдау режимі - Қысқаша түсінік",
"Please enable \\\"Signin session\\\" first before enabling \\\"Auto signin\\\"": "Автоматты кіруді қосу алдында алдымен \\\"Кіру сессиясын\\\" қосыңыз", "Please enable \\\"Signin session\\\" first before enabling \\\"Auto signin\\\"": "Автоматты кіруді қосу алдында алдымен \\\"Кіру сессиясын\\\" қосыңыз",
@@ -331,6 +333,7 @@
"Last name": "Тегі", "Last name": "Тегі",
"Later": "Кейінірек", "Later": "Кейінірек",
"Logging & Auditing": "Журналдау және аудит", "Logging & Auditing": "Журналдау және аудит",
"Login page": "Login page",
"Logo": "Логотип", "Logo": "Логотип",
"Logo - Tooltip": "Қолданбаның сыртқы көріністегі белгілері", "Logo - Tooltip": "Қолданбаның сыртқы көріністегі белгілері",
"Logo dark": "Қараңғы логотип", "Logo dark": "Қараңғы логотип",
@@ -443,6 +446,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": "Уақыт мөрі",
@@ -575,6 +579,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": "Face ID арқылы кіру", "Sign in with Face ID": "Face ID арқылы кіру",
"Sign in with WebAuthn": "WebAuthn арқылы кіру", "Sign in with WebAuthn": "WebAuthn арқылы кіру",

View File

@@ -92,6 +92,8 @@
"No verification": "검증 없음", "No verification": "검증 없음",
"Normal": "일반", "Normal": "일반",
"Only signup": "가입만", "Only signup": "가입만",
"Order": "Order",
"Order - Tooltip": "Order - Tooltip",
"Org choice mode": "조직 선택 모드", "Org choice mode": "조직 선택 모드",
"Org choice mode - Tooltip": "조직 선택 모드 - 툴팁", "Org choice mode - Tooltip": "조직 선택 모드 - 툴팁",
"Please enable \\\"Signin session\\\" first before enabling \\\"Auto signin\\\"": "\\\"자동 로그인\\\"을 활성화하기 전에 \\\"로그인 세션\\\"을 먼저 활성화하세요.", "Please enable \\\"Signin session\\\" first before enabling \\\"Auto signin\\\"": "\\\"자동 로그인\\\"을 활성화하기 전에 \\\"로그인 세션\\\"을 먼저 활성화하세요.",
@@ -331,6 +333,7 @@
"Last name": "성", "Last name": "성",
"Later": "나중에", "Later": "나중에",
"Logging & Auditing": "로깅 및 감사", "Logging & Auditing": "로깅 및 감사",
"Login page": "Login page",
"Logo": "로고", "Logo": "로고",
"Logo - Tooltip": "애플리케이션이 외부 세계에 제시하는 아이콘들", "Logo - Tooltip": "애플리케이션이 외부 세계에 제시하는 아이콘들",
"Logo dark": "다크 로고", "Logo dark": "다크 로고",
@@ -443,6 +446,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": "타임스탬프",
@@ -575,6 +579,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": "얼굴 ID로 로그인", "Sign in with Face ID": "얼굴 ID로 로그인",
"Sign in with WebAuthn": "WebAuthn으로 로그인하세요", "Sign in with WebAuthn": "WebAuthn으로 로그인하세요",

View File

@@ -92,6 +92,8 @@
"No verification": "Tiada pengesahan", "No verification": "Tiada pengesahan",
"Normal": "Biasa", "Normal": "Biasa",
"Only signup": "Hanya pendaftaran", "Only signup": "Hanya pendaftaran",
"Order": "Order",
"Order - Tooltip": "Order - Tooltip",
"Org choice mode": "Mod pilihan organisasi", "Org choice mode": "Mod pilihan organisasi",
"Org choice mode - Tooltip": "Mod pilihan organisasi - Tooltip", "Org choice mode - Tooltip": "Mod pilihan organisasi - Tooltip",
"Please enable \\\"Signin session\\\" first before enabling \\\"Auto signin\\\"": "Sila dayakan \\\"Sesi log masuk\\\" terlebih dahulu sebelum mendayakan \\\"Log masuk automatik\\\"", "Please enable \\\"Signin session\\\" first before enabling \\\"Auto signin\\\"": "Sila dayakan \\\"Sesi log masuk\\\" terlebih dahulu sebelum mendayakan \\\"Log masuk automatik\\\"",
@@ -331,6 +333,7 @@
"Last name": "Nama terakhir", "Last name": "Nama terakhir",
"Later": "Kemudian", "Later": "Kemudian",
"Logging & Auditing": "Log & Audit", "Logging & Auditing": "Log & Audit",
"Login page": "Login page",
"Logo": "Logo", "Logo": "Logo",
"Logo - Tooltip": "Ikon yang aplikasi paparkan ke luar", "Logo - Tooltip": "Ikon yang aplikasi paparkan ke luar",
"Logo dark": "Logo gelap", "Logo dark": "Logo gelap",
@@ -443,6 +446,7 @@
"Sync": "Segerak", "Sync": "Segerak",
"Syncers": "Penyegerak", "Syncers": "Penyegerak",
"System Info": "Maklumat Sistem", "System Info": "Maklumat Sistem",
"Tab": "Tab",
"There was a problem signing you in..": "Terdapat masalah untuk log masuk anda..", "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!", "This is a read-only demo site!": "Ini adalah tapak demo baca sahaja!",
"Timestamp": "Cap masa", "Timestamp": "Cap masa",
@@ -575,6 +579,7 @@
"Please type an organization to sign in": "Sila taip organisasi untuk log masuk", "Please type an organization to sign in": "Sila taip organisasi untuk log masuk",
"Redirecting, please wait.": "Mengalihkan, sila tunggu.", "Redirecting, please wait.": "Mengalihkan, sila tunggu.",
"Refresh": "Segarkan", "Refresh": "Segarkan",
"Select organization": "Select organization",
"Sign In": "Log Masuk", "Sign In": "Log Masuk",
"Sign in with Face ID": "Log masuk dengan ID Wajah", "Sign in with Face ID": "Log masuk dengan ID Wajah",
"Sign in with WebAuthn": "Log masuk dengan WebAuthn", "Sign in with WebAuthn": "Log masuk dengan WebAuthn",

View File

@@ -92,6 +92,8 @@
"No verification": "Geen verificatie", "No verification": "Geen verificatie",
"Normal": "Normaal", "Normal": "Normaal",
"Only signup": "Alleen registratie", "Only signup": "Alleen registratie",
"Order": "Order",
"Order - Tooltip": "Order - Tooltip",
"Org choice mode": "Organisatiekeuzemodus", "Org choice mode": "Organisatiekeuzemodus",
"Org choice mode - Tooltip": "Organisatiekeuzemodus - Tooltip", "Org choice mode - Tooltip": "Organisatiekeuzemodus - Tooltip",
"Please enable \\\"Signin session\\\" first before enabling \\\"Auto signin\\\"": "Schakel eerst \\\"Aanmeldsessie\\\" in voordat je \\\"Automatische aanmelding\\\" inschakelt", "Please enable \\\"Signin session\\\" first before enabling \\\"Auto signin\\\"": "Schakel eerst \\\"Aanmeldsessie\\\" in voordat je \\\"Automatische aanmelding\\\" inschakelt",
@@ -331,6 +333,7 @@
"Last name": "Achternaam", "Last name": "Achternaam",
"Later": "Later", "Later": "Later",
"Logging & Auditing": "Logboekregistratie & Audit", "Logging & Auditing": "Logboekregistratie & Audit",
"Login page": "Login page",
"Logo": "Logo", "Logo": "Logo",
"Logo - Tooltip": "Pictogrammen die de applicatie naar buiten toe presenteert", "Logo - Tooltip": "Pictogrammen die de applicatie naar buiten toe presenteert",
"Logo dark": "Donker logo", "Logo dark": "Donker logo",
@@ -443,6 +446,7 @@
"Sync": "Synchroniseren", "Sync": "Synchroniseren",
"Syncers": "Synchroniseerders", "Syncers": "Synchroniseerders",
"System Info": "Systeeminfo", "System Info": "Systeeminfo",
"Tab": "Tab",
"There was a problem signing you in..": "Er was een probleem met het inloggen..", "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!", "This is a read-only demo site!": "Dit is een alleen-lezen demo-site!",
"Timestamp": "Tijdstempel", "Timestamp": "Tijdstempel",
@@ -575,6 +579,7 @@
"Please type an organization to sign in": "Typ een organisatie om in te loggen", "Please type an organization to sign in": "Typ een organisatie om in te loggen",
"Redirecting, please wait.": "Doorverwijzen, even geduld...", "Redirecting, please wait.": "Doorverwijzen, even geduld...",
"Refresh": "Vernieuwen", "Refresh": "Vernieuwen",
"Select organization": "Select organization",
"Sign In": "Inloggen", "Sign In": "Inloggen",
"Sign in with Face ID": "Inloggen met gezichtsherkenning", "Sign in with Face ID": "Inloggen met gezichtsherkenning",
"Sign in with WebAuthn": "Inloggen met WebAuthn", "Sign in with WebAuthn": "Inloggen met WebAuthn",

View File

@@ -92,6 +92,8 @@
"No verification": "Brak weryfikacji", "No verification": "Brak weryfikacji",
"Normal": "Normalny", "Normal": "Normalny",
"Only signup": "Tylko rejestracja", "Only signup": "Tylko rejestracja",
"Order": "Order",
"Order - Tooltip": "Order - Tooltip",
"Org choice mode": "Tryb wyboru organizacji", "Org choice mode": "Tryb wyboru organizacji",
"Org choice mode - Tooltip": "Tryb wyboru organizacji - Tooltip", "Org choice mode - Tooltip": "Tryb wyboru organizacji - Tooltip",
"Please enable \\\"Signin session\\\" first before enabling \\\"Auto signin\\\"": "Najpierw włącz \\\"sesję logowania\\\", zanim włączysz \\\"automatyczne logowanie\\\"", "Please enable \\\"Signin session\\\" first before enabling \\\"Auto signin\\\"": "Najpierw włącz \\\"sesję logowania\\\", zanim włączysz \\\"automatyczne logowanie\\\"",
@@ -331,6 +333,7 @@
"Last name": "Nazwisko", "Last name": "Nazwisko",
"Later": "Później", "Later": "Później",
"Logging & Auditing": "Logowanie i audyt", "Logging & Auditing": "Logowanie i audyt",
"Login page": "Login page",
"Logo": "Logo", "Logo": "Logo",
"Logo - Tooltip": "Ikony, które aplikacja prezentuje na zewnątrz", "Logo - Tooltip": "Ikony, które aplikacja prezentuje na zewnątrz",
"Logo dark": "Ciemne logo", "Logo dark": "Ciemne logo",
@@ -443,6 +446,7 @@
"Sync": "Synchronizuj", "Sync": "Synchronizuj",
"Syncers": "Synchronizatory", "Syncers": "Synchronizatory",
"System Info": "Informacje o systemie", "System Info": "Informacje o systemie",
"Tab": "Tab",
"There was a problem signing you in..": "Wystąpił problem podczas logowania..", "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!", "This is a read-only demo site!": "To jest tylko demonstracyjna strona tylko do odczytu!",
"Timestamp": "Znacznik czasu", "Timestamp": "Znacznik czasu",
@@ -575,6 +579,7 @@
"Please type an organization to sign in": "Wpisz nazwę organizacji, aby się zalogować", "Please type an organization to sign in": "Wpisz nazwę organizacji, aby się zalogować",
"Redirecting, please wait.": "Przekierowywanie, proszę czekać.", "Redirecting, please wait.": "Przekierowywanie, proszę czekać.",
"Refresh": "Odśwież", "Refresh": "Odśwież",
"Select organization": "Select organization",
"Sign In": "Zaloguj się", "Sign In": "Zaloguj się",
"Sign in with Face ID": "Zaloguj się za pomocą Face ID", "Sign in with Face ID": "Zaloguj się za pomocą Face ID",
"Sign in with WebAuthn": "Zaloguj się za pomocą WebAuthn", "Sign in with WebAuthn": "Zaloguj się za pomocą WebAuthn",

View File

@@ -92,6 +92,8 @@
"No verification": "Sem verificação", "No verification": "Sem verificação",
"Normal": "Normal", "Normal": "Normal",
"Only signup": "Apenas cadastro", "Only signup": "Apenas cadastro",
"Order": "Order",
"Order - Tooltip": "Order - Tooltip",
"Org choice mode": "Modo de escolha da organização", "Org choice mode": "Modo de escolha da organização",
"Org choice mode - Tooltip": "Dica: modo de escolha da organização", "Org choice mode - Tooltip": "Dica: modo de escolha da organização",
"Please enable \\\"Signin session\\\" first before enabling \\\"Auto signin\\\"": "Por favor, habilite a \\\"Sessão de login\\\" primeiro antes de habilitar o \\\"Login automático\\\"", "Please enable \\\"Signin session\\\" first before enabling \\\"Auto signin\\\"": "Por favor, habilite a \\\"Sessão de login\\\" primeiro antes de habilitar o \\\"Login automático\\\"",
@@ -331,6 +333,7 @@
"Last name": "Sobrenome", "Last name": "Sobrenome",
"Later": "Depois", "Later": "Depois",
"Logging & Auditing": "Registro e Auditoria", "Logging & Auditing": "Registro e Auditoria",
"Login page": "Login page",
"Logo": "Logotipo", "Logo": "Logotipo",
"Logo - Tooltip": "Ícones que o aplicativo apresenta para o mundo externo", "Logo - Tooltip": "Ícones que o aplicativo apresenta para o mundo externo",
"Logo dark": "Logo escuro", "Logo dark": "Logo escuro",
@@ -443,6 +446,7 @@
"Sync": "Sincronizar", "Sync": "Sincronizar",
"Syncers": "Sincronizadores", "Syncers": "Sincronizadores",
"System Info": "Informações do Sistema", "System Info": "Informações do Sistema",
"Tab": "Tab",
"There was a problem signing you in..": "Ocorreu um problema ao fazer login...", "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!", "This is a read-only demo site!": "Este é um site de demonstração apenas para leitura!",
"Timestamp": "Carimbo de data/hora", "Timestamp": "Carimbo de data/hora",
@@ -575,6 +579,7 @@
"Please type an organization to sign in": "Por favor, digite uma organização para entrar", "Please type an organization to sign in": "Por favor, digite uma organização para entrar",
"Redirecting, please wait.": "Redirecionando, por favor aguarde.", "Redirecting, please wait.": "Redirecionando, por favor aguarde.",
"Refresh": "Atualizar", "Refresh": "Atualizar",
"Select organization": "Select organization",
"Sign In": "Entrar", "Sign In": "Entrar",
"Sign in with Face ID": "Entrar com Face ID", "Sign in with Face ID": "Entrar com Face ID",
"Sign in with WebAuthn": "Entrar com WebAuthn", "Sign in with WebAuthn": "Entrar com WebAuthn",

View File

@@ -92,6 +92,8 @@
"No verification": "Без проверки", "No verification": "Без проверки",
"Normal": "Обычный", "Normal": "Обычный",
"Only signup": "Только регистрация", "Only signup": "Только регистрация",
"Order": "Order",
"Order - Tooltip": "Order - Tooltip",
"Org choice mode": "Режим выбора организации", "Org choice mode": "Режим выбора организации",
"Org choice mode - Tooltip": "Подсказка: режим выбора организации", "Org choice mode - Tooltip": "Подсказка: режим выбора организации",
"Please enable \\\"Signin session\\\" first before enabling \\\"Auto signin\\\"": "Пожалуйста, сначала включите «Сессия входа» перед включением «Автоматического входа»", "Please enable \\\"Signin session\\\" first before enabling \\\"Auto signin\\\"": "Пожалуйста, сначала включите «Сессия входа» перед включением «Автоматического входа»",
@@ -331,6 +333,7 @@
"Last name": "Фамилия", "Last name": "Фамилия",
"Later": "Позже", "Later": "Позже",
"Logging & Auditing": "Логирование и аудит", "Logging & Auditing": "Логирование и аудит",
"Login page": "Login page",
"Logo": "Логотип", "Logo": "Логотип",
"Logo - Tooltip": "Иконки, которые приложение представляет во внешний мир", "Logo - Tooltip": "Иконки, которые приложение представляет во внешний мир",
"Logo dark": "Темный логотип", "Logo dark": "Темный логотип",
@@ -443,6 +446,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": "Метка времени",
@@ -575,6 +579,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": "Войти с Face ID", "Sign in with Face ID": "Войти с Face ID",
"Sign in with WebAuthn": "Войти с помощью WebAuthn", "Sign in with WebAuthn": "Войти с помощью WebAuthn",

View File

@@ -92,6 +92,8 @@
"No verification": "Bez overenia", "No verification": "Bez overenia",
"Normal": "Normálny", "Normal": "Normálny",
"Only signup": "Len registrácia", "Only signup": "Len registrácia",
"Order": "Order",
"Order - Tooltip": "Order - Tooltip",
"Org choice mode": "Režim výberu organizácie", "Org choice mode": "Režim výberu organizácie",
"Org choice mode - Tooltip": "Režim výberu organizácie - Tooltip", "Org choice mode - Tooltip": "Režim výberu organizácie - Tooltip",
"Please enable \\\"Signin session\\\" first before enabling \\\"Auto signin\\\"": "Najprv povoľte \\\"Reláciu prihlásenia\\\" pred povolením \\\"Automatického prihlásenia\\\"", "Please enable \\\"Signin session\\\" first before enabling \\\"Auto signin\\\"": "Najprv povoľte \\\"Reláciu prihlásenia\\\" pred povolením \\\"Automatického prihlásenia\\\"",
@@ -331,6 +333,7 @@
"Last name": "Priezvisko", "Last name": "Priezvisko",
"Later": "Neskôr", "Later": "Neskôr",
"Logging & Auditing": "Zaznamenávanie a audit", "Logging & Auditing": "Zaznamenávanie a audit",
"Login page": "Login page",
"Logo": "Logo", "Logo": "Logo",
"Logo - Tooltip": "Ikony, ktoré aplikácia prezentuje vonkajšiemu svetu", "Logo - Tooltip": "Ikony, ktoré aplikácia prezentuje vonkajšiemu svetu",
"Logo dark": "Tmavé logo", "Logo dark": "Tmavé logo",
@@ -443,6 +446,7 @@
"Sync": "Synchronizovať", "Sync": "Synchronizovať",
"Syncers": "Synchronizátory", "Syncers": "Synchronizátory",
"System Info": "Informácie o systéme", "System Info": "Informácie o systéme",
"Tab": "Tab",
"There was a problem signing you in..": "Prihlásenie sa nepodarilo..", "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!", "This is a read-only demo site!": "Toto je stránka len na čítanie!",
"Timestamp": "Časová značka", "Timestamp": "Časová značka",
@@ -575,6 +579,7 @@
"Please type an organization to sign in": "Zadajte organizáciu na prihlásenie", "Please type an organization to sign in": "Zadajte organizáciu na prihlásenie",
"Redirecting, please wait.": "Prebieha presmerovanie, prosím čakajte.", "Redirecting, please wait.": "Prebieha presmerovanie, prosím čakajte.",
"Refresh": "Obnoviť", "Refresh": "Obnoviť",
"Select organization": "Select organization",
"Sign In": "Prihlásiť sa", "Sign In": "Prihlásiť sa",
"Sign in with Face ID": "Prihlásiť sa pomocou Face ID", "Sign in with Face ID": "Prihlásiť sa pomocou Face ID",
"Sign in with WebAuthn": "Prihlásiť sa pomocou WebAuthn", "Sign in with WebAuthn": "Prihlásiť sa pomocou WebAuthn",

View File

@@ -92,6 +92,8 @@
"No verification": "Tiada pengesahan", "No verification": "Tiada pengesahan",
"Normal": "Biasa", "Normal": "Biasa",
"Only signup": "Hanya pendaftaran", "Only signup": "Hanya pendaftaran",
"Order": "Order",
"Order - Tooltip": "Order - Tooltip",
"Org choice mode": "Mod pilihan organisasi", "Org choice mode": "Mod pilihan organisasi",
"Org choice mode - Tooltip": "Mod pilihan organisasi - Tooltip", "Org choice mode - Tooltip": "Mod pilihan organisasi - Tooltip",
"Please enable \\\"Signin session\\\" first before enabling \\\"Auto signin\\\"": "Sila dayakan \\\"Sesi log masuk\\\" terlebih dahulu sebelum mendayakan \\\"Log masuk automatik\\\"", "Please enable \\\"Signin session\\\" first before enabling \\\"Auto signin\\\"": "Sila dayakan \\\"Sesi log masuk\\\" terlebih dahulu sebelum mendayakan \\\"Log masuk automatik\\\"",
@@ -331,6 +333,7 @@
"Last name": "Nama terakhir", "Last name": "Nama terakhir",
"Later": "Kemudian", "Later": "Kemudian",
"Logging & Auditing": "Log & Audit", "Logging & Auditing": "Log & Audit",
"Login page": "Login page",
"Logo": "Logotyp", "Logo": "Logotyp",
"Logo - Tooltip": "Ikon yang aplikasi paparkan ke luar", "Logo - Tooltip": "Ikon yang aplikasi paparkan ke luar",
"Logo dark": "Logo gelap", "Logo dark": "Logo gelap",
@@ -443,6 +446,7 @@
"Sync": "Segerak", "Sync": "Segerak",
"Syncers": "Penyegerak", "Syncers": "Penyegerak",
"System Info": "Maklumat Sistem", "System Info": "Maklumat Sistem",
"Tab": "Tab",
"There was a problem signing you in..": "Terdapat masalah untuk log masuk anda..", "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!", "This is a read-only demo site!": "Ini adalah tapak demo baca sahaja!",
"Timestamp": "Cap masa", "Timestamp": "Cap masa",
@@ -575,6 +579,7 @@
"Please type an organization to sign in": "Skriv en organisation att logga in med", "Please type an organization to sign in": "Skriv en organisation att logga in med",
"Redirecting, please wait.": "Omdirigerar, vänta.", "Redirecting, please wait.": "Omdirigerar, vänta.",
"Refresh": "Uppdatera", "Refresh": "Uppdatera",
"Select organization": "Select organization",
"Sign In": "Logga in", "Sign In": "Logga in",
"Sign in with Face ID": "Logga in med Face ID", "Sign in with Face ID": "Logga in med Face ID",
"Sign in with WebAuthn": "Logga in med WebAuthn", "Sign in with WebAuthn": "Logga in med WebAuthn",

View File

@@ -92,6 +92,8 @@
"No verification": "Doğrulama yok", "No verification": "Doğrulama yok",
"Normal": "Normal", "Normal": "Normal",
"Only signup": "Yalnızca kayıt", "Only signup": "Yalnızca kayıt",
"Order": "Order",
"Order - Tooltip": "Order - Tooltip",
"Org choice mode": "Organizasyon seçim modu", "Org choice mode": "Organizasyon seçim modu",
"Org choice mode - Tooltip": "Organizasyon seçim modu - Araç ipucu", "Org choice mode - Tooltip": "Organizasyon seçim modu - Araç ipucu",
"Please enable \\\"Signin session\\\" first before enabling \\\"Auto signin\\\"": "Lütfen \\\"Oturum açma oturumu\\\"nu etkinleştirmeden önce \\\"Otomatik oturum açma\\\"yı etkinleştirin", "Please enable \\\"Signin session\\\" first before enabling \\\"Auto signin\\\"": "Lütfen \\\"Oturum açma oturumu\\\"nu etkinleştirmeden önce \\\"Otomatik oturum açma\\\"yı etkinleştirin",
@@ -331,6 +333,7 @@
"Last name": "Soyisim", "Last name": "Soyisim",
"Later": "Sonra", "Later": "Sonra",
"Logging & Auditing": "Günlük ve Denetim", "Logging & Auditing": "Günlük ve Denetim",
"Login page": "Login page",
"Logo": "Logo", "Logo": "Logo",
"Logo - Tooltip": "Uygulamanın dışarıya suntuğu simgeler", "Logo - Tooltip": "Uygulamanın dışarıya suntuğu simgeler",
"Logo dark": "Koyu logo", "Logo dark": "Koyu logo",
@@ -443,6 +446,7 @@
"Sync": "Senkronizasyon", "Sync": "Senkronizasyon",
"Syncers": "Senkronizörler", "Syncers": "Senkronizörler",
"System Info": "Sistem Bilgisi", "System Info": "Sistem Bilgisi",
"Tab": "Tab",
"There was a problem signing you in..": "Oturum açarken bir sorun oluştu...", "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!", "This is a read-only demo site!": "Bu site sadece görüntüleme amaçlıdır!",
"Timestamp": "Zaman damgası", "Timestamp": "Zaman damgası",
@@ -575,6 +579,7 @@
"Please type an organization to sign in": "Lütfen oturum açmak için bir organizasyon yazın", "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.", "Redirecting, please wait.": "Yönlendiriliyor, lütfen bekleyiniz.",
"Refresh": "Yenile", "Refresh": "Yenile",
"Select organization": "Select organization",
"Sign In": "Oturum aç", "Sign In": "Oturum aç",
"Sign in with Face ID": "Face ID ile oturum aç", "Sign in with Face ID": "Face ID ile oturum aç",
"Sign in with WebAuthn": "WebAuthn ile giriş yap", "Sign in with WebAuthn": "WebAuthn ile giriş yap",

View File

@@ -92,6 +92,8 @@
"No verification": "Без підтвердження", "No verification": "Без підтвердження",
"Normal": "нормальний", "Normal": "нормальний",
"Only signup": "Тільки реєстрація", "Only signup": "Тільки реєстрація",
"Order": "Order",
"Order - Tooltip": "Order - Tooltip",
"Org choice mode": "Режим вибору організації", "Org choice mode": "Режим вибору організації",
"Org choice mode - Tooltip": "Режим вибору організації підказка", "Org choice mode - Tooltip": "Режим вибору організації підказка",
"Please enable \\\"Signin session\\\" first before enabling \\\"Auto signin\\\"": "Спочатку увімкніть \\\"Сесію входу\\\", перш ніж увімкнути \\\"Автоматичний вхід\\\"", "Please enable \\\"Signin session\\\" first before enabling \\\"Auto signin\\\"": "Спочатку увімкніть \\\"Сесію входу\\\", перш ніж увімкнути \\\"Автоматичний вхід\\\"",
@@ -331,6 +333,7 @@
"Last name": "Прізвище", "Last name": "Прізвище",
"Later": "Пізніше", "Later": "Пізніше",
"Logging & Auditing": "Лісозаготівля", "Logging & Auditing": "Лісозаготівля",
"Login page": "Login page",
"Logo": "логотип", "Logo": "логотип",
"Logo - Tooltip": "Значки, які програма представляє зовнішньому світу", "Logo - Tooltip": "Значки, які програма представляє зовнішньому світу",
"Logo dark": "Логотип темний", "Logo dark": "Логотип темний",
@@ -443,6 +446,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": "Мітка часу",
@@ -575,6 +579,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": "Увійдіть за допомогою Face ID", "Sign in with Face ID": "Увійдіть за допомогою Face ID",
"Sign in with WebAuthn": "Увійдіть за допомогою WebAuthn", "Sign in with WebAuthn": "Увійдіть за допомогою WebAuthn",

View File

@@ -92,6 +92,8 @@
"No verification": "Không xác minh", "No verification": "Không xác minh",
"Normal": "Bình thường", "Normal": "Bình thường",
"Only signup": "Chỉ đăng ký", "Only signup": "Chỉ đăng ký",
"Order": "Order",
"Order - Tooltip": "Order - Tooltip",
"Org choice mode": "Chế độ chọn tổ chức", "Org choice mode": "Chế độ chọn tổ chức",
"Org choice mode - Tooltip": "Gợi ý chế độ chọn tổ chức", "Org choice mode - Tooltip": "Gợi ý chế độ chọn tổ chức",
"Please enable \\\"Signin session\\\" first before enabling \\\"Auto signin\\\"": "Vui lòng kích hoạt \\\"Phiên đăng nhập\\\" trước khi kích hoạt \\\"Đăng nhập tự động\\\"", "Please enable \\\"Signin session\\\" first before enabling \\\"Auto signin\\\"": "Vui lòng kích hoạt \\\"Phiên đăng nhập\\\" trước khi kích hoạt \\\"Đăng nhập tự động\\\"",
@@ -331,6 +333,7 @@
"Last name": "Họ", "Last name": "Họ",
"Later": "Để sau", "Later": "Để sau",
"Logging & Auditing": "Nhật ký & Kiểm toán", "Logging & Auditing": "Nhật ký & Kiểm toán",
"Login page": "Login page",
"Logo": "Logo", "Logo": "Logo",
"Logo - Tooltip": "Biểu tượng mà ứng dụng hiển thị ra ngoài thế giới", "Logo - Tooltip": "Biểu tượng mà ứng dụng hiển thị ra ngoài thế giới",
"Logo dark": "Logo tối", "Logo dark": "Logo tối",
@@ -443,6 +446,7 @@
"Sync": "Đồng bộ", "Sync": "Đồng bộ",
"Syncers": "Công cụ đồng bộ", "Syncers": "Công cụ đồng bộ",
"System Info": "Thông tin hệ thống", "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..", "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!", "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", "Timestamp": "Dấu thời gian",
@@ -575,6 +579,7 @@
"Please type an organization to sign in": "Vui lòng nhập tên tổ chức để đăng nhập", "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.", "Redirecting, please wait.": "Đang chuyển hướng, vui lòng đợi.",
"Refresh": "Làm mới", "Refresh": "Làm mới",
"Select organization": "Select organization",
"Sign In": "Đăng nhập", "Sign In": "Đăng nhập",
"Sign in with Face ID": "Đăng nhập bằng Face ID", "Sign in with Face ID": "Đăng nhập bằng Face ID",
"Sign in with WebAuthn": "Đăng nhập với WebAuthn", "Sign in with WebAuthn": "Đăng nhập với WebAuthn",

View File

@@ -92,6 +92,8 @@
"No verification": "不校验", "No verification": "不校验",
"Normal": "标准", "Normal": "标准",
"Only signup": "仅注册", "Only signup": "仅注册",
"Order": "Order",
"Order - Tooltip": "数值越小,在应用列表页面中排序越靠前",
"Org choice mode": "组织选择模式", "Org choice mode": "组织选择模式",
"Org choice mode - Tooltip": "采用什么方式选择要登录的组织", "Org choice mode - Tooltip": "采用什么方式选择要登录的组织",
"Please enable \\\"Signin session\\\" first before enabling \\\"Auto signin\\\"": "开启 \\\"保持登录会话\\\" 后才能开启 \\\"自动登录\\\"", "Please enable \\\"Signin session\\\" first before enabling \\\"Auto signin\\\"": "开启 \\\"保持登录会话\\\" 后才能开启 \\\"自动登录\\\"",
@@ -331,6 +333,7 @@
"Last name": "姓氏", "Last name": "姓氏",
"Later": "稍后", "Later": "稍后",
"Logging & Auditing": "日志 & 审计", "Logging & Auditing": "日志 & 审计",
"Login page": "登录页面",
"Logo": "Logo", "Logo": "Logo",
"Logo - Tooltip": "应用程序向外展示的图标", "Logo - Tooltip": "应用程序向外展示的图标",
"Logo dark": "暗黑logo", "Logo dark": "暗黑logo",
@@ -443,6 +446,7 @@
"Sync": "同步", "Sync": "同步",
"Syncers": "同步器", "Syncers": "同步器",
"System Info": "系统信息", "System Info": "系统信息",
"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": "时间",
@@ -575,6 +579,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": "选择组织",
"Sign In": "登录", "Sign In": "登录",
"Sign in with Face ID": "人脸登录", "Sign in with Face ID": "人脸登录",
"Sign in with WebAuthn": "WebAuthn登录", "Sign in with WebAuthn": "WebAuthn登录",

View File

@@ -67,6 +67,8 @@ class AccountTable extends React.Component {
{name: "ID", label: i18next.t("general:ID")}, {name: "ID", label: i18next.t("general:ID")},
{name: "Name", label: i18next.t("general:Name")}, {name: "Name", label: i18next.t("general:Name")},
{name: "Display name", label: i18next.t("general:Display 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: "Avatar", label: i18next.t("general:Avatar")},
{name: "User type", label: i18next.t("general:User type")}, {name: "User type", label: i18next.t("general:User type")},
{name: "Password", label: i18next.t("general:Password")}, {name: "Password", label: i18next.t("general:Password")},

View File

@@ -96,6 +96,8 @@ class SigninMethodTable extends React.Component {
this.updateField(table, index, "displayName", value); this.updateField(table, index, "displayName", value);
if (value === "Verification code" || value === "Password") { if (value === "Verification code" || value === "Password") {
this.updateField(table, index, "rule", "All"); this.updateField(table, index, "rule", "All");
} else if (value === "WeChat") {
this.updateField(table, index, "rule", "Tab");
} else { } else {
this.updateField(table, index, "rule", "None"); 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: "Non-LDAP", name: i18next.t("general:Non-LDAP")},
{id: "Hide password", name: i18next.t("general:Hide password")}, {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) { 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: "Signup link", displayName: i18next.t("general:Signup link")},
{name: "Captcha", displayName: i18next.t("general:Captcha")}, {name: "Captcha", displayName: i18next.t("general:Captcha")},
{name: "Auto sign in", displayName: i18next.t("login:Auto sign in")}, {name: "Auto sign in", displayName: i18next.t("login:Auto sign in")},
{name: "Select organization", displayName: i18next.t("login:Select organization")},
]; ];
const getItemDisplayName = (text) => { const getItemDisplayName = (text) => {

View File

@@ -94,6 +94,8 @@ class SignupTable extends React.Component {
{name: "Username", displayName: i18next.t("signup:Username")}, {name: "Username", displayName: i18next.t("signup:Username")},
{name: "ID", displayName: i18next.t("general:ID")}, {name: "ID", displayName: i18next.t("general:ID")},
{name: "Display name", displayName: i18next.t("general:Display name")}, {name: "Display name", displayName: i18next.t("general:Display name")},
{name: "First name", displayName: i18next.t("general:First name")},
{name: "Last name", displayName: i18next.t("general:Last name")},
{name: "Affiliation", displayName: i18next.t("user:Affiliation")}, {name: "Affiliation", displayName: i18next.t("user:Affiliation")},
{name: "Gender", displayName: i18next.t("user:Gender")}, {name: "Gender", displayName: i18next.t("user:Gender")},
{name: "Bio", displayName: i18next.t("user:Bio")}, {name: "Bio", displayName: i18next.t("user:Bio")},

View File

@@ -156,6 +156,11 @@
"@0xsequence/transactions" "^0.43.34" "@0xsequence/transactions" "^0.43.34"
"@0xsequence/utils" "^0.43.34" "@0xsequence/utils" "^0.43.34"
"@adraffy/ens-normalize@1.10.0":
version "1.10.0"
resolved "https://registry.yarnpkg.com/@adraffy/ens-normalize/-/ens-normalize-1.10.0.tgz#d2a39395c587e092d77cbbc80acf956a54f38bf7"
integrity sha512-nA9XHtlAkYfJxY7bce8DcN7eKxWWCWkU+1GR9d+U6MbNpfwQp8TI7vqOsBsMcHoT4mBu2kypKoSKnghEzOOq5Q==
"@alloc/quick-lru@^5.2.0": "@alloc/quick-lru@^5.2.0":
version "5.2.0" version "5.2.0"
resolved "https://registry.yarnpkg.com/@alloc/quick-lru/-/quick-lru-5.2.0.tgz#7bf68b20c0a350f936915fcae06f58e32007ce30" resolved "https://registry.yarnpkg.com/@alloc/quick-lru/-/quick-lru-5.2.0.tgz#7bf68b20c0a350f936915fcae06f58e32007ce30"
@@ -3924,11 +3929,28 @@
dependencies: dependencies:
"@noble/hashes" "1.3.1" "@noble/hashes" "1.3.1"
"@noble/curves@1.2.0", "@noble/curves@~1.2.0":
version "1.2.0"
resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.2.0.tgz#92d7e12e4e49b23105a2555c6984d41733d65c35"
integrity sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==
dependencies:
"@noble/hashes" "1.3.2"
"@noble/hashes@1.3.1", "@noble/hashes@^1.3.0", "@noble/hashes@~1.3.0", "@noble/hashes@~1.3.1": "@noble/hashes@1.3.1", "@noble/hashes@^1.3.0", "@noble/hashes@~1.3.0", "@noble/hashes@~1.3.1":
version "1.3.1" version "1.3.1"
resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.3.1.tgz#8831ef002114670c603c458ab8b11328406953a9" resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.3.1.tgz#8831ef002114670c603c458ab8b11328406953a9"
integrity sha512-EbqwksQwz9xDRGfDST86whPBgM65E0OH/pCgqW0GBVzO22bNE+NuIbeTb714+IfSjU3aRk47EUvXIb5bTsenKA== integrity sha512-EbqwksQwz9xDRGfDST86whPBgM65E0OH/pCgqW0GBVzO22bNE+NuIbeTb714+IfSjU3aRk47EUvXIb5bTsenKA==
"@noble/hashes@1.3.2":
version "1.3.2"
resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.3.2.tgz#6f26dbc8fbc7205873ce3cee2f690eba0d421b39"
integrity sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==
"@noble/hashes@~1.3.2":
version "1.3.3"
resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.3.3.tgz#39908da56a4adc270147bb07968bf3b16cfe1699"
integrity sha512-V7/fPHgl+jsVPXqqeOzT8egNj2iBIVt+ECeMMG8TdcnTikP3oaBtUVqpT/gYCR68aEBJSF+XbYUxStjbFMqIIA==
"@nodelib/fs.scandir@2.1.5": "@nodelib/fs.scandir@2.1.5":
version "2.1.5" version "2.1.5"
resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5"
@@ -4182,6 +4204,11 @@
resolved "https://registry.yarnpkg.com/@scure/base/-/base-1.1.1.tgz#ebb651ee52ff84f420097055f4bf46cfba403938" resolved "https://registry.yarnpkg.com/@scure/base/-/base-1.1.1.tgz#ebb651ee52ff84f420097055f4bf46cfba403938"
integrity sha512-ZxOhsSyxYwLJj3pLZCefNitxsj093tb2vq90mp2txoYeBqbcjDjqFhyM8eUjq/uFm6zJ+mUuqxlS2FkuSY1MTA== integrity sha512-ZxOhsSyxYwLJj3pLZCefNitxsj093tb2vq90mp2txoYeBqbcjDjqFhyM8eUjq/uFm6zJ+mUuqxlS2FkuSY1MTA==
"@scure/base@~1.1.2":
version "1.1.9"
resolved "https://registry.yarnpkg.com/@scure/base/-/base-1.1.9.tgz#e5e142fbbfe251091f9c5f1dd4c834ac04c3dbd1"
integrity sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg==
"@scure/bip32@1.3.1": "@scure/bip32@1.3.1":
version "1.3.1" version "1.3.1"
resolved "https://registry.yarnpkg.com/@scure/bip32/-/bip32-1.3.1.tgz#7248aea723667f98160f593d621c47e208ccbb10" resolved "https://registry.yarnpkg.com/@scure/bip32/-/bip32-1.3.1.tgz#7248aea723667f98160f593d621c47e208ccbb10"
@@ -4191,6 +4218,15 @@
"@noble/hashes" "~1.3.1" "@noble/hashes" "~1.3.1"
"@scure/base" "~1.1.0" "@scure/base" "~1.1.0"
"@scure/bip32@1.3.2":
version "1.3.2"
resolved "https://registry.yarnpkg.com/@scure/bip32/-/bip32-1.3.2.tgz#90e78c027d5e30f0b22c1f8d50ff12f3fb7559f8"
integrity sha512-N1ZhksgwD3OBlwTv3R6KFEcPojl/W4ElJOeCZdi+vuI5QmTFwLq3OFf2zd2ROpKvxFdgZ6hUpb0dx9bVNEwYCA==
dependencies:
"@noble/curves" "~1.2.0"
"@noble/hashes" "~1.3.2"
"@scure/base" "~1.1.2"
"@scure/bip39@1.2.1": "@scure/bip39@1.2.1":
version "1.2.1" version "1.2.1"
resolved "https://registry.yarnpkg.com/@scure/bip39/-/bip39-1.2.1.tgz#5cee8978656b272a917b7871c981e0541ad6ac2a" resolved "https://registry.yarnpkg.com/@scure/bip39/-/bip39-1.2.1.tgz#5cee8978656b272a917b7871c981e0541ad6ac2a"
@@ -5319,6 +5355,14 @@
ethers "5.5.4" ethers "5.5.4"
joi "17.9.1" joi "17.9.1"
"@web3-onboard/common@^2.4.1":
version "2.4.2"
resolved "https://registry.yarnpkg.com/@web3-onboard/common/-/common-2.4.2.tgz#ffa7b1a7cb6410d9cc4d7b38d50b97a857b334cb"
integrity sha512-3+zkBru5W2jBYFBPPQsnqZ7tuN1GUyM5PzD9/MmhvjCLNhmjFtMQ0MkLzG4Yshodb4UW/DmZpjUVrpjdhEhj/Q==
dependencies:
joi "17.9.1"
viem "2.12.0"
"@web3-onboard/core@^2.20.5": "@web3-onboard/core@^2.20.5":
version "2.20.5" version "2.20.5"
resolved "https://registry.yarnpkg.com/@web3-onboard/core/-/core-2.20.5.tgz#78bf125d0ffea38642046a383bfb869c66b49457" resolved "https://registry.yarnpkg.com/@web3-onboard/core/-/core-2.20.5.tgz#78bf125d0ffea38642046a383bfb869c66b49457"
@@ -5370,6 +5414,13 @@
joi "17.9.1" joi "17.9.1"
lodash.uniqby "^4.7.0" lodash.uniqby "^4.7.0"
"@web3-onboard/phantom@^2.1.1":
version "2.1.1"
resolved "https://registry.yarnpkg.com/@web3-onboard/phantom/-/phantom-2.1.1.tgz#c7274c065a2134a2e27a8ed7ea8c4d74e665cd63"
integrity sha512-OXDeUpqrZK7zi8CSgCZXlEzppo9mCGm/e3ksQUiffud1ug5lvj+FtuNr1hJBuuIJQ4QnT2zCbM2PZkLOcnETBg==
dependencies:
"@web3-onboard/common" "^2.4.1"
"@web3-onboard/react@^2.8.10": "@web3-onboard/react@^2.8.10":
version "2.8.10" version "2.8.10"
resolved "https://registry.yarnpkg.com/@web3-onboard/react/-/react-2.8.10.tgz#05ee27a95efa3243b8674fb15efab4614900880f" resolved "https://registry.yarnpkg.com/@web3-onboard/react/-/react-2.8.10.tgz#05ee27a95efa3243b8674fb15efab4614900880f"
@@ -5559,6 +5610,11 @@ abab@^2.0.3, abab@^2.0.5:
resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.6.tgz#41b80f2c871d19686216b82309231cfd3cb3d291" resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.6.tgz#41b80f2c871d19686216b82309231cfd3cb3d291"
integrity sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA== integrity sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==
abitype@1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/abitype/-/abitype-1.0.0.tgz#237176dace81d90d018bebf3a45cb42f2a2d9e97"
integrity sha512-NMeMah//6bJ56H5XRj8QCV4AwuW6hB6zqz2LnhhLdcWVQOsXki6/Pn3APeqxCma62nXIcmZWdu1DlHWS74umVQ==
accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.8: accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.8:
version "1.3.8" version "1.3.8"
resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e"
@@ -10095,6 +10151,11 @@ isomorphic-ws@^4.0.1:
resolved "https://registry.yarnpkg.com/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz#55fd4cd6c5e6491e76dc125938dd863f5cd4f2dc" resolved "https://registry.yarnpkg.com/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz#55fd4cd6c5e6491e76dc125938dd863f5cd4f2dc"
integrity sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w== integrity sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==
isows@1.0.4:
version "1.0.4"
resolved "https://registry.yarnpkg.com/isows/-/isows-1.0.4.tgz#810cd0d90cc4995c26395d2aa4cfa4037ebdf061"
integrity sha512-hEzjY+x9u9hPmBom9IIAqdJCwNLax+xrPb51vEPpERoFlIxgmZcHzsT5jKG06nvInKOBGvReAVz80Umed5CczQ==
isstream@~0.1.2: isstream@~0.1.2:
version "0.1.2" version "0.1.2"
resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a"
@@ -15432,6 +15493,20 @@ verror@1.10.0:
core-util-is "1.0.2" core-util-is "1.0.2"
extsprintf "^1.2.0" extsprintf "^1.2.0"
viem@2.12.0:
version "2.12.0"
resolved "https://registry.yarnpkg.com/viem/-/viem-2.12.0.tgz#699ba326a1ce0df81042dc8b6f22fa751f9cefce"
integrity sha512-XBvORspE4x2/gfy7idH6IVFwkJiXirygFCU3lxUH6fttsj8zufLtgiokfvZF/LAZUEDvdxSgL08whSYgffM2fw==
dependencies:
"@adraffy/ens-normalize" "1.10.0"
"@noble/curves" "1.2.0"
"@noble/hashes" "1.3.2"
"@scure/bip32" "1.3.2"
"@scure/bip39" "1.2.1"
abitype "1.0.0"
isows "1.0.4"
ws "8.13.0"
void-elements@3.1.0: void-elements@3.1.0:
version "3.1.0" version "3.1.0"
resolved "https://registry.yarnpkg.com/void-elements/-/void-elements-3.1.0.tgz#614f7fbf8d801f0bb5f0661f5b2f5785750e4f09" resolved "https://registry.yarnpkg.com/void-elements/-/void-elements-3.1.0.tgz#614f7fbf8d801f0bb5f0661f5b2f5785750e4f09"
@@ -15961,16 +16036,16 @@ ws@7.4.6:
resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.6.tgz#5654ca8ecdeee47c33a9a4bf6d28e2be2980377c" resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.6.tgz#5654ca8ecdeee47c33a9a4bf6d28e2be2980377c"
integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A== integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==
ws@8.13.0, ws@^8.13.0, ws@^8.5.0:
version "8.13.0"
resolved "https://registry.yarnpkg.com/ws/-/ws-8.13.0.tgz#9a9fb92f93cf41512a0735c8f4dd09b8a1211cd0"
integrity sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==
ws@^7.4.5, ws@^7.4.6: ws@^7.4.5, ws@^7.4.6:
version "7.5.9" version "7.5.9"
resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591" resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591"
integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==
ws@^8.13.0, ws@^8.5.0:
version "8.13.0"
resolved "https://registry.yarnpkg.com/ws/-/ws-8.13.0.tgz#9a9fb92f93cf41512a0735c8f4dd09b8a1211cd0"
integrity sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==
xml-name-validator@^3.0.0: xml-name-validator@^3.0.0:
version "3.0.0" version "3.0.0"
resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a"