Compare commits

...

21 Commits

Author SHA1 Message Date
e755a7331d Fix renderLink() 2024-02-14 09:45:21 +08:00
6d9d595f86 fix: Revert "fix: fix display bug in SigninTable" (#2700)
This reverts commit d52058d2ae.
2024-02-14 09:44:42 +08:00
d52058d2ae fix: fix display bug in SigninTable (#2698)
* fix: fix display bug in SigninTable

* fix: fix code bug

* feat: improve code format

* feat: improve code format
2024-02-14 09:26:51 +08:00
bcfbfc6947 Support "signinUrl" in forget page 2024-02-14 02:36:52 +08:00
75699c4a26 feat: improve code in getObject() 2024-02-13 23:50:21 +08:00
3e8bfb52a8 feat: add signin items table (#2695)
* feat: add signin items table

* fix:unable to login

* feat: improve code format

* fix: fix display err on signup link

* feat: improve display of sign up link
2024-02-13 23:12:40 +08:00
bbbd857a45 fix: fix bug that failed to run initApi adapter in docker (#2696) 2024-02-13 23:12:25 +08:00
498900df76 feat: allow dot in the username (like john.smith) (#2692) 2024-02-12 20:52:17 +08:00
7e3c1a6581 fix: improve goth code (#2693)
Signed-off-by: Dmitrii Aleksandrov <goodmobiledevices@gmail.com>
2024-02-12 20:51:58 +08:00
6e28043dba refactor: New Crowdin translations (#2648)
* refactor: New Crowdin translations by Github Action

* refactor: New Crowdin Backend translations by Github Action

---------

Co-authored-by: Crowdin Bot <support+bot@crowdin.com>
2024-02-12 18:54:31 +08:00
cb200687dc feat: fix GetUserByUserId() API crash issue 2024-02-12 18:51:55 +08:00
23bb0ee450 feat: fix error handling in AdfsIdProvider (#2687) 2024-02-10 15:38:38 +08:00
117259dfc5 ci: fix repo name in CI 2024-02-10 15:38:17 +08:00
e71d0476f0 feat: support data initialization for groups, adapters, enforcers, plans and pricings (#2685) 2024-02-08 20:46:40 +08:00
b5d26767b2 docs: improve README 2024-02-08 00:02:31 +08:00
5c4e22288e feat: improve error handling and code format (#2682)
* feat: improve error process and code format

* feat: improve error process and code format
2024-02-07 20:55:33 +08:00
3ac4be64b8 fix: error msg for invalid org & app names in signup (#2679) 2024-02-07 08:53:50 +08:00
97db54b6b9 feat: full support for wechat official account login (#2677)
* feat: full support for wechat official account login

* feat: improve provider edit page

* fix: improve i18n format
2024-02-07 00:00:10 +08:00
3a19d4c7c8 fix: do not filter webhooks by org 2024-02-06 20:33:11 +08:00
a60be2b2ab feat: refactor MFA code and fix no-session bug (#2676)
* refactor: refactor mfa

* refactor: refactor mfa

* refactor: refactor mfa

* lint

* chore: reduce wait time
2024-02-06 20:17:59 +08:00
06ef97a080 feat: can delete the whole SigninMethodTable 2024-02-06 16:43:16 +08:00
65 changed files with 1565 additions and 430 deletions

View File

@ -127,7 +127,7 @@ jobs:
release-and-push: release-and-push:
name: Release And Push name: Release And Push
runs-on: ubuntu-latest runs-on: ubuntu-latest
if: github.repository == 'casbin/casdoor' && github.event_name == 'push' if: github.repository == 'casdoor/casdoor' && github.event_name == 'push'
needs: [ frontend, backend, linter, e2e ] needs: [ frontend, backend, linter, e2e ]
steps: steps:
- name: Checkout - name: Checkout
@ -182,14 +182,14 @@ jobs:
- name: Log in to Docker Hub - name: Log in to Docker Hub
uses: docker/login-action@v1 uses: docker/login-action@v1
if: github.repository == 'casbin/casdoor' && github.event_name == 'push' && steps.should_push.outputs.push=='true' if: github.repository == 'casdoor/casdoor' && github.event_name == 'push' && steps.should_push.outputs.push=='true'
with: with:
username: ${{ secrets.DOCKERHUB_USERNAME }} username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_PASSWORD }} password: ${{ secrets.DOCKERHUB_PASSWORD }}
- name: Push to Docker Hub - name: Push to Docker Hub
uses: docker/build-push-action@v3 uses: docker/build-push-action@v3
if: github.repository == 'casbin/casdoor' && github.event_name == 'push' && steps.should_push.outputs.push=='true' if: github.repository == 'casdoor/casdoor' && github.event_name == 'push' && steps.should_push.outputs.push=='true'
with: with:
context: . context: .
target: STANDARD target: STANDARD
@ -199,7 +199,7 @@ jobs:
- name: Push All In One Version to Docker Hub - name: Push All In One Version to Docker Hub
uses: docker/build-push-action@v3 uses: docker/build-push-action@v3
if: github.repository == 'casbin/casdoor' && github.event_name == 'push' && steps.should_push.outputs.push=='true' if: github.repository == 'casdoor/casdoor' && github.event_name == 'push' && steps.should_push.outputs.push=='true'
with: with:
context: . context: .
target: ALLINONE target: ALLINONE

View File

@ -7,7 +7,7 @@ on:
jobs: jobs:
synchronize-with-crowdin: synchronize-with-crowdin:
runs-on: ubuntu-latest runs-on: ubuntu-latest
if: github.repository == 'casbin/casdoor' && github.event_name == 'push' if: github.repository == 'casdoor/casdoor' && github.event_name == 'push'
steps: steps:
- name: Checkout - name: Checkout

View File

@ -87,8 +87,7 @@ https://casdoor.org/docs/category/integrations
## How to contact? ## How to contact?
- Discord: https://discord.gg/5rPsrAzK7S - Discord: https://discord.gg/5rPsrAzK7S
- Forum: https://forum.casbin.com - Contact: https://casdoor.org/help
- Contact: https://tawk.to/chat/623352fea34c2456412b8c51/1fuc7od6e
## Contribute ## Contribute

View File

@ -71,7 +71,10 @@ func GetConfigInt64(key string) (int64, error) {
func GetConfigDataSourceName() string { func GetConfigDataSourceName() string {
dataSourceName := GetConfigString("dataSourceName") dataSourceName := GetConfigString("dataSourceName")
return ReplaceDataSourceNameByDocker(dataSourceName)
}
func ReplaceDataSourceNameByDocker(dataSourceName string) string {
runningInDocker := os.Getenv("RUNNING_IN_DOCKER") runningInDocker := os.Getenv("RUNNING_IN_DOCKER")
if runningInDocker == "true" { if runningInDocker == "true" {
// https://stackoverflow.com/questions/48546124/what-is-linux-equivalent-of-host-docker-internal // https://stackoverflow.com/questions/48546124/what-is-linux-equivalent-of-host-docker-internal
@ -81,7 +84,6 @@ func GetConfigDataSourceName() string {
dataSourceName = strings.ReplaceAll(dataSourceName, "localhost", "host.docker.internal") dataSourceName = strings.ReplaceAll(dataSourceName, "localhost", "host.docker.internal")
} }
} }
return dataSourceName return dataSourceName
} }
@ -108,13 +110,3 @@ func GetConfigBatchSize() int {
} }
return res return res
} }
func GetConfigRealDataSourceName(driverName string) string {
var dataSourceName string
if driverName != "mysql" {
dataSourceName = GetConfigDataSourceName()
} else {
dataSourceName = GetConfigDataSourceName() + GetConfigString("dbName")
}
return dataSourceName
}

View File

@ -94,7 +94,7 @@ func (c *ApiController) Signup() {
return return
} }
if application == nil { if application == nil {
c.ResponseError(fmt.Sprintf(c.T("auth:The application: %s does not exist")), authForm.Application) c.ResponseError(fmt.Sprintf(c.T("auth:The application: %s does not exist"), authForm.Application))
return return
} }
@ -110,7 +110,7 @@ func (c *ApiController) Signup() {
} }
if organization == nil { if organization == nil {
c.ResponseError(fmt.Sprintf(c.T("auth:The organization: %s does not exist")), authForm.Organization) c.ResponseError(fmt.Sprintf(c.T("auth:The organization: %s does not exist"), authForm.Organization))
return return
} }

View File

@ -24,7 +24,6 @@ import (
"net/url" "net/url"
"strconv" "strconv"
"strings" "strings"
"sync"
"github.com/casdoor/casdoor/captcha" "github.com/casdoor/casdoor/captcha"
"github.com/casdoor/casdoor/conf" "github.com/casdoor/casdoor/conf"
@ -37,11 +36,6 @@ import (
"golang.org/x/oauth2" "golang.org/x/oauth2"
) )
var (
wechatCacheMap map[string]idp.WechatCacheMapValue
lock sync.RWMutex
)
func codeToResponse(code *object.Code) *Response { func codeToResponse(code *object.Code) *Response {
if code.Code == "" { if code.Code == "" {
return &Response{Status: "error", Msg: code.Message, Data: code.Code} return &Response{Status: "error", Msg: code.Message, Data: code.Code}
@ -896,6 +890,7 @@ func (c *ApiController) GetSamlLogin() {
authURL, method, err := object.GenerateSamlRequest(providerId, relayState, c.Ctx.Request.Host, c.GetAcceptLanguage()) authURL, method, err := object.GenerateSamlRequest(providerId, relayState, c.Ctx.Request.Host, c.GetAcceptLanguage())
if err != nil { if err != nil {
c.ResponseError(err.Error()) c.ResponseError(err.Error())
return
} }
c.ResponseOk(authURL, method) c.ResponseOk(authURL, method)
} }
@ -906,6 +901,7 @@ func (c *ApiController) HandleSamlLogin() {
decode, err := base64.StdEncoding.DecodeString(relayState) decode, err := base64.StdEncoding.DecodeString(relayState)
if err != nil { if err != nil {
c.ResponseError(err.Error()) c.ResponseError(err.Error())
return
} }
slice := strings.Split(string(decode), "&") slice := strings.Split(string(decode), "&")
relayState = url.QueryEscape(relayState) relayState = url.QueryEscape(relayState)
@ -972,15 +968,15 @@ func (c *ApiController) HandleOfficialAccountEvent() {
return return
} }
lock.Lock() idp.Lock.Lock()
if wechatCacheMap == nil { if idp.WechatCacheMap == nil {
wechatCacheMap = make(map[string]idp.WechatCacheMapValue) idp.WechatCacheMap = make(map[string]idp.WechatCacheMapValue)
} }
wechatCacheMap[data.Ticket] = idp.WechatCacheMapValue{ idp.WechatCacheMap[data.Ticket] = idp.WechatCacheMapValue{
IsScanned: true, IsScanned: true,
WechatOpenId: data.FromUserName, WechatUnionId: data.FromUserName,
} }
lock.Unlock() idp.Lock.Unlock()
c.Ctx.WriteString("") c.Ctx.WriteString("")
} }
@ -994,18 +990,15 @@ func (c *ApiController) HandleOfficialAccountEvent() {
func (c *ApiController) GetWebhookEventType() { func (c *ApiController) GetWebhookEventType() {
ticket := c.Input().Get("ticket") ticket := c.Input().Get("ticket")
lock.RLock() idp.Lock.RLock()
wechatMsg, ok := wechatCacheMap[ticket] _, ok := idp.WechatCacheMap[ticket]
lock.RUnlock() idp.Lock.RUnlock()
if !ok { if !ok {
c.ResponseError("ticket not found") c.ResponseError("ticket not found")
return return
} }
lock.Lock()
delete(wechatCacheMap, ticket)
lock.Unlock()
c.ResponseOk("SCAN", wechatMsg.IsScanned) c.ResponseOk("SCAN", ticket)
} }
// GetQRCode // GetQRCode

View File

@ -19,6 +19,14 @@ import (
"github.com/casdoor/casdoor/object" "github.com/casdoor/casdoor/object"
"github.com/casdoor/casdoor/util" "github.com/casdoor/casdoor/util"
"github.com/google/uuid"
)
const (
MfaRecoveryCodesSession = "mfa_recovery_codes"
MfaCountryCodeSession = "mfa_country_code"
MfaDestSession = "mfa_dest"
MfaTotpSecretSession = "mfa_totp_secret"
) )
// MfaSetupInitiate // MfaSetupInitiate
@ -57,12 +65,20 @@ func (c *ApiController) MfaSetupInitiate() {
return return
} }
mfaProps, err := MfaUtil.Initiate(c.Ctx, user.GetId()) mfaProps, err := MfaUtil.Initiate(user.GetId())
if err != nil { if err != nil {
c.ResponseError(err.Error()) c.ResponseError(err.Error())
return return
} }
recoveryCode := uuid.NewString()
c.SetSession(MfaRecoveryCodesSession, recoveryCode)
if mfaType == object.TotpType {
c.SetSession(MfaTotpSecretSession, mfaProps.Secret)
}
mfaProps.RecoveryCodes = []string{recoveryCode}
resp := mfaProps resp := mfaProps
c.ResponseOk(resp) c.ResponseOk(resp)
} }
@ -83,13 +99,39 @@ func (c *ApiController) MfaSetupVerify() {
c.ResponseError("missing auth type or passcode") c.ResponseError("missing auth type or passcode")
return return
} }
mfaUtil := object.GetMfaUtil(mfaType, nil)
config := &object.MfaProps{
MfaType: mfaType,
}
if mfaType == object.TotpType {
secret := c.GetSession(MfaTotpSecretSession)
if secret == nil {
c.ResponseError("totp secret is missing")
return
}
config.Secret = secret.(string)
} else if mfaType == object.EmailType || mfaType == object.SmsType {
dest := c.GetSession(MfaDestSession)
if dest == nil {
c.ResponseError("destination is missing")
return
}
config.Secret = dest.(string)
countryCode := c.GetSession(MfaCountryCodeSession)
if countryCode == nil {
c.ResponseError("country code is missing")
return
}
config.CountryCode = countryCode.(string)
}
mfaUtil := object.GetMfaUtil(mfaType, config)
if mfaUtil == nil { if mfaUtil == nil {
c.ResponseError("Invalid multi-factor authentication type") c.ResponseError("Invalid multi-factor authentication type")
return return
} }
err := mfaUtil.SetupVerify(c.Ctx, passcode) err := mfaUtil.SetupVerify(passcode)
if err != nil { if err != nil {
c.ResponseError(err.Error()) c.ResponseError(err.Error())
} else { } else {
@ -122,18 +164,58 @@ func (c *ApiController) MfaSetupEnable() {
return return
} }
mfaUtil := object.GetMfaUtil(mfaType, nil) config := &object.MfaProps{
MfaType: mfaType,
}
if mfaType == object.TotpType {
secret := c.GetSession(MfaTotpSecretSession)
if secret == nil {
c.ResponseError("totp secret is missing")
return
}
config.Secret = secret.(string)
} else if mfaType == object.EmailType || mfaType == object.SmsType {
dest := c.GetSession(MfaDestSession)
if dest == nil {
c.ResponseError("destination is missing")
return
}
config.Secret = dest.(string)
countryCode := c.GetSession(MfaCountryCodeSession)
if countryCode == nil {
c.ResponseError("country code is missing")
return
}
config.CountryCode = countryCode.(string)
}
recoveryCodes := c.GetSession(MfaRecoveryCodesSession)
if recoveryCodes == nil {
c.ResponseError("recovery codes is missing")
return
}
config.RecoveryCodes = []string{recoveryCodes.(string)}
mfaUtil := object.GetMfaUtil(mfaType, config)
if mfaUtil == nil { if mfaUtil == nil {
c.ResponseError("Invalid multi-factor authentication type") c.ResponseError("Invalid multi-factor authentication type")
return return
} }
err = mfaUtil.Enable(c.Ctx, user) err = mfaUtil.Enable(user)
if err != nil { if err != nil {
c.ResponseError(err.Error()) c.ResponseError(err.Error())
return return
} }
c.DelSession(MfaRecoveryCodesSession)
if mfaType == object.TotpType {
c.DelSession(MfaTotpSecretSession)
} else {
c.DelSession(MfaCountryCodeSession)
c.DelSession(MfaDestSession)
}
c.ResponseOk(http.StatusText(http.StatusOK)) c.ResponseOk(http.StatusText(http.StatusOK))
} }

View File

@ -156,6 +156,10 @@ func (c *ApiController) GetUser() {
c.ResponseError(err.Error()) c.ResponseError(err.Error())
return return
} }
if userFromUserId == nil {
c.ResponseOk(nil)
return
}
id = util.GetId(userFromUserId.Owner, userFromUserId.Name) id = util.GetId(userFromUserId.Owner, userFromUserId.Name)
} }

View File

@ -161,7 +161,7 @@ func (c *ApiController) SendVerificationCode() {
vform.Dest = mfaProps.Secret vform.Dest = mfaProps.Secret
} }
} else if vform.Method == MfaSetupVerification { } else if vform.Method == MfaSetupVerification {
c.SetSession(object.MfaDestSession, vform.Dest) c.SetSession(MfaDestSession, vform.Dest)
} }
provider, err := application.GetEmailProvider() provider, err := application.GetEmailProvider()
@ -198,8 +198,8 @@ func (c *ApiController) SendVerificationCode() {
} }
if vform.Method == MfaSetupVerification { if vform.Method == MfaSetupVerification {
c.SetSession(object.MfaCountryCodeSession, vform.CountryCode) c.SetSession(MfaCountryCodeSession, vform.CountryCode)
c.SetSession(object.MfaDestSession, vform.Dest) c.SetSession(MfaDestSession, vform.Dest)
} }
} else if vform.Method == MfaAuthVerification { } else if vform.Method == MfaAuthVerification {
mfaProps := user.GetPreferredMfaProps(false) mfaProps := user.GetPreferredMfaProps(false)

View File

@ -38,9 +38,9 @@
"Email is invalid": "无效邮箱", "Email is invalid": "无效邮箱",
"Empty username.": "用户名不可为空", "Empty username.": "用户名不可为空",
"FirstName cannot be blank": "名不可以为空", "FirstName cannot be blank": "名不可以为空",
"Invitation code cannot be blank": "Invitation code cannot be blank", "Invitation code cannot be blank": "邀请码不能为空",
"Invitation code exhausted": "邀请码使用次数已耗尽", "Invitation code exhausted": "邀请码使用次数已耗尽",
"Invitation code is invalid": "Invitation code is invalid", "Invitation code is invalid": "邀请码无效",
"Invitation code suspended": "邀请码已被禁止使用", "Invitation code suspended": "邀请码已被禁止使用",
"LDAP user name or password incorrect": "LDAP密码错误", "LDAP user name or password incorrect": "LDAP密码错误",
"LastName cannot be blank": "姓不可以为空", "LastName cannot be blank": "姓不可以为空",

View File

@ -121,6 +121,9 @@ func (idp *AdfsIdProvider) GetUserInfo(token *oauth2.Token) (*UserInfo, error) {
return nil, err return nil, err
} }
body, err := io.ReadAll(resp.Body) body, err := io.ReadAll(resp.Body)
if err != nil {
return nil, err
}
var respKeys struct { var respKeys struct {
Keys []interface{} `json:"keys"` Keys []interface{} `json:"keys"`
} }

View File

@ -75,6 +75,7 @@ import (
"github.com/markbates/goth/providers/twitterv2" "github.com/markbates/goth/providers/twitterv2"
"github.com/markbates/goth/providers/typetalk" "github.com/markbates/goth/providers/typetalk"
"github.com/markbates/goth/providers/uber" "github.com/markbates/goth/providers/uber"
"github.com/markbates/goth/providers/vk"
"github.com/markbates/goth/providers/wepay" "github.com/markbates/goth/providers/wepay"
"github.com/markbates/goth/providers/xero" "github.com/markbates/goth/providers/xero"
"github.com/markbates/goth/providers/yahoo" "github.com/markbates/goth/providers/yahoo"
@ -371,6 +372,11 @@ func NewGothIdProvider(providerType string, clientId string, clientSecret string
Provider: uber.New(clientId, clientSecret, redirectUrl), Provider: uber.New(clientId, clientSecret, redirectUrl),
Session: &uber.Session{}, Session: &uber.Session{},
} }
case "VK":
idp = GothIdProvider{
Provider: vk.New(clientId, clientSecret, redirectUrl),
Session: &vk.Session{},
}
case "Wepay": case "Wepay":
idp = GothIdProvider{ idp = GothIdProvider{
Provider: wepay.New(clientId, clientSecret, redirectUrl), Provider: wepay.New(clientId, clientSecret, redirectUrl),

View File

@ -26,20 +26,26 @@ import (
"net/url" "net/url"
"sort" "sort"
"strings" "strings"
"sync"
"time" "time"
"github.com/skip2/go-qrcode" "github.com/skip2/go-qrcode"
"golang.org/x/oauth2" "golang.org/x/oauth2"
) )
var (
WechatCacheMap map[string]WechatCacheMapValue
Lock sync.RWMutex
)
type WeChatIdProvider struct { type WeChatIdProvider struct {
Client *http.Client Client *http.Client
Config *oauth2.Config Config *oauth2.Config
} }
type WechatCacheMapValue struct { type WechatCacheMapValue struct {
IsScanned bool IsScanned bool
WechatOpenId string WechatUnionId string
} }
func NewWeChatIdProvider(clientId string, clientSecret string, redirectUrl string) *WeChatIdProvider { func NewWeChatIdProvider(clientId string, clientSecret string, redirectUrl string) *WeChatIdProvider {
@ -84,6 +90,15 @@ type WechatAccessToken struct {
// GetToken use code get access_token (*operation of getting code ought to be done in front) // GetToken use code get access_token (*operation of getting code ought to be done in front)
// get more detail via: https://developers.weixin.qq.com/doc/oplatform/Website_App/WeChat_Login/Wechat_Login.html // get more detail via: https://developers.weixin.qq.com/doc/oplatform/Website_App/WeChat_Login/Wechat_Login.html
func (idp *WeChatIdProvider) GetToken(code string) (*oauth2.Token, error) { func (idp *WeChatIdProvider) GetToken(code string) (*oauth2.Token, error) {
if strings.HasPrefix(code, "wechat_oa:") {
token := oauth2.Token{
AccessToken: code,
TokenType: "WeChatAccessToken",
Expiry: time.Time{},
}
return &token, nil
}
params := url.Values{} params := url.Values{}
params.Add("grant_type", "authorization_code") params.Add("grant_type", "authorization_code")
params.Add("appid", idp.Config.ClientID) params.Add("appid", idp.Config.ClientID)
@ -164,6 +179,29 @@ type WechatUserInfo struct {
func (idp *WeChatIdProvider) GetUserInfo(token *oauth2.Token) (*UserInfo, error) { func (idp *WeChatIdProvider) GetUserInfo(token *oauth2.Token) (*UserInfo, error) {
var wechatUserInfo WechatUserInfo var wechatUserInfo WechatUserInfo
accessToken := token.AccessToken accessToken := token.AccessToken
if strings.HasPrefix(accessToken, "wechat_oa:") {
Lock.RLock()
mapValue, ok := WechatCacheMap[accessToken[10:]]
Lock.RUnlock()
if !ok || mapValue.WechatUnionId == "" {
return nil, fmt.Errorf("error ticket")
}
Lock.Lock()
delete(WechatCacheMap, accessToken[10:])
Lock.Unlock()
userInfo := UserInfo{
Id: mapValue.WechatUnionId,
Username: "wx_user_" + mapValue.WechatUnionId,
DisplayName: "wx_user_" + mapValue.WechatUnionId,
AvatarUrl: "",
}
return &userInfo, nil
}
openid := token.Extra("Openid") openid := token.Extra("Openid")
userInfoUrl := fmt.Sprintf("https://api.weixin.qq.com/sns/userinfo?access_token=%s&openid=%s", accessToken, openid) userInfoUrl := fmt.Sprintf("https://api.weixin.qq.com/sns/userinfo?access_token=%s&openid=%s", accessToken, openid)
@ -234,7 +272,7 @@ func GetWechatOfficialAccountAccessToken(clientId string, clientSecret string) (
ExpireIn int `json:"expires_in"` ExpireIn int `json:"expires_in"`
AccessToken string `json:"access_token"` AccessToken string `json:"access_token"`
ErrCode int `json:"errcode"` ErrCode int `json:"errcode"`
Errmsg string `json:errmsg` Errmsg string `json:"errmsg"`
} }
err = json.Unmarshal(respBytes, &data) err = json.Unmarshal(respBytes, &data)
if err != nil { if err != nil {

View File

@ -146,7 +146,8 @@
"isForbidden": false, "isForbidden": false,
"isDeleted": false, "isDeleted": false,
"signupApplication": "", "signupApplication": "",
"createdIp": "" "createdIp": "",
"groups": []
} }
], ],
"providers": [ "providers": [
@ -349,5 +350,74 @@
"owner": "", "owner": "",
"url": "" "url": ""
} }
],
"groups": [
{
"owner": "",
"name":"",
"displayName": "",
"manager": "",
"contactEmail": "",
"type": "",
"parent_id": "",
"isTopGroup": true,
"title": "",
"key": "",
"children": "",
"isEnabled": true
}
],
"adapters": [
{
"owner": "",
"name": "",
"table": "",
"useSameDb": true,
"type": "",
"databaseType": "",
"database": "",
"host": "",
"port": 0,
"user": "",
"password": "",
}
],
"enforcers": [
{
"owner": "",
"name": "",
"displayName": "",
"description": "",
"model": "",
"adapter": "",
"enforcer": ""
}
],
"plans": [
{
"owner": "",
"name": "",
"displayName": "",
"description": "",
"price": 0,
"currency": "",
"period": "",
"product": "",
"paymentProviders": [],
"isEnabled": true,
"role", ""
}
],
"pricings": [
{
"owner": "",
"name": "",
"displayName": "",
"description": "",
"plans": [],
"isEnabled": true,
"trialDuration": 0,
"application": "",
}
] ]
} }

View File

@ -36,12 +36,12 @@ func main() {
object.CreateTables() object.CreateTables()
object.InitDb() object.InitDb()
object.InitFromFile()
object.InitDefaultStorageProvider() object.InitDefaultStorageProvider()
object.InitLdapAutoSynchronizer() object.InitLdapAutoSynchronizer()
proxy.InitHttpClient() proxy.InitHttpClient()
authz.InitApi() authz.InitApi()
object.InitUserManager() object.InitUserManager()
object.InitFromFile()
object.InitCasvisorConfig() object.InitCasvisorConfig()
util.SafeGoroutine(func() { object.RunSyncUsersJob() }) util.SafeGoroutine(func() { object.RunSyncUsersJob() })

View File

@ -178,6 +178,7 @@ func (adapter *Adapter) InitAdapter() error {
dataSourceName = strings.ReplaceAll(dataSourceName, "dbi.", "db.") dataSourceName = strings.ReplaceAll(dataSourceName, "dbi.", "db.")
} }
dataSourceName = conf.ReplaceDataSourceNameByDocker(dataSourceName)
engine, err := xorm.NewEngine(driverName, dataSourceName) engine, err := xorm.NewEngine(driverName, dataSourceName)
if err != nil { if err != nil {
return err return err

View File

@ -40,6 +40,15 @@ type SignupItem struct {
Rule string `json:"rule"` Rule string `json:"rule"`
} }
type SigninItem struct {
Name string `json:"name"`
Visible bool `json:"visible"`
Label string `json:"label"`
Placeholder string `json:"placeholder"`
Rule string `json:"rule"`
IsCustom bool `json:"isCustom"`
}
type SamlItem struct { type SamlItem struct {
Name string `json:"name"` Name string `json:"name"`
NameFormat string `json:"nameFormat"` NameFormat string `json:"nameFormat"`
@ -72,6 +81,7 @@ type Application struct {
Providers []*ProviderItem `xorm:"mediumtext" json:"providers"` Providers []*ProviderItem `xorm:"mediumtext" json:"providers"`
SigninMethods []*SigninMethod `xorm:"varchar(2000)" json:"signinMethods"` SigninMethods []*SigninMethod `xorm:"varchar(2000)" json:"signinMethods"`
SignupItems []*SignupItem `xorm:"varchar(2000)" json:"signupItems"` SignupItems []*SignupItem `xorm:"varchar(2000)" json:"signupItems"`
SigninItems []*SigninItem `xorm:"mediumtext" json:"signinItems"`
GrantTypes []string `xorm:"varchar(1000)" json:"grantTypes"` GrantTypes []string `xorm:"varchar(1000)" json:"grantTypes"`
OrganizationObj *Organization `xorm:"-" json:"organizationObj"` OrganizationObj *Organization `xorm:"-" json:"organizationObj"`
CertPublicKey string `xorm:"-" json:"certPublicKey"` CertPublicKey string `xorm:"-" json:"certPublicKey"`
@ -190,6 +200,100 @@ func extendApplicationWithOrg(application *Application) (err error) {
return return
} }
func extendApplicationWithSigninItems(application *Application) (err error) {
if len(application.SigninItems) == 0 {
signinItem := &SigninItem{
Name: "Back button",
Visible: true,
Label: "\n<style>\n .back-button {\n top: 65px;\n left: 15px;\n position: absolute;\n }\n</style>\n",
Placeholder: "",
Rule: "None",
}
application.SigninItems = append(application.SigninItems, signinItem)
signinItem = &SigninItem{
Name: "Languages",
Visible: true,
Label: "\n<style>\n .login-languages {\n top: 55px;\n right: 5px;\n position: absolute;\n }\n</style>\n",
Placeholder: "",
Rule: "None",
}
application.SigninItems = append(application.SigninItems, signinItem)
signinItem = &SigninItem{
Name: "Logo",
Visible: true,
Label: "\n<style>\n .login-logo-box {\n }\n<style>\n",
Placeholder: "",
Rule: "none",
}
application.SigninItems = append(application.SigninItems, signinItem)
signinItem = &SigninItem{
Name: "Signin methods",
Visible: true,
Label: "\n<style>\n .signin-methods {\n }\n<style>\n",
Placeholder: "",
Rule: "None",
}
application.SigninItems = append(application.SigninItems, signinItem)
signinItem = &SigninItem{
Name: "Username",
Visible: true,
Label: "\n<style>\n .login-username {\n }\n<style>\n",
Placeholder: "",
Rule: "None",
}
application.SigninItems = append(application.SigninItems, signinItem)
signinItem = &SigninItem{
Name: "Password",
Visible: true,
Label: "\n<style>\n .login-password {\n }\n<style>\n",
Placeholder: "",
Rule: "None",
}
application.SigninItems = append(application.SigninItems, signinItem)
signinItem = &SigninItem{
Name: "Agreement",
Visible: true,
Label: "\n<style>\n .login-agreement {\n }\n<style>\n",
Placeholder: "",
Rule: "None",
}
application.SigninItems = append(application.SigninItems, signinItem)
signinItem = &SigninItem{
Name: "Forgot password?",
Visible: true,
Label: "\n<style>\n .login-forget-password {\n display: inline-flex;\n justify-content: space-between;\n width: 320px;\n margin-bottom: 25px;\n }\n<style>\n",
Placeholder: "",
Rule: "None",
}
application.SigninItems = append(application.SigninItems, signinItem)
signinItem = &SigninItem{
Name: "Login button",
Visible: true,
Label: "\n<style>\n .login-button-box {\n margin-bottom: 5px;\n }\n .login-button {\n width: 100%;\n }\n<style>\n",
Placeholder: "",
Rule: "None",
}
application.SigninItems = append(application.SigninItems, signinItem)
signinItem = &SigninItem{
Name: "Signup link",
Visible: true,
Label: "\n<style>\n .login-signup-link {\n margin-bottom: 24px;\n display: flex;\n justify-content: end;\n}\n<style>\n",
Placeholder: "",
Rule: "None",
}
application.SigninItems = append(application.SigninItems, signinItem)
signinItem = &SigninItem{
Name: "Providers",
Visible: true,
Label: "\n<style>\n .provider-img {\n width: 30px;\n margin: 5px;\n }\n .provider-big-img {\n margin-bottom: 10px;\n }\n</style>\n",
Placeholder: "",
Rule: "None",
}
application.SigninItems = append(application.SigninItems, signinItem)
}
return
}
func extendApplicationWithSigninMethods(application *Application) (err error) { func extendApplicationWithSigninMethods(application *Application) (err error) {
if len(application.SigninMethods) == 0 { if len(application.SigninMethods) == 0 {
if application.EnablePassword { if application.EnablePassword {
@ -240,6 +344,10 @@ func getApplication(owner string, name string) (*Application, error) {
if err != nil { if err != nil {
return nil, err return nil, err
} }
err = extendApplicationWithSigninItems(&application)
if err != nil {
return nil, err
}
return &application, nil return &application, nil
} else { } else {
@ -270,6 +378,11 @@ func GetApplicationByOrganizationName(organization string) (*Application, error)
return nil, err return nil, err
} }
err = extendApplicationWithSigninItems(&application)
if err != nil {
return nil, err
}
return &application, nil return &application, nil
} else { } else {
return nil, nil return nil, nil
@ -322,6 +435,11 @@ func GetApplicationByClientId(clientId string) (*Application, error) {
return nil, err return nil, err
} }
err = extendApplicationWithSigninItems(&application)
if err != nil {
return nil, err
}
return &application, nil return &application, nil
} else { } else {
return nil, nil return nil, nil

View File

@ -35,6 +35,11 @@ type InitData struct {
Syncers []*Syncer `json:"syncers"` Syncers []*Syncer `json:"syncers"`
Tokens []*Token `json:"tokens"` Tokens []*Token `json:"tokens"`
Webhooks []*Webhook `json:"webhooks"` Webhooks []*Webhook `json:"webhooks"`
Groups []*Group `json:"groups"`
Adapters []*Adapter `json:"adapters"`
Enforcers []*Enforcer `json:"enforcers"`
Plans []*Plan `json:"plans"`
Pricings []*Pricing `json:"pricings"`
} }
func InitFromFile() { func InitFromFile() {
@ -94,6 +99,21 @@ func InitFromFile() {
for _, webhook := range initData.Webhooks { for _, webhook := range initData.Webhooks {
initDefinedWebhook(webhook) initDefinedWebhook(webhook)
} }
for _, group := range initData.Groups {
initDefinedGroup(group)
}
for _, adapter := range initData.Adapters {
initDefinedAdapter(adapter)
}
for _, enforcer := range initData.Enforcers {
initDefinedEnforcer(enforcer)
}
for _, plan := range initData.Plans {
initDefinedPlan(plan)
}
for _, pricing := range initData.Pricings {
initDefinedPricing(pricing)
}
} }
} }
@ -120,6 +140,11 @@ func readInitDataFromFile(filePath string) (*InitData, error) {
Syncers: []*Syncer{}, Syncers: []*Syncer{},
Tokens: []*Token{}, Tokens: []*Token{},
Webhooks: []*Webhook{}, Webhooks: []*Webhook{},
Groups: []*Group{},
Adapters: []*Adapter{},
Enforcers: []*Enforcer{},
Plans: []*Plan{},
Pricings: []*Pricing{},
} }
err := util.JsonToStruct(s, data) err := util.JsonToStruct(s, data)
if err != nil { if err != nil {
@ -190,7 +215,16 @@ func readInitDataFromFile(filePath string) (*InitData, error) {
webhook.Headers = []*Header{} webhook.Headers = []*Header{}
} }
} }
for _, plan := range data.Plans {
if plan.PaymentProviders == nil {
plan.PaymentProviders = []string{}
}
}
for _, pricing := range data.Pricings {
if pricing.Plans == nil {
pricing.Plans = []string{}
}
}
return data, nil return data, nil
} }
@ -434,3 +468,78 @@ func initDefinedWebhook(webhook *Webhook) {
panic(err) panic(err)
} }
} }
func initDefinedGroup(group *Group) {
existed, err := getGroup(group.Owner, group.Name)
if err != nil {
panic(err)
}
if existed != nil {
return
}
group.CreatedTime = util.GetCurrentTime()
_, err = AddGroup(group)
if err != nil {
panic(err)
}
}
func initDefinedAdapter(adapter *Adapter) {
existed, err := getAdapter(adapter.Owner, adapter.Name)
if err != nil {
panic(err)
}
if existed != nil {
return
}
adapter.CreatedTime = util.GetCurrentTime()
_, err = AddAdapter(adapter)
if err != nil {
panic(err)
}
}
func initDefinedEnforcer(enforcer *Enforcer) {
existed, err := getEnforcer(enforcer.Owner, enforcer.Name)
if err != nil {
panic(err)
}
if existed != nil {
return
}
enforcer.CreatedTime = util.GetCurrentTime()
_, err = AddEnforcer(enforcer)
if err != nil {
panic(err)
}
}
func initDefinedPlan(plan *Plan) {
existed, err := getPlan(plan.Owner, plan.Name)
if err != nil {
panic(err)
}
if existed != nil {
return
}
plan.CreatedTime = util.GetCurrentTime()
_, err = AddPlan(plan)
if err != nil {
panic(err)
}
}
func initDefinedPricing(pricing *Pricing) {
existed, err := getPlan(pricing.Owner, pricing.Name)
if err != nil {
panic(err)
}
if existed != nil {
return
}
pricing.CreatedTime = util.GetCurrentTime()
_, err = AddPricing(pricing)
if err != nil {
panic(err)
}
}

