mirror of
https://github.com/Qortal/qortal-ui.git
synced 2025-04-27 05:17:51 +00:00
Compare commits
163 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
747b555edb | ||
|
36e7bd8ba6 | ||
|
29965500fc | ||
|
75f923e025 | ||
|
f12b0c9bf8 | ||
|
0e3220eed0 | ||
|
f0a5eeebc8 | ||
|
2ed1b08cd8 | ||
|
e4eede5087 | ||
|
9dbc4b085b | ||
|
7ca9acaf3a | ||
|
e3ef24dc5e | ||
|
9d72f4539d | ||
|
060390da23 | ||
|
2547025d9e | ||
|
665d708563 | ||
|
c686a12c3a | ||
|
e2d6d83fd8 | ||
|
78f25607e2 | ||
|
502952550c | ||
|
7cae21d8ed | ||
|
6e648ece9d | ||
|
b74cd40cd3 | ||
|
d7708259de | ||
|
3837973ba8 | ||
|
af8dcae748 | ||
|
8b64c80019 | ||
|
1ded359b7a | ||
|
2e3a02458d | ||
|
8b8ad3015f | ||
|
d16781e73b | ||
|
d6e0846d58 | ||
|
003eb5c45a | ||
|
f7971f7026 | ||
|
d3f9e0878b | ||
|
585d133143 | ||
|
4457215a0e | ||
|
d915b25b47 | ||
|
5011917a68 | ||
|
137dc4d0b3 | ||
|
aca57727a1 | ||
|
72ec9fc092 | ||
|
a0a1fb34f1 | ||
|
d822c65fc5 | ||
|
80d4ce82f1 | ||
|
db71257c02 | ||
|
2483163b6e | ||
|
82dfabd6c0 | ||
|
baeb25e8bf | ||
|
9b54fde947 | ||
|
10c38b3c40 | ||
|
c0e2935d9b | ||
|
525f866447 | ||
|
162ac0fda3 | ||
|
7c39de10fd | ||
|
c9a4133013 | ||
|
6ad91d6934 | ||
|
1041964df4 | ||
|
04a91efcac | ||
|
d2cb1e9d1c | ||
|
18c85674d9 | ||
|
f261a7d4d7 | ||
|
9ab7f77292 | ||
|
34cb1bcb38 | ||
|
4fa85d4923 | ||
|
4d35a7d6c0 | ||
|
f3874fdc72 | ||
|
800884302d | ||
|
2450c6326f | ||
|
950d098249 | ||
|
7a8bbab6d1 | ||
|
bf3d968c18 | ||
|
b89a424131 | ||
|
6debf5fd72 | ||
|
e9ab20a451 | ||
|
aa902563dd | ||
|
599df66c88 | ||
|
2871d3d4c5 | ||
|
e2e358c748 | ||
|
a645d76b10 | ||
|
a696444978 | ||
|
eade77c98b | ||
|
79e9080f6e | ||
|
694e4e6f92 | ||
|
38d4c38393 | ||
|
53c3006482 | ||
|
5b46191945 | ||
|
95e5c8a752 | ||
|
bd9d74892b | ||
|
0eff3c3d15 | ||
|
3667db0616 | ||
|
7c2e74b03b | ||
|
cdb363c8c7 | ||
|
d36c006f21 | ||
|
54061dcf2b | ||
|
d980dae71a | ||
|
591269ee1e | ||
|
ae2cc2b3d1 | ||
|
287f582275 | ||
|
0a6e2b7f85 | ||
|
d86e3134c0 | ||
|
edf1160d27 | ||
|
1ca2cd3652 | ||
|
8b14cd2aa2 | ||
|
caa745ab4c | ||
|
a4a5af8928 | ||
|
f887bc6b4f | ||
|
3fc0281655 | ||
|
3b378c6e56 | ||
|
b5a9be475e | ||
|
3edea9fe8c | ||
|
d212bf95ae | ||
|
22e938bb87 | ||
|
5893d4de7d | ||
|
ac79619eaf | ||
|
ced56e0a1c | ||
|
8c548add2e | ||
|
dc0221f727 | ||
|
9691e3f6d0 | ||
|
6d7be2f40b | ||
|
1a3794e9e8 | ||
|
643e7fa80a | ||
|
1183e89022 | ||
|
c828df6775 | ||
|
054195c2bf | ||
|
10329a5810 | ||
|
52ad30bb9f | ||
|
96a7415181 | ||
|
1bf23e8a2d | ||
|
fbff262146 | ||
|
8d6c83d999 | ||
|
05c6e2bdce | ||
|
e063a3e0f9 | ||
|
dc77e36b15 | ||
|
d847106996 | ||
|
2c920c5c85 | ||
|
70646f1f3f | ||
|
422b5fc8fa | ||
|
6838efb973 | ||
|
64d66d961e | ||
|
b2da63d694 | ||
|
f587743dc2 | ||
|
679f84a76f | ||
|
df60cf51e9 | ||
|
c6e3271222 | ||
|
8f920cac42 | ||
|
6778decd5a | ||
|
5cf52baa87 | ||
|
96230a60f5 | ||
|
4276f54933 | ||
|
2572690f17 | ||
|
368f80e8b7 | ||
|
e7fa83dfde | ||
|
555aa1bc07 | ||
|
2658d86c79 | ||
|
78a0c31cf3 | ||
|
30439a9cf3 | ||
|
d09af08bca | ||
|
8b336da053 | ||
|
564981fb4c | ||
|
c95dfa6edd | ||
|
177e138594 | ||
|
e9bd6bf488 |
@ -26,8 +26,8 @@ Easiest way to install the lastest required packages on Linux is via nvm.
|
||||
``` source ~/.profile ``` (For Debian based distro) <br/>
|
||||
``` source ~/.bashrc ``` (For Fedora / CentOS) <br/>
|
||||
``` nvm ls-remote ``` (Fetch list of available versions) <br/>
|
||||
``` nvm install v20.11.1 ``` (LTS: Iron supported by Electron V30) <br/>
|
||||
``` npm --location=global install npm@10.7.0 ``` <br/>
|
||||
``` nvm install v20.16.0 ``` (Latest LTS: Iron supported by Electron V32) <br/>
|
||||
``` npm --location=global install npm@10.9.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.
|
||||
|
||||
|
@ -2,7 +2,23 @@
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>com.apple.security.cs.allow-unsigned-executable-memory</key>
|
||||
<key>com.apple.security.cs.allow-jit</key>
|
||||
<true/>
|
||||
<key>com.apple.security.cs.allow-dyld-environment-variables</key>
|
||||
<true/>
|
||||
<key>com.apple.security.cs.disable-executable-page-protection</key>
|
||||
<true/>
|
||||
<key>com.apple.security.inherit</key>
|
||||
<true/>
|
||||
<key>com.apple.security.automation.apple-events</key>
|
||||
<true/>
|
||||
<key>com.apple.security.device.audio-input</key>
|
||||
<true/>
|
||||
<key>com.apple.security.device.camera</key>
|
||||
<true/>
|
||||
<key>com.apple.security.device.microphone</key>
|
||||
<true/>
|
||||
<key>com.apple.security.device.bluetooth</key>
|
||||
<true/>
|
||||
</dict>
|
||||
</plist>
|
||||
|
BIN
core/font/TwemojiCountryFlags.woff2
Normal file
BIN
core/font/TwemojiCountryFlags.woff2
Normal file
Binary file not shown.
@ -101,3 +101,10 @@
|
||||
local('PaytoneOne'),
|
||||
url(PaytoneOne.ttf) format('truetype');
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: 'Twemoji Country Flags';
|
||||
src: url('TwemojiCountryFlags.woff2') format('woff2');
|
||||
font-weight: normal;
|
||||
font-style: normal;
|
||||
}
|
@ -248,7 +248,9 @@
|
||||
"balance": "Guthaben",
|
||||
"balances": "IHR WALLET-GUTHABEN",
|
||||
"update": "AKTUALISIERE WALLET-GUTHABEN",
|
||||
"view": "Ansehen"
|
||||
"view": "Ansehen",
|
||||
"all": "Alle",
|
||||
"page": "Seite"
|
||||
},
|
||||
"gifs": {
|
||||
"gchange1": "GIF-Explorer",
|
||||
@ -466,7 +468,7 @@
|
||||
"rchange6": "Empfänger",
|
||||
"rchange7": "Aktion",
|
||||
"rchange8": "Typ",
|
||||
"rchange9": "Die Stufen 1–4 können nur Self-Share-(Minting-)Schlüssel erstellen. Nur Level 5 oder höher kann einen Prämienanteil erstellen!",
|
||||
"rchange9": "Die Stufen 0–4 können nur Self-Share-(Minting-)Schlüssel erstellen. Nur Level 5 oder höher kann einen Prämienanteil erstellen!",
|
||||
"rchange10": "Öffentlicher Schlüssel des Empfängers",
|
||||
"rchange11": "Belohnungsanteil in Prozent",
|
||||
"rchange12": "Angeforderter Befehl wird ausgeführt...",
|
||||
@ -740,7 +742,8 @@
|
||||
"bchange51": "Um die Änderungen zu übermitteln, vergessen Sie nicht, auf ‚Profil aktualisieren‘ zu klicken",
|
||||
"bchange52": "Erteilen Sie dieser Anwendung die Berechtigung, Ihre Wallet-Informationen abzurufen?",
|
||||
"bchange53": "Erlaube immer, dass deine Freundesliste automatisch von allen Apps abgerufen wird",
|
||||
"bchange54": "Erteilen Sie dieser Anwendung die Berechtigung, auf Ihre Freundesliste zuzugreifen?"
|
||||
"bchange54": "Erteilen Sie dieser Anwendung die Berechtigung, auf Ihre Freundesliste zuzugreifen?",
|
||||
"bchange55": "Geben Sie dieser Anwendung die Erlaubnis, diesen Befehl zu senden?"
|
||||
},
|
||||
"datapage": {
|
||||
"dchange1": "Datenmanagement",
|
||||
@ -840,7 +843,7 @@
|
||||
"cchange74": "reagiert mit",
|
||||
"cchange75": "Anhang wird hochgeladen. Dies kann bis zu einer Minute dauern.",
|
||||
"cchange76": "Anhang wird gelöscht. Dies kann bis zu einer Minute dauern.",
|
||||
"cchange77": "Größe des Anhangs überschreitet 1 MB",
|
||||
"cchange77": "Größe des Anhangs überschreitet 10 MB",
|
||||
"cchange78": "Möchten Sie dieses Bild wirklich löschen?",
|
||||
"cchange79": "Möchten Sie diesen Anhang wirklich löschen?",
|
||||
"cchange80": "Dieses Bild wurde gelöscht",
|
||||
@ -853,7 +856,24 @@
|
||||
"cchange94": "geladen",
|
||||
"cchange95": "Nur meine Ressourcen",
|
||||
"cchange96": "Gruppenverwaltung öffnen",
|
||||
"cchange97": "Link zur Gruppe beitreten, in Zwischenablage kopiert"
|
||||
"cchange97": "Link zur Gruppe beitreten, in Zwischenablage kopiert",
|
||||
"cchange98": "Datei wird hochgeladen. Dies kann einige Minuten dauern.",
|
||||
"cchange99": "Datei wird gelöscht. Dies kann bis zu einer Minute dauern.",
|
||||
"cchange100": "Dateigröße überschreitet 125 MB",
|
||||
"cchange101": "Sind Sie sicher, dass Sie diese Datei löschen möchten?",
|
||||
"cchange102": "Diese Datei wurde gelöscht",
|
||||
"cchange103": "GIF wird hochgeladen. Dies kann bis zu einer Minute dauern.",
|
||||
"cchange104": "GIF wird gelöscht. Dies kann bis zu einer Minute dauern.",
|
||||
"cchange105": "Dateigröße überschreitet 3 MB",
|
||||
"cchange106": "Sind Sie sicher, dass Sie dieses GIF löschen möchten?",
|
||||
"cchange107": "Dieses GIF wurde gelöscht",
|
||||
"cchange108": "Der Download wird im Hintergrund fortgesetzt, es kann nur EINE Q-Chat-Datei gleichzeitig heruntergeladen werden.",
|
||||
"cchange109": "Dateityp nicht unterstützt!",
|
||||
"cchange110": "BILD HOCHLADEN",
|
||||
"cchange111": "GIF HOCHLADEN",
|
||||
"cchange112": "ANHANG HOCHLADEN",
|
||||
"cchange113": "DATEI HOCHLADEN",
|
||||
"cchange114": "Schreibe etwas …"
|
||||
},
|
||||
"welcomepage": {
|
||||
"wcchange1": "Willkommen zu Q-Chat",
|
||||
@ -954,7 +974,10 @@
|
||||
"gchange65": "Ersetzen Sie diese Adresse durch EIGENTUM der Gruppe übertragen!",
|
||||
"gchange66": "Ungültige Besitzer-/neue Besitzeradresse",
|
||||
"gchange67": "Gruppen-UPDATE erfolgreich!",
|
||||
"gchange68": "Gruppen-Avatar festlegen"
|
||||
"gchange68": "Gruppen-Avatar festlegen",
|
||||
"gchange69": "Nachrichten",
|
||||
"gchange70": "Keine Nachrichten in den letzten 24 Stunden!",
|
||||
"gchange71": "Du bist dieser Gruppe bereits beigetreten!"
|
||||
},
|
||||
"puzzlepage": {
|
||||
"pchange1": "Rätsel",
|
||||
@ -1297,5 +1320,104 @@
|
||||
"tour20": "Blocks dahinter. Möchten Sie eine Aktualisierung (Bootstrap) durchführen, um den Synchronisierungsprozess zu beschleunigen?",
|
||||
"tour21": "Verbleibende Blöcke.",
|
||||
"tour22": "Aktualisierung (Bootstrap) angefordert. Bitte warten."
|
||||
},
|
||||
"chatsettings": {
|
||||
"cs1": "Chat-Einstellungen",
|
||||
"cs2": "Allgemeine Chat-Einstellungen",
|
||||
"cs3": "Zeitstempel der Chat-Nachricht",
|
||||
"cs4": "Vorherige Zeit",
|
||||
"cs5": "Ortszeit",
|
||||
"cs6": "Schriftgröße der Chat-Nachricht",
|
||||
"cs7": "Standard",
|
||||
"cs8": "px"
|
||||
},
|
||||
"modals": {
|
||||
"mpchange1": "Alle angeforderten ATs müssen von derselben ausländischen Blockchain sein.",
|
||||
"mpchange2": "Geben Sie dieser Anwendung die Berechtigung, einen Kaufauftrag auszuführen?",
|
||||
"mpchange3": "Kaufauftrag erfolgreich erstellt",
|
||||
"mpchange4": "Bitte warten Sie, bis Kaufauftrag ausgeführt wurde",
|
||||
"mpchange5": "Kaufauftrag konnte nicht übermittelt werden.",
|
||||
"mpchange6": "Geben Sie dieser Anwendung die Berechtigung, einen Verkaufsauftrag auszuführen?",
|
||||
"mpchange7": "Für:",
|
||||
"mpchange8": "Verkaufsauftrag wurde erfolgreich erstellt.",
|
||||
"mpchange9": "Bitte warten Sie, bis der Verkaufsauftrag aufgelistet wird.",
|
||||
"mpchange10": "Verkaufsauftrag konnte nicht übermittelt werden.",
|
||||
"mpchange11": "AT-Informationen können nicht gefunden werden.",
|
||||
"mpchange12": "Geben Sie dieser Anwendung die Berechtigung, einen Verkaufsauftrag zu stornieren?",
|
||||
"mpchange13": "Verkaufsauftrag wurde erfolgreich storniert.",
|
||||
"mpchange14": "Bitte warten Sie, bis die Stornierung des Handels ausgeführt wurde.",
|
||||
"mpchange15": "Verkaufsauftrag konnte nicht storniert werden.",
|
||||
"mpchange16": "Fehler beim Abrufen der Liste.",
|
||||
"mpchange17": "Fehler beim Hinzufügen zur Liste.",
|
||||
"mpchange18": "Fehler beim Löschen der Liste.",
|
||||
"mpchange19": "Fehler beim Abrufen der Freundesliste.",
|
||||
"mpchange20": "Anzahl ist keine Zahl.",
|
||||
"mpchange21": "Anzahl fehlt.",
|
||||
"mpchange22": "Es wurden keine Daten oder Dateien übermittelt.",
|
||||
"mpchange23": "Zum Verschlüsseln von Daten sind öffentliche Schlüssel erforderlich.",
|
||||
"mpchange24": "Nur verschlüsselte Daten können in private Dienste gelangen.",
|
||||
"mpchange25": "Upload aufgrund fehlgeschlagener Verschlüsselung fehlgeschlagen.",
|
||||
"mpchange26": "Upload fehlgeschlagen.",
|
||||
"mpchange27": "Ungültige Daten.",
|
||||
"mpchange28": "Keine Ressourcen zum Veröffentlichen.",
|
||||
"mpchange29": "Unbekannter Fehler.",
|
||||
"mpchange30": "Umfrage nicht gefunden.",
|
||||
"mpchange31": "Bei der Umfrage konnte nicht abgestimmt werden.",
|
||||
"mpchange32": "Umfrage konnte nicht erstellt werden.",
|
||||
"mpchange33": "Bitte geben Sie einen Qortal-Link ein - qortal://...",
|
||||
"mpchange34": "Ungültiger Qortal-Link.",
|
||||
"mpchange35": "Fehler beim Senden der Benachrichtigung.",
|
||||
"mpchange36": "Nachricht konnte nicht gesendet werden.",
|
||||
"mpchange37": "An diesen Benutzer kann keine verschlüsselte Nachricht gesendet werden, da sein öffentlicher Schlüssel nicht in der Kette vorhanden ist.",
|
||||
"mpchange38": "Anforderung konnte nicht erfüllt werden.",
|
||||
"mpchange39": "Gruppe nicht gefunden.",
|
||||
"mpchange40": "Geben Sie dieser Anwendung die Berechtigung, eine Gruppenbeitrittsanforderung auszuführen?",
|
||||
"mpchange41": "Gruppenname:",
|
||||
"mpchange42": "Gruppen-ID:",
|
||||
"mpchange43": "Gruppenbeitrittsanforderung erfolgreich erstellt.",
|
||||
"mpchange44": "Fehler beimbeitreten der Gruppe.",
|
||||
"mpchange45": "Ein MIME-Typ konnte nicht abgeleitet werden.",
|
||||
"mpchange46": "Eine Dateierweiterung konnte nicht abgeleitet werden.",
|
||||
"mpchange47": "Benutzer hat den Download abgelehnt.",
|
||||
"mpchange48": "Download konnte nicht gestartet werden.",
|
||||
"mpchange49": "AT konnte nicht bereitgestellt werden.",
|
||||
"mpchange50": "Benutzer hat kein Profil.",
|
||||
"mpchange51": "Angeforderte Daten konnten nicht gefunden werden.",
|
||||
"mpchange52": "Profildaten konnten nicht abgerufen werden.",
|
||||
"mpchange53": "Eigenschaft konnte nicht festgelegt werden.",
|
||||
"mpchange54": "Profil konnte nicht geöffnet werden.",
|
||||
"mpchange55": "Fehler beim Abrufen der Serverinformationen.",
|
||||
"mpchange56": "Fehler in der Zusammenfassung der Sendeaktivität.",
|
||||
"mpchange57": "Fehler beim Abrufen der ausländischen Gebühr.",
|
||||
"mpchange58": "Fehler beim Aktualisieren der ausländischen Gebühr.",
|
||||
"mpchange59": "Fehler beim Abrufen des Serververbindungsverlaufs.",
|
||||
"mpchange60": "Fehler beim Festlegen des aktuellen Servers.",
|
||||
"mpchange61": "Fehler beim Hinzufügen des Servers.",
|
||||
"mpchange62": "Fehler beim Entfernen des Servers.",
|
||||
"mpchange63": "Fehler beim Abrufen der Zusammenfassung.",
|
||||
"mpchange64": "Transaktion konnte nicht dekodiert werden.",
|
||||
"mpchange65": "Geben Sie dieser Anwendung die Berechtigung, eine Transaktion zu signieren und zu verarbeiten?",
|
||||
"mpchange66": "Geben Sie dieser Anwendung die Berechtigung, eine Transaktion zu signieren?",
|
||||
"mpchange67": "Lesen Sie die Transaktion sorgfältig durch, bevor Sie sie akzeptieren.",
|
||||
"mpchange68": "Tx-Typ:",
|
||||
"mpchange69": "TX-Daten:",
|
||||
"mpchange70": "Transaktion verarbeiten wurde nicht angefordert.",
|
||||
"mpchange71": "Signierte Bytes sind: ",
|
||||
"mpchange72": "Transaktion erfolgreich signiert und verarbeitet.",
|
||||
"mpchange73": "Transaktion wurde kann nicht verarbeitet werden.",
|
||||
"mpchange74": "QORT-Guthaben konnte nicht abgerufen werden. Versuchen Sie es erneut!",
|
||||
"mpchange75": "Münze konnte nicht gesendet werden.",
|
||||
"mpchange76": "BTC-Guthaben konnte nicht abgerufen werden. Versuchen Sie es erneut!",
|
||||
"mpchange77": "LTC-Guthaben konnte nicht abgerufen werden. Versuchen Sie es erneut!",
|
||||
"mpchange78": "DOGE-Guthaben konnte nicht abgerufen werden. Versuchen Sie es erneut!",
|
||||
"mpchange79": "DGB-Guthaben konnte nicht abgerufen werden. Versuchen Sie es erneut!",
|
||||
"mpchange80": "RVN-Guthaben konnte nicht abgerufen werden. Versuchen Sie es erneut!",
|
||||
"mpchange81": "ARRR-Guthaben konnte nicht abgerufen werden. Versuchen Sie es erneut!",
|
||||
"mpchange82": "FEHLENDE FELDER",
|
||||
"mpchange83": "ABGELEHNT",
|
||||
"mpchange84": "FEHLER",
|
||||
"mpchange85": "ERFOLGREICH",
|
||||
"mpchange86": "Immer automatisches Abrufen des Wallet-Guthabens zulassen",
|
||||
"mpchange87": "Bitte geben Sie die Gruppen-ID ein"
|
||||
}
|
||||
}
|
||||
|
@ -248,7 +248,9 @@
|
||||
"balance": "Saldo",
|
||||
"balances": "LOS SALDOS DE TU BILLETERA",
|
||||
"update": "ACTUALIZAR SALDOS DE CARTERA",
|
||||
"view": "Vista"
|
||||
"view": "Vista",
|
||||
"all": "Todo",
|
||||
"page": "Página"
|
||||
},
|
||||
"gifs": {
|
||||
"gchange1": "Explorador de gifs",
|
||||
@ -466,7 +468,7 @@
|
||||
"rchange6": "Receptor",
|
||||
"rchange7": "Acción",
|
||||
"rchange8": "Tipo",
|
||||
"rchange9": "Los niveles 1 a 4 solo pueden crear claves Self-Share (acuñación). ¡Solo el nivel 5 o superior puede crear una recompensa compartida!",
|
||||
"rchange9": "Los niveles 0 a 4 solo pueden crear claves Self-Share (acuñación). ¡Solo el nivel 5 o superior puede crear una recompensa compartida!",
|
||||
"rchange10": "Clave pública del receptor",
|
||||
"rchange11": "Porcentaje de Reward share",
|
||||
"rchange12": "Ejecutando el comando solicitado",
|
||||
@ -740,7 +742,8 @@
|
||||
"bchange51": "Para enviar los cambios no olvides hacer clic en 'Actualizar perfil'",
|
||||
"bchange52": "¿Le das permiso a esta aplicación para obtener la información de tu billetera?",
|
||||
"bchange53": "Permitir siempre que todas las aplicaciones recuperen automáticamente tu lista de amigos",
|
||||
"bchange54": "¿Le das permiso a esta aplicación para acceder a tu lista de amigos?"
|
||||
"bchange54": "¿Le das permiso a esta aplicación para acceder a tu lista de amigos?",
|
||||
"bchange55": "¿Le das permiso a esta aplicación para enviar este comando?"
|
||||
},
|
||||
"datapage": {
|
||||
"dchange1": "Gestión de datos",
|
||||
@ -840,7 +843,7 @@
|
||||
"cchange74": "reaccionó con",
|
||||
"cchange75": "Cargando archivo adjunto. Esto puede demorar hasta un minuto.",
|
||||
"cchange76": "Eliminando archivo adjunto. Esto puede demorar hasta un minuto.",
|
||||
"cchange77": "El tamaño del archivo adjunto supera 1 MB",
|
||||
"cchange77": "El tamaño del archivo adjunto supera 10 MB",
|
||||
"cchange78": "¿Está seguro de que desea eliminar esta imagen?",
|
||||
"cchange79": "¿Está seguro de que desea eliminar este archivo adjunto?",
|
||||
"cchange80": "Esta imagen ha sido eliminada",
|
||||
@ -853,7 +856,24 @@
|
||||
"cchange94": "cargado",
|
||||
"cchange95": "Sólo mis recursos",
|
||||
"cchange96": "Gestión de grupos abiertos",
|
||||
"cchange97": "Enlace para unirse al grupo copiado al portapapeles"
|
||||
"cchange97": "Enlace para unirse al grupo copiado al portapapeles",
|
||||
"cchange98": "Subiendo archivo. Esto puede tardar algunos minutos.",
|
||||
"cchange99": "Eliminando archivo. Esto puede tardar hasta un minuto.",
|
||||
"cchange100": "El tamaño del archivo supera los 125 MB",
|
||||
"cchange101": "¿Está seguro de que desea eliminar este archivo?",
|
||||
"cchange102": "Este archivo ha sido eliminado",
|
||||
"cchange103": "Subiendo gif. Esto puede tardar hasta un minuto.",
|
||||
"cchange104": "Eliminando gif. Esto puede tardar hasta un minuto.",
|
||||
"cchange105": "El tamaño del archivo supera los 3 MB",
|
||||
"cchange106": "¿Estás seguro de que deseas eliminar este gif?",
|
||||
"cchange107": "Este gif ha sido eliminado",
|
||||
"cchange108": "La descarga continuará en segundo plano, sólo se puede descargar UN archivo Q-Chat simultáneamente.",
|
||||
"cchange109": "¡Tipo de archivo no compatible!",
|
||||
"cchange110": "CARGAR IMAGEN",
|
||||
"cchange111": "CARGAR GIF",
|
||||
"cchange112": "CARGA DE ADJUNTOS",
|
||||
"cchange113": "CARGA DE ARCHIVO",
|
||||
"cchange114": "Escribe algo ..."
|
||||
},
|
||||
"welcomepage": {
|
||||
"wcchange1": "Bienvenido al Q-Chat",
|
||||
@ -954,8 +974,10 @@
|
||||
"gchange65": "¡Reemplace esta dirección para TRANSFERIR LA PROPIEDAD del grupo!",
|
||||
"gchange66": "Propietario no válido / Dirección de nuevo propietario",
|
||||
"gchange67": "¡Éxito de la ACTUALIZACIÓN del grupo!",
|
||||
"gchange68": "Establecer avatar de grupo"
|
||||
|
||||
"gchange68": "Establecer avatar de grupo",
|
||||
"gchange69": "Mensajes",
|
||||
"gchange70": "¡No hay mensajes en las últimas 24 horas!",
|
||||
"gchange71": "¡Ya te uniste a este grupo!"
|
||||
},
|
||||
"puzzlepage": {
|
||||
"pchange1": "Rompecabezas",
|
||||
@ -1298,5 +1320,104 @@
|
||||
"tour20": "bloques detrás. ¿Le gustaría actualizar (arrancar) para acelerar el proceso de sincronización?",
|
||||
"tour21": "bloques restantes.",
|
||||
"tour22": "Se solicitó actualización (arranque). Espere."
|
||||
},
|
||||
"chatsettings": {
|
||||
"cs1": "Configuración de chat",
|
||||
"cs2": "Configuración general del chat",
|
||||
"cs3": "Marca de tiempo del mensaje de chat",
|
||||
"cs4": "Hace tiempo",
|
||||
"cs5": "Hora local",
|
||||
"cs6": "Tamaño de fuente del mensaje de chat",
|
||||
"cs7": "Estándar",
|
||||
"cs8": "px"
|
||||
},
|
||||
"modals": {
|
||||
"mpchange1": "Todos los AT solicitados deben ser de la misma Blockchain extranjera.",
|
||||
"mpchange2": "¿Le da permiso a esta aplicación para ejecutar una orden de compra?",
|
||||
"mpchange3": "Orden de compra creada con éxito",
|
||||
"mpchange4": "Espere hasta que se complete la orden de compra",
|
||||
"mpchange5": "Error al enviar la orden de compra.",
|
||||
"mpchange6": "¿Le da permiso a esta aplicación para ejecutar una orden de venta?",
|
||||
"mpchange7": "Para:",
|
||||
"mpchange8": "Orden de venta creada con éxito.",
|
||||
"mpchange9": "Espere hasta que se incluya la orden de venta.",
|
||||
"mpchange10": "Error al enviar la orden de venta.",
|
||||
"mpchange11": "No se puede encontrar la información del AT.",
|
||||
"mpchange12": "¿Le da permiso a esta aplicación para ejecutar la cancelación de una orden de venta?",
|
||||
"mpchange13": "Orden de venta cancelada con éxito.",
|
||||
"mpchange14": "Espere hasta que se complete la cancelación de la operación cumplido.",
|
||||
"mpchange15": "Error al cancelar la orden de venta.",
|
||||
"mpchange16": "Error al recuperar la lista.",
|
||||
"mpchange17": "Error al agregar a la lista.",
|
||||
"mpchange18": "Error al eliminar la lista.",
|
||||
"mpchange19": "Error al recuperar la lista de amigos.",
|
||||
"mpchange20": "El recuento no es un número.",
|
||||
"mpchange21": "Falta el recuento.",
|
||||
"mpchange22": "No se enviaron datos ni archivos.",
|
||||
"mpchange23": "El cifrado de datos requiere claves públicas.",
|
||||
"mpchange24": "Solo los datos cifrados pueden ingresar a servicios privados.",
|
||||
"mpchange25": "Error de carga debido a un cifrado fallido.",
|
||||
"mpchange26": "Error de carga.",
|
||||
"mpchange27": "Datos no válidos.",
|
||||
"mpchange28": "No hay recursos para publicar.",
|
||||
"mpchange29": "Error desconocido.",
|
||||
"mpchange30": "Encuesta no encontrada.",
|
||||
"mpchange31": "Error al votar en la encuesta.",
|
||||
"mpchange32": "Error al crear la encuesta.",
|
||||
"mpchange33": "Por favor, introduzca un enlace qortal - qortal://...",
|
||||
"mpchange34": "Enlace qortal no válido.",
|
||||
"mpchange35": "Error al enviar la notificación.",
|
||||
"mpchange36": "No se pudo enviar el mensaje.",
|
||||
"mpchange37": "No se puede enviar un mensaje cifrado a este usuario ya que no tiene su clave pública en la cadena.",
|
||||
"mpchange38": "No se pudo completar la solicitud.",
|
||||
"mpchange39": "Grupo no encontrado.",
|
||||
"mpchange40": "¿Le da permiso a esta aplicación para realizar una solicitud de unirse a un grupo?",
|
||||
"mpchange41": "Nombre del grupo:",
|
||||
"mpchange42": "ID del grupo:",
|
||||
"mpchange43": "Solicitud de unirse a un grupo creada correctamente.",
|
||||
"mpchange44": "Error al unirse al grupo.",
|
||||
"mpchange45": "No se pudo derivar un tipo mime.",
|
||||
"mpchange46": "No se pudo derivar una extensión de archivo.",
|
||||
"mpchange47": "El usuario rechazó la descarga.",
|
||||
"mpchange48": "Error al iniciar la descarga.",
|
||||
"mpchange49": "Error al implementar AT.",
|
||||
"mpchange50": "El usuario no tiene un perfil.",
|
||||
"mpchange51": "No se pueden encontrar los datos solicitados.",
|
||||
"mpchange52": "Error al obtener los datos del perfil.",
|
||||
"mpchange53": "Error al establecer la propiedad.",
|
||||
"mpchange54": "Error al abrir el perfil.",
|
||||
"mpchange55": "Error al recuperar la información del servidor.",
|
||||
"mpchange56": "Error en el resumen de la actividad de la transacción.",
|
||||
"mpchange57": "Error al obtener la tarifa extranjera.",
|
||||
"mpchange58": "Error en la actualización de la tarifa extranjera.",
|
||||
"mpchange59": "Error al obtener el historial de conexión del servidor.",
|
||||
"mpchange60": "Error al establecer el servidor actual.",
|
||||
"mpchange61": "Error al agregar servidor.",
|
||||
"mpchange62": "Error al eliminar servidor.",
|
||||
"mpchange63": "Error al recuperar el resumen.",
|
||||
"mpchange64": "Error al decodificar la transacción.",
|
||||
"mpchange65": "¿Le da permiso a esta aplicación para firmar y procesar una transacción?",
|
||||
"mpchange66": "¿Le da permiso a esta aplicación para firmar una transacción?",
|
||||
"mpchange67": "Lea la transacción cuidadosamente antes de aceptarla.",
|
||||
"mpchange68": "Tipo de transacción:",
|
||||
"mpchange69": "Datos de la transacción:",
|
||||
"mpchange70": "No se solicitó procesar la transacción.",
|
||||
"mpchange71": "Los bytes firmados son: ",
|
||||
"mpchange72": "Transacción firmada y procesada exitosamente.",
|
||||
"mpchange73": "No se pudo procesar la transacción.",
|
||||
"mpchange74": "Error al obtener el saldo de QORT. ¡Inténtalo de nuevo!",
|
||||
"mpchange75": "No se pudo enviar la moneda.",
|
||||
"mpchange76": "Error al obtener el saldo de BTC. ¡Inténtalo de nuevo!",
|
||||
"mpchange77": "Error al obtener el saldo de LTC. ¡Inténtalo de nuevo!",
|
||||
"mpchange78": "Error al obtener el saldo de DOGE. ¡Inténtalo de nuevo!",
|
||||
"mpchange79": "Error al obtener el saldo de DGB. ¡Inténtalo de nuevo!",
|
||||
"mpchange80": "Error al obtener el saldo de RVN. ¡Inténtalo de nuevo!",
|
||||
"mpchange81": "Error al obtener el saldo de ARRR. ¡Inténtalo de nuevo!",
|
||||
"mpchange82": "CAMPOS FALTANTES",
|
||||
"mpchange83": "RECHAZADO",
|
||||
"mpchange84": "ERROR",
|
||||
"mpchange85": "ÉXITO",
|
||||
"mpchange86": "Permitir siempre obtener el saldo de la billetera automáticamente",
|
||||
"mpchange87": "Por favor, introduzca el ID del grupo"
|
||||
}
|
||||
}
|
||||
|
@ -248,7 +248,9 @@
|
||||
"balance": "Saldo",
|
||||
"balances": "Sinu saldoseisud",
|
||||
"update": "Saldoseisude uuendamine",
|
||||
"view": "Vaata"
|
||||
"view": "Vaata",
|
||||
"all": "Kõik",
|
||||
"page": "Lehekülg"
|
||||
},
|
||||
"gifs": {
|
||||
"gchange1": "Gif avastaja",
|
||||
@ -466,7 +468,7 @@
|
||||
"rchange6": "Saaja",
|
||||
"rchange7": "Tegevus",
|
||||
"rchange8": "Tüüp",
|
||||
"rchange9": "Tase 1 - 4 saab luua iseseiseva jagamise. Tase 5 või kõrgem saab luua Preemiajagamise!",
|
||||
"rchange9": "Tase 0 - 4 saab luua iseseiseva jagamise. Tase 5 või kõrgem saab luua Preemiajagamise!",
|
||||
"rchange10": "Saaja avalik võti",
|
||||
"rchange11": "Preemiajagamise protsent",
|
||||
"rchange12": "Teeb midagi maitsvat",
|
||||
@ -740,7 +742,8 @@
|
||||
"bchange51": "Muudatuste esitamiseks ärge unustage klõpsata Uuenda profiili",
|
||||
"bchange52": "Kas annate sellele rakendusele loa oma rahakoti teabe hankimiseks?",
|
||||
"bchange53": "Luba alati oma sõprade loendit kõikidel rakendustel automaatselt laadida",
|
||||
"bchange54": "Kas annate sellele rakendusele loa juurdepääsuks oma sõbraloendile?"
|
||||
"bchange54": "Kas annate sellele rakendusele loa juurdepääsuks oma sõbraloendile?",
|
||||
"bchange55": "Kas annad sellele rakendusele loa selle käsu saatmiseks?"
|
||||
},
|
||||
"datapage": {
|
||||
"dchange1": "Andmete haldamine",
|
||||
@ -840,7 +843,7 @@
|
||||
"cchange74": "reageerisid",
|
||||
"cchange75": "Manuse üleslaadimine. See võib võtta kuni minuti.",
|
||||
"cchange76": "Manuse kustutamine, võib võtta kuni minuti.",
|
||||
"cchange77": "Manuse suurus ületab 1 MB mahu",
|
||||
"cchange77": "Manuse suurus ületab 10 MB mahu",
|
||||
"cchange78": "Kas oled kindel, et soovid selle pildi kustutada?",
|
||||
"cchange79": "Kas oled kindel, et soovid selle manuse kustutada?",
|
||||
"cchange80": "Pilt kustutatud",
|
||||
@ -853,7 +856,24 @@
|
||||
"cchange94": "laaditud",
|
||||
"cchange95": "Ainult minu ressursid",
|
||||
"cchange96": "Avatud rühmahaldus",
|
||||
"cchange97": "Grupiga liitumise link on lõikelauale kopeeritud"
|
||||
"cchange97": "Grupiga liitumise link on lõikelauale kopeeritud",
|
||||
"cchange98": "Faili üleslaadimine. See võib võtta mõne minuti.",
|
||||
"cchange99": "Faili kustutamine. Selleks võib kuluda kuni üks minut.",
|
||||
"cchange100": "Faili suurus ületab 125 MB",
|
||||
"cchange101": "Kas soovite kindlasti selle faili kustutada?",
|
||||
"cchange102": "See fail on kustutatud",
|
||||
"cchange103": "GIF-i üleslaadimine. Selleks võib kuluda kuni üks minut.",
|
||||
"cchange104": "GIF-i kustutamine. Selleks võib kuluda kuni üks minut.",
|
||||
"cchange105": "Faili suurus ületab 3 MB",
|
||||
"cchange106": "Kas soovite kindlasti selle GIF-i kustutada?",
|
||||
"cchange107": "See gif on kustutatud",
|
||||
"cchange108": "Allalaadimine jätkub taustal, korraga saab alla laadida ainult ÜHE Q-Chat faili.",
|
||||
"cchange109": "Failitüüpi ei toetata!",
|
||||
"cchange110": "PILDI ÜLESLAADIMINE",
|
||||
"cchange111": "GIF-I ÜLESLAADIMINE",
|
||||
"cchange112": "MANUSE ÜLESLAADIMINE",
|
||||
"cchange113": "FAILI ÜLESLAADIMINE",
|
||||
"cchange114": "Kirjutage midagi ..."
|
||||
},
|
||||
"welcomepage": {
|
||||
"wcchange1": "Tere tulemast Q-Chatti",
|
||||
@ -954,7 +974,10 @@
|
||||
"gchange65": "Asendage see aadress grupi omandiõiguse üleandmiseks!",
|
||||
"gchange66": "Kehtetu omanik / uue omaniku aadress",
|
||||
"gchange67": "Grupi UUENDAMINE edukas!",
|
||||
"gchange68": "Rühma avatari määramine"
|
||||
"gchange68": "Rühma avatari määramine",
|
||||
"gchange69": "Sõnumid",
|
||||
"gchange70": "Viimase 24 tunni jooksul pole ühtegi sõnumit!",
|
||||
"gchange71": "Olete selle grupiga juba liitunud!"
|
||||
},
|
||||
"puzzlepage": {
|
||||
"pchange1": "Puzzled",
|
||||
@ -1297,5 +1320,104 @@
|
||||
"tour20": "blokeerib taga. Kas soovite sünkroonimisprotsessi kiirendamiseks värskendada (bootstrap)?",
|
||||
"tour21": "jäänud plokke.",
|
||||
"tour22": "Taotleb värskendamist (bootstrap). Palun oodake."
|
||||
},
|
||||
"chatsettings": {
|
||||
"cs1": "Vestluse seaded",
|
||||
"cs2": "Üldised vestluse seaded",
|
||||
"cs3": "Vestlussõnumi ajatempel",
|
||||
"cs4": "Aeg tagasi",
|
||||
"cs5": "Kohalik aeg",
|
||||
"cs6": "Vestlussõnumi fondi suurus",
|
||||
"cs7": "Standardne",
|
||||
"cs8": "px"
|
||||
},
|
||||
"modals": {
|
||||
"mpchange1": "Kõik taotletud AT peavad olema samast välismaisest plokiahelast.",
|
||||
"mpchange2": "Kas annate sellele rakendusele loa ostutellimuse täitmiseks?",
|
||||
"mpchange3": "Ostutellimuse loomine õnnestus",
|
||||
"mpchange4": "Palun oodake, kuni ostutellimus täidetakse",
|
||||
"mpchange5": "Ostutellimuse esitamine ebaõnnestus.",
|
||||
"mpchange6": "Kas annate sellele rakendusele loa müügitellimuse täitmiseks?",
|
||||
"mpchange7": "For:",
|
||||
"mpchange8": "Müügitellimuse loomine õnnestus.",
|
||||
"mpchange9": "Palun oodake, kuni müügitellimus loetletakse.",
|
||||
"mpchange10": "Müügitellimuse esitamine ebaõnnestus.",
|
||||
"mpchange11": "Ei leia AT-teavet.",
|
||||
"mpchange12": "Kas annate sellele rakendusele loa müügitellimuse tühistamiseks?",
|
||||
"mpchange13": "Müügitellimus on edukalt tühistatud.",
|
||||
"mpchange14": "Palun oodake, kuni tehingu tühistamine täidetakse.",
|
||||
"mpchange15": "Müügitellimuse tühistamine ebaõnnestus.",
|
||||
"mpchange16": "Viga loendi toomisel.",
|
||||
"mpchange17": "Viga loendisse lisamisel.",
|
||||
"mpchange18": "Viga kustutamisloendis.",
|
||||
"mpchange19": "Viga sõbraloendi toomisel.",
|
||||
"mpchange20": "Arv ei ole arv.",
|
||||
"mpchange21": "Puuduv arv.",
|
||||
"mpchange22": "Andmeid ega faili ei esitatud.",
|
||||
"mpchange23": "Andmete krüptimiseks on vaja avalikke võtmeid.",
|
||||
"mpchange24": "Privaatteenustesse saab minna ainult krüptitud andmeid.",
|
||||
"mpchange25": "Üleslaadimine nurjus krüptimise ebaõnnestumise tõttu.",
|
||||
"mpchange26": "Üleslaadimine ebaõnnestus.",
|
||||
"mpchange27": "Valed andmed.",
|
||||
"mpchange28": "Avaldamiseks pole ressursse.",
|
||||
"mpchange29": "Tundmatu viga.",
|
||||
"mpchange30": "Küsitlust ei leitud.",
|
||||
"mpchange31": "Küsitluses hääletamine ebaõnnestus.",
|
||||
"mpchange32": "Küsitluse loomine ebaõnnestus.",
|
||||
"mpchange33": "Palun sisestage qortali link - qortal://...",
|
||||
"mpchange34": "Vigane qortal link.",
|
||||
"mpchange35": "Viga teatise tõukamisel.",
|
||||
"mpchange36": "Sõnumit ei saanud saata.",
|
||||
"mpchange37": "Sellele kasutajale ei saa krüpteeritud sõnumit saata, kuna tal pole avalikku võtit ketis.",
|
||||
"mpchange38": "Taotlust ei saanud täita.",
|
||||
"mpchange39": "Grupi ei leitud.",
|
||||
"mpchange40": "Kas annate sellele rakendusele loa grupiga liitumise taotluse täitmiseks?",
|
||||
"mpchange41": "Rühma nimi:",
|
||||
"mpchange42": "Grupi ID:",
|
||||
"mpchange43": "Grupiga liitumistaotluse loomine õnnestus.",
|
||||
"mpchange44": "Grupiga liitumine ebaõnnestus.",
|
||||
"mpchange45": "Mime tüüpi ei saanud tuletada.",
|
||||
"mpchange46": "Faililaiendit ei saanud tuletada.",
|
||||
"mpchange47": "Kasutaja keeldus allalaadimisest.",
|
||||
"mpchange48": "Allalaadimine ebaõnnestus.",
|
||||
"mpchange49": "AT juurutamine ebaõnnestus.",
|
||||
"mpchange50": "Kasutajal pole profiili.",
|
||||
"mpchange51": "Ei leia nõutud andmeid.",
|
||||
"mpchange52": "Profiiliandmete hankimine ebaõnnestus.",
|
||||
"mpchange53": "Atribuudi määramine nurjus.",
|
||||
"mpchange54": "Profiili avamine nurjus.",
|
||||
"mpchange55": "Viga serveri teabe hankimisel.",
|
||||
"mpchange56": "Viga tx-tegevuse kokkuvõttes.",
|
||||
"mpchange57": "Viga välistasu hankimisel.",
|
||||
"mpchange58": "Viga välistasu värskendamisel.",
|
||||
"mpchange59": "Viga serveri ühenduse ajaloo hankimisel.",
|
||||
"mpchange60": "Viga praeguse serveri määramisel.",
|
||||
"mpchange61": "Viga serveri lisamisel.",
|
||||
"mpchange62": "Viga serveri eemaldamisel.",
|
||||
"mpchange63": "Viga kokkuvõtte toomisel.",
|
||||
"mpchange64": "Tehingu dekodeerimine ebaõnnestus.",
|
||||
"mpchange65": "Kas annate sellele rakendusele loa tehingu allkirjastamiseks ja töötlemiseks?",
|
||||
"mpchange66": "Kas annate sellele rakendusele loa tehingu allkirjastamiseks?",
|
||||
"mpchange67": "Enne aktsepteerimist lugege tehing hoolikalt läbi.",
|
||||
"mpchange68": "Tx tüüp:",
|
||||
"mpchange69": "TX andmed:",
|
||||
"mpchange70": "Protsessi tehingut ei taotletud.",
|
||||
"mpchange71": "Allkirjastatud baidid on: ",
|
||||
"mpchange72": "Tehing on allkirjastatud ja edukalt töödeldud.",
|
||||
"mpchange73": "Tehingut ei saanud töödelda.",
|
||||
"mpchange74": "QORT saldo toomine ebaõnnestus. Proovige uuesti!",
|
||||
"mpchange75": "Münti ei saanud saata.",
|
||||
"mpchange76": "BTC saldo toomine ebaõnnestus. Proovige uuesti!",
|
||||
"mpchange77": "LTC saldo toomine ebaõnnestus. Proovige uuesti!",
|
||||
"mpchange78": "DOGE saldo toomine ebaõnnestus. Proovige uuesti!",
|
||||
"mpchange79": "DGB tasakaalu toomine ebaõnnestus. Proovige uuesti!",
|
||||
"mpchange80": "RVN-i saldo toomine ebaõnnestus. Proovige uuesti!",
|
||||
"mpchange81": "ARRR-i saldo toomine ebaõnnestus. Proovige uuesti!",
|
||||
"mpchange82": "PUUDUVAD VÄLJAD",
|
||||
"mpchange83": "DECLINED",
|
||||
"mpchange84": "FAILURE",
|
||||
"mpchange85": "EDU",
|
||||
"mpchange86": "Luba alati rahakoti saldo automaatne hankimine",
|
||||
"mpchange87": "Palun sisestage grupi ID"
|
||||
}
|
||||
}
|
||||
|
@ -248,7 +248,9 @@
|
||||
"balance": "Saldosi",
|
||||
"balances": "Sinun saldosi",
|
||||
"update": "Saldot päivitetään",
|
||||
"view": "Katso"
|
||||
"view": "Katso",
|
||||
"all": "Kaikki",
|
||||
"page": "Sivu"
|
||||
},
|
||||
"gifs": {
|
||||
"gchange1": "Gif tutkija",
|
||||
@ -466,7 +468,7 @@
|
||||
"rchange6": "Vastaanottaja",
|
||||
"rchange7": "Toiminta",
|
||||
"rchange8": "Tyyppi",
|
||||
"rchange9": "Tasot 1 - 4 voivat luoda erillisen jaon. Taso 5 tai korkeampi voi luoda palkintoosuuden!",
|
||||
"rchange9": "Tasot 0 - 4 voivat luoda erillisen jaon. Taso 5 tai korkeampi voi luoda palkintoosuuden!",
|
||||
"rchange10": "Vastaanottajan julkinen avain",
|
||||
"rchange11": "Palkintojen jakoprosentti",
|
||||
"rchange12": "Tekee jotain herkullista",
|
||||
@ -740,7 +742,8 @@
|
||||
"bchange51": "Älä unohda napsauttaa Päivitä profiili lähettääksesi muutokset",
|
||||
"bchange52": "Sallitko tämän sovelluksen saada lompakkosi tiedot?",
|
||||
"bchange53": "Anna aina kaikkien sovellusten ladata ystäväluettelosi automaattisesti",
|
||||
"bchange54": "Sallitko tämän sovelluksen käyttää ystäväluetteloasi?"
|
||||
"bchange54": "Sallitko tämän sovelluksen käyttää ystäväluetteloasi?",
|
||||
"bchange55": "Sallitko tämän sovelluksen lähettää tämän komennon?"
|
||||
},
|
||||
"datapage": {
|
||||
"dchange1": "Tiedonhallinta",
|
||||
@ -840,7 +843,7 @@
|
||||
"cchange74": "vastasi",
|
||||
"cchange75": "Lähetetään liitettä. Tämä voi kestää minuutin.",
|
||||
"cchange76": "Liitetiedoston poistaminen voi kestää minuutin.",
|
||||
"cchange77": "Liitekoko ylittää 1 Mt",
|
||||
"cchange77": "Liitekoko ylittää 10 Mt",
|
||||
"cchange78": "Haluatko varmasti poistaa tämän kuvan?",
|
||||
"cchange79": "Haluatko varmasti poistaa tämän liitteen?",
|
||||
"cchange80": "Kuva poistettu",
|
||||
@ -853,7 +856,24 @@
|
||||
"cchange94": "ladattu",
|
||||
"cchange95": "Vain minun resurssit",
|
||||
"cchange96": "Avoin ryhmänhallinta",
|
||||
"cchange97": "Ryhmän liittymislinkki kopioitu leikepöydälle"
|
||||
"cchange97": "Ryhmän liittymislinkki kopioitu leikepöydälle",
|
||||
"cchange98": "Ladataan tiedostoa. Tämä voi kestää muutaman minuutin.",
|
||||
"cchange99": "Poistetaan tiedostoa. Tämä voi kestää minuutin.",
|
||||
"cchange100": "Tiedoston koko ylittää 125 Mt",
|
||||
"cchange101": "Haluatko varmasti poistaa tämän tiedoston?",
|
||||
"cchange102": "Tämä tiedosto on poistettu",
|
||||
"cchange103": "Ladataan GIF-tiedostoa. Tämä voi kestää minuutin.",
|
||||
"cchange104": "Poistetaan GIF-tiedostoa. Tämä voi kestää minuutin.",
|
||||
"cchange105": "Tiedoston koko ylittää 3 Mt",
|
||||
"cchange106": "Haluatko varmasti poistaa tämän gifin?",
|
||||
"cchange107": "Tämä gif on poistettu",
|
||||
"cchange108": "Lataus jatkuu taustalla, vain YKSI Q-Chat-tiedosto voidaan ladata samanaikaisesti.",
|
||||
"cchange109": "Tiedostotyyppiä ei tueta!",
|
||||
"cchange110": "KUVAN LATAUS",
|
||||
"cchange111": "GIF LATAUS",
|
||||
"cchange112": "LIITTEEN LATAUS",
|
||||
"cchange113": "TIEDOSTON LATAUS",
|
||||
"cchange114": "Kirjoita jotain ..."
|
||||
},
|
||||
"welcomepage": {
|
||||
"wcchange1": "Tervetuloa Q-Chatiin",
|
||||
@ -954,7 +974,10 @@
|
||||
"gchange65": "Korvaa tämä osoite muotoon SIIRRÄ RYHMÄN OMISTAJUUS!",
|
||||
"gchange66": "Virheellinen omistaja / uuden omistajan osoite",
|
||||
"gchange67": "Ryhmän päivitys onnistui!",
|
||||
"gchange68": "Aseta ryhmän avatar"
|
||||
"gchange68": "Aseta ryhmän avatar",
|
||||
"gchange69": "Viestit",
|
||||
"gchange70": "Ei viestejä viimeisen 24 tunnin aikana!",
|
||||
"gchange71": "Olet jo liittynyt tähän ryhmään!"
|
||||
},
|
||||
"puzzlepage": {
|
||||
"pchange1": "Palapelit",
|
||||
@ -1297,5 +1320,104 @@
|
||||
"tour20": "blokkeja takana. Haluatko päivittää (bootstrap) nopeuttaaksesi synkronointiprosessia?",
|
||||
"tour21": "jäljellä olevat lohkot.",
|
||||
"tour22": "Pyydellään päivitystä (bootstrap). Odota."
|
||||
},
|
||||
"chatsettings": {
|
||||
"cs1": "Pikaviestiasetukset",
|
||||
"cs2": "Yleiset chat-asetukset",
|
||||
"cs3": "Pikaviestin aikaleima",
|
||||
"cs4": "Aika sitten",
|
||||
"cs5": "Paikallinen aika",
|
||||
"cs6": "Chat-viestin kirjasinkoko",
|
||||
"cs7": "Vakio",
|
||||
"cs8": "px"
|
||||
},
|
||||
"modals": {
|
||||
"mpchange1": "Kaikkien pyydettyjen AT:iden on oltava samasta ulkomaisesta lohkoketjusta.",
|
||||
"mpchange2": "Annatko tälle sovellukselle luvan tehdä ostotilaus?",
|
||||
"mpchange3": "Ostotilauksen luominen onnistui",
|
||||
"mpchange4": "Odota, kunnes ostotilaus on täytetty",
|
||||
"mpchange5": "Ostotilauksen lähettäminen epäonnistui.",
|
||||
"mpchange6": "Annatko tälle sovellukselle luvan suorittaa myyntitilaus?",
|
||||
"mpchange7": "For:",
|
||||
"mpchange8": "Myyntitilauksen luominen onnistui.",
|
||||
"mpchange9": "Odota, kunnes myyntitilaus tulee listalle.",
|
||||
"mpchange10": "Myyntitilauksen lähettäminen epäonnistui.",
|
||||
"mpchange11": "AT-tietoja ei löydy.",
|
||||
"mpchange12": "Annatko tälle sovellukselle luvan peruuttaa myyntitilaus?",
|
||||
"mpchange13": "Myyntitilaus peruutettu onnistuneesti.",
|
||||
"mpchange14": "Odota, kunnes kaupan peruutus toteutuu.",
|
||||
"mpchange15": "Myyntitilauksen peruuttaminen epäonnistui.",
|
||||
"mpchange16": "Virhe haettaessa luetteloa.",
|
||||
"mpchange17": "Virhe lisättäessä luetteloon.",
|
||||
"mpchange18": "Virhe poistoluettelossa.",
|
||||
"mpchange19": "Virhe haettaessa ystäväluetteloa.",
|
||||
"mpchange20": "Laskuri ei ole luku.",
|
||||
"mpchange21": "Puuttuva määrä.",
|
||||
"mpchange22": "Tietoja tai tiedostoa ei lähetetty.",
|
||||
"mpchange23": "Tietojen salaus vaatii julkisia avaimia.",
|
||||
"mpchange24": "Vain salattu data voi mennä yksityisiin palveluihin.",
|
||||
"mpchange25": "Lataus epäonnistui epäonnistuneen salauksen takia.",
|
||||
"mpchange26": "Lataus epäonnistui.",
|
||||
"mpchange27": "Virheelliset tiedot.",
|
||||
"mpchange28": "Ei resursseja julkaistavaksi.",
|
||||
"mpchange29": "Tuntematon virhe.",
|
||||
"mpchange30": "Kyselyä ei löydy.",
|
||||
"mpchange31": "Äänestys kyselyssä epäonnistui.",
|
||||
"mpchange32": "Kyselyn luominen epäonnistui.",
|
||||
"mpchange33": "Anna qortal-linkki - qortal://...",
|
||||
"mpchange34": "Virheellinen qortal-linkki.",
|
||||
"mpchange35": "Virhe lähetettäessä ilmoitusta.",
|
||||
"mpchange36": "Viestiä ei voitu lähettää.",
|
||||
"mpchange37": "Tälle käyttäjälle ei voi lähettää salattua viestiä, koska hänellä ei ole julkista avainta ketjussa.",
|
||||
"mpchange38": "Pyyntöä ei voitu täyttää.",
|
||||
"mpchange39": "Ryhmää ei löydy.",
|
||||
"mpchange40": "Annatko tälle sovellukselle luvan suorittaa liittymispyyntö?",
|
||||
"mpchange41": "Ryhmän nimi:",
|
||||
"mpchange42": "Ryhmätunnus:",
|
||||
"mpchange43": "Ryhmään liittymispyyntö luotu onnistuneesti.",
|
||||
"mpchange44": "Ryhmään liittyminen epäonnistui.",
|
||||
"mpchange45": "Mime-tyyppiä ei voitu johtaa.",
|
||||
"mpchange46": "Tiedostotunnistetta ei voitu johtaa.",
|
||||
"mpchange47": "Käyttäjä hylkäsi latauksen.",
|
||||
"mpchange48": "Latauksen aloittaminen epäonnistui.",
|
||||
"mpchange49": "AT:n käyttöönotto epäonnistui.",
|
||||
"mpchange50": "Käyttäjällä ei ole profiilia.",
|
||||
"mpchange51": "Pyydettyjä tietoja ei löydy.",
|
||||
"mpchange52": "Profiilitietojen hakeminen epäonnistui.",
|
||||
"mpchange53": "Ominaisuuden asettaminen epäonnistui.",
|
||||
"mpchange54": "Profiilin avaaminen epäonnistui.",
|
||||
"mpchange55": "Virhe haettaessa palvelintietoja.",
|
||||
"mpchange56": "Virhe tx-toimintojen yhteenvedossa.",
|
||||
"mpchange57": "Virhe ulkomaisen maksun saamisessa.",
|
||||
"mpchange58": "Virhe ulkomaanmaksun päivityksessä.",
|
||||
"mpchange59": "Virhe haettaessa palvelinyhteyshistoriaa.",
|
||||
"mpchange60": "Virhe nykyisen palvelimen asettamisessa.",
|
||||
"mpchange61": "Virhe lisäyspalvelimessa.",
|
||||
"mpchange62": "Virhe poistopalvelimessa.",
|
||||
"mpchange63": "Virhe haettaessa yhteenvetoa.",
|
||||
"mpchange64": "Tapahtuman purkaminen epäonnistui.",
|
||||
"mpchange65": "Annatko tälle sovellukselle luvan allekirjoittaa ja käsitellä tapahtuma?",
|
||||
"mpchange66": "Annatko tälle sovellukselle luvan allekirjoittaa tapahtuma?",
|
||||
"mpchange67": "Lue tapahtuma huolellisesti ennen hyväksymistä.",
|
||||
"mpchange68": "Tx-tyyppi:",
|
||||
"mpchange69": "TX Data:",
|
||||
"mpchange70": "Prosessitapahtumaa ei pyydetty.",
|
||||
"mpchange71": "Allekirjoitetut tavut ovat: ",
|
||||
"mpchange72": "Tapahtuma allekirjoitettu ja käsitelty onnistuneesti.",
|
||||
"mpchange73": "Tapahtumaa ei voitu käsitellä.",
|
||||
"mpchange74": "QORT-saldon nouto epäonnistui. Yritä uudelleen!",
|
||||
"mpchange75": "Kolikon lähettäminen ei onnistunut.",
|
||||
"mpchange76": "BTC-saldon hakeminen epäonnistui. Yritä uudelleen!",
|
||||
"mpchange77": "LTC-saldon hakeminen epäonnistui. Yritä uudelleen!",
|
||||
"mpchange78": "DOGE-saldon hakeminen epäonnistui. Yritä uudelleen!",
|
||||
"mpchange79": "DGB-tasapainon nouto epäonnistui. Yritä uudelleen!",
|
||||
"mpchange80": "RVN-saldon hakeminen epäonnistui. Yritä uudelleen!",
|
||||
"mpchange81": "ARRR-saldon hakeminen epäonnistui. Yritä uudelleen!",
|
||||
"mpchange82": "PUITTUVAT KENTÄT",
|
||||
"mpchange83": "hylätty",
|
||||
"mpchange84": "FAILURE",
|
||||
"mpchange85": "SUCCESS",
|
||||
"mpchange86": "Salli aina saada lompakon saldo automaattisesti",
|
||||
"mpchange87": "Anna ryhmän tunnus"
|
||||
}
|
||||
}
|
||||
|
@ -248,7 +248,9 @@
|
||||
"balance": "Solde",
|
||||
"balances": "VOS SOLDES DE PORTEFEUILLE",
|
||||
"update": "METTRE À JOUR LES SOLDES DES PORTEFEUILLES",
|
||||
"view": "Voir"
|
||||
"view": "Voir",
|
||||
"all": "Tous",
|
||||
"page": "Page"
|
||||
},
|
||||
"gifs": {
|
||||
"gchange1": "Explorateur GIF",
|
||||
@ -466,7 +468,7 @@
|
||||
"rchange6": "Destinataire",
|
||||
"rchange7": "Action",
|
||||
"rchange8": "Type",
|
||||
"rchange9": "Niveau 1 - 4 peuvent créer un autopartage et niveau 5 et supérieur peuvent créer un partage de récompense!",
|
||||
"rchange9": "Niveau 0 - 4 peuvent créer un autopartage et niveau 5 et supérieur peuvent créer un partage de récompense!",
|
||||
"rchange10": "Clé publique du bénéficiaire",
|
||||
"rchange11": "Pourcentage du partage de récompense",
|
||||
"rchange12": "Faire quelque chose de délicieux",
|
||||
@ -740,7 +742,8 @@
|
||||
"bchange51": "Pour soumettre les modifications n'oubliez pas de cliquer sur 'Mettre à jour le profil'",
|
||||
"bchange52": "Autorisez-vous cette application à obtenir les informations de votre portefeuille ?",
|
||||
"bchange53": "Toujours autoriser la récupération automatique de votre liste d'amis par toutes les applications",
|
||||
"bchange54": "Autorisez-vous cette application à accéder à votre liste d'amis ?"
|
||||
"bchange54": "Autorisez-vous cette application à accéder à votre liste d'amis ?",
|
||||
"bchange55": "Autorisez-vous cette application à envoyer cette commande ?"
|
||||
},
|
||||
"datapage": {
|
||||
"dchange1": "Gestion de données",
|
||||
@ -840,7 +843,7 @@
|
||||
"cchange74": "a réagi avec",
|
||||
"cchange75": "Téléchargement de la pièce jointe. Cela peut prendre jusqu'à une minute.",
|
||||
"cchange76": "Suppression de la pièce jointe. Cela peut prendre jusqu'à une minute.",
|
||||
"cchange77": "La taille de la pièce jointe dépasse 1 Mo",
|
||||
"cchange77": "La taille de la pièce jointe dépasse 10 Mo",
|
||||
"cchange78": "Êtes-vous sûr de vouloir supprimer cette image ?",
|
||||
"cchange79": "Êtes-vous sûr de vouloir supprimer cette pièce jointe ?",
|
||||
"cchange80": "Cette image a été supprimée",
|
||||
@ -853,7 +856,24 @@
|
||||
"cchange94": "chargé",
|
||||
"cchange95": "Uniquement mes ressources",
|
||||
"cchange96": "Gestion de groupe ouverte",
|
||||
"cchange97": "Lien de rejoindre le groupe copié dans le presse-papiers"
|
||||
"cchange97": "Lien de rejoindre le groupe copié dans le presse-papiers",
|
||||
"cchange98": "Téléchargement du fichier. Cela peut prendre quelques minutes.",
|
||||
"cchange99": "Suppression du fichier. Cela peut prendre jusqu'à une minute.",
|
||||
"cchange100": "La taille du fichier dépasse 125 Mo",
|
||||
"cchange101": "Etes-vous sûr de vouloir supprimer ce fichier ?",
|
||||
"cchange102": "Ce fichier a été supprimé",
|
||||
"cchange103": "Téléchargement du gif. Cela peut prendre jusqu'à une minute.",
|
||||
"cchange104": "Suppression du gif. Cela peut prendre jusqu'à une minute.",
|
||||
"cchange105": "La taille du fichier dépasse 3 Mo",
|
||||
"cchange106": "Etes-vous sûr de vouloir supprimer ce gif ?",
|
||||
"cchange107": "Ce gif a été supprimé",
|
||||
"cchange108": "Le téléchargement continuera en arrière-plan, UN seul fichier Q-Chat peut être téléchargé simultanément.",
|
||||
"cchange109": "Type de fichier non pris en charge !",
|
||||
"cchange110": "TÉLÉCHARGEMENT D'IMAGE",
|
||||
"cchange111": "TÉLÉCHARGEMENT GIF",
|
||||
"cchange112": "TÉLÉCHARGEMENT DE PIÈCE JOINTE",
|
||||
"cchange113": "TÉLÉCHARGEMENT DE FICHIER",
|
||||
"cchange114": "Écrivez quelque chose ..."
|
||||
},
|
||||
"welcomepage": {
|
||||
"wcchange1": "Bienvenue dans Q-Chat",
|
||||
@ -954,7 +974,10 @@
|
||||
"gchange65": "Remplacez cette adresse par TRANSFERT DE PROPRIÉTÉ du groupe !",
|
||||
"gchange66": "Invalid Owner / New Owner Address",
|
||||
"gchange67": "MISE À JOUR DE GROUPE réussie !",
|
||||
"gchange68": "Définir l'avatar de groupe"
|
||||
"gchange68": "Définir l'avatar de groupe",
|
||||
"gchange69": "Messages",
|
||||
"gchange70": "Aucun message ces dernières 24 heures !",
|
||||
"gchange71": "Vous avez déjà rejoint ce groupe !"
|
||||
},
|
||||
"puzzlepage": {
|
||||
"pchange1": "Puzzles",
|
||||
@ -1297,5 +1320,104 @@
|
||||
"tour20": "blocs derrière. Souhaitez-vous actualiser (bootstrap) pour accélérer le processus de synchronisation ?",
|
||||
"tour21": "blocs restants.",
|
||||
"tour22": "Actualisation (bootstrap) demandée. Veuillez patienter."
|
||||
},
|
||||
"chatsettings": {
|
||||
"cs1": "Paramètres de discussion",
|
||||
"cs2": "Paramètres généraux de discussion",
|
||||
"cs3": "Horodatage du message de discussion",
|
||||
"cs4": "Il y a du temps",
|
||||
"cs5": "Heure locale",
|
||||
"cs6": "Taille de la police des messages de discussion",
|
||||
"cs7": "Standard",
|
||||
"cs8": "px"
|
||||
},
|
||||
"modals": {
|
||||
"mpchange1": "Tous les AT demandés doivent être de la même Blockchain étrangère.",
|
||||
"mpchange2": "Donnez-vous à cette application la permission d'exécuter un ordre d'achat ?",
|
||||
"mpchange3": "Ordre d'achat créé avec succès",
|
||||
"mpchange4": "Veuillez patienter jusqu'à ce que l'ordre d'achat soit exécuté",
|
||||
"mpchange5": "Échec de la soumission de l'ordre d'achat.",
|
||||
"mpchange6": "Donnez-vous à cette application la permission d'exécuter un ordre de vente ?",
|
||||
"mpchange7": "Pour :",
|
||||
"mpchange8": "Ordre de vente créé avec succès.",
|
||||
"mpchange9": "Veuillez patienter jusqu'à ce que l'ordre de vente soit répertorié.",
|
||||
"mpchange10": "Échec de la soumission de l'ordre de vente.",
|
||||
"mpchange11": "Impossible de trouver les informations AT.",
|
||||
"mpchange12": "Donnez-vous à cette application la permission d'exécuter l'annulation d'un ordre de vente ?",
|
||||
"mpchange13": "Ordre de vente annulé avec succès.",
|
||||
"mpchange14": "Veuillez patienter jusqu'à ce que l'annulation de la transaction soit terminée exécuté.",
|
||||
"mpchange15": "Échec de l'annulation de l'ordre de vente.",
|
||||
"mpchange16": "Erreur lors de la récupération de la liste.",
|
||||
"mpchange17": "Erreur lors de l'ajout à la liste.",
|
||||
"mpchange18": "Erreur lors de la suppression de la liste.",
|
||||
"mpchange19": "Erreur lors de la récupération de la liste d'amis.",
|
||||
"mpchange20": "Le nombre n'est pas un nombre.",
|
||||
"mpchange21": "Nombre manquant.",
|
||||
"mpchange22": "Aucune donnée ou fichier n'a été soumis.",
|
||||
"mpchange23": "Le chiffrement des données nécessite des clés publiques.",
|
||||
"mpchange24": "Seules les données chiffrées peuvent être envoyées dans des services privés.",
|
||||
"mpchange25": "Le téléchargement a échoué en raison d'un chiffrement échoué.",
|
||||
"mpchange26": "Le téléchargement a échoué.",
|
||||
"mpchange27": "Données non valides.",
|
||||
"mpchange28": "Aucune ressource à publier.",
|
||||
"mpchange29": "Inconnu erreur.",
|
||||
"mpchange30": "Sondage non trouvé.",
|
||||
"mpchange31": "Échec du vote sur le sondage.",
|
||||
"mpchange32": "Échec de la création du sondage.",
|
||||
"mpchange33": "Veuillez saisir un lien qortal - qortal://...",
|
||||
"mpchange34": "Lien qortal non valide.",
|
||||
"mpchange35": "Erreur lors de l'envoi de la notification.",
|
||||
"mpchange36": "Impossible d'envoyer le message.",
|
||||
"mpchange37": "Impossible d'envoyer un message chiffré à cet utilisateur car il n'a pas sa clé publique sur la chaîne.",
|
||||
"mpchange38": "La demande n'a pas pu être satisfaite.",
|
||||
"mpchange39": "Groupe non trouvé.",
|
||||
"mpchange40": "Donnez-vous à cette application l'autorisation d'effectuer une demande de participation à un groupe ?",
|
||||
"mpchange41": "Nom du groupe :",
|
||||
"mpchange42": "ID du groupe :",
|
||||
"mpchange43": "Demande de participation à un groupe créée avec succès.",
|
||||
"mpchange44": "Impossible de rejoindre le groupe.",
|
||||
"mpchange45": "Un type MIME n'a pas pu être dérivé.",
|
||||
"mpchange46": "Une extension de fichier n'a pas pu être dérivée.",
|
||||
"mpchange47": "L'utilisateur a refusé le téléchargement.",
|
||||
"mpchange48": "Échec du lancement du téléchargement.",
|
||||
"mpchange49": "Échec du déploiement d'AT.",
|
||||
"mpchange50": "L'utilisateur n'a pas de profil.",
|
||||
"mpchange51": "Impossible de trouver les données demandées.",
|
||||
"mpchange52": "Échec de l'obtention des données de profil.",
|
||||
"mpchange53": "Échec de la définition de la propriété.",
|
||||
"mpchange54": "Échec de l'ouverture du profil.",
|
||||
"mpchange55": "Erreur lors de la récupération des informations du serveur.",
|
||||
"mpchange56": "Erreur dans le résumé de l'activité de tx.",
|
||||
"mpchange57": "Erreur lors de l'obtention des frais étrangers.",
|
||||
"mpchange58": "Erreur lors de la mise à jour des frais étrangers.",
|
||||
"mpchange59": "Erreur lors de l'obtention de l'historique de connexion au serveur.",
|
||||
"mpchange60": "Erreur lors de la définition du serveur actuel.",
|
||||
"mpchange61": "Erreur lors de l'ajout d'un serveur.",
|
||||
"mpchange62": "Erreur lors de la suppression d'un serveur.",
|
||||
"mpchange63": "Erreur lors de la récupération du résumé.",
|
||||
"mpchange64": "Échec du décodage de la transaction.",
|
||||
"mpchange65": "Donnez-vous à cette application l'autorisation de signer et de traiter une transaction ?",
|
||||
"mpchange66": "Donnez-vous à cette application l'autorisation de signer une transaction ?",
|
||||
"mpchange67": "Lisez attentivement la transaction avant d'accepter.",
|
||||
"mpchange68": "Type de Tx :",
|
||||
"mpchange69": "Données de Tx :",
|
||||
"mpchange70": "Le traitement de la transaction n'a pas été demandé.",
|
||||
"mpchange71": "Les octets signés sont : ",
|
||||
"mpchange72": "Transaction signée et traité avec succès.",
|
||||
"mpchange73": "La transaction n'a pas pu être traitée.",
|
||||
"mpchange74": "Échec de la récupération du solde QORT. Réessayez !",
|
||||
"mpchange75": "Impossible d'envoyer la pièce.",
|
||||
"mpchange76": "Échec de la récupération du solde BTC. Réessayez !",
|
||||
"mpchange77": "Échec de la récupération du solde LTC. Réessayez !",
|
||||
"mpchange78": "Échec de la récupération du solde DOGE. Réessayez !",
|
||||
"mpchange79": "Échec de la récupération du solde DGB. Réessayez !",
|
||||
"mpchange80": "Échec de la récupération du solde RVN. Réessayez !",
|
||||
"mpchange81": "Échec de la récupération du solde ARRR. Réessayez !",
|
||||
"mpchange82": "CHAMPS MANQUANTS",
|
||||
"mpchange83": "REFUSÉ",
|
||||
"mpchange84": "ÉCHEC",
|
||||
"mpchange85": "SUCCÈS",
|
||||
"mpchange86": "Toujours autoriser l'obtention automatique du solde du portefeuille",
|
||||
"mpchange87": "Veuillez saisir l'ID du groupe"
|
||||
}
|
||||
}
|
||||
|
@ -248,7 +248,9 @@
|
||||
"balance": "संतुलन",
|
||||
"balances": "आपका वॉलेट बैलेंस",
|
||||
"update": "अपडेट वॉलेट बैलेंस",
|
||||
"view": "देखना"
|
||||
"view": "देखना",
|
||||
"all": "सभी",
|
||||
"page": "पृष्ठ"
|
||||
},
|
||||
"gifs": {
|
||||
"gchange1": "जीआईएफ एक्सप्लोरर",
|
||||
@ -466,7 +468,7 @@
|
||||
"rchange6": "प्राप्तकर्ता",
|
||||
"rchange7": "कार्रवाई",
|
||||
"rchange8": "टाइप",
|
||||
"rchange9": "लेवल 1 - 4 एक सेल्फ शेयर बना सकता है और लेवल 5 या उससे ऊपर एक रिवॉर्ड शेयर बना सकता है!",
|
||||
"rchange9": "लेवल 0 - 4 एक सेल्फ शेयर बना सकता है और लेवल 5 या उससे ऊपर एक रिवॉर्ड शेयर बना सकता है!",
|
||||
"rchange10": "प्राप्तकर्ता सार्वजनिक कुंजी",
|
||||
"rchange11": "रिवॉर्ड शेयर प्रतिशत",
|
||||
"rchange12": "कुछ स्वादिष्ट करना",
|
||||
@ -740,7 +742,8 @@
|
||||
"bchange51": "परिवर्तन सबमिट करने के लिए 'अपडेट प्रोफ़ाइल' पर क्लिक करना न भूलें",
|
||||
"bchange52": "क्या आप इस एप्लिकेशन को अपने वॉलेट की जानकारी प्राप्त करने की अनुमति देते हैं?",
|
||||
"bchange53": "हमेशा अपनी मित्र सूची को सभी ऐप्स द्वारा स्वचालित रूप से पुनर्प्राप्त करने की अनुमति दें",
|
||||
"bchange54": "क्या आप इस एप्लिकेशन को अपनी मित्र सूची तक पहुंचने की अनुमति देते हैं?"
|
||||
"bchange54": "क्या आप इस एप्लिकेशन को अपनी मित्र सूची तक पहुंचने की अनुमति देते हैं?",
|
||||
"bchange55": "क्या आप इस एप्लिकेशन को यह कमांड भेजने की अनुमति देते हैं?"
|
||||
},
|
||||
"datapage": {
|
||||
"dchange1": "डाटा प्रबंधन",
|
||||
@ -840,7 +843,7 @@
|
||||
"cchange74": "के साथ प्रतिक्रिया",
|
||||
"cchange75": "अटैचमेंट अपलोड हो रहा है। इसमें एक मिनट तक का समय लग सकता है।",
|
||||
"cchange76": "अनुलग्नक हटाया जा रहा है। इसमें एक मिनट तक का समय लग सकता है।",
|
||||
"cchange77": "अटैचमेंट का आकार 1 एमबी से अधिक है",
|
||||
"cchange77": "अटैचमेंट का आकार 10 एमबी से अधिक है",
|
||||
"cchange78": "क्या आप सुनिश्चित हैं कि आप इस चित्र को हटाना चाहते हैं?",
|
||||
"cchange79": "क्या आप वाकई इस अटैचमेंट को मिटाना चाहते हैं?",
|
||||
"cchange80": "इस चित्र को हटा दिया गया है",
|
||||
@ -853,7 +856,24 @@
|
||||
"cchange94": "लोड किया गया",
|
||||
"cchange95": "केवल मेरे संसाधन",
|
||||
"cchange96": "समूह प्रबंधन खोलें",
|
||||
"cchange97": "ग्रुप में शामिल होने का लिंक क्लिपबोर्ड पर कॉपी किया गया"
|
||||
"cchange97": "ग्रुप में शामिल होने का लिंक क्लिपबोर्ड पर कॉपी किया गया",
|
||||
"cchange98": "फ़ाइल अपलोड हो रही है। इसमें कुछ मिनट लग सकते हैं।",
|
||||
"cchange99": "फ़ाइल हटाई जा रही है। इसमें एक मिनट तक का समय लग सकता है।",
|
||||
"cchange100": "फ़ाइल का आकार 125 एमबी से अधिक है",
|
||||
"cchange101": "क्या आप वाकई इस फ़ाइल को हटाना चाहते हैं?",
|
||||
"cchange102": "यह फ़ाइल हटा दी गई है",
|
||||
"cchange103": "gif अपलोड हो रहा है। इसमें एक मिनट तक का समय लग सकता है।",
|
||||
"cchange104": "Gif हटा रहा हूँ। इसमें एक मिनट तक का समय लग सकता है।",
|
||||
"cchange105": "फ़ाइल का आकार 3 एमबी से अधिक है",
|
||||
"cchange106": "क्या आप वाकई इस GIF को हटाना चाहते हैं?",
|
||||
"cchange107": "यह GIF हटा दिया गया है",
|
||||
"cchange108": "डाउनलोड पृष्ठभूमि में जारी रहेगा, केवल एक Q-चैट फ़ाइल एक साथ डाउनलोड की जा सकती है।",
|
||||
"cchange109": "फ़ाइल प्रकार समर्थित नहीं है!",
|
||||
"cchange110": "छवि अपलोड करें",
|
||||
"cchange111": "जीआईएफ अपलोड",
|
||||
"cchange112": "अटैचमेंट अपलोड",
|
||||
"cchange113": "फ़ाइल अपलोड करें",
|
||||
"cchange114": "कुछ लिखें ..."
|
||||
},
|
||||
"welcomepage": {
|
||||
"wcchange1": "क्यू-चैट में आपका स्वागत है",
|
||||
@ -954,7 +974,10 @@
|
||||
"gchange65": "इस पते को समूह के स्थानांतरण स्वामित्व में बदलें!",
|
||||
"gchange66": "अमान्य मालिक/नए मालिक का पता",
|
||||
"gchange67": "समूह अद्यतन सफल!",
|
||||
"gchange68": "समूह अवतार सेट करें"
|
||||
"gchange68": "समूह अवतार सेट करें",
|
||||
"gchange69": "संदेश",
|
||||
"gchange70": "पिछले 24 घंटों में कोई संदेश नहीं!",
|
||||
"gchange71": "आप पहले ही इस समूह में शामिल हो चुके हैं!"
|
||||
},
|
||||
"puzzlepage": {
|
||||
"pchange1": "पहेलि",
|
||||
@ -1297,5 +1320,104 @@
|
||||
"tour20": "पीछे ब्लॉक। क्या आप सिंकिंग प्रक्रिया को तेज करने के लिए रीफ्रेश (बूटस्ट्रैप) करना चाहेंगे?",
|
||||
"tour21": "ब्लॉक शेष हैं।",
|
||||
"tour22": "रिफ्रेश (बूटस्ट्रैप) का अनुरोध किया गया। कृपया प्रतीक्षा करें।"
|
||||
},
|
||||
"chatsettings": {
|
||||
"cs1": "चैट सेटिंग",
|
||||
"cs2": "सामान्य चैट सेटिंग",
|
||||
"cs3": "चैट संदेश टाइमस्टैम्प",
|
||||
"cs4": "समय पहले",
|
||||
"cs5": "स्थानीय समय",
|
||||
"cs6": "चैट संदेश फ़ॉन्ट आकार",
|
||||
"cs7": "मानक",
|
||||
"cs8": "px"
|
||||
},
|
||||
"modals": {
|
||||
"mpchange1": "सभी अनुरोधित ATs एक ही विदेशी ब्लॉकचेन के होने चाहिए।",
|
||||
"mpchange2": "क्या आप इस एप्लिकेशन को खरीद ऑर्डर निष्पादित करने की अनुमति देते हैं?",
|
||||
"mpchange3": "खरीद ऑर्डर सफलतापूर्वक बनाया गया",
|
||||
"mpchange4": "कृपया खरीद ऑर्डर पूरा होने तक प्रतीक्षा करें",
|
||||
"mpchange5": "खरीद ऑर्डर सबमिट करने में विफल रहा।",
|
||||
"mpchange6": "क्या आप इस एप्लिकेशन को बिक्री ऑर्डर निष्पादित करने की अनुमति देते हैं?",
|
||||
"mpchange7": "के लिए:",
|
||||
"mpchange8": "बिक्री ऑर्डर सफलतापूर्वक बनाया गया।",
|
||||
"mpchange9": "कृपया बिक्री ऑर्डर सूचीबद्ध होने तक प्रतीक्षा करें।",
|
||||
"mpchange10": "बिक्री ऑर्डर सबमिट करने में विफल रहा।",
|
||||
"mpchange11": "AT जानकारी नहीं मिल पा रही है।",
|
||||
"mpchange12": "क्या आप इस एप्लिकेशन को बिक्री ऑर्डर रद्द करने की अनुमति देते हैं?",
|
||||
"mpchange13": "बिक्री ऑर्डर सफलतापूर्वक रद्द किया गया।",
|
||||
"mpchange14": "कृपया तब तक प्रतीक्षा करें जब तक कि व्यापार रद्द करने की प्रक्रिया पूरी न हो जाए।",
|
||||
"mpchange15": "बिक्री आदेश रद्द करने में विफल।",
|
||||
"mpchange16": "सूची प्राप्त करने में त्रुटि।",
|
||||
"mpchange17": "सूची में जोड़ने में त्रुटि।",
|
||||
"mpchange18": "सूची हटाने में त्रुटि।",
|
||||
"mpchange19": "मित्र सूची प्राप्त करने में त्रुटि।",
|
||||
"mpchange20": "गणना कोई संख्या नहीं है।",
|
||||
"mpchange21": "गणना गुम है।",
|
||||
"mpchange22": "कोई डेटा या फ़ाइल सबमिट नहीं की गई।",
|
||||
"mpchange23": "डेटा एन्क्रिप्ट करने के लिए सार्वजनिक कुंजी की आवश्यकता होती है।",
|
||||
"mpchange24": "केवल एन्क्रिप्ट किया गया डेटा ही निजी सेवाओं में जा सकता है।",
|
||||
"mpchange25": "एन्क्रिप्शन विफल होने के कारण अपलोड विफल हुआ।",
|
||||
"mpchange26": "अपलोड विफल हुआ।",
|
||||
"mpchange27": "अमान्य डेटा।",
|
||||
"mpchange28": "प्रकाशित करने के लिए कोई संसाधन नहीं।",
|
||||
"mpchange29": "अज्ञात त्रुटि।",
|
||||
"mpchange30": "मतदान नहीं मिला।",
|
||||
"mpchange31": "मतदान पर वोट करने में विफल।",
|
||||
"mpchange32": "मतदान बनाने में विफल।",
|
||||
"mpchange33": "कृपया एक qortal लिंक दर्ज करें - qortal://...",
|
||||
"mpchange34": "अमान्य qortal लिंक।",
|
||||
"mpchange35": "सूचना पुश करने में त्रुटि।",
|
||||
"mpchange36": "संदेश नहीं भेजा जा सका।",
|
||||
"mpchange37": "इस उपयोगकर्ता को एन्क्रिप्टेड संदेश नहीं भेजा जा सकता क्योंकि उनके पास चेन पर उनकी पब्लिककी नहीं है।",
|
||||
"mpchange38": "अनुरोध पूरा नहीं किया जा सका।",
|
||||
"mpchange39": "समूह नहीं मिला।",
|
||||
"mpchange40": "क्या आप इस एप्लिकेशन को समूह में शामिल होने का अनुरोध करने की अनुमति देते हैं?",
|
||||
"mpchange41": "समूह का नाम:",
|
||||
"mpchange42": "समूह आईडी:",
|
||||
"mpchange43": "समूह में शामिल होने का अनुरोध सफलतापूर्वक बनाया गया।",
|
||||
"mpchange44": "समूह में शामिल होने में विफल रहा।",
|
||||
"mpchange45": "एक माइम प्रकार प्राप्त नहीं किया जा सका।",
|
||||
"mpchange46": "फ़ाइल एक्सटेंशन प्राप्त नहीं किया जा सका।",
|
||||
"mpchange47": "उपयोगकर्ता ने डाउनलोड अस्वीकार कर दिया।",
|
||||
"mpchange48": "डाउनलोड आरंभ करने में विफल रहा।",
|
||||
"mpchange49": "AT को तैनात करने में विफल रहा।",
|
||||
"mpchange50": "उपयोगकर्ता के पास प्रोफ़ाइल नहीं है।",
|
||||
"mpchange51": "अनुरोधित डेटा नहीं मिल सका।",
|
||||
"mpchange52": "प्रोफ़ाइल डेटा प्राप्त करने में विफल रहा।",
|
||||
"mpchange53": "संपत्ति सेट करने में विफल रहा।",
|
||||
"mpchange54": "प्रोफ़ाइल खोलने में विफल रहा।",
|
||||
"mpchange55": "सर्वर जानकारी प्राप्त करने में त्रुटि।",
|
||||
"mpchange56": "tx गतिविधि सारांश में त्रुटि।",
|
||||
"mpchange57": "विदेशी शुल्क प्राप्त करने में त्रुटि।",
|
||||
"mpchange58": "विदेशी शुल्क अपडेट करने में त्रुटि।",
|
||||
"mpchange59": "सर्वर कनेक्शन इतिहास प्राप्त करने में त्रुटि।",
|
||||
"mpchange60": "वर्तमान सर्वर सेट करने में त्रुटि।",
|
||||
"mpchange61": "सर्वर जोड़ने में त्रुटि।",
|
||||
"mpchange62": "सर्वर हटाने में त्रुटि।",
|
||||
"mpchange63": "सारांश प्राप्त करने में त्रुटि।",
|
||||
"mpchange64": "लेनदेन को डिकोड करने में विफल।",
|
||||
"mpchange65": "क्या आप इस एप्लिकेशन को लेनदेन पर हस्ताक्षर करने और उसे संसाधित करने की अनुमति देते हैं?",
|
||||
"mpchange66": "क्या आप इस एप्लिकेशन को लेनदेन पर हस्ताक्षर करने की अनुमति देते हैं?",
|
||||
"mpchange67": "स्वीकार करने से पहले लेनदेन को ध्यान से पढ़ें।",
|
||||
"mpchange68": "Tx प्रकार:",
|
||||
"mpchange69": "TX डेटा:",
|
||||
"mpchange70": "प्रक्रिया लेनदेन का अनुरोध नहीं किया गया था।",
|
||||
"mpchange71": "हस्ताक्षरित बाइट्स हैं: ",
|
||||
"mpchange72": "लेनदेन हस्ताक्षरित और सफलतापूर्वक संसाधित हुआ।",
|
||||
"mpchange73": "लेनदेन संसाधित नहीं हो पाया।",
|
||||
"mpchange74": "QORT बैलेंस प्राप्त करने में विफल। पुनः प्रयास करें!",
|
||||
"mpchange75": "कॉइन नहीं भेजा जा सका।",
|
||||
"mpchange76": "BTC बैलेंस प्राप्त करने में विफल। पुनः प्रयास करें!",
|
||||
"mpchange77": "LTC बैलेंस प्राप्त करने में विफल। पुनः प्रयास करें!",
|
||||
"mpchange78": "DOGE बैलेंस प्राप्त करने में विफल। पुनः प्रयास करें!",
|
||||
"mpchange79": "DGB बैलेंस प्राप्त करने में विफल। पुनः प्रयास करें!",
|
||||
"mpchange80": "RVN बैलेंस प्राप्त करने में विफल। पुनः प्रयास करें!",
|
||||
"mpchange81": "ARRR बैलेंस प्राप्त करने में विफल। पुनः प्रयास करें!",
|
||||
"mpchange82": "फ़ील्ड गुम",
|
||||
"mpchange83": "अस्वीकृत",
|
||||
"mpchange84": "विफल",
|
||||
"mpchange85": "सफल",
|
||||
"mpchange86": "हमेशा वॉलेट बैलेंस को स्वचालित रूप से प्राप्त करने की अनुमति दें",
|
||||
"mpchange87": "कृपया ग्रुप आईडी दर्ज करें"
|
||||
}
|
||||
}
|
||||
|
@ -248,7 +248,9 @@
|
||||
"balance": "Kreditna",
|
||||
"balances": "VAŠ NOVČANIK JE NA SALJU",
|
||||
"update": "AŽURIRAJTE STANJE NOVČANIKA",
|
||||
"view": "Pogled"
|
||||
"view": "Pogled",
|
||||
"all": "svi",
|
||||
"page": "Stranica"
|
||||
},
|
||||
"gifs": {
|
||||
"gchange1": "Gif Explorer",
|
||||
@ -466,7 +468,7 @@
|
||||
"rchange6": "Primatelj",
|
||||
"rchange7": "Akcija",
|
||||
"rchange8": "Vrsta",
|
||||
"rchange9": "Level 1 - 4 može stvoriti samo vlastiti udio a level 5 ili više može stvoriti nagradni udio!",
|
||||
"rchange9": "Level 0 - 4 može stvoriti samo vlastiti udio a level 5 ili više može stvoriti nagradni udio!",
|
||||
"rchange10": "Primateljov javni ključ",
|
||||
"rchange11": "Nagradni udio postotak",
|
||||
"rchange12": "Radiš nešto ukusno :-)",
|
||||
@ -740,7 +742,8 @@
|
||||
"bchange51": "Za slanje promjena ne zaboravite kliknuti 'Ažuriraj profil'",
|
||||
"bchange52": "Dajete li ovoj aplikaciji dopuštenje da dobije podatke o vašem novčaniku?",
|
||||
"bchange53": "Uvijek dopusti da sve aplikacije automatski dohvate tvoj popis prijatelja",
|
||||
"bchange54": "Dajete li ovoj aplikaciji dopuštenje za pristup vašem popisu prijatelja?"
|
||||
"bchange54": "Dajete li ovoj aplikaciji dopuštenje za pristup vašem popisu prijatelja?",
|
||||
"bchange55": "Dajete li ovoj aplikaciji dopuštenje da pošalje ovu naredbu?"
|
||||
},
|
||||
"datapage": {
|
||||
"dchange1": "Upravljanje podacima",
|
||||
@ -840,7 +843,7 @@
|
||||
"cchange74": "reagirao sa",
|
||||
"cchange75": "Učitavanje privitka. Ovo može potrajati do jedne minute.",
|
||||
"cchange76": "Brisanje privitka. Ovo može potrajati do jedne minute.",
|
||||
"cchange77": "Veličina privitka premašuje 1 MB",
|
||||
"cchange77": "Veličina privitka premašuje 10 MB",
|
||||
"cchange78": "Jeste li sigurni da želite izbrisati ovu sliku?",
|
||||
"cchange79": "Jeste li sigurni da želite izbrisati ovaj privitak?",
|
||||
"cchange80": "Ova slika je izbrisana",
|
||||
@ -853,7 +856,24 @@
|
||||
"cchange94": "učitano",
|
||||
"cchange95": "Samo moji resursi",
|
||||
"cchange96": "Otvoreno upravljanje grupom",
|
||||
"cchange97": "Veza za pridruživanje grupi kopirana je u međuspremnik"
|
||||
"cchange97": "Veza za pridruživanje grupi kopirana je u međuspremnik",
|
||||
"cchange98": "Učitavanje datoteke. Ovo može potrajati nekoliko minuta.",
|
||||
"cchange99": "Brisanje datoteke. Ovo može potrajati do jedne minute.",
|
||||
"cchange100": "Veličina datoteke premašuje 125 MB",
|
||||
"cchange101": "Jeste li sigurni da želite izbrisati ovu datoteku?",
|
||||
"cchange102": "Ova datoteka je izbrisana",
|
||||
"cchange103": "Učitavanje GIF-a. Ovo može potrajati do jedne minute.",
|
||||
"cchange104": "Brisanje GIF-a. Ovo može potrajati do jedne minute.",
|
||||
"cchange105": "Veličina datoteke premašuje 3 MB",
|
||||
"cchange106": "Jeste li sigurni da želite izbrisati ovaj gif?",
|
||||
"cchange107": "Ovaj gif je izbrisan",
|
||||
"cchange108": "Preuzimanje će se nastaviti u pozadini, samo JEDNA Q-Chat datoteka može se preuzeti istovremeno.",
|
||||
"cchange109": "Vrsta datoteke nije podržana!",
|
||||
"cchange110": "PRIJENOS SLIKE",
|
||||
"cchange111": "PRIJENOS GIF-a",
|
||||
"cchange112": "PRIJENOS PRIVITA",
|
||||
"cchange113": "PRIJENOS DATOTEKE",
|
||||
"cchange114": "Napiši nešto ..."
|
||||
},
|
||||
"welcomepage": {
|
||||
"wcchange1": "Dobrodošli u Q-Čavrljanje",
|
||||
@ -954,7 +974,10 @@
|
||||
"gchange65": "Zamijenite ovu adresu u PRIJENOS VLASNIŠTVA grupe!",
|
||||
"gchange66": "Vlasnik / nova adresa vlasnika nisu valjani",
|
||||
"gchange67": "Grupa UPDATE Uspješna!",
|
||||
"gchange68": "Postavi grupni avatar"
|
||||
"gchange68": "Postavi grupni avatar",
|
||||
"gchange69": "Poruke",
|
||||
"gchange70": "Nema poruka u zadnja 24 sata!",
|
||||
"gchange71": "Već ste se pridružili ovoj grupi!"
|
||||
},
|
||||
"puzzlepage": {
|
||||
"pchange1": "Zagonetke",
|
||||
@ -1297,5 +1320,104 @@
|
||||
"tour20": "blokovi iza. Želite li osvježiti (bootstrap) da ubrzate proces sinkronizacije?",
|
||||
"tour21": "preostali blokovi.",
|
||||
"tour22": "Zatraženo je osvježavanje (bootstrap). Molimo pričekajte."
|
||||
},
|
||||
"chatsettings": {
|
||||
"cs1": "Postavke chata",
|
||||
"cs2": "Opće postavke chata",
|
||||
"cs3": "Vremenska oznaka poruke chata",
|
||||
"cs4": "Prije vremena",
|
||||
"cs5": "Lokalno vrijeme",
|
||||
"cs6": "Veličina fonta poruke chata",
|
||||
"cs7": "Standardno",
|
||||
"cs8": "px"
|
||||
},
|
||||
"modals": {
|
||||
"mpchange1": "Svi zatraženi AT-ovi moraju biti istog stranog lanca blokova.",
|
||||
"mpchange2": "Dajete li ovoj aplikaciji dopuštenje za izvršavanje naloga za kupnju?",
|
||||
"mpchange3": "Uspješno kreiran nalog za kupnju",
|
||||
"mpchange4": "Molimo pričekajte dok se narudžba ne ispuni",
|
||||
"mpchange5": "Neuspješno slanje narudžbe za kupnju.",
|
||||
"mpchange6": "Dajete li ovoj aplikaciji dopuštenje za izvršavanje naloga za prodaju?",
|
||||
"mpchange7": "Za:",
|
||||
"mpchange8": "Uspješno kreiran prodajni nalog.",
|
||||
"mpchange9": "Molimo pričekajte dok se nalog za prodaju ne pojavi na popisu.",
|
||||
"mpchange10": "Neuspješno podnošenje naloga za prodaju.",
|
||||
"mpchange11": "Ne mogu pronaći AT informacije.",
|
||||
"mpchange12": "Dajete li ovoj aplikaciji dopuštenje za otkazivanje prodajnog naloga?",
|
||||
"mpchange13": "Uspješno otkazan prodajni nalog.",
|
||||
"mpchange14": "Molimo pričekajte dok se otkazivanje trgovine ne ispuni.",
|
||||
"mpchange15": "Nije uspjelo otkazivanje naloga za prodaju.",
|
||||
"mpchange16": "Pogreška u dohvaćanju popisa.",
|
||||
"mpchange17": "Greška pri dodavanju na popis.",
|
||||
"mpchange18": "Pogreška u popisu brisanja.",
|
||||
"mpchange19": "Greška u dohvaćanju popisa prijatelja.",
|
||||
"mpchange20": "Broj nije broj.",
|
||||
"mpchange21": "Nedostaje broj.",
|
||||
"mpchange22": "Nisu poslani nikakvi podaci ili datoteke.",
|
||||
"mpchange23": "Šifriranje podataka zahtijeva javne ključeve.",
|
||||
"mpchange24": "Samo šifrirani podaci mogu ići u privatne usluge.",
|
||||
"mpchange25": "Prijenos nije uspio zbog neuspješne enkripcije.",
|
||||
"mpchange26": "Prijenos nije uspio.",
|
||||
"mpchange27": "Nevažeći podaci.",
|
||||
"mpchange28": "Nema resursa za objavljivanje.",
|
||||
"mpchange29": "Nepoznata pogreška.",
|
||||
"mpchange30": "Anketa nije pronađena.",
|
||||
"mpchange31": "Glasovanje u anketi nije uspjelo.",
|
||||
"mpchange32": "Kreiranje ankete nije uspjelo.",
|
||||
"mpchange33": "Molimo unesite qortal vezu - qortal://...",
|
||||
"mpchange34": "Nevažeća qortalna veza.",
|
||||
"mpchange35": "Pogreška u slanju obavijesti.",
|
||||
"mpchange36": "Nije moguće poslati poruku.",
|
||||
"mpchange37": "Ne mogu poslati šifriranu poruku ovom korisniku jer nemaju svoj javni ključ u lancu.",
|
||||
"mpchange38": "Zahtjev nije moguće ispuniti.",
|
||||
"mpchange39": "Grupa nije pronađena.",
|
||||
"mpchange40": "Dajete li ovoj aplikaciji dopuštenje za izvođenje zahtjeva za pridruživanje grupi?",
|
||||
"mpchange41": "Naziv grupe:",
|
||||
"mpchange42": "ID grupe:",
|
||||
"mpchange43": "Uspješno kreiran zahtjev za pridruživanje grupi.",
|
||||
"mpchange44": "Nije uspjelo pridruživanje grupi.",
|
||||
"mpchange45": "Mime tip nije mogao biti izveden.",
|
||||
"mpchange46": "Ekstenzija datoteke nije mogla biti izvedena.",
|
||||
"mpchange47": "Korisnik je odbio preuzimanje.",
|
||||
"mpchange48": "Nije uspjelo preuzimanje.",
|
||||
"mpchange49": "Implementacija AT-a nije uspjela.",
|
||||
"mpchange50": "Korisnik nema profil.",
|
||||
"mpchange51": "Ne mogu pronaći tražene podatke.",
|
||||
"mpchange52": "Nije uspjelo dobivanje podataka profila.",
|
||||
"mpchange53": "Neuspješno postavljanje svojstva.",
|
||||
"mpchange54": "Nije uspjelo otvaranje profila.",
|
||||
"mpchange55": "Pogreška u dohvaćanju informacija o poslužitelju.",
|
||||
"mpchange56": "Pogreška u sažetku aktivnosti prijenosa.",
|
||||
"mpchange57": "Pogreška u dobivanju inozemne naknade.",
|
||||
"mpchange58": "Pogreška u ažuriranju inozemne naknade.",
|
||||
"mpchange59": "Pogreška u dohvaćanju povijesti povezivanja poslužitelja.",
|
||||
"mpchange60": "Pogreška u postavljanju trenutnog poslužitelja.",
|
||||
"mpchange61": "Greška u dodavanju poslužitelja.",
|
||||
"mpchange62": "Greška pri uklanjanju poslužitelja.",
|
||||
"mpchange63": "Pogreška u dohvaćanju sažetka.",
|
||||
"mpchange64": "Dekodiranje transakcije nije uspjelo.",
|
||||
"mpchange65": "Dajete li ovoj aplikaciji dopuštenje za potpisivanje i obradu transakcije?",
|
||||
"mpchange66": "Dajete li ovoj aplikaciji dopuštenje za potpisivanje transakcije?",
|
||||
"mpchange67": "Pažljivo pročitajte transakciju prije prihvaćanja.",
|
||||
"mpchange68": "Tx prijenos:",
|
||||
"mpchange69": "TX podaci:",
|
||||
"mpchange70": "Obrada transakcije nije zatražena.",
|
||||
"mpchange71": "Bajtovi s predznakom su: ",
|
||||
"mpchange72": "Transakcija je uspješno potpisana i obrađena.",
|
||||
"mpchange73": "Transakcija nije mogla biti obrađena.",
|
||||
"mpchange74": "Nije uspjelo dohvaćanje QORT stanja. Pokušajte ponovo!",
|
||||
"mpchange75": "Nije moguće poslati novčić.",
|
||||
"mpchange76": "Neuspješno dohvaćanje BTC stanja. Pokušajte ponovo!",
|
||||
"mpchange77": "Nije uspjelo dohvaćanje LTC stanja. Pokušajte ponovo!",
|
||||
"mpchange78": "Nije uspjelo dohvaćanje DOGE stanja. Pokušajte ponovo!",
|
||||
"mpchange79": "Nije uspjelo dohvaćanje DGB stanja. Pokušajte ponovo!",
|
||||
"mpchange80": "Nije uspjelo dohvaćanje RVN stanja. Pokušajte ponovo!",
|
||||
"mpchange81": "Nije uspjelo dohvaćanje ARRR stanja. Pokušajte ponovo!",
|
||||
"mpchange82": "NEDOSTAJUĆA POLJA",
|
||||
"mpchange83": "ODBIJENO",
|
||||
"mpchange84": "GREŠKA",
|
||||
"mpchange85": "USPJEH",
|
||||
"mpchange86": "Uvijek dopusti automatsko dobivanje stanja novčanika",
|
||||
"mpchange87": "Molimo unesite ID grupe"
|
||||
}
|
||||
}
|
||||
|
@ -248,7 +248,9 @@
|
||||
"balance": "Hitel",
|
||||
"balances": "A PÉNZTÁRCSA EGYENLEGEK",
|
||||
"update": "FRISSÍTSE A PÉNZTÁRCSA-EGYENLEGEKET",
|
||||
"view": "Kilátás"
|
||||
"view": "Kilátás",
|
||||
"all": "Minden",
|
||||
"page": "Oldal"
|
||||
},
|
||||
"gifs": {
|
||||
"gchange1": "Gif Explorer",
|
||||
@ -466,7 +468,7 @@
|
||||
"rchange6": "Címzett",
|
||||
"rchange7": "Akció",
|
||||
"rchange8": "Típus",
|
||||
"rchange9": "Az 1- 4. szint létrehozhat egy önmegosztást, és az 5. vagy annál magasabb szint jutalommegosztást hozhat létre!",
|
||||
"rchange9": "Az 0- 4. szint létrehozhat egy önmegosztást, és az 5. vagy annál magasabb szint jutalommegosztást hozhat létre!",
|
||||
"rchange10": "Címzett Nyilvános Kulcsa",
|
||||
"rchange11": "Jutalomrészesedési Százalék",
|
||||
"rchange12": "Valami Finomat Csinálni",
|
||||
@ -740,7 +742,8 @@
|
||||
"bchange51": "A módosítások elküldéséhez ne felejtsen el a 'Profil frissítése' gombra kattintani",
|
||||
"bchange52": "Engedélyt ad ennek az alkalmazásnak a pénztárca adatainak lekérésére?",
|
||||
"bchange53": "Mindig engedélyezze, hogy az összes alkalmazás automatikusan lekérje a barátlistáját",
|
||||
"bchange54": "Engedélyt ad ennek az alkalmazásnak, hogy hozzáférjen a barátlistájához?"
|
||||
"bchange54": "Engedélyt ad ennek az alkalmazásnak, hogy hozzáférjen a barátlistájához?",
|
||||
"bchange55": "Engedélyt ad ennek az alkalmazásnak, hogy elküldje ezt a parancsot?"
|
||||
},
|
||||
"datapage": {
|
||||
"dchange1": "Adatkezelés",
|
||||
@ -840,7 +843,7 @@
|
||||
"cchange74": "reagált:",
|
||||
"cchange75": "Melléklet feltöltése. Ez akár egy percig is eltarthat.",
|
||||
"cchange76": "Melléklet törlése. Ez akár egy percig is eltarthat.",
|
||||
"cchange77": "A melléklet mérete meghaladja az 1 MB-ot",
|
||||
"cchange77": "A melléklet mérete meghaladja az 10 MB-ot",
|
||||
"cchange78": "Biztosan törli ezt a képet?",
|
||||
"cchange79": "Biztosan törli ezt a mellékletet?",
|
||||
"cchange80": "Ezt a képet törölték",
|
||||
@ -853,7 +856,24 @@
|
||||
"cchange94": "betöltve",
|
||||
"cchange95": "Csak az én erőforrásaim",
|
||||
"cchange96": "Nyitott csoportkezelés",
|
||||
"cchange97": "Csatlakozási link a vágólapra másolva"
|
||||
"cchange97": "Csatlakozási link a vágólapra másolva",
|
||||
"cchange98": "Fájl feltöltése folyamatban. Ez eltarthat néhány percig.",
|
||||
"cchange99": "Fájl törlése. Ez akár egy percig is eltarthat.",
|
||||
"cchange100": "A fájl mérete meghaladja a 125 MB-ot",
|
||||
"cchange101": "Biztosan törli ezt a fájlt?",
|
||||
"cchange102": "Ez a fájl törölve lett",
|
||||
"cchange103": "Gif feltöltése. Ez akár egy percig is eltarthat.",
|
||||
"cchange104": "Gif törlése. Ez akár egy percig is eltarthat.",
|
||||
"cchange105": "A fájl mérete meghaladja a 3 MB-ot",
|
||||
"cchange106": "Biztosan törli ezt a gifet?",
|
||||
"cchange107": "Ez a gif törölve lett",
|
||||
"cchange108": "A letöltés a háttérben folytatódik, egyszerre csak EGY Q-Chat fájl tölthető le.",
|
||||
"cchange109": "A fájltípus nem támogatott!",
|
||||
"cchange110": "KÉP FELTÖLTÉS",
|
||||
"cchange111": "GIF FELTÖLTÉS",
|
||||
"cchange112": "MELLÉKLET FELTÖLTÉSE",
|
||||
"cchange113": "FÁJL FELTÖLTÉS",
|
||||
"cchange114": "Írj valamit ..."
|
||||
},
|
||||
"welcomepage": {
|
||||
"wcchange1": "Üdvözöljük a Q-Chathoz",
|
||||
@ -954,7 +974,10 @@
|
||||
"gchange65": "Cserélje ki ezt a címet erre: A CSOPORT TULAJDONJOGÁNAK ÁTRUHÁZÁSA!",
|
||||
"gchange66": "Érvénytelen tulajdonos / új tulajdonos címe",
|
||||
"gchange67": "Csoportos FRISSÍTÉS sikeres!",
|
||||
"gchange68": "Csoportavatar beállítása"
|
||||
"gchange68": "Csoportavatar beállítása",
|
||||
"gchange69": "Üzenetek",
|
||||
"gchange70": "Nincs üzenet az elmúlt 24 órában!",
|
||||
"gchange71": "Már csatlakoztál ehhez a csoporthoz!"
|
||||
},
|
||||
"puzzlepage": {
|
||||
"pchange1": "Rejtvények",
|
||||
@ -1297,5 +1320,104 @@
|
||||
"tour20": "blokkok mögött. Szeretne frissíteni (bootstrap) a szinkronizálási folyamat felgyorsítása érdekében?",
|
||||
"tour21": "még blokkok.",
|
||||
"tour22": "Frissítés (bootstrap) kérve. Kérjük, várjon."
|
||||
},
|
||||
"chatsettings": {
|
||||
"cs1": "Csevegés beállításai",
|
||||
"cs2": "Általános csevegési beállítások",
|
||||
"cs3": "Csevegési üzenet időbélyege",
|
||||
"cs4": "Idővel ezelőtt",
|
||||
"cs5": "Helyi idő",
|
||||
"cs6": "Csevegési üzenet betűmérete",
|
||||
"cs7": "Normál",
|
||||
"cs8": "px"
|
||||
},
|
||||
"modals": {
|
||||
"mpchange1": "Minden kért AT-nak ugyanabból az idegen blokkláncból kell lennie.",
|
||||
"mpchange2": "Engedélyt ad ennek az alkalmazásnak vételi rendelés végrehajtására?",
|
||||
"mpchange3": "Vételi megrendelés sikeresen létrehozva",
|
||||
"mpchange4": "Kérjük, várjon, amíg a vásárlási rendelés teljesül",
|
||||
"mpchange5": "Nem sikerült elküldeni a vásárlási rendelést.",
|
||||
"mpchange6": "Engedélyt ad ennek az alkalmazásnak eladási megbízás végrehajtására?",
|
||||
"mpchange7": "For:",
|
||||
"mpchange8": "Eladási megbízás sikeresen létrehozva.",
|
||||
"mpchange9": "Kérjük, várjon, amíg az eladási megbízás felkerül a listára.",
|
||||
"mpchange10": "Nem sikerült elküldeni az eladási megbízást.",
|
||||
"mpchange11": "Nem található AT információ.",
|
||||
"mpchange12": "Engedélyt ad ennek az alkalmazásnak eladási megbízás törlésére?",
|
||||
"mpchange13": "Eladási megbízás sikeresen törölve.",
|
||||
"mpchange14": "Kérjük, várjon, amíg a kereskedés törlése teljesül.",
|
||||
"mpchange15": "Nem sikerült törölni az eladási rendelést.",
|
||||
"mpchange16": "Hiba a lista lekérésekor.",
|
||||
"mpchange17": "Hiba a listához való hozzáadáskor.",
|
||||
"mpchange18": "Hiba a törlési listában.",
|
||||
"mpchange19": "Hiba az ismerőslista lekérésekor.",
|
||||
"mpchange20": "A szám nem szám.",
|
||||
"mpchange21": "Hiányzó szám.",
|
||||
"mpchange22": "Nem küldtek be adatot vagy fájlt.",
|
||||
"mpchange23": "Az adatok titkosításához nyilvános kulcsok szükségesek.",
|
||||
"mpchange24": "Csak titkosított adatok kerülhetnek a privát szolgáltatásokba.",
|
||||
"mpchange25": "A feltöltés sikertelen titkosítás miatt.",
|
||||
"mpchange26": "A feltöltés nem sikerült.",
|
||||
"mpchange27": "Érvénytelen adat.",
|
||||
"mpchange28": "Nincs közzétehető forrás.",
|
||||
"mpchange29": "Ismeretlen hiba.",
|
||||
"mpchange30": "Szavazás nem található.",
|
||||
"mpchange31": "Nem sikerült szavazni a szavazáson.",
|
||||
"mpchange32": "Nem sikerült létrehozni a szavazást.",
|
||||
"mpchange33": "Kérjük, adjon meg egy qortal hivatkozást - qortal://...",
|
||||
"mpchange34": "Érvénytelen qortal link.",
|
||||
"mpchange35": "Hiba az értesítés leküldésekor.",
|
||||
"mpchange36": "Nem sikerült elküldeni az üzenetet.",
|
||||
"mpchange37": "Ennek a felhasználónak nem lehet titkosított üzenetet küldeni, mivel nincs nyilvános kulcsa a láncon.",
|
||||
"mpchange38": "A kérést nem sikerült teljesíteni.",
|
||||
"mpchange39": "A csoport nem található.",
|
||||
"mpchange40": "Engedélyt ad ennek az alkalmazásnak a csoporthoz való csatlakozási kérelem végrehajtására?",
|
||||
"mpchange41": "Csoport neve:",
|
||||
"mpchange42": "Csoportazonosító:",
|
||||
"mpchange43": "A csoporthoz való csatlakozási kérelem sikeresen létrehozva.",
|
||||
"mpchange44": "Nem sikerült csatlakozni a csoporthoz.",
|
||||
"mpchange45": "A mime típust nem lehetett származtatni.",
|
||||
"mpchange46": "A fájlkiterjesztés nem származtatható.",
|
||||
"mpchange47": "A felhasználó elutasította a letöltést.",
|
||||
"mpchange48": "Nem sikerült elindítani a letöltést.",
|
||||
"mpchange49": "Nem sikerült az AT telepítése.",
|
||||
"mpchange50": "A felhasználónak nincs profilja.",
|
||||
"mpchange51": "Nem találhatók a kért adatok.",
|
||||
"mpchange52": "Nem sikerült lekérni a profiladatokat.",
|
||||
"mpchange53": "Nem sikerült beállítani a tulajdonságot.",
|
||||
"mpchange54": "Nem sikerült megnyitni a profilt.",
|
||||
"mpchange55": "Hiba a kiszolgáló információinak lekérésekor.",
|
||||
"mpchange56": "Hiba a tx tevékenység összefoglalójában.",
|
||||
"mpchange57": "Hiba a külföldi díj lekérésekor.",
|
||||
"mpchange58": "Hiba a külföldi díj frissítésében.",
|
||||
"mpchange59": "Hiba a szerver csatlakozási előzményeinek lekérésében.",
|
||||
"mpchange60": "Hiba az aktuális kiszolgáló beállításánál.",
|
||||
"mpchange61": "Hiba a szerver hozzáadásakor.",
|
||||
"mpchange62": "Hiba a kiszolgáló eltávolítása során.",
|
||||
"mpchange63": "Hiba az összefoglaló lekérésekor.",
|
||||
"mpchange64": "Nem sikerült dekódolni a tranzakciót.",
|
||||
"mpchange65": "Engedélyt ad ennek az alkalmazásnak egy tranzakció aláírására és feldolgozására?",
|
||||
"mpchange66": "Engedélyt ad ennek az alkalmazásnak egy tranzakció aláírására?",
|
||||
"mpchange67": "Elfogadás előtt olvassa el figyelmesen a tranzakciót.",
|
||||
"mpchange68": "Tx típus:",
|
||||
"mpchange69": "TX adatok:",
|
||||
"mpchange70": "A feldolgozási tranzakciót nem kérték.",
|
||||
"mpchange71": "Az aláírt bájtok a következők: ",
|
||||
"mpchange72": "A tranzakció aláírása és feldolgozása sikeresen megtörtént.",
|
||||
"mpchange73": "A tranzakciót nem sikerült feldolgozni.",
|
||||
"mpchange74": "Nem sikerült lekérni a QORT-egyenleget. Próbáld újra!",
|
||||
"mpchange75": "Nem sikerült elküldeni az érmét.",
|
||||
"mpchange76": "Nem sikerült lekérni a BTC-egyenleget. Próbáld újra!",
|
||||
"mpchange77": "Nem sikerült lekérni az LTC-egyenleget. Próbáld újra!",
|
||||
"mpchange78": "Nem sikerült lekérni a DOGE-egyenleget. Próbáld újra!",
|
||||
"mpchange79": "Nem sikerült lekérni a DGB-egyenleget. Próbáld újra!",
|
||||
"mpchange80": "Nem sikerült lekérni az RVN-egyenleget. Próbáld újra!",
|
||||
"mpchange81": "Nem sikerült lekérni az ARRR egyenleget. Próbáld újra!",
|
||||
"mpchange82": "HIÁNYZÓ MEZŐK",
|
||||
"mpchange83": "Elutasítva",
|
||||
"mpchange84": "FAILURE",
|
||||
"mpchange85": "SIKER",
|
||||
"mpchange86": "Mindig engedélyezze a pénztárcaegyenleg automatikus lekérését",
|
||||
"mpchange87": "Kérjük, adja meg a csoport azonosítóját"
|
||||
}
|
||||
}
|
||||
|
@ -248,7 +248,9 @@
|
||||
"balance": "Saldo",
|
||||
"balances": "I SALDI DEL TUO PORTAFOGLIO",
|
||||
"update": "AGGIORNA I SALDI DEL PORTAFOGLIO",
|
||||
"view": "Vedere"
|
||||
"view": "Vedere",
|
||||
"all": "Tutto",
|
||||
"page": "Pagina"
|
||||
},
|
||||
"gifs": {
|
||||
"gchange1": "Esplora Gif",
|
||||
@ -466,7 +468,7 @@
|
||||
"rchange6": "Destinatario",
|
||||
"rchange7": "Azione",
|
||||
"rchange8": "Tipo",
|
||||
"rchange9": "Level 1 - 4 can create a Self Share and Level 5 or above can create a Reward Share!",
|
||||
"rchange9": "Level 0 - 4 can create a Self Share and Level 5 or above can create a Reward Share!",
|
||||
"rchange10": "Chiave pubblica del destinatario",
|
||||
"rchange11": "Percentuale di quota premio",
|
||||
"rchange12": "Fare qualcosa di delizioso",
|
||||
@ -740,7 +742,8 @@
|
||||
"bchange51": "Per inviare le modifiche non dimenticare di fare clic su 'Aggiorna profilo'",
|
||||
"bchange52": "Concedi a questa applicazione il permesso di ottenere informazioni sul tuo portafoglio?",
|
||||
"bchange53": "Consenti sempre che la tua lista amici venga recuperata automaticamente da tutte le app",
|
||||
"bchange54": "Concedi a questa applicazione il permesso di accedere alla tua lista di amici?"
|
||||
"bchange54": "Concedi a questa applicazione il permesso di accedere alla tua lista di amici?",
|
||||
"bchange55": "Concedi a questa applicazione il permesso di inviare questo comando?"
|
||||
},
|
||||
"datapage": {
|
||||
"dchange1": "Gestione dati",
|
||||
@ -840,7 +843,7 @@
|
||||
"cchange74": "ha reagito con",
|
||||
"cchange75": "Caricamento dell'allegato. L'operazione potrebbe richiedere fino a un minuto.",
|
||||
"cchange76": "Eliminazione dell'allegato. L'operazione potrebbe richiedere fino a un minuto.",
|
||||
"cchange77": "La dimensione dell'allegato supera 1 MB",
|
||||
"cchange77": "La dimensione dell'allegato supera 10 MB",
|
||||
"cchange78": "Sei sicuro di voler eliminare questa immagine?",
|
||||
"cchange79": "Sei sicuro di voler eliminare questo allegato?",
|
||||
"cchange80": "Questa immagine è stata cancellata",
|
||||
@ -853,7 +856,24 @@
|
||||
"cchange94": "caricato",
|
||||
"cchange95": "Solo le mie risorse",
|
||||
"cchange96": "Apri gestione gruppo",
|
||||
"cchange97": "Link per unirti al gruppo copiato negli appunti"
|
||||
"cchange97": "Link per unirti al gruppo copiato negli appunti",
|
||||
"cchange98": "Caricamento del file. L'operazione potrebbe richiedere alcuni minuti.",
|
||||
"cchange99": "Eliminazione del file. L'operazione potrebbe richiedere fino a un minuto.",
|
||||
"cchange100": "La dimensione del file supera 125 MB",
|
||||
"cchange101": "Sei sicuro di voler eliminare questo file?",
|
||||
"cchange102": "Questo file è stato eliminato",
|
||||
"cchange103": "Caricamento gif. L'operazione potrebbe richiedere fino a un minuto.",
|
||||
"cchange104": "Eliminazione gif. L'operazione potrebbe richiedere fino a un minuto.",
|
||||
"cchange105": "La dimensione del file supera i 3 MB",
|
||||
"cchange106": "Sei sicuro di voler eliminare questa gif?",
|
||||
"cchange107": "Questa gif è stata eliminata",
|
||||
"cchange108": "Il download continuerà in background, solo UN file Q-Chat potrà essere scaricato contemporaneamente.",
|
||||
"cchange109": "Tipo di file non supportato!",
|
||||
"cchange110": "CARICA IMMAGINE",
|
||||
"cchange111": "CARICA GIF",
|
||||
"cchange112": "CARICA ALLEGATO",
|
||||
"cchange113": "CARICA FILE",
|
||||
"cchange114": "Scrivi qualcosa ..."
|
||||
},
|
||||
"welcomepage": {
|
||||
"wcchange1": "Benvenuto in Q-Chat",
|
||||
@ -954,7 +974,10 @@
|
||||
"gchange65": "Sostituisci questo indirizzo per TRASFERIRE LA PROPRIETA' del gruppo!",
|
||||
"gchange66": "Indirizzo del proprietario non valido/nuovo proprietario",
|
||||
"gchange67": "AGGIORNAMENTO di gruppo riuscito!",
|
||||
"gchange68": "Imposta avatar di gruppo"
|
||||
"gchange68": "Imposta avatar di gruppo",
|
||||
"gchange69": "Messaggi",
|
||||
"gchange70": "Nessun messaggio nelle ultime 24 ore!",
|
||||
"gchange71": "Ti sei già unito a questo gruppo!"
|
||||
},
|
||||
"puzzlepage": {
|
||||
"pchange1": "Puzzle",
|
||||
@ -1297,5 +1320,104 @@
|
||||
"tour20": "blocchi dietro. Vuoi aggiornare (bootstrap) per accelerare il processo di sincronizzazione?",
|
||||
"tour21": "blocchi rimanenti.",
|
||||
"tour22": "Aggiornamento (bootstrap) richiesto. Attendi prego."
|
||||
},
|
||||
"chatsettings": {
|
||||
"cs1": "Impostazioni chat",
|
||||
"cs2": "Impostazioni generali della chat",
|
||||
"cs3": "Timestamp del messaggio di chat",
|
||||
"cs4": "Tempo fa",
|
||||
"cs5": "Ora locale",
|
||||
"cs6": "Dimensione carattere messaggio chat",
|
||||
"cs7": "Standard",
|
||||
"cs8": "px"
|
||||
},
|
||||
"modals": {
|
||||
"mpchange1": "Tutti gli AT richiesti devono appartenere alla stessa Blockchain esterna.",
|
||||
"mpchange2": "Concedi a questa applicazione l'autorizzazione per eseguire un ordine di acquisto?",
|
||||
"mpchange3": "Ordine di acquisto creato correttamente",
|
||||
"mpchange4": "Attendi che l'ordine di acquisto venga evaso",
|
||||
"mpchange5": "Impossibile inviare l'ordine di acquisto.",
|
||||
"mpchange6": "Concedi a questa applicazione l'autorizzazione per eseguire un ordine di vendita?",
|
||||
"mpchange7": "Per:",
|
||||
"mpchange8": "Ordine di vendita creato correttamente.",
|
||||
"mpchange9": "Attendi che l'ordine di vendita venga elencato.",
|
||||
"mpchange10": "Impossibile inviare l'ordine di vendita.",
|
||||
"mpchange11": "Impossibile trovare le informazioni AT.",
|
||||
"mpchange12": "Concedi a questa applicazione l'autorizzazione per eseguire l'annullamento di un ordine di vendita?",
|
||||
"mpchange13": "Ordine di vendita annullato correttamente.",
|
||||
"mpchange14": "Attendi che la transazione annullando get fulfilled.",
|
||||
"mpchange15": "Impossibile annullare l'ordine di vendita.",
|
||||
"mpchange16": "Errore nel recupero dell'elenco.",
|
||||
"mpchange17": "Errore nell'aggiunta all'elenco.",
|
||||
"mpchange18": "Errore nell'eliminazione dell'elenco.",
|
||||
"mpchange19": "Errore nel recupero dell'elenco degli amici.",
|
||||
"mpchange20": "Il conteggio non è un numero.",
|
||||
"mpchange21": "Conteggio mancante.",
|
||||
"mpchange22": "Nessun dato o file inviato.",
|
||||
"mpchange23": "La crittografia dei dati richiede chiavi pubbliche.",
|
||||
"mpchange24": "Solo i dati crittografati possono essere inseriti nei servizi privati.",
|
||||
"mpchange25": "Caricamento non riuscito a causa di crittografia non riuscita.",
|
||||
"mpchange26": "Caricamento non riuscito.",
|
||||
"mpchange27": "Dati non validi.",
|
||||
"mpchange28": "Nessuna risorsa da pubblicare.",
|
||||
"mpchange29": "Sconosciuto errore.",
|
||||
"mpchange30": "Sondaggio non trovato.",
|
||||
"mpchange31": "Impossibile votare per il sondaggio.",
|
||||
"mpchange32": "Impossibile creare il sondaggio.",
|
||||
"mpchange33": "Inserisci un collegamento qortal - qortal://...",
|
||||
"mpchange34": "Collegamento qortal non valido.",
|
||||
"mpchange35": "Errore nella notifica push.",
|
||||
"mpchange36": "Impossibile inviare il messaggio.",
|
||||
"mpchange37": "Impossibile inviare un messaggio crittografato a questo utente perché non ha la sua chiave pubblica sulla catena.",
|
||||
"mpchange38": "Impossibile soddisfare la richiesta.",
|
||||
"mpchange39": "Gruppo non trovato.",
|
||||
"mpchange40": "Concedi a questa applicazione l'autorizzazione per eseguire una richiesta di adesione al gruppo?",
|
||||
"mpchange41": "Nome gruppo:",
|
||||
"mpchange42": "ID gruppo:",
|
||||
"mpchange43": "Richiesta di adesione al gruppo creata correttamente.",
|
||||
"mpchange44": "Impossibile unirsi al gruppo.",
|
||||
"mpchange45": "Impossibile derivare un tipo MIME.",
|
||||
"mpchange46": "Impossibile derivare un'estensione file.",
|
||||
"mpchange47": "L'utente ha rifiutato il download.",
|
||||
"mpchange48": "Impossibile avviare il download.",
|
||||
"mpchange49": "Impossibile distribuire AT.",
|
||||
"mpchange50": "L'utente non ha un profilo.",
|
||||
"mpchange51": "Impossibile trovare i dati richiesti.",
|
||||
"mpchange52": "Impossibile ottenere i dati del profilo.",
|
||||
"mpchange53": "Impossibile impostare la proprietà.",
|
||||
"mpchange54": "Impossibile aprire il profilo.",
|
||||
"mpchange55": "Errore nel recupero delle informazioni del server.",
|
||||
"mpchange56": "Errore nel riepilogo delle attività di tx.",
|
||||
"mpchange57": "Errore nel get foreign fee.",
|
||||
"mpchange58": "Errore nel aggiorna tariffa estera.",
|
||||
"mpchange59": "Errore nella cronologia delle connessioni al server.",
|
||||
"mpchange60": "Errore nell'impostazione del server corrente.",
|
||||
"mpchange61": "Errore nell'aggiunta del server.",
|
||||
"mpchange62": "Errore nella rimozione del server.",
|
||||
"mpchange63": "Errore nel recupero del riepilogo.",
|
||||
"mpchange64": "Impossibile decodificare la transazione.",
|
||||
"mpchange65": "Concedi a questa applicazione l'autorizzazione a firmare ed elaborare una transazione?",
|
||||
"mpchange66": "Concedi a questa applicazione l'autorizzazione a firmare una transazione?",
|
||||
"mpchange67": "Leggi attentamente la transazione prima di accettare.",
|
||||
"mpchange68": "Tipo Tx:",
|
||||
"mpchange69": "Dati TX:",
|
||||
"mpchange70": "La transazione di processo non è stata richiesta.",
|
||||
"mpchange71": "I byte firmati sono: ",
|
||||
"mpchange72": "Transazione firmata ed elaborata correttamente.",
|
||||
"mpchange73": "Impossibile elaborare la transazione.",
|
||||
"mpchange74": "Impossibile recuperare il saldo QORT. Riprova!",
|
||||
"mpchange75": "Impossibile inviare la moneta.",
|
||||
"mpchange76": "Impossibile recuperare il saldo BTC. Riprova!",
|
||||
"mpchange77": "Impossibile recuperare il saldo LTC. Riprova!",
|
||||
"mpchange78": "Impossibile recuperare il saldo DOGE. Riprova!",
|
||||
"mpchange79": "Impossibile recuperare il saldo DGB. Riprova!",
|
||||
"mpchange80": "Impossibile recuperare il saldo RVN. Riprova!",
|
||||
"mpchange81": "Impossibile recuperare il saldo ARRR. Riprova!",
|
||||
"mpchange82": "CAMPI MANCANTI",
|
||||
"mpchange83": "RIFIUTATO",
|
||||
"mpchange84": "FALLITO",
|
||||
"mpchange85": "RIUSCITO",
|
||||
"mpchange86": "Consenti sempre di ottenere automaticamente il saldo del portafoglio",
|
||||
"mpchange87": "Inserisci l'ID del gruppo"
|
||||
}
|
||||
}
|
||||
|
@ -248,7 +248,9 @@
|
||||
"balance": "残高",
|
||||
"balances": "あなたのウォレット残高",
|
||||
"update": "ウォレット残高を更新",
|
||||
"view": "表示"
|
||||
"view": "表示",
|
||||
"all": "全て",
|
||||
"page": "ページ"
|
||||
},
|
||||
"gifs": {
|
||||
"gchange1": "GIF エクスプローラー",
|
||||
@ -466,7 +468,7 @@
|
||||
"rchange6": "受取人",
|
||||
"rchange7": "アクション",
|
||||
"rchange8": "タイプ",
|
||||
"rchange9": "レベル 1 ~ 4 は自己シェアを、レベル 5 以上は報酬シェアを作成出来ます!",
|
||||
"rchange9": "レベル 0 ~ 4 は自己シェアを、レベル 5 以上は報酬シェアを作成出来ます!",
|
||||
"rchange10": "受取人の公開鍵",
|
||||
"rchange11": "報酬シェア率",
|
||||
"rchange12": "おいしいことをしています",
|
||||
@ -740,7 +742,8 @@
|
||||
"bchange51": "変更を送信するには、[プロフィールを更新] をクリックすることを忘れないでください。",
|
||||
"bchange52": "ウォレット情報を取得する許可をこのアプリケーションに与えますか?",
|
||||
"bchange53": "すべてのアプリによる友達リストの自動取得を常に許可します",
|
||||
"bchange54": "このアプリケーションに友達リストへのアクセスを許可しますか?"
|
||||
"bchange54": "このアプリケーションに友達リストへのアクセスを許可しますか?",
|
||||
"bchange55": "このアプリケーションにこのコマンドを送信する許可を与えますか?"
|
||||
},
|
||||
"datapage": {
|
||||
"dchange1": "データ管理",
|
||||
@ -840,7 +843,7 @@
|
||||
"cchange74": "リアクション",
|
||||
"cchange75": "添付ファイルをアップロード中。これには最大 1 分かかる場合があります。",
|
||||
"cchange76": "添付ファイルを削除中。これには最大 1 分かかる場合があります。",
|
||||
"cchange77": "添付ファイルのサイズが 1 MB を超えています",
|
||||
"cchange77": "添付ファイルのサイズが 10 MB を超えています",
|
||||
"cchange78": "この画像を削除しますか?",
|
||||
"cchange79": "この添付ファイルを削除しますか?",
|
||||
"cchange80": "この画像は削除されました",
|
||||
@ -853,7 +856,24 @@
|
||||
"cchange94": "ロードされました",
|
||||
"cchange95": "私のリソースのみ",
|
||||
"cchange96": "オープングループ管理",
|
||||
"cchange97": "グループに参加するリンクがクリップボードにコピーされました"
|
||||
"cchange97": "グループに参加するリンクがクリップボードにコピーされました",
|
||||
"cchange98": "ファイルをアップロードしています。これには数分かかる場合があります。",
|
||||
"cchange99": "ファイルを削除しています。これには最大 1 分かかる場合があります。",
|
||||
"cchange100": "ファイル サイズが 125 MB を超えています",
|
||||
"cchange101": "このファイルを削除してもよろしいですか?",
|
||||
"cchange102": "このファイルは削除されました",
|
||||
"cchange103": "gif をアップロードしています。これには最大 1 分かかる場合があります。",
|
||||
"cchange104": "gif を削除しています。これには最大 1 分かかる場合があります。",
|
||||
"cchange105": "ファイル サイズが 3 MB を超えています",
|
||||
"cchange106": "この gif を削除してもよろしいですか?",
|
||||
"cchange107": "このGIFは削除されました",
|
||||
"cchange108": "ダウンロードはバックグラウンドで続行されます。同時にダウンロードできる Q-Chat ファイルは 1 つだけです。",
|
||||
"cchange109": "ファイルの種類はサポートされていません!",
|
||||
"cchange110": "画像アップロード",
|
||||
"cchange111": "GIF アップロード",
|
||||
"cchange112": "添付ファイルのアップロード",
|
||||
"cchange113": "ファイルのアップロード",
|
||||
"cchange114": "何か書いてください ..."
|
||||
},
|
||||
"welcomepage": {
|
||||
"wcchange1": "Q-Chat へようこそ",
|
||||
@ -954,7 +974,10 @@
|
||||
"gchange65": "このアドレスをグループの所有権の譲渡に置き換えてください。",
|
||||
"gchange66": "無効な所有者/新しい所有者のアドレス",
|
||||
"gchange67": "グループ UPDATE 成功しました!",
|
||||
"gchange68": "グループアバターの設定"
|
||||
"gchange68": "グループアバターの設定",
|
||||
"gchange69": "メッセージ",
|
||||
"gchange70": "過去 24 時間以内にメッセージはありません。",
|
||||
"gchange71": "このグループにはすでに参加しています。"
|
||||
},
|
||||
"puzzlepage": {
|
||||
"pchange1": "パズル",
|
||||
@ -1297,5 +1320,104 @@
|
||||
"tour20": "ブロックが遅れています。同期プロセスを高速化するために更新 (ブートストラップ) しますか?",
|
||||
"tour21": "残りのブロック。",
|
||||
"tour22": "更新 (ブートストラップ) が要求されました。お待ちください。"
|
||||
},
|
||||
"chatsettings": {
|
||||
"cs1": "チャット設定",
|
||||
"cs2": "一般チャット設定",
|
||||
"cs3": "チャットメッセージのタイムスタンプ",
|
||||
"cs4": "過去時間",
|
||||
"cs5": "現地時間",
|
||||
"cs6": "チャットメッセージのフォントサイズ",
|
||||
"cs7": "標準",
|
||||
"cs8": "px"
|
||||
},
|
||||
"modals": {
|
||||
"mpchange1": "要求されたすべての AT は同じ外部ブロックチェーンである必要があります。",
|
||||
"mpchange2": "このアプリケーションに購入注文を実行する権限を与えますか?",
|
||||
"mpchange3": "購入注文が正常に作成されました",
|
||||
"mpchange4": "購入注文が履行されるまでお待ちください",
|
||||
"mpchange5": "購入注文の送信に失敗しました。",
|
||||
"mpchange6": "このアプリケーションに売り注文を実行する権限を与えますか?",
|
||||
"mpchange7": "対象:",
|
||||
"mpchange8": "売り注文が正常に作成されました。",
|
||||
"mpchange9": "売り注文がリストされるまでお待ちください。",
|
||||
"mpchange10": "売り注文の送信に失敗しました。",
|
||||
"mpchange11": "AT 情報が見つかりません。",
|
||||
"mpchange12": "このアプリケーションに売り注文のキャンセルを実行する権限を与えますか?",
|
||||
"mpchange13": "売り注文が正常にキャンセルされました。",
|
||||
"mpchange14": "取引キャンセルが完了するまでお待ちください。完了しました。",
|
||||
"mpchange15": "売り注文のキャンセルに失敗しました。",
|
||||
"mpchange16": "リストの取得中にエラーが発生しました。",
|
||||
"mpchange17": "リストへの追加中にエラーが発生しました。",
|
||||
"mpchange18": "リストの削除中にエラーが発生しました。",
|
||||
"mpchange19": "友達リストの取得中にエラーが発生しました。",
|
||||
"mpchange20": "カウントが数値ではありません。",
|
||||
"mpchange21": "カウントがありません。",
|
||||
"mpchange22": "データまたはファイルが送信されていません。",
|
||||
"mpchange23": "データの暗号化には公開キーが必要です。",
|
||||
"mpchange24": "プライベートサービスに使用できるのは暗号化されたデータのみです。",
|
||||
"mpchange25": "暗号化に失敗したためアップロードに失敗しました。",
|
||||
"mpchange26": "アップロードに失敗しました。",
|
||||
"mpchange27": "無効なデータです。",
|
||||
"mpchange28": "公開するリソースがありません。",
|
||||
"mpchange29": "不明なエラーです。",
|
||||
"mpchange30": "投票が見つかりません。",
|
||||
"mpchange31": "投票に失敗しました。",
|
||||
"mpchange32": "投票を作成できませんでした。",
|
||||
"mpchange33": "qortal リンクを入力してください - qortal://...",
|
||||
"mpchange34": "無効な qortal リンクです。",
|
||||
"mpchange35": "通知のプッシュ中にエラーが発生しました。",
|
||||
"mpchange36": "メッセージを送信できませんでした。",
|
||||
"mpchange37": "このユーザーには公開鍵がチェーン上にないため、暗号化されたメッセージを送信できません。",
|
||||
"mpchange38": "リクエストを処理できませんでした。",
|
||||
"mpchange39": "グループが見つかりません。",
|
||||
"mpchange40": "このアプリケーションにグループ参加リクエストを実行する権限を与えますか?",
|
||||
"mpchange41": "グループ名:",
|
||||
"mpchange42": "グループ ID:",
|
||||
"mpchange43": "グループ参加リクエストが正常に作成されました。",
|
||||
"mpchange44": "失敗しましたグループに参加します。",
|
||||
"mpchange45": "MIME タイプを取得できませんでした。",
|
||||
"mpchange46": "ファイル拡張子を取得できませんでした。",
|
||||
"mpchange47": "ユーザーがダウンロードを拒否しました。",
|
||||
"mpchange48": "ダウンロードを開始できませんでした。",
|
||||
"mpchange49": "AT を展開できませんでした。",
|
||||
"mpchange50": "ユーザーにはプロファイルがありません。",
|
||||
"mpchange51": "要求されたデータが見つかりません。",
|
||||
"mpchange52": "プロファイル データを取得できませんでした。",
|
||||
"mpchange53": "プロパティを設定できませんでした。",
|
||||
"mpchange54": "プロファイルを開けませんでした。",
|
||||
"mpchange55": "サーバー情報の取得中にエラーが発生しました。",
|
||||
"mpchange56": "tx アクティビティ サマリーでエラーが発生しました。",
|
||||
"mpchange57": "外国手数料の取得中にエラーが発生しました。",
|
||||
"mpchange58": "外国手数料の更新中にエラーが発生しました。",
|
||||
"mpchange59": "サーバー接続の取得中にエラーが発生しました履歴。",
|
||||
"mpchange60": "現在のサーバーの設定中にエラーが発生しました。",
|
||||
"mpchange61": "サーバーの追加中にエラーが発生しました。",
|
||||
"mpchange62": "サーバーの削除中にエラーが発生しました。",
|
||||
"mpchange63": "概要の取得中にエラーが発生しました。",
|
||||
"mpchange64": "トランザクションのデコードに失敗しました。",
|
||||
"mpchange65": "このアプリケーションにトランザクションの署名と処理の権限を与えますか?",
|
||||
"mpchange66": "このアプリケーションにトランザクションの署名の権限を与えますか?",
|
||||
"mpchange67": "承認する前にトランザクションをよくお読みください。",
|
||||
"mpchange68": "Tx タイプ:",
|
||||
"mpchange69": "TX データ:",
|
||||
"mpchange70": "トランザクションの処理が要求されていません。",
|
||||
"mpchange71": "署名されたバイト数: ",
|
||||
"mpchange72": "トランザクションは正常に署名され、処理されました。",
|
||||
"mpchange73": "トランザクションを処理できませんでした。",
|
||||
"mpchange74": "QORT の取得に失敗しました残高。もう一度お試しください!",
|
||||
"mpchange75": "コインを送信できませんでした。",
|
||||
"mpchange76": "BTC 残高の取得に失敗しました。もう一度お試しください!",
|
||||
"mpchange77": "LTC 残高の取得に失敗しました。もう一度お試しください!",
|
||||
"mpchange78": "DOGE 残高の取得に失敗しました。もう一度お試しください!",
|
||||
"mpchange79": "DGB 残高の取得に失敗しました。もう一度お試しください!",
|
||||
"mpchange80": "RVN 残高の取得に失敗しました。もう一度お試しください!",
|
||||
"mpchange81": "ARRR 残高の取得に失敗しました。もう一度お試しください!",
|
||||
"mpchange82": "フィールドがありません",
|
||||
"mpchange83": "拒否されました",
|
||||
"mpchange84": "失敗",
|
||||
"mpchange85": "成功",
|
||||
"mpchange86": "ウォレット残高の自動取得を常に許可する",
|
||||
"mpchange87": "グループ ID を入力してください"
|
||||
}
|
||||
}
|
||||
|
@ -248,7 +248,9 @@
|
||||
"balance": "균형",
|
||||
"balances": "지갑 잔액",
|
||||
"update": "월렛 잔액 업데이트",
|
||||
"view": "보다"
|
||||
"view": "보다",
|
||||
"all": "모두",
|
||||
"page": "페이지"
|
||||
},
|
||||
"gifs": {
|
||||
"gchange1": "Gif 탐색기",
|
||||
@ -466,7 +468,7 @@
|
||||
"rchange6": "받는사람",
|
||||
"rchange7": "액션",
|
||||
"rchange8": "유형",
|
||||
"rchange9": "레벨 1 - 4는 자체 공유를 생성할 수 있으며 레벨 5 이상은 보상 공유를 생성할 수 있습니다.",
|
||||
"rchange9": "레벨 0 - 4는 자체 공유를 생성할 수 있으며 레벨 5 이상은 보상 공유를 생성할 수 있습니다.",
|
||||
"rchange10": "수신자 공개 키",
|
||||
"rchange11": "보상공유율",
|
||||
"rchange12": "맛있는 거 하기",
|
||||
@ -740,7 +742,8 @@
|
||||
"bchange51": "변경 사항을 제출하려면 '프로필 업데이트'를 클릭하는 것을 잊지 마세요.",
|
||||
"bchange52": "이 애플리케이션에 지갑 정보를 얻을 수 있는 권한을 부여하시겠습니까?",
|
||||
"bchange53": "항상 모든 앱에서 친구 목록을 자동으로 검색하도록 허용",
|
||||
"bchange54": "이 애플리케이션에 친구 목록에 접근할 수 있는 권한을 부여하시겠습니까?"
|
||||
"bchange54": "이 애플리케이션에 친구 목록에 접근할 수 있는 권한을 부여하시겠습니까?",
|
||||
"bchange55": "이 애플리케이션이 이 명령을 보내도록 허락하시겠습니까?"
|
||||
},
|
||||
"datapage": {
|
||||
"dchange1": "데이터 관리",
|
||||
@ -840,7 +843,7 @@
|
||||
"cchange74": "반응",
|
||||
"cchange75": "첨부파일을 업로드하는 중입니다. 최대 1분이 소요될 수 있습니다.",
|
||||
"cchange76": "첨부파일을 삭제하는 중입니다. 최대 1분이 소요될 수 있습니다.",
|
||||
"cchange77": "첨부 파일 크기가 1MB를 초과함",
|
||||
"cchange77": "첨부 파일 크기가 10MB를 초과함",
|
||||
"cchange78": "정말 이 이미지를 삭제하시겠습니까?",
|
||||
"cchange79": "이 첨부파일을 삭제하시겠습니까?",
|
||||
"cchange80": "이 이미지는 삭제되었습니다",
|
||||
@ -853,7 +856,24 @@
|
||||
"cchange94": "로드됨",
|
||||
"cchange95": "내 리소스만",
|
||||
"cchange96": "그룹 관리 열기",
|
||||
"cchange97": "그룹 가입 링크가 클립보드에 복사되었습니다."
|
||||
"cchange97": "그룹 가입 링크가 클립보드에 복사되었습니다.",
|
||||
"cchange98": "파일을 업로드하는 중입니다. 몇 분 정도 걸릴 수 있습니다.",
|
||||
"cchange99": "파일을 삭제하는 중입니다. 최대 1분이 걸릴 수 있습니다.",
|
||||
"cchange100": "파일 크기가 125MB를 초과합니다",
|
||||
"cchange101": "정말 이 파일을 삭제하시겠습니까?",
|
||||
"cchange102": "이 파일은 삭제되었습니다",
|
||||
"cchange103": "gif를 업로드하는 중입니다. 최대 1분이 걸릴 수 있습니다.",
|
||||
"cchange104": "gif를 삭제하는 중입니다. 최대 1분이 걸릴 수 있습니다.",
|
||||
"cchange105": "파일 크기가 3MB를 초과합니다",
|
||||
"cchange106": "이 GIF를 삭제하시겠습니까?",
|
||||
"cchange107": "이 GIF는 삭제되었습니다",
|
||||
"cchange108": "다운로드는 백그라운드에서 계속됩니다. 동시에 하나의 Q-Chat 파일만 다운로드할 수 있습니다.",
|
||||
"cchange109": "파일 형식이 지원되지 않습니다!",
|
||||
"cchange110": "이미지 업로드",
|
||||
"cchange111": "GIF 업로드",
|
||||
"cchange112": "첨부 파일 업로드",
|
||||
"cchange113": "파일 업로드",
|
||||
"cchange114": "뭔가를 쓰세요 ..."
|
||||
},
|
||||
"welcomepage": {
|
||||
"wcchange1": "Q-Chat에 오신 것을 환영합니다.",
|
||||
@ -954,7 +974,10 @@
|
||||
"gchange65": "이 주소를 그룹의 소유권 이전으로 바꾸십시오!",
|
||||
"gchange66": "잘못된 소유자/새 소유자 주소",
|
||||
"gchange67": "그룹 업데이트 성공!",
|
||||
"gchange68": "그룹 아바타 설정"
|
||||
"gchange68": "그룹 아바타 설정",
|
||||
"gchange69": "메시지",
|
||||
"gchange70": "지난 24시간 동안 메시지가 없습니다!",
|
||||
"gchange71": "당신은 이미 이 그룹에 가입했습니다!"
|
||||
},
|
||||
"puzzlepage": {
|
||||
"pchange1": "퍼즐",
|
||||
@ -1297,5 +1320,104 @@
|
||||
"tour20": "뒤에 차단되어 있습니다. 동기화 프로세스 속도를 높이기 위해 새로 고치시겠습니까(부트스트랩)?",
|
||||
"tour21": "남은 블록입니다.",
|
||||
"tour22": "새로 고침(부트스트랩)이 요청되었습니다. 잠시 기다려 주십시오."
|
||||
},
|
||||
"chatsettings": {
|
||||
"cs1": "채팅 설정",
|
||||
"cs2": "일반 채팅 설정",
|
||||
"cs3": "채팅 메시지 타임스탬프",
|
||||
"cs4": "옛날",
|
||||
"cs5": "현지 시간",
|
||||
"cs6": "채팅 메시지 글꼴 크기",
|
||||
"cs7": "표준",
|
||||
"cs8": "px"
|
||||
},
|
||||
"modals": {
|
||||
"mpchange1": "요청된 모든 AT는 동일한 외국 블록체인이어야 합니다.",
|
||||
"mpchange2": "이 애플리케이션에 매수 주문을 수행할 권한을 부여하시겠습니까?",
|
||||
"mpchange3": "매수 주문이 성공적으로 생성되었습니다.",
|
||||
"mpchange4": "매수 주문이 이행될 때까지 기다려 주십시오.",
|
||||
"mpchange5": "매수 주문을 제출하지 못했습니다.",
|
||||
"mpchange6": "이 애플리케이션에 매도 주문을 수행할 권한을 부여하시겠습니까?",
|
||||
"mpchange7": "대상:",
|
||||
"mpchange8": "매도 주문을 성공적으로 생성했습니다.",
|
||||
"mpchange9": "매도 주문이 등록될 때까지 기다려 주십시오.",
|
||||
"mpchange10": "매도 주문을 제출하지 못했습니다.",
|
||||
"mpchange11": "AT 정보를 찾을 수 없습니다.",
|
||||
"mpchange12": "이 애플리케이션에 매도 주문 취소 권한을 부여하시겠습니까?",
|
||||
"mpchange13": "매도 주문을 성공적으로 취소했습니다.",
|
||||
"mpchange14": "거래 취소가 완료될 때까지 기다려 주세요.",
|
||||
"mpchange15": "판매 주문을 취소하지 못했습니다.",
|
||||
"mpchange16": "목록을 검색하는 중 오류가 발생했습니다.",
|
||||
"mpchange17": "목록에 추가하는 중 오류가 발생했습니다.",
|
||||
"mpchange18": "목록 삭제 중 오류가 발생했습니다.",
|
||||
"mpchange19": "친구 목록을 검색하는 중 오류가 발생했습니다.",
|
||||
"mpchange20": "개수가 숫자가 아닙니다.",
|
||||
"mpchange21": "개수가 없습니다.",
|
||||
"mpchange22": "제출된 데이터나 파일이 없습니다.",
|
||||
"mpchange23": "데이터 암호화에는 공개 키가 필요합니다.",
|
||||
"mpchange24": "암호화된 데이터만 개인 서비스에 들어갈 수 있습니다.",
|
||||
"mpchange25": "암호화에 실패하여 업로드에 실패했습니다.",
|
||||
"mpchange26": "업로드에 실패했습니다.",
|
||||
"mpchange27": "잘못된 데이터입니다.",
|
||||
"mpchange28": "아니요 게시할 리소스입니다.",
|
||||
"mpchange29": "알 수 없는 오류입니다.",
|
||||
"mpchange30": "투표를 찾을 수 없습니다.",
|
||||
"mpchange31": "투표에 투표하지 못했습니다.",
|
||||
"mpchange32": "투표를 만들지 못했습니다.",
|
||||
"mpchange33": "qortal 링크를 입력하세요 - qortal://...",
|
||||
"mpchange34": "잘못된 qortal 링크입니다.",
|
||||
"mpchange35": "알림을 푸시하는 중 오류가 발생했습니다.",
|
||||
"mpchange36": "메시지를 보낼 수 없습니다.",
|
||||
"mpchange37": "체인에 공개 키가 없으므로 이 사용자에게 암호화된 메시지를 보낼 수 없습니다.",
|
||||
"mpchange38": "요청을 이행할 수 없습니다.",
|
||||
"mpchange39": "그룹을 찾을 수 없습니다.",
|
||||
"mpchange40": "이 애플리케이션에 그룹 가입 요청을 수행할 수 있는 권한을 부여하시겠습니까?",
|
||||
"mpchange41": "그룹 이름:",
|
||||
"mpchange42": "그룹 ID:",
|
||||
"mpchange43": "그룹 가입 요청을 성공적으로 생성했습니다.",
|
||||
"mpchange44": "그룹에 가입하지 못했습니다.",
|
||||
"mpchange45": "MIME 유형을 파생할 수 없습니다.",
|
||||
"mpchange46": "파일 확장자를 파생할 수 없습니다.",
|
||||
"mpchange47": "사용자가 다운로드를 거부했습니다.",
|
||||
"mpchange48": "다운로드를 시작하지 못했습니다.",
|
||||
"mpchange49": "AT를 배포하지 못했습니다.",
|
||||
"mpchange50": "사용자에게 프로필이 없습니다.",
|
||||
"mpchange51": "요청한 데이터를 찾을 수 없습니다.",
|
||||
"mpchange52": "프로필 데이터를 가져오지 못했습니다.",
|
||||
"mpchange53": "속성을 설정하지 못했습니다.",
|
||||
"mpchange54": "프로필을 열지 못했습니다.",
|
||||
"mpchange55": "서버 정보를 검색하는 중 오류가 발생했습니다.",
|
||||
"mpchange56": " tx 활동 요약.",
|
||||
"mpchange57": "외국 수수료 가져오기 오류.",
|
||||
"mpchange58": "외국 수수료 업데이트 오류.",
|
||||
"mpchange59": "서버 연결 기록 가져오기 오류.",
|
||||
"mpchange60": "현재 서버 설정 오류.",
|
||||
"mpchange61": "서버 추가 오류.",
|
||||
"mpchange62": "서버 제거 오류.",
|
||||
"mpchange63": "요약 검색 오류.",
|
||||
"mpchange64": "거래 디코딩 실패.",
|
||||
"mpchange65": "이 애플리케이션에 거래 서명 및 처리 권한 부여?",
|
||||
"mpchange66": "이 애플리케이션에 거래 서명 권한 부여?",
|
||||
"mpchange67": "수락하기 전에 거래를 주의 깊게 읽어보세요.",
|
||||
"mpchange68": "거래 유형:",
|
||||
"mpchange69": "TX 데이터:",
|
||||
"mpchange70": "거래 처리가 요청되지 않았습니다.",
|
||||
"mpchange71": "서명된 바이트는 다음과 같습니다. ",
|
||||
"mpchange72": "거래가 서명되고 성공적으로 처리되었습니다.",
|
||||
"mpchange73": "거래를 처리할 수 없습니다.",
|
||||
"mpchange74": "QORT 잔액을 가져오는 데 실패했습니다. 다시 시도하세요!",
|
||||
"mpchange75": "코인을 보낼 수 없습니다.",
|
||||
"mpchange76": "BTC 잔액을 가져오는 데 실패했습니다. 다시 시도하세요!",
|
||||
"mpchange77": "LTC 잔액을 가져오는 데 실패했습니다. 다시 시도하세요!",
|
||||
"mpchange78": "DOGE 잔액을 가져오는 데 실패했습니다. 다시 시도하세요!",
|
||||
"mpchange79": "DGB 잔액을 가져오는 데 실패했습니다. 다시 시도하세요!",
|
||||
"mpchange80": "RVN 잔액을 가져오는 데 실패했습니다. 다시 시도하세요!",
|
||||
"mpchange81": "ARRR 잔액을 가져오는 데 실패했습니다. 다시 시도하세요!",
|
||||
"mpchange82": "누락된 필드",
|
||||
"mpchange83": "거부됨",
|
||||
"mpchange84": "실패",
|
||||
"mpchange85": "성공",
|
||||
"mpchange86": "항상 지갑 잔액을 자동으로 가져오도록 허용",
|
||||
"mpchange87": "그룹 ID를 입력하세요"
|
||||
}
|
||||
}
|
||||
|
@ -111,11 +111,11 @@
|
||||
"areyousure": "Weet U zeker dat U deze portefeuille uit de opgeslagen portefeuilles wilt verwijderen? (Als het wordt verwijderd en er geen backup-bestand bestaat, kan het account voor altijd verloren gaan! Zorg ervoor dat U over een backup-bestand beschikt voor U dit doet!)",
|
||||
"error1": "De backup moet een geldig JSON formaat zijn",
|
||||
"error2": "Geen aanmeld-optie geselecteerd",
|
||||
"createwelcome": "Welkom bij Qortal! Uw gedecentraliseerde digitale toekomst wacht op u! Binnen Qortal bent U de enige die toegang heeft tot uw gegevens. Qortal biedt de laagdrempelige infrastructuur van een nieuwe, en volledig door de gebruiker bestuurde digitale wereld.",
|
||||
"createwelcome": "Welkom bij Qortal! Uw gedecentraliseerde digitale toekomst wacht op jou! Binnen Qortal bent U de enige die toegang heeft tot uw gegevens. Qortal biedt de laagdrempelige infrastructuur van een nieuwe, en volledig door de gebruiker bestuurde digitale wereld.",
|
||||
"createa": "Een willekeurige",
|
||||
"click": "Klik hier om uw memo-zin zichtbaar te maken",
|
||||
"confirmpass": "Wachtwoord bevestigen",
|
||||
"willbe": "wordt willekeurig op de achtergrond gegenereerd. Als u de memo-zin wilt BEKIJKEN, klikt u op de gemarkeerde 'memo-zin' in deze tekst. Dit wordt gebruikt als privé-sleutel-generator voor uw blockchain-account in Qortal. Uit veiligheidsoverwegingen worden memo-zinnen niet weergegeven, tenzij dit specifiek is gekozen.",
|
||||
"willbe": "wordt willekeurig op de achtergrond gegenereerd. Als U de memo-zin wilt BEKIJKEN, klikt U op de gemarkeerde 'memo-zin' in deze tekst. Dit wordt gebruikt als privé-sleutel-generator voor uw blockchain-account in Qortal. Uit veiligheidsoverwegingen worden memo-zinnen niet weergegeven, tenzij dit specifiek is gekozen.",
|
||||
"clicknext": "Klik hieronder op VERDER om jouw Qortal-account aan te maken.",
|
||||
"ready": "Uw account is nu klaar om te worden aangemaakt. Het wordt standaard in gecodeerde vorm opgeslagen binnen deze kopie van de Qortal-gebruikersinterface. Als U niet wilt dat uw nieuwe account hierin wordt opgeslagen, kunt U dit hieronder uitschakelen. U kunt nog steeds inloggen met uw nieuwe account (na het uitloggen), met behulp van uw Qortal-backup-bestand, dat U daarom MOET opslaan bij het aanmaken van uw account.",
|
||||
"welmessage": "Welkom bij Qortal",
|
||||
@ -248,7 +248,9 @@
|
||||
"balance": "Saldo",
|
||||
"balances": "SALDI VAN UW PORTEFEUILLES",
|
||||
"update": "SALDI VAN PORTEFEUILLES HEROPVRAGEN",
|
||||
"view": "Bekijken"
|
||||
"view": "Bekijken",
|
||||
"all": "Alle",
|
||||
"page": "Bladzijde"
|
||||
},
|
||||
"gifs": {
|
||||
"gchange1": "GIF-Explorer",
|
||||
@ -257,7 +259,7 @@
|
||||
"gchange4": "Geabonneerde collecties",
|
||||
"gchange5": "Jouw GIF-bestanden opladen",
|
||||
"gchange6": "Bestand moet .GIF zijn",
|
||||
"gchange7": "Collectie upladen",
|
||||
"gchange7": "Collectie opladen",
|
||||
"gchange8": "Naam van collectie is verplicht!",
|
||||
"gchange9": "Naam van collectie",
|
||||
"gchange10": "GIF-bestand werd opgeladen!",
|
||||
@ -466,7 +468,7 @@
|
||||
"rchange6": "Ontvanger",
|
||||
"rchange7": "Actie",
|
||||
"rchange8": "Type",
|
||||
"rchange9": "Level 1 - 4 kunnen een zelf-beloning aanmaken en Level 5 en hoger kunnen een belonings-deel toekennen!",
|
||||
"rchange9": "Level 0 - 4 kunnen een zelf-beloning aanmaken en Level 5 en hoger kunnen een belonings-deel toekennen!",
|
||||
"rchange10": "Publieke sleutel van de ontvanger",
|
||||
"rchange11": "Belonings-deel in procent",
|
||||
"rchange12": "Doe iets heerlijk",
|
||||
@ -740,7 +742,8 @@
|
||||
"bchange51": "Vergeet niet te klikken op 'Profiel bijwerken' om de wijziging door te voeren.",
|
||||
"bchange52": "Geeft U deze applicatie toelating om uw portefeuille-info op te vragen?",
|
||||
"bchange53": "Maak de vriendenlijst automatisch opvraagbaar voor alle apps",
|
||||
"bchange54": "Geeft U deze applicatie toegang tot uw vriendenlijst?"
|
||||
"bchange54": "Geeft U deze applicatie toegang tot uw vriendenlijst?",
|
||||
"bchange55": "Geeft U deze applicatie toelating om dit commando te verzenden?"
|
||||
},
|
||||
"datapage": {
|
||||
"dchange1": "Data-beheer",
|
||||
@ -840,7 +843,7 @@
|
||||
"cchange74": "reageerden met",
|
||||
"cchange75": "Bijlage wordt opgeladen. Dit kan ongeveer een minuut duren.",
|
||||
"cchange76": "Bijlage wordt verwijderd. Dit kan ongeveer een minuut duren.",
|
||||
"cchange77": "Bijlage is groter dan 1 MB",
|
||||
"cchange77": "Bijlage is groter dan 10 MB",
|
||||
"cchange78": "Bent U zeker dat U deze afbeelding wenst te verwijderen?",
|
||||
"cchange79": "Bent U zeker dat U deze bijlage wenst te verwijderen?",
|
||||
"cchange80": "Deze afbeelding werd verwijderd",
|
||||
@ -853,7 +856,24 @@
|
||||
"cchange94": "opgeladen",
|
||||
"cchange95": "Enkel mijn gegevens",
|
||||
"cchange96": "Groep-beheer openen",
|
||||
"cchange97": "Link voor lid-aanvraag naar klembord gekopieerd"
|
||||
"cchange97": "Link voor lid-aanvraag naar klembord gekopieerd",
|
||||
"cchange98": "Bestand opladen. Dit kan enkele minuten duren.",
|
||||
"cchange99": "Bestand verwijderen. Dit kan maximaal één minuut duren.",
|
||||
"cchange100": "Bestandsgrootte is groter dan 125 MB",
|
||||
"cchange101": "Weet je zeker dat je dit bestand wil verwijderen?",
|
||||
"cchange102": "Dit bestand is verwijderd",
|
||||
"cchange103": "GIF opladen. Dit kan maximaal een minuut duren.",
|
||||
"cchange104": "GIF verwijderen. Dit kan maximaal een minuut duren.",
|
||||
"cchange105": "Bestandsgrootte is groter dan 3 MB",
|
||||
"cchange106": "Weet je zeker dat je deze GIF wil verwijderen?",
|
||||
"cchange107": "Deze GIF is verwijderd",
|
||||
"cchange108": "Het downloaden gaat door op de achtergrond. Er kan slechts ÉÉN Q-Chat-bestand tegelijkertijd worden gedownload.",
|
||||
"cchange109": "Bestandstype niet ondersteund!",
|
||||
"cchange110": "AFBEELDING OPLADEN",
|
||||
"cchange111": "GIF OPLADEN",
|
||||
"cchange112": "BIJLAGE OPLADEN",
|
||||
"cchange113": "BESTAND OPLADEN",
|
||||
"cchange114": "Schrijf iets ..."
|
||||
},
|
||||
"welcomepage": {
|
||||
"wcchange1": "Welkom bij Q-Chat",
|
||||
@ -954,7 +974,10 @@
|
||||
"gchange65": "Vervang dit adres enkel als U de EIGENDOM van de groep wenst OVER TE DRAGEN!",
|
||||
"gchange66": "Ongeldig adres van huidige of nieuwe eigenaar",
|
||||
"gchange67": "Groep UPDATE succesvol uitgevoerd!",
|
||||
"gchange68": "Groepsavatar instellen"
|
||||
"gchange68": "Groepsavatar instellen",
|
||||
"gchange69": "Berichten",
|
||||
"gchange70": "Geen berichten in de afgelopen 24 uur!",
|
||||
"gchange71": "Je bent al lid van deze groep!"
|
||||
},
|
||||
"puzzlepage": {
|
||||
"pchange1": "Puzzels",
|
||||
@ -1010,15 +1033,15 @@
|
||||
"nchange32": "Stop-aanvraag werd verzonden!",
|
||||
"nchange33": "Node herstarten",
|
||||
"nchange34": "Herstart-aanvraag werd verzonden!",
|
||||
"nchange35": "Startknooppunt",
|
||||
"nchange36": "Succesvol gestart knooppunt!",
|
||||
"nchange37": "Als u op Doorgaan klikt, wordt uw Qortal Core vernieuwd, wordt uw database verwijderd en downloadt u een nieuwe kopie van de database, genaamd bootstrapping.",
|
||||
"nchange38": "LTC-portemonnee repareren",
|
||||
"nchange39": "Hiermee worden LTC-portefeuilles gerepareerd die een saldo vertonen dat niet kan worden uitgegeven. Er moet een enkele transactie worden uitgevoerd op het Litecoin-netwerk, na bevestiging zal het portemonnee-saldo functioneel zijn en zal het probleem zich niet opnieuw voordoen.",
|
||||
"nchange35": "Start node",
|
||||
"nchange36": "Node succesvol opgestart!",
|
||||
"nchange37": "Als U op 'Doorgaan' klikt, wordt uw Qortal Core vernieuwd, de database verwijderd en vervangen door een nieuwe kopie van de database; Die noemen we 'bootstrapping' van de node.",
|
||||
"nchange38": "LTC-portefeuille herstellen",
|
||||
"nchange39": "Hiermee worden LTC-portefeuilles hersteld die een saldo vertonen dat niet kan worden uitgegeven. Er moet een transactie worden uitgevoerd op het Litecoin-netwerk, en na bevestiging zal het portefeuille-saldo terug functioneel zijn; Daarna zal het probleem zich niet opnieuw voordoen.",
|
||||
"nchange40": "Voor deze transactie worden kleine LTC-kosten in rekening gebracht. Doorgaan?",
|
||||
"nchange41": "Probeert te repareren. Even geduld a.u.b....",
|
||||
"nchange42": "LTC-portemonnee succesvol gerepareerd!",
|
||||
"nchange43": "Er is een fout opgetreden bij het repareren van de LTC-portemonnee. Probeer het opnieuw!"
|
||||
"nchange41": "Herstelling is bezig. Even geduld graag...",
|
||||
"nchange42": "LTC-portefeuille werd succesvol hersteld!",
|
||||
"nchange43": "Er is een fout opgetreden bij het herstellen van de LTC-portefeuille. Probeer het opnieuw!"
|
||||
},
|
||||
"transpage": {
|
||||
"tchange1": "Transactie-aanvraag",
|
||||
@ -1185,7 +1208,7 @@
|
||||
"inf7": "Informatie over automatische aankoop",
|
||||
"inf8": "Info over automatische aankoop sluiten",
|
||||
"inf9": "'Automatische aamkoop' is een functie waarmee je 'aankoop-orders' op het handelsportaal kan plaatsen. Die 'aankoop-orders' zijn enkel zichtbaar voor de persoon die ze plaatst. Het zijn geen 'publiek zichtbare orders' zoals de 'open-markt-verkoop-orders' en ze worden NIET op de Qortal blockchain bewaard. 'Automatische aankoop' is een UI-functie, die bij gevolg enkel werkt zolang de UI blijft draaien.",
|
||||
"inf10": "Om via 'Automatiche aankoop' een bestelling te plaatsen, klikt U op de knop 'auto-aankoop toevoegen' en vult U het vakje in dat verschijnt. Voer het BEDRAG VAN QORT in dat U wilt KOPEN of het aantal LTC dat U wilt gebruiken, en de PRIJS waartoe u bereid bent te KOPEN. Zodra de bestelling actief is, koopt 'Automatische aankoop' TOT dat bedrag QORT voor U, tegen TOT de prijs die U instelt (beginnend bij de laagste bestelling en hogerop in het verkoop-orderboek).",
|
||||
"inf10": "Om via 'Automatiche aankoop' een bestelling te plaatsen, klikt U op de knop 'auto-aankoop toevoegen' en vult U het vakje in dat verschijnt. Voer het BEDRAG VAN QORT in dat U wilt KOPEN of het aantal LTC dat U wilt gebruiken, en de PRIJS waartoe U bereid bent te KOPEN. Zodra de bestelling actief is, koopt 'Automatische aankoop' TOT dat bedrag QORT voor U, tegen TOT de prijs die U instelt (beginnend bij de laagste bestelling en hogerop in het verkoop-orderboek).",
|
||||
"inf11": "Laat vervolgens de UI gewoon open staan, en de 'auto aankoop' functie doet de rest, volledig automatisch!",
|
||||
"inf12": "Je KAN ondertussen ook gewoon andere Qortal UI plugins gebruiken (Q-Chat, Portefeuille, etc), maar je mag DE UI NIET SLUITEN, als je wil dat 'Auto aankoop' functie blijft werken. De UI 'minimized' zetten (op de 'taskbar' of 'panel') mag wel. Zolang UI actief is, blijft de 'Auto aankoop' functie werken.",
|
||||
"inf13": "Automatisch aankopen",
|
||||
@ -1297,5 +1320,104 @@
|
||||
"tour20": "blokken achterstand. Wenst U te herladen ('bootstrap') om het synchronisatie-proces te versnellen?",
|
||||
"tour21": "blokken te gaan.",
|
||||
"tour22": "Herladen ('bootstrap') werd aangevraagd. Gelive te wachten."
|
||||
},
|
||||
"chatsettings": {
|
||||
"cs1": "Chatinstellingen",
|
||||
"cs2": "Algemene chatinstellingen",
|
||||
"cs3": "Tijdstip van chatbericht",
|
||||
"cs4": "Tijd geleden",
|
||||
"cs5": "Lokale tijd",
|
||||
"cs6": "Lettergrootte chatbericht",
|
||||
"cs7": "Standaard",
|
||||
"cs8": "px"
|
||||
},
|
||||
"modals": {
|
||||
"mpchange1": "Alle aangevraagde AT's moeten van dezelfde buitenlandse Blockchain zijn.",
|
||||
"mpchange2": "Geeft u deze applicatie toestemming om een kooporder uit te voeren?",
|
||||
"mpchange3": "Kooporder succesvol aangemaakt",
|
||||
"mpchange4": "Wacht tot kooporder is uitgevoerd",
|
||||
"mpchange5": "Kooporder mislukt.",
|
||||
"mpchange6": "Geeft u deze applicatie toestemming om een verkooporder uit te voeren?",
|
||||
"mpchange7": "Voor:",
|
||||
"mpchange8": "Verkooporder succesvol aangemaakt.",
|
||||
"mpchange9": "Wacht tot verkooporder is vermeld.",
|
||||
"mpchange10": "Verkooporder mislukt.",
|
||||
"mpchange11": "AT-info niet gevonden.",
|
||||
"mpchange12": "Geeft u deze applicatie toestemming om een verkooporder te annuleren?",
|
||||
"mpchange13": "Verkooporder succesvol geannuleerd.",
|
||||
"mpchange14": "Wacht tot de annulering van de transactie is voltooid.",
|
||||
"mpchange15": "Verkooporder kan niet worden geannuleerd.",
|
||||
"mpchange16": "Fout bij het ophalen van de lijst.",
|
||||
"mpchange17": "Fout bij het toevoegen aan de lijst.",
|
||||
"mpchange18": "Fout bij het verwijderen van de lijst.",
|
||||
"mpchange19": "Fout bij het ophalen van de vriendenlijst.",
|
||||
"mpchange20": "Aantal is geen getal.",
|
||||
"mpchange21": "Aantal ontbreekt.",
|
||||
"mpchange22": "Er zijn geen gegevens of bestanden verzonden.",
|
||||
"mpchange23": "Voor het versleutelen van gegevens zijn openbare sleutels nodig.",
|
||||
"mpchange24": "Alleen versleutelde gegevens kunnen naar privéservices gaan.",
|
||||
"mpchange25": "Upload mislukt vanwege mislukte versleuteling.",
|
||||
"mpchange26": "Upload mislukt.",
|
||||
"mpchange27": "Ongeldige gegevens.",
|
||||
"mpchange28": "Geen bronnen om te publiceren.",
|
||||
"mpchange29": "Onbekende fout.",
|
||||
"mpchange30": "Poll niet gevonden.",
|
||||
"mpchange31": "Kan niet stemmen op de poll.",
|
||||
"mpchange32": "Kan poll niet maken.",
|
||||
"mpchange33": "Voer een qortal-link in - qortal://...",
|
||||
"mpchange34": "Ongeldige qortal-link.",
|
||||
"mpchange35": "Fout bij pushen van melding.",
|
||||
"mpchange36": "Kan bericht niet verzenden.",
|
||||
"mpchange37": "Kan geen gecodeerd bericht verzenden naar deze gebruiker omdat deze geen openbare sleutel op de keten heeft.",
|
||||
"mpchange38": "Aanvraag kon niet worden uitgevoerd.",
|
||||
"mpchange39": "Groep niet gevonden.",
|
||||
"mpchange40": "Geeft u deze toepassing toestemming om een verzoek tot deelname aan een groep uit te voeren?",
|
||||
"mpchange41": "Groepsnaam:",
|
||||
"mpchange42": "Groeps-ID:",
|
||||
"mpchange43": "Aanvraag voor deelname aan groep succesvol aangemaakt.",
|
||||
"mpchange44": "Aanmelding voor groep mislukt.",
|
||||
"mpchange45": "Een mime-type kon niet worden afgeleid.",
|
||||
"mpchange46": "Een bestandsextensie kon niet worden afgeleid.",
|
||||
"mpchange47": "Gebruiker heeft de download geweigerd.",
|
||||
"mpchange48": "Downloaden mislukt.",
|
||||
"mpchange49": "AT implementeren mislukt.",
|
||||
"mpchange50": "Gebruiker heeft geen profiel.",
|
||||
"mpchange51": "Gevraagde gegevens kunnen niet worden gevonden.",
|
||||
"mpchange52": "Profielgegevens ophalen mislukt.",
|
||||
"mpchange53": "Eigenschap instellen mislukt.",
|
||||
"mpchange54": "Profiel openen mislukt.",
|
||||
"mpchange55": "Fout bij het ophalen van serverinfo.",
|
||||
"mpchange56": "Fout in tx-activiteitssamenvatting.",
|
||||
"mpchange57": "Fout bij ophalen buitenlandse vergoeding.",
|
||||
"mpchange58": "Fout bij bijwerken buitenlandse vergoeding.",
|
||||
"mpchange59": "Fout bij ophalen serververbindingsgeschiedenis.",
|
||||
"mpchange60": "Fout bij instellen huidige server.",
|
||||
"mpchange61": "Fout bij toevoegen server.",
|
||||
"mpchange62": "Fout bij verwijderen server.",
|
||||
"mpchange63": "Fout bij ophalen samenvatting.",
|
||||
"mpchange64": "Decoderen transactie mislukt.",
|
||||
"mpchange65": "Geeft u deze toepassing toestemming om een transactie te ondertekenen en te verwerken?",
|
||||
"mpchange66": "Geeft u deze toepassing toestemming om een transactie te ondertekenen?",
|
||||
"mpchange67": "Lees de transactie zorgvuldig door voordat u deze accepteert.",
|
||||
"mpchange68": "Tx type:",
|
||||
"mpchange69": "TX Data:",
|
||||
"mpchange70": "Transactie verwerken is niet aangevraagd.",
|
||||
"mpchange71": "Getekende bytes zijn:",
|
||||
"mpchange72": "Transactie ondertekend en verwerkt.",
|
||||
"mpchange73": "Transactie kon niet worden verwerkt.",
|
||||
"mpchange74": "QORT-saldo ophalen mislukt. Probeer het opnieuw!",
|
||||
"mpchange75": "Kon geen munt verzenden.",
|
||||
"mpchange76": "BTC-saldo ophalen mislukt. Probeer het opnieuw!",
|
||||
"mpchange77": "LTC-saldo ophalen mislukt. Probeer het opnieuw!",
|
||||
"mpchange78": "DOGE-saldo ophalen mislukt. Probeer het opnieuw!",
|
||||
"mpchange79": "DGB-saldo ophalen mislukt. Probeer het opnieuw!",
|
||||
"mpchange80": "RVN-saldo ophalen mislukt. Probeer het opnieuw!",
|
||||
"mpchange81": "Kan ARRR-saldo niet ophalen. Probeer het opnieuw!",
|
||||
"mpchange82": "ONTBREKENDE VELDEN",
|
||||
"mpchange83": "GEWEIGERD",
|
||||
"mpchange84": "MISLUKT",
|
||||
"mpchange85": "SUCCES",
|
||||
"mpchange86": "Altijd toestaan om automatisch saldo in portemonnee op te halen",
|
||||
"mpchange87": "Voer de groeps-ID in"
|
||||
}
|
||||
}
|
||||
|
@ -248,7 +248,9 @@
|
||||
"balance": "Saldo",
|
||||
"balances": "DIN WALLET-SALDO",
|
||||
"update": "OPPDATERT WALLET-SALDOER",
|
||||
"view": "Utsikt"
|
||||
"view": "Utsikt",
|
||||
"all": "Alle",
|
||||
"page": "Side"
|
||||
},
|
||||
"gifs": {
|
||||
"gchange1": "Gif Explorer",
|
||||
@ -466,7 +468,7 @@
|
||||
"rchange6": "Mottaker",
|
||||
"rchange7": "Handling",
|
||||
"rchange8": "Type",
|
||||
"rchange9": "Nivå 1 - 4 kan opprette en selvdel og nivå 5 eller høyere kan opprette en belønningsdel!",
|
||||
"rchange9": "Nivå 0 - 4 kan opprette en selvdel og nivå 5 eller høyere kan opprette en belønningsdel!",
|
||||
"rchange10": "Mottaker offentlig nøkkel",
|
||||
"rchange11": "Belønningsdel prosent",
|
||||
"rchange12": "Gjøre noe nydelig",
|
||||
@ -740,7 +742,8 @@
|
||||
"bchange51": "For å sende inn endringene, ikke glem å klikke på 'Oppdater profil'",
|
||||
"bchange52": "Gir du dette programmet tillatelse til å få lommebokinformasjon?",
|
||||
"bchange53": "La alltid vennelisten din hentes automatisk av alle apper",
|
||||
"bchange54": "Gir du dette programmet tillatelse til å få tilgang til vennelisten din?"
|
||||
"bchange54": "Gir du dette programmet tillatelse til å få tilgang til vennelisten din?",
|
||||
"bchange55": "Gir du denne applikasjonen tillatelse til å sende denne kommandoen?"
|
||||
},
|
||||
"datapage": {
|
||||
"dchange1": "Data-administrasjon",
|
||||
@ -840,7 +843,7 @@
|
||||
"cchange74": "reagerte med",
|
||||
"cchange75": "Laster opp vedlegg. Dette kan ta opptil ett minutt.",
|
||||
"cchange76": "Sletter vedlegg. Dette kan ta opptil ett minutt.",
|
||||
"cchange77": "Vedleggsstørrelsen overstiger 1 MB",
|
||||
"cchange77": "Vedleggsstørrelsen overstiger 10 MB",
|
||||
"cchange78": "Er du sikker på at du vil slette dette bildet?",
|
||||
"cchange79": "Er du sikker på at du vil slette dette vedlegget?",
|
||||
"cchange80": "Dette bildet har blitt slettet",
|
||||
@ -853,7 +856,24 @@
|
||||
"cchange94": "lastet",
|
||||
"cchange95": "Kun mine ressurser",
|
||||
"cchange96": "Åpne gruppeadministrasjon",
|
||||
"cchange97": "Bli med i gruppekoblingen kopiert til utklippstavlen"
|
||||
"cchange97": "Bli med i gruppekoblingen kopiert til utklippstavlen",
|
||||
"cchange98": "Laster opp fil. Dette kan ta noen minutter.",
|
||||
"cchange99": "Sletter fil. Dette kan ta opptil ett minutt.",
|
||||
"cchange100": "Filstørrelse overstiger 125 MB",
|
||||
"cchange101": "Er du sikker på at du vil slette denne filen?",
|
||||
"cchange102": "Denne filen har blitt slettet",
|
||||
"cchange103": "Laster opp gif. Dette kan ta opptil ett minutt.",
|
||||
"cchange104": "Sletter gif. Dette kan ta opptil ett minutt.",
|
||||
"cchange105": "Filstørrelsen overstiger 3 MB",
|
||||
"cchange106": "Er du sikker på at du vil slette denne gif-filen?",
|
||||
"cchange107": "Denne gif-filen har blitt slettet",
|
||||
"cchange108": "Nedlastingen fortsetter i bakgrunnen, kun EN Q-Chat-fil kan lastes ned samtidig.",
|
||||
"cchange109": "Filtype støttes ikke!",
|
||||
"cchange110": "OPPLAST BILDE",
|
||||
"cchange111": "LAST OPP GIF",
|
||||
"cchange112": "LAST OPP VEDLEGG",
|
||||
"cchange113": "LAST OPP FIL",
|
||||
"cchange114": "Skriv noe ..."
|
||||
},
|
||||
"welcomepage": {
|
||||
"wcchange1": "Velkommen til Q-Chat",
|
||||
@ -954,7 +974,10 @@
|
||||
"gchange65": "Erstatt denne adressen til OVERFØR EIERSKAP av gruppen!",
|
||||
"gchange66": "Ugyldig eier / ny eieradresse",
|
||||
"gchange67": "Gruppeoppdatering vellykket!",
|
||||
"gchange68": "Angi gruppeavatar"
|
||||
"gchange68": "Angi gruppeavatar",
|
||||
"gchange69": "Meldinger",
|
||||
"gchange70": "Ingen meldinger de siste 24 timene!",
|
||||
"gchange71": "Du har allerede blitt med i denne gruppen!"
|
||||
},
|
||||
"puzzlepage": {
|
||||
"pchange1": "Puzzles",
|
||||
@ -1297,5 +1320,104 @@
|
||||
"tour20": "blokker bak. Vil du oppdatere (bootstrap) for å fremskynde synkroniseringsprosessen?",
|
||||
"tour21": "blokker igjen.",
|
||||
"tour22": "Oppdater (bootstrap) forespurt. Vennligst vent."
|
||||
},
|
||||
"chatsettings": {
|
||||
"cs1": "Chatinnstillinger",
|
||||
"cs2": "Generelle chatinnstillinger",
|
||||
"cs3": "Tidsstempel for chatmelding",
|
||||
"cs4": "For tid siden",
|
||||
"cs5": "Lokal tid",
|
||||
"cs6": "Skriftstørrelse for chatmelding",
|
||||
"cs7": "Standard",
|
||||
"cs8": "px"
|
||||
},
|
||||
"modals": {
|
||||
"mpchange1": "Alle forespurte AT-er må være av samme utenlandske blokkjede.",
|
||||
"mpchange2": "Gir du dette programmet tillatelse til å utføre en kjøpsordre?",
|
||||
"mpchange3": "Kjøpsordre ble opprettet",
|
||||
"mpchange4": "Vennligst vent til kjøpsordre blir oppfylt",
|
||||
"mpchange5": "Kunne ikke sende inn kjøpsordre.",
|
||||
"mpchange6": "Gir du denne applikasjonen tillatelse til å utføre en salgsordre?",
|
||||
"mpchange7": "For:",
|
||||
"mpchange8": "Vellykket opprettet salgsordre.",
|
||||
"mpchange9": "Vennligst vent til salgsordren er oppført.",
|
||||
"mpchange10": "Kunne ikke sende inn salgsordre.",
|
||||
"mpchange11": "Kan ikke finne AT-informasjon.",
|
||||
"mpchange12": "Gir du dette programmet tillatelse til å kansellere en salgsordre?",
|
||||
"mpchange13": "Vellykket kansellert salgsordre.",
|
||||
"mpchange14": "Vennligst vent til kanselleringen av handelen er oppfylt.",
|
||||
"mpchange15": "Kunne ikke kansellere salgsordren.",
|
||||
"mpchange16": "Feil under henting av liste.",
|
||||
"mpchange17": "Feil ved å legge til listen.",
|
||||
"mpchange18": "Feil i slettelisten.",
|
||||
"mpchange19": "Feil under henting av venneliste.",
|
||||
"mpchange20": "Tall er ikke et tall.",
|
||||
"mpchange21": "Mangler antall.",
|
||||
"mpchange22": "Ingen data eller fil ble sendt inn.",
|
||||
"mpchange23": "Kryptering av data krever offentlige nøkler.",
|
||||
"mpchange24": "Bare krypterte data kan gå inn i private tjenester.",
|
||||
"mpchange25": "Opplastning mislyktes på grunn av mislykket kryptering.",
|
||||
"mpchange26": "Opplastning mislyktes.",
|
||||
"mpchange27": "Ugyldige data.",
|
||||
"mpchange28": "Ingen ressurser å publisere.",
|
||||
"mpchange29": "Ukjent feil.",
|
||||
"mpchange30": "Undersøkelsen ble ikke funnet.",
|
||||
"mpchange31": "Kunne ikke stemme på avstemningen.",
|
||||
"mpchange32": "Kunne ikke opprette avstemningen.",
|
||||
"mpchange33": "Vennligst skriv inn en qortal-lenke - qortal://...",
|
||||
"mpchange34": "Ugyldig qortal link.",
|
||||
"mpchange35": "Feil under trykking av varsling.",
|
||||
"mpchange36": "Kunne ikke sende melding.",
|
||||
"mpchange37": "Kan ikke sende en kryptert melding til denne brukeren siden de ikke har sin offentlige nøkkel på kjede.",
|
||||
"mpchange38": "Forespørselen kunne ikke oppfylles.",
|
||||
"mpchange39": "Gruppe ikke funnet.",
|
||||
"mpchange40": "Gir du denne applikasjonen tillatelse til å utføre en forespørsel om å bli med i en gruppe?",
|
||||
"mpchange41": "Gruppenavn:",
|
||||
"mpchange42": "Gruppe ID:",
|
||||
"mpchange43": "Bli med gruppeforespørsel ble opprettet.",
|
||||
"mpchange44": "Kunne ikke bli med i gruppen.",
|
||||
"mpchange45": "En mime-type kunne ikke utledes.",
|
||||
"mpchange46": "En filtype kunne ikke utledes.",
|
||||
"mpchange47": "Bruker avviste nedlastingen.",
|
||||
"mpchange48": "Kunne ikke starte nedlastingen.",
|
||||
"mpchange49": "Kunne ikke distribuere AT.",
|
||||
"mpchange50": "Bruker har ikke en profil.",
|
||||
"mpchange51": "Kan ikke finne forespurte data.",
|
||||
"mpchange52": "Kunne ikke hente profildata.",
|
||||
"mpchange53": "Kunne ikke angi egenskap.",
|
||||
"mpchange54": "Kunne ikke åpne profilen.",
|
||||
"mpchange55": "Feil under henting av serverinfo.",
|
||||
"mpchange56": "Feil i TX-aktivitetssammendraget.",
|
||||
"mpchange57": "Feil i hente utenlandsgebyr.",
|
||||
"mpchange58": "Feil ved oppdatering av utenlandsk gebyr.",
|
||||
"mpchange59": "Feil i hente logg for servertilkobling.",
|
||||
"mpchange60": "Feil i innstilt gjeldende server.",
|
||||
"mpchange61": "Feil i legg til server.",
|
||||
"mpchange62": "Feil ved fjerning av server.",
|
||||
"mpchange63": "Feil under henting av sammendrag.",
|
||||
"mpchange64": "Kunne ikke dekode transaksjonen.",
|
||||
"mpchange65": "Gir du denne applikasjonen tillatelse til å signere og behandle en transaksjon?",
|
||||
"mpchange66": "Gir du denne applikasjonen tillatelse til å signere en transaksjon?",
|
||||
"mpchange67": "Les transaksjonen nøye før du godtar.",
|
||||
"mpchange68": "Tx-type:",
|
||||
"mpchange69": "TX-data:",
|
||||
"mpchange70": "Prosesstransaksjonen ble ikke forespurt.",
|
||||
"mpchange71": "Signerte byte er: ",
|
||||
"mpchange72": "Transaksjonen er signert og behandlet vellykket.",
|
||||
"mpchange73": "Transaksjonen kunne ikke behandles.",
|
||||
"mpchange74": "Kunne ikke hente QORT-saldo. Prøv igjen!",
|
||||
"mpchange75": "Kunne ikke sende mynt.",
|
||||
"mpchange76": "Kunne ikke hente BTC-saldoen. Prøv igjen!",
|
||||
"mpchange77": "Kunne ikke hente LTC-saldoen. Prøv igjen!",
|
||||
"mpchange78": "Kunne ikke hente DOGE-saldo. Prøv igjen!",
|
||||
"mpchange79": "Kunne ikke hente DGB-saldoen. Prøv igjen!",
|
||||
"mpchange80": "Kunne ikke hente RVN-saldo. Prøv igjen!",
|
||||
"mpchange81": "Kunne ikke hente ARRR-saldo. Prøv igjen!",
|
||||
"mpchange82": "MANGLER FELT",
|
||||
"mpchange83": "AVSLAGT",
|
||||
"mpchange84": "FEIL",
|
||||
"mpchange85": "SUKSESS",
|
||||
"mpchange86": "Tillat alltid få lommeboksaldo automatisk",
|
||||
"mpchange87": "Vennligst skriv inn gruppe-ID"
|
||||
}
|
||||
}
|
||||
|
@ -248,7 +248,9 @@
|
||||
"balance": "Saldo",
|
||||
"balances": "SALDO TWOJEGO PORTFELA",
|
||||
"update": "AKTUALIZUJ SALDA W PORTFELU",
|
||||
"view": "Pogląd"
|
||||
"view": "Pogląd",
|
||||
"all": "Wszystko",
|
||||
"page": "Strona"
|
||||
},
|
||||
"gifs": {
|
||||
"gchange1": "Eksplorator gifów",
|
||||
@ -466,7 +468,7 @@
|
||||
"rchange6": "Odbiorca",
|
||||
"rchange7": "Akcja",
|
||||
"rchange8": "Typ",
|
||||
"rchange9": "Poziomy 1 - 4 mogą tworzyć Self Share, a poziom 5 lub wyższy może tworzyć Reward Share!",
|
||||
"rchange9": "Poziomy 0 - 4 mogą tworzyć Self Share, a poziom 5 lub wyższy może tworzyć Reward Share!",
|
||||
"rchange10": "Publiczny klucz odbiorcy",
|
||||
"rchange11": "Procent udziału w nagrodzie",
|
||||
"rchange12": "Robimy coś pysznego",
|
||||
@ -740,7 +742,8 @@
|
||||
"bchange51": "Aby przesłać zmiany, nie zapomnij kliknąć 'Aktualizuj profil'",
|
||||
"bchange52": "Czy dajesz tej aplikacji pozwolenie na uzyskanie informacji o Twoim portfelu?",
|
||||
"bchange53": "Zawsze zezwalaj na automatyczne pobieranie listy znajomych przez wszystkie aplikacje",
|
||||
"bchange54": "Czy dajesz tej aplikacji uprawnienia dostępu do listy znajomych?"
|
||||
"bchange54": "Czy dajesz tej aplikacji uprawnienia dostępu do listy znajomych?",
|
||||
"bchange55": "Czy dajesz tej aplikacji pozwolenie na wysłanie tego polecenia?"
|
||||
},
|
||||
"datapage": {
|
||||
"dchange1": "Zarządzanie danymi",
|
||||
@ -840,7 +843,7 @@
|
||||
"cchange74": "zareagował z",
|
||||
"cchange75": "Przesyłanie załącznika. Może to potrwać do jednej minuty.",
|
||||
"cchange76": "Usuwanie załącznika. Może to potrwać do jednej minuty.",
|
||||
"cchange77": "Rozmiar załącznika przekracza 1 MB",
|
||||
"cchange77": "Rozmiar załącznika przekracza 10 MB",
|
||||
"cchange78": "Czy na pewno chcesz usunąć ten obraz?",
|
||||
"cchange79": "Czy na pewno chcesz usunąć ten załącznik?",
|
||||
"cchange80": "Ten obraz został usunięty",
|
||||
@ -853,7 +856,24 @@
|
||||
"cchange94": "załadowano",
|
||||
"cchange95": "Tylko moje zasoby",
|
||||
"cchange96": "Otwarte zarządzanie grupą",
|
||||
"cchange97": "Link do dołączenia do grupy skopiowany do schowka"
|
||||
"cchange97": "Link do dołączenia do grupy skopiowany do schowka",
|
||||
"cchange98": "Ładowanie pliku. To może zająć kilka minut.",
|
||||
"cchange99": "Usuwanie pliku. To może zająć do jednej minuty.",
|
||||
"cchange100": "Rozmiar pliku przekracza 125 MB",
|
||||
"cchange101": "Czy na pewno chcesz usunąć ten plik?",
|
||||
"cchange102": "Ten plik został usunięty",
|
||||
"cchange103": "Ładowanie gifa. Może to zająć do jednej minuty.",
|
||||
"cchange104": "Usuwanie GIF. Może to zająć do jednej minuty.",
|
||||
"cchange105": "Rozmiar pliku przekracza 3 MB",
|
||||
"cchange106": "Czy na pewno chcesz usunąć ten gif?",
|
||||
"cchange107": "Ten gif został usunięty",
|
||||
"cchange108": "Pobieranie będzie kontynuowane w tle, jednocześnie można pobrać tylko JEDEN plik Q-Chat.",
|
||||
"cchange109": "Typ pliku nie jest obsługiwany!",
|
||||
"cchange110": "PRZESYŁANIE OBRAZU",
|
||||
"cchange111": "PRZEŚLIJ GIF",
|
||||
"cchange112": "PRZESYŁANIE ZAŁĄCZNIKÓW",
|
||||
"cchange113": "PRZESYŁANIE PLIKU",
|
||||
"cchange114": "Napisz coś ..."
|
||||
},
|
||||
"welcomepage": {
|
||||
"wcchange1": "Witamy w Q-Chat",
|
||||
@ -954,7 +974,10 @@
|
||||
"gchange65": "Zamień ten adres na PRZENIESIENIE WŁASNOŚCI grupy!",
|
||||
"gchange66": "Nieprawidłowy właściciel / nowy adres właściciela",
|
||||
"gchange67": "AKTUALIZACJA grupy powiodła się!",
|
||||
"gchange68": "Ustaw awatar grupy"
|
||||
"gchange68": "Ustaw awatar grupy",
|
||||
"gchange69": "Wiadomości",
|
||||
"gchange70": "Brak wiadomości w ciągu ostatnich 24 godzin!",
|
||||
"gchange71": "Już dołączyłeś do tej grupy!"
|
||||
},
|
||||
"puzzlepage": {
|
||||
"pchange1": "Zagadki",
|
||||
@ -1297,5 +1320,104 @@
|
||||
"tour20": "bloki za sobą. Czy chcesz odświeżyć (bootstrap), aby przyspieszyć proces synchronizacji?",
|
||||
"tour21": "pozostałe bloki.",
|
||||
"tour22": "Zażądano odświeżenia (bootstrap). Proszę czekać."
|
||||
},
|
||||
"chatsettings": {
|
||||
"cs1": "Ustawienia czatu",
|
||||
"cs2": "Ogólne ustawienia czatu",
|
||||
"cs3": "Sygnatura czasowa wiadomości czatu",
|
||||
"cs4": "Czas temu",
|
||||
"cs5": "Czas lokalny",
|
||||
"cs6": "Rozmiar czcionki wiadomości czatu",
|
||||
"cs7": "Standardowy",
|
||||
"cs8": "px"
|
||||
},
|
||||
"modals": {
|
||||
"mpchange1": "Wszystkie żądane AT muszą być tego samego obcego Blockchain.",
|
||||
"mpchange2": "Czy udzielasz tej aplikacji pozwolenia na wykonanie zlecenia kupna?",
|
||||
"mpchange3": "Pomyślnie utworzono zlecenie kupna",
|
||||
"mpchange4": "Proszę czekać, aż zlecenie kupna zostanie zrealizowane",
|
||||
"mpchange5": "Nie udało się przesłać zlecenia kupna.",
|
||||
"mpchange6": "Czy udzielasz tej aplikacji pozwolenia na wykonanie zlecenia sprzedaży?",
|
||||
"mpchange7": "Dla:",
|
||||
"mpchange8": "Pomyślnie utworzono zlecenie sprzedaży.",
|
||||
"mpchange9": "Proszę czekać, aż zlecenie sprzedaży zostanie wystawione na sprzedaż.",
|
||||
"mpchange10": "Nie udało się przesłać zlecenia sprzedaży.",
|
||||
"mpchange11": "Nie można znaleźć informacji o AT.",
|
||||
"mpchange12": "Czy udzielasz tej aplikacji pozwolenia na wykonanie anulowania zlecenia sprzedaży?",
|
||||
"mpchange13": "Pomyślnie anulowano zlecenie sprzedaży.",
|
||||
"mpchange14": "Proszę czekać, aż anulowanie transakcji zostanie zrealizowane.",
|
||||
"mpchange15": "Nie udało się anulować zlecenia sprzedaży.",
|
||||
"mpchange16": "Błąd podczas pobierania listy.",
|
||||
"mpchange17": "Błąd podczas dodawania do listy.",
|
||||
"mpchange18": "Błąd podczas usuwania listy.",
|
||||
"mpchange19": "Błąd podczas pobierania listy znajomych.",
|
||||
"mpchange20": "Liczba nie jest liczbą.",
|
||||
"mpchange21": "Brak liczby.",
|
||||
"mpchange22": "Nie przesłano żadnych danych ani pliku.",
|
||||
"mpchange23": "Szyfrowanie danych wymaga kluczy publicznych.",
|
||||
"mpchange24": "Do usług prywatnych można przesyłać tylko zaszyfrowane dane.",
|
||||
"mpchange25": "Przesyłanie nie powiodło się z powodu nieudanego szyfrowania.",
|
||||
"mpchange26": "Przesyłanie nie powiodło się.",
|
||||
"mpchange27": "Nieprawidłowe dane.",
|
||||
"mpchange28": "Brak zasobów do opublikowania.",
|
||||
"mpchange29": "Nieznany błąd.",
|
||||
"mpchange30": "Nie znaleziono ankiety.",
|
||||
"mpchange31": "Nie udało się zagłosować w ankiecie.",
|
||||
"mpchange32": "Nie udało się utworzyć ankiety.",
|
||||
"mpchange33": "Wprowadź link qortal - qortal://...",
|
||||
"mpchange34": "Nieprawidłowy link qortal.",
|
||||
"mpchange35": "Błąd w wysyłaniu powiadomienia.",
|
||||
"mpchange36": "Nie można wysłać wiadomości.",
|
||||
"mpchange37": "Nie można wysłać zaszyfrowanej wiadomości do tego użytkownika, ponieważ nie ma on klucza publicznego w łańcuchu.",
|
||||
"mpchange38": "Żądanie nie mogło zostać zrealizowane.",
|
||||
"mpchange39": "Nie znaleziono grupy.",
|
||||
"mpchange40": "Czy udzielasz tej aplikacji uprawnień do wykonać żądanie dołączenia do grupy?",
|
||||
"mpchange41": "Nazwa grupy:",
|
||||
"mpchange42": "Identyfikator grupy:",
|
||||
"mpchange43": "Pomyślnie utworzono żądanie dołączenia do grupy.",
|
||||
"mpchange44": "Nie udało się dołączyć do grupy.",
|
||||
"mpchange45": "Nie można było wyprowadzić typu MIME.",
|
||||
"mpchange46": "Nie można było wyprowadzić rozszerzenia pliku.",
|
||||
"mpchange47": "Użytkownik odrzucił pobieranie.",
|
||||
"mpchange48": "Nie udało się zainicjować pobierania.",
|
||||
"mpchange49": "Nie udało się wdrożyć AT.",
|
||||
"mpchange50": "Użytkownik nie ma profilu.",
|
||||
"mpchange51": "Nie można znaleźć żądanych danych.",
|
||||
"mpchange52": "Nie udało się pobrać danych profilu.",
|
||||
"mpchange53": "Nie udało się ustawić właściwości.",
|
||||
"mpchange54": "Nie udało się otworzyć profilu.",
|
||||
"mpchange55": "Błąd podczas pobierania informacji o serwerze.",
|
||||
"mpchange56": "Błąd w podsumowaniu aktywności transakcji.",
|
||||
"mpchange57": "Błąd podczas pobierania opłaty zagranicznej.",
|
||||
"mpchange58": "Błąd podczas aktualizacji opłaty zagranicznej.",
|
||||
"mpchange59": "Błąd podczas pobierania historii połączeń z serwerem.",
|
||||
"mpchange60": "Błąd podczas ustawiania bieżącego serwera.",
|
||||
"mpchange61": "Błąd podczas dodawania serwera.",
|
||||
"mpchange62": "Błąd podczas usuwania serwera.",
|
||||
"mpchange63": "Błąd podczas pobierania podsumowania.",
|
||||
"mpchange64": "Nie udało się zdekodować transakcji.",
|
||||
"mpchange65": "Czy udzielasz tej aplikacji uprawnień do podpisywania i przetwarzania transakcji?",
|
||||
"mpchange66": "Czy udzielasz tej aplikacji uprawnień do podpisywania transakcji?",
|
||||
"mpchange67": "Przeczytaj uważnie transakcję przed accepting.",
|
||||
"mpchange68": "Typ Tx:",
|
||||
"mpchange69": "Dane TX:",
|
||||
"mpchange70": "Nie zażądano przetwarzania transakcji.",
|
||||
"mpchange71": "Podpisane bajty to:",
|
||||
"mpchange72": "Transakcja została podpisana i przetworzona pomyślnie.",
|
||||
"mpchange73": "Transakcji nie można było przetworzyć.",
|
||||
"mpchange74": "Nie udało się pobrać salda QORT. Spróbuj ponownie!",
|
||||
"mpchange75": "Nie można wysłać monety.",
|
||||
"mpchange76": "Nie udało się pobrać salda BTC. Spróbuj ponownie!",
|
||||
"mpchange77": "Nie udało się pobrać salda LTC. Spróbuj ponownie!",
|
||||
"mpchange78": "Nie udało się pobrać salda DOGE. Spróbuj ponownie!",
|
||||
"mpchange79": "Nie udało się pobrać salda DGB. Spróbuj ponownie!",
|
||||
"mpchange80": "Nie udało się pobrać salda RVN. Spróbuj ponownie!",
|
||||
"mpchange81": "Nie udało się pobrać salda ARRR. Spróbuj ponownie!",
|
||||
"mpchange82": "Brakujące pola",
|
||||
"mpchange83": "ODRZUCONE",
|
||||
"mpchange84": "NIEPOWODZENIE",
|
||||
"mpchange85": "POWODZENIE",
|
||||
"mpchange86": "Zawsze zezwalaj na automatyczne pobieranie salda portfela",
|
||||
"mpchange87": "Wprowadź identyfikator grupy"
|
||||
}
|
||||
}
|
||||
|
@ -248,7 +248,9 @@
|
||||
"balance": "Saldo",
|
||||
"balances": "SEUS SALDOS DE CARTEIRA",
|
||||
"update": "ATUALIZAR SALDOS DA CARTEIRA",
|
||||
"view": "Ver"
|
||||
"view": "Ver",
|
||||
"all": "Todos",
|
||||
"page": "Página"
|
||||
},
|
||||
"gifs": {
|
||||
"gchange1": "Gif Explorer",
|
||||
@ -466,7 +468,7 @@
|
||||
"rchange6": "Recipiente",
|
||||
"rchange7": "Ação",
|
||||
"rchange8": "Tipo",
|
||||
"rchange9": "Nível 1 - 4 podem criar Auto Ações e nível 5 ou superior podem criar Ações de Recompensa!",
|
||||
"rchange9": "Nível 0 - 4 podem criar Auto Ações e nível 5 ou superior podem criar Ações de Recompensa!",
|
||||
"rchange10": "Chave Pública do Destinatário",
|
||||
"rchange11": "Porcentagem das ações de recompensa",
|
||||
"rchange12": "Fazendo algo delicioso",
|
||||
@ -740,7 +742,8 @@
|
||||
"bchange51": "Para enviar as alterações não esqueça de clicar em 'Atualizar perfil'",
|
||||
"bchange52": "Você dá permissão a este aplicativo para obter informações da sua carteira?",
|
||||
"bchange53": "Sempre permita que sua lista de amigos seja recuperada automaticamente por todos os aplicativos",
|
||||
"bchange54": "Você dá permissão a este aplicativo para acessar sua lista de amigos?"
|
||||
"bchange54": "Você dá permissão a este aplicativo para acessar sua lista de amigos?",
|
||||
"bchange55": "Você dá permissão a este aplicativo para enviar este comando?"
|
||||
},
|
||||
"datapage": {
|
||||
"dchange1": "Gerenciamento de Dados",
|
||||
@ -840,7 +843,7 @@
|
||||
"cchange74": "reagiu com",
|
||||
"cchange75": "Carregando anexo. Isso pode levar até um minuto.",
|
||||
"cchange76": "Excluindo anexo. Isso pode levar até um minuto.",
|
||||
"cchange77": "O tamanho do anexo excede 1 MB",
|
||||
"cchange77": "O tamanho do anexo excede 10 MB",
|
||||
"cchange78": "Tem certeza que deseja excluir esta imagem?",
|
||||
"cchange79": "Tem certeza que deseja excluir este anexo?",
|
||||
"cchange80": "Esta imagem foi apagada",
|
||||
@ -853,7 +856,24 @@
|
||||
"cchange94": "carregado",
|
||||
"cchange95": "Somente meus recursos",
|
||||
"cchange96": "Gerenciamento de grupo aberto",
|
||||
"cchange97": "Link para entrar no grupo copiado para a área de transferência"
|
||||
"cchange97": "Link para entrar no grupo copiado para a área de transferência",
|
||||
"cchange98": "Enviando arquivo. Isso pode levar alguns minutos.",
|
||||
"cchange99": "Excluindo arquivo. Isso pode levar até um minuto.",
|
||||
"cchange100": "Tamanho do arquivo excede 125 MB",
|
||||
"cchange101": "Tem certeza que deseja excluir este arquivo?",
|
||||
"cchange102": "Este arquivo foi excluído",
|
||||
"cchange103": "Enviando gif. Isso pode levar até um minuto.",
|
||||
"cchange104": "Excluindo gif. Isso pode levar até um minuto.",
|
||||
"cchange105": "Tamanho do arquivo excede 3 MB",
|
||||
"cchange106": "Tem certeza que deseja excluir este gif?",
|
||||
"cchange107": "Este gif foi excluído",
|
||||
"cchange108": "O download continuará em segundo plano, apenas UM arquivo Q-Chat pode ser baixado simultaneamente.",
|
||||
"cchange109": "Tipo de arquivo não suportado!",
|
||||
"cchange110": "CARREGAR IMAGEM",
|
||||
"cchange111": "CARREGAR GIF",
|
||||
"cchange112": "UPLOAD DE ANEXO",
|
||||
"cchange113": "CARREGAR ARQUIVO",
|
||||
"cchange114": "Escreva algo ..."
|
||||
},
|
||||
"welcomepage": {
|
||||
"wcchange1": "Bem-vindo ao Q-Chat",
|
||||
@ -954,7 +974,10 @@
|
||||
"gchange65": "Substitua este endereço para TRANSFERIR PROPRIEDADE do grupo!",
|
||||
"gchange66": "Endereço de proprietário / novo proprietário inválido",
|
||||
"gchange67": "ATUALIZAÇÃO DO Grupo bem-sucedida!",
|
||||
"gchange68": "Definir avatar do grupo"
|
||||
"gchange68": "Definir avatar do grupo",
|
||||
"gchange69": "Mensagens",
|
||||
"gchange70": "Nenhuma mensagem nas últimas 24 horas!",
|
||||
"gchange71": "Você já entrou neste grupo!"
|
||||
},
|
||||
"puzzlepage": {
|
||||
"pchange1": "Enigmas",
|
||||
@ -1297,5 +1320,104 @@
|
||||
"tour20": "blocos atrás. Gostaria de atualizar (inicializar) para acelerar o processo de sincronização?",
|
||||
"tour21": "blocos restantes.",
|
||||
"tour22": "Atualização (bootstrap) solicitada. Aguarde."
|
||||
},
|
||||
"chatsettings": {
|
||||
"cs1": "Configurações de bate-papo",
|
||||
"cs2": "Configurações gerais de bate-papo",
|
||||
"cs3": "Data e hora da mensagem de bate-papo",
|
||||
"cs4": "Tempo atrás",
|
||||
"cs5": "Hora Local",
|
||||
"cs6": "Tamanho da fonte da mensagem de bate-papo",
|
||||
"cs7": "Padrão",
|
||||
"cs8": "px"
|
||||
},
|
||||
"modals": {
|
||||
"mpchange1": "Todos os AT solicitados necessitam de ser do mesmo Blockchain estrangeiro.",
|
||||
"mpchange2": "Dá permissão a esta aplicação para realizar um pedido de compra?",
|
||||
"mpchange3": "Ordem de compra criada com sucesso",
|
||||
"mpchange4": "Por favor aguarde até que o pedido de compra seja atendido",
|
||||
"mpchange5": "Falha ao enviar ordem de compra.",
|
||||
"mpchange6": "Dá permissão a esta aplicação para realizar uma ordem de venda?",
|
||||
"mpchange7": "Para:",
|
||||
"mpchange8": "Ordem de venda criada com sucesso.",
|
||||
"mpchange9": "Por favor aguarde até que a ordem de venda seja listada.",
|
||||
"mpchange10": "Falha ao enviar pedido de venda.",
|
||||
"mpchange11": "Não foi possível encontrar informação de AT.",
|
||||
"mpchange12": "Dá permissão a esta aplicação para cancelar um pedido de venda?",
|
||||
"mpchange13": "Ordem de venda cancelada com sucesso.",
|
||||
"mpchange14": "Aguarde até que o cancelamento da negociação esteja concluído.",
|
||||
"mpchange15": "Falha ao cancelar encomenda de venda.",
|
||||
"mpchange16": "Erro ao recuperar lista.",
|
||||
"mpchange17": "Erro ao adicionar à lista.",
|
||||
"mpchange18": "Erro na lista de exclusão.",
|
||||
"mpchange19": "Erro ao recuperar lista de amigos.",
|
||||
"mpchange20": "A contagem não é um número.",
|
||||
"mpchange21": "Contagem em falta.",
|
||||
"mpchange22": "Não foram enviados dados ou ficheiros.",
|
||||
"mpchange23": "Criptografar dados requer chaves públicas.",
|
||||
"mpchange24": "Apenas os dados encriptados podem entrar em serviços privados.",
|
||||
"mpchange25": "Falha no upload devido a falha na encriptação.",
|
||||
"mpchange26": "Falha no upload.",
|
||||
"mpchange27": "Dados inválidos.",
|
||||
"mpchange28": "Nenhum recurso para publicar.",
|
||||
"mpchange29": "Erro desconhecido.",
|
||||
"mpchange30": "Sondagem não encontrada.",
|
||||
"mpchange31": "Falha ao votar na sondagem.",
|
||||
"mpchange32": "Falha ao criar sondagem.",
|
||||
"mpchange33": "Por favor insira um link qortal - qortal://...",
|
||||
"mpchange34": "Link qortal inválido.",
|
||||
"mpchange35": "Erro ao enviar notificação.",
|
||||
"mpchange36": "Não foi possível enviar a mensagem.",
|
||||
"mpchange37": "Não é possível enviar uma mensagem encriptada a este utilizador porque não tem a sua chave pública na cadeia.",
|
||||
"mpchange38": "O pedido não pôde ser atendido.",
|
||||
"mpchange39": "Grupo não encontrado.",
|
||||
"mpchange40": "Dá permissão a esta aplicação para realizar um pedido de adesão ao grupo?",
|
||||
"mpchange41": "Nome do grupo:",
|
||||
"mpchange42": "ID do grupo:",
|
||||
"mpchange43": "Pedido de adesão ao grupo criado com sucesso.",
|
||||
"mpchange44": "Falha ao entrar no grupo.",
|
||||
"mpchange45": "Um tipo mime não pôde ser derivado.",
|
||||
"mpchange46": "Não foi possível derivar uma extensão de ficheiro.",
|
||||
"mpchange47": "O utilizador recusou o download.",
|
||||
"mpchange48": "Falha ao iniciar o download.",
|
||||
"mpchange49": "Falha ao implantar AT.",
|
||||
"mpchange50": "Utilizador não tem perfil.",
|
||||
"mpchange51": "Não foi possível encontrar os dados solicitados.",
|
||||
"mpchange52": "Falha ao obter os dados do perfil.",
|
||||
"mpchange53": "Falha ao definir a propriedade.",
|
||||
"mpchange54": "Falha ao abrir perfil.",
|
||||
"mpchange55": "Erro ao recuperar informação do servidor.",
|
||||
"mpchange56": "Erro no resumo da atividade tx.",
|
||||
"mpchange57": "Erro ao obter taxa estrangeira.",
|
||||
"mpchange58": "Erro na atualização da taxa estrangeira.",
|
||||
"mpchange59": "Erro ao obter o histórico de ligação do servidor.",
|
||||
"mpchange60": "Erro ao configurar o servidor atual.",
|
||||
"mpchange61": "Erro ao adicionar servidor.",
|
||||
"mpchange62": "Erro ao remover servidor.",
|
||||
"mpchange63": "Erro ao recuperar o resumo.",
|
||||
"mpchange64": "Falha ao descodificar a transação.",
|
||||
"mpchange65": "Dá permissão a esta aplicação para assinar e processar uma transação?",
|
||||
"mpchange66": "Dá permissão a esta aplicação para assinar uma transação?",
|
||||
"mpchange67": "Leia a transação com atenção antes de aceitar.",
|
||||
"mpchange68": "Tipo de transmissão:",
|
||||
"mpchange69": "Dados TX:",
|
||||
"mpchange70": "A transação do processo não foi solicitada.",
|
||||
"mpchange71": "Os Bytes assinados são: ",
|
||||
"mpchange72": "Transação assinada e processada com sucesso.",
|
||||
"mpchange73": "A transação não pôde ser processada.",
|
||||
"mpchange74": "Falha ao pesquisar saldo QORT. Tente novamente!",
|
||||
"mpchange75": "Não foi possível enviar moeda.",
|
||||
"mpchange76": "Falha ao pesquisar saldo BTC. Tente novamente!",
|
||||
"mpchange77": "Falha ao pesquisar saldo LTC. Tente novamente!",
|
||||
"mpchange78": "Falha ao pesquisar saldo DOGE. Tente novamente!",
|
||||
"mpchange79": "Falha ao pesquisar saldo DGB. Tente novamente!",
|
||||
"mpchange80": "Falha ao pesquisar saldo RVN. Tente novamente!",
|
||||
"mpchange81": "Falha ao pesquisar saldo ARRR. Tente novamente!",
|
||||
"mpchange82": "Campos em falta",
|
||||
"mpchange83": "RECLINADO",
|
||||
"mpchange84": "FALHA",
|
||||
"mpchange85": "SUCESSO",
|
||||
"mpchange86": "Permitir sempre obter saldo da carteira automaticamente",
|
||||
"mpchange87": "Por favor introduza o ID do grupo"
|
||||
}
|
||||
}
|
||||
|
@ -248,7 +248,9 @@
|
||||
"balance": "Credit",
|
||||
"balances": "SOLDELE PORTOTELULUI DVS",
|
||||
"update": "ACTUALIZAȚI SOLDELE PORTOTELULUI",
|
||||
"view": "Vedere"
|
||||
"view": "Vedere",
|
||||
"all": "Toate",
|
||||
"page": "Pagină"
|
||||
},
|
||||
"gifs": {
|
||||
"gchange1": "Explorator GIF",
|
||||
@ -466,7 +468,7 @@
|
||||
"rchange6": "Destinatar",
|
||||
"rchange7": "Actiune",
|
||||
"rchange8": "Tip",
|
||||
"rchange9": "Nivelurile 1 - 4 pot crea un cota personala de recompensare, iar nivelul 5 sau mai sus pot crea o Cota de Recompensare!",
|
||||
"rchange9": "Nivelurile 0 - 4 pot crea un cota personala de recompensare, iar nivelul 5 sau mai sus pot crea o Cota de Recompensare!",
|
||||
"rchange10": "Cheia publica a destinatarului",
|
||||
"rchange11": "Procentul cotei de recompensa",
|
||||
"rchange12": "Se produce ceva delicios",
|
||||
@ -740,7 +742,8 @@
|
||||
"bchange51": "Pentru a trimite modificările nu uitați să faceți clic pe Actualizați profilul",
|
||||
"bchange52": "Dați această aplicație permisiunea de a obține informațiile despre portofel?",
|
||||
"bchange53": "Permiteți întotdeauna ca lista de prieteni să fie preluată automat de toate aplicațiile",
|
||||
"bchange54": "Acordați acestei aplicații permisiunea de a vă accesa lista de prieteni?"
|
||||
"bchange54": "Acordați acestei aplicații permisiunea de a vă accesa lista de prieteni?",
|
||||
"bchange55": "Oferiți acestei aplicații permisiunea de a trimite această comandă?"
|
||||
},
|
||||
"datapage": {
|
||||
"dchange1": "Gestionare date",
|
||||
@ -840,7 +843,7 @@
|
||||
"cchange74": "a reacționat cu",
|
||||
"cchange75": "Se încarcă atașamentul. Aceasta poate dura până la un minut.",
|
||||
"cchange76": "Se șterge atașamentul. Aceasta poate dura până la un minut.",
|
||||
"cchange77": "Dimensiunea atașamentului depășește 1 MB",
|
||||
"cchange77": "Dimensiunea atașamentului depășește 10 MB",
|
||||
"cchange78": "Sunteți sigur că doriți să ștergeți această imagine?",
|
||||
"cchange79": "Sunteți sigur că doriți să ștergeți acest atașament?",
|
||||
"cchange80": "Această imagine a fost ștearsă",
|
||||
@ -853,7 +856,24 @@
|
||||
"cchange94": "încărcat",
|
||||
"cchange95": "Numai resursele mele",
|
||||
"cchange96": "Deschideți managementul grupului",
|
||||
"cchange97": "Linkul de alaturare grupului a fost copiat in clipboard"
|
||||
"cchange97": "Linkul de alaturare grupului a fost copiat in clipboard",
|
||||
"cchange98": "Se încarcă fișierul. Aceasta poate dura câteva minute.",
|
||||
"cchange99": "Ștergerea fișierului. Aceasta poate dura până la un minut.",
|
||||
"cchange100": "Dimensiunea fișierului depășește 125 MB",
|
||||
"cchange101": "Sunteți sigur că doriți să ștergeți acest fișier?",
|
||||
"cchange102": "Acest fișier a fost șters",
|
||||
"cchange103": "Încărcarea GIF-ului. Aceasta poate dura până la un minut.",
|
||||
"cchange104": "Ștergerea GIF-ului. Aceasta poate dura până la un minut.",
|
||||
"cchange105": "Dimensiunea fișierului depășește 3 MB",
|
||||
"cchange106": "Sunteți sigur că doriți să ștergeți acest gif?",
|
||||
"cchange107": "Acest gif a fost șters",
|
||||
"cchange108": "Descărcarea va continua în fundal, un singur fișier Q-Chat poate fi descărcat simultan.",
|
||||
"cchange109": "Tipul de fișier nu este acceptat!",
|
||||
"cchange110": "ÎNCĂRCARE IMAGINEA",
|
||||
"cchange111": "ÎNCĂRCARE GIF",
|
||||
"cchange112": "ÎNCĂRCARE AATAșAMENT",
|
||||
"cchange113": "ÎNCĂRCARE FIȘIER",
|
||||
"cchange114": "Scrie ceva ..."
|
||||
},
|
||||
"welcomepage": {
|
||||
"wcchange1": "Bine ai venit la Q-Chat",
|
||||
@ -954,7 +974,10 @@
|
||||
"gchange65": "Înlocuiți această adresă la TRANSFERAȚI PROPRIETATEA grupului!",
|
||||
"gchange66": "Adresa proprietarului / proprietarului nou nevalidă",
|
||||
"gchange67": "UPDATE de grup Reușit!",
|
||||
"gchange68": "Set Avatar grup"
|
||||
"gchange68": "Set Avatar grup",
|
||||
"gchange69": "Mesaje",
|
||||
"gchange70": "Niciun mesaj în ultimele 24 de ore!",
|
||||
"gchange71": "Te-ai alaturat deja acestui grup!"
|
||||
},
|
||||
"puzzlepage": {
|
||||
"pchange1": "Puzzle-uri",
|
||||
@ -1297,5 +1320,104 @@
|
||||
"tour20": "se blochează în urmă. Doriți să reîmprospătați (bootstrap) pentru a accelera procesul de sincronizare?",
|
||||
"tour21": "blocuri rămase.",
|
||||
"tour22": "Reîmprospătare (bootstrap) solicitată. Vă rugăm să așteptați."
|
||||
},
|
||||
"chatsettings": {
|
||||
"cs1": "Setări chat",
|
||||
"cs2": "Setări generale de chat",
|
||||
"cs3": "Marca temporală a mesajului de chat",
|
||||
"cs4": "Timp în urmă",
|
||||
"cs5": "Ora locală",
|
||||
"cs6": "Dimensiunea fontului mesajului de chat",
|
||||
"cs7": "Standard",
|
||||
"cs8": "px"
|
||||
},
|
||||
"modals": {
|
||||
"mpchange1": "Toate AT-urile solicitate trebuie să fie din același Blockchain străin.",
|
||||
"mpchange2": "Acordați acestei aplicații permisiunea de a efectua o comandă de cumpărare?",
|
||||
"mpchange3": "Comandă de cumpărare creată cu succes",
|
||||
"mpchange4": "Vă rugăm să așteptați până când comanda de cumpărare este îndeplinită",
|
||||
"mpchange5": "Eșuat la trimiterea comenzii de cumpărare.",
|
||||
"mpchange6": "Dați această aplicație permisiunea de a efectua o comandă de vânzare?",
|
||||
"mpchange7": "Pentru:",
|
||||
"mpchange8": "Comandă de vânzare creată cu succes.",
|
||||
"mpchange9": "Vă rugăm să așteptați până când ordinul de vânzare este afișat.",
|
||||
"mpchange10": "Eșuat la trimiterea comenzii de vânzare.",
|
||||
"mpchange11": "Nu pot găsi informațiile AT.",
|
||||
"mpchange12": "Dați această aplicație permisiunea de a efectua anularea unei comenzi de vânzare?",
|
||||
"mpchange13": "Comanda de vânzare a fost anulată cu succes.",
|
||||
"mpchange14": "Vă rugăm să așteptați până când anularea tranzacției este îndeplinită.",
|
||||
"mpchange15": "Anularea comenzii de vânzare a eșuat.",
|
||||
"mpchange16": "Eroare la preluarea listei.",
|
||||
"mpchange17": "Eroare la adăugarea la listă.",
|
||||
"mpchange18": "Eroare în lista de ștergere.",
|
||||
"mpchange19": "Eroare la preluarea listei de prieteni.",
|
||||
"mpchange20": "Numărul nu este un număr.",
|
||||
"mpchange21": "Numărul lipsește.",
|
||||
"mpchange22": "Nu au fost trimise date sau fișiere.",
|
||||
"mpchange23": "Criptarea datelor necesită chei publice.",
|
||||
"mpchange24": "Numai datele criptate pot intra în serviciile private.",
|
||||
"mpchange25": "Încărcarea a eșuat din cauza criptării eșuate.",
|
||||
"mpchange26": "Încărcarea a eșuat.",
|
||||
"mpchange27": "Date nevalide.",
|
||||
"mpchange28": "Nu există resurse de publicat.",
|
||||
"mpchange29": "Eroare necunoscută.",
|
||||
"mpchange30": "Sondajul nu a fost găsit.",
|
||||
"mpchange31": "Nu am votat la sondaj.",
|
||||
"mpchange32": "Nu s-a creat sondajul.",
|
||||
"mpchange33": "Vă rugăm să introduceți un link qortal - qortal://...",
|
||||
"mpchange34": "Link nevalid qortal.",
|
||||
"mpchange35": "Eroare la trimiterea notificării.",
|
||||
"mpchange36": "Nu s-a putut trimite mesajul.",
|
||||
"mpchange37": "Nu se poate trimite un mesaj criptat acestui utilizator deoarece nu are cheia publică în lanț.",
|
||||
"mpchange38": "Solicitarea nu a putut fi îndeplinită.",
|
||||
"mpchange39": "Grupul nu a fost găsit.",
|
||||
"mpchange40": "Acordați acestei aplicații permisiunea de a efectua o solicitare de alăturare a unui grup?",
|
||||
"mpchange41": "Numele grupului:",
|
||||
"mpchange42": "ID grup:",
|
||||
"mpchange43": "Solicitarea de alăturare a grupului a fost creată.",
|
||||
"mpchange44": "Nu s-a putut alătura grupului.",
|
||||
"mpchange45": "Un tip mime nu a putut fi derivat.",
|
||||
"mpchange46": "O extensie de fișier nu a putut fi derivată.",
|
||||
"mpchange47": "Utilizatorul a refuzat descărcarea.",
|
||||
"mpchange48": "Nu s-a inițiat descărcarea.",
|
||||
"mpchange49": "A eșuat la implementarea AT.",
|
||||
"mpchange50": "Utilizatorul nu are un profil.",
|
||||
"mpchange51": "Nu pot găsi datele solicitate.",
|
||||
"mpchange52": "Eșuat la obținerea datelor de profil.",
|
||||
"mpchange53": "Nu s-a putut seta proprietatea.",
|
||||
"mpchange54": "Nu s-a putut deschide profilul.",
|
||||
"mpchange55": "Eroare la preluarea informațiilor serverului.",
|
||||
"mpchange56": "Eroare în rezumatul activității tx.",
|
||||
"mpchange57": "Eroare la obținerea taxei străine.",
|
||||
"mpchange58": "Eroare la actualizarea taxei externe.",
|
||||
"mpchange59": "Eroare la obținerea istoricului conexiunilor la server.",
|
||||
"mpchange60": "Eroare la setarea serverului curent.",
|
||||
"mpchange61": "Eroare la adăugarea serverului.",
|
||||
"mpchange62": "Eroare la eliminarea serverului.",
|
||||
"mpchange63": "Eroare la preluarea rezumatului.",
|
||||
"mpchange64": "Nu s-a putut decoda tranzacția.",
|
||||
"mpchange65": "Acordați acestei aplicații permisiunea de a semna și procesa o tranzacție?",
|
||||
"mpchange66": "Acordați acestei aplicații permisiunea de a semna o tranzacție?",
|
||||
"mpchange67": "Citiți tranzacția cu atenție înainte de a accepta.",
|
||||
"mpchange68": "Tip Tx:",
|
||||
"mpchange69": "Date TX:",
|
||||
"mpchange70": "Procesul tranzacției nu a fost solicitat.",
|
||||
"mpchange71": "Octeții semnați sunt: ",
|
||||
"mpchange72": "Tranzacția a fost semnată și procesată cu succes.",
|
||||
"mpchange73": "Tranzacția nu a putut fi procesată.",
|
||||
"mpchange74": "Preluarea soldului QORT a eșuat. Încercați din nou!",
|
||||
"mpchange75": "Nu s-a putut trimite moneda.",
|
||||
"mpchange76": "Preluarea soldului BTC a eșuat. Încercați din nou!",
|
||||
"mpchange77": "Preluarea soldului LTC a eșuat. Încercați din nou!",
|
||||
"mpchange78": "Preluarea soldului DOGE a eșuat. Încercați din nou!",
|
||||
"mpchange79": "Preluarea soldului DGB a eșuat. Încercați din nou!",
|
||||
"mpchange80": "Preluarea soldului RVN a eșuat. Încercați din nou!",
|
||||
"mpchange81": "Preluarea soldului ARRR a eșuat. Încercați din nou!",
|
||||
"mpchange82": "CÂMPURI LIPSĂ",
|
||||
"mpchange83": "RESFUS",
|
||||
"mpchange84": "Eșec",
|
||||
"mpchange85": "SUCCES",
|
||||
"mpchange86": "Permiteți întotdeauna obținerea automată a soldului portofelului",
|
||||
"mpchange87": "Vă rugăm să introduceți ID-ul grupului"
|
||||
}
|
||||
}
|
||||
|
@ -248,7 +248,9 @@
|
||||
"balance": "Kredit",
|
||||
"balances": "VAŠI STANJE U NOVČANIKU",
|
||||
"update": "AŽURIRAJTE STANJE NOVČANIKA",
|
||||
"view": "Pogled"
|
||||
"view": "Pogled",
|
||||
"all": "Sve",
|
||||
"page": "Strana"
|
||||
},
|
||||
"gifs": {
|
||||
"gchange1": "Gif Ekplorer",
|
||||
@ -466,7 +468,7 @@
|
||||
"rchange6": "Primalac",
|
||||
"rchange7": "Akcija",
|
||||
"rchange8": "Tip",
|
||||
"rchange9": "Nivoi 1 - 4 mogu napraviti samostalni udeo a nivoi 5 i više mogu napraviti udeo u nagradi!",
|
||||
"rchange9": "Nivoi 0 - 4 mogu napraviti samostalni udeo a nivoi 5 i više mogu napraviti udeo u nagradi!",
|
||||
"rchange10": "Primalac Javnog Ključa",
|
||||
"rchange11": "Procenat Udela u Nagradi",
|
||||
"rchange12": "Rađenje nečeg slasnog",
|
||||
@ -740,7 +742,8 @@
|
||||
"bchange51": "Da biste podneli promene, ne zaboravite da kliknete na 'Ažuriraj profil'",
|
||||
"bchange52": "Da li ovoj aplikaciji dajete dozvolu da dobije informacije o vašem novčaniku?",
|
||||
"bchange53": "Uvek dozvoli da sve aplikacije automatski preuzimaju listu prijatelja",
|
||||
"bchange54": "Da li ovoj aplikaciji dajete dozvolu da pristupi vašoj listi prijatelja?"
|
||||
"bchange54": "Da li ovoj aplikaciji dajete dozvolu da pristupi vašoj listi prijatelja?",
|
||||
"bchange55": "Da li ovoj aplikaciji dajete dozvolu da pošalje ovu komandu?"
|
||||
},
|
||||
"datapage": {
|
||||
"dchange1": "Upravljanje podacima",
|
||||
@ -840,7 +843,7 @@
|
||||
"cchange74": "reagovao sa",
|
||||
"cchange75": "Otpremanje priloga. Ovo može potrajati do jednog minuta.",
|
||||
"cchange76": "Brisanje priloga. Ovo može potrajati do jednog minuta.",
|
||||
"cchange77": "Veličina priloga prelazi 1 MB",
|
||||
"cchange77": "Veličina priloga prelazi 10 MB",
|
||||
"cchange78": "Da li ste sigurni da želite da izbrišete ovu sliku?",
|
||||
"cchange79": "Da li ste sigurni da želite da izbrišete ovaj prilog?",
|
||||
"cchange80": "Ova slika je izbrisana",
|
||||
@ -853,7 +856,24 @@
|
||||
"cchange94": "učitano",
|
||||
"cchange95": "Samo moji resursi",
|
||||
"cchange96": "Otvoreno upravljanje grupom",
|
||||
"cchange97": "Link pridruživanja grupi je kopiran u međuspremnik"
|
||||
"cchange97": "Link pridruživanja grupi je kopiran u međuspremnik",
|
||||
"cchange98": "Otpremanje datoteke. Ovo može potrajati nekoliko minuta.",
|
||||
"cchange99": "Brisanje datoteke. Ovo može potrajati do jednog minuta.",
|
||||
"cchange100": "Veličina datoteke premašuje 125 MB",
|
||||
"cchange101": "Da li ste sigurni da želite da izbrišete ovu datoteku?",
|
||||
"cchange102": "Ova datoteka je izbrisana",
|
||||
"cchange103": "Otpremanje gif-a. Ovo može potrajati do jednog minuta.",
|
||||
"cchange104": "Brisanje gif-a. Ovo može potrajati do jednog minuta.",
|
||||
"cchange105": "Veličina datoteke prelazi 3 MB",
|
||||
"cchange106": "Da li ste sigurni da želite da izbrišete ovaj gif?",
|
||||
"cchange107": "Ovaj gif je izbrisan",
|
||||
"cchange108": "Preuzimanje će se nastaviti u pozadini, samo JEDAN K-Chat fajl može da se preuzme istovremeno.",
|
||||
"cchange109": "Tip datoteke nije podržan!",
|
||||
"cchange110": "OTPREMA SLIKE",
|
||||
"cchange111": "OSTAVLJANJE GIFOVA",
|
||||
"cchange112": "OTDAVANJE PRILOGA",
|
||||
"cchange113": "OTPREMA DATOTEKA",
|
||||
"cchange114": "Napiši nešto ..."
|
||||
},
|
||||
"welcomepage": {
|
||||
"wcchange1": "Dobrodošli na Q-Chat",
|
||||
@ -954,7 +974,10 @@
|
||||
"gchange65": "Zameni ovu adresu NA PRENOS VLASNIŠTVA GRUPE!",
|
||||
"gchange66": "Nevažeći vlasnik / adresa novog vlasnika",
|
||||
"gchange67": "Grupni UPDATE je uspešan!",
|
||||
"gchange68": "Postavi grupni avatar"
|
||||
"gchange68": "Postavi grupni avatar",
|
||||
"gchange69": "Poruke",
|
||||
"gchange70": "Nema poruka u poslednja 24 sata!",
|
||||
"gchange71": "Već ste se pridružili ovoj grupi!"
|
||||
},
|
||||
"puzzlepage": {
|
||||
"pchange1": "Slagalice",
|
||||
@ -1297,5 +1320,104 @@
|
||||
"tour20": "blokovi iza. Da li želite da osvežite (bootstrap) da biste ubrzali proces sinhronizacije?",
|
||||
"tour21": "preostali blokovi.",
|
||||
"tour22": "Zatraženo je osvežavanje (bootstrap). Molimo sačekajte."
|
||||
},
|
||||
"chatsettings": {
|
||||
"cs1": "Podešavanja ćaskanja",
|
||||
"cs2": "Opšta podešavanja ćaskanja",
|
||||
"cs3": "Vremenska oznaka poruke ćaskanja",
|
||||
"cs4": "pre vremena",
|
||||
"cs5": "Lokalno vreme",
|
||||
"cs6": "Veličina fonta poruke ćaskanja",
|
||||
"cs7": "Standard",
|
||||
"cs8": "pk"
|
||||
},
|
||||
"modals": {
|
||||
"mpchange1": "Svi traženi AT-ovi moraju biti na istom stranom Blockchain-u.",
|
||||
"mpchange2": "Da li ovoj aplikaciji dajete dozvolu da izvrši nalog za kupovinu?",
|
||||
"mpchange3": "Uspešno kreiran nalog za kupovinu",
|
||||
"mpchange4": "Molimo sačekajte dok se porudžbina za kupovinu ne ispuni",
|
||||
"mpchange5": "Podnošenje naloga za kupovinu nije uspelo.",
|
||||
"mpchange6": "Da li ovoj aplikaciji dajete dozvolu da izvrši nalog za prodaju?",
|
||||
"mpchange7": "Za:",
|
||||
"mpchange8": "Uspešno kreiran nalog za prodaju.",
|
||||
"mpchange9": "Molimo sačekajte dok se nalog za prodaju ne pojavi na listi.",
|
||||
"mpchange10": "Podnošenje naloga za prodaju nije uspelo.",
|
||||
"mpchange11": "Ne mogu pronaći AT informacije.",
|
||||
"mpchange12": "Da li ovoj aplikaciji dajete dozvolu da izvrši otkazivanje naloga za prodaju?",
|
||||
"mpchange13": "Uspešno otkazan nalog za prodaju.",
|
||||
"mpchange14": "Molimo sačekajte dok se otkazivanje trgovine ne ispuni.",
|
||||
"mpchange15": "Otkazivanje porudžbine za prodaju nije uspelo.",
|
||||
"mpchange16": "Greška u preuzimanju liste.",
|
||||
"mpchange17": "Greška pri dodavanju na listu.",
|
||||
"mpchange18": "Greška u listi za brisanje.",
|
||||
"mpchange19": "Greška pri preuzimanju liste prijatelja.",
|
||||
"mpchange20": "Broj nije broj.",
|
||||
"mpchange21": "Nedostaje broj.",
|
||||
"mpchange22": "Nije dostavljen nijedan podatak ili datoteka.",
|
||||
"mpchange23": "Šifrovanje podataka zahteva javne ključeve.",
|
||||
"mpchange24": "Samo šifrovani podaci mogu da idu u privatne usluge.",
|
||||
"mpchange25": "Otpremanje nije uspelo zbog neuspelog šifrovanja.",
|
||||
"mpchange26": "Otpremanje nije uspelo.",
|
||||
"mpchange27": "Nevažeći podaci.",
|
||||
"mpchange28": "Nema resursa za objavljivanje.",
|
||||
"mpchange29": "Nepoznata greška.",
|
||||
"mpchange30": "Anketa nije pronađena.",
|
||||
"mpchange31": "Glasanje u anketi nije uspelo.",
|
||||
"mpchange32": "Kreiranje ankete nije uspelo.",
|
||||
"mpchange33": "Unesite kortal link - kortal://...",
|
||||
"mpchange34": "Nevažeća kortal veza.",
|
||||
"mpchange35": "Greška u slanju obaveštenja.",
|
||||
"mpchange36": "Ne mogu poslati poruku.",
|
||||
"mpchange37": "Ne mogu poslati šifrovanu poruku ovom korisniku jer nemaju svoj javni ključ u lancu.",
|
||||
"mpchange38": "Zahtev nije mogao biti ispunjen.",
|
||||
"mpchange39": "Grupa nije pronađena.",
|
||||
"mpchange40": "Da li ovoj aplikaciji dajete dozvolu da izvrši zahtev za pridruživanje grupi?",
|
||||
"mpchange41": "Ime grupe:",
|
||||
"mpchange42": "ID grupe:",
|
||||
"mpchange43": "Uspešno kreiran zahtev za pridruživanje grupi.",
|
||||
"mpchange44": "Pridruživanje grupi nije uspelo.",
|
||||
"mpchange45": "Mime tip nije mogao biti izveden.",
|
||||
"mpchange46": "Ne može se izvesti ekstenzija datoteke.",
|
||||
"mpchange47": "Korisnik je odbio preuzimanje.",
|
||||
"mpchange48": "Pokretanje preuzimanja nije uspelo.",
|
||||
"mpchange49": "Neuspešno postavljanje AT-a.",
|
||||
"mpchange50": "Korisnik nema profil.",
|
||||
"mpchange51": "Ne mogu pronaći tražene podatke.",
|
||||
"mpchange52": "Dobijanje podataka profila nije uspelo.",
|
||||
"mpchange53": "Podešavanje svojstva nije uspelo.",
|
||||
"mpchange54": "Otvaranje profila nije uspelo.",
|
||||
"mpchange55": "Greška pri preuzimanju informacija o serveru.",
|
||||
"mpchange56": "Greška u rezimeu tk aktivnosti.",
|
||||
"mpchange57": "Greška u dobijanju inostrane naknade.",
|
||||
"mpchange58": "Greška u ažuriranju inostrane naknade.",
|
||||
"mpchange59": "Greška u preuzimanju istorije veze sa serverom.",
|
||||
"mpchange60": "Greška u podešavanju trenutnog servera.",
|
||||
"mpchange61": "Greška u dodavanju servera.",
|
||||
"mpchange62": "Greška u uklanjanju servera.",
|
||||
"mpchange63": "Greška pri preuzimanju rezimea.",
|
||||
"mpchange64": "Dekodiranje transakcije nije uspelo.",
|
||||
"mpchange65": "Da li ovoj aplikaciji dajete dozvolu da potpiše i obradi transakciju?",
|
||||
"mpchange66": "Da li ovoj aplikaciji dajete dozvolu da potpiše transakciju?",
|
||||
"mpchange67": "Pažljivo pročitajte transakciju pre prihvatanja.",
|
||||
"mpchange68": "Tp Tk:",
|
||||
"mpchange69": "TKS podaci:",
|
||||
"mpchange70": "Procesna transakcija nije zatražena.",
|
||||
"mpchange71": "Potpisani bajtovi su: ",
|
||||
"mpchange72": "Transakcija je potpisana i uspešno obrađena.",
|
||||
"mpchange73": "Transakcija nije mogla da se obradi.",
|
||||
"mpchange74": "Preuzimanje KORT balansa nije uspelo. Pokušajte ponovo!",
|
||||
"mpchange75": "Nije moguće poslati novčić.",
|
||||
"mpchange76": "Neuspešno preuzimanje BTC stanja. Pokušajte ponovo!",
|
||||
"mpchange77": "Preuzimanje LTC stanja nije uspelo. Pokušajte ponovo!",
|
||||
"mpchange78": "Neuspešno preuzimanje DOGE balansa. Pokušajte ponovo!",
|
||||
"mpchange79": "Dohvaćanje DGB balansa nije uspelo. Pokušajte ponovo!",
|
||||
"mpchange80": "Neuspešno preuzimanje RVN stanja. Pokušajte ponovo!",
|
||||
"mpchange81": "Neuspešno preuzimanje ARRR stanja. Pokušajte ponovo!",
|
||||
"mpchange82": "POLJA NEDOSTAJU",
|
||||
"mpchange83": "ODBIJENO",
|
||||
"mpchange84": "GREŠKA",
|
||||
"mpchange85": "USPEH",
|
||||
"mpchange86": "Uvek dozvoli automatsko dobijanje stanja novčanika",
|
||||
"mpchange87": "Unesite ID grupe"
|
||||
}
|
||||
}
|
||||
|
@ -248,7 +248,9 @@
|
||||
"balance": "кредит",
|
||||
"balances": "БАЛАНС ВАШЕГО КОШЕЛЬКА",
|
||||
"update": "ОБНОВИТЬ БАЛАНС КОШЕЛЬКА",
|
||||
"view": "Вид"
|
||||
"view": "Вид",
|
||||
"all": "Все",
|
||||
"page": "Страница"
|
||||
},
|
||||
"gifs": {
|
||||
"gchange1": "Проводник гифок",
|
||||
@ -466,7 +468,7 @@
|
||||
"rchange6": "Получатель",
|
||||
"rchange7": "Действие",
|
||||
"rchange8": "Тип",
|
||||
"rchange9": "Уровень 1–4 может создать акцию для самого себя, а уровень 5 или выше может создать акцию для других!",
|
||||
"rchange9": "Уровень 0–4 может создать акцию для самого себя, а уровень 5 или выше может создать акцию для других!",
|
||||
"rchange10": "Открытый ключ получателя",
|
||||
"rchange11": "Процент доли вознаграждения",
|
||||
"rchange12": "Делаю что-нибудь вкусненькое",
|
||||
@ -740,7 +742,8 @@
|
||||
"bchange51": "Чтобы отправить изменения, не забудьте нажать Обновить профиль",
|
||||
"bchange52": "Разрешаете ли вы этому приложению получать информацию о вашем кошельке?",
|
||||
"bchange53": "Всегда разрешайте всем приложениям автоматически получать список друзей",
|
||||
"bchange54": "Разрешаете ли вы этому приложению доступ к вашему списку друзей?"
|
||||
"bchange54": "Разрешаете ли вы этому приложению доступ к вашему списку друзей?",
|
||||
"bchange55": "Даете ли вы этому приложению разрешение на отправку этой команды?"
|
||||
},
|
||||
"datapage": {
|
||||
"dchange1": "Управление данными",
|
||||
@ -840,7 +843,7 @@
|
||||
"cchange74": "отреагировал",
|
||||
"cchange75": "Выполняется загрузка вложения. Это может занять до одной минуты.",
|
||||
"cchange76": "Удаление вложения. Это может занять до одной минуты.",
|
||||
"cchange77": "Размер вложения превышает 1 МБ",
|
||||
"cchange77": "Размер вложения превышает 10 МБ",
|
||||
"cchange78": "Вы уверены, что хотите удалить это изображение?",
|
||||
"cchange79": "Вы уверены, что хотите удалить это вложение?",
|
||||
"cchange80": "Это изображение было удалено",
|
||||
@ -853,7 +856,24 @@
|
||||
"cchange94": "загружено",
|
||||
"cchange95": "Только мои ресурсы",
|
||||
"cchange96": "Открытое управление группой",
|
||||
"cchange97": "Ссылка на вступление в группу скопирована в буфер обмена"
|
||||
"cchange97": "Ссылка на вступление в группу скопирована в буфер обмена",
|
||||
"cchange98": "Загрузка файла. Это может занять несколько минут.",
|
||||
"cchange99": "Удаление файла. Это может занять до одной минуты.",
|
||||
"cchange100": "Размер файла превышает 125 МБ",
|
||||
"cchange101": "Вы уверены, что хотите удалить этот файл?",
|
||||
"cchange102": "Этот файл был удален",
|
||||
"cchange103": "Загрузка gif. Это может занять до одной минуты.",
|
||||
"cchange104": "Удаление gif. Это может занять до одной минуты.",
|
||||
"cchange105": "Размер файла превышает 3 МБ",
|
||||
"cchange106": "Вы уверены, что хотите удалить эту гифку?",
|
||||
"cchange107": "Эта гифка была удалена",
|
||||
"cchange108": "Загрузка продолжится в фоновом режиме, одновременно можно загрузить только ОДИН файл Q-Chat.",
|
||||
"cchange109": "Тип файла не поддерживается!",
|
||||
"cchange110": "ЗАГРУЗКА ИЗОБРАЖЕНИЯ",
|
||||
"cchange111": "ЗАГРУЗИТЬ GIF",
|
||||
"cchange112": "ЗАГРУЗКА ВЛОЖЕНИЯ",
|
||||
"cchange113": "ЗАГРУЗКА ФАЙЛА",
|
||||
"cchange114": "Напишите что-нибудь ..."
|
||||
},
|
||||
"welcomepage": {
|
||||
"wcchange1": "Добро пожаловать в Q-Chat",
|
||||
@ -954,7 +974,10 @@
|
||||
"gchange65": "Замените этот адрес на TRANSFER OWNERSHIP of group!",
|
||||
"gchange66": "Неверный адрес владельца / нового владельца",
|
||||
"gchange67": "Групповое ОБНОВЛЕНИЕ выполнено успешно!",
|
||||
"gchange68": "Установить групповой аватар"
|
||||
"gchange68": "Установить групповой аватар",
|
||||
"gchange69": "Сообщения",
|
||||
"gchange70": "За последние 24 часа нет сообщений!",
|
||||
"gchange71": "Вы уже присоединились к этой группе!"
|
||||
},
|
||||
"puzzlepage": {
|
||||
"pchange1": "Головоломки",
|
||||
@ -1297,5 +1320,104 @@
|
||||
"tour20": "блоки позади. Хотите обновить (загрузочную загрузку), чтобы ускорить процесс синхронизации?",
|
||||
"tour21": "осталось блоков.",
|
||||
"tour22": "Запрошено обновление (загрузочная загрузка). Пожалуйста, подождите."
|
||||
},
|
||||
"chatsettings": {
|
||||
"cs1": "Настройки чата",
|
||||
"cs2": "Общие настройки чата",
|
||||
"cs3": "Временная метка сообщения чата",
|
||||
"cs4": "Время назад",
|
||||
"cs5": "Местное время",
|
||||
"cs6": "Размер шрифта сообщения чата",
|
||||
"cs7": "Стандартный",
|
||||
"cs8": "px"
|
||||
},
|
||||
"modals": {
|
||||
"mpchange1": "Все запрошенные AT должны быть из одного и того же внешнего блокчейна.",
|
||||
"mpchange2": "Вы даете этому приложению разрешение на выполнение заказа на покупку?",
|
||||
"mpchange3": "Заказ на покупку успешно создан",
|
||||
"mpchange4": "Пожалуйста, подождите, пока заказ на покупку не будет выполнен",
|
||||
"mpchange5": "Не удалось отправить заказ на покупку.",
|
||||
"mpchange6": "Вы даете этому приложению разрешение на выполнение заказа на продажу?",
|
||||
"mpchange7": "Для:",
|
||||
"mpchange8": "Заказ на продажу успешно создан",
|
||||
"mpchange9": "Пожалуйста, подождите, пока заказ на продажу не будет размещен",
|
||||
"mpchange10": "Не удалось отправить заказ на продажу.",
|
||||
"mpchange11": "Не удалось найти информацию об AT.",
|
||||
"mpchange12": "Вы даете этому приложению разрешение на выполнение отмены заказа на продажу?",
|
||||
"mpchange13": "Заказ на продажу успешно отменен",
|
||||
"mpchange14": "Пожалуйста дождитесь выполнения отмены сделки.",
|
||||
"mpchange15": "Не удалось отменить ордер на продажу.",
|
||||
"mpchange16": "Ошибка при получении списка.",
|
||||
"mpchange17": "Ошибка при добавлении в список.",
|
||||
"mpchange18": "Ошибка при удалении списка.",
|
||||
"mpchange19": "Ошибка при получении списка друзей.",
|
||||
"mpchange20": "Количество не является числом.",
|
||||
"mpchange21": "Отсутствует количество.",
|
||||
"mpchange22": "Данные или файл не были отправлены.",
|
||||
"mpchange23": "Для шифрования данных требуются открытые ключи.",
|
||||
"mpchange24": "Только зашифрованные данные могут быть отправлены в частные сервисы.",
|
||||
"mpchange25": "Загрузка не удалась из-за неудачного шифрования.",
|
||||
"mpchange26": "Загрузка не удалась.",
|
||||
"mpchange27": "Недопустимые данные.",
|
||||
"mpchange28": "Нет ресурсов для публикации.",
|
||||
"mpchange29": "Неизвестно ошибка.",
|
||||
"mpchange30": "Опрос не найден.",
|
||||
"mpchange31": "Не удалось проголосовать в опросе.",
|
||||
"mpchange32": "Не удалось создать опрос.",
|
||||
"mpchange33": "Введите ссылку qortal - qortal://...",
|
||||
"mpchange34": "Недопустимая ссылка qortal.",
|
||||
"mpchange35": "Ошибка при отправке уведомления.",
|
||||
"mpchange36": "Не удалось отправить сообщение.",
|
||||
"mpchange37": "Не удалось отправить зашифрованное сообщение этому пользователю, так как у него нет открытого ключа в цепочке.",
|
||||
"mpchange38": "Запрос не может быть выполнен.",
|
||||
"mpchange39": "Группа не найдена.",
|
||||
"mpchange40": "Вы даете этому приложению разрешение на выполнение запроса на присоединение к группе?",
|
||||
"mpchange41": "Имя группы:",
|
||||
"mpchange42": "Идентификатор группы:",
|
||||
"mpchange43": "Успешно создано присоединение к группе запрос.",
|
||||
"mpchange44": "Не удалось присоединиться к группе.",
|
||||
"mpchange45": "Не удалось получить тип MIME.",
|
||||
"mpchange46": "Не удалось получить расширение файла.",
|
||||
"mpchange47": "Пользователь отклонил загрузку.",
|
||||
"mpchange48": "Не удалось начать загрузку.",
|
||||
"mpchange49": "Не удалось развернуть AT.",
|
||||
"mpchange50": "У пользователя нет профиля.",
|
||||
"mpchange51": "Не удалось найти запрошенные данные.",
|
||||
"mpchange52": "Не удалось получить данные профиля.",
|
||||
"mpchange53": "Не удалось задать свойство.",
|
||||
"mpchange54": "Не удалось открыть профиль.",
|
||||
"mpchange55": "Ошибка при получении информации о сервере.",
|
||||
"mpchange56": "Ошибка в сводке активности tx.",
|
||||
"mpchange57": "Ошибка при получении иностранной платы.",
|
||||
"mpchange58": "Ошибка обновления иностранной платы",
|
||||
"mpchange59": "Ошибка получения истории подключений к серверу",
|
||||
"mpchange60": "Ошибка установки текущего сервера",
|
||||
"mpchange61": "Ошибка добавления сервера",
|
||||
"mpchange62": "Ошибка удаления сервера",
|
||||
"mpchange63": "Ошибка получения сводки",
|
||||
"mpchange64": "Не удалось декодировать транзакцию",
|
||||
"mpchange65": "Вы даете этому приложению разрешение на подпись и обработку транзакции?",
|
||||
"mpchange66": "Вы даете этому приложению разрешение на подпись транзакции?",
|
||||
"mpchange67": "Внимательно прочитайте транзакцию перед ее принятием",
|
||||
"mpchange68": "Тип передачи:",
|
||||
"mpchange69": "Данные передачи:",
|
||||
"mpchange70": "Транзакция обработки не была запрошена",
|
||||
"mpchange71": "Подписанные байты:",
|
||||
"mpchange72": "Транзакция подписана и успешно обработана",
|
||||
"mpchange73": "Транзакция была не удалось обработать.",
|
||||
"mpchange74": "Не удалось получить баланс QORT. Попробуйте еще раз!",
|
||||
"mpchange75": "Не удалось отправить монету.",
|
||||
"mpchange76": "Не удалось получить баланс BTC. Попробуйте еще раз!",
|
||||
"mpchange77": "Не удалось получить баланс LTC. Попробуйте еще раз!",
|
||||
"mpchange78": "Не удалось получить баланс DOGE. Попробуйте еще раз!",
|
||||
"mpchange79": "Не удалось получить баланс DGB. Попробуйте еще раз!",
|
||||
"mpchange80": "Не удалось получить баланс RVN. Попробуйте еще раз!",
|
||||
"mpchange81": "Не удалось получить баланс ARRR. Попробуйте еще раз!",
|
||||
"mpchange82": "ПРОПУЩЕННЫЕ ПОЛЯ",
|
||||
"mpchange83": "ОТКЛОНЕНО",
|
||||
"mpchange84": "НЕУДАЧА",
|
||||
"mpchange85": "УСПЕШНО",
|
||||
"mpchange86": "Всегда разрешать автоматически получать баланс кошелька",
|
||||
"mpchange87": "Пожалуйста, введите идентификатор группы"
|
||||
}
|
||||
}
|
||||
|
@ -248,7 +248,9 @@
|
||||
"balance": "Balance",
|
||||
"balances": "YOUR WALLET BALANCES",
|
||||
"update": "UPDATE WALLET BALANCES",
|
||||
"view": "View"
|
||||
"view": "View",
|
||||
"all": "All",
|
||||
"page": "Page"
|
||||
},
|
||||
"gifs": {
|
||||
"gchange1": "Gif Explorer",
|
||||
@ -466,7 +468,7 @@
|
||||
"rchange6": "Recipient",
|
||||
"rchange7": "Action",
|
||||
"rchange8": "Type",
|
||||
"rchange9": "Levels 1 - 4 can only create a Self-Share (minting) keys. Only Level 5 or above can create a Reward Share!",
|
||||
"rchange9": "Levels 0 - 4 can only create a Self-Share (minting) keys. Only Level 5 or above can create a Reward Share!",
|
||||
"rchange10": "Recipient's Public Key",
|
||||
"rchange11": "Reward Share percentage",
|
||||
"rchange12": "Executing Requested Command...",
|
||||
@ -740,7 +742,8 @@
|
||||
"bchange51": "To submit the changes don't forget to click on 'Update profile'",
|
||||
"bchange52": "Do you give this application permission to get your wallet information?",
|
||||
"bchange53": "Always allow your friends list to be retrieved automatically by all apps",
|
||||
"bchange54": "Do you give this application permission to access your friends list?"
|
||||
"bchange54": "Do you give this application permission to access your friends list?",
|
||||
"bchange55": "Do you give this application permission to send this command?"
|
||||
},
|
||||
"datapage": {
|
||||
"dchange1": "Data Management",
|
||||
@ -840,7 +843,7 @@
|
||||
"cchange74": "reacted with",
|
||||
"cchange75": "Uploading attachment. This may take up to one minute.",
|
||||
"cchange76": "Deleting attachment. This may take up to one minute.",
|
||||
"cchange77": "Attachment size exceeds 1 MB",
|
||||
"cchange77": "Attachment size exceeds 10 MB",
|
||||
"cchange78": "Are you sure you want to delete this image?",
|
||||
"cchange79": "Are you sure you want to delete this attachment?",
|
||||
"cchange80": "This image has been deleted",
|
||||
@ -853,7 +856,24 @@
|
||||
"cchange94": "loaded",
|
||||
"cchange95": "Only my resources",
|
||||
"cchange96": "Open Group Management",
|
||||
"cchange97": "Join group link copied to clipboard"
|
||||
"cchange97": "Join group link copied to clipboard",
|
||||
"cchange98": "Uploading file. This may take some minutes.",
|
||||
"cchange99": "Deleting file. This may take up to one minute.",
|
||||
"cchange100": "File size exceeds 125 MB",
|
||||
"cchange101": "Are you sure you want to delete this file?",
|
||||
"cchange102": "This file has been deleted",
|
||||
"cchange103": "Uploading gif. This may take up to one minutes.",
|
||||
"cchange104": "Deleting gif. This may take up to one minute.",
|
||||
"cchange105": "File size exceeds 3 MB",
|
||||
"cchange106": "Are you sure you want to delete this gif?",
|
||||
"cchange107": "This gif has been deleted",
|
||||
"cchange108": "Download will continue in the background, only ONE Q-Chat file can be downloaded simultaneously.",
|
||||
"cchange109": "File type not supported!",
|
||||
"cchange110": "IMAGE UPLOAD",
|
||||
"cchange111": "GIF UPLOAD",
|
||||
"cchange112": "ATTACHMENT UPLOAD",
|
||||
"cchange113": "FILE UPLOAD",
|
||||
"cchange114": "Write something ..."
|
||||
},
|
||||
"welcomepage": {
|
||||
"wcchange1": "Welcome to Q-Chat",
|
||||
@ -954,7 +974,10 @@
|
||||
"gchange65": "Only replace this address if you want to transfer the group!",
|
||||
"gchange66": "Invalid Owner / New Owner Address",
|
||||
"gchange67": "Group Update Successful!",
|
||||
"gchange68": "Set Group Avatar"
|
||||
"gchange68": "Set Group Avatar",
|
||||
"gchange69": "Messages",
|
||||
"gchange70": "No messages in the last 24 hours!",
|
||||
"gchange71": "You have already joined this group!"
|
||||
},
|
||||
"puzzlepage": {
|
||||
"pchange1": "Puzzles",
|
||||
@ -1297,5 +1320,104 @@
|
||||
"tour20": "blocks behind. Would you like to refresh (bootstrap) to speed up the syncing process?",
|
||||
"tour21": "blocks remaining.",
|
||||
"tour22": "Refresh (bootstrap) requested. Please wait."
|
||||
},
|
||||
"chatsettings": {
|
||||
"cs1": "Chat Settings",
|
||||
"cs2": "General Chat Settings",
|
||||
"cs3": "Chat Message Timestamp",
|
||||
"cs4": "Time Ago",
|
||||
"cs5": "Local Time",
|
||||
"cs6": "Chat Message Font Size",
|
||||
"cs7": "Standard",
|
||||
"cs8": "px"
|
||||
},
|
||||
"modals": {
|
||||
"mpchange1": "All requested ATs need to be of the same foreign Blockchain.",
|
||||
"mpchange2": "Do you give this application permission to perform a buy order?",
|
||||
"mpchange3": "Successfully created buy order",
|
||||
"mpchange4": "Please wait untill buy order get fulfilled",
|
||||
"mpchange5": "Failed to submit buy order.",
|
||||
"mpchange6": "Do you give this application permission to perform a sell order?",
|
||||
"mpchange7": "For:",
|
||||
"mpchange8": "Successfully created sell order.",
|
||||
"mpchange9": "Please wait untill the sell order get listed.",
|
||||
"mpchange10": "Failed to submit sell order.",
|
||||
"mpchange11": "Cannot find AT info.",
|
||||
"mpchange12": "Do you give this application permission to perform cancel a sell order?",
|
||||
"mpchange13": "Successfully cancelled sell order.",
|
||||
"mpchange14": "Please wait untill the trade cancelling get fulfilled.",
|
||||
"mpchange15": "Failed to cancel sell order.",
|
||||
"mpchange16": "Error in retrieving list.",
|
||||
"mpchange17": "Error in adding to list.",
|
||||
"mpchange18": "Error in delete list.",
|
||||
"mpchange19": "Error in retrieving friends list.",
|
||||
"mpchange20": "Count is not a number.",
|
||||
"mpchange21": "Missing count.",
|
||||
"mpchange22": "No data or file was submitted.",
|
||||
"mpchange23": "Encrypting data requires public keys.",
|
||||
"mpchange24": "Only encrypted data can go into private services.",
|
||||
"mpchange25": "Upload failed due to failed encryption.",
|
||||
"mpchange26": "Upload failed.",
|
||||
"mpchange27": "Invalid data.",
|
||||
"mpchange28": "No resources to publish.",
|
||||
"mpchange29": "Unknown error.",
|
||||
"mpchange30": "Poll not found.",
|
||||
"mpchange31": "Failed to vote on the poll.",
|
||||
"mpchange32": "Failed to created poll.",
|
||||
"mpchange33": "Please enter a qortal link - qortal://...",
|
||||
"mpchange34": "Invalid qortal link.",
|
||||
"mpchange35": "Error in pushing notification.",
|
||||
"mpchange36": "Could not send message.",
|
||||
"mpchange37": "Cannot send an encrypted message to this user since they do not have their publickey on chain.",
|
||||
"mpchange38": "Request could not be fulfilled.",
|
||||
"mpchange39": "Group not found.",
|
||||
"mpchange40": "Do you give this application permission to perform a join group request?",
|
||||
"mpchange41": "Group Name:",
|
||||
"mpchange42": "Group ID:",
|
||||
"mpchange43": "Successfully created join group request.",
|
||||
"mpchange44": "Failed to join the group.",
|
||||
"mpchange45": "A mime type could not be derived.",
|
||||
"mpchange46": "A file extension could not be derived.",
|
||||
"mpchange47": "User declined the download.",
|
||||
"mpchange48": "Failed to initiate download.",
|
||||
"mpchange49": "Failed to deploy AT.",
|
||||
"mpchange50": "User does not have a profile.",
|
||||
"mpchange51": "Cannot find requested data.",
|
||||
"mpchange52": "Failed to get profile data.",
|
||||
"mpchange53": "Failed to set property.",
|
||||
"mpchange54": "Failed to open profile.",
|
||||
"mpchange55": "Error in retrieving server info.",
|
||||
"mpchange56": "Error in tx activity summary.",
|
||||
"mpchange57": "Error in get foreign fee.",
|
||||
"mpchange58": "Error in update foreign fee.",
|
||||
"mpchange59": "Error in get server connection history.",
|
||||
"mpchange60": "Error in set current server.",
|
||||
"mpchange61": "Error in add server.",
|
||||
"mpchange62": "Error in remove server.",
|
||||
"mpchange63": "Error in retrieving summary.",
|
||||
"mpchange64": "Failed to decode transaction.",
|
||||
"mpchange65": "Do you give this application permission to sign and process a transaction?",
|
||||
"mpchange66": "Do you give this application permission to sign a transaction?",
|
||||
"mpchange67": "Read the transaction carefully before accepting.",
|
||||
"mpchange68": "Tx type:",
|
||||
"mpchange69": "TX Data:",
|
||||
"mpchange70": "Process transaction was not requested.",
|
||||
"mpchange71": "Signed bytes are: ",
|
||||
"mpchange72": "Transaction signed and processed successfully.",
|
||||
"mpchange73": "Transaction was not able to be processed.",
|
||||
"mpchange74": "Failed to Fetch QORT Balance. Try again!",
|
||||
"mpchange75": "Could not send coin.",
|
||||
"mpchange76": "Failed to Fetch BTC Balance. Try again!",
|
||||
"mpchange77": "Failed to Fetch LTC Balance. Try again!",
|
||||
"mpchange78": "Failed to Fetch DOGE Balance. Try again!",
|
||||
"mpchange79": "Failed to Fetch DGB Balance. Try again!",
|
||||
"mpchange80": "Failed to Fetch RVN Balance. Try again!",
|
||||
"mpchange81": "Failed to Fetch ARRR Balance. Try again!",
|
||||
"mpchange82": "MISSING FIELDS",
|
||||
"mpchange83": "DECLINED",
|
||||
"mpchange84": "FAILURE",
|
||||
"mpchange85": "SUCCESS",
|
||||
"mpchange86": "Always allow get wallet balance automatically",
|
||||
"mpchange87": "Please Enter The Group ID"
|
||||
}
|
||||
}
|
||||
|
@ -248,7 +248,9 @@
|
||||
"balance": "余额",
|
||||
"balances": "您的钱包余额",
|
||||
"update": "更新钱包余额",
|
||||
"view": "看法"
|
||||
"view": "看法",
|
||||
"all": "全部",
|
||||
"page": "页"
|
||||
},
|
||||
"gifs": {
|
||||
"gchange1": "Gif 浏览器",
|
||||
@ -466,7 +468,7 @@
|
||||
"rchange6": "接收者",
|
||||
"rchange7": "操作",
|
||||
"rchange8": "类型",
|
||||
"rchange9": "等级1-4只能创建个人铸币密钥;等级5或以上可以创建赞助码!",
|
||||
"rchange9": "等级0-4只能创建个人铸币密钥;等级5或以上可以创建赞助码!",
|
||||
"rchange10": "接收者的公共密钥",
|
||||
"rchange11": "奖励分享百分比",
|
||||
"rchange12": "正在添加中...",
|
||||
@ -740,7 +742,8 @@
|
||||
"bchange51": "要提交更改,请不要忘记单击“更新个人资料”",
|
||||
"bchange52": "您是否授予此应用程序获取您的钱包信息的权限?",
|
||||
"bchange53": "始终允许所有应用自动检索您的好友列表",
|
||||
"bchange54": "您是否授予此应用程序访问您的好友列表的权限?"
|
||||
"bchange54": "您是否授予此应用程序访问您的好友列表的权限?",
|
||||
"bchange55": "您是否授予此应用程序发送此命令?"
|
||||
},
|
||||
"datapage": {
|
||||
"dchange1": "资料管理",
|
||||
@ -840,7 +843,7 @@
|
||||
"cchange74": "心情回应",
|
||||
"cchange75": "上传附件。这可能需要一分钟。",
|
||||
"cchange76": "正在删除附件。这可能需要一分钟。",
|
||||
"cchange77": "附件大小超过 1 MB",
|
||||
"cchange77": "附件大小超过 10 MB",
|
||||
"cchange78": "你确定要删除这张图片吗?",
|
||||
"cchange79": "你确定要删除这个附件吗?",
|
||||
"cchange80": "这张图片已被删除",
|
||||
@ -853,7 +856,24 @@
|
||||
"cchange94": "已加载",
|
||||
"cchange95": "只有我的资源",
|
||||
"cchange96": "打开群组管理",
|
||||
"cchange97": "加入群组链接已复制到剪贴板"
|
||||
"cchange97": "加入群组链接已复制到剪贴板",
|
||||
"cchange98": "正在上传文件。这可能需要几分钟时间。",
|
||||
"cchange99": "正在删除文件。这可能最多需要一分钟。",
|
||||
"cchange100": "文件大小超过 125 MB",
|
||||
"cchange101": "您确定要删除此文件吗?",
|
||||
"cchange102": "该文件已被删除",
|
||||
"cchange103": "正在上传 gif。这最多可能需要一分钟。",
|
||||
"cchange104": "正在删除 gif。这可能最多需要一分钟。",
|
||||
"cchange105": "文件大小超过 3 MB",
|
||||
"cchange106": "您确定要删除这个 gif 吗?",
|
||||
"cchange107": "该动图已被删除",
|
||||
"cchange108": "下载将在后台继续,只能同时下载一个 Q-Chat 文件。",
|
||||
"cchange109": "不支持文件类型!",
|
||||
"cchange110": "图片上传",
|
||||
"cchange111": "GIF 上传",
|
||||
"cchange112": "附件上传",
|
||||
"cchange113": "文件上传",
|
||||
"cchange114": "写点东西 ..."
|
||||
},
|
||||
"welcomepage": {
|
||||
"wcchange1": "欢迎来到Q-Chat",
|
||||
@ -954,7 +974,10 @@
|
||||
"gchange65": "将此地址替换为组的 TRANSFER OWNERSHIP!",
|
||||
"gchange66": "无效的所有者/新所有者地址",
|
||||
"gchange67": "组更新成功!",
|
||||
"gchange68": "设置组头像"
|
||||
"gchange68": "设置组头像",
|
||||
"gchange69": "消息",
|
||||
"gchange70": "过去 24 小时内没有消息!",
|
||||
"gchange71": "您已经加入此群组!"
|
||||
},
|
||||
"puzzlepage": {
|
||||
"pchange1": "益智游戏",
|
||||
@ -1297,5 +1320,104 @@
|
||||
"tour20": "落后了。您想刷新(引导)以加快同步过程吗?",
|
||||
"tour21": "剩余块数。",
|
||||
"tour22": "已请求刷新(引导)。请稍候。"
|
||||
},
|
||||
"chatsettings": {
|
||||
"cs1": "聊天设置",
|
||||
"cs2": "常规聊天设置",
|
||||
"cs3": "聊天消息时间戳",
|
||||
"cs4": "时间前",
|
||||
"cs5": "当地时间",
|
||||
"cs6": "聊天消息字体大小",
|
||||
"cs7": "标准",
|
||||
"cs8": "px"
|
||||
},
|
||||
"modals": {
|
||||
"mpchange1": "所有请求的 AT 都需要属于同一个外部区块链。",
|
||||
"mpchange2": "您是否授予此应用程序执行买单的权限?",
|
||||
"mpchange3": "成功创建买单",
|
||||
"mpchange4": "请等待买单完成",
|
||||
"mpchange5": "提交买单失败。",
|
||||
"mpchange6": "您是否授予此应用程序执行卖单的权限?",
|
||||
"mpchange7": "对于: ",
|
||||
"mpchange8": "成功创建卖单。",
|
||||
"mpchange9": "请等待卖单列出。",
|
||||
"mpchange10": "提交卖单失败。",
|
||||
"mpchange11": "找不到 AT 信息。",
|
||||
"mpchange12": "您是否授予此应用程序执行取消卖单的权限?",
|
||||
"mpchange13": "成功取消卖单。",
|
||||
"mpchange14": "请等待交易取消完成。",
|
||||
"mpchange15": "取消卖单失败。",
|
||||
"mpchange16": "获取列表时出错。",
|
||||
"mpchange17": "添加列表时出错。",
|
||||
"mpchange18": "删除列表时出错。",
|
||||
"mpchange19": "获取好友列表时出错。",
|
||||
"mpchange20": "计数不是数字。",
|
||||
"mpchange21": "缺少计数。",
|
||||
"mpchange22": "未提交任何数据或文件。",
|
||||
"mpchange23": "加密数据需要公钥。",
|
||||
"mpchange24": "只有加密数据才能进入私人服务。",
|
||||
"mpchange25": "由于加密失败,上传失败。",
|
||||
"mpchange26": "上传失败。",
|
||||
"mpchange27": "数据无效。",
|
||||
"mpchange28": "没有要发布的资源。",
|
||||
"mpchange29": "未知错误。",
|
||||
"mpchange30": "未找到投票。",
|
||||
"mpchange31": "投票失败。",
|
||||
"mpchange32": "创建投票失败。",
|
||||
"mpchange33": "请输入 qortal 链接 - qortal: //...",
|
||||
"mpchange34": "无效的 qortal 链接。",
|
||||
"mpchange35": "推送通知时出错。",
|
||||
"mpchange36": "无法发送消息。",
|
||||
"mpchange37": "无法向此用户发送加密消息,因为他们没有链上的公钥。",
|
||||
"mpchange38": "无法满足请求。",
|
||||
"mpchange39": "未找到群组。",
|
||||
"mpchange40": "您是否授予此应用程序执行加入群组请求的权限?",
|
||||
"mpchange41": "群组名称: ",
|
||||
"mpchange42": "群组 ID: ",
|
||||
"mpchange43": "成功创建加入群组请求。",
|
||||
"mpchange44": "加入群组失败。",
|
||||
"mpchange45": "无法导出 MIME 类型。",
|
||||
"mpchange46": "无法导出文件扩展名。",
|
||||
"mpchange47": "用户拒绝下载。",
|
||||
"mpchange48": "无法启动下载。",
|
||||
"mpchange49": "无法部署 AT。",
|
||||
"mpchange50": "用户没有配置文件。",
|
||||
"mpchange51": "找不到请求的数据。",
|
||||
"mpchange52": "无法获取配置文件数据。",
|
||||
"mpchange53": "无法设置属性。",
|
||||
"mpchange54": "无法打开配置文件。",
|
||||
"mpchange55": "检索服务器信息时出错。",
|
||||
"mpchange56": "tx 活动摘要中出错。",
|
||||
"mpchange57": "获取国外费用时出错。",
|
||||
"mpchange58": "更新国外费用时出错。",
|
||||
"mpchange59": "获取服务器连接历史记录时出错。",
|
||||
"mpchange60": "设置当前服务器时出错。",
|
||||
"mpchange61": "添加服务器时出错。",
|
||||
"mpchange62": "删除服务器时出错。",
|
||||
"mpchange63": "检索摘要时出错。",
|
||||
"mpchange64": "无法解码交易。",
|
||||
"mpchange65": "您是否授予此应用程序签署和处理交易的权限?",
|
||||
"mpchange66": "您是否授予此应用程序签署交易的权限?",
|
||||
"mpchange67": "接受前请仔细阅读交易。",
|
||||
"mpchange68": "交易类型: ",
|
||||
"mpchange69": "交易数据: ",
|
||||
"mpchange70": "未请求处理交易。",
|
||||
"mpchange71": "已签名的字节为: ",
|
||||
"mpchange72": "交易已成功签名并处理。",
|
||||
"mpchange73": "无法处理交易。",
|
||||
"mpchange74": "无法获取 QORT 余额。重试!",
|
||||
"mpchange75": "无法发送硬币。",
|
||||
"mpchange76": "无法获取 BTC 余额。重试!",
|
||||
"mpchange77": "无法获取 LTC 余额。重试!",
|
||||
"mpchange78": "无法获取 DOGE 余额。重试!",
|
||||
"mpchange79": "无法获取 DGB 余额。重试!",
|
||||
"mpchange80": "无法获取 RVN 余额。重试!",
|
||||
"mpchange81": "无法获取 ARRR 余额。重试!",
|
||||
"mpchange82": "缺少字段",
|
||||
"mpchange83": "拒绝",
|
||||
"mpchange84": "失败",
|
||||
"mpchange85": "成功",
|
||||
"mpchange86": "始终允许自动获取钱包余额",
|
||||
"mpchange87": "请输入群组ID"
|
||||
}
|
||||
}
|
||||
|
@ -248,7 +248,9 @@
|
||||
"balance": "餘額",
|
||||
"balances": "您的錢包餘額",
|
||||
"update": "更新錢包餘額",
|
||||
"view": "看法"
|
||||
"view": "看法",
|
||||
"all": "全部",
|
||||
"page": "頁"
|
||||
},
|
||||
"gifs": {
|
||||
"gchange1": "Gif 瀏覽器",
|
||||
@ -466,7 +468,7 @@
|
||||
"rchange6": "接收者",
|
||||
"rchange7": "操作",
|
||||
"rchange8": "類型",
|
||||
"rchange9": "等級1-4只能創建個人鑄幣密鑰;等級5或以上可以創建贊助碼!",
|
||||
"rchange9": "等級0-4只能創建個人鑄幣密鑰;等級5或以上可以創建贊助碼!",
|
||||
"rchange10": "接收者的公共密鑰",
|
||||
"rchange11": "獎勵分享百分比",
|
||||
"rchange12": "正在添加中...",
|
||||
@ -740,7 +742,8 @@
|
||||
"bchange51": "要提交更改,請不要忘記點擊「更新個人資料」",
|
||||
"bchange52": "您是否授予此應用程式取得您的錢包資訊的權限?",
|
||||
"bchange53": "始終允許所有應用程式自動檢索您的好友清單",
|
||||
"bchange54": "您是否授予此應用程式存取您的好友清單的權限?"
|
||||
"bchange54": "您是否授予此應用程式存取您的好友清單的權限?",
|
||||
"bchange55": "您是否授予此應用程式發送此指令?"
|
||||
},
|
||||
"datapage": {
|
||||
"dchange1": "資料管理",
|
||||
@ -840,7 +843,7 @@
|
||||
"cchange74": "心情回應",
|
||||
"cchange75": "上傳附件。這可能需要一分鐘。",
|
||||
"cchange76": "正在刪除附件。這可能需要一分鐘。",
|
||||
"cchange77": "附件大小超過 1 MB",
|
||||
"cchange77": "附件大小超過 10 MB",
|
||||
"cchange78": "你確定要刪除這張圖片嗎?",
|
||||
"cchange79": "你確定要刪除這個附件嗎?",
|
||||
"cchange80": "這張圖片已被刪除",
|
||||
@ -853,7 +856,24 @@
|
||||
"cchange94": "已載入",
|
||||
"cchange95": "只有我的資源",
|
||||
"cchange96": "開啟群組管理",
|
||||
"cchange97": "加入群組連結已複製到剪貼簿"
|
||||
"cchange97": "加入群組連結已複製到剪貼簿",
|
||||
"cchange98": "正在上傳檔案。這可能需要幾分鐘。",
|
||||
"cchange99": "正在刪除檔案。這可能最多需要一分鐘。",
|
||||
"cchange100": "檔案大小超過 125 MB",
|
||||
"cchange101": "您確定要刪除此檔案嗎?",
|
||||
"cchange102": "該檔案已刪除",
|
||||
"cchange103": "正在上傳 gif。這最多可能需要一分鐘。",
|
||||
"cchange104": "正在刪除 gif。這可能最多需要一分鐘。",
|
||||
"cchange105": "檔案大小超過 3 MB",
|
||||
"cchange106": "您確定要刪除這個 gif 嗎?",
|
||||
"cchange107": "該動圖已刪除",
|
||||
"cchange108": "下載將在背景繼續,只能同時下載一個 Q-Chat 檔案。",
|
||||
"cchange109": "不支援檔案類型!",
|
||||
"cchange110": "圖片上傳",
|
||||
"cchange111": "GIF 上傳",
|
||||
"cchange112": "附件上傳",
|
||||
"cchange113": "檔案上傳",
|
||||
"cchange114": "寫點東西 ..."
|
||||
},
|
||||
"welcomepage": {
|
||||
"wcchange1": "歡迎來到 Q-Chat",
|
||||
@ -954,7 +974,10 @@
|
||||
"gchange65": "將此位址替換為組的 TRANSFER OWNERSHIP!",
|
||||
"gchange66": "無效的擁有者/新擁有者位址",
|
||||
"gchange67": "組更新成功!",
|
||||
"gchange68": "設置組頭像"
|
||||
"gchange68": "設置組頭像",
|
||||
"gchange69": "訊息",
|
||||
"gchange70": "過去 24 小時內沒有訊息!",
|
||||
"gchange71": "你已經加入這個群組了!"
|
||||
},
|
||||
"puzzlepage": {
|
||||
"pchange1": "益智游戲",
|
||||
@ -1297,5 +1320,104 @@
|
||||
"tour20": "落後了。您想刷新(引導)以加快同步過程嗎?",
|
||||
"tour21": "剩餘塊數。",
|
||||
"tour22": "已要求刷新(引導)。請稍候。"
|
||||
},
|
||||
"chatsettings": {
|
||||
"cs1": "聊天設定",
|
||||
"cs2": "常規聊天設定",
|
||||
"cs3": "聊天訊息時間戳",
|
||||
"cs4": "很久以前",
|
||||
"cs5": "當地時間",
|
||||
"cs6": "聊天訊息字體大小",
|
||||
"cs7": "標準",
|
||||
"cs8": "px"
|
||||
},
|
||||
"modals": {
|
||||
"mpchange1": "所有請求的 AT 都必須屬於同一個外部區塊鏈。",
|
||||
"mpchange2": "您是否授予此應用程式執行購買訂單的權限?",
|
||||
"mpchange3": "成功建立買入訂單",
|
||||
"mpchange4": "請等待購買訂單完成",
|
||||
"mpchange5": "提交購買訂單失敗。",
|
||||
"mpchange6": "您是否授予此應用程式執行賣單的權限?",
|
||||
"mpchange7": "對於:",
|
||||
"mpchange8": "成功建立賣單。",
|
||||
"mpchange9": "請等待賣單上市。",
|
||||
"mpchange10": "提交賣單失敗。",
|
||||
"mpchange11": "找不到 AT 訊息。",
|
||||
"mpchange12": "您是否授予此應用程式執行取消賣單的權限?",
|
||||
"mpchange13": "成功取消賣單。",
|
||||
"mpchange14": "請等待交易取消完成。",
|
||||
"mpchange15": "取消賣單失敗。",
|
||||
"mpchange16": "檢索清單時發生錯誤。",
|
||||
"mpchange17": "新增至清單時發生錯誤。",
|
||||
"mpchange18": "刪除清單時發生錯誤。",
|
||||
"mpchange19": "檢索好友清單時發生錯誤。",
|
||||
"mpchange20": "計數不是數字。",
|
||||
"mpchange21": "缺少計數。",
|
||||
"mpchange22": "未提交資料或檔案。",
|
||||
"mpchange23": "加密資料需要公鑰。",
|
||||
"mpchange24": "只有加密的資料才能進入私人服務。",
|
||||
"mpchange25": "由於加密失敗,上傳失敗。",
|
||||
"mpchange26": "上傳失敗。",
|
||||
"mpchange27": "資料無效。",
|
||||
"mpchange28": "沒有可發佈的資源。",
|
||||
"mpchange29": "未知錯誤。",
|
||||
"mpchange30": "未找到民調。",
|
||||
"mpchange31": "投票失敗。",
|
||||
"mpchange32": "建立投票失敗。",
|
||||
"mpchange33": "請輸入 qortal 連結 - qortal://...",
|
||||
"mpchange34": "qortal 連結無效。",
|
||||
"mpchange35": "推播通知時發生錯誤。",
|
||||
"mpchange36": "無法傳送訊息。",
|
||||
"mpchange37": "無法向該用戶發送加密訊息,因為他們沒有鏈上的公鑰。",
|
||||
"mpchange38": "無法滿足請求。",
|
||||
"mpchange39": "找不到群組。",
|
||||
"mpchange40": "您是否授予此應用程式執行加入群組請求的權限?",
|
||||
"mpchange41": "群組名稱:",
|
||||
"mpchange42": "群組 ID:",
|
||||
"mpchange43": "成功建立加入群組請求。",
|
||||
"mpchange44": "加入群組失敗。",
|
||||
"mpchange45": "無法派生 mime 類型。",
|
||||
"mpchange46": "無法匯出檔案副檔名。",
|
||||
"mpchange47": "使用者拒絕下載。",
|
||||
"mpchange48": "啟動下載失敗。",
|
||||
"mpchange49": "部署 AT 失敗。",
|
||||
"mpchange50": "使用者沒有個人資料。",
|
||||
"mpchange51": "找不到要求的資料。",
|
||||
"mpchange52": "取得個人資料資料失敗。",
|
||||
"mpchange53": "設定屬性失敗。",
|
||||
"mpchange54": "開啟個人資料失敗。",
|
||||
"mpchange55": "檢索伺服器資訊時發生錯誤。",
|
||||
"mpchange56": "交易活動摘要出錯。",
|
||||
"mpchange57": "取得國外費用時發生錯誤。",
|
||||
"mpchange58": "更新國外費用時發生錯誤。",
|
||||
"mpchange59": "取得伺服器連線歷史記錄時發生錯誤。",
|
||||
"mpchange60": "設定目前伺服器時發生錯誤。",
|
||||
"mpchange61": "新增伺服器時發生錯誤。",
|
||||
"mpchange62": "刪除伺服器時發生錯誤。",
|
||||
"mpchange63": "檢索摘要時發生錯誤。",
|
||||
"mpchange64": "無法解碼交易。",
|
||||
"mpchange65": "您是否授予此應用程式簽署和處理交易的權限?",
|
||||
"mpchange66": "您是否授予此應用程式簽署交易的權限?",
|
||||
"mpchange67": "接受前請仔細閱讀交易。",
|
||||
"mpchange68": "傳送類型:",
|
||||
"mpchange69": "傳送資料:",
|
||||
"mpchange70": "未要求處理事務。",
|
||||
"mpchange71": "有符號位元組是:",
|
||||
"mpchange72": "交易已成功簽署並處理。",
|
||||
"mpchange73": "交易無法處理。",
|
||||
"mpchange74": "取得 QORT 餘額失敗。請重試!",
|
||||
"mpchange75": "無法寄硬幣。",
|
||||
"mpchange76": "取得BTC餘額失敗,請重試!",
|
||||
"mpchange77": "取得 LTC 餘額失敗。請重試!",
|
||||
"mpchange78": "取得 DOGE 餘額失敗。請重試!",
|
||||
"mpchange79": "取得 DGB 餘額失敗。請重試!",
|
||||
"mpchange80": "取得 RVN 餘額失敗。請重試!",
|
||||
"mpchange81": "取得 ARRR 餘額失敗。請重試!",
|
||||
"mpchange82": "缺少欄位",
|
||||
"mpchange83": "拒絕",
|
||||
"mpchange84": "失敗",
|
||||
"mpchange85": "成功",
|
||||
"mpchange86": "隨時允許自動取得錢包餘額",
|
||||
"mpchange87": "請輸入群組 ID"
|
||||
}
|
||||
}
|
||||
|
@ -48,6 +48,8 @@ class LoginSection extends connect(store)(LitElement) {
|
||||
backedUpWalletJSON: { type: Object },
|
||||
backedUpSeedLoading: { type: Boolean },
|
||||
nodeConfig: { type: Object },
|
||||
names: { type: Array },
|
||||
namesAvatar: { type: String },
|
||||
theme: { type: String, reflect: true }
|
||||
}
|
||||
}
|
||||
@ -66,6 +68,8 @@ class LoginSection extends connect(store)(LitElement) {
|
||||
this.selectedWallet = {}
|
||||
this.loginErrorMessage = ''
|
||||
this.saveInBrowser = false
|
||||
this.names = []
|
||||
this.namesAvatar = ''
|
||||
this.theme = localStorage.getItem('qortalTheme') ? localStorage.getItem('qortalTheme') : 'light'
|
||||
|
||||
this.loginOptions = [
|
||||
@ -311,7 +315,7 @@ class LoginSection extends connect(store)(LitElement) {
|
||||
</div>
|
||||
<div page="unlockStored" id="unlockStoredPage">
|
||||
<div style="text-align:center;">
|
||||
<mwc-icon id='accountIcon' style="padding-bottom: 24px; color: var(--black);">account_circle</mwc-icon>
|
||||
${this.namesAvatar}
|
||||
<br>
|
||||
<span style="font-size:14px; font-weight: 100; font-family: 'Roboto Mono', monospace; color: var(--black);">${this.selectedWallet.address0}</span>
|
||||
</div>
|
||||
@ -417,9 +421,38 @@ class LoginSection extends connect(store)(LitElement) {
|
||||
return html`${translate("login.lp8")}`
|
||||
}
|
||||
|
||||
renderLoginAvatar(renderAddress) {
|
||||
const avatarNode = store.getState().app.nodeConfig.knownNodes[store.getState().app.nodeConfig.node]
|
||||
const avatarUrl = avatarNode.protocol + '://' + avatarNode.domain + ':' + avatarNode.port
|
||||
const namesUrl = `${avatarUrl}/names/address/${renderAddress}?limit=0&reverse=true`
|
||||
|
||||
this.namesAvatar = ''
|
||||
|
||||
if (this.isEmptyArray(this.names)) {
|
||||
fetch(namesUrl).then(response => {
|
||||
return response.json()
|
||||
}).then(data => {
|
||||
this.names = data
|
||||
if (this.isEmptyArray(this.names)) {
|
||||
this.namesAvatar = html`<mwc-icon id='accountIcon' style="padding-bottom: 24px; color: var(--black);">account_circle</mwc-icon>`
|
||||
} else {
|
||||
const url = `${avatarUrl}/arbitrary/THUMBNAIL/${this.names[0].name}/qortal_avatar?async=true`
|
||||
this.namesAvatar = html`
|
||||
<img style="width: 48px; height: 48px; border-radius: 25%; padding-bottom: 16px;" src="${url}" onerror="this.src='/img/incognito.png';" />
|
||||
<br>
|
||||
<span style="font-size:16px; font-weight: 400; font-family: 'Roboto Mono', monospace; color: var(--black);">${this.names[0].name}</span>
|
||||
<br>
|
||||
`
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
selectWallet(wallet) {
|
||||
this.selectedWallet = wallet
|
||||
this.selectedPage = 'unlockStored'
|
||||
this.names = []
|
||||
this.renderLoginAvatar(this.selectedWallet.address0)
|
||||
}
|
||||
|
||||
toDeleteWallet(deleteAddress) {
|
||||
@ -668,6 +701,11 @@ class LoginSection extends connect(store)(LitElement) {
|
||||
this.selectedPage = this.hasStoredWallets ? 'storedWallet' : 'loginOptions'
|
||||
this.shadowRoot.querySelector('#deleteWalletDialog').close()
|
||||
}
|
||||
|
||||
isEmptyArray(arr) {
|
||||
if (!arr) { return true }
|
||||
return arr.length === 0
|
||||
}
|
||||
}
|
||||
|
||||
window.customElements.define('login-section', LoginSection)
|
@ -18,7 +18,11 @@ import {
|
||||
setNewNotification,
|
||||
setNewTab,
|
||||
setSideEffectAction,
|
||||
setTabNotifications
|
||||
setTabNotifications,
|
||||
allowQAPPAutoBalance,
|
||||
removeQAPPAutoBalance,
|
||||
allowQAPPAutoTransactions,
|
||||
removeQAPPAutoTransactions
|
||||
} from '../../redux/app/app-actions'
|
||||
import settings from '../../functional-components/settings-page'
|
||||
import './welcome-page'
|
||||
@ -52,7 +56,11 @@ window.reduxAction = {
|
||||
allowQAPPAutoFriendsList: allowQAPPAutoFriendsList,
|
||||
removeQAPPAutoFriendsList: removeQAPPAutoFriendsList,
|
||||
allowShowSyncIndicator: allowShowSyncIndicator,
|
||||
removeShowSyncIndicator: removeShowSyncIndicator
|
||||
removeShowSyncIndicator: removeShowSyncIndicator,
|
||||
allowQAPPAutoBalance: allowQAPPAutoBalance,
|
||||
removeQAPPAutoBalance: removeQAPPAutoBalance,
|
||||
allowQAPPAutoTransactions: allowQAPPAutoTransactions,
|
||||
removeQAPPAutoTransactions: removeQAPPAutoTransactions
|
||||
}
|
||||
|
||||
const animationDuration = 0.7 // Seconds
|
||||
|
@ -48,6 +48,7 @@ class LogoutView extends connect(store)(LitElement) {
|
||||
}
|
||||
|
||||
async confirm(e) {
|
||||
localStorage.removeItem("symKeysCurrent")
|
||||
store.dispatch(doLogout())
|
||||
e.stopPropagation()
|
||||
}
|
||||
|
@ -20,7 +20,12 @@ class QortThemeToggle extends LitElement {
|
||||
|
||||
render() {
|
||||
return html`
|
||||
<input type="checkbox" @change=${() => this.toggleTheme()}/>
|
||||
<input
|
||||
type="checkbox"
|
||||
role="switch"
|
||||
aria-label="Dark theme"
|
||||
@change=${() => this.toggleTheme()}
|
||||
/>
|
||||
<div class="slider"></div>
|
||||
<div class="icon">
|
||||
<span class="sun">${svgSun}</span>
|
||||
|
@ -74,7 +74,7 @@ class SearchModal extends LitElement {
|
||||
openUserInfo() {
|
||||
const checkvalue = this.shadowRoot.getElementById('searchContent').value
|
||||
|
||||
if (checkvalue.length < 3) {
|
||||
if (checkvalue.length < 1) {
|
||||
let snackbar1string = get("publishpage.pchange20")
|
||||
let snackbar2string = get("welcomepage.wcchange4")
|
||||
|
||||
|
@ -8,7 +8,11 @@ import {
|
||||
removeQAPPAutoAuth,
|
||||
removeQAPPAutoFriendsList,
|
||||
removeQAPPAutoLists,
|
||||
setIsOpenDevDialog
|
||||
setIsOpenDevDialog,
|
||||
allowQAPPAutoBalance,
|
||||
removeQAPPAutoBalance,
|
||||
allowQAPPAutoTransactions,
|
||||
removeQAPPAutoTransactions
|
||||
} from '../../redux/app/app-actions'
|
||||
import { securityViewStyles } from '../../styles/core-css'
|
||||
import FileSaver from 'file-saver'
|
||||
@ -79,6 +83,18 @@ class SecurityView extends connect(store)(LitElement) {
|
||||
</label>
|
||||
<mwc-checkbox style="margin-right: -15px;" id="authButton" @click=${(e) => this.checkForAuth(e)} ?checked=${store.getState().app.qAPPAutoAuth}></mwc-checkbox>
|
||||
</div>
|
||||
<div class="checkbox-row">
|
||||
<label for="balanceButton" id="balanceButtonLabel" style="color: var(--black);">
|
||||
${get('modals.mpchange86')}
|
||||
</label>
|
||||
<mwc-checkbox style="margin-right: -15px;" id="balanceButton" @click=${(e) => this.checkForBalance(e)} ?checked=${store.getState().app.qAPPAutoBalance}></mwc-checkbox>
|
||||
</div>
|
||||
<div class="checkbox-row">
|
||||
<label for="transactionsButton" id="transactionsButtonLabel" style="color: var(--black);">
|
||||
Always allow wallet txs to be retrieved automatically
|
||||
</label>
|
||||
<mwc-checkbox style="margin-right: -15px;" id="transactionsButton" @click=${(e) => this.checkForTransactions(e)} ?checked=${store.getState().app.qAPPAutoTransactions}></mwc-checkbox>
|
||||
</div>
|
||||
<div class="checkbox-row">
|
||||
<label for="authButton" id="authButtonLabel" style="color: var(--black);">
|
||||
${get('browserpage.bchange39')}
|
||||
@ -108,6 +124,22 @@ class SecurityView extends connect(store)(LitElement) {
|
||||
}
|
||||
}
|
||||
|
||||
checkForBalance(e) {
|
||||
if (e.target.checked) {
|
||||
store.dispatch(removeQAPPAutoBalance(false))
|
||||
} else {
|
||||
store.dispatch(allowQAPPAutoBalance(true))
|
||||
}
|
||||
}
|
||||
|
||||
checkForTransactions(e) {
|
||||
if (e.target.checked) {
|
||||
store.dispatch(removeQAPPAutoTransactions(false))
|
||||
} else {
|
||||
store.dispatch(allowQAPPAutoTransactions(true))
|
||||
}
|
||||
}
|
||||
|
||||
checkForLists(e) {
|
||||
if (e.target.checked) {
|
||||
store.dispatch(removeQAPPAutoLists(false))
|
||||
|
@ -1225,6 +1225,34 @@ class NavBar extends connect(store)(LitElement) {
|
||||
|
||||
this.myMenuPlugins = JSON.parse(localStorage.getItem('myMenuPlugs') || '[]')
|
||||
} else {
|
||||
let newPluginMenu = JSON.parse(localStorage.getItem('myMenuPlugs') || '[]')
|
||||
|
||||
const oldQchat = 'messaging/q-chat/index.html'
|
||||
const newQchat = 'q-chat/index.html'
|
||||
const oldMinting = 'minting/index.html'
|
||||
const newMinting = 'minting-info/index.html'
|
||||
const oldWebsites = 'qdn/index.html'
|
||||
const newWebsites = 'q-website/index.html'
|
||||
const oldDatamanager = 'qdn/data-management/index.html'
|
||||
const newDatamanager = 'data-management/index.html'
|
||||
|
||||
// Check if local storage have broken links and replace them
|
||||
newPluginMenu.find(a => {
|
||||
if (a.page === oldQchat) {
|
||||
a.page = newQchat
|
||||
} else if (a.page === oldMinting) {
|
||||
a.page = newMinting
|
||||
} else if (a.page === oldWebsites) {
|
||||
a.page = newWebsites
|
||||
} else if (a.page === oldDatamanager) {
|
||||
a.page = newDatamanager
|
||||
} else {}
|
||||
})
|
||||
|
||||
localStorage.setItem('myMenuPlugs', JSON.stringify(newPluginMenu))
|
||||
|
||||
await appDelay(250)
|
||||
|
||||
this.myMenuPlugins = JSON.parse(localStorage.getItem('myMenuPlugs') || '[]')
|
||||
}
|
||||
}
|
||||
|
@ -86,5 +86,16 @@ export const defaultQappsTabs = [
|
||||
"pluginNumber": "plugin-GGHiHzW6pe",
|
||||
"menus": [],
|
||||
"parent": false
|
||||
},
|
||||
{
|
||||
"url": "myapp",
|
||||
"domain": "core",
|
||||
"page": "qdn/browser/index.html?name=Q-Mintership&service=APP",
|
||||
"title": "Q-Mintership",
|
||||
"icon": "vaadin:external-browser",
|
||||
"mwcicon": "apps",
|
||||
"pluginNumber": "plugin-GGJJPqW6pe",
|
||||
"menus": [],
|
||||
"parent": false
|
||||
}
|
||||
]
|
@ -24,6 +24,7 @@ const signArbitraryTransaction = api.signArbitraryTransaction
|
||||
const signArbitraryWithFeeTransaction = api.signArbitraryWithFeeTransaction
|
||||
const tradeBotCreateRequest = api.tradeBotCreateRequest
|
||||
const tradeBotRespondRequest = api.tradeBotRespondRequest
|
||||
const tradeBotRespondMultipleRequest = api.tradeBotRespondMultipleRequest
|
||||
const signTradeBotTxn = api.signTradeBotTxn
|
||||
const deleteTradeOffer = api.deleteTradeOffer
|
||||
const cancelAllOffers = api.cancelAllOffers
|
||||
@ -396,6 +397,21 @@ export const routes = {
|
||||
return response
|
||||
},
|
||||
|
||||
tradeBotRespondMultipleRequest: async (req) => {
|
||||
let response
|
||||
|
||||
try {
|
||||
response = await tradeBotRespondMultipleRequest(req.data)
|
||||
} catch (e) {
|
||||
console.error(e)
|
||||
console.error(e.message)
|
||||
|
||||
response = e.message
|
||||
}
|
||||
|
||||
return response
|
||||
},
|
||||
|
||||
deleteTradeOffer: async (req) => {
|
||||
let response
|
||||
|
||||
|
@ -24,7 +24,11 @@ import {
|
||||
ALLOW_QAPP_FRIENDS_LIST,
|
||||
REMOVE_QAPP_FRIENDS_LIST,
|
||||
ALLOW_SHOW_SYNC_INDICATOR,
|
||||
REMOVE_SHOW_SYNC_INDICATOR
|
||||
REMOVE_SHOW_SYNC_INDICATOR,
|
||||
ALLOW_QAPP_AUTO_BALANCE,
|
||||
REMOVE_QAPP_AUTO_BALANCE,
|
||||
ALLOW_QAPP_AUTO_TRANSACTIONS,
|
||||
REMOVE_QAPP_AUTO_TRANSACTIONS
|
||||
} from '../app-action-types'
|
||||
|
||||
export const doUpdateBlockInfo = (blockObj) => {
|
||||
@ -120,6 +124,34 @@ export const removeQAPPAutoAuth = (payload) => {
|
||||
}
|
||||
}
|
||||
|
||||
export const allowQAPPAutoBalance = (payload) => {
|
||||
return {
|
||||
type: ALLOW_QAPP_AUTO_BALANCE,
|
||||
payload
|
||||
}
|
||||
}
|
||||
|
||||
export const removeQAPPAutoBalance = (payload) => {
|
||||
return {
|
||||
type: REMOVE_QAPP_AUTO_BALANCE,
|
||||
payload
|
||||
}
|
||||
}
|
||||
|
||||
export const allowQAPPAutoTransactions = (payload) => {
|
||||
return {
|
||||
type: ALLOW_QAPP_AUTO_TRANSACTIONS,
|
||||
payload
|
||||
}
|
||||
}
|
||||
|
||||
export const removeQAPPAutoTransactions = (payload) => {
|
||||
return {
|
||||
type: REMOVE_QAPP_AUTO_TRANSACTIONS,
|
||||
payload
|
||||
}
|
||||
}
|
||||
|
||||
export const allowQAPPAutoLists = (payload) => {
|
||||
return {
|
||||
type: ALLOW_QAPP_AUTO_LISTS,
|
||||
|
@ -38,4 +38,8 @@ export const SET_COIN_BALANCES = 'SET_COIN_BALANCES'
|
||||
export const ALLOW_QAPP_FRIENDS_LIST = 'ALLOW_QAPP_FRIENDS_LIST'
|
||||
export const REMOVE_QAPP_FRIENDS_LIST = 'REMOVE_QAPP_FRIENDS_LIST'
|
||||
export const ALLOW_SHOW_SYNC_INDICATOR = 'ALLOW_SHOW_SYNC_INDICATOR'
|
||||
export const REMOVE_SHOW_SYNC_INDICATOR = 'REMOVE_SHOW_SYNC_INDICATOR'
|
||||
export const REMOVE_SHOW_SYNC_INDICATOR = 'REMOVE_SHOW_SYNC_INDICATOR'
|
||||
export const ALLOW_QAPP_AUTO_BALANCE = 'ALLOW_QAPP_AUTO_BALANCE'
|
||||
export const REMOVE_QAPP_AUTO_BALANCE = 'REMOVE_QAPP_AUTO_BALANCE'
|
||||
export const ALLOW_QAPP_AUTO_TRANSACTIONS = 'ALLOW_QAPP_AUTO_TRANSACTIONS'
|
||||
export const REMOVE_QAPP_AUTO_TRANSACTIONS = 'REMOVE_QAPP_AUTO_TRANSACTIONS'
|
||||
|
@ -40,7 +40,11 @@ import {
|
||||
ALLOW_QAPP_FRIENDS_LIST,
|
||||
REMOVE_QAPP_FRIENDS_LIST,
|
||||
ALLOW_SHOW_SYNC_INDICATOR,
|
||||
REMOVE_SHOW_SYNC_INDICATOR
|
||||
REMOVE_SHOW_SYNC_INDICATOR,
|
||||
ALLOW_QAPP_AUTO_BALANCE,
|
||||
REMOVE_QAPP_AUTO_BALANCE,
|
||||
ALLOW_QAPP_AUTO_TRANSACTIONS,
|
||||
REMOVE_QAPP_AUTO_TRANSACTIONS
|
||||
} from './app-action-types'
|
||||
import { initWorkersReducer } from './reducers/init-workers'
|
||||
import { loginReducer } from './reducers/login-reducer'
|
||||
@ -89,6 +93,8 @@ const INITIAL_STATE = {
|
||||
qAPPAutoLists: loadStateFromLocalStorage('qAPPAutoLists') || false,
|
||||
qAPPFriendsList: loadStateFromLocalStorage('qAPPFriendsList') || false,
|
||||
showSyncIndicator: loadStateFromLocalStorage('showSyncIndicator') || false,
|
||||
qAPPAutoBalance: loadStateFromLocalStorage('qAPPAutoBalance') || false,
|
||||
qAPPAutoTransactions: loadStateFromLocalStorage('qAPPAutoTransactions') || false,
|
||||
chatLastSeen: [],
|
||||
newTab: null,
|
||||
tabInfo: {},
|
||||
@ -251,6 +257,38 @@ export default (state = INITIAL_STATE, action) => {
|
||||
}
|
||||
}
|
||||
|
||||
case ALLOW_QAPP_AUTO_BALANCE: {
|
||||
saveStateToLocalStorage("qAPPAutoBalance", true)
|
||||
return {
|
||||
...state,
|
||||
qAPPAutoBalance: action.payload
|
||||
}
|
||||
}
|
||||
|
||||
case REMOVE_QAPP_AUTO_BALANCE: {
|
||||
saveStateToLocalStorage("qAPPAutoBalance", false)
|
||||
return {
|
||||
...state,
|
||||
qAPPAutoBalance: action.payload
|
||||
}
|
||||
}
|
||||
|
||||
case ALLOW_QAPP_AUTO_TRANSACTIONS: {
|
||||
saveStateToLocalStorage("qAPPAutoTransactions", true)
|
||||
return {
|
||||
...state,
|
||||
qAPPAutoTransactions: action.payload
|
||||
}
|
||||
}
|
||||
|
||||
case REMOVE_QAPP_AUTO_TRANSACTIONS: {
|
||||
saveStateToLocalStorage("qAPPAutoTransactions", false)
|
||||
return {
|
||||
...state,
|
||||
qAPPAutoTransactions: action.payload
|
||||
}
|
||||
}
|
||||
|
||||
case ALLOW_QAPP_AUTO_LISTS: {
|
||||
saveStateToLocalStorage("qAPPAutoLists", true)
|
||||
return {
|
||||
|
@ -6,6 +6,7 @@ const createTransaction = api.createTransaction
|
||||
const processTransaction = api.processTransaction
|
||||
const tradeBotCreateRequest = api.tradeBotCreateRequest
|
||||
const tradeBotRespondRequest = api.tradeBotRespondRequest
|
||||
const tradeBotRespondMultipleRequest = api.tradeBotRespondMultipleRequest
|
||||
const signTradeBotTxn = api.signTradeBotTxn
|
||||
const deleteTradeOffer = api.deleteTradeOffer
|
||||
const cancelAllOffers = api.cancelAllOffers
|
||||
@ -163,6 +164,21 @@ export const routes = {
|
||||
return response
|
||||
},
|
||||
|
||||
tradeBotRespondMultipleRequest: async (req) => {
|
||||
let response
|
||||
|
||||
try {
|
||||
response = await tradeBotRespondMultipleRequest(req.data)
|
||||
} catch (e) {
|
||||
console.error(e)
|
||||
console.error(e.message)
|
||||
|
||||
response = e.message
|
||||
}
|
||||
|
||||
return response
|
||||
},
|
||||
|
||||
deleteTradeOffer: async (req) => {
|
||||
let response
|
||||
|
||||
|
@ -1,6 +1,7 @@
|
||||
import { Sha256 } from 'asmcrypto.js'
|
||||
import Base58 from './api/deps/Base58'
|
||||
import Base64 from './api/deps/Base64'
|
||||
import Base64Message from './api/deps/Base64Message'
|
||||
import { base58PublicKeyToAddress } from './api/wallet/base58PublicKeyToAddress'
|
||||
import { validateAddress } from './api/wallet/validateAddress'
|
||||
import { decryptChatMessage, decryptChatMessageBase64 } from './api/transactions/chat/decryptChatMessage'
|
||||
@ -9,6 +10,7 @@ import _ from 'lodash'
|
||||
window.Sha256 = Sha256
|
||||
window.Base58 = Base58
|
||||
window.Base64 = Base64
|
||||
window.Base64Message = Base64Message
|
||||
window._ = _
|
||||
window.base58PublicKeyToAddress = base58PublicKeyToAddress
|
||||
window.validateAddress = validateAddress
|
||||
|
@ -1,5 +1,5 @@
|
||||
export { request } from './fetch-request'
|
||||
export { transactionTypes as transactions } from './transactions/transactions'
|
||||
export { processTransaction, processTransactionVersion2, createTransaction, computeChatNonce, signChatTransaction, signArbitraryTransaction, signArbitraryWithFeeTransaction } from './createTransaction'
|
||||
export { tradeBotCreateRequest, tradeBotRespondRequest, signTradeBotTxn, deleteTradeOffer, sendBtc, sendLtc, sendDoge, sendDgb, sendRvn, sendArrr } from './tradeRequest'
|
||||
export { tradeBotCreateRequest, tradeBotRespondRequest, tradeBotRespondMultipleRequest, signTradeBotTxn, deleteTradeOffer, sendBtc, sendLtc, sendDoge, sendDgb, sendRvn, sendArrr } from './tradeRequest'
|
||||
export { cancelAllOffers } from './transactions/trade-portal/tradeoffer/cancelAllOffers'
|
||||
|
92
crypto/api/deps/Base64Message.js
Normal file
92
crypto/api/deps/Base64Message.js
Normal file
@ -0,0 +1,92 @@
|
||||
import {
|
||||
uint8ArrayToBase64,
|
||||
base64ToUint8Array,
|
||||
uint8ArrayToObject,
|
||||
decryptSingle
|
||||
} from '../../../plugins/plugins/core/components/GroupEncryption.js'
|
||||
import {
|
||||
extensionToPointer,
|
||||
encodedToChar,
|
||||
embedToString,
|
||||
parseQortalLink
|
||||
} from '../../../plugins/plugins/core/components/qdn-action-constants.js'
|
||||
|
||||
const Base64Message = {}
|
||||
|
||||
Base64Message.decode = function (string, keys, ref) {
|
||||
let repliedToStr = ''
|
||||
let hubSpecialId = ''
|
||||
let hubMessageStr = ''
|
||||
let newMessageObject = ''
|
||||
let reactionStr = ''
|
||||
let messageUseEmbed = {}
|
||||
let editStr = false
|
||||
let embedFileStr = '"images":[""]'
|
||||
|
||||
const binaryString = atob(string)
|
||||
const binaryLength = binaryString.length
|
||||
const bytes = new Uint8Array(binaryLength)
|
||||
|
||||
for (let i = 0; i < binaryLength; i++) {
|
||||
bytes[i] = binaryString.charCodeAt(i)
|
||||
}
|
||||
|
||||
const decoder = new TextDecoder()
|
||||
const decodedString = decoder.decode(bytes)
|
||||
|
||||
if (decodedString.includes("messageText") || decodedString === "4001") {
|
||||
if (decodedString === "4001") {
|
||||
const firstString = 'First group key created.'
|
||||
const hubString = '{"messageText":{"type":"doc","content":[{"type":"paragraph","content":[{"type":"text","text":"' + firstString + '"}]}]},"images":[""],"repliedTo":"","version":3}'
|
||||
return hubString
|
||||
} else {
|
||||
return decodedString
|
||||
}
|
||||
} else {
|
||||
const res = decryptSingle(string, keys, false)
|
||||
|
||||
if (res === 'noKey' || res === 'decryptionFailed') {
|
||||
return '{"specialId":"","message":"<p>This message could not be decrypted</p>","repliedTo":"","isEdited":false,"isFromHub":true,"version": 3}'
|
||||
}
|
||||
|
||||
const decryptToUnit8Array = base64ToUint8Array(res)
|
||||
const responseData = uint8ArrayToObject(decryptToUnit8Array)
|
||||
|
||||
if (responseData.type === "edit") {
|
||||
editStr = true
|
||||
}
|
||||
|
||||
if (responseData.repliedTo) {
|
||||
repliedToStr = responseData.repliedTo
|
||||
}
|
||||
|
||||
if (responseData.specialId) {
|
||||
hubSpecialId = responseData.specialId
|
||||
}
|
||||
|
||||
if (responseData.type === "notification") {
|
||||
hubMessageStr = responseData.data.message
|
||||
} else if (ref !== "noref" && responseData.type === "reaction") {
|
||||
reactionStr = '"isReaction":true,'
|
||||
repliedToStr = ref
|
||||
hubMessageStr = responseData.content
|
||||
} else if (responseData.message.includes('qortal://use-embed/')) {
|
||||
const useEmbed1 = extensionToPointer(responseData.message)
|
||||
const useEmbed2 = /<newpointer>(.*?)<\/newpointer>/g.exec(useEmbed1)
|
||||
const useEmbed3 = encodedToChar(useEmbed2[1])
|
||||
messageUseEmbed = parseQortalLink(useEmbed3)
|
||||
embedFileStr = embedToString(messageUseEmbed)
|
||||
hubMessageStr = responseData.message.split(useEmbed2[1]).join('')
|
||||
} else {
|
||||
hubMessageStr = responseData.message
|
||||
}
|
||||
|
||||
const hubMessageFinal = hubMessageStr.split('"').join('"')
|
||||
|
||||
newMessageObject = '{"specialId":"' + hubSpecialId + '","message":"' + hubMessageFinal + '",' + embedFileStr + ',"repliedTo":"' + repliedToStr + '","isEdited":' + editStr + ',"isFromHub":true,' + reactionStr + '"version": 3}'
|
||||
|
||||
return newMessageObject
|
||||
}
|
||||
}
|
||||
|
||||
export default Base64Message
|
@ -4,6 +4,7 @@ import TradeBotRespondRequest from './transactions/trade-portal/tradebot/TradeBo
|
||||
import signTradeBotTransaction from './transactions/trade-portal/tradebot/signTradeBotTransaction'
|
||||
import DeleteTradeOffer from './transactions/trade-portal/tradeoffer/DeleteTradeOffer'
|
||||
import { request } from './fetch-request'
|
||||
import TradeBotRespondMultipleRequest from "./transactions/trade-portal/tradebot/TradeBotRespondMultipleRequest";
|
||||
|
||||
// TradeBotCreateRequest
|
||||
export const tradeBotCreateRequest = (requestObject) => {
|
||||
@ -35,6 +36,21 @@ export const tradeBotRespondRequest = (requestObject) => {
|
||||
})
|
||||
}
|
||||
|
||||
// TradeBotRespondRequest
|
||||
export const tradeBotRespondMultipleRequest = (requestObject) => {
|
||||
const txn = new TradeBotRespondMultipleRequest().createTransaction(requestObject)
|
||||
const myNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node]
|
||||
|
||||
return request(`/crosschain/tradebot/respondmultiple?apiKey=${myNode.apiKey}`, {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
'Accept': 'application/json',
|
||||
'Content-Type': 'application/json'
|
||||
},
|
||||
body: JSON.stringify(txn)
|
||||
})
|
||||
}
|
||||
|
||||
// Sign Trade Transactions
|
||||
export const signTradeBotTxn = (unsignedTxn, keyPair) => {
|
||||
return signTradeBotTransaction(unsignedTxn, keyPair)
|
||||
|
@ -50,5 +50,13 @@ export const decryptChatMessageBase64 = (encryptedMessage, privateKey, recipient
|
||||
return _decryptedMessage
|
||||
}
|
||||
|
||||
let decrypted1 = new TextDecoder('utf-8').decode(_decryptedMessage)
|
||||
|
||||
if (decrypted1.includes('messageText')) {
|
||||
let decrypted2 = JSON.parse(decrypted1)
|
||||
let decrypted3 = Object.assign(decrypted2, {isPrivate: true})
|
||||
return JSON.stringify(decrypted3)
|
||||
}
|
||||
|
||||
return new TextDecoder('utf-8').decode(_decryptedMessage)
|
||||
}
|
||||
|
@ -74,7 +74,7 @@ export default class CreatePollTransaction extends TransactionBase {
|
||||
|
||||
set rPollDesc(rPollDesc) {
|
||||
this._rPollDesc = rPollDesc
|
||||
this._rPollDescBytes = this.constructor.utils.stringtoUTF8Array(this._rPollDesc.toLocaleLowerCase())
|
||||
this._rPollDescBytes = this.constructor.utils.stringtoUTF8Array(this._rPollDesc)
|
||||
this._rPollDescLength = this.constructor.utils.int32ToBytes(this._rPollDescBytes.length)
|
||||
}
|
||||
|
||||
|
@ -0,0 +1,39 @@
|
||||
/**
|
||||
* CrossChain - TradeBot Respond Multiple Request (Buy Action)
|
||||
*
|
||||
* These are special types of transactions (JSON ENCODED)
|
||||
*/
|
||||
|
||||
export default class TradeBotRespondMultipleRequest {
|
||||
constructor() {
|
||||
// ...
|
||||
}
|
||||
|
||||
createTransaction(txnReq) {
|
||||
this.addresses(txnReq.addresses)
|
||||
this.foreignKey(txnReq.foreignKey)
|
||||
this.receivingAddress(txnReq.receivingAddress)
|
||||
|
||||
return this.txnRequest()
|
||||
}
|
||||
|
||||
addresses(addresses) {
|
||||
this._addresses = addresses
|
||||
}
|
||||
|
||||
foreignKey(foreignKey) {
|
||||
this._foreignKey = foreignKey
|
||||
}
|
||||
|
||||
receivingAddress(receivingAddress) {
|
||||
this._receivingAddress = receivingAddress
|
||||
}
|
||||
|
||||
txnRequest() {
|
||||
return {
|
||||
addresses: this._addresses,
|
||||
foreignKey: this._foreignKey,
|
||||
receivingAddress: this._receivingAddress
|
||||
}
|
||||
}
|
||||
}
|
@ -69,8 +69,6 @@ if (process.arch === 'arm') {
|
||||
} else {
|
||||
app.commandLine.appendSwitch('enable-experimental-web-platform-features')
|
||||
app.commandLine.appendSwitch('disable-renderer-backgrounding')
|
||||
app.commandLine.appendSwitch('disable-http-cache')
|
||||
app.commandLine.appendSwitch('disable-software-rasterizer')
|
||||
app.commandLine.appendSwitch('in-process-gpu')
|
||||
log.info('We are on 64bit. Hardware Acceleration is enabled !')
|
||||
}
|
||||
|
Before Width: | Height: | Size: 6.6 KiB After Width: | Height: | Size: 6.6 KiB |
BIN
img/file-icon.png
Normal file
BIN
img/file-icon.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 10 KiB |
BIN
img/img-loading.png
Normal file
BIN
img/img-loading.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 7.9 KiB |
BIN
img/minter.png
Normal file
BIN
img/minter.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 16 KiB |
6081
package-lock.json
generated
6081
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
60
package.json
60
package.json
@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "qortal-ui",
|
||||
"version": "4.5.2",
|
||||
"version": "4.6.1",
|
||||
"description": "Qortal Project - decentralize the world - Data storage, communications, web hosting, decentralized trading, complete infrastructure for the future blockchain-based Internet",
|
||||
"keywords": [
|
||||
"QORT",
|
||||
@ -27,17 +27,17 @@
|
||||
"build-electron": "electron-builder build --publish never",
|
||||
"deploy-electron": "electron-builder build --win --publish never",
|
||||
"release": "NODE_ENV=production electron-builder build --publish never",
|
||||
"publish": "electron-builder -p always",
|
||||
"lint": "eslint './**/*.{js,mjs}'"
|
||||
"publish": "electron-builder -p always"
|
||||
},
|
||||
"dependencies": {
|
||||
"@hapi/hapi": "21.3.9",
|
||||
"@hapi/hapi": "21.4.0",
|
||||
"@hapi/inert": "7.1.0",
|
||||
"@lit-labs/motion": "1.0.6",
|
||||
"@popperjs/core": "2.11.8",
|
||||
"@tiptap/core": "2.0.4",
|
||||
"@tiptap/extension-highlight": "2.0.4",
|
||||
"@tiptap/extension-image": "2.0.4",
|
||||
"@tiptap/extension-mention": "2.0.0",
|
||||
"@tiptap/extension-placeholder": "2.0.4",
|
||||
"@tiptap/extension-underline": "2.0.4",
|
||||
"@tiptap/html": "2.0.4",
|
||||
@ -48,34 +48,35 @@
|
||||
"buffer": "6.0.3",
|
||||
"compressorjs": "1.2.1",
|
||||
"crypto-js": "4.2.0",
|
||||
"driver.js": "1.3.1",
|
||||
"driver.js": "1.3.5",
|
||||
"electron-dl": "3.5.2",
|
||||
"electron-log": "5.1.4",
|
||||
"electron-log": "5.3.2",
|
||||
"electron-store": "8.2.0",
|
||||
"electron-updater": "6.1.8",
|
||||
"electron-updater": "6.3.9",
|
||||
"emoji-picker-js": "https://github.com/Qortal/emoji-picker-js",
|
||||
"extract-zip": "2.0.1",
|
||||
"jssha": "3.3.1",
|
||||
"localforage": "1.10.0",
|
||||
"lodash": "4.17.21",
|
||||
"os-locale": "5.0.0",
|
||||
"prosemirror-commands": "1.5.2",
|
||||
"prosemirror-commands": "1.7.0",
|
||||
"prosemirror-dropcursor": "1.8.1",
|
||||
"prosemirror-gapcursor": "1.3.2",
|
||||
"prosemirror-history": "1.4.0",
|
||||
"prosemirror-history": "1.4.1",
|
||||
"prosemirror-keymap": "1.2.2",
|
||||
"prosemirror-model": "1.21.0",
|
||||
"prosemirror-schema-list": "1.3.0",
|
||||
"prosemirror-model": "1.25.0",
|
||||
"prosemirror-schema-list": "1.5.1",
|
||||
"prosemirror-state": "1.4.3",
|
||||
"prosemirror-transform": "1.9.0",
|
||||
"prosemirror-view": "1.33.6",
|
||||
"sass": "1.77.1",
|
||||
"prosemirror-transform": "1.10.3",
|
||||
"prosemirror-view": "1.38.1",
|
||||
"sass": "1.77.6",
|
||||
"short-unique-id": "5.2.0",
|
||||
"xhr2": "0.2.1"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@babel/core": "7.24.5",
|
||||
"@electron/packager": "18.3.2",
|
||||
"@babel/core": "7.26.10",
|
||||
"@electron/notarize": "2.5.0",
|
||||
"@electron/packager": "18.3.6",
|
||||
"@material/mwc-button": "0.27.0",
|
||||
"@material/mwc-checkbox": "0.27.0",
|
||||
"@material/mwc-dialog": "0.27.0",
|
||||
@ -112,26 +113,25 @@
|
||||
"@polymer/paper-toast": "3.0.1",
|
||||
"@polymer/paper-tooltip": "3.0.1",
|
||||
"@qortal/rollup-plugin-web-worker-loader": "1.6.5",
|
||||
"@rollup/plugin-alias": "5.1.0",
|
||||
"@rollup/plugin-alias": "5.1.1",
|
||||
"@rollup/plugin-babel": "6.0.4",
|
||||
"@rollup/plugin-commonjs": "25.0.7",
|
||||
"@rollup/plugin-node-resolve": "15.2.3",
|
||||
"@rollup/plugin-replace": "5.0.5",
|
||||
"@rollup/plugin-commonjs": "28.0.3",
|
||||
"@rollup/plugin-node-resolve": "16.0.1",
|
||||
"@rollup/plugin-replace": "6.0.2",
|
||||
"@rollup/plugin-terser": "0.4.4",
|
||||
"@vaadin/avatar": "24.2.9",
|
||||
"@vaadin/button": "24.2.9",
|
||||
"@vaadin/grid": "24.2.9",
|
||||
"@vaadin/icons": "24.2.9",
|
||||
"@vaadin/password-field": "24.2.9",
|
||||
"@vaadin/tabs": "24.2.9",
|
||||
"@vaadin/tabsheet": "24.2.9",
|
||||
"@vaadin/tooltip": "24.2.9",
|
||||
"@zip.js/zip.js": "2.7.44",
|
||||
"axios": "1.6.8",
|
||||
"electron": "30.0.5",
|
||||
"electron-builder": "24.13.3",
|
||||
"@zip.js/zip.js": "2.7.57",
|
||||
"axios": "1.8.3",
|
||||
"electron": "32.3.1",
|
||||
"electron-builder": "25.1.8",
|
||||
"epml": "0.3.3",
|
||||
"eslint": "8.57.0",
|
||||
"eslint-plugin-lit": "1.13.0",
|
||||
"eslint-plugin-wc": "2.1.0",
|
||||
"file-saver": "2.0.5",
|
||||
"highcharts": "11.1.0",
|
||||
"html-escaper": "3.0.3",
|
||||
@ -141,13 +141,13 @@
|
||||
"pwa-helpers": "0.9.1",
|
||||
"redux": "5.0.1",
|
||||
"redux-thunk": "3.1.0",
|
||||
"rollup": "4.17.2",
|
||||
"rollup": "4.36.0",
|
||||
"rollup-plugin-node-globals": "1.4.0",
|
||||
"rollup-plugin-progress": "1.1.2",
|
||||
"rollup-plugin-scss": "3.0.0",
|
||||
"shelljs": "0.8.5"
|
||||
"shelljs": "0.9.2"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=20.11.1"
|
||||
"node": ">=20.16.0"
|
||||
}
|
||||
}
|
||||
|
20
plugins/plugins/core/components/ChatEmojiFlags.js
Normal file
20
plugins/plugins/core/components/ChatEmojiFlags.js
Normal file
@ -0,0 +1,20 @@
|
||||
import { supportsEmojiFlags } from './ChatTestEmojiFlags'
|
||||
|
||||
export function supportCountryFlagEmojis(fontName = "Twemoji Country Flags", fontUrl = "/font/TwemojiCountryFlags.woff2") {
|
||||
if (typeof window !== "undefined" && supportsEmojiFlags("😊") && !supportsEmojiFlags("🇨🇭")) {
|
||||
const style = document.createElement("style")
|
||||
|
||||
style.textContent = `@font-face {
|
||||
font-family: "${fontName}";
|
||||
unicode-range: U+1F1E6-1F1FF, U+1F3F4, U+E0062-E0063, U+E0065, U+E0067, U+E006C, U+E006E, U+E0073-E0074, U+E0077, U+E007F;
|
||||
src: url('${fontUrl}') format('woff2');
|
||||
font-display: swap;
|
||||
}`
|
||||
|
||||
document.head.appendChild(style)
|
||||
|
||||
return true
|
||||
}
|
||||
|
||||
return false
|
||||
}
|
@ -5,7 +5,7 @@ import localForage from 'localforage'
|
||||
import '@material/mwc-icon'
|
||||
|
||||
// Multi language support
|
||||
import { translate } from '../../../../core/translate'
|
||||
import { get, translate } from '../../../../core/translate'
|
||||
|
||||
const parentEpml = new Epml({ type: 'WINDOW', source: window.parent })
|
||||
|
||||
@ -66,6 +66,9 @@ class ChatHead extends LitElement {
|
||||
} else if (groupString === 'Group_1') {
|
||||
const avatarUrl = `/img/qdcgroup.png`
|
||||
this.avatarImg = this.createImage(avatarUrl)
|
||||
} else if (groupString === 'Group_694') {
|
||||
const avatarUrl = `/img/minter.png`
|
||||
this.avatarImg = this.createImage(avatarUrl)
|
||||
} else if (this.chatInfo.name) {
|
||||
const avatarUrl = `${nodeUrl}/arbitrary/THUMBNAIL/${this.chatInfo.name}/qortal_avatar?async=true`
|
||||
this.avatarImg = this.createImage(avatarUrl)
|
||||
@ -129,12 +132,24 @@ class ChatHead extends LitElement {
|
||||
>
|
||||
${this.chatInfo.groupName ? this.chatInfo.groupName : this.chatInfo.name !== undefined ? this.chatInfo.name : this.chatInfo.address.substr(0, 15)}
|
||||
</span>
|
||||
<mwc-icon style="font-size:18px; color: var(--chat-group);">${this.chatInfo.groupId !== undefined ? 'lock_open' : 'lock'}</mwc-icon>
|
||||
<mwc-icon
|
||||
style="font-size:18px; color:${
|
||||
this.chatInfo.groupId === undefined ? '#f0ad4e' :
|
||||
this.chatInfo.isOpen === false ? '#C6011F' :
|
||||
this.chatInfo.isOpen === true ? '#198754' : '#198754'}"
|
||||
>
|
||||
${
|
||||
this.chatInfo.groupId === undefined ? 'private_connectivity' :
|
||||
this.chatInfo.isOpen === false ? 'lock_outline' :
|
||||
this.chatInfo.isOpen === true ? 'lock_open' :
|
||||
'lock_open'
|
||||
}
|
||||
</mwc-icon>
|
||||
</div>
|
||||
</div>
|
||||
<div class="about" style="margin-top:7px">
|
||||
<div class="name">
|
||||
<span style="float:left; padding-left: 8px; color: var(--chat-group);font-size:12px">${this.chatInfo.groupId !== undefined ? 'id: ' + this.chatInfo.groupId : ''}</span>
|
||||
<span style="float:left; padding-left: 8px; color: var(--chat-group);font-size:12px">${this.chatInfo.groupId !== undefined ? 'id: ' + this.chatInfo.groupId : 'Private Chat'}</span>
|
||||
<div style="color: var(--black); display: flex;font-size: 12px; align-items:center">
|
||||
<div style="width: 8px; height: 8px;border-radius: 50%;background: ${isUnread ? 'var(--error)' : 'none'} ; margin-right:5px;"></div>
|
||||
<message-time style="display: ${(this.chatInfo.timestamp && this.chatInfo.timestamp > 100000) ? 'block' : 'none'}" timestamp=${this.chatInfo.timestamp}></message-time>
|
||||
|
230
plugins/plugins/core/components/ChatImageGif.js
Normal file
230
plugins/plugins/core/components/ChatImageGif.js
Normal file
@ -0,0 +1,230 @@
|
||||
import { html, LitElement } from 'lit'
|
||||
import { Epml } from '../../../epml'
|
||||
import { RequestQueueWithPromise } from '../../utils/classes'
|
||||
import { chatImageStyles } from './plugins-css'
|
||||
import axios from 'axios'
|
||||
|
||||
// Multi language support
|
||||
import { get, translate } from '../../../../core/translate'
|
||||
|
||||
const parentEpml = new Epml({ type: 'WINDOW', source: window.parent })
|
||||
|
||||
const requestQueue = new RequestQueueWithPromise(5)
|
||||
|
||||
export class ChatImageGif extends LitElement {
|
||||
static get properties() {
|
||||
return {
|
||||
resource: { type: Object },
|
||||
isReady: { type: Boolean },
|
||||
status: { type: Object },
|
||||
setOpenDialogGif: { attribute: false }
|
||||
}
|
||||
}
|
||||
|
||||
static get styles() {
|
||||
return [chatImageStyles]
|
||||
}
|
||||
|
||||
constructor() {
|
||||
super();
|
||||
this.resource = {
|
||||
identifier: '',
|
||||
name: '',
|
||||
service: ''
|
||||
}
|
||||
this.status = {
|
||||
status: ''
|
||||
}
|
||||
this.url = ''
|
||||
this.isReady = false
|
||||
this.nodeUrl = this.getNodeUrl()
|
||||
this.myNode = this.getMyNode()
|
||||
this.hasCalledWhenDownloaded = false
|
||||
this.isFetching = false
|
||||
this.observer = new IntersectionObserver(entries => {
|
||||
for (const entry of entries) {
|
||||
if (entry.isIntersecting && this.status.status !== 'READY') {
|
||||
this.fetchGif()
|
||||
this.observer.unobserve(this)
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
render() {
|
||||
|
||||
return html`
|
||||
<div class=${[`image-container`, this.status.status !== 'READY' ? 'defaultSize' : '', this.status.status !== 'READY' ? 'hideImg' : '',].join(' ')}>
|
||||
${this.status.status !== 'READY' ?
|
||||
html`
|
||||
<div style="display: flex; flex-direction: column; width:100%; height: 100%; justify-content: center; align-items: center; position: absolute;">
|
||||
<div class=${`smallLoading`}></div>
|
||||
<p style="color: var(--black)">${`${Math.round(this.status.percentLoaded || 0).toFixed(0)}% `}${translate('chatpage.cchange94')}</p>
|
||||
</div>
|
||||
`
|
||||
: ''
|
||||
}
|
||||
${this.status.status === 'READY' ?
|
||||
html`
|
||||
${this.createGif(this.url)}
|
||||
`
|
||||
: ''
|
||||
}
|
||||
</div>
|
||||
`
|
||||
}
|
||||
|
||||
firstUpdated() {
|
||||
this.observer.observe(this)
|
||||
}
|
||||
|
||||
createGif(gif) {
|
||||
const gifHTMLRes = new Image()
|
||||
gifHTMLRes.src = gif
|
||||
gifHTMLRes.style = 'max-width:45vh; max-height:40vh; border-radius: 5px; cursor: pointer;'
|
||||
gifHTMLRes.onclick = () => {this.setOpenDialogGif(true);}
|
||||
gifHTMLRes.onload = () => {this.isGifLoaded = true;}
|
||||
gifHTMLRes.onerror = () => {
|
||||
if (this.gifFetches < 4) {
|
||||
setTimeout(() => {
|
||||
this.gifFetches = this.gifFetches + 1
|
||||
gifHTMLRes.src = gif
|
||||
}, 10000)
|
||||
} else {
|
||||
gifHTMLRes.src = '/img/chain.png'
|
||||
gifHTMLRes.style = 'max-width:45vh; max-height:20vh; border-radius: 5px; filter: opacity(0.5);'
|
||||
gifHTMLRes.onclick = () => {}
|
||||
this.isGifLoaded = true
|
||||
}
|
||||
}
|
||||
return gifHTMLRes
|
||||
}
|
||||
|
||||
getNodeUrl() {
|
||||
const myNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node]
|
||||
const nodeUrl = myNode.protocol + '://' + myNode.domain + ':' + myNode.port
|
||||
return nodeUrl
|
||||
}
|
||||
|
||||
getMyNode() {
|
||||
const myNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node]
|
||||
return myNode
|
||||
}
|
||||
|
||||
async fetchResource() {
|
||||
try {
|
||||
if (this.isFetching) return
|
||||
this.isFetching = true
|
||||
await axios.get(`${this.nodeUrl}/arbitrary/resource/properties/${this.resource.service}/${this.resource.name}/${this.resource.identifier}`)
|
||||
this.isFetching = false
|
||||
} catch (error) {
|
||||
this.isFetching = false
|
||||
}
|
||||
}
|
||||
|
||||
async fetchGifUrl() {
|
||||
this.fetchResource()
|
||||
this.url = `${this.nodeUrl}/arbitrary/${this.resource.service}/${this.resource.name}/${this.resource.identifier}?async=true`
|
||||
}
|
||||
|
||||
async fetchStatus() {
|
||||
let isCalling = false
|
||||
let percentLoaded = 0
|
||||
let timer = 24
|
||||
|
||||
const response = await axios.get(`${this.nodeUrl}/arbitrary/resource/status/${this.resource.service}/${this.resource.name}/${this.resource.identifier}`)
|
||||
|
||||
if (response && response.data && response.data.status === 'READY') {
|
||||
this.status = response.data
|
||||
return
|
||||
}
|
||||
|
||||
const intervalId = setInterval(async () => {
|
||||
if (isCalling) return
|
||||
|
||||
isCalling = true
|
||||
|
||||
const data = await requestQueue.enqueue(() => {
|
||||
return axios.get(`${this.nodeUrl}/arbitrary/resource/status/${this.resource.service}/${this.resource.name}/${this.resource.identifier}`)
|
||||
})
|
||||
|
||||
const res = data.data
|
||||
|
||||
isCalling = false
|
||||
|
||||
if (res.localChunkCount) {
|
||||
if (res.percentLoaded) {
|
||||
if (res.percentLoaded === percentLoaded && res.percentLoaded !== 100) {
|
||||
timer = timer - 5
|
||||
} else {
|
||||
timer = 24
|
||||
}
|
||||
|
||||
if (timer < 0) {
|
||||
timer = 24
|
||||
|
||||
isCalling = true
|
||||
|
||||
this.status = {
|
||||
...res,
|
||||
status: 'REFETCHING'
|
||||
}
|
||||
|
||||
setTimeout(() => {
|
||||
isCalling = false
|
||||
this.fetchResource()
|
||||
}, 25000)
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
percentLoaded = res.percentLoaded
|
||||
}
|
||||
|
||||
this.status = res
|
||||
|
||||
if (this.status.status === 'DOWNLOADED') {
|
||||
this.fetchResource()
|
||||
}
|
||||
}
|
||||
|
||||
// check if progress is 100% and clear interval if true
|
||||
if (res.status === 'READY') {
|
||||
clearInterval(intervalId)
|
||||
this.status = res
|
||||
this.isReady = true
|
||||
}
|
||||
}, 5000) // 5 second interval
|
||||
}
|
||||
|
||||
async fetchGif() {
|
||||
try {
|
||||
this.fetchGifUrl({name: this.resource.name, service: this.resource.service, identifier: this.resource.identifier})
|
||||
this.fetchStatus()
|
||||
} catch (error) { /* empty */ }
|
||||
}
|
||||
|
||||
shouldUpdate(changedProperties) {
|
||||
if (changedProperties.has('setOpenDialogGif') && changedProperties.size === 1) {
|
||||
return false
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
// Standard functions
|
||||
getApiKey() {
|
||||
const myNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node]
|
||||
return myNode.apiKey
|
||||
}
|
||||
|
||||
isEmptyArray(arr) {
|
||||
if (!arr) { return true }
|
||||
return arr.length === 0
|
||||
}
|
||||
|
||||
round(number) {
|
||||
return (Math.round(parseFloat(number) * 1e8) / 1e8).toFixed(8)
|
||||
}
|
||||
}
|
||||
|
||||
window.customElements.define('chat-image-gif', ChatImageGif)
|
@ -20,7 +20,7 @@ class ChatModals extends LitElement {
|
||||
hidePrivateMessageModal: { type: Function },
|
||||
hideBlockUserModal: { type: Function },
|
||||
toblockaddress: { type: String, attribute: true },
|
||||
chatBlockedAdresses: { type: Array }
|
||||
chatBlockedAddresses: { type: Array }
|
||||
}
|
||||
}
|
||||
|
||||
@ -33,7 +33,7 @@ class ChatModals extends LitElement {
|
||||
this.isLoading = false
|
||||
this.hidePrivateMessageModal = () => { }
|
||||
this.hideBlockUserModal = () => { }
|
||||
this.chatBlockedAdresses = []
|
||||
this.chatBlockedAddresses = []
|
||||
}
|
||||
|
||||
render() {
|
||||
@ -313,11 +313,11 @@ class ChatModals extends LitElement {
|
||||
}, 500)
|
||||
}
|
||||
|
||||
async getChatBlockedAdresses() {
|
||||
const chatBlockedAdresses = await parentEpml.request('apiCall', {
|
||||
async getchatBlockedAddresses() {
|
||||
const chatBlockedAddresses = await parentEpml.request('apiCall', {
|
||||
url: `/lists/blockedAddresses?apiKey=${this.getApiKey()}`
|
||||
})
|
||||
this.chatBlockedAdresses = chatBlockedAdresses
|
||||
this.chatBlockedAddresses = chatBlockedAddresses
|
||||
}
|
||||
|
||||
async chatBlockAddress() {
|
||||
@ -339,8 +339,8 @@ class ChatModals extends LitElement {
|
||||
})
|
||||
|
||||
if (ret === true) {
|
||||
this.chatBlockedAdresses = this.chatBlockedAdresses.filter(item => item != address)
|
||||
this.chatBlockedAdresses.push(address)
|
||||
this.chatBlockedAddresses = this.chatBlockedAddresses.filter(item => item != address)
|
||||
this.chatBlockedAddresses.push(address)
|
||||
this.getChatBlockedList()
|
||||
this.hideBlockUserModal()
|
||||
let err1string = get("blockpage.bcchange2")
|
||||
|
File diff suppressed because it is too large
Load Diff
271
plugins/plugins/core/components/ChatRightPanelSettings.js
Normal file
271
plugins/plugins/core/components/ChatRightPanelSettings.js
Normal file
@ -0,0 +1,271 @@
|
||||
import { html, LitElement } from 'lit'
|
||||
import { Epml } from '../../../epml'
|
||||
import { chatRightPanelSettingsStyles } from './plugins-css'
|
||||
import './WrapperModal'
|
||||
import '@material/mwc-button'
|
||||
import '@material/mwc-icon'
|
||||
import '@vaadin/button'
|
||||
|
||||
// Multi language support
|
||||
import { translate } from '../../../../core/translate'
|
||||
|
||||
const parentEpml = new Epml({ type: 'WINDOW', source: window.parent })
|
||||
|
||||
class ChatRightPanelSettings extends LitElement {
|
||||
static get properties() {
|
||||
return {
|
||||
toggle: { attribute: false },
|
||||
agoTime: { type: Boolean },
|
||||
isoTime: { type: Boolean },
|
||||
bothTime: { type: Boolean },
|
||||
currentFontSize16: { type: Boolean },
|
||||
currentFontSize18: { type: Boolean },
|
||||
currentFontSize20: { type: Boolean },
|
||||
currentFontSize22: { type: Boolean } }
|
||||
}
|
||||
|
||||
static get styles() {
|
||||
return [chatRightPanelSettingsStyles]
|
||||
}
|
||||
|
||||
constructor() {
|
||||
super()
|
||||
this.agoTime = false
|
||||
this.isoTime = false
|
||||
this.bothTime = false
|
||||
this.currentFontSize16 = false
|
||||
this.currentFontSize18 = false
|
||||
this.currentFontSize20 = false
|
||||
this.currentFontSize22 = false
|
||||
}
|
||||
|
||||
render() {
|
||||
return html`
|
||||
<div class="container">
|
||||
<div class="close-row" style="margin-top: 15px">
|
||||
<vaadin-icon class="top-bar-icon" @click=${() => this.toggle(false)} style="margin: 0px 10px" icon="vaadin:close" slot="icon"></vaadin-icon>
|
||||
</div>
|
||||
<div class="container-body">
|
||||
<div style="margin-top: 5px;">
|
||||
<p class="group-name">${translate("chatsettings.cs2")}</p>
|
||||
<hr style="color: var(--black);">
|
||||
</div>
|
||||
<div class="group-info">
|
||||
<p class="group-description">${translate("chatsettings.cs3")}</p>
|
||||
<div class="checkbox-row">
|
||||
<label for="agoButton" id="agoButtonLabel" style="color: var(--black);">${translate("chatsettings.cs4")}</label>
|
||||
<mwc-checkbox
|
||||
style="margin-right: -15px;"
|
||||
id="agoButton"
|
||||
@click=${(e) => this.setAgo(e)}
|
||||
?checked=${this.agoTime}
|
||||
></mwc-checkbox>
|
||||
</div>
|
||||
<div class="checkbox-row" style="margin-top: -20px;">
|
||||
<label for="isoButton" id="isoButtonLabel" style="color: var(--black);">${translate("chatsettings.cs5")}</label>
|
||||
<mwc-checkbox
|
||||
style="margin-right: -15px;"
|
||||
id="agoButton"
|
||||
@click=${(e) => this.setIso(e)}
|
||||
?checked=${this.isoTime}
|
||||
></mwc-checkbox>
|
||||
</div>
|
||||
<div class="checkbox-row" style="margin-top: -20px;">
|
||||
<label for="bothButton" id="bothButtonLabel" style="color: var(--black);">${translate("chatsettings.cs5")} + ${translate("chatsettings.cs4")}</label>
|
||||
<mwc-checkbox
|
||||
style="margin-right: -15px;"
|
||||
id="agoButton"
|
||||
@click=${(e) => this.setBoth(e)}
|
||||
?checked=${this.bothTime}
|
||||
></mwc-checkbox>
|
||||
</div>
|
||||
</div>
|
||||
<div><hr style="color: var(--black);"></div>
|
||||
<div class="group-info">
|
||||
<p class="group-description">${translate("chatsettings.cs6")}</p>
|
||||
<div class="checkbox-row">
|
||||
<label for="font16Button" id="font16ButtonLabel" style="color: var(--black);">${translate("chatsettings.cs7")} 16${translate("chatsettings.cs8")}</label>
|
||||
<mwc-checkbox
|
||||
style="margin-right: -15px;"
|
||||
id="font16Button"
|
||||
@click=${(e) => this.setFont16(e)}
|
||||
?checked=${this.currentFontSize16}
|
||||
></mwc-checkbox>
|
||||
</div>
|
||||
<div class="checkbox-row" style="margin-top: -20px;">
|
||||
<label for="font18Button" id="font18ButtonLabel" style="color: var(--black);">18${translate("chatsettings.cs8")}</label>
|
||||
<mwc-checkbox
|
||||
style="margin-right: -15px;"
|
||||
id="font18Button"
|
||||
@click=${(e) => this.setFont18(e)}
|
||||
?checked=${this.currentFontSize18}
|
||||
></mwc-checkbox>
|
||||
<span style="color: var(--black)"> | </span>
|
||||
<label for="font24Button" id="font20ButtonLabel" style="color: var(--black);">20${translate("chatsettings.cs8")}</label>
|
||||
<mwc-checkbox
|
||||
style="margin-right: -15px;"
|
||||
id="font20Button"
|
||||
@click=${(e) => this.setFont20(e)}
|
||||
?checked=${this.currentFontSize20}
|
||||
></mwc-checkbox>
|
||||
<span style="color: var(--black)"> | </span>
|
||||
<label for="font22Button" id="font22ButtonLabel" style="color: var(--black);">22${translate("chatsettings.cs8")}</label>
|
||||
<mwc-checkbox
|
||||
style="margin-right: -15px;"
|
||||
id="font22Button"
|
||||
@click=${(e) => this.setFont22(e)}
|
||||
?checked=${this.currentFontSize22}
|
||||
></mwc-checkbox>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
`
|
||||
}
|
||||
|
||||
firstUpdated() {
|
||||
this.setTimeFormat()
|
||||
this.setFontFormat()
|
||||
}
|
||||
|
||||
setTimeFormat() {
|
||||
if (localStorage.getItem('timestampForChats') === 'ago') {
|
||||
this.agoTime = true
|
||||
this.isoTime = false
|
||||
this.bothTime = false
|
||||
} else if (localStorage.getItem('timestampForChats') === 'iso') {
|
||||
this.agoTime = false
|
||||
this.isoTime = true
|
||||
this.bothTime = false
|
||||
} else if (localStorage.getItem('timestampForChats') === 'both') {
|
||||
this.agoTime = false
|
||||
this.isoTime = false
|
||||
this.bothTime = true
|
||||
}
|
||||
}
|
||||
|
||||
setAgo(e) {
|
||||
if (!e.target.checked) {
|
||||
window.localStorage.setItem('timestampForChats', 'ago')
|
||||
window.dispatchEvent( new Event('storage') )
|
||||
this.setTimeFormat()
|
||||
} else {
|
||||
window.localStorage.setItem('timestampForChats', 'ago')
|
||||
window.dispatchEvent( new Event('storage') )
|
||||
this.setTimeFormat()
|
||||
}
|
||||
}
|
||||
|
||||
setIso(e) {
|
||||
if (!e.target.checked) {
|
||||
window.localStorage.setItem('timestampForChats', 'iso')
|
||||
window.dispatchEvent( new Event('storage') )
|
||||
this.setTimeFormat()
|
||||
} else {
|
||||
window.localStorage.setItem('timestampForChats', 'ago')
|
||||
window.dispatchEvent( new Event('storage') )
|
||||
this.setTimeFormat()
|
||||
}
|
||||
}
|
||||
|
||||
setBoth(e) {
|
||||
if (!e.target.checked) {
|
||||
window.localStorage.setItem('timestampForChats', 'both')
|
||||
window.dispatchEvent( new Event('storage') )
|
||||
this.setTimeFormat()
|
||||
} else {
|
||||
window.localStorage.setItem('timestampForChats', 'ago')
|
||||
window.dispatchEvent( new Event('storage') )
|
||||
this.setTimeFormat()
|
||||
}
|
||||
}
|
||||
|
||||
setFontFormat() {
|
||||
if (localStorage.getItem('fontsizeForChats') === 'font16') {
|
||||
this.currentFontSize16 = true
|
||||
this.currentFontSize18 = false
|
||||
this.currentFontSize20 = false
|
||||
this.currentFontSize22 = false
|
||||
} else if (localStorage.getItem('fontsizeForChats') === 'font18') {
|
||||
this.currentFontSize16 = false
|
||||
this.currentFontSize18 = true
|
||||
this.currentFontSize20 = false
|
||||
this.currentFontSize22 = false
|
||||
} else if (localStorage.getItem('fontsizeForChats') === 'font20') {
|
||||
this.currentFontSize16 = false
|
||||
this.currentFontSize18 = false
|
||||
this.currentFontSize20 = true
|
||||
this.currentFontSize22 = false
|
||||
} else if (localStorage.getItem('fontsizeForChats') === 'font22') {
|
||||
this.currentFontSize16 = false
|
||||
this.currentFontSize18 = false
|
||||
this.currentFontSize20 = false
|
||||
this.currentFontSize22 = true
|
||||
}
|
||||
}
|
||||
|
||||
setFont16(e) {
|
||||
if (!e.target.checked) {
|
||||
window.localStorage.setItem('fontsizeForChats', 'font16')
|
||||
window.dispatchEvent( new Event('storage') )
|
||||
this.setFontFormat()
|
||||
} else {
|
||||
window.localStorage.setItem('fontsizeForChats', 'font16')
|
||||
window.dispatchEvent( new Event('storage') )
|
||||
this.setFontFormat()
|
||||
}
|
||||
}
|
||||
|
||||
setFont18(e) {
|
||||
if (!e.target.checked) {
|
||||
window.localStorage.setItem('fontsizeForChats', 'font18')
|
||||
window.dispatchEvent( new Event('storage') )
|
||||
this.setFontFormat()
|
||||
} else {
|
||||
window.localStorage.setItem('fontsizeForChats', 'font16')
|
||||
window.dispatchEvent( new Event('storage') )
|
||||
this.setFontFormat()
|
||||
}
|
||||
}
|
||||
|
||||
setFont20(e) {
|
||||
if (!e.target.checked) {
|
||||
window.localStorage.setItem('fontsizeForChats', 'font20')
|
||||
window.dispatchEvent( new Event('storage') )
|
||||
this.setFontFormat()
|
||||
} else {
|
||||
window.localStorage.setItem('fontsizeForChats', 'font16')
|
||||
window.dispatchEvent( new Event('storage') )
|
||||
this.setFontFormat()
|
||||
}
|
||||
}
|
||||
|
||||
setFont22(e) {
|
||||
if (!e.target.checked) {
|
||||
window.localStorage.setItem('fontsizeForChats', 'font22')
|
||||
window.dispatchEvent( new Event('storage') )
|
||||
this.setFontFormat()
|
||||
} else {
|
||||
window.localStorage.setItem('fontsizeForChats', 'font16')
|
||||
window.dispatchEvent( new Event('storage') )
|
||||
this.setFontFormat()
|
||||
}
|
||||
}
|
||||
|
||||
// Standard functions
|
||||
getApiKey() {
|
||||
const myNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node]
|
||||
return myNode.apiKey
|
||||
}
|
||||
|
||||
isEmptyArray(arr) {
|
||||
if (!arr) { return true }
|
||||
return arr.length === 0
|
||||
}
|
||||
|
||||
round(number) {
|
||||
return (Math.round(parseFloat(number) * 1e8) / 1e8).toFixed(8)
|
||||
}
|
||||
}
|
||||
|
||||
window.customElements.define('chat-right-panel-settings', ChatRightPanelSettings)
|
File diff suppressed because it is too large
Load Diff
32
plugins/plugins/core/components/ChatTestEmojiFlags.js
Normal file
32
plugins/plugins/core/components/ChatTestEmojiFlags.js
Normal file
@ -0,0 +1,32 @@
|
||||
const FONT_FAMILY = '"Twemoji Mozilla","Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji","EmojiOne Color","Android Emoji",sans-serif'
|
||||
|
||||
function makeCtx() {
|
||||
const canvas = document.createElement("canvas")
|
||||
canvas.width = canvas.height = 1
|
||||
|
||||
const ctx = canvas.getContext("2d", { willReadFrequently: true })
|
||||
|
||||
ctx.textBaseline = "top"
|
||||
ctx.font = `100px ${FONT_FAMILY}`
|
||||
ctx.scale(0.01, 0.01)
|
||||
|
||||
return ctx
|
||||
}
|
||||
|
||||
function getColor(ctx, text, color) {
|
||||
ctx.clearRect(0, 0, 100, 100)
|
||||
ctx.fillStyle = color
|
||||
ctx.fillText(text, 0, 0)
|
||||
|
||||
const bytes = ctx.getImageData(0, 0, 1, 1).data
|
||||
|
||||
return bytes.join(",")
|
||||
}
|
||||
|
||||
export function supportsEmojiFlags(text) {
|
||||
const ctx = makeCtx()
|
||||
const white = getColor(ctx, text, "#fff")
|
||||
const black = getColor(ctx, text, "#000")
|
||||
|
||||
return black === white && !black.startsWith("0,0,0,")
|
||||
}
|
@ -135,14 +135,18 @@ class ChatTextEditor extends LitElement {
|
||||
this.insertFile(e.target.files[0])
|
||||
const filePickerInput = this.shadowRoot.getElementById('file-picker')
|
||||
if (filePickerInput) {
|
||||
filePickerInput.value = ""
|
||||
filePickerInput.value = ''
|
||||
}
|
||||
}}"
|
||||
id="file-picker"
|
||||
class="file-picker-input"
|
||||
type="file"
|
||||
name="myImage"
|
||||
accept="image/*, .doc, .docx, .pdf, .zip, .pdf, .txt, .odt, .ods, .xls, .xlsx, .ppt, .pptx"
|
||||
accept="
|
||||
image/*, .doc, .docx, .zip, .pdf, .txt, .odt, .ods, .html,
|
||||
.xls, .xlsx, .ppt, .pptx, .jar, .gzip, .exe, .deb, .rar, .log,
|
||||
.sh, .dmg, .pkg, .7z, .gz, .psd, .mp4, .rpm, .snap, .AppImage
|
||||
"
|
||||
>
|
||||
</div>
|
||||
</div>
|
||||
@ -163,7 +167,13 @@ class ChatTextEditor extends LitElement {
|
||||
}
|
||||
</div>
|
||||
` : html`
|
||||
<div style="margin-bottom: 10px; ${(this.iframeId === 'newChat' || this.iframeId === "newAttachmentChat") ? 'display: none;' : 'display: flex;'}">
|
||||
<div style="margin-bottom: 10px; ${(
|
||||
this.iframeId === 'newChat'
|
||||
|| this.iframeId === "newImageChat"
|
||||
|| this.iframeId === "newGifChat"
|
||||
|| this.iframeId === "newAttachmentChat"
|
||||
|| this.iframeId === "newFileChat"
|
||||
) ? 'display: none;' : 'display: flex;'}">
|
||||
${this.isLoading === false
|
||||
? html`
|
||||
<img src="/img/qchat-send-message-icon.svg" alt="send-icon" class="send-icon" @click=${() => {this.sendMessageFunc(this.messageQueue)}}>
|
||||
@ -295,7 +305,7 @@ class ChatTextEditor extends LitElement {
|
||||
}
|
||||
|
||||
sendMessageFunc(props) {
|
||||
if (this.editor.isEmpty && (this.iframeId !== 'newChat' && this.iframeId !== 'newAttachmentChat')) return
|
||||
if (this.editor.isEmpty && (this.iframeId !== 'newChat' && this.iframeId !== 'newGifChat' && this.iframeId !== 'newAttachmentChat' && this.iframeId !== 'newFileChat')) return
|
||||
|
||||
this.getMessageSize(this.editor.getJSON())
|
||||
|
||||
@ -351,18 +361,42 @@ class ChatTextEditor extends LitElement {
|
||||
repliedTo: '',
|
||||
version: 3
|
||||
}
|
||||
} else if (this.gifFile && this.iframeId === 'newGifChat') {
|
||||
messageObject = {
|
||||
messageText: trimmedMessage,
|
||||
images: [{
|
||||
service: "IMAGE",
|
||||
name: '123456789123456789123456789',
|
||||
identifier: '123456'
|
||||
}],
|
||||
repliedTo: '',
|
||||
version: 3
|
||||
}
|
||||
} else if (this.attachment && this.iframeId === 'newAttachmentChat') {
|
||||
messageObject = {
|
||||
messageText: trimmedMessage,
|
||||
attachments: [{
|
||||
service: "QCHAT_ATTACHMENT",
|
||||
service: "ATTACHMENT",
|
||||
name: '123456789123456789123456789',
|
||||
identifier: '123456',
|
||||
attachmentName: "123456789123456789123456789",
|
||||
attachmentSize: "123456"
|
||||
}],
|
||||
repliedTo: '',
|
||||
version: 2
|
||||
version: 3
|
||||
}
|
||||
} else if (this.appFile && this.iframeId === 'newFileChat') {
|
||||
messageObject = {
|
||||
messageText: trimmedMessage,
|
||||
files: [{
|
||||
service: "FILE",
|
||||
name: '123456789123456789123456789',
|
||||
identifier: '123456',
|
||||
appFileName: "123456789123456789123456789",
|
||||
appFileSize: "123456"
|
||||
}],
|
||||
repliedTo: '',
|
||||
version: 3
|
||||
}
|
||||
} else {
|
||||
messageObject = {
|
||||
|
644
plugins/plugins/core/components/GroupEncryption.js
Normal file
644
plugins/plugins/core/components/GroupEncryption.js
Normal file
@ -0,0 +1,644 @@
|
||||
import Base58 from '../../../../crypto/api/deps/Base58'
|
||||
import ed2curve from '../../../../crypto/api/deps/ed2curve'
|
||||
import nacl from '../../../../crypto/api/deps/nacl-fast'
|
||||
|
||||
export function base64ToUint8Array(base64) {
|
||||
const binaryString = atob(base64)
|
||||
const len = binaryString.length
|
||||
const bytes = new Uint8Array(len)
|
||||
|
||||
for (let i = 0; i < len; i++) {
|
||||
bytes[i] = binaryString.charCodeAt(i)
|
||||
}
|
||||
|
||||
return bytes
|
||||
}
|
||||
|
||||
export function uint8ArrayToBase64(uint8Array) {
|
||||
const length = uint8Array.length
|
||||
let binaryString = ''
|
||||
// Process 1MB at a time
|
||||
const chunkSize = 1024 * 1024
|
||||
|
||||
for (let i = 0; i < length; i += chunkSize) {
|
||||
const chunkEnd = Math.min(i + chunkSize, length)
|
||||
const chunk = uint8Array.subarray(i, chunkEnd)
|
||||
binaryString += Array.from(chunk, byte => String.fromCharCode(byte)).join('')
|
||||
}
|
||||
|
||||
return btoa(binaryString)
|
||||
}
|
||||
|
||||
export function objectToBase64(obj) {
|
||||
// Step 1: Convert the object to a JSON string
|
||||
const jsonString = JSON.stringify(obj)
|
||||
|
||||
// Step 2: Create a Blob from the JSON string
|
||||
const blob = new Blob([jsonString], { type: 'application/json' })
|
||||
|
||||
// Step 3: Create a FileReader to read the Blob as a base64-encoded string
|
||||
return new Promise((resolve, reject) => {
|
||||
const reader = new FileReader()
|
||||
reader.onloadend = () => {
|
||||
if (typeof reader.result === 'string') {
|
||||
// Remove 'data:application/json;base64,' prefix
|
||||
const base64 = reader.result.replace(
|
||||
'data:application/json;base64,',
|
||||
''
|
||||
)
|
||||
resolve(base64)
|
||||
} else {
|
||||
reject(new Error('Failed to read the Blob as a base64-encoded string'))
|
||||
}
|
||||
}
|
||||
reader.onerror = () => {
|
||||
reject(reader.error)
|
||||
}
|
||||
reader.readAsDataURL(blob)
|
||||
})
|
||||
}
|
||||
|
||||
export function uint8ArrayToObject(uint8Array) {
|
||||
// Decode the byte array using TextDecoder
|
||||
const decoder = new TextDecoder()
|
||||
const jsonString = decoder.decode(uint8Array)
|
||||
|
||||
// Convert the JSON string back into an object
|
||||
return JSON.parse(jsonString)
|
||||
}
|
||||
|
||||
export function validateSecretKey(obj) {
|
||||
// Check if the input is an object
|
||||
if (typeof obj !== "object" || obj === null) {
|
||||
return false
|
||||
}
|
||||
|
||||
// Iterate over each key in the object
|
||||
for (let key in obj) {
|
||||
// Ensure the key is a string representation of a positive integer
|
||||
if (!/^\d+$/.test(key)) {
|
||||
return false
|
||||
}
|
||||
|
||||
// Get the corresponding value for the key
|
||||
const value = obj[key]
|
||||
|
||||
// Check that value is an object and not null
|
||||
if (typeof value !== "object" || value === null) {
|
||||
return false
|
||||
}
|
||||
|
||||
// Check for messageKey
|
||||
if (!value.hasOwnProperty("messageKey")) {
|
||||
return false
|
||||
}
|
||||
|
||||
// Ensure messageKey and nonce are non-empty strings
|
||||
if (typeof value.messageKey !== "string" || value.messageKey.trim() === "") {
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
// If all checks passed, return true
|
||||
return true
|
||||
}
|
||||
|
||||
// Function to create a symmetric key and nonce
|
||||
export const createSymmetricKeyAndNonce = () => {
|
||||
// 32 bytes for the symmetric key
|
||||
const messageKey = new Uint8Array(32)
|
||||
crypto.getRandomValues(messageKey)
|
||||
|
||||
return { messageKey: uint8ArrayToBase64(messageKey)}
|
||||
}
|
||||
|
||||
export const encryptDataGroup = (data64, publicKeys, privateKey, userPublicKey, customSymmetricKey) => {
|
||||
let combinedPublicKeys = [...publicKeys, userPublicKey]
|
||||
|
||||
const decodedPrivateKey = Base58.decode(privateKey)
|
||||
const publicKeysDuplicateFree = [...new Set(combinedPublicKeys)]
|
||||
const Uint8ArrayData = base64ToUint8Array(data64)
|
||||
|
||||
if (!(Uint8ArrayData instanceof Uint8Array)) {
|
||||
throw new Error("The Uint8ArrayData you've submitted is invalid")
|
||||
}
|
||||
|
||||
try {
|
||||
// Generate a random symmetric key for the message.
|
||||
let messageKey
|
||||
|
||||
if(customSymmetricKey){
|
||||
messageKey = base64ToUint8Array(customSymmetricKey)
|
||||
} else {
|
||||
messageKey = new Uint8Array(32)
|
||||
crypto.getRandomValues(messageKey)
|
||||
}
|
||||
|
||||
if(!messageKey) throw new Error('Cannot create symmetric key')
|
||||
|
||||
const nonce = new Uint8Array(24)
|
||||
|
||||
crypto.getRandomValues(nonce)
|
||||
|
||||
// Encrypt the data with the symmetric key.
|
||||
const encryptedData = nacl.secretbox(Uint8ArrayData, nonce, messageKey)
|
||||
|
||||
// Generate a keyNonce outside of the loop.
|
||||
const keyNonce = new Uint8Array(24)
|
||||
crypto.getRandomValues(keyNonce)
|
||||
|
||||
// Encrypt the symmetric key for each recipient.
|
||||
let encryptedKeys = []
|
||||
|
||||
publicKeysDuplicateFree.forEach((recipientPublicKey) => {
|
||||
const publicKeyUnit8Array = Base58.decode(recipientPublicKey)
|
||||
const convertedPrivateKey = ed2curve.convertSecretKey(decodedPrivateKey)
|
||||
const convertedPublicKey = ed2curve.convertPublicKey(publicKeyUnit8Array)
|
||||
const sharedSecret = new Uint8Array(32)
|
||||
|
||||
// the length of the sharedSecret will be 32 + 16
|
||||
// When you're encrypting data using nacl.secretbox, it's adding an authentication tag to the result, which is 16 bytes long. This tag is used for verifying the integrity and authenticity of the data when it is decrypted
|
||||
nacl.lowlevel.crypto_scalarmult(sharedSecret, convertedPrivateKey, convertedPublicKey)
|
||||
|
||||
// Encrypt the symmetric key with the shared secret.
|
||||
const encryptedKey = nacl.secretbox(messageKey, keyNonce, sharedSecret)
|
||||
|
||||
encryptedKeys.push(encryptedKey)
|
||||
})
|
||||
|
||||
const str = "qortalGroupEncryptedData"
|
||||
const strEncoder = new TextEncoder()
|
||||
const strUint8Array = strEncoder.encode(str)
|
||||
|
||||
// Convert sender's public key to Uint8Array and add to the message
|
||||
const senderPublicKeyUint8Array = Base58.decode(userPublicKey)
|
||||
|
||||
// Combine all data into a single Uint8Array.
|
||||
// Calculate size of combinedData
|
||||
let combinedDataSize = strUint8Array.length + nonce.length + keyNonce.length + senderPublicKeyUint8Array.length + encryptedData.length + 4
|
||||
let encryptedKeysSize = 0
|
||||
|
||||
encryptedKeys.forEach((key) => {
|
||||
encryptedKeysSize += key.length
|
||||
})
|
||||
|
||||
combinedDataSize += encryptedKeysSize
|
||||
let combinedData = new Uint8Array(combinedDataSize)
|
||||
combinedData.set(strUint8Array)
|
||||
combinedData.set(nonce, strUint8Array.length)
|
||||
combinedData.set(keyNonce, strUint8Array.length + nonce.length)
|
||||
combinedData.set(senderPublicKeyUint8Array, strUint8Array.length + nonce.length + keyNonce.length)
|
||||
combinedData.set(encryptedData, strUint8Array.length + nonce.length + keyNonce.length + senderPublicKeyUint8Array.length)
|
||||
|
||||
// Initialize offset for encryptedKeys
|
||||
let encryptedKeysOffset = strUint8Array.length + nonce.length + keyNonce.length + senderPublicKeyUint8Array.length + encryptedData.length
|
||||
|
||||
encryptedKeys.forEach((key) => {
|
||||
combinedData.set(key, encryptedKeysOffset)
|
||||
encryptedKeysOffset += key.length
|
||||
})
|
||||
|
||||
const countArray = new Uint8Array(new Uint32Array([publicKeysDuplicateFree.length]).buffer)
|
||||
combinedData.set(countArray, combinedData.length - 4)
|
||||
|
||||
return uint8ArrayToBase64(combinedData)
|
||||
} catch (error) {
|
||||
console.log('error', error)
|
||||
throw new Error("Error in encrypting data")
|
||||
}
|
||||
}
|
||||
|
||||
export const encryptSingle = async (data64, secretKeyObject, typeNumber = 2) => {
|
||||
// Find the highest key in the secretKeyObject
|
||||
const highestKey = Math.max(...Object.keys(secretKeyObject).filter(item => !isNaN(+item)).map(Number))
|
||||
const highestKeyObject = secretKeyObject[highestKey]
|
||||
|
||||
// Convert data and keys from base64
|
||||
const Uint8ArrayData = base64ToUint8Array(data64)
|
||||
const messageKey = base64ToUint8Array(highestKeyObject.messageKey)
|
||||
|
||||
if (!(Uint8ArrayData instanceof Uint8Array)) {
|
||||
throw new Error("The Uint8ArrayData you've submitted is invalid")
|
||||
}
|
||||
|
||||
let nonce, encryptedData, encryptedDataBase64, finalEncryptedData
|
||||
|
||||
// Convert type number to a fixed length of 3 digits
|
||||
const typeNumberStr = typeNumber.toString().padStart(3, '0')
|
||||
|
||||
if (highestKeyObject.nonce) {
|
||||
// Old format: Use the nonce from secretKeyObject
|
||||
nonce = base64ToUint8Array(highestKeyObject.nonce)
|
||||
|
||||
// Encrypt the data with the existing nonce and message key
|
||||
encryptedData = nacl.secretbox(Uint8ArrayData, nonce, messageKey)
|
||||
encryptedDataBase64 = uint8ArrayToBase64(encryptedData)
|
||||
|
||||
// Concatenate the highest key, type number, and encrypted data (old format)
|
||||
// Fixed length of 10 digits
|
||||
const highestKeyStr = highestKey.toString().padStart(10, '0')
|
||||
finalEncryptedData = btoa(highestKeyStr + encryptedDataBase64)
|
||||
} else {
|
||||
// New format: Generate a random nonce and embed it in the message
|
||||
// 24 bytes for the nonce
|
||||
nonce = new Uint8Array(24)
|
||||
crypto.getRandomValues(nonce)
|
||||
|
||||
// Encrypt the data with the new nonce and message key
|
||||
encryptedData = nacl.secretbox(Uint8ArrayData, nonce, messageKey)
|
||||
encryptedDataBase64 = uint8ArrayToBase64(encryptedData)
|
||||
|
||||
// Convert the nonce to base64
|
||||
const nonceBase64 = uint8ArrayToBase64(nonce)
|
||||
|
||||
// Concatenate the highest key, type number, nonce, and encrypted data (new format)
|
||||
// Fixed length of 10 digits
|
||||
const highestKeyStr = highestKey.toString().padStart(10, '0')
|
||||
const highestKeyBytes = new TextEncoder().encode(highestKeyStr.padStart(10, '0'))
|
||||
const typeNumberBytes = new TextEncoder().encode(typeNumberStr.padStart(3, '0'))
|
||||
|
||||
// Step 3: Concatenate all binary
|
||||
const combinedBinary = new Uint8Array(
|
||||
highestKeyBytes.length + typeNumberBytes.length + nonce.length + encryptedData.length
|
||||
)
|
||||
|
||||
// finalEncryptedData = btoa(highestKeyStr) + btoa(typeNumberStr) + nonceBase64 + encryptedDataBase64
|
||||
combinedBinary.set(highestKeyBytes, 0)
|
||||
combinedBinary.set(typeNumberBytes, highestKeyBytes.length)
|
||||
combinedBinary.set(nonce, highestKeyBytes.length + typeNumberBytes.length)
|
||||
combinedBinary.set(encryptedData, highestKeyBytes.length + typeNumberBytes.length + nonce.length)
|
||||
|
||||
// Step 4: Base64 encode once
|
||||
finalEncryptedData = uint8ArrayToBase64(combinedBinary)
|
||||
}
|
||||
|
||||
return finalEncryptedData
|
||||
}
|
||||
|
||||
|
||||
export const decodeBase64ForUIChatMessages = (messages) => {
|
||||
let msgs = []
|
||||
for(const msg of messages) {
|
||||
try {
|
||||
const decoded = atob(msg.data)
|
||||
const parseDecoded =JSON.parse(decodeURIComponent(escape(decoded)))
|
||||
|
||||
msgs.push({
|
||||
...msg,
|
||||
...parseDecoded
|
||||
})
|
||||
|
||||
} catch (error) {
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
return msgs
|
||||
}
|
||||
|
||||
export function decryptSingle(data64, secretKeyObject, skipDecodeBase64) {
|
||||
// First, decode the base64-encoded input (if skipDecodeBase64 is not set)
|
||||
const decodedData = skipDecodeBase64 ? data64 : atob(data64)
|
||||
|
||||
// Then, decode it again for the specific format (if double encoding is used)
|
||||
const decodeForNumber = atob(decodedData)
|
||||
|
||||
// Extract the key (assuming it's always the first 10 characters)
|
||||
const keyStr = decodeForNumber.slice(0, 10)
|
||||
|
||||
// Convert the key string back to a number
|
||||
const highestKey = parseInt(keyStr, 10)
|
||||
|
||||
// Check if we have a valid secret key for the extracted highestKey
|
||||
if (!secretKeyObject[highestKey]) {
|
||||
return 'noKey'
|
||||
}
|
||||
|
||||
const secretKeyEntry = secretKeyObject[highestKey]
|
||||
|
||||
let typeNumberStr, nonceBase64, encryptedDataBase64
|
||||
|
||||
// Determine if typeNumber exists by checking if the next 3 characters after keyStr are digits
|
||||
const possibleTypeNumberStr = decodeForNumber.slice(10, 13)
|
||||
|
||||
// Check if next 3 characters are digits
|
||||
const hasTypeNumber = /^\d{3}$/.test(possibleTypeNumberStr)
|
||||
|
||||
if (secretKeyEntry.nonce) {
|
||||
// Old format: nonce is present in the secretKeyObject, so no type number exists
|
||||
nonceBase64 = secretKeyEntry.nonce
|
||||
|
||||
// The remaining part is the encrypted data
|
||||
encryptedDataBase64 = decodeForNumber.slice(10)
|
||||
} else {
|
||||
if (hasTypeNumber) {
|
||||
if(decodeForNumber.slice(10, 13) !== '001'){
|
||||
const decodedBinary = base64ToUint8Array(decodedData)
|
||||
|
||||
// if ASCII digits only
|
||||
const highestKeyBytes = decodedBinary.slice(0, 10)
|
||||
|
||||
const highestKeyStr = new TextDecoder().decode(highestKeyBytes)
|
||||
const nonce = decodedBinary.slice(13, 13 + 24)
|
||||
const encryptedData = decodedBinary.slice(13 + 24)
|
||||
const highestKey = parseInt(highestKeyStr, 10)
|
||||
const messageKey = base64ToUint8Array(secretKeyObject[+highestKey].messageKey)
|
||||
const decryptedBytes = nacl.secretbox.open(encryptedData, nonce, messageKey)
|
||||
|
||||
// Check if decryption was successful
|
||||
if (!decryptedBytes) {
|
||||
return 'decryptionFailed'
|
||||
}
|
||||
|
||||
// Convert the decrypted Uint8Array back to a Base64 string
|
||||
return uint8ArrayToBase64(decryptedBytes)
|
||||
}
|
||||
|
||||
// New format: Extract type number and nonce
|
||||
// Extract type number
|
||||
typeNumberStr = possibleTypeNumberStr
|
||||
|
||||
// Extract nonce (next 32 characters after type number)
|
||||
nonceBase64 = decodeForNumber.slice(13, 45)
|
||||
|
||||
// The remaining part is the encrypted data
|
||||
encryptedDataBase64 = decodeForNumber.slice(45)
|
||||
} else {
|
||||
// Old format without type number (nonce is embedded in the message, first 32 characters after keyStr)
|
||||
// First 32 characters for the nonce
|
||||
nonceBase64 = decodeForNumber.slice(10, 42)
|
||||
|
||||
// The remaining part is the encrypted data
|
||||
encryptedDataBase64 = decodeForNumber.slice(42)
|
||||
}
|
||||
}
|
||||
|
||||
// Convert Base64 strings to Uint8Array
|
||||
const Uint8ArrayData = base64ToUint8Array(encryptedDataBase64)
|
||||
const nonce = base64ToUint8Array(nonceBase64)
|
||||
const messageKey = base64ToUint8Array(secretKeyEntry.messageKey)
|
||||
|
||||
if (!(Uint8ArrayData instanceof Uint8Array)) {
|
||||
return 'decryptionFailed'
|
||||
}
|
||||
|
||||
// Decrypt the data using the nonce and messageKey
|
||||
const decryptedData = nacl.secretbox.open(Uint8ArrayData, nonce, messageKey)
|
||||
|
||||
// Check if decryption was successful
|
||||
if (!decryptedData) {
|
||||
return 'decryptionFailed'
|
||||
}
|
||||
|
||||
// Convert the decrypted Uint8Array back to a Base64 string
|
||||
return uint8ArrayToBase64(decryptedData)
|
||||
}
|
||||
|
||||
export const decryptGroupEncryptionWithSharingKey = async (data64EncryptedData, key) => {
|
||||
const allCombined = base64ToUint8Array(data64EncryptedData)
|
||||
const str = "qortalGroupEncryptedData"
|
||||
const strEncoder = new TextEncoder()
|
||||
const strUint8Array = strEncoder.encode(str)
|
||||
|
||||
// Extract the nonce
|
||||
const nonceStartPosition = strUint8Array.length
|
||||
|
||||
// Nonce is 24 bytes
|
||||
const nonceEndPosition = nonceStartPosition + 24
|
||||
const nonce = allCombined.slice(nonceStartPosition, nonceEndPosition)
|
||||
|
||||
// Extract the shared keyNonce
|
||||
const keyNonceStartPosition = nonceEndPosition
|
||||
|
||||
// Nonce is 24 bytes
|
||||
const keyNonceEndPosition = keyNonceStartPosition + 24
|
||||
const keyNonce = allCombined.slice(keyNonceStartPosition, keyNonceEndPosition)
|
||||
|
||||
// Extract the sender's public key
|
||||
const senderPublicKeyStartPosition = keyNonceEndPosition
|
||||
|
||||
// Public keys are 32 bytes
|
||||
const senderPublicKeyEndPosition = senderPublicKeyStartPosition + 32
|
||||
|
||||
// Calculate count first
|
||||
// 4 bytes before the end, since count is stored in Uint32 (4 bytes)
|
||||
const countStartPosition = allCombined.length - 4
|
||||
const countArray = allCombined.slice(countStartPosition, countStartPosition + 4)
|
||||
const count = new Uint32Array(countArray.buffer)[0]
|
||||
|
||||
// Then use count to calculate encryptedData
|
||||
// start position of encryptedData
|
||||
const encryptedDataStartPosition = senderPublicKeyEndPosition
|
||||
const encryptedDataEndPosition = allCombined.length - ((count * (32 + 16)) + 4)
|
||||
const encryptedData = allCombined.slice(encryptedDataStartPosition, encryptedDataEndPosition)
|
||||
const symmetricKey = base64ToUint8Array(key)
|
||||
|
||||
// Decrypt the data using the nonce and messageKey
|
||||
const decryptedData = nacl.secretbox.open(encryptedData, nonce, symmetricKey)
|
||||
|
||||
// Check if decryption was successful
|
||||
if (!decryptedData) {
|
||||
throw new Error("Decryption failed")
|
||||
}
|
||||
|
||||
// Convert the decrypted Uint8Array back to a Base64 string
|
||||
return uint8ArrayToBase64(decryptedData)
|
||||
}
|
||||
|
||||
export function decryptGroupDataQortalRequest(data64EncryptedData, privateKey) {
|
||||
const allCombined = base64ToUint8Array(data64EncryptedData)
|
||||
const str = "qortalGroupEncryptedData"
|
||||
const strEncoder = new TextEncoder()
|
||||
const strUint8Array = strEncoder.encode(str)
|
||||
|
||||
// Extract the nonce
|
||||
const nonceStartPosition = strUint8Array.length
|
||||
|
||||
// Nonce is 24 bytes
|
||||
const nonceEndPosition = nonceStartPosition + 24
|
||||
const nonce = allCombined.slice(nonceStartPosition, nonceEndPosition)
|
||||
|
||||
// Extract the shared keyNonce
|
||||
const keyNonceStartPosition = nonceEndPosition
|
||||
|
||||
// Nonce is 24 bytes
|
||||
const keyNonceEndPosition = keyNonceStartPosition + 24
|
||||
const keyNonce = allCombined.slice(keyNonceStartPosition, keyNonceEndPosition)
|
||||
|
||||
// Extract the sender's public key
|
||||
const senderPublicKeyStartPosition = keyNonceEndPosition
|
||||
|
||||
// Public keys are 32 bytes
|
||||
const senderPublicKeyEndPosition = senderPublicKeyStartPosition + 32
|
||||
const senderPublicKey = allCombined.slice(senderPublicKeyStartPosition, senderPublicKeyEndPosition)
|
||||
|
||||
// Calculate count first
|
||||
// 4 bytes before the end, since count is stored in Uint32 (4 bytes)
|
||||
const countStartPosition = allCombined.length - 4
|
||||
const countArray = allCombined.slice(countStartPosition, countStartPosition + 4)
|
||||
const count = new Uint32Array(countArray.buffer)[0]
|
||||
|
||||
// Then use count to calculate encryptedData
|
||||
// start position of encryptedData
|
||||
const encryptedDataStartPosition = senderPublicKeyEndPosition
|
||||
const encryptedDataEndPosition = allCombined.length - ((count * (32 + 16)) + 4)
|
||||
const encryptedData = allCombined.slice(encryptedDataStartPosition, encryptedDataEndPosition)
|
||||
|
||||
// Extract the encrypted keys
|
||||
// 32+16 = 48
|
||||
const combinedKeys = allCombined.slice(encryptedDataEndPosition, encryptedDataEndPosition + (count * 48))
|
||||
|
||||
if (!privateKey) {
|
||||
throw new Error("Unable to retrieve keys")
|
||||
}
|
||||
|
||||
const decodedPrivateKey = Base58.decode(privateKey)
|
||||
const convertedPrivateKey = ed2curve.convertSecretKey(decodedPrivateKey)
|
||||
const convertedSenderPublicKey = ed2curve.convertPublicKey(senderPublicKey)
|
||||
const sharedSecret = new Uint8Array(32)
|
||||
|
||||
nacl.lowlevel.crypto_scalarmult(sharedSecret, convertedPrivateKey, convertedSenderPublicKey)
|
||||
|
||||
for (let i = 0; i < count; i++) {
|
||||
const encryptedKey = combinedKeys.slice(i * 48, (i + 1) * 48)
|
||||
|
||||
// Decrypt the symmetric key.
|
||||
const decryptedKey = nacl.secretbox.open(encryptedKey, keyNonce, sharedSecret)
|
||||
|
||||
// If decryption was successful, decryptedKey will not be null.
|
||||
if (decryptedKey) {
|
||||
// Decrypt the data using the symmetric key.
|
||||
const decryptedData = nacl.secretbox.open(encryptedData, nonce, decryptedKey)
|
||||
|
||||
// If decryption was successful, decryptedData will not be null.
|
||||
if (decryptedData) {
|
||||
return decryptedData
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
throw new Error("Unable to decrypt data")
|
||||
}
|
||||
|
||||
|
||||
export function decryptGroupData(data64EncryptedData, privateKey) {
|
||||
const allCombined = base64ToUint8Array(data64EncryptedData)
|
||||
const str = "qortalGroupEncryptedData"
|
||||
const strEncoder = new TextEncoder()
|
||||
const strUint8Array = strEncoder.encode(str)
|
||||
|
||||
// Extract the nonce
|
||||
const nonceStartPosition = strUint8Array.length
|
||||
|
||||
// Nonce is 24 bytes
|
||||
const nonceEndPosition = nonceStartPosition + 24
|
||||
const nonce = allCombined.slice(nonceStartPosition, nonceEndPosition)
|
||||
|
||||
// Extract the shared keyNonce
|
||||
const keyNonceStartPosition = nonceEndPosition
|
||||
|
||||
// Nonce is 24 bytes
|
||||
const keyNonceEndPosition = keyNonceStartPosition + 24
|
||||
const keyNonce = allCombined.slice(keyNonceStartPosition, keyNonceEndPosition)
|
||||
|
||||
// Extract the sender's public key
|
||||
const senderPublicKeyStartPosition = keyNonceEndPosition
|
||||
|
||||
// Public keys are 32 bytes
|
||||
const senderPublicKeyEndPosition = senderPublicKeyStartPosition + 32
|
||||
const senderPublicKey = allCombined.slice(senderPublicKeyStartPosition, senderPublicKeyEndPosition)
|
||||
|
||||
// Calculate count first
|
||||
// 4 bytes before the end, since count is stored in Uint32 (4 bytes)
|
||||
const countStartPosition = allCombined.length - 4
|
||||
const countArray = allCombined.slice(countStartPosition, countStartPosition + 4)
|
||||
const count = new Uint32Array(countArray.buffer)[0]
|
||||
|
||||
// Then use count to calculate encryptedData
|
||||
// start position of encryptedData
|
||||
const encryptedDataStartPosition = senderPublicKeyEndPosition
|
||||
const encryptedDataEndPosition = allCombined.length - ((count * (32 + 16)) + 4)
|
||||
const encryptedData = allCombined.slice(encryptedDataStartPosition, encryptedDataEndPosition)
|
||||
|
||||
// Extract the encrypted keys
|
||||
// 32+16 = 48
|
||||
const combinedKeys = allCombined.slice(encryptedDataEndPosition, encryptedDataEndPosition + (count * 48))
|
||||
|
||||
if (!privateKey) {
|
||||
throw new Error("Unable to retrieve keys")
|
||||
}
|
||||
|
||||
const decodedPrivateKey = Base58.decode(privateKey)
|
||||
const convertedPrivateKey = ed2curve.convertSecretKey(decodedPrivateKey)
|
||||
const convertedSenderPublicKey = ed2curve.convertPublicKey(senderPublicKey)
|
||||
const sharedSecret = new Uint8Array(32)
|
||||
|
||||
nacl.lowlevel.crypto_scalarmult(sharedSecret, convertedPrivateKey, convertedSenderPublicKey)
|
||||
|
||||
for (let i = 0; i < count; i++) {
|
||||
const encryptedKey = combinedKeys.slice(i * 48, (i + 1) * 48)
|
||||
|
||||
// Decrypt the symmetric key.
|
||||
const decryptedKey = nacl.secretbox.open(encryptedKey, keyNonce, sharedSecret)
|
||||
|
||||
// If decryption was successful, decryptedKey will not be null.
|
||||
if (decryptedKey) {
|
||||
// Decrypt the data using the symmetric key.
|
||||
const decryptedData = nacl.secretbox.open(encryptedData, nonce, decryptedKey)
|
||||
|
||||
// If decryption was successful, decryptedData will not be null.
|
||||
if (decryptedData) {
|
||||
return {decryptedData, count}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
throw new Error("Unable to decrypt data")
|
||||
}
|
||||
|
||||
export function uint8ArrayStartsWith(uint8Array, string) {
|
||||
const stringEncoder = new TextEncoder()
|
||||
const stringUint8Array = stringEncoder.encode(string)
|
||||
|
||||
if (uint8Array.length < stringUint8Array.length) {
|
||||
return false
|
||||
}
|
||||
|
||||
for (let i = 0; i < stringUint8Array.length; i++) {
|
||||
if (uint8Array[i] !== stringUint8Array[i]) {
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
return true
|
||||
}
|
||||
|
||||
export function decryptDeprecatedSingle(uint8Array, publicKey, privateKey) {
|
||||
const combinedData = uint8Array
|
||||
const str = "qortalEncryptedData"
|
||||
const strEncoder = new TextEncoder()
|
||||
const strUint8Array = strEncoder.encode(str)
|
||||
const strData = combinedData.slice(0, strUint8Array.length)
|
||||
const nonce = combinedData.slice(strUint8Array.length, strUint8Array.length + 24)
|
||||
const _encryptedData = combinedData.slice(strUint8Array.length + 24)
|
||||
const _publicKey = window.parent.Base58.decode(publicKey)
|
||||
|
||||
if (!privateKey || !_publicKey) {
|
||||
throw new Error("Unable to retrieve keys")
|
||||
}
|
||||
|
||||
const convertedPrivateKey = ed2curve.convertSecretKey(privateKey)
|
||||
const convertedPublicKey = ed2curve.convertPublicKey(_publicKey)
|
||||
const sharedSecret = new Uint8Array(32)
|
||||
|
||||
nacl.lowlevel.crypto_scalarmult(sharedSecret, convertedPrivateKey, convertedPublicKey)
|
||||
|
||||
const _chatEncryptionSeed = new window.parent.Sha256().process(sharedSecret).finish().result
|
||||
const _decryptedData = nacl.secretbox.open(_encryptedData, nonce, _chatEncryptionSeed)
|
||||
|
||||
if (!_decryptedData) {
|
||||
throw new Error("Unable to decrypt")
|
||||
}
|
||||
|
||||
return uint8ArrayToBase64(_decryptedData)
|
||||
}
|
@ -54,9 +54,9 @@ class LevelFounder extends LitElement {
|
||||
}
|
||||
|
||||
renderFounder() {
|
||||
let adressfounder = this.memberInfo.flags
|
||||
let addressfounder = this.memberInfo.flags
|
||||
|
||||
if (adressfounder === 1) {
|
||||
if (addressfounder === 1) {
|
||||
return html`
|
||||
<span id="founderTooltip" class="badge">F</span>
|
||||
<paper-tooltip class="custom" for="founderTooltip" position="top">FOUNDER</paper-tooltip>
|
||||
@ -67,13 +67,13 @@ class LevelFounder extends LitElement {
|
||||
}
|
||||
|
||||
renderLevel() {
|
||||
let adresslevel = this.memberInfo.level
|
||||
let addresslevel = this.memberInfo.level
|
||||
|
||||
return adresslevel ?
|
||||
return addresslevel ?
|
||||
html`
|
||||
<img id="level-img" src=${`/img/badges/level-${adresslevel}.png`} alt=${`badge-${adresslevel}`} class="message-data-level" />
|
||||
<img id="level-img" src=${`/img/badges/level-${addresslevel}.png`} alt=${`badge-${addresslevel}`} class="message-data-level" />
|
||||
<paper-tooltip class="level-img-tooltip" for="level-img" position="top">
|
||||
${translate("mintingpage.mchange27")} ${adresslevel}
|
||||
${translate("mintingpage.mchange27")} ${addresslevel}
|
||||
</paper-tooltip>
|
||||
`
|
||||
: ''
|
||||
|
@ -19,7 +19,7 @@ class NameMenu extends LitElement {
|
||||
return {
|
||||
toblockaddress: { type: String, attribute: true },
|
||||
nametodialog: { type: String, attribute: true },
|
||||
chatBlockedAdresses: { type: Array },
|
||||
chatBlockedAddresses: { type: Array },
|
||||
selectedAddress: { type: Object },
|
||||
config: { type: Object },
|
||||
myAddress: { type: Object, reflect: true },
|
||||
@ -36,7 +36,7 @@ class NameMenu extends LitElement {
|
||||
|
||||
constructor() {
|
||||
super()
|
||||
this.chatBlockedAdresses = []
|
||||
this.chatBlockedAddresses = []
|
||||
this.selectedAddress = window.parent.reduxStore.getState().app.selectedAddress.address
|
||||
this.myAddress = {}
|
||||
this.balance = 1
|
||||
@ -94,10 +94,10 @@ class NameMenu extends LitElement {
|
||||
}
|
||||
|
||||
firstUpdated() {
|
||||
this.getChatBlockedAdresses()
|
||||
this.getchatBlockedAddresses()
|
||||
|
||||
setInterval(() => {
|
||||
this.getChatBlockedAdresses()
|
||||
this.getchatBlockedAddresses()
|
||||
}, 60000)
|
||||
|
||||
window.onclick = function (event) {
|
||||
@ -185,8 +185,8 @@ class NameMenu extends LitElement {
|
||||
}, 500)
|
||||
}
|
||||
|
||||
async getChatBlockedAdresses() {
|
||||
this.chatBlockedAdresses = await parentEpml.request('apiCall', {
|
||||
async getchatBlockedAddresses() {
|
||||
this.chatBlockedAddresses = await parentEpml.request('apiCall', {
|
||||
url: `/lists/blockedAddresses?apiKey=${this.getApiKey()}`
|
||||
})
|
||||
}
|
||||
@ -210,8 +210,8 @@ class NameMenu extends LitElement {
|
||||
})
|
||||
|
||||
if (ret === true) {
|
||||
this.chatBlockedAdresses = this.chatBlockedAdresses.filter(item => item != address)
|
||||
this.chatBlockedAdresses.push(address)
|
||||
this.chatBlockedAddresses = this.chatBlockedAddresses.filter(item => item != address)
|
||||
this.chatBlockedAddresses.push(address)
|
||||
this.getChatBlockedList()
|
||||
this.closeMenu()
|
||||
this.shadowRoot.querySelector('#blockNameDialog').close()
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -54,3 +54,188 @@ export const mimeToExtensionMap = {
|
||||
"application/x-gzip": ".gz",
|
||||
"application/x-bzip2": ".bz2",
|
||||
}
|
||||
|
||||
export const parseQortalLink = (link) => {
|
||||
const prefix = "qortal://use-embed/"
|
||||
|
||||
let params = {}
|
||||
|
||||
if (!link.startsWith(prefix)) {
|
||||
throw new Error("Invalid link format")
|
||||
}
|
||||
|
||||
const [typePart, queryPart] = link.slice(prefix.length).split("?")
|
||||
const type = typePart.split("/")[0].toUpperCase()
|
||||
|
||||
if (queryPart) {
|
||||
const queryPairs = queryPart.split("&")
|
||||
queryPairs.forEach((pair) => {
|
||||
const [key, value] = pair.split("=")
|
||||
if (key && value) {
|
||||
const decodedKey = decodeURIComponent(key.trim())
|
||||
const decodedValue = value.trim().replace(/<\/?[^>]+(>|$)/g,"")
|
||||
params[decodedKey] = decodedValue
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
return { type, ...params }
|
||||
}
|
||||
|
||||
export const extensionToPointer = (repString) => {
|
||||
const replace00 = repString.split('qortal://use-embed/').join('<newpointer>qortal://use-embed/')
|
||||
const replace01 = replace00.split('.pdf').join('.pdf</newpointer>')
|
||||
const replace02 = replace01.split('.doc').join('.doc</newpointer>')
|
||||
const replace03 = replace02.split('.xls').join('.xls</newpointer>')
|
||||
const replace04 = replace03.split('.ppt').join('.ppt</newpointer>')
|
||||
const replace05 = replace04.split('.odt').join('.odt</newpointer>')
|
||||
const replace06 = replace05.split('.ods').join('.ods</newpointer>')
|
||||
const replace07 = replace06.split('.odp').join('.odp</newpointer>')
|
||||
const replace08 = replace07.split('.txt').join('.txt</newpointer>')
|
||||
const replace09 = replace08.split('.csv').join('.csv</newpointer>')
|
||||
const replace10 = replace09.split('.html').join('.html</newpointer>')
|
||||
const replace11 = replace10.split('.xml').join('.xml</newpointer>')
|
||||
const replace12 = replace11.split('.json').join('.json</newpointer>')
|
||||
const replace13 = replace12.split('.jpg').join('.jpg</newpointer>')
|
||||
const replace14 = replace13.split('.png').join('.png</newpointer>')
|
||||
const replace15 = replace14.split('.gif').join('.gif</newpointer>')
|
||||
const replace16 = replace15.split('.webp').join('.webp</newpointer>')
|
||||
const replace17 = replace16.split('.svg').join('.svg</newpointer>')
|
||||
const replace18 = replace17.split('.tif').join('.tif</newpointer>')
|
||||
const replace19 = replace18.split('.bmp').join('.bmp</newpointer>')
|
||||
const replace20 = replace19.split('.mp3').join('.mp3</newpointer>')
|
||||
const replace21 = replace20.split('.ogg').join('.ogg</newpointer>')
|
||||
const replace22 = replace21.split('.wav').join('.wav</newpointer>')
|
||||
const replace23 = replace22.split('.webm').join('.webm</newpointer>')
|
||||
const replace24 = replace23.split('.ogv').join('.ogv</newpointer>')
|
||||
const replace25 = replace24.split('.avi').join('.avi</newpointer>')
|
||||
const replace26 = replace25.split('.mov').join('.mov</newpointer>')
|
||||
const replace27 = replace26.split('.wmv').join('.wmv</newpointer>')
|
||||
const replace28 = replace27.split('.mpeg').join('.mpeg</newpointer>')
|
||||
const replace29 = replace28.split('.3gp').join('.3gp</newpointer>')
|
||||
const replace30 = replace29.split('.3g2').join('.3g2</newpointer>')
|
||||
const replace31 = replace30.split('.mkv').join('.mkv</newpointer>')
|
||||
const replace32 = replace31.split('.flv').join('.flv</newpointer>')
|
||||
const replace33 = replace32.split('.zip').join('.zip</newpointer>')
|
||||
const replace34 = replace33.split('.rar').join('.rar</newpointer>')
|
||||
const replace35 = replace34.split('.tar').join('.tar</newpointer>')
|
||||
const replace36 = replace35.split('.7z').join('.7z</newpointer>')
|
||||
const replace37 = replace36.split('.gz').join('.gz</newpointer>')
|
||||
const replace38 = replace37.split('.bz2').join('.bz2</newpointer>')
|
||||
const replace39 = replace38.split('service=QCHAT_IMAGE</p>').join('service=QCHAT_IMAGE</newpointer></p>')
|
||||
|
||||
return replace39
|
||||
}
|
||||
|
||||
export const encodedToChar = (encodedString) => {
|
||||
const encode01 = encodedString.split('&').join('&')
|
||||
const encode02 = encode01.split(' ').join(' ')
|
||||
const encode03 = encode02.split('<').join('<')
|
||||
const encode04 = encode03.split('>').join('>')
|
||||
const encode05 = encode04.split('"').join('"')
|
||||
const encode06 = encode05.split('%20').join(' ')
|
||||
const encode07 = encode06.split('%23').join('#')
|
||||
const encode08 = encode07.split('%24').join('$')
|
||||
const encode09 = encode08.split('%26').join('&')
|
||||
const encode10 = encode09.split('%2B').join('+')
|
||||
const encode11 = encode10.split('%2C').join(',')
|
||||
const encode12 = encode11.split('%2F').join('/')
|
||||
const encode13 = encode12.split('%3A').join(':')
|
||||
const encode14 = encode13.split('%3B').join(';')
|
||||
const encode15 = encode14.split('%3D').join('=')
|
||||
const encode16 = encode15.split('%3F').join('?')
|
||||
const encode17 = encode16.split('%40').join('@')
|
||||
|
||||
return encode17
|
||||
}
|
||||
|
||||
export const embedToString = (embed) => {
|
||||
let embedString = ''
|
||||
let embedService = ''
|
||||
let embedName = ''
|
||||
let embedIdentifier = ''
|
||||
let embedAttachmentName = ''
|
||||
|
||||
if (embed.type === "IMAGE") {
|
||||
embedService = embed.service
|
||||
embedName = embed.name
|
||||
embedIdentifier = embed.identifier
|
||||
embedString = '"images":[{"service":"' + embedService + '","name":"' + embedName + '","identifier":"' + embedIdentifier + '"}],"isImageDeleted":false'
|
||||
} else if (embed.type === "ATTACHMENT") {
|
||||
embedService = embed.service
|
||||
embedName = embed.name
|
||||
embedIdentifier = embed.identifier
|
||||
embedAttachmentName = embed.fileName
|
||||
embedString = '"attachments":[{"service":"' + embedService + '","name":"' + embedName + '","identifier":"' + embedIdentifier + '","attachmentName":"' + embedAttachmentName + '","attachmentSize":0}],"isAttachmentDeleted":false'
|
||||
} else {
|
||||
embedString = '"images":[""]'
|
||||
}
|
||||
|
||||
return embedString
|
||||
}
|
||||
|
||||
|
||||
export const listOfAllQortalRequests = [
|
||||
'IS_USING_GATEWAY',
|
||||
'ADMIN_ACTION',
|
||||
'SHOW_ACTIONS',
|
||||
'CREATE_AND_COPY_EMBED_LINK',
|
||||
'GET_USER_ACCOUNT',
|
||||
'REGISTER_NAME',
|
||||
'UPDATE_NAME',
|
||||
'ENCRYPT_DATA',
|
||||
'DECRYPT_DATA',
|
||||
'ENCRYPT_QORTAL_GROUP_DATA',
|
||||
'DECRYPT_QORTAL_GROUP_DATA',
|
||||
'ENCRYPT_DATA_WITH_SHARING_KEY',
|
||||
'DECRYPT_DATA_WITH_SHARING_KEY',
|
||||
'DECRYPT_AESGCM',
|
||||
'CREATE_TRADE_BUY_ORDER',
|
||||
'CREATE_TRADE_SELL_ORDER',
|
||||
'CANCEL_TRADE_SELL_ORDER',
|
||||
'GET_LIST_ITEMS',
|
||||
'ADD_LIST_ITEMS',
|
||||
'DELETE_LIST_ITEM',
|
||||
'GET_FRIENDS_LIST',
|
||||
'LINK_TO_QDN_RESOURCE',
|
||||
'QDN_RESOURCE_DISPLAYED',
|
||||
'SET_TAB_NOTIFICATIONS',
|
||||
'PUBLISH_QDN_RESOURCE',
|
||||
'PUBLISH_MULTIPLE_QDN_RESOURCES',
|
||||
'VOTE_ON_POLL',
|
||||
'CREATE_POLL',
|
||||
'OPEN_NEW_TAB',
|
||||
'NOTIFICATIONS_PERMISSION',
|
||||
'SEND_LOCAL_NOTIFICATION',
|
||||
'SEND_CHAT_MESSAGE',
|
||||
'JOIN_GROUP',
|
||||
'LEAVE_GROUP',
|
||||
'INVITE_TO_GROUP',
|
||||
'CANCEL_GROUP_INVITE',
|
||||
'KICK_FROM_GROUP',
|
||||
'BAN_FROM_GROUP',
|
||||
'CANCEL_GROUP_BAN',
|
||||
'ADD_GROUP_ADMIN',
|
||||
'REMOVE_GROUP_ADMIN',
|
||||
'SAVE_FILE',
|
||||
'GET_HOSTED_DATA',
|
||||
'DELETE_HOSTED_DATA',
|
||||
'DEPLOY_AT',
|
||||
'GET_PROFILE_DATA',
|
||||
'SET_PROFILE_DATA',
|
||||
'OPEN_PROFILE',
|
||||
'GET_USER_WALLET',
|
||||
'GET_WALLET_BALANCE',
|
||||
'GET_USER_WALLET_INFO',
|
||||
'GET_CROSSCHAIN_SERVER_INFO',
|
||||
'GET_TX_ACTIVITY_SUMMARY',
|
||||
'GET_FOREIGN_FEE',
|
||||
'UPDATE_FOREIGN_FEE',
|
||||
'GET_SERVER_CONNECTION_HISTORY',
|
||||
'SET_CURRENT_FOREIGN_SERVER',
|
||||
'ADD_FOREIGN_SERVER',
|
||||
'REMOVE_FOREIGN_SERVER',
|
||||
'GET_DAY_SUMMARY',
|
||||
'SIGN_TRANSACTION',
|
||||
'SEND_COIN'
|
||||
]
|
||||
|
@ -1,3 +1,4 @@
|
||||
import Base58 from '../../../../crypto/api/deps/Base58'
|
||||
import nacl from '../../../../crypto/api/deps/nacl-fast.js'
|
||||
import ed2curve from '../../../../crypto/api/deps/ed2curve.js'
|
||||
|
||||
@ -33,10 +34,14 @@ export const fileToBase64 = (file) => new Promise(async (resolve, reject) => {
|
||||
if (!reader) {
|
||||
reader = new FileReader()
|
||||
}
|
||||
|
||||
await semaphore.acquire()
|
||||
|
||||
reader.readAsDataURL(file)
|
||||
|
||||
reader.onload = () => {
|
||||
const dataUrl = reader.result
|
||||
|
||||
if (typeof dataUrl === "string") {
|
||||
const base64String = dataUrl.split(',')[1]
|
||||
reader.onload = null
|
||||
@ -49,6 +54,7 @@ export const fileToBase64 = (file) => new Promise(async (resolve, reject) => {
|
||||
}
|
||||
semaphore.release()
|
||||
}
|
||||
|
||||
reader.onerror = (error) => {
|
||||
reader.onload = null
|
||||
reader.onerror = null
|
||||
@ -73,9 +79,11 @@ export function base64ToUint8Array(base64) {
|
||||
const binaryString = atob(base64)
|
||||
const len = binaryString.length
|
||||
const bytes = new Uint8Array(len)
|
||||
|
||||
for (let i = 0; i < len; i++) {
|
||||
bytes[i] = binaryString.charCodeAt(i)
|
||||
}
|
||||
|
||||
return bytes
|
||||
}
|
||||
|
||||
@ -226,6 +234,102 @@ export const encryptDataGroup = ({ data64, publicKeys }) => {
|
||||
}
|
||||
}
|
||||
|
||||
export const encryptDataGroupNew = (data64, publicKeys, privateKey, userPublicKey, customSymmetricKey) => {
|
||||
let combinedPublicKeys = [...publicKeys, userPublicKey]
|
||||
|
||||
const decodedPrivateKey = Base58.decode(privateKey)
|
||||
const publicKeysDuplicateFree = [...new Set(combinedPublicKeys)]
|
||||
const Uint8ArrayData = base64ToUint8Array(data64)
|
||||
|
||||
if (!(Uint8ArrayData instanceof Uint8Array)) {
|
||||
throw new Error("The Uint8ArrayData you've submitted is invalid")
|
||||
}
|
||||
|
||||
try {
|
||||
// Generate a random symmetric key for the message.
|
||||
let messageKey
|
||||
|
||||
if(customSymmetricKey){
|
||||
messageKey = base64ToUint8Array(customSymmetricKey)
|
||||
} else {
|
||||
messageKey = new Uint8Array(32)
|
||||
crypto.getRandomValues(messageKey)
|
||||
}
|
||||
|
||||
if(!messageKey) throw new Error('Cannot create symmetric key')
|
||||
|
||||
const nonce = new Uint8Array(24)
|
||||
|
||||
crypto.getRandomValues(nonce)
|
||||
|
||||
// Encrypt the data with the symmetric key.
|
||||
const encryptedData = nacl.secretbox(Uint8ArrayData, nonce, messageKey)
|
||||
|
||||
// Generate a keyNonce outside of the loop.
|
||||
const keyNonce = new Uint8Array(24)
|
||||
crypto.getRandomValues(keyNonce)
|
||||
|
||||
// Encrypt the symmetric key for each recipient.
|
||||
let encryptedKeys = []
|
||||
|
||||
publicKeysDuplicateFree.forEach((recipientPublicKey) => {
|
||||
const publicKeyUnit8Array = Base58.decode(recipientPublicKey)
|
||||
const convertedPrivateKey = ed2curve.convertSecretKey(decodedPrivateKey)
|
||||
const convertedPublicKey = ed2curve.convertPublicKey(publicKeyUnit8Array)
|
||||
const sharedSecret = new Uint8Array(32)
|
||||
|
||||
// the length of the sharedSecret will be 32 + 16
|
||||
// When you're encrypting data using nacl.secretbox, it's adding an authentication tag to the result, which is 16 bytes long. This tag is used for verifying the integrity and authenticity of the data when it is decrypted
|
||||
nacl.lowlevel.crypto_scalarmult(sharedSecret, convertedPrivateKey, convertedPublicKey)
|
||||
|
||||
// Encrypt the symmetric key with the shared secret.
|
||||
const encryptedKey = nacl.secretbox(messageKey, keyNonce, sharedSecret)
|
||||
|
||||
encryptedKeys.push(encryptedKey)
|
||||
})
|
||||
|
||||
const str = "qortalGroupEncryptedData"
|
||||
const strEncoder = new TextEncoder()
|
||||
const strUint8Array = strEncoder.encode(str)
|
||||
|
||||
// Convert sender's public key to Uint8Array and add to the message
|
||||
const senderPublicKeyUint8Array = Base58.decode(userPublicKey)
|
||||
|
||||
// Combine all data into a single Uint8Array.
|
||||
// Calculate size of combinedData
|
||||
let combinedDataSize = strUint8Array.length + nonce.length + keyNonce.length + senderPublicKeyUint8Array.length + encryptedData.length + 4
|
||||
let encryptedKeysSize = 0
|
||||
|
||||
encryptedKeys.forEach((key) => {
|
||||
encryptedKeysSize += key.length
|
||||
})
|
||||
|
||||
combinedDataSize += encryptedKeysSize
|
||||
let combinedData = new Uint8Array(combinedDataSize)
|
||||
combinedData.set(strUint8Array)
|
||||
combinedData.set(nonce, strUint8Array.length)
|
||||
combinedData.set(keyNonce, strUint8Array.length + nonce.length)
|
||||
combinedData.set(senderPublicKeyUint8Array, strUint8Array.length + nonce.length + keyNonce.length)
|
||||
combinedData.set(encryptedData, strUint8Array.length + nonce.length + keyNonce.length + senderPublicKeyUint8Array.length)
|
||||
|
||||
// Initialize offset for encryptedKeys
|
||||
let encryptedKeysOffset = strUint8Array.length + nonce.length + keyNonce.length + senderPublicKeyUint8Array.length + encryptedData.length
|
||||
|
||||
encryptedKeys.forEach((key) => {
|
||||
combinedData.set(key, encryptedKeysOffset)
|
||||
encryptedKeysOffset += key.length
|
||||
})
|
||||
|
||||
const countArray = new Uint8Array(new Uint32Array([publicKeysDuplicateFree.length]).buffer)
|
||||
combinedData.set(countArray, combinedData.length - 4)
|
||||
|
||||
return uint8ArrayToBase64(combinedData)
|
||||
} catch (error) {
|
||||
console.log('error', error)
|
||||
throw new Error("Error in encrypting data")
|
||||
}
|
||||
}
|
||||
|
||||
export function uint8ArrayStartsWith(uint8Array, string) {
|
||||
const stringEncoder = new TextEncoder()
|
||||
const stringUint8Array = stringEncoder.encode(string)
|
||||
@ -316,4 +420,101 @@ export function decryptGroupData(data64EncryptedData) {
|
||||
}
|
||||
}
|
||||
throw new Error("Unable to decrypt data")
|
||||
}
|
||||
}
|
||||
|
||||
export function decryptGroupDataNew(data64EncryptedData, privateKey) {
|
||||
const allCombined = base64ToUint8Array(data64EncryptedData)
|
||||
const str = "qortalGroupEncryptedData"
|
||||
const strEncoder = new TextEncoder()
|
||||
const strUint8Array = strEncoder.encode(str)
|
||||
|
||||
// Extract the nonce
|
||||
const nonceStartPosition = strUint8Array.length
|
||||
|
||||
// Nonce is 24 bytes
|
||||
const nonceEndPosition = nonceStartPosition + 24
|
||||
const nonce = allCombined.slice(nonceStartPosition, nonceEndPosition)
|
||||
|
||||
// Extract the shared keyNonce
|
||||
const keyNonceStartPosition = nonceEndPosition
|
||||
|
||||
// Nonce is 24 bytes
|
||||
const keyNonceEndPosition = keyNonceStartPosition + 24
|
||||
const keyNonce = allCombined.slice(keyNonceStartPosition, keyNonceEndPosition)
|
||||
|
||||
// Extract the sender's public key
|
||||
const senderPublicKeyStartPosition = keyNonceEndPosition
|
||||
|
||||
// Public keys are 32 bytes
|
||||
const senderPublicKeyEndPosition = senderPublicKeyStartPosition + 32
|
||||
const senderPublicKey = allCombined.slice(senderPublicKeyStartPosition, senderPublicKeyEndPosition)
|
||||
|
||||
// Calculate count first
|
||||
// 4 bytes before the end, since count is stored in Uint32 (4 bytes)
|
||||
const countStartPosition = allCombined.length - 4
|
||||
const countArray = allCombined.slice(countStartPosition, countStartPosition + 4)
|
||||
const count = new Uint32Array(countArray.buffer)[0]
|
||||
|
||||
// Then use count to calculate encryptedData
|
||||
// start position of encryptedData
|
||||
const encryptedDataStartPosition = senderPublicKeyEndPosition
|
||||
const encryptedDataEndPosition = allCombined.length - ((count * (32 + 16)) + 4)
|
||||
const encryptedData = allCombined.slice(encryptedDataStartPosition, encryptedDataEndPosition)
|
||||
|
||||
// Extract the encrypted keys
|
||||
// 32+16 = 48
|
||||
const combinedKeys = allCombined.slice(encryptedDataEndPosition, encryptedDataEndPosition + (count * 48))
|
||||
|
||||
if (!privateKey) {
|
||||
throw new Error("Unable to retrieve keys")
|
||||
}
|
||||
|
||||
const decodedPrivateKey = Base58.decode(privateKey)
|
||||
const convertedPrivateKey = ed2curve.convertSecretKey(decodedPrivateKey)
|
||||
const convertedSenderPublicKey = ed2curve.convertPublicKey(senderPublicKey)
|
||||
const sharedSecret = new Uint8Array(32)
|
||||
|
||||
nacl.lowlevel.crypto_scalarmult(sharedSecret, convertedPrivateKey, convertedSenderPublicKey)
|
||||
|
||||
for (let i = 0; i < count; i++) {
|
||||
const encryptedKey = combinedKeys.slice(i * 48, (i + 1) * 48)
|
||||
console.log("Encrypted KEY", encryptedKey)
|
||||
console.log("KEY NONCE", keyNonce)
|
||||
console.log("SHARED SECRET", sharedSecret)
|
||||
// Decrypt the symmetric key.
|
||||
const decryptedKey = nacl.secretbox.open(encryptedKey, keyNonce, sharedSecret)
|
||||
|
||||
// If decryption was successful, decryptedKey will not be null.
|
||||
if (decryptedKey) {
|
||||
// Decrypt the data using the symmetric key.
|
||||
const decryptedData = nacl.secretbox.open(encryptedData, nonce, decryptedKey)
|
||||
|
||||
// If decryption was successful, decryptedData will not be null.
|
||||
if (decryptedData) {
|
||||
return {decryptedData, count}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
throw new Error("Unable to decrypt data")
|
||||
}
|
||||
|
||||
export const base64ToBlobUrl = (base64, mimeType = "image/png") => {
|
||||
const binary = atob(base64)
|
||||
const array = []
|
||||
|
||||
for (let i = 0; i < binary.length; i++) {
|
||||
array.push(binary.charCodeAt(i))
|
||||
}
|
||||
|
||||
const blob = new Blob([new Uint8Array(array)], { type: mimeType })
|
||||
|
||||
return URL.createObjectURL(blob)
|
||||
}
|
||||
|
||||
export let groupSecretkeys = {}
|
||||
|
||||
export function roundUpToDecimals(number, decimals = 8) {
|
||||
const factor = Math.pow(10, decimals)
|
||||
return Math.ceil(+number * factor) / factor
|
||||
}
|
||||
|
@ -1,44 +1,58 @@
|
||||
// IS_USING_PUBLIC_NODE
|
||||
export const IS_USING_PUBLIC_NODE = 'IS_USING_PUBLIC_NODE'
|
||||
|
||||
// GET_ARRR_SYNC_STATUS
|
||||
export const GET_ARRR_SYNC_STATUS = 'GET_ARRR_SYNC_STATUS'
|
||||
|
||||
// GET_NODE_INFO
|
||||
export const GET_NODE_INFO = 'GET_NODE_INFO'
|
||||
|
||||
// GET_NODE_STATUS
|
||||
export const GET_NODE_STATUS = 'GET_NODE_STATUS'
|
||||
|
||||
// ADMIN_ACTION
|
||||
export const ADMIN_ACTION = 'ADMIN_ACTION'
|
||||
|
||||
// SHOW_ACTIONS
|
||||
export const SHOW_ACTIONS = 'SHOW_ACTIONS'
|
||||
|
||||
// CREATE_AND_COPY_EMBED_LINK
|
||||
|
||||
// GET_USER_ACCOUNT
|
||||
export const GET_USER_ACCOUNT = 'GET_USER_ACCOUNT'
|
||||
|
||||
// LINK_TO_QDN_RESOURCE
|
||||
export const LINK_TO_QDN_RESOURCE = 'LINK_TO_QDN_RESOURCE'
|
||||
// REGISTER_NAME
|
||||
// UPDATE_NAME
|
||||
|
||||
// QDN_RESOURCE_DISPLAYED
|
||||
export const QDN_RESOURCE_DISPLAYED = 'QDN_RESOURCE_DISPLAYED'
|
||||
// ENCRYPT_DATA
|
||||
export const ENCRYPT_DATA = 'ENCRYPT_DATA'
|
||||
|
||||
// PUBLISH_QDN_RESOURCE
|
||||
export const PUBLISH_QDN_RESOURCE = 'PUBLISH_QDN_RESOURCE'
|
||||
// DECRYPT_DATA
|
||||
export const DECRYPT_DATA = 'DECRYPT_DATA'
|
||||
|
||||
// SEND_CHAT_MESSAGE
|
||||
export const SEND_CHAT_MESSAGE = 'SEND_CHAT_MESSAGE'
|
||||
// ENCRYPT_QORTAL_GROUP_DATA
|
||||
export const ENCRYPT_QORTAL_GROUP_DATA = 'ENCRYPT_QORTAL_GROUP_DATA'
|
||||
|
||||
// JOIN_GROUP
|
||||
export const JOIN_GROUP = 'JOIN_GROUP'
|
||||
// DECRYPT_QORTAL_GROUP_DATA
|
||||
export const DECRYPT_QORTAL_GROUP_DATA = 'DECRYPT_QORTAL_GROUP_DATA'
|
||||
|
||||
// DEPLOY_AT
|
||||
export const DEPLOY_AT = 'DEPLOY_AT'
|
||||
// ENCRYPT_DATA_WITH_SHARING_KEY
|
||||
export const ENCRYPT_DATA_WITH_SHARING_KEY = 'ENCRYPT_DATA_WITH_SHARING_KEY'
|
||||
|
||||
// GET_USER_WALLET
|
||||
export const GET_USER_WALLET = 'GET_USER_WALLET'
|
||||
// DECRYPT_DATA_WITH_SHARING_KEY
|
||||
export const DECRYPT_DATA_WITH_SHARING_KEY = 'DECRYPT_DATA_WITH_SHARING_KEY'
|
||||
|
||||
// GET_USER_WALLET_INFO
|
||||
export const GET_USER_WALLET_INFO = 'GET_USER_WALLET_INFO'
|
||||
// DECRYPT_AESGCM
|
||||
export const DECRYPT_AESGCM = 'DECRYPT_AESGCM'
|
||||
|
||||
// GET_CROSSCHAIN_SERVER_INFO
|
||||
export const GET_CROSSCHAIN_SERVER_INFO = 'GET_CROSSCHAIN_SERVER_INFO'
|
||||
// CREATE_TRADE_BUY_ORDER
|
||||
export const CREATE_TRADE_BUY_ORDER = 'CREATE_TRADE_BUY_ORDER'
|
||||
|
||||
// GET_TX_ACTIVITY_SUMMARY
|
||||
export const GET_TX_ACTIVITY_SUMMARY = 'GET_TX_ACTIVITY_SUMMARY'
|
||||
// CREATE_TRADE_SELL_ORDER
|
||||
export const CREATE_TRADE_SELL_ORDER = 'CREATE_TRADE_SELL_ORDER'
|
||||
|
||||
// GET_WALLET_BALANCE action
|
||||
export const GET_WALLET_BALANCE = 'GET_WALLET_BALANCE'
|
||||
|
||||
// SEND_COIN
|
||||
export const SEND_COIN = 'SEND_COIN'
|
||||
|
||||
// PUBLISH_MULTIPLE_QDN_RESOURCES
|
||||
export const PUBLISH_MULTIPLE_QDN_RESOURCES = 'PUBLISH_MULTIPLE_QDN_RESOURCES'
|
||||
// CANCEL_TRADE_SELL_ORDER
|
||||
export const CANCEL_TRADE_SELL_ORDER = 'CANCEL_TRADE_SELL_ORDER'
|
||||
|
||||
// GET_LIST_ITEMS
|
||||
export const GET_LIST_ITEMS = 'GET_LIST_ITEMS'
|
||||
@ -49,21 +63,30 @@ export const ADD_LIST_ITEMS = 'ADD_LIST_ITEMS'
|
||||
// DELETE_LIST_ITEM
|
||||
export const DELETE_LIST_ITEM = 'DELETE_LIST_ITEM'
|
||||
|
||||
// ENCRYPT_DATA
|
||||
export const ENCRYPT_DATA = 'ENCRYPT_DATA'
|
||||
// GET_FRIENDS_LIST
|
||||
export const GET_FRIENDS_LIST = 'GET_FRIENDS_LIST'
|
||||
|
||||
// DECRYPT_DATA
|
||||
export const DECRYPT_DATA = 'DECRYPT_DATA'
|
||||
// LINK_TO_QDN_RESOURCE
|
||||
export const LINK_TO_QDN_RESOURCE = 'LINK_TO_QDN_RESOURCE'
|
||||
|
||||
// DECRYPT_DATA_GROUP
|
||||
export const DECRYPT_DATA_GROUP = 'DECRYPT_DATA_GROUP'
|
||||
|
||||
// SAVE_FILE
|
||||
export const SAVE_FILE = 'SAVE_FILE'
|
||||
// QDN_RESOURCE_DISPLAYED
|
||||
export const QDN_RESOURCE_DISPLAYED = 'QDN_RESOURCE_DISPLAYED'
|
||||
|
||||
// SET_TAB_NOTIFICATIONS
|
||||
export const SET_TAB_NOTIFICATIONS = 'SET_TAB_NOTIFICATIONS'
|
||||
|
||||
// PUBLISH_QDN_RESOURCE
|
||||
export const PUBLISH_QDN_RESOURCE = 'PUBLISH_QDN_RESOURCE'
|
||||
|
||||
// PUBLISH_MULTIPLE_QDN_RESOURCES
|
||||
export const PUBLISH_MULTIPLE_QDN_RESOURCES = 'PUBLISH_MULTIPLE_QDN_RESOURCES'
|
||||
|
||||
// VOTE_ON_POLL
|
||||
export const VOTE_ON_POLL= 'VOTE_ON_POLL'
|
||||
|
||||
// CREATE_POLL
|
||||
export const CREATE_POLL= 'CREATE_POLL'
|
||||
|
||||
// OPEN_NEW_TAB
|
||||
export const OPEN_NEW_TAB = 'OPEN_NEW_TAB'
|
||||
|
||||
@ -73,11 +96,29 @@ export const NOTIFICATIONS_PERMISSION = 'NOTIFICATIONS_PERMISSION'
|
||||
// SEND_LOCAL_NOTIFICATION
|
||||
export const SEND_LOCAL_NOTIFICATION = 'SEND_LOCAL_NOTIFICATION'
|
||||
|
||||
// VOTE_ON_POLL
|
||||
export const VOTE_ON_POLL= 'VOTE_ON_POLL'
|
||||
// SEND_CHAT_MESSAGE
|
||||
export const SEND_CHAT_MESSAGE = 'SEND_CHAT_MESSAGE'
|
||||
|
||||
// CREATE_POLL
|
||||
export const CREATE_POLL= 'CREATE_POLL'
|
||||
// JOIN_GROUP
|
||||
export const JOIN_GROUP = 'JOIN_GROUP'
|
||||
|
||||
// LEAVE_GROUP
|
||||
// INVITE_TO_GROUP
|
||||
// CANCEL_GROUP_INVITE
|
||||
// KICK_FROM_GROUP
|
||||
// BAN_FROM_GROUP
|
||||
// CANCEL_GROUP_BAN
|
||||
// ADD_GROUP_ADMIN
|
||||
// REMOVE_GROUP_ADMIN
|
||||
|
||||
// SAVE_FILE
|
||||
export const SAVE_FILE = 'SAVE_FILE'
|
||||
|
||||
// GET_HOSTED_DATA
|
||||
// DELETE_HOSTED_DATA
|
||||
|
||||
// DEPLOY_AT
|
||||
export const DEPLOY_AT = 'DEPLOY_AT'
|
||||
|
||||
// GET_PROFILE_DATA
|
||||
export const GET_PROFILE_DATA = 'GET_PROFILE_DATA'
|
||||
@ -85,11 +126,26 @@ export const GET_PROFILE_DATA = 'GET_PROFILE_DATA'
|
||||
// SET_PROFILE_DATA
|
||||
export const SET_PROFILE_DATA= 'SET_PROFILE_DATA'
|
||||
|
||||
// GET_DAY_SUMMARY
|
||||
export const GET_DAY_SUMMARY = 'GET_DAY_SUMMARY'
|
||||
// OPEN_PROFILE
|
||||
export const OPEN_PROFILE = 'OPEN_PROFILE'
|
||||
|
||||
// GET_FRIENDS_LIST
|
||||
export const GET_FRIENDS_LIST = 'GET_FRIENDS_LIST'
|
||||
// GET_USER_WALLET
|
||||
export const GET_USER_WALLET = 'GET_USER_WALLET'
|
||||
|
||||
// GET_USER_WALLET_TRANSACTIONS
|
||||
export const GET_USER_WALLET_TRANSACTIONS = 'GET_USER_WALLET_TRANSACTIONS'
|
||||
|
||||
// GET_WALLET_BALANCE
|
||||
export const GET_WALLET_BALANCE = 'GET_WALLET_BALANCE'
|
||||
|
||||
// GET_USER_WALLET_INFO
|
||||
export const GET_USER_WALLET_INFO = 'GET_USER_WALLET_INFO'
|
||||
|
||||
// GET_CROSSCHAIN_SERVER_INFO
|
||||
export const GET_CROSSCHAIN_SERVER_INFO = 'GET_CROSSCHAIN_SERVER_INFO'
|
||||
|
||||
// GET_TX_ACTIVITY_SUMMARY
|
||||
export const GET_TX_ACTIVITY_SUMMARY = 'GET_TX_ACTIVITY_SUMMARY'
|
||||
|
||||
// GET_FOREIGN_FEE
|
||||
export const GET_FOREIGN_FEE = 'GET_FOREIGN_FEE'
|
||||
@ -97,5 +153,23 @@ export const GET_FOREIGN_FEE = 'GET_FOREIGN_FEE'
|
||||
// UPDATE_FOREIGN_FEE
|
||||
export const UPDATE_FOREIGN_FEE = 'UPDATE_FOREIGN_FEE'
|
||||
|
||||
// OPEN_PROFILE
|
||||
export const OPEN_PROFILE = 'OPEN_PROFILE'
|
||||
// GET_SERVER_CONNECTION_HISTORY
|
||||
export let GET_SERVER_CONNECTION_HISTORY = 'GET_SERVER_CONNECTION_HISTORY'
|
||||
|
||||
// SET_CURRENT_FOREIGN_SERVER
|
||||
export let SET_CURRENT_FOREIGN_SERVER = 'SET_CURRENT_FOREIGN_SERVER'
|
||||
|
||||
// ADD_FOREIGN_SERVER
|
||||
export let ADD_FOREIGN_SERVER = 'ADD_FOREIGN_SERVER'
|
||||
|
||||
// REMOVE_FOREIGN_SERVER
|
||||
export let REMOVE_FOREIGN_SERVER = 'REMOVE_FOREIGN_SERVER'
|
||||
|
||||
// GET_DAY_SUMMARY
|
||||
export const GET_DAY_SUMMARY = 'GET_DAY_SUMMARY'
|
||||
|
||||
// SIGN_TRANSACTION
|
||||
export const SIGN_TRANSACTION = 'SIGN_TRANSACTION'
|
||||
|
||||
// SEND_COIN
|
||||
export const SEND_COIN = 'SEND_COIN'
|
||||
|
@ -1,4 +1,16 @@
|
||||
import { Sha256 } from 'asmcrypto.js'
|
||||
import {
|
||||
uint8ArrayToBase64,
|
||||
base64ToUint8Array,
|
||||
uint8ArrayToObject,
|
||||
decryptSingle
|
||||
} from './GroupEncryption.js'
|
||||
import {
|
||||
extensionToPointer,
|
||||
encodedToChar,
|
||||
embedToString,
|
||||
parseQortalLink
|
||||
} from './qdn-action-constants.js'
|
||||
|
||||
const nacl = {}
|
||||
|
||||
@ -2731,7 +2743,6 @@ class Curve25519 {
|
||||
}
|
||||
|
||||
const base58Instant = new Base58()
|
||||
|
||||
const curve25519Instance = new Curve25519()
|
||||
|
||||
self.addEventListener('message', async (e) => {
|
||||
@ -2741,7 +2752,8 @@ self.addEventListener('message', async (e) => {
|
||||
eachMessage,
|
||||
e.data.isReceipient,
|
||||
e.data._publicKey,
|
||||
e.data.privateKey
|
||||
e.data.privateKey,
|
||||
e.data.secretKeys
|
||||
)
|
||||
})
|
||||
postMessage(decodeMsgs)
|
||||
@ -2754,7 +2766,16 @@ self.addEventListener('message', async (e) => {
|
||||
}
|
||||
})
|
||||
|
||||
const decode = (string) => {
|
||||
const decode = (string, keys, ref) => {
|
||||
let repliedToStr = ''
|
||||
let hubSpecialId = ''
|
||||
let hubMessageStr = ''
|
||||
let newMessageObject = ''
|
||||
let reactionStr = ''
|
||||
let messageUseEmbed = {}
|
||||
let editStr = false
|
||||
let embedFileStr = '"images":[""]'
|
||||
|
||||
const binaryString = atob(string)
|
||||
const binaryLength = binaryString.length
|
||||
const bytes = new Uint8Array(binaryLength)
|
||||
@ -2765,7 +2786,60 @@ const decode = (string) => {
|
||||
|
||||
const decoder = new TextDecoder()
|
||||
const decodedString = decoder.decode(bytes)
|
||||
return decodedString
|
||||
|
||||
if (decodedString.includes("messageText") || decodedString === "4001") {
|
||||
if (decodedString === "4001") {
|
||||
const firstString = 'First group key created.'
|
||||
const hubString = '{"messageText":{"type":"doc","content":[{"type":"paragraph","content":[{"type":"text","text":"' + firstString + '"}]}]},"images":[""],"repliedTo":"","version":3}'
|
||||
return hubString
|
||||
} else {
|
||||
return decodedString
|
||||
}
|
||||
} else {
|
||||
const res = decryptSingle(string, keys, false)
|
||||
|
||||
if (res === 'noKey' || res === 'decryptionFailed') {
|
||||
return '{"specialId":"","message":"<p>This message could not be decrypted</p>","repliedTo":"","isEdited":false,"isFromHub":true,"version": 3}'
|
||||
}
|
||||
|
||||
const decryptToUnit8Array = base64ToUint8Array(res)
|
||||
const responseData = uint8ArrayToObject(decryptToUnit8Array)
|
||||
|
||||
if (responseData.type === "edit") {
|
||||
editStr = true
|
||||
}
|
||||
|
||||
if (responseData.repliedTo) {
|
||||
repliedToStr = responseData.repliedTo
|
||||
}
|
||||
|
||||
if (responseData.specialId) {
|
||||
hubSpecialId = responseData.specialId
|
||||
}
|
||||
|
||||
if (responseData.type === "notification") {
|
||||
hubMessageStr = responseData.data.message
|
||||
} else if (ref !== "noref" && responseData.type === "reaction") {
|
||||
reactionStr = '"isReaction":true,'
|
||||
repliedToStr = ref
|
||||
hubMessageStr = responseData.content
|
||||
} else if (responseData.message.includes('qortal://use-embed/')) {
|
||||
const useEmbed1 = extensionToPointer(responseData.message)
|
||||
const useEmbed2 = /<newpointer>(.*?)<\/newpointer>/g.exec(useEmbed1)
|
||||
const useEmbed3 = encodedToChar(useEmbed2[1])
|
||||
messageUseEmbed = parseQortalLink(useEmbed3)
|
||||
embedFileStr = embedToString(messageUseEmbed)
|
||||
hubMessageStr = responseData.message.split(useEmbed2[1]).join('')
|
||||
} else {
|
||||
hubMessageStr = responseData.message
|
||||
}
|
||||
|
||||
const hubMessageFinal = hubMessageStr.split('"').join('"')
|
||||
|
||||
newMessageObject = '{"specialId":"' + hubSpecialId + '","message":"' + hubMessageFinal + '",' + embedFileStr + ',"repliedTo":"' + repliedToStr + '","isEdited":' + editStr + ',"isFromHub":true,' + reactionStr + '"version": 3}'
|
||||
|
||||
return newMessageObject
|
||||
}
|
||||
}
|
||||
|
||||
export const decryptChatMessageBase64 = (encryptedMessage, privateKey, recipientPublicKey, lastReference) => {
|
||||
@ -2819,10 +2893,18 @@ export const decryptChatMessageBase64 = (encryptedMessage, privateKey, recipient
|
||||
return _decryptedMessage
|
||||
}
|
||||
|
||||
let decrypted1 = new TextDecoder('utf-8').decode(_decryptedMessage)
|
||||
|
||||
if (decrypted1.includes('messageText')) {
|
||||
let decrypted2 = JSON.parse(decrypted1)
|
||||
let decrypted3 = Object.assign(decrypted2, {isPrivate: true})
|
||||
return JSON.stringify(decrypted3)
|
||||
}
|
||||
|
||||
return new TextDecoder('utf-8').decode(_decryptedMessage)
|
||||
}
|
||||
|
||||
const decodeMessage = (encodedMessageObj, isReceipient, _publicKey, privateKey) => {
|
||||
const decodeMessage = (encodedMessageObj, isReceipient, _publicKey, privateKey, secretKeys) => {
|
||||
let isReceipientVar
|
||||
let _publicKeyVar
|
||||
|
||||
@ -2847,7 +2929,7 @@ const decodeMessage = (encodedMessageObj, isReceipient, _publicKey, privateKey)
|
||||
)
|
||||
decodedMessageObj = { ...encodedMessageObj, decodedMessage }
|
||||
} else if (encodedMessageObj.isEncrypted === false && encodedMessageObj.data) {
|
||||
let decodedMessage = decode(encodedMessageObj.data)
|
||||
let decodedMessage = decode(encodedMessageObj.data, secretKeys)
|
||||
decodedMessageObj = { ...encodedMessageObj, decodedMessage }
|
||||
} else {
|
||||
decodedMessageObj = {
|
||||
@ -2857,9 +2939,18 @@ const decodeMessage = (encodedMessageObj, isReceipient, _publicKey, privateKey)
|
||||
}
|
||||
} else {
|
||||
// group chat
|
||||
let decodedMessage = decode(encodedMessageObj.data)
|
||||
let decodedMessage
|
||||
|
||||
const noRef = "noref"
|
||||
|
||||
if (encodedMessageObj.chatReference) {
|
||||
decodedMessage = decode(encodedMessageObj.data, secretKeys, encodedMessageObj.chatReference)
|
||||
} else {
|
||||
decodedMessage = decode(encodedMessageObj.data, secretKeys, noRef)
|
||||
}
|
||||
|
||||
decodedMessageObj = { ...encodedMessageObj, decodedMessage }
|
||||
}
|
||||
|
||||
return decodedMessageObj
|
||||
}
|
||||
}
|
||||
|
@ -1,7 +1,7 @@
|
||||
import { html, LitElement } from 'lit'
|
||||
import { render } from 'lit/html.js'
|
||||
import { Epml } from '../../../epml'
|
||||
import { groupManagementStyles } from '../components/plugins-css'
|
||||
import {html, LitElement} from 'lit'
|
||||
import {render} from 'lit/html.js'
|
||||
import {Epml} from '../../../epml'
|
||||
import {groupManagementStyles} from '../components/plugins-css'
|
||||
import isElectron from 'is-electron'
|
||||
import '../components/time-elements/index'
|
||||
import '@material/mwc-button'
|
||||
@ -22,7 +22,8 @@ import '@vaadin/grid/vaadin-grid-sort-column.js'
|
||||
import '@vaadin/text-field'
|
||||
|
||||
// Multi language support
|
||||
import { get, registerTranslateConfig, translate, use } from '../../../../core/translate'
|
||||
import {get, registerTranslateConfig, translate, use} from '../../../../core/translate'
|
||||
|
||||
registerTranslateConfig({
|
||||
loader: lang => fetch(`/language/${lang}.json`).then(res => res.json())
|
||||
})
|
||||
@ -49,6 +50,7 @@ class GroupManagement extends LitElement {
|
||||
manageGroupObj: { type: Object },
|
||||
joinGroupObj: { type: Object },
|
||||
leaveGroupObj: { type: Object },
|
||||
secretKeys: { type: Object },
|
||||
btnDisable: { type: Boolean },
|
||||
isLoading: { type: Boolean },
|
||||
createGroupFee: { type: Number },
|
||||
@ -93,7 +95,11 @@ class GroupManagement extends LitElement {
|
||||
haveName: { type: Boolean },
|
||||
myName: { type: String },
|
||||
haveGoName: { type: Boolean },
|
||||
goName: { type: String }
|
||||
goName: { type: String },
|
||||
chatMessageArray: { type: Array },
|
||||
chatInfoName: { type: String },
|
||||
chatInfoId: { type: String },
|
||||
chatInfoMembers: { type: String }
|
||||
}
|
||||
}
|
||||
|
||||
@ -119,6 +125,7 @@ class GroupManagement extends LitElement {
|
||||
this.manageGroupObj = {}
|
||||
this.joinGroupObj = {}
|
||||
this.leaveGroupObj = {}
|
||||
this.secretKeys = {}
|
||||
this.recipientPublicKey = ''
|
||||
this.btnDisable = false
|
||||
this.isLoading = false
|
||||
@ -159,6 +166,10 @@ class GroupManagement extends LitElement {
|
||||
this.myName = ''
|
||||
this.haveGoName = false
|
||||
this.goName = ''
|
||||
this.chatMessageArray = []
|
||||
this.chatInfoName = ''
|
||||
this.chatInfoId = ''
|
||||
this.chatInfoMembers = ''
|
||||
this.selectedView = { id: 'group-members', name: 'Group Members' }
|
||||
}
|
||||
|
||||
@ -167,11 +178,12 @@ class GroupManagement extends LitElement {
|
||||
<div id="group-management-page">
|
||||
<div style="min-height: 48px; display: flex; padding-bottom: 6px; margin: 2px;">
|
||||
<h2 style="margin: 0; flex: 1; padding-top: .1em; display: inline;">${translate("grouppage.gchange1")}</h2>
|
||||
<mwc-button style="float:right;" @click=${() =>
|
||||
this.shadowRoot.querySelector('#createGroupDialog').show()}>
|
||||
<mwc-icon>add</mwc-icon>
|
||||
${translate("grouppage.gchange2")}
|
||||
</mwc-button>
|
||||
<div style="float: right;">
|
||||
<mwc-button @click=${() => this.shadowRoot.querySelector('#createGroupDialog').show()}>
|
||||
<mwc-icon>add</mwc-icon>
|
||||
${translate("grouppage.gchange2")}
|
||||
</mwc-button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="divCard">
|
||||
<h3 style="margin: 0; margin-bottom: 1em; text-align: left;">${translate("grouppage.gchange55")}</h3>
|
||||
@ -197,7 +209,7 @@ class GroupManagement extends LitElement {
|
||||
<br />
|
||||
<vaadin-grid theme="large" id="priveGroupSearchGrid" ?hidden="${this.isEmptyArray(this.privateGroupSearch)}" .items="${this.privateGroupSearch}" aria-label="My Search Result" all-rows-visible>
|
||||
<vaadin-grid-column width="8rem" flex-grow="0" header="${translate("grouppage.gchange54")}" path="memberCount"></vaadin-grid-column>
|
||||
<vaadin-grid-column header="${translate("grouppage.gchange4")}" path="groupName"></vaadin-grid-column>
|
||||
<vaadin-grid-column width="20rem" flex-grow="0" header="${translate("grouppage.gchange4")}" path="groupName"></vaadin-grid-column>
|
||||
<vaadin-grid-column header="${translate("managegroup.mg42")}" .renderer=${(root, column, data) => {
|
||||
if (data.item.isOpen === true) {
|
||||
render(html`${translate("managegroup.mg44")}`, root)
|
||||
@ -207,7 +219,7 @@ class GroupManagement extends LitElement {
|
||||
}}></vaadin-grid-column>
|
||||
<vaadin-grid-column header="${translate("grouppage.gchange5")}" path="description"></vaadin-grid-column>
|
||||
<vaadin-grid-column header="${translate("grouppage.gchange10")}" path="owner"></vaadin-grid-column>
|
||||
<vaadin-grid-column width="11rem" flex-grow="0" header="${translate("grouppage.gchange7")}" .renderer=${(root, column, data) => {
|
||||
<vaadin-grid-column width="11rem" flex-grow="0" header="${translate("datapage.dchange8")}" .renderer=${(root, column, data) => {
|
||||
render(html`
|
||||
<mwc-button @click=${() => this.openJoinGroup(data.item)}>
|
||||
<mwc-icon>queue</mwc-icon>
|
||||
@ -220,13 +232,14 @@ class GroupManagement extends LitElement {
|
||||
<div class="divCard">
|
||||
<h3 style="margin: 0; margin-bottom: 1em; text-align: center;">${translate("grouppage.gchange3")}</h3>
|
||||
<vaadin-grid theme="large" id="joinedGroupsGrid" ?hidden="${this.isEmptyArray(this.joinedGroups)}" .items="${this.joinedGroups}" aria-label="Joined Groups" all-rows-visible>
|
||||
<vaadin-grid-sort-column width="8rem" flex-grow="0" header="${translate("managegroup.mg8")}" path="groupId"></vaadin-grid-sort-column>
|
||||
<vaadin-grid-sort-column width="8rem" flex-grow="0" header="${translate("grouppage.gchange54")}" path="memberCount"></vaadin-grid-sort-column>
|
||||
<vaadin-grid-sort-column header="${translate("grouppage.gchange4")}" path="groupName"></vaadin-grid-sort-column>
|
||||
<vaadin-grid-sort-column width="20rem" flex-grow="0" header="${translate("grouppage.gchange4")}" path="groupName"></vaadin-grid-sort-column>
|
||||
<vaadin-grid-sort-column header="${translate("grouppage.gchange5")}" path="description"></vaadin-grid-sort-column>
|
||||
<vaadin-grid-column width="11rem" flex-grow="0" header="${translate("grouppage.gchange6")}" .renderer=${(root, column, data) => {
|
||||
<vaadin-grid-column width="12rem" flex-grow="0" header="${translate("grouppage.gchange6")}" .renderer=${(root, column, data) => {
|
||||
render(html`${this.renderRole(data.item)}`, root)
|
||||
}}></vaadin-grid-column>
|
||||
<vaadin-grid-column width="11rem" flex-grow="0" header="${translate("registernamepage.nchange7")}" .renderer=${(root, column, data) => {
|
||||
<vaadin-grid-column width="15rem" flex-grow="0" header="${translate("datapage.dchange8")}" .renderer=${(root, column, data) => {
|
||||
render(html`${this.renderManageButton(data.item)}`, root)
|
||||
}}></vaadin-grid-column>
|
||||
</vaadin-grid>
|
||||
@ -240,7 +253,7 @@ class GroupManagement extends LitElement {
|
||||
<h3 style="margin: 0; margin-bottom: 1em; text-align: center;">${translate("managegroup.mg36")}</h3>
|
||||
<vaadin-grid theme="large" id="openGroupInvitesGrid" ?hidden="${this.isEmptyArray(this.groupInvites)}" .items="${this.groupInvites}" aria-label="My Group Invites" all-rows-visible>
|
||||
<vaadin-grid-column width="8rem" flex-grow="0" header="${translate("grouppage.gchange54")}" path="memberCount"></vaadin-grid-column>
|
||||
<vaadin-grid-column header="${translate("grouppage.gchange4")}" path="groupName"></vaadin-grid-column>
|
||||
<vaadin-grid-column width="20rem" flex-grow="0" header="${translate("grouppage.gchange4")}" path="groupName"></vaadin-grid-column>
|
||||
<vaadin-grid-column header="${translate("managegroup.mg42")}" .renderer=${(root, column, data) => {
|
||||
if (data.item.isOpen === true) {
|
||||
render(html`${translate("managegroup.mg44")}`, root)
|
||||
@ -252,7 +265,7 @@ class GroupManagement extends LitElement {
|
||||
const expiryString = new Date(data.item.expiry).toLocaleString()
|
||||
render(html`${expiryString}`, root)
|
||||
}}></vaadin-grid-column>
|
||||
<vaadin-grid-column width="11rem" flex-grow="0" header="${translate("grouppage.gchange7")}" .renderer=${(root, column, data) => {
|
||||
<vaadin-grid-column width="12rem" flex-grow="0" header="${translate("datapage.dchange8")}" .renderer=${(root, column, data) => {
|
||||
render(html`
|
||||
<mwc-button @click=${() => this.openJoinGroup(data.item)}>
|
||||
<mwc-icon>queue</mwc-icon>
|
||||
@ -283,11 +296,12 @@ class GroupManagement extends LitElement {
|
||||
<vaadin-icon slot="prefix" icon="vaadin:search"></vaadin-icon>
|
||||
</vaadin-text-field><br>
|
||||
<vaadin-grid theme="large" id="publicGroupsGrid" .items="${this.filteredItems}" aria-label="Public Open Groups" all-rows-visible>
|
||||
<vaadin-grid-sort-column width="8rem" flex-grow="0" header="${translate("managegroup.mg8")}" path="groupId"></vaadin-grid-sort-column>
|
||||
<vaadin-grid-sort-column width="8rem" flex-grow="0" header="${translate("grouppage.gchange54")}" path="memberCount"></vaadin-grid-sort-column>
|
||||
<vaadin-grid-sort-column header="${translate("grouppage.gchange4")}" path="groupName"></vaadin-grid-sort-column>
|
||||
<vaadin-grid-sort-column width="20rem" flex-grow="0" header="${translate("grouppage.gchange4")}" path="groupName"></vaadin-grid-sort-column>
|
||||
<vaadin-grid-sort-column header="${translate("grouppage.gchange5")}" path="description"></vaadin-grid-sort-column>
|
||||
<vaadin-grid-sort-column header="${translate("grouppage.gchange10")}" path="owner"></vaadin-grid-sort-column>
|
||||
<vaadin-grid-column width="11rem" flex-grow="0" header="${translate("grouppage.gchange7")}" .renderer=${(root, column, data) => {
|
||||
<vaadin-grid-column width="12rem" flex-grow="0" header="${translate("datapage.dchange8")}" .renderer=${(root, column, data) => {
|
||||
render(html`
|
||||
<mwc-button @click=${() => this.openJoinGroup(data.item)}>
|
||||
<mwc-icon>queue</mwc-icon>
|
||||
@ -607,6 +621,20 @@ class GroupManagement extends LitElement {
|
||||
</mwc-button>
|
||||
</mwc-dialog>
|
||||
</div>
|
||||
<!-- Download Progress Dialog -->
|
||||
<paper-dialog id="downloadProgressDialog" class="progress" modal>
|
||||
<div class="lds-roller">
|
||||
<div></div>
|
||||
<div></div>
|
||||
<div></div>
|
||||
<div></div>
|
||||
<div></div>
|
||||
<div></div>
|
||||
<div></div>
|
||||
<div></div>
|
||||
</div>
|
||||
<h2>${translate("chatpage.cchange2")}</h2>
|
||||
</paper-dialog>
|
||||
`
|
||||
}
|
||||
|
||||
@ -642,36 +670,61 @@ class GroupManagement extends LitElement {
|
||||
}
|
||||
|
||||
const getGroupInvites = async () => {
|
||||
let timerGroupInvites
|
||||
let invitedGroupInfo = []
|
||||
let myGroupInvites = []
|
||||
|
||||
const myNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node]
|
||||
const nodeUrl = myNode.protocol + '://' + myNode.domain + ':' + myNode.port
|
||||
|
||||
let timerGroupInvites
|
||||
let myInvitesObj = []
|
||||
let myArrObj = []
|
||||
this.myGroupInvites = []
|
||||
this.myGroupIdArr = []
|
||||
this.myInvites = []
|
||||
this.myInvitesFilter = []
|
||||
this.myJoinedGroups = []
|
||||
this.myOpenInvites = []
|
||||
|
||||
await parentEpml.request('apiCall', {
|
||||
url: `/groups/invites/${this.selectedAddress.address}`
|
||||
}).then(res => {
|
||||
this.myGroupInvites = res
|
||||
url: `/transactions/search?txType=GROUP_INVITE&address=${this.selectedAddress.address}&confirmationStatus=CONFIRMED&limit=0&reverse=false`
|
||||
}).then(response => {
|
||||
this.myInvites = response
|
||||
})
|
||||
|
||||
if (this.isEmptyArray(this.myGroupInvites) === true) {
|
||||
this.myInvitesFilter = this.myInvites.filter(elm => {
|
||||
return elm.invitee === this.selectedAddress.address
|
||||
})
|
||||
|
||||
this.myJoinedGroups = await getJoinedGroups()
|
||||
|
||||
this.myOpenInvites = this.myInvitesFilter.filter(myOpenGroup => {
|
||||
let value = this.myJoinedGroups.some(myJoinedGroup => myOpenGroup.groupId === myJoinedGroup.groupId)
|
||||
return !value
|
||||
})
|
||||
|
||||
if (this.isEmptyArray(this.myOpenInvites) === true) {
|
||||
clearTimeout(timerGroupInvites)
|
||||
timerGroupInvites = setTimeout(getGroupInvites, 300000)
|
||||
} else {
|
||||
const currentTime = Date.now()
|
||||
this.myGroupInvites.forEach(a => {
|
||||
if (a.expiry > currentTime) {
|
||||
let callTheNewInviteUrl = `${nodeUrl}/groups/${a.groupId}`
|
||||
fetch(callTheNewInviteUrl).then(res => {
|
||||
|
||||
this.myOpenInvites.forEach(a => {
|
||||
let expiry = a.timestamp + (a.timeToLive * 1000)
|
||||
|
||||
if (expiry > currentTime || a.timeToLive === 0) {
|
||||
let invitedGroupInfoUrl = `${nodeUrl}/groups/${a.groupId}`
|
||||
fetch(invitedGroupInfoUrl).then(res => {
|
||||
return res.json()
|
||||
}).then(jsonRes => {
|
||||
myArrObj.push(jsonRes)
|
||||
if (myArrObj.length) {
|
||||
myArrObj.forEach(b => {
|
||||
const infoObjToAdd = {
|
||||
invitedGroupInfo.push(jsonRes)
|
||||
if (invitedGroupInfo.length) {
|
||||
let newExpiry
|
||||
|
||||
if (a.timeToLive === 0) {
|
||||
newExpiry = 4070912471000
|
||||
} else {
|
||||
newExpiry = expiry
|
||||
}
|
||||
|
||||
invitedGroupInfo.forEach(b => {
|
||||
const groupInfoObj = {
|
||||
invitee: a.invitee,
|
||||
groupId: b.groupId,
|
||||
owner: b.owner,
|
||||
@ -680,12 +733,12 @@ class GroupManagement extends LitElement {
|
||||
created: b.created,
|
||||
isOpen: b.isOpen,
|
||||
memberCount: b.memberCount,
|
||||
expiry: a.expiry
|
||||
expiry: newExpiry
|
||||
}
|
||||
myInvitesObj.push(infoObjToAdd)
|
||||
myGroupInvites.push(groupInfoObj)
|
||||
})
|
||||
}
|
||||
this.groupInvites = myInvitesObj
|
||||
this.groupInvites = myGroupInvites
|
||||
})
|
||||
}
|
||||
})
|
||||
@ -744,7 +797,7 @@ class GroupManagement extends LitElement {
|
||||
if (sideEffectAction && sideEffectAction.type === 'openJoinGroupModal') {
|
||||
const res = await getGroupInfo(sideEffectAction.data)
|
||||
if (res && res.groupId) {
|
||||
this.joinGroup(res)
|
||||
this.openJoinGroup(res)
|
||||
}
|
||||
window.parent.reduxStore.dispatch(
|
||||
window.parent.reduxAction.setSideEffectAction(null)
|
||||
@ -1901,10 +1954,7 @@ class GroupManagement extends LitElement {
|
||||
}
|
||||
|
||||
uploadAvatar(subName, subIdentifier) {
|
||||
let name = subName
|
||||
let identifier = subIdentifier
|
||||
|
||||
window.location.href = `../qdn/publish/index.html?service=THUMBNAIL&identifier=${identifier}&name=${name}&uploadType=file&category=Avatar&showName=false&showService=false&showIdentifier=false`
|
||||
window.location.href = `../qdn/publish/index.html?service=THUMBNAIL&identifier=${subIdentifier}&name=${subName}&uploadType=file&category=Avatar&showName=false&showService=false&showIdentifier=false`
|
||||
}
|
||||
|
||||
renderGroupAvatar() {
|
||||
@ -1912,15 +1962,15 @@ class GroupManagement extends LitElement {
|
||||
let indentifierForRenderAvatar = 'qortal_group_avatar_' + this.manageGroupId
|
||||
|
||||
if (this.manageGroupId === 1) {
|
||||
return html`<img src="/img/qdcgroup.png" onerror="this.src='/img/incognito.png';">`
|
||||
return html`<img src="/img/qdcgroup.png" onerror="this.src='/img/incognito.png';" alt="">`
|
||||
} else if (this.haveGoName) {
|
||||
const myRenderNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node]
|
||||
const renderAvatarUrl = myRenderNode.protocol + '://' + myRenderNode.domain + ':' + myRenderNode.port
|
||||
const renderGroupAvatarUrl = `${renderAvatarUrl}/arbitrary/THUMBNAIL/${nameForRenderAvatar}/${indentifierForRenderAvatar}?async=true}`
|
||||
|
||||
return html`<img src="${renderGroupAvatarUrl}" onerror="this.src='/img/incognito.png';">`
|
||||
return html`<img src="${renderGroupAvatarUrl}" onerror="this.src='/img/incognito.png';" alt="">`
|
||||
} else {
|
||||
return html`<img src="/img/incognito.png">`
|
||||
return html`<img src="/img/incognito.png" alt="">`
|
||||
}
|
||||
}
|
||||
|
||||
@ -2163,7 +2213,7 @@ class GroupManagement extends LitElement {
|
||||
if (_inviteMemberInfo === '' || _nviteMemberTime === 'reject') {
|
||||
this.shadowRoot.querySelector('#fieldErrorDialog').show()
|
||||
} else {
|
||||
if (_inviteMemberInfo.startsWith('Q') && _inviteMemberInfo.length == 34) {
|
||||
if (_inviteMemberInfo.startsWith('Q') && _inviteMemberInfo.length === 34) {
|
||||
this.getAddressUserResult(_inviteMemberInfo, _nviteMemberTime, _inviteGroupId)
|
||||
} else {
|
||||
this.getNameUserResult(_inviteMemberInfo, _nviteMemberTime, _inviteGroupId)
|
||||
@ -2495,21 +2545,22 @@ class GroupManagement extends LitElement {
|
||||
}
|
||||
|
||||
async getNewGroupInvitesList(theGroup) {
|
||||
let callGroupID = theGroup
|
||||
const myNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node]
|
||||
const nodeUrl = myNode.protocol + '://' + myNode.domain + ':' + myNode.port
|
||||
|
||||
let callGroupID = theGroup
|
||||
let inviteObj = []
|
||||
this.groupInviteMembers = []
|
||||
this.newGroupInvitesList = []
|
||||
|
||||
await parentEpml.request('apiCall', {
|
||||
url: `/groups/invites/group/${callGroupID}`
|
||||
}).then(res => {
|
||||
this.groupInviteMembers = res
|
||||
this.groupInviteMembers = res.filter((item) => item.expiry > Date.now())
|
||||
})
|
||||
|
||||
if (this.groupInviteMembers.length === 0) {
|
||||
|
||||
if (this.isEmptyArray(this.groupInviteMembers)) {
|
||||
// Nothing to do because no open invites
|
||||
} else {
|
||||
this.groupInviteMembers.map(a => {
|
||||
let callTheInviteMember = a.invitee
|
||||
@ -2593,8 +2644,14 @@ class GroupManagement extends LitElement {
|
||||
}
|
||||
|
||||
closeManageGroupOwnerDialog() {
|
||||
this.resetDefaultSettings()
|
||||
this.manageGroupId = ''
|
||||
this.theGroupOwner = ''
|
||||
this.manageGroupName = ''
|
||||
this.manageGroupCount = ''
|
||||
this.manageGroupType = ''
|
||||
this.shadowRoot.getElementById('manageGroupOwnerDialog').close()
|
||||
this.resetDefaultSettings()
|
||||
|
||||
window.location.reload()
|
||||
}
|
||||
|
||||
@ -2605,13 +2662,17 @@ class GroupManagement extends LitElement {
|
||||
}
|
||||
|
||||
async manageGroupOwner(groupObj) {
|
||||
this.shadowRoot.getElementById('downloadProgressDialog').open()
|
||||
const manageGroupDelay = ms => new Promise(res => setTimeout(res, ms))
|
||||
|
||||
let intervalInvites
|
||||
|
||||
this.manageGroupId = ''
|
||||
this.theGroupOwner = ''
|
||||
this.manageGroupName = ''
|
||||
this.manageGroupCount = ''
|
||||
this.manageGroupType = ''
|
||||
this.manageGroupDescription = ''
|
||||
const manageGroupDelay = ms => new Promise(res => setTimeout(res, ms))
|
||||
this.manageGroupObj = groupObj
|
||||
this.manageGroupId = groupObj.groupId
|
||||
this.theGroupOwner = groupObj.owner
|
||||
@ -2619,40 +2680,69 @@ class GroupManagement extends LitElement {
|
||||
this.manageGroupCount = groupObj.memberCount
|
||||
this.manageGroupType = groupObj.isOpen
|
||||
this.manageGroupDescription = groupObj.description
|
||||
|
||||
await this.getNewMemberList(groupObj.groupId)
|
||||
await this.getNewBannedList(groupObj.groupId)
|
||||
await this.getNewGroupInvitesList(groupObj.groupId)
|
||||
await this.getNewGroupJoinList(groupObj.groupId)
|
||||
await this.getGoName(groupObj.owner)
|
||||
await manageGroupDelay(1000)
|
||||
|
||||
this.shadowRoot.getElementById('manageGroupOwnerDialog').open()
|
||||
this.shadowRoot.getElementById('downloadProgressDialog').close()
|
||||
|
||||
intervalInvites = setInterval(() => { this.getNewGroupInvitesList(this.manageGroupId) }, 300000)
|
||||
}
|
||||
|
||||
async manageGroupAdmin(groupObj) {
|
||||
this.shadowRoot.getElementById('downloadProgressDialog').open()
|
||||
const manageGroupDelay = ms => new Promise(res => setTimeout(res, ms))
|
||||
|
||||
let intervalInvites
|
||||
|
||||
this.manageGroupId = ''
|
||||
this.theGroupOwner = ''
|
||||
this.manageGroupName = ''
|
||||
this.manageGroupCount = ''
|
||||
this.manageGroupType = ''
|
||||
const manageGroupDelay = ms => new Promise(res => setTimeout(res, ms))
|
||||
this.manageGroupObj = groupObj
|
||||
this.manageGroupId = groupObj.groupId
|
||||
this.theGroupOwner = groupObj.owner
|
||||
this.manageGroupName = groupObj.groupName
|
||||
this.manageGroupCount = groupObj.memberCount
|
||||
this.manageGroupType = groupObj.isOpen
|
||||
|
||||
await this.getNewMemberList(groupObj.groupId)
|
||||
await this.getNewBannedList(groupObj.groupId)
|
||||
await this.getNewGroupInvitesList(groupObj.groupId)
|
||||
await this.getGoName(groupObj.owner)
|
||||
await manageGroupDelay(1000)
|
||||
|
||||
this.shadowRoot.getElementById('manageGroupOwnerDialog').open()
|
||||
this.shadowRoot.getElementById('downloadProgressDialog').close()
|
||||
|
||||
intervalInvites = setInterval(() => { this.getNewGroupInvitesList(this.manageGroupId) }, 300000)
|
||||
}
|
||||
|
||||
openJoinGroup(groupObj) {
|
||||
this.resetDefaultSettings()
|
||||
this.joinGroupObj = groupObj
|
||||
this.shadowRoot.querySelector('#joinDialog').show()
|
||||
async openJoinGroup(groupObj) {
|
||||
this.joinGroupObj = {}
|
||||
let joinedHroups
|
||||
let requestJoin
|
||||
|
||||
joinedHroups = await parentEpml.request('apiCall', {
|
||||
url: `/groups/member/${this.selectedAddress.address}`
|
||||
})
|
||||
requestJoin = groupObj.groupId
|
||||
|
||||
if (joinedHroups.find(item => item.groupId === requestJoin)) {
|
||||
this.resetDefaultSettings()
|
||||
let allreadyJoindedString = get('grouppage.gchange71')
|
||||
parentEpml.request('showSnackBar', `${allreadyJoindedString}`)
|
||||
} else {
|
||||
this.resetDefaultSettings()
|
||||
this.joinGroupObj = groupObj
|
||||
this.shadowRoot.querySelector('#joinDialog').show()
|
||||
}
|
||||
}
|
||||
|
||||
openLeaveGroup(groupObj) {
|
||||
@ -2746,7 +2836,7 @@ class GroupManagement extends LitElement {
|
||||
const myNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node]
|
||||
const nodeUrl = myNode.protocol + '://' + myNode.domain + ':' + myNode.port
|
||||
const url = `${nodeUrl}/arbitrary/THUMBNAIL/${name}/qortal_avatar?async=true}`
|
||||
return html`<img src='${url}' onerror="this.src='/img/incognito.png';">`
|
||||
return html`<img src='${url}' onerror="this.src='/img/incognito.png';" alt="">`
|
||||
}
|
||||
|
||||
setCreateGroupTxNotification(tx) {
|
||||
@ -3053,6 +3143,17 @@ class GroupManagement extends LitElement {
|
||||
}
|
||||
|
||||
async joinGroup(groupId, groupName) {
|
||||
let nGroupId = ''
|
||||
let nGroupName = ''
|
||||
|
||||
if (typeof groupId === 'object' && groupId !== null) {
|
||||
nGroupId = groupId.groupId
|
||||
nGroupName = groupId.groupName
|
||||
} else {
|
||||
nGroupId = groupId
|
||||
nGroupName = groupName
|
||||
}
|
||||
|
||||
await this.unitJoinGroupFee()
|
||||
|
||||
this.resetDefaultSettings()
|
||||
@ -3083,8 +3184,8 @@ class GroupManagement extends LitElement {
|
||||
params: {
|
||||
fee: joinFeeInput,
|
||||
registrantAddress: this.selectedAddress.address,
|
||||
rGroupName: groupName,
|
||||
rGroupId: groupId,
|
||||
rGroupName: nGroupName,
|
||||
rGroupId: nGroupId,
|
||||
lastReference: lastRef,
|
||||
groupdialog1: groupdialog1,
|
||||
groupdialog2: groupdialog2
|
||||
@ -4042,10 +4143,6 @@ class GroupManagement extends LitElement {
|
||||
if (!arr) { return true }
|
||||
return arr.length === 0
|
||||
}
|
||||
|
||||
round(number) {
|
||||
return (Math.round(parseFloat(number) * 1e8) / 1e8).toFixed(8)
|
||||
}
|
||||
}
|
||||
|
||||
window.customElements.define('group-management', GroupManagement)
|
||||
window.customElements.define('group-management', GroupManagement)
|
||||
|
@ -12,6 +12,7 @@ import '@vaadin/grid'
|
||||
|
||||
// Multi language support
|
||||
import { get, registerTranslateConfig, translate, use } from '../../../../core/translate'
|
||||
|
||||
registerTranslateConfig({
|
||||
loader: lang => fetch(`/language/${lang}.json`).then(res => res.json())
|
||||
})
|
||||
@ -427,7 +428,9 @@ class NodeManagement extends LitElement {
|
||||
|
||||
async addPeer() {
|
||||
this.addPeerLoading = true
|
||||
|
||||
const addPeerAddress = this.shadowRoot.getElementById('addPeerAddress').value
|
||||
|
||||
await parentEpml.request('apiCall', {
|
||||
url: `/peers?apiKey=${this.getApiKey()}`,
|
||||
method: 'POST',
|
||||
@ -456,7 +459,6 @@ class NodeManagement extends LitElement {
|
||||
addMintingAccount() {
|
||||
this.addMintingAccountLoading = true
|
||||
this.addMintingAccountMessage = 'Loading...'
|
||||
|
||||
this.addMintingAccountKey = this.shadowRoot.querySelector('#addMintingAccountKey').value
|
||||
|
||||
parentEpml.request('apiCall', {
|
||||
@ -479,8 +481,10 @@ class NodeManagement extends LitElement {
|
||||
|
||||
updateMintingAccounts() {
|
||||
this.mintingAccounts = []
|
||||
|
||||
parentEpml.request('apiCall', {
|
||||
url: `/admin/mintingaccounts`
|
||||
url: `/admin/mintingaccounts?apiKey=${this.getApiKey()}`,
|
||||
method: 'GET'
|
||||
}).then((res) => {
|
||||
this.mintingAccounts = res
|
||||
})
|
||||
@ -517,10 +521,6 @@ class NodeManagement extends LitElement {
|
||||
if (!arr) { return true }
|
||||
return arr.length === 0
|
||||
}
|
||||
|
||||
round(number) {
|
||||
return (Math.round(parseFloat(number) * 1e8) / 1e8).toFixed(8)
|
||||
}
|
||||
}
|
||||
|
||||
window.customElements.define('node-management', NodeManagement)
|
@ -10,6 +10,7 @@ import '@vaadin/button'
|
||||
|
||||
// Multi language support
|
||||
import { get, registerTranslateConfig, translate, use } from '../../../../core/translate'
|
||||
|
||||
registerTranslateConfig({
|
||||
loader: lang => fetch(`/language/${lang}.json`).then(res => res.json())
|
||||
})
|
||||
@ -144,7 +145,6 @@ class OverviewPage extends LitElement {
|
||||
async firstUpdated() {
|
||||
this.changeTheme()
|
||||
this.changeLanguage()
|
||||
|
||||
this.nodeConfig = window.parent.reduxStore.getState().app.nodeConfig
|
||||
this.accountInfo = window.parent.reduxStore.getState().app.accountInfo
|
||||
|
||||
@ -199,11 +199,13 @@ class OverviewPage extends LitElement {
|
||||
|
||||
changeTheme() {
|
||||
const checkTheme = localStorage.getItem('qortalTheme')
|
||||
|
||||
if (checkTheme === 'dark') {
|
||||
this.theme = 'dark'
|
||||
} else {
|
||||
this.theme = 'light'
|
||||
}
|
||||
|
||||
document.querySelector('html').setAttribute('theme', this.theme)
|
||||
}
|
||||
|
||||
@ -225,6 +227,7 @@ class OverviewPage extends LitElement {
|
||||
async refreshItems() {
|
||||
this.nodeConfig = window.parent.reduxStore.getState().app.nodeConfig
|
||||
this.accountInfo = window.parent.reduxStore.getState().app.accountInfo
|
||||
|
||||
await this.getNodeInfo()
|
||||
await this.getCoreInfo()
|
||||
await this.getBalanceInfo()
|
||||
@ -234,12 +237,14 @@ class OverviewPage extends LitElement {
|
||||
async getMintingKeysList() {
|
||||
this.check1 = false
|
||||
this.check2 = false
|
||||
|
||||
const myNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node]
|
||||
const nodeStatus = myNode.protocol + '://' + myNode.domain + ':' + myNode.port
|
||||
const statusUrl = `${nodeStatus}/admin/mintingaccounts`
|
||||
const statusUrl = `${nodeStatus}/admin/mintingaccounts?apiKey=${this.getApiKey()}`
|
||||
|
||||
try {
|
||||
const res = await fetch(statusUrl)
|
||||
|
||||
this.listAccounts = await res.json()
|
||||
|
||||
const addressInfo = window.parent.reduxStore.getState().app.accountInfo.addressInfo
|
||||
@ -249,7 +254,6 @@ class OverviewPage extends LitElement {
|
||||
const findRemovedSponsorsKey = this.listAccounts.filter((my) => my.address)
|
||||
|
||||
this.check1 = findMyMintingAccount !== undefined
|
||||
|
||||
this.check2 = findMyMintingRecipient !== undefined
|
||||
|
||||
if (findRemovedSponsorsKey.length > 0) {
|
||||
@ -285,8 +289,7 @@ class OverviewPage extends LitElement {
|
||||
this.cssStatus = ''
|
||||
return html`<span class="btn btn-sm btn-info float-right">${translate("walletprofile.wp1")}</span>`
|
||||
} else if (this.nodeInfo.isMintingPossible === true && this.nodeInfo.isSynchronizing === false && this.check1 === false && this.check2 === true && addressInfo.level == 0 && addressInfo.blocksMinted < 7200) {
|
||||
this.cssStatus = ''
|
||||
return html`<span class="btn btn-sm btn-info float-right">${translate("becomeMinterPage.bchange12")}</span>`
|
||||
return html`<span class="float-right"><start-minting-now></start-minting-now></span>`
|
||||
} else if (this.check1 === false && this.check2 === false && myMintingKey === true) {
|
||||
return html`<span class="float-right"><start-minting-now></start-minting-now></span>`
|
||||
} else if (myMintingKey === false) {
|
||||
@ -319,6 +322,7 @@ class OverviewPage extends LitElement {
|
||||
const infoNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node]
|
||||
const infoNodeUrl = infoNode.protocol + '://' + infoNode.domain + ':' + infoNode.port
|
||||
const nodeUrl = `${infoNodeUrl}/admin/status`
|
||||
|
||||
await fetch(nodeUrl).then(response => {
|
||||
return response.json()
|
||||
}).then(data => {
|
||||
@ -332,6 +336,7 @@ class OverviewPage extends LitElement {
|
||||
const infoCore = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node]
|
||||
const infoCoreUrl = infoCore.protocol + '://' + infoCore.domain + ':' + infoCore.port
|
||||
const coreUrl = `${infoCoreUrl}/admin/info`
|
||||
|
||||
await fetch(coreUrl).then(response => {
|
||||
return response.json()
|
||||
}).then(data => {
|
||||
@ -344,6 +349,7 @@ class OverviewPage extends LitElement {
|
||||
const infoBalance = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node]
|
||||
const infoBalanceUrl = infoBalance.protocol + '://' + infoBalance.domain + ':' + infoBalance.port
|
||||
const balanceUrl = `${infoBalanceUrl}/addresses/balance/${this.accountInfo.addressInfo.address}`
|
||||
|
||||
await fetch(balanceUrl).then(response => {
|
||||
return response.json()
|
||||
}).then(data => {
|
||||
@ -422,7 +428,7 @@ class StartMintingNow extends LitElement {
|
||||
async getMintingAcccounts() {
|
||||
const myNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node]
|
||||
const nodeUrl = myNode.protocol + '://' + myNode.domain + ':' + myNode.port
|
||||
const url = `${nodeUrl}/admin/mintingaccounts`
|
||||
const url = `${nodeUrl}/admin/mintingaccounts?apiKey=${this.getApiKey()}`
|
||||
try {
|
||||
const res = await fetch(url)
|
||||
this.mintingAccountData = await res.json()
|
||||
@ -484,7 +490,9 @@ class StartMintingNow extends LitElement {
|
||||
|
||||
let interval = null
|
||||
let stop = false
|
||||
|
||||
this.status = 2
|
||||
|
||||
const getAnswer = async () => {
|
||||
const rewardShares = async (minterAddr) => {
|
||||
const url = `${nodeUrl}/addresses/rewardshares?minters=${minterAddr}&recipients=${minterAddr}`
|
||||
@ -508,6 +516,7 @@ class StartMintingNow extends LitElement {
|
||||
stop = false
|
||||
}
|
||||
}
|
||||
|
||||
interval = setInterval(getAnswer, 5000)
|
||||
}
|
||||
|
||||
|
@ -41,7 +41,7 @@
|
||||
html,
|
||||
body {
|
||||
margin: 0;
|
||||
font-family: "Roboto", sans-serif;
|
||||
font-family: "Twemoji Country Flags", "Roboto", sans-serif;
|
||||
background: var(--plugback);
|
||||
overflow: hidden;
|
||||
}
|
||||
|
@ -3,13 +3,23 @@ import { render } from 'lit/html.js'
|
||||
import { Epml } from '../../../epml'
|
||||
import { passiveSupport } from 'passive-events-support/src/utils'
|
||||
import { Editor, Extension } from '@tiptap/core'
|
||||
import { supportCountryFlagEmojis } from '../components/ChatEmojiFlags'
|
||||
import { qchatStyles } from '../components/plugins-css'
|
||||
import {
|
||||
decryptGroupData,
|
||||
uint8ArrayToBase64,
|
||||
base64ToUint8Array,
|
||||
uint8ArrayToObject,
|
||||
validateSecretKey
|
||||
} from '../components/GroupEncryption'
|
||||
import Base58 from '../../../../crypto/api/deps/Base58'
|
||||
import isElectron from 'is-electron'
|
||||
import WebWorker from 'web-worker:./computePowWorker'
|
||||
import StarterKit from '@tiptap/starter-kit'
|
||||
import Underline from '@tiptap/extension-underline'
|
||||
import Placeholder from '@tiptap/extension-placeholder'
|
||||
import Highlight from '@tiptap/extension-highlight'
|
||||
import Mention from '@tiptap/extension-mention'
|
||||
import ShortUniqueId from 'short-unique-id'
|
||||
import snackbar from '../components/snackbar'
|
||||
import '../components/ChatWelcomePage'
|
||||
@ -22,9 +32,14 @@ import '@material/mwc-button'
|
||||
import '@material/mwc-dialog'
|
||||
import '@material/mwc-icon'
|
||||
import '@material/mwc-snackbar'
|
||||
import '@material/mwc-textfield'
|
||||
import '@polymer/paper-dialog/paper-dialog.js'
|
||||
import '@polymer/iron-icons/iron-icons.js'
|
||||
import '@polymer/paper-icon-button/paper-icon-button.js'
|
||||
import '@polymer/paper-spinner/paper-spinner-lite.js'
|
||||
import '@vaadin/grid'
|
||||
import '@vaadin/tooltip'
|
||||
import '@vaadin/text-field'
|
||||
|
||||
// Multi language support
|
||||
import { get, registerTranslateConfig, translate, use } from '../../../../core/translate'
|
||||
@ -35,6 +50,7 @@ registerTranslateConfig({
|
||||
const parentEpml = new Epml({ type: 'WINDOW', source: window.parent })
|
||||
|
||||
passiveSupport({ events: ['touchstart'] })
|
||||
supportCountryFlagEmojis()
|
||||
|
||||
class Chat extends LitElement {
|
||||
static get properties() {
|
||||
@ -47,6 +63,7 @@ class Chat extends LitElement {
|
||||
messages: { type: Array },
|
||||
btnDisable: { type: Boolean },
|
||||
isLoading: { type: Boolean },
|
||||
isViewOpen: { type: Boolean },
|
||||
balance: { type: Number },
|
||||
theme: { type: String, reflect: true },
|
||||
blockedUsers: { type: Array },
|
||||
@ -54,6 +71,7 @@ class Chat extends LitElement {
|
||||
privateMessagePlaceholder: { type: String },
|
||||
imageFile: { type: Object },
|
||||
activeChatHeadUrl: { type: String },
|
||||
switchChatHeadUrl: { type: String },
|
||||
openPrivateMessage: { type: Boolean },
|
||||
userFound: { type: Array },
|
||||
userFoundModalOpen: { type: Boolean },
|
||||
@ -87,6 +105,7 @@ class Chat extends LitElement {
|
||||
this.messages = []
|
||||
this.btnDisable = false
|
||||
this.isLoading = false
|
||||
this.isViewOpen = false
|
||||
this.showNewMessageBar = this.showNewMessageBar.bind(this)
|
||||
this.hideNewMessageBar = this.hideNewMessageBar.bind(this)
|
||||
this.setOpenPrivateMessage = this.setOpenPrivateMessage.bind(this)
|
||||
@ -98,6 +117,7 @@ class Chat extends LitElement {
|
||||
this.privateMessagePlaceholder = ''
|
||||
this.imageFile = null
|
||||
this.activeChatHeadUrl = ''
|
||||
this.switchChatHeadUrl = ''
|
||||
this.openPrivateMessage = false
|
||||
this.userFound = []
|
||||
this.userFoundModalOpen = false
|
||||
@ -125,6 +145,17 @@ class Chat extends LitElement {
|
||||
</vaadin-tooltip>
|
||||
</div>
|
||||
<div style="display:flex; align-items:center;gap:10px">
|
||||
<div id="viewChat" class="create-chat" @click=${() => { this.openView(this.activeChatHeadUrl) }}>
|
||||
<mwc-icon style="color: var(--black);">pageview</mwc-icon>
|
||||
<vaadin-tooltip
|
||||
for="viewChat"
|
||||
position="top"
|
||||
hover-delay=${200}
|
||||
hide-delay=${1}
|
||||
text="Switch Chat Over ID"
|
||||
>
|
||||
</vaadin-tooltip>
|
||||
</div>
|
||||
<div id="goToGroup" class="create-chat" @click=${() => { this.openTabToGroupManagement() }}>
|
||||
<mwc-icon style="color: var(--black);">group_add</mwc-icon>
|
||||
<vaadin-tooltip
|
||||
@ -149,7 +180,7 @@ class Chat extends LitElement {
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<ul class="list">
|
||||
<ul>
|
||||
${this.isEmptyArray(this.chatHeads) ? this.renderLoadingText() : this.renderChatHead(this.chatHeads)}
|
||||
</ul>
|
||||
</div>
|
||||
@ -159,7 +190,11 @@ class Chat extends LitElement {
|
||||
<span>${translate("chatpage.cchange5")} <mwc-icon style="font-size: 16px; vertical-align: bottom;">keyboard_arrow_down</mwc-icon></span>
|
||||
</div>
|
||||
<div class="chat-history">
|
||||
${this.activeChatHeadUrl ? html`${this.renderChatPage()}` : html`${this.renderChatWelcomePage()}`}
|
||||
${this.activeChatHeadUrl ?
|
||||
html`${this.renderChatPage()}`
|
||||
: this.isViewOpen ? html`${this.renderChatViewPage()}`
|
||||
: html`${this.renderChatWelcomePage()}`
|
||||
}
|
||||
</div>
|
||||
</div>
|
||||
<!-- Start Chatting Dialog -->
|
||||
@ -288,6 +323,26 @@ class Chat extends LitElement {
|
||||
${translate("general.close")}
|
||||
</mwc-button>
|
||||
</mwc-dialog>
|
||||
<!-- View Chat Over ID -->
|
||||
<paper-dialog id="viewChatDialog" class="viewSettings" modal>
|
||||
<div style="display: inline;">
|
||||
<div class="view">
|
||||
<vaadin-text-field
|
||||
style="width: 350px"
|
||||
id="groupIdInput"
|
||||
required
|
||||
allowed-char-pattern="[0-9]"
|
||||
placeholder="${translate("modals.mpchange87")}"
|
||||
value=""
|
||||
@keydown="${this.viewKeyListener}"
|
||||
clear-button-visible
|
||||
>
|
||||
</vaadin-text-field>
|
||||
<paper-icon-button icon="icons:visibility" @click="${() => this.switchChatID()}" title="${translate("general.view")}"></paper-icon-button>
|
||||
<paper-icon-button icon="icons:close" @click="${() => this.closeView()}" title="${translate("general.close")}"></paper-icon-button>
|
||||
</div>
|
||||
</div>
|
||||
</paper-dialog>
|
||||
</div>
|
||||
`
|
||||
}
|
||||
@ -426,9 +481,222 @@ class Chat extends LitElement {
|
||||
}, 60000)
|
||||
}
|
||||
|
||||
async switchChatID() {
|
||||
let viewGroupID = 0
|
||||
let checkTheID = {}
|
||||
let notFound = 'Group ID not found! Please try again...'
|
||||
let wentWrong = 'Something went wrong! Please try again...'
|
||||
|
||||
viewGroupID = this.shadowRoot.getElementById('groupIdInput').value
|
||||
|
||||
await parentEpml.request('apiCall', {
|
||||
url: `/groups/${viewGroupID}`
|
||||
}).then(res => {
|
||||
checkTheID = res
|
||||
})
|
||||
|
||||
if (checkTheID.error) {
|
||||
this.shadowRoot.getElementById('viewChatDialog').close()
|
||||
this.shadowRoot.getElementById('groupIdInput').value = ''
|
||||
this.isViewOpen = false
|
||||
this.activeChatHeadUrl = this.switchChatHeadUrl
|
||||
this.switchChatHeadUrl = ''
|
||||
this.resetChatEditor()
|
||||
parentEpml.request('showSnackBar', `${notFound}`)
|
||||
} else if (checkTheID.groupId) {
|
||||
let switchToID = checkTheID.groupName
|
||||
this.shadowRoot.getElementById('viewChatDialog').close()
|
||||
this.shadowRoot.getElementById('groupIdInput').value = ''
|
||||
this.switchChatHeadUrl = ''
|
||||
parentEpml.request('showSnackBar', `${switchToID}`)
|
||||
this.processChatID(checkTheID.groupId)
|
||||
} else {
|
||||
this.shadowRoot.getElementById('viewChatDialog').close()
|
||||
this.shadowRoot.getElementById('groupIdInput').value = ''
|
||||
this.isViewOpen = false
|
||||
this.activeChatHeadUrl = this.switchChatHeadUrl
|
||||
this.switchChatHeadUrl = ''
|
||||
this.resetChatEditor()
|
||||
parentEpml.request('showSnackBar', `${wentWrong}`)
|
||||
}
|
||||
}
|
||||
|
||||
openView(currentUrl) {
|
||||
this.switchChatHeadUrl = currentUrl
|
||||
this.activeChatHeadUrl = ''
|
||||
this.isViewOpen = true
|
||||
this.shadowRoot.getElementById('viewChatDialog').open()
|
||||
this.shadowRoot.getElementById('groupIdInput').value = ''
|
||||
this.resetChatEditor()
|
||||
}
|
||||
|
||||
closeView() {
|
||||
this.shadowRoot.getElementById('viewChatDialog').close()
|
||||
this.shadowRoot.getElementById('groupIdInput').value = ''
|
||||
this.isViewOpen = false
|
||||
this.activeChatHeadUrl = this.switchChatHeadUrl
|
||||
this.switchChatHeadUrl = ''
|
||||
this.resetChatEditor()
|
||||
}
|
||||
|
||||
viewKeyListener(e) {
|
||||
if (e.key === 'Enter') {
|
||||
this.switchChatID()
|
||||
}
|
||||
}
|
||||
|
||||
async processChatID(newID) {
|
||||
let viewNewUrl = 'group/' + newID
|
||||
this.setActiveChatHeadUrl(viewNewUrl)
|
||||
this.resetChatEditor()
|
||||
}
|
||||
|
||||
async setActiveChatHeadUrl(url) {
|
||||
this.activeChatHeadUrl = url
|
||||
this.requestUpdate()
|
||||
await this.getSymKeyFile(url)
|
||||
this.isViewOpen = false
|
||||
}
|
||||
|
||||
async getSymKeyFile(url) {
|
||||
this.secretKeys = {}
|
||||
this.groupAdmins = {}
|
||||
|
||||
let data
|
||||
let supArray = []
|
||||
let allSymKeys = []
|
||||
let gAdmin = ''
|
||||
let gAddress = ''
|
||||
let currentGroupId = url.substring(6)
|
||||
let symIdentifier = 'symmetric-qchat-group-' + currentGroupId
|
||||
let locateString = "Downloading and decrypt keys! Please wait..."
|
||||
let keysToOld = "Wait until an admin re-encrypts the keys. Only unencrypted messages will be displayed."
|
||||
let retryDownload = "Retry downloading and decrypt keys in 5 seconds! Please wait..."
|
||||
let failDownload = "Error downloading and decrypt keys! Only unencrypted messages will be displayed. Please try again later..."
|
||||
let all_ok = false
|
||||
let counter = 0
|
||||
|
||||
const myNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node]
|
||||
const nodeUrl = myNode.protocol + '://' + myNode.domain + ':' + myNode.port
|
||||
const getNameUrl = `${nodeUrl}/arbitrary/resources?service=DOCUMENT_PRIVATE&identifier=${symIdentifier}&limit=0&reverse=true`
|
||||
const getAdminUrl = `${nodeUrl}/groups/members/${currentGroupId}?onlyAdmins=true&limit=0`
|
||||
|
||||
if (localStorage.getItem("symKeysCurrent") === null) {
|
||||
localStorage.setItem("symKeysCurrent", "")
|
||||
}
|
||||
|
||||
supArray = await fetch(getNameUrl).then(response => {
|
||||
return response.json()
|
||||
})
|
||||
|
||||
if (this.isEmptyArray(supArray) || currentGroupId === 0) {
|
||||
this.activeChatHeadUrl = url
|
||||
this.requestUpdate()
|
||||
} else {
|
||||
parentEpml.request('showSnackBar', `${locateString}`)
|
||||
|
||||
supArray.forEach(item => {
|
||||
const symInfoObj = {
|
||||
name: item.name,
|
||||
identifier: item.identifier,
|
||||
timestamp: item.updated ? item.updated : item.created
|
||||
}
|
||||
allSymKeys.push(symInfoObj)
|
||||
})
|
||||
|
||||
let allSymKeysSorted = allSymKeys.sort(function(a, b) {
|
||||
return b.timestamp - a.timestamp
|
||||
})
|
||||
|
||||
gAdmin = allSymKeysSorted[0].name
|
||||
|
||||
const addressUrl = `${nodeUrl}/names/${gAdmin}`
|
||||
|
||||
let addressObject = await fetch(addressUrl).then(response => {
|
||||
return response.json()
|
||||
})
|
||||
|
||||
gAddress = addressObject.owner
|
||||
|
||||
let adminRes = await fetch(getAdminUrl).then(response => {
|
||||
return response.json()
|
||||
})
|
||||
|
||||
this.groupAdmins = adminRes.members
|
||||
|
||||
const adminExists = (adminAddress) => {
|
||||
return this.groupAdmins.some(function(checkAdmin) {
|
||||
return checkAdmin.member === adminAddress
|
||||
})
|
||||
}
|
||||
|
||||
if (adminExists(gAddress)) {
|
||||
const sleep = (t) => new Promise(r => setTimeout(r, t))
|
||||
const dataUrl = `${nodeUrl}/arbitrary/DOCUMENT_PRIVATE/${gAdmin}/${symIdentifier}?encoding=base64`
|
||||
const res = await fetch(dataUrl)
|
||||
|
||||
do {
|
||||
counter++
|
||||
|
||||
if (!res.ok) {
|
||||
parentEpml.request('showSnackBar', `${retryDownload}`)
|
||||
await sleep(5000)
|
||||
} else {
|
||||
data = await res.text()
|
||||
all_ok = true
|
||||
}
|
||||
|
||||
if (counter > 10) {
|
||||
parentEpml.request('showSnackBar', `${failDownload}`)
|
||||
this.activeChatHeadUrl = url
|
||||
this.requestUpdate()
|
||||
return
|
||||
}
|
||||
} while (!all_ok)
|
||||
|
||||
const decryptedKey = await this.decryptGroupEncryption(data)
|
||||
|
||||
if (decryptedKey === undefined) {
|
||||
parentEpml.request('showSnackBar', `${keysToOld}`)
|
||||
this.activeChatHeadUrl = url
|
||||
this.requestUpdate()
|
||||
} else {
|
||||
const dataint8Array = base64ToUint8Array(decryptedKey.data)
|
||||
const decryptedKeyToObject = uint8ArrayToObject(dataint8Array)
|
||||
|
||||
if (!validateSecretKey(decryptedKeyToObject)) {
|
||||
throw new Error("SecretKey is not valid")
|
||||
}
|
||||
|
||||
localStorage.removeItem("symKeysCurrent")
|
||||
localStorage.setItem("symKeysCurrent", "")
|
||||
let oldSymIdentifier = JSON.parse(localStorage.getItem("symKeysCurrent") || "[]")
|
||||
oldSymIdentifier.push(decryptedKeyToObject)
|
||||
localStorage.setItem("symKeysCurrent", JSON.stringify(oldSymIdentifier))
|
||||
|
||||
let arraySecretKeys = JSON.parse(localStorage.getItem("symKeysCurrent") || "[]")
|
||||
|
||||
this.secretKeys = arraySecretKeys[0]
|
||||
this.activeChatHeadUrl = url
|
||||
this.requestUpdate()
|
||||
}
|
||||
} else {
|
||||
this.activeChatHeadUrl = url
|
||||
this.requestUpdate()
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
async decryptGroupEncryption(data) {
|
||||
try {
|
||||
const privateKey = Base58.encode(window.parent.reduxStore.getState().app.wallet._addresses[0].keyPair.privateKey)
|
||||
const encryptedData = decryptGroupData(data, privateKey)
|
||||
return {
|
||||
data: uint8ArrayToBase64(encryptedData.decryptedData),
|
||||
count: encryptedData.count
|
||||
}
|
||||
} catch (error) {
|
||||
console.log("Error:", error.message)
|
||||
}
|
||||
}
|
||||
|
||||
resetChatEditor() {
|
||||
@ -459,6 +727,7 @@ class Chat extends LitElement {
|
||||
StarterKit,
|
||||
Underline,
|
||||
Highlight,
|
||||
Mention,
|
||||
Placeholder.configure({
|
||||
placeholder: 'Write something …'
|
||||
}),
|
||||
@ -903,6 +1172,22 @@ class Chat extends LitElement {
|
||||
`
|
||||
}
|
||||
|
||||
renderChatViewPage() {
|
||||
return html`
|
||||
<div class="view-grid">
|
||||
<div></div>
|
||||
<div></div>
|
||||
<div></div>
|
||||
<div></div>
|
||||
<div></div>
|
||||
<div></div>
|
||||
<div></div>
|
||||
<div></div>
|
||||
<div></div>
|
||||
</div>
|
||||
`
|
||||
}
|
||||
|
||||
renderChatHead(chatHeadArr) {
|
||||
return chatHeadArr.map(eachChatHead => {
|
||||
return html`<chat-head activeChatHeadUrl=${this.activeChatHeadUrl} .setActiveChatHeadUrl=${(val) => this.setActiveChatHeadUrl(val)} chatInfo=${JSON.stringify(eachChatHead)}></chat-head>`
|
||||
@ -957,6 +1242,20 @@ class Chat extends LitElement {
|
||||
}
|
||||
}
|
||||
|
||||
async getGroupType(newGroupId) {
|
||||
try {
|
||||
const myNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node]
|
||||
const nodeUrl = myNode.protocol + '://' + myNode.domain + ':' + myNode.port
|
||||
const response = await fetch(`${nodeUrl}/groups/${newGroupId}`)
|
||||
const data = await response.json()
|
||||
|
||||
return data.isOpen
|
||||
} catch (error) {
|
||||
console.error('Error fetching group type', error)
|
||||
throw error
|
||||
}
|
||||
}
|
||||
|
||||
async setChatHeads(chatObj) {
|
||||
const chatObjGroups = Array.isArray(chatObj.groups) ? chatObj.groups : []
|
||||
const chatObjDirect = Array.isArray(chatObj.direct) ? chatObj.direct : []
|
||||
@ -966,12 +1265,14 @@ class Chat extends LitElement {
|
||||
url: `group/${group.groupId}`,
|
||||
groupName: 'Qortal General Chat',
|
||||
timestamp: group.timestamp === undefined ? 2 : group.timestamp,
|
||||
sender: group.sender
|
||||
sender: group.sender,
|
||||
isOpen: true
|
||||
} : {
|
||||
...group,
|
||||
timestamp: group.timestamp === undefined ? 1 : group.timestamp,
|
||||
url: `group/${group.groupId}`,
|
||||
ownerName: group.ownerName === undefined ? await this.getOwnerName(group.groupId) : 'undefined'
|
||||
ownerName: group.ownerName === undefined ? await this.getOwnerName(group.groupId) : 'undefined',
|
||||
isOpen: group.isOpen === undefined ? await this.getGroupType(group.groupId) : true
|
||||
}))
|
||||
|
||||
let directList = chatObjDirect.map(dc => {
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -13,6 +13,7 @@ import '@vaadin/grid'
|
||||
|
||||
// Multi language support
|
||||
import { get, registerTranslateConfig, translate, use } from '../../../../core/translate'
|
||||
|
||||
registerTranslateConfig({
|
||||
loader: lang => fetch(`/language/${lang}.json`).then(res => res.json())
|
||||
})
|
||||
@ -346,7 +347,7 @@ class RewardShare extends LitElement {
|
||||
getTxnRequestResponse(myTransaction)
|
||||
}
|
||||
} else if (accountDetails.address === recipientAddress) {
|
||||
if (accountDetails.level >= 1 && accountDetails.level <= 4) {
|
||||
if (accountDetails.level <= 4) {
|
||||
this.error = false
|
||||
this.message = ''
|
||||
let myTransaction = await makeTransactionRequest(lastRef)
|
||||
@ -361,7 +362,6 @@ class RewardShare extends LitElement {
|
||||
getTxnRequestResponse(myTransaction)
|
||||
}
|
||||
} else if (accountDetails.level >= 5) {
|
||||
|
||||
this.error = false
|
||||
this.message = ''
|
||||
let myTransaction = await makeTransactionRequest(lastRef)
|
||||
@ -504,7 +504,7 @@ class RewardShare extends LitElement {
|
||||
getTxnRequestResponse(myTransaction)
|
||||
}
|
||||
} else if (accountDetails.address === recipientAddress) {
|
||||
if (accountDetails.level >= 1 && accountDetails.level <= 4) {
|
||||
if (accountDetails.level <= 4) {
|
||||
this.error = false
|
||||
this.message = ''
|
||||
let myTransaction = await makeTransactionRequest(lastRef)
|
||||
@ -519,7 +519,6 @@ class RewardShare extends LitElement {
|
||||
getTxnRequestResponse(myTransaction)
|
||||
}
|
||||
} else if (accountDetails.level >= 5) {
|
||||
|
||||
this.error = false
|
||||
this.message = ''
|
||||
let myTransaction = await makeTransactionRequest(lastRef)
|
||||
@ -680,4 +679,4 @@ class RewardShare extends LitElement {
|
||||
}
|
||||
}
|
||||
|
||||
window.customElements.define('reward-share', RewardShare)
|
||||
window.customElements.define('reward-share', RewardShare)
|
||||
|
@ -136,9 +136,10 @@ function attemptReconnectNodeStatusSocket() {
|
||||
const initBlockSocket = () => {
|
||||
let myNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node]
|
||||
let nodeUrl = myNode.domain + ":" + myNode.port
|
||||
let nodeProtocol = myNode.protocol
|
||||
let activeBlockSocketLink
|
||||
|
||||
if (window.parent.location.protocol === "https:") {
|
||||
if (nodeProtocol === "https") {
|
||||
activeBlockSocketLink = `wss://${nodeUrl}/websockets/blocks`
|
||||
} else {
|
||||
activeBlockSocketLink = `ws://${nodeUrl}/websockets/blocks`
|
||||
@ -205,9 +206,10 @@ const pingactiveBlockSocket = () => {
|
||||
const initNodeStatusSocket = () => {
|
||||
let myNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node]
|
||||
let nodeUrl = myNode.domain + ":" + myNode.port
|
||||
let nodeProtocol = myNode.protocol
|
||||
let activeNodeStatusSocketLink
|
||||
|
||||
if (window.parent.location.protocol === "https:") {
|
||||
if (nodeProtocol === "https") {
|
||||
activeNodeStatusSocketLink = `wss://${nodeUrl}/websockets/admin/status`
|
||||
} else {
|
||||
activeNodeStatusSocketLink = `ws://${nodeUrl}/websockets/admin/status`
|
||||
|
@ -112,9 +112,10 @@ parentEpml.subscribe('logged_in', async isLoggedIn => {
|
||||
const initChatHeadSocket = () => {
|
||||
let myNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node]
|
||||
let nodeUrl = myNode.domain + ":" + myNode.port
|
||||
let nodeProtocol = myNode.protocol
|
||||
let activeChatSocketLink
|
||||
|
||||
if (window.parent.location.protocol === "https:") {
|
||||
if (nodeProtocol === "https") {
|
||||
activeChatSocketLink = `wss://${nodeUrl}/websockets/chat/active/${window.parent.reduxStore.getState().app.selectedAddress.address}?encoding=BASE64`
|
||||
} else {
|
||||
activeChatSocketLink = `ws://${nodeUrl}/websockets/chat/active/${window.parent.reduxStore.getState().app.selectedAddress.address}?encoding=BASE64`
|
||||
|
@ -2882,7 +2882,7 @@ class TradeBotPortal extends LitElement {
|
||||
const initTradeOffersWebSocket = (restarted = false) => {
|
||||
let tradeOffersSocketCounter = 0
|
||||
let socketTimeout
|
||||
let socketLink = `ws://NODEURL/websockets/crosschain/tradeoffers?foreignBlockchain=FOREIGN_BLOCKCHAIN&includeHistoric=true`
|
||||
let socketLink = `PROTOCOL://NODEURL/websockets/crosschain/tradeoffers?foreignBlockchain=FOREIGN_BLOCKCHAIN&includeHistoric=true`
|
||||
const socket = new WebSocket(socketLink)
|
||||
socket.onopen = () => {
|
||||
setTimeout(pingSocket, 50)
|
||||
@ -2914,7 +2914,7 @@ class TradeBotPortal extends LitElement {
|
||||
|
||||
const initTradeBotWebSocket = (restarted = false) => {
|
||||
let socketTimeout
|
||||
let socketLink = `ws://NODEURL/websockets/crosschain/tradebot?foreignBlockchain=FOREIGN_BLOCKCHAIN`
|
||||
let socketLink = `PROTOCOL://NODEURL/websockets/crosschain/tradebot?foreignBlockchain=FOREIGN_BLOCKCHAIN`
|
||||
const socket = new WebSocket(socketLink)
|
||||
socket.onopen = () => {
|
||||
setTimeout(pingSocket, 50)
|
||||
@ -2943,7 +2943,7 @@ class TradeBotPortal extends LitElement {
|
||||
|
||||
const initTradePresenceWebSocket = (restarted = false) => {
|
||||
let socketTimeout
|
||||
let socketLink = `ws://NODEURL/websockets/crosschain/tradepresence`
|
||||
let socketLink = `PROTOCOL://NODEURL/websockets/crosschain/tradepresence`
|
||||
const socket = new WebSocket(socketLink)
|
||||
socket.onopen = () => {
|
||||
setTimeout(pingSocket, 50)
|
||||
@ -3289,10 +3289,19 @@ class TradeBotPortal extends LitElement {
|
||||
|
||||
let myNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node]
|
||||
let nodeUrl = myNode.domain + ':' + myNode.port
|
||||
let nodeProtocol = myNode.protocol
|
||||
let checkProtocol
|
||||
|
||||
if (nodeProtocol === "https") {
|
||||
checkProtocol = 'wss'
|
||||
} else {
|
||||
checkProtocol = 'ws'
|
||||
}
|
||||
|
||||
const modifiers = [
|
||||
{ searchValue: 'PROTOCOL', replaceValue: checkProtocol },
|
||||
{ searchValue: 'NODEURL', replaceValue: nodeUrl },
|
||||
{ searchValue: 'FOREIGN_BLOCKCHAIN', replaceValue: this.selectedCoin },
|
||||
{ searchValue: 'FOREIGN_BLOCKCHAIN', replaceValue: this.selectedCoin }
|
||||
]
|
||||
|
||||
workers.get(this.selectedCoin).tradesConnectedWorker = this.inlineWorker(this.initSocket, modifiers)
|
||||
|
@ -30,6 +30,7 @@ import '@polymer/paper-spinner/paper-spinner-lite.js'
|
||||
import '@vaadin/grid'
|
||||
import '@vaadin/grid/vaadin-grid-sorter'
|
||||
import '@vaadin/password-field'
|
||||
import '@vaadin/grid/vaadin-grid-selection-column.js'
|
||||
|
||||
// Multi language support
|
||||
import { get, registerTranslateConfig, translate, use } from '../../../../core/translate'
|
||||
@ -498,6 +499,10 @@ class TradePortal extends LitElement {
|
||||
|
||||
this._openOrdersGrid = this.shadowRoot.getElementById('openOrdersGrid')
|
||||
|
||||
this._openOrdersGrid.addEventListener("selected-items-changed", function(event){
|
||||
_this.fillBuyFormMultiple(event.detail.value);
|
||||
});
|
||||
|
||||
this._openOrdersGrid.querySelector('#priceColumn').headerRenderer = function (root) {
|
||||
const priceString = get("tradepage.tchange9")
|
||||
root.innerHTML = '<vaadin-grid-sorter path="price" direction="asc">' + priceString + ' (' + _this.listedCoins.get(_this.selectedCoin).coinCode + ')</vaadin-grid-sorter>'
|
||||
@ -733,6 +738,25 @@ class TradePortal extends LitElement {
|
||||
`
|
||||
}
|
||||
|
||||
coinGridSelection() {
|
||||
|
||||
if(this.selectedCoin == 'PIRATECHAIN') {
|
||||
return html``
|
||||
}
|
||||
else {
|
||||
return html`
|
||||
<vaadin-grid-selection-column></vaadin-grid-selection-column>
|
||||
`
|
||||
}
|
||||
}
|
||||
|
||||
clickHandler(data) {
|
||||
|
||||
if(this.selectedCoin == 'PIRATECHAIN') {
|
||||
this.fillBuyFormSingle(data)
|
||||
}
|
||||
}
|
||||
|
||||
openTradesTemplate() {
|
||||
return html`
|
||||
<div class="open-trades myhover">
|
||||
@ -751,13 +775,14 @@ class TradePortal extends LitElement {
|
||||
aria-label="Open Orders"
|
||||
.items="${this.listedCoins.get(this.selectedCoin).openFilteredOrders}"
|
||||
>
|
||||
${this.coinGridSelection()}
|
||||
<vaadin-grid-column
|
||||
auto-width
|
||||
resizable
|
||||
header="${translate("tradepage.tchange8")} (QORT)"
|
||||
id="qortAmountColumn"
|
||||
.renderer=${(root, column, data) => {
|
||||
render(html`<span style="cursor: pointer;" @click="${() => this.fillBuyForm(data)}">${this.round(data.item.qortAmount)}</span>`, root)
|
||||
render(html`<span style="cursor: pointer;" @click="${() => this.clickHandler(data)}">${this.round(data.item.qortAmount)}</span>`, root)
|
||||
}}
|
||||
>
|
||||
</vaadin-grid-column>
|
||||
@ -767,7 +792,7 @@ class TradePortal extends LitElement {
|
||||
header="${translate("tradepage.tchange9")} (${this.listedCoins.get(this.selectedCoin).coinCode})"
|
||||
id="priceColumn"
|
||||
.renderer=${(root, column, data) => {
|
||||
render(html`<span style="cursor: pointer;" @click="${() => this.fillBuyForm(data)}">${this.round(data.item.price)}</span>`, root)
|
||||
render(html`<span style="cursor: pointer;" @click="${() => this.clickHandler(data)}">${this.round(data.item.price)}</span>`, root)
|
||||
}}
|
||||
>
|
||||
</vaadin-grid-column>
|
||||
@ -777,7 +802,7 @@ class TradePortal extends LitElement {
|
||||
header="${translate("tradepage.tchange10")} (${this.listedCoins.get(this.selectedCoin).coinCode})"
|
||||
id="foreignAmountColumn"
|
||||
.renderer=${(root, column, data) => {
|
||||
render(html`<span style="cursor: pointer;" @click="${() => this.fillBuyForm(data)}">${data.item.foreignAmount}</span>`, root)
|
||||
render(html`<span style="cursor: pointer;" @click="${() => this.clickHandler(data)}">${data.item.foreignAmount}</span>`, root)
|
||||
}}
|
||||
>
|
||||
</vaadin-grid-column>
|
||||
@ -787,7 +812,7 @@ class TradePortal extends LitElement {
|
||||
header="${translate("tradepage.tchange13")}"
|
||||
id="qortalCreatorColumn"
|
||||
.renderer=${(root, column, data) => {
|
||||
render(html`<span style="cursor: pointer;" @click="${() => this.fillBuyForm(data)}">${data.item.qortalCreator}</span>`, root)
|
||||
render(html`<span style="cursor: pointer;" @click="${() => this.clickHandler(data)}">${data.item.qortalCreator}</span>`, root)
|
||||
}}
|
||||
>
|
||||
</vaadin-grid-column>
|
||||
@ -1546,19 +1571,52 @@ class TradePortal extends LitElement {
|
||||
this.isLoadingOpenTrades = false
|
||||
}
|
||||
|
||||
reSelectOpenOrders() {
|
||||
const qortalATAddressesString = this.shadowRoot.getElementById('qortalAtAddress').value;
|
||||
const qortalATAddresses = qortalATAddressesString.split(',');
|
||||
const itemsToSelect = this.tradesPresenceCleaned.filter((order) => qortalATAddresses.includes(order.qortalAtAddress));
|
||||
this._openOrdersGrid.selectedItems = [...itemsToSelect];
|
||||
this.fillBuyFormMultiple(itemsToSelect);
|
||||
}
|
||||
|
||||
async reRenderMyOpenOrders() {
|
||||
this.requestUpdate()
|
||||
await this.updateComplete
|
||||
this.isLoadingMyOpenOrders = false
|
||||
}
|
||||
|
||||
fillBuyForm(sellerRequest) {
|
||||
fillBuyFormSingle(sellerRequest) {
|
||||
this.shadowRoot.getElementById('buyAmountInput').value = parseFloat(sellerRequest.item.qortAmount)
|
||||
this.shadowRoot.getElementById('buyPriceInput').value = this.round(parseFloat(sellerRequest.item.foreignAmount) / parseFloat(sellerRequest.item.qortAmount))
|
||||
this.shadowRoot.getElementById('buyTotalInput').value = parseFloat(sellerRequest.item.foreignAmount)
|
||||
this.shadowRoot.getElementById('qortalAtAddress').value = sellerRequest.item.qortalAtAddress
|
||||
const buyFunds = this.round(parseFloat(sellerRequest.item.foreignAmount))
|
||||
this.fillBuyForm(buyFunds)
|
||||
}
|
||||
|
||||
fillBuyFormMultiple(sellerRequests) {
|
||||
let qortalATAddresses = [];
|
||||
let qortAmount = 0;
|
||||
let foreignAmount = 0;
|
||||
|
||||
sellerRequests.forEach((item, index) => {
|
||||
qortalATAddresses.push(item.qortalAtAddress);
|
||||
qortAmount += parseFloat(item.qortAmount);
|
||||
foreignAmount += parseFloat(item.foreignAmount);
|
||||
})
|
||||
|
||||
this.shadowRoot.getElementById('buyAmountInput').value = qortAmount
|
||||
this.shadowRoot.getElementById('buyPriceInput').value = qortAmount > 0 ? this.round(foreignAmount / qortAmount) : 0
|
||||
this.shadowRoot.getElementById('buyTotalInput').value = foreignAmount
|
||||
this.shadowRoot.getElementById('qortalAtAddress').value = qortalATAddresses
|
||||
|
||||
const buyFunds = this.round(foreignAmount)
|
||||
this.fillBuyForm(buyFunds)
|
||||
}
|
||||
|
||||
fillBuyForm(buyFunds) {
|
||||
const haveFunds = this.round(parseFloat(this.listedCoins.get(this.selectedCoin).balance))
|
||||
|
||||
if (Number(haveFunds) > Number(buyFunds)) {
|
||||
this.buyBtnDisable = false
|
||||
this.autoBuyWarning = false
|
||||
@ -1568,7 +1626,6 @@ class TradePortal extends LitElement {
|
||||
this.autoBuyWarning = true
|
||||
this.displayTabContent('buy')
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
processOfferingTrade(offer) {
|
||||
@ -2124,7 +2181,7 @@ class TradePortal extends LitElement {
|
||||
const initTradeOffersWebSocket = (restarted = false) => {
|
||||
let tradeOffersSocketCounter = 0
|
||||
let socketTimeout
|
||||
let socketLink = `ws://NODEURL/websockets/crosschain/tradeoffers?foreignBlockchain=FOREIGN_BLOCKCHAIN&includeHistoric=true`
|
||||
let socketLink = `PROTOCOL://NODEURL/websockets/crosschain/tradeoffers?foreignBlockchain=FOREIGN_BLOCKCHAIN&includeHistoric=true`
|
||||
const socket = new WebSocket(socketLink)
|
||||
socket.onopen = () => {
|
||||
setTimeout(pingSocket, 50)
|
||||
@ -2156,7 +2213,7 @@ class TradePortal extends LitElement {
|
||||
|
||||
const initTradeBotWebSocket = (restarted = false) => {
|
||||
let socketTimeout
|
||||
let socketLink = `ws://NODEURL/websockets/crosschain/tradebot?foreignBlockchain=FOREIGN_BLOCKCHAIN`
|
||||
let socketLink = `PROTOCOL://NODEURL/websockets/crosschain/tradebot?foreignBlockchain=FOREIGN_BLOCKCHAIN`
|
||||
const socket = new WebSocket(socketLink)
|
||||
socket.onopen = () => {
|
||||
setTimeout(pingSocket, 50)
|
||||
@ -2185,7 +2242,7 @@ class TradePortal extends LitElement {
|
||||
|
||||
const initTradePresenceWebSocket = (restarted = false) => {
|
||||
let socketTimeout
|
||||
let socketLink = `ws://NODEURL/websockets/crosschain/tradepresence`
|
||||
let socketLink = `PROTOCOL://NODEURL/websockets/crosschain/tradepresence`
|
||||
const socket = new WebSocket(socketLink)
|
||||
socket.onopen = () => {
|
||||
setTimeout(pingSocket, 50)
|
||||
@ -2330,11 +2387,21 @@ class TradePortal extends LitElement {
|
||||
}
|
||||
|
||||
const makeRequest = async () => {
|
||||
return await parentEpml.request('tradeBotRespondRequest', {
|
||||
atAddress: qortalAtAddress,
|
||||
foreignKey: _foreignKey,
|
||||
receivingAddress: this.selectedAddress.address
|
||||
})
|
||||
|
||||
if( this.selectedCoin == 'PIRATECHAIN') {
|
||||
return await parentEpml.request('tradeBotRespondRequest', {
|
||||
atAddress: qortalAtAddress,
|
||||
foreignKey: _foreignKey,
|
||||
receivingAddress: this.selectedAddress.address
|
||||
})
|
||||
}
|
||||
else {
|
||||
return await parentEpml.request('tradeBotRespondMultipleRequest', {
|
||||
addresses: qortalAtAddress.split(','),
|
||||
foreignKey: _foreignKey,
|
||||
receivingAddress: this.selectedAddress.address
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
const manageResponse = (response) => {
|
||||
@ -2648,6 +2715,9 @@ class TradePortal extends LitElement {
|
||||
filterPresenceList()
|
||||
this.listedCoins.get(message.data.relatedCoin).openFilteredOrders = this.tradesPresenceCleaned
|
||||
this.reRenderOpenFilteredOrders()
|
||||
if( this.selectedCoin != 'PIRATECHAIN') {
|
||||
this.reSelectOpenOrders()
|
||||
}
|
||||
return null
|
||||
default:
|
||||
break
|
||||
@ -2656,10 +2726,19 @@ class TradePortal extends LitElement {
|
||||
|
||||
let myNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node]
|
||||
let nodeUrl = myNode.domain + ':' + myNode.port
|
||||
let nodeProtocol = myNode.protocol
|
||||
let checkProtocol
|
||||
|
||||
if (nodeProtocol === "https") {
|
||||
checkProtocol = 'wss'
|
||||
} else {
|
||||
checkProtocol = 'ws'
|
||||
}
|
||||
|
||||
const modifiers = [
|
||||
{ searchValue: 'PROTOCOL', replaceValue: checkProtocol },
|
||||
{ searchValue: 'NODEURL', replaceValue: nodeUrl },
|
||||
{ searchValue: 'FOREIGN_BLOCKCHAIN', replaceValue: this.selectedCoin },
|
||||
{ searchValue: 'FOREIGN_BLOCKCHAIN', replaceValue: this.selectedCoin }
|
||||
]
|
||||
|
||||
workers.get(this.selectedCoin).tradesConnectedWorker = this.inlineWorker(this.initSocket, modifiers)
|
||||
@ -2721,7 +2800,7 @@ class TradePortal extends LitElement {
|
||||
})
|
||||
|
||||
const getCompletedTrades = async () => {
|
||||
const url = `http://NODEURL/crosschain/trades?limit=25&reverse=true&foreignBlockchain=FOREIGN_BLOCKCHAIN`
|
||||
const url = `PROTOCOL://NODEURL/crosschain/trades?limit=25&reverse=true&foreignBlockchain=FOREIGN_BLOCKCHAIN`
|
||||
const res = await fetch(url)
|
||||
const historicTrades = await res.json()
|
||||
const compareFn = (a, b) => {
|
||||
@ -2740,7 +2819,7 @@ class TradePortal extends LitElement {
|
||||
}
|
||||
|
||||
const getOffers = async () => {
|
||||
const url = `http://NODEURL/crosschain/tradeoffers?foreignBlockchain=FOREIGN_BLOCKCHAIN`
|
||||
const url = `PROTOCOL://NODEURL/crosschain/tradeoffers?foreignBlockchain=FOREIGN_BLOCKCHAIN`
|
||||
const res = await fetch(url)
|
||||
const openTradeOrders = await res.json()
|
||||
const myOpenTradeOrders = await openTradeOrders.filter((order) => order.mode === 'OFFERING' && order.qortalCreator === 'SELECTED_ADDRESS')
|
||||
@ -2802,11 +2881,20 @@ class TradePortal extends LitElement {
|
||||
|
||||
let myNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node]
|
||||
let nodeUrl = myNode.domain + ':' + myNode.port
|
||||
let nodeProtocol = myNode.protocol
|
||||
let checkProtocol
|
||||
|
||||
if (nodeProtocol === "https") {
|
||||
checkProtocol = 'https'
|
||||
} else {
|
||||
checkProtocol = 'http'
|
||||
}
|
||||
|
||||
const modifiers = [
|
||||
{ searchValue: 'PROTOCOL', replaceValue: checkProtocol },
|
||||
{ searchValue: 'NODEURL', replaceValue: nodeUrl },
|
||||
{ searchValue: 'SELECTED_ADDRESS', replaceValue: this.selectedAddress.address, },
|
||||
{ searchValue: 'FOREIGN_BLOCKCHAIN', replaceValue: this.selectedCoin, },
|
||||
{ searchValue: 'SELECTED_ADDRESS', replaceValue: this.selectedAddress.address },
|
||||
{ searchValue: 'FOREIGN_BLOCKCHAIN', replaceValue: this.selectedCoin, }
|
||||
]
|
||||
|
||||
workers.get(this.selectedCoin).handleStuckTradesConnectedWorker = this.inlineWorker(this.handleStuckTrades, modifiers)
|
||||
@ -2836,4 +2924,4 @@ class TradePortal extends LitElement {
|
||||
}
|
||||
}
|
||||
|
||||
window.customElements.define('trade-portal', TradePortal)
|
||||
window.customElements.define('trade-portal', TradePortal)
|
||||
|
@ -29,6 +29,8 @@ import '@vaadin/grid'
|
||||
import '@vaadin/icon'
|
||||
import '@vaadin/icons'
|
||||
import '@vaadin/password-field'
|
||||
import '@vaadin/tabs'
|
||||
import '@vaadin/tabsheet'
|
||||
|
||||
// Multi language support
|
||||
import { get, registerTranslateConfig, translate, use } from '../../../../core/translate'
|
||||
@ -127,7 +129,12 @@ class MultiWallet extends LitElement {
|
||||
bookDogecoinAddress: { type: String },
|
||||
bookDigibyteAddress: { type: String },
|
||||
bookRavencoinAddress: { type: String },
|
||||
bookPiratechainAddress: { type: String }
|
||||
bookPiratechainAddress: { type: String },
|
||||
visitedTab: { type: Number },
|
||||
searchOffset: { type: Number },
|
||||
searchLimit: { type: Number },
|
||||
counter: { type: Number },
|
||||
pageButtonsHidden: { type: Boolean }
|
||||
}
|
||||
}
|
||||
|
||||
@ -235,6 +242,11 @@ class MultiWallet extends LitElement {
|
||||
this.bookDigibyteAddress = ''
|
||||
this.bookRavencoinAddress = ''
|
||||
this.bookPiratechainAddress = ''
|
||||
this.visitedTab = 0
|
||||
this.searchOffset = 0
|
||||
this.searchLimit = 10
|
||||
this.counter = 1
|
||||
this.pageButtonsHidden = false
|
||||
this.wallets = new Map()
|
||||
|
||||
let coinProp = {
|
||||
@ -387,6 +399,7 @@ class MultiWallet extends LitElement {
|
||||
<div class="qrcode-pos" ?hidden="${this.getSelectedWalletAddress().length < 1}">
|
||||
<qortal-qrcode-generator data="${this.getSelectedWalletAddress()}" mode="octet" format="html" auto></qortal-qrcode-generator>
|
||||
</div>
|
||||
${this.renderTabTransactions()}
|
||||
<div id="transactions">
|
||||
${this.loading ? html`
|
||||
<paper-spinner-lite style="display: block; margin: 5px auto;" active></paper-spinner-lite>
|
||||
@ -2246,7 +2259,7 @@ class MultiWallet extends LitElement {
|
||||
|
||||
this.transactionsDOM = this.shadowRoot.getElementById('transactionsDOM')
|
||||
|
||||
this.showWallet()
|
||||
this.showNewQortWallet()
|
||||
|
||||
window.addEventListener('storage', () => {
|
||||
const checkLanguage = localStorage.getItem('qortalLanguage')
|
||||
@ -2282,6 +2295,39 @@ class MultiWallet extends LitElement {
|
||||
}, 600000)
|
||||
}
|
||||
|
||||
async myTabChanged(value) {
|
||||
this.pageButtonsHidden = false
|
||||
this.visitedTab = value
|
||||
this.searchOffset = 0
|
||||
this.searchLimit = 10
|
||||
this.counter = 1
|
||||
await this.renderNewDom()
|
||||
}
|
||||
|
||||
renderTabTransactions() {
|
||||
if (this._selectedWallet == 'qort') {
|
||||
return html`
|
||||
<div style="margin-top: 10px;">
|
||||
<vaadin-tabs>
|
||||
<vaadin-tab id="type" disabled><span style="color: var(--black);">${translate("walletpage.wchange6")} :</span></vaadin-tab>
|
||||
<vaadin-tab id="all-tab" style="cursor: pointer;" @click=${(e) => this.myTabChanged(0)}>ALL</vaadin-tab>
|
||||
<vaadin-tab id="payment-tab" style="cursor: pointer;" @click=${(e) => this.myTabChanged(1)}>PAYMENT</vaadin-tab>
|
||||
<vaadin-tab id="arbitrary-tab" style="cursor: pointer;" @click=${(e) => this.myTabChanged(2)}>ARBITRARY</vaadin-tab>
|
||||
<vaadin-tab id="at-tab" style="cursor: pointer;" @click=${(e) => this.myTabChanged(3)}>AT</vaadin-tab>
|
||||
<vaadin-tab id="group-tab" style="cursor: pointer;" @click=${(e) => this.myTabChanged(4)}>GROUP</vaadin-tab>
|
||||
<vaadin-tab id="name-tab" style="cursor: pointer;" @click=${(e) => this.myTabChanged(5)}>NAME</vaadin-tab>
|
||||
<vaadin-tab id="asset-tab" style="cursor: pointer;" @click=${(e) => this.myTabChanged(6)}>ASSET</vaadin-tab>
|
||||
<vaadin-tab id="poll-tab" style="cursor: pointer;" @click=${(e) => this.myTabChanged(7)}>POLL</vaadin-tab>
|
||||
<vaadin-tab id="rewarshare-tab" style="cursor: pointer;" @click=${(e) => this.myTabChanged(8)}>REWARDSHARE</vaadin-tab>
|
||||
<vaadin-tab id="misc-tab" style="cursor: pointer;" @click=${(e) => this.myTabChanged(9)}>MISC</vaadin-tab>
|
||||
</vaadin-tabs>
|
||||
</div>
|
||||
`
|
||||
} else {
|
||||
return html``
|
||||
}
|
||||
}
|
||||
|
||||
async paymentFee() {
|
||||
const myNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node]
|
||||
const nodeUrl = myNode.protocol + '://' + myNode.domain + ':' + myNode.port
|
||||
@ -2499,7 +2545,11 @@ class MultiWallet extends LitElement {
|
||||
|
||||
tabWalletQort() {
|
||||
this._selectedWallet = 'qort'
|
||||
this.showWallet()
|
||||
this.visitedTab = 0
|
||||
this.searchOffset = 0
|
||||
this.searchLimit = 10
|
||||
this.pageButtonsHidden = false
|
||||
this.showNewQortWallet()
|
||||
}
|
||||
|
||||
tabWalletBtc() {
|
||||
@ -3099,9 +3149,9 @@ class MultiWallet extends LitElement {
|
||||
this.shadowRoot.querySelector('#arrrBookDialog').close()
|
||||
}
|
||||
|
||||
removeQortAddress(adressObj) {
|
||||
removeQortAddress(addressObj) {
|
||||
const theQortalAddressBook = 'addressbookQort-' + this.bookQortalAddress
|
||||
const addressToRemove = adressObj
|
||||
const addressToRemove = addressObj
|
||||
this.newQortBookFilter = []
|
||||
this.newQortBookFilter = this.qortBook.filter((item) => item.address !== addressToRemove)
|
||||
const myNewObj = JSON.stringify(this.newQortBookFilter)
|
||||
@ -3110,9 +3160,9 @@ class MultiWallet extends LitElement {
|
||||
this.qortBook = JSON.parse(localStorage.getItem(theQortalAddressBook) || "[]")
|
||||
}
|
||||
|
||||
removeBtcAddress(adressObj) {
|
||||
removeBtcAddress(addressObj) {
|
||||
const theBitcoinAddressBook = 'addressbookBtc-' + this.bookBitcoinAddress
|
||||
const addressToRemove = adressObj
|
||||
const addressToRemove = addressObj
|
||||
this.newBtcBookFilter = []
|
||||
this.newBtcBookFilter = this.btcBook.filter((item) => item.address !== addressToRemove)
|
||||
const myNewObj = JSON.stringify(this.newBtcBookFilter)
|
||||
@ -3121,9 +3171,9 @@ class MultiWallet extends LitElement {
|
||||
this.btcBook = JSON.parse(localStorage.getItem(theBitcoinAddressBook) || "[]")
|
||||
}
|
||||
|
||||
removeLtcAddress(adressObj) {
|
||||
removeLtcAddress(addressObj) {
|
||||
const theLitecoinAddressBook = 'addressbookLtc-' + this.bookLitecoinAddress
|
||||
const addressToRemove = adressObj
|
||||
const addressToRemove = addressObj
|
||||
this.newLtcBookFilter = []
|
||||
this.newLtcBookFilter = this.ltcBook.filter((item) => item.address !== addressToRemove)
|
||||
const myNewObj = JSON.stringify(this.newLtcBookFilter)
|
||||
@ -3132,9 +3182,9 @@ class MultiWallet extends LitElement {
|
||||
this.ltcBook = JSON.parse(localStorage.getItem(theLitecoinAddressBook) || "[]")
|
||||
}
|
||||
|
||||
removeDogeAddress(adressObj) {
|
||||
removeDogeAddress(addressObj) {
|
||||
const theDogecoinAddressBook = 'addressbookDoge-' + this.bookDogecoinAddress
|
||||
const addressToRemove = adressObj
|
||||
const addressToRemove = addressObj
|
||||
this.newDogeBookFilter = []
|
||||
this.newDogeBookFilter = this.dogeBook.filter((item) => item.address !== addressToRemove)
|
||||
const myNewObj = JSON.stringify(this.newDogeBookFilter)
|
||||
@ -3143,9 +3193,9 @@ class MultiWallet extends LitElement {
|
||||
this.dogeBook = JSON.parse(localStorage.getItem(theDogecoinAddressBook) || "[]")
|
||||
}
|
||||
|
||||
removeDgbAddress(adressObj) {
|
||||
removeDgbAddress(addressObj) {
|
||||
const theDigibyteAddressBook = 'addressbookDgb-' + this.bookDigibyteAddress
|
||||
const addressToRemove = adressObj
|
||||
const addressToRemove = addressObj
|
||||
this.newDgbBookFilter = []
|
||||
this.newDgbBookFilter = this.dgbBook.filter((item) => item.address !== addressToRemove)
|
||||
const myNewObj = JSON.stringify(this.newDgbBookFilter)
|
||||
@ -3154,9 +3204,9 @@ class MultiWallet extends LitElement {
|
||||
this.dgbBook = JSON.parse(localStorage.getItem(theDigibyteAddressBook) || "[]")
|
||||
}
|
||||
|
||||
removeRvnAddress(adressObj) {
|
||||
removeRvnAddress(addressObj) {
|
||||
const theRavencoinAddressBook = 'addressbookRvn-' + this.bookRavencoinAddress
|
||||
const addressToRemove = adressObj
|
||||
const addressToRemove = addressObj
|
||||
this.newRvnBookFilter = []
|
||||
this.newRvnBookFilter = this.rvnBook.filter((item) => item.address !== addressToRemove)
|
||||
const myNewObj = JSON.stringify(this.newRvnBookFilter)
|
||||
@ -3165,9 +3215,9 @@ class MultiWallet extends LitElement {
|
||||
this.rvnBook = JSON.parse(localStorage.getItem(theRavencoinAddressBook) || "[]")
|
||||
}
|
||||
|
||||
removeArrrAddress(adressObj) {
|
||||
removeArrrAddress(addressObj) {
|
||||
const thePiratechainAddressBook = 'addressbookArrr-' + this.bookPiratechainAddress
|
||||
const addressToRemove = adressObj
|
||||
const addressToRemove = addressObj
|
||||
this.newArrrBookFilter = []
|
||||
this.newArrrBookFilter = this.arrrBook.filter((item) => item.address !== addressToRemove)
|
||||
const myNewObj = JSON.stringify(this.newArrrBookFilter)
|
||||
@ -3538,19 +3588,18 @@ class MultiWallet extends LitElement {
|
||||
|
||||
renderCAB() {
|
||||
return html`
|
||||
<span>${this.selectedTransaction.aTAddress}</span>
|
||||
<button-icon-copy
|
||||
title="${translate("blockpage.bcchange8")}"
|
||||
onSuccessMessage="${translate("walletpage.wchange4")}"
|
||||
onErrorMessage="${translate("walletpage.wchange39")}"
|
||||
textToCopy=${this.selectedTransaction.aTAddress}
|
||||
buttonSize="24px"
|
||||
iconSize="16px"
|
||||
color="var(--copybutton)"
|
||||
offsetLeft="4px"
|
||||
>
|
||||
</button-icon-copy>
|
||||
`
|
||||
<span>${this.selectedTransaction.aTAddress}</span>
|
||||
<button-icon-copy
|
||||
title="${translate("blockpage.bcchange8")}"
|
||||
onSuccessMessage="${translate("walletpage.wchange4")}"
|
||||
onErrorMessage="${translate("walletpage.wchange39")}"
|
||||
textToCopy=${this.selectedTransaction.aTAddress}
|
||||
buttonSize="24px"
|
||||
iconSize="16px"
|
||||
color="var(--copybutton)"
|
||||
offsetLeft="4px"
|
||||
></button-icon-copy>
|
||||
`
|
||||
}
|
||||
|
||||
renderFetchText() {
|
||||
@ -3857,7 +3906,7 @@ class MultiWallet extends LitElement {
|
||||
}
|
||||
}
|
||||
await validateReceiver(recipient)
|
||||
await this.showWallet()
|
||||
await this.showNewQortWallet()
|
||||
}
|
||||
|
||||
async sendBtc() {
|
||||
@ -4139,15 +4188,21 @@ class MultiWallet extends LitElement {
|
||||
|
||||
if (this._selectedWallet == 'qort') {
|
||||
if (!window.parent.reduxStore.getState().app.blockInfo.height) {
|
||||
await parentEpml.request('apiCall', { url: `/blocks/height`, type: 'api' })
|
||||
.then(height => parentEpml.request('updateBlockInfo', { height }))
|
||||
await parentEpml.request('apiCall', {
|
||||
url: `/blocks/height`,
|
||||
type: 'api'
|
||||
}).then(height => parentEpml.request('updateBlockInfo', {
|
||||
height
|
||||
}))
|
||||
}
|
||||
}
|
||||
|
||||
const coin = this._selectedWallet
|
||||
|
||||
await this.fetchWalletAddress(this._selectedWallet)
|
||||
await this.fetchWalletServer(this._selectedWallet)
|
||||
await this.fetchWalletDetails(this._selectedWallet)
|
||||
await this.fetchWalletServer(this._selectedWallet)
|
||||
|
||||
if (this._selectedWallet == coin) {
|
||||
await this.renderTransactions()
|
||||
await this.getTransactionGrid(this._selectedWallet)
|
||||
@ -4157,32 +4212,331 @@ class MultiWallet extends LitElement {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
async showNewQortWallet() {
|
||||
this.pageButtonsHidden = false
|
||||
this.transactionsDOM.hidden = true
|
||||
this.loading = true
|
||||
|
||||
if (!window.parent.reduxStore.getState().app.blockInfo.height) {
|
||||
await parentEpml.request('apiCall', {
|
||||
url: `/blocks/height`,
|
||||
type: 'api'
|
||||
}).then(height => parentEpml.request('updateBlockInfo', {
|
||||
height
|
||||
}))
|
||||
}
|
||||
|
||||
const coin = this._selectedWallet
|
||||
|
||||
this.balanceString = this.renderFetchText()
|
||||
|
||||
parentEpml.request('apiCall', {
|
||||
url: `/addresses/balance/${this.wallets.get('qort').wallet.address}`
|
||||
}).then((res) => {
|
||||
if (isNaN(Number(res))) {
|
||||
let snack4string = get("walletpage.wchange32")
|
||||
parentEpml.request('showSnackBar', `${snack4string}`)
|
||||
} else {
|
||||
if (this._selectedWallet == coin) {
|
||||
this.wallets.get(coin).balance = Number(res).toFixed(8)
|
||||
this.balanceString = this.wallets.get(this._selectedWallet).balance + " " + this._selectedWallet.toLocaleUpperCase()
|
||||
this.balance = this.wallets.get(this._selectedWallet).balance
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
await this.fetchWalletDetails(this._selectedWallet)
|
||||
await this.fetchWalletServer(this._selectedWallet)
|
||||
|
||||
this.shadowRoot.getElementById('type').selected = false
|
||||
this.shadowRoot.getElementById('all-tab').selected = true
|
||||
this.shadowRoot.getElementById('payment-tab').selected = false
|
||||
this.shadowRoot.getElementById('arbitrary-tab').selected = false
|
||||
this.shadowRoot.getElementById('at-tab').selected = false
|
||||
this.shadowRoot.getElementById('group-tab').selected = false
|
||||
this.shadowRoot.getElementById('name-tab').selected = false
|
||||
this.shadowRoot.getElementById('asset-tab').selected = false
|
||||
this.shadowRoot.getElementById('poll-tab').selected = false
|
||||
this.shadowRoot.getElementById('rewarshare-tab').selected = false
|
||||
this.shadowRoot.getElementById('misc-tab').selected = false
|
||||
|
||||
if (this._selectedWallet == coin) {
|
||||
await this.renderTransactions()
|
||||
await this.getTransactionGrid(this._selectedWallet)
|
||||
this.loading = false
|
||||
this.transactionsDOM.hidden = false
|
||||
}
|
||||
}
|
||||
|
||||
async renderNewDom() {
|
||||
this.transactionsDOM.hidden = true
|
||||
this.loading = true
|
||||
|
||||
if (!window.parent.reduxStore.getState().app.blockInfo.height) {
|
||||
await parentEpml.request('apiCall', {
|
||||
url: `/blocks/height`,
|
||||
type: 'api'
|
||||
}).then(height => parentEpml.request('updateBlockInfo', {
|
||||
height
|
||||
}))
|
||||
}
|
||||
|
||||
const coin = this._selectedWallet
|
||||
|
||||
await this.fetchWalletDetails(this._selectedWallet)
|
||||
|
||||
if (this._selectedWallet == coin) {
|
||||
await this.renderTransactions()
|
||||
await this.getTransactionGrid(this._selectedWallet)
|
||||
this.loading = false
|
||||
this.transactionsDOM.hidden = false
|
||||
}
|
||||
}
|
||||
|
||||
goBackwardTX() {
|
||||
if (this.searchOffset === 0) {
|
||||
this.pageButtonsHidden = false
|
||||
this.searchLimit = 10
|
||||
this.counter = 1
|
||||
} else {
|
||||
this.pageButtonsHidden = false
|
||||
this.searchLimit = 10
|
||||
this.counter = this.searchOffset / 10
|
||||
this.searchOffset = this.searchOffset - 10
|
||||
this.renderNewDom()
|
||||
}
|
||||
}
|
||||
|
||||
goForwardTX() {
|
||||
this.pageButtonsHidden = false
|
||||
this.searchLimit = 10
|
||||
this.searchOffset = this.searchOffset + 10
|
||||
this.counter = (this.searchOffset / 10) + 1
|
||||
this.renderNewDom()
|
||||
}
|
||||
|
||||
showAllTX() {
|
||||
this.pageButtonsHidden = true
|
||||
this.searchLimit = 0
|
||||
this.searchOffset = 0
|
||||
this.counter = 1
|
||||
this.renderNewDom()
|
||||
}
|
||||
|
||||
async fetchWalletDetails(coin) {
|
||||
switch (coin) {
|
||||
case 'qort':
|
||||
this.balanceString = this.renderFetchText()
|
||||
parentEpml.request('apiCall', {
|
||||
url: `/addresses/balance/${this.wallets.get('qort').wallet.address}?apiKey=${this.getApiKey()}`
|
||||
}).then((res) => {
|
||||
if (isNaN(Number(res))) {
|
||||
let snack4string = get("walletpage.wchange32")
|
||||
parentEpml.request('showSnackBar', `${snack4string}`)
|
||||
} else {
|
||||
if (this._selectedWallet == coin) {
|
||||
this.wallets.get(coin).balance = Number(res).toFixed(8)
|
||||
this.balanceString = this.wallets.get(this._selectedWallet).balance + " " + this._selectedWallet.toLocaleUpperCase()
|
||||
this.balance = this.wallets.get(this._selectedWallet).balance
|
||||
}
|
||||
}
|
||||
const allTxsQort = await parentEpml.request('apiCall', {
|
||||
url: `/transactions/search?address=${this.wallets.get('qort').wallet.address}&confirmationStatus=CONFIRMED&reverse=true
|
||||
&limit=${this.searchLimit}
|
||||
&offset=${this.searchOffset}
|
||||
&txType=PAYMENT&txType=REGISTER_NAME&txType=UPDATE_NAME&txType=SELL_NAME&txType=CANCEL_SELL_NAME&txType=BUY_NAME&txType=CREATE_POLL&txType=VOTE_ON_POLL&txType=ARBITRARY&txType=ISSUE_ASSET&txType=TRANSFER_ASSET&txType=CREATE_ASSET_ORDER&txType=CANCEL_ASSET_ORDER&txType=MULTI_PAYMENT&txType=DEPLOY_AT&txType=MESSAGE&txType=AIRDROP&txType=AT&txType=CREATE_GROUP&txType=UPDATE_GROUP&txType=ADD_GROUP_ADMIN&txType=REMOVE_GROUP_ADMIN&txType=GROUP_BAN&txType=CANCEL_GROUP_BAN&txType=GROUP_KICK&txType=GROUP_INVITE&txType=CANCEL_GROUP_INVITE&txType=JOIN_GROUP&txType=LEAVE_GROUP&txType=GROUP_APPROVAL&txType=SET_GROUP&txType=UPDATE_ASSET&txType=ACCOUNT_FLAGS&txType=ENABLE_FORGING&txType=REWARD_SHARE&txType=ACCOUNT_LEVEL&txType=TRANSFER_PRIVS&txType=PRESENCE
|
||||
`
|
||||
})
|
||||
const txsQort = await parentEpml.request('apiCall', {
|
||||
url: `/transactions/search?address=${this.wallets.get('qort').wallet.address}&confirmationStatus=CONFIRMED&reverse=true&txType=PAYMENT&txType=REGISTER_NAME&txType=UPDATE_NAME&txType=SELL_NAME&txType=CANCEL_SELL_NAME&txType=BUY_NAME&txType=CREATE_POLL&txType=VOTE_ON_POLL&txType=ARBITRARY&txType=ISSUE_ASSET&txType=TRANSFER_ASSET&txType=CREATE_ASSET_ORDER&txType=CANCEL_ASSET_ORDER&txType=MULTI_PAYMENT&txType=DEPLOY_AT&txType=MESSAGE&txType=AIRDROP&txType=AT&txType=CREATE_GROUP&txType=UPDATE_GROUP&txType=ADD_GROUP_ADMIN&txType=REMOVE_GROUP_ADMIN&txType=GROUP_BAN&txType=CANCEL_GROUP_BAN&txType=GROUP_KICK&txType=GROUP_INVITE&txType=CANCEL_GROUP_INVITE&txType=JOIN_GROUP&txType=LEAVE_GROUP&txType=GROUP_APPROVAL&txType=SET_GROUP&txType=UPDATE_ASSET&txType=ACCOUNT_FLAGS&txType=ENABLE_FORGING&txType=REWARD_SHARE&txType=ACCOUNT_LEVEL&txType=TRANSFER_PRIVS&txType=PRESENCE`,
|
||||
const pendingAllTxsQort = await parentEpml.request('apiCall', {
|
||||
url: `/transactions/unconfirmed?creator=${this.wallets.get('qort').wallet.base58PublicKey}&reverse=true
|
||||
&limit=${this.searchLimit}
|
||||
&offset=${this.searchOffset}
|
||||
&txType=PAYMENT&txType=REGISTER_NAME&txType=UPDATE_NAME&txType=SELL_NAME&txType=CANCEL_SELL_NAME&txType=BUY_NAME&txType=CREATE_POLL&txType=VOTE_ON_POLL&txType=ARBITRARY&txType=ISSUE_ASSET&txType=TRANSFER_ASSET&txType=CREATE_ASSET_ORDER&txType=CANCEL_ASSET_ORDER&txType=MULTI_PAYMENT&txType=DEPLOY_AT&txType=MESSAGE&txType=AIRDROP&txType=AT&txType=CREATE_GROUP&txType=UPDATE_GROUP&txType=ADD_GROUP_ADMIN&txType=REMOVE_GROUP_ADMIN&txType=GROUP_BAN&txType=CANCEL_GROUP_BAN&txType=GROUP_KICK&txType=GROUP_INVITE&txType=CANCEL_GROUP_INVITE&txType=JOIN_GROUP&txType=LEAVE_GROUP&txType=GROUP_APPROVAL&txType=SET_GROUP&txType=UPDATE_ASSET&txType=ACCOUNT_FLAGS&txType=ENABLE_FORGING&txType=REWARD_SHARE&txType=ACCOUNT_LEVEL&txType=TRANSFER_PRIVS&txType=PRESENCE
|
||||
`
|
||||
})
|
||||
const pendingTxsQort = await parentEpml.request('apiCall', {
|
||||
url: `/transactions/unconfirmed?creator=${this.wallets.get('qort').wallet.base58PublicKey}&reverse=true&txType=PAYMENT&txType=REGISTER_NAME&txType=UPDATE_NAME&txType=SELL_NAME&txType=CANCEL_SELL_NAME&txType=BUY_NAME&txType=CREATE_POLL&txType=VOTE_ON_POLL&txType=ARBITRARY&txType=ISSUE_ASSET&txType=TRANSFER_ASSET&txType=CREATE_ASSET_ORDER&txType=CANCEL_ASSET_ORDER&txType=MULTI_PAYMENT&txType=DEPLOY_AT&txType=MESSAGE&txType=AIRDROP&txType=AT&txType=CREATE_GROUP&txType=UPDATE_GROUP&txType=ADD_GROUP_ADMIN&txType=REMOVE_GROUP_ADMIN&txType=GROUP_BAN&txType=CANCEL_GROUP_BAN&txType=GROUP_KICK&txType=GROUP_INVITE&txType=CANCEL_GROUP_INVITE&txType=JOIN_GROUP&txType=LEAVE_GROUP&txType=GROUP_APPROVAL&txType=SET_GROUP&txType=UPDATE_ASSET&txType=ACCOUNT_FLAGS&txType=ENABLE_FORGING&txType=REWARD_SHARE&txType=ACCOUNT_LEVEL&txType=TRANSFER_PRIVS&txType=PRESENCE`,
|
||||
const paymentTxsQort = await parentEpml.request('apiCall', {
|
||||
url: `/transactions/search?address=${this.wallets.get('qort').wallet.address}&confirmationStatus=CONFIRMED&reverse=true
|
||||
&limit=${this.searchLimit}
|
||||
&offset=${this.searchOffset}
|
||||
&txType=PAYMENT
|
||||
`
|
||||
})
|
||||
const pendingPaymentTxsQort = await parentEpml.request('apiCall', {
|
||||
url: `/transactions/unconfirmed?creator=${this.wallets.get('qort').wallet.base58PublicKey}&reverse=true
|
||||
&limit=${this.searchLimit}
|
||||
&offset=${this.searchOffset}
|
||||
&txType=PAYMENT
|
||||
`
|
||||
})
|
||||
const arbitraryTxsQort = await parentEpml.request('apiCall', {
|
||||
url: `/transactions/search?address=${this.wallets.get('qort').wallet.address}&confirmationStatus=CONFIRMED&reverse=true
|
||||
&limit=${this.searchLimit}
|
||||
&offset=${this.searchOffset}
|
||||
&txType=ARBITRARY
|
||||
`
|
||||
})
|
||||
const pendingArbitraryTxsQort = await parentEpml.request('apiCall', {
|
||||
url: `/transactions/unconfirmed?creator=${this.wallets.get('qort').wallet.base58PublicKey}&reverse=true
|
||||
&limit=${this.searchLimit}
|
||||
&offset=${this.searchOffset}
|
||||
&txType=ARBITRARY
|
||||
`
|
||||
})
|
||||
const atTxsQort = await parentEpml.request('apiCall', {
|
||||
url: `/transactions/search?address=${this.wallets.get('qort').wallet.address}&confirmationStatus=CONFIRMED&reverse=true
|
||||
&limit=${this.searchLimit}
|
||||
&offset=${this.searchOffset}
|
||||
&txType=AT
|
||||
&txType=DEPLOY_AT
|
||||
&txType=MESSAGE
|
||||
`
|
||||
})
|
||||
const pendingAtTxsQort = await parentEpml.request('apiCall', {
|
||||
url: `/transactions/unconfirmed?creator=${this.wallets.get('qort').wallet.base58PublicKey}&reverse=true
|
||||
&limit=${this.searchLimit}
|
||||
&offset=${this.searchOffset}
|
||||
&txType=AT
|
||||
&txType=DEPLOY_AT
|
||||
&txType=MESSAGE
|
||||
`
|
||||
})
|
||||
const groupTxsQort = await parentEpml.request('apiCall', {
|
||||
url: `/transactions/search?address=${this.wallets.get('qort').wallet.address}&confirmationStatus=CONFIRMED&reverse=true
|
||||
&limit=${this.searchLimit}
|
||||
&offset=${this.searchOffset}
|
||||
&txType=CREATE_GROUP
|
||||
&txType=UPDATE_GROUP
|
||||
&txType=ADD_GROUP_ADMIN
|
||||
&txType=REMOVE_GROUP_ADMIN
|
||||
&txType=GROUP_BAN
|
||||
&txType=CANCEL_GROUP_BAN
|
||||
&txType=GROUP_KICK
|
||||
&txType=GROUP_INVITE
|
||||
&txType=CANCEL_GROUP_INVITE
|
||||
&txType=JOIN_GROUP
|
||||
&txType=LEAVE_GROUP
|
||||
&txType=GROUP_APPROVAL
|
||||
&txType=SET_GROUP
|
||||
`
|
||||
})
|
||||
const pendingGroupTxsQort = await parentEpml.request('apiCall', {
|
||||
url: `/transactions/unconfirmed?creator=${this.wallets.get('qort').wallet.base58PublicKey}&reverse=true
|
||||
&limit=${this.searchLimit}
|
||||
&offset=${this.searchOffset}
|
||||
&txType=CREATE_GROUP
|
||||
&txType=UPDATE_GROUP
|
||||
&txType=ADD_GROUP_ADMIN
|
||||
&txType=REMOVE_GROUP_ADMIN
|
||||
&txType=GROUP_BAN
|
||||
&txType=CANCEL_GROUP_BAN
|
||||
&txType=GROUP_KICK
|
||||
&txType=GROUP_INVITE
|
||||
&txType=CANCEL_GROUP_INVITE
|
||||
&txType=JOIN_GROUP
|
||||
&txType=LEAVE_GROUP
|
||||
&txType=GROUP_APPROVAL
|
||||
&txType=SET_GROUP
|
||||
`
|
||||
})
|
||||
const nameTxsQort = await parentEpml.request('apiCall', {
|
||||
url: `/transactions/search?address=${this.wallets.get('qort').wallet.address}&confirmationStatus=CONFIRMED&reverse=true
|
||||
&limit=${this.searchLimit}
|
||||
&offset=${this.searchOffset}
|
||||
&txType=REGISTER_NAME
|
||||
&txType=UPDATE_NAME
|
||||
&txType=SELL_NAME
|
||||
&txType=CANCEL_SELL_NAME
|
||||
&txType=BUY_NAME
|
||||
`
|
||||
})
|
||||
const pendingNameTxsQort = await parentEpml.request('apiCall', {
|
||||
url: `/transactions/unconfirmed?creator=${this.wallets.get('qort').wallet.base58PublicKey}&reverse=true
|
||||
&limit=${this.searchLimit}
|
||||
&offset=${this.searchOffset}
|
||||
&txType=REGISTER_NAME
|
||||
&txType=UPDATE_NAME
|
||||
&txType=SELL_NAME
|
||||
&txType=CANCEL_SELL_NAME
|
||||
&txType=BUY_NAME
|
||||
`
|
||||
})
|
||||
const assetTxsQort = await parentEpml.request('apiCall', {
|
||||
url: `/transactions/search?address=${this.wallets.get('qort').wallet.address}&confirmationStatus=CONFIRMED&reverse=true
|
||||
&limit=${this.searchLimit}
|
||||
&offset=${this.searchOffset}
|
||||
&txType=ISSUE_ASSET
|
||||
&txType=TRANSFER_ASSET
|
||||
&txType=CREATE_ASSET_ORDER
|
||||
&txType=CANCEL_ASSET_ORDER
|
||||
&txType=UPDATE_ASSET
|
||||
`
|
||||
})
|
||||
const pendingAssetTxsQort = await parentEpml.request('apiCall', {
|
||||
url: `/transactions/unconfirmed?creator=${this.wallets.get('qort').wallet.base58PublicKey}&reverse=true
|
||||
&limit=${this.searchLimit}
|
||||
&offset=${this.searchOffset}
|
||||
&txType=ISSUE_ASSET
|
||||
&txType=TRANSFER_ASSET
|
||||
&txType=CREATE_ASSET_ORDER
|
||||
&txType=CANCEL_ASSET_ORDER
|
||||
&txType=UPDATE_ASSET
|
||||
`
|
||||
})
|
||||
const pollTxsQort = await parentEpml.request('apiCall', {
|
||||
url: `/transactions/search?address=${this.wallets.get('qort').wallet.address}&confirmationStatus=CONFIRMED&reverse=true
|
||||
&limit=${this.searchLimit}
|
||||
&offset=${this.searchOffset}
|
||||
&txType=CREATE_POLL
|
||||
&txType=VOTE_ON_POLL
|
||||
`
|
||||
})
|
||||
const pendingPollTxsQort = await parentEpml.request('apiCall', {
|
||||
url: `/transactions/unconfirmed?creator=${this.wallets.get('qort').wallet.base58PublicKey}&reverse=true
|
||||
&limit=${this.searchLimit}
|
||||
&offset=${this.searchOffset}
|
||||
&txType=CREATE_POLL
|
||||
&txType=VOTE_ON_POLL
|
||||
`
|
||||
})
|
||||
const rewardshareTxsQort = await parentEpml.request('apiCall', {
|
||||
url: `/transactions/search?address=${this.wallets.get('qort').wallet.address}&confirmationStatus=CONFIRMED&reverse=true
|
||||
&limit=${this.searchLimit}
|
||||
&offset=${this.searchOffset}
|
||||
&txType=REWARD_SHARE
|
||||
`
|
||||
})
|
||||
const pendingRewardshareTxsQort = await parentEpml.request('apiCall', {
|
||||
url: `/transactions/unconfirmed?creator=${this.wallets.get('qort').wallet.base58PublicKey}&reverse=true
|
||||
&limit=${this.searchLimit}
|
||||
&offset=${this.searchOffset}
|
||||
&txType=REWARD_SHARE
|
||||
`
|
||||
})
|
||||
const miscTxsQort = await parentEpml.request('apiCall', {
|
||||
url: `/transactions/search?address=${this.wallets.get('qort').wallet.address}&confirmationStatus=CONFIRMED&reverse=true
|
||||
&limit=${this.searchLimit}
|
||||
&offset=${this.searchOffset}
|
||||
&txType=TRANSFER_PRIVS
|
||||
&txType=PRESENCE
|
||||
`
|
||||
})
|
||||
const pendingMiscTxsQort = await parentEpml.request('apiCall', {
|
||||
url: `/transactions/unconfirmed?creator=${this.wallets.get('qort').wallet.base58PublicKey}&reverse=true
|
||||
&limit=${this.searchLimit}
|
||||
&offset=${this.searchOffset}
|
||||
&txType=TRANSFER_PRIVS
|
||||
&txType=PRESENCE
|
||||
`
|
||||
})
|
||||
if (this._selectedWallet == coin) {
|
||||
this.wallets.get(coin).transactions = pendingTxsQort.concat(txsQort)
|
||||
if (this.visitedTab === 0) {
|
||||
this.wallets.get(coin).transactions = pendingAllTxsQort.concat(allTxsQort)
|
||||
} else if (this.visitedTab === 1) {
|
||||
this.wallets.get(coin).transactions = pendingPaymentTxsQort.concat(paymentTxsQort)
|
||||
} else if (this.visitedTab === 2) {
|
||||
this.wallets.get(coin).transactions = pendingArbitraryTxsQort.concat(arbitraryTxsQort)
|
||||
} else if (this.visitedTab === 3) {
|
||||
this.wallets.get(coin).transactions = pendingAtTxsQort.concat(atTxsQort)
|
||||
} else if (this.visitedTab === 4) {
|
||||
this.wallets.get(coin).transactions = pendingGroupTxsQort.concat(groupTxsQort)
|
||||
} else if (this.visitedTab === 5) {
|
||||
this.wallets.get(coin).transactions = pendingNameTxsQort.concat(nameTxsQort)
|
||||
} else if (this.visitedTab === 6) {
|
||||
this.wallets.get(coin).transactions = pendingAssetTxsQort.concat(assetTxsQort)
|
||||
} else if (this.visitedTab === 7) {
|
||||
this.wallets.get(coin).transactions = pendingPollTxsQort.concat(pollTxsQort)
|
||||
} else if (this.visitedTab === 8) {
|
||||
this.wallets.get(coin).transactions = pendingRewardshareTxsQort.concat(rewardshareTxsQort)
|
||||
} else if (this.visitedTab === 9) {
|
||||
this.wallets.get(coin).transactions = pendingMiscTxsQort.concat(miscTxsQort)
|
||||
}
|
||||
}
|
||||
break
|
||||
case 'btc':
|
||||
@ -4643,7 +4997,7 @@ class MultiWallet extends LitElement {
|
||||
}
|
||||
return html`
|
||||
<div style="padding-left:12px;" ?hidden="${!this.isEmptyArray(transactions)}"><span style="color: var(--black);">${translate("walletpage.wchange38")}</span></div>
|
||||
<vaadin-grid theme="large" id="${coin}TransactionsGrid" ?hidden="${this.isEmptyArray(this.wallets.get(this._selectedWallet).transactions)}" page-size="25" all-rows-visible>
|
||||
<vaadin-grid theme="large" id="${coin}TransactionsGrid" ?hidden="${this.isEmptyArray(this.wallets.get(this._selectedWallet).transactions)}" .items="${this.wallets.get(this._selectedWallet).transactions}" all-rows-visible>
|
||||
<vaadin-grid-column
|
||||
auto-width
|
||||
header="${translate("walletpage.wchange41")}"
|
||||
@ -4709,7 +5063,20 @@ class MultiWallet extends LitElement {
|
||||
>
|
||||
</vaadin-grid-column>
|
||||
</vaadin-grid>
|
||||
<div id="pages"></div>
|
||||
<div style="margin-top: 10px;">
|
||||
<vaadin-button theme="primary small" style="cursor: pointer;" ?hidden="${this.pageButtonsHidden}" @click=${() => this.goBackwardTX()}>
|
||||
<< <span style="text-transform: uppercase; font-size: 14px;">${translate("general.back")}</span>
|
||||
</vaadin-button>
|
||||
<span style="color: var(--black); font-size: 16px; font-weight: 600;"> ${translate("general.page")} ${this.counter} </span>
|
||||
<vaadin-button theme="primary small" style="cursor: pointer;" ?hidden="${this.wallets.get(this._selectedWallet).transactions.length < 10 || this.pageButtonsHidden}" @click=${() => this.goForwardTX()}>
|
||||
<span style="text-transform: uppercase; font-size: 14px;">${translate("general.next")}</span> >>
|
||||
</vaadin-button>
|
||||
<div style="float: right;">
|
||||
<vaadin-button theme="primary small" style="cursor: pointer;" @click=${() => this.showAllTX()}>
|
||||
<span style="text-transform: uppercase; font-size: 14px;">${translate("general.view")} ${translate("general.all")}</span>
|
||||
</vaadin-button>
|
||||
</div>
|
||||
</div>
|
||||
`
|
||||
}
|
||||
|
||||
|
@ -1,4 +1,8 @@
|
||||
import { get } from '../../../core/translate'
|
||||
import { appendBuffer } from './utilities'
|
||||
import Base58 from '../../../crypto/api/deps/Base58'
|
||||
import nacl from '../../../crypto/api/deps/nacl-fast.js'
|
||||
import ed2curve from '../../../crypto/api/deps/ed2curve.js'
|
||||
|
||||
const getApiKey = () => {
|
||||
const myNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node]
|
||||
@ -71,6 +75,10 @@ export class RequestQueueWithPromise {
|
||||
}
|
||||
}
|
||||
|
||||
export const requestQueueMemberNames = new RequestQueueWithPromise(5)
|
||||
export const requestQueueAdminMemberNames = new RequestQueueWithPromise(5)
|
||||
export const requestQueueGetAtAddresses = new RequestQueueWithPromise(10)
|
||||
|
||||
export class Loader {
|
||||
constructor() {
|
||||
this.loader = document.createElement("div")
|
||||
@ -664,6 +672,178 @@ export class WarningModal {
|
||||
export const modalHelper = ModalHelper.getInstance()
|
||||
export const warningModal = WarningModal.getInstance()
|
||||
|
||||
export class TradeBotRespondRequest {
|
||||
constructor() {
|
||||
// ...
|
||||
}
|
||||
|
||||
createTransaction(txnReq) {
|
||||
this.atAddress(txnReq.atAddress)
|
||||
this.foreignKey(txnReq.foreignKey)
|
||||
this.receivingAddress(txnReq.receivingAddress)
|
||||
|
||||
return this.txnRequest()
|
||||
}
|
||||
|
||||
atAddress(atAddress) {
|
||||
this._atAddress = atAddress
|
||||
}
|
||||
|
||||
foreignKey(foreignKey) {
|
||||
this._foreignKey = foreignKey
|
||||
}
|
||||
|
||||
receivingAddress(receivingAddress) {
|
||||
this._receivingAddress = receivingAddress
|
||||
}
|
||||
|
||||
txnRequest() {
|
||||
return {
|
||||
atAddress: this._atAddress,
|
||||
foreignKey: this._foreignKey,
|
||||
receivingAddress: this._receivingAddress
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export class TradeBotRespondMultipleRequest {
|
||||
constructor() {
|
||||
// ...
|
||||
}
|
||||
|
||||
createTransaction(txnReq) {
|
||||
this.addresses(txnReq.addresses)
|
||||
this.foreignKey(txnReq.foreignKey)
|
||||
this.receivingAddress(txnReq.receivingAddress)
|
||||
|
||||
return this.txnRequest()
|
||||
}
|
||||
|
||||
addresses(addresses) {
|
||||
this._addresses = addresses
|
||||
}
|
||||
|
||||
foreignKey(foreignKey) {
|
||||
this._foreignKey = foreignKey
|
||||
}
|
||||
|
||||
receivingAddress(receivingAddress) {
|
||||
this._receivingAddress = receivingAddress
|
||||
}
|
||||
|
||||
txnRequest() {
|
||||
return {
|
||||
addresses: this._addresses,
|
||||
foreignKey: this._foreignKey,
|
||||
receivingAddress: this._receivingAddress
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export class TradeBotCreateRequest {
|
||||
constructor() {
|
||||
// ...
|
||||
}
|
||||
|
||||
createTransaction(txnReq) {
|
||||
this.creatorPublicKey(txnReq.creatorPublicKey)
|
||||
this.qortAmount(txnReq.qortAmount)
|
||||
this.fundingQortAmount(txnReq.fundingQortAmount)
|
||||
this.foreignBlockchain(txnReq.foreignBlockchain)
|
||||
this.foreignAmount(txnReq.foreignAmount)
|
||||
this.tradeTimeout(txnReq.tradeTimeout)
|
||||
this.receivingAddress(txnReq.receivingAddress)
|
||||
|
||||
return this.txnRequest()
|
||||
}
|
||||
|
||||
creatorPublicKey(creatorPublicKey) {
|
||||
this._creatorPublicKey = creatorPublicKey
|
||||
}
|
||||
|
||||
qortAmount(qortAmount) {
|
||||
this._qortAmount = qortAmount
|
||||
}
|
||||
|
||||
fundingQortAmount(fundingQortAmount) {
|
||||
this._fundingQortAmount = fundingQortAmount
|
||||
}
|
||||
|
||||
foreignBlockchain(foreignBlockchain) {
|
||||
this._foreignBlockchain = foreignBlockchain
|
||||
}
|
||||
|
||||
foreignAmount(foreignAmount) {
|
||||
this._foreignAmount = foreignAmount
|
||||
}
|
||||
|
||||
tradeTimeout(tradeTimeout) {
|
||||
this._tradeTimeout = tradeTimeout
|
||||
}
|
||||
|
||||
receivingAddress(receivingAddress) {
|
||||
this._receivingAddress = receivingAddress
|
||||
}
|
||||
|
||||
txnRequest() {
|
||||
return {
|
||||
creatorPublicKey: this._creatorPublicKey,
|
||||
qortAmount: this._qortAmount,
|
||||
fundingQortAmount: this._fundingQortAmount,
|
||||
foreignBlockchain: this._foreignBlockchain,
|
||||
foreignAmount: this._foreignAmount,
|
||||
tradeTimeout: this._tradeTimeout,
|
||||
receivingAddress: this._receivingAddress
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export class DeleteTradeOffer {
|
||||
constructor() {
|
||||
// ...
|
||||
}
|
||||
|
||||
createTransaction(txnReq) {
|
||||
this.creatorPublicKey(txnReq.creatorPublicKey)
|
||||
this.atAddress(txnReq.atAddress)
|
||||
|
||||
return this.txnRequest()
|
||||
}
|
||||
|
||||
creatorPublicKey(creatorPublicKey) {
|
||||
this._creatorPublicKey = creatorPublicKey
|
||||
}
|
||||
|
||||
atAddress(atAddress) {
|
||||
this._atAddress = atAddress
|
||||
}
|
||||
|
||||
txnRequest() {
|
||||
return {
|
||||
creatorPublicKey: this._creatorPublicKey,
|
||||
atAddress: this._atAddress
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export const processTransactionV2 = async (bytes) => {
|
||||
const myNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node]
|
||||
const nodeUrl = `${myNode.protocol}://${myNode.domain}:${myNode.port}`
|
||||
const url = `${nodeUrl}/transactions/process?apiVersion=2`
|
||||
|
||||
const doProcess = await fetch(url, {
|
||||
method: "POST",
|
||||
headers: {
|
||||
"Content-Type": "application/json",
|
||||
},
|
||||
body: bytes
|
||||
})
|
||||
|
||||
const res = await doProcess.json()
|
||||
|
||||
return res
|
||||
}
|
||||
|
||||
export const publishData = async ({
|
||||
registeredName,
|
||||
path,
|
||||
@ -923,4 +1103,548 @@ export const publishData = async ({
|
||||
} catch (error) {
|
||||
throw new Error(error.message)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export async function getNameInfo(address) {
|
||||
const myNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node]
|
||||
const nodeUrl = `${myNode.protocol}://${myNode.domain}:${myNode.port}`
|
||||
const response = await fetch(`${nodeUrl}/names/address/` + address)
|
||||
const nameData = await response.json()
|
||||
|
||||
if (nameData.length > 0) {
|
||||
return nameData[0].name
|
||||
} else {
|
||||
return ""
|
||||
}
|
||||
}
|
||||
|
||||
export const getPublishesFromAdmins = async (admins, groupId) => {
|
||||
const queryString = admins.map((name) => `name=${name}`).join("&")
|
||||
const myNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node]
|
||||
const nodeUrl = `${myNode.protocol}://${myNode.domain}:${myNode.port}`
|
||||
const url = `${nodeUrl}/arbitrary/resources/searchsimple?mode=ALL&service=DOCUMENT_PRIVATE&identifier=symmetric-qchat-group-${groupId}&exactmatchnames=true&limit=0&reverse=true&${queryString}&prefix=true`
|
||||
const response = await fetch(url)
|
||||
|
||||
if (!response.ok) {
|
||||
console.error("network error")
|
||||
return false
|
||||
}
|
||||
|
||||
const adminData = await response.json()
|
||||
const filterId = adminData.filter((data) => data.identifier === `symmetric-qchat-group-${groupId}`)
|
||||
|
||||
if (filterId.length === 0) {
|
||||
return false
|
||||
}
|
||||
|
||||
const sortedData = filterId.sort((a, b) => {
|
||||
// Get the most recent date for both a and b
|
||||
const dateA = a.updated ? new Date(a.updated) : new Date(a.created)
|
||||
const dateB = b.updated ? new Date(b.updated) : new Date(b.created)
|
||||
|
||||
// Sort by most recent
|
||||
return dateB.getTime() - dateA.getTime()
|
||||
})
|
||||
|
||||
return sortedData[0]
|
||||
}
|
||||
|
||||
export const getGroupAdmins = async (groupNumber) => {
|
||||
const myNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node]
|
||||
const nodeUrl = `${myNode.protocol}://${myNode.domain}:${myNode.port}`
|
||||
const url = `${nodeUrl}/groups/members/${groupNumber}?limit=0&onlyAdmins=true`
|
||||
const response = await fetch(url)
|
||||
const groupData = await response.json()
|
||||
|
||||
let members = []
|
||||
let membersAddresses = []
|
||||
let both = []
|
||||
|
||||
const getMemNames = groupData.members.map(async (member) => {
|
||||
if (member.member) {
|
||||
const name = await requestQueueAdminMemberNames.enqueue(() => {
|
||||
return getNameInfo(member.member)
|
||||
})
|
||||
|
||||
if (name) {
|
||||
members.push(name)
|
||||
both.push({ name, address: member.member })
|
||||
}
|
||||
|
||||
membersAddresses.push(member.member)
|
||||
}
|
||||
|
||||
return true
|
||||
})
|
||||
|
||||
await Promise.all(getMemNames)
|
||||
|
||||
return { names: members, addresses: membersAddresses, both }
|
||||
}
|
||||
|
||||
export const getPublishesFromAdminsAdminSpace = async (admins, groupId) => {
|
||||
const queryString = admins.map((name) => `name=${name}`).join("&")
|
||||
const myNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node]
|
||||
const nodeUrl = `${myNode.protocol}://${myNode.domain}:${myNode.port}`
|
||||
|
||||
const url = `${nodeUrl}/arbitrary/resources/searchsimple?mode=ALL&service=DOCUMENT_PRIVATE&identifier=admins-symmetric-qchat-group-${groupId}&exactmatchnames=true&limit=0&reverse=true&${queryString}&prefix=true`
|
||||
const response = await fetch(url)
|
||||
|
||||
if (!response.ok) {
|
||||
console.error("network error")
|
||||
return false
|
||||
}
|
||||
|
||||
const adminData = await response.json()
|
||||
|
||||
const filterId = adminData.filter((data) => data.identifier === `admins-symmetric-qchat-group-${groupId}`)
|
||||
|
||||
if (filterId.length === 0) {
|
||||
return false
|
||||
}
|
||||
|
||||
const sortedData = filterId.sort((a, b) => {
|
||||
// Get the most recent date for both a and b
|
||||
const dateA = a.updated ? new Date(a.updated) : new Date(a.created)
|
||||
const dateB = b.updated ? new Date(b.updated) : new Date(b.created)
|
||||
|
||||
// Sort by most recent
|
||||
return dateB.getTime() - dateA.getTime()
|
||||
})
|
||||
|
||||
return sortedData[0]
|
||||
}
|
||||
|
||||
export const isUsingPublicNode = async () => {
|
||||
let isGateway = true
|
||||
|
||||
const publicNodes = ['ext-node.qortal.link']
|
||||
const nodeInfo = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node]
|
||||
|
||||
if (nodeInfo && (nodeInfo.domain && !publicNodes.some(publicNode => nodeInfo.domain.includes(publicNode)))) {
|
||||
isGateway = false
|
||||
}
|
||||
|
||||
return isGateway
|
||||
}
|
||||
|
||||
export const getForeignKey = (foreignBlockchain) => {
|
||||
switch (foreignBlockchain) {
|
||||
case "LITECOIN":
|
||||
return window.parent.reduxStore.getState().app.selectedAddress.ltcWallet.derivedMasterPrivateKey
|
||||
case "DOGECOIN":
|
||||
return window.parent.reduxStore.getState().app.selectedAddress.dogeWallet.derivedMasterPrivateKey
|
||||
case "BITCOIN":
|
||||
return window.parent.reduxStore.getState().app.selectedAddress.btcWallet.derivedMasterPrivateKey
|
||||
case "DIGIBYTE":
|
||||
return window.parent.reduxStore.getState().app.selectedAddress.dgbWallet.derivedMasterPrivateKey
|
||||
case "RAVENCOIN":
|
||||
return window.parent.reduxStore.getState().app.selectedAddress.rvnWallet.derivedMasterPrivateKey
|
||||
case "PIRATECHAIN":
|
||||
return window.parent.reduxStore.getState().app.selectedAddress.arrrWallet.seed58
|
||||
default:
|
||||
return null
|
||||
}
|
||||
}
|
||||
|
||||
export async function getQortalBalanceInfo() {
|
||||
const myNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node]
|
||||
const nodeUrl = `${myNode.protocol}://${myNode.domain}:${myNode.port}`
|
||||
const address = window.parent.reduxStore.getState().app.selectedAddress.address
|
||||
const url = `${nodeUrl}/addresses/balance/${address}`
|
||||
const res = await fetch(url)
|
||||
|
||||
if (!response.ok) throw new Error("Cannot fetch Qortal balance")
|
||||
|
||||
const balance = await res.json()
|
||||
|
||||
return (Number(balance) / 1e8).toFixed(8)
|
||||
}
|
||||
|
||||
export async function getBitcoinBalanceInfo() {
|
||||
const myNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node]
|
||||
const nodeUrl = `${myNode.protocol}://${myNode.domain}:${myNode.port}`
|
||||
const myApiKey = myNode.apiKey
|
||||
const url = `${nodeUrl}/crosschain/btc/walletbalance?apiKey=${myApiKey}`
|
||||
|
||||
const res = await fetch(url, {
|
||||
method: "POST",
|
||||
headers: {
|
||||
"Content-Type": "application/json"
|
||||
},
|
||||
body: `${window.parent.reduxStore.getState().app.selectedAddress.btcWallet.derivedMasterPublicKey}`
|
||||
})
|
||||
|
||||
if (!res.ok) throw new Error("Cannot fetch Bitcoin balance")
|
||||
|
||||
const balance = await res.json()
|
||||
|
||||
return (Number(balance) / 1e8).toFixed(8)
|
||||
}
|
||||
|
||||
|
||||
export async function getLitecoinBalanceInfo() {
|
||||
const myNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node]
|
||||
const nodeUrl = `${myNode.protocol}://${myNode.domain}:${myNode.port}`
|
||||
const myApiKey = myNode.apiKey
|
||||
const url = `${nodeUrl}/crosschain/ltc/walletbalance?apiKey=${myApiKey}`
|
||||
|
||||
const res = await fetch(url, {
|
||||
method: "POST",
|
||||
headers: {
|
||||
"Content-Type": "application/json"
|
||||
},
|
||||
body: `${window.parent.reduxStore.getState().app.selectedAddress.ltcWallet.derivedMasterPublicKey}`
|
||||
})
|
||||
|
||||
if (!res.ok) throw new Error("Cannot fetch Litecoin balance")
|
||||
|
||||
const balance = await res.json()
|
||||
|
||||
return (Number(balance) / 1e8).toFixed(8)
|
||||
}
|
||||
|
||||
export async function createBuyOrderTx({ crosschainAtInfo, isGateway, foreignBlockchain }) {
|
||||
const myNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node]
|
||||
const nodeUrl = `${myNode.protocol}://${myNode.domain}:${myNode.port}`
|
||||
const myApiKey = myNode.apiKey
|
||||
|
||||
let txn
|
||||
let url
|
||||
let message
|
||||
let responseVar
|
||||
let responseMessage
|
||||
|
||||
try {
|
||||
if (!isGateway) {
|
||||
const address = window.parent.reduxStore.getState().app.selectedAddress.address
|
||||
|
||||
if (foreignBlockchain === 'PIRATECHAIN') {
|
||||
message = {
|
||||
atAddress: crosschainAtInfo[0].qortalAtAddress,
|
||||
foreignKey: getForeignKey(foreignBlockchain),
|
||||
receivingAddress: address
|
||||
}
|
||||
} else {
|
||||
message = {
|
||||
addresses: crosschainAtInfo.map((order)=> order.qortalAtAddress),
|
||||
foreignKey: getForeignKey(foreignBlockchain),
|
||||
receivingAddress: address
|
||||
}
|
||||
}
|
||||
|
||||
if (foreignBlockchain === 'PIRATECHAIN') {
|
||||
txn = new TradeBotRespondRequest().createTransaction(message)
|
||||
url = `${nodeUrl}/crosschain/tradebot/respond?apiKey=${myApiKey}`
|
||||
} else {
|
||||
txn = new TradeBotRespondMultipleRequest().createTransaction(message)
|
||||
url = `${nodeUrl}/crosschain/tradebot/respondmultiple?apiKey=${myApiKey}`
|
||||
}
|
||||
|
||||
const responseFetch = await fetch(url, {
|
||||
method: "POST",
|
||||
headers: {
|
||||
"Content-Type": "application/json"
|
||||
},
|
||||
body: JSON.stringify(txn)
|
||||
})
|
||||
|
||||
const res = await responseFetch.json()
|
||||
|
||||
if(res.error && res.message) {
|
||||
console.error(res.message)
|
||||
throw new Error(res.message)
|
||||
}
|
||||
|
||||
if (!responseFetch.ok) {
|
||||
console.error('Failed to submit buy order')
|
||||
throw new Error('Failed to submit buy order')
|
||||
}
|
||||
|
||||
if (res === false) {
|
||||
responseVar = { response: res, success: false }
|
||||
} else {
|
||||
responseVar = { response: res, success: true }
|
||||
}
|
||||
|
||||
if (responseVar.success) {
|
||||
responseMessage = {
|
||||
callResponse: responseVar.success,
|
||||
extra: {
|
||||
message: "Buy order message sended successfully!",
|
||||
atAddresses: foreignBlockchain === 'PIRATECHAIN' ? [crosschainAtInfo[0].qortalAtAddress] : crosschainAtInfo.map((order)=> order.qortalAtAddress),
|
||||
senderAddress: address,
|
||||
node: nodeUrl
|
||||
}
|
||||
}
|
||||
} else {
|
||||
responseMessage = {
|
||||
callResponse: responseVar.success,
|
||||
extra: {
|
||||
message: "Unable to execute buy order!",
|
||||
atAddresses: foreignBlockchain === 'PIRATECHAIN' ? [crosschainAtInfo[0].qortalAtAddress] : crosschainAtInfo.map((order)=> order.qortalAtAddress),
|
||||
senderAddress: address,
|
||||
node: nodeUrl
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return responseMessage
|
||||
} else {
|
||||
responseVar = { response: false, success: false }
|
||||
responseMessage = {
|
||||
callResponse: responseVar.success,
|
||||
extra: {
|
||||
message: "Unable to send buy order message over Gateway!",
|
||||
atAddresses: foreignBlockchain === 'PIRATECHAIN' ? [crosschainAtInfo[0].qortalAtAddress] : crosschainAtInfo.map((order)=> order.qortalAtAddress),
|
||||
senderAddress: address,
|
||||
node: nodeUrl
|
||||
}
|
||||
}
|
||||
|
||||
return responseMessage
|
||||
}
|
||||
} catch (error) {
|
||||
throw new Error(error.message)
|
||||
}
|
||||
}
|
||||
|
||||
export const getPirateWalletAddress = async (seed58) => {
|
||||
const myApiKey = getApiKey()
|
||||
const mySeed58 = seed58
|
||||
|
||||
let res = await parentEpml.request('apiCall', {
|
||||
url: `/crosschain/arrr/walletaddress?apiKey=${myApiKey}`,
|
||||
method: 'POST',
|
||||
body: `${mySeed58}`
|
||||
})
|
||||
|
||||
if (res != null && res.error != 1201) {
|
||||
return res
|
||||
}
|
||||
|
||||
return mySeed58
|
||||
}
|
||||
|
||||
export const getUserWalletFunc = async (coin) => {
|
||||
let userWallet = {}
|
||||
|
||||
switch (coin) {
|
||||
case "QORT":
|
||||
userWallet["address"] = window.parent.reduxStore.getState().app.selectedAddress.address
|
||||
userWallet["publickey"] = Base58.encode(window.parent.reduxStore.getState().app.selectedAddress.keyPair.publicKey)
|
||||
userWallet["privatekey"] = Base58.encode(window.parent.reduxStore.getState().app.selectedAddress.keyPair.privateKey)
|
||||
break
|
||||
case "BTC":
|
||||
case "BITCOIN":
|
||||
userWallet["address"] = window.parent.reduxStore.getState().app.selectedAddress.btcWallet.address
|
||||
userWallet["publickey"] = window.parent.reduxStore.getState().app.selectedAddress.btcWallet.derivedMasterPublicKey
|
||||
userWallet["privatekey"] = window.parent.reduxStore.getState().app.selectedAddress.btcWallet.derivedMasterPrivateKey
|
||||
break
|
||||
case "LTC":
|
||||
case "LITECOIN":
|
||||
userWallet["address"] = window.parent.reduxStore.getState().app.selectedAddress.ltcWallet.address
|
||||
userWallet["publickey"] = window.parent.reduxStore.getState().app.selectedAddress.ltcWallet.derivedMasterPublicKey
|
||||
userWallet["privatekey"] = window.parent.reduxStore.getState().app.selectedAddress.ltcWallet.derivedMasterPrivateKey
|
||||
break
|
||||
case "DOGE":
|
||||
case "DOGECOIN":
|
||||
userWallet["address"] = window.parent.reduxStore.getState().app.selectedAddress.dogeWallet.address
|
||||
userWallet["publickey"] = window.parent.reduxStore.getState().app.selectedAddress.dogeWallet.derivedMasterPublicKey
|
||||
userWallet["privatekey"] = window.parent.reduxStore.getState().app.selectedAddress.dogeWallet.derivedMasterPrivateKey
|
||||
break
|
||||
case "DGB":
|
||||
case "DIGIBYTE":
|
||||
userWallet["address"] = window.parent.reduxStore.getState().app.selectedAddress.dgbWallet.address
|
||||
userWallet["publickey"] = window.parent.reduxStore.getState().app.selectedAddress.dgbWallet.derivedMasterPublicKey
|
||||
userWallet["privatekey"] = window.parent.reduxStore.getState().app.selectedAddress.dgbWallet.derivedMasterPrivateKey
|
||||
break
|
||||
case "RVN":
|
||||
case "RAVENCOIN":
|
||||
userWallet["address"] = window.parent.reduxStore.getState().app.selectedAddress.rvnWallet.address
|
||||
userWallet["publickey"] = window.parent.reduxStore.getState().app.selectedAddress.rvnWallet.derivedMasterPublicKey
|
||||
userWallet["privatekey"] = window.parent.reduxStore.getState().app.selectedAddress.rvnWallet.derivedMasterPrivateKey
|
||||
break
|
||||
case "ARRR":
|
||||
case "PIRATECHAIN":
|
||||
const arrrAddress = await getPirateWalletAddress(window.parent.reduxStore.getState().app.selectedAddress.arrrWallet.seed58)
|
||||
userWallet["address"] = arrrAddress
|
||||
userWallet["publickey"] = ""
|
||||
userWallet["privatekey"] = ""
|
||||
break
|
||||
default:
|
||||
break
|
||||
}
|
||||
|
||||
return userWallet
|
||||
}
|
||||
|
||||
export const signTransaction = async (unsignedTxn, keyPair) => {
|
||||
if (!unsignedTxn) {
|
||||
throw new Error('Unsigned Transaction Bytes not defined')
|
||||
}
|
||||
|
||||
if (!keyPair) {
|
||||
throw new Error('keyPair not defined')
|
||||
}
|
||||
|
||||
const unsignedTxBytes = Base58.decode(unsignedTxn)
|
||||
const signature = nacl.sign.detached(unsignedTxBytes, keyPair.privateKey)
|
||||
const signedTxBytes = appendBuffer(unsignedTxBytes, signature)
|
||||
|
||||
return Base58.encode(signedTxBytes)
|
||||
}
|
||||
|
||||
export const tradeBotCreateRequest = async (body, keyPair) => {
|
||||
const myNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node]
|
||||
const nodeUrl = `${myNode.protocol}://${myNode.domain}:${myNode.port}`
|
||||
const myApiKey = myNode.apiKey
|
||||
const url = `${nodeUrl}/crosschain/tradebot/create?apiKey=${myApiKey}`
|
||||
const txn = new TradeBotCreateRequest().createTransaction(body)
|
||||
const bodyToString = JSON.stringify(txn)
|
||||
|
||||
const unsignedTxnResponse = await fetch(url, {
|
||||
method: "POST",
|
||||
headers: {
|
||||
"Content-Type": "application/json"
|
||||
},
|
||||
body: bodyToString
|
||||
})
|
||||
|
||||
if (!unsignedTxnResponse.ok) throw new Error("Unable to create tradebot")
|
||||
|
||||
const unsignedTxn = await unsignedTxnResponse.text()
|
||||
const signedTxnBytes = await signTransaction(unsignedTxn, keyPair)
|
||||
const resProcess = await processTransactionV2(signedTxnBytes)
|
||||
|
||||
if (resProcess.signature) {
|
||||
return resProcess
|
||||
} else {
|
||||
throw new Error("Failed to Create Sell Order. Try again!")
|
||||
}
|
||||
}
|
||||
|
||||
export const cancelTradeOfferTradeBot = async (body, keyPair) => {
|
||||
const txn = new DeleteTradeOffer().createTransaction(body)
|
||||
const myNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node]
|
||||
const nodeUrl = `${myNode.protocol}://${myNode.domain}:${myNode.port}`
|
||||
const myApiKey = myNode.apiKey
|
||||
const url = `${nodeUrl}/crosschain/tradeoffer?apiKey=${myApiKey}`
|
||||
const bodyToString = JSON.stringify(txn)
|
||||
|
||||
const deleteTradeBotResponse = await fetch(url, {
|
||||
method: "DELETE",
|
||||
headers: {
|
||||
"Content-Type": "application/json"
|
||||
},
|
||||
body: bodyToString
|
||||
})
|
||||
|
||||
if (!deleteTradeBotResponse.ok) throw new Error("Unable to update tradebot")
|
||||
|
||||
const unsignedTxn = await deleteTradeBotResponse.text()
|
||||
const signedTxnBytes = await signTransaction(unsignedTxn, keyPair)
|
||||
const resProcess = await processTransactionV2(signedTxnBytes)
|
||||
|
||||
if (resProcess.signature) {
|
||||
return resProcess
|
||||
} else {
|
||||
throw new Error("Failed to Cancel Sell Order. Try again!")
|
||||
}
|
||||
}
|
||||
|
||||
export const getArrrSyncStatus = async () => {
|
||||
const myNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node]
|
||||
const nodeUrl = `${myNode.protocol}://${myNode.domain}:${myNode.port}`
|
||||
const myApiKey = myNode.apiKey
|
||||
const url = `${nodeUrl}/crosschain/arrr/syncstatus?apiKey=${myApiKey}`
|
||||
const arrrSeed = window.parent.reduxStore.getState().app.selectedAddress.arrrWallet.seed58
|
||||
|
||||
try {
|
||||
const response = await fetch(url, {
|
||||
method: "POST",
|
||||
headers: {
|
||||
Accept: "*/*"
|
||||
},
|
||||
body: arrrSeed
|
||||
})
|
||||
|
||||
let res
|
||||
|
||||
try {
|
||||
res = await response.clone().json()
|
||||
} catch (e) {
|
||||
res = await response.text()
|
||||
}
|
||||
|
||||
return res
|
||||
} catch (error) {
|
||||
console.error(error.message || "Error in retrieving arrr sync status")
|
||||
}
|
||||
}
|
||||
|
||||
export const getNodeInfo = async () => {
|
||||
const myNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node]
|
||||
const nodeUrl = `${myNode.protocol}://${myNode.domain}:${myNode.port}`
|
||||
const url = `${nodeUrl}/admin/info`
|
||||
|
||||
try {
|
||||
const response = await fetch(url, {
|
||||
method: "GET",
|
||||
headers: {
|
||||
Accept: "*/*"
|
||||
}
|
||||
})
|
||||
|
||||
if (!response.ok) console.error("Failed to retrieve node info")
|
||||
|
||||
let res
|
||||
|
||||
try {
|
||||
res = await response.clone().json()
|
||||
} catch (e) {
|
||||
res = await response.text()
|
||||
}
|
||||
|
||||
if (res.error && res.message) {
|
||||
console.error(res.message)
|
||||
}
|
||||
|
||||
return res
|
||||
} catch (error) {
|
||||
console.error(error.message || "Error in retrieving node info")
|
||||
}
|
||||
}
|
||||
|
||||
export const getNodeStatus = async () => {
|
||||
const myNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node]
|
||||
const nodeUrl = `${myNode.protocol}://${myNode.domain}:${myNode.port}`
|
||||
const url = `${nodeUrl}/admin/status`
|
||||
|
||||
try {
|
||||
const response = await fetch(url, {
|
||||
method: "GET",
|
||||
headers: {
|
||||
Accept: "*/*"
|
||||
}
|
||||
})
|
||||
|
||||
if (!response.ok) console.error("Failed to retrieve node status")
|
||||
|
||||
let res
|
||||
|
||||
try {
|
||||
res = await response.clone().json()
|
||||
} catch (e) {
|
||||
res = await response.text()
|
||||
}
|
||||
|
||||
if (res.error && res.message) {
|
||||
console.error(res.message)
|
||||
}
|
||||
|
||||
return res
|
||||
} catch (error) {
|
||||
console.error(error.message || "Error in retrieving node status")
|
||||
}
|
||||
}
|
||||
|
@ -56,7 +56,7 @@ export const getUserNameFromAddress = async (address) => {
|
||||
}
|
||||
}
|
||||
|
||||
export const replaceMessagesEdited = async ({ decodedMessages, parentEpml, isReceipient, decodeMessageFunc, _publicKey, addToUpdateMessageHashmap }) => {
|
||||
export const replaceMessagesEdited = async ({ decodedMessages, parentEpml, isReceipient, decodeMessageFunc, _publicKey, symKeys, addToUpdateMessageHashmap }) => {
|
||||
const MAX_CONCURRENT_REQUESTS = 5 // Maximum number of concurrent requests
|
||||
|
||||
const executeWithConcurrencyLimit = async (array, asyncFn) => {
|
||||
@ -82,7 +82,6 @@ export const replaceMessagesEdited = async ({ decodedMessages, parentEpml, isRec
|
||||
|
||||
const findUpdatedMessage = async (msg) => {
|
||||
let msgItem = { ...msg }
|
||||
|
||||
try {
|
||||
let msgQuery = `&involving=${msg.recipient}&involving=${msg.sender}`
|
||||
if (!isReceipient) {
|
||||
@ -96,7 +95,7 @@ export const replaceMessagesEdited = async ({ decodedMessages, parentEpml, isRec
|
||||
})
|
||||
|
||||
if (Array.isArray(newMsgResponse) && newMsgResponse.length > 0) {
|
||||
const decodeResponseItem = decodeMessageFunc(newMsgResponse[0], isReceipient, _publicKey)
|
||||
const decodeResponseItem = decodeMessageFunc(newMsgResponse[0], isReceipient, _publicKey, symKeys)
|
||||
|
||||
delete decodeResponseItem.timestamp
|
||||
|
||||
@ -143,8 +142,8 @@ export const replaceMessagesEdited = async ({ decodedMessages, parentEpml, isRec
|
||||
})
|
||||
|
||||
if (originalReplyMessage && Array.isArray(replyResponse) && replyResponse.length !== 0) {
|
||||
const decodeOriginalReply = decodeMessageFunc(originalReplyMessage, isReceipient, _publicKey)
|
||||
const decodeUpdatedReply = decodeMessageFunc(replyResponse[0], isReceipient, _publicKey)
|
||||
const decodeOriginalReply = decodeMessageFunc(originalReplyMessage, isReceipient, _publicKey, symKeys)
|
||||
const decodeUpdatedReply = decodeMessageFunc(replyResponse[0], isReceipient, _publicKey, symKeys)
|
||||
|
||||
msgItem.repliedToData = {
|
||||
...decodeUpdatedReply,
|
||||
@ -152,7 +151,7 @@ export const replaceMessagesEdited = async ({ decodedMessages, parentEpml, isRec
|
||||
sender: decodeOriginalReply.sender
|
||||
}
|
||||
} else if (originalReplyMessage) {
|
||||
msgItem.repliedToData = decodeMessageFunc(originalReplyMessage, isReceipient, _publicKey)
|
||||
msgItem.repliedToData = decodeMessageFunc(originalReplyMessage, isReceipient, _publicKey, symKeys)
|
||||
}
|
||||
}
|
||||
|
||||
@ -165,9 +164,10 @@ export const replaceMessagesEdited = async ({ decodedMessages, parentEpml, isRec
|
||||
}
|
||||
|
||||
const sortedMessages = decodedMessages.sort((a, b) => b.timestamp - a.timestamp)
|
||||
const withoutHubReactions = sortedMessages.filter(({decodedMessage}) => !decodedMessage.includes('isReaction'))
|
||||
|
||||
// Execute the functions with concurrency limit
|
||||
const updatedMessages = await executeWithConcurrencyLimit(sortedMessages, findUpdatedMessage)
|
||||
const updatedMessages = await executeWithConcurrencyLimit(withoutHubReactions, findUpdatedMessage)
|
||||
addToUpdateMessageHashmap(updatedMessages)
|
||||
|
||||
return updatedMessages
|
||||
|
65
plugins/plugins/utils/utilities.js
Normal file
65
plugins/plugins/utils/utilities.js
Normal file
@ -0,0 +1,65 @@
|
||||
|
||||
export const int32ToBytes = (word) => {
|
||||
var byteArray = []
|
||||
for (var b = 0; b < 32; b += 8) {
|
||||
byteArray.push((word >>> (24 - b % 32)) & 0xFF)
|
||||
}
|
||||
return byteArray
|
||||
}
|
||||
|
||||
export const stringtoUTF8Array = (message) => {
|
||||
if (typeof message === 'string') {
|
||||
var s = unescape(encodeURIComponent(message))
|
||||
message = new Uint8Array(s.length)
|
||||
for (var i = 0; i < s.length; i++) {
|
||||
message[i] = s.charCodeAt(i) & 0xff
|
||||
}
|
||||
}
|
||||
return message
|
||||
}
|
||||
|
||||
export const appendBuffer = (buffer1, buffer2) => {
|
||||
buffer1 = new Uint8Array(buffer1)
|
||||
buffer2 = new Uint8Array(buffer2)
|
||||
let tmp = new Uint8Array(buffer1.byteLength + buffer2.byteLength)
|
||||
tmp.set(buffer1, 0)
|
||||
tmp.set(buffer2, buffer1.byteLength)
|
||||
return tmp
|
||||
}
|
||||
|
||||
export const int64ToBytes = (int64) => {
|
||||
var byteArray = [0, 0, 0, 0, 0, 0, 0, 0]
|
||||
for (var index = 0; index < byteArray.length; index++) {
|
||||
var byte = int64 & 0xff
|
||||
byteArray[byteArray.length - index - 1] = byte
|
||||
int64 = (int64 - byte) / 256
|
||||
}
|
||||
return byteArray
|
||||
}
|
||||
|
||||
export const hexToBytes = (hexString) => {
|
||||
return new Uint8Array(hexString.match(/.{1,2}/g).map(byte => parseInt(byte, 16)))
|
||||
}
|
||||
|
||||
export const stringToHex = (bytes) => {
|
||||
return bytes.reduce((str, byte) => str + byte.toString(16).padStart(2, '0'), '')
|
||||
}
|
||||
|
||||
export const equal = (buf1, buf2) => {
|
||||
if (buf1.byteLength != buf2.byteLength) return false
|
||||
var dv1 = new Uint8Array(buf1)
|
||||
var dv2 = new Uint8Array(buf2)
|
||||
for (var i = 0; i != buf1.byteLength; i++) {
|
||||
if (dv1[i] != dv2[i]) return false
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
export const bytesToHex = (byteArray) => {
|
||||
var _byteArrayToHex = []
|
||||
for (var index = 0; index < byteArray.length; index++) {
|
||||
_byteArrayToHex.push((byteArray[index] >>> 4).toString(16))
|
||||
_byteArrayToHex.push((byteArray[index] & 15).toString(16));
|
||||
}
|
||||
return _byteArrayToHex.join("")
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user