mirror of
https://github.com/casdoor/casdoor.git
synced 2025-07-16 19:13:51 +08:00
Compare commits
10 Commits
Author | SHA1 | Date | |
---|---|---|---|
a383af0ebc | |||
f02875e1b1 | |||
e2921419b9 | |||
42864700ec | |||
c1fe547939 | |||
267833d9f9 | |||
2d3d1167bb | |||
ef5abdfa8f | |||
580d43101e | |||
fdf2b880cb |
1
.github/workflows/build.yml
vendored
1
.github/workflows/build.yml
vendored
@ -86,7 +86,6 @@ jobs:
|
||||
uses: actions/checkout@v2
|
||||
with:
|
||||
fetch-depth: 0
|
||||
ref: master
|
||||
- name: Setup Node.js
|
||||
uses: actions/setup-node@v2
|
||||
with:
|
||||
|
@ -19,7 +19,6 @@ RUN apk add curl
|
||||
RUN apk add ca-certificates && update-ca-certificates
|
||||
|
||||
WORKDIR /
|
||||
COPY --from=BACK /go/src/casdoor/.git/refs/heads .git/refs/heads
|
||||
COPY --from=BACK /go/src/casdoor/server ./server
|
||||
COPY --from=BACK /go/src/casdoor/swagger ./swagger
|
||||
COPY --from=BACK /go/src/casdoor/conf/app.conf ./conf/app.conf
|
||||
@ -42,7 +41,6 @@ RUN apt update
|
||||
RUN apt install -y ca-certificates && update-ca-certificates
|
||||
|
||||
WORKDIR /
|
||||
COPY --from=BACK /go/src/casdoor/.git/refs/heads .git/refs/heads
|
||||
COPY --from=BACK /go/src/casdoor/server ./server
|
||||
COPY --from=BACK /go/src/casdoor/swagger ./swagger
|
||||
COPY --from=BACK /go/src/casdoor/docker-entrypoint.sh /docker-entrypoint.sh
|
||||
|
21
README.md
21
README.md
@ -8,7 +8,7 @@
|
||||
<img alt="docker pull casbin/casdoor" src="https://img.shields.io/docker/pulls/casbin/casdoor.svg">
|
||||
</a>
|
||||
<a href="https://github.com/casdoor/casdoor/actions/workflows/build.yml">
|
||||
<img alt="GitHub Workflow Status (branch)" src="https://github.com/casbin/jcasbin/workflows/build/badge.svg?style=flat-square">
|
||||
<img alt="GitHub Workflow Status (branch)" src="https://github.com/casdoor/casdoor/workflows/Build/badge.svg?style=flat-square">
|
||||
</a>
|
||||
<a href="https://github.com/casdoor/casdoor/releases/latest">
|
||||
<img alt="GitHub Release" src="https://img.shields.io/github/v/release/casbin/casdoor.svg">
|
||||
@ -42,65 +42,48 @@
|
||||
</a>
|
||||
</p>
|
||||
|
||||
|
||||
|
||||
## Online demo
|
||||
|
||||
- International: https://door.casdoor.org (read-only)
|
||||
- Asian mirror: https://door.casdoor.com (read-only)
|
||||
- Asian mirror: https://demo.casdoor.com (read-write, will restore for every 5 minutes)
|
||||
|
||||
|
||||
|
||||
## Documentation
|
||||
|
||||
- International: https://casdoor.org
|
||||
- Asian mirror: https://docs.casdoor.cn
|
||||
|
||||
|
||||
|
||||
## Install
|
||||
|
||||
- By source code: https://casdoor.org/docs/basic/server-installation
|
||||
- By Docker: https://casdoor.org/docs/basic/try-with-docker
|
||||
|
||||
|
||||
|
||||
## How to connect to Casdoor?
|
||||
|
||||
https://casdoor.org/docs/how-to-connect/overview
|
||||
|
||||
|
||||
|
||||
## Casdoor Public API
|
||||
|
||||
- Docs: https://casdoor.org/docs/basic/public-api
|
||||
- Swagger: https://door.casdoor.com/swagger
|
||||
|
||||
|
||||
|
||||
## Integrations
|
||||
|
||||
https://casdoor.org/docs/integration/apisix
|
||||
|
||||
|
||||
## How to contact?
|
||||
|
||||
- Gitter: https://gitter.im/casbin/casdoor
|
||||
- Forum: https://forum.casbin.com
|
||||
- Contact: https://tawk.to/chat/623352fea34c2456412b8c51/1fuc7od6e
|
||||
|
||||
|
||||
|
||||
## Contribute
|
||||
|
||||
For casdoor, if you have any questions, you can give Issues, or you can also directly start Pull Requests(but we recommend giving issues first to communicate with the community).
|
||||
|
||||
### I18n translation
|
||||
|
||||
If you are contributing to casdoor, please note that we use [Crowdin](https://crowdin.com/project/casdoor-site) as translating platform and i18next as translating tool. When you add some words using i18next in the ```web/``` directory, please remember to add what you have added to the ```web/src/locales/en/data.json``` file.
|
||||
|
||||
|
||||
If you are contributing to casdoor, please note that we use [Crowdin](https://crowdin.com/project/casdoor-site) as translating platform and i18next as translating tool. When you add some words using i18next in the `web/` directory, please remember to add what you have added to the `web/src/locales/en/data.json` file.
|
||||
|
||||
## License
|
||||
|
||||
|
@ -119,12 +119,7 @@ func (c *ApiController) GetUser() {
|
||||
user = object.GetUser(id)
|
||||
}
|
||||
|
||||
if user != nil {
|
||||
roles := object.GetRolesByUser(user.GetId())
|
||||
user.Roles = roles
|
||||
permissions := object.GetPermissionsByUser(user.GetId())
|
||||
user.Permissions = permissions
|
||||
}
|
||||
object.ExtendUserWithRolesAndPermissions(user)
|
||||
|
||||
c.Data["json"] = object.GetMaskedUser(user)
|
||||
c.ServeJSON()
|
||||
|
70
deployment/deploy.go
Normal file
70
deployment/deploy.go
Normal file
@ -0,0 +1,70 @@
|
||||
// Copyright 2022 The Casdoor Authors. All Rights Reserved.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
package deployment
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"os"
|
||||
"strings"
|
||||
|
||||
"github.com/casdoor/casdoor/object"
|
||||
"github.com/casdoor/casdoor/storage"
|
||||
"github.com/casdoor/casdoor/util"
|
||||
"github.com/casdoor/oss"
|
||||
)
|
||||
|
||||
func deployStaticFiles(provider *object.Provider) {
|
||||
storageProvider := storage.GetStorageProvider(provider.Type, provider.ClientId, provider.ClientSecret, provider.RegionId, provider.Bucket, provider.Endpoint)
|
||||
if storageProvider == nil {
|
||||
panic(fmt.Sprintf("the provider type: %s is not supported", provider.Type))
|
||||
}
|
||||
|
||||
uploadFolder(storageProvider, "js")
|
||||
uploadFolder(storageProvider, "css")
|
||||
updateHtml(provider.Domain)
|
||||
}
|
||||
|
||||
func uploadFolder(storageProvider oss.StorageInterface, folder string) {
|
||||
path := fmt.Sprintf("../web/build/static/%s/", folder)
|
||||
filenames := util.ListFiles(path)
|
||||
|
||||
for _, filename := range filenames {
|
||||
if !strings.HasSuffix(filename, folder) {
|
||||
continue
|
||||
}
|
||||
|
||||
file, err := os.Open(path + filename)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
objectKey := fmt.Sprintf("static/%s/%s", folder, filename)
|
||||
_, err = storageProvider.Put(objectKey, file)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
fmt.Printf("Uploaded [%s] to [%s]\n", path, objectKey)
|
||||
}
|
||||
}
|
||||
|
||||
func updateHtml(domainPath string) {
|
||||
htmlPath := "../web/build/index.html"
|
||||
html := util.ReadStringFromPath(htmlPath)
|
||||
html = strings.Replace(html, "\"/static/", fmt.Sprintf("\"%s", domainPath), -1)
|
||||
util.WriteStringToPath(html, htmlPath)
|
||||
|
||||
fmt.Printf("Updated HTML to [%s]\n", html)
|
||||
}
|
29
deployment/deploy_test.go
Normal file
29
deployment/deploy_test.go
Normal file
@ -0,0 +1,29 @@
|
||||
// Copyright 2022 The Casdoor Authors. All Rights Reserved.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
//go:build !skipCi
|
||||
// +build !skipCi
|
||||
|
||||
package deployment
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/casdoor/casdoor/object"
|
||||
)
|
||||
|
||||
func TestDeployStaticFiles(t *testing.T) {
|
||||
provider := object.GetProvider("admin/provider_storage_aliyun_oss")
|
||||
deployStaticFiles(provider)
|
||||
}
|
@ -73,6 +73,10 @@ func (application *Application) IsSignupItemRequired(itemName string) bool {
|
||||
return signupItem.Required
|
||||
}
|
||||
|
||||
func (si *SignupItem) isSignupItemPrompted() bool {
|
||||
return si.Visible && si.Prompted
|
||||
}
|
||||
|
||||
func (application *Application) GetSignupItemRule(itemName string) string {
|
||||
signupItem := application.getSignupItem(itemName)
|
||||
if signupItem == nil {
|
||||
@ -92,6 +96,16 @@ func (application *Application) getAllPromptedProviderItems() []*ProviderItem {
|
||||
return res
|
||||
}
|
||||
|
||||
func (application *Application) getAllPromptedSignupItems() []*SignupItem {
|
||||
res := []*SignupItem{}
|
||||
for _, signupItem := range application.SignupItems {
|
||||
if signupItem.isSignupItemPrompted() {
|
||||
res = append(res, signupItem)
|
||||
}
|
||||
}
|
||||
return res
|
||||
}
|
||||
|
||||
func (application *Application) isAffiliationPrompted() bool {
|
||||
signupItem := application.getSignupItem("Affiliation")
|
||||
if signupItem == nil {
|
||||
@ -107,5 +121,10 @@ func (application *Application) HasPromptPage() bool {
|
||||
return true
|
||||
}
|
||||
|
||||
signupItems := application.getAllPromptedSignupItems()
|
||||
if len(signupItems) != 0 {
|
||||
return true
|
||||
}
|
||||
|
||||
return application.isAffiliationPrompted()
|
||||
}
|
||||
|
@ -287,6 +287,7 @@ func GetOAuthCode(userId string, clientId string, responseType string, redirectU
|
||||
}
|
||||
}
|
||||
|
||||
ExtendUserWithRolesAndPermissions(user)
|
||||
accessToken, refreshToken, tokenName, err := generateJwtToken(application, user, nonce, scope, host)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
@ -421,6 +422,7 @@ func RefreshToken(grantType string, refreshToken string, scope string, clientId
|
||||
}
|
||||
}
|
||||
|
||||
ExtendUserWithRolesAndPermissions(user)
|
||||
newAccessToken, newRefreshToken, tokenName, err := generateJwtToken(application, user, "", scope, host)
|
||||
if err != nil {
|
||||
return &TokenError{
|
||||
@ -571,6 +573,7 @@ func GetPasswordToken(application *Application, username string, password string
|
||||
}
|
||||
}
|
||||
|
||||
ExtendUserWithRolesAndPermissions(user)
|
||||
accessToken, refreshToken, tokenName, err := generateJwtToken(application, user, "", scope, host)
|
||||
if err != nil {
|
||||
return nil, &TokenError{
|
||||
@ -640,6 +643,7 @@ func GetClientCredentialsToken(application *Application, clientSecret string, sc
|
||||
// GetTokenByUser
|
||||
// Implicit flow
|
||||
func GetTokenByUser(application *Application, user *User, scope string, host string) (*Token, error) {
|
||||
ExtendUserWithRolesAndPermissions(user)
|
||||
accessToken, refreshToken, tokenName, err := generateJwtToken(application, user, "", scope, host)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
@ -726,6 +730,7 @@ func GetWechatMiniProgramToken(application *Application, code string, host strin
|
||||
AddUser(user)
|
||||
}
|
||||
|
||||
ExtendUserWithRolesAndPermissions(user)
|
||||
accessToken, refreshToken, tokenName, err := generateJwtToken(application, user, "", "", host)
|
||||
if err != nil {
|
||||
return nil, &TokenError{
|
||||
|
@ -566,3 +566,12 @@ func (user *User) GetId() string {
|
||||
func isUserIdGlobalAdmin(userId string) bool {
|
||||
return strings.HasPrefix(userId, "built-in/")
|
||||
}
|
||||
|
||||
func ExtendUserWithRolesAndPermissions(user *User) {
|
||||
if user == nil {
|
||||
return
|
||||
}
|
||||
|
||||
user.Roles = GetRolesByUser(user.GetId())
|
||||
user.Permissions = GetPermissionsByUser(user.GetId())
|
||||
}
|
||||
|
@ -51,11 +51,11 @@ func SendVerificationCodeToEmail(organization *Organization, user *User, provide
|
||||
// "You have requested a verification code at Casdoor. Here is your code: %s, please enter in 5 minutes."
|
||||
content := fmt.Sprintf(provider.Content, code)
|
||||
|
||||
if err := AddToVerificationRecord(user, provider, remoteAddr, provider.Category, dest, code); err != nil {
|
||||
if err := SendEmail(provider, title, content, dest, sender); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return SendEmail(provider, title, content, dest, sender)
|
||||
return AddToVerificationRecord(user, provider, remoteAddr, provider.Category, dest, code)
|
||||
}
|
||||
|
||||
func SendVerificationCodeToPhone(organization *Organization, user *User, provider *Provider, remoteAddr string, dest string) error {
|
||||
@ -64,11 +64,11 @@ func SendVerificationCodeToPhone(organization *Organization, user *User, provide
|
||||
}
|
||||
|
||||
code := getRandomCode(5)
|
||||
if err := AddToVerificationRecord(user, provider, remoteAddr, provider.Category, dest, code); err != nil {
|
||||
if err := SendSms(provider, code, dest); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return SendSms(provider, code, dest)
|
||||
return AddToVerificationRecord(user, provider, remoteAddr, provider.Category, dest, code)
|
||||
}
|
||||
|
||||
func AddToVerificationRecord(user *User, provider *Provider, remoteAddr, recordType, dest, code string) error {
|
||||
|
18
util/path.go
18
util/path.go
@ -16,6 +16,7 @@ package util
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"io/ioutil"
|
||||
"net/url"
|
||||
"os"
|
||||
"path/filepath"
|
||||
@ -43,6 +44,23 @@ func EnsureFileFolderExists(path string) {
|
||||
}
|
||||
}
|
||||
|
||||
func ListFiles(path string) []string {
|
||||
res := []string{}
|
||||
|
||||
files, err := ioutil.ReadDir(path)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
for _, f := range files {
|
||||
if !f.IsDir() {
|
||||
res = append(res, f.Name())
|
||||
}
|
||||
}
|
||||
|
||||
return res
|
||||
}
|
||||
|
||||
func RemoveExt(filename string) string {
|
||||
return filename[:len(filename)-len(filepath.Ext(filename))]
|
||||
}
|
||||
|
@ -89,6 +89,7 @@ export const ResetModal = (props) => {
|
||||
textBefore={i18next.t("code:Code You Received")}
|
||||
onChange={setCode}
|
||||
onButtonClickArgs={[dest, destType, Setting.getApplicationName(application)]}
|
||||
application={application}
|
||||
/>
|
||||
</Row>
|
||||
</Col>
|
||||
|
@ -15,12 +15,13 @@
|
||||
import React from "react";
|
||||
import * as Setting from "./Setting";
|
||||
import {Dropdown, Menu} from "antd";
|
||||
import {createFromIconfontCN} from "@ant-design/icons";
|
||||
import "./App.less";
|
||||
|
||||
const IconFont = createFromIconfontCN({
|
||||
scriptUrl: "//at.alicdn.com/t/font_2680620_ffij16fkwdg.js",
|
||||
});
|
||||
function flagIcon(country, alt) {
|
||||
return (
|
||||
<img width={24} alt={alt} src={`${Setting.StaticBaseUrl}/flag-icons/${country}.svg`} />
|
||||
);
|
||||
}
|
||||
|
||||
class SelectLanguageBox extends React.Component {
|
||||
constructor(props) {
|
||||
@ -35,13 +36,14 @@ class SelectLanguageBox extends React.Component {
|
||||
<Menu onClick={(e) => {
|
||||
Setting.changeLanguage(e.key);
|
||||
}}>
|
||||
<Menu.Item key="en" icon={<IconFont type="icon-en" />}>English</Menu.Item>
|
||||
<Menu.Item key="zh" icon={<IconFont type="icon-zh" />}>简体中文</Menu.Item>
|
||||
<Menu.Item key="fr" icon={<IconFont type="icon-fr" />}>Français</Menu.Item>
|
||||
<Menu.Item key="de" icon={<IconFont type="icon-de" />}>Deutsch</Menu.Item>
|
||||
<Menu.Item key="ja" icon={<IconFont type="icon-ja" />}>日本語</Menu.Item>
|
||||
<Menu.Item key="ko" icon={<IconFont type="icon-ko" />}>한국어</Menu.Item>
|
||||
<Menu.Item key="ru" icon={<IconFont type="icon-ru" />}>Русский</Menu.Item>
|
||||
<Menu.Item key="en" icon={flagIcon("US", "English")}>English</Menu.Item>
|
||||
<Menu.Item key="es" icon={flagIcon("ES", "Español")}>Español</Menu.Item>
|
||||
<Menu.Item key="zh" icon={flagIcon("CN", "简体中文")}>简体中文</Menu.Item>
|
||||
<Menu.Item key="fr" icon={flagIcon("FR", "Français")}>Français</Menu.Item>
|
||||
<Menu.Item key="de" icon={flagIcon("DE", "Deutsch")}>Deutsch</Menu.Item>
|
||||
<Menu.Item key="ja" icon={flagIcon("JP", "日本語")}>日本語</Menu.Item>
|
||||
<Menu.Item key="ko" icon={flagIcon("KR", "한국어")}>한국어</Menu.Item>
|
||||
<Menu.Item key="ru" icon={flagIcon("RU", "Русский")}>Русский</Menu.Item>
|
||||
</Menu>
|
||||
);
|
||||
|
||||
|
@ -353,11 +353,13 @@ class ForgetPage extends React.Component {
|
||||
<CountDownInput
|
||||
disabled={this.state.username === "" || this.state.verifyType === ""}
|
||||
onButtonClickArgs={[this.state.email, "email", Setting.getApplicationName(this.state.application), this.state.name]}
|
||||
application={application}
|
||||
/>
|
||||
) : (
|
||||
<CountDownInput
|
||||
disabled={this.state.username === "" || this.state.verifyType === ""}
|
||||
onButtonClickArgs={[this.state.phone, "phone", Setting.getApplicationName(this.state.application), this.state.name]}
|
||||
application={application}
|
||||
/>
|
||||
)}
|
||||
</Form.Item>
|
||||
|
@ -505,6 +505,10 @@ class LoginPage extends React.Component {
|
||||
|
||||
renderSignedInBox() {
|
||||
if (this.props.account === undefined || this.props.account === null) {
|
||||
if (window !== window.parent) {
|
||||
const message = {tag: "Casdoor", type: "SilentSignin", data: "user-not-logged-in"};
|
||||
window.parent.postMessage(message, "*");
|
||||
}
|
||||
return null;
|
||||
}
|
||||
const application = this.getApplicationObj();
|
||||
@ -621,6 +625,7 @@ class LoginPage extends React.Component {
|
||||
<CountDownInput
|
||||
disabled={this.state.username?.length === 0 || !this.state.validEmailOrPhone}
|
||||
onButtonClickArgs={[this.state.username, this.state.validEmail ? "email" : "phone", Setting.getApplicationName(application)]}
|
||||
application={application}
|
||||
/>
|
||||
</Form.Item>
|
||||
) : (
|
||||
|
@ -360,6 +360,7 @@ class SignupPage extends React.Component {
|
||||
<CountDownInput
|
||||
disabled={!this.state.validEmail}
|
||||
onButtonClickArgs={[this.state.email, "email", Setting.getApplicationName(application)]}
|
||||
application={application}
|
||||
/>
|
||||
</Form.Item>
|
||||
}
|
||||
@ -412,6 +413,7 @@ class SignupPage extends React.Component {
|
||||
<CountDownInput
|
||||
disabled={!this.state.validPhone}
|
||||
onButtonClickArgs={[this.state.phone, "phone", Setting.getApplicationName(application)]}
|
||||
application={application}
|
||||
/>
|
||||
</Form.Item>
|
||||
</React.Fragment>
|
||||
|
@ -27,15 +27,23 @@ class SingleCard extends React.Component {
|
||||
};
|
||||
}
|
||||
|
||||
wrappedAsSilentSigninLink(link) {
|
||||
if (link.startsWith("http")) {
|
||||
link += link.includes("?") ? "&silentSignin=1" : "?silentSignin=1";
|
||||
}
|
||||
return link;
|
||||
}
|
||||
|
||||
renderCardMobile(logo, link, title, desc, time, isSingle) {
|
||||
const gridStyle = {
|
||||
width: "100vw",
|
||||
textAlign: "center",
|
||||
cursor: "pointer",
|
||||
};
|
||||
const silentSigninLink = this.wrappedAsSilentSigninLink(link);
|
||||
|
||||
return (
|
||||
<Card.Grid style={gridStyle} onClick={() => Setting.goToLinkSoft(this, link)}>
|
||||
<Card.Grid style={gridStyle} onClick={() => Setting.goToLinkSoft(this, silentSigninLink)}>
|
||||
<img src={logo} alt="logo" height={60} style={{marginBottom: "20px"}} />
|
||||
<Meta
|
||||
title={title}
|
||||
@ -46,6 +54,8 @@ class SingleCard extends React.Component {
|
||||
}
|
||||
|
||||
renderCard(logo, link, title, desc, time, isSingle) {
|
||||
const silentSigninLink = this.wrappedAsSilentSigninLink(link);
|
||||
|
||||
return (
|
||||
<Col style={{paddingLeft: "20px", paddingRight: "20px", paddingBottom: "20px", marginBottom: "20px"}} span={6}>
|
||||
<Card
|
||||
@ -53,7 +63,7 @@ class SingleCard extends React.Component {
|
||||
cover={
|
||||
<img alt="logo" src={logo} style={{width: "100%", height: "210px", objectFit: "scale-down"}} />
|
||||
}
|
||||
onClick={() => Setting.goToLinkSoft(this, link)}
|
||||
onClick={() => Setting.goToLinkSoft(this, silentSigninLink)}
|
||||
style={isSingle ? {width: "320px"} : {width: "100%"}}
|
||||
>
|
||||
<Meta title={title} description={desc} />
|
||||
|
@ -17,13 +17,12 @@ import React from "react";
|
||||
import i18next from "i18next";
|
||||
import * as UserBackend from "../backend/UserBackend";
|
||||
import {SafetyOutlined} from "@ant-design/icons";
|
||||
import {authConfig} from "../auth/Auth";
|
||||
import {CaptchaWidget} from "./CaptchaWidget";
|
||||
|
||||
const {Search} = Input;
|
||||
|
||||
export const CountDownInput = (props) => {
|
||||
const {disabled, textBefore, onChange, onButtonClickArgs} = props;
|
||||
const {disabled, textBefore, onChange, onButtonClickArgs, application} = props;
|
||||
const [visible, setVisible] = React.useState(false);
|
||||
const [key, setKey] = React.useState("");
|
||||
const [captchaImg, setCaptchaImg] = React.useState("");
|
||||
@ -69,7 +68,7 @@ export const CountDownInput = (props) => {
|
||||
};
|
||||
|
||||
const loadCaptcha = () => {
|
||||
UserBackend.getCaptcha("admin", authConfig.appName, false).then(res => {
|
||||
UserBackend.getCaptcha(application.owner, application.name, false).then(res => {
|
||||
if (res.type === "none") {
|
||||
UserBackend.sendCode("none", "", "", ...onButtonClickArgs).then(res => {
|
||||
if (res) {
|
||||
|
@ -20,11 +20,13 @@ import de from "./locales/de/data.json";
|
||||
import ko from "./locales/ko/data.json";
|
||||
import ru from "./locales/ru/data.json";
|
||||
import ja from "./locales/ja/data.json";
|
||||
import es from "./locales/es/data.json";
|
||||
import * as Conf from "./Conf";
|
||||
import * as Setting from "./Setting";
|
||||
|
||||
const resources = {
|
||||
en: en,
|
||||
es: es,
|
||||
zh: zh,
|
||||
fr: fr,
|
||||
de: de,
|
||||
|
685
web/src/locales/es/data.json
Normal file
685
web/src/locales/es/data.json
Normal file
@ -0,0 +1,685 @@
|
||||
{
|
||||
"account": {
|
||||
"Login": "Iniciar sesión",
|
||||
"Logout": "Cerrar sesión",
|
||||
"My Account": "Mi cuenta",
|
||||
"Sign Up": "Registrarme"
|
||||
},
|
||||
"application": {
|
||||
"Copy SAML metadata URL": "Copiar SAML metadata URL",
|
||||
"Copy prompt page URL": "Copy prompt page URL",
|
||||
"Copy signin page URL": "Copiar URL de inicio de sesión",
|
||||
"Copy signup page URL": "Copiar URL de registro de usuarios",
|
||||
"Edit Application": "Editar Aplicación",
|
||||
"Enable SAML compress": "Habilitar compresión SAML",
|
||||
"Enable SAML compress - Tooltip": "Habilitar compresión SAML - Tooltip",
|
||||
"Enable WebAuthn signin": "Habilitar inicio de sesión de WebAuthn",
|
||||
"Enable WebAuthn signin - Tooltip": "Habilitar inicio de sesión de WebAuthn - Tooltip",
|
||||
"Enable code signin": "Habilitar inicio de sesión por código",
|
||||
"Enable code signin - Tooltip": "Habilitar inicio de sesión por código - Tooltip",
|
||||
"Enable signin session - Tooltip": "Enable signin session - Tooltip",
|
||||
"Enable signup": "Habilitar nuevos registros",
|
||||
"Enable signup - Tooltip": "Habilitar nuevos registros - Tooltip",
|
||||
"File uploaded successfully": "El archivo ha sido subido con éxito",
|
||||
"Grant types": "Grant types",
|
||||
"Grant types - Tooltip": "Grant types - Tooltip",
|
||||
"New Application": "Nueva Aplicación",
|
||||
"Password ON": "Constraseña ON",
|
||||
"Password ON - Tooltip": "Constraseña ON - Tooltip",
|
||||
"Please select a HTML file": "Seleccione un archivo HTML",
|
||||
"Prompt page URL copied to clipboard successfully, please paste it into the incognito window or another browser": "Prompt page URL copied to clipboard successfully, please paste it into the incognito window or another browser",
|
||||
"Redirect URL": "URL de redirección",
|
||||
"Redirect URLs": "URLs de redirección",
|
||||
"Redirect URLs - Tooltip": "URL de redirección - Tooltip",
|
||||
"Refresh token expire": "Expiración del Refresh Token",
|
||||
"Refresh token expire - Tooltip": "Expiración del Refresh Token - Tooltip",
|
||||
"SAML metadata": "SAML metadata",
|
||||
"SAML metadata - Tooltip": "SAML metadata - Tooltip",
|
||||
"SAML metadata URL copied to clipboard successfully": "SAML metadata URL copiado al portapapeles con éxito",
|
||||
"Signin page URL copied to clipboard successfully, please paste it into the incognito window or another browser": "Signin page URL copied to clipboard successfully, please paste it into the incognito window or another browser",
|
||||
"Signin session": "Signin session",
|
||||
"Signup items": "Signup items",
|
||||
"Signup items - Tooltip": "Signup items - Tooltip",
|
||||
"Signup page URL copied to clipboard successfully, please paste it into the incognito window or another browser": "Signup page URL copied to clipboard successfully, please paste it into the incognito window or another browser",
|
||||
"Token expire": "Expiración del Token",
|
||||
"Token expire - Tooltip": "Expiración del Token - Tooltip",
|
||||
"Token format": "Formato del Token",
|
||||
"Token format - Tooltip": "Formato del Token - Tooltip",
|
||||
"rule": "rule"
|
||||
},
|
||||
"cert": {
|
||||
"Bit size": "Tamaño del Bit",
|
||||
"Bit size - Tooltip": "Tamaño del Bit - Tooltip",
|
||||
"Certificate": "Certificado",
|
||||
"Certificate - Tooltip": "Certificado - Tooltip",
|
||||
"Certificate copied to clipboard successfully": "Certificado copiado al portapapeles con éxito",
|
||||
"Copy certificate": "Copiar certificado",
|
||||
"Copy private key": "Copiar clave privada",
|
||||
"Crypto algorithm": "Algoritmo criptográfico",
|
||||
"Crypto algorithm - Tooltip": "Algoritmo criptográfico - Tooltip",
|
||||
"Download certificate": "Descargar certificado",
|
||||
"Download private key": "Descargar clave privada",
|
||||
"Edit Cert": "Editar certificado",
|
||||
"Expire in years": "Expiración en años",
|
||||
"Expire in years - Tooltip": "Expiración en años - Tooltip",
|
||||
"New Cert": "Nuevo certificado",
|
||||
"Private key": "Clave privada",
|
||||
"Private key - Tooltip": "Clave privada - Tooltip",
|
||||
"Private key copied to clipboard successfully": "Clave privada copiada al portapapeles con éxito",
|
||||
"Scope": "Alcance",
|
||||
"Scope - Tooltip": "Alcance - Tooltip",
|
||||
"Type": "Tipo",
|
||||
"Type - Tooltip": "Tipo - Tooltip"
|
||||
},
|
||||
"code": {
|
||||
"Code You Received": "Código que recibiste",
|
||||
"Email code": "Código de Email",
|
||||
"Empty Code": "Código requerido",
|
||||
"Enter your code": "Ingrese su código",
|
||||
"Phone code": "Código de teléfono",
|
||||
"Please input your phone verification code!": "Ingrese su código de verificación teléfonico!",
|
||||
"Please input your verification code!": "Ingrese su código de verificación!",
|
||||
"Send Code": "Enviar código",
|
||||
"Sending Code": "Enviando código",
|
||||
"Submit and complete": "Enviar y completar"
|
||||
},
|
||||
"forget": {
|
||||
"Account": "Cuenta",
|
||||
"Change Password": "Cambiar contraseña",
|
||||
"Choose email or phone": "Elige email o teléfono",
|
||||
"Confirm": "Confirmar",
|
||||
"Next Step": "Siguiente paso",
|
||||
"Password": "Contraseña",
|
||||
"Please input your username!": "Por favor ingrese su nombre de usuario!",
|
||||
"Reset": "Reiniciar",
|
||||
"Retrieve password": "Recuperar Contraseña",
|
||||
"Unknown forget type": "Tipo de olvido desconocido",
|
||||
"Verify": "Verificar"
|
||||
},
|
||||
"general": {
|
||||
"Action": "Acción",
|
||||
"Adapter": "Adaptador",
|
||||
"Adapter - Tooltip": "Adaptador - Tooltip",
|
||||
"Add": "Agregar",
|
||||
"Affiliation URL": "URL de Afiliación",
|
||||
"Affiliation URL - Tooltip": "URL de Afiliación - Tooltip",
|
||||
"Application": "Aplicación",
|
||||
"Applications": "Aplicaciones",
|
||||
"Applications that require authentication": "Aplicaciones que requieren autenticación",
|
||||
"Avatar": "Avatar",
|
||||
"Avatar - Tooltip": "Avatar - Tooltip",
|
||||
"Back Home": "Volver al inicio",
|
||||
"Cancel": "Cancelar",
|
||||
"Captcha": "Captcha",
|
||||
"Cert": "Certificado",
|
||||
"Cert - Tooltip": "Certificado - Tooltip",
|
||||
"Certs": "Certificados",
|
||||
"Click to Upload": "Click para subir archivo",
|
||||
"Client IP": "IP del Cliente",
|
||||
"Created time": "Fecha de creación",
|
||||
"Default avatar": "Avatar por defecto",
|
||||
"Default avatar - Tooltip": "Avatar por defecto - Tooltip",
|
||||
"Delete": "Eliminar",
|
||||
"Description": "Descripción",
|
||||
"Description - Tooltip": "Descripción - Tooltip",
|
||||
"Display name": "Apodo",
|
||||
"Display name - Tooltip": "Apodo - Tooltip",
|
||||
"Down": "Bajar",
|
||||
"Edit": "Editar",
|
||||
"Email": "Email",
|
||||
"Email - Tooltip": "Email - Tooltip",
|
||||
"Favicon": "Favicon",
|
||||
"Favicon - Tooltip": "Favicon - Tooltip",
|
||||
"First name": "Nombre",
|
||||
"Forget URL": "URL de olvido",
|
||||
"Forget URL - Tooltip": "URL de olvido - Tooltip",
|
||||
"Home": "Inicio",
|
||||
"Home - Tooltip": "Inicio - Tooltip",
|
||||
"ID": "ID",
|
||||
"ID - Tooltip": "ID - Tooltip",
|
||||
"Is enabled": "Está habilitado",
|
||||
"Is enabled - Tooltip": "Está habilitado - Tooltip",
|
||||
"LDAPs": "LDAPs",
|
||||
"LDAPs - Tooltip": "LDAPs - Tooltip",
|
||||
"Last name": "Apellido",
|
||||
"Logo": "Logo",
|
||||
"Logo - Tooltip": "Logo - Tooltip",
|
||||
"Master password": "Contraseña maestra",
|
||||
"Master password - Tooltip": "Contraseña maestra - Tooltip",
|
||||
"Method": "Metodo",
|
||||
"Model": "Modelo",
|
||||
"Model - Tooltip": "Modelo - Tooltip",
|
||||
"Models": "Modelos",
|
||||
"Name": "Nombre",
|
||||
"Name - Tooltip": "Nombre - Tooltip",
|
||||
"OAuth providers": "OAuth providers",
|
||||
"Organization": "Organización",
|
||||
"Organization - Tooltip": "Organización - Tooltip",
|
||||
"Organizations": "Organizaciones",
|
||||
"Password": "Contraseña",
|
||||
"Password - Tooltip": "Contraseña - Tooltip",
|
||||
"Password salt": "Password salt",
|
||||
"Password salt - Tooltip": "Password salt - Tooltip",
|
||||
"Password type": "Tipo de Contraseña",
|
||||
"Password type - Tooltip": "Tipo de Contraseña - Tooltip",
|
||||
"Payments": "Pagos",
|
||||
"Permissions": "Permisos",
|
||||
"Permissions - Tooltip": "Permisos - Tooltip",
|
||||
"Phone": "Teléfono",
|
||||
"Phone - Tooltip": "Teléfono - Tooltip",
|
||||
"Phone prefix": "Prefijo teléfonico",
|
||||
"Phone prefix - Tooltip": "Prefijo teléfonico - Tooltip",
|
||||
"Preview": "Previsualizar",
|
||||
"Preview - Tooltip": "Previsualizar - Tooltip",
|
||||
"Products": "Productos",
|
||||
"Provider": "Proveedor",
|
||||
"Provider - Tooltip": "Proveedor - Tooltip",
|
||||
"Providers": "Proveedores",
|
||||
"Providers - Tooltip": "Proveedores - Tooltip",
|
||||
"Real name": "Nombre real",
|
||||
"Records": "Registros",
|
||||
"Request URI": "Request URI",
|
||||
"Resources": "Recursos",
|
||||
"Roles": "Roles",
|
||||
"Roles - Tooltip": "Roles - Tooltip",
|
||||
"Save": "Guardar",
|
||||
"Save & Exit": "Guardar & Volver",
|
||||
"Signin URL": "URL de inicio de sesión",
|
||||
"Signin URL - Tooltip": "URL de inicio de sesión - Tooltip",
|
||||
"Signup URL": "URL de registro",
|
||||
"Signup URL - Tooltip": "URL de registro - Tooltip",
|
||||
"Signup application": "Aplicación de inicio de sesión",
|
||||
"Signup application - Tooltip": "Aplicación de inicio de sesión - Tooltip",
|
||||
"Sorry, the page you visited does not exist.": "Lo sentimos, la página que visitaste no existe.",
|
||||
"Sorry, the user you visited does not exist or you are not authorized to access this user.": "Lo sentimos, el usuario que visitaste no existe o no estás autorizado para acceder.",
|
||||
"Sorry, you do not have permission to access this page.": "Lo sentimos, no tienes permiso para acceder a esta página.",
|
||||
"State": "Estado",
|
||||
"State - Tooltip": "Estado - Tooltip",
|
||||
"Swagger": "Swagger",
|
||||
"Sync": "Sincronizador",
|
||||
"Syncers": "Sincronizadores",
|
||||
"Timestamp": "Timestamp",
|
||||
"Tokens": "Tokens",
|
||||
"URL": "URL",
|
||||
"URL - Tooltip": "URL - Tooltip",
|
||||
"Up": "Subir",
|
||||
"User": "Usuario",
|
||||
"User - Tooltip": "Usuario - Tooltip",
|
||||
"User containers": "Contenedores de usuarios",
|
||||
"User type": "Tipo de usuario",
|
||||
"User type - Tooltip": "Tipo de usuario - Tooltip",
|
||||
"Users": "Usuarios",
|
||||
"Users under all organizations": "Usuarios de todas las organizaciones",
|
||||
"Webhooks": "Webhooks",
|
||||
"{total} in total": "{total} en total"
|
||||
},
|
||||
"ldap": {
|
||||
"Address": "Dirección",
|
||||
"Admin": "Admin",
|
||||
"Admin - Tooltip": "Admin - Tooltip",
|
||||
"Admin Password": "Contraseña del admin",
|
||||
"Admin Password - Tooltip": "Contraseña del admin - Tooltip",
|
||||
"Auto Sync": "Sincronización automática",
|
||||
"Auto Sync - Tooltip": "Sincronización automática - Tooltip",
|
||||
"Base DN": "Base DN",
|
||||
"Base DN - Tooltip": "Base DN - Tooltip",
|
||||
"CN": "CN",
|
||||
"Edit LDAP": "Editar LDAP",
|
||||
"Email": "Email",
|
||||
"Group Id": "Group Id",
|
||||
"ID": "ID",
|
||||
"Last Sync": "Última Sincronización",
|
||||
"Phone": "Teléfono",
|
||||
"Server": "Servidor",
|
||||
"Server Host": "Host de Servidor",
|
||||
"Server Host - Tooltip": "Host de Servidor - Tooltip",
|
||||
"Server Name": "Nombre del Servidor",
|
||||
"Server Name - Tooltip": "Nombre del Servidor - Tooltip",
|
||||
"Server Port": "Puerto del servidor",
|
||||
"Server Port - Tooltip": "Puerto del servidor - Tooltip",
|
||||
"Sync": "Sincronizar",
|
||||
"The Auto Sync option will sync all users to specify organization": "La opción de sincronización automática sincronizará todos los usuarios para la organización especificada.",
|
||||
"UidNumber / Uid": "UidNumber / Uid"
|
||||
},
|
||||
"login": {
|
||||
"Auto sign in": "Inicio de sesión automático",
|
||||
"Continue with": "Continuar con",
|
||||
"Email or phone": "Email o teléfono",
|
||||
"Forgot password?": "¿Olvidó su contraseña?",
|
||||
"Logging out...": "Cerrando su sesión...",
|
||||
"No account?": "¿No estás registrado?",
|
||||
"Or sign in with another account": "O inicia sesión con otra cuenta",
|
||||
"Password": "Contraseña",
|
||||
"Password - Tooltip": "Contraseña - Tooltip",
|
||||
"Please input your code!": "¡Por favor ingrese su código!",
|
||||
"Please input your password!": "¡Por favor ingrese su contraseña!",
|
||||
"Please input your password, at least 6 characters!": "Su contraseña debe contener al menos 6 caracteres.",
|
||||
"Please input your username, Email or phone!": "¡Ingrese su nombre de usuario, correo electrónico o teléfono!",
|
||||
"Sign In": "Iniciar de sesión",
|
||||
"Sign in with WebAuthn": "Iniciar de sesión con WebAuthn",
|
||||
"Sign in with code": "Iniciar de sesión con código",
|
||||
"Sign in with password": "Iniciar de sesión con contraseña",
|
||||
"Sign in with {type}": "Iniciar de sesión con {type}",
|
||||
"Signing in...": "Iniciando de sesión...",
|
||||
"The input is not valid Email or Phone!": "El valor ingresado no es un Email o Teléfono válido!",
|
||||
"To access": "Para ingresar",
|
||||
"sign up now": "Regístrate ahora",
|
||||
"username, Email or phone": "nombre de usuario, correo electrónico o teléfono"
|
||||
},
|
||||
"model": {
|
||||
"Edit Model": "Editar Modelo",
|
||||
"Model text": "Texto del modelo",
|
||||
"Model text - Tooltip": "Texto del modelo - Tooltip",
|
||||
"New Model": "Nuevo Modelo"
|
||||
},
|
||||
"organization": {
|
||||
"Account items": "Items de la cuenta",
|
||||
"Account items - Tooltip": "Items de la cuenta - Tooltip",
|
||||
"Default avatar": "Avatar por defecto",
|
||||
"Edit Organization": "Editar Organización",
|
||||
"Favicon": "Favicon",
|
||||
"Is profile public": "Es el perfil publico",
|
||||
"Is profile public - Tooltip": "Es el perfil publico - Tooltip",
|
||||
"New Organization": "Nueva Organización",
|
||||
"Soft deletion": "Eliminación Soft",
|
||||
"Soft deletion - Tooltip": "Eliminación Soft - Tooltip",
|
||||
"Tags": "Etiquetas",
|
||||
"Tags - Tooltip": "Etiquetas - Tooltip",
|
||||
"Website URL": "URL del sitio web",
|
||||
"Website URL - Tooltip": "URL del sitio web - Tooltip",
|
||||
"modifyRule": "modifyRule",
|
||||
"viewRule": "viewRule"
|
||||
},
|
||||
"payment": {
|
||||
"Confirm your invoice information": "Confirma la información de tu factura",
|
||||
"Currency": "Moneda",
|
||||
"Currency - Tooltip": "Moneda - Tooltip",
|
||||
"Download Invoice": "Descargar factura",
|
||||
"Edit Payment": "Editar Pago",
|
||||
"Individual": "Individual",
|
||||
"Invoice URL": "URL de factura",
|
||||
"Invoice URL - Tooltip": "URL de factura - Tooltip",
|
||||
"Invoice actions": "Acciones de factura",
|
||||
"Invoice actions - Tooltip": "Acciones de factura - Tooltip",
|
||||
"Invoice remark": "Comentario de factura",
|
||||
"Invoice remark - Tooltip": "Comentario de factura - Tooltip",
|
||||
"Invoice tax ID": "Número de identificación fiscal de la factura",
|
||||
"Invoice tax ID - Tooltip": "Número de identificación fiscal de la factura - Tooltip",
|
||||
"Invoice title": "Titulo de factura",
|
||||
"Invoice title - Tooltip": "Titulo de factura - Tooltip",
|
||||
"Invoice type": "Tipo de factura",
|
||||
"Invoice type - Tooltip": "Tipo de factura - Tooltip",
|
||||
"Issue Invoice": "Emitir factura",
|
||||
"Message": "Mensaje",
|
||||
"Message - Tooltip": "Mensaje - Tooltip",
|
||||
"New Payment": "Nuevo Pago",
|
||||
"Organization": "Organización",
|
||||
"Person Email": "Email de la persona",
|
||||
"Person Email - Tooltip": "Email de la persona - Tooltip",
|
||||
"Person ID card": "Documento de identidad de la persona",
|
||||
"Person ID card - Tooltip": "Documento de identidad de la persona - Tooltip",
|
||||
"Person name": "Nombre de la persona",
|
||||
"Person name - Tooltip": "Nombre de la persona - Tooltip",
|
||||
"Person phone": "Teléfono de la persona",
|
||||
"Person phone - Tooltip": "Teléfono de la persona - Tooltip",
|
||||
"Please carefully check your invoice information. Once the invoice is issued, it cannot be withdrawn or modified.": "Por favor revise cuidadosamente la información de su factura. Una vez emitida la factura, no podrá ser retirada ni modificada.",
|
||||
"Please click the below button to return to the original website": "Haga clic en el botón de abajo para volver al sitio web original",
|
||||
"Please pay the order first!": "¡Por favor pague la orden primero!",
|
||||
"Price": "Precio",
|
||||
"Price - Tooltip": "Precio - Tooltip",
|
||||
"Processing...": "Procesando...",
|
||||
"Product": "Producto",
|
||||
"Product - Tooltip": "Producto - Tooltip",
|
||||
"Result": "Resultado",
|
||||
"Return to Website": "Volver al sitio web",
|
||||
"State": "Estado",
|
||||
"State - Tooltip": "Estado - Tooltip",
|
||||
"The payment has failed": "El pago ha fallado",
|
||||
"The payment is still under processing": "El pago aún está en proceso",
|
||||
"Type": "Tipo",
|
||||
"Type - Tooltip": "Tipo - Tooltip",
|
||||
"You have successfully completed the payment": "Su pago se ha completado con éxito",
|
||||
"please wait for a few seconds...": "por favor espere unos segundos...",
|
||||
"the current state is": "el estado actual es"
|
||||
},
|
||||
"permission": {
|
||||
"Actions": "Acciones",
|
||||
"Actions - Tooltip": "Acciones - Tooltip",
|
||||
"Approve time": "Fecha de aprobación",
|
||||
"Approve time - Tooltip": "Fecha de aprobación - Tooltip",
|
||||
"Approver": "Aprobador",
|
||||
"Approver - Tooltip": "Aprobador - Tooltip",
|
||||
"Edit Permission": "Editar Permiso",
|
||||
"Effect": "Effect",
|
||||
"Effect - Tooltip": "Effect - Tooltip",
|
||||
"New Permission": "Nuevo Permiso",
|
||||
"Resource type": "Tipo de recurso",
|
||||
"Resource type - Tooltip": "Tipo de recurso - Tooltip",
|
||||
"Resources": "Recursos",
|
||||
"Resources - Tooltip": "Recursos - Tooltip",
|
||||
"State": "Estado",
|
||||
"State - Tooltip": "Estado - Tooltip",
|
||||
"Submitter": "Submitter",
|
||||
"Submitter - Tooltip": "Submitter - Tooltip"
|
||||
},
|
||||
"product": {
|
||||
"Alipay": "Alipay",
|
||||
"Buy": "Comprar",
|
||||
"Buy Product": "Comprar Producto",
|
||||
"CNY": "CNY",
|
||||
"Currency": "Moneda",
|
||||
"Currency - Tooltip": "Moneda - Tooltip",
|
||||
"Detail": "Detalle",
|
||||
"Detail - Tooltip": "Detalle - Tooltip",
|
||||
"Edit Product": "Editar Producto",
|
||||
"Image": "Imagen",
|
||||
"Image - Tooltip": "Imagen - Tooltip",
|
||||
"New Product": "Nuevo producto",
|
||||
"Pay": "Pago",
|
||||
"Payment providers": "Pasarelas de pago",
|
||||
"Payment providers - Tooltip": "Pasarelas de pago - Tooltip",
|
||||
"Paypal": "Paypal",
|
||||
"Placing order...": "Creando su pedido...",
|
||||
"Price": "Precio",
|
||||
"Price - Tooltip": "Precio - Tooltip",
|
||||
"Quantity": "Cantidad",
|
||||
"Quantity - Tooltip": "Cantidad - Tooltip",
|
||||
"Return URL": "URL de retorno",
|
||||
"Return URL - Tooltip": "URL de retorno - Tooltip",
|
||||
"SKU": "SKU",
|
||||
"Sold": "Agotado",
|
||||
"Sold - Tooltip": "Agotado - Tooltip",
|
||||
"Tag": "Etiqueta",
|
||||
"Tag - Tooltip": "Etiqueta - Tooltip",
|
||||
"Test buy page..": "Probar página de pago...",
|
||||
"There is no payment channel for this product.": "No existe un canal de pago para este producto.",
|
||||
"This product is currently not in sale.": "Este producto actualmente no está a la venta.",
|
||||
"USD": "USD",
|
||||
"WeChat Pay": "WeChat Pay"
|
||||
},
|
||||
"provider": {
|
||||
"Access key": "Clave de acceso",
|
||||
"Access key - Tooltip": "Clave de acceso - Tooltip",
|
||||
"Agent ID": "ID del Agente",
|
||||
"Agent ID - Tooltip": "ID del Agente - Tooltip",
|
||||
"App ID": "App ID",
|
||||
"App ID - Tooltip": "App ID - Tooltip",
|
||||
"App key": "App key",
|
||||
"App key - Tooltip": "App key - Tooltip",
|
||||
"App secret": "App secret",
|
||||
"AppSecret - Tooltip": "AppSecret - Tooltip",
|
||||
"Auth URL": "Auth URL",
|
||||
"Auth URL - Tooltip": "Auth URL - Tooltip",
|
||||
"Bucket": "Bucket",
|
||||
"Bucket - Tooltip": "Bucket - Tooltip",
|
||||
"Can not parse Metadata": "Can not parse Metadata",
|
||||
"Category": "Categoria",
|
||||
"Category - Tooltip": "Categoria - Tooltip",
|
||||
"Channel No.": "Channel No.",
|
||||
"Channel No. - Tooltip": "Channel No. - Tooltip",
|
||||
"Client ID": "Client ID",
|
||||
"Client ID - Tooltip": "Client ID - Tooltip",
|
||||
"Client ID 2": "Client ID 2",
|
||||
"Client ID 2 - Tooltip": "Client ID 2 - Tooltip",
|
||||
"Client secret": "Client secret",
|
||||
"Client secret - Tooltip": "Client secret - Tooltip",
|
||||
"Client secret 2": "Client secret 2",
|
||||
"Client secret 2 - Tooltip": "Client secret 2 - Tooltip",
|
||||
"Copy": "Copiar",
|
||||
"Disable SSL": "Deshabilitar SSL",
|
||||
"Disable SSL - Tooltip": "Deshabilitar SSL - Tooltip",
|
||||
"Domain": "Dominio",
|
||||
"Domain - Tooltip": "Dominio - Tooltip",
|
||||
"Edit Provider": "Editar Proveedor",
|
||||
"Email Content": "Contenido del Email",
|
||||
"Email Content - Tooltip": "Contenido del Email - Tooltip",
|
||||
"Email Title": "Titulo del Email",
|
||||
"Email Title - Tooltip": "Titulo del Email - Tooltip",
|
||||
"Endpoint": "Endpoint",
|
||||
"Endpoint (Intranet)": "Endpoint (Intranet)",
|
||||
"Host": "Host",
|
||||
"Host - Tooltip": "Host - Tooltip",
|
||||
"IdP": "IdP",
|
||||
"IdP certificate": "IdP certificate",
|
||||
"Issuer URL": "Issuer URL",
|
||||
"Issuer URL - Tooltip": "Issuer URL - Tooltip",
|
||||
"Link copied to clipboard successfully": "Enlace copiado al portapapeles con éxito",
|
||||
"Metadata": "Metadata",
|
||||
"Metadata - Tooltip": "Metadata - Tooltip",
|
||||
"Method": "Metodo",
|
||||
"Method - Tooltip": "Metodo - Tooltip",
|
||||
"Name": "Nombre",
|
||||
"New Provider": "Nuevo Proveedor",
|
||||
"Parse": "Parsear",
|
||||
"Parse Metadata successfully": "Metadata parseada con éxito",
|
||||
"Port": "Puerto",
|
||||
"Port - Tooltip": "Puerto - Tooltip",
|
||||
"Provider URL": "URL del Proveedor",
|
||||
"Provider URL - Tooltip": "URL del Proveedor - Tooltip",
|
||||
"Region ID": "Region ID",
|
||||
"Region ID - Tooltip": "Region ID - Tooltip",
|
||||
"Region endpoint for Internet": "Region endpoint for Internet",
|
||||
"Region endpoint for Intranet": "Region endpoint for Intranet",
|
||||
"SAML 2.0 Endpoint (HTTP)": "SAML 2.0 Endpoint (HTTP)",
|
||||
"SMS account": "SMS account",
|
||||
"SMS account - Tooltip": "SMS account - Tooltip",
|
||||
"SP ACS URL": "SP ACS URL",
|
||||
"SP ACS URL - Tooltip": "SP ACS URL - Tooltip",
|
||||
"SP Entity ID": "SP Entity ID",
|
||||
"Scene": "Scene",
|
||||
"Scene - Tooltip": "Scene - Tooltip",
|
||||
"Scope": "Scope",
|
||||
"Scope - Tooltip": "Scope - Tooltip",
|
||||
"Secret access key": "Secret access key",
|
||||
"Secret key": "Secret key",
|
||||
"Secret key - Tooltip": "Secret key - Tooltip",
|
||||
"SecretAccessKey - Tooltip": "SecretAccessKey - Tooltip",
|
||||
"Send Test Email": "Enviar email de prueba",
|
||||
"Sign Name": "Sign Name",
|
||||
"Sign Name - Tooltip": "Sign Name - Tooltip",
|
||||
"Sign request": "Sign request",
|
||||
"Sign request - Tooltip": "Sign request - Tooltip",
|
||||
"Signin HTML": "Signin HTML",
|
||||
"Signin HTML - Edit": "Signin HTML - Edit",
|
||||
"Signin HTML - Tooltip": "Signin HTML - Tooltip",
|
||||
"Signup HTML": "Signup HTML",
|
||||
"Signup HTML - Edit": "Signup HTML - Edit",
|
||||
"Signup HTML - Tooltip": "Signup HTML - Tooltip",
|
||||
"Site key": "Site key",
|
||||
"Site key - Tooltip": "Site key - Tooltip",
|
||||
"Sub type": "Sub type",
|
||||
"Sub type - Tooltip": "Sub type - Tooltip",
|
||||
"Template Code": "Código de plantilla",
|
||||
"Template Code - Tooltip": "Código de plantilla - Tooltip",
|
||||
"Terms of Use": "Términos de Uso",
|
||||
"Terms of Use - Tooltip": "Términos de Uso - Tooltip",
|
||||
"Test Connection": "Probar Conexión",
|
||||
"Test Email": "Probar Email",
|
||||
"Test Email - Tooltip": "Probar Email - Tooltip",
|
||||
"Token URL": "Token URL",
|
||||
"Token URL - Tooltip": "Token URL - Tooltip",
|
||||
"Type": "Tipo",
|
||||
"Type - Tooltip": "Tipo - Tooltip",
|
||||
"UserInfo URL": "UserInfo URL",
|
||||
"UserInfo URL - Tooltip": "UserInfo URL - Tooltip",
|
||||
"alertType": "alertType",
|
||||
"canSignIn": "canSignIn",
|
||||
"canSignUp": "canSignUp",
|
||||
"canUnlink": "canUnlink",
|
||||
"prompted": "prompted",
|
||||
"required": "required",
|
||||
"visible": "visible"
|
||||
},
|
||||
"record": {
|
||||
"Is Triggered": "Esta activado"
|
||||
},
|
||||
"resource": {
|
||||
"Application": "Aplicación",
|
||||
"Copy Link": "Copiar Link",
|
||||
"File name": "Nombre del archivo",
|
||||
"File size": "Tamaño del archivo",
|
||||
"Format": "Formato",
|
||||
"Link copied to clipboard successfully": "Enlace copiado al portapapeles con éxito",
|
||||
"Parent": "Parent",
|
||||
"Tag": "Etiqueta",
|
||||
"Type": "Tipo",
|
||||
"Upload a file...": "Subir archivo...",
|
||||
"User": "Usuario"
|
||||
},
|
||||
"role": {
|
||||
"Edit Role": "Editar Rol",
|
||||
"New Role": "Nuevo Rol",
|
||||
"Sub domains": "Sub dominios",
|
||||
"Sub domains - Tooltip": "Sub dominios - Tooltip",
|
||||
"Sub roles": "Sub roles",
|
||||
"Sub roles - Tooltip": "Sub roles - Tooltip",
|
||||
"Sub users": "Sub usuarios",
|
||||
"Sub users - Tooltip": "Sub usuarios - Tooltip"
|
||||
},
|
||||
"signup": {
|
||||
"Accept": "Aceptar",
|
||||
"Agreement": "Agreement",
|
||||
"Confirm": "Confirmar",
|
||||
"Decline": "Rechazar",
|
||||
"Have account?": "¿Ya tienes una cuenta?",
|
||||
"Please accept the agreement!": "Por favor, acepte el acuerdo!",
|
||||
"Please click the below button to sign in": "Por favor, haga clic en el botón de abajo para iniciar sesión",
|
||||
"Please confirm your password!": "Por favor, confirme su contraseña!",
|
||||
"Please input the correct ID card number!": "¡Ingrese un documento de identidad correcto!",
|
||||
"Please input your Email!": "Por favor, ingrese su Email!",
|
||||
"Please input your ID card number!": "Por favor, ingrese su documento de identidad!",
|
||||
"Please input your address!": "Por favor, ingrese su domicilio!",
|
||||
"Please input your affiliation!": "Por favor, ingrese su afiliación!",
|
||||
"Please input your display name!": "Por favor, ingrese su apodo!",
|
||||
"Please input your first name!": "Por favor, ingrese su nombre!",
|
||||
"Please input your last name!": "Por favor, ingrese su apellido!",
|
||||
"Please input your phone number!": "Por favor, ingrese su número teléfonico!",
|
||||
"Please input your real name!": "Por favor, ingrese un nombre real!",
|
||||
"Please select your country/region!": "Por favor, seleccione su pais/region!",
|
||||
"Terms of Use": "Términos de Uso",
|
||||
"The input is not invoice Tax ID!": "El valor ingresado no es un número de identificación fiscal de factura!",
|
||||
"The input is not invoice title!": "El valor ingresado no es el titulo de factura!",
|
||||
"The input is not valid Email!": "El valor ingresado no es un Email válido!",
|
||||
"The input is not valid Phone!": "El valor ingresado no es un Teléfono válido!",
|
||||
"Username": "Nombre de usuario",
|
||||
"Username - Tooltip": "Nombre de usuario - Tooltip",
|
||||
"Your account has been created!": "¡Tu cuenta ha sido creada!",
|
||||
"Your confirmed password is inconsistent with the password!": "¡La confirmación de su contraseña es inconsistente!",
|
||||
"sign in now": "iniciar sesión ahora"
|
||||
},
|
||||
"syncer": {
|
||||
"Affiliation table": "Tabla de afiliación",
|
||||
"Affiliation table - Tooltip": "Tabla de afiliación - Tooltip",
|
||||
"Avatar base URL": "Avatar base URL",
|
||||
"Avatar base URL - Tooltip": "Avatar base URL - Tooltip",
|
||||
"Casdoor column": "Casdoor column",
|
||||
"Column name": "Nombre de columna",
|
||||
"Column type": "Tipo de columna",
|
||||
"Database": "Base de datos",
|
||||
"Database - Tooltip": "Base de datos - Tooltip",
|
||||
"Database type": "Tipo de base de datos",
|
||||
"Database type - Tooltip": "Tipo de base de datos - Tooltip",
|
||||
"Edit Syncer": "Editar Sincronizador",
|
||||
"Error text": "Texto de Error",
|
||||
"Error text - Tooltip": "Texto de Error - Tooltip",
|
||||
"Is hashed": "Esta hashed?",
|
||||
"New Syncer": "Nuevo Sincronizador",
|
||||
"Sync interval": "Intervalo de sincronización",
|
||||
"Sync interval - Tooltip": "Intervalo de sincronización - Tooltip",
|
||||
"Table": "Tabla",
|
||||
"Table - Tooltip": "Tabla - Tooltip",
|
||||
"Table columns": "Columnas de la tabla",
|
||||
"Table columns - Tooltip": "Columnas de la tabla - Tooltip",
|
||||
"Table primary key": "Clave primaria de la tabla",
|
||||
"Table primary key - Tooltip": "Clave primaria de la tabla - Tooltip"
|
||||
},
|
||||
"token": {
|
||||
"Access token": "Token de acceso",
|
||||
"Authorization code": "Código de autorización",
|
||||
"Edit Token": "Editar Token",
|
||||
"Expires in": "Expira en",
|
||||
"New Token": "Nuevo Token",
|
||||
"Scope": "Alcance",
|
||||
"Token type": "Tipo del Token"
|
||||
},
|
||||
"user": {
|
||||
"\" + destType + \" reset": "\" + destType + \" reset",
|
||||
"3rd-party logins": "3rd-party logins",
|
||||
"3rd-party logins - Tooltip": "3rd-party logins - Tooltip",
|
||||
"Address": "Dirección",
|
||||
"Address - Tooltip": "Dirección - Tooltip",
|
||||
"Affiliation": "Afiliación",
|
||||
"Affiliation - Tooltip": "Afiliación - Tooltip",
|
||||
"Bio": "Acerca de vos",
|
||||
"Bio - Tooltip": "Acerca de vos - Tooltip",
|
||||
"Cancel": "Cancelar",
|
||||
"Captcha Verify Failed": "Fallo la verificación del Captcha",
|
||||
"Captcha Verify Success": "Captcha verificado con éxito",
|
||||
"Code Sent": "Código enviado",
|
||||
"Country/Region": "Pais/Región",
|
||||
"Country/Region - Tooltip": "Pais/Región - Tooltip",
|
||||
"Edit User": "Editar usuario",
|
||||
"Empty input!": "Campo requerido!",
|
||||
"Homepage": "Página de Inicio",
|
||||
"Homepage - Tooltip": "Página de Inicio - Tooltip",
|
||||
"ID card": "Documento de identidad",
|
||||
"Input your email": "Ingrese su email",
|
||||
"Input your phone number": "Ingrese su número teléfonico",
|
||||
"Is admin": "Es admin",
|
||||
"Is admin - Tooltip": "Es admin - Tooltip",
|
||||
"Is deleted": "Esta Eliminado",
|
||||
"Is deleted - Tooltip": "Esta Eliminado - Tooltip",
|
||||
"Is forbidden": "Está prohibido",
|
||||
"Is forbidden - Tooltip": "Está prohibido - Tooltip",
|
||||
"Is global admin": "Es admin global",
|
||||
"Is global admin - Tooltip": "Es admin global - Tooltip",
|
||||
"Link": "Enlace",
|
||||
"Location": "Ubicación",
|
||||
"Location - Tooltip": "Ubicación - Tooltip",
|
||||
"Modify password...": "Cambiar contraseña...",
|
||||
"New Email": "Nuevo Email",
|
||||
"New Password": "Nueva Contraseña",
|
||||
"New User": "Nuevo usuario",
|
||||
"New phone": "Nuevo teléfono",
|
||||
"OK": "OK",
|
||||
"Old Password": "Contraseña anterior",
|
||||
"Password": "Contraseña",
|
||||
"Password Set": "Password Set",
|
||||
"Properties": "Propiedades",
|
||||
"Re-enter New": "Reingrese de nuevo",
|
||||
"Reset Email...": "Cambiar Email...",
|
||||
"Reset Phone...": "Cambiar Phone...",
|
||||
"Select a photo...": "Select a photo...",
|
||||
"Set Password": "Cambiar contraseña",
|
||||
"Set new profile picture": "Cambiar imagen de perfil",
|
||||
"Set password...": "Cambiando contraseña...",
|
||||
"Tag": "Etiqueta",
|
||||
"Tag - Tooltip": "Etiqueta - Tooltip",
|
||||
"Title": "Titulo",
|
||||
"Title - Tooltip": "Titulo - Tooltip",
|
||||
"Two passwords you typed do not match.": "La contraseña no coincide.",
|
||||
"Unlink": "Desvincular",
|
||||
"Upload (.xlsx)": "Subir archivo (.xlsx)",
|
||||
"Upload a photo": "Subir foto",
|
||||
"WebAuthn credentials": "WebAuthn credentials",
|
||||
"input password": "input password"
|
||||
},
|
||||
"webhook": {
|
||||
"Content type": "Tipo de contenido",
|
||||
"Content type - Tooltip": "Tipo de contenido - Tooltip",
|
||||
"Edit Webhook": "Editar Webhook",
|
||||
"Events": "Eventos",
|
||||
"Events - Tooltip": "Eventos - Tooltip",
|
||||
"Headers": "Cabeceras",
|
||||
"Headers - Tooltip": "Cabeceras - Tooltip",
|
||||
"Is user extended": "Es usuario extendido",
|
||||
"Is user extended - Tooltip": "Es usuario extendido - Tooltip",
|
||||
"Method": "Metodo",
|
||||
"Method - Tooltip": "Metodo - Tooltip",
|
||||
"Name": "Nombre",
|
||||
"New Webhook": "Nuevo Webhook",
|
||||
"URL": "URL",
|
||||
"URL - Tooltip": "URL - Tooltip",
|
||||
"Value": "Valor"
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user