View File

@ -96,6 +96,31 @@ func writeInitDataToFile(filePath string) error {
return err return err
} }
groups, err := GetGroups("")
if err != nil {
return err
}
adapters, err := GetAdapters("")
if err != nil {
return err
}
enforcers, err := GetEnforcers("")
if err != nil {
return err
}
plans, err := GetPlans("")
if err != nil {
return err
}
pricings, err := GetPricings("")
if err != nil {
return err
}
data := &InitData{ data := &InitData{
Organizations: organizations, Organizations: organizations,
Applications: applications, Applications: applications,
@ -112,6 +137,11 @@ func writeInitDataToFile(filePath string) error {
Syncers: syncers, Syncers: syncers,
Tokens: tokens, Tokens: tokens,
Webhooks: webhooks, Webhooks: webhooks,
Groups: groups,
Adapters: adapters,
Enforcers: enforcers,
Plans: plans,
Pricings: pricings,
} }
text := util.StructToJsonFormatted(data) text := util.StructToJsonFormatted(data)

View File

@ -18,12 +18,8 @@ import (
"fmt" "fmt"
"github.com/casdoor/casdoor/util" "github.com/casdoor/casdoor/util"
"github.com/beego/beego/context"
) )
const MfaRecoveryCodesSession = "mfa_recovery_codes"
type MfaProps struct { type MfaProps struct {
Enabled bool `json:"enabled"` Enabled bool `json:"enabled"`
IsPreferred bool `json:"isPreferred"` IsPreferred bool `json:"isPreferred"`
@ -35,9 +31,9 @@ type MfaProps struct {
} }
type MfaInterface interface { type MfaInterface interface {
Initiate(ctx *context.Context, userId string) (*MfaProps, error) Initiate(userId string) (*MfaProps, error)
SetupVerify(ctx *context.Context, passcode string) error SetupVerify(passcode string) error
Enable(ctx *context.Context, user *User) error Enable(user *User) error
Verify(passcode string) error Verify(passcode string) error
} }

View File

@ -16,85 +16,55 @@ package object
import ( import (
"errors" "errors"
"fmt"
"github.com/beego/beego/context"
"github.com/casdoor/casdoor/util" "github.com/casdoor/casdoor/util"
"github.com/google/uuid"
)
const (
MfaCountryCodeSession = "mfa_country_code"
MfaDestSession = "mfa_dest"
) )
type SmsMfa struct { type SmsMfa struct {
Config *MfaProps *MfaProps
} }
func (mfa *SmsMfa) Initiate(ctx *context.Context, userId string) (*MfaProps, error) { func (mfa *SmsMfa) Initiate(userId string) (*MfaProps, error) {
recoveryCode := uuid.NewString()
ctx.Output.Session(MfaRecoveryCodesSession, []string{recoveryCode})
mfaProps := MfaProps{ mfaProps := MfaProps{
MfaType: mfa.Config.MfaType, MfaType: mfa.MfaType,
RecoveryCodes: []string{recoveryCode},
} }
return &mfaProps, nil return &mfaProps, nil
} }
func (mfa *SmsMfa) SetupVerify(ctx *context.Context, passCode string) error { func (mfa *SmsMfa) SetupVerify(passCode string) error {
destSession := ctx.Input.CruSession.Get(MfaDestSession) if !util.IsEmailValid(mfa.Secret) {
if destSession == nil { mfa.Secret, _ = util.GetE164Number(mfa.Secret, mfa.CountryCode)
return errors.New("dest session is missing")
}
dest := destSession.(string)
if !util.IsEmailValid(dest) {
countryCodeSession := ctx.Input.CruSession.Get(MfaCountryCodeSession)
if countryCodeSession == nil {
return errors.New("country code is missing")
}
countryCode := countryCodeSession.(string)
dest, _ = util.GetE164Number(dest, countryCode)
} }
if result := CheckVerificationCode(dest, passCode, "en"); result.Code != VerificationSuccess { if result := CheckVerificationCode(mfa.Secret, passCode, "en"); result.Code != VerificationSuccess {
return errors.New(result.Msg) return errors.New(result.Msg)
} }
return nil return nil
} }
func (mfa *SmsMfa) Enable(ctx *context.Context, user *User) error { func (mfa *SmsMfa) Enable(user *User) error {
recoveryCodes := ctx.Input.CruSession.Get(MfaRecoveryCodesSession).([]string)
if len(recoveryCodes) == 0 {
return fmt.Errorf("recovery codes is missing")
}
columns := []string{"recovery_codes", "preferred_mfa_type"} columns := []string{"recovery_codes", "preferred_mfa_type"}
user.RecoveryCodes = append(user.RecoveryCodes, recoveryCodes...) user.RecoveryCodes = append(user.RecoveryCodes, mfa.RecoveryCodes...)
if user.PreferredMfaType == "" { if user.PreferredMfaType == "" {
user.PreferredMfaType = mfa.Config.MfaType user.PreferredMfaType = mfa.MfaType
} }
if mfa.Config.MfaType == SmsType { if mfa.MfaType == SmsType {
user.MfaPhoneEnabled = true user.MfaPhoneEnabled = true
columns = append(columns, "mfa_phone_enabled") columns = append(columns, "mfa_phone_enabled")
if user.Phone == "" { if user.Phone == "" {
user.Phone = ctx.Input.CruSession.Get(MfaDestSession).(string) user.Phone = mfa.Secret
user.CountryCode = ctx.Input.CruSession.Get(MfaCountryCodeSession).(string) user.CountryCode = mfa.CountryCode
columns = append(columns, "phone", "country_code") columns = append(columns, "phone", "country_code")
} }
} else if mfa.Config.MfaType == EmailType { } else if mfa.MfaType == EmailType {
user.MfaEmailEnabled = true user.MfaEmailEnabled = true
columns = append(columns, "mfa_email_enabled") columns = append(columns, "mfa_email_enabled")
if user.Email == "" { if user.Email == "" {
user.Email = ctx.Input.CruSession.Get(MfaDestSession).(string) user.Email = mfa.Secret
columns = append(columns, "email") columns = append(columns, "email")
} }
} }
@ -104,18 +74,14 @@ func (mfa *SmsMfa) Enable(ctx *context.Context, user *User) error {
return err return err
} }
ctx.Input.CruSession.Delete(MfaRecoveryCodesSession)
ctx.Input.CruSession.Delete(MfaDestSession)
ctx.Input.CruSession.Delete(MfaCountryCodeSession)
return nil return nil
} }
func (mfa *SmsMfa) Verify(passCode string) error { func (mfa *SmsMfa) Verify(passCode string) error {
if !util.IsEmailValid(mfa.Config.Secret) { if !util.IsEmailValid(mfa.Secret) {
mfa.Config.Secret, _ = util.GetE164Number(mfa.Config.Secret, mfa.Config.CountryCode) mfa.Secret, _ = util.GetE164Number(mfa.Secret, mfa.CountryCode)
} }
if result := CheckVerificationCode(mfa.Config.Secret, passCode, "en"); result.Code != VerificationSuccess { if result := CheckVerificationCode(mfa.Secret, passCode, "en"); result.Code != VerificationSuccess {
return errors.New(result.Msg) return errors.New(result.Msg)
} }
return nil return nil
@ -128,7 +94,7 @@ func NewSmsMfaUtil(config *MfaProps) *SmsMfa {
} }
} }
return &SmsMfa{ return &SmsMfa{
Config: config, config,
} }
} }
@ -139,6 +105,6 @@ func NewEmailMfaUtil(config *MfaProps) *SmsMfa {
} }
} }
return &SmsMfa{ return &SmsMfa{
Config: config, config,
} }
} }

View File

