From 537c703944e36f3c673d76018b788e2f9c445f9c Mon Sep 17 00:00:00 2001
From: Volker Schukai <volker.schukai@schukai.com>
Date: Sun, 23 Mar 2025 20:01:57 +0100
Subject: [PATCH] fix: update doc

---
 source/components/form/login.mjs | 2715 +++++++++++++++---------------
 1 file changed, 1394 insertions(+), 1321 deletions(-)

diff --git a/source/components/form/login.mjs b/source/components/form/login.mjs
index 704b07b7..11411227 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
@@ -128,786 +128,859 @@ const digitsCollapseSymbol = Symbol("digitsCollapse");
  *
  * @since 3.113.0
  * @copyright schukai GmbH
- * @summary A beautiful Login that can make your life easier and also looks good.
+ * @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} actions Callbacks
-	 * @property {string} actions.click="throw Error" Callback when clicked
-	 * @property {Object} features Features
-	 * @property {Object} classes CSS classes
-	 * @property {boolean} disabled=false Disabled state
-	 */
-	get defaults() {
-		return Object.assign({}, super.defaults, {
-			templates: {
-				main: getTemplate(),
-			},
-			labels: getTranslations(),
-			classes: {
-				usernameInvalid: "",
-				passwordInvalid: "",
-				emailInvalid: "",
-			},
-			disabled: false,
-			features: {
-				forgotPassword: true,
-				redirectToFirstSuccessUrl: true,
-			},
-			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",
-					},
-					credentials: "same-origin",
-				},
-				forgotPassword: {
-					url: "",
-					method: "POST",
-					mode: "same-origin",
-					headers: {
-						accept: "application/json",
-					},
-					credentials: "same-origin",
-				},
-				digits: {
-					url: "",
-					method: "POST",
-					mode: "same-origin",
-					headers: {
-						accept: "application/json",
-					},
-					credentials: "same-origin",
-				},
-				secondFactor: {
-					url: "",
-					method: "POST",
-					mode: "same-origin",
-					headers: {
-						accept: "application/json",
-					},
-					credentials: "same-origin",
-				},
-			},
-		});
-	}
-
-	/**
-	 * @returns {Login}
-	 */
-	openLogin() {
-		this[loginCollapseSymbol].open();
-		this.shadowRoot.querySelector("input[name='username']").focus();
-		return this;
-	}
-
-	/**
-	 *
-	 * @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;
-	}
-
-	/**
-	 *
-	 * @returns {Login}
-	 */
-	openSecondFactor() {
-		this[secondFactorCollapseSymbol].open();
-		this.shadowRoot.getElementById("secondFactorButton").focus();
-		return this;
-	}
-
-	openDigits() {
-		this[digitsCollapseSymbol].open();
-		this.shadowRoot.getElementById("digitsControl").focus();
-		return this;
-	}
-
-	openLoggedIn() {
-		this[loggedInCollapseSymbol].open();
-		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: true,
+            },
+            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",
+                    },
+                    credentials: "same-origin",
+                },
+                forgotPassword: {
+                    url: "",
+                    method: "POST",
+                    mode: "same-origin",
+                    headers: {
+                        accept: "application/json",
+                    },
+                    credentials: "same-origin",
+                },
+                digits: {
+                    url: "",
+                    method: "POST",
+                    mode: "same-origin",
+                    headers: {
+                        accept: "application/json",
+                    },
+                    credentials: "same-origin",
+                },
+                secondFactor: {
+                    url: "",
+                    method: "POST",
+                    mode: "same-origin",
+                    headers: {
+                        accept: "application/json",
+                    },
+                    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.",
+            };
+    }
 }
 
 /**
@@ -915,490 +988,490 @@ 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") {
+            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;
 }
 
 /**
@@ -1406,50 +1479,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");
 }
 
 /**
@@ -1457,8 +1530,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"
-- 
GitLab