Compare commits

...

6 Commits

78 changed files with 674 additions and 37 deletions

View File

@@ -25,6 +25,7 @@ const (
goCliRepo = "https://api.github.com/repos/casbin/casbin-go-cli/releases/latest"
rustCliRepo = "https://api.github.com/repos/casbin-rs/casbin-rust-cli/releases/latest"
pythonCliRepo = "https://api.github.com/repos/casbin/casbin-python-cli/releases/latest"
dotnetCliRepo = "https://api.github.com/repos/casbin-net/casbin-dotnet-cli/releases/latest"
downloadFolder = "bin"
)
@@ -45,6 +46,7 @@ func getBinaryNames() map[string]string {
java = "java"
rust = "rust"
python = "python"
dotnet = "dotnet"
)
arch := runtime.GOARCH
@@ -65,6 +67,7 @@ func getBinaryNames() map[string]string {
java: "casbin-java-cli.jar",
rust: fmt.Sprintf("casbin-rust-cli-%s-pc-windows-gnu", archNames.rustArch),
python: fmt.Sprintf("casbin-python-cli-windows-%s.exe", archNames.goArch),
dotnet: fmt.Sprintf("casbin-dotnet-cli-windows-%s.exe", archNames.goArch),
}
case "darwin":
return map[string]string{
@@ -72,6 +75,7 @@ func getBinaryNames() map[string]string {
java: "casbin-java-cli.jar",
rust: fmt.Sprintf("casbin-rust-cli-%s-apple-darwin", archNames.rustArch),
python: fmt.Sprintf("casbin-python-cli-darwin-%s", archNames.goArch),
dotnet: fmt.Sprintf("casbin-dotnet-cli-darwin-%s", archNames.goArch),
}
case "linux":
return map[string]string{
@@ -79,6 +83,7 @@ func getBinaryNames() map[string]string {
java: "casbin-java-cli.jar",
rust: fmt.Sprintf("casbin-rust-cli-%s-unknown-linux-gnu", archNames.rustArch),
python: fmt.Sprintf("casbin-python-cli-linux-%s", archNames.goArch),
dotnet: fmt.Sprintf("casbin-dotnet-cli-linux-%s", archNames.goArch),
}
default:
return nil
@@ -108,6 +113,11 @@ func getFinalBinaryName(lang string) string {
return "casbin-python-cli.exe"
}
return "casbin-python-cli"
case "dotnet":
if runtime.GOOS == "windows" {
return "casbin-dotnet-cli.exe"
}
return "casbin-dotnet-cli"
default:
return ""
}
@@ -347,6 +357,7 @@ func downloadCLI() error {
"go": goCliRepo,
"rust": rustCliRepo,
"python": pythonCliRepo,
"dotnet": dotnetCliRepo,
}
for lang, repo := range repos {

View File

@@ -16,6 +16,8 @@ package controllers
import (
"encoding/json"
"fmt"
"strings"
"github.com/beego/beego/utils/pagination"
"github.com/casdoor/casdoor/object"
@@ -188,3 +190,73 @@ func (c *ApiController) VerifyInvitation() {
c.ResponseOk(payment, attachInfo)
}
// SendInvitation
// @Title VerifyInvitation
// @Tag Invitation API
// @Description verify invitation
// @Param id query string true "The id ( owner/name ) of the invitation"
// @Param body body []string true "The details of the invitation"
// @Success 200 {object} controllers.Response The Response object
// @router /send-invitation [post]
func (c *ApiController) SendInvitation() {
id := c.Input().Get("id")
var destinations []string
err := json.Unmarshal(c.Ctx.Input.RequestBody, &destinations)
if !c.IsAdmin() {
c.ResponseError(c.T("auth:Unauthorized operation"))
return
}
invitation, err := object.GetInvitation(id)
if err != nil {
c.ResponseError(err.Error())
return
}
if invitation == nil {
c.ResponseError(fmt.Sprintf(c.T("invitation:Invitation %s does not exist"), id))
return
}
organization, err := object.GetOrganization(fmt.Sprintf("admin/%s", invitation.Owner))
if err != nil {
c.ResponseError(err.Error())
return
}
application, err := object.GetApplicationByOrganizationName(invitation.Owner)
if err != nil {
c.ResponseError(err.Error())
return
}
if application == nil {
c.ResponseError(fmt.Sprintf(c.T("general:The organization: %s should have one application at least"), invitation.Owner))
return
}
provider, err := application.GetEmailProvider("Invitation")
if err != nil {
c.ResponseError(err.Error())
return
}
if provider == nil {
c.ResponseError(fmt.Sprintf(c.T("verification:please add an Email provider to the \"Providers\" list for the application: %s"), invitation.Owner))
return
}
content := provider.Metadata
content = strings.ReplaceAll(content, "%code", invitation.Code)
content = strings.ReplaceAll(content, "%link", invitation.GetInvitationLink(c.Ctx.Request.Host, application.Name))
err = object.SendEmail(provider, provider.Title, content, destinations, organization.DisplayName)
if err != nil {
c.ResponseError(err.Error())
return
}
c.ResponseOk()
}

View File

@@ -144,7 +144,7 @@ func (c *ApiController) SendEmail() {
content = strings.Replace(content, string(matchContent), "", -1)
for _, receiver := range emailForm.Receivers {
err = object.SendEmail(provider, emailForm.Title, content, receiver, emailForm.Sender)
err = object.SendEmail(provider, emailForm.Title, content, []string{receiver}, emailForm.Sender)
if err != nil {
c.ResponseError(err.Error())
return

View File

@@ -96,15 +96,17 @@ func NewAzureACSEmailProvider(accessKey string, endpoint string) *AzureACSEmailP
}
}
func newEmail(fromAddress string, toAddress string, subject string, content string) *Email {
func newEmail(fromAddress string, toAddress []string, subject string, content string) *Email {
var to []EmailAddress
for _, addr := range toAddress {
to = append(to, EmailAddress{
DisplayName: addr,
Address: addr,
})
}
return &Email{
Recipients: Recipients{
To: []EmailAddress{
{
DisplayName: toAddress,
Address: toAddress,
},
},
To: to,
},
SenderAddress: fromAddress,
Content: Content{
@@ -116,7 +118,7 @@ func newEmail(fromAddress string, toAddress string, subject string, content stri
}
}
func (a *AzureACSEmailProvider) Send(fromAddress string, fromName string, toAddress string, subject string, content string) error {
func (a *AzureACSEmailProvider) Send(fromAddress string, fromName string, toAddress []string, subject string, content string) error {
email := newEmail(fromAddress, toAddress, subject, content)
postBody, err := json.Marshal(email)

View File

@@ -48,21 +48,23 @@ func NewHttpEmailProvider(endpoint string, method string, httpHeaders map[string
return client
}
func (c *HttpEmailProvider) Send(fromAddress string, fromName string, toAddress string, subject string, content string) error {
func (c *HttpEmailProvider) Send(fromAddress string, fromName string, toAddress []string, subject string, content string) error {
var req *http.Request
var err error
fromNameField := "fromName"
toAddressField := "toAddress"
toAddressesField := "toAddresses"
subjectField := "subject"
contentField := "content"
for k, v := range c.bodyMapping {
switch k {
case "fromName":
fromNameField = v
case "toAddress":
toAddressField = v
case "toAddresses":
toAddressesField = v
case "subject":
subjectField = v
case "content":
@@ -73,7 +75,6 @@ func (c *HttpEmailProvider) Send(fromAddress string, fromName string, toAddress
if c.method == "POST" || c.method == "PUT" || c.method == "DELETE" {
bodyMap := make(map[string]string)
bodyMap[fromNameField] = fromName
bodyMap[toAddressField] = toAddress
bodyMap[subjectField] = subject
bodyMap[contentField] = content
@@ -89,6 +90,13 @@ func (c *HttpEmailProvider) Send(fromAddress string, fromName string, toAddress
for k, v := range bodyMap {
formValues.Add(k, v)
}
if len(toAddress) == 1 {
formValues.Add(toAddressField, toAddress[0])
} else {
for _, addr := range toAddress {
formValues.Add(toAddressesField, addr)
}
}
req, err = http.NewRequest(c.method, c.endpoint, strings.NewReader(formValues.Encode()))
}
@@ -105,7 +113,13 @@ func (c *HttpEmailProvider) Send(fromAddress string, fromName string, toAddress
q := req.URL.Query()
q.Add(fromNameField, fromName)
q.Add(toAddressField, toAddress)
if len(toAddress) == 1 {
q.Add(toAddressField, toAddress[0])
} else {
for _, addr := range toAddress {
q.Add(toAddressesField, addr)
}
}
q.Add(subjectField, subject)
q.Add(contentField, content)
req.URL.RawQuery = q.Encode()

View File

@@ -15,7 +15,7 @@
package email
type EmailProvider interface {
Send(fromAddress string, fromName, toAddress string, subject string, content string) error
Send(fromAddress string, fromName string, toAddress []string, subject string, content string) error
}
func GetEmailProvider(typ string, clientId string, clientSecret string, host string, port int, disableSsl bool, endpoint string, method string, httpHeaders map[string]string, bodyMapping map[string]string, contentType string) EmailProvider {

View File

@@ -41,13 +41,22 @@ func NewSendgridEmailProvider(apiKey string, host string, endpoint string) *Send
return &SendgridEmailProvider{ApiKey: apiKey, Host: host, Endpoint: endpoint}
}
func (s *SendgridEmailProvider) Send(fromAddress string, fromName string, toAddress string, subject string, content string) error {
client := s.initSendgridClient()
func (s *SendgridEmailProvider) Send(fromAddress string, fromName string, toAddresses []string, subject string, content string) error {
from := mail.NewEmail(fromName, fromAddress)
to := mail.NewEmail("", toAddress)
message := mail.NewSingleEmail(from, subject, to, "", content)
message := mail.NewV3Mail()
message.SetFrom(from)
message.AddContent(mail.NewContent("text/html", content))
personalization := mail.NewPersonalization()
for _, toAddress := range toAddresses {
to := mail.NewEmail(toAddress, toAddress)
personalization.AddTos(to)
}
message.AddPersonalizations(personalization)
client := s.initSendgridClient()
resp, err := client.Send(message)
if err != nil {
return err

View File

@@ -44,11 +44,15 @@ func NewSmtpEmailProvider(userName string, password string, host string, port in
return &SmtpEmailProvider{Dialer: dialer}
}
func (s *SmtpEmailProvider) Send(fromAddress string, fromName string, toAddress string, subject string, content string) error {
func (s *SmtpEmailProvider) Send(fromAddress string, fromName string, toAddresses []string, subject string, content string) error {
message := gomail.NewMessage()
message.SetAddressHeader("From", fromAddress, fromName)
message.SetHeader("To", toAddress)
var addresses []string
for _, address := range toAddresses {
addresses = append(addresses, message.FormatAddress(address, ""))
}
message.SetHeader("To", addresses...)
message.SetHeader("Subject", subject)
message.SetBody("text/html", content)

View File

@@ -106,6 +106,9 @@
"this operation is not allowed in demo mode": "هذه العملية غير مسموح بها في وضع العرض التوضيحي",
"this operation requires administrator to perform": "هذه العملية تتطلب مسؤولاً لتنفيذها"
},
"invitation": {
"Invitation %s does not exist": "Invitation %s does not exist"
},
"ldap": {
"Ldap server exist": "خادم LDAP موجود"
},

View File

@@ -106,6 +106,9 @@
"this operation is not allowed in demo mode": "bu əməliyyat demo rejimində icazə verilmir",
"this operation requires administrator to perform": "bu əməliyyat administrator tərəfindən yerinə yetirilməsini tələb edir"
},
"invitation": {
"Invitation %s does not exist": "Invitation %s does not exist"
},
"ldap": {
"Ldap server exist": "LDAP serveri mövcuddur"
},
@@ -190,4 +193,4 @@
"Found no credentials for this user": "Bu istifadəçi üçün heç bir etimadnamə tapılmadı",
"Please call WebAuthnSigninBegin first": "Xahiş edirik əvvəlcə WebAuthnSigninBegin çağırın"
}
}
}

View File

@@ -106,6 +106,9 @@
"this operation is not allowed in demo mode": "tato operace není povolena v demo režimu",
"this operation requires administrator to perform": "tato operace vyžaduje administrátora k provedení"
},
"invitation": {
"Invitation %s does not exist": "Invitation %s does not exist"
},
"ldap": {
"Ldap server exist": "Ldap server existuje"
},

View File

@@ -106,6 +106,9 @@
"this operation is not allowed in demo mode": "Dieser Vorgang ist im Demo-Modus nicht erlaubt",
"this operation requires administrator to perform": "Dieser Vorgang erfordert einen Administrator zur Ausführung"
},
"invitation": {
"Invitation %s does not exist": "Invitation %s does not exist"
},
"ldap": {
"Ldap server exist": "Es gibt einen LDAP-Server"
},

View File

@@ -106,6 +106,9 @@
"this operation is not allowed in demo mode": "this operation is not allowed in demo mode",
"this operation requires administrator to perform": "this operation requires administrator to perform"
},
"invitation": {
"Invitation %s does not exist": "Invitation %s does not exist"
},
"ldap": {
"Ldap server exist": "Ldap server exist"
},

View File

@@ -106,6 +106,9 @@
"this operation is not allowed in demo mode": "esta operación no está permitida en modo de demostración",
"this operation requires administrator to perform": "esta operación requiere que el administrador la realice"
},
"invitation": {
"Invitation %s does not exist": "Invitation %s does not exist"
},
"ldap": {
"Ldap server exist": "El servidor LDAP existe"
},

View File

@@ -106,6 +106,9 @@
"this operation is not allowed in demo mode": "این عملیات در حالت دمو مجاز نیست",
"this operation requires administrator to perform": "این عملیات نیاز به مدیر برای انجام دارد"
},
"invitation": {
"Invitation %s does not exist": "Invitation %s does not exist"
},
"ldap": {
"Ldap server exist": "سرور LDAP وجود دارد"
},

View File

@@ -106,6 +106,9 @@
"this operation is not allowed in demo mode": "tämä toiminto ei ole sallittu demo-tilassa",
"this operation requires administrator to perform": "tämä toiminto vaatii ylläpitäjän suorittamista"
},
"invitation": {
"Invitation %s does not exist": "Invitation %s does not exist"
},
"ldap": {
"Ldap server exist": "LDAP-palvelin on olemassa"
},

View File

@@ -106,6 +106,9 @@
"this operation is not allowed in demo mode": "cette opération n'est pas autorisée en mode démo",
"this operation requires administrator to perform": "cette opération nécessite un administrateur pour être effectuée"
},
"invitation": {
"Invitation %s does not exist": "Invitation %s does not exist"
},
"ldap": {
"Ldap server exist": "Le serveur LDAP existe"
},

View File

@@ -106,6 +106,9 @@
"this operation is not allowed in demo mode": "פעולה זו אינה מותרת במצב הדגמה",
"this operation requires administrator to perform": "פעולה זו דורשת מנהל לביצוע"
},
"invitation": {
"Invitation %s does not exist": "Invitation %s does not exist"
},
"ldap": {
"Ldap server exist": "שרת LDAP קיים"
},

View File

@@ -106,6 +106,9 @@
"this operation is not allowed in demo mode": "operasi ini tidak diizinkan dalam mode demo",
"this operation requires administrator to perform": "operasi ini memerlukan administrator untuk melakukannya"
},
"invitation": {
"Invitation %s does not exist": "Invitation %s does not exist"
},
"ldap": {
"Ldap server exist": "Server ldap ada"
},

View File

@@ -106,6 +106,9 @@
"this operation is not allowed in demo mode": "questa operazione non è consentita in modalità demo",
"this operation requires administrator to perform": "questa operazione richiede un amministratore"
},
"invitation": {
"Invitation %s does not exist": "Invitation %s does not exist"
},
"ldap": {
"Ldap server exist": "Server LDAP esistente"
},

View File

@@ -106,6 +106,9 @@
"this operation is not allowed in demo mode": "この操作はデモモードでは許可されていません",
"this operation requires administrator to perform": "この操作は管理者権限が必要です"
},
"invitation": {
"Invitation %s does not exist": "Invitation %s does not exist"
},
"ldap": {
"Ldap server exist": "LDAPサーバーは存在します"
},

View File

@@ -106,6 +106,9 @@
"this operation is not allowed in demo mode": "deze handeling is niet toegestaan in demo-modus",
"this operation requires administrator to perform": "deze handeling vereist beheerder"
},
"invitation": {
"Invitation %s does not exist": "Invitation %s does not exist"
},
"ldap": {
"Ldap server exist": "LDAP-server bestaat al"
},

View File

@@ -106,6 +106,9 @@
"this operation is not allowed in demo mode": "이 작업은 데모 모드에서 허용되지 않습니다",
"this operation requires administrator to perform": "이 작업은 관리자 권한이 필요합니다"
},
"invitation": {
"Invitation %s does not exist": "Invitation %s does not exist"
},
"ldap": {
"Ldap server exist": "LDAP 서버가 존재합니다"
},

View File

@@ -106,6 +106,9 @@
"this operation is not allowed in demo mode": "operasi ini tidak dibenarkan dalam mod demo",
"this operation requires administrator to perform": "operasi ini perlukan pentadbir untuk jalankan"
},
"invitation": {
"Invitation %s does not exist": "Invitation %s does not exist"
},
"ldap": {
"Ldap server exist": "Pelayan LDAP sudah wujud"
},

View File

@@ -106,6 +106,9 @@
"this operation is not allowed in demo mode": "Handeling niet toegestaan in demo-modus",
"this operation requires administrator to perform": "Alleen beheerder kan deze handeling uitvoeren"
},
"invitation": {
"Invitation %s does not exist": "Invitation %s does not exist"
},
"ldap": {
"Ldap server exist": "LDAP-server bestaat al"
},

View File

@@ -106,6 +106,9 @@
"this operation is not allowed in demo mode": "ta operacja nie jest dozwolona w trybie demo",
"this operation requires administrator to perform": "ta operacja wymaga administratora do wykonania"
},
"invitation": {
"Invitation %s does not exist": "Invitation %s does not exist"
},
"ldap": {
"Ldap server exist": "Serwer LDAP istnieje"
},

View File

@@ -106,6 +106,9 @@
"this operation is not allowed in demo mode": "esta operação não é permitida no modo de demonstração",
"this operation requires administrator to perform": "esta operação requer um administrador para executar"
},
"invitation": {
"Invitation %s does not exist": "Invitation %s does not exist"
},
"ldap": {
"Ldap server exist": "Servidor LDAP existe"
},

