changed locales from .ts to .json,
configured i18n-ally, upgrade APIlite and regenerated BackendAPI.ts, fixed successMessage value
This commit is contained in:
@ -2,11 +2,12 @@
|
||||
* Generated by APIlite
|
||||
* https://gitea.tpsoft.org/TPsoft.org/APIlite
|
||||
*
|
||||
* 2026-02-13 10:00:58 */
|
||||
* 2026-02-14 06:30:12 */
|
||||
|
||||
export interface APIliteActionResponse<T> {
|
||||
status: 'OK';
|
||||
data: T;
|
||||
msg: string;
|
||||
}
|
||||
|
||||
export interface APIliteErrorResponse {
|
||||
@ -36,6 +37,9 @@ export interface APIliteHelpResponse {
|
||||
javascript_version: string;
|
||||
typescript_version: string;
|
||||
actions: APIliteMethodDoc[];
|
||||
status: string;
|
||||
data: string;
|
||||
msg: string;
|
||||
}
|
||||
|
||||
class BackendAPI {
|
||||
|
||||
@ -1,10 +1,10 @@
|
||||
import { createI18n } from 'vue-i18n'
|
||||
|
||||
import cs from '@/locales/cs'
|
||||
import de from '@/locales/de'
|
||||
import en from '@/locales/en'
|
||||
import es from '@/locales/es'
|
||||
import sk from '@/locales/sk'
|
||||
import cs from '@/locales/cs.json'
|
||||
import de from '@/locales/de.json'
|
||||
import en from '@/locales/en.json'
|
||||
import es from '@/locales/es.json'
|
||||
import sk from '@/locales/sk.json'
|
||||
|
||||
export const SUPPORTED_LOCALES = ['sk', 'cs', 'en', 'es', 'de'] as const
|
||||
export type AppLocale = (typeof SUPPORTED_LOCALES)[number]
|
||||
@ -12,33 +12,33 @@ export type AppLocale = (typeof SUPPORTED_LOCALES)[number]
|
||||
const fallbackLocale: AppLocale = 'sk'
|
||||
|
||||
const isSupportedLocale = (value: string | null): value is AppLocale => {
|
||||
return value !== null && SUPPORTED_LOCALES.includes(value as AppLocale)
|
||||
return value !== null && SUPPORTED_LOCALES.includes(value as AppLocale)
|
||||
}
|
||||
|
||||
const browserLocale = navigator.language.slice(0, 2).toLowerCase()
|
||||
const storedLocale = localStorage.getItem('locale')
|
||||
|
||||
const locale: AppLocale = isSupportedLocale(storedLocale)
|
||||
? storedLocale
|
||||
: isSupportedLocale(browserLocale)
|
||||
? browserLocale
|
||||
: fallbackLocale
|
||||
? storedLocale
|
||||
: isSupportedLocale(browserLocale)
|
||||
? browserLocale
|
||||
: fallbackLocale
|
||||
|
||||
if (!isSupportedLocale(storedLocale) || storedLocale !== locale) {
|
||||
localStorage.setItem('locale', locale)
|
||||
localStorage.setItem('locale', locale)
|
||||
}
|
||||
|
||||
const i18n = createI18n({
|
||||
legacy: false,
|
||||
locale,
|
||||
fallbackLocale,
|
||||
messages: {
|
||||
sk,
|
||||
cs,
|
||||
en,
|
||||
es,
|
||||
de,
|
||||
},
|
||||
legacy: false,
|
||||
locale,
|
||||
fallbackLocale,
|
||||
messages: {
|
||||
sk,
|
||||
cs,
|
||||
en,
|
||||
es,
|
||||
de,
|
||||
},
|
||||
})
|
||||
|
||||
export default i18n
|
||||
|
||||
41
frontend/src/locales/cs.json
Normal file
41
frontend/src/locales/cs.json
Normal file
@ -0,0 +1,41 @@
|
||||
{
|
||||
"app": {
|
||||
"name": "Nutrio",
|
||||
"slogan": "Plánování jídel, výživa a denní přehled na jednom místě."
|
||||
},
|
||||
"auth": {
|
||||
"title": "Přihlášení",
|
||||
"subtitle": "Použij e-mail a heslo. Pokud účet neexistuje, vytvoří se automaticky.",
|
||||
"emailLabel": "E-mail",
|
||||
"emailPlaceholder": "např. jméno{'@'}domena.cz",
|
||||
"passwordLabel": "Heslo",
|
||||
"passwordPlaceholder": "Zadej heslo",
|
||||
"submit": "Přihlásit se",
|
||||
"submitting": "Zpracovávám...",
|
||||
"helper": "Po úspěšném přihlášení bude token uložen do prohlížeče.",
|
||||
"tokenSaved": "Token byl uložen.",
|
||||
"successLoggedIn": "Přihlášení bylo úspěšné.",
|
||||
"successAutoRegistered": "Účet neexistoval, byl vytvořen a uživatel je přihlášen.",
|
||||
"themeToggle": "Přepnout režim",
|
||||
"languageLabel": "Jazyk",
|
||||
"showPassword": "Zobrazit heslo",
|
||||
"hidePassword": "Skrýt heslo",
|
||||
"errors": {
|
||||
"invalidEmail": "Zadej platný email.",
|
||||
"passwordRequired": "Zadej heslo.",
|
||||
"invalidCredentials": "Email nebo heslo nejsou správně.",
|
||||
"loginFailed": "Přihlášení selhalo. Zkus to znovu."
|
||||
}
|
||||
},
|
||||
"theme": {
|
||||
"light": "Světlý režim",
|
||||
"dark": "Tmavý režim"
|
||||
},
|
||||
"locale": {
|
||||
"sk": "Slovenština",
|
||||
"cs": "Čeština",
|
||||
"en": "Angličtina",
|
||||
"es": "Španělština",
|
||||
"de": "Němčina"
|
||||
}
|
||||
}
|
||||
@ -1,43 +0,0 @@
|
||||
const cs = {
|
||||
app: {
|
||||
name: 'Nutrio',
|
||||
slogan: 'Planovani jidel, vyziva a denni prehled na jednom miste.',
|
||||
},
|
||||
auth: {
|
||||
title: 'Prihlaseni',
|
||||
subtitle: 'Pouzij email a heslo. Pokud ucet neexistuje, vytvori se automaticky.',
|
||||
emailLabel: 'E-mail',
|
||||
emailPlaceholder: "napr. jmeno{'@'}domena.cz",
|
||||
passwordLabel: 'Heslo',
|
||||
passwordPlaceholder: 'Zadej heslo',
|
||||
submit: 'Prihlasit se',
|
||||
submitting: 'Zpracovavam...',
|
||||
helper: 'Po uspesnem prihlaseni bude token ulozen do prohlizece.',
|
||||
tokenSaved: 'Token byl ulozen.',
|
||||
successLoggedIn: 'Prihlaseni bylo uspesne.',
|
||||
successAutoRegistered: 'Ucet neexistoval, byl vytvoren a uzivatel je prihlasen.',
|
||||
themeToggle: 'Prepnout rezim',
|
||||
languageLabel: 'Jazyk',
|
||||
showPassword: 'Zobrazit heslo',
|
||||
hidePassword: 'Skryt heslo',
|
||||
errors: {
|
||||
invalidEmail: 'Zadej platny email.',
|
||||
passwordRequired: 'Zadej heslo.',
|
||||
invalidCredentials: 'Email nebo heslo nejsou spravne.',
|
||||
loginFailed: 'Prihlaseni selhalo. Zkus to znovu.',
|
||||
},
|
||||
},
|
||||
theme: {
|
||||
light: 'Svetly rezim',
|
||||
dark: 'Tmavy rezim',
|
||||
},
|
||||
locale: {
|
||||
sk: 'Slovenstina',
|
||||
cs: 'Cestina',
|
||||
en: 'Anglictina',
|
||||
es: 'Spanelstina',
|
||||
de: 'Nemcina',
|
||||
},
|
||||
}
|
||||
|
||||
export default cs
|
||||
41
frontend/src/locales/de.json
Normal file
41
frontend/src/locales/de.json
Normal file
@ -0,0 +1,41 @@
|
||||
{
|
||||
"app": {
|
||||
"name": "Nutrio",
|
||||
"slogan": "Mahlzeitenplanung, Ernährung und Tagesübersicht an einem Ort."
|
||||
},
|
||||
"auth": {
|
||||
"title": "Anmelden",
|
||||
"subtitle": "Nutze E-Mail und Passwort. Wenn das Konto nicht existiert, wird es automatisch erstellt.",
|
||||
"emailLabel": "E-Mail",
|
||||
"emailPlaceholder": "z. B. name{'@'}domain.de",
|
||||
"passwordLabel": "Passwort",
|
||||
"passwordPlaceholder": "Passwort eingeben",
|
||||
"submit": "Anmelden",
|
||||
"submitting": "Wird verarbeitet...",
|
||||
"helper": "Nach erfolgreicher Anmeldung wird das Token im Browser gespeichert.",
|
||||
"tokenSaved": "Token wurde gespeichert.",
|
||||
"successLoggedIn": "Anmeldung war erfolgreich.",
|
||||
"successAutoRegistered": "Konto war nicht vorhanden, wurde erstellt und der Benutzer ist nun angemeldet.",
|
||||
"themeToggle": "Modus wechseln",
|
||||
"languageLabel": "Sprache",
|
||||
"showPassword": "Passwort anzeigen",
|
||||
"hidePassword": "Passwort verbergen",
|
||||
"errors": {
|
||||
"invalidEmail": "Gib eine gültige E-Mail-Adresse ein.",
|
||||
"passwordRequired": "Passwort eingeben.",
|
||||
"invalidCredentials": "E-Mail oder Passwort ist falsch.",
|
||||
"loginFailed": "Anmeldung fehlgeschlagen. Bitte versuche es erneut."
|
||||
}
|
||||
},
|
||||
"theme": {
|
||||
"light": "Heller Modus",
|
||||
"dark": "Dunkler Modus"
|
||||
},
|
||||
"locale": {
|
||||
"sk": "Slowakisch",
|
||||
"cs": "Tschechisch",
|
||||
"en": "Englisch",
|
||||
"es": "Spanisch",
|
||||
"de": "Deutsch"
|
||||
}
|
||||
}
|
||||
@ -1,43 +0,0 @@
|
||||
const de = {
|
||||
app: {
|
||||
name: 'Nutrio',
|
||||
slogan: 'Mahlzeitenplanung, Ernahrung und Tagesubersicht an einem Ort.',
|
||||
},
|
||||
auth: {
|
||||
title: 'Anmelden',
|
||||
subtitle: 'Nutze E-Mail und Passwort. Wenn das Konto nicht existiert, wird es automatisch erstellt.',
|
||||
emailLabel: 'E-Mail',
|
||||
emailPlaceholder: "z. B. name{'@'}domain.de",
|
||||
passwordLabel: 'Passwort',
|
||||
passwordPlaceholder: 'Passwort eingeben',
|
||||
submit: 'Anmelden',
|
||||
submitting: 'Wird verarbeitet...',
|
||||
helper: 'Nach erfolgreicher Anmeldung wird das Token im Browser gespeichert.',
|
||||
tokenSaved: 'Token wurde gespeichert.',
|
||||
successLoggedIn: 'Anmeldung war erfolgreich.',
|
||||
successAutoRegistered: 'Konto war nicht vorhanden, wurde erstellt und der Benutzer ist nun angemeldet.',
|
||||
themeToggle: 'Modus wechseln',
|
||||
languageLabel: 'Sprache',
|
||||
showPassword: 'Passwort anzeigen',
|
||||
hidePassword: 'Passwort verbergen',
|
||||
errors: {
|
||||
invalidEmail: 'Gib eine gueltige E-Mail-Adresse ein.',
|
||||
passwordRequired: 'Passwort eingeben.',
|
||||
invalidCredentials: 'E-Mail oder Passwort ist falsch.',
|
||||
loginFailed: 'Anmeldung fehlgeschlagen. Bitte versuche es erneut.',
|
||||
},
|
||||
},
|
||||
theme: {
|
||||
light: 'Heller Modus',
|
||||
dark: 'Dunkler Modus',
|
||||
},
|
||||
locale: {
|
||||
sk: 'Slowakisch',
|
||||
cs: 'Tschechisch',
|
||||
en: 'Englisch',
|
||||
es: 'Spanisch',
|
||||
de: 'Deutsch',
|
||||
},
|
||||
}
|
||||
|
||||
export default de
|
||||
41
frontend/src/locales/en.json
Normal file
41
frontend/src/locales/en.json
Normal file
@ -0,0 +1,41 @@
|
||||
{
|
||||
"app": {
|
||||
"name": "Nutrio",
|
||||
"slogan": "Meal planning, nutrition, and daily totals in one place."
|
||||
},
|
||||
"auth": {
|
||||
"title": "Sign in",
|
||||
"subtitle": "Use your email and password. If the account does not exist, it will be created automatically.",
|
||||
"emailLabel": "Email",
|
||||
"emailPlaceholder": "e.g. name{'@'}domain.com",
|
||||
"passwordLabel": "Password",
|
||||
"passwordPlaceholder": "Enter password",
|
||||
"submit": "Sign in",
|
||||
"submitting": "Processing...",
|
||||
"helper": "After successful sign-in, the token will be stored in your browser.",
|
||||
"tokenSaved": "Token was saved.",
|
||||
"successLoggedIn": "Sign-in was successful.",
|
||||
"successAutoRegistered": "Account did not exist, it was created and the user is now signed in.",
|
||||
"themeToggle": "Toggle mode",
|
||||
"languageLabel": "Language",
|
||||
"showPassword": "Show password",
|
||||
"hidePassword": "Hide password",
|
||||
"errors": {
|
||||
"invalidEmail": "Enter a valid email address.",
|
||||
"passwordRequired": "Enter password.",
|
||||
"invalidCredentials": "Email or password is incorrect.",
|
||||
"loginFailed": "Sign-in failed. Please try again."
|
||||
}
|
||||
},
|
||||
"theme": {
|
||||
"light": "Light mode",
|
||||
"dark": "Dark mode"
|
||||
},
|
||||
"locale": {
|
||||
"sk": "Slovak",
|
||||
"cs": "Czech",
|
||||
"en": "English",
|
||||
"es": "Spanish",
|
||||
"de": "German"
|
||||
}
|
||||
}
|
||||
@ -1,43 +0,0 @@
|
||||
const en = {
|
||||
app: {
|
||||
name: 'Nutrio',
|
||||
slogan: 'Meal planning, nutrition, and daily totals in one place.',
|
||||
},
|
||||
auth: {
|
||||
title: 'Sign in',
|
||||
subtitle: 'Use your email and password. If the account does not exist, it will be created automatically.',
|
||||
emailLabel: 'Email',
|
||||
emailPlaceholder: "e.g. name{'@'}domain.com",
|
||||
passwordLabel: 'Password',
|
||||
passwordPlaceholder: 'Enter password',
|
||||
submit: 'Sign in',
|
||||
submitting: 'Processing...',
|
||||
helper: 'After successful sign-in, the token will be stored in your browser.',
|
||||
tokenSaved: 'Token was saved.',
|
||||
successLoggedIn: 'Sign-in was successful.',
|
||||
successAutoRegistered: 'Account did not exist, it was created and the user is now signed in.',
|
||||
themeToggle: 'Toggle mode',
|
||||
languageLabel: 'Language',
|
||||
showPassword: 'Show password',
|
||||
hidePassword: 'Hide password',
|
||||
errors: {
|
||||
invalidEmail: 'Enter a valid email address.',
|
||||
passwordRequired: 'Enter password.',
|
||||
invalidCredentials: 'Email or password is incorrect.',
|
||||
loginFailed: 'Sign-in failed. Please try again.',
|
||||
},
|
||||
},
|
||||
theme: {
|
||||
light: 'Light mode',
|
||||
dark: 'Dark mode',
|
||||
},
|
||||
locale: {
|
||||
sk: 'Slovak',
|
||||
cs: 'Czech',
|
||||
en: 'English',
|
||||
es: 'Spanish',
|
||||
de: 'German',
|
||||
},
|
||||
}
|
||||
|
||||
export default en
|
||||
41
frontend/src/locales/es.json
Normal file
41
frontend/src/locales/es.json
Normal file
@ -0,0 +1,41 @@
|
||||
{
|
||||
"app": {
|
||||
"name": "Nutrio",
|
||||
"slogan": "Planificación de comidas, nutrición y resumen diario en un solo lugar."
|
||||
},
|
||||
"auth": {
|
||||
"title": "Iniciar sesión",
|
||||
"subtitle": "Usa correo y contraseña. Si la cuenta no existe, se creará automáticamente.",
|
||||
"emailLabel": "Correo",
|
||||
"emailPlaceholder": "p. ej. nombre{'@'}dominio.es",
|
||||
"passwordLabel": "Contraseña",
|
||||
"passwordPlaceholder": "Introduce la contraseña",
|
||||
"submit": "Iniciar sesión",
|
||||
"submitting": "Procesando...",
|
||||
"helper": "Tras iniciar sesión correctamente, el token se guardará en el navegador.",
|
||||
"tokenSaved": "El token se ha guardado.",
|
||||
"successLoggedIn": "Inicio de sesión correcto.",
|
||||
"successAutoRegistered": "La cuenta no existía, se creó y el usuario ha iniciado sesión.",
|
||||
"themeToggle": "Cambiar modo",
|
||||
"languageLabel": "Idioma",
|
||||
"showPassword": "Mostrar contraseña",
|
||||
"hidePassword": "Ocultar contraseña",
|
||||
"errors": {
|
||||
"invalidEmail": "Introduce un correo válido.",
|
||||
"passwordRequired": "Introduce la contraseña.",
|
||||
"invalidCredentials": "El correo o la contraseña son incorrectos.",
|
||||
"loginFailed": "El inicio de sesión falló. Inténtalo de nuevo."
|
||||
}
|
||||
},
|
||||
"theme": {
|
||||
"light": "Modo claro",
|
||||
"dark": "Modo oscuro"
|
||||
},
|
||||
"locale": {
|
||||
"sk": "Eslovaco",
|
||||
"cs": "Checo",
|
||||
"en": "Inglés",
|
||||
"es": "Español",
|
||||
"de": "Alemán"
|
||||
}
|
||||
}
|
||||
@ -1,43 +0,0 @@
|
||||
const es = {
|
||||
app: {
|
||||
name: 'Nutrio',
|
||||
slogan: 'Planificacion de comidas, nutricion y resumen diario en un solo lugar.',
|
||||
},
|
||||
auth: {
|
||||
title: 'Iniciar sesion',
|
||||
subtitle: 'Usa correo y contrasena. Si la cuenta no existe, se creara automaticamente.',
|
||||
emailLabel: 'Correo',
|
||||
emailPlaceholder: "p. ej. nombre{'@'}dominio.es",
|
||||
passwordLabel: 'Contrasena',
|
||||
passwordPlaceholder: 'Introduce la contrasena',
|
||||
submit: 'Iniciar sesion',
|
||||
submitting: 'Procesando...',
|
||||
helper: 'Tras iniciar sesion correctamente, el token se guardara en el navegador.',
|
||||
tokenSaved: 'El token se ha guardado.',
|
||||
successLoggedIn: 'Inicio de sesion correcto.',
|
||||
successAutoRegistered: 'La cuenta no existia, se creo y el usuario ha iniciado sesion.',
|
||||
themeToggle: 'Cambiar modo',
|
||||
languageLabel: 'Idioma',
|
||||
showPassword: 'Mostrar contrasena',
|
||||
hidePassword: 'Ocultar contrasena',
|
||||
errors: {
|
||||
invalidEmail: 'Introduce un correo valido.',
|
||||
passwordRequired: 'Introduce la contrasena.',
|
||||
invalidCredentials: 'El correo o la contrasena son incorrectos.',
|
||||
loginFailed: 'El inicio de sesion fallo. Intentalo de nuevo.',
|
||||
},
|
||||
},
|
||||
theme: {
|
||||
light: 'Modo claro',
|
||||
dark: 'Modo oscuro',
|
||||
},
|
||||
locale: {
|
||||
sk: 'Eslovaco',
|
||||
cs: 'Checo',
|
||||
en: 'Ingles',
|
||||
es: 'Espanol',
|
||||
de: 'Aleman',
|
||||
},
|
||||
}
|
||||
|
||||
export default es
|
||||
41
frontend/src/locales/sk.json
Normal file
41
frontend/src/locales/sk.json
Normal file
@ -0,0 +1,41 @@
|
||||
{
|
||||
"app": {
|
||||
"name": "Nutrio",
|
||||
"slogan": "Plánovanie jedál, výživa a denný prehľad na jednom mieste."
|
||||
},
|
||||
"auth": {
|
||||
"title": "Prihlásenie",
|
||||
"subtitle": "Použi email a heslo. Ak účet neexistuje, vytvorí sa automaticky.",
|
||||
"emailLabel": "Email",
|
||||
"emailPlaceholder": "napr. meno{'@'}domena.sk",
|
||||
"passwordLabel": "Heslo",
|
||||
"passwordPlaceholder": "Zadaj heslo",
|
||||
"submit": "Prihlásiť sa",
|
||||
"submitting": "Spracúvam...",
|
||||
"helper": "Po úspešnom prihlásení bude token uložený do prehliadača.",
|
||||
"tokenSaved": "Token bol uložený.",
|
||||
"successLoggedIn": "Prihlásenie bolo úspešné.",
|
||||
"successAutoRegistered": "Účet neexistoval, bol vytvorený a používateľ je prihlásený.",
|
||||
"themeToggle": "Prepnúť režim",
|
||||
"languageLabel": "Jazyk",
|
||||
"showPassword": "Zobraziť heslo",
|
||||
"hidePassword": "Skryť heslo",
|
||||
"errors": {
|
||||
"invalidEmail": "Zadaj platný email.",
|
||||
"passwordRequired": "Zadaj heslo.",
|
||||
"invalidCredentials": "Email alebo heslo nie sú správne.",
|
||||
"loginFailed": "Prihlásenie zlyhalo. Skús to znova."
|
||||
}
|
||||
},
|
||||
"theme": {
|
||||
"light": "Svetlý režim",
|
||||
"dark": "Tmavý režim"
|
||||
},
|
||||
"locale": {
|
||||
"sk": "Slovenčina",
|
||||
"cs": "Čeština",
|
||||
"en": "Angličtina",
|
||||
"es": "Španielčina",
|
||||
"de": "Nemčina"
|
||||
}
|
||||
}
|
||||
@ -1,43 +0,0 @@
|
||||
const sk = {
|
||||
app: {
|
||||
name: 'Nutrio',
|
||||
slogan: 'Plánovanie jedál, výživa a denný prehľad na jednom mieste.',
|
||||
},
|
||||
auth: {
|
||||
title: 'Prihlásenie',
|
||||
subtitle: 'Použi email a heslo. Ak účet neexistuje, vytvorí sa automaticky.',
|
||||
emailLabel: 'Email',
|
||||
emailPlaceholder: "napr. meno{'@'}domena.sk",
|
||||
passwordLabel: 'Heslo',
|
||||
passwordPlaceholder: 'Zadaj heslo',
|
||||
submit: 'Prihlásiť sa',
|
||||
submitting: 'Spracúvam...',
|
||||
helper: 'Po úspešnom prihlásení bude token uložený do prehliadača.',
|
||||
tokenSaved: 'Token bol uložený.',
|
||||
successLoggedIn: 'Prihlásenie bolo úspešné.',
|
||||
successAutoRegistered: 'Účet neexistoval, bol vytvorený a používateľ je prihlásený.',
|
||||
themeToggle: 'Prepnúť režim',
|
||||
languageLabel: 'Jazyk',
|
||||
showPassword: 'Zobraziť heslo',
|
||||
hidePassword: 'Skryť heslo',
|
||||
errors: {
|
||||
invalidEmail: 'Zadaj platný email.',
|
||||
passwordRequired: 'Zadaj heslo.',
|
||||
invalidCredentials: 'Email alebo heslo nie sú správne.',
|
||||
loginFailed: 'Prihlásenie zlyhalo. Skús to znova.',
|
||||
},
|
||||
},
|
||||
theme: {
|
||||
light: 'Svetlý režim',
|
||||
dark: 'Tmavý režim',
|
||||
},
|
||||
locale: {
|
||||
sk: 'Slovenčina',
|
||||
cs: 'Čeština',
|
||||
en: 'Angličtina',
|
||||
es: 'Španielčina',
|
||||
de: 'Nemčina',
|
||||
},
|
||||
}
|
||||
|
||||
export default sk
|
||||
@ -140,7 +140,7 @@ const submitForm = async () => {
|
||||
}
|
||||
localStorage.setItem('user_email', userEmail)
|
||||
|
||||
successMessage.value = response.auto_registered
|
||||
successMessage.value = response.data?.auto_registered
|
||||
? t('auth.successAutoRegistered')
|
||||
: t('auth.successLoggedIn')
|
||||
|
||||
|
||||
Reference in New Issue
Block a user