fix language select to work in client-side prod

This commit is contained in:
2025-05-10 14:25:47 +03:00
parent d838fe483a
commit 2b36121bb5
25 changed files with 102 additions and 107 deletions

View File

@@ -1,7 +1,13 @@
import { useEffect, useRef, useState } from 'react';
import { useRef, useState } from 'react';
import { useTranslation } from 'react-i18next';
import { supportedLanguages } from '../../../i18n';
import { Tooltip, useTheme } from '@mui/material';
import { supportedLanguages } from '../../i18n/i18n';
import {
FormControl,
MenuItem,
Select,
Tooltip,
useTheme,
} from '@mui/material';
const LanguageSelector = () => {
const { i18n, t } = useTranslation(['core']);
@@ -19,20 +25,6 @@ const LanguageSelector = () => {
const { name, flag } =
supportedLanguages[currentLang] || supportedLanguages['en'];
// Detect clicks outside the component
useEffect(() => {
const handleClickOutside = (event) => {
if (selectorRef.current && !selectorRef.current.contains(event.target)) {
setShowSelect(false);
}
};
document.addEventListener('mousedown', handleClickOutside);
return () => {
document.removeEventListener('mousedown', handleClickOutside);
};
}, []);
return (
<div
ref={selectorRef}
@@ -44,33 +36,13 @@ const LanguageSelector = () => {
position: 'absolute',
}}
>
<Tooltip
title={t('core:action.change_language', {
postProcess: 'capitalize',
})}
>
{showSelect ? (
<select
style={{
fontSize: '1rem',
border: '2px',
background: theme.palette.background.default,
color: theme.palette.text.primary,
cursor: 'pointer',
position: 'relative',
bottom: '7px',
}}
value={currentLang}
onChange={handleChange}
autoFocus
>
{Object.entries(supportedLanguages).map(([code, { name }]) => (
<option key={code} value={code}>
{code.toUpperCase()} - {name}
</option>
))}
</select>
) : (
{!showSelect && (
<Tooltip
key={currentLang}
title={t('core:action.change_language', {
postProcess: 'capitalize',
})}
>
<button
onClick={() => setShowSelect(true)}
style={{
@@ -81,10 +53,36 @@ const LanguageSelector = () => {
}}
aria-label={`Current language: ${name}`}
>
{showSelect ? undefined : flag}
{flag}
</button>
)}
</Tooltip>
</Tooltip>
)}
{showSelect && (
<FormControl
size="small"
sx={{
minWidth: 120,
backgroundColor: theme.palette.background.paper,
}}
>
<Select
open
labelId="language-select-label"
id="language-select"
value={currentLang}
onChange={handleChange}
autoFocus
onClose={() => setShowSelect(false)}
>
{Object.entries(supportedLanguages).map(([code, { name }]) => (
<MenuItem key={code} value={code}>
{code.toUpperCase()} {name}
</MenuItem>
))}
</Select>
</FormControl>
)}
</div>
);
};

54
src/i18n/i18n.ts Normal file
View File

@@ -0,0 +1,54 @@
import i18n from 'i18next';
import { initReactI18next } from 'react-i18next';
import LanguageDetector from 'i18next-browser-languagedetector';
const capitalize = {
type: 'postProcessor',
name: 'capitalize',
process: (value: string) => value.charAt(0).toUpperCase() + value.slice(1),
};
export const supportedLanguages = {
de: { name: 'Deutsch', flag: '🇩🇪' },
en: { name: 'English', flag: '🇺🇸' },
es: { name: 'Español', flag: '🇪🇸' },
fr: { name: 'Français', flag: '🇫🇷' },
it: { name: 'Italiano', flag: '🇮🇹' },
ru: { name: 'Русский', flag: '🇷🇺' },
};
// Load all JSON files under locales/**/*
const modules = import.meta.glob('./locales/**/*.json', {
eager: true,
}) as Record<string, any>;
// Construct i18n resources object
const resources: Record<string, Record<string, any>> = {};
for (const path in modules) {
// Path format: './locales/en/core.json'
const match = path.match(/\.\/locales\/([^/]+)\/([^/]+)\.json$/);
if (!match) continue;
const [, lang, ns] = match;
resources[lang] = resources[lang] || {};
resources[lang][ns] = modules[path].default;
}
i18n
.use(initReactI18next)
.use(LanguageDetector)
.use(capitalize as any)
.init({
resources,
fallbackLng: 'en',
lng: navigator.language,
supportedLngs: Object.keys(supportedLanguages),
ns: ['core', 'auth', 'group', 'tutorial'],
defaultNS: 'core',
interpolation: { escapeValue: false },
react: { useSuspense: false },
debug: import.meta.env.MODE === 'development',
});
export default i18n;

View File

@@ -0,0 +1,43 @@
{
"account": {
"your": "ihr Konto",
"account_many": "Konten",
"account_one": "Konto"
},
"advanced_users": "für fortgeschrittene Benutzer",
"apikey": {
"alternative": "Alternative: Datei auswählen",
"change": "API-Schlüssel ändern",
"enter": "API-Schlüssel eingeben",
"import": "API-Schlüssel importieren",
"key": "API-Schlüssel",
"select_valid": "gültigen API-Schlüssel auswählen"
},
"authenticate": "authentifizieren",
"build_version": "Build-Version",
"create_account": "Konto erstellen",
"download_account": "Konto herunterladen",
"keep_secure": "Bewahren Sie Ihre Kontodatei sicher auf",
"node": {
"choose": "benutzerdefinierten Node auswählen",
"custom_many": "benutzerdefinierte Nodes",
"use_custom": "benutzerdefinierten Node verwenden",
"use_local": "lokalen Node verwenden",
"using": "verwende Node",
"using_public": "öffentlichen Node verwenden"
},
"password": "Passwort",
"password_confirmation": "Passwort bestätigen",
"return_to_list": "zurück zur Liste",
"wallet": {
"password_confirmation": "Wallet-Passwort bestätigen",
"password": "Wallet-Passwort",
"keep_password": "aktuelles Passwort beibehalten",
"new_password": "neues Passwort",
"error": {
"missing_new_password": "bitte neues Passwort eingeben",
"missing_password": "bitte Passwort eingeben"
}
},
"welcome": "willkommen bei"
}

View File

@@ -0,0 +1,71 @@
{
"add": "hinzufügen",
"cancel": "abbrechen",
"choose": "auswählen",
"close": "schließen",
"continue": "fortfahren",
"core": {
"block_height": "Blockhöhe",
"information": "Kerninformationen",
"peers": "verbundene Peers",
"version": "Kernversion"
},
"description": "Beschreibung",
"edit": "bearbeiten",
"export": "exportieren",
"import": "importieren",
"last_height": "letzte Höhe",
"loading": "Lade...",
"logout": "abmelden",
"minting_status": "Präge-Status",
"payment_notification": "Zahlungsbenachrichtigung",
"price": "Preis",
"q_mail": "Q-Mail",
"result": {
"error": {
"generic": "Ein Fehler ist aufgetreten",
"incorrect_password": "Falsches Passwort",
"save_qdn": "Speichern in QDN nicht möglich"
},
"status": {
"minting": "(Prägung)",
"not_minting": "(keine Prägung)",
"synchronized": "synchronisiert",
"synchronizing": "synchronisiere"
},
"success": {
"publish_qdn": "Erfolgreich in QDN veröffentlicht"
}
},
"save_options": {
"no_pinned_changes": "Derzeit keine Änderungen an Ihren angehefteten Apps",
"overwrite_changes": "Die App konnte Ihre vorhandenen in QDN gespeicherten angehefteten Apps nicht herunterladen. Möchten Sie diese Änderungen überschreiben?",
"overwrite_qdn": "In QDN überschreiben",
"publish_qdn": "Möchten Sie Ihre Einstellungen in QDN (verschlüsselt) veröffentlichen?",
"qdn": "QDN-Speicherung verwenden",
"register_name": "Sie benötigen einen registrierten Qortal-Namen, um Ihre angehefteten Apps in QDN zu speichern.",
"reset_pinned": "Gefällt Ihnen Ihre aktuellen lokalen Änderungen nicht? Möchten Sie zu den Standard-Anheftungen zurückkehren?",
"reset_qdn": "Gefällt Ihnen Ihre aktuellen lokalen Änderungen nicht? Möchten Sie zu Ihren in QDN gespeicherten Anheftungen zurückkehren?",
"revert_default": "Auf Standard zurücksetzen",
"revert_qdn": "Auf QDN zurücksetzen",
"save_qdn": "In QDN speichern",
"save": "speichern",
"settings": "Sie verwenden die Export/Import-Methode zum Speichern von Einstellungen.",
"unsaved_changes": "Sie haben nicht gespeicherte Änderungen an Ihren angehefteten Apps. Speichern Sie sie in QDN."
},
"settings": "Einstellungen",
"supply": "Angebot",
"theme": {
"dark": "Dunkelmodus",
"light": "Hellmodus"
},
"title": "Titel",
"tutorial": "Tutorial",
"user_lookup": "Benutzersuche",
"wallet": {
"backup_wallet": "Wallet sichern",
"wallet": "Wallet",
"wallet_other": "Wallets"
},
"welcome": "Willkommen"
}

View File

@@ -0,0 +1,21 @@
{
"1_getting_started": "1. Erste Schritte",
"2_overview": "2. Überblick",
"3_groups": "3. Qortal-Gruppen",
"4_obtain_qort": "4. QORT erhalten",
"account_creation": "Kontoerstellung",
"important_info": "wichtige Informationen!",
"apps": {
"dashboard": "1. App-Dashboard",
"navigation": "2. App-Navigation"
},
"initial": {
"6_qort": "mindestens 6 QORT im Wallet haben",
"explore": "erkunden",
"general_chat": "allgemeiner Chat",
"getting_started": "erste Schritte",
"register_name": "einen Namen registrieren",
"see_apps": "apps ansehen",
"trade_qort": "QORT handeln"
}
}

View File

@@ -0,0 +1,48 @@
{
"account": {
"your": "your account",
"account_many": "accounts",
"account_one": "account"
},
"advanced_users": "for advanced users",
"apikey": {
"alternative": "alternative: File select",
"change": "change APIkey",
"enter": "enter APIkey",
"import": "import APIkey",
"key": "API key",
"select_valid": "select a valid apikey"
},
"authenticate": "authenticate",
"build_version": "build version",
"create_account": "create account",
"download_account": "download account",
"keep_secure": "keep your account file secure",
"node": {
"choose": "choose custom node",
"custom_many": "custom nodes",
"use_custom": "use custom node",
"use_local": "use local node",
"using": "using node",
"using_public": "using public node"
},
"password": "password",
"password_confirmation": "confirm password",
"return_to_list": "return to list",
"tips": {
"digital_id": "your wallet is like your digital ID on Qortal, and is how you will login to the Qortal User Interface. It holds your public address and the Qortal name you will eventually choose. Every transaction you make is linked to your ID, and this is where you manage all your QORT and other tradeable cryptocurrencies on Qortal.",
"new_account": "creating an account means creating a new wallet and digital ID to start using Qortal. Once you have made your account, you can start doing things like obtaining some QORT, buying a name and avatar, publishing videos and blogs, and much more.",
"new_users": "new users start here!"
},
"wallet": {
"password_confirmation": "confirm wallet password",
"password": "wallet password",
"keep_password": "keep current password",
"new_password": "new password",
"error": {
"missing_new_password": "please enter a new password",
"missing_password": "please enter your password"
}
},
"welcome": "welcome to"
}

View File

@@ -0,0 +1,114 @@
{
"action": {
"add": "add",
"accept": "accept",
"backup_account": "backup account",
"backup_wallet": "backup wallet",
"cancel": "cancel",
"change": "change",
"change_language": "change language",
"choose": "choose",
"close": "close",
"continue": "continue",
"continue_logout": "continue to logout",
"decline": "decline",
"edit": "edit",
"export": "export",
"import": "import",
"invite": "invite",
"join": "join",
"logout": "logout",
"notify": "notify"
},
"core": {
"block_height": "block height",
"information": "core information",
"peers": "connected peers",
"version": "core version"
},
"ui": {
"version": "UI version"
},
"count": {
"none": "none",
"one": "one"
},
"description": "description",
"fee": {
"payment": "payment fee",
"publish": "publish fee"
},
"page": {
"last": "last",
"first": "first",
"next": "next",
"previous": "previous"
},
"downloading_qdn": "downloading from QDN",
"last_height": "last height",
"loading": "loading...",
"loading_posts": "loading posts... please wait.",
"message_us": "please message us on Telegram or Discord if you need 4 QORT to start chatting without any limitations",
"minting_status": "minting status",
"new_user": "are you a new user?",
"payment_notification": "payment notification",
"price": "price",
"q_mail": "q-mail",
"message": {
"error": {
"generic": "an error occurred",
"incorrect_password": "incorrect password",
"save_qdn": "unable to save to QDN"
},
"status": {
"minting": "(minting)",
"not_minting": "(not minting)",
"synchronized": "synchronized",
"synchronizing": "synchronizing"
},
"success": {
"order_submitted": "your buy order was submitted",
"publish_qdn": "successfully published to QDN",
"request_read": "I have read this request",
"transfer": "the transfer was succesful!"
}
},
"save_options": {
"no_pinned_changes": "you currently do not have any changes to your pinned apps",
"overwrite_changes": "the app was unable to download your existing QDN-saved pinned apps. Would you like to overwrite those changes?",
"overwrite_qdn": "overwrite to QDN",
"publish_qdn": "would you like to publish your settings to QDN (encrypted)?",
"qdn": "use QDN saving",
"register_name": "you need a registered Qortal name to save your pinned apps to QDN.",
"reset_pinned": "don't like your current local changes? Would you like to reset to the default pinned apps?",
"reset_qdn": "don't like your current local changes? Would you like to reset to your saved QDN pinned apps?",
"revert_default": "revert to default",
"revert_qdn": "revert to QDN",
"save_qdn": "save to QDN",
"save": "save",
"settings": "you are using the export/import way of saving settings.",
"unsaved_changes": " you have unsaved changes to your pinned apps. Save them to QDN."
},
"settings": "settings",
"supply": "supply",
"theme": {
"dark": "dark mode",
"light": "light mode"
},
"time": {
"day_one": "{{count}} day",
"day_other": "{{count}} days",
"hour_one": "{{count}} hour",
"hour_other": "{{count}} hours",
"minute_one": "{{count}} minute",
"minute_other": "{{count}} minutes"
},
"title": "title",
"tutorial": "tutorial",
"user_lookup": "user lookup",
"wallet": {
"wallet": "wallet",
"wallet_other": "wallets"
},
"welcome": "welcome"
}

View File

@@ -0,0 +1,65 @@
{
"action": {
"cancel_ban": "cancel ban",
"create_group": "create group",
"find_group": "find group",
"join_group": "join group",
"invite_member": "invite member",
"refetch_page": "refetch page",
"return_to_thread": "return to threads"
},
"advanced_options": "advanced options",
"approval_threshold": "group Approval Threshold (number / percentage of Admins that must approve a transaction)",
"ban_list": "ban list",
"block_delay": {
"minimum": "minimum Block delay for Group Transaction Approvals",
"maximum": "maximum Block delay for Group Transaction Approvals"
},
"group": {
"closed": "closed (private) - users need permission to join",
"description": "description of group",
"invites": "group invites",
"management": "group management",
"name": "name of group",
"open": "open (public)",
"type": "group type"
},
"invitation_expiry": "invitation Expiry Time",
"join_requests": "join requests",
"question": {
"cancel_ban": "would you like to perform a CANCEL_GROUP_BAN transaction?",
"create_group": "would you like to perform an CREATE_GROUP transaction?",
"group_invite": "would you like to perform a GROUP_INVITE transaction?",
"join_group": "would you like to perform an JOIN_GROUP transaction?",
"provide_thread": "please provide a thread title"
},
"message": {
"generic": {
"encryption_key": "the group's first common encryption key is in the process of creation. Please wait a few minutes for it to be retrieved by the network. Checking every 2 minutes...",
"group_invited_you": "{{group}} has invited you",
"no_display": "nothing to display",
"no_selection": "no group selected",
"not_part_group": "you are not part of the encrypted group of members. Wait until an admin re-encrypts the keys.",
"only_encrypted": "only unencrypted messages will be displayed.",
"setting_group": "setting up group... please wait."
},
"error": {
"access_name": "cannot send a message without a access to your name",
"description_required": "please provide a description",
"group_info": "cannot access group information",
"name_required": "please provide a name",
"notify_admins": "try notifying an admin from the list of admins below:"
},
"success": {
"group_creation": "successfully created group. It may take a couple of minutes for the changes to propagate",
"group_creation_name": "created group {{group_name}}: awaiting confirmation",
"group_creation_label": "created group {{name}}: success!",
"group_invite": "successfully invited {{value}}. It may take a couple of minutes for the changes to propagate",
"join_creation": "successfully requested to join group. It may take a couple of minutes for the changes to propagate",
"group_join_name": "joined group {{group_name}}: awaiting confirmation",
"group_join_label": "joined group {{name}}: success!",
"loading_threads": "loading threads... please wait.",
"unbanned_user": "successfully unbanned user. It may take a couple of minutes for the changes to propagate"
}
}
}

View File

@@ -0,0 +1,21 @@
{
"1_getting_started": "1. Getting Started",
"2_overview": "2. Overview",
"3_groups": "3. Qortal Groups",
"4_obtain_qort": "4. Obtaining Qort",
"account_creation": "account creation",
"important_info": "important information!",
"apps": {
"dashboard": "1. Apps Dashboard",
"navigation": "2. Apps Navigation"
},
"initial": {
"6_qort": "have at least 6 QORT in your wallet",
"explore": "explore",
"general_chat": "general chat",
"getting_started": "getting started",
"register_name": "register a name",
"see_apps": "see apps",
"trade_qort": "trade QORT"
}
}

View File

@@ -0,0 +1,43 @@
{
"account": {
"your": "tu cuenta",
"account_many": "cuentas",
"account_one": "cuenta"
},
"advanced_users": "para usuarios avanzados",
"apikey": {
"alternative": "alternativa: Seleccionar archivo",
"change": "cambiar clave API",
"enter": "ingresar clave API",
"import": "importar clave API",
"key": "clave API",
"select_valid": "selecciona una clave API válida"
},
"authenticate": "autenticar",
"build_version": "versión de compilación",
"create_account": "crear cuenta",
"download_account": "descargar cuenta",
"keep_secure": "mantén tu archivo de cuenta seguro",
"node": {
"choose": "elegir nodo personalizado",
"custom_many": "nodos personalizados",
"use_custom": "usar nodo personalizado",
"use_local": "usar nodo local",
"using": "usando nodo",
"using_public": "usando nodo público"
},
"password": "contraseña",
"password_confirmation": "confirmar contraseña",
"return_to_list": "volver a la lista",
"wallet": {
"password_confirmation": "confirmar contraseña del monedero",
"password": "contraseña del monedero",
"keep_password": "mantener la contraseña actual",
"new_password": "nueva contraseña",
"error": {
"missing_new_password": "por favor ingresa una nueva contraseña",
"missing_password": "por favor ingresa tu contraseña"
}
},
"welcome": "bienvenido a"
}

View File

@@ -0,0 +1,71 @@
{
"add": "agregar",
"cancel": "cancelar",
"choose": "elegir",
"close": "cerrar",
"continue": "continuar",
"core": {
"block_height": "altura de bloque",
"information": "información del núcleo",
"peers": "pares conectados",
"version": "versión del núcleo"
},
"description": "descripción",
"edit": "editar",
"export": "exportar",
"import": "importar",
"last_height": "última altura",
"loading": "cargando...",
"logout": "cerrar sesión",
"minting_status": "estado de acuñación",
"payment_notification": "notificación de pago",
"price": "precio",
"q_mail": "q-mail",
"result": {
"error": {
"generic": "ocurrió un error",
"incorrect_password": "contraseña incorrecta",
"save_qdn": "no se pudo guardar en QDN"
},
"status": {
"minting": "(acuñando)",
"not_minting": "(no acuñando)",
"synchronized": "sincronizado",
"synchronizing": "sincronizando"
},
"success": {
"publish_qdn": "publicado exitosamente en QDN"
}
},
"save_options": {
"no_pinned_changes": "actualmente no tienes cambios en tus aplicaciones fijadas",
"overwrite_changes": "la aplicación no pudo descargar tus aplicaciones fijadas existentes guardadas en QDN. ¿Deseas sobrescribir esos cambios?",
"overwrite_qdn": "sobrescribir en QDN",
"publish_qdn": "¿Deseas publicar tus configuraciones en QDN (cifrado)?",
"qdn": "usar guardado en QDN",
"register_name": "necesitas un nombre Qortal registrado para guardar tus aplicaciones fijadas en QDN.",
"reset_pinned": "¿No te gustan tus cambios locales actuales? ¿Deseas restablecer las aplicaciones fijadas predeterminadas?",
"reset_qdn": "¿No te gustan tus cambios locales actuales? ¿Deseas restablecer tus aplicaciones fijadas guardadas en QDN?",
"revert_default": "restablecer a predeterminado",
"revert_qdn": "restablecer a QDN",
"save_qdn": "guardar en QDN",
"save": "guardar",
"settings": "estás utilizando el método de exportación/importación para guardar configuraciones.",
"unsaved_changes": "tienes cambios no guardados en tus aplicaciones fijadas. Guárdalos en QDN."
},
"settings": "configuraciones",
"supply": "suministro",
"theme": {
"dark": "modo oscuro",
"light": "modo claro"
},
"title": "título",
"tutorial": "tutorial",
"user_lookup": "búsqueda de usuario",
"wallet": {
"backup_wallet": "respaldar billetera",
"wallet": "billetera",
"wallet_other": "billeteras"
},
"welcome": "bienvenido"
}

View File

@@ -0,0 +1,21 @@
{
"1_getting_started": "1. Comenzando",
"2_overview": "2. Visión general",
"3_groups": "3. Grupos de Qortal",
"4_obtain_qort": "4. Obtener QORT",
"account_creation": "creación de cuenta",
"important_info": "¡información importante!",
"apps": {
"dashboard": "1. Panel de aplicaciones",
"navigation": "2. Navegación de aplicaciones"
},
"initial": {
"6_qort": "tener al menos 6 QORT en tu monedero",
"explore": "explorar",
"general_chat": "chat general",
"getting_started": "comenzando",
"register_name": "registrar un nombre",
"see_apps": "ver aplicaciones",
"trade_qort": "intercambiar QORT"
}
}

View File

@@ -0,0 +1,43 @@
{
"account": {
"your": "ton compte",
"account_many": "comptes",
"account_one": "compte"
},
"advanced_users": "pour les utilisateurs avancés",
"apikey": {
"alternative": "alternative : Sélectionner un fichier",
"change": "changer la clé API",
"enter": "entrer la clé API",
"import": "importer la clé API",
"key": "clé API",
"select_valid": "sélectionnez une clé API valide"
},
"authenticate": "authentifier",
"build_version": "version de build",
"create_account": "créer un compte",
"download_account": "télécharger le compte",
"keep_secure": "Gardez votre fichier de compte en sécurité",
"node": {
"choose": "choisir un nœud personnalisé",
"custom_many": "nœuds personnalisés",
"use_custom": "utiliser un nœud personnalisé",
"use_local": "utiliser un nœud local",
"using": "utilise le nœud",
"using_public": "utilise un nœud public"
},
"password": "mot de passe",
"password_confirmation": "confirmer le mot de passe",
"return_to_list": "retour à la liste",
"wallet": {
"password_confirmation": "confirmer le mot de passe du portefeuille",
"password": "mot de passe du portefeuille",
"keep_password": "garder le mot de passe actuel",
"new_password": "nouveau mot de passe",
"error": {
"missing_new_password": "veuillez entrer un nouveau mot de passe",
"missing_password": "veuillez entrer votre mot de passe"
}
},
"welcome": "bienvenue sur"
}

View File

@@ -0,0 +1,71 @@
{
"add": "ajouter",
"cancel": "annuler",
"choose": "choisir",
"close": "fermer",
"continue": "continuer",
"core": {
"block_height": "hauteur de bloc",
"information": "informations du noyau",
"peers": "pairs connectés",
"version": "version du noyau"
},
"description": "description",
"edit": "éditer",
"export": "exporter",
"import": "importer",
"last_height": "dernière hauteur",
"loading": "chargement...",
"logout": "se déconnecter",
"minting_status": "statut de frappe",
"payment_notification": "notification de paiement",
"price": "prix",
"q_mail": "q-mail",
"result": {
"error": {
"generic": "une erreur s'est produite",
"incorrect_password": "mot de passe incorrect",
"save_qdn": "impossible d'enregistrer dans QDN"
},
"status": {
"minting": "(frappe en cours)",
"not_minting": "(pas de frappe)",
"synchronized": "synchronisé",
"synchronizing": "synchronisation en cours"
},
"success": {
"publish_qdn": "publié avec succès dans QDN"
}
},
"save_options": {
"no_pinned_changes": "vous n'avez actuellement aucune modification de vos applications épinglées",
"overwrite_changes": "l'application n'a pas pu télécharger vos applications épinglées existantes enregistrées dans QDN. Voulez-vous écraser ces modifications ?",
"overwrite_qdn": "écraser dans QDN",
"publish_qdn": "souhaitez-vous publier vos paramètres dans QDN (chiffré) ?",
"qdn": "utiliser l'enregistrement QDN",
"register_name": "vous devez avoir un nom Qortal enregistré pour enregistrer vos applications épinglées dans QDN.",
"reset_pinned": "vous n'aimez pas vos modifications locales actuelles ? Voulez-vous réinitialiser les applications épinglées par défaut ?",
"reset_qdn": "vous n'aimez pas vos modifications locales actuelles ? Voulez-vous réinitialiser vos applications épinglées enregistrées dans QDN ?",
"revert_default": "revenir aux paramètres par défaut",
"revert_qdn": "revenir à QDN",
"save_qdn": "enregistrer dans QDN",
"save": "enregistrer",
"settings": "vous utilisez la méthode d'exportation/importation pour enregistrer les paramètres.",
"unsaved_changes": "vous avez des modifications non enregistrées de vos applications épinglées. Enregistrez-les dans QDN."
},
"settings": "paramètres",
"supply": "approvisionnement",
"theme": {
"dark": "mode sombre",
"light": "mode clair"
},
"title": "titre",
"tutorial": "tutoriel",
"user_lookup": "recherche d'utilisateur",
"wallet": {
"backup_wallet": "sauvegarder le portefeuille",
"wallet": "portefeuille",
"wallet_other": "portefeuilles"
},
"welcome": "bienvenue"
}

View File

@@ -0,0 +1,21 @@
{
"1_getting_started": "1. Démarrer",
"2_overview": "2. Aperçu",
"3_groups": "3. Groupes Qortal",
"4_obtain_qort": "4. Obtenir des QORT",
"account_creation": "création de compte",
"important_info": "informations importantes !",
"apps": {
"dashboard": "1. Tableau de bord des applications",
"navigation": "2. Navigation des applications"
},
"initial": {
"6_qort": "avoir au moins 6 QORT dans votre portefeuille",
"explore": "explorer",
"general_chat": "chat général",
"getting_started": "démarrer",
"register_name": "enregistrer un nom",
"see_apps": "voir les applications",
"trade_qort": "échanger des QORT"
}
}

View File

@@ -0,0 +1,48 @@
{
"account": {
"your": "il tuo account",
"account_many": "account",
"account_one": "account"
},
"advanced_users": "per utenti avanzati",
"apikey": {
"alternative": "alternativa: selezione file",
"change": "cambia APIkey",
"enter": "inserisci APIkey",
"import": "importa APIkey",
"key": "chiave API",
"select_valid": "seleziona una APIkey valida"
},
"authenticate": "autentica",
"build_version": "versione build",
"create_account": "crea account",
"download_account": "scarica account",
"keep_secure": "mantieni sicuro il file del tuo account",
"node": {
"choose": "scegli nodo personalizzato",
"custom_many": "nodi personalizzati",
"use_custom": "usa nodo personalizzato",
"use_local": "usa nodo locale",
"using": "utilizzo nodo",
"using_public": "utilizzo nodo pubblico"
},
"password": "password",
"password_confirmation": "conferma password",
"return_to_list": "torna alla lista",
"tips": {
"digital_id": "il tuo wallet è come la tua identità digitale su Qortal ed è il modo in cui accederai all'interfaccia utente di Qortal. Contiene il tuo indirizzo pubblico e il nome Qortal che sceglierai. Ogni transazione che esegui è collegata alla tua identità ed è qui che gestisci tutti i tuoi QORT e altre criptovalute scambiabili su Qortal.",
"new_account": "creare un account significa creare un nuovo wallet e un'identità digitale per iniziare a usare Qortal. Una volta creato l'account, potrai iniziare a ottenere QORT, acquistare un nome e un avatar, pubblicare video e blog, e molto altro.",
"new_users": "i nuovi utenti iniziano qui!"
},
"wallet": {
"password_confirmation": "conferma password del wallet",
"password": "password del wallet",
"keep_password": "mantieni password corrente",
"new_password": "nuova password",
"error": {
"missing_new_password": "per favore inserisci una nuova password",
"missing_password": "per favore inserisci la tua password"
}
},
"welcome": "benvenuto in"
}

View File

@@ -0,0 +1,111 @@
{
"action": {
"add": "aggiungi",
"accept": "accetta",
"backup_account": "backup account",
"backup_wallet": "backup wallet",
"cancel": "annulla",
"change": "cambia",
"change_language": "cambia lingua",
"choose": "scegli",
"close": "chiudi",
"continue": "continua",
"continue_logout": "continua con il logout",
"decline": "rifiuta",
"edit": "modifica",
"export": "esporta",
"import": "importa",
"invite": "invita",
"join": "unisciti",
"logout": "esci",
"notify": "notifica"
},
"core": {
"block_height": "altezza blocco",
"information": "informazioni core",
"peers": "peer connessi",
"version": "versione core"
},
"count": {
"none": "nessuno",
"one": "uno"
},
"description": "descrizione",
"fee": {
"payment": "commissione di pagamento",
"publish": "commissione di pubblicazione"
},
"page": {
"last": "ultimo",
"first": "primo",
"next": "successivo",
"previous": "precedente"
},
"downloading_qdn": "scaricamento da QDN",
"last_height": "ultima altezza",
"loading": "caricamento...",
"loading_posts": "caricamento post... attendere prego.",
"message_us": "per favore scrivici su Telegram o Discord se hai bisogno di 4 QORT per iniziare a chattare senza limitazioni",
"minting_status": "stato minting",
"new_user": "sei un nuovo utente?",
"payment_notification": "notifica di pagamento",
"price": "prezzo",
"q_mail": "q-mail",
"message": {
"error": {
"generic": "si è verificato un errore",
"incorrect_password": "password errata",
"save_qdn": "impossibile salvare su QDN"
},
"status": {
"minting": "(minting)",
"not_minting": "(non minting)",
"synchronized": "sincronizzato",
"synchronizing": "sincronizzazione in corso"
},
"success": {
"order_submitted": "il tuo ordine di acquisto è stato inviato",
"publish_qdn": "pubblicato su QDN con successo",
"request_read": "ho letto questa richiesta",
"transfer": "il trasferimento è stato effettuato con successo!"
}
},
"save_options": {
"no_pinned_changes": "attualmente non hai modifiche alle tue app appuntate",
"overwrite_changes": "l'app non è riuscita a scaricare le tue app appuntate salvate su QDN. Vuoi sovrascrivere le modifiche?",
"overwrite_qdn": "sovrascrivi su QDN",
"publish_qdn": "vuoi pubblicare le tue impostazioni su QDN (crittografato)?",
"qdn": "usa il salvataggio su QDN",
"register_name": "devi avere un nome Qortal registrato per salvare le tue app appuntate su QDN.",
"reset_pinned": "non ti piacciono le modifiche locali attuali? Vuoi ripristinare le app appuntate predefinite?",
"reset_qdn": "non ti piacciono le modifiche locali attuali? Vuoi ripristinare le app appuntate salvate su QDN?",
"revert_default": "ripristina predefinito",
"revert_qdn": "ripristina da QDN",
"save_qdn": "salva su QDN",
"save": "salva",
"settings": "stai usando il metodo di esportazione/importazione per salvare le impostazioni.",
"unsaved_changes": "hai modifiche non salvate alle tue app appuntate. Salvale su QDN."
},
"settings": "impostazioni",
"supply": "disponibilità",
"theme": {
"dark": "modalità scura",
"light": "modalità chiara"
},
"time": {
"day_one": "{{count}} giorno",
"day_other": "{{count}} giorni",
"hour_one": "{{count}} ora",
"hour_other": "{{count}} ore",
"minute_one": "{{count}} minuto",
"minute_other": "{{count}} minuti"
},
"title": "titolo",
"tutorial": "tutorial",
"user_lookup": "ricerca utente",
"wallet": {
"wallet": "wallet",
"wallet_other": "wallet"
},
"welcome": "benvenuto"
}

View File

@@ -0,0 +1,65 @@
{
"action": {
"cancel_ban": "annulla ban",
"create_group": "crea gruppo",
"find_group": "trova gruppo",
"join_group": "unisciti al gruppo",
"invite_member": "invita membro",
"refetch_page": "ricarica pagina",
"return_to_thread": "torna ai thread"
},
"advanced_options": "opzioni avanzate",
"approval_threshold": "soglia di Approvazione del gruppo (numero/percentuale di Admin che devono approvare una transazione)",
"ban_list": "lista ban",
"block_delay": {
"minimum": "ritardo minimo dei blocchi per Approvazione di Transazioni di Gruppo",
"maximum": "ritardo massimo dei blocchi per Approvazione di Transazioni di Gruppo"
},
"group": {
"closed": "chiuso (privato) - gli utenti necessitano di permesso per unirsi",
"description": "descrizione del gruppo",
"invites": "inviti del gruppo",
"management": "gestione del gruppo",
"name": "nome del gruppo",
"open": "aperto (pubblico)",
"type": "tipo di gruppo"
},
"invitation_expiry": "tempo di scadenza dell'invito",
"join_requests": "richieste di adesione",
"question": {
"cancel_ban": "vuoi eseguire una transazione CANCEL_GROUP_BAN?",
"create_group": "vuoi eseguire una transazione CREATE_GROUP?",
"group_invite": "vuoi eseguire una transazione GROUP_INVITE?",
"join_group": "vuoi eseguire una transazione JOIN_GROUP?",
"provide_thread": "per favore fornisci un titolo per il thread"
},
"message": {
"generic": {
"encryption_key": "la prima chiave di cifratura comune del gruppo è in fase di creazione. Attendere alcuni minuti affinché venga recuperata dalla rete. Controllo ogni 2 minuti...",
"group_invited_you": "{{group}} ti ha invitato",
"no_display": "niente da visualizzare",
"no_selection": "nessun gruppo selezionato",
"not_part_group": "non fai parte del gruppo cifrato dei membri. Attendi che un amministratore ri-codifichi le chiavi.",
"only_encrypted": "verranno visualizzati solo i messaggi non cifrati.",
"setting_group": "configurazione del gruppo... attendere prego."
},
"error": {
"access_name": "impossibile inviare un messaggio senza accesso al tuo nome",
"description_required": "per favore fornisci una descrizione",
"group_info": "impossibile accedere alle informazioni del gruppo",
"name_required": "per favore fornisci un nome",
"notify_admins": "prova a notificare un admin dalla lista di amministratori qui sotto:"
},
"success": {
"group_creation": "gruppo creato con successo. Potrebbero volerci alcuni minuti affinché le modifiche si propaghino",
"group_creation_name": "gruppo {{group_name}} creato: in attesa di conferma",
"group_creation_label": "gruppo {{name}} creato: successo!",
"group_invite": "invito inviato con successo a {{value}}. Potrebbero volerci alcuni minuti affinché le modifiche si propaghino",
"join_creation": "richiesta di adesione al gruppo inviata con successo. Potrebbero volerci alcuni minuti affinché le modifiche si propaghino",
"group_join_name": "entrato nel gruppo {{group_name}}: in attesa di conferma",
"group_join_label": "entrato nel gruppo {{name}}: successo!",
"loading_threads": "caricamento thread... attendere prego.",
"unbanned_user": "utente sbannato con successo. Potrebbero volerci alcuni minuti affinché le modifiche si propaghino"
}
}
}

View File

@@ -0,0 +1,21 @@
{
"1_getting_started": "1. Come iniziare",
"2_overview": "2. Overview",
"3_groups": "3. I gruppi in Qortal",
"4_obtain_qort": "4. Ottenere Qort",
"account_creation": "creazione account",
"important_info": "important information!",
"apps": {
"dashboard": "1. Dashboard delle app",
"navigation": "2. Navigation tra le app"
},
"initial": {
"6_qort": "avere almeno 6 QORT nel proprio wallet",
"explore": "esplora",
"general_chat": "chat generale",
"getting_started": "come iniziare",
"register_name": "registra un nome",
"see_apps": "vedi le apps",
"trade_qort": "scambia i QORT"
}
}

View File

@@ -0,0 +1,43 @@
{
"account": {
"your": "Ваш аккаунт",
"account_many": "аккаунты",
"account_one": "аккаунт"
},
"advanced_users": "для продвинутых пользователей",
"apikey": {
"alternative": "альтернатива: выбрать файл",
"change": "изменить API-ключ",
"enter": "введите API-ключ",
"import": "импортировать API-ключ",
"key": "API-ключ",
"select_valid": "выберите действительный API-ключ"
},
"authenticate": "аутентификация",
"build_version": "версия сборки",
"create_account": "создать аккаунт",
"download_account": "скачать аккаунт",
"keep_secure": "Храните файл аккаунта в безопасности",
"node": {
"choose": "выбрать пользовательский узел",
"custom_many": "пользовательские узлы",
"use_custom": "использовать пользовательский узел",
"use_local": "использовать локальный узел",
"using": "используется узел",
"using_public": "используется публичный узел"
},
"password": "пароль",
"password_confirmation": "подтвердите пароль",
"return_to_list": "вернуться к списку",
"wallet": {
"password_confirmation": "подтвердите пароль кошелька",
"password": "пароль кошелька",
"keep_password": "сохранить текущий пароль",
"new_password": "новый пароль",
"error": {
"missing_new_password": "пожалуйста, введите новый пароль",
"missing_password": "пожалуйста, введите ваш пароль"
}
},
"welcome": "добро пожаловать в"
}

View File

@@ -0,0 +1,71 @@
{
"add": "добавить",
"cancel": "отмена",
"choose": "выбрать",
"close": "закрыть",
"continue": "продолжить",
"core": {
"block_height": "высота блока",
"information": "информация ядра",
"peers": "подключенные узлы",
"version": "версия ядра"
},
"description": "описание",
"edit": "редактировать",
"export": "экспорт",
"import": "импорт",
"last_height": "последняя высота",
"loading": "загрузка...",
"logout": "выйти",
"minting_status": "статус чеканки",
"payment_notification": "уведомление о платеже",
"price": "цена",
"q_mail": "q-mail",
"result": {
"error": {
"generic": "произошла ошибка",
"incorrect_password": "неверный пароль",
"save_qdn": "не удалось сохранить в QDN"
},
"status": {
"minting": "(чеканка)",
"not_minting": "(не чеканится)",
"synchronized": "синхронизировано",
"synchronizing": "синхронизация"
},
"success": {
"publish_qdn": "успешно опубликовано в QDN"
}
},
"save_options": {
"no_pinned_changes": "у вас нет изменений в закреплённых приложениях",
"overwrite_changes": "приложению не удалось загрузить ваши закреплённые приложения, сохранённые в QDN. Хотите перезаписать эти изменения?",
"overwrite_qdn": "перезаписать в QDN",
"publish_qdn": "хотите опубликовать свои настройки в QDN (зашифровано)?",
"qdn": "использовать сохранение в QDN",
"register_name": "вам необходимо зарегистрированное имя Qortal для сохранения закреплённых приложений в QDN.",
"reset_pinned": "не устраивают текущие локальные изменения? Хотите сбросить до приложений по умолчанию?",
"reset_qdn": "не устраивают текущие локальные изменения? Хотите сбросить до сохранённых в QDN приложений?",
"revert_default": "сбросить до стандартных",
"revert_qdn": "сбросить до QDN",
"save_qdn": "сохранить в QDN",
"save": "сохранить",
"settings": "вы используете метод экспорта/импорта для сохранения настроек.",
"unsaved_changes": "у вас есть несохранённые изменения в закреплённых приложениях. Сохраните их в QDN."
},
"settings": "настройки",
"supply": "предложение",
"theme": {
"dark": "тёмная тема",
"light": "светлая тема"
},
"title": "заголовок",
"tutorial": "учебник",
"user_lookup": "поиск пользователя",
"wallet": {
"backup_wallet": "резервная копия кошелька",
"wallet": "кошелёк",
"wallet_other": "кошельки"
},
"welcome": "добро пожаловать"
}

View File

@@ -0,0 +1,21 @@
{
"1_getting_started": "1. Начало работы",
"2_overview": "2. Обзор",
"3_groups": "3. Группы Qortal",
"4_obtain_qort": "4. Получение QORT",
"account_creation": "создание аккаунта",
"important_info": "важная информация!",
"apps": {
"dashboard": "1. Панель приложений",
"navigation": "2. Навигация по приложениям"
},
"initial": {
"6_qort": "иметь не менее 6 QORT в кошельке",
"explore": "исследовать",
"general_chat": "общий чат",
"getting_started": "начало работы",
"register_name": "зарегистрировать имя",
"see_apps": "посмотреть приложения",
"trade_qort": "обмен QORT"
}
}

View File

@@ -5,7 +5,7 @@ import './messaging/messagesToBackground';
import { MessageQueueProvider } from './MessageQueueContext.tsx';
import { ThemeProvider } from './components/Theme/ThemeContext.tsx';
import { CssBaseline } from '@mui/material';
import '../i18n';
import './i18n/i18n.js';
createRoot(document.getElementById('root')!).render(
<>