View File

@@ -106,6 +106,9 @@
"this operation is not allowed in demo mode": "эта операция недоступна в демонстрационном режиме",
"this operation requires administrator to perform": "эта операция требует прав администратора"
},
"invitation": {
"Invitation %s does not exist": "Invitation %s does not exist"
},
"ldap": {
"Ldap server exist": "LDAP-сервер существует"
},

View File

@@ -106,6 +106,9 @@
"this operation is not allowed in demo mode": "táto operácia nie je povolená v demo režime",
"this operation requires administrator to perform": "táto operácia vyžaduje vykonanie administrátorom"
},
"invitation": {
"Invitation %s does not exist": "Invitation %s does not exist"
},
"ldap": {
"Ldap server exist": "LDAP server existuje"
},

View File

@@ -106,6 +106,9 @@
"this operation is not allowed in demo mode": "denna åtgärd är inte tillåten i demoläge",
"this operation requires administrator to perform": "denna åtgärd kräver administratör för att genomföras"
},
"invitation": {
"Invitation %s does not exist": "Invitation %s does not exist"
},
"ldap": {
"Ldap server exist": "LDAP-servern finns redan"
},

View File

@@ -106,6 +106,9 @@
"this operation is not allowed in demo mode": "bu işlem demo modunda izin verilmiyor",
"this operation requires administrator to perform": "bu işlem yönetici tarafından gerçekleştirilmelidir"
},
"invitation": {
"Invitation %s does not exist": "Invitation %s does not exist"
},
"ldap": {
"Ldap server exist": "LDAP sunucusu zaten var"
},

View File

@@ -106,6 +106,9 @@
"this operation is not allowed in demo mode": "ця операція недоступна в демо-режимі",
"this operation requires administrator to perform": "ця операція потребує прав адміністратора"
},
"invitation": {
"Invitation %s does not exist": "Invitation %s does not exist"
},
"ldap": {
"Ldap server exist": "Сервер LDAP існує"
},

View File

@@ -106,6 +106,9 @@
"this operation is not allowed in demo mode": "thao tác này không được phép trong chế độ demo",
"this operation requires administrator to perform": "thao tác này yêu cầu quản trị viên thực hiện"
},
"invitation": {
"Invitation %s does not exist": "Invitation %s does not exist"
},
"ldap": {
"Ldap server exist": "Máy chủ LDAP tồn tại"
},

View File

@@ -106,6 +106,9 @@
"this operation is not allowed in demo mode": "demo模式下不允许该操作",
"this operation requires administrator to perform": "只有管理员才能进行此操作"
},
"invitation": {
"Invitation %s does not exist": "邀请%s不存在"
},
"ldap": {
"Ldap server exist": "LDAP服务器已存在"
},

View File

