- {t('core:list.invite', {
+ {t('core:list.invites', {
postProcess: 'capitalizeFirstChar',
})}
diff --git a/src/components/NotAuthenticated.tsx b/src/components/NotAuthenticated.tsx
index 49cfa09..798be21 100644
--- a/src/components/NotAuthenticated.tsx
+++ b/src/components/NotAuthenticated.tsx
@@ -593,12 +593,13 @@ export const NotAuthenticated = ({
sx={{
backgroundColor:
hasSeenGettingStarted === false && theme.palette.other.positive,
- color: hasSeenGettingStarted === false && 'black',
+ color:
+ hasSeenGettingStarted === false && theme.palette.text.primary,
'&:hover': {
backgroundColor:
- hasSeenGettingStarted === false &&
- theme.palette.other.positive,
- color: hasSeenGettingStarted === false && 'black',
+ hasSeenGettingStarted === false && theme.palette.other.unread,
+ color:
+ hasSeenGettingStarted === false && theme.palette.text.primary,
},
}}
>
@@ -636,7 +637,7 @@ export const NotAuthenticated = ({
? 'rgba(255, 255, 255, 0.5)'
: 'rgba(0, 0, 0, 0.3)',
padding: '20px 30px',
- borderRadius: '5px',
+ borderRadius: '8px',
}}
>
<>
diff --git a/src/components/PasswordField/PasswordField.tsx b/src/components/PasswordField/PasswordField.tsx
index b59538e..5bf1839 100644
--- a/src/components/PasswordField/PasswordField.tsx
+++ b/src/components/PasswordField/PasswordField.tsx
@@ -11,7 +11,7 @@ import VisibilityIcon from '@mui/icons-material/Visibility';
export const CustomInput = styled(TextField)(({ theme }) => ({
width: '183px',
- borderRadius: '5px',
+ borderRadius: '8px',
backgroundColor: theme.palette.background.paper,
outline: 'none',
input: {
@@ -46,6 +46,12 @@ export const CustomInput = styled(TextField)(({ theme }) => ({
'& .MuiInput-underline:after': {
borderBottom: 'none',
},
+ '&:hover': {
+ backgroundColor: theme.palette.background.surface,
+ 'svg path': {
+ fill: theme.palette.secondary,
+ },
+ },
}));
export const PasswordField = forwardRef
(
diff --git a/src/components/Save/Save.tsx b/src/components/Save/Save.tsx
index 9a9af08..986ee65 100644
--- a/src/components/Save/Save.tsx
+++ b/src/components/Save/Save.tsx
@@ -1,7 +1,6 @@
import { useContext, useEffect, useMemo, useState } from 'react';
import isEqual from 'lodash/isEqual'; // TODO Import deep comparison utility
import {
- canSaveSettingToQdnAtom,
hasSettingsChangedAtom,
isUsingImportExportSettingsAtom,
oldPinnedAppsAtom,
@@ -229,15 +228,7 @@ export const Save = ({ isDesktop, disableWidth, myName }) => {
return (
<>
-
+
{isDesktop ? (
{
}}
id="controllable-states-demo"
loading={isLoading}
+ noOptionsText={t('core:option_no', {
+ postProcess: 'capitalizeFirstChar',
+ })}
options={options}
sx={{ width: 300 }}
renderInput={(params) => (
diff --git a/src/i18n/i18n.ts b/src/i18n/i18n.ts
index 2514b9f..1e79aab 100644
--- a/src/i18n/i18n.ts
+++ b/src/i18n/i18n.ts
@@ -56,6 +56,8 @@ i18n
defaultNS: 'core',
interpolation: { escapeValue: false },
react: { useSuspense: false },
+ returnEmptyString: false, // return fallback instead of empty string
+ returnNull: false, // return fallback instead of null
debug: import.meta.env.MODE === 'development',
});
diff --git a/src/i18n/locales/de/auth.json b/src/i18n/locales/de/auth.json
index 7f5ce8d..6eb3023 100644
--- a/src/i18n/locales/de/auth.json
+++ b/src/i18n/locales/de/auth.json
@@ -1,6 +1,6 @@
{
"account": {
- "your": "Ihr Konto",
+ "your": "ihr Konto",
"account_many": "Konten",
"account_one": "Konto",
"selected": "ausgewähltes Konto"
@@ -8,129 +8,129 @@
"action": {
"add": {
"account": "Konto hinzufügen",
- "seed_phrase": "Saatgut hinzufügen"
+ "seed_phrase": "saatgut hinzufügen"
},
"authenticate": "authentifizieren",
- "block": "Block",
- "block_all": "Block alle",
- "block_data": "Blockieren Sie QDN -Daten",
- "block_name": "Blockname",
- "block_txs": "Block TSX",
- "fetch_names": "Namen holen",
- "copy_address": "Adresse kopieren",
- "create_account": "Benutzerkonto erstellen",
- "create_qortal_account": "create your Qortal account by clicking NEXT below.",
- "choose_password": "Wählen Sie ein neues Passwort",
+ "block": "block",
+ "block_all": "block alle",
+ "block_data": "blockieren Sie QDN -Daten",
+ "block_name": "blockname",
+ "block_txs": "block TSX",
+ "fetch_names": "namen holen",
+ "copy_address": "adresse kopieren",
+ "create_account": "benutzerkonto erstellen",
+ "create_qortal_account": "erstellen Sie Ihr Coral-Konto, indem Sie unten auf NÄCHSTE klicken",
+ "choose_password": "wählen Sie ein neues Passwort",
"download_account": "Konto herunterladen",
- "enter_amount": "Bitte geben Sie einen Betrag mehr als 0 ein",
- "enter_recipient": "Bitte geben Sie einen Empfänger ein",
- "enter_wallet_password": "Bitte geben Sie Ihr Brieftaschenkennwort ein",
- "export_seedphrase": "Saatgut exportieren",
- "insert_name_address": "Bitte geben Sie einen Namen oder eine Adresse ein",
- "publish_admin_secret_key": "Veröffentlichen Sie den Administrator -Geheimschlüssel",
- "publish_group_secret_key": "Gruppengeheimnis Key veröffentlichen",
- "reencrypt_key": "Taste neu entschlüsseln",
+ "enter_amount": "bitte geben Sie einen Betrag mehr als 0 ein",
+ "enter_recipient": "bitte geben Sie einen Empfänger ein",
+ "enter_wallet_password": "bitte geben Sie Ihr Brieftaschenkennwort ein",
+ "export_seedphrase": "saatgut exportieren",
+ "insert_name_address": "bitte geben Sie einen Namen oder eine Adresse ein",
+ "publish_admin_secret_key": "veröffentlichen Sie den Administrator -Geheimschlüssel",
+ "publish_group_secret_key": "gruppengeheimnis Key veröffentlichen",
+ "reencrypt_key": "taste neu entschlüsseln",
"return_to_list": "Kehren Sie zur Liste zurück",
- "setup_qortal_account": "Richten Sie Ihr Qortal -Konto ein",
+ "setup_qortal_account": "richten Sie Ihr Qortal -Konto ein",
"unblock": "entsperren",
- "unblock_name": "Name entsperren"
+ "unblock_name": "name entsperren"
},
- "address": "Adresse",
- "address_name": "Adresse oder Name",
- "advanced_users": "Für fortgeschrittene Benutzer",
+ "address": "adresse",
+ "address_name": "adresse oder Name",
+ "advanced_users": "für fortgeschrittene Benutzer",
"apikey": {
- "alternative": "Alternative: Dateiauswahl",
+ "alternative": "alternative: Dateiauswahl",
"change": "apikey ändern",
- "enter": "Geben Sie Apikey ein",
- "import": "Apikey importieren",
- "key": "API -Schlüssel",
- "select_valid": "Wählen Sie einen gültigen Apikey aus"
+ "enter": "geben Sie Apikey ein",
+ "import": "apikey importieren",
+ "key": "aPI -Schlüssel",
+ "select_valid": "wählen Sie einen gültigen Apikey aus"
},
- "authentication": "Authentifizierung",
- "blocked_users": "Blockierte Benutzer",
- "build_version": "Version erstellen",
+ "authentication": "authentifizierung",
+ "blocked_users": "blockierte Benutzer",
+ "build_version": "version erstellen",
"message": {
"error": {
"account_creation": "konnte kein Konto erstellen.",
- "address_not_existing": "Adresse existiert nicht auf Blockchain",
- "block_user": "Benutzer kann nicht blockieren",
+ "address_not_existing": "adresse existiert nicht auf Blockchain",
+ "block_user": "benutzer kann nicht blockieren",
"create_simmetric_key": "kann nicht einen symmetrischen Schlüssel erstellen",
"decrypt_data": "konnten keine Daten entschlüsseln",
"decrypt": "nicht in der Lage zu entschlüsseln",
- "encrypt_content": "Inhalte kann nicht verschlüsseln",
- "fetch_user_account": "Benutzerkonto kann nicht abgerufen werden",
- "field_not_found_json": "{{ field }} not found in JSON",
+ "encrypt_content": "inhalte kann nicht verschlüsseln",
+ "fetch_user_account": "benutzerkonto kann nicht abgerufen werden",
+ "field_not_found_json": "{{ field }} in JSON nicht gefunden",
"find_secret_key": "kann nicht korrekte SecretKey finden",
- "incorrect_password": "Falsches Passwort",
- "invalid_qortal_link": "Ungültiger Qortal -Link",
- "invalid_secret_key": "SecretKey ist nicht gültig",
- "invalid_uint8": "Die von Ihnen eingereichte Uint8arrayData ist ungültig",
- "name_not_existing": "Name existiert nicht",
- "name_not_registered": "Name nicht registriert",
- "read_blob_base64": "Es konnte den Blob nicht als Basis 64-kodierter Zeichenfolge gelesen werden",
- "reencrypt_secret_key": "Der geheime Schlüssel kann nicht wieder entschlüsselt werden",
- "set_apikey": "Ich habe den API -Schlüssel nicht festgelegt:"
+ "incorrect_password": "falsches Passwort",
+ "invalid_qortal_link": "ungültiger Qortal -Link",
+ "invalid_secret_key": "secretKey ist nicht gültig",
+ "invalid_uint8": "die von Ihnen eingereichte Uint8arrayData ist ungültig",
+ "name_not_existing": "name existiert nicht",
+ "name_not_registered": "name nicht registriert",
+ "read_blob_base64": "es konnte den Blob nicht als Basis 64-kodierter Zeichenfolge gelesen werden",
+ "reencrypt_secret_key": "der geheime Schlüssel kann nicht wieder entschlüsselt werden",
+ "set_apikey": "ich habe den API -Schlüssel nicht festgelegt:"
},
"generic": {
- "blocked_addresses": "Blockierte Adressen- Blöcke Verarbeitung von TXS",
- "blocked_names": "Blockierte Namen für QDN",
+ "blocked_addresses": "blockierte Adressen- Blöcke Verarbeitung von TXS",
+ "blocked_names": "blockierte Namen für QDN",
"blocking": "blocking {{ name }}",
- "choose_block": "Wählen Sie 'Block TXS' oder 'All', um Chat -Nachrichten zu blockieren",
- "congrats_setup": "Herzlichen Glückwunsch, Sie sind alle eingerichtet!",
- "decide_block": "Entscheiden Sie, was zu blockieren soll",
- "name_address": "Name oder Adresse",
+ "choose_block": "wählen Sie 'Block TXS' oder 'All', um Chat -Nachrichten zu blockieren",
+ "congrats_setup": "herzlichen Glückwunsch, Sie sind alle eingerichtet!",
+ "decide_block": "entscheiden Sie, was zu blockieren soll",
+ "name_address": "name oder Adresse",
"no_account": "Keine Konten gespeichert",
- "no_minimum_length": "Es gibt keine Mindestlänge -Anforderung",
- "no_secret_key_published": "Noch kein geheimes Schlüssel veröffentlicht",
- "fetching_admin_secret_key": "Administratoren geheimen Schlüssel holen",
- "fetching_group_secret_key": "Abrufen von Gruppengeheimnisschlüsselveröffentlichungen abrufen",
- "last_encryption_date": "last encryption date: {{ date }} by {{ name }}",
- "keep_secure": "Halten Sie Ihre Kontodatei sicher",
- "publishing_key": "Erinnerung: Nachdem der Schlüssel veröffentlicht wurde, dauert es ein paar Minuten, bis es angezeigt wird. Bitte warten Sie einfach.",
- "seedphrase_notice": "a SEEDPHRASE has been randomly generated in the background.",
- "turn_local_node": "Bitte schalten Sie Ihren lokalen Knoten ein",
- "type_seed": "Geben Sie in Ihre Saatgut-Phrase ein oder Einfügen",
- "your_accounts": "Ihre gespeicherten Konten"
+ "no_minimum_length": "es gibt keine Mindestlänge -Anforderung",
+ "no_secret_key_published": "noch kein geheimes Schlüssel veröffentlicht",
+ "fetching_admin_secret_key": "administratoren geheimen Schlüssel holen",
+ "fetching_group_secret_key": "abrufen von Gruppengeheimnisschlüsselveröffentlichungen abrufen",
+ "last_encryption_date": "datum der letzten Verschlüsselung: {{ date }} nach {{ name }}",
+ "keep_secure": "halten Sie Ihre Kontodatei sicher",
+ "publishing_key": "erinnerung: Nachdem der Schlüssel veröffentlicht wurde, dauert es ein paar Minuten, bis es angezeigt wird. Bitte warten Sie einfach.",
+ "seedphrase_notice": "eine SEEDPHRASE wurde zufällig im Hintergrund generiert",
+ "turn_local_node": "bitte schalten Sie Ihren lokalen Knoten ein",
+ "type_seed": "geben Sie in Ihre Saatgut-Phrase ein oder Einfügen",
+ "your_accounts": "ihre gespeicherten Konten"
},
"success": {
"reencrypted_secret_key": "erfolgreich neu verdrängte geheime Schlüssel. Es kann ein paar Minuten dauern, bis sich die Änderungen ausbreiten. Aktualisieren Sie die Gruppe in 5 Minuten."
}
},
"node": {
- "choose": "Wählen Sie den benutzerdefinierten Knoten",
- "custom_many": "Benutzerdefinierte Knoten",
- "use_custom": "Verwenden Sie den benutzerdefinierten Knoten",
- "use_local": "Verwenden Sie den lokalen Knoten",
- "using": "Verwenden von Knoten",
+ "choose": "wählen Sie den benutzerdefinierten Knoten",
+ "custom_many": "benutzerdefinierte Knoten",
+ "use_custom": "verwenden Sie den benutzerdefinierten Knoten",
+ "use_local": "verwenden Sie den lokalen Knoten",
+ "using": "verwenden von Knoten",
"using_public": "mit öffentlichem Knoten",
- "using_public_gateway": "using public node: {{ gateway }}"
+ "using_public_gateway": "öffentlichen Knoten verwenden: {{ gateway }}"
},
- "note": "Notiz",
- "password": "Passwort",
- "password_confirmation": "Passwort bestätigen",
- "seed_phrase": "Samenphrase",
- "seed_your": "Ihr Saatgut",
+ "note": "notiz",
+ "password": "passwort",
+ "password_confirmation": "passwort bestätigen",
+ "seed_phrase": "samenphrase",
+ "seed_your": "ihr Saatgut",
"tips": {
- "additional_wallet": "Verwenden Sie diese Option, um zusätzliche Qortal -Wallets anzuschließen, die Sie bereits erstellt haben, um sich danach bei ihnen anzumelden. Um dies zu tun, benötigen Sie zu Zugriff auf Ihre Sicherungs -JSON -Datei.",
- "digital_id": "Ihre Brieftasche ist wie Ihre digitale ID auf Qortal und wie Sie sich an der Qortal -Benutzeroberfläche anmelden. Es enthält Ihre öffentliche Adresse und den Qortalnamen, den Sie irgendwann auswählen werden. Jede Transaktion, die Sie durchführen, ist mit Ihrer ID verknüpft, und hier verwalten Sie Ihre gesamte Qort- und andere handelbare Kryptowährungen auf Qortal.",
- "existing_account": "Haben Sie bereits ein Qortal -Konto? Geben Sie hier Ihre geheime Sicherungsphrase ein, um darauf zuzugreifen. Dieser Satz ist eine der Möglichkeiten, Ihr Konto wiederherzustellen.",
- "key_encrypt_admin": "Dieser Schlüssel besteht darin, den Inhalt des administratorischen verwandten Inhalts zu verschlüsseln. Nur Administratoren würden in den Inhalten damit verschlüsselt.",
- "key_encrypt_group": "Dieser Schlüssel besteht darin, Gruppeninhalte zu verschlüsseln. Dies ist der einzige, der ab sofort in dieser Benutzeroberfläche verwendet wird. Alle Gruppenmitglieder können inhaltlich mit diesem Schlüssel verschlüsselt werden.",
- "new_account": "Das Erstellen eines Kontos bedeutet, eine neue Brieftasche und eine digitale ID für die Verwendung von Qortal zu erstellen. Sobald Sie Ihr Konto erstellt haben, können Sie damit beginnen, Dinge wie ein Qort zu erhalten, einen Namen und Avatar zu kaufen, Videos und Blogs zu veröffentlichen und vieles mehr.",
- "new_users": "Neue Benutzer beginnen hier!",
- "safe_place": "Speichern Sie Ihr Konto an einem Ort, an dem Sie sich daran erinnern werden!",
- "view_seedphrase": "Wenn Sie die SeedPhrase anzeigen möchten, klicken Sie in diesem Text auf das Wort 'Seedphrase'. Saatgut werden verwendet, um den privaten Schlüssel für Ihr Qortal -Konto zu generieren. Für die Sicherheit standardmäßig werden Seedhrasen nicht angezeigt, wenn sie ausdrücklich ausgewählt werden.",
- "wallet_secure": "Halten Sie Ihre Brieftaschenakte sicher."
+ "additional_wallet": "verwenden Sie diese Option, um zusätzliche Qortal -Wallets anzuschließen, die Sie bereits erstellt haben, um sich danach bei ihnen anzumelden. Um dies zu tun, benötigen Sie zu Zugriff auf Ihre Sicherungs -JSON -Datei.",
+ "digital_id": "ihre Brieftasche ist wie Ihre digitale ID auf Qortal und wie Sie sich an der Qortal -Benutzeroberfläche anmelden. Es enthält Ihre öffentliche Adresse und den Qortalnamen, den Sie irgendwann auswählen werden. Jede Transaktion, die Sie durchführen, ist mit Ihrer ID verknüpft, und hier verwalten Sie Ihre gesamte Qort- und andere handelbare Kryptowährungen auf Qortal.",
+ "existing_account": "haben Sie bereits ein Qortal -Konto? Geben Sie hier Ihre geheime Sicherungsphrase ein, um darauf zuzugreifen. Dieser Satz ist eine der Möglichkeiten, Ihr Konto wiederherzustellen.",
+ "key_encrypt_admin": "dieser Schlüssel besteht darin, den Inhalt des administratorischen verwandten Inhalts zu verschlüsseln. Nur Administratoren würden in den Inhalten damit verschlüsselt.",
+ "key_encrypt_group": "dieser Schlüssel besteht darin, Gruppeninhalte zu verschlüsseln. Dies ist der einzige, der ab sofort in dieser Benutzeroberfläche verwendet wird. Alle Gruppenmitglieder können inhaltlich mit diesem Schlüssel verschlüsselt werden.",
+ "new_account": "das Erstellen eines Kontos bedeutet, eine neue Brieftasche und eine digitale ID für die Verwendung von Qortal zu erstellen. Sobald Sie Ihr Konto erstellt haben, können Sie damit beginnen, Dinge wie ein Qort zu erhalten, einen Namen und Avatar zu kaufen, Videos und Blogs zu veröffentlichen und vieles mehr.",
+ "new_users": "neue Benutzer beginnen hier!",
+ "safe_place": "speichern Sie Ihr Konto an einem Ort, an dem Sie sich daran erinnern werden!",
+ "view_seedphrase": "wenn Sie die SeedPhrase anzeigen möchten, klicken Sie in diesem Text auf das Wort 'Seedphrase'. Saatgut werden verwendet, um den privaten Schlüssel für Ihr Qortal -Konto zu generieren. Für die Sicherheit standardmäßig werden Seedhrasen nicht angezeigt, wenn sie ausdrücklich ausgewählt werden.",
+ "wallet_secure": "halten Sie Ihre Brieftaschenakte sicher."
},
"wallet": {
- "password_confirmation": "Brieftaschenkennwort bestätigen",
- "password": "Brieftaschenkennwort",
- "keep_password": "Halten Sie das aktuelle Passwort",
- "new_password": "Neues Passwort",
+ "password_confirmation": "brieftaschenkennwort bestätigen",
+ "password": "brieftaschenkennwort",
+ "keep_password": "halten Sie das aktuelle Passwort",
+ "new_password": "neues Passwort",
"error": {
- "missing_new_password": "Bitte geben Sie ein neues Passwort ein",
- "missing_password": "Bitte geben Sie Ihr Passwort ein"
+ "missing_new_password": "bitte geben Sie ein neues Passwort ein",
+ "missing_password": "bitte geben Sie Ihr Passwort ein"
}
},
- "welcome": "Willkommen zu"
+ "welcome": "willkommen zu"
}
diff --git a/src/i18n/locales/de/core.json b/src/i18n/locales/de/core.json
index 48c6b00..0d9840c 100644
--- a/src/i18n/locales/de/core.json
+++ b/src/i18n/locales/de/core.json
@@ -1,336 +1,337 @@
{
"action": {
"accept": "akzeptieren",
- "access": "Zugang",
- "access_app": "Zugangs -App",
+ "access": "zugang",
+ "access_app": "zugangs -App",
"add": "hinzufügen",
- "add_custom_framework": "Fügen Sie benutzerdefiniertes Framework hinzu",
- "add_reaction": "Reaktion hinzufügen",
- "add_theme": "Thema hinzufügen",
- "backup_account": "Sicherungskonto",
- "backup_wallet": "Backup -Brieftasche",
+ "add_custom_framework": "fügen Sie benutzerdefiniertes Framework hinzu",
+ "add_reaction": "reaktion hinzufügen",
+ "add_theme": "thema hinzufügen",
+ "backup_account": "sicherungskonto",
+ "backup_wallet": "backup -Brieftasche",
"cancel": "stornieren",
- "cancel_invitation": "Einladung abbrechen",
+ "cancel_invitation": "einladung abbrechen",
"change": "ändern",
- "change_avatar": "Avatar ändern",
- "change_file": "Datei ändern",
- "change_language": "Sprache ändern",
+ "change_avatar": "avatar ändern",
+ "change_file": "datei ändern",
+ "change_language": "sprache ändern",
"choose": "wählen",
- "choose_file": "Datei wählen",
- "choose_image": "Wählen Sie Bild",
- "choose_logo": "Wählen Sie ein Logo",
- "choose_name": "Wählen Sie einen Namen",
+ "choose_file": "datei wählen",
+ "choose_image": "wählen Sie Bild",
+ "choose_logo": "wählen Sie ein Logo",
+ "choose_name": "wählen Sie einen Namen",
"close": "schließen",
- "close_chat": "Direkten Chat schließen",
+ "close_chat": "direkten Chat schließen",
"continue": "weitermachen",
- "continue_logout": "Melden Sie sich weiter an",
- "copy_link": "Link kopieren",
- "create_apps": "Apps erstellen",
- "create_file": "Datei erstellen",
- "create_transaction": "Erstellen Sie Transaktionen auf der Qortal Blockchain",
- "create_thread": "Thread erstellen",
- "decline": "Abfall",
+ "continue_logout": "melden Sie sich weiter an",
+ "copy_link": "link kopieren",
+ "create_apps": "apps erstellen",
+ "create_file": "datei erstellen",
+ "create_transaction": "erstellen Sie Transaktionen auf der Qortal Blockchain",
+ "create_thread": "thread erstellen",
+ "decline": "abfall",
"decrypt": "entschlüsseln",
- "disable_enter": "Deaktivieren Sie die Eingabe",
+ "disable_enter": "deaktivieren Sie die Eingabe",
"download": "herunterladen",
- "download_file": "Datei herunterladen",
+ "download_file": "datei herunterladen",
"edit": "bearbeiten",
- "edit_theme": "Thema bearbeiten",
- "enable_dev_mode": "Dev -Modus aktivieren",
- "enter_name": "Geben Sie einen Namen ein",
- "export": "Export",
- "get_qort": "Holen Sie sich Qort",
- "get_qort_trade": "Holen Sie sich Qort bei Q-Trade",
+ "edit_theme": "thema bearbeiten",
+ "enable_dev_mode": "dev -Modus aktivieren",
+ "enter_name": "geben Sie einen Namen ein",
+ "export": "export",
+ "get_qort": "holen Sie sich Qort",
+ "get_qort_trade": "holen Sie sich Qort bei Q-Trade",
"hide": "verstecken",
- "import": "Import",
- "import_theme": "Importthema",
+ "import": "import",
+ "import_theme": "importthema",
"invite": "einladen",
"invite_member": "ein neues Mitglied einladen",
"join": "verbinden",
"leave_comment": "Kommentar hinterlassen",
"load_announcements": "ältere Ankündigungen laden",
- "login": "Login",
- "logout": "Abmelden",
+ "login": "login",
+ "logout": "abmelden",
"new": {
"chat": "neuer Chat",
"post": "neuer Beitrag",
- "theme": "Neues Thema",
+ "theme": "neues Thema",
"thread": "neuer Thread"
},
"notify": "benachrichtigen",
"open": "offen",
- "pin": "Stift",
- "pin_app": "Pin App",
- "pin_from_dashboard": "Pin vom Armaturenbrett",
- "post": "Post",
- "post_message": "Post Nachricht",
+ "pin": "stift",
+ "pin_app": "pin App",
+ "pin_from_dashboard": "pin vom Armaturenbrett",
+ "post": "post",
+ "post_message": "post Nachricht",
"publish": "veröffentlichen",
- "publish_app": "Veröffentlichen Sie Ihre App",
+ "publish_app": "veröffentlichen Sie Ihre App",
"publish_comment": "Kommentar veröffentlichen",
- "register_name": "Registrieren Sie den Namen",
+ "register_name": "registrieren Sie den Namen",
"remove": "entfernen",
- "remove_reaction": "Reaktion entfernen",
+ "remove_reaction": "reaktion entfernen",
"return_apps_dashboard": "Kehren Sie zu Apps Dashboard zurück",
"save": "speichern",
- "save_disk": "Speichern auf der Festplatte",
+ "save_disk": "speichern auf der Festplatte",
"search": "suchen",
- "search_apps": "Suche nach Apps",
- "search_groups": "Suche nach Gruppen",
- "search_chat_text": "Chattext suchen",
- "select_app_type": "Wählen Sie App -Typ",
+ "search_apps": "suche nach Apps",
+ "search_groups": "suche nach Gruppen",
+ "search_chat_text": "chattext suchen",
+ "select_app_type": "wählen Sie App -Typ",
"select_category": "Kategorie auswählen",
- "select_name_app": "Wählen Sie Name/App",
+ "select_name_app": "wählen Sie Name/App",
"send": "schicken",
"send_qort": "Qort senden",
- "set_avatar": "Setzen Sie Avatar",
+ "set_avatar": "setzen Sie Avatar",
"show": "zeigen",
- "show_poll": "Umfrage zeigen",
- "start_minting": "Fangen Sie an, zu streiten",
- "start_typing": "Fangen Sie hier an, hier zu tippen ...",
- "trade_qort": "Handel Qort",
+ "show_poll": "umfrage zeigen",
+ "start_minting": "fangen Sie an, zu streiten",
+ "start_typing": "fangen Sie hier an, hier zu tippen ...",
+ "trade_qort": "handel Qort",
"transfer_qort": "Qort übertragen",
"unpin": "unpin",
- "unpin_app": "UNPIN App",
- "unpin_from_dashboard": "Unpin aus dem Dashboard",
+ "unpin_app": "uNPIN App",
+ "unpin_from_dashboard": "unpin aus dem Dashboard",
"update": "aktualisieren",
- "update_app": "Aktualisieren Sie Ihre App",
- "vote": "Abstimmung"
+ "update_app": "aktualisieren Sie Ihre App",
+ "vote": "abstimmung"
},
- "admin": "Administrator",
- "admin_other": "Administratoren",
+ "admin": "administrator",
+ "admin_other": "administratoren",
"all": "alle",
- "amount": "Menge",
- "announcement": "Bekanntmachung",
- "announcement_other": "Ankündigungen",
+ "amount": "menge",
+ "announcement": "bekanntmachung",
+ "announcement_other": "ankündigungen",
"api": "API",
- "app": "App",
- "app_other": "Apps",
- "app_name": "App -Name",
- "app_service_type": "App -Service -Typ",
- "apps_dashboard": "Apps Dashboard",
+ "app": "app",
+ "app_other": "apps",
+ "app_name": "aname der App",
+ "app_private": "privat",
+ "app_service_type": "app-Diensttyp",
+ "apps_dashboard": "apps Dashboard",
"apps_official": "offizielle Apps",
- "attachment": "Anhang",
- "balance": "Gleichgewicht:",
- "basic_tabs_example": "Basic Tabs Beispiel",
+ "attachment": "anhang",
+ "balance": "gleichgewicht:",
+ "basic_tabs_example": "basic Tabs Beispiel",
"category": "Kategorie",
"category_other": "Kategorien",
- "chat": "Chat",
+ "chat": "chat",
"comment_other": "Kommentare",
"contact_other": "Kontakte",
"core": {
- "block_height": "Blockhöhe",
+ "block_height": "blockhöhe",
"information": "Kerninformationen",
"peers": "verbundene Kollegen",
"version": "Kernversion"
},
"current_language": "current language: {{ language }}",
- "dev": "Dev",
- "dev_mode": "Dev -Modus",
- "domain": "Domain",
+ "dev": "dev",
+ "dev_mode": "dev -Modus",
+ "domain": "domain",
"ui": {
- "version": "UI -Version"
+ "version": "uI -Version"
},
"count": {
"none": "keiner",
"one": "eins"
},
- "description": "Beschreibung",
- "devmode_apps": "Dev -Modus -Apps",
- "directory": "Verzeichnis",
- "downloading_qdn": "Herunterladen von QDN",
+ "description": "beschreibung",
+ "devmode_apps": "dev -Modus -Apps",
+ "directory": "verzeichnis",
+ "downloading_qdn": "herunterladen von QDN",
"fee": {
- "payment": "Zahlungsgebühr",
- "publish": "Gebühr veröffentlichen"
+ "payment": "zahlungsgebühr",
+ "publish": "gebühr veröffentlichen"
},
"for": "für",
"general": "allgemein",
- "general_settings": "Allgemeine Einstellungen",
+ "general_settings": "allgemeine Einstellungen",
"home": "heim",
"identifier": "Kennung",
- "image_embed": "Bildbett",
+ "image_embed": "bildbett",
"last_height": "letzte Höhe",
- "level": "Ebene",
- "library": "Bibliothek",
+ "level": "ebene",
+ "library": "bibliothek",
"list": {
- "bans": "Liste der Verbote",
- "groups": "Liste der Gruppen",
- "invite": "Liste einladen",
- "invites": "Liste der Einladungen",
- "join_request": "Schließen Sie die Anforderungsliste an",
- "member": "Mitgliedsliste",
- "members": "Liste der Mitglieder"
+ "bans": "liste der Verbote",
+ "groups": "liste der Gruppen",
+ "invites": "liste der Einladungen",
+ "join_request": "schließen Sie die Anforderungsliste an",
+ "member": "mitgliedsliste",
+ "members": "liste der Mitglieder"
},
"loading": {
- "announcements": "Laden von Ankündigungen",
- "generic": "Laden...",
- "chat": "Chat beladen ... Bitte warten Sie.",
+ "announcements": "laden von Ankündigungen",
+ "generic": "laden...",
+ "chat": "chat beladen ... Bitte warten Sie.",
"comments": "Kommentare laden ... bitte warten.",
- "posts": "Beiträge laden ... bitte warten."
+ "posts": "beiträge laden ... bitte warten."
},
- "member": "Mitglied",
- "member_other": "Mitglieder",
- "message_us": "Bitte senden Sie uns eine Nachricht in Telegramm oder Discord, wenn Sie 4 Qort benötigen, um ohne Einschränkungen zu chatten",
+ "member": "mitglied",
+ "member_other": "mitglieder",
+ "message_us": "bitte senden Sie uns eine Nachricht in Telegramm oder Discord, wenn Sie 4 Qort benötigen, um ohne Einschränkungen zu chatten",
"message": {
"error": {
- "address_not_found": "Ihre Adresse wurde nicht gefunden",
- "app_need_name": "Ihre App benötigt einen Namen",
- "build_app": "Private App kann nicht erstellen",
- "decrypt_app": "Private App kann nicht entschlüsseln '",
- "download_image": "Image kann nicht heruntergeladen werden. Bitte versuchen Sie es später erneut, indem Sie auf die Schaltfläche Aktualisieren klicken",
- "download_private_app": "Private App kann nicht heruntergeladen werden",
- "encrypt_app": "App kann nicht verschlüsseln. App nicht veröffentlicht '",
- "fetch_app": "App kann nicht abrufen",
- "fetch_publish": "Veröffentlichung kann nicht abrufen",
+ "address_not_found": "ihre Adresse wurde nicht gefunden",
+ "app_need_name": "ihre App benötigt einen Namen",
+ "build_app": "private App kann nicht erstellen",
+ "decrypt_app": "private App kann nicht entschlüsseln '",
+ "download_image": "image kann nicht heruntergeladen werden. Bitte versuchen Sie es später erneut, indem Sie auf die Schaltfläche Aktualisieren klicken",
+ "download_private_app": "private App kann nicht heruntergeladen werden",
+ "encrypt_app": "app kann nicht verschlüsseln. App nicht veröffentlicht '",
+ "fetch_app": "app kann nicht abrufen",
+ "fetch_publish": "veröffentlichung kann nicht abrufen",
"file_too_large": "file {{ filename }} is too large. Max size allowed is {{ size }} MB.",
- "generic": "Es ist ein Fehler aufgetreten",
- "initiate_download": "Download nicht einleiten",
+ "generic": "es ist ein Fehler aufgetreten",
+ "initiate_download": "download nicht einleiten",
"invalid_amount": "ungültiger Betrag",
- "invalid_base64": "Ungültige Base64 -Daten",
- "invalid_embed_link": "Ungültiger Einbettverbindung",
- "invalid_image_embed_link_name": "Ungültiges Bild -Einbettungs -Link. Fehlender Param.",
- "invalid_poll_embed_link_name": "Ungültige Umfrage -Einbettungsverbindung. Fehlender Name.",
- "invalid_signature": "Ungültige Signatur",
- "invalid_theme_format": "Ungültiges Themenformat",
- "invalid_zip": "Ungültiges Reißverschluss",
- "message_loading": "Fehlerladelademeldung.",
+ "invalid_base64": "ungültige Base64 -Daten",
+ "invalid_embed_link": "ungültiger Einbettverbindung",
+ "invalid_image_embed_link_name": "ungültiges Bild -Einbettungs -Link. Fehlender Param.",
+ "invalid_poll_embed_link_name": "ungültige Umfrage -Einbettungsverbindung. Fehlender Name.",
+ "invalid_signature": "ungültige Signatur",
+ "invalid_theme_format": "ungültiges Themenformat",
+ "invalid_zip": "ungültiges Reißverschluss",
+ "message_loading": "fehlerladelademeldung.",
"message_size": "your message size is of {{ size }} bytes out of a maximum of {{ maximum }}",
- "minting_account_add": "Münzkonto kann nicht hinzugefügt werden",
- "minting_account_remove": "Münzkonto kann nicht entfernen",
+ "minting_account_add": "münzkonto kann nicht hinzugefügt werden",
+ "minting_account_remove": "münzkonto kann nicht entfernen",
"missing_fields": "missing: {{ fields }}",
- "navigation_timeout": "Navigationszeitüberschreitung",
- "network_generic": "Netzwerkfehler",
- "password_not_matching": "Passwortfelder stimmen nicht überein!",
+ "navigation_timeout": "navigationszeitüberschreitung",
+ "network_generic": "netzwerkfehler",
+ "password_not_matching": "passwortfelder stimmen nicht überein!",
"password_wrong": "authentifizieren nicht. Falsches Passwort",
- "publish_app": "App kann nicht veröffentlichen",
- "publish_image": "Image kann nicht veröffentlichen",
+ "publish_app": "app kann nicht veröffentlichen",
+ "publish_image": "image kann nicht veröffentlichen",
"rate": "bewerten nicht",
- "rating_option": "Bewertungsoption kann nicht finden",
+ "rating_option": "bewertungsoption kann nicht finden",
"save_qdn": "qdn kann nicht speichern",
"send_failed": "nicht senden",
"update_failed": "nicht aktualisiert",
"vote": "nicht stimmen können"
},
"generic": {
- "already_voted": "Sie haben bereits gestimmt.",
+ "already_voted": "sie haben bereits gestimmt.",
"avatar_size": "{{ size }} KB max. for GIFS",
- "benefits_qort": "Vorteile von Qort",
- "building": "Gebäude",
- "building_app": "App -App",
+ "benefits_qort": "vorteile von Qort",
+ "building": "gebäude",
+ "building_app": "app -App",
"created_by": "created by {{ owner }}",
"buy_order_request": "the Application
{{hostname}}
is requesting {{count}} buy order",
"buy_order_request_other": "the Application
{{hostname}}
is requesting {{count}} buy orders",
- "devmode_local_node": "Bitte verwenden Sie Ihren lokalen Knoten für den Dev -Modus! Melden Sie sich an und verwenden Sie den lokalen Knoten.",
- "downloading": "Herunterladen",
+ "devmode_local_node": "bitte verwenden Sie Ihren lokalen Knoten für den Dev -Modus! Melden Sie sich an und verwenden Sie den lokalen Knoten.",
+ "downloading": "herunterladen",
"downloading_decrypting_app": "private App herunterladen und entschlüsseln.",
"edited": "bearbeitet",
- "editing_message": "Bearbeitungsnachricht",
+ "editing_message": "bearbeitungsnachricht",
"encrypted": "verschlüsselt",
"encrypted_not": "nicht verschlüsselt",
"fee_qort": "fee: {{ message }} QORT",
- "fetching_data": "App -Daten abrufen",
+ "fetching_data": "app -Daten abrufen",
"foreign_fee": "foreign fee: {{ message }}",
- "get_qort_trade_portal": "Holen Sie sich QORT mit dem CrossChain -Handelsportal von Qortal",
+ "get_qort_trade_portal": "holen Sie sich QORT mit dem CrossChain -Handelsportal von Qortal",
"minimal_qort_balance": "having at least {{ quantity }} QORT in your balance (4 qort balance for chat, 1.25 for name, 0.75 for some transactions)",
"mentioned": "erwähnt",
- "message_with_image": "Diese Nachricht hat bereits ein Bild",
+ "message_with_image": "diese Nachricht hat bereits ein Bild",
"most_recent_payment": "{{ count }} most recent payment",
"name_available": "{{ name }} is available",
- "name_benefits": "Vorteile eines Namens",
+ "name_benefits": "vorteile eines Namens",
"name_checking": "Überprüfen Sie, ob der Name bereits vorhanden ist",
- "name_preview": "Sie benötigen einen Namen, um die Vorschau zu verwenden",
- "name_publish": "Sie benötigen einen Qortalnamen, um zu veröffentlichen",
- "name_rate": "Sie benötigen einen Namen, um zu bewerten.",
+ "name_preview": "sie benötigen einen Namen, um die Vorschau zu verwenden",
+ "name_publish": "sie benötigen einen Qortalnamen, um zu veröffentlichen",
+ "name_rate": "sie benötigen einen Namen, um zu bewerten.",
"name_registration": "your balance is {{ balance }} QORT. A name registration requires a {{ fee }} QORT fee",
"name_unavailable": "{{ name }} is unavailable",
"no_data_image": "Keine Daten für das Bild",
"no_description": "Keine Beschreibung",
"no_messages": "Keine Nachrichten",
- "no_minting_details": "Müngungsdetails auf dem Gateway können nicht angezeigt werden",
+ "no_minting_details": "müngungsdetails auf dem Gateway können nicht angezeigt werden",
"no_notifications": "Keine neuen Benachrichtigungen",
"no_payments": "Keine Zahlungen",
- "no_pinned_changes": "Sie haben derzeit keine Änderungen an Ihren angestellten Apps",
+ "no_pinned_changes": "sie haben derzeit keine Änderungen an Ihren angestellten Apps",
"no_results": "Keine Ergebnisse",
- "one_app_per_name": "Hinweis: Derzeit ist pro Namen nur eine App und Website zulässig.",
+ "one_app_per_name": "hinweis: Derzeit ist pro Namen nur eine App und Website zulässig.",
"opened": "geöffnet",
"overwrite_qdn": "überschreiben zu QDN",
- "password_confirm": "Bitte bestätigen Sie ein Passwort",
- "password_enter": "Bitte geben Sie ein Passwort ein",
- "payment_request": "the Application
{{hostname}}
is requesting a payment",
- "people_reaction": "people who reacted with {{ reaction }}",
- "processing_transaction": "Ist die Verarbeitung von Transaktionen, bitte warten ...",
- "publish_data": "Veröffentlichung von Daten an Qortal: Alles, von Apps bis hin zu Videos. Voll dezentral!",
- "publishing": "Veröffentlichung ... bitte warten.",
- "qdn": "Verwenden Sie QDN Saving",
- "rating": "rating for {{ service }} {{ name }}",
- "register_name": "Sie benötigen einen registrierten Qortal -Namen, um Ihre angestellten Apps vor QDN zu speichern.",
- "replied_to": "replied to {{ person }}",
- "revert_default": "Umzug zurück",
+ "password_confirm": "bitte bestätigen Sie ein Passwort",
+ "password_enter": "bitte geben Sie ein Passwort ein",
+ "payment_request": "die Anwendung
{{hostname}}
fordert eine Zahlung an",
+ "people_reaction": "menschen, die mit reagierten{{ reaction }}",
+ "processing_transaction": "ist die Verarbeitung von Transaktionen, bitte warten ...",
+ "publish_data": "veröffentlichung von Daten an Qortal: Alles, von Apps bis hin zu Videos. Voll dezentral!",
+ "publishing": "veröffentlichung ... bitte warten.",
+ "qdn": "verwenden Sie QDN Saving",
+ "rating": "bewertung für {{ service }} {{ name }}",
+ "register_name": "sie benötigen einen registrierten Qortal -Namen, um Ihre angestellten Apps vor QDN zu speichern.",
+ "replied_to": "antwortete auf {{ person }}",
+ "revert_default": "umzug zurück",
"revert_qdn": "zurück zu QDN zurückkehren",
"save_qdn": "speichern auf qdn",
- "secure_ownership": "Sicheres Eigentum an Daten, die mit Ihrem Namen veröffentlicht wurden. Sie können Ihren Namen sogar zusammen mit Ihren Daten an einen Dritten verkaufen.",
- "select_file": "Bitte wählen Sie eine Datei aus",
- "select_image": "Bitte wählen Sie ein Bild für ein Logo",
- "select_zip": "Wählen Sie .ZIP -Datei mit statischen Inhalten:",
- "sending": "Senden ...",
- "settings": "Sie verwenden den Export-/Import -Weg zum Speichern von Einstellungen.",
- "space_for_admins": "Entschuldigung, dieser Raum gilt nur für Administratoren.",
+ "secure_ownership": "sicheres Eigentum an Daten, die mit Ihrem Namen veröffentlicht wurden. Sie können Ihren Namen sogar zusammen mit Ihren Daten an einen Dritten verkaufen.",
+ "select_file": "bitte wählen Sie eine Datei aus",
+ "select_image": "bitte wählen Sie ein Bild für ein Logo",
+ "select_zip": "wählen Sie .ZIP -Datei mit statischen Inhalten:",
+ "sending": "senden ...",
+ "settings": "sie verwenden den Export-/Import -Weg zum Speichern von Einstellungen.",
+ "space_for_admins": "entschuldigung, dieser Raum gilt nur für Administratoren.",
"unread_messages": "ungelesene Nachrichten unten",
- "unsaved_changes": "Sie haben nicht gespeicherte Änderungen an Ihren angestellten Apps. Speichern Sie sie bei QDN.",
- "updating": "Aktualisierung"
+ "unsaved_changes": "sie haben nicht gespeicherte Änderungen an Ihren angestellten Apps. Speichern Sie sie bei QDN.",
+ "updating": "aktualisierung"
},
- "message": "Nachricht",
- "promotion_text": "Promotionstext",
+ "message": "nachricht",
+ "promotion_text": "promotionstext",
"question": {
- "accept_vote_on_poll": "Akzeptieren Sie diese VOTE_ON_POLL -Transaktion? Umfragen sind öffentlich!",
- "logout": "Sind Sie sicher, dass Sie sich abmelden möchten?",
- "new_user": "Sind Sie ein neuer Benutzer?",
- "delete_chat_image": "Möchten Sie Ihr vorheriges Chat -Bild löschen?",
+ "accept_vote_on_poll": "akzeptieren Sie diese VOTE_ON_POLL -Transaktion? Umfragen sind öffentlich!",
+ "logout": "sind Sie sicher, dass Sie sich abmelden möchten?",
+ "new_user": "sind Sie ein neuer Benutzer?",
+ "delete_chat_image": "möchten Sie Ihr vorheriges Chat -Bild löschen?",
"perform_transaction": "would you like to perform a {{action}} transaction?",
- "provide_thread": "Bitte geben Sie einen Thread -Titel an",
- "publish_app": "Möchten Sie diese App veröffentlichen?",
- "publish_avatar": "Möchten Sie einen Avatar veröffentlichen?",
- "publish_qdn": "Möchten Sie Ihre Einstellungen an QDN veröffentlichen (verschlüsselt)?",
- "overwrite_changes": "Die App konnte Ihre vorhandenen QDN-Saved-Apps nicht herunterladen. Möchten Sie diese Änderungen überschreiben?",
- "rate_app": "would you like to rate this app a rating of {{ rate }}?. It will create a POLL tx.",
- "register_name": "Möchten Sie diesen Namen registrieren?",
- "reset_pinned": "Mögen Sie Ihre aktuellen lokalen Änderungen nicht? Möchten Sie auf die standardmäßigen angestellten Apps zurücksetzen?",
- "reset_qdn": "Mögen Sie Ihre aktuellen lokalen Änderungen nicht? Möchten Sie auf Ihre gespeicherten QDN -Apps zurücksetzen?",
- "transfer_qort": "would you like to transfer {{ amount }} QORT"
+ "provide_thread": "bitte geben Sie einen Thread -Titel an",
+ "publish_app": "möchten Sie diese App veröffentlichen?",
+ "publish_avatar": "möchten Sie einen Avatar veröffentlichen?",
+ "publish_qdn": "möchten Sie Ihre Einstellungen an QDN veröffentlichen (verschlüsselt)?",
+ "overwrite_changes": "die App konnte Ihre vorhandenen QDN-Saved-Apps nicht herunterladen. Möchten Sie diese Änderungen überschreiben?",
+ "rate_app": "möchten Sie dieser App eine Bewertung von {{rate}} geben?. Es wird eine POLL -Transaktion erstellt.",
+ "register_name": "möchten Sie diesen Namen registrieren?",
+ "reset_pinned": "mögen Sie Ihre aktuellen lokalen Änderungen nicht? Möchten Sie auf die standardmäßigen angestellten Apps zurücksetzen?",
+ "reset_qdn": "mögen Sie Ihre aktuellen lokalen Änderungen nicht? Möchten Sie auf Ihre gespeicherten QDN -Apps zurücksetzen?",
+ "transfer_qort": "möchten Sie übertragen {{ amount }} QORT"
},
"status": {
"minting": "(Prägung)",
"not_minting": "(nicht punktieren)",
"synchronized": "synchronisiert",
- "synchronizing": "Synchronisierung"
+ "synchronizing": "synchronisierung"
},
"success": {
- "order_submitted": "Ihre Kaufbestellung wurde eingereicht",
+ "order_submitted": "ihre Kaufbestellung wurde eingereicht",
"published": "erfolgreich veröffentlicht. Bitte warten Sie ein paar Minuten, bis das Netzwerk die Änderungen vorschreibt.",
"published_qdn": "erfolgreich in QDN veröffentlicht",
"rated_app": "erfolgreich bewertet. Bitte warten Sie ein paar Minuten, bis das Netzwerk die Änderungen vorschreibt.",
- "request_read": "Ich habe diese Anfrage gelesen",
- "transfer": "Die Übertragung war erfolgreich!",
+ "request_read": "ich habe diese Anfrage gelesen",
+ "transfer": "die Übertragung war erfolgreich!",
"voted": "erfolgreich abgestimmt. Bitte warten Sie ein paar Minuten, bis das Netzwerk die Änderungen vorschreibt."
}
},
- "minting_status": "Münzstatus",
- "name": "Name",
- "name_app": "Name/App",
- "new_post_in": "new post in {{ title }}",
+ "minting_status": "münzstatus",
+ "name": "name",
+ "name_app": "name/App",
+ "new_post_in": "neuer Beitrag in {{ title }}",
"none": "keiner",
- "note": "Notiz",
- "option": "Option",
- "option_other": "Optionen",
+ "note": "notiz",
+ "option": "option",
+ "option_no": "keine Optionen",
+ "option_other": "optionen",
"page": {
"last": "zuletzt",
- "first": "Erste",
+ "first": "erste",
"next": "nächste",
"previous": "vorherige"
},
- "payment_notification": "Zahlungsbenachrichtigung",
- "poll_embed": "Umfrage Einbettung",
- "port": "Hafen",
- "price": "Preis",
+ "payment_notification": "zahlungsbenachrichtigung",
+ "poll_embed": "umfrage Einbettung",
+ "port": "hafen",
+ "price": "preis",
"q_apps": {
"about": "über diese Q-App",
"q_mail": "Q-Mail",
@@ -338,51 +339,51 @@
"q_sandbox": "q-sandbox",
"q_wallets": "q-wallets"
},
- "receiver": "Empfänger",
- "sender": "Absender",
- "server": "Server",
- "service_type": "Service -Typ",
- "settings": "Einstellungen",
+ "receiver": "empfänger",
+ "sender": "absender",
+ "server": "server",
+ "service_type": "service -Typ",
+ "settings": "einstellungen",
"sort": {
"by_member": "von Mitglied"
},
"supply": "liefern",
- "tags": "Tags",
+ "tags": "tags",
"theme": {
"dark": "dunkel",
- "dark_mode": "Dunkler Modus",
+ "dark_mode": "dunkler Modus",
"default": "default theme",
- "light": "Licht",
- "light_mode": "Lichtmodus",
- "manager": "Themenmanager",
- "name": "Themenname"
+ "light": "licht",
+ "light_mode": "lichtmodus",
+ "manager": "themenmanager",
+ "name": "themenname"
},
- "thread": "Faden",
- "thread_other": "Themen",
- "thread_title": "Threadtitel",
+ "thread": "faden",
+ "thread_other": "themen",
+ "thread_title": "threadtitel",
"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",
- "time": "Zeit"
+ "day_one": "{{count}} tag",
+ "day_other": "{{count}} tage",
+ "hour_one": "{{count}} Stunden",
+ "hour_other": "{{count}} Stunden",
+ "minute_one": "{{count}} Minute",
+ "minute_other": "{{count}} Minuten",
+ "time": "zeit"
},
- "title": "Titel",
- "to": "Zu",
- "tutorial": "Tutorial",
- "url": "URL",
- "user_lookup": "Benutzer suchen",
- "vote": "Abstimmung",
+ "title": "titel",
+ "to": "zu",
+ "tutorial": "tutorial",
+ "url": "uRL",
+ "user_lookup": "benutzer suchen",
+ "vote": "abstimmung",
"vote_other": "{{ count }} votes",
- "zip": "Reißverschluss",
+ "zip": "reißverschluss",
"wallet": {
- "litecoin": "Litecoin -Brieftasche",
+ "litecoin": "litecoin -Brieftasche",
"qortal": "Qortal Wallet",
- "wallet": "Geldbörse",
- "wallet_other": "Brieftaschen"
+ "wallet": "geldbörse",
+ "wallet_other": "brieftaschen"
},
- "website": "Webseite",
- "welcome": "Willkommen"
+ "website": "webseite",
+ "welcome": "willkommen"
}
diff --git a/src/i18n/locales/de/group.json b/src/i18n/locales/de/group.json
index 8572281..32d3c1f 100644
--- a/src/i18n/locales/de/group.json
+++ b/src/i18n/locales/de/group.json
@@ -1,128 +1,127 @@
{
"action": {
- "add_promotion": "Werbung hinzufügen",
- "ban": "Verbot Mitglied aus der Gruppe",
- "cancel_ban": "Verbot abbrechen",
+ "add_promotion": "werbung hinzufügen",
+ "ban": "verbot Mitglied aus der Gruppe",
+ "cancel_ban": "verbot abbrechen",
"copy_private_key": "Kopieren Sie den privaten Schlüssel",
- "create_group": "Gruppe erstellen",
- "disable_push_notifications": "Deaktivieren Sie alle Push -Benachrichtigungen",
- "export_password": "Passwort exportieren",
- "export_private_key": "Private Schlüssel exportieren",
- "find_group": "Gruppe finden",
+ "create_group": "gruppe erstellen",
+ "disable_push_notifications": "deaktivieren Sie alle Push -Benachrichtigungen",
+ "export_password": "passwort exportieren",
+ "export_private_key": "private Schlüssel exportieren",
+ "find_group": "gruppe finden",
"join_group": "sich der Gruppe anschließen",
"kick_member": "Kick -Mitglied aus der Gruppe",
- "invite_member": "Mitglied einladen",
- "leave_group": "Gruppe verlassen",
- "load_members": "Laden Sie Mitglieder mit Namen",
+ "invite_member": "mitglied einladen",
+ "leave_group": "gruppe verlassen",
+ "load_members": "laden Sie Mitglieder mit Namen",
"make_admin": "einen Administrator machen",
- "manage_members": "Mitglieder verwalten",
- "promote_group": "Fördern Sie Ihre Gruppe zu Nichtmitgliedern",
- "publish_announcement": "Ankündigung veröffentlichen",
- "publish_avatar": "Avatar veröffentlichen",
- "refetch_page": "Refetch -Seite",
+ "manage_members": "mitglieder verwalten",
+ "promote_group": "fördern Sie Ihre Gruppe zu Nichtmitgliedern",
+ "publish_announcement": "ankündigung veröffentlichen",
+ "publish_avatar": "avatar veröffentlichen",
+ "refetch_page": "refetch -Seite",
"remove_admin": "als Administrator entfernen",
- "remove_minting_account": "Münzkonto entfernen",
+ "remove_minting_account": "münzkonto entfernen",
"return_to_thread": "Kehren Sie zu Threads zurück",
- "scroll_bottom": "Scrollen Sie nach unten",
- "scroll_unread_messages": "Scrollen Sie zu ungelesenen Nachrichten",
- "select_group": "Wählen Sie eine Gruppe aus",
- "visit_q_mintership": "Besuchen Sie Q-Mintership"
+ "scroll_bottom": "scrollen Sie nach unten",
+ "scroll_unread_messages": "scrollen Sie zu ungelesenen Nachrichten",
+ "select_group": "wählen Sie eine Gruppe aus",
+ "visit_q_mintership": "besuchen Sie Q-Mintership"
},
- "advanced_options": "Erweiterte Optionen",
- "ban_list": "Verbotliste",
+ "advanced_options": "erweiterte Optionen",
"block_delay": {
- "minimum": "Mindestblockverzögerung",
- "maximum": "Maximale Blockverzögerung"
+ "minimum": "mindestblockverzögerung",
+ "maximum": "maximale Blockverzögerung"
},
"group": {
- "approval_threshold": "Gruppengenehmigungsschwelle",
- "avatar": "Gruppe Avatar",
+ "approval_threshold": "gruppengenehmigungsschwelle",
+ "avatar": "gruppe Avatar",
"closed": "geschlossen (privat) - Benutzer benötigen die Erlaubnis, sich anzuschließen",
- "description": "Beschreibung der Gruppe",
- "id": "Gruppen -ID",
- "invites": "Gruppe lädt ein",
- "group": "Gruppe",
+ "description": "beschreibung der Gruppe",
+ "id": "gruppen -ID",
+ "invites": "gruppe lädt ein",
+ "group": "gruppe",
"group_name": "group: {{ name }}",
- "group_other": "Gruppen",
- "groups_admin": "Gruppen, in denen Sie Administrator sind",
- "management": "Gruppenmanagement",
- "member_number": "Anzahl der Mitglieder",
- "messaging": "Nachrichten",
- "name": "Gruppenname",
+ "group_other": "gruppen",
+ "groups_admin": "gruppen, in denen Sie Administrator sind",
+ "management": "gruppenmanagement",
+ "member_number": "anzahl der Mitglieder",
+ "messaging": "nachrichten",
+ "name": "gruppenname",
"open": "offen (öffentlich)",
- "private": "Privatgruppe",
- "promotions": "Gruppenförderungen",
+ "private": "privatgruppe",
+ "promotions": "gruppenförderungen",
"public": "öffentliche Gruppe",
- "type": "Gruppentyp"
+ "type": "gruppentyp"
},
- "invitation_expiry": "Einladungszeit",
+ "invitation_expiry": "einladungszeit",
"invitees_list": "lädt die Liste ein",
- "join_link": "Gruppenverbindung beibringen",
- "join_requests": "Schließen Sie Anfragen an",
+ "join_link": "gruppenverbindung beibringen",
+ "join_requests": "schließen Sie Anfragen an",
"last_message": "letzte Nachricht",
"last_message_date": "last message: {{date }}",
- "latest_mails": "Letzte Q-Mails",
+ "latest_mails": "letzte Q-Mails",
"message": {
"generic": {
"avatar_publish_fee": "publishing an Avatar requires {{ fee }}",
- "avatar_registered_name": "Ein registrierter Name ist erforderlich, um einen Avatar festzulegen",
- "admin_only": "Es werden nur Gruppen angezeigt, in denen Sie ein Administrator sind",
- "already_in_group": "Sie sind bereits in dieser Gruppe!",
- "block_delay_minimum": "Mindestblockverzögerung für Gruppentransaktionsgenehmigungen",
- "block_delay_maximum": "Maximale Blockverzögerung für Gruppentransaktionsgenehmigungen",
- "closed_group": "Dies ist eine geschlossene/private Gruppe, daher müssen Sie warten, bis ein Administrator Ihre Anfrage annimmt",
- "descrypt_wallet": "Brieftasche entschlüsseln ...",
- "encryption_key": "Der erste gemeinsame Verschlüsselungsschlüssel der Gruppe befindet sich im Erstellungsprozess. Bitte warten Sie ein paar Minuten, bis es vom Netzwerk abgerufen wird. Alle 2 Minuten überprüfen ...",
- "group_announcement": "Gruppenankündigungen",
- "group_approval_threshold": "Gruppengenehmigungsschwelle (Anzahl / Prozentsatz der Administratoren, die eine Transaktion genehmigen müssen)",
- "group_encrypted": "Gruppe verschlüsselt",
+ "avatar_registered_name": "ein registrierter Name ist erforderlich, um einen Avatar festzulegen",
+ "admin_only": "es werden nur Gruppen angezeigt, in denen Sie ein Administrator sind",
+ "already_in_group": "sie sind bereits in dieser Gruppe!",
+ "block_delay_minimum": "mindestblockverzögerung für Gruppentransaktionsgenehmigungen",
+ "block_delay_maximum": "maximale Blockverzögerung für Gruppentransaktionsgenehmigungen",
+ "closed_group": "dies ist eine geschlossene/private Gruppe, daher müssen Sie warten, bis ein Administrator Ihre Anfrage annimmt",
+ "descrypt_wallet": "brieftasche entschlüsseln ...",
+ "encryption_key": "der erste gemeinsame Verschlüsselungsschlüssel der Gruppe befindet sich im Erstellungsprozess. Bitte warten Sie ein paar Minuten, bis es vom Netzwerk abgerufen wird. Alle 2 Minuten überprüfen ...",
+ "group_announcement": "gruppenankündigungen",
+ "group_approval_threshold": "gruppengenehmigungsschwelle (Anzahl / Prozentsatz der Administratoren, die eine Transaktion genehmigen müssen)",
+ "group_encrypted": "gruppe verschlüsselt",
"group_invited_you": "{{group}} has invited you",
- "group_key_created": "Erster Gruppenschlüssel erstellt.",
- "group_member_list_changed": "Die Gruppenmitglied -Liste hat sich geändert. Bitte entschlüsseln Sie den geheimen Schlüssel erneut.",
- "group_no_secret_key": "Es gibt keinen Gruppengeheimnis. Seien Sie der erste Administrator, der einen veröffentlicht!",
- "group_secret_key_no_owner": "Der neueste Gruppengeheimnis wurde von einem Nichtbesitzer veröffentlicht. Als Eigentümer der Gruppe können Sie bitte den Schlüssel als Sicherheitsgrad erneut entschlüsseln.",
- "invalid_content": "Ungültiger Inhalt, Absender oder Zeitstempel in Reaktionsdaten",
- "invalid_data": "Fehler laden Inhalt: Ungültige Daten",
- "latest_promotion": "Für Ihre Gruppe wird nur die letzte Aktion der Woche angezeigt.",
- "loading_members": "Laden Sie die Mitgliedsliste mit Namen ... Bitte warten Sie.",
+ "group_key_created": "erster Gruppenschlüssel erstellt.",
+ "group_member_list_changed": "die Gruppenmitglied -Liste hat sich geändert. Bitte entschlüsseln Sie den geheimen Schlüssel erneut.",
+ "group_no_secret_key": "es gibt keinen Gruppengeheimnis. Seien Sie der erste Administrator, der einen veröffentlicht!",
+ "group_secret_key_no_owner": "der neueste Gruppengeheimnis wurde von einem Nichtbesitzer veröffentlicht. Als Eigentümer der Gruppe können Sie bitte den Schlüssel als Sicherheitsgrad erneut entschlüsseln.",
+ "invalid_content": "ungültiger Inhalt, Absender oder Zeitstempel in Reaktionsdaten",
+ "invalid_data": "fehler laden Inhalt: Ungültige Daten",
+ "latest_promotion": "für Ihre Gruppe wird nur die letzte Aktion der Woche angezeigt.",
+ "loading_members": "laden Sie die Mitgliedsliste mit Namen ... Bitte warten Sie.",
"max_chars": "max. 200 Zeichen. Gebühr veröffentlichen",
- "manage_minting": "Verwalten Sie Ihr Pressen",
- "minter_group": "Sie sind derzeit nicht Teil der Minter -Gruppe",
- "mintership_app": "Besuchen Sie die Q-Mintership-App, um sich als Minter zu bewerben",
- "minting_account": "Meilenkonto:",
- "minting_keys_per_node": "Per Knoten sind nur 2 Münzschlüssel zulässig. Bitte entfernen Sie eine, wenn Sie mit diesem Konto minken möchten.",
- "minting_keys_per_node_different": "Per Knoten sind nur 2 Münzschlüssel zulässig. Bitte entfernen Sie eines, wenn Sie ein anderes Konto hinzufügen möchten.",
- "next_level": "Blöcke verbleiben bis zum nächsten Level:",
- "node_minting": "Dieser Knoten spielt:",
- "node_minting_account": "Node's Pinning Accounts",
- "node_minting_key": "Sie haben derzeit einen Müngungsschlüssel für dieses Konto an diesem Knoten beigefügt",
+ "manage_minting": "verwalten Sie Ihr Pressen",
+ "minter_group": "sie sind derzeit nicht Teil der Minter -Gruppe",
+ "mintership_app": "besuchen Sie die Q-Mintership-App, um sich als Minter zu bewerben",
+ "minting_account": "meilenkonto:",
+ "minting_keys_per_node": "per Knoten sind nur 2 Münzschlüssel zulässig. Bitte entfernen Sie eine, wenn Sie mit diesem Konto minken möchten.",
+ "minting_keys_per_node_different": "per Knoten sind nur 2 Münzschlüssel zulässig. Bitte entfernen Sie eines, wenn Sie ein anderes Konto hinzufügen möchten.",
+ "next_level": "blöcke verbleiben bis zum nächsten Level:",
+ "node_minting": "dieser Knoten spielt:",
+ "node_minting_account": "node's Pinning Accounts",
+ "node_minting_key": "sie haben derzeit einen Müngungsschlüssel für dieses Konto an diesem Knoten beigefügt",
"no_announcement": "Keine Ankündigungen",
- "no_display": "Nichts zu zeigen",
+ "no_display": "nichts zu zeigen",
"no_selection": "Keine Gruppe ausgewählt",
- "not_part_group": "Sie sind nicht Teil der verschlüsselten Gruppe von Mitgliedern. Warten Sie, bis ein Administrator die Schlüssel erneut entschlüsselt.",
- "only_encrypted": "Es werden nur unverschlüsselte Nachrichten angezeigt.",
- "only_private_groups": "Es werden nur private Gruppen gezeigt",
+ "not_part_group": "sie sind nicht Teil der verschlüsselten Gruppe von Mitgliedern. Warten Sie, bis ein Administrator die Schlüssel erneut entschlüsselt.",
+ "only_encrypted": "es werden nur unverschlüsselte Nachrichten angezeigt.",
+ "only_private_groups": "es werden nur private Gruppen gezeigt",
"pending_join_requests": "{{ group }} has {{ count }} pending join requests",
- "private_key_copied": "Privatschlüssel kopiert",
- "provide_message": "Bitte geben Sie dem Thread eine erste Nachricht an",
- "secure_place": "Halten Sie Ihren privaten Schlüssel an einem sicheren Ort. Teilen Sie nicht!",
- "setting_group": "Gruppe einrichten ... bitte warten."
+ "private_key_copied": "privatschlüssel kopiert",
+ "provide_message": "bitte geben Sie dem Thread eine erste Nachricht an",
+ "secure_place": "halten Sie Ihren privaten Schlüssel an einem sicheren Ort. Teilen Sie nicht!",
+ "setting_group": "gruppe einrichten ... bitte warten."
},
"error": {
- "access_name": "Eine Nachricht kann nicht ohne Zugriff auf Ihren Namen gesendet werden",
+ "access_name": "eine Nachricht kann nicht ohne Zugriff auf Ihren Namen gesendet werden",
"descrypt_wallet": "error decrypting wallet {{ message }}",
- "description_required": "Bitte geben Sie eine Beschreibung an",
+ "description_required": "bitte geben Sie eine Beschreibung an",
"group_info": "kann nicht auf Gruppeninformationen zugreifen",
"group_join": "versäumte es, sich der Gruppe anzuschließen",
- "group_promotion": "Fehler veröffentlichen die Promotion. Bitte versuchen Sie es erneut",
+ "group_promotion": "fehler veröffentlichen die Promotion. Bitte versuchen Sie es erneut",
"group_secret_key": "kann Gruppengeheimschlüssel nicht bekommen",
- "name_required": "Bitte geben Sie einen Namen an",
- "notify_admins": "Versuchen Sie, einen Administrator aus der Liste der folgenden Administratoren zu benachrichtigen:",
+ "name_required": "bitte geben Sie einen Namen an",
+ "notify_admins": "versuchen Sie, einen Administrator aus der Liste der folgenden Administratoren zu benachrichtigen:",
"qortals_required": "you need at least {{ quantity }} QORT to send a message",
- "timeout_reward": "Auszeitlimitwartung auf Belohnung Aktienbestätigung",
- "thread_id": "Thread -ID kann nicht suchen",
+ "timeout_reward": "auszeitlimitwartung auf Belohnung Aktienbestätigung",
+ "thread_id": "thread -ID kann nicht suchen",
"unable_determine_group_private": "kann nicht feststellen, ob die Gruppe privat ist",
- "unable_minting": "Es kann nicht mit dem Messen beginnen"
+ "unable_minting": "es kann nicht mit dem Messen beginnen"
},
"success": {
"group_ban": "erfolgreich verbotenes Mitglied von Group. Es kann ein paar Minuten dauern, bis sich die Änderungen der Verbreitung verbreiten",
@@ -143,24 +142,24 @@
"group_promotion": "erfolgreich veröffentlichte Promotion. Es kann ein paar Minuten dauern, bis die Beförderung erscheint",
"group_remove_member": "erfolgreich als Administrator entfernt. Es kann ein paar Minuten dauern, bis sich die Änderungen der Verbreitung verbreiten",
"invitation_cancellation": "erfolgreich stornierte Einladung. Es kann ein paar Minuten dauern, bis sich die Änderungen der Verbreitung verbreiten",
- "invitation_request": "Akzeptierte Join -Anfrage: Warten auf Bestätigung",
- "loading_threads": "Threads laden ... bitte warten.",
+ "invitation_request": "akzeptierte Join -Anfrage: Warten auf Bestätigung",
+ "loading_threads": "threads laden ... bitte warten.",
"post_creation": "erfolgreich erstellte Post. Es kann einige Zeit dauern, bis sich die Veröffentlichung vermehrt",
"published_secret_key": "published secret key for group {{ group_id }}: awaiting confirmation",
"published_secret_key_label": "published secret key for group {{ group_id }}: success!",
"registered_name": "erfolgreich registriert. Es kann ein paar Minuten dauern, bis sich die Änderungen der Verbreitung verbreiten",
- "registered_name_label": "Registrierter Name: Warten auf Bestätigung. Dies kann ein paar Minuten dauern.",
- "registered_name_success": "Registrierter Name: Erfolg!",
- "rewardshare_add": "Fügen Sie Belohnung hinzu: Warten auf Bestätigung",
- "rewardshare_add_label": "Fügen Sie Belohnungen hinzu: Erfolg!",
- "rewardshare_creation": "Bestätigung der Schaffung von Belohnungen in der Kette. Bitte sei geduldig, dies könnte bis zu 90 Sekunden dauern.",
- "rewardshare_confirmed": "Belohnung bestätigt. Bitte klicken Sie auf Weiter.",
- "rewardshare_remove": "Entfernen Sie Belohnungen: Warten auf Bestätigung",
- "rewardshare_remove_label": "Entfernen Sie Belohnung: Erfolg!",
+ "registered_name_label": "registrierter Name: Warten auf Bestätigung. Dies kann ein paar Minuten dauern.",
+ "registered_name_success": "registrierter Name: Erfolg!",
+ "rewardshare_add": "fügen Sie Belohnung hinzu: Warten auf Bestätigung",
+ "rewardshare_add_label": "fügen Sie Belohnungen hinzu: Erfolg!",
+ "rewardshare_creation": "bestätigung der Schaffung von Belohnungen in der Kette. Bitte sei geduldig, dies könnte bis zu 90 Sekunden dauern.",
+ "rewardshare_confirmed": "belohnung bestätigt. Bitte klicken Sie auf Weiter.",
+ "rewardshare_remove": "entfernen Sie Belohnungen: Warten auf Bestätigung",
+ "rewardshare_remove_label": "entfernen Sie Belohnung: Erfolg!",
"thread_creation": "erfolgreich erstellter Thread. Es kann einige Zeit dauern, bis sich die Veröffentlichung vermehrt",
"unbanned_user": "erfolgreich ungebannter Benutzer. Es kann ein paar Minuten dauern, bis sich die Änderungen der Verbreitung verbreiten",
- "user_joined": "Benutzer erfolgreich beigetreten!"
+ "user_joined": "benutzer erfolgreich beigetreten!"
}
},
- "thread_posts": "Neue Thread -Beiträge"
+ "thread_posts": "neue Thread -Beiträge"
}
diff --git a/src/i18n/locales/de/question.json b/src/i18n/locales/de/question.json
index c7d8c8e..836d5ce 100644
--- a/src/i18n/locales/de/question.json
+++ b/src/i18n/locales/de/question.json
@@ -1,184 +1,184 @@
{
- "accept_app_fee": "App -Gebühr akzeptieren",
- "always_authenticate": "Immer automatisch authentifizieren",
- "always_chat_messages": "Erlauben Sie immer Chat -Nachrichten von dieser App",
- "always_retrieve_balance": "Lassen Sie das Gleichgewicht immer automatisch abgerufen",
- "always_retrieve_list": "Lassen Sie die Listen immer automatisch abgerufen",
- "always_retrieve_wallet": "Lassen Sie die Brieftasche immer automatisch abgerufen",
- "always_retrieve_wallet_transactions": "Lassen Sie die Brieftaschentransaktionen immer automatisch abgerufen",
+ "accept_app_fee": "app -Gebühr akzeptieren",
+ "always_authenticate": "immer automatisch authentifizieren",
+ "always_chat_messages": "erlauben Sie immer Chat -Nachrichten von dieser App",
+ "always_retrieve_balance": "lassen Sie das Gleichgewicht immer automatisch abgerufen",
+ "always_retrieve_list": "lassen Sie die Listen immer automatisch abgerufen",
+ "always_retrieve_wallet": "lassen Sie die Brieftasche immer automatisch abgerufen",
+ "always_retrieve_wallet_transactions": "lassen Sie die Brieftaschentransaktionen immer automatisch abgerufen",
"amount_qty": "amount: {{ quantity }}",
"asset_name": "asset: {{ asset }}",
"assets_used_pay": "asset used in payments: {{ asset }}",
"coin": "coin: {{ coin }}",
"description": "description: {{ description }}",
- "deploy_at": "Möchten Sie dies einsetzen?",
- "download_file": "Möchten Sie herunterladen:",
+ "deploy_at": "möchten Sie dies einsetzen?",
+ "download_file": "möchten Sie herunterladen:",
"message": {
"error": {
"add_to_list": "fehlgeschlagen zur Liste",
"at_info": "kann bei Info nicht finden.",
- "buy_order": "Versäumnis, Handelsbestellung einzureichen",
- "cancel_sell_order": "Die Verkaufsbestellung nicht kündigte. Versuchen Sie es erneut!",
- "copy_clipboard": "Versäumt, in die Zwischenablage zu kopieren",
- "create_sell_order": "Die Verkaufsbestellung nicht erstellt. Versuchen Sie es erneut!",
- "create_tradebot": "TradeBot kann nicht erstellen",
- "decode_transaction": "Transaktion nicht dekodieren",
+ "buy_order": "versäumnis, Handelsbestellung einzureichen",
+ "cancel_sell_order": "die Verkaufsbestellung nicht kündigte. Versuchen Sie es erneut!",
+ "copy_clipboard": "versäumt, in die Zwischenablage zu kopieren",
+ "create_sell_order": "die Verkaufsbestellung nicht erstellt. Versuchen Sie es erneut!",
+ "create_tradebot": "tradeBot kann nicht erstellen",
+ "decode_transaction": "transaktion nicht dekodieren",
"decrypt": "nicht in der Lage zu entschlüsseln",
- "decrypt_message": "Die Nachricht nicht entschlüsselt. Stellen Sie sicher, dass die Daten und Schlüssel korrekt sind",
- "decryption_failed": "Die Entschlüsselung fehlgeschlagen",
- "empty_receiver": "Der Empfänger kann nicht leer sein!",
- "encrypt": "Verschlüsseln nicht in der Lage",
- "encryption_failed": "Verschlüsselung fehlgeschlagen",
- "encryption_requires_public_key": "Die Verschlüsselung von Daten erfordert öffentliche Schlüssel",
+ "decrypt_message": "die Nachricht nicht entschlüsselt. Stellen Sie sicher, dass die Daten und Schlüssel korrekt sind",
+ "decryption_failed": "die Entschlüsselung fehlgeschlagen",
+ "empty_receiver": "der Empfänger kann nicht leer sein!",
+ "encrypt": "verschlüsseln nicht in der Lage",
+ "encryption_failed": "verschlüsselung fehlgeschlagen",
+ "encryption_requires_public_key": "die Verschlüsselung von Daten erfordert öffentliche Schlüssel",
"fetch_balance_token": "failed to fetch {{ token }} Balance. Try again!",
- "fetch_balance": "Gleichgewicht kann nicht abrufen",
- "fetch_connection_history": "Der Serververbindungsverlauf fehlte nicht",
+ "fetch_balance": "gleichgewicht kann nicht abrufen",
+ "fetch_connection_history": "der Serververbindungsverlauf fehlte nicht",
"fetch_generic": "kann nicht holen",
"fetch_group": "versäumte die Gruppe, die Gruppe zu holen",
- "fetch_list": "Die Liste versäumt es, die Liste zu holen",
- "fetch_poll": "Umfrage nicht abzuholen",
+ "fetch_list": "die Liste versäumt es, die Liste zu holen",
+ "fetch_poll": "umfrage nicht abzuholen",
"fetch_recipient_public_key": "versäumte es, den öffentlichen Schlüssel des Empfängers zu holen",
- "fetch_wallet_info": "Wallet -Informationen können nicht abrufen",
- "fetch_wallet_transactions": "Brieftaschentransaktionen können nicht abrufen",
- "fetch_wallet": "Fetch Wallet fehlgeschlagen. Bitte versuchen Sie es erneut",
- "file_extension": "Eine Dateierweiterung konnte nicht abgeleitet werden",
+ "fetch_wallet_info": "wallet -Informationen können nicht abrufen",
+ "fetch_wallet_transactions": "brieftaschentransaktionen können nicht abrufen",
+ "fetch_wallet": "fetch Wallet fehlgeschlagen. Bitte versuchen Sie es erneut",
+ "file_extension": "eine Dateierweiterung konnte nicht abgeleitet werden",
"gateway_balance_local_node": "cannot view {{ token }} balance through the gateway. Please use your local node.",
- "gateway_non_qort_local_node": "Eine Nicht-Qort-Münze kann nicht durch das Gateway schicken. Bitte benutzen Sie Ihren lokalen Knoten.",
+ "gateway_non_qort_local_node": "eine Nicht-Qort-Münze kann nicht durch das Gateway schicken. Bitte benutzen Sie Ihren lokalen Knoten.",
"gateway_retrieve_balance": "retrieving {{ token }} balance is not allowed through a gateway",
"gateway_wallet_local_node": "cannot view {{ token }} wallet through the gateway. Please use your local node.",
- "get_foreign_fee": "Fehler in der Auslandsgebühr erhalten",
- "insufficient_balance_qort": "Ihr Qortenbilanz ist unzureichend",
- "insufficient_balance": "Ihr Vermögensguthaben ist nicht ausreichend",
+ "get_foreign_fee": "fehler in der Auslandsgebühr erhalten",
+ "insufficient_balance_qort": "ihr Qortenbilanz ist unzureichend",
+ "insufficient_balance": "ihr Vermögensguthaben ist nicht ausreichend",
"insufficient_funds": "unzureichende Mittel",
- "invalid_encryption_iv": "Ungültiges IV: AES-GCM benötigt einen 12-Byte IV",
- "invalid_encryption_key": "Ungültiger Schlüssel: AES-GCM erfordert einen 256-Bit-Schlüssel.",
- "invalid_fullcontent": "Field Fullcontent befindet sich in einem ungültigen Format. Verwenden Sie entweder eine Zeichenfolge, Base64 oder ein Objekt",
+ "invalid_encryption_iv": "ungültiges IV: AES-GCM benötigt einen 12-Byte IV",
+ "invalid_encryption_key": "ungültiger Schlüssel: AES-GCM erfordert einen 256-Bit-Schlüssel.",
+ "invalid_fullcontent": "field Fullcontent befindet sich in einem ungültigen Format. Verwenden Sie entweder eine Zeichenfolge, Base64 oder ein Objekt",
"invalid_receiver": "ungültige Empfängeradresse oder Name",
- "invalid_type": "Ungültiger Typ",
- "mime_type": "Ein Mimetyp konnte nicht abgeleitet werden",
+ "invalid_type": "ungültiger Typ",
+ "mime_type": "ein Mimetyp konnte nicht abgeleitet werden",
"missing_fields": "missing fields: {{ fields }}",
- "name_already_for_sale": "Dieser Name steht bereits zum Verkauf an",
- "name_not_for_sale": "Dieser Name steht nicht zum Verkauf",
+ "name_already_for_sale": "dieser Name steht bereits zum Verkauf an",
+ "name_not_for_sale": "dieser Name steht nicht zum Verkauf",
"no_api_found": "Keine nutzbare API gefunden",
"no_data_encrypted_resource": "Keine Daten in der verschlüsselten Ressource",
- "no_data_file_submitted": "Es wurden keine Daten oder Dateien eingereicht",
- "no_group_found": "Gruppe nicht gefunden",
+ "no_data_file_submitted": "es wurden keine Daten oder Dateien eingereicht",
+ "no_group_found": "gruppe nicht gefunden",
"no_group_key": "Kein Gruppenschlüssel gefunden",
- "no_poll": "Umfrage nicht gefunden",
+ "no_poll": "umfrage nicht gefunden",
"no_resources_publish": "Keine Ressourcen für die Veröffentlichung",
- "node_info": "Nicht abrufen Knoteninformationen",
- "node_status": "Der Status des Knotens konnte nicht abgerufen werden",
- "only_encrypted_data": "Nur verschlüsselte Daten können in private Dienste eingehen",
- "perform_request": "Die Anfrage versäumte es, Anfrage auszuführen",
- "poll_create": "Umfrage nicht zu erstellen",
+ "node_info": "nicht abrufen Knoteninformationen",
+ "node_status": "der Status des Knotens konnte nicht abgerufen werden",
+ "only_encrypted_data": "nur verschlüsselte Daten können in private Dienste eingehen",
+ "perform_request": "die Anfrage versäumte es, Anfrage auszuführen",
+ "poll_create": "umfrage nicht zu erstellen",
"poll_vote": "versäumte es, über die Umfrage abzustimmen",
- "process_transaction": "Transaktion kann nicht verarbeitet werden",
- "provide_key_shared_link": "Für eine verschlüsselte Ressource müssen Sie den Schlüssel zum Erstellen des freigegebenen Links bereitstellen",
- "registered_name": "Für die Veröffentlichung ist ein registrierter Name erforderlich",
- "resources_publish": "Einige Ressourcen haben nicht veröffentlicht",
+ "process_transaction": "transaktion kann nicht verarbeitet werden",
+ "provide_key_shared_link": "für eine verschlüsselte Ressource müssen Sie den Schlüssel zum Erstellen des freigegebenen Links bereitstellen",
+ "registered_name": "für die Veröffentlichung ist ein registrierter Name erforderlich",
+ "resources_publish": "einige Ressourcen haben nicht veröffentlicht",
"retrieve_file": "fehlgeschlagene Datei abrufen",
- "retrieve_keys": "Schlüsseln können nicht abgerufen werden",
- "retrieve_summary": "Die Zusammenfassung versäumte es nicht, eine Zusammenfassung abzurufen",
+ "retrieve_keys": "schlüsseln können nicht abgerufen werden",
+ "retrieve_summary": "die Zusammenfassung versäumte es nicht, eine Zusammenfassung abzurufen",
"retrieve_sync_status": "error in retrieving {{ token }} sync status",
- "same_foreign_blockchain": "Alle angeforderten ATs müssen die gleiche fremde Blockchain haben.",
+ "same_foreign_blockchain": "alle angeforderten ATs müssen die gleiche fremde Blockchain haben.",
"send": "nicht senden",
- "server_current_add": "Der aktuelle Server fügte nicht hinzu",
- "server_current_set": "Der aktuelle Server hat nicht festgelegt",
- "server_info": "Fehler beim Abrufen von Serverinformationen",
- "server_remove": "Server nicht entfernen",
- "submit_sell_order": "Die Verkaufsbestellung versäumte es nicht",
+ "server_current_add": "der aktuelle Server fügte nicht hinzu",
+ "server_current_set": "der aktuelle Server hat nicht festgelegt",
+ "server_info": "fehler beim Abrufen von Serverinformationen",
+ "server_remove": "server nicht entfernen",
+ "submit_sell_order": "die Verkaufsbestellung versäumte es nicht",
"synchronization_attempts": "failed to synchronize after {{ quantity }} attempts",
"timeout_request": "zeitlich anfordern",
"token_not_supported": "{{ token }} is not supported for this call",
- "transaction_activity_summary": "Fehler in der Transaktionsaktivitätszusammenfassung",
- "unknown_error": "Unbekannter Fehler",
+ "transaction_activity_summary": "fehler in der Transaktionsaktivitätszusammenfassung",
+ "unknown_error": "unbekannter Fehler",
"unknown_admin_action_type": "unknown admin action type: {{ type }}",
- "update_foreign_fee": "Versäumte Aktualisierung der Auslandsgebühr",
- "update_tradebot": "TradeBot kann nicht aktualisiert werden",
- "upload_encryption": "Der Upload ist aufgrund fehlgeschlagener Verschlüsselung fehlgeschlagen",
- "upload": "Upload fehlgeschlagen",
- "use_private_service": "Für eine verschlüsselte Veröffentlichung verwenden Sie bitte einen Dienst, der mit _Private endet",
- "user_qortal_name": "Der Benutzer hat keinen Qortalnamen"
+ "update_foreign_fee": "versäumte Aktualisierung der Auslandsgebühr",
+ "update_tradebot": "tradeBot kann nicht aktualisiert werden",
+ "upload_encryption": "der Upload ist aufgrund fehlgeschlagener Verschlüsselung fehlgeschlagen",
+ "upload": "upload fehlgeschlagen",
+ "use_private_service": "für eine verschlüsselte Veröffentlichung verwenden Sie bitte einen Dienst, der mit _Private endet",
+ "user_qortal_name": "der Benutzer hat keinen Qortalnamen"
},
"generic": {
"calculate_fee": "*the {{ amount }} sats fee is derived from {{ rate }} sats per kb, for a transaction that is approximately 300 bytes in size.",
- "confirm_join_group": "Bestätigen Sie, sich der Gruppe anzuschließen:",
- "include_data_decrypt": "Bitte geben Sie Daten zum Entschlüsseln ein",
- "include_data_encrypt": "Bitte geben Sie Daten zum Verschlüsseln ein",
- "max_retry_transaction": "Max -Wiederholungen erreichten. Transaktion überspringen.",
- "no_action_public_node": "Diese Aktion kann nicht über einen öffentlichen Knoten durchgeführt werden",
- "private_service": "Bitte nutzen Sie einen privaten Service",
- "provide_group_id": "Bitte geben Sie eine GroupID an",
- "read_transaction_carefully": "Lesen Sie die Transaktion sorgfältig durch, bevor Sie akzeptieren!",
- "user_declined_add_list": "Der Benutzer lehnte es ab, zur Liste hinzugefügt zu werden",
- "user_declined_delete_from_list": "Der Benutzer lehnte es ab, aus der Liste zu löschen",
- "user_declined_delete_hosted_resources": "Der Benutzer lehnte ab löschte gehostete Ressourcen",
- "user_declined_join": "Der Benutzer lehnte es ab, sich der Gruppe anzuschließen",
- "user_declined_list": "Der Benutzer lehnte es ab, eine Liste der gehosteten Ressourcen zu erhalten",
- "user_declined_request": "Der Benutzer lehnte die Anfrage ab",
- "user_declined_save_file": "Der Benutzer lehnte es ab, Datei zu speichern",
- "user_declined_send_message": "Der Benutzer lehnte es ab, eine Nachricht zu senden",
- "user_declined_share_list": "Der Benutzer lehnte es ab, die Liste zu teilen"
+ "confirm_join_group": "bestätigen Sie, sich der Gruppe anzuschließen:",
+ "include_data_decrypt": "bitte geben Sie Daten zum Entschlüsseln ein",
+ "include_data_encrypt": "bitte geben Sie Daten zum Verschlüsseln ein",
+ "max_retry_transaction": "max -Wiederholungen erreichten. Transaktion überspringen.",
+ "no_action_public_node": "diese Aktion kann nicht über einen öffentlichen Knoten durchgeführt werden",
+ "private_service": "bitte nutzen Sie einen privaten Service",
+ "provide_group_id": "bitte geben Sie eine GroupID an",
+ "read_transaction_carefully": "lesen Sie die Transaktion sorgfältig durch, bevor Sie akzeptieren!",
+ "user_declined_add_list": "der Benutzer lehnte es ab, zur Liste hinzugefügt zu werden",
+ "user_declined_delete_from_list": "der Benutzer lehnte es ab, aus der Liste zu löschen",
+ "user_declined_delete_hosted_resources": "der Benutzer lehnte ab löschte gehostete Ressourcen",
+ "user_declined_join": "der Benutzer lehnte es ab, sich der Gruppe anzuschließen",
+ "user_declined_list": "der Benutzer lehnte es ab, eine Liste der gehosteten Ressourcen zu erhalten",
+ "user_declined_request": "der Benutzer lehnte die Anfrage ab",
+ "user_declined_save_file": "der Benutzer lehnte es ab, Datei zu speichern",
+ "user_declined_send_message": "der Benutzer lehnte es ab, eine Nachricht zu senden",
+ "user_declined_share_list": "der Benutzer lehnte es ab, die Liste zu teilen"
}
},
"name": "name: {{ name }}",
"option": "option: {{ option }}",
"options": "options: {{ optionList }}",
"permission": {
- "access_list": "Geben Sie dieser Bewerbung Erlaubnis, auf die Liste zuzugreifen?",
+ "access_list": "geben Sie dieser Bewerbung Erlaubnis, auf die Liste zuzugreifen?",
"add_admin": "do you give this application permission to add user {{ invitee }} as an admin?",
"all_item_list": "do you give this application permission to add the following to the list {{ name }}:",
- "authenticate": "Geben Sie diese Bewerbung Erlaubnis zur Authentifizierung?",
+ "authenticate": "geben Sie diese Bewerbung Erlaubnis zur Authentifizierung?",
"ban": "do you give this application permission to ban {{ partecipant }} from the group?",
"buy_name_detail": "buying {{ name }} for {{ price }} QORT",
- "buy_name": "Geben Sie dieser Bewerbung Erlaubnis, einen Namen zu kaufen?",
+ "buy_name": "geben Sie dieser Bewerbung Erlaubnis, einen Namen zu kaufen?",
"buy_order_fee_estimation_one": "this fee is an estimate based on {{ quantity }} order, assuming a 300-byte size at a rate of {{ fee }} {{ ticker }} per KB.",
"buy_order_fee_estimation_other": "this fee is an estimate based on {{ quantity }} orders, assuming a 300-byte size at a rate of {{ fee }} {{ ticker }} per KB.",
"buy_order_per_kb": "{{ fee }} {{ ticker }} per kb",
"buy_order_quantity_one": "{{ quantity }} buy order",
"buy_order_quantity_other": "{{ quantity }} buy orders",
"buy_order_ticker": "{{ qort_amount }} QORT for {{ foreign_amount }} {{ ticker }}",
- "buy_order": "Geben Sie dieser Bewerbung die Erlaubnis zur Durchführung einer Kaufbestellung?",
+ "buy_order": "geben Sie dieser Bewerbung die Erlaubnis zur Durchführung einer Kaufbestellung?",
"cancel_ban": "do you give this application permission to cancel the group ban for user {{ partecipant }}?",
"cancel_group_invite": "do you give this application permission to cancel the group invite for {{ invitee }}?",
- "cancel_sell_order": "Geben Sie dieser Bewerbung die Erlaubnis zur Ausführung: Stornieren Sie eine Verkaufsbestellung?",
- "create_group": "Geben Sie dieser Bewerbung Erlaubnis, eine Gruppe zu erstellen?",
+ "cancel_sell_order": "geben Sie dieser Bewerbung die Erlaubnis zur Ausführung: Stornieren Sie eine Verkaufsbestellung?",
+ "create_group": "geben Sie dieser Bewerbung Erlaubnis, eine Gruppe zu erstellen?",
"delete_hosts_resources": "do you give this application permission to delete {{ size }} hosted resources?",
"fetch_balance": "do you give this application permission to fetch your {{ coin }} balance",
- "get_wallet_info": "Geben Sie dieser Bewerbung Erlaubnis, um Ihre Brieftascheninformationen zu erhalten?",
- "get_wallet_transactions": "Geben Sie dieser Bewerbung Erlaubnis, Ihre Brieftaschentransaktionen abzurufen?",
+ "get_wallet_info": "geben Sie dieser Bewerbung Erlaubnis, um Ihre Brieftascheninformationen zu erhalten?",
+ "get_wallet_transactions": "geben Sie dieser Bewerbung Erlaubnis, Ihre Brieftaschentransaktionen abzurufen?",
"invite": "do you give this application permission to invite {{ invitee }}?",
"kick": "do you give this application permission to kick {{ partecipant }} from the group?",
- "leave_group": "Geben Sie dieser Bewerbung Erlaubnis, die folgende Gruppe zu verlassen?",
- "list_hosted_data": "Geben Sie dieser Bewerbung die Erlaubnis, eine Liste Ihrer gehosteten Daten zu erhalten?",
+ "leave_group": "geben Sie dieser Bewerbung Erlaubnis, die folgende Gruppe zu verlassen?",
+ "list_hosted_data": "geben Sie dieser Bewerbung die Erlaubnis, eine Liste Ihrer gehosteten Daten zu erhalten?",
"order_detail": "{{ qort_amount }} QORT for {{ foreign_amount }} {{ ticker }}",
- "pay_publish": "Geben Sie dieser Bewerbung die Erlaubnis, die folgenden Zahlungen und Veröffentlichungen zu leisten?",
+ "pay_publish": "geben Sie dieser Bewerbung die Erlaubnis, die folgenden Zahlungen und Veröffentlichungen zu leisten?",
"perform_admin_action_with_value": "with value: {{ value }}",
"perform_admin_action": "do you give this application permission to perform the admin action: {{ type }}",
- "publish_qdn": "Geben Sie diese Bewerbung Erlaubnis zur Veröffentlichung an QDN?",
- "register_name": "Geben Sie dieser Bewerbung die Erlaubnis, diesen Namen zu registrieren?",
+ "publish_qdn": "geben Sie diese Bewerbung Erlaubnis zur Veröffentlichung an QDN?",
+ "register_name": "geben Sie dieser Bewerbung die Erlaubnis, diesen Namen zu registrieren?",
"remove_admin": "do you give this application permission to remove user {{ partecipant }} as an admin?",
"remove_from_list": "do you give this application permission to remove the following from the list {{ name }}:",
- "sell_name_cancel": "Geben Sie dieser Bewerbung Erlaubnis, den Verkauf eines Namens zu stornieren?",
+ "sell_name_cancel": "geben Sie dieser Bewerbung Erlaubnis, den Verkauf eines Namens zu stornieren?",
"sell_name_transaction_detail": "sell {{ name }} for {{ price }} QORT",
- "sell_name_transaction": "Geben Sie dieser Bewerbung Erlaubnis, eine Verkaufsname -Transaktion zu erstellen?",
- "sell_order": "Geben Sie dieser Bewerbung Erlaubnis zur Ausführung einer Verkaufsbestellung?",
- "send_chat_message": "Geben Sie diese Bewerbung Erlaubnis, diese Chat -Nachricht zu senden?",
- "send_coins": "Geben Sie diese Bewerbung Erlaubnis zum Senden von Münzen?",
- "server_add": "Geben Sie dieser Anwendungsberechtigung, einen Server hinzuzufügen?",
- "server_remove": "Geben Sie dieser Anwendungsberechtigung, um einen Server zu entfernen?",
- "set_current_server": "Geben Sie dieser Anwendungsberechtigung, um den aktuellen Server festzulegen?",
- "sign_fee": "Geben Sie diese Bewerbung Erlaubnis, die erforderlichen Gebühren für alle Ihre Handelsangebote zu unterschreiben?",
- "sign_process_transaction": "Geben Sie dieser Bewerbung die Erlaubnis, eine Transaktion zu unterschreiben und zu verarbeiten?",
- "sign_transaction": "Geben Sie dieser Bewerbung Erlaubnis, eine Transaktion zu unterschreiben?",
- "transfer_asset": "Geben Sie diese Bewerbung Erlaubnis zur Übertragung des folgenden Vermögenswerts?",
- "update_foreign_fee": "Geben Sie dieser Bewerbung Erlaubnis, ausländische Gebühren auf Ihrem Knoten zu aktualisieren?",
+ "sell_name_transaction": "geben Sie dieser Bewerbung Erlaubnis, eine Verkaufsname -Transaktion zu erstellen?",
+ "sell_order": "geben Sie dieser Bewerbung Erlaubnis zur Ausführung einer Verkaufsbestellung?",
+ "send_chat_message": "geben Sie diese Bewerbung Erlaubnis, diese Chat -Nachricht zu senden?",
+ "send_coins": "geben Sie diese Bewerbung Erlaubnis zum Senden von Münzen?",
+ "server_add": "geben Sie dieser Anwendungsberechtigung, einen Server hinzuzufügen?",
+ "server_remove": "geben Sie dieser Anwendungsberechtigung, um einen Server zu entfernen?",
+ "set_current_server": "geben Sie dieser Anwendungsberechtigung, um den aktuellen Server festzulegen?",
+ "sign_fee": "geben Sie diese Bewerbung Erlaubnis, die erforderlichen Gebühren für alle Ihre Handelsangebote zu unterschreiben?",
+ "sign_process_transaction": "geben Sie dieser Bewerbung die Erlaubnis, eine Transaktion zu unterschreiben und zu verarbeiten?",
+ "sign_transaction": "geben Sie dieser Bewerbung Erlaubnis, eine Transaktion zu unterschreiben?",
+ "transfer_asset": "geben Sie diese Bewerbung Erlaubnis zur Übertragung des folgenden Vermögenswerts?",
+ "update_foreign_fee": "geben Sie dieser Bewerbung Erlaubnis, ausländische Gebühren auf Ihrem Knoten zu aktualisieren?",
"update_group_detail": "new owner: {{ owner }}",
- "update_group": "Geben Sie dieser Bewerbung die Erlaubnis, diese Gruppe zu aktualisieren?"
+ "update_group": "geben Sie dieser Bewerbung die Erlaubnis, diese Gruppe zu aktualisieren?"
},
"poll": "poll: {{ name }}",
- "provide_recipient_group_id": "Bitte geben Sie einen Empfänger oder eine Gruppe an",
- "request_create_poll": "Sie bitten um die Erstellung der folgenden Umfrage:",
+ "provide_recipient_group_id": "bitte geben Sie einen Empfänger oder eine Gruppe an",
+ "request_create_poll": "sie bitten um die Erstellung der folgenden Umfrage:",
"request_vote_poll": "you are being requested to vote on the poll below:",
"sats_per_kb": "{{ amount }} sats per KB",
"sats": "{{ amount }} sats",
@@ -189,4 +189,4 @@
"total_locking_fee": "total Locking Fee:",
"total_unlocking_fee": "total Unlocking Fee:",
"value": "value: {{ value }}"
-}
\ No newline at end of file
+}
diff --git a/src/i18n/locales/de/tutorial.json b/src/i18n/locales/de/tutorial.json
index d423f4b..d2526b5 100644
--- a/src/i18n/locales/de/tutorial.json
+++ b/src/i18n/locales/de/tutorial.json
@@ -4,7 +4,7 @@
"3_groups": "3. Qortalgruppen",
"4_obtain_qort": "4. Qort erhalten",
"account_creation": "Kontoerstellung",
- "important_info": "Wichtige Informationen",
+ "important_info": "wichtige Informationen",
"apps": {
"dashboard": "1. Apps Dashboard",
"navigation": "2. Apps Navigation"
@@ -12,10 +12,10 @@
"initial": {
"recommended_qort_qty": "have at least {{ quantity }} QORT in your wallet",
"explore": "erkunden",
- "general_chat": "Allgemeiner Chat",
- "getting_started": "Erste Schritte",
- "register_name": "Registrieren Sie einen Namen",
- "see_apps": "Siehe Apps",
- "trade_qort": "Handel Qort"
+ "general_chat": "allgemeiner Chat",
+ "getting_started": "erste Schritte",
+ "register_name": "registrieren Sie einen Namen",
+ "see_apps": "siehe Apps",
+ "trade_qort": "handel Qort"
}
}
diff --git a/src/i18n/locales/en/core.json b/src/i18n/locales/en/core.json
index 8270fe0..aa6f209 100644
--- a/src/i18n/locales/en/core.json
+++ b/src/i18n/locales/en/core.json
@@ -90,7 +90,7 @@
"start_minting": "start minting",
"start_typing": "start typing here...",
"trade_qort": "trade QORT",
- "transfer_qort": "Transfer QORT",
+ "transfer_qort": "transfer QORT",
"unpin": "unpin",
"unpin_app": "unpin app",
"unpin_from_dashboard": "unpin from dashboard",
@@ -109,6 +109,7 @@
"app": "app",
"app_other": "apps",
"app_name": "app name",
+ "app_private": "private",
"app_service_type": "app service type",
"apps_dashboard": "apps Dashboard",
"apps_official": "official Apps",
@@ -131,7 +132,7 @@
"dev_mode": "dev Mode",
"domain": "domain",
"ui": {
- "version": "UI version"
+ "version": "uI version"
},
"count": {
"none": "none",
@@ -157,7 +158,6 @@
"list": {
"bans": "list of bans",
"groups": "list of groups",
- "invite": "invite list",
"invites": "list of invites",
"join_request": "join request list",
"member": "member list",
@@ -282,7 +282,7 @@
"updating": "updating"
},
"message": "message",
- "promotion_text": "Promotion text",
+ "promotion_text": "promotion text",
"question": {
"accept_vote_on_poll": "do you accept this VOTE_ON_POLL transaction? POLLS are public!",
"logout": "are you sure you would like to logout?",
@@ -311,7 +311,7 @@
"published": "successfully published. Please wait a couple minutes for the network to propogate the changes.",
"published_qdn": "successfully published to QDN",
"rated_app": "successfully rated. Please wait a couple minutes for the network to propogate the changes.",
- "request_read": "I have read this request",
+ "request_read": "i have read this request",
"transfer": "the transfer was succesful!",
"voted": "successfully voted. Please wait a couple minutes for the network to propogate the changes."
}
@@ -323,6 +323,7 @@
"none": "none",
"note": "note",
"option": "option",
+ "option_no": "no options",
"option_other": "options",
"page": {
"last": "last",
diff --git a/src/i18n/locales/en/group.json b/src/i18n/locales/en/group.json
index d30122a..34731c1 100644
--- a/src/i18n/locales/en/group.json
+++ b/src/i18n/locales/en/group.json
@@ -29,10 +29,9 @@
"visit_q_mintership": "visit Q-Mintership"
},
"advanced_options": "advanced options",
- "ban_list": "ban list",
"block_delay": {
- "minimum": "Minimum Block delay",
- "maximum": "Maximum Block delay"
+ "minimum": "minimum Block delay",
+ "maximum": "maximum Block delay"
},
"group": {
"approval_threshold": "group Approval Threshold",
@@ -93,7 +92,7 @@
"minting_keys_per_node": "only 2 minting keys are allowed per node. Please remove one if you would like to mint with this account.",
"minting_keys_per_node_different": "only 2 minting keys are allowed per node. Please remove one if you would like to add a different account.",
"next_level": "blocks remaining until next level:",
- "node_minting": "This node is minting:",
+ "node_minting": "this node is minting:",
"node_minting_account": "node's minting accounts",
"node_minting_key": "you currently have a minting key for this account attached to this node",
"no_announcement": "no announcements",
diff --git a/src/i18n/locales/en/question.json b/src/i18n/locales/en/question.json
index 3ef124c..700c1ad 100644
--- a/src/i18n/locales/en/question.json
+++ b/src/i18n/locales/en/question.json
@@ -111,7 +111,7 @@
"provide_group_id": "please provide a groupId",
"read_transaction_carefully": "read the transaction carefully before accepting!",
"user_declined_add_list": "user declined add to list",
- "user_declined_delete_from_list": "User declined delete from list",
+ "user_declined_delete_from_list": "user declined delete from list",
"user_declined_delete_hosted_resources": "user declined delete hosted resources",
"user_declined_join": "user declined to join group",
"user_declined_list": "user declined to get list of hosted resources",
diff --git a/src/i18n/locales/es/auth.json b/src/i18n/locales/es/auth.json
index 01bc74d..5105809 100644
--- a/src/i18n/locales/es/auth.json
+++ b/src/i18n/locales/es/auth.json
@@ -1,50 +1,50 @@
{
"account": {
- "your": "Tu cuenta",
+ "your": "tu cuenta",
"account_many": "cuentas",
"account_one": "cuenta",
"selected": "cuenta seleccionada"
},
"action": {
"add": {
- "account": "Agregar cuenta",
- "seed_phrase": "Agregar frase de semillas"
+ "account": "agregar cuenta",
+ "seed_phrase": "agregar frase de semillas"
},
"authenticate": "autenticar",
"block": "bloquear",
"block_all": "bloquear todo",
- "block_data": "Bloquear datos de QDN",
+ "block_data": "bloquear datos de QDN",
"block_name": "nombre de bloqueo",
- "block_txs": "Bloquear TSX",
+ "block_txs": "bloquear TSX",
"fetch_names": "buscar nombres",
"copy_address": "dirección de copia",
"create_account": "crear una cuenta",
"create_qortal_account": "create your Qortal account by clicking NEXT below.",
- "choose_password": "Elija una nueva contraseña",
+ "choose_password": "elija una nueva contraseña",
"download_account": "cuenta de descarga",
- "enter_amount": "Ingrese una cantidad mayor que 0",
- "enter_recipient": "Por favor ingrese a un destinatario",
- "enter_wallet_password": "Ingrese su contraseña de billetera",
+ "enter_amount": "ingrese una cantidad mayor que 0",
+ "enter_recipient": "por favor ingrese a un destinatario",
+ "enter_wallet_password": "ingrese su contraseña de billetera",
"export_seedphrase": "exportar frase de semillas",
- "insert_name_address": "Inserte un nombre o dirección",
- "publish_admin_secret_key": "Publicar la clave secreta de administración",
- "publish_group_secret_key": "Publicar la clave secreta del grupo",
- "reencrypt_key": "Reencietar la tecla",
+ "insert_name_address": "inserte un nombre o dirección",
+ "publish_admin_secret_key": "publicar la clave secreta de administración",
+ "publish_group_secret_key": "publicar la clave secreta del grupo",
+ "reencrypt_key": "reencietar la tecla",
"return_to_list": "volver a la lista",
- "setup_qortal_account": "Configure su cuenta de Qortal",
+ "setup_qortal_account": "configure su cuenta de Qortal",
"unblock": "desatascar",
"unblock_name": "nombre de desbloqueo"
},
- "address": "DIRECCIÓN",
+ "address": "dIRECCIÓN",
"address_name": "dirección o nombre",
"advanced_users": "para usuarios avanzados",
"apikey": {
- "alternative": "Alternativa: Archivo Seleccionar",
- "change": "Cambiar apikey",
- "enter": "Ingresa apikey",
+ "alternative": "alternativa: Archivo Seleccionar",
+ "change": "cambiar apikey",
+ "enter": "ingresa apikey",
"import": "importar apikey",
- "key": "Llave de API",
- "select_valid": "Seleccione un apikey válido"
+ "key": "llave de API",
+ "select_valid": "seleccione un apikey válido"
},
"authentication": "autenticación",
"blocked_users": "usuarios bloqueados",
@@ -52,86 +52,86 @@
"message": {
"error": {
"account_creation": "no pudo crear cuenta.",
- "address_not_existing": "La dirección no existe en blockchain",
- "block_user": "No se puede bloquear el usuario",
- "create_simmetric_key": "No se puede crear una clave simétrica",
+ "address_not_existing": "la dirección no existe en blockchain",
+ "block_user": "no se puede bloquear el usuario",
+ "create_simmetric_key": "no se puede crear una clave simétrica",
"decrypt_data": "no pudo descifrar datos",
- "decrypt": "Incifto de descifrar",
- "encrypt_content": "No se puede cifrar contenido",
- "fetch_user_account": "No se puede obtener una cuenta de usuario",
+ "decrypt": "incifto de descifrar",
+ "encrypt_content": "no se puede cifrar contenido",
+ "fetch_user_account": "no se puede obtener una cuenta de usuario",
"field_not_found_json": "{{ field }} not found in JSON",
- "find_secret_key": "No puedo encontrar correcto secretkey",
+ "find_secret_key": "no puedo encontrar correcto secretkey",
"incorrect_password": "contraseña incorrecta",
"invalid_qortal_link": "enlace Qortal no válido",
- "invalid_secret_key": "SecretKey no es válido",
- "invalid_uint8": "El Uint8ArrayData que ha enviado no es válido",
+ "invalid_secret_key": "secretKey no es válido",
+ "invalid_uint8": "el Uint8ArrayData que ha enviado no es válido",
"name_not_existing": "el nombre no existe",
- "name_not_registered": "Nombre no registrado",
- "read_blob_base64": "No se pudo leer el blob como una cadena codificada de base64",
- "reencrypt_secret_key": "Incapaz de volver a encriptar la clave secreta",
- "set_apikey": "No se pudo establecer la tecla API:"
+ "name_not_registered": "nombre no registrado",
+ "read_blob_base64": "no se pudo leer el blob como una cadena codificada de base64",
+ "reencrypt_secret_key": "incapaz de volver a encriptar la clave secreta",
+ "set_apikey": "no se pudo establecer la tecla API:"
},
"generic": {
- "blocked_addresses": "Direcciones bloqueadas: procesamiento de bloques de TXS",
- "blocked_names": "Nombres bloqueados para QDN",
+ "blocked_addresses": "direcciones bloqueadas: procesamiento de bloques de TXS",
+ "blocked_names": "nombres bloqueados para QDN",
"blocking": "blocking {{ name }}",
- "choose_block": "Elija 'Bloquear TXS' o 'Todo' para bloquear los mensajes de chat",
- "congrats_setup": "Felicidades, ¡estás listo!",
- "decide_block": "Decide qué bloquear",
+ "choose_block": "elija 'Bloquear TXS' o 'Todo' para bloquear los mensajes de chat",
+ "congrats_setup": "felicidades, ¡estás listo!",
+ "decide_block": "decide qué bloquear",
"downloading_encryption_keys": "downloading encryption keys",
"name_address": "nombre o dirección",
- "no_account": "No hay cuentas guardadas",
- "no_minimum_length": "No hay requisito de longitud mínima",
- "no_secret_key_published": "No hay clave secreta publicada todavía",
- "fetching_admin_secret_key": "Llave secreta de los administradores de administradores",
- "fetching_group_secret_key": "Obtener publicaciones de Key Secret Group Secret",
+ "no_account": "no hay cuentas guardadas",
+ "no_minimum_length": "no hay requisito de longitud mínima",
+ "no_secret_key_published": "no hay clave secreta publicada todavía",
+ "fetching_admin_secret_key": "llave secreta de los administradores de administradores",
+ "fetching_group_secret_key": "obtener publicaciones de Key Secret Group Secret",
"last_encryption_date": "last encryption date: {{ date }} by {{ name }}",
"locating_encryption_keys": "locating encryption keys",
- "keep_secure": "Mantenga su archivo de cuenta seguro",
- "publishing_key": "Recordatorio: después de publicar la llave, tardará un par de minutos en aparecer. Por favor, solo espera.",
+ "keep_secure": "mantenga su archivo de cuenta seguro",
+ "publishing_key": "recordatorio: después de publicar la llave, tardará un par de minutos en aparecer. Por favor, solo espera.",
"seedphrase_notice": "a SEEDPHRASE has been randomly generated in the background.",
- "turn_local_node": "Encienda su nodo local",
- "type_seed": "Escriba o pegue en su frase de semillas",
- "your_accounts": "Tus cuentas guardadas"
+ "turn_local_node": "encienda su nodo local",
+ "type_seed": "escriba o pegue en su frase de semillas",
+ "your_accounts": "tus cuentas guardadas"
},
"success": {
- "reencrypted_secret_key": "Clave secreta reinscritada con éxito. Puede tomar un par de minutos para que los cambios se propagen. Actualice el grupo en 5 minutos."
+ "reencrypted_secret_key": "clave secreta reinscritada con éxito. Puede tomar un par de minutos para que los cambios se propagen. Actualice el grupo en 5 minutos."
}
},
"node": {
- "choose": "Elija el nodo personalizado",
+ "choose": "elija el nodo personalizado",
"custom_many": "nodos personalizados",
- "use_custom": "Usar nodo personalizado",
- "use_local": "Use el nodo local",
- "using": "Usando nodo",
- "using_public": "Usando el nodo público",
+ "use_custom": "usar nodo personalizado",
+ "use_local": "use el nodo local",
+ "using": "usando nodo",
+ "using_public": "usando el nodo público",
"using_public_gateway": "using public node: {{ gateway }}"
},
"note": "nota",
"password": "contraseña",
"password_confirmation": "confirmar Contraseña",
"seed_phrase": "frase de semillas",
- "seed_your": "Tu frase de semillas",
+ "seed_your": "tu frase de semillas",
"tips": {
- "additional_wallet": "Use esta opción para conectar las billeteras de Qortal adicionales que ya ha realizado para iniciar sesión con ellas después. Necesitará acceso a su archivo JSON de copia de seguridad para hacerlo.",
- "digital_id": "Su billetera es como su ID digital en Qortal, y es cómo iniciará sesión en la interfaz de usuario de Qortal. Sostiene su dirección pública y el nombre Qortal que eventualmente elegirá. Cada transacción que realice está vinculada a su ID, y aquí es donde administra todos sus Qort y otras criptomonedas comercializables en Qortal.",
+ "additional_wallet": "use esta opción para conectar las billeteras de Qortal adicionales que ya ha realizado para iniciar sesión con ellas después. Necesitará acceso a su archivo JSON de copia de seguridad para hacerlo.",
+ "digital_id": "su billetera es como su ID digital en Qortal, y es cómo iniciará sesión en la interfaz de usuario de Qortal. Sostiene su dirección pública y el nombre Qortal que eventualmente elegirá. Cada transacción que realice está vinculada a su ID, y aquí es donde administra todos sus Qort y otras criptomonedas comercializables en Qortal.",
"existing_account": "¿Ya tienes una cuenta Qortal? Ingrese su frase de copia de seguridad secreta aquí para acceder a ella. Esta frase es una de las formas de recuperar su cuenta.",
- "key_encrypt_admin": "Esta clave es cifrar el contenido relacionado con el administrador. Solo los administradores verían contenido encriptado con él.",
- "key_encrypt_group": "Esta clave es cifrar contenido relacionado con el grupo. Este es el único utilizado en esta interfaz de usuario a partir de ahora. Todos los miembros del grupo podrán ver contenido encriptado con esta clave.",
- "new_account": "Crear una cuenta significa crear una nueva billetera e ID digital para comenzar a usar Qortal. Una vez que haya hecho su cuenta, puede comenzar a hacer cosas como obtener algo de Qort, comprar un nombre y avatar, publicar videos y blogs, y mucho más.",
+ "key_encrypt_admin": "esta clave es cifrar el contenido relacionado con el administrador. Solo los administradores verían contenido encriptado con él.",
+ "key_encrypt_group": "esta clave es cifrar contenido relacionado con el grupo. Este es el único utilizado en esta interfaz de usuario a partir de ahora. Todos los miembros del grupo podrán ver contenido encriptado con esta clave.",
+ "new_account": "crear una cuenta significa crear una nueva billetera e ID digital para comenzar a usar Qortal. Una vez que haya hecho su cuenta, puede comenzar a hacer cosas como obtener algo de Qort, comprar un nombre y avatar, publicar videos y blogs, y mucho más.",
"new_users": "¡Los nuevos usuarios comienzan aquí!",
"safe_place": "¡Guarde su cuenta en un lugar donde la recordará!",
- "view_seedphrase": "Si desea ver la Phrause de semillas, haga clic en la palabra 'Semilla Phrase' en este texto. Las frases de semillas se utilizan para generar la clave privada para su cuenta de Qortal. Para la seguridad de forma predeterminada, las frases de semillas no se muestran a menos que se elijan específicamente.",
- "wallet_secure": "Mantenga su archivo de billetera seguro."
+ "view_seedphrase": "si desea ver la Phrause de semillas, haga clic en la palabra 'Semilla Phrase' en este texto. Las frases de semillas se utilizan para generar la clave privada para su cuenta de Qortal. Para la seguridad de forma predeterminada, las frases de semillas no se muestran a menos que se elijan específicamente.",
+ "wallet_secure": "mantenga su archivo de billetera seguro."
},
"wallet": {
- "password_confirmation": "Confirmar contraseña de billetera",
+ "password_confirmation": "confirmar contraseña de billetera",
"password": "contraseña de billetera",
- "keep_password": "Mantenga la contraseña actual",
- "new_password": "Nueva contraseña",
+ "keep_password": "mantenga la contraseña actual",
+ "new_password": "nueva contraseña",
"error": {
- "missing_new_password": "Ingrese una nueva contraseña",
- "missing_password": "Ingrese su contraseña"
+ "missing_new_password": "ingrese una nueva contraseña",
+ "missing_password": "ingrese su contraseña"
}
},
"welcome": "bienvenido"
diff --git a/src/i18n/locales/es/core.json b/src/i18n/locales/es/core.json
index ef5b4cb..d56577d 100644
--- a/src/i18n/locales/es/core.json
+++ b/src/i18n/locales/es/core.json
@@ -4,31 +4,31 @@
"access": "acceso",
"access_app": "aplicación de acceso",
"add": "agregar",
- "add_custom_framework": "Agregar marco personalizado",
- "add_reaction": "Agregar reacción",
- "add_theme": "Agregar tema",
+ "add_custom_framework": "agregar marco personalizado",
+ "add_reaction": "agregar reacción",
+ "add_theme": "agregar tema",
"backup_account": "cuenta de respaldo",
"backup_wallet": "billetera de respaldo",
- "cancel": "Cancelar",
- "cancel_invitation": "Cancelar invitación",
+ "cancel": "cancelar",
+ "cancel_invitation": "cancelar invitación",
"change": "cambiar",
- "change_avatar": "Cambiar avatar",
- "change_file": "Cambiar archivo",
- "change_language": "Cambiar lenguaje",
+ "change_avatar": "cambiar avatar",
+ "change_file": "cambiar archivo",
+ "change_language": "cambiar lenguaje",
"choose": "elegir",
- "choose_file": "Elija archivo",
- "choose_image": "Elija imagen",
- "choose_logo": "Elija un logotipo",
- "choose_name": "Elige un nombre",
+ "choose_file": "elija archivo",
+ "choose_image": "elija imagen",
+ "choose_logo": "elija un logotipo",
+ "choose_name": "elige un nombre",
"close": "cerca",
- "close_chat": "Cerrar chat directo",
+ "close_chat": "cerrar chat directo",
"continue": "continuar",
- "continue_logout": "Continuar inicio de sesión",
+ "continue_logout": "continuar inicio de sesión",
"copy_link": "enlace de copia",
- "create_apps": "Crear aplicaciones",
- "create_file": "Crear archivo",
- "create_transaction": "Crear transacciones en la cadena de bloques Qortal",
- "create_thread": "Crear hilo",
+ "create_apps": "crear aplicaciones",
+ "create_file": "crear archivo",
+ "create_transaction": "crear transacciones en la cadena de bloques Qortal",
+ "create_thread": "crear hilo",
"decline": "rechazar",
"decrypt": "descifrar",
"disable_enter": "deshabilitar Enter",
@@ -36,19 +36,19 @@
"download_file": "descargar archivo",
"edit": "editar",
"edit_theme": "editar tema",
- "enable_dev_mode": "Habilitar el modo de desarrollo",
- "enter_name": "Ingrese un nombre",
+ "enable_dev_mode": "habilitar el modo de desarrollo",
+ "enter_name": "ingrese un nombre",
"export": "exportar",
- "get_qort": "Obtener Qort",
- "get_qort_trade": "Obtenga Qort en Q-Trade",
+ "get_qort": "obtener Qort",
+ "get_qort_trade": "obtenga Qort en Q-Trade",
"hide": "esconder",
"import": "importar",
"import_theme": "tema de importación",
"invite": "invitar",
- "invite_member": "Invitar a un nuevo miembro",
+ "invite_member": "invitar a un nuevo miembro",
"join": "unirse",
"leave_comment": "hacer comentarios",
- "load_announcements": "Cargar anuncios más antiguos",
+ "load_announcements": "cargar anuncios más antiguos",
"login": "acceso",
"logout": "cierre de sesión",
"new": {
@@ -61,39 +61,39 @@
"open": "abierto",
"pin": "alfiler",
"pin_app": "aplicación PIN",
- "pin_from_dashboard": "Pin del tablero",
+ "pin_from_dashboard": "pin del tablero",
"post": "correo",
"post_message": "mensaje de publicación",
"publish": "publicar",
- "publish_app": "Publica tu aplicación",
+ "publish_app": "publica tu aplicación",
"publish_comment": "publicar comentario",
- "register_name": "Nombre de registro",
+ "register_name": "nombre de registro",
"remove": "eliminar",
"remove_reaction": "eliminar la reacción",
- "return_apps_dashboard": "Volver al tablero de aplicaciones",
+ "return_apps_dashboard": "volver al tablero de aplicaciones",
"save": "ahorrar",
- "save_disk": "Guardar en el disco",
+ "save_disk": "guardar en el disco",
"search": "buscar",
- "search_apps": "Buscar aplicaciones",
+ "search_apps": "buscar aplicaciones",
"search_groups": "buscar grupos",
- "search_chat_text": "Search Chat Text",
- "select_app_type": "Seleccionar el tipo de aplicación",
- "select_category": "Seleccionar categoría",
- "select_name_app": "Seleccionar nombre/aplicación",
+ "search_chat_text": "search Chat Text",
+ "select_app_type": "seleccionar el tipo de aplicación",
+ "select_category": "seleccionar categoría",
+ "select_name_app": "seleccionar nombre/aplicación",
"send": "enviar",
- "send_qort": "Enviar Qort",
+ "send_qort": "enviar Qort",
"set_avatar": "establecer avatar",
"show": "espectáculo",
"show_poll": "encuesta",
- "start_minting": "Empiece a acuñar",
- "start_typing": "Empiece a escribir aquí ...",
+ "start_minting": "empiece a acuñar",
+ "start_typing": "empiece a escribir aquí ...",
"trade_qort": "comercio Qort",
- "transfer_qort": "Transferir Qort",
+ "transfer_qort": "transferir Qort",
"unpin": "desprender",
- "unpin_app": "Aplicación de desgaste",
- "unpin_from_dashboard": "Desvinar del tablero",
+ "unpin_app": "aplicación de desgaste",
+ "unpin_from_dashboard": "cesvinar del tablero",
"update": "actualizar",
- "update_app": "Actualiza tu aplicación",
+ "update_app": "actualiza tu aplicación",
"vote": "votar"
},
"admin": "administración",
@@ -102,16 +102,17 @@
"amount": "cantidad",
"announcement": "anuncio",
"announcement_other": "anuncios",
- "api": "API",
+ "api": "aPI",
"app": "aplicación",
"app_other": "aplicaciones",
"app_name": "nombre de la aplicación",
- "app_service_type": "Tipo de servicio de aplicaciones",
- "apps_dashboard": "Panel de aplicaciones",
+ "app_private": "privada",
+ "app_service_type": "tipo de servicio de aplicaciones",
+ "apps_dashboard": "panel de aplicaciones",
"apps_official": "aplicaciones oficiales",
"attachment": "adjunto",
"balance": "balance:",
- "basic_tabs_example": "Ejemplo de pestañas básicas",
+ "basic_tabs_example": "ejemplo de pestañas básicas",
"category": "categoría",
"category_other": "categorías",
"chat": "charlar",
@@ -128,7 +129,7 @@
"dev_mode": "modo de desarrollo",
"domain": "dominio",
"ui": {
- "version": "Versión de interfaz de usuario"
+ "version": "versión de interfaz de usuario"
},
"count": {
"none": "ninguno",
@@ -137,14 +138,14 @@
"description": "descripción",
"devmode_apps": "aplicaciones en modo de desarrollo",
"directory": "directorio",
- "downloading_qdn": "Descarga de QDN",
+ "downloading_qdn": "cescarga de QDN",
"fee": {
"payment": "tarifa de pago",
"publish": "publicar tarifa"
},
"for": "para",
"general": "general",
- "general_settings": "Configuración general",
+ "general_settings": "configuración general",
"home": "hogar",
"identifier": "identificador",
"image_embed": "inserción de la imagen",
@@ -152,145 +153,144 @@
"level": "nivel",
"library": "biblioteca",
"list": {
- "bans": "Lista de prohibiciones",
- "groups": "Lista de grupos",
- "invite": "lista de invitaciones",
- "invites": "Lista de invitaciones",
- "join_request": "Lista de solicitudes de unión",
+ "bans": "lista de prohibiciones",
+ "groups": "lista de grupos",
+ "invites": "lista de invitaciones",
+ "join_request": "lista de solicitudes de unión",
"member": "lista de miembros",
- "members": "Lista de miembros"
+ "members": "lista de miembros"
},
"loading": {
- "announcements": "Cargando anuncios",
+ "announcements": "cargando anuncios",
"generic": "cargando...",
- "chat": "Cargando chat ... por favor espera.",
- "comments": "Cargando comentarios ... por favor espere.",
- "posts": "Cargando publicaciones ... por favor espere."
+ "chat": "cargando chat ... por favor espera.",
+ "comments": "cargando comentarios ... por favor espere.",
+ "posts": "cargando publicaciones ... por favor espere."
},
"member": "miembro",
"member_other": "miembros",
- "message_us": "Envíenos un mensaje en Telegram o Discord si necesita 4 Qort para comenzar a chatear sin limitaciones",
+ "message_us": "envíenos un mensaje en Telegram o Discord si necesita 4 Qort para comenzar a chatear sin limitaciones",
"message": {
"error": {
- "address_not_found": "No se encontró su dirección",
- "app_need_name": "Tu aplicación necesita un nombre",
- "build_app": "Incapaz de crear una aplicación privada",
- "decrypt_app": "No se puede descifrar la aplicación privada '",
- "download_image": "No se puede descargar la imagen. Vuelva a intentarlo más tarde haciendo clic en el botón Actualizar",
- "download_private_app": "No se puede descargar la aplicación privada",
- "encrypt_app": "No se puede cifrar la aplicación. Aplicación no publicada '",
- "fetch_app": "Incapaz de buscar la aplicación",
- "fetch_publish": "Incapaz de buscar publicar",
+ "address_not_found": "no se encontró su dirección",
+ "app_need_name": "tu aplicación necesita un nombre",
+ "build_app": "incapaz de crear una aplicación privada",
+ "decrypt_app": "no se puede descifrar la aplicación privada '",
+ "download_image": "no se puede descargar la imagen. Vuelva a intentarlo más tarde haciendo clic en el botón Actualizar",
+ "download_private_app": "no se puede descargar la aplicación privada",
+ "encrypt_app": "no se puede cifrar la aplicación. Aplicación no publicada '",
+ "fetch_app": "incapaz de buscar la aplicación",
+ "fetch_publish": "incapaz de buscar publicar",
"file_too_large": "file {{ filename }} is too large. Max size allowed is {{ size }} MB.",
- "generic": "Ocurrió un error",
- "initiate_download": "No se pudo iniciar la descarga",
+ "generic": "ocurrió un error",
+ "initiate_download": "no se pudo iniciar la descarga",
"invalid_amount": "cantidad no válida",
"invalid_base64": "datos no válidos de base64",
"invalid_embed_link": "enlace de inserción no válido",
- "invalid_image_embed_link_name": "Enlace de incrustación de imagen no válida. Falta Param.",
- "invalid_poll_embed_link_name": "Enlace de incrustación de encuesta inválida. Nombre faltante.",
+ "invalid_image_embed_link_name": "enlace de incrustación de imagen no válida. Falta Param.",
+ "invalid_poll_embed_link_name": "enlace de incrustación de encuesta inválida. Nombre faltante.",
"invalid_signature": "firma no válida",
"invalid_theme_format": "formato de tema no válido",
"invalid_zip": "zip no válido",
- "message_loading": "Error de carga de mensaje.",
+ "message_loading": "error de carga de mensaje.",
"message_size": "your message size is of {{ size }} bytes out of a maximum of {{ maximum }}",
- "minting_account_add": "No se puede agregar una cuenta de menta",
- "minting_account_remove": "No se puede eliminar la cuenta de acuñación",
+ "minting_account_add": "no se puede agregar una cuenta de menta",
+ "minting_account_remove": "no se puede eliminar la cuenta de acuñación",
"missing_fields": "missing: {{ fields }}",
"navigation_timeout": "tiempo de espera de navegación",
"network_generic": "error de red",
"password_not_matching": "¡Los campos de contraseña no coinciden!",
"password_wrong": "incapaz de autenticarse. Contraseña incorrecta",
- "publish_app": "Incapaz de publicar la aplicación",
- "publish_image": "Incapaz de publicar imagen",
+ "publish_app": "incapaz de publicar la aplicación",
+ "publish_image": "incapaz de publicar imagen",
"rate": "incapaz de calificar",
- "rating_option": "No se puede encontrar la opción de calificación",
- "save_qdn": "No se puede guardar en QDN",
- "send_failed": "No se pudo enviar",
- "update_failed": "No se pudo actualizar",
- "vote": "Incapaz de votar"
+ "rating_option": "no se puede encontrar la opción de calificación",
+ "save_qdn": "no se puede guardar en QDN",
+ "send_failed": "no se pudo enviar",
+ "update_failed": "no se pudo actualizar",
+ "vote": "incapaz de votar"
},
"generic": {
"already_voted": "ya has votado.",
"avatar_size": "{{ size }} KB max. for GIFS",
"benefits_qort": "beneficios de tener Qort",
"building": "edificio",
- "building_app": "Aplicación de construcción",
+ "building_app": "aplicación de construcción",
"created_by": "created by {{ owner }}",
"buy_order_request": "the Application
{{hostname}}
is requesting {{count}} buy order",
"buy_order_request_other": "the Application
{{hostname}}
is requesting {{count}} buy orders",
"devmode_local_node": "¡Utilice su nodo local para el modo Dev! INCOGAR y USAR NODO LOCAL.",
"downloading": "descarga",
- "downloading_decrypting_app": "Descarga y descifrado de la aplicación privada.",
+ "downloading_decrypting_app": "cescarga y descifrado de la aplicación privada.",
"edited": "editado",
"editing_message": "mensaje de edición",
"encrypted": "encriptado",
"encrypted_not": "no encriptado",
"fee_qort": "fee: {{ message }} QORT",
- "fetching_data": "Obtener datos de aplicaciones",
+ "fetching_data": "obtener datos de aplicaciones",
"foreign_fee": "foreign fee: {{ message }}",
- "get_qort_trade_portal": "Obtenga Qort usando el portal de comercio Crosschain de Qortalal",
+ "get_qort_trade_portal": "obtenga Qort usando el portal de comercio Crosschain de Qortalal",
"minimal_qort_balance": "having at least {{ quantity }} QORT in your balance (4 qort balance for chat, 1.25 for name, 0.75 for some transactions)",
"mentioned": "mencionado",
- "message_with_image": "Este mensaje ya tiene una imagen",
+ "message_with_image": "este mensaje ya tiene una imagen",
"most_recent_payment": "{{ count }} most recent payment",
"name_available": "{{ name }} is available",
- "name_benefits": "Beneficios de un nombre",
- "name_checking": "Verificar si el nombre ya existe",
- "name_preview": "Necesita un nombre para usar la vista previa",
- "name_publish": "Necesita un nombre de Qortal para publicar",
- "name_rate": "Necesitas un nombre para calificar.",
+ "name_benefits": "beneficios de un nombre",
+ "name_checking": "verificar si el nombre ya existe",
+ "name_preview": "necesita un nombre para usar la vista previa",
+ "name_publish": "necesita un nombre de Qortal para publicar",
+ "name_rate": "necesitas un nombre para calificar.",
"name_registration": "your balance is {{ balance }} QORT. A name registration requires a {{ fee }} QORT fee",
"name_unavailable": "{{ name }} is unavailable",
- "no_data_image": "No hay datos para la imagen",
+ "no_data_image": "no hay datos para la imagen",
"no_description": "sin descripción",
"no_messages": "sin mensajes",
- "no_minting_details": "No se puede ver los detalles de acuñado en la puerta de enlace",
- "no_notifications": "No hay nuevas notificaciones",
+ "no_minting_details": "no se puede ver los detalles de acuñado en la puerta de enlace",
+ "no_notifications": "no hay nuevas notificaciones",
"no_payments": "sin pagos",
- "no_pinned_changes": "Actualmente no tiene ningún cambio en sus aplicaciones fijadas",
+ "no_pinned_changes": "actualmente no tiene ningún cambio en sus aplicaciones fijadas",
"no_results": "sin resultados",
- "one_app_per_name": "Nota: Actualmente, solo se permite una aplicación y un sitio web por nombre.",
+ "one_app_per_name": "nota: Actualmente, solo se permite una aplicación y un sitio web por nombre.",
"opened": "abierto",
"overwrite_qdn": "sobrescribir a QDN",
- "password_confirm": "Confirme una contraseña",
- "password_enter": "Ingrese una contraseña",
+ "password_confirm": "confirme una contraseña",
+ "password_enter": "ingrese una contraseña",
"payment_request": "the Application
{{hostname}}
is requesting a payment",
"people_reaction": "people who reacted with {{ reaction }}",
"processing_transaction": "está procesando transacciones, espere ...",
- "publish_data": "Publicar datos en Qortal: cualquier cosa, desde aplicaciones hasta videos. Totalmente descentralizado!",
- "publishing": "Publicación ... por favor espera.",
- "qdn": "Use el ahorro de QDN",
+ "publish_data": "publicar datos en Qortal: cualquier cosa, desde aplicaciones hasta videos. Totalmente descentralizado!",
+ "publishing": "publicación ... por favor espera.",
+ "qdn": "use el ahorro de QDN",
"rating": "rating for {{ service }} {{ name }}",
- "register_name": "Necesita un nombre de Qortal registrado para guardar sus aplicaciones fijadas en QDN.",
+ "register_name": "necesita un nombre de Qortal registrado para guardar sus aplicaciones fijadas en QDN.",
"replied_to": "replied to {{ person }}",
- "revert_default": "Volver al valor predeterminado",
+ "revert_default": "volver al valor predeterminado",
"revert_qdn": "volver a QDN",
- "save_qdn": "Guardar en QDN",
- "secure_ownership": "Asegure la propiedad de los datos publicados por su nombre. Incluso puede vender su nombre, junto con sus datos a un tercero.",
- "select_file": "Seleccione un archivo",
- "select_image": "Seleccione una imagen para un logotipo",
- "select_zip": "Seleccione el archivo .zip que contenga contenido estático:",
+ "save_qdn": "guardar en QDN",
+ "secure_ownership": "asegure la propiedad de los datos publicados por su nombre. Incluso puede vender su nombre, junto con sus datos a un tercero.",
+ "select_file": "seleccione un archivo",
+ "select_image": "seleccione una imagen para un logotipo",
+ "select_zip": "seleccione el archivo .zip que contenga contenido estático:",
"sending": "envío...",
- "settings": "Está utilizando la forma de exportación/importación de la configuración de ahorro.",
- "space_for_admins": "Lo siento, este espacio es solo para administradores.",
- "unread_messages": "Mensajes no leídos a continuación",
- "unsaved_changes": "Tiene cambios no salvos en sus aplicaciones fijadas. Guárdelos a QDN.",
+ "settings": "está utilizando la forma de exportación/importación de la configuración de ahorro.",
+ "space_for_admins": "lo siento, este espacio es solo para administradores.",
+ "unread_messages": "mensajes no leídos a continuación",
+ "unsaved_changes": "tiene cambios no salvos en sus aplicaciones fijadas. Guárdelos a QDN.",
"updating": "actualización"
},
"message": "mensaje",
- "promotion_text": "Texto de promoción",
+ "promotion_text": "texto de promoción",
"question": {
"accept_vote_on_poll": "¿Acepta esta transacción votante_on_poll? ¡Las encuestas son públicas!",
"logout": "¿Estás seguro de que te gustaría cerrar sesión?",
"new_user": "¿Eres un nuevo usuario?",
"delete_chat_image": "¿Le gustaría eliminar su imagen de chat anterior?",
"perform_transaction": "would you like to perform a {{action}} transaction?",
- "provide_thread": "Proporcione un título de hilo",
+ "provide_thread": "proporcione un título de hilo",
"publish_app": "¿Le gustaría publicar esta aplicación?",
"publish_avatar": "¿Le gustaría publicar un avatar?",
"publish_qdn": "¿Le gustaría publicar su configuración en QDN (cifrado)?",
- "overwrite_changes": "La aplicación no pudo descargar sus aplicaciones fijadas existentes de QDN. ¿Le gustaría sobrescribir esos cambios?",
+ "overwrite_changes": "la aplicación no pudo descargar sus aplicaciones fijadas existentes de QDN. ¿Le gustaría sobrescribir esos cambios?",
"rate_app": "would you like to rate this app a rating of {{ rate }}?. It will create a POLL tx.",
"register_name": "¿Le gustaría registrar este nombre?",
"reset_pinned": "¿No te gustan tus cambios locales actuales? ¿Le gustaría restablecer las aplicaciones fijadas predeterminadas?",
@@ -304,11 +304,11 @@
"synchronizing": "sincronización"
},
"success": {
- "order_submitted": "Su pedido de compra fue enviado",
+ "order_submitted": "su pedido de compra fue enviado",
"published": "publicado con éxito. Espere un par de minutos para que la red propoque los cambios.",
"published_qdn": "publicado con éxito a QDN",
"rated_app": "calificado con éxito. Espere un par de minutos para que la red propoque los cambios.",
- "request_read": "He leído esta solicitud",
+ "request_read": "he leído esta solicitud",
"transfer": "¡La transferencia fue exitosa!",
"voted": "votado con éxito. Espere un par de minutos para que la red propoque los cambios."
}
@@ -320,6 +320,7 @@
"none": "ninguno",
"note": "nota",
"option": "opción",
+ "option_no": "sin opción",
"option_other": "opción",
"page": {
"last": "último",
@@ -334,11 +335,11 @@
"price": "precio",
"publish": "publicación",
"q_apps": {
- "about": "Sobre este Q-App",
+ "about": "sobre este Q-App",
"q_mail": "QAIL",
"q_manager": "manager",
"q_sandbox": "Q-Sandbox",
- "q_wallets": "Medillas Q"
+ "q_wallets": "medillas Q"
},
"receiver": "receptor",
"sender": "remitente",
diff --git a/src/i18n/locales/es/group.json b/src/i18n/locales/es/group.json
index f9efe13..437f0f4 100644
--- a/src/i18n/locales/es/group.json
+++ b/src/i18n/locales/es/group.json
@@ -1,45 +1,44 @@
{
"action": {
- "add_promotion": "Agregar promoción",
- "ban": "Prohibir miembro del grupo",
- "cancel_ban": "Cancelar prohibición",
- "copy_private_key": "Copiar clave privada",
+ "add_promotion": "agregar promoción",
+ "ban": "prohibir miembro del grupo",
+ "cancel_ban": "cancelar prohibición",
+ "copy_private_key": "copiar clave privada",
"create_group": "crear grupo",
- "disable_push_notifications": "Deshabilitar todas las notificaciones push",
- "export_password": "Exportar contraseña",
- "export_private_key": "Exportar clave privada",
+ "disable_push_notifications": "deshabilitar todas las notificaciones push",
+ "export_password": "exportar contraseña",
+ "export_private_key": "exportar clave privada",
"find_group": "encontrar grupo",
"join_group": "unirse al grupo",
"kick_member": "patear miembro del grupo",
- "invite_member": "Invitar miembro",
+ "invite_member": "invitar miembro",
"leave_group": "dejar el grupo",
- "load_members": "Cargar miembros con nombres",
+ "load_members": "cargar miembros con nombres",
"make_admin": "hacer un administrador",
"manage_members": "administrar miembros",
- "promote_group": "Promocione a su grupo a los no miembros",
+ "promote_group": "promocione a su grupo a los no miembros",
"publish_announcement": "publicar el anuncio",
"publish_avatar": "publicar avatar",
- "refetch_page": "Página de reacondicionamiento",
+ "refetch_page": "página de reacondicionamiento",
"remove_admin": "eliminar como administrador",
- "remove_minting_account": "Eliminar la cuenta de acuñación",
+ "remove_minting_account": "eliminar la cuenta de acuñación",
"return_to_thread": "volver a los hilos",
"scroll_bottom": "desplazarse hacia abajo",
- "scroll_unread_messages": "Desplácese a mensajes no leídos",
- "select_group": "Seleccione un grupo",
- "visit_q_mintership": "Visite Q-Mintership"
+ "scroll_unread_messages": "desplácese a mensajes no leídos",
+ "select_group": "seleccione un grupo",
+ "visit_q_mintership": "visite Q-Mintership"
},
- "advanced_options": "Opciones avanzadas",
- "ban_list": "lista de prohibición",
+ "advanced_options": "opciones avanzadas",
"block_delay": {
- "minimum": "Retraso de bloque mínimo",
- "maximum": "Retraso de bloque máximo"
+ "minimum": "retraso de bloque mínimo",
+ "maximum": "retraso de bloque máximo"
},
"group": {
"approval_threshold": "umbral de aprobación del grupo",
"avatar": "avatar de grupo",
- "closed": "Cerrado (privado) - Los usuarios necesitan permiso para unirse",
- "description": "Descripción del grupo",
- "id": "ID de grupo",
+ "closed": "cerrado (privado) - Los usuarios necesitan permiso para unirse",
+ "description": "descripción del grupo",
+ "id": "iD de grupo",
"invites": "invitaciones grupales",
"group": "grupo",
"group_name": "group: {{ name }}",
@@ -49,13 +48,13 @@
"member_number": "número de miembros",
"messaging": "mensajería",
"name": "nombre de grupo",
- "open": "Abierto (público)",
+ "open": "abierto (público)",
"private": "grupo privado",
"promotions": "promociones grupales",
"public": "grupo público",
"type": "tipo de grupo"
},
- "invitation_expiry": "Tiempo de vencimiento de la invitación",
+ "invitation_expiry": "tiempo de vencimiento de la invitación",
"invitees_list": "lista de invitados",
"join_link": "unir el enlace grupal",
"join_requests": "unir las solicitudes",
@@ -65,68 +64,68 @@
"message": {
"generic": {
"avatar_publish_fee": "publishing an Avatar requires {{ fee }}",
- "avatar_registered_name": "Se requiere un nombre registrado para establecer un avatar",
- "admin_only": "Solo se mostrarán grupos donde se encuentre un administrador",
+ "avatar_registered_name": "se requiere un nombre registrado para establecer un avatar",
+ "admin_only": "solo se mostrarán grupos donde se encuentre un administrador",
"already_in_group": "¡Ya estás en este grupo!",
- "block_delay_minimum": "Retraso de bloque mínimo para las aprobaciones de transacciones grupales",
- "block_delay_maximum": "Retraso de bloque máximo para las aprobaciones de transacciones grupales",
- "closed_group": "Este es un grupo cerrado/privado, por lo que deberá esperar hasta que un administrador acepte su solicitud.",
+ "block_delay_minimum": "retraso de bloque mínimo para las aprobaciones de transacciones grupales",
+ "block_delay_maximum": "retraso de bloque máximo para las aprobaciones de transacciones grupales",
+ "closed_group": "este es un grupo cerrado/privado, por lo que deberá esperar hasta que un administrador acepte su solicitud.",
"descrypt_wallet": "descifrando la billetera ...",
- "encryption_key": "La primera clave de cifrado común del grupo está en el proceso de creación. Espere unos minutos para que la red recupere la red. Revisando cada 2 minutos ...",
- "group_announcement": "Anuncios grupales",
- "group_approval_threshold": "Umbral de aprobación del grupo (número / porcentaje de administradores que deben aprobar una transacción)",
+ "encryption_key": "la primera clave de cifrado común del grupo está en el proceso de creación. Espere unos minutos para que la red recupere la red. Revisando cada 2 minutos ...",
+ "group_announcement": "anuncios grupales",
+ "group_approval_threshold": "umbral de aprobación del grupo (número / porcentaje de administradores que deben aprobar una transacción)",
"group_encrypted": "grupo encriptado",
"group_invited_you": "{{group}} has invited you",
- "group_key_created": "Primera clave de grupo creada.",
- "group_member_list_changed": "La lista de miembros del grupo ha cambiado. Vuelva a encriptar la clave secreta.",
- "group_no_secret_key": "No hay una clave secreta grupal. ¡Sea el primer administrador en publicar uno!",
- "group_secret_key_no_owner": "El último grupo Secret Key fue publicado por un no propietario. Como propietario del grupo, vuelva a encriptar la clave como salvaguardia.",
- "invalid_content": "Contenido no válido, remitente o marca de tiempo en datos de reacción",
- "invalid_data": "Error de carga de contenido: datos no válidos",
- "latest_promotion": "Solo la última promoción de la semana se mostrará para su grupo.",
- "loading_members": "Cargando la lista de miembros con nombres ... por favor espere.",
- "max_chars": "Max 200 caracteres. Publicar tarifa",
- "manage_minting": "Administre su menta",
- "minter_group": "Actualmente no eres parte del grupo Minter",
- "mintership_app": "Visite la aplicación Q-Mintership para aplicar a un Minter",
- "minting_account": "Cuenta de acuñado:",
- "minting_keys_per_node": "Solo se permiten 2 claves de acuñación por nodo. Eliminar uno si desea acomodar con esta cuenta.",
- "minting_keys_per_node_different": "Solo se permiten 2 claves de acuñación por nodo. Elimine uno si desea agregar una cuenta diferente.",
- "next_level": "Bloques restantes hasta el siguiente nivel:",
- "node_minting": "Este nodo está acuñado:",
- "node_minting_account": "Cuentas de menta de nodo",
- "node_minting_key": "Actualmente tiene una clave de menta para esta cuenta adjunta a este nodo",
- "no_announcement": "Sin anuncios",
+ "group_key_created": "primera clave de grupo creada.",
+ "group_member_list_changed": "la lista de miembros del grupo ha cambiado. Vuelva a encriptar la clave secreta.",
+ "group_no_secret_key": "no hay una clave secreta grupal. ¡Sea el primer administrador en publicar uno!",
+ "group_secret_key_no_owner": "el último grupo Secret Key fue publicado por un no propietario. Como propietario del grupo, vuelva a encriptar la clave como salvaguardia.",
+ "invalid_content": "contenido no válido, remitente o marca de tiempo en datos de reacción",
+ "invalid_data": "error de carga de contenido: datos no válidos",
+ "latest_promotion": "solo la última promoción de la semana se mostrará para su grupo.",
+ "loading_members": "cargando la lista de miembros con nombres ... por favor espere.",
+ "max_chars": "max 200 caracteres. Publicar tarifa",
+ "manage_minting": "administre su menta",
+ "minter_group": "actualmente no eres parte del grupo Minter",
+ "mintership_app": "visite la aplicación Q-Mintership para aplicar a un Minter",
+ "minting_account": "cuenta de acuñado:",
+ "minting_keys_per_node": "solo se permiten 2 claves de acuñación por nodo. Eliminar uno si desea acomodar con esta cuenta.",
+ "minting_keys_per_node_different": "solo se permiten 2 claves de acuñación por nodo. Elimine uno si desea agregar una cuenta diferente.",
+ "next_level": "bloques restantes hasta el siguiente nivel:",
+ "node_minting": "este nodo está acuñado:",
+ "node_minting_account": "cuentas de menta de nodo",
+ "node_minting_key": "actualmente tiene una clave de menta para esta cuenta adjunta a este nodo",
+ "no_announcement": "sin anuncios",
"no_display": "nada que mostrar",
- "no_selection": "No hay grupo seleccionado",
- "not_part_group": "No eres parte del grupo cifrado de miembros. Espere hasta que un administrador vuelva a encriptar las teclas.",
- "only_encrypted": "Solo se mostrarán mensajes sin cifrar.",
- "only_private_groups": "Solo se mostrarán grupos privados",
+ "no_selection": "no hay grupo seleccionado",
+ "not_part_group": "no eres parte del grupo cifrado de miembros. Espere hasta que un administrador vuelva a encriptar las teclas.",
+ "only_encrypted": "solo se mostrarán mensajes sin cifrar.",
+ "only_private_groups": "solo se mostrarán grupos privados",
"pending_join_requests": "{{ group }} has {{ count }} pending join requests",
- "private_key_copied": "Clave privada copiada",
- "provide_message": "Proporcione un primer mensaje al hilo",
- "secure_place": "Mantenga su llave privada en un lugar seguro. ¡No comparta!",
- "setting_group": "Configuración del grupo ... por favor espere."
+ "private_key_copied": "clave privada copiada",
+ "provide_message": "proporcione un primer mensaje al hilo",
+ "secure_place": "mantenga su llave privada en un lugar seguro. ¡No comparta!",
+ "setting_group": "configuración del grupo ... por favor espere."
},
"error": {
- "access_name": "No se puede enviar un mensaje sin acceso a su nombre",
+ "access_name": "no se puede enviar un mensaje sin acceso a su nombre",
"descrypt_wallet": "error decrypting wallet {{ message }}",
- "description_required": "Proporcione una descripción",
- "group_info": "No se puede acceder a la información del grupo",
- "group_join": "No se unió al grupo",
- "group_promotion": "Error al publicar la promoción. Por favor intente de nuevo",
- "group_secret_key": "No se puede obtener la clave secreta del grupo",
- "name_required": "Proporcione un nombre",
- "notify_admins": "Intente notificar a un administrador de la lista de administradores a continuación:",
+ "description_required": "proporcione una descripción",
+ "group_info": "no se puede acceder a la información del grupo",
+ "group_join": "no se unió al grupo",
+ "group_promotion": "error al publicar la promoción. Por favor intente de nuevo",
+ "group_secret_key": "no se puede obtener la clave secreta del grupo",
+ "name_required": "proporcione un nombre",
+ "notify_admins": "intente notificar a un administrador de la lista de administradores a continuación:",
"qortals_required": "you need at least {{ quantity }} QORT to send a message",
- "timeout_reward": "Tiempo de espera esperando la confirmación de recompensas compartidas",
- "thread_id": "No se puede localizar la identificación del hilo",
- "unable_determine_group_private": "No se puede determinar si el grupo es privado",
- "unable_minting": "Incapaz de comenzar a acuñar"
+ "timeout_reward": "tiempo de espera esperando la confirmación de recompensas compartidas",
+ "thread_id": "no se puede localizar la identificación del hilo",
+ "unable_determine_group_private": "no se puede determinar si el grupo es privado",
+ "unable_minting": "incapaz de comenzar a acuñar"
},
"success": {
- "group_ban": "Problimado con éxito miembro del grupo. Puede tomar un par de minutos para que los cambios se propagen",
- "group_creation": "Grupo creado con éxito. Puede tomar un par de minutos para que los cambios se propagen",
+ "group_ban": "problimado con éxito miembro del grupo. Puede tomar un par de minutos para que los cambios se propagen",
+ "group_creation": "grupo creado con éxito. Puede tomar un par de minutos para que los cambios se propagen",
"group_creation_name": "created group {{group_name}}: awaiting confirmation",
"group_creation_label": "created group {{name}}: success!",
"group_invite": "successfully invited {{invitee}}. It may take a couple of minutes for the changes to propagate",
@@ -135,32 +134,32 @@
"group_join_label": "joined group {{name}}: success!",
"group_join_request": "requested to join Group {{group_name}}: awaiting confirmation",
"group_join_outcome": "requested to join Group {{group_name}}: success!",
- "group_kick": "Pateó con éxito miembro del grupo. Puede tomar un par de minutos para que los cambios se propagen",
+ "group_kick": "pateó con éxito miembro del grupo. Puede tomar un par de minutos para que los cambios se propagen",
"group_leave": "solicitó con éxito dejar el grupo. Puede tomar un par de minutos para que los cambios se propagen",
"group_leave_name": "left group {{group_name}}: awaiting confirmation",
"group_leave_label": "left group {{name}}: success!",
- "group_member_admin": "El miembro hizo con éxito un administrador. Puede tomar un par de minutos para que los cambios se propagen",
- "group_promotion": "Promoción publicada con éxito. Puede tomar un par de minutos para que aparezca la promoción.",
- "group_remove_member": "El miembro eliminado con éxito como administrador. Puede tomar un par de minutos para que los cambios se propagen",
- "invitation_cancellation": "Invitación cancelada con éxito. Puede tomar un par de minutos para que los cambios se propagen",
- "invitation_request": "Solicitud de unión aceptada: espera confirmación",
- "loading_threads": "Cargando hilos ... por favor espere.",
- "post_creation": "Post creado con éxito. La publicación puede tardar un tiempo en propagarse",
+ "group_member_admin": "el miembro hizo con éxito un administrador. Puede tomar un par de minutos para que los cambios se propagen",
+ "group_promotion": "promoción publicada con éxito. Puede tomar un par de minutos para que aparezca la promoción.",
+ "group_remove_member": "el miembro eliminado con éxito como administrador. Puede tomar un par de minutos para que los cambios se propagen",
+ "invitation_cancellation": "invitación cancelada con éxito. Puede tomar un par de minutos para que los cambios se propagen",
+ "invitation_request": "solicitud de unión aceptada: espera confirmación",
+ "loading_threads": "cargando hilos ... por favor espere.",
+ "post_creation": "post creado con éxito. La publicación puede tardar un tiempo en propagarse",
"published_secret_key": "published secret key for group {{ group_id }}: awaiting confirmation",
"published_secret_key_label": "published secret key for group {{ group_id }}: success!",
"registered_name": "registrado con éxito. Puede tomar un par de minutos para que los cambios se propagen",
- "registered_name_label": "Nombre registrado: Confirmación en espera. Esto puede llevar un par de minutos.",
- "registered_name_success": "Nombre registrado: ¡éxito!",
- "rewardshare_add": "Agregar recompensas Share: esperando confirmación",
- "rewardshare_add_label": "Agregar recompensas Share: ¡éxito!",
- "rewardshare_creation": "Confirmando la creación de recompensas en la cadena. Tenga paciencia, esto podría tomar hasta 90 segundos.",
+ "registered_name_label": "nombre registrado: Confirmación en espera. Esto puede llevar un par de minutos.",
+ "registered_name_success": "nombre registrado: ¡éxito!",
+ "rewardshare_add": "agregar recompensas Share: esperando confirmación",
+ "rewardshare_add_label": "agregar recompensas Share: ¡éxito!",
+ "rewardshare_creation": "confirmando la creación de recompensas en la cadena. Tenga paciencia, esto podría tomar hasta 90 segundos.",
"rewardshare_confirmed": "recompensas confirmadas. Haga clic en Siguiente.",
- "rewardshare_remove": "Eliminar recompensas Share: espera confirmación",
- "rewardshare_remove_label": "Eliminar recompensas Share: ¡éxito!",
+ "rewardshare_remove": "eliminar recompensas Share: espera confirmación",
+ "rewardshare_remove_label": "eliminar recompensas Share: ¡éxito!",
"thread_creation": "hilo creado con éxito. La publicación puede tardar un tiempo en propagarse",
- "unbanned_user": "Usuario sin explotar con éxito. Puede tomar un par de minutos para que los cambios se propagen",
+ "unbanned_user": "usuario sin explotar con éxito. Puede tomar un par de minutos para que los cambios se propagen",
"user_joined": "¡El usuario se unió con éxito!"
}
},
- "thread_posts": "Nuevas publicaciones de hilo"
+ "thread_posts": "nuevas publicaciones de hilo"
}
diff --git a/src/i18n/locales/es/question.json b/src/i18n/locales/es/question.json
index bf92732..f9a6899 100644
--- a/src/i18n/locales/es/question.json
+++ b/src/i18n/locales/es/question.json
@@ -1,11 +1,11 @@
{
"accept_app_fee": "aceptar la tarifa de la aplicación",
"always_authenticate": "siempre autenticarse automáticamente",
- "always_chat_messages": "Siempre permita mensajes de chat desde esta aplicación",
- "always_retrieve_balance": "Siempre permita que el equilibrio se recupere automáticamente",
- "always_retrieve_list": "Siempre permita que las listas se recuperen automáticamente",
- "always_retrieve_wallet": "Siempre permita que la billetera se recupere automáticamente",
- "always_retrieve_wallet_transactions": "Siempre permita que las transacciones de billetera se recuperen automáticamente",
+ "always_chat_messages": "siempre permita mensajes de chat desde esta aplicación",
+ "always_retrieve_balance": "siempre permita que el equilibrio se recupere automáticamente",
+ "always_retrieve_list": "siempre permita que las listas se recuperen automáticamente",
+ "always_retrieve_wallet": "siempre permita que la billetera se recupere automáticamente",
+ "always_retrieve_wallet_transactions": "siempre permita que las transacciones de billetera se recuperen automáticamente",
"amount_qty": "amount: {{ quantity }}",
"asset_name": "asset: {{ asset }}",
"assets_used_pay": "asset used in payments: {{ asset }}",
@@ -15,110 +15,110 @@
"download_file": "¿Le gustaría descargar?",
"message": {
"error": {
- "add_to_list": "No se pudo agregar a la lista",
+ "add_to_list": "no se pudo agregar a la lista",
"at_info": "no puedo encontrar en la información.",
- "buy_order": "No se pudo presentar una orden comercial",
- "cancel_sell_order": "No se pudo cancelar el pedido de venta. ¡Intentar otra vez!",
- "copy_clipboard": "No se pudo copiar al portapapeles",
- "create_sell_order": "No se pudo crear un pedido de venta. ¡Intentar otra vez!",
- "create_tradebot": "No se puede crear TradeBot",
- "decode_transaction": "No se pudo decodificar la transacción",
- "decrypt": "Incifto de descifrar",
- "decrypt_message": "No se pudo descifrar el mensaje. Asegúrese de que los datos y las claves sean correctos",
- "decryption_failed": "El descifrado falló",
+ "buy_order": "no se pudo presentar una orden comercial",
+ "cancel_sell_order": "no se pudo cancelar el pedido de venta. ¡Intentar otra vez!",
+ "copy_clipboard": "no se pudo copiar al portapapeles",
+ "create_sell_order": "no se pudo crear un pedido de venta. ¡Intentar otra vez!",
+ "create_tradebot": "no se puede crear TradeBot",
+ "decode_transaction": "no se pudo decodificar la transacción",
+ "decrypt": "incifto de descifrar",
+ "decrypt_message": "no se pudo descifrar el mensaje. Asegúrese de que los datos y las claves sean correctos",
+ "decryption_failed": "el descifrado falló",
"empty_receiver": "¡El receptor no puede estar vacío!",
"encrypt": "incapaz de cifrar",
- "encryption_failed": "El cifrado falló",
- "encryption_requires_public_key": "Cifrar datos requiere claves públicas",
+ "encryption_failed": "el cifrado falló",
+ "encryption_requires_public_key": "cifrar datos requiere claves públicas",
"fetch_balance_token": "failed to fetch {{ token }} Balance. Try again!",
- "fetch_balance": "Incapaz de obtener el equilibrio",
- "fetch_connection_history": "No se pudo obtener el historial de conexión del servidor",
- "fetch_generic": "Incapaz de buscar",
- "fetch_group": "No se pudo buscar al grupo",
- "fetch_list": "No se pudo obtener la lista",
- "fetch_poll": "No logró obtener una encuesta",
- "fetch_recipient_public_key": "No logró obtener la clave pública del destinatario",
- "fetch_wallet_info": "Incapaz de obtener información de billetera",
- "fetch_wallet_transactions": "Incapaz de buscar transacciones de billetera",
- "fetch_wallet": "Fatch Wallet falló. Por favor intente de nuevo",
+ "fetch_balance": "incapaz de obtener el equilibrio",
+ "fetch_connection_history": "no se pudo obtener el historial de conexión del servidor",
+ "fetch_generic": "incapaz de buscar",
+ "fetch_group": "no se pudo buscar al grupo",
+ "fetch_list": "no se pudo obtener la lista",
+ "fetch_poll": "no logró obtener una encuesta",
+ "fetch_recipient_public_key": "no logró obtener la clave pública del destinatario",
+ "fetch_wallet_info": "incapaz de obtener información de billetera",
+ "fetch_wallet_transactions": "incapaz de buscar transacciones de billetera",
+ "fetch_wallet": "fatch Wallet falló. Por favor intente de nuevo",
"file_extension": "no se pudo derivar una extensión de archivo",
"gateway_balance_local_node": "cannot view {{ token }} balance through the gateway. Please use your local node.",
- "gateway_non_qort_local_node": "No se puede enviar una moneda que no sea de Qort a través de la puerta de enlace. Utilice su nodo local.",
+ "gateway_non_qort_local_node": "no se puede enviar una moneda que no sea de Qort a través de la puerta de enlace. Utilice su nodo local.",
"gateway_retrieve_balance": "retrieving {{ token }} balance is not allowed through a gateway",
"gateway_wallet_local_node": "cannot view {{ token }} wallet through the gateway. Please use your local node.",
- "get_foreign_fee": "Error en obtener una tarifa extranjera",
- "insufficient_balance_qort": "Su saldo Qort es insuficiente",
- "insufficient_balance": "Su saldo de activos es insuficiente",
+ "get_foreign_fee": "error en obtener una tarifa extranjera",
+ "insufficient_balance_qort": "su saldo Qort es insuficiente",
+ "insufficient_balance": "su saldo de activos es insuficiente",
"insufficient_funds": "fondos insuficientes",
- "invalid_encryption_iv": "Inválido IV: AES-GCM requiere un IV de 12 bytes",
- "invalid_encryption_key": "Clave no válida: AES-GCM requiere una clave de 256 bits.",
- "invalid_fullcontent": "Field FullContent está en un formato no válido. Use una cadena, base64 o un objeto",
- "invalid_receiver": "Dirección o nombre del receptor no válido",
+ "invalid_encryption_iv": "inválido IV: AES-GCM requiere un IV de 12 bytes",
+ "invalid_encryption_key": "clave no válida: AES-GCM requiere una clave de 256 bits.",
+ "invalid_fullcontent": "field FullContent está en un formato no válido. Use una cadena, base64 o un objeto",
+ "invalid_receiver": "dirección o nombre del receptor no válido",
"invalid_type": "tipo no válido",
"mime_type": "un mimetipo no se pudo derivar",
"missing_fields": "missing fields: {{ fields }}",
- "name_already_for_sale": "Este nombre ya está a la venta",
- "name_not_for_sale": "Este nombre no está a la venta",
- "no_api_found": "No se encontró una API utilizable",
- "no_data_encrypted_resource": "No hay datos en el recurso cifrado",
- "no_data_file_submitted": "No se enviaron datos o archivo",
+ "name_already_for_sale": "este nombre ya está a la venta",
+ "name_not_for_sale": "este nombre no está a la venta",
+ "no_api_found": "no se encontró una API utilizable",
+ "no_data_encrypted_resource": "no hay datos en el recurso cifrado",
+ "no_data_file_submitted": "no se enviaron datos o archivo",
"no_group_found": "grupo no encontrado",
- "no_group_key": "No se encontró ninguna llave de grupo",
+ "no_group_key": "no se encontró ninguna llave de grupo",
"no_poll": "encuesta no encontrada",
- "no_resources_publish": "No hay recursos para publicar",
- "node_info": "No se pudo recuperar la información del nodo",
- "node_status": "No se pudo recuperar el estado del nodo",
- "only_encrypted_data": "Solo los datos cifrados pueden ir a servicios privados",
- "perform_request": "No se pudo realizar la solicitud",
- "poll_create": "No se pudo crear una encuesta",
+ "no_resources_publish": "no hay recursos para publicar",
+ "node_info": "no se pudo recuperar la información del nodo",
+ "node_status": "no se pudo recuperar el estado del nodo",
+ "only_encrypted_data": "solo los datos cifrados pueden ir a servicios privados",
+ "perform_request": "no se pudo realizar la solicitud",
+ "poll_create": "no se pudo crear una encuesta",
"poll_vote": "no votó sobre la encuesta",
- "process_transaction": "No se puede procesar la transacción",
- "provide_key_shared_link": "Para un recurso cifrado, debe proporcionar la clave para crear el enlace compartido",
- "registered_name": "Se necesita un nombre registrado para publicar",
- "resources_publish": "Algunos recursos no han podido publicar",
- "retrieve_file": "No se pudo recuperar el archivo",
- "retrieve_keys": "Incapaz de recuperar las llaves",
- "retrieve_summary": "No se pudo recuperar el resumen",
+ "process_transaction": "no se puede procesar la transacción",
+ "provide_key_shared_link": "para un recurso cifrado, debe proporcionar la clave para crear el enlace compartido",
+ "registered_name": "se necesita un nombre registrado para publicar",
+ "resources_publish": "algunos recursos no han podido publicar",
+ "retrieve_file": "no se pudo recuperar el archivo",
+ "retrieve_keys": "incapaz de recuperar las llaves",
+ "retrieve_summary": "no se pudo recuperar el resumen",
"retrieve_sync_status": "error in retrieving {{ token }} sync status",
- "same_foreign_blockchain": "Todos los AT solicitados deben ser de la misma cadena de bloques extranjeras.",
- "send": "No se pudo enviar",
- "server_current_add": "No se pudo agregar el servidor actual",
- "server_current_set": "No se pudo configurar el servidor actual",
- "server_info": "Error al recuperar la información del servidor",
- "server_remove": "No se pudo eliminar el servidor",
- "submit_sell_order": "No se pudo enviar el pedido de venta",
+ "same_foreign_blockchain": "todos los AT solicitados deben ser de la misma cadena de bloques extranjeras.",
+ "send": "no se pudo enviar",
+ "server_current_add": "no se pudo agregar el servidor actual",
+ "server_current_set": "no se pudo configurar el servidor actual",
+ "server_info": "error al recuperar la información del servidor",
+ "server_remove": "no se pudo eliminar el servidor",
+ "submit_sell_order": "no se pudo enviar el pedido de venta",
"synchronization_attempts": "failed to synchronize after {{ quantity }} attempts",
- "timeout_request": "Solicitar el tiempo de tiempo fuera",
+ "timeout_request": "solicitar el tiempo de tiempo fuera",
"token_not_supported": "{{ token }} is not supported for this call",
- "transaction_activity_summary": "Error en el resumen de la actividad de transacción",
- "unknown_error": "Error desconocido",
+ "transaction_activity_summary": "error en el resumen de la actividad de transacción",
+ "unknown_error": "error desconocido",
"unknown_admin_action_type": "unknown admin action type: {{ type }}",
- "update_foreign_fee": "No se pudo actualizar la tarifa extranjera",
- "update_tradebot": "No se puede actualizar TradeBot",
- "upload_encryption": "Carga fallida debido al cifrado fallido",
- "upload": "Carga falló",
- "use_private_service": "Para una publicación encriptada, utilice un servicio que termine con _Private",
- "user_qortal_name": "El usuario no tiene nombre Qortal"
+ "update_foreign_fee": "no se pudo actualizar la tarifa extranjera",
+ "update_tradebot": "no se puede actualizar TradeBot",
+ "upload_encryption": "carga fallida debido al cifrado fallido",
+ "upload": "carga falló",
+ "use_private_service": "para una publicación encriptada, utilice un servicio que termine con _Private",
+ "user_qortal_name": "el usuario no tiene nombre Qortal"
},
"generic": {
"calculate_fee": "*the {{ amount }} sats fee is derived from {{ rate }} sats per kb, for a transaction that is approximately 300 bytes in size.",
- "confirm_join_group": "Confirme unirse al grupo:",
- "include_data_decrypt": "Incluya datos para descifrar",
- "include_data_encrypt": "Incluya datos para encriptar",
+ "confirm_join_group": "confirme unirse al grupo:",
+ "include_data_decrypt": "incluya datos para descifrar",
+ "include_data_encrypt": "incluya datos para encriptar",
"max_retry_transaction": "alcanzó los requisitos de Max. Omitiendo transacción.",
- "no_action_public_node": "Esta acción no se puede hacer a través de un nodo público",
- "private_service": "Utilice un servicio privado",
- "provide_group_id": "Proporcione un grupo de grupo",
+ "no_action_public_node": "esta acción no se puede hacer a través de un nodo público",
+ "private_service": "utilice un servicio privado",
+ "provide_group_id": "proporcione un grupo de grupo",
"read_transaction_carefully": "¡Lea la transacción cuidadosamente antes de aceptar!",
- "user_declined_add_list": "El usuario declinó agregar a la lista",
- "user_declined_delete_from_list": "El usuario declinó Eliminar de la lista",
- "user_declined_delete_hosted_resources": "El usuario declinó eliminar recursos alojados",
- "user_declined_join": "El usuario declinó unirse al grupo",
- "user_declined_list": "El usuario declinó obtener una lista de recursos alojados",
- "user_declined_request": "Solicitud de usuario rechazada",
- "user_declined_save_file": "El usuario declinó guardar el archivo",
- "user_declined_send_message": "El usuario declinó enviar un mensaje",
- "user_declined_share_list": "El usuario declinó la lista de acciones"
+ "user_declined_add_list": "el usuario declinó agregar a la lista",
+ "user_declined_delete_from_list": "el usuario declinó Eliminar de la lista",
+ "user_declined_delete_hosted_resources": "el usuario declinó eliminar recursos alojados",
+ "user_declined_join": "el usuario declinó unirse al grupo",
+ "user_declined_list": "el usuario declinó obtener una lista de recursos alojados",
+ "user_declined_request": "solicitud de usuario rechazada",
+ "user_declined_save_file": "el usuario declinó guardar el archivo",
+ "user_declined_send_message": "el usuario declinó enviar un mensaje",
+ "user_declined_share_list": "el usuario declinó la lista de acciones"
}
},
"name": "name: {{ name }}",
@@ -177,8 +177,8 @@
"update_group": "¿Da permiso a esta aplicación para actualizar este grupo?"
},
"poll": "poll: {{ name }}",
- "provide_recipient_group_id": "Proporcione un destinatario o groupid",
- "request_create_poll": "Está solicitando crear la encuesta a continuación:",
+ "provide_recipient_group_id": "proporcione un destinatario o groupid",
+ "request_create_poll": "está solicitando crear la encuesta a continuación:",
"request_vote_poll": "you are being requested to vote on the poll below:",
"sats_per_kb": "{{ amount }} sats per KB",
"sats": "{{ amount }} sats",
@@ -189,4 +189,4 @@
"total_locking_fee": "total Locking Fee:",
"total_unlocking_fee": "total Unlocking Fee:",
"value": "value: {{ value }}"
-}
\ No newline at end of file
+}
diff --git a/src/i18n/locales/es/tutorial.json b/src/i18n/locales/es/tutorial.json
index ee7258d..eeb14d0 100644
--- a/src/i18n/locales/es/tutorial.json
+++ b/src/i18n/locales/es/tutorial.json
@@ -4,7 +4,7 @@
"3_groups": "3. Grupos de Qortal",
"4_obtain_qort": "4. Obtener Qort",
"account_creation": "creación de cuenta",
- "important_info": "Información importante!",
+ "important_info": "información importante!",
"apps": {
"dashboard": "1. Panel de aplicaciones",
"navigation": "2. Navegación de aplicaciones"
@@ -15,7 +15,7 @@
"general_chat": "chat general",
"getting_started": "empezando",
"register_name": "registrar un nombre",
- "see_apps": "Ver aplicaciones",
+ "see_apps": "ver aplicaciones",
"trade_qort": "comercio Qort"
}
-}
\ No newline at end of file
+}
diff --git a/src/i18n/locales/fr/auth.json b/src/i18n/locales/fr/auth.json
index fbb7129..1b91356 100644
--- a/src/i18n/locales/fr/auth.json
+++ b/src/i18n/locales/fr/auth.json
@@ -1,6 +1,6 @@
{
"account": {
- "your": "Votre compte",
+ "your": "votre compte",
"account_many": "comptes",
"account_one": "compte",
"selected": "compte sélectionné"
@@ -8,130 +8,130 @@
"action": {
"add": {
"account": "ajouter un compte",
- "seed_phrase": "Ajouter la phrase de graines"
+ "seed_phrase": "ajouter la phrase de graines"
},
"authenticate": "authentifier",
"block": "bloc",
- "block_all": "Bloquer tout",
- "block_data": "Bloquer les données QDN",
+ "block_all": "bloquer tout",
+ "block_data": "bloquer les données QDN",
"block_name": "nom de blocage",
- "block_txs": "Bloquer TSX",
- "fetch_names": "Répondre aux noms",
- "copy_address": "Copier l'adresse",
+ "block_txs": "bloquer TSX",
+ "fetch_names": "répondre aux noms",
+ "copy_address": "copier l'adresse",
"create_account": "créer un compte",
"create_qortal_account": "create your Qortal account by clicking NEXT below.",
- "choose_password": "Choisissez un nouveau mot de passe",
- "download_account": "Télécharger le compte",
- "enter_amount": "Veuillez saisir un montant supérieur à 0",
- "enter_recipient": "Veuillez entrer un destinataire",
- "enter_wallet_password": "Veuillez saisir votre mot de passe de portefeuille",
+ "choose_password": "choisissez un nouveau mot de passe",
+ "download_account": "télécharger le compte",
+ "enter_amount": "veuillez saisir un montant supérieur à 0",
+ "enter_recipient": "veuillez entrer un destinataire",
+ "enter_wallet_password": "veuillez saisir votre mot de passe de portefeuille",
"export_seedphrase": "exportation de graines",
- "insert_name_address": "Veuillez insérer un nom ou une adresse",
- "publish_admin_secret_key": "Publier une clé secrète administrateur",
- "publish_group_secret_key": "Publier la clé secrète de groupe",
- "reencrypt_key": "Clé de réencrypt",
+ "insert_name_address": "veuillez insérer un nom ou une adresse",
+ "publish_admin_secret_key": "publier une clé secrète administrateur",
+ "publish_group_secret_key": "publier la clé secrète de groupe",
+ "reencrypt_key": "clé de réencrypt",
"return_to_list": "retour à la liste",
- "setup_qortal_account": "Configurez votre compte Qortal",
+ "setup_qortal_account": "configurez votre compte Qortal",
"unblock": "débloquer",
- "unblock_name": "Nom de déblocage"
+ "unblock_name": "nom de déblocage"
},
"address": "adresse",
"address_name": "adresse ou nom",
- "advanced_users": "Pour les utilisateurs avancés",
+ "advanced_users": "pour les utilisateurs avancés",
"apikey": {
- "alternative": "Alternative: sélection de fichiers",
- "change": "Changer Apikey",
- "enter": "Entrez Apikey",
+ "alternative": "alternative: sélection de fichiers",
+ "change": "changer Apikey",
+ "enter": "entrez Apikey",
"import": "importer apikey",
- "key": "Clé API",
- "select_valid": "Sélectionnez un apikey valide"
+ "key": "clé API",
+ "select_valid": "sélectionnez un apikey valide"
},
"authentication": "authentification",
"blocked_users": "utilisateurs bloqués",
"build_version": "version de construction",
"message": {
"error": {
- "account_creation": "Impossible de créer un compte.",
- "address_not_existing": "L'adresse n'existe pas sur la blockchain",
- "block_user": "Impossible de bloquer l'utilisateur",
- "create_simmetric_key": "Impossible de créer une clé symétrique",
+ "account_creation": "impossible de créer un compte.",
+ "address_not_existing": "l'adresse n'existe pas sur la blockchain",
+ "block_user": "impossible de bloquer l'utilisateur",
+ "create_simmetric_key": "impossible de créer une clé symétrique",
"decrypt_data": "Je n'ai pas pu déchiffrer les données",
"decrypt": "incapable de décrypter",
- "encrypt_content": "Impossible de crypter le contenu",
- "fetch_user_account": "Impossible de récupérer le compte d'utilisateur",
+ "encrypt_content": "impossible de crypter le contenu",
+ "fetch_user_account": "impossible de récupérer le compte d'utilisateur",
"field_not_found_json": "{{ field }} not found in JSON",
- "find_secret_key": "Impossible de trouver Secretkey correct",
+ "find_secret_key": "impossible de trouver Secretkey correct",
"incorrect_password": "mot de passe incorrect",
"invalid_qortal_link": "lien Qortal non valide",
- "invalid_secret_key": "SecretKey n'est pas valable",
- "invalid_uint8": "L'Uint8ArrayData que vous avez soumis n'est pas valide",
- "name_not_existing": "Le nom n'existe pas",
- "name_not_registered": "Nom non enregistré",
+ "invalid_secret_key": "secretKey n'est pas valable",
+ "invalid_uint8": "l'Uint8ArrayData que vous avez soumis n'est pas valide",
+ "name_not_existing": "le nom n'existe pas",
+ "name_not_registered": "nom non enregistré",
"read_blob_base64": "Échec de la lecture du blob en tant que chaîne codée de base64",
- "reencrypt_secret_key": "Impossible de réincrypter la clé secrète",
- "set_apikey": "Impossible de définir la clé API:"
+ "reencrypt_secret_key": "impossible de réincrypter la clé secrète",
+ "set_apikey": "impossible de définir la clé API:"
},
"generic": {
- "blocked_addresses": "Adresses bloquées - Blocs Traitement des TX",
- "blocked_names": "Noms bloqués pour QDN",
+ "blocked_addresses": "adresses bloquées - Blocs Traitement des TX",
+ "blocked_names": "noms bloqués pour QDN",
"blocking": "blocking {{ name }}",
- "choose_block": "Choisissez «Bloquer TXS» ou «All» pour bloquer les messages de chat",
- "congrats_setup": "Félicitations, vous êtes tous mis en place!",
+ "choose_block": "choisissez «Bloquer TXS» ou «All» pour bloquer les messages de chat",
+ "congrats_setup": "félicitations, vous êtes tous mis en place!",
"decide_block": "décider quoi bloquer",
"downloading_encryption_keys": "downloading encryption keys",
"name_address": "nom ou adresse",
- "no_account": "Aucun compte enregistré",
+ "no_account": "aucun compte enregistré",
"no_minimum_length": "il n'y a pas de durée minimale",
- "no_secret_key_published": "Aucune clé secrète publiée encore",
- "fetching_admin_secret_key": "Recherche la clé secrète des administrateurs",
- "fetching_group_secret_key": "Recherche de clés secrètes de groupe",
+ "no_secret_key_published": "aucune clé secrète publiée encore",
+ "fetching_admin_secret_key": "recherche la clé secrète des administrateurs",
+ "fetching_group_secret_key": "recherche de clés secrètes de groupe",
"last_encryption_date": "last encryption date: {{ date }} by {{ name }}",
"locating_encryption_keys": "locating encryption keys",
- "keep_secure": "Gardez votre fichier de compte sécurisé",
- "publishing_key": "Rappel: Après avoir publié la clé, il faudra quelques minutes pour qu'il apparaisse. Veuillez juste attendre.",
+ "keep_secure": "gardez votre fichier de compte sécurisé",
+ "publishing_key": "rappel: Après avoir publié la clé, il faudra quelques minutes pour qu'il apparaisse. Veuillez juste attendre.",
"seedphrase_notice": "a SEEDPHRASE has been randomly generated in the background.",
- "turn_local_node": "Veuillez allumer votre nœud local",
- "type_seed": "Tapez ou collez dans votre phrase de graines",
- "your_accounts": "Vos comptes enregistrés"
+ "turn_local_node": "veuillez allumer votre nœud local",
+ "type_seed": "tapez ou collez dans votre phrase de graines",
+ "your_accounts": "vos comptes enregistrés"
},
"success": {
- "reencrypted_secret_key": "Réciter avec succès la clé secrète. Il peut prendre quelques minutes pour que les modifications se propagent. Actualiser le groupe en 5 minutes."
+ "reencrypted_secret_key": "réciter avec succès la clé secrète. Il peut prendre quelques minutes pour que les modifications se propagent. Actualiser le groupe en 5 minutes."
}
},
"node": {
- "choose": "Choisissez le nœud personnalisé",
+ "choose": "choisissez le nœud personnalisé",
"custom_many": "nœuds personnalisés",
- "use_custom": "Utiliser le nœud personnalisé",
- "use_local": "Utiliser le nœud local",
- "using": "Utilisation du nœud",
- "using_public": "Utilisation du nœud public",
+ "use_custom": "utiliser le nœud personnalisé",
+ "use_local": "utiliser le nœud local",
+ "using": "utilisation du nœud",
+ "using_public": "utilisation du nœud public",
"using_public_gateway": "using public node: {{ gateway }}"
},
"note": "note",
"password": "mot de passe",
- "password_confirmation": "Confirmez le mot de passe",
+ "password_confirmation": "confirmez le mot de passe",
"seed_phrase": "phrase de graines",
- "seed_your": "Votre phrase de graines",
+ "seed_your": "votre phrase de graines",
"tips": {
- "additional_wallet": "Utilisez cette option pour connecter des portefeuilles Qortal supplémentaires que vous avez déjà fabriqués, afin de vous connecter par la suite. Vous aurez besoin d'accéder à votre fichier JSON de sauvegarde afin de le faire.",
- "digital_id": "Votre portefeuille est comme votre ID numérique sur Qortal, et c'est comment vous vous connectez à l'interface utilisateur Qortal. Il détient votre adresse publique et le nom Qortal que vous allez éventuellement choisir. Chaque transaction que vous effectuez est liée à votre identifiant, et c'est là que vous gérez tous vos Qort et autres crypto-monnaies négociables sur Qortal.",
- "existing_account": "Vous avez déjà un compte Qortal? Entrez ici votre phrase de sauvegarde secrète pour y accéder. Cette phrase est l'une des façons de récupérer votre compte.",
- "key_encrypt_admin": "Cette clé est de crypter le contenu lié à l'administrateur. Seuls les administrateurs verraient du contenu chiffré avec.",
- "key_encrypt_group": "Cette clé est de chiffrer le contenu lié au groupe. C'est le seul utilisé dans cette interface utilisateur pour l'instant. Tous les membres du groupe pourront voir du contenu crypté avec cette clé.",
- "new_account": "La création d'un compte signifie créer un nouvel portefeuille et un nouvel ID numérique pour commencer à utiliser Qortal. Une fois que vous avez créé votre compte, vous pouvez commencer à faire des choses comme obtenir du Qort, acheter un nom et un avatar, publier des vidéos et des blogs, et bien plus encore.",
- "new_users": "Les nouveaux utilisateurs commencent ici!",
- "safe_place": "Enregistrez votre compte dans un endroit où vous vous en souviendrez!",
- "view_seedphrase": "Si vous souhaitez afficher la phrase de graines, cliquez sur le mot «SeedPhrase» dans ce texte. Les phrases de graines sont utilisées pour générer la clé privée pour votre compte Qortal. Pour la sécurité par défaut, les phrases de graines ne sont affichées que si elles sont spécifiquement choisies.",
- "wallet_secure": "Gardez votre fichier de portefeuille sécurisé."
+ "additional_wallet": "utilisez cette option pour connecter des portefeuilles Qortal supplémentaires que vous avez déjà fabriqués, afin de vous connecter par la suite. Vous aurez besoin d'accéder à votre fichier JSON de sauvegarde afin de le faire.",
+ "digital_id": "votre portefeuille est comme votre ID numérique sur Qortal, et c'est comment vous vous connectez à l'interface utilisateur Qortal. Il détient votre adresse publique et le nom Qortal que vous allez éventuellement choisir. Chaque transaction que vous effectuez est liée à votre identifiant, et c'est là que vous gérez tous vos Qort et autres crypto-monnaies négociables sur Qortal.",
+ "existing_account": "vous avez déjà un compte Qortal? Entrez ici votre phrase de sauvegarde secrète pour y accéder. Cette phrase est l'une des façons de récupérer votre compte.",
+ "key_encrypt_admin": "cette clé est de crypter le contenu lié à l'administrateur. Seuls les administrateurs verraient du contenu chiffré avec.",
+ "key_encrypt_group": "cette clé est de chiffrer le contenu lié au groupe. C'est le seul utilisé dans cette interface utilisateur pour l'instant. Tous les membres du groupe pourront voir du contenu crypté avec cette clé.",
+ "new_account": "la création d'un compte signifie créer un nouvel portefeuille et un nouvel ID numérique pour commencer à utiliser Qortal. Une fois que vous avez créé votre compte, vous pouvez commencer à faire des choses comme obtenir du Qort, acheter un nom et un avatar, publier des vidéos et des blogs, et bien plus encore.",
+ "new_users": "les nouveaux utilisateurs commencent ici!",
+ "safe_place": "enregistrez votre compte dans un endroit où vous vous en souviendrez!",
+ "view_seedphrase": "si vous souhaitez afficher la phrase de graines, cliquez sur le mot «SeedPhrase» dans ce texte. Les phrases de graines sont utilisées pour générer la clé privée pour votre compte Qortal. Pour la sécurité par défaut, les phrases de graines ne sont affichées que si elles sont spécifiquement choisies.",
+ "wallet_secure": "gardez votre fichier de portefeuille sécurisé."
},
"wallet": {
- "password_confirmation": "Confirmer le mot de passe du portefeuille",
+ "password_confirmation": "confirmer le mot de passe du portefeuille",
"password": "mot de passe du portefeuille",
- "keep_password": "Gardez le mot de passe actuel",
+ "keep_password": "gardez le mot de passe actuel",
"new_password": "nouveau mot de passe",
"error": {
- "missing_new_password": "Veuillez saisir un nouveau mot de passe",
- "missing_password": "Veuillez saisir votre mot de passe"
+ "missing_new_password": "veuillez saisir un nouveau mot de passe",
+ "missing_password": "veuillez saisir votre mot de passe"
}
},
"welcome": "bienvenue"
diff --git a/src/i18n/locales/fr/core.json b/src/i18n/locales/fr/core.json
index 85c4b43..0dcca9d 100644
--- a/src/i18n/locales/fr/core.json
+++ b/src/i18n/locales/fr/core.json
@@ -4,43 +4,43 @@
"access": "accéder",
"access_app": "application d'accès",
"add": "ajouter",
- "add_custom_framework": "Ajouter un cadre personnalisé",
+ "add_custom_framework": "ajouter un cadre personnalisé",
"add_reaction": "ajouter une réaction",
- "add_theme": "Ajouter le thème",
+ "add_theme": "ajouter le thème",
"backup_account": "compte de sauvegarde",
"backup_wallet": "portefeuille de secours",
- "cancel": "Annuler",
- "cancel_invitation": "Annuler l'invitation",
+ "cancel": "annuler",
+ "cancel_invitation": "annuler l'invitation",
"change": "changement",
"change_avatar": "changer d'avatar",
"change_file": "modifier le fichier",
"change_language": "changer la langue",
"choose": "choisir",
- "choose_file": "Choisir le fichier",
- "choose_image": "Choisir l'image",
- "choose_logo": "Choisissez un logo",
- "choose_name": "Choisissez un nom",
+ "choose_file": "choisir le fichier",
+ "choose_image": "choisir l'image",
+ "choose_logo": "choisissez un logo",
+ "choose_name": "choisissez un nom",
"close": "fermer",
- "close_chat": "Fermer le chat direct",
+ "close_chat": "fermer le chat direct",
"continue": "continuer",
"continue_logout": "continuer à se déconnecter",
- "copy_link": "Copier le lien",
+ "copy_link": "copier le lien",
"create_apps": "créer des applications",
"create_file": "créer un fichier",
"create_transaction": "créer des transactions sur la blockchain Qortal",
- "create_thread": "Créer un fil",
+ "create_thread": "créer un fil",
"decline": "déclin",
"decrypt": "décrypter",
- "disable_enter": "Désactiver Entrer",
+ "disable_enter": "désactiver Entrer",
"download": "télécharger",
- "download_file": "Télécharger le fichier",
+ "download_file": "télécharger le fichier",
"edit": "modifier",
- "edit_theme": "Modifier le thème",
- "enable_dev_mode": "Activer le mode Dev",
- "enter_name": "Entrez un nom",
+ "edit_theme": "modifier le thème",
+ "enable_dev_mode": "activer le mode Dev",
+ "enter_name": "entrez un nom",
"export": "exporter",
- "get_qort": "Obtenez Qort",
- "get_qort_trade": "Obtenez Qort à Q-trade",
+ "get_qort": "obtenez Qort",
+ "get_qort_trade": "obtenez Qort à Q-trade",
"hide": "cacher",
"import": "importer",
"import_theme": "thème d'importation",
@@ -48,7 +48,7 @@
"invite_member": "inviter un nouveau membre",
"join": "rejoindre",
"leave_comment": "laisser un commentaire",
- "load_announcements": "Chargez des annonces plus anciennes",
+ "load_announcements": "chargez des annonces plus anciennes",
"login": "se connecter",
"logout": "déconnexion",
"new": {
@@ -61,39 +61,39 @@
"open": "ouvrir",
"pin": "épingle",
"pin_app": "application PIN",
- "pin_from_dashboard": "Pin du tableau de bord",
+ "pin_from_dashboard": "pin du tableau de bord",
"post": "poste",
- "post_message": "Message de publication",
+ "post_message": "message de publication",
"publish": "publier",
- "publish_app": "Publiez votre application",
- "publish_comment": "Publier un commentaire",
+ "publish_app": "publiez votre application",
+ "publish_comment": "publier un commentaire",
"register_name": "nom de registre",
"remove": "retirer",
"remove_reaction": "éliminer la réaction",
- "return_apps_dashboard": "Retour au tableau de bord Apps",
+ "return_apps_dashboard": "retour au tableau de bord Apps",
"save": "sauvegarder",
"save_disk": "Économiser sur le disque",
"search": "recherche",
- "search_apps": "Rechercher des applications",
+ "search_apps": "rechercher des applications",
"search_groups": "rechercher des groupes",
- "search_chat_text": "Texte de chat de recherche",
- "select_app_type": "Sélectionner le type d'application",
- "select_category": "Sélectionner la catégorie",
- "select_name_app": "Sélectionnez Nom / App",
+ "search_chat_text": "texte de chat de recherche",
+ "select_app_type": "sélectionner le type d'application",
+ "select_category": "sélectionner la catégorie",
+ "select_name_app": "sélectionnez Nom / App",
"send": "envoyer",
- "send_qort": "Envoyer Qort",
- "set_avatar": "Définir l'avatar",
+ "send_qort": "envoyer Qort",
+ "set_avatar": "définir l'avatar",
"show": "montrer",
"show_poll": "montrer le sondage",
- "start_minting": "Commencer à frapper",
- "start_typing": "Commencez à taper ici ...",
- "trade_qort": "Trade Qort",
- "transfer_qort": "Transférer Qort",
+ "start_minting": "commencer à frapper",
+ "start_typing": "commencez à taper ici ...",
+ "trade_qort": "trade Qort",
+ "transfer_qort": "transférer Qort",
"unpin": "détacher",
- "unpin_app": "Appin Upin",
- "unpin_from_dashboard": "UNIN DU Tableau de bord",
+ "unpin_app": "appin Upin",
+ "unpin_from_dashboard": "uNIN DU Tableau de bord",
"update": "mise à jour",
- "update_app": "Mettez à jour votre application",
+ "update_app": "mettez à jour votre application",
"vote": "voter"
},
"address_your": "ton adress",
@@ -107,12 +107,13 @@
"app": "appliquer",
"app_other": "applications",
"app_name": "nom de l'application",
+ "app_private": "privé",
"app_service_type": "type de service d'application",
- "apps_dashboard": "Tableau de bord Apps",
- "apps_official": "Applications officielles",
+ "apps_dashboard": "tableau de bord Apps",
+ "apps_official": "applications officielles",
"attachment": "pièce jointe",
"balance": "équilibre:",
- "basic_tabs_example": "Exemple de base des onglets",
+ "basic_tabs_example": "exemple de base des onglets",
"category": "catégorie",
"category_other": "catégories",
"chat": "chat",
@@ -120,7 +121,7 @@
"contact_other": "contacts",
"core": {
"block_height": "hauteur de blocage",
- "information": "Informations de base",
+ "information": "informations de base",
"peers": "pairs connectés",
"version": "version de base"
},
@@ -129,7 +130,7 @@
"dev_mode": "mode de développement",
"domain": "domaine",
"ui": {
- "version": "Version d'interface utilisateur"
+ "version": "version d'interface utilisateur"
},
"count": {
"none": "aucun",
@@ -138,164 +139,163 @@
"description": "description",
"devmode_apps": "applications de mode dev",
"directory": "annuaire",
- "downloading_qdn": "Téléchargement à partir de QDN",
+ "downloading_qdn": "téléchargement à partir de QDN",
"fee": {
- "payment": "Frais de paiement",
- "publish": "Publier les frais"
+ "payment": "frais de paiement",
+ "publish": "publier les frais"
},
"for": "pour",
"general": "général",
- "general_settings": "Paramètres généraux",
+ "general_settings": "paramètres généraux",
"home": "maison",
"identifier": "identifiant",
- "image_embed": "Image intégrer",
+ "image_embed": "image intégrer",
"last_height": "dernière hauteur",
"level": "niveau",
"library": "bibliothèque",
"list": {
"bans": "liste des interdictions",
"groups": "liste des groupes",
- "invite": "liste d'invitation",
"invites": "liste des invitations",
"join_request": "JOINT LISTE DE REQUES",
"member": "liste des membres",
"members": "liste des membres"
},
"loading": {
- "announcements": "Annonces de chargement",
+ "announcements": "annonces de chargement",
"generic": "chargement...",
- "chat": "Chargement de chat ... Veuillez patienter.",
- "comments": "Chargement des commentaires ... Veuillez patienter.",
- "posts": "Chargement des messages ... Veuillez patienter."
+ "chat": "chargement de chat ... Veuillez patienter.",
+ "comments": "chargement des commentaires ... Veuillez patienter.",
+ "posts": "chargement des messages ... Veuillez patienter."
},
"member": "membre",
"member_other": "membres",
- "message_us": "Veuillez nous envoyer un message sur Telegram ou Discord si vous avez besoin de 4 Qort pour commencer à discuter sans aucune limitation",
+ "message_us": "veuillez nous envoyer un message sur Telegram ou Discord si vous avez besoin de 4 Qort pour commencer à discuter sans aucune limitation",
"message": {
"error": {
- "address_not_found": "Votre adresse n'a pas été trouvée",
- "app_need_name": "Votre application a besoin d'un nom",
- "build_app": "Impossible de créer une application privée",
- "decrypt_app": "Impossible de décrypter l'application privée '",
- "download_image": "Impossible de télécharger l'image. Veuillez réessayer plus tard en cliquant sur le bouton Actualiser",
- "download_private_app": "Impossible de télécharger l'application privée",
- "encrypt_app": "Impossible de crypter l'application. Application non publiée '",
- "fetch_app": "Impossible de récupérer l'application",
- "fetch_publish": "Impossible de récupérer la publication",
+ "address_not_found": "votre adresse n'a pas été trouvée",
+ "app_need_name": "votre application a besoin d'un nom",
+ "build_app": "impossible de créer une application privée",
+ "decrypt_app": "impossible de décrypter l'application privée '",
+ "download_image": "impossible de télécharger l'image. Veuillez réessayer plus tard en cliquant sur le bouton Actualiser",
+ "download_private_app": "impossible de télécharger l'application privée",
+ "encrypt_app": "impossible de crypter l'application. Application non publiée '",
+ "fetch_app": "impossible de récupérer l'application",
+ "fetch_publish": "impossible de récupérer la publication",
"file_too_large": "file {{ filename }} is too large. Max size allowed is {{ size }} MB.",
- "generic": "Une erreur s'est produite",
+ "generic": "une erreur s'est produite",
"initiate_download": "Échec du téléchargement",
"invalid_amount": "montant non valide",
- "invalid_base64": "Données non valides Base64",
+ "invalid_base64": "données non valides Base64",
"invalid_embed_link": "lien d'intégration non valide",
"invalid_image_embed_link_name": "lien d'intégration d'image non valide. Param manquant.",
"invalid_poll_embed_link_name": "lien d'intégration de sondage non valide. Nom manquant.",
"invalid_signature": "signature non valide",
"invalid_theme_format": "format de thème non valide",
"invalid_zip": "zip non valide",
- "message_loading": "Message de chargement d'erreur.",
+ "message_loading": "message de chargement d'erreur.",
"message_size": "your message size is of {{ size }} bytes out of a maximum of {{ maximum }}",
- "minting_account_add": "Impossible d'ajouter un compte de pénitence",
- "minting_account_remove": "Impossible de supprimer le compte de pénitence",
+ "minting_account_add": "impossible d'ajouter un compte de pénitence",
+ "minting_account_remove": "impossible de supprimer le compte de pénitence",
"missing_fields": "missing: {{ fields }}",
- "navigation_timeout": "Délai de navigation",
+ "navigation_timeout": "délai de navigation",
"network_generic": "erreur de réseau",
- "password_not_matching": "Les champs de mot de passe ne correspondent pas!",
- "password_wrong": "Impossible d'authentifier. Mauvais mot de passe",
- "publish_app": "Impossible de publier l'application",
- "publish_image": "Impossible de publier l'image",
- "rate": "Impossible de noter",
- "rating_option": "Impossible de trouver l'option de notation",
- "save_qdn": "Impossible d'économiser sur QDN",
+ "password_not_matching": "les champs de mot de passe ne correspondent pas!",
+ "password_wrong": "impossible d'authentifier. Mauvais mot de passe",
+ "publish_app": "impossible de publier l'application",
+ "publish_image": "impossible de publier l'image",
+ "rate": "impossible de noter",
+ "rating_option": "impossible de trouver l'option de notation",
+ "save_qdn": "impossible d'économiser sur QDN",
"send_failed": "Échec de l'envoi",
"update_failed": "Échec de la mise à jour",
- "vote": "Impossible de voter"
+ "vote": "impossible de voter"
},
"generic": {
- "already_voted": "Vous avez déjà voté.",
+ "already_voted": "vous avez déjà voté.",
"avatar_size": "{{ size }} KB max. for GIFS",
- "benefits_qort": "Avantages d'avoir QORT",
+ "benefits_qort": "avantages d'avoir QORT",
"building": "bâtiment",
"building_app": "application de construction",
"created_by": "created by {{ owner }}",
"buy_order_request": "the Application
{{hostname}}
is requesting {{count}} buy order",
"buy_order_request_other": "the Application
{{hostname}}
is requesting {{count}} buy orders",
- "devmode_local_node": "Veuillez utiliser votre nœud local pour le mode Dev! Déconnectez-vous et utilisez le nœud local.",
+ "devmode_local_node": "veuillez utiliser votre nœud local pour le mode Dev! Déconnectez-vous et utilisez le nœud local.",
"downloading": "téléchargement",
- "downloading_decrypting_app": "Téléchargement et décryptez l'application privée.",
+ "downloading_decrypting_app": "téléchargement et décryptez l'application privée.",
"edited": "édité",
- "editing_message": "Message d'édition",
+ "editing_message": "message d'édition",
"encrypted": "crypté",
"encrypted_not": "pas crypté",
"fee_qort": "fee: {{ message }} QORT",
- "fetching_data": "Rechercher les données de l'application",
+ "fetching_data": "rechercher les données de l'application",
"foreign_fee": "foreign fee: {{ message }}",
- "get_qort_trade_portal": "Obtenez Qort en utilisant le portail commercial de Crosschain de Qortal",
+ "get_qort_trade_portal": "obtenez Qort en utilisant le portail commercial de Crosschain de Qortal",
"minimal_qort_balance": "having at least {{ quantity }} QORT in your balance (4 qort balance for chat, 1.25 for name, 0.75 for some transactions)",
"mentioned": "mentionné",
- "message_with_image": "Ce message a déjà une image",
+ "message_with_image": "ce message a déjà une image",
"most_recent_payment": "{{ count }} most recent payment",
"name_available": "{{ name }} is available",
- "name_benefits": "Avantages d'un nom",
- "name_checking": "Vérifier si le nom existe déjà",
- "name_preview": "Vous avez besoin d'un nom pour utiliser l'aperçu",
- "name_publish": "Vous avez besoin d'un nom Qortal pour publier",
- "name_rate": "Vous avez besoin d'un nom pour évaluer.",
+ "name_benefits": "avantages d'un nom",
+ "name_checking": "vérifier si le nom existe déjà",
+ "name_preview": "vous avez besoin d'un nom pour utiliser l'aperçu",
+ "name_publish": "vous avez besoin d'un nom Qortal pour publier",
+ "name_rate": "vous avez besoin d'un nom pour évaluer.",
"name_registration": "your balance is {{ balance }} QORT. A name registration requires a {{ fee }} QORT fee",
"name_unavailable": "{{ name }} is unavailable",
- "no_data_image": "Aucune donnée pour l'image",
- "no_description": "Aucune description",
+ "no_data_image": "aucune donnée pour l'image",
+ "no_description": "aucune description",
"no_messages": "pas de messages",
- "no_minting_details": "Impossible d'afficher les détails de la passerelle sur la passerelle",
+ "no_minting_details": "impossible d'afficher les détails de la passerelle sur la passerelle",
"no_notifications": "pas de nouvelles notifications",
- "no_payments": "Aucun paiement",
- "no_pinned_changes": "Vous n'avez actuellement aucune modification à vos applications épinglées",
- "no_results": "Aucun résultat",
- "one_app_per_name": "Remarque: Actuellement, une seule application et site Web est autorisée par nom.",
+ "no_payments": "aucun paiement",
+ "no_pinned_changes": "vous n'avez actuellement aucune modification à vos applications épinglées",
+ "no_results": "aucun résultat",
+ "one_app_per_name": "remarque: Actuellement, une seule application et site Web est autorisée par nom.",
"opened": "ouvert",
"overwrite_qdn": "Écraser à QDN",
- "password_confirm": "Veuillez confirmer un mot de passe",
- "password_enter": "Veuillez saisir un mot de passe",
+ "password_confirm": "veuillez confirmer un mot de passe",
+ "password_enter": "veuillez saisir un mot de passe",
"payment_request": "the Application
{{hostname}}
is requesting a payment",
"people_reaction": "people who reacted with {{ reaction }}",
- "processing_transaction": "La transaction de traitement est-elle, veuillez patienter ...",
- "publish_data": "Publier des données à Qortal: n'importe quoi, des applications aux vidéos. Entièrement décentralisé!",
- "publishing": "Publication ... Veuillez patienter.",
- "qdn": "Utiliser une économie QDN",
+ "processing_transaction": "la transaction de traitement est-elle, veuillez patienter ...",
+ "publish_data": "publier des données à Qortal: n'importe quoi, des applications aux vidéos. Entièrement décentralisé!",
+ "publishing": "publication ... Veuillez patienter.",
+ "qdn": "utiliser une économie QDN",
"rating": "rating for {{ service }} {{ name }}",
- "register_name": "Vous avez besoin d'un nom Qortal enregistré pour enregistrer vos applications épinglées sur QDN.",
+ "register_name": "vous avez besoin d'un nom Qortal enregistré pour enregistrer vos applications épinglées sur QDN.",
"replied_to": "replied to {{ person }}",
"revert_default": "revenir à la valeur par défaut",
"revert_qdn": "revenir à QDN",
- "save_qdn": "Enregistrer sur QDN",
+ "save_qdn": "enregistrer sur QDN",
"secure_ownership": "sécuriser la propriété des données publiées par votre nom. Vous pouvez même vendre votre nom, ainsi que vos données à un tiers.",
- "select_file": "Veuillez sélectionner un fichier",
- "select_image": "Veuillez sélectionner une image pour un logo",
- "select_zip": "Sélectionnez un fichier .zip contenant du contenu statique:",
+ "select_file": "veuillez sélectionner un fichier",
+ "select_image": "veuillez sélectionner une image pour un logo",
+ "select_zip": "sélectionnez un fichier .zip contenant du contenu statique:",
"sending": "envoi...",
- "settings": "Vous utilisez la manière d'exportation / importation d'enregistrement des paramètres.",
- "space_for_admins": "Désolé, cet espace est uniquement pour les administrateurs.",
- "unread_messages": "Messages non lus ci-dessous",
- "unsaved_changes": "Vous avez des modifications non enregistrées à vos applications épinglées. Enregistrez-les sur QDN.",
+ "settings": "vous utilisez la manière d'exportation / importation d'enregistrement des paramètres.",
+ "space_for_admins": "désolé, cet espace est uniquement pour les administrateurs.",
+ "unread_messages": "messages non lus ci-dessous",
+ "unsaved_changes": "vous avez des modifications non enregistrées à vos applications épinglées. Enregistrez-les sur QDN.",
"updating": "mise à jour"
},
"message": "message",
- "promotion_text": "Texte de promotion",
+ "promotion_text": "texte de promotion",
"question": {
- "accept_vote_on_poll": "Acceptez-vous cette transaction vote_on_poll? Les sondages sont publics!",
+ "accept_vote_on_poll": "acceptez-vous cette transaction vote_on_poll? Les sondages sont publics!",
"logout": "Êtes-vous sûr que vous aimeriez vous connecter?",
"new_user": "Êtes-vous un nouvel utilisateur?",
- "delete_chat_image": "Souhaitez-vous supprimer votre image de chat précédente?",
+ "delete_chat_image": "souhaitez-vous supprimer votre image de chat précédente?",
"perform_transaction": "would you like to perform a {{action}} transaction?",
- "provide_thread": "Veuillez fournir un titre de fil",
- "publish_app": "Souhaitez-vous publier cette application?",
- "publish_avatar": "Souhaitez-vous publier un avatar?",
- "publish_qdn": "Souhaitez-vous publier vos paramètres sur QDN (Ecrypted)?",
- "overwrite_changes": "L'application n'a pas été en mesure de télécharger vos applications épinglées existantes existantes. Souhaitez-vous écraser ces changements?",
+ "provide_thread": "veuillez fournir un titre de fil",
+ "publish_app": "souhaitez-vous publier cette application?",
+ "publish_avatar": "souhaitez-vous publier un avatar?",
+ "publish_qdn": "souhaitez-vous publier vos paramètres sur QDN (Ecrypted)?",
+ "overwrite_changes": "l'application n'a pas été en mesure de télécharger vos applications épinglées existantes existantes. Souhaitez-vous écraser ces changements?",
"rate_app": "would you like to rate this app a rating of {{ rate }}?. It will create a POLL tx.",
- "register_name": "Souhaitez-vous enregistrer ce nom?",
- "reset_pinned": "Vous n'aimez pas vos changements locaux actuels? Souhaitez-vous réinitialiser les applications épinglées par défaut?",
- "reset_qdn": "Vous n'aimez pas vos changements locaux actuels? Souhaitez-vous réinitialiser avec vos applications QDN enregistrées?",
+ "register_name": "souhaitez-vous enregistrer ce nom?",
+ "reset_pinned": "vous n'aimez pas vos changements locaux actuels? Souhaitez-vous réinitialiser les applications épinglées par défaut?",
+ "reset_qdn": "vous n'aimez pas vos changements locaux actuels? Souhaitez-vous réinitialiser avec vos applications QDN enregistrées?",
"transfer_qort": "would you like to transfer {{ amount }} QORT"
},
"status": {
@@ -305,12 +305,12 @@
"synchronizing": "synchronisation"
},
"success": {
- "order_submitted": "Votre commande d'achat a été soumise",
+ "order_submitted": "votre commande d'achat a été soumise",
"published": "publié avec succès. Veuillez patienter quelques minutes pour que le réseau propage les modifications.",
"published_qdn": "publié avec succès sur QDN",
"rated_app": "Évalué avec succès. Veuillez patienter quelques minutes pour que le réseau propage les modifications.",
"request_read": "J'ai lu cette demande",
- "transfer": "Le transfert a réussi!",
+ "transfer": "le transfert a réussi!",
"voted": "voté avec succès. Veuillez patienter quelques minutes pour que le réseau propage les modifications."
}
},
@@ -321,6 +321,7 @@
"none": "aucun",
"note": "note",
"option": "option",
+ "option_no": "aucune option",
"option_other": "options",
"page": {
"last": "dernier",
@@ -328,7 +329,7 @@
"next": "suivant",
"previous": "précédent"
},
- "payment_notification": "Notification de paiement",
+ "payment_notification": "notification de paiement",
"payment": "paiement",
"poll_embed": "sondage",
"port": "port",
@@ -362,7 +363,7 @@
},
"thread": "fil",
"thread_other": "threads",
- "thread_title": "Titre du fil",
+ "thread_title": "titre du fil",
"time": {
"day_one": "{{count}} day",
"day_other": "{{count}} days",
@@ -375,7 +376,7 @@
"title": "titre",
"to": "à",
"tutorial": "tutoriel",
- "url": "URL",
+ "url": "uRL",
"user_lookup": "recherche d'utilisateur",
"vote": "voter",
"vote_other": "{{ count }} votes",
diff --git a/src/i18n/locales/fr/group.json b/src/i18n/locales/fr/group.json
index 4236cf4..d31c026 100644
--- a/src/i18n/locales/fr/group.json
+++ b/src/i18n/locales/fr/group.json
@@ -1,45 +1,44 @@
{
"action": {
- "add_promotion": "Ajouter la promotion",
- "ban": "Interdire le membre du groupe",
- "cancel_ban": "Annuler l'interdiction",
- "copy_private_key": "Copier la clé privée",
+ "add_promotion": "ajouter la promotion",
+ "ban": "interdire le membre du groupe",
+ "cancel_ban": "annuler l'interdiction",
+ "copy_private_key": "copier la clé privée",
"create_group": "créer un groupe",
- "disable_push_notifications": "Désactiver toutes les notifications push",
+ "disable_push_notifications": "désactiver toutes les notifications push",
"export_password": "mot de passe d'exportation",
- "export_private_key": "Exporter la clé privée",
+ "export_private_key": "exporter la clé privée",
"find_group": "trouver un groupe",
"join_group": "se joindre au groupe",
"kick_member": "Kick Member du groupe",
"invite_member": "inviter un membre",
"leave_group": "quitter le groupe",
- "load_members": "Chargez les membres avec des noms",
+ "load_members": "chargez les membres avec des noms",
"make_admin": "faire un administrateur",
"manage_members": "gérer les membres",
- "promote_group": "Promouvoir votre groupe auprès des non-membres",
- "publish_announcement": "Publier l'annonce",
- "publish_avatar": "Publier Avatar",
+ "promote_group": "promouvoir votre groupe auprès des non-membres",
+ "publish_announcement": "publier l'annonce",
+ "publish_avatar": "publier Avatar",
"refetch_page": "page de réadaptation",
- "remove_admin": "Supprimer comme administrateur",
- "remove_minting_account": "Supprimer le compte de pénitence",
+ "remove_admin": "supprimer comme administrateur",
+ "remove_minting_account": "supprimer le compte de pénitence",
"return_to_thread": "retour aux fils",
- "scroll_bottom": "Faites défiler vers le bas",
- "scroll_unread_messages": "Faites défiler les messages non lus",
- "select_group": "Sélectionnez un groupe",
- "visit_q_mintership": "Visitez Q-Mintership"
+ "scroll_bottom": "faites défiler vers le bas",
+ "scroll_unread_messages": "faites défiler les messages non lus",
+ "select_group": "sélectionnez un groupe",
+ "visit_q_mintership": "visitez Q-Mintership"
},
"advanced_options": "options avancées",
- "ban_list": "liste d'interdiction",
"block_delay": {
- "minimum": "Retard de bloc minimum",
- "maximum": "Retard de bloc maximum"
+ "minimum": "retard de bloc minimum",
+ "maximum": "retard de bloc maximum"
},
"group": {
- "approval_threshold": "Seuil d'approbation du groupe",
+ "approval_threshold": "seuil d'approbation du groupe",
"avatar": "avatar de groupe",
- "closed": "Fermé (privé) - Les utilisateurs ont besoin d'une autorisation pour rejoindre",
- "description": "Description du groupe",
- "id": "ID de groupe",
+ "closed": "fermé (privé) - Les utilisateurs ont besoin d'une autorisation pour rejoindre",
+ "description": "description du groupe",
+ "id": "iD de groupe",
"invites": "invitations de groupe",
"group": "groupe",
"group_name": "group: {{ name }}",
@@ -51,82 +50,82 @@
"name": "nom de groupe",
"open": "ouvert (public)",
"private": "groupe privé",
- "promotions": "Promotions de groupe",
+ "promotions": "promotions de groupe",
"public": "groupe public",
"type": "type de groupe"
},
- "invitation_expiry": "Temps d'expiration de l'invitation",
- "invitees_list": "Liste des invités",
- "join_link": "Rejoignez le lien de groupe",
+ "invitation_expiry": "temps d'expiration de l'invitation",
+ "invitees_list": "liste des invités",
+ "join_link": "rejoignez le lien de groupe",
"join_requests": "joindre les demandes",
"last_message": "dernier message",
"last_message_date": "last message: {{date }}",
- "latest_mails": "Dernier Q-Mails",
+ "latest_mails": "dernier Q-Mails",
"message": {
"generic": {
"avatar_publish_fee": "publishing an Avatar requires {{ fee }}",
- "avatar_registered_name": "Un nom enregistré est nécessaire pour définir un avatar",
- "admin_only": "Seuls les groupes où vous êtes un administrateur seront affichés",
- "already_in_group": "Vous êtes déjà dans ce groupe!",
- "block_delay_minimum": "Délai de bloc minimum pour les approbations des transactions de groupe",
- "block_delay_maximum": "Délai de bloc maximum pour les approbations des transactions de groupe",
- "closed_group": "Il s'agit d'un groupe fermé / privé, vous devrez donc attendre qu'un administrateur accepte votre demande",
- "descrypt_wallet": "Portefeuille décrypteur ...",
- "encryption_key": "La première clé de chiffrement commune du groupe est en train de créer. Veuillez patienter quelques minutes pour qu'il soit récupéré par le réseau. Vérifier toutes les 2 minutes ...",
+ "avatar_registered_name": "un nom enregistré est nécessaire pour définir un avatar",
+ "admin_only": "seuls les groupes où vous êtes un administrateur seront affichés",
+ "already_in_group": "vous êtes déjà dans ce groupe!",
+ "block_delay_minimum": "délai de bloc minimum pour les approbations des transactions de groupe",
+ "block_delay_maximum": "délai de bloc maximum pour les approbations des transactions de groupe",
+ "closed_group": "il s'agit d'un groupe fermé / privé, vous devrez donc attendre qu'un administrateur accepte votre demande",
+ "descrypt_wallet": "portefeuille décrypteur ...",
+ "encryption_key": "la première clé de chiffrement commune du groupe est en train de créer. Veuillez patienter quelques minutes pour qu'il soit récupéré par le réseau. Vérifier toutes les 2 minutes ...",
"group_announcement": "annonces de groupe",
- "group_approval_threshold": "Seuil d'approbation du groupe (nombre / pourcentage d'administrateurs qui doivent approuver une transaction)",
+ "group_approval_threshold": "seuil d'approbation du groupe (nombre / pourcentage d'administrateurs qui doivent approuver une transaction)",
"group_encrypted": "groupe crypté",
"group_invited_you": "{{group}} has invited you",
- "group_key_created": "First Group Key créé.",
- "group_member_list_changed": "La liste des membres du groupe a changé. Veuillez réincrypter la clé secrète.",
- "group_no_secret_key": "Il n'y a pas de clé secrète de groupe. Soyez le premier administrateur à en publier un!",
- "group_secret_key_no_owner": "La dernière clé secrète de groupe a été publiée par un non-propriétaire. En tant que propriétaire du groupe, veuillez réincriner la clé en tant que sauvegarde.",
- "invalid_content": "Contenu, expéditeur ou horodatrice non valide dans les données de réaction",
- "invalid_data": "Erreur de chargement de contenu: données non valides",
- "latest_promotion": "Seule la dernière promotion de la semaine sera affichée pour votre groupe.",
- "loading_members": "Chargement de la liste des membres avec des noms ... Veuillez patienter.",
- "max_chars": "Max 200 caractères. Publier les frais",
- "manage_minting": "Gérez votre frappe",
- "minter_group": "Vous ne faites actuellement pas partie du groupe Minter",
- "mintership_app": "Visitez l'application Q-Mintership pour s'appliquer pour être un Minter",
- "minting_account": "Compte de presse:",
- "minting_keys_per_node": "Seules 2 touches de baisse sont autorisées par nœud. Veuillez en supprimer un si vous souhaitez la menthe avec ce compte.",
- "minting_keys_per_node_different": "Seules 2 touches de baisse sont autorisées par nœud. Veuillez en supprimer un si vous souhaitez ajouter un autre compte.",
- "next_level": "Blocs restants jusqu'au niveau suivant:",
- "node_minting": "Ce nœud est en cours:",
- "node_minting_account": "Comptes de frappe du nœud",
- "node_minting_key": "Vous avez actuellement une touche de frappe pour ce compte attaché à ce nœud",
- "no_announcement": "Aucune annonce",
- "no_display": "Rien à afficher",
- "no_selection": "Aucun groupe sélectionné",
- "not_part_group": "Vous ne faites pas partie du groupe de membres chiffrés. Attendez qu'un administrateur revienne les clés.",
- "only_encrypted": "Seuls les messages non cryptés seront affichés.",
- "only_private_groups": "Seuls les groupes privés seront affichés",
+ "group_key_created": "first Group Key créé.",
+ "group_member_list_changed": "la liste des membres du groupe a changé. Veuillez réincrypter la clé secrète.",
+ "group_no_secret_key": "il n'y a pas de clé secrète de groupe. Soyez le premier administrateur à en publier un!",
+ "group_secret_key_no_owner": "la dernière clé secrète de groupe a été publiée par un non-propriétaire. En tant que propriétaire du groupe, veuillez réincriner la clé en tant que sauvegarde.",
+ "invalid_content": "contenu, expéditeur ou horodatrice non valide dans les données de réaction",
+ "invalid_data": "erreur de chargement de contenu: données non valides",
+ "latest_promotion": "seule la dernière promotion de la semaine sera affichée pour votre groupe.",
+ "loading_members": "chargement de la liste des membres avec des noms ... Veuillez patienter.",
+ "max_chars": "max 200 caractères. Publier les frais",
+ "manage_minting": "gérez votre frappe",
+ "minter_group": "vous ne faites actuellement pas partie du groupe Minter",
+ "mintership_app": "visitez l'application Q-Mintership pour s'appliquer pour être un Minter",
+ "minting_account": "compte de presse:",
+ "minting_keys_per_node": "seules 2 touches de baisse sont autorisées par nœud. Veuillez en supprimer un si vous souhaitez la menthe avec ce compte.",
+ "minting_keys_per_node_different": "seules 2 touches de baisse sont autorisées par nœud. Veuillez en supprimer un si vous souhaitez ajouter un autre compte.",
+ "next_level": "blocs restants jusqu'au niveau suivant:",
+ "node_minting": "ce nœud est en cours:",
+ "node_minting_account": "comptes de frappe du nœud",
+ "node_minting_key": "vous avez actuellement une touche de frappe pour ce compte attaché à ce nœud",
+ "no_announcement": "aucune annonce",
+ "no_display": "rien à afficher",
+ "no_selection": "aucun groupe sélectionné",
+ "not_part_group": "vous ne faites pas partie du groupe de membres chiffrés. Attendez qu'un administrateur revienne les clés.",
+ "only_encrypted": "seuls les messages non cryptés seront affichés.",
+ "only_private_groups": "seuls les groupes privés seront affichés",
"pending_join_requests": "{{ group }} has {{ count }} pending join requests",
"private_key_copied": "clé privée copiée",
- "provide_message": "Veuillez fournir un premier message au fil",
- "secure_place": "Gardez votre clé privée dans un endroit sécurisé. Ne partagez pas!",
- "setting_group": "Configuration du groupe ... Veuillez patienter."
+ "provide_message": "veuillez fournir un premier message au fil",
+ "secure_place": "gardez votre clé privée dans un endroit sécurisé. Ne partagez pas!",
+ "setting_group": "configuration du groupe ... Veuillez patienter."
},
"error": {
- "access_name": "Impossible d'envoyer un message sans accès à votre nom",
+ "access_name": "impossible d'envoyer un message sans accès à votre nom",
"descrypt_wallet": "error decrypting wallet {{ message }}",
- "description_required": "Veuillez fournir une description",
- "group_info": "Impossible d'accéder aux informations du groupe",
+ "description_required": "veuillez fournir une description",
+ "group_info": "impossible d'accéder aux informations du groupe",
"group_join": "n'a pas réussi à rejoindre le groupe",
- "group_promotion": "Erreur de publication de la promotion. Veuillez réessayer",
- "group_secret_key": "Impossible d'obtenir une clé secrète de groupe",
- "name_required": "Veuillez fournir un nom",
- "notify_admins": "Essayez de notifier un administrateur à partir de la liste des administrateurs ci-dessous:",
+ "group_promotion": "erreur de publication de la promotion. Veuillez réessayer",
+ "group_secret_key": "impossible d'obtenir une clé secrète de groupe",
+ "name_required": "veuillez fournir un nom",
+ "notify_admins": "essayez de notifier un administrateur à partir de la liste des administrateurs ci-dessous:",
"qortals_required": "you need at least {{ quantity }} QORT to send a message",
- "timeout_reward": "Délai d'attente en attente de confirmation de partage de récompense",
- "thread_id": "Impossible de localiser l'ID de fil",
- "unable_determine_group_private": "Impossible de déterminer si le groupe est privé",
- "unable_minting": "Impossible de commencer à faire"
+ "timeout_reward": "délai d'attente en attente de confirmation de partage de récompense",
+ "thread_id": "impossible de localiser l'ID de fil",
+ "unable_determine_group_private": "impossible de déterminer si le groupe est privé",
+ "unable_minting": "impossible de commencer à faire"
},
"success": {
- "group_ban": "Interdit avec succès le membre du groupe. Il peut prendre quelques minutes pour que les modifications se propagent",
- "group_creation": "Groupe créé avec succès. Il peut prendre quelques minutes pour que les modifications se propagent",
+ "group_ban": "interdit avec succès le membre du groupe. Il peut prendre quelques minutes pour que les modifications se propagent",
+ "group_creation": "groupe créé avec succès. Il peut prendre quelques minutes pour que les modifications se propagent",
"group_creation_name": "created group {{group_name}}: awaiting confirmation",
"group_creation_label": "created group {{name}}: success!",
"group_invite": "successfully invited {{invitee}}. It may take a couple of minutes for the changes to propagate",
@@ -140,27 +139,27 @@
"group_leave_name": "left group {{group_name}}: awaiting confirmation",
"group_leave_label": "left group {{name}}: success!",
"group_member_admin": "a réussi à faire des membres un administrateur. Il peut prendre quelques minutes pour que les modifications se propagent",
- "group_promotion": "Promotion publiée avec succès. Il peut prendre quelques minutes pour que la promotion apparaisse",
- "group_remove_member": "Retiré avec succès le membre en tant qu'administrateur. Il peut prendre quelques minutes pour que les modifications se propagent",
+ "group_promotion": "promotion publiée avec succès. Il peut prendre quelques minutes pour que la promotion apparaisse",
+ "group_remove_member": "retiré avec succès le membre en tant qu'administrateur. Il peut prendre quelques minutes pour que les modifications se propagent",
"invitation_cancellation": "invitation annulée avec succès. Il peut prendre quelques minutes pour que les modifications se propagent",
- "invitation_request": "Demande de jointure acceptée: en attente de confirmation",
- "loading_threads": "Chargement des threads ... Veuillez patienter.",
- "post_creation": "Post créé avec succès. Il peut prendre un certain temps à la publication pour se propager",
+ "invitation_request": "demande de jointure acceptée: en attente de confirmation",
+ "loading_threads": "chargement des threads ... Veuillez patienter.",
+ "post_creation": "post créé avec succès. Il peut prendre un certain temps à la publication pour se propager",
"published_secret_key": "published secret key for group {{ group_id }}: awaiting confirmation",
"published_secret_key_label": "published secret key for group {{ group_id }}: success!",
"registered_name": "enregistré avec succès. Il peut prendre quelques minutes pour que les modifications se propagent",
- "registered_name_label": "Nom enregistré: En attente de confirmation. Cela peut prendre quelques minutes.",
- "registered_name_success": "Nom enregistré: Succès!",
- "rewardshare_add": "Ajouter des récompenses: en attente de confirmation",
- "rewardshare_add_label": "Ajoutez des récompenses: succès!",
- "rewardshare_creation": "Confirmer la création de récompenses sur la chaîne. Soyez patient, cela pourrait prendre jusqu'à 90 secondes.",
- "rewardshare_confirmed": "RÉCOMPRIMATION RÉFORMÉ. Veuillez cliquer sur Suivant.",
- "rewardshare_remove": "Supprimer les récompenses: en attente de confirmation",
- "rewardshare_remove_label": "Supprimer les récompenses: succès!",
+ "registered_name_label": "nom enregistré: En attente de confirmation. Cela peut prendre quelques minutes.",
+ "registered_name_success": "nom enregistré: Succès!",
+ "rewardshare_add": "ajouter des récompenses: en attente de confirmation",
+ "rewardshare_add_label": "ajoutez des récompenses: succès!",
+ "rewardshare_creation": "confirmer la création de récompenses sur la chaîne. Soyez patient, cela pourrait prendre jusqu'à 90 secondes.",
+ "rewardshare_confirmed": "rÉCOMPRIMATION RÉFORMÉ. Veuillez cliquer sur Suivant.",
+ "rewardshare_remove": "supprimer les récompenses: en attente de confirmation",
+ "rewardshare_remove_label": "supprimer les récompenses: succès!",
"thread_creation": "thread créé avec succès. Il peut prendre un certain temps à la publication pour se propager",
- "unbanned_user": "Utilisateur sans succès avec succès. Il peut prendre quelques minutes pour que les modifications se propagent",
- "user_joined": "L'utilisateur a rejoint avec succès!"
+ "unbanned_user": "utilisateur sans succès avec succès. Il peut prendre quelques minutes pour que les modifications se propagent",
+ "user_joined": "l'utilisateur a rejoint avec succès!"
}
},
- "thread_posts": "Nouveaux messages de fil"
+ "thread_posts": "nouveaux messages de fil"
}
diff --git a/src/i18n/locales/fr/question.json b/src/i18n/locales/fr/question.json
index 3ef124c..700c1ad 100644
--- a/src/i18n/locales/fr/question.json
+++ b/src/i18n/locales/fr/question.json
@@ -111,7 +111,7 @@
"provide_group_id": "please provide a groupId",
"read_transaction_carefully": "read the transaction carefully before accepting!",
"user_declined_add_list": "user declined add to list",
- "user_declined_delete_from_list": "User declined delete from list",
+ "user_declined_delete_from_list": "user declined delete from list",
"user_declined_delete_hosted_resources": "user declined delete hosted resources",
"user_declined_join": "user declined to join group",
"user_declined_list": "user declined to get list of hosted resources",
diff --git a/src/i18n/locales/fr/tutorial.json b/src/i18n/locales/fr/tutorial.json
index aad7e23..7e2f375 100644
--- a/src/i18n/locales/fr/tutorial.json
+++ b/src/i18n/locales/fr/tutorial.json
@@ -4,7 +4,7 @@
"3_groups": "3. Groupes Qortal",
"4_obtain_qort": "4. Obtention de Qort",
"account_creation": "création de compte",
- "important_info": "Informations importantes",
+ "important_info": "informations importantes",
"apps": {
"dashboard": "1. Tableau de bord Apps",
"navigation": "2. Navigation des applications"
diff --git a/src/i18n/locales/it/core.json b/src/i18n/locales/it/core.json
index 05ba1b3..b737add 100644
--- a/src/i18n/locales/it/core.json
+++ b/src/i18n/locales/it/core.json
@@ -27,11 +27,11 @@
"copy_link": "copia link",
"create_apps": "crea app",
"create_file": "crea file",
- "create_transaction": "crea transazioni sulla blockchain Qortal",
+ "create_transaction": "creare transazioni sulla blockchain Qortal",
"create_thread": "crea thread",
"decline": "rifiuta",
"decrypt": "decripta",
- "disable_enter": "disabilita inserire",
+ "disable_enter": "disabilita invio",
"download": "scarica",
"download_file": "scarica file",
"edit": "modifica",
@@ -44,7 +44,7 @@
"hide": "nascondi",
"hide_qr_code": "nascondi QR code",
"import": "importare",
- "import_theme": "tema di importazione",
+ "import_theme": "importa un tema",
"invite": "invitare",
"invite_member": "invita un nuovo membro",
"join": "unisciti",
@@ -60,8 +60,8 @@
},
"notify": "notifica",
"open": "apri",
- "pin": "appunta",
- "pin_app": "appunta app",
+ "pin": "blocca",
+ "pin_app": "blocca app",
"pin_from_dashboard": "pin dalla dashboard",
"post": "posta",
"post_message": "posta messaggio",
@@ -88,11 +88,11 @@
"show": "mostra",
"show_poll": "mostra il sondaggio",
"start_minting": "inizia a coniare",
- "start_typing": "inizia a digitare qui ...",
+ "start_typing": "puoi iniziare a digitare qui...",
"trade_qort": "scambia qort",
"transfer_qort": "trasferisci QORT",
- "unpin": "rimuovi pin",
- "unpin_app": "rimuovi pin app",
+ "unpin": "sblocca",
+ "unpin_app": "sblocca app",
"unpin_from_dashboard": "rimuovi dalla dashboard",
"update": "aggiorna",
"update_app": "aggiorna la tua app",
@@ -109,8 +109,9 @@
"app": "app",
"app_other": "app",
"app_name": "nome app",
+ "app_private": "privata",
"app_service_type": "tipo di servizio app",
- "apps_dashboard": "dashboard di app",
+ "apps_dashboard": "dashboard delle app",
"apps_official": "app ufficiali",
"attachment": "allegato",
"balance": "bilancia:",
@@ -155,9 +156,8 @@
"level": "livello",
"library": "biblioteca",
"list": {
- "bans": "elenco dei divieti",
- "groups": "elenco di gruppi",
- "invite": "elenco di inviti",
+ "bans": "elenco degli esclusi",
+ "groups": "elenco dei gruppi",
"invites": "elenco degli inviti",
"join_request": "elenco di richieste di iscrizione",
"member": "elenco dei membri",
@@ -265,7 +265,7 @@
"publishing": "publishing. Attendere, per favore.",
"qdn": "usa il salvataggio QDN",
"rating": "rating for {{ service }} {{ name }}",
- "register_name": "hai bisogno di un nome Qortal registrato per salvare le app bloccate a QDN.",
+ "register_name": "hai bisogno di un nome Qortal registrato per salvare in QDN le app bloccate.",
"replied_to": "replied to {{ person }}",
"revert_default": "ritorna a predefinito",
"revert_qdn": "ritorna a QDN",
@@ -323,6 +323,7 @@
"none": "nessuno",
"note": "nota",
"option": "opzione",
+ "option_no": "nessuna opzione",
"option_other": "opzioni",
"page": {
"last": "scorso",
@@ -377,7 +378,7 @@
"title": "titolo",
"to": "a",
"tutorial": "tutorial",
- "url": "URL",
+ "url": "uRL",
"user_lookup": "ricerca utente",
"vote": "votare",
"vote_other": "{{ count }} votes",
diff --git a/src/i18n/locales/it/group.json b/src/i18n/locales/it/group.json
index 786ed18..fe345c4 100644
--- a/src/i18n/locales/it/group.json
+++ b/src/i18n/locales/it/group.json
@@ -23,13 +23,12 @@
"remove_admin": "rimuovi da amministratore",
"remove_minting_account": "rimuovi l'account di minting",
"return_to_thread": "torna ai thread",
- "scroll_bottom": "scorri sul fondo",
+ "scroll_bottom": "scorri in fondo",
"scroll_unread_messages": "scendi ai messaggi non letti",
"select_group": "seleziona un gruppo",
"visit_q_mintership": "visita Q-Mintership"
},
"advanced_options": "opzioni avanzate",
- "ban_list": "elenco di divieto",
"block_delay": {
"minimum": "ritardo del blocco minimo",
"maximum": "ritardo massimo del blocco"
diff --git a/src/i18n/locales/it/question.json b/src/i18n/locales/it/question.json
index bd113e8..a276e35 100644
--- a/src/i18n/locales/it/question.json
+++ b/src/i18n/locales/it/question.json
@@ -50,7 +50,7 @@
"insufficient_balance_qort": "saldo QORT insufficiente",
"insufficient_balance": "saldo asset insufficiente",
"insufficient_funds": "fondi insufficienti",
- "invalid_encryption_iv": "IV non valido: AES-GCM richiede un IV di 12 byte",
+ "invalid_encryption_iv": "iV non valido: AES-GCM richiede un IV di 12 byte",
"invalid_encryption_key": "chiave non valida: AES-GCM richiede una chiave di 256 bit",
"invalid_fullcontent": "campo fullContent in formato non valido. Usa stringa, base64 o oggetto",
"invalid_receiver": "indirizzo o nome destinatario non valido",
diff --git a/src/i18n/locales/it/tutorial.json b/src/i18n/locales/it/tutorial.json
index 96fc539..cc3ced5 100644
--- a/src/i18n/locales/it/tutorial.json
+++ b/src/i18n/locales/it/tutorial.json
@@ -6,11 +6,11 @@
"account_creation": "creazione dell'account",
"important_info": "informazioni importanti",
"apps": {
- "dashboard": "1. Dashboard di app",
+ "dashboard": "1. Dashboard delle app",
"navigation": "2. Navigazione delle app"
},
"initial": {
- "recommended_qort_qty": "avere almeno {{ quantity }} QORT nel tuo wallet",
+ "recommended_qort_qty": "avere almeno {{ quantity }} QORT nel proprio wallet",
"explore": "esplora",
"general_chat": "chat generale",
"getting_started": "come iniziare",
diff --git a/src/i18n/locales/ja/auth.json b/src/i18n/locales/ja/auth.json
index 58bfc07..f60f4a9 100644
--- a/src/i18n/locales/ja/auth.json
+++ b/src/i18n/locales/ja/auth.json
@@ -40,9 +40,9 @@
"advanced_users": "上級ユーザー向け",
"apikey": {
"alternative": "代替:ファイル選択",
- "change": "Apikeyを変更します",
- "enter": "Apikeyを入力します",
- "import": "Apikeyをインポートします",
+ "change": "apikeyを変更します",
+ "enter": "apikeyを入力します",
+ "import": "apikeyをインポートします",
"key": "APIキー",
"select_valid": "有効なApikeyを選択します"
},
@@ -63,11 +63,11 @@
"find_secret_key": "正しいSecretKeyを見つけることができません",
"incorrect_password": "パスワードが正しくありません",
"invalid_qortal_link": "無効なQortalリンク",
- "invalid_secret_key": "SecretKeyは無効です",
+ "invalid_secret_key": "secretKeyは無効です",
"invalid_uint8": "提出したuint8arraydataは無効です",
"name_not_existing": "名前は存在しません",
"name_not_registered": "登録されていない名前",
- "read_blob_base64": "BASE64エンコード文字列としてBLOBを読み取れませんでした",
+ "read_blob_base64": "bASE64エンコード文字列としてBLOBを読み取れませんでした",
"reencrypt_secret_key": "シークレットキーを再構築することができません",
"set_apikey": "APIキーの設定に失敗しました:"
},
@@ -80,7 +80,7 @@
"decide_block": "ブロックするものを決定します",
"downloading_encryption_keys": "downloading encryption keys",
"fetching_admin_secret_key": "管理者の秘密の鍵を取得します",
- "fetching_group_secret_key": "Group Secret Keyの出版物を取得します",
+ "fetching_group_secret_key": "group Secret Keyの出版物を取得します",
"keep_secure": "アカウントファイルを安全に保ちます",
"last_encryption_date": "last encryption date: {{ date }} by {{ name }}",
"locating_encryption_keys": "locating encryption keys",
diff --git a/src/i18n/locales/ja/core.json b/src/i18n/locales/ja/core.json
index 26df517..9194451 100644
--- a/src/i18n/locales/ja/core.json
+++ b/src/i18n/locales/ja/core.json
@@ -31,12 +31,12 @@
"create_thread": "スレッドを作成します",
"decline": "衰退",
"decrypt": "復号化",
- "disable_enter": "Enterを無効にします",
+ "disable_enter": "enterを無効にします",
"download": "ダウンロード",
"download_file": "ファイルをダウンロードします",
"edit": "編集",
"edit_theme": "テーマを編集します",
- "enable_dev_mode": "DEVモードを有効にします",
+ "enable_dev_mode": "dEVモードを有効にします",
"enter_name": "名前を入力します",
"export": "輸出",
"get_qort": "QORTを取得します",
@@ -90,7 +90,7 @@
"trade_qort": "取引Qort",
"transfer_qort": "QORTを転送します",
"unpin": "unepin",
- "unpin_app": "UNPINアプリ",
+ "unpin_app": "uNPINアプリ",
"unpin_from_dashboard": "ダッシュボードからリプリッド",
"update": "アップデート",
"update_app": "アプリを更新します",
@@ -106,6 +106,7 @@
"app": "アプリ",
"app_other": "アプリ",
"app_name": "アプリ名",
+ "app_private": "プライベート",
"app_service_type": "アプリサービスタイプ",
"apps_dashboard": "アプリダッシュボード",
"apps_official": "公式アプリ",
@@ -128,7 +129,7 @@
"dev_mode": "開発モード",
"domain": "ドメイン",
"ui": {
- "version": "UIバージョン"
+ "version": "uIバージョン"
},
"count": {
"none": "なし",
@@ -154,7 +155,6 @@
"list": {
"bans": "禁止のリスト",
"groups": "グループのリスト",
- "invite": "リストを招待します",
"invites": "招待状のリスト",
"join_request": "リクエストリストに参加します",
"member": "メンバーリスト",
@@ -219,7 +219,7 @@
"created_by": "created by {{ owner }}",
"buy_order_request": "the Application
{{hostname}}
is requesting {{count}} buy order",
"buy_order_request_other": "the Application
{{hostname}}
is requesting {{count}} buy orders",
- "devmode_local_node": "DEVモードにローカルノードを使用してください!ログアウトしてローカルノードを使用します。",
+ "devmode_local_node": "dEVモードにローカルノードを使用してください!ログアウトしてローカルノードを使用します。",
"downloading": "ダウンロード",
"downloading_decrypting_app": "プライベートアプリのダウンロードと復号化。",
"edited": "編集",
@@ -320,6 +320,7 @@
"none": "なし",
"note": "注記",
"option": "オプション",
+ "option_no": "オプションなし",
"option_other": "オプション",
"page": {
"last": "最後",
@@ -374,7 +375,7 @@
"title": "タイトル",
"to": "に",
"tutorial": "チュートリアル",
- "url": "URL",
+ "url": "uRL",
"user_lookup": "ユーザールックアップ",
"vote": "投票する",
"vote_other": "{{ count }} votes",
@@ -385,6 +386,6 @@
"wallet": "財布",
"wallet_other": "財布"
},
- "website": "Webサイト",
+ "website": "webサイト",
"welcome": "いらっしゃいませ"
}
diff --git a/src/i18n/locales/ja/group.json b/src/i18n/locales/ja/group.json
index 9ca8c8a..a1e2dc0 100644
--- a/src/i18n/locales/ja/group.json
+++ b/src/i18n/locales/ja/group.json
@@ -29,7 +29,6 @@
"visit_q_mintership": "Q-Mintershipにアクセスしてください"
},
"advanced_options": "高度なオプション",
- "ban_list": "禁止リスト",
"block_delay": {
"minimum": "最小ブロック遅延",
"maximum": "最大ブロック遅延"
@@ -126,7 +125,7 @@
},
"success": {
"group_ban": "グループからメンバーを首尾よく禁止しました。変更が伝播するまでに数分かかる場合があります",
- "group_creation": "GROUPを正常に作成しました。変更が伝播するまでに数分かかる場合があります",
+ "group_creation": "gROUPを正常に作成しました。変更が伝播するまでに数分かかる場合があります",
"group_creation_name": "created group {{group_name}}: awaiting confirmation",
"group_creation_label": "created group {{name}}: success!",
"group_invite": "successfully invited {{invitee}}. It may take a couple of minutes for the changes to propagate",
@@ -154,8 +153,8 @@
"rewardshare_add": "報酬を追加:確認を待っています",
"rewardshare_add_label": "報酬を追加:成功!",
"rewardshare_creation": "チェーン上の報酬の作成を確認します。我慢してください、これには最大90秒かかる可能性があります。",
- "rewardshare_confirmed": "RewardShareが確認されました。 [次へ]をクリックしてください。",
- "rewardshare_remove": "RewardShareを削除:確認を待っています",
+ "rewardshare_confirmed": "rewardShareが確認されました。 [次へ]をクリックしてください。",
+ "rewardshare_remove": "rewardShareを削除:確認を待っています",
"rewardshare_remove_label": "報酬を削除:成功!",
"thread_creation": "正常に作成されたスレッド。パブリッシュが伝播するまでに時間がかかる場合があります",
"unbanned_user": "バーンなしのユーザーに成功しました。変更が伝播するまでに数分かかる場合があります",
diff --git a/src/i18n/locales/ja/question.json b/src/i18n/locales/ja/question.json
index 3ef124c..700c1ad 100644
--- a/src/i18n/locales/ja/question.json
+++ b/src/i18n/locales/ja/question.json
@@ -111,7 +111,7 @@
"provide_group_id": "please provide a groupId",
"read_transaction_carefully": "read the transaction carefully before accepting!",
"user_declined_add_list": "user declined add to list",
- "user_declined_delete_from_list": "User declined delete from list",
+ "user_declined_delete_from_list": "user declined delete from list",
"user_declined_delete_hosted_resources": "user declined delete hosted resources",
"user_declined_join": "user declined to join group",
"user_declined_list": "user declined to get list of hosted resources",
diff --git a/src/i18n/locales/ru/auth.json b/src/i18n/locales/ru/auth.json
index a72b9e5..b864e38 100644
--- a/src/i18n/locales/ru/auth.json
+++ b/src/i18n/locales/ru/auth.json
@@ -29,7 +29,7 @@
"insert_name_address": "Пожалуйста, вставьте имя или адрес",
"publish_admin_secret_key": "Публикуйте секретный ключ администратора",
"publish_group_secret_key": "Публикуйте Secret Key Group",
- "reencrypt_key": "Recrypt Key",
+ "reencrypt_key": "recrypt Key",
"return_to_list": "вернуться в список",
"setup_qortal_account": "Настройте свою учетную запись Qortal",
"unblock": "разблокировать",
@@ -63,8 +63,8 @@
"find_secret_key": "Не могу найти правильный секретный клавиш",
"incorrect_password": "Неправильный пароль",
"invalid_qortal_link": "Неверная ссылка на кортал",
- "invalid_secret_key": "SecretKey не действителен",
- "invalid_uint8": "Uint8ArrayData, которую вы отправили, недействительна",
+ "invalid_secret_key": "secretKey не действителен",
+ "invalid_uint8": "uint8ArrayData, которую вы отправили, недействительна",
"name_not_existing": "Имя не существует",
"name_not_registered": "Имя не зарегистрировано",
"read_blob_base64": "Не удалось прочитать каплей в качестве строки, кодированной BASE64",
diff --git a/src/i18n/locales/ru/core.json b/src/i18n/locales/ru/core.json
index 45cf8ea..d5e4f61 100644
--- a/src/i18n/locales/ru/core.json
+++ b/src/i18n/locales/ru/core.json
@@ -2,7 +2,7 @@
"action": {
"accept": "принимать",
"access": "доступ",
- "access_app": "Access App",
+ "access_app": "access App",
"add": "добавлять",
"add_custom_framework": "Добавьте пользовательскую структуру",
"add_reaction": "Добавить реакцию",
@@ -61,7 +61,7 @@
"open": "открыть",
"pin": "приколоть",
"pin_app": "приложение приложения",
- "pin_from_dashboard": "PIN -штифт от приборной панели",
+ "pin_from_dashboard": "pIN -штифт от приборной панели",
"post": "почта",
"post_message": "опубликовать сообщение",
"publish": "публиковать",
@@ -90,8 +90,8 @@
"trade_qort": "Торговый Qort",
"transfer_qort": "Передача qort",
"unpin": "не",
- "unpin_app": "Upin App",
- "unpin_from_dashboard": "Unlin с приборной панели",
+ "unpin_app": "upin App",
+ "unpin_from_dashboard": "unlin с приборной панели",
"update": "обновлять",
"update_app": "Обновите свое приложение",
"vote": "голосование"
@@ -106,6 +106,7 @@
"app": "приложение",
"app_other": "приложения",
"app_name": "Название приложения",
+ "app_private": "частное",
"app_service_type": "Тип службы приложений",
"apps_dashboard": "приложения панель панели",
"apps_official": "официальные приложения",
@@ -135,7 +136,7 @@
"one": "один"
},
"description": "описание",
- "devmode_apps": "Dev Mode Apps",
+ "devmode_apps": "dev Mode Apps",
"directory": "каталог",
"downloading_qdn": "Загрузка с QDN",
"fee": {
@@ -320,6 +321,7 @@
"none": "никто",
"note": "примечание",
"option": "вариант",
+ "option_no": "выбора нет",
"option_other": "параметры",
"page": {
"last": "последний",
@@ -374,7 +376,7 @@
"title": "заголовок",
"to": "к",
"tutorial": "Учебник",
- "url": "URL",
+ "url": "uRL",
"user_lookup": "Посмотреть пользователя",
"vote": "голосование",
"vote_other": "{{ count }} votes",
diff --git a/src/i18n/locales/ru/group.json b/src/i18n/locales/ru/group.json
index 4630593..18f61f7 100644
--- a/src/i18n/locales/ru/group.json
+++ b/src/i18n/locales/ru/group.json
@@ -29,7 +29,6 @@
"visit_q_mintership": "Посетите Q-Mintership"
},
"advanced_options": "расширенные варианты",
- "ban_list": "Запрет список",
"block_delay": {
"minimum": "Минимальная задержка блока",
"maximum": "Максимальная задержка блока"
diff --git a/src/i18n/locales/ru/question.json b/src/i18n/locales/ru/question.json
index 903bfa4..5b31029 100644
--- a/src/i18n/locales/ru/question.json
+++ b/src/i18n/locales/ru/question.json
@@ -40,7 +40,7 @@
"fetch_recipient_public_key": "Не удалось получить открытый ключ получателя",
"fetch_wallet_info": "Невозможно получить информацию о кошельке",
"fetch_wallet_transactions": "Невозможно получить транзакции кошелька",
- "fetch_wallet": "Fetch Wallet вышел из строя. Пожалуйста, попробуйте еще раз",
+ "fetch_wallet": "fetch Wallet вышел из строя. Пожалуйста, попробуйте еще раз",
"file_extension": "Расширение файла не может быть получено",
"gateway_balance_local_node": "cannot view {{ token }} balance through the gateway. Please use your local node.",
"gateway_non_qort_local_node": "Не могу отправить не-Qort монету через шлюз. Пожалуйста, используйте свой локальный узел.",
@@ -50,7 +50,7 @@
"insufficient_balance_qort": "Ваш баланс Qort недостаточен",
"insufficient_balance": "Ваша баланс активов недостаточен",
"insufficient_funds": "Недостаточно средств",
- "invalid_encryption_iv": "Invalid IV: AES-GCM требует 12-байтового IV",
+ "invalid_encryption_iv": "invalid IV: AES-GCM требует 12-байтового IV",
"invalid_encryption_key": "Неверный ключ: AES-GCM требует 256-битного ключа.",
"invalid_fullcontent": "Полевой полной контент находится в неверном формате. Либо используйте строку, base64 или объект",
"invalid_receiver": "Неверный адрес или имя приемника",
@@ -189,4 +189,4 @@
"total_locking_fee": "Общая плата за блокировку:",
"total_unlocking_fee": "Общая плата за разблокировку:",
"value": "value: {{ value }}"
-}
\ No newline at end of file
+}
diff --git a/src/i18n/locales/zh/auth.json b/src/i18n/locales/zh/auth.json
index c621ba7..7b2357f 100644
--- a/src/i18n/locales/zh/auth.json
+++ b/src/i18n/locales/zh/auth.json
@@ -63,7 +63,7 @@
"find_secret_key": "找不到正确的SecretKey",
"incorrect_password": "密码不正确",
"invalid_qortal_link": "无效的Qortal链接",
- "invalid_secret_key": "SecretKey无效",
+ "invalid_secret_key": "secretKey无效",
"invalid_uint8": "您提交的Uint8arraydata无效",
"name_not_existing": "名称不存在",
"name_not_registered": "名称未注册",
diff --git a/src/i18n/locales/zh/core.json b/src/i18n/locales/zh/core.json
index bbc5e63..58ac531 100644
--- a/src/i18n/locales/zh/core.json
+++ b/src/i18n/locales/zh/core.json
@@ -106,6 +106,7 @@
"app": "应用程序",
"app_other": "应用",
"app_name": "应用名称",
+ "app_private": "私人应用程序",
"app_service_type": "应用服务类型",
"apps_dashboard": "应用仪表板",
"apps_official": "官方应用程序",
@@ -128,7 +129,7 @@
"dev_mode": "开发模式",
"domain": "领域",
"ui": {
- "version": "UI版本"
+ "version": "uI版本"
},
"count": {
"none": "没有任何",
@@ -154,7 +155,6 @@
"list": {
"bans": "禁令名单",
"groups": "组列表",
- "invite": "邀请列表",
"invites": "邀请列表",
"join_request": "加入请求列表",
"member": "成员列表",
@@ -320,6 +320,7 @@
"none": "没有任何",
"note": "笔记",
"option": "选项",
+ "option_no": "没有选择",
"option_other": "选项",
"page": {
"last": "最后的",
@@ -374,7 +375,7 @@
"title": "标题",
"to": "到",
"tutorial": "教程",
- "url": "URL",
+ "url": "uRL",
"user_lookup": "用户查找",
"vote": "投票",
"vote_other": "{{ count }} 投票",
diff --git a/src/i18n/locales/zh/group.json b/src/i18n/locales/zh/group.json
index bb92a44..8e5b2b2 100644
--- a/src/i18n/locales/zh/group.json
+++ b/src/i18n/locales/zh/group.json
@@ -29,7 +29,6 @@
"visit_q_mintership": "访问Q-Mintership"
},
"advanced_options": "高级选项",
- "ban_list": "禁令列表",
"block_delay": {
"minimum": "最小块延迟",
"maximum": "最大块延迟"
@@ -56,7 +55,7 @@
"type": "组类型"
},
"invitation_expiry": "邀请到期时间",
- "invitees_list": "Invitees列表",
+ "invitees_list": "invitees列表",
"join_link": "加入组链接",
"join_requests": "加入请求",
"last_message": "最后一条消息",
diff --git a/src/i18n/locales/zh/question.json b/src/i18n/locales/zh/question.json
index 3ef124c..700c1ad 100644
--- a/src/i18n/locales/zh/question.json
+++ b/src/i18n/locales/zh/question.json
@@ -111,7 +111,7 @@
"provide_group_id": "please provide a groupId",
"read_transaction_carefully": "read the transaction carefully before accepting!",
"user_declined_add_list": "user declined add to list",
- "user_declined_delete_from_list": "User declined delete from list",
+ "user_declined_delete_from_list": "user declined delete from list",
"user_declined_delete_hosted_resources": "user declined delete hosted resources",
"user_declined_join": "user declined to join group",
"user_declined_list": "user declined to get list of hosted resources",
diff --git a/src/qortal/qortal-requests.ts b/src/qortal/qortal-requests.ts
index 9681790..6a164b6 100644
--- a/src/qortal/qortal-requests.ts
+++ b/src/qortal/qortal-requests.ts
@@ -126,7 +126,7 @@ export async function getPermission(key) {
}
}
-// TODO: GET_FRIENDS_LIST
+// TODO: feature: add call to GET_FRIENDS_LIST
// NOT SURE IF TO IMPLEMENT: LINK_TO_QDN_RESOURCE, QDN_RESOURCE_DISPLAYED, SET_TAB_NOTIFICATIONS
function setupMessageListenerQortalRequest() {
diff --git a/src/qortalRequests/get.ts b/src/qortalRequests/get.ts
deleted file mode 100644
index 47d2fe1..0000000
--- a/src/qortalRequests/get.ts
+++ /dev/null
@@ -1,7005 +0,0 @@
-import { Sha256 } from 'asmcrypto.js';
-import {
- createEndpoint,
- getBalanceInfo,
- getFee,
- getKeyPair,
- getLastRef,
- getSaveWallet,
- processTransactionVersion2,
- signChatFunc,
- joinGroup as joinGroupFunc,
- sendQortFee,
- sendCoin as sendCoinFunc,
- createBuyOrderTx,
- performPowTask,
- parseErrorResponse,
- groupSecretkeys,
- registerName,
- updateName,
- leaveGroup,
- inviteToGroup,
- getNameInfoForOthers,
- kickFromGroup,
- banFromGroup,
- cancelBan,
- makeAdmin,
- removeAdmin,
- cancelInvitationToGroup,
- createGroup,
- updateGroup,
- sellName,
- cancelSellName,
- buyName,
- getBaseApi,
- getAssetBalanceInfo,
- getNameOrAddress,
- getAssetInfo,
- getPublicKey,
- transferAsset,
-} from '../background/background.ts';
-import { getNameInfo, uint8ArrayToObject } from '../encryption/encryption.ts';
-import { showSaveFilePicker } from '../hooks/useQortalMessageListener.tsx';
-import { getPublishesFromAdminsAdminSpace } from '../components/Chat/AdminSpaceInner.tsx';
-import { extractComponents } from '../components/Chat/MessageDisplay.tsx';
-import {
- decryptResource,
- getGroupAdmins,
- getPublishesFromAdmins,
- validateSecretKey,
-} from '../components/Group/Group.tsx';
-import { QORT_DECIMALS } from '../constants/constants.ts';
-import Base58 from '../encryption/Base58.ts';
-import ed2curve from '../encryption/ed2curve.ts';
-import nacl from '../encryption/nacl-fast.ts';
-import {
- base64ToUint8Array,
- createSymmetricKeyAndNonce,
- decryptDeprecatedSingle,
- decryptGroupDataQortalRequest,
- decryptGroupEncryptionWithSharingKey,
- decryptSingle,
- encryptDataGroup,
- encryptSingle,
- objectToBase64,
- uint8ArrayStartsWith,
- uint8ArrayToBase64,
-} from '../qdn/encryption/group-encryption.ts';
-import { publishData } from '../qdn/publish/publish.ts';
-import {
- getPermission,
- isRunningGateway,
- setPermission,
-} from './qortalRequests.ts';
-import TradeBotCreateRequest from '../transactions/TradeBotCreateRequest.ts';
-import DeleteTradeOffer from '../transactions/TradeBotDeleteRequest.ts';
-import signTradeBotTransaction from '../transactions/signTradeBotTransaction.ts';
-import { createTransaction } from '../transactions/transactions.ts';
-import { executeEvent } from '../utils/events.ts';
-import { fileToBase64 } from '../utils/fileReading/index.ts';
-import { mimeToExtensionMap } from '../utils/memeTypes.ts';
-import { RequestQueueWithPromise } from '../utils/queue/queue.ts';
-import utils from '../utils/utils.ts';
-import ShortUniqueId from 'short-unique-id';
-import { isValidBase64WithDecode } from '../utils/decode.ts';
-import i18n from 'i18next';
-
-const uid = new ShortUniqueId({ length: 6 });
-
-export const requestQueueGetAtAddresses = new RequestQueueWithPromise(10);
-
-const sellerForeignFee = {
- LITECOIN: {
- value: '~0.00005',
- ticker: 'LTC',
- },
- DOGECOIN: {
- value: '~0.005',
- ticker: 'DOGE',
- },
- BITCOIN: {
- value: '~0.0001',
- ticker: 'BTC',
- },
- DIGIBYTE: {
- value: '~0.0005',
- ticker: 'DGB',
- },
- RAVENCOIN: {
- value: '~0.006',
- ticker: 'RVN',
- },
- PIRATECHAIN: {
- value: '~0.0002',
- ticker: 'ARRR',
- },
-};
-
-const btcFeePerByte = 0.000001;
-const ltcFeePerByte = 0.0000003;
-const dogeFeePerByte = 0.00001;
-const dgbFeePerByte = 0.0000001;
-const rvnFeePerByte = 0.00001125;
-
-const MAX_RETRIES = 3; // Set max number of retries
-
-export async function retryTransaction(
- fn,
- args,
- throwError,
- retries = MAX_RETRIES
-) {
- let attempt = 0;
- while (attempt < retries) {
- try {
- return await fn(...args);
- } catch (error) {
- console.error(`Attempt ${attempt + 1} failed: ${error.message}`);
- attempt++;
- if (attempt === retries) {
- console.error(
- i18n.t('question:message.generic.max_retry_transaction', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- if (throwError) {
- throw new Error(
- error?.message ||
- i18n.t('question:message.error.process_transaction', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- } else {
- throw new Error(
- error?.message ||
- i18n.t('question:message.error.process_transaction', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- }
- }
- await new Promise((res) => setTimeout(res, 10000));
- }
- }
-}
-
-function roundUpToDecimals(number, decimals = 8) {
- const factor = Math.pow(10, decimals); // Create a factor based on the number of decimals
- return Math.ceil(+number * factor) / factor;
-}
-
-export const _createPoll = async (
- { pollName, pollDescription, options },
- isFromExtension,
- skipPermission
-) => {
- const fee = await getFee('CREATE_POLL');
- let resPermission = {};
- if (!skipPermission) {
- resPermission = await getUserPermission(
- {
- text1: i18n.t('question:request_create_poll', {
- postProcess: 'capitalizeFirstChar',
- }),
- text2: i18n.t('question:poll', {
- name: pollName,
- postProcess: 'capitalizeFirstChar',
- }),
- text3: i18n.t('question:description', {
- description: pollDescription,
- postProcess: 'capitalizeFirstChar',
- }),
- text4: i18n.t('question:options', {
- optionList: options?.join(', '),
- postProcess: 'capitalizeFirstChar',
- }),
- fee: fee.fee,
- },
- isFromExtension
- );
- }
-
- const { accepted = false } = resPermission;
-
- if (accepted || skipPermission) {
- const wallet = await getSaveWallet();
- const address = wallet.address0;
- const resKeyPair = await getKeyPair();
- const parsedData = resKeyPair;
- const uint8PrivateKey = Base58.decode(parsedData.privateKey);
- const uint8PublicKey = Base58.decode(parsedData.publicKey);
- const keyPair = {
- privateKey: uint8PrivateKey,
- publicKey: uint8PublicKey,
- };
- let lastRef = await getLastRef();
-
- const tx = await createTransaction(8, keyPair, {
- fee: fee.fee,
- ownerAddress: address,
- rPollName: pollName,
- rPollDesc: pollDescription,
- rOptions: options,
- lastReference: lastRef,
- });
- const signedBytes = Base58.encode(tx.signedBytes);
- const res = await processTransactionVersion2(signedBytes);
- if (!res?.signature)
- throw new Error(
- res?.message ||
- i18n.t('question:message.error.process_transaction', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- return res;
- } else {
- throw new Error(
- i18n.t('question:message.generic.user_declined_request', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- }
-};
-
-const _deployAt = async (
- { name, description, tags, creationBytes, amount, assetId, atType },
- isFromExtension
-) => {
- const fee = await getFee('DEPLOY_AT');
-
- const resPermission = await getUserPermission(
- {
- text1: i18n.t('question:deploy_at', {
- postProcess: 'capitalizeFirstChar',
- }),
- text2: i18n.t('question:name', {
- name: name,
- postProcess: 'capitalizeFirstChar',
- }),
- text3: i18n.t('question:description', {
- description: description,
- postProcess: 'capitalizeFirstChar',
- }),
- fee: fee.fee,
- },
- isFromExtension
- );
-
- const { accepted } = resPermission;
-
- if (accepted) {
- const wallet = await getSaveWallet();
- const address = wallet.address0;
- const lastReference = await getLastRef();
- const resKeyPair = await getKeyPair();
- const parsedData = resKeyPair;
- const uint8PrivateKey = Base58.decode(parsedData.privateKey);
- const uint8PublicKey = Base58.decode(parsedData.publicKey);
- const keyPair = {
- privateKey: uint8PrivateKey,
- publicKey: uint8PublicKey,
- };
-
- const tx = await createTransaction(16, keyPair, {
- fee: fee.fee,
- rName: name,
- rDescription: description,
- rTags: tags,
- rAmount: amount,
- rAssetId: assetId,
- rCreationBytes: creationBytes,
- atType: atType,
- lastReference: lastReference,
- });
-
- const signedBytes = Base58.encode(tx.signedBytes);
-
- const res = await processTransactionVersion2(signedBytes);
- if (!res?.signature)
- throw new Error(
- res?.message ||
- i18n.t('question:message.error.process_transaction', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- return res;
- } else {
- throw new Error(
- i18n.t('question:message.generic.user_declined_request', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- }
-};
-
-export const _voteOnPoll = async (
- { pollName, optionIndex, optionName },
- isFromExtension,
- skipPermission
-) => {
- const fee = await getFee('VOTE_ON_POLL');
- let resPermission = {};
-
- if (!skipPermission) {
- resPermission = await getUserPermission(
- {
- text1: i18n.t('question:request_vote_poll', {
- postProcess: 'capitalizeFirstChar',
- }),
- text2: i18n.t('question:poll', {
- name: pollName,
- postProcess: 'capitalizeFirstChar',
- }),
- text3: i18n.t('question:option', {
- option: optionName,
- postProcess: 'capitalizeFirstChar',
- }),
- fee: fee.fee,
- },
- isFromExtension
- );
- }
-
- const { accepted = false } = resPermission;
-
- if (accepted || skipPermission) {
- const wallet = await getSaveWallet();
- const address = wallet.address0;
- const resKeyPair = await getKeyPair();
- const parsedData = resKeyPair;
- const uint8PrivateKey = Base58.decode(parsedData.privateKey);
- const uint8PublicKey = Base58.decode(parsedData.publicKey);
- const keyPair = {
- privateKey: uint8PrivateKey,
- publicKey: uint8PublicKey,
- };
- let lastRef = await getLastRef();
-
- const tx = await createTransaction(9, keyPair, {
- fee: fee.fee,
- voterAddress: address,
- rPollName: pollName,
- rOptionIndex: optionIndex,
- lastReference: lastRef,
- });
- const signedBytes = Base58.encode(tx.signedBytes);
- const res = await processTransactionVersion2(signedBytes);
- if (!res?.signature)
- throw new Error(
- res?.message ||
- i18n.t('question:message.error.process_transaction', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- return res;
- } else {
- throw new Error(
- i18n.t('question:message.generic.user_declined_request', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- }
-};
-
-// Map to store resolvers and rejectors by requestId
-const fileRequestResolvers = new Map();
-
-const handleFileMessage = (event) => {
- const { action, requestId, result, error } = event.data;
-
- if (
- action === 'getFileFromIndexedDBResponse' &&
- fileRequestResolvers.has(requestId)
- ) {
- const { resolve, reject } = fileRequestResolvers.get(requestId);
- fileRequestResolvers.delete(requestId); // Clean up after resolving
-
- if (result) {
- resolve(result);
- } else {
- reject(
- error ||
- i18n.t('question:message.error.retrieve_file', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- }
- }
-};
-
-window.addEventListener('message', handleFileMessage);
-
-function getFileFromContentScript(fileId) {
- return new Promise((resolve, reject) => {
- const requestId = `getFile_${fileId}_${Date.now()}`;
-
- fileRequestResolvers.set(requestId, { resolve, reject }); // Store resolvers by requestId
- const targetOrigin = window.location.origin;
-
- // Send the request message
- window.postMessage(
- { action: 'getFileFromIndexedDB', fileId, requestId },
- targetOrigin
- );
-
- // Timeout to handle no response scenario
- setTimeout(() => {
- if (fileRequestResolvers.has(requestId)) {
- fileRequestResolvers.get(requestId).reject(
- i18n.t('question:message.error.timeout_request', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- fileRequestResolvers.delete(requestId); // Clean up on timeout
- }
- }, 10000); // 10-second timeout
- });
-}
-
-const responseResolvers = new Map();
-
-const handleMessage = (event) => {
- const { action, requestId, result } = event.data;
-
- // Check if this is the expected response action and if we have a stored resolver
- if (
- action === 'QORTAL_REQUEST_PERMISSION_RESPONSE' &&
- responseResolvers.has(requestId)
- ) {
- // Resolve the stored promise with the result
- responseResolvers.get(requestId)(result || false);
- responseResolvers.delete(requestId); // Clean up after resolving
- }
-};
-
-window.addEventListener('message', handleMessage);
-
-async function getUserPermission(payload, isFromExtension) {
- return new Promise((resolve) => {
- const requestId = `qortalRequest_${Date.now()}`;
- responseResolvers.set(requestId, resolve); // Store resolver by requestId
- const targetOrigin = window.location.origin;
-
- // Send the request message
- window.postMessage(
- {
- action: 'QORTAL_REQUEST_PERMISSION',
- payload,
- requestId,
- isFromExtension,
- },
- targetOrigin
- );
-
- // Optional timeout to handle no response scenario
- setTimeout(() => {
- if (responseResolvers.has(requestId)) {
- responseResolvers.get(requestId)(false); // Resolve with `false` if no response
- responseResolvers.delete(requestId);
- }
- }, 60000); // 30-second timeout
- });
-}
-
-export const getUserAccount = async ({
- isFromExtension,
- appInfo,
- skipAuth,
-}) => {
- try {
- const value =
- (await getPermission(`qAPPAutoAuth-${appInfo?.name}`)) || false;
- let skip = false;
- if (value) {
- skip = true;
- }
- if (skipAuth) {
- skip = true;
- }
- let resPermission;
- if (!skip) {
- resPermission = await getUserPermission(
- {
- text1: i18n.t('question:permission.authenticate', {
- postProcess: 'capitalizeFirstChar',
- }),
- checkbox1: {
- value: false,
- label: i18n.t('question:always_authenticate', {
- postProcess: 'capitalizeFirstChar',
- }),
- },
- },
- isFromExtension
- );
- }
-
- const { accepted = false, checkbox1 = false } = resPermission || {};
- if (resPermission) {
- setPermission(`qAPPAutoAuth-${appInfo?.name}`, checkbox1);
- }
- if (accepted || skip) {
- const wallet = await getSaveWallet();
- const address = wallet.address0;
- const publicKey = wallet.publicKey;
- return {
- address,
- publicKey,
- };
- } else {
- throw new Error(
- i18n.t('question:message.generic.user_declined_request', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- }
- } catch (error) {
- throw new Error(
- i18n.t('auth:message.error.fetch_user_account', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- }
-};
-
-export const encryptData = async (data, sender) => {
- let data64 = data.data64 || data.base64;
- let publicKeys = data.publicKeys || [];
- if (data?.file || data?.blob) {
- data64 = await fileToBase64(data?.file || data?.blob);
- }
- if (!data64) {
- throw new Error(
- i18n.t('question:message.generic.include_data_encrypt', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- }
- const resKeyPair = await getKeyPair();
- const parsedData = resKeyPair;
- const privateKey = parsedData.privateKey;
- const userPublicKey = parsedData.publicKey;
-
- const encryptDataResponse = encryptDataGroup({
- data64,
- publicKeys: publicKeys,
- privateKey,
- userPublicKey,
- });
- if (encryptDataResponse) {
- return encryptDataResponse;
- } else {
- throw new Error(
- i18n.t('question:message.error.encrypt', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- }
-};
-
-export const encryptQortalGroupData = async (data, sender) => {
- let data64 = data?.data64 || data?.base64;
- let groupId = data?.groupId;
- let isAdmins = data?.isAdmins;
- if (!groupId) {
- throw new Error(
- i18n.t('question:message.generic.provide_group_id', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- }
- if (data?.file || data?.blob) {
- data64 = await fileToBase64(data?.file || data?.blob);
- }
- if (!data64) {
- throw new Error(
- i18n.t('question:message.generic.include_data_encrypt', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- }
-
- let secretKeyObject;
- if (!isAdmins) {
- if (
- groupSecretkeys[groupId] &&
- groupSecretkeys[groupId].secretKeyObject &&
- groupSecretkeys[groupId]?.timestamp &&
- Date.now() - groupSecretkeys[groupId]?.timestamp < 1200000
- ) {
- secretKeyObject = groupSecretkeys[groupId].secretKeyObject;
- }
-
- if (!secretKeyObject) {
- const { names } = await getGroupAdmins(groupId);
-
- const publish = await getPublishesFromAdmins(names, groupId);
- if (publish === false)
- throw new Error(
- i18n.t('question:message.error.no_group_key', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- const url = await createEndpoint(
- `/arbitrary/DOCUMENT_PRIVATE/${publish.name}/${
- publish.identifier
- }?encoding=base64&rebuild=true`
- );
-
- const res = await fetch(url);
- const resData = await res.text();
-
- const decryptedKey: any = await decryptResource(resData, true);
-
- const dataint8Array = base64ToUint8Array(decryptedKey.data);
- const decryptedKeyToObject = uint8ArrayToObject(dataint8Array);
-
- if (!validateSecretKey(decryptedKeyToObject))
- throw new Error(
- i18n.t('auth:message.error.invalid_secret_key', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- secretKeyObject = decryptedKeyToObject;
- groupSecretkeys[groupId] = {
- secretKeyObject,
- timestamp: Date.now(),
- };
- }
- } else {
- if (
- groupSecretkeys[`admins-${groupId}`] &&
- groupSecretkeys[`admins-${groupId}`].secretKeyObject &&
- groupSecretkeys[`admins-${groupId}`]?.timestamp &&
- Date.now() - groupSecretkeys[`admins-${groupId}`]?.timestamp < 1200000
- ) {
- secretKeyObject = groupSecretkeys[`admins-${groupId}`].secretKeyObject;
- }
-
- if (!secretKeyObject) {
- const { names } = await getGroupAdmins(groupId);
-
- const publish = await getPublishesFromAdminsAdminSpace(names, groupId);
- if (publish === false)
- throw new Error(
- i18n.t('question:message.error.no_group_key', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- const url = await createEndpoint(
- `/arbitrary/DOCUMENT_PRIVATE/${publish.name}/${
- publish.identifier
- }?encoding=base64&rebuild=true`
- );
-
- const res = await fetch(url);
- const resData = await res.text();
- const decryptedKey: any = await decryptResource(resData, true);
- const dataint8Array = base64ToUint8Array(decryptedKey.data);
- const decryptedKeyToObject = uint8ArrayToObject(dataint8Array);
-
- if (!validateSecretKey(decryptedKeyToObject))
- throw new Error(
- i18n.t('auth:message.error.invalid_secret_key', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- secretKeyObject = decryptedKeyToObject;
- groupSecretkeys[`admins-${groupId}`] = {
- secretKeyObject,
- timestamp: Date.now(),
- };
- }
- }
-
- const resGroupEncryptedResource = encryptSingle({
- data64,
- secretKeyObject: secretKeyObject,
- });
-
- if (resGroupEncryptedResource) {
- return resGroupEncryptedResource;
- } else {
- throw new Error(
- i18n.t('question:message.error.encrypt', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- }
-};
-
-export const decryptQortalGroupData = async (data, sender) => {
- let data64 = data?.data64 || data?.base64;
- let groupId = data?.groupId;
- let isAdmins = data?.isAdmins;
- if (!groupId) {
- throw new Error(
- i18n.t('question:message.generic.provide_group_id', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- }
-
- if (!data64) {
- throw new Error(
- i18n.t('question:message.generic.include_data_encrypt', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- }
-
- let secretKeyObject;
- if (!isAdmins) {
- if (
- groupSecretkeys[groupId] &&
- groupSecretkeys[groupId].secretKeyObject &&
- groupSecretkeys[groupId]?.timestamp &&
- Date.now() - groupSecretkeys[groupId]?.timestamp < 1200000
- ) {
- secretKeyObject = groupSecretkeys[groupId].secretKeyObject;
- }
- if (!secretKeyObject) {
- const { names } = await getGroupAdmins(groupId);
-
- const publish = await getPublishesFromAdmins(names, groupId);
- if (publish === false)
- throw new Error(
- i18n.t('question:message.error.no_group_key', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- const url = await createEndpoint(
- `/arbitrary/DOCUMENT_PRIVATE/${publish.name}/${
- publish.identifier
- }?encoding=base64&rebuild=true`
- );
-
- const res = await fetch(url);
- const resData = await res.text();
- const decryptedKey: any = await decryptResource(resData, true);
-
- const dataint8Array = base64ToUint8Array(decryptedKey.data);
- const decryptedKeyToObject = uint8ArrayToObject(dataint8Array);
- if (!validateSecretKey(decryptedKeyToObject))
- throw new Error(
- i18n.t('auth:message.error.invalid_secret_key', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- secretKeyObject = decryptedKeyToObject;
- groupSecretkeys[groupId] = {
- secretKeyObject,
- timestamp: Date.now(),
- };
- }
- } else {
- if (
- groupSecretkeys[`admins-${groupId}`] &&
- groupSecretkeys[`admins-${groupId}`].secretKeyObject &&
- groupSecretkeys[`admins-${groupId}`]?.timestamp &&
- Date.now() - groupSecretkeys[`admins-${groupId}`]?.timestamp < 1200000
- ) {
- secretKeyObject = groupSecretkeys[`admins-${groupId}`].secretKeyObject;
- }
- if (!secretKeyObject) {
- const { names } = await getGroupAdmins(groupId);
-
- const publish = await getPublishesFromAdminsAdminSpace(names, groupId);
- if (publish === false)
- throw new Error(
- i18n.t('question:message.error.no_group_key', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- const url = await createEndpoint(
- `/arbitrary/DOCUMENT_PRIVATE/${publish.name}/${
- publish.identifier
- }?encoding=base64&rebuild=true`
- );
-
- const res = await fetch(url);
- const resData = await res.text();
- const decryptedKey: any = await decryptResource(resData, true);
-
- const dataint8Array = base64ToUint8Array(decryptedKey.data);
- const decryptedKeyToObject = uint8ArrayToObject(dataint8Array);
- if (!validateSecretKey(decryptedKeyToObject))
- throw new Error(
- i18n.t('auth:message.error.invalid_secret_key', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- secretKeyObject = decryptedKeyToObject;
- groupSecretkeys[`admins-${groupId}`] = {
- secretKeyObject,
- timestamp: Date.now(),
- };
- }
- }
-
- const resGroupDecryptResource = decryptSingle({
- data64,
- secretKeyObject: secretKeyObject,
- skipDecodeBase64: true,
- });
- if (resGroupDecryptResource) {
- return resGroupDecryptResource;
- } else {
- throw new Error(
- i18n.t('question:message.error.encrypt', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- }
-};
-
-export const encryptDataWithSharingKey = async (data, sender) => {
- let data64 = data?.data64 || data?.base64;
- let publicKeys = data.publicKeys || [];
- if (data?.file || data?.blob) {
- data64 = await fileToBase64(data?.file || data?.blob);
- }
- if (!data64) {
- throw new Error(
- i18n.t('question:message.generic.include_data_encrypt', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- }
- const symmetricKey = createSymmetricKeyAndNonce();
- const dataObject = {
- data: data64,
- key: symmetricKey.messageKey,
- };
- const dataObjectBase64 = await objectToBase64(dataObject);
-
- const resKeyPair = await getKeyPair();
- const parsedData = resKeyPair;
- const privateKey = parsedData.privateKey;
- const userPublicKey = parsedData.publicKey;
-
- const encryptDataResponse = encryptDataGroup({
- data64: dataObjectBase64,
- publicKeys: publicKeys,
- privateKey,
- userPublicKey,
- customSymmetricKey: symmetricKey.messageKey,
- });
- if (encryptDataResponse) {
- return encryptDataResponse;
- } else {
- throw new Error(
- i18n.t('question:message.error.encrypt', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- }
-};
-
-export const decryptDataWithSharingKey = async (data, sender) => {
- const { encryptedData, key } = data;
-
- if (!encryptedData) {
- throw new Error(
- i18n.t('question:message.generic.include_data_decrypt', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- }
-
- const decryptedData = await decryptGroupEncryptionWithSharingKey({
- data64EncryptedData: encryptedData,
- key,
- });
- const base64ToObject = JSON.parse(atob(decryptedData));
-
- if (!base64ToObject.data)
- throw new Error(
- i18n.t('question:message.error.no_data_encrypted_resource', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- return base64ToObject.data;
-};
-
-export const getHostedData = async (data, isFromExtension) => {
- const isGateway = await isRunningGateway();
- if (isGateway) {
- throw new Error(
- i18n.t('question:message.generic.no_action_public_node', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- }
- const resPermission = await getUserPermission(
- {
- text1: i18n.t('question:message.error.submit_sell_order', {
- postProcess: 'capitalizeFirstChar',
- }),
- },
- isFromExtension
- );
- const { accepted } = resPermission;
-
- if (accepted) {
- const limit = data?.limit ? data?.limit : 20;
- const query = data?.query ? data?.query : '';
- const offset = data?.offset ? data?.offset : 0;
-
- let urlPath = `/arbitrary/hosted/resources/?limit=${limit}&offset=${offset}`;
- if (query) {
- urlPath = urlPath + `&query=${query}`;
- }
-
- const url = await createEndpoint(urlPath);
- const response = await fetch(url);
- const dataResponse = await response.json();
- return dataResponse;
- } else {
- throw new Error(
- i18n.t('question:message.generic.user_declined_list', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- }
-};
-
-export const deleteHostedData = async (data, isFromExtension) => {
- const isGateway = await isRunningGateway();
- if (isGateway) {
- throw new Error(
- i18n.t('question:message.generic.no_action_public_node', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- }
- const requiredFields = ['hostedData'];
- const missingFields: string[] = [];
- requiredFields.forEach((field) => {
- if (!data[field]) {
- missingFields.push(field);
- }
- });
- const resPermission = await getUserPermission(
- {
- text1: i18n.t('question:permission.delete_hosts_resources', {
- size: data?.hostedData?.length,
- postProcess: 'capitalizeFirstChar',
- }),
- },
- isFromExtension
- );
- const { accepted } = resPermission;
-
- if (accepted) {
- const { hostedData } = data;
-
- for (const hostedDataItem of hostedData) {
- try {
- const url = await createEndpoint(
- `/arbitrary/resource/${hostedDataItem.service}/${hostedDataItem.name}/${hostedDataItem.identifier}`
- );
- await fetch(url, {
- method: 'DELETE',
- headers: {
- 'Content-Type': 'application/json',
- },
- });
- } catch (error) {
- console.log(error);
- }
- }
-
- return true;
- } else {
- throw new Error(
- i18n.t('question:message.generic.user_declined_delete_hosted_resources', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- }
-};
-export const decryptData = async (data) => {
- const { encryptedData, publicKey } = data;
-
- if (!encryptedData) {
- throw new Error(`Missing fields: encryptedData`);
- }
- const resKeyPair = await getKeyPair();
- const parsedData = resKeyPair;
- const uint8PrivateKey = Base58.decode(parsedData.privateKey);
- const uint8Array = base64ToUint8Array(encryptedData);
- const startsWithQortalEncryptedData = uint8ArrayStartsWith(
- uint8Array,
- 'qortalEncryptedData'
- );
- if (startsWithQortalEncryptedData) {
- if (!publicKey) {
- throw new Error(`Missing fields: publicKey`);
- }
-
- const decryptedDataToBase64 = decryptDeprecatedSingle(
- uint8Array,
- publicKey,
- uint8PrivateKey
- );
- return decryptedDataToBase64;
- }
- const startsWithQortalGroupEncryptedData = uint8ArrayStartsWith(
- uint8Array,
- 'qortalGroupEncryptedData'
- );
- if (startsWithQortalGroupEncryptedData) {
- const decryptedData = decryptGroupDataQortalRequest(
- encryptedData,
- parsedData.privateKey
- );
- const decryptedDataToBase64 = uint8ArrayToBase64(decryptedData);
- return decryptedDataToBase64;
- }
- throw new Error(
- i18n.t('question:message.error.encrypt', {
- postProcess: 'capitalizeFirstChar',
- })
- );
-};
-
-export const getListItems = async (data, isFromExtension) => {
- const isGateway = await isRunningGateway();
- if (isGateway) {
- throw new Error(
- i18n.t('question:message.generic.no_action_public_node', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- }
- const requiredFields = ['list_name'];
- const missingFields: string[] = [];
- requiredFields.forEach((field) => {
- if (!data[field]) {
- missingFields.push(field);
- }
- });
- if (missingFields.length > 0) {
- const missingFieldsString = missingFields.join(', ');
- const errorMsg = i18n.t('question:message.error.missing_fields', {
- fields: missingFieldsString,
- postProcess: 'capitalizeFirstChar',
- });
- throw new Error(errorMsg);
- }
- const value = (await getPermission('qAPPAutoLists')) || false;
-
- let skip = false;
- if (value) {
- skip = true;
- }
- let resPermission;
- let acceptedVar;
- let checkbox1Var;
- if (!skip) {
- resPermission = await getUserPermission(
- {
- text1: i18n.t('question:permission.access_list', {
- postProcess: 'capitalizeFirstChar',
- }),
- highlightedText: data.list_name,
- checkbox1: {
- value: value,
- label: i18n.t('question:always_retrieve_list', {
- postProcess: 'capitalizeFirstChar',
- }),
- },
- },
- isFromExtension
- );
- const { accepted, checkbox1 } = resPermission;
- acceptedVar = accepted;
- checkbox1Var = checkbox1;
- setPermission('qAPPAutoLists', checkbox1);
- }
-
- if (acceptedVar || skip) {
- const url = await createEndpoint(`/lists/${data.list_name}`);
- const response = await fetch(url);
- if (!response.ok)
- throw new Error(
- i18n.t('question:message.error.fetch_list', {
- postProcess: 'capitalizeFirstChar',
- })
- );
-
- const list = await response.json();
- return list;
- } else {
- throw new Error(
- i18n.t('question:message.generic.user_declined_share_list', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- }
-};
-
-export const addListItems = async (data, isFromExtension) => {
- const isGateway = await isRunningGateway();
- if (isGateway) {
- throw new Error(
- i18n.t('question:message.generic.no_action_public_node', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- }
- const requiredFields = ['list_name', 'items'];
- const missingFields: string[] = [];
- requiredFields.forEach((field) => {
- if (!data[field]) {
- missingFields.push(field);
- }
- });
- if (missingFields.length > 0) {
- const missingFieldsString = missingFields.join(', ');
- const errorMsg = i18n.t('question:message.error.missing_fields', {
- fields: missingFieldsString,
- postProcess: 'capitalizeFirstChar',
- });
- throw new Error(errorMsg);
- }
-
- const items = data.items;
- const list_name = data.list_name;
-
- const resPermission = await getUserPermission(
- {
- text1: i18n.t('question:permission.all_item_list', {
- name: list_name,
- postProcess: 'capitalizeFirstChar',
- }),
- highlightedText: items.join(', '),
- },
- isFromExtension
- );
- const { accepted } = resPermission;
-
- if (accepted) {
- const url = await createEndpoint(`/lists/${list_name}`);
- const body = {
- items: items,
- };
- const bodyToString = JSON.stringify(body);
- const response = await fetch(url, {
- method: 'POST',
- headers: {
- 'Content-Type': 'application/json',
- },
- body: bodyToString,
- });
-
- if (!response.ok)
- throw new Error(
- i18n.t('question:message.error.add_to_list', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- let res;
- try {
- res = await response.clone().json();
- } catch (e) {
- res = await response.text();
- }
- return res;
- } else {
- throw new Error(
- i18n.t('question:message.generic.user_declined_add_list', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- }
-};
-
-export const deleteListItems = async (data, isFromExtension) => {
- const isGateway = await isRunningGateway();
- if (isGateway) {
- throw new Error(
- i18n.t('question:message.generic.no_action_public_node', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- }
- const requiredFields = ['list_name'];
- const missingFields: string[] = [];
- requiredFields.forEach((field) => {
- if (!data[field]) {
- missingFields.push(field);
- }
- });
- if (missingFields.length > 0) {
- const missingFieldsString = missingFields.join(', ');
- const errorMsg = i18n.t('question:message.error.missing_fields', {
- fields: missingFieldsString,
- postProcess: 'capitalizeFirstChar',
- });
- throw new Error(errorMsg);
- }
- if (!data?.item && !data?.items) {
- throw new Error(
- i18n.t('question:message.error.missing_fields', {
- fields: 'items',
- postProcess: 'capitalizeFirstChar',
- })
- );
- }
- const item = data?.item;
- const items = data?.items;
- const list_name = data.list_name;
-
- const resPermission = await getUserPermission(
- {
- text1: i18n.t('question:permission.remove_from_list', {
- name: list_name,
- postProcess: 'capitalizeFirstChar',
- }),
- highlightedText: items ? JSON.stringify(items) : item,
- },
- isFromExtension
- );
- const { accepted } = resPermission;
-
- if (accepted) {
- const url = await createEndpoint(`/lists/${list_name}`);
- const body = {
- items: items || [item],
- };
- const bodyToString = JSON.stringify(body);
- const response = await fetch(url, {
- method: 'DELETE',
- headers: {
- 'Content-Type': 'application/json',
- },
- body: bodyToString,
- });
-
- if (!response.ok)
- throw new Error(
- i18n.t('question:message.error.add_to_list', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- let res;
- try {
- res = await response.clone().json();
- } catch (e) {
- res = await response.text();
- }
- return res;
- } else {
- throw new Error(
- i18n.t('question:message.generic.user_declined_delete_from_list', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- }
-};
-
-export const publishQDNResource = async (
- data: any,
- sender,
- isFromExtension
-) => {
- const requiredFields = ['service'];
- const missingFields: string[] = [];
- requiredFields.forEach((field) => {
- if (!data[field]) {
- missingFields.push(field);
- }
- });
- if (missingFields.length > 0) {
- const missingFieldsString = missingFields.join(', ');
- const errorMsg = i18n.t('question:message.error.missing_fields', {
- fields: missingFieldsString,
- postProcess: 'capitalizeFirstChar',
- });
- throw new Error(errorMsg);
- }
- if (!data.file && !data.data64 && !data.base64) {
- throw new Error(
- i18n.t('question:message.error.no_data_file_submitted', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- }
- // Use "default" if user hasn't specified an identifier
- const service = data.service;
- const appFee = data?.appFee ? +data.appFee : undefined;
- const appFeeRecipient = data?.appFeeRecipient;
- let hasAppFee = false;
- if (appFee && appFee > 0 && appFeeRecipient) {
- hasAppFee = true;
- }
- const registeredName = await getNameInfo();
- const name = registeredName;
- if (!name) {
- throw new Error(
- i18n.t('question:message.error.user_qortal_name', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- }
-
- let identifier = data.identifier;
- let data64 = data.data64 || data.base64;
- const filename = data.filename;
- const title = data.title;
- const description = data.description;
- const category = data.category;
-
- const tags = data?.tags || [];
- const result = {};
-
- // Fill tags dynamically while maintaining backward compatibility
- for (let i = 0; i < 5; i++) {
- result[`tag${i + 1}`] = tags[i] || data[`tag${i + 1}`] || undefined;
- }
-
- // Access tag1 to tag5 from result
- const { tag1, tag2, tag3, tag4, tag5 } = result;
-
- if (data.identifier == null) {
- identifier = 'default';
- }
- if (data?.file || data?.blob) {
- data64 = await fileToBase64(data?.file || data?.blob);
- }
- if (
- data.encrypt &&
- (!data.publicKeys ||
- (Array.isArray(data.publicKeys) && data.publicKeys.length === 0))
- ) {
- throw new Error(
- i18n.t('question:message.error.encryption_requires_public_key', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- }
-
- if (data.encrypt) {
- try {
- const resKeyPair = await getKeyPair();
- const parsedData = resKeyPair;
- const privateKey = parsedData.privateKey;
- const userPublicKey = parsedData.publicKey;
- const encryptDataResponse = encryptDataGroup({
- data64,
- publicKeys: data.publicKeys,
- privateKey,
- userPublicKey,
- });
- if (encryptDataResponse) {
- data64 = encryptDataResponse;
- }
- } catch (error) {
- throw new Error(
- error.message ||
- i18n.t('question:message.error.upload_encryption', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- }
- }
-
- const fee = await getFee('ARBITRARY');
-
- const handleDynamicValues = {};
- if (hasAppFee) {
- const feePayment = await getFee('PAYMENT');
-
- (handleDynamicValues['appFee'] = +appFee + +feePayment.fee),
- (handleDynamicValues['checkbox1'] = {
- value: true,
- label: i18n.t('question:accept_app_fee', {
- postProcess: 'capitalizeFirstChar',
- }),
- });
- }
- if (!!data?.encrypt) {
- handleDynamicValues['highlightedText'] = `isEncrypted: ${!!data.encrypt}`;
- }
- const resPermission = await getUserPermission(
- {
- text1: i18n.t('question:permission.publish_qdn', {
- postProcess: 'capitalizeFirstChar',
- }),
- text2: `service: ${service}`,
- text3: `identifier: ${identifier || null}`,
- fee: fee.fee,
- ...handleDynamicValues,
- },
- isFromExtension
- );
- const { accepted, checkbox1 = false } = resPermission;
- if (accepted) {
- try {
- const resPublish = await publishData({
- registeredName: encodeURIComponent(name),
- file: data64,
- service: service,
- identifier: encodeURIComponent(identifier),
- uploadType: 'file',
- isBase64: true,
- filename: filename,
- title,
- description,
- category,
- tag1,
- tag2,
- tag3,
- tag4,
- tag5,
- apiVersion: 2,
- withFee: true,
- });
- if (resPublish?.signature && hasAppFee && checkbox1) {
- sendCoinFunc(
- {
- amount: appFee,
- receiver: appFeeRecipient,
- },
- true
- );
- }
- return resPublish;
- } catch (error) {
- throw new Error(error?.message || 'Upload failed');
- }
- } else {
- throw new Error(
- i18n.t('question:message.generic.user_declined_request', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- }
-};
-
-export const checkArrrSyncStatus = async (seed) => {
- const _url = await createEndpoint(`/crosschain/arrr/syncstatus`);
- let tries = 0; // Track the number of attempts
-
- while (tries < 36) {
- const response = await fetch(_url, {
- method: 'POST',
- headers: {
- 'Content-Type': 'application/json',
- },
- body: seed,
- });
-
- let res;
- try {
- res = await response.clone().json();
- } catch (e) {
- res = await response.text();
- }
-
- if (res.indexOf('<') > -1 || res !== 'Synchronized') {
- // Wait 2 seconds before trying again
- await new Promise((resolve) => setTimeout(resolve, 2000));
- tries += 1;
- } else {
- // If the response doesn't meet the two conditions, exit the function
- return;
- }
- }
-
- // If we exceed N tries, throw an error
- throw new Error(
- i18n.t('question:message.error.synchronization_attempts', {
- quantity: 36,
- postProcess: 'capitalizeFirstChar',
- })
- );
-};
-
-export const publishMultipleQDNResources = async (
- data: any,
- sender,
- isFromExtension
-) => {
- const requiredFields = ['resources'];
- const missingFields: string[] = [];
-
- requiredFields.forEach((field) => {
- if (!data[field]) {
- missingFields.push(field);
- }
- });
-
- if (missingFields.length > 0) {
- const missingFieldsString = missingFields.join(', ');
- const errorMsg = i18n.t('question:message.error.missing_fields', {
- fields: missingFieldsString,
- postProcess: 'capitalizeFirstChar',
- });
- throw new Error(errorMsg);
- }
-
- const resources = data.resources;
- if (!Array.isArray(resources)) {
- throw new Error(
- i18n.t('group:message.generic.invalid_data', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- }
-
- if (resources.length === 0) {
- throw new Error(
- i18n.t('question:message.error.no_resources_publish', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- }
-
- const encrypt = data?.encrypt;
-
- for (const resource of resources) {
- const resourceEncrypt = encrypt && resource?.disableEncrypt !== true;
-
- if (!resourceEncrypt && resource?.service.endsWith('_PRIVATE')) {
- const errorMsg = i18n.t('question:message.error.only_encrypted_data', {
- postProcess: 'capitalizeFirstChar',
- });
- throw new Error(errorMsg);
- } else if (resourceEncrypt && !resource?.service.endsWith('_PRIVATE')) {
- const errorMsg = i18n.t('question:message.error.use_private_service', {
- postProcess: 'capitalizeFirstChar',
- });
- throw new Error(errorMsg);
- }
- }
-
- const fee = await getFee('ARBITRARY');
- const registeredName = await getNameInfo();
- const name = registeredName;
-
- if (!name) {
- throw new Error(
- i18n.t('question:message.error.registered_name', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- }
-
- const appFee = data?.appFee ? +data.appFee : undefined;
- const appFeeRecipient = data?.appFeeRecipient;
- let hasAppFee = false;
-
- if (appFee && appFee > 0 && appFeeRecipient) {
- hasAppFee = true;
- }
-
- const handleDynamicValues = {};
- if (hasAppFee) {
- const feePayment = await getFee('PAYMENT');
-
- (handleDynamicValues['appFee'] = +appFee + +feePayment.fee),
- (handleDynamicValues['checkbox1'] = {
- value: true,
- label: i18n.t('question:accept_app_fee', {
- postProcess: 'capitalizeFirstChar',
- }),
- });
- }
- if (data?.encrypt) {
- handleDynamicValues['highlightedText'] = `isEncrypted: ${!!data.encrypt}`;
- }
- const resPermission = await getUserPermission(
- {
- text1: i18n.t('question:permission.publish_qdn', {
- postProcess: 'capitalizeFirstChar',
- }),
- html: `
-
-
-
- ${data.resources
- .map(
- (resource) => `
-
-
Service: ${
- resource.service
- }
-
Name: ${name}
-
Identifier: ${
- resource.identifier
- }
- ${
- resource.filename
- ? `
Filename: ${resource.filename}
`
- : ''
- }
-
`
- )
- .join('')}
-
-
- `,
- fee: +fee.fee * resources.length,
- ...handleDynamicValues,
- },
- isFromExtension
- );
-
- const { accepted, checkbox1 = false } = resPermission;
- if (!accepted) {
- throw new Error(
- i18n.t('question:message.generic.user_declined_request', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- }
-
- type FailedPublish = {
- reason: string;
- identifier: any;
- service: any;
- };
-
- const failedPublishesIdentifiers: FailedPublish[] = [];
-
- for (const resource of resources) {
- try {
- const requiredFields = ['service'];
- const missingFields: string[] = [];
- requiredFields.forEach((field) => {
- if (!resource[field]) {
- missingFields.push(field);
- }
- });
- if (missingFields.length > 0) {
- const missingFieldsString = missingFields.join(', ');
- const errorMsg = i18n.t('question:message.error.missing_fields', {
- fields: missingFieldsString,
- postProcess: 'capitalizeFirstChar',
- });
- failedPublishesIdentifiers.push({
- reason: errorMsg,
- identifier: resource.identifier,
- service: resource.service,
- });
- continue;
- }
- if (!resource.file && !resource.data64 && !resource?.base64) {
- const errorMsg = i18n.t(
- 'question:message.error.no_data_file_submitted',
- {
- postProcess: 'capitalizeFirstChar',
- }
- );
- failedPublishesIdentifiers.push({
- reason: errorMsg,
- identifier: resource.identifier,
- service: resource.service,
- });
- continue;
- }
- const service = resource.service;
- let identifier = resource.identifier;
- let data64 = resource?.data64 || resource?.base64;
- const filename = resource.filename;
- const title = resource.title;
- const description = resource.description;
- const category = resource.category;
- const tags = resource?.tags || [];
- const result = {};
-
- // Fill tags dynamically while maintaining backward compatibility
- for (let i = 0; i < 5; i++) {
- result[`tag${i + 1}`] = tags[i] || resource[`tag${i + 1}`] || undefined;
- }
-
- // Access tag1 to tag5 from result
- const { tag1, tag2, tag3, tag4, tag5 } = result;
- const resourceEncrypt = encrypt && resource?.disableEncrypt !== true;
- if (resource.identifier == null) {
- identifier = 'default';
- }
- if (!resourceEncrypt && service.endsWith('_PRIVATE')) {
- const errorMsg = i18n.t('question:message.error.only_encrypted_data', {
- postProcess: 'capitalizeFirstChar',
- });
- failedPublishesIdentifiers.push({
- reason: errorMsg,
- identifier: resource.identifier,
- service: resource.service,
- });
- continue;
- }
- if (resource.file) {
- data64 = await fileToBase64(resource.file);
- }
- if (resourceEncrypt) {
- try {
- const resKeyPair = await getKeyPair();
- const parsedData = resKeyPair;
- const privateKey = parsedData.privateKey;
- const userPublicKey = parsedData.publicKey;
- const encryptDataResponse = encryptDataGroup({
- data64,
- publicKeys: data.publicKeys,
- privateKey,
- userPublicKey,
- });
- if (encryptDataResponse) {
- data64 = encryptDataResponse;
- }
- } catch (error) {
- const errorMsg =
- error?.message ||
- i18n.t('question:message.error.upload_encryption', {
- postProcess: 'capitalizeFirstChar',
- });
- failedPublishesIdentifiers.push({
- reason: errorMsg,
- identifier: resource.identifier,
- service: resource.service,
- });
- continue;
- }
- }
-
- try {
- await retryTransaction(
- publishData,
- [
- {
- registeredName: encodeURIComponent(name),
- file: data64,
- service: service,
- identifier: encodeURIComponent(identifier),
- uploadType: 'file',
- isBase64: true,
- filename: filename,
- title,
- description,
- category,
- tag1,
- tag2,
- tag3,
- tag4,
- tag5,
- apiVersion: 2,
- withFee: true,
- },
- ],
- true
- );
- await new Promise((res) => {
- setTimeout(() => {
- res();
- }, 1000);
- });
- } catch (error) {
- const errorMsg =
- error.message ||
- i18n.t('question:message.error.upload', {
- postProcess: 'capitalizeFirstChar',
- });
- failedPublishesIdentifiers.push({
- reason: errorMsg,
- identifier: resource.identifier,
- service: resource.service,
- });
- }
- } catch (error) {
- failedPublishesIdentifiers.push({
- reason:
- error?.message ||
- i18n.t('question:message.error.unknown_error', {
- postProcess: 'capitalizeFirstChar',
- }),
- identifier: resource.identifier,
- service: resource.service,
- });
- }
- }
- if (failedPublishesIdentifiers.length > 0) {
- const obj = {
- message: i18n.t('question:message.error.resources_publish', {
- postProcess: 'capitalizeFirstChar',
- }),
- };
- obj['error'] = {
- unsuccessfulPublishes: failedPublishesIdentifiers,
- };
- return obj;
- }
- if (hasAppFee && checkbox1) {
- sendCoinFunc(
- {
- amount: appFee,
- receiver: appFeeRecipient,
- },
- true
- );
- }
- return true;
-};
-
-export const voteOnPoll = async (data, isFromExtension) => {
- const requiredFields = ['pollName', 'optionIndex'];
- const missingFields: string[] = [];
-
- requiredFields.forEach((field) => {
- if (!data[field] && data[field] !== 0) {
- missingFields.push(field);
- }
- });
-
- if (missingFields.length > 0) {
- const missingFieldsString = missingFields.join(', ');
- const errorMsg = i18n.t('question:message.error.missing_fields', {
- fields: missingFieldsString,
- postProcess: 'capitalizeFirstChar',
- });
- throw new Error(errorMsg);
- }
-
- const pollName = data.pollName;
- const optionIndex = data.optionIndex;
- let pollInfo = null;
- try {
- const url = await createEndpoint(`/polls/${encodeURIComponent(pollName)}`);
- const response = await fetch(url);
- if (!response.ok) {
- const errorMessage = await parseErrorResponse(
- response,
- i18n.t('question:message.error.fetch_poll', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- throw new Error(errorMessage);
- }
-
- pollInfo = await response.json();
- } catch (error) {
- const errorMsg =
- (error && error.message) ||
- i18n.t('question:message.error.no_poll', {
- postProcess: 'capitalizeFirstChar',
- });
- throw new Error(errorMsg);
- }
- if (!pollInfo || pollInfo.error) {
- const errorMsg =
- (pollInfo && pollInfo.message) ||
- i18n.t('question:message.error.no_poll', {
- postProcess: 'capitalizeFirstChar',
- });
- throw new Error(errorMsg);
- }
- try {
- const optionName = pollInfo.pollOptions[optionIndex].optionName;
- const resVoteOnPoll = await _voteOnPoll(
- { pollName, optionIndex, optionName },
- isFromExtension
- );
- return resVoteOnPoll;
- } catch (error) {
- throw new Error(
- error?.message ||
- i18n.t('question:message.error.poll_vote', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- }
-};
-
-export const createPoll = async (data, isFromExtension) => {
- const requiredFields = [
- 'pollName',
- 'pollDescription',
- 'pollOptions',
- 'pollOwnerAddress',
- ];
- const missingFields: string[] = [];
- requiredFields.forEach((field) => {
- if (!data[field]) {
- missingFields.push(field);
- }
- });
-
- if (missingFields.length > 0) {
- const missingFieldsString = missingFields.join(', ');
- const errorMsg = i18n.t('question:message.error.missing_fields', {
- fields: missingFieldsString,
- postProcess: 'capitalizeFirstChar',
- });
- throw new Error(errorMsg);
- }
-
- const pollName = data.pollName;
- const pollDescription = data.pollDescription;
- const pollOptions = data.pollOptions;
- try {
- const resCreatePoll = await _createPoll(
- {
- pollName,
- pollDescription,
- options: pollOptions,
- },
- isFromExtension
- );
- return resCreatePoll;
- } catch (error) {
- throw new Error(
- error?.message ||
- i18n.t('question:message.error.poll_create', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- }
-};
-
-function isBase64(str) {
- const base64Regex =
- /^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/;
- return base64Regex.test(str) && str.length % 4 === 0;
-}
-
-function checkValue(value) {
- if (typeof value === 'string') {
- if (isBase64(value)) {
- return 'string';
- } else {
- return 'string';
- }
- } else if (typeof value === 'object' && value !== null) {
- return 'object';
- } else {
- throw new Error(
- i18n.t('question:message.error.invalid_fullcontent', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- }
-}
-
-export const sendChatMessage = async (data, isFromExtension, appInfo) => {
- const message = data?.message;
- const fullMessageObject = data?.fullMessageObject || data?.fullContent;
- const recipient = data?.destinationAddress || data.recipient;
- const groupId = data.groupId;
- const isRecipient = groupId === undefined;
- const chatReference = data?.chatReference;
- if (groupId === undefined && recipient === undefined) {
- throw new Error(
- i18n.t('question:provide_recipient_group_id', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- }
- let fullMessageObjectType;
- if (fullMessageObject) {
- fullMessageObjectType = checkValue(fullMessageObject);
- }
- const value =
- (await getPermission(`qAPPSendChatMessage-${appInfo?.name}`)) || false;
- let skip = false;
- if (value) {
- skip = true;
- }
- let resPermission;
- if (!skip) {
- resPermission = await getUserPermission(
- {
- text1: i18n.t('question:permission.send_chat_message', {
- postProcess: 'capitalizeFirstChar',
- }),
- text2: isRecipient
- ? i18n.t('question:to_recipient', {
- recipient: recipient,
- postProcess: 'capitalizeFirstChar',
- })
- : i18n.t('question:to_group', {
- group_id: groupId,
- postProcess: 'capitalizeFirstChar',
- }),
- text3: fullMessageObject
- ? fullMessageObjectType === 'string'
- ? `${fullMessageObject?.slice(0, 25)}${fullMessageObject?.length > 25 ? '...' : ''}`
- : `${JSON.stringify(fullMessageObject)?.slice(0, 25)}${JSON.stringify(fullMessageObject)?.length > 25 ? '...' : ''}`
- : `${message?.slice(0, 25)}${message?.length > 25 ? '...' : ''}`,
- checkbox1: {
- value: false,
- label: i18n.t('question:always_chat_messages', {
- postProcess: 'capitalizeFirstChar',
- }),
- },
- },
- isFromExtension
- );
- }
- const { accepted = false, checkbox1 = false } = resPermission || {};
- if (resPermission && accepted) {
- setPermission(`qAPPSendChatMessage-${appInfo?.name}`, checkbox1);
- }
- if (accepted || skip) {
- const tiptapJson = {
- type: 'doc',
- content: [
- {
- type: 'paragraph',
- content: [
- {
- type: 'text',
- text: message,
- },
- ],
- },
- ],
- };
- const messageObject = fullMessageObject
- ? fullMessageObject
- : {
- messageText: tiptapJson,
- images: [],
- repliedTo: '',
- version: 3,
- };
-
- let stringifyMessageObject = JSON.stringify(messageObject);
- if (fullMessageObjectType === 'string') {
- stringifyMessageObject = messageObject;
- }
-
- const balance = await getBalanceInfo();
- const hasEnoughBalance = +balance < 4 ? false : true;
- if (!hasEnoughBalance) {
- throw new Error(
- i18n.t('group:message.error.qortals_required', {
- quantity: 4,
- postProcess: 'capitalizeFirstChar',
- })
- );
- }
- if (isRecipient && recipient) {
- const url = await createEndpoint(`/addresses/publickey/${recipient}`);
- const response = await fetch(url);
- if (!response.ok)
- throw new Error(
- i18n.t('question:message.error.fetch_recipient_public_key', {
- postProcess: 'capitalizeFirstChar',
- })
- );
-
- let key;
- let hasPublicKey;
- let res;
- const contentType = response.headers.get('content-type');
-
- // If the response is JSON, parse it as JSON
- if (contentType && contentType.includes('application/json')) {
- res = await response.json();
- } else {
- // Otherwise, treat it as plain text
- res = await response.text();
- }
- if (res?.error === 102) {
- key = '';
- hasPublicKey = false;
- } else if (res !== false) {
- key = res;
- hasPublicKey = true;
- } else {
- key = '';
- hasPublicKey = false;
- }
-
- if (!hasPublicKey && isRecipient) {
- throw new Error(
- 'Cannot send an encrypted message to this user since they do not have their publickey on chain.'
- );
- }
- let _reference = new Uint8Array(64);
- self.crypto.getRandomValues(_reference);
-
- let sendTimestamp = Date.now();
-
- let reference = Base58.encode(_reference);
- const resKeyPair = await getKeyPair();
- const parsedData = resKeyPair;
- const uint8PrivateKey = Base58.decode(parsedData.privateKey);
- const uint8PublicKey = Base58.decode(parsedData.publicKey);
- const keyPair = {
- privateKey: uint8PrivateKey,
- publicKey: uint8PublicKey,
- };
-
- let handleDynamicValues = {};
- if (chatReference) {
- handleDynamicValues['chatReference'] = chatReference;
- }
-
- const tx = await createTransaction(18, keyPair, {
- timestamp: sendTimestamp,
- recipient: recipient,
- recipientPublicKey: key,
- hasChatReference: chatReference ? 1 : 0,
- message: stringifyMessageObject,
- lastReference: reference,
- proofOfWorkNonce: 0,
- isEncrypted: 1,
- isText: 1,
- ...handleDynamicValues,
- });
-
- const chatBytes = tx.chatBytes;
- const difficulty = 8;
- const { nonce, chatBytesArray } = await performPowTask(
- chatBytes,
- difficulty
- );
-
- let _response = await signChatFunc(chatBytesArray, nonce, null, keyPair);
- if (_response?.error) {
- throw new Error(_response?.message);
- }
- return _response;
- } else if (!isRecipient && groupId) {
- let _reference = new Uint8Array(64);
- self.crypto.getRandomValues(_reference);
-
- let reference = Base58.encode(_reference);
- const resKeyPair = await getKeyPair();
- const parsedData = resKeyPair;
- const uint8PrivateKey = Base58.decode(parsedData.privateKey);
- const uint8PublicKey = Base58.decode(parsedData.publicKey);
- const keyPair = {
- privateKey: uint8PrivateKey,
- publicKey: uint8PublicKey,
- };
-
- let handleDynamicValues = {};
- if (chatReference) {
- handleDynamicValues['chatReference'] = chatReference;
- }
-
- const txBody = {
- timestamp: Date.now(),
- groupID: Number(groupId),
- hasReceipient: 0,
- hasChatReference: chatReference ? 1 : 0,
- message: stringifyMessageObject,
- lastReference: reference,
- proofOfWorkNonce: 0,
- isEncrypted: 0, // Set default to not encrypted for groups
- isText: 1,
- ...handleDynamicValues,
- };
-
- const tx = await createTransaction(181, keyPair, txBody);
-
- // if (!hasEnoughBalance) {
- // throw new Error("Must have at least 4 QORT to send a chat message");
- // }
-
- const chatBytes = tx.chatBytes;
- const difficulty = 8;
- const { nonce, chatBytesArray } = await performPowTask(
- chatBytes,
- difficulty
- );
-
- let _response = await signChatFunc(chatBytesArray, nonce, null, keyPair);
- if (_response?.error) {
- throw new Error(_response?.message);
- }
- return _response;
- } else {
- throw new Error(
- i18n.t('question:provide_recipient_group_id', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- }
- } else {
- throw new Error(
- i18n.t('question:message.generic.user_declined_send_message', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- }
-};
-
-export const joinGroup = async (data, isFromExtension) => {
- const requiredFields = ['groupId'];
- const missingFields: string[] = [];
- requiredFields.forEach((field) => {
- if (!data[field]) {
- missingFields.push(field);
- }
- });
- if (missingFields.length > 0) {
- const missingFieldsString = missingFields.join(', ');
- const errorMsg = i18n.t('question:message.error.missing_fields', {
- fields: missingFieldsString,
- postProcess: 'capitalizeFirstChar',
- });
- throw new Error(errorMsg);
- }
- let groupInfo = null;
- try {
- const url = await createEndpoint(`/groups/${data.groupId}`);
- const response = await fetch(url);
- if (!response.ok)
- throw new Error(
- i18n.t('question:message.error.fetch_group', {
- postProcess: 'capitalizeFirstChar',
- })
- );
-
- groupInfo = await response.json();
- } catch (error) {
- const errorMsg =
- (error && error.message) ||
- i18n.t('question:message.error.no_group_found', {
- postProcess: 'capitalizeFirstChar',
- });
- throw new Error(errorMsg);
- }
- const fee = await getFee('JOIN_GROUP');
-
- const resPermission = await getUserPermission(
- {
- text1: i18n.t('question:message.generic.confirm_join_group', {
- postProcess: 'capitalizeFirstChar',
- }),
- highlightedText: `${groupInfo.groupName}`,
- fee: fee.fee,
- },
- isFromExtension
- );
- const { accepted } = resPermission;
-
- if (accepted) {
- const groupId = data.groupId;
-
- if (!groupInfo || groupInfo.error) {
- const errorMsg =
- (groupInfo && groupInfo.message) ||
- i18n.t('question:message.error.no_group_found', {
- postProcess: 'capitalizeFirstChar',
- });
- throw new Error(errorMsg);
- }
- try {
- const resJoinGroup = await joinGroupFunc({ groupId });
- return resJoinGroup;
- } catch (error) {
- throw new Error(
- error?.message ||
- i18n.t('group:message.error.group_join', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- }
- } else {
- throw new Error(
- i18n.t('question:message.generic.user_declined_join', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- }
-};
-
-export const saveFile = async (data, sender, isFromExtension, snackMethods) => {
- try {
- const requiredFields = ['filename', 'blob'];
- const missingFields: string[] = [];
- requiredFields.forEach((field) => {
- if (!data[field]) {
- missingFields.push(field);
- }
- });
- if (missingFields.length > 0) {
- const missingFieldsString = missingFields.join(', ');
- const errorMsg = i18n.t('question:message.error.missing_fields', {
- fields: missingFieldsString,
- postProcess: 'capitalizeFirstChar',
- });
- throw new Error(errorMsg);
- }
- const filename = data.filename;
- const blob = data.blob;
- const resPermission = await getUserPermission(
- {
- text1: i18n.t('question:download_file', {
- postProcess: 'capitalizeFirstChar',
- }),
- highlightedText: `${filename}`,
- },
- isFromExtension
- );
- const { accepted } = resPermission;
-
- if (accepted) {
- const mimeType = blob.type || data.mimeType;
- let backupExention = filename.split('.').pop();
- if (backupExention) {
- backupExention = '.' + backupExention;
- }
- const fileExtension = mimeToExtensionMap[mimeType] || backupExention;
- let fileHandleOptions = {};
- if (!mimeType) {
- throw new Error(
- i18n.t('question:message.error.mime_type', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- }
- if (!fileExtension) {
- throw new Error(
- i18n.t('question:message.error.file_extension', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- }
- if (fileExtension && mimeType) {
- fileHandleOptions = {
- accept: {
- [mimeType]: [fileExtension],
- },
- };
- }
-
- showSaveFilePicker(
- {
- filename,
- mimeType,
- blob,
- },
- snackMethods
- );
- return true;
- } else {
- throw new Error(
- i18n.t('question:message.generic.user_declined_save_file', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- }
- } catch (error) {
- throw new Error(
- error?.message ||
- i18n.t('core:message.error.initiate_download', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- }
-};
-
-export const deployAt = async (data, isFromExtension) => {
- const requiredFields = [
- 'name',
- 'description',
- 'tags',
- 'creationBytes',
- 'amount',
- 'assetId',
- 'type',
- ];
-
- const missingFields: string[] = [];
-
- requiredFields.forEach((field) => {
- if (!data[field] && data[field] !== 0) {
- missingFields.push(field);
- }
- });
-
- if (missingFields.length > 0) {
- const missingFieldsString = missingFields.join(', ');
- const errorMsg = i18n.t('question:message.error.missing_fields', {
- fields: missingFieldsString,
- postProcess: 'capitalizeFirstChar',
- });
- throw new Error(errorMsg);
- }
-
- try {
- const resDeployAt = await _deployAt(
- {
- name: data.name,
- description: data.description,
- tags: data.tags,
- creationBytes: data.creationBytes,
- amount: data.amount,
- assetId: data.assetId,
- atType: data.type,
- },
- isFromExtension
- );
- return resDeployAt;
- } catch (error) {
- throw new Error(
- error?.message ||
- i18n.t('group:message.error.group_join', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- }
-};
-
-export const getUserWallet = async (data, isFromExtension, appInfo) => {
- const requiredFields = ['coin'];
- const missingFields: string[] = [];
- requiredFields.forEach((field) => {
- if (!data[field]) {
- missingFields.push(field);
- }
- });
- if (missingFields.length > 0) {
- const missingFieldsString = missingFields.join(', ');
- const errorMsg = i18n.t('question:message.error.missing_fields', {
- fields: missingFieldsString,
- postProcess: 'capitalizeFirstChar',
- });
- throw new Error(errorMsg);
- }
- const isGateway = await isRunningGateway();
-
- if (data?.coin === 'ARRR' && isGateway)
- throw new Error(
- i18n.t('question:message.error.gateway_wallet_local_node', {
- token: 'ARRR',
- postProcess: 'capitalizeFirstChar',
- })
- );
-
- const value =
- (await getPermission(
- `qAPPAutoGetUserWallet-${appInfo?.name}-${data.coin}`
- )) || false;
- let skip = false;
- if (value) {
- skip = true;
- }
-
- let resPermission;
-
- if (!skip) {
- resPermission = await getUserPermission(
- {
- text1: i18n.t('question:permission.get_wallet_info', {
- postProcess: 'capitalizeFirstChar',
- }),
- highlightedText: `coin: ${data.coin}`,
- checkbox1: {
- value: true,
- label: i18n.t('question:always_retrieve_wallet', {
- postProcess: 'capitalizeFirstChar',
- }),
- },
- },
- isFromExtension
- );
- }
- const { accepted = false, checkbox1 = false } = resPermission || {};
-
- if (resPermission) {
- setPermission(
- `qAPPAutoGetUserWallet-${appInfo?.name}-${data.coin}`,
- checkbox1
- );
- }
-
- if (accepted || skip) {
- let coin = data.coin;
- let userWallet = {};
- let arrrAddress = '';
- const wallet = await getSaveWallet();
- const address = wallet.address0;
- const resKeyPair = await getKeyPair();
- const parsedData = resKeyPair;
- const arrrSeed58 = parsedData.arrrSeed58;
- if (coin === 'ARRR') {
- const bodyToString = arrrSeed58;
- const url = await createEndpoint(`/crosschain/arrr/walletaddress`);
- const response = await fetch(url, {
- method: 'POST',
- headers: {
- 'Content-Type': 'application/json',
- },
- body: bodyToString,
- });
- let res;
- try {
- res = await response.clone().json();
- } catch (e) {
- res = await response.text();
- }
- if (res?.error && res?.message) {
- throw new Error(res.message);
- }
- arrrAddress = res;
- }
- switch (coin) {
- case 'QORT':
- userWallet['address'] = address;
- userWallet['publickey'] = parsedData.publicKey;
- break;
- case 'BTC':
- userWallet['address'] = parsedData.btcAddress;
- userWallet['publickey'] = parsedData.btcPublicKey;
- break;
- case 'LTC':
- userWallet['address'] = parsedData.ltcAddress;
- userWallet['publickey'] = parsedData.ltcPublicKey;
- break;
- case 'DOGE':
- userWallet['address'] = parsedData.dogeAddress;
- userWallet['publickey'] = parsedData.dogePublicKey;
- break;
- case 'DGB':
- userWallet['address'] = parsedData.dgbAddress;
- userWallet['publickey'] = parsedData.dgbPublicKey;
- break;
- case 'RVN':
- userWallet['address'] = parsedData.rvnAddress;
- userWallet['publickey'] = parsedData.rvnPublicKey;
- break;
- case 'ARRR':
- await checkArrrSyncStatus(parsedData.arrrSeed58);
- userWallet['address'] = arrrAddress;
- break;
- default:
- break;
- }
- return userWallet;
- } else {
- throw new Error(
- i18n.t('question:message.generic.user_declined_request', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- }
-};
-
-export const getWalletBalance = async (
- data,
- bypassPermission?: boolean,
- isFromExtension?: boolean,
- appInfo?: any
-) => {
- const requiredFields = ['coin'];
- const missingFields: string[] = [];
- requiredFields.forEach((field) => {
- if (!data[field]) {
- missingFields.push(field);
- }
- });
- if (missingFields.length > 0) {
- const missingFieldsString = missingFields.join(', ');
- const errorMsg = i18n.t('question:message.error.missing_fields', {
- fields: missingFieldsString,
- postProcess: 'capitalizeFirstChar',
- });
- throw new Error(errorMsg);
- }
-
- const isGateway = await isRunningGateway();
-
- if (data?.coin === 'ARRR' && isGateway)
- throw new Error(
- i18n.t('question:message.error.gateway_balance_local_node', {
- token: 'ARRR',
- postProcess: 'capitalizeFirstChar',
- })
- );
-
- const value =
- (await getPermission(
- `qAPPAutoWalletBalance-${appInfo?.name}-${data.coin}`
- )) || false;
- let skip = false;
- if (value) {
- skip = true;
- }
- let resPermission;
-
- if (!bypassPermission && !skip) {
- resPermission = await getUserPermission(
- {
- text1: i18n.t('question:permission.fetch_balance', {
- coin: data.coin, // TODO highlight coin in the modal
- postProcess: 'capitalizeFirstChar',
- }),
- checkbox1: {
- value: true,
- label: i18n.t('question:always_retrieve_balance', {
- postProcess: 'capitalizeFirstChar',
- }),
- },
- },
- isFromExtension
- );
- }
- const { accepted = false, checkbox1 = false } = resPermission || {};
- if (resPermission) {
- setPermission(
- `qAPPAutoWalletBalance-${appInfo?.name}-${data.coin}`,
- checkbox1
- );
- }
- if (accepted || bypassPermission || skip) {
- let coin = data.coin;
- const wallet = await getSaveWallet();
- const address = wallet.address0;
- const resKeyPair = await getKeyPair();
- const parsedData = resKeyPair;
- if (coin === 'QORT') {
- let qortAddress = address;
- try {
- const url = await createEndpoint(`/addresses/balance/${qortAddress}`);
- const response = await fetch(url);
- if (!response.ok)
- throw new Error(
- i18n.t('question:message.error.fetch_balance', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- let res;
- try {
- res = await response.clone().json();
- } catch (e) {
- res = await response.text();
- }
- return res;
- } catch (error) {
- throw new Error(
- error?.message ||
- i18n.t('question:message.error.fetch_wallet', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- }
- } else {
- let _url = ``;
- let _body = null;
- switch (coin) {
- case 'BTC':
- _url = await createEndpoint(`/crosschain/btc/walletbalance`);
-
- _body = parsedData.btcPublicKey;
- break;
- case 'LTC':
- _url = await createEndpoint(`/crosschain/ltc/walletbalance`);
- _body = parsedData.ltcPublicKey;
- break;
- case 'DOGE':
- _url = await createEndpoint(`/crosschain/doge/walletbalance`);
- _body = parsedData.dogePublicKey;
- break;
- case 'DGB':
- _url = await createEndpoint(`/crosschain/dgb/walletbalance`);
- _body = parsedData.dgbPublicKey;
- break;
- case 'RVN':
- _url = await createEndpoint(`/crosschain/rvn/walletbalance`);
- _body = parsedData.rvnPublicKey;
- break;
- case 'ARRR':
- await checkArrrSyncStatus(parsedData.arrrSeed58);
- _url = await createEndpoint(`/crosschain/arrr/walletbalance`);
- _body = parsedData.arrrSeed58;
- break;
- default:
- break;
- }
- try {
- const response = await fetch(_url, {
- method: 'POST',
- headers: {
- 'Content-Type': 'application/json',
- },
- body: _body,
- });
- let res;
- try {
- res = await response.clone().json();
- } catch (e) {
- res = await response.text();
- }
- if (res?.error && res?.message) {
- throw new Error(res.message);
- }
- if (isNaN(Number(res))) {
- throw new Error(
- i18n.t('question:message.error.fetch_balance', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- } else {
- return (Number(res) / 1e8).toFixed(8);
- }
- } catch (error) {
- throw new Error(
- error?.message ||
- i18n.t('question:message.error.fetch_balance', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- }
- }
- } else {
- throw new Error(
- i18n.t('question:message.generic.user_declined_request', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- }
-};
-
-const getPirateWallet = async (arrrSeed58) => {
- const isGateway = await isRunningGateway();
- if (isGateway) {
- throw new Error(
- i18n.t('question:message.error.gateway_retrieve_balance', {
- token: 'PIRATECHAIN',
- postProcess: 'capitalizeFirstChar',
- })
- );
- }
- const bodyToString = arrrSeed58;
- await checkArrrSyncStatus(bodyToString);
- const url = await createEndpoint(`/crosschain/arrr/walletaddress`);
- const response = await fetch(url, {
- method: 'POST',
- headers: {
- 'Content-Type': 'application/json',
- },
- body: bodyToString,
- });
- let res;
- try {
- res = await response.clone().json();
- } catch (e) {
- res = await response.text();
- }
- if (res?.error && res?.message) {
- throw new Error(res.message);
- }
- return res;
-};
-
-export const getUserWalletFunc = async (coin) => {
- let userWallet = {};
- const wallet = await getSaveWallet();
- const address = wallet.address0;
- const resKeyPair = await getKeyPair();
- const parsedData = resKeyPair;
- switch (coin) {
- case 'QORT':
- userWallet['address'] = address;
- userWallet['publickey'] = parsedData.publicKey;
- break;
- case 'BTC':
- case 'BITCOIN':
- userWallet['address'] = parsedData.btcAddress;
- userWallet['publickey'] = parsedData.btcPublicKey;
- break;
- case 'LTC':
- case 'LITECOIN':
- userWallet['address'] = parsedData.ltcAddress;
- userWallet['publickey'] = parsedData.ltcPublicKey;
- break;
- case 'DOGE':
- case 'DOGECOIN':
- userWallet['address'] = parsedData.dogeAddress;
- userWallet['publickey'] = parsedData.dogePublicKey;
- break;
- case 'DGB':
- case 'DIGIBYTE':
- userWallet['address'] = parsedData.dgbAddress;
- userWallet['publickey'] = parsedData.dgbPublicKey;
- break;
- case 'RVN':
- case 'RAVENCOIN':
- userWallet['address'] = parsedData.rvnAddress;
- userWallet['publickey'] = parsedData.rvnPublicKey;
- break;
- case 'ARRR':
- case 'PIRATECHAIN':
- const arrrAddress = await getPirateWallet(parsedData.arrrSeed58);
- userWallet['address'] = arrrAddress;
- break;
- default:
- break;
- }
- return userWallet;
-};
-
-export const getUserWalletInfo = async (data, isFromExtension, appInfo) => {
- const requiredFields = ['coin'];
- const missingFields: string[] = [];
- requiredFields.forEach((field) => {
- if (!data[field]) {
- missingFields.push(field);
- }
- });
- if (missingFields.length > 0) {
- const missingFieldsString = missingFields.join(', ');
- const errorMsg = i18n.t('question:message.error.missing_fields', {
- fields: missingFieldsString,
- postProcess: 'capitalizeFirstChar',
- });
- throw new Error(errorMsg);
- }
- if (data?.coin === 'ARRR') {
- throw new Error(
- i18n.t('question:message.error.token_not_supported', {
- token: 'ARRR',
- postProcess: 'capitalizeFirstChar',
- })
- );
- }
- const value =
- (await getPermission(`getUserWalletInfo-${appInfo?.name}-${data.coin}`)) ||
- false;
- let skip = false;
- if (value) {
- skip = true;
- }
- let resPermission;
-
- if (!skip) {
- resPermission = await getUserPermission(
- {
- text1: i18n.t('question:permission.get_wallet_info', {
- postProcess: 'capitalizeFirstChar',
- }),
- highlightedText: `coin: ${data.coin}`,
- checkbox1: {
- value: true,
- label: i18n.t('question:always_retrieve_wallet', {
- postProcess: 'capitalizeFirstChar',
- }),
- },
- },
- isFromExtension
- );
- }
- const { accepted = false, checkbox1 = false } = resPermission || {};
-
- if (resPermission) {
- setPermission(`getUserWalletInfo-${appInfo?.name}-${data.coin}`, checkbox1);
- }
-
- if (accepted || skip) {
- let coin = data.coin;
- let walletKeys = await getUserWalletFunc(coin);
-
- const _url = await createEndpoint(
- `/crosschain/` + data.coin.toLowerCase() + `/addressinfos`
- );
- let _body = { xpub58: walletKeys['publickey'] };
- try {
- const response = await fetch(_url, {
- method: 'POST',
- headers: {
- Accept: '*/*',
- 'Content-Type': 'application/json',
- },
- body: JSON.stringify(_body),
- });
- if (!response?.ok)
- throw new Error(
- i18n.t('question:message.error.fetch_wallet_info', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- let res;
- try {
- res = await response.clone().json();
- } catch (e) {
- res = await response.text();
- }
- if (res?.error && res?.message) {
- throw new Error(res.message);
- }
-
- return res;
- } catch (error) {
- throw new Error(
- error?.message ||
- i18n.t('question:message.error.fetch_wallet', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- }
- } else {
- throw new Error(
- i18n.t('question:message.generic.user_declined_request', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- }
-};
-
-export const getUserWalletTransactions = async (
- data,
- isFromExtension,
- appInfo
-) => {
- const requiredFields = ['coin'];
- const missingFields: string[] = [];
- requiredFields.forEach((field) => {
- if (!data[field]) {
- missingFields.push(field);
- }
- });
- if (missingFields.length > 0) {
- const missingFieldsString = missingFields.join(', ');
- const errorMsg = i18n.t('question:message.error.missing_fields', {
- fields: missingFieldsString,
- postProcess: 'capitalizeFirstChar',
- });
- throw new Error(errorMsg);
- }
-
- const value =
- (await getPermission(
- `getUserWalletTransactions-${appInfo?.name}-${data.coin}`
- )) || false;
- let skip = false;
- if (value) {
- skip = true;
- }
- let resPermission;
-
- if (!skip) {
- resPermission = await getUserPermission(
- {
- text1: i18n.t('question:permission.get_wallet_transactions', {
- postProcess: 'capitalizeFirstChar',
- }),
- highlightedText: `coin: ${data.coin}`,
- checkbox1: {
- value: true,
- label: i18n.t('question:always_retrieve_wallet_transactions', {
- postProcess: 'capitalizeFirstChar',
- }),
- },
- },
- isFromExtension
- );
- }
- const { accepted = false, checkbox1 = false } = resPermission || {};
-
- if (resPermission) {
- setPermission(
- `getUserWalletTransactions-${appInfo?.name}-${data.coin}`,
- checkbox1
- );
- }
-
- if (accepted || skip) {
- const coin = data.coin;
- const walletKeys = await getUserWalletFunc(coin);
- let publicKey;
- if (data?.coin === 'ARRR') {
- const resKeyPair = await getKeyPair();
- const parsedData = resKeyPair;
- publicKey = parsedData.arrrSeed58;
- } else {
- publicKey = walletKeys['publickey'];
- }
-
- const _url = await createEndpoint(
- `/crosschain/` + data.coin.toLowerCase() + `/wallettransactions`
- );
- const _body = publicKey;
- try {
- const response = await fetch(_url, {
- method: 'POST',
- headers: {
- Accept: '*/*',
- 'Content-Type': 'application/json',
- },
- body: _body,
- });
- if (!response?.ok)
- throw new Error(
- i18n.t('question:message.error.fetch_wallet_transactions', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- let res;
- try {
- res = await response.clone().json();
- } catch (e) {
- res = await response.text();
- }
- if (res?.error && res?.message) {
- throw new Error(res.message);
- }
-
- return res;
- } catch (error) {
- throw new Error(
- error?.message ||
- i18n.t('question:message.error.fetch_wallet_transactions', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- }
- } else {
- throw new Error(
- i18n.t('question:message.generic.user_declined_request', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- }
-};
-
-export const getCrossChainServerInfo = async (data) => {
- const requiredFields = ['coin'];
- const missingFields: string[] = [];
- requiredFields.forEach((field) => {
- if (!data[field]) {
- missingFields.push(field);
- }
- });
- if (missingFields.length > 0) {
- const missingFieldsString = missingFields.join(', ');
- const errorMsg = i18n.t('question:message.error.missing_fields', {
- fields: missingFieldsString,
- postProcess: 'capitalizeFirstChar',
- });
- throw new Error(errorMsg);
- }
- const _url = `/crosschain/` + data.coin.toLowerCase() + `/serverinfos`;
- try {
- const url = await createEndpoint(_url);
- const response = await fetch(url);
- if (!response.ok)
- throw new Error(
- i18n.t('question:message.error.fetch_generic', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- let res;
- try {
- res = await response.clone().json();
- } catch (e) {
- res = await response.text();
- }
- if (res?.error && res?.message) {
- throw new Error(res.message);
- }
- return res.servers;
- } catch (error) {
- throw new Error(
- error?.message ||
- i18n.t('question:message.error.server_info', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- }
-};
-
-export const getTxActivitySummary = async (data) => {
- const requiredFields = ['coin'];
- const missingFields: string[] = [];
- requiredFields.forEach((field) => {
- if (!data[field]) {
- missingFields.push(field);
- }
- });
-
- if (missingFields.length > 0) {
- const missingFieldsString = missingFields.join(', ');
- const errorMsg = i18n.t('question:message.error.missing_fields', {
- fields: missingFieldsString,
- postProcess: 'capitalizeFirstChar',
- });
- throw new Error(errorMsg);
- }
-
- const coin = data.coin;
- const url = `/crosschain/txactivity?foreignBlockchain=${coin}`; // No apiKey here
-
- try {
- const endpoint = await createEndpoint(url);
- const response = await fetch(endpoint, {
- method: 'POST',
- headers: {
- Accept: '*/*',
- 'Content-Type': 'application/json',
- },
- });
-
- if (!response.ok)
- throw new Error(
- i18n.t('question:message.error.fetch_generic', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- let res;
- try {
- res = await response.clone().json();
- } catch (e) {
- res = await response.text();
- }
- if (res?.error && res?.message) {
- throw new Error(res.message);
- }
- return res; // Return full response here
- } catch (error) {
- throw new Error(
- error?.message ||
- i18n.t('question:message.error.transaction_activity_summary', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- }
-};
-
-export const getForeignFee = async (data) => {
- const requiredFields = ['coin', 'type'];
- const missingFields: string[] = [];
-
- requiredFields.forEach((field) => {
- if (!data[field]) {
- missingFields.push(field);
- }
- });
-
- if (missingFields.length > 0) {
- const missingFieldsString = missingFields.join(', ');
- const errorMsg = i18n.t('question:message.error.missing_fields', {
- fields: missingFieldsString,
- postProcess: 'capitalizeFirstChar',
- });
- throw new Error(errorMsg);
- }
-
- const { coin, type } = data;
- const url = `/crosschain/${coin.toLowerCase()}/${type}`;
-
- try {
- const endpoint = await createEndpoint(url);
- const response = await fetch(endpoint, {
- method: 'GET',
- headers: {
- Accept: '*/*',
- 'Content-Type': 'application/json',
- },
- });
-
- if (!response.ok)
- throw new Error(
- i18n.t('question:message.error.fetch_generic', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- let res;
- try {
- res = await response.clone().json();
- } catch (e) {
- res = await response.text();
- }
- if (res?.error && res?.message) {
- throw new Error(res.message);
- }
- return res; // Return full response here
- } catch (error) {
- throw new Error(
- error?.message ||
- i18n.t('question:message.error.get_foreign_fee', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- }
-};
-
-function calculateRateFromFee(totalFee, sizeInBytes) {
- const fee = (totalFee / sizeInBytes) * 1000;
- return fee.toFixed(0);
-}
-
-export const updateForeignFee = async (data, isFromExtension) => {
- const isGateway = await isRunningGateway();
- if (isGateway) {
- throw new Error(
- i18n.t('question:message.generic.no_action_public_node', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- }
- const requiredFields = ['coin', 'type', 'value'];
- const missingFields: string[] = [];
-
- requiredFields.forEach((field) => {
- if (!data[field]) {
- missingFields.push(field);
- }
- });
-
- if (missingFields.length > 0) {
- const missingFieldsString = missingFields.join(', ');
- const errorMsg = i18n.t('question:message.error.missing_fields', {
- fields: missingFieldsString,
- postProcess: 'capitalizeFirstChar',
- });
- throw new Error(errorMsg);
- }
-
- const { coin, type, value } = data;
-
- const text3 =
- type === 'feerequired'
- ? i18n.t('question:sats', {
- amount: value,
- postProcess: 'capitalizeFirstChar',
- })
- : i18n.t('question:sats_per_kb', {
- amount: value,
- postProcess: 'capitalizeFirstChar',
- });
- const text4 =
- type === 'feerequired'
- ? i18n.t('question:message.generic.calculate_fee', {
- amount: value,
- rate: calculateRateFromFee(value, 300),
- postProcess: 'capitalizeFirstChar',
- })
- : '';
- const resPermission = await getUserPermission(
- {
- text1: i18n.t('question:permission.update_foreign_fee', {
- postProcess: 'capitalizeFirstChar',
- }),
- text2: `type: ${type === 'feerequired' ? 'unlocking' : 'locking'}`,
- text3: i18n.t('question:value', {
- value: text3,
- postProcess: 'capitalizeFirstChar',
- }),
- highlightedText: i18n.t('question:coin', {
- coin: coin,
- postProcess: 'capitalizeFirstChar',
- }),
- },
- isFromExtension
- );
-
- const { accepted } = resPermission;
- if (!accepted) {
- throw new Error(
- i18n.t('question:message.generic.user_declined_request', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- }
- const url = `/crosschain/${coin.toLowerCase()}/update${type}`;
- const valueStringified = JSON.stringify(+value);
-
- const endpoint = await createEndpoint(url);
- const response = await fetch(endpoint, {
- method: 'POST',
- headers: {
- Accept: '*/*',
- 'Content-Type': 'application/json',
- },
- body: valueStringified,
- });
-
- if (!response.ok)
- throw new Error(
- i18n.t('question:message.error.update_foreign_fee', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- let res;
- try {
- res = await response.clone().json();
- } catch (e) {
- res = await response.text();
- }
- if (res?.error && res?.message) {
- throw new Error(res.message);
- }
- return res; // Return full response here
-};
-
-export const getServerConnectionHistory = async (data) => {
- const requiredFields = ['coin'];
- const missingFields: string[] = [];
-
- // Validate required fields
- requiredFields.forEach((field) => {
- if (!data[field]) {
- missingFields.push(field);
- }
- });
-
- if (missingFields.length > 0) {
- const missingFieldsString = missingFields.join(', ');
- const errorMsg = i18n.t('question:message.error.missing_fields', {
- fields: missingFieldsString,
- postProcess: 'capitalizeFirstChar',
- });
- throw new Error(errorMsg);
- }
-
- const coin = data.coin.toLowerCase();
- const url = `/crosschain/${coin.toLowerCase()}/serverconnectionhistory`;
-
- try {
- const endpoint = await createEndpoint(url); // Assuming createEndpoint is available
- const response = await fetch(endpoint, {
- method: 'GET',
- headers: {
- Accept: '*/*',
- 'Content-Type': 'application/json',
- },
- });
-
- if (!response.ok)
- throw new Error(
- i18n.t('question:message.error.fetch_connection_history', {
- postProcess: 'capitalizeFirstChar',
- })
- );
-
- let res;
- try {
- res = await response.clone().json();
- } catch (e) {
- res = await response.text();
- }
-
- if (res?.error && res?.message) {
- throw new Error(res.message);
- }
-
- return res; // Return full response here
- } catch (error) {
- throw new Error(
- error?.message ||
- i18n.t('question:message.error.fetch_connection_history', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- }
-};
-
-export const setCurrentForeignServer = async (data, isFromExtension) => {
- const isGateway = await isRunningGateway();
- if (isGateway) {
- throw new Error(
- i18n.t('question:message.generic.no_action_public_node', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- }
- const requiredFields = ['coin'];
- const missingFields: string[] = [];
-
- // Validate required fields
- requiredFields.forEach((field) => {
- if (!data[field]) {
- missingFields.push(field);
- }
- });
-
- if (missingFields.length > 0) {
- const missingFieldsString = missingFields.join(', ');
- const errorMsg = i18n.t('question:message.error.missing_fields', {
- fields: missingFieldsString,
- postProcess: 'capitalizeFirstChar',
- });
- throw new Error(errorMsg);
- }
-
- const { coin, host, port, type } = data;
-
- const resPermission = await getUserPermission(
- {
- text1: i18n.t('question:permission.set_current_server', {
- postProcess: 'capitalizeFirstChar',
- }),
- text2: i18n.t('question:server_type', {
- type: type,
- postProcess: 'capitalizeFirstChar',
- }),
- text3: i18n.t('question:server_host', {
- host: host,
- postProcess: 'capitalizeFirstChar',
- }),
- highlightedText: i18n.t('question:coin', {
- coin: coin,
- postProcess: 'capitalizeFirstChar',
- }),
- },
- isFromExtension
- );
-
- const { accepted } = resPermission;
- if (!accepted) {
- throw new Error(
- i18n.t('question:message.generic.user_declined_request', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- }
- const body = {
- hostName: host,
- port: port,
- connectionType: type,
- };
-
- const url = `/crosschain/${coin.toLowerCase()}/setcurrentserver`;
-
- const endpoint = await createEndpoint(url); // Assuming createEndpoint is available
- const response = await fetch(endpoint, {
- method: 'POST',
- headers: {
- Accept: '*/*',
- 'Content-Type': 'application/json',
- },
- body: JSON.stringify(body),
- });
-
- if (!response.ok)
- throw new Error(
- i18n.t('question:message.error.server_current_set', {
- postProcess: 'capitalizeFirstChar',
- })
- );
-
- let res;
- try {
- res = await response.clone().json();
- } catch (e) {
- res = await response.text();
- }
-
- if (res?.error && res?.message) {
- throw new Error(res.message);
- }
-
- return res; // Return the full response
-};
-
-export const addForeignServer = async (data, isFromExtension) => {
- const isGateway = await isRunningGateway();
- if (isGateway) {
- throw new Error(
- i18n.t('question:message.generic.no_action_public_node', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- }
- const requiredFields = ['coin'];
- const missingFields: string[] = [];
-
- // Validate required fields
- requiredFields.forEach((field) => {
- if (!data[field]) {
- missingFields.push(field);
- }
- });
-
- if (missingFields.length > 0) {
- const missingFieldsString = missingFields.join(', ');
- const errorMsg = i18n.t('question:message.error.missing_fields', {
- fields: missingFieldsString,
- postProcess: 'capitalizeFirstChar',
- });
- throw new Error(errorMsg);
- }
-
- const { coin, host, port, type } = data;
-
- const resPermission = await getUserPermission(
- {
- text1: i18n.t('question:permission.server_add', {
- postProcess: 'capitalizeFirstChar',
- }),
- text2: i18n.t('question:server_type', {
- type: type,
- postProcess: 'capitalizeFirstChar',
- }),
- text3: i18n.t('question:server_host', {
- host: host,
- postProcess: 'capitalizeFirstChar',
- }),
- highlightedText: i18n.t('question:coin', {
- coin: coin,
- postProcess: 'capitalizeFirstChar',
- }),
- },
- isFromExtension
- );
-
- const { accepted } = resPermission;
- if (!accepted) {
- throw new Error(
- i18n.t('question:message.generic.user_declined_request', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- }
- const body = {
- hostName: host,
- port: port,
- connectionType: type,
- };
-
- const url = `/crosschain/${coin.toLowerCase()}/addserver`;
-
- const endpoint = await createEndpoint(url); // Assuming createEndpoint is available
- const response = await fetch(endpoint, {
- method: 'POST',
- headers: {
- Accept: '*/*',
- 'Content-Type': 'application/json',
- },
- body: JSON.stringify(body),
- });
-
- if (!response.ok)
- throw new Error(
- i18n.t('question:message.error.server_current_add', {
- postProcess: 'capitalizeFirstChar',
- })
- );
-
- let res;
- try {
- res = await response.clone().json();
- } catch (e) {
- res = await response.text();
- }
-
- if (res?.error && res?.message) {
- throw new Error(res.message);
- }
-
- return res; // Return the full response
-};
-
-export const removeForeignServer = async (data, isFromExtension) => {
- const isGateway = await isRunningGateway();
- if (isGateway) {
- throw new Error(
- i18n.t('question:message.generic.no_action_public_node', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- }
- const requiredFields = ['coin'];
- const missingFields: string[] = [];
-
- // Validate required fields
- requiredFields.forEach((field) => {
- if (!data[field]) {
- missingFields.push(field);
- }
- });
-
- if (missingFields.length > 0) {
- const missingFieldsString = missingFields.join(', ');
- const errorMsg = i18n.t('question:message.error.missing_fields', {
- fields: missingFieldsString,
- postProcess: 'capitalizeFirstChar',
- });
- throw new Error(errorMsg);
- }
-
- const { coin, host, port, type } = data;
-
- const resPermission = await getUserPermission(
- {
- text1: i18n.t('question:permission.server_remove', {
- postProcess: 'capitalizeFirstChar',
- }),
- text2: i18n.t('question:server_type', {
- type: type,
- postProcess: 'capitalizeFirstChar',
- }),
- text3: i18n.t('question:server_host', {
- host: host,
- postProcess: 'capitalizeFirstChar',
- }),
- highlightedText: i18n.t('question:coin', {
- coin: coin,
- postProcess: 'capitalizeFirstChar',
- }),
- },
- isFromExtension
- );
-
- const { accepted } = resPermission;
- if (!accepted) {
- throw new Error(
- i18n.t('question:message.generic.user_declined_request', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- }
- const body = {
- hostName: host,
- port: port,
- connectionType: type,
- };
-
- const url = `/crosschain/${coin.toLowerCase()}/removeserver`;
-
- const endpoint = await createEndpoint(url); // Assuming createEndpoint is available
- const response = await fetch(endpoint, {
- method: 'POST',
- headers: {
- Accept: '*/*',
- 'Content-Type': 'application/json',
- },
- body: JSON.stringify(body),
- });
-
- if (!response.ok)
- throw new Error(
- i18n.t('question:message.error.server_remove', {
- postProcess: 'capitalizeFirstChar',
- })
- );
-
- let res;
- try {
- res = await response.clone().json();
- } catch (e) {
- res = await response.text();
- }
-
- if (res?.error && res?.message) {
- throw new Error(res.message);
- }
-
- return res; // Return the full response
-};
-
-export const getDaySummary = async () => {
- const url = `/admin/summary`; // Simplified endpoint URL
-
- try {
- const endpoint = await createEndpoint(url); // Assuming createEndpoint is available for constructing the full URL
- const response = await fetch(endpoint, {
- method: 'GET',
- headers: {
- Accept: '*/*',
- },
- });
-
- if (!response.ok)
- throw new Error(
- i18n.t('question:message.error.retrieve_summary', {
- postProcess: 'capitalizeFirstChar',
- })
- );
-
- let res;
- try {
- res = await response.clone().json();
- } catch (e) {
- res = await response.text();
- }
-
- if (res?.error && res?.message) {
- throw new Error(res.message);
- }
-
- return res; // Return the full response
- } catch (error) {
- throw new Error(
- error?.message ||
- i18n.t('question:message.error.retrieve_summary', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- }
-};
-
-export const getNodeInfo = async () => {
- const url = `/admin/info`; // Simplified endpoint URL
-
- try {
- const endpoint = await createEndpoint(url); // Assuming createEndpoint is available for constructing the full URL
- const response = await fetch(endpoint, {
- method: 'GET',
- headers: {
- Accept: '*/*',
- },
- });
-
- if (!response.ok)
- throw new Error(
- i18n.t('question:message.error.node_info', {
- postProcess: 'capitalizeFirstChar',
- })
- );
-
- let res;
- try {
- res = await response.clone().json();
- } catch (e) {
- res = await response.text();
- }
-
- if (res?.error && res?.message) {
- throw new Error(res.message);
- }
-
- return res; // Return the full response
- } catch (error) {
- throw new Error(
- error?.message ||
- i18n.t('question:message.error.node_info', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- }
-};
-
-export const getNodeStatus = async () => {
- const url = `/admin/status`; // Simplified endpoint URL
-
- try {
- const endpoint = await createEndpoint(url); // Assuming createEndpoint is available for constructing the full URL
- const response = await fetch(endpoint, {
- method: 'GET',
- headers: {
- Accept: '*/*',
- },
- });
-
- if (!response.ok)
- throw new Error(
- i18n.t('question:message.error.node_status', {
- postProcess: 'capitalizeFirstChar',
- })
- );
-
- let res;
- try {
- res = await response.clone().json();
- } catch (e) {
- res = await response.text();
- }
-
- if (res?.error && res?.message) {
- throw new Error(res.message);
- }
-
- return res; // Return the full response
- } catch (error) {
- throw new Error(
- error?.message ||
- i18n.t('question:message.error.node_status', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- }
-};
-
-export const getArrrSyncStatus = async () => {
- const resKeyPair = await getKeyPair();
- const parsedData = resKeyPair;
- const arrrSeed = parsedData.arrrSeed58;
- const url = `/crosschain/arrr/syncstatus`; // Simplified endpoint URL
-
- try {
- const endpoint = await createEndpoint(url); // Assuming createEndpoint is available for constructing the full URL
- const response = await fetch(endpoint, {
- method: 'POST',
- headers: {
- Accept: '*/*',
- },
- body: arrrSeed,
- });
-
- let res;
-
- try {
- res = await response.clone().json();
- } catch (e) {
- res = await response.text();
- }
-
- return res; // Return the full response
- } catch (error) {
- throw new Error(
- error?.message ||
- i18n.t('question:message.error.retrieve_sync_status', {
- token: 'ARRR',
- postProcess: 'capitalizeFirstChar',
- })
- );
- }
-};
-
-export const sendCoin = async (data, isFromExtension) => {
- const requiredFields = ['coin', 'amount'];
- const missingFields: string[] = [];
- requiredFields.forEach((field) => {
- if (!data[field]) {
- missingFields.push(field);
- }
- });
- if (missingFields.length > 0) {
- const missingFieldsString = missingFields.join(', ');
- const errorMsg = i18n.t('question:message.error.missing_fields', {
- fields: missingFieldsString,
- postProcess: 'capitalizeFirstChar',
- });
- throw new Error(errorMsg);
- }
- if (!data?.destinationAddress && !data?.recipient) {
- throw new Error(
- i18n.t('question:message.error.missing_fields', {
- fields: 'recipient',
- postProcess: 'capitalizeFirstChar',
- })
- );
- }
- let checkCoin = data.coin;
- const wallet = await getSaveWallet();
- const address = wallet.address0;
- const resKeyPair = await getKeyPair();
- const parsedData = resKeyPair;
- const isGateway = await isRunningGateway();
-
- if (checkCoin !== 'QORT' && isGateway)
- throw new Error(
- i18n.t('question:message.error.gateway_non_qort_local_node', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- if (checkCoin === 'QORT') {
- // Params: data.coin, data.recipient, data.amount, data.fee
- // TODO: prompt user to send. If they confirm, call `POST /crosschain/:coin/send`, or for QORT, broadcast a PAYMENT transaction
- // then set the response string from the core to the `response` variable (defined above)
- // If they decline, send back JSON that includes an `error` key, such as `{"error": "User declined request"}`
- const amount = Number(data.amount);
- const recipient = data?.recipient || data.destinationAddress;
-
- const url = await createEndpoint(`/addresses/balance/${address}`);
- const response = await fetch(url);
- if (!response.ok)
- throw new Error(
- i18n.t('question:message.error.fetch_balance', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- let walletBalance;
- try {
- walletBalance = await response.clone().json();
- } catch (e) {
- walletBalance = await response.text();
- }
- if (isNaN(Number(walletBalance))) {
- const errorMsg = i18n.t('question:message.error.fetch_balance_token', {
- token: 'QORT',
- postProcess: 'capitalizeFirstChar',
- });
- throw new Error(errorMsg);
- }
-
- const transformDecimals = (Number(walletBalance) * QORT_DECIMALS).toFixed(
- 0
- );
- const walletBalanceDecimals = Number(transformDecimals);
- const amountDecimals = Number(amount) * QORT_DECIMALS;
- const fee: number = await sendQortFee();
- if (amountDecimals + fee * QORT_DECIMALS > walletBalanceDecimals) {
- const errorMsg = i18n.t('question:message.error.insufficient_funds', {
- postProcess: 'capitalizeFirstChar',
- });
- throw new Error(errorMsg);
- }
- if (amount <= 0) {
- const errorMsg = i18n.t('core:message.error.invalid_amount', {
- postProcess: 'capitalizeFirstChar',
- });
- throw new Error(errorMsg);
- }
- if (recipient.length === 0) {
- const errorMsg = i18n.t('question:message.error.empty_receiver', {
- postProcess: 'capitalizeFirstChar',
- });
- throw new Error(errorMsg);
- }
-
- const resPermission = await getUserPermission(
- {
- text1: i18n.t('question:permission.send_coins', {
- postProcess: 'capitalizeFirstChar',
- }),
- text2: i18n.t('question:to_recipient', {
- recipient: recipient,
- postProcess: 'capitalizeFirstChar',
- }),
- highlightedText: `${amount} ${checkCoin}`,
- fee: fee,
- confirmCheckbox: true,
- },
- isFromExtension
- );
- const { accepted } = resPermission;
-
- if (accepted) {
- const makePayment = await sendCoinFunc(
- { amount, password: null, receiver: recipient },
- true
- );
- return makePayment.res?.data;
- } else {
- throw new Error(
- i18n.t('question:message.generic.user_declined_request', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- }
- } else if (checkCoin === 'BTC') {
- const amount = Number(data.amount);
- const recipient = data?.recipient || data.destinationAddress;
- const xprv58 = parsedData.btcPrivateKey;
- const feePerByte = data.fee ? data.fee : btcFeePerByte;
-
- const btcWalletBalance = await getWalletBalance({ coin: checkCoin }, true);
-
- if (isNaN(Number(btcWalletBalance))) {
- throw new Error(
- i18n.t('question:message.error.fetch_balance_token', {
- token: 'BTC',
- postProcess: 'capitalizeFirstChar',
- })
- );
- }
- const btcWalletBalanceDecimals = Number(btcWalletBalance);
- const btcAmountDecimals = Number(amount);
- const fee = feePerByte * 500; // default 0.00050000
- if (btcAmountDecimals + fee > btcWalletBalanceDecimals) {
- throw new Error(
- i18n.t('question:message.error.insufficient_funds', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- }
-
- const resPermission = await getUserPermission(
- {
- text1: i18n.t('question:permission.send_coins', {
- postProcess: 'capitalizeFirstChar',
- }),
- text2: i18n.t('question:to_recipient', {
- recipient: recipient,
- postProcess: 'capitalizeFirstChar',
- }),
- highlightedText: `${amount} ${checkCoin}`,
- foreignFee: `${fee} BTC`,
- },
- isFromExtension
- );
- const { accepted } = resPermission;
-
- if (accepted) {
- const opts = {
- xprv58: xprv58,
- receivingAddress: recipient,
- bitcoinAmount: amount,
- feePerByte: feePerByte,
- };
- const url = await createEndpoint(`/crosschain/btc/send`);
-
- const response = await fetch(url, {
- method: 'POST',
- headers: {
- Accept: 'application/json',
- 'Content-Type': 'application/json',
- },
- body: JSON.stringify(opts),
- });
- if (!response.ok)
- throw new Error(
- i18n.t('question:message.error.send', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- let res;
- try {
- res = await response.clone().json();
- } catch (e) {
- res = await response.text();
- }
- return res;
- } else {
- throw new Error(
- i18n.t('question:message.generic.user_declined_request', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- }
- } else if (checkCoin === 'LTC') {
- const amount = Number(data.amount);
- const recipient = data?.recipient || data.destinationAddress;
- const xprv58 = parsedData.ltcPrivateKey;
- const feePerByte = data.fee ? data.fee : ltcFeePerByte;
- const ltcWalletBalance = await getWalletBalance({ coin: checkCoin }, true);
-
- if (isNaN(Number(ltcWalletBalance))) {
- const errorMsg = i18n.t('question:message.error.fetch_balance_token', {
- token: 'LTC',
- postProcess: 'capitalizeFirstChar',
- });
- throw new Error(errorMsg);
- }
- const ltcWalletBalanceDecimals = Number(ltcWalletBalance);
- const ltcAmountDecimals = Number(amount);
- const fee = feePerByte * 1000; // default 0.00030000
- if (ltcAmountDecimals + fee > ltcWalletBalanceDecimals) {
- throw new Error(
- i18n.t('question:message.error.insufficient_funds', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- }
- const resPermission = await getUserPermission(
- {
- text1: i18n.t('question:permission.send_coins', {
- postProcess: 'capitalizeFirstChar',
- }),
- text2: i18n.t('question:to_recipient', {
- recipient: recipient,
- postProcess: 'capitalizeFirstChar',
- }),
- highlightedText: `${amount} ${checkCoin}`,
- foreignFee: `${fee} LTC`,
- },
- isFromExtension
- );
- const { accepted } = resPermission;
-
- if (accepted) {
- const url = await createEndpoint(`/crosschain/ltc/send`);
- const opts = {
- xprv58: xprv58,
- receivingAddress: recipient,
- litecoinAmount: amount,
- feePerByte: feePerByte,
- };
- const response = await fetch(url, {
- method: 'POST',
- headers: {
- Accept: 'application/json',
- 'Content-Type': 'application/json',
- },
- body: JSON.stringify(opts),
- });
- if (!response.ok)
- throw new Error(
- i18n.t('question:message.error.send', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- let res;
- try {
- res = await response.clone().json();
- } catch (e) {
- res = await response.text();
- }
- return res;
- } else {
- throw new Error(
- i18n.t('question:message.generic.user_declined_request', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- }
- } else if (checkCoin === 'DOGE') {
- const amount = Number(data.amount);
- const recipient = data?.recipient || data.destinationAddress;
- const xprv58 = parsedData.dogePrivateKey;
- const feePerByte = data.fee ? data.fee : dogeFeePerByte;
- const dogeWalletBalance = await getWalletBalance({ coin: checkCoin }, true);
- if (isNaN(Number(dogeWalletBalance))) {
- const errorMsg = i18n.t('question:message.error.fetch_balance_token', {
- token: 'DOGE',
- postProcess: 'capitalizeFirstChar',
- });
- throw new Error(errorMsg);
- }
- const dogeWalletBalanceDecimals = Number(dogeWalletBalance);
- const dogeAmountDecimals = Number(amount);
- const fee = feePerByte * 5000; // default 0.05000000
- if (dogeAmountDecimals + fee > dogeWalletBalanceDecimals) {
- const errorMsg = i18n.t('question:message.error.insufficient_funds', {
- postProcess: 'capitalizeFirstChar',
- });
- throw new Error(errorMsg);
- }
-
- const resPermission = await getUserPermission(
- {
- text1: i18n.t('question:permission.send_coins', {
- postProcess: 'capitalizeFirstChar',
- }),
- text2: i18n.t('question:to_recipient', {
- recipient: recipient,
- postProcess: 'capitalizeFirstChar',
- }),
- highlightedText: `${amount} ${checkCoin}`,
- foreignFee: `${fee} DOGE`,
- },
- isFromExtension
- );
- const { accepted } = resPermission;
-
- if (accepted) {
- const opts = {
- xprv58: xprv58,
- receivingAddress: recipient,
- dogecoinAmount: amount,
- feePerByte: feePerByte,
- };
- const url = await createEndpoint(`/crosschain/doge/send`);
-
- const response = await fetch(url, {
- method: 'POST',
- headers: {
- Accept: 'application/json',
- 'Content-Type': 'application/json',
- },
- body: JSON.stringify(opts),
- });
- if (!response.ok)
- throw new Error(
- i18n.t('question:message.error.send', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- let res;
- try {
- res = await response.clone().json();
- } catch (e) {
- res = await response.text();
- }
- return res;
- } else {
- throw new Error(
- i18n.t('question:message.generic.user_declined_request', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- }
- } else if (checkCoin === 'DGB') {
- const amount = Number(data.amount);
- const recipient = data?.recipient || data.destinationAddress;
- const xprv58 = parsedData.dbgPrivateKey;
- const feePerByte = data.fee ? data.fee : dgbFeePerByte;
- const dgbWalletBalance = await getWalletBalance({ coin: checkCoin }, true);
- if (isNaN(Number(dgbWalletBalance))) {
- const errorMsg = i18n.t('question:message.error.fetch_balance_token', {
- token: 'DGB',
- postProcess: 'capitalizeFirstChar',
- });
- throw new Error(errorMsg);
- }
- const dgbWalletBalanceDecimals = Number(dgbWalletBalance);
- const dgbAmountDecimals = Number(amount);
- const fee = feePerByte * 500; // default 0.00005000
- if (dgbAmountDecimals + fee > dgbWalletBalanceDecimals) {
- const errorMsg = i18n.t('question:message.error.insufficient_funds', {
- postProcess: 'capitalizeFirstChar',
- });
- throw new Error(errorMsg);
- }
-
- const resPermission = await getUserPermission(
- {
- text1: i18n.t('question:permission.send_coins', {
- postProcess: 'capitalizeFirstChar',
- }),
- text2: `To: ${recipient}`,
- highlightedText: `${amount} ${checkCoin}`,
- foreignFee: `${fee} DGB`,
- },
- isFromExtension
- );
- const { accepted } = resPermission;
-
- if (accepted) {
- const opts = {
- xprv58: xprv58,
- receivingAddress: recipient,
- digibyteAmount: amount,
- feePerByte: feePerByte,
- };
- const url = await createEndpoint(`/crosschain/dgb/send`);
-
- const response = await fetch(url, {
- method: 'POST',
- headers: {
- Accept: 'application/json',
- 'Content-Type': 'application/json',
- },
- body: JSON.stringify(opts),
- });
- if (!response.ok)
- throw new Error(
- i18n.t('question:message.error.send', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- let res;
- try {
- res = await response.clone().json();
- } catch (e) {
- res = await response.text();
- }
- return res;
- } else {
- throw new Error(
- i18n.t('question:message.generic.user_declined_request', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- }
- } else if (checkCoin === 'RVN') {
- const amount = Number(data.amount);
- const recipient = data?.recipient || data.destinationAddress;
- const xprv58 = parsedData.rvnPrivateKey;
- const feePerByte = data.fee ? data.fee : rvnFeePerByte;
- const rvnWalletBalance = await getWalletBalance({ coin: checkCoin }, true);
- if (isNaN(Number(rvnWalletBalance))) {
- const errorMsg = i18n.t('question:message.error.fetch_balance_token', {
- token: 'RVN',
- postProcess: 'capitalizeFirstChar',
- });
- throw new Error(errorMsg);
- }
- const rvnWalletBalanceDecimals = Number(rvnWalletBalance);
- const rvnAmountDecimals = Number(amount);
- const fee = feePerByte * 500; // default 0.00562500
- if (rvnAmountDecimals + fee > rvnWalletBalanceDecimals) {
- const errorMsg = i18n.t('question:message.error.insufficient_funds', {
- postProcess: 'capitalizeFirstChar',
- });
- throw new Error(errorMsg);
- }
-
- const resPermission = await getUserPermission(
- {
- text1: i18n.t('question:permission.send_coins', {
- postProcess: 'capitalizeFirstChar',
- }),
- text2: `To: ${recipient}`,
- highlightedText: `${amount} ${checkCoin}`,
- foreignFee: `${fee} RVN`,
- },
- isFromExtension
- );
- const { accepted } = resPermission;
-
- if (accepted) {
- const opts = {
- xprv58: xprv58,
- receivingAddress: recipient,
- ravencoinAmount: amount,
- feePerByte: feePerByte,
- };
- const url = await createEndpoint(`/crosschain/rvn/send`);
-
- const response = await fetch(url, {
- method: 'POST',
- headers: {
- Accept: 'application/json',
- 'Content-Type': 'application/json',
- },
- body: JSON.stringify(opts),
- });
- if (!response.ok)
- throw new Error(
- i18n.t('question:message.error.send', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- let res;
- try {
- res = await response.clone().json();
- } catch (e) {
- res = await response.text();
- }
- return res;
- } else {
- throw new Error(
- i18n.t('question:message.generic.user_declined_request', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- }
- } else if (checkCoin === 'ARRR') {
- const amount = Number(data.amount);
- const recipient = data?.recipient || data.destinationAddress;
- const memo = data?.memo;
- const arrrWalletBalance = await getWalletBalance({ coin: checkCoin }, true);
-
- if (isNaN(Number(arrrWalletBalance))) {
- const errorMsg = i18n.t('question:message.error.fetch_balance_token', {
- token: 'ARR',
- postProcess: 'capitalizeFirstChar',
- });
- throw new Error(errorMsg);
- }
- const arrrWalletBalanceDecimals = Number(arrrWalletBalance);
- const arrrAmountDecimals = Number(amount);
- const fee = 0.0001;
- if (arrrAmountDecimals + fee > arrrWalletBalanceDecimals) {
- const errorMsg = i18n.t('question:message.error.insufficient_funds', {
- postProcess: 'capitalizeFirstChar',
- });
- throw new Error(errorMsg);
- }
-
- const resPermission = await getUserPermission(
- {
- text1: i18n.t('question:permission.send_coins', {
- postProcess: 'capitalizeFirstChar',
- }),
- text2: `To: ${recipient}`,
- highlightedText: `${amount} ${checkCoin}`,
- foreignFee: `${fee} ARRR`,
- },
- isFromExtension
- );
- const { accepted } = resPermission;
-
- if (accepted) {
- const opts = {
- entropy58: parsedData.arrrSeed58,
- receivingAddress: recipient,
- arrrAmount: amount,
- memo: memo,
- };
- const url = await createEndpoint(`/crosschain/arrr/send`);
-
- const response = await fetch(url, {
- method: 'POST',
- headers: {
- Accept: 'application/json',
- 'Content-Type': 'application/json',
- },
- body: JSON.stringify(opts),
- });
- if (!response.ok)
- throw new Error(
- i18n.t('question:message.error.send', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- let res;
- try {
- res = await response.clone().json();
- } catch (e) {
- res = await response.text();
- }
- return res;
- } else {
- throw new Error(
- i18n.t('question:message.generic.user_declined_request', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- }
- }
-};
-
-function calculateFeeFromRate(feePerKb, sizeInBytes) {
- return (feePerKb / 1000) * sizeInBytes;
-}
-
-const getBuyingFees = async (foreignBlockchain) => {
- const ticker = sellerForeignFee[foreignBlockchain].ticker;
- if (!ticker) throw new Error('invalid foreign blockchain');
- const unlockFee = await getForeignFee({
- coin: ticker,
- type: 'feerequired',
- });
- const lockFee = await getForeignFee({
- coin: ticker,
- type: 'feekb',
- });
- return {
- ticker: ticker,
- lock: {
- sats: lockFee,
- fee: lockFee / QORT_DECIMALS,
- },
- unlock: {
- sats: unlockFee,
- fee: unlockFee / QORT_DECIMALS,
- feePerKb: +calculateRateFromFee(+unlockFee, 300) / QORT_DECIMALS,
- },
- };
-};
-
-export const createBuyOrder = async (data, isFromExtension) => {
- const requiredFields = ['crosschainAtInfo', 'foreignBlockchain'];
- const missingFields: string[] = [];
- requiredFields.forEach((field) => {
- if (!data[field]) {
- missingFields.push(field);
- }
- });
- if (missingFields.length > 0) {
- const missingFieldsString = missingFields.join(', ');
- const errorMsg = i18n.t('question:message.error.missing_fields', {
- fields: missingFieldsString,
- postProcess: 'capitalizeFirstChar',
- });
- throw new Error(errorMsg);
- }
- const isGateway = await isRunningGateway();
- const foreignBlockchain = data.foreignBlockchain;
- const atAddresses = data.crosschainAtInfo?.map(
- (order) => order.qortalAtAddress
- );
-
- const atPromises = atAddresses.map((atAddress) =>
- requestQueueGetAtAddresses.enqueue(async () => {
- const url = await createEndpoint(`/crosschain/trade/${atAddress}`);
- const resAddress = await fetch(url);
- const resData = await resAddress.json();
- if (foreignBlockchain !== resData?.foreignBlockchain) {
- throw new Error(
- i18n.t('core:message.error.same_foreign_blockchain', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- }
- return resData;
- })
- );
-
- const crosschainAtInfo = await Promise.all(atPromises);
-
- try {
- const buyingFees = await getBuyingFees(foreignBlockchain);
- const resPermission = await getUserPermission(
- {
- text1: i18n.t('question:permission.buy_order', {
- postProcess: 'capitalizeFirstChar',
- }),
- text2: i18n.t('question:permission.buy_order_quantity', {
- quantity: atAddresses?.length,
- postProcess: 'capitalizeFirstChar',
- }),
- text3: i18n.t('question:permission.buy_order_ticker', {
- qort_amount: crosschainAtInfo?.reduce((latest, cur) => {
- return latest + +cur?.qortAmount;
- }, 0),
- foreign_amount: roundUpToDecimals(
- crosschainAtInfo?.reduce((latest, cur) => {
- return latest + +cur?.expectedForeignAmount;
- }, 0)
- ),
- ticker: buyingFees.ticker,
- postProcess: 'capitalizeFirstChar',
- }),
- highlightedText: i18n.t('auth:node.using_public_gateway', {
- gateway: isGateway,
- postProcess: 'capitalizeFirstChar',
- }),
- fee: '',
- html: `
-
-
-
-
-
${i18n.t('question:total_unlocking_fee', {
- postProcess: 'capitalizeFirstChar',
- })}
-
${(+buyingFees?.unlock?.fee * atAddresses?.length)?.toFixed(8)} ${buyingFees.ticker}
-
- ${i18n.t('question:permission.buy_order_fee_estimation', {
- quantity: atAddresses?.length,
- fee: buyingFees?.unlock?.feePerKb?.toFixed(8),
- ticker: buyingFees.ticker,
- postProcess: 'capitalizeFirstChar',
- })}
-
-
${i18n.t('question:total_locking_fee', {
- postProcess: 'capitalizeFirstChar',
- })}
-
${i18n.t('question:permission.buy_order_per_kb', {
- fee: +buyingFees?.lock.fee.toFixed(8),
- ticker: buyingFees.ticker,
- postProcess: 'capitalizeFirstChar',
- })}
-
-
-
-`,
- },
- isFromExtension
- );
- const { accepted } = resPermission;
- if (accepted) {
- const resBuyOrder = await createBuyOrderTx({
- crosschainAtInfo,
- isGateway,
- foreignBlockchain,
- });
- return resBuyOrder;
- } else {
- throw new Error(
- i18n.t('question:message.generic.user_declined_request', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- }
- } catch (error) {
- throw new Error(
- error?.message ||
- i18n.t('question:message.error.buy_order', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- }
-};
-
-const cancelTradeOfferTradeBot = async (body, keyPair) => {
- const txn = new DeleteTradeOffer().createTransaction(body);
- const url = await createEndpoint(`/crosschain/tradeoffer`);
- const bodyToString = JSON.stringify(txn);
-
- const deleteTradeBotResponse = await fetch(url, {
- method: 'DELETE',
- headers: {
- 'Content-Type': 'application/json',
- },
- body: bodyToString,
- });
-
- if (!deleteTradeBotResponse.ok) {
- throw new Error(
- i18n.t('question:message.error.update_tradebot', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- }
-
- const unsignedTxn = await deleteTradeBotResponse.text();
- const signedTxnBytes = await signTradeBotTransaction(unsignedTxn, keyPair);
- const signedBytes = Base58.encode(signedTxnBytes);
-
- let res;
- try {
- res = await processTransactionVersion2(signedBytes);
- } catch (error) {
- return {
- error: i18n.t('question:message.error.cancel_sell_order', {
- postProcess: 'capitalizeFirstChar',
- }),
- failedTradeBot: {
- atAddress: body.atAddress,
- creatorAddress: body.creatorAddress,
- },
- };
- }
- if (res?.error) {
- return {
- error: i18n.t('question:message.error.cancel_sell_order', {
- postProcess: 'capitalizeFirstChar',
- }),
- failedTradeBot: {
- atAddress: body.atAddress,
- creatorAddress: body.creatorAddress,
- },
- };
- }
- if (res?.signature) {
- return res;
- } else {
- throw new Error(
- i18n.t('question:message.error.cancel_sell_order', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- }
-};
-const findFailedTradebot = async (createBotCreationTimestamp, body) => {
- //wait 5 secs
- const wallet = await getSaveWallet();
- const address = wallet.address0;
- await new Promise((res) => {
- setTimeout(() => {
- res(null);
- }, 5000);
- });
- const url = await createEndpoint(
- `/crosschain/tradebot?foreignBlockchain=LITECOIN`
- );
-
- const tradeBotsReponse = await fetch(url, {
- method: 'GET',
- headers: {
- 'Content-Type': 'application/json',
- },
- });
- const data = await tradeBotsReponse.json();
- const latestItem2 = data
- .filter((item) => item.creatorAddress === address)
- .sort((a, b) => b.timestamp - a.timestamp)[0];
- const latestItem = data
- .filter(
- (item) =>
- item.creatorAddress === address &&
- +item.foreignAmount === +body.foreignAmount
- )
- .sort((a, b) => b.timestamp - a.timestamp)[0];
- if (
- latestItem &&
- createBotCreationTimestamp - latestItem.timestamp <= 5000 &&
- createBotCreationTimestamp > latestItem.timestamp // Ensure latestItem's timestamp is before createBotCreationTimestamp
- ) {
- return latestItem;
- } else {
- return null;
- }
-};
-const tradeBotCreateRequest = async (body, keyPair) => {
- const txn = new TradeBotCreateRequest().createTransaction(body);
- const url = await createEndpoint(`/crosschain/tradebot/create`);
- const bodyToString = JSON.stringify(txn);
-
- const unsignedTxnResponse = await fetch(url, {
- method: 'POST',
- headers: {
- 'Content-Type': 'application/json',
- },
- body: bodyToString,
- });
- if (!unsignedTxnResponse.ok)
- throw new Error(
- i18n.t('question:message.error.create_tradebot', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- const createBotCreationTimestamp = Date.now();
- const unsignedTxn = await unsignedTxnResponse.text();
- const signedTxnBytes = await signTradeBotTransaction(unsignedTxn, keyPair);
- const signedBytes = Base58.encode(signedTxnBytes);
-
- let res;
- try {
- res = await processTransactionVersion2(signedBytes);
- } catch (error) {
- const findFailedTradeBot = await findFailedTradebot(
- createBotCreationTimestamp,
- body
- );
- return {
- error: i18n.t('question:message.error.create_sell_order', {
- postProcess: 'capitalizeFirstChar',
- }),
- failedTradeBot: findFailedTradeBot,
- };
- }
-
- if (res?.signature) {
- return res;
- } else {
- throw new Error(
- i18n.t('question:message.error.create_sell_order', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- }
-};
-
-export const createSellOrder = async (data, isFromExtension) => {
- const requiredFields = ['qortAmount', 'foreignBlockchain', 'foreignAmount'];
- const missingFields: string[] = [];
- requiredFields.forEach((field) => {
- if (!data[field]) {
- missingFields.push(field);
- }
- });
- if (missingFields.length > 0) {
- const missingFieldsString = missingFields.join(', ');
- const errorMsg = i18n.t('question:message.error.missing_fields', {
- fields: missingFieldsString,
- postProcess: 'capitalizeFirstChar',
- });
- throw new Error(errorMsg);
- }
-
- const parsedForeignAmount = Number(data.foreignAmount)?.toFixed(8);
-
- const receivingAddress = await getUserWalletFunc(data.foreignBlockchain);
- try {
- const resPermission = await getUserPermission(
- {
- text1: i18n.t('question:permission.sell_order', {
- postProcess: 'capitalizeFirstChar',
- }),
- text2: i18n.t('question:permission.order_detail', {
- qort_amount: data.qortAmount,
- foreign_amount: parsedForeignAmount,
- ticker: data.foreignBlockchain,
- postProcess: 'capitalizeFirstChar',
- }),
- fee: '0.02',
- },
- isFromExtension
- );
- const { accepted } = resPermission;
- if (accepted) {
- const resKeyPair = await getKeyPair();
- const parsedData = resKeyPair;
- const userPublicKey = parsedData.publicKey;
- const uint8PrivateKey = Base58.decode(parsedData.privateKey);
- const uint8PublicKey = Base58.decode(parsedData.publicKey);
- const keyPair = {
- privateKey: uint8PrivateKey,
- publicKey: uint8PublicKey,
- };
- const response = await tradeBotCreateRequest(
- {
- creatorPublicKey: userPublicKey,
- qortAmount: parseFloat(data.qortAmount),
- fundingQortAmount: parseFloat(data.qortAmount) + 0.01,
- foreignBlockchain: data.foreignBlockchain,
- foreignAmount: parseFloat(parsedForeignAmount),
- tradeTimeout: 120,
- receivingAddress: receivingAddress.address,
- },
- keyPair
- );
-
- return response;
- } else {
- throw new Error(
- i18n.t('question:message.generic.user_declined_request', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- }
- } catch (error) {
- throw new Error(
- error?.message ||
- i18n.t('question:message.error.submit_sell_order', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- }
-};
-
-export const cancelSellOrder = async (data, isFromExtension) => {
- const requiredFields = ['atAddress'];
- const missingFields: string[] = [];
-
- requiredFields.forEach((field) => {
- if (!data[field]) {
- missingFields.push(field);
- }
- });
- if (missingFields.length > 0) {
- const missingFieldsString = missingFields.join(', ');
- const errorMsg = i18n.t('question:message.error.missing_fields', {
- fields: missingFieldsString,
- postProcess: 'capitalizeFirstChar',
- });
- throw new Error(errorMsg);
- }
-
- const url = await createEndpoint(`/crosschain/trade/${data.atAddress}`);
- const resAddress = await fetch(url);
- const resData = await resAddress.json();
-
- if (!resData?.qortalAtAddress)
- throw new Error(
- i18n.t('question:message.error.at_info', {
- postProcess: 'capitalizeFirstChar',
- })
- );
-
- try {
- const fee = await getFee('MESSAGE');
-
- const resPermission = await getUserPermission(
- {
- text1: i18n.t('question:permission.cancel_sell_order', {
- postProcess: 'capitalizeFirstChar',
- }),
- text2: i18n.t('question:permission.order_detail', {
- qort_amount: resData.qortAmount,
- foreign_amount: resData.expectedForeignAmount,
- ticker: resData.foreignBlockchain,
- postProcess: 'capitalizeFirstChar',
- }),
- fee: fee.fee,
- },
- isFromExtension
- );
- const { accepted } = resPermission;
- if (accepted) {
- const resKeyPair = await getKeyPair();
- const parsedData = resKeyPair;
- const userPublicKey = parsedData.publicKey;
- const uint8PrivateKey = Base58.decode(parsedData.privateKey);
- const uint8PublicKey = Base58.decode(parsedData.publicKey);
- const keyPair = {
- privateKey: uint8PrivateKey,
- publicKey: uint8PublicKey,
- };
- const response = await cancelTradeOfferTradeBot(
- {
- creatorPublicKey: userPublicKey,
- atAddress: data.atAddress,
- },
- keyPair
- );
-
- return response;
- } else {
- throw new Error(
- i18n.t('question:message.generic.user_declined_request', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- }
- } catch (error) {
- throw new Error(
- error?.message ||
- i18n.t('question:message.error.submit_sell_order', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- }
-};
-
-export const openNewTab = async (data, isFromExtension) => {
- const requiredFields = ['qortalLink'];
- const missingFields: string[] = [];
- requiredFields.forEach((field) => {
- if (!data[field]) {
- missingFields.push(field);
- }
- });
- if (missingFields.length > 0) {
- const missingFieldsString = missingFields.join(', ');
- const errorMsg = i18n.t('question:message.error.missing_fields', {
- fields: missingFieldsString,
- postProcess: 'capitalizeFirstChar',
- });
- throw new Error(errorMsg);
- }
-
- const res = extractComponents(data.qortalLink);
- if (res) {
- const { service, name, identifier, path } = res;
- if (!service && !name)
- throw new Error(
- i18n.t('auth:message.error.invalid_qortal_link', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- executeEvent('addTab', { data: { service, name, identifier, path } });
- executeEvent('open-apps-mode', {});
- return true;
- } else {
- throw new Error(
- i18n.t('auth:message.error.invalid_qortal_link', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- }
-};
-
-export const adminAction = async (data, isFromExtension) => {
- const requiredFields = ['type'];
- const missingFields: string[] = [];
- requiredFields.forEach((field) => {
- if (!data[field]) {
- missingFields.push(field);
- }
- });
- // For actions that require a value, check for 'value' field
- const actionsRequiringValue = [
- 'addpeer',
- 'removepeer',
- 'forcesync',
- 'addmintingaccount',
- 'removemintingaccount',
- ];
- if (actionsRequiringValue.includes(data.type.toLowerCase()) && !data.value) {
- missingFields.push('value');
- }
- if (missingFields.length > 0) {
- const missingFieldsString = missingFields.join(', ');
- const errorMsg = i18n.t('question:message.error.missing_fields', {
- fields: missingFieldsString,
- postProcess: 'capitalizeFirstChar',
- });
- throw new Error(errorMsg);
- }
- const isGateway = await isRunningGateway();
- if (isGateway) {
- throw new Error(
- i18n.t('question:message.generic.no_action_public_node', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- }
-
- let apiEndpoint = '';
- let method = 'GET'; // Default method
- let includeValueInBody = false;
- switch (data.type.toLowerCase()) {
- case 'stop':
- apiEndpoint = await createEndpoint('/admin/stop');
- break;
- case 'restart':
- apiEndpoint = await createEndpoint('/admin/restart');
- break;
- case 'bootstrap':
- apiEndpoint = await createEndpoint('/admin/bootstrap');
- break;
- case 'addmintingaccount':
- apiEndpoint = await createEndpoint('/admin/mintingaccounts');
- method = 'POST';
- includeValueInBody = true;
- break;
- case 'removemintingaccount':
- apiEndpoint = await createEndpoint('/admin/mintingaccounts');
- method = 'DELETE';
- includeValueInBody = true;
- break;
- case 'forcesync':
- apiEndpoint = await createEndpoint('/admin/forcesync');
- method = 'POST';
- includeValueInBody = true;
- break;
- case 'addpeer':
- apiEndpoint = await createEndpoint('/peers');
- method = 'POST';
- includeValueInBody = true;
- break;
- case 'removepeer':
- apiEndpoint = await createEndpoint('/peers');
- method = 'DELETE';
- includeValueInBody = true;
- break;
- default:
- throw new Error(
- i18n.t('question:message.error.unknown_admin_action_type', {
- type: data.type,
- postProcess: 'capitalizeFirstChar',
- })
- );
- }
- // Prepare the permission prompt text
- let permissionText = i18n.t('question:permission.perform_admin_action', {
- type: data.type,
- postProcess: 'capitalizeFirstChar',
- });
-
- if (data.value) {
- permissionText +=
- ' ' +
- i18n.t('question:permission.perform_admin_action_with_value', {
- value: data.value,
- postProcess: 'capitalizeFirstChar',
- });
- }
-
- const resPermission = await getUserPermission(
- {
- text1: permissionText,
- },
- isFromExtension
- );
-
- const { accepted } = resPermission;
-
- if (accepted) {
- // Set up options for the API call
- const options: RequestInit = {
- method: method,
- headers: {},
- };
- if (includeValueInBody) {
- options.headers['Content-Type'] = 'text/plain';
- options.body = data.value;
- }
- const response = await fetch(apiEndpoint, options);
- if (!response.ok)
- throw new Error(
- i18n.t('question:message.error.perform_request', {
- postProcess: 'capitalizeFirstChar',
- })
- );
-
- let res;
- try {
- res = await response.clone().json();
- } catch (e) {
- res = await response.text();
- }
- return res;
- } else {
- throw new Error(
- i18n.t('question:message.generic.user_declined_request', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- }
-};
-
-export const signTransaction = async (data, isFromExtension) => {
- const requiredFields = ['unsignedBytes'];
- const missingFields: string[] = [];
- requiredFields.forEach((field) => {
- if (!data[field]) {
- missingFields.push(field);
- }
- });
- if (missingFields.length > 0) {
- const missingFieldsString = missingFields.join(', ');
- const errorMsg = i18n.t('question:message.error.missing_fields', {
- fields: missingFieldsString,
- postProcess: 'capitalizeFirstChar',
- });
- throw new Error(errorMsg);
- }
-
- const shouldProcess = data?.process || false;
- const _url = await createEndpoint(
- '/transactions/decode?ignoreValidityChecks=false'
- );
-
- const _body = data.unsignedBytes;
- const response = await fetch(_url, {
- method: 'POST',
- headers: {
- 'Content-Type': 'application/json',
- },
- body: _body,
- });
-
- if (!response.ok)
- throw new Error(
- i18n.t('question:message.error.decode_transaction', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- const decodedData = await response.json();
- const resPermission = await getUserPermission(
- {
- text1: shouldProcess
- ? i18n.t('question:permission.sign_process_transaction', {
- postProcess: 'capitalizeFirstChar',
- })
- : i18n.t('question:permission.sign_transaction', {
- postProcess: 'capitalizeFirstChar',
- }),
- highlightedText: i18n.t(
- 'question:message.generic.read_transaction_carefully',
- { postProcess: 'capitalizeFirstChar' }
- ),
- text2: `Tx type: ${decodedData.type}`,
- json: decodedData,
- },
- isFromExtension
- );
-
- const { accepted } = resPermission;
- if (accepted) {
- let urlConverted = await createEndpoint('/transactions/convert');
-
- const responseConverted = await fetch(urlConverted, {
- method: 'POST',
- headers: {
- 'Content-Type': 'application/json',
- },
- body: data.unsignedBytes,
- });
- const resKeyPair = await getKeyPair();
- const parsedData = resKeyPair;
- const uint8PrivateKey = Base58.decode(parsedData.privateKey);
- const uint8PublicKey = Base58.decode(parsedData.publicKey);
- const keyPair = {
- privateKey: uint8PrivateKey,
- publicKey: uint8PublicKey,
- };
- const convertedBytes = await responseConverted.text();
- const txBytes = Base58.decode(data.unsignedBytes);
- const _arbitraryBytesBuffer = Object.keys(txBytes).map(function (key) {
- return txBytes[key];
- });
- const arbitraryBytesBuffer = new Uint8Array(_arbitraryBytesBuffer);
- const txByteSigned = Base58.decode(convertedBytes);
- const _bytesForSigningBuffer = Object.keys(txByteSigned).map(
- function (key) {
- return txByteSigned[key];
- }
- );
- const bytesForSigningBuffer = new Uint8Array(_bytesForSigningBuffer);
- const signature = nacl.sign.detached(
- bytesForSigningBuffer,
- keyPair.privateKey
- );
- const signedBytes = utils.appendBuffer(arbitraryBytesBuffer, signature);
- const signedBytesToBase58 = Base58.encode(signedBytes);
- if (!shouldProcess) {
- return signedBytesToBase58;
- }
- const res = await processTransactionVersion2(signedBytesToBase58);
- if (!res?.signature)
- throw new Error(
- res?.message ||
- i18n.t('question:message.error.process_transaction', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- return res;
- } else {
- throw new Error(
- i18n.t('question:message.generic.user_declined_request', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- }
-};
-
-const missingFieldsFunc = (data, requiredFields) => {
- const missingFields: string[] = [];
- requiredFields.forEach((field) => {
- if (!data[field]) {
- missingFields.push(field);
- }
- });
- if (missingFields.length > 0) {
- const missingFieldsString = missingFields.join(', ');
- const errorMsg = i18n.t('question:message.error.missing_fields', {
- fields: missingFieldsString,
- postProcess: 'capitalizeFirstChar',
- });
- throw new Error(errorMsg);
- }
-};
-
-const encode = (value) => encodeURIComponent(value.trim()); // Helper to encode values
-const buildQueryParams = (data) => {
- const allowedParams = [
- 'name',
- 'service',
- 'identifier',
- 'mimeType',
- 'fileName',
- 'encryptionType',
- 'key',
- ];
- return Object.entries(data)
- .map(([key, value]) => {
- if (
- value === undefined ||
- value === null ||
- value === false ||
- !allowedParams.includes(key)
- )
- return null; // Skip null, undefined, or false
- if (typeof value === 'boolean') return `${key}=${value}`; // Handle boolean values
- return `${key}=${encode(value)}`; // Encode other values
- })
- .filter(Boolean) // Remove null values
- .join('&'); // Join with `&`
-};
-export const createAndCopyEmbedLink = async (data, isFromExtension) => {
- const requiredFields = ['type'];
- const missingFields: string[] = [];
- requiredFields.forEach((field) => {
- if (!data[field]) {
- missingFields.push(field);
- }
- });
- if (missingFields.length > 0) {
- const missingFieldsString = missingFields.join(', ');
- const errorMsg = i18n.t('question:message.error.missing_fields', {
- fields: missingFieldsString,
- postProcess: 'capitalizeFirstChar',
- });
- throw new Error(errorMsg);
- }
-
- switch (data.type) {
- case 'POLL': {
- missingFieldsFunc(data, ['type', 'name']);
-
- const queryParams = [
- `name=${encode(data.name)}`,
- data.ref ? `ref=${encode(data.ref)}` : null, // Add only if ref exists
- ]
- .filter(Boolean) // Remove null values
- .join('&'); // Join with `&`
- const link = `qortal://use-embed/POLL?${queryParams}`;
- try {
- await navigator.clipboard.writeText(link);
- } catch (error) {
- throw new Error(
- i18n.t('question:message.error.copy_clipboard', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- }
- return link;
- }
- case 'IMAGE':
- case 'ATTACHMENT': {
- missingFieldsFunc(data, ['type', 'name', 'service', 'identifier']);
- if (data?.encryptionType === 'private' && !data?.key) {
- throw new Error(
- i18n.t('question:message.generic.provide_key_shared_link', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- }
- const queryParams = buildQueryParams(data);
-
- const link = `qortal://use-embed/${data.type}?${queryParams}`;
-
- try {
- await navigator.clipboard.writeText(link);
- } catch (error) {
- throw new Error(
- i18n.t('question:message.error.copy_clipboard', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- }
-
- return link;
- }
-
- default:
- throw new Error(
- i18n.t('question:message.error.invalid_type', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- }
-};
-
-export const registerNameRequest = async (data, isFromExtension) => {
- const requiredFields = ['name'];
- const missingFields: string[] = [];
- requiredFields.forEach((field) => {
- if (!data[field]) {
- missingFields.push(field);
- }
- });
-
- if (missingFields.length > 0) {
- const missingFieldsString = missingFields.join(', ');
- const errorMsg = i18n.t('question:message.error.missing_fields', {
- fields: missingFieldsString,
- postProcess: 'capitalizeFirstChar',
- });
- throw new Error(errorMsg);
- }
- const fee = await getFee('REGISTER_NAME');
- const resPermission = await getUserPermission(
- {
- text1: i18n.t('question:permission.register_name', {
- postProcess: 'capitalizeFirstChar',
- }),
- highlightedText: data.name,
- text2: data?.description,
- fee: fee.fee,
- },
- isFromExtension
- );
- const { accepted } = resPermission;
- if (accepted) {
- const name = data.name;
- const description = data?.description || '';
- const response = await registerName({ name, description });
- return response;
- } else {
- throw new Error(
- i18n.t('question:message.generic.user_declined_request', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- }
-};
-
-export const updateNameRequest = async (data, isFromExtension) => {
- const requiredFields = ['newName', 'oldName'];
- const missingFields: string[] = [];
- requiredFields.forEach((field) => {
- if (!data[field]) {
- missingFields.push(field);
- }
- });
- if (missingFields.length > 0) {
- const missingFieldsString = missingFields.join(', ');
- const errorMsg = i18n.t('question:message.error.missing_fields', {
- fields: missingFieldsString,
- postProcess: 'capitalizeFirstChar',
- });
- throw new Error(errorMsg);
- }
- const oldName = data.oldName;
- const newName = data.newName;
- const description = data?.description || '';
- const fee = await getFee('UPDATE_NAME');
- const resPermission = await getUserPermission(
- {
- text1: i18n.t('question:permission.register_name', {
- postProcess: 'capitalizeFirstChar',
- }),
- highlightedText: data.newName,
- text2: data?.description,
- fee: fee.fee,
- },
- isFromExtension
- );
- const { accepted } = resPermission;
- if (accepted) {
- const response = await updateName({ oldName, newName, description });
- return response;
- } else {
- throw new Error(
- i18n.t('question:message.generic.user_declined_request', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- }
-};
-
-export const leaveGroupRequest = async (data, isFromExtension) => {
- const requiredFields = ['groupId'];
- const missingFields: string[] = [];
- requiredFields.forEach((field) => {
- if (!data[field]) {
- missingFields.push(field);
- }
- });
- if (missingFields.length > 0) {
- const missingFieldsString = missingFields.join(', ');
- const errorMsg = i18n.t('question:message.error.missing_fields', {
- fields: missingFieldsString,
- postProcess: 'capitalizeFirstChar',
- });
- throw new Error(errorMsg);
- }
- const groupId = data.groupId;
- let groupInfo = null;
- try {
- const url = await createEndpoint(`/groups/${groupId}`);
- const response = await fetch(url);
- if (!response.ok)
- throw new Error(
- i18n.t('question:message.error.fetch_group', {
- postProcess: 'capitalizeFirstChar',
- })
- );
-
- groupInfo = await response.json();
- } catch (error) {
- const errorMsg =
- (error && error.message) ||
- i18n.t('question:message.error.no_group_found', {
- postProcess: 'capitalizeFirstChar',
- });
- throw new Error(errorMsg);
- }
-
- const fee = await getFee('LEAVE_GROUP');
- const resPermission = await getUserPermission(
- {
- text1: i18n.t('question:permission.leave_group', {
- postProcess: 'capitalizeFirstChar',
- }),
- highlightedText: `${groupInfo.groupName}`,
- fee: fee.fee,
- },
- isFromExtension
- );
- const { accepted } = resPermission;
- if (accepted) {
- const response = await leaveGroup({ groupId });
- return response;
- } else {
- throw new Error(
- i18n.t('question:message.generic.user_declined_request', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- }
-};
-
-export const inviteToGroupRequest = async (data, isFromExtension) => {
- const requiredFields = ['groupId', 'inviteTime', 'inviteeAddress'];
- const missingFields: string[] = [];
- requiredFields.forEach((field) => {
- if (!data[field]) {
- missingFields.push(field);
- }
- });
- if (missingFields.length > 0) {
- const missingFieldsString = missingFields.join(', ');
- const errorMsg = i18n.t('question:message.error.missing_fields', {
- fields: missingFieldsString,
- postProcess: 'capitalizeFirstChar',
- });
- throw new Error(errorMsg);
- }
- const groupId = data.groupId;
- const qortalAddress = data?.inviteeAddress;
- const inviteTime = data?.inviteTime;
-
- let groupInfo = null;
- try {
- const url = await createEndpoint(`/groups/${groupId}`);
- const response = await fetch(url);
- if (!response.ok)
- throw new Error(
- i18n.t('question:message.error.fetch_group', {
- postProcess: 'capitalizeFirstChar',
- })
- );
-
- groupInfo = await response.json();
- } catch (error) {
- const errorMsg =
- (error && error.message) ||
- i18n.t('question:message.error.no_group_found', {
- postProcess: 'capitalizeFirstChar',
- });
- throw new Error(errorMsg);
- }
-
- const displayInvitee = await getNameInfoForOthers(qortalAddress);
-
- const fee = await getFee('GROUP_INVITE');
- const resPermission = await getUserPermission(
- {
- text1: i18n.t('question:permission.invite', {
- invitee: displayInvitee || qortalAddress,
- postProcess: 'capitalizeFirstChar',
- }),
- highlightedText: i18n.t('group:group.group_name', {
- name: groupInfo?.groupName,
- postProcess: 'capitalizeFirstChar',
- }),
- fee: fee.fee,
- },
- isFromExtension
- );
- const { accepted } = resPermission;
- if (accepted) {
- const response = await inviteToGroup({
- groupId,
- qortalAddress,
- inviteTime,
- });
- return response;
- } else {
- throw new Error(
- i18n.t('question:message.generic.user_declined_request', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- }
-};
-
-export const kickFromGroupRequest = async (data, isFromExtension) => {
- const requiredFields = ['groupId', 'qortalAddress'];
- const missingFields: string[] = [];
- requiredFields.forEach((field) => {
- if (!data[field]) {
- missingFields.push(field);
- }
- });
- if (missingFields.length > 0) {
- const missingFieldsString = missingFields.join(', ');
- const errorMsg = i18n.t('question:message.error.missing_fields', {
- fields: missingFieldsString,
- postProcess: 'capitalizeFirstChar',
- });
- throw new Error(errorMsg);
- }
- const groupId = data.groupId;
- const qortalAddress = data?.qortalAddress;
- const reason = data?.reason;
-
- let groupInfo = null;
- try {
- const url = await createEndpoint(`/groups/${groupId}`);
- const response = await fetch(url);
- if (!response.ok)
- throw new Error(
- i18n.t('question:message.error.fetch_group', {
- postProcess: 'capitalizeFirstChar',
- })
- );
-
- groupInfo = await response.json();
- } catch (error) {
- const errorMsg =
- (error && error.message) ||
- i18n.t('question:message.error.no_group_found', {
- postProcess: 'capitalizeFirstChar',
- });
- throw new Error(errorMsg);
- }
-
- const displayInvitee = await getNameInfoForOthers(qortalAddress);
-
- const fee = await getFee('GROUP_KICK');
- const resPermission = await getUserPermission(
- {
- text1: i18n.t('question:permission.kick', {
- partecipant: displayInvitee || qortalAddress,
- postProcess: 'capitalizeFirstChar',
- }),
- highlightedText: i18n.t('group:group.group_name', {
- name: groupInfo?.groupName,
- postProcess: 'capitalizeFirstChar',
- }),
- fee: fee.fee,
- },
- isFromExtension
- );
- const { accepted } = resPermission;
- if (accepted) {
- const response = await kickFromGroup({
- groupId,
- qortalAddress,
- rBanReason: reason,
- });
- return response;
- } else {
- throw new Error(
- i18n.t('question:message.generic.user_declined_request', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- }
-};
-
-export const banFromGroupRequest = async (data, isFromExtension) => {
- const requiredFields = ['groupId', 'qortalAddress'];
- const missingFields: string[] = [];
- requiredFields.forEach((field) => {
- if (!data[field]) {
- missingFields.push(field);
- }
- });
- if (missingFields.length > 0) {
- const missingFieldsString = missingFields.join(', ');
- const errorMsg = i18n.t('question:message.error.missing_fields', {
- fields: missingFieldsString,
- postProcess: 'capitalizeFirstChar',
- });
- throw new Error(errorMsg);
- }
- const groupId = data.groupId;
- const qortalAddress = data?.qortalAddress;
- const rBanTime = data?.banTime;
- const reason = data?.reason;
- let groupInfo = null;
- try {
- const url = await createEndpoint(`/groups/${groupId}`);
- const response = await fetch(url);
- if (!response.ok)
- throw new Error(
- i18n.t('question:message.error.fetch_group', {
- postProcess: 'capitalizeFirstChar',
- })
- );
-
- groupInfo = await response.json();
- } catch (error) {
- const errorMsg =
- (error && error.message) ||
- i18n.t('question:message.error.no_group_found', {
- postProcess: 'capitalizeFirstChar',
- });
- throw new Error(errorMsg);
- }
-
- const displayInvitee = await getNameInfoForOthers(qortalAddress);
-
- const fee = await getFee('GROUP_BAN');
- const resPermission = await getUserPermission(
- {
- text1: i18n.t('question:permission.ban', {
- partecipant: displayInvitee || qortalAddress,
- postProcess: 'capitalizeFirstChar',
- }),
- highlightedText: i18n.t('group:group.group_name', {
- name: groupInfo?.groupName,
- postProcess: 'capitalizeFirstChar',
- }),
- fee: fee.fee,
- },
- isFromExtension
- );
- const { accepted } = resPermission;
- if (accepted) {
- const response = await banFromGroup({
- groupId,
- qortalAddress,
- rBanTime,
- rBanReason: reason,
- });
- return response;
- } else {
- throw new Error(
- i18n.t('question:message.generic.user_declined_request', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- }
-};
-
-export const cancelGroupBanRequest = async (data, isFromExtension) => {
- const requiredFields = ['groupId', 'qortalAddress'];
- const missingFields: string[] = [];
- requiredFields.forEach((field) => {
- if (!data[field]) {
- missingFields.push(field);
- }
- });
- if (missingFields.length > 0) {
- const missingFieldsString = missingFields.join(', ');
- const errorMsg = i18n.t('question:message.error.missing_fields', {
- fields: missingFieldsString,
- postProcess: 'capitalizeFirstChar',
- });
- throw new Error(errorMsg);
- }
- const groupId = data.groupId;
- const qortalAddress = data?.qortalAddress;
-
- let groupInfo = null;
- try {
- const url = await createEndpoint(`/groups/${groupId}`);
- const response = await fetch(url);
- if (!response.ok)
- throw new Error(
- i18n.t('question:message.error.fetch_group', {
- postProcess: 'capitalizeFirstChar',
- })
- );
-
- groupInfo = await response.json();
- } catch (error) {
- const errorMsg =
- (error && error.message) ||
- i18n.t('question:message.error.no_group_found', {
- postProcess: 'capitalizeFirstChar',
- });
- throw new Error(errorMsg);
- }
-
- const displayInvitee = await getNameInfoForOthers(qortalAddress);
-
- const fee = await getFee('CANCEL_GROUP_BAN');
- const resPermission = await getUserPermission(
- {
- text1: i18n.t('question:permission.cancel_ban', {
- partecipant: displayInvitee || qortalAddress,
- postProcess: 'capitalizeFirstChar',
- }),
- highlightedText: i18n.t('group:group.group_name', {
- name: groupInfo?.groupName,
- postProcess: 'capitalizeFirstChar',
- }),
- fee: fee.fee,
- },
- isFromExtension
- );
- const { accepted } = resPermission;
- if (accepted) {
- const response = await cancelBan({
- groupId,
- qortalAddress,
- });
- return response;
- } else {
- throw new Error(
- i18n.t('question:message.generic.user_declined_request', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- }
-};
-
-export const addGroupAdminRequest = async (data, isFromExtension) => {
- const requiredFields = ['groupId', 'qortalAddress'];
- const missingFields: string[] = [];
- requiredFields.forEach((field) => {
- if (!data[field]) {
- missingFields.push(field);
- }
- });
- if (missingFields.length > 0) {
- const missingFieldsString = missingFields.join(', ');
- const errorMsg = i18n.t('question:message.error.missing_fields', {
- fields: missingFieldsString,
- postProcess: 'capitalizeFirstChar',
- });
- throw new Error(errorMsg);
- }
- const groupId = data.groupId;
- const qortalAddress = data?.qortalAddress;
-
- let groupInfo = null;
- try {
- const url = await createEndpoint(`/groups/${groupId}`);
- const response = await fetch(url);
- if (!response.ok)
- throw new Error(
- i18n.t('question:message.error.fetch_group', {
- postProcess: 'capitalizeFirstChar',
- })
- );
-
- groupInfo = await response.json();
- } catch (error) {
- const errorMsg =
- (error && error.message) ||
- i18n.t('question:message.error.no_group_found', {
- postProcess: 'capitalizeFirstChar',
- });
- throw new Error(errorMsg);
- }
-
- const displayInvitee = await getNameInfoForOthers(qortalAddress);
-
- const fee = await getFee('ADD_GROUP_ADMIN');
- const resPermission = await getUserPermission(
- {
- text1: i18n.t('question:permission.add_admin', {
- invitee: displayInvitee || qortalAddress,
- postProcess: 'capitalizeFirstChar',
- }),
- highlightedText: i18n.t('group:group.group_name', {
- name: groupInfo?.groupName,
- postProcess: 'capitalizeFirstChar',
- }),
- fee: fee.fee,
- },
- isFromExtension
- );
- const { accepted } = resPermission;
- if (accepted) {
- const response = await makeAdmin({
- groupId,
- qortalAddress,
- });
- return response;
- } else {
- throw new Error(
- i18n.t('question:message.generic.user_declined_request', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- }
-};
-
-export const removeGroupAdminRequest = async (data, isFromExtension) => {
- const requiredFields = ['groupId', 'qortalAddress'];
- const missingFields: string[] = [];
- requiredFields.forEach((field) => {
- if (!data[field]) {
- missingFields.push(field);
- }
- });
- if (missingFields.length > 0) {
- const missingFieldsString = missingFields.join(', ');
- const errorMsg = i18n.t('question:message.error.missing_fields', {
- fields: missingFieldsString,
- postProcess: 'capitalizeFirstChar',
- });
- throw new Error(errorMsg);
- }
- const groupId = data.groupId;
- const qortalAddress = data?.qortalAddress;
-
- let groupInfo = null;
- try {
- const url = await createEndpoint(`/groups/${groupId}`);
- const response = await fetch(url);
- if (!response.ok)
- throw new Error(
- i18n.t('question:message.error.fetch_group', {
- postProcess: 'capitalizeFirstChar',
- })
- );
-
- groupInfo = await response.json();
- } catch (error) {
- const errorMsg =
- (error && error.message) ||
- i18n.t('question:message.error.no_group_found', {
- postProcess: 'capitalizeFirstChar',
- });
- throw new Error(errorMsg);
- }
-
- const displayInvitee = await getNameInfoForOthers(qortalAddress);
-
- const fee = await getFee('REMOVE_GROUP_ADMIN');
- const resPermission = await getUserPermission(
- {
- text1: i18n.t('question:permission.remove_admin', {
- partecipant: displayInvitee || qortalAddress,
- postProcess: 'capitalizeFirstChar',
- }),
- highlightedText: i18n.t('group:group.group_name', {
- name: groupInfo?.groupName,
- postProcess: 'capitalizeFirstChar',
- }),
- fee: fee.fee,
- },
- isFromExtension
- );
- const { accepted } = resPermission;
- if (accepted) {
- const response = await removeAdmin({
- groupId,
- qortalAddress,
- });
- return response;
- } else {
- throw new Error(
- i18n.t('question:message.generic.user_declined_request', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- }
-};
-
-export const cancelGroupInviteRequest = async (data, isFromExtension) => {
- const requiredFields = ['groupId', 'qortalAddress'];
- const missingFields: string[] = [];
- requiredFields.forEach((field) => {
- if (!data[field]) {
- missingFields.push(field);
- }
- });
- if (missingFields.length > 0) {
- const missingFieldsString = missingFields.join(', ');
- const errorMsg = i18n.t('question:message.error.missing_fields', {
- fields: missingFieldsString,
- postProcess: 'capitalizeFirstChar',
- });
- throw new Error(errorMsg);
- }
- const groupId = data.groupId;
- const qortalAddress = data?.qortalAddress;
-
- let groupInfo = null;
- try {
- const url = await createEndpoint(`/groups/${groupId}`);
- const response = await fetch(url);
- if (!response.ok)
- throw new Error(
- i18n.t('question:message.error.fetch_group', {
- postProcess: 'capitalizeFirstChar',
- })
- );
-
- groupInfo = await response.json();
- } catch (error) {
- const errorMsg =
- (error && error.message) ||
- i18n.t('question:message.error.no_group_found', {
- postProcess: 'capitalizeFirstChar',
- });
- throw new Error(errorMsg);
- }
-
- const displayInvitee = await getNameInfoForOthers(qortalAddress);
-
- const fee = await getFee('CANCEL_GROUP_INVITE');
- const resPermission = await getUserPermission(
- {
- text1: i18n.t('question:permission.cancel_group_invite', {
- invitee: displayInvitee || qortalAddress,
- postProcess: 'capitalizeFirstChar',
- }),
- highlightedText: i18n.t('group:group.group_name', {
- name: groupInfo?.groupName,
- postProcess: 'capitalizeFirstChar',
- }),
- fee: fee.fee,
- },
- isFromExtension
- );
-
- const { accepted } = resPermission;
-
- if (accepted) {
- const response = await cancelInvitationToGroup({
- groupId,
- qortalAddress,
- });
- return response;
- } else {
- throw new Error(
- i18n.t('question:message.generic.user_declined_request', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- }
-};
-
-export const createGroupRequest = async (data, isFromExtension) => {
- const requiredFields = [
- 'approvalThreshold',
- 'groupId',
- 'groupName',
- 'maxBlock',
- 'minBlock',
- 'qortalAddress',
- 'type',
- ];
- const missingFields: string[] = [];
- requiredFields.forEach((field) => {
- if (data[field] !== undefined && data[field] !== null) {
- missingFields.push(field);
- }
- });
- if (missingFields.length > 0) {
- const missingFieldsString = missingFields.join(', ');
- const errorMsg = i18n.t('question:message.error.missing_fields', {
- fields: missingFieldsString,
- postProcess: 'capitalizeFirstChar',
- });
- throw new Error(errorMsg);
- }
- const groupName = data.groupName;
- const description = data?.description || '';
- const type = +data.type;
- const approvalThreshold = +data?.approvalThreshold;
- const minBlock = +data?.minBlock;
- const maxBlock = +data.maxBlock;
-
- const fee = await getFee('CREATE_GROUP');
- const resPermission = await getUserPermission(
- {
- text1: i18n.t('question:permission.create_group', {
- postProcess: 'capitalizeFirstChar',
- }),
- highlightedText: i18n.t('group:group.group_name', {
- name: groupName,
- postProcess: 'capitalizeFirstChar',
- }),
- fee: fee.fee,
- },
- isFromExtension
- );
- const { accepted } = resPermission;
- if (accepted) {
- const response = await createGroup({
- groupName,
- groupDescription: description,
- groupType: type,
- groupApprovalThreshold: approvalThreshold,
- minBlock,
- maxBlock,
- });
- return response;
- } else {
- throw new Error(
- i18n.t('question:message.generic.user_declined_request', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- }
-};
-
-export const updateGroupRequest = async (data, isFromExtension) => {
- const requiredFields = [
- 'groupId',
- 'newOwner',
- 'type',
- 'approvalThreshold',
- 'minBlock',
- 'maxBlock',
- ];
- const missingFields: string[] = [];
- requiredFields.forEach((field) => {
- if (data[field] !== undefined && data[field] !== null) {
- missingFields.push(field);
- }
- });
- if (missingFields.length > 0) {
- const missingFieldsString = missingFields.join(', ');
- const errorMsg = i18n.t('question:message.error.missing_fields', {
- fields: missingFieldsString,
- postProcess: 'capitalizeFirstChar',
- });
- throw new Error(errorMsg);
- }
- const groupId = +data.groupId;
- const newOwner = data.newOwner;
- const description = data?.description || '';
- const type = +data.type;
- const approvalThreshold = +data?.approvalThreshold;
- const minBlock = +data?.minBlock;
- const maxBlock = +data.maxBlock;
-
- let groupInfo = null;
- try {
- const url = await createEndpoint(`/groups/${groupId}`);
- const response = await fetch(url);
- if (!response.ok)
- throw new Error(
- i18n.t('question:message.error.fetch_group', {
- postProcess: 'capitalizeFirstChar',
- })
- );
-
- groupInfo = await response.json();
- } catch (error) {
- const errorMsg =
- (error && error.message) ||
- i18n.t('question:message.error.no_group_found', {
- postProcess: 'capitalizeFirstChar',
- });
- throw new Error(errorMsg);
- }
-
- const displayInvitee = await getNameInfoForOthers(newOwner);
-
- const fee = await getFee('CREATE_GROUP');
- const resPermission = await getUserPermission(
- {
- text1: i18n.t('question:permission.update_group', {
- postProcess: 'capitalizeFirstChar',
- }),
- text2: i18n.t('question:permission.update_group_detail', {
- owner: displayInvitee || newOwner,
- postProcess: 'capitalizeFirstChar',
- }),
- highlightedText: i18n.t('group:group.group_name', {
- name: groupInfo?.groupName,
- postProcess: 'capitalizeFirstChar',
- }),
- fee: fee.fee,
- },
- isFromExtension
- );
- const { accepted } = resPermission;
- if (accepted) {
- const response = await updateGroup({
- groupId,
- newOwner,
- newIsOpen: type,
- newDescription: description,
- newApprovalThreshold: approvalThreshold,
- newMinimumBlockDelay: minBlock,
- newMaximumBlockDelay: maxBlock,
- });
- return response;
- } else {
- throw new Error(
- i18n.t('question:message.generic.user_declined_request', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- }
-};
-
-export const decryptAESGCMRequest = async (data, isFromExtension) => {
- const requiredFields = ['encryptedData', 'iv', 'senderPublicKey'];
- requiredFields.forEach((field) => {
- if (!data[field]) {
- throw new Error(
- i18n.t('question:message.error.missing_fields', {
- fields: field,
- postProcess: 'capitalizeFirstChar',
- })
- );
- }
- });
-
- const encryptedData = data.encryptedData;
- const iv = data.iv;
- const senderPublicKeyBase58 = data.senderPublicKey;
-
- // Decode keys and IV
- const senderPublicKey = Base58.decode(senderPublicKeyBase58);
- const resKeyPair = await getKeyPair(); // Assume this retrieves the current user's keypair
- const uint8PrivateKey = Base58.decode(resKeyPair.privateKey);
-
- // Convert ed25519 keys to Curve25519
- const convertedPrivateKey = ed2curve.convertSecretKey(uint8PrivateKey);
- const convertedPublicKey = ed2curve.convertPublicKey(senderPublicKey);
-
- // Generate shared secret
- const sharedSecret = new Uint8Array(32);
- nacl.lowlevel.crypto_scalarmult(
- sharedSecret,
- convertedPrivateKey,
- convertedPublicKey
- );
-
- // Derive encryption key
- const encryptionKey: Uint8Array = new Sha256()
- .process(sharedSecret)
- .finish().result;
-
- // Convert IV and ciphertext from Base64
- const base64ToUint8Array = (base64) =>
- Uint8Array.from(atob(base64), (c) => c.charCodeAt(0));
- const ivUint8Array = base64ToUint8Array(iv);
- const ciphertext = base64ToUint8Array(encryptedData);
- // Validate IV and key lengths
- if (ivUint8Array.length !== 12) {
- throw new Error(
- i18n.t('question:message.error.invalid_encryption_iv', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- }
- if (encryptionKey.length !== 32) {
- throw new Error(
- i18n.t('question:message.error.invalid_encryption_key', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- }
-
- try {
- // Decrypt data
- const algorithm = { name: 'AES-GCM', iv: ivUint8Array };
- const cryptoKey = await crypto.subtle.importKey(
- 'raw',
- encryptionKey,
- algorithm,
- false,
- ['decrypt']
- );
- const decryptedArrayBuffer = await crypto.subtle.decrypt(
- algorithm,
- cryptoKey,
- ciphertext
- );
-
- // Return decrypted data as Base64
- return uint8ArrayToBase64(new Uint8Array(decryptedArrayBuffer));
- } catch (error) {
- console.error('Decryption failed:', error);
- throw new Error(
- i18n.t('question:message.error.decrypt_message', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- }
-};
-
-export const sellNameRequest = async (data, isFromExtension) => {
- const requiredFields = ['salePrice', 'nameForSale'];
- const missingFields: string[] = [];
- requiredFields.forEach((field) => {
- if (data[field] !== undefined && data[field] !== null) {
- missingFields.push(field);
- }
- });
- if (missingFields.length > 0) {
- const missingFieldsString = missingFields.join(', ');
- const errorMsg = i18n.t('question:message.error.missing_fields', {
- fields: missingFieldsString,
- postProcess: 'capitalizeFirstChar',
- });
- throw new Error(errorMsg);
- }
- const name = data.nameForSale;
- const sellPrice = +data.salePrice;
-
- const validApi = await getBaseApi();
-
- const response = await fetch(validApi + '/names/' + name);
- const nameData = await response.json();
- if (!nameData)
- throw new Error(
- i18n.t('auth:message.error.name_not_existing', {
- postProcess: 'capitalizeFirstChar',
- })
- );
-
- if (nameData?.isForSale)
- throw new Error(
- i18n.t('question:message.error.name_already_for_sale', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- const fee = await getFee('SELL_NAME');
- const resPermission = await getUserPermission(
- {
- text1: i18n.t('question:permission.sell_name_transaction', {
- postProcess: 'capitalizeFirstChar',
- }),
- highlightedText: i18n.t(
- 'question:permission.sell_name_transaction_detail',
- {
- name: name,
- price: sellPrice,
- postProcess: 'capitalizeFirstChar',
- }
- ),
- fee: fee.fee,
- },
- isFromExtension
- );
- const { accepted } = resPermission;
- if (accepted) {
- const response = await sellName({
- name,
- sellPrice,
- });
- return response;
- } else {
- throw new Error(
- i18n.t('question:message.generic.user_declined_request', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- }
-};
-
-export const cancelSellNameRequest = async (data, isFromExtension) => {
- const requiredFields = ['nameForSale'];
- const missingFields: string[] = [];
- requiredFields.forEach((field) => {
- if (data[field] !== undefined && data[field] !== null) {
- missingFields.push(field);
- }
- });
- if (missingFields.length > 0) {
- const missingFieldsString = missingFields.join(', ');
- const errorMsg = i18n.t('question:message.error.missing_fields', {
- fields: missingFieldsString,
- postProcess: 'capitalizeFirstChar',
- });
- throw new Error(errorMsg);
- }
- const name = data.nameForSale;
- const validApi = await getBaseApi();
-
- const response = await fetch(validApi + '/names/' + name);
- const nameData = await response.json();
- if (!nameData?.isForSale)
- throw new Error(
- i18n.t('question:message.error.name_not_for_sale', {
- postProcess: 'capitalizeFirstChar',
- })
- );
-
- const fee = await getFee('CANCEL_SELL_NAME');
- const resPermission = await getUserPermission(
- {
- text1: i18n.t('question:permission.sell_name_cancel', {
- postProcess: 'capitalizeFirstChar',
- }),
- highlightedText: i18n.t('question:name', {
- name: name,
- postProcess: 'capitalizeFirstChar',
- }),
- fee: fee.fee,
- },
- isFromExtension
- );
- const { accepted } = resPermission;
- if (accepted) {
- const response = await cancelSellName({
- name,
- });
- return response;
- } else {
- throw new Error(
- i18n.t('question:message.generic.user_declined_request', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- }
-};
-
-export const buyNameRequest = async (data, isFromExtension) => {
- const requiredFields = ['nameForSale'];
- const missingFields: string[] = [];
- requiredFields.forEach((field) => {
- if (data[field] !== undefined && data[field] !== null) {
- missingFields.push(field);
- }
- });
- if (missingFields.length > 0) {
- const missingFieldsString = missingFields.join(', ');
- const errorMsg = i18n.t('question:message.error.missing_fields', {
- fields: missingFieldsString,
- postProcess: 'capitalizeFirstChar',
- });
- throw new Error(errorMsg);
- }
-
- const name = data.nameForSale;
- const validApi = await getBaseApi();
- const response = await fetch(validApi + '/names/' + name);
- const nameData = await response.json();
-
- if (!nameData?.isForSale)
- throw new Error(
- i18n.t('question:message.error.name_not_for_sale', {
- postProcess: 'capitalizeFirstChar',
- })
- );
-
- const sellerAddress = nameData.owner;
- const sellPrice = +nameData.salePrice;
-
- const fee = await getFee('BUY_NAME');
- const resPermission = await getUserPermission(
- {
- text1: i18n.t('question:permission.buy_name', {
- postProcess: 'capitalizeFirstChar',
- }),
- highlightedText: i18n.t('question:permission.buy_name_detail', {
- name: name,
- price: sellPrice,
- postProcess: 'capitalizeFirstChar',
- }),
- fee: fee.fee,
- },
- isFromExtension
- );
- const { accepted } = resPermission;
- if (accepted) {
- const response = await buyName({
- name,
- sellerAddress,
- sellPrice,
- });
- return response;
- } else {
- throw new Error(
- i18n.t('question:message.generic.user_declined_request', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- }
-};
-
-export const signForeignFees = async (data, isFromExtension) => {
- const resPermission = await getUserPermission(
- {
- text1: i18n.t('question:permission.sign_fee', {
- postProcess: 'capitalizeFirstChar',
- }),
- },
- isFromExtension
- );
- const { accepted } = resPermission;
- if (accepted) {
- const wallet = await getSaveWallet();
- const address = wallet.address0;
- const resKeyPair = await getKeyPair();
- const parsedData = resKeyPair;
- const uint8PrivateKey = Base58.decode(parsedData.privateKey);
- const uint8PublicKey = Base58.decode(parsedData.publicKey);
- const keyPair = {
- privateKey: uint8PrivateKey,
- publicKey: uint8PublicKey,
- };
-
- const unsignedFeesUrl = await createEndpoint(
- `/crosschain/unsignedfees/${address}`
- );
-
- const unsignedFeesResponse = await fetch(unsignedFeesUrl);
-
- const unsignedFees = await unsignedFeesResponse.json();
-
- const signedFees = [];
-
- unsignedFees.forEach((unsignedFee) => {
- const unsignedDataDecoded = Base58.decode(unsignedFee.data);
-
- const signature = nacl.sign.detached(
- unsignedDataDecoded,
- keyPair.privateKey
- );
-
- const signedFee = {
- timestamp: unsignedFee.timestamp,
- data: `${Base58.encode(signature)}`,
- atAddress: unsignedFee.atAddress,
- fee: unsignedFee.fee,
- };
-
- signedFees.push(signedFee);
- });
-
- const signedFeesUrl = await createEndpoint(`/crosschain/signedfees`);
-
- await fetch(signedFeesUrl, {
- method: 'POST',
- headers: {
- Accept: '*/*',
- 'Content-Type': 'application/json',
- },
- body: `${JSON.stringify(signedFees)}`,
- });
-
- return true;
- } else {
- throw new Error(
- i18n.t('question:message.generic.user_declined_request', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- }
-};
-export const multiPaymentWithPrivateData = async (data, isFromExtension) => {
- const requiredFields = ['payments', 'assetId'];
- requiredFields.forEach((field) => {
- if (data[field] === undefined || data[field] === null) {
- throw new Error(
- i18n.t('question:message.error.missing_fields', {
- fields: field,
- postProcess: 'capitalizeFirstChar',
- })
- );
- }
- });
- const resKeyPair = await getKeyPair();
- const parsedData = resKeyPair;
- const privateKey = parsedData.privateKey;
- const userPublicKey = parsedData.publicKey;
- const { fee: paymentFee } = await getFee('TRANSFER_ASSET');
- const { fee: arbitraryFee } = await getFee('ARBITRARY');
-
- let name = null;
- const payments = data.payments;
- const assetId = data.assetId;
- const pendingTransactions = [];
- const pendingAdditionalArbitraryTxs = [];
- const additionalArbitraryTxsWithoutPayment =
- data?.additionalArbitraryTxsWithoutPayment || [];
- let totalAmount = 0;
- let fee = 0;
- for (const payment of payments) {
- const paymentRefId = uid.rnd();
- const requiredFieldsPayment = ['recipient', 'amount'];
-
- for (const field of requiredFieldsPayment) {
- if (!payment[field]) {
- throw new Error(
- i18n.t('question:message.error.missing_fields', {
- fields: field,
- postProcess: 'capitalizeFirstChar',
- })
- );
- }
- }
-
- const confirmReceiver = await getNameOrAddress(payment.recipient);
- if (confirmReceiver.error) {
- throw new Error(
- i18n.t('question:message.error.invalid_receiver', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- }
- const receiverPublicKey = await getPublicKey(confirmReceiver);
-
- const amount = +payment.amount.toFixed(8);
-
- pendingTransactions.push({
- type: 'PAYMENT',
- recipientAddress: confirmReceiver,
- amount: amount,
- paymentRefId,
- });
-
- fee = fee + +paymentFee;
- totalAmount = totalAmount + amount;
-
- if (payment.arbitraryTxs && payment.arbitraryTxs.length > 0) {
- for (const arbitraryTx of payment.arbitraryTxs) {
- const requiredFieldsArbitraryTx = ['service', 'identifier', 'base64'];
-
- for (const field of requiredFieldsArbitraryTx) {
- if (!arbitraryTx[field]) {
- throw new Error(
- i18n.t('question:message.error.missing_fields', {
- fields: field,
- postProcess: 'capitalizeFirstChar',
- })
- );
- }
- }
-
- if (!name) {
- const getName = await getNameInfo();
- if (!getName)
- throw new Error(
- i18n.t('question:message.error.registered_name', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- name = getName;
- }
-
- const isValid = isValidBase64WithDecode(arbitraryTx.base64);
- if (!isValid)
- throw new Error(
- i18n.t('core:message.error.invalid_base64', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- if (!arbitraryTx?.service?.includes('_PRIVATE'))
- throw new Error(
- i18n.t('question:message.generic.private_service', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- const additionalPublicKeys = arbitraryTx?.additionalPublicKeys || [];
- pendingTransactions.push({
- type: 'ARBITRARY',
- identifier: arbitraryTx.identifier,
- service: arbitraryTx.service,
- base64: arbitraryTx.base64,
- description: arbitraryTx?.description || '',
- paymentRefId,
- publicKeys: [receiverPublicKey, ...additionalPublicKeys],
- });
-
- fee = fee + +arbitraryFee;
- }
- }
- }
-
- if (
- additionalArbitraryTxsWithoutPayment &&
- additionalArbitraryTxsWithoutPayment.length > 0
- ) {
- for (const arbitraryTx of additionalArbitraryTxsWithoutPayment) {
- const requiredFieldsArbitraryTx = ['service', 'identifier', 'base64'];
-
- for (const field of requiredFieldsArbitraryTx) {
- if (!arbitraryTx[field]) {
- throw new Error(
- i18n.t('question:message.error.missing_fields', {
- fields: field,
- postProcess: 'capitalizeFirstChar',
- })
- );
- }
- }
-
- if (!name) {
- const getName = await getNameInfo();
- if (!getName)
- throw new Error(
- i18n.t('question:message.error.registered_name', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- name = getName;
- }
-
- const isValid = isValidBase64WithDecode(arbitraryTx.base64);
- if (!isValid)
- throw new Error(
- i18n.t('core:message.error.invalid_base64', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- if (!arbitraryTx?.service?.includes('_PRIVATE'))
- throw new Error(
- i18n.t('question:message.generic.private_service', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- const additionalPublicKeys = arbitraryTx?.additionalPublicKeys || [];
- pendingAdditionalArbitraryTxs.push({
- type: 'ARBITRARY',
- identifier: arbitraryTx.identifier,
- service: arbitraryTx.service,
- base64: arbitraryTx.base64,
- description: arbitraryTx?.description || '',
- publicKeys: additionalPublicKeys,
- });
-
- fee = fee + +arbitraryFee;
- }
- }
-
- if (!name)
- throw new Error(
- i18n.t('question:message.error.registered_name', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- const balance = await getBalanceInfo();
-
- if (+balance < fee)
- throw new Error(
- i18n.t('question:message.error.insufficient_balance_qort', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- const assetBalance = await getAssetBalanceInfo(assetId);
- const assetInfo = await getAssetInfo(assetId);
- if (assetBalance < totalAmount)
- throw new Error(
- i18n.t('question:message.error.insufficient_balance', {
- postProcess: 'capitalizeFirstChar',
- })
- );
-
- const resPermission = await getUserPermission(
- {
- text1: i18n.t('question:permission.pay_publish', {
- postProcess: 'capitalizeFirstChar',
- }),
- text2: i18n.t('question:assets_used_pay', {
- asset: assetInfo.name,
- postProcess: 'capitalizeFirstChar',
- }),
- html: `
-
-
-
- ${pendingTransactions
- .filter((item) => item.type === 'PAYMENT')
- .map(
- (payment) => `
-
-
Recipient: ${
- payment.recipientAddress
- }
-
Amount: ${payment.amount}
-
`
- )
- .join('')}
- ${[...pendingTransactions, ...pendingAdditionalArbitraryTxs]
- .filter((item) => item.type === 'ARBITRARY')
- .map(
- (arbitraryTx) => `
-
-
Service: ${
- arbitraryTx.service
- }
-
Name: ${name}
-
Identifier: ${
- arbitraryTx.identifier
- }
-
`
- )
- .join('')}
-
-
- `,
- highlightedText: `Total Amount: ${totalAmount}`,
- fee: fee,
- },
- isFromExtension
- );
-
- const { accepted, checkbox1 = false } = resPermission;
- if (!accepted) {
- throw new Error(
- i18n.t('question:message.generic.user_declined_request', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- }
-
- // const failedTxs = []
- const paymentsDone = {};
-
- const transactionsDone = [];
-
- for (const transaction of pendingTransactions) {
- const type = transaction.type;
-
- if (type === 'PAYMENT') {
- const makePayment = await retryTransaction(
- transferAsset,
- [
- {
- amount: transaction.amount,
- assetId,
- recipient: transaction.recipientAddress,
- },
- ],
- true
- );
- if (makePayment) {
- transactionsDone.push(makePayment?.signature);
- if (transaction.paymentRefId) {
- paymentsDone[transaction.paymentRefId] = makePayment;
- }
- }
- } else if (type === 'ARBITRARY' && paymentsDone[transaction.paymentRefId]) {
- const objectToEncrypt = {
- data: transaction.base64,
- payment: paymentsDone[transaction.paymentRefId],
- };
-
- const toBase64 = await retryTransaction(
- objectToBase64,
- [objectToEncrypt],
- true
- );
-
- if (!toBase64) continue; // Skip if encryption fails
-
- const encryptDataResponse = await retryTransaction(
- encryptDataGroup,
- [
- {
- data64: toBase64,
- publicKeys: transaction.publicKeys,
- privateKey,
- userPublicKey,
- },
- ],
- true
- );
-
- if (!encryptDataResponse) continue; // Skip if encryption fails
-
- const resPublish = await retryTransaction(
- publishData,
- [
- {
- registeredName: encodeURIComponent(name),
- file: encryptDataResponse,
- service: transaction.service,
- identifier: encodeURIComponent(transaction.identifier),
- uploadType: 'file',
- description: transaction?.description,
- isBase64: true,
- apiVersion: 2,
- withFee: true,
- },
- ],
- true
- );
-
- if (resPublish?.signature) {
- transactionsDone.push(resPublish?.signature);
- }
- }
- }
-
- for (const transaction of pendingAdditionalArbitraryTxs) {
- const objectToEncrypt = {
- data: transaction.base64,
- };
-
- const toBase64 = await retryTransaction(
- objectToBase64,
- [objectToEncrypt],
- true
- );
-
- if (!toBase64) continue; // Skip if encryption fails
-
- const encryptDataResponse = await retryTransaction(
- encryptDataGroup,
- [
- {
- data64: toBase64,
- publicKeys: transaction.publicKeys,
- privateKey,
- userPublicKey,
- },
- ],
- true
- );
-
- if (!encryptDataResponse) continue; // Skip if encryption fails
-
- const resPublish = await retryTransaction(
- publishData,
- [
- {
- registeredName: encodeURIComponent(name),
- file: encryptDataResponse,
- service: transaction.service,
- identifier: encodeURIComponent(transaction.identifier),
- uploadType: 'file',
- description: transaction?.description,
- isBase64: true,
- apiVersion: 2,
- withFee: true,
- },
- ],
- true
- );
-
- if (resPublish?.signature) {
- transactionsDone.push(resPublish?.signature);
- }
- }
-
- return transactionsDone;
-};
-
-export const transferAssetRequest = async (data, isFromExtension) => {
- const requiredFields = ['amount', 'assetId', 'recipient'];
- requiredFields.forEach((field) => {
- if (data[field] === undefined || data[field] === null) {
- throw new Error(
- i18n.t('question:message.error.missing_fields', {
- fields: field,
- postProcess: 'capitalizeFirstChar',
- })
- );
- }
- });
- const amount = data.amount;
- const assetId = data.assetId;
- const recipient = data.recipient;
-
- const { fee } = await getFee('TRANSFER_ASSET');
- const balance = await getBalanceInfo();
-
- if (+balance < +fee)
- throw new Error(
- i18n.t('question:message.error.insufficient_balance_qort', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- const assetBalance = await getAssetBalanceInfo(assetId);
- if (assetBalance < amount)
- throw new Error(
- i18n.t('question:message.error.insufficient_balance', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- const confirmReceiver = await getNameOrAddress(recipient);
- if (confirmReceiver.error) {
- throw new Error(
- i18n.t('question:message.error.invalid_receiver', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- }
- const assetInfo = await getAssetInfo(assetId);
- const resPermission = await getUserPermission(
- {
- text1: i18n.t('question:permission.transfer_asset', {
- postProcess: 'capitalizeFirstChar',
- }),
- text2: i18n.t('question:asset_name', {
- asset: assetInfo?.name,
- postProcess: 'capitalizeFirstChar',
- }),
- highlightedText: i18n.t('question:amount_qty', {
- quantity: amount,
- postProcess: 'capitalizeFirstChar',
- }),
- fee: fee,
- },
- isFromExtension
- );
-
- const { accepted } = resPermission;
- if (!accepted) {
- throw new Error(
- i18n.t('question:message.generic.user_declined_request', {
- postProcess: 'capitalizeFirstChar',
- })
- );
- }
- const res = await transferAsset({
- amount,
- recipient: confirmReceiver,
- assetId,
- });
- return res;
-};
diff --git a/src/styles/App-styles.ts b/src/styles/App-styles.ts
index 3cbcdb5..1cbe75b 100644
--- a/src/styles/App-styles.ts
+++ b/src/styles/App-styles.ts
@@ -107,16 +107,15 @@ export const AddressBox = styled(Box)(({ theme }) => ({
export const CustomButton = styled(Box)(({ theme }) => ({
alignItems: 'center',
- backgroundColor: theme.palette.background.default,
+ backgroundColor: theme.palette.background.paper,
borderColor: theme.palette.background.paper,
- borderRadius: '5px',
+ borderRadius: '8px',
borderStyle: 'solid',
borderWidth: '0.5px',
boxSizing: 'border-box',
color: theme.palette.text.primary,
cursor: 'pointer',
display: 'inline-flex',
- filter: 'drop-shadow(1px 4px 10.5px rgba(0, 0, 0, 0.3))',
fontFamily: 'Inter',
fontWeight: 600,
gap: '10px',
@@ -124,12 +123,12 @@ export const CustomButton = styled(Box)(({ theme }) => ({
minWidth: '160px',
padding: '15px 20px',
textAlign: 'center',
- transition: 'all 0.2s',
+ transition: 'all 0.3s',
width: 'fit-content',
'&:hover': {
- backgroundColor: theme.palette.background.paper,
+ backgroundColor: theme.palette.background.surface,
'svg path': {
- fill: theme.palette.background.secondary,
+ fill: theme.palette.secondary,
},
},
}));
@@ -178,7 +177,7 @@ export const CustomButtonAccept = styled(Box)(
export const CustomInput = styled(TextField)(({ theme }) => ({
backgroundColor: theme.palette.background.default,
borderColor: theme.palette.background.paper,
- borderRadius: '5px',
+ borderRadius: '8px',
color: theme.palette.text.primary,
outline: 'none',
width: '183px', // Adjust the width as needed
diff --git a/src/styles/theme-common.ts b/src/styles/theme-common.ts
index ff914e4..aca2522 100644
--- a/src/styles/theme-common.ts
+++ b/src/styles/theme-common.ts
@@ -61,7 +61,6 @@ const commonThemeOptions = {
MuiButton: {
styleOverrides: {
root: {
- backgroundColor: 'inherit',
transition: 'filter 0.3s ease-in-out',
'&:hover': {
filter: 'brightness(1.1)',
diff --git a/src/styles/theme-dark.ts b/src/styles/theme-dark.ts
index daab69f..cfa5952 100644
--- a/src/styles/theme-dark.ts
+++ b/src/styles/theme-dark.ts
@@ -6,7 +6,7 @@ export const darkThemeOptions: ThemeOptions = {
palette: {
mode: 'dark',
primary: {
- main: 'rgb(100, 155, 240)',
+ main: 'rgba(0, 133, 255, 1)',
dark: 'rgb(45, 92, 201)',
light: 'rgb(130, 185, 255)',
},
@@ -14,9 +14,9 @@ export const darkThemeOptions: ThemeOptions = {
main: 'rgb(69, 173, 255)',
},
background: {
- default: 'rgb(49, 51, 56)',
+ default: 'rgba(6, 10, 30, 1)',
paper: 'rgb(62, 64, 68)',
- surface: 'rgb(58, 60, 65)',
+ surface: 'rgb(113, 113, 114)',
},
text: {
primary: 'rgb(255, 255, 255)',
@@ -52,8 +52,8 @@ export const darkThemeOptions: ThemeOptions = {
MuiCssBaseline: {
styleOverrides: (theme) => ({
':root': {
- '--Mail-Background': 'rgb(43, 43, 43)',
- '--bg-primary': 'rgba(31, 32, 35, 1)',
+ '--Mail-Background': 'rgba(6, 10, 30, 1)',
+ '--bg-primary': 'rgba(6, 10, 30, 1)',
'--bg-2': 'rgb(39, 40, 44)',
'--primary-main': theme.palette.primary.main,
'--text-primary': theme.palette.text.primary,
diff --git a/src/styles/theme-light.ts b/src/styles/theme-light.ts
index a49e659..4f6a1b1 100644
--- a/src/styles/theme-light.ts
+++ b/src/styles/theme-light.ts
@@ -6,12 +6,12 @@ export const lightThemeOptions: ThemeOptions = {
palette: {
mode: 'light',
primary: {
- main: 'rgb(162, 162, 221)',
+ main: 'rgba(0, 133, 255, 1)',
dark: 'rgb(113, 198, 212)',
light: 'rgb(180, 200, 235)',
},
secondary: {
- main: 'rgba(194, 222, 236, 1)',
+ main: 'rgb(69, 173, 255)',
},
background: {
default: 'rgba(250, 250, 250, 1)',