4
1
mirror of https://github.com/Qortal/qortal-ui.git synced 2025-02-14 11:15:50 +00:00

Merge remote-tracking branch 'origin/master' into feature/group-encryption

This commit is contained in:
Phillip 2023-07-22 16:21:16 +03:00
commit c12ec3e3cc
124 changed files with 25311 additions and 4681 deletions

View File

@ -5,4 +5,4 @@
3) Push changes to your repository
4) Push changes to parent repository (make a pull request)
As long the code change is good we will merge it.
As long as the code change is good we will merge it.

View File

@ -3,7 +3,8 @@
![GitHub tag (latest by date)](https://img.shields.io/github/v/tag/Qortal/qortal-ui?label=latest%20version)
[![GitHub Releases](https://img.shields.io/github/downloads/Qortal/qortal-ui/latest/total)](https://github.com/Qortal/qortal-ui/releases/latest)
[![License](https://img.shields.io/badge/license-GPL--3.0-blue)](https://opensource.org/licenses/GPL-3.0)
[![Qortal Discord Invite](https://img.shields.io/discord/745037351163527189?color=%237289DA&label=chat&logo=discord&logoColor=white)](https://discord.com/invite/54UyhB7)
[![Qortal Discord Invite](https://img.shields.io/discord/745037351163527189?color=%237289DA&label=Chat&logo=discord&logoColor=white)](https://discord.com/invite/54UyhB7)
[![Qortal Apps Discord Invite](https://img.shields.io/discord/745037351163527189?color=%237289DA&label=Q-Apps&logo=discord&logoColor=white)](https://discord.com/invite/tqnpDMfuR2)
Decentralizing The World
@ -27,24 +28,25 @@ Easiest way to install the lastest required packages on Linux is via nvm.
``` source ~/.bashrc ``` (For Fedora / CentOS) <br/>
``` nvm ls-remote ``` (Fetch list of available versions) <br/>
``` nvm install v18.14.0 ``` (LTS: Hydrogen supported by Electron) <br/>
``` npm --location=global install npm@9.6.6 ``` <br/>
``` npm --location=global install npm@9.7.2 ``` <br/>
Adding via binary package mirror will only work if you have set the package path. You can do a node or java build via ports instead by downloading ports with portsnap fetch method.
Verify your installtion with node --version <br/>
- ``` If you have an older installation of npm, please do not forget to update that with npm update -g. ```
Verify your installation with ``` node --version ``` <br/>
- If you have an older installation of npm, please do not forget to update that with ``` npm update -g ```
Clone the main UI repo
- ``` git clone https://github.com/Qortal/qortal-ui.git ```
Installation
------------------------
In `qortal-ui/` npm install
In `qortal-ui` directory, run:
```
npm install
```
Build UI server and files
-------------------------
In `qortal-ui` directory, run:
```
npm run build
```

View File

@ -11,12 +11,12 @@ const options = {
}
const aliases = {
'qortal-ui-crypto': 'node_modules/qortal-ui-crypto/api.js'
'qortal-ui-crypto': '../../crypto/api.js'
}
const apiComponents = {
api: {
file: 'api/api.js',
file: '../../crypto/api.js',
className: 'api'
}
}

Binary file not shown.

Binary file not shown.

View File

@ -19,6 +19,14 @@
url(MaterialSymbolsOutlined.woff2) format('woff2')
}
@font-face {
font-family: 'magistralbold';
src: url('magistral_bold-webfont.woff2') format('woff2'),
url('magistral_bold-webfont.woff') format('woff');
font-weight: normal;
font-style: normal;
}
@font-face {
font-family: 'Montserrat';
src: local('Montserrat'),

View File

@ -60,6 +60,10 @@ html {
--gif-button-row-bg: #eaeaef;
--gif-button-row-color: #464040;
--gif-collection-hover-bg: #eaeaefa3;
--app-background-1: #045de9;
--app-background-2: #09c6f9;
--app-icon: #ffffff;
--app-hr: rgba(0, 0, 0, .3);
}
html[theme="dark"] {
@ -124,4 +128,8 @@ html[theme="dark"] {
--gif-button-row-bg: #82899c;
--gif-button-row-color: #151212;
--gif-collection-hover-bg: #ffffff26;
--app-background-1: #7f5a83;
--app-background-2: #0d324d;
--app-icon: #03a9f4;
--app-hr: rgba(255, 255, 255, .3);
}

View File

@ -18,7 +18,8 @@
"russian": "Russisch",
"norwegian": "Norwegisch",
"romanian": "Rumänisch",
"korean": "Koreanisch"
"korean": "Koreanisch",
"japanese": "Japanisch"
},
"sidemenu": {
"minting": "PRÄGUNG",
@ -41,6 +42,45 @@
"sm2": "NAMENSVERWALTUNG",
"sm3": "NAMENSMARKT"
},
"tabmenu": {
"tm1": "Prägedetails",
"tm2": "Minter werden",
"tm3": "Sponsoring-Liste",
"tm4": "Geldbörsen",
"tm5": "Handelsportal",
"tm6": "Automatischer Kauf",
"tm7": "Belohnungsanteil",
"tm8": "Q-Chat",
"tm9": "Namensregistrierung",
"tm10": "Namensmarkt",
"tm11": "Websites",
"tm12": "Q-Apps",
"tm13": "Gruppenverwaltung",
"tm14": "Datenverwaltung",
"tm15": "Rätsel",
"tm16": "Knotenverwaltung",
"tm17": "Neuer Tab",
"tm18": "Neuen Tab hinzufügen",
"tm19": "Neues Plugin hinzufügen",
"tm20": "Q-App",
"tm21": "Website",
"tm22": "Plugin entfernen",
"tm23": "Sind Sie sicher, dass Sie dieses Plugin entfernen?",
"tm24": "Plugin-Typ:",
"tm25": "Bitte wählen Sie einen Plugin-Typ aus!",
"tm26": "Neues Plugin zum Menü hinzufügen",
"tm27": "Plugin aus Menü entfernen",
"tm28": "Übersichtsseite",
"tm29": "Registerkartenmenü zurücksetzen",
"tm30": "Qortalnamen suchen",
"tm31": "Meine verfolgten Namen",
"tm32": "Diesem Konto folgt keinem Benutzer",
"tm33": "Registerkartenmenü importieren",
"tm34": "Registerkartenmenü Exportieren",
"tm35": "Ihr vorhandenes Tab-Menü wird gelöscht und auf das hochgeladene Tab-Menü gesetzt.",
"tm36": "Tab-Menü erfolgreich wiederhergestellt",
"tm37": "Tab-Menü erfolgreich gespeichert als"
},
"login": {
"login": "Einloggen",
"createaccount": "Benutzerkonto erstellen",
@ -86,7 +126,29 @@
"created1": "Ihr Konto ist jetzt erstellt",
"created2": " und wird in diesem Browser gespeichert.",
"downloadbackup": "Laden Sie die Wallet-Sicherungsdatei herunter",
"passwordhint": "Ein Passwort muss mindestens 8 Zeichen lang sein."
"passwordhint": "Ein Passwort muss mindestens 8 Zeichen lang sein.",
"lp1": "Bildschirm sperren",
"lp2": "Es ist kein Passwort für den Sperrbildschirm festgelegt!",
"lp3": "Bitte legen Sie eins fest",
"lp4": "Nein Danke",
"lp5": "Passwort festlegen",
"lp6": "Neues Passwort für die Bildschirmsperre erfolgreich festgelegt!",
"lp7": "UNLOCK",
"lp8": "Fehler: Falsches Passwort",
"lp9": "IST",
"lp10": "GESPERRT",
"lp11": "ENTSPERRT",
"lp12": "Gespeicherte Daten dekodieren",
"lp13": "Entschlüsselungsschlüssel wird generiert",
"lp14": "Schlüssel wird überprüft",
"lp15": "Falsches Passwort",
"lp16": "Entschlüsseln",
"lp17": "Warten, bis die Arbeiter bereit sind",
"lp18": "Schlüsselteile ableiten",
"lp19": "Fehler, falscher Schlüssel. ",
"lp20": "Fehler, falsche Nonce",
"lp21": "Wichtige Teile kombinieren",
"lp22": "Schlüssel ist bereit"
},
"logout": {
"logout": "AUSLOGGEN",
@ -148,7 +210,11 @@
},
"walletprofile": {
"minterlevel": "Minter Level",
"blocksminted": "Blöcke Geprägt"
"blocksminted": "Blöcke Geprägt",
"wp1": "Prägung",
"wp2": "Nicht am Prägen",
"wp3": "Kerninformationen",
"wp4": "Synchronisiert"
},
"general": {
"yes": "Ja",
@ -711,8 +777,8 @@
"cchange38": "Benutzer verifiziert",
"cchange39": "Kann keine verschlüsselte Nachricht an diesen Benutzer senden, da er seinen öffentlichen Schlüssel nicht in der Kette hat.",
"cchange40": "BILD (zum Anzeigen klicken)",
"cchange41": "Ihr Guthaben liegt unter 4,20 QORT",
"cchange42": "Aus Gründen der Spam-Bekämpfung benötigen Konten mit einem Qort-Guthaben von weniger als 4,20 viel Zeit, um Nachrichten in Q-Chat zu SENDEN. Wenn Sie die Sendegeschwindigkeit für Q-Chat-Nachrichten sofort erhöhen möchten, besorgen Sie sich über 4,20 QORT an Ihre Adresse. Dies kann mit Trades im Handelsportal oder über einen anderen Qortian erfolgen, der Ihnen die QORT gibt. Sobald Sie über 4,20 QORT in Ihrem Konto haben, werden Q-Chat-Nachrichten sofort gesendet und dieser Dialog wird nicht mehr angezeigt Show. Vielen Dank für Ihr Verständnis für diese notwendige Spam-Präventionsmethode, und wir hoffen, dass Ihnen Qortal gefällt!",
"cchange41": "Ihr Guthaben liegt unter 4 QORT",
"cchange42": "Aus Gründen der Spam-Bekämpfung benötigen Konten mit einem Qort-Guthaben von weniger als 4 viel Zeit, um Nachrichten in Q-Chat zu SENDEN. Wenn Sie die Sendegeschwindigkeit für Q-Chat-Nachrichten sofort erhöhen möchten, besorgen Sie sich über 4 QORT an Ihre Adresse. Dies kann mit Trades im Handelsportal oder über einen anderen Qortian erfolgen, der Ihnen die QORT gibt. Sobald Sie über 4 QORT in Ihrem Konto haben, werden Q-Chat-Nachrichten sofort gesendet und dieser Dialog wird nicht mehr angezeigt Show. Vielen Dank für Ihr Verständnis für diese notwendige Spam-Präventionsmethode, und wir hoffen, dass Ihnen Qortal gefällt!",
"cchange43": "Tipp QORT an",
"cchange44": "NACHRICHT SENDEN",
"cchange45": "TIP BENUTZER",
@ -897,7 +963,9 @@
"nchange29": "Prägekonto erfolgreich entfernt!",
"nchange30": "Fehler beim Entfernen des Prägekontos!",
"nchange31": "Knoten stoppen",
"nchange32": "Stoppanforderung erfolgreich gesendet!"
"nchange32": "Stoppanforderung erfolgreich gesendet!",
"nchange33": "Knoten neu starten",
"nchange34": "Neustartanforderung erfolgreich gesendet!"
},
"transpage": {
"tchange1": "Transaktionsanfrage",
@ -978,7 +1046,9 @@
"exp18": "Zahlungen",
"exp19": "Gesendet",
"exp20": "Empfangen",
"exp21": "Trades"
"exp21": "Trades",
"exp22": "LETZTE 5 ZAHLUNGEN",
"exp23": "Alle Zahlungen anzeigen"
},
"managegroup": {
"mg1": "Gruppenmitglieder",
@ -1059,6 +1129,8 @@
"inf13": "Automatisch kaufen",
"inf14": "mit",
"inf15": "Aktive automatische Kaufaufträge",
"inf16": "Automatischer Kauf"
"inf16": "Automatischer Kauf",
"inf17": "Zum hellen Thema wechseln",
"inf18": "Zum dunklen Thema wechseln"
}
}

View File

@ -18,7 +18,8 @@
"russian": "Ruso",
"norwegian": "Noruego",
"romanian": "Rumano",
"korean": "Coreano"
"korean": "Coreano",
"japanese": "Japonés"
},
"sidemenu": {
"minting": "ACUÑACIÓN",
@ -41,6 +42,45 @@
"sm2": "GESTIÓN DE NOMBRES",
"sm3": "MERCADO DE NOMBRES"
},
"tabmenu": {
"tm1": "Detalles de acuñación",
"tm2": "Conviértete en Minter",
"tm3": "Lista de patrocinios",
"tm4": "Carteras",
"tm5": "Portal de comercio",
"tm6": "Compra automática",
"tm7": "Recompensa compartida",
"tm8": "Q-Chat",
"tm9": "Registro de nombre",
"tm10": "Mercado de nombres",
"tm11": "Sitios web",
"tm12": "Q-Aplicaciones",
"tm13": "Administración de grupos",
"tm14": "Administración de datos",
"tm15": "Rompecabezas",
"tm16": "Administración de nodos",
"tm17": "Nueva pestaña",
"tm18": "Agregar nueva pestaña",
"tm19": "Agregar nuevo complemento",
"tm20": "Q-Aplicación",
"tm21": "Sitio web",
"tm22": "Eliminar complemento",
"tm23": "¿Está seguro de eliminar este complemento?",
"tm24": "Tipo de complemento:",
"tm25": "¡Seleccione un tipo de complemento!",
"tm26": "Agregar nuevo complemento al menú",
"tm27": "Eliminar complemento del menú",
"tm28": "Página de inicio",
"tm29": "Menú Restablecer pestaña",
"tm30": "Buscar nombre de Qortal",
"tm31": "Mis nombres seguidos",
"tm32": "Esta cuenta no sigue a ningún usuario",
"tm33": "Menú de pestaña Importar",
"tm34": "Menú de pestaña Exportar",
"tm35": "Tu menú de pestañas existente se eliminará y se establecerá en el menú de pestañas cargado.",
"tm36": "Menú de pestañas restaurado con éxito",
"tm37": "Menú de pestañas guardado correctamente como"
},
"login": {
"login": "Iniciar sesión",
"createaccount": "Crear cuenta",
@ -50,7 +90,7 @@
"youraccounts": "Sus cuentas",
"clickto": "Haga clic en su cuenta para iniciar sesión",
"needcreate": "Necesita crear o guardar una cuenta antes de poder acceder a ella!",
"upload": "Suba su copia de seguridad qortal",
"upload": "Suba su copia de seguridad Qortal",
"howlogin": "¿Como te gustaría iniciar sesión?",
"seed": "Frasesemilla",
"seedphrase": "frasesemilla",
@ -86,7 +126,29 @@
"created1": "Su cuenta ha sido creada",
"created2": " y será guardada en el navegador.",
"downloadbackup": "Descargar archivo de copia de seguridad del monedero",
"passwordhint": "Una contraseña debe tener al menos 8 caracteres."
"passwordhint": "Una contraseña debe tener al menos 8 caracteres.",
"lp1": "Pantalla de bloqueo",
"lp2": "¡No se estableció una contraseña de pantalla de bloqueo!",
"lp3": "Establece uno",
"lp4": "No, gracias",
"lp5": "Establecer contraseña",
"lp6": "¡Nueva contraseña de bloqueo de pantalla configurada correctamente!",
"lp7": "DESBLOQUEAR",
"lp8": "Error: Contraseña incorrecta",
"lp9": "ES",
"lp10": "BLOQUEADO",
"lp11": "DESBLOQUEADO",
"lp12": "Decodificación de datos guardados",
"lp13": "Generando clave de descifrado",
"lp14": "Comprobando clave",
"lp15": "Contraseña incorrecta",
"lp16": "Descifrando",
"lp17": "Esperando que los trabajadores estén listos",
"lp18": "Derivar partes clave",
"lp19": "Error, clave incorrecta. ",
"lp20": "Error, nonce incorrecto",
"lp21": "Combinando partes clave",
"lp22": "La llave está lista"
},
"logout": {
"logout": "CERRAR SESIÓN",
@ -148,7 +210,11 @@
},
"walletprofile": {
"minterlevel": "Nivel del acuñador",
"blocksminted": "Bloques acuñados"
"blocksminted": "Bloques acuñados",
"wp1": "Acuñación",
"wp2": "Sin acuñar",
"wp3": "Información básica",
"wp4": "Sincronizado"
},
"general": {
"yes": "Sí",
@ -435,7 +501,7 @@
"nchange35": "¡TIENES UN NOMBRE!",
"nchange36": "Solo las cuentas sin nombre registrado pueden comprar un nombre.",
"nchange37": "¡ATENCIÓN!",
"nchange38": "No tienes suficiente qort para comprar este nombre.",
"nchange38": "No tienes suficiente QORT para comprar este nombre.",
"nchange39": "¿Estás seguro de comprar este nombre?",
"nchange40": "¡Al presionar confirmar, se enviará la solicitud de compra de nombre!",
"nchange41": "Nombre anterior",
@ -493,13 +559,13 @@
"schange7": "Publicado por",
"schange8": "Acciones",
"schange9": "Q-Apps",
"schange10": "No hay q-apps disponibles",
"schange10": "No hay Q-Apps disponibles",
"schange11": "Tus Q-Apps seguidas",
"schange12": "Q-Apps seguidas",
"schange13": "No estás siguiendo ninguna q-apps",
"schange13": "No estás siguiendo ninguna Q-Apps",
"schange14": "Tus Q-Apps bloqueadas",
"schange15": "Q-Apps bloqueadas",
"schange16": "No has bloqueado ninguna q-apps",
"schange16": "No has bloqueado ninguna Q-Apps",
"schange17": "¡No se encontró el nombre!",
"schange18": "El modo de retransmisión está habilitado. Esto significa que su nodo ayudará a transportar datos cifrados por la red cuando un par lo solicite. Puede optar por no hacerlo configurando",
"schange19": "en",
@ -537,13 +603,13 @@
"schange7": "Publicado por",
"schange8": "Acciones",
"schange9": "Q-Tubes",
"schange10": "No hay q-tubos disponibles",
"schange10": "No hay Q-Tubes disponibles",
"schange11": "Tus Q-Tubes seguidos",
"schange12": "Q-Tubes seguidos",
"schange13": "No estás siguiendo ningún q-tubes",
"schange13": "No estás siguiendo ningún Q-Tubes",
"schange14": "Tus Q-Tubes bloqueados",
"schange15": "Q-Tubes bloqueados",
"schange16": "No has bloqueado ningún q-tubes",
"schange16": "No has bloqueado ningún Q-Tubes",
"schange17": "¡No se encontró el nombre!",
"schange18": "El modo de retransmisión está habilitado. Esto significa que su nodo ayudará a transportar datos cifrados por la red cuando un par lo solicite. Puede optar por no hacerlo configurando",
"schange19": "en",
@ -711,8 +777,8 @@
"cchange38": "Usuario verificado",
"cchange39": "No se puede enviar un mensaje encriptado a este usuario porque no tiene su clave pública en la cadena.",
"cchange40": "IMAGEN (haga clic para ver)",
"cchange41": "Su saldo es inferior a 4,20 QORT",
"cchange42": "Debido a la necesidad de combatir el spam, las cuentas con menos de 4.20 Qort de saldo tardarán mucho tiempo en ENVIAR mensajes en Q-Chat. Si desea aumentar inmediatamente la velocidad de envío de mensajes de Q-Chat, obtenga más de 4.20 QORT a su dirección. Esto se puede hacer con intercambios en el Portal de comercio, o por medio de otro Qortian que le proporcione el QORT. Una vez que tenga más de 4.20 QORT en su cuenta, los mensajes de Q-Chat serán instantáneos y este cuadro de diálogo ya no aparecerá. ¡Gracias por su comprensión de este método de prevención de spam necesario, y esperamos que disfrute de Qortal!",
"cchange41": "Su saldo es inferior a 4 QORT",
"cchange42": "Debido a la necesidad de combatir el spam, las cuentas con menos de 4 QORT de saldo tardarán mucho tiempo en ENVIAR mensajes en Q-Chat. Si desea aumentar inmediatamente la velocidad de envío de mensajes de Q-Chat, obtenga más de 4 QORT a su dirección. Esto se puede hacer con intercambios en el Portal de comercio, o por medio de otro Qortian que le proporcione el QORT. Una vez que tenga más de 4 QORT en su cuenta, los mensajes de Q-Chat serán instantáneos y este cuadro de diálogo ya no aparecerá. ¡Gracias por su comprensión de este método de prevención de spam necesario, y esperamos que disfrute de Qortal!",
"cchange43": "Sugerencia QORT para",
"cchange44": "ENVIAR MENSAJE",
"cchange45": "USUARIO CONSEJO",
@ -897,7 +963,9 @@
"nchange29": "Eliminación exitosa de la cuenta de acuñación!",
"nchange30": "Fallo en la eliminación de la cuenta de acuñación!",
"nchange31": "Detener Nodo",
"nchange32": "Solicitud de detención enviada con éxito!"
"nchange32": "Solicitud de detención enviada con éxito!",
"nchange33": "Reiniciar Nodo",
"nchange34": "Solicitud de reinicio enviada con éxito!"
},
"transpage": {
"tchange1": "Solicitud de transacción",
@ -978,7 +1046,9 @@
"exp18": "Pagos",
"exp19": "Enviado",
"exp20": "Recibido",
"exp21": "Oficios"
"exp21": "Oficios",
"exp22": "ULTIMOS 5 PAGOS",
"exp23": "Mostrar todos los pagos"
},
"managegroup": {
"mg1": "Miembros del grupo",
@ -1059,6 +1129,8 @@
"inf13": "Comprar automáticamente",
"inf14": "con",
"inf15": "Órdenes de compra automática activas",
"inf16": "Compra automática"
"inf16": "Compra automática",
"inf17": "Cambiar a tema claro",
"inf18": "Cambiar a tema oscuro"
}
}

View File

@ -18,7 +18,8 @@
"russian": "Russe",
"norwegian": "Norvégien",
"romanian": "Roumain",
"korean": "Coréen"
"korean": "Coréen",
"japanese": "Japonais"
},
"sidemenu": {
"minting": "MONNAIE",
@ -41,6 +42,45 @@
"sm2": "GESTION DES NOM",
"sm3": "MARCHÉ DES NOMS"
},
"tabmenu": {
"tm1": "Détails de la frappe",
"tm2": "Devenir Miner",
"tm3": "Liste de parrainage",
"tm4": "Portefeuilles",
"tm5": "Portail commercial",
"tm6": "Achat automatique",
"tm7": "Partage de récompense",
"tm8": "Q-Chat",
"tm9": "Enregistrement du nom",
"tm10": "Marché des noms",
"tm11": "Sites Web",
"tm12": "Q-Apps",
"tm13": "Gestion du groupe",
"tm14": "Gestion des données",
"tm15": "Puzzles",
"tm16": "Gestion des nœuds",
"tm17": "Nouvel onglet",
"tm18": "Ajouter un nouvel onglet",
"tm19": "Ajouter un nouveau plugin",
"tm20": "Q-App",
"tm21": "Site Web",
"tm22": "Supprimer le plugin",
"tm23": "Êtes-vous sûr de vouloir supprimer ce plugin ?",
"tm24": "Type de plug-in :",
"tm25": "Veuillez sélectionner un type de plugin !",
"tm26": "Ajouter un nouveau plugin au menu",
"tm27": "Supprimer le plugin du menu",
"tm28": "Page de présentation",
"tm29": "Menu Réinitialiser l'onglet",
"tm30": "Rechercher le nom Qortal",
"tm31": "Mes noms suivis",
"tm32": "Ce compte ne suit aucun utilisateur",
"tm33": "Menu de l'onglet Importer",
"tm34": "Menu de l'onglet Exporter",
"tm35": "Votre menu d'onglets existant sera supprimé et défini sur le menu d'onglets téléchargé.",
"tm36": "Le menu des onglets a été restauré avec succès",
"tm37": "Le menu des onglets a été enregistré avec succès sous"
},
"login": {
"login": "Connexion",
"createaccount": "Créer un compte",
@ -50,7 +90,7 @@
"youraccounts": "Vos comptes",
"clickto": "Cliquez sur votre compte pour vous connecter",
"needcreate": "Vous devez créer ou sauver un compte avant de pouvoir vous connecter!",
"upload": "Envoyer votre sauvegarde qortal",
"upload": "Envoyer votre sauvegarde Qortal",
"howlogin": "Comment voulez-vous vous connecter ?",
"seed": "Phrase mnémonique",
"seedphrase": "Phrase mnémonique",
@ -86,7 +126,29 @@
"created1": "Votre compte est maintenant créé",
"created2": " et sera enregistré dans ce navigateur.",
"downloadbackup": "Télécharger le fichier de sauvegarde du portefeuille",
"passwordhint": "Un mot de passe doit comporter au moins 8 caractères."
"passwordhint": "Un mot de passe doit comporter au moins 8 caractères.",
"lp1": "Verrouiller l'écran",
"lp2": "Aucun mot de passe d'écran de verrouillage n'est défini !",
"lp3": "Veuillez en définir un",
"lp4": "Non merci",
"lp5": "Définir le mot de passe",
"lp6": "Le nouveau mot de passe de verrouillage de l'écran a été défini avec succès !",
"lp7": "DÉVERROUILLER",
"lp8": "Erreur : Mot de passe incorrect",
"lp9": "EST",
"lp10": "VERROUILLÉ",
"lp11": "DÉVERROUILLÉ",
"lp12": "Décodage des données enregistrées",
"lp13": "Génération de la clé de déchiffrement",
"lp14": "Clé de vérification",
"lp15": "Mot de passe incorrect",
"lp16": "Décryptage",
"lp17": "En attente que les travailleurs soient prêts",
"lp18": "Dérivation des parties clés",
"lp19": "Erreur, clé incorrecte. ",
"lp20": "Erreur, nonce incorrect",
"lp21": "Combiner des éléments clés",
"lp22": "La clé est prête"
},
"logout": {
"logout": "DECONNEXION",
@ -148,7 +210,11 @@
},
"walletprofile": {
"minterlevel": "Niveau de frappeur",
"blocksminted": "Blocs frappés"
"blocksminted": "Blocs frappés",
"wp1": "Monnaie",
"wp2": "Pas de frappe",
"wp3": "Informations de base",
"wp4": "Synchronisé"
},
"general": {
"yes": "Oui",
@ -435,7 +501,7 @@
"nchange35": "VOUS AVEZ UN NOM !",
"nchange36": "Seuls les comptes sans nom enregistré peuvent acheter un nom.",
"nchange37": "ATTENTION !",
"nchange38": "Vous n'avez pas assez de qort pour acheter ce nom.",
"nchange38": "Vous n'avez pas assez de QORT pour acheter ce nom.",
"nchange39": "Êtes-vous sûr d'acheter ce nom ?",
"nchange40": "En appuyant sur confirmer, la demande d'achat de nom sera envoyée !",
"nchange41": "Ancien nom",
@ -493,13 +559,13 @@
"schange7": "Publié par",
"schange8": "Actions",
"schange9": "Q-Apps",
"schange10": "Aucune q-apps disponible",
"schange10": "Aucune Q-Apps disponible",
"schange11": "Vos Q-Apps suivies",
"schange12": "Q-Apps suivies",
"schange13": "Vous ne suivez aucune q-apps",
"schange13": "Vous ne suivez aucune Q-Apps",
"schange14": "Vos Q-Apps bloquées",
"schange15": "Applications Q bloquées",
"schange16": "Vous n'avez bloqué aucune q-apps",
"schange16": "Vous n'avez bloqué aucune Q-Apps",
"schange17": "Nom introuvable !",
"schange18": "Le mode relais est activé. Cela signifie que votre nœud aidera à transporter des données cryptées sur le réseau lorsqu'un pair le demande. Vous pouvez vous désinscrire en définissant",
"schange19": "dans",
@ -537,13 +603,13 @@
"schange7": "Publié par",
"schange8": "Actions",
"schange9": "Q-Tubes",
"schange10": "Aucun q-tube disponible",
"schange10": "Aucun Q-Tube disponible",
"schange11": "Vos Q-Tubes suivis",
"schange12": "A suivi Q-Tubes",
"schange13": "Vous ne suivez aucun q-tubes",
"schange13": "Vous ne suivez aucun Q-Tubes",
"schange14": "Vos Q-Tubes bloqués",
"schange15": "Q-Tubes bloqués",
"schange16": "Vous n'avez bloqué aucun q-tubes",
"schange16": "Vous n'avez bloqué aucun Q-Tubes",
"schange17": "Nom introuvable !",
"schange18": "Le mode relais est activé. Cela signifie que votre nœud aidera à transporter des données cryptées sur le réseau lorsqu'un pair le demande. Vous pouvez vous désinscrire en définissant",
"schange19": "dans",
@ -711,8 +777,8 @@
"cchange38": "Utilisateur vérifié",
"cchange39": "Impossible d'envoyer un message chiffré à cet utilisateur car il n'a pas sa clé publique sur la chaîne.",
"cchange40": "IMAGE (cliquez pour voir)",
"cchange41": "Votre solde est inférieur à 4,20 QORT",
"cchange42": "En raison de la nécessité de lutter contre le spam, les comptes avec un solde Qort inférieur à 4,20 mettront beaucoup de temps à ENVOYER des messages dans Q-Chat. Si vous souhaitez augmenter immédiatement la vitesse d'envoi des messages Q-Chat, obtenez plus de 4,20 QORT à votre adresse. Cela peut être fait avec des métiers dans le portail commercial, ou par le biais d'un autre Qortian vous donnant le QORT. Une fois que vous avez plus de 4,20 QORT dans votre compte, les messages Q-Chat seront instantanés et cette boîte de dialogue ne sera plus Nous vous remercions de votre compréhension de cette méthode de prévention du spam nécessaire, et nous espérons que vous apprécierez Qortal !",
"cchange41": "Votre solde est inférieur à 4 QORT",
"cchange42": "En raison de la nécessité de lutter contre le spam, les comptes avec un solde QORT inférieur à 4 mettront beaucoup de temps à ENVOYER des messages dans Q-Chat. Si vous souhaitez augmenter immédiatement la vitesse d'envoi des messages Q-Chat, obtenez plus de 4 QORT à votre adresse. Cela peut être fait avec des métiers dans le portail commercial, ou par le biais d'un autre Qortian vous donnant le QORT. Une fois que vous avez plus de 4 QORT dans votre compte, les messages Q-Chat seront instantanés et cette boîte de dialogue ne sera plus Nous vous remercions de votre compréhension de cette méthode de prévention du spam nécessaire, et nous espérons que vous apprécierez Qortal !",
"cchange43": "Tip QORT à",
"cchange44": "ENVOYER UN MESSAGE",
"cchange45": "CONSEIL UTILISATEUR",
@ -897,7 +963,9 @@
"nchange29": "Suppression réussie du compte de frappe!",
"nchange30": "Echec de la suppression du compte de frappe!",
"nchange31": "Arreter le noeud",
"nchange32": "Demande darrêt envoyée avec succès!"
"nchange32": "Demande darrêt envoyée avec succès!",
"nchange33": "Redémarrer le noeud",
"nchange34": "Demande de redémarrage envoyée avec succès!"
},
"transpage": {
"tchange1": "Demande de transaction",
@ -978,7 +1046,9 @@
"exp18": "Paiements",
"exp19": "Envoyé",
"exp20": "Reçu",
"exp21": "Métiers"
"exp21": "Métiers",
"exp22": "5 DERNIERS PAIEMENTS",
"exp23": "Afficher tous les paiements"
},
"managegroup": {
"mg1": "Membres du groupe",
@ -1059,6 +1129,8 @@
"inf13": "Acheter automatiquement",
"inf14": "avec",
"inf15": "Commandes d'achat automatique actives",
"inf16": "Achat automatique"
"inf16": "Achat automatique",
"inf17": "Passer au thème clair",
"inf18": "Passer au thème sombre"
}
}

View File

@ -19,7 +19,8 @@
"russian": "रूसी",
"norwegian": "नार्वेजियन",
"romanian": "रोमानियाई",
"korean": "कोरियाई"
"korean": "कोरियाई",
"japanese": "जापानी"
},
"sidemenu": {
"minting": "मिंटिंग",
@ -42,6 +43,45 @@
"sm2": "नाम प्रबंधन",
"sm3": "नाम बाजार"
},
"tabmenu": {
"tm1": "खनन विवरण",
"tm2": "एक कामचोर बनें",
"tm3": "प्रायोजन सूची",
"tm4": "वॉलेट",
"tm5": "ट्रेड पोर्टल",
"tm6": "ऑटो खरीदें",
"tm7": "पुरस्कार शेयर",
"tm8": "क्यू-चैट",
"tm9": "नाम पंजीकरण",
"tm10": "नाम बाजार",
"tm11": "वेबसाइट",
"tm12": "क्यू-ऐप्स",
"tm13": "समूह प्रबंधन",
"tm14": "डेटा प्रबंधन",
"tm15": "पहेलियाँ",
"tm16": "नोड प्रबंधन",
"tm17": "नया टैब",
"tm18": "नया टैब जोड़ें",
"tm19": "नया प्लगइन जोड़ें",
"tm20": "क्यू-ऐप",
"tm21": "वेबसाइट",
"tm22": "प्लगइन हटाएं",
"tm23": "क्या आप वाकई इस प्लगइन को हटाना चाहते हैं?",
"tm24": "प्लगइन प्रकार:",
"tm25": "कृपया प्लगइन प्रकार चुनें!",
"tm26": "मेनू में नया प्लगइन जोड़ें",
"tm27": "मेनू से प्लगइन हटाएं",
"tm28": "अवलोकन पृष्ठ",
"tm29": "टैब मेनू रीसेट करें",
"tm30": "क्वार्टल नाम खोजें",
"tm31": "मेरे फ़ॉलो किए गए नाम",
"tm32": "यह खाता किसी भी उपयोगकर्ता को फ़ॉलो नहीं करता",
"tm33": "टैब मेनू आयात करें",
"tm34": "निर्यात टैब मेनू",
"tm35": "आपका मौजूदा टैब मेनू हटा दिया जाएगा और अपलोड किए गए टैब मेनू पर सेट कर दिया जाएगा।",
"tm36": "टैब मेनू सफलतापूर्वक पुनर्स्थापित किया गया",
"tm37": "टैब मेनू सफलतापूर्वक इस रूप में सहेजा गया"
},
"login": {
"login": "लॉग इन करें",
"createaccount": "खाता बनाएं",
@ -87,7 +127,29 @@
"created1": "आपका खाता अब निर्मित हो गया है",
"created2": " और इस ब्राउज़र में सहेजा जाएगा।",
"downloadbackup": "वॉलेट बैकअप फ़ाइल डाउनलोड करें",
"passwordhint": "पासवर्ड कम से कम 8 अक्षर का होना चाहिए।"
"passwordhint": "पासवर्ड कम से कम 8 अक्षर का होना चाहिए।",
"lp1": "लॉक स्क्रीन",
"lp2": "कोई लॉक स्क्रीन पासवर्ड सेट नहीं है!",
"lp3": "कृपया एक सेट करें",
"lp4": "नहीं धन्यवाद",
"lp5": "पासवर्ड सेट करें",
"lp6": "नया स्क्रीन लॉक पासवर्ड सफलतापूर्वक सेट हो गया!",
"lp7": "अनलॉक",
"lp8": "त्रुटि: ग़लत पासवर्ड",
"lp9": "आईएस",
"lp10": "लॉक",
"lp11": "अनलॉक",
"lp12": "सहेजे गए डेटा को डिकोड करना",
"lp13": "डिक्रिप्शन कुंजी उत्पन्न करना",
"lp14": "कुंजी जाँच रहा है",
"lp15": "गलत पासवर्ड",
"lp16": "डिक्रिप्टिंग",
"lp17": "कर्मचारियों के तैयार होने की प्रतीक्षा की जा रही है",
"lp18": "मुख्य भाग प्राप्त करना",
"lp19": "त्रुटि, गलत कुंजी।",
"lp20": "त्रुटि, ग़लत एक बार",
"lp21": "मुख्य भागों का संयोजन",
"lp22": "कुंजी तैयार है"
},
"logout": {
"logout": "लॉग आउट",
@ -149,7 +211,11 @@
},
"walletprofile": {
"minterlevel": "मिन्टर लेवल",
"blocksminted": "ब्लॉक मिंटेड"
"blocksminted": "ब्लॉक मिंटेड",
"wp1": "खनन",
"wp2": "नॉट मिंटिंग",
"wp3": "मुख्य जानकारी",
"wp4": "सिंक्रोनाइज़्ड"
},
"general": {
"yes": "हाँ",
@ -712,8 +778,8 @@
"cchange38": "उपयोगकर्ता सत्यापित",
"cchange39": "इस उपयोगकर्ता को एक एन्क्रिप्टेड संदेश नहीं भेज सकता क्योंकि उनके पास श्रृंखला पर अपनी सार्वजनिक कुंजी नहीं है।",
"cchange40": "छवि (देखने के लिए क्लिक करें)",
"cchange41": "आपका बैलेंस 4.20 QORT से कम है",
"cchange42": "स्पैम से निपटने की आवश्यकता के कारण, 4.20 Qort से कम बैलेंस वाले खातों को Q-Chat में संदेश भेजने में लंबा समय लगेगा। यदि आप Q-Chat संदेशों के लिए भेजने की गति को तुरंत बढ़ाना चाहते हैं, तो 4.20 से अधिक प्राप्त करें। आपके पते पर QORT। यह व्यापार पोर्टल में ट्रेडों के साथ किया जा सकता है, या आपको QORT देने वाले किसी अन्य QORTIAN के माध्यम से किया जा सकता है। एक बार जब आपके खाते में 4.20 QORT से अधिक हो जाते हैं, तो Q-चैट संदेश तत्काल होंगे और यह डायलॉग अब और नहीं होगा दिखाएँ। इस आवश्यक स्पैम रोकथाम विधि को समझने के लिए धन्यवाद, और हम आशा करते हैं कि आप Qortal का आनंद लेंगे!",
"cchange41": "आपका बैलेंस 4 QORT से कम है",
"cchange42": "स्पैम से निपटने की आवश्यकता के कारण, 4 QORT से कम बैलेंस वाले खातों को Q-Chat में संदेश भेजने में लंबा समय लगेगा। यदि आप Q-Chat संदेशों के लिए भेजने की गति को तुरंत बढ़ाना चाहते हैं, तो 4 से अधिक प्राप्त करें। आपके पते पर QORT। यह व्यापार पोर्टल में ट्रेडों के साथ किया जा सकता है, या आपको QORT देने वाले किसी अन्य QORTIAN के माध्यम से किया जा सकता है। एक बार जब आपके खाते में 4 QORT से अधिक हो जाते हैं, तो Q-चैट संदेश तत्काल होंगे और यह डायलॉग अब और नहीं होगा दिखाएँ। इस आवश्यक स्पैम रोकथाम विधि को समझने के लिए धन्यवाद, और हम आशा करते हैं कि आप Qortal का आनंद लेंगे!",
"cchange43": "QORT को टिप दें",
"cchange44": "संदेश भेजें",
"cchange45": "टिप उपयोगकर्ता",
@ -898,7 +964,9 @@
"nchange29": "मिंटिंग अकाउंट को सफलतापूर्वक हटाया गया!",
"nchange30": "खनन खाता हटाने में विफल!",
"nchange31": "स्टॉप नोड",
"nchange32": "स्टॉप अनुरोध सफलतापूर्वक भेजा गया!"
"nchange32": "स्टॉप अनुरोध सफलतापूर्वक भेजा गया!",
"nchange33": "नोड फिर से चालू करें",
"nchange34": "रीस्टार्ट अनुरोध सफलतापूर्वक भेजा गया!"
},
"transpage": {
"tchange1": "लेनदेन अनुरोध",
@ -979,7 +1047,9 @@
"exp18": "भुगतान",
"exp19": "भेजा गया",
"exp20": "प्राप्त",
"exp21": "ट्रेडों"
"exp21": "ट्रेडों",
"exp22": "पिछले 5 भुगतान",
"exp23": "सभी भुगतान दिखाएं"
},
"managegroup": {
"mg1": "समूह के सदस्य",
@ -1060,6 +1130,8 @@
"inf13": "स्वचालित रूप से ख़रीदें",
"inf14": "साथ",
"inf15": "सक्रिय ऑटो खरीद आदेश",
"inf16": "ऑटो खरीदें"
"inf16": "ऑटो खरीदें",
"inf17": "लाइट थीम पर स्विच करें",
"inf18": "गहरे रंग वाली थीम पर स्विच करें"
}
}

View File

@ -18,7 +18,8 @@
"russian": "Ruski",
"norwegian": "Norveški",
"romanian": "Rumunjski",
"korean": "Korejski"
"korean": "Korejski",
"japanese": "Japanski"
},
"sidemenu": {
"minting": "KOVANJE",
@ -41,6 +42,45 @@
"sm2": "UPRAVLJANJE IMENIMA",
"sm3": "TRŽIŠTE IMENA"
},
"tabmenu": {
"tm1": "Detalji o kovanju",
"tm2": "Postanite kovač",
"tm3": "Popis sponzora",
"tm4": "Novčanici",
"tm5": "Trgovački portal",
"tm6": "Automatska kupnja",
"tm7": "Udio nagrade",
"tm8": "Q-Chat",
"tm9": "Registracija imena",
"tm10": "Tržište imena",
"tm11": "Web stranice",
"tm12": "Q-Apps",
"tm13": "Upravljanje grupom",
"tm14": "Upravljanje podacima",
"tm15": "Zagonetke",
"tm16": "Upravljanje čvorom",
"tm17": "Nova kartica",
"tm18": "Dodaj novu karticu",
"tm19": "Dodaj novi dodatak",
"tm20": "Q-App",
"tm21": "Web stranica",
"tm22": "Ukloni dodatak",
"tm23": "Jeste li sigurni da želite ukloniti ovaj dodatak?",
"tm24": "Vrsta dodatka:",
"tm25": "Molimo odaberite vrstu dodatka!",
"tm26": "Dodaj novi dodatak u izbornik",
"tm27": "Ukloni dodatak iz izbornika",
"tm28": "Stranica pregleda",
"tm29": "Poništi izbornik kartice",
"tm30": "Traži Qortal naziv",
"tm31": "Moja praćena imena",
"tm32": "Ovaj račun ne prati nijednog korisnika",
"tm33": "Izbornik kartice uvoza",
"tm34": "Izbornik kartice Izvoz",
"tm35": "Vaš postojeći izbornik kartica bit će izbrisan i postavljen na učitani izbornik kartica.",
"tm36": "Izbornik kartice uspješno vraćen",
"tm37": "Izbornik kartice uspješno spremljen kao"
},
"login": {
"login": "Prijavi se",
"createaccount": "Stvori račun",
@ -86,7 +126,29 @@
"created1": "Vaš je račun sada stvoren",
"created2": "i bit će spremljen u ovom pregledniku.",
"downloadbackup": "Preuzmite datoteku sigurnosne kopije novčanika",
"passwordhint": "Lozinka mora imati najmanje 8 znakova."
"passwordhint": "Lozinka mora imati najmanje 8 znakova.",
"lp1": "Zaključani zaslon",
"lp2": "Nije postavljena lozinka za zaključavanje zaslona!",
"lp3": "Molimo postavite jedan",
"lp4": "Ne hvala",
"lp5": "Postavi lozinku",
"lp6": "Nova lozinka za zaključavanje zaslona uspješno postavljena!",
"lp7": "OTKLJUČAJ",
"lp8": "Greška: netočna lozinka",
"lp9": "JE",
"lp10": "ZAKLJUČANO",
"lp11": "OTKLJUČANO",
"lp12": "Dekodiranje spremljenih podataka",
"lp13": "Generiranje ključa za dešifriranje",
"lp14": "Ključ za provjeru",
"lp15": "Netočna lozinka",
"lp16": "Dešifriranje",
"lp17": "Čeka se da radnici budu spremni",
"lp18": "Izvođenje ključnih dijelova",
"lp19": "Greška, netočan ključ. ",
"lp20": "Pogreška, netočno jednokratno",
"lp21": "Kombiniranje ključnih dijelova",
"lp22": "Ključ je spreman"
},
"logout": {
"logout": "ODJAVITE SE",
@ -148,7 +210,11 @@
},
"walletprofile": {
"minterlevel": "Minter Level",
"blocksminted": "Mintani blokovi"
"blocksminted": "Mintani blokovi",
"wp1": "Kovanje",
"wp2": "Nije kovano",
"wp3": "Osnovne informacije",
"wp4": "Sinkronizirano"
},
"general": {
"yes": "Da",
@ -435,7 +501,7 @@
"nchange35": "IMATE IME!",
"nchange36": "Samo računi bez registriranog imena mogu kupiti ime.",
"nchange37": "PAŽNJA!",
"nchange38": "Nemate dovoljno qort da kupite ovo ime.",
"nchange38": "Nemate dovoljno QORT da kupite ovo ime.",
"nchange39": "Jeste li sigurni da želite kupiti ovo ime?",
"nchange40": "Pritiskom na potvrdu, zahtjev za kupnju imena bit će poslan!",
"nchange41": "Staro ime",
@ -493,13 +559,13 @@
"schange7": "Objavio",
"schange8": "Akcije",
"schange9": "Q-Apps",
"schange10": "Nema dostupnih q-apps",
"schange10": "Nema dostupnih Q-Apps",
"schange11": "Q-Apps koje pratite",
"schange12": "Pratite Q-Apps",
"schange13": "Ne pratite nijednu q-apps",
"schange13": "Ne pratite nijednu Q-Apps",
"schange14": "Vaše blokirane Q-Apps",
"schange15": "Blokirane Q-Apps",
"schange16": "Niste blokirali nijednu q-apps",
"schange16": "Niste blokirali nijednu Q-Apps",
"schange17": "Ime nije pronađeno!",
"schange18": "Relejni način rada je omogućen. To znači da će vaš čvor pomoći u prijenosu šifriranih podataka po mreži kada to ravnopravni uređaj zatraži. Možete se isključiti postavljanjem",
"schange19": "u",
@ -537,13 +603,13 @@
"schange7": "Objavio",
"schange8": "Akcije",
"schange9": "Q-Tubes",
"schange10": "Nema dostupnih q-tubes",
"schange10": "Nema dostupnih Q-Tubes",
"schange11": "Q-Tubes koje pratite",
"schange12": "Pratio Q-Tubes",
"schange13": "Ne pratite nijednu q-tubes",
"schange13": "Ne pratite nijednu Q-Tubes",
"schange14": "Vaše blokirane Q-Tubes",
"schange15": "Blokirane Q-Tubes",
"schange16": "Niste blokirali nijednu q-tubes",
"schange16": "Niste blokirali nijednu Q-Tubes",
"schange17": "Ime nije pronađeno!",
"schange18": "Relejni način rada je omogućen. To znači da će vaš čvor pomoći u prijenosu šifriranih podataka po mreži kada to ravnopravni uređaj zatraži. Možete se isključiti postavljanjem",
"schange19": "u",
@ -711,8 +777,8 @@
"cchange38": "Korisnički potvrđeno",
"cchange39": "Ne mogu poslati šifriranu poruku ovom korisniku jer nemaju svoj javni ključ u lancu.",
"cchange40": "SLIKA (kliknite za prikaz)",
"cchange41": "Vaš saldo je ispod 4,20 QORT",
"cchange42": "Zbog potrebe za suzbijanjem neželjene pošte, računima sa saldom ispod 4.20 Qort trebat će dugo vremena za POŠALJANJE poruka u Q-Chatu. Ako želite odmah povećati brzinu slanja za Q-Chat poruke, nabavite preko 4.20 QORT na vašu adresu. To se može učiniti trgovanjem na Trade Portalu ili putem drugog Qortiana koji vam daje QORT. Kada budete imali više od 4,20 QORT na svom računu, Q-Chat poruke bit će trenutne i ovaj dijaloški okvir više neće biti show. Hvala vam na razumijevanju ove neophodne metode za sprječavanje spama i nadamo se da ćete uživati u Qortalu!",
"cchange41": "Vaš saldo je ispod 4 QORT",
"cchange42": "Zbog potrebe za suzbijanjem neželjene pošte, računima sa saldom ispod 4 QORT trebat će dugo vremena za POŠALJANJE poruka u Q-Chatu. Ako želite odmah povećati brzinu slanja za Q-Chat poruke, nabavite preko 4 QORT na vašu adresu. To se može učiniti trgovanjem na Trade Portalu ili putem drugog Qortiana koji vam daje QORT. Kada budete imali više od 4 QORT na svom računu, Q-Chat poruke bit će trenutne i ovaj dijaloški okvir više neće biti show. Hvala vam na razumijevanju ove neophodne metode za sprječavanje spama i nadamo se da ćete uživati u Qortalu!",
"cchange43": "Napojnica QORT za",
"cchange44": "POŠALJI PORUKU",
"cchange45": "SAVJET KORISNIKU",
@ -897,7 +963,9 @@
"nchange29": "Uspješno uklonjen minter račun!",
"nchange30": "Neuspješno uklanjanje minter računa!",
"nchange31": "Zaustavi čvor",
"nchange32": "Uspješno poslan zahtjev za zaustavljenje!"
"nchange32": "Uspješno poslan zahtjev za zaustavljenje!",
"nchange33": "Ponovo pokreni čvor",
"nchange34": "Uspješno poslan zahtjev za ponovnim pokretanjem!"
},
"transpage": {
"tchange1": "Zahtjev za transakciju",
@ -978,7 +1046,9 @@
"exp18": "Plaćanja",
"exp19": "Poslano",
"exp20": "Primljeno",
"exp21": "Obrta"
"exp21": "Obrta",
"exp22": "ZADNJIH 5 UPLATA",
"exp23": "Prikaži sva plaćanja"
},
"managegroup": {
"mg1": "Članovi grupe",
@ -1059,6 +1129,8 @@
"inf13": "Automatska kupnja",
"inf14": "sa",
"inf15": "Aktivne automatske narudžbe za kupnju",
"inf16": "Automatska kupnja"
"inf16": "Automatska kupnja",
"inf17": "Prebaci na svijetlu temu",
"inf18": "Prebaci na tamnu temu"
}
}

View File

@ -18,7 +18,8 @@
"russian": "Orosz",
"norwegian": "Norvég",
"romanian": "Román",
"korean": "Koreai"
"korean": "Koreai",
"japanese": "Japán"
},
"sidemenu": {
"minting": "BÉRTÉS",
@ -41,6 +42,45 @@
"sm2": "NÉVKEZELÉS",
"sm3": "NAMES PIAC"
},
"tabmenu": {
"tm1": "A pénzverés részletei",
"tm2": "Legyen pénzverés",
"tm3": "Szponzori lista",
"tm4": "pénztárcák",
"tm5": "Kereskedelmi portál",
"tm6": "Automatikus vásárlás",
"tm7": "Jutalommegosztás",
"tm8": "Q-Chat",
"tm9": "Név regisztráció",
"tm10": "Names Market",
"tm11": "Webhelyek",
"tm12": "Q-apps",
"tm13": "Csoportkezelés",
"tm14": "Adatkezelés",
"tm15": "Rejtvények",
"tm16": "Csomópontkezelés",
"tm17": "Új lap",
"tm18": "Új lap hozzáadása",
"tm19": "Új beépülő modul hozzáadása",
"tm20": "Q-App",
"tm21": "Webhely",
"tm22": "Plugin eltávolítása",
"tm23": "Biztosan eltávolítja ezt a bővítményt?",
"tm24": "Plugin Type:",
"tm25": "Kérjük, válasszon beépülő modul típust!",
"tm26": "Új beépülő modul hozzáadása a menühöz",
"tm27": "Plugin eltávolítása a menüből",
"tm28": "Áttekintő oldal",
"tm29": "Reset Tab Menu",
"tm30": "Qortal név keresése",
"tm31": "Követett neveim",
"tm32": "Ez a fiók nem követ egyetlen felhasználót sem",
"tm33": "Importálás lap menü",
"tm34": "Exportálás lap menü",
"tm35": "Meglévő lapmenüje törlésre kerül, és a feltöltött lapok menüje lesz.",
"tm36": "A lap menüje sikeresen visszaállítva",
"tm37": "A lap menüje sikeresen mentve másként"
},
"login": {
"login": "Bejelentkezés",
"createaccount": "Fiók Létrehozása",
@ -86,7 +126,29 @@
"created1": "A fiók most jön létre",
"created2": " és mentésre kerül ebben a böngészőben.",
"downloadbackup": "Pénztárca biztonsági mentési fájl letöltése",
"passwordhint": "A jelszónak legalább 8 karakterből kell állnia."
"passwordhint": "A jelszónak legalább 8 karakterből kell állnia.",
"lp1": "Képernyőzár",
"lp2": "Nincs beállítva a lezárási képernyő jelszava!",
"lp3": "Kérjük, állítson be egyet",
"lp4": "Nem, köszönöm",
"lp5": "Jelszó beállítása",
"lp6": "Az új képernyőzárolási jelszó sikeresen beállítva!",
"lp7": "UNLOCK",
"lp8": "Hiba: hibás jelszó",
"lp9": "IS",
"lp10": "ZÁROLVA",
"lp11": "FELOLDVA",
"lp12": "Elmentett adatok dekódolása",
"lp13": "Dekódoló kulcs generálása",
"lp14": "Ellenőrző kulcs",
"lp15": "Helytelen jelszó",
"lp16": "Dekódolás",
"lp17": "Várakozás a dolgozókra, hogy készen álljanak",
"lp18": "Kulcsrészek származtatása",
"lp19": "Hiba, hibás kulcs. ",
"lp20": "Hiba, incorrect nonce",
"lp21": "A legfontosabb alkatrészek kombinálása",
"lp22": "A kulcs készen áll"
},
"logout": {
"logout": "KIJELENTKEZIK",
@ -148,7 +210,11 @@
},
"walletprofile": {
"minterlevel": "Pénzverő Szint",
"blocksminted": "Vert blokkok"
"blocksminted": "Vert blokkok",
"wp1": "verés",
"wp2": "Nem pénzverés",
"wp3": "Alapinformációk",
"wp4": "Szinkronizált"
},
"general": {
"yes": "Igen",
@ -244,7 +310,7 @@
"mchange31": "Segítségért Nyomja Meg A Gombot",
"mchange32": "Legyen Pénzverő",
"mchange33": "Bevezetés",
"mchange34": "A Qortalban ahhoz, hogy pénzverővé váljon, és elkezdjen QORT jutalmakat keresni a Minter szint növelésével, először 'szponzorálttá' kell válnia. A Qortal szponzora bármely más 5. vagy annál magasabb szintű pénzverő, vagy qortal alapító.Szponzori kulcsot kap a szponzortól, és ezt a kulcsot használja az 1. szintre való eljutáshoz. Miután elérte az 1. szintet, létrehozhatja saját verési kulcsát, és elkezdhet jutalmakat keresni a Qortal Blockchain biztosításáért.",
"mchange34": "A Qortalban ahhoz, hogy pénzverővé váljon, és elkezdjen QORT jutalmakat keresni a Minter szint növelésével, először 'szponzorálttá' kell válnia. A Qortal szponzora bármely más 5. vagy annál magasabb szintű pénzverő, vagy Qortal alapító.Szponzori kulcsot kap a szponzortól, és ezt a kulcsot használja az 1. szintre való eljutáshoz. Miután elérte az 1. szintet, létrehozhatja saját verési kulcsát, és elkezdhet jutalmakat keresni a Qortal Blockchain biztosításáért.",
"mchange35": "Szponzorálás",
"mchange36": "A szponzorod kiad neked egy 'szponzorációs kulcsot', amelyet a csomópontodhoz való hozzáadáshoz fogsz használni, és elkezd verni (jutalom nélkül, amíg el nem éri a szintet 1.) Amint eléri az 1. szintet, létrehozza / hozzárendeli saját 'pénzverő kulcsát'.",
"mchange37": "Egyszerűen lépjen kapcsolatba egy Qortal-i pénzverdével, aki elég magas ahhoz, hogy kiadjon egy szponzorációs kulcsot, megszerezze azt a kulcsot, majd jöjjön vissza ide, és adja meg a kulcsot a verési út megkezdéséhez!",
@ -435,7 +501,7 @@
"nchange35": "VAN NEVE!",
"nchange36": "Csak a regisztrált név nélküli fiókok vásárolhatnak nevet.",
"nchange37": "FIGYELEM!",
"nchange38": "Nincs elég qortja ennek a névnek a megvásárlásához.",
"nchange38": "Nincs elég QORTja ennek a névnek a megvásárlásához.",
"nchange39": "Biztosan megveszi ezt a nevet?",
"nchange40": "A megerősítés megnyomására a vásárlási névkérelem elküldésre kerül!",
"nchange41": "Régi név",
@ -493,13 +559,13 @@
"schange7": "Kiadó",
"schange8": "Műveletek",
"schange9": "Q-Apps",
"schange10": "Nincs elérhető q-apps",
"schange10": "Nincs elérhető Q-Apps",
"schange11": "Az Ön által követett Q-Apps",
"schange12": "Követett Q-alkalmazások",
"schange13": "Nem követsz egyetlen q-apps sem",
"schange13": "Nem követsz egyetlen Q-Apps sem",
"schange14": "Az Ön letiltott Q-Apps",
"schange15": "Letiltott Q-Apps",
"schange16": "Nem tiltott le egyetlen q-apps sem",
"schange16": "Nem tiltott le egyetlen Q-Apps sem",
"schange17": "A név nem található!",
"schange18": "A továbbítási mód engedélyezve van. Ez azt jelenti, hogy a csomópont segít a titkosított adatok továbbításában a hálózaton, amikor egy társ kéri. A beállítással letilthatja",
"schange19": "in",
@ -537,13 +603,13 @@
"schange7": "Kiadó",
"schange8": "Műveletek",
"schange9": "Q-Tubes",
"schange10": "Nincs elérhető q-tubes",
"schange10": "Nincs elérhető Q-Tubes",
"schange11": "Az Ön által követett Q-Tubes",
"schange12": "Követve Q-Tubes",
"schange13": "Nem követsz egyetlen q-tubes sem",
"schange13": "Nem követsz egyetlen Q-Tubes sem",
"schange14": "Az Ön blokkolt Q-Tubes",
"schange15": "Blocked Q-Tubes",
"schange16": "Nem blokkoltál egyetlen q-tubes sem",
"schange16": "Nem blokkoltál egyetlen Q-Tubes sem",
"schange17": "A név nem található!",
"schange18": "A továbbítási mód engedélyezve van. Ez azt jelenti, hogy a csomópont segít a titkosított adatok továbbításában a hálózaton, amikor egy társ kéri. A beállítással letilthatja",
"schange19": "in",
@ -711,8 +777,8 @@
"cchange38": "Felhasználó ellenőrizve",
"cchange39": "Ennek a felhasználónak nem lehet titkosított üzenetet küldeni, mivel nincs nyilvános kulcsa a láncban.",
"cchange40": "IMAGE (kattintson a megtekintéséhez)",
"cchange41": "Az Ön egyenlege 4,20 QORT alatt van",
"cchange42": "A spam elleni küzdelem szükségessége miatt a 4,20 alatti Qort-egyenleggel rendelkező fiókoknál sokáig tart az üzenetek KÜLDÉSE a Q-Chat szolgáltatásban. Ha azonnal meg szeretné növelni a Q-Chat üzenetek küldési sebességét, szerezzen be 4,20 feletti QORT az Ön címére. Ezt megteheti a Kereskedelmi Portálon végzett kereskedésekkel, vagy egy másik QORT-al, amely megadja a QORT-t. Ha 4,20 QORT felett van a fiókjában, a Q-Chat üzenetek azonnal megjelennek, és ez a párbeszédpanel többé nem Köszönjük, hogy megértette ezt a szükséges spammegelőzési módszert, és reméljük, hogy élvezni fogja a Qortalt!",
"cchange41": "Az Ön egyenlege 4 QORT alatt van",
"cchange42": "A spam elleni küzdelem szükségessége miatt a 4 alatti Qort-egyenleggel rendelkező fiókoknál sokáig tart az üzenetek KÜLDÉSE a Q-Chat szolgáltatásban. Ha azonnal meg szeretné növelni a Q-Chat üzenetek küldési sebességét, szerezzen be 4 feletti QORT az Ön címére. Ezt megteheti a Kereskedelmi Portálon végzett kereskedésekkel, vagy egy másik QORT-al, amely megadja a QORT-t. Ha 4 QORT felett van a fiókjában, a Q-Chat üzenetek azonnal megjelennek, és ez a párbeszédpanel többé nem Köszönjük, hogy megértette ezt a szükséges spammegelőzési módszert, és reméljük, hogy élvezni fogja a Qortalt!",
"cchange43": "QORT tippje",
"cchange44": "ÜZENET KÜLDÉSE",
"cchange45": "FELHASZNÁLÓ TIPP",
@ -897,7 +963,9 @@
"nchange29": "Sikerült eltávolítani a verési fiókot!",
"nchange30": "Nem sikerült eltávolítani a verési fiókot!",
"nchange31": "Csomópont Leállítás",
"nchange32": "Sikeresen Elküldött Stop Kérés!"
"nchange32": "Sikeresen Elküldött Stop Kérés!",
"nchange33": "Csomópont Újraindítása",
"nchange34": "Sikeresen Elküldött Újraindítási Kérés!"
},
"transpage": {
"tchange1": "Tranzakciós Kérelem",
@ -978,7 +1046,9 @@
"exp18": "Kifizetések",
"exp19": "Elküldve",
"exp20": "Fogadott",
"exp21": "Passzátszelek"
"exp21": "Passzátszelek",
"exp22": "UTOLSÓ 5 FIZETÉS",
"exp23": "Minden kifizetés megjelenítése"
},
"managegroup": {
"mg1": "Csoporttagok",
@ -1059,6 +1129,8 @@
"inf13": "Automatikus vásárlás",
"inf14": "with",
"inf15": "Aktív automatikus vásárlási megbízások",
"inf16": "Automatikus vásárlás"
"inf16": "Automatikus vásárlás",
"inf17": "Váltás világos témára",
"inf18": "Váltás sötét témára"
}
}

View File

@ -18,7 +18,8 @@
"russian": "Russo",
"norwegian": "Norvegese",
"romanian": "Rumeno",
"korean": "Coreano"
"korean": "Coreano",
"japanese": "Giapponese"
},
"sidemenu": {
"minting": "CONIAZIONE",
@ -41,6 +42,45 @@
"sm2": "GESTIONE NOMI",
"sm3": "MERCATO DEI NOMI"
},
"tabmenu": {
"tm1": "Dettagli conio",
"tm2": "Diventa un minatore",
"tm3": "Elenco sponsorizzazioni",
"tm4": "Portafogli",
"tm5": "Portale commerciale",
"tm6": "Acquisto automatico",
"tm7": "Condivisione ricompensa",
"tm8": "Q-Chat",
"tm9": "Registrazione nome",
"tm10": "Mercato nomi",
"tm11": "Siti web",
"tm12": "Q-Apps",
"tm13": "Gestione gruppo",
"tm14": "Gestione dati",
"tm15": "Puzzle",
"tm16": "Gestione nodi",
"tm17": "Nuova scheda",
"tm18": "Aggiungi nuova scheda",
"tm19": "Aggiungi nuovo plugin",
"tm20": "Q-App",
"tm21": "Sito web",
"tm22": "Rimuovi plugin",
"tm23": "Sei sicuro di voler rimuovere questo plugin?",
"tm24": "Tipo di plug-in:",
"tm25": "Seleziona un tipo di plugin!",
"tm26": "Aggiungi nuovo plugin al menu",
"tm27": "Rimuovi plugin dal menu",
"tm28": "Pagina panoramica",
"tm29": "Ripristina menu scheda",
"tm30": "Cerca nome Qortal",
"tm31": "I miei nomi seguiti",
"tm32": "Questo account non segue nessun utente",
"tm33": "Menu scheda Importa",
"tm34": "Menu scheda Esporta",
"tm35": "Il menu della scheda esistente verrà eliminato e impostato sul menu della scheda caricato.",
"tm36": "Menu scheda ripristinato con successo",
"tm37": "Menu scheda salvato con successo con nome"
},
"login": {
"login": "Login",
"createaccount": "Crea account",
@ -50,7 +90,7 @@
"youraccounts": "I tuoi account",
"clickto": "Fai clic sul tuo account per accedere con esso",
"needcreate": "Devi creare o salvare un account prima di poter accedere!",
"upload": "Carica il tuo backup di qortal",
"upload": "Carica il tuo backup di Qortal",
"howlogin": "Come vorresti accedere?",
"seed": "Seedphrase",
"seedphrase": "seedphrase",
@ -86,7 +126,29 @@
"created1": "Il tuo account è ora creato",
"created2": " e verrà salvato in questo browser.",
"downloadbackup": "Scarica il file di backup del portafoglio",
"passwordhint": "Una password deve contenere almeno 8 caratteri."
"passwordhint": "Una password deve contenere almeno 8 caratteri.",
"lp1": "Blocca schermo",
"lp2": "Nessuna password per la schermata di blocco impostata!",
"lp3": "Per favore impostane uno",
"lp4": "No, grazie",
"lp5": "Imposta password",
"lp6": "Nuova password di blocco dello schermo impostata con successo!",
"lp7": "SBLOCCA",
"lp8": "Errore: password errata",
"lp9": "È",
"lp10": "BLOCCATO",
"lp11": "SBLOCCATO",
"lp12": "Decodifica dei dati salvati",
"lp13": "Generazione della chiave di decrittazione",
"lp14": "Verifica chiave",
"lp15": "Password errata",
"lp16": "Decifratura",
"lp17": "In attesa che i lavoratori siano pronti",
"lp18": "Deriva parti chiave",
"lp19": "Errore, chiave errata. ",
"lp20": "Errore, nonce errato",
"lp21": "Combinazione di parti chiave",
"lp22": "La chiave è pronta"
},
"logout": {
"logout": "LOGOUT",
@ -148,7 +210,11 @@
},
"walletprofile": {
"minterlevel": "Livello Minter",
"blocksminted": "Blocchi Minati"
"blocksminted": "Blocchi Minati",
"wp1": "Conio",
"wp2": "Non conio",
"wp3": "Informazioni principali",
"wp4": "Sincronizzato"
},
"general": {
"yes": "Yes",
@ -435,7 +501,7 @@
"nchange35": "HAI UN NOME!",
"nchange36": "Solo gli account senza nome registrato possono acquistare un nome.",
"nchange37": "ATTENZIONE!",
"nchange38": "Non hai abbastanza qort per acquistare questo nome.",
"nchange38": "Non hai abbastanza QORT per acquistare questo nome.",
"nchange39": "Sei sicuro di acquistare questo nome?",
"nchange40": "Premendo conferma, verrà inviata la richiesta di acquisto del nome!",
"nchange41": "Vecchio nome",
@ -493,13 +559,13 @@
"schange7": "Pubblicato da",
"schange8": "Azioni",
"schange9": "Q-Apps",
"schange10": "Nessuna q-apps disponibile",
"schange10": "Nessuna Q-Apps disponibile",
"schange11": "Le tue Q-Apps seguite",
"schange12": "Q-Apps seguite",
"schange13": "Non stai seguendo nessuna q-apps",
"schange13": "Non stai seguendo nessuna Q-Apps",
"schange14": "Le tue Q-Apps bloccate",
"schange15": "Q-App bloccate",
"schange16": "Non hai bloccato nessuna q-apps",
"schange16": "Non hai bloccato nessuna Q-Apps",
"schange17": "Nome non trovato!",
"schange18": "La modalità di inoltro è abilitata. Ciò significa che il tuo nodo aiuterà a trasportare i dati crittografati sulla rete quando un peer lo richiede. Puoi disattivarli impostando",
"schange19": "dentro",
@ -537,13 +603,13 @@
"schange7": "Pubblicato da",
"schange8": "Azioni",
"schange9": "Q-Tubes",
"schange10": "Nessun q-tubes disponibile",
"schange10": "Nessun Q-Tubes disponibile",
"schange11": "I tuoi Q-Tubes seguiti",
"schange12": "Seguito Q-Tubes",
"schange13": "Non stai seguendo nessun q-tubes",
"schange13": "Non stai seguendo nessun Q-Tubes",
"schange14": "I tuoi Q-Tubes bloccati",
"schange15": "Q-Tubes bloccati",
"schange16": "Non hai bloccato nessun q-tubes",
"schange16": "Non hai bloccato nessun Q-Tubes",
"schange17": "Nome non trovato!",
"schange18": "La modalità di inoltro è abilitata. Ciò significa che il tuo nodo aiuterà a trasportare i dati crittografati sulla rete quando un peer lo richiede. Puoi disattivarli impostando",
"schange19": "dentro",
@ -711,8 +777,8 @@
"cchange38": "Utente verificato",
"cchange39": "Impossibile inviare un messaggio crittografato a questo utente poiché non ha la propria chiave pubblica sulla catena.",
"cchange40": "IMMAGINE (clicca per vedere)",
"cchange41": "Il tuo saldo è inferiore a 4,20 QORT",
"cchange42": "Per la necessità di combattere lo spam, gli account con un saldo Qort inferiore a 4.20 impiegheranno molto tempo per INVIARE messaggi in Q-Chat. Se desideri aumentare immediatamente la velocità di invio per i messaggi Q-Chat, ottieni oltre 4.20 QORT al tuo indirizzo. Questo può essere fatto con scambi nel Portale commerciale, o tramite un altro Qortian che ti fornisce il QORT. Una volta che hai più di 4.20 QORT nel tuo account, i messaggi Q-Chat saranno istantanei e questa finestra di dialogo non sarà più show. Grazie per la tua comprensione di questo necessario metodo di prevenzione dello spam e speriamo che ti piaccia Qortal!",
"cchange41": "Il tuo saldo è inferiore a 4 QORT",
"cchange42": "Per la necessità di combattere lo spam, gli account con un saldo QORT inferiore a 4 impiegheranno molto tempo per INVIARE messaggi in Q-Chat. Se desideri aumentare immediatamente la velocità di invio per i messaggi Q-Chat, ottieni oltre 4 QORT al tuo indirizzo. Questo può essere fatto con scambi nel Portale commerciale, o tramite un altro Qortian che ti fornisce il QORT. Una volta che hai più di 4 QORT nel tuo account, i messaggi Q-Chat saranno istantanei e questa finestra di dialogo non sarà più show. Grazie per la tua comprensione di questo necessario metodo di prevenzione dello spam e speriamo che ti piaccia Qortal!",
"cchange43": "Suggerisci QORT a",
"cchange44": "INVIA MESSAGGIO",
"cchange45": "CONSIGLIO UTENTE",
@ -897,7 +963,9 @@
"nchange29": "Conto di minting rimosso con successo!",
"nchange30": "Impossibile rimuovere l'account di minting!",
"nchange31": "Arresta nodo",
"nchange32": "Richiesta di arresto inviata con successo!"
"nchange32": "Richiesta di arresto inviata con successo!",
"nchange33": "Riavvia nodo",
"nchange34": "Richiesta di riavvio inviata con successo!"
},
"transpage": {
"tchange1": "Richiesta di transazione",
@ -978,7 +1046,9 @@
"exp18": "Pagamenti",
"exp19": "Inviato",
"exp20": "Ricevuto",
"exp21": "Mestieri"
"exp21": "Mestieri",
"exp22": "ULTIMI 5 PAGAMENTI",
"exp23": "Mostra tutti i pagamenti"
},
"managegroup": {
"mg1": "Membri del gruppo",
@ -1059,6 +1129,8 @@
"inf13": "Acquista automaticamente",
"inf14": "con",
"inf15": "Ordini di acquisto automatico attivi",
"inf16": "Acquisto automatico"
"inf16": "Acquisto automatico",
"inf17": "Passa al tema chiaro",
"inf18": "Passa al tema scuro"
}
}

1139
core/language/jp.json Normal file

File diff suppressed because it is too large Load Diff

View File

@ -18,7 +18,8 @@
"russian": "러시아어",
"norwegian": "노르웨이어",
"romanian": "루마니아어",
"korean": "한국어"
"korean": "한국어",
"japanese": "일본어"
},
"sidemenu": {
"minting": "주조",
@ -41,6 +42,45 @@
"sm2": "이름 관리",
"sm3": "이름 시장"
},
"tabmenu": {
"tm1": "조폐 세부 정보",
"tm2": "마인터 되기",
"tm3": "후원 목록",
"tm4": "지갑",
"tm5": "무역 포털",
"tm6": "자동 구매",
"tm7": "보상 공유",
"tm8": "Q-채팅",
"tm9": "이름 등록",
"tm10": "이름 시장",
"tm11": "웹사이트",
"tm12": "Q-앱",
"tm13": "그룹 관리",
"tm14": "데이터 관리",
"tm15": "퍼즐",
"tm16": "노드 관리",
"tm17": "새 탭",
"tm18": "새 탭 추가",
"tm19": "새 플러그인 추가",
"tm20": "Q-앱",
"tm21": "웹사이트",
"tm22": "플러그인 제거",
"tm23": "이 플러그인을 제거하시겠습니까?",
"tm24": "플러그인 유형:",
"tm25": "플러그인 유형을 선택하세요!",
"tm26": "메뉴에 새 플러그인 추가",
"tm27": "메뉴에서 플러그인 제거",
"tm28": "개요 페이지",
"tm29": "탭 메뉴 재설정",
"tm30": "Qortal 이름 검색",
"tm31": "내가 팔로우한 이름",
"tm32": "이 계정은 어떤 사용자도 팔로우하지 않습니다.",
"tm33": "탭 메뉴 가져오기",
"tm34": "탭 메뉴 내보내기",
"tm35": "기존 탭 메뉴가 삭제되고 업로드된 탭 메뉴로 설정됩니다.",
"tm36": "탭 메뉴 복원 성공",
"tm37": "탭 메뉴가 다른 이름으로 성공적으로 저장됨"
},
"login": {
"login": "로그인",
"createaccount": "계정 생성",
@ -50,7 +90,7 @@
"youraccounts": "귀하의 계정",
"clickto": "클릭하여 계정에 로그인하세요",
"needcreate": "로그인하기 전에 계정을 생성하거나 저장해야 합니다!",
"upload": "qortal 백업파일을 업로드합니다.",
"upload": "Qortal 백업파일을 업로드합니다.",
"howlogin": "어떤 방식으로 로그인하시겠습니까?",
"seed": "시드구문",
"seedphrase": "시드구문",
@ -70,7 +110,7 @@
"willbe": "백그라운드에서 랜덤하게 생성됩니다. 이것은 Qortal의 블록체인 계정에 대한 개인 키 생성기로 사용됩니다.",
"clicknext": "아래 NEXT를 클릭하여 Qortal 계정을 만드십시오.",
"ready": "계정을 만들 준비가 되었습니다. 이 브라우저에 저장됩니다. 브라우저에 새 계정을 저장하지 않으려면 아래 상자를 선택 취소할 수 있습니다. 계정을 만든 후에는 반드시 다운로드해야 하는 지갑 백업 파일을 사용하여 새 계정으로 로그인할 수 있습니다(로그아웃 후).",
"welmessage": "qortal에 오신 것을 환영합니다.",
"welmessage": "Qortal에 오신 것을 환영합니다.",
"pleaseenter": "암호를 입력하십시오!",
"notmatch": "암호가 일치하지 않습니다!",
"lessthen8": "암호가 8자 미만입니다! 이것은 권장되지 않습니다. 이 경고는 계속 무시할 수 있습니다.",
@ -86,7 +126,29 @@
"created1": "이제 계정이 생성되었습니다.",
"created2": " 이 브라우저에 저장됩니다.",
"downloadbackup": "지갑 백업 파일 다운로드",
"passwordhint": "비밀번호는 8자 이상이어야 합니다."
"passwordhint": "비밀번호는 8자 이상이어야 합니다.",
"lp1": "잠금 화면",
"lp2": "잠금 화면 암호가 설정되지 않았습니다!",
"lp3": "하나를 설정하세요",
"lp4": "아니요",
"lp5": "비밀번호 설정",
"lp6": "새 화면 잠금 암호가 성공적으로 설정되었습니다!",
"lp7": "잠금 해제",
"lp8": "오류: 잘못된 암호",
"lp9": "이다",
"lp10": "잠김",
"lp11": "잠금 해제됨",
"lp12": "저장 데이터 디코딩",
"lp13": "복호화 키 생성 중",
"lp14": "키 확인 중",
"lp15": "잘못된 비밀번호",
"lp16": "암호 해독 중",
"lp17": "작업자가 준비되기를 기다리는 중",
"lp18": "핵심 부품 도출",
"lp19": "오류, 잘못된 키입니다. ",
"lp20": "오류, 잘못된 nonce",
"lp21": "주요 부품 결합",
"lp22": "키가 준비되었습니다"
},
"logout": {
"logout": "로그아웃",
@ -148,7 +210,11 @@
},
"walletprofile": {
"minterlevel": "민터 레벨",
"blocksminted": "민트된 블록"
"blocksminted": "민트된 블록",
"wp1": "조폐",
"wp2": "조폐되지 않음",
"wp3": "핵심 정보",
"wp4": "동기화됨"
},
"general": {
"yes": "예",
@ -213,9 +279,9 @@
"mintingpage": {
"mchange1": "일반 민팅 정보",
"mchange2": "블록체인 통계",
"mchange3": "qortql 블록타임 평균",
"mchange3": "Qortal 블록타임 평균",
"mchange4": "일별 블록수 평균",
"mchange5": "일별 qort생성 평균",
"mchange5": "일별 QORT생성 평균",
"mchange6": "민팅 계정 세부사항",
"mchange7": "민터가 아님",
"mchange8": "민팅중",
@ -247,7 +313,7 @@
"mchange34": "Qortal에서 Minter가 되고 Minter Level이 상승하여 QORT 보상을 받기 시작하려면 먼저 '후원'이 되어야 합니다. Qortal의 후원자는 레벨 5 이상의 다른 부서 또는 Qortal Founder입니다. 스폰서로부터 후원 키를 받아 이 키를 사용하여 레벨 1로 이동합니다. 레벨 1에 도달하면 자신만의 조폐 키를 만들고 Qortal Blockchain 보안에 도움이 되는 보상을 받을 수 있습니다.",
"mchange35": "스폰서쉽",
"mchange36": "스폰서가 노드에 추가하는 데 사용할 '스폰서 키'를 발급하고 주조 작업을 시작합니다(레벨 1에 도달할 때까지 보상 없음). 레벨 1에 도달하면 '마인팅 키'를 작성/지정하고 보상을 획득합니다.",
"mchange37": "qortal에 있는 후원 키를 발급할 수 있을 정도로 높은 수준의 광부에게 연락하여 해당 키를 받은 다음 여기로 돌아와 주조 여행을 시작할 수 있는 키를 입력하기만 하면 됩니다.",
"mchange37": "Qortal에 있는 후원 키를 발급할 수 있을 정도로 높은 수준의 광부에게 연락하여 해당 키를 받은 다음 여기로 돌아와 주조 여행을 시작할 수 있는 키를 입력하기만 하면 됩니다.",
"mchange38": "안"
},
"becomeMinterPage": {
@ -435,7 +501,7 @@
"nchange35": "이름이 있습니다!",
"nchange36": "등록된 이름이 없는 계정만 이름을 살 수 있습니다.",
"nchange37": "주의!",
"nchange38": "이 이름을 살 만큼 충분한 qort가 없습니다.",
"nchange38": "이 이름을 살 만큼 충분한 QORT가 없습니다.",
"nchange39": "이 이름을 구입하시겠습니까?",
"nchange40": "확인을 누르면 구매 이름 요청이 전송됩니다!",
"nchange41": "이전 이름",
@ -493,10 +559,10 @@
"schange7": "출판사",
"schange8": "작업",
"schange9": "Q-Apps",
"schange10": "사용할 수 있는 q-apps 없음",
"schange10": "사용할 수 있는 Q-Apps 없음",
"schange11": "내가 팔로우한 Q-Apps",
"schange12": "팔로우한 Q-Apps",
"schange13": "팔로우 중인 q-apps 없습니다",
"schange13": "팔로우 중인 Q-Apps 없습니다",
"schange14": "차단된 Q-Apps",
"schange15": "차단된 Q-Apps",
"schange16": "Q-Apps 차단하지 않았습니다",
@ -537,13 +603,13 @@
"schange7": "출판사",
"schange8": "작업",
"schange9": "Q-Tubes",
"schange10": "사용 가능한 q-tubes 없음",
"schange10": "사용 가능한 Q-Tubes 없음",
"schange11": "내가 팔로우한 Q-Tubes",
"schange12": "팔로잉한 Q-Tubes",
"schange13": "팔로우 중인 q-tubes가 없습니다",
"schange13": "팔로우 중인 Q-Tubes가 없습니다",
"schange14": "차단된 Q-Tubes",
"schange15": "차단된 Q-Tubes",
"schange16": "어떤 q-tubes 차단하지 않았습니다",
"schange16": "어떤 Q-Tubes 차단하지 않았습니다",
"schange17": "이름을 찾을 수 없습니다!",
"schange18": "릴레이 모드가 활성화되었습니다. 이는 피어가 요청할 때 노드가 네트워크에서 암호화된 데이터를 전송하는 데 도움이 된다는 것을 의미합니다. 설정을 통해 옵트아웃할 수 있습니다.",
"schange19": "에서",
@ -711,8 +777,8 @@
"cchange38": "사용자 확인됨",
"cchange39": "체인에 공개 키가 없기 때문에 이 사용자에게 암호화된 메시지를 보낼 수 없습니다.",
"cchange40": "이미지(보려면 클릭)",
"cchange41": "잔액이 4.20QORT 미만입니다.",
"cchange42": "스팸 방지를 위해 잔액이 4.20Qort 미만인 계정은 Q-Chat에서 메시지를 보내는 데 시간이 오래 걸립니다. Q-Chat 메시지 전송 속도를 즉시 높이려면 4.20 이상을 얻으십시오. 귀하의 주소로 QORT. 이것은 Trade Portal에서 거래하거나 QORT를 제공하는 다른 Qortian을 통해 수행할 수 있습니다. 계정에 4.20 QORT 이상이 있으면 Q-Chat 메시지가 즉시 전송되며 이 대화 상자는 더 이상 표시되지 않습니다. 이 필요한 스팸 방지 방법에 대해 이해해 주셔서 감사합니다. Qortal을 즐기시기 바랍니다!",
"cchange41": "잔액이 4 QORT 미만입니다.",
"cchange42": "스팸 방지를 위해 잔액이 4 QORT 미만인 계정은 Q-Chat에서 메시지를 보내는 데 시간이 오래 걸립니다. Q-Chat 메시지 전송 속도를 즉시 높이려면 4 이상을 얻으십시오. 귀하의 주소로 QORT. 이것은 Trade Portal에서 거래하거나 QORT를 제공하는 다른 Qortian을 통해 수행할 수 있습니다. 계정에 4 QORT 이상이 있으면 Q-Chat 메시지가 즉시 전송되며 이 대화 상자는 더 이상 표시되지 않습니다. 이 필요한 스팸 방지 방법에 대해 이해해 주셔서 감사합니다. Qortal을 즐기시기 바랍니다!",
"cchange43": "QORT 팁",
"cchange44": "메시지 보내기",
"cchange45": "팁 사용자",
@ -897,7 +963,9 @@
"nchange29": "민팅 계정이 제거되었습니다!",
"nchange30": "민팅 계정을 제거하지 못했습니다!",
"nchange31": "노드 중지",
"nchange32": "중지 요청을 성공적으로 전송했습니다.!"
"nchange32": "중지 요청을 성공적으로 전송했습니다.!",
"nchange33": "노드 재시작",
"nchange34": "다시 시작 요청을 성공적으로 보냈습니다!"
},
"transpage": {
"tchange1": "거래요청",
@ -978,7 +1046,9 @@
"exp18": "결제",
"exp19": "보냈습니다",
"exp20": "수신됨",
"exp21": "거래"
"exp21": "거래",
"exp22": "마지막 5회 결제",
"exp23": "모든 결제 보기"
},
"managegroup": {
"mg1": "그룹 구성원",
@ -1059,6 +1129,8 @@
"inf13": "자동 구매",
"inf14": "와 함께",
"inf15": "활성 자동 구매 주문",
"inf16": "자동 구매"
"inf16": "자동 구매",
"inf17": "밝은 테마로 전환",
"inf18": "어두운 테마로 전환"
}
}

View File

@ -18,7 +18,8 @@
"russian": "Russisk",
"norwegian": "Norsk",
"romanian": "Rumensk",
"korean": "Koreansk"
"korean": "Koreansk",
"japanese": "Japansk"
},
"sidemenu": {
"minting": "UTBYTTE",
@ -41,6 +42,45 @@
"sm2": "NAVNEBEHANDLING",
"sm3": "NAMES MARKET"
},
"tabmenu": {
"tm1": "Pregedetaljer",
"tm2": "Bli mynter",
"tm3": "Sponsorliste",
"tm4": "Lommebøker",
"tm5": "Handelsportal",
"tm6": "Autokjøp",
"tm7": "Belønningsdeling",
"tm8": "Q-Chat",
"tm9": "Navneregistrering",
"tm10": "Navnmarked",
"tm11": "Nettsteder",
"tm12": "Q-Apps",
"tm13": "Gruppeadministrasjon",
"tm14": "Databehandling",
"tm15": "Puslespill",
"tm16": "Nodeadministrasjon",
"tm17": "Ny fane",
"tm18": "Legg til ny fane",
"tm19": "Legg til ny plugin",
"tm20": "Q-App",
"tm21": "Nettsted",
"tm22": "Fjern plugin",
"tm23": "Er du sikker på at du vil fjerne denne plugin?",
"tm24": "Plugin Type:",
"tm25": "Vennligst velg en plugin-type !",
"tm26": "Legg til ny plugin til menyen",
"tm27": "Fjern plugin fra menyen",
"tm28": "Oversiktsside",
"tm29": "Tilbakestill fanemenyen",
"tm30": "Søk etter Qortal-navn",
"tm31": "Mine fulgte navn",
"tm32": "Denne kontoen følger ikke noen bruker",
"tm33": "Importer meny",
"tm34": "Eksporter fanemeny",
"tm35": "Din eksisterende fanemeny vil bli slettet og satt til opplastet fanemeny.",
"tm36": "Fanemenyen ble gjenopprettet",
"tm37": "Fanemeny ble lagret som"
},
"login": {
"login": "Logg på",
"createaccount": "Opprett konto",
@ -50,7 +90,7 @@
"youraccounts": "Dine kontoer",
"clickto": "Klikk på kontoen din for å logge på",
"needcreate": "Du må opprette eller lagre en konto før du kan logge på!",
"upload": "Last opp din qortal-backup",
"upload": "Last opp din Qortal-backup",
"howlogin": "Hvordan vil du logge på?",
"seed": "Minnefrase (seedphrase)",
"seedphrase": "minnefrase (seedphrase)",
@ -86,7 +126,29 @@
"created1": "Kontoen din er nå opprettet",
"created2": " og vil bli lagret i denne nettleseren.",
"downloadbackup": "Last ned backup-fil for lommebok",
"passwordhint": "Et passord må være på minst 8 tegn."
"passwordhint": "Et passord må være på minst 8 tegn.",
"lp1": "Lås skjerm",
"lp2": "Ingen passord for låseskjerm er angitt!",
"lp3": "Vennligst sett en",
"lp4": "Nei takk",
"lp5": "Angi passord",
"lp6": "Nytt passord for skjermlås er angitt !",
"lp7": "LÅS OP",
"lp8": "Feil: Feil passord",
"lp9": "IS",
"lp10": "LÅST",
"lp11": "OPPLÅST",
"lp12": "Dekoding av lagrede data",
"lp13": "Genererer dekrypteringsnøkkel",
"lp14": "Sjekker nøkkel",
"lp15": "Feil passord",
"lp16": "Dekrypterer",
"lp17": "Venter på at arbeiderne skal være klare",
"lp18": "Avlede nøkkeldeler",
"lp19": "Feil, feil nøkkel. ",
"lp20": "Feil, feil ikke",
"lp21": "Kombinere nøkkeldeler",
"lp22": "Nøkkelen er klar"
},
"logout": {
"logout": "LOGG AV",
@ -148,7 +210,11 @@
},
"walletprofile": {
"minterlevel": "Minternivå",
"blocksminted": "Antall blokker mintet"
"blocksminted": "Antall blokker mintet",
"wp1": "Minting",
"wp2": "Ikke preging",
"wp3": "Kjerneinformasjon",
"wp4": "Synkronisert"
},
"general": {
"yes": "Ja",
@ -435,7 +501,7 @@
"nchange35": "DU HAR ET NAVN!",
"nchange36": "Bare kontoer uten registrert navn kan kjøpe et navn.",
"nchange37": "OBS!",
"nchange38": "Du har ikke nok qort til å kjøpe dette navnet.",
"nchange38": "Du har ikke nok QORT til å kjøpe dette navnet.",
"nchange39": "Er du sikker på å kjøpe dette navnet?",
"nchange40": "Når du trykker bekreft, vil forespørselen om kjøpsnavn bli sendt!",
"nchange41": "Gammelt navn",
@ -493,13 +559,13 @@
"schange7": "Publisert av",
"schange8": "Handlinger",
"schange9": "Q-Apps",
"schange10": "Ingen q-apps tilgjengelig",
"schange10": "Ingen Q-Apps tilgjengelig",
"schange11": "Dine fulgte Q-Apps",
"schange12": "Følgte Q-Apps",
"schange13": "Du følger ingen q-apps",
"schange13": "Du følger ingen Q-Apps",
"schange14": "Dine blokkerte Q-Apps",
"schange15": "Blokkerte Q-apper",
"schange16": "Du har ikke blokkert noen q-apps",
"schange16": "Du har ikke blokkert noen Q-Apps",
"schange17": "Navnet ble ikke funnet!",
"schange18": "Relémodus er aktivert. Dette betyr at noden din vil hjelpe til med å transportere krypterte data rundt i nettverket når en peer ber om det. Du kan velge bort ved å stille inn",
"schange19": "i",
@ -537,13 +603,13 @@
"schange7": "Publisert av",
"schange8": "Handlinger",
"schange9": "Q-Tubes",
"schange10": "Ingen q-tubes tilgjengelig",
"schange10": "Ingen Q-Tubes tilgjengelig",
"schange11": "Dine fulgte Q-Tubes",
"schange12": "Følgte Q-Tubes",
"schange13": "Du følger ingen q-tubes",
"schange13": "Du følger ingen Q-Tubes",
"schange14": "Dine blokkerte Q-Tubes",
"schange15": "Blokkerte Q-Tubes",
"schange16": "Du har ikke blokkert noen q-tubes",
"schange16": "Du har ikke blokkert noen Q-Tubes",
"schange17": "Navnet ble ikke funnet!",
"schange18": "Relémodus er aktivert. Dette betyr at noden din vil hjelpe til med å transportere krypterte data rundt i nettverket når en peer ber om det. Du kan velge bort ved å stille inn",
"schange19": "i",
@ -711,8 +777,8 @@
"cchange38": "Bruker bekreftet",
"cchange39": "Kan ikke sende en kryptert melding til denne brukeren siden de ikke har sin offentlige nøkkel på kjede.",
"cchange40": "BILDE (klikk for å se)",
"cchange41": "Saldoen din er under 4,20 QORT",
"cchange42": "Av behovet for å bekjempe spam, vil kontoer med under 4.20 Qort-saldo bruke lang tid på å SENDE meldinger i Q-Chat. Hvis du umiddelbart ønsker å øke sendehastigheten for Q-Chat-meldinger, få over 4.20 QORT til adressen din. Dette kan gjøres med handler i handelsportalen, eller ved at en annen Qortian gir deg QORT. Når du har over 4,20 QORT på kontoen din, vil Q-Chat-meldinger være øyeblikkelig og denne dialogen vil ikke lenger show. Takk for at du forstår denne nødvendige spamforebyggingsmetoden, og vi håper du liker Qortal!",
"cchange41": "Saldoen din er under 4 QORT",
"cchange42": "Av behovet for å bekjempe spam, vil kontoer med under 4 Qort-saldo bruke lang tid på å SENDE meldinger i Q-Chat. Hvis du umiddelbart ønsker å øke sendehastigheten for Q-Chat-meldinger, få over 4 QORT til adressen din. Dette kan gjøres med handler i handelsportalen, eller ved at en annen Qortian gir deg QORT. Når du har over 4 QORT på kontoen din, vil Q-Chat-meldinger være øyeblikkelig og denne dialogen vil ikke lenger show. Takk for at du forstår denne nødvendige spamforebyggingsmetoden, og vi håper du liker Qortal!",
"cchange43": "Tips QORT til",
"cchange44": "SEND MELDING",
"cchange45": "TIPS BRUKER",
@ -897,7 +963,9 @@
"nchange29": "Mintekontoen ble fjernet!",
"nchange30": "Kunne ikke fjerne mintekontoen!",
"nchange31": "Stopp noden",
"nchange32": "Stoppforespørsel sendt!"
"nchange32": "Stoppforespørsel sendt!",
"nchange33": "Omstart noden",
"nchange34": "Omstartsforespørsel sendt!"
},
"transpage": {
"tchange1": "Transaksjonsforespørsel",
@ -978,7 +1046,9 @@
"exp18": "Betalinger",
"exp19": "Sendt",
"exp20": "Motta",
"exp21": "Handler"
"exp21": "Handler",
"exp22": "SISTE 5 BETALINGER",
"exp23": "Vis alle betalinger"
},
"managegroup": {
"mg1": "Gruppemedlemmer",
@ -1059,6 +1129,8 @@
"inf13": "Kjøp automatisk",
"inf14": "med",
"inf15": "Aktive automatiske kjøpsordrer",
"inf16": "Autokjøp"
"inf16": "Autokjøp",
"inf17": "Bytt til lystema",
"inf18": "Bytt til mørkt tema"
}
}

View File

@ -18,7 +18,8 @@
"russian": "Rosyjski",
"norwegian": "Norweski",
"romanian": "Rumuński",
"korean": "Koreański"
"korean": "Koreański",
"japanese": "Japoński"
},
"sidemenu": {
"minting": "BICIE",
@ -41,6 +42,45 @@
"sm2": "ZARZĄDZANIE NAZWAMI",
"sm3": "RYNEK NAZW"
},
"tabmenu": {
"tm1": "Szczegóły bicia",
"tm2": "Zostań Mincerzem",
"tm3": "Lista sponsorów",
"tm4": "Portfele",
"tm5": "Portal handlowy",
"tm6": "Automatyczny zakup",
"tm7": "Podział nagrody",
"tm8": "Q-czat",
"tm9": "Rejestracja nazwy",
"tm10": "Rynek nazw",
"tm11": "Strony internetowe",
"tm12": "Q-Aplikacje",
"tm13": "Zarządzanie grupą",
"tm14": "Zarządzanie danymi",
"tm15": "Zagadki",
"tm16": "Zarządzanie węzłami",
"tm17": "Nowa karta",
"tm18": "Dodaj nową kartę",
"tm19": "Dodaj nową wtyczkę",
"tm20": "Q-Aplikacja",
"tm21": "Strona internetowa",
"tm22": "Usuń wtyczkę",
"tm23": "Czy na pewno chcesz usunąć tę wtyczkę?",
"tm24": "Typ wtyczki:",
"tm25": "Proszę wybrać typ wtyczki!",
"tm26": "Dodaj nową wtyczkę do menu",
"tm27": "Usuń wtyczkę z menu",
"tm28": "Strona przeglądu",
"tm29": "Menu zakładki Resetuj",
"tm30": "Wyszukaj nazwę kwartalu",
"tm31": "Moje obserwowane nazwy",
"tm32": "To konto nie obserwuje żadnego użytkownika",
"tm33": "Menu zakładki Importuj",
"tm34": "Menu zakładki Eksportuj",
"tm35": "Twoje istniejące menu kart zostanie usunięte i ustawione na przesłane menu kart.",
"tm36": "Menu zakładki pomyślnie przywrócone",
"tm37": "Menu zakładki pomyślnie zapisane jako"
},
"login": {
"login": "Zaloguj się",
"createaccount": "Utwórz konto",
@ -86,7 +126,29 @@
"created1": "Twoje konto zostało utworzone",
"created2": " i zostanie zapisane w tej przeglądarce.",
"downloadbackup": "Pobierz plik kopii zapasowej portfela",
"passwordhint": "Hasło musi mieć co najmniej 8 znaków."
"passwordhint": "Hasło musi mieć co najmniej 8 znaków.",
"lp1": "Ekran blokady",
"lp2": "Nie ustawiono hasła blokady ekranu!",
"lp3": "Proszę ustawić jeden",
"lp4": "Nie, dziękuję",
"lp5": "Ustaw hasło",
"lp6": "Nowe hasło blokady ekranu zostało pomyślnie ustawione!",
"lp7": "ODBLOKUJ",
"lp8": "Błąd: Niepoprawne hasło",
"lp9": "IS",
"lp10": "ZABLOKOWANY",
"lp11": "ODBLOKOWANY",
"lp12": "Dekodowanie zapisanych danych",
"lp13": "Generowanie klucza deszyfrującego",
"lp14": "Sprawdzanie klucza",
"lp15": "Nieprawidłowe hasło",
"lp16": "Odszyfrowywanie",
"lp17": "Oczekiwanie na gotowość pracowników",
"lp18": "Wyprowadzanie kluczowych części",
"lp19": "Błąd, nieprawidłowy klucz. ",
"lp20": "Błąd, niepoprawna wartość jednorazowa",
"lp21": "Łączenie kluczowych części",
"lp22": "Klucz jest gotowy"
},
"logout": {
"logout": "WYLOGUJ",
@ -148,7 +210,11 @@
},
"walletprofile": {
"minterlevel": "Poziom Mintera",
"blocksminted": "Bloki Zmintowane"
"blocksminted": "Bloki Zmintowane",
"wp1": "Bicie",
"wp2": "Nie bije",
"wp3": "Podstawowe informacje",
"wp4": "Zsynchronizowany"
},
"general": {
"yes": "Tak",
@ -435,7 +501,7 @@
"nchange35": "MASZ IMIĘ!",
"nchange36": "Tylko konta bez zarejestrowanej nazwy mogą kupić nazwę.",
"nchange37": "UWAGA!",
"nchange38": "Nie masz wystarczającej ilości qort, aby kupić tę nazwę.",
"nchange38": "Nie masz wystarczającej ilości QORT, aby kupić tę nazwę.",
"nchange39": "Czy na pewno kupisz tę nazwę?",
"nchange40": "Po naciśnięciu potwierdzenia, prośba o nazwę kupna zostanie wysłana!",
"nchange41": "Stara nazwa",
@ -493,13 +559,13 @@
"schange7": "Opublikowane przez",
"schange8": "Akcje",
"schange9": "Q-Apps",
"schange10": "Brak dostępnych q-apps",
"schange10": "Brak dostępnych Q-Apps",
"schange11": "Twoje obserwowane Q-Apps",
"schange12": "Obserwowane Q-Apps",
"schange13": "Nie obserwujesz żadnych q-apps",
"schange13": "Nie obserwujesz żadnych Q-Apps",
"schange14": "Twoje zablokowane Q-Apps",
"schange15": "Zablokowane Q-Apps",
"schange16": "Nie zablokowałeś żadnych q-apps",
"schange16": "Nie zablokowałeś żadnych Q-Apps",
"schange17": "Nie znaleziono nazwy!",
"schange18": "Tryb przekazywania jest włączony. Oznacza to, że twój węzeł pomoże w transporcie zaszyfrowanych danych w sieci, gdy zażąda tego peer. Możesz zrezygnować, ustawiając",
"schange19": "w",
@ -537,13 +603,13 @@
"schange7": "Opublikowane przez",
"schange8": "Akcje",
"schange9": "Q-Tubes",
"schange10": "Brak dostępnych q-tubes",
"schange10": "Brak dostępnych Q-Tubes",
"schange11": "Twoje obserwowane Q-Tubes",
"schange12": "Obserwowano Q-Tubes",
"schange13": "Nie obserwujesz żadnych q-tubes",
"schange13": "Nie obserwujesz żadnych Q-Tubes",
"schange14": "Twoje zablokowane Q-Tubes",
"schange15": "Zablokowane Q-Tubes",
"schange16": "Nie zablokowałeś żadnych q-tubes",
"schange16": "Nie zablokowałeś żadnych Q-Tubes",
"schange17": "Nie znaleziono nazwy!",
"schange18": "Tryb przekazywania jest włączony. Oznacza to, że twój węzeł pomoże w transporcie zaszyfrowanych danych w sieci, gdy zażąda tego peer. Możesz zrezygnować, ustawiając",
"schange19": "w",
@ -711,8 +777,8 @@
"cchange38": "Zweryfikowany przez użytkownika",
"cchange39": "Nie można wysłać zaszyfrowanej wiadomości do tego użytkownika, ponieważ nie ma on swojego klucza publicznego w łańcuchu.",
"cchange40": "OBRAZ (kliknij, aby wyświetlić)",
"cchange41": "Twoje saldo jest poniżej 4,20 QORT",
"cchange42": "Ze względu na konieczność zwalczania spamu konta z saldem poniżej 4,20 Qort będą potrzebowały dużo czasu na WYSYŁANIE wiadomości w Q-Chat. Jeśli chcesz natychmiast zwiększyć prędkość wysyłania wiadomości Q-Chat, uzyskaj ponad 4,20 QORT na Twój adres. Można to zrobić za pomocą transakcji w Portalu handlowym lub za pośrednictwem innego Qortian, który przekaże Ci QORT. Gdy masz ponad 4,20 QORT na swoim koncie, wiadomości Q-Chat będą natychmiastowe i to okno dialogowe nie będzie już więcej pokaż. Dziękujemy za zrozumienie tej niezbędnej metody zapobiegania spamowi i mamy nadzieję, że spodoba ci się Qortal!",
"cchange41": "Twoje saldo jest poniżej 4 QORT",
"cchange42": "Ze względu na konieczność zwalczania spamu konta z saldem poniżej 4 QORT będą potrzebowały dużo czasu na WYSYŁANIE wiadomości w Q-Chat. Jeśli chcesz natychmiast zwiększyć prędkość wysyłania wiadomości Q-Chat, uzyskaj ponad 4 QORT na Twój adres. Można to zrobić za pomocą transakcji w Portalu handlowym lub za pośrednictwem innego Qortian, który przekaże Ci QORT. Gdy masz ponad 4 QORT na swoim koncie, wiadomości Q-Chat będą natychmiastowe i to okno dialogowe nie będzie już więcej pokaż. Dziękujemy za zrozumienie tej niezbędnej metody zapobiegania spamowi i mamy nadzieję, że spodoba ci się Qortal!",
"cchange43": "Przekaż QORT do",
"cchange44": "WYŚLIJ WIADOMOŚĆ",
"cchange45": "WSKAZÓWKA UŻYTKOWNIKA",
@ -897,7 +963,9 @@
"nchange29": "Pomyślnie usunięto konto mintowania!",
"nchange30": "Nie udało się usunąć konta mintowania!",
"nchange31": "Zatrzymaj węzeł",
"nchange32": "Pomyślnie wysłane żądanie zatrzymania!"
"nchange32": "Pomyślnie wysłane żądanie zatrzymania!",
"nchange33": "Uruchom ponownie węzeł",
"nchange34": "Pomyślnie wysłane żądanie ponownego uruchomienia!"
},
"transpage": {
"tchange1": "Żądanie transakcji",
@ -978,7 +1046,9 @@
"exp18": "Płatności",
"exp19": "Wysłane",
"exp20": "Otrzymano",
"exp21": "Transakcji"
"exp21": "Transakcji",
"exp22": "OSTATNIE 5 PŁATNOŚCI",
"exp23": "Pokaż wszystkie płatności"
},
"managegroup": {
"mg1": "Członkowie grupy",
@ -1059,6 +1129,8 @@
"inf13": "Kup automatycznie",
"inf14": "z",
"inf15": "Aktywne automatyczne zamówienia zakupu",
"inf16": "Automatyczny zakup"
"inf16": "Automatyczny zakup",
"inf17": "Przełącz na jasny motyw",
"inf18": "Przełącz na ciemny motyw"
}
}

View File

@ -18,7 +18,8 @@
"russian": "Russo",
"norwegian": "Norueguês",
"romanian": "Romeno",
"korean": "Coreano"
"korean": "Coreano",
"japanese": "Japonês"
},
"sidemenu": {
"minting": "CARTEIRA",
@ -41,6 +42,45 @@
"sm2": "GESTÃO DE NOME",
"sm3": "MERCADO DE NOMES"
},
"tabmenu": {
"tm1": "Detalhes de cunhagem",
"tm2": "Torne-se um Minter",
"tm3": "Lista de Patrocínios",
"tm4": "Carteiras",
"tm5": "Portal Comercial",
"tm6": "Compra automática",
"tm7": "Recompensa",
"tm8": "Q-Chat",
"tm9": "Registro de Nome",
"tm10": "Mercado de Nomes",
"tm11": "Sites",
"tm12": "Q-Apps",
"tm13": "Gestão de Grupo",
"tm14": "Gerenciamento de dados",
"tm15": "Quebra-cabeças",
"tm16": "Gerenciamento de nós",
"tm17": "Nova guia",
"tm18": "Adicionar nova guia",
"tm19": "Adicionar novo plug-in",
"tm20": "Q-App",
"tm21": "Site",
"tm22": "Remover plug-in",
"tm23": "Tem certeza que deseja remover este plugin?",
"tm24": "Tipo de plug-in:",
"tm25": "Por favor, selecione um tipo de plugin!",
"tm26": "Adicionar novo plug-in ao menu",
"tm27": "Remover plug-in do menu",
"tm28": "Página de visão geral",
"tm29": "Redefinir menu da guia",
"tm30": "Pesquisar Nome Qortal",
"tm31": "Meus nomes seguidos",
"tm32": "Esta conta não segue nenhum usuário",
"tm33": "Menu da Aba Importar",
"tm34": "Menu da guia Exportar",
"tm35": "Seu menu de guia existente será excluído e definido como menu de guia carregado.",
"tm36": "Menu de abas restaurado com sucesso",
"tm37": "Menu da guia salvo com sucesso como"
},
"login": {
"login": "Login",
"createaccount": "Criar Conta",
@ -86,7 +126,29 @@
"created1": "Sua conta foi Criada",
"created2": "e será salva neste navegador.",
"downloadbackup": "Baixe o Arquivo BackUp da Carteira",
"passwordhint": "Uma senha deve ter pelo menos 8 caracteres."
"passwordhint": "Uma senha deve ter pelo menos 8 caracteres.",
"lp1": "Tela de bloqueio",
"lp2": "Nenhuma senha de tela de bloqueio foi definida!",
"lp3": "Defina um",
"lp4": "Não, obrigado",
"lp5": "Definir senha",
"lp6": "Nova senha de bloqueio de tela definida com sucesso!",
"lp7": "DESBLOQUEAR",
"lp8": "Erro: senha incorreta",
"lp9": "É",
"lp10": "BLOQUEADO",
"lp11": "DESBLOQUEADO",
"lp12": "Decodificando dados salvos",
"lp13": "Gerando chave de descriptografia",
"lp14": "Verificando chave",
"lp15": "Senha incorreta",
"lp16": "Descriptografando",
"lp17": "Esperando que os trabalhadores estejam prontos",
"lp18": "Derivando peças-chave",
"lp19": "Erro, chave incorreta. ",
"lp20": "Erro, nonce incorreto",
"lp21": "Combinando partes principais",
"lp22": "A chave está pronta"
},
"logout": {
"logout": "SAIR",
@ -148,7 +210,11 @@
},
"walletprofile": {
"minterlevel": "Nível do Minerador",
"blocksminted": "Blocos Minerados"
"blocksminted": "Blocos Minerados",
"wp1": "Criação",
"wp2": "Não está cunhando",
"wp3": "Informações essenciais",
"wp4": "Sincronizado"
},
"general": {
"yes": "Sim",
@ -435,7 +501,7 @@
"nchange35": "VOCÊ TEM UM NOME!",
"nchange36": "Apenas contas sem nome registrado podem comprar um nome.",
"nchange37": "ATENÇÃO!",
"nchange38": "Você não tem qort suficiente para comprar este nome.",
"nchange38": "Você não tem QORT suficiente para comprar este nome.",
"nchange39": "Tem certeza que deseja comprar este nome ?",
"nchange40": "Ao pressionar confirmar, a solicitação do nome de compra será enviada!",
"nchange41": "Nome antigo",
@ -493,13 +559,13 @@
"schange7": "Publicado por",
"schange8": "Ações",
"schange9": "Q-Apps",
"schange10": "Nenhum q-apps disponível",
"schange10": "Nenhum Q-Apps disponível",
"schange11": "Seus Q-Apps seguidos",
"schange12": "Q-Apps seguidos",
"schange13": "Você não está seguindo nenhum q-apps",
"schange13": "Você não está seguindo nenhum Q-Apps",
"schange14": "Seus Q-Apps bloqueados",
"schange15": "Q-Apps bloqueados",
"schange16": "Você não bloqueou nenhum q-apps",
"schange16": "Você não bloqueou nenhum Q-Apps",
"schange17": "Nome não encontrado!",
"schange18": "O modo de retransmissão está ativado. Isso significa que seu nó ajudará a transportar dados criptografados pela rede quando um par solicitar. Você pode optar por não configurar",
"schange19": "em",
@ -537,13 +603,13 @@
"schange7": "Publicado por",
"schange8": "Ações",
"schange9": "Q-Tubes",
"schange10": "Nenhum q-tubes disponível",
"schange10": "Nenhum Q-Tubes disponível",
"schange11": "Seus Q-Tubes seguidos",
"schange12": "Q-Tubes seguidos",
"schange13": "Você não está seguindo nenhum q-tubes",
"schange13": "Você não está seguindo nenhum Q-Tubes",
"schange14": "Seus Q-Tubes bloqueados",
"schange15": "Q-Tubes bloqueados",
"schange16": "Você não bloqueou nenhum q-tubes",
"schange16": "Você não bloqueou nenhum Q-Tubes",
"schange17": "Nome não encontrado!",
"schange18": "O modo de retransmissão está ativado. Isso significa que seu nó ajudará a transportar dados criptografados pela rede quando um ponto solicitar. Você pode optar por não configurar",
"schange19": "em",
@ -711,8 +777,8 @@
"cchange38": "Verificado pelo usuário",
"cchange39": "Não é possível enviar uma mensagem criptografada para este usuário, pois ele não possui sua chave pública na cadeia.",
"cchange40": "IMAGEM (clique para ver)",
"cchange41": "Seu saldo está abaixo de 4,20 QORT",
"cchange42": "Por necessidade de combater o spam, contas com saldo abaixo de 4,20 Qort levarão muito tempo para ENVIAR mensagens no Q-Chat. Se você deseja aumentar imediatamente a velocidade de envio de mensagens do Q-Chat, obtenha acima de 4,20 QORT para o seu endereço. Isso pode ser feito com negociações no Portal de Negociações, ou por meio de outro Qortian que lhe forneça o QORT. Assim que você tiver mais de 4,20 QORT em sua conta, as mensagens do Q-Chat serão instantâneas e esta caixa de diálogo não será mais show. Obrigado por sua compreensão deste método necessário de prevenção de spam e esperamos que você goste do Qortal!",
"cchange41": "Seu saldo está abaixo de 4 QORT",
"cchange42": "Por necessidade de combater o spam, contas com saldo abaixo de 4 QORT levarão muito tempo para ENVIAR mensagens no Q-Chat. Se você deseja aumentar imediatamente a velocidade de envio de mensagens do Q-Chat, obtenha acima de 4 QORT para o seu endereço. Isso pode ser feito com negociações no Portal de Negociações, ou por meio de outro Qortian que lhe forneça o QORT. Assim que você tiver mais de 4 QORT em sua conta, as mensagens do Q-Chat serão instantâneas e esta caixa de diálogo não será mais show. Obrigado por sua compreensão deste método necessário de prevenção de spam e esperamos que você goste do Qortal!",
"cchange43": "Dica QORT para",
"cchange44": "ENVIAR MENSAGEM",
"cchange45": "DICA DE USUÁRIO",
@ -897,7 +963,9 @@
"nchange29": "Conta de Mineração removida com sucesso!",
"nchange30": "Falha em remover a conta de mineração",
"nchange31": "Parar Nódulo",
"nchange32": "Pedido de parada enviado com sucesso!"
"nchange32": "Pedido de parada enviado com sucesso!",
"nchange33": "Reiniciar Nódulo",
"nchange34": "Pedido de reinicialização enviado com sucesso!"
},
"transpage": {
"tchange1": "Pedido de transação",
@ -978,7 +1046,9 @@
"exp18": "Pagamentos",
"exp19": "Enviado",
"exp20": "Recebido",
"exp21": "Comércios"
"exp21": "Comércios",
"exp22": "ÚLTIMOS 5 PAGAMENTOS",
"exp23": "Mostrar todos os pagamentos"
},
"managegroup": {
"mg1": "Membros do grupo",
@ -1059,6 +1129,8 @@
"inf13": "Comprar automaticamente",
"inf14": "com",
"inf15": "Ordens de compra automática ativas",
"inf16": "Compra automática"
"inf16": "Compra automática",
"inf17": "Mudar para tema claro",
"inf18": "Mudar para o tema escuro"
}
}

View File

@ -18,7 +18,8 @@
"russian": "Rus",
"norwegian": "Norvegiana",
"romanian": "Romana",
"korean": "Coreeana"
"korean": "Coreeana",
"japanese": "Japonez"
},
"sidemenu": {
"minting": "MONTAREA",
@ -41,6 +42,45 @@
"sm2": "GESTIONAREA NUMELE",
"sm3": "PIAȚA NUMELOR"
},
"tabmenu": {
"tm1": "Detalii de batere",
"tm2": "Deveniți un Minter",
"tm3": "Lista de sponsorizări",
"tm4": "Portofele",
"tm5": "Portal comercial",
"tm6": "Cumpărare automată",
"tm7": "Partajarea recompensei",
"tm8": "Q-Chat",
"tm9": "Înregistrare nume",
"tm10": "Piata de nume",
"tm11": "Site-uri web",
"tm12": "Q-Apps",
"tm13": "Gestionarea grupului",
"tm14": "Gestionarea datelor",
"tm15": "Puzzle-uri",
"tm16": "Gestionarea nodurilor",
"tm17": "Filă nouă",
"tm18": "Adăugați o filă nouă",
"tm19": "Adăugați un plugin nou",
"tm20": "Q-App",
"tm21": "Site web",
"tm22": "Elimină pluginul",
"tm23": "Sunteți sigur că veți elimina acest plugin?",
"tm24": "Tip de plugin:",
"tm25": "Vă rugăm să selectați un tip de plugin !",
"tm26": "Adăugați un nou plugin la meniu",
"tm27": "Eliminați pluginul din meniu",
"tm28": "Pagina de pornire",
"tm29": "Resetează meniul filei",
"tm30": "Căutați numele Qortal",
"tm31": "Numele mele urmărite",
"tm32": "Acest cont nu urmărește niciun utilizator",
"tm33": "Meniu Filă Import",
"tm34": "Meniu File Export",
"tm35": "Meniul de file existent va fi șters și setat la meniul de file încărcat.",
"tm36": "Meniul Tab a fost restaurat cu succes",
"tm37": "Meniul Tab a fost salvat cu succes ca"
},
"login": {
"login": "Login",
"createaccount": "Creare Cont",
@ -50,7 +90,7 @@
"youraccounts": "Conturile tale",
"clickto": "Fa click pe Contul tau pentru a te conecta cu el",
"needcreate": "Trebuie sa iti creezi sau sa salvezi un cont inainte de a te conecta!",
"upload": "Urca copia de siguranta qortal",
"upload": "Urca copia de siguranta Qortal",
"howlogin": "Cum doresti sa te conectezi?",
"seed": "frazainitiala",
"seedphrase": "frazainitiala",
@ -86,7 +126,29 @@
"created1": "Contul tau este acum creat",
"created2": "si va fi salvat in acest browser.",
"downloadbackup": "Descarca copia de siguranta a Portofelului",
"passwordhint": "O parola trebuie sa aiba cel putin 8 caractere."
"passwordhint": "O parola trebuie sa aiba cel putin 8 caractere.",
"lp1": "Ecran de blocare",
"lp2": "Nu este setată nicio parolă pentru ecranul de blocare!",
"lp3": "Vă rugăm să setați unul",
"lp4": "Nu, mulțumesc",
"lp5": "Setați parola",
"lp6": "Noua parolă de blocare a ecranului setată cu succes !",
"lp7": "DEBLOCARE",
"lp8": "Eroare: parolă incorectă",
"lp9": "Este",
"lp10": "BLOCAT",
"lp11": "DEBLOCAT",
"lp12": "Decodificarea datelor salvate",
"lp13": "Se generează cheia de decriptare",
"lp14": "Se verifică cheia",
"lp15": "Parolă incorectă",
"lp16": "Decriptare",
"lp17": "Așteptăm ca lucrătorii să fie pregătiți",
"lp18": "Derivarea părților cheie",
"lp19": "Eroare, cheie incorectă. ",
"lp20": "Eroare, nonce incorect",
"lp21": "Combinarea părților cheie",
"lp22": "Cheia este gata"
},
"logout": {
"logout": "DECONECTARE",
@ -148,7 +210,11 @@
},
"walletprofile": {
"minterlevel": "Nivelul Minter-ului",
"blocksminted": "Blocuri descoperite"
"blocksminted": "Blocuri descoperite",
"wp1": "Battering",
"wp2": "Nu se bate",
"wp3": "Informații de bază",
"wp4": "Sincronizat"
},
"general": {
"yes": "Da",
@ -435,7 +501,7 @@
"nchange35": "AI UN NUME!",
"nchange36": "Numai conturile fără nume înregistrat pot cumpăra un nume.",
"nchange37": "ATENȚIE!",
"nchange38": "Nu aveți suficient qort pentru a cumpăra acest nume.",
"nchange38": "Nu aveți suficient QORT pentru a cumpăra acest nume.",
"nchange39": "Sunteți sigur că veți cumpăra acest nume?",
"nchange40": "La apăsarea confirmării, cererea de nume de cumpărare va fi trimisă!",
"nchange41": "Nume vechi",
@ -493,13 +559,13 @@
"schange7": "Publicat de",
"schange8": "Acțiuni",
"schange9": "Q-Apps",
"schange10": "Nu există q-apps disponibile",
"schange10": "Nu există Q-Apps disponibile",
"schange11": "Q-Apps urmărite",
"schange12": "Q-Apps urmărite",
"schange13": "Nu urmăriți nicio q-apps",
"schange13": "Nu urmăriți nicio Q-Apps",
"schange14": "Q-Apps dvs. blocate",
"schange15": "Q-Apps blocate",
"schange16": "Nu ați blocat nicio q-apps",
"schange16": "Nu ați blocat nicio Q-Apps",
"schange17": "Numele nu a fost găsit!",
"schange18": "Modul de retransmisie este activat. Aceasta înseamnă că nodul dvs. va ajuta la transportul datelor criptate în rețea atunci când un peer o solicită. Puteți renunța prin setare",
"schange19": "în",
@ -537,13 +603,13 @@
"schange7": "Publicat de",
"schange8": "Acțiuni",
"schange9": "Q-Tubes",
"schange10": "Nu există q-tubes disponibile",
"schange10": "Nu există Q-Tubes disponibile",
"schange11": "Q-Tubes urmărite",
"schange12": "Urmărite Q-Tubes",
"schange13": "Nu urmăriți niciun q-tubes",
"schange13": "Nu urmăriți niciun Q-Tubes",
"schange14": "Q-Tubes blocate",
"schange15": "Q-Tubes blocate",
"schange16": "Nu ați blocat niciun q-tubes",
"schange16": "Nu ați blocat niciun Q-Tubes",
"schange17": "Numele nu a fost găsit!",
"schange18": "Modul de retransmisie este activat. Aceasta înseamnă că nodul dvs. va ajuta la transportul datelor criptate în rețea atunci când un peer o solicită. Puteți renunța prin setare",
"schange19": "în",
@ -711,8 +777,8 @@
"cchange38": "Utilizator verificat",
"cchange39": "Nu se poate trimite un mesaj criptat acestui utilizator deoarece nu are cheia publică în lanț.",
"cchange40": "IMAGINE (click pentru a vizualiza)",
"cchange41": "Soldul dvs. este sub 4,20 QORT",
"cchange42": "Din nevoia de a combate spam-ul, conturile cu soldul Qort sub 4,20 va dura mult timp pentru a TRIMITE mesaje în Q-Chat. Dacă doriți să creșteți imediat viteza de trimitere a mesajelor Q-Chat, obțineți peste 4,20 QORT la adresa dvs. Acest lucru se poate face cu tranzacții în Portalul de comerț sau printr-un alt Qortian care vă oferă QORT. După ce aveți peste 4,20 QORT în contul dvs., mesajele Q-Chat vor fi instantanee și acest dialog nu va mai fi Vă mulțumim pentru înțelegerea acestei metode necesare de prevenire a spamului și sperăm să vă bucurați de Qortal!",
"cchange41": "Soldul dvs. este sub 4 QORT",
"cchange42": "Din nevoia de a combate spam-ul, conturile cu soldul QORT sub 4 va dura mult timp pentru a TRIMITE mesaje în Q-Chat. Dacă doriți să creșteți imediat viteza de trimitere a mesajelor Q-Chat, obțineți peste 4 QORT la adresa dvs. Acest lucru se poate face cu tranzacții în Portalul de comerț sau printr-un alt Qortian care vă oferă QORT. După ce aveți peste 4 QORT în contul dvs., mesajele Q-Chat vor fi instantanee și acest dialog nu va mai fi Vă mulțumim pentru înțelegerea acestei metode necesare de prevenire a spamului și sperăm să vă bucurați de Qortal!",
"cchange43": "Sfat QORT către",
"cchange44": "TRIMITĂ MESAJ",
"cchange45": "UTILIZATOR SFAT",
@ -897,7 +963,9 @@
"nchange29": "S-a eliminat cu succes contul de producator de moneda (minting)!",
"nchange30": "Nu a reusit eliminare contulului de recompensare (minting)!",
"nchange31": "Opreste Nodul",
"nchange32": "Cerere de Oprire Trimisa cu Succes!"
"nchange32": "Cerere de Oprire Trimisa cu Succes!",
"nchange33": "Reporniți Nodul",
"nchange34": "Cerere de Repornire a Fost Trimisă cu Succes!"
},
"transpage": {
"tchange1": "Cerere de tranzactionare",
@ -978,7 +1046,9 @@
"exp18": "Plăti",
"exp19": "Trimis",
"exp20": "Primit",
"exp21": "Meserii"
"exp21": "Meserii",
"exp22": "ULTIMELE 5 PĂȚI",
"exp23": "Afișați toate plățile"
},
"managegroup": {
"mg1": "Membrii grupului",
@ -1059,6 +1129,8 @@
"inf13": "Cumpărați automat",
"inf14": "cu",
"inf15": "Comenzi de cumpărare automată active",
"inf16": "Cumpărare automată"
"inf16": "Cumpărare automată",
"inf17": "Comutați la tema luminoasă",
"inf18": "Comutați la tema întunecată"
}
}

View File

@ -18,7 +18,8 @@
"russian": "Ruski",
"norwegian": "Norveški",
"romanian": "Rumunski",
"korean": "Korejski"
"korean": "Korejski",
"japanese": "Japanski"
},
"sidemenu": {
"minting": "KOVANJE",
@ -41,6 +42,45 @@
"sm2": "UPRAVLJANJE IMENOM",
"sm3": "TRŽIŠTE IMENA"
},
"tabmenu": {
"tm1": "Detalji kovanja",
"tm2": "Postani kovačnica",
"tm3": "Sponzorska lista",
"tm4": "Novčanici",
"tm5": "Trgovinski portal",
"tm6": "Automatska kupovina",
"tm7": "Deljenje nagrade",
"tm8": "Q-Chat",
"tm9": "Registracija imena",
"tm10": "Tržište imena",
"tm11": "Veb lokacije",
"tm12": "Q-Apps",
"tm13": "Upravljanje grupom",
"tm14": "Upravljanje podacima",
"tm15": "Zagonetke",
"tm16": "Upravljanje čvorovima",
"tm17": "Nova kartica",
"tm18": "Dodaj novu karticu",
"tm19": "Dodaj novi dodatak",
"tm20": "Q-App",
"tm21": "Veb lokacija",
"tm22": "Ukloni dodatak",
"tm23": "Da li ste sigurni da uklonite ovaj dodatak?",
"tm24": "Tip dodatka:",
"tm25": "Molimo izaberite tip dodatka!",
"tm26": "Dodaj novi dodatak u meni",
"tm27": "Ukloni dodatak iz menija",
"tm28": "Stranica sa pregledom",
"tm29": "Resetuj meni kartice",
"tm30": "Pretraži ime četvrta",
"tm31": "Moja praćena imena",
"tm32": "Ovaj nalog ne prati nijednog korisnika",
"tm33": "Meni kartice za uvoz",
"tm34": "Izvoz meni kartice",
"tm35": "Vaš postojeći meni kartica će biti obrisan i postavljen na meni za otpremljene kartice.",
"tm36": "Meni kartice je uspešno vraćen",
"tm37": "Meni kartice je uspešno sačuvan kao"
},
"login": {
"login": "Prijava",
"createaccount": "Napravi nalog",
@ -50,12 +90,12 @@
"youraccounts": "Tvoji nalozi",
"clickto": "Kliknite na nalog sa kojim želite da se prijavite",
"needcreate": "Morate napraviti ili sačuvati nalog pre mogućnosti prijavljivanja!",
"upload": "Ubacite vašu rezervnu kopiju qortala",
"upload": "Ubacite vašu rezervnu kopiju Qortala",
"howlogin": "Kako bi ste želeli da se prijavite?",
"seed": "Semenska fraza",
"seedphrase": "semenskafraza",
"saved": "Sačuvani nalog",
"qora": "Seme qora adrese",
"qora": "Seme Qora adrese",
"backup": "Rezervna kopija Qortal novčanika",
"decrypt": "Dešifrovanje rezervne kopije",
"save": "Sačuvajte u ovom pretraživaču.",
@ -86,7 +126,29 @@
"created1": "Vaš nalog je napravljen",
"created2": " i biće sačuvan u ovom pretraživaču.",
"downloadbackup": "Skinite Datoteku Rezervne kopije Novčanika",
"passwordhint": "Lozinka mora imati najmanje 8 znakova."
"passwordhint": "Lozinka mora imati najmanje 8 znakova.",
"lp1": "Zaključani ekran",
"lp2": "Lozinka za zaključavanje ekrana nije postavljena!",
"lp3": "Postavite jedan",
"lp4": "Ne hvala",
"lp5": "Postavi lozinku",
"lp6": "Nova lozinka za zaključavanje ekrana je uspešno postavljena!",
"lp7": "OTKLJUČAJ",
"lp8": "Greška: netačna lozinka",
"lp9": "IS",
"lp10": "ZAKLJUČAN",
"lp11": "OTKLJUČAN",
"lp12": "Dekodiranje sačuvanih podataka",
"lp13": "Generisanje ključa za dešifrovanje",
"lp14": "Provera ključa",
"lp15": "Netačna lozinka",
"lp16": "Dešifrovanje",
"lp17": "Čeka se da radnici budu spremni",
"lp18": "Izvođenje ključnih delova",
"lp19": "Greška, netačan ključ. ",
"lp20": "Greška, netačan nonce",
"lp21": "Kombinovanje ključnih delova",
"lp22": "Ključ je spreman"
},
"logout": {
"logout": "ODJAVA",
@ -148,7 +210,11 @@
},
"walletprofile": {
"minterlevel": "Novi Mintera",
"blocksminted": "Izmintovano Blokova"
"blocksminted": "Izmintovano Blokova",
"wp1": "Kovanje",
"wp2": "Ne kuje",
"wp3": "Osnovne informacije",
"wp4": "Sinhronizovano"
},
"general": {
"yes": "Da",
@ -493,13 +559,13 @@
"schange7": "Objavio",
"schange8": "Radnje",
"schange9": "Q-Apps",
"schange10": "Nema dostupnih q-apps",
"schange10": "Nema dostupnih Q-Apps",
"schange11": "Vaše praćene Q-Apps",
"schange12": "Praćene Q-Apps",
"schange13": "Ne pratite nijednu q-apps",
"schange13": "Ne pratite nijednu Q-Apps",
"schange14": "Vaše blokirane Q-Apps",
"schange15": "Blokirane Q-Apps",
"schange16": "Niste blokirali nijednu q-apps",
"schange16": "Niste blokirali nijednu Q-Apps",
"schange17": "Ime nije pronađeno!",
"schange18": "Relejni režim je omogućen. To znači da će vaš čvor pomoći da se šifrovane podatke transportuju po mreži kada kolega to zatraži. Možete isključiti podešavanjem",
"schange19": "u",
@ -537,13 +603,13 @@
"schange7": "Objavio",
"schange8": "Radnje",
"schange9": "Q-Tubes",
"schange10": "Nije dostupne q-tubes",
"schange10": "Nije dostupne Q-Tubes",
"schange11": "Vaše praćene Q-Tubes",
"schange12": "Praćene Q-Tubes",
"schange13": "Ne pratite nijednu q-tubes",
"schange13": "Ne pratite nijednu Q-Tubes",
"schange14": "Vaše blokirane Q-Tubes",
"schange15": "Blokirane Q-Tubes",
"schange16": "Niste blokirali nijednu q-tubes",
"schange16": "Niste blokirali nijednu Q-Tubes",
"schange17": "Ime nije pronađeno!",
"schange18": "Relejni režim je omogućen. To znači da će vaš čvor pomoći da se šifrovane podatke transportuju po mreži kada kolega to zatraži. Možete isključiti podešavanjem",
"schange19": "u",
@ -711,8 +777,8 @@
"cchange38": "Korisnik je verifikovan",
"cchange39": "Ne mogu poslati šifrovanu poruku ovom korisniku jer nemaju svoj javni ključ u lancu.",
"cchange40": "SLIKA (kliknite da vidite)",
"cchange41": "Vaše stanje je ispod 4,20 QORT",
"cchange42": "Iz potrebe za borbom protiv neželjene pošte, nalozima sa ispod 4.20 QORT saldo će trebati dosta vremena da ŠALJE poruke u K-Chat-u. Ako želite da odmah povećate brzinu slanja K-Chat poruka, nabavite preko 4,20 QORT na vašu adresu. Ovo se može uraditi sa trgovinama na Trgovačkom portalu ili putem drugog Qortian-a koji vam daje KORT. Kada budete imali preko 4,20 KORT na svom nalogu, Q-Chat poruke će biti trenutne i ovaj dijalog više neće biti shov. Hvala vam na razumevanju ovog neophodnog metoda prevencije neželjene pošte i nadamo se da ćete uživati u Qortal-u!",
"cchange41": "Vaše stanje je ispod 4 QORT",
"cchange42": "Iz potrebe za borbom protiv neželjene pošte, nalozima sa ispod 4 QORT saldo će trebati dosta vremena da ŠALJE poruke u Q-Chat-u. Ako želite da odmah povećate brzinu slanja Q-Chat poruka, nabavite preko 4 QORT na vašu adresu. Ovo se može uraditi sa trgovinama na Trgovačkom portalu ili putem drugog Qortian-a koji vam daje KORT. Kada budete imali preko 4 QORT na svom nalogu, Q-Chat poruke će biti trenutne i ovaj dijalog više neće biti shov. Hvala vam na razumevanju ovog neophodnog metoda prevencije neželjene pošte i nadamo se da ćete uživati u Qortal-u!",
"cchange43": "Savet za KORT",
"cchange44": "POŠALJI PORUKU",
"cchange45": "SAVET KORISNIKU",
@ -897,7 +963,9 @@
"nchange29": "Minting nalog uspešno uklonjen!",
"nchange30": "Minting nalog neuspešno uklonjen!",
"nchange31": "Zaustavite čvor",
"nchange32": "Zahtev za zaustavljanje uspešno poslat!"
"nchange32": "Zahtev za zaustavljanje uspešno poslat!",
"nchange33": "Ponovo pokreni čvor",
"nchange34": "Zahtev za ponovno pokretanje uspešno poslat!"
},
"transpage": {
"tchange1": "Zahtev za transakcijom",
@ -978,7 +1046,9 @@
"exp18": "Plaćanja",
"exp19": "Poslato",
"exp20": "Primljeno",
"exp21": "Trgovine"
"exp21": "Trgovine",
"exp22": "POSLEDNJIH 5 PLAĆANJA",
"exp23": "Prikaži sva plaćanja"
},
"managegroup": {
"mg1": "Članovi grupe",
@ -1055,10 +1125,12 @@
"inf9": "'Automatska kupovina' je funkcija koja omogućava postavljanje 'naloga za kupovinu' na Trgovačkom portalu. Ove 'naloge za kupovinu' vidi samo osoba koja ih postavlja. Oni nisu 'javni' nalozi za kupovinu kao 'prodaje na otvorenom tržištu' su i NE čuvaju se na Kortal blok-čejnu. Automatska kupovina je funkcija korisničkog interfejsa i kao takva zahteva da korisnički interfejs POKREĆE.",
"inf10": "Da biste postavili narudžbu za automatsku kupovinu, kliknite na dugme 'Dodaj narudžbu za automatsku kupovinu' i popunite polje koje se pojavi. Unesite IZNOS KORT-a koji želite da KUPITE i CENU do koje ste voljni da KUPITE. Jednom porudžbina je aktivna, Auto Bui će za vas kupiti DO te količine KORT-a, po DO ceni koju ste postavili (počevši od najnižeg reda i napredujući prema knjigama.)",
"inf11": "Jednostavno OSTAVITE SVOJ korisnički interfejs da radi i Auto Bui će uraditi ostalo, automatski!",
"inf12": "Možete da pretražujete druge dodatke u korisničkom interfejsu (K-Chat, novčanici, itd.), ali NE MOŽETE ZATVORITI UI ako želite da se vaša automatska kupovina završi. Ostavljanje korisničkog interfejsa 'minimiziranog' na 'traci zadataka' ili „panel“ je sasvim u redu, sve dok korisničko sučelje ostaje OTVORENO, Auto Bui će funkcionisati.",
"inf12": "Možete da pretražujete druge dodatke u korisničkom interfejsu (Q-Chat, novčanici, itd.), ali NE MOŽETE ZATVORITI UI ako želite da se vaša automatska kupovina završi. Ostavljanje korisničkog interfejsa 'minimiziranog' na 'traci zadataka' ili „panel“ je sasvim u redu, sve dok korisničko sučelje ostaje OTVORENO, Auto Bui će funkcionisati.",
"inf13": "Automatski kupi",
"inf14": "sa",
"inf15": "Aktivne porudžbine za automatsku kupovinu",
"inf16": "Automatska kupovina"
"inf16": "Automatska kupovina",
"inf17": "Prebaci na svetlu temu",
"inf18": "Prebaci na tamnu temu"
}
}

View File

@ -18,7 +18,8 @@
"russian": "Русский",
"norwegian": "Норвежский",
"romanian": "Румынский",
"korean": "Корейский"
"korean": "Корейский",
"japanese": "Японский"
},
"sidemenu": {
"minting": ЕКАНКA",
@ -41,6 +42,45 @@
"sm2": "УПРАВЛЕНИЕ ИМЕНАМИ",
"sm3": "РЫНОК ИМЕН"
},
"tabmenu": {
"tm1": "Детали чеканки",
"tm2": "Стать мастером",
"tm3": "Список спонсоров",
"tm4": "Кошельки",
"tm5": "Торговый портал",
"tm6": "Автопокупка",
"tm7": "Доля вознаграждения",
"tm8": "Q-чат",
"tm9": "Регистрация имени",
"tm10": "Рынок имен",
"tm11": "Веб-сайты",
"tm12": "Q-приложения",
"tm13": "Управление группой",
"tm14": "Управление данными",
"tm15": "Пазлы",
"tm16": "Управление узлом",
"tm17": "Новая вкладка",
"tm18": "Добавить новую вкладку",
"tm19": "Добавить новый плагин",
"tm20": "Q-приложение",
"tm21": "Веб-сайт",
"tm22": "Удалить плагин",
"tm23": "Вы действительно хотите удалить этот плагин?",
"tm24": "Тип плагина:",
"tm25": "Пожалуйста, выберите тип плагина!",
"tm26": "Добавить новый плагин в меню",
"tm27": "Удалить плагин из меню",
"tm28": "Страница обзора",
"tm29": "Меню вкладки Сброс",
"tm30": "Имя портала поиска",
"tm31": "Имена на которые я подписан",
"tm32": "Эта учетная запись не подписана ни на одного пользователя",
"tm33": "Меню вкладки Импорт",
"tm34": "Меню вкладки Экспорт",
"tm35": "Ваше существующее меню вкладок будет удалено и заменено загруженным меню вкладок.",
"tm36": "Меню вкладок успешно восстановлено",
"tm37": "Меню вкладок успешно сохранено как"
},
"login": {
"login": "Войти",
"createaccount": "Создать аккаунт",
@ -50,7 +90,7 @@
"youraccounts": "Ваши аккаунты",
"clickto": "Нажмите на свою учетную запись, чтобы войти с ее помощью",
"needcreate": "Вам необходимо создать или сохранить учетную запись, прежде чем вы сможете войти в нее!",
"upload": "Загрузить резервную копию вашего qortal",
"upload": "Загрузить резервную копию вашего Qortal",
"howlogin": "Как бы вы хотели войти?",
"seed": "Seed-фраза",
"seedphrase": "seed-фраза",
@ -86,7 +126,29 @@
"created1": "Ваша учетная запись создана",
"created2": "и будет сохранено в этом приложении.",
"downloadbackup": "Скачать файл резервной копии кошелька",
"passwordhint": "Пароль должен быть не менее 8 символов."
"passwordhint": "Пароль должен быть не менее 8 символов.",
"lp1": "Экран блокировки",
"lp2": "Пароль блокировки экрана не установлен!",
"lp3": "Пожалуйста, установите один",
"lp4": "Нет, спасибо",
"lp5": "Установить пароль",
"lp6": "Новый пароль блокировки экрана успешно установлен!",
"lp7": "РАЗБЛОКИРОВАТЬ",
"lp8": "Ошибка: неверный пароль",
"lp9": "ЕСТЬ",
"lp10": "БЛОКИРОВКА",
"lp11": "РАЗБЛОКИРОВАНО",
"lp12": "Декодирование сохраненных данных",
"lp13": "Генерация ключа расшифровки",
"lp14": "Проверка ключа",
"lp15": "Неверный пароль",
"lp16": "Расшифровка",
"lp17": "Ожидание готовности рабочих",
"lp18": "Извлечение ключевых частей",
"lp19": "Ошибка, неверный ключ. ",
"lp20": "Ошибка, неправильный одноразовый номер",
"lp21": "Объединение ключевых частей",
"lp22": "Ключ готов"
},
"logout": {
"logout": "ВЫХОД",
@ -148,7 +210,11 @@
},
"walletprofile": {
"minterlevel": "Уровень Minter",
"blocksminted": "Отчеканеные блоки"
"blocksminted": "Отчеканеные блоки",
"wp1": "Чеканка",
"wp2": "Не чеканить",
"wp3": "Основная информация",
"wp4": "Синхронизировано"
},
"general": {
"yes": "Да",
@ -435,7 +501,7 @@
"nchange35": "У ВАС ЕСТЬ ИМЯ!",
"nchange36": "Только аккаунты без зарегистрированного имени могут купить имя.",
"nchange37": "ВНИМАНИЕ!",
"nchange38": "У вас недостаточно qort, чтобы купить это имя.",
"nchange38": "У вас недостаточно QORT, чтобы купить это имя.",
"nchange39": "Вы уверены, что купите это имя?",
"nchange40": "При нажатии кнопки подтверждения будет отправлен запрос имени на покупку!",
"nchange41": "Старое имя",
@ -493,13 +559,13 @@
"schange7": "Опубликовано",
"schange8": "Действия",
"schange9": "Q-Apps",
"schange10": "Нет доступных q-apps",
"schange10": "Нет доступных Q-Apps",
"schange11": "Q-Apps, на которые вы подписаны",
"schange12": "Подписан на Q-Apps",
"schange13": "Вы не подписаны ни на одно q-apps",
"schange13": "Вы не подписаны ни на одно Q-Apps",
"schange14": "Ваши заблокированные Q-Apps",
"schange15": "Заблокированные Q-Apps",
"schange16": "Вы не заблокировали ни одно q-apps",
"schange16": "Вы не заблокировали ни одно Q-Apps",
"schange17": "Имя не найдено!",
"schange18": "Режим ретрансляции включен. Это означает, что ваш узел будет помогать передавать зашифрованные данные по сети, когда их запрашивает одноранговый узел. Вы можете отказаться, настроив",
"schange19": "в",
@ -537,13 +603,13 @@
"schange7": "Опубликовано",
"schange8": "Действия",
"schange9": "Q-Tubes",
"schange10": "Нет доступных q-tubes",
"schange10": "Нет доступных Q-Tubes",
"schange11": "Ваши подписчики Q-Tubes",
"schange12": "Следил за Q-Tubes",
"schange13": "Вы не подписаны ни на один q-tubes",
"schange13": "Вы не подписаны ни на один Q-Tubes",
"schange14": "Ваши заблокированные Q-Tubes",
"schange15": "Заблокированные Q-Tubes",
"schange16": "Вы не заблокировали ни одну q-tubes",
"schange16": "Вы не заблокировали ни одну Q-Tubes",
"schange17": "Имя не найдено!",
"schange18": "Режим ретрансляции включен. Это означает, что ваш узел будет помогать передавать зашифрованные данные по сети, когда их запрашивает одноранговый узел. Вы можете отказаться, настроив",
"schange19": "в",
@ -711,8 +777,8 @@
"cchange38": "Пользователь проверен",
"cchange39": "Невозможно отправить зашифрованное сообщение этому пользователю, так как у него нет открытого ключа в цепочке.",
"cchange40": "ИЗОБРАЖЕНИЕ (щелкните для просмотра)",
"cchange41": "Ваш баланс меньше 4,20 QORT",
"cchange42": "Из-за необходимости бороться со спамом учетным записям с балансом Qort менее 4,20 потребуется много времени для ОТПРАВКИ сообщений в Q-Chat. Если вы хотите немедленно увеличить скорость отправки сообщений Q-Chat, получите более 4,20 QORT на ваш адрес. Это можно сделать с помощью сделок на Торговом портале или с помощью другого Qortian, который предоставит вам QORT. Как только на вашем счету будет более 4,20 QORT, сообщения Q-Chat будут мгновенными, и этот диалог больше не будет show. Благодарим вас за понимание этого необходимого метода предотвращения спама, и мы надеемся, что вам понравится Qortal!",
"cchange41": "Ваш баланс меньше 4 QORT",
"cchange42": "Из-за необходимости бороться со спамом учетным записям с балансом QORT менее 4 потребуется много времени для ОТПРАВКИ сообщений в Q-Chat. Если вы хотите немедленно увеличить скорость отправки сообщений Q-Chat, получите более 4 QORT на ваш адрес. Это можно сделать с помощью сделок на Торговом портале или с помощью другого Qortian, который предоставит вам QORT. Как только на вашем счету будет более 4 QORT, сообщения Q-Chat будут мгновенными, и этот диалог больше не будет show. Благодарим вас за понимание этого необходимого метода предотвращения спама, и мы надеемся, что вам понравится Qortal!",
"cchange43": "Направить QORT на",
"cchange44": "ОТПРАВИТЬ СООБЩЕНИЕ",
"cchange45": "СОВЕТЫ ПОЛЬЗОВАТЕЛЯ",
@ -897,7 +963,9 @@
"nchange29": "Учетная запись Minting успешно удалена!",
"nchange30": "Не удалось удалить учетную запись Minting!",
"nchange31": "Остановить узел",
"nchange32": "Запрос на остановку успешно отправлен!"
"nchange32": "Запрос на остановку успешно отправлен!",
"nchange33": "Перезапустить узел",
"nchange34": "Запрос на перезапуск успешно отправлен!"
},
"transpage": {
"tchange1": "Запрос транзакции",
@ -978,7 +1046,9 @@
"exp18": "Платежи",
"exp19": "Отправлено",
"exp20": "Получено",
"exp21": "Сделок"
"exp21": "Сделок",
"exp22": "ПОСЛЕДНИЕ 5 ПЛАТЕЖЕЙ",
"exp23": "Показать все платежи"
},
"managegroup": {
"mg1": "Члены группы",
@ -1059,6 +1129,8 @@
"inf13": "Автоматически покупать",
"inf14": "с",
"inf15": "Активные ордера на автоматическую покупку",
"inf16": "Автопокупка"
"inf16": "Автопокупка",
"inf17": "Переключиться на светлую тему",
"inf18": "Переключиться на тёмную тему"
}
}

View File

@ -18,7 +18,8 @@
"russian": "Russian",
"norwegian": "Norwegian",
"romanian": "Romanian",
"korean": "Korean"
"korean": "Korean",
"japanese": "Japanese"
},
"sidemenu": {
"minting": "MINTING",
@ -41,17 +42,56 @@
"sm2": "NAME MANAGEMENT",
"sm3": "NAMES MARKET"
},
"tabmenu": {
"tm1": "Minting Details",
"tm2": "Become a Minter",
"tm3": "Sponsorship List",
"tm4": "Wallets",
"tm5": "Trade Portal",
"tm6": "Auto Buy",
"tm7": "Reward Share",
"tm8": "Q-Chat",
"tm9": "Name Registration",
"tm10": "Names Market",
"tm11": "Websites",
"tm12": "Q-Apps",
"tm13": "Group Management",
"tm14": "Data Management",
"tm15": "Puzzles",
"tm16": "Node Management",
"tm17": "New Tab",
"tm18": "Add New Tab",
"tm19": "Add New Plugin",
"tm20": "Q-App",
"tm21": "Website",
"tm22": "Remove Plugin",
"tm23": "Are you sure to remove this plugin ?",
"tm24": "Plugin Type:",
"tm25": "Please select a plugin type !",
"tm26": "Add New Plugin To Menu",
"tm27": "Remove Plugin From Menu",
"tm28": "Overview Page",
"tm29": "Reset Tab Menu",
"tm30": "Search Qortal Name",
"tm31": "My Followed Names",
"tm32": "This account not follow any user",
"tm33": "Import Tab Menu",
"tm34": "Export Tab Menu",
"tm35": "Your existing tab menu will be deleted and set to uploaded tab menu.",
"tm36": "Tab Menu Successfully Restored",
"tm37": "Tab Menu Successfully Saved As"
},
"login": {
"login": "Login",
"login": "Log In",
"createaccount": "Create Account",
"name": "Name",
"address": "Address",
"password": "Password",
"youraccounts": "Your accounts",
"clickto": "Click your account to login with it",
"clickto": "Click your account to log in with it",
"needcreate": "You need to create or save an account before you can log in!",
"upload": "Upload your qortal backup",
"howlogin": "How would you like to login?",
"upload": "Upload your Qortal backup",
"howlogin": "How would you like to log in?",
"seed": "Seedphrase",
"seedphrase": "seedphrase",
"saved": "Saved account",
@ -69,14 +109,14 @@
"confirmpass": "Confirm Password",
"willbe": "will be randomly generated in background. This is used as your private key generator for your blockchain account in Qortal.",
"clicknext": "Create your Qortal account by clicking NEXT below.",
"ready": "Your account is now ready to be created. It will be saved in this browser. If you do not want your new account to be saved in your browser, you can uncheck the box below. You will still be able to login with your new account(after logging out), using your wallet backup file that you MUST download once you create your account.",
"ready": "Your account is now ready to be created. It will be saved in this browser. If you do not want your new account to be saved in your browser, you can uncheck the box below. You will still be able to log in with your new account(after logging out), using your wallet backup file that you MUST download once you create your account.",
"welmessage": "Welcome to Qortal",
"pleaseenter": "Please enter a Password!",
"notmatch": "Passwords not match!",
"notmatch": "Passwords do not match!",
"lessthen8": "Your password is less than 8 characters! This is not recommended. You can continue to ignore this warning.",
"lessthen8-2": "Your password is less than 8 characters!",
"entername": "Please enter a Name!",
"downloaded": "Your Wallet BackUp file get downloaded!",
"downloaded": "Your Wallet BackUp file was downloaded!",
"loading": "Loading, Please wait...",
"createdseed": "Your created Seedphrase",
"saveseed": "Save Seedphrase",
@ -86,11 +126,34 @@
"created1": "Your account is now created",
"created2": " and will be saved in this browser.",
"downloadbackup": "Download Wallet BackUp File",
"passwordhint": "A password must be at least 8 characters."
"passwordhint": "A password must be at least 8 characters.",
"lp1": "Lock Screen",
"lp2": "No Lock Screen Password Is Set !",
"lp3": "Please Set One",
"lp4": "No Thanks",
"lp5": "Set Password",
"lp6": "New screen lock password set successfully !",
"lp7": "UNLOCK",
"lp8": "Error: Incorrect password",
"lp9": "IS",
"lp10": "LOCKED",
"lp11": "UNLOCKED",
"lp12": "Decoding saved data",
"lp13": "Generating decryption key",
"lp14": "Checking key",
"lp15": "Incorrect password",
"lp16": "Decrypting",
"lp17": "Waiting for workers to be ready",
"lp18": "Deriving key parts",
"lp19": "Error, incorrect key. ",
"lp20": "Error, incorrect nonce",
"lp21": "Combining key parts",
"lp22": "Key is ready"
},
"logout": {
"logout": "LOGOUT",
"confirmlogout": "Are you sure you want to logout?"
"logout": "LOG OUT",
"confirmlogout": "Are you sure you want to log out?"
},
"fragfile": {
"selectfile": "Select file",
@ -104,8 +167,8 @@
"account": "Account",
"security": "Security",
"qr_login_menu_item": "QR Login",
"qr_login_description_1": "Scan this code to unlock your wallet on other device using the same password which you logged in with.",
"qr_login_description_2": "Choose a password which you will use to unlock your wallet on other device after scanning the QR code.",
"qr_login_description_1": "Scan this code to unlock your wallet on another device using the same password which you logged in with.",
"qr_login_description_2": "Choose a password which you will use to unlock your wallet on another device after scanning the QR code.",
"qr_login_button_1": "Show login QR code",
"qr_login_button_2": "Generate login QR code",
"notifications": "Notifications",
@ -126,8 +189,8 @@
"import": "Import Nodes",
"export": "Export Nodes",
"deletecustomnode": "Remove All Custom Nodes",
"warning": "Your existing nodes will be deleted and from backup new created.",
"snack1": "Successfully deleted and added standard nodes",
"warning": "Your existing nodes will be deleted and reset to default.",
"snack1": "Successfully deleted and added default nodes",
"snack2": "UI conected to node",
"snack3": "Successfully added and saved custom node",
"snack4": "Nodes successfully saved as",
@ -148,7 +211,11 @@
},
"walletprofile": {
"minterlevel": "Minter Level",
"blocksminted": "Blocks Minted"
"blocksminted": "Blocks Minted",
"wp1": "Minting",
"wp2": "Not Minting",
"wp3": "Core Information",
"wp4": "Synchronized"
},
"general": {
"yes": "Yes",
@ -173,7 +240,7 @@
"gchange3": "My Collections",
"gchange4": "Subscribed Collections",
"gchange5": "Upload your gif files",
"gchange6": "File should be .Gif",
"gchange6": "File should be .gif",
"gchange7": "Upload Collection",
"gchange8": "A collection name is required!",
"gchange9": "Collection Name",
@ -208,7 +275,7 @@
"smchange7": "Finishing up relationship",
"smchange8": "Adding minting key to node",
"smchange9": "Complete",
"smchange10": "Only 2 minting keys are allowed per node, you are attempting to assign 3 keys, please go to management - node management, and remove the key you do not want to assign to this node, thank you!"
"smchange10": "Only 2 minting keys are allowed per node, you are attempting to assign 3 keys, please go to Management - Node Management, and remove the key you do not want to assign to this node, thank you!"
},
"mintingpage": {
"mchange1": "General Minting Details",
@ -244,26 +311,26 @@
"mchange31": "Press for help",
"mchange32": "Become A Minter",
"mchange33": "Introduction",
"mchange34": "In Qortal, in order to become a minter and begin earning QORT rewards with your increase in Minter Level, you must first become sponsored. A sponsor in Qortal is any other minter of level 5 or higher, or a Qortal Founder. You will obtain a sponsorship key from the sponsor, and use that key to get to level 1. Once you have reached level 1, you will be able to create your own minting key and start earning rewards for helping secure the Qortal Blockchain.",
"mchange34": "In Qortal, in order to become a minter and begin earning QORT rewards with your increase in Minter Level, you must first become sponsored. A sponsor in Qortal is any other minter of level 5 or higher, or a Qortal Founder. You will obtain a minting key from the sponsor, and use that key to get to level 1. Once you have reached level 1, you will be able to create your own minting key and start earning rewards for helping secure the Qortal Blockchain.",
"mchange35": "Sponsorship",
"mchange36": "Your sponsor will issue you a Sponsorship Key which you will use to add to your node, and begin minting (for no rewards until reaching level 1.) Once you reach level 1, you create/assign your own Minting Key and begin earning rewards.",
"mchange37": "Simply reach out to a minter in Qortal who is high enough level to issue a sponsorship key, obtain that key, then come back here and input the key to begin your minting journey !",
"mchange36": "Your sponsor will issue you a Minting Key which you will use to add to your node, and begin minting (for no rewards until reaching level 1.) Once you reach level 1, you create/assign your own Minting Key and begin earning rewards.",
"mchange37": "Simply reach out to a minter in Qortal who is high enough level to issue a minting key, obtain that key, then come back here and input the key to begin your minting journey!",
"mchange38": "in"
},
"becomeMinterPage": {
"bchange7": "Enter Sponsorship Key",
"bchange7": "Enter Minting Key",
"bchange8": "Input key from your sponsor here",
"bchange10": "Current Sponsorship Status",
"bchange12": "Minting with sponsor key",
"bchange12": "Minting with sponsor's key",
"bchange13": "Blocks Remaining in Sponsorship Period",
"bchange15": "Sponsorship Relationship",
"bchange16": "Sponsor Account",
"bchange17": "Copy Sponsorship Key",
"bchange17": "Copy Minting Key",
"bchange18": "Start Minting",
"bchange19": "Success! You are currently minting."
},
"walletpage": {
"wchange1": "Fetching balance ...",
"wchange1": "Fetching balance...",
"wchange2": "Current Wallet",
"wchange3": "Copy wallet address to clipboard",
"wchange4": "Address copied to clipboard",
@ -310,14 +377,14 @@
"wchange45": "Send all",
"wchange46": "Send to this address",
"wchange47": "Address Book",
"wchange48": "This Address Book is empty !",
"wchange48": "This Address Book is empty!",
"wchange49": "Add to Address Book",
"wchange50": "Name cannot be empty!",
"wchange51": "Address cannot be empty!",
"wchange52": "Successfully added!",
"wchange53": "Import Address Book",
"wchange54": "Export Address Book",
"wchange55": "Your existing address book will be deleted and from backup new created.",
"wchange55": "Your existing address book will be deleted and reset to default.",
"wchange56": "WARNING!",
"wchange57": "Memo",
"wchange58": "New Address",
@ -360,7 +427,7 @@
"tchange34": "Amount can not be 0",
"tchange35": "Price can not be 0",
"tchange36": "PENDING AUTO BUY",
"tchange37": "No auto buy order found !",
"tchange37": "No auto buy order found!",
"tchange38": "ADD",
"tchange39": "AUTO BUY ORDER",
"tchange40": "Price",
@ -424,11 +491,11 @@
"nchange23": "Sell Price",
"nchange24": "No Names To Sell",
"nchange25": "Name To Sell",
"nchange26": "Are you sure to sell this name ?",
"nchange26": "Are you sure to sell this name?",
"nchange27": "For this price in QORT",
"nchange28": "On pressing confirm, the sell name request will be sent!",
"nchange29": "Name To Cancel",
"nchange30": "Are you sure to cancel the sell for this name ?",
"nchange30": "Are you sure to cancel the sell for this name?",
"nchange31": "On pressing confirm, the cancel sell name request will be sent!",
"nchange32": "Sell Name Request Successful!",
"nchange33": "Cancel Sell Name Request Successful!",
@ -436,12 +503,12 @@
"nchange35": "YOU HAVE A NAME!",
"nchange36": "Only accounts with no registered name can buy a name.",
"nchange37": "ATTENTION!",
"nchange38": "You not have enough qort to buy this name.",
"nchange39": "Are you sure to buy this name ?",
"nchange38": "You not have enough QORT to buy this name.",
"nchange39": "Are you sure to buy this name?",
"nchange40": "On pressing confirm, the buy name request will be sent!",
"nchange41": "Old Name",
"nchange42": "New Name",
"nchange43": "Are you sure to change this name ?",
"nchange43": "Are you sure to change this name?",
"nchange44": "To the new name",
"nchange45": "On pressing confirm, the name update request will be sent!",
"nchange46": "Name Sale History",
@ -494,13 +561,13 @@
"schange7": "Published by",
"schange8": "Actions",
"schange9": "Q-Apps",
"schange10": "No q-apps available",
"schange10": "No Q-Apps available",
"schange11": "Your Followed Q-Apps",
"schange12": "Followed Q-Apps",
"schange13": "You aren't following any q-apps",
"schange13": "You aren't following any Q-Apps",
"schange14": "Your Blocked Q-Apps",
"schange15": "Blocked Q-Apps",
"schange16": "You have not blocked any q-apps",
"schange16": "You have not blocked any Q-Apps",
"schange17": "Name Not Found!",
"schange18": "Relay mode is enabled. This means that your node will help to transport encrypted data around the network when a peer requests it. You can opt out by setting",
"schange19": "in",
@ -538,13 +605,13 @@
"schange7": "Published by",
"schange8": "Actions",
"schange9": "Q-Tubes",
"schange10": "No q-tubes available",
"schange10": "No Q-Tubes available",
"schange11": "Your Followed Q-Tubes",
"schange12": "Followed Q-Tubes",
"schange13": "You aren't following any q-tubes",
"schange13": "You aren't following any Q-Tubes",
"schange14": "Your Blocked Q-Tubes",
"schange15": "Blocked Q-Tubes",
"schange16": "You have not blocked any q-tubes",
"schange16": "You have not blocked any Q-Tubes",
"schange17": "Name Not Found!",
"schange18": "Relay mode is enabled. This means that your node will help to transport encrypted data around the network when a peer requests it. You can opt out by setting",
"schange19": "in",
@ -576,7 +643,7 @@
"publishpage": {
"pchange1": "Publish",
"pchange2": "Update",
"pchange3": "Note: it is recommended that you set up port forwarding before hosting data, so that it can more easily accessed by peers on the network.",
"pchange3": "Note: it is recommended that you set up port forwarding before hosting data, so that it can more easily be accessed by peers on the network.",
"pchange4": "Select Name",
"pchange5": "Title",
"pchange6": "Description",
@ -712,8 +779,8 @@
"cchange38": "User Verified",
"cchange39": "Cannot send an encrypted message to this user since they do not have their publickey on chain.",
"cchange40": "IMAGE (click to view)",
"cchange41": "Your Balance Is Under 4.20 QORT",
"cchange42": "Out of the need to combat spam, accounts with under 4.20 Qort balance will take a long time to SEND messages in Q-Chat. If you wish to immediately increase the send speed for Q-Chat messages, obtain over 4.20 QORT to your address. This can be done with trades in the Trade Portal, or by way of another Qortian giving you the QORT. Once you have over 4.20 QORT in your account, Q-Chat messages will be instant and this dialog will no more show. Thank you for your understanding of this necessary spam prevention method, and we hope you enjoy Qortal!",
"cchange41": "Your Balance Is Under 4 QORT",
"cchange42": "Out of the need to combat spam, accounts with under 4 QORT balance will take a long time to SEND messages in Q-Chat. If you wish to immediately increase the send speed for Q-Chat messages, obtain over 4 QORT to your address. This can be done with trades in the Trade Portal, or by way of another Qortian giving you the QORT. Once you have over 4 QORT in your account, Q-Chat messages will be instant and this dialog will no more show. Thank you for your understanding of this necessary spam prevention method, and we hope you enjoy Qortal!",
"cchange43": "Tip QORT to",
"cchange44": "SEND MESSAGE",
"cchange45": "TIP USER",
@ -772,7 +839,7 @@
"bcchange3": "Error occurred when trying to block this user. Please try again!",
"bcchange4": "No registered name",
"bcchange5": "Block User Request",
"bcchange6": "Are you sure to block this user ?",
"bcchange6": "Are you sure to block this user?",
"bcchange7": "MENU",
"bcchange8": "Copy Address",
"bcchange9": "Private Message",
@ -830,7 +897,7 @@
"gchange41": "Group Creation Successful!",
"gchange42": "Invalid Group Name",
"gchange43": "Invalid Group Description",
"gchange44": "Select a Group Typ",
"gchange44": "Select a Group Type",
"gchange45": "Select a Group Approval Threshold",
"gchange46": "Select a Minimum Block delay for Group Transaction Approvals",
"gchange47": "Select a Maximum Block delay for Group Transaction Approvals",
@ -898,7 +965,9 @@
"nchange29": "Successfully Removed Minting Account!",
"nchange30": "Failed to Remove Minting Account!",
"nchange31": "Stop Node",
"nchange32": "Successfully Sent Stop Request!"
"nchange32": "Successfully Sent Stop Request!",
"nchange33": "Restart Node",
"nchange34": "Successfully Sent Restart Request!"
},
"transpage": {
"tchange1": "Transaction request",
@ -962,7 +1031,7 @@
"exp1": "Address or name to search",
"exp2": "Account Balance",
"exp3": "More Info",
"exp4": "Address or Name not found !",
"exp4": "Address or Name not found!",
"exp5": "Note that registered names are case-sensitive.",
"exp6": "Founder",
"exp7": "Info",
@ -979,7 +1048,9 @@
"exp18": "Payments",
"exp19": "Sent",
"exp20": "Received",
"exp21": "Trades"
"exp21": "Trades",
"exp22": "LAST 5 PAYMENTS",
"exp23": "Show All Payments"
},
"managegroup": {
"mg1": "Group Members",
@ -992,36 +1063,36 @@
"mg8": "Group ID",
"mg9": "Joined",
"mg10": "Add Group Admin",
"mg11": "Are you sure to add this member to admins ?",
"mg11": "Are you sure to add this member to admins?",
"mg12": "On pressing confirm, add admin request will be sent!",
"mg13": "Remove Group Admin",
"mg14": "Remove Admin Address",
"mg15": "Are you sure to remove this member from admins ?",
"mg15": "Are you sure to remove this member from admins?",
"mg16": "On pressing confirm, remove admin request will be sent!",
"mg17": "Ban Member From Group",
"mg18": "Member Name",
"mg19": "Member Address",
"mg20": "How Long To Ban",
"mg21": "Reason For Ban",
"mg22": "Are you sure to ban this member from the group ?",
"mg22": "Are you sure to ban this member from the group?",
"mg23": "On pressing confirm, the ban request will be sent!",
"mg24": "FOREVER",
"mg25": "Banned Members",
"mg26": "CANCEL BAN",
"mg27": "Ban Expiry",
"mg28": "Cancel Ban Member From Group",
"mg29": "Are you sure to cancel the ban for this member from the group ?",
"mg29": "Are you sure to cancel the ban for this member from the group?",
"mg30": "On pressing confirm, the cancel ban request will be sent!",
"mg31": "Kick Member From Group",
"mg32": "Reason For Kick",
"mg33": "Are you sure to kick this member from the group ?",
"mg33": "Are you sure to kick this member from the group?",
"mg34": "On pressing confirm, the kick request will be sent!",
"mg35": "No Open Group Invites",
"mg36": "Your Open Group Invites",
"mg37": "Address or name to invite",
"mg38": "Invite Expiry Time",
"mg39": "All Fields Are Required",
"mg40": "Are you sure to invite this member to the group ?",
"mg40": "Are you sure to invite this member to the group?",
"mg41": "On pressing confirm, the invite request will be sent!",
"mg42": "Group Type",
"mg43": "Invite Expiry",
@ -1029,19 +1100,19 @@
"mg45": "Private Group",
"mg46": "Cancel Invite",
"mg47": "Cancel Invite To Group",
"mg48": "Are you sure to cancel the invite for this member ?",
"mg48": "Are you sure to cancel the invite for this member?",
"mg49": "On pressing confirm, the cancel invite request will be sent!",
"mg50": "Coming Soon...",
"mg51": "Minimum 3 Characters / Maximum 32 Characters",
"mg52": "Maximum 128 Characters",
"mg53": "Your Open Join Requests",
"mg54": "No Open Join Requests",
"mg55": "Are you sure to accept the join request from this member ?",
"mg55": "Are you sure to accept the join request from this member?",
"mg56": "On pressing confirm, the accept join request will be sent!",
"mg57": "Join Request Successfully Accepted",
"mg58": "SOMETHING WENT WRONG",
"mg59": "Cancel Join Request Successfully Accepted",
"mg60": "Are you sure to cancel the join request from this member ?",
"mg60": "Are you sure to cancel the join request from this member?",
"mg61": "On pressing confirm, the cancel join request will be sent!"
},
"info": {
@ -1060,6 +1131,8 @@
"inf13": "Automatically buy",
"inf14": "with",
"inf15": "Active Auto Buy Orders",
"inf16": "Auto Buy"
"inf16": "Auto Buy",
"inf17": "Switch to light theme",
"inf18": "Switch to dark theme"
}
}

View File

@ -18,7 +18,8 @@
"russian": "俄语",
"norwegian": "挪威语",
"romanian": "罗马尼亚语",
"korean": "韩语"
"korean": "韩语",
"japanese": "日语"
},
"sidemenu": {
"minting": "铸币",
@ -41,6 +42,45 @@
"sm2": "名称管理",
"sm3": "名称市场"
},
"tabmenu": {
"tm1": "铸造细节",
"tm2": "成为铸币商",
"tm3": "赞助名单",
"tm4": "钱包",
"tm5": "贸易门户",
"tm6": "自动购买",
"tm7": "奖励分享",
"tm8": "Q-聊天",
"tm9": "名称注册",
"tm10": "名称市场",
"tm11": "网站",
"tm12": "Q-应用程序",
"tm13": "集团管理",
"tm14": "数据管理",
"tm15": "拼图",
"tm16": "节点管理",
"tm17": "新标签",
"tm18": "添加新标签",
"tm19": "添加新插件",
"tm20": "Q-应用程序",
"tm21": "网站",
"tm22": "删除插件",
"tm23": "你确定要删除这个插件吗?",
"tm24": "插件类型:",
"tm25": "请选择插件类型!",
"tm26": "添加新插件到菜单",
"tm27": "从菜单中删除插件",
"tm28": "概览页面",
"tm29": "重置选项卡菜单",
"tm30": "搜索 Qortal 名称",
"tm31": "我关注的名字",
"tm32": "该帐户没有关注任何用户",
"tm33": "导入选项卡菜单",
"tm34": "导出选项卡菜单",
"tm35": "您现有的选项卡菜单将被删除并设置为上传的选项卡菜单。",
"tm36": "选项卡菜单恢复成功",
"tm37": "选项卡菜单成功另存为"
},
"login": {
"login": "登入",
"createaccount": "创建钱包",
@ -86,7 +126,29 @@
"created1": "你的账号已创建成功",
"created2": "并会储存在UI上.",
"downloadbackup": "下载钱包备份文件",
"passwordhint": "密码必须至少为8 个字符。"
"passwordhint": "密码必须至少为8 个字符。",
"lp1": "锁定屏幕",
"lp2": "未设置锁屏密码!",
"lp3": "请设置一个",
"lp4": "不用了,谢谢",
"lp5": "设置密码",
"lp6": "新的锁屏密码设置成功!",
"lp7": "解锁",
"lp8": "错误:密码不正确",
"lp9": "是",
"lp10": "锁定",
"lp11": "解锁",
"lp12": "解码保存的数据",
"lp13": "正在生成解密密钥",
"lp14": "正在检查密钥",
"lp15": "密码错误",
"lp16": "正在解密",
"lp17": "等待工人准备好",
"lp18": "导出关键部分",
"lp19": "错误,密钥不正确。",
"lp20": "错误,随机数不正确",
"lp21": "组合关键部分",
"lp22": "钥匙已准备好"
},
"logout": {
"logout": "登出",
@ -148,7 +210,11 @@
},
"walletprofile": {
"minterlevel": "铸币等级",
"blocksminted": "铸币区块数"
"blocksminted": "铸币区块数",
"wp1": "铸造",
"wp2": "不铸造",
"wp3": "核心信息",
"wp4": "已同步"
},
"general": {
"yes": "是",
@ -435,7 +501,7 @@
"nchange35": "你有名字!",
"nchange36": "只有没有注册名字的账户才能买名字。",
"nchange37": "注意!",
"nchange38": "你没有足够的qort 来购买这个名字。",
"nchange38": "你没有足够的QORT 来购买这个名字。",
"nchange39": "你确定要买这个名字吗?",
"nchange40": "按下确认后,将发送购买名称请求!",
"nchange41": "旧名称",
@ -493,13 +559,13 @@
"schange7": "发布者",
"schange8": "动作",
"schange9": "Q-Apps",
"schange10": "没有可用的 q-apps",
"schange10": "没有可用的 Q-Apps",
"schange11": "您关注的 Q-Apps",
"schange12": "关注 Q-Apps",
"schange13": "您没有关注任何 q-apps",
"schange13": "您没有关注任何 Q-Apps",
"schange14": "你被屏蔽的 Q-Apps",
"schange15": "被阻止的 Q-Apps",
"schange16": "你没有屏蔽任何 q-apps",
"schange16": "你没有屏蔽任何 Q-Apps",
"schange17": "找不到名字!",
"schange18": "中继模式已启用。这意味着您的节点将在对等点请求时帮助在网络中传输加密数据。您可以通过设置选择退出",
"schange19": "在",
@ -537,13 +603,13 @@
"schange7": "发布者",
"schange8": "动作",
"schange9": "Q-Tubes",
"schange10": "没有可用的 q-tubes",
"schange10": "没有可用的 Q-Tubes",
"schange11": "您关注的 Q-Tubes",
"schange12": "关注 Q-Tubes",
"schange13": "你没有关注任何 q-tubes",
"schange13": "你没有关注任何 Q-Tubes",
"schange14": "你阻塞的 Q-Tubes",
"schange15": "阻塞的 Q-Tubes",
"schange16": "你没有阻塞任何 q-tubes",
"schange16": "你没有阻塞任何 Q-Tubes",
"schange17": "找不到名字!",
"schange18": "中继模式已启用。这意味着您的节点将在对等点请求时帮助在网络中传输加密数据。您可以通过设置选择退出",
"schange19": "在",
@ -711,8 +777,8 @@
"cchange38": "用户已验证",
"cchange39": "无法向该用户发送加密消息,因为他们的公钥不在链上。",
"cchange40": "图像(点击查看)",
"cchange41": "您的QORT余额低于4.20",
"cchange42": "出于打击垃圾邮件的需要Qort余额低于4.20的账户在Q-Chat中发送消息需要很长时间。如果你想立即提高Q-Chat消息的发送速度请获取4.20以上QORT 到您的地址。这可以通过贸易门户中的交易来完成或者通过另一个Qortian 给您QORT。一旦您的帐户中有超过4.20 QORTQ-Chat 消息将是即时的并且此对话框将不再显示。感谢您了解这种必要的垃圾邮件预防方法我们希望您喜欢Qortal",
"cchange41": "您的QORT余额低于4",
"cchange42": "出于打击垃圾邮件的需要QORT余额低于4的账户在Q-Chat中发送消息需要很长时间。如果你想立即提高Q-Chat消息的发送速度请获取4以上QORT 到您的地址。这可以通过贸易门户中的交易来完成或者通过另一个Qortian 给您QORT。一旦您的帐户中有超过4 QORTQ-Chat 消息将是即时的并且此对话框将不再显示。感谢您了解这种必要的垃圾邮件预防方法我们希望您喜欢Qortal",
"cchange43": "打赏QORT给",
"cchange44": "发送消息",
"cchange45": "提示用户",
@ -897,7 +963,9 @@
"nchange29": "成功从此节点中移除铸币账号!",
"nchange30": "未能从此节点中移除铸币账号!",
"nchange31": "关闭节点",
"nchange32": "成功发送关闭节点请求!"
"nchange32": "成功发送关闭节点请求!",
"nchange33": "重启节点",
"nchange34": "成功发送重启节点请求!"
},
"transpage": {
"tchange1": "请求交易",
@ -978,7 +1046,9 @@
"exp18": "付款",
"exp19": "已发送",
"exp20": "已收到",
"exp21": "交易"
"exp21": "交易",
"exp22": "最近 5 笔付款",
"exp23": "显示所有付款"
},
"managegroup": {
"mg1": "群组成员",
@ -1059,6 +1129,8 @@
"inf13": "自动购买",
"inf14": "与",
"inf15": "有效的自动购买订单",
"inf16": "自动购买"
"inf16": "自动购买",
"inf17": "切换到浅色主题",
"inf18": "切换到深色主题"
}
}

View File

@ -18,7 +18,8 @@
"russian": "俄語",
"norwegian": "挪威語",
"romanian": "羅馬尼亞語",
"korean": "韓語"
"korean": "韓語",
"japanese": "日語"
},
"sidemenu": {
"minting": "鑄幣",
@ -41,6 +42,45 @@
"sm2": "名稱管理",
"sm3": "名稱市場"
},
"tabmenu": {
"tm1": "鑄造細節",
"tm2": "成為鑄幣商",
"tm3": "贊助名單",
"tm4": "錢包",
"tm5": "貿易門戶",
"tm6": "自動購買",
"tm7": "獎勵分享",
"tm8": "Q-聊天",
"tm9": "名稱註冊",
"tm10": "名稱市場",
"tm11": "網站",
"tm12": "Q-應用程序",
"tm13": "集團管理",
"tm14": "數據管理",
"tm15": "拼圖",
"tm16": "節點管理",
"tm17": "新標籤",
"tm18": "添加新標籤",
"tm19": "添加新插件",
"tm20": "Q-應用程序",
"tm21": "網站",
"tm22": "刪除插件",
"tm23": "你確定要刪除這個插件嗎?",
"tm24": "插件類型:",
"tm25": "請選擇插件類型!",
"tm26": "添加新插件到菜單",
"tm27": "從菜單中刪除插件",
"tm28": "概覽頁面",
"tm29": "重置選項卡菜單",
"tm30": "搜索 Qortal 名稱",
"tm31": "我關注的名字",
"tm32": "該帳戶沒有關注任何用戶",
"tm33": "導入選項卡菜單",
"tm34": "導出選項卡菜單",
"tm35": "您現有的選項卡菜單將被刪除並設置為上傳的選項卡菜單。",
"tm36": "選項卡菜單恢復成功",
"tm37": "選項卡菜單成功另存為"
},
"login": {
"login": "登入",
"createaccount": "創建錢包",
@ -86,7 +126,29 @@
"created1": "你的賬號已創建成功",
"created2": " 並會儲存在UI上.",
"downloadbackup": "下載錢包備份文件",
"passwordhint": "密碼必須至少為 8 個字符。"
"passwordhint": "密碼必須至少為 8 個字符。",
"lp1": "鎖定屏幕",
"lp2": "未設置鎖屏密碼!",
"lp3": "請設置一個",
"lp4": "不用了,謝謝",
"lp5": "設置密碼",
"lp6": "新的鎖屏密碼設置成功!",
"lp7": "解鎖",
"lp8": "錯誤:密碼不正確",
"lp9": "是",
"lp10": "鎖定",
"lp11": "解鎖",
"lp12": "解碼保存的數據",
"lp13": "正在生成解密密鑰",
"lp14": "正在檢查密鑰",
"lp15": "密碼錯誤",
"lp16": "正在解密",
"lp17": "等待工人準備好",
"lp18": "導出關鍵部分",
"lp19": "錯誤,密鑰不正確。",
"lp20": "錯誤,隨機數不正確",
"lp21": "組合關鍵部分",
"lp22": "鑰匙已準備好"
},
"logout": {
"logout": "登出",
@ -148,7 +210,11 @@
},
"walletprofile": {
"minterlevel": "鑄幣等級",
"blocksminted": "鑄幣區塊數"
"blocksminted": "鑄幣區塊數",
"wp1": "鑄造",
"wp2": "不鑄造",
"wp3": "核心信息",
"wp4": "已同步"
},
"general": {
"yes": "是",
@ -435,7 +501,7 @@
"nchange35": "你有名字!",
"nchange36": "只有沒有註冊名字的賬戶才能買名字。",
"nchange37": "注意!",
"nchange38": "你沒有足夠的 qort 來購買這個名字。",
"nchange38": "你沒有足夠的 QORT 來購買這個名字。",
"nchange39": "你確定要買這個名字嗎?",
"nchange40": "按下確認後,將發送購買名稱請求!",
"nchange41": "舊名稱",
@ -493,13 +559,13 @@
"schange7": "發布者",
"schange8": "動作",
"schange9": "Q-Apps",
"schange10": "沒有可用的 q-apps",
"schange10": "沒有可用的 Q-Apps",
"schange11": "您關注的 Q-Apps",
"schange12": "關注 Q-Apps",
"schange13": "您沒有關注任何 q-apps",
"schange13": "您沒有關注任何 Q-Apps",
"schange14": "你被屏蔽的 Q-Apps",
"schange15": "被阻止的 Q-Apps",
"schange16": "你沒有屏蔽任何 q-apps",
"schange16": "你沒有屏蔽任何 Q-Apps",
"schange17": "找不到名字!",
"schange18": "中繼模式已啟用。這意味著您的節點將在對等點請求時幫助在網絡中傳輸加密數據。您可以通過設置選擇退出",
"schange19": "在",
@ -537,13 +603,13 @@
"schange7": "發布者",
"schange8": "動作",
"schange9": "Q-Tubes",
"schange10": "沒有可用的 q-tubes",
"schange10": "沒有可用的 Q-Tubes",
"schange11": "您關注的 Q-Tubes",
"schange12": "關注 Q-Tubes",
"schange13": "你沒有關注任何 q-tubes",
"schange13": "你沒有關注任何 Q-Tubes",
"schange14": "你阻塞的 Q-Tubes",
"schange15": "阻塞的 Q-Tubes",
"schange16": "你沒有阻塞任何 q-tubes",
"schange16": "你沒有阻塞任何 Q-Tubes",
"schange17": "找不到名字!",
"schange18": "中繼模式已啟用。這意味著您的節點將在對等點請求時幫助在網絡中傳輸加密數據。您可以通過設置選擇退出",
"schange19": "在",
@ -711,8 +777,8 @@
"cchange38": "用戶已驗證",
"cchange39": "無法向該用戶發送加密消息,因為他們的公鑰不在鏈上。",
"cchange40": "圖像(點擊查看)",
"cchange41": "您的QORT餘額低於4.20",
"cchange42": "出於打擊垃圾郵件的需要Qort餘額低於4.20的賬戶在Q-Chat中發送消息需要很長時間。如果你想立即提高Q-Chat消息的發送速度請獲取4.20以上 QORT 到您的地址。這可以通過貿易門戶中的交易來完成,或者通過另一個 Qortian 給您 QORT。一旦您的帳戶中有超過 4.20 QORTQ-Chat 消息將是即時的並且此對話框將不再顯示。感謝您了解這種必要的垃圾郵件預防方法,我們希望您喜歡 Qortal",
"cchange41": "您的QORT餘額低於4",
"cchange42": "出於打擊垃圾郵件的需要QORT餘額低於4的賬戶在Q-Chat中發送消息需要很長時間。如果你想立即提高Q-Chat消息的發送速度請獲取4以上 QORT 到您的地址。這可以通過貿易門戶中的交易來完成,或者通過另一個 Qortian 給您 QORT。一旦您的帳戶中有超過 4 QORTQ-Chat 消息將是即時的並且此對話框將不再顯示。感謝您了解這種必要的垃圾郵件預防方法,我們希望您喜歡 Qortal",
"cchange43": "打賞QORT給",
"cchange44": "發送消息",
"cchange45": "提示用戶",
@ -897,7 +963,9 @@
"nchange29": "成功從此節點中移除鑄幣賬號!",
"nchange30": "未能從此節點中移除鑄幣賬號!",
"nchange31": "關閉節點",
"nchange32": "成功發送關閉節點請求!"
"nchange32": "成功發送關閉節點請求!",
"nchange33": "重啟節點",
"nchange34": "成功發送重啟節點請求!"
},
"transpage": {
"tchange1": "請求交易",
@ -978,7 +1046,9 @@
"exp18": "付款",
"exp19": "已發送",
"exp20": "已收到",
"exp21": "交易"
"exp21": "交易",
"exp22": "最近 5 筆付款",
"exp23": "顯示所有付款"
},
"managegroup": {
"mg1": "群組成員",
@ -1059,6 +1129,8 @@
"inf13": "自動購買",
"inf14": "與",
"inf15": "有效的自動購買訂單",
"inf16": "自動購買"
"inf16": "自動購買",
"inf17": "切換到淺色主題",
"inf18": "切換到深色主題"
}
}

File diff suppressed because it is too large Load Diff

View File

@ -1,6 +1,4 @@
import { LitElement, html, css } from 'lit'
import { connect } from 'pwa-helpers'
import { store } from '../store.js'
import { use, translate, translateUnsafeHTML, registerTranslateConfig } from 'lit-translate'
registerTranslateConfig({
@ -16,10 +14,9 @@ if (checkLanguage === null || checkLanguage.length === 0) {
use(checkLanguage)
}
class LanguageSelector extends connect(store)(LitElement) {
class LanguageSelector extends LitElement {
static get properties() {
return {
config: { type: Object },
theme: { type: String, reflect: true }
}
}
@ -35,7 +32,24 @@ class LanguageSelector extends connect(store)(LitElement) {
border: 1px solid var(--black);
border-radius: 3px;
color: var(--black);
background: var(--white);
background:
linear-gradient(45deg, transparent 50%, white 50%),
linear-gradient(135deg, white 50%, transparent 50%),
linear-gradient(to right, #03a9f4, #03a9f4);
background-position:
calc(100% - 17px) calc(0.5em + 4px),
calc(100% - 7px) calc(0.5em + 4px),
100% 0;
background-size:
10px 10px,
10px 10px,
2.2em 2.2em;
background-repeat: no-repeat;
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
-webkit-appearance:none;
-moz-appearance:none;
}
*:focus {
@ -43,6 +57,8 @@ class LanguageSelector extends connect(store)(LitElement) {
}
select option {
color: var(--black);
background: var(--white);
line-height: 34px;
}
`
@ -57,8 +73,7 @@ class LanguageSelector extends connect(store)(LitElement) {
render() {
return html`
<div style="display: inline;">
<select @change="${this.changeLanguage}">
<option value="us">${translate("selectmenu.selectlanguage")}</option>
<select id="languageSelect" @change="${this.changeLanguage}">
<option value="us">US - ${translate("selectmenu.english")}</option>
<option value="de">DE - ${translate("selectmenu.german")}</option>
<option value="es">ES - ${translate("selectmenu.spanish")}</option>
@ -67,6 +82,7 @@ class LanguageSelector extends connect(store)(LitElement) {
<option value="hu">HU - ${translate("selectmenu.hungarian")}</option>
<option value="hindi">IN - ${translate("selectmenu.hindi")}</option>
<option value="it">IT - ${translate("selectmenu.italian")}</option>
<option value="jp">JP - ${translate("selectmenu.japanese")}</option>
<option value="ko">KO - ${translate("selectmenu.korean")}</option>
<option value="no">NO - ${translate("selectmenu.norwegian")}</option>
<option value="pl">PL - ${translate("selectmenu.polish")}</option>
@ -82,17 +98,25 @@ class LanguageSelector extends connect(store)(LitElement) {
}
firstUpdated() {
// ...
const myElement = this.shadowRoot.getElementById('languageSelect')
myElement.addEventListener("change", () => {
this.selectElement()
})
this.selectElement()
}
selectElement() {
const selectedLanguage = localStorage.getItem('qortalLanguage')
let element = this.shadowRoot.getElementById('languageSelect')
element.value = selectedLanguage
}
changeLanguage(event) {
use(event.target.value)
localStorage.setItem('qortalLanguage', event.target.value)
}
stateChanged(state) {
this.config = state.config
}
}
window.customElements.define('language-selector', LanguageSelector)

View File

@ -457,6 +457,10 @@ class LoginSection extends connect(store)(LitElement) {
return html`${translate("login.error2")}`
}
renderError3Text() {
return html`${translate("login.lp8")}`
}
selectWallet(wallet) {
this.selectedWallet = wallet
this.selectedPage = 'unlockStored'
@ -617,43 +621,37 @@ class LoginSection extends connect(store)(LitElement) {
// First decrypt...
this.loadingRipple.welcomeMessage = this.renderPrepareText()
// const x = e.clientX !== undefined ? e.clientX : e.explicitOriginalTarget.getBoundingClientRect().left + window.scrollX
// const y = e.clientY !== undefined ? e.clientY : e.explicitOriginalTarget.getBoundingClientRect().top + window.scrollY
this.loadingRipple.open({
x: e.clientX,
y: e.clientY
}).then(() => {
const source = this.walletSources[type]()
return createWallet(type, source, status => {
this.loadingRipple.loadingMessage = status
}).then(wallet => {
store.dispatch(doLogin(wallet))
store.dispatch(doSelectAddress(wallet.addresses[0]))
this.navigate('show-address')
const storedWallets = store.getState().user.storedWallets
const storedWalletAddress = storedWallets[wallet.addresses[0].address]
if (!storedWalletAddress) {
if (this.saveInBrowser && type !== 'storedWallet') {
store.dispatch(doStoreWallet(wallet, source.password, source.name, () => {
ripple.loadingMessage = status
})).catch(err => console.error(err))
}
}
checkApiKey(this.nodeConfig)
this.cleanup()
return this.loadingRipple.fade()
})
}).catch(e => {
this.loginErrorMessage = this.renderError3Text()
console.error(e)
return this.loadingRipple.close()
})
.then(() => {
const source = this.walletSources[type]()
return createWallet(type, source, status => {
this.loadingRipple.loadingMessage = status
})
.then(wallet => {
store.dispatch(doLogin(wallet))
store.dispatch(doSelectAddress(wallet.addresses[0]))
this.navigate('show-address')
const storedWallets = store.getState().user.storedWallets
const storedWalletAddress = storedWallets[wallet.addresses[0].address]
if (!storedWalletAddress) {
if (this.saveInBrowser && type !== 'storedWallet') {
store.dispatch(doStoreWallet(wallet, source.password, source.name, () => {
ripple.loadingMessage = status
})).catch(err => console.error(err))
}
}
checkApiKey(this.nodeConfig)
this.cleanup()
return this.loadingRipple.fade()
})
})
.catch(e => {
this.loginErrorMessage = e
console.error(e)
return this.loadingRipple.close()
})
}
back() {

View File

@ -15,7 +15,7 @@ import './login-section.js'
import '../qort-theme-toggle.js'
import settings from '../../functional-components/settings-page.js'
import { addAutoLoadImageChat, removeAutoLoadImageChat, addChatLastSeen, allowQAPPAutoAuth, removeQAPPAutoAuth, removeQAPPAutoLists, allowQAPPAutoLists } from '../../redux/app/app-actions.js'
import { addAutoLoadImageChat, removeAutoLoadImageChat, addChatLastSeen, allowQAPPAutoAuth, removeQAPPAutoAuth, removeQAPPAutoLists, allowQAPPAutoLists, addTabInfo, setTabNotifications, setNewTab } from '../../redux/app/app-actions.js'
window.reduxStore = store
window.reduxAction = {
@ -25,7 +25,10 @@ window.reduxAction = {
allowQAPPAutoAuth: allowQAPPAutoAuth,
removeQAPPAutoAuth: removeQAPPAutoAuth,
allowQAPPAutoLists: allowQAPPAutoLists,
removeQAPPAutoLists: removeQAPPAutoLists
removeQAPPAutoLists: removeQAPPAutoLists,
addTabInfo: addTabInfo,
setTabNotifications: setTabNotifications,
setNewTab: setNewTab
}
const animationDuration = 0.7 // Seconds

View File

@ -3,6 +3,7 @@ import { installRouter } from 'pwa-helpers/router.js'
import { connect } from 'pwa-helpers'
import { store } from '../store.js'
import { doNavigate } from '../redux/app/app-actions.js'
import isElectron from 'is-electron'
import '../plugins/streams.js'
import { loadPlugins } from '../plugins/load-plugins.js'
@ -11,9 +12,6 @@ import '../styles/app-styles.js'
import './login-view/login-view.js'
import './app-view.js'
import copyTextMenu from '../functional-components/copy-text-menu.js'
import framePasteMenu from '../functional-components/frame-paste-menu.js'
installRouter((location) => store.dispatch(doNavigate(location)))
class MainApp extends connect(store)(LitElement) {
@ -66,46 +64,14 @@ class MainApp extends connect(store)(LitElement) {
super.connectedCallback()
this.initial = 0
window.addEventListener('contextmenu', (event) => {
event.preventDefault();
this._textMenu(event);
})
window.addEventListener('click', () => {
copyTextMenu.close()
framePasteMenu.close()
})
window.onkeyup = (e) => {
if (e.keyCode === 27) {
copyTextMenu.close()
framePasteMenu.close()
}
if (!isElectron()) {
} else {
window.addEventListener('contextmenu', (event) => {
event.preventDefault()
window.electronAPI.showMyMenu()
})
}
}
_textMenu(event) {
const getSelectedText = () => {
var text = ''
if (typeof window.getSelection !== 'undefined') {
text = window.getSelection().toString()
} else if (typeof this.shadowRoot.selection !== 'undefined' && this.shadowRoot.selection.type == 'Text') {
text = this.shadowRoot.selection.createRange().text
}
return text
}
const checkSelectedTextAndShowMenu = () => {
const selectedText = getSelectedText()
if (selectedText && typeof selectedText === 'string') {
const textMenuObject = { selectedText, eventObject: event }
copyTextMenu.open(textMenuObject)
}
}
checkSelectedTextAndShowMenu()
}
}
window.customElements.define('main-app', MainApp)

View File

@ -0,0 +1,276 @@
import { LitElement, html, css } from 'lit'
import { connect } from 'pwa-helpers'
import '@vaadin/item'
import '@vaadin/list-box'
import '@polymer/paper-icon-button/paper-icon-button.js'
import '@polymer/iron-icons/iron-icons.js'
import { store } from '../../store.js'
import { setNewTab } from '../../redux/app/app-actions.js'
import { routes } from '../../plugins/routes.js'
import config from '../../notifications/config.js'
import '../../../../plugins/plugins/core/components/TimeAgo.js'
class NotificationBell extends connect(store)(LitElement) {
static properties = {
notifications: { type: Array },
showNotifications: { type: Boolean },
notificationCount: { type: Boolean },
theme: { type: String, reflect: true },
}
constructor() {
super()
this.notifications = []
this.showNotifications = false
this.notificationCount = false
this.initialFetch = false
this.theme = localStorage.getItem('qortalTheme') ? localStorage.getItem('qortalTheme') : 'light'
}
firstUpdated() {
this.getNotifications();
document.addEventListener('click', (event) => {
const path = event.composedPath()
if (!path.includes(this)) {
this.showNotifications = false
}
})
}
getApiKey() {
const apiNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node]
let apiKey = apiNode.apiKey
return apiKey
}
async getNotifications() {
const myNode = store.getState().app.nodeConfig.knownNodes[store.getState().app.nodeConfig.node]
const nodeUrl = myNode.protocol + '://' + myNode.domain + ':' + myNode.port
let interval = null
let stop = false
const getNewMail = async () => {
const getMail = async (recipientName, recipientAddress) => {
const query = `qortal_qmail_${recipientName.slice(
0,
20
)}_${recipientAddress.slice(-6)}_mail_`
const url = `${nodeUrl}/arbitrary/resources/search?service=MAIL_PRIVATE&query=${query}&limit=10&includemetadata=true&offset=0&reverse=true&excludeblocked=true`
const response = await fetch(url, {
method: 'GET',
headers: {
'Content-Type': 'application/json'
}
})
const data = await response.json()
return data;
}
if (!stop && !this.showNotifications) {
stop = true
try {
const address = window.parent.reduxStore.getState().app?.selectedAddress?.address;
const name = window.parent.reduxStore.getState().app?.accountInfo?.names[0]?.name
if (!name || !address) return
const mailArray = await getMail(name, address)
let notificationsToShow = []
if (mailArray.length > 0) {
const lastVisited = localStorage.getItem("Q-Mail-last-visited")
if (lastVisited) {
mailArray.forEach((mail) => {
if (mail.created > lastVisited) notificationsToShow.push(mail)
})
} else {
notificationsToShow = mailArray
}
}
if (!this.initialFetch && notificationsToShow.length > 0) {
const mail = notificationsToShow[0]
const urlPic = `${nodeUrl}/arbitrary/THUMBNAIL/${mail.name}/qortal_avatar?async=true&apiKey=${this.getApiKey()}`
routes.showNotification({
data: { title: "New Q-Mail", type: "qapp", sound: config.messageAlert, url: "", options: { body: `You have an unread mail from ${mail.name}`, icon: urlPic, badge: urlPic } }
})
} else if (notificationsToShow.length > 0) {
if (notificationsToShow[0].created > (this.notifications[0]?.created || 0)) {
const mail = notificationsToShow[0]
const urlPic = `${nodeUrl}/arbitrary/THUMBNAIL/${mail.name}/qortal_avatar?async=true&apiKey=${this.getApiKey()}`
routes.showNotification({
data: { title: "New Q-Mail", type: "qapp", sound: config.messageAlert, url: "", options: { body: `You have an unread mail from ${mail.name}`, icon: urlPic, badge: urlPic } }
})
}
}
this.notifications = notificationsToShow
if (this.notifications.length === 0) {
this.notificationCount = false
} else {
this.notificationCount = true
}
if (!this.initialFetch) this.initialFetch = true
} catch (error) {
console.error(error)
}
stop = false
}
}
try {
setTimeout(() => {
getNewMail()
}, 5000)
interval = setInterval(getNewMail, 30000)
} catch (error) {
console.error(error)
}
}
render() {
return html`
<div class="layout">
${this.notificationCount ? html`
<paper-icon-button style="color: green;" icon="icons:mail" @click=${() => this._toggleNotifications()} title="Q-Mail"></paper-icon-button>
` : html`
<paper-icon-button icon="icons:mail" @click=${() => this._toggleNotifications()} title="Q-Mail"></paper-icon-button>
`}
${this.notificationCount ? html`
<span class="count">${this.notifications.length}</span>
` : ''}
<div class="popover-panel" ?hidden=${!this.showNotifications}>
<div class="notifications-list">
${this.notifications.map(notification => html`
<div class="notification-item" @click=${() => {
const query = `?service=APP&name=Q-Mail`
store.dispatch(setNewTab({
url: `qdn/browser/index.html${query}`,
id: 'q-mail-notification',
myPlugObj: {
"url": "qapps",
"domain": "core",
"page": `qdn/browser/index.html${query}`,
"title": "Q-Mail",
"icon": "vaadin:mailbox",
"mwcicon": "mail_outline",
"menus": [],
"parent": false
}
}))
this.showNotifications = false
this.notifications = []
}}>
<div>
<p>Q-Mail</p>
<message-time timestamp=${notification.created} style="color:red;font-size:12px"></message-time>
</div>
<div>
<p>${notification.name}</p>
</div>
</div>
`)}
</div>
</div>
</div>
`
}
_toggleNotifications() {
if (this.notifications.length === 0) return
this.showNotifications = !this.showNotifications
}
static styles = css`
.layout {
width: 100px;
display: flex;
flex-direction: column;
align-items: center;
position: relative;
}
.count {
position: absolute;
top: 2px;
right: 32px;
font-size: 12px;
background-color: red;
color: white;
border-radius: 50%;
width: 16px;
height: 16px;
display: flex;
align-items: center;
justify-content: center;
}
.nocount {
display: none;
}
.popover-panel {
position: absolute;
width: 200px;
padding: 10px;
background-color: var(--white);
border: 1px solid var(--black);
border-radius: 4px;
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
top: 40px;
max-height: 350px;
overflow: auto;
scrollbar-width: thin;
scrollbar-color: #6a6c75 #a1a1a1;
}
.popover-panel::-webkit-scrollbar {
width: 11px;
}
.popover-panel::-webkit-scrollbar-track {
background: #a1a1a1;
}
.popover-panel::-webkit-scrollbar-thumb {
background-color: #6a6c75;
border-radius: 6px;
border: 3px solid #a1a1a1;
}
.notifications-list {
display: flex;
flex-direction: column;
}
.notification-item {
padding: 5px;
border-bottom: 1px solid;
display: flex;
justify-content: space-between;
cursor: pointer;
transition: 0.2s all;
}
.notification-item:hover {
background: var(--nav-color-hover);
}
p {
font-size: 14px;
color: var(--black);
margin: 0px;
padding: 0px;
}
`
}
customElements.define('notification-bell', NotificationBell)

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,102 @@
import { LitElement, html, css } from 'lit'
import { get, translate, translateUnsafeHTML } from 'lit-translate'
import '@polymer/paper-icon-button/paper-icon-button.js'
import '@polymer/iron-icons/image-icons.js'
import '@polymer/iron-icons/iron-icons.js'
class ThemeToggle extends LitElement {
static get properties() {
return {
theme: { type: String, reflect: true}
}
}
constructor() {
super()
this.theme = localStorage.getItem('qortalTheme') ? localStorage.getItem('qortalTheme') : 'light'
}
static styles = [
css`
* {
--mdc-theme-primary: rgb(3, 169, 244);
--mdc-theme-secondary: var(--mdc-theme-primary);
--mdc-theme-error: rgb(255, 89, 89);
--lumo-primary-text-color: rgb(0, 167, 245);
--lumo-primary-color-50pct: rgba(0, 167, 245, 0.5);
--lumo-primary-color-10pct: rgba(0, 167, 245, 0.1);
--lumo-primary-color: hsl(199, 100%, 48%);
--lumo-base-color: var(--white);
--lumo-body-text-color: var(--black);
--lumo-secondary-text-color: var(--sectxt);
--lumo-contrast-60pct: var(--vdicon);
--item-selected-color: var(--nav-selected-color);
--item-selected-color-text: var(--nav-selected-color-text);
--item-color-active: var(--nav-color-active);
--item-color-hover: var(--nav-color-hover);
--item-text-color: var(--nav-text-color);
--item-icon-color: var(--nav-icon-color);
--item-border-color: var(--nav-border-color);
--item-border-selected-color: var(--nav-border-selected-color);
}
paper-icon-button {
-ms-transform: rotate(120deg);
transform: rotate(120deg);
}
:host([theme="light"]) .light-mode {
display: inline-block;
}
:host([theme="light"]) .dark-mode {
display: none;
}
:host([theme="dark"]) .light-mode {
display: none;
}
:host([theme="dark"]) .dark-mode {
display: inline-block;
}
`
]
render() {
return html`
<div style="display: inline;">
<paper-icon-button class="light-mode" icon="image:brightness-3" @click=${() => this.toggleTheme()} title="${translate("info.inf18")}"></paper-icon-button>
<paper-icon-button class="dark-mode" icon="image:wb-sunny" @click=${() => this.toggleTheme()} title="${translate("info.inf17")}"></paper-icon-button>
</div>
`
}
firstUpdated() {
this.initTheme()
}
toggleTheme() {
if (this.theme === 'light') {
this.theme = 'dark'
} else {
this.theme = 'light'
}
this.dispatchEvent(new CustomEvent('qort-theme-change', {
bubbles: true,
composed: true,
detail: this.theme,
}))
window.localStorage.setItem('qortalTheme', this.theme)
this.initTheme()
}
initTheme() {
document.querySelector('html').setAttribute('theme', this.theme);
}
}
window.customElements.define('theme-toggle', ThemeToggle);

View File

@ -2,7 +2,6 @@ import { LitElement, html, css } from 'lit'
import { render } from 'lit/html.js'
import { connect } from 'pwa-helpers'
import { store } from '../../store.js'
import { doLogout } from '../../redux/app/app-actions.js'
import { get, translate, translateUnsafeHTML } from 'lit-translate'
import '@polymer/paper-dialog/paper-dialog.js'
@ -48,6 +47,7 @@ class UserInfoView extends connect(store)(LitElement) {
explorerSoldRVNTrades: { type: Array },
explorerSoldARRRTrades: { type: Array },
allPayments: { type: Array },
slicedArray: { type: Array },
allReceivedPayments: { type: Array },
allSendPayments: { type: Array },
actualBlockheight: { type: Number },
@ -267,8 +267,24 @@ class UserInfoView extends connect(store)(LitElement) {
--mdc-theme-primary: var(--mdc-theme-error)
}
.warning {
--mdc-theme-primary: #f0ad4e;
}
.green {
--mdc-theme-primary: #198754;
}
.buttons {
text-align:right;
display: inline;
float: right;
margin-bottom: 5px;
}
.paybutton {
display: inline;
float: left;
margin-bottom: 5px;
}
.loadingContainer {
@ -315,6 +331,15 @@ class UserInfoView extends connect(store)(LitElement) {
height: 250px;
}
.box-info-full {
margin: 0;
padding: 0;
display: flex;
flex-flow: column;
height: 450px;
width: 450px;
}
header {
display: flex;
flex: 0 1 auto;
@ -322,7 +347,7 @@ class UserInfoView extends connect(store)(LitElement) {
justify-content: center;
padding: 0px 10px;
font-size: 16px;
color: var(--white);
color: var(--black);
background-color: var(--tradehead);
border-left: 1px solid var(--tradeborder);
border-top: 1px solid var(--tradeborder);
@ -332,9 +357,10 @@ class UserInfoView extends connect(store)(LitElement) {
.border-wrapper {
border: 1px var(--tradeborder) solid;
overflow: hidden;
overflow: hidden;
}
#first-explorer-section {
display: grid;
grid-template-columns: 1fr 1fr;
@ -478,6 +504,7 @@ class UserInfoView extends connect(store)(LitElement) {
this.explorerSoldRVNTrades = []
this.explorerSoldARRRTrades = []
this.allPayments = []
this.slicedArray = []
this.allReceivedPayments = []
this.allSendPayments = []
this.actualBlockheight = 0
@ -1106,6 +1133,62 @@ class UserInfoView extends connect(store)(LitElement) {
</div>
<div class="explorer-trades">
<div class="box-info">
<header>${translate("explorerpage.exp22")}</header>
<div class="border-wrapper">
<div class="loadingContainer" id="loadingExplorerTrades" style="display:${this.isLoadingCompleteInfo ? 'block' : 'none'}"><div class="loading"></div><span style="color: var(--black);">${translate("login.loading")}</span></div>
<vaadin-grid theme="compact" id="lastQortPaymentsGrid" ?hidden="${this.isEmptyArray(this.slicedArray)}" .items="${this.slicedArray}">
<vaadin-grid-column
auto-width
header="${translate("walletpage.wchange35")}"
.renderer=${(root, column, data) => {
render(html`${translate("walletpage.wchange40")} ${data.item.creatorAddress === this.displayAddress ? html`<span class="color-out">${translate("walletpage.wchange7")}</span>` : html`<span class="color-in">${translate("walletpage.wchange8")}</span>`} `, root)
}}
>
</vaadin-grid-column>
<vaadin-grid-column auto-width header="${translate("walletpage.wchange11")}" path="amount"></vaadin-grid-column>
<vaadin-grid-column
auto-width
header="${translate("walletpage.wchange14")}"
.renderer=${(root, column, data) => {
const dateString = new Date(data.item.timestamp).toLocaleDateString()
render(html`${dateString}`, root)
}}
>
</vaadin-grid-column>
<vaadin-grid-column
auto-width
resizable
header="${translate("explorerpage.exp7")}"
.renderer=${(root, column, data) => {
render(html`<span @click="${() => this.showPaymentDetails(data)}"><mwc-icon class="btn-info">info</mwc-icon></span>`, root)
}}
>
</vaadin-grid-column>
</vaadin-grid>
${this.isEmptyArray(this.slicedArray) ? html`
<span style="color: var(--black); font-size: 16px; text-align: center;">${translate("walletpage.wchange38")}</span>
`: ''}
</div>
</div>
</div>
<div>
<span class="paybutton">
<mwc-button class='green' @click=${() => this.showAllPayments()}>${translate("explorerpage.exp23")}</mwc-button>
</span>
<span class="buttons">
<mwc-button @click=${() => this.openTrades()}>${translate("explorerpage.exp21")}</mwc-button>
<mwc-button class='decline' @click=${() => this.closeCompleteInfoDialog()} dialog-dismiss>${translate("general.close")}</mwc-button>
</span>
</div>
</paper-dialog>
<paper-dialog style="background: var(--white); border: 1px solid var(--black); border-radius: 5px;" id="showAllPaymentsDialog" modal>
<div style="text-align: center; color: var(--black);">
<h1>${translate("explorerpage.exp17")}</h1>
<hr />
</div>
<div class="explorer-trades">
<div class="box-info-full">
<header>${translate("explorerpage.exp17")}</header>
<div class="border-wrapper">
<div class="loadingContainer" id="loadingExplorerTrades" style="display:${this.isLoadingCompleteInfo ? 'block' : 'none'}"><div class="loading"></div><span style="color: var(--black);">${translate("login.loading")}</span></div>
@ -1144,9 +1227,10 @@ class UserInfoView extends connect(store)(LitElement) {
</div>
</div>
</div>
<div class="buttons">
<mwc-button @click=${() => this.openTrades()}>${translate("explorerpage.exp21")}</mwc-button>
<mwc-button class='decline' @click=${() => this.closeCompleteInfoDialog()} dialog-dismiss>${translate("general.close")}</mwc-button>
<div>
<span class="buttons">
<mwc-button class='decline' @click=${() => this.closeShowAllPaymentsDialog()} dialog-dismiss>${translate("general.close")}</mwc-button>
</span>
</div>
</paper-dialog>
@ -1419,14 +1503,15 @@ class UserInfoView extends connect(store)(LitElement) {
founderStatus() {
if (this.addressResult.flags === 1) {
return html`${translate("general.yes")}`
return html`<span style="color: green;">${translate("general.yes")}</span>`
} else {
return html`${translate("general.no")}`
return html`<span style="color: red;">${translate("general.no")}</span>`
}
}
async getPaymentsGridItems() {
this.allPayments = []
this.slicedArray = []
this.allReceivedPayments = []
this.allSendPayments = []
this.totalSent = 0
@ -1454,6 +1539,8 @@ class UserInfoView extends connect(store)(LitElement) {
}
}).filter(item => !!item)
this.slicedArray = this.allPayments.slice(0, 5)
this.allSendPayments = this.allPayments.map(item => {
const searchSendAddress = item.creatorAddress
if (searchSendAddress == paymentsAddress) {
@ -1505,6 +1592,10 @@ class UserInfoView extends connect(store)(LitElement) {
this.shadowRoot.getElementById('showTxDetailsDialog').open()
}
showAllPayments() {
this.shadowRoot.getElementById('showAllPaymentsDialog').open()
}
async getBoughtBTCGridItems() {
const myNode = store.getState().app.nodeConfig.knownNodes[store.getState().app.nodeConfig.node]
const nodeUrl = myNode.protocol + '://' + myNode.domain + ':' + myNode.port
@ -1850,6 +1941,10 @@ class UserInfoView extends connect(store)(LitElement) {
this.shadowRoot.getElementById('userSoldDialog').close()
}
closeShowAllPaymentsDialog() {
this.shadowRoot.getElementById('showAllPaymentsDialog').close()
}
getApiKey() {
const apiNode = store.getState().app.nodeConfig.knownNodes[store.getState().app.nodeConfig.node];
let apiKey = apiNode.apiKey;

View File

@ -1,241 +0,0 @@
import { LitElement, html, css } from 'lit'
import { connect } from 'pwa-helpers'
import { store } from '../store';
import { doCopyMenuSwitch } from '../redux/app/app-actions';
let copyTextMenuElement
class CopyTextMenu extends connect(store)(LitElement) {
static get properties() {
return {
selectedText: {
type: String,
attribute: 'selected-text',
reflectToAttribute: true
},
eventObject: {
type: Object,
attribute: 'event-object',
reflectToAttribute: true
},
isCopyMenuOpen: {
type: Boolean
}
}
}
constructor() {
super()
this.selectedText = ''
this.eventObject = {}
this.isCopyMenuOpen = false
}
static get styles() {
return css`
.context-menu{
display: block;
opacity: 0;
position: absolute;
pointer-events: none;
padding: 5px, 0;
border: 1px solid var(--border);
min-width: 150px;
max-width: 300px;
background: #F9F9F9;
border-radius: 4px;
}
.c-open {
pointer-events: all;
opacity: 1;
z-index: 120;
}
#items {
list-style: none;
margin: 0px;
margin-top: 4px;
padding-left: 5px;
padding-right: 5px;
padding-bottom: 3px;
font-size: 17px;
color: #333333;
}
hr {
width: 85%;
background-color: #E4E4E4;
border-color: #E4E4E4;
color: #E4E4E4;
}
li{
padding: 3px;
padding-left:10px;
}
#items :hover{
color: white;
background: #6a6c75;
border-radius: 2px;
}
`
}
render() {
return html`
<div class='context-menu'>
<ul id='items'>
<li @click=${() => this.saveToClipboard(this.selectedText)} >Copy</li>
</ul>
</div>
`
}
firstUpdated() {
this.contextElement = this.shadowRoot.querySelector('.context-menu')
}
saveToClipboard(text) {
try {
navigator.clipboard.writeText(text).then(() => {
window.getSelection().removeAllRanges()
window.parent.getSelection().removeAllRanges()
store.dispatch(doCopyMenuSwitch(false))
// ...
}).catch((err) => {
console.log('failed: ', err)
})
} catch (err) {
// Fallback, if all fails
document.execCommand('copy');
window.getSelection().removeAllRanges()
window.parent.getSelection().removeAllRanges()
store.dispatch(doCopyMenuSwitch(false))
}
}
textMenu(selectedText, eventObject, isFrame) {
this.selectedText = selectedText
const getPosition = (isFrame, event) => {
let posx = 0
let posy = 0
if (isFrame) {
const p = document.querySelector('main')
const d = document.getElementById('main-app').shadowRoot.querySelector('app-view').shadowRoot.querySelector('app-drawer-layout').children[1].querySelector('show-plugin').shadowRoot.querySelector('iframe')
posx = p.offsetWidth - d.offsetWidth + event.pageX
posy = d.offsetTop + event.pageY
} else {
if (event.pageX || event.pageY) {
posx = event.pageX
posy = event.pageY
} else if (event.clientX || event.clientY) {
posx = event.clientX + document.body.scrollLeft +
document.documentElement.scrollLeft
posy = event.clientY + document.body.scrollTop +
document.documentElement.scrollTop
}
}
return {
x: posx,
y: posy
}
}
const positionMenu = (isFrame, event) => {
const newPosition = {
left: '0px',
top: '0px'
}
const clickCoords = getPosition(isFrame, event)
const clickCoordsX = clickCoords.x
const clickCoordsY = clickCoords.y
const menuWidth = this.contextElement.offsetWidth + 4
const menuHeight = this.contextElement.offsetHeight + 4
const windowWidth = window.innerWidth
const windowHeight = window.innerHeight
if ((windowWidth - clickCoordsX) < menuWidth) {
newPosition.left = windowWidth - menuWidth + 'px'
} else {
newPosition.left = clickCoordsX + 'px'
}
if ((windowHeight - clickCoordsY) < menuHeight) {
newPosition.top = windowHeight - menuHeight + 'px'
} else {
newPosition.top = clickCoordsY + 'px'
}
return newPosition
}
const pos = positionMenu(isFrame, eventObject)
this.contextElement.style.top = pos.top
this.contextElement.style.left = pos.left
this.contextElement.style.opacity = '1'
this.contextElement.releasePointerCapture = true
this.contextElement.classList.add('c-open')
document.getElementById('main-app').shadowRoot.querySelector('copy-text-menu').inert = false
}
open(textMenuObject) {
const selectedText = textMenuObject.selectedText
const eventObject = textMenuObject.eventObject
const isFrame = textMenuObject.isFrame
this.textMenu(selectedText, eventObject, isFrame)
store.dispatch(doCopyMenuSwitch(true))
}
close() {
this.contextElement.style.opacity = '0'
this.contextElement.classList.remove('c-open')
}
stateChanged(state) {
this.isCopyMenuOpen = state.app.copyMenuSwitch
}
}
window.customElements.define('copy-text-menu', CopyTextMenu)
const copyTextMenuNode = document.createElement('copy-text-menu')
copyTextMenuNode.id = 'copy-text-menu-node'
copyTextMenuNode.inert = false
copyTextMenuNode.eventObject = {}
copyTextMenuElement = document.body.appendChild(copyTextMenuNode)
setTimeout(() => {
const menuNode = document.getElementById('copy-text-menu-node')
const mainApp = document.getElementById('main-app').shadowRoot
const shadow = mainApp
copyTextMenuElement = shadow.appendChild(menuNode)
}, 500)
export default copyTextMenuElement

View File

@ -1,203 +0,0 @@
import { LitElement, html, css } from 'lit'
import { connect } from 'pwa-helpers'
import { store } from '../store';
import { doFramePasteMenuSwitch } from '../redux/app/app-actions';
let framePasteMenuElement
class FramePasteMenu extends connect(store)(LitElement) {
static get properties() {
return {
eventObject: {
type: Object,
attribute: 'event-object',
reflectToAttribute: true
},
framePasteMenuOpen: {
type: Object
},
elementId: {
type: String
}
}
}
constructor() {
super()
this.eventObject = {}
this.framePasteMenuOpen = {
isOpen: false,
elementId: ''
}
this.elementId = ''
}
static get styles() {
return css`
.frame-paste-context-menu{
display: block;
opacity: 0;
position: absolute;
pointer-events: none;
padding: 5px, 0;
border: 1px solid #B2B2B2;
min-width: 150px;
max-width: 300px;
background: #F9F9F9;
border-radius: 4px;
}
.p-open {
pointer-events: all;
opacity: 1;
z-index: 120;
}
#items {
list-style: none;
margin: 0px;
margin-top: 4px;
padding-left: 5px;
padding-right: 5px;
padding-bottom: 3px;
font-size: 17px;
color: #333333;
}
hr {
width: 85%;
background-color: #E4E4E4;
border-color: #E4E4E4;
color: #E4E4E4;
}
li{
padding: 3px;
padding-left:10px;
}
#items :hover{
color: white;
background: #6a6c75;
border-radius: 2px;
}
`
}
render() {
return html`
<div class='frame-paste-context-menu'>
<ul id='items'>
<li @click=${() => this.paste()} >Paste</li>
</ul>
</div>
`
}
firstUpdated() {
this.contextElement = this.shadowRoot.querySelector('.frame-paste-context-menu')
}
paste() {
store.dispatch(doFramePasteMenuSwitch({ isOpen: false, elementId: this.elementId }))
}
positionMenu(eventObject) {
const getPosition = (event) => {
let posx = 0
let posy = 0
const p = document.querySelector('main')
const d = document.getElementById('main-app').shadowRoot.querySelector('app-view').shadowRoot.querySelector('app-drawer-layout').children[1].querySelector('show-plugin').shadowRoot.querySelector('iframe')
posx = p.offsetWidth - d.offsetWidth + event.pageX
posy = d.offsetTop + event.pageY
return {
x: posx,
y: posy
}
}
const positionMenu = (event) => {
const newPosition = {
left: '0px',
top: '0px'
}
const clickCoords = getPosition(event)
const clickCoordsX = clickCoords.x
const clickCoordsY = clickCoords.y
const menuWidth = this.contextElement.offsetWidth + 4
const menuHeight = this.contextElement.offsetHeight + 4
const windowWidth = window.innerWidth
const windowHeight = window.innerHeight
if ((windowWidth - clickCoordsX) < menuWidth) {
newPosition.left = windowWidth - menuWidth + 'px'
} else {
newPosition.left = clickCoordsX + 'px'
}
if ((windowHeight - clickCoordsY) < menuHeight) {
newPosition.top = windowHeight - menuHeight + 'px'
} else {
newPosition.top = clickCoordsY + 'px'
}
return newPosition
}
const pos = positionMenu(eventObject)
this.contextElement.style.top = pos.top
this.contextElement.style.left = pos.left
this.contextElement.style.opacity = '1'
this.contextElement.releasePointerCapture = true
this.contextElement.classList.add('p-open')
document.getElementById('main-app').shadowRoot.querySelector('frame-paste-menu').inert = false
}
open(eventObject) {
this.elementId = eventObject.elementId
this.positionMenu(eventObject)
store.dispatch(doFramePasteMenuSwitch({ isOpen: true, elementId: eventObject.elementId }))
}
close() {
this.contextElement.style.opacity = '0'
this.contextElement.classList.remove('p-open')
}
stateChanged(state) {
this.framePasteMenuOpen = state.app.framePasteMenuSwitch
}
}
window.customElements.define('frame-paste-menu', FramePasteMenu)
const framePasteMenuNode = document.createElement('frame-paste-menu')
framePasteMenuNode.id = 'frame-paste-menu-node'
framePasteMenuNode.inert = false
framePasteMenuNode.eventObject = {}
framePasteMenuElement = document.body.appendChild(framePasteMenuNode)
setTimeout(() => {
const menuNode = document.getElementById('frame-paste-menu-node')
const mainApp = document.getElementById('main-app').shadowRoot
const shadow = mainApp
framePasteMenuElement = shadow.appendChild(menuNode)
}, 500)
export default framePasteMenuElement

View File

@ -1,201 +0,0 @@
import { LitElement, html, css } from 'lit'
import { connect } from 'pwa-helpers'
import { store } from '../store';
import { doPasteMenuSwitch } from '../redux/app/app-actions';
let pasteMenuElement
class FramePasteMenu extends connect(store)(LitElement) {
static get properties() {
return {
eventObject: {
type: Object,
attribute: 'event-object',
reflectToAttribute: true
},
isPasteMenuOpen: {
type: Boolean
}
}
}
constructor() {
super()
this.eventObject = {}
this.isPasteMenuOpen = false
}
static get styles() {
return css`
.paste-context-menu{
display: block;
opacity: 0;
position: absolute;
pointer-events: none;
padding: 5px, 0;
border: 1px solid #B2B2B2;
min-width: 150px;
max-width: 300px;
background: #F9F9F9;
border-radius: 4px;
}
.p-open {
pointer-events: all;
opacity: 1;
z-index: 120;
}
#items {
list-style: none;
margin: 0px;
margin-top: 4px;
padding-left: 5px;
padding-right: 5px;
padding-bottom: 3px;
font-size: 17px;
color: #333333;
}
hr {
width: 85%;
background-color: #E4E4E4;
border-color: #E4E4E4;
color: #E4E4E4;
}
li{
padding: 3px;
padding-left:10px;
}
#items :hover{
color: white;
background: #6a6c75;
border-radius: 2px;
}
`
}
render() {
return html`
<div class='paste-context-menu'>
<ul id='items'>
<li @click=${() => this.paste()} >Paste</li>
</ul>
</div>
`
}
firstUpdated() {
this.contextElement = this.shadowRoot.querySelector('.paste-context-menu')
}
paste() {
store.dispatch(doPasteMenuSwitch(false))
}
positionMenu(eventObject) {
const getPosition = (event) => {
let posx = 0
let posy = 0
if (event.pageX || event.pageY) {
posx = event.pageX
posy = event.pageY
} else if (event.clientX || event.clientY) {
posx = event.clientX + document.body.scrollLeft +
document.documentElement.scrollLeft
posy = event.clientY + document.body.scrollTop +
document.documentElement.scrollTop
}
return {
x: posx,
y: posy
}
}
const positionMenu = (event) => {
const newPosition = {
left: '0px',
top: '0px'
}
const clickCoords = getPosition(event)
const clickCoordsX = clickCoords.x
const clickCoordsY = clickCoords.y
const menuWidth = this.contextElement.offsetWidth + 4
const menuHeight = this.contextElement.offsetHeight + 4
const windowWidth = window.innerWidth
const windowHeight = window.innerHeight
if ((windowWidth - clickCoordsX) < menuWidth) {
newPosition.left = windowWidth - menuWidth + 'px'
} else {
newPosition.left = clickCoordsX + 'px'
}
if ((windowHeight - clickCoordsY) < menuHeight) {
newPosition.top = windowHeight - menuHeight + 'px'
} else {
newPosition.top = clickCoordsY + 'px'
}
return newPosition
}
const pos = positionMenu(eventObject)
this.contextElement.style.top = pos.top
this.contextElement.style.left = pos.left
this.contextElement.style.opacity = '1'
this.contextElement.releasePointerCapture = true
this.contextElement.classList.add('p-open')
document.getElementById('main-app').shadowRoot.querySelector('paste-menu').inert = false
}
open(eventObject) {
this.positionMenu(eventObject)
store.dispatch(doPasteMenuSwitch(true))
}
close() {
this.contextElement.style.opacity = '0'
this.contextElement.classList.remove('p-open')
}
stateChanged(state) {
this.isPasteMenuOpen = state.app.pasteMenuSwitch
}
}
window.customElements.define('paste-menu', FramePasteMenu)
const pasteMenuNode = document.createElement('paste-menu')
pasteMenuNode.id = 'paste-menu-node'
pasteMenuNode.inert = false
pasteMenuNode.eventObject = {}
pasteMenuElement = document.body.appendChild(pasteMenuNode)
setTimeout(() => {
const menuNode = document.getElementById('paste-menu-node')
const mainApp = document.getElementById('main-app').shadowRoot
const shadow = mainApp
pasteMenuElement = shadow.appendChild(menuNode)
}, 500)
export default pasteMenuElement

View File

@ -2,7 +2,7 @@ import { LitElement, html, css } from 'lit'
import { connect } from 'pwa-helpers'
import { store } from '../store.js'
import { doAddNode, doSetNode, doLoadNodeConfig } from '../redux/app/app-actions.js'
import { get, translate, translateUnsafeHTML } from 'lit-translate'
import { use, get, translate, translateUnsafeHTML, registerTranslateConfig } from 'lit-translate'
import snackbar from './snackbar.js'
import '../components/language-selector.js'
import '../custom-elements/frag-file-input.js'
@ -15,6 +15,19 @@ import '@material/mwc-textfield'
import '@material/mwc-icon'
import '@material/mwc-list/mwc-list-item.js'
registerTranslateConfig({
loader: lang => fetch(`/language/${lang}.json`).then(res => res.json())
})
const checkLanguage = localStorage.getItem('qortalLanguage')
if (checkLanguage === null || checkLanguage.length === 0) {
localStorage.setItem('qortalLanguage', 'us')
use('us')
} else {
use(checkLanguage)
}
let settingsDialog
class SettingsPage extends connect(store)(LitElement) {
@ -22,7 +35,8 @@ class SettingsPage extends connect(store)(LitElement) {
return {
lastSelected: { type: Number },
nodeConfig: { type: Object },
theme: { type: String, reflect: true }
theme: { type: String, reflect: true },
nodeIndex: { type: Number }
}
}
@ -83,6 +97,7 @@ class SettingsPage extends connect(store)(LitElement) {
constructor() {
super()
this.nodeConfig = {}
this.nodeIndex = localStorage.getItem('mySelectedNode')
this.theme = localStorage.getItem('qortalTheme') ? localStorage.getItem('qortalTheme') : 'light'
}
@ -95,7 +110,7 @@ class SettingsPage extends connect(store)(LitElement) {
</div>
<br>
<div style="min-height: 250px; min-width: 500px; box-sizing: border-box; position: relative;">
<mwc-select icon="link" id="nodeSelect" label="${translate("settings.nodeurl")}" index="0" @selected="${(e) => this.nodeSelected(e)}" style="min-width: 130px; max-width:100%; width:100%;">
<mwc-select icon="link" id="nodeSelect" label="${translate("settings.nodeurl")}" index="${this.nodeIndex}" @selected="${(e) => this.nodeSelected(e)}" style="min-width: 130px; max-width:100%; width:100%;">
${this.nodeConfig.knownNodes.map((n, index) => html`
<mwc-list-item value="${index}">
<span class="name">${n.name}</span>
@ -117,9 +132,9 @@ class SettingsPage extends connect(store)(LitElement) {
<div style="min-height:100px; min-width: 300px; box-sizing: border-box; position: relative;">
<hr><br>
<center>
<div id="main">
<mwc-icon class="globe">language</mwc-icon>&nbsp;<language-selector></language-selector>
</div>
<div id="main">
<mwc-icon class="globe">language</mwc-icon>&nbsp;<language-selector></language-selector>
</div>
</center>
</div>
<mwc-button
@ -184,7 +199,11 @@ class SettingsPage extends connect(store)(LitElement) {
}
firstUpdated() {
// ...
const checkNode = localStorage.getItem('mySelectedNode')
if (checkNode === null || checkNode.length === 0) {
localStorage.setItem('mySelectedNode', 0)
} else {
}
}
show() {
@ -224,6 +243,9 @@ class SettingsPage extends connect(store)(LitElement) {
dismiss: true
})
localStorage.removeItem('mySelectedNode')
localStorage.setItem('mySelectedNode', 0)
store.dispatch(doLoadNodeConfig())
}
@ -237,6 +259,9 @@ class SettingsPage extends connect(store)(LitElement) {
store.dispatch(doSetNode(selectedNodeIndex))
localStorage.removeItem('mySelectedNode')
localStorage.setItem('mySelectedNode', selectedNodeIndex)
let snack2string = get("settings.snack2")
snackbar.add({
labelText: `${snack2string} : ${selectedNodeUrl}`,
@ -374,6 +399,9 @@ class SettingsPage extends connect(store)(LitElement) {
dismiss: true
})
localStorage.removeItem('mySelectedNode')
localStorage.setItem('mySelectedNode', 0)
store.dispatch(doLoadNodeConfig())
}

11
core/src/lockScreen.js Normal file
View File

@ -0,0 +1,11 @@
import CryptoJS from 'crypto-js'
export const encryptData = (data, salt) => CryptoJS.AES.encrypt(JSON.stringify(data), salt).toString()
export const decryptData = (ciphertext, salt) => {
const bytes = CryptoJS.AES.decrypt(ciphertext, salt)
try {
return JSON.parse(bytes.toString(CryptoJS.enc.Utf8))
} catch(err) {
return null
}
}

View File

@ -1,7 +1,7 @@
import config from './config'
import { dispatcher } from './dispatcher'
import snackbar from '../functional-components/snackbar.js'
import { NEW_MESSAGE } from './types'
import { NEW_MESSAGE, NEW_MESSAGE_NOTIFICATION_QAPP } from './types'
let initial = 0
let _state
@ -43,10 +43,13 @@ const notificationCheck = function () {
*/
export const doNewMessage = function (req) {
const newMessage = () => {
let data
if (req.type && req.type === 'qapp') {
data = req
if (req.groupId) {
} else if (req.groupId) {
const title = `${req.groupName}`
const body = `New Message from ${req.senderName === undefined ? req.sender : req.senderName}`
data = { title, sound: config.messageAlert, options: { body, icon: config.default.icon, badge: config.default.icon }, req }
@ -57,11 +60,16 @@ export const doNewMessage = function (req) {
}
const notificationState = { type: NEW_MESSAGE, data: data }
const notificationStateQapp = { type: NEW_MESSAGE_NOTIFICATION_QAPP, data: data }
const canI = notificationCheck()
if (canI === true) {
dispatcher(notificationState)
if (req.type && req.type === 'qapp') {
dispatcher(notificationStateQapp)
} else {
dispatcher(notificationState)
}
} else {
_state = notificationState
}

View File

@ -1,10 +1,13 @@
import { NEW_MESSAGE } from './types'
import { newMessage } from './notification-actions'
import { NEW_MESSAGE, NEW_MESSAGE_NOTIFICATION_QAPP } from './types'
import { newMessage, newMessageNotificationQapp } from './notification-actions'
export const dispatcher = function (notificationState) {
switch (notificationState.type) {
case NEW_MESSAGE:
return newMessage(notificationState.data)
case NEW_MESSAGE_NOTIFICATION_QAPP:
return newMessageNotificationQapp(notificationState.data)
default:
}
}

View File

@ -1 +1 @@
export { newMessage } from './new-message'
export { newMessage, newMessageNotificationQapp } from './new-message'

View File

@ -1,5 +1,6 @@
import { store } from '../../store.js'
import { doPageUrl } from '../../redux/app/app-actions.js'
import { doPageUrl, setNewTab } from '../../redux/app/app-actions.js'
import isElectron from 'is-electron'
export const newMessage = (data) => {
const alert = playSound(data.sound)
@ -31,6 +32,75 @@ export const newMessage = (data) => {
}
}
}
export const newMessageNotificationQapp = (data) => {
const alert = playSound(data.sound)
// Should I show notification ?
if (store.getState().user.notifications.q_chat.showNotification) {
// Yes, I can but should I play sound ?
if (store.getState().user.notifications.q_chat.playSound) {
const notify = new Notification(data.title, data.options)
notify.onshow = (e) => {
alert.play()
}
notify.onclick = (e) => {
const query = `?service=APP&name=Q-Mail`
store.dispatch(setNewTab({
url: `qdn/browser/index.html${query}`,
id: 'q-mail-notification',
myPlugObj: {
"url": "qapps",
"domain": "core",
"page": `qdn/browser/index.html${query}`,
"title": "Q-Mail",
"icon": "vaadin:desktop",
"menus": [],
"parent": false
}
}))
if (!isElectron()) {
window.focus();
} else {
window.electronAPI.focusApp()
}
}
} else {
const notify = new Notification(data.title, data.options)
notify.onclick = (e) => {
const query = `?service=APP&name=Q-Mail`
store.dispatch(setNewTab({
url: `qdn/browser/index.html${query}`,
id: 'q-mail-notification',
myPlugObj: {
"url": "qapps",
"domain": "core",
"page": `qdn/browser/index.html${query}`,
"title": "Q-Mail",
"icon": "vaadin:desktop",
"menus": [],
"parent": false
}
}))
if (!isElectron()) {
window.focus();
} else {
window.electronAPI.focusApp()
}
}
}
}
}
const playSound = (soundUrl) => {

View File

@ -1 +1,2 @@
export const NEW_MESSAGE = 'NEW_MESSAGE'
export const NEW_MESSAGE_NOTIFICATION_QAPP = 'NEW_MESSAGE_NOTIFICATION_QAPP'

View File

@ -17,8 +17,6 @@ import {
loadStateFromLocalStorage,
saveStateToLocalStorage,
} from '../localStorageHelpers.js'
import copyTextMenu from '../functional-components/copy-text-menu.js'
import framePasteMenu from '../functional-components/frame-paste-menu.js'
const createTransaction = api.createTransaction
const processTransaction = api.processTransaction
@ -39,10 +37,6 @@ const sendRvn = api.sendRvn
const sendArrr = api.sendArrr
export const routes = {
hello: async (req) => {
return 'Hello from awesomeness'
},
registerUrl: async (req) => {
store.dispatch(doAddPluginUrl(req.data))
},
@ -95,27 +89,6 @@ export const routes = {
return saveStateToLocalStorage(req.data.key, req.data.dataObj)
},
openCopyTextMenu: async (req) => {
const textMenuObject = {
selectedText: req.data.selectedText,
eventObject: req.data.eventObject,
isFrame: req.data.isFrame,
}
copyTextMenu.open(textMenuObject)
},
closeCopyTextMenu: async (req) => {
copyTextMenu.close()
},
openFramePasteMenu: async (req) => {
framePasteMenu.open(req.data)
},
closeFramePasteMenu: async (req) => {
framePasteMenu.close()
},
apiCall: async (req) => {
const url = req.data.url
delete req.data.url

View File

@ -7,8 +7,6 @@ const SELECTED_ADDRESS_STREAM_NAME = 'selected_address'
const APP_INFO_STATE = 'app_info_state'
const CHAT_HEADS_STREAM_NAME = 'chat_heads'
const NODE_CONFIG_STREAM_NAME = 'node_config'
const COPY_MENU_SWITCH = 'copy_menu_switch'
const FRAME_PASTE_MENU_SWITCH = 'frame_paste_menu_switch'
const CHAT_LAST_SEEN = 'chat_last_seen'
export const loggedInStream = new EpmlStream(LOGIN_STREAM_NAME, () => store.getState().app.loggedIn)
@ -17,8 +15,6 @@ export const selectedAddressStream = new EpmlStream(SELECTED_ADDRESS_STREAM_NAME
export const appInfoStateStream = new EpmlStream(APP_INFO_STATE, () => store.getState().app.appInfo)
export const chatHeadsStateStream = new EpmlStream(CHAT_HEADS_STREAM_NAME, () => store.getState().app.chatHeads)
export const nodeConfigStream = new EpmlStream(NODE_CONFIG_STREAM_NAME, () => store.getState().app.nodeConfig)
export const copyMenuSwitchStream = new EpmlStream(COPY_MENU_SWITCH, () => store.getState().app.copyMenuSwitch)
export const framePasteMenuSwitchStream = new EpmlStream(FRAME_PASTE_MENU_SWITCH, () => store.getState().app.framePasteMenuSwitch)
export const chatLastSeenStream = new EpmlStream(CHAT_LAST_SEEN, () => store.getState().app.chatLastSeen)
@ -32,7 +28,7 @@ store.subscribe(() => {
if (oldState.app.loggedIn !== state.app.loggedIn) {
loggedInStream.emit(state.app.loggedIn)
}
// This one may be a little on the heavy side...AHHH, NEED TO MOVE STORAGE OF ENCRYPTED SEED. DONE <3
if (oldState.config !== state.config) {
configStream.emit(state.config)
}
@ -41,13 +37,6 @@ store.subscribe(() => {
nodeConfigStream.emit(state.app.nodeConfig)
}
if (oldState.app.copyMenuSwitch !== state.app.copyMenuSwitch) {
copyMenuSwitchStream.emit(state.app.copyMenuSwitch)
}
if (oldState.app.framePasteMenuSwitch !== state.app.framePasteMenuSwitch) {
framePasteMenuSwitchStream.emit(state.app.framePasteMenuSwitch)
}
if (oldState.app.chatLastSeen !== state.app.chatLastSeen) {
chatLastSeenStream.emit(state.app.chatLastSeen)
}

View File

@ -1,5 +1,5 @@
// Core App Actions here...
import { UPDATE_BLOCK_INFO, UPDATE_NODE_STATUS, UPDATE_NODE_INFO, CHAT_HEADS, ACCOUNT_INFO, COPY_MENU_SWITCH, PASTE_MENU_SWITCH, FRAME_PASTE_MENU_SWITCH, ADD_AUTO_LOAD_IMAGES_CHAT, REMOVE_AUTO_LOAD_IMAGES_CHAT, ALLOW_QAPP_AUTO_AUTH, REMOVE_QAPP_AUTO_AUTH, SET_CHAT_LAST_SEEN, ADD_CHAT_LAST_SEEN, ALLOW_QAPP_AUTO_LISTS, REMOVE_QAPP_AUTO_LISTS } from '../app-action-types.js'
import { UPDATE_BLOCK_INFO, UPDATE_NODE_STATUS, UPDATE_NODE_INFO, CHAT_HEADS, ACCOUNT_INFO, ADD_AUTO_LOAD_IMAGES_CHAT, REMOVE_AUTO_LOAD_IMAGES_CHAT, ALLOW_QAPP_AUTO_AUTH, REMOVE_QAPP_AUTO_AUTH, SET_CHAT_LAST_SEEN, ADD_CHAT_LAST_SEEN, ALLOW_QAPP_AUTO_LISTS, REMOVE_QAPP_AUTO_LISTS, SET_NEW_TAB, ADD_TAB_INFO, SET_TAB_NOTIFICATIONS } from '../app-action-types.js'
export const doUpdateBlockInfo = (blockObj) => {
return (dispatch, getState) => {
@ -66,46 +66,6 @@ const updateAccountInfo = (payload) => {
}
}
export const doCopyMenuSwitch = (value) => {
return (dispatch, getState) => {
dispatch(copyMenuSwitch(value))
}
}
const copyMenuSwitch = (payload) => {
return {
type: COPY_MENU_SWITCH,
payload
}
}
export const doPasteMenuSwitch = (value) => {
return (dispatch, getState) => {
dispatch(pasteMenuSwitch(value))
}
}
const pasteMenuSwitch = (payload) => {
return {
type: PASTE_MENU_SWITCH,
payload
}
}
export const doFramePasteMenuSwitch = (value) => {
return (dispatch, getState) => {
dispatch(framePasteMenuSwitch(value))
}
}
const framePasteMenuSwitch = (payload) => {
return {
type: FRAME_PASTE_MENU_SWITCH,
payload
}
}
export const addAutoLoadImageChat = (payload) => {
return {
type: ADD_AUTO_LOAD_IMAGES_CHAT,
@ -160,3 +120,23 @@ export const addChatLastSeen = (payload) => {
}
}
export const setNewTab = (payload) => {
return {
type: SET_NEW_TAB,
payload
}
}
export const addTabInfo = (payload) => {
return {
type: ADD_TAB_INFO,
payload
}
}
export const setTabNotifications = (payload) => {
return {
type: SET_TAB_NOTIFICATIONS,
payload
}
}

View File

@ -4,7 +4,9 @@ import { UI_VERSION } from '../version.js'
const nodeConfigUrl = '/getConfig'
const checkNodes = JSON.parse(localStorage.getItem('myQortalNodes'));
const checkNodes = JSON.parse(localStorage.getItem('myQortalNodes'))
const checkMyNode = localStorage.getItem('mySelectedNode')
export const doLoadNodeConfig = () => {
@ -19,7 +21,13 @@ export const doLoadNodeConfig = () => {
knownNodes: [{}],
version: ''
}
nodeConfig.node = data.config.user.node
if (checkMyNode === null || checkMyNode.length === 0) {
localStorage.setItem('mySelectedNode', 0)
nodeConfig.node = localStorage.getItem('mySelectedNode')
} else {
nodeConfig.node = localStorage.getItem('mySelectedNode')
}
if (checkNodes === null || checkNodes.length === 0) {
var saveNode = [];

View File

@ -17,9 +17,6 @@ export const PAGE_URL = 'PAGE_URL'
export const CHAT_HEADS = 'CHAT_HEADS'
export const ACCOUNT_INFO = 'ACCOUNT_INFO'
export const ADD_NEW_PLUGIN_URL = 'ADD_NEW_PLUGIN_URL'
export const COPY_MENU_SWITCH = 'COPY_MENU_SWITCH'
export const PASTE_MENU_SWITCH = 'PASTE_MENU_SWITCH'
export const FRAME_PASTE_MENU_SWITCH = 'FRAME_PASTE_MENU_SWITCH'
export const ADD_AUTO_LOAD_IMAGES_CHAT = 'ADD_AUTO_LOAD_IMAGES_CHAT'
export const REMOVE_AUTO_LOAD_IMAGES_CHAT = 'REMOVE_AUTO_LOAD_IMAGES_CHAT'
export const ALLOW_QAPP_AUTO_AUTH = 'ALLOW_QAPP_AUTO_AUTH'
@ -28,3 +25,6 @@ export const ALLOW_QAPP_AUTO_LISTS = 'ALLOW_QAPP_AUTO_LISTS'
export const REMOVE_QAPP_AUTO_LISTS = 'REMOVE_QAPP_AUTO_LISTS'
export const SET_CHAT_LAST_SEEN = 'SET_CHAT_LAST_SEEN'
export const ADD_CHAT_LAST_SEEN = 'ADD_CHAT_LAST_SEEN'
export const SET_NEW_TAB = 'SET_NEW_TAB'
export const ADD_TAB_INFO = 'ADD_TAB_INFO'
export const SET_TAB_NOTIFICATIONS = 'SET_TAB_NOTIFICATIONS'

View File

@ -1,6 +1,6 @@
// Loading state, login state, isNavDrawOpen state etc. None of this needs to be saved to localstorage.
import { loadStateFromLocalStorage, saveStateToLocalStorage } from '../../localStorageHelpers.js'
import { LOG_IN, LOG_OUT, NETWORK_CONNECTION_STATUS, INIT_WORKERS, ADD_PLUGIN_URL, ADD_PLUGIN, ADD_NEW_PLUGIN_URL, NAVIGATE, SELECT_ADDRESS, ACCOUNT_INFO, CHAT_HEADS, UPDATE_BLOCK_INFO, UPDATE_NODE_STATUS, UPDATE_NODE_INFO, LOAD_NODE_CONFIG, SET_NODE, ADD_NODE, PAGE_URL, COPY_MENU_SWITCH, PASTE_MENU_SWITCH, FRAME_PASTE_MENU_SWITCH, ADD_AUTO_LOAD_IMAGES_CHAT, REMOVE_AUTO_LOAD_IMAGES_CHAT, ALLOW_QAPP_AUTO_AUTH, REMOVE_QAPP_AUTO_AUTH, SET_CHAT_LAST_SEEN, ADD_CHAT_LAST_SEEN, ALLOW_QAPP_AUTO_LISTS, REMOVE_QAPP_AUTO_LISTS } from './app-action-types.js'
import { LOG_IN, LOG_OUT, NETWORK_CONNECTION_STATUS, INIT_WORKERS, ADD_PLUGIN_URL, ADD_PLUGIN, ADD_NEW_PLUGIN_URL, NAVIGATE, SELECT_ADDRESS, ACCOUNT_INFO, CHAT_HEADS, UPDATE_BLOCK_INFO, UPDATE_NODE_STATUS, UPDATE_NODE_INFO, LOAD_NODE_CONFIG, SET_NODE, ADD_NODE, PAGE_URL, ADD_AUTO_LOAD_IMAGES_CHAT, REMOVE_AUTO_LOAD_IMAGES_CHAT, ALLOW_QAPP_AUTO_AUTH, REMOVE_QAPP_AUTO_AUTH, SET_CHAT_LAST_SEEN, ADD_CHAT_LAST_SEEN, ALLOW_QAPP_AUTO_LISTS, REMOVE_QAPP_AUTO_LISTS, SET_NEW_TAB, ADD_TAB_INFO, SET_TAB_NOTIFICATIONS } from './app-action-types.js'
import { initWorkersReducer } from './reducers/init-workers.js'
import { loginReducer } from './reducers/login-reducer.js'
import { setNode, addNode } from './reducers/manage-node.js'
@ -10,6 +10,7 @@ const chatLastSeen = localForage.createInstance({
});
const INITIAL_STATE = {
loggedIn: false,
drawerOpen: false,
@ -43,16 +44,12 @@ const INITIAL_STATE = {
nodeInfo: {},
nodeStatus: {},
pageUrl: '',
copyMenuSwitch: false,
pasteMenuSwitch: false,
framePasteMenuSwitch: {
isOpen: false,
elementId: ''
},
autoLoadImageChats: loadStateFromLocalStorage('autoLoadImageChats') || [],
qAPPAutoAuth: loadStateFromLocalStorage('qAPPAutoAuth') || false,
qAPPAutoLists: loadStateFromLocalStorage('qAPPAutoLists') || false,
chatLastSeen: []
chatLastSeen: [],
newTab: null,
tabInfo: {}
}
export default (state = INITIAL_STATE, action) => {
@ -67,7 +64,8 @@ export default (state = INITIAL_STATE, action) => {
pin: '',
loggedIn: false,
loggingIn: false,
wallet: INITIAL_STATE.wallet
wallet: INITIAL_STATE.wallet,
selectedAddress: INITIAL_STATE.selectedAddress
}
case ADD_PLUGIN:
return {
@ -141,41 +139,26 @@ export default (state = INITIAL_STATE, action) => {
...state,
networkIsConnected: action.payload
}
case COPY_MENU_SWITCH:
return {
...state,
copyMenuSwitch: action.payload
}
case PASTE_MENU_SWITCH:
return {
...state,
pasteMenuSwitch: action.payload
}
case FRAME_PASTE_MENU_SWITCH:
return {
...state,
framePasteMenuSwitch: action.payload
}
case ADD_AUTO_LOAD_IMAGES_CHAT: {
const findChat = state.autoLoadImageChats.findIndex((chat)=> chat === action.payload)
console.log({findChat})
if(findChat !== -1) return state
const findChat = state.autoLoadImageChats.findIndex((chat) => chat === action.payload)
if (findChat !== -1) return state
const updatedState = [...state.autoLoadImageChats, action.payload]
saveStateToLocalStorage('autoLoadImageChats', updatedState)
saveStateToLocalStorage('autoLoadImageChats', updatedState)
return {
...state,
autoLoadImageChats: updatedState
}
}
case REMOVE_AUTO_LOAD_IMAGES_CHAT: {
const updatedState = state.autoLoadImageChats.filter((chat)=> chat !== action.payload)
saveStateToLocalStorage('autoLoadImageChats', updatedState)
const updatedState = state.autoLoadImageChats.filter((chat) => chat !== action.payload)
saveStateToLocalStorage('autoLoadImageChats', updatedState)
return {
...state,
autoLoadImageChats: updatedState
}
}
}
case ALLOW_QAPP_AUTO_AUTH: {
@ -213,23 +196,23 @@ export default (state = INITIAL_STATE, action) => {
return {
...state,
chatLastSeen: action.payload
}
}
}
case ADD_CHAT_LAST_SEEN: {
const chatId = action.payload.key
const timestamp = action.payload.timestamp
if(!chatId || !timestamp) return state
if (!chatId || !timestamp) return state
let newChatLastSeen = [...state.chatLastSeen]
const findChatIndex = state.chatLastSeen.findIndex((chat)=> chat.key === chatId)
if(findChatIndex !== -1){
const findChatIndex = state.chatLastSeen.findIndex((chat) => chat.key === chatId)
if (findChatIndex !== -1) {
newChatLastSeen[findChatIndex] = {
key: chatId,
timestamp,
}
}
if(findChatIndex === -1){
if (findChatIndex === -1) {
newChatLastSeen = [...newChatLastSeen, {
key: chatId,
timestamp,
@ -239,9 +222,50 @@ export default (state = INITIAL_STATE, action) => {
return {
...state,
chatLastSeen: newChatLastSeen
}
}
}
case SET_NEW_TAB: {
return {
...state,
newTab: action.payload
}
}
case ADD_TAB_INFO: {
const newTabInfo = action.payload
if (state.tabInfo[newTabInfo.id] && state.tabInfo[newTabInfo.id].name && newTabInfo.name === state.tabInfo[newTabInfo.id].name) break
return {
...state,
tabInfo: {
...state.tabInfo,
[newTabInfo.id]: {
...newTabInfo,
count: 0
}
}
}
}
case SET_TAB_NOTIFICATIONS: {
const count = action.payload.count
const name = action.payload.name
const newTabInfo = {}
Object.keys(state.tabInfo).forEach((key) => {
const tab = state.tabInfo[key]
if (tab.name == name) {
newTabInfo[key] = {
...tab,
count
}
} else {
newTabInfo[key] = tab
}
})
return {
...state,
tabInfo: newTabInfo
}
}
default:
return state
}

View File

@ -29,6 +29,7 @@ html {
--relaynodetxt: #646464;
--menuhover: #eeeeee;
--menuactive: #ebebeb;
--menuactivergb: 235, 235, 235;
--mainmenutext: #080808;
--mainmenutexthover: #080808;
--switchbackground: #666666;
@ -42,11 +43,13 @@ html {
--nav-icon-color: #080808;
--nav-border-color: #eeeeee;
--nav-border-selected-color: #03a9f4;
--error: #d50000;
--background: url("/img/qortal_background_light_.jpg");
--chatHeadBg: #ebebeb;
--chatHeadBgActive: #ebebeb;
--chatHeadText: #080808;
--chatHeadTextActive: #080808;
--lightChatHeadHover: #1e1f201a;
--group-header: #929292;
--group-drop-shadow: rgb(17 17 26 / 10%) 0px 1px 0px;
--reactions-tooltip-bg: #ffffff;
@ -57,6 +60,10 @@ html {
--gif-button-row-bg: #eaeaef;
--gif-button-row-color: #464040;
--gif-collection-hover-bg: #eaeaefa3;
--app-background-1: #045de9;
--app-background-2: #09c6f9;
--app-icon: #ffffff;
--app-hr: rgba(0, 0, 0, .3);
}
html[theme="dark"] {
@ -90,6 +97,7 @@ html[theme="dark"] {
--relaynodetxt: #d4d4d4;
--menuhover: #008fd5;
--menuactive: #008fd5;
--menuactivergb: 0, 143, 213;
--mainmenutext: #008fd5;
--mainmenutexthover: #0f1a2e;
--switchbackground: #eeeeee;
@ -103,11 +111,13 @@ html[theme="dark"] {
--nav-icon-color: #008fd5;
--nav-border-color: #0b305e;
--nav-border-selected-color: #76c8f5;
--error: #d50000;
--background: url("/img/qortal_background_dark_.jpg");
--chatHeadBg: #008fd5;
--chatHeadBgActive: #0f1a2e;
--chatHeadText: #ffffff;
--chatHeadTextActive: #ffffff;
--lightChatHeadHover: #e0e1e31a;
--group-header: #c8c8c8;
--group-drop-shadow: rgb(191 191 191 / 32%) 0px 1px 0px;
--reactions-tooltip-bg: #161515;
@ -118,4 +128,8 @@ html[theme="dark"] {
--gif-button-row-bg: #82899c;
--gif-button-row-color: #151212;
--gif-collection-hover-bg: #ffffff26;
--app-background-1: #7f5a83;
--app-background-2: #0d324d;
--app-icon: #03a9f4;
--app-hr: rgba(255, 255, 255, .3);
}

View File

@ -1,8 +1,6 @@
import { store } from '../store.js'
import * as api from 'qortal-ui-crypto'
import snackbar from '../functional-components/snackbar.js'
import copyTextMenu from '../functional-components/copy-text-menu.js';
import framePasteMenu from '../functional-components/frame-paste-menu.js';
const createTransaction = api.createTransaction
const processTransaction = api.processTransaction
@ -25,27 +23,6 @@ export const routes = {
return api.request(url, req.data)
},
openCopyTextMenu: async (req) => {
const textMenuObject = {
selectedText: req.data.selectedText,
eventObject: req.data.eventObject,
isFrame: req.data.isFrame,
};
copyTextMenu.open(textMenuObject);
},
closeCopyTextMenu: async (req) => {
copyTextMenu.close();
},
openFramePasteMenu: async (req) => {
framePasteMenu.open(req.data);
},
closeFramePasteMenu: async (req) => {
framePasteMenu.close();
},
transaction: async (req) => {
let response
try {

View File

@ -161,7 +161,7 @@ const PROXY_URL = "/proxy/"
// Chat reference timestamp
const CHAT_REFERENCE_FEATURE_TRIGGER_TIMESTAMP = 1674316800000
// Used as a salt for all qora addresses. Salts used for storing your private keys in local storage will be randomly generated
// Used as a salt for all Qora addresses. Salts used for storing your private keys in local storage will be randomly generated
const STATIC_SALT = new Uint8Array([54, 190, 201, 206, 65, 29, 123, 129, 147, 231, 180, 166, 171, 45, 95, 165, 78, 200, 208, 194, 44, 207, 221, 146, 45, 238, 68, 68, 69, 102, 62, 6])
const BCRYPT_ROUNDS = 10 // Remember that the total work spent on key derivation is BCRYPT_ROUNDS * KDF_THREADS
const BCRYPT_VERSION = "2a"

View File

@ -1,23 +1,32 @@
import Base58 from './deps/Base58.js'
import { kdf } from './kdf.js'
import { HmacSha512, AES_CBC } from 'asmcrypto.js'
import { use, get, translate, translateUnsafeHTML, registerTranslateConfig } from 'lit-translate'
registerTranslateConfig({
loader: lang => fetch(`/language/${lang}.json`).then(res => res.json())
})
export const decryptStoredWallet = async (password, wallet, statusFn = () => { }) => {
statusFn('Decoding saved data')
const sfn1 = get("login.lp12")
statusFn(sfn1)
const encryptedSeedBytes = Base58.decode(wallet.encryptedSeed)
const iv = Base58.decode(wallet.iv)
const salt = Base58.decode(wallet.salt)
statusFn('Generating decryption key')
const sfn2 = get("login.lp13")
statusFn(sfn2)
const key = await kdf(password, salt, statusFn)
const encryptionKey = key.slice(0, 32)
const macKey = key.slice(32, 63)
statusFn('Checking key')
const sfn3 = get("login.lp14")
statusFn(sfn3)
const mac = new HmacSha512(macKey).process(encryptedSeedBytes).finish().result
const sfn4 = get("login.lp15")
if (Base58.encode(mac) !== wallet.mac) {
throw new Error('Incorrect password')
throw new Error(sfn4)
}
statusFn('Decrypting')
const sfn5 = get("login.lp16")
statusFn(sfn5)
const decryptedBytes = AES_CBC.decrypt(encryptedSeedBytes, encryptionKey, false, iv)
return decryptedBytes
}

View File

@ -2,14 +2,21 @@ import { store } from '../api_deps.js'
import { stateAwait } from './utils/stateAwait.js'
import { Sha512 } from 'asmcrypto.js'
import utils from '../api/deps/utils.js'
import { use, get, translate, translateUnsafeHTML, registerTranslateConfig } from 'lit-translate'
registerTranslateConfig({
loader: lang => fetch(`/language/${lang}.json`).then(res => res.json())
})
export const kdf = async (seed, salt, status = () => { }) => {
const state = store.getState()
const config = state.config
const workers = state.app.workers.workers
status('Waiting for workers to be ready')
const kst1 = get("login.lp17")
status(kst1)
await stateAwait(state => state.app.workers.ready)
status('Deriving key parts')
const kst2 = get("login.lp18")
status(kst2)
salt = new Uint8Array(salt)
const seedParts = await Promise.all(workers.map((worker, index) => {
const nonce = index
@ -27,13 +34,17 @@ export const kdf = async (seed, salt, status = () => { }) => {
} catch (e) {
// ...
}
if (seed !== data.key) throw new Error('Error, incorrect key. ' + seed + ' !== ' + data.key)
if (nonce !== data.nonce) throw new Error('Error, incorrect nonce')
const kst3 = get("login.lp19")
if (seed !== data.key) throw new Error(kst3 + seed + ' !== ' + data.key)
const kst4 = get("login.lp20")
if (nonce !== data.nonce) throw new Error(kst4)
return data.result
})
}))
status('Combining key parts')
const kst5 = get("login.lp21")
status(kst5)
const result = new Sha512().process(utils.stringtoUTF8Array(config.crypto.staticSalt + seedParts.reduce((a, c) => a + c))).finish().result
status('Key is ready ')
const kst6 = get("login.lp22")
status(kst6)
return result
}

View File

@ -1,136 +1,138 @@
appId: "org.qortal.QortalUI"
productName: "Qortal UI"
copyright: "Copyright © 2021 - 2023 Qortal"
# forceCodeSigning: false
# nodeGypRebuild: false
compression: normal
asar: true
afterPack: "./scripts/afterPack.js"
afterSign: "./scripts/notarize.js"
files:
- from: "."
to: "."
filter:
- "electron.js"
- "img/"
- "node_modules/"
- "server.js"
- "package.json"
- "builtWWW/"
- "config/"
- "scripts/"
- "build/"
- "lib/*.js"
- "locales/*.json"
- "splash/"
- "crypto/"
- "core/"
- "plugins/"
# Mac OS configuration
mac:
icon: "./img/icons/icns/256x256.icns"
hardenedRuntime: true
gatekeeperAssess: false
entitlements: "./build/entitlements.mac.plist"
entitlementsInherit: "./build/entitlements.mac.plist"
category: "public.app-category.utilities"
asarUnpack: "**/*.node"
target:
- { target: dmg }
- { target: pkg }
# Config for OSX dmg
dmg:
sign: false
artifactName: "Qortal-Setup-macOS.${ext}"
icon: "./img/icons/icns/256x256.icns"
iconSize: 100
contents:
- x: 130
y: 220
- x: 410
y: 220
type: "link"
path: "/Applications"
# Config for OSX pkg
pkg:
artifactName: "Qortal-Setup-macOS.${ext}"
installLocation: "/Applications"
background: {
file: "./build/logo.png",
alignment: "bottomleft",
scaling: "none"
}
allowAnywhere: true
allowCurrentUserHome: true
allowRootDirectory: true
isVersionChecked: true
isRelocatable: false
overwriteAction: "upgrade"
# Windows configuration
win:
legalTrademarks: "QORTAL.ORG"
icon: "./img/icons/ico/256x256.ico"
target:
- "nsis"
# Config for the windows installer
nsis:
artifactName: "Qortal-Setup-win64.${ext}"
oneClick: false
perMachine: false
installerSidebar: "./img/win-installer-sidebar.bmp"
uninstallerSidebar: "./img/win-uninstaller-sidebar.bmp"
runAfterFinish: true
deleteAppDataOnUninstall: true
createDesktopShortcut: true
createStartMenuShortcut: true
# Linux configuration
linux:
icon: "./img/icons/png/"
category: "Network"
packageCategory: "Network"
desktop:
StartupWMClass: qortal-ui
executableArgs:
- --no-sandbox
- '--js-flags="--max-old-space-size=3584"'
target:
- "deb"
- "AppImage"
deb:
artifactName: "Qortal-Setup-arm64.${ext}"
synopsis: "Qortal UI for Linux"
afterInstall: "./scripts/add-debian-apt-repo.sh"
afterRemove: "./scripts/uninstall-debian-conf.sh"
appImage:
artifactName: "Qortal-Setup-arm64.${ext}"
snap:
artifactName: "Qortal-Setup-amd64.${ext}"
synopsis: "Qortal UI for Linux"
rpm:
artifactName: "Qortal-Setup-amd64.${ext}"
directories:
output: dist
buildResources: "./build/"
publish:
provider: github
owner: Qortal
repo: qortal-ui
appId: "org.qortal.QortalUI"
productName: "Qortal UI"
copyright: "Copyright © 2021 - 2023 Qortal"
# forceCodeSigning: false
# nodeGypRebuild: false
compression: normal
asar: true
afterPack: "./scripts/afterPack.js"
afterSign: "./scripts/notarize.js"
files:
- from: "."
to: "."
filter:
- "electron.js"
- "img/"
- "node_modules/"
- "server.js"
- "package.json"
- "builtWWW/"
- "config/"
- "scripts/"
- "build/"
- "lib/*.js"
- "locales/*.json"
- "splash/"
- "crypto/"
- "core/"
- "plugins/"
# Mac OS configuration
mac:
icon: "./img/icons/icns/256x256.icns"
hardenedRuntime: true
gatekeeperAssess: false
entitlements: "./build/entitlements.mac.plist"
entitlementsInherit: "./build/entitlements.mac.plist"
category: "public.app-category.utilities"
asarUnpack: "**/*.node"
target:
- { target: dmg }
- { target: pkg }
# Config for OSX dmg
dmg:
sign: false
artifactName: "Qortal-Setup-macOS.${ext}"
icon: "./img/icons/icns/256x256.icns"
iconSize: 100
contents:
- x: 130
y: 220
- x: 410
y: 220
type: "link"
path: "/Applications"
# Config for OSX pkg
pkg:
artifactName: "Qortal-Setup-macOS.${ext}"
installLocation: "/Applications"
background: {
file: "./build/logo.png",
alignment: "bottomleft",
scaling: "none"
}
allowAnywhere: true
allowCurrentUserHome: true
allowRootDirectory: true
isVersionChecked: true
isRelocatable: false
overwriteAction: "upgrade"
# Windows configuration
win:
legalTrademarks: "QORTAL.ORG"
icon: "./img/icons/ico/256x256.ico"
target:
- "nsis"
- "portable"
# Config for the windows installer
nsis:
artifactName: "Qortal-Setup-win64.${ext}"
oneClick: false
perMachine: true
installerSidebar: "./img/win-installer-sidebar.bmp"
uninstallerSidebar: "./img/win-uninstaller-sidebar.bmp"
runAfterFinish: true
deleteAppDataOnUninstall: true
createDesktopShortcut: true
createStartMenuShortcut: true
# Linux configuration
linux:
icon: "./img/icons/png/"
category: "Network"
packageCategory: "Network"
desktop:
StartupWMClass: qortal-ui
executableArgs:
- --no-sandbox
target:
- "deb"
- "AppImage"
- "snap"
- "rpm"
deb:
artifactName: "Qortal-Setup-amd64.${ext}"
synopsis: "Qortal UI for Linux"
afterInstall: "./scripts/add-debian-apt-repo.sh"
afterRemove: "./scripts/uninstall-debian-conf.sh"
appImage:
artifactName: "Qortal-Setup-amd64.${ext}"
snap:
artifactName: "Qortal-Setup-amd64.${ext}"
synopsis: "Qortal UI for Linux"
rpm:
artifactName: "Qortal-Setup-amd64.${ext}"
directories:
output: dist
buildResources: "./build/"
publish:
provider: github
owner: Qortal
repo: qortal-ui

View File

@ -1,10 +1,25 @@
const { app, BrowserWindow, ipcMain, ipcRenderer, Menu, Notification, Tray, nativeImage, dialog, webContents, nativeTheme } = require('electron')
const {
app,
BrowserWindow,
ipcMain,
ipcRenderer,
Menu,
Notification,
Tray,
nativeImage,
dialog,
webContents,
nativeTheme,
crashReporter
} = require('electron')
const { autoUpdater } = require('electron-updater')
const server = require('./server.js')
const log = require('electron-log')
const path = require('path')
const i18n = require('./lib/i18n.js')
const fs = require('fs')
const os = require("os")
const electronDl = require('electron-dl')
const Store = require('electron-store')
const extract = require('extract-zip')
@ -12,31 +27,70 @@ const fetch = require('node-fetch')
const execFile = require('child_process').execFile
const exec = require('child_process').exec
const spawn = require('child_process').spawn
const homePath = app.getPath('home')
const downloadPath = app.getPath('downloads')
const logPath = app.getPath('logs')
const debugFileUnix = logPath + '/qortal-ui.log'
const debugFileWin = logPath + '\\qortal-ui.log'
const myMemory = os.totalmem()
const store = new Store()
crashReporter.start({
productName: 'Qortal-UI',
uploadToServer: false
})
if (myMemory > 16000000000) {
app.commandLine.appendSwitch('js-flags', '--max-old-space-size=8192')
log.info("Memory Size Is 16GB Using JS Memory Heap Size 8GB")
} else if (myMemory > 12000000000) {
app.commandLine.appendSwitch('js-flags', '--max-old-space-size=6144')
log.info("Memory Size Is 12GB Using JS Memory Heap Size 6GB")
} else if (myMemory > 7000000000) {
app.commandLine.appendSwitch('js-flags', '--max-old-space-size=4096')
log.info("Memory Size Is 8GB Using JS Memory Heap Size 4GB")
} else {
app.commandLine.appendSwitch('js-flags', '--max-old-space-size=2048')
log.info("Memory Size Is 4GB Using JS Memory Heap Size 2GB")
}
if (process.arch === 'arm') {
app.disableHardwareAcceleration()
app.commandLine.appendSwitch('enable-experimental-web-platform-features')
log.info('We are on 32bit. Hardware Acceleration is disabled !')
} else {
app.commandLine.appendSwitch('enable-experimental-web-platform-features')
app.commandLine.appendSwitch('disable-renderer-backgrounding')
app.commandLine.appendSwitch('disable-http-cache')
log.info('We are on 64bit. Hardware Acceleration is enabled !')
}
if (process.platform === 'win32') {
app.commandLine.appendSwitch('log-file', debugFileWin)
app.commandLine.appendSwitch('enable-logging')
} else {
app.commandLine.appendSwitch('log-file', debugFileUnix)
app.commandLine.appendSwitch('enable-logging')
}
app.commandLine.appendSwitch('enable-experimental-web-platform-features')
app.disableHardwareAcceleration()
app.enableSandbox()
electronDl()
process.env['APP_PATH'] = app.getAppPath()
const homePath = app.getPath('home')
const downloadPath = app.getPath('downloads')
const store = new Store()
autoUpdater.autoDownload = false
autoUpdater.autoInstallOnAppQuit = false
autoUpdater.logger = log
autoUpdater.logger.transports.file.level = 'info'
if(!store.has('askingCore')) {
if (!store.has('askingCore')) {
store.set('askingCore', false)
}
log.info('App starting...')
log.info('App Platform is', process.platform)
log.info('Platform arch is', process.arch)
log.info("ASKING CORE", store.get('askingCore'))
log.info("Memory Size", os.totalmem())
const winjar = String.raw`C:\Program Files\Qortal\qortal.jar`
const winurl = "https://github.com/Qortal/qortal/releases/latest/download/qortal.exe"
@ -78,6 +132,8 @@ const macjavaaarch64file = homePath + "/openjdk-17.0.2_macos-aarch64_bin.zip"
const macjavaaarch64bindir = homePath + "/jdk-17.0.2/Contents/Home/bin"
const macjavaaarch64binfile = homePath + "/jdk-17.0.2/Contents/Home/bin/java"
let win = BrowserWindow.getFocusedWindow();
const isRunning = (query, cb) => {
let platform = process.platform
let cmd = ''
@ -203,29 +259,29 @@ async function checkResponseStatus(res) {
async function javaversion() {
var stderrChunks = []
let checkJava = await spawn('java', ['-version'],{shell: true})
let checkJava = await spawn('java', ['-version'], { shell: true })
if (process.platform === 'linux') {
if (process.arch === 'x64') {
if (fs.existsSync(linjavax64bindir)) {
checkJava = await spawn(linjavax64binfile, ['-version'],{cwd: homePath, shell: true, maxBuffer: Infinity})
checkJava = await spawn(linjavax64binfile, ['-version'], { cwd: homePath, shell: true, maxBuffer: Infinity })
}
} else if (process.arch === 'arm64') {
if (fs.existsSync(linjavaarm64bindir)) {
checkJava = await spawn(linjavaarm64binfile, ['-version'],{cwd: homePath, shell: true, maxBuffer: Infinity})
checkJava = await spawn(linjavaarm64binfile, ['-version'], { cwd: homePath, shell: true, maxBuffer: Infinity })
}
} else if (process.arch === 'arm') {
if (fs.existsSync(linjavaarmbindir)) {
checkJava = await spawn(linjavaarmbinfile, ['-version'],{cwd: homePath, shell: true, maxBuffer: Infinity})
checkJava = await spawn(linjavaarmbinfile, ['-version'], { cwd: homePath, shell: true, maxBuffer: Infinity })
}
}
} else if (process.platform === 'darwin') {
if (process.arch === 'x64') {
if (fs.existsSync(macjavax64bindir)) {
checkJava = await spawn(macjavax64binfile, ['-version'],{cwd: homePath, shell: true, maxBuffer: Infinity})
checkJava = await spawn(macjavax64binfile, ['-version'], { cwd: homePath, shell: true, maxBuffer: Infinity })
}
} else {
if (fs.existsSync(macjavaaarch64bindir)) {
checkJava = await spawn(macjavaaarch64file, ['-version'],{cwd: homePath, shell: true, maxBuffer: Infinity})
checkJava = await spawn(macjavaaarch64file, ['-version'], { cwd: homePath, shell: true, maxBuffer: Infinity })
}
}
}
@ -706,7 +762,7 @@ const editMenu = Menu.buildFromTemplate([
{
label: "Qortal",
submenu: [
{ label: "Quit", click() {app.quit()}}
{ label: "Quit", click() { app.quit() } }
]
},
{
@ -748,7 +804,7 @@ const editMenu = Menu.buildFromTemplate([
]
},
{
label: "Check for update", click() {autoUpdater.checkForUpdatesAndNotify()}
label: "Check for update", click() { autoUpdater.checkForUpdatesAndNotify() }
}
])
@ -768,7 +824,7 @@ function createWindow() {
autoHideMenuBar: true,
webPreferences: {
partition: 'persist:webviewsession',
nodeIntegration: false,
nodeIntegration: true,
contextIsolation: true,
enableRemoteModule: false,
allowRunningInsecureContent: false,
@ -800,6 +856,51 @@ function createWindow() {
})
}
let newWindow = null
function createNewWindow() {
newWindow = new BrowserWindow({
backgroundColor: '#eee',
width: 1280,
height: 720,
minWidth: 700,
minHeight: 640,
icon: path.join(__dirname + '/img/icons/png/256x256.png'),
title: "Qortal UI New Instance",
autoHideMenuBar: true,
webPreferences: {
partition: 'persist:webviewsession',
nodeIntegration: true,
contextIsolation: true,
enableRemoteModule: false,
allowRunningInsecureContent: false,
experimentalFeatures: false,
preload: path.join(__dirname, '/lib/preload.js')
},
show: false
})
newWindow.show()
newWindow.loadURL('http://localhost:12388/app/wallet')
newWindow.on('closed', function () {
newWindow = null
})
newWindow.on('minimize', function (event) {
event.preventDefault()
newWindow.hide()
})
ipcMain.handle('dark-mode:toggle', () => {
if (nativeTheme.shouldUseDarkColors) {
nativeTheme.themeSource = 'light'
} else {
nativeTheme.themeSource = 'dark'
}
return nativeTheme.shouldUseDarkColors
})
ipcMain.handle('dark-mode:system', () => {
nativeTheme.themeSource = 'system'
})
}
const createTray = () => {
let myTray = new Tray(path.join(__dirname + '/img/icons/png/tray/tray.png'))
const contextMenu = Menu.buildFromTemplate([
@ -931,8 +1032,62 @@ if (!isLock) {
})
})
ipcMain.on('check-for-update', (event) => {
const check = new Notification({
title: i18n.__("electron_translate_43"),
body: i18n.__("electron_translate_44")
})
check.show()
autoUpdater.checkForUpdatesAndNotify()
})
ipcMain.on('show-my-menu', (event) => {
let homePageOptions = Menu.buildFromTemplate([
{
label: i18n.__("electron_translate_35"),
role: 'copy'
},
{
label: i18n.__("electron_translate_36"),
role: 'paste'
},
{
type: "separator"
},
{
label: i18n.__("electron_translate_37"),
submenu: [
{
label: i18n.__("electron_translate_38"),
role: 'zoomIn'
},
{
label: i18n.__("electron_translate_39"),
role: 'zoomOut'
},
{
label: i18n.__("electron_translate_40"),
role: 'resetZoom'
},
{
type: 'separator'
},
{
label: i18n.__("electron_translate_41"),
role: 'togglefullscreen'
}
]
},
{
type: "separator"
},
{
label: i18n.__("electron_translate_42"),
click: function () {
createNewWindow()
},
}
])
homePageOptions.popup(myWindow)
})
autoUpdater.on('update-available', (event) => {
const downloadOpts = {
type: 'info',
@ -954,11 +1109,7 @@ if (!isLock) {
})
})
autoUpdater.on('update-not-available', (event) => {
const noUpdate = new Notification({
title: 'Checking for update',
body: 'No update available, you are on latest version.'
})
noUpdate.show()
log.info("NO UPDATE")
})
autoUpdater.on('download-progress', (progressObj) => {
myWindow.webContents.send('downloadProgress', progressObj)
@ -986,7 +1137,15 @@ if (!isLock) {
})
n.show()
})
ipcMain.on('focus-app', (event) => {
if (myWindow.isMinimized()) {
myWindow.restore()
}
myWindow.maximize()
myWindow.focus()
})
process.on('uncaughtException', function (err) {
log.info("*** WHOOPS TIME ***" + err)
})
}
}

BIN
img/arrow.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

BIN
img/qortal-lock.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 53 KiB

View File

@ -2,5 +2,7 @@ const { contextBridge, ipcRenderer } = require('electron')
contextBridge.exposeInMainWorld('electronAPI', {
setStartCore: () => ipcRenderer.send('set-start-core'),
checkForUpdate: () => ipcRenderer.send('check-for-update')
checkForUpdate: () => ipcRenderer.send('check-for-update'),
showMyMenu: () => ipcRenderer.send('show-my-menu'),
focusApp: () => ipcRenderer.send('focus-app'),
})

View File

@ -33,5 +33,16 @@
"electron_translate_30": "ОТКАЗ",
"electron_translate_31": "Стартиране на основните настройки",
"electron_translate_32": "Промяна на текущото състояние на запитване за стартиране на ядрото, ако то не работи",
"electron_translate_33": "(Поставете отметка или премахнете отметката от квадратчето никога повече да не ме питате)"
"electron_translate_33": "(Поставете отметка или премахнете отметката от квадратчето никога повече да не ме питате)",
"electron_translate_34": "Настройки",
"electron_translate_35": "Копиране",
"electron_translate_36": "Поставяне",
"electron_translate_37": "Преглед",
"electron_translate_38": "Увеличаване",
"electron_translate_39": "Намаляване",
"electron_translate_40": "Действителен размер",
"electron_translate_41": "Превключване на цял екран",
"electron_translate_42": "Нов потребителски интерфейс",
"electron_translate_43": "Проверява се за актуализация!",
"electron_translate_44": "Потребителският интерфейс проверява във фонов режим дали е налична нова версия и я изтегля."
}

View File

@ -1,5 +1,5 @@
{
"__locale_name__": "Deutsch, Deutschland",
"__locale_name__": "Deutsch",
"electron_translate_1": "Qortal-UI anzeigen",
"electron_translate_2": "Beenden",
@ -34,5 +34,15 @@
"electron_translate_31": "Core-Einstellungen starten",
"electron_translate_32": "Ändern Sie den aktuellen Status der Aufforderung, den Core zu starten, wenn er nicht läuft",
"electron_translate_33": "(Aktivieren oder deaktivieren Sie das Kontrollkästchen Frag mich nie wieder)",
"electron_translate_34": "Einstellungen"
"electron_translate_34": "Einstellungen",
"electron_translate_35": "Kopieren",
"electron_translate_36": "Einfügen",
"electron_translate_37": "Ansicht",
"electron_translate_38": "Vergrößern",
"electron_translate_39": "Herauszoomen",
"electron_translate_40": "Tatsächliche Größe",
"electron_translate_41": "Vollbild umschalten",
"electron_translate_42": "Neue UI-Instanz",
"electron_translate_43": "Suche nach Updates!",
"electron_translate_44": "Die Benutzeroberfläche prüft im Hintergrund, ob eine neue Version verfügbar ist, und lädt sie herunter."
}

View File

@ -34,5 +34,15 @@
"electron_translate_31": "Start Core Settings",
"electron_translate_32": "Change the current status of asking to start the core if it is not running",
"electron_translate_33": "(Check or Uncheck the never ask me again checkbox)",
"electron_translate_34": "Settings"
"electron_translate_34": "Settings",
"electron_translate_35": "Copy",
"electron_translate_36": "Paste",
"electron_translate_37": "View",
"electron_translate_38": "Zoom In",
"electron_translate_39": "Zoom Out",
"electron_translate_40": "Actual Size",
"electron_translate_41": "Toggle Full Screen",
"electron_translate_42": "New UI Instance",
"electron_translate_43": "Checking for update !",
"electron_translate_44": "UI is checking in background if a new version is available and download it."
}

View File

@ -1,5 +1,5 @@
{
"__locale_name__": "español",
"__locale_name__": "Español",
"electron_translate_1": "Mostrar interfaz de usuario de Qortal",
"electron_translate_2": "Salir",
@ -33,5 +33,16 @@
"electron_translate_30": "CANCELAR",
"electron_translate_31": "Iniciar configuración básica",
"electron_translate_32": "Cambiar el estado actual de solicitar iniciar el núcleo si no se está ejecutando",
"electron_translate_33": "(Marque o desmarque la casilla de verificación Nunca volver a preguntarme)"
"electron_translate_33": "(Marque o desmarque la casilla de verificación Nunca volver a preguntarme)",
"electron_translate_34": "Configuración",
"electron_translate_35": "Copiar",
"electron_translate_36": "Pegar",
"electron_translate_37": "Ver",
"electron_translate_38": "Acercar",
"electron_translate_39": "Alejar",
"electron_translate_40": "Tamaño real",
"electron_translate_41": "Alternar pantalla completa",
"electron_translate_42": "Nueva instancia de UI",
"electron_translate_43": "¡Buscando actualizaciones!",
"electron_translate_44": "La interfaz de usuario está verificando en segundo plano si hay una nueva versión disponible y descárgala."
}

View File

@ -33,5 +33,16 @@
"electron_translate_30": "ANNULER",
"electron_translate_31": "Démarrer les paramètres de base",
"electron_translate_32": "Modifier l'état actuel de la demande de démarrage du noyau s'il n'est pas en cours d'exécution",
"electron_translate_33": "(Cochez ou décochez la case Ne plus jamais me demander)"
"electron_translate_33": "(Cochez ou décochez la case Ne plus jamais me demander)",
"electron_translate_34": "Paramètres",
"electron_translate_35": "Copier",
"electron_translate_36": "Coller",
"electron_translate_37": "Voir",
"electron_translate_38": "Zoom avant",
"electron_translate_39": "Zoom arrière",
"electron_translate_40": "Taille réelle",
"electron_translate_41": "Basculer en plein écran",
"electron_translate_42": "Nouvelle instance d' UI",
"electron_translate_43": "Vérification de la mise à jour !",
"electron_translate_44": "L'interface utilisateur vérifie en arrière-plan si une nouvelle version est disponible et la télécharge."
}

48
locales/hi.json Normal file
View File

@ -0,0 +1,48 @@
{
"__locale_name__": "हिंदी",
"electron_translate_1": "क्यूर्टल यूआई दिखाएँ",
"electron_translate_2": "बाहर निकलें",
"electron_translate_3": "अद्यतन उपलब्ध",
"electron_translate_4": "एक नया Qortal UI संस्करण उपलब्ध है। आप इसे डाउनलोड करना चाहते हैं?",
"electron_translate_5": "अभी स्थापित करें",
"electron_translate_6": "शायद बाद में",
"electron_translate_7": "अद्यतन स्थापित करने के लिए तैयार",
"electron_translate_8": "एक नया Qortal UI संस्करण डाउनलोड किया जा चुका है।",
"electron_translate_9": "अपडेट लागू करने के लिए अभी इंस्टॉल करें क्लिक करें, शायद बाद में UI अपडेट न करने के लिए।",
"electron_translate_10": "अस्थायी अद्यतन विफल, बाद में पुनः प्रयास करेंगे",
"electron_translate_11": "अद्यतन डाउनलोड करें",
"electron_translate_12": "इसे पृष्ठभूमि में ⌛️ डाउनलोड किया जाएगा!",
"electron_translate_13": "START QORTAL CORE",
"electron_translate_14": "धन्यवाद नहीं",
"electron_translate_15": "कोरटल कोर इस सिस्टम पर नहीं चल रहा है",
"electron_translate_16": "Qortal UI ने पता लगाया है कि Qortal Core इस सिस्टम पर नहीं चल रहा है",
"electron_translate_17": "इस सिस्टम पर कोरटल कोर शुरू करने के लिए स्टार्ट क्वॉर्टल कोर पर क्लिक करें या इस सिस्टम को शुरू करने के लिए नो थैंक्स पर क्लिक करें",
"electron_translate_18": "क्वार्टल कोर डाउनलोड करें",
"electron_translate_19": "धन्यवाद नहीं",
"electron_translate_20": "कोरटल कोर का पता नहीं चला",
"electron_translate_21": "Qortal UI ने पता लगाया है कि Qortal Core इस सिस्टम पर (डिफ़ॉल्ट स्थान पर) स्थापित नहीं है।",
"electron_translate_22": "कोर (डिफ़ॉल्ट स्थान पर) डाउनलोड और इंस्टॉल करने के लिए QORTAL CORE डाउनलोड करें पर क्लिक करें या डाउनलोड और इंस्टॉल करने के लिए NO THANKS पर क्लिक करें।",
"electron_translate_23": "जावा डाउनलोड करें",
"electron_translate_24": "धन्यवाद नहीं",
"electron_translate_25": "जावा स्थापित नहीं है।",
"electron_translate_26": "Qortal UI ने पता लगाया है कि जावा आपके सिस्टम पर संस्थापित नहीं है।",
"electron_translate_27": "जावा डाउनलोड और इंस्टॉल करने के लिए डाउनलोड जावा पर क्लिक करें या इसे डाउनलोड और इंस्टॉल न करने के लिए NO THANKS पर क्लिक करें।",
"electron_translate_28": "मुझसे फिर कभी न पूछें",
"electron_translate_29": "सेटिंग बदलें",
"electron_translate_30": "रद्द करें",
"electron_translate_31": "कोर सेटिंग्स प्रारंभ करें",
"electron_translate_32": "यदि कोर नहीं चल रहा है तो उसे चालू करने के लिए कहने की वर्तमान स्थिति बदलें",
"electron_translate_33": "(मुझे फिर कभी न पूछें चेकबॉक्स को चेक या अनचेक करें)",
"electron_translate_34": "सेटिंग्स",
"electron_translate_35": "प्रतिलिपि",
"electron_translate_36": "पेस्ट करें",
"electron_translate_37": "देखें",
"electron_translate_38": "ज़ूम इन",
"electron_translate_39": "ज़ूम आउट",
"electron_translate_40": "वास्तविक आकार",
"electron_translate_41": "पूरी स्क्रीन को टॉगल करें",
"electron_translate_42": "नया UI उदाहरण",
"electron_translate_43": "अपडेट के लिए जाँच हो रही है!",
"electron_translate_44": "यूआई पृष्ठभूमि में जांच कर रहा है कि नया संस्करण उपलब्ध है या नहीं और इसे डाउनलोड करें।"
}

48
locales/hr.json Normal file
View File

@ -0,0 +1,48 @@
{
"__locale_name__": "Hrvatski",
"electron_translate_1": "Prikaži Qortal UI",
"electron_translate_2": "Odustani",
"electron_translate_3": "Dostupno ažuriranje",
"electron_translate_4": "Dostupna je nova verzija korisničkog sučelja Qortal. Želite li je preuzeti?",
"electron_translate_5": "INSTALIRAJ SADA",
"electron_translate_6": "MOŽDA KASNIJE",
"electron_translate_7": "Ažuriranje spremno za instalaciju",
"electron_translate_8": "Nova verzija korisničkog sučelja Qortal je preuzeta.",
"electron_translate_9": "Kliknite INSTALIRAJ SADA da primijenite ažuriranje, MOŽDA KASNIJE da ne ažurirate UI.",
"electron_translate_10": "Privremeno ažuriranje nije uspjelo, pokušat ćemo ponovno kasnije",
"electron_translate_11": "PREUZMI AŽURIRANJE",
"electron_translate_12": "Bit će preuzet ⌛️ u pozadini!",
"electron_translate_13": "POKRENI QORTAL CORE",
"electron_translate_14": "NE HVALA",
"electron_translate_15": "Qortal Core NE radi na ovom sustavu",
"electron_translate_16": "Qortal UI je otkrio da Qortal Core NE radi na ovom sustavu",
"electron_translate_17": "Kliknite POKRENI QORTAL CORE da pokrenete Qortal Core na ovom sustavu ILI kliknite NE, HVALA da preskočite pokretanje na ovom sustavu",
"electron_translate_18": "PREUZMI QORTAL CORE",
"electron_translate_19": "NE HVALA",
"electron_translate_20": "Qortal Core NIJE otkriven",
"electron_translate_21": "Qortal UI je otkrio da Qortal Core NIJE instaliran (na zadanoj lokaciji) na ovom sustavu.",
"electron_translate_22": "Kliknite PREUZMI QORTAL CORE da preuzmete i instalirate jezgru (na zadanu lokaciju) ILI kliknite NE, HVALA da preskočite preuzimanje i instalaciju.",
"electron_translate_23": "PREUZMI JAVA",
"electron_translate_24": "NE HVALA",
"electron_translate_25": "Java nije instalirana.",
"electron_translate_26": "Qortal UI je otkrio da java nije instalirana na vašem sustavu.",
"electron_translate_27": "Kliknite na PREUZMI JAVA da preuzmete i instalirate Javu ili na NE HVALA da je ne preuzmete i instalirate.",
"electron_translate_28": "Nikad me više ne pitaj",
"electron_translate_29": "PROMIJENI POSTAVKU",
"electron_translate_30": "OTKAZI",
"electron_translate_31": "Pokreni osnovne postavke",
"electron_translate_32": "Promijeni trenutni status traženja pokretanja jezgre ako ne radi",
"electron_translate_33": "(Označite ili poništite potvrdni okvir nikad me više ne pitaj)",
"electron_translate_34": "Postavke",
"electron_translate_35": "Kopiraj",
"electron_translate_36": "Zalijepi",
"electron_translate_37": "Prikaz",
"electron_translate_38": "Uvećaj",
"electron_translate_39": "Smanji",
"electron_translate_40": "Stvarna veličina",
"electron_translate_41": "Prebaci preko cijelog zaslona",
"electron_translate_42": "Nova instanca korisničkog sučelja",
"electron_translate_43": "Provjera ažuriranja!",
"electron_translate_44": "UI provjerava u pozadini je li nova verzija dostupna i preuzima je."
}

48
locales/hu.json Normal file
View File

@ -0,0 +1,48 @@
{
"__locale_name__": "Magyar",
"electron_translate_1": "Qortal felhasználói felület megjelenítése",
"electron_translate_2": "Kilépés",
"electron_translate_3": "Frissítés elérhető",
"electron_translate_4": "Elérhető egy új Qortal UI verzió. Le szeretné tölteni?",
"electron_translate_5": "TELEPÍTÉS MOST",
"electron_translate_6": "TALÁN KÉSŐBB",
"electron_translate_7": "Frissítés készen áll a telepítésre",
"electron_translate_8": "A Qortal felhasználói felület új verziója letöltődött.",
"electron_translate_9": "Kattintson a TELEPÍTÉS MOST gombra a frissítés alkalmazásához, TALÁN KÉSŐBB, ha nem szeretné frissíteni a felhasználói felületet.",
"electron_translate_10": "Ideiglenes frissítési hiba, később újra megpróbálom",
"electron_translate_11": "FRISSÍTÉS LETÖLTÉSE",
"electron_translate_12": "A háttérben lesz letöltve ⌛️!",
"electron_translate_13": "START QORTAL CORE",
"electron_translate_14": "NO KÖSZÖNÖM",
"electron_translate_15": "A Qortal Core NEM fut ezen a rendszeren",
"electron_translate_16": "A Qortal UI azt észlelte, hogy a Qortal Core NEM fut ezen a rendszeren",
"electron_translate_17": "Kattintson a QORTAL CORE INDÍTÁSA lehetőségre a Qortal Core elindításához ezen a rendszeren, VAGY kattintson a NEM KÖSZÖNÖM gombra, ha kihagyja az indítást ezen a rendszeren",
"electron_translate_18": "QORTAL CORE LETÖLTÉSE",
"electron_translate_19": "NO KÖSZÖNÖM",
"electron_translate_20": "Nincs észlelve a Qortal Core",
"electron_translate_21": "A Qortal UI azt észlelte, hogy a Qortal Core NINCS telepítve (az alapértelmezett helyen) ezen a rendszeren.",
"electron_translate_22": "Kattintson a QORTAL CORE LETÖLTÉSE lehetőségre a mag letöltéséhez és telepítéséhez (az alapértelmezett helyre), VAGY kattintson a NEM KÖSZÖNÖM gombra a letöltés és telepítés kihagyásához.",
"electron_translate_23": "JAVA LETÖLTÉSE",
"electron_translate_24": "KÖSZÖNÖM NEM",
"electron_translate_25": "A Java nincs telepítve.",
"electron_translate_26": "A Qortal UI azt észlelte, hogy a java nincs telepítve az Ön rendszerére.",
"electron_translate_27": "Kattintson a JAVA LETÖLTÉSE gombra a java letöltéséhez és telepítéséhez, vagy a NEM KÖSZÖNÖM gombra, ha nem szeretné letölteni és telepíteni.",
"electron_translate_28": "Soha többé ne kérdezz",
"electron_translate_29": "BEÁLLÍTÁS MÓDOSÍTÁSA",
"electron_translate_30": "MÉGSEM",
"electron_translate_31": "Alapbeállítások indítása",
"electron_translate_32": "Módosítsa a mag indítását kérő jelenlegi állapotot, ha az nem fut",
"electron_translate_33": "(Jelölje be a soha többé ne kérdezzen jelölőnégyzetet, vagy törölje a pipát)",
"electron_translate_34": "Beállítások",
"electron_translate_35": "Másolás",
"electron_translate_36": "Beillesztés",
"electron_translate_37": "Megtekintés",
"electron_translate_38": "Nagyítás",
"electron_translate_39": "Kicsinyítés",
"electron_translate_40": "Tényleges méret",
"electron_translate_41": "Teljes képernyő váltás",
"electron_translate_42": "Új UI-példány",
"electron_translate_43": "Frissítés ellenőrzése!",
"electron_translate_44": "A felhasználói felület a háttérben ellenőrzi, hogy elérhető-e új verzió, és töltse le."
}

View File

@ -33,5 +33,16 @@
"electron_translate_30": "ANNULLA",
"electron_translate_31": "Avvia impostazioni di base",
"electron_translate_32": "Cambia lo stato attuale della richiesta di avvio del core se non è in esecuzione",
"electron_translate_33": "(Seleziona o deseleziona la casella di controllo Non chiedermelo più)"
"electron_translate_33": "(Seleziona o deseleziona la casella di controllo Non chiedermelo più)",
"electron_translate_34": "Impostazioni",
"electron_translate_35": "Copia",
"electron_translate_36": "Incolla",
"electron_translate_37": "Vedi",
"electron_translate_38": "Ingrandisci",
"electron_translate_39": "Zoom indietro",
"electron_translate_40": "Dimensioni effettive",
"electron_translate_41": "Attiva/disattiva schermo intero",
"electron_translate_42": "Nuova istanza UI",
"electron_translate_43": "Verifica aggiornamenti!",
"electron_translate_44": "L'interfaccia utente controlla in background se è disponibile una nuova versione e la scarica."
}

48
locales/jp.json Normal file
View File

@ -0,0 +1,48 @@
{
"__locale_name__": "日本語",
"electron_translate_1": "Qortal UI を表示",
"electron_translate_2": "終了",
"electron_translate_3": "アップデートが利用可能",
"electron_translate_4": "新しいバージョンのQortal UIが利用可能です。ダウンロードしますか?",
"electron_translate_5": "今すぐインストール",
"electron_translate_6": "後で",
"electron_translate_7": "アップデートをインストールする準備が出来ました",
"electron_translate_8": "新しいバージョンのQortal UIをダウンロードしました。",
"electron_translate_9": "更新を適用する場合は今すぐインストールを、UI を更新しない場合は[後で]をクリックして下さい。",
"electron_translate_10": "更新に失敗しました。後で再試行します",
"electron_translate_11": "更新をダウンロード",
"electron_translate_12": "バックグラウンドでダウンロードされます!⌛️",
"electron_translate_13": "QORTAL COREを開始",
"electron_translate_14": "開始しない",
"electron_translate_15": "Qortal Coreはこのシステムでは実行されていません",
"electron_translate_16": "Qortal UIは、Qortal Coreがこのシステムで実行されていないことを検出しました",
"electron_translate_17": "このシステム上でQortal Coreを開始するにはQORTAL COREを開始を、開始をスキップするには開始しないをクリックしてください",
"electron_translate_18": "QORTAL COREをダウンロード",
"electron_translate_19": "ダウンロードしない",
"electron_translate_20": "Qortal Coreが検出されませんでした",
"electron_translate_21": "Qortal UIは、Qortal Coreがこのシステムの(デフォルトの場所に)インストールされていないことを検出しました。",
"electron_translate_22": "Coreをダウンロードして(デフォルトの場所に)インストールする場合はQORTAL COREをダウンロードを、スキップする場合はダウンロードしないをクリックして下さい。",
"electron_translate_23": "JAVAをダウンロード",
"electron_translate_24": "ダウンロードしない",
"electron_translate_25": "Javaがインストールされていません。",
"electron_translate_26": "Qortal UIは、Javaがシステムにインストールされていないことを検出しました。",
"electron_translate_27": "JavaをダウンロードしてインストールするにはJAVAをダウンロードを、しない場合はいいえをクリックして下さい。",
"electron_translate_28": "二度と表示しない",
"electron_translate_29": "設定を変更",
"electron_translate_30": "中止",
"electron_translate_31": "Core設定を開始",
"electron_translate_32": "Coreが実行されていない場合にCoreの開始を求める現在のステータスを変更します",
"electron_translate_33": "(「二度と表示しない」チェックボックスをオンまたはオフにします)",
"electron_translate_34": "設定",
"electron_translate_35": "コピー",
"electron_translate_36": "貼り付け",
"electron_translate_37": "表示",
"electron_translate_38": "ズームイン",
"electron_translate_39": "ズームアウト",
"electron_translate_40": "実際のサイズ",
"electron_translate_41": "全画面表示を切り替える",
"electron_translate_42": "新しい UI インスタンス",
"electron_translate_43": "アップデートをチェックしています!",
"electron_translate_44": "新しいバージョンが利用可能かどうかを UI がバックグラウンドでチェックしており、ダウンロードします。"
}

View File

@ -33,5 +33,16 @@
"electron_translate_30": "취소",
"electron_translate_31": "핵심 설정 시작",
"electron_translate_32": "코어가 실행 중이 아닌 경우 코어 시작을 요청하는 현재 상태 변경",
"electron_translate_33": "(다시 묻지 않음 확인란 선택 또는 선택 취소)"
"electron_translate_33": "(다시 묻지 않음 확인란 선택 또는 선택 취소)",
"electron_translate_34": "설정",
"electron_translate_35": "복사",
"electron_translate_36": "붙여넣기",
"electron_translate_37": "보기",
"electron_translate_38": "확대",
"electron_translate_39": "축소",
"electron_translate_40": "실제 크기",
"electron_translate_41": "전체 화면 전환",
"electron_translate_42": "새 UI 인스턴스",
"electron_translate_43": "업데이트 확인 중!",
"electron_translate_44": "새 버전이 있으면 UI가 백그라운드에서 확인하고 다운로드합니다."
}

View File

@ -33,5 +33,16 @@
"electron_translate_30": "ANNULEREN",
"electron_translate_31": "Kerninstellingen starten",
"electron_translate_32": "Wijzig de huidige status van vragen om de kern te starten als deze niet draait",
"electron_translate_33": "(vink het selectievakje Nooit meer vragen aan of uit)"
"electron_translate_33": "(vink het selectievakje Nooit meer vragen aan of uit)",
"electron_translate_34": "Instellingen",
"electron_translate_35": "Kopiëren",
"electron_translate_36": "Plakken",
"electron_translate_37": "Bekijken",
"electron_translate_38": "Inzoomen",
"electron_translate_39": "Uitzoomen",
"electron_translate_40": "Ware grootte",
"electron_translate_41": "Volledig scherm wisselen",
"electron_translate_42": "Nieuwe UI-instantie",
"electron_translate_43": "Controleren op update!",
"electron_translate_44": "UI controleert op de achtergrond of er een nieuwe versie beschikbaar is en download deze."
}

View File

@ -1,5 +1,5 @@
{
"__locale_name__": "Norwegian",
"__locale_name__": "Norsk",
"electron_translate_1": "Vis Qortal UI",
"electron_translate_2": "Avslutt",
@ -33,5 +33,16 @@
"electron_translate_30": "AVBRYT",
"electron_translate_31": "Start kjerneinnstillinger",
"electron_translate_32": "Endre gjeldende status for å spørre om å starte kjernen hvis den ikke kjører",
"electron_translate_33": "(Merk av eller fjern merket for aldri spør meg igjen)"
"electron_translate_33": "(Merk av eller fjern merket for aldri spør meg igjen)",
"electron_translate_34": "Innstillinger",
"electron_translate_35": "Kopier",
"electron_translate_36": "Lim inn",
"electron_translate_37": "Vis",
"electron_translate_38": "Zoom inn",
"electron_translate_39": "Zoom ut",
"electron_translate_40": "Faktisk størrelse",
"electron_translate_41": "Veksle fullskjerm",
"electron_translate_42": "Ny brukergrensesnittforekomst",
"electron_translate_43": "Søker etter oppdatering !",
"electron_translate_44": "UI sjekker i bakgrunnen om en ny versjon er tilgjengelig og last den ned."
}

View File

@ -33,5 +33,16 @@
"electron_translate_30": "CANCELAR",
"electron_translate_31": "Iniciar configurações do núcleo",
"electron_translate_32": "Alterar o status atual de pedir para iniciar o núcleo se não estiver em execução",
"electron_translate_33": "(Marque ou desmarque a caixa de seleção para nunca mais me perguntar)"
"electron_translate_33": "(Marque ou desmarque a caixa de seleção para nunca mais me perguntar)",
"electron_translate_34": "Configurações",
"electron_translate_35": "Copiar",
"electron_translate_36": "Colar",
"electron_translate_37": "Ver",
"electron_translate_38": "Aumentar o zoom",
"electron_translate_39": "Reduzir",
"electron_translate_40": "Tamanho real",
"electron_translate_41": "Alternar tela cheia",
"electron_translate_42": "Nova instância de IU",
"electron_translate_43": "Verificando atualização!",
"electron_translate_44": "A interface do usuário está verificando em segundo plano se uma nova versão está disponível e baixe-a."
}

View File

@ -33,5 +33,16 @@
"electron_translate_30": "CANCELAR",
"electron_translate_31": "Iniciar configurações do núcleo",
"electron_translate_32": "Alterar o status atual de pedir para iniciar o núcleo se não estiver em execução",
"electron_translate_33": "(Marque ou desmarque a caixa de seleção para nunca mais me perguntar)"
"electron_translate_33": "(Marque ou desmarque a caixa de seleção para nunca mais me perguntar)",
"electron_translate_34": "Configurações",
"electron_translate_35": "Copiar",
"electron_translate_36": "Colar",
"electron_translate_37": "Ver",
"electron_translate_38": "Aumentar o zoom",
"electron_translate_39": "Reduzir",
"electron_translate_40": "Tamanho real",
"electron_translate_41": "Alternar tela cheia",
"electron_translate_42": "Nova instância de IU",
"electron_translate_43": "Verificando atualização!",
"electron_translate_44": "A interface do usuário está verificando em segundo plano se uma nova versão está disponível e baixe-a."
}

48
locales/ro.json Normal file
View File

@ -0,0 +1,48 @@
{
"__locale_name__": "Română",
"electron_translate_1": "Afișați Qortal UI",
"electron_translate_2": "Ieși",
"electron_translate_3": "Actualizare disponibilă",
"electron_translate_4": "Este disponibilă o nouă versiune Qortal UI. Doriți să o descărcați?",
"electron_translate_5": "INSTALĂ ACUM",
"electron_translate_6": "POATE TARZI",
"electron_translate_7": "Actualizare gata de instalare",
"electron_translate_8": "O nouă versiune Qortal UI a fost descărcată.",
"electron_translate_9": "Faceți clic pe INSTALARE ACUM pentru a aplica actualizarea, POATE TARZIU pentru a nu actualiza interfața de utilizare.",
"electron_translate_10": "Eșec de actualizare temporară, se va încerca din nou mai târziu",
"electron_translate_11": "DESCARCĂ UPDATE",
"electron_translate_12": "Va fi descărcat ⌛️ în fundal!",
"electron_translate_13": "ÎNCEPE QORTAL CORE",
"electron_translate_14": "NU MULȚUMESC",
"electron_translate_15": "Qortal Core NU rulează pe acest sistem",
"electron_translate_16": "Interfața de utilizare Qortal a detectat că Qortal Core NU rulează pe acest sistem",
"electron_translate_17": "Faceți clic pe START QORTAL CORE pentru a porni Qortal Core pe acest sistem SAU faceți clic pe NU MULȚUMESC pentru a omite pornirea pe acest sistem",
"electron_translate_18": "DESCARCĂ QORTAL CORE",
"electron_translate_19": "NU MULȚUMESC",
"electron_translate_20": "Qortal Core NU este detectat",
"electron_translate_21": "Interfața de utilizare Qortal a detectat că Qortal Core NU este instalat (în locația implicită) pe acest sistem.",
"electron_translate_22": "Faceți clic pe DOWNLOAD QORTAL CORE pentru a descărca și instala core-ul (la locația implicită) SAU faceți clic pe NU MULȚUMESC pentru a omite descărcarea și instalarea.",
"electron_translate_23": "DESCARCĂ JAVA",
"electron_translate_24": "NU MULȚUMESC",
"electron_translate_25": "Java nu este instalat.",
"electron_translate_26": "Interfața de utilizare Qortal a detectat că Java nu este instalat pe sistemul dvs.",
"electron_translate_27": "Faceți clic pe DOWNLOAD JAVA pentru a descărca și instala java sau pe NU MULȚUMESC pentru a nu îl descărca și instala.",
"electron_translate_28": "Nu ma mai intreba niciodata",
"electron_translate_29": "SCHIMBĂ SETĂRILE",
"electron_translate_30": "ANULARE",
"electron_translate_31": "Porniți setările de bază",
"electron_translate_32": "Schimbați starea curentă de a cere pornirea nucleului dacă nu rulează",
"electron_translate_33": "(Bifează sau debifează caseta de selectare niciodată să nu mă mai întrebe)",
"electron_translate_34": "Setări",
"electron_translate_35": "Copiați",
"electron_translate_36": "Inserați",
"electron_translate_37": "Vizualizare",
"electron_translate_38": "Măriți",
"electron_translate_39": "Măriți mic",
"electron_translate_40": "Dimensiunea reală",
"electron_translate_41": "Comutați ecranul complet",
"electron_translate_42": "Instanță nouă UI",
"electron_translate_43": "Se verifică actualizarea !",
"electron_translate_44": "UI verifică în fundal dacă o versiune nouă este disponibilă și o descarcă."
}

View File

@ -33,5 +33,16 @@
"electron_translate_30": "ОТМЕНИТЬ",
"electron_translate_31": "Начать основные настройки",
"electron_translate_32": "Изменить текущий статус запроса на запуск ядра, если оно не запущено",
"electron_translate_33": "(Установите или снимите флажок Больше не спрашивать)"
"electron_translate_33": "(Установите или снимите флажок Больше не спрашивать)",
"electron_translate_34": "Настройки",
"electron_translate_35": "Копировать",
"electron_translate_36": "Вставить",
"electron_translate_37": "Просмотреть",
"electron_translate_38": "Увеличить",
"electron_translate_39": "Уменьшить масштаб",
"electron_translate_40": "Реальный размер",
"electron_translate_41": "Включить полноэкранный режим",
"electron_translate_42": "Новый экземпляр пользовательского интерфейса",
"electron_translate_43": "Проверка обновлений!",
"electron_translate_44": "Интерфейс в фоновом режиме проверяет наличие новой версии и загружает ее."
}

48
locales/sr.json Normal file
View File

@ -0,0 +1,48 @@
{
"__locale_name__": "Srpski",
"electron_translate_1": "Prikaži Kortal korisnički interfejs",
"electron_translate_2": "Odustani",
"electron_translate_3": "Dostupno ažuriranje",
"electron_translate_4": "Nova Kortal UI verzija je dostupna. Želite da je preuzmete?",
"electron_translate_5": "INSTALIRAJ ODMAH",
"electron_translate_6": "MOŽDA KASNIJE",
"electron_translate_7": "Ažuriranje spremno za instalaciju",
"electron_translate_8": "Nova Kortal UI verzija je preuzeta.",
"electron_translate_9": "Kliknite INSTALIRAJ SADA da primenite ažuriranje, MOŽDA KASNIJE da ne ažurirate korisnički interfejs.",
"electron_translate_10": "Privremeni neuspeh ažuriranja, pokušaću ponovo kasnije",
"electron_translate_11": "PREUZMI AŽURIRANJE",
"electron_translate_12": "Biće preuzeto ⌛ u pozadini!",
"electron_translate_13": "POKRENI KORTALNO JEZGRI",
"electron_translate_14": "NE HVALA",
"electron_translate_15": "Kortal Core NE radi na ovom sistemu",
"electron_translate_16": "Kortal UI je otkrio da Kortal Core NE radi na ovom sistemu",
"electron_translate_17": "Kliknite na START KORTAL CORE da pokrenete Kortal Core na ovom sistemu ILI kliknite na NE HVALA da preskočite pokretanje na ovom sistemu",
"electron_translate_18": "PREUZMI KORTAL CORE",
"electron_translate_19": "NE HVALA",
"electron_translate_20": "Kortalno jezgro NIJE otkriveno",
"electron_translate_21": "Kortal UI je otkrio da Kortal Core NIJE instaliran (na podrazumevanoj lokaciji) na ovom sistemu.",
"electron_translate_22": "Kliknite DOVNLOAD KORTAL CORE da preuzmete i instalirate jezgro (na podrazumevanu lokaciju) ILI kliknite NE HVALA da preskočite preuzimanje i instaliranje.",
"electron_translate_23": "PREUZMI JAVA",
"electron_translate_24": "NE HVALA",
"electron_translate_25": "Java nije instalirana.",
"electron_translate_26": "Kortal UI je otkrio da java nije instalirana na vašem sistemu.",
"electron_translate_27": "Kliknite na DOVNLOAD JAVA da preuzmete i instalirate Java ili na NE HVALA da je ne preuzimate i instalirate.",
"electron_translate_28": "Nikad me više ne pitaj",
"electron_translate_29": "PROMENI PODEŠAVANJE",
"electron_translate_30": "OTKAŽI",
"electron_translate_31": "Pokreni podešavanja jezgra",
"electron_translate_32": "Promeni trenutni status traženja pokretanja jezgra ako ne radi",
"electron_translate_33": "(Označite ili opozovite izbor u polju za potvrdu nikad me više ne pitaj)",
"electron_translate_34": "Podešavanja",
"electron_translate_35": "Kopiraj",
"electron_translate_36": "Nalepi",
"electron_translate_37": "Prikaz",
"electron_translate_38": "Uvećaj",
"electron_translate_39": "Umanji",
"electron_translate_40": "Stvarna veličina",
"electron_translate_41": "Uključi ceo ekran",
"electron_translate_42": "Nova UI instanca",
"electron_translate_43": "Proveravam ažuriranje!",
"electron_translate_44": "UI proverava u pozadini da li je dostupna nova verzija i preuzmi je."
}

View File

@ -33,5 +33,16 @@
"electron_translate_30": "İPTAL",
"electron_translate_31": "Temel Ayarları Başlat",
"electron_translate_32": "Çalışmıyorsa çekirdeği başlatma isteğinin mevcut durumunu değiştir",
"electron_translate_33": "(Bana bir daha asla sorma onay kutusunu işaretleyin veya işaretini kaldırın)"
"electron_translate_33": "(Bana bir daha asla sorma onay kutusunu işaretleyin veya işaretini kaldırın)",
"electron_translate_34": "Ayarlar",
"electron_translate_35": "Kopyala",
"electron_translate_36": "Yapıştır",
"electron_translate_37": "Görüntüle",
"electron_translate_38": "Yakınlaştır",
"electron_translate_39": "Uzaklaştır",
"electron_translate_40": "Gerçek Boyut",
"electron_translate_41": "Tam Ekranı Değiştir",
"electron_translate_42": "Yeni Kullanıcı Arayüzü Örneği",
"electron_translate_43": "Güncelleme kontrol ediliyor!",
"electron_translate_44": "UI arka planda yeni bir sürüm olup olmadığını kontrol ediyor ve indiriyor."
}

View File

@ -34,5 +34,15 @@
"electron_translate_31": "Start Core Settings",
"electron_translate_32": "Change the current status of asking to start the core if it is not running",
"electron_translate_33": "(Check or Uncheck the never ask me again checkbox)",
"electron_translate_34": "Settings"
"electron_translate_34": "Settings",
"electron_translate_35": "Copy",
"electron_translate_36": "Paste",
"electron_translate_37": "View",
"electron_translate_38": "Zoom In",
"electron_translate_39": "Zoom Out",
"electron_translate_40": "Actual Size",
"electron_translate_41": "Toggle Full Screen",
"electron_translate_42": "New UI Instance",
"electron_translate_43": "Checking for update !",
"electron_translate_44": "UI is checking in background if a new version is available and download it."
}

View File

@ -33,5 +33,16 @@
"electron_translate_30": "取消",
"electron_translate_31": "开始核心设置",
"electron_translate_32": "更改核心未运行时要求启动的当前状态",
"electron_translate_33": "(选中或取消选中不再询问复选框)"
"electron_translate_33": "(选中或取消选中不再询问复选框)",
"electron_translate_34": "设置",
"electron_translate_35": "复制",
"electron_translate_36": "粘贴",
"electron_translate_37": "视图",
"electron_translate_38": "放大",
"electron_translate_39": "缩小",
"electron_translate_40": "实际尺寸",
"electron_translate_41": "切换全屏",
"electron_translate_42": "新 UI 实例",
"electron_translate_43": "检查更新!",
"electron_translate_44": "UI 正在后台检查是否有新版本可用并下载。"
}

View File

@ -33,5 +33,16 @@
"electron_translate_30": "取消",
"electron_translate_31": "開始核心設置",
"electron_translate_32": "更改核心未運行時要求啟動的當前狀態",
"electron_translate_33": "(勾選或取消勾選不再詢問複選框)"
"electron_translate_33": "(勾選或取消勾選不再詢問複選框)",
"electron_translate_34": "設置",
"electron_translate_35": "複製",
"electron_translate_36": "粘貼",
"electron_translate_37": "視圖",
"electron_translate_38": "放大",
"electron_translate_39": "縮小",
"electron_translate_40": "實際尺寸",
"electron_translate_41": "切換全屏",
"electron_translate_42": "新 UI 實例",
"electron_translate_43": "檢查更新!",
"electron_translate_44": "UI 正在後台檢查是否有新版本可用並下載。"
}

11019
package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

View File

@ -1,6 +1,6 @@
{
"name": "qortal-ui",
"version": "4.0.4",
"version": "4.2.6",
"description": "Qortal Project - decentralize the world - Data storage, communications, web hosting, decentralized trading, complete infrastructure for the future blockchain-based Internet",
"keywords": [
"QORT",
@ -19,11 +19,11 @@
"dev": "node server.js",
"prebuild": "node -p \"'export const UI_VERSION = ' + JSON.stringify(require('./package.json').version) + ';'\" > core/src/redux/app/version.js",
"build-dev": "node --max-old-space-size=8192 build.js",
"build": "NODE_ENV=production node --max-old-space-size=8192 build.js",
"build": "NODE_ENV=production node build.js",
"server": "NODE_ENV=production node --max-old-space-size=8192 server.js",
"watch": "node --max-old-space-size=8192 watch.js",
"watch-inline": "node --max-old-space-size=8192 watch-inline.js",
"start-electron": "NODE_ENV=production electron --js-flags=--max-old-space-size=8192 .",
"start-electron": "NODE_ENV=production electron .",
"build-electron": "electron-builder build --publish never",
"deploy-electron": "electron-builder build --win --publish never",
"release": "NODE_ENV=production electron-builder build --publish never",
@ -34,8 +34,9 @@
"bcryptjs": "2.4.3",
"buffer": "6.0.3",
"compressorjs": "1.2.1",
"crypto-js": "4.1.1",
"electron-log": "4.4.8",
"electron-updater": "5.3.0",
"electron-updater": "6.1.1",
"electron-dl": "3.5.0",
"electron-store": "8.1.0",
"emoji-picker-js": "https://github.com/Qortal/emoji-picker-js",
@ -45,23 +46,21 @@
"lodash": "4.17.21",
"node-fetch": "2.6.9",
"os-locale": "3.0.0",
"prosemirror-commands": "1.5.1",
"prosemirror-dropcursor": "1.8.0",
"prosemirror-gapcursor": "1.3.1",
"prosemirror-history": "1.3.1",
"prosemirror-keymap": "1.2.1",
"prosemirror-model": "1.19.0",
"prosemirror-schema-list": "1.2.2",
"prosemirror-state": "1.4.2",
"prosemirror-transform": "1.7.1",
"prosemirror-view": "1.31.1",
"sass": "1.62.1",
"prosemirror-commands": "1.5.2",
"prosemirror-dropcursor": "1.8.1",
"prosemirror-gapcursor": "1.3.2",
"prosemirror-history": "1.3.2",
"prosemirror-keymap": "1.2.2",
"prosemirror-model": "1.19.2",
"prosemirror-schema-list": "1.3.0",
"prosemirror-state": "1.4.3",
"prosemirror-transform": "1.7.3",
"prosemirror-view": "1.31.5",
"sass": "1.63.6",
"short-unique-id": "4.4.4",
"@hapi/hapi": "21.3.2",
"@hapi/inert": "7.1.0",
"@lit-labs/motion": "1.0.3",
"@material/mwc-list": "0.27.0",
"@material/mwc-select": "0.27.0",
"@tiptap/pm": "2.0.3",
"@tiptap/core": "2.0.3",
"@tiptap/extension-highlight": "2.0.3",
@ -73,27 +72,26 @@
},
"devDependencies": {
"axios": "1.4.0",
"electron": "24.2.0",
"electron-builder": "23.6.0",
"electron": "25.3.0",
"electron-builder": "24.4.0",
"electron-packager": "17.1.1",
"epml": "0.3.3",
"file-saver": "2.0.5",
"highcharts": "10.3.3",
"highcharts": "11.1.0",
"html-escaper": "3.0.3",
"is-electron": "2.2.2",
"lit": "2.7.4",
"lit": "2.7.6",
"lit-translate": "2.0.1",
"localforage": "1.10.0",
"pwa-helpers": "0.9.1",
"passive-events-support": "1.0.33",
"passive-events-support": "1.1.0",
"redux": "4.2.1",
"redux-thunk": "2.4.2",
"rollup": "3.21.5",
"rollup": "3.26.2",
"rollup-plugin-node-globals": "1.4.0",
"rollup-plugin-progress": "1.1.2",
"rollup-plugin-scss": "3.0.0",
"shelljs": "0.8.5",
"@babel/core": "7.21.8",
"@babel/core": "7.22.9",
"@material/mwc-button": "0.27.0",
"@material/mwc-checkbox": "0.27.0",
"@material/mwc-dialog": "0.27.0",
@ -103,6 +101,7 @@
"@material/mwc-icon": "0.27.0",
"@material/mwc-icon-button": "0.27.0",
"@material/mwc-list": "0.27.0",
"@material/mwc-menu": "0.27.0",
"@material/mwc-select": "0.27.0",
"@material/mwc-slider": "0.27.0",
"@material/mwc-snackbar": "0.27.0",
@ -131,17 +130,17 @@
"@qortal/rollup-plugin-web-worker-loader": "1.6.4",
"@rollup/plugin-alias": "5.0.0",
"@rollup/plugin-babel": "6.0.3",
"@rollup/plugin-commonjs": "24.1.0",
"@rollup/plugin-node-resolve": "15.0.2",
"@rollup/plugin-commonjs": "25.0.2",
"@rollup/plugin-node-resolve": "15.1.0",
"@rollup/plugin-replace": "5.0.2",
"@rollup/plugin-terser": "0.4.1",
"@vaadin/avatar": "24.0.4",
"@vaadin/button": "24.0.4",
"@vaadin/grid": "24.0.4",
"@vaadin/icons": "24.0.4",
"@vaadin/password-field": "24.0.4",
"@vaadin/tooltip": "24.0.4",
"@zip.js/zip.js": "2.7.6"
"@rollup/plugin-terser": "0.4.3",
"@vaadin/avatar": "24.1.3",
"@vaadin/button": "24.1.3",
"@vaadin/grid": "24.1.3",
"@vaadin/icons": "24.1.3",
"@vaadin/password-field": "24.1.3",
"@vaadin/tooltip": "24.1.3",
"@zip.js/zip.js": "2.7.20"
},
"engines": {
"node": ">=18.14.0"

View File

@ -68,6 +68,10 @@ const generateForPlugins = () => {
in: 'plugins/core/main.src.js',
out: 'plugins/core/main.js',
},
{
in: 'plugins/core/overview-page/overview-page.src.js',
out: 'plugins/core/overview-page/overview-page.js',
},
{
in: 'plugins/core/trade-portal/trade-portal.src.js',
out: 'plugins/core/trade-portal/trade-portal.js',

View File

@ -1,21 +1,23 @@
import { LitElement, html } from 'lit';
import { Epml } from '../../../epml.js';
import '../components/ButtonIconCopy.js';
import { use, translate, registerTranslateConfig } from 'lit-translate';
import { blocksNeed } from '../../utils/blocks-needed.js';
import { LitElement, html } from 'lit'
import { Epml } from '../../../epml.js'
import '../components/ButtonIconCopy.js'
import { use, translate, registerTranslateConfig } from 'lit-translate'
import { blocksNeed } from '../../utils/blocks-needed.js'
import isElectron from 'is-electron'
registerTranslateConfig({
loader: (lang) => fetch(`/language/${lang}.json`).then((res) => res.json()),
});
})
import '@polymer/paper-spinner/paper-spinner-lite.js';
import '@material/mwc-button';
import '@material/mwc-textfield';
import '@vaadin/button';
import { pageStyles } from './become-minter-css.src.js';
import './components/not-sponsored.src';
import './components/yes-sponsored.src';
const parentEpml = new Epml({ type: 'WINDOW', source: window.parent });
import '@polymer/paper-spinner/paper-spinner-lite.js'
import '@material/mwc-button'
import '@material/mwc-textfield'
import '@vaadin/button'
import { pageStyles } from './become-minter-css.src.js'
import './components/not-sponsored.js'
import './components/yes-sponsored.js'
const parentEpml = new Epml({ type: 'WINDOW', source: window.parent })
class BecomeMinter extends LitElement {
static get properties() {
@ -27,77 +29,77 @@ class BecomeMinter extends LitElement {
addressInfo: { type: Object },
rewardSharePublicKey: { type: String },
mintingAccountData: { type: Array },
};
}
}
static styles = [pageStyles];
static styles = [pageStyles]
constructor() {
super();
this.theme = localStorage.getItem('qortalTheme') ? localStorage.getItem('qortalTheme') : 'light';
this.sponsorshipKeyValue = '';
this.isPageLoading = true;
this.nodeInfo = {};
this.addressInfo = {};
this.rewardSharePublicKey = '';
this.mintingAccountData = null;
super()
this.theme = localStorage.getItem('qortalTheme') ? localStorage.getItem('qortalTheme') : 'light'
this.sponsorshipKeyValue = ''
this.isPageLoading = true
this.nodeInfo = {}
this.addressInfo = {}
this.rewardSharePublicKey = ''
this.mintingAccountData = null
}
changeLanguage() {
const checkLanguage = localStorage.getItem('qortalLanguage');
const checkLanguage = localStorage.getItem('qortalLanguage')
if (checkLanguage === null || checkLanguage.length === 0) {
localStorage.setItem('qortalLanguage', 'us');
use('us');
localStorage.setItem('qortalLanguage', 'us')
use('us')
} else {
use(checkLanguage);
use(checkLanguage)
}
}
_handleStorage() {
const checkLanguage = localStorage.getItem('qortalLanguage');
const checkTheme = localStorage.getItem('qortalTheme');
const checkLanguage = localStorage.getItem('qortalLanguage')
const checkTheme = localStorage.getItem('qortalTheme')
use(checkLanguage);
use(checkLanguage)
if (checkTheme === 'dark') {
this.theme = 'dark';
this.theme = 'dark'
} else {
this.theme = 'light';
this.theme = 'light'
}
document.querySelector('html').setAttribute('theme', this.theme);
document.querySelector('html').setAttribute('theme', this.theme)
}
connectedCallback() {
super.connectedCallback();
window.addEventListener('storage', this._handleStorage);
super.connectedCallback()
window.addEventListener('storage', this._handleStorage)
}
disconnectedCallback() {
window.removeEventListener('storage', this._handleStorage);
super.disconnectedCallback();
window.removeEventListener('storage', this._handleStorage)
super.disconnectedCallback()
}
async getNodeInfo() {
const nodeInfo = await parentEpml.request('apiCall', {
url: `/admin/status`,
});
})
return nodeInfo;
return nodeInfo
}
async getMintingAcccounts() {
const mintingAccountData = await parentEpml.request('apiCall', {
url: `/admin/mintingaccounts`,
});
return mintingAccountData;
})
return mintingAccountData
}
async atMount() {
this.changeLanguage();
this.changeLanguage()
this.isPageLoading = true;
this.isPageLoading = true
try {
const [nodeInfo, myRewardShareArray, mintingaccounts] =
await Promise.all([
@ -107,33 +109,40 @@ class BecomeMinter extends LitElement {
?.address
),
this.getMintingAcccounts(),
]);
])
this.nodeInfo = nodeInfo;
this.nodeInfo = nodeInfo
this.rewardSharePublicKey =
myRewardShareArray[0]?.rewardSharePublicKey;
this.isPageLoading = false;
this.mintingAccountData = mintingaccounts;
myRewardShareArray[0]?.rewardSharePublicKey
this.isPageLoading = false
this.mintingAccountData = mintingaccounts
this.addressInfo =
window.parent.reduxStore.getState().app.accountInfo.addressInfo;
window.parent.reduxStore.getState().app.accountInfo.addressInfo
} catch (error) {
console.error(error);
console.error(error)
this.isPageLoading = false;
this.isPageLoading = false
}
}
async firstUpdated() {
await this.atMount();
await this.atMount()
if (!isElectron()) {
} else {
window.addEventListener('contextmenu', (event) => {
event.preventDefault()
window.parent.electronAPI.showMyMenu()
})
}
}
async getRewardShareRelationship(recipientAddress) {
const myRewardShareArray = await parentEpml.request('apiCall', {
type: 'api',
url: `/addresses/rewardshares?recipients=${recipientAddress}`,
});
})
return myRewardShareArray;
return myRewardShareArray
}
_levelUpBlocks() {
@ -141,8 +150,8 @@ class BecomeMinter extends LitElement {
blocksNeed(0) -
(this.addressInfo?.blocksMinted +
this.addressInfo?.blocksMintedAdjustment)
).toString();
return countBlocksString;
).toString()
return countBlocksString
}
render() {
@ -150,7 +159,7 @@ class BecomeMinter extends LitElement {
const findMintingAccount = this.mintingAccountData?.find(
(ma) => ma.recipientAccount === window.parent.reduxStore.getState().app?.selectedAddress
?.address
);
)
const isAlreadySponsored =
this.addressInfo?.error !== 124 &&
@ -196,8 +205,8 @@ class BecomeMinter extends LitElement {
</yes-sponsored>
`}
</div>
`;
`
}
}
window.customElements.define('become-minter', BecomeMinter);
window.customElements.define('become-minter', BecomeMinter)

View File

@ -6,8 +6,8 @@ import { use, translate, registerTranslateConfig } from 'lit-translate';
registerTranslateConfig({
loader: (lang) => fetch(`/language/${lang}.json`).then((res) => res.json()),
});
import '@polymer/paper-spinner/paper-spinner-lite.js';
import '@polymer/paper-spinner/paper-spinner-lite.js';
import '@material/mwc-button';
import '@material/mwc-textfield';
import '@vaadin/button';

File diff suppressed because it is too large Load Diff

View File

@ -47,7 +47,7 @@ export const chatStyles = css`
.chat-list {
overflow-y: auto;
overflow-x: hidden;
height: 100%;
height: 96%;
box-sizing: border-box;
}

File diff suppressed because it is too large Load Diff

View File

@ -478,31 +478,6 @@ class ChatWelcomePage extends LitElement {
getAddressPublicKey()
}
_textMenu(event) {
const getSelectedText = () => {
var text = "";
if (typeof window.getSelection != "undefined") {
text = window.getSelection().toString();
} else if (typeof this.shadowRoot.selection != "undefined" && this.shadowRoot.selection.type == "Text") {
text = this.shadowRoot.selection.createRange().text;
}
return text;
}
const checkSelectedTextAndShowMenu = () => {
let selectedText = getSelectedText();
if (selectedText && typeof selectedText === 'string') {
let _eve = { pageX: event.pageX, pageY: event.pageY, clientX: event.clientX, clientY: event.clientY }
let textMenuObject = { selectedText: selectedText, eventObject: _eve, isFrame: true }
parentEpml.request('openCopyTextMenu', textMenuObject)
}
}
checkSelectedTextAndShowMenu()
}
_textArea(e) {
if (e.keyCode === 13 && !e.shiftKey) this._sendMessage()
}

View File

@ -106,6 +106,7 @@ class LevelFounder extends LitElement {
}
firstUpdated() {
this.changeLanguage()
this.checkAddressInfo()
window.addEventListener('storage', () => {
@ -167,28 +168,6 @@ class LevelFounder extends LitElement {
` : ''
}
_textMenu(event) {
const getSelectedText = () => {
var text = "";
if (typeof window.getSelection != "undefined") {
text = window.getSelection().toString();
} else if (typeof this.shadowRoot.selection != "undefined" && this.shadowRoot.selection.type == "Text") {
text = this.shadowRoot.selection.createRange().text;
}
return text;
}
const checkSelectedTextAndShowMenu = () => {
let selectedText = getSelectedText();
if (selectedText && typeof selectedText === 'string') {
let _eve = { pageX: event.pageX, pageY: event.pageY, clientX: event.clientX, clientY: event.clientY }
let textMenuObject = { selectedText: selectedText, eventObject: _eve, isFrame: true }
parentEpml.request('openCopyTextMenu', textMenuObject)
}
}
checkSelectedTextAndShowMenu()
}
isEmptyArray(arr) {
if (!arr) { return true }
return arr.length === 0

File diff suppressed because it is too large Load Diff

View File

@ -2,20 +2,29 @@ import nacl from '../../../../crypto/api/deps/nacl-fast.js'
import ed2curve from '../../../../crypto/api/deps/ed2curve.js'
let reader = new FileReader();
export const fileToBase64 = (file) =>
new Promise((resolve, reject) => {
const reader = new FileReader();
if (!reader) {
reader = new FileReader();
}
reader.readAsDataURL(file);
reader.onload = () => {
const dataUrl = reader.result;
if (typeof dataUrl === "string") {
const base64String = dataUrl.split(',')[1];
reader.onload = null;
reader.onerror = null;
resolve(base64String);
} else {
reader.onload = null;
reader.onerror = null;
reject(new Error('Invalid data URL'));
}
};
reader.onerror = (error) => {
reader.onload = null;
reader.onerror = null;
reject(error);
};
});

View File

@ -47,4 +47,7 @@ export const DECRYPT_DATA = 'DECRYPT_DATA'
export const DECRYPT_DATA_GROUP = 'DECRYPT_DATA_GROUP'
// SAVE_FILE
export const SAVE_FILE = 'SAVE_FILE'
export const SAVE_FILE = 'SAVE_FILE'
//SET_TAB_NOTIFICATIONS
export const SET_TAB_NOTIFICATIONS = 'SET_TAB_NOTIFICATIONS'

View File

@ -1252,6 +1252,13 @@ class QortalInfoView extends LitElement {
`
}
firstUpdated() {
window.addEventListener('contextmenu', (event) => {
event.preventDefault()
window.parent.electronAPI.showMyMenu()
})
}
openUserInfo(userData) {
if (userData.startsWith('Q') && userData.length == 34) {
this.getAddressUserResult(userData)

View File

@ -1,6 +1,7 @@
import { LitElement, html, css } from 'lit'
import { render } from 'lit/html.js'
import { Epml } from '../../../epml.js'
import isElectron from 'is-electron'
import { use, get, translate, translateUnsafeHTML, registerTranslateConfig } from 'lit-translate'
registerTranslateConfig({
@ -603,7 +604,7 @@ class GroupManagement extends LitElement {
</select>
</p>
<div style="margin-bottom: 10px;">
<p style="margin-bottom: 0;">${translate("walletpage.wchange21")} <span style="font-weight: bold;">${this.addGroupAdminFee} QORT<span></p>
<p style="margin-bottom: 0;">${translate("walletpage.wchange21")} <span style="font-weight: bold;">${this.createBanFee} QORT<span></p>
<br>
</div>
${this.renderClearSuccess()}
@ -1499,6 +1500,9 @@ class GroupManagement extends LitElement {
</span>
<span ?hidden=${this.message === ''} style="${this.error ? 'color:red;' : ''}">
${this.message}
</span><br>
<span>
<b>${translate("walletpage.wchange21")} ${this.createFee} QORT.</b>
</span>
</div>
@ -1556,6 +1560,9 @@ class GroupManagement extends LitElement {
</span>
<span ?hidden=${this.message === ''} style="${this.error ? 'color:red;' : ''}">
${this.message}
</span><br>
<span>
<b>${translate("walletpage.wchange21")} ${this.joinFee} QORT.</b>
</span>
</div>
@ -1618,6 +1625,9 @@ class GroupManagement extends LitElement {
</span>
<span ?hidden=${this.message === ''} style="${this.error ? 'color:red;' : ''}">
${this.message}
</span><br>
<span>
<b>${translate("walletpage.wchange21")} ${this.leaveFee} QORT.</b>
</span>
</div>
@ -1798,14 +1808,13 @@ class GroupManagement extends LitElement {
setTimeout(getOpen_JoinedGroups, 600000)
}
window.addEventListener("contextmenu", (event) => {
event.preventDefault();
this._textMenu(event)
})
window.addEventListener("click", () => {
parentEpml.request('closeCopyTextMenu', null)
})
if (!isElectron()) {
} else {
window.addEventListener('contextmenu', (event) => {
event.preventDefault()
window.parent.electronAPI.showMyMenu()
})
}
window.addEventListener('storage', () => {
const checkLanguage = localStorage.getItem('qortalLanguage')
@ -1821,12 +1830,6 @@ class GroupManagement extends LitElement {
document.querySelector('html').setAttribute('theme', this.theme)
})
window.onkeyup = (e) => {
if (e.keyCode === 27) {
parentEpml.request('closeCopyTextMenu', null)
}
}
let configLoaded = false
parentEpml.ready().then(() => {
@ -1844,11 +1847,6 @@ class GroupManagement extends LitElement {
}
this.config = JSON.parse(c)
})
parentEpml.subscribe('copy_menu_switch', async value => {
if (value === 'false' && window.getSelection().toString().length !== 0) {
this.clearSelection()
}
})
})
parentEpml.imReady()
}
@ -2732,28 +2730,6 @@ class GroupManagement extends LitElement {
return html`<img src="${url}" onerror="this.src='/img/incognito.png';">`
}
_textMenu(event) {
const getSelectedText = () => {
var text = "";
if (typeof window.getSelection != "undefined") {
text = window.getSelection().toString();
} else if (typeof this.shadowRoot.selection != "undefined" && this.shadowRoot.selection.type == "Text") {
text = this.shadowRoot.selection.createRange().text;
}
return text;
}
const checkSelectedTextAndShowMenu = () => {
let selectedText = getSelectedText();
if (selectedText && typeof selectedText === 'string') {
let _eve = { pageX: event.pageX, pageY: event.pageY, clientX: event.clientX, clientY: event.clientY }
let textMenuObject = { selectedText: selectedText, eventObject: _eve, isFrame: true }
parentEpml.request('openCopyTextMenu', textMenuObject)
}
}
checkSelectedTextAndShowMenu()
}
async createGroup(e) {
this.resetDefaultSettings()
const createFeeInput = this.createFee
@ -3650,11 +3626,6 @@ class GroupManagement extends LitElement {
return apiKey
}
clearSelection() {
window.getSelection().removeAllRanges()
window.parent.getSelection().removeAllRanges()
}
isEmptyArray(arr) {
if (!arr) { return true }
return arr.length === 0

File diff suppressed because one or more lines are too long

Some files were not shown because too many files have changed in this diff Show More