@@ -30,7 +30,7 @@ func TestSmtpServer(provider *Provider) error {
return nil
}
func SendEmail(provider *Provider, title string, content string, dest string, sender string) error {
func SendEmail(provider *Provider, title string, content string, dest []string, sender string) error {
emailProvider := email.GetEmailProvider(provider.Type, provider.ClientId, provider.ClientSecret, provider.Host, provider.Port, provider.DisableSsl, provider.Endpoint, provider.Method, provider.HttpHeaders, provider.UserMapping, provider.IssuerUrl)
fromAddress := provider.ClientId2

View File

@@ -235,3 +235,8 @@ func (invitation *Invitation) IsInvitationCodeValid(application *Application, in
}
return true, ""
}
func (invitation *Invitation) GetInvitationLink(host string, application string) string {
frontEnd, _ := getOriginFromHost(host)
return fmt.Sprintf("%s/signup/%s?invitationCode=%s", frontEnd, application, invitation.Code)
}

View File

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

View File

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

View File

@@ -129,7 +129,7 @@ func SendVerificationCodeToEmail(organization *Organization, user *User, provide
return err
}
err = SendEmail(provider, title, content, dest, sender)
err = SendEmail(provider, title, content, []string{dest}, sender)
if err != nil {
return err
}

View File

@@ -91,7 +91,7 @@ func getObject(ctx *context.Context) (string, string, error) {
return "", "", nil
} else {
if path == "/api/add-policy" || path == "/api/remove-policy" || path == "/api/update-policy" {
if path == "/api/add-policy" || path == "/api/remove-policy" || path == "/api/update-policy" || path == "/api/send-invitation" {
id := ctx.Input.Query("id")
if id != "" {
return util.GetOwnerAndNameFromIdWithError(id)

View File

@@ -102,6 +102,7 @@ func initAPI() {
beego.Router("/api/add-invitation", &controllers.ApiController{}, "POST:AddInvitation")
beego.Router("/api/delete-invitation", &controllers.ApiController{}, "POST:DeleteInvitation")
beego.Router("/api/verify-invitation", &controllers.ApiController{}, "GET:VerifyInvitation")
beego.Router("/api/send-invitation", &controllers.ApiController{}, "POST:SendInvitation")
beego.Router("/api/get-applications", &controllers.ApiController{}, "GET:GetApplications")
beego.Router("/api/get-application", &controllers.ApiController{}, "GET:GetApplication")

View File

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

View File

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

View File

@@ -113,6 +113,34 @@ class ApplicationListPage extends BaseListPage {
});
}
copyApplication(i) {
const original = this.state.data[i];
const randomSuffix = Setting.getRandomName();
const newName = `${original.name}_${randomSuffix}`;
const copiedApplication = {
...original,
name: newName,
createdTime: moment().format(),
displayName: "Copy Application - " + newName,
clientId: "",
clientSecret: "",
};
ApplicationBackend.addApplication(copiedApplication)
.then((res) => {
if (res.status === "ok") {
this.props.history.push({pathname: `/applications/${copiedApplication.organization}/${newName}`, mode: "add"});
Setting.showMessage("success", i18next.t("general:Successfully copied"));
} else {
Setting.showMessage("error", `${i18next.t("general:Failed to copy")}: ${res.msg}`);
}
})
.catch(error => {
Setting.showMessage("error", `${i18next.t("general:Failed to connect to server")}: ${error}`);
});
}
renderTable(applications) {
const columns = [
{
@@ -237,12 +265,13 @@ class ApplicationListPage extends BaseListPage {
title: i18next.t("general:Action"),
dataIndex: "",
key: "op",
width: "170px",
width: "230px",
fixed: (Setting.isMobile()) ? "false" : "right",
render: (text, record, index) => {
return (
<div>
<Button style={{marginTop: "10px", marginBottom: "10px", marginRight: "10px"}} type="primary" onClick={() => this.props.history.push(`/applications/${record.organization}/${record.name}`)}>{i18next.t("general:Edit")}</Button>
<Button style={{marginTop: "10px", marginBottom: "10px", marginRight: "10px"}} onClick={() => this.copyApplication(index)}>{i18next.t("general:Copy")}</Button>
<PopconfirmModal
title={i18next.t("general:Sure to delete") + `: ${record.name} ?`}
onConfirm={() => this.deleteApplication(index)}

View File

@@ -13,7 +13,7 @@
// limitations under the License.
import React from "react";
import {Button, Card, Col, Input, InputNumber, Row, Select} from "antd";
import {Button, Card, Col, Input, InputNumber, Modal, Row, Select, Table} from "antd";
import {CopyOutlined} from "@ant-design/icons";
import * as InvitationBackend from "./backend/InvitationBackend";
import * as OrganizationBackend from "./backend/OrganizationBackend";
@@ -37,6 +37,7 @@ class InvitationEditPage extends React.Component {
applications: [],
groups: [],
mode: props.location.mode !== undefined ? props.location.mode : "edit",
sendLoading: false,
};
}
@@ -123,6 +124,35 @@ class InvitationEditPage extends React.Component {
Setting.showMessage("success", i18next.t("general:Copied to clipboard successfully"));
}
renderSendEmailModal() {
const emailColumns = [
{title: "email", dataIndex: "email"},
];
const emails = this.state.emails?.split("\n")?.filter(email => Setting.isValidEmail(email));
const emailData = emails?.map((email) => {return {email: email};});
return <Modal title={i18next.t("general:Send")}
style={{height: "800px"}}
open={this.state.showSendModal}
closable
footer={[
<Button key={1} loading={this.state.sendLoading} type="primary"
onClick={() => {
this.setState({sendLoading: true});
InvitationBackend.sendInvitation(this.state.invitation, emails).then(() => {
this.setState({sendLoading: false});
Setting.showMessage("success", i18next.t("general:Successfully sent"));
}).catch(err => Setting.showMessage("success", err.message));
}}>{i18next.t("general:Send")}</Button>,
]}
onCancel={() => {this.setState({showSendModal: false});}}>
<div >
<p>You will send invitation email to:</p>
<Table showHeader={false} columns={emailColumns} dataSource={emailData} size={"small"}></Table>
</div>
</Modal>;
}
renderInvitation() {
const isCreatedByPlan = this.state.invitation.tag === "auto_created_invitation_for_plan";
return (
@@ -199,6 +229,17 @@ class InvitationEditPage extends React.Component {
</Button>
</Col>
</Row>
<Row style={{marginTop: "20px"}} >
<Col style={{marginTop: "5px"}} span={(Setting.isMobile()) ? 22 : 2}>
{i18next.t("general:Send")}
</Col>
<Col span={22} >
<Input.TextArea autoSize={{minRows: 3, maxRows: 10}} value={this.state.emails} onChange={(value) => {
this.setState({emails: value.target.value});
}}></Input.TextArea>
<Button type="primary" style={{marginTop: "20px"}} onClick={() => this.setState({showSendModal: true})}>{i18next.t("general:Send")}</Button>
</Col>
</Row>
<Row style={{marginTop: "20px"}} >
<Col style={{marginTop: "5px"}} span={(Setting.isMobile()) ? 22 : 2}>
{Setting.getLabel(i18next.t("invitation:Quota"), i18next.t("invitation:Quota - Tooltip"))} :
@@ -338,6 +379,7 @@ class InvitationEditPage extends React.Component {
render() {
return (
<div>
{this.state.showSendModal ? this.renderSendEmailModal() : null}
{
this.state.invitation !== null ? this.renderInvitation() : null
}

View File

@@ -597,6 +597,7 @@ class ProviderEditPage extends React.Component {
this.updateProviderField("disableSsl", false);
this.updateProviderField("title", "Casdoor Verification Code");
this.updateProviderField("content", Setting.getDefaultHtmlEmailContent());
this.updateProviderField("metadata", Setting.getDefaultInvitationHtmlEmailContent());
this.updateProviderField("receiver", this.props.account.email);
} else if (value === "SMS") {
this.updateProviderField("type", "Twilio SMS");
@@ -1271,6 +1272,42 @@ class ProviderEditPage extends React.Component {
</Row>
</Col>
</Row>
<Row style={{marginTop: "20px"}} >
<Col style={{marginTop: "5px"}} span={(Setting.isMobile()) ? 22 : 2}>
{Setting.getLabel(`${i18next.t("provider:Email content")}-${i18next.t("general:Invitations")}`, i18next.t("provider:Email content - Tooltip"))} :
</Col>
<Col span={22} >
<Row style={{marginTop: "20px"}} >
<Button style={{marginLeft: "10px", marginBottom: "5px"}} onClick={() => this.updateProviderField("metadata", "You have invited to join Casdoor. Here is your invitation code: %s, please enter in 5 minutes. Or click %link to signup")} >
{i18next.t("provider:Reset to Default Text")}
</Button>
<Button style={{marginLeft: "10px", marginBottom: "5px"}} type="primary" onClick={() => this.updateProviderField("metadata", Setting.getDefaultInvitationHtmlEmailContent())} >
{i18next.t("provider:Reset to Default HTML")}
</Button>
</Row>
<Row>
<Col span={Setting.isMobile() ? 22 : 11}>
<div style={{height: "300px", margin: "10px"}}>
<Editor
value={this.state.provider.metadata}
fillHeight
dark
lang="html"
onChange={value => {
this.updateProviderField("metadata", value);
}}
/>
</div>
</Col>
<Col span={1} />
<Col span={Setting.isMobile() ? 22 : 11}>
<div style={{margin: "10px"}}>
<div dangerouslySetInnerHTML={{__html: this.state.provider.metadata.replace("%code", "123456")}} />
</div>
</Col>
</Row>
</Col>
</Row>
<Row style={{marginTop: "20px"}}>
<Col style={{marginTop: "5px"}} span={(Setting.isMobile()) ? 22 : 2}>
{Setting.getLabel(i18next.t("provider:Test Email"), i18next.t("provider:Test Email - Tooltip"))} :

View File

@@ -1648,6 +1648,48 @@ export function getDefaultHtmlEmailContent() {
</html>`;
}
export function getDefaultInvitationHtmlEmailContent() {
return `<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Invitation Code Email</title>
<style>
body { font-family: Arial, sans-serif; }
.email-container { width: 600px; margin: 0 auto; }
.header { text-align: center; }
.code { font-size: 24px; margin: 20px 0; text-align: center; }
.footer { font-size: 12px; text-align: center; margin-top: 50px; }
.footer a { color: #000; text-decoration: none; }
</style>
</head>
<body>
<div class="email-container">
<div class="header">
<h3>Casbin Organization</h3>
<img src="${StaticBaseUrl}/img/casdoor-logo_1185x256.png" alt="Casdoor Logo" width="300">
</div>
<p>You have been invited into Casdoor</p>
<div class="code">
%code
</div>
<reset-link>
<div class="link">
Or click this <a href="%link">link</a> to signup
</div>
</reset-link>
<p>Thanks</p>
<p>Casbin Team</p>
<hr>
<div class="footer">
<p>Casdoor is a brand operated by Casbin organization. For more info please refer to <a href="https://casdoor.org">https://casdoor.org</a></p>
</div>
</div>
</body>
</html>`;
}
export function getCurrencyText(product) {
if (product?.currency === "USD") {
return i18next.t("currency:USD");

View File

@@ -46,6 +46,7 @@ const FaceRecognitionModal = lazy(() => import("../common/modal/FaceRecognitionM
class LoginPage extends React.Component {
constructor(props) {
super(props);
this.captchaRef = React.createRef();
this.state = {
classes: props,
type: props.type,
@@ -466,6 +467,7 @@ class LoginPage extends React.Component {
login(values) {
// here we are supposed to determine whether Casdoor is working as an OAuth server or CAS server
values["language"] = this.state.userLang ?? "";
const usedCaptcha = this.state.captchaValues !== undefined;
if (this.state.type === "cas") {
// CAS
const casParams = Util.getCasParameters();
@@ -492,6 +494,9 @@ class LoginPage extends React.Component {
Setting.checkLoginMfa(res, values, casParams, loginHandler, this);
} else {
Setting.showMessage("error", `${i18next.t("application:Failed to sign in")}: ${res.msg}`);
if (usedCaptcha) {
this.captchaRef.current?.loadCaptcha?.();
}
}
}).finally(() => {
this.setState({loginLoading: false});
@@ -565,6 +570,9 @@ class LoginPage extends React.Component {
Setting.checkLoginMfa(res, values, oAuthParams, loginHandler, this);
} else {
Setting.showMessage("error", `${i18next.t("application:Failed to sign in")}: ${res.msg}`);
if (usedCaptcha) {
this.captchaRef.current?.loadCaptcha?.();
}
}
}).finally(() => {
this.setState({loginLoading: false});
@@ -1124,6 +1132,7 @@ class LoginPage extends React.Component {
}}
onCancel={() => this.setState({openCaptchaModal: false, loginLoading: false})}
isCurrentProvider={true}
innerRef={this.captchaRef}
/>;
}

View File

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

View File

@@ -89,3 +89,14 @@ export function verifyInvitation(owner, name) {
},
}).then(res => res.json());
}
export function sendInvitation(invitation, destinations) {
return fetch(`${Setting.ServerUrl}/api/send-invitation?id=${invitation.owner}/${encodeURIComponent(invitation.name)}`, {
method: "POST",
credentials: "include",
body: JSON.stringify(destinations),
headers: {
"Accept-Language": Setting.getAcceptLanguage(),
},
}).then(res => res.json());
}

View File

@@ -20,7 +20,7 @@ import {CaptchaWidget} from "../CaptchaWidget";
import {SafetyOutlined} from "@ant-design/icons";
export const CaptchaModal = (props) => {
const {owner, name, visible, onOk, onUpdateToken, onCancel, isCurrentProvider, noModal} = props;
const {owner, name, visible, onOk, onUpdateToken, onCancel, isCurrentProvider, noModal, innerRef} = props;
const [captchaType, setCaptchaType] = React.useState("none");
const [clientId, setClientId] = React.useState("");
@@ -59,6 +59,14 @@ export const CaptchaModal = (props) => {
onCancel?.();
};
useEffect(() => {
if (innerRef) {
innerRef.current = {
loadCaptcha: loadCaptcha,
};
}
}, [innerRef]);
const loadCaptcha = () => {
UserBackend.getCaptcha(owner, name, isCurrentProvider).then((res) => {
if (res.type === "none") {

View File

@@ -260,6 +260,7 @@
"Close": "إغلاق",
"Confirm": "تأكيد",
"Copied to clipboard successfully": "تم النسخ إلى الحافظة بنجاح",
"Copy": "Copy",
"Created time": "وقت الإنشاء",
"Custom": "مخصص",
"Dashboard": "لوحة التحكم",
@@ -294,6 +295,7 @@
"Enforcers": "المنفذون",
"Failed to add": "فشل الإضافة",
"Failed to connect to server": "فشل الاتصال بالخادم",
"Failed to copy": "Failed to copy",
"Failed to delete": "فشل الحذف",
"Failed to enable": "فشل التمكين",
"Failed to get TermsOfUse URL": "فشل الحصول على رابط شروط الاستخدام",
@@ -305,6 +307,7 @@
"Favicon": "الرمز المفضل",
"Favicon - Tooltip": "رابط رمز الموقع المستخدم في جميع صفحات Casdoor الخاصة بالمنظمة",
"First name": "الاسم الأول",
"First name - Tooltip": "The first name of user",
"Forced redirect origin - Tooltip": "إعادة توجيه الأصل بالقوة - تلميح",
"Forget URL": "رابط نسيان كلمة المرور",
"Forget URL - Tooltip": "رابط مخصص لصفحة \"نسيان كلمة المرور\". إذا لم يتم تعيينه، ستُستخدم صفحة Casdoor الافتراضية. عند التعيين، ستُعيد توجيه روابط \"نسيان كلمة المرور\" إلى هذا الرابط",
@@ -331,6 +334,7 @@
"Languages": "اللغات",
"Languages - Tooltip": "اللغات المتاحة",
"Last name": "الاسم الأخير",
"Last name - Tooltip": "The last name of user",
"Later": "لاحقًا",
"Logging & Auditing": "التسجيل والمراجعة",
"Login page": "Login page",
@@ -415,6 +419,7 @@
"SSH type - Tooltip": "نوع المصادقة لاتصال SSH",
"Save": "حفظ",
"Save & Exit": "حفظ وخروج",
"Send": "Send",
"Session ID": "معرف الجلسة",
"Sessions": "الجلسات",
"Shortcuts": "الاختصارات",
@@ -432,6 +437,7 @@
"State - Tooltip": "الحالة - تلميح",
"Subscriptions": "الاشتراكات",
"Successfully added": "تمت الإضافة بنجاح",
"Successfully copied": "Successfully copied",
"Successfully deleted": "تم الحذف بنجاح",
"Successfully removed": "تمت الإزالة بنجاح",
"Successfully saved": "تم الحفظ بنجاح",

View File

@@ -96,7 +96,7 @@
"Order - Tooltip": "Order - Tooltip",
"Org choice mode": "Təşkilat seçim rejimi",
"Org choice mode - Tooltip": "Təşkilat seçim rejimi - Tooltip",
"Please enable \"Signin session\" first before enabling \"Auto signin\"": "\"Avtomatik giriş\"i aktiv etməzdən əvvəl əvvəlcə \"Giriş sessiyası\"nı aktiv edin",
"Please enable \\\"Signin session\\\" first before enabling \\\"Auto signin\\\"": "Najprv povoľte \\\"Reláciu prihlásenia\\\" pred povolením \\\"Automatického prihlásenia\\\"",
"Please input your application!": "Xahiş edirik tətbiqinizi daxil edin!",
"Please input your organization!": "Xahiş edirik təşkilatınızı daxil edin!",
"Please select a HTML file": "Xahiş edirik HTML faylı seçin",
@@ -260,6 +260,7 @@
"Close": "Bağla",
"Confirm": "Təsdiqlə",
"Copied to clipboard successfully": "Panoya uğurla köçürüldü",
"Copy": "Copy",
"Created time": "Yaradılma vaxtı",
"Custom": "Xüsusi",
"Dashboard": "İdarə paneli",
@@ -294,6 +295,7 @@
"Enforcers": "İcraçılar",
"Failed to add": "Əlavə etmə uğursuz oldu",
"Failed to connect to server": "Serverə qoşulma uğursuz oldu",
"Failed to copy": "Failed to copy",
"Failed to delete": "Silmə uğursuz oldu",
"Failed to enable": "Aktiv etmə uğursuz oldu",
"Failed to get TermsOfUse URL": "TermsOfUse URL-i almaq uğursuz oldu",
@@ -305,6 +307,7 @@
"Favicon": "Favicon",
"Favicon - Tooltip": "Təşkilatın bütün Casdoor səhifələrində istifadə olunan favicon ikon URL-i",
"First name": "Ad",
"First name - Tooltip": "The first name of user",
"Forced redirect origin - Tooltip": "Məcburi yönləndirmə mənşəyi - Tooltip",
"Forget URL": "Unutma URL-i",
"Forget URL - Tooltip": "\"Şifrəni unudun\" səhifəsi üçün xüsusi URL. Təyin edilməsə, defolt Casdoor \"Şifrəni unudun\" səhifəsi istifadə ediləcək. Təyin edildikdə, giriş səhifəsindəki \"Şifrəni unudun\" linki bu URL-ə yönləndirəcək",
@@ -331,6 +334,7 @@
"Languages": "Dillər",
"Languages - Tooltip": "Mövcud dillər",
"Last name": "Soyad",
"Last name - Tooltip": "The last name of user",
"Later": "Sonra",
"Logging & Auditing": "Loglaşdırma və Audit",
"Login page": "Giriş səhifəsi",
@@ -415,6 +419,7 @@
"SSH type - Tooltip": "SSH bağlantısının auth növü",
"Save": "Yadda saxla",
"Save & Exit": "Yadda saxla və Çıx",
"Send": "Send",
"Session ID": "Sessiya ID",
"Sessions": "Sessiyalar",
"Shortcuts": "Qısayollar",
@@ -432,6 +437,7 @@
"State - Tooltip": "Vəziyyət",
"Subscriptions": "Abunələr",
"Successfully added": "Uğurla əlavə edildi",
"Successfully copied": "Successfully copied",
"Successfully deleted": "Uğurla silindi",
"Successfully removed": "Uğurla silindi",
"Successfully saved": "Uğurla yadda saxlanıldı",
@@ -485,7 +491,7 @@
"Show all": "Hamısını göstər",
"Upload (.xlsx)": "Yüklə (.xlsx)",
"Virtual": "Virtual",
"You need to delete all subgroups first. You can view the subgroups in the left group tree of the [Organizations] -> [Groups] page": "Əvvəlcə bütün alt qrupları silməlisiniz. Alt qrupları [Təşkilatlar] -> [Qruplar] səhifəsinin sol qrup ağacında görə bilərsiniz"
"You need to delete all subgroups first. You can view the subgroups in the left group tree of the [Organizations] -\u003e [Groups] page": "Əvvəlcə bütün alt qrupları silməlisiniz. Alt qrupları [Təşkilatlar] -\u003e [Qruplar] səhifəsinin sol qrup ağacında görə bilərsiniz"
},
"home": {
"New users past 30 days": "Son 30 gündə yeni istifadəçilər",
@@ -1325,4 +1331,4 @@
"Single org only - Tooltip": "Yalnız webhook-un aid olduğu təşkilatda tetiklənir",
"Value": "Dəyər"
}
}
}

View File

@@ -260,6 +260,7 @@
"Close": "Zavřít",
"Confirm": "Potvrdit",
"Copied to clipboard successfully": "Úspěšně zkopírováno do schránky",
"Copy": "Copy",
"Created time": "Čas vytvoření",
"Custom": "Vlastní",
"Dashboard": "Hlavní obrazovka",
@@ -294,6 +295,7 @@
"Enforcers": "Vynucovače",
"Failed to add": "Nepodařilo se přidat",
"Failed to connect to server": "Nepodařilo se připojit k serveru",
"Failed to copy": "Failed to copy",
"Failed to delete": "Nepodařilo se smazat",
"Failed to enable": "Povolení se nezdařilo",
"Failed to get TermsOfUse URL": "Nepodařilo se získat URL podmínek použití",
@@ -305,6 +307,7 @@
"Favicon": "Ikona webu",
"Favicon - Tooltip": "URL ikony favicon použité na všech stránkách Casdoor organizace",
"First name": "Křestní jméno",
"First name - Tooltip": "The first name of user",
"Forced redirect origin - Tooltip": "Vynucený původ přesměrování - popisek",
"Forget URL": "URL pro zapomenutí",
"Forget URL - Tooltip": "Vlastní URL pro stránku \"Zapomenuté heslo\". Pokud není nastaveno, bude použita výchozí stránka Casdoor \"Zapomenuté heslo\". Když je nastaveno, odkaz \"Zapomenuté heslo\" na přihlašovací stránce přesměruje na tuto URL",
@@ -331,6 +334,7 @@
"Languages": "Jazyky",
"Languages - Tooltip": "Dostupné jazyky",
"Last name": "Příjmení",
"Last name - Tooltip": "The last name of user",
"Later": "Později",
"Logging & Auditing": "Logování a audit",
"Login page": "Login page",
@@ -415,6 +419,7 @@
"SSH type - Tooltip": "Typ ověření SSH připojení",
"Save": "Uložit",
"Save & Exit": "Uložit & Ukončit",
"Send": "Send",
"Session ID": "ID relace",
"Sessions": "Relace",
"Shortcuts": "Zkratky",
@@ -432,6 +437,7 @@
"State - Tooltip": "Stav",
"Subscriptions": "Předplatné",
"Successfully added": "Úspěšně přidáno",
"Successfully copied": "Successfully copied",
"Successfully deleted": "Úspěšně smazáno",
"Successfully removed": "Úspěšně odstraněno",
"Successfully saved": "Úspěšně uloženo",

View File

@@ -260,6 +260,7 @@
"Close": "Schließen",
"Confirm": "Bestätigen",
"Copied to clipboard successfully": "Erfolgreich in die Zwischenablage kopiert",
"Copy": "Copy",
"Created time": "Erstellte Zeit",
"Custom": "Benutzerdefiniert",
"Dashboard": "Dashboard",
@@ -294,6 +295,7 @@
"Enforcers": "Enforcer",
"Failed to add": "Fehler beim hinzufügen",
"Failed to connect to server": "Die Verbindung zum Server konnte nicht hergestellt werden",
"Failed to copy": "Failed to copy",
"Failed to delete": "Konnte nicht gelöscht werden",
"Failed to enable": "Aktivierung fehlgeschlagen",
"Failed to get TermsOfUse URL": "Fehler beim Abrufen der Nutzungsbedingungs-URL",
@@ -305,6 +307,7 @@
"Favicon": "Favicon",
"Favicon - Tooltip": "Favicon-URL, die auf allen Casdoor-Seiten der Organisation verwendet wird",
"First name": "Vorname",
"First name - Tooltip": "The first name of user",
"Forced redirect origin - Tooltip": "Erzwungene Weiterleitung Ursprung Tooltip",
"Forget URL": "Passwort vergessen URL",
"Forget URL - Tooltip": "Benutzerdefinierte URL für die \"Passwort vergessen\" Seite. Wenn nicht festgelegt, wird die standardmäßige Casdoor \"Passwort vergessen\" Seite verwendet. Wenn sie festgelegt ist, wird der \"Passwort vergessen\" Link auf der Login-Seite zu dieser URL umgeleitet",
@@ -331,6 +334,7 @@
"Languages": "Sprachen",
"Languages - Tooltip": "Verfügbare Sprachen",
"Last name": "Nachname",
"Last name - Tooltip": "The last name of user",
"Later": "Später",
"Logging & Auditing": "Protokollierung & Audit",
"Login page": "Login page",
@@ -415,6 +419,7 @@
"SSH type - Tooltip": "Der Authentifizierungstyp für SSH-Verbindungen",
"Save": "Speichern",
"Save & Exit": "Speichern und verlassen",
"Send": "Send",
"Session ID": "Session-ID",
"Sessions": "Sitzungen",
"Shortcuts": "Verknüpfungen",
@@ -432,6 +437,7 @@
"State - Tooltip": "Bundesland",
"Subscriptions": "Abonnements",
"Successfully added": "Erfolgreich hinzugefügt",
"Successfully copied": "Successfully copied",
"Successfully deleted": "Erfolgreich gelöscht",
"Successfully removed": "Erfolgreich entfernt",
"Successfully saved": "Erfolgreich gespeichert",

View File

@@ -260,6 +260,7 @@
"Close": "Close",
"Confirm": "Confirm",
"Copied to clipboard successfully": "Copied to clipboard successfully",
"Copy": "Copy",
"Created time": "Created time",
"Custom": "Custom",
"Dashboard": "Dashboard",
@@ -294,6 +295,7 @@
"Enforcers": "Enforcers",
"Failed to add": "Failed to add",
"Failed to connect to server": "Failed to connect to server",
"Failed to copy": "Failed to copy",
"Failed to delete": "Failed to delete",
"Failed to enable": "Failed to enable",
"Failed to get TermsOfUse URL": "Failed to get TermsOfUse URL",
@@ -305,6 +307,7 @@
"Favicon": "Favicon",
"Favicon - Tooltip": "Favicon icon URL used in all Casdoor pages of the organization",
"First name": "First name",
"First name - Tooltip": "The first name of user",
"Forced redirect origin - Tooltip": "Forced redirect origin - Tooltip",
"Forget URL": "Forget URL",
"Forget URL - Tooltip": "Custom URL for the \"Forget password\" page. If not set, the default Casdoor \"Forget password\" page will be used. When set, the \"Forget password\" link on the login page will redirect to this URL",
@@ -331,6 +334,7 @@
"Languages": "Languages",
"Languages - Tooltip": "Available languages",
"Last name": "Last name",
"Last name - Tooltip": "The last name of user",
"Later": "Later",
"Logging & Auditing": "Logging & Auditing",
"Login page": "Login page",
@@ -415,6 +419,7 @@
"SSH type - Tooltip": "The auth type of SSH connection",
"Save": "Save",
"Save & Exit": "Save & Exit",
"Send": "Send",
"Session ID": "Session ID",
"Sessions": "Sessions",
"Shortcuts": "Shortcuts",
@@ -432,6 +437,7 @@
"State - Tooltip": "State",
"Subscriptions": "Subscriptions",
"Successfully added": "Successfully added",
"Successfully copied": "Successfully copied",
"Successfully deleted": "Successfully deleted",
"Successfully removed": "Successfully removed",
"Successfully saved": "Successfully saved",

View File

@@ -260,6 +260,7 @@
"Close": "Cerca",
"Confirm": "Confirmar",
"Copied to clipboard successfully": "Copiado al portapapeles exitosamente",
"Copy": "Copy",
"Created time": "Tiempo creado",
"Custom": "Personalizado",
"Dashboard": "Panel de control",
@@ -294,6 +295,7 @@
"Enforcers": "Aplicadores",
"Failed to add": "No se pudo agregar",
"Failed to connect to server": "No se pudo conectar al servidor",
"Failed to copy": "Failed to copy",
"Failed to delete": "No se pudo eliminar",
"Failed to enable": "Error al habilitar",
"Failed to get TermsOfUse URL": "Error al obtener la URL de Términos de uso",
@@ -305,6 +307,7 @@
"Favicon": "Favicon",
"Favicon - Tooltip": "URL del icono Favicon utilizado en todas las páginas de Casdoor de la organización",
"First name": "Nombre de pila",
"First name - Tooltip": "The first name of user",
"Forced redirect origin - Tooltip": "Origen de redirección forzada - Información adicional",
"Forget URL": "Olvide la URL",
"Forget URL - Tooltip": "URL personalizada para la página \"Olvidé mi contraseña\". Si no se establece, se utilizará la página \"Olvidé mi contraseña\" predeterminada de Casdoor. Cuando se establezca, el enlace \"Olvidé mi contraseña\" en la página de inicio de sesión redireccionará a esta URL",
@@ -331,6 +334,7 @@
"Languages": "Idiomas",
"Languages - Tooltip": "Idiomas disponibles",
"Last name": "Apellido",
"Last name - Tooltip": "The last name of user",
"Later": "Más tarde",
"Logging & Auditing": "Registro y auditoría",
"Login page": "Login page",
@@ -415,6 +419,7 @@
"SSH type - Tooltip": "El tipo de autenticación de conexión SSH",
"Save": "Guardar",
"Save & Exit": "Guardar y salir",
"Send": "Send",
"Session ID": "ID de sesión",
"Sessions": "Sesiones",
"Shortcuts": "Accesos directos",
@@ -432,6 +437,7 @@
"State - Tooltip": "Estado",
"Subscriptions": "Suscripciones",
"Successfully added": "Éxito al agregar",
"Successfully copied": "Successfully copied",
"Successfully deleted": "Éxito en la eliminación",
"Successfully removed": "Eliminado exitosamente",
"Successfully saved": "Guardado exitosamente",

View File

@@ -260,6 +260,7 @@
"Close": "بستن",
"Confirm": "تأیید",
"Copied to clipboard successfully": "با موفقیت در کلیپ‌بورد کپی شد",
"Copy": "Copy",
"Created time": "زمان ایجاد",
"Custom": "سفارشی",
"Dashboard": "داشبورد",
@@ -294,6 +295,7 @@
"Enforcers": "Enforcerها",
"Failed to add": "عدم موفقیت در افزودن",
"Failed to connect to server": "عدم موفقیت در اتصال به سرور",
"Failed to copy": "Failed to copy",
"Failed to delete": "عدم موفقیت در حذف",
"Failed to enable": "عدم موفقیت در فعال‌سازی",
"Failed to get TermsOfUse URL": "عدم موفقیت در دریافت آدرس شرایط استفاده",
@@ -305,6 +307,7 @@
"Favicon": "آیکون وب",
"Favicon - Tooltip": "آدرس آیکون Favicon استفاده شده در تمام صفحات Casdoor سازمان",
"First name": "نام",
"First name - Tooltip": "The first name of user",
"Forced redirect origin - Tooltip": "منبع بازگرداندن اجباری - توصیه",
"Forget URL": "آدرس فراموشی",
"Forget URL - Tooltip": "آدرس سفارشی برای صفحه \"فراموشی رمز عبور\". اگر تنظیم نشده باشد، صفحه پیش‌فرض \"فراموشی رمز عبور\" Casdoor استفاده می‌شود. هنگامی که تنظیم شده باشد، لینک \"فراموشی رمز عبور\" در صفحه ورود به این آدرس هدایت می‌شود",
@@ -331,6 +334,7 @@
"Languages": "زبان‌ها",
"Languages - Tooltip": "زبان‌های موجود",
"Last name": "نام خانوادگی",
"Last name - Tooltip": "The last name of user",
"Later": "بعداً",
"Logging & Auditing": "ورود و حسابرسی",
"Login page": "Login page",
@@ -415,6 +419,7 @@
"SSH type - Tooltip": "نوع احراز هویت اتصال SSH",
"Save": "ذخیره",
"Save & Exit": "ذخیره و خروج",
"Send": "Send",
"Session ID": "شناسه جلسه",
"Sessions": "جلسات",
"Shortcuts": "میانبرها",
@@ -432,6 +437,7 @@
"State - Tooltip": "وضعیت",
"Subscriptions": "اشتراک‌ها",
"Successfully added": "با موفقیت اضافه شد",
"Successfully copied": "Successfully copied",
"Successfully deleted": "با موفقیت حذف شد",
"Successfully removed": "با موفقیت حذف شد",
"Successfully saved": "با موفقیت ذخیره شد",

View File

@@ -260,6 +260,7 @@
"Close": "Sulje",
"Confirm": "Vahvista",
"Copied to clipboard successfully": "Kopioitu leikepöydälle onnistuneesti",
"Copy": "Copy",
"Created time": "Luontiaika",
"Custom": "Mukautettu",
"Dashboard": "Ohjauspaneeli",
@@ -294,6 +295,7 @@
"Enforcers": "Valvojat",
"Failed to add": "Lisääminen epäonnistui",
"Failed to connect to server": "Yhteyden muodostaminen palvelimeen epäonnistui",
"Failed to copy": "Failed to copy",
"Failed to delete": "Poistaminen epäonnistui",
"Failed to enable": "Käyttöön ottaminen epäonnistui",
"Failed to get TermsOfUse URL": "Käyttöehdot URL:n hakeminen epäonnistui",
@@ -305,6 +307,7 @@
"Favicon": "Sivuston ikoni",
"Favicon - Tooltip": "Favicon-kuvakkeen URL, jota käytetään kaikissa Casdoor-sivuissa organisaatiolle",
"First name": "Etunimi",
"First name - Tooltip": "The first name of user",
"Forced redirect origin - Tooltip": "Pakotettu uudelleenohjaus alkuperä - työkalupala",
"Forget URL": "Unohtamisen URL",
"Forget URL - Tooltip": "Mukautettu URL \"Unohtunut salasana\" -sivulle. Jos ei aseteta, käytetään oletusarvoista Casdoor \"Unohtunut salasana\" -sivua. Kun asetetaan, \"Unohtunut salasana\" -linkki kirjautumissivulla ohjaa tähän URL-osoitteeseen",
@@ -331,6 +334,7 @@
"Languages": "Kielet",
"Languages - Tooltip": "Saatavilla olevat kielet",
"Last name": "Sukunimi",
"Last name - Tooltip": "The last name of user",
"Later": "Myöhemmin",
"Logging & Auditing": "Kirjaaminen ja tarkastus",
"Login page": "Login page",
@@ -415,6 +419,7 @@
"SSH type - Tooltip": "SSH-yhteyden todennustyyppi",
"Save": "Tallenna",
"Save & Exit": "Tallenna ja poistu",
"Send": "Send",
"Session ID": "Istunnon tunniste",
"Sessions": "Istunnot",
"Shortcuts": "Pikakuvakkeet",
@@ -432,6 +437,7 @@
"State - Tooltip": "Tila ohje",
"Subscriptions": "Tilaukset",
"Successfully added": "Lisätty onnistuneesti",
"Successfully copied": "Successfully copied",
"Successfully deleted": "Poistettu onnistuneesti",
"Successfully removed": "Poistettu onnistuneesti",
"Successfully saved": "Tallennettu onnistuneesti",

View File

@@ -260,6 +260,7 @@
"Close": "Fermer",
"Confirm": "Confirmer",
"Copied to clipboard successfully": "Copié dans le presse-papiers avec succès",
"Copy": "Copy",
"Created time": "Date de création",
"Custom": "Personnalisé",
"Dashboard": "Tableau de bord",
@@ -294,6 +295,7 @@
"Enforcers": "Agents",
"Failed to add": "Échec d'ajout",
"Failed to connect to server": "Échec de la connexion au serveur",
"Failed to copy": "Failed to copy",
"Failed to delete": "Échec de la suppression",
"Failed to enable": "Échec de l'activation",
"Failed to get TermsOfUse URL": "Échec de récupération de l'URL des conditions d'utilisation",
@@ -305,6 +307,7 @@
"Favicon": "Favicon",
"Favicon - Tooltip": "L'URL de l'icône « favicon » utilisée dans toutes les pages Casdoor de l'organisation",
"First name": "Prénom",
"First name - Tooltip": "The first name of user",
"Forced redirect origin - Tooltip": "Origine de redirection forcée - Infobulle",
"Forget URL": "URL d'oubli",
"Forget URL - Tooltip": "URL personnalisée pour la page \"Mot de passe oublié\". Si elle n'est pas définie, la page par défaut \"Mot de passe oublié\" de Casdoor sera utilisée. Lorsqu'elle est définie, le lien \"Mot de passe oublié\" sur la page de connexion sera redirigé vers cette URL",
@@ -331,6 +334,7 @@
"Languages": "Langues",
"Languages - Tooltip": "Langues disponibles",
"Last name": "Nom de famille",
"Last name - Tooltip": "The last name of user",
"Later": "Plus tard",
"Logging & Auditing": "Journalisation et audit",
"Login page": "Login page",
@@ -415,6 +419,7 @@
"SSH type - Tooltip": "Type d'authentification de connexion SSH",
"Save": "Enregistrer",
"Save & Exit": "Enregistrer et quitter",
"Send": "Send",
"Session ID": "Identifiant de session",
"Sessions": "Sessions",
"Shortcuts": "Raccourcis",
@@ -432,6 +437,7 @@
"State - Tooltip": "État",
"Subscriptions": "Abonnements",
"Successfully added": "Ajouté avec succès",
"Successfully copied": "Successfully copied",
"Successfully deleted": "Supprimé avec succès",
"Successfully removed": "Supprimé avec succès",
"Successfully saved": "Enregistré avec succès",

View File

@@ -260,6 +260,7 @@
"Close": "סגור",
"Confirm": "אשר",
"Copied to clipboard successfully": "הועתק ללוח בהצלחה",
"Copy": "Copy",
"Created time": "זמן יצירה",
"Custom": "מותאם אישית",
"Dashboard": "לוח בקרה",
@@ -294,6 +295,7 @@
"Enforcers": "מפעילים",
"Failed to add": "הוספה נכשלה",
"Failed to connect to server": "התחברות לשרת נכשלה",
"Failed to copy": "Failed to copy",
"Failed to delete": "מחיקה נכשלה",
"Failed to enable": "הפעלה נכשלה",
"Failed to get TermsOfUse URL": "קבלת כתובת תנאי שימוש נכשלה",
@@ -305,6 +307,7 @@
"Favicon": "סמל אתר",
"Favicon - Tooltip": "כתובת סמל Favicon המשמש בכל דפי Casdoor של הארגון",
"First name": "שם פרטי",
"First name - Tooltip": "The first name of user",
"Forced redirect origin - Tooltip": "הפניה כפויה של מקור - תיאור",
"Forget URL": "כתובת שחזור סיסמה",
"Forget URL - Tooltip": "כתובת מותאמת אישית לדף \"שחזור סיסמה\". אם לא מוגדר, ישמש דף ברירת המחדל של Casdoor. כאשר מוגדר, קישורי \"שחזור סיסמה\" בעמוד הכניסה יופנו לכאן",
@@ -331,6 +334,7 @@
"Languages": "שפות",
"Languages - Tooltip": "שפות זמינות",
"Last name": "שם משפחה",
"Last name - Tooltip": "The last name of user",
"Later": "מאוחר יותר",
"Logging & Auditing": "רישום וביקורת",
"Login page": "Login page",
@@ -415,6 +419,7 @@
"SSH type - Tooltip": "סוג האימות של חיבור SSH",
"Save": "שמור",
"Save & Exit": "שמור וצא",
"Send": "Send",
"Session ID": "מזהה סשן",
"Sessions": "סשנים",
"Shortcuts": "קיצורי דרך",
@@ -432,6 +437,7 @@
"State - Tooltip": "מצב - תיאור",
"Subscriptions": "מנויים",
"Successfully added": "נוסף בהצלחה",
"Successfully copied": "Successfully copied",
"Successfully deleted": "נמחק בהצלחה",
"Successfully removed": "הוסר בהצלחה",
"Successfully saved": "נשמר בהצלחה",

View File

@@ -260,6 +260,7 @@
"Close": "Tutup",
"Confirm": "Konfirmasi",
"Copied to clipboard successfully": "Berhasil disalin ke papan klip",
"Copy": "Copy",
"Created time": "Waktu dibuat",
"Custom": "Khusus",
"Dashboard": "Dasbor",
@@ -294,6 +295,7 @@
"Enforcers": "Penegak",
"Failed to add": "Gagal menambahkan",
"Failed to connect to server": "Gagal terhubung ke server",
"Failed to copy": "Failed to copy",
"Failed to delete": "Gagal menghapus",
"Failed to enable": "Gagal mengaktifkan",
"Failed to get TermsOfUse URL": "Gagal mendapatkan URL Ketentuan Penggunaan",
@@ -305,6 +307,7 @@
"Favicon": "Favicon",
"Favicon - Tooltip": "URL ikon Favicon yang digunakan di semua halaman Casdoor organisasi",
"First name": "Nama depan",
"First name - Tooltip": "The first name of user",
"Forced redirect origin - Tooltip": "Asal pengalihan paksa - Tooltip",
"Forget URL": "Lupakan URL",
"Forget URL - Tooltip": "URL kustom untuk halaman \"Lupa kata sandi\". Jika tidak diatur, halaman \"Lupa kata sandi\" default Casdoor akan digunakan. Ketika diatur, tautan \"Lupa kata sandi\" pada halaman masuk akan diarahkan ke URL ini",
@@ -331,6 +334,7 @@
"Languages": "Bahasa-bahasa",
"Languages - Tooltip": "Bahasa yang tersedia",
"Last name": "Nama belakang",
"Last name - Tooltip": "The last name of user",
"Later": "Nanti",
"Logging & Auditing": "Pencatatan & Audit",
"Login page": "Login page",
@@ -415,6 +419,7 @@
"SSH type - Tooltip": "Tipe autentikasi koneksi SSH",
"Save": "Menyimpan",
"Save & Exit": "Simpan & Keluar",
"Send": "Send",
"Session ID": "ID sesi",
"Sessions": "Sesi-sesi",
"Shortcuts": "Pintasan",
@@ -432,6 +437,7 @@
"State - Tooltip": "Negara",
"Subscriptions": "Langganan",
"Successfully added": "Berhasil ditambahkan",
"Successfully copied": "Successfully copied",
"Successfully deleted": "Berhasil dihapus",
"Successfully removed": "Berhasil dihapus",
"Successfully saved": "Berhasil disimpan",

View File

@@ -260,6 +260,7 @@
"Close": "Chiudi",
"Confirm": "Conferma",
"Copied to clipboard successfully": "Copiato negli appunti con successo",
"Copy": "Copy",
"Created time": "Ora creazione",
"Custom": "Personalizzato",
"Dashboard": "Dashboard",
@@ -294,6 +295,7 @@
"Enforcers": "Enforcers",
"Failed to add": "Aggiunta fallita",
"Failed to connect to server": "Connessione al server fallita",
"Failed to copy": "Failed to copy",
"Failed to delete": "Eliminazione fallita",
"Failed to enable": "Impossibile abilitare",
"Failed to get TermsOfUse URL": "Impossibile ottenere l'URL dei Termini di utilizzo",
@@ -305,6 +307,7 @@
"Favicon": "Favicon",
"Favicon - Tooltip": "Icona favicon utilizzata in tutte le pagine di Casdoor dell'organizzazione",
"First name": "Nome",
"First name - Tooltip": "The first name of user",
"Forced redirect origin - Tooltip": "Origine reindirizzamento forzato - Tooltip",
"Forget URL": "URL recupero",
"Forget URL - Tooltip": "URL personalizzato per la pagina \"Recupera password\". Se non impostato, verrà utilizzata la pagina predefinita di Casdoor. Quando impostato, il link \"Recupera password\" nella pagina di accesso reindirizzerà a questo URL",
@@ -331,6 +334,7 @@
"Languages": "Lingue",
"Languages - Tooltip": "Lingue disponibili",
"Last name": "Cognome",
"Last name - Tooltip": "The last name of user",
"Later": "Più tardi",
"Logging & Auditing": "Registrazione e audit",
"Login page": "Login page",
@@ -415,6 +419,7 @@
"SSH type - Tooltip": "Tipo di autenticazione della connessione SSH",
"Save": "Salva",
"Save & Exit": "Salva e Esci",
"Send": "Send",
"Session ID": "ID sessione",
"Sessions": "Sessioni",
"Shortcuts": "Scorciatoie",
@@ -432,6 +437,7 @@
"State - Tooltip": "Stato",
"Subscriptions": "Abbonamenti",
"Successfully added": "Aggiunto con successo",
"Successfully copied": "Successfully copied",
"Successfully deleted": "Eliminato con successo",
"Successfully removed": "Rimosso con successo",
"Successfully saved": "Salvato con successo",

View File

@@ -260,6 +260,7 @@
"Close": "閉じる",
"Confirm": "確認",
"Copied to clipboard successfully": "クリップボードにコピーしました",
"Copy": "Copy",
"Created time": "作成された時間",
"Custom": "カスタム",
"Dashboard": "ダッシュボード",
@@ -294,6 +295,7 @@
"Enforcers": "エンフォーサー",
"Failed to add": "追加できませんでした",
"Failed to connect to server": "サーバーに接続できませんでした",
"Failed to copy": "Failed to copy",
"Failed to delete": "削除に失敗しました",
"Failed to enable": "有効化に失敗しました",
"Failed to get TermsOfUse URL": "利用規約URLの取得に失敗しました",
@@ -305,6 +307,7 @@
"Favicon": "ファビコン",
"Favicon - Tooltip": "組織のすべてのCasdoorページに使用されるFaviconアイコンのURL",
"First name": "名前",
"First name - Tooltip": "The first name of user",
"Forced redirect origin - Tooltip": "強制リダイレクトオリジン - ツールチップ",
"Forget URL": "URLを忘れてください",
"Forget URL - Tooltip": "「パスワードをお忘れの場合」ページのカスタムURL。未設定の場合、デフォルトのCasdoor「パスワードをお忘れの場合」ページが使用されます。設定された場合、ログインページの「パスワードをお忘れの場合」リンクはこのURLにリダイレクトされます",
@@ -331,6 +334,7 @@
"Languages": "言語",
"Languages - Tooltip": "利用可能な言語",
"Last name": "苗字",
"Last name - Tooltip": "The last name of user",
"Later": "後で",
"Logging & Auditing": "ログと監査",
"Login page": "Login page",
@@ -415,6 +419,7 @@
"SSH type - Tooltip": "SSH接続の認証タイプ",
"Save": "保存",
"Save & Exit": "保存して終了",
"Send": "Send",
"Session ID": "セッションID",
"Sessions": "セッションズ",
"Shortcuts": "ショートカット",
@@ -432,6 +437,7 @@
"State - Tooltip": "状態",
"Subscriptions": "サブスクリプション",
"Successfully added": "正常に追加されました",
"Successfully copied": "Successfully copied",
"Successfully deleted": "正常に削除されました",
"Successfully removed": "正常に削除されました",
"Successfully saved": "成功的に保存されました",

View File

@@ -260,6 +260,7 @@
"Close": "Жабу",
"Confirm": "Растау",
"Copied to clipboard successfully": "Алмасу буферіне сәтті көшірілді",
"Copy": "Copy",
"Created time": "Жасалған уақыт",
"Custom": "Теңшеу",
"Dashboard": "Басқару тақтасы",
@@ -294,6 +295,7 @@
"Enforcers": "Enforcer-лер",
"Failed to add": "Қосу сәтсіз аяқталды",
"Failed to connect to server": "Серверге қосылу сәтсіз аяқталды",
"Failed to copy": "Failed to copy",
"Failed to delete": "Жою сәтсіз аяқталды",
"Failed to enable": "Қосу сәтсіз аяқталды",
"Failed to get TermsOfUse URL": "Қолдану шарттары URL алу сәтсіз аяқталды",
@@ -305,6 +307,7 @@
"Favicon": "Вэб-сайт иконка",
"Favicon - Tooltip": "Ұйымның барлық Casdoor парақтарында қолданылатын favicon белгі URL",
"First name": "Аты",
"First name - Tooltip": "The first name of user",
"Forced redirect origin - Tooltip": "Мәжбүрлі қайта бағыттау бастапқысы - Қысқаша түсінік",
"Forget URL": "Парольді ұмыту URL",
"Forget URL - Tooltip": "\"Парольді ұмыту\" парағы үшін теңшеу URL. Орнатылмаған жағдайда әдепті Casdoor \"Парольді ұмыту\" парағы қолданылады. Орнатылған кезде кіру парағындағы \"Парольді ұмыту\" сілтемесі осы URL-ге қайта бағыттайды",
@@ -331,6 +334,7 @@
"Languages": "Тілдер",
"Languages - Tooltip": "Қол жетімді тілдер",
"Last name": "Тегі",
"Last name - Tooltip": "The last name of user",
"Later": "Кейінірек",
"Logging & Auditing": "Журналдау және аудит",
"Login page": "Login page",
@@ -415,6 +419,7 @@
"SSH type - Tooltip": "SSH қосылымының растау түрі",
"Save": "Сақтау",
"Save & Exit": "Сақтау және шығу",
"Send": "Send",
"Session ID": "Сессия ID",
"Sessions": "Сессиялар",
"Shortcuts": "Жылдам жолдар",
@@ -432,6 +437,7 @@
"State - Tooltip": "Күй",
"Subscriptions": "Жазылымдар",
"Successfully added": "Сәтті қосылды",
"Successfully copied": "Successfully copied",
"Successfully deleted": "Сәтті жойылды",
"Successfully removed": "Сәтті жойылды",
"Successfully saved": "Сәтті сақталды",

View File

@@ -260,6 +260,7 @@
"Close": "닫다",
"Confirm": "확인",
"Copied to clipboard successfully": "클립보드에 복사되었습니다.",
"Copy": "Copy",
"Created time": "작성한 시간",
"Custom": "사용자 정의",
"Dashboard": "대시보드",
@@ -294,6 +295,7 @@
"Enforcers": "엔포서",
"Failed to add": "추가하지 못했습니다",
"Failed to connect to server": "서버에 연결하지 못했습니다",
"Failed to copy": "Failed to copy",
"Failed to delete": "삭제에 실패했습니다",
"Failed to enable": "활성화 실패",
"Failed to get TermsOfUse URL": "이용약관 URL을 가져오지 못했습니다.",
@@ -305,6 +307,7 @@
"Favicon": "파비콘",
"Favicon - Tooltip": "조직의 모든 Casdoor 페이지에서 사용되는 Favicon 아이콘 URL",
"First name": "이름",
"First name - Tooltip": "The first name of user",
"Forced redirect origin - Tooltip": "강제 리다이렉트 출처 - 툴팁",
"Forget URL": "URL을 잊어버려라",
"Forget URL - Tooltip": "\"비밀번호를 잊어버렸을 경우\" 페이지에 대한 사용자 정의 URL. 설정되지 않은 경우 기본 Casdoor \"비밀번호를 잊어버렸을 경우\" 페이지가 사용됩니다. 설정된 경우 로그인 페이지의 \"비밀번호를 잊으셨나요?\" 링크는 이 URL로 리디렉션됩니다",
@@ -331,6 +334,7 @@
"Languages": "언어",
"Languages - Tooltip": "사용 가능한 언어",
"Last name": "성",
"Last name - Tooltip": "The last name of user",
"Later": "나중에",
"Logging & Auditing": "로깅 및 감사",
"Login page": "Login page",
@@ -415,6 +419,7 @@
"SSH type - Tooltip": "SSH 연결의 인증 유형",
"Save": "저장하다",
"Save & Exit": "저장하고 종료하기",
"Send": "Send",
"Session ID": "세션 ID",
"Sessions": "세션들",
"Shortcuts": "단축키",
@@ -432,6 +437,7 @@
"State - Tooltip": "국가",
"Subscriptions": "구독",
"Successfully added": "성공적으로 추가되었습니다",
"Successfully copied": "Successfully copied",
"Successfully deleted": "성공적으로 삭제되었습니다",
"Successfully removed": "성공적으로 제거되었습니다.",
"Successfully saved": "성공적으로 저장되었습니다",

View File

@@ -260,6 +260,7 @@
"Close": "Tutup",
"Confirm": "Sahkan",
"Copied to clipboard successfully": "Berjaya disalin ke papan klip",
"Copy": "Copy",
"Created time": "Masa dicipta",
"Custom": "Tersuai",
"Dashboard": "Papan Pemuka",
@@ -294,6 +295,7 @@
"Enforcers": "Penegak",
"Failed to add": "Gagal untuk tambah",
"Failed to connect to server": "Gagal untuk bersambung ke pelayan",
"Failed to copy": "Failed to copy",
"Failed to delete": "Gagal untuk padam",
"Failed to enable": "Gagal untuk dayakan",
"Failed to get TermsOfUse URL": "Gagal untuk dapatkan URL Terma Penggunaan",
@@ -305,6 +307,7 @@
"Favicon": "Ikon Laman",
"Favicon - Tooltip": "URL ikon favicon yang digunakan dalam semua halaman Casdoor organisasi",
"First name": "Nama pertama",
"First name - Tooltip": "The first name of user",
"Forced redirect origin - Tooltip": "Asal laluan paksa - Tooltip",
"Forget URL": "URL Lupa",
"Forget URL - Tooltip": "URL tersuai untuk halaman \"Lupa kata laluan\". Jika tidak ditetapkan, halaman lalai Casdoor \"Lupa kata laluan\" akan digunakan. Apabila ditetapkan, pautan \"Lupa kata laluan\" pada halaman log masuk akan laluan semula ke URL ini",
@@ -331,6 +334,7 @@
"Languages": "Bahasa",
"Languages - Tooltip": "Bahasa yang tersedia",
"Last name": "Nama terakhir",
"Last name - Tooltip": "The last name of user",
"Later": "Kemudian",
"Logging & Auditing": "Log & Audit",
"Login page": "Login page",
@@ -415,6 +419,7 @@
"SSH type - Tooltip": "Jenis auth sambungan SSH",
"Save": "Simpan",
"Save & Exit": "Simpan & Keluar",
"Send": "Send",
"Session ID": "ID Sesi",
"Sessions": "Sesi",
"Shortcuts": "Pintasan",
@@ -432,6 +437,7 @@
"State - Tooltip": "Negeri",
"Subscriptions": "Langganan",
"Successfully added": "Berjaya ditambah",
"Successfully copied": "Successfully copied",
"Successfully deleted": "Berjaya dipadam",
"Successfully removed": "Berjaya dibuang",
"Successfully saved": "Berjaya disimpan",

View File

@@ -260,6 +260,7 @@
"Close": "Sluiten",
"Confirm": "Bevestigen",
"Copied to clipboard successfully": "Succesvol gekopieerd naar klembord",
"Copy": "Copy",
"Created time": "Aanmaaktijd",
"Custom": "Aangepast",
"Dashboard": "Dashboard",
@@ -294,6 +295,7 @@
"Enforcers": "Enforcers",
"Failed to add": "Toevoegen mislukt",
"Failed to connect to server": "Verbinding met server mislukt",
"Failed to copy": "Failed to copy",
"Failed to delete": "Verwijderen mislukt",
"Failed to enable": "Inschakelen mislukt",
"Failed to get TermsOfUse URL": "Ophalen van Gebruiksvoorwaarden-URL mislukt",
@@ -305,6 +307,7 @@
"Favicon": "Favicon",
"Favicon - Tooltip": "Favicon-pictogram-URL die op alle Casdoor-pagina's van de organisatie wordt gebruikt",
"First name": "Voornaam",
"First name - Tooltip": "The first name of user",
"Forced redirect origin - Tooltip": "Geforceerde omleidingsbron - Tooltip",
"Forget URL": "Wachtwoordvergeten-URL",
"Forget URL - Tooltip": "Aangepaste URL voor de \"Wachtwoord vergeten\"-pagina. Indien niet ingesteld, wordt de standaard Casdoor \"Wachtwoord vergeten\"-pagina gebruikt. Wanneer ingesteld, verwijst de link op de inlogpagina naar deze URL",
@@ -331,6 +334,7 @@
"Languages": "Talen",
"Languages - Tooltip": "Beschikbare talen",
"Last name": "Achternaam",
"Last name - Tooltip": "The last name of user",
"Later": "Later",
"Logging & Auditing": "Logboekregistratie & Audit",
"Login page": "Login page",
@@ -415,6 +419,7 @@
"SSH type - Tooltip": "Het autorisatietype voor SSH-verbinding",
"Save": "Opslaan",
"Save & Exit": "Opslaan & Afsluiten",
"Send": "Send",
"Session ID": "Sessie-ID",
"Sessions": "Sessies",
"Shortcuts": "Snelkoppelingen",
@@ -432,6 +437,7 @@
"State - Tooltip": "Status",
"Subscriptions": "Abonnementen",
"Successfully added": "Succesvol toegevoegd",
"Successfully copied": "Successfully copied",
"Successfully deleted": "Succesvol verwijderd",
"Successfully removed": "Succesvol verwijderd",
"Successfully saved": "Succesvol opgeslagen",

View File

@@ -260,6 +260,7 @@
"Close": "Zamknij",
"Confirm": "Potwierdź",
"Copied to clipboard successfully": "Pomyślnie skopiowano do schowka",
"Copy": "Copy",
"Created time": "Czas utworzenia",
"Custom": "Niestandardowy",
"Dashboard": "Panel sterowania",
@@ -294,6 +295,7 @@
"Enforcers": "Egzekutory",
"Failed to add": "Nie udało się dodać",
"Failed to connect to server": "Nie udało się połączyć z serwerem",
"Failed to copy": "Failed to copy",
"Failed to delete": "Nie udało się usunąć",
"Failed to enable": "Nie udało się włączyć",
"Failed to get TermsOfUse URL": "Nie udało się pobrać URL regulaminu",
@@ -305,6 +307,7 @@
"Favicon": "Ikona strony",
"Favicon - Tooltip": "URL ikony favicon używanej na wszystkich stronach Casdoor organizacji",
"First name": "Imię",
"First name - Tooltip": "The first name of user",
"Forced redirect origin - Tooltip": "Wymuszone przekierowanie źródła - Tooltip",
"Forget URL": "URL odzyskiwania",
"Forget URL - Tooltip": "Niestandardowy URL strony \"Odzyskaj hasło\". Jeśli nie ustawiony, zostanie użyta domyślna strona \"Odzyskaj hasło\" Casdoor. Gdy ustawiony, link \"Odzyskaj hasło\" na stronie logowania przekieruje do tego URL-a",
@@ -331,6 +334,7 @@
"Languages": "Języki",
"Languages - Tooltip": "Dostępne języki",
"Last name": "Nazwisko",
"Last name - Tooltip": "The last name of user",
"Later": "Później",
"Logging & Auditing": "Logowanie i audyt",
"Login page": "Login page",
@@ -415,6 +419,7 @@
"SSH type - Tooltip": "Typ uwierzytelniania połączenia SSH",
"Save": "Zapisz",
"Save & Exit": "Zapisz i wyjdź",
"Send": "Send",
"Session ID": "ID sesji",
"Sessions": "Sesje",
"Shortcuts": "Skróty",
@@ -432,6 +437,7 @@
"State - Tooltip": "Stan",
"Subscriptions": "Subskrypcje",
"Successfully added": "Pomyślnie dodano",
"Successfully copied": "Successfully copied",
"Successfully deleted": "Pomyślnie usunięto",
"Successfully removed": "Pomyślnie usunięto",
"Successfully saved": "Pomyślnie zapisano",

View File

@@ -260,6 +260,7 @@
"Close": "Fechar",
"Confirm": "Confirmar",
"Copied to clipboard successfully": "Copiado para a área de transferência com sucesso",
"Copy": "Copy",
"Created time": "Hora de Criação",
"Custom": "Personalizado",
"Dashboard": "Painel",
@@ -294,6 +295,7 @@
"Enforcers": "Aplicadores",
"Failed to add": "Falha ao adicionar",
"Failed to connect to server": "Falha ao conectar ao servidor",
"Failed to copy": "Failed to copy",
"Failed to delete": "Falha ao excluir",
"Failed to enable": "Falha ao ativar",
"Failed to get TermsOfUse URL": "Falha ao obter URL dos Termos de Uso",
@@ -305,6 +307,7 @@
"Favicon": "Ícone do site",
"Favicon - Tooltip": "URL do ícone de favicon usado em todas as páginas do Casdoor da organização",
"First name": "Nome",
"First name - Tooltip": "The first name of user",
"Forced redirect origin - Tooltip": "Dica: origem de redirecionamento forçado",
"Forget URL": "URL de Esqueci a Senha",
"Forget URL - Tooltip": "URL personalizada para a página de \"Esqueci a senha\". Se não definido, será usada a página padrão de \"Esqueci a senha\" do Casdoor. Quando definido, o link de \"Esqueci a senha\" na página de login será redirecionado para esta URL",
@@ -331,6 +334,7 @@
"Languages": "Idiomas",
"Languages - Tooltip": "Idiomas disponíveis",
"Last name": "Sobrenome",
"Last name - Tooltip": "The last name of user",
"Later": "Depois",
"Logging & Auditing": "Registro e Auditoria",
"Login page": "Login page",
@@ -415,6 +419,7 @@
"SSH type - Tooltip": "Tipo de autenticação para conexão SSH",
"Save": "Salvar",
"Save & Exit": "Salvar e Sair",
"Send": "Send",
"Session ID": "ID da sessão",
"Sessions": "Sessões",
"Shortcuts": "Atalhos",
@@ -432,6 +437,7 @@
"State - Tooltip": "Estado",
"Subscriptions": "Đăng ký",
"Successfully added": "Adicionado com sucesso",
"Successfully copied": "Successfully copied",
"Successfully deleted": "Excluído com sucesso",
"Successfully removed": "Removido com sucesso",
"Successfully saved": "Salvo com sucesso",

View File

@@ -260,6 +260,7 @@
"Close": "Близко",
"Confirm": "Подтвердить",
"Copied to clipboard successfully": "Успешно скопировано в буфер обмена",
"Copy": "Copy",
"Created time": "Созданное время",
"Custom": "Пользовательский",
"Dashboard": "Панель управления",
@@ -294,6 +295,7 @@
"Enforcers": "Обеспечивающие компоненты",
"Failed to add": "Не удалось добавить",
"Failed to connect to server": "Не удалось подключиться к серверу",
"Failed to copy": "Failed to copy",
"Failed to delete": "Не удалось удалить",
"Failed to enable": "Не удалось включить",
"Failed to get TermsOfUse URL": "Не удалось получить URL условий использования",
@@ -305,6 +307,7 @@
"Favicon": "Фавикон",
"Favicon - Tooltip": "URL иконки Favicon, используемый на всех страницах организации Casdoor",
"First name": "Имя",
"First name - Tooltip": "The first name of user",
"Forced redirect origin - Tooltip": "Подсказка: принудительный редирект origin",
"Forget URL": "Забудьте URL",
"Forget URL - Tooltip": "Настроенный URL для страницы \"Забыли пароль\". Если не установлено, будет использоваться стандартная страница \"Забыли пароль\" Casdoor. При установке, ссылка \"Забыли пароль\" на странице входа будет перенаправляться на этот URL",
@@ -331,6 +334,7 @@
"Languages": "Языки",
"Languages - Tooltip": "Доступные языки",
"Last name": "Фамилия",
"Last name - Tooltip": "The last name of user",
"Later": "Позже",
"Logging & Auditing": "Логирование и аудит",
"Login page": "Login page",
@@ -415,6 +419,7 @@
"SSH type - Tooltip": "Тип аутентификации SSH-подключения",
"Save": "Сохранить",
"Save & Exit": "Сохранить и выйти",
"Send": "Send",
"Session ID": "Идентификатор сессии",
"Sessions": "Сессии",
"Shortcuts": "Ярлыки",
@@ -432,6 +437,7 @@
"State - Tooltip": "Государство",
"Subscriptions": "Подписки",
"Successfully added": "Успешно добавлено",
"Successfully copied": "Successfully copied",
"Successfully deleted": "Успешно удалено",
"Successfully removed": "Успешно удалено",
"Successfully saved": "Успешно сохранено",

View File

@@ -260,6 +260,7 @@
"Close": "Zavrieť",
"Confirm": "Potvrdiť",
"Copied to clipboard successfully": "Úspešne skopírované do schránky",
"Copy": "Copy",
"Created time": "Čas vytvorenia",
"Custom": "Vlastné",
"Dashboard": "Hlavná obrazovka",
@@ -294,6 +295,7 @@
"Enforcers": "Vynútitelia",
"Failed to add": "Neúspešne pridané",
"Failed to connect to server": "Nepodarilo sa pripojiť na server",
"Failed to copy": "Failed to copy",
"Failed to delete": "Neúspešne odstránené",
"Failed to enable": "Nepodarilo sa povoliť",
"Failed to get TermsOfUse URL": "Nepodarilo sa získať URL podmienok použitia",
@@ -305,6 +307,7 @@
"Favicon": "Ikona webu",
"Favicon - Tooltip": "URL ikony favicon používaná na všetkých stránkach Casdoor organizácie",
"First name": "Meno",
"First name - Tooltip": "The first name of user",
"Forced redirect origin - Tooltip": "Vynútený zdroj presmerovania - Nápoveda",
"Forget URL": "URL zabudnutia",
"Forget URL - Tooltip": "Vlastná URL pre stránku \"Zabudol som heslo\". Ak nie je nastavená, bude použitá predvolená stránka Casdoor \"Zabudol som heslo\". Po nastavení bude odkaz na stránke prihlásenia presmerovaný na túto URL",
@@ -331,6 +334,7 @@
"Languages": "Jazyky",
"Languages - Tooltip": "Dostupné jazyky",
"Last name": "Priezvisko",
"Last name - Tooltip": "The last name of user",
"Later": "Neskôr",
"Logging & Auditing": "Zaznamenávanie a audit",
"Login page": "Login page",
@@ -415,6 +419,7 @@
"SSH type - Tooltip": "Typ autentifikácie SSH pripojenia",
"Save": "Uložiť",
"Save & Exit": "Uložiť a ukončiť",
"Send": "Send",
"Session ID": "ID relácie",
"Sessions": "Relácie",
"Shortcuts": "Skratky",
@@ -432,6 +437,7 @@
"State - Tooltip": "Stav",
"Subscriptions": "Predplatné",
"Successfully added": "Úspešne pridané",
"Successfully copied": "Successfully copied",
"Successfully deleted": "Úspešne odstránené",
"Successfully removed": "Úspešne odstránené",
"Successfully saved": "Úspešne uložené",

View File

@@ -260,6 +260,7 @@
"Close": "Tutup",
"Confirm": "Sahkan",
"Copied to clipboard successfully": "Berjaya disalin ke papan klip",
"Copy": "Copy",
"Created time": "Masa dicipta",
"Custom": "Tersuai",
"Dashboard": "Papan Pemuka",
@@ -294,6 +295,7 @@
"Enforcers": "Penegak",
"Failed to add": "Gagal untuk tambah",
"Failed to connect to server": "Gagal untuk bersambung ke pelayan",
"Failed to copy": "Failed to copy",
"Failed to delete": "Gagal untuk padam",
"Failed to enable": "Gagal untuk dayakan",
"Failed to get TermsOfUse URL": "Gagal untuk dapatkan URL Terma Penggunaan",
@@ -305,6 +307,7 @@
"Favicon": "Favicon",
"Favicon - Tooltip": "URL ikon favicon yang digunakan dalam semua halaman Casdoor organisasi",
"First name": "Nama pertama",
"First name - Tooltip": "The first name of user",
"Forced redirect origin - Tooltip": "Asal laluan paksa - Tooltip",
"Forget URL": "URL Lupa",
"Forget URL - Tooltip": "URL tersuai untuk halaman \"Lupa kata laluan\". Jika tidak ditetapkan, halaman lalai Casdoor \"Lupa kata laluan\" akan digunakan. Apabila ditetapkan, pautan \"Lupa kata laluan\" pada halaman log masuk akan laluan semula ke URL ini",
@@ -331,6 +334,7 @@
"Languages": "Bahasa",
"Languages - Tooltip": "Bahasa yang tersedia",
"Last name": "Nama terakhir",
"Last name - Tooltip": "The last name of user",
"Later": "Kemudian",
"Logging & Auditing": "Log & Audit",
"Login page": "Login page",
@@ -415,6 +419,7 @@
"SSH type - Tooltip": "Jenis auth sambungan SSH",
"Save": "Simpan",
"Save & Exit": "Simpan & Keluar",
"Send": "Send",
"Session ID": "ID Sesi",
"Sessions": "Sesi",
"Shortcuts": "Pintasan",
@@ -432,6 +437,7 @@
"State - Tooltip": "Negeri",
"Subscriptions": "Langganan",
"Successfully added": "Berjaya ditambah",
"Successfully copied": "Successfully copied",
"Successfully deleted": "Berjaya dipadam",
"Successfully removed": "Berjaya dibuang",
"Successfully saved": "Berjaya disimpan",

View File

@@ -260,6 +260,7 @@
"Close": "Kapat",
"Confirm": "Onayla",
"Copied to clipboard successfully": "Panoya başarıyla kopyalandı",
"Copy": "Copy",
"Created time": "Oluşturma zamanı",
"Custom": "Özel",
"Dashboard": "Gösterge Paneli",
@@ -294,6 +295,7 @@
"Enforcers": "Zorlayıcılar",
"Failed to add": "Ekleme başarısız oldu.",
"Failed to connect to server": "Sunucuya bağlanılamıyor",
"Failed to copy": "Failed to copy",
"Failed to delete": "Silme başarısız oldu",
"Failed to enable": "Etkinleştirme başarısız",
"Failed to get TermsOfUse URL": "Kullanım Şartları URL'si alınamadı",
@@ -305,6 +307,7 @@
"Favicon": "Favicon",
"Favicon - Tooltip": "Organizasyonun tüm Casdoor sayfalarında kullanılan Favicon simgesi URL'si",
"First name": "İsim",
"First name - Tooltip": "The first name of user",
"Forced redirect origin - Tooltip": "Zorlanan yönlendirme kaynağı - Araç ipucu",
"Forget URL": "Unutma URL'si",
"Forget URL - Tooltip": "\"Parolayı unuttum\" sayfası için özel URL. Ayarlanmamışsa, varsayılan Casdoor \"Parolayı unuttum\" sayfası kullanılacaktır. Ayarlanırsa, giriş sayfasındaki \"Parolayı unuttum\" bağlantısı bu URL'ye yönlendirilecektir",
@@ -331,6 +334,7 @@
"Languages": "Diller",
"Languages - Tooltip": "Kullanılabilir diller",
"Last name": "Soyisim",
"Last name - Tooltip": "The last name of user",
"Later": "Sonra",
"Logging & Auditing": "Günlük ve Denetim",
"Login page": "Login page",
@@ -415,6 +419,7 @@
"SSH type - Tooltip": "SSH bağlantısının kimlik doğrulama türü",
"Save": "Kaydet",
"Save & Exit": "Kaydet ve Çık",
"Send": "Send",
"Session ID": "Oturum ID",
"Sessions": "Oturumlar",
"Shortcuts": "Kısayollar",
@@ -432,6 +437,7 @@
"State - Tooltip": "Durum",
"Subscriptions": "Abonelikler",
"Successfully added": "Başarıyla eklendi",
"Successfully copied": "Successfully copied",
"Successfully deleted": "Başarıyla silindi",
"Successfully removed": "Başarıyla kaldırıldı",
"Successfully saved": "Başarıyla kaydedildi",

View File

@@ -260,6 +260,7 @@
"Close": "Закрити",
"Confirm": "Підтвердити",
"Copied to clipboard successfully": "Успішно скопійовано в буфер обміну",
"Copy": "Copy",
"Created time": "Створений час",
"Custom": "Користувацький",
"Dashboard": "Панель приладів",
@@ -294,6 +295,7 @@
"Enforcers": "Силовики",
"Failed to add": "Не вдалося додати",
"Failed to connect to server": "Не вдалося підключитися до сервера",
"Failed to copy": "Failed to copy",
"Failed to delete": "Не вдалося видалити",
"Failed to enable": "Не вдалося ввімкнути",
"Failed to get TermsOfUse URL": "Не вдалося отримати URL-адресу TermsOfUse",
@@ -305,6 +307,7 @@
"Favicon": "Фавікон",
"Favicon - Tooltip": "URL-адреса піктограми Favicon, яка використовується на всіх сторінках Casdoor організації",
"First name": "Ім'я",
"First name - Tooltip": "The first name of user",
"Forced redirect origin - Tooltip": "Примусове джерело перенаправлення - підказка",
"Forget URL": "Забути URL",
"Forget URL - Tooltip": "Користувацька URL-адреса для сторінки \"Забути пароль\". ",
@@ -331,6 +334,7 @@
"Languages": "Мови",
"Languages - Tooltip": "Доступні мови",
"Last name": "Прізвище",
"Last name - Tooltip": "The last name of user",
"Later": "Пізніше",
"Logging & Auditing": "Лісозаготівля",
"Login page": "Login page",
@@ -415,6 +419,7 @@
"SSH type - Tooltip": "Тип авторизації підключення SSH",
"Save": "зберегти",
"Save & Exit": "зберегти",
"Send": "Send",
"Session ID": "Ідентифікатор сеансу",
"Sessions": "Сеанси",
"Shortcuts": "Ярлики",
@@ -432,6 +437,7 @@
"State - Tooltip": "Держава",
"Subscriptions": "Підписки",
"Successfully added": "Успішно додано",
"Successfully copied": "Successfully copied",
"Successfully deleted": "Успішно видалено",
"Successfully removed": "Успішно видалено",
"Successfully saved": "Успішно збережено",

View File

@@ -260,6 +260,7 @@
"Close": "Đóng lại",
"Confirm": "Xác nhận",
"Copied to clipboard successfully": "Sao chép vào bộ nhớ tạm thành công",
"Copy": "Copy",
"Created time": "Thời gian tạo",
"Custom": "Tùy chỉnh",
"Dashboard": "Bảng điều khiển",
@@ -294,6 +295,7 @@
"Enforcers": "Trình thực thi",
"Failed to add": "Không thể thêm được",
"Failed to connect to server": "Không thể kết nối đến máy chủ",
"Failed to copy": "Failed to copy",
"Failed to delete": "Không thể xoá",
"Failed to enable": "Bật thất bại",
"Failed to get TermsOfUse URL": "Lấy URL Điều khoản sử dụng thất bại",
@@ -305,6 +307,7 @@
"Favicon": "Biểu tượng trang",
"Favicon - Tooltip": "URL biểu tượng Favicon được sử dụng trong tất cả các trang của tổ chức Casdoor",
"First name": "Tên",
"First name - Tooltip": "The first name of user",
"Forced redirect origin - Tooltip": "Gợi ý nguồn chuyển hướng bắt buộc",
"Forget URL": "Quên URL",
"Forget URL - Tooltip": "Đường dẫn tùy chỉnh cho trang \"Quên mật khẩu\". Nếu không được thiết lập, trang \"Quên mật khẩu\" mặc định của Casdoor sẽ được sử dụng. Khi cài đặt, liên kết \"Quên mật khẩu\" trên trang đăng nhập sẽ chuyển hướng đến URL này",
@@ -331,6 +334,7 @@
"Languages": "Ngôn ngữ",
"Languages - Tooltip": "Ngôn ngữ hiện có",
"Last name": "Họ",
"Last name - Tooltip": "The last name of user",
"Later": "Để sau",
"Logging & Auditing": "Nhật ký & Kiểm toán",
"Login page": "Login page",
@@ -415,6 +419,7 @@
"SSH type - Tooltip": "Loại xác thực kết nối SSH",
"Save": "Lưu",
"Save & Exit": "Lưu và Thoát",
"Send": "Send",
"Session ID": "ID phiên làm việc",
"Sessions": "Phiên",
"Shortcuts": "Lối tắt",
@@ -432,6 +437,7 @@
"State - Tooltip": "Trạng thái",
"Subscriptions": "Đăng ký",
"Successfully added": "Đã thêm thành công",
"Successfully copied": "Successfully copied",
"Successfully deleted": "Đã xóa thành công",
"Successfully removed": "Đã xóa thành công",
"Successfully saved": "Thành công đã được lưu lại",

View File

@@ -260,6 +260,7 @@
"Close": "关闭",
"Confirm": "确认",
"Copied to clipboard successfully": "已成功复制到剪贴板",
"Copy": "复制",
"Created time": "创建时间",
"Custom": "自定义",
"Dashboard": "数据看板",
@@ -294,6 +295,7 @@
"Enforcers": "Casbin执行器",
"Failed to add": "添加失败",
"Failed to connect to server": "连接服务器失败",
"Failed to copy": "复制失败",
"Failed to delete": "删除失败",
"Failed to enable": "启用失败",
"Failed to get TermsOfUse URL": "获取TermsOfUse链接失败",
@@ -305,6 +307,7 @@
"Favicon": "组织Favicon",
"Favicon - Tooltip": "该组织所有Casdoor页面中所使用的Favicon图标URL",
"First name": "名字",
"First name - Tooltip": "用户的名字",
"Forced redirect origin - Tooltip": "Forced redirect origin - Tooltip",
"Forget URL": "忘记密码URL",
"Forget URL - Tooltip": "自定义忘记密码页面的URL不设置时采用Casdoor默认的忘记密码页面设置后Casdoor各类页面的忘记密码链接会跳转到该URL",
@@ -331,6 +334,7 @@
"Languages": "语言",
"Languages - Tooltip": "可选语言",
"Last name": "姓氏",
"Last name - Tooltip": "用户的姓氏",
"Later": "稍后",
"Logging & Auditing": "日志 & 审计",
"Login page": "登录页面",
@@ -415,6 +419,7 @@
"SSH type - Tooltip": "SSH连接的认证类型",
"Save": "保存",
"Save & Exit": "保存 & 退出",
"Send": "发送",
"Session ID": "会话ID",
"Sessions": "会话",
"Shortcuts": "快捷操作",
@@ -432,6 +437,7 @@
"State - Tooltip": "状态",
"Subscriptions": "订阅",
"Successfully added": "添加成功",
"Successfully copied": "复制成功",
"Successfully deleted": "删除成功",
"Successfully removed": "移除成功",
"Successfully saved": "保存成功",

View File

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