@ -16,28 +16,24 @@ package object
import ( import (
"errors" "errors"
"fmt"
"time" "time"
"github.com/beego/beego/context"
"github.com/google/uuid"
"github.com/pquerna/otp" "github.com/pquerna/otp"
"github.com/pquerna/otp/totp" "github.com/pquerna/otp/totp"
) )
const ( const (
MfaTotpSecretSession = "mfa_totp_secret"
MfaTotpPeriodInSeconds = 30 MfaTotpPeriodInSeconds = 30
) )
type TotpMfa struct { type TotpMfa struct {
Config *MfaProps *MfaProps
period uint period uint
secretSize uint secretSize uint
digits otp.Digits digits otp.Digits
} }
func (mfa *TotpMfa) Initiate(ctx *context.Context, userId string) (*MfaProps, error) { func (mfa *TotpMfa) Initiate(userId string) (*MfaProps, error) {
//issuer := beego.AppConfig.String("appname") //issuer := beego.AppConfig.String("appname")
//if issuer == "" { //if issuer == "" {
// issuer = "casdoor" // issuer = "casdoor"
@ -55,27 +51,16 @@ func (mfa *TotpMfa) Initiate(ctx *context.Context, userId string) (*MfaProps, er
return nil, err return nil, err
} }
ctx.Output.Session(MfaTotpSecretSession, key.Secret())
recoveryCode := uuid.NewString()
ctx.Output.Session(MfaRecoveryCodesSession, []string{recoveryCode})
mfaProps := MfaProps{ mfaProps := MfaProps{
MfaType: mfa.Config.MfaType, MfaType: mfa.MfaType,
RecoveryCodes: []string{recoveryCode}, Secret: key.Secret(),
Secret: key.Secret(), URL: key.URL(),
URL: key.URL(),
} }
return &mfaProps, nil return &mfaProps, nil
} }
func (mfa *TotpMfa) SetupVerify(ctx *context.Context, passcode string) error { func (mfa *TotpMfa) SetupVerify(passcode string) error {
secret := ctx.Input.CruSession.Get(MfaTotpSecretSession) result, err := totp.ValidateCustom(passcode, mfa.Secret, time.Now().UTC(), totp.ValidateOpts{
if secret == nil {
return errors.New("totp secret is missing")
}
result, err := totp.ValidateCustom(passcode, secret.(string), time.Now().UTC(), totp.ValidateOpts{
Period: MfaTotpPeriodInSeconds, Period: MfaTotpPeriodInSeconds,
Skew: 1, Skew: 1,
Digits: otp.DigitsSix, Digits: otp.DigitsSix,
@ -92,22 +77,13 @@ func (mfa *TotpMfa) SetupVerify(ctx *context.Context, passcode string) error {
} }
} }
func (mfa *TotpMfa) Enable(ctx *context.Context, user *User) error { func (mfa *TotpMfa) Enable(user *User) error {
recoveryCodes := ctx.Input.CruSession.Get(MfaRecoveryCodesSession).([]string)
if len(recoveryCodes) == 0 {
return fmt.Errorf("recovery codes is missing")
}
secret := ctx.Input.CruSession.Get(MfaTotpSecretSession).(string)
if secret == "" {
return fmt.Errorf("totp secret is missing")
}
columns := []string{"recovery_codes", "preferred_mfa_type", "totp_secret"} columns := []string{"recovery_codes", "preferred_mfa_type", "totp_secret"}
user.RecoveryCodes = append(user.RecoveryCodes, recoveryCodes...) user.RecoveryCodes = append(user.RecoveryCodes, mfa.RecoveryCodes...)
user.TotpSecret = secret user.TotpSecret = mfa.Secret
if user.PreferredMfaType == "" { if user.PreferredMfaType == "" {
user.PreferredMfaType = mfa.Config.MfaType user.PreferredMfaType = mfa.MfaType
} }
_, err := updateUser(user.GetId(), user, columns) _, err := updateUser(user.GetId(), user, columns)
@ -115,14 +91,11 @@ func (mfa *TotpMfa) Enable(ctx *context.Context, user *User) error {
return err return err
} }
ctx.Input.CruSession.Delete(MfaRecoveryCodesSession)
ctx.Input.CruSession.Delete(MfaTotpSecretSession)
return nil return nil
} }
func (mfa *TotpMfa) Verify(passcode string) error { func (mfa *TotpMfa) Verify(passcode string) error {
result, err := totp.ValidateCustom(passcode, mfa.Config.Secret, time.Now().UTC(), totp.ValidateOpts{ result, err := totp.ValidateCustom(passcode, mfa.Secret, time.Now().UTC(), totp.ValidateOpts{
Period: MfaTotpPeriodInSeconds, Period: MfaTotpPeriodInSeconds,
Skew: 1, Skew: 1,
Digits: otp.DigitsSix, Digits: otp.DigitsSix,
@ -147,7 +120,7 @@ func NewTotpMfaUtil(config *MfaProps) *TotpMfa {
} }
return &TotpMfa{ return &TotpMfa{
Config: config, MfaProps: config,
period: MfaTotpPeriodInSeconds, period: MfaTotpPeriodInSeconds,
secretSize: 20, secretSize: 20,
digits: otp.DigitsSix, digits: otp.DigitsSix,

View File

@ -342,6 +342,11 @@ func GetDefaultApplication(id string) (*Application, error) {
return nil, err return nil, err
} }
err = extendApplicationWithSigninItems(defaultApplication)
if err != nil {
return nil, err
}
return defaultApplication, nil return defaultApplication, nil
} }

View File

@ -312,8 +312,6 @@ func GetPaymentProvider(p *Provider) (pp.PaymentProvider, error) {
} else { } else {
return nil, fmt.Errorf("the payment provider type: %s is not supported", p.Type) return nil, fmt.Errorf("the payment provider type: %s is not supported", p.Type)
} }
return nil, nil
} }
func (p *Provider) GetId() string { func (p *Provider) GetId() string {

View File

@ -116,7 +116,7 @@ func getFilteredWebhooks(webhooks []*Webhook, action string) []*Webhook {
} }
func SendWebhooks(record *casvisorsdk.Record) error { func SendWebhooks(record *casvisorsdk.Record) error {
webhooks, err := getWebhooksByOrganization(record.Organization) webhooks, err := getWebhooksByOrganization("")
if err != nil { if err != nil {
return err return err
} }

View File

@ -793,6 +793,13 @@ func AddUser(user *User) (bool, error) {
} }
user.Ranking = int(count + 1) user.Ranking = int(count + 1)
if user.Groups != nil && len(user.Groups) > 0 {
_, err = userEnforcer.UpdateGroupsForUser(user.GetId(), user.Groups)
if err != nil {
return false, err
}
}
affected, err := ormer.Engine.Insert(user) affected, err := ormer.Engine.Insert(user)
if err != nil { if err != nil {
return false, err return false, err
@ -822,6 +829,13 @@ func AddUsers(users []*User) (bool, error) {
if err != nil { if err != nil {
return false, err return false, err
} }
if user.Groups != nil && len(user.Groups) > 0 {
_, err = userEnforcer.UpdateGroupsForUser(user.GetId(), user.Groups)
if err != nil {
return false, err
}
}
} }
affected, err := ormer.Engine.Insert(users) affected, err := ormer.Engine.Insert(users)

View File

@ -41,11 +41,7 @@ func downloadImage(client *http.Client, url string) (*bytes.Buffer, string, erro
if resp.StatusCode != http.StatusOK { if resp.StatusCode != http.StatusOK {
fmt.Printf("downloadImage() error for url [%s]: %s\n", url, resp.Status) fmt.Printf("downloadImage() error for url [%s]: %s\n", url, resp.Status)
if resp.StatusCode == 404 { return nil, "", nil
return nil, "", nil
} else {
return nil, "", fmt.Errorf("failed to download gravatar image: %s", resp.Status)
}
} }
// Get the content type and determine the file extension // Get the content type and determine the file extension

View File

@ -1,10 +1,12 @@
package object package object
import ( import (
errors2 "errors"
"fmt" "fmt"
"github.com/casbin/casbin/v2"
"github.com/casbin/casbin/v2/errors" "github.com/casbin/casbin/v2/errors"
"github.com/casbin/casbin/v2"
"github.com/casdoor/casdoor/util" "github.com/casdoor/casdoor/util"
) )
@ -87,7 +89,7 @@ func (e *UserGroupEnforcer) GetAllUsersByGroup(group string) ([]string, error) {
users, err := e.enforcer.GetUsersForRole(GetGroupWithPrefix(group)) users, err := e.enforcer.GetUsersForRole(GetGroupWithPrefix(group))
if err != nil { if err != nil {
if err == errors.ErrNameNotFound { if errors2.Is(err, errors.ErrNameNotFound) {
return []string{}, nil return []string{}, nil
} }
return nil, err return nil, err

View File

@ -73,10 +73,12 @@ func getObject(ctx *context.Context) (string, string) {
} }
} }
// query == "?id=built-in/admin" if !(strings.HasPrefix(ctx.Request.URL.Path, "/api/get-") && strings.HasSuffix(ctx.Request.URL.Path, "s")) {
id := ctx.Input.Query("id") // query == "?id=built-in/admin"
if id != "" { id := ctx.Input.Query("id")
return util.GetOwnerAndNameFromIdNoCheck(id) if id != "" {
return util.GetOwnerAndNameFromIdNoCheck(id)
}
} }
owner := ctx.Input.Query("owner") owner := ctx.Input.Query("owner")

View File

@ -34,7 +34,7 @@ func init() {
rePhone, _ = regexp.Compile(`(\d{3})\d*(\d{4})`) rePhone, _ = regexp.Compile(`(\d{3})\d*(\d{4})`)
ReWhiteSpace, _ = regexp.Compile(`\s`) ReWhiteSpace, _ = regexp.Compile(`\s`)
ReFieldWhiteList, _ = regexp.Compile(`^[A-Za-z0-9]+$`) ReFieldWhiteList, _ = regexp.Compile(`^[A-Za-z0-9]+$`)
ReUserName, _ = regexp.Compile("^[a-zA-Z0-9]+((?:-[a-zA-Z0-9]+)|(?:_[a-zA-Z0-9]+))*$") ReUserName, _ = regexp.Compile("^[a-zA-Z0-9]+([-._][a-zA-Z0-9]+)*$")
} }
func IsEmailValid(email string) bool { func IsEmailValid(email string) bool {

View File

@ -36,6 +36,7 @@ import ThemeEditor from "./common/theme/ThemeEditor";
import {Controlled as CodeMirror} from "react-codemirror2"; import {Controlled as CodeMirror} from "react-codemirror2";
import "codemirror/lib/codemirror.css"; import "codemirror/lib/codemirror.css";
import SigninTable from "./table/SigninTable";
require("codemirror/theme/material-darker.css"); require("codemirror/theme/material-darker.css");
require("codemirror/mode/htmlmixed/htmlmixed"); require("codemirror/mode/htmlmixed/htmlmixed");
@ -864,6 +865,24 @@ class ApplicationEditPage extends React.Component {
} }
</Col> </Col>
</Row> </Row>
{
<React.Fragment>
<Row style={{marginTop: "20px"}} >
<Col style={{marginTop: "5px"}} span={(Setting.isMobile()) ? 22 : 2}>
{Setting.getLabel(i18next.t("application:Signin items"), i18next.t("application:Signin items - Tooltip"))} :
</Col>
<Col span={22} >
<SigninTable
title={i18next.t("application:Signin items")}
table={this.state.application.signinItems}
onUpdateTable={(value) => {
this.updateApplicationField("signinItems", value);
}}
/>
</Col>
</Row>
</React.Fragment>
}
{ {
!this.state.application.enableSignUp ? null : ( !this.state.application.enableSignUp ? null : (
<React.Fragment> <React.Fragment>

View File

@ -13,7 +13,7 @@
// limitations under the License. // limitations under the License.
import React from "react"; import React from "react";
import {Button, Card, Checkbox, Col, Input, InputNumber, Row, Select, Switch} from "antd"; import {Button, Card, Checkbox, Col, Input, InputNumber, Radio, Row, Select, Switch} from "antd";
import {LinkOutlined} from "@ant-design/icons"; import {LinkOutlined} from "@ant-design/icons";
import * as ProviderBackend from "./backend/ProviderBackend"; import * as ProviderBackend from "./backend/ProviderBackend";
import * as OrganizationBackend from "./backend/OrganizationBackend"; import * as OrganizationBackend from "./backend/OrganizationBackend";
@ -118,7 +118,23 @@ class ProviderEditPage extends React.Component {
provider["cert"] = ""; provider["cert"] = "";
this.getCerts(value); this.getCerts(value);
} }
provider[key] = value; provider[key] = value;
if (provider["type"] === "WeChat") {
if (!provider["clientId"]) {
provider["signName"] = "media";
provider["disableSsl"] = true;
}
if (!provider["clientId2"]) {
provider["signName"] = "open";
provider["disableSsl"] = false;
}
if (!provider["disableSsl"]) {
provider["signName"] = "open";
}
}
this.setState({ this.setState({
provider: provider, provider: provider,
}); });
@ -757,24 +773,40 @@ class ProviderEditPage extends React.Component {
{ {
this.state.provider.type !== "WeChat" ? null : ( this.state.provider.type !== "WeChat" ? null : (
<React.Fragment> <React.Fragment>
<Row style={{marginTop: "20px"}} >
<Col style={{marginTop: "5px"}} span={(Setting.isMobile()) ? 22 : 2}>
{Setting.getLabel(i18next.t("provider:Use WeChat Media Platform in PC"), i18next.t("provider:Use WeChat Media Platform in PC - Tooltip"))} :
</Col>
<Col span={1} >
<Switch disabled={!this.state.provider.clientId} checked={this.state.provider.disableSsl} onChange={checked => {
this.updateProviderField("disableSsl", checked);
}} />
</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("token:Access token"), i18next.t("token:Access token - Tooltip"))} : {Setting.getLabel(i18next.t("token:Access token"), i18next.t("token:Access token - Tooltip"))} :
</Col> </Col>
<Col span={22} > <Col span={22} >
<Input value={this.state.provider.content} onChange={e => { <Input value={this.state.provider.content} disabled={!this.state.provider.disableSsl || !this.state.provider.clientId2} onChange={e => {
this.updateProviderField("content", e.target.value); this.updateProviderField("content", e.target.value);
}} /> }} />
</Col> </Col>
</Row> </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("provider:Enable QR code"), i18next.t("provider:Enable QR code - Tooltip"))} : {Setting.getLabel(i18next.t("provider:Follow-up action"), i18next.t("provider:Follow-up action - Tooltip"))} :
</Col> </Col>
<Col span={1} > <Col>
<Switch checked={this.state.provider.disableSsl} onChange={checked => { <Radio.Group value={this.state.provider.signName}
this.updateProviderField("disableSsl", checked); disabled={!this.state.provider.disableSsl || !this.state.provider.clientId || !this.state.provider.clientId2}
}} /> buttonStyle="solid"
onChange={e => {
this.updateProviderField("signName", e.target.value);
}}>
<Radio.Button value="open">{i18next.t("provider:Use WeChat Open Platform to login")}</Radio.Button>
<Radio.Button value="media">{i18next.t("provider:Use WeChat Media Platform to login")}</Radio.Button>
</Radio.Group>
</Col> </Col>
</Row> </Row>
</React.Fragment> </React.Fragment>

View File

@ -1164,7 +1164,7 @@ export function getLoginLink(application) {
let url; let url;
if (application === null) { if (application === null) {
url = null; url = null;
} else if (!isPasswordEnabled(application) && window.location.pathname.includes("/auto-signup/oauth/authorize")) { } else if (window.location.pathname.includes("/auto-signup/oauth/authorize")) {
url = window.location.href.replace("/auto-signup/oauth/authorize", "/login/oauth/authorize"); url = window.location.href.replace("/auto-signup/oauth/authorize", "/login/oauth/authorize");
} else if (authConfig.appName === application.name) { } else if (authConfig.appName === application.name) {
url = "/login"; url = "/login";
@ -1176,11 +1176,6 @@ export function getLoginLink(application) {
return url; return url;
} }
export function renderLoginLink(application, text) {
const url = getLoginLink(application);
return renderLink(url, text, null);
}
export function redirectToLoginPage(application, history) { export function redirectToLoginPage(application, history) {
const loginLink = getLoginLink(application); const loginLink = getLoginLink(application);
if (loginLink.startsWith("http://") || loginLink.startsWith("https://")) { if (loginLink.startsWith("http://") || loginLink.startsWith("https://")) {
@ -1205,7 +1200,7 @@ function renderLink(url, text, onClick) {
); );
} else if (url.startsWith("http")) { } else if (url.startsWith("http")) {
return ( return (
<a target="_blank" rel="noopener noreferrer" style={{float: "right"}} href={url} onClick={() => { <a style={{float: "right"}} href={url} onClick={() => {
if (onClick !== null) { if (onClick !== null) {
onClick(); onClick();
} }
@ -1220,7 +1215,7 @@ export function renderSignupLink(application, text) {
let url; let url;
if (application === null) { if (application === null) {
url = null; url = null;
} else if (!isPasswordEnabled(application) && window.location.pathname.includes("/login/oauth/authorize")) { } else if (window.location.pathname.includes("/login/oauth/authorize")) {
url = window.location.href.replace("/login/oauth/authorize", "/auto-signup/oauth/authorize"); url = window.location.href.replace("/login/oauth/authorize", "/auto-signup/oauth/authorize");
} else if (authConfig.appName === application.name) { } else if (authConfig.appName === application.name) {
url = "/signup"; url = "/signup";
@ -1253,7 +1248,11 @@ export function renderForgetLink(application, text) {
} }
} }
return renderLink(url, text, null); const storeSigninUrl = () => {
sessionStorage.setItem("signinUrl", window.location.href);
};
return renderLink(url, text, storeSigninUrl);
} }
export function renderHelmet(application) { export function renderHelmet(application) {

View File

@ -47,6 +47,7 @@ class ForgetPage extends React.Component {
this.form = React.createRef(); this.form = React.createRef();
} }
componentDidMount() { componentDidMount() {
if (this.getApplicationObj() === undefined) { if (this.getApplicationObj() === undefined) {
if (this.state.applicationName !== undefined) { if (this.state.applicationName !== undefined) {
@ -153,7 +154,12 @@ class ForgetPage extends React.Component {
values.userOwner = this.getApplicationObj()?.organizationObj.name; values.userOwner = this.getApplicationObj()?.organizationObj.name;
UserBackend.setPassword(values.userOwner, values.username, "", values?.newPassword, this.state.code).then(res => { UserBackend.setPassword(values.userOwner, values.username, "", values?.newPassword, this.state.code).then(res => {
if (res.status === "ok") { if (res.status === "ok") {
Setting.redirectToLoginPage(this.getApplicationObj(), this.props.history); const linkInStorage = sessionStorage.getItem("signinUrl");
if (linkInStorage !== null && linkInStorage !== "") {
Setting.goToLink(linkInStorage);
} else {
Setting.redirectToLoginPage(this.getApplicationObj(), this.props.history);
}
} else { } else {
Setting.showMessage("error", res.msg); Setting.showMessage("error", res.msg);
} }

View File

@ -13,7 +13,7 @@
// limitations under the License. // limitations under the License.
import React from "react"; import React from "react";
import {Button, Checkbox, Col, Form, Input, Result, Row, Spin, Tabs} from "antd"; import {Button, Checkbox, Col, Form, Input, Result, Spin, Tabs} from "antd";
import {ArrowLeftOutlined, LockOutlined, UserOutlined} from "@ant-design/icons"; import {ArrowLeftOutlined, LockOutlined, UserOutlined} from "@ant-design/icons";
import {withRouter} from "react-router-dom"; import {withRouter} from "react-router-dom";
import * as UserWebauthnBackend from "../backend/UserWebauthnBackend"; import * as UserWebauthnBackend from "../backend/UserWebauthnBackend";
@ -32,11 +32,11 @@ import i18next from "i18next";
import CustomGithubCorner from "../common/CustomGithubCorner"; import CustomGithubCorner from "../common/CustomGithubCorner";
import {SendCodeInput} from "../common/SendCodeInput"; import {SendCodeInput} from "../common/SendCodeInput";
import LanguageSelect from "../common/select/LanguageSelect"; import LanguageSelect from "../common/select/LanguageSelect";
import {CaptchaModal} from "../common/modal/CaptchaModal"; import {CaptchaModal, CaptchaRule} from "../common/modal/CaptchaModal";
import {CaptchaRule} from "../common/modal/CaptchaModal";
import RedirectForm from "../common/RedirectForm"; import RedirectForm from "../common/RedirectForm";
import {MfaAuthVerifyForm, NextMfa, RequiredMfa} from "./mfa/MfaAuthVerifyForm"; import {MfaAuthVerifyForm, NextMfa, RequiredMfa} from "./mfa/MfaAuthVerifyForm";
import {GoogleOneTapLoginVirtualButton} from "./GoogleLoginButton"; import {GoogleOneTapLoginVirtualButton} from "./GoogleLoginButton";
class LoginPage extends React.Component { class LoginPage extends React.Component {
constructor(props) { constructor(props) {
super(props); super(props);
@ -494,6 +494,200 @@ class LoginPage extends React.Component {
return null; return null;
} }
renderFormItem(application, signinItem) {
if (!signinItem.visible && signinItem.name !== "ForgetPassword") {
return null;
}
if (signinItem.name === "Logo") {
return (
<div className="login-logo-box">
<div dangerouslySetInnerHTML={{__html: signinItem.label}} />
{
Setting.renderHelmet(application)
}
{
Setting.renderLogo(application)
}
</div>
);
} else if (signinItem.name === "Back button") {
return (
<div>
<div dangerouslySetInnerHTML={{__html: signinItem.label}} />
{
this.renderBackButton()
}
</div>
);
} else if (signinItem.name === "Languages") {
return (
<div className="login-languages">
<div dangerouslySetInnerHTML={{__html: signinItem.label}} />
<LanguageSelect languages={application.organizationObj.languages} />
</div>
);
} else if (signinItem.name === "Signin methods") {
return (
<div>
<div dangerouslySetInnerHTML={{__html: signinItem.label}} />
{this.renderMethodChoiceBox()}
</div>
)
;
} else if (signinItem.name === "Username") {
return (
<div className="login-username">
<div dangerouslySetInnerHTML={{__html: signinItem.label}} />
<Form.Item
name="username"
rules={[
{
required: true,
message: () => {
switch (this.state.loginMethod) {
case "verificationCodeEmail":
return i18next.t("login:Please input your Email!");
case "verificationCodePhone":
return i18next.t("login:Please input your Phone!");
case "ldap":
return i18next.t("login:Please input your LDAP username!");
default:
return i18next.t("login:Please input your Email or Phone!");
}
},
},
{
validator: (_, value) => {
if (value === "") {
return Promise.resolve();
}
if (this.state.loginMethod === "verificationCode") {
if (!Setting.isValidEmail(value) && !Setting.isValidPhone(value)) {
this.setState({validEmailOrPhone: false});
return Promise.reject(i18next.t("login:The input is not valid Email or phone number!"));
}
if (Setting.isValidEmail(value)) {
this.setState({validEmail: true});
} else {
this.setState({validEmail: false});
}
} else if (this.state.loginMethod === "verificationCodeEmail") {
if (!Setting.isValidEmail(value)) {
this.setState({validEmail: false});
this.setState({validEmailOrPhone: false});
return Promise.reject(i18next.t("login:The input is not valid Email!"));
} else {
this.setState({validEmail: true});
}
} else if (this.state.loginMethod === "verificationCodePhone") {
if (!Setting.isValidPhone(value)) {
this.setState({validEmailOrPhone: false});
return Promise.reject(i18next.t("login:The input is not valid phone number!"));
}
}
this.setState({validEmailOrPhone: true});
return Promise.resolve();
},
},
]}
>
<Input
id="input"
prefix={<UserOutlined className="site-form-item-icon" />}
placeholder={this.getPlaceholder()}
onChange={e => {
this.setState({
username: e.target.value,
});
}}
/>
</Form.Item>
</div>
);
} else if (signinItem.name === "Password") {
return (
<div>
<div dangerouslySetInnerHTML={{__html: signinItem.label}} />
{this.renderPasswordOrCodeInput()}
</div>
);
} else if (signinItem.name === "Forgot password?") {
return (
<div>
<div dangerouslySetInnerHTML={{__html: signinItem.label}} />
<div className="login-forget-password">
<Form.Item name="autoSignin" valuePropName="checked" noStyle>
<Checkbox style={{float: "left"}}>
{i18next.t("login:Auto sign in")}
</Checkbox>
</Form.Item>
{
signinItem.visible ? Setting.renderForgetLink(application, i18next.t("login:Forgot password?")) : null
}
</div>
</div>
);
} else if (signinItem.name === "Agreement") {
return AgreementModal.isAgreementRequired(application) ? AgreementModal.renderAgreementFormItem(application, true, {}, this) : null;
} else if (signinItem.name === "Login button") {
return (
<Form.Item className="login-button-box">
<div dangerouslySetInnerHTML={{__html: signinItem.label}} />
<Button
type="primary"
htmlType="submit"
className="login-button"
>
{
this.state.loginMethod === "webAuthn" ? i18next.t("login:Sign in with WebAuthn") :
i18next.t("login:Sign In")
}
</Button>
{
this.renderCaptchaModal(application)
}
</Form.Item>
);
} else if (signinItem.name === "Providers") {
const showForm = Setting.isPasswordEnabled(application) || Setting.isCodeSigninEnabled(application) || Setting.isWebAuthnEnabled(application) || Setting.isLdapEnabled(application);
if (signinItem.rule === "None") {
signinItem.rule = showForm ? "small" : "big";
}
return (
<div>
<div dangerouslySetInnerHTML={{__html: signinItem.label}} />
<Form.Item>
{
application.providers.filter(providerItem => this.isProviderVisible(providerItem)).map(providerItem => {
return ProviderButton.renderProviderLogo(providerItem.provider, application, null, null, signinItem.rule, this.props.location);
})
}
{
this.renderOtherFormProvider(application)
}
</Form.Item>
</div>
);
} else if (signinItem.name.startsWith("Text ") || signinItem?.isCustom) {
return (
<div dangerouslySetInnerHTML={{__html: signinItem.label}} />
);
} else if (signinItem.name === "Signup link") {
return (
<div style={{width: "100%"}} className="login-signup-link">
<div dangerouslySetInnerHTML={{__html: signinItem.label}} />
{this.renderFooter(application)}
</div>
);
}
}
renderForm(application) { renderForm(application) {
if (this.state.msg !== null) { if (this.state.msg !== null) {
return Util.renderMessage(this.state.msg); return Util.renderMessage(this.state.msg);
@ -569,116 +763,10 @@ class LoginPage extends React.Component {
]} ]}
> >
</Form.Item> </Form.Item>
{this.renderMethodChoiceBox()}
<Row style={{minHeight: 130, alignItems: "center"}}>
<Col span={24}>
<Form.Item
name="username"
rules={[
{
required: true,
message: () => {
switch (this.state.loginMethod) {
case "verificationCodeEmail": return i18next.t("login:Please input your Email!");
case "verificationCodePhone": return i18next.t("login:Please input your Phone!");
case "ldap": return i18next.t("login:Please input your LDAP username!");
default: return i18next.t("login:Please input your Email or Phone!");
}
},
},
{
validator: (_, value) => {
if (value === "") {
return Promise.resolve();
}
if (this.state.loginMethod === "verificationCode") { {
if (!Setting.isValidEmail(value) && !Setting.isValidPhone(value)) { application.signinItems?.map(signinItem => this.renderFormItem(application, signinItem))
this.setState({validEmailOrPhone: false}); }
return Promise.reject(i18next.t("login:The input is not valid Email or phone number!"));
}
if (Setting.isValidEmail(value)) {
this.setState({validEmail: true});
} else {
this.setState({validEmail: false});
}
} else if (this.state.loginMethod === "verificationCodeEmail") {
if (!Setting.isValidEmail(value)) {
this.setState({validEmail: false});
this.setState({validEmailOrPhone: false});
return Promise.reject(i18next.t("login:The input is not valid Email!"));
} else {
this.setState({validEmail: true});
}
} else if (this.state.loginMethod === "verificationCodePhone") {
if (!Setting.isValidPhone(value)) {
this.setState({validEmailOrPhone: false});
return Promise.reject(i18next.t("login:The input is not valid phone number!"));
}
}
this.setState({validEmailOrPhone: true});
return Promise.resolve();
},
},
]}
>
<Input
id="input"
prefix={<UserOutlined className="site-form-item-icon" />}
placeholder={this.getPlaceholder()}
onChange={e => {
this.setState({
username: e.target.value,
});
}}
/>
</Form.Item>
</Col>
{
this.renderPasswordOrCodeInput()
}
</Row>
<div style={{display: "inline-flex", justifyContent: "space-between", width: "320px", marginBottom: AgreementModal.isAgreementRequired(application) ? "5px" : "25px"}}>
<Form.Item name="autoSignin" valuePropName="checked" noStyle>
<Checkbox style={{float: "left"}}>
{i18next.t("login:Auto sign in")}
</Checkbox>
</Form.Item>
{
Setting.renderForgetLink(application, i18next.t("login:Forgot password?"))
}
</div>
{AgreementModal.isAgreementRequired(application) ? AgreementModal.renderAgreementFormItem(application, true, {}, this) : null}
<Form.Item>
<Button
type="primary"
htmlType="submit"
style={{width: "100%", marginBottom: "5px"}}
>
{
this.state.loginMethod === "webAuthn" ? i18next.t("login:Sign in with WebAuthn") :
i18next.t("login:Sign In")
}
</Button>
{
this.renderCaptchaModal(application)
}
{
this.renderFooter(application)
}
</Form.Item>
<Form.Item>
{
application.providers.filter(providerItem => this.isProviderVisible(providerItem)).map(providerItem => {
return ProviderButton.renderProviderLogo(providerItem.provider, application, 30, 5, "small", this.props.location);
})
}
{
this.renderOtherFormProvider(application)
}
</Form.Item>
</Form> </Form>
); );
} else { } else {
@ -694,20 +782,7 @@ class LoginPage extends React.Component {
: :
</div> </div>
<br /> <br />
{ {application.signinItems.map(signinItem => signinItem.name === "ThirdParty" || signinItem.name === "Footer" ? this.renderFormItem(application, signinItem) : null)}
application.providers?.filter(providerItem => this.isProviderVisible(providerItem)).map(providerItem => {
return ProviderButton.renderProviderLogo(providerItem.provider, application, 40, 10, "big", this.props.location);
})
}
{
this.renderOtherFormProvider(application)
}
<div>
<br />
{
this.renderFooter(application)
}
</div>
</div> </div>
); );
} }
@ -760,7 +835,7 @@ class LoginPage extends React.Component {
renderFooter(application) { renderFooter(application) {
return ( return (
<span style={{float: "right"}}> <div>
{ {
!application.enableSignUp ? null : ( !application.enableSignUp ? null : (
<React.Fragment> <React.Fragment>
@ -771,7 +846,7 @@ class LoginPage extends React.Component {
</React.Fragment> </React.Fragment>
) )
} }
</span> </div>
); );
} }
@ -889,33 +964,37 @@ class LoginPage extends React.Component {
if (this.state.loginMethod === "password" || this.state.loginMethod === "ldap") { if (this.state.loginMethod === "password" || this.state.loginMethod === "ldap") {
return ( return (
<Col span={24}> <Col span={24}>
<Form.Item <div className="login-password">
name="password" <Form.Item
rules={[{required: true, message: i18next.t("login:Please input your password!")}]} name="password"
> rules={[{required: true, message: i18next.t("login:Please input your password!")}]}
<Input.Password >
prefix={<LockOutlined className="site-form-item-icon" />} <Input.Password
type="password" prefix={<LockOutlined className="site-form-item-icon" />}
placeholder={i18next.t("general:Password")} type="password"
disabled={this.state.loginMethod === "password" ? !Setting.isPasswordEnabled(application) : !Setting.isLdapEnabled(application)} placeholder={i18next.t("general:Password")}
/> disabled={this.state.loginMethod === "password" ? !Setting.isPasswordEnabled(application) : !Setting.isLdapEnabled(application)}
</Form.Item> />
</Form.Item>
</div>
</Col> </Col>
); );
} else if (this.state.loginMethod?.includes("verificationCode")) { } else if (this.state.loginMethod?.includes("verificationCode")) {
return ( return (
<Col span={24}> <Col span={24}>
<Form.Item <div className="login-password">
name="code" <Form.Item
rules={[{required: true, message: i18next.t("login:Please input your code!")}]} name="code"
> rules={[{required: true, message: i18next.t("login:Please input your code!")}]}
<SendCodeInput >
disabled={this.state.username?.length === 0 || !this.state.validEmailOrPhone} <SendCodeInput
method={"login"} disabled={this.state.username?.length === 0 || !this.state.validEmailOrPhone}
onButtonClickArgs={[this.state.username, this.state.validEmail ? "email" : "phone", Setting.getApplicationName(application)]} method={"login"}
application={application} onButtonClickArgs={[this.state.username, this.state.validEmail ? "email" : "phone", Setting.getApplicationName(application)]}
/> application={application}
</Form.Item> />
</Form.Item>
</div>
</Col> </Col>
); );
} else { } else {
@ -952,7 +1031,7 @@ class LoginPage extends React.Component {
if (items.length > 1) { if (items.length > 1) {
return ( return (
<div> <div>
<Tabs items={items} size={"small"} defaultActiveKey={this.getDefaultLoginMethod(application)} onChange={(key) => { <Tabs className="signin-methods" items={items} size={"small"} defaultActiveKey={this.getDefaultLoginMethod(application)} onChange={(key) => {
this.setState({loginMethod: key}); this.setState({loginMethod: key});
}} centered> }} centered>
</Tabs> </Tabs>
@ -1047,10 +1126,10 @@ class LoginPage extends React.Component {
} }
renderBackButton() { renderBackButton() {
if (this.state.orgChoiceMode === "None") { if (this.state.orgChoiceMode === "None" || this.props.preview === "auto") {
return ( return (
<Button type="text" size="large" icon={<ArrowLeftOutlined />} <Button type="text" size="large" icon={<ArrowLeftOutlined />}
style={{top: "65px", left: "15px", position: "absolute"}} className="back-button"
onClick={() => history.back()}> onClick={() => history.back()}>
</Button> </Button>
); );
@ -1099,16 +1178,6 @@ class LoginPage extends React.Component {
<div className="login-form"> <div className="login-form">
<div> <div>
<div> <div>
{
Setting.renderHelmet(application)
}
{
Setting.renderLogo(application)
}
{
this.renderBackButton()
}
<LanguageSelect languages={application.organizationObj.languages} style={{top: "55px", right: "5px", position: "absolute"}} />
{ {
this.renderLoginPanel(application) this.renderLoginPanel(application)
} }

View File

@ -13,7 +13,7 @@
// limitations under the License. // limitations under the License.
import React from "react"; import React from "react";
import {Button, Col, Result, Row, Steps} from "antd"; import {Button, Col, Result, Row, Spin, Steps} from "antd";
import {withRouter} from "react-router-dom"; import {withRouter} from "react-router-dom";
import * as ApplicationBackend from "../backend/ApplicationBackend"; import * as ApplicationBackend from "../backend/ApplicationBackend";
import * as Setting from "../Setting"; import * as Setting from "../Setting";
@ -42,13 +42,20 @@ class MfaSetupPage extends React.Component {
mfaProps: null, mfaProps: null,
mfaType: params.get("mfaType") ?? SmsMfaType, mfaType: params.get("mfaType") ?? SmsMfaType,
isPromptPage: props.isPromptPage || location.state?.from !== undefined, isPromptPage: props.isPromptPage || location.state?.from !== undefined,
loading: false,
}; };
} }
componentDidMount() { componentDidMount() {
this.getApplication(); this.getApplication();
if (this.state.current === 1) { if (this.state.current === 1) {
this.initMfaProps(); this.setState({
loading: true,
});
setTimeout(() => {
this.initMfaProps();
}, 200);
} }
} }
@ -85,6 +92,7 @@ class MfaSetupPage extends React.Component {
if (res.status === "ok") { if (res.status === "ok") {
this.setState({ this.setState({
mfaProps: res.data, mfaProps: res.data,
loading: false,
}); });
} else { } else {
Setting.showMessage("error", i18next.t("mfa:Failed to initiate MFA")); Setting.showMessage("error", i18next.t("mfa:Failed to initiate MFA"));
@ -231,15 +239,17 @@ class MfaSetupPage extends React.Component {
<p style={{textAlign: "center", fontSize: "16px", marginTop: "10px"}}>{i18next.t("mfa:Each time you sign in to your Account, you'll need your password and a authentication code")}</p> <p style={{textAlign: "center", fontSize: "16px", marginTop: "10px"}}>{i18next.t("mfa:Each time you sign in to your Account, you'll need your password and a authentication code")}</p>
</Col> </Col>
</Row> </Row>
<Steps current={this.state.current} <Spin spinning={this.state.loading}>
items={[ <Steps current={this.state.current}
{title: i18next.t("mfa:Verify Password"), icon: <UserOutlined />}, items={[
{title: i18next.t("mfa:Verify Code"), icon: <KeyOutlined />}, {title: i18next.t("mfa:Verify Password"), icon: <UserOutlined />},
{title: i18next.t("general:Enable"), icon: <CheckOutlined />}, {title: i18next.t("mfa:Verify Code"), icon: <KeyOutlined />},
]} {title: i18next.t("general:Enable"), icon: <CheckOutlined />},
style={{width: "90%", maxWidth: "500px", margin: "auto", marginTop: "50px", ]}
}} > style={{width: "90%", maxWidth: "500px", margin: "auto", marginTop: "50px",
</Steps> }} >
</Steps>
</Spin>
</Col> </Col>
<Col span={24} style={{display: "flex", justifyContent: "center"}}> <Col span={24} style={{display: "flex", justifyContent: "center"}}>
<div style={{marginTop: "10px", textAlign: "center"}}> <div style={{marginTop: "10px", textAlign: "center"}}>

View File

@ -377,7 +377,7 @@ export function getProviderLogoWidget(provider) {
} }
} }
export function getAuthUrl(application, provider, method) { export function getAuthUrl(application, provider, method, code) {
if (application === null || provider === null) { if (application === null || provider === null) {
return ""; return "";
} }
@ -418,6 +418,9 @@ export function getAuthUrl(application, provider, method) {
if (navigator.userAgent.includes("MicroMessenger")) { if (navigator.userAgent.includes("MicroMessenger")) {
return `${authInfo[provider.type].mpEndpoint}?appid=${provider.clientId2}&redirect_uri=${redirectUri}&state=${state}&scope=${authInfo[provider.type].mpScope}&response_type=code#wechat_redirect`; return `${authInfo[provider.type].mpEndpoint}?appid=${provider.clientId2}&redirect_uri=${redirectUri}&state=${state}&scope=${authInfo[provider.type].mpScope}&response_type=code#wechat_redirect`;
} else { } else {
if (provider.clientId2 && provider?.disableSsl && provider?.signName === "media") {
return `${window.location.origin}/callback?state=${state}&code=${"wechat_oa:" + code}`;
}
return `${endpoint}?appid=${provider.clientId}&redirect_uri=${redirectUri}&scope=${scope}&response_type=code&state=${state}#wechat_redirect`; return `${endpoint}?appid=${provider.clientId}&redirect_uri=${redirectUri}&scope=${scope}&response_type=code&state=${state}#wechat_redirect`;
} }
} else if (provider.type === "WeCom") { } else if (provider.type === "WeCom") {

View File

@ -159,26 +159,26 @@ export function renderProviderLogo(provider, application, width, margin, size, l
}; };
return ( return (
<a key={provider.displayName} > <a key={provider.displayName} >
<img width={width} height={width} src={getProviderLogoURL(provider)} alt={provider.displayName} style={{margin: margin}} onClick={info} /> <img width={width} height={width} src={getProviderLogoURL(provider)} alt={provider.displayName} className="provider-img" style={{margin: margin}} onClick={info} />
</a> </a>
); );
} else { } else {
return ( return (
<a key={provider.displayName} href={Provider.getAuthUrl(application, provider, "signup")}> <a key={provider.displayName} href={Provider.getAuthUrl(application, provider, "signup")}>
<img width={width} height={width} src={getProviderLogoURL(provider)} alt={provider.displayName} style={{margin: margin}} /> <img width={width} height={width} src={getProviderLogoURL(provider)} alt={provider.displayName} className="provider-img" style={{margin: margin}} />
</a> </a>
); );
} }
} else if (provider.category === "SAML") { } else if (provider.category === "SAML") {
return ( return (
<a key={provider.displayName} onClick={() => goToSamlUrl(provider, location)}> <a key={provider.displayName} onClick={() => goToSamlUrl(provider, location)}>
<img width={width} height={width} src={getProviderLogoURL(provider)} alt={provider.displayName} style={{margin: margin}} /> <img width={width} height={width} src={getProviderLogoURL(provider)} alt={provider.displayName} className="provider-img" style={{margin: margin}} />
</a> </a>
); );
} else if (provider.category === "Web3") { } else if (provider.category === "Web3") {
return ( return (
<a key={provider.displayName} onClick={() => goToWeb3Url(application, provider, "signup")}> <a key={provider.displayName} onClick={() => goToWeb3Url(application, provider, "signup")}>
<img width={width} height={width} src={getProviderLogoURL(provider)} alt={provider.displayName} style={{margin: margin}} /> <img width={width} height={width} src={getProviderLogoURL(provider)} alt={provider.displayName} className="provider-img" style={{margin: margin}} />
</a> </a>
); );
} }
@ -193,7 +193,7 @@ export function renderProviderLogo(provider, application, width, margin, size, l
return ( return (
<a key={provider.displayName} href={Provider.getAuthUrl(application, provider, "signup")} style={customAStyle}> <a key={provider.displayName} href={Provider.getAuthUrl(application, provider, "signup")} style={customAStyle}>
<button style={customButtonStyle}> <button style={customButtonStyle}>
<img width={26} src={getProviderLogoURL(provider)} alt={provider.displayName} style={customImgStyle} /> <img width={26} src={getProviderLogoURL(provider)} alt={provider.displayName} className="provider-img" style={customImgStyle} />
<span style={customSpanStyle}>{text}</span> <span style={customSpanStyle}>{text}</span>
</button> </button>
</a> </a>
@ -202,7 +202,7 @@ export function renderProviderLogo(provider, application, width, margin, size, l
return ( return (
<a key={provider.displayName} onClick={() => goToSamlUrl(provider, location)} style={customAStyle}> <a key={provider.displayName} onClick={() => goToSamlUrl(provider, location)} style={customAStyle}>
<button style={customButtonStyle}> <button style={customButtonStyle}>
<img width={26} src={getProviderLogoURL(provider)} alt={provider.displayName} style={customImgStyle} /> <img width={26} src={getProviderLogoURL(provider)} alt={provider.displayName} className="provider-img" style={customImgStyle} />
<span style={customSpanStyle}>{text}</span> <span style={customSpanStyle}>{text}</span>
</button> </button>
</a> </a>
@ -212,7 +212,7 @@ export function renderProviderLogo(provider, application, width, margin, size, l
// big button, for disable password signin // big button, for disable password signin
if (provider.category === "SAML") { if (provider.category === "SAML") {
return ( return (
<div key={provider.displayName} style={{marginBottom: "10px"}}> <div key={provider.displayName} className="provider-big-img">
<a onClick={() => goToSamlUrl(provider, location)}> <a onClick={() => goToSamlUrl(provider, location)}>
{ {
getSigninButton(provider) getSigninButton(provider)
@ -222,7 +222,7 @@ export function renderProviderLogo(provider, application, width, margin, size, l
); );
} else if (provider.category === "Web3") { } else if (provider.category === "Web3") {
return ( return (
<div key={provider.displayName} style={{marginBottom: "10px"}}> <div key={provider.displayName} className="provider-big-img">
<a onClick={() => goToWeb3Url(application, provider, "signup")}> <a onClick={() => goToWeb3Url(application, provider, "signup")}>
{ {
getSigninButton(provider) getSigninButton(provider)
@ -232,7 +232,7 @@ export function renderProviderLogo(provider, application, width, margin, size, l
); );
} else { } else {
return ( return (
<div key={provider.displayName} style={{marginBottom: "10px"}}> <div key={provider.displayName} className="provider-big-img">
<a href={Provider.getAuthUrl(application, provider, "signup")}> <a href={Provider.getAuthUrl(application, provider, "signup")}>
{ {
getSigninButton(provider) getSigninButton(provider)

View File

@ -192,7 +192,8 @@ export function getEvent(application, provider, ticket) {
getWechatMessageEvent(ticket) getWechatMessageEvent(ticket)
.then(res => { .then(res => {
if (res.data === "SCAN" || res.data === "subscribe") { if (res.data === "SCAN" || res.data === "subscribe") {
Setting.goToLink(Provider.getAuthUrl(application, provider, "signup")); const code = res?.data2;
Setting.goToLink(Provider.getAuthUrl(application, provider, "signup", code));
} }
}); });
} }

View File

@ -81,6 +81,7 @@ export function renderAgreementFormItem(application, required, layout, ths) {
name="agreement" name="agreement"
key="agreement" key="agreement"
valuePropName="checked" valuePropName="checked"
className="login-agreement"
rules={[ rules={[
{ {
required: required, required: required,

View File

@ -22,7 +22,9 @@
"Auto signin - Tooltip": "When a logged-in session exists in Casdoor, it is automatically used for application-side login", "Auto signin - Tooltip": "When a logged-in session exists in Casdoor, it is automatically used for application-side login",
"Background URL": "Background URL", "Background URL": "Background URL",
"Background URL - Tooltip": "URL of the background image used in the login page", "Background URL - Tooltip": "URL of the background image used in the login page",
"Big icon": "Big icon",
"Binding providers": "Binding providers", "Binding providers": "Binding providers",
"CSS style": "CSS style",
"Center": "Center", "Center": "Center",
"Copy SAML metadata URL": "Copy SAML metadata URL", "Copy SAML metadata URL": "Copy SAML metadata URL",
"Copy prompt page URL": "Copy prompt page URL", "Copy prompt page URL": "Copy prompt page URL",
@ -95,11 +97,14 @@
"Sign Up Error": "Sign Up Error", "Sign Up Error": "Sign Up Error",
"Signin": "Signin", "Signin": "Signin",
"Signin (Default True)": "Signin (Default True)", "Signin (Default True)": "Signin (Default True)",
"Signin items": "Signin items",
"Signin items - Tooltip": "Signin items - Tooltip",
"Signin methods": "Signin methods", "Signin methods": "Signin methods",
"Signin methods - Tooltip": "Signin methods - Tooltip", "Signin methods - Tooltip": "Signin methods - Tooltip",
"Signin session": "Signin session", "Signin session": "Signin session",
"Signup items": "Signup items", "Signup items": "Signup items",
"Signup items - Tooltip": "Items for users to fill in when registering new accounts", "Signup items - Tooltip": "Items for users to fill in when registering new accounts",
"Small icon": "Small icon",
"Tags - Tooltip": "Only users with the tag that is listed in the application tags can login", "Tags - Tooltip": "Only users with the tag that is listed in the application tags can login",
"The application does not allow to sign up new account": "The application does not allow to sign up new account", "The application does not allow to sign up new account": "The application does not allow to sign up new account",
"Token expire": "Token expire", "Token expire": "Token expire",
@ -169,6 +174,7 @@
"Adapter - Tooltip": "Table name of the policy store", "Adapter - Tooltip": "Table name of the policy store",
"Adapters": "Adapters", "Adapters": "Adapters",
"Add": "Add", "Add": "Add",
"Add custom item": "Add custom item",
"Admin": "Admin", "Admin": "Admin",
"Affiliation URL": "Affiliation URL", "Affiliation URL": "Affiliation URL",
"Affiliation URL - Tooltip": "The homepage URL for the affiliation", "Affiliation URL - Tooltip": "The homepage URL for the affiliation",
@ -327,6 +333,7 @@
"Signup URL - Tooltip": "Custom URL for the registration page. If not set, the default Casdoor registration page will be used. When set, the registration links on various Casdoor pages will redirect to this URL", "Signup URL - Tooltip": "Custom URL for the registration page. If not set, the default Casdoor registration page will be used. When set, the registration links on various Casdoor pages will redirect to this URL",
"Signup application": "Signup application", "Signup application": "Signup application",
"Signup application - Tooltip": "Which application the user registered through when they signed up", "Signup application - Tooltip": "Which application the user registered through when they signed up",
"Signup link": "Signup link",
"Sorry, the page you visited does not exist.": "Sorry, the page you visited does not exist.", "Sorry, the page you visited does not exist.": "Sorry, the page you visited does not exist.",
"Sorry, the user you visited does not exist or you are not authorized to access this user.": "Sorry, the user you visited does not exist or you are not authorized to access this user.", "Sorry, the user you visited does not exist or you are not authorized to access this user.": "Sorry, the user you visited does not exist or you are not authorized to access this user.",
"Sorry, you do not have permission to access this page or logged in status invalid.": "Sorry, you do not have permission to access this page or logged in status invalid.", "Sorry, you do not have permission to access this page or logged in status invalid.": "Sorry, you do not have permission to access this page or logged in status invalid.",
@ -431,6 +438,7 @@
}, },
"login": { "login": {
"Auto sign in": "Auto sign in", "Auto sign in": "Auto sign in",
"Back button": "Back button",
"Continue with": "Continue with", "Continue with": "Continue with",
"Email": "Email", "Email": "Email",
"Email or phone": "Email or phone", "Email or phone": "Email or phone",
@ -441,6 +449,7 @@
"LDAP username, Email or phone": "LDAP username, Email or phone", "LDAP username, Email or phone": "LDAP username, Email or phone",
"Loading": "Loading", "Loading": "Loading",
"Logging out...": "Logging out...", "Logging out...": "Logging out...",
"Login button": "Login button",
"MetaMask plugin not detected": "MetaMask plugin not detected", "MetaMask plugin not detected": "MetaMask plugin not detected",
"No account?": "No account?", "No account?": "No account?",
"Or sign in with another account": "Or sign in with another account", "Or sign in with another account": "Or sign in with another account",
@ -725,11 +734,11 @@
"Email content - Tooltip": "Content of the Email", "Email content - Tooltip": "Content of the Email",
"Email title": "Email title", "Email title": "Email title",
"Email title - Tooltip": "Title of the email", "Email title - Tooltip": "Title of the email",
"Enable QR code": "Enable QR code",
"Enable QR code - Tooltip": "Whether to allow scanning QR code to login",
"Endpoint": "Endpoint", "Endpoint": "Endpoint",
"Endpoint (Intranet)": "Endpoint (Intranet)", "Endpoint (Intranet)": "Endpoint (Intranet)",
"Endpoint - Tooltip": "Endpoint - Tooltip", "Endpoint - Tooltip": "Endpoint - Tooltip",
"Follow-up action": "Follow-up action",
"Follow-up action - Tooltip": "If you choose \"Use WeChat Open Platform to login\", users need to login on the WeChat Open Platform after following the wechat official account.",
"From address": "From address", "From address": "From address",
"From address - Tooltip": "Email address of \"From\"", "From address - Tooltip": "Email address of \"From\"",
"From name": "From name", "From name": "From name",
@ -835,6 +844,10 @@
"Token URL - Tooltip": "Token URL", "Token URL - Tooltip": "Token URL",
"Type": "Type", "Type": "Type",
"Type - Tooltip": "Select a type", "Type - Tooltip": "Select a type",
"Use WeChat Media Platform in PC": "Use WeChat Media Platform in PC",
"Use WeChat Media Platform in PC - Tooltip": "Whether to allow scanning QR code to login",
"Use WeChat Media Platform to login": "Use WeChat Media Platform to login",
"Use WeChat Open Platform to login": "Use WeChat Open Platform to login",
"User flow": "User flow", "User flow": "User flow",
"User flow - Tooltip": "User flow - Tooltip", "User flow - Tooltip": "User flow - Tooltip",
"User mapping": "User mapping", "User mapping": "User mapping",

View File

@ -22,7 +22,9 @@
"Auto signin - Tooltip": "Wenn eine angemeldete Session in Casdoor vorhanden ist, wird diese automatisch für die Anmeldung auf Anwendungsebene verwendet", "Auto signin - Tooltip": "Wenn eine angemeldete Session in Casdoor vorhanden ist, wird diese automatisch für die Anmeldung auf Anwendungsebene verwendet",
"Background URL": "Background-URL", "Background URL": "Background-URL",
"Background URL - Tooltip": "URL des Hintergrundbildes, das auf der Anmeldeseite angezeigt wird", "Background URL - Tooltip": "URL des Hintergrundbildes, das auf der Anmeldeseite angezeigt wird",
"Big icon": "Big icon",
"Binding providers": "Binding providers", "Binding providers": "Binding providers",
"CSS style": "CSS style",
"Center": "Zentrum", "Center": "Zentrum",
"Copy SAML metadata URL": "SAML-Metadaten-URL kopieren", "Copy SAML metadata URL": "SAML-Metadaten-URL kopieren",
"Copy prompt page URL": "URL der Prompt-Seite kopieren", "Copy prompt page URL": "URL der Prompt-Seite kopieren",
@ -95,11 +97,14 @@
"Sign Up Error": "Registrierungsfehler", "Sign Up Error": "Registrierungsfehler",
"Signin": "Signin", "Signin": "Signin",
"Signin (Default True)": "Signin (Default True)", "Signin (Default True)": "Signin (Default True)",
"Signin items": "Signin items",
"Signin items - Tooltip": "Signin items - Tooltip",
"Signin methods": "Signin methods", "Signin methods": "Signin methods",
"Signin methods - Tooltip": "Signin methods - Tooltip", "Signin methods - Tooltip": "Signin methods - Tooltip",
"Signin session": "Anmeldesession", "Signin session": "Anmeldesession",
"Signup items": "Registrierungs Items", "Signup items": "Registrierungs Items",
"Signup items - Tooltip": "Items, die Benutzer ausfüllen müssen, wenn sie neue Konten registrieren", "Signup items - Tooltip": "Items, die Benutzer ausfüllen müssen, wenn sie neue Konten registrieren",
"Small icon": "Small icon",
"Tags - Tooltip": "Only users with the tag that is listed in the application tags can login", "Tags - Tooltip": "Only users with the tag that is listed in the application tags can login",
"The application does not allow to sign up new account": "Die Anwendung erlaubt es nicht, ein neues Konto zu registrieren", "The application does not allow to sign up new account": "Die Anwendung erlaubt es nicht, ein neues Konto zu registrieren",
"Token expire": "Token läuft ab", "Token expire": "Token läuft ab",
@ -169,6 +174,7 @@
"Adapter - Tooltip": "Tabellenname des Policy Stores", "Adapter - Tooltip": "Tabellenname des Policy Stores",
"Adapters": "Adapter", "Adapters": "Adapter",
"Add": "Hinzufügen", "Add": "Hinzufügen",
"Add custom item": "Add custom item",
"Admin": "Admin", "Admin": "Admin",
"Affiliation URL": "Zugehörigkeits-URL", "Affiliation URL": "Zugehörigkeits-URL",
"Affiliation URL - Tooltip": "Die Homepage-URL für die Zugehörigkeit", "Affiliation URL - Tooltip": "Die Homepage-URL für die Zugehörigkeit",
@ -327,6 +333,7 @@
"Signup URL - Tooltip": "Benutzerdefinierte URL für die Registrierungsseite. Wenn nicht festgelegt, wird die standardmäßige Casdoor-Registrierungsseite verwendet. Wenn sie festgelegt wird, werden die Registrierungslinks auf verschiedenen Casdoor-Seiten auf diese URL umgeleitet", "Signup URL - Tooltip": "Benutzerdefinierte URL für die Registrierungsseite. Wenn nicht festgelegt, wird die standardmäßige Casdoor-Registrierungsseite verwendet. Wenn sie festgelegt wird, werden die Registrierungslinks auf verschiedenen Casdoor-Seiten auf diese URL umgeleitet",
"Signup application": "Anmeldeanwendung", "Signup application": "Anmeldeanwendung",
"Signup application - Tooltip": "Durch welche Anwendung hat sich der Benutzer angemeldet, als er sich registriert hat?", "Signup application - Tooltip": "Durch welche Anwendung hat sich der Benutzer angemeldet, als er sich registriert hat?",
"Signup link": "Signup link",
"Sorry, the page you visited does not exist.": "Entschuldigung, die von Ihnen besuchte Seite existiert nicht.", "Sorry, the page you visited does not exist.": "Entschuldigung, die von Ihnen besuchte Seite existiert nicht.",
"Sorry, the user you visited does not exist or you are not authorized to access this user.": "Entschuldigung, der von Ihnen besuchte Benutzer existiert nicht oder Sie sind nicht autorisiert, auf diesen Benutzer zuzugreifen.", "Sorry, the user you visited does not exist or you are not authorized to access this user.": "Entschuldigung, der von Ihnen besuchte Benutzer existiert nicht oder Sie sind nicht autorisiert, auf diesen Benutzer zuzugreifen.",
"Sorry, you do not have permission to access this page or logged in status invalid.": "Es tut uns leid, aber Sie haben keine Berechtigung, auf diese Seite zuzugreifen, oder Sie sind nicht angemeldet.", "Sorry, you do not have permission to access this page or logged in status invalid.": "Es tut uns leid, aber Sie haben keine Berechtigung, auf diese Seite zuzugreifen, oder Sie sind nicht angemeldet.",
@ -431,6 +438,7 @@
}, },
"login": { "login": {
"Auto sign in": "Automatische Anmeldung", "Auto sign in": "Automatische Anmeldung",
"Back button": "Back button",
"Continue with": "Weitermachen mit", "Continue with": "Weitermachen mit",
"Email": "Email", "Email": "Email",
"Email or phone": "E-Mail oder Telefon", "Email or phone": "E-Mail oder Telefon",
@ -441,6 +449,7 @@
"LDAP username, Email or phone": "LDAP username, Email or phone", "LDAP username, Email or phone": "LDAP username, Email or phone",
"Loading": "Laden", "Loading": "Laden",
"Logging out...": "Ausloggen...", "Logging out...": "Ausloggen...",
"Login button": "Login button",
"MetaMask plugin not detected": "MetaMask plugin not detected", "MetaMask plugin not detected": "MetaMask plugin not detected",
"No account?": "Kein Konto?", "No account?": "Kein Konto?",
"Or sign in with another account": "Oder mit einem anderen Konto anmelden", "Or sign in with another account": "Oder mit einem anderen Konto anmelden",
@ -725,11 +734,11 @@
"Email content - Tooltip": "Inhalt der E-Mail", "Email content - Tooltip": "Inhalt der E-Mail",
"Email title": "Email-Titel", "Email title": "Email-Titel",
"Email title - Tooltip": "Betreff der E-Mail", "Email title - Tooltip": "Betreff der E-Mail",
"Enable QR code": "QR-Code aktivieren",
"Enable QR code - Tooltip": "Ob das Scannen von QR-Codes zum Einloggen aktiviert werden soll",
"Endpoint": "Endpunkt", "Endpoint": "Endpunkt",
"Endpoint (Intranet)": "Endpunkt (Intranet)", "Endpoint (Intranet)": "Endpunkt (Intranet)",
"Endpoint - Tooltip": "Endpoint - Tooltip", "Endpoint - Tooltip": "Endpoint - Tooltip",
"Follow-up action": "Follow-up action",
"Follow-up action - Tooltip": "If you choose \"Use WeChat Open Platform to login\", users need to login on the WeChat Open Platform after following the wechat official account.",
"From address": "From address", "From address": "From address",
"From address - Tooltip": "From address - Tooltip", "From address - Tooltip": "From address - Tooltip",
"From name": "From name", "From name": "From name",
@ -835,6 +844,10 @@
"Token URL - Tooltip": "Token-URL", "Token URL - Tooltip": "Token-URL",
"Type": "Typ", "Type": "Typ",
"Type - Tooltip": "Wählen Sie einen Typ aus", "Type - Tooltip": "Wählen Sie einen Typ aus",
"Use WeChat Media Platform in PC": "Use WeChat Media Platform in PC",
"Use WeChat Media Platform in PC - Tooltip": "Whether to allow scanning WeChat Media Platform QR code to login",
"Use WeChat Media Platform to login": "Use WeChat Media Platform to login",
"Use WeChat Open Platform to login": "Use WeChat Open Platform to login",
"User flow": "User flow", "User flow": "User flow",
"User flow - Tooltip": "User flow - Tooltip", "User flow - Tooltip": "User flow - Tooltip",
"User mapping": "User mapping", "User mapping": "User mapping",

View File

@ -22,7 +22,9 @@
"Auto signin - Tooltip": "When a logged-in session exists in Casdoor, it is automatically used for application-side login", "Auto signin - Tooltip": "When a logged-in session exists in Casdoor, it is automatically used for application-side login",
"Background URL": "Background URL", "Background URL": "Background URL",
"Background URL - Tooltip": "URL of the background image used in the login page", "Background URL - Tooltip": "URL of the background image used in the login page",
"Big icon": "Big icon",
"Binding providers": "Binding providers", "Binding providers": "Binding providers",
"CSS style": "CSS style",
"Center": "Center", "Center": "Center",
"Copy SAML metadata URL": "Copy SAML metadata URL", "Copy SAML metadata URL": "Copy SAML metadata URL",
"Copy prompt page URL": "Copy prompt page URL", "Copy prompt page URL": "Copy prompt page URL",
@ -95,11 +97,14 @@
"Sign Up Error": "Sign Up Error", "Sign Up Error": "Sign Up Error",
"Signin": "Signin", "Signin": "Signin",
"Signin (Default True)": "Signin (Default True)", "Signin (Default True)": "Signin (Default True)",
"Signin items": "Signin items",
"Signin items - Tooltip": "Items for users to fill in when signing up",
"Signin methods": "Signin methods", "Signin methods": "Signin methods",
"Signin methods - Tooltip": "Signin methods - Tooltip", "Signin methods - Tooltip": "Signin methods - Tooltip",
"Signin session": "Signin session", "Signin session": "Signin session",
"Signup items": "Signup items", "Signup items": "Signup items",
"Signup items - Tooltip": "Items for users to fill in when registering new accounts", "Signup items - Tooltip": "Items for users to fill in when registering new accounts",
"Small icon": "Small icon",
"Tags - Tooltip": "Only users with the tag that is listed in the application tags can login", "Tags - Tooltip": "Only users with the tag that is listed in the application tags can login",
"The application does not allow to sign up new account": "The application does not allow to sign up new account", "The application does not allow to sign up new account": "The application does not allow to sign up new account",
"Token expire": "Token expire", "Token expire": "Token expire",
@ -169,6 +174,7 @@
"Adapter - Tooltip": "Table name of the policy store", "Adapter - Tooltip": "Table name of the policy store",
"Adapters": "Adapters", "Adapters": "Adapters",
"Add": "Add", "Add": "Add",
"Add custom item": "Add custom item",
"Admin": "Admin", "Admin": "Admin",
"Affiliation URL": "Affiliation URL", "Affiliation URL": "Affiliation URL",
"Affiliation URL - Tooltip": "The homepage URL for the affiliation", "Affiliation URL - Tooltip": "The homepage URL for the affiliation",
@ -327,6 +333,7 @@
"Signup URL - Tooltip": "Custom URL for the registration page. If not set, the default Casdoor registration page will be used. When set, the registration links on various Casdoor pages will redirect to this URL", "Signup URL - Tooltip": "Custom URL for the registration page. If not set, the default Casdoor registration page will be used. When set, the registration links on various Casdoor pages will redirect to this URL",
"Signup application": "Signup application", "Signup application": "Signup application",
"Signup application - Tooltip": "Which application the user registered through when they signed up", "Signup application - Tooltip": "Which application the user registered through when they signed up",
"Signup link": "Signup link",
"Sorry, the page you visited does not exist.": "Sorry, the page you visited does not exist.", "Sorry, the page you visited does not exist.": "Sorry, the page you visited does not exist.",
"Sorry, the user you visited does not exist or you are not authorized to access this user.": "Sorry, the user you visited does not exist or you are not authorized to access this user.", "Sorry, the user you visited does not exist or you are not authorized to access this user.": "Sorry, the user you visited does not exist or you are not authorized to access this user.",
"Sorry, you do not have permission to access this page or logged in status invalid.": "Sorry, you do not have permission to access this page or logged in status invalid.", "Sorry, you do not have permission to access this page or logged in status invalid.": "Sorry, you do not have permission to access this page or logged in status invalid.",
@ -431,6 +438,7 @@
}, },
"login": { "login": {
"Auto sign in": "Auto sign in", "Auto sign in": "Auto sign in",
"Back button": "Back button",
"Continue with": "Continue with", "Continue with": "Continue with",
"Email": "Email", "Email": "Email",
"Email or phone": "Email or phone", "Email or phone": "Email or phone",
@ -441,6 +449,7 @@
"LDAP username, Email or phone": "LDAP username, Email or phone", "LDAP username, Email or phone": "LDAP username, Email or phone",
"Loading": "Loading", "Loading": "Loading",
"Logging out...": "Logging out...", "Logging out...": "Logging out...",
"Login button": "Login button",
"MetaMask plugin not detected": "MetaMask plugin not detected", "MetaMask plugin not detected": "MetaMask plugin not detected",
"No account?": "No account?", "No account?": "No account?",
"Or sign in with another account": "Or sign in with another account", "Or sign in with another account": "Or sign in with another account",
@ -725,11 +734,11 @@
"Email content - Tooltip": "Content of the Email", "Email content - Tooltip": "Content of the Email",
"Email title": "Email title", "Email title": "Email title",
"Email title - Tooltip": "Title of the email", "Email title - Tooltip": "Title of the email",
"Enable QR code": "Enable QR code",
"Enable QR code - Tooltip": "Whether to allow scanning QR code to login",
"Endpoint": "Endpoint", "Endpoint": "Endpoint",
"Endpoint (Intranet)": "Endpoint (Intranet)", "Endpoint (Intranet)": "Endpoint (Intranet)",
"Endpoint - Tooltip": "Endpoint - Tooltip", "Endpoint - Tooltip": "Endpoint - Tooltip",
"Follow-up action": "Follow-up action",
"Follow-up action - Tooltip": "If you choose \"Use WeChat Open Platform to login\", users need to login on the WeChat Open Platform after following the wechat official account.",
"From address": "From address", "From address": "From address",
"From address - Tooltip": "Email address of \"From\"", "From address - Tooltip": "Email address of \"From\"",
"From name": "From name", "From name": "From name",
@ -835,6 +844,10 @@
"Token URL - Tooltip": "Token URL", "Token URL - Tooltip": "Token URL",
"Type": "Type", "Type": "Type",
"Type - Tooltip": "Select a type", "Type - Tooltip": "Select a type",
"Use WeChat Media Platform in PC": "Use WeChat Media Platform in PC",
"Use WeChat Media Platform in PC - Tooltip": "Whether to allow scanning WeChat Media Platform QR code to login",
"Use WeChat Media Platform to login": "Use WeChat Media Platform to login",
"Use WeChat Open Platform to login": "Use WeChat Open Platform to login",
"User flow": "User flow", "User flow": "User flow",
"User flow - Tooltip": "User flow", "User flow - Tooltip": "User flow",
"User mapping": "User mapping", "User mapping": "User mapping",

View File

@ -22,7 +22,9 @@
"Auto signin - Tooltip": "Cuando existe una sesión iniciada en Casdoor, se utiliza automáticamente para el inicio de sesión del lado de la aplicación", "Auto signin - Tooltip": "Cuando existe una sesión iniciada en Casdoor, se utiliza automáticamente para el inicio de sesión del lado de la aplicación",
"Background URL": "URL de fondo", "Background URL": "URL de fondo",
"Background URL - Tooltip": "URL de la imagen de fondo utilizada en la página de inicio de sesión", "Background URL - Tooltip": "URL de la imagen de fondo utilizada en la página de inicio de sesión",
"Big icon": "Big icon",
"Binding providers": "Binding providers", "Binding providers": "Binding providers",
"CSS style": "CSS style",
"Center": "Centro", "Center": "Centro",
"Copy SAML metadata URL": "Copia la URL de metadatos SAML", "Copy SAML metadata URL": "Copia la URL de metadatos SAML",
"Copy prompt page URL": "Copiar URL de la página del prompt", "Copy prompt page URL": "Copiar URL de la página del prompt",
@ -95,11 +97,14 @@
"Sign Up Error": "Error de registro", "Sign Up Error": "Error de registro",
"Signin": "Signin", "Signin": "Signin",
"Signin (Default True)": "Signin (Default True)", "Signin (Default True)": "Signin (Default True)",
"Signin items": "Signin items",
"Signin items - Tooltip": "Signin items - Tooltip",
"Signin methods": "Signin methods", "Signin methods": "Signin methods",
"Signin methods - Tooltip": "Signin methods - Tooltip", "Signin methods - Tooltip": "Signin methods - Tooltip",
"Signin session": "Sesión de inicio de sesión", "Signin session": "Sesión de inicio de sesión",
"Signup items": "Artículos de registro", "Signup items": "Artículos de registro",
"Signup items - Tooltip": "Elementos para que los usuarios los completen al registrar nuevas cuentas", "Signup items - Tooltip": "Elementos para que los usuarios los completen al registrar nuevas cuentas",
"Small icon": "Small icon",
"Tags - Tooltip": "Only users with the tag that is listed in the application tags can login", "Tags - Tooltip": "Only users with the tag that is listed in the application tags can login",
"The application does not allow to sign up new account": "La aplicación no permite registrarse una cuenta nueva", "The application does not allow to sign up new account": "La aplicación no permite registrarse una cuenta nueva",
"Token expire": "Token expirado", "Token expire": "Token expirado",
@ -169,6 +174,7 @@
"Adapter - Tooltip": "Nombre de la tabla de la tienda de políticas", "Adapter - Tooltip": "Nombre de la tabla de la tienda de políticas",
"Adapters": "Adaptadores", "Adapters": "Adaptadores",
"Add": "Añadir", "Add": "Añadir",
"Add custom item": "Add custom item",
"Admin": "Admin", "Admin": "Admin",
"Affiliation URL": "URL de afiliación", "Affiliation URL": "URL de afiliación",
"Affiliation URL - Tooltip": "La URL de la página de inicio para la afiliación", "Affiliation URL - Tooltip": "La URL de la página de inicio para la afiliación",
@ -327,6 +333,7 @@
"Signup URL - Tooltip": "URL personalizado para la página de registro. Si no se establece, se usará la página de registro predeterminada de Casdoor. Cuando se establece, los enlaces de registro en varias páginas de Casdoor redirigirán a esta URL", "Signup URL - Tooltip": "URL personalizado para la página de registro. Si no se establece, se usará la página de registro predeterminada de Casdoor. Cuando se establece, los enlaces de registro en varias páginas de Casdoor redirigirán a esta URL",
"Signup application": "Solicitud de registro", "Signup application": "Solicitud de registro",
"Signup application - Tooltip": "¿A través de qué aplicación se registró el usuario cuando se inscribió?", "Signup application - Tooltip": "¿A través de qué aplicación se registró el usuario cuando se inscribió?",
"Signup link": "Signup link",
"Sorry, the page you visited does not exist.": "Lo siento, la página que visitaste no existe.", "Sorry, the page you visited does not exist.": "Lo siento, la página que visitaste no existe.",
"Sorry, the user you visited does not exist or you are not authorized to access this user.": "Lo siento, el usuario que visitaste no existe o no estás autorizado a acceder a este usuario.", "Sorry, the user you visited does not exist or you are not authorized to access this user.": "Lo siento, el usuario que visitaste no existe o no estás autorizado a acceder a este usuario.",
"Sorry, you do not have permission to access this page or logged in status invalid.": "Lo siento, no tiene permiso para acceder a esta página o su estado de inicio de sesión es inválido.", "Sorry, you do not have permission to access this page or logged in status invalid.": "Lo siento, no tiene permiso para acceder a esta página o su estado de inicio de sesión es inválido.",
@ -431,6 +438,7 @@
}, },
"login": { "login": {
"Auto sign in": "Inicio de sesión automático", "Auto sign in": "Inicio de sesión automático",
"Back button": "Back button",
"Continue with": "Continúe con", "Continue with": "Continúe con",
"Email": "Email", "Email": "Email",
"Email or phone": "Correo electrónico o teléfono", "Email or phone": "Correo electrónico o teléfono",
@ -441,6 +449,7 @@
"LDAP username, Email or phone": "LDAP username, Email or phone", "LDAP username, Email or phone": "LDAP username, Email or phone",
"Loading": "Cargando", "Loading": "Cargando",
"Logging out...": "Cerrando sesión...", "Logging out...": "Cerrando sesión...",
"Login button": "Login button",
"MetaMask plugin not detected": "MetaMask plugin not detected", "MetaMask plugin not detected": "MetaMask plugin not detected",
"No account?": "¿No tienes cuenta?", "No account?": "¿No tienes cuenta?",
"Or sign in with another account": "O inicia sesión con otra cuenta", "Or sign in with another account": "O inicia sesión con otra cuenta",
@ -725,11 +734,11 @@
"Email content - Tooltip": "Contenido del correo electrónico", "Email content - Tooltip": "Contenido del correo electrónico",
"Email title": "Título del correo electrónico", "Email title": "Título del correo electrónico",
"Email title - Tooltip": "Título del correo electrónico", "Email title - Tooltip": "Título del correo electrónico",
"Enable QR code": "Habilitar código QR",
"Enable QR code - Tooltip": "Si permitir el escaneo de códigos QR para acceder",
"Endpoint": "Punto final", "Endpoint": "Punto final",
"Endpoint (Intranet)": "Punto final (intranet)", "Endpoint (Intranet)": "Punto final (intranet)",
"Endpoint - Tooltip": "Endpoint - Tooltip", "Endpoint - Tooltip": "Endpoint - Tooltip",
"Follow-up action": "Follow-up action",
"Follow-up action - Tooltip": "If you choose \"Use WeChat Open Platform to login\", users need to login on the WeChat Open Platform after following the wechat official account.",
"From address": "From address", "From address": "From address",
"From address - Tooltip": "From address - Tooltip", "From address - Tooltip": "From address - Tooltip",
"From name": "From name", "From name": "From name",
@ -835,6 +844,10 @@
"Token URL - Tooltip": "URL de token", "Token URL - Tooltip": "URL de token",
"Type": "Tipo", "Type": "Tipo",
"Type - Tooltip": "Seleccionar un tipo", "Type - Tooltip": "Seleccionar un tipo",
"Use WeChat Media Platform in PC": "Use WeChat Media Platform in PC",
"Use WeChat Media Platform in PC - Tooltip": "Whether to allow scanning WeChat Media Platform QR code to login",
"Use WeChat Media Platform to login": "Use WeChat Media Platform to login",
"Use WeChat Open Platform to login": "Use WeChat Open Platform to login",
"User flow": "User flow", "User flow": "User flow",
"User flow - Tooltip": "User flow - Tooltip", "User flow - Tooltip": "User flow - Tooltip",
"User mapping": "User mapping", "User mapping": "User mapping",

View File

@ -22,7 +22,9 @@
"Auto signin - Tooltip": "When a logged-in session exists in Casdoor, it is automatically used for application-side login", "Auto signin - Tooltip": "When a logged-in session exists in Casdoor, it is automatically used for application-side login",
"Background URL": "Background URL", "Background URL": "Background URL",
"Background URL - Tooltip": "URL of the background image used in the login page", "Background URL - Tooltip": "URL of the background image used in the login page",
"Big icon": "Big icon",
"Binding providers": "Binding providers", "Binding providers": "Binding providers",
"CSS style": "CSS style",
"Center": "Center", "Center": "Center",
"Copy SAML metadata URL": "Copy SAML metadata URL", "Copy SAML metadata URL": "Copy SAML metadata URL",
"Copy prompt page URL": "Copy prompt page URL", "Copy prompt page URL": "Copy prompt page URL",
@ -95,11 +97,14 @@
"Sign Up Error": "Sign Up Error", "Sign Up Error": "Sign Up Error",
"Signin": "Signin", "Signin": "Signin",
"Signin (Default True)": "Signin (Default True)", "Signin (Default True)": "Signin (Default True)",
"Signin items": "Signin items",
"Signin items - Tooltip": "Signin items - Tooltip",
"Signin methods": "Signin methods", "Signin methods": "Signin methods",
"Signin methods - Tooltip": "Signin methods - Tooltip", "Signin methods - Tooltip": "Signin methods - Tooltip",
"Signin session": "Signin session", "Signin session": "Signin session",
"Signup items": "Signup items", "Signup items": "Signup items",
"Signup items - Tooltip": "Items for users to fill in when registering new accounts", "Signup items - Tooltip": "Items for users to fill in when registering new accounts",
"Small icon": "Small icon",
"Tags - Tooltip": "Only users with the tag that is listed in the application tags can login", "Tags - Tooltip": "Only users with the tag that is listed in the application tags can login",
"The application does not allow to sign up new account": "The application does not allow to sign up new account", "The application does not allow to sign up new account": "The application does not allow to sign up new account",
"Token expire": "Token expire", "Token expire": "Token expire",
@ -169,6 +174,7 @@
"Adapter - Tooltip": "Table name of the policy store", "Adapter - Tooltip": "Table name of the policy store",
"Adapters": "Adapters", "Adapters": "Adapters",
"Add": "Add", "Add": "Add",
"Add custom item": "Add custom item",
"Admin": "Admin", "Admin": "Admin",
"Affiliation URL": "Affiliation URL", "Affiliation URL": "Affiliation URL",
"Affiliation URL - Tooltip": "The homepage URL for the affiliation", "Affiliation URL - Tooltip": "The homepage URL for the affiliation",
@ -327,6 +333,7 @@
"Signup URL - Tooltip": "Custom URL for the registration page. If not set, the default Casdoor registration page will be used. When set, the registration links on various Casdoor pages will redirect to this URL", "Signup URL - Tooltip": "Custom URL for the registration page. If not set, the default Casdoor registration page will be used. When set, the registration links on various Casdoor pages will redirect to this URL",
"Signup application": "Signup application", "Signup application": "Signup application",
"Signup application - Tooltip": "Which application the user registered through when they signed up", "Signup application - Tooltip": "Which application the user registered through when they signed up",
"Signup link": "Signup link",
"Sorry, the page you visited does not exist.": "Sorry, the page you visited does not exist.", "Sorry, the page you visited does not exist.": "Sorry, the page you visited does not exist.",
"Sorry, the user you visited does not exist or you are not authorized to access this user.": "Sorry, the user you visited does not exist or you are not authorized to access this user.", "Sorry, the user you visited does not exist or you are not authorized to access this user.": "Sorry, the user you visited does not exist or you are not authorized to access this user.",
"Sorry, you do not have permission to access this page or logged in status invalid.": "Sorry, you do not have permission to access this page or logged in status invalid.", "Sorry, you do not have permission to access this page or logged in status invalid.": "Sorry, you do not have permission to access this page or logged in status invalid.",
@ -431,6 +438,7 @@
}, },
"login": { "login": {
"Auto sign in": "Auto sign in", "Auto sign in": "Auto sign in",
"Back button": "Back button",
"Continue with": "Continue with", "Continue with": "Continue with",
"Email": "Email", "Email": "Email",
"Email or phone": "Email or phone", "Email or phone": "Email or phone",
@ -441,6 +449,7 @@
"LDAP username, Email or phone": "LDAP username, Email or phone", "LDAP username, Email or phone": "LDAP username, Email or phone",
"Loading": "Loading", "Loading": "Loading",
"Logging out...": "Logging out...", "Logging out...": "Logging out...",
"Login button": "Login button",
"MetaMask plugin not detected": "MetaMask plugin not detected", "MetaMask plugin not detected": "MetaMask plugin not detected",
"No account?": "No account?", "No account?": "No account?",
"Or sign in with another account": "Or sign in with another account", "Or sign in with another account": "Or sign in with another account",
@ -725,11 +734,11 @@
"Email content - Tooltip": "Content of the Email", "Email content - Tooltip": "Content of the Email",
"Email title": "Email title", "Email title": "Email title",
"Email title - Tooltip": "Title of the email", "Email title - Tooltip": "Title of the email",
"Enable QR code": "Enable QR code",
"Enable QR code - Tooltip": "Whether to allow scanning QR code to login",
"Endpoint": "Endpoint", "Endpoint": "Endpoint",
"Endpoint (Intranet)": "Endpoint (Intranet)", "Endpoint (Intranet)": "Endpoint (Intranet)",
"Endpoint - Tooltip": "Endpoint - Tooltip", "Endpoint - Tooltip": "Endpoint - Tooltip",
"Follow-up action": "Follow-up action",
"Follow-up action - Tooltip": "If you choose \"Use WeChat Open Platform to login\", users need to login on the WeChat Open Platform after following the wechat official account.",
"From address": "From address", "From address": "From address",
"From address - Tooltip": "Email address of \"From\"", "From address - Tooltip": "Email address of \"From\"",
"From name": "From name", "From name": "From name",
@ -835,6 +844,10 @@
"Token URL - Tooltip": "Token URL", "Token URL - Tooltip": "Token URL",
"Type": "Type", "Type": "Type",
"Type - Tooltip": "Select a type", "Type - Tooltip": "Select a type",
"Use WeChat Media Platform in PC": "Use WeChat Media Platform in PC",
"Use WeChat Media Platform in PC - Tooltip": "Whether to allow scanning WeChat Media Platform QR code to login",
"Use WeChat Media Platform to login": "Use WeChat Media Platform to login",
"Use WeChat Open Platform to login": "Use WeChat Open Platform to login",
"User flow": "User flow", "User flow": "User flow",
"User flow - Tooltip": "User flow - Tooltip", "User flow - Tooltip": "User flow - Tooltip",
"User mapping": "User mapping", "User mapping": "User mapping",

View File

@ -22,7 +22,9 @@
"Auto signin - Tooltip": "When a logged-in session exists in Casdoor, it is automatically used for application-side login", "Auto signin - Tooltip": "When a logged-in session exists in Casdoor, it is automatically used for application-side login",
"Background URL": "Background URL", "Background URL": "Background URL",
"Background URL - Tooltip": "URL of the background image used in the login page", "Background URL - Tooltip": "URL of the background image used in the login page",
"Big icon": "Big icon",
"Binding providers": "Binding providers", "Binding providers": "Binding providers",
"CSS style": "CSS style",
"Center": "Center", "Center": "Center",
"Copy SAML metadata URL": "Copy SAML metadata URL", "Copy SAML metadata URL": "Copy SAML metadata URL",
"Copy prompt page URL": "Copy prompt page URL", "Copy prompt page URL": "Copy prompt page URL",
@ -95,11 +97,14 @@
"Sign Up Error": "Sign Up Error", "Sign Up Error": "Sign Up Error",
"Signin": "Signin", "Signin": "Signin",
"Signin (Default True)": "Signin (Default True)", "Signin (Default True)": "Signin (Default True)",
"Signin items": "Signin items",
"Signin items - Tooltip": "Signin items - Tooltip",
"Signin methods": "Signin methods", "Signin methods": "Signin methods",
"Signin methods - Tooltip": "Signin methods - Tooltip", "Signin methods - Tooltip": "Signin methods - Tooltip",
"Signin session": "Signin session", "Signin session": "Signin session",
"Signup items": "Signup items", "Signup items": "Signup items",
"Signup items - Tooltip": "Items for users to fill in when registering new accounts", "Signup items - Tooltip": "Items for users to fill in when registering new accounts",
"Small icon": "Small icon",
"Tags - Tooltip": "Only users with the tag that is listed in the application tags can login", "Tags - Tooltip": "Only users with the tag that is listed in the application tags can login",
"The application does not allow to sign up new account": "The application does not allow to sign up new account", "The application does not allow to sign up new account": "The application does not allow to sign up new account",
"Token expire": "Token expire", "Token expire": "Token expire",
@ -169,6 +174,7 @@
"Adapter - Tooltip": "Table name of the policy store", "Adapter - Tooltip": "Table name of the policy store",
"Adapters": "Adapters", "Adapters": "Adapters",
"Add": "Add", "Add": "Add",
"Add custom item": "Add custom item",
"Admin": "Admin", "Admin": "Admin",
"Affiliation URL": "Affiliation URL", "Affiliation URL": "Affiliation URL",
"Affiliation URL - Tooltip": "The homepage URL for the affiliation", "Affiliation URL - Tooltip": "The homepage URL for the affiliation",
@ -327,6 +333,7 @@
"Signup URL - Tooltip": "Custom URL for the registration page. If not set, the default Casdoor registration page will be used. When set, the registration links on various Casdoor pages will redirect to this URL", "Signup URL - Tooltip": "Custom URL for the registration page. If not set, the default Casdoor registration page will be used. When set, the registration links on various Casdoor pages will redirect to this URL",
"Signup application": "Signup application", "Signup application": "Signup application",
"Signup application - Tooltip": "Which application the user registered through when they signed up", "Signup application - Tooltip": "Which application the user registered through when they signed up",
"Signup link": "Signup link",
"Sorry, the page you visited does not exist.": "Sorry, the page you visited does not exist.", "Sorry, the page you visited does not exist.": "Sorry, the page you visited does not exist.",
"Sorry, the user you visited does not exist or you are not authorized to access this user.": "Sorry, the user you visited does not exist or you are not authorized to access this user.", "Sorry, the user you visited does not exist or you are not authorized to access this user.": "Sorry, the user you visited does not exist or you are not authorized to access this user.",
"Sorry, you do not have permission to access this page or logged in status invalid.": "Sorry, you do not have permission to access this page or logged in status invalid.", "Sorry, you do not have permission to access this page or logged in status invalid.": "Sorry, you do not have permission to access this page or logged in status invalid.",
@ -431,6 +438,7 @@
}, },
"login": { "login": {
"Auto sign in": "Auto sign in", "Auto sign in": "Auto sign in",
"Back button": "Back button",
"Continue with": "Continue with", "Continue with": "Continue with",
"Email": "Email", "Email": "Email",
"Email or phone": "Email or phone", "Email or phone": "Email or phone",
@ -441,6 +449,7 @@
"LDAP username, Email or phone": "LDAP username, Email or phone", "LDAP username, Email or phone": "LDAP username, Email or phone",
"Loading": "Loading", "Loading": "Loading",
"Logging out...": "Logging out...", "Logging out...": "Logging out...",
"Login button": "Login button",
"MetaMask plugin not detected": "MetaMask plugin not detected", "MetaMask plugin not detected": "MetaMask plugin not detected",
"No account?": "No account?", "No account?": "No account?",
"Or sign in with another account": "Or sign in with another account", "Or sign in with another account": "Or sign in with another account",
@ -725,11 +734,11 @@
"Email content - Tooltip": "Content of the Email", "Email content - Tooltip": "Content of the Email",
"Email title": "Email title", "Email title": "Email title",
"Email title - Tooltip": "Title of the email", "Email title - Tooltip": "Title of the email",
"Enable QR code": "Enable QR code",
"Enable QR code - Tooltip": "Whether to allow scanning QR code to login",
"Endpoint": "Endpoint", "Endpoint": "Endpoint",
"Endpoint (Intranet)": "Endpoint (Intranet)", "Endpoint (Intranet)": "Endpoint (Intranet)",
"Endpoint - Tooltip": "Endpoint - Tooltip", "Endpoint - Tooltip": "Endpoint - Tooltip",
"Follow-up action": "Follow-up action",
"Follow-up action - Tooltip": "If you choose \"Use WeChat Open Platform to login\", users need to login on the WeChat Open Platform after following the wechat official account.",
"From address": "From address", "From address": "From address",
"From address - Tooltip": "Email address of \"From\"", "From address - Tooltip": "Email address of \"From\"",
"From name": "From name", "From name": "From name",
@ -835,6 +844,10 @@
"Token URL - Tooltip": "Token URL", "Token URL - Tooltip": "Token URL",
"Type": "Type", "Type": "Type",
"Type - Tooltip": "Select a type", "Type - Tooltip": "Select a type",
"Use WeChat Media Platform in PC": "Use WeChat Media Platform in PC",
"Use WeChat Media Platform in PC - Tooltip": "Whether to allow scanning WeChat Media Platform QR code to login",
"Use WeChat Media Platform to login": "Use WeChat Media Platform to login",
"Use WeChat Open Platform to login": "Use WeChat Open Platform to login",
"User flow": "User flow", "User flow": "User flow",
"User flow - Tooltip": "User flow - Tooltip", "User flow - Tooltip": "User flow - Tooltip",
"User mapping": "User mapping", "User mapping": "User mapping",

View File

@ -22,7 +22,9 @@
"Auto signin - Tooltip": "Lorsqu'une session connectée existe dans Casdoor, elle est automatiquement utilisée pour la connexion côté application", "Auto signin - Tooltip": "Lorsqu'une session connectée existe dans Casdoor, elle est automatiquement utilisée pour la connexion côté application",
"Background URL": "URL de fond", "Background URL": "URL de fond",
"Background URL - Tooltip": "L'URL de l'image d'arrière-plan utilisée sur la page de connexion", "Background URL - Tooltip": "L'URL de l'image d'arrière-plan utilisée sur la page de connexion",
"Big icon": "Big icon",
"Binding providers": "Fournisseurs liés", "Binding providers": "Fournisseurs liés",
"CSS style": "CSS style",
"Center": "Centré", "Center": "Centré",
"Copy SAML metadata URL": "Copiez l'URL de métadonnées SAML", "Copy SAML metadata URL": "Copiez l'URL de métadonnées SAML",
"Copy prompt page URL": "Copier l'URL de la page de l'invite", "Copy prompt page URL": "Copier l'URL de la page de l'invite",
@ -95,11 +97,14 @@
"Sign Up Error": "Erreur d'inscription", "Sign Up Error": "Erreur d'inscription",
"Signin": "Connexion", "Signin": "Connexion",
"Signin (Default True)": "Connexion (Vrai par défaut)", "Signin (Default True)": "Connexion (Vrai par défaut)",
"Signin items": "Signin items",
"Signin items - Tooltip": "Signin items - Tooltip",
"Signin methods": "Signin methods", "Signin methods": "Signin methods",
"Signin methods - Tooltip": "Signin methods - Tooltip", "Signin methods - Tooltip": "Signin methods - Tooltip",
"Signin session": "Session de connexion", "Signin session": "Session de connexion",
"Signup items": "Champs d'inscription", "Signup items": "Champs d'inscription",
"Signup items - Tooltip": "Champs à remplir lors de l'enregistrement de nouveaux comptes", "Signup items - Tooltip": "Champs à remplir lors de l'enregistrement de nouveaux comptes",
"Small icon": "Small icon",
"Tags - Tooltip": "Seuls les comptes ayant leur étiquette listée dans les étiquettes de l'application peuvent se connecter", "Tags - Tooltip": "Seuls les comptes ayant leur étiquette listée dans les étiquettes de l'application peuvent se connecter",
"The application does not allow to sign up new account": "L'application ne permet pas de créer un nouveau compte", "The application does not allow to sign up new account": "L'application ne permet pas de créer un nouveau compte",
"Token expire": "Expiration du jeton", "Token expire": "Expiration du jeton",
@ -169,6 +174,7 @@
"Adapter - Tooltip": "Nom de la table du magasin de règle", "Adapter - Tooltip": "Nom de la table du magasin de règle",
"Adapters": "Adaptateurs", "Adapters": "Adaptateurs",
"Add": "Ajouter", "Add": "Ajouter",
"Add custom item": "Add custom item",
"Admin": "Administration", "Admin": "Administration",
"Affiliation URL": "URL d'affiliation", "Affiliation URL": "URL d'affiliation",
"Affiliation URL - Tooltip": "URL du site web de l'affiliation", "Affiliation URL - Tooltip": "URL du site web de l'affiliation",
@ -327,6 +333,7 @@
"Signup URL - Tooltip": "URL personnalisée pour la page d'inscription. Si elle n'est pas définie, la page d'inscription par défaut de Casdoor utilisée. Lorsqu'elle est définie, les liens d'inscription sur les différentes pages de Casdoor redirigeront vers cette URL", "Signup URL - Tooltip": "URL personnalisée pour la page d'inscription. Si elle n'est pas définie, la page d'inscription par défaut de Casdoor utilisée. Lorsqu'elle est définie, les liens d'inscription sur les différentes pages de Casdoor redirigeront vers cette URL",
"Signup application": "Application d'inscription", "Signup application": "Application d'inscription",
"Signup application - Tooltip": "L'application utilisée lors de la création du compte", "Signup application - Tooltip": "L'application utilisée lors de la création du compte",
"Signup link": "Signup link",
"Sorry, the page you visited does not exist.": "Désolé, la page que vous avez visitée n'existe pas.", "Sorry, the page you visited does not exist.": "Désolé, la page que vous avez visitée n'existe pas.",
"Sorry, the user you visited does not exist or you are not authorized to access this user.": "Désolé, le compte que vous avez visité n'existe pas ou vous n'êtes pas autorisé à accéder à ce compte.", "Sorry, the user you visited does not exist or you are not authorized to access this user.": "Désolé, le compte que vous avez visité n'existe pas ou vous n'êtes pas autorisé à accéder à ce compte.",
"Sorry, you do not have permission to access this page or logged in status invalid.": "Désolé, vous n'avez pas la permission d'accéder à cette page ou votre statut de connexion est invalide.", "Sorry, you do not have permission to access this page or logged in status invalid.": "Désolé, vous n'avez pas la permission d'accéder à cette page ou votre statut de connexion est invalide.",
@ -431,6 +438,7 @@
}, },
"login": { "login": {
"Auto sign in": "Connexion automatique", "Auto sign in": "Connexion automatique",
"Back button": "Back button",
"Continue with": "Continuer avec", "Continue with": "Continuer avec",
"Email": "Email", "Email": "Email",
"Email or phone": "Email ou téléphone", "Email or phone": "Email ou téléphone",
@ -441,6 +449,7 @@
"LDAP username, Email or phone": "LDAP username, Email or phone", "LDAP username, Email or phone": "LDAP username, Email or phone",
"Loading": "Chargement", "Loading": "Chargement",
"Logging out...": "Déconnexion...", "Logging out...": "Déconnexion...",
"Login button": "Login button",
"MetaMask plugin not detected": "Le plugin MetaMask n'a pas été détecté", "MetaMask plugin not detected": "Le plugin MetaMask n'a pas été détecté",
"No account?": "Pas de compte ?", "No account?": "Pas de compte ?",
"Or sign in with another account": "Ou connectez-vous avec un autre compte", "Or sign in with another account": "Ou connectez-vous avec un autre compte",
@ -725,11 +734,11 @@
"Email content - Tooltip": "Contenu de l'e-mail", "Email content - Tooltip": "Contenu de l'e-mail",
"Email title": "Titre de l'email", "Email title": "Titre de l'email",
"Email title - Tooltip": "Titre de l'email", "Email title - Tooltip": "Titre de l'email",
"Enable QR code": "Activer le code QR",
"Enable QR code - Tooltip": "Permettre de scanner un QR code pour se connecter",
"Endpoint": "Endpoint", "Endpoint": "Endpoint",
"Endpoint (Intranet)": "Endpoint (intranet)", "Endpoint (Intranet)": "Endpoint (intranet)",
"Endpoint - Tooltip": "Endpoint - Infobulle", "Endpoint - Tooltip": "Endpoint - Infobulle",
"Follow-up action": "Follow-up action",
"Follow-up action - Tooltip": "If you choose \"Use WeChat Open Platform to login\", users need to login on the WeChat Open Platform after following the wechat official account.",
"From address": "Adresse de l'expéditeur", "From address": "Adresse de l'expéditeur",
"From address - Tooltip": "L'adresse e-mail affichée comme expéditeur dans les e-mails envoyés", "From address - Tooltip": "L'adresse e-mail affichée comme expéditeur dans les e-mails envoyés",
"From name": "Nom de l'expéditeur", "From name": "Nom de l'expéditeur",
@ -835,6 +844,10 @@
"Token URL - Tooltip": "URL de jeton", "Token URL - Tooltip": "URL de jeton",
"Type": "Type de texte", "Type": "Type de texte",
"Type - Tooltip": "Sélectionnez un type", "Type - Tooltip": "Sélectionnez un type",
"Use WeChat Media Platform in PC": "Use WeChat Media Platform in PC",
"Use WeChat Media Platform in PC - Tooltip": "Whether to allow scanning WeChat Media Platform QR code to login",
"Use WeChat Media Platform to login": "Use WeChat Media Platform to login",
"Use WeChat Open Platform to login": "Use WeChat Open Platform to login",
"User flow": "User flow", "User flow": "User flow",
"User flow - Tooltip": "User flow - Tooltip", "User flow - Tooltip": "User flow - Tooltip",
"User mapping": "Association de compte", "User mapping": "Association de compte",

View File

@ -22,7 +22,9 @@
"Auto signin - Tooltip": "When a logged-in session exists in Casdoor, it is automatically used for application-side login", "Auto signin - Tooltip": "When a logged-in session exists in Casdoor, it is automatically used for application-side login",
"Background URL": "Background URL", "Background URL": "Background URL",
"Background URL - Tooltip": "URL of the background image used in the login page", "Background URL - Tooltip": "URL of the background image used in the login page",
"Big icon": "Big icon",
"Binding providers": "Binding providers", "Binding providers": "Binding providers",
"CSS style": "CSS style",
"Center": "Center", "Center": "Center",
"Copy SAML metadata URL": "Copy SAML metadata URL", "Copy SAML metadata URL": "Copy SAML metadata URL",
"Copy prompt page URL": "Copy prompt page URL", "Copy prompt page URL": "Copy prompt page URL",
@ -95,11 +97,14 @@
"Sign Up Error": "Sign Up Error", "Sign Up Error": "Sign Up Error",
"Signin": "Signin", "Signin": "Signin",
"Signin (Default True)": "Signin (Default True)", "Signin (Default True)": "Signin (Default True)",
"Signin items": "Signin items",
"Signin items - Tooltip": "Signin items - Tooltip",
"Signin methods": "Signin methods", "Signin methods": "Signin methods",
"Signin methods - Tooltip": "Signin methods - Tooltip", "Signin methods - Tooltip": "Signin methods - Tooltip",
"Signin session": "Signin session", "Signin session": "Signin session",
"Signup items": "Signup items", "Signup items": "Signup items",
"Signup items - Tooltip": "Items for users to fill in when registering new accounts", "Signup items - Tooltip": "Items for users to fill in when registering new accounts",
"Small icon": "Small icon",
"Tags - Tooltip": "Only users with the tag that is listed in the application tags can login", "Tags - Tooltip": "Only users with the tag that is listed in the application tags can login",
"The application does not allow to sign up new account": "The application does not allow to sign up new account", "The application does not allow to sign up new account": "The application does not allow to sign up new account",
"Token expire": "Token expire", "Token expire": "Token expire",
@ -169,6 +174,7 @@
"Adapter - Tooltip": "Table name of the policy store", "Adapter - Tooltip": "Table name of the policy store",
"Adapters": "Adapters", "Adapters": "Adapters",
"Add": "Add", "Add": "Add",
"Add custom item": "Add custom item",
"Admin": "Admin", "Admin": "Admin",
"Affiliation URL": "Affiliation URL", "Affiliation URL": "Affiliation URL",
"Affiliation URL - Tooltip": "The homepage URL for the affiliation", "Affiliation URL - Tooltip": "The homepage URL for the affiliation",
@ -327,6 +333,7 @@
"Signup URL - Tooltip": "Custom URL for the registration page. If not set, the default Casdoor registration page will be used. When set, the registration links on various Casdoor pages will redirect to this URL", "Signup URL - Tooltip": "Custom URL for the registration page. If not set, the default Casdoor registration page will be used. When set, the registration links on various Casdoor pages will redirect to this URL",
"Signup application": "Signup application", "Signup application": "Signup application",
"Signup application - Tooltip": "Which application the user registered through when they signed up", "Signup application - Tooltip": "Which application the user registered through when they signed up",
"Signup link": "Signup link",
"Sorry, the page you visited does not exist.": "Sorry, the page you visited does not exist.", "Sorry, the page you visited does not exist.": "Sorry, the page you visited does not exist.",
"Sorry, the user you visited does not exist or you are not authorized to access this user.": "Sorry, the user you visited does not exist or you are not authorized to access this user.", "Sorry, the user you visited does not exist or you are not authorized to access this user.": "Sorry, the user you visited does not exist or you are not authorized to access this user.",
"Sorry, you do not have permission to access this page or logged in status invalid.": "Sorry, you do not have permission to access this page or logged in status invalid.", "Sorry, you do not have permission to access this page or logged in status invalid.": "Sorry, you do not have permission to access this page or logged in status invalid.",
@ -431,6 +438,7 @@
}, },
"login": { "login": {
"Auto sign in": "Auto sign in", "Auto sign in": "Auto sign in",
"Back button": "Back button",
"Continue with": "Continue with", "Continue with": "Continue with",
"Email": "Email", "Email": "Email",
"Email or phone": "Email or phone", "Email or phone": "Email or phone",
@ -441,6 +449,7 @@
"LDAP username, Email or phone": "LDAP username, Email or phone", "LDAP username, Email or phone": "LDAP username, Email or phone",
"Loading": "Loading", "Loading": "Loading",
"Logging out...": "Logging out...", "Logging out...": "Logging out...",
"Login button": "Login button",
"MetaMask plugin not detected": "MetaMask plugin not detected", "MetaMask plugin not detected": "MetaMask plugin not detected",
"No account?": "No account?", "No account?": "No account?",
"Or sign in with another account": "Or sign in with another account", "Or sign in with another account": "Or sign in with another account",
@ -725,11 +734,11 @@
"Email content - Tooltip": "Content of the Email", "Email content - Tooltip": "Content of the Email",
"Email title": "Email title", "Email title": "Email title",
"Email title - Tooltip": "Title of the email", "Email title - Tooltip": "Title of the email",
"Enable QR code": "Enable QR code",
"Enable QR code - Tooltip": "Whether to allow scanning QR code to login",
"Endpoint": "Endpoint", "Endpoint": "Endpoint",
"Endpoint (Intranet)": "Endpoint (Intranet)", "Endpoint (Intranet)": "Endpoint (Intranet)",
"Endpoint - Tooltip": "Endpoint - Tooltip", "Endpoint - Tooltip": "Endpoint - Tooltip",
"Follow-up action": "Follow-up action",
"Follow-up action - Tooltip": "If you choose \"Use WeChat Open Platform to login\", users need to login on the WeChat Open Platform after following the wechat official account.",
"From address": "From address", "From address": "From address",
"From address - Tooltip": "Email address of \"From\"", "From address - Tooltip": "Email address of \"From\"",
"From name": "From name", "From name": "From name",
@ -835,6 +844,10 @@
"Token URL - Tooltip": "Token URL", "Token URL - Tooltip": "Token URL",
"Type": "Type", "Type": "Type",
"Type - Tooltip": "Select a type", "Type - Tooltip": "Select a type",
"Use WeChat Media Platform in PC": "Use WeChat Media Platform in PC",
"Use WeChat Media Platform in PC - Tooltip": "Whether to allow scanning WeChat Media Platform QR code to login",
"Use WeChat Media Platform to login": "Use WeChat Media Platform to login",
"Use WeChat Open Platform to login": "Use WeChat Open Platform to login",
"User flow": "User flow", "User flow": "User flow",
"User flow - Tooltip": "User flow - Tooltip", "User flow - Tooltip": "User flow - Tooltip",
"User mapping": "User mapping", "User mapping": "User mapping",

View File

@ -22,7 +22,9 @@
"Auto signin - Tooltip": "Ketika sesi masuk yang terdaftar ada di Casdoor, secara otomatis digunakan untuk masuk ke sisi aplikasi", "Auto signin - Tooltip": "Ketika sesi masuk yang terdaftar ada di Casdoor, secara otomatis digunakan untuk masuk ke sisi aplikasi",
"Background URL": "URL latar belakang", "Background URL": "URL latar belakang",
"Background URL - Tooltip": "URL dari gambar latar belakang yang digunakan di halaman login", "Background URL - Tooltip": "URL dari gambar latar belakang yang digunakan di halaman login",
"Big icon": "Big icon",
"Binding providers": "Binding providers", "Binding providers": "Binding providers",
"CSS style": "CSS style",
"Center": "pusat", "Center": "pusat",
"Copy SAML metadata URL": "Salin URL metadata SAML", "Copy SAML metadata URL": "Salin URL metadata SAML",
"Copy prompt page URL": "Salin URL halaman prompt", "Copy prompt page URL": "Salin URL halaman prompt",
@ -95,11 +97,14 @@
"Sign Up Error": "Kesalahan Pendaftaran", "Sign Up Error": "Kesalahan Pendaftaran",
"Signin": "Signin", "Signin": "Signin",
"Signin (Default True)": "Signin (Default True)", "Signin (Default True)": "Signin (Default True)",
"Signin items": "Signin items",
"Signin items - Tooltip": "Signin items - Tooltip",
"Signin methods": "Signin methods", "Signin methods": "Signin methods",
"Signin methods - Tooltip": "Signin methods - Tooltip", "Signin methods - Tooltip": "Signin methods - Tooltip",
"Signin session": "Sesi masuk", "Signin session": "Sesi masuk",
"Signup items": "Item pendaftaran", "Signup items": "Item pendaftaran",
"Signup items - Tooltip": "Item-item yang harus diisi pengguna saat mendaftar untuk akun baru", "Signup items - Tooltip": "Item-item yang harus diisi pengguna saat mendaftar untuk akun baru",
"Small icon": "Small icon",
"Tags - Tooltip": "Only users with the tag that is listed in the application tags can login", "Tags - Tooltip": "Only users with the tag that is listed in the application tags can login",
"The application does not allow to sign up new account": "Aplikasi tidak memperbolehkan untuk mendaftar akun baru", "The application does not allow to sign up new account": "Aplikasi tidak memperbolehkan untuk mendaftar akun baru",
"Token expire": "Token kadaluarsa", "Token expire": "Token kadaluarsa",
@ -169,6 +174,7 @@
"Adapter - Tooltip": "Nama tabel dari penyimpanan kebijakan", "Adapter - Tooltip": "Nama tabel dari penyimpanan kebijakan",
"Adapters": "Adaptor", "Adapters": "Adaptor",
"Add": "Tambahkan", "Add": "Tambahkan",
"Add custom item": "Add custom item",
"Admin": "Admin", "Admin": "Admin",
"Affiliation URL": "URL Afiliasi", "Affiliation URL": "URL Afiliasi",
"Affiliation URL - Tooltip": "URL halaman depan untuk afiliasi", "Affiliation URL - Tooltip": "URL halaman depan untuk afiliasi",
@ -327,6 +333,7 @@
"Signup URL - Tooltip": "URL kustom untuk halaman pendaftaran. Jika tidak diatur, halaman pendaftaran Casdoor default akan digunakan. Ketika diatur, tautan pendaftaran pada berbagai halaman Casdoor akan dialihkan ke URL ini", "Signup URL - Tooltip": "URL kustom untuk halaman pendaftaran. Jika tidak diatur, halaman pendaftaran Casdoor default akan digunakan. Ketika diatur, tautan pendaftaran pada berbagai halaman Casdoor akan dialihkan ke URL ini",
"Signup application": "Pendaftaran aplikasi", "Signup application": "Pendaftaran aplikasi",
"Signup application - Tooltip": "Melalui aplikasi mana pengguna mendaftar saat mereka mendaftar", "Signup application - Tooltip": "Melalui aplikasi mana pengguna mendaftar saat mereka mendaftar",
"Signup link": "Signup link",
"Sorry, the page you visited does not exist.": "Maaf, halaman yang Anda kunjungi tidak ada.", "Sorry, the page you visited does not exist.": "Maaf, halaman yang Anda kunjungi tidak ada.",
"Sorry, the user you visited does not exist or you are not authorized to access this user.": "Maaf, pengguna yang Anda kunjungi tidak ada atau Anda tidak diizinkan untuk mengakses pengguna ini.", "Sorry, the user you visited does not exist or you are not authorized to access this user.": "Maaf, pengguna yang Anda kunjungi tidak ada atau Anda tidak diizinkan untuk mengakses pengguna ini.",
"Sorry, you do not have permission to access this page or logged in status invalid.": "Maaf, Anda tidak memiliki izin untuk mengakses halaman ini atau status masuk tidak valid.", "Sorry, you do not have permission to access this page or logged in status invalid.": "Maaf, Anda tidak memiliki izin untuk mengakses halaman ini atau status masuk tidak valid.",
@ -431,6 +438,7 @@
}, },
"login": { "login": {
"Auto sign in": "Masuk otomatis", "Auto sign in": "Masuk otomatis",
"Back button": "Back button",
"Continue with": "Lanjutkan dengan", "Continue with": "Lanjutkan dengan",
"Email": "Email", "Email": "Email",
"Email or phone": "Email atau telepon", "Email or phone": "Email atau telepon",
@ -441,6 +449,7 @@
"LDAP username, Email or phone": "LDAP username, Email or phone", "LDAP username, Email or phone": "LDAP username, Email or phone",
"Loading": "Memuat", "Loading": "Memuat",
"Logging out...": "Keluar...", "Logging out...": "Keluar...",
"Login button": "Login button",
"MetaMask plugin not detected": "MetaMask plugin not detected", "MetaMask plugin not detected": "MetaMask plugin not detected",
"No account?": "Tidak memiliki akun?", "No account?": "Tidak memiliki akun?",
"Or sign in with another account": "Atau masuk dengan akun lain", "Or sign in with another account": "Atau masuk dengan akun lain",
@ -725,11 +734,11 @@
"Email content - Tooltip": "Isi Email", "Email content - Tooltip": "Isi Email",
"Email title": "Judul Email", "Email title": "Judul Email",
"Email title - Tooltip": "Judul email", "Email title - Tooltip": "Judul email",
"Enable QR code": "Aktifkan kode QR",
"Enable QR code - Tooltip": "Apakah diizinkan untuk memindai kode QR untuk masuk?",
"Endpoint": "Titik akhir", "Endpoint": "Titik akhir",
"Endpoint (Intranet)": "Titik Akhir (Intranet)", "Endpoint (Intranet)": "Titik Akhir (Intranet)",
"Endpoint - Tooltip": "Endpoint - Tooltip", "Endpoint - Tooltip": "Endpoint - Tooltip",
"Follow-up action": "Follow-up action",
"Follow-up action - Tooltip": "If you choose \"Use WeChat Open Platform to login\", users need to login on the WeChat Open Platform after following the wechat official account.",
"From address": "From address", "From address": "From address",
"From address - Tooltip": "From address - Tooltip", "From address - Tooltip": "From address - Tooltip",
"From name": "From name", "From name": "From name",
@ -835,6 +844,10 @@
"Token URL - Tooltip": "Token URL: URL Token", "Token URL - Tooltip": "Token URL: URL Token",
"Type": "Jenis", "Type": "Jenis",
"Type - Tooltip": "Pilih tipe", "Type - Tooltip": "Pilih tipe",
"Use WeChat Media Platform in PC": "Use WeChat Media Platform in PC",
"Use WeChat Media Platform in PC - Tooltip": "Whether to allow scanning WeChat Media Platform QR code to login",
"Use WeChat Media Platform to login": "Use WeChat Media Platform to login",
"Use WeChat Open Platform to login": "Use WeChat Open Platform to login",
"User flow": "User flow", "User flow": "User flow",
"User flow - Tooltip": "User flow - Tooltip", "User flow - Tooltip": "User flow - Tooltip",
"User mapping": "User mapping", "User mapping": "User mapping",

View File

@ -22,7 +22,9 @@
"Auto signin - Tooltip": "Quando una sessione esiste in Casdoor, viene utilizzata automaticamente per il login lato applicazione", "Auto signin - Tooltip": "Quando una sessione esiste in Casdoor, viene utilizzata automaticamente per il login lato applicazione",
"Background URL": "Background URL", "Background URL": "Background URL",
"Background URL - Tooltip": "URL of the background image used in the login page", "Background URL - Tooltip": "URL of the background image used in the login page",
"Big icon": "Big icon",
"Binding providers": "Binding providers", "Binding providers": "Binding providers",
"CSS style": "CSS style",
"Center": "Center", "Center": "Center",
"Copy SAML metadata URL": "Copy SAML metadata URL", "Copy SAML metadata URL": "Copy SAML metadata URL",
"Copy prompt page URL": "Copy prompt page URL", "Copy prompt page URL": "Copy prompt page URL",
@ -95,11 +97,14 @@
"Sign Up Error": "Sign Up Error", "Sign Up Error": "Sign Up Error",
"Signin": "Signin", "Signin": "Signin",
"Signin (Default True)": "Signin (Default True)", "Signin (Default True)": "Signin (Default True)",
"Signin items": "Signin items",
"Signin items - Tooltip": "Signin items - Tooltip",
"Signin methods": "Signin methods", "Signin methods": "Signin methods",
"Signin methods - Tooltip": "Signin methods - Tooltip", "Signin methods - Tooltip": "Signin methods - Tooltip",
"Signin session": "Signin session", "Signin session": "Signin session",
"Signup items": "Signup items", "Signup items": "Signup items",
"Signup items - Tooltip": "Items for users to fill in when registering new accounts", "Signup items - Tooltip": "Items for users to fill in when registering new accounts",
"Small icon": "Small icon",
"Tags - Tooltip": "Only users with the tag that is listed in the application tags can login", "Tags - Tooltip": "Only users with the tag that is listed in the application tags can login",
"The application does not allow to sign up new account": "The application does not allow to sign up new account", "The application does not allow to sign up new account": "The application does not allow to sign up new account",
"Token expire": "Token expire", "Token expire": "Token expire",
@ -169,6 +174,7 @@
"Adapter - Tooltip": "Table name of the policy store", "Adapter - Tooltip": "Table name of the policy store",
"Adapters": "Adapters", "Adapters": "Adapters",
"Add": "Add", "Add": "Add",
"Add custom item": "Add custom item",
"Admin": "Admin", "Admin": "Admin",
"Affiliation URL": "Affiliation URL", "Affiliation URL": "Affiliation URL",
"Affiliation URL - Tooltip": "The homepage URL for the affiliation", "Affiliation URL - Tooltip": "The homepage URL for the affiliation",
@ -327,6 +333,7 @@
"Signup URL - Tooltip": "Custom URL for the registration page. If not set, the default Casdoor registration page will be used. When set, the registration links on various Casdoor pages will redirect to this URL", "Signup URL - Tooltip": "Custom URL for the registration page. If not set, the default Casdoor registration page will be used. When set, the registration links on various Casdoor pages will redirect to this URL",
"Signup application": "Signup application", "Signup application": "Signup application",
"Signup application - Tooltip": "Which application the user registered through when they signed up", "Signup application - Tooltip": "Which application the user registered through when they signed up",
"Signup link": "Signup link",
"Sorry, the page you visited does not exist.": "Sorry, the page you visited does not exist.", "Sorry, the page you visited does not exist.": "Sorry, the page you visited does not exist.",
"Sorry, the user you visited does not exist or you are not authorized to access this user.": "Sorry, the user you visited does not exist or you are not authorized to access this user.", "Sorry, the user you visited does not exist or you are not authorized to access this user.": "Sorry, the user you visited does not exist or you are not authorized to access this user.",
"Sorry, you do not have permission to access this page or logged in status invalid.": "Sorry, you do not have permission to access this page or logged in status invalid.", "Sorry, you do not have permission to access this page or logged in status invalid.": "Sorry, you do not have permission to access this page or logged in status invalid.",
@ -431,6 +438,7 @@
}, },
"login": { "login": {
"Auto sign in": "Auto sign in", "Auto sign in": "Auto sign in",
"Back button": "Back button",
"Continue with": "Continue with", "Continue with": "Continue with",
"Email": "Email", "Email": "Email",
"Email or phone": "Email or phone", "Email or phone": "Email or phone",
@ -441,6 +449,7 @@
"LDAP username, Email or phone": "LDAP username, Email or phone", "LDAP username, Email or phone": "LDAP username, Email or phone",
"Loading": "Loading", "Loading": "Loading",
"Logging out...": "Logging out...", "Logging out...": "Logging out...",
"Login button": "Login button",
"MetaMask plugin not detected": "MetaMask plugin not detected", "MetaMask plugin not detected": "MetaMask plugin not detected",
"No account?": "No account?", "No account?": "No account?",
"Or sign in with another account": "Or sign in with another account", "Or sign in with another account": "Or sign in with another account",
@ -725,11 +734,11 @@
"Email content - Tooltip": "Content of the Email", "Email content - Tooltip": "Content of the Email",
"Email title": "Email title", "Email title": "Email title",
"Email title - Tooltip": "Title of the email", "Email title - Tooltip": "Title of the email",
"Enable QR code": "Enable QR code",
"Enable QR code - Tooltip": "Whether to allow scanning QR code to login",
"Endpoint": "Endpoint", "Endpoint": "Endpoint",
"Endpoint (Intranet)": "Endpoint (Intranet)", "Endpoint (Intranet)": "Endpoint (Intranet)",
"Endpoint - Tooltip": "Endpoint - Tooltip", "Endpoint - Tooltip": "Endpoint - Tooltip",
"Follow-up action": "Follow-up action",
"Follow-up action - Tooltip": "If you choose \"Use WeChat Open Platform to login\", users need to login on the WeChat Open Platform after following the wechat official account.",
"From address": "From address", "From address": "From address",
"From address - Tooltip": "Email address of \"From\"", "From address - Tooltip": "Email address of \"From\"",
"From name": "From name", "From name": "From name",
@ -835,6 +844,10 @@
"Token URL - Tooltip": "Token URL", "Token URL - Tooltip": "Token URL",
"Type": "Type", "Type": "Type",
"Type - Tooltip": "Select a type", "Type - Tooltip": "Select a type",
"Use WeChat Media Platform in PC": "Use WeChat Media Platform in PC",
"Use WeChat Media Platform in PC - Tooltip": "Whether to allow scanning WeChat Media Platform QR code to login",
"Use WeChat Media Platform to login": "Use WeChat Media Platform to login",
"Use WeChat Open Platform to login": "Use WeChat Open Platform to login",
"User flow": "User flow", "User flow": "User flow",
"User flow - Tooltip": "User flow - Tooltip", "User flow - Tooltip": "User flow - Tooltip",
"User mapping": "User mapping", "User mapping": "User mapping",

View File

@ -22,7 +22,9 @@
"Auto signin - Tooltip": "Casdoorにログインセッションが存在する場合、アプリケーション側のログインに自動的に使用されます", "Auto signin - Tooltip": "Casdoorにログインセッションが存在する場合、アプリケーション側のログインに自動的に使用されます",
"Background URL": "背景URL", "Background URL": "背景URL",
"Background URL - Tooltip": "ログインページで使用される背景画像のURL", "Background URL - Tooltip": "ログインページで使用される背景画像のURL",
"Big icon": "Big icon",
"Binding providers": "Binding providers", "Binding providers": "Binding providers",
"CSS style": "CSS style",
"Center": "センター", "Center": "センター",
"Copy SAML metadata URL": "SAMLメタデータのURLをコピーしてください", "Copy SAML metadata URL": "SAMLメタデータのURLをコピーしてください",
"Copy prompt page URL": "プロンプトページのURLをコピーしてください", "Copy prompt page URL": "プロンプトページのURLをコピーしてください",
@ -95,11 +97,14 @@
"Sign Up Error": "サインアップエラー", "Sign Up Error": "サインアップエラー",
"Signin": "Signin", "Signin": "Signin",
"Signin (Default True)": "Signin (Default True)", "Signin (Default True)": "Signin (Default True)",
"Signin items": "Signin items",
"Signin items - Tooltip": "Signin items - Tooltip",
"Signin methods": "Signin methods", "Signin methods": "Signin methods",
"Signin methods - Tooltip": "Signin methods - Tooltip", "Signin methods - Tooltip": "Signin methods - Tooltip",
"Signin session": "サインインセッション", "Signin session": "サインインセッション",
"Signup items": "サインアップアイテム", "Signup items": "サインアップアイテム",
"Signup items - Tooltip": "新しいアカウントを登録する際にユーザーが入力するアイテム", "Signup items - Tooltip": "新しいアカウントを登録する際にユーザーが入力するアイテム",
"Small icon": "Small icon",
"Tags - Tooltip": "Only users with the tag that is listed in the application tags can login", "Tags - Tooltip": "Only users with the tag that is listed in the application tags can login",
"The application does not allow to sign up new account": "アプリケーションでは新しいアカウントの登録ができません", "The application does not allow to sign up new account": "アプリケーションでは新しいアカウントの登録ができません",
"Token expire": "トークンの有効期限が切れました", "Token expire": "トークンの有効期限が切れました",
@ -169,6 +174,7 @@
"Adapter - Tooltip": "ポリシー・ストアのテーブル名", "Adapter - Tooltip": "ポリシー・ストアのテーブル名",
"Adapters": "アダプター", "Adapters": "アダプター",
"Add": "追加", "Add": "追加",
"Add custom item": "Add custom item",
"Admin": "Admin", "Admin": "Admin",
"Affiliation URL": "所属するURL", "Affiliation URL": "所属するURL",
"Affiliation URL - Tooltip": "所属先のホームページURL", "Affiliation URL - Tooltip": "所属先のホームページURL",
@ -327,6 +333,7 @@
"Signup URL - Tooltip": "登録ページのカスタムURL。設定されていない場合、デフォルトのCasdoor登録ページが使用されます。設定された場合、Casdoorのさまざまなページの登録リンクはこのURLにリダイレクトされます", "Signup URL - Tooltip": "登録ページのカスタムURL。設定されていない場合、デフォルトのCasdoor登録ページが使用されます。設定された場合、Casdoorのさまざまなページの登録リンクはこのURLにリダイレクトされます",
"Signup application": "サインアップ申請書", "Signup application": "サインアップ申請書",
"Signup application - Tooltip": "ユーザーが登録した際に、どのアプリケーションを使用しましたか?", "Signup application - Tooltip": "ユーザーが登録した際に、どのアプリケーションを使用しましたか?",
"Signup link": "Signup link",
"Sorry, the page you visited does not exist.": "申し訳ありませんが、ご訪問いただいたページは存在しません。", "Sorry, the page you visited does not exist.": "申し訳ありませんが、ご訪問いただいたページは存在しません。",
"Sorry, the user you visited does not exist or you are not authorized to access this user.": "すみません、あなたが訪問したユーザーは存在しないか、またはそのユーザーにアクセスする権限がありません。", "Sorry, the user you visited does not exist or you are not authorized to access this user.": "すみません、あなたが訪問したユーザーは存在しないか、またはそのユーザーにアクセスする権限がありません。",
"Sorry, you do not have permission to access this page or logged in status invalid.": "申し訳ありませんが、このページにアクセスする権限がありません、またはログイン状態が無効です。", "Sorry, you do not have permission to access this page or logged in status invalid.": "申し訳ありませんが、このページにアクセスする権限がありません、またはログイン状態が無効です。",
@ -431,6 +438,7 @@
}, },
"login": { "login": {
"Auto sign in": "自動サインイン", "Auto sign in": "自動サインイン",
"Back button": "Back button",
"Continue with": "続ける", "Continue with": "続ける",
"Email": "Email", "Email": "Email",
"Email or phone": "メールまたは電話", "Email or phone": "メールまたは電話",
@ -441,6 +449,7 @@
"LDAP username, Email or phone": "LDAP username, Email or phone", "LDAP username, Email or phone": "LDAP username, Email or phone",
"Loading": "ローディング", "Loading": "ローディング",
"Logging out...": "ログアウト中...", "Logging out...": "ログアウト中...",
"Login button": "Login button",
"MetaMask plugin not detected": "MetaMask plugin not detected", "MetaMask plugin not detected": "MetaMask plugin not detected",
"No account?": "アカウントがありませんか?", "No account?": "アカウントがありませんか?",
"Or sign in with another account": "別のアカウントでサインインする", "Or sign in with another account": "別のアカウントでサインインする",
@ -725,11 +734,11 @@
"Email content - Tooltip": "メールの内容", "Email content - Tooltip": "メールの内容",
"Email title": "電子メールのタイトル", "Email title": "電子メールのタイトル",
"Email title - Tooltip": "メールのタイトル", "Email title - Tooltip": "メールのタイトル",
"Enable QR code": "QRコードを有効にする",
"Enable QR code - Tooltip": "ログインするためにQRコードをスキャンすることを許可するかどうか",
"Endpoint": "エンドポイント", "Endpoint": "エンドポイント",
"Endpoint (Intranet)": "エンドポイント(イントラネット)", "Endpoint (Intranet)": "エンドポイント(イントラネット)",
"Endpoint - Tooltip": "Endpoint - Tooltip", "Endpoint - Tooltip": "Endpoint - Tooltip",
"Follow-up action": "Follow-up action",
"Follow-up action - Tooltip": "If you choose \"Use WeChat Open Platform to login\", users need to login on the WeChat Open Platform after following the wechat official account.",
"From address": "From address", "From address": "From address",
"From address - Tooltip": "From address - Tooltip", "From address - Tooltip": "From address - Tooltip",
"From name": "From name", "From name": "From name",
@ -835,6 +844,10 @@
"Token URL - Tooltip": "トークンURL", "Token URL - Tooltip": "トークンURL",
"Type": "タイプ", "Type": "タイプ",
"Type - Tooltip": "タイプを選択してください", "Type - Tooltip": "タイプを選択してください",
"Use WeChat Media Platform in PC": "Use WeChat Media Platform in PC",
"Use WeChat Media Platform in PC - Tooltip": "Whether to allow scanning WeChat Media Platform QR code to login",
"Use WeChat Media Platform to login": "Use WeChat Media Platform to login",
"Use WeChat Open Platform to login": "Use WeChat Open Platform to login",
"User flow": "User flow", "User flow": "User flow",
"User flow - Tooltip": "User flow - Tooltip", "User flow - Tooltip": "User flow - Tooltip",
"User mapping": "User mapping", "User mapping": "User mapping",

View File

@ -22,7 +22,9 @@
"Auto signin - Tooltip": "When a logged-in session exists in Casdoor, it is automatically used for application-side login", "Auto signin - Tooltip": "When a logged-in session exists in Casdoor, it is automatically used for application-side login",
"Background URL": "Background URL", "Background URL": "Background URL",
"Background URL - Tooltip": "URL of the background image used in the login page", "Background URL - Tooltip": "URL of the background image used in the login page",
"Big icon": "Big icon",
"Binding providers": "Binding providers", "Binding providers": "Binding providers",
"CSS style": "CSS style",
"Center": "Center", "Center": "Center",
"Copy SAML metadata URL": "Copy SAML metadata URL", "Copy SAML metadata URL": "Copy SAML metadata URL",
"Copy prompt page URL": "Copy prompt page URL", "Copy prompt page URL": "Copy prompt page URL",
@ -95,11 +97,14 @@
"Sign Up Error": "Sign Up Error", "Sign Up Error": "Sign Up Error",
"Signin": "Signin", "Signin": "Signin",
"Signin (Default True)": "Signin (Default True)", "Signin (Default True)": "Signin (Default True)",
"Signin items": "Signin items",
"Signin items - Tooltip": "Signin items - Tooltip",
"Signin methods": "Signin methods", "Signin methods": "Signin methods",
"Signin methods - Tooltip": "Signin methods - Tooltip", "Signin methods - Tooltip": "Signin methods - Tooltip",
"Signin session": "Signin session", "Signin session": "Signin session",
"Signup items": "Signup items", "Signup items": "Signup items",
"Signup items - Tooltip": "Items for users to fill in when registering new accounts", "Signup items - Tooltip": "Items for users to fill in when registering new accounts",
"Small icon": "Small icon",
"Tags - Tooltip": "Only users with the tag that is listed in the application tags can login", "Tags - Tooltip": "Only users with the tag that is listed in the application tags can login",
"The application does not allow to sign up new account": "The application does not allow to sign up new account", "The application does not allow to sign up new account": "The application does not allow to sign up new account",
"Token expire": "Token expire", "Token expire": "Token expire",
@ -169,6 +174,7 @@
"Adapter - Tooltip": "Table name of the policy store", "Adapter - Tooltip": "Table name of the policy store",
"Adapters": "Adapters", "Adapters": "Adapters",
"Add": "Add", "Add": "Add",
"Add custom item": "Add custom item",
"Admin": "Admin", "Admin": "Admin",
"Affiliation URL": "Affiliation URL", "Affiliation URL": "Affiliation URL",
"Affiliation URL - Tooltip": "The homepage URL for the affiliation", "Affiliation URL - Tooltip": "The homepage URL for the affiliation",
@ -327,6 +333,7 @@
"Signup URL - Tooltip": "Custom URL for the registration page. If not set, the default Casdoor registration page will be used. When set, the registration links on various Casdoor pages will redirect to this URL", "Signup URL - Tooltip": "Custom URL for the registration page. If not set, the default Casdoor registration page will be used. When set, the registration links on various Casdoor pages will redirect to this URL",
"Signup application": "Signup application", "Signup application": "Signup application",
"Signup application - Tooltip": "Which application the user registered through when they signed up", "Signup application - Tooltip": "Which application the user registered through when they signed up",
"Signup link": "Signup link",
"Sorry, the page you visited does not exist.": "Sorry, the page you visited does not exist.", "Sorry, the page you visited does not exist.": "Sorry, the page you visited does not exist.",
"Sorry, the user you visited does not exist or you are not authorized to access this user.": "Sorry, the user you visited does not exist or you are not authorized to access this user.", "Sorry, the user you visited does not exist or you are not authorized to access this user.": "Sorry, the user you visited does not exist or you are not authorized to access this user.",
"Sorry, you do not have permission to access this page or logged in status invalid.": "Sorry, you do not have permission to access this page or logged in status invalid.", "Sorry, you do not have permission to access this page or logged in status invalid.": "Sorry, you do not have permission to access this page or logged in status invalid.",
@ -431,6 +438,7 @@
}, },
"login": { "login": {
"Auto sign in": "Auto sign in", "Auto sign in": "Auto sign in",
"Back button": "Back button",
"Continue with": "Continue with", "Continue with": "Continue with",
"Email": "Email", "Email": "Email",
"Email or phone": "Email or phone", "Email or phone": "Email or phone",
@ -441,6 +449,7 @@
"LDAP username, Email or phone": "LDAP username, Email or phone", "LDAP username, Email or phone": "LDAP username, Email or phone",
"Loading": "Loading", "Loading": "Loading",
"Logging out...": "Logging out...", "Logging out...": "Logging out...",
"Login button": "Login button",
"MetaMask plugin not detected": "MetaMask plugin not detected", "MetaMask plugin not detected": "MetaMask plugin not detected",
"No account?": "No account?", "No account?": "No account?",
"Or sign in with another account": "Or sign in with another account", "Or sign in with another account": "Or sign in with another account",
@ -725,11 +734,11 @@
"Email content - Tooltip": "Content of the Email", "Email content - Tooltip": "Content of the Email",
"Email title": "Email title", "Email title": "Email title",
"Email title - Tooltip": "Title of the email", "Email title - Tooltip": "Title of the email",
"Enable QR code": "Enable QR code",
"Enable QR code - Tooltip": "Whether to allow scanning QR code to login",
"Endpoint": "Endpoint", "Endpoint": "Endpoint",
"Endpoint (Intranet)": "Endpoint (Intranet)", "Endpoint (Intranet)": "Endpoint (Intranet)",
"Endpoint - Tooltip": "Endpoint - Tooltip", "Endpoint - Tooltip": "Endpoint - Tooltip",
"Follow-up action": "Follow-up action",
"Follow-up action - Tooltip": "If you choose \"Use WeChat Open Platform to login\", users need to login on the WeChat Open Platform after following the wechat official account.",
"From address": "From address", "From address": "From address",
"From address - Tooltip": "Email address of \"From\"", "From address - Tooltip": "Email address of \"From\"",
"From name": "From name", "From name": "From name",
@ -835,6 +844,10 @@
"Token URL - Tooltip": "Token URL", "Token URL - Tooltip": "Token URL",
"Type": "Type", "Type": "Type",
"Type - Tooltip": "Select a type", "Type - Tooltip": "Select a type",
"Use WeChat Media Platform in PC": "Use WeChat Media Platform in PC",
"Use WeChat Media Platform in PC - Tooltip": "Whether to allow scanning WeChat Media Platform QR code to login",
"Use WeChat Media Platform to login": "Use WeChat Media Platform to login",
"Use WeChat Open Platform to login": "Use WeChat Open Platform to login",
"User flow": "User flow", "User flow": "User flow",
"User flow - Tooltip": "User flow - Tooltip", "User flow - Tooltip": "User flow - Tooltip",
"User mapping": "User mapping", "User mapping": "User mapping",

View File

@ -22,7 +22,9 @@
"Auto signin - Tooltip": "카스도어에 로그인된 세션이 존재할 때, 애플리케이션 쪽 로그인에 자동으로 사용됩니다", "Auto signin - Tooltip": "카스도어에 로그인된 세션이 존재할 때, 애플리케이션 쪽 로그인에 자동으로 사용됩니다",
"Background URL": "배경 URL", "Background URL": "배경 URL",
"Background URL - Tooltip": "로그인 페이지에서 사용된 배경 이미지의 URL", "Background URL - Tooltip": "로그인 페이지에서 사용된 배경 이미지의 URL",
"Big icon": "Big icon",
"Binding providers": "Binding providers", "Binding providers": "Binding providers",
"CSS style": "CSS style",
"Center": "중앙", "Center": "중앙",
"Copy SAML metadata URL": "SAML 메타데이터 URL 복사", "Copy SAML metadata URL": "SAML 메타데이터 URL 복사",
"Copy prompt page URL": "프롬프트 페이지 URL을 복사하세요", "Copy prompt page URL": "프롬프트 페이지 URL을 복사하세요",
@ -95,11 +97,14 @@
"Sign Up Error": "가입 오류", "Sign Up Error": "가입 오류",
"Signin": "Signin", "Signin": "Signin",
"Signin (Default True)": "Signin (Default True)", "Signin (Default True)": "Signin (Default True)",
"Signin items": "Signin items",
"Signin items - Tooltip": "Signin items - Tooltip",
"Signin methods": "Signin methods", "Signin methods": "Signin methods",
"Signin methods - Tooltip": "Signin methods - Tooltip", "Signin methods - Tooltip": "Signin methods - Tooltip",
"Signin session": "로그인 세션", "Signin session": "로그인 세션",
"Signup items": "가입 항목", "Signup items": "가입 항목",
"Signup items - Tooltip": "새로운 계정 등록시 사용자가 작성해야하는 항목들", "Signup items - Tooltip": "새로운 계정 등록시 사용자가 작성해야하는 항목들",
"Small icon": "Small icon",
"Tags - Tooltip": "Only users with the tag that is listed in the application tags can login", "Tags - Tooltip": "Only users with the tag that is listed in the application tags can login",
"The application does not allow to sign up new account": "이 어플리케이션은 새 계정 등록을 허용하지 않습니다", "The application does not allow to sign up new account": "이 어플리케이션은 새 계정 등록을 허용하지 않습니다",
"Token expire": "토큰 만료", "Token expire": "토큰 만료",
@ -169,6 +174,7 @@
"Adapter - Tooltip": "정책 저장소의 테이블 이름", "Adapter - Tooltip": "정책 저장소의 테이블 이름",
"Adapters": "어댑터", "Adapters": "어댑터",
"Add": "추가하다", "Add": "추가하다",
"Add custom item": "Add custom item",
"Admin": "Admin", "Admin": "Admin",
"Affiliation URL": "소속 URL", "Affiliation URL": "소속 URL",
"Affiliation URL - Tooltip": "소속 홈페이지 URL", "Affiliation URL - Tooltip": "소속 홈페이지 URL",
@ -235,7 +241,7 @@
"Found some texts still not translated? Please help us translate at": "아직 번역되지 않은 텍스트가 있나요? 번역에 도움을 주실 수 있나요?", "Found some texts still not translated? Please help us translate at": "아직 번역되지 않은 텍스트가 있나요? 번역에 도움을 주실 수 있나요?",
"Go to enable": "Go to enable", "Go to enable": "Go to enable",
"Go to writable demo site?": "쓰기 가능한 데모 사이트로 이동하시겠습니까?", "Go to writable demo site?": "쓰기 가능한 데모 사이트로 이동하시겠습니까?",
"Groups": "Groups", "Groups": "그룹",
"Groups - Tooltip": "Groups - Tooltip", "Groups - Tooltip": "Groups - Tooltip",
"Home": "집", "Home": "집",
"Home - Tooltip": "어플리케이션 홈 페이지", "Home - Tooltip": "어플리케이션 홈 페이지",
@ -272,9 +278,9 @@
"None": "None", "None": "None",
"OAuth providers": "OAuth 공급자", "OAuth providers": "OAuth 공급자",
"OK": "예", "OK": "예",
"Organization": "조직", "Organization": "조직",
"Organization - Tooltip": "각 사용자와 애플리케이션은 테넌트나 사용자 풀과 유사한 개념으로, 조직에 속합니다", "Organization - Tooltip": "각 사용자와 애플리케이션은 테넌트나 사용자 풀과 유사한 개념으로, 조직에 속합니다",
"Organizations": "조직", "Organizations": "조직",
"Password": "비밀번호", "Password": "비밀번호",
"Password - Tooltip": "비밀번호가 올바른지 확인하세요", "Password - Tooltip": "비밀번호가 올바른지 확인하세요",
"Password complexity options": "Password complexity options", "Password complexity options": "Password complexity options",
@ -327,6 +333,7 @@
"Signup URL - Tooltip": "등록 페이지를 위한 사용자 정의 URL입니다. 설정되지 않은 경우 기본 Casdoor 등록 페이지가 사용됩니다. 설정하면 Casdoor의 다양한 페이지에서 등록 링크가 이 URL로 리디렉션됩니다", "Signup URL - Tooltip": "등록 페이지를 위한 사용자 정의 URL입니다. 설정되지 않은 경우 기본 Casdoor 등록 페이지가 사용됩니다. 설정하면 Casdoor의 다양한 페이지에서 등록 링크가 이 URL로 리디렉션됩니다",
"Signup application": "가입 양식", "Signup application": "가입 양식",
"Signup application - Tooltip": "사용자가 가입할 때 등록한 어플리케이션은 무엇인가요?", "Signup application - Tooltip": "사용자가 가입할 때 등록한 어플리케이션은 무엇인가요?",
"Signup link": "Signup link",
"Sorry, the page you visited does not exist.": "죄송합니다. 방문하신 페이지는 존재하지 않습니다.", "Sorry, the page you visited does not exist.": "죄송합니다. 방문하신 페이지는 존재하지 않습니다.",
"Sorry, the user you visited does not exist or you are not authorized to access this user.": "죄송합니다. 방문하신 사용자가 존재하지 않거나 사용자에게 접근할 권한이 없습니다.", "Sorry, the user you visited does not exist or you are not authorized to access this user.": "죄송합니다. 방문하신 사용자가 존재하지 않거나 사용자에게 접근할 권한이 없습니다.",
"Sorry, you do not have permission to access this page or logged in status invalid.": "죄송합니다. 이 페이지에 접근할 권한이 없거나 로그인 상태가 유효하지 않습니다.", "Sorry, you do not have permission to access this page or logged in status invalid.": "죄송합니다. 이 페이지에 접근할 권한이 없거나 로그인 상태가 유효하지 않습니다.",
@ -363,7 +370,7 @@
"User containers": "사용자 풀", "User containers": "사용자 풀",
"User type": "사용자 유형", "User type": "사용자 유형",
"User type - Tooltip": "사용자가 속한 태그는 기본적으로 \"보통 사용자\"로 설정됩니다", "User type - Tooltip": "사용자가 속한 태그는 기본적으로 \"보통 사용자\"로 설정됩니다",
"Users": "사용자", "Users": "사용자",
"Users under all organizations": "모든 조직의 사용자", "Users under all organizations": "모든 조직의 사용자",
"Webhooks": "Webhooks", "Webhooks": "Webhooks",
"You can only select one physical group": "You can only select one physical group", "You can only select one physical group": "You can only select one physical group",
@ -431,6 +438,7 @@
}, },
"login": { "login": {
"Auto sign in": "자동 로그인", "Auto sign in": "자동 로그인",
"Back button": "Back button",
"Continue with": "계속하다", "Continue with": "계속하다",
"Email": "Email", "Email": "Email",
"Email or phone": "이메일 또는 전화", "Email or phone": "이메일 또는 전화",
@ -441,6 +449,7 @@
"LDAP username, Email or phone": "LDAP username, Email or phone", "LDAP username, Email or phone": "LDAP username, Email or phone",
"Loading": "로딩 중입니다", "Loading": "로딩 중입니다",
"Logging out...": "로그아웃 중...", "Logging out...": "로그아웃 중...",
"Login button": "Login button",
"MetaMask plugin not detected": "MetaMask plugin not detected", "MetaMask plugin not detected": "MetaMask plugin not detected",
"No account?": "계정이 없나요?", "No account?": "계정이 없나요?",
"Or sign in with another account": "다른 계정으로 로그인하세요", "Or sign in with another account": "다른 계정으로 로그인하세요",
@ -525,7 +534,7 @@
"Is profile public - Tooltip": "닫힌 후에는 전역 관리자 또는 동일한 조직의 사용자만 사용자 프로필 페이지에 액세스할 수 있습니다", "Is profile public - Tooltip": "닫힌 후에는 전역 관리자 또는 동일한 조직의 사용자만 사용자 프로필 페이지에 액세스할 수 있습니다",
"Modify rule": "규칙 수정", "Modify rule": "규칙 수정",
"New Organization": "새로운 조직", "New Organization": "새로운 조직",
"Optional": "Optional", "Optional": "선택사항",
"Prompt": "Prompt", "Prompt": "Prompt",
"Required": "Required", "Required": "Required",
"Soft deletion": "소프트 삭제", "Soft deletion": "소프트 삭제",
@ -725,11 +734,11 @@
"Email content - Tooltip": "이메일 내용", "Email content - Tooltip": "이메일 내용",
"Email title": "이메일 제목", "Email title": "이메일 제목",
"Email title - Tooltip": "이메일 제목", "Email title - Tooltip": "이메일 제목",
"Enable QR code": "QR 코드 활성화",
"Enable QR code - Tooltip": "QR 코드를 스캔해서 로그인할 수 있는지 여부",
"Endpoint": "엔드포인트", "Endpoint": "엔드포인트",
"Endpoint (Intranet)": "엔드포인트 (Intranet)", "Endpoint (Intranet)": "엔드포인트 (Intranet)",
"Endpoint - Tooltip": "Endpoint - Tooltip", "Endpoint - Tooltip": "Endpoint - Tooltip",
"Follow-up action": "Follow-up action",
"Follow-up action - Tooltip": "If you choose \"Use WeChat Open Platform to login\", users need to login on the WeChat Open Platform after following the wechat official account.",
"From address": "From address", "From address": "From address",
"From address - Tooltip": "From address - Tooltip", "From address - Tooltip": "From address - Tooltip",
"From name": "From name", "From name": "From name",
@ -835,6 +844,10 @@
"Token URL - Tooltip": "토큰 URL", "Token URL - Tooltip": "토큰 URL",
"Type": "타입", "Type": "타입",
"Type - Tooltip": "유형을 선택하세요", "Type - Tooltip": "유형을 선택하세요",
"Use WeChat Media Platform in PC": "Use WeChat Media Platform in PC",
"Use WeChat Media Platform in PC - Tooltip": "Whether to allow scanning WeChat Media Platform QR code to login",
"Use WeChat Media Platform to login": "Use WeChat Media Platform to login",
"Use WeChat Open Platform to login": "Use WeChat Open Platform to login",
"User flow": "User flow", "User flow": "User flow",
"User flow - Tooltip": "User flow - Tooltip", "User flow - Tooltip": "User flow - Tooltip",
"User mapping": "User mapping", "User mapping": "User mapping",
@ -858,7 +871,7 @@
"New Role": "새로운 역할", "New Role": "새로운 역할",
"Sub domains": "하위 도메인", "Sub domains": "하위 도메인",
"Sub domains - Tooltip": "현재 역할에 포함된 도메인", "Sub domains - Tooltip": "현재 역할에 포함된 도메인",
"Sub groups": "Sub groups", "Sub groups": "하위 그룹",
"Sub groups - Tooltip": "Sub groups - Tooltip", "Sub groups - Tooltip": "Sub groups - Tooltip",
"Sub roles": "서브 역할", "Sub roles": "서브 역할",
"Sub roles - Tooltip": "현재 역할에 포함된 역할", "Sub roles - Tooltip": "현재 역할에 포함된 역할",

View File

@ -22,7 +22,9 @@
"Auto signin - Tooltip": "When a logged-in session exists in Casdoor, it is automatically used for application-side login", "Auto signin - Tooltip": "When a logged-in session exists in Casdoor, it is automatically used for application-side login",
"Background URL": "Background URL", "Background URL": "Background URL",
"Background URL - Tooltip": "URL of the background image used in the login page", "Background URL - Tooltip": "URL of the background image used in the login page",
"Big icon": "Big icon",
"Binding providers": "Binding providers", "Binding providers": "Binding providers",
"CSS style": "CSS style",
"Center": "Center", "Center": "Center",
"Copy SAML metadata URL": "Copy SAML metadata URL", "Copy SAML metadata URL": "Copy SAML metadata URL",
"Copy prompt page URL": "Copy prompt page URL", "Copy prompt page URL": "Copy prompt page URL",
@ -95,11 +97,14 @@
"Sign Up Error": "Sign Up Error", "Sign Up Error": "Sign Up Error",
"Signin": "Signin", "Signin": "Signin",
"Signin (Default True)": "Signin (Default True)", "Signin (Default True)": "Signin (Default True)",
"Signin items": "Signin items",
"Signin items - Tooltip": "Signin items - Tooltip",
"Signin methods": "Signin methods", "Signin methods": "Signin methods",
"Signin methods - Tooltip": "Signin methods - Tooltip", "Signin methods - Tooltip": "Signin methods - Tooltip",
"Signin session": "Signin session", "Signin session": "Signin session",
"Signup items": "Signup items", "Signup items": "Signup items",
"Signup items - Tooltip": "Items for users to fill in when registering new accounts", "Signup items - Tooltip": "Items for users to fill in when registering new accounts",
"Small icon": "Small icon",
"Tags - Tooltip": "Only users with the tag that is listed in the application tags can login", "Tags - Tooltip": "Only users with the tag that is listed in the application tags can login",
"The application does not allow to sign up new account": "The application does not allow to sign up new account", "The application does not allow to sign up new account": "The application does not allow to sign up new account",
"Token expire": "Token expire", "Token expire": "Token expire",
@ -169,6 +174,7 @@
"Adapter - Tooltip": "Table name of the policy store", "Adapter - Tooltip": "Table name of the policy store",
"Adapters": "Adapters", "Adapters": "Adapters",
"Add": "Add", "Add": "Add",
"Add custom item": "Add custom item",
"Admin": "Admin", "Admin": "Admin",
"Affiliation URL": "Affiliation URL", "Affiliation URL": "Affiliation URL",
"Affiliation URL - Tooltip": "The homepage URL for the affiliation", "Affiliation URL - Tooltip": "The homepage URL for the affiliation",
@ -327,6 +333,7 @@
"Signup URL - Tooltip": "Custom URL for the registration page. If not set, the default Casdoor registration page will be used. When set, the registration links on various Casdoor pages will redirect to this URL", "Signup URL - Tooltip": "Custom URL for the registration page. If not set, the default Casdoor registration page will be used. When set, the registration links on various Casdoor pages will redirect to this URL",
"Signup application": "Signup application", "Signup application": "Signup application",
"Signup application - Tooltip": "Which application the user registered through when they signed up", "Signup application - Tooltip": "Which application the user registered through when they signed up",
"Signup link": "Signup link",
"Sorry, the page you visited does not exist.": "Sorry, the page you visited does not exist.", "Sorry, the page you visited does not exist.": "Sorry, the page you visited does not exist.",
"Sorry, the user you visited does not exist or you are not authorized to access this user.": "Sorry, the user you visited does not exist or you are not authorized to access this user.", "Sorry, the user you visited does not exist or you are not authorized to access this user.": "Sorry, the user you visited does not exist or you are not authorized to access this user.",
"Sorry, you do not have permission to access this page or logged in status invalid.": "Sorry, you do not have permission to access this page or logged in status invalid.", "Sorry, you do not have permission to access this page or logged in status invalid.": "Sorry, you do not have permission to access this page or logged in status invalid.",
@ -431,6 +438,7 @@
}, },
"login": { "login": {
"Auto sign in": "Auto sign in", "Auto sign in": "Auto sign in",
"Back button": "Back button",
"Continue with": "Continue with", "Continue with": "Continue with",
"Email": "Email", "Email": "Email",
"Email or phone": "Email or phone", "Email or phone": "Email or phone",
@ -441,6 +449,7 @@
"LDAP username, Email or phone": "LDAP username, Email or phone", "LDAP username, Email or phone": "LDAP username, Email or phone",
"Loading": "Loading", "Loading": "Loading",
"Logging out...": "Logging out...", "Logging out...": "Logging out...",
"Login button": "Login button",
"MetaMask plugin not detected": "MetaMask plugin not detected", "MetaMask plugin not detected": "MetaMask plugin not detected",
"No account?": "No account?", "No account?": "No account?",
"Or sign in with another account": "Or sign in with another account", "Or sign in with another account": "Or sign in with another account",
@ -725,11 +734,11 @@
"Email content - Tooltip": "Content of the Email", "Email content - Tooltip": "Content of the Email",
"Email title": "Email title", "Email title": "Email title",
"Email title - Tooltip": "Title of the email", "Email title - Tooltip": "Title of the email",
"Enable QR code": "Enable QR code",
"Enable QR code - Tooltip": "Whether to allow scanning QR code to login",
"Endpoint": "Endpoint", "Endpoint": "Endpoint",
"Endpoint (Intranet)": "Endpoint (Intranet)", "Endpoint (Intranet)": "Endpoint (Intranet)",
"Endpoint - Tooltip": "Endpoint - Tooltip", "Endpoint - Tooltip": "Endpoint - Tooltip",
"Follow-up action": "Follow-up action",
"Follow-up action - Tooltip": "If you choose \"Use WeChat Open Platform to login\", users need to login on the WeChat Open Platform after following the wechat official account.",
"From address": "From address", "From address": "From address",
"From address - Tooltip": "Email address of \"From\"", "From address - Tooltip": "Email address of \"From\"",
"From name": "From name", "From name": "From name",
@ -835,6 +844,10 @@
"Token URL - Tooltip": "Token URL", "Token URL - Tooltip": "Token URL",
"Type": "Type", "Type": "Type",
"Type - Tooltip": "Select a type", "Type - Tooltip": "Select a type",
"Use WeChat Media Platform in PC": "Use WeChat Media Platform in PC",
"Use WeChat Media Platform in PC - Tooltip": "Whether to allow scanning WeChat Media Platform QR code to login",
"Use WeChat Media Platform to login": "Use WeChat Media Platform to login",
"Use WeChat Open Platform to login": "Use WeChat Open Platform to login",
"User flow": "User flow", "User flow": "User flow",
"User flow - Tooltip": "User flow - Tooltip", "User flow - Tooltip": "User flow - Tooltip",
"User mapping": "User mapping", "User mapping": "User mapping",

View File

@ -22,7 +22,9 @@
"Auto signin - Tooltip": "When a logged-in session exists in Casdoor, it is automatically used for application-side login", "Auto signin - Tooltip": "When a logged-in session exists in Casdoor, it is automatically used for application-side login",
"Background URL": "Background URL", "Background URL": "Background URL",
"Background URL - Tooltip": "URL of the background image used in the login page", "Background URL - Tooltip": "URL of the background image used in the login page",
"Big icon": "Big icon",
"Binding providers": "Binding providers", "Binding providers": "Binding providers",
"CSS style": "CSS style",
"Center": "Center", "Center": "Center",
"Copy SAML metadata URL": "Copy SAML metadata URL", "Copy SAML metadata URL": "Copy SAML metadata URL",
"Copy prompt page URL": "Copy prompt page URL", "Copy prompt page URL": "Copy prompt page URL",
@ -95,11 +97,14 @@
"Sign Up Error": "Sign Up Error", "Sign Up Error": "Sign Up Error",
"Signin": "Signin", "Signin": "Signin",
"Signin (Default True)": "Signin (Default True)", "Signin (Default True)": "Signin (Default True)",
"Signin items": "Signin items",
"Signin items - Tooltip": "Signin items - Tooltip",
"Signin methods": "Signin methods", "Signin methods": "Signin methods",
"Signin methods - Tooltip": "Signin methods - Tooltip", "Signin methods - Tooltip": "Signin methods - Tooltip",
"Signin session": "Signin session", "Signin session": "Signin session",
"Signup items": "Signup items", "Signup items": "Signup items",
"Signup items - Tooltip": "Items for users to fill in when registering new accounts", "Signup items - Tooltip": "Items for users to fill in when registering new accounts",
"Small icon": "Small icon",
"Tags - Tooltip": "Only users with the tag that is listed in the application tags can login", "Tags - Tooltip": "Only users with the tag that is listed in the application tags can login",
"The application does not allow to sign up new account": "The application does not allow to sign up new account", "The application does not allow to sign up new account": "The application does not allow to sign up new account",
"Token expire": "Token expire", "Token expire": "Token expire",
@ -169,6 +174,7 @@
"Adapter - Tooltip": "Table name of the policy store", "Adapter - Tooltip": "Table name of the policy store",
"Adapters": "Adapters", "Adapters": "Adapters",
"Add": "Add", "Add": "Add",
"Add custom item": "Add custom item",
"Admin": "Admin", "Admin": "Admin",
"Affiliation URL": "Affiliation URL", "Affiliation URL": "Affiliation URL",
"Affiliation URL - Tooltip": "The homepage URL for the affiliation", "Affiliation URL - Tooltip": "The homepage URL for the affiliation",
@ -327,6 +333,7 @@
"Signup URL - Tooltip": "Custom URL for the registration page. If not set, the default Casdoor registration page will be used. When set, the registration links on various Casdoor pages will redirect to this URL", "Signup URL - Tooltip": "Custom URL for the registration page. If not set, the default Casdoor registration page will be used. When set, the registration links on various Casdoor pages will redirect to this URL",
"Signup application": "Signup application", "Signup application": "Signup application",
"Signup application - Tooltip": "Which application the user registered through when they signed up", "Signup application - Tooltip": "Which application the user registered through when they signed up",
"Signup link": "Signup link",
"Sorry, the page you visited does not exist.": "Sorry, the page you visited does not exist.", "Sorry, the page you visited does not exist.": "Sorry, the page you visited does not exist.",
"Sorry, the user you visited does not exist or you are not authorized to access this user.": "Sorry, the user you visited does not exist or you are not authorized to access this user.", "Sorry, the user you visited does not exist or you are not authorized to access this user.": "Sorry, the user you visited does not exist or you are not authorized to access this user.",
"Sorry, you do not have permission to access this page or logged in status invalid.": "Sorry, you do not have permission to access this page or logged in status invalid.", "Sorry, you do not have permission to access this page or logged in status invalid.": "Sorry, you do not have permission to access this page or logged in status invalid.",
@ -431,6 +438,7 @@
}, },
"login": { "login": {
"Auto sign in": "Auto sign in", "Auto sign in": "Auto sign in",
"Back button": "Back button",
"Continue with": "Continue with", "Continue with": "Continue with",
"Email": "Email", "Email": "Email",
"Email or phone": "Email or phone", "Email or phone": "Email or phone",
@ -441,6 +449,7 @@
"LDAP username, Email or phone": "LDAP username, Email or phone", "LDAP username, Email or phone": "LDAP username, Email or phone",
"Loading": "Loading", "Loading": "Loading",
"Logging out...": "Logging out...", "Logging out...": "Logging out...",
"Login button": "Login button",
"MetaMask plugin not detected": "MetaMask plugin not detected", "MetaMask plugin not detected": "MetaMask plugin not detected",
"No account?": "No account?", "No account?": "No account?",
"Or sign in with another account": "Or sign in with another account", "Or sign in with another account": "Or sign in with another account",
@ -725,11 +734,11 @@
"Email content - Tooltip": "Content of the Email", "Email content - Tooltip": "Content of the Email",
"Email title": "Email title", "Email title": "Email title",
"Email title - Tooltip": "Title of the email", "Email title - Tooltip": "Title of the email",
"Enable QR code": "Enable QR code",
"Enable QR code - Tooltip": "Whether to allow scanning QR code to login",
"Endpoint": "Endpoint", "Endpoint": "Endpoint",
"Endpoint (Intranet)": "Endpoint (Intranet)", "Endpoint (Intranet)": "Endpoint (Intranet)",
"Endpoint - Tooltip": "Endpoint - Tooltip", "Endpoint - Tooltip": "Endpoint - Tooltip",
"Follow-up action": "Follow-up action",
"Follow-up action - Tooltip": "If you choose \"Use WeChat Open Platform to login\", users need to login on the WeChat Open Platform after following the wechat official account.",
"From address": "From address", "From address": "From address",
"From address - Tooltip": "Email address of \"From\"", "From address - Tooltip": "Email address of \"From\"",
"From name": "From name", "From name": "From name",
@ -835,6 +844,10 @@
"Token URL - Tooltip": "Token URL", "Token URL - Tooltip": "Token URL",
"Type": "Type", "Type": "Type",
"Type - Tooltip": "Select a type", "Type - Tooltip": "Select a type",
"Use WeChat Media Platform in PC": "Use WeChat Media Platform in PC",
"Use WeChat Media Platform in PC - Tooltip": "Whether to allow scanning WeChat Media Platform QR code to login",
"Use WeChat Media Platform to login": "Use WeChat Media Platform to login",
"Use WeChat Open Platform to login": "Use WeChat Open Platform to login",
"User flow": "User flow", "User flow": "User flow",
"User flow - Tooltip": "User flow - Tooltip", "User flow - Tooltip": "User flow - Tooltip",
"User mapping": "User mapping", "User mapping": "User mapping",

View File

@ -22,7 +22,9 @@
"Auto signin - Tooltip": "When a logged-in session exists in Casdoor, it is automatically used for application-side login", "Auto signin - Tooltip": "When a logged-in session exists in Casdoor, it is automatically used for application-side login",
"Background URL": "Background URL", "Background URL": "Background URL",
"Background URL - Tooltip": "URL of the background image used in the login page", "Background URL - Tooltip": "URL of the background image used in the login page",
"Big icon": "Big icon",
"Binding providers": "Binding providers", "Binding providers": "Binding providers",
"CSS style": "CSS style",
"Center": "Center", "Center": "Center",
"Copy SAML metadata URL": "Copy SAML metadata URL", "Copy SAML metadata URL": "Copy SAML metadata URL",
"Copy prompt page URL": "Copy prompt page URL", "Copy prompt page URL": "Copy prompt page URL",
@ -95,11 +97,14 @@
"Sign Up Error": "Sign Up Error", "Sign Up Error": "Sign Up Error",
"Signin": "Signin", "Signin": "Signin",
"Signin (Default True)": "Signin (Default True)", "Signin (Default True)": "Signin (Default True)",
"Signin items": "Signin items",
"Signin items - Tooltip": "Signin items - Tooltip",
"Signin methods": "Signin methods", "Signin methods": "Signin methods",
"Signin methods - Tooltip": "Signin methods - Tooltip", "Signin methods - Tooltip": "Signin methods - Tooltip",
"Signin session": "Signin session", "Signin session": "Signin session",
"Signup items": "Signup items", "Signup items": "Signup items",
"Signup items - Tooltip": "Items for users to fill in when registering new accounts", "Signup items - Tooltip": "Items for users to fill in when registering new accounts",
"Small icon": "Small icon",
"Tags - Tooltip": "Only users with the tag that is listed in the application tags can login", "Tags - Tooltip": "Only users with the tag that is listed in the application tags can login",
"The application does not allow to sign up new account": "The application does not allow to sign up new account", "The application does not allow to sign up new account": "The application does not allow to sign up new account",
"Token expire": "Token expire", "Token expire": "Token expire",
@ -169,6 +174,7 @@
"Adapter - Tooltip": "Table name of the policy store", "Adapter - Tooltip": "Table name of the policy store",
"Adapters": "Adapters", "Adapters": "Adapters",
"Add": "Add", "Add": "Add",
"Add custom item": "Add custom item",
"Admin": "Admin", "Admin": "Admin",
"Affiliation URL": "Affiliation URL", "Affiliation URL": "Affiliation URL",
"Affiliation URL - Tooltip": "The homepage URL for the affiliation", "Affiliation URL - Tooltip": "The homepage URL for the affiliation",
@ -327,6 +333,7 @@
"Signup URL - Tooltip": "Custom URL for the registration page. If not set, the default Casdoor registration page will be used. When set, the registration links on various Casdoor pages will redirect to this URL", "Signup URL - Tooltip": "Custom URL for the registration page. If not set, the default Casdoor registration page will be used. When set, the registration links on various Casdoor pages will redirect to this URL",
"Signup application": "Signup application", "Signup application": "Signup application",
"Signup application - Tooltip": "Which application the user registered through when they signed up", "Signup application - Tooltip": "Which application the user registered through when they signed up",
"Signup link": "Signup link",
"Sorry, the page you visited does not exist.": "Sorry, the page you visited does not exist.", "Sorry, the page you visited does not exist.": "Sorry, the page you visited does not exist.",
"Sorry, the user you visited does not exist or you are not authorized to access this user.": "Sorry, the user you visited does not exist or you are not authorized to access this user.", "Sorry, the user you visited does not exist or you are not authorized to access this user.": "Sorry, the user you visited does not exist or you are not authorized to access this user.",
"Sorry, you do not have permission to access this page or logged in status invalid.": "Sorry, you do not have permission to access this page or logged in status invalid.", "Sorry, you do not have permission to access this page or logged in status invalid.": "Sorry, you do not have permission to access this page or logged in status invalid.",
@ -431,6 +438,7 @@
}, },
"login": { "login": {
"Auto sign in": "Auto sign in", "Auto sign in": "Auto sign in",
"Back button": "Back button",
"Continue with": "Continue with", "Continue with": "Continue with",
"Email": "Email", "Email": "Email",
"Email or phone": "Email or phone", "Email or phone": "Email or phone",
@ -441,6 +449,7 @@
"LDAP username, Email or phone": "LDAP username, Email or phone", "LDAP username, Email or phone": "LDAP username, Email or phone",
"Loading": "Loading", "Loading": "Loading",
"Logging out...": "Logging out...", "Logging out...": "Logging out...",
"Login button": "Login button",
"MetaMask plugin not detected": "MetaMask plugin not detected", "MetaMask plugin not detected": "MetaMask plugin not detected",
"No account?": "No account?", "No account?": "No account?",
"Or sign in with another account": "Or sign in with another account", "Or sign in with another account": "Or sign in with another account",
@ -725,11 +734,11 @@
"Email content - Tooltip": "Content of the Email", "Email content - Tooltip": "Content of the Email",
"Email title": "Email title", "Email title": "Email title",
"Email title - Tooltip": "Title of the email", "Email title - Tooltip": "Title of the email",
"Enable QR code": "Enable QR code",
"Enable QR code - Tooltip": "Whether to allow scanning QR code to login",
"Endpoint": "Endpoint", "Endpoint": "Endpoint",
"Endpoint (Intranet)": "Endpoint (Intranet)", "Endpoint (Intranet)": "Endpoint (Intranet)",
"Endpoint - Tooltip": "Endpoint - Tooltip", "Endpoint - Tooltip": "Endpoint - Tooltip",
"Follow-up action": "Follow-up action",
"Follow-up action - Tooltip": "If you choose \"Use WeChat Open Platform to login\", users need to login on the WeChat Open Platform after following the wechat official account.",
"From address": "From address", "From address": "From address",
"From address - Tooltip": "Email address of \"From\"", "From address - Tooltip": "Email address of \"From\"",
"From name": "From name", "From name": "From name",
@ -835,6 +844,10 @@
"Token URL - Tooltip": "Token URL", "Token URL - Tooltip": "Token URL",
"Type": "Type", "Type": "Type",
"Type - Tooltip": "Select a type", "Type - Tooltip": "Select a type",
"Use WeChat Media Platform in PC": "Use WeChat Media Platform in PC",
"Use WeChat Media Platform in PC - Tooltip": "Whether to allow scanning WeChat Media Platform QR code to login",
"Use WeChat Media Platform to login": "Use WeChat Media Platform to login",
"Use WeChat Open Platform to login": "Use WeChat Open Platform to login",
"User flow": "User flow", "User flow": "User flow",
"User flow - Tooltip": "User flow - Tooltip", "User flow - Tooltip": "User flow - Tooltip",
"User mapping": "User mapping", "User mapping": "User mapping",

View File

@ -22,7 +22,9 @@
"Auto signin - Tooltip": "Quando uma sessão logada existe no Casdoor, ela é automaticamente usada para o login no lado da aplicação", "Auto signin - Tooltip": "Quando uma sessão logada existe no Casdoor, ela é automaticamente usada para o login no lado da aplicação",
"Background URL": "URL de Fundo", "Background URL": "URL de Fundo",
"Background URL - Tooltip": "URL da imagem de fundo usada na página de login", "Background URL - Tooltip": "URL da imagem de fundo usada na página de login",
"Big icon": "Big icon",
"Binding providers": "Binding providers", "Binding providers": "Binding providers",
"CSS style": "CSS style",
"Center": "Centro", "Center": "Centro",
"Copy SAML metadata URL": "Copiar URL de metadados SAML", "Copy SAML metadata URL": "Copiar URL de metadados SAML",
"Copy prompt page URL": "Copiar URL da página de prompt", "Copy prompt page URL": "Copiar URL da página de prompt",
@ -95,11 +97,14 @@
"Sign Up Error": "Erro ao Registrar", "Sign Up Error": "Erro ao Registrar",
"Signin": "Login", "Signin": "Login",
"Signin (Default True)": "Login (Padrão Verdadeiro)", "Signin (Default True)": "Login (Padrão Verdadeiro)",
"Signin items": "Signin items",
"Signin items - Tooltip": "Signin items - Tooltip",
"Signin methods": "Signin methods", "Signin methods": "Signin methods",
"Signin methods - Tooltip": "Signin methods - Tooltip", "Signin methods - Tooltip": "Signin methods - Tooltip",
"Signin session": "Sessão de login", "Signin session": "Sessão de login",
"Signup items": "Itens de registro", "Signup items": "Itens de registro",
"Signup items - Tooltip": "Itens para os usuários preencherem ao registrar novas contas", "Signup items - Tooltip": "Itens para os usuários preencherem ao registrar novas contas",
"Small icon": "Small icon",
"Tags - Tooltip": "Apenas usuários com a tag listada nas tags do aplicativo podem acessar", "Tags - Tooltip": "Apenas usuários com a tag listada nas tags do aplicativo podem acessar",
"The application does not allow to sign up new account": "A aplicação não permite o registro de novas contas", "The application does not allow to sign up new account": "A aplicação não permite o registro de novas contas",
"Token expire": "Expiração do Token", "Token expire": "Expiração do Token",
@ -169,6 +174,7 @@
"Adapter - Tooltip": "Nome da tabela do armazenamento de políticas", "Adapter - Tooltip": "Nome da tabela do armazenamento de políticas",
"Adapters": "Adaptadores", "Adapters": "Adaptadores",
"Add": "Adicionar", "Add": "Adicionar",
"Add custom item": "Add custom item",
"Admin": "Admin", "Admin": "Admin",
"Affiliation URL": "URL da Afiliação", "Affiliation URL": "URL da Afiliação",
"Affiliation URL - Tooltip": "A URL da página inicial para a afiliação", "Affiliation URL - Tooltip": "A URL da página inicial para a afiliação",
@ -327,6 +333,7 @@
"Signup URL - Tooltip": "URL personalizada para a página de registro. Se não definido, será usada a página padrão de registro do Casdoor. Quando definido, os links de registro em várias páginas do Casdoor serão redirecionados para esta URL", "Signup URL - Tooltip": "URL personalizada para a página de registro. Se não definido, será usada a página padrão de registro do Casdoor. Quando definido, os links de registro em várias páginas do Casdoor serão redirecionados para esta URL",
"Signup application": "Aplicativo de registro", "Signup application": "Aplicativo de registro",
"Signup application - Tooltip": "Qual aplicativo o usuário usou para se registrar quando se inscreveu", "Signup application - Tooltip": "Qual aplicativo o usuário usou para se registrar quando se inscreveu",
"Signup link": "Signup link",
"Sorry, the page you visited does not exist.": "Desculpe, a página que você visitou não existe.", "Sorry, the page you visited does not exist.": "Desculpe, a página que você visitou não existe.",
"Sorry, the user you visited does not exist or you are not authorized to access this user.": "Desculpe, o usuário que você visitou não existe ou você não está autorizado a acessar este usuário.", "Sorry, the user you visited does not exist or you are not authorized to access this user.": "Desculpe, o usuário que você visitou não existe ou você não está autorizado a acessar este usuário.",
"Sorry, you do not have permission to access this page or logged in status invalid.": "Desculpe, você não tem permissão para acessar esta página ou o status de login é inválido.", "Sorry, you do not have permission to access this page or logged in status invalid.": "Desculpe, você não tem permissão para acessar esta página ou o status de login é inválido.",
@ -431,6 +438,7 @@
}, },
"login": { "login": {
"Auto sign in": "Entrar automaticamente", "Auto sign in": "Entrar automaticamente",
"Back button": "Back button",
"Continue with": "Continuar com", "Continue with": "Continuar com",
"Email": "Email", "Email": "Email",
"Email or phone": "Email ou telefone", "Email or phone": "Email ou telefone",
@ -441,6 +449,7 @@
"LDAP username, Email or phone": "LDAP username, Email or phone", "LDAP username, Email or phone": "LDAP username, Email or phone",
"Loading": "Carregando", "Loading": "Carregando",
"Logging out...": "Saindo...", "Logging out...": "Saindo...",
"Login button": "Login button",
"MetaMask plugin not detected": "MetaMask plugin not detected", "MetaMask plugin not detected": "MetaMask plugin not detected",
"No account?": "Não possui uma conta?", "No account?": "Não possui uma conta?",
"Or sign in with another account": "Ou entre com outra conta", "Or sign in with another account": "Ou entre com outra conta",
@ -725,11 +734,11 @@
"Email content - Tooltip": "Conteúdo do e-mail", "Email content - Tooltip": "Conteúdo do e-mail",
"Email title": "Título do e-mail", "Email title": "Título do e-mail",
"Email title - Tooltip": "Título do e-mail", "Email title - Tooltip": "Título do e-mail",
"Enable QR code": "Habilitar código QR",
"Enable QR code - Tooltip": "Se permite escanear código QR para fazer login",
"Endpoint": "Endpoint", "Endpoint": "Endpoint",
"Endpoint (Intranet)": "Endpoint (Intranet)", "Endpoint (Intranet)": "Endpoint (Intranet)",
"Endpoint - Tooltip": "Endpoint - Tooltip", "Endpoint - Tooltip": "Endpoint - Tooltip",
"Follow-up action": "Follow-up action",
"Follow-up action - Tooltip": "If you choose \"Use WeChat Open Platform to login\", users need to login on the WeChat Open Platform after following the wechat official account.",
"From address": "Endereço do remetente", "From address": "Endereço do remetente",
"From address - Tooltip": "Endereço de e-mail do remetente", "From address - Tooltip": "Endereço de e-mail do remetente",
"From name": "Nome do remetente", "From name": "Nome do remetente",
@ -835,6 +844,10 @@
"Token URL - Tooltip": "URL do Token", "Token URL - Tooltip": "URL do Token",
"Type": "Tipo", "Type": "Tipo",
"Type - Tooltip": "Selecione um tipo", "Type - Tooltip": "Selecione um tipo",
"Use WeChat Media Platform in PC": "Use WeChat Media Platform in PC",
"Use WeChat Media Platform in PC - Tooltip": "Whether to allow scanning WeChat Media Platform QR code to login",
"Use WeChat Media Platform to login": "Use WeChat Media Platform to login",
"Use WeChat Open Platform to login": "Use WeChat Open Platform to login",
"User flow": "User flow", "User flow": "User flow",
"User flow - Tooltip": "User flow - Tooltip", "User flow - Tooltip": "User flow - Tooltip",
"User mapping": "User mapping", "User mapping": "User mapping",

View File

@ -22,7 +22,9 @@
"Auto signin - Tooltip": "Когда существует активная сессия входа в Casdoor, она автоматически используется для входа на стороне приложения", "Auto signin - Tooltip": "Когда существует активная сессия входа в Casdoor, она автоматически используется для входа на стороне приложения",
"Background URL": "Фоновый URL", "Background URL": "Фоновый URL",
"Background URL - Tooltip": "URL фонового изображения, используемого на странице входа", "Background URL - Tooltip": "URL фонового изображения, используемого на странице входа",
"Big icon": "Big icon",
"Binding providers": "Связанные провайдеры", "Binding providers": "Связанные провайдеры",
"CSS style": "CSS style",
"Center": "Центр", "Center": "Центр",
"Copy SAML metadata URL": "Скопируйте URL метаданных SAML", "Copy SAML metadata URL": "Скопируйте URL метаданных SAML",
"Copy prompt page URL": "Скопируйте URL страницы предложения", "Copy prompt page URL": "Скопируйте URL страницы предложения",
@ -95,11 +97,14 @@
"Sign Up Error": "Ошибка при регистрации", "Sign Up Error": "Ошибка при регистрации",
"Signin": "Регистрация", "Signin": "Регистрация",
"Signin (Default True)": "Регистрация (отмечено по умолчанию)", "Signin (Default True)": "Регистрация (отмечено по умолчанию)",
"Signin items": "Signin items",
"Signin items - Tooltip": "Signin items - Tooltip",
"Signin methods": "Signin methods", "Signin methods": "Signin methods",
"Signin methods - Tooltip": "Signin methods - Tooltip", "Signin methods - Tooltip": "Signin methods - Tooltip",
"Signin session": "Сессия входа в систему", "Signin session": "Сессия входа в систему",
"Signup items": "Элементы регистрации", "Signup items": "Элементы регистрации",
"Signup items - Tooltip": "Элементы, которые пользователи должны заполнить при регистрации новых аккаунтов", "Signup items - Tooltip": "Элементы, которые пользователи должны заполнить при регистрации новых аккаунтов",
"Small icon": "Small icon",
"Tags - Tooltip": "Только пользователи с тегом, указанным в тегах приложения могут войти в систему", "Tags - Tooltip": "Только пользователи с тегом, указанным в тегах приложения могут войти в систему",
"The application does not allow to sign up new account": "Приложение не позволяет зарегистрироваться новому аккаунту", "The application does not allow to sign up new account": "Приложение не позволяет зарегистрироваться новому аккаунту",
"Token expire": "Срок действия токена истекает", "Token expire": "Срок действия токена истекает",
@ -169,6 +174,7 @@
"Adapter - Tooltip": "Имя таблицы хранилища политик", "Adapter - Tooltip": "Имя таблицы хранилища политик",
"Adapters": "Адаптеры", "Adapters": "Адаптеры",
"Add": "Добавить", "Add": "Добавить",
"Add custom item": "Add custom item",
"Admin": "Admin", "Admin": "Admin",
"Affiliation URL": "URL принадлежности", "Affiliation URL": "URL принадлежности",
"Affiliation URL - Tooltip": "URL домашней страницы для аффилированности", "Affiliation URL - Tooltip": "URL домашней страницы для аффилированности",
@ -327,6 +333,7 @@
"Signup URL - Tooltip": "Пользовательский URL для страницы регистрации. Если не установлен, будет использоваться стандартная страница регистрации Casdoor. При установке ссылки на регистрацию на различных страницах Casdoor будут перенаправлены на этот URL", "Signup URL - Tooltip": "Пользовательский URL для страницы регистрации. Если не установлен, будет использоваться стандартная страница регистрации Casdoor. При установке ссылки на регистрацию на различных страницах Casdoor будут перенаправлены на этот URL",
"Signup application": "Заявка на регистрацию", "Signup application": "Заявка на регистрацию",
"Signup application - Tooltip": "На какое приложение пользователь зарегистрировался при регистрации?", "Signup application - Tooltip": "На какое приложение пользователь зарегистрировался при регистрации?",
"Signup link": "Signup link",
"Sorry, the page you visited does not exist.": "Извините, страница, которую вы посетили, не существует.", "Sorry, the page you visited does not exist.": "Извините, страница, которую вы посетили, не существует.",
"Sorry, the user you visited does not exist or you are not authorized to access this user.": "Извините, такого пользователя не существует или у вас нет прав для доступа к данному пользователю.", "Sorry, the user you visited does not exist or you are not authorized to access this user.": "Извините, такого пользователя не существует или у вас нет прав для доступа к данному пользователю.",
"Sorry, you do not have permission to access this page or logged in status invalid.": "К сожалению, у вас нет разрешения на доступ к этой странице или ваш статус входа недействителен.", "Sorry, you do not have permission to access this page or logged in status invalid.": "К сожалению, у вас нет разрешения на доступ к этой странице или ваш статус входа недействителен.",
@ -431,6 +438,7 @@
}, },
"login": { "login": {
"Auto sign in": "Автоматическая авторизация", "Auto sign in": "Автоматическая авторизация",
"Back button": "Back button",
"Continue with": "Продолжайте с", "Continue with": "Продолжайте с",
"Email": "Email", "Email": "Email",
"Email or phone": "Электронная почта или телефон", "Email or phone": "Электронная почта или телефон",
@ -441,6 +449,7 @@
"LDAP username, Email or phone": "LDAP username, Email or phone", "LDAP username, Email or phone": "LDAP username, Email or phone",
"Loading": "Загрузка", "Loading": "Загрузка",
"Logging out...": "Выход...", "Logging out...": "Выход...",
"Login button": "Login button",
"MetaMask plugin not detected": "MetaMask plugin not detected", "MetaMask plugin not detected": "MetaMask plugin not detected",
"No account?": "Нет аккаунта?", "No account?": "Нет аккаунта?",
"Or sign in with another account": "Или войти с другой учетной записью", "Or sign in with another account": "Или войти с другой учетной записью",
@ -725,11 +734,11 @@
"Email content - Tooltip": "Содержание электронной почты", "Email content - Tooltip": "Содержание электронной почты",
"Email title": "Заголовок электронного письма", "Email title": "Заголовок электронного письма",
"Email title - Tooltip": "Заголовок электронной почты", "Email title - Tooltip": "Заголовок электронной почты",
"Enable QR code": "Включить QR-код",
"Enable QR code - Tooltip": "Разрешить ли сканирование QR-кода для входа в систему",
"Endpoint": "Конечная точка", "Endpoint": "Конечная точка",
"Endpoint (Intranet)": "Конечная точка (интранет)", "Endpoint (Intranet)": "Конечная точка (интранет)",
"Endpoint - Tooltip": "Endpoint - Tooltip", "Endpoint - Tooltip": "Endpoint - Tooltip",
"Follow-up action": "Follow-up action",
"Follow-up action - Tooltip": "If you choose \"Use WeChat Open Platform to login\", users need to login on the WeChat Open Platform after following the wechat official account.",
"From address": "From address", "From address": "From address",
"From address - Tooltip": "From address - Tooltip", "From address - Tooltip": "From address - Tooltip",
"From name": "From name", "From name": "From name",
@ -835,6 +844,10 @@
"Token URL - Tooltip": "Токен URL", "Token URL - Tooltip": "Токен URL",
"Type": "Тип", "Type": "Тип",
"Type - Tooltip": "Выберите тип", "Type - Tooltip": "Выберите тип",
"Use WeChat Media Platform in PC": "Use WeChat Media Platform in PC",
"Use WeChat Media Platform in PC - Tooltip": "Whether to allow scanning WeChat Media Platform QR code to login",
"Use WeChat Media Platform to login": "Use WeChat Media Platform to login",
"Use WeChat Open Platform to login": "Use WeChat Open Platform to login",
"User flow": "User flow", "User flow": "User flow",
"User flow - Tooltip": "User flow - Tooltip", "User flow - Tooltip": "User flow - Tooltip",
"User mapping": "User mapping", "User mapping": "User mapping",

View File

@ -22,7 +22,9 @@
"Auto signin - Tooltip": "When a logged-in session exists in Casdoor, it is automatically used for application-side login", "Auto signin - Tooltip": "When a logged-in session exists in Casdoor, it is automatically used for application-side login",
"Background URL": "Background URL", "Background URL": "Background URL",
"Background URL - Tooltip": "URL of the background image used in the login page", "Background URL - Tooltip": "URL of the background image used in the login page",
"Big icon": "Big icon",
"Binding providers": "Binding providers", "Binding providers": "Binding providers",
"CSS style": "CSS style",
"Center": "Center", "Center": "Center",
"Copy SAML metadata URL": "Copy SAML metadata URL", "Copy SAML metadata URL": "Copy SAML metadata URL",
"Copy prompt page URL": "Copy prompt page URL", "Copy prompt page URL": "Copy prompt page URL",
@ -95,11 +97,14 @@
"Sign Up Error": "Sign Up Error", "Sign Up Error": "Sign Up Error",
"Signin": "Signin", "Signin": "Signin",
"Signin (Default True)": "Signin (Default True)", "Signin (Default True)": "Signin (Default True)",
"Signin items": "Signin items",
"Signin items - Tooltip": "Signin items - Tooltip",
"Signin methods": "Signin methods", "Signin methods": "Signin methods",
"Signin methods - Tooltip": "Signin methods - Tooltip", "Signin methods - Tooltip": "Signin methods - Tooltip",
"Signin session": "Signin session", "Signin session": "Signin session",
"Signup items": "Signup items", "Signup items": "Signup items",
"Signup items - Tooltip": "Items for users to fill in when registering new accounts", "Signup items - Tooltip": "Items for users to fill in when registering new accounts",
"Small icon": "Small icon",
"Tags - Tooltip": "Only users with the tag that is listed in the application tags can login", "Tags - Tooltip": "Only users with the tag that is listed in the application tags can login",
"The application does not allow to sign up new account": "The application does not allow to sign up new account", "The application does not allow to sign up new account": "The application does not allow to sign up new account",
"Token expire": "Token expire", "Token expire": "Token expire",
@ -169,6 +174,7 @@
"Adapter - Tooltip": "Table name of the policy store", "Adapter - Tooltip": "Table name of the policy store",
"Adapters": "Adapters", "Adapters": "Adapters",
"Add": "Add", "Add": "Add",
"Add custom item": "Add custom item",
"Admin": "Admin", "Admin": "Admin",
"Affiliation URL": "Affiliation URL", "Affiliation URL": "Affiliation URL",
"Affiliation URL - Tooltip": "The homepage URL for the affiliation", "Affiliation URL - Tooltip": "The homepage URL for the affiliation",
@ -327,6 +333,7 @@
"Signup URL - Tooltip": "Custom URL for the registration page. If not set, the default Casdoor registration page will be used. When set, the registration links on various Casdoor pages will redirect to this URL", "Signup URL - Tooltip": "Custom URL for the registration page. If not set, the default Casdoor registration page will be used. When set, the registration links on various Casdoor pages will redirect to this URL",
"Signup application": "Signup application", "Signup application": "Signup application",
"Signup application - Tooltip": "Which application the user registered through when they signed up", "Signup application - Tooltip": "Which application the user registered through when they signed up",
"Signup link": "Signup link",
"Sorry, the page you visited does not exist.": "Sorry, the page you visited does not exist.", "Sorry, the page you visited does not exist.": "Sorry, the page you visited does not exist.",
"Sorry, the user you visited does not exist or you are not authorized to access this user.": "Sorry, the user you visited does not exist or you are not authorized to access this user.", "Sorry, the user you visited does not exist or you are not authorized to access this user.": "Sorry, the user you visited does not exist or you are not authorized to access this user.",
"Sorry, you do not have permission to access this page or logged in status invalid.": "Sorry, you do not have permission to access this page or logged in status invalid.", "Sorry, you do not have permission to access this page or logged in status invalid.": "Sorry, you do not have permission to access this page or logged in status invalid.",
@ -431,6 +438,7 @@
}, },
"login": { "login": {
"Auto sign in": "Auto sign in", "Auto sign in": "Auto sign in",
"Back button": "Back button",
"Continue with": "Continue with", "Continue with": "Continue with",
"Email": "Email", "Email": "Email",
"Email or phone": "Email or phone", "Email or phone": "Email or phone",
@ -441,6 +449,7 @@
"LDAP username, Email or phone": "LDAP username, Email or phone", "LDAP username, Email or phone": "LDAP username, Email or phone",
"Loading": "Loading", "Loading": "Loading",
"Logging out...": "Logging out...", "Logging out...": "Logging out...",
"Login button": "Login button",
"MetaMask plugin not detected": "MetaMask plugin not detected", "MetaMask plugin not detected": "MetaMask plugin not detected",
"No account?": "No account?", "No account?": "No account?",
"Or sign in with another account": "Or sign in with another account", "Or sign in with another account": "Or sign in with another account",
@ -725,11 +734,11 @@
"Email content - Tooltip": "Content of the Email", "Email content - Tooltip": "Content of the Email",
"Email title": "Email title", "Email title": "Email title",
"Email title - Tooltip": "Title of the email", "Email title - Tooltip": "Title of the email",
"Enable QR code": "Enable QR code",
"Enable QR code - Tooltip": "Whether to allow scanning QR code to login",
"Endpoint": "Endpoint", "Endpoint": "Endpoint",
"Endpoint (Intranet)": "Endpoint (Intranet)", "Endpoint (Intranet)": "Endpoint (Intranet)",
"Endpoint - Tooltip": "Endpoint - Tooltip", "Endpoint - Tooltip": "Endpoint - Tooltip",
"Follow-up action": "Follow-up action",
"Follow-up action - Tooltip": "If you choose \"Use WeChat Open Platform to login\", users need to login on the WeChat Open Platform after following the wechat official account.",
"From address": "From address", "From address": "From address",
"From address - Tooltip": "Email address of \"From\"", "From address - Tooltip": "Email address of \"From\"",
"From name": "From name", "From name": "From name",
@ -835,6 +844,10 @@
"Token URL - Tooltip": "Token URL", "Token URL - Tooltip": "Token URL",
"Type": "Type", "Type": "Type",
"Type - Tooltip": "Select a type", "Type - Tooltip": "Select a type",
"Use WeChat Media Platform in PC": "Use WeChat Media Platform in PC",
"Use WeChat Media Platform in PC - Tooltip": "Whether to allow scanning WeChat Media Platform QR code to login",
"Use WeChat Media Platform to login": "Use WeChat Media Platform to login",
"Use WeChat Open Platform to login": "Use WeChat Open Platform to login",
"User flow": "User flow", "User flow": "User flow",
"User flow - Tooltip": "User flow - Tooltip", "User flow - Tooltip": "User flow - Tooltip",
"User mapping": "User mapping", "User mapping": "User mapping",

View File

@ -22,7 +22,9 @@
"Auto signin - Tooltip": "Varolan oturum ile giriş yap", "Auto signin - Tooltip": "Varolan oturum ile giriş yap",
"Background URL": "Arkaplan Resim URL", "Background URL": "Arkaplan Resim URL",
"Background URL - Tooltip": "Login sayfası için arkaplan resmi url'i", "Background URL - Tooltip": "Login sayfası için arkaplan resmi url'i",
"Big icon": "Big icon",
"Binding providers": "Binding providers", "Binding providers": "Binding providers",
"CSS style": "CSS style",
"Center": "Ortala", "Center": "Ortala",
"Copy SAML metadata URL": "SAML Metadata URL'ini kopyala", "Copy SAML metadata URL": "SAML Metadata URL'ini kopyala",
"Copy prompt page URL": "Prompt Page URL 'ini kopyala", "Copy prompt page URL": "Prompt Page URL 'ini kopyala",
@ -95,11 +97,14 @@
"Sign Up Error": "Sign Up Error", "Sign Up Error": "Sign Up Error",
"Signin": "Giriş yap", "Signin": "Giriş yap",
"Signin (Default True)": "Signin (Default True)", "Signin (Default True)": "Signin (Default True)",
"Signin items": "Signin items",
"Signin items - Tooltip": "Signin items - Tooltip",
"Signin methods": "Signin methods", "Signin methods": "Signin methods",
"Signin methods - Tooltip": "Signin methods - Tooltip", "Signin methods - Tooltip": "Signin methods - Tooltip",
"Signin session": "Signin session", "Signin session": "Signin session",
"Signup items": "Signup items", "Signup items": "Signup items",
"Signup items - Tooltip": "Items for users to fill in when registering new accounts", "Signup items - Tooltip": "Items for users to fill in when registering new accounts",
"Small icon": "Small icon",
"Tags - Tooltip": "Only users with the tag that is listed in the application tags can login", "Tags - Tooltip": "Only users with the tag that is listed in the application tags can login",
"The application does not allow to sign up new account": "The application does not allow to sign up new account", "The application does not allow to sign up new account": "The application does not allow to sign up new account",
"Token expire": "Token expire", "Token expire": "Token expire",
@ -169,6 +174,7 @@
"Adapter - Tooltip": "Table name of the policy store", "Adapter - Tooltip": "Table name of the policy store",
"Adapters": "Adapters", "Adapters": "Adapters",
"Add": "Ekle", "Add": "Ekle",
"Add custom item": "Add custom item",
"Admin": "Admin", "Admin": "Admin",
"Affiliation URL": "Affiliation URL", "Affiliation URL": "Affiliation URL",
"Affiliation URL - Tooltip": "The homepage URL for the affiliation", "Affiliation URL - Tooltip": "The homepage URL for the affiliation",
@ -327,6 +333,7 @@
"Signup URL - Tooltip": "Custom URL for the registration page. If not set, the default Casdoor registration page will be used. When set, the registration links on various Casdoor pages will redirect to this URL", "Signup URL - Tooltip": "Custom URL for the registration page. If not set, the default Casdoor registration page will be used. When set, the registration links on various Casdoor pages will redirect to this URL",
"Signup application": "Signup application", "Signup application": "Signup application",
"Signup application - Tooltip": "Which application the user registered through when they signed up", "Signup application - Tooltip": "Which application the user registered through when they signed up",
"Signup link": "Signup link",
"Sorry, the page you visited does not exist.": "Sorry, the page you visited does not exist.", "Sorry, the page you visited does not exist.": "Sorry, the page you visited does not exist.",
"Sorry, the user you visited does not exist or you are not authorized to access this user.": "Sorry, the user you visited does not exist or you are not authorized to access this user.", "Sorry, the user you visited does not exist or you are not authorized to access this user.": "Sorry, the user you visited does not exist or you are not authorized to access this user.",
"Sorry, you do not have permission to access this page or logged in status invalid.": "Sorry, you do not have permission to access this page or logged in status invalid.", "Sorry, you do not have permission to access this page or logged in status invalid.": "Sorry, you do not have permission to access this page or logged in status invalid.",
@ -431,6 +438,7 @@
}, },
"login": { "login": {
"Auto sign in": "Otomatik Oturum Aç", "Auto sign in": "Otomatik Oturum Aç",
"Back button": "Back button",
"Continue with": "İle devam et", "Continue with": "İle devam et",
"Email": "E-Posta", "Email": "E-Posta",
"Email or phone": "E-posta veya telefon", "Email or phone": "E-posta veya telefon",
@ -441,6 +449,7 @@
"LDAP username, Email or phone": "LDAP username, Email or phone", "LDAP username, Email or phone": "LDAP username, Email or phone",
"Loading": "Yükleniyor", "Loading": "Yükleniyor",
"Logging out...": ıkış yapılıyor...", "Logging out...": ıkış yapılıyor...",
"Login button": "Login button",
"MetaMask plugin not detected": "Metamask plugin-in bulunamadı", "MetaMask plugin not detected": "Metamask plugin-in bulunamadı",
"No account?": "Hesabınız yok mu?", "No account?": "Hesabınız yok mu?",
"Or sign in with another account": "Veya başka bir hesapla giriş yapın", "Or sign in with another account": "Veya başka bir hesapla giriş yapın",
@ -725,11 +734,11 @@
"Email content - Tooltip": "Content of the Email", "Email content - Tooltip": "Content of the Email",
"Email title": "Email title", "Email title": "Email title",
"Email title - Tooltip": "Title of the email", "Email title - Tooltip": "Title of the email",
"Enable QR code": "Enable QR code",
"Enable QR code - Tooltip": "Whether to allow scanning QR code to login",
"Endpoint": "Endpoint", "Endpoint": "Endpoint",
"Endpoint (Intranet)": "Endpoint (Intranet)", "Endpoint (Intranet)": "Endpoint (Intranet)",
"Endpoint - Tooltip": "Endpoint - Tooltip", "Endpoint - Tooltip": "Endpoint - Tooltip",
"Follow-up action": "Follow-up action",
"Follow-up action - Tooltip": "If you choose \"Use WeChat Open Platform to login\", users need to login on the WeChat Open Platform after following the wechat official account.",
"From address": "From address", "From address": "From address",
"From address - Tooltip": "Email address of \"From\"", "From address - Tooltip": "Email address of \"From\"",
"From name": "From name", "From name": "From name",
@ -835,6 +844,10 @@
"Token URL - Tooltip": "Token URL", "Token URL - Tooltip": "Token URL",
"Type": "Type", "Type": "Type",
"Type - Tooltip": "Select a type", "Type - Tooltip": "Select a type",
"Use WeChat Media Platform in PC": "Use WeChat Media Platform in PC",
"Use WeChat Media Platform in PC - Tooltip": "Whether to allow scanning WeChat Media Platform QR code to login",
"Use WeChat Media Platform to login": "Use WeChat Media Platform to login",
"Use WeChat Open Platform to login": "Use WeChat Open Platform to login",
"User flow": "User flow", "User flow": "User flow",
"User flow - Tooltip": "User flow - Tooltip", "User flow - Tooltip": "User flow - Tooltip",
"User mapping": "User mapping", "User mapping": "User mapping",

View File

@ -22,7 +22,9 @@
"Auto signin - Tooltip": "When a logged-in session exists in Casdoor, it is automatically used for application-side login", "Auto signin - Tooltip": "When a logged-in session exists in Casdoor, it is automatically used for application-side login",
"Background URL": "Background URL", "Background URL": "Background URL",
"Background URL - Tooltip": "URL of the background image used in the login page", "Background URL - Tooltip": "URL of the background image used in the login page",
"Big icon": "Big icon",
"Binding providers": "Binding providers", "Binding providers": "Binding providers",
"CSS style": "CSS style",
"Center": "Center", "Center": "Center",
"Copy SAML metadata URL": "Copy SAML metadata URL", "Copy SAML metadata URL": "Copy SAML metadata URL",
"Copy prompt page URL": "Copy prompt page URL", "Copy prompt page URL": "Copy prompt page URL",
@ -95,11 +97,14 @@
"Sign Up Error": "Sign Up Error", "Sign Up Error": "Sign Up Error",
"Signin": "Signin", "Signin": "Signin",
"Signin (Default True)": "Signin (Default True)", "Signin (Default True)": "Signin (Default True)",
"Signin items": "Signin items",
"Signin items - Tooltip": "Signin items - Tooltip",
"Signin methods": "Signin methods", "Signin methods": "Signin methods",
"Signin methods - Tooltip": "Signin methods - Tooltip", "Signin methods - Tooltip": "Signin methods - Tooltip",
"Signin session": "Signin session", "Signin session": "Signin session",
"Signup items": "Signup items", "Signup items": "Signup items",
"Signup items - Tooltip": "Items for users to fill in when registering new accounts", "Signup items - Tooltip": "Items for users to fill in when registering new accounts",
"Small icon": "Small icon",
"Tags - Tooltip": "Only users with the tag that is listed in the application tags can login", "Tags - Tooltip": "Only users with the tag that is listed in the application tags can login",
"The application does not allow to sign up new account": "The application does not allow to sign up new account", "The application does not allow to sign up new account": "The application does not allow to sign up new account",
"Token expire": "Token expire", "Token expire": "Token expire",
@ -169,6 +174,7 @@
"Adapter - Tooltip": "Table name of the policy store", "Adapter - Tooltip": "Table name of the policy store",
"Adapters": "Adapters", "Adapters": "Adapters",
"Add": "Add", "Add": "Add",
"Add custom item": "Add custom item",
"Admin": "Admin", "Admin": "Admin",
"Affiliation URL": "Affiliation URL", "Affiliation URL": "Affiliation URL",
"Affiliation URL - Tooltip": "The homepage URL for the affiliation", "Affiliation URL - Tooltip": "The homepage URL for the affiliation",
@ -327,6 +333,7 @@
"Signup URL - Tooltip": "Custom URL for the registration page. If not set, the default Casdoor registration page will be used. When set, the registration links on various Casdoor pages will redirect to this URL", "Signup URL - Tooltip": "Custom URL for the registration page. If not set, the default Casdoor registration page will be used. When set, the registration links on various Casdoor pages will redirect to this URL",
"Signup application": "Signup application", "Signup application": "Signup application",
"Signup application - Tooltip": "Which application the user registered through when they signed up", "Signup application - Tooltip": "Which application the user registered through when they signed up",
"Signup link": "Signup link",
"Sorry, the page you visited does not exist.": "Sorry, the page you visited does not exist.", "Sorry, the page you visited does not exist.": "Sorry, the page you visited does not exist.",
"Sorry, the user you visited does not exist or you are not authorized to access this user.": "Sorry, the user you visited does not exist or you are not authorized to access this user.", "Sorry, the user you visited does not exist or you are not authorized to access this user.": "Sorry, the user you visited does not exist or you are not authorized to access this user.",
"Sorry, you do not have permission to access this page or logged in status invalid.": "Sorry, you do not have permission to access this page or logged in status invalid.", "Sorry, you do not have permission to access this page or logged in status invalid.": "Sorry, you do not have permission to access this page or logged in status invalid.",
@ -431,6 +438,7 @@
}, },
"login": { "login": {
"Auto sign in": "Auto sign in", "Auto sign in": "Auto sign in",
"Back button": "Back button",
"Continue with": "Continue with", "Continue with": "Continue with",
"Email": "Email", "Email": "Email",
"Email or phone": "Email or phone", "Email or phone": "Email or phone",
@ -441,6 +449,7 @@
"LDAP username, Email or phone": "LDAP username, Email or phone", "LDAP username, Email or phone": "LDAP username, Email or phone",
"Loading": "Loading", "Loading": "Loading",
"Logging out...": "Logging out...", "Logging out...": "Logging out...",
"Login button": "Login button",
"MetaMask plugin not detected": "MetaMask plugin not detected", "MetaMask plugin not detected": "MetaMask plugin not detected",
"No account?": "No account?", "No account?": "No account?",
"Or sign in with another account": "Or sign in with another account", "Or sign in with another account": "Or sign in with another account",
@ -725,11 +734,11 @@
"Email content - Tooltip": "Content of the Email", "Email content - Tooltip": "Content of the Email",
"Email title": "Email title", "Email title": "Email title",
"Email title - Tooltip": "Title of the email", "Email title - Tooltip": "Title of the email",
"Enable QR code": "Enable QR code",
"Enable QR code - Tooltip": "Whether to allow scanning QR code to login",
"Endpoint": "Endpoint", "Endpoint": "Endpoint",
"Endpoint (Intranet)": "Endpoint (Intranet)", "Endpoint (Intranet)": "Endpoint (Intranet)",
"Endpoint - Tooltip": "Endpoint - Tooltip", "Endpoint - Tooltip": "Endpoint - Tooltip",
"Follow-up action": "Follow-up action",
"Follow-up action - Tooltip": "If you choose \"Use WeChat Open Platform to login\", users need to login on the WeChat Open Platform after following the wechat official account.",
"From address": "From address", "From address": "From address",
"From address - Tooltip": "Email address of \"From\"", "From address - Tooltip": "Email address of \"From\"",
"From name": "From name", "From name": "From name",
@ -835,6 +844,10 @@
"Token URL - Tooltip": "Token URL", "Token URL - Tooltip": "Token URL",
"Type": "Type", "Type": "Type",
"Type - Tooltip": "Select a type", "Type - Tooltip": "Select a type",
"Use WeChat Media Platform in PC": "Use WeChat Media Platform in PC",
"Use WeChat Media Platform in PC - Tooltip": "Whether to allow scanning WeChat Media Platform QR code to login",
"Use WeChat Media Platform to login": "Use WeChat Media Platform to login",
"Use WeChat Open Platform to login": "Use WeChat Open Platform to login",
"User flow": "User flow", "User flow": "User flow",
"User flow - Tooltip": "User flow - Tooltip", "User flow - Tooltip": "User flow - Tooltip",
"User mapping": "User mapping", "User mapping": "User mapping",

View File

@ -22,7 +22,9 @@
"Auto signin - Tooltip": "Khi một phiên đăng nhập đã được tạo trong Casdoor, nó sẽ tự động được sử dụng để đăng nhập tại ứng dụng", "Auto signin - Tooltip": "Khi một phiên đăng nhập đã được tạo trong Casdoor, nó sẽ tự động được sử dụng để đăng nhập tại ứng dụng",
"Background URL": "URL nền", "Background URL": "URL nền",
"Background URL - Tooltip": "Đường dẫn URL của hình ảnh nền được sử dụng trong trang đăng nhập", "Background URL - Tooltip": "Đường dẫn URL của hình ảnh nền được sử dụng trong trang đăng nhập",
"Big icon": "Big icon",
"Binding providers": "Binding providers", "Binding providers": "Binding providers",
"CSS style": "CSS style",
"Center": "Trung tâm", "Center": "Trung tâm",
"Copy SAML metadata URL": "Sao chép URL siêu dữ liệu SAML", "Copy SAML metadata URL": "Sao chép URL siêu dữ liệu SAML",
"Copy prompt page URL": "Sao chép URL của trang nhắc nhở", "Copy prompt page URL": "Sao chép URL của trang nhắc nhở",
@ -95,11 +97,14 @@
"Sign Up Error": "Lỗi đăng ký", "Sign Up Error": "Lỗi đăng ký",
"Signin": "Đăng nhập", "Signin": "Đăng nhập",
"Signin (Default True)": "Đăng nhập (Mặc định đúng)", "Signin (Default True)": "Đăng nhập (Mặc định đúng)",
"Signin items": "Signin items",
"Signin items - Tooltip": "Signin items - Tooltip",
"Signin methods": "Signin methods", "Signin methods": "Signin methods",
"Signin methods - Tooltip": "Signin methods - Tooltip", "Signin methods - Tooltip": "Signin methods - Tooltip",
"Signin session": "Phiên đăng nhập", "Signin session": "Phiên đăng nhập",
"Signup items": "Các mục đăng ký", "Signup items": "Các mục đăng ký",
"Signup items - Tooltip": "Các thông tin cần được người dùng điền khi đăng ký tài khoản mới", "Signup items - Tooltip": "Các thông tin cần được người dùng điền khi đăng ký tài khoản mới",
"Small icon": "Small icon",
"Tags - Tooltip": "Only users with the tag that is listed in the application tags can login", "Tags - Tooltip": "Only users with the tag that is listed in the application tags can login",
"The application does not allow to sign up new account": "Ứng dụng không cho phép đăng ký tài khoản mới", "The application does not allow to sign up new account": "Ứng dụng không cho phép đăng ký tài khoản mới",
"Token expire": "Mã thông báo hết hạn", "Token expire": "Mã thông báo hết hạn",
@ -169,6 +174,7 @@
"Adapter - Tooltip": "Tên bảng của kho lưu trữ chính sách", "Adapter - Tooltip": "Tên bảng của kho lưu trữ chính sách",
"Adapters": "Bộ chuyển đổi", "Adapters": "Bộ chuyển đổi",
"Add": "Tạo mới", "Add": "Tạo mới",
"Add custom item": "Add custom item",
"Admin": "Admin", "Admin": "Admin",
"Affiliation URL": "Đường dẫn liên kết liên kết", "Affiliation URL": "Đường dẫn liên kết liên kết",
"Affiliation URL - Tooltip": "Đường dẫn URL trang chủ của liên kết", "Affiliation URL - Tooltip": "Đường dẫn URL trang chủ của liên kết",
@ -327,6 +333,7 @@
"Signup URL - Tooltip": "Đường dẫn tùy chỉnh cho trang đăng ký. Nếu không được thiết lập, trang đăng ký mặc định của Casdoor sẽ được sử dụng. Khi được thiết lập, các liên kết đăng ký trên các trang Casdoor khác sẽ được chuyển hướng đến URL này", "Signup URL - Tooltip": "Đường dẫn tùy chỉnh cho trang đăng ký. Nếu không được thiết lập, trang đăng ký mặc định của Casdoor sẽ được sử dụng. Khi được thiết lập, các liên kết đăng ký trên các trang Casdoor khác sẽ được chuyển hướng đến URL này",
"Signup application": "Đăng ký ứng dụng", "Signup application": "Đăng ký ứng dụng",
"Signup application - Tooltip": "Người dùng đã đăng ký thông qua ứng dụng nào khi họ đăng ký?", "Signup application - Tooltip": "Người dùng đã đăng ký thông qua ứng dụng nào khi họ đăng ký?",
"Signup link": "Signup link",
"Sorry, the page you visited does not exist.": "Xin lỗi, trang web bạn truy cập không tồn tại.", "Sorry, the page you visited does not exist.": "Xin lỗi, trang web bạn truy cập không tồn tại.",
"Sorry, the user you visited does not exist or you are not authorized to access this user.": "Xin lỗi, người dùng mà bạn đã ghé thăm không tồn tại hoặc bạn không có quyền truy cập vào người dùng này.", "Sorry, the user you visited does not exist or you are not authorized to access this user.": "Xin lỗi, người dùng mà bạn đã ghé thăm không tồn tại hoặc bạn không có quyền truy cập vào người dùng này.",
"Sorry, you do not have permission to access this page or logged in status invalid.": "Xin lỗi, bạn không có quyền truy cập trang này hoặc trạng thái đăng nhập không hợp lệ.", "Sorry, you do not have permission to access this page or logged in status invalid.": "Xin lỗi, bạn không có quyền truy cập trang này hoặc trạng thái đăng nhập không hợp lệ.",
@ -431,6 +438,7 @@
}, },
"login": { "login": {
"Auto sign in": "Tự động đăng nhập", "Auto sign in": "Tự động đăng nhập",
"Back button": "Back button",
"Continue with": "Tiếp tục với", "Continue with": "Tiếp tục với",
"Email": "Email", "Email": "Email",
"Email or phone": "Email hoặc điện thoại", "Email or phone": "Email hoặc điện thoại",
@ -441,6 +449,7 @@
"LDAP username, Email or phone": "LDAP username, Email or phone", "LDAP username, Email or phone": "LDAP username, Email or phone",
"Loading": "Đang tải", "Loading": "Đang tải",
"Logging out...": "Đăng xuất ...", "Logging out...": "Đăng xuất ...",
"Login button": "Login button",
"MetaMask plugin not detected": "MetaMask plugin not detected", "MetaMask plugin not detected": "MetaMask plugin not detected",
"No account?": "Không có tài khoản?", "No account?": "Không có tài khoản?",
"Or sign in with another account": "Hoặc đăng nhập bằng tài khoản khác", "Or sign in with another account": "Hoặc đăng nhập bằng tài khoản khác",
@ -725,11 +734,11 @@
"Email content - Tooltip": "Nội dung của Email", "Email content - Tooltip": "Nội dung của Email",
"Email title": "Tiêu đề email", "Email title": "Tiêu đề email",
"Email title - Tooltip": "Tiêu đề của email", "Email title - Tooltip": "Tiêu đề của email",
"Enable QR code": "Kích hoạt mã QR",
"Enable QR code - Tooltip": "Cho phép quét mã QR để đăng nhập",
"Endpoint": "Điểm cuối", "Endpoint": "Điểm cuối",
"Endpoint (Intranet)": "Điểm kết thúc (mạng nội bộ)", "Endpoint (Intranet)": "Điểm kết thúc (mạng nội bộ)",
"Endpoint - Tooltip": "Endpoint - Tooltip", "Endpoint - Tooltip": "Endpoint - Tooltip",
"Follow-up action": "Follow-up action",
"Follow-up action - Tooltip": "If you choose \"Use WeChat Open Platform to login\", users need to login on the WeChat Open Platform after following the wechat official account.",
"From address": "From address", "From address": "From address",
"From address - Tooltip": "From address - Tooltip", "From address - Tooltip": "From address - Tooltip",
"From name": "From name", "From name": "From name",
@ -835,6 +844,10 @@
"Token URL - Tooltip": "Địa chỉ của mã thông báo", "Token URL - Tooltip": "Địa chỉ của mã thông báo",
"Type": "Kiểu", "Type": "Kiểu",
"Type - Tooltip": "Chọn loại", "Type - Tooltip": "Chọn loại",
"Use WeChat Media Platform in PC": "Use WeChat Media Platform in PC",
"Use WeChat Media Platform in PC - Tooltip": "Whether to allow scanning WeChat Media Platform QR code to login",
"Use WeChat Media Platform to login": "Use WeChat Media Platform to login",
"Use WeChat Open Platform to login": "Use WeChat Open Platform to login",
"User flow": "User flow", "User flow": "User flow",
"User flow - Tooltip": "User flow - Tooltip", "User flow - Tooltip": "User flow - Tooltip",
"User mapping": "User mapping", "User mapping": "User mapping",

View File

@ -22,7 +22,9 @@
"Auto signin - Tooltip": "当Casdoor存在已登录会话时自动采用该会话进行应用端的登录", "Auto signin - Tooltip": "当Casdoor存在已登录会话时自动采用该会话进行应用端的登录",
"Background URL": "背景图URL", "Background URL": "背景图URL",
"Background URL - Tooltip": "登录页背景图的链接", "Background URL - Tooltip": "登录页背景图的链接",
"Big icon": "大图标",
"Binding providers": "绑定提供商", "Binding providers": "绑定提供商",
"CSS style": "CSS样式",
"Center": "居中", "Center": "居中",
"Copy SAML metadata URL": "复制SAML元数据URL", "Copy SAML metadata URL": "复制SAML元数据URL",
"Copy prompt page URL": "复制提醒页面URL", "Copy prompt page URL": "复制提醒页面URL",
@ -34,8 +36,8 @@
"Enable Email linking - Tooltip": "使用第三方授权登录时,如果组织中存在与授权用户邮箱相同的用户,会自动关联该第三方登录方式到该用户", "Enable Email linking - Tooltip": "使用第三方授权登录时,如果组织中存在与授权用户邮箱相同的用户,会自动关联该第三方登录方式到该用户",
"Enable SAML C14N10": "启用SAML C14N10", "Enable SAML C14N10": "启用SAML C14N10",
"Enable SAML C14N10 - Tooltip": "在SAML协议里使用C14N10而不是C14N11", "Enable SAML C14N10 - Tooltip": "在SAML协议里使用C14N10而不是C14N11",
"Enable SAML POST binding": "Enable SAML POST binding", "Enable SAML POST binding": "启用SAML POST Binding",
"Enable SAML POST binding - Tooltip": "The HTTP POST binding uses input fields in a HTML form to send SAML messages, Enable when your SP use it", "Enable SAML POST binding - Tooltip": "HTTP POST绑定使用HTML表单中的输入字段发送SAML消息当SP使用它时启用",
"Enable SAML compression": "压缩SAML响应", "Enable SAML compression": "压缩SAML响应",
"Enable SAML compression - Tooltip": "Casdoor作为SAML IdP时是否压缩SAML响应信息", "Enable SAML compression - Tooltip": "Casdoor作为SAML IdP时是否压缩SAML响应信息",
"Enable side panel": "启用侧面板", "Enable side panel": "启用侧面板",
@ -95,11 +97,14 @@
"Sign Up Error": "注册错误", "Sign Up Error": "注册错误",
"Signin": "登录", "Signin": "登录",
"Signin (Default True)": "登录 (默认同意)", "Signin (Default True)": "登录 (默认同意)",
"Signin items": "登录项",
"Signin items - Tooltip": "用户登陆时需要填写的项目",
"Signin methods": "登录方式", "Signin methods": "登录方式",
"Signin methods - Tooltip": "添加允许用户登录的方式,默认所有方式均可登录", "Signin methods - Tooltip": "添加允许用户登录的方式,默认所有方式均可登录",
"Signin session": "保持登录会话", "Signin session": "保持登录会话",
"Signup items": "注册项", "Signup items": "注册项",
"Signup items - Tooltip": "注册用户注册时需要填写的项目", "Signup items - Tooltip": "注册用户注册时需要填写的项目",
"Small icon": "小图标",
"Tags - Tooltip": "用户的标签在应用的标签集合中时,用户才可以登录该应用", "Tags - Tooltip": "用户的标签在应用的标签集合中时,用户才可以登录该应用",
"The application does not allow to sign up new account": "该应用不允许注册新账户", "The application does not allow to sign up new account": "该应用不允许注册新账户",
"Token expire": "Access Token过期", "Token expire": "Access Token过期",
@ -169,6 +174,7 @@
"Adapter - Tooltip": "策略存储的表名", "Adapter - Tooltip": "策略存储的表名",
"Adapters": "Casbin适配器", "Adapters": "Casbin适配器",
"Add": "添加", "Add": "添加",
"Add custom item": "添加自定义项",
"Admin": "管理工具", "Admin": "管理工具",
"Affiliation URL": "工作单位URL", "Affiliation URL": "工作单位URL",
"Affiliation URL - Tooltip": "工作单位的官网URL", "Affiliation URL - Tooltip": "工作单位的官网URL",
@ -327,6 +333,7 @@
"Signup URL - Tooltip": "自定义注册页面的URL不设置时采用Casdoor默认的注册页面设置后Casdoor各类页面的注册链接会跳转到该URL", "Signup URL - Tooltip": "自定义注册页面的URL不设置时采用Casdoor默认的注册页面设置后Casdoor各类页面的注册链接会跳转到该URL",
"Signup application": "注册应用", "Signup application": "注册应用",
"Signup application - Tooltip": "用户注册时通过哪个应用注册的", "Signup application - Tooltip": "用户注册时通过哪个应用注册的",
"Signup link": "注册链接",
"Sorry, the page you visited does not exist.": "抱歉,您访问的页面不存在", "Sorry, the page you visited does not exist.": "抱歉,您访问的页面不存在",
"Sorry, the user you visited does not exist or you are not authorized to access this user.": "抱歉,您访问的用户不存在或您无权访问该用户", "Sorry, the user you visited does not exist or you are not authorized to access this user.": "抱歉,您访问的用户不存在或您无权访问该用户",
"Sorry, you do not have permission to access this page or logged in status invalid.": "抱歉,您无权访问该页面或登录状态失效", "Sorry, you do not have permission to access this page or logged in status invalid.": "抱歉,您无权访问该页面或登录状态失效",
@ -431,6 +438,7 @@
}, },
"login": { "login": {
"Auto sign in": "下次自动登录", "Auto sign in": "下次自动登录",
"Back button": "返回按钮",
"Continue with": "使用以下账号继续", "Continue with": "使用以下账号继续",
"Email": "Email", "Email": "Email",
"Email or phone": "Email或手机号", "Email or phone": "Email或手机号",
@ -441,6 +449,7 @@
"LDAP username, Email or phone": "LDAP用户名, Email或手机号", "LDAP username, Email or phone": "LDAP用户名, Email或手机号",
"Loading": "加载中", "Loading": "加载中",
"Logging out...": "正在退出登录...", "Logging out...": "正在退出登录...",
"Login button": "登录按钮",
"MetaMask plugin not detected": "未检测到MetaMask插件", "MetaMask plugin not detected": "未检测到MetaMask插件",
"No account?": "没有账号?", "No account?": "没有账号?",
"Or sign in with another account": "或者,登录其他账号", "Or sign in with another account": "或者,登录其他账号",
@ -725,11 +734,11 @@
"Email content - Tooltip": "邮件内容", "Email content - Tooltip": "邮件内容",
"Email title": "邮件标题", "Email title": "邮件标题",
"Email title - Tooltip": "邮件标题", "Email title - Tooltip": "邮件标题",
"Enable QR code": "扫码登录",
"Enable QR code - Tooltip": "是否允许扫描二维码登录",
"Endpoint": "地域节点 (外网)", "Endpoint": "地域节点 (外网)",
"Endpoint (Intranet)": "地域节点 (内网)", "Endpoint (Intranet)": "地域节点 (内网)",
"Endpoint - Tooltip": "端点 - 工具提示", "Endpoint - Tooltip": "端点 - 工具提示",
"Follow-up action": "后继动作",
"Follow-up action - Tooltip": "如果你选择“使用微信开放平台进行登录”,用户在扫描二维码并关注公众号后需要在微信开放平台进行登录",
"From address": "发件人地址", "From address": "发件人地址",
"From address - Tooltip": "邮件里发件人的邮箱地址", "From address - Tooltip": "邮件里发件人的邮箱地址",
"From name": "发件人名称", "From name": "发件人名称",
@ -757,7 +766,7 @@
"Parse metadata successfully": "解析元数据成功", "Parse metadata successfully": "解析元数据成功",
"Path prefix": "路径前缀", "Path prefix": "路径前缀",
"Path prefix - Tooltip": "对象存储的Bucket路径前缀", "Path prefix - Tooltip": "对象存储的Bucket路径前缀",
"Please use WeChat to scan the QR code and follow the official account for sign in": "Please use WeChat to scan the QR code and follow the official account for sign in", "Please use WeChat to scan the QR code and follow the official account for sign in": "请使用微信扫描二维码并关注公众号登录",
"Port": "端口", "Port": "端口",
"Port - Tooltip": "请确保端口号打开", "Port - Tooltip": "请确保端口号打开",
"Private Key": "私钥", "Private Key": "私钥",
@ -835,6 +844,10 @@
"Token URL - Tooltip": "自定义OAuth的Token URL", "Token URL - Tooltip": "自定义OAuth的Token URL",
"Type": "类型", "Type": "类型",
"Type - Tooltip": "类型", "Type - Tooltip": "类型",
"Use WeChat Media Platform in PC": "在PC端使用微信公众平台",
"Use WeChat Media Platform in PC - Tooltip": "是否使用微信公众平台的二维码进行登录",
"Use WeChat Media Platform to login": "使用微信公众平台进行登录",
"Use WeChat Open Platform to login": "使用微信开放平台进行登录",
"User flow": "User flow", "User flow": "User flow",
"User flow - Tooltip": "User flow", "User flow - Tooltip": "User flow",
"User mapping": "用户映射", "User mapping": "用户映射",

View File

@ -163,7 +163,7 @@ class SigninMethodTable extends React.Component {
<Button style={{marginRight: "5px"}} disabled={index === table.length - 1} icon={<DownOutlined />} size="small" onClick={() => this.downRow(table, index)} /> <Button style={{marginRight: "5px"}} disabled={index === table.length - 1} icon={<DownOutlined />} size="small" onClick={() => this.downRow(table, index)} />
</Tooltip> </Tooltip>
<Tooltip placement="topLeft" title={i18next.t("general:Delete")}> <Tooltip placement="topLeft" title={i18next.t("general:Delete")}>
<Button icon={<DeleteOutlined />} size="small" disabled={table.length <= 1} onClick={() => this.deleteRow(items, table, index)} /> <Button icon={<DeleteOutlined />} size="small" onClick={() => this.deleteRow(items, table, index)} />
</Tooltip> </Tooltip>
</div> </div>
); );

View File

@ -0,0 +1,299 @@
// Copyright 2024 The Casdoor Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
import React from "react";
import {DeleteOutlined, DownOutlined, UpOutlined} from "@ant-design/icons";
import {Button, Col, Input, Popover, Row, Select, Space, Switch, Table, Tooltip} from "antd";
import * as Setting from "../Setting";
import i18next from "i18next";
import {Controlled as CodeMirror} from "react-codemirror2";
import "codemirror/lib/codemirror.css";
require("codemirror/theme/material-darker.css");
require("codemirror/mode/htmlmixed/htmlmixed");
const {Option} = Select;
class SigninTable extends React.Component {
constructor(props) {
super(props);
this.state = {
classes: props,
};
}
updateTable(table) {
this.props.onUpdateTable(table);
}
updateField(table, index, key, value) {
table[index][key] = value;
this.updateTable(table);
}
addRow(table) {
const row = {name: Setting.getNewRowNameForTable(table, "Please select a signin item"), visible: true, required: true, rule: "None"};
if (table === undefined) {
table = [];
}
table = Setting.addRow(table, row);
this.updateTable(table);
}
addCustomRow(table) {
const randomName = "Text " + Date.now().toString();
const row = {name: Setting.getNewRowNameForTable(table, randomName), visible: true, isCustom: true};
if (table === undefined) {
table = [];
}
table = Setting.addRow(table, row);
this.updateTable(table);
}
deleteRow(table, i) {
table = Setting.deleteRow(table, i);
this.updateTable(table);
}
upRow(table, i) {
table = Setting.swapRow(table, i - 1, i);
this.updateTable(table);
}
downRow(table, i) {
table = Setting.swapRow(table, i, i + 1);
this.updateTable(table);
}
renderTable(table) {
table = table ?? [];
const columns = [
{
title: i18next.t("general:Name"),
dataIndex: "name",
key: "name",
render: (text, record, index) => {
if (record.isCustom) {
return <Input style={{width: "100%"}}
value={text} onPressEnter={e => {
this.updateField(table, index, "name", e.target.value);
}} disabled>
</Input>;
}
const items = [
{name: "Signin methods", displayName: i18next.t("application:Signin methods")},
{name: "Logo", displayName: i18next.t("general:Logo")},
{name: "Back button", displayName: i18next.t("login:Back button")},
{name: "Languages", displayName: i18next.t("general:Languages")},
{name: "Username", displayName: i18next.t("signup:Username")},
{name: "Password", displayName: i18next.t("general:Password")},
{name: "Providers", displayName: i18next.t("general:Providers")},
{name: "Agreement", displayName: i18next.t("signup:Agreement")},
{name: "Forgot password?", displayName: i18next.t("login:Forgot password?")},
{name: "Login button", displayName: i18next.t("login:Login button")},
{name: "Signup link", displayName: i18next.t("general:Signup link")},
];
const getItemDisplayName = (text) => {
const item = items.filter(item => item.name === text);
if (item.length === 0) {
return "";
}
return item[0].displayName;
};
return (
<Select virtual={false} style={{width: "100%"}}
value={getItemDisplayName(text)}
onChange={value => {
this.updateField(table, index, "name", value);
}} >
{
Setting.getDeduplicatedArray(items, table, "name").map((item, index) => <Option key={index} value={item.name}>{item.displayName}</Option>)
}
</Select>
);
},
},
{
title: i18next.t("organization:Visible"),
dataIndex: "visible",
key: "visible",
width: "120px",
render: (text, record, index) => {
if (record.name === "ID") {
return null;
}
return (
<Switch checked={text} onChange={checked => {
this.updateField(table, index, "visible", checked);
if (!checked) {
this.updateField(table, index, "required", false);
} else {
this.updateField(table, index, "required", true);
}
}} />
);
},
},
{
title: i18next.t("signup:Label HTML"),
dataIndex: "label",
key: "label",
width: "200px",
render: (text, record, index) => {
if (record.name.startsWith("Text ") || record?.isCustom) {
return (
<Popover placement="right" content={
<div style={{width: "900px", height: "300px"}} >
<CodeMirror value={text}
options={{mode: "htmlmixed", theme: "material-darker"}}
onBeforeChange={(editor, data, value) => {
this.updateField(table, index, "label", value);
}}
/>
</div>
} title={i18next.t("signup:Label HTML")} trigger="click">
<Input value={text} style={{marginBottom: "10px"}} onChange={e => {
this.updateField(table, index, "label", e.target.value);
}} />
</Popover>
);
}
return null;
},
},
{
title: i18next.t("application:Form CSS"),
dataIndex: "label",
key: "label",
width: "200px",
render: (text, record, index) => {
if (!record.name.startsWith("Text ") && !record?.isCustom) {
return (
<Popover placement="right" content={
<div style={{width: "900px", height: "300px"}} >
<CodeMirror value={text}
options={{mode: "htmlmixed", theme: "material-darker"}}
onBeforeChange={(editor, data, value) => {
this.updateField(table, index, "label", value);
}}
/>
</div>
} title={i18next.t("application:CSS style")} trigger="click">
<Input value={text} style={{marginBottom: "10px"}} onChange={e => {
this.updateField(table, index, "label", e.target.value);
}} />
</Popover>
);
}
return null;
},
},
{
title: i18next.t("signup:Placeholder"),
dataIndex: "placeholder",
key: "placeholder",
width: "200px",
render: (text, record, index) => {
if (record.name !== "Username" && record.name !== "Password") {
return null;
}
return (
<Input value={text} onChange={e => {
this.updateField(table, index, "placeholder", e.target.value);
}} />
);
},
},
{
title: i18next.t("application:Rule"),
dataIndex: "rule",
key: "rule",
width: "155px",
render: (text, record, index) => {
let options = [];
if (record.name === "ThirdParty") {
options = [
{id: "big", name: i18next.t("application:Big icon")},
{id: "small", name: i18next.t("application:Small icon")},
];
}
if (options.length === 0) {
return null;
}
return (
<Select virtual={false} style={{width: "100%"}} value={text} onChange={(value => {
this.updateField(table, index, "rule", value);
})} options={options.map(item => Setting.getOption(item.name, item.id))} />
);
},
},
{
title: i18next.t("general:Action"),
key: "action",
width: "100px",
render: (text, record, index) => {
return (
<div>
<Tooltip placement="bottomLeft" title={i18next.t("general:Up")}>
<Button style={{marginRight: "5px"}} disabled={index === 0} icon={<UpOutlined />} size="small" onClick={() => this.upRow(table, index)} />
</Tooltip>
<Tooltip placement="topLeft" title={i18next.t("general:Down")}>
<Button style={{marginRight: "5px"}} disabled={index === table.length - 1} icon={<DownOutlined />} size="small" onClick={() => this.downRow(table, index)} />
</Tooltip>
<Tooltip placement="topLeft" title={i18next.t("general:Delete")}>
<Button icon={<DeleteOutlined />} size="small" onClick={() => this.deleteRow(table, index)} />
</Tooltip>
</div>
);
},
},
];
return (
<Table scroll={{x: "max-content"}} rowKey="name" columns={columns} dataSource={table} size="middle" bordered pagination={false}
title={() => (
<Space>
{this.props.title}
<Button style={{marginRight: "5px"}} type="primary" size="small" onClick={() => this.addRow(table)}>{i18next.t("general:Add")}</Button>
<Button style={{marginRight: "5px"}} type="primary" size="small" onClick={() => this.addCustomRow(table)}>{i18next.t("general:Add custom item")}</Button>
</Space>
)}
/>
);
}
render() {
return (
<div>
<Row style={{marginTop: "20px"}} >
<Col span={24}>
{
this.renderTable(this.props.table)
}
</Col>
</Row>
</div>
);
}
}
export default SigninTable;