diff --git a/captcha/aliyun.go b/captcha/aliyun.go index 17695ce8..bb412cb7 100644 --- a/captcha/aliyun.go +++ b/captcha/aliyun.go @@ -86,8 +86,8 @@ func (captcha *AliyunCaptchaProvider) VerifyCaptcha(token, clientSecret string) } type captchaResponse struct { - Code int `json:"Code"` - Msg string `json:"Msg"` + Code string `json:"Code"` + Message string `json:"Message"` } captchaResp := &captchaResponse{} @@ -96,8 +96,8 @@ func (captcha *AliyunCaptchaProvider) VerifyCaptcha(token, clientSecret string) return false, err } - if captchaResp.Code != 100 { - return false, errors.New(captchaResp.Msg) + if captchaResp.Code != "100" { + return false, errors.New(captchaResp.Message) } return true, nil diff --git a/controllers/verification.go b/controllers/verification.go index c78cc429..ceabe04f 100644 --- a/controllers/verification.go +++ b/controllers/verification.go @@ -51,8 +51,8 @@ func (c *ApiController) SendVerificationCode() { dest := c.Ctx.Request.Form.Get("dest") countryCode := c.Ctx.Request.Form.Get("countryCode") checkType := c.Ctx.Request.Form.Get("checkType") - checkId := c.Ctx.Request.Form.Get("checkId") - checkKey := c.Ctx.Request.Form.Get("checkKey") + clientSecret := c.Ctx.Request.Form.Get("clientSecret") + captchaToken := c.Ctx.Request.Form.Get("captchaToken") applicationId := c.Ctx.Request.Form.Get("applicationId") method := c.Ctx.Request.Form.Get("method") checkUser := c.Ctx.Request.Form.Get("checkUser") @@ -76,15 +76,15 @@ func (c *ApiController) SendVerificationCode() { } if checkType != "none" { - if checkKey == "" { - c.ResponseError(c.T("general:Missing parameter") + ": checkKey.") + if captchaToken == "" { + c.ResponseError(c.T("general:Missing parameter") + ": captchaToken.") return } if captchaProvider := captcha.GetCaptchaProvider(checkType); captchaProvider == nil { c.ResponseError(c.T("general:don't support captchaProvider: ") + checkType) return - } else if isHuman, err := captchaProvider.VerifyCaptcha(checkKey, checkId); err != nil { + } else if isHuman, err := captchaProvider.VerifyCaptcha(captchaToken, clientSecret); err != nil { c.ResponseError(err.Error()) return } else if !isHuman { diff --git a/object/check.go b/object/check.go index ee4a89b9..ed34c1ca 100644 --- a/object/check.go +++ b/object/check.go @@ -380,7 +380,7 @@ func CheckToEnableCaptcha(application *Application) bool { if providerItem.Provider == nil { continue } - if providerItem.Provider.Category == "Captcha" && providerItem.Provider.Type == "Default" { + if providerItem.Provider.Category == "Captcha" { return providerItem.Rule == "Always" } } diff --git a/web/src/ProviderEditPage.js b/web/src/ProviderEditPage.js index 49b8b1ab..d232cff9 100644 --- a/web/src/ProviderEditPage.js +++ b/web/src/ProviderEditPage.js @@ -813,17 +813,17 @@ class ProviderEditPage extends React.Component { diff --git a/web/src/auth/LoginPage.js b/web/src/auth/LoginPage.js index 88646b02..b903e097 100644 --- a/web/src/auth/LoginPage.js +++ b/web/src/auth/LoginPage.js @@ -82,13 +82,13 @@ class LoginPage extends React.Component { componentDidUpdate(prevProps, prevState, snapshot) { if (this.state.application && !prevState.application) { - const defaultCaptchaProviderItems = this.getDefaultCaptchaProviderItems(this.state.application); + const captchaProviderItems = this.getCaptchaProviderItems(this.state.application); - if (!defaultCaptchaProviderItems) { + if (!captchaProviderItems) { return; } - this.setState({enableCaptchaModal: defaultCaptchaProviderItems.some(providerItem => providerItem.rule === "Always")}); + this.setState({enableCaptchaModal: captchaProviderItems.some(providerItem => providerItem.rule === "Always")}); } } @@ -228,7 +228,7 @@ class LoginPage extends React.Component { Setting.goToLinkSoft(ths, `/prompt/${application.name}?redirectUri=${oAuthParams.redirectUri}&code=${code}&state=${oAuthParams.state}`); } } else { - Setting.showMessage("error", `Failed to sign in: ${res.msg}`); + Setting.showMessage("error", `${i18next.t("application:Failed to log in")}: ${res.msg}`); } }); } else { @@ -262,13 +262,7 @@ class LoginPage extends React.Component { if (this.state.loginMethod === "password" && this.state.enableCaptchaModal) { this.setState({ openCaptchaModal: true, - verifyCaptcha: (captchaType, captchaToken, secret) => { - values["captchaType"] = captchaType; - values["captchaToken"] = captchaToken; - values["clientSecret"] = secret; - - this.login(values); - }, + values: values, }); } else { this.login(values); @@ -290,8 +284,6 @@ class LoginPage extends React.Component { } Setting.showMessage("success", msg); - this.setState({openCaptchaModal: false}); - if (casParams.service !== "") { const st = res.data; const newUrl = new URL(casParams.service); @@ -299,8 +291,7 @@ class LoginPage extends React.Component { window.location.href = newUrl.toString(); } } else { - this.setState({openCaptchaModal: false}); - Setting.showMessage("error", `Failed to log in: ${res.msg}`); + Setting.showMessage("error", `${i18next.t("application:Failed to log in")}: ${res.msg}`); } }); } else { @@ -338,8 +329,7 @@ class LoginPage extends React.Component { } } } else { - this.setState({openCaptchaModal: false}); - Setting.showMessage("error", `Failed to log in: ${res.msg}`); + Setting.showMessage("error", `${i18next.t("application:Failed to log in")}: ${res.msg}`); } }); } @@ -549,7 +539,7 @@ class LoginPage extends React.Component { } } - getDefaultCaptchaProviderItems(application) { + getCaptchaProviderItems(application) { const providers = application?.providers; if (providers === undefined || providers === null) { @@ -561,7 +551,7 @@ class LoginPage extends React.Component { return false; } - return providerItem.provider.category === "Captcha" && providerItem.provider.type === "Default"; + return providerItem.provider.category === "Captcha"; }); } @@ -570,22 +560,25 @@ class LoginPage extends React.Component { return null; } - const provider = this.getDefaultCaptchaProviderItems(application) + const provider = this.getCaptchaProviderItems(application) .filter(providerItem => providerItem.rule === "Always") .map(providerItem => providerItem.provider)[0]; return this.state.verifyCaptcha?.(captchaType, captchaToken, secret)} - canCancel={false} + visible={this.state.openCaptchaModal} + onOk={(captchaType, captchaToken, clientSecret) => { + const values = this.state.values; + values["captchaType"] = captchaType; + values["captchaToken"] = captchaToken; + values["clientSecret"] = clientSecret; + + this.login(values); + this.setState({openCaptchaModal: false}); + }} + onCancel={() => this.setState({openCaptchaModal: false})} + isCurrentProvider={true} />; } diff --git a/web/src/backend/UserBackend.js b/web/src/backend/UserBackend.js index 77659560..8f5d7f9d 100644 --- a/web/src/backend/UserBackend.js +++ b/web/src/backend/UserBackend.js @@ -109,11 +109,11 @@ export function setPassword(userOwner, userName, oldPassword, newPassword) { }).then(res => res.json()); } -export function sendCode(checkType, checkId, checkKey, method, countryCode = "", dest, type, applicationId, checkUser = "") { +export function sendCode(checkType, captchaToken, clientSecret, method, countryCode = "", dest, type, applicationId, checkUser = "") { const formData = new FormData(); formData.append("checkType", checkType); - formData.append("checkId", checkId); - formData.append("checkKey", checkKey); + formData.append("captchaToken", captchaToken); + formData.append("clientSecret", clientSecret); formData.append("method", method); formData.append("countryCode", countryCode); formData.append("dest", dest); diff --git a/web/src/common/CaptchaModal.js b/web/src/common/CaptchaModal.js index 180c822a..64a17460 100644 --- a/web/src/common/CaptchaModal.js +++ b/web/src/common/CaptchaModal.js @@ -19,60 +19,57 @@ import * as UserBackend from "../backend/UserBackend"; import {CaptchaWidget} from "./CaptchaWidget"; import {SafetyOutlined} from "@ant-design/icons"; -export const CaptchaModal = ({ - owner, - name, - captchaType, - subType, - clientId, - clientId2, - clientSecret, - clientSecret2, - open, - onOk, - onCancel, - canCancel, -}) => { - const [visible, setVisible] = React.useState(false); +export const CaptchaModal = (props) => { + const {owner, name, visible, onOk, onCancel, isCurrentProvider} = props; + + const [captchaType, setCaptchaType] = React.useState("none"); + const [clientId, setClientId] = React.useState(""); + const [clientSecret, setClientSecret] = React.useState(""); + const [subType, setSubType] = React.useState(""); + const [clientId2, setClientId2] = React.useState(""); + const [clientSecret2, setClientSecret2] = React.useState(""); + + const [open, setOpen] = React.useState(false); const [captchaImg, setCaptchaImg] = React.useState(""); const [captchaToken, setCaptchaToken] = React.useState(""); - const [secret, setSecret] = React.useState(clientSecret); - const [secret2, setSecret2] = React.useState(clientSecret2); + const defaultInputRef = React.useRef(null); useEffect(() => { - setVisible(() => { - if (open) { - getCaptchaFromBackend(); - } else { - cleanUp(); - } - return open; - }); - }, [open]); + if (visible) { + loadCaptcha(); + } else { + handleCancel(); + setOpen(false); + } + }, [visible]); const handleOk = () => { - onOk?.(captchaType, captchaToken, secret); + onOk?.(captchaType, captchaToken, clientSecret); }; const handleCancel = () => { + setCaptchaToken(""); onCancel?.(); }; - const cleanUp = () => { - setCaptchaToken(""); - }; - - const getCaptchaFromBackend = () => { - UserBackend.getCaptcha(owner, name, true).then((res) => { - if (captchaType === "Default") { - setSecret(res.captchaId); + const loadCaptcha = () => { + UserBackend.getCaptcha(owner, name, isCurrentProvider).then((res) => { + if (res.type === "none") { + handleOk(); + } else if (res.type === "Default") { + setOpen(true); + setClientSecret(res.captchaId); setCaptchaImg(res.captchaImage); - - defaultInputRef.current?.focus(); + setCaptchaType("Default"); } else { - setSecret(res.clientSecret); - setSecret2(res.clientSecret2); + setOpen(true); + setCaptchaType(res.type); + setClientId(res.clientId); + setClientSecret(res.clientSecret); + setSubType(res.subType); + setClientId2(res.clientId2); + setClientSecret2(res.clientSecret2); } }); }; @@ -108,11 +105,11 @@ export const CaptchaModal = ({ ); }; - const onSubmit = (token) => { + const onChange = (token) => { setCaptchaToken(token); }; - const renderCheck = () => { + const renderCaptcha = () => { if (captchaType === "Default") { return renderDefaultCaptcha(); } else { @@ -123,10 +120,10 @@ export const CaptchaModal = ({ captchaType={captchaType} subType={subType} siteKey={clientId} - clientSecret={secret} - onChange={onSubmit} + clientSecret={clientSecret} + onChange={onChange} clientId2={clientId2} - clientSecret2={secret2} + clientSecret2={clientSecret2} /> @@ -141,37 +138,35 @@ export const CaptchaModal = ({ if (!regex.test(captchaToken)) { isOkDisabled = true; } + } else if (captchaToken === "") { + isOkDisabled = true; } - if (canCancel) { - return [ - , - , - ]; - } else { - return [ - , - ]; - } + return [ + , + , + ]; }; return ( - - -
- { - renderCheck() - } -
-
-
+ +
+ { + renderCaptcha() + } +
+
); }; diff --git a/web/src/common/CaptchaPreview.js b/web/src/common/CaptchaPreview.js index f950f19f..9d33c79a 100644 --- a/web/src/common/CaptchaPreview.js +++ b/web/src/common/CaptchaPreview.js @@ -18,19 +18,9 @@ import i18next from "i18next"; import {CaptchaModal} from "./CaptchaModal"; import * as UserBackend from "../backend/UserBackend"; -export const CaptchaPreview = ({ - provider, - clientSecret, - captchaType, - subType, - owner, - clientId, - name, - providerUrl, - clientId2, - clientSecret2, -}) => { - const [open, setOpen] = React.useState(false); +export const CaptchaPreview = (props) => { + const {owner, name, provider, captchaType, subType, clientId, clientSecret, clientId2, clientSecret2, providerUrl} = props; + const [visible, setVisible] = React.useState(false); const clickPreview = () => { provider.name = name; @@ -42,13 +32,13 @@ export const CaptchaPreview = ({ // ProviderBackend.updateProvider(owner, providerName, provider).then(() => { // setOpen(true); // }); - setOpen(true); + setVisible(true); } else { - setOpen(true); + setVisible(true); } }; - const getButtonDisabled = () => { + const isButtonDisabled = () => { if (captchaType !== "Default") { if (!clientId || !clientSecret) { return true; @@ -62,14 +52,14 @@ export const CaptchaPreview = ({ return false; }; - const onOk = (captchaType, captchaToken, secret) => { - UserBackend.verifyCaptcha(captchaType, captchaToken, secret).then(() => { - setOpen(false); + const onOk = (captchaType, captchaToken, clientSecret) => { + UserBackend.verifyCaptcha(captchaType, captchaToken, clientSecret).then(() => { + setVisible(false); }); }; const onCancel = () => { - setOpen(false); + setVisible(false); }; return ( @@ -78,23 +68,17 @@ export const CaptchaPreview = ({ style={{fontSize: 14}} type={"primary"} onClick={clickPreview} - disabled={getButtonDisabled()} + disabled={isButtonDisabled()} > {i18next.t("general:Preview")} ); diff --git a/web/src/common/CaptchaWidget.js b/web/src/common/CaptchaWidget.js index 95432cb4..58523c25 100644 --- a/web/src/common/CaptchaWidget.js +++ b/web/src/common/CaptchaWidget.js @@ -14,7 +14,9 @@ import React, {useEffect} from "react"; -export const CaptchaWidget = ({captchaType, subType, siteKey, clientSecret, onChange, clientId2, clientSecret2}) => { +export const CaptchaWidget = (props) => { + const {captchaType, subType, siteKey, clientSecret, clientId2, clientSecret2, onChange} = props; + const loadScript = (src) => { const tag = document.createElement("script"); tag.async = false; diff --git a/web/src/common/SendCodeInput.js b/web/src/common/SendCodeInput.js index 88f2f6f3..868e90f0 100644 --- a/web/src/common/SendCodeInput.js +++ b/web/src/common/SendCodeInput.js @@ -12,29 +12,21 @@ // See the License for the specific language governing permissions and // limitations under the License. -import {Button, Col, Input, Modal, Row} from "antd"; +import {Button, Input} from "antd"; import React from "react"; import i18next from "i18next"; import * as UserBackend from "../backend/UserBackend"; import {SafetyOutlined} from "@ant-design/icons"; -import {CaptchaWidget} from "./CaptchaWidget"; +import {CaptchaModal} from "./CaptchaModal"; const {Search} = Input; export const SendCodeInput = (props) => { const {disabled, textBefore, onChange, onButtonClickArgs, application, method, countryCode} = props; const [visible, setVisible] = React.useState(false); - const [key, setKey] = React.useState(""); - const [captchaImg, setCaptchaImg] = React.useState(""); - const [checkType, setCheckType] = React.useState(""); - const [checkId, setCheckId] = React.useState(""); + const [buttonLeftTime, setButtonLeftTime] = React.useState(0); const [buttonLoading, setButtonLoading] = React.useState(false); - const [buttonDisabled, setButtonDisabled] = React.useState(true); - const [clientId, setClientId] = React.useState(""); - const [subType, setSubType] = React.useState(""); - const [clientId2, setClientId2] = React.useState(""); - const [clientSecret2, setClientSecret2] = React.useState(""); const handleCountDown = (leftTime = 60) => { let leftTimeSecond = leftTime; @@ -50,11 +42,10 @@ export const SendCodeInput = (props) => { setTimeout(countDown, 1000); }; - const handleOk = () => { + const handleOk = (captchaType, captchaToken, clintSecret) => { setVisible(false); setButtonLoading(true); - UserBackend.sendCode(checkType, checkId, key, method, countryCode, ...onButtonClickArgs).then(res => { - setKey(""); + UserBackend.sendCode(captchaType, captchaToken, clintSecret, method, countryCode, ...onButtonClickArgs).then(res => { setButtonLoading(false); if (res) { handleCountDown(60); @@ -64,76 +55,6 @@ export const SendCodeInput = (props) => { const handleCancel = () => { setVisible(false); - setKey(""); - }; - - const loadCaptcha = () => { - UserBackend.getCaptcha(application.owner, application.name, false).then(res => { - if (res.type === "none") { - UserBackend.sendCode("none", "", "", method, countryCode, ...onButtonClickArgs).then(res => { - if (res) { - handleCountDown(60); - } - }); - } else if (res.type === "Default") { - setCheckId(res.captchaId); - setCaptchaImg(res.captchaImage); - setCheckType("Default"); - setVisible(true); - } else { - setCheckType(res.type); - setClientId(res.clientId); - setCheckId(res.clientSecret); - setVisible(true); - setSubType(res.subType); - setClientId2(res.clientId2); - setClientSecret2(res.clientSecret2); - } - }); - }; - - const renderCaptcha = () => { - return ( - - - - } placeholder={i18next.t("general:Captcha")} onPressEnter={handleOk} onChange={e => setKey(e.target.value)} /> - - - ); - }; - - const onSubmit = (token) => { - setButtonDisabled(false); - setKey(token); - }; - - const renderCheck = () => { - if (checkType === "Default") { - return renderCaptcha(); - } else { - return ( - - ); - } }; return ( @@ -149,25 +70,16 @@ export const SendCodeInput = (props) => { {buttonLeftTime > 0 ? `${buttonLeftTime} s` : buttonLoading ? i18next.t("code:Sending Code") : i18next.t("code:Send Code")} } - onSearch={loadCaptcha} + onSearch={() => setVisible(true)} /> - - { - renderCheck() - } - + isCurrentProvider={false} + /> ); }; diff --git a/web/src/locales/de/data.json b/web/src/locales/de/data.json index aa3555a1..f32d97d2 100644 --- a/web/src/locales/de/data.json +++ b/web/src/locales/de/data.json @@ -38,6 +38,7 @@ "Enable signin session - Tooltip": "Aktiviere Anmeldesession - Tooltip", "Enable signup": "Anmeldung aktivieren", "Enable signup - Tooltip": "Whether to allow users to sign up", + "Failed to log in": "Failed to log in", "Failed to sign in": "Anmeldung fehlgeschlagen", "File uploaded successfully": "Datei erfolgreich hochgeladen", "Follow organization theme": "Follow organization theme", @@ -311,6 +312,7 @@ "No account?": "Kein Konto?", "Or sign in with another account": "Oder melden Sie sich mit einem anderen Konto an", "Password": "Passwort", + "Password - Tooltip": "Password - Tooltip", "Please input your Email or Phone!": "Please input your Email or Phone!", "Please input your code!": "Bitte gib deinen Code ein!", "Please input your password!": "Bitte geben Sie Ihr Passwort ein!", @@ -653,6 +655,7 @@ "The input is not valid Email!": "Die Eingabe ist ungültig!", "The input is not valid Phone!": "Die Eingabe ist nicht gültig!", "Username": "Benutzername", + "Username - Tooltip": "Username - Tooltip", "Your account has been created!": "Ihr Konto wurde erstellt!", "Your confirmed password is inconsistent with the password!": "Ihr bestätigtes Passwort stimmt nicht mit dem Passwort überein!", "sign in now": "jetzt anmelden" diff --git a/web/src/locales/en/data.json b/web/src/locales/en/data.json index df2ff35c..94df7d3c 100644 --- a/web/src/locales/en/data.json +++ b/web/src/locales/en/data.json @@ -38,6 +38,7 @@ "Enable signin session - Tooltip": "Enable signin session - Tooltip", "Enable signup": "Enable signup", "Enable signup - Tooltip": "Enable signup - Tooltip", + "Failed to log in": "Failed to log in", "Failed to sign in": "Failed to sign in", "File uploaded successfully": "File uploaded successfully", "Follow organization theme": "Follow organization theme", @@ -311,6 +312,7 @@ "No account?": "No account?", "Or sign in with another account": "Or sign in with another account", "Password": "Password", + "Password - Tooltip": "Password - Tooltip", "Please input your Email or Phone!": "Please input your Email or Phone!", "Please input your code!": "Please input your code!", "Please input your password!": "Please input your password!", @@ -653,6 +655,7 @@ "The input is not valid Email!": "The input is not valid Email!", "The input is not valid Phone!": "The input is not valid Phone!", "Username": "Username", + "Username - Tooltip": "Username - Tooltip", "Your account has been created!": "Your account has been created!", "Your confirmed password is inconsistent with the password!": "Your confirmed password is inconsistent with the password!", "sign in now": "sign in now" diff --git a/web/src/locales/es/data.json b/web/src/locales/es/data.json index 2c7eed9b..bace7d10 100644 --- a/web/src/locales/es/data.json +++ b/web/src/locales/es/data.json @@ -38,6 +38,7 @@ "Enable signin session - Tooltip": "Enable signin session - Tooltip", "Enable signup": "Habilitar nuevos registros", "Enable signup - Tooltip": "Habilitar nuevos registros - Tooltip", + "Failed to log in": "Failed to log in", "Failed to sign in": "Failed to sign in", "File uploaded successfully": "El archivo ha sido subido con éxito", "Follow organization theme": "Follow organization theme", @@ -311,6 +312,7 @@ "No account?": "¿No estás registrado?", "Or sign in with another account": "O inicia sesión con otra cuenta", "Password": "Contraseña", + "Password - Tooltip": "Password - Tooltip", "Please input your Email or Phone!": "Please input your Email or Phone!", "Please input your code!": "¡Por favor ingrese su código!", "Please input your password!": "¡Por favor ingrese su contraseña!", @@ -653,6 +655,7 @@ "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": "Username - 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" diff --git a/web/src/locales/fr/data.json b/web/src/locales/fr/data.json index 98aac943..ce08549b 100644 --- a/web/src/locales/fr/data.json +++ b/web/src/locales/fr/data.json @@ -38,6 +38,7 @@ "Enable signin session - Tooltip": "Activer la session de connexion - infobulle", "Enable signup": "Activer l'inscription", "Enable signup - Tooltip": "Whether to allow users to sign up", + "Failed to log in": "Failed to log in", "Failed to sign in": "Failed to sign in", "File uploaded successfully": "Fichier téléchargé avec succès", "Follow organization theme": "Follow organization theme", @@ -311,6 +312,7 @@ "No account?": "Pas de compte ?", "Or sign in with another account": "Ou connectez-vous avec un autre compte", "Password": "Mot de passe", + "Password - Tooltip": "Password - Tooltip", "Please input your Email or Phone!": "Please input your Email or Phone!", "Please input your code!": "Veuillez saisir votre code !", "Please input your password!": "Veuillez saisir votre mot de passe !", @@ -653,6 +655,7 @@ "The input is not valid Email!": "L'entrée n'est pas un email valide !", "The input is not valid Phone!": "L'entrée n'est pas un téléphone valide !", "Username": "Nom d'utilisateur", + "Username - Tooltip": "Username - Tooltip", "Your account has been created!": "Votre compte a été créé !", "Your confirmed password is inconsistent with the password!": "Votre mot de passe confirmé est incompatible avec le mot de passe !", "sign in now": "connectez-vous maintenant" diff --git a/web/src/locales/ja/data.json b/web/src/locales/ja/data.json index 0e821df9..1ee1beaa 100644 --- a/web/src/locales/ja/data.json +++ b/web/src/locales/ja/data.json @@ -38,6 +38,7 @@ "Enable signin session - Tooltip": "Enable signin session - Tooltip", "Enable signup": "サインアップを有効にする", "Enable signup - Tooltip": "Whether to allow users to sign up", + "Failed to log in": "Failed to log in", "Failed to sign in": "Failed to sign in", "File uploaded successfully": "ファイルが正常にアップロードされました", "Follow organization theme": "Follow organization theme", @@ -311,6 +312,7 @@ "No account?": "アカウントがありませんか?", "Or sign in with another account": "または別のアカウントでサインイン", "Password": "パスワード", + "Password - Tooltip": "Password - Tooltip", "Please input your Email or Phone!": "Please input your Email or Phone!", "Please input your code!": "コードを入力してください!", "Please input your password!": "パスワードを入力してください!", @@ -653,6 +655,7 @@ "The input is not valid Email!": "入力されたメールアドレスが無効です!", "The input is not valid Phone!": "入力された電話番号が正しくありません!", "Username": "ユーザー名", + "Username - Tooltip": "Username - Tooltip", "Your account has been created!": "あなたのアカウントが作成されました!", "Your confirmed password is inconsistent with the password!": "確認されたパスワードがパスワードと一致していません!", "sign in now": "今すぐサインイン" diff --git a/web/src/locales/ko/data.json b/web/src/locales/ko/data.json index 40540628..0cc3859e 100644 --- a/web/src/locales/ko/data.json +++ b/web/src/locales/ko/data.json @@ -38,6 +38,7 @@ "Enable signin session - Tooltip": "Enable signin session - Tooltip", "Enable signup": "Enable signup", "Enable signup - Tooltip": "Whether to allow users to sign up", + "Failed to log in": "Failed to log in", "Failed to sign in": "Failed to sign in", "File uploaded successfully": "File uploaded successfully", "Follow organization theme": "Follow organization theme", @@ -311,6 +312,7 @@ "No account?": "No account?", "Or sign in with another account": "Or sign in with another account", "Password": "Password", + "Password - Tooltip": "Password - Tooltip", "Please input your Email or Phone!": "Please input your Email or Phone!", "Please input your code!": "Please input your code!", "Please input your password!": "Please input your password!", @@ -653,6 +655,7 @@ "The input is not valid Email!": "The input is not valid Email!", "The input is not valid Phone!": "The input is not valid Phone!", "Username": "Username", + "Username - Tooltip": "Username - Tooltip", "Your account has been created!": "Your account has been created!", "Your confirmed password is inconsistent with the password!": "Your confirmed password is inconsistent with the password!", "sign in now": "sign in now" diff --git a/web/src/locales/ru/data.json b/web/src/locales/ru/data.json index 3eb98956..a768e91d 100644 --- a/web/src/locales/ru/data.json +++ b/web/src/locales/ru/data.json @@ -38,6 +38,7 @@ "Enable signin session - Tooltip": "Включить сеанс входа - Подсказка", "Enable signup": "Включить регистрацию", "Enable signup - Tooltip": "Whether to allow users to sign up", + "Failed to log in": "Failed to log in", "Failed to sign in": "Failed to sign in", "File uploaded successfully": "Файл успешно загружен", "Follow organization theme": "Follow organization theme", @@ -311,6 +312,7 @@ "No account?": "Нет учетной записи?", "Or sign in with another account": "Или войти с помощью другой учетной записи", "Password": "Пароль", + "Password - Tooltip": "Password - Tooltip", "Please input your Email or Phone!": "Please input your Email or Phone!", "Please input your code!": "Пожалуйста, введите ваш код!", "Please input your password!": "Пожалуйста, введите ваш пароль!", @@ -653,6 +655,7 @@ "The input is not valid Email!": "Ввод не является допустимым Email!", "The input is not valid Phone!": "Введен неверный телефон!", "Username": "Имя пользователя", + "Username - Tooltip": "Username - Tooltip", "Your account has been created!": "Ваша учетная запись была создана!", "Your confirmed password is inconsistent with the password!": "Подтвержденный пароль не соответствует паролю!", "sign in now": "войти сейчас" diff --git a/web/src/locales/vi/data.json b/web/src/locales/vi/data.json index dffc74c5..b73e149a 100644 --- a/web/src/locales/vi/data.json +++ b/web/src/locales/vi/data.json @@ -38,6 +38,7 @@ "Enable signin session - Tooltip": "Enable signin session - Tooltip", "Enable signup": "Enable signup", "Enable signup - Tooltip": "Enable signup - Tooltip", + "Failed to log in": "Failed to log in", "Failed to sign in": "Failed to sign in", "File uploaded successfully": "File uploaded successfully", "Follow organization theme": "Follow organization theme", @@ -311,6 +312,7 @@ "No account?": "No account?", "Or sign in with another account": "Or sign in with another account", "Password": "Password", + "Password - Tooltip": "Password - Tooltip", "Please input your Email or Phone!": "Please input your Email or Phone!", "Please input your code!": "Please input your code!", "Please input your password!": "Please input your password!", @@ -653,6 +655,7 @@ "The input is not valid Email!": "The input is not valid Email!", "The input is not valid Phone!": "The input is not valid Phone!", "Username": "Username", + "Username - Tooltip": "Username - Tooltip", "Your account has been created!": "Your account has been created!", "Your confirmed password is inconsistent with the password!": "Your confirmed password is inconsistent with the password!", "sign in now": "sign in now" diff --git a/web/src/locales/zh/data.json b/web/src/locales/zh/data.json index 7a6b804f..69c2c578 100644 --- a/web/src/locales/zh/data.json +++ b/web/src/locales/zh/data.json @@ -38,6 +38,7 @@ "Enable signin session - Tooltip": "从应用登录Casdoor后,Casdoor是否保持会话", "Enable signup": "启用注册", "Enable signup - Tooltip": "是否允许用户注册", + "Failed to log in": "登录失败", "Failed to sign in": "登录失败", "File uploaded successfully": "文件上传成功", "Follow organization theme": "使用组织主题", @@ -311,6 +312,7 @@ "No account?": "没有账号?", "Or sign in with another account": "或者,登录其他账号", "Password": "密码", + "Password - Tooltip": "密码", "Please input your Email or Phone!": "请输入您的Email或手机号!", "Please input your code!": "请输入您的验证码!", "Please input your password!": "请输入您的密码!", @@ -653,6 +655,7 @@ "The input is not valid Email!": "您输入的电子邮箱格式有误!", "The input is not valid Phone!": "您输入的手机号格式有误!", "Username": "用户名", + "Username - Tooltip": "唯一的用户名", "Your account has been created!": "您的账号已创建!", "Your confirmed password is inconsistent with the password!": "您两次输入的密码不一致!", "sign in now": "立即登录"