diff --git a/source/components/form/login.mjs b/source/components/form/login.mjs index 9b755ee8802c49285d4f6e42a1395a2682cc7b45..ce35c5aa3436ac5ed3df012e3d5afad8c46daf29 100644 --- a/source/components/form/login.mjs +++ b/source/components/form/login.mjs @@ -10,22 +10,22 @@ * For more information about purchasing a commercial license, please contact schukai GmbH. */ -import {instanceSymbol} from "../../constants.mjs"; -import {addAttributeToken} from "../../dom/attributes.mjs"; +import { instanceSymbol } from "../../constants.mjs"; +import { addAttributeToken } from "../../dom/attributes.mjs"; import { - ATTRIBUTE_ERRORMESSAGE, - ATTRIBUTE_ROLE, + ATTRIBUTE_ERRORMESSAGE, + ATTRIBUTE_ROLE, } from "../../dom/constants.mjs"; -import {CustomControl} from "../../dom/customcontrol.mjs"; -import {CustomElement} from "../../dom/customelement.mjs"; +import { CustomControl } from "../../dom/customcontrol.mjs"; +import { CustomElement } from "../../dom/customelement.mjs"; import { - assembleMethodSymbol, - registerCustomElement, + assembleMethodSymbol, + registerCustomElement, } from "../../dom/customelement.mjs"; -import {findTargetElementFromEvent} from "../../dom/events.mjs"; -import {isFunction} from "../../types/is.mjs"; -import {LoginStyleSheet} from "./stylesheet/login.mjs"; -import {fireCustomEvent} from "../../dom/events.mjs"; +import { findTargetElementFromEvent } from "../../dom/events.mjs"; +import { isFunction } from "../../types/is.mjs"; +import { LoginStyleSheet } from "./stylesheet/login.mjs"; +import { fireCustomEvent } from "../../dom/events.mjs"; import "./form.mjs"; import "./field-set.mjs"; @@ -35,11 +35,11 @@ import "./digits.mjs"; import "../layout/collapse.mjs"; import "../datatable/datasource/rest.mjs"; -import {InvalidStyleSheet} from "./stylesheet/invalid.mjs"; -import {getLocaleOfDocument} from "../../dom/locale.mjs"; -import {getWindow} from "../../dom/util.mjs"; +import { InvalidStyleSheet } from "./stylesheet/invalid.mjs"; +import { getLocaleOfDocument } from "../../dom/locale.mjs"; +import { getWindow } from "../../dom/util.mjs"; -export {Login}; +export { Login }; /** * @private @@ -131,860 +131,857 @@ const digitsCollapseSymbol = Symbol("digitsCollapse"); * @summary A beautiful Login that can make your life easier and also looks good. It supports a lot of features. */ class Login extends CustomElement { - /** - * This method is called by the `instanceof` operator. - * @returns {symbol} - */ - static get [instanceSymbol]() { - return Symbol.for("@schukai/monster/components/form/login@@instance"); - } - - /** - * - * @return {Components.Form.Login - */ - [assembleMethodSymbol]() { - super[assembleMethodSymbol](); - - setTimeout(() => { - initControlReferences.call(this); - initEventHandler.call(this); - - setTimeout(() => { - this.shadowRoot.querySelector("input[name='username']").focus(); - }, 100); - }, 0); - return this; - } - - /** - * To set the options via the HTML Tag, the attribute `data-monster-options` must be used. - * @see {@link https://monsterjs.org/en/doc/#configurate-a-monster-control} - * - * The individual configuration values can be found in the table. - * - * @property {Object} templates Template definitions - * @property {string} templates.main Main template - * @property {Object} labels Label definitions - * @property {Object} classes Class definitions - * @property {string} classes.usernameInvalid Class for invalid - * @property {string} classes.passwordInvalid Class for invalid - * @property {string} classes.emailInvalid Class for invalid - * @property {boolean} disabled Disabled - * @property {Object} features Feature definitions - * @property {boolean} features.forgotPassword Forgot Password enabled - * @property {boolean} features.redirectToFirstSuccessUrl Redirect to first success URL - * @property {Object} actions Action definitions - * @property {number} digits Digits - * @property {Object[]} successUrls Success URLs - * @property {string} successUrls.label Label - * @property {string} successUrls.url URL - * @property {number} timeoutForMessage Timeout for message - * @property {number} timeoutForSuccess Timeout for success - * @property {Object} accessKeys Access keys - * @property {string} accessKeys.loginLink Login link - * @property {string} accessKeys.username Username - * @property {string} accessKeys.password Password - * @property {Object} fetch Fetch definitions - * @property {Object} fetch.login Login fetch - * @property {string} fetch.login.url URL - * @property {string} fetch.login.method Method - * @property {string} fetch.login.mode Mode - * @property {Object} fetch.login.headers Headers - * @property {string} fetch.login.headers.accept Accept - * @property {string} fetch.login.credentials Credentials - * @property {Object} fetch.forgotPassword Forgot Password fetch - * @property {string} fetch.forgotPassword.url URL - * @property {string} fetch.forgotPassword.method Method - * @property {string} fetch.forgotPassword.mode Mode - * @property {Object} fetch.forgotPassword.headers Headers - * @property {string} fetch.forgotPassword.headers.accept Accept - * @property {string} fetch.forgotPassword.credentials Credentials - * @property {Object} fetch.digits Digits fetch - * @property {string} fetch.digits.url URL - * @property {string} fetch.digits.method Method - * @property {string} fetch.digits.mode Mode - * @property {Object} fetch.digits.headers Headers - * @property {string} fetch.digits.headers.accept Accept - * @property {string} fetch.digits.credentials Credentials - * @property {Object} fetch.secondFactor Second Factor fetch - * @property {string} fetch.secondFactor.url URL - * @property {string} fetch.secondFactor.method Method - * @property {string} fetch.secondFactor.mode Mode - * @property {Object} fetch.secondFactor.headers Headers - * @property {string} fetch.secondFactor.headers.accept Accept - * @property {string} fetch.secondFactor.credentials Credentials - */ - get defaults() { - return Object.assign({}, super.defaults, { - templates: { - main: getTemplate(), - }, - labels: getTranslations(), - classes: { - usernameInvalid: "", - passwordInvalid: "", - emailInvalid: "", - }, - disabled: false, - features: { - forgotPassword: true, - redirectToFirstSuccessUrl: false, - }, - actions: {}, - - digits: 6, - - successUrls: [ - { - label: "Home", - url: "/", - }, - { - label: "Logout", - url: "/logout", - }, - ], - - timeoutForMessage: 3500, - timeoutForSuccess: 1000, - - accessKeys: { - loginLink: "x", - username: "u", - password: "p", - }, - - fetch: { - login: { - url: "", - method: "POST", - mode: "same-origin", - headers: { - "Accept": "application/json", - "Content-Type": "application/json; charset=utf-8", - }, - credentials: "same-origin", - }, - forgotPassword: { - url: "", - method: "POST", - mode: "same-origin", - headers: { - "Accept": "application/json", - "Content-Type": "application/json; charset=utf-8", - }, - credentials: "same-origin", - }, - digits: { - url: "", - method: "POST", - mode: "same-origin", - headers: { - "Accept": "application/json", - "Content-Type": "application/json; charset=utf-8", - }, - credentials: "same-origin", - }, - secondFactor: { - url: "", - method: "POST", - mode: "same-origin", - headers: { - "Accept": "application/json", - "Content-Type": "application/json; charset=utf-8", - }, - credentials: "same-origin", - }, - }, - }); - } - - /** - * Opens the login collapse and focuses the username control. - * - * @returns {Login} - */ - openLogin() { - this[loginCollapseSymbol].open(); - this.shadowRoot.querySelector("input[name='username']").focus(); - return this; - } - - /** - * Opens the forgot password collapse. If the feature `forgotPassword` is not enabled, an error will be thrown. - * - * @returns {Login} - * @throws {Error} If the feature is not enabled - */ - openForgotPassword() { - if (!this.getOption("features.forgotPassword")) { - throw new Error("Forgot Password is not enabled"); - } - - this[forgotPasswordCollapseSymbol].open(); - return this; - } - - /** - * Opens the second factor collapse and focuses the second factor control. - * @returns {Login} - */ - openSecondFactor() { - this[secondFactorCollapseSymbol].open(); - this.shadowRoot.getElementById("secondFactorButton").focus(); - return this; - } - - /** - * Opens the digits collapse and focuses the digits control. - * @returns {Login} - */ - openDigits() { - this[digitsCollapseSymbol].open(); - this.shadowRoot.getElementById("digitsControl").focus(); - return this; - } - - /** - * Opens the logged in collapse. If the feature `redirectToFirstSuccessUrl` is enabled, the user will be redirected to the first success URL. - * - * @returns {Login} - */ - openLoggedIn() { - this[loggedInCollapseSymbol].open(); - - if (this.getOption("features.redirectToFirstSuccessUrl")) { - setTimeout(() => { - - const successUrl = this.getOption("successUrls"); - if (successUrl.length > 0) { - const success = successUrl[0].url; - if (success) { - getWindow().location.href = success; - } - } - - }, this.getOption("timeoutForSuccess")); - - return; - - } - - return this; - } - - /** - * @return {string} - */ - static getTag() { - return "monster-login"; - } - - /** - * @return {CSSStyleSheet[]} - */ - static getCSSStyleSheet() { - return [LoginStyleSheet, InvalidStyleSheet]; - } + /** + * This method is called by the `instanceof` operator. + * @returns {symbol} + */ + static get [instanceSymbol]() { + return Symbol.for("@schukai/monster/components/form/login@@instance"); + } + + /** + * + * @return {Components.Form.Login + */ + [assembleMethodSymbol]() { + super[assembleMethodSymbol](); + + setTimeout(() => { + initControlReferences.call(this); + initEventHandler.call(this); + + setTimeout(() => { + this.shadowRoot.querySelector("input[name='username']").focus(); + }, 100); + }, 0); + return this; + } + + /** + * To set the options via the HTML Tag, the attribute `data-monster-options` must be used. + * @see {@link https://monsterjs.org/en/doc/#configurate-a-monster-control} + * + * The individual configuration values can be found in the table. + * + * @property {Object} templates Template definitions + * @property {string} templates.main Main template + * @property {Object} labels Label definitions + * @property {Object} classes Class definitions + * @property {string} classes.usernameInvalid Class for invalid + * @property {string} classes.passwordInvalid Class for invalid + * @property {string} classes.emailInvalid Class for invalid + * @property {boolean} disabled Disabled + * @property {Object} features Feature definitions + * @property {boolean} features.forgotPassword Forgot Password enabled + * @property {boolean} features.redirectToFirstSuccessUrl Redirect to first success URL + * @property {Object} actions Action definitions + * @property {number} digits Digits + * @property {Object[]} successUrls Success URLs + * @property {string} successUrls.label Label + * @property {string} successUrls.url URL + * @property {number} timeoutForMessage Timeout for message + * @property {number} timeoutForSuccess Timeout for success + * @property {Object} accessKeys Access keys + * @property {string} accessKeys.loginLink Login link + * @property {string} accessKeys.username Username + * @property {string} accessKeys.password Password + * @property {Object} fetch Fetch definitions + * @property {Object} fetch.login Login fetch + * @property {string} fetch.login.url URL + * @property {string} fetch.login.method Method + * @property {string} fetch.login.mode Mode + * @property {Object} fetch.login.headers Headers + * @property {string} fetch.login.headers.accept Accept + * @property {string} fetch.login.credentials Credentials + * @property {Object} fetch.forgotPassword Forgot Password fetch + * @property {string} fetch.forgotPassword.url URL + * @property {string} fetch.forgotPassword.method Method + * @property {string} fetch.forgotPassword.mode Mode + * @property {Object} fetch.forgotPassword.headers Headers + * @property {string} fetch.forgotPassword.headers.accept Accept + * @property {string} fetch.forgotPassword.credentials Credentials + * @property {Object} fetch.digits Digits fetch + * @property {string} fetch.digits.url URL + * @property {string} fetch.digits.method Method + * @property {string} fetch.digits.mode Mode + * @property {Object} fetch.digits.headers Headers + * @property {string} fetch.digits.headers.accept Accept + * @property {string} fetch.digits.credentials Credentials + * @property {Object} fetch.secondFactor Second Factor fetch + * @property {string} fetch.secondFactor.url URL + * @property {string} fetch.secondFactor.method Method + * @property {string} fetch.secondFactor.mode Mode + * @property {Object} fetch.secondFactor.headers Headers + * @property {string} fetch.secondFactor.headers.accept Accept + * @property {string} fetch.secondFactor.credentials Credentials + */ + get defaults() { + return Object.assign({}, super.defaults, { + templates: { + main: getTemplate(), + }, + labels: getTranslations(), + classes: { + usernameInvalid: "", + passwordInvalid: "", + emailInvalid: "", + }, + disabled: false, + features: { + forgotPassword: true, + redirectToFirstSuccessUrl: false, + }, + actions: {}, + + digits: 6, + + successUrls: [ + { + label: "Home", + url: "/", + }, + { + label: "Logout", + url: "/logout", + }, + ], + + timeoutForMessage: 3500, + timeoutForSuccess: 1000, + + accessKeys: { + loginLink: "x", + username: "u", + password: "p", + }, + + fetch: { + login: { + url: "", + method: "POST", + mode: "same-origin", + headers: { + Accept: "application/json", + "Content-Type": "application/json; charset=utf-8", + }, + credentials: "same-origin", + }, + forgotPassword: { + url: "", + method: "POST", + mode: "same-origin", + headers: { + Accept: "application/json", + "Content-Type": "application/json; charset=utf-8", + }, + credentials: "same-origin", + }, + digits: { + url: "", + method: "POST", + mode: "same-origin", + headers: { + Accept: "application/json", + "Content-Type": "application/json; charset=utf-8", + }, + credentials: "same-origin", + }, + secondFactor: { + url: "", + method: "POST", + mode: "same-origin", + headers: { + Accept: "application/json", + "Content-Type": "application/json; charset=utf-8", + }, + credentials: "same-origin", + }, + }, + }); + } + + /** + * Opens the login collapse and focuses the username control. + * + * @returns {Login} + */ + openLogin() { + this[loginCollapseSymbol].open(); + this.shadowRoot.querySelector("input[name='username']").focus(); + return this; + } + + /** + * Opens the forgot password collapse. If the feature `forgotPassword` is not enabled, an error will be thrown. + * + * @returns {Login} + * @throws {Error} If the feature is not enabled + */ + openForgotPassword() { + if (!this.getOption("features.forgotPassword")) { + throw new Error("Forgot Password is not enabled"); + } + + this[forgotPasswordCollapseSymbol].open(); + return this; + } + + /** + * Opens the second factor collapse and focuses the second factor control. + * @returns {Login} + */ + openSecondFactor() { + this[secondFactorCollapseSymbol].open(); + this.shadowRoot.getElementById("secondFactorButton").focus(); + return this; + } + + /** + * Opens the digits collapse and focuses the digits control. + * @returns {Login} + */ + openDigits() { + this[digitsCollapseSymbol].open(); + this.shadowRoot.getElementById("digitsControl").focus(); + return this; + } + + /** + * Opens the logged in collapse. If the feature `redirectToFirstSuccessUrl` is enabled, the user will be redirected to the first success URL. + * + * @returns {Login} + */ + openLoggedIn() { + this[loggedInCollapseSymbol].open(); + + if (this.getOption("features.redirectToFirstSuccessUrl")) { + setTimeout(() => { + const successUrl = this.getOption("successUrls"); + if (successUrl.length > 0) { + const success = successUrl[0].url; + if (success) { + getWindow().location.href = success; + } + } + }, this.getOption("timeoutForSuccess")); + + return; + } + + return this; + } + + /** + * @return {string} + */ + static getTag() { + return "monster-login"; + } + + /** + * @return {CSSStyleSheet[]} + */ + static getCSSStyleSheet() { + return [LoginStyleSheet, InvalidStyleSheet]; + } } function getTranslations() { - const locale = getLocaleOfDocument(); - switch (locale.language) { - case "de": - return { - username: "Benutzername oder E-Mail", - password: "Passwort", - login: "Anmelden", - forgotPasswordLink: "Passwort vergessen?", - mailAddress: "E-Mail-Adresse", - requestLink: "Link anfordern", - digits: "Code", - loginLink: "Anmelden", - secondFactor: "Zweiter Faktor Code", - sendDigits: "Code senden", - sendSecondFactorDigits: "Code senden", - resetLoginProcess: "Zurück zum Login", - messageEmptyUserName: "Bitte geben Sie Ihren Benutzernamen ein", - messageEmptyPassword: "Bitte geben Sie Ihr Passwort ein", - messageEmptyBoth: - "Bitte geben Sie Ihren Benutzernamen und Ihr Passwort ein", - messageEmptyEmail: "Bitte geben Sie Ihre E-Mail-Adresse ein", - messageInvalidEmail: "Bitte geben Sie eine gültige E-Mail-Adresse ein", - digitsEmpty: "Bitte geben Sie Ihren Code ein", - digitsInvalid: "Bitte geben Sie einen gültigen Code ein", - messageLoginFailed: - "Anmeldung fehlgeschlagen, bitte überprüfen Sie Ihre Eingaben.", - messageForbidden: - "Die Anmeldung war erfolgreich, aber Sie haben keine Berechtigung. Sie können sich <b>nicht</b> anmelden.<br>Sie können einen anderen Benutzer auswählen oder sich an den Administrator wenden.", - messageSomethingWentWrong: - "Etwas ist schief gelaufen, bitte versuchen Sie es später erneut", - messageThisFormIsNotConfigured: - "Dieses Formular ist nicht konfiguriert.", - messagePasswordResetDisabled: - "Diese Funktion funktioniert nicht, da die Zwei-Faktor-Authentifizierung bei Ihrem Konto aktiviert ist.<br>Bitte kontaktieren Sie den Administrator.", - }; - case "es": - return { - username: "Nombre de usuario o correo electrónico", - password: "Contraseña", - login: "Iniciar sesión", - forgotPasswordLink: "¿Olvidaste tu contraseña?", - mailAddress: "Dirección de correo electrónico", - requestLink: "Solicitar enlace", - digits: "Código", - loginLink: "Iniciar sesión", - secondFactor: "Código de segundo factor", - sendDigits: "Enviar código", - sendSecondFactorDigits: "Enviar código", - resetLoginProcess: "Volver al inicio de sesión", - messageEmptyUserName: "Por favor ingrese su nombre de usuario", - messageEmptyPassword: "Por favor ingrese su contraseña", - messageEmptyBoth: "Por favor ingrese su nombre de usuario y contraseña", - messageEmptyEmail: - "Por favor ingrese su dirección de correo electrónico", - messageInvalidEmail: - "Por favor ingrese una dirección de correo electrónico válida", - digitsEmpty: "Por favor ingrese su código", - digitsInvalid: "Por favor ingrese un código válido", - messageLoginFailed: - "Error al iniciar sesión, por favor verifique sus datos.", - messageForbidden: - "El inicio de sesión fue exitoso, pero no tienes permisos. <b>No puedes</b> iniciar sesión.<br>Puedes seleccionar otro usuario o contactar al administrador.", - messageSomethingWentWrong: - "Algo salió mal, por favor intenta de nuevo más tarde.", - messageThisFormIsNotConfigured: "Este formulario no está configurado.", - messagePasswordResetDisabled: - "Esta función no funciona porque la autenticación de dos factores está activada en su cuenta. Por favor, póngase en contacto con el administrador.", - }; - case "zh": - return { - username: "用户名或电子邮箱", - password: "密码", - login: "登录", - forgotPasswordLink: "忘记密码?", - mailAddress: "电子邮件地址", - requestLink: "请求链接", - digits: "验证码", - loginLink: "登录", - secondFactor: "二次验证码", - sendDigits: "发送验证码", - sendSecondFactorDigits: "发送验证码", - resetLoginProcess: "返回登录", - messageEmptyUserName: "请输入用户名", - messageEmptyPassword: "请输入密码", - messageEmptyBoth: "请输入用户名和密码", - messageEmptyEmail: "请输入电子邮件地址", - messageInvalidEmail: "请输入有效的电子邮件地址", - digitsEmpty: "请输入验证码", - digitsInvalid: "请输入有效的验证码", - messageLoginFailed: "登录失败,请检查您的输入。", - messageForbidden: - "登录成功,但您没有权限。您<b>不能</b>登录。<br>您可以选择其他用户或联系管理员。", - messageSomethingWentWrong: "出了点问题,请稍后再试。", - messageThisFormIsNotConfigured: "此表单尚未配置。", - messagePasswordResetDisabled: - "此功能无法使用,因为您的帐户启用了双因素身份验证。请联系管理员。", - }; - - case "hi": - return { - username: "उपयोगकर्ता नाम या ई-मेल", - password: "पासवर्ड", - login: "लॉग इन करें", - forgotPasswordLink: "पासवर्ड भूल गए?", - mailAddress: "ई-मेल पता", - requestLink: "लिंक का अनुरोध करें", - digits: "कोड", - loginLink: "लॉग इन करें", - secondFactor: "दूसरा फैक्टर कोड", - sendDigits: "कोड भेजें", - sendSecondFactorDigits: "कोड भेजें", - resetLoginProcess: "लॉगिन पर वापस जाएं", - messageEmptyUserName: "कृपया अपना उपयोगकर्ता नाम दर्ज करें", - messageEmptyPassword: "कृपया अपना पासवर्ड दर्ज करें", - messageEmptyBoth: "कृपया अपना उपयोगकर्ता नाम और पासवर्ड दर्ज करें", - messageEmptyEmail: "कृपया अपना ई-मेल पता दर्ज करें", - messageInvalidEmail: "कृपया एक वैध ई-मेल पता दर्ज करें", - digitsEmpty: "कृपया अपना कोड दर्ज करें", - digitsInvalid: "कृपया एक वैध कोड दर्ज करें", - messageLoginFailed: "लॉगिन विफल हुआ, कृपया अपनी जानकारी की जांच करें।", - messageForbidden: - "लॉगिन सफल रहा लेकिन आपके पास अनुमति नहीं है। आप <b>लॉगिन नहीं</b> कर सकते।<br>आप दूसरा उपयोगकर्ता चुन सकते हैं या प्रशासक से संपर्क कर सकते हैं।", - messageSomethingWentWrong: "कुछ गलत हुआ, कृपया बाद में पुनः प्रयास करें।", - messageThisFormIsNotConfigured: "यह फ़ॉर्म कॉन्फ़िगर नहीं है।", - messagePasswordResetDisabled: - "यह सुविधा काम नहीं करती क्योंकि आपके खाते में दो घटक प्रमाणीकरण सक्षम है। कृपया प्रशासक से संपर्क करें।", - }; - - case "bn": - return { - username: "ইউজারনেম বা ই-মেইল", - password: "পাসওয়ার্ড", - login: "লগইন করুন", - forgotPasswordLink: "পাসওয়ার্ড ভুলে গেছেন?", - mailAddress: "ই-মেইল ঠিকানা", - requestLink: "লিংক অনুরোধ করুন", - digits: "কোড", - loginLink: "লগইন করুন", - secondFactor: "দ্বিতীয় ফ্যাক্টর কোড", - sendDigits: "কোড পাঠান", - sendSecondFactorDigits: "কোড পাঠান", - resetLoginProcess: "লগইনে ফিরে যান", - messageEmptyUserName: "দয়া করে আপনার ইউজারনেম লিখুন", - messageEmptyPassword: "দয়া করে আপনার পাসওয়ার্ড লিখুন", - messageEmptyBoth: "দয়া করে আপনার ইউজারনেম এবং পাসওয়ার্ড লিখুন", - messageEmptyEmail: "দয়া করে আপনার ই-মেইল ঠিকানা লিখুন", - messageInvalidEmail: "দয়া করে একটি বৈধ ই-মেইল ঠিকানা লিখুন", - digitsEmpty: "দয়া করে আপনার কোড লিখুন", - digitsInvalid: "দয়া করে একটি বৈধ কোড লিখুন", - messageLoginFailed: "লগইন ব্যর্থ হয়েছে, দয়া করে আপনার ইনপুট পরীক্ষা করুন।", - messageForbidden: - "লগইন সফল হয়েছে, কিন্তু আপনার অনুমতি নেই। আপনি <b>লগইন করতে পারবেন না</b>।<br>আপনি অন্য ইউজার নির্বাচন করতে পারেন অথবা অ্যাডমিনিস্ট্রেটরের সাথে যোগাযোগ করতে পারেন।", - messageSomethingWentWrong: "কিছু ভুল হয়েছে, দয়া করে পরে আবার চেষ্টা করুন।", - messageThisFormIsNotConfigured: "এই ফর্মটি কনফিগার করা হয়নি।", - messagePasswordResetDisabled: - "এই ফাংশনটি কার্যকর নয় কারণ আপনার অ্যাকাউন্টে দুটি ফ্যাক্টর প্রমাণীকরণ সক্রিয় করা আছে। দয়া করে প্রশাসকের সাথে যোগাযোগ করুন।", - }; - - case "pt": // Portuguese - return { - username: "Nome de usuário ou e-mail", - password: "Senha", - login: "Entrar", - forgotPasswordLink: "Esqueceu a senha?", - mailAddress: "Endereço de e-mail", - requestLink: "Solicitar link", - digits: "Código", - loginLink: "Entrar", - secondFactor: "Código do segundo fator", - sendDigits: "Enviar código", - sendSecondFactorDigits: "Enviar código", - resetLoginProcess: "Voltar ao login", - messageEmptyUserName: "Por favor, insira seu nome de usuário", - messageEmptyPassword: "Por favor, insira sua senha", - messageEmptyBoth: "Por favor, insira seu nome de usuário e senha", - messageEmptyEmail: "Por favor, insira seu endereço de e-mail", - messageInvalidEmail: "Por favor, insira um endereço de e-mail válido", - digitsEmpty: "Por favor, insira seu código", - digitsInvalid: "Por favor, insira um código válido", - messageLoginFailed: "Falha no login, verifique suas informações.", - messageForbidden: - "Login foi bem-sucedido, mas você não tem permissão. Você <b>não pode</b> entrar.<br>Você pode escolher outro usuário ou entrar em contato com o administrador.", - messageSomethingWentWrong: - "Algo deu errado, tente novamente mais tarde.", - messageThisFormIsNotConfigured: "Este formulário não está configurado.", - messagePasswordResetDisabled: - "Esta função não funciona porque a autenticação de dois fatores<br>está ativada em sua conta. Por favor, entre em contato com o administrador.", - }; - - case "ru": // Russian - return { - username: "Имя пользователя или электронная почта", - password: "Пароль", - login: "Войти", - forgotPasswordLink: "Забыли пароль?", - mailAddress: "Адрес электронной почты", - requestLink: "Запросить ссылку", - digits: "Код", - loginLink: "Войти", - secondFactor: "Код второго фактора", - sendDigits: "Отправить код", - sendSecondFactorDigits: "Отправить код", - resetLoginProcess: "Вернуться к входу", - messageEmptyUserName: "Пожалуйста, введите имя пользователя", - messageEmptyPassword: "Пожалуйста, введите пароль", - messageEmptyBoth: "Пожалуйста, введите имя пользователя и пароль", - messageEmptyEmail: "Пожалуйста, введите адрес электронной почты", - messageInvalidEmail: - "Пожалуйста, введите действительный адрес электронной почты", - digitsEmpty: "Пожалуйста, введите код", - digitsInvalid: "Пожалуйста, введите действительный код", - messageLoginFailed: "Ошибка входа, проверьте введенные данные.", - messageForbidden: - "Вход выполнен, но у вас нет прав. Вы <b>не можете</b> войти.<br>Вы можете выбрать другого пользователя или связаться с администратором.", - messageSomethingWentWrong: "Что-то пошло не так, попробуйте позже.", - messageThisFormIsNotConfigured: "Эта форма не настроена.", - messagePasswordResetDisabled: - "Эта функция не работает, потому что двухфакторная аутентификация<br> включена в вашей учетной записи. Пожалуйста, свяжитесь с администратором.", - }; - - case "ja": // Japanese - return { - username: "ユーザー名またはメールアドレス", - password: "パスワード", - login: "ログイン", - forgotPasswordLink: "パスワードを忘れましたか?", - mailAddress: "メールアドレス", - requestLink: "リンクをリクエスト", - digits: "コード", - loginLink: "ログイン", - secondFactor: "二要素コード", - sendDigits: "コードを送信", - sendSecondFactorDigits: "コードを送信", - resetLoginProcess: "ログインに戻る", - messageEmptyUserName: "ユーザー名を入力してください", - messageEmptyPassword: "パスワードを入力してください", - messageEmptyBoth: "ユーザー名とパスワードを入力してください", - messageEmptyEmail: "メールアドレスを入力してください", - messageInvalidEmail: "有効なメールアドレスを入力してください", - digitsEmpty: "コードを入力してください", - digitsInvalid: "有効なコードを入力してください", - messageLoginFailed: - "ログインに失敗しました。入力内容をご確認ください。", - messageForbidden: - "ログイン成功しましたが、権限がありません。<b>ログインできません</b>。<br>他のユーザーを選択するか、管理者に連絡してください。", - messageSomethingWentWrong: - "問題が発生しました。後でもう一度お試しください。", - messageThisFormIsNotConfigured: "このフォームは設定されていません。", - messagePasswordResetDisabled: - "この機能は使用できません。アカウントで二要素認証が有効になっているため、管理者に連絡してください。", - }; - - case "pa": // Western Punjabi - return { - username: "ਵਰਤੋਂਕਾਰ ਨਾਮ ਜਾਂ ਈ-ਮੇਲ", - password: "ਪਾਸਵਰਡ", - login: "ਲਾਗਿਨ ਕਰੋ", - forgotPasswordLink: "ਪਾਸਵਰਡ ਭੁੱਲ ਗਏ?", - mailAddress: "ਈ-ਮੇਲ ਪਤਾ", - requestLink: "ਲਿੰਕ ਦੀ ਬੇਨਤੀ ਕਰੋ", - digits: "ਕੋਡ", - loginLink: "ਲਾਗਿਨ ਕਰੋ", - secondFactor: "ਦੂਜਾ ਫੈਕਟਰ ਕੋਡ", - sendDigits: "ਕੋਡ ਭੇਜੋ", - sendSecondFactorDigits: "ਕੋਡ ਭੇਜੋ", - resetLoginProcess: "ਲੋਗਿਨ 'ਤੇ ਵਾਪਸ ਜਾਓ", - messageEmptyUserName: "ਕਿਰਪਾ ਕਰਕੇ ਆਪਣਾ ਵਰਤੋਂਕਾਰ ਨਾਮ ਦਰਜ ਕਰੋ", - messageEmptyPassword: "ਕਿਰਪਾ ਕਰਕੇ ਆਪਣਾ ਪਾਸਵਰਡ ਦਰਜ ਕਰੋ", - messageEmptyBoth: "ਕਿਰਪਾ ਕਰਕੇ ਆਪਣਾ ਵਰਤੋਂਕਾਰ ਨਾਮ ਤੇ ਪਾਸਵਰਡ ਦਰਜ ਕਰੋ", - messageEmptyEmail: "ਕਿਰਪਾ ਕਰਕੇ ਆਪਣਾ ਈ-ਮੇਲ ਪਤਾ ਦਰਜ ਕਰੋ", - messageInvalidEmail: "ਕਿਰਪਾ ਕਰਕੇ ਇਕ ਵੈਧ ਈ-ਮੇਲ ਪਤਾ ਦਰਜ ਕਰੋ", - digitsEmpty: "ਕਿਰਪਾ ਕਰਕੇ ਆਪਣਾ ਕੋਡ ਦਰਜ ਕਰੋ", - digitsInvalid: "ਕਿਰਪਾ ਕਰਕੇ ਇੱਕ ਵੈਧ ਕੋਡ ਦਰਜ ਕਰੋ", - messageLoginFailed: "ਲੋਗਿਨ ਅਸਫਲ ਹੋਇਆ, ਕਿਰਪਾ ਕਰਕੇ ਆਪਣੀ ਜਾਣਕਾਰੀ ਦੀ ਜਾਂਚ ਕਰੋ।", - messageForbidden: - "ਲਾਗਿਨ ਸਫਲ ਹੋਇਆ, ਪਰ ਤੁਹਾਡੇ ਕੋਲ ਅਧਿਕਾਰ ਨਹੀਂ ਹਨ। ਤੁਸੀਂ <b>ਲਾਗਿਨ ਨਹੀਂ</b> ਕਰ ਸਕਦੇ।<br>ਤੁਸੀਂ ਹੋਰ ਵਰਤੋਂਕਾਰ ਚੁਣ सकते ਹੋ ਜਾਂ ਪ੍ਰਬੰਧਕ ਨਾਲ ਸੰਪਰਕ ਕਰ ਸਕਦੇ ਹੋ।", - messageSomethingWentWrong: - "ਕੁਝ ਗਲਤ ਹੋ ਗਿਆ, ਕਿਰਪਾ ਕਰਕੇ ਬਾਅਦ ਵਿੱਚ ਮੁੜ ਕੋਸ਼ਿਸ਼ ਕਰੋ।", - messageThisFormIsNotConfigured: "ਇਸ ਫਾਰਮ ਨੂੰ ਸੰਰਚਿਤ ਨਹੀਂ ਕੀਤਾ ਗਿਆ ਹੈ।", - messagePasswordResetDisabled: - "ਇਹ ਫੰਕਸ਼ਨ ਕਾਮ ਨਹੀਂ ਕਰਦਾ ਕਿਉਂਕਿ ਤੁਹਾਡੇ ਖਾਤੇ ਵਿੱਚ ਦੋ ਫੈਕਟਰ ਪ੍ਰਮਾਣੀਕਰਣ ਸਰਗਰਮ ਹੈ। ਕਿਰਪਾ ਕਰਕੇ ਪ੍ਰਬੰਧਕ ਨਾਲ ਸੰਪਰਕ ਕਰੋ।", - }; - - case "mr": // Marathi - return { - username: "वापरकर्तानाव किंवा ईमेल", - password: "संकेतशब्द", - login: "प्रवेश करा", - forgotPasswordLink: "संकेतशब्द विसरलात का?", - mailAddress: "ईमेल पत्ता", - requestLink: "लिंकची विनंती करा", - digits: "कोड", - loginLink: "प्रवेश करा", - secondFactor: "दुसरा घटक कोड", - sendDigits: "कोड पाठवा", - sendSecondFactorDigits: "कोड पाठवा", - resetLoginProcess: "प्रवेशावर परत जा", - messageEmptyUserName: "कृपया आपले वापरकर्तानाव प्रविष्ट करा", - messageEmptyPassword: "कृपया आपला संकेतशब्द प्रविष्ट करा", - messageEmptyBoth: "कृपया आपले वापरकर्तानाव आणि संकेतशब्द प्रविष्ट करा", - messageEmptyEmail: "कृपया आपला ईमेल पत्ता प्रविष्ट करा", - messageInvalidEmail: "कृपया वैध ईमेल पत्ता प्रविष्ट करा", - digitsEmpty: "कृपया आपला कोड प्रविष्ट करा", - digitsInvalid: "कृपया वैध कोड प्रविष्ट करा", - messageLoginFailed: "प्रवेश अयशस्वी, कृपया आपली माहिती तपासा.", - messageForbidden: - "प्रवेश यशस्वी झाला, परंतु आपल्याकडे परवाना नाही. आपण <b>प्रवेश करू शकत नाही</b>.<br>आपण दुसरा वापरकर्ता निवडू शकता किंवा व्यवस्थापकाशी संपर्क साधू शकता.", - messageSomethingWentWrong: "काहीतरी चुकले, कृपया नंतर पुन्हा प्रयत्न करा.", - messageThisFormIsNotConfigured: "हे फॉर्म संरचित केलेले नाही.", - messagePasswordResetDisabled: - "या कार्याची कामगिरी करत नाही कारण आपल्या खात्यात दोन घटक प्रमाणीकरण सक्रिय केले आहे. कृपया व्यवस्थापकाशी संपर्क साधा.", - }; - - case "fr": // French - return { - username: "Nom d'utilisateur ou e-mail", - password: "Mot de passe", - login: "Connexion", - forgotPasswordLink: "Mot de passe oublié ?", - mailAddress: "Adresse e-mail", - requestLink: "Demander un lien", - digits: "Code", - loginLink: "Connexion", - secondFactor: "Code du deuxième facteur", - sendDigits: "Envoyer le code", - sendSecondFactorDigits: "Envoyer le code", - resetLoginProcess: "Retour à la connexion", - messageEmptyUserName: "Veuillez entrer votre nom d'utilisateur", - messageEmptyPassword: "Veuillez entrer votre mot de passe", - messageEmptyBoth: - "Veuillez entrer votre nom d'utilisateur et votre mot de passe", - messageEmptyEmail: "Veuillez entrer votre adresse e-mail", - messageInvalidEmail: "Veuillez entrer une adresse e-mail valide", - digitsEmpty: "Veuillez entrer votre code", - digitsInvalid: "Veuillez entrer un code valide", - messageLoginFailed: - "Échec de la connexion, veuillez vérifier vos informations.", - messageForbidden: - "La connexion a réussi, mais vous n'avez pas les permissions. Vous <b>ne pouvez pas</b> vous connecter.<br>Vous pouvez choisir un autre utilisateur ou contacter l'administrateur.", - messageSomethingWentWrong: - "Une erreur s'est produite, veuillez réessayer plus tard.", - messageThisFormIsNotConfigured: "Ce formulaire n'est pas configuré.", - messagePasswordResetDisabled: - "Cette fonctionnalité ne fonctionne pas car l'authentification à deux facteurs est activée sur<br>votre compte. Veuillez contacter l'administrateur.", - }; - - case "it": // Italian - return { - username: "Nome utente o e-mail", - password: "Password", - login: "Accedi", - forgotPasswordLink: "Password dimenticata?", - mailAddress: "Indirizzo e-mail", - requestLink: "Richiedi link", - digits: "Codice", - loginLink: "Accedi", - secondFactor: "Codice a due fattori", - sendDigits: "Invia codice", - sendSecondFactorDigits: "Invia codice", - resetLoginProcess: "Torna al login", - messageEmptyUserName: "Per favore, inserisci il tuo nome utente", - messageEmptyPassword: "Per favore, inserisci la tua password", - messageEmptyBoth: - "Per favore, inserisci il tuo nome utente e la tua password", - messageEmptyEmail: "Per favore, inserisci il tuo indirizzo e-mail", - messageInvalidEmail: "Per favore, inserisci un indirizzo e-mail valido", - digitsEmpty: "Per favore, inserisci il tuo codice", - digitsInvalid: "Per favore, inserisci un codice valido", - messageLoginFailed: "Accesso fallito, verifica i tuoi dati.", - messageForbidden: - "Accesso riuscito, ma non hai i permessi. Non puoi accedere.<br>Puoi scegliere un altro account o contattare l'amministratore.", - messageSomethingWentWrong: - "Qualcosa è andato storto, riprova più tardi.", - messageThisFormIsNotConfigured: "Questo modulo non è configurato.", - messagePasswordResetDisabled: - "Questa funzione non funziona perché l'autenticazione a due<br>fattori è attiva sul tuo account. Contatta l'amministratore.", - }; - - case "nl": // Dutch - return { - username: "Gebruikersnaam of e-mail", - password: "Wachtwoord", - login: "Inloggen", - forgotPasswordLink: "Wachtwoord vergeten?", - mailAddress: "E-mailadres", - requestLink: "Link aanvragen", - digits: "Code", - loginLink: "Inloggen", - secondFactor: "Tweede factor code", - sendDigits: "Code verzenden", - sendSecondFactorDigits: "Code verzenden", - resetLoginProcess: "Terug naar inloggen", - messageEmptyUserName: "Voer uw gebruikersnaam in", - messageEmptyPassword: "Voer uw wachtwoord in", - messageEmptyBoth: "Voer uw gebruikersnaam en wachtwoord in", - messageEmptyEmail: "Voer uw e-mailadres in", - messageInvalidEmail: "Voer een geldig e-mailadres in", - digitsEmpty: "Voer uw code in", - digitsInvalid: "Voer een geldige code in", - messageLoginFailed: "Inloggen mislukt, controleer uw gegevens.", - messageForbidden: - "Inloggen geslaagd, maar u heeft geen permissies. U <b>kunt niet</b> inloggen.<br>U kunt een andere gebruiker selecteren of de beheerder contacteren.", - messageSomethingWentWrong: - "Er is iets fout gegaan, probeer het later opnieuw.", - messageThisFormIsNotConfigured: "Dit formulier is niet geconfigureerd.", - messagePasswordResetDisabled: - "Deze functie werkt niet omdat tweefactorauthenticatie is<br>ingeschakeld op uw account. Neem contact op met de beheerder.", - }; - - case "sv": // Swedish - return { - username: "Användarnamn eller e-post", - password: "Lösenord", - login: "Logga in", - forgotPasswordLink: "Glömt lösenord?", - mailAddress: "E-postadress", - requestLink: "Begär länk", - digits: "Kod", - loginLink: "Logga in", - secondFactor: "Tvåfaktorkod", - sendDigits: "Skicka kod", - sendSecondFactorDigits: "Skicka kod", - resetLoginProcess: "Tillbaka till inloggning", - messageEmptyUserName: "Ange ditt användarnamn", - messageEmptyPassword: "Ange ditt lösenord", - messageEmptyBoth: "Ange ditt användarnamn och lösenord", - messageEmptyEmail: "Ange din e-postadress", - messageInvalidEmail: "Ange en giltig e-postadress", - digitsEmpty: "Ange din kod", - digitsInvalid: "Ange en giltig kod", - messageLoginFailed: - "Inloggning misslyckades, kontrollera dina uppgifter.", - messageForbidden: - "Inloggningen lyckades, men du har inte behörighet. Du <b>kan inte</b> logga in.<br>Du kan välja en annan användare eller kontakta administratören.", - messageSomethingWentWrong: "Något gick fel, försök igen senare.", - messageThisFormIsNotConfigured: "Detta formulär är inte konfigurerat.", - messagePasswordResetDisabled: - "Denna funktion fungerar inte eftersom tvåfaktorsautentisering är aktiverad på ditt konto. Kontakta administratören.", - }; - - case "pl": // Polish - return { - username: "Nazwa użytkownika lub e-mail", - password: "Hasło", - login: "Zaloguj się", - forgotPasswordLink: "Zapomniałeś hasła?", - mailAddress: "Adres e-mail", - requestLink: "Zażądaj linku", - digits: "Kod", - loginLink: "Zaloguj się", - secondFactor: "Kod drugiego czynnika", - sendDigits: "Wyślij kod", - sendSecondFactorDigits: "Wyślij kod", - resetLoginProcess: "Powrót do logowania", - messageEmptyUserName: "Wprowadź swoją nazwę użytkownika", - messageEmptyPassword: "Wprowadź swoje hasło", - messageEmptyBoth: "Wprowadź swoją nazwę użytkownika i hasło", - messageEmptyEmail: "Wprowadź swój adres e-mail", - messageInvalidEmail: "Wprowadź prawidłowy adres e-mail", - digitsEmpty: "Wprowadź swój kod", - digitsInvalid: "Wprowadź prawidłowy kod", - messageLoginFailed: "Logowanie nie powiodło się, sprawdź swoje dane.", - messageForbidden: - "Logowanie powiodło się, ale nie masz uprawnień. <b>Nie możesz</b> się zalogować.<br>Możesz wybrać innego użytkownika lub skontaktować się z administratorem.", - messageSomethingWentWrong: - "Coś poszło nie tak, spróbuj ponownie później.", - messageThisFormIsNotConfigured: - "Ten formularz nie jest skonfigurowany.", - messagePasswordResetDisabled: - "Ta funkcja nie działa, ponieważ włączona jest autoryzacja dwuetapowa na twoim koncie. Skontaktuj się z administratorem.", - }; - - case "da": // Danish - return { - username: "Brugernavn eller e-mail", - password: "Adgangskode", - login: "Log ind", - forgotPasswordLink: "Glemt adgangskode?", - mailAddress: "E-mail-adresse", - requestLink: "Anmod om link", - digits: "Kode", - loginLink: "Log ind", - secondFactor: "Tofaktorkode", - sendDigits: "Send kode", - sendSecondFactorDigits: "Send kode", - resetLoginProcess: "Tilbage til log ind", - messageEmptyUserName: "Indtast dit brugernavn", - messageEmptyPassword: "Indtast din adgangskode", - messageEmptyBoth: "Indtast dit brugernavn og din adgangskode", - messageEmptyEmail: "Indtast din e-mail-adresse", - messageInvalidEmail: "Indtast en gyldig e-mail-adresse", - digitsEmpty: "Indtast din kode", - digitsInvalid: "Indtast en gyldig kode", - messageLoginFailed: "Login mislykkedes, kontrollér dine oplysninger.", - messageForbidden: - "Login lykkedes, men du har ikke tilladelse. Du <b>kan ikke</b> logge ind.<br>Du kan vælge en anden bruger eller kontakte administratoren.", - messageSomethingWentWrong: "Noget gik galt, prøv igen senere.", - messageThisFormIsNotConfigured: "Denne formular er ikke konfigureret.", - messagePasswordResetDisabled: - "Denne funktion fungerer ikke, fordi tofaktorautentificering<br>er aktiveret på din konto. Kontakt administratoren.", - }; - - case "no": // Norwegian - return { - username: "Brukernavn eller e-post", - password: "Passord", - login: "Logg inn", - forgotPasswordLink: "Glemt passord?", - mailAddress: "E-postadresse", - requestLink: "Be om lenke", - digits: "Kode", - loginLink: "Logg inn", - secondFactor: "Tofaktorkode", - sendDigits: "Send kode", - sendSecondFactorDigits: "Send kode", - resetLoginProcess: "Tilbake til innlogging", - messageEmptyUserName: "Vennligst skriv inn brukernavnet ditt", - messageEmptyPassword: "Vennligst skriv inn passordet ditt", - messageEmptyBoth: "Vennligst skriv inn brukernavn og passord", - messageEmptyEmail: "Vennligst skriv inn e-postadressen din", - messageInvalidEmail: "Vennligst skriv inn en gyldig e-postadresse", - digitsEmpty: "Vennligst skriv inn koden din", - digitsInvalid: "Vennligst skriv inn en gyldig kode", - messageLoginFailed: - "Innlogging mislyktes, vennligst sjekk informasjonen din.", - messageForbidden: - "Innloggingen var vellykket, men du har ikke tillatelse. Du <b>kan ikke</b> logge inn.<br>Du kan velge en annen bruker eller kontakte administratoren.", - messageSomethingWentWrong: - "Noe gikk galt, vennligst prøv igjen senere.", - messageThisFormIsNotConfigured: "Dette skjemaet er ikke konfigurert.", - messagePasswordResetDisabled: - "Denne funksjonen fungerer ikke fordi<br>tofaktorautentisering er aktivert på kontoen din. Kontakt administratoren.", - }; - - case "cs": // Czech - return { - username: "Uživatelské jméno nebo e-mail", - password: "Heslo", - login: "Přihlásit se", - forgotPasswordLink: "Zapomněli jste heslo?", - mailAddress: "E-mailová adresa", - requestLink: "Požádat o odkaz", - digits: "Kód", - loginLink: "Přihlásit se", - secondFactor: "Dvoufázový kód", - sendDigits: "Odeslat kód", - sendSecondFactorDigits: "Odeslat kód", - resetLoginProcess: "Zpět na přihlášení", - messageEmptyUserName: "Zadejte své uživatelské jméno", - messageEmptyPassword: "Zadejte své heslo", - messageEmptyBoth: "Zadejte své uživatelské jméno a heslo", - messageEmptyEmail: "Zadejte svou e-mailovou adresu", - messageInvalidEmail: "Zadejte platnou e-mailovou adresu", - digitsEmpty: "Zadejte svůj kód", - digitsInvalid: "Zadejte platný kód", - messageLoginFailed: "Přihlášení se nezdařilo, zkontrolujte své údaje.", - messageForbidden: - "Přihlášení bylo úspěšné, ale nemáte oprávnění. Nemůžete se přihlásit.<br>Vyberte jiného uživatele nebo kontaktujte správce.", - messageSomethingWentWrong: "Něco se pokazilo, zkuste to později.", - messageThisFormIsNotConfigured: "Tento formulář není nakonfigurován.", - messagePasswordResetDisabled: - "Tato funkce nefunguje, protože je na vašem<br>účtu aktivováno dvoufaktorové ověřování. Kontaktujte správce.", - }; - - default: - return { - username: "Username or E-Mail", - password: "Password", - login: "Login", - forgotPasswordLink: "Forgot Password?", - mailAddress: "E-Mail-Address", - requestLink: "Request Link", - digits: "Code", - loginLink: "Login", - secondFactor: "Second Factor Code", - sendDigits: "Send Code", - sendSecondFactorDigits: "Send Code", - resetLoginProcess: "Back to Login", - messageEmptyUserName: "Please enter your username", - messageEmptyPassword: "Please enter your password", - messageEmptyBoth: "Please enter your username and password", - messageEmptyEmail: "Please enter your email address", - messageInvalidEmail: "Please enter a valid email address", - digitsEmpty: "Please enter your code", - digitsInvalid: "Please enter a valid code", - messageLoginFailed: "Login failed, please check your input.", - messageForbidden: - "Login was successful, but you have no permission. You <b>cannot</b> login.<br>You can select another user or contact the administrator.", - messageSomethingWentWrong: - "Something went wrong, please try again later.", - messageThisFormIsNotConfigured: "This form is not configured.", - messagePasswordResetDisabled: - "This function does not work because two-factor<br>authentication is enabled on your account.<br>Please contact the administrator.", - }; - } + const locale = getLocaleOfDocument(); + switch (locale.language) { + case "de": + return { + username: "Benutzername oder E-Mail", + password: "Passwort", + login: "Anmelden", + forgotPasswordLink: "Passwort vergessen?", + mailAddress: "E-Mail-Adresse", + requestLink: "Link anfordern", + digits: "Code", + loginLink: "Anmelden", + secondFactor: "Zweiter Faktor Code", + sendDigits: "Code senden", + sendSecondFactorDigits: "Code senden", + resetLoginProcess: "Zurück zum Login", + messageEmptyUserName: "Bitte geben Sie Ihren Benutzernamen ein", + messageEmptyPassword: "Bitte geben Sie Ihr Passwort ein", + messageEmptyBoth: + "Bitte geben Sie Ihren Benutzernamen und Ihr Passwort ein", + messageEmptyEmail: "Bitte geben Sie Ihre E-Mail-Adresse ein", + messageInvalidEmail: "Bitte geben Sie eine gültige E-Mail-Adresse ein", + digitsEmpty: "Bitte geben Sie Ihren Code ein", + digitsInvalid: "Bitte geben Sie einen gültigen Code ein", + messageLoginFailed: + "Anmeldung fehlgeschlagen, bitte überprüfen Sie Ihre Eingaben.", + messageForbidden: + "Die Anmeldung war erfolgreich, aber Sie haben keine Berechtigung. Sie können sich <b>nicht</b> anmelden.<br>Sie können einen anderen Benutzer auswählen oder sich an den Administrator wenden.", + messageSomethingWentWrong: + "Etwas ist schief gelaufen, bitte versuchen Sie es später erneut", + messageThisFormIsNotConfigured: + "Dieses Formular ist nicht konfiguriert.", + messagePasswordResetDisabled: + "Diese Funktion funktioniert nicht, da die Zwei-Faktor-Authentifizierung bei Ihrem Konto aktiviert ist.<br>Bitte kontaktieren Sie den Administrator.", + }; + case "es": + return { + username: "Nombre de usuario o correo electrónico", + password: "Contraseña", + login: "Iniciar sesión", + forgotPasswordLink: "¿Olvidaste tu contraseña?", + mailAddress: "Dirección de correo electrónico", + requestLink: "Solicitar enlace", + digits: "Código", + loginLink: "Iniciar sesión", + secondFactor: "Código de segundo factor", + sendDigits: "Enviar código", + sendSecondFactorDigits: "Enviar código", + resetLoginProcess: "Volver al inicio de sesión", + messageEmptyUserName: "Por favor ingrese su nombre de usuario", + messageEmptyPassword: "Por favor ingrese su contraseña", + messageEmptyBoth: "Por favor ingrese su nombre de usuario y contraseña", + messageEmptyEmail: + "Por favor ingrese su dirección de correo electrónico", + messageInvalidEmail: + "Por favor ingrese una dirección de correo electrónico válida", + digitsEmpty: "Por favor ingrese su código", + digitsInvalid: "Por favor ingrese un código válido", + messageLoginFailed: + "Error al iniciar sesión, por favor verifique sus datos.", + messageForbidden: + "El inicio de sesión fue exitoso, pero no tienes permisos. <b>No puedes</b> iniciar sesión.<br>Puedes seleccionar otro usuario o contactar al administrador.", + messageSomethingWentWrong: + "Algo salió mal, por favor intenta de nuevo más tarde.", + messageThisFormIsNotConfigured: "Este formulario no está configurado.", + messagePasswordResetDisabled: + "Esta función no funciona porque la autenticación de dos factores está activada en su cuenta. Por favor, póngase en contacto con el administrador.", + }; + case "zh": + return { + username: "用户名或电子邮箱", + password: "密码", + login: "登录", + forgotPasswordLink: "忘记密码?", + mailAddress: "电子邮件地址", + requestLink: "请求链接", + digits: "验证码", + loginLink: "登录", + secondFactor: "二次验证码", + sendDigits: "发送验证码", + sendSecondFactorDigits: "发送验证码", + resetLoginProcess: "返回登录", + messageEmptyUserName: "请输入用户名", + messageEmptyPassword: "请输入密码", + messageEmptyBoth: "请输入用户名和密码", + messageEmptyEmail: "请输入电子邮件地址", + messageInvalidEmail: "请输入有效的电子邮件地址", + digitsEmpty: "请输入验证码", + digitsInvalid: "请输入有效的验证码", + messageLoginFailed: "登录失败,请检查您的输入。", + messageForbidden: + "登录成功,但您没有权限。您<b>不能</b>登录。<br>您可以选择其他用户或联系管理员。", + messageSomethingWentWrong: "出了点问题,请稍后再试。", + messageThisFormIsNotConfigured: "此表单尚未配置。", + messagePasswordResetDisabled: + "此功能无法使用,因为您的帐户启用了双因素身份验证。请联系管理员。", + }; + + case "hi": + return { + username: "उपयो��कर नम य ई-मल", + password: "पसवर", + login: "लग इन कर", + forgotPasswordLink: "पसवर भल गए?", + mailAddress: "ई-मल पत", + requestLink: "लक क अनरध कर", + digits: "कड", + loginLink: "लग इन कर", + secondFactor: "दसर फकर कड", + sendDigits: "कड भज", + sendSecondFactorDigits: "कड भज", + resetLoginProcess: "लगन पर वपस जए", + messageEmptyUserName: "कपय अपन उपयगकर नम दर कर", + messageEmptyPassword: "कपय अपन पसवर दर कर", + messageEmptyBoth: "कपय अपन उपयगकर नम और पसवर दर कर", + messageEmptyEmail: "कपय अपन ई-मल पत दर कर", + messageInvalidEmail: "कपय एक वध ई-मल पत दर कर", + digitsEmpty: "कपय अपन कड दर कर", + digitsInvalid: "कपय एक वध कड दर कर", + messageLoginFailed: "लगन वफल हआ, कपय अपन जनकर क जच कर।", + messageForbidden: + "लगन सफल रह लकन आपक पस अनमत नह ह। आप <b>लगन नह</b> कर सकत।<br>आप दसर उपयगकर चन सकत ह य पशसक स सपर कर सकत ह।", + messageSomethingWentWrong: "कछ गलत हआ, कपय बद म पन पयस कर।", + messageThisFormIsNotConfigured: "यह फर कनगर नह ह।", + messagePasswordResetDisabled: + "यह सवध कम नह करत कक आपक खत म द घटक पमणकरण सकम ह। कपय पशसक स सपर कर।", + }; + + case "bn": + return { + username: "ইউজরনম ব ই-মইল", + password: "পসওযর", + login: "লগইন করন", + forgotPasswordLink: "পসওযর ভল গছন?", + mailAddress: "ই-মইল ঠকন", + requestLink: "লক অনরধ করন", + digits: "কড", + loginLink: "লগইন করন", + secondFactor: "দতয ফকর কড", + sendDigits: "কড পঠন", + sendSecondFactorDigits: "কড পঠন", + resetLoginProcess: "লগইন ফর যন", + messageEmptyUserName: "দয কর আপনর ইউজরনম লখন", + messageEmptyPassword: "দয কর আপনর পসওযর লখন", + messageEmptyBoth: "দয কর আপনর ইউজরনম এব পসওযর লখন", + messageEmptyEmail: "দয কর আপনর ই-মইল ঠকন লখন", + messageInvalidEmail: "দয কর একট বধ ই-মইল ঠকন লখন", + digitsEmpty: "দয কর আপনর কড লখন", + digitsInvalid: "দয কর একট বধ কড লখন", + messageLoginFailed: "লগইন বর হযছ, দয কর আপনর ইনপট পরক করন।", + messageForbidden: + "লগইন সফল হযছ, কন আপনর অনমত নই। আপন <b>লগইন করত পরবন ন</b>।<br>আপন অন ইউজর নরচন করত পরন অথব অযডমনসটরর সথ যগযগ করত পরন।", + messageSomethingWentWrong: "কছ ভল হযছ, দয কর পর আবর চষ করন।", + messageThisFormIsNotConfigured: "এই ফরট কনফগর কর হযন।", + messagePasswordResetDisabled: + "এই ফশনট করকর নয করণ আপনর অযকউন দট ফকর পমণকরণ সকয কর আছ। দয কর পশসকর সথ যগযগ করন।", + }; + + case "pt": // Portuguese + return { + username: "Nome de usuário ou e-mail", + password: "Senha", + login: "Entrar", + forgotPasswordLink: "Esqueceu a senha?", + mailAddress: "Endereço de e-mail", + requestLink: "Solicitar link", + digits: "Código", + loginLink: "Entrar", + secondFactor: "Código do segundo fator", + sendDigits: "Enviar código", + sendSecondFactorDigits: "Enviar código", + resetLoginProcess: "Voltar ao login", + messageEmptyUserName: "Por favor, insira seu nome de usuário", + messageEmptyPassword: "Por favor, insira sua senha", + messageEmptyBoth: "Por favor, insira seu nome de usuário e senha", + messageEmptyEmail: "Por favor, insira seu endereço de e-mail", + messageInvalidEmail: "Por favor, insira um endereço de e-mail válido", + digitsEmpty: "Por favor, insira seu código", + digitsInvalid: "Por favor, insira um código válido", + messageLoginFailed: "Falha no login, verifique suas informações.", + messageForbidden: + "Login foi bem-sucedido, mas você não tem permissão. Você <b>não pode</b> entrar.<br>Você pode escolher outro usuário ou entrar em contato com o administrador.", + messageSomethingWentWrong: + "Algo deu errado, tente novamente mais tarde.", + messageThisFormIsNotConfigured: "Este formulário não está configurado.", + messagePasswordResetDisabled: + "Esta função não funciona porque a autenticação de dois fatores<br>está ativada em sua conta. Por favor, entre em contato com o administrador.", + }; + + case "ru": // Russian + return { + username: "Имя пользователя или электронная почта", + password: "Пароль", + login: "Войти", + forgotPasswordLink: "Забыли пароль?", + mailAddress: "Адрес электронной почты", + requestLink: "Запросить ссылку", + digits: "Код", + loginLink: "Войти", + secondFactor: "Код второго фактора", + sendDigits: "Отправить код", + sendSecondFactorDigits: "Отправить код", + resetLoginProcess: "Вернуться к входу", + messageEmptyUserName: "Пожалуйста, введите имя пользователя", + messageEmptyPassword: "Пожалуйста, введите пароль", + messageEmptyBoth: "Пожалуйста, введите имя пользователя и пароль", + messageEmptyEmail: "Пожалуйста, введите адрес электронной почты", + messageInvalidEmail: + "Пожалуйста, введите действительный адрес электронной почты", + digitsEmpty: "Пожалуйста, введите код", + digitsInvalid: "Пожалуйста, введите действительный код", + messageLoginFailed: "Ошибка входа, проверьте введенные данные.", + messageForbidden: + "Вход выполнен, но у вас нет прав. Вы <b>не можете</b> войти.<br>Вы можете выбрать другого пользователя или связаться с администратором.", + messageSomethingWentWrong: "Что-то пошло не так, попробуйте позже.", + messageThisFormIsNotConfigured: "Эта форма не настроена.", + messagePasswordResetDisabled: + "Эта функция не работает, потому что двухфакторная аутентификация<br> включена в вашей учетной записи. Пожалуйста, свяжитесь с администратором.", + }; + + case "ja": // Japanese + return { + username: "ユーザー名またはメールアドレス", + password: "パスワード", + login: "ログイン", + forgotPasswordLink: "パスワードを忘れましたか?", + mailAddress: "メールアドレス", + requestLink: "リンクをリクエスト", + digits: "コード", + loginLink: "ログイン", + secondFactor: "二要素コード", + sendDigits: "コードを送信", + sendSecondFactorDigits: "コードを送信", + resetLoginProcess: "ログインに戻る", + messageEmptyUserName: "ユーザー名を入力してください", + messageEmptyPassword: "パスワードを入力してください", + messageEmptyBoth: "ユーザー名とパスワードを入力してください", + messageEmptyEmail: "メールアドレスを入力してください", + messageInvalidEmail: "有効なメールアドレスを入力してください", + digitsEmpty: "コードを入力してください", + digitsInvalid: "有効なコードを入力してください", + messageLoginFailed: + "ログインに失敗しました。入力内容をご確認ください。", + messageForbidden: + "ログイン成功しましたが、権限がありません。<b>ログインできません</b>。<br>他のユーザーを選択するか、管理者に連絡してください。", + messageSomethingWentWrong: + "問題が発生しました。後でもう一度お試しください。", + messageThisFormIsNotConfigured: "このフォームは設定されていません。", + messagePasswordResetDisabled: + "この機能は使用できません。アカウントで二要素認証が有効になっているため、管理者に連絡してください。", + }; + + case "pa": // Western Punjabi + return { + username: "ਵਰਤਕਰ ਨਮ ਜ ਈ-ਮਲ", + password: "ਪਸਵਰਡ", + login: "ਲਗਨ ਕਰ", + forgotPasswordLink: "ਪਸਵਰਡ ਭਲ ਗਏ?", + mailAddress: "ਈ-ਮਲ ਪਤ", + requestLink: "ਲਕ ਦ ਬਨਤ ਕਰ", + digits: "ਕਡ", + loginLink: "ਲਗਨ ਕਰ", + secondFactor: "ਦਜ ਫਕਟਰ ਕਡ", + sendDigits: "ਕਡ ਭਜ", + sendSecondFactorDigits: "ਕਡ ਭਜ", + resetLoginProcess: "ਲਗਨ 'ਤ ਵਪਸ ਜਓ", + messageEmptyUserName: "ਕਰਪ ਕਰਕ ਆਪਣ ਵਰਤਕਰ ਨਮ ਦਰਜ ਕਰ", + messageEmptyPassword: "ਕਰਪ ਕਰਕ ਆਪਣ ਪਸਵਰਡ ਦਰਜ ਕਰ", + messageEmptyBoth: "ਕਰਪ ਕਰਕ ਆਪਣ ਵਰਤਕਰ ਨਮ ਤ ਪਸਵਰਡ ਦਰਜ ਕਰ", + messageEmptyEmail: "ਕਰਪ ਕਰਕ ਆਪਣ ਈ-ਮਲ ਪਤ ਦਰਜ ਕਰ", + messageInvalidEmail: "ਕਰਪ ਕਰਕ ਇਕ ਵਧ ਈ-ਮਲ ਪਤ ਦਰਜ ਕਰ", + digitsEmpty: "ਕਰਪ ਕਰਕ ਆਪਣ ਕਡ ਦਰਜ ਕਰ", + digitsInvalid: "ਕਰਪ ਕਰਕ ਇਕ ਵਧ ਕਡ ਦਰਜ ਕਰ", + messageLoginFailed: "ਲਗਨ ਅਸਫਲ ਹਇਆ, ਕਰਪ ਕਰਕ ਆਪਣ ਜਣਕਰ ਦ ਜਚ ਕਰ।", + messageForbidden: + "ਲਗਨ ਸਫਲ ਹਇਆ, ਪਰ ਤਹਡ ਕਲ ਅਧਕਰ ਨਹ ਹਨ। ਤਸ <b>ਲਗਨ ਨਹ</b> ਕਰ ਸਕਦ।<br>ਤਸ ਹਰ ਵਰਤਕਰ ਚਣ सकत ਹ ਜ ਪਰਬਧਕ ਨਲ ਸਪਰਕ ਕਰ ਸਕਦ ਹ।", + messageSomethingWentWrong: + "ਕਝ ਗਲਤ ਹ ਗਆ, ਕਰਪ ਕਰਕ ਬਅਦ ਵਚ ਮੜ ਕਸਸ ਕਰ।", + messageThisFormIsNotConfigured: "ਇਸ ਫਰਮ ਨ ਸਰਚਤ ਨਹ ਕਤ ਗਆ ਹ।", + messagePasswordResetDisabled: + "ਇਹ ਫਕਸਨ ਕਮ ਨਹ ਕਰਦ ਕਉਕ ਤਹਡ ਖਤ ਵਚ ਦ ਫਕਟਰ ਪਰਮਣਕਰਣ ਸਰਗਰਮ ਹ। ਕਰਪ ਕਰਕ ਪਰਬਧਕ ਨਲ ਸਪਰਕ ਕਰ।", + }; + + case "mr": // Marathi + return { + username: "वपरकरनव कव ईमल", + password: "सकतशब", + login: "पवश कर", + forgotPasswordLink: "सकतशब वसरलत क?", + mailAddress: "ईमल पत", + requestLink: "लकच वनत कर", + digits: "कड", + loginLink: "पवश कर", + secondFactor: "दसर घटक कड", + sendDigits: "कड पठव", + sendSecondFactorDigits: "कड पठव", + resetLoginProcess: "पवशवर परत ज", + messageEmptyUserName: "कपय आपल वपरकरनव पवष कर", + messageEmptyPassword: "कपय आपल सकतशब पवष कर", + messageEmptyBoth: "कपय आपल वपरकरनव आण सकतशब पवष कर", + messageEmptyEmail: "कपय आपल ईमल पत पवष कर", + messageInvalidEmail: "कपय वध ईमल पत पवष कर", + digitsEmpty: "कपय आपल कड पवष कर", + digitsInvalid: "कपय वध कड पवष कर", + messageLoginFailed: "पवश अयशस, कपय आपल महत तपस.", + messageForbidden: + "पवश यशस झल, परत आपलकड परवन नह. आपण <b>पवश कर शकत नह</b>.<br>आपण दसर वपरकर नवड शकत कव ववसपकश सपर सध शकत.", + messageSomethingWentWrong: "कहतर चकल, कपय नतर पन पयत कर.", + messageThisFormIsNotConfigured: "ह फर सरचत कलल नह.", + messagePasswordResetDisabled: + "य करच कमगर करत नह करण आपल खतत दन घटक पमणकरण सकय कल आह. कपय ववसपकश सपर सध.", + }; + + case "fr": // French + return { + username: "Nom d'utilisateur ou e-mail", + password: "Mot de passe", + login: "Connexion", + forgotPasswordLink: "Mot de passe oublié ?", + mailAddress: "Adresse e-mail", + requestLink: "Demander un lien", + digits: "Code", + loginLink: "Connexion", + secondFactor: "Code du deuxième facteur", + sendDigits: "Envoyer le code", + sendSecondFactorDigits: "Envoyer le code", + resetLoginProcess: "Retour à la connexion", + messageEmptyUserName: "Veuillez entrer votre nom d'utilisateur", + messageEmptyPassword: "Veuillez entrer votre mot de passe", + messageEmptyBoth: + "Veuillez entrer votre nom d'utilisateur et votre mot de passe", + messageEmptyEmail: "Veuillez entrer votre adresse e-mail", + messageInvalidEmail: "Veuillez entrer une adresse e-mail valide", + digitsEmpty: "Veuillez entrer votre code", + digitsInvalid: "Veuillez entrer un code valide", + messageLoginFailed: + "Échec de la connexion, veuillez vérifier vos informations.", + messageForbidden: + "La connexion a réussi, mais vous n'avez pas les permissions. Vous <b>ne pouvez pas</b> vous connecter.<br>Vous pouvez choisir un autre utilisateur ou contacter l'administrateur.", + messageSomethingWentWrong: + "Une erreur s'est produite, veuillez réessayer plus tard.", + messageThisFormIsNotConfigured: "Ce formulaire n'est pas configuré.", + messagePasswordResetDisabled: + "Cette fonctionnalité ne fonctionne pas car l'authentification à deux facteurs est activée sur<br>votre compte. Veuillez contacter l'administrateur.", + }; + + case "it": // Italian + return { + username: "Nome utente o e-mail", + password: "Password", + login: "Accedi", + forgotPasswordLink: "Password dimenticata?", + mailAddress: "Indirizzo e-mail", + requestLink: "Richiedi link", + digits: "Codice", + loginLink: "Accedi", + secondFactor: "Codice a due fattori", + sendDigits: "Invia codice", + sendSecondFactorDigits: "Invia codice", + resetLoginProcess: "Torna al login", + messageEmptyUserName: "Per favore, inserisci il tuo nome utente", + messageEmptyPassword: "Per favore, inserisci la tua password", + messageEmptyBoth: + "Per favore, inserisci il tuo nome utente e la tua password", + messageEmptyEmail: "Per favore, inserisci il tuo indirizzo e-mail", + messageInvalidEmail: "Per favore, inserisci un indirizzo e-mail valido", + digitsEmpty: "Per favore, inserisci il tuo codice", + digitsInvalid: "Per favore, inserisci un codice valido", + messageLoginFailed: "Accesso fallito, verifica i tuoi dati.", + messageForbidden: + "Accesso riuscito, ma non hai i permessi. Non puoi accedere.<br>Puoi scegliere un altro account o contattare l'amministratore.", + messageSomethingWentWrong: + "Qualcosa è andato storto, riprova più tardi.", + messageThisFormIsNotConfigured: "Questo modulo non è configurato.", + messagePasswordResetDisabled: + "Questa funzione non funziona perché l'autenticazione a due<br>fattori è attiva sul tuo account. Contatta l'amministratore.", + }; + + case "nl": // Dutch + return { + username: "Gebruikersnaam of e-mail", + password: "Wachtwoord", + login: "Inloggen", + forgotPasswordLink: "Wachtwoord vergeten?", + mailAddress: "E-mailadres", + requestLink: "Link aanvragen", + digits: "Code", + loginLink: "Inloggen", + secondFactor: "Tweede factor code", + sendDigits: "Code verzenden", + sendSecondFactorDigits: "Code verzenden", + resetLoginProcess: "Terug naar inloggen", + messageEmptyUserName: "Voer uw gebruikersnaam in", + messageEmptyPassword: "Voer uw wachtwoord in", + messageEmptyBoth: "Voer uw gebruikersnaam en wachtwoord in", + messageEmptyEmail: "Voer uw e-mailadres in", + messageInvalidEmail: "Voer een geldig e-mailadres in", + digitsEmpty: "Voer uw code in", + digitsInvalid: "Voer een geldige code in", + messageLoginFailed: "Inloggen mislukt, controleer uw gegevens.", + messageForbidden: + "Inloggen geslaagd, maar u heeft geen permissies. U <b>kunt niet</b> inloggen.<br>U kunt een andere gebruiker selecteren of de beheerder contacteren.", + messageSomethingWentWrong: + "Er is iets fout gegaan, probeer het later opnieuw.", + messageThisFormIsNotConfigured: "Dit formulier is niet geconfigureerd.", + messagePasswordResetDisabled: + "Deze functie werkt niet omdat tweefactorauthenticatie is<br>ingeschakeld op uw account. Neem contact op met de beheerder.", + }; + + case "sv": // Swedish + return { + username: "Användarnamn eller e-post", + password: "Lösenord", + login: "Logga in", + forgotPasswordLink: "Glömt lösenord?", + mailAddress: "E-postadress", + requestLink: "Begär länk", + digits: "Kod", + loginLink: "Logga in", + secondFactor: "Tvåfaktorkod", + sendDigits: "Skicka kod", + sendSecondFactorDigits: "Skicka kod", + resetLoginProcess: "Tillbaka till inloggning", + messageEmptyUserName: "Ange ditt användarnamn", + messageEmptyPassword: "Ange ditt lösenord", + messageEmptyBoth: "Ange ditt användarnamn och lösenord", + messageEmptyEmail: "Ange din e-postadress", + messageInvalidEmail: "Ange en giltig e-postadress", + digitsEmpty: "Ange din kod", + digitsInvalid: "Ange en giltig kod", + messageLoginFailed: + "Inloggning misslyckades, kontrollera dina uppgifter.", + messageForbidden: + "Inloggningen lyckades, men du har inte behörighet. Du <b>kan inte</b> logga in.<br>Du kan välja en annan användare eller kontakta administratören.", + messageSomethingWentWrong: "Något gick fel, försök igen senare.", + messageThisFormIsNotConfigured: "Detta formulär är inte konfigurerat.", + messagePasswordResetDisabled: + "Denna funktion fungerar inte eftersom tvåfaktorsautentisering är aktiverad på ditt konto. Kontakta administratören.", + }; + + case "pl": // Polish + return { + username: "Nazwa użytkownika lub e-mail", + password: "Hasło", + login: "Zaloguj się", + forgotPasswordLink: "Zapomniałeś hasła?", + mailAddress: "Adres e-mail", + requestLink: "Zażądaj linku", + digits: "Kod", + loginLink: "Zaloguj się", + secondFactor: "Kod drugiego czynnika", + sendDigits: "Wyślij kod", + sendSecondFactorDigits: "Wyślij kod", + resetLoginProcess: "Powrót do logowania", + messageEmptyUserName: "Wprowadź swoją nazwę użytkownika", + messageEmptyPassword: "Wprowadź swoje hasło", + messageEmptyBoth: "Wprowadź swoją nazwę użytkownika i hasło", + messageEmptyEmail: "Wprowadź swój adres e-mail", + messageInvalidEmail: "Wprowadź prawidłowy adres e-mail", + digitsEmpty: "Wprowadź swój kod", + digitsInvalid: "Wprowadź prawidłowy kod", + messageLoginFailed: "Logowanie nie powiodło się, sprawdź swoje dane.", + messageForbidden: + "Logowanie powiodło się, ale nie masz uprawnień. <b>Nie możesz</b> się zalogować.<br>Możesz wybrać innego użytkownika lub skontaktować się z administratorem.", + messageSomethingWentWrong: + "Coś poszło nie tak, spróbuj ponownie później.", + messageThisFormIsNotConfigured: + "Ten formularz nie jest skonfigurowany.", + messagePasswordResetDisabled: + "Ta funkcja nie działa, ponieważ włączona jest autoryzacja dwuetapowa na twoim koncie. Skontaktuj się z administratorem.", + }; + + case "da": // Danish + return { + username: "Brugernavn eller e-mail", + password: "Adgangskode", + login: "Log ind", + forgotPasswordLink: "Glemt adgangskode?", + mailAddress: "E-mail-adresse", + requestLink: "Anmod om link", + digits: "Kode", + loginLink: "Log ind", + secondFactor: "Tofaktorkode", + sendDigits: "Send kode", + sendSecondFactorDigits: "Send kode", + resetLoginProcess: "Tilbage til log ind", + messageEmptyUserName: "Indtast dit brugernavn", + messageEmptyPassword: "Indtast din adgangskode", + messageEmptyBoth: "Indtast dit brugernavn og din adgangskode", + messageEmptyEmail: "Indtast din e-mail-adresse", + messageInvalidEmail: "Indtast en gyldig e-mail-adresse", + digitsEmpty: "Indtast din kode", + digitsInvalid: "Indtast en gyldig kode", + messageLoginFailed: "Login mislykkedes, kontrollér dine oplysninger.", + messageForbidden: + "Login lykkedes, men du har ikke tilladelse. Du <b>kan ikke</b> logge ind.<br>Du kan vælge en anden bruger eller kontakte administratoren.", + messageSomethingWentWrong: "Noget gik galt, prøv igen senere.", + messageThisFormIsNotConfigured: "Denne formular er ikke konfigureret.", + messagePasswordResetDisabled: + "Denne funktion fungerer ikke, fordi tofaktorautentificering<br>er aktiveret på din konto. Kontakt administratoren.", + }; + + case "no": // Norwegian + return { + username: "Brukernavn eller e-post", + password: "Passord", + login: "Logg inn", + forgotPasswordLink: "Glemt passord?", + mailAddress: "E-postadresse", + requestLink: "Be om lenke", + digits: "Kode", + loginLink: "Logg inn", + secondFactor: "Tofaktorkode", + sendDigits: "Send kode", + sendSecondFactorDigits: "Send kode", + resetLoginProcess: "Tilbake til innlogging", + messageEmptyUserName: "Vennligst skriv inn brukernavnet ditt", + messageEmptyPassword: "Vennligst skriv inn passordet ditt", + messageEmptyBoth: "Vennligst skriv inn brukernavn og passord", + messageEmptyEmail: "Vennligst skriv inn e-postadressen din", + messageInvalidEmail: "Vennligst skriv inn en gyldig e-postadresse", + digitsEmpty: "Vennligst skriv inn koden din", + digitsInvalid: "Vennligst skriv inn en gyldig kode", + messageLoginFailed: + "Innlogging mislyktes, vennligst sjekk informasjonen din.", + messageForbidden: + "Innloggingen var vellykket, men du har ikke tillatelse. Du <b>kan ikke</b> logge inn.<br>Du kan velge en annen bruker eller kontakte administratoren.", + messageSomethingWentWrong: + "Noe gikk galt, vennligst prøv igjen senere.", + messageThisFormIsNotConfigured: "Dette skjemaet er ikke konfigurert.", + messagePasswordResetDisabled: + "Denne funksjonen fungerer ikke fordi<br>tofaktorautentisering er aktivert på kontoen din. Kontakt administratoren.", + }; + + case "cs": // Czech + return { + username: "Uživatelské jméno nebo e-mail", + password: "Heslo", + login: "Přihlásit se", + forgotPasswordLink: "Zapomněli jste heslo?", + mailAddress: "E-mailová adresa", + requestLink: "Požádat o odkaz", + digits: "Kód", + loginLink: "Přihlásit se", + secondFactor: "Dvoufázový kód", + sendDigits: "Odeslat kód", + sendSecondFactorDigits: "Odeslat kód", + resetLoginProcess: "Zpět na přihlášení", + messageEmptyUserName: "Zadejte své uživatelské jméno", + messageEmptyPassword: "Zadejte své heslo", + messageEmptyBoth: "Zadejte své uživatelské jméno a heslo", + messageEmptyEmail: "Zadejte svou e-mailovou adresu", + messageInvalidEmail: "Zadejte platnou e-mailovou adresu", + digitsEmpty: "Zadejte svůj kód", + digitsInvalid: "Zadejte platný kód", + messageLoginFailed: "Přihlášení se nezdařilo, zkontrolujte své údaje.", + messageForbidden: + "Přihlášení bylo úspěšné, ale nemáte oprávnění. Nemůžete se přihlásit.<br>Vyberte jiného uživatele nebo kontaktujte správce.", + messageSomethingWentWrong: "Něco se pokazilo, zkuste to později.", + messageThisFormIsNotConfigured: "Tento formulář není nakonfigurován.", + messagePasswordResetDisabled: + "Tato funkce nefunguje, protože je na vašem<br>účtu aktivováno dvoufaktorové ověřování. Kontaktujte správce.", + }; + + default: + return { + username: "Username or E-Mail", + password: "Password", + login: "Login", + forgotPasswordLink: "Forgot Password?", + mailAddress: "E-Mail-Address", + requestLink: "Request Link", + digits: "Code", + loginLink: "Login", + secondFactor: "Second Factor Code", + sendDigits: "Send Code", + sendSecondFactorDigits: "Send Code", + resetLoginProcess: "Back to Login", + messageEmptyUserName: "Please enter your username", + messageEmptyPassword: "Please enter your password", + messageEmptyBoth: "Please enter your username and password", + messageEmptyEmail: "Please enter your email address", + messageInvalidEmail: "Please enter a valid email address", + digitsEmpty: "Please enter your code", + digitsInvalid: "Please enter a valid code", + messageLoginFailed: "Login failed, please check your input.", + messageForbidden: + "Login was successful, but you have no permission. You <b>cannot</b> login.<br>You can select another user or contact the administrator.", + messageSomethingWentWrong: + "Something went wrong, please try again later.", + messageThisFormIsNotConfigured: "This form is not configured.", + messagePasswordResetDisabled: + "This function does not work because two-factor<br>authentication is enabled on your account.<br>Please contact the administrator.", + }; + } } /** @@ -992,490 +989,498 @@ function getTranslations() { * @return {initEventHandler} */ function initEventHandler() { - const self = this; - const element = this[loginElementSymbol]; - - const type = "click"; - - element.addEventListener(type, function (event) { - const callback = self.getOption("actions.click"); - - fireCustomEvent(self, "monster-login-clicked", { - element: self, - }); - - if (!isFunction(callback)) { - return; - } - - const element = findTargetElementFromEvent( - event, - ATTRIBUTE_ROLE, - "control", - ); - - if (!(element instanceof Node && self.hasNode(element))) { - return; - } - - callback.call(self, event); - }); - - this[forgotPasswordLinkSymbol].addEventListener(type, (event) => { - event.preventDefault(); - this[forgotPasswordCollapseSymbol].open(); - setTimeout(() => { - this.shadowRoot.querySelector("input[name='email']").focus(); - }, 0); - }); - - this[loginLinkSymbol].addEventListener(type, (event) => { - event.preventDefault(); - this[loginCollapseSymbol].open(); - - setTimeout(() => { - this.shadowRoot.querySelector("input[name='username']").focus(); - }, 0); - }); - - for (const e of this[resetLoginProcessLinksSymbol]) { - e.addEventListener(type, (event) => { - event.preventDefault(); - this[loginCollapseSymbol].open(); - setTimeout(() => { - this.shadowRoot.querySelector("input[name='username']").focus(); - }, 0); - }); - } - - this[loginCollapseSymbol].addEventListener("keydown", (event) => { - if (event.key === "Enter") { - this[loginButtonSymbol].click(); - } - }); - - this[secondFactorCollapseSymbol].addEventListener("keydown", (event) => { - if (event.key === "Enter") { - this[secondFactorButtonSymbol].click(); - } - }); - - this[forgotPasswordCollapseSymbol].addEventListener("keydown", (event) => { - if (event.key === "Enter") { - this[requestLinkButtonSymbol].click(); - } - }); - - this[digitsCollapseSymbol].addEventListener("keydown", (event) => { - if (event.key === "Enter") { - this[digitsButtonSymbol].click(); - } - }); - - this[loginButtonSymbol].setOption("actions.click", (event) => { - // get username and password - const username = this.shadowRoot.querySelector( - "input[name='username']", - ).value; - const password = this.shadowRoot.querySelector("monster-password").value; - - let missingBits = 0; - if (username === "" || username === null) { - this.setOption("classes.usernameInvalid", "invalid"); - missingBits |= 1; // Set bit 1 for username - } else { - this.setOption("classes.usernameInvalid", ""); - } - - if (password === "" || password === null) { - this.setOption("classes.passwordInvalid", "invalid"); - missingBits |= 2; // Set bit 2 for password - } else { - this.setOption("classes.passwordInvalid", ""); - } - - let msg = null; - if (missingBits === 1) { - // missing username - msg = this.getOption("labels.messageEmptyUserName"); - - setTimeout(() => { - this.shadowRoot.querySelector("input[name='username']").focus(); - }, 0); - } else if (missingBits === 2) { - // missing password - msg = this.getOption("labels.messageEmptyPassword"); - - setTimeout(() => { - this.shadowRoot.querySelector("monster-password").focus(); - }); - } else if (missingBits === 3) { - msg = this.getOption("labels.messageEmptyBoth"); - - setTimeout(() => { - this.shadowRoot.querySelector("input[name='username']").focus(); - }, 0); - } - - const timeout = this.getOption("timeoutForMessage"); - - if (msg !== null && msg !== undefined) { - this[loginButtonSymbol].setMessage(msg); - this[loginButtonSymbol].showMessage(timeout); - this[loginButtonSymbol].setState("failed", timeout); - return; - } - - const url = this.getOption("fetch.login.url"); - - if (url === "" || url === null || url === undefined) { - this[loginButtonSymbol].setMessage( - this.getOption("labels.messageThisFormIsNotConfigured"), - ); - this[loginButtonSymbol].showMessage(timeout); - this[loginButtonSymbol].setState("failed", timeout); - return; - } - - const options = { - method: this.getOption("fetch.login.method"), - mode: this.getOption("fetch.login.mode"), - headers: this.getOption("fetch.login.headers"), - credentials: this.getOption("fetch.login.credentials"), - body: JSON.stringify({username, password}), - }; - - getWindow() - .fetch(url, options) - .then((response) => { - if (response.ok) { - this[loginButtonSymbol].setState("successful", timeout); - setTimeout(() => { - this.openLoggedIn(); - }, 1200); - } else { - if (response.status === 403) { - this[loginButtonSymbol].setMessage( - this.getOption("labels.messageForbidden"), - ); - } else if (response.status === 401) { - const wwwAuthenticateHeader = - response.headers.get("www-authenticate"); - if (wwwAuthenticateHeader) { - const wwwAuthenticateParts = wwwAuthenticateHeader - .split(/,\s*/) - .map((part) => { - const [key, value] = part.split("="); - return { - key: key.trim(), - value: value ? value.trim().replace(/^"|"$/g, "") : null, - }; - }); - - const filteredParts = wwwAuthenticateParts.filter( - (part) => part.key.toLowerCase() === "2fa", - ); - if (filteredParts.length > 0) { - const timeout = this.getOption("timeoutForSuccess"); - this[loginButtonSymbol].setState("successful", timeout); - setTimeout(() => { - this.openSecondFactor(); - const digitsElement = this.shadowRoot.getElementById( - "secondFactorControl", - ); - digitsElement.focus(); - }, timeout); - return; - } - } - - this[loginButtonSymbol].setMessage( - this.getOption("labels.messageLoginFailed"), - ); - } else { - this[loginButtonSymbol].setMessage( - this.getOption("labels.messageSomethingWentWrong"), - ); - } - this[loginButtonSymbol].showMessage(timeout); - this[loginButtonSymbol].setState("failed", timeout); - - setTimeout(() => { - this.shadowRoot.querySelector("input[name='username']").focus(); - }, 0); - } - }) - .catch((error) => { - this[loginButtonSymbol].setMessage( - this.getOption("labels.messageSomethingWentWrong"), - ); - this[loginButtonSymbol].showMessage(timeout); - this[loginButtonSymbol].setState("failed", timeout); - - setTimeout(() => { - this.shadowRoot.querySelector("input[name='username']").focus(); - }, 0); - }); - }); - - this[requestLinkButtonSymbol].setOption("actions.click", (event) => { - const emailElement = this.shadowRoot.querySelector("input[name='email']"); - - // get username and password - const mail = emailElement.value; - const valid = emailElement.checkValidity(); - - let msg = null; - if (mail === "" || mail === null) { - this.setOption("classes.emailInvalid", "invalid"); - msg = this.getOption("labels.messageEmptyEmail"); - } else if (!valid) { - this.setOption("classes.emailInvalid", "invalid"); - msg = this.getOption("labels.messageInvalidEmail"); - } else { - this.setOption("classes.emailInvalid", ""); - } - - const timeout = this.getOption("timeoutForMessage"); - - if (msg !== null && msg !== undefined) { - this[requestLinkButtonSymbol].setMessage(msg); - this[requestLinkButtonSymbol].showMessage(timeout); - this[requestLinkButtonSymbol].setState("failed", timeout); - return; - } - - const url = this.getOption("fetch.forgotPassword.url"); - - if (url === "" || url === null || url === undefined) { - this[requestLinkButtonSymbol].setMessage( - this.getOption("labels.messageThisFormIsNotConfigured"), - ); - this[requestLinkButtonSymbol].showMessage(timeout); - this[requestLinkButtonSymbol].setState("failed", timeout); - return; - } - - const options = { - method: this.getOption("fetch.forgotPassword.method"), - mode: this.getOption("fetch.forgotPassword.mode"), - headers: this.getOption("fetch.forgotPassword.headers"), - credentials: this.getOption("fetch.forgotPassword.credentials"), - body: JSON.stringify({mail}), - }; - - getWindow() - .fetch(url, options) - .then((response) => { - if (response.ok) { - const timeout = this.getOption("timeoutForSuccess"); - this[requestLinkButtonSymbol].setState("successful", timeout); - setTimeout(() => { - this.openDigits(); - }, timeout); - } else { - if (response.status === 403) { - this[requestLinkButtonSymbol].setMessage( - this.getOption("labels.messageForbidden"), - ); - } else if (response.status === 401) { - if ( - response.headers.has("x-password-reset") && - response.headers.get("x-password-reset").includes("disabled") - ) { - this[requestLinkButtonSymbol].setMessage( - this.getOption("labels.messagePasswordResetDisabled"), - ); - } else { - this[requestLinkButtonSymbol].setMessage( - this.getOption("labels.messageLoginFailed"), - ); - } - } else { - this[requestLinkButtonSymbol].setMessage( - this.getOption("labels.messageSomethingWentWrong"), - ); - } - this[requestLinkButtonSymbol].showMessage(timeout); - this[requestLinkButtonSymbol].setState("failed", timeout); - } - }) - .catch(() => { - this[requestLinkButtonSymbol].setMessage( - this.getOption("labels.messageSomethingWentWrong"), - ); - this[requestLinkButtonSymbol].showMessage(timeout); - this[requestLinkButtonSymbol].setState("failed", timeout); - }); - }); - - this[secondFactorButtonSymbol].setOption("actions.click", (event) => { - const digitsElement = this.shadowRoot.getElementById("secondFactorControl"); - - const digits = digitsElement.value; - const valid = digitsElement.checkValidity(); - - let msg = null; - if (digits === "" || digits === null) { - msg = this.getOption("labels.digitsEmpty"); - } else if (!valid) { - msg = this.getOption("labels.digitsInvalid"); - } - - const timeout = this.getOption("timeoutForMessage"); - - if (msg !== null && msg !== undefined) { - this[secondFactorButtonSymbol].setMessage(msg); - this[secondFactorButtonSymbol].showMessage(timeout); - this[secondFactorButtonSymbol].setState("failed", timeout); - return; - } - - const url = this.getOption("fetch.secondFactor.url"); - - if (url === "" || url === null || url === undefined) { - this[secondFactorButtonSymbol].setMessage( - this.getOption("labels.messageThisFormIsNotConfigured"), - ); - this[secondFactorButtonSymbol].showMessage(timeout); - this[secondFactorButtonSymbol].setState("failed", timeout); - return; - } - - const options = { - method: this.getOption("fetch.secondFactor.method"), - mode: this.getOption("fetch.secondFactor.mode"), - headers: this.getOption("fetch.secondFactor.headers"), - credentials: this.getOption("fetch.secondFactor.credentials"), - body: JSON.stringify({digits}), - }; - - getWindow() - .fetch(url, options) - .then((response) => { - if (response.ok) { - const timeout = this.getOption("timeoutForSuccess"); - this[secondFactorButtonSymbol].setState("successful", timeout); - setTimeout(() => { - this.openLoggedIn(); - }, timeout); - } else { - if (response.status === 403) { - this[secondFactorButtonSymbol].setMessage( - this.getOption("labels.messageForbidden"), - ); - } else if (response.status === 401) { - this[secondFactorButtonSymbol].setMessage( - this.getOption("labels.messageLoginFailed"), - ); - } else { - this[secondFactorButtonSymbol].setMessage( - this.getOption("labels.messageSomethingWentWrong"), - ); - } - this[secondFactorButtonSymbol].showMessage(timeout); - this[secondFactorButtonSymbol].setState("failed", timeout); - setTimeout(() => { - digitsElement.focus(); - }, 0); - } - }) - .catch(() => { - this[secondFactorButtonSymbol].setMessage( - this.getOption("labels.messageSomethingWentWrong"), - ); - this[secondFactorButtonSymbol].showMessage(timeout); - this[secondFactorButtonSymbol].setState("failed", timeout); - setTimeout(() => { - digitsElement.focus(); - }, 0); - }); - }); - - this[digitsButtonSymbol].setOption("actions.click", (event) => { - const digitsElement = this.shadowRoot.getElementById("digitsControl"); - - const digits = digitsElement.value; - const valid = digitsElement.checkValidity(); - - let msg = null; - if (digits === "" || digits === null || digits === undefined) { - msg = this.getOption("labels.digitsEmpty"); - } else if (!valid) { - msg = this.getOption("labels.digitsInvalid"); - } - - const timeout = this.getOption("timeoutForMessage"); - if (msg !== null && msg !== undefined) { - this[digitsButtonSymbol].setMessage(msg); - this[digitsButtonSymbol].showMessage(timeout); - this[digitsButtonSymbol].setState("failed", timeout); - return; - } - - const url = this.getOption("fetch.digits.url"); - - if (url === "" || url === null || url === undefined) { - this[digitsButtonSymbol].setMessage( - this.getOption("labels.messageThisFormIsNotConfigured"), - ); - this[digitsButtonSymbol].showMessage(timeout); - this[digitsButtonSymbol].setState("failed", timeout); - return; - } - - const options = { - method: this.getOption("fetch.digits.method"), - mode: this.getOption("fetch.digits.mode"), - headers: this.getOption("fetch.digits.headers"), - credentials: this.getOption("fetch.digits.credentials"), - body: JSON.stringify({digits}), - }; - - getWindow() - .fetch(url, options) - .then((response) => { - const timeout = this.getOption("timeoutForSuccess"); - - if (response.ok) { - this[digitsButtonSymbol].setState("successful", timeout); - setTimeout(() => { - this.openLoggedIn(); - }, timeout); - } else { - if (response.status === 403) { - this[digitsButtonSymbol].setMessage( - this.getOption("labels.messageForbidden"), - ); - } else if (response.status === 401) { - this[digitsButtonSymbol].setMessage( - this.getOption("labels.messageLoginFailed"), - ); - } else { - this[digitsButtonSymbol].setMessage( - this.getOption("labels.messageSomethingWentWrong"), - ); - } - this[digitsButtonSymbol].showMessage(timeout); - this[digitsButtonSymbol].setState("failed", timeout); - setTimeout(() => { - digitsElement.focus(); - }, 0); - } - }) - .catch(() => { - this[digitsButtonSymbol].setMessage( - this.getOption("labels.messageSomethingWentWrong"), - ); - this[digitsButtonSymbol].showMessage(timeout); - this[digitsButtonSymbol].setState("failed", timeout); - setTimeout(() => { - digitsElement.focus(); - }, 0); - }); - }); - - return this; + const self = this; + const element = this[loginElementSymbol]; + + const type = "click"; + + element.addEventListener(type, function (event) { + const callback = self.getOption("actions.click"); + + fireCustomEvent(self, "monster-login-clicked", { + element: self, + }); + + if (!isFunction(callback)) { + return; + } + + const element = findTargetElementFromEvent( + event, + ATTRIBUTE_ROLE, + "control", + ); + + if (!(element instanceof Node && self.hasNode(element))) { + return; + } + + callback.call(self, event); + }); + + this[forgotPasswordLinkSymbol].addEventListener(type, (event) => { + event.preventDefault(); + this[forgotPasswordCollapseSymbol].open(); + setTimeout(() => { + this.shadowRoot.querySelector("input[name='email']").focus(); + }, 0); + }); + + this[loginLinkSymbol].addEventListener(type, (event) => { + event.preventDefault(); + this[loginCollapseSymbol].open(); + + setTimeout(() => { + this.shadowRoot.querySelector("input[name='username']").focus(); + }, 0); + }); + + for (const e of this[resetLoginProcessLinksSymbol]) { + e.addEventListener(type, (event) => { + event.preventDefault(); + this[loginCollapseSymbol].open(); + setTimeout(() => { + this.shadowRoot.querySelector("input[name='username']").focus(); + }, 0); + }); + } + + this[loginCollapseSymbol].addEventListener("keydown", (event) => { + if (event.key === "Enter") { + setTimeout(() => { + this[loginButtonSymbol].click(); + }, 100); + } + }); + + this[secondFactorCollapseSymbol].addEventListener("keydown", (event) => { + if (event.key === "Enter") { + setTimeout(() => { + this[secondFactorButtonSymbol].click(); + }, 100); + } + }); + + this[forgotPasswordCollapseSymbol].addEventListener("keydown", (event) => { + if (event.key === "Enter") { + setTimeout(() => { + this[requestLinkButtonSymbol].click(); + }, 100); + } + }); + + this[digitsCollapseSymbol].addEventListener("keydown", (event) => { + if (event.key === "Enter") { + setTimeout(() => { + this[digitsButtonSymbol].click(); + }, 100); + } + }); + + this[loginButtonSymbol].setOption("actions.click", (event) => { + // get username and password + const username = this.shadowRoot.querySelector( + "input[name='username']", + ).value; + const password = this.shadowRoot.querySelector("monster-password").value; + + let missingBits = 0; + if (username === "" || username === null) { + this.setOption("classes.usernameInvalid", "invalid"); + missingBits |= 1; // Set bit 1 for username + } else { + this.setOption("classes.usernameInvalid", ""); + } + + if (password === "" || password === null) { + this.setOption("classes.passwordInvalid", "invalid"); + missingBits |= 2; // Set bit 2 for password + } else { + this.setOption("classes.passwordInvalid", ""); + } + + let msg = null; + if (missingBits === 1) { + // missing username + msg = this.getOption("labels.messageEmptyUserName"); + + setTimeout(() => { + this.shadowRoot.querySelector("input[name='username']").focus(); + }, 0); + } else if (missingBits === 2) { + // missing password + msg = this.getOption("labels.messageEmptyPassword"); + + setTimeout(() => { + this.shadowRoot.querySelector("monster-password").focus(); + }); + } else if (missingBits === 3) { + msg = this.getOption("labels.messageEmptyBoth"); + + setTimeout(() => { + this.shadowRoot.querySelector("input[name='username']").focus(); + }, 0); + } + + const timeout = this.getOption("timeoutForMessage"); + + if (msg !== null && msg !== undefined) { + this[loginButtonSymbol].setMessage(msg); + this[loginButtonSymbol].showMessage(timeout); + this[loginButtonSymbol].setState("failed", timeout); + return; + } + + const url = this.getOption("fetch.login.url"); + + if (url === "" || url === null || url === undefined) { + this[loginButtonSymbol].setMessage( + this.getOption("labels.messageThisFormIsNotConfigured"), + ); + this[loginButtonSymbol].showMessage(timeout); + this[loginButtonSymbol].setState("failed", timeout); + return; + } + + const options = { + method: this.getOption("fetch.login.method"), + mode: this.getOption("fetch.login.mode"), + headers: this.getOption("fetch.login.headers"), + credentials: this.getOption("fetch.login.credentials"), + body: JSON.stringify({ username, password }), + }; + + getWindow() + .fetch(url, options) + .then((response) => { + if (response.ok) { + this[loginButtonSymbol].setState("successful", timeout); + setTimeout(() => { + this.openLoggedIn(); + }, 1200); + } else { + if (response.status === 403) { + this[loginButtonSymbol].setMessage( + this.getOption("labels.messageForbidden"), + ); + } else if (response.status === 401) { + const wwwAuthenticateHeader = + response.headers.get("www-authenticate"); + if (wwwAuthenticateHeader) { + const wwwAuthenticateParts = wwwAuthenticateHeader + .split(/,\s*/) + .map((part) => { + const [key, value] = part.split("="); + return { + key: key.trim(), + value: value ? value.trim().replace(/^"|"$/g, "") : null, + }; + }); + + const filteredParts = wwwAuthenticateParts.filter( + (part) => part.key.toLowerCase() === "2fa", + ); + if (filteredParts.length > 0) { + const timeout = this.getOption("timeoutForSuccess"); + this[loginButtonSymbol].setState("successful", timeout); + setTimeout(() => { + this.openSecondFactor(); + const digitsElement = this.shadowRoot.getElementById( + "secondFactorControl", + ); + digitsElement.focus(); + }, timeout); + return; + } + } + + this[loginButtonSymbol].setMessage( + this.getOption("labels.messageLoginFailed"), + ); + } else { + this[loginButtonSymbol].setMessage( + this.getOption("labels.messageSomethingWentWrong"), + ); + } + this[loginButtonSymbol].showMessage(timeout); + this[loginButtonSymbol].setState("failed", timeout); + + setTimeout(() => { + this.shadowRoot.querySelector("input[name='username']").focus(); + }, 0); + } + }) + .catch((error) => { + this[loginButtonSymbol].setMessage( + this.getOption("labels.messageSomethingWentWrong"), + ); + this[loginButtonSymbol].showMessage(timeout); + this[loginButtonSymbol].setState("failed", timeout); + + setTimeout(() => { + this.shadowRoot.querySelector("input[name='username']").focus(); + }, 0); + }); + }); + + this[requestLinkButtonSymbol].setOption("actions.click", (event) => { + const emailElement = this.shadowRoot.querySelector("input[name='email']"); + + // get username and password + const mail = emailElement.value; + const valid = emailElement.checkValidity(); + + let msg = null; + if (mail === "" || mail === null) { + this.setOption("classes.emailInvalid", "invalid"); + msg = this.getOption("labels.messageEmptyEmail"); + } else if (!valid) { + this.setOption("classes.emailInvalid", "invalid"); + msg = this.getOption("labels.messageInvalidEmail"); + } else { + this.setOption("classes.emailInvalid", ""); + } + + const timeout = this.getOption("timeoutForMessage"); + + if (msg !== null && msg !== undefined) { + this[requestLinkButtonSymbol].setMessage(msg); + this[requestLinkButtonSymbol].showMessage(timeout); + this[requestLinkButtonSymbol].setState("failed", timeout); + return; + } + + const url = this.getOption("fetch.forgotPassword.url"); + + if (url === "" || url === null || url === undefined) { + this[requestLinkButtonSymbol].setMessage( + this.getOption("labels.messageThisFormIsNotConfigured"), + ); + this[requestLinkButtonSymbol].showMessage(timeout); + this[requestLinkButtonSymbol].setState("failed", timeout); + return; + } + + const options = { + method: this.getOption("fetch.forgotPassword.method"), + mode: this.getOption("fetch.forgotPassword.mode"), + headers: this.getOption("fetch.forgotPassword.headers"), + credentials: this.getOption("fetch.forgotPassword.credentials"), + body: JSON.stringify({ mail }), + }; + + getWindow() + .fetch(url, options) + .then((response) => { + if (response.ok) { + const timeout = this.getOption("timeoutForSuccess"); + this[requestLinkButtonSymbol].setState("successful", timeout); + setTimeout(() => { + this.openDigits(); + }, timeout); + } else { + if (response.status === 403) { + this[requestLinkButtonSymbol].setMessage( + this.getOption("labels.messageForbidden"), + ); + } else if (response.status === 401) { + if ( + response.headers.has("x-password-reset") && + response.headers.get("x-password-reset").includes("disabled") + ) { + this[requestLinkButtonSymbol].setMessage( + this.getOption("labels.messagePasswordResetDisabled"), + ); + } else { + this[requestLinkButtonSymbol].setMessage( + this.getOption("labels.messageLoginFailed"), + ); + } + } else { + this[requestLinkButtonSymbol].setMessage( + this.getOption("labels.messageSomethingWentWrong"), + ); + } + this[requestLinkButtonSymbol].showMessage(timeout); + this[requestLinkButtonSymbol].setState("failed", timeout); + } + }) + .catch(() => { + this[requestLinkButtonSymbol].setMessage( + this.getOption("labels.messageSomethingWentWrong"), + ); + this[requestLinkButtonSymbol].showMessage(timeout); + this[requestLinkButtonSymbol].setState("failed", timeout); + }); + }); + + this[secondFactorButtonSymbol].setOption("actions.click", (event) => { + const digitsElement = this.shadowRoot.getElementById("secondFactorControl"); + + const digits = digitsElement.value; + const valid = digitsElement.checkValidity(); + + let msg = null; + if (digits === "" || digits === null) { + msg = this.getOption("labels.digitsEmpty"); + } else if (!valid) { + msg = this.getOption("labels.digitsInvalid"); + } + + const timeout = this.getOption("timeoutForMessage"); + + if (msg !== null && msg !== undefined) { + this[secondFactorButtonSymbol].setMessage(msg); + this[secondFactorButtonSymbol].showMessage(timeout); + this[secondFactorButtonSymbol].setState("failed", timeout); + return; + } + + const url = this.getOption("fetch.secondFactor.url"); + + if (url === "" || url === null || url === undefined) { + this[secondFactorButtonSymbol].setMessage( + this.getOption("labels.messageThisFormIsNotConfigured"), + ); + this[secondFactorButtonSymbol].showMessage(timeout); + this[secondFactorButtonSymbol].setState("failed", timeout); + return; + } + + const options = { + method: this.getOption("fetch.secondFactor.method"), + mode: this.getOption("fetch.secondFactor.mode"), + headers: this.getOption("fetch.secondFactor.headers"), + credentials: this.getOption("fetch.secondFactor.credentials"), + body: JSON.stringify({ digits }), + }; + + getWindow() + .fetch(url, options) + .then((response) => { + if (response.ok) { + const timeout = this.getOption("timeoutForSuccess"); + this[secondFactorButtonSymbol].setState("successful", timeout); + setTimeout(() => { + this.openLoggedIn(); + }, timeout); + } else { + if (response.status === 403) { + this[secondFactorButtonSymbol].setMessage( + this.getOption("labels.messageForbidden"), + ); + } else if (response.status === 401) { + this[secondFactorButtonSymbol].setMessage( + this.getOption("labels.messageLoginFailed"), + ); + } else { + this[secondFactorButtonSymbol].setMessage( + this.getOption("labels.messageSomethingWentWrong"), + ); + } + this[secondFactorButtonSymbol].showMessage(timeout); + this[secondFactorButtonSymbol].setState("failed", timeout); + setTimeout(() => { + digitsElement.focus(); + }, 0); + } + }) + .catch(() => { + this[secondFactorButtonSymbol].setMessage( + this.getOption("labels.messageSomethingWentWrong"), + ); + this[secondFactorButtonSymbol].showMessage(timeout); + this[secondFactorButtonSymbol].setState("failed", timeout); + setTimeout(() => { + digitsElement.focus(); + }, 0); + }); + }); + + this[digitsButtonSymbol].setOption("actions.click", (event) => { + const digitsElement = this.shadowRoot.getElementById("digitsControl"); + + const digits = digitsElement.value; + const valid = digitsElement.checkValidity(); + + let msg = null; + if (digits === "" || digits === null || digits === undefined) { + msg = this.getOption("labels.digitsEmpty"); + } else if (!valid) { + msg = this.getOption("labels.digitsInvalid"); + } + + const timeout = this.getOption("timeoutForMessage"); + if (msg !== null && msg !== undefined) { + this[digitsButtonSymbol].setMessage(msg); + this[digitsButtonSymbol].showMessage(timeout); + this[digitsButtonSymbol].setState("failed", timeout); + return; + } + + const url = this.getOption("fetch.digits.url"); + + if (url === "" || url === null || url === undefined) { + this[digitsButtonSymbol].setMessage( + this.getOption("labels.messageThisFormIsNotConfigured"), + ); + this[digitsButtonSymbol].showMessage(timeout); + this[digitsButtonSymbol].setState("failed", timeout); + return; + } + + const options = { + method: this.getOption("fetch.digits.method"), + mode: this.getOption("fetch.digits.mode"), + headers: this.getOption("fetch.digits.headers"), + credentials: this.getOption("fetch.digits.credentials"), + body: JSON.stringify({ digits }), + }; + + getWindow() + .fetch(url, options) + .then((response) => { + const timeout = this.getOption("timeoutForSuccess"); + + if (response.ok) { + this[digitsButtonSymbol].setState("successful", timeout); + setTimeout(() => { + this.openLoggedIn(); + }, timeout); + } else { + if (response.status === 403) { + this[digitsButtonSymbol].setMessage( + this.getOption("labels.messageForbidden"), + ); + } else if (response.status === 401) { + this[digitsButtonSymbol].setMessage( + this.getOption("labels.messageLoginFailed"), + ); + } else { + this[digitsButtonSymbol].setMessage( + this.getOption("labels.messageSomethingWentWrong"), + ); + } + this[digitsButtonSymbol].showMessage(timeout); + this[digitsButtonSymbol].setState("failed", timeout); + setTimeout(() => { + digitsElement.focus(); + }, 0); + } + }) + .catch(() => { + this[digitsButtonSymbol].setMessage( + this.getOption("labels.messageSomethingWentWrong"), + ); + this[digitsButtonSymbol].showMessage(timeout); + this[digitsButtonSymbol].setState("failed", timeout); + setTimeout(() => { + digitsElement.focus(); + }, 0); + }); + }); + + return this; } /** @@ -1483,50 +1488,50 @@ function initEventHandler() { * @return {void} */ function initControlReferences() { - this[loginElementSymbol] = this.shadowRoot.querySelector( - `[${ATTRIBUTE_ROLE}="control"]`, - ); - - // data-monster-role="forgot-password-link" - - this[forgotPasswordLinkSymbol] = this.shadowRoot.querySelector( - `[data-monster-role="forgot-password-link"]`, - ); - - this[forgotPasswordCollapseSymbol] = this.shadowRoot.querySelector( - `[data-monster-role="forgot-password-collapse"]`, - ); - - this[loginCollapseSymbol] = this.shadowRoot.querySelector( - `[data-monster-role="login-collapse"]`, - ); - - this[loginLinkSymbol] = this.shadowRoot.querySelector( - `[data-monster-role="login-link"]`, - ); - - this[secondFactorCollapseSymbol] = this.shadowRoot.querySelector( - `[data-monster-role="second-factor-collapse"]`, - ); - - this[resetLoginProcessLinksSymbol] = this.shadowRoot.querySelectorAll( - `[data-monster-role="reset-login-process-link"]`, - ); - - this[loggedInCollapseSymbol] = this.shadowRoot.querySelector( - `[data-monster-role="logged-in-collapse"]`, - ); - - this[digitsCollapseSymbol] = this.shadowRoot.querySelector( - `[data-monster-role="digits-collapse"]`, - ); - - this[loginButtonSymbol] = this.shadowRoot.getElementById("loginButton"); - this[requestLinkButtonSymbol] = - this.shadowRoot.getElementById("requestLinkButton"); - this[secondFactorButtonSymbol] = - this.shadowRoot.getElementById("secondFactorButton"); - this[digitsButtonSymbol] = this.shadowRoot.getElementById("digitsButton"); + this[loginElementSymbol] = this.shadowRoot.querySelector( + `[${ATTRIBUTE_ROLE}="control"]`, + ); + + // data-monster-role="forgot-password-link" + + this[forgotPasswordLinkSymbol] = this.shadowRoot.querySelector( + `[data-monster-role="forgot-password-link"]`, + ); + + this[forgotPasswordCollapseSymbol] = this.shadowRoot.querySelector( + `[data-monster-role="forgot-password-collapse"]`, + ); + + this[loginCollapseSymbol] = this.shadowRoot.querySelector( + `[data-monster-role="login-collapse"]`, + ); + + this[loginLinkSymbol] = this.shadowRoot.querySelector( + `[data-monster-role="login-link"]`, + ); + + this[secondFactorCollapseSymbol] = this.shadowRoot.querySelector( + `[data-monster-role="second-factor-collapse"]`, + ); + + this[resetLoginProcessLinksSymbol] = this.shadowRoot.querySelectorAll( + `[data-monster-role="reset-login-process-link"]`, + ); + + this[loggedInCollapseSymbol] = this.shadowRoot.querySelector( + `[data-monster-role="logged-in-collapse"]`, + ); + + this[digitsCollapseSymbol] = this.shadowRoot.querySelector( + `[data-monster-role="digits-collapse"]`, + ); + + this[loginButtonSymbol] = this.shadowRoot.getElementById("loginButton"); + this[requestLinkButtonSymbol] = + this.shadowRoot.getElementById("requestLinkButton"); + this[secondFactorButtonSymbol] = + this.shadowRoot.getElementById("secondFactorButton"); + this[digitsButtonSymbol] = this.shadowRoot.getElementById("digitsButton"); } /** @@ -1534,8 +1539,8 @@ function initControlReferences() { * @return {string} */ function getTemplate() { - // language=HTML - return ` + // language=HTML + return ` <template id="urls"> <li><a data-monster-attributes="href path:urls.url"