forked from Qortal/qortal-ui
Compare commits
1 Commits
master
...
resolve-20
Author | SHA1 | Date | |
---|---|---|---|
0cd5313b2b |
1
.eslintignore
Normal file
1
.eslintignore
Normal file
@ -0,0 +1 @@
|
||||
/node_modules
|
15
.eslintrc.json
Normal file
15
.eslintrc.json
Normal file
@ -0,0 +1,15 @@
|
||||
{
|
||||
"env": {
|
||||
"browser": true,
|
||||
"es2021": true
|
||||
},
|
||||
"plugins": ["lit", "wc"],
|
||||
"extends": ["eslint:recommended", "plugin:lit/recommended", "plugin:wc/recommended"],
|
||||
"parserOptions": {
|
||||
"ecmaVersion": 12,
|
||||
"sourceType": "module"
|
||||
},
|
||||
"rules": {
|
||||
"no-mixed-spaces-and-tabs": 0
|
||||
}
|
||||
}
|
2
.gitignore
vendored
2
.gitignore
vendored
@ -4,8 +4,6 @@ package-lock.json
|
||||
# Derived js files
|
||||
plugins/plugins/core/**/*.js
|
||||
!*.src.js
|
||||
!plugins/plugins/core/**/*charts.js
|
||||
!plugins/plugins/core/**/*css.js
|
||||
core/src/redux/app/version.js
|
||||
!plugins/plugins/core/components/**/*.js
|
||||
|
||||
|
71
.travis.yml
Normal file
71
.travis.yml
Normal file
@ -0,0 +1,71 @@
|
||||
|
||||
branches:
|
||||
except:
|
||||
- master
|
||||
|
||||
language: node_js
|
||||
node_js: "14.17.0"
|
||||
|
||||
cache:
|
||||
yarn: true
|
||||
directories:
|
||||
- node_modules
|
||||
# - qortal-ui-core/node_modules
|
||||
# - qortal-ui-plugins/node_modules
|
||||
# - qortal-ui-crypto/node_modules
|
||||
- $HOME/.cache/electron
|
||||
- $HOME/.cache/electron-builder
|
||||
|
||||
install:
|
||||
- sh install-dependencies.sh
|
||||
|
||||
env:
|
||||
global:
|
||||
- ELECTRON_CACHE=$HOME/.cache/electron
|
||||
- ELECTRON_BUILDER_CACHE=$HOME/.cache/electron-builder
|
||||
- ELECTRON_ENABLE_LOGGING=true
|
||||
|
||||
jobs:
|
||||
include:
|
||||
- stage: Deploy Linux
|
||||
if: tag IS present
|
||||
os: linux
|
||||
dist: bionic
|
||||
sudo: required
|
||||
addons:
|
||||
apt:
|
||||
packages:
|
||||
# default Electron dependencies
|
||||
- build-essential
|
||||
- gconf2
|
||||
- gconf-service
|
||||
- libgtk-3-0
|
||||
- libnotify4
|
||||
- libxss-dev
|
||||
- libxss1
|
||||
- xdg-utils
|
||||
- libatspi2.0-0
|
||||
- libappindicator1
|
||||
- libxext-dev
|
||||
- libxtst6
|
||||
- libxtst-dev
|
||||
- libnss3
|
||||
script:
|
||||
- newVersion=$(git describe --abbrev=0)
|
||||
- yarn version --new-version $newVersion
|
||||
- sh set-up-snap.sh
|
||||
- yarn run release
|
||||
- stage: Deploy Windows & Mac
|
||||
if: tag IS present
|
||||
os: osx
|
||||
osx_image: xcode12.5.1
|
||||
script:
|
||||
- newVersion=$(git describe --abbrev=0)
|
||||
- yarn version --new-version $newVersion
|
||||
- yarn run release -- --mac --win
|
||||
before_cache:
|
||||
- rm -rf $HOME/.cache/electron-builder/wine
|
||||
# - stage: Update GitHub with Builds
|
||||
# if: tag IS present
|
||||
# script:
|
||||
# - sh push-updates-with-travis-build.sh
|
@ -4,6 +4,7 @@
|
||||
[![GitHub Releases](https://img.shields.io/github/downloads/Qortal/qortal-ui/latest/total)](https://github.com/Qortal/qortal-ui/releases/latest)
|
||||
[![License](https://img.shields.io/badge/license-GPL--3.0-blue)](https://opensource.org/licenses/GPL-3.0)
|
||||
[![Qortal Discord Invite](https://img.shields.io/discord/745037351163527189?color=%237289DA&label=Chat&logo=discord&logoColor=white)](https://discord.com/invite/54UyhB7)
|
||||
[![Qortal Apps Discord Invite](https://img.shields.io/discord/745037351163527189?color=%237289DA&label=Q-Apps&logo=discord&logoColor=white)](https://discord.com/invite/tqnpDMfuR2)
|
||||
|
||||
Decentralizing The World
|
||||
|
||||
@ -26,8 +27,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 v18.20.3 ``` (Latest LTS: Hydrogen supported by Electron V31) <br/>
|
||||
``` npm --location=global install npm@10.8.1 ``` <br/>
|
||||
``` nvm install v18.16.1 ``` (LTS: Hydrogen supported by Electron) <br/>
|
||||
``` npm --location=global install npm@9.8.1 ``` <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.
|
||||
|
||||
|
29
build.js
29
build.js
@ -1,23 +1,28 @@
|
||||
const path = require('path')
|
||||
const uiCore = require('./core/ui-core.js')
|
||||
const config = require('./config/config.js')
|
||||
const pluginsController = require('./plugins/default-plugins.js')
|
||||
|
||||
const generateBuildConfig = uiCore('generate_build_config')
|
||||
const build = uiCore('build')
|
||||
|
||||
const config = require('./config/config.js')
|
||||
|
||||
const pluginsController = require('./plugins/default-plugins.js')
|
||||
const buildDefalutPlugins = pluginsController('build')
|
||||
|
||||
|
||||
srcConfig = {
|
||||
...config.build,
|
||||
options: {
|
||||
...config.build.options,
|
||||
outputDir: path.join(__dirname, '/builtWWW'),
|
||||
sassOutputDir: path.join(__dirname, '/builtWWW/styles.bundle.css')
|
||||
}
|
||||
...config.build,
|
||||
options: {
|
||||
...config.build.options,
|
||||
outputDir: path.join(__dirname, '/builtWWW'),
|
||||
sassOutputDir: path.join(__dirname, '/builtWWW/styles.bundle.css'),
|
||||
}
|
||||
}
|
||||
|
||||
const { buildConfig, inlineConfigs } = generateBuildConfig(srcConfig)
|
||||
|
||||
build(buildConfig.options, buildConfig.outputs, buildConfig.outputOptions, buildConfig.inputOptions, inlineConfigs).then(() => {
|
||||
console.log("Building and Bundling Plugins")
|
||||
buildDefalutPlugins()
|
||||
})
|
||||
build(buildConfig.options, buildConfig.outputs, buildConfig.outputOptions, buildConfig.inputOptions, inlineConfigs)
|
||||
.then(() => {
|
||||
console.log("Building and Bundling Plugins");
|
||||
buildDefalutPlugins()
|
||||
})
|
||||
|
@ -2,13 +2,13 @@ const path = require('path')
|
||||
const defaultConfig = require('./default.config.js')
|
||||
|
||||
const build = {
|
||||
options: {
|
||||
outputDir: path.join(__dirname, '../build'),
|
||||
imgDir: path.join(__dirname, '../img')
|
||||
},
|
||||
aliases: {
|
||||
'qortal-ui-crypto': path.join(__dirname, '../crypto/api.js')
|
||||
}
|
||||
options: {
|
||||
outputDir: path.join(__dirname, '../build'),
|
||||
imgDir: path.join(__dirname, '../img')
|
||||
},
|
||||
aliases: {
|
||||
'qortal-ui-crypto': path.join(__dirname, '../crypto/api.js')
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = build
|
||||
module.exports = build
|
||||
|
@ -1,8 +1,8 @@
|
||||
const defaultConfig = require('./default.config.js')
|
||||
|
||||
module.exports = {
|
||||
name: 'Qortal',
|
||||
symbol: 'Qort',
|
||||
addressVersion: 58, // Q for Qortal
|
||||
logo: '/img/QORT_LOGO.svg'
|
||||
}
|
||||
name: 'Qortal',
|
||||
symbol: 'Qort',
|
||||
addressVersion: 58, // Q for Qortal
|
||||
logo: '/img/QORT_LOGO.svg'
|
||||
}
|
||||
|
@ -1,33 +1,27 @@
|
||||
let config = require('./default.config.js')
|
||||
|
||||
let userConfig = {}
|
||||
|
||||
try {
|
||||
userConfig = require('./customConfig.js')
|
||||
userConfig = require('./customConfig.js')
|
||||
} catch (e) {
|
||||
console.warn(e)
|
||||
console.warn('Error loading user config')
|
||||
console.warn(e)
|
||||
console.warn('Error loading user config')
|
||||
}
|
||||
|
||||
const checkKeys = (storeObj, newObj) => {
|
||||
for (const key in newObj) {
|
||||
if (!Object.prototype.hasOwnProperty.call(storeObj, key)) {
|
||||
return
|
||||
}
|
||||
for (const key in newObj) {
|
||||
if (!Object.prototype.hasOwnProperty.call(storeObj, key)) return
|
||||
|
||||
if (typeof newObj[key] === 'object') {
|
||||
storeObj[key] = checkKeys(storeObj[key], newObj[key])
|
||||
} else {
|
||||
storeObj[key] = newObj[key]
|
||||
}
|
||||
}
|
||||
|
||||
return storeObj
|
||||
if (typeof newObj[key] === 'object') {
|
||||
storeObj[key] = checkKeys(storeObj[key], newObj[key])
|
||||
} else {
|
||||
storeObj[key] = newObj[key]
|
||||
}
|
||||
}
|
||||
return storeObj
|
||||
}
|
||||
|
||||
const getConfig = customConfig => {
|
||||
config = checkKeys(config, customConfig)
|
||||
return config
|
||||
config = checkKeys(config, customConfig)
|
||||
return config
|
||||
}
|
||||
|
||||
module.exports = getConfig(userConfig)
|
||||
module.exports = getConfig(userConfig)
|
||||
|
@ -1,3 +1,3 @@
|
||||
const defaultConfig = require('./default.config.js')
|
||||
|
||||
module.exports = {}
|
||||
module.exports = {}
|
||||
|
@ -4,4 +4,10 @@ const styles = require('./styles.config.js')
|
||||
const build = require('./build.config.js')
|
||||
const user = require('./user.config.js')
|
||||
|
||||
module.exports = { coin, styles, build, user, crypto }
|
||||
module.exports = {
|
||||
coin,
|
||||
styles,
|
||||
build,
|
||||
user,
|
||||
crypto
|
||||
}
|
||||
|
@ -1,4 +1,5 @@
|
||||
const uiCore = require('../core/ui-core.js')
|
||||
const defaultConfig = uiCore('default_config')
|
||||
|
||||
module.exports = defaultConfig
|
||||
|
||||
module.exports = defaultConfig
|
||||
|
@ -1 +1 @@
|
||||
module.exports = {}
|
||||
module.exports = {}
|
||||
|
@ -1,11 +1,10 @@
|
||||
const user = require('./default.config.js').user
|
||||
|
||||
module.exports = {
|
||||
node: 0, // set to mainnet
|
||||
server: {
|
||||
primary: {
|
||||
port: 12388, // set as default UI port
|
||||
address: '0.0.0.0' // can specify an IP for a fixed bind
|
||||
}
|
||||
}
|
||||
}
|
||||
address: '0.0.0.0', // can specify an IP for a fixed bind
|
||||
},
|
||||
},
|
||||
}
|
||||
|
1
core/.eslintignore
Normal file
1
core/.eslintignore
Normal file
@ -0,0 +1 @@
|
||||
/node_modules
|
22
core/.eslintrc.json
Normal file
22
core/.eslintrc.json
Normal file
@ -0,0 +1,22 @@
|
||||
{
|
||||
"extends" : "standard",
|
||||
"rules": {
|
||||
"indent": [
|
||||
"error",
|
||||
4,
|
||||
{
|
||||
"SwitchCase": 1
|
||||
}
|
||||
]
|
||||
},
|
||||
"env": {
|
||||
"es6": true,
|
||||
"browser": true,
|
||||
"worker": true
|
||||
},
|
||||
"parser": "babel-eslint",
|
||||
"parserOptions": {
|
||||
"sourceType": "module",
|
||||
"allowImportExportEverywhere": true
|
||||
}
|
||||
}
|
@ -1,4 +1,4 @@
|
||||
import {html} from 'lit'
|
||||
import { html } from 'lit'
|
||||
|
||||
export const svgSun = html`<svg height="64px" style="shape-rendering:geometricPrecision;text-rendering:geometricPrecision;image-rendering:optimizeQuality;fill-rule:evenodd;clip-rule:evenodd;width: 32px;" version="1.1" viewBox="0 0 64 64" width="64px" xml:space="preserve"><defs><style type="text/css">.str0 {stroke:#FFC106;stroke-width:2.5;stroke-linecap:round;stroke-linejoin:bevel;stroke-miterlimit:22.9256} .fil1 {fill:none} .fil0 {fill:#FFC106}</style></defs><g id="Layer_x0020_1"><g id="_866321920"><circle class="fil0" r="22.97" transform="matrix(0.543121 0.145529 -0.145529 0.543121 32.0002 31.9993)"/><path class="fil1 str0" d="M32 12.4c0,1.52 0,2 0,2m-9.8 0.63c0.76,1.32 1,1.73 1,1.73m-8.17 5.44c1.32,0.76 1.73,1 1.73,1m-4.36 8.8c1.53,0 2,0 2,0m0.63 9.8c1.32,-0.76 1.73,-1 1.73,-1m5.44 8.17c0.76,-1.32 1,-1.73 1,-1.73m8.8 4.36c0,-1.53 0,-2 0,-2m9.8 -0.63c-0.76,-1.32 -1,-1.73 -1,-1.73m8.17 -5.44c-1.32,-0.76 -1.73,-1 -1.73,-1m4.36 -8.8c-1.53,0 -2,0 -2,0m-0.63 -9.8c-1.32,0.76 -1.73,1 -1.73,1m-5.44 -8.17c-0.76,1.32 -1,1.73 -1,1.73"/></g></g></svg>`;
|
||||
export const svgMoon = html `<svg height="32px" style="enable-background:new 0 0 32 32;" version="1.1" viewBox="0 0 32 32" width="32px" xml:space="preserve"><g id="Layer_1"/><g id="moon_x5F_fill"><g><path d="M24.633,22.184c-8.188,0-14.82-6.637-14.82-14.82c0-2.695,0.773-5.188,2.031-7.363 C5.02,1.969,0,8.188,0,15.645C0,24.676,7.32,32,16.352,32c7.457,0,13.68-5.023,15.648-11.844 C29.82,21.41,27.328,22.184,24.633,22.184z" style="fill:#4E4E50;"/></g></g></svg>`;
|
||||
|
@ -4,4 +4,4 @@ const user = require('./default.user.config.js')
|
||||
const styles = require('./default.styles.config.js')
|
||||
const build = require('./default.build.options.js')
|
||||
|
||||
module.exports = { coin, crypto, user, styles, build }
|
||||
module.exports = { coin, crypto, user, styles, build }
|
||||
|
@ -4,132 +4,132 @@ const { makeSourceAbsolute } = require('../tooling/utils.js')
|
||||
const srcDir = '../src'
|
||||
|
||||
const options = {
|
||||
inputFile: path.join(__dirname, '../src/main.js'),
|
||||
outputDir: path.join(__dirname, '../build'),
|
||||
sassOutputDir: path.join(__dirname, '../build/styles.bundle.css'),
|
||||
imgDir: path.join(__dirname, '../img')
|
||||
inputFile: path.join(__dirname, '../src/main.js'),
|
||||
outputDir: path.join(__dirname, '../build'),
|
||||
sassOutputDir: path.join(__dirname, '../build/styles.bundle.css'),
|
||||
imgDir: path.join(__dirname, '../img')
|
||||
}
|
||||
|
||||
const aliases = {
|
||||
'qortal-ui-crypto': '../../crypto/api.js'
|
||||
'qortal-ui-crypto': '../../crypto/api.js'
|
||||
}
|
||||
|
||||
const apiComponents = {
|
||||
api: {
|
||||
file: '../../crypto/api.js',
|
||||
className: 'api'
|
||||
}
|
||||
api: {
|
||||
file: '../../crypto/api.js',
|
||||
className: 'api'
|
||||
}
|
||||
}
|
||||
|
||||
const functionalComponents = {
|
||||
'loading-ripple': {
|
||||
file: 'functional-components/loading-ripple.js',
|
||||
className: 'LoadingRipple'
|
||||
},
|
||||
'confirm-transaction-dialog': {
|
||||
file: 'functional-components/confirm-transaction-dialog',
|
||||
className: 'ConfirmTransactionDialog'
|
||||
}
|
||||
'loading-ripple': {
|
||||
file: 'functional-components/loading-ripple.js',
|
||||
className: 'LoadingRipple'
|
||||
},
|
||||
'confirm-transaction-dialog': {
|
||||
file: 'functional-components/confirm-transaction-dialog',
|
||||
className: 'ConfirmTransactionDialog'
|
||||
}
|
||||
}
|
||||
|
||||
const inlineComponents = [
|
||||
{
|
||||
className: 'worker',
|
||||
input: path.join(__dirname, srcDir, 'worker.js'),
|
||||
output: 'worker.js'
|
||||
},
|
||||
{
|
||||
className: 'PluginMainJSLoader',
|
||||
input: path.join(__dirname, srcDir, '/plugins/plugin-mainjs-loader.js'),
|
||||
output: 'plugins/plugin-mainjs-loader.js'
|
||||
}
|
||||
{
|
||||
className: 'worker',
|
||||
input: path.join(__dirname, srcDir, 'worker.js'),
|
||||
output: 'worker.js'
|
||||
},
|
||||
{
|
||||
className: 'PluginMainJSLoader',
|
||||
input: path.join(__dirname, srcDir, '/plugins/plugin-mainjs-loader.js'),
|
||||
output: 'plugins/plugin-mainjs-loader.js'
|
||||
}
|
||||
]
|
||||
|
||||
const elementComponents = {
|
||||
'main-app': {
|
||||
file: 'components/main-app.js',
|
||||
className: 'MainApp',
|
||||
children: {
|
||||
'app-styles': {
|
||||
file: 'styles/app-styles.js',
|
||||
className: 'AppStyles',
|
||||
children: {
|
||||
'app-theme': {
|
||||
className: 'AppTheme',
|
||||
file: 'styles/app-theme.js'
|
||||
}
|
||||
}
|
||||
},
|
||||
'app-view': {
|
||||
file: 'components/app-view.js',
|
||||
className: 'AppView',
|
||||
children: {
|
||||
'show-plugin': {
|
||||
file: 'components/show-plugin.js',
|
||||
className: 'ShowPlugin'
|
||||
},
|
||||
'wallet-profile': {
|
||||
file: 'components/wallet-profile.js',
|
||||
className: 'WalletProfile'
|
||||
},
|
||||
'app-info': {
|
||||
file: 'components/app-info.js',
|
||||
className: 'AppInfo'
|
||||
}
|
||||
}
|
||||
},
|
||||
'login-view': {
|
||||
file: 'components/login-view/login-view.js',
|
||||
className: 'LoginView',
|
||||
children: {
|
||||
'create-account-section': {
|
||||
file: 'components/login-view/create-account-section.js',
|
||||
className: 'CreateAccountSection'
|
||||
},
|
||||
'login-section': {
|
||||
file: 'components/login-view/login-section.js',
|
||||
className: 'LoginSection'
|
||||
}
|
||||
}
|
||||
},
|
||||
'settings-view': {
|
||||
file: 'components/settings-view/user-settings.js',
|
||||
className: 'UserSettings',
|
||||
children: {
|
||||
'account-view': {
|
||||
file: 'components/settings-view/account-view.js',
|
||||
className: 'AccountView'
|
||||
},
|
||||
'security-view': {
|
||||
file: 'components/settings-view/security-view.js',
|
||||
className: 'SecurityView'
|
||||
},
|
||||
'qr-login-view': {
|
||||
file: 'components/settings-view/qr-login-view.js',
|
||||
className: 'QRLoginView'
|
||||
},
|
||||
'notifications-view': {
|
||||
file: 'components/settings-view/notifications-view.js',
|
||||
className: 'NotificationsView'
|
||||
}
|
||||
}
|
||||
},
|
||||
'user-info-view': {
|
||||
file: 'components/user-info-view/user-info-view.js',
|
||||
className: 'UserInfoView'
|
||||
}
|
||||
}
|
||||
}
|
||||
'main-app': {
|
||||
file: 'components/main-app.js',
|
||||
className: 'MainApp',
|
||||
children: {
|
||||
'app-styles': {
|
||||
file: 'styles/app-styles.js',
|
||||
className: 'AppStyles',
|
||||
children: {
|
||||
'app-theme': {
|
||||
className: 'AppTheme',
|
||||
file: 'styles/app-theme.js'
|
||||
}
|
||||
}
|
||||
},
|
||||
'app-view': {
|
||||
file: 'components/app-view.js',
|
||||
className: 'AppView',
|
||||
children: {
|
||||
'show-plugin': {
|
||||
file: 'components/show-plugin.js',
|
||||
className: 'ShowPlugin'
|
||||
},
|
||||
'wallet-profile': {
|
||||
file: 'components/wallet-profile.js',
|
||||
className: 'WalletProfile'
|
||||
},
|
||||
'app-info': {
|
||||
file: 'components/app-info.js',
|
||||
className: 'AppInfo'
|
||||
}
|
||||
}
|
||||
},
|
||||
'login-view': {
|
||||
file: 'components/login-view/login-view.js',
|
||||
className: 'LoginView',
|
||||
children: {
|
||||
'create-account-section': {
|
||||
file: 'components/login-view/create-account-section.js',
|
||||
className: 'CreateAccountSection'
|
||||
},
|
||||
'login-section': {
|
||||
file: 'components/login-view/login-section.js',
|
||||
className: 'LoginSection'
|
||||
}
|
||||
}
|
||||
},
|
||||
'settings-view': {
|
||||
file: 'components/settings-view/user-settings.js',
|
||||
className: 'UserSettings',
|
||||
children: {
|
||||
'account-view': {
|
||||
file: 'components/settings-view/account-view.js',
|
||||
className: 'AccountView'
|
||||
},
|
||||
'security-view': {
|
||||
file: 'components/settings-view/security-view.js',
|
||||
className: 'SecurityView'
|
||||
},
|
||||
'qr-login-view': {
|
||||
file: 'components/settings-view/qr-login-view.js',
|
||||
className: 'QRLoginView'
|
||||
},
|
||||
'notifications-view': {
|
||||
file: 'components/settings-view/notifications-view.js',
|
||||
className: 'NotificationsView'
|
||||
}
|
||||
}
|
||||
},
|
||||
'user-info-view': {
|
||||
file: 'components/user-info-view/user-info-view.js',
|
||||
className: 'UserInfoView'
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
makeSourceAbsolute(path.join(__dirname, srcDir), elementComponents)
|
||||
makeSourceAbsolute(path.join(__dirname, srcDir), functionalComponents)
|
||||
|
||||
module.exports = {
|
||||
options,
|
||||
elementComponents,
|
||||
functionalComponents,
|
||||
inlineComponents,
|
||||
apiComponents,
|
||||
aliases
|
||||
}
|
||||
options,
|
||||
elementComponents,
|
||||
functionalComponents,
|
||||
inlineComponents,
|
||||
apiComponents,
|
||||
aliases
|
||||
}
|
||||
|
@ -1,11 +1,11 @@
|
||||
const coin = {
|
||||
name: 'Qortal',
|
||||
symbol: 'QORT',
|
||||
addressCount: 1,
|
||||
addressVersion: 58,
|
||||
decimals: 100000000,
|
||||
logo: '/img/QORT_LOGO.png',
|
||||
icon: '/img/QORT_LOGO.png'
|
||||
name: 'Qortal',
|
||||
symbol: 'QORT',
|
||||
addressCount: 1,
|
||||
addressVersion: 58,
|
||||
decimals: 100000000,
|
||||
logo: '/img/QORT_LOGO.png',
|
||||
icon: '/img/QORT_LOGO.png'
|
||||
}
|
||||
|
||||
module.exports = coin
|
||||
module.exports = coin
|
||||
|
@ -1,11 +1,11 @@
|
||||
const crypto = {
|
||||
kdfThreads: 16,
|
||||
staticSalt: '4ghkVQExoneGqZqHTMMhhFfxXsVg2A75QeS1HCM5KAih', // Base58 encoded
|
||||
bcryptRounds: 11, // Note it's kinda bcryptRounds * log.2.16, cause it runs on all 16 threads
|
||||
bcryptVersion: '2a',
|
||||
get staticBcryptSalt() {
|
||||
return `$${this.bcryptVersion}$${this.bcryptRounds}$IxVE941tXVUD4cW0TNVm.O`
|
||||
}
|
||||
kdfThreads: 16,
|
||||
staticSalt: '4ghkVQExoneGqZqHTMMhhFfxXsVg2A75QeS1HCM5KAih', // Base58 encoded
|
||||
bcryptRounds: 11, // Note it's kinda bcryptRounds * log.2.16, cause it runs on all 16 threads
|
||||
bcryptVersion: '2a',
|
||||
get staticBcryptSalt () {
|
||||
return `$${this.bcryptVersion}$${this.bcryptRounds}$IxVE941tXVUD4cW0TNVm.O`
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = crypto
|
||||
module.exports = crypto
|
||||
|
@ -1,41 +1,40 @@
|
||||
const styles = {
|
||||
breakpoints: {
|
||||
desktop: '',
|
||||
laptop: '',
|
||||
tablet: '',
|
||||
mobile: ''
|
||||
},
|
||||
theme: {
|
||||
colors: {
|
||||
primary: '#03a9f4', /* Sets the text color to the theme primary color. */
|
||||
primaryBg: '#e8eaf6', /* Sets the background color to the theme primary color. */
|
||||
onPrimary: '#fff', /* Sets the text color to the color configured for text on the primary color. */
|
||||
breakpoints: {
|
||||
desktop: '',
|
||||
laptop: '',
|
||||
tablet: '',
|
||||
mobile: ''
|
||||
},
|
||||
theme: {
|
||||
colors: {
|
||||
primary: '#03a9f4', /* Sets the text color to the theme primary color. */
|
||||
primaryBg: '#e8eaf6', /* Sets the background color to the theme primary color. */
|
||||
onPrimary: '#fff', /* Sets the text color to the color configured for text on the primary color. */
|
||||
|
||||
secondary: '#03a9f4', /* Sets the text color to the theme secondary color. */
|
||||
secondaryBg: '#fce4ec', /* Sets the background color to the theme secondary color. */
|
||||
onSecondary: '#fff', /* Sets the text color to the color configured for text on the secondary color. */
|
||||
secondary: '#03a9f4', /* Sets the text color to the theme secondary color. */
|
||||
secondaryBg: '#fce4ec', /* Sets the background color to the theme secondary color. */
|
||||
onSecondary: '#fff', /* Sets the text color to the color configured for text on the secondary color. */
|
||||
|
||||
surface: '#fff', /* Sets the background color to the surface background color. */
|
||||
onSurface: '#333', /* Sets the text color to the color configured for text on the surface color. */
|
||||
background: '#eee', /* Sets the background color to the theme background color. */
|
||||
surface: '#fff', /* Sets the background color to the surface background color. */
|
||||
onSurface: '#333', /* Sets the text color to the color configured for text on the surface color. */
|
||||
background: '#eee', /* Sets the background color to the theme background color. */
|
||||
|
||||
warning: '#FFA000',
|
||||
error: '#F44336'
|
||||
},
|
||||
warning: '#FFA000',
|
||||
error: '#F44336'
|
||||
},
|
||||
|
||||
addressColors: [
|
||||
'#256480',
|
||||
'#002530',
|
||||
'#02564e',
|
||||
'#d32f2f',
|
||||
'#795548',
|
||||
'#004d40',
|
||||
'#006064',
|
||||
'#9c27b0',
|
||||
'#2196f3',
|
||||
'#d81b60'
|
||||
]
|
||||
}
|
||||
addressColors: [
|
||||
'#256480',
|
||||
'#002530',
|
||||
'#02564e',
|
||||
'#d32f2f',
|
||||
'#795548',
|
||||
'#004d40',
|
||||
'#006064',
|
||||
'#9c27b0',
|
||||
'#2196f3',
|
||||
'#d81b60'
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = styles
|
||||
module.exports = styles
|
||||
|
@ -1,43 +1,46 @@
|
||||
const path = require('path')
|
||||
|
||||
const user = {
|
||||
node: 0,
|
||||
nodeSettings: {
|
||||
pingInterval: 30 * 1000
|
||||
},
|
||||
server: {
|
||||
writeHosts: {
|
||||
enabled: true
|
||||
},
|
||||
relativeTo: path.join(__dirname, '../'),
|
||||
primary: {
|
||||
domain: '0.0.0.0',
|
||||
address: '0.0.0.0',
|
||||
port: 12388,
|
||||
directory: './src/',
|
||||
page404: './src/404.html',
|
||||
host: '0.0.0.0'
|
||||
}
|
||||
},
|
||||
tls: {
|
||||
enabled: false,
|
||||
options: {
|
||||
key: '',
|
||||
cert: ''
|
||||
}
|
||||
},
|
||||
constants: {
|
||||
pollingInterval: 30 * 1000, // How long between checking for new unconfirmed transactions and new blocks (in milliseconds).
|
||||
workerURL: '/build/worker.js'
|
||||
},
|
||||
node: 0,
|
||||
nodeSettings: {
|
||||
pingInterval: 30 * 1000,
|
||||
},
|
||||
server: {
|
||||
writeHosts: {
|
||||
enabled: true,
|
||||
},
|
||||
relativeTo: path.join(__dirname, '../'),
|
||||
primary: {
|
||||
domain: '0.0.0.0',
|
||||
address: '0.0.0.0',
|
||||
port: 12388,
|
||||
directory: './src/',
|
||||
page404: './src/404.html',
|
||||
host: '0.0.0.0',
|
||||
},
|
||||
},
|
||||
tls: {
|
||||
enabled: false,
|
||||
options: {
|
||||
key: '',
|
||||
cert: '',
|
||||
},
|
||||
},
|
||||
constants: {
|
||||
pollingInterval: 30 * 1000, // How long between checking for new unconfirmed transactions and new blocks (in milliseconds).
|
||||
workerURL: '/build/worker.js',
|
||||
},
|
||||
|
||||
// Notification Settings (All defaults to true)
|
||||
notifications: {
|
||||
q_chat: {
|
||||
playSound: true,
|
||||
showNotification: true
|
||||
}
|
||||
}
|
||||
// Notification Settings (All defaults to true)
|
||||
notifications: {
|
||||
q_chat: {
|
||||
playSound: true,
|
||||
showNotification: true,
|
||||
},
|
||||
block: {
|
||||
playSound: true,
|
||||
showNotification: true,
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
module.exports = user
|
||||
module.exports = user
|
||||
|
@ -1,22 +1,21 @@
|
||||
let config = require('./config.js')
|
||||
|
||||
const checkKeys = (storeObj, newObj) => {
|
||||
for (const key in newObj) {
|
||||
if (!Object.prototype.hasOwnProperty.call(storeObj, key)) return
|
||||
for (const key in newObj) {
|
||||
if (!Object.prototype.hasOwnProperty.call(storeObj, key)) return
|
||||
|
||||
if (typeof newObj[key] === 'object') {
|
||||
storeObj[key] = checkKeys(storeObj[key], newObj[key])
|
||||
} else {
|
||||
storeObj[key] = newObj[key]
|
||||
}
|
||||
}
|
||||
|
||||
return storeObj
|
||||
if (typeof newObj[key] === 'object') {
|
||||
storeObj[key] = checkKeys(storeObj[key], newObj[key])
|
||||
} else {
|
||||
storeObj[key] = newObj[key]
|
||||
}
|
||||
}
|
||||
return storeObj
|
||||
}
|
||||
|
||||
const getConfig = customConfig => {
|
||||
config = checkKeys(config, customConfig)
|
||||
return config
|
||||
config = checkKeys(config, customConfig)
|
||||
return config
|
||||
}
|
||||
|
||||
module.exports = getConfig
|
||||
module.exports = getConfig
|
||||
|
Binary file not shown.
@ -101,10 +101,3 @@
|
||||
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;
|
||||
}
|
@ -6,7 +6,6 @@ html {
|
||||
--plugback: #ffffff;
|
||||
--border: #d0d6de;
|
||||
--border2: #dde2e8;
|
||||
--border3: #080808;
|
||||
--copybutton: #707584;
|
||||
--chat-group: #080808;
|
||||
--chat-bubble: #9f9f9f0a;
|
||||
@ -66,14 +65,6 @@ html {
|
||||
--app-icon: #ffffff;
|
||||
--app-hr: rgba(0, 0, 0, .3);
|
||||
--code-block-text-color: #008fd5;
|
||||
--noavatar: url("/img/noavatar_light.png");
|
||||
--login-border: rgba(0, 167, 245);
|
||||
--login-border-50pct: rgba(0, 167, 245, 0.5);
|
||||
--login-border-10pct: rgba(0, 167, 245, 0.1);
|
||||
--login-button: rgb(3, 169, 244);
|
||||
--general-color-blue: #03a9f4;
|
||||
--qchat-name: #03a9f4;
|
||||
--qchat-my-name: #05be0e;
|
||||
}
|
||||
|
||||
html[theme="dark"] {
|
||||
@ -84,7 +75,6 @@ html[theme="dark"] {
|
||||
--plugback: #0f1a2e;
|
||||
--border: #0b305e;
|
||||
--border2: #0b305e;
|
||||
--border3: #767676;
|
||||
--copybutton: #d0d6de;
|
||||
--chat-group: #ffffff;
|
||||
--chat-bubble: #9694941a;
|
||||
@ -144,12 +134,4 @@ html[theme="dark"] {
|
||||
--app-icon: #03a9f4;
|
||||
--app-hr: rgba(255, 255, 255, .3);
|
||||
--code-block-text-color: #008fd5;
|
||||
--noavatar: url("/img/noavatar_dark.png");
|
||||
--login-border: rgba(0, 167, 245);
|
||||
--login-border-50pct: rgba(0, 167, 245, 0.5);
|
||||
--login-border-10pct: rgba(0, 167, 245, 0.1);
|
||||
--login-button: rgb(3, 169, 244);
|
||||
--general-color-blue: #03a9f4;
|
||||
--qchat-name: #03a9f4;
|
||||
--qchat-my-name: #05be0e;
|
||||
}
|
@ -5,10 +5,8 @@
|
||||
"chinese1": "Chinesisch (vereinfacht)",
|
||||
"chinese2": "Chinesisch (traditionell)",
|
||||
"croatian": "Kroatisch",
|
||||
"dutch": "Niederländisch",
|
||||
"english": "Englisch",
|
||||
"estonian": "Estnisch",
|
||||
"finnish": "Finnisch",
|
||||
"french": "Französisch",
|
||||
"german": "Deutsch",
|
||||
"hindi": "Hindi",
|
||||
@ -80,7 +78,7 @@
|
||||
"tm32": "Diesem Konto folgt keinem Benutzer",
|
||||
"tm33": "Registerkartenmenü importieren",
|
||||
"tm34": "Registerkartenmenü Exportieren",
|
||||
"tm35": "Ihr vorhandenes Tab-Menü wird gelöscht und auf das importiert Tab-Menü gesetzt.",
|
||||
"tm35": "Ihr vorhandenes Tab-Menü wird gelöscht und auf das hochgeladene Tab-Menü gesetzt.",
|
||||
"tm36": "Tab-Menü erfolgreich wiederhergestellt",
|
||||
"tm37": "Tab-Menü erfolgreich gespeichert als",
|
||||
"tm38": "DEV-MODUS",
|
||||
@ -98,43 +96,43 @@
|
||||
"youraccounts": "Ihre Konten",
|
||||
"clickto": "Klicken Sie auf Ihr Konto, um sich damit anzumelden",
|
||||
"needcreate": "Sie müssen ein Konto erstellen oder speichern, bevor Sie sich anmelden können!",
|
||||
"upload": "Importieren Sie Ihre Qortal Backup-Datei",
|
||||
"upload": "Laden Sie Ihr Qortal-Backup hoch",
|
||||
"howlogin": "Wie möchten Sie sich anmelden?",
|
||||
"seed": "Seedphrase",
|
||||
"seedphrase": "seedphrase",
|
||||
"saved": "Gespeichertes Konto",
|
||||
"qora": "QORA Adresssamen",
|
||||
"backup": "Qortal-Sicherungsdatei",
|
||||
"decrypt": "Sicherungsdatei entschlüsseln",
|
||||
"qora": "Qora Adresssamen",
|
||||
"backup": "Qortal wallet backup",
|
||||
"decrypt": "Entschlüssel Sicherung",
|
||||
"save": "In diesem Browser speichern.",
|
||||
"prepare": "Vorbereiten Ihres Kontos...",
|
||||
"areyousure": "Möchten Sie dieses Wallet wirklich aus den gespeicherten Wallets entfernen? (Wenn es entfernt wird und keine Sicherungsdatei vorhanden ist, könnte das Konto für immer verloren gehen! Stellen Sie sicher, dass Sie über eine Sicherungsdatei verfügen, bevor Sie dies tun!)",
|
||||
"error1": "Die Sicherungsdatei muss gültiges JSON sein",
|
||||
"prepare": "Vorbereiten Ihres Kontos",
|
||||
"areyousure": "Möchten Sie dieses Wallet wirklich aus den gespeicherten Wallets entfernen?",
|
||||
"error1": "Sicherung muss gültiges JSON format sein",
|
||||
"error2": "Anmeldeoption nicht ausgewählt",
|
||||
"createwelcome": "Willkommen bei Qortal! Ihre dezentrale digitale Zukunft erwartet Sie! Nur bei Qortal haben Sie die absolute Kontrolle über Ihre Daten. Qortal bietet die Basisebene einer neuen, vollständig benutzergesteuerten digitalen Welt.",
|
||||
"createwelcome": "Willkommen bei Qortal, Sie werden feststellen, dass es dem eines RPG-Spiels ähnelt. Sie als Minter im Qortal-Netzwerk (wenn Sie sich dafür entscheiden, einer zu werden) haben die Möglichkeit, Ihr Konto zu verbessern, wodurch Sie mehr von der QORT-Block-Belohnung haben und auch einen größeren Einfluss auf das Netzwerk in Bezug auf die Abstimmung über Entscheidungen für die Plattform zu haben.",
|
||||
"createa": "Eine",
|
||||
"click": "Klicken Sie hier, um die Seedphrase anzuzeigen",
|
||||
"confirmpass": "Passwort bestätigen",
|
||||
"willbe": "wird zufällig im Hintergrund generiert. Wenn Sie die Seedphrase ANZEIGEN möchten, klicken Sie in diesem Text auf die hervorgehobene „Seedphrase“. Dies wird als Ihr privater Schlüsselgenerator für Ihr Blockchain-Konto in Qortal verwendet. Aus Sicherheitsgründen werden Seedphrases standardmäßig nicht angezeigt, es sei denn, dies wurde ausdrücklich ausgewählt.",
|
||||
"willbe": "wird zufällig im Hintergrund generiert. Diese wird als Ihr privater Schlüsselgenerator für Ihr Blockchain-Konto in Qortal verwendet.",
|
||||
"clicknext": "Erstellen Sie Ihr Qortal-Konto, indem Sie unten auf WEITER klicken.",
|
||||
"ready": "Ihr Konto kann jetzt erstellt werden. Es wird standardmäßig in verschlüsselter Form in dieser Kopie der Qortal-Benutzeroberfläche gespeichert. Wenn Sie nicht möchten, dass Ihr neues Konto hier gespeichert wird, können Sie das Kontrollkästchen unten deaktivieren. Sie können sich weiterhin mit Ihrem neuen Konto anmelden (nachdem Sie sich abgemeldet haben) und dabei Ihre Wallet-Sicherungsdatei verwenden, die Sie nach der Erstellung Ihres Kontos unbedingt herunterladen müssen.",
|
||||
"ready": "Ihr Konto kann jetzt erstellt werden. Es wird in diesem Browser gespeichert. Wenn Sie nicht möchten, dass Ihr neues Konto in Ihrem Browser gespeichert wird, können Sie das Kontrollkästchen unten deaktivieren. Sie können sich weiterhin mit Ihrem neuen Konto anmelden (nachdem Sie sich abgemeldet haben), indem Sie Ihre Brieftaschen-Sicherungsdatei verwenden, die Sie herunterladen MÜSSEN, sobald Sie Ihr Konto erstellt haben.",
|
||||
"welmessage": "Willkommen bei Qortal",
|
||||
"pleaseenter": "Bitte Passwort eingeben!",
|
||||
"notmatch": "Hoppla! Passwörter stimmen nicht überein! Versuchen Sie es erneut!",
|
||||
"lessthen8": "Ihr Passwort hat weniger als 5 Zeichen! Dies wird nicht empfohlen. Sie können diese Warnung weiterhin ignorieren.",
|
||||
"lessthen8-2": "Ihr Passwort hat weniger als 5 Zeichen!",
|
||||
"entername": "Bitte geben Sie einen Anzeigenamen ein!",
|
||||
"downloaded": "Ihre Wallet-Backup-Datei wurde gespeichert!",
|
||||
"notmatch": "Passwörter stimmen nicht überein!",
|
||||
"lessthen8": "Ihr Passwort hat weniger als 8 Zeichen! Dies wird nicht empfohlen. Sie können diese Warnung weiterhin ignorieren.",
|
||||
"lessthen8-2": "Ihr Passwort hat weniger als 8 Zeichen!",
|
||||
"entername": "Bitte geben Sie einen Namen ein!",
|
||||
"downloaded": "Ihre Wallet BackUp-Datei wird heruntergeladen!",
|
||||
"loading": "Wird geladen, bitte warten...",
|
||||
"createdseed": "Ihre erstellte Seedphrase:",
|
||||
"createdseed": "Ihre erstellte Seedphrase",
|
||||
"saveseed": "Seedphrase speichern",
|
||||
"savein": "Speichern Sie in dieser Benutzeroberfläche",
|
||||
"backup2": "Diese Datei ist (standardmäßig) die EINZIGE Möglichkeit, auf Ihr Konto zuzugreifen, sofern sie nicht in der Benutzeroberfläche gespeichert wird. Stellen Sie sicher, dass Sie diese Datei an mehreren Orten sichern. Die Datei wird sehr sicher verschlüsselt und mit Ihrem lokalen Passwort, das Sie im vorherigen Schritt erstellt haben, entschlüsselt. Sie können es überall sicher speichern, aber achten Sie darauf, dass Sie dies an mehreren Orten tun.",
|
||||
"savein": "Im Browser speichern",
|
||||
"backup2": "Diese Datei ist die EINZIGE Möglichkeit, auf Ihr Konto auf einem System zuzugreifen, auf dem das Konto nicht in der App oder im Browser gespeichert ist. SICHERN SIE DIESE DATEI AN MEHREREN ORTEN. Die Datei wird sehr sicher verschlüsselt und mit Ihrem lokalen Passwort, das Sie im vorherigen Schritt erstellt haben, entschlüsselt. Sie können es überall sicher speichern, aber stellen Sie sicher, dass Sie dies an mehreren Orten tun.",
|
||||
"savewallet": "Speichern Sie die Wallet-Sicherungsdatei",
|
||||
"created1": "Ihr Konto ist jetzt erstellt",
|
||||
"created2": " und in verschlüsselter Form in dieser Benutzeroberfläche gespeichert.",
|
||||
"downloadbackup": "Speichern Sie die Wallet-BackUp-Datei",
|
||||
"passwordhint": "Das Passwort muss mindestens 5 Zeichen lang sein.",
|
||||
"created2": " und wird in diesem Browser gespeichert.",
|
||||
"downloadbackup": "Laden Sie die Wallet-Sicherungsdatei herunter",
|
||||
"passwordhint": "Ein Passwort muss mindestens 8 Zeichen lang sein.",
|
||||
"lp1": "Bildschirm sperren",
|
||||
"lp2": "Es ist kein Passwort für den Sperrbildschirm festgelegt!",
|
||||
"lp3": "Bitte legen Sie eins fest",
|
||||
@ -155,16 +153,16 @@
|
||||
"lp18": "Schlüsselteile ableiten",
|
||||
"lp19": "Fehler, falscher Schlüssel. ",
|
||||
"lp20": "Fehler, falsche Nonce",
|
||||
"lp21": "Schlüsselteile kombinieren",
|
||||
"lp21": "Wichtige Teile kombinieren",
|
||||
"lp22": "Schlüssel ist bereit"
|
||||
},
|
||||
"logout": {
|
||||
"logout": "ABMELDEN",
|
||||
"logout": "AUSLOGGEN",
|
||||
"confirmlogout": "Möchten Sie sich wirklich abmelden?"
|
||||
},
|
||||
"fragfile": {
|
||||
"selectfile": "Wählen Sie die Sicherungsdatei aus",
|
||||
"dragfile": "Ziehen Sie die Datei per Drag-and-Drop oder klicken Sie hier, um die Sicherungsdatei auszuwählen"
|
||||
"selectfile": "Datei auswählen",
|
||||
"dragfile": "Backup per Drag-and-Drop hierher ziehen"
|
||||
},
|
||||
"settings": {
|
||||
"generalinfo": "Allgemeine Kontoinformationen",
|
||||
@ -181,40 +179,33 @@
|
||||
"notifications": "Benachrichtigungen",
|
||||
"accountsecurity": "Konto Sicherheit",
|
||||
"password": "Passwort",
|
||||
"download": "Sicherungsdatei exportieren/speichern",
|
||||
"choose": "Bitte geben Sie ein Passwort ein, um Ihre Sicherungsdatei zu verschlüsseln. (Dies kann dasselbe sein wie das, mit dem Sie sich angemeldet haben, oder ein neues.)",
|
||||
"download": "Sicherungsdatei herunterladen",
|
||||
"choose": "Bitte wählen Sie ein Passwort, um Ihr Backup zu verschlüsseln. (Dies kann dasselbe sein wie das, mit dem Sie sich angemeldet haben, oder ein anderes)",
|
||||
"block": "Block Benachrichtigungen (Kommt bald...)",
|
||||
"playsound": "Ton abspielen",
|
||||
"shownotifications": "Zeige Benachrichtigungen",
|
||||
"nodeurl": "Knotenverbindung",
|
||||
"nodehint": "Wählen Sie einen Knoten aus der Standardliste aus oder fügen Sie der Liste einen benutzerdefinierten Knoten hinzu, indem Sie auf die Schaltfläche unten klicken",
|
||||
"nodehint": "Wählen Sie einen Knoten aus der Standardliste der Knoten oben aus oder fügen Sie der obigen Liste einen benutzerdefinierten Knoten hinzu, indem Sie auf die Schaltfläche unten klicken",
|
||||
"addcustomnode": "Benutzerdefinierten Knoten hinzufügen",
|
||||
"addandsave": "Hinzufügen und speichern",
|
||||
"protocol": "Protokoll",
|
||||
"domain": "Domain",
|
||||
"port": "Port",
|
||||
"import": "Gespeicherte Knoten importieren",
|
||||
"export": "Gespeicherte Knoten exportieren",
|
||||
"import": "Knoten Importieren",
|
||||
"export": "Knoten Exportieren",
|
||||
"deletecustomnode": "Alle benutzerdefinierten Knoten entfernen",
|
||||
"warning": "Ihre bestehenden Knoten werden gelöscht und aus dem Backup neu erstellt.",
|
||||
"snack1": "Benutzerdefinierten Knoten erfolgreich gelöscht und Standardknoten hinzugefügt",
|
||||
"snack1": "Standardknoten erfolgreich gelöscht und hinzugefügt",
|
||||
"snack2": "UI mit Knoten verbunden",
|
||||
"snack3": "Benutzerdefinierter Knoten erfolgreich hinzugefügt und gespeichert",
|
||||
"snack4": "Knoten erfolgreich gespeichert als",
|
||||
"snack5": "Knoten erfolgreich importiert",
|
||||
"snack6": "Benutzerdefinierter Knoten erfolgreich entfernt",
|
||||
"snack7": "Benutzerdefinierter Knoten erfolgreich bearbeitet",
|
||||
"exp1": "Master-Privatschlüssel exportieren (xpriv)",
|
||||
"exp1": "Privaten Hauptschlüssel exportieren",
|
||||
"exp2": "Hauptschlüssel exportieren",
|
||||
"exp3": "Exportieren",
|
||||
"exp4": "Bitte wählen Sie eine Wallet aus, um den privaten Master-Schlüssel zu sichern/exportieren.",
|
||||
"core": "Grundlegende Autostart-Einstellungen",
|
||||
"qappNotification1": "Q-App Benachrichtigungen",
|
||||
"selectnode": "Bitte wählen Sie eine Option",
|
||||
"arrr1": "ARRR-Wallet nicht initialisiert!",
|
||||
"arrr2": "Bitte gehen Sie zur Registerkarte „Wallet“ und greifen Sie auf das ARRR-Wallet zu, um zuerst das Wallet zu initialisieren.",
|
||||
"arrr3": "Core-Update erforderlich!",
|
||||
"arrr4": "Um den privaten Schlüssel Ihres ARRR-Wallets zu speichern, müssen Sie zunächst den Qortal Core aktualisieren!",
|
||||
"sync_indicator": "Synchronisierungsanzeige-Popup deaktivieren"
|
||||
"exp4": "Bitte wählen Sie eine Brieftasche aus, um den privaten Hauptschlüssel zu sichern.",
|
||||
"core": "Core-Einstellungen starten",
|
||||
"qappNotification1": "Q-App Benachrichtigungen"
|
||||
},
|
||||
"appinfo": {
|
||||
"blockheight": "Blockhöhe",
|
||||
@ -248,9 +239,7 @@
|
||||
"balance": "Guthaben",
|
||||
"balances": "IHR WALLET-GUTHABEN",
|
||||
"update": "AKTUALISIERE WALLET-GUTHABEN",
|
||||
"view": "Ansehen",
|
||||
"all": "Alle",
|
||||
"page": "Seite"
|
||||
"view": "Ansehen"
|
||||
},
|
||||
"gifs": {
|
||||
"gchange1": "GIF-Explorer",
|
||||
@ -285,15 +274,15 @@
|
||||
},
|
||||
"startminting": {
|
||||
"smchange1": "Prägekonten können nicht abgerufen werden",
|
||||
"smchange2": "Minting-Schlüssel konnte nicht entfernt werden",
|
||||
"smchange3": "Das Hinzufügen des Minting-Schlüssels ist fehlgeschlagen. Wenn der Schlüssel gerade erstellt wurde, warten Sie ein paar Blöcke und fügen Sie ihn erneut hinzu",
|
||||
"smchange2": "Schlüssel konnte nicht entfernt werden",
|
||||
"smchange3": "Prägeschlüssel konnte nicht hinzugefügt werden",
|
||||
"smchange4": "Sponsorship-Schlüssel kann nicht erstellt werden",
|
||||
"smchange5": "Beziehung schaffen",
|
||||
"smchange6": "Warten auf Bestätigung in der Blockchain",
|
||||
"smchange7": "Beziehung beenden",
|
||||
"smchange8": "Prägeschlüssel zum Knoten hinzufügen",
|
||||
"smchange9": "Vollständig",
|
||||
"smchange10": "Pro Knoten sind nur 2 Minting-Schlüssel zulässig. Sie versuchen, 3 Schlüssel zuzuweisen. Gehen Sie bitte zur Knotenverwaltung und entfernen Sie alle unnötigen Schlüssel. Vielen Dank!"
|
||||
"smchange10": "Pro Node sind nur 2 Minting Keys erlaubt, Sie versuchen 3 Keys zuzuweisen, gehen Sie bitte zu Management - Node Management und entfernen Sie den Key, den Sie diesem Node nicht zuweisen möchten, danke!"
|
||||
},
|
||||
"mintingpage": {
|
||||
"mchange1": "Allgemeine Prägedetails",
|
||||
@ -331,7 +320,7 @@
|
||||
"mchange33": "Einführung",
|
||||
"mchange34": "Um in Qortal ein Minter zu werden und QORT-Belohnungen mit Ihrer Erhöhung des Minter-Levels zu verdienen, müssen Sie zuerst „gesponsert“ werden. Ein Sponsor in Qortal ist jeder andere Minter der Stufe 5 oder höher oder ein Qortal-Gründer. Sie erhalten einen Sponsoring-Schlüssel vom Sponsor und verwenden diesen Schlüssel, um auf Level 1 zu gelangen. Sobald Sie Level 1 erreicht haben, können Sie Ihren eigenen Prägeschlüssel erstellen und beginnen, Belohnungen für die Unterstützung bei der Sicherung der Qortal-Blockkette zu verdienen.",
|
||||
"mchange35": "Sponsoring",
|
||||
"mchange36": "Ihr Sponsor stellt Ihnen einen „Sponsorship Key“ aus, den Sie zum Hinzufügen zu Ihrem Knoten verwenden und mit dem Prägen beginnen (keine Belohnungen bis zum Erreichen von Level 1). Sobald Sie Level 1 erreicht haben, erstellen/weisen Sie Ihren eigenen „Minting Key und Beginnen Sie mit dem Verdienen von Belohnungen.",
|
||||
"mchange36": "Ihr Sponsor stellt Ihnen einen „Sponsorship Key“ aus, den Sie zum Hinzufügen zu Ihrem Knoten verwenden und mit dem Prägen beginnen (keine Belohnungen bis zum Erreichen von Level 1). Sobald Sie Level 1 erreicht haben, erstellen/weisen Sie Ihren eigenen „Minting Key“ und Beginnen Sie mit dem Verdienen von Belohnungen.",
|
||||
"mchange37": "Wenden Sie sich einfach an einen Minter in Qortal, der hoch genug ist, um einen Sponsoring-Schlüssel auszustellen, erhalten Sie diesen Schlüssel, kommen Sie dann hierher zurück und geben Sie den Schlüssel ein, um Ihre Minting-Reise zu beginnen!",
|
||||
"mchange38": "in"
|
||||
},
|
||||
@ -395,7 +384,7 @@
|
||||
"wchange45": "Sende alle",
|
||||
"wchange46": "An diese Adresse verschicken",
|
||||
"wchange47": "Adressbuch",
|
||||
"wchange48": "Dieses Adressbuch ist leer!",
|
||||
"wchange48": "Dieses Adressbuch ist leer !",
|
||||
"wchange49": "Zum Adressbuch hinzufügen",
|
||||
"wchange50": "Der Name darf nicht leer sein!",
|
||||
"wchange51": "Adresse darf nicht leer sein!",
|
||||
@ -405,8 +394,7 @@
|
||||
"wchange55": "Ihr bestehendes Adressbuch wird gelöscht und aus einem Backup neu erstellt.",
|
||||
"wchange56": "WARNUNG!",
|
||||
"wchange57": "Memo",
|
||||
"wchange58": "Neue Adresse",
|
||||
"wchange59": "Münze"
|
||||
"wchange58": "Neue Adresse"
|
||||
},
|
||||
"tradepage": {
|
||||
"tchange1": "Handelsportal",
|
||||
@ -468,10 +456,10 @@
|
||||
"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": "Level 1 - 4 können einen Self Share erstellen und Level 5 oder höher können einen Reward Share erstellen!",
|
||||
"rchange10": "Öffentlicher Schlüssel des Empfängers",
|
||||
"rchange11": "Belohnungsanteil in Prozent",
|
||||
"rchange12": "Angeforderter Befehl wird ausgeführt...",
|
||||
"rchange12": "Mache Etwas Leckeres",
|
||||
"rchange13": "Füge Minting Konto hinzu",
|
||||
"rchange14": "Hinzufügen",
|
||||
"rchange15": "Dieses Konto ist nicht an Belohnungsanteile beteiligt",
|
||||
@ -509,12 +497,12 @@
|
||||
"nchange23": "Verkaufspreis",
|
||||
"nchange24": "Keine Namen zu verkaufen",
|
||||
"nchange25": "Name zu verkaufen",
|
||||
"nchange26": "Sind Sie sicher, dass Sie diesen Namen verkaufen möchten? Wenn der Name von einem anderen Konto gekauft wird, liegt dies außerhalb Ihrer Kontrolle!",
|
||||
"nchange26": "Sind Sie sicher, dass Sie diesen Namen verkaufen möchten?",
|
||||
"nchange27": "Für diesen Preis in QORT",
|
||||
"nchange28": "Wenn Sie auf „Bestätigen“ klicken, wird Ihr Name zum Verkauf angeboten!",
|
||||
"nchange28": "Beim Drücken auf Bestätigen wird die Anfrage zum Verkauf gesendet!",
|
||||
"nchange29": "Name zu stornieren",
|
||||
"nchange30": "Sind Sie sicher, den Verkauf für diesen Namen abzubrechen?",
|
||||
"nchange31": "Wenn Sie auf „Bestätigen“ klicken, wird der Namensverkauf abgebrochen!",
|
||||
"nchange31": "Beim Drücken auf Bestätigen wird die Anfrage zum Stornieren des Verkaufs gesendet!",
|
||||
"nchange32": "Namensverkaufsanfrage erfolgreich!",
|
||||
"nchange33": "Verkaufsnamensanfrage erfolgreich stornieren!",
|
||||
"nchange34": "Kaufname-Anfrage erfolgreich!",
|
||||
@ -530,8 +518,7 @@
|
||||
"nchange44": "Zum neuen Namen",
|
||||
"nchange45": "Beim Bestätigen wird die Anfrage zur Namensaktualisierung gesendet!",
|
||||
"nchange46": "Namensverkaufshistorie",
|
||||
"nchange47": "Namensaktualisierung erfolgreich!",
|
||||
"nchange48": "Warnung! Wenn Sie Ihren Namen aktualisieren, verlieren Sie die mit dem ursprünglichen Namen verbundenen Ressourcen. Mit anderen Worten: Sie verlieren das Eigentum an den Inhalten unter dem ursprünglichen Namen im QDN. Gehen Sie vorsichtig vor!"
|
||||
"nchange47": "Namensaktualisierung erfolgreich!"
|
||||
},
|
||||
"websitespage": {
|
||||
"schange1": "Webseiten durchsuchen",
|
||||
@ -551,7 +538,7 @@
|
||||
"schange15": "Blockierte Webseiten",
|
||||
"schange16": "Sie haben keine Webseiten blockiert",
|
||||
"schange17": "Name nicht gefunden!",
|
||||
"schange18": "Der Relaismodus ist aktiviert. Das bedeutet, dass Ihr Knoten dabei hilft, VERSCHLÜSSELTE/CHUNKIERTE Daten im Netzwerk zu transportieren, wenn ein Peer dies anfordert. Sie können sich per Einstellung abmelden",
|
||||
"schange18": "Der Relay-Modus ist aktiviert. Dies bedeutet, dass Ihr Knoten dabei hilft, verschlüsselte Daten im Netzwerk zu transportieren, wenn ein Peer sie anfordert. Sie können sich per Einstellung abmelden, ändern Sie",
|
||||
"schange19": "in",
|
||||
"schange20": "Der Relay-Modus ist deaktiviert. Sie können es durch Einstellung aktivieren, ändern Sie",
|
||||
"schange21": "Webseite veröffentlichen",
|
||||
@ -612,8 +599,7 @@
|
||||
"schange39": "Öffnen",
|
||||
"schange40": "Vorschau",
|
||||
"schange41": "Wird heruntergeladen, bitte warten...",
|
||||
"schange42": "Heruntergeladene Dateien",
|
||||
"schange43": "Alle versuchten Downloads werden im Hintergrund fortgesetzt. Bitte versuchen Sie es nach einer Weile erneut."
|
||||
"schange42": "Heruntergeladene Dateien"
|
||||
},
|
||||
"tubespage": {
|
||||
"schange1": "Q-Tubes durchsuchen",
|
||||
@ -630,7 +616,7 @@
|
||||
"schange12": "Verfolgte Q-Tubes",
|
||||
"schange13": "Du folgst keinen Q-Tubes",
|
||||
"schange14": "Ihre blockierten Q-Tubes",
|
||||
"schange15": "Blockierte Q-Tubes",
|
||||
"schange15": "Blockierte Q-Röhren",
|
||||
"schange16": "Sie haben keine Q-Tubes blockiert",
|
||||
"schange17": "Name nicht gefunden!",
|
||||
"schange18": "Relaismodus ist aktiviert. Das bedeutet, dass Ihr Knoten dabei hilft, verschlüsselte Daten durch das Netzwerk zu transportieren, wenn ein Peer dies anfordert. Sie können sich durch Einstellung abmelden",
|
||||
@ -735,14 +721,7 @@
|
||||
"bchange44": "Erteilen Sie dieser Anwendung die Erlaubnis, sie von dieser Liste zu löschen?",
|
||||
"bchange45": "Verschlüsseln",
|
||||
"bchange46": "Geben Sie dieser Anwendung die Erlaubnis, die folgende Datei zu speichern?",
|
||||
"bchange47": "Sofortige Veröffentlichung – erforderlich",
|
||||
"bchange48": "Erteilen Sie dieser Anwendung die Berechtigung, Ihnen Benachrichtigungen zu senden?",
|
||||
"bchange49": "Erteilen Sie dieser Anwendung die Erlaubnis, Ihr Wallet-Informationen abzurufen?",
|
||||
"bchange50": "Diese App hat eine Änderung Ihres öffentlichen Profils angefordert. Eigenschaft:",
|
||||
"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?"
|
||||
"bchange47": "Sofortige Veröffentlichung – erforderlich"
|
||||
},
|
||||
"datapage": {
|
||||
"dchange1": "Datenmanagement",
|
||||
@ -811,7 +790,7 @@
|
||||
"cchange42": "Aus Gründen der Spam-Bekämpfung benötigen Konten mit einem Qort-Guthaben von weniger als 4 viel Zeit, um Nachrichten in Q-Chat zu SENDEN. Wenn Sie die Sendegeschwindigkeit für Q-Chat-Nachrichten sofort erhöhen möchten, besorgen Sie sich über 4 QORT an Ihre Adresse. Dies kann mit Trades im Handelsportal oder über einen anderen Qortian erfolgen, der Ihnen die QORT gibt. Sobald Sie über 4 QORT in Ihrem Konto haben, werden Q-Chat-Nachrichten sofort gesendet und dieser Dialog wird nicht mehr angezeigt Show. Vielen Dank für Ihr Verständnis für diese notwendige Spam-Präventionsmethode, und wir hoffen, dass Ihnen Qortal gefällt!",
|
||||
"cchange43": "Tipp QORT an",
|
||||
"cchange44": "NACHRICHT SENDEN",
|
||||
"cchange45": "TIPP BENUTZER",
|
||||
"cchange45": "TIP BENUTZER",
|
||||
"cchange46": "Trinkgeldbetrag",
|
||||
"cchange47": "Verfügbares Guthaben",
|
||||
"cchange48": "QORT-Guthaben konnte nicht abgerufen werden. Versuchen Sie es erneut!",
|
||||
@ -825,7 +804,7 @@
|
||||
"cchange56": "Transaktion fehlgeschlagen!",
|
||||
"cchange57": "Benutzerinfo",
|
||||
"cchange58": "NACHRICHT SENDEN",
|
||||
"cchange59": "TIPP BENUTZER",
|
||||
"cchange59": "TIP BENUTZER",
|
||||
"cchange60": "Gruppeneinladungen ausstehend",
|
||||
"cchange61": "Fehler beim Abrufen von Gruppeneinladungen. Bitte versuchen Sie es erneut!",
|
||||
"cchange62": "Falscher Benutzername und falsche Adresse eingegeben! Bitte versuchen Sie es erneut!",
|
||||
@ -842,37 +821,13 @@
|
||||
"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 10 MB",
|
||||
"cchange77": "Größe des Anhangs überschreitet 1 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",
|
||||
"cchange81": "Dieser Bildtyp wird nicht unterstützt",
|
||||
"cchange82": "Dieser Anhang wurde gelöscht",
|
||||
"cchange90": "Keine Nachrichten",
|
||||
"cchange91": "Senden...",
|
||||
"cchange92": "Ungelesene Nachrichten unten",
|
||||
"cchange93": "Bild in die Zwischenablage kopiert",
|
||||
"cchange94": "geladen",
|
||||
"cchange95": "Nur meine Ressourcen",
|
||||
"cchange96": "Gruppenverwaltung öffnen",
|
||||
"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 …"
|
||||
"cchange90": "Keine Nachrichten"
|
||||
},
|
||||
"welcomepage": {
|
||||
"wcchange1": "Willkommen zu Q-Chat",
|
||||
@ -944,7 +899,7 @@
|
||||
"gchange36": "Verlasse",
|
||||
"gchange37": "Gruppe verlassen",
|
||||
"gchange38": "Gruppenbesitzer verwalten:",
|
||||
"gchange39": "Gruppenadministrator verwalten:",
|
||||
"gchange39": "Gruppenadministrator verwalten::",
|
||||
"gchange40": "Gruppe verwalten",
|
||||
"gchange41": "Gruppenerstellung erfolgreich!",
|
||||
"gchange42": "Ungültiger Gruppenname",
|
||||
@ -964,19 +919,7 @@
|
||||
"gchange56": "Zu suchender Gruppenname",
|
||||
"gchange57": "Privater Gruppenname nicht gefunden",
|
||||
"gchange58": "Beachten Sie, dass der Gruppenname genau übereinstimmen muss.",
|
||||
"gchange59": "Ticker ein-/ausblenden",
|
||||
"gchange60": "Bitte geben Sie den Gruppennamen ein",
|
||||
"gchange61": "Bitte Beschreibung eingeben",
|
||||
"gchange62": "Sind Sie sicher, dass Sie diese Gruppe AKTUALISIEREN möchten?",
|
||||
"gchange63": "Wenn Sie auf CONFIRM klicken, wird die UPDATE_GROUP Anfrage gesendet!",
|
||||
"gchange64": "Derzeitiger Besitzer / Neuer Besitzer",
|
||||
"gchange65": "Ersetzen Sie diese Adresse durch EIGENTUM der Gruppe übertragen!",
|
||||
"gchange66": "Ungültige Besitzer-/neue Besitzeradresse",
|
||||
"gchange67": "Gruppen-UPDATE erfolgreich!",
|
||||
"gchange68": "Gruppen-Avatar festlegen",
|
||||
"gchange69": "Nachrichten",
|
||||
"gchange70": "Keine Nachrichten in den letzten 24 Stunden!",
|
||||
"gchange71": "Du bist dieser Gruppe bereits beigetreten!"
|
||||
"gchange59": "Ticker ein-/ausblenden"
|
||||
},
|
||||
"puzzlepage": {
|
||||
"pchange1": "Rätsel",
|
||||
@ -1004,9 +947,9 @@
|
||||
"nchange4": "Prägekonto hinzufügen",
|
||||
"nchange5": "Wenn Sie mit Ihrem eigenen Konto prägen möchten, müssen Sie eine Rewardshare-Transaktion für sich selbst erstellen (wobei der Rewardshare-Prozentsatz auf 0 gesetzt ist) und dann mit dem Rewardshare-Schlüssel prägen, den Ihnen zugeteilt wird.",
|
||||
"nchange6": "Belohnungsschlüssel",
|
||||
"nchange7": "Minting-Konto hinzufügen",
|
||||
"nchange7": "Adding minting account",
|
||||
"nchange8": "Hinzufügen",
|
||||
"nchange9": "Minting-Konto",
|
||||
"nchange9": "Minting-Konto hinzufügen",
|
||||
"nchange10": "Empfängerkonto",
|
||||
"nchange11": "Aktion",
|
||||
"nchange12": "Entfernen",
|
||||
@ -1031,16 +974,7 @@
|
||||
"nchange31": "Knoten stoppen",
|
||||
"nchange32": "Stoppanforderung erfolgreich gesendet!",
|
||||
"nchange33": "Knoten neu starten",
|
||||
"nchange34": "Neustartanforderung erfolgreich gesendet!",
|
||||
"nchange35": "Startknoten",
|
||||
"nchange36": "Knoten erfolgreich gestartet!",
|
||||
"nchange37": "Wenn Sie auf Weiter klicken, wird Ihr Qortal Core aktualisiert, Ihre Datenbank wird entfernt und Sie laden eine neue Kopie der Datenbank herunter, genannt „Bootstrapping“.",
|
||||
"nchange38": "LTC-Wallet reparieren",
|
||||
"nchange39": "Dadurch werden LTC-Geldbörsen repariert, deren Guthaben nicht ausgegeben werden kann. Dazu muss eine einzige Transaktion im Litecoin-Netzwerk durchgeführt werden. Nach der Bestätigung ist das Guthaben der Geldbörse funktionsfähig und das Problem wird nicht erneut auftreten.",
|
||||
"nchange40": "Für diese Transaktion fällt eine geringe LTC-Gebühr an. Fortfahren?",
|
||||
"nchange41": "Reparaturversuch. Bitte warten…",
|
||||
"nchange42": "LTC-Wallet erfolgreich repariert!",
|
||||
"nchange43": "Beim Versuch, die LTC-Wallet zu reparieren, ist ein Fehler aufgetreten. Bitte versuchen Sie es erneut!"
|
||||
"nchange34": "Neustartanforderung erfolgreich gesendet!"
|
||||
},
|
||||
"transpage": {
|
||||
"tchange1": "Transaktionsanfrage",
|
||||
@ -1052,7 +986,7 @@
|
||||
"apipage": {
|
||||
"achange1": "Füge API-Schlüssel hinzu",
|
||||
"achange2": "API-Schlüssel",
|
||||
"achange3": "Bitte geben Sie den API-Schlüssel für diesen Knoten ein. Es kann in einer Datei namens „apikey.txt“ in dem Verzeichnis gefunden werden, in dem der Kern installiert ist. Klicken Sie alternativ auf Abbrechen, um den Kern mit eingeschränkter Funktionalität zu verwenden.",
|
||||
"achange3": "Bitte geben Sie den API-Schlüssel für diesen Knoten ein. Es kann in einer Datei namens “apikey.txt“ in dem Verzeichnis gefunden werden, in dem der Kern installiert ist. Klicken Sie alternativ auf Abbrechen, um den Kern mit eingeschränkter Funktionalität zu verwenden.",
|
||||
"achange4": "Abbrechen",
|
||||
"achange5": "Hinzufügen",
|
||||
"achange6": "API-Schlüssel erfolgreich hinzugefügt",
|
||||
@ -1073,18 +1007,9 @@
|
||||
"rewarddialog1": "Möchten Sie eine Reward-Share-Transaktion erstellen und",
|
||||
"rewarddialog2": "Ihrer Prägeprämien teilen mit",
|
||||
"rewarddialog3": "Wenn ja, müssen Sie den Schlüssel unten speichern, um zu prägen. Es kann an jeden Knoten geliefert werden, damit es in Ihrem Namen prägen kann.",
|
||||
"rewarddialog4": "Wenn Sie auf Bestätigen drücken, wird der Belohnungsanteil erstellt, aber Sie müssen den oben genannten Schlüssel trotzdem an einen Knoten übermitteln, um mit dem Konto zu prägen.",
|
||||
"rewarddialog4": "Wenn Sie auf „Bestätigen“ drücken, wird der Belohnungsanteil erstellt, aber Sie müssen den oben genannten Schlüssel trotzdem an einen Knoten übermitteln, um mit dem Konto zu prägen.",
|
||||
"rewarddialog5": "Sie entfernen eine Prämienaktientransaktion, die mit dem Konto verknüpft ist:",
|
||||
"rewarddialog6": "Wenn Sie auf Bestätigen drücken, wird die Prämie entfernt und der Prägeschlüssel wird ungültig.",
|
||||
"deployAtdialog1": "Sie stellen das AT bereit",
|
||||
"deployAtdialog2": "Wenn Sie auf Bestätigen drücken, wird das AT bereitgestellt!",
|
||||
"deployAtdialog3": "Anfänglicher Betragssaldo",
|
||||
"votedialog1": "Sie beantragen, bei der folgenden Umfrage abzustimmen:",
|
||||
"votedialog2": "Wenn Sie auf Bestätigen drücken, wird die Abstimmungsanfrage gesendet!",
|
||||
"votedialog3": "Sie beantragen die Erstellung der folgenden Umfrage:",
|
||||
"votedialog4": "Umfragebeschreibung",
|
||||
"votedialog5": "Optionen",
|
||||
"votedialog6": "Wenn Sie auf Bestätigen drücken, wird die Umfrage erstellt!"
|
||||
"rewarddialog6": "Wenn Sie auf „Bestätigen“ klicken, wird die Prämie entfernt und der Prägeschlüssel wird ungültig."
|
||||
},
|
||||
"sponsorshipspage": {
|
||||
"schange1": "Aktive Patenschaften",
|
||||
@ -1203,7 +1128,7 @@
|
||||
"inf3": "Dies ist ein Markt zum KAUFEN von QORT",
|
||||
"inf4": "- 'Offenmarktverkäufe' sind QORT-VERKAUFSAUFTRÄGE.",
|
||||
"inf5": "Sie können jeweils nur EINE Bestellung kaufen, klicken Sie einfach auf eine Bestellung, mit der Sie kaufen möchten",
|
||||
"inf6": "und es wird das Kästchen „QORT KAUFEN“ mit den Details ausfüllen, dann klicke auf KAUFEN.",
|
||||
"inf6": "und es wird das Kästchen „QORT KAUFEN' mit den Details ausfüllen, dann klicke auf KAUFEN.",
|
||||
"inf7": "Informationen zum automatischen Kauf",
|
||||
"inf8": "Automatische Kaufinfo schließen",
|
||||
"inf9": "'Automatischer' Kauf ist eine Funktion, die es ermöglicht, 'Kaufaufträge' auf dem Handelsportal zu platzieren. Diese 'Kaufaufträge' sind nur für die Person sichtbar, die sie aufgegeben hat. Es sind keine 'öffentlichen' Kaufaufträge wie die 'Offenmarktverkäufe' sind und werden NICHT in der Qortal-Blockchain gespeichert. Auto Buy ist eine UI-Funktion und erfordert als solche, dass die UI LÄUFT.",
|
||||
@ -1215,9 +1140,7 @@
|
||||
"inf15": "Aktive automatische Kaufaufträge",
|
||||
"inf16": "Automatischer Kauf",
|
||||
"inf17": "Zum hellen Thema wechseln",
|
||||
"inf18": "Zum dunklen Thema wechseln",
|
||||
"inf19": "Handelsinformationen",
|
||||
"inf20": "Käufer"
|
||||
"inf18": "Zum dunklen Thema wechseln"
|
||||
},
|
||||
"lotterypage": {
|
||||
"lot1": "Offene Qortal-Lotterien",
|
||||
@ -1233,101 +1156,5 @@
|
||||
"lot11": "Es gibt keine offenen Lotterien!",
|
||||
"lot12": "Es gibt keine fertigen Lotterien!",
|
||||
"lot13": "Teilnehmer"
|
||||
},
|
||||
"notifications": {
|
||||
"notify1": "Transaktion wird bestätigt",
|
||||
"notify2": "Transaktion bestätigt",
|
||||
"explanation": "Ihre Transaktion wird bestätigt. Um den Fortschritt zu verfolgen, klicken Sie auf das Glockensymbol.",
|
||||
"status1": "Vollständig synchronisiert",
|
||||
"status2": "Nicht synchronisiert",
|
||||
"notify3": "Keine Benachrichtigungen",
|
||||
"notify4": "Tx-Benachrichtigungen"
|
||||
},
|
||||
"friends": {
|
||||
"friend1": "Namen hinzufügen",
|
||||
"friend2": "Freund hinzufügen",
|
||||
"friend3": "Durch das Hinzufügen eines Freundes können Sie problemlos mit dieser Person in Kontakt treten. Achten Sie darauf, diesem Benutzer auch zu folgen, um das Hosting seiner veröffentlichten Ressourcen zu unterstützen.",
|
||||
"friend4": "Anmerkungen",
|
||||
"friend5": "Folgen Sie dem Namen",
|
||||
"friend6": "Alias",
|
||||
"friend7": "Fügen Sie einen Alias hinzu, um sich besser an Ihren Freund zu erinnern (optional)",
|
||||
"friend8": "Senden Sie Q-Chat",
|
||||
"friend9": "Q-Mail senden",
|
||||
"friend10": "Freund bearbeiten",
|
||||
"friend11": "Nachfolgend",
|
||||
"friend12": "Freunde",
|
||||
"friend13": "Füttern",
|
||||
"friend14": "Freund entfernen",
|
||||
"friend15": "Feed-Einstellungen",
|
||||
"friend16": "Wählen Sie die Q-Apps aus, von denen Sie Updates erhalten möchten, insbesondere diejenigen, die sich auf Ihre Freunde beziehen.",
|
||||
"friend17": "Keine Artikel in Ihrem Feed"
|
||||
},
|
||||
"save": {
|
||||
"saving1": "Gespeicherte Einstellungen können nicht abgerufen werden",
|
||||
"saving2": "Nichts zu speichern",
|
||||
"saving3": "Speichern Sie nicht gespeicherte Änderungen",
|
||||
"saving4": "Veränderungen rückgängig machen"
|
||||
},
|
||||
"profile": {
|
||||
"profile1": "Sie haben keinen Namen",
|
||||
"profile2": "Gehe zur Namensregistrierung",
|
||||
"profile3": "Profil aktualisieren",
|
||||
"profile4": "Slogan",
|
||||
"profile5": "Bio",
|
||||
"profile6": "Wallet-Adressen",
|
||||
"profile7": "Von der Benutzeroberfläche ausfüllen",
|
||||
"profile8": "Benutzerdefinierte Eigenschaft hinzufügen",
|
||||
"profile9": "Eigenschaftsname",
|
||||
"profile10": "Felder",
|
||||
"profile11": "Feld hinzufügen",
|
||||
"profile12": "Feldname",
|
||||
"profile13": "Feldwert",
|
||||
"profile14": "Aktivität",
|
||||
"profile15": "Kein Wert",
|
||||
"profile16": "Dieser Name hat kein Profil",
|
||||
"profile17": "Profil konnte nicht abgerufen werden",
|
||||
"profile18": "Profil öffnen",
|
||||
"profile19": "Profil kann nicht abgerufen werden",
|
||||
"profile20": "Name registrieren",
|
||||
"profile21": "Adresse aus der Benutzeroberfläche einfügen",
|
||||
"profile22": "Erfolg",
|
||||
"profile23": "verschlüsselt",
|
||||
"profile24": "Sie müssen sowohl den Feldnamen als auch den Feldwert ausfüllen, um eine benutzerdefinierte Eigenschaft hinzuzufügen",
|
||||
"profile25": "Ist dein Freund",
|
||||
"profile26": "Als Freund hinzufügen"
|
||||
},
|
||||
"tour": {
|
||||
"tour1": "Um Qortal nutzen zu können, muss der Core synchronisiert sein. Dieses Symbol wird blau angezeigt, wenn es synchronisiert ist.",
|
||||
"tour2": "Synchronisiert",
|
||||
"tour3": "Synchronisiert und prägt",
|
||||
"tour4": "Synchronisierung",
|
||||
"tour5": "Synchronisiere deinen Kern",
|
||||
"tour6": "Die unaufhaltsame Kraft von Qortal",
|
||||
"tour7": "Nur Sie kontrollieren Ihre Daten auf Qortal",
|
||||
"tour8": "Qortal kann nicht entfernt werden",
|
||||
"tour9": "Vollständig Peer-to-Peer ohne zentrale Vermittler",
|
||||
"tour10": "Dies ist die Standard-Tab-Ansicht, in der Sie auf wichtige Qortal-Einstellungen und Q-Apps wie Q-Tube zugreifen können.",
|
||||
"tour11": "Holen Sie sich das volle Erlebnis",
|
||||
"tour12": "Um das volle Qortal-Erlebnis zu erhalten, empfehlen wir, diese Checkliste zu befolgen.",
|
||||
"tour13": "Sie sind vollständig synchronisiert! Sie können jetzt die Leistungsfähigkeit der Qortal-Blockchain erleben.",
|
||||
"tour14": "Lass uns versuchen, Q-Tube zu besuchen!",
|
||||
"tour15": "Besuchen Sie Q-Tube",
|
||||
"tour16": "Checkliste",
|
||||
"tour17": "Bitte starten Sie den Core, um auf die Qortal-Blockchain zuzugreifen.",
|
||||
"tour18": "Aktualisieren (Bootstrap)",
|
||||
"tour19": "Derzeit wird synchronisiert... Sie müssen vollständig synchronisiert sein, um Qortal verwenden zu können",
|
||||
"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"
|
||||
}
|
||||
}
|
||||
}
|
@ -5,10 +5,8 @@
|
||||
"chinese1": "Chino (Simplificado)",
|
||||
"chinese2": "Chino (Tradicional)",
|
||||
"croatian": "Croata",
|
||||
"dutch": "Holandés",
|
||||
"english": "Inglés",
|
||||
"estonian": "Estonio",
|
||||
"finnish": "Finlandés",
|
||||
"french": "Francés",
|
||||
"german": "Alemán",
|
||||
"hindi": "Hindi",
|
||||
@ -80,7 +78,7 @@
|
||||
"tm32": "Esta cuenta no sigue a ningún usuario",
|
||||
"tm33": "Menú de pestaña Importar",
|
||||
"tm34": "Menú de pestaña Exportar",
|
||||
"tm35": "Su menú de pestañas existente se eliminará y se configurará como menú de pestañas importado.",
|
||||
"tm35": "Tu menú de pestañas existente se eliminará y se establecerá en el menú de pestañas cargado.",
|
||||
"tm36": "Menú de pestañas restaurado con éxito",
|
||||
"tm37": "Menú de pestañas guardado correctamente como",
|
||||
"tm38": "MODO DEV",
|
||||
@ -103,38 +101,38 @@
|
||||
"seed": "Frasesemilla",
|
||||
"seedphrase": "frasesemilla",
|
||||
"saved": "Cuenta guardada",
|
||||
"qora": "Frase semilla de la dirección QORA",
|
||||
"backup": "Archivo de copia de seguridad Qortal",
|
||||
"decrypt": "Descifrar archivo de copia de seguridad",
|
||||
"qora": "Frase semilla de la dirección Qora",
|
||||
"backup": "Copia de seguridad del monedero Qortal",
|
||||
"decrypt": "Descifrar copia de seguridad",
|
||||
"save": "Guardar en este navegador.",
|
||||
"prepare": "Preparando tu cuenta...",
|
||||
"areyousure": "¿Está seguro de que desea eliminar esta billetera de las billeteras guardadas? (Si se elimina y no existe un archivo de respaldo, la cuenta podría perderse para siempre. ¡Asegúrese de tener un archivo de respaldo antes de hacer esto!)",
|
||||
"prepare": "Preparando tu cuenta",
|
||||
"areyousure": "¿Está seguro que desea eliminar este monedero de los monederos guardados?",
|
||||
"error1": "La copia de seguridad tiene que ser un JSON válido",
|
||||
"error2": "Opción de inicio de sesión no seleccionada",
|
||||
"createwelcome": "¡Bienvenidos a Qortal! ¡Tu futuro digital descentralizado te espera! En Qortal sólo tú tienes control absoluto sobre tus datos. Qortal proporciona el nivel básico de un mundo digital nuevo y totalmente controlado por el usuario.",
|
||||
"createwelcome": "Bienvenido a Qortal, encontrarás que es similar a un juego de rol, usted, como minero en la red Qortal (si decide convertirse en uno) tendrá la oportunidad de subir de nivel su cuenta, dándole más de la recompensa del bloque QORT y también una mayor influencia sobre la red en términos de votación sobre las decisiones en la plataforma.",
|
||||
"createa": "A",
|
||||
"click": "Haz clic para ver la frasesemilla",
|
||||
"confirmpass": "Confirmar Contraseña",
|
||||
"willbe": "se generará aleatoriamente en segundo plano. Si desea VER la frase inicial, haga clic en la 'frase inicial' resaltada en este texto. Esto se utiliza como su generador de clave privada para su cuenta blockchain en Qortal. Por seguridad, de forma predeterminada, las frases iniciales no se muestran a menos que se elijan específicamente para ello.",
|
||||
"willbe": "Se generará aleatoriamente en segundo plano. Esto se utiliza como su generador de clave privada para su cuenta de blockchain en Qortal.",
|
||||
"clicknext": "Crea tu cuenta Qortal haciendo clic en SIGUIENTE a continuación",
|
||||
"ready": "Su cuenta ahora está lista para ser creada. Se guardará dentro de esta copia de la interfaz de usuario de Qortal de forma predeterminada, en forma cifrada. Si no desea que su nueva cuenta se guarde aquí, puede desmarcar la casilla a continuación. Aún podrá iniciar sesión con su nueva cuenta (después de cerrar sesión), utilizando el archivo de respaldo de su billetera que DEBE descargar una vez que cree su cuenta.",
|
||||
"ready": "Su cuenta está lista para ser creada. Será guardada en este navegador. Si no quiere que su nueva cuenta sea guardada en el navegador, puede desmarcar la casilla de abajo. Podrá seguir accediendo con su nueva cuenta (después de cerrar la sesión), utilizando el archivo de copia de seguridad de su monedero que DEBE descargar una vez que haya creado su cuenta.",
|
||||
"welmessage": "Bienvenido a Qortal",
|
||||
"pleaseenter": "Por favor, introduzca una Contraseña!",
|
||||
"notmatch": "¡Ups! ¡Las contraseñas no coinciden! ¡Intentar otra vez!",
|
||||
"lessthen8": "Su contraseña tiene menos de 5 caracteres! Esto no es recomendable. Puede continuar para ignorar esta advertencia.",
|
||||
"lessthen8-2": "Su contraseña tiene menos de 5 caracteres!",
|
||||
"entername": "¡Ingrese un nombre para mostrar!",
|
||||
"downloaded": "¡Se guardó su archivo de copia de seguridad de Wallet!",
|
||||
"notmatch": "Las contraseñas no coinciden!",
|
||||
"lessthen8": "Su contraseña tiene menos de 8 caracteres! Esto no es recomendable. Puede continuar para ignorar esta advertencia.",
|
||||
"lessthen8-2": "Su contraseña tiene menos de 8 caracteres!",
|
||||
"entername": "Por favor, introduzca un Nombre!",
|
||||
"downloaded": "La copia de seguridad de su monedero ha sido descargada!",
|
||||
"loading": "Cargando, Por favor espere...",
|
||||
"createdseed": "Su Frasesemilla creada:",
|
||||
"createdseed": "Su Frasesemilla creada",
|
||||
"saveseed": "Guardar Frasesemilla",
|
||||
"savein": "Guardar en esta UI",
|
||||
"savein": "Guardar en el navegador",
|
||||
"backup2": "Este archivo es la ÚNICA manera de acceder a su cuenta en un sistema que no lo tenga guardado en la aplicación/navegador. ASEGÚRATE DE HACER UNA COPIA DE SEGURIDAD DE ESTE ARCHIVO EN VARIOS LUGARES. El archivo está encriptado de forma muy segura y descifrado con su contraseña local que creó en el paso anterior. Puedes guardarlo en cualquier lugar de forma segura, pero asegúrate de hacerlo en múltiples lugares.",
|
||||
"savewallet": "Guardar archivo de copia de seguridad del monedero",
|
||||
"created1": "Su cuenta ha sido creada",
|
||||
"created2": " y guardado en esta interfaz de usuario en forma cifrada.",
|
||||
"downloadbackup": "Guardar archivo de respaldo de Wallet",
|
||||
"passwordhint": "Una contraseña debe tener al menos 5 caracteres.",
|
||||
"created2": " y será guardada en el navegador.",
|
||||
"downloadbackup": "Descargar archivo de copia de seguridad del monedero",
|
||||
"passwordhint": "Una contraseña debe tener al menos 8 caracteres.",
|
||||
"lp1": "Pantalla de bloqueo",
|
||||
"lp2": "¡No se estableció una contraseña de pantalla de bloqueo!",
|
||||
"lp3": "Establece uno",
|
||||
@ -163,8 +161,8 @@
|
||||
"confirmlogout": "¿Está seguro que desea cerrar sesión?"
|
||||
},
|
||||
"fragfile": {
|
||||
"selectfile": "Seleccionar archivo de respaldo",
|
||||
"dragfile": "Arrastre y suelte o haga clic aquí para seleccionar el archivo de respaldo"
|
||||
"selectfile": "Seleccione un archivo",
|
||||
"dragfile": "Arrastra y suelta la copia de seguridad aquí"
|
||||
},
|
||||
"settings": {
|
||||
"generalinfo": "Información General de la Cuenta",
|
||||
@ -181,19 +179,20 @@
|
||||
"notifications": "Notificaciones",
|
||||
"accountsecurity": "Seguridad de la Cuenta",
|
||||
"password": "Contraseña",
|
||||
"download": "Exportar/guardar archivo de copia de seguridad",
|
||||
"choose": "Elija una contraseña para cifrar su archivo de copia de seguridad. (Este puede ser el mismo con el que inició sesión o uno nuevo).",
|
||||
"download": "Descargar copia de seguridad",
|
||||
"choose": "Por favor, elija una contraseña para cifrar su copia de seguridad. (Puede ser la misma con la que ha iniciado la sesión, o diferente)",
|
||||
"block": "Bloquear Notificaciones (próximamente...)",
|
||||
"playsound": "Reproducir Sonido",
|
||||
"shownotifications": "Mostrar Notificaciones",
|
||||
"nodeurl": "URL del Nodo",
|
||||
"nodehint": "Seleccione un nodo de la lista predeterminada o agregue un nodo personalizado a la lista haciendo clic en el botón a continuación",
|
||||
"nodehint": "Seleccione un nodo de la lista predeterminada de nodos de arriba o añada un nodo personalizado a la lista de arriba haciendo clic en el botón de abajo",
|
||||
"addcustomnode": "Añadir un Nodo Personalizado",
|
||||
"addandsave": "Añadir Y Guardar",
|
||||
"protocol": "Protocolo",
|
||||
"domain": "Dominio",
|
||||
"port": "Puerto",
|
||||
"import": "Importar nodos guardados",
|
||||
"export": "Exportar Nodos guardados",
|
||||
"import": "Importar Nodos",
|
||||
"export": "Exportar Nodos",
|
||||
"deletecustomnode": "Eliminar todos los nodos personalizados",
|
||||
"warning": "Sus nodos existentes se eliminarán y se crearán nuevos a partir de la copia de seguridad.",
|
||||
"snack1": "Nodos estándar eliminados y agregados con éxito",
|
||||
@ -201,20 +200,12 @@
|
||||
"snack3": "Nodo personalizado agregado y guardado con éxito",
|
||||
"snack4": "Nodos guardados con éxito como",
|
||||
"snack5": "Nodos importados con éxito",
|
||||
"snack6": "Nodo personalizado eliminado exitosamente",
|
||||
"snack7": "Nodo personalizado editado con éxito",
|
||||
"exp1": "Exportar clave privada maestra (xpriv)",
|
||||
"exp1": "Exportar clave maestra privada",
|
||||
"exp2": "Exportar clave maestra",
|
||||
"exp3": "Exportar",
|
||||
"exp4": "Elija una billetera para hacer una copia de seguridad de la clave privada maestra.",
|
||||
"core": "Configuración principal de inicio automático",
|
||||
"qappNotification1": "Notificaciones de Q-App",
|
||||
"selectnode": "Por favor seleccione una opción",
|
||||
"arrr1": "¡Cartera ARRR no inicializada!",
|
||||
"arrr2": "Vaya a la pestaña de billetera y acceda a la billetera ARRR para inicializar la billetera primero.",
|
||||
"arrr3": "¡Necesita actualización principal!",
|
||||
"arrr4": "¡Para guardar la clave privada de su billetera ARRR, primero debe actualizar Qortal Core!",
|
||||
"sync_indicator": "Desactivar la ventana emergente del indicador de sincronización"
|
||||
"exp4": "Elija una billetera para hacer una copia de seguridad de la clave maestra privada.",
|
||||
"core": "Iniciar configuración básica",
|
||||
"qappNotification1": "Notificaciones de Q-App"
|
||||
},
|
||||
"appinfo": {
|
||||
"blockheight": "Altura del Bloque",
|
||||
@ -248,9 +239,7 @@
|
||||
"balance": "Saldo",
|
||||
"balances": "LOS SALDOS DE TU BILLETERA",
|
||||
"update": "ACTUALIZAR SALDOS DE CARTERA",
|
||||
"view": "Vista",
|
||||
"all": "Todo",
|
||||
"page": "Página"
|
||||
"view": "Vista"
|
||||
},
|
||||
"gifs": {
|
||||
"gchange1": "Explorador de gifs",
|
||||
@ -285,15 +274,15 @@
|
||||
},
|
||||
"startminting": {
|
||||
"smchange1": "No se pueden obtener cuentas de acuñación",
|
||||
"smchange2": "No se pudo eliminar la clave de acuñación",
|
||||
"smchange3": "No se pudo agregar la clave de acuñación. Si la clave se acaba de crear, intente esperar unos bloques y agregarla nuevamente.",
|
||||
"smchange2": "No se pudo quitar la clave",
|
||||
"smchange3": "No se pudo agregar la clave de acuñación",
|
||||
"smchange4": "No se puede crear la clave de patrocinio",
|
||||
"smchange5": "Creando relación",
|
||||
"smchange6": "En espera de confirmación en blockchain",
|
||||
"smchange7": "Terminando la relación",
|
||||
"smchange8": "Agregar clave de acuñación al nodo",
|
||||
"smchange9": "Completo",
|
||||
"smchange10": "Solo se permiten 2 claves de acuñación por nodo. Está intentando asignar 3 claves. Vaya a Administración de nodos y elimine las claves innecesarias. ¡Gracias!"
|
||||
"smchange10": "Solo se permiten 2 claves de acuñación por nodo, está intentando asignar 3 claves, vaya a administración - administración de nodos y elimine la clave que no desea asignar a este nodo, gracias!"
|
||||
},
|
||||
"mintingpage": {
|
||||
"mchange1": "Detalles Generales de Acuñación",
|
||||
@ -405,8 +394,7 @@
|
||||
"wchange55": "Su libreta de direcciones existente se eliminará y se creará una nueva copia de seguridad.",
|
||||
"wchange56": "ADVERTENCIA!",
|
||||
"wchange57": "Memorándum",
|
||||
"wchange58": "Nueva Dirección",
|
||||
"wchange59": "Moneda"
|
||||
"wchange58": "Nueva Dirección"
|
||||
},
|
||||
"tradepage": {
|
||||
"tchange1": "Portal de Comercio",
|
||||
@ -468,10 +456,10 @@
|
||||
"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 de 1 a 4 pueden crear una Self Share y los niveles 5 o superior pueden crear una Reward Share!",
|
||||
"rchange10": "Clave pública del receptor",
|
||||
"rchange11": "Porcentaje de Reward share",
|
||||
"rchange12": "Ejecutando el comando solicitado",
|
||||
"rchange12": "Haciendo algo delicioso",
|
||||
"rchange13": "Añadir cuenta de acuñación",
|
||||
"rchange14": "Añadir",
|
||||
"rchange15": "La cuenta no participa en ninguna reward share",
|
||||
@ -509,12 +497,12 @@
|
||||
"nchange23": "Precio de venta",
|
||||
"nchange24": "No hay nombres para vender",
|
||||
"nchange25": "Nombre para vender",
|
||||
"nchange26": "¿Estás seguro de que quieres vender este nombre? Si otra cuenta compra el nombre, ¡estará fuera de su control!",
|
||||
"nchange26": "¿Estás seguro de vender este nombre?",
|
||||
"nchange27": "Por este precio en QORT",
|
||||
"nchange28": "¡Al presionar confirmar, su nombre aparecerá a la venta!",
|
||||
"nchange28": "¡Al presionar confirmar, se enviará la solicitud de nombre de venta!",
|
||||
"nchange29": "Nombre para cancelar",
|
||||
"nchange30": "¿Está seguro de cancelar la venta de este nombre?",
|
||||
"nchange31": "¡Al presionar confirmar, la venta del nombre será cancelada!",
|
||||
"nchange31": "¡Al presionar confirmar, se enviará la solicitud de cancelación de nombre de venta!",
|
||||
"nchange32": "¡Solicitud de nombre de venta exitosa!",
|
||||
"nchange33": "¡Cancelar solicitud de venta de nombre exitosa!",
|
||||
"nchange34": "¡Solicitud de nombre de compra exitosa!",
|
||||
@ -530,8 +518,7 @@
|
||||
"nchange44": "Al nuevo nombre",
|
||||
"nchange45": "¡Al presionar confirmar, se enviará la solicitud de actualización de nombre!",
|
||||
"nchange46": "Historial de venta de nombres",
|
||||
"nchange47": "¡Actualización de nombre exitosa!",
|
||||
"nchange48": "¡Advertencia! Si actualiza su nombre, perderá los recursos asociados con el nombre original. En otras palabras, perderá la propiedad del contenido bajo el nombre original en el QDN. ¡Proceda con precaución!"
|
||||
"nchange47": "¡Actualización de nombre exitosa!"
|
||||
},
|
||||
"websitespage": {
|
||||
"schange1": "Navegar sitios web",
|
||||
@ -551,7 +538,7 @@
|
||||
"schange15": "Sitios web bloqueados",
|
||||
"schange16": "No ha bloqueado ningún sitio web",
|
||||
"schange17": "Nombre no encontrado!",
|
||||
"schange18": "El modo de retransmisión está habilitado (relayModeEnabled: true). Esto significa que su nodo ayudará a transportar datos CIFRADOS/CHUNKED por la red cuando un par lo solicite. Puede optar por no participar configurando",
|
||||
"schange18": "El modo de retransmisión está activado. Esto significa que tu nodo ayudará a transportar datos encriptados por la red cuando un par lo solicite. Puedes optar por no hacerlo configurando",
|
||||
"schange19": "en",
|
||||
"schange20": "El modo de retransmisión está desactivado. Puede activarlo configurando",
|
||||
"schange21": "Publicar Sitio Web",
|
||||
@ -588,7 +575,7 @@
|
||||
"schange15": "Q-Apps bloqueadas",
|
||||
"schange16": "No has bloqueado ninguna Q-Apps",
|
||||
"schange17": "¡No se encontró el nombre!",
|
||||
"schange18": "El modo de retransmisión está habilitado. Esto significa que su nodo ayudará a transportar datos CIFRADOS/CHUNKED por la red cuando un par lo solicite. Puede optar por no participar configurando",
|
||||
"schange18": "El modo de retransmisión está habilitado. Esto significa que su nodo ayudará a transportar datos cifrados por la red cuando un par lo solicite. Puede optar por no hacerlo configurando",
|
||||
"schange19": "en",
|
||||
"schange20": "El modo de relé está deshabilitado. Puedes habilitarlo configurando",
|
||||
"schange21": "Publicar Q-App",
|
||||
@ -612,8 +599,7 @@
|
||||
"schange39": "Abrir",
|
||||
"schange40": "Vista previa",
|
||||
"schange41": "Descargando por favor espere...",
|
||||
"schange42": "Archivos descargados",
|
||||
"schange43": "Cualquier intento de descarga continuará en segundo plano; inténtelo de nuevo después de un tiempo."
|
||||
"schange42": "Archivos descargados"
|
||||
},
|
||||
"tubespage": {
|
||||
"schange1": "Explorar Q-Tubes",
|
||||
@ -735,14 +721,7 @@
|
||||
"bchange44": "¿Le das permiso a esta aplicación para eliminar de esta lista?",
|
||||
"bchange45": "Cifrar",
|
||||
"bchange46": "¿Le das permiso a esta aplicación para guardar el siguiente archivo?",
|
||||
"bchange47": "Publicación instantánea - requiere",
|
||||
"bchange48": "¿Le das permiso a esta aplicación para enviarte notificaciones?",
|
||||
"bchange49": "¿Le das permiso a esta aplicación para obtener la información de tu billetera?",
|
||||
"bchange50": "Esta aplicación ha solicitado un cambio en tu perfil público. Propiedad: ",
|
||||
"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?"
|
||||
"bchange47": "Publicación instantánea - requiere"
|
||||
},
|
||||
"datapage": {
|
||||
"dchange1": "Gestión de datos",
|
||||
@ -842,37 +821,13 @@
|
||||
"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 10 MB",
|
||||
"cchange77": "El tamaño del archivo adjunto supera 1 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",
|
||||
"cchange81": "Este tipo de imagen no es compatible",
|
||||
"cchange82": "Este archivo adjunto ha sido eliminado",
|
||||
"cchange90": "Sin mensajes",
|
||||
"cchange91": "Enviando...",
|
||||
"cchange92": "Mensajes no leídos a continuación",
|
||||
"cchange93": "Imagen copiada al portapapeles",
|
||||
"cchange94": "cargado",
|
||||
"cchange95": "Sólo mis recursos",
|
||||
"cchange96": "Gestión de grupos abiertos",
|
||||
"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 ..."
|
||||
"cchange90": "Sin mensajes"
|
||||
},
|
||||
"welcomepage": {
|
||||
"wcchange1": "Bienvenido al Q-Chat",
|
||||
@ -964,19 +919,7 @@
|
||||
"gchange56": "Nombre del grupo a buscar",
|
||||
"gchange57": "Nombre de grupo privado no encontrado",
|
||||
"gchange58": "Tenga en cuenta que el nombre del grupo debe coincidir exactamente.",
|
||||
"gchange59": "Mostrar/ocultar teletipo",
|
||||
"gchange60": "Por favor, introduzca el nombre del grupo",
|
||||
"gchange61": "Por favor, introduzca la descripción",
|
||||
"gchange62": "¿Estás seguro de ACTUALIZAR este grupo?",
|
||||
"gchange63": "Al presionar CONFIRMAR, se enviará la solicitud UPDATE_GROUP.",
|
||||
"gchange64": "Propietario actual / Nuevo propietario",
|
||||
"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",
|
||||
"gchange69": "Mensajes",
|
||||
"gchange70": "¡No hay mensajes en las últimas 24 horas!",
|
||||
"gchange71": "¡Ya te uniste a este grupo!"
|
||||
"gchange59": "Mostrar/ocultar teletipo"
|
||||
},
|
||||
"puzzlepage": {
|
||||
"pchange1": "Rompecabezas",
|
||||
@ -1031,16 +974,7 @@
|
||||
"nchange31": "Detener Nodo",
|
||||
"nchange32": "Solicitud de detención enviada con éxito!",
|
||||
"nchange33": "Reiniciar Nodo",
|
||||
"nchange34": "Solicitud de reinicio enviada con éxito!",
|
||||
"nchange35": "Iniciar nodo",
|
||||
"nchange36": "¡Nodo iniciado exitosamente!",
|
||||
"nchange37": "Al hacer clic en continuar se actualizará su Qortal Core, su base de datos se eliminará y descargará una nueva copia de la base de datos, llamada “bootstrapping”.",
|
||||
"nchange38": "Reparar Cartera LTC",
|
||||
"nchange39": "Esto reparará las billeteras LTC que muestran un saldo que no se puede gastar. Requiere realizar una sola transacción en la red Litecoin; después de la confirmación, el saldo de la billetera será funcional y el problema no volverá a ocurrir.",
|
||||
"nchange40": "Esta transacción consumirá una pequeña tarifa LTC. ¿Continuar?",
|
||||
"nchange41": "Intentando reparar. Espere...",
|
||||
"nchange42": "¡Monedero LTC reparado con éxito!",
|
||||
"nchange43": "Se produjo un error al intentar reparar la billetera LTC. ¡Inténtelo de nuevo!"
|
||||
"nchange34": "Solicitud de reinicio enviada con éxito!"
|
||||
},
|
||||
"transpage": {
|
||||
"tchange1": "Solicitud de transacción",
|
||||
@ -1075,16 +1009,7 @@
|
||||
"rewarddialog3": "En caso afirmativo, deberá guardar la clave a continuación para poder acuñar. Se puede suministrar a cualquier nodo para que pueda acuñar en su nombre.",
|
||||
"rewarddialog4": "Al presionar confirmar, se creará la recompensa compartida, pero aún deberá proporcionar la clave anterior a un nodo para poder acuñar con la cuenta.",
|
||||
"rewarddialog5": "Está eliminando una transacción de recompensa compartida asociada con la cuenta:",
|
||||
"rewarddialog6": "Al presionar confirmar, se eliminará la recompensa compartida y la clave de acuñación dejará de ser válida.",
|
||||
"deployAtdialog1": "Estás implementando el AT",
|
||||
"deployAtdialog2": "¡Al presionar confirmar, el AT será implementado!",
|
||||
"deployAtdialog3": "Saldo del importe inicial",
|
||||
"votedialog1": "Estás solicitando votar en la siguiente encuesta:",
|
||||
"votedialog2": "¡Al presionar confirmar, se enviará la solicitud de voto!",
|
||||
"votedialog3": "Estás solicitando crear la encuesta a continuación:",
|
||||
"votedialog4": "Descripción de la encuesta",
|
||||
"votedialog5": "Opciones",
|
||||
"votedialog6": "¡Al presionar confirmar, se creará la encuesta!"
|
||||
"rewarddialog6": "Al presionar confirmar, se eliminará la recompensa compartida y la clave de acuñación dejará de ser válida."
|
||||
},
|
||||
"sponsorshipspage": {
|
||||
"schange1": "Patrocinios Activos",
|
||||
@ -1207,7 +1132,7 @@
|
||||
"inf7": "Información de compra automática",
|
||||
"inf8": "Cerrar información de compra automática",
|
||||
"inf9": "'Auto Buy' es una función que permite realizar 'órdenes de compra' en el Portal de comercio. Estas 'órdenes de compra' solo son visibles para la persona que las realiza. No son órdenes de compra 'públicas' como las Las 'ventas de mercado abierto' NO se almacenan en la cadena de bloques de Qortal. La compra automática es una característica de la interfaz de usuario y, como tal, requiere que la interfaz de usuario esté FUNCIONANDO.",
|
||||
"inf10": "Para realizar un pedido de Compra automática, haga clic en el botón 'Agregar pedido de Compra automática' y complete el cuadro que aparece. Ingrese la CANTIDAD DE QORT que desea COMPRAR o la cantidad de LTC que desea utilizar, y el PRECIO que desea COMPRAR HASTA. Una vez que la orden esté activa, Auto Buy comprará HASTA esa cantidad de QORT para usted, HASTA el precio que usted establezca (comenzando en la orden más baja y subiendo en los libros).",
|
||||
"inf10": "Para realizar un pedido de compra automática, haga clic en el botón 'Agregar pedido de compra automática' y complete el cuadro que aparece. Ingrese la CANTIDAD DE QORT que desea COMPRAR y el PRECIO al que desea COMPRAR. Una vez la orden está activa, Auto Buy comprará HASTA esa cantidad de QORT para usted, HASTA el precio que establezca (comenzando en la orden más baja y subiendo en los libros)",
|
||||
"inf11": "¡Simplemente DEJE SU IU FUNCIONANDO y Auto Buy hace el resto, automáticamente!",
|
||||
"inf12": "PUEDE explorar otros complementos en la IU (Q-Chat, carteras, etc.) pero NO PUEDE CERRAR LA IU si desea que se complete su compra automática. Deje la IU 'minimizada' en la 'barra de tareas' o 'panel' está bien, mientras la interfaz de usuario permanezca ABIERTA, Auto Buy funcionará.",
|
||||
"inf13": "Comprar automáticamente",
|
||||
@ -1215,9 +1140,7 @@
|
||||
"inf15": "Órdenes de compra automática activas",
|
||||
"inf16": "Compra automática",
|
||||
"inf17": "Cambiar a tema claro",
|
||||
"inf18": "Cambiar a tema oscuro",
|
||||
"inf19": "Información comercial",
|
||||
"inf20": "Comprador"
|
||||
"inf18": "Cambiar a tema oscuro"
|
||||
},
|
||||
"lotterypage": {
|
||||
"lot1": "Loterías Qortal Abiertas",
|
||||
@ -1233,101 +1156,5 @@
|
||||
"lot11": "¡No hay loterías abiertas!",
|
||||
"lot12": "¡No hay loterías terminadas!",
|
||||
"lot13": "Jugadores"
|
||||
},
|
||||
"notifications": {
|
||||
"notify1": "Confirmando transacción",
|
||||
"notify2": "Transacción confirmada",
|
||||
"explanation": "Su transacción se está confirmando. Para seguir su progreso, haga clic en el ícono de campana.",
|
||||
"status1": "Totalmente sincronizado",
|
||||
"status2": "No sincronizado",
|
||||
"notify3": "No Notificaciones",
|
||||
"notify4": "Notificaciones de transmisión"
|
||||
},
|
||||
"friends": {
|
||||
"friend1": "Agregar nombre",
|
||||
"friend2": "Añadir amigo",
|
||||
"friend3": "Agregar un amigo te permite conectarte fácilmente con esa persona. Asegúrese también de seguir a ese usuario para respaldar el alojamiento de sus recursos publicados.",
|
||||
"friend4": "Notas",
|
||||
"friend5": "Seguir nombre",
|
||||
"friend6": "Alias",
|
||||
"friend7": "Añade un alias para recordar mejor a tu amigo (opcional)",
|
||||
"friend8": "Enviar Q-Chat",
|
||||
"friend9": "Enviar correo electrónico",
|
||||
"friend10": "Editar amigo",
|
||||
"friend11": "Siguiente",
|
||||
"friend12": "Amigos",
|
||||
"friend13": "Alimentar",
|
||||
"friend14": "Eliminar amigo",
|
||||
"friend15": "Configuración de alimentación",
|
||||
"friend16": "Seleccione las Q-Apps de las que desea recibir actualizaciones, especialmente aquellas relacionadas con sus amigos.",
|
||||
"friend17": "No hay elementos en tu feed"
|
||||
},
|
||||
"save": {
|
||||
"saving1": "No se pueden recuperar las configuraciones guardadas",
|
||||
"saving2": "Nada que salvar",
|
||||
"saving3": "Guardar cambios no guardados",
|
||||
"saving4": "Deshacer cambios"
|
||||
},
|
||||
"profile": {
|
||||
"profile1": "No tienes nombre",
|
||||
"profile2": "Ir al registro de nombre",
|
||||
"profile3": "Actualizar perfil",
|
||||
"profile4": "Lema",
|
||||
"perfil5": "Biografía",
|
||||
"profile6": "Direcciones de billetera",
|
||||
"profile7": "Rellenar desde la interfaz de usuario",
|
||||
"profile8": "Agregar propiedad personalizada",
|
||||
"profile9": "Nombre de propiedad",
|
||||
"profile10": "Campos",
|
||||
"profile11": "Agregar campo",
|
||||
"profile12": "Nombre de campo",
|
||||
"profile13": "Valor de campo",
|
||||
"profile14": "Actividad",
|
||||
"profile15": "Sin valor",
|
||||
"profile16": "Este nombre no tiene perfil",
|
||||
"profile17": "No se puede recuperar el perfil",
|
||||
"profile18": "Abrir perfil",
|
||||
"profile19": "No se puede recuperar el perfil",
|
||||
"profile20": "Nombre del registro",
|
||||
"profile21": "Insertar dirección desde la UI",
|
||||
"profile22": "Éxito",
|
||||
"profile23": "cifrado",
|
||||
"profile24": "Debes completar tanto el nombre del campo como el valor del campo para agregar una propiedad personalizada",
|
||||
"profile25": "Es tu amigo",
|
||||
"profile26": "Agregar como amigo"
|
||||
},
|
||||
"tour": {
|
||||
"tour1": "Para usar Qortal, el Core debe estar sincronizado. Este ícono estará en azul cuando esté sincronizado.",
|
||||
"tour2": "Sincronizado",
|
||||
"tour3": "Sincronizado y acuñado",
|
||||
"tour4": "Sincronizando",
|
||||
"tour5": "Sincroniza tu núcleo",
|
||||
"tour6": "La fuerza imparable de Qortal",
|
||||
"tour7": "Sólo tú controlas tus datos en Qortal",
|
||||
"tour8": "Qortal no se puede eliminar",
|
||||
"tour9": "Completamente peer-to-peer sin intermediarios centralizados",
|
||||
"tour10": "Esta es la vista de pestaña predeterminada donde puede acceder a configuraciones importantes de Qortal y Q-apps como Q-Tube.",
|
||||
"tour11": "Vive la experiencia completa",
|
||||
"tour12": "Para obtener la experiencia Qortal completa, recomendamos seguir esta lista de verificación.",
|
||||
"tour13": "¡Estás completamente sincronizado! Ahora puedes experimentar el poder de la cadena de bloques Qortal.",
|
||||
"tour14": "¡Intentemos visitar Q-Tube!",
|
||||
"tour15": "Visita Q-Tube",
|
||||
"tour16": "Lista de verificación",
|
||||
"tour17": "Inicie el Core para acceder a la cadena de bloques Qortal.",
|
||||
"tour18": "Actualizar (arranque)",
|
||||
"tour19": "Actualmente sincronizando... debes estar completamente sincronizado para usar Qortal",
|
||||
"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"
|
||||
}
|
||||
}
|
||||
}
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -5,10 +5,8 @@
|
||||
"chinese1": "Chinois (Simplifié)",
|
||||
"chinese2": "Chinois (Traditionnel)",
|
||||
"croatian": "Croate",
|
||||
"dutch": "Néerlandais",
|
||||
"english": "Anglais",
|
||||
"estonian": "Estonien",
|
||||
"finnish": "Finlandais",
|
||||
"french": "Français",
|
||||
"german": "Allemand",
|
||||
"hindi": "Hindi",
|
||||
@ -80,7 +78,7 @@
|
||||
"tm32": "Ce compte ne suit aucun utilisateur",
|
||||
"tm33": "Menu de l'onglet Importer",
|
||||
"tm34": "Menu de l'onglet Exporter",
|
||||
"tm35": "Votre nouvelle page à onglet existante sera supprimée et définie sur la nouvelle page à onglet importée.",
|
||||
"tm35": "Votre menu d'onglets existant sera supprimé et défini sur le menu d'onglets téléchargé.",
|
||||
"tm36": "Le menu des onglets a été restauré avec succès",
|
||||
"tm37": "Le menu des onglets a été enregistré avec succès sous",
|
||||
"tm38": "MODE DEV",
|
||||
@ -96,45 +94,45 @@
|
||||
"address": "Adresse",
|
||||
"password": "Mot de passe",
|
||||
"youraccounts": "Vos comptes",
|
||||
"clickto": "Cliquez sur compte pour vous connecter",
|
||||
"clickto": "Cliquez sur votre compte pour vous connecter",
|
||||
"needcreate": "Vous devez créer ou sauver un compte avant de pouvoir vous connecter!",
|
||||
"upload": "Importez votre fichier de sauvegarde Qortal",
|
||||
"upload": "Envoyer votre sauvegarde Qortal",
|
||||
"howlogin": "Comment voulez-vous vous connecter ?",
|
||||
"seed": "Phrase mnémonique",
|
||||
"seedphrase": "phrase mnémonique",
|
||||
"seedphrase": "Phrase mnémonique",
|
||||
"saved": "Compte sauvegardé",
|
||||
"qora": "Graine d'adresse QORA",
|
||||
"backup": "Fichier de Sauvegarde Qortal",
|
||||
"decrypt": "Décrypter le fichier de sauvegarde Qortal",
|
||||
"qora": "Adresse de contrôle Qora",
|
||||
"backup": "Sauvegarde du portefeuille Qortal",
|
||||
"decrypt": "Déchiffrer la sauvegarde",
|
||||
"save": "Sauvegarder dans ce navigateur.",
|
||||
"prepare": "Préparation de votre compte...",
|
||||
"areyousure": "Etes-vous sûr de vouloir supprimer ce compte ? (S'il est supprimé et qu'aucune sauvegarde Qortal n'existe, le compte pourrait être perdu à jamais ! Assurez-vous d'avoir un fichier de sauvegarde avant de faire cela !)",
|
||||
"prepare": "Préparation de votre compte",
|
||||
"areyousure": "Êtes-vous sûr de vouloir retirer ce portefeuille des portefeuilles sauvegardés?",
|
||||
"error1": "La sauvegarde doit être un JSON valide",
|
||||
"error2": "Option de connexion non sélectionnée",
|
||||
"createwelcome": "Bienvenue à Qortal ! Votre avenir numérique décentralisé vous attend ! Sur Qortal, vous seul avez un contrôle absolu sur vos données. Qortal fournit le niveau de base d'un nouveau monde numérique entièrement contrôlé par l'utilisateur.",
|
||||
"createa": "Une",
|
||||
"createwelcome": "Bienvenue dans Qortal, vous trouverez des similitudes avec un jeu de rôle, où, vous, en tant que frappeur dans le réseau Qortal (si vous choisissez d'en devenir un), aurez la chance d'augmenter votre niveau, vous donnant à la fois une plus grande partie de la récompense de bloc QORT et une plus grande influence sur le réseau en termes de vote sur les décisions pour la plate-forme.",
|
||||
"createa": "A",
|
||||
"click": "Cliquez pour voir la phrase mnémonique",
|
||||
"confirmpass": "Confirmez votre mot de passe",
|
||||
"willbe": "sera généré aléatoirement en arrière-plan. Si vous souhaitez VOIR la phrase de départ, cliquez sur la « phrase de départ » en surbrillance dans ce texte. Ceci est utilisé comme générateur de clé privée pour votre compte blockchain dans Qortal. Pour des raisons de sécurité, par défaut, les phrases de départ ne sont pas affichées à moins d'être spécifiquement choisies.",
|
||||
"willbe": "sera généré au hasard en arrière-plan. Il sera utilisé comme votre générateur de clé privée pour votre compte blockchain dans Qortal.",
|
||||
"clicknext": "Créez votre compte Qortal en cliquant sur SUIVANT ci-dessous.",
|
||||
"ready": "Votre compte est maintenant prêt à être créé. Il sera enregistré par défaut dans cette copie de l'interface utilisateur de Qortal, sous forme cryptée. Si vous ne souhaitez pas que votre nouveau compte soit enregistré ici, vous pouvez décocher la case ci-dessous. Vous pourrez toujours vous connecter avec votre nouveau compte (après vous être déconnecté), en utilisant votre fichier de sauvegarde Qortal que vous DEVEZ télécharger une fois votre compte créé.",
|
||||
"ready": "Votre compte est maintenant prêt à être créé. Il sera enregistré dans ce navigateur. Si vous ne souhaitez pas que votre nouveau compte soit enregistré dans votre navigateur, vous pouvez décocher la case ci-dessous. Vous serez toujours en mesure de vous connecter avec votre nouveau compte (après la déconnexion), en utilisant votre fichier de sauvegarde de portefeuille que vous DEVEZ télécharger une fois que vous créez votre compte.",
|
||||
"welmessage": "Bienvenue dans Qortal",
|
||||
"pleaseenter": "Veuillez entrer un mot de passe!",
|
||||
"notmatch": "Oops! Les mots de passe ne coïncident pas ! Essayer à nouveau!",
|
||||
"lessthen8": "Votre mot de passe est inférieur à 5 caractères! Ceci n’est pas recommandé. Vous pouvez continuer en ignorant cet avertissement.",
|
||||
"lessthen8-2": "Votre mot de passe est inférieur à 5 caractères!",
|
||||
"entername": "S'il vous plaît entrer un nom d'affichage!",
|
||||
"downloaded": "Votre fichier de compte Qortal a été enregistré!",
|
||||
"notmatch": "Les mots de passe ne correspondent pas!",
|
||||
"lessthen8": "Votre mot de passe est inférieur à 8 caractères! Ceci n’est pas recommandé. Vous pouvez continuer en ignorant cet avertissement.",
|
||||
"lessthen8-2": "Votre mot de passe est inférieur à 8 caractères!",
|
||||
"entername": "Veuillez saisir un nom!",
|
||||
"downloaded": "Le fichier de sauvegarde de votre portefeuille va être téléchargé!",
|
||||
"loading": "Chargement en cours, veuillez patienter...",
|
||||
"createdseed": "Votre phrase mnémonique créee",
|
||||
"saveseed": "Sauvegarder votre phrase mnémonique",
|
||||
"savein": "Enregistrer dans l'interface utilisateur",
|
||||
"savein": "Sauvegarder dans le navigateur",
|
||||
"backup2": "Ce fichier est la SEULE façon d’accéder à votre compte sur un système qui ne l’a pas d'enregistré dans l’application ou le navigateur. ASSUREZ-VOUS DE SAUVEGARDER CE FICHIER À PLUSIEURS ENDROITS. Le fichier est chiffré de manière très sécurisée et déchiffré avec votre mot de passe local que vous avez créé à l’étape précédente. Vous pouvez l’enregistrer n’importe où en toute sécurité, mais assurez-vous de le faire à plusieurs endroits.",
|
||||
"savewallet": "Enregistrer le fichier de sauvegarde Qortal",
|
||||
"savewallet": "Sauvegarder le fichier de sauvegarde du portefeuille",
|
||||
"created1": "Votre compte est maintenant créé",
|
||||
"created2": " et enregistré dans cette interface utilisateur sous forme cryptée.",
|
||||
"downloadbackup": "Enregistrer le fichier de sauvegarde Qortal",
|
||||
"passwordhint": "Le mot de passe doit comporter au moins 5 caractères.",
|
||||
"created2": " et sera enregistré dans ce navigateur.",
|
||||
"downloadbackup": "Télécharger le fichier de sauvegarde du portefeuille",
|
||||
"passwordhint": "Un mot de passe doit comporter au moins 8 caractères.",
|
||||
"lp1": "Verrouiller l'écran",
|
||||
"lp2": "Aucun mot de passe d'écran de verrouillage n'est défini !",
|
||||
"lp3": "Veuillez en définir un",
|
||||
@ -150,7 +148,7 @@
|
||||
"lp13": "Génération de la clé de déchiffrement",
|
||||
"lp14": "Clé de vérification",
|
||||
"lp15": "Mot de passe incorrect",
|
||||
"lp16": "Décryptage en cours",
|
||||
"lp16": "Décryptage",
|
||||
"lp17": "En attente que les travailleurs soient prêts",
|
||||
"lp18": "Dérivation des parties clés",
|
||||
"lp19": "Erreur, clé incorrecte. ",
|
||||
@ -163,8 +161,8 @@
|
||||
"confirmlogout": "Êtes-vous certain de vouloir vous déconnecter?"
|
||||
},
|
||||
"fragfile": {
|
||||
"selectfile": "Sélectionnez le fichier de sauvegarde",
|
||||
"dragfile": "Glissez-déposez ou cliquez ici pour sélectionner le fichier de sauvegarde"
|
||||
"selectfile": "Sélectionnez un fichier",
|
||||
"dragfile": "Glisser-déposer la sauvegarde ici"
|
||||
},
|
||||
"settings": {
|
||||
"generalinfo": "Informations générales du compte",
|
||||
@ -181,8 +179,9 @@
|
||||
"notifications": "Notifications",
|
||||
"accountsecurity": "Sécurité du compte",
|
||||
"password": "Mot de passe",
|
||||
"download": "Exporter/Enregistrer le fichier de sauvegarde",
|
||||
"download": "Télécharger le fichier de sauvegarde",
|
||||
"choose": "Veuillez choisir un mot de passe pour chiffrer votre sauvegarde. (Il peut s’agir du même mot de passe que celui avec lequel vous vous êtes connecté, ou différent)",
|
||||
"block": "Notification de bloc (Pour bientôt...)",
|
||||
"playsound": "Lire le son",
|
||||
"shownotifications": "Afficher les notifications",
|
||||
"nodeurl": "Url du noeud",
|
||||
@ -201,20 +200,12 @@
|
||||
"snack3": "Noeud personnalisé ajouté et enregistré avec succès",
|
||||
"snack4": "Les noeuds ont été enregistrés avec succès sous",
|
||||
"snack5": "Les noeuds ont été importés avec succès",
|
||||
"snack6": "Nœud personnalisé supprimé avec succès",
|
||||
"snack7": "Nœud personnalisé édité avec succès",
|
||||
"exp1": "Exporter la clé privée principale (xpriv)",
|
||||
"exp1": "Exporter la clé principale privée",
|
||||
"exp2": "Exporter la clé principale",
|
||||
"exp3": "Exporter",
|
||||
"exp4": "Veuillez choisir un portefeuille pour sauvegarder la clé privée principale.",
|
||||
"core": "Paramètres de démarrage automatique de Qortal Core",
|
||||
"qappNotification1": "Notifications Q-App",
|
||||
"selectnode": "Veuillez sélectionner une option",
|
||||
"arrr1": "Portefeuille ARRR non initialisé !",
|
||||
"arrr2": "Veuillez accéder à « Portefeuilles » et accéder au portefeuille ARRR pour initialiser d'abord le portefeuille.",
|
||||
"arrr3": "Besoin d'une mise à jour principale !",
|
||||
"arrr4": "Pour sauvegarder la clé privée de votre portefeuille ARRR vous devez d'abord mettre à jour le Qortal Core!",
|
||||
"sync_indicator": "Désactiver la fenêtre contextuelle de l'indicateur de synchronisation"
|
||||
"exp4": "Veuillez choisir un portefeuille pour sauvegarder la clé principale privée.",
|
||||
"core": "Démarrer les paramètres du noyau",
|
||||
"qappNotification1": "Notifications Q-App"
|
||||
},
|
||||
"appinfo": {
|
||||
"blockheight": "Hauteur de bloc",
|
||||
@ -248,9 +239,7 @@
|
||||
"balance": "Solde",
|
||||
"balances": "VOS SOLDES DE PORTEFEUILLE",
|
||||
"update": "METTRE À JOUR LES SOLDES DES PORTEFEUILLES",
|
||||
"view": "Voir",
|
||||
"all": "Tous",
|
||||
"page": "Page"
|
||||
"view": "Voir"
|
||||
},
|
||||
"gifs": {
|
||||
"gchange1": "Explorateur GIF",
|
||||
@ -286,7 +275,7 @@
|
||||
"startminting": {
|
||||
"smchange1": "Impossible de récupérer les comptes de frappe",
|
||||
"smchange2": "Échec de la suppression de la clé",
|
||||
"smchange3": "Échec de l'ajout de la clé de frappe, si la clé vient d'être créée, essayez d'attendre quelques blocs et d'ajouter à nouveau.",
|
||||
"smchange3": "Échec de l'ajout de la clé de frappe",
|
||||
"smchange4": "Impossible de créer la clé de parrainage",
|
||||
"smchange5": "Créer une relation",
|
||||
"smchange6": "En attente de confirmation sur blockchain",
|
||||
@ -405,8 +394,7 @@
|
||||
"wchange55": "Votre carnet d'adresses existant sera supprimé et une nouvelle sauvegarde sera créée.",
|
||||
"wchange56": "ATTENTION!",
|
||||
"wchange57": "Mémo",
|
||||
"wchange58": "Nouvelle Adresse",
|
||||
"wchange59": "Pièce"
|
||||
"wchange58": "Nouvelle Adresse"
|
||||
},
|
||||
"tradepage": {
|
||||
"tchange1": "Portail de commerce",
|
||||
@ -509,7 +497,7 @@
|
||||
"nchange23": "Prix de vente",
|
||||
"nchange24": "Aucun nom à vendre",
|
||||
"nchange25": "Nom à vendre",
|
||||
"nchange26": "Êtes-vous sûr de vouloir vendre ce nom ? Si le nom est acheté par un autre compte, les données publiées par ce nom ne seront plus modifiables par vous !",
|
||||
"nchange26": "Êtes-vous sûr de vendre ce nom ?",
|
||||
"nchange27": "Pour ce prix en QORT",
|
||||
"nchange28": "En appuyant sur confirmer, la demande de nom de vente sera envoyée !",
|
||||
"nchange29": "Nom à annuler",
|
||||
@ -530,8 +518,7 @@
|
||||
"nchange44": "Au nouveau nom",
|
||||
"nchange45": "En appuyant sur confirmer, la demande de mise à jour du nom sera envoyée !",
|
||||
"nchange46": "Historique des ventes de noms",
|
||||
"nchange47": "Mise à jour du nom réussie !",
|
||||
"nchange48": "Attention ! Si vous mettez à jour votre nom, vous perdrez les ressources associées au nom d'origine. En d'autres termes, vous perdrez la propriété du contenu sous le nom d'origine dans le QDN. Procédez avec prudence !"
|
||||
"nchange47": "Mise à jour du nom réussie !"
|
||||
},
|
||||
"websitespage": {
|
||||
"schange1": "Parcourir les sites Web",
|
||||
@ -612,8 +599,7 @@
|
||||
"schange39": "Ouvrir",
|
||||
"schange40": "Aperçu",
|
||||
"schange41": "Téléchargement, veuillez patienter...",
|
||||
"schange42": "Fichiers téléchargés",
|
||||
"schange43": "Toutes les tentatives de téléchargement continueront en arrière-plan, veuillez réessayer après un certain temps."
|
||||
"schange42": "Fichiers téléchargés"
|
||||
},
|
||||
"tubespage": {
|
||||
"schange1": "Parcourir Q-Tubes",
|
||||
@ -735,14 +721,7 @@
|
||||
"bchange44": "Autorisez-vous cette application à supprimer de cette liste ?",
|
||||
"bchange45": "Crypter",
|
||||
"bchange46": "Autorisez-vous cette application à enregistrer le fichier suivant",
|
||||
"bchange47": "Publication instantanée - nécessite",
|
||||
"bchange48": "Autorisez-vous cette application à vous envoyer des notifications",
|
||||
"bchange49": "Autorisez-vous cette application à récupérer les informations de votre portefeuille ?",
|
||||
"bchange50": "Cette application a demandé une modification de votre profil public. Propriété : ",
|
||||
"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 ?"
|
||||
"bchange47": "Publication instantanée - nécessite"
|
||||
},
|
||||
"datapage": {
|
||||
"dchange1": "Gestion de données",
|
||||
@ -842,37 +821,13 @@
|
||||
"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 10 Mo",
|
||||
"cchange77": "La taille de la pièce jointe dépasse 1 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",
|
||||
"cchange81": "Ce type d'image n'est pas pris en charge",
|
||||
"cchange82": "Cette pièce jointe a été supprimée",
|
||||
"cchange90": "Aucun message",
|
||||
"cchange91": "Envoi...",
|
||||
"cchange92": "Messages non lus ci-dessous",
|
||||
"cchange93": "Image copiée dans le presse-papier",
|
||||
"cchange94": "chargé",
|
||||
"cchange95": "Uniquement mes ressources",
|
||||
"cchange96": "Gestion de groupe ouverte",
|
||||
"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 ..."
|
||||
"cchange90": "Aucun message"
|
||||
},
|
||||
"welcomepage": {
|
||||
"wcchange1": "Bienvenue dans Q-Chat",
|
||||
@ -964,19 +919,7 @@
|
||||
"gchange56": "Nom du groupe à rechercher",
|
||||
"gchange57": "Nom de groupe privé introuvable",
|
||||
"gchange58": "Notez que le nom du groupe doit correspondre exactement.",
|
||||
"gchange59": "Afficher / Masquer le téléscripteur",
|
||||
"gchange60": "Veuillez saisir le nom du groupe",
|
||||
"gchange61": "Veuillez entrer la description",
|
||||
"gchange62": "Êtes-vous sûr de mettre à jour ce groupe?",
|
||||
"gchange63": "En appuyant sur CONFIRMER, la demande de UPDATE_GROUP sera envoyée !",
|
||||
"gchange64": "Propriétaire actuel / Nouveau propriétaire",
|
||||
"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",
|
||||
"gchange69": "Messages",
|
||||
"gchange70": "Aucun message ces dernières 24 heures !",
|
||||
"gchange71": "Vous avez déjà rejoint ce groupe !"
|
||||
"gchange59": "Afficher / Masquer le téléscripteur"
|
||||
},
|
||||
"puzzlepage": {
|
||||
"pchange1": "Puzzles",
|
||||
@ -1031,16 +974,7 @@
|
||||
"nchange31": "Arreter le noeud",
|
||||
"nchange32": "Demande d’arrêt envoyée avec succès!",
|
||||
"nchange33": "Redémarrer le noeud",
|
||||
"nchange34": "Demande de redémarrage envoyée avec succès!",
|
||||
"nchange35": "Démarrer le nœud",
|
||||
"nchange36": "Nœud démarré avec succès !",
|
||||
"nchange37": "Cliquer sur continuer actualisera votre Qortal Core, votre base de données sera supprimée et vous téléchargerez une nouvelle copie de la base de données, appelée “bootstrapping“.",
|
||||
"nchange38": "Réparer le portefeuille LTC",
|
||||
"nchange39": "Cela réparera les portefeuilles LTC qui affichent un solde qui ne peut pas être dépensé. Cela nécessite qu'une seule transaction soit effectuée sur le réseau Litecoin, après confirmation, le solde du portefeuille sera fonctionnel et le problème ne se reproduira plus.",
|
||||
"nchange40": "Cette transaction entraînera de petits frais LTC. Continuer ?",
|
||||
"nchange41": "Essayer de réparer. Veuillez patienter...",
|
||||
"nchange42": "Portefeuille LTC réparé avec succès !",
|
||||
"nchange43": "Une erreur s'est produite lors de la tentative de réparation du portefeuille LTC. Veuillez réessayer !"
|
||||
"nchange34": "Demande de redémarrage envoyée avec succès!"
|
||||
},
|
||||
"transpage": {
|
||||
"tchange1": "Demande de transaction",
|
||||
@ -1075,16 +1009,7 @@
|
||||
"rewarddialog3": "Si oui, vous devrez enregistrer la clé ci-dessous afin de frapper. Il peut être fourni à n'importe quel nœud afin de lui permettre de frapper en votre nom.",
|
||||
"rewarddialog4": "En appuyant sur confirmer, le partage de récompense sera créé, mais vous devrez toujours fournir la clé ci-dessus à un nœud afin de frapper avec le compte.",
|
||||
"rewarddialog5": "Vous supprimez une transaction de partage de récompenses associée au compte :",
|
||||
"rewarddialog6": "En appuyant sur confirmer, le partage de récompense sera supprimé et la clé de frappe deviendra invalide.",
|
||||
"deployAtdialog1": "Vous déployez l'AT",
|
||||
"deployAtdialog2": "En appuyant sur confirmer, l'AT sera déployé !",
|
||||
"deployAtdialog3": "Solde du montant initial",
|
||||
"votedialog1": "Vous demandez à voter sur le sondage ci-dessous :",
|
||||
"votedialog2": "En appuyant sur confirmer, la demande de vote sera envoyée !",
|
||||
"votedialog3": "Vous demandez la création du sondage ci-dessous :",
|
||||
"votedialog4": "Description du sondage",
|
||||
"votedialog5": "Options",
|
||||
"votedialog6": "En appuyant sur confirmer, le sondage sera créé !"
|
||||
"rewarddialog6": "En appuyant sur confirmer, le partage de récompense sera supprimé et la clé de frappe deviendra invalide."
|
||||
},
|
||||
"sponsorshipspage": {
|
||||
"schange1": "Parrainages actifs",
|
||||
@ -1215,9 +1140,7 @@
|
||||
"inf15": "Commandes d'achat automatique actives",
|
||||
"inf16": "Achat automatique",
|
||||
"inf17": "Passer au thème clair",
|
||||
"inf18": "Passer au thème sombre",
|
||||
"inf19": "Informations commerciales",
|
||||
"inf20": "Acheteur"
|
||||
"inf18": "Passer au thème sombre"
|
||||
},
|
||||
"lotterypage": {
|
||||
"lot1": "Loteries Qortal ouvertes",
|
||||
@ -1233,101 +1156,5 @@
|
||||
"lot11": "Il n'y a pas de loteries ouvertes !",
|
||||
"lot12": "Il n'y a aucune loterie terminée !",
|
||||
"lot13": "Joueurs"
|
||||
},
|
||||
"notifications": {
|
||||
"notify1": "Confirmation de la transaction",
|
||||
"notify2": "Transaction confirmée",
|
||||
"explanation": "Votre transaction est en cours de confirmation. Pour suivre sa progression, cliquez sur l'icône en forme de cloche.",
|
||||
"status1": "Entièrement synchronisé",
|
||||
"status2": "Non synchronisé",
|
||||
"notify3": "Aucune notification",
|
||||
"notify4": "Notifications d'émission"
|
||||
},
|
||||
"friends": {
|
||||
"friend1": "Ajouter un nom",
|
||||
"friend2": "Ajouter un ami",
|
||||
"friend3": "Ajouter un ami vous permet de vous connecter facilement avec cette personne. Assurez-vous également de suivre cet utilisateur pour prendre en charge l'hébergement de ses ressources publiées.",
|
||||
"friend4": "Remarques",
|
||||
"friend5": "Suivre le nom",
|
||||
"friend6": "Alias",
|
||||
"friend7": "Ajoutez un alias pour mieux vous souvenir de votre ami (facultatif)",
|
||||
"friend8": "Envoyer un Q-Chat",
|
||||
"friend9": "Envoyer un Q-Mail",
|
||||
"friend10": "Modifier un ami",
|
||||
"friend11": "Suivant",
|
||||
"friend12": "Amis",
|
||||
"friend13": "Alimentation",
|
||||
"friend14": "Supprimer un ami",
|
||||
"friend15": "Paramètres du flux",
|
||||
"friend16": "Sélectionnez les Q-Apps pour lesquelles vous souhaitez des mises à jour, en particulier celles liées à vos amis.",
|
||||
"friend17": "Aucun élément dans votre flux"
|
||||
},
|
||||
"save": {
|
||||
"saving1": "Impossible de récupérer les paramètres enregistrés",
|
||||
"saving2": "Rien à sauver",
|
||||
"saving3": "Enregistrer les modifications non enregistrées",
|
||||
"saving4": "Annuler les changements"
|
||||
},
|
||||
"profile": {
|
||||
"profile1": "Vous n'avez pas de nom",
|
||||
"profile2": "Aller à l'enregistrement du nom",
|
||||
"profile3": "Mettre à jour le profil",
|
||||
"profile4": "Slogan",
|
||||
"profile5": "Biographie",
|
||||
"profile6": "Adresses du portefeuille",
|
||||
"profile7": "Remplir depuis l'interface utilisateur",
|
||||
"profile8": "Ajouter une propriété personnalisée",
|
||||
"profile9": "Nom de la propriété",
|
||||
"profile10": "Champs",
|
||||
"profile11": "Ajouter un champ",
|
||||
"profile12": "Nom du champ",
|
||||
"profile13": "Valeur du champ",
|
||||
"profile14": "Activité",
|
||||
"profile15": "Aucune valeur",
|
||||
"profile16": "Ce nom n'a pas de profil",
|
||||
"profile17": "Impossible de récupérer le profil",
|
||||
"profile18": "Ouvrir le profil",
|
||||
"profile19": "Impossible de récupérer le profil",
|
||||
"profile20": "Nom du registre",
|
||||
"profile21": "Insérer l'adresse depuis l'interface utilisateur",
|
||||
"profile22": "Succès",
|
||||
"profile23": "crypté",
|
||||
"profile24": "Vous devez remplir à la fois le nom et la valeur du champ pour ajouter une propriété personnalisée",
|
||||
"profile25": "Est-ce que ton ami",
|
||||
"profile26": "Ajouter comme ami"
|
||||
},
|
||||
"tour": {
|
||||
"tour1": "Pour utiliser Qortal, le Core doit être synchronisé. Cette icône sera en bleu lorsqu'il sera synchronisé.",
|
||||
"tour2": "Synchronisé",
|
||||
"tour3": "Synchronisé et frappé",
|
||||
"tour4": "Synchronisation",
|
||||
"tour5": "Synchronisez votre core",
|
||||
"tour6": "La force imparable de Qortal",
|
||||
"tour7": "Vous seul contrôlez vos données sur Qortal",
|
||||
"tour8": "Qortal ne peut pas être démonté",
|
||||
"tour9": "Complètement peer-to-peer sans intermédiaires centralisés",
|
||||
"tour10": "Il s'agit de l'onglet par défaut dans lequel vous pouvez accéder aux paramètres Qortal importants et aux applications Q telles que Q-Tube.",
|
||||
"tour11": "Vivez l'expérience complète",
|
||||
"tour12": "Pour profiter pleinement de l'expérience Qortal, nous vous recommandons de suivre cette liste de contrôle.",
|
||||
"tour13": "Vous êtes entièrement synchronisé ! Vous pouvez désormais découvrir la puissance de la blockchain Qortal.",
|
||||
"tour14": "Essayons de visiter Q-Tube !",
|
||||
"tour15": "Visitez Q-Tube",
|
||||
"tour16": "Liste de contrôle",
|
||||
"tour17": "Veuillez démarrer le Core pour accéder à la blockchain Qortal.",
|
||||
"tour18": "Actualiser (bootstrap)",
|
||||
"tour19": "Actuellement en cours de synchronisation... vous devez être entièrement synchronisé pour utiliser Qortal",
|
||||
"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"
|
||||
}
|
||||
}
|
||||
}
|
@ -5,10 +5,8 @@
|
||||
"chinese1": "चीनी (सरलीकृत)",
|
||||
"chinese2": "चीनी (परंपरागत)",
|
||||
"croatian": "क्रोएशियाई",
|
||||
"dutch": "ओलंदेज़",
|
||||
"english": "अंग्रेज़ी",
|
||||
"estonian": "एस्टोनियाई",
|
||||
"finnish": "फ़िनिश",
|
||||
"french": "फ्रेंच",
|
||||
"german": "जर्मन",
|
||||
"hindi": "हिन्दी",
|
||||
@ -108,33 +106,33 @@
|
||||
"decrypt": "डिक्रिप्ट बैकअप",
|
||||
"save": "इस ब्राउज़र में सेव करें.",
|
||||
"prepare": "आपका खाता तैयार करना",
|
||||
"areyousure": "क्या आप वाकई इस वॉलेट को सहेजे गए वॉलेट से निकालना चाहते हैं? (यदि हटा दिया गया है और कोई बैकअप फ़ाइल मौजूद नहीं है, तो खाता हमेशा के लिए खो सकता है! ऐसा करने से पहले सुनिश्चित करें कि आपके पास एक बैकअप फ़ाइल है!)",
|
||||
"areyousure": "क्या आप वाकई इस वॉलेट को सहेजे गए वॉलेट से निकालना चाहते हैं?",
|
||||
"error1": "बैकअप मान्य जेसन होना चाहिए",
|
||||
"error2": "लॉगिन विकल्प नहीं चुना गया",
|
||||
"createwelcome": "क्वॉर्टल में आपका स्वागत है! आपका विकेन्द्रीकृत डिजिटल भविष्य आपका इंतजार कर रहा है! Qortal पर केवल आपका अपने डेटा पर पूर्ण नियंत्रण होता है। क्वॉर्टल एक नई और पूरी तरह से उपयोगकर्ता-नियंत्रित डिजिटल दुनिया का आधार स्तर प्रदान करता है।",
|
||||
"createwelcome": "क्वॉर्टल में आपका स्वागत है, आप इसे आरपीजी गेम के समान पाएंगे, आप, क्वॉर्टल नेटवर्क पर एक मिंटर के रूप में (यदि आप एक बनना चुनते हैं) आपके पास अपने खाते को समतल करने का मौका होगा, जिससे आप दोनों को और अधिक मिलेगा मंच के निर्णयों पर मतदान के संदर्भ में क्वॉर्ट ब्लॉक इनाम और नेटवर्क पर भी बड़ा प्रभाव है।",
|
||||
"createa": "ए",
|
||||
"click": "बीजवाक्य देखने के लिए क्लिक करें",
|
||||
"confirmpass": "पासवर्ड की पुष्टि कीजिये",
|
||||
"willbe": "पृष्ठभूमि में बेतरतीब ढंग से उत्पन्न किया जाएगा. यदि आप सीडफ़्रेज़ देखना चाहते हैं, तो इस पाठ में हाइलाइट किए गए 'सीडफ़्रेज़' पर क्लिक करें। इसका उपयोग Qortal में आपके ब्लॉकचेन खाते के लिए आपके निजी कुंजी जनरेटर के रूप में किया जाता है। डिफ़ॉल्ट रूप से सुरक्षा के लिए, सीडफ़्रेज़ प्रदर्शित नहीं किए जाते हैं जब तक कि विशेष रूप से चुना न जाए।",
|
||||
"willbe": "पृष्ठभूमि में बेतरतीब ढंग से उत्पन्न होगा। यह क्वॉर्टल में आपके ब्लॉकचेन खाते के लिए आपके निजी कुंजी जनरेटर के रूप में उपयोग किया जाता है।",
|
||||
"clicknext": "नीचे अगला पर क्लिक करके अपना क्वॉर्टल अकाउंट बनाएं।",
|
||||
"ready": "अब आपका अकाउंट बनने के लिए तैयार है. इसे डिफ़ॉल्ट रूप से, एन्क्रिप्टेड रूप में, Qortal UI की इस प्रति में सहेजा जाएगा। यदि आप नहीं चाहते कि आपका नया खाता यहां सहेजा जाए, तो आप नीचे दिए गए बॉक्स को अनचेक कर सकते हैं। आप अभी भी अपने वॉलेट बैकअप फ़ाइल का उपयोग करके अपने नए खाते से (लॉग आउट करने के बाद) लॉग इन कर पाएंगे, जिसे आपको अपना खाता बनाने के बाद डाउनलोड करना होगा।",
|
||||
"ready": "आपका खाता अब बनने के लिए तैयार है। यह इस ब्राउज़र में सेव हो जाएगा। यदि आप नहीं चाहते कि आपका नया खाता आपके ब्राउज़र में सहेजा जाए, तो आप नीचे दिए गए बॉक्स को अनचेक कर सकते हैं। आप अभी भी अपने वॉलेट बैकअप फ़ाइल का उपयोग करके अपने नए खाते (लॉग आउट करने के बाद) के साथ लॉगिन करने में सक्षम होंगे, जिसे आपको अपना खाता बनाने के बाद डाउनलोड करना होगा।",
|
||||
"welmessage": "क्वॉर्टल में आपका स्वागत है",
|
||||
"pleaseenter": "कृपया पासवर्ड दर्ज करें!",
|
||||
"notmatch": "पासवर्ड मेल नहीं खाता!",
|
||||
"lessthen8": "आपका पासवर्ड 5 वर्णों से कम का है! यह अनुशंसित नहीं है। आप इस चेतावनी को नज़रअंदाज़ करना जारी रख सकते हैं।",
|
||||
"lessthen8-2": "आपका पासवर्ड 5 वर्णों से कम का है!",
|
||||
"lessthen8": "आपका पासवर्ड 8 वर्णों से कम का है! यह अनुशंसित नहीं है। आप इस चेतावनी को नज़रअंदाज़ करना जारी रख सकते हैं।",
|
||||
"lessthen8-2": "आपका पासवर्ड 8 वर्णों से कम का है!",
|
||||
"entername": "कृपया एक नाम दर्ज करें!",
|
||||
"downloaded": "आपकी वॉलेट बैकअप फ़ाइल डाउनलोड हो जाती है!",
|
||||
"loading": "लोड हो रहा है कृपया प्रतीक्षा करें...",
|
||||
"createdseed": "आपका बनाएँ बीज वाक्यांश",
|
||||
"saveseed": "सीडफ़्रेज़ सहेजें",
|
||||
"savein": "इस यूआई में सहेजें",
|
||||
"savein": "ब्राउज़र में सहेजें",
|
||||
"backup2": "यह फ़ाइल किसी ऐसे सिस्टम पर आपके खाते तक पहुँचने का एकमात्र तरीका है, जिसमें इसे ऐप/ब्राउज़र में सहेजा नहीं गया है। इस फ़ाइल का कई स्थानों पर बैकअप लेना सुनिश्चित करें। फ़ाइल बहुत सुरक्षित रूप से एन्क्रिप्ट की गई है और पिछले चरण में आपके द्वारा बनाए गए आपके स्थानीय पासवर्ड से डिक्रिप्ट की गई है। आप इसे कहीं भी सुरक्षित रूप से सहेज सकते हैं, लेकिन इसे कई स्थानों पर करना सुनिश्चित करें।",
|
||||
"savewallet": "वॉलेट बैकअप फ़ाइल सहेजें",
|
||||
"created1": "आपका खाता अब निर्मित हो गया है",
|
||||
"created2": " और इस ब्राउज़र में सहेजा जाएगा।",
|
||||
"downloadbackup": "वॉलेट बैकअप फ़ाइल डाउनलोड करें",
|
||||
"passwordhint": "पासवर्ड कम से कम 5 अक्षर का होना चाहिए।",
|
||||
"passwordhint": "पासवर्ड कम से कम 8 अक्षर का होना चाहिए।",
|
||||
"lp1": "लॉक स्क्रीन",
|
||||
"lp2": "कोई लॉक स्क्रीन पासवर्ड सेट नहीं है!",
|
||||
"lp3": "कृपया एक सेट करें",
|
||||
@ -164,7 +162,7 @@
|
||||
},
|
||||
"fragfile": {
|
||||
"selectfile": "फ़ाइल का चयन करें",
|
||||
"dragfile": "बैकअप फ़ाइल का चयन करने के लिए खींचें और छोड़ें या यहां क्लिक करें"
|
||||
"dragfile": "बैकअप को यहां खींचें और छोड़ें"
|
||||
},
|
||||
"settings": {
|
||||
"generalinfo": "सामान्य खाता जानकारी",
|
||||
@ -181,8 +179,9 @@
|
||||
"qr_login_button_2": "लॉगिन क्यूआर कोड जनरेट करें",
|
||||
"accountsecurity": "खाते की सुरक्षा",
|
||||
"password": "पासवर्ड",
|
||||
"download": "बैकअप फ़ाइल निर्यात/सहेजें",
|
||||
"download": "बैकअप फ़ाइल डाउनलोड करें",
|
||||
"choose": "कृपया अपने बैकअप को एन्क्रिप्ट करने के लिए पासवर्ड चुनें। (यह वही हो सकता है जैसा आपने एक लॉग इन किया है, या अलग)",
|
||||
"block": "ब्लॉक सूचनाएं (जल्द ही आ रही ...",
|
||||
"playsound": "ध्वनि चलाएं",
|
||||
"shownotifications": "सूचनाएं दिखाएं",
|
||||
"nodeurl": "नोड यूआरएल",
|
||||
@ -192,8 +191,8 @@
|
||||
"protocol": "परोटोकोल",
|
||||
"domain": "डोमेन",
|
||||
"port": "पोर्ट",
|
||||
"import": "सहेजे गए नोड्स आयात करें",
|
||||
"export": "सहेजे गए नोड्स निर्यात करें",
|
||||
"import": "आयात नोड्स",
|
||||
"export": "निर्यात नोड्स",
|
||||
"deletecustomnode": "सभी कस्टम नोड्स निकालें",
|
||||
"warning": "आपके मौजूदा नोड्स हटा दिए जाएंगे और बैकअप से नया बनाया जाएगा।",
|
||||
"snack1": "मानक नोड्स को सफलतापूर्वक हटा दिया गया और जोड़ा गया",
|
||||
@ -201,20 +200,12 @@
|
||||
"snack3": "कस्टम नोड को सफलतापूर्वक जोड़ा और सहेजा गया",
|
||||
"snack4": "नोड्स सफलतापूर्वक सहेजे गए",
|
||||
"snack5": "नोड्स सफलतापूर्वक आयात किए गए",
|
||||
"snack6": "कस्टम नोड सफलतापूर्वक हटा दिया गया",
|
||||
"snack7": "कस्टम नोड सफलतापूर्वक संपादित",
|
||||
"exp1": "निजी मास्टर कुंजी निर्यात करें (xpriv)",
|
||||
"exp1": "निजी मास्टर कुंजी निर्यात करें",
|
||||
"exp2": "निर्यात मास्टर कुंजी",
|
||||
"exp3": "निर्यात",
|
||||
"exp4": "निजी मास्टर कुंजी का बैकअप लेने के लिए कृपया एक वॉलेट चुनें।",
|
||||
"core": "कोर ऑटो-स्टार्ट सेटिंग्स",
|
||||
"qappNotification1": "क्यू-ऐप अधिसूचनाएँ",
|
||||
"selectnode": "कृपया एक विकल्प चुनें",
|
||||
"arrr1": "ARRR वॉलेट प्रारंभ नहीं हुआ!",
|
||||
"arrr2": "कृपया पहले वॉलेट प्रारंभ करने के लिए वॉलेट टैब पर जाएं और ARRR वॉलेट तक पहुंचें",
|
||||
"arrr3": "मुख्य अद्यतन की आवश्यकता है!",
|
||||
"arrr4": "अपने Arrr वॉलेट की निजी कुंजी को सहेजने के लिए आपको पहले एक कोर अपडेट की आवश्यकता है!",
|
||||
"sync_indicator": "सिंक संकेतक पॉपअप अक्षम करें"
|
||||
"core": "कोर सेटिंग प्रारंभ करें",
|
||||
"qappNotification1": "क्यू-ऐप अधिसूचनाएँ"
|
||||
},
|
||||
"appinfo": {
|
||||
"blockheight": "ब्लॉक ऊँचाई",
|
||||
@ -248,9 +239,7 @@
|
||||
"balance": "संतुलन",
|
||||
"balances": "आपका वॉलेट बैलेंस",
|
||||
"update": "अपडेट वॉलेट बैलेंस",
|
||||
"view": "देखना",
|
||||
"all": "सभी",
|
||||
"page": "पृष्ठ"
|
||||
"view": "देखना"
|
||||
},
|
||||
"gifs": {
|
||||
"gchange1": "जीआईएफ एक्सप्लोरर",
|
||||
@ -286,7 +275,7 @@
|
||||
"startminting": {
|
||||
"smchange1": "खनन खाते नहीं लाए जा सकते",
|
||||
"smchange2": "कुंजी निकालने में विफल",
|
||||
"smchange3": "मिंटिंग कुंजी जोड़ने में विफल, यदि कुंजी अभी-अभी बनाई गई है तो कुछ ब्लॉक प्रतीक्षा करके पुनः जोड़ने का प्रयास करें",
|
||||
"smchange3": "मिंटिंग की जोड़ने में विफल",
|
||||
"smchange4": "प्रायोजन कुंजी नहीं बना सकता",
|
||||
"smchange5": "संबंध बनाना",
|
||||
"smchange6": "ब्लॉकचेन पर पुष्टि की प्रतीक्षा में",
|
||||
@ -405,8 +394,7 @@
|
||||
"wchange55": "आपकी मौजूदा पता पुस्तिका हटा दी जाएगी और बैकअप से नया बनाया जाएगा।",
|
||||
"wchange56": "चेतावनी!",
|
||||
"wchange57": "ज्ञापन",
|
||||
"wchange58": "नया पता",
|
||||
"wchange59": "सिक्का"
|
||||
"wchange58": "नया पता"
|
||||
},
|
||||
"tradepage": {
|
||||
"tchange1": "व्यापार पोर्टल",
|
||||
@ -509,7 +497,7 @@
|
||||
"nchange23": "मूल्य बेचें",
|
||||
"nchange24": "बिक्री के लिए कोई नाम नहीं",
|
||||
"nchange25": "बेचने के लिए नाम",
|
||||
"nchange26": "क्या आप वाकई यह नाम बेचना चाहते हैं? यदि नाम किसी अन्य खाते से खरीदा जाता है तो यह आपके नियंत्रण से बाहर हो जाएगा!",
|
||||
"nchange26": "क्या आप वाकई इस नाम को बेचना चाहते हैं?",
|
||||
"nchange27": "QORT में इस कीमत के लिए",
|
||||
"nchange28": "पुष्टि करें दबाने पर, विक्रय नाम अनुरोध भेजा जाएगा!",
|
||||
"nchange29": "रद्द करने के लिए नाम",
|
||||
@ -530,8 +518,7 @@
|
||||
"nchange44": "नए नाम से",
|
||||
"nchange45": "पुष्टि करें दबाने पर, नाम अद्यतन अनुरोध भेजा जाएगा!",
|
||||
"nchange46": "नाम बिक्री इतिहास",
|
||||
"nchange47": "नाम अद्यतन सफल!",
|
||||
"nchange48": "चेतावनी! यदि आप अपना नाम अपडेट करते हैं, तो आप मूल नाम से जुड़े संसाधनों को जब्त कर लेंगे। दूसरे शब्दों में, आप QDN में मूल नाम के तहत सामग्री का स्वामित्व खो देंगे। सावधानी से आगे बढ़ें!"
|
||||
"nchange47": "नाम अद्यतन सफल!"
|
||||
},
|
||||
"websitespage": {
|
||||
"schange1": "वेबसाइट ब्राउज़ करें",
|
||||
@ -612,8 +599,7 @@
|
||||
"schange39": "खोलें",
|
||||
"schange40": "पूर्वावलोकन",
|
||||
"schange41": "डाउनलोड हो रहा है कृपया प्रतीक्षा करें...",
|
||||
"schange42": "फ़ाइलें डाउनलोड की गईं",
|
||||
"schange43": "कोई भी डाउनलोड करने का प्रयास पृष्ठभूमि में जारी रहेगा, कृपया थोड़ी देर बाद पुनः प्रयास करें।"
|
||||
"schange42": "फ़ाइलें डाउनलोड की गईं"
|
||||
},
|
||||
"tubespage": {
|
||||
"schange1": "क्यू-ट्यूब ब्राउज़ करें",
|
||||
@ -735,14 +721,7 @@
|
||||
"bchange44": "क्या आप इस एप्लिकेशन को इस सूची से हटाने की अनुमति देते हैं?",
|
||||
"bchange45": "एन्क्रिप्ट",
|
||||
"bchange46": "क्या आप इस एप्लिकेशन को निम्न फ़ाइल सहेजने की अनुमति देते हैं",
|
||||
"bchange47": "तत्काल प्रकाशन - आवश्यक है",
|
||||
"bchange48": "क्या आप इस एप्लिकेशन को आपको सूचनाएं भेजने की अनुमति देते हैं",
|
||||
"bchange49": "क्या आप इस एप्लिकेशन को अपने वॉलेट की जानकारी प्राप्त करने की अनुमति देते हैं?",
|
||||
"bchange50": "इस ऐप ने आपकी सार्वजनिक प्रोफ़ाइल में बदलाव का अनुरोध किया है। संपत्ति: ",
|
||||
"bchange51": "परिवर्तन सबमिट करने के लिए 'अपडेट प्रोफ़ाइल' पर क्लिक करना न भूलें",
|
||||
"bchange52": "क्या आप इस एप्लिकेशन को अपने वॉलेट की जानकारी प्राप्त करने की अनुमति देते हैं?",
|
||||
"bchange53": "हमेशा अपनी मित्र सूची को सभी ऐप्स द्वारा स्वचालित रूप से पुनर्प्राप्त करने की अनुमति दें",
|
||||
"bchange54": "क्या आप इस एप्लिकेशन को अपनी मित्र सूची तक पहुंचने की अनुमति देते हैं?"
|
||||
"bchange47": "तत्काल प्रकाशन - आवश्यक है"
|
||||
},
|
||||
"datapage": {
|
||||
"dchange1": "डाटा प्रबंधन",
|
||||
@ -842,37 +821,13 @@
|
||||
"cchange74": "के साथ प्रतिक्रिया",
|
||||
"cchange75": "अटैचमेंट अपलोड हो रहा है। इसमें एक मिनट तक का समय लग सकता है।",
|
||||
"cchange76": "अनुलग्नक हटाया जा रहा है। इसमें एक मिनट तक का समय लग सकता है।",
|
||||
"cchange77": "अटैचमेंट का आकार 10 एमबी से अधिक है",
|
||||
"cchange77": "अटैचमेंट का आकार 1 एमबी से अधिक है",
|
||||
"cchange78": "क्या आप सुनिश्चित हैं कि आप इस चित्र को हटाना चाहते हैं?",
|
||||
"cchange79": "क्या आप वाकई इस अटैचमेंट को मिटाना चाहते हैं?",
|
||||
"cchange80": "इस चित्र को हटा दिया गया है",
|
||||
"cchange81": "यह छवि प्रकार समर्थित नहीं है",
|
||||
"cchange82": "यह संलग्नक हटा दिया गया है",
|
||||
"cchange90": "कोई संदेश नहीं",
|
||||
"cchange91": "भेजा जा रहा है...",
|
||||
"cchange92": "नीचे अपठित संदेश",
|
||||
"cchange93": "छवि क्लिपबोर्ड पर कॉपी की गई",
|
||||
"cchange94": "लोड किया गया",
|
||||
"cchange95": "केवल मेरे संसाधन",
|
||||
"cchange96": "समूह प्रबंधन खोलें",
|
||||
"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": "कुछ लिखें ..."
|
||||
"cchange90": "कोई संदेश नहीं"
|
||||
},
|
||||
"welcomepage": {
|
||||
"wcchange1": "क्यू-चैट में आपका स्वागत है",
|
||||
@ -964,19 +919,7 @@
|
||||
"gchange56": "खोजने के लिए समूह का नाम",
|
||||
"gchange57": "निजी समूह का नाम नहीं मिला",
|
||||
"gchange58": "ध्यान दें कि समूह का नाम सटीक मेल खाना चाहिए।",
|
||||
"gchange59": "टिकर दिखाएं / छुपाएं",
|
||||
"gchange60": "कृपया समूह का नाम दर्ज करें",
|
||||
"gchange61": "कृपया विवरण दर्ज करें",
|
||||
"gchange62": "क्या आप इस समूह को अपडेट करने के लिए सुनिश्चित हैं?",
|
||||
"gchange63": "पुष्टि करने पर UPDATE_GROUP अनुरोध भेजा जाएगा!",
|
||||
"gchange64": "वर्तमान मालिक /",
|
||||
"gchange65": "इस पते को समूह के स्थानांतरण स्वामित्व में बदलें!",
|
||||
"gchange66": "अमान्य मालिक/नए मालिक का पता",
|
||||
"gchange67": "समूह अद्यतन सफल!",
|
||||
"gchange68": "समूह अवतार सेट करें",
|
||||
"gchange69": "संदेश",
|
||||
"gchange70": "पिछले 24 घंटों में कोई संदेश नहीं!",
|
||||
"gchange71": "आप पहले ही इस समूह में शामिल हो चुके हैं!"
|
||||
"gchange59": "टिकर दिखाएं / छुपाएं"
|
||||
},
|
||||
"puzzlepage": {
|
||||
"pchange1": "पहेलि",
|
||||
@ -1031,16 +974,7 @@
|
||||
"nchange31": "स्टॉप नोड",
|
||||
"nchange32": "स्टॉप अनुरोध सफलतापूर्वक भेजा गया!",
|
||||
"nchange33": "नोड फिर से चालू करें",
|
||||
"nchange34": "रीस्टार्ट अनुरोध सफलतापूर्वक भेजा गया!",
|
||||
"nchange35": "स्टार्ट नोड",
|
||||
"nchange36": "सफलतापूर्वक प्रारंभ हुआ नोड!",
|
||||
"nchange37": "जारी रखें पर क्लिक करने से आपका Qortal Core ताज़ा हो जाएगा, आपका db हटा दिया जाएगा, और आप db की एक नई प्रति डाउनलोड कर लेंगे, जिसे “बूटस्ट्रैपिंग“ कहा जाएगा।",
|
||||
"nchange38": "एलटीसी वॉलेट की मरम्मत करें",
|
||||
"nchange39": "यह एलटीसी वॉलेट की मरम्मत करेगा जो एक शेष राशि दिखाता है जिसे खर्च नहीं किया जा सकता है। इसके लिए लाइटकॉइन नेटवर्क पर एक एकल लेनदेन करना आवश्यक है, पुष्टि के बाद वॉलेट शेष कार्यात्मक होगा और समस्या दोबारा नहीं होगी।",
|
||||
"nchange40": "इस लेन-देन पर एक छोटा LTC शुल्क लगेगा। जारी रखें?",
|
||||
"nchange41": "मरम्मत करने का प्रयास किया जा रहा है। कृपया प्रतीक्षा करें...",
|
||||
"nchange42": "एलटीसी वॉलेट की सफलतापूर्वक मरम्मत!",
|
||||
"nchange43": "LTC वॉलेट को सुधारने का प्रयास करते समय त्रुटि उत्पन्न हुई। कृपया पुनः प्रयास करें!"
|
||||
"nchange34": "रीस्टार्ट अनुरोध सफलतापूर्वक भेजा गया!"
|
||||
},
|
||||
"transpage": {
|
||||
"tchange1": "लेनदेन अनुरोध",
|
||||
@ -1075,16 +1009,7 @@
|
||||
"rewarddialog3": "यदि हाँ, तो आपको टकसाल करने के लिए नीचे दी गई कुंजी को सहेजना होगा। इसे आपकी ओर से टकसाल करने की अनुमति देने के लिए किसी भी नोड को आपूर्ति की जा सकती है।",
|
||||
"rewarddialog4": "कन्फर्म को दबाने पर, रिवॉर्डशेयर बनाया जाएगा, लेकिन खाते के साथ मिंट करने के लिए आपको अभी भी एक नोड को उपरोक्त कुंजी की आपूर्ति करने की आवश्यकता होगी।",
|
||||
"rewarddialog5": "आप खाते से जुड़े एक इनाम शेयर लेनदेन को हटा रहे हैं:",
|
||||
"rewarddialog6": "कन्फर्म दबाने पर, रिवॉर्डशेयर हटा दिया जाएगा और मिंटिंग की अमान्य हो जाएगी।",
|
||||
"deployAtdialog1": "आप एटी तैनात कर रहे हैं",
|
||||
"deployAtdialog2": "पुष्टि बटन दबाने पर, AT तैनात हो जाएगा!",
|
||||
"deployAtdialog3": "प्रारंभिक राशि शेष",
|
||||
"votedialog1": "आप नीचे दिए गए मतदान पर मतदान करने का अनुरोध कर रहे हैं:",
|
||||
"votedialog2": "कन्फ़र्म बटन दबाने पर वोट अनुरोध भेज दिया जाएगा!",
|
||||
"votedialog3": "आप नीचे पोल बनाने का अनुरोध कर रहे हैं:",
|
||||
"votedialog4": "मतदान विवरण",
|
||||
"votedialog5": "विकल्प",
|
||||
"votedialog6": "कन्फर्म दबाने पर पोल क्रिएट हो जाएगा!"
|
||||
"rewarddialog6": "कन्फर्म दबाने पर, रिवॉर्डशेयर हटा दिया जाएगा और मिंटिंग की अमान्य हो जाएगी।"
|
||||
},
|
||||
"sponsorshipspage": {
|
||||
"schange1": "सक्रिय प्रायोजन",
|
||||
@ -1215,9 +1140,7 @@
|
||||
"inf15": "सक्रिय ऑटो खरीद आदेश",
|
||||
"inf16": "ऑटो खरीदें",
|
||||
"inf17": "लाइट थीम पर स्विच करें",
|
||||
"inf18": "गहरे रंग वाली थीम पर स्विच करें",
|
||||
"inf19": "व्यापार सूचना",
|
||||
"inf20": "खरीदार"
|
||||
"inf18": "गहरे रंग वाली थीम पर स्विच करें"
|
||||
},
|
||||
"lotterypage": {
|
||||
"lot1": "ओपन क्वार्टरल लॉटरीज़",
|
||||
@ -1233,101 +1156,5 @@
|
||||
"lot11": "कोई खुली लॉटरी नहीं है!",
|
||||
"lot12": "कोई तैयार लॉटरी नहीं है!",
|
||||
"lot13": "खिलाड़ी"
|
||||
},
|
||||
"notifications": {
|
||||
"notify1": "लेन-देन की पुष्टि",
|
||||
"notify2": "लेन-देन की पुष्टि",
|
||||
"explanation": "आपका लेनदेन पुष्टि हो रहा है। इसकी प्रगति को ट्रैक करने के लिए, घंटी आइकन पर क्लिक करें।",
|
||||
"status1": "पूरी तरह से समन्वयित",
|
||||
"status2": "सिंक नहीं हुआ",
|
||||
"notify3": "कोई सूचनाएं नहीं",
|
||||
"notify4": "टीएक्स सूचनाएं"
|
||||
},
|
||||
"friends": {
|
||||
"friend1": "नाम जोड़ें",
|
||||
"friend2": "दोस्त जोड़ें",
|
||||
"friend3": "किसी मित्र को जोड़ने से आप उस व्यक्ति से आसानी से जुड़ सकते हैं। अपने प्रकाशित संसाधनों की होस्टिंग का समर्थन करने के लिए उस उपयोगकर्ता का अनुसरण करना भी सुनिश्चित करें।",
|
||||
"friend4": "टिप्पणियाँ",
|
||||
"friend5": "नाम का पालन करें",
|
||||
"friend6": "उपनाम",
|
||||
"friend7": "अपने मित्र को बेहतर ढंग से याद रखने के लिए एक उपनाम जोड़ें (वैकल्पिक)",
|
||||
"friend8": "क्यू-चैट भेजें",
|
||||
"friend9": "क्यू-मेल भेजें",
|
||||
"friend10": "मित्र संपादित करें",
|
||||
"friend11": "अगले",
|
||||
"friend12": "दोस्त",
|
||||
"friend13": "खिलाना",
|
||||
"friend14": "मित्र हटायें",
|
||||
"friend15": "फ़ीड सेटिंग",
|
||||
"friend16": "उन Q-ऐप्स का चयन करें जिनसे आप अपडेट चाहते हैं, विशेष रूप से वे जो आपके दोस्तों से संबंधित हैं।",
|
||||
"friend17": "आपके फ़ीड में कोई आइटम नहीं"
|
||||
},
|
||||
"save": {
|
||||
"saving1": "सहेजी गई सेटिंग लाने में असमर्थ",
|
||||
"saving2": "बचाने के लिए कुछ भी नहीं",
|
||||
"saving3": "सहेजे न गए परिवर्तन सहेजें",
|
||||
"saving4": "परिवर्तन पूर्ववत करें"
|
||||
},
|
||||
"profile": {
|
||||
"profile1": "आपका कोई नाम नहीं है",
|
||||
"profile2": "नाम पंजीकरण पर जाएँ",
|
||||
"profile3": "प्रोफ़ाइल अपडेट करें",
|
||||
"profile4": "टैगलाइन",
|
||||
"profile5": "जैव",
|
||||
"profile6": "वॉलेट पते",
|
||||
"profile7": "यूआई से भरें",
|
||||
"profile8": "कस्टम प्रॉपर्टी जोड़ें",
|
||||
"profile9": "संपत्ति का नाम",
|
||||
"profile10": "फ़ील्ड्स",
|
||||
"profile11": "फ़ील्ड जोड़ें",
|
||||
"profile12": "फ़ील्ड का नाम",
|
||||
"profile13": "फ़ील्ड मान",
|
||||
"profile14": "गतिविधि",
|
||||
"profile15": "कोई मूल्य नहीं",
|
||||
"profile16": "इस नाम की कोई प्रोफ़ाइल नहीं है",
|
||||
"profile17": "प्रोफ़ाइल लाने में असमर्थ",
|
||||
"profile18": "प्रोफ़ाइल खोलें",
|
||||
"profile19": "प्रोफ़ाइल नहीं लाया जा सकता",
|
||||
"profile20": "नाम पंजीकृत करें",
|
||||
"profile21": "यूआई से पता डालें",
|
||||
"profile22": "सफलता",
|
||||
"profile23": "एन्क्रिप्टेड",
|
||||
"profile24": "कस्टम प्रॉपर्टी जोड़ने के लिए आपको फ़ील्ड नाम और फ़ील्ड मान दोनों भरने होंगे",
|
||||
"profile25": "क्या आपका मित्र है",
|
||||
"profile26": "मित्र के रूप में जोड़ें"
|
||||
},
|
||||
"tour": {
|
||||
"tour1": "क्वार्टल का उपयोग करने के लिए, कोर को सिंक किया जाना चाहिए। सिंक होने पर यह आइकन नीले रंग में होगा।",
|
||||
"tour2": "सिंक किया गया",
|
||||
"tour3": "सिंक किया गया और ढाला गया",
|
||||
"tour4": "सिंकिंग",
|
||||
"tour5": "अपने कोर को सिंक करें",
|
||||
"tour6": "द अनस्टॉपेबल फ़ोर्स ऑफ़ क्वॉर्टल",
|
||||
"tour7": "केवल आप Qortal पर अपने डेटा को नियंत्रित करते हैं",
|
||||
"tour8": "क्वार्टल को हटाया नहीं जा सकता",
|
||||
"tour9": "पूरी तरह से पीयर-टू-पीयर, बिना किसी केंद्रीकृत मध्यस्थ के",
|
||||
"tour10": "यह डिफ़ॉल्ट टैब दृश्य है जहां आप महत्वपूर्ण Qortal सेटिंग्स और Q-ट्यूब जैसे Q-ऐप्स तक पहुंच सकते हैं।",
|
||||
"tour11": "पूर्ण अनुभव प्राप्त करें",
|
||||
"tour12": "पूर्ण क्वॉर्टल अनुभव प्राप्त करने के लिए, हम इस चेकलिस्ट का पालन करने की सलाह देते हैं।",
|
||||
"tour13": "आप पूरी तरह से सिंक हो गए हैं! अब आप Qortal ब्लॉकचेन की शक्ति का अनुभव कर सकते हैं।",
|
||||
"tour14": "आइए क्यू-ट्यूब पर जाने का प्रयास करें!",
|
||||
"tour15": "क्यू-ट्यूब पर जाएँ",
|
||||
"tour16": "चेकलिस्ट",
|
||||
"tour17": "कृपया Qortal ब्लॉकचेन तक पहुंचने के लिए कोर प्रारंभ करें।",
|
||||
"tour18": "रिफ्रेश (बूटस्ट्रैप)",
|
||||
"tour19": "वर्तमान में सिंक हो रहा है... आपको Qortal का उपयोग करने के लिए पूरी तरह से सिंक्रोनाइज़ होना चाहिए",
|
||||
"tour20": "पीछे ब्लॉक। क्या आप सिंकिंग प्रक्रिया को तेज करने के लिए रीफ्रेश (बूटस्ट्रैप) करना चाहेंगे?",
|
||||
"tour21": "ब्लॉक शेष हैं।",
|
||||
"tour22": "रिफ्रेश (बूटस्ट्रैप) का अनुरोध किया गया। कृपया प्रतीक्षा करें।"
|
||||
},
|
||||
"chatsettings": {
|
||||
"cs1": "चैट सेटिंग",
|
||||
"cs2": "सामान्य चैट सेटिंग",
|
||||
"cs3": "चैट संदेश टाइमस्टैम्प",
|
||||
"cs4": "समय पहले",
|
||||
"cs5": "स्थानीय समय",
|
||||
"cs6": "चैट संदेश फ़ॉन्ट आकार",
|
||||
"cs7": "मानक",
|
||||
"cs8": "px"
|
||||
}
|
||||
}
|
||||
}
|
@ -5,10 +5,8 @@
|
||||
"chinese1": "Kineski (Pojednostavljeni)",
|
||||
"chinese2": "Kineski (Traditionalni)",
|
||||
"croatian": "Hrvatski",
|
||||
"dutch": "Holandski",
|
||||
"english": "Engleski",
|
||||
"estonian": "Estonski",
|
||||
"finnish": "Finski",
|
||||
"french": "Francuski",
|
||||
"german": "Njemački",
|
||||
"hindi": "Hindi",
|
||||
@ -96,33 +94,33 @@
|
||||
"address": "Adresa",
|
||||
"password": "Lozinka",
|
||||
"youraccounts": "Tvoji računi",
|
||||
"clickto": "Pritisnite račun za prijavu",
|
||||
"clickto": "Kliknite svoj račun da biste se prijavili s njim",
|
||||
"needcreate": "Morate stvoriti ili spremiti račun prije nego što se možete prijaviti!",
|
||||
"upload": "Uvezite datoteku sigurnosne kopije Qortal",
|
||||
"upload": "Prenesite Qortal sigurnosnu kopiju",
|
||||
"howlogin": "Kako biste se željeli prijaviti?",
|
||||
"seed": "Seed fraza",
|
||||
"seedphrase": "seedphrase",
|
||||
"saved": "Sačuvani račun",
|
||||
"qora": "QORA Adresa Seed",
|
||||
"backup": "Qortal backup datoteka",
|
||||
"decrypt": "Dešifrirajte datoteku sigurnosne kopije",
|
||||
"qora": "Qora Adresa Seed",
|
||||
"backup": "Qortal sigurnosna kopija novčanika",
|
||||
"decrypt": "Decrypt sigurnosna kopija",
|
||||
"save": "Spremite u ovom pregledniku",
|
||||
"prepare": "Pripremite vaš račun",
|
||||
"areyousure": "Jeste li sigurni da želite ukloniti ovaj novčanik iz spremljenih novčanika? (Ako se ukloni, a ne postoji datoteka sigurnosne kopije, račun bi mogao biti zauvijek izgubljen! Provjerite imate li datoteku sigurnosne kopije prije nego to učinite!)",
|
||||
"areyousure": "Jeste li sigurni da želite ukloniti ovaj novčanik od spremljenih novčanika?",
|
||||
"error1": "Sigurnosna kopija mora biti valjan JSON",
|
||||
"error2": "Opcija prijave nije odabrana",
|
||||
"createwelcome": "Dobrodošli u Qortal! Vaša decentralizirana digitalna budućnost čeka na vas! Samo na Qortalu imate apsolutnu kontrolu nad svojim podacima. Qortal pruža osnovnu razinu novog digitalnog svijeta koji u potpunosti kontrolira korisnik.",
|
||||
"createwelcome": "Dobro došli u Qortal, naći ćete da je sličan onome RPG igre, vi, kao MINTER na Qortal mreži (ako se odlučite da postanete), imat ćete priliku za dizanjem vašeg računa, dajući vam oboje i QORT blok nagrade i također veći utjecaj na mrežu u smislu glasovanja o odlukama za platformu.",
|
||||
"createa": "A",
|
||||
"click": "Kliknite da vidite Seed frazu",
|
||||
"confirmpass": "Potvrdi lozinku",
|
||||
"willbe": "će se nasumično generirati u pozadini. Ako želite POGLEDATI početnu frazu, kliknite označenu 'seedphrase' u ovom tekstu. Ovo se koristi kao vaš generator privatnog ključa za vaš blockchain račun u Qortalu. Za sigurnost prema zadanim postavkama, početne fraze se ne prikazuju osim ako nije posebno odabrano da budu.",
|
||||
"willbe": "će se slučajno generirati u pozadini. To se koristi kao vaš generator privatnog ključa za vaš blockchain račun u Qortal-u.",
|
||||
"clicknext": "Stvorite Qortal račun klikom na SLJEDEĆE ispod.",
|
||||
"ready": "Vaš račun je sada spreman za izradu. Bit će spremljen unutar ove kopije Qortal korisničkog sučelja prema zadanim postavkama, u šifriranom obliku. Ako ne želite da se vaš novi račun ovdje spremi, možete poništiti okvir ispod. I dalje ćete se moći prijaviti sa svojim novim računom (nakon što se odjavite), koristeći datoteku sigurnosne kopije novčanika koju MORATE preuzeti nakon što kreirate svoj račun.",
|
||||
"ready": "Vaš je račun sada spreman za izradu. Bit će spremljen u ovom pregledniku. Ako ne želite da vaš novi račun bude spremljen u vašem pregledniku, možete poništiti okvir u nastavku. I dalje ćete se moći prijaviti svojim novim računom (nakon odjave), pomoću datoteke sigurnosna kopija novčanika koju morate preuzeti nakon što stvorite svoj račun.",
|
||||
"welmessage": "Dobrodošli u Qortal",
|
||||
"pleaseenter": "Unesite lozinku!",
|
||||
"notmatch": "Lozinke se ne podudaraju!",
|
||||
"lessthen8": "Vaša lozinka je manja od 5 znakova! Ovo se ne preporučuje. Možete nastaviti ignorirati ovo upozorenje..",
|
||||
"lessthen8-2": "Vaša lozinka je manja od 5 znakova!",
|
||||
"lessthen8": "Vaša lozinka je manja od 8 znakova! Ovo se ne preporučuje. Možete nastaviti ignorirati ovo upozorenje..",
|
||||
"lessthen8-2": "Vaša lozinka je manja od 8 znakova!",
|
||||
"entername": "Unesite ime!",
|
||||
"downloaded": "Vaša datoteka sigurnosne kopije novčanika - preuzmite!",
|
||||
"loading": "Učitava se, molimo pričekajte...",
|
||||
@ -134,7 +132,7 @@
|
||||
"created1": "Vaš je račun sada stvoren",
|
||||
"created2": "i bit će spremljen u ovom pregledniku.",
|
||||
"downloadbackup": "Preuzmite datoteku sigurnosne kopije novčanika",
|
||||
"passwordhint": "Lozinka mora imati najmanje 5 znakova.",
|
||||
"passwordhint": "Lozinka mora imati najmanje 8 znakova.",
|
||||
"lp1": "Zaključani zaslon",
|
||||
"lp2": "Nije postavljena lozinka za zaključavanje zaslona!",
|
||||
"lp3": "Molimo postavite jedan",
|
||||
@ -164,7 +162,7 @@
|
||||
},
|
||||
"fragfile": {
|
||||
"selectfile": "Odaberite datoteku",
|
||||
"dragfile": "Povucite i ispustite ili kliknite ovdje za odabir datoteke sigurnosne kopije"
|
||||
"dragfile": "Povucite i ispustite sigurnosnu kopiju ovdje"
|
||||
},
|
||||
"settings": {
|
||||
"generalinfo": "Opće informacije o računu",
|
||||
@ -181,8 +179,9 @@
|
||||
"notifications": "Obavijesti",
|
||||
"accountsecurity": "Sigurnost računa",
|
||||
"password": "Lozinka",
|
||||
"download": "Izvezi/spremi datoteku sigurnosne kopije",
|
||||
"download": "Preuzmite sigurnosnu kopiju računa",
|
||||
"choose": "Odaberite lozinku za šifriranje sigurnosne kopije. (Ovo može biti ista kao i ona sa kojom ste se prijavili ili različita)",
|
||||
"block": "Blok obavijesti (uskoro dolaze ...)",
|
||||
"playsound": "Puštanje zvuka",
|
||||
"shownotifications": "Prikaži obavijesti",
|
||||
"nodeurl": "URL čvora",
|
||||
@ -201,20 +200,12 @@
|
||||
"snack3": "Uspješno dodan i spremljen prilagođeni čvor",
|
||||
"snack4": "Čvorovi su uspješno spremljeni kao",
|
||||
"snack5": "Čvorovi su uspješno uvezeni",
|
||||
"snack6": "Uspješno uklonjen prilagođeni čvor",
|
||||
"snack7": "Uspješno uređen prilagođeni čvor",
|
||||
"exp1": "Izvezi privatni glavni ključ",
|
||||
"exp2": "Glavni ključ izvoza",
|
||||
"exp3": "Izvoz",
|
||||
"exp4": "Odaberite novčanik za sigurnosnu kopiju privatnog glavnog ključa.",
|
||||
"core": "Pokreni osnovne postavke",
|
||||
"qappNotification1": "Obavijesti Q-App",
|
||||
"selectnode": "Molimo odaberite opciju",
|
||||
"arrr1": "Novčanik ARRR nije inicijaliziran!",
|
||||
"arrr2": "Idite na karticu novčanika i prvo inicijalizirajte svoj arrr novčanik.",
|
||||
"arrr3": "Potrebno je ažuriranje jezgre!",
|
||||
"arrr4": "Da biste spremili privatni ključ vašeg arrr novčanika, prvo trebate ažurirati jezgru!",
|
||||
"sync_indicator": "Onemogući skočni prozor indikatora sinkronizacije"
|
||||
"qappNotification1": "Obavijesti Q-App"
|
||||
},
|
||||
"appinfo": {
|
||||
"blockheight": "Visina bloka",
|
||||
@ -248,9 +239,7 @@
|
||||
"balance": "Kreditna",
|
||||
"balances": "VAŠ NOVČANIK JE NA SALJU",
|
||||
"update": "AŽURIRAJTE STANJE NOVČANIKA",
|
||||
"view": "Pogled",
|
||||
"all": "svi",
|
||||
"page": "Stranica"
|
||||
"view": "Pogled"
|
||||
},
|
||||
"gifs": {
|
||||
"gchange1": "Gif Explorer",
|
||||
@ -405,8 +394,7 @@
|
||||
"wchange55": "Vaš postojeći adresar bit će izbrisan i novi će se stvoriti iz sigurnosne kopije.",
|
||||
"wchange56": "UPOZORENJE!",
|
||||
"wchange57": "Dopis",
|
||||
"wchange58": "Nova Adresa",
|
||||
"wchange59": "Kovanica"
|
||||
"wchange58": "Nova Adresa"
|
||||
},
|
||||
"tradepage": {
|
||||
"tchange1": "Portal razmjene",
|
||||
@ -509,7 +497,7 @@
|
||||
"nchange23": "Prodajna cijena",
|
||||
"nchange24": "Nema imena za prodaju",
|
||||
"nchange25": "Ime za prodaju",
|
||||
"nchange26": "Jeste li sigurni da želite prodati ovo ime? Ako je ime kupljeno putem drugog računa, bit će izvan vaše kontrole!",
|
||||
"nchange26": "Jeste li sigurni da ćete prodati ovo ime?",
|
||||
"nchange27": "Za ovu cijenu u QORT",
|
||||
"nchange28": "Pritiskom na potvrdu, zahtjev za prodajnim imenom bit će poslan!",
|
||||
"nchange29": "Ime za poništavanje",
|
||||
@ -530,8 +518,7 @@
|
||||
"nchange44": "Na novo ime",
|
||||
"nchange45": "Kada pritisnete potvrdu, bit će poslan zahtjev za ažuriranje imena!",
|
||||
"nchange46": "Povijest prodaje imena",
|
||||
"nchage47": "Ažuriranje imena uspješno!",
|
||||
"nchange48": "Upozorenje! Ako ažurirate svoje ime, izgubit ćete resurse povezane s izvornim imenom. Drugim riječima, izgubit ćete vlasništvo nad sadržajem pod izvornim imenom u QDN-u. Nastavite s oprezom!"
|
||||
"nchage47": "Ažuriranje imena uspješno!"
|
||||
},
|
||||
"websitespage": {
|
||||
"schange1": "Pregledavanje web stranica",
|
||||
@ -612,8 +599,7 @@
|
||||
"schange39": "Otvori",
|
||||
"schange40": "Pregled",
|
||||
"schange41": "Preuzimanje, molimo pričekajte...",
|
||||
"schange42": "Preuzete datoteke",
|
||||
"schange43": "Svaka pokušaja preuzimanja nastavit će se u pozadini, pokušajte ponovno nakon nekog vremena."
|
||||
"schange42": "Preuzete datoteke"
|
||||
},
|
||||
"tubespage": {
|
||||
"schange1": "Pregledaj Q-Tubes",
|
||||
@ -735,14 +721,7 @@
|
||||
"bchange44": "Dajete li ovoj aplikaciji dopuštenje za brisanje s ovog popisa?",
|
||||
"bchange45": "Šifriraj",
|
||||
"bchange46": "Dajete li ovoj aplikaciji dopuštenje za spremanje sljedeće datoteke",
|
||||
"bchange47": "Trenutno objavljivanje - zahtijeva",
|
||||
"bchange48": "Dajete li ovoj aplikaciji dopuštenje da vam šalje obavijesti",
|
||||
"bchange49": "Dajete li ovoj aplikaciji dopuštenje da dobije podatke o vašem novčaniku?",
|
||||
"bchange50": "Ova aplikacija je zatražila promjenu vašeg javnog profila. Svojstvo: ",
|
||||
"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?"
|
||||
"bchange47": "Trenutno objavljivanje - zahtijeva"
|
||||
},
|
||||
"datapage": {
|
||||
"dchange1": "Upravljanje podacima",
|
||||
@ -842,37 +821,13 @@
|
||||
"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 10 MB",
|
||||
"cchange77": "Veličina privitka premašuje 1 MB",
|
||||
"cchange78": "Jeste li sigurni da želite izbrisati ovu sliku?",
|
||||
"cchange79": "Jeste li sigurni da želite izbrisati ovaj privitak?",
|
||||
"cchange80": "Ova slika je izbrisana",
|
||||
"cchange81": "Ova vrsta slike nije podržana",
|
||||
"cchange82": "Ovaj privitak je izbrisan",
|
||||
"cchange90": "Nema poruka",
|
||||
"cchange91": "Slanje...",
|
||||
"cchange92": "Nepročitane poruke ispod",
|
||||
"cchange93": "Slika kopirana u međuspremnik",
|
||||
"cchange94": "učitano",
|
||||
"cchange95": "Samo moji resursi",
|
||||
"cchange96": "Otvoreno upravljanje grupom",
|
||||
"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 ..."
|
||||
"cchange90": "Nema poruka"
|
||||
},
|
||||
"welcomepage": {
|
||||
"wcchange1": "Dobrodošli u Q-Čavrljanje",
|
||||
@ -964,19 +919,7 @@
|
||||
"gchange56": "Naziv grupe za pretraživanje",
|
||||
"gchange57": "Ime privatne grupe nije pronađeno",
|
||||
"gchange58": "Imajte na umu da se naziv grupe mora točno podudarati.",
|
||||
"gchange59": "Prikaži / sakrij ticker",
|
||||
"gchange60": "Unesite naziv grupe",
|
||||
"gchange61": "Unesite opis",
|
||||
"gchange62": "Jeste li sigurni da AŽURIRATE ovu grupu?",
|
||||
"gchange63": "Pritiskom na CONFIRM, zahtjev za UPDATE_GROUP bit će poslan!",
|
||||
"gchange64": "Trenutni vlasnik / novi vlasnik",
|
||||
"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",
|
||||
"gchange69": "Poruke",
|
||||
"gchange70": "Nema poruka u zadnja 24 sata!",
|
||||
"gchange71": "Već ste se pridružili ovoj grupi!"
|
||||
"gchange59": "Prikaži / sakrij ticker"
|
||||
},
|
||||
"puzzlepage": {
|
||||
"pchange1": "Zagonetke",
|
||||
@ -1031,16 +974,7 @@
|
||||
"nchange31": "Zaustavi čvor",
|
||||
"nchange32": "Uspješno poslan zahtjev za zaustavljenje!",
|
||||
"nchange33": "Ponovo pokreni čvor",
|
||||
"nchange34": "Uspješno poslan zahtjev za ponovnim pokretanjem!",
|
||||
"nchange35": "Početni čvor",
|
||||
"nchange36": "Uspješno pokrenut čvor!",
|
||||
"nchange37": "Klikom na nastavak osvježit će se vaša Qortal Core, vaša baza podataka bit će uklonjena, a vi ćete preuzeti novu kopiju baze podataka, koja se zove bootstrapping.",
|
||||
"nchange38": "Popravi LTC novčanik",
|
||||
"nchange39": "Ovo će popraviti LTC novčanike koji pokazuju saldo koji se ne može potrošiti. Zahtijeva jednu transakciju da se izvrši na mreži Litecoin, nakon potvrde saldo novčanika će biti funkcionalan i problem se neće ponoviti.",
|
||||
"nchange40": "Ova transakcija će potrošiti malu LTC naknadu. Nastaviti?",
|
||||
"nchange41": "Pokušavam popraviti. Molimo pričekajte...",
|
||||
"nchange42": "Uspješno popravljen LTC novčanik!",
|
||||
"nchange43": "Došlo je do pogreške prilikom pokušaja popravka LTC novčanika. Pokušajte ponovo!"
|
||||
"nchange34": "Uspješno poslan zahtjev za ponovnim pokretanjem!"
|
||||
},
|
||||
"transpage": {
|
||||
"tchange1": "Zahtjev za transakciju",
|
||||
@ -1075,16 +1009,7 @@
|
||||
"rewarddialog3": "Ako je odgovor da, morat ćete spremiti donji ključ kako biste ga mogli iskovati. Može se dostaviti bilo kojem čvoru kako bi mu se omogućilo kovanje u vaše ime.",
|
||||
"rewarddialog4": "Pritiskom na Potvrdi, bit će stvorena dijeljenje nagrade, ali ćete i dalje morati dostaviti gornji ključ čvoru kako biste mogli kovati s računom.",
|
||||
"rewarddialog5": "Uklanjate transakciju dijeljenja nagrade povezanu s računom:",
|
||||
"rewarddialog6": "Pritiskom na potvrdu, dijeljenje nagrade bit će uklonjeno, a ključ za kovanje postat će nevažeći.",
|
||||
"deployAtdialog1": "Uvodite AT",
|
||||
"deployAtdialog2": "Pritiskom na potvrdu, AT će biti postavljen!",
|
||||
"deployAtdialog3": "Početni iznos stanja",
|
||||
"votedialog1": "Tražite da glasate u anketi ispod:",
|
||||
"votedialog2": "Pritiskom na potvrdu, zahtjev za glasovanje bit će poslan!",
|
||||
"votedialog3": "Tražite izradu ankete ispod:",
|
||||
"votedialog4": "Opis ankete",
|
||||
"votedialog5": "Mogućnosti",
|
||||
"votedialog6": "Pritiskom na potvrdu, anketa će biti kreirana!"
|
||||
"rewarddialog6": "Pritiskom na potvrdu, dijeljenje nagrade bit će uklonjeno, a ključ za kovanje postat će nevažeći."
|
||||
},
|
||||
"sponsorshipspage": {
|
||||
"schange1": "Aktivna sponzorstva",
|
||||
@ -1215,9 +1140,7 @@
|
||||
"inf15": "Aktivne automatske narudžbe za kupnju",
|
||||
"inf16": "Automatska kupnja",
|
||||
"inf17": "Prebaci na svijetlu temu",
|
||||
"inf18": "Prebaci na tamnu temu",
|
||||
"inf19": "Informacije o trgovini",
|
||||
"inf20": "Kupac"
|
||||
"inf18": "Prebaci na tamnu temu"
|
||||
},
|
||||
"lotterypage": {
|
||||
"lot1": "Otvorene Qortal lutrije",
|
||||
@ -1233,101 +1156,5 @@
|
||||
"lot11": "Nema otvorenih lutrija!",
|
||||
"lot12": "Nema završenih lutrija!",
|
||||
"lot13": "Igrači"
|
||||
},
|
||||
"notifications": {
|
||||
"notify1": "Potvrđivanje transakcije",
|
||||
"notify2": "Transakcija potvrđena",
|
||||
"explanation": "Vaša se transakcija potvrđuje. Da biste pratili napredak, kliknite na ikonu zvona.",
|
||||
"status1": "Potpuno sinkronizirano",
|
||||
"status2": "Nije sinkronizirano",
|
||||
"notify3": "Nema obavijesti",
|
||||
"notify4": "Tx obavijesti"
|
||||
},
|
||||
"friends": {
|
||||
"friend1": "Dodajte ime",
|
||||
"friend2": "Dodaj prijatelja",
|
||||
"friend3": "Dodavanje prijatelja omogućuje vam jednostavno povezivanje s tom osobom. Obavezno također pratite tog korisnika kako biste podržali hosting njihovih objavljenih izvora.",
|
||||
"friend4": "Bilješke",
|
||||
"friend5": "Slijedite ime",
|
||||
"friend6": "Alias",
|
||||
"friend7": "Dodajte pseudonim da bolje zapamtite svog prijatelja (nije obavezno)",
|
||||
"friend8": "Pošalji Q-Chat",
|
||||
"friend9": "Pošalji Q-Mail",
|
||||
"friend10": "Uredi prijatelja",
|
||||
"friend11": "Praćenje",
|
||||
"friend12": "Prijatelji",
|
||||
"friend13": "Hraniti se",
|
||||
"friend14": "Ukloni prijatelja",
|
||||
"friend15": "Postavke feeda",
|
||||
"friend16": "Odaberite Q-aplikacije iz kojih želite ažuriranja, posebno one koje se odnose na vaše prijatelje.",
|
||||
"friend17": "Nema stavki u vašem feedu"
|
||||
},
|
||||
"save": {
|
||||
"saving1": "Nije moguće dohvatiti spremljene postavke",
|
||||
"saving2": "Ništa za spasiti",
|
||||
"saving3": "Spremi nespremljene promjene",
|
||||
"saving4": "Poništi promjene"
|
||||
},
|
||||
"profile": {
|
||||
"profile1": "Nemate ime",
|
||||
"profile2": "Idi na registraciju imena",
|
||||
"profile3": "Ažuriraj profil",
|
||||
"profile4": "Slogan",
|
||||
"profile5": "Bio",
|
||||
"profile6": "Adrese novčanika",
|
||||
"profile7": "Ispunite iz korisničkog sučelja",
|
||||
"profile8": "Dodaj prilagođeno svojstvo",
|
||||
"profile9": "Naziv svojstva",
|
||||
"profile10": "Polja",
|
||||
"profile11": "Dodaj polje",
|
||||
"profile12": "Naziv polja",
|
||||
"profile13": "Vrijednost polja",
|
||||
"profile14": "Aktivnost",
|
||||
"profile15": "Nema vrijednosti",
|
||||
"profile16": "Ovo ime nema profil",
|
||||
"profile17": "Nije moguće dohvatiti profil",
|
||||
"profile18": "Otvori profil",
|
||||
"profile19": "Ne mogu dohvatiti profil",
|
||||
"profile20": "Registriraj ime",
|
||||
"profile21": "Umetni adresu iz korisničkog sučelja",
|
||||
"profile22": "Uspjeh",
|
||||
"profile23": "šifrirano",
|
||||
"profile24": "Morate ispuniti i naziv polja i vrijednost polja da biste dodali prilagođeno svojstvo",
|
||||
"profile25": "Je li vaš prijatelj",
|
||||
"profile26": "Dodaj kao prijatelja"
|
||||
},
|
||||
"tour": {
|
||||
"tour1": "Da biste koristili Qortal, Core mora biti sinkroniziran. Ova ikona će biti plava kada se sinkronizira.",
|
||||
"tour2": "Sinkronizirano",
|
||||
"tour3": "Sinkronizirano i kovano",
|
||||
"tour4": "Sinkronizacija",
|
||||
"tour5": "Sinkroniziraj svoju jezgru",
|
||||
"tour6": "Nezaustavljiva sila Qortala",
|
||||
"tour7": "Samo vi kontrolirate svoje podatke na Qortalu",
|
||||
"tour8": "Qortal se ne može skinuti",
|
||||
"tour9": "Potpuno peer-to-peer bez centraliziranih posrednika",
|
||||
"tour10": "Ovo je zadani prikaz kartice gdje možete pristupiti važnim Qortal postavkama i Q-aplikacijama kao što je Q-Tube.",
|
||||
"tour11": "Doživite potpuno iskustvo",
|
||||
"tour12": "Da biste dobili potpuno Qortal iskustvo, preporučujemo da slijedite ovaj kontrolni popis.",
|
||||
"tour13": "Potpuno ste sinkronizirani! Sada možete iskusiti snagu Qortal blockchaina.",
|
||||
"tour14": "Pokušajmo posjetiti Q-Tube!",
|
||||
"tour15": "Posjetite Q-Tube",
|
||||
"tour16": "Kontrolni popis",
|
||||
"tour17": "Molimo pokrenite Core za pristup Qortal blockchainu.",
|
||||
"tour18": "Osvježi (bootstrap)",
|
||||
"tour19": "Trenutno se sinkronizira... morate biti potpuno sinkronizirani da biste koristili Qortal",
|
||||
"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"
|
||||
}
|
||||
}
|
||||
}
|
@ -5,10 +5,8 @@
|
||||
"chinese1": "Kínai (Egyszerűsített)",
|
||||
"chinese2": "Kínai (Hagyományos)",
|
||||
"croatian": "Horvát",
|
||||
"dutch": "Németalföldi",
|
||||
"english": "Angol",
|
||||
"estonian": "Észt",
|
||||
"finnish": "Finn",
|
||||
"french": "Francia",
|
||||
"german": "Német",
|
||||
"hindi": "Hindi",
|
||||
@ -80,7 +78,7 @@
|
||||
"tm32": "Ez a fiók nem követ egyetlen felhasználót sem",
|
||||
"tm33": "Importálás lap menü",
|
||||
"tm34": "Exportálás lap menü",
|
||||
"tm35": "A meglévő lapmenü törlésre kerül, és az importált lapmenü lesz.",
|
||||
"tm35": "Meglévő lapmenüje törlésre kerül, és a feltöltött lapok menüje lesz.",
|
||||
"tm36": "A lap menüje sikeresen visszaállítva",
|
||||
"tm37": "A lap menüje sikeresen mentve másként",
|
||||
"tm38": "DEV MODE",
|
||||
@ -96,7 +94,7 @@
|
||||
"address": "Cím",
|
||||
"password": "Jelszó",
|
||||
"youraccounts": "Fiókjai",
|
||||
"clickto": "Kattintson a fiókra a bejelentkezéshez",
|
||||
"clickto": "Kattintson a fiókjára a bejelentkezéshez",
|
||||
"needcreate": "A bejelentkezés előtt létre kell hoznia vagy mentenie kell egy fiókot!",
|
||||
"upload": "A Qortal biztonsági másolat feltöltése",
|
||||
"howlogin": "Hogyan szertne bejelentkezni?",
|
||||
@ -108,21 +106,21 @@
|
||||
"decrypt": "Visszafejt biztonsági másolat",
|
||||
"save": "Mentés ebben a böngészőben.",
|
||||
"prepare": "Fiók előkészítése",
|
||||
"areyousure": "Biztosan eltávolítja ezt a pénztárcát a mentett pénztárcák közül? (Ha eltávolítja, és nem létezik biztonsági mentési fájl, a fiók végleg elveszhet! Győződjön meg róla, hogy van biztonsági másolata, mielőtt ezt megtenné!)",
|
||||
"areyousure": "Biztosan el akarja távolítani ezt a pénztárcát a mentett pénztárcákból?",
|
||||
"error1": "A biztonsági másolatnak érvényes JSONnak kell lennie",
|
||||
"error2": "Bejelentkezési beállítás nincs kijelölve",
|
||||
"createwelcome": "Üdvözöljük a Qortalban! Decentralizált digitális jövője várja Önt! A Qortalon csak Önnek van abszolút ellenőrzése az adatok felett. A Qortal egy új, teljes mértékben felhasználó által vezérelt digitális világ alapszintjét biztosítja.",
|
||||
"createwelcome": "Üdvözöljük a Qortalban, úgy fogja találni, hogy hasonló az RPG játékhoz. Mint a Qortal hálózat verője (ha úgy dönt, hogy eggyé válik), lehetősége lesz arra, hogy kiegyenlítse fiókját. Ez mind a QORT blokk jutalmát, mind a nagyobb befolyást biztosítja a hálózatra a platformra vonatkozó döntésekről szóló szavazás tekintetében.",
|
||||
"createa": "A",
|
||||
"click": "Kattintson ide a magfrázis megtekintéséhez",
|
||||
"confirmpass": "Jelszó megerősítése",
|
||||
"willbe": "véletlenszerűen generálódik a háttérben. Ha meg szeretné tekinteni az alapkifejezést, kattintson a kiemelt „seedphrase”-ra ebben a szövegben. Ezt használja a privát kulcs generátoraként a blokklánc-fiókjához a Qortalban. Alapértelmezés szerint a biztonság kedvéért a kezdőmondatok nem jelennek meg, hacsak nincs külön kiválasztva.",
|
||||
"willbe": "Véletlenszerűen jön létre a háttérben. Ezt használják a Qortal blokklánc-fiókjához tartozó privát kulcsgenerátorként.",
|
||||
"clicknext": "Qortal-fiók létrehozása az alábbi TOVÁBB/NEXT gombra kattintva",
|
||||
"ready": "Fiókja készen áll a létrehozásra. Alapértelmezés szerint a Qortal felhasználói felület ezen példányába kerül mentésre, titkosított formában. Ha nem szeretné, hogy új fiókja itt kerüljön mentésre, törölje a jelet az alábbi négyzetből. Továbbra is be tud majd jelentkezni az új fiókjával (kijelentkezés után), a pénztárca biztonsági mentési fájljával, amelyet a fiók létrehozása után KELL letöltenie.",
|
||||
"ready": "Fiókja készen áll a létrehozására. Ez a böngészőben lesz mentve.Ha nem szeretné, hogy új fiókját a böngészőbe mentse, törölje a jelet az alábbi jelölőnégyzetből. Továbbra is bejelentkezhet az új fiókjával (kijelentkezés után), a pénztárca biztonsági mentési fájljával, amelyet le kell töltenie a fiók létrehozása után.",
|
||||
"welmessage": "Üdvözöljük a Qortalban",
|
||||
"pleaseenter": "Kérjük, adjon meg egy jelszót!",
|
||||
"notmatch": "A jelszavak nem egyeznek!",
|
||||
"lessthen8": "A jelszó kevesebb, mint 5 karakter! Ez nem ajánlott. Továbbra is figyelmen kívül hagyhatja ezt a figyelmeztetést.",
|
||||
"lessthen8-2": "A jelszó kevesebb, mint 5 karakter!",
|
||||
"lessthen8": "A jelszó kevesebb, mint 8 karakter! Ez nem ajánlott. Továbbra is figyelmen kívül hagyhatja ezt a figyelmeztetést.",
|
||||
"lessthen8-2": "A jelszó kevesebb, mint 8 karakter!",
|
||||
"entername": "Adjon meg egy nevet!",
|
||||
"downloaded": "Letöltődött a Wallet BackUp fájl!",
|
||||
"loading": "Betöltés, kérjük, várjon...",
|
||||
@ -134,7 +132,7 @@
|
||||
"created1": "A fiók most jön létre",
|
||||
"created2": " és mentésre kerül ebben a böngészőben.",
|
||||
"downloadbackup": "Pénztárca biztonsági mentési fájl letöltése",
|
||||
"passwordhint": "A jelszónak legalább 5 karakterből kell állnia.",
|
||||
"passwordhint": "A jelszónak legalább 8 karakterből kell állnia.",
|
||||
"lp1": "Képernyőzár",
|
||||
"lp2": "Nincs beállítva a lezárási képernyő jelszava!",
|
||||
"lp3": "Kérjük, állítson be egyet",
|
||||
@ -164,7 +162,7 @@
|
||||
},
|
||||
"fragfile": {
|
||||
"selectfile": "Fájl kijelölése",
|
||||
"dragfile": "Húzza át vagy kattintson ide a biztonsági mentési fájl kiválasztásához"
|
||||
"dragfile": "Biztonsági mentés húzása ide"
|
||||
},
|
||||
"settings": {
|
||||
"generalinfo": "Általános fiókadatok",
|
||||
@ -181,8 +179,9 @@
|
||||
"notifications": "Értesítések",
|
||||
"accountsecurity": "Fiók biztonsága",
|
||||
"password": "Jelszó",
|
||||
"download": "Biztonsági másolat fájl exportálása/mentése",
|
||||
"download": "Biztonságimásolat-fájl letöltése",
|
||||
"choose": "Válasszon egy jelszót a biztonsági mentés titkosításához. (Ez lehet ugyanaz, mint az, amelyikbe bejelentkezett, vagy más)",
|
||||
"block": "Értesítések blokkolása (hamarosan...)",
|
||||
"playsound": "Hang lejátszása",
|
||||
"shownotifications": "Értesítések megjelenítése",
|
||||
"nodeurl": "Csomópont URL-címe",
|
||||
@ -201,20 +200,12 @@
|
||||
"snack3": "Az egyéni csomópont sikeresen hozzáadva és mentve",
|
||||
"snack4": "A csomópontok sikeresen mentve másként",
|
||||
"snack5": "A csomópontok sikeresen importálva",
|
||||
"snack6": "Egyéni csomópont sikeresen eltávolítva",
|
||||
"snack7": "Egyéni csomópont sikeresen szerkesztve",
|
||||
"exp1": "Privát főkulcs exportálása",
|
||||
"exp2": "Főkulcs exportálása",
|
||||
"exp3": "Exportálás",
|
||||
"exp4": "Kérjük, válasszon egy tárcát a privát főkulcs biztonsági mentéséhez.",
|
||||
"core": "Alapbeállítások indítása",
|
||||
"qappNotification1": "Q-App értesítések",
|
||||
"selectnode": "Kérjük, válasszon egy lehetőséget",
|
||||
"arrr1": "ARRR Wallet nincs inicializálva!",
|
||||
"arrr2": "Kérjük, lépjen a Wallet fülre, és nyissa meg az ARRR pénztárcát a pénztárca inicializálásához.",
|
||||
"arrr3": "Alapfrissítésre van szükség!",
|
||||
"arrr4": "Az arrr pénztárca privát kulcsának mentéséhez először egy alapvető frissítésre van szükség!",
|
||||
"sync_indicator": "Szinkronizálásjelző előugró ablak letiltása"
|
||||
"qappNotification1": "Q-App értesítések"
|
||||
},
|
||||
"appinfo": {
|
||||
"blockheight": "Blokk Magassága",
|
||||
@ -248,9 +239,7 @@
|
||||
"balance": "Hitel",
|
||||
"balances": "A PÉNZTÁRCSA EGYENLEGEK",
|
||||
"update": "FRISSÍTSE A PÉNZTÁRCSA-EGYENLEGEKET",
|
||||
"view": "Kilátás",
|
||||
"all": "Minden",
|
||||
"page": "Oldal"
|
||||
"view": "Kilátás"
|
||||
},
|
||||
"gifs": {
|
||||
"gchange1": "Gif Explorer",
|
||||
@ -286,7 +275,7 @@
|
||||
"startminting": {
|
||||
"smchange1": "Nem lehet lekérni a pénzverési számlákat",
|
||||
"smchange2": "Nem sikerült eltávolítani a kulcsot",
|
||||
"smchange3": "Nem sikerült hozzáadni a pénzverési kulcsot. Ha a kulcs most jött létre, várjon néhány blokkot, majd adja hozzá újra",
|
||||
"smchange3": "Nem sikerült hozzáadni a pénzverési kulcsot",
|
||||
"smchange4": "Nem hozható létre szponzori kulcs",
|
||||
"smchange5": "Kapcsolatteremtés",
|
||||
"smchange6": "Megerősítésre vár a blokkláncon",
|
||||
@ -405,8 +394,7 @@
|
||||
"wchange55": "Meglévő címjegyzéke törlésre kerül, és a biztonsági másolatból új jön létre.",
|
||||
"wchange56": "FIGYELEM!",
|
||||
"wchange57": "Memo",
|
||||
"wchange58": "Új Cím",
|
||||
"wchange59": "Érme"
|
||||
"wchange58": "Új Cím"
|
||||
},
|
||||
"tradepage": {
|
||||
"tchange1": "Kereskedelmi Portál",
|
||||
@ -509,7 +497,7 @@
|
||||
"nchange23": "Eladási ár",
|
||||
"nchange24": "Nincsenek eladható nevek",
|
||||
"nchange25": "Eladó név",
|
||||
"nchange26": "Biztos, hogy el akarja adni ezt a nevet? Ha a nevet egy másik fiók vásárolja meg, az nem lesz ellenőrzése!",
|
||||
"nchange26": "Biztosan eladja ezt a nevet?",
|
||||
"nchange27": "Erre az árra QORT-ban",
|
||||
"nchange28": "A megerősítés megnyomására elküldjük az eladási névkérést!",
|
||||
"nchange29": "Megszakítandó név",
|
||||
@ -530,8 +518,7 @@
|
||||
"nchange44": "Az új névre",
|
||||
"nchange45": "A megerősítés megnyomására a névfrissítési kérés elküldésre kerül!",
|
||||
"nchange46": "Név eladási előzmények",
|
||||
"nchange47": "A névfrissítés sikeres!",
|
||||
"nchange48": "Figyelem! Ha frissíti a nevét, elveszíti az eredeti névhez társított erőforrásokat. Más szóval, elveszíti a tartalom tulajdonjogát a QDN-ben az eredeti név alatt. Óvatosan járjon el!"
|
||||
"nchange47": "A névfrissítés sikeres!"
|
||||
},
|
||||
"websitespage": {
|
||||
"schange1": "Webhelyek Böngészése",
|
||||
@ -612,8 +599,7 @@
|
||||
"schange39": "Nyitva",
|
||||
"schange40": "Előnézet",
|
||||
"schange41": "Letöltés, kérem várjon...",
|
||||
"schange42": "Fájlok letöltve",
|
||||
"schange43": "Minden letöltési kísérlet a háttérben folytatódik. Kérjük, próbálja újra egy idő után."
|
||||
"schange42": "Fájlok letöltve"
|
||||
},
|
||||
"tubespage": {
|
||||
"schange1": "Tallózás a Q-Tubes",
|
||||
@ -735,14 +721,7 @@
|
||||
"bchange44": "Engedélyezi ennek az alkalmazásnak, hogy töröljön erről a listáról?",
|
||||
"bchange45": "Titkosítás",
|
||||
"bchange46": "Engedélyezi ennek az alkalmazásnak a következő fájl mentését",
|
||||
"bchange47": "Azonnali közzététel – szükséges",
|
||||
"bchange48": "Engedélyezi ennek az alkalmazásnak, hogy értesítéseket küldjön Önnek",
|
||||
"bchange49": "Engedélyt ad ennek az alkalmazásnak, hogy megszerezze a pénztárca adatait?",
|
||||
"bchange50": "Ez az alkalmazás módosítást kért nyilvános profiljában. Tulajdonság: ",
|
||||
"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?"
|
||||
"bchange47": "Azonnali közzététel – szükséges"
|
||||
},
|
||||
"datapage": {
|
||||
"dchange1": "Adatkezelés",
|
||||
@ -842,37 +821,13 @@
|
||||
"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 10 MB-ot",
|
||||
"cchange77": "A melléklet mérete meghaladja az 1 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",
|
||||
"cchange81": "Ez a képtípus nem támogatott",
|
||||
"cchange82": "Ez a melléklet törölve lett",
|
||||
"cchange90": "Nincs üzenet",
|
||||
"cchange91": "Küldés...",
|
||||
"cchange92": "Olvasatlan üzenetek lent",
|
||||
"cchange93": "A kép a vágólapra másolva",
|
||||
"cchange94": "betöltve",
|
||||
"cchange95": "Csak az én erőforrásaim",
|
||||
"cchange96": "Nyitott csoportkezelés",
|
||||
"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 ..."
|
||||
"cchange90": "Nincs üzenet"
|
||||
},
|
||||
"welcomepage": {
|
||||
"wcchange1": "Üdvözöljük a Q-Chathoz",
|
||||
@ -964,19 +919,7 @@
|
||||
"gchange56": "A keresendő csoport neve",
|
||||
"gchange57": "A privát csoport neve nem található",
|
||||
"gchange58": "Ne feledje, hogy a csoport nevének pontosan meg kell egyeznie.",
|
||||
"gchange59": "Ticker megjelenítése / elrejtése",
|
||||
"gchange60": "Kérjük, adja meg a csoport nevét",
|
||||
"gchange61": "Kérjük, adja meg a leírást",
|
||||
"gchange62": "Biztosan FRISSÍTI ezt a csoportot?",
|
||||
"gchange63": "A MEGERŐSÍTÉS gomb megnyomásával elküldésre kerül a UPDATE_GROUP kérés!",
|
||||
"gchange64": "Jelenlegi tulajdonos / Új tulajdonos",
|
||||
"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",
|
||||
"gchange69": "Üzenetek",
|
||||
"gchange70": "Nincs üzenet az elmúlt 24 órában!",
|
||||
"gchange71": "Már csatlakoztál ehhez a csoporthoz!"
|
||||
"gchange59": "Ticker megjelenítése / elrejtése"
|
||||
},
|
||||
"puzzlepage": {
|
||||
"pchange1": "Rejtvények",
|
||||
@ -1031,16 +974,7 @@
|
||||
"nchange31": "Csomópont Leállítás",
|
||||
"nchange32": "Sikeresen Elküldött Stop Kérés!",
|
||||
"nchange33": "Csomópont Újraindítása",
|
||||
"nchange34": "Sikeresen Elküldött Újraindítási Kérés!",
|
||||
"nchange35": "Csomópont indítása",
|
||||
"nchange36": "A csomópont sikeresen elindítva!",
|
||||
"nchange37": "A tovább gombra kattintva frissíti a Qortal Core-t, a DB-je eltávolítva lesz, és letölti a db új példányát, az úgynevezett bootstrappinget.",
|
||||
"nchange38": "LTC pénztárca javítása",
|
||||
"nchange39": "Ez javítja azokat az LTC pénztárcákat, amelyek nem költhető egyenleget mutatnak. Egyetlen tranzakciót kell végrehajtani a Litecoin hálózaton, a megerősítést követően a pénztárca egyenlege működőképes lesz, és a probléma nem fog megismétlődni.",
|
||||
"nchange40": "Ez a tranzakció egy kis LTC-díjat fog felemelni. Folytatja?",
|
||||
"nchange41": "Javítani próbál. Kérjük, várjon...",
|
||||
"nchange42": "Az LTC Wallet sikeresen megjavítva!",
|
||||
"nchange43": "Hiba történt az LTC pénztárca javítása közben. Kérjük, próbálja újra!"
|
||||
"nchange34": "Sikeresen Elküldött Újraindítási Kérés!"
|
||||
},
|
||||
"transpage": {
|
||||
"tchange1": "Tranzakciós Kérelem",
|
||||
@ -1075,16 +1009,7 @@
|
||||
"rewarddialog3": "Ha igen, mentenie kell az alábbi kulcsot a mentéshez. Bármely csomóponthoz eljuttatható, hogy lehetővé tegye az Ön nevében.",
|
||||
"rewarddialog4": "A megerősítés megnyomására a jutalommegosztás létrejön, de a fenti kulcsot továbbra is meg kell adnia egy csomópontnak, hogy hozzáférjen a fiókhoz.",
|
||||
"rewarddialog5": "Ön a következő fiókhoz társított jutalommegosztási tranzakciót távolít el:",
|
||||
"rewarddialog6": "A megerősítés megnyomására a jutalommegosztás törlődik, és a pénzverési kulcs érvénytelenné válik.",
|
||||
"deployAtdialog1": "Ön telepíti az AT-t",
|
||||
"deployAtdialog2": "A megerősítés megnyomására az AT telepítésre kerül!",
|
||||
"deployAtdialog3": "Kezdő összeg egyenleg",
|
||||
"votedialog1": "Az alábbi szavazásra kérsz szavazást:",
|
||||
"votedialog2": "A megerősítés megnyomására a szavazás elküldésre kerül!",
|
||||
"votedialog3": "Az alábbi szavazás létrehozását kéri:",
|
||||
"votedialog4": "Szavazás leírása",
|
||||
"votedialog5": "Lehetőségek",
|
||||
"votedialog6": "A megerősítés megnyomására a szavazás létrejön!"
|
||||
"rewarddialog6": "A megerősítés megnyomására a jutalommegosztás törlődik, és a pénzverési kulcs érvénytelenné válik."
|
||||
},
|
||||
"sponsorshipspage": {
|
||||
"schange1": "Aktív szponzorálás",
|
||||
@ -1215,9 +1140,7 @@
|
||||
"inf15": "Aktív automatikus vásárlási megbízások",
|
||||
"inf16": "Automatikus vásárlás",
|
||||
"inf17": "Váltás világos témára",
|
||||
"inf18": "Váltás sötét témára",
|
||||
"inf19": "Kereskedelmi információ",
|
||||
"inf20": "Vevő"
|
||||
"inf18": "Váltás sötét témára"
|
||||
},
|
||||
"lotterypage": {
|
||||
"lot1": "Open Qortal lottó",
|
||||
@ -1233,101 +1156,5 @@
|
||||
"lot11": "Nincsenek nyílt lottójátékok!",
|
||||
"lot12": "Nincsenek kész lottójátékok!",
|
||||
"lot13": "Játékosok"
|
||||
},
|
||||
"notifications": {
|
||||
"notify1": "Tranzakció megerősítése",
|
||||
"notify2": "Tranzakció megerősítve",
|
||||
"explanation": "Tranzakciója megerősítés alatt áll. A folyamat nyomon követéséhez kattintson a csengő ikonra.",
|
||||
"status1": "Teljesen szinkronizálva",
|
||||
"status2": "Nincs szinkronizálva",
|
||||
"notify3": "Nincsenek értesítések",
|
||||
"notify4": "Tx értesítések"
|
||||
},
|
||||
"friends": {
|
||||
"friend1": "Név hozzáadása",
|
||||
"friend2": "Ismerős hozzáadása",
|
||||
"friend3": "Ha hozzáad egy barátot, akkor könnyedén kapcsolatba léphet vele. Ügyeljen arra is, hogy kövesse az adott felhasználót, hogy támogassa közzétett forrásai tárolását.",
|
||||
"friend4": "Megjegyzések",
|
||||
"friend5": "Kövesse a nevet",
|
||||
"friend6": "Álnév",
|
||||
"friend7": "Adjon hozzá aliast, hogy jobban emlékezzen barátjára (opcionális)",
|
||||
"friend8": "Q-Chat küldése",
|
||||
"friend9": "Q-Mail küldése",
|
||||
"friend10": "Ismerős szerkesztése",
|
||||
"friend11": "Következő",
|
||||
"friend12": "Barátok",
|
||||
"friend13": "Takarmány",
|
||||
"friend14": "Barát eltávolítása",
|
||||
"friend15": "Hírcsatorna beállításai",
|
||||
"friend16": "Válassza ki azokat a Q-alkalmazásokat, amelyekről frissítéseket szeretne, különösen azokat, amelyek a barátaival kapcsolatosak.",
|
||||
"friend17": "Nincsenek tételek a hírcsatornában"
|
||||
},
|
||||
"save": {
|
||||
"saving1": "Nem sikerült lekérni a mentett beállításokat",
|
||||
"saving2": "Nincs mit menteni",
|
||||
"saving3": "Mentse a nem mentett változtatásokat",
|
||||
"saving4": "Változtatások visszavonása"
|
||||
},
|
||||
"profile": {
|
||||
"profile1": "Nincs neved",
|
||||
"profile2": "Ugrás a névregisztrációhoz",
|
||||
"profile3": "Profil frissítése",
|
||||
"profile4": "Tagline",
|
||||
"profile5": "Életrajz",
|
||||
"profile6": "pénztárca címei",
|
||||
"profile7": "Kitöltés a felhasználói felületről",
|
||||
"profile8": "Egyéni tulajdonság hozzáadása",
|
||||
"profile9": "Tulajdon neve",
|
||||
"profile10": "Mezők",
|
||||
"profile11": "Mező hozzáadása",
|
||||
"profile12": "Mező neve",
|
||||
"profile13": "Mező értéke",
|
||||
"profile14": "Tevékenység",
|
||||
"profile15": "Nincs érték",
|
||||
"profile16": "Ennek a névnek nincs profilja",
|
||||
"profile17": "Nem sikerült lekérni a profilt",
|
||||
"profile18": "Profil megnyitása",
|
||||
"profile19": "Nem sikerült lekérni a profilt",
|
||||
"profile20": "Regisztrációs név",
|
||||
"profile21": "Cím beszúrása a felhasználói felületről",
|
||||
"profile22": "Siker",
|
||||
"profile23": "titkosított",
|
||||
"profile24": "Egyéni tulajdonság hozzáadásához ki kell töltenie a mező nevét és értékét egyaránt",
|
||||
"profile25": "A barátod",
|
||||
"profile26": "Hozzáadás ismerősként"
|
||||
},
|
||||
"tour": {
|
||||
"tour1": "A Qortal használatához a Core-t szinkronizálni kell. Szinkronizáláskor ez az ikon kék színű lesz.",
|
||||
"tour2": "Szinkronizálva",
|
||||
"tour3": "Szinkronizálás és pénzverés",
|
||||
"tour4": "Szinkronizálás",
|
||||
"tour5": "A mag szinkronizálása",
|
||||
"tour6": "Qortal megállíthatatlan ereje",
|
||||
"tour7": "Csak Ön kezeli adatait a Qortalon",
|
||||
"tour8": "A Qortal nem szedhető le",
|
||||
"tour9": "Teljesen peer-to-peer központosított közvetítők nélkül",
|
||||
"tour10": "Ez az alapértelmezett lapnézet, ahol elérheti a fontos Qortal-beállításokat és Q-alkalmazásokat, például a Q-Tube.",
|
||||
"tour11": "Szerezze meg a teljes élményt",
|
||||
"tour12": "A teljes Qortal-élmény megszerzéséhez javasoljuk, hogy kövesse ezt az ellenőrző listát.",
|
||||
"tour13": "Teljesen szinkronizálva vagy! Most megtapasztalhatod a Qortal blokklánc erejét.",
|
||||
"tour14": "Próbáljuk meg felkeresni a Q-Tube-t!",
|
||||
"tour15": "Látogassa meg a Q-Tube-t",
|
||||
"tour16": "Ellenőrző lista",
|
||||
"tour17": "Kérjük, indítsa el a Core-t a Qortal blokklánc eléréséhez.",
|
||||
"tour18": "Frissítés (bootstrap)",
|
||||
"tour19": "Jelenleg szinkronizálás folyamatban... a Qortal használatához teljesen szinkronizáltnak kell lennie",
|
||||
"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"
|
||||
}
|
||||
}
|
||||
}
|
@ -5,10 +5,8 @@
|
||||
"chinese1": "Cinese (semplificato)",
|
||||
"chinese2": "Cinese (tradizionale)",
|
||||
"croatian": "Croato",
|
||||
"dutch": "Olandese",
|
||||
"english": "Inglese",
|
||||
"estonian": "Estone",
|
||||
"finnish": "Finlandese",
|
||||
"french": "Francese",
|
||||
"german": "Tedesco",
|
||||
"hindi": "Hindi",
|
||||
@ -80,7 +78,7 @@
|
||||
"tm32": "Questo account non segue nessun utente",
|
||||
"tm33": "Menu scheda Importa",
|
||||
"tm34": "Menu scheda Esporta",
|
||||
"tm35": "Il menu della scheda esistente verrà eliminato e impostato sul menu della scheda importato.",
|
||||
"tm35": "Il menu della scheda esistente verrà eliminato e impostato sul menu della scheda caricato.",
|
||||
"tm36": "Menu scheda ripristinato con successo",
|
||||
"tm37": "Menu scheda salvato con successo con nome",
|
||||
"tm38": "MODALITÀ SVILUPPATORE",
|
||||
@ -96,7 +94,7 @@
|
||||
"address": "Indirizzo",
|
||||
"password": "Password",
|
||||
"youraccounts": "I tuoi account",
|
||||
"clickto": "Fare clic su account per accedere",
|
||||
"clickto": "Fai clic sul tuo account per accedere con esso",
|
||||
"needcreate": "Devi creare o salvare un account prima di poter accedere!",
|
||||
"upload": "Carica il tuo backup di Qortal",
|
||||
"howlogin": "Come vorresti accedere?",
|
||||
@ -108,21 +106,21 @@
|
||||
"decrypt": "Decifra backup",
|
||||
"save": "Salva in questo browser.",
|
||||
"prepare": "Preparazione del tuo account",
|
||||
"areyousure": "Sei sicuro di voler rimuovere questo portafoglio dai portafogli salvati? (Se rimosso e non esiste alcun file di backup, l'account potrebbe essere perso per sempre! Assicurati di avere un file di backup prima di farlo!)",
|
||||
"areyousure": "Sei sicuro di voler rimuovere questo portafoglio dai portafogli salvati?",
|
||||
"error1": "Il backup deve essere un JSON valido",
|
||||
"error2": "Opzione di accesso non selezionata",
|
||||
"createwelcome": "Benvenuti a Qortal! Il tuo futuro digitale decentralizzato ti aspetta! Su Qortal solo tu hai il controllo assoluto sui tuoi dati. Qortal fornisce il livello base di un mondo digitale nuovo e completamente controllato dall'utente.",
|
||||
"createwelcome": "Benvenuto in Qortal, lo troverai simile a quello di un gioco di ruolo, tu, come minatore della rete Qortal (se scegli di diventarlo) avrai la possibilità di aumentare di livello il tuo account, incrementando sia le ricompense per blocco e anche l'influenza sulla rete in termini di voto sulle decisioni per la piattaforma.",
|
||||
"createa": "A",
|
||||
"click": "Clicca per visualizzare la seedphrase",
|
||||
"confirmpass": "Conferma password",
|
||||
"willbe": "verrà generato casualmente in background. Se desideri VISUALIZZARE la frase seme, fai clic sulla 'frase seme' evidenziata in questo testo. Questo viene utilizzato come generatore di chiave privata per il tuo account blockchain in Qortal. Per motivi di sicurezza, per impostazione predefinita, le frasi iniziali non vengono visualizzate a meno che non venga specificatamente scelto di esserlo.",
|
||||
"willbe": "sarà generato casualmente in background. Questo è usato come generatore di chiavi private per il tuo account sulla blockchain di Qortal.",
|
||||
"clicknext": "Crea il tuo account Qortal facendo clic su AVANTI di seguito.",
|
||||
"ready": "Il tuo account è ora pronto per essere creato. Verrà salvato all'interno di questa copia dell'interfaccia utente Qortal per impostazione predefinita, in formato crittografato. Se non desideri che il tuo nuovo account venga salvato qui, puoi deselezionare la casella sottostante. Potrai comunque accedere con il tuo nuovo account (dopo esserti disconnesso), utilizzando il file di backup del tuo portafoglio che DEVI scaricare una volta creato il tuo account.",
|
||||
"ready": "Il tuo account è ora pronto per essere creato. Verrà salvato in questo browser. Se non desideri che il tuo nuovo account venga salvato nel tuo browser, puoi deselezionare la casella qui sotto. Sarai comunque in grado di accedere con il tuo nuovo account (dopo il logout), utilizzando il file di backup del tuo portafoglio che DEVI scaricare una volta creato il tuo account.",
|
||||
"welmessage": "Benvenuto in Qortal",
|
||||
"pleaseenter": "Inserisci una password!",
|
||||
"notmatch": "La password non corrisponde!",
|
||||
"lessthen8": "La tua password contiene meno di 5 caratteri! Questo non è raccomandato. Puoi continuare e ignorare questo avviso.",
|
||||
"lessthen8-2": "La tua password contiene meno di 5 caratteri!",
|
||||
"lessthen8": "La tua password contiene meno di 8 caratteri! Questo non è raccomandato. Puoi continuare e ignorare questo avviso.",
|
||||
"lessthen8-2": "La tua password contiene meno di 8 caratteri!",
|
||||
"entername": "Inserisci un nome!",
|
||||
"downloaded": "Il file di BackUp del Tuo Wallet file sta per essere scaricato!",
|
||||
"loading": "Caricamento in corso, attendere...",
|
||||
@ -134,7 +132,7 @@
|
||||
"created1": "Il tuo account è ora creato",
|
||||
"created2": " e verrà salvato in questo browser.",
|
||||
"downloadbackup": "Scarica il file di backup del portafoglio",
|
||||
"passwordhint": "Una password deve contenere almeno 5 caratteri.",
|
||||
"passwordhint": "Una password deve contenere almeno 8 caratteri.",
|
||||
"lp1": "Blocca schermo",
|
||||
"lp2": "Nessuna password per la schermata di blocco impostata!",
|
||||
"lp3": "Per favore impostane uno",
|
||||
@ -183,6 +181,7 @@
|
||||
"password": "Password",
|
||||
"download": "Scarica il file di backup",
|
||||
"choose": "Scegli una password con cui crittare il tuo backup. (Può essere uguale a quella con cui hai effettuato l'accesso o diversa)",
|
||||
"block": "Notifiche di blocco (in arrivo...)",
|
||||
"playsound": "Riproduci suono",
|
||||
"shownotifications": "Mostra notifiche",
|
||||
"nodeurl": "URL nodo",
|
||||
@ -201,20 +200,12 @@
|
||||
"snack3": "Nodo personalizzato aggiunto e salvato con successo",
|
||||
"snack4": "Nodi salvati con successo come",
|
||||
"snack5": "Nodi importati correttamente",
|
||||
"snack6": "Nodo personalizzato rimosso con successo",
|
||||
"snack7": "Nodo personalizzato modificato correttamente",
|
||||
"exp1": "Esporta chiave master privata",
|
||||
"exp2": "Esporta chiave master",
|
||||
"exp3": "Esporta",
|
||||
"exp4": "Scegli un portafoglio per il backup della chiave master privata.",
|
||||
"core": "Avvia impostazioni principali",
|
||||
"qappNotification1": "Notifiche Q-App",
|
||||
"selectnode": "Seleziona un'opzione",
|
||||
"arrr1": "Portafoglio ARRR non inizializzato!",
|
||||
"arrr2": "Vai alla scheda Portafoglio e inizializza prima il tuo portafoglio arrr.",
|
||||
"arrr3": "È necessario l'aggiornamento del core!",
|
||||
"arrr4": "Per salvare la chiave privata del tuo portafoglio arrr devi prima aggiornare il core!",
|
||||
"sync_indicator": "Disabilita il popup dell'indicatore di sincronizzazione"
|
||||
"qappNotification1": "Notifiche Q-App"
|
||||
},
|
||||
"appinfo": {
|
||||
"blockheight": "Altezza blocco",
|
||||
@ -248,9 +239,7 @@
|
||||
"balance": "Saldo",
|
||||
"balances": "I SALDI DEL TUO PORTAFOGLIO",
|
||||
"update": "AGGIORNA I SALDI DEL PORTAFOGLIO",
|
||||
"view": "Vedere",
|
||||
"all": "Tutto",
|
||||
"page": "Pagina"
|
||||
"view": "Vedere"
|
||||
},
|
||||
"gifs": {
|
||||
"gchange1": "Esplora Gif",
|
||||
@ -286,7 +275,7 @@
|
||||
"startminting": {
|
||||
"smchange1": "Impossibile recuperare i conti di conio",
|
||||
"smchange2": "Impossibile rimuovere la chiave",
|
||||
"smchange3": "Failed to add minting key, if key was just created try waiting a few blocks and adding again",
|
||||
"smchange3": "Impossibile aggiungere la chiave di conio",
|
||||
"smchange4": "Impossibile creare la chiave di sponsorizzazione",
|
||||
"smchange5": "Creare relazione",
|
||||
"smchange6": "In attesa di conferma su blockchain",
|
||||
@ -405,8 +394,7 @@
|
||||
"wchange55": "La tua rubrica esistente verrà eliminata e dal backup verrà creata una nuova.",
|
||||
"wchange56": "AVVERTIMENTO!",
|
||||
"wchange57": "Memo",
|
||||
"wchange58": "Nuovo Indirizzo",
|
||||
"wchange59": "Moneta"
|
||||
"wchange58": "Nuovo Indirizzo"
|
||||
},
|
||||
"tradepage": {
|
||||
"tchange1": "Portale commerciale",
|
||||
@ -509,7 +497,7 @@
|
||||
"nchange23": "Prezzo di vendita",
|
||||
"nchange24": "Nessun nome da vendere",
|
||||
"nchange25": "Nome da vendere",
|
||||
"nchange26": "Sei sicuro di voler vendere questo nome? Se il nome viene acquistato da un altro account sarà fuori dal tuo controllo!",
|
||||
"nchange26": "Sei sicuro di vendere questo nome?",
|
||||
"nchange27": "Per questo prezzo in QORT",
|
||||
"nchange28": "Premendo conferma, verrà inviata la richiesta di vendita del nome!",
|
||||
"nchange29": "Nome da cancellare",
|
||||
@ -530,8 +518,7 @@
|
||||
"nchange44": "Al nuovo nome",
|
||||
"nchange45": "Premendo conferma, verrà inviata la richiesta di aggiornamento del nome!",
|
||||
"nchange46": "Nome Cronologia vendite",
|
||||
"nchange47": "Aggiornamento nome riuscito!",
|
||||
"nchange48": "Attenzione! Se aggiorni il tuo nome, perderai le risorse associate al nome originale. In altre parole, perderai la proprietà del contenuto sotto il nome originale nel QDN. Procedi con cautela!"
|
||||
"nchange47": "Aggiornamento nome riuscito!"
|
||||
},
|
||||
"websitespage": {
|
||||
"schange1": "Sfoglia siti Web",
|
||||
@ -612,8 +599,7 @@
|
||||
"schange39": "Apri",
|
||||
"schange40": "Anteprima",
|
||||
"schange41": "Download in corso, attendere...",
|
||||
"schange42": "File scaricati",
|
||||
"schange43": "Qualsiasi tentativo di download continuerà in background, riprova dopo un po."
|
||||
"schange42": "File scaricati"
|
||||
},
|
||||
"tubespage": {
|
||||
"schange1": "Sfoglia Q-Tubes",
|
||||
@ -735,14 +721,7 @@
|
||||
"bchange44": "Concedi a questa applicazione il permesso di eliminare da questo elenco?",
|
||||
"bchange45": "Cripta",
|
||||
"bchange46": "Concedi a questa applicazione il permesso di salvare il seguente file",
|
||||
"bchange47": "Pubblicazione istantanea - richiede",
|
||||
"bchange48": "Concedi a questa applicazione il permesso di inviarti notifiche",
|
||||
"bchange49": "Concedi a questa applicazione il permesso di ottenere informazioni sul tuo portafoglio?",
|
||||
"bchange50": "Questa app ha richiesto una modifica al tuo profilo pubblico. Proprietà: ",
|
||||
"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?"
|
||||
"bchange47": "Pubblicazione istantanea - richiede"
|
||||
},
|
||||
"datapage": {
|
||||
"dchange1": "Gestione dati",
|
||||
@ -842,37 +821,13 @@
|
||||
"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 10 MB",
|
||||
"cchange77": "La dimensione dell'allegato supera 1 MB",
|
||||
"cchange78": "Sei sicuro di voler eliminare questa immagine?",
|
||||
"cchange79": "Sei sicuro di voler eliminare questo allegato?",
|
||||
"cchange80": "Questa immagine è stata cancellata",
|
||||
"cchange81": "Questo tipo di immagine non è supportato",
|
||||
"cchange82": "Questo allegato è stato eliminato",
|
||||
"cchange90": "Nessun messaggio",
|
||||
"cchange91": "Invio in corso...",
|
||||
"cchange92": "Messaggi non letti qui sotto",
|
||||
"cchange93": "Immagine copiata negli appunti",
|
||||
"cchange94": "caricato",
|
||||
"cchange95": "Solo le mie risorse",
|
||||
"cchange96": "Apri gestione gruppo",
|
||||
"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 ..."
|
||||
"cchange90": "Nessun messaggio"
|
||||
},
|
||||
"welcomepage": {
|
||||
"wcchange1": "Benvenuto in Q-Chat",
|
||||
@ -964,19 +919,7 @@
|
||||
"gchange56": "Nome gruppo da cercare",
|
||||
"gchange57": "Nome gruppo privato non trovato",
|
||||
"gchange58": "Nota che il nome del gruppo deve corrispondere esattamente.",
|
||||
"gchange59": "Mostra / Nascondi ticker",
|
||||
"gchange60": "Inserisci il nome del gruppo",
|
||||
"gchange61": "Si prega di inserire la descrizione",
|
||||
"gchange62": "Sei sicuro di AGGIORNARE questo gruppo?",
|
||||
"gchange63": "Premendo CONFERMA, verrà inviata la richiesta UPDATE_GROUP!",
|
||||
"gchange64": "Proprietario attuale / Nuovo proprietario",
|
||||
"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",
|
||||
"gchange69": "Messaggi",
|
||||
"gchange70": "Nessun messaggio nelle ultime 24 ore!",
|
||||
"gchange71": "Ti sei già unito a questo gruppo!"
|
||||
"gchange59": "Mostra / Nascondi ticker"
|
||||
},
|
||||
"puzzlepage": {
|
||||
"pchange1": "Puzzle",
|
||||
@ -1031,16 +974,7 @@
|
||||
"nchange31": "Arresta nodo",
|
||||
"nchange32": "Richiesta di arresto inviata con successo!",
|
||||
"nchange33": "Riavvia nodo",
|
||||
"nchange34": "Richiesta di riavvio inviata con successo!",
|
||||
"nchange35": "Nodo iniziale",
|
||||
"nchange36": "Nodo avviato con successo!",
|
||||
"nchange37": "Cliccando su continua si aggiornerà il tuo Qortal Core, il tuo db verrà rimosso e scaricherai una nuova copia del db, chiamata bootstrap.",
|
||||
"nchange38": "Ripara il portafoglio LTC",
|
||||
"nchange39": "Questo riparerà i portafogli LTC che mostrano un saldo che non può essere speso. Richiede che venga effettuata una singola transazione sulla rete Litecoin, dopo la conferma il saldo del portafoglio sarà funzionante e il problema non si ripeterà.",
|
||||
"nchange40": "Questa transazione consumerà una piccola commissione LTC. Continuare?",
|
||||
"nchange41": "Tentativo di riparazione. Attendi prego...",
|
||||
"nchange42": "Portafoglio LTC riparato con successo!",
|
||||
"nchange43": "Si è verificato un errore durante il tentativo di riparare il portafoglio LTC. Riprova!"
|
||||
"nchange34": "Richiesta di riavvio inviata con successo!"
|
||||
},
|
||||
"transpage": {
|
||||
"tchange1": "Richiesta di transazione",
|
||||
@ -1075,16 +1009,7 @@
|
||||
"rewarddialog3": "Se sì, dovrai salvare la chiave qui sotto per coniare. Può essere fornito a qualsiasi nodo per consentirne il conio per tuo conto.",
|
||||
"rewarddialog4": "Premendo conferma, verrà creata la condivisione del premio, ma dovrai comunque fornire la chiave sopra a un nodo per coniare con l'account.",
|
||||
"rewarddialog5": "Stai rimuovendo una transazione di quota premio associata all'account:",
|
||||
"rewarddialog6": "Premendo conferma, la condivisione del premio verrà rimossa e la chiave di conio non sarà più valida.",
|
||||
"deployAtdialog1": "Stai distribuendo l'AT",
|
||||
"deployAtdialog2": "Premendo conferma, l'AT verrà schierato!",
|
||||
"deployAtdialog3": "Saldo importo iniziale",
|
||||
"votedialog1": "Stai richiedendo di votare per il sondaggio qui sotto:",
|
||||
"votedialog2": "Premendo conferma, la richiesta di voto verrà inviata!",
|
||||
"votedialog3": "Stai richiedendo di creare il sondaggio qui sotto:",
|
||||
"votedialog4": "Descrizione sondaggio",
|
||||
"votedialog5": "Opzioni",
|
||||
"votedialog6": "Premendo conferma, il sondaggio verrà creato!"
|
||||
"rewarddialog6": "Premendo conferma, la condivisione del premio verrà rimossa e la chiave di conio non sarà più valida."
|
||||
},
|
||||
"sponsorshipspage": {
|
||||
"schange1": "Sponsorizzazioni attive",
|
||||
@ -1215,9 +1140,7 @@
|
||||
"inf15": "Ordini di acquisto automatico attivi",
|
||||
"inf16": "Acquisto automatico",
|
||||
"inf17": "Passa al tema chiaro",
|
||||
"inf18": "Passa al tema scuro",
|
||||
"inf19": "Informazioni commerciali",
|
||||
"inf20": "Acquirente"
|
||||
"inf18": "Passa al tema scuro"
|
||||
},
|
||||
"lotterypage": {
|
||||
"lot1": "Apri le lotterie Qortal",
|
||||
@ -1233,101 +1156,5 @@
|
||||
"lot11": "Non ci sono lotterie aperte!",
|
||||
"lot12": "Non ci sono lotterie finite!",
|
||||
"lot13": "Giocatori"
|
||||
},
|
||||
"notifications": {
|
||||
"notify1": "Conferma transazione",
|
||||
"notify2": "Transazione confermata",
|
||||
"explanation": "La tua transazione è in fase di conferma. Per seguirne l'avanzamento, fai clic sull'icona della campana.",
|
||||
"status1": "Completamente sincronizzato",
|
||||
"status2": "Non sincronizzato",
|
||||
"notify3": "Nessuna notifica",
|
||||
"notify4": "Notifiche Tx"
|
||||
},
|
||||
"friends": {
|
||||
"friend1": "Aggiungi nome",
|
||||
"friend2": "Aggiungi amico",
|
||||
"friend3": "L'aggiunta di un amico ti consente di connetterti facilmente con quella persona. Assicurati di seguire l'utente anche per supportare l'hosting delle sue risorse pubblicate.",
|
||||
"friend4": "Appunti",
|
||||
"friend5": "Segui il nome",
|
||||
"friend6": "Alias",
|
||||
"friend7": "Aggiungi un alias per ricordare meglio il tuo amico (facoltativo)",
|
||||
"friend8": "Invia Q-Chat",
|
||||
"friend9": "Invia una Q-Mail",
|
||||
"friend10": "Modifica amico",
|
||||
"friend11": "Seguente",
|
||||
"friend12": "Amici",
|
||||
"friend13": "Foraggio",
|
||||
"friend14": "Rimuovi amico",
|
||||
"friend15": "Impostazioni del feed",
|
||||
"friend16": "Seleziona le Q-App da cui desideri ricevere aggiornamenti, in particolare quelle relative ai tuoi amici.",
|
||||
"friend17": "Nessun articolo nel tuo feed"
|
||||
},
|
||||
"save": {
|
||||
"saving1": "Impossibile recuperare le impostazioni salvate",
|
||||
"saving2": "Niente da salvare",
|
||||
"saving3": "Salva le modifiche non salvate",
|
||||
"saving4": "Cancella i cambiamenti"
|
||||
},
|
||||
"profile": {
|
||||
"profile1": "Non hai un nome",
|
||||
"profile2": "Vai alla registrazione del nome",
|
||||
"profile3": "Aggiorna profilo",
|
||||
"profile4": "Slogan",
|
||||
"profile5": "Biografia",
|
||||
"profile6": "Indirizzi del portafoglio",
|
||||
"profile7": "Compila dall'interfaccia utente",
|
||||
"profile8": "Aggiungi proprietà personalizzata",
|
||||
"profile9": "Nome della struttura",
|
||||
"profile10": "Campi",
|
||||
"profile11": "Aggiungi campo",
|
||||
"profile12": "Nome campo",
|
||||
"profile13": "Valore del campo",
|
||||
"profile14": "Attività",
|
||||
"profile15": "Nessun valore",
|
||||
"profile16": "Questo nome non ha profilo",
|
||||
"profile17": "Impossibile recuperare il profilo",
|
||||
"profile18": "Apri profilo",
|
||||
"profile19": "Impossibile recuperare il profilo",
|
||||
"profile20": "Nome registrato",
|
||||
"profile21": "Inserisci indirizzo dall'interfaccia utente",
|
||||
"profile22": "Successo",
|
||||
"profile23": "crittografato",
|
||||
"profile24": "Devi compilare sia il nome del campo che il valore del campo per aggiungere una proprietà personalizzata",
|
||||
"profile25": "È tuo amico",
|
||||
"profile26": "Aggiungi come amico"
|
||||
},
|
||||
"tour": {
|
||||
"tour1": "Per poter utilizzare Qortal, il Core deve essere sincronizzato. Questa icona sarà in blu quando sarà sincronizzato.",
|
||||
"tour2": "Sincronizzato",
|
||||
"tour3": "Sincronizzato e conio",
|
||||
"tour4": "Sincronizzazione",
|
||||
"tour5": "Sincronizza il tuo core",
|
||||
"tour6": "L'inarrestabile forza di Qortal",
|
||||
"tour7": "Solo tu controlli i tuoi dati su Qortal",
|
||||
"tour8": "Qortal non può essere eliminato",
|
||||
"tour9": "Completamente peer-to-peer senza intermediari centralizzati",
|
||||
"tour10": "Questa è la visualizzazione della scheda predefinita in cui puoi accedere a importanti impostazioni Qortal e Q-app come Q-Tube.",
|
||||
"tour11": "Goditi un'esperienza completa",
|
||||
"tour12": "Per ottenere l'esperienza Qortal completa, ti consigliamo di seguire questa lista di controllo.",
|
||||
"tour13": "Sei completamente sincronizzato! Ora puoi sperimentare la potenza della blockchain Qortal.",
|
||||
"tour14": "Proviamo a visitare Q-Tube!",
|
||||
"tour15": "Visita Q-Tube",
|
||||
"tour16": "Lista di controllo",
|
||||
"tour17": "Avvia il Core per accedere alla blockchain di Qortal.",
|
||||
"tour18": "Aggiorna (bootstrap)",
|
||||
"tour19": "Sincronizzazione in corso... devi essere completamente sincronizzato per usare Qortal",
|
||||
"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"
|
||||
}
|
||||
}
|
||||
}
|
@ -5,10 +5,8 @@
|
||||
"chinese1": "中国語 (簡体字)",
|
||||
"chinese2": "中国語 (繁体字)",
|
||||
"croatian": "クロアチア語",
|
||||
"dutch": "オランダの",
|
||||
"english": "英語",
|
||||
"estonian": "エストニア語",
|
||||
"finnish": "フィンランド語",
|
||||
"french": "フランス語",
|
||||
"german": "ドイツ語",
|
||||
"hindi": "ヒンディー語",
|
||||
@ -80,7 +78,7 @@
|
||||
"tm32": "このアカウントはどのユーザーもフォローしていません",
|
||||
"tm33": "インポートタブメニュー",
|
||||
"tm34": "エクスポートタブメニュー",
|
||||
"tm35": "既存のタブメニューが削除され、インポートされたタブメニューに設定されます。",
|
||||
"tm35": "既存のタブ メニューは削除され、アップロードされたタブ メニューに設定されます。",
|
||||
"tm36": "タブメニューが正常に復元されました",
|
||||
"tm37": "タブメニューが名前を付けて保存されました",
|
||||
"tm38": "開発モード",
|
||||
@ -96,33 +94,33 @@
|
||||
"address": "アドレス",
|
||||
"password": "パスワード",
|
||||
"youraccounts": "あなたのアカウント",
|
||||
"clickto": "アカウントをクリックしてログインします",
|
||||
"clickto": "ログインしたいアカウントをクリックして下さい",
|
||||
"needcreate": "ログインする前にアカウントを作成または保存する必要があります!",
|
||||
"upload": "Qortal のバックアップをアップロードします",
|
||||
"howlogin": "どのようにログインしますか?",
|
||||
"seed": "シードフレーズ",
|
||||
"seedphrase": "シードフレーズ",
|
||||
"saved": "保存したアカウント",
|
||||
"qora": "QORA アドレス シード",
|
||||
"backup": "Qortalバックアップファイル",
|
||||
"decrypt": "バックアップファイルを復号化する",
|
||||
"qora": "Qora アドレス シード",
|
||||
"backup": "Qortal ウォレットのバックアップ",
|
||||
"decrypt": "バックアップを復号化",
|
||||
"save": "このブラウザに保存します。",
|
||||
"prepare": "アカウントを準備",
|
||||
"areyousure": "このウォレットを保存されたウォレットから削除してもよろしいですか? (削除してバックアップ ファイルが存在しない場合、アカウントが永久に失われる可能性があります。これを行う前にバックアップ ファイルがあることを確認してください。)",
|
||||
"areyousure": "保存されたウォレットからこのウォレットを削除しますか?",
|
||||
"error1": "バックアップは有効な JSON である必要があります",
|
||||
"error2": "ログイン オプションが選択されていません",
|
||||
"createwelcome": "Qortal へようこそ。分散型デジタルの未来があなたを待っています! Qortal では、データを完全に制御できるのはあなただけです。 Qortal は、ユーザーが完全に制御できる新しいデジタル世界の基本レベルを提供します。",
|
||||
"createwelcome": "Qortal へようこそ。Qortalは RPG ゲームに似ている事に気づくと思います。Qortal ネットワークのミンターとして (なりたいと選択した場合) アカウントをレベルアップすることが出来、QORT のブロック報酬をより多く得られるだけでなく、プラットフォームの決定に対する投票という点で、ネットワークに対してより大きな影響力を持つことが出来ます。",
|
||||
"createa": "A",
|
||||
"click": "クリックしてシードフレーズを表示",
|
||||
"confirmpass": "パスワードの確認",
|
||||
"willbe": "バックグラウンドでランダムに生成されます。 シードフレーズを表示したい場合は、このテキスト内で強調表示されている「シードフレーズ」をクリックしてください。 これは、Qortal のブロックチェーン アカウントの秘密キー ジェネレーターとして使用されます。 デフォルトでは、セキュリティのため、特に選択しない限り、シードフレーズは表示されません。",
|
||||
"willbe": "はバックグラウンドでランダムに生成されます。これは、Qortal のブロックチェーン アカウントの秘密キー ジェネレーターとして使用されます。",
|
||||
"clicknext": "下の [次へ] をクリックして Qortal アカウントを作成します。",
|
||||
"ready": "これでアカウントを作成する準備ができました。 デフォルトでは、Qortal UI のこのコピー内に暗号化された形式で保存されます。 新しいアカウントをここに保存したくない場合は、下のボックスのチェックを外してください。 アカウントを作成したら必ずダウンロードする必要があるウォレットのバックアップ ファイルを使用して、(ログアウト後も) 新しいアカウントでログインすることができます。",
|
||||
"ready": "アカウントを作成する準備が出来ました。アカウントはこのブラウザに保存されます。新しいアカウントをブラウザに保存したくない場合は、下のボックスのチェックを外してください。[必ず」新しいアカウントのウォレットのバックアップ ファイルをダウンロードして下さい。(ログアウト後) そのバックアップファイルが無いとログイン不可になります。",
|
||||
"welmessage": "Qortal へようこそ",
|
||||
"pleaseenter": "パスワードを入力してください!",
|
||||
"notmatch": "パスワードが一致しません!",
|
||||
"lessthen8": "パスワードが 5 文字未満です。推奨出来ませんが警告は無視しても構いません。",
|
||||
"lessthen8-2": "パスワードが 5 文字未満です!",
|
||||
"lessthen8": "パスワードが 8 文字未満です。推奨出来ませんが警告は無視しても構いません。",
|
||||
"lessthen8-2": "パスワードが 8 文字未満です!",
|
||||
"entername": "名前を入力してください!",
|
||||
"downloaded": "ウォレットのバックアップ ファイルをダウンロードしました!",
|
||||
"loading": "読み込み中です、お待ちください...",
|
||||
@ -134,7 +132,7 @@
|
||||
"created1": "アカウントが作成され...",
|
||||
"created2": " このブラウザに保存されます。",
|
||||
"downloadbackup": "ウォレットのバックアップ ファイルをダウンロード",
|
||||
"passwordhint": "パスワードは 5 文字以上である必要があります。",
|
||||
"passwordhint": "パスワードは 8 文字以上である必要があります。",
|
||||
"lp1": "ロック画面",
|
||||
"lp2": "ロック画面のパスワードが設定されていません!",
|
||||
"lp3": "1 つ設定してください",
|
||||
@ -183,6 +181,7 @@
|
||||
"password": "パスワード",
|
||||
"download": "バックアップ ファイルをダウンロード",
|
||||
"choose": "バックアップを暗号化するためのパスワードを入力してください。(ログインに使用したパスワードと同じでも、別のものでも構いません)",
|
||||
"block": "通知をブロックする (近日公開予定...)",
|
||||
"playsound": "音を鳴らす",
|
||||
"shownotifications": "通知を表示",
|
||||
"nodeurl": "ノード URL",
|
||||
@ -201,20 +200,12 @@
|
||||
"snack3": "正常にカスタム ノードを追加・保存しました",
|
||||
"snack4": "正常にノードを次のファイル名で保存しました",
|
||||
"snack5": "正常にノードをインポートしました",
|
||||
"snack6": "カスタム ノードが正常に削除されました",
|
||||
"snack7": "カスタム ノードが正常に編集されました",
|
||||
"exp1": "秘密マスターキーをエクスポート",
|
||||
"exp2": "マスターキーのエクスポート",
|
||||
"exp3": "エクスポート",
|
||||
"exp4": "秘密マスターキーをバックアップするウォレットを選択してください。",
|
||||
"core": "Core自動起動設定",
|
||||
"qappNotification1": "Q-App 通知",
|
||||
"selectnode": "オプションを選択してください",
|
||||
"arrr1": "ARRR ウォレットが初期化されていません!",
|
||||
"arrr2": "まずウォレットタブに移動し、ARRR ウォレットにアクセスしてウォレットを初期化してください。",
|
||||
"arrr3": "コアのアップデートが必要です!",
|
||||
"arrr4": "arrr ウォレットの秘密キーを保存するには、まずコアのアップデートが必要です!",
|
||||
"sync_indicator": "同期インジケーターのポップアップを無効にする"
|
||||
"core": "Core設定を開始",
|
||||
"qappNotification1": "Q-App 通知"
|
||||
},
|
||||
"appinfo": {
|
||||
"blockheight": "ブロック高",
|
||||
@ -248,9 +239,7 @@
|
||||
"balance": "残高",
|
||||
"balances": "あなたのウォレット残高",
|
||||
"update": "ウォレット残高を更新",
|
||||
"view": "表示",
|
||||
"all": "全て",
|
||||
"page": "ページ"
|
||||
"view": "表示"
|
||||
},
|
||||
"gifs": {
|
||||
"gchange1": "GIF エクスプローラー",
|
||||
@ -286,7 +275,7 @@
|
||||
"startminting": {
|
||||
"smchange1": "ミントアカウントを取得出来ません",
|
||||
"smchange2": "キーの削除に失敗しました",
|
||||
"smchange3": "ミントキーを追加できませんでした。キーが作成されたばかりの場合は、数ブロック待ってから再度追加してください",
|
||||
"smchange3": "ミントキーの追加に失敗しました",
|
||||
"smchange4": "スポンサーシップ キーを作成出来ません",
|
||||
"smchange5": "関係の構築開始",
|
||||
"smchange6": "ブロックチェーンの承認を待っています",
|
||||
@ -509,7 +498,7 @@
|
||||
"nchange23": "売値",
|
||||
"nchange24": "売却する名前はありません",
|
||||
"nchange25": "売却する名前",
|
||||
"nchange26": "この名前を販売してもよろしいですか? この名前が別のアカウントによって購入された場合、販売された名前によって公開されたデータにアクセスできなくなります。",
|
||||
"nchange26": "この名前を売却しますか?",
|
||||
"nchange27": "QORT建価格",
|
||||
"nchange28": "確認を押すと、名前の売却リクエストが送信されます!",
|
||||
"nchange29": "売却中止する名前",
|
||||
@ -530,8 +519,7 @@
|
||||
"nchange44": "新しい名前に変更しますか?",
|
||||
"nchange45": "確認を押すと、名前の更新リクエストが送信されます!",
|
||||
"nchange46": "名前の売却履歴",
|
||||
"nchange47": "正常に名前を更新しました!",
|
||||
"nchange48": "警告! 名前を更新すると、元の名前に関連付けられたリソースが失われます。つまり、QDN 内の元の名前でのコンテンツの所有権が失われます。慎重に続行してください。"
|
||||
"nchange47": "正常に名前を更新しました!"
|
||||
},
|
||||
"websitespage": {
|
||||
"schange1": "ウェブサイトを閲覧",
|
||||
@ -612,8 +600,7 @@
|
||||
"schange39": "開く",
|
||||
"schange40": "プレビュー",
|
||||
"schange41": "ダウンロード中です。しばらくお待ちください...",
|
||||
"schange42": "ダウンロードしたファイル",
|
||||
"schange43": "ダウンロードの試行はバックグラウンドで続行されます。しばらくしてからもう一度お試しください。"
|
||||
"schange42": "ダウンロードしたファイル"
|
||||
},
|
||||
"tubespage": {
|
||||
"schange1": "Q-Tubeを閲覧",
|
||||
@ -735,14 +722,7 @@
|
||||
"bchange44": "このアプリケーションにこのリストから削除する事を許可しますか?",
|
||||
"bchange45": "暗号化",
|
||||
"bchange46": "このアプリケーションに次のファイルを保存する事を許可しますか?",
|
||||
"bchange47": "インスタント公開 - が必要です",
|
||||
"bchange48": "このアプリケーションに通知を送信する権限を与えますか?",
|
||||
"bchange49": "ウォレット情報を取得する許可をこのアプリケーションに与えますか?",
|
||||
"bchange50": "このアプリはあなたの公開プロフィールの変更をリクエストしました。プロパティ: ",
|
||||
"bchange51": "変更を送信するには、[プロフィールを更新] をクリックすることを忘れないでください。",
|
||||
"bchange52": "ウォレット情報を取得する許可をこのアプリケーションに与えますか?",
|
||||
"bchange53": "すべてのアプリによる友達リストの自動取得を常に許可します",
|
||||
"bchange54": "このアプリケーションに友達リストへのアクセスを許可しますか?"
|
||||
"bchange47": "インスタント公開 - が必要です"
|
||||
},
|
||||
"datapage": {
|
||||
"dchange1": "データ管理",
|
||||
@ -842,37 +822,13 @@
|
||||
"cchange74": "リアクション",
|
||||
"cchange75": "添付ファイルをアップロード中。これには最大 1 分かかる場合があります。",
|
||||
"cchange76": "添付ファイルを削除中。これには最大 1 分かかる場合があります。",
|
||||
"cchange77": "添付ファイルのサイズが 10 MB を超えています",
|
||||
"cchange77": "添付ファイルのサイズが 1 MB を超えています",
|
||||
"cchange78": "この画像を削除しますか?",
|
||||
"cchange79": "この添付ファイルを削除しますか?",
|
||||
"cchange80": "この画像は削除されました",
|
||||
"cchange81": "この画像タイプはサポートされていません",
|
||||
"cchange82": "この添付ファイルは削除されました",
|
||||
"cchange90": "メッセージがありません",
|
||||
"cchange91": "送信中...",
|
||||
"cchange92": "以下の未読メッセージ",
|
||||
"cchange93": "画像をクリップボードにコピーしました",
|
||||
"cchange94": "ロードされました",
|
||||
"cchange95": "私のリソースのみ",
|
||||
"cchange96": "オープングループ管理",
|
||||
"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": "何か書いてください ..."
|
||||
"cchange90": "メッセージがありません"
|
||||
},
|
||||
"welcomepage": {
|
||||
"wcchange1": "Q-Chat へようこそ",
|
||||
@ -964,19 +920,7 @@
|
||||
"gchange56": "検索するグループ名",
|
||||
"gchange57": "非公開 グループ名が見つかりません",
|
||||
"gchange58": "グループ名は完全に一致する必要があります",
|
||||
"gchange59": "ティッカーの表示/非表示",
|
||||
"gchange60": "グループ名を入力してください",
|
||||
"gchange61": "説明を入力してください",
|
||||
"gchange62": "このグループを更新してもよろしいですか?",
|
||||
"gchange63": "CONFIRMを押すと、UPDATE_GROUPリクエストが送信されます。",
|
||||
"gchange64": "現在の所有者/新しい所有者",
|
||||
"gchange65": "このアドレスをグループの所有権の譲渡に置き換えてください。",
|
||||
"gchange66": "無効な所有者/新しい所有者のアドレス",
|
||||
"gchange67": "グループ UPDATE 成功しました!",
|
||||
"gchange68": "グループアバターの設定",
|
||||
"gchange69": "メッセージ",
|
||||
"gchange70": "過去 24 時間以内にメッセージはありません。",
|
||||
"gchange71": "このグループにはすでに参加しています。"
|
||||
"gchange59": "ティッカーの表示/非表示"
|
||||
},
|
||||
"puzzlepage": {
|
||||
"pchange1": "パズル",
|
||||
@ -1031,16 +975,7 @@
|
||||
"nchange31": "ノードを停止",
|
||||
"nchange32": "正常に停止リクエストを送信しました!",
|
||||
"nchange33": "ノードを再起動",
|
||||
"nchange34": "正常に再起動リクエストを送信しました!",
|
||||
"nchange35": "ノードの開始",
|
||||
"nchange36": "ノードが正常に起動しました!",
|
||||
"nchange37": "続行をクリックすると、Qortal Core が更新され、データベースが削除され、ブートストラップと呼ばれるデータベースの新しいコピーがダウンロードされます。",
|
||||
"nchange38": "LTC ウォレットを修復",
|
||||
"nchange39": "これにより、使用できない残高を示す LTC ウォレットが修復されます。ライトコイン ネットワーク上で 1 回のトランザクションを行う必要があります。確認後はウォレットの残高が機能し、問題は再発しません。",
|
||||
"nchange40": "この取引には少額の LTC 手数料がかかります。続行しますか?",
|
||||
"nchange41": "修復しようとしています。お待ちください...",
|
||||
"nchange42": "LTC ウォレットが正常に修復されました!",
|
||||
"nchange43": "LTC ウォレットを修復しようとしたときにエラーが発生しました。もう一度お試しください。"
|
||||
"nchange34": "正常に再起動リクエストを送信しました!"
|
||||
},
|
||||
"transpage": {
|
||||
"tchange1": "トランザクションリクエスト",
|
||||
@ -1075,16 +1010,7 @@
|
||||
"rewarddialog3": "はいの場合、ミントを作成するには以下のキーを保存する必要があります。キーは任意のノードに提供して、ユーザーに代わってミントを行うことが出来ます。",
|
||||
"rewarddialog4": "確認を押すと報酬シェアが作成されますが、アカウントでミントするためには上記のキーをノードに提供する必要があります。",
|
||||
"rewarddialog5": "次のアカウントに関連付けられた報酬シェア トランザクションを削除します:",
|
||||
"rewarddialog6": "確認を押すと、報酬シェアが削除され、ミントキーが無効になります。",
|
||||
"deployAtdialog1": "AT を展開しています",
|
||||
"deployAtdialog2": "確認を押すと、AT が展開されます!",
|
||||
"deployAtdialog3": "初期金額残高",
|
||||
"votedialog1": "以下のアンケートへの投票をリクエストしています。",
|
||||
"votedialog2": "確認を押すと、投票リクエストが送信されます。",
|
||||
"votedialog3": "以下の投票の作成をリクエストしています:",
|
||||
"votedialog4": "投票の説明",
|
||||
"votedialog5": "オプション",
|
||||
"votedialog6": "確認を押すと投票が作成されます。"
|
||||
"rewarddialog6": "確認を押すと、報酬シェアが削除され、ミントキーが無効になります。"
|
||||
},
|
||||
"sponsorshipspage": {
|
||||
"schange1": "アクティブなスポンサーシップ",
|
||||
@ -1215,9 +1141,7 @@
|
||||
"inf15": "アクティブな自動購入注文",
|
||||
"inf16": "自動購入",
|
||||
"inf17": "ライトテーマに切り替える",
|
||||
"inf18": "ダークテーマに切り替える",
|
||||
"inf19": "取引情報",
|
||||
"inf20": "購入者"
|
||||
"inf18": "ダークテーマに切り替える"
|
||||
},
|
||||
"lotterypage": {
|
||||
"lot1": "Qortal 宝くじを開く",
|
||||
@ -1233,101 +1157,5 @@
|
||||
"lot11": "公開中の宝くじはありません!",
|
||||
"lot12": "終了した宝くじはありません!",
|
||||
"lot13": "プレイヤー"
|
||||
},
|
||||
"notifications": {
|
||||
"notify1": "取引を確認しています",
|
||||
"notify2": "トランザクションが確認されました",
|
||||
"explanation": "トランザクションが確認されています。進行状況を追跡するには、ベルのアイコンをクリックしてください。",
|
||||
"status1": "完全に同期されました",
|
||||
"status2": "同期されていません",
|
||||
"notify3": "通知はありません",
|
||||
"notify4": "送信通知"
|
||||
},
|
||||
"friends": {
|
||||
"friend1": "名前を追加",
|
||||
"friend2": "友人を追加する",
|
||||
"friend3": "友達を追加すると、その人と簡単につながることができます。 また、公開されたリソースのホスティングをサポートするために、必ずそのユーザーをフォローしてください。",
|
||||
"friend4": "ノート",
|
||||
"friend5": "フォロー名",
|
||||
"friend6": "エイリアス",
|
||||
"friend7": "友人をよりよく覚えられるようにエイリアスを追加します (オプション)",
|
||||
"friend8": "Qチャットを送信する",
|
||||
"friend9": "Qメールを送信する",
|
||||
"friend10": "友達を編集する",
|
||||
"friend11": "続く",
|
||||
"friend12": "友達",
|
||||
"friend13": "餌",
|
||||
"friend14": "友達を削除する",
|
||||
"friend15": "フィード設定",
|
||||
"friend16": "アップデートが必要な Q-App、特に友達に関連する Q-App を選択します。",
|
||||
"friend17": "フィードにアイテムがありません"
|
||||
},
|
||||
"save": {
|
||||
"saving1": "保存された設定を取得できません",
|
||||
"saving2": "保存するものは何もありません",
|
||||
"saving3": "未保存の変更を保存する",
|
||||
"saving4": "変更を元に戻します"
|
||||
},
|
||||
"profile": {
|
||||
"profile1": "名前がありません",
|
||||
"profile2": "名前の登録へ",
|
||||
"profile3": "プロファイルを更新",
|
||||
"profile4": "キャッチフレーズ",
|
||||
"profile5": "略歴",
|
||||
"profile6": "ウォレットアドレス",
|
||||
"profile7": "UI から入力",
|
||||
"profile8": "カスタム プロパティを追加",
|
||||
"profile9": "プロパティ名",
|
||||
"profile10": "フィールド",
|
||||
"profile11": "フィールドを追加",
|
||||
"profile12": "フィールド名",
|
||||
"profile13": "フィールド値",
|
||||
"profile14": "アクティビティ",
|
||||
"profile15": "値なし",
|
||||
"profile16": "この名前にはプロフィールがありません",
|
||||
"profile17": "プロファイルを取得できません",
|
||||
"profile18": "プロファイルを開く",
|
||||
"profile19": "プロファイルを取得できません",
|
||||
"profile20": "登録名",
|
||||
"profile21": "UI からアドレスを挿入",
|
||||
"profile22": "成功",
|
||||
"profile23": "暗号化",
|
||||
"profile24": "カスタム プロパティを追加するには、フィールド名とフィールド値の両方を入力する必要があります",
|
||||
"profile25": "あなたの友人です",
|
||||
"profile26": "友達として追加"
|
||||
},
|
||||
"tour": {
|
||||
"tour1": "Qortal を使用するには、コアを同期する必要があります。同期すると、このアイコンは青色になります。",
|
||||
"tour2": "同期済み",
|
||||
"tour3": "同期とミント",
|
||||
"tour4": "同期中",
|
||||
"tour5": "コアを同期する",
|
||||
"tour6": "止められないクオルタルの力",
|
||||
"tour7": "Qortal 上のデータを管理できるのはあなただけです",
|
||||
"tour8": "クオルタルは倒せません",
|
||||
"tour9": "中央集権的な仲介者を持たない完全なピアツーピア",
|
||||
"tour10": "これは、重要な Qortal 設定や Q-Tube などの Q-アプリにアクセスできるデフォルトのタブ ビューです。",
|
||||
"tour11": "完全な体験を得る",
|
||||
"tour12": "Qortal を最大限に活用するには、このチェックリストに従うことをお勧めします。",
|
||||
"tour13": "完全に同期されました! Qortal ブロックチェーンのパワーを体験できるようになりました。",
|
||||
"tour14": "Q-Tube に行ってみよう!",
|
||||
"tour15": "Q-Tube にアクセス",
|
||||
"tour16": "チェックリスト",
|
||||
"tour17": "Qortal ブロックチェーンにアクセスするには、コアを起動してください。",
|
||||
"tour18": "更新 (ブートストラップ)",
|
||||
"tour19": "現在同期中... Qortal を使用するには完全に同期する必要があります",
|
||||
"tour20": "ブロックが遅れています。同期プロセスを高速化するために更新 (ブートストラップ) しますか?",
|
||||
"tour21": "残りのブロック。",
|
||||
"tour22": "更新 (ブートストラップ) が要求されました。お待ちください。"
|
||||
},
|
||||
"chatsettings": {
|
||||
"cs1": "チャット設定",
|
||||
"cs2": "一般チャット設定",
|
||||
"cs3": "チャットメッセージのタイムスタンプ",
|
||||
"cs4": "過去時間",
|
||||
"cs5": "現地時間",
|
||||
"cs6": "チャットメッセージのフォントサイズ",
|
||||
"cs7": "標準",
|
||||
"cs8": "px"
|
||||
}
|
||||
}
|
||||
}
|
@ -5,10 +5,8 @@
|
||||
"chinese1": "중국어(간체)",
|
||||
"chinese2": "중국어(번체)",
|
||||
"croatian": "크로아티아어",
|
||||
"dutch": "네덜란드의",
|
||||
"english": "영어",
|
||||
"estonian": "에스토니아어",
|
||||
"finnish": "핀란드어",
|
||||
"french": "프랑스어",
|
||||
"german": "독일어",
|
||||
"hindi": "힌디어",
|
||||
@ -108,33 +106,33 @@
|
||||
"decrypt": "백업 암호 해독",
|
||||
"save": "이 브라우저에 저장",
|
||||
"prepare": "계정 준비",
|
||||
"areyousure": "저장된 지갑에서 이 지갑을 제거하시겠습니까? (제거되고 백업 파일이 없으면 계정이 영원히 손실될 수 있습니다. 이 작업을 수행하기 전에 백업 파일이 있는지 확인하십시오!)",
|
||||
"areyousure": "저장된 지갑에서 이 지갑을 제거하시겠습니까?",
|
||||
"error1": "백업은 유호한 json파일 형식이어야 합니다.",
|
||||
"error2": "로그인 옵션이 선택되지 않았습니다.",
|
||||
"createwelcome": "Qortal에 오신 것을 환영합니다! 귀하의 분산형 디지털 미래가 귀하를 기다립니다! Qortal에서는 귀하만이 귀하의 데이터를 절대적으로 통제할 수 있습니다. Qortal은 새로운 완전 사용자 제어 디지털 세계의 기본 수준을 제공합니다.",
|
||||
"createwelcome": "Qortal에 오신 것을 환영합니다. RPG 게임과 비슷하다는 것을 알게 되실 것입니다. Qortal 네트워크의 관리자로서(만약 당신이 하나를 선택한다면) 계정을 레벨업할 수 있는 기회를 갖게 될 것입니다. Qortal 네트워크에 대한 더 많은 블록 보상은 물론 플랫폼 결정에 대한 투표 측면에서 네트워크에 대한 더 큰 영향력을 갖게 될 것입니다..",
|
||||
"createa": "A",
|
||||
"click": "시드 구문을 보려면 클릭하십시오.",
|
||||
"confirmpass": "암호 확인",
|
||||
"willbe": "백그라운드에서 무작위로 생성됩니다. Seedphrase를 보려면 이 텍스트에서 강조표시된 'seedphrase'를 클릭하세요. 이는 Qortal의 블록체인 계정에 대한 개인 키 생성기로 사용됩니다. 기본적으로 보안을 위해 특별히 선택하지 않는 한 시드 문구는 표시되지 않습니다.",
|
||||
"willbe": "백그라운드에서 랜덤하게 생성됩니다. 이것은 Qortal의 블록체인 계정에 대한 개인 키 생성기로 사용됩니다.",
|
||||
"clicknext": "아래 NEXT를 클릭하여 Qortal 계정을 만드십시오.",
|
||||
"ready": "이제 귀하의 계정을 생성할 준비가 되었습니다. 기본적으로 이 Qortal UI 복사본 내에 암호화된 형식으로 저장됩니다. 새 계정을 저장하지 않으려면 아래 확인란을 선택 취소하세요. 계정 생성 시 반드시 다운로드해야 하는 지갑 백업 파일을 사용하여 언제든지 새 계정에 액세스할 수 있습니다(로그아웃 후).",
|
||||
"ready": "계정을 만들 준비가 되었습니다. 이 브라우저에 저장됩니다. 브라우저에 새 계정을 저장하지 않으려면 아래 상자를 선택 취소할 수 있습니다. 계정을 만든 후에는 반드시 다운로드해야 하는 지갑 백업 파일을 사용하여 새 계정으로 로그인할 수 있습니다(로그아웃 후).",
|
||||
"welmessage": "Qortal에 오신 것을 환영합니다.",
|
||||
"pleaseenter": "암호를 입력하십시오!",
|
||||
"notmatch": "암호가 일치하지 않습니다!",
|
||||
"lessthen8": "암호가 5자 미만입니다! 이것은 권장되지 않습니다. 이 경고는 계속 무시할 수 있습니다.",
|
||||
"lessthen8-2": "암호가 5자 미만입니다!",
|
||||
"lessthen8": "암호가 8자 미만입니다! 이것은 권장되지 않습니다. 이 경고는 계속 무시할 수 있습니다.",
|
||||
"lessthen8-2": "암호가 8자 미만입니다!",
|
||||
"entername": "이름을 입력하십시오!",
|
||||
"downloaded": "지갑 백업 파일이 다운로드됩니다!",
|
||||
"loading": "로드 중입니다. 잠시 기다려 주십시오...",
|
||||
"createdseed": "귀하의 시드구문",
|
||||
"saveseed": "시드구문 저장",
|
||||
"savein": "브라우저에 저장",
|
||||
"backup2": "Qortal 백업 파일은 UI에 저장되지 않는 한 (기본적으로) 계정에 액세스할 수 있는 유일한 방법입니다. 이 파일을 여러 장소에 백업해 두세요! 파일은 매우 안전하게 암호화되었으며 이전 단계에서 생성한 로컬 비밀번호로 해독됩니다. 어디에나 안전하게 저장할 수 있지만 반드시 여러 위치에 저장하세요.",
|
||||
"backup2": "이 파일은 앱/브라우저에 저장되지 않은 시스템의 계정에 액세스할 수 있는 유일한 방법입니다. 이 파일을 여러 곳에 백업하십시오. 파일은 매우 안전하게 암호화되고 이전 단계에서 만든 로컬 암호로 해독됩니다. 어디에나 안전하게 저장할 수 있지만 여러 위치에서 저장해야 합니다.",
|
||||
"savewallet": "지갑 백업 파일 저장",
|
||||
"created1": "이제 계정이 생성되었습니다.",
|
||||
"created2": " 암호화된 형태로 이 UI에 저장됩니다.",
|
||||
"downloadbackup": "Qortal 백업 파일을 저장하십시오.",
|
||||
"passwordhint": "비밀번호는 5자 이상이어야 합니다.",
|
||||
"created2": " 이 브라우저에 저장됩니다.",
|
||||
"downloadbackup": "지갑 백업 파일 다운로드",
|
||||
"passwordhint": "비밀번호는 8자 이상이어야 합니다.",
|
||||
"lp1": "잠금 화면",
|
||||
"lp2": "잠금 화면 암호가 설정되지 않았습니다!",
|
||||
"lp3": "하나를 설정하세요",
|
||||
@ -164,7 +162,7 @@
|
||||
},
|
||||
"fragfile": {
|
||||
"selectfile": "파일선택",
|
||||
"dragfile": "끌어서 놓거나 여기를 클릭하여 백업 파일을 선택하세요."
|
||||
"dragfile": "백업을 여기에 드래그"
|
||||
},
|
||||
"settings": {
|
||||
"generalinfo": "일반 계정 정보",
|
||||
@ -181,8 +179,9 @@
|
||||
"notifications": "알림",
|
||||
"accountsecurity": "계정 보안",
|
||||
"password": "비밀번호",
|
||||
"download": "Qortal 백업 파일 내보내기/저장",
|
||||
"download": "백업 파일 다운로드",
|
||||
"choose": "백업을 암호화할 암호를 선택하십시오. 암호는 로그인한 암호와 같거나 다를 수 있습니다.",
|
||||
"block": "블록 알림",
|
||||
"playsound": "소리 재생",
|
||||
"shownotifications": "알림 표시",
|
||||
"nodeurl": "노드 url",
|
||||
@ -192,8 +191,8 @@
|
||||
"protocol": "프로토콜",
|
||||
"domain": "도메인",
|
||||
"port": "포트",
|
||||
"import": "저장된 노드 가져오기",
|
||||
"export": "저장된 노드 내보내기",
|
||||
"import": "노드 가져오기",
|
||||
"export": "노드 내보내기",
|
||||
"deletecustomnode": "모든 사용자 정의 노드 제거",
|
||||
"warning": "기존 노드가 삭제되고 백업에서 새로 생성됩니다.",
|
||||
"snack1": "표준 노드를 성공적으로 삭제 및 추가했습니다.",
|
||||
@ -201,20 +200,12 @@
|
||||
"snack3": "사용자 정의 노드를 성공적으로 추가하고 저장했습니다.",
|
||||
"snack4": "노드가 다음으로 성공적으로 저장되었습니다",
|
||||
"snack5": "노드를 성공적으로 가져왔습니다.",
|
||||
"snack6": "사용자 정의 노드를 성공적으로 제거했습니다",
|
||||
"snack7": "사용자 정의 노드를 성공적으로 편집했습니다",
|
||||
"exp1": "마스터 개인 키 내보내기(xpriv)",
|
||||
"exp1": "개인 마스터 키 내보내기",
|
||||
"exp2": "마스터 키 내보내기",
|
||||
"exp3": "내보내기",
|
||||
"exp4": "마스터 개인키 백업을 위한 지갑을 선택해주세요",
|
||||
"exp4": "개인 마스터 키를 백업할 지갑을 선택하세요.",
|
||||
"core": "코어 설정 시작",
|
||||
"qappNotification1": "Q-App 알림",
|
||||
"selectnode": "옵션을 선택하세요",
|
||||
"arrr1": "ARRR 지갑이 초기화되지 않음!",
|
||||
"arrr2": "'지갑'으로 이동하여 ARRR 지갑에 접속하여 먼저 초기화하세요.",
|
||||
"arrr3": "핵심 업데이트가 필요합니다!",
|
||||
"arrr4": "ARRR 지갑의 개인 키를 저장하려면 먼저 Qortal Core를 업데이트해야 합니다!",
|
||||
"sync_indicator": "동기화 표시 팝업 비활성화"
|
||||
"qappNotification1": "Q-App 알림"
|
||||
},
|
||||
"appinfo": {
|
||||
"blockheight": "블록 높이",
|
||||
@ -248,9 +239,7 @@
|
||||
"balance": "균형",
|
||||
"balances": "지갑 잔액",
|
||||
"update": "월렛 잔액 업데이트",
|
||||
"view": "보다",
|
||||
"all": "모두",
|
||||
"page": "페이지"
|
||||
"view": "보다"
|
||||
},
|
||||
"gifs": {
|
||||
"gchange1": "Gif 탐색기",
|
||||
@ -286,14 +275,14 @@
|
||||
"startminting": {
|
||||
"smchange1": "발행 계정을 가져올 수 없습니다",
|
||||
"smchange2": "키 제거 실패",
|
||||
"smchange3": "'민팅 키' 추가에 실패했습니다. 키가 방금 생성된 경우 몇 블록을 기다렸다가 다시 추가해 보세요.",
|
||||
"smchange3": "발행 키를 추가하지 못했습니다.",
|
||||
"smchange4": "스폰서십 키를 생성할 수 없습니다.",
|
||||
"smchange5": "관계 만들기",
|
||||
"smchange6": "블록체인에서 확인 대기 중",
|
||||
"smchange7": "관계 마무리",
|
||||
"smchange8": "노드에 발행 키 추가",
|
||||
"smchange9": "완벽한",
|
||||
"smchange10": "노드당 2개의 '민팅 키'만 허용됩니다. 현재 3개의 키를 시도하고 있습니다. 노드 관리로 이동하여 불필요한 키를 제거하십시오. 감사합니다!"
|
||||
"smchange10": "노드당 발행 키 2개만 허용됩니다. 키 3개를 할당하려고 합니다. 관리 - 노드 관리로 이동하여 이 노드에 할당하고 싶지 않은 키를 제거하십시오. 감사합니다!"
|
||||
},
|
||||
"mintingpage": {
|
||||
"mchange1": "일반 민팅 정보",
|
||||
@ -405,8 +394,7 @@
|
||||
"wchange55": "기존 주소록이 삭제되고 백업에서 새로 생성됩니다.",
|
||||
"wchange56": "경고!",
|
||||
"wchange57": "메모",
|
||||
"wchange58": "새 주소",
|
||||
"wchange59": "코인"
|
||||
"wchange58": "새 주소"
|
||||
},
|
||||
"tradepage": {
|
||||
"tchange1": "무역 포털",
|
||||
@ -509,7 +497,7 @@
|
||||
"nchange23": "판매 가격",
|
||||
"nchange24": "판매할 이름 없음",
|
||||
"nchange25": "판매할 이름",
|
||||
"nchange26": "이 이름을 판매하시겠습니까? 판매되면 이 이름으로 게시된 모든 데이터에 더 이상 액세스할 수 없습니다!",
|
||||
"nchange26": "이 이름을 판매하시겠습니까?",
|
||||
"nchange27": "QORT에서 이 가격",
|
||||
"nchange28": "확인을 누르면 판매 이름 요청이 전송됩니다!",
|
||||
"nchange29": "취소할 이름",
|
||||
@ -530,8 +518,7 @@
|
||||
"nchange44": "새 이름으로",
|
||||
"nchange45": "확인을 누르면 이름 업데이트 요청이 전송됩니다!",
|
||||
"nchange46": "네임 세일 내역",
|
||||
"nchange47": "이름 업데이트 성공!",
|
||||
"nchange48": "경고! 이름을 업데이트하면 원래 이름과 관련된 리소스를 잃게 됩니다. 즉, QDN에서 원래 이름으로 콘텐츠 소유권을 잃게 됩니다. 주의해서 진행하세요!"
|
||||
"nchange47": "이름 업데이트 성공!"
|
||||
},
|
||||
"websitespage": {
|
||||
"schange1": "웹 사이트 찾아보기",
|
||||
@ -612,8 +599,7 @@
|
||||
"schange39": "열기",
|
||||
"schange40": "미리보기",
|
||||
"schange41": "다운로드 중입니다...",
|
||||
"schange42": "다운로드된 파일",
|
||||
"schange43": "모든 다운로드 시도는 백그라운드에서 계속됩니다. 잠시 후에 다시 시도하십시오."
|
||||
"schange42": "다운로드된 파일"
|
||||
},
|
||||
"tubespage": {
|
||||
"schange1": "Q-Tubes 둘러보기",
|
||||
@ -735,14 +721,7 @@
|
||||
"bchange44": "이 목록에서 삭제할 수 있는 권한을 이 애플리케이션에 부여하시겠습니까?",
|
||||
"bchange45": "암호화",
|
||||
"bchange46": "이 응용 프로그램에 다음 파일을 저장할 권한을 부여하시겠습니까?",
|
||||
"bchange47": "즉시 게시 - 필요",
|
||||
"bchange48": "이 애플리케이션에 알림을 보낼 수 있는 권한을 부여하시겠습니까?",
|
||||
"bchange49": "이 애플리케이션에 지갑 정보를 얻을 수 있는 권한을 부여하시겠습니까?",
|
||||
"bchange50": "이 앱이 당신의 공개 프로필 변경을 요청했습니다. 속성: ",
|
||||
"bchange51": "변경 사항을 제출하려면 '프로필 업데이트'를 클릭하는 것을 잊지 마세요.",
|
||||
"bchange52": "이 애플리케이션에 지갑 정보를 얻을 수 있는 권한을 부여하시겠습니까?",
|
||||
"bchange53": "항상 모든 앱에서 친구 목록을 자동으로 검색하도록 허용",
|
||||
"bchange54": "이 애플리케이션에 친구 목록에 접근할 수 있는 권한을 부여하시겠습니까?"
|
||||
"bchange47": "즉시 게시 - 필요"
|
||||
},
|
||||
"datapage": {
|
||||
"dchange1": "데이터 관리",
|
||||
@ -842,37 +821,13 @@
|
||||
"cchange74": "반응",
|
||||
"cchange75": "첨부파일을 업로드하는 중입니다. 최대 1분이 소요될 수 있습니다.",
|
||||
"cchange76": "첨부파일을 삭제하는 중입니다. 최대 1분이 소요될 수 있습니다.",
|
||||
"cchange77": "첨부 파일 크기가 10MB를 초과함",
|
||||
"cchange77": "첨부 파일 크기가 1MB를 초과함",
|
||||
"cchange78": "정말 이 이미지를 삭제하시겠습니까?",
|
||||
"cchange79": "이 첨부파일을 삭제하시겠습니까?",
|
||||
"cchange80": "이 이미지는 삭제되었습니다",
|
||||
"cchange81": "이 이미지 유형은 지원되지 않습니다",
|
||||
"cchange82": "이 첨부 파일은 삭제되었습니다",
|
||||
"cchange90": "메시지 없음",
|
||||
"cchange91": "보내는 중...",
|
||||
"cchange92": "아래 읽지 않은 메시지",
|
||||
"cchange93": "이미지가 클립보드에 복사되었습니다",
|
||||
"cchange94": "로드됨",
|
||||
"cchange95": "내 리소스만",
|
||||
"cchange96": "그룹 관리 열기",
|
||||
"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": "뭔가를 쓰세요 ..."
|
||||
"cchange90": "메시지 없음"
|
||||
},
|
||||
"welcomepage": {
|
||||
"wcchange1": "Q-Chat에 오신 것을 환영합니다.",
|
||||
@ -964,19 +919,7 @@
|
||||
"gchange56": "검색할 그룹 이름",
|
||||
"gchange57": "비공개 그룹 이름을 찾을 수 없음",
|
||||
"gchange58": "그룹 이름이 정확히 일치해야 합니다.",
|
||||
"gchange59": "티커 표시/숨기기",
|
||||
"gchange60": "그룹 이름을 입력해 주세요.",
|
||||
"gchange61": "설명을 입력하십시오.",
|
||||
"gchange62": "이 그룹을 업데이트하시겠습니까?",
|
||||
"gchange63": "CONFIRM을 누르면 UPDATE_GROUP 요청이 전송됩니다!",
|
||||
"gchange64": "현재 소유자/새 소유자",
|
||||
"gchange65": "이 주소를 그룹의 소유권 이전으로 바꾸십시오!",
|
||||
"gchange66": "잘못된 소유자/새 소유자 주소",
|
||||
"gchange67": "그룹 업데이트 성공!",
|
||||
"gchange68": "그룹 아바타 설정",
|
||||
"gchange69": "메시지",
|
||||
"gchange70": "지난 24시간 동안 메시지가 없습니다!",
|
||||
"gchange71": "당신은 이미 이 그룹에 가입했습니다!"
|
||||
"gchange59": "티커 표시/숨기기"
|
||||
},
|
||||
"puzzlepage": {
|
||||
"pchange1": "퍼즐",
|
||||
@ -1031,16 +974,7 @@
|
||||
"nchange31": "노드 중지",
|
||||
"nchange32": "중지 요청을 성공적으로 전송했습니다.!",
|
||||
"nchange33": "노드 재시작",
|
||||
"nchange34": "다시 시작 요청을 성공적으로 보냈습니다!",
|
||||
"nchange35": "노드 시작",
|
||||
"nchange36": "노드가 성공적으로 시작되었습니다!",
|
||||
"nchange37": "계속을 클릭하면 Qortal Core가 새로 고쳐지고 DB가 제거되며 부트스트래핑이라는 새로운 DB 복사본을 다운로드하게 됩니다.",
|
||||
"nchange38": "LTC 지갑 수리",
|
||||
"nchange39": "사용할 수 없는 잔액이 표시된 LTC 지갑을 복구합니다. Litecoin 네트워크에서 단일 거래가 이루어져야 하며 확인 후에는 지갑 잔액이 작동하고 문제가 다시 발생하지 않습니다.",
|
||||
"nchange40": "이 거래는 소액의 LTC 수수료를 소비합니다. 계속하시겠습니까?",
|
||||
"nchange41": "복구하는 중입니다. 잠시 기다려 주세요...",
|
||||
"nchange42": "LTC 지갑을 성공적으로 복구했습니다!",
|
||||
"nchange43": "LTC 지갑을 복구하는 중 오류가 발생했습니다. 다시 시도해 주세요!"
|
||||
"nchange34": "다시 시작 요청을 성공적으로 보냈습니다!"
|
||||
},
|
||||
"transpage": {
|
||||
"tchange1": "거래요청",
|
||||
@ -1075,16 +1009,7 @@
|
||||
"rewarddialog3": "만약 그렇다면, 당신은 민팅하기 위해 아래의 키를 저장해야 할 것이다. 사용자를 대신하여 민팅할 수 있도록 모든 노드에 제공할 수 있습니다.",
|
||||
"rewarddialog4": "확인을 누르면 보상 공유가 생성되지만, 계정과 연동하려면 여전히 노드에 위의 키를 제공해야 합니다..",
|
||||
"rewarddialog5": "계정과 연결된 보상 공유 트랜잭션을 제거하는 중입니다.",
|
||||
"rewarddialog6": "확인을 누르면 보상 공유가 제거되고 조폐 키가 유효하지 않게 됩니다.",
|
||||
"deployAtdialog1": "AT를 배치하고 있습니다",
|
||||
"deployAtdialog2": "확인을 누르면 AT가 배치됩니다!",
|
||||
"deployAtdialog3": "초기 잔액",
|
||||
"votedialog1": "아래 설문조사에 투표를 요청합니다:",
|
||||
"votedialog2": "확인을 누르면 투표 요청이 전송됩니다!",
|
||||
"votedialog3": "아래 설문조사 생성을 요청하고 있습니다.",
|
||||
"votedialog4": "설문조사 설명",
|
||||
"votedialog5": "옵션",
|
||||
"votedialog6": "확인을 누르면 설문조사가 생성됩니다!"
|
||||
"rewarddialog6": "확인을 누르면 보상 공유가 제거되고 조폐 키가 유효하지 않게 됩니다."
|
||||
},
|
||||
"sponsorshipspage": {
|
||||
"schange1": "적극적인 후원",
|
||||
@ -1215,9 +1140,7 @@
|
||||
"inf15": "활성 자동 구매 주문",
|
||||
"inf16": "자동 구매",
|
||||
"inf17": "밝은 테마로 전환",
|
||||
"inf18": "어두운 테마로 전환",
|
||||
"inf19": "무역 정보",
|
||||
"inf20": "구매자"
|
||||
"inf18": "어두운 테마로 전환"
|
||||
},
|
||||
"lotterypage": {
|
||||
"lot1": "Qortal 복권 열기",
|
||||
@ -1233,101 +1156,5 @@
|
||||
"lot11": "공개 복권이 없습니다!",
|
||||
"lot12": "완성된 복권이 없습니다!",
|
||||
"lot13": "플레이어"
|
||||
},
|
||||
"notifications": {
|
||||
"notify1": "거래 확인 중",
|
||||
"notify2": "거래가 확인되었습니다",
|
||||
"explanation": "거래가 확인되고 있습니다. 진행 상황을 추적하려면 종 모양 아이콘을 클릭하세요.",
|
||||
"status1": "완전히 동기화됨",
|
||||
"status2": "동기화되지 않음",
|
||||
"notify3": "알림 없음",
|
||||
"notify4": "전송 알림"
|
||||
},
|
||||
"friends": {
|
||||
"friend1": "이름 추가",
|
||||
"friend2": "친구 추가",
|
||||
"friend3": "친구를 추가하면 그 사람과 쉽게 연결될 수 있습니다. 게시된 리소스의 호스팅을 지원하려면 해당 사용자를 팔로우해야 합니다.",
|
||||
"friend4": "노트",
|
||||
"friend5": "이름 팔로우",
|
||||
"friend6": "별명",
|
||||
"friend7": "친구를 더 잘 기억할 수 있도록 별칭을 추가하세요(선택사항)",
|
||||
"friend8": "Q-채팅 보내기",
|
||||
"friend9": "Q-메일 보내기",
|
||||
"friend10": "친구 수정",
|
||||
"friend11": "수행원",
|
||||
"friend12": "친구",
|
||||
"friend13": "밥을 먹이다",
|
||||
"friend14": "친구 삭제",
|
||||
"friend15": "피드 설정",
|
||||
"friend16": "업데이트를 원하는 Q-App, 특히 친구와 관련된 Q-App을 선택하세요.",
|
||||
"friend17": "피드에 항목이 없습니다."
|
||||
},
|
||||
"save": {
|
||||
"saving1": "저장된 설정을 가져올 수 없습니다.",
|
||||
"saving2": "저장할 항목이 없습니다.",
|
||||
"saving3": "저장되지 않은 변경사항 저장",
|
||||
"saving4": "변경사항 취소"
|
||||
},
|
||||
"profile": {
|
||||
"profile1": "당신은 이름이 없습니다",
|
||||
"profile2": "이름 등록으로 이동",
|
||||
"profile3": "프로필 업데이트",
|
||||
"profile4": "태그라인",
|
||||
"profile5": "소개",
|
||||
"profile6": "지갑 주소",
|
||||
"profile7": "UI에서 채우기",
|
||||
"profile8": "사용자 정의 속성 추가",
|
||||
"profile9": "속성 이름",
|
||||
"profile10": "필드",
|
||||
"profile11": "필드 추가",
|
||||
"profile12": "필드 이름",
|
||||
"profile13": "필드 값",
|
||||
"profile14": "활동",
|
||||
"profile15": "값 없음",
|
||||
"profile16": "이 이름에는 프로필이 없습니다",
|
||||
"profile17": "프로필을 가져올 수 없습니다",
|
||||
"profile18": "프로필 열기",
|
||||
"profile19": "프로필을 가져올 수 없습니다",
|
||||
"profile20": "등록 이름",
|
||||
"profile21": "UI에서 주소를 삽입하세요",
|
||||
"profile22": "성공",
|
||||
"profile23": "암호화됨",
|
||||
"profile24": "사용자 정의 속성을 추가하려면 필드 이름과 필드 값을 모두 입력해야 합니다",
|
||||
"profile25": "당신의 친구입니까?",
|
||||
"profile26": "친구로 추가"
|
||||
},
|
||||
"tour": {
|
||||
"tour1": "Qortal을 사용하려면 Core를 동기화해야 합니다. 동기화되면 이 아이콘이 파란색으로 표시됩니다.",
|
||||
"tour2": "동기화됨",
|
||||
"tour3": "동기화 및 생성 중",
|
||||
"tour4": "동기화 중",
|
||||
"tour5": "코어 동기화",
|
||||
"tour6": "멈출 수 없는 코탈의 힘",
|
||||
"tour7": "귀하만이 Qortal의 데이터를 제어할 수 있습니다",
|
||||
"tour8": "Qortal을 무너뜨릴 수 없습니다",
|
||||
"tour9": "중앙 집중식 중개자가 없는 완전한 P2P",
|
||||
"tour10": "중요한 Qortal 설정 및 Q-Tube와 같은 Q-app에 액세스할 수 있는 기본 탭 보기입니다.",
|
||||
"tour11": "완전한 경험을 해보세요",
|
||||
"tour12": "Qortal을 완벽하게 경험하려면 이 체크리스트를 따르는 것이 좋습니다.",
|
||||
"tour13": "완전히 동기화되었습니다! 이제 Qortal 블록체인의 성능을 경험할 수 있습니다.",
|
||||
"tour14": "Q-Tube를 방문해 보세요!",
|
||||
"tour15": "Q-Tube 방문",
|
||||
"tour16": "체크리스트",
|
||||
"tour17": "Qortal 블록체인에 액세스하려면 코어를 시작하십시오.",
|
||||
"tour18": "새로 고침(부트스트랩)",
|
||||
"tour19": "현재 동기화 중... Qortal을 사용하려면 완전히 동기화되어야 합니다.",
|
||||
"tour20": "뒤에 차단되어 있습니다. 동기화 프로세스 속도를 높이기 위해 새로 고치시겠습니까(부트스트랩)?",
|
||||
"tour21": "남은 블록입니다.",
|
||||
"tour22": "새로 고침(부트스트랩)이 요청되었습니다. 잠시 기다려 주십시오."
|
||||
},
|
||||
"chatsettings": {
|
||||
"cs1": "채팅 설정",
|
||||
"cs2": "일반 채팅 설정",
|
||||
"cs3": "채팅 메시지 타임스탬프",
|
||||
"cs4": "옛날",
|
||||
"cs5": "현지 시간",
|
||||
"cs6": "채팅 메시지 글꼴 크기",
|
||||
"cs7": "표준",
|
||||
"cs8": "px"
|
||||
}
|
||||
}
|
||||
}
|
File diff suppressed because it is too large
Load Diff
@ -5,10 +5,8 @@
|
||||
"chinese1": "Kinesisk (Forenklet)",
|
||||
"chinese2": "Kinesisk (Tradisjonell)",
|
||||
"croatian": "Kroatisk",
|
||||
"dutch": "Nederlandsk",
|
||||
"english": "Engelsk",
|
||||
"estonian": "Estisk",
|
||||
"finnish": "Finsk",
|
||||
"french": "Fransk",
|
||||
"german": "Tysk",
|
||||
"hindi": "Hindi",
|
||||
@ -80,7 +78,7 @@
|
||||
"tm32": "Denne kontoen følger ikke noen bruker",
|
||||
"tm33": "Importer meny",
|
||||
"tm34": "Eksporter fanemeny",
|
||||
"tm35": "Din eksisterende fanemeny vil bli slettet og satt til importert fanemeny.",
|
||||
"tm35": "Din eksisterende fanemeny vil bli slettet og satt til opplastet fanemeny.",
|
||||
"tm36": "Fanemenyen ble gjenopprettet",
|
||||
"tm37": "Fanemeny ble lagret som",
|
||||
"tm38": "DEV MODUS",
|
||||
@ -108,21 +106,21 @@
|
||||
"decrypt": "Dekrypter backup",
|
||||
"save": "Lagre i denne nettleseren.",
|
||||
"prepare": "Forbereder kontoen din.",
|
||||
"areyousure": "Er du sikker på at du vil fjerne denne kontoen fra lagrede kontoer? (Hvis fjernet og ingen sikkerhetskopifil eksisterer, kan kontoen gå tapt for alltid! Sørg for at du har en sikkerhetskopifil før du gjør dette!)",
|
||||
"areyousure": "Er du sikker på at du vil fjerne denne lommeboken fra lagrede lommebøker?",
|
||||
"error1": "Backupen må være gyldig JSON",
|
||||
"error2": "Måte for pålogging ikke valgt",
|
||||
"createwelcome": "Velkommen til Qortal! Din desentraliserte digitale fremtid venter på deg! I Qortal har du og bare du full kontroll over dataene dine. Qortal gir infrastrukturen til en ny og fullt brukerstyrt digital verden.",
|
||||
"createwelcome": "Velkommen til Qortal. Likt et RPG-spill, vil du som minter i Qortal-nettverket (hvis du velger å bli det), ha sjansen til å øke din kontos nivå, noe som gir deg både mer av QORT-blokkbelønning, så vel som større innflytelse over nettverket når det gjelder å stemme på beslutninger for plattformen.",
|
||||
"createa": "A",
|
||||
"click": "Klikk for å se minnefrase (seedphrase)",
|
||||
"confirmpass": "Bekreft passord",
|
||||
"willbe": "vil bli generert tilfeldig i bakgrunnen. Hvis du ønsker å SE seedfrasen, klikk på den uthevede 'seedfrasen' i denne teksten. Dette brukes som din private nøkkelgenerator for din blokkjedekonto i Qortal. For sikkerhet som standard, vises ikke seedfraser med mindre det er spesifikt valgt å være det.",
|
||||
"willbe": "vil bli generert tilfeldig i bakgrunnen. Dette brukes som din private nøkkelgenerator for din blokkjedekonto i Qortal.",
|
||||
"clicknext": "Opprett din Qortal-konto ved å klikke på NESTE nedenfor.",
|
||||
"ready": "Kontoen din er nå klar til å opprettes. Den vil som standard lagres i denne kopien av Qortal-grensesnittet, i kryptert form. Hvis du ikke vil at den nye kontoen din skal lagres her, kan du fjerne merket i boksen nedenfor. Du vil fortsatt kunne logge på med den nye kontoen din (etter å ha logget ut), ved å bruke sikkerhetskopifilen for lommeboken som du MÅ laste ned når du har opprettet kontoen din.",
|
||||
"ready": "Kontoen din er nå klar til å opprettes. Den vil bli lagret i denne nettleseren. Hvis du ikke vil at den nye kontoen din skal lagres i nettleseren, kan du fjerne avhukningen i boksen nedenfor. Du vil fortsatt kunne logge på med den nye kontoen din (etter å ha logget av), ved å bruke backup-filen for lommeboken som du MÅ laste ned når du har opprettet kontoen din.",
|
||||
"welmessage": "Velkommen til Qortal",
|
||||
"pleaseenter": "Skriv inn et passord!",
|
||||
"notmatch": "Oops! Passordene samsvarer ikke! Prøv igjen!",
|
||||
"lessthen8": "Passordet ditt er mindre enn 5 tegn! Dette anbefales ikke. Du kan velge å fortsette, og ignorere denne advarselen.",
|
||||
"lessthen8-2": "Passordet ditt er mindre enn 5 tegn!",
|
||||
"notmatch": "Passord matcher ikke!",
|
||||
"lessthen8": "Passordet ditt er mindre enn 8 tegn! Dette anbefales ikke. Du kan velge å fortsette, og ignorere denne advarselen.",
|
||||
"lessthen8-2": "Passordet ditt er mindre enn 8 tegn!",
|
||||
"entername": "Skriv inn et navn!",
|
||||
"downloaded": "Backup-filen for lommeboken din vil bli lastet ned!",
|
||||
"loading": "Laster, vennligst vent...",
|
||||
@ -132,9 +130,9 @@
|
||||
"backup2": "Denne filen er den ENESTE måten å få tilgang på kontoen din i et system hvor den ikke lagres i appen/nettleseren. SØRG FOR Å LAGE BACKUP AV DENNE FILEN PÅ FLERE STEDER. Filen er kryptert veldig sikkert og dekrypteres med ditt lokale passord som du opprettet i forrige trinn. Du kan trygt lagre den hvor som helst, men sørg for å gjøre det på flere steder.",
|
||||
"savewallet": "Lagre backup-fil for lommebok",
|
||||
"created1": "Kontoen din er nå opprettet",
|
||||
"created2": " og lagret i denne UI i kryptert form.",
|
||||
"created2": " og vil bli lagret i denne nettleseren.",
|
||||
"downloadbackup": "Last ned backup-fil for lommebok",
|
||||
"passwordhint": "Et passord må være på minst 5 tegn.",
|
||||
"passwordhint": "Et passord må være på minst 8 tegn.",
|
||||
"lp1": "Lås skjerm",
|
||||
"lp2": "Ingen passord for låseskjerm er angitt!",
|
||||
"lp3": "Vennligst sett en",
|
||||
@ -163,8 +161,8 @@
|
||||
"confirmlogout": "Er du sikker på at du vil logge av?"
|
||||
},
|
||||
"fragfile": {
|
||||
"selectfile": "Velg sikkerhetskopifil",
|
||||
"dragfile": "Dra og slipp eller klikk her for å velge sikkerhetskopifil"
|
||||
"selectfile": "Velg fil",
|
||||
"dragfile": "Dra og slipp backup her"
|
||||
},
|
||||
"settings": {
|
||||
"generalinfo": "Generell kontoinformasjon",
|
||||
@ -183,6 +181,7 @@
|
||||
"password": "Passord",
|
||||
"download": "Last ned backup-fil",
|
||||
"choose": "Velg et passord for å kryptere din backup med. (Dette kan være det samme som du logget på med, eller et annet)",
|
||||
"block": "Blokkvarsler (Kommer snart...)",
|
||||
"playsound": "Spill av lyd",
|
||||
"shownotifications": "Vis varsler",
|
||||
"nodeurl": "Node-URL",
|
||||
@ -201,20 +200,12 @@
|
||||
"snack3": "Egendefinert node er lagt til og lagret",
|
||||
"snack4": "Noder ble lagret som",
|
||||
"snack5": "Noder ble importert",
|
||||
"snack6": "Tilpasset node er fjernet",
|
||||
"snack7": "Redigert tilpasset node",
|
||||
"exp1": "Eksporter privat hovednøkkel (xpriv)",
|
||||
"exp1": "Eksporter privat hovednøkkel",
|
||||
"exp2": "Eksporter hovednøkkel",
|
||||
"exp3": "Eksporter",
|
||||
"exp4": "Velg en lommebok for å sikkerhetskopiere den private hovednøkkelen.",
|
||||
"core": "Kjerneinnstillinger for automatisk start",
|
||||
"qappNotification1": "Q-App varsler",
|
||||
"selectnode": "Vennligst velg et alternativ",
|
||||
"arrr1": "ARRR-lommebok ikke initialisert !",
|
||||
"arrr2": "Gå til lommebok-fanen og få tilgang til ARRR-lommeboken for å initialisere lommeboken først.",
|
||||
"arrr3": "Trenger kjerneoppdatering!",
|
||||
"arrr4": "For å lagre den private nøkkelen til ARRR-lommeboken din må du først oppdatere Qortal Core!",
|
||||
"sync_indicator": "Deaktiver popup for synkroniseringsindikator"
|
||||
"core": "Start kjerneinnstillinger",
|
||||
"qappNotification1": "Q-App varsler"
|
||||
},
|
||||
"appinfo": {
|
||||
"blockheight": "Blokkhøyde",
|
||||
@ -248,9 +239,7 @@
|
||||
"balance": "Saldo",
|
||||
"balances": "DIN WALLET-SALDO",
|
||||
"update": "OPPDATERT WALLET-SALDOER",
|
||||
"view": "Utsikt",
|
||||
"all": "Alle",
|
||||
"page": "Side"
|
||||
"view": "Utsikt"
|
||||
},
|
||||
"gifs": {
|
||||
"gchange1": "Gif Explorer",
|
||||
@ -286,7 +275,7 @@
|
||||
"startminting": {
|
||||
"smchange1": "Kan ikke hente myntingkontoer",
|
||||
"smchange2": "Kunne ikke fjerne nøkkelen",
|
||||
"smchange3": "Kunne ikke legge til myntnøkkel, hvis nøkkelen nettopp ble opprettet, prøv å vente noen blokker og legg til på nytt.",
|
||||
"smchange3": "Kunne ikke legge til myntnøkkel",
|
||||
"smchange4": "Kan ikke opprette sponsornøkkel",
|
||||
"smchange5": "Skaper forhold",
|
||||
"smchange6": "Venter på bekreftelse på blockchain",
|
||||
@ -405,8 +394,7 @@
|
||||
"wchange55": "Din eksisterende adressebok vil bli slettet og ny opprettet fra sikkerhetskopi.",
|
||||
"wchange56": "ADVARSEL!",
|
||||
"wchange57": "Memo",
|
||||
"wchange58": "Ny Adresse",
|
||||
"wchange59": "Mynt"
|
||||
"wchange58": "Ny Adresse"
|
||||
},
|
||||
"tradepage": {
|
||||
"tchange1": "Handelsportal",
|
||||
@ -509,7 +497,7 @@
|
||||
"nchange23": "Selgspris",
|
||||
"nchange24": "Ingen navn å selge",
|
||||
"nchange25": "Navn å selge",
|
||||
"nchange26": "Er du sikker på å selge dette navnet? Hvis navnet er kjøpt av en annen konto, vil alle data publisert av den være utenfor din kontroll!",
|
||||
"nchange26": "Er du sikker på å selge dette navnet?",
|
||||
"nchange27": "For denne prisen i QORT",
|
||||
"nchange28": "Når du trykker bekrefte, vil forespørselen om salgsnavn bli sendt!",
|
||||
"nchange29": "Navn som skal avbrytes",
|
||||
@ -530,8 +518,7 @@
|
||||
"nchange44": "Til det nye navnet",
|
||||
"nchange45": "Når du trykker bekreft, vil forespørselen om navneoppdatering bli sendt!",
|
||||
"nchange46": "Navnsalgshistorikk",
|
||||
"nchange47": "Navneoppdateringen er vellykket!",
|
||||
"nchange48": "Advarsel! Hvis du oppdaterer navnet ditt, mister du ressursene knyttet til det opprinnelige navnet. Du vil med andre ord miste eierskapet til innholdet under det opprinnelige navnet i QDN. Fortsett med forsiktighet!"
|
||||
"nchange47": "Navneoppdateringen er vellykket!"
|
||||
},
|
||||
"websitespage": {
|
||||
"schange1": "Bla gjennom nettsteder",
|
||||
@ -612,8 +599,7 @@
|
||||
"schange39": "Åpne",
|
||||
"schange40": "Forhåndsvisning",
|
||||
"schange41": "Laster ned, vennligst vent...",
|
||||
"schange42": "Filer lastet ned",
|
||||
"schange43": "Alle forsøk på nedlasting vil fortsette i bakgrunnen, prøv igjen etter en stund."
|
||||
"schange42": "Filer lastet ned"
|
||||
},
|
||||
"tubespage": {
|
||||
"schange1": "Bla gjennom Q-Tubes",
|
||||
@ -735,14 +721,7 @@
|
||||
"bchange44": "Gir du denne applikasjonen tillatelse til å slette fra denne listen?",
|
||||
"bchange45": "Krypter",
|
||||
"bchange46": "Gir du dette programmet tillatelse til å lagre følgende fil",
|
||||
"bchange47": "Øyeblikkelig publisering - krever",
|
||||
"bchange48": "Gir du denne applikasjonen tillatelse til å sende deg varsler",
|
||||
"bchange49": "Gir du dette programmet tillatelse til å få lommebokinformasjonen din?",
|
||||
"bchange50": "Denne appen har bedt om en endring av din offentlige profil. Eiendom: ",
|
||||
"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?"
|
||||
"bchange47": "Øyeblikkelig publisering - krever"
|
||||
},
|
||||
"datapage": {
|
||||
"dchange1": "Data-administrasjon",
|
||||
@ -842,37 +821,13 @@
|
||||
"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 10 MB",
|
||||
"cchange77": "Vedleggsstørrelsen overstiger 1 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",
|
||||
"cchange81": "Denne bildetypen støttes ikke",
|
||||
"cchange82": "Dette vedlegget er slettet",
|
||||
"cchange90": "Ingen meldinger",
|
||||
"cchange91": "Sender...",
|
||||
"cchange92": "Uleste meldinger nedenfor",
|
||||
"cchange93": "Bilde kopiert til utklippstavlen",
|
||||
"cchange94": "lastet",
|
||||
"cchange95": "Kun mine ressurser",
|
||||
"cchange96": "Åpne gruppeadministrasjon",
|
||||
"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 ..."
|
||||
"cchange90": "Ingen meldinger"
|
||||
},
|
||||
"welcomepage": {
|
||||
"wcchange1": "Velkommen til Q-Chat",
|
||||
@ -964,19 +919,7 @@
|
||||
"gchange56": "Gruppenavn å søke",
|
||||
"gchange57": "Privat gruppenavn ikke funnet",
|
||||
"gchange58": "Merk at gruppenavnet må samsvare nøyaktig.",
|
||||
"gchange59": "Vis / Skjul Ticker",
|
||||
"gchange60": "Vennligst skriv inn gruppenavn",
|
||||
"gchange61": "Vennligst skriv inn beskrivelse",
|
||||
"gchange62": "Er du sikker på å oppdatere denne gruppen?",
|
||||
"gchange63": "Når du trykker på BEKREFT, vil den UPDATE_GROUP forespørselen bli sendt!",
|
||||
"gchange64": "Nåværende eier / ny eier",
|
||||
"gchange65": "Erstatt denne adressen til OVERFØR EIERSKAP av gruppen!",
|
||||
"gchange66": "Ugyldig eier / ny eieradresse",
|
||||
"gchange67": "Gruppeoppdatering vellykket!",
|
||||
"gchange68": "Angi gruppeavatar",
|
||||
"gchange69": "Meldinger",
|
||||
"gchange70": "Ingen meldinger de siste 24 timene!",
|
||||
"gchange71": "Du har allerede blitt med i denne gruppen!"
|
||||
"gchange59": "Vis / Skjul Ticker"
|
||||
},
|
||||
"puzzlepage": {
|
||||
"pchange1": "Puzzles",
|
||||
@ -1031,16 +974,7 @@
|
||||
"nchange31": "Stopp noden",
|
||||
"nchange32": "Stoppforespørsel sendt!",
|
||||
"nchange33": "Omstart noden",
|
||||
"nchange34": "Omstartsforespørsel sendt!",
|
||||
"nchange35": "Start node",
|
||||
"nchange36": "Node startet med suksess!",
|
||||
"nchange37": "Hvis du klikker på fortsett, oppdateres Qortal Core, din db vil bli fjernet, og du vil laste ned en ny kopi av db, kalt bootstrapping.",
|
||||
"nchange38": "Reparer LTC-lommebok",
|
||||
"nchange39": "Dette vil reparere LTC-lommebøker som viser en saldo som ikke kan brukes. Det krever at en enkelt transaksjon utføres på Litecoin-nettverket, etter bekreftelse vil lommeboksaldoen være funksjonell og problemet vil ikke skje igjen.",
|
||||
"nchange40": "Denne transaksjonen vil kreve en liten LTC-avgift. Fortsette?",
|
||||
"nchange41": "Prøver å reparere. Vennligst vent...",
|
||||
"nchange42": "Vellykket reparert LTC-lommebok!",
|
||||
"nchange43": "Det oppsto en feil under forsøk på å reparere LTC-lommeboken. Prøv igjen!"
|
||||
"nchange34": "Omstartsforespørsel sendt!"
|
||||
},
|
||||
"transpage": {
|
||||
"tchange1": "Transaksjonsforespørsel",
|
||||
@ -1075,16 +1009,7 @@
|
||||
"rewarddialog3": "Hvis ja, må du lagre nøkkelen nedenfor for å minte. Den kan leveres til hvilken som helst node for å tillate den å minte på dine vegne.",
|
||||
"rewarddialog4": "Ved å trykke på Bekreft, vil belønningsdelen bli opprettet, men du må fortsatt levere nøkkelen ovenfor til en node for å kunne minte med kontoen.",
|
||||
"rewarddialog5": "Du fjerner en transaksjon for belønningsdel knyttet til konto:",
|
||||
"rewarddialog6": "Ved å trykke på Bekreft, vil belønningsdelen bli fjernet og mintnøkkelen blir ugyldig.",
|
||||
"deployAtdialog1": "Du distribuerer AT",
|
||||
"deployAtdialog2": "Når du trykker på bekreftelse, vil AT bli distribuert!",
|
||||
"deployAtdialog3": "Startbeløpssaldo",
|
||||
"votedialog1": "Du ber om å stemme på avstemningen nedenfor:",
|
||||
"votedialog2": "Ved å trykke bekreft vil stemmeforespørselen bli sendt!",
|
||||
"votedialog3": "Du ber om å lage avstemningen nedenfor:",
|
||||
"votedialog4": "Avstemningsbeskrivelse",
|
||||
"votedialog5": "Alternativer",
|
||||
"votedialog6": "Når du trykker på bekreft, blir avstemningen opprettet!"
|
||||
"rewarddialog6": "Ved å trykke på Bekreft, vil belønningsdelen bli fjernet og mintnøkkelen blir ugyldig."
|
||||
},
|
||||
"sponsorshipspage": {
|
||||
"schange1": "Aktive sponsorer",
|
||||
@ -1215,9 +1140,7 @@
|
||||
"inf15": "Aktive automatiske kjøpsordrer",
|
||||
"inf16": "Autokjøp",
|
||||
"inf17": "Bytt til lystema",
|
||||
"inf18": "Bytt til mørkt tema",
|
||||
"inf19": "Handelsinformasjon",
|
||||
"inf20": "Kjøper"
|
||||
"inf18": "Bytt til mørkt tema"
|
||||
},
|
||||
"lotterypage": {
|
||||
"lot1": "Åpne Qortal-lotterier",
|
||||
@ -1233,101 +1156,5 @@
|
||||
"lot11": "Det er ingen åpne lotterier!",
|
||||
"lot12": "Det er ingen ferdige lotterier!",
|
||||
"lot13": "Spillere"
|
||||
},
|
||||
"notifications": {
|
||||
"notify1": "Bekrefter transaksjon",
|
||||
"notify2": "Transaksjonen bekreftet",
|
||||
"explanation": "Transaksjonen din blir bekreftet. Klikk på bjelleikonet for å spore fremdriften.",
|
||||
"status1": "Fullstendig synkronisert",
|
||||
"status2": "Ikke synkronisert",
|
||||
"notify3": "Ingen varsler",
|
||||
"notify4": "Tx-varsler"
|
||||
},
|
||||
"friends": {
|
||||
"friend1": "Legg til navn",
|
||||
"friend2": "Legge til venn",
|
||||
"friend3": "Ved å legge til en venn kan du enkelt koble deg til den personen. Sørg også for å følge den brukeren for å støtte hosting av publiserte ressurser.",
|
||||
"friend4": "Notater",
|
||||
"friend5": "Følg navn",
|
||||
"friend6": "Alias",
|
||||
"friend7": "Legg til et alias for å huske vennen din bedre (valgfritt)",
|
||||
"friend8": "Send Q-Chat",
|
||||
"friend9": "Send Q-Mail",
|
||||
"friend10": "Rediger venn",
|
||||
"friend11": "Følgende",
|
||||
"friend12": "Venner",
|
||||
"friend13": "Mate",
|
||||
"friend14": "Fjern venn",
|
||||
"friend15": "Innmatingsinnstillinger",
|
||||
"friend16": "Velg Q-appene du vil ha oppdateringer fra, spesielt de som er relatert til vennene dine.",
|
||||
"friend17": "Ingen varer i feeden din"
|
||||
},
|
||||
"save": {
|
||||
"saving1": "Kan ikke hente lagrede innstillinger",
|
||||
"saving2": "Ingenting å spare",
|
||||
"saving3": "Lagre ulagrede endringer",
|
||||
"saving4": "Angre endringer"
|
||||
},
|
||||
"profile": {
|
||||
"profile1": "Du har ikke noe navn",
|
||||
"profile2": "Gå til navneregistrering",
|
||||
"profile3": "Oppdater profil",
|
||||
"profile4": "Tagline",
|
||||
"profile5": "Bio",
|
||||
"profile6": "Lommebokadresser",
|
||||
"profile7": "Fyll fra brukergrensesnitt",
|
||||
"profile8": "Legg til egendefinert egenskap",
|
||||
"profile9": "Eiendomsnavn",
|
||||
"profile10": "Felter",
|
||||
"profile11": "Legg til felt",
|
||||
"profile12": "Feltnavn",
|
||||
"profile13": "Feltverdi",
|
||||
"profile14": "Aktivitet",
|
||||
"profile15": "Ingen verdi",
|
||||
"profile16": "Dette navnet har ingen profil",
|
||||
"profile17": "Kan ikke hente profil",
|
||||
"profile18": "Åpne profil",
|
||||
"profile19": "Kan ikke hente profil",
|
||||
"profile20": "Registrer navn",
|
||||
"profile21": "Sett inn adresse fra brukergrensesnittet",
|
||||
"profile22": "Suksess",
|
||||
"profile23": "kryptert",
|
||||
"profile24": "Du må fylle ut både feltnavn og feltverdi for å legge til en egendefinert egenskap",
|
||||
"profile25": "Er din venn",
|
||||
"profile26": "Legg til som venn"
|
||||
},
|
||||
"tour": {
|
||||
"tour1": "For å bruke Qortal må kjernen være synkronisert. Dette ikonet vil være i blått når det synkroniseres.",
|
||||
"tour2": "Synkronisert",
|
||||
"tour3": "Synkronisert og preget",
|
||||
"tour4": "Synkroniserer",
|
||||
"tour5": "Synkroniser kjernen din",
|
||||
"tour6": "Den ustoppelige kraften til Qortal",
|
||||
"tour7": "Bare du kontrollerer dataene dine på Qortal",
|
||||
"tour8": "Kortal kan ikke tas ned",
|
||||
"tour9": "Fullstendig peer-to-peer uten sentraliserte mellomledd",
|
||||
"tour10": "Dette er standard fanevisning der du kan få tilgang til viktige Qortal-innstillinger og Q-apper som Q-Tube.",
|
||||
"tour11": "Få hele opplevelsen",
|
||||
"tour12": "For å få den fulle Qortal-opplevelsen anbefaler vi å følge denne sjekklisten.",
|
||||
"tour13": "Du er fullstendig synkronisert! Du kan nå oppleve kraften til Qortal-blokkjeden.",
|
||||
"tour14": "La oss prøve å besøke Q-Tube!",
|
||||
"tour15": "Besøk Q-Tube",
|
||||
"tour16": "Sjekkliste",
|
||||
"tour17": "Vennligst start Core for å få tilgang til Qortal-blokkjeden.",
|
||||
"tour18": "Oppdater (bootstrap)",
|
||||
"tour19": "Synkroniserer for øyeblikket... du må være fullstendig synkronisert for å bruke Qortal",
|
||||
"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"
|
||||
}
|
||||
}
|
||||
}
|
@ -5,10 +5,8 @@
|
||||
"chinese1": "Chiński (uproszczony)",
|
||||
"chinese2": "Chiński (tradycyjny)",
|
||||
"croatian": "Chorwacki",
|
||||
"dutch": "Holenderski",
|
||||
"english": "Angielski",
|
||||
"estonian": "Estoński",
|
||||
"finnish": "Fiński",
|
||||
"french": "Francuski",
|
||||
"german": "Niemiecki",
|
||||
"hindi": "Hindi",
|
||||
@ -80,7 +78,7 @@
|
||||
"tm32": "To konto nie obserwuje żadnego użytkownika",
|
||||
"tm33": "Menu zakładki Importuj",
|
||||
"tm34": "Menu zakładki Eksportuj",
|
||||
"tm35": "Twoje istniejące menu zakładek zostanie usunięte i ustawione jako zaimportowane menu zakładek.",
|
||||
"tm35": "Twoje istniejące menu kart zostanie usunięte i ustawione na przesłane menu kart.",
|
||||
"tm36": "Menu zakładki pomyślnie przywrócone",
|
||||
"tm37": "Menu zakładki pomyślnie zapisane jako",
|
||||
"tm38": "TRYB DEV",
|
||||
@ -98,43 +96,43 @@
|
||||
"youraccounts": "Twoje konta",
|
||||
"clickto": "Kliknij swoje konto, aby się na nim zalogować",
|
||||
"needcreate": "Musisz utworzyć lub zapisać konto, zanim będziesz mógł się zalogować!",
|
||||
"upload": "Zaimportuj plik kopii zapasowej Qortal",
|
||||
"upload": "Prześlij swoją kopię zapasową Qortal",
|
||||
"howlogin": "Jak chciałbyś się zalogować?",
|
||||
"seed": "Fraza odzyskiwania",
|
||||
"seedphrase": "fraza odzyskiwania",
|
||||
"saved": "Zapisane konto",
|
||||
"qora": "Ziarno adresu QORA",
|
||||
"backup": "Plik kopii zapasowej Qortal",
|
||||
"decrypt": "Odszyfruj plik kopii zapasowej",
|
||||
"qora": "Ziarno adresu Qora",
|
||||
"backup": "Kopia zapasowa portfela Qortal",
|
||||
"decrypt": "Odszyfruj kopię zapasową",
|
||||
"save": "Zapisz w tej przeglądarce.",
|
||||
"prepare": "Przygotuj swoje konto",
|
||||
"areyousure": "Czy na pewno chcesz usunąć to konto z zapisanych kont? (W przypadku usunięcia i braku pliku kopii zapasowej konto może zostać utracone na zawsze! Zanim to zrobisz, upewnij się, że masz plik kopii zapasowej!)",
|
||||
"areyousure": "Czy na pewno chcesz usunąć ten portfel z zapisanych portfeli?",
|
||||
"error1": "Kopia zapasowa musi być poprawnym JSON",
|
||||
"error2": "Nie wybrano opcji logowania",
|
||||
"createwelcome": "Witamy w Qortalu! Twoja zdecentralizowana cyfrowa przyszłość czeka na Ciebie! W Qortal Ty i tylko Ty masz pełną kontrolę nad swoimi danymi. Qortal zapewnia podstawowy poziom nowego, w pełni kontrolowanego przez użytkownika cyfrowego świata.",
|
||||
"createwelcome": "Witamy w Qortal, przekonasz się, że jest to gra podobna do gry RPG, ty, jako minter w sieci Qortal (jeśli zdecydujesz się nią zostać), będziesz miał szansę ulepszyć swoje konto, zyskując więcej nagrody za blok QORT, jak i większy wpływ na sieć w zakresie głosowania na decyzje dotyczące platformy.",
|
||||
"createa": "A",
|
||||
"click": "Kliknij, aby zobaczyć frazę odzyskiwania portfela",
|
||||
"confirmpass": "Potwierdź hasło",
|
||||
"willbe": "będą losowo generowane w tle. Jeśli chcesz ZOBACZYĆ frazę nasion, kliknij słowo „fraza nasion” w tym tekście. Służy jako generator klucza prywatnego dla Twojego konta Blockchain w Qortal. Ze względów bezpieczeństwa domyślnie frazy początkowe nie są wyświetlane, chyba że zostało to specjalnie wybrane.",
|
||||
"willbe": "zostanie losowo wygenerowany w tle. To jest używane jako generator klucza prywatnego dla Twojego konta blockchain w Qortal.",
|
||||
"clicknext": "Utwórz swoje konto Qortal, klikając przycisk NEXT (DALEJ) poniżej.",
|
||||
"ready": "Twoje konto jest teraz gotowe do utworzenia. Zostanie on domyślnie zapisany w tej kopii interfejsu użytkownika Qortal, w formie zaszyfrowanej. Jeśli nie chcesz, aby Twoje nowe konto było tutaj zapisywane, możesz odznaczyć pole poniżej. Nadal będziesz mógł zalogować się na swoje nowe konto (po wylogowaniu), korzystając z pliku kopii zapasowej portfela, który MUSISZ pobrać po utworzeniu konta.",
|
||||
"ready": "Twoje konto jest teraz gotowe do utworzenia. Zostanie zapisane w tej przeglądarce. Jeśli nie chcesz, aby Twoje nowe konto było zapisywane w przeglądarce, możesz odznaczyć poniższe pole. Nadal będziesz mógł logować się na nowe konto (po wylogowaniu), korzystając z pliku kopii zapasowej portfela, który MUSISZ pobrać po utworzeniu konta.",
|
||||
"welmessage": "Witamy w Qortal",
|
||||
"pleaseenter": "Proszę wprowadzić Hasło!",
|
||||
"notmatch": "Hasła nie pasują!",
|
||||
"lessthen8": "Twoje hasło ma mniej niż 5 znaków! Nie jest to zalecane. Możesz zignorować to ostrzeżenie.",
|
||||
"lessthen8-2": "Twoje hasło ma mniej niż 5 znaków!",
|
||||
"entername": "Proszę wprowadzić nazwę wyświetlaną!",
|
||||
"downloaded": "Twój plik kopii zapasowej Portfela został zapisany!",
|
||||
"lessthen8": "Twoje hasło ma mniej niż 8 znaków! Nie jest to zalecane. Możesz zignorować to ostrzeżenie.",
|
||||
"lessthen8-2": "Twoje hasło ma mniej niż 8 znaków!",
|
||||
"entername": "Proszę podać Nazwę!",
|
||||
"downloaded": "Twój plik kopii zapasowej Portfela zostanie pobrany!",
|
||||
"loading": "Ładowanie, proszę czekać...",
|
||||
"createdseed": "Twoja utworzona fraza odzyskiwania",
|
||||
"saveseed": "Zapisz frazę odzyskiwania",
|
||||
"savein": "Zapisz w tym interfejsie użytkownika",
|
||||
"backup2": "Ten plik jest JEDYNYM (domyślnym) sposobem uzyskania dostępu do Twojego konta, chyba że zostanie zapisany w interfejsie użytkownika. NALEŻY ZROBIĆ KOPIĘ ZAPASOWĄ TEGO PLIKU W WIELU MIEJSCACH. Plik zostanie bardzo bezpiecznie zaszyfrowany i odszyfrowany za pomocą lokalnego hasła utworzonego w poprzednim kroku. Możesz bezpiecznie zapisać go w dowolnym miejscu, ale pamiętaj, aby zrobić to w wielu lokalizacjach.",
|
||||
"savein": "Zapisz w przeglądarce",
|
||||
"backup2": "Ten plik jest JEDYNYM sposobem uzyskania dostępu do konta w systemie, jeżeli nie ma go zapisanego w aplikacji/przeglądarce. PAMIĘTAJ, ABY ZAPISAĆ KOPIĘ ZAPASOWĄ TEGO PLIKU W WIELU MIEJSCACH. Plik jest bezpiecznie zaszyfrowany i może być odszyfrowany za pomocą Twojego hasła utworzonego w poprzednim kroku. Możesz go bezpiecznie zapisać w dowolnym miejscu, ale pamiętaj, aby zrobić to w wielu lokalizacjach.",
|
||||
"savewallet": "Zapisz plik kopii zapasowej portfela",
|
||||
"created1": "Twoje konto zostało utworzone",
|
||||
"created2": " i zapisane w tym interfejsie użytkownika w formie zaszyfrowanej.",
|
||||
"downloadbackup": "Zapisz plik kopii zapasowej Qortal",
|
||||
"passwordhint": "Hasło szyfrujące musi składać się z co najmniej 5 znaków.",
|
||||
"created2": " i zostanie zapisane w tej przeglądarce.",
|
||||
"downloadbackup": "Pobierz plik kopii zapasowej portfela",
|
||||
"passwordhint": "Hasło musi mieć co najmniej 8 znaków.",
|
||||
"lp1": "Ekran blokady",
|
||||
"lp2": "Nie ustawiono hasła blokady ekranu!",
|
||||
"lp3": "Proszę ustawić jeden",
|
||||
@ -163,8 +161,8 @@
|
||||
"confirmlogout": "Czy na pewno chcesz się wylogować?"
|
||||
},
|
||||
"fragfile": {
|
||||
"selectfile": "Wybierz plik kopii zapasowej",
|
||||
"dragfile": "Przeciągnij i upuść lub kliknij tutaj, aby wybrać plik kopii zapasowej"
|
||||
"selectfile": "Wybierz plik",
|
||||
"dragfile": "Przeciągnij i upuść kopię zapasową tutaj"
|
||||
},
|
||||
"settings": {
|
||||
"generalinfo": "Ogólne informacje o koncie",
|
||||
@ -183,6 +181,7 @@
|
||||
"password": "Hasło",
|
||||
"download": "Pobierz plik kopii zapasowej",
|
||||
"choose": "Proszę wybrać hasło do zaszyfrowania kopii zapasowej. (Może to być to samo, za pomocą którego się zalogowałeś lub inne)",
|
||||
"block": "Blokuj powiadomienia (wkrótce...)",
|
||||
"playsound": "Odtwórz dźwięk",
|
||||
"shownotifications": "Pokaż powiadomienia",
|
||||
"nodeurl": "URL węzła",
|
||||
@ -201,20 +200,12 @@
|
||||
"snack3": "Pomyślnie dodano i zapisano niestandardowy węzeł",
|
||||
"snack4": "Węzły pomyślnie zapisane jako",
|
||||
"snack5": "Węzły pomyślnie zaimportowane",
|
||||
"snack6": "Pomyślnie usunięto węzeł niestandardowy",
|
||||
"snack7": "Pomyślnie edytowano węzeł niestandardowy",
|
||||
"exp1": "Eksportuj główny klucz prywatny (xpriv)",
|
||||
"exp1": "Eksportuj prywatny klucz główny",
|
||||
"exp2": "Eksportuj klucz główny",
|
||||
"exp3": "Eksportuj",
|
||||
"exp4": "Wybierz portfel do wykonania kopii zapasowej prywatnego klucza głównego.",
|
||||
"core": "Ustawienia automatycznego uruchamiania Qortal Core",
|
||||
"qappNotification1": "Powiadomienia Q-App",
|
||||
"selectnode": "Proszę wybrać opcję",
|
||||
"arrr1": "Portfel ARRR nie został zainicjowany!",
|
||||
"arrr2": "Przejdź do Portfeli i uzyskaj dostęp do portfela ARRR, aby najpierw zainicjować portfel.",
|
||||
"arrr3": "Potrzebujesz aktualizacji rdzenia!",
|
||||
"arrr4": "Aby zapisać klucz prywatny swojego portfela ARRR, musisz najpierw zaktualizować Qortal Core!",
|
||||
"sync_indicator": "Wyłącz wyskakujące okienko wskaźnika synchronizacji"
|
||||
"core": "Uruchom podstawowe ustawienia",
|
||||
"qappNotification1": "Powiadomienia Q-App"
|
||||
},
|
||||
"appinfo": {
|
||||
"blockheight": "Wysokość bloku",
|
||||
@ -248,9 +239,7 @@
|
||||
"balance": "Saldo",
|
||||
"balances": "SALDO TWOJEGO PORTFELA",
|
||||
"update": "AKTUALIZUJ SALDA W PORTFELU",
|
||||
"view": "Pogląd",
|
||||
"all": "Wszystko",
|
||||
"page": "Strona"
|
||||
"view": "Pogląd"
|
||||
},
|
||||
"gifs": {
|
||||
"gchange1": "Eksplorator gifów",
|
||||
@ -286,7 +275,7 @@
|
||||
"startminting": {
|
||||
"smchange1": "Nie można pobrać kont menniczych",
|
||||
"smchange2": "Nie udało się usunąć klucza",
|
||||
"smchange3": "Nie udało się dodać klucza Minting. Jeśli klucz został właśnie utworzony, spróbuj poczekać kilka bloków i dodać go ponownie",
|
||||
"smchange3": "Nie udało się dodać klucza bicia",
|
||||
"smchange4": "Nie można utworzyć klucza sponsorowania",
|
||||
"smchange5": "Tworzenie relacji",
|
||||
"smchange6": "Oczekiwanie na potwierdzenie na blockchain",
|
||||
@ -405,8 +394,7 @@
|
||||
"wchange55": "Twoja istniejąca książka adresowa zostanie usunięta, az kopii zapasowej utworzona nowa.",
|
||||
"wchange56": "OSTRZEŻENIE!",
|
||||
"wchange57": "Memo",
|
||||
"wchange58": "Nowy Adres",
|
||||
"wchange59": "Moneta"
|
||||
"wchange58": "Nowy Adres"
|
||||
},
|
||||
"tradepage": {
|
||||
"tchange1": "Portal Handlowy",
|
||||
@ -509,7 +497,7 @@
|
||||
"nchange23": "Cena sprzedaży",
|
||||
"nchange24": "Brak nazw do sprzedania",
|
||||
"nchange25": "Nazwa do sprzedania",
|
||||
"nchange26": "Czy na pewno chcesz sprzedać tę nazwę? Jeśli nazwa zostanie zakupiona przez inne konto, będzie to poza Twoją kontrolą!",
|
||||
"nchange26": "Czy na pewno chcesz sprzedać tę nazwę?",
|
||||
"nchange27": "Za tę cenę w QORT",
|
||||
"nchange28": "Po naciśnięciu potwierdzenia zostanie wysłane zapytanie o nazwę sprzedaży!",
|
||||
"nchange29": "Nazwa do anulowania",
|
||||
@ -530,8 +518,7 @@
|
||||
"nchange44": "Do nowej nazwy",
|
||||
"nchange45": "Po naciśnięciu potwierdzenia, prośba o aktualizację nazwy zostanie wysłana!",
|
||||
"nchange46": "Historia sprzedaży nazw",
|
||||
"nchange47": "Aktualizacja nazwy powiodła się!",
|
||||
"nchange48": "Ostrzeżenie! Jeśli zaktualizujesz swoją nazwę, utracisz zasoby powiązane z pierwotną nazwą. Innymi słowy, utracisz własność treści pod oryginalną nazwą w QDN. Postępuj ostrożnie!"
|
||||
"nchange47": "Aktualizacja nazwy powiodła się!"
|
||||
},
|
||||
"websitespage": {
|
||||
"schange1": "Przeglądaj strony internetowe",
|
||||
@ -612,8 +599,7 @@
|
||||
"schange39": "Otwórz",
|
||||
"schange40": "Podgląd",
|
||||
"schange41": "Pobieranie, proszę czekać...",
|
||||
"schange42": "Pliki pobrane",
|
||||
"schange43": "Wszelkie próby pobierania będą kontynuowane w tle. Spróbuj ponownie za chwilę."
|
||||
"schange42": "Pliki pobrane"
|
||||
},
|
||||
"tubespage": {
|
||||
"schange1": "Przeglądaj Q-Tubes",
|
||||
@ -735,14 +721,7 @@
|
||||
"bchange44": "Czy zezwalasz tej aplikacji na usunięcie z tej listy?",
|
||||
"bchange45": "Szyfruj",
|
||||
"bchange46": "Czy zezwalasz tej aplikacji na zapisanie następującego pliku",
|
||||
"bchange47": "Błyskawiczna publikacja - wymaga",
|
||||
"bchange48": "Czy dajesz tej aplikacji pozwolenie na wysyłanie Ci powiadomień",
|
||||
"bchange49": "Czy dajesz tej aplikacji pozwolenie na uzyskanie informacji o Twoim portfelu?",
|
||||
"bchange50": "Ta aplikacja zażądała zmiany w Twoim profilu publicznym. Właściwość: ",
|
||||
"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?"
|
||||
"bchange47": "Błyskawiczna publikacja - wymaga"
|
||||
},
|
||||
"datapage": {
|
||||
"dchange1": "Zarządzanie danymi",
|
||||
@ -842,37 +821,13 @@
|
||||
"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 10 MB",
|
||||
"cchange77": "Rozmiar załącznika przekracza 1 MB",
|
||||
"cchange78": "Czy na pewno chcesz usunąć ten obraz?",
|
||||
"cchange79": "Czy na pewno chcesz usunąć ten załącznik?",
|
||||
"cchange80": "Ten obraz został usunięty",
|
||||
"cchange81": "Ten typ obrazu nie jest obsługiwany",
|
||||
"cchange82": "Ten załącznik został usunięty",
|
||||
"cchange90": "Brak wiadomości",
|
||||
"cchange91": "Wysyłanie...",
|
||||
"cchange92": "Nieprzeczytane wiadomości poniżej",
|
||||
"cchange93": "Obraz skopiowany do schowka",
|
||||
"cchange94": "załadowano",
|
||||
"cchange95": "Tylko moje zasoby",
|
||||
"cchange96": "Otwarte zarządzanie grupą",
|
||||
"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ś ..."
|
||||
"cchange90": "Brak wiadomości"
|
||||
},
|
||||
"welcomepage": {
|
||||
"wcchange1": "Witamy w Q-Chat",
|
||||
@ -964,19 +919,7 @@
|
||||
"gchange56": "Nazwa grupy do wyszukania",
|
||||
"gchange57": "Nie znaleziono nazwy grupy prywatnej",
|
||||
"gchange58": "Zauważ, że nazwa grupy musi dokładnie pasować.",
|
||||
"gchange59": "Pokaż / Ukryj Znacznik",
|
||||
"gchange60": "Podaj nazwę grupy",
|
||||
"gchange61": "Podaj opis",
|
||||
"gchange62": "Czy na pewno AKTUALIZUJESZ tę grupę?",
|
||||
"gchange63": "Po naciśnięciu przycisku POTWIERDŹ zostanie wysłane żądanie UPDATE_GROUP!",
|
||||
"gchange64": "Current Owner / New Owner",
|
||||
"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",
|
||||
"gchange69": "Wiadomości",
|
||||
"gchange70": "Brak wiadomości w ciągu ostatnich 24 godzin!",
|
||||
"gchange71": "Już dołączyłeś do tej grupy!"
|
||||
"gchange59": "Pokaż / Ukryj Znacznik"
|
||||
},
|
||||
"puzzlepage": {
|
||||
"pchange1": "Zagadki",
|
||||
@ -1031,16 +974,7 @@
|
||||
"nchange31": "Zatrzymaj węzeł",
|
||||
"nchange32": "Pomyślnie wysłane żądanie zatrzymania!",
|
||||
"nchange33": "Uruchom ponownie węzeł",
|
||||
"nchange34": "Pomyślnie wysłane żądanie ponownego uruchomienia!",
|
||||
"nchange35": "Węzeł startowy",
|
||||
"nchange36": "Węzeł został pomyślnie uruchomiony!",
|
||||
"nchange37": "Kliknięcie Kontynuuj spowoduje odświeżenie rdzenia Qortal, Twoja baza danych zostanie usunięta i pobierzesz nową kopię bazy danych, co nazywa się ładowaniem.",
|
||||
"nchange38": "Napraw portfel LTC",
|
||||
"nchange39": "To naprawi portfele LTC, które pokazują saldo, którego nie można wydać. Wymaga wykonania jednej transakcji w sieci Litecoin, po potwierdzeniu saldo portfela będzie działać i problem się nie powtórzy.",
|
||||
"nchange40": "Ta transakcja będzie wymagała niewielkiej opłaty LTC. Kontynuować?",
|
||||
"nchange41": "Próbuję naprawić. Proszę czekać...",
|
||||
"nchange42": "Pomyślnie naprawiono portfel LTC!",
|
||||
"nchange43": "Wystąpił błąd podczas próby naprawy portfela LTC. Spróbuj ponownie!"
|
||||
"nchange34": "Pomyślnie wysłane żądanie ponownego uruchomienia!"
|
||||
},
|
||||
"transpage": {
|
||||
"tchange1": "Żądanie transakcji",
|
||||
@ -1075,16 +1009,7 @@
|
||||
"rewarddialog3": "Jeśli tak, musisz zapisać poniższy klucz, aby wybić. Może być dostarczony do dowolnego węzła, aby umożliwić mu bicie w Twoim imieniu.",
|
||||
"rewarddialog4": "Po naciśnięciu przycisku Potwierdź udział w nagrodach zostanie utworzony, ale nadal będziesz musiał dostarczyć powyższy klucz do węzła, aby wybić z konta.",
|
||||
"rewarddialog5": "Usuwasz transakcję dotyczącą udziału w nagrodach powiązaną z kontem:",
|
||||
"rewarddialog6": "Po naciśnięciu przycisku Potwierdź udział w nagrodach zostanie usunięty, a klucz bicia stanie się nieważny.",
|
||||
"deployAtdialog1": "Wdrażasz terminal AT",
|
||||
"deployAtdialog2": "Po naciśnięciu przycisku potwierdzenia terminal AT zostanie wdrożony!",
|
||||
"deployAtdialog3": "Saldo kwoty początkowej",
|
||||
"votedialog1": "Prosimy o oddanie głosu w poniższej ankiecie:",
|
||||
"votedialog2": "Po naciśnięciu potwierdzenia zostanie wysłana prośba o głos!",
|
||||
"votedialog3": "Prosisz o utworzenie poniższej ankiety:",
|
||||
"votedialog4": "Opis ankiety",
|
||||
"votedialog5": "Opcje",
|
||||
"votedialog6": "Po naciśnięciu potwierdzenia ankieta zostanie utworzona!"
|
||||
"rewarddialog6": "Po naciśnięciu przycisku Potwierdź udział w nagrodach zostanie usunięty, a klucz bicia stanie się nieważny."
|
||||
},
|
||||
"sponsorshipspage": {
|
||||
"schange1": "Aktywny Sponsoring",
|
||||
@ -1215,9 +1140,7 @@
|
||||
"inf15": "Aktywne automatyczne zamówienia zakupu",
|
||||
"inf16": "Automatyczny zakup",
|
||||
"inf17": "Przełącz na jasny motyw",
|
||||
"inf18": "Przełącz na ciemny motyw",
|
||||
"inf19": "Informacje handlowe",
|
||||
"inf20": "Kupujący"
|
||||
"inf18": "Przełącz na ciemny motyw"
|
||||
},
|
||||
"lotterypage": {
|
||||
"lot1": "Otwarte loterie Qortal",
|
||||
@ -1233,101 +1156,5 @@
|
||||
"lot11": "Nie ma otwartych loterii!",
|
||||
"lot12": "Brak gotowych loterii!",
|
||||
"lot13": "Gracze"
|
||||
},
|
||||
"notifications": {
|
||||
"notify1": "Potwierdzenie transakcji",
|
||||
"notify2": "Transakcja potwierdzona",
|
||||
"explanation": "Twoja transakcja jest potwierdzana. Aby śledzić jej postęp, kliknij ikonę dzwonka.",
|
||||
"status1": "W pełni zsynchronizowane",
|
||||
"status2": "Nie zsynchronizowane",
|
||||
"notify3": "Brak powiadomień",
|
||||
"notify4": "Powiadomienia o wysyłaniu"
|
||||
},
|
||||
"friends": {
|
||||
"friend1": "Dodaj nazwę",
|
||||
"friend2": "Dodaj znajomego",
|
||||
"friend3": "Dodanie znajomego umożliwia łatwe nawiązanie kontaktu z tą osobą. Pamiętaj także o obserwowaniu tego użytkownika, aby wesprzeć hosting jego opublikowanych zasobów.",
|
||||
"friend4": "Notatki",
|
||||
"friend5": "Podążaj za imieniem",
|
||||
"friend6": "Alias",
|
||||
"friend7": "Dodaj alias, aby lepiej zapamiętać znajomego (opcjonalnie)",
|
||||
"friend8": "Wyślij Q-Chat",
|
||||
"friend9": "Wyślij Q-Maila",
|
||||
"friend10": "Edytuj przyjaciela",
|
||||
"friend11": "Następny",
|
||||
"friend12": "Przyjaciele",
|
||||
"friend13": "Karmić",
|
||||
"friend14": "Usunąć znajomego",
|
||||
"friend15": "Ustawienia kanału",
|
||||
"friend16": "Wybierz aplikacje Q-Apps, z których chcesz otrzymywać aktualizacje, szczególnie te dotyczące Twoich znajomych.",
|
||||
"friend17": "Brak elementów w Twoim kanale"
|
||||
},
|
||||
"save": {
|
||||
"saving1": "Nie można pobrać zapisanych ustawień",
|
||||
"saving2": "Nic do uratowania",
|
||||
"saving3": "Zapisz niezapisane zmiany",
|
||||
"saving4": "Cofnij zmiany"
|
||||
},
|
||||
"profile": {
|
||||
"profile1": "Nie masz imienia",
|
||||
"profile2": "Przejdź do rejestracji nazwy",
|
||||
"profile3": "Aktualizuj profil",
|
||||
"profile4": "Slogan",
|
||||
"profil5": "Bio",
|
||||
"profile6": "Adresy portfeli",
|
||||
"profile7": "Wypełnij z interfejsu użytkownika",
|
||||
"profile8": "Dodaj niestandardową właściwość",
|
||||
"profile9": "Nazwa właściwości",
|
||||
"profile10": "Pola",
|
||||
"profile11": "Dodaj pole",
|
||||
"profile12": "Nazwa pola",
|
||||
"profile13": "Wartość pola",
|
||||
"profile14": "Aktywność",
|
||||
"profile15": "Brak wartości",
|
||||
"profile16": "Ta nazwa nie ma profilu",
|
||||
"profile17": "Nie można pobrać profilu",
|
||||
"profile18": "Otwórz profil",
|
||||
"profile19": "Nie można pobrać profilu",
|
||||
"profile20": "Zarejestruj nazwę",
|
||||
"profile21": "Wstaw adres z interfejsu użytkownika",
|
||||
"profile22": "Sukces",
|
||||
"profile23": "zaszyfrowane",
|
||||
"profile24": "Musisz wypełnić zarówno nazwę pola, jak i wartość pola, aby dodać niestandardową właściwość",
|
||||
"profile25": "Jest Twoim przyjacielem",
|
||||
"profile26": "Dodaj jako znajomego"
|
||||
},
|
||||
"tour": {
|
||||
"tour1": "Aby móc korzystać z Qortal, rdzeń musi być zsynchronizowany. Ta ikona będzie niebieska podczas synchronizacji.",
|
||||
"tour2": "Zsynchronizowane",
|
||||
"tour3": "Synchronizacja i bicie",
|
||||
"tour4": "Synchronizacja",
|
||||
"tour5": "Zsynchronizuj swój rdzeń",
|
||||
"tour6": "Niepowstrzymana siła Qortalu",
|
||||
"tour7": "Tylko Ty masz kontrolę nad swoimi danymi w Qortal",
|
||||
"tour8": "Qortal nie może zostać zdemontowany",
|
||||
"tour9": "Całkowicie peer-to-peer, bez scentralizowanych pośredników",
|
||||
"tour10": "To jest domyślny widok karty, w którym możesz uzyskać dostęp do ważnych ustawień Qortal i aplikacji Q, takich jak Q-Tube.",
|
||||
"tour11": "Zdobądź pełne doświadczenie",
|
||||
"tour12": "Aby uzyskać pełne doświadczenie Qortal, zalecamy skorzystanie z tej listy kontrolnej.",
|
||||
"tour13": "Jesteś w pełni zsynchronizowany! Możesz teraz doświadczyć mocy blockchainu Qortal.",
|
||||
"tour14": "Spróbujmy odwiedzić Q-Tube!",
|
||||
"tour15": "Odwiedź Q-Tube",
|
||||
"tour16": "Lista kontrolna",
|
||||
"tour17": "Uruchom Core, aby uzyskać dostęp do blockchainu Qortal.",
|
||||
"tour18": "Odśwież (bootstrap)",
|
||||
"tour19": "Aktualnie synchronizuję... musisz być w pełni zsynchronizowany, aby móc korzystać z Qortal",
|
||||
"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"
|
||||
}
|
||||
}
|
||||
}
|
@ -5,10 +5,8 @@
|
||||
"chinese1": "Chinês Simplificado)",
|
||||
"chinese2": "Chinês (Tradicional)",
|
||||
"croatian": "Croata",
|
||||
"dutch": "Holandês",
|
||||
"english": "Inglês",
|
||||
"estonian": "Estoniano",
|
||||
"finnish": "Finlandês",
|
||||
"french": "Francês",
|
||||
"german": "Alemão",
|
||||
"hindi": "Hindu",
|
||||
@ -80,7 +78,7 @@
|
||||
"tm32": "Esta conta não segue nenhum usuário",
|
||||
"tm33": "Menu da Aba Importar",
|
||||
"tm34": "Menu da guia Exportar",
|
||||
"tm35": "Seu menu de guias existente será excluído e definido como menu de guias importado.",
|
||||
"tm35": "Seu menu de guia existente será excluído e definido como menu de guia carregado.",
|
||||
"tm36": "Menu de abas restaurado com sucesso",
|
||||
"tm37": "Menu da guia salvo com sucesso como",
|
||||
"tm38": "MODO DEV",
|
||||
@ -98,43 +96,43 @@
|
||||
"youraccounts": "Minhas Contas",
|
||||
"clickto": "Clique em sua conta para fazer o login",
|
||||
"needcreate": "Você precisa criar ou salvar uma conta antes de fazer o login",
|
||||
"upload": "Importe seu arquivo de backup Qortal",
|
||||
"upload": "Carregue seu backup do Qortal",
|
||||
"howlogin": "Como você gostaria de fazer o login?",
|
||||
"seed": "SeedPhrase",
|
||||
"seedphrase": "seedphrase",
|
||||
"saved": "Conta Salva",
|
||||
"qora": "Endereço seed do QORA",
|
||||
"backup": "Arquivo de backup Qortal",
|
||||
"decrypt": "Descriptografar arquivo de backup",
|
||||
"qora": "Endereço seed do Qora",
|
||||
"backup": "Backup da carteira do Qortal",
|
||||
"decrypt": "Desencriptar Backup",
|
||||
"save": "Salvar neste Navegador",
|
||||
"prepare": "Preparando sua Conta...",
|
||||
"areyousure": "Tem certeza de que deseja remover esta conta das contas salvas? (Se for removida e não existir nenhum arquivo de backup, a conta poderá ser perdida para sempre! Certifique-se de ter um arquivo de backup antes de fazer isso!)",
|
||||
"prepare": "Preparando sua Conta",
|
||||
"areyousure": "Tem certeza que deseja excluir esta carteira das carteiras salvas?",
|
||||
"error1": "Backup tem que ser um JSON valido",
|
||||
"error2": "Login opcional não selecionado",
|
||||
"createwelcome": "Bem-vindo ao Qortal! Seu futuro digital descentralizado espera por você! Somente no Qortal você tem controle absoluto sobre seus dados. Qortal fornece o nível básico de um mundo digital novo e totalmente controlado pelo usuário.",
|
||||
"createwelcome": "Bem-vindo ao Qortal, você vai achar que é semelhante ao de um jogo de RPG, você, como um mineirador na rede Qortal (se você escolher se tornar um) terá a chance de prosperar com sua conta, dando-lhe tanto mais da recompensa do bloco QORT e também maior influência sobre a rede em termos de votação sobre decisões para a plataforma.",
|
||||
"createa": "A",
|
||||
"click": "Clique para ver a SeedPhrase",
|
||||
"confirmpass": "Confirme sua Senha",
|
||||
"willbe": "Será gerado aleatoriamente em segundo plano. Se você deseja VER a frase-semente, clique na 'frase-semente' destacada neste texto. Ele é usado como gerador de chave privada para sua conta blockchain no Qortal. Por segurança, por padrão, as frases-chave não são exibidas, a menos que sejam especificamente escolhidas para serem.",
|
||||
"willbe": "Será gerado aleatoriamente em segundo plano. Este é usado como seu gerador de chaves privada para sua conta blockchain no Qortal.",
|
||||
"clicknext": "Crie sua conta no Qortal clicando em PRÓXIMO abaixo.",
|
||||
"ready": "Sua conta agora está pronta para ser criada. Ele será salvo nesta cópia da UI do Qortal por padrão, em formato criptografado. Se não quiser que sua nova conta seja salva aqui, você pode desmarcar a caixa abaixo. Você ainda poderá fazer login com sua nova conta (após sair), usando o arquivo de backup da carteira que você DEVE baixar depois de criar sua conta.",
|
||||
"ready": "Sua conta está pronta para ser criada. Ela será salva neste navegador. Se você não deseja que sua nova conta seja salva no seu navegador, você pode desmarcar a caixa abaixo. Você ainda poderá fazer o login com sua nova conta (após o login), usando seu arquivo de backup de carteira que você deve baixar assim que criar sua conta.",
|
||||
"welmessage": "Bem-vindo ao Qortal",
|
||||
"pleaseenter": "Por favor coloque sua senha!",
|
||||
"notmatch": "Senhas não correspondem!",
|
||||
"lessthen8": "Sua senha é menor que 5 caracteres! Isso não é recomendado. Você pode continuar e ignorar este aviso.",
|
||||
"lessthen8-2": "Sua senha é menor que 5 caracteres!",
|
||||
"entername": "Por favor insira um nome de exibição!",
|
||||
"downloaded": "Seu arquivo Qortal Backup foi salvo!",
|
||||
"lessthen8": "Sua senha é menor que 8 caracteres! Isso não é recomendado. Você pode continuar e ignorar este aviso.",
|
||||
"lessthen8-2": "Sua senha é menor que 8 caracteres!",
|
||||
"entername": "Por favor, digite um nome!",
|
||||
"downloaded": "Seu arquivo Wallet BackUp é baixado!",
|
||||
"loading": "Carregando, por favor espere...",
|
||||
"createdseed": "Sua Seedphrase Criada",
|
||||
"saveseed": "Salvar Seedphrase",
|
||||
"savein": "Salvar nesta IU",
|
||||
"savein": "Salvar no Navegador",
|
||||
"backup2": "Este arquivo é a única forma de acessar sua conta em um sistema que não o tem salvo no aplicativo/navegador. CERTIFIQUE-SE DE FAZER BACKUP DESTE ARQUIVO EM VÁRIOS LUGARES. O arquivo é criptografado com muita segurança e descriptografado com sua senha local que você criou na etapa anterior. Você pode salvá-lo em qualquer lugar com segurança, mas certifique-se de fazer isso em vários locais.",
|
||||
"savewallet": "Salvar arquivo de backup Qortal",
|
||||
"savewallet": "Salvar Arquivo de BackUp da Carteira",
|
||||
"created1": "Sua conta foi Criada",
|
||||
"created2": " e salvo criptografado nesta UI Qortal.",
|
||||
"downloadbackup": "Salvar arquivo de backup Qortal",
|
||||
"passwordhint": "Uma senha deve ter pelo menos 5 caracteres.",
|
||||
"created2": "e será salva neste navegador.",
|
||||
"downloadbackup": "Baixe o Arquivo BackUp da Carteira",
|
||||
"passwordhint": "Uma senha deve ter pelo menos 8 caracteres.",
|
||||
"lp1": "Tela de bloqueio",
|
||||
"lp2": "Nenhuma senha de tela de bloqueio foi definida!",
|
||||
"lp3": "Defina um",
|
||||
@ -164,7 +162,7 @@
|
||||
},
|
||||
"fragfile": {
|
||||
"selectfile": "Selecione Arquivo",
|
||||
"dragfile": "Arraste e solte ou clique aqui para selecionar o arquivo de backup"
|
||||
"dragfile": "Arrastar e soltar backup aqui"
|
||||
},
|
||||
"settings": {
|
||||
"generalinfo": "Informações gerais da conta",
|
||||
@ -181,8 +179,9 @@
|
||||
"notifications": "Notificações",
|
||||
"accountsecurity": "Segurança da Conta",
|
||||
"password": "Senha",
|
||||
"download": "Exportar/Salvar arquivo de backup",
|
||||
"download": "Baixar Arquivo BackUp",
|
||||
"choose": "Por favor, escolha uma senha para criptografar seu backup. (Essa pode ser a mesma que você fez login, ou outra diferente)",
|
||||
"block": "Notificações de bloco (em breve...)",
|
||||
"playsound": "Reproduzir som",
|
||||
"shownotifications": "Mostrar notificações",
|
||||
"nodeurl": "Url do nódulo",
|
||||
@ -192,8 +191,8 @@
|
||||
"protocol": "Protocolo",
|
||||
"domain": "Domínio",
|
||||
"port": "Portar",
|
||||
"import": "Importar nós salvos",
|
||||
"export": "Exportar Nós salvos",
|
||||
"import": "Importar Nós",
|
||||
"export": "Exportar Nós",
|
||||
"deletecustomnode": "Remover todos os nós personalizados",
|
||||
"warning": "Seus nós existentes serão excluídos e do backup será criado.",
|
||||
"snack1": "Nós padrão excluídos e adicionados com sucesso",
|
||||
@ -201,20 +200,12 @@
|
||||
"snack3": "Nó personalizado adicionado e salvo com sucesso",
|
||||
"snack4": "Nós salvos com sucesso como",
|
||||
"snack5": "Nós importados com sucesso",
|
||||
"snack6": "Nó personalizado removido com sucesso",
|
||||
"snack7": "Nó personalizado editado com sucesso",
|
||||
"exp1": "Exportar chave privada mestra (xpriv)",
|
||||
"exp1": "Exportar Chave Mestra Privada",
|
||||
"exp2": "Exportar Chave Mestra",
|
||||
"exp3": "Exportar",
|
||||
"exp4": "Por favor, escolha uma carteira para fazer backup da chave privada mestra.",
|
||||
"core": "Configurações de inicialização automática do Qortal Core",
|
||||
"qappNotification1": "Notificações de Q-App",
|
||||
"selectnode": "Por favor selecione uma opção",
|
||||
"arrr1": "Carteira ARRR não inicializada!",
|
||||
"arrr2": "Por favor, vá para a guia carteira e acesse a carteira ARRR para inicializar a carteira primeiro.",
|
||||
"arrr3": "Precisa de atualização principal!",
|
||||
"arrr4": "Para salvar a chave privada da sua carteira ARRR você deve primeiro atualizar o Qortal Core!",
|
||||
"sync_indicator": "Desativar pop-up do indicador de sincronização"
|
||||
"exp4": "Por favor, escolha uma carteira para fazer backup da chave mestra privada.",
|
||||
"core": "Iniciar configurações do núcleo",
|
||||
"qappNotification1": "Notificações de Q-App"
|
||||
},
|
||||
"appinfo": {
|
||||
"blockheight": "Altura do Bloco",
|
||||
@ -248,9 +239,7 @@
|
||||
"balance": "Saldo",
|
||||
"balances": "SEUS SALDOS DE CARTEIRA",
|
||||
"update": "ATUALIZAR SALDOS DA CARTEIRA",
|
||||
"view": "Ver",
|
||||
"all": "Todos",
|
||||
"page": "Página"
|
||||
"view": "Ver"
|
||||
},
|
||||
"gifs": {
|
||||
"gchange1": "Gif Explorer",
|
||||
@ -285,8 +274,8 @@
|
||||
},
|
||||
"startminting": {
|
||||
"smchange1": "Não é possível buscar contas de cunhagem",
|
||||
"smchange2": "Falha ao remover a chave Minting",
|
||||
"smchange3": "Falha ao adicionar a chave Minting, se a chave acabou de ser criada, tente esperar alguns blocos e adicionar novamente",
|
||||
"smchange2": "Falha ao remover a chave",
|
||||
"smchange3": "Falha ao adicionar chave de cunhagem",
|
||||
"smchange4": "Não é possível criar a chave de patrocínio",
|
||||
"smchange5": "Criando relacionamento",
|
||||
"smchange6": "Aguardando confirmação no blockchain",
|
||||
@ -405,8 +394,7 @@
|
||||
"wchange55": "Seu catálogo de endereços existente será excluído e o backup será criado novamente.",
|
||||
"wchange56": "AVISO!",
|
||||
"wchange57": "Memorando",
|
||||
"wchange58": "Novo Endereço",
|
||||
"wchange59": "Moeda"
|
||||
"wchange58": "Novo Endereço"
|
||||
},
|
||||
"tradepage": {
|
||||
"tchange1": "Portal do Comércio",
|
||||
@ -509,7 +497,7 @@
|
||||
"nchange23": "Preço de venda",
|
||||
"nchange24": "Sem nomes para vender",
|
||||
"nchange25": "Nome para vender",
|
||||
"nchange26": "Tem certeza de que deseja vender este nome? Se o nome for adquirido por outra conta, os dados publicados por esse nome não poderão ser editados por você!",
|
||||
"nchange26": "Tem certeza que vende este nome ?",
|
||||
"nchange27": "Por este preço em QORT",
|
||||
"nchange28": "Ao clicar em confirmar, a solicitação do nome de venda será enviada!",
|
||||
"nchange29": "Nome para Cancelar",
|
||||
@ -530,8 +518,7 @@
|
||||
"nchange44": "Para o novo nome",
|
||||
"nchange45": "Ao pressionar confirmar, a solicitação de atualização de nome será enviada!",
|
||||
"nchange46": "Histórico de vendas de nomes",
|
||||
"nchange47": "Atualização de nome com sucesso!",
|
||||
"nchange48": "Atenção! Se você atualizar seu nome, você perderá os recursos associados ao nome original. Em outras palavras, você perderá a propriedade do conteúdo sob o nome original no QDN. Prossiga com cuidado!"
|
||||
"nchange47": "Atualização de nome com sucesso!"
|
||||
},
|
||||
"websitespage": {
|
||||
"schange1": "Navegar Sites",
|
||||
@ -612,8 +599,7 @@
|
||||
"schange39": "Abrir",
|
||||
"schange40": "Pré-visualização",
|
||||
"schange41": "Baixando, por favor, aguarde...",
|
||||
"schange42": "Arquivos baixados",
|
||||
"schange43": "Qualquer tentativa de download continuará em segundo plano, tente novamente depois de um tempo."
|
||||
"schange42": "Arquivos baixados"
|
||||
},
|
||||
"tubespage": {
|
||||
"schange1": "Navegar Q-Tubes",
|
||||
@ -735,14 +721,7 @@
|
||||
"bchange44": "Você dá a este aplicativo permissão para deletar desta lista?",
|
||||
"bchange45": "Criptografar",
|
||||
"bchange46": "Você concede permissão a este aplicativo para salvar o seguinte arquivo",
|
||||
"bchange47": "Publicação instantânea - requer",
|
||||
"bchange48": "Você dá permissão a este aplicativo para enviar notificações para você?",
|
||||
"bchange49": "Você dá permissão a este aplicativo para obter informações da sua carteira?",
|
||||
"bchange50": "Este aplicativo solicitou uma alteração em seu perfil público. Propriedade: ",
|
||||
"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?"
|
||||
"bchange47": "Publicação instantânea - requer"
|
||||
},
|
||||
"datapage": {
|
||||
"dchange1": "Gerenciamento de Dados",
|
||||
@ -842,37 +821,13 @@
|
||||
"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 10 MB",
|
||||
"cchange77": "O tamanho do anexo excede 1 MB",
|
||||
"cchange78": "Tem certeza que deseja excluir esta imagem?",
|
||||
"cchange79": "Tem certeza que deseja excluir este anexo?",
|
||||
"cchange80": "Esta imagem foi apagada",
|
||||
"cchange81": "Este tipo de imagem não é suportado",
|
||||
"cchange82": "Este anexo foi deletado",
|
||||
"cchange90": "Sem mensagens",
|
||||
"cchange91": "Enviando...",
|
||||
"cchange92": "Mensagens não lidas abaixo",
|
||||
"cchange93": "Imagem copiada para a área de transferência",
|
||||
"cchange94": "carregado",
|
||||
"cchange95": "Somente meus recursos",
|
||||
"cchange96": "Gerenciamento de grupo aberto",
|
||||
"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 ..."
|
||||
"cchange90": "Sem mensagens"
|
||||
},
|
||||
"welcomepage": {
|
||||
"wcchange1": "Bem-vindo ao Q-Chat",
|
||||
@ -964,19 +919,7 @@
|
||||
"gchange56": "Nome do grupo para pesquisar",
|
||||
"gchange57": "Nome do grupo privado não encontrado",
|
||||
"gchange58": "Observe que o nome do grupo deve corresponder exatamente.",
|
||||
"gchange59": "Mostrar / Ocultar Ticker",
|
||||
"gchange60": "Insira o nome do grupo",
|
||||
"gchange61": "Por favor, insira a descrição",
|
||||
"gchange62": "Tem certeza de que vai ATUALIZAR este grupo?",
|
||||
"gchange63": "Ao pressionar CONFIRMAR, a solicitação de UPDATE_GROUP será enviada!",
|
||||
"gchange64": "Proprietário Atual / Novo Proprietário",
|
||||
"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",
|
||||
"gchange69": "Mensagens",
|
||||
"gchange70": "Nenhuma mensagem nas últimas 24 horas!",
|
||||
"gchange71": "Você já entrou neste grupo!"
|
||||
"gchange59": "Mostrar / Ocultar Ticker"
|
||||
},
|
||||
"puzzlepage": {
|
||||
"pchange1": "Enigmas",
|
||||
@ -1031,16 +974,7 @@
|
||||
"nchange31": "Parar Nódulo",
|
||||
"nchange32": "Pedido de parada enviado com sucesso!",
|
||||
"nchange33": "Reiniciar Nódulo",
|
||||
"nchange34": "Pedido de reinicialização enviado com sucesso!",
|
||||
"nchange35": "Nó inicial",
|
||||
"nchange36": "Nó iniciado com sucesso!",
|
||||
"nchange37": "Clicar em continuar atualizará seu Qortal Core, seu banco de dados será removido e você baixará uma nova cópia do banco de dados, chamada bootstrapping.",
|
||||
"nchange38": "Reparar carteira LTC",
|
||||
"nchange39": "Isto irá reparar carteiras LTC que apresentam um saldo que não pode ser gasto. Requer que uma única transação seja feita na rede Litecoin, após a confirmação o saldo da carteira estará funcional e o problema não acontecerá novamente.",
|
||||
"nchange40": "Esta transação consumirá uma pequena taxa LTC. Continuar?",
|
||||
"nchange41": "Tentando reparar. Aguarde...",
|
||||
"nchange42": "Carteira LTC reparada com sucesso!",
|
||||
"nchange43": "Ocorreu um erro ao tentar reparar a carteira LTC. Tente novamente!"
|
||||
"nchange34": "Pedido de reinicialização enviado com sucesso!"
|
||||
},
|
||||
"transpage": {
|
||||
"tchange1": "Pedido de transação",
|
||||
@ -1075,16 +1009,7 @@
|
||||
"rewarddialog3": "Se sim, você precisará salvar a chave abaixo para cunhar. Ele pode ser fornecido a qualquer nó para permitir que seja cunhado em seu nome.",
|
||||
"rewarddialog4": "Ao pressionar confirmar, a recompensa será criada, mas você ainda precisará fornecer a chave acima para um nó para cunhar com a conta.",
|
||||
"rewarddialog5": "Você está removendo uma transação de compartilhamento de recompensa associada à conta:",
|
||||
"rewarddialog6": "Ao pressionar confirmar, o rewardshare será removido e a chave de cunhagem se tornará inválida.",
|
||||
"deployAtdialog1": "Você está implantando o AT",
|
||||
"deployAtdialog2": "Ao pressionar confirmar, o AT será implantado!",
|
||||
"deployAtdialog3": "Saldo do valor inicial",
|
||||
"votedialog1": "Você está solicitando votar na enquete abaixo:",
|
||||
"votedialog2": "Ao pressionar confirmar, o pedido de voto será enviado!",
|
||||
"votedialog3": "Você está solicitando a criação da enquete abaixo:",
|
||||
"votedialog4": "Descrição da enquete",
|
||||
"votedialog5": "Opções",
|
||||
"votedialog6": "Ao pressionar confirmar, a enquete será criada!"
|
||||
"rewarddialog6": "Ao pressionar confirmar, o rewardshare será removido e a chave de cunhagem se tornará inválida."
|
||||
},
|
||||
"sponsorshipspage": {
|
||||
"schange1": "Patrocínios Ativos",
|
||||
@ -1215,9 +1140,7 @@
|
||||
"inf15": "Ordens de compra automática ativas",
|
||||
"inf16": "Compra automática",
|
||||
"inf17": "Mudar para tema claro",
|
||||
"inf18": "Mudar para o tema escuro",
|
||||
"inf19": "Informações comerciais",
|
||||
"inf20": "Comprador"
|
||||
"inf18": "Mudar para o tema escuro"
|
||||
},
|
||||
"lotterypage": {
|
||||
"lot1": "Loterias Qortal Abertas",
|
||||
@ -1233,101 +1156,5 @@
|
||||
"lot11": "Não existem loterias abertas!",
|
||||
"lot12": "Não há loterias concluídas!",
|
||||
"lot13": "Jogadores"
|
||||
},
|
||||
"notifications": {
|
||||
"notify1": "Confirmando transação",
|
||||
"notify2": "Transação confirmada",
|
||||
"explanation": "Sua transação está sendo confirmada. Para acompanhar seu progresso, clique no ícone do sino.",
|
||||
"status1": "Totalmente sincronizado",
|
||||
"status2": "Não sincronizado",
|
||||
"notify3": "Nenhuma notificação",
|
||||
"notify4": "Notificações de transferência"
|
||||
},
|
||||
"friends": {
|
||||
"friend1": "Adicionar nome",
|
||||
"friend2": "Adicionar amigo",
|
||||
"friend3": "Adicionar um amigo permite que você se conecte facilmente com essa pessoa. Certifique-se também de seguir esse usuário para oferecer suporte à hospedagem de seus recursos publicados.",
|
||||
"friend4": "Notas",
|
||||
"friend5": "Seguir nome",
|
||||
"friend6": "Alias",
|
||||
"friend7": "Adicione um alias para lembrar melhor do seu amigo (opcional)",
|
||||
"friend8": "Enviar Q-Chat",
|
||||
"friend9": "Enviar Q-Mail",
|
||||
"friend10": "Editar amigo",
|
||||
"friend11": "Seguindo",
|
||||
"friend12": "Amigos",
|
||||
"friend13": "Alimentar",
|
||||
"friend14": "Remover amigo",
|
||||
"friend15": "Configurações de feed",
|
||||
"friend16": "Selecione os Q-Apps dos quais deseja atualizações, especialmente aqueles relacionados aos seus amigos.",
|
||||
"friend17": "Nenhum item em seu feed"
|
||||
},
|
||||
"save": {
|
||||
"saving1": "Não foi possível buscar as configurações salvas",
|
||||
"saving2": "Nada para salvar",
|
||||
"saving3": "Salvar alterações não salvas",
|
||||
"saving4": "Desfazer mudanças"
|
||||
},
|
||||
"profile": {
|
||||
"profile1": "Você não tem nome",
|
||||
"profile2": "Ir para registro de nome",
|
||||
"profile3": "Atualizar perfil",
|
||||
"profile4": "Slogan",
|
||||
"perfile5": "Bio",
|
||||
"profile6": "Endereços da carteira",
|
||||
"profile7": "Preencher a partir da UI",
|
||||
"profile8": "Adicionar propriedade personalizada",
|
||||
"profile9": "Nome da propriedade",
|
||||
"perfile10": "Campos",
|
||||
"profile11": "Adicionar campo",
|
||||
"profile12": "Nome do campo",
|
||||
"profile13": "Valor do campo",
|
||||
"profile14": "Atividade",
|
||||
"profile15": "Sem valor",
|
||||
"profile16": "Este nome não tem perfil",
|
||||
"profile17": "Não foi possível buscar o perfil",
|
||||
"profile18": "Abrir perfil",
|
||||
"profile19": "Não foi possível buscar o perfil",
|
||||
"profile20": "Registrar nome",
|
||||
"profile21": "Inserir endereço da UI",
|
||||
"profile22": "Sucesso",
|
||||
"profile23": "criptografado",
|
||||
"profile24": "Você deve preencher o nome e o valor do campo para adicionar uma propriedade personalizada",
|
||||
"profile25": "É seu amigo",
|
||||
"profile26": "Adicionar como amigo"
|
||||
},
|
||||
"tour": {
|
||||
"tour1": "Para usar o Qortal, o Core deve estar sincronizado. Este ícone ficará em azul quando estiver sincronizado.",
|
||||
"tour2": "Sincronizado",
|
||||
"tour3": "Sincronizado e cunhado",
|
||||
"tour4": "Sincronizando",
|
||||
"tour5": "Sincronize seu núcleo",
|
||||
"tour6": "A Força Imparável de Qortal",
|
||||
"tour7": "Somente você controla seus dados no Qortal",
|
||||
"tour8": "Qortal não pode ser removido",
|
||||
"tour9": "Completamente peer-to-peer sem intermediários centralizados",
|
||||
"tour10": "Esta é a aba padrão onde você pode acessar configurações importantes do Qortal e Q-apps como o Q-Tube.",
|
||||
"tour11": "Obtenha a experiência completa",
|
||||
"tour12": "Para obter a experiência completa do Qortal, recomendamos seguir esta lista de verificação.",
|
||||
"tour13": "Você está totalmente sincronizado! Agora você pode experimentar o poder do blockchain Qortal.",
|
||||
"tour14": "Vamos tentar visitar o Q-Tube!",
|
||||
"tour15": "Visite o Q-Tube",
|
||||
"tour16": "Lista de verificação",
|
||||
"tour17": "Por favor, inicie o Core para acessar a blockchain Qortal.",
|
||||
"tour18": "Atualizar (bootstrap)",
|
||||
"tour19": "Sincronizando atualmente... você deve estar totalmente sincronizado para usar o Qortal",
|
||||
"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"
|
||||
}
|
||||
}
|
||||
}
|
@ -5,10 +5,8 @@
|
||||
"chinese1": "Chineza (simplificata)",
|
||||
"chinese2": "Chineza (traditionala)",
|
||||
"croatian": "Croata",
|
||||
"dutch": "Olandez",
|
||||
"english": "Engleza",
|
||||
"estonian": "Estonian",
|
||||
"finnish": "Finlandez",
|
||||
"french": "Franceza",
|
||||
"german": "Germana",
|
||||
"hindi": "Hindi",
|
||||
@ -80,7 +78,7 @@
|
||||
"tm32": "Acest cont nu urmărește niciun utilizator",
|
||||
"tm33": "Meniu Filă Import",
|
||||
"tm34": "Meniu File Export",
|
||||
"tm35": "Meniul de file existent va fi șters și setat la meniul de file importat.",
|
||||
"tm35": "Meniul de file existent va fi șters și setat la meniul de file încărcat.",
|
||||
"tm36": "Meniul Tab a fost restaurat cu succes",
|
||||
"tm37": "Meniul Tab a fost salvat cu succes ca",
|
||||
"tm38": "MOD DEV",
|
||||
@ -98,43 +96,43 @@
|
||||
"youraccounts": "Conturile tale",
|
||||
"clickto": "Fa click pe Contul tau pentru a te conecta cu el",
|
||||
"needcreate": "Trebuie sa iti creezi sau sa salvezi un cont inainte de a te conecta!",
|
||||
"upload": "Importați fișierul de rezervă Qortal",
|
||||
"upload": "Urca copia de siguranta Qortal",
|
||||
"howlogin": "Cum doresti sa te conectezi?",
|
||||
"seed": "frazainitiala",
|
||||
"seedphrase": "frazainitiala",
|
||||
"saved": "Cont salvat",
|
||||
"qora": "Adresa initiala QORA",
|
||||
"backup": "Fișier de rezervă Qortal",
|
||||
"decrypt": "Decriptați fișierul de rezervă",
|
||||
"qora": "Adresa initiala Qora",
|
||||
"backup": "Copia de siguranta a portofelului Qortal",
|
||||
"decrypt": "Decriptare copie de siguranta",
|
||||
"save": "Salveaza in acest browser.",
|
||||
"prepare": "Se pregateste Contul tau",
|
||||
"areyousure": "Sigur doriți să eliminați acest cont din conturile salvate? (Dacă este eliminat și nu există niciun fișier de rezervă, contul poate fi pierdut pentru totdeauna! Asigurați-vă că aveți un fișier de rezervă înainte de a face acest lucru!)",
|
||||
"areyousure": "Sunteti sigur ca doriti sa eliminati acest portofel din portofelele salvate?",
|
||||
"error1": "Backup-ul trebuie sa fie JSON valid",
|
||||
"error2": "Optiunea de conectare nu este selectata",
|
||||
"createwelcome": "Bun venit la Qortal! Viitorul tău digital descentralizat te așteaptă! Dvs. și numai dvs. aveți control deplin asupra datelor dvs. de pe Qortal. Qortal oferă infrastructura unei lumi digitale noi și complet controlate de utilizator.",
|
||||
"createwelcome": "Bine ai venit la Qortal, vei descoperi ca este similar cu un joc RPG, tu, ca minter in reteaua Qortal (daca alegi sa devii unul), vei avea sansa de a-ti creste nivelul contului tau, oferindu-ti deopotiva o recompensa mai mare din blocul QORT, cat si o influenta mai mare asupra retelei in ceea ce priveste votul asupra deciziilor pentru platforma.",
|
||||
"createa": "A",
|
||||
"click": "Da click pentru a vedea fraza initiala",
|
||||
"confirmpass": "Confirma Parola",
|
||||
"willbe": "va fi generat aleatoriu în fundal. Dacă doriți să VEZI fraza inițială, faceți clic pe „fraza inițială” evidențiată în acest text. Acesta este folosit ca generator de chei private pentru contul blockchain din Qortal. Pentru securitate, în mod implicit, frazele de bază nu sunt afișate decât dacă sunt alese în mod special.",
|
||||
"willbe": "va fi generata aleatoriu in fundal. Aceasta este utilizata ca generator de cheie privata pentru contul tau blockchain din Qortal.",
|
||||
"clicknext": "Creaza-ti contul Qortal apasand butonul INAINTE.",
|
||||
"ready": "Contul dvs. este acum gata pentru a fi creat. Acesta va fi salvat în această copie a Qortal UI în mod implicit, în formă criptată. Dacă nu doriți ca noul dvs. cont să fie salvat aici, puteți debifa caseta de mai jos. Veți putea în continuare să vă conectați cu noul cont (după deconectare), folosind fișierul de rezervă al portofelului, pe care TREBUIE să-l descărcați după ce vă creați contul.",
|
||||
"ready": "Contul dvs. este acum gata sa fie creat. Acesta va fi salvat in acest browser. Daca nu doriti ca noul dvs. cont sa fie salvat in browserul dvs., puteti debifa caseta de mai jos. Veti putea in continuare sa va conectati cu noul dvs. cont (dupa ce va deconectati), utilizand fisierul de backup al portofelului pe care TREBUIE sa il descarcati dupa ce va creati contul.",
|
||||
"welmessage": "Bine ai venit in Qortal",
|
||||
"pleaseenter": "Te rog introdu o parola!",
|
||||
"notmatch": "Parola nu corespunde!",
|
||||
"lessthen8": "Parola ta are mai putin de 5 caractere! Acest lucru nu este recomandat. Poti continua sa ignori acest avertisment.",
|
||||
"lessthen8-2": "Parola ta are mai putin de 5 caractere!",
|
||||
"entername": "Vă rugăm să introduceți un nume afișat!",
|
||||
"downloaded": "Fișierul dvs. Qortal Backup a fost salvat!",
|
||||
"lessthen8": "Parola ta are mai putin de 8 caractere! Acest lucru nu este recomandat. Poti continua sa ignori acest avertisment.",
|
||||
"lessthen8-2": "Parola ta are mai putin de 8 caractere!",
|
||||
"entername": "Te rog introdu un Nume!",
|
||||
"downloaded": "Copia de siguranta a portofelului este descarcata!",
|
||||
"loading": "Se incarca. Va rugam asteptati...",
|
||||
"createdseed": "Fraza initiala personala creata",
|
||||
"saveseed": "Salveaza fraza initiala",
|
||||
"savein": "Salvați în această interfață de utilizare",
|
||||
"backup2": "Acest fișier este SINGURA modalitate (în mod implicit) de a vă accesa contul, cu excepția cazului în care este salvat în UI. ASIGURAȚI-VĂ CĂ FACEȚI BACKUP ACEST FIȘIER ÎN MULTE LOCURI. Fișierul este criptat foarte sigur și decriptat cu parola dvs. locală pe care ați creat-o la pasul anterior. Îl puteți salva oriunde în siguranță, dar asigurați-vă că faceți acest lucru în mai multe locații.",
|
||||
"savewallet": "Salvați fișierul de rezervă Qortal",
|
||||
"savein": "Salveaza in browser",
|
||||
"backup2": "Acest fisier este SINGURA modalitate de a-ti accesa contul pe un sistem care nu il are salvat in aplicatie/browser. ASIGURA-TE CA FACI O COPIE DE REZERVA A ACESTUI FISIER IN MAI MULTE LOCURI. Fisierul este criptat foarte sigur si decriptat cu parola locala pe care ai creat-o in pasul anterior. Il poti salva oriunde in siguranta, dar asigura-te ca faci acest lucru in mai multe locatii.",
|
||||
"savewallet": "Salveaza copia de siguranta a Portofelului",
|
||||
"created1": "Contul tau este acum creat",
|
||||
"created2": " și salvat în această interfață de utilizare în formă criptată.",
|
||||
"downloadbackup": "Salvați fișierul Qortal BackUp",
|
||||
"passwordhint": "O parola trebuie sa aiba cel putin 5 caractere.",
|
||||
"created2": "si va fi salvat in acest browser.",
|
||||
"downloadbackup": "Descarca copia de siguranta a Portofelului",
|
||||
"passwordhint": "O parola trebuie sa aiba cel putin 8 caractere.",
|
||||
"lp1": "Ecran de blocare",
|
||||
"lp2": "Nu este setată nicio parolă pentru ecranul de blocare!",
|
||||
"lp3": "Vă rugăm să setați unul",
|
||||
@ -163,8 +161,8 @@
|
||||
"confirmlogout": "Esti sigur ca vrei sa te deconectezi?"
|
||||
},
|
||||
"fragfile": {
|
||||
"selectfile": "Selectați fișierul de rezervă",
|
||||
"dragfile": "Trageți și plasați sau faceți clic aici pentru a selecta fișierul de rezervă"
|
||||
"selectfile": "Selecteaza fisier",
|
||||
"dragfile": "Trage si elibereaza fisierul de backup aici"
|
||||
},
|
||||
"settings": {
|
||||
"generalinfo": "Informatii generale despre cont",
|
||||
@ -181,8 +179,9 @@
|
||||
"notifications": "Notificari",
|
||||
"accountsecurity": "Securitatea contului",
|
||||
"password": "Parola",
|
||||
"download": "Exportați/Salvați fișierul de rezervă Qortal",
|
||||
"download": "Descarca copia de siguranta",
|
||||
"choose": "Va rugam sa alegeti o parola cu care sa va criptati copia de rezerva. (Aceasta poate fi aceeasi cu cea cu care v-ati logat sau diferita)",
|
||||
"block": "Blocare notificari (Disponibil in curand...)",
|
||||
"playsound": "Redare sunet",
|
||||
"shownotifications": "Arata notificarile",
|
||||
"nodeurl": "Adresa url a nodului",
|
||||
@ -192,8 +191,8 @@
|
||||
"protocol": "Protocol",
|
||||
"domain": "Domeniu",
|
||||
"port": "Port",
|
||||
"import": "Import Noduri salvate",
|
||||
"export": "Export Noduri salvate",
|
||||
"import": "Import Noduri",
|
||||
"export": "Export Noduri",
|
||||
"deletecustomnode": "Eliminati toate nodurile personalizate",
|
||||
"warning": "Nodurile dvs. existente vor fi sterse si din backup vor fi create noi.",
|
||||
"snack1": "Noduri standard au fost sterse si adaugate cu succes",
|
||||
@ -201,20 +200,12 @@
|
||||
"snack3": "Nod personalizat adaugat si salvat cu succes",
|
||||
"snack4": "Nodurile au fost salvate cu succes ca",
|
||||
"snack5": "Nodurile au fost importate cu succes",
|
||||
"snack6": "Nodul personalizat a fost eliminat cu succes",
|
||||
"snack7": "Nodul personalizat a fost editat cu succes",
|
||||
"exp1": "Exportați cheia privată principală (xpriv)",
|
||||
"exp1": "Exportați cheia principală privată",
|
||||
"exp2": "Exportați cheia principală",
|
||||
"exp3": "Export",
|
||||
"exp4": "Vă rugăm să alegeți un portofel pentru a face backup cheii master private.",
|
||||
"core": "Setări Qortal de pornire automată",
|
||||
"qappNotification1": "Notificări Q-App",
|
||||
"selectnode": "Vă rugăm să selectați o opțiune",
|
||||
"arrr1": "Portoletul ARRR nu este inițializat !",
|
||||
"arrr2": "Accesați „Portofele” și accesați portofelul ARRR pentru a inițializa mai întâi portofelul",
|
||||
"arrr3": "Am nevoie de actualizare de bază !",
|
||||
"arrr4": "Pentru a salva cheia privată a portofelului dvs. ARRR, trebuie mai întâi să actualizați Qortal Core!",
|
||||
"sync_indicator": "Dezactivați fereastra pop-up indicator de sincronizare"
|
||||
"core": "Porniți setările de bază",
|
||||
"qappNotification1": "Notificări Q-App"
|
||||
},
|
||||
"appinfo": {
|
||||
"blockheight": "Dimensiunea blocului",
|
||||
@ -248,9 +239,7 @@
|
||||
"balance": "Credit",
|
||||
"balances": "SOLDELE PORTOTELULUI DVS",
|
||||
"update": "ACTUALIZAȚI SOLDELE PORTOTELULUI",
|
||||
"view": "Vedere",
|
||||
"all": "Toate",
|
||||
"page": "Pagină"
|
||||
"view": "Vedere"
|
||||
},
|
||||
"gifs": {
|
||||
"gchange1": "Explorator GIF",
|
||||
@ -285,8 +274,8 @@
|
||||
},
|
||||
"startminting": {
|
||||
"smchange1": "Nu se pot prelua conturile de batere",
|
||||
"smchange2": "Nu s-a putut elimina cheia Minting",
|
||||
"smchange3": "Nu s-a putut adăuga cheia de batere, dacă cheia tocmai a fost creată, încercați să așteptați câteva blocuri și să adăugați din nou",
|
||||
"smchange2": "Cheia nu a fost eliminata",
|
||||
"smchange3": "Nu s-a putut adauga cheia de batere",
|
||||
"smchange4": "Nu se poate crea cheia de sponsorizare",
|
||||
"smchange5": "Crearea unei relatii",
|
||||
"smchange6": "Se asteapta confirmarea pe blockchain",
|
||||
@ -405,8 +394,7 @@
|
||||
"wchange55": "Agenda dvs. existenta va fi stearsa si din backup va fi creata o noua.",
|
||||
"wchange56": "AVERTIZARE!",
|
||||
"wchange57": "Nota",
|
||||
"wchange58": "Adresa noua",
|
||||
"wchange59": "Monedă"
|
||||
"wchange58": "Adresa noua"
|
||||
},
|
||||
"tradepage": {
|
||||
"tchange1": "Portal de Tranzactionare",
|
||||
@ -509,7 +497,7 @@
|
||||
"nchange23": "Preț de vânzare",
|
||||
"nchange24": "Fără nume de vândut",
|
||||
"nchange25": "Nume de vândut",
|
||||
"nchange26": "Ești sigur că vrei să vinzi acest nume? Dacă un alt utilizator cumpără numele, toate datele publicate după nume nu vor putea fi editate de dvs.!",
|
||||
"nchange26": "Sunteți sigur că veți vinde acest nume?",
|
||||
"nchange27": "Pentru acest preț în QORT",
|
||||
"nchange28": "La apăsarea confirmării, cererea de nume de vânzare va fi trimisă!",
|
||||
"nchange29": "Nume de anulat",
|
||||
@ -530,8 +518,7 @@
|
||||
"nchange44": "La noul nume",
|
||||
"nchange45": "La apăsarea confirmării, cererea de actualizare a numelui va fi trimisă!",
|
||||
"nchange46": "Istoricul vânzărilor de nume",
|
||||
"nchange47": "Actualizarea numelui a reușit!",
|
||||
"nchange48": "Atenție! Dacă vă actualizați numele, veți pierde resursele asociate cu numele inițial. Cu alte cuvinte, veți pierde dreptul de proprietate asupra conținutului sub numele inițial din QDN. Procedați cu prudență!"
|
||||
"nchange47": "Actualizarea numelui a reușit!"
|
||||
},
|
||||
"websitespage": {
|
||||
"schange1": "Navigati pe Site-uri Web",
|
||||
@ -612,8 +599,7 @@
|
||||
"schange39": "Deschide",
|
||||
"schange40": "Previzualizare",
|
||||
"schange41": "Se descarcă, așteptați...",
|
||||
"schange42": "Fișiere descărcate",
|
||||
"schange43": "Orice încercare de descărcare va continua în fundal, vă rugăm să încercați din nou după un timp."
|
||||
"schange42": "Fișiere descărcate"
|
||||
},
|
||||
"tubespage": {
|
||||
"schange1": "Răsfoiți Q-Tubes",
|
||||
@ -735,14 +721,7 @@
|
||||
"bchange44": "Oferiți acestei aplicații permisiunea de a șterge din această listă?",
|
||||
"bchange45": "Criptați",
|
||||
"bchange46": "Dați această aplicație permisiunea de a salva următorul fișier",
|
||||
"bchange47": "Publicare instantanee - necesită",
|
||||
"bchange48": "Acordați acestei aplicații permisiunea de a vă trimite notificări",
|
||||
"bchange49": "Oferiți acestei aplicații permisiunea de a obține informațiile despre portofel?",
|
||||
"bchange50": "Această aplicație a solicitat o modificare a profilului dvs. public. Proprietate: ",
|
||||
"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?"
|
||||
"bchange47": "Publicare instantanee - necesită"
|
||||
},
|
||||
"datapage": {
|
||||
"dchange1": "Gestionare date",
|
||||
@ -842,37 +821,13 @@
|
||||
"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 10 MB",
|
||||
"cchange77": "Dimensiunea atașamentului depășește 1 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ă",
|
||||
"cchange81": "Acest tip de imagine nu este acceptat",
|
||||
"cchange82": "Acest atașament a fost șters",
|
||||
"cchange90": "Fără mesaje",
|
||||
"cchange91": "Se trimite...",
|
||||
"cchange92": "Mesaje necitite de mai jos",
|
||||
"cchange93": "Imaginea copiată în clipboard",
|
||||
"cchange94": "încărcat",
|
||||
"cchange95": "Numai resursele mele",
|
||||
"cchange96": "Deschideți managementul grupului",
|
||||
"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 ..."
|
||||
"cchange90": "Fără mesaje"
|
||||
},
|
||||
"welcomepage": {
|
||||
"wcchange1": "Bine ai venit la Q-Chat",
|
||||
@ -964,19 +919,7 @@
|
||||
"gchange56": "Numele grupului de căutat",
|
||||
"gchange57": "Numele grupului privat nu a fost găsit",
|
||||
"gchange58": "Rețineți că numele grupului trebuie să se potrivească exact.",
|
||||
"gchange59": "Afișează / Ascunde Ticker",
|
||||
"gchange60": "Vă rugăm să introduceți numele grupului",
|
||||
"gchange61": "Vă rugăm să introduceți descrierea",
|
||||
"gchange62": "Sunteți sigur că actualizați acest grup?",
|
||||
"gchange63": "La apăsarea butonului CONFIRM, va fi trimisă solicitarea UPDATE_GROUP!",
|
||||
"gchange64": "Proprietar actual / Proprietar nou",
|
||||
"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",
|
||||
"gchange69": "Mesaje",
|
||||
"gchange70": "Niciun mesaj în ultimele 24 de ore!",
|
||||
"gchange71": "Te-ai alaturat deja acestui grup!"
|
||||
"gchange59": "Afișează / Ascunde Ticker"
|
||||
},
|
||||
"puzzlepage": {
|
||||
"pchange1": "Puzzle-uri",
|
||||
@ -1031,16 +974,7 @@
|
||||
"nchange31": "Opreste Nodul",
|
||||
"nchange32": "Cerere de Oprire Trimisa cu Succes!",
|
||||
"nchange33": "Reporniți Nodul",
|
||||
"nchange34": "Cerere de Repornire a Fost Trimisă cu Succes!",
|
||||
"nchange35": "Porniți nodul",
|
||||
"nchange36": "Nodul pornit cu succes!",
|
||||
"nchange37": "Făcând clic pe continuare, se va reîmprospăta Qortal Core, db-ul va fi eliminat și veți descărca o nouă copie a db, numită bootstrapping.",
|
||||
"nchange38": "Reparați portofelul LTC",
|
||||
"nchange39": "Acest lucru va repara portofelele LTC care arată un sold care nu poate fi cheltuit. Este nevoie de o singură tranzacție pentru a fi efectuată în rețeaua Litecoin, după confirmare soldul portofelului va fi funcțional și problema nu se va mai repeta.",
|
||||
"nchange40": "Această tranzacție va consuma o mică taxă LTC. Continuați?",
|
||||
"nchange41": "Se încearcă repararea. Vă rugăm să așteptați...",
|
||||
"nchange42": "Portofel LTC a fost reparat cu succes!",
|
||||
"nchange43": "A apărut o eroare la încercarea de a repara portofelul LTC. Vă rugăm să încercați din nou!"
|
||||
"nchange34": "Cerere de Repornire a Fost Trimisă cu Succes!"
|
||||
},
|
||||
"transpage": {
|
||||
"tchange1": "Cerere de tranzactionare",
|
||||
@ -1075,16 +1009,7 @@
|
||||
"rewarddialog3": "Daca da, va trebui sa salvati cheia de mai jos pentru a putea obstine recompense. Aceasta poate fi furnizata oricarui nod pentru a-i permite acestuia sa obtina recompense in numele dumneavoastra.",
|
||||
"rewarddialog4": "La apasarea butonului de confirmare, cota de recompensare va fi creata, dar va trebui in continuare sa furnizati cheia de mai sus unui nod, pentru a putea sa obtina recompense cu acest cont.",
|
||||
"rewarddialog5": "Suntei pe cale sa stergeti o tranzactie de cota de recompensare asociata cu contul:",
|
||||
"rewarddialog6": "La apasarea butonului de confirmare, recompensa va fi eliminata, iar cheia de obtinere de recompensa (minting) va deveni invalida.",
|
||||
"deployAtdialog1": "Implementați AT",
|
||||
"deployAtdialog2": "La apăsarea confirmării, AT va fi implementat!",
|
||||
"deployAtdialog3": "Soldul sumei inițiale",
|
||||
"votedialog1": "Soliciți să votați la sondajul de mai jos:",
|
||||
"votedialog2": "La apăsarea confirmării, cererea de vot va fi trimisă!",
|
||||
"votedialog3": "Soliciți să creezi sondajul de mai jos:",
|
||||
"votedialog4": "Descrierea sondajului",
|
||||
"votedialog5": "Opțiuni",
|
||||
"votedialog6": "La apăsarea confirmării, sondajul va fi creat!"
|
||||
"rewarddialog6": "La apasarea butonului de confirmare, recompensa va fi eliminata, iar cheia de obtinere de recompensa (minting) va deveni invalida."
|
||||
},
|
||||
"sponsorshipspage": {
|
||||
"schange1": "Sponsorizari active",
|
||||
@ -1215,9 +1140,7 @@
|
||||
"inf15": "Comenzi de cumpărare automată active",
|
||||
"inf16": "Cumpărare automată",
|
||||
"inf17": "Comutați la tema luminoasă",
|
||||
"inf18": "Comutați la tema întunecată",
|
||||
"inf19": "Informații comerciale",
|
||||
"inf20": "Cumparator"
|
||||
"inf18": "Comutați la tema întunecată"
|
||||
},
|
||||
"lotterypage": {
|
||||
"lot1": "Deschideți loterii Qortal",
|
||||
@ -1233,101 +1156,5 @@
|
||||
"lot11": "Nu există loterie deschise!",
|
||||
"lot12": "Nu există loterie terminate!",
|
||||
"lot13": "Jucători"
|
||||
},
|
||||
"notifications": {
|
||||
"notify1": "Se confirmă tranzacția",
|
||||
"notify2": "Tranzacție confirmată",
|
||||
"explanation": "Tranzacția dvs. este confirmată. Pentru a urmări progresul acesteia, faceți clic pe pictograma clopoțel.",
|
||||
"status1": "Sincronizat complet",
|
||||
"status2": "Nu este sincronizat",
|
||||
"notify3": "Nicio notificare",
|
||||
"notify4": "Notificări Tx"
|
||||
},
|
||||
"friends": {
|
||||
"friend1": "Adăugați numele",
|
||||
"friend2": "Adauga prieten",
|
||||
"friend3": "Adăugarea unui prieten vă permite să vă conectați ușor cu acea persoană. Asigurați-vă că urmăriți și acel utilizator pentru a sprijini găzduirea resurselor publicate.",
|
||||
"friend4": "Note",
|
||||
"friend5": "Urmăriți numele",
|
||||
"friend6": "Alias",
|
||||
"friend7": "Adăugați un alias pentru a vă aminti mai bine de prietenul dvs. (Opțional)",
|
||||
"friend8": "Trimiteți Q-Chat",
|
||||
"friend9": "Trimiteți Q-Mail",
|
||||
"friend10": "Editează prieten",
|
||||
"friend11": "Ca urmare a",
|
||||
"friend12": "Prieteni",
|
||||
"friend13": "A hrani",
|
||||
"friend14": "Șterge prieten",
|
||||
"friend15": "Setări pentru feed",
|
||||
"friend16": "Selectați Q-Apps de la care doriți actualizări, în special cele legate de prietenii dvs.",
|
||||
"friend17": "Nu există articole în feedul dvs"
|
||||
},
|
||||
"save": {
|
||||
"saving1": "Nu se pot prelua setările salvate",
|
||||
"saving2": "Nimic de salvat",
|
||||
"saving3": "Salvați modificările nesalvate",
|
||||
"saving4": "Anulează modificările"
|
||||
},
|
||||
"profile": {
|
||||
"profile1": "Nu aveți un nume",
|
||||
"profile2": "Mergeți la înregistrarea numelui",
|
||||
"profile3": "Actualizează profilul",
|
||||
"profile4": "Slogan",
|
||||
"profile5": "Biografie",
|
||||
"profile6": "Adrese portofel",
|
||||
"profile7": "Umpleți din UI",
|
||||
"profile8": "Adăugați o proprietate personalizată",
|
||||
"profile9": "Numele proprietății",
|
||||
"profile10": "Câmpuri",
|
||||
"profile11": "Adăugați câmp",
|
||||
"profile12": "Numele câmpului",
|
||||
"profile13": "Valoarea câmpului",
|
||||
"profile14": "Activitate",
|
||||
"profile15": "Fără valoare",
|
||||
"profile16": "Acest nume nu are profil",
|
||||
"profile17": "Nu se poate prelua profilul",
|
||||
"profile18": "Deschide profilul",
|
||||
"profile19": "Nu se poate prelua profilul",
|
||||
"profile20": "Înregistrați numele",
|
||||
"profile21": "Inserați adresa din interfața de utilizare",
|
||||
"profile22": "Succes",
|
||||
"profile23": "criptat",
|
||||
"profile24": "Trebuie să completați atât numele câmpului, cât și valoarea câmpului pentru a adăuga o proprietate personalizată",
|
||||
"profile25": "Este prietenul tău",
|
||||
"profile26": "Adaugă ca prieten"
|
||||
},
|
||||
"tour": {
|
||||
"tour1": "Pentru a utiliza Qortal, Core trebuie să fie sincronizat. Această pictogramă va fi albastră când este sincronizată.",
|
||||
"tour2": "Sincronizat",
|
||||
"tour3": "Sincronizat și batut",
|
||||
"tour4": "Se sincronizează",
|
||||
"tour5": "Sincronizează-ți nucleul",
|
||||
"tour6": "Forța de neoprit a lui Qortal",
|
||||
"tour7": "Numai dvs. controlați datele pe Qortal",
|
||||
"tour8": "Qortal nu poate fi eliminat",
|
||||
"tour9": "Complet peer-to-peer, fără intermediari centralizați",
|
||||
"tour10": "Aceasta este vizualizarea implicită a filei unde puteți accesa setări Qortal importante și aplicații Q, cum ar fi Q-Tube.",
|
||||
"tour11": "Obțineți experiența completă",
|
||||
"tour12": "Pentru a obține experiența completă Qortal, vă recomandăm să urmați această listă de verificare.",
|
||||
"tour13": "Sunteți complet sincronizat! Acum puteți experimenta puterea blockchain-ului Qortal.",
|
||||
"tour14": "Hai să încercăm să vizităm Q-Tube!",
|
||||
"tour15": "Vizitați Q-Tube",
|
||||
"tour16": "Lista de verificare",
|
||||
"tour17": "Vă rugăm să porniți Core pentru a accesa blockchain-ul Qortal.",
|
||||
"tour18": "Actualizează (bootstrap)",
|
||||
"tour19": "În prezent se sincronizează... trebuie să fii complet sincronizat pentru a utiliza Qortal",
|
||||
"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"
|
||||
}
|
||||
}
|
||||
}
|
@ -5,10 +5,8 @@
|
||||
"chinese1": "Kineski (pojednostavljeni)",
|
||||
"chinese2": "Kineski (tradicionalni)",
|
||||
"croatian": "Hrvatski",
|
||||
"dutch": "Holandski",
|
||||
"english": "Engleski",
|
||||
"estonian": "Estonski",
|
||||
"finnish": "Finski",
|
||||
"french": "Francuski",
|
||||
"german": "Nemački",
|
||||
"hindi": "Hindi",
|
||||
@ -80,7 +78,7 @@
|
||||
"tm32": "Ovaj nalog ne prati nijednog korisnika",
|
||||
"tm33": "Meni kartice za uvoz",
|
||||
"tm34": "Izvoz meni kartice",
|
||||
"tm35": "Vaš postojeći meni kartica će biti izbrisan i postavljen na uvezeni meni kartica.",
|
||||
"tm35": "Vaš postojeći meni kartica će biti obrisan i postavljen na meni za otpremljene kartice.",
|
||||
"tm36": "Meni kartice je uspešno vraćen",
|
||||
"tm37": "Meni kartice je uspešno sačuvan kao",
|
||||
"tm38": "DEV MODE",
|
||||
@ -98,31 +96,31 @@
|
||||
"youraccounts": "Tvoji nalozi",
|
||||
"clickto": "Kliknite na nalog sa kojim želite da se prijavite",
|
||||
"needcreate": "Morate napraviti ili sačuvati nalog pre mogućnosti prijavljivanja!",
|
||||
"upload": "Uvezite Qortal datoteku rezervne kopije",
|
||||
"upload": "Ubacite vašu rezervnu kopiju Qortala",
|
||||
"howlogin": "Kako bi ste želeli da se prijavite?",
|
||||
"seed": "Semenska fraza",
|
||||
"seedphrase": "semenskafraza",
|
||||
"saved": "Sačuvani nalog",
|
||||
"qora": "Seme QORA adrese",
|
||||
"qora": "Seme Qora adrese",
|
||||
"backup": "Rezervna kopija Qortal novčanika",
|
||||
"decrypt": "Dešifrovanje rezervne kopije",
|
||||
"save": "Sačuvajte u ovom pretraživaču.",
|
||||
"prepare": "Vaš Nalog se priprema",
|
||||
"areyousure": "Da li ste sigurni da želite da uklonite ovaj nalog sa sačuvanih naloga? (Ako se ukloni i ne postoji datoteka rezervne kopije, nalog bi mogao biti izgubljen zauvek! Uverite se da imate rezervnu datoteku pre nego što to uradite!)",
|
||||
"areyousure": "Da li ste sigurni da želite da izbrišete ovaj novčanik sa liste sačuvanih novčanika?",
|
||||
"error1": "Rezervna kopija mora biti ispravan JSON",
|
||||
"error2": "Opcija za prijavljivanje nije izabrana",
|
||||
"createwelcome": "Dobrodošli u Qortal! Vaša decentralizovana digitalna budućnost vas čeka! Na Qortal-u vi i samo vi imate apsolutnu kontrolu nad svojim podacima. Qortal obezbeđuje infrastrukturu novog i potpuno individualno kontrolisanog digitalnog sveta!",
|
||||
"createwelcome": "Dobrodošli u Qortal, koji možete posmatrati kao RPG igru, gde ćete vi, kao minter na Qortal mreži (ako odlučite to postati) imati priliku da unapredite (izlevelujete) vaš nalog, i time steknete priliku da dobijate sve veću QORT nagradu po bloku, kao i veći uticaj na samoj platformi, kroz glasanje o raznim odlukama.",
|
||||
"createa": "A",
|
||||
"click": "Kliknite ovde da biste videli semensku frazu",
|
||||
"confirmpass": "Potvrdite Lozinku",
|
||||
"willbe": "će se nasumično generisati u pozadini. Ako želite da POGLEDATE početnu frazu, kliknite na označenu 'seedphrase' u ovom tekstu. Ovo se koristi kao generator privatnih ključeva za vaš blockchain nalog u Kortalu. Zbog bezbednosti se podrazumevano, seedphrase ne prikazuju osim ako nije posebno izabrano",
|
||||
"willbe": "Biće nasumično generisano u pozadini. Ovo je generator ličnog ključa za vaš blockchain nalog u Qortalu.",
|
||||
"clicknext": "Napravite vaš Qortal nalog klikom na dugme DALJE ispod.",
|
||||
"ready": "Vaš nalog je sada spreman za kreiranje. Podrazumevano će biti sačuvan u ovoj kopiji Qortal korisničkog interfejsa, u šifrovanom obliku. Ako ne želite da vaš novi nalog bude sačuvan ovde, možete da opozovete izbor u polju za potvrdu ispod. I dalje ćete moći da se prijavite sa svojim novim nalogom (nakon odjavljivanja), koristeći rezervnu datoteku novčanika koju MORATE da preuzmete kada kreirate nalog.",
|
||||
"ready": "Pravljenje vašeg naloga je spremno. Biće sačuvano u ovom pretraživaču. Ako ne želite da se vaš nov nalog sačuva u ovom pretraživaču, odčekirajte polje ispod. I dalje ćete moći da se prijavite sa vašim novim nalogom (posle odjavljivanja), korišćenjem datoteke sa rezervnom kopijom, koju MORATE skinuti čim napravite nalog.",
|
||||
"welmessage": "Dobrodošli u Qortal",
|
||||
"pleaseenter": "Molim vas ukucajte lozinku!",
|
||||
"notmatch": "Lozinke se ne podudaraju!",
|
||||
"lessthen8": "Vaša lozinka ima manje od 5 karaktera! Ovo nije preporučljivo. Možete nastaviti ignorisanjem ovog upozorenja.",
|
||||
"lessthen8-2": "Vaša lozinka ima manje od 5 karaktera!",
|
||||
"lessthen8": "Vaša lozinka ima manje od 8 karaktera! Ovo nije preporučljivo. Možete nastaviti ignorisanjem ovog upozorenja.",
|
||||
"lessthen8-2": "Vaša lozinka ima manje od 8 karaktera!",
|
||||
"entername": "Molim vas unesite ime!",
|
||||
"downloaded": "datoteka sa Rezervnom kopijom vašeg Novčanika se skida!",
|
||||
"loading": "Učitavanje, molim sačekajte...",
|
||||
@ -134,7 +132,7 @@
|
||||
"created1": "Vaš nalog je napravljen",
|
||||
"created2": " i biće sačuvan u ovom pretraživaču.",
|
||||
"downloadbackup": "Skinite Datoteku Rezervne kopije Novčanika",
|
||||
"passwordhint": "Lozinka mora imati najmanje 5 znakova.",
|
||||
"passwordhint": "Lozinka mora imati najmanje 8 znakova.",
|
||||
"lp1": "Zaključani ekran",
|
||||
"lp2": "Lozinka za zaključavanje ekrana nije postavljena!",
|
||||
"lp3": "Postavite jedan",
|
||||
@ -181,8 +179,9 @@
|
||||
"notifications": "Notifikacije",
|
||||
"accountsecurity": "Bezbednost Naloga",
|
||||
"password": "Lozinka",
|
||||
"download": "Izvezi/Sačuvaj datoteku rezervne kopije",
|
||||
"download": "Skinite Datoteku Rezervne kopije",
|
||||
"choose": "Molim vas izaberite lozinku sa kojom ćete šifrovati rezervnu kopiju. (Ovo može biti ista lozinka sa kojom se prijavljujete, a može biti i različita)",
|
||||
"block": "Blokirajte Notifikacije (Uskoro...)",
|
||||
"playsound": "Pustite Zvuk",
|
||||
"shownotifications": "Prikažite notifikacije",
|
||||
"nodeurl": "URL Čvora",
|
||||
@ -192,8 +191,8 @@
|
||||
"protocol": "Protokol",
|
||||
"domain": "Domena",
|
||||
"port": "Port",
|
||||
"import": "Uvoz sačuvane Čvorova",
|
||||
"export": "Izvoz sačuvane Čvorova",
|
||||
"import": "Uvoz Čvorova",
|
||||
"export": "Izvoz Čvorova",
|
||||
"deletecustomnode": "Uklonite sve prilagođene čvorove",
|
||||
"warning": "Vaši postojeći čvorovi će biti izbrisani, a iz rezervne kopije biće stvoreni novi.",
|
||||
"snack1": "Uspešno su izbrisani i dodati standardni čvorovi",
|
||||
@ -201,20 +200,12 @@
|
||||
"snack3": "Uspešno dodat i sačuvan prilagođeni čvor",
|
||||
"snack4": "Čvorovi su uspešno sačuvani kao",
|
||||
"snack5": "Čvorovi su uspešno uvezeni",
|
||||
"snack6": "Uspešno uklonjen prilagođeni čvor",
|
||||
"snack7": "Uspešno uređen prilagođeni čvor",
|
||||
"exp1": "Izvezi privatni glavni ključ",
|
||||
"exp2": "Izvezi glavni ključ",
|
||||
"exp3": "Izvoz",
|
||||
"exp4": "Molimo izaberite novčanik za rezervnu kopiju privatnog glavnog ključa.",
|
||||
"core": "Qortal podešavanja automatskog pokretanja",
|
||||
"qappNotification1": "Obaveštenja o Q-App",
|
||||
"selectnode": "Izaberite opciju",
|
||||
"arrr1": "ARRR novčanik nije inicijalizovan!",
|
||||
"arrr2": "Idite na karticu 'Vallets' i pristupite ARRR novčaniku da biste prvo inicijalizovali novčanik.",
|
||||
"arrr3": "Potrebno je ažuriranje jezgra!",
|
||||
"arrr4": "Da biste sačuvali privatni ključ vašeg arrr novčanika, prvo vam je potrebno ažuriranje jezgra!",
|
||||
"sync_indicator": "Onemogući iskačući prozor indikatora sinhronizacije"
|
||||
"core": "Pokreni podešavanja jezgra",
|
||||
"qappNotification1": "Obaveštenja o Q-App"
|
||||
},
|
||||
"appinfo": {
|
||||
"blockheight": "Visina Bloka",
|
||||
@ -248,9 +239,7 @@
|
||||
"balance": "Kredit",
|
||||
"balances": "VAŠI STANJE U NOVČANIKU",
|
||||
"update": "AŽURIRAJTE STANJE NOVČANIKA",
|
||||
"view": "Pogled",
|
||||
"all": "Sve",
|
||||
"page": "Strana"
|
||||
"view": "Pogled"
|
||||
},
|
||||
"gifs": {
|
||||
"gchange1": "Gif Ekplorer",
|
||||
@ -285,8 +274,8 @@
|
||||
},
|
||||
"startminting": {
|
||||
"smchange1": "Nije moguće preuzeti naloge za kovanje",
|
||||
"smchange2": "Nije uspelo uklanjanje ključa za kovanje",
|
||||
"smchange3": "ako je ključ upravo kreiran, pokušajte da sačekate nekoliko blokova i ponovo dodate",
|
||||
"smchange2": "Uklanjanje ključa nije uspelo",
|
||||
"smchange3": "Dodavanje ključa za kovanje nije uspelo",
|
||||
"smchange4": "Nije moguće kreirati sponzorski ključ",
|
||||
"smchange5": "Stvaranje odnosa",
|
||||
"smchange6": "Čeka se potvrda na blokčejnu",
|
||||
@ -405,8 +394,7 @@
|
||||
"wchange55": "Vaš postojeći adresar će biti obrisan, a iz rezervne kopije biće kreiran novi.",
|
||||
"wchange56": "UPOZORENJE!",
|
||||
"wchange57": "Beleška",
|
||||
"wchange58": "Nova Adresa",
|
||||
"wchange59": "kovanica"
|
||||
"wchange58": "Nova Adresa"
|
||||
},
|
||||
"tradepage": {
|
||||
"tchange1": "Trgovinski prozor",
|
||||
@ -509,7 +497,7 @@
|
||||
"nchange23": "Cena prodaje",
|
||||
"nchange24": "Nema imena za prodaju",
|
||||
"nchange25": "Ime za prodaju",
|
||||
"nchange26": "Da li ste sigurni da želite da prodate ovo ime? Ako ime kupi drugi nalog, ono će biti van vaše kontrole!",
|
||||
"nchange26": "Da li ste sigurni da prodajete ovo ime?",
|
||||
"nchange27": "Za ovu cenu u KORT",
|
||||
"nchange28": "Pritiskom na potvrdu, zahtev za ime prodaje će biti poslat!",
|
||||
"nchange29": "Ime za otkazivanje",
|
||||
@ -530,8 +518,7 @@
|
||||
"nchange44": "Na novo ime",
|
||||
"nchange45": "Pritiskom na potvrdu, zahtev za ažuriranje imena će biti poslat!",
|
||||
"nchange46": "Istorija prodaje imena",
|
||||
"nchange47": "Ažuriranje imena je uspešno!",
|
||||
"nchange48": "Upozorenje! Ako ažurirate svoje ime, izgubićete resurse povezane sa originalnim imenom. Drugim rečima, izgubićete vlasništvo nad sadržajem pod originalnim imenom u KDN-u. Budite oprezni!"
|
||||
"nchange47": "Ažuriranje imena je uspešno!"
|
||||
},
|
||||
"websitespage": {
|
||||
"schange1": "Pretraživanje web sajtova",
|
||||
@ -612,8 +599,7 @@
|
||||
"schange39": "Otvori",
|
||||
"schange40": "Pregled",
|
||||
"schange41": "Preuzimanje molim sačekajte...",
|
||||
"schange42": "Preuzete datoteke",
|
||||
"schange43": "Svaki pokušaj preuzimanja će se nastaviti u pozadini, pokušajte ponovo nakon nekog vremena."
|
||||
"schange42": "Preuzete datoteke"
|
||||
},
|
||||
"tubespage": {
|
||||
"schange1": "Pregledaj Q-Tubes",
|
||||
@ -735,14 +721,7 @@
|
||||
"bchange44": "Da li ovoj aplikaciji dajete dozvolu za brisanje sa ove liste?",
|
||||
"bchange45": "Šifrovanje",
|
||||
"bchange46": "Da li ovoj aplikaciji dajete dozvolu da sačuva sledeću datoteku",
|
||||
"bchange47": "Trenutno objavljivanje - zahteva",
|
||||
"bchange48": "Da li ovoj aplikaciji dajete dozvolu da vam šalje obaveštenja",
|
||||
"bchange49": "Da li ovoj aplikaciji dajete dozvolu da dobije informacije o vašem novčaniku?",
|
||||
"bchange50": "Ova aplikacija je zahtevala promenu vašeg javnog profila. Svojstvo: ",
|
||||
"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?"
|
||||
"bchange47": "Trenutno objavljivanje - zahteva"
|
||||
},
|
||||
"datapage": {
|
||||
"dchange1": "Upravljanje podacima",
|
||||
@ -842,37 +821,13 @@
|
||||
"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 10 MB",
|
||||
"cchange77": "Veličina priloga prelazi 1 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",
|
||||
"cchange81": "Ovaj tip slike nije podržan",
|
||||
"cchange82": "Ovaj prilog je izbrisan",
|
||||
"cchange90": "Nema poruka",
|
||||
"cchange91": "Šalje se...",
|
||||
"cchange92": "Nepročitane poruke ispod",
|
||||
"cchange93": "Slika je kopirana u međuspremnik",
|
||||
"cchange94": "učitano",
|
||||
"cchange95": "Samo moji resursi",
|
||||
"cchange96": "Otvoreno upravljanje grupom",
|
||||
"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 ..."
|
||||
"cchange90": "Nema poruka"
|
||||
},
|
||||
"welcomepage": {
|
||||
"wcchange1": "Dobrodošli na Q-Chat",
|
||||
@ -964,19 +919,7 @@
|
||||
"gchange56": "Ime grupe za pretragu",
|
||||
"gchange57": "Ime privatne grupe nije pronađeno",
|
||||
"gchange58": "Imajte na umu da ime grupe mora potpuno da se podudara.",
|
||||
"gchange59": "Prikaži / Sakrij Oznaku",
|
||||
"gchange60": "Unesite ime grupe",
|
||||
"gchange61": "Unesite opis",
|
||||
"gchange62": "Želite li zaista da ažurirate ovu grupu?",
|
||||
"gchange63": "Na pritisku POTVRDITE, UPDATE_GROUP će biti poslat!",
|
||||
"gchange64": "Trenutni vlasnik / novi vlasnik",
|
||||
"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",
|
||||
"gchange69": "Poruke",
|
||||
"gchange70": "Nema poruka u poslednja 24 sata!",
|
||||
"gchange71": "Već ste se pridružili ovoj grupi!"
|
||||
"gchange59": "Prikaži / Sakrij Oznaku"
|
||||
},
|
||||
"puzzlepage": {
|
||||
"pchange1": "Slagalice",
|
||||
@ -1031,16 +974,7 @@
|
||||
"nchange31": "Zaustavite čvor",
|
||||
"nchange32": "Zahtev za zaustavljanje uspešno poslat!",
|
||||
"nchange33": "Ponovo pokreni čvor",
|
||||
"nchange34": "Zahtev za ponovno pokretanje uspešno poslat!",
|
||||
"nchange35": "Početni čvor",
|
||||
"nchange36": "Uspešno pokrenut čvor!",
|
||||
"nchange37": "Klik na nastavak će osvežiti vaše Kortal Core, vaš db će biti uklonjen, a vi ćete preuzeti novu kopiju db-a, koja se zove bootstrapping.",
|
||||
"nchange38": "Popravi LTC novčanik",
|
||||
"nchange39": "Ovo će popraviti LTC novčanike koji pokazuju stanje koje se ne može potrošiti. Zahteva da se izvrši jedna transakcija na Litecoin mreži, nakon potvrde stanje novčanika će biti funkcionalno i problem se neće ponoviti.",
|
||||
"nchange40": "Ova transakcija će potrošiti malu dugotrajnu naknadu. Nastaviti?",
|
||||
"nchange41": "Pokušavam da popravim. Molimo sačekajte...",
|
||||
"nchange42": "Uspešno popravljen LTC novčanik!",
|
||||
"nchange43": "Došlo je do greške pri pokušaju popravke LTC novčanika. Pokušajte ponovo!"
|
||||
"nchange34": "Zahtev za ponovno pokretanje uspešno poslat!"
|
||||
},
|
||||
"transpage": {
|
||||
"tchange1": "Zahtev za transakcijom",
|
||||
@ -1075,16 +1009,7 @@
|
||||
"rewarddialog3": "Ako jeste, moraćete da sačuvate ključ ispod da biste ga iskovali. Može se isporučiti bilo kom čvoru kako bi mu se omogućilo da se kuje u vaše ime.",
|
||||
"rewarddialog4": "Kada pritisnete dugme za potvrdu, biće kreirana podela nagrade, ali ćete i dalje morati da dostavite gornji ključ čvoru da biste mogli da koristite nalog.",
|
||||
"rewarddialog5": "Uklanjate transakciju deljenja nagrade povezanu sa nalogom:",
|
||||
"rewarddialog6": "Pritiskom na potvrdu, udeo nagrade će biti uklonjen i ključ za kovanje će postati nevažeći.",
|
||||
"deployAtdialog1": "Postavljate AT",
|
||||
"deployAtdialog2": "Pritiskom na potvrdi, AT će biti raspoređen!",
|
||||
"deployAtdialog3": "Početni saldo iznosa",
|
||||
"votedialog1": "Tražite da glasate u anketi ispod:",
|
||||
"votedialog2": "Pritiskom na potvrdi, zahtev za glasanje će biti poslat!",
|
||||
"votedialog3": "Zahtevate da napravite anketu ispod:",
|
||||
"votedialog4": "Opis ankete",
|
||||
"votedialog5": "Opcije",
|
||||
"votedialog6": "Pritiskom na potvrdi, anketa će biti kreirana!"
|
||||
"rewarddialog6": "Pritiskom na potvrdu, udeo nagrade će biti uklonjen i ključ za kovanje će postati nevažeći."
|
||||
},
|
||||
"sponsorshipspage": {
|
||||
"schange1": "Aktivna sponzorstva",
|
||||
@ -1215,9 +1140,7 @@
|
||||
"inf15": "Aktivne porudžbine za automatsku kupovinu",
|
||||
"inf16": "Automatska kupovina",
|
||||
"inf17": "Prebaci na svetlu temu",
|
||||
"inf18": "Prebaci na tamnu temu",
|
||||
"inf19": "Informacije o trgovini",
|
||||
"inf20": "Kupac"
|
||||
"inf18": "Prebaci na tamnu temu"
|
||||
},
|
||||
"lotterypage": {
|
||||
"lot1": "Otvorene Kortal lutrije",
|
||||
@ -1233,101 +1156,5 @@
|
||||
"lot11": "Nema otvorenih lutrija!",
|
||||
"lot12": "Nema završenih lutrija!",
|
||||
"lot13": "Igrači"
|
||||
},
|
||||
"notifications": {
|
||||
"notify1": "Potvrđivanje transakcije",
|
||||
"notify2": "Transakcija potvrđena",
|
||||
"explanation": "Vaša transakcija se potvrđuje. Da biste pratili njen napredak, kliknite na ikonu zvona.",
|
||||
"status1": "Potpuno sinhronizovano",
|
||||
"status2": "Nije sinhronizovano",
|
||||
"notify3": "Nema obaveštenja",
|
||||
"notify4": "Tk obaveštenja"
|
||||
},
|
||||
"friends": {
|
||||
"friend1": "Dodajte ime",
|
||||
"friend2": "Dodaj prijatelja",
|
||||
"friend3": "Dodavanje prijatelja vam omogućava da se lako povežete sa tom osobom. Obavezno pratite i tog korisnika kako biste podržali hostovanje njihovih objavljenih resursa.",
|
||||
"friend4": "Napomene",
|
||||
"friend5": "Pratite ime",
|
||||
"friend6": "Alias",
|
||||
"friend7": "Dodajte pseudonim da biste bolje zapamtili svog prijatelja (opciono)",
|
||||
"friend8": "Pošalji K-Chat",
|
||||
"friend9": "Pošaljite K-Mail",
|
||||
"friend10": "Uredi prijatelja",
|
||||
"friend11": "Sledeći",
|
||||
"friend12": "Prijatelji",
|
||||
"friend13": "Napajanje",
|
||||
"friend14": "Ukloni prijatelja",
|
||||
"friend15": "Podešavanja fida",
|
||||
"friend16": "Izaberite K-aplikacije iz kojih želite ažuriranja, posebno one koje se odnose na vaše prijatelje.",
|
||||
"friend17": "Nema stavki u vašem fidu"
|
||||
},
|
||||
"save": {
|
||||
"saving1": "Nije moguće preuzeti sačuvana podešavanja",
|
||||
"saving2": "Nema šta da se spase",
|
||||
"saving3": "Sačuvajte nesačuvane promene",
|
||||
"saving4": "Poništi promene"
|
||||
},
|
||||
"profile": {
|
||||
"profile1": "Nemate ime",
|
||||
"profile2": "Idi na registraciju imena",
|
||||
"profile3": "Ažuriraj profil",
|
||||
"profile4": "Tagline",
|
||||
"profile5": "Bio",
|
||||
"profile6": "Adrese novčanika",
|
||||
"profile7": "Popuni iz korisničkog interfejsa",
|
||||
"profile8": "Dodaj prilagođeno svojstvo",
|
||||
"profile9": "Naziv svojstva",
|
||||
"profile10": "Polja",
|
||||
"profile11": "Dodaj polje",
|
||||
"profile12": "Naziv polja",
|
||||
"profile13": "Vrednost polja",
|
||||
"profile14": "Aktivnost",
|
||||
"profile15": "Nema vrednosti",
|
||||
"profile16": "Ovo ime nema profil",
|
||||
"profile17": "Nije moguće preuzeti profil",
|
||||
"profile18": "Otvori profil",
|
||||
"profile19": "Ne mogu da preuzmem profil",
|
||||
"profile20": "Ime registra",
|
||||
"profile21": "Ubaci adresu iz korisničkog interfejsa",
|
||||
"profile22": "Uspeh",
|
||||
"profile23": "šifrovano",
|
||||
"profile24": "Morate da popunite i ime polja i vrednost polja da biste dodali prilagođeno svojstvo",
|
||||
"profile25": "Da li je tvoj prijatelj",
|
||||
"profile26": "Dodaj kao prijatelja"
|
||||
},
|
||||
"tour": {
|
||||
"tour1": "Da biste koristili Kortal, Core mora biti sinhronizovan. Ova ikona će biti plava kada se sinhronizuje.",
|
||||
"tour2": "Sinhronizovano",
|
||||
"tour3": "Sinhronizovano i kovanje",
|
||||
"tour4": "Sinhronizovanje",
|
||||
"tour5": "Sinhronizujte svoje jezgro",
|
||||
"tour6": "Nezaustavljiva sila Kortal",
|
||||
"tour7": "Samo vi kontrolišete svoje podatke na Kortalu",
|
||||
"tour8": "Kortal se ne može skinuti",
|
||||
"tour9": "Potpuno peer-to-peer bez centralizovanih posrednika",
|
||||
"tour10": "Ovo je podrazumevani prikaz kartice gde možete pristupiti važnim Kortal podešavanjima i K-aplikacijama kao što je K-Tube.",
|
||||
"tour11": "Dobijte potpuno iskustvo",
|
||||
"tour12": "Da biste dobili potpuno Kortal iskustvo, preporučujemo da pratite ovu kontrolnu listu.",
|
||||
"tour13": "Potpuno ste sinhronizovani! Sada možete da iskusite moć Kortal blockchaina.",
|
||||
"tour14": "Probajmo da posetimo K-Tube!",
|
||||
"tour15": "Posetite K-Tube",
|
||||
"tour16": "Kontrolna lista",
|
||||
"tour17": "Molim vas pokrenite jezgro da biste pristupili Kortal blockchainu.",
|
||||
"tour18": "Osveži (bootstrap)",
|
||||
"tour19": "Trenutno se sinhronizuje... morate biti potpuno sinhronizovani da biste koristili Kortal",
|
||||
"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"
|
||||
}
|
||||
}
|
||||
}
|
@ -5,10 +5,8 @@
|
||||
"chinese1": "Китайский (упрощенный)",
|
||||
"chinese2": "Китайский (традиционный)",
|
||||
"croatian": "Хорватский",
|
||||
"dutch": "Голландский",
|
||||
"english": "Английский",
|
||||
"estonian": "Эстонский",
|
||||
"finnish": "Финский",
|
||||
"french": "Французкий",
|
||||
"german": "Немецкий",
|
||||
"hindi": "Хинди",
|
||||
@ -108,21 +106,21 @@
|
||||
"decrypt": "Расшифровать резервную копию",
|
||||
"save": "Сохранить в приложении",
|
||||
"prepare": "Подготовка вашей учетной записи",
|
||||
"areyousure": "Вы уверены, что хотите удалить эту учетную запись из сохраненных учетных записей? (Если удалить и файл резервной копии не существует, учетная запись может быть потеряна навсегда! Прежде чем делать это, убедитесь, что у вас есть файл резервной копии!)",
|
||||
"areyousure": "Вы уверены, что хотите удалить этот кошелек из сохраненных кошельков?",
|
||||
"error1": "Резервная копия должна быть в формате JSON",
|
||||
"error2": "Вариант входа не выбран",
|
||||
"createwelcome": "Добро пожаловать в Qortal! Ваше децентрализованное цифровое будущее ждет вас! Только на Qortal вы имеете абсолютный контроль над своими данными. Qortal обеспечивает базовый уровень нового, полностью контролируемого пользователем цифрового мира.",
|
||||
"createwelcome": "Добро пожаловать в Qortal! Это чем-то похоже на ролевую игру, в которой вы, как минтер в сети Qortal (если вы решите им стать), будете иметь возможность повысить уровень учетной записи, что повысит долю вашего вознаграждения за каждый блок QORT, а также даст вам больше влияния на сеть, посредством голосования по предложениям для платформы.",
|
||||
"createa": "A",
|
||||
"click": "Нажмите, чтобы просмотреть seed-фразу",
|
||||
"confirmpass": "Подтвердите пароль",
|
||||
"willbe": "будет генерироваться случайным образом в фоновом режиме. Если вы хотите ПРОСМОТРЕТЬ исходную фразу, щелкните выделенную «начальную фразу» в этом тексте. Он используется в качестве генератора закрытых ключей для вашей учетной записи блокчейна в Qortal. В целях безопасности по умолчанию начальные фразы не отображаются, если это специально не выбрано.",
|
||||
"willbe": "Будет генерироваться случайным образом в фоновом режиме для использования в качестве генератора приватного ключа от вашей учетной записи в блокчейне Qortal.",
|
||||
"clicknext": "Создайте учетную запись Qortal, нажав кнопку ДАЛЕЕ ниже.",
|
||||
"ready": "Теперь ваша учетная запись готова к созданию. Она будет сохранена в этом приложении. Если вы не хотите, чтобы ваша новая учетная запись сохранялась в приложении, вы можете снять флажок ниже. Вы по-прежнему сможете войти в свою новую учетную запись (после выхода), используя файл резервной копии вашего кошелька, который вам НЕООБХОДИМО скачать после создания учетной записи.",
|
||||
"welmessage": "Добро пожаловать в Qortal",
|
||||
"pleaseenter": "Пожалуйста, введите пароль!",
|
||||
"notmatch": "Пароли не совпадают!",
|
||||
"lessthen8": "Ваш пароль содержит менее 5 символов! Это не рекомендуется. Вы можете продолжить, игнорировав это предупреждение.",
|
||||
"lessthen8-2": "Ваш пароль содержит менее 5 символов!",
|
||||
"lessthen8": "Ваш пароль содержит менее 8 символов! Это не рекомендуется. Вы можете продолжить, игнорировав это предупреждение.",
|
||||
"lessthen8-2": "Ваш пароль содержит менее 8 символов!",
|
||||
"entername": "Пожалуйста, введите Имя!",
|
||||
"downloaded": "Файл резервной копии кошелька будет скачан!",
|
||||
"loading": "Идет загрузка, пожалуйста, подождите...",
|
||||
@ -132,9 +130,9 @@
|
||||
"backup2": "Этот файл является ЕДИНСТВЕННЫМ способом доступа к вашей учетной записи в системе, в которой он не сохранен в приложении/браузере. ОБЯЗАТЕЛЬНО СДЕЛАЙТЕ РЕЗЕРВНУЮ КОПИЮ ЭТОГО ФАЙЛА В НЕСКОЛЬКИХ МЕСТАХ. Файл очень надежно зашифрован и расшифровывается с помощью вашего локального пароля, который вы создали на предыдущем шаге. Вы можете безопасно сохранить его в любом месте, но не забудьте сделать это в нескольких местах.",
|
||||
"savewallet": "Сохранить файл резервной копии кошелька",
|
||||
"created1": "Ваша учетная запись создана",
|
||||
"created2": " и сохраняется в этом интерфейсе в зашифрованном виде",
|
||||
"downloadbackup": "Сохранить файл резервной копии Qortal",
|
||||
"passwordhint": "Пароль должен быть не менее 5 символов.",
|
||||
"created2": "и будет сохранено в этом приложении.",
|
||||
"downloadbackup": "Скачать файл резервной копии кошелька",
|
||||
"passwordhint": "Пароль должен быть не менее 8 символов.",
|
||||
"lp1": "Экран блокировки",
|
||||
"lp2": "Пароль блокировки экрана не установлен!",
|
||||
"lp3": "Пожалуйста, установите один",
|
||||
@ -181,8 +179,9 @@
|
||||
"notifications": "Уведомления",
|
||||
"accountsecurity": "Сгенерировать QR-код для входа",
|
||||
"password": "Пароль",
|
||||
"download": "Экспортировать/сохранить файл резервной копии Qortal",
|
||||
"download": "Загрузить файл резервной копии",
|
||||
"choose": "Пожалуйста, выберите пароль для шифрования вашей резервной копии. (Это может быть тот же пароль, с которым вы вошли в систему, или другой)",
|
||||
"block": "Блокировать уведомления (скоро…)",
|
||||
"playsound": "Воспроизвести звук",
|
||||
"shownotifications": "Показать уведомления",
|
||||
"nodeurl": "URL-адрес узла",
|
||||
@ -201,20 +200,12 @@
|
||||
"snack3": "Пользовательский узел успешно добавлен и сохранен",
|
||||
"snack4": "Узлы успешно сохранены как",
|
||||
"snack5": "Узлы успешно импортированы",
|
||||
"snack6": "Пользовательский узел успешно удален",
|
||||
"snack7": "Пользовательский узел успешно отредактирован",
|
||||
"exp1": "Экспорт закрытого мастер-ключа",
|
||||
"exp2": "Экспорт мастер-ключа",
|
||||
"exp3": "Экспорт",
|
||||
"exp4": "Пожалуйста, выберите кошелек для резервного копирования приватного главного ключа.",
|
||||
"core": "Настройки автозапуска Qortal",
|
||||
"qappNotification1": "Уведомления Q-App",
|
||||
"selectnode": "Пожалуйста, выберите вариант",
|
||||
"arrr1": "Кошелек ARRR не инициализирован!",
|
||||
"arrr2": "Пожалуйста, перейдите на вкладку кошелька и получите доступ к кошельку ARRR, чтобы сначала инициализировать кошелек.",
|
||||
"arrr3": "Требуется обновление ядра!",
|
||||
"arrr4": "Чтобы сохранить закрытый ключ вашего ARRR-кошелька, вам необходимо сначала обновить Qortal Core!",
|
||||
"sync_indicator": "Отключить всплывающее окно индикатора синхронизации"
|
||||
"core": "Начать основные настройки",
|
||||
"qappNotification1": "Уведомления Q-App"
|
||||
},
|
||||
"appinfo": {
|
||||
"blockheight": "Высота блока",
|
||||
@ -248,9 +239,7 @@
|
||||
"balance": "кредит",
|
||||
"balances": "БАЛАНС ВАШЕГО КОШЕЛЬКА",
|
||||
"update": "ОБНОВИТЬ БАЛАНС КОШЕЛЬКА",
|
||||
"view": "Вид",
|
||||
"all": "Все",
|
||||
"page": "Страница"
|
||||
"view": "Вид"
|
||||
},
|
||||
"gifs": {
|
||||
"gchange1": "Проводник гифок",
|
||||
@ -286,7 +275,7 @@
|
||||
"startminting": {
|
||||
"smchange1": "Не удается получить учетные записи минтинга",
|
||||
"smchange2": "Не удалось удалить ключ",
|
||||
"smchange3": "Не удалось добавить ключ минтинга, если ключ был только что создан, попробуйте подождать несколько блоков и добавить еще раз.",
|
||||
"smchange3": "Не удалось добавить ключ минтинга",
|
||||
"smchange4": "Не удается создать спонсорский ключ",
|
||||
"smchange5": "Создание отношений",
|
||||
"smchange6": "Ожидание подтверждения на блокчейне",
|
||||
@ -405,8 +394,7 @@
|
||||
"wchange55": "Ваша существующая адресная книга будет удалена, а из резервной копии создана новая.",
|
||||
"wchange56": "ПРЕДУПРЕЖДЕНИЕ!",
|
||||
"wchange57": "Памятка",
|
||||
"wchange58": "Новый Адрес",
|
||||
"wchange59": "Монета"
|
||||
"wchange58": "Новый Адрес"
|
||||
},
|
||||
"tradepage": {
|
||||
"tchange1": "Торговый портал",
|
||||
@ -509,7 +497,7 @@
|
||||
"nchange23": "Цена продажи",
|
||||
"nchange24": "Нет имен для продажи",
|
||||
"nchange25": "Имя для продажи",
|
||||
"nchange26": "Вы уверены, что хотите продать это имя? Если имя будет куплено другой учетной записью, это будет вне вашего контроля!",
|
||||
"nchange26": "Вы уверены, что продаете это имя?",
|
||||
"nchange27": "По этой цене в QORT",
|
||||
"nchange28": "При нажатии подтверждения будет отправлен запрос на продажу имени!",
|
||||
"nchange29": "Имя для отмены",
|
||||
@ -530,8 +518,7 @@
|
||||
"nchange44": "На новое имя",
|
||||
"nchange45": "При нажатии подтверждения будет отправлен запрос на обновление имени!",
|
||||
"nchange46": "История продажи имени",
|
||||
"nchange47": "Имя обновлено успешно!",
|
||||
"nchange48": "Внимание! Если вы обновите свое имя, вы потеряете ресурсы, связанные с исходным именем. Другими словами, вы потеряете право собственности на контент под исходным именем в QDN. Действуйте осторожно!"
|
||||
"nchange47": "Имя обновлено успешно!"
|
||||
},
|
||||
"websitespage": {
|
||||
"schange1": "Просматривать веб-сайты",
|
||||
@ -612,8 +599,7 @@
|
||||
"schange39": "Открыть",
|
||||
"schange40": "Предварительный просмотр",
|
||||
"schange41": "Идет загрузка, подождите...",
|
||||
"schange42": "Файлы загружены",
|
||||
"schange43": "Любые попытки загрузки будут продолжаться в фоновом режиме, повторите попытку через некоторое время."
|
||||
"schange42": "Файлы загружены"
|
||||
},
|
||||
"tubespage": {
|
||||
"schange1": "Просмотреть Q-Tubes",
|
||||
@ -735,14 +721,7 @@
|
||||
"bchange44": "Даете ли вы этому приложению разрешение на удаление из этого списка?",
|
||||
"bchange45": "Шифровать",
|
||||
"bchange46": "Даете ли вы этому приложению разрешение на сохранение следующего файла?",
|
||||
"bchange47": "Мгновенная публикация - требуется",
|
||||
"bchange48": "Разрешаете ли вы этому приложению отправлять вам уведомления?",
|
||||
"bchange49": "Разрешаете ли вы этому приложению получать информацию о вашем кошельке?",
|
||||
"bchange50": "Это приложение запросило изменение вашего общедоступного профиля. Свойство: ",
|
||||
"bchange51": "Чтобы отправить изменения, не забудьте нажать Обновить профиль",
|
||||
"bchange52": "Разрешаете ли вы этому приложению получать информацию о вашем кошельке?",
|
||||
"bchange53": "Всегда разрешайте всем приложениям автоматически получать список друзей",
|
||||
"bchange54": "Разрешаете ли вы этому приложению доступ к вашему списку друзей?"
|
||||
"bchange47": "Мгновенная публикация - требуется"
|
||||
},
|
||||
"datapage": {
|
||||
"dchange1": "Управление данными",
|
||||
@ -842,37 +821,13 @@
|
||||
"cchange74": "отреагировал",
|
||||
"cchange75": "Выполняется загрузка вложения. Это может занять до одной минуты.",
|
||||
"cchange76": "Удаление вложения. Это может занять до одной минуты.",
|
||||
"cchange77": "Размер вложения превышает 10 МБ",
|
||||
"cchange77": "Размер вложения превышает 1 МБ",
|
||||
"cchange78": "Вы уверены, что хотите удалить это изображение?",
|
||||
"cchange79": "Вы уверены, что хотите удалить это вложение?",
|
||||
"cchange80": "Это изображение было удалено",
|
||||
"cchange81": "Этот тип изображения не поддерживается",
|
||||
"cchange82": "Это вложение было удалено",
|
||||
"cchange90": "Нет сообщений",
|
||||
"cchange91": "Отправка...",
|
||||
"cchange92": "Непрочитанные сообщения ниже",
|
||||
"cchange93": "Изображение скопировано в буфер обмена",
|
||||
"cchange94": "загружено",
|
||||
"cchange95": "Только мои ресурсы",
|
||||
"cchange96": "Открытое управление группой",
|
||||
"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": "Напишите что-нибудь ..."
|
||||
"cchange90": "Нет сообщений"
|
||||
},
|
||||
"welcomepage": {
|
||||
"wcchange1": "Добро пожаловать в Q-Chat",
|
||||
@ -964,19 +919,7 @@
|
||||
"gchange56": "Имя группы для поиска",
|
||||
"gchange57": "Имя частной группы не найдено",
|
||||
"gchange58": "Обратите внимание, что название группы должно точно совпадать.",
|
||||
"gchange59": "Показать/скрыть бегущую строку",
|
||||
"gchange60": "Пожалуйста, введите название группы",
|
||||
"gchange61": "Пожалуйста, введите описание",
|
||||
"gchange62": "Вы обязательно ОБНОВИТЕ эту группу?",
|
||||
"gchange63": "При нажатии кнопки ПОДТВЕРДИТЬ будет отправлен UPDATE_GROUP запрос!",
|
||||
"gchange64": "Текущий владелец / Новый владелец",
|
||||
"gchange65": "Замените этот адрес на TRANSFER OWNERSHIP of group!",
|
||||
"gchange66": "Неверный адрес владельца / нового владельца",
|
||||
"gchange67": "Групповое ОБНОВЛЕНИЕ выполнено успешно!",
|
||||
"gchange68": "Установить групповой аватар",
|
||||
"gchange69": "Сообщения",
|
||||
"gchange70": "За последние 24 часа нет сообщений!",
|
||||
"gchange71": "Вы уже присоединились к этой группе!"
|
||||
"gchange59": "Показать/скрыть бегущую строку"
|
||||
},
|
||||
"puzzlepage": {
|
||||
"pchange1": "Головоломки",
|
||||
@ -1031,16 +974,7 @@
|
||||
"nchange31": "Остановить узел",
|
||||
"nchange32": "Запрос на остановку успешно отправлен!",
|
||||
"nchange33": "Перезапустить узел",
|
||||
"nchange34": "Запрос на перезапуск успешно отправлен!",
|
||||
"nchange35": "Начать узел",
|
||||
"nchange36": "Узел успешно запущен!",
|
||||
"nchange37": "Нажатие «Продолжить» обновит ваше Qortal Core, ваша база данных будет удалена, и вы загрузите новую копию базы данных, называемую начальной загрузкой.",
|
||||
"nchange38": "Восстановить кошелек LTC",
|
||||
"nchange39": "Это восстановит кошельки LTC, баланс которых не может быть потрачен. Для этого требуется выполнить одну транзакцию в сети Litecoin, после подтверждения баланс кошелька будет работоспособным, и проблема больше не повторится.",
|
||||
"nchange40": "Эта транзакция потребует небольшую комиссию LTC. Продолжить?",
|
||||
"nchange41": "Пытаюсь восстановить. Пожалуйста, подождите...",
|
||||
"nchange42": "Кошелёк LTC успешно восстановлен!",
|
||||
"nchange43": "Произошла ошибка при попытке восстановить кошелек LTC. Пожалуйста, попробуйте еще раз!"
|
||||
"nchange34": "Запрос на перезапуск успешно отправлен!"
|
||||
},
|
||||
"transpage": {
|
||||
"tchange1": "Запрос транзакции",
|
||||
@ -1075,16 +1009,7 @@
|
||||
"rewarddialog3": "Если да, вам нужно будет сохранить приведенный ниже ключ, чтобы чеканить. Его можно передать любому узлу, чтобы он мог чеканить от вашего имени.",
|
||||
"rewarddialog4": "При нажатии кнопки подтверждения будет создана доля вознаграждения, но вам все равно нужно будет предоставить вышеуказанный ключ узлу, чтобы создать учетную запись.",
|
||||
"rewarddialog5": "Вы удаляете транзакцию распределения вознаграждения, связанную с аккаунтом:",
|
||||
"rewarddialog6": "При нажатии кнопки подтверждения доля вознаграждения будет удалена, а ключ чеканки станет недействительным.",
|
||||
"deployAtdialog1": "Вы развертываете AT",
|
||||
"deployAtdialog2": "При нажатии подтверждения AT будет развернут!",
|
||||
"deployAtdialog3": "Начальный баланс суммы",
|
||||
"votedialog1": "Вы просите проголосовать в опросе ниже:",
|
||||
"votedialog2": "При нажатии на подтверждение запрос на голосование будет отправлен!",
|
||||
"votedialog3": "Вы просите создать опрос ниже:",
|
||||
"votedialog4": "Описание опроса",
|
||||
"votedialog5": "Параметры",
|
||||
"votedialog6": "При нажатии на подтверждение опрос будет создан!"
|
||||
"rewarddialog6": "При нажатии кнопки подтверждения доля вознаграждения будет удалена, а ключ чеканки станет недействительным."
|
||||
},
|
||||
"sponsorshipspage": {
|
||||
"schange1": "Активное спонсорство",
|
||||
@ -1215,9 +1140,7 @@
|
||||
"inf15": "Активные ордера на автоматическую покупку",
|
||||
"inf16": "Автопокупка",
|
||||
"inf17": "Переключиться на светлую тему",
|
||||
"inf18": "Переключиться на тёмную тему",
|
||||
"inf19": "Торговая информация",
|
||||
"inf20": "Покупатель"
|
||||
"inf18": "Переключиться на тёмную тему"
|
||||
},
|
||||
"lotterypage": {
|
||||
"lot1": "Открытые лотереи Qortal",
|
||||
@ -1233,101 +1156,5 @@
|
||||
"lot11": "Открытых лотерей нет!",
|
||||
"lot12": "Завершенных лотерей не бывает!",
|
||||
"lot13": "Игроки"
|
||||
},
|
||||
"notifications": {
|
||||
"notify1": "Подтверждение транзакции",
|
||||
"notify2": "Транзакция подтверждена",
|
||||
"explanation": "Ваша транзакция подтверждается. Чтобы отслеживать ее ход, нажмите на значок колокольчика.",
|
||||
"status1": "Полностью синхронизировано",
|
||||
"status2": "Не синхронизировано",
|
||||
"notify3": "Нет уведомлений",
|
||||
"notify4": "Уведомления о передаче"
|
||||
},
|
||||
"friends": {
|
||||
"friend1": "Добавить имя",
|
||||
"friend2": "Добавить в друзья",
|
||||
"friend3": "Добавление друга позволит вам легко связаться с этим человеком. Обязательно подпишитесь на этого пользователя, чтобы поддержать хостинг его опубликованных ресурсов.",
|
||||
"friend4": "Примечания",
|
||||
"friend5": "Следовать имени",
|
||||
"friend6": "Псевдоним",
|
||||
"friend7": "Добавьте псевдоним, чтобы лучше запомнить вашего друга (необязательно)",
|
||||
"friend8": "Отправить Q-чат",
|
||||
"friend9": "Отправить Q-Mail",
|
||||
"friend10": "Изменить друга",
|
||||
"friend11": "Следующий",
|
||||
"friend12": "Друзья",
|
||||
"friend13": "Кормить",
|
||||
"friend14": "Удалить друга",
|
||||
"friend15": "Настройки ленты",
|
||||
"friend16": "Выберите приложения Q-Apps, от которых вы хотите получать обновления, особенно те, которые связаны с вашими друзьями.",
|
||||
"friend17": "В вашей ленте нет товаров"
|
||||
},
|
||||
"save": {
|
||||
"saving1": "Не удалось получить сохраненные настройки.",
|
||||
"saving2": "Нечего сохранять",
|
||||
"saving3": "Сохранить несохраненные изменения",
|
||||
"saving4": "Отменить изменения"
|
||||
},
|
||||
"profile": {
|
||||
"profile1": "У вас нет имени",
|
||||
"profile2": "Перейти к регистрации имени",
|
||||
"profile3": "Обновить профиль",
|
||||
"profile4": "Слоган",
|
||||
"profile5": "Биография",
|
||||
"profile6": "Адреса кошелька",
|
||||
"profile7": "Заполнить из пользовательского интерфейса",
|
||||
"profile8": "Добавить пользовательское свойство",
|
||||
"profile9": "Имя свойства",
|
||||
"profile10": "Поля",
|
||||
"profile11": "Добавить поле",
|
||||
"profile12": "Имя поля",
|
||||
"profile13": "Значение поля",
|
||||
"profile14": "Активность",
|
||||
"profile15": "Нет значения",
|
||||
"profile16": "У этого имени нет профиля",
|
||||
"profile17": "Невозможно получить профиль",
|
||||
"profile18": "Открыть профиль",
|
||||
"profile19": "Невозможно получить профиль",
|
||||
"profile20": "Зарегистрировать имя",
|
||||
"profile21": "Вставить адрес из пользовательского интерфейса",
|
||||
"profile22": "Успех",
|
||||
"profile23": "зашифровано",
|
||||
"profile24": "Чтобы добавить пользовательское свойство, вам необходимо заполнить имя и значение поля",
|
||||
"profile25": "Твой друг",
|
||||
"profile26": "Добавить в друзья"
|
||||
},
|
||||
"tour": {
|
||||
"tour1": "Чтобы использовать Qortal, необходимо синхронизировать ядро. Во время синхронизации этот значок будет синим.",
|
||||
"tour2": "Синхронизировано",
|
||||
"tour3": "Синхронизировано и создано",
|
||||
"tour4": "Синхронизация",
|
||||
"tour5": "Синхронизируйте свое ядро",
|
||||
"tour6": "Неудержимая сила Кортала",
|
||||
"tour7": "Только вы контролируете свои данные на Qortal",
|
||||
"tour8": "Qortal невозможно уничтожить",
|
||||
"tour9": "Полностью одноранговая сеть без централизованных посредников",
|
||||
"tour10": "Это вид вкладок по умолчанию, где вы можете получить доступ к важным настройкам Qortal и Q-приложениям, таким как Q-Tube.",
|
||||
"tour11": "Получите все впечатления",
|
||||
"tour12": "Чтобы получить все возможности Qortal, мы рекомендуем следовать этому контрольному списку.",
|
||||
"tour13": "Вы полностью синхронизированы! Теперь вы можете ощутить мощь блокчейна Qortal.",
|
||||
"tour14": "Давайте попробуем посетить Q-Tube!",
|
||||
"tour15": "Посетите Q-Tube",
|
||||
"tour16": "Контрольный список",
|
||||
"tour17": "Пожалуйста, запустите ядро, чтобы получить доступ к блокчейну Qortal.",
|
||||
"tour18": "Обновить (начальная загрузка)",
|
||||
"tour19": "Идет синхронизация... чтобы использовать Qortal, вы должны быть полностью синхронизированы",
|
||||
"tour20": "блоки позади. Хотите обновить (загрузочную загрузку), чтобы ускорить процесс синхронизации?",
|
||||
"tour21": "осталось блоков.",
|
||||
"tour22": "Запрошено обновление (загрузочная загрузка). Пожалуйста, подождите."
|
||||
},
|
||||
"chatsettings": {
|
||||
"cs1": "Настройки чата",
|
||||
"cs2": "Общие настройки чата",
|
||||
"cs3": "Временная метка сообщения чата",
|
||||
"cs4": "Время назад",
|
||||
"cs5": "Местное время",
|
||||
"cs6": "Размер шрифта сообщения чата",
|
||||
"cs7": "Стандартный",
|
||||
"cs8": "px"
|
||||
}
|
||||
}
|
||||
}
|
@ -5,10 +5,8 @@
|
||||
"chinese1": "Chinese (Simplified)",
|
||||
"chinese2": "Chinese (Traditional)",
|
||||
"croatian": "Croatian",
|
||||
"dutch": "Dutch",
|
||||
"english": "English",
|
||||
"estonian": "Estonian",
|
||||
"finnish": "Finnish",
|
||||
"french": "French",
|
||||
"german": "German",
|
||||
"hindi": "Hindi",
|
||||
@ -46,48 +44,48 @@
|
||||
"sm3": "NAMES MARKET"
|
||||
},
|
||||
"tabmenu": {
|
||||
"tm1": "MINTING DETAILS",
|
||||
"tm2": "BECOME A MINTER",
|
||||
"tm3": "SPONSORSHIP",
|
||||
"tm4": "WALLETS",
|
||||
"tm5": "TRADE PORTAL",
|
||||
"tm6": "AUTO-BUY",
|
||||
"tm7": "REWARD SHARE",
|
||||
"tm8": "Q-CHAT",
|
||||
"tm9": "NAME REGISTRATION",
|
||||
"tm10": "NAMES MARKET",
|
||||
"tm11": "WEBSITES",
|
||||
"tm12": "Q-APPS",
|
||||
"tm13": "GROUP MANAGEMENT",
|
||||
"tm14": "DATA MANAGEMENT",
|
||||
"tm15": "PUZZLES",
|
||||
"tm16": "NODE MANAGEMENT",
|
||||
"tm17": "NEW TAB",
|
||||
"tm18": "OPEN NEW TAB",
|
||||
"tm19": "ADD CUSTOM LINK",
|
||||
"tm20": "Q-App (input name)",
|
||||
"tm21": "Website (input name)",
|
||||
"tm22": "REMOVE LINK",
|
||||
"tm23": "Are you sure to REMOVE this link?",
|
||||
"tm24": "Choose LINK TYPE:",
|
||||
"tm25": "Please SELECT a LINK TYPE!",
|
||||
"tm26": "ADD LINK TO NEW TAB PAGE",
|
||||
"tm27": "REMOVE LINK FROM NEW TAB PAGE",
|
||||
"tm28": "OVERVIEW PAGE",
|
||||
"tm29": "RESET New Tab Page",
|
||||
"tm30": "SEARCH For Qortal NAMES",
|
||||
"tm31": "My FOLLOWED Names",
|
||||
"tm32": "This Node is NOT Following Any Names",
|
||||
"tm33": "IMPORT Saved New Tab LINKS",
|
||||
"tm34": "EXPORT Saved New Tab LINKS",
|
||||
"tm35": "Your existing New Tab Page Links will be DELETED and REPLACED with IMPORTED New Tab Links.",
|
||||
"tm36": "New Tab Page SUCCESSFULLY RESTORED!",
|
||||
"tm37": "New Tab Links SUCCESSFULLY SAVED as:",
|
||||
"tm1": "Minting Details",
|
||||
"tm2": "Become a Minter",
|
||||
"tm3": "Sponsorship List",
|
||||
"tm4": "Wallets",
|
||||
"tm5": "Trade Portal",
|
||||
"tm6": "Auto Buy",
|
||||
"tm7": "Reward Share",
|
||||
"tm8": "Q-Chat",
|
||||
"tm9": "Name Registration",
|
||||
"tm10": "Names Market",
|
||||
"tm11": "Websites",
|
||||
"tm12": "Q-Apps",
|
||||
"tm13": "Group Management",
|
||||
"tm14": "Data Management",
|
||||
"tm15": "Puzzles",
|
||||
"tm16": "Node Management",
|
||||
"tm17": "New Tab",
|
||||
"tm18": "Add New Tab",
|
||||
"tm19": "Add New Plugin",
|
||||
"tm20": "Q-App",
|
||||
"tm21": "Website",
|
||||
"tm22": "Remove Plugin",
|
||||
"tm23": "Are you sure to remove this plugin ?",
|
||||
"tm24": "Plugin Type:",
|
||||
"tm25": "Please select a plugin type !",
|
||||
"tm26": "Add New Plugin To Menu",
|
||||
"tm27": "Remove Plugin From Menu",
|
||||
"tm28": "Overview Page",
|
||||
"tm29": "Reset Tab Menu",
|
||||
"tm30": "Search Qortal Name",
|
||||
"tm31": "My Followed Names",
|
||||
"tm32": "This account not follow any user",
|
||||
"tm33": "Import Tab Menu",
|
||||
"tm34": "Export Tab Menu",
|
||||
"tm35": "Your existing tab menu will be deleted and set to uploaded tab menu.",
|
||||
"tm36": "Tab Menu Successfully Restored",
|
||||
"tm37": "Tab Menu Successfully Saved As",
|
||||
"tm38": "DEV MODE",
|
||||
"tm39": "Add Custom Framework",
|
||||
"tm40": "Add and Open",
|
||||
"tm41": "ERROR: Invalid data please try again!",
|
||||
"tm42": "LOTTERY"
|
||||
"tm40": "Add And Open",
|
||||
"tm41": "Error: Invalid data please try again !",
|
||||
"tm42": "Qortal Lottery"
|
||||
},
|
||||
"login": {
|
||||
"login": "Log In",
|
||||
@ -96,51 +94,51 @@
|
||||
"address": "Address",
|
||||
"password": "Password",
|
||||
"youraccounts": "Your accounts",
|
||||
"clickto": "Click account to login",
|
||||
"clickto": "Click your account to log in with it",
|
||||
"needcreate": "You need to create or save an account before you can log in!",
|
||||
"upload": "Import your Qortal backup file",
|
||||
"upload": "Upload your Qortal backup",
|
||||
"howlogin": "How would you like to log in?",
|
||||
"seed": "Seedphrase",
|
||||
"seedphrase": "SEEDPHRASE",
|
||||
"seedphrase": "seedphrase",
|
||||
"saved": "Saved account",
|
||||
"qora": "QORA address seed",
|
||||
"backup": "Qortal backup file",
|
||||
"decrypt": "Decrypt backup file",
|
||||
"qora": "Qora address seed",
|
||||
"backup": "Qortal wallet backup",
|
||||
"decrypt": "Decrypt backup",
|
||||
"save": "Save in this browser.",
|
||||
"prepare": "Preparing Your Account...",
|
||||
"areyousure": "Are you sure you want to REMOVE this ACCOUNT from SAVED ACCOUNTS? (If removed and no backup file exists, account could be lost forever! ENSURE YOU HAVE A BACKUP FILE FOR THIS ACCOUNT BEFORE DOING THIS!)",
|
||||
"error1": "Backup file must be valid JSON",
|
||||
"prepare": "Preparing Your Account",
|
||||
"areyousure": "Are you sure you want to remove this wallet from saved wallets?",
|
||||
"error1": "Backup must be valid JSON",
|
||||
"error2": "Login option not selected",
|
||||
"createwelcome": "Welcome to Qortal! Your decentralized digital future awaits you! On Qortal, you and ONLY you have absolute control over your data. Qortal provides the base level of a new, and fully user-controlled digital world!",
|
||||
"createwelcome": "Welcome to Qortal, you will find it to be similar to that of an RPG game, you, as a minter on the Qortal network (if you choose to become one) will have the chance to level your account up, giving you both more of the QORT block reward and also larger influence over the network in terms of voting on decisions for the platform.",
|
||||
"createa": "A",
|
||||
"click": "CLICK to VIEW SEEDPHRASE",
|
||||
"click": "Click to view seedphrase",
|
||||
"confirmpass": "Confirm Password",
|
||||
"willbe": "will be randomly generated in the background. If you wish to VIEW THE SEEDPHRASE, click the word 'SEEDPHRASE' in this text. Seedphrases are used to generate the private key for your Qortal account. For security by default, seedphrases are NOT displayed unless specifically chosen.",
|
||||
"willbe": "will be randomly generated in background. This is used as your private key generator for your blockchain account in Qortal.",
|
||||
"clicknext": "Create your Qortal account by clicking NEXT below.",
|
||||
"ready": "Your account is now ready to be created. It will be SAVED AND ENCRYPTED within THIS Qortal UI only, by default. If you DO NOT wish for it to be saved, UNCHECK THE BOX BELOW. You are always able to access your new account using the Qortal BACKUP FILE that MUST be SAVED upon account creation.",
|
||||
"ready": "Your account is now ready to be created. It will be saved in this browser. If you do not want your new account to be saved in your browser, you can uncheck the box below. You will still be able to log in with your new account(after logging out), using your wallet backup file that you MUST download once you create your account.",
|
||||
"welmessage": "Welcome to Qortal",
|
||||
"pleaseenter": "Please enter a Password!",
|
||||
"notmatch": "Oops! Passwords do NOT match! Try again!",
|
||||
"lessthen8": "Your password is LESS THAN 5 characters! This is NOT recommended. To continue anyway, click CONTINUE.",
|
||||
"lessthen8-2": "Your password is LESS THAN 5 characters!",
|
||||
"entername": "Please enter a Display Name!",
|
||||
"downloaded": "Your Qortal Backup File was SAVED!",
|
||||
"loading": "LOADING, Please wait...",
|
||||
"createdseed": "Your Generated Seedphrase:",
|
||||
"saveseed": "SAVE SEEDPHRASE",
|
||||
"savein": "SAVE in THIS UI",
|
||||
"backup2": "This file is the ONLY WAY (by default) to ACCESS YOUR ACCOUNT (unless saved to the UI). BE SURE TO BACKUP THIS FILE IN MULTIPLE LOCATIONS. The file is ENCRYPTED very securely (and decrypted) with your local PASSWORD created in the previous step. You can save the Qortal Backup File anywhere securely, but be sure to do so in MULTIPLE PLACES.",
|
||||
"savewallet": "SAVE Qortal Backup File",
|
||||
"notmatch": "Passwords do not match!",
|
||||
"lessthen8": "Your password is less than 8 characters! This is not recommended. You can continue to ignore this warning.",
|
||||
"lessthen8-2": "Your password is less than 8 characters!",
|
||||
"entername": "Please enter a Name!",
|
||||
"downloaded": "Your Wallet BackUp file was downloaded!",
|
||||
"loading": "Loading, Please wait...",
|
||||
"createdseed": "Your created Seedphrase",
|
||||
"saveseed": "Save Seedphrase",
|
||||
"savein": "Save in browser",
|
||||
"backup2": "This file is the ONLY way to access your account on a system that doesn't have it saved to the app/browser. BE SURE TO BACKUP THIS FILE IN MULTIPLE PLACES. The file is encrypted very securely and decrypted with your local password you created in the previous step. You can save it anywhere securely, but be sure to do that in multiple locations.",
|
||||
"savewallet": "Save Wallet BackUp File",
|
||||
"created1": "Your account is now created",
|
||||
"created2": " and saved in THIS UI in ENCRYPTED form.",
|
||||
"downloadbackup": "SAVE Qortal Backup File",
|
||||
"passwordhint": "Encryption password is suggested to be at least 5 characters.",
|
||||
"created2": " and will be saved in this browser.",
|
||||
"downloadbackup": "Download Wallet BackUp File",
|
||||
"passwordhint": "A password must be at least 8 characters.",
|
||||
"lp1": "Lock Screen",
|
||||
"lp2": "No screen lock password is set!",
|
||||
"lp3": "Please set one",
|
||||
"lp2": "No Lock Screen Password Is Set !",
|
||||
"lp3": "Please Set One",
|
||||
"lp4": "No Thanks",
|
||||
"lp5": "Set Password",
|
||||
"lp6": "New screen lock password set successfully!",
|
||||
"lp6": "New screen lock password set successfully !",
|
||||
"lp7": "UNLOCK",
|
||||
"lp8": "Error: Incorrect password",
|
||||
"lp9": "IS",
|
||||
@ -163,8 +161,8 @@
|
||||
"confirmlogout": "Are you sure you want to log out?"
|
||||
},
|
||||
"fragfile": {
|
||||
"selectfile": "Select Backup File",
|
||||
"dragfile": "Drag and drop or CLICK HERE to select Backup File"
|
||||
"selectfile": "Select file",
|
||||
"dragfile": "Drag and drop backup here"
|
||||
},
|
||||
"settings": {
|
||||
"generalinfo": "General Account Info",
|
||||
@ -174,47 +172,42 @@
|
||||
"account": "Account",
|
||||
"security": "Security",
|
||||
"qr_login_menu_item": "QR Login",
|
||||
"qr_login_description_1": "Scan this code to save your wallet on another device using the same password currently logged in with.",
|
||||
"qr_login_description_2": "Choose a password to unlock your wallet on another device after scanning QR code.",
|
||||
"qr_login_description_1": "Scan this code to unlock your wallet on another device using the same password which you logged in with.",
|
||||
"qr_login_description_2": "Choose a password which you will use to unlock your wallet on another device after scanning the QR code.",
|
||||
"qr_login_button_1": "Show login QR code",
|
||||
"qr_login_button_2": "Generate login QR code",
|
||||
"notifications": "Notifications",
|
||||
"accountsecurity": "Account Security",
|
||||
"password": "Password",
|
||||
"download": "Export/Save Backup File",
|
||||
"choose": "Please input a password to encrypt your backup file. (This can be the same as the one you logged in with, or a new one.)",
|
||||
"download": "Download Backup File",
|
||||
"choose": "Please choose a password to encrypt your backup with. (This can be the same as the one you logged in with, or different)",
|
||||
"block": "Block Notifications (Coming Soon...)",
|
||||
"playsound": "Play Sound",
|
||||
"shownotifications": "Show Notifications",
|
||||
"nodeurl": "Node Url",
|
||||
"nodehint": "Select a Node from the default list, or add a custom Node to the list by clicking on the button below",
|
||||
"nodehint": "Select a node from the default list of nodes above or add a custom node to the list above by clicking on the button below",
|
||||
"addcustomnode": "Add Custom Node",
|
||||
"addandsave": "Add and Save",
|
||||
"addandsave": "Add And Save",
|
||||
"protocol": "Protocol",
|
||||
"domain": "Domain",
|
||||
"port": "Port",
|
||||
"import": "Import Saved Nodes",
|
||||
"export": "Export Saved Nodes",
|
||||
"deletecustomnode": "REMOVE ALL Custom Nodes",
|
||||
"warning": "Your Custom Nodes will be deleted and reset to default.",
|
||||
"snack1": "Successfully deleted and added default Nodes",
|
||||
"snack2": "UI conected to Node",
|
||||
"snack3": "Successfully ADDED and saved Custom Node (select from drop-down to use)",
|
||||
"snack4": "Nodes successfully exported as:",
|
||||
"import": "Import Nodes",
|
||||
"export": "Export Nodes",
|
||||
"deletecustomnode": "Remove All Custom Nodes",
|
||||
"warning": "Your existing nodes will be deleted and reset to default.",
|
||||
"snack1": "Successfully deleted and added default nodes",
|
||||
"snack2": "UI conected to node",
|
||||
"snack3": "Successfully added and saved custom node",
|
||||
"snack4": "Nodes successfully saved as",
|
||||
"snack5": "Nodes successfully imported",
|
||||
"snack6": "Successfully removed Custom Node",
|
||||
"snack7": "Successfully edited Custom Node",
|
||||
"exp1": "Export Master Private Key (xpriv)",
|
||||
"snack6": "Successfully removed custom node",
|
||||
"snack7": "Successfully edited custom node",
|
||||
"exp1": "Export Private Master Key",
|
||||
"exp2": "Export Master Key",
|
||||
"exp3": "Export",
|
||||
"exp4": "Please select a wallet to backup/export master private key.",
|
||||
"core": "Core auto-start settings",
|
||||
"qappNotification1": "Q-App Notifications",
|
||||
"selectnode": "Please select an option",
|
||||
"arrr1": "ARRR Wallet Not Initialized!",
|
||||
"arrr2": "Please go to wallet tab and access ARRR wallet to initialize wallet first.",
|
||||
"arrr3": "Need Core Update !",
|
||||
"arrr4": "To save the private key of your ARRR wallet you must first update the Qortal Core!",
|
||||
"sync_indicator": "Disable sync indicator popup"
|
||||
"exp4": "Please choose a wallet to backup the private master key.",
|
||||
"core": "Start Core Settings",
|
||||
"qappNotification1": "Q-App Notifications"
|
||||
},
|
||||
"appinfo": {
|
||||
"blockheight": "Block Height",
|
||||
@ -248,9 +241,7 @@
|
||||
"balance": "Balance",
|
||||
"balances": "YOUR WALLET BALANCES",
|
||||
"update": "UPDATE WALLET BALANCES",
|
||||
"view": "View",
|
||||
"all": "All",
|
||||
"page": "Page"
|
||||
"view": "View"
|
||||
},
|
||||
"gifs": {
|
||||
"gchange1": "Gif Explorer",
|
||||
@ -278,22 +269,22 @@
|
||||
"gchange23": "Your gif collection cannot contain two gifs with the same name!",
|
||||
"gchange24": "This collection name is already taken. Try another name!",
|
||||
"gchange25": "GIF (click to view)",
|
||||
"gchange26": "Registered Name required to access and send GIF files",
|
||||
"gchange26": "A name is needed to access and send GIF files",
|
||||
"gchange27": "The gif collection size is over 25mb! Please try again!",
|
||||
"gchange28": "Each gif in the collection cannot be over 0.7mb! Please try again!",
|
||||
"gchange29": "Filename"
|
||||
},
|
||||
"startminting": {
|
||||
"smchange1": "Cannot fetch Minting Accounts",
|
||||
"smchange2": "Failed to remove Minting Key",
|
||||
"smchange3": "Failed to add Minting Key, if key was just created try waiting a few blocks and adding again",
|
||||
"smchange4": "Cannot create Key (Keys can only be created once!)",
|
||||
"smchange1": "Cannot fetch minting accounts",
|
||||
"smchange2": "Failed to remove key",
|
||||
"smchange3": "Failed to add minting key",
|
||||
"smchange4": "Cannot create sponsorship key",
|
||||
"smchange5": "Creating relationship",
|
||||
"smchange6": "Awaiting confirmation on blockchain",
|
||||
"smchange7": "Finishing up...",
|
||||
"smchange8": "Adding Minting Key to Node",
|
||||
"smchange7": "Finishing up relationship",
|
||||
"smchange8": "Adding minting key to node",
|
||||
"smchange9": "Complete",
|
||||
"smchange10": "Only 2 Minting Keys are allowed per Node, you are attempting to assign 3 keys, please go to Node Management, and remove any unnecessary keys, thank you!"
|
||||
"smchange10": "Only 2 minting keys are allowed per node, you are attempting to assign 3 keys, please go to Management - Node Management, and remove the key you do not want to assign to this node, thank you!"
|
||||
},
|
||||
"mintingpage": {
|
||||
"mchange1": "General Minting Details",
|
||||
@ -313,7 +304,7 @@
|
||||
"mchange15": "Current Status",
|
||||
"mchange16": "Current Level",
|
||||
"mchange17": "Blocks To Next Level",
|
||||
"mchange18": "If you continue Minting 24/7 you will reach level",
|
||||
"mchange18": "If you continue minting 24/7 you will reach level",
|
||||
"mchange19": "Minting Rewards Info",
|
||||
"mchange20": "Current Tier",
|
||||
"mchange21": "Total Minters in The Tier",
|
||||
@ -329,17 +320,17 @@
|
||||
"mchange31": "Press for help",
|
||||
"mchange32": "Become A Minter",
|
||||
"mchange33": "Introduction",
|
||||
"mchange34": "In Qortal, in order to become a Minter and begin earning QORT rewards with your increase in Minter Level, you must first obtain a tamporary Key called a 'Sponsorship Key'. A Sponsor in Qortal is any other minter of level 5 or higher, or a Qortal Founder. You will obtain a Minting Key from the Sponsor, and use that key to get to level 1. Once you have reached level 1, you will be able to create your own Minting Key and start earning rewards for helping secure the Qortal Blockchain.",
|
||||
"mchange34": "In Qortal, in order to become a minter and begin earning QORT rewards with your increase in Minter Level, you must first become ‘sponsored’. A sponsor in Qortal is any other minter of level 5 or higher, or a Qortal Founder. You will obtain a minting key from the sponsor, and use that key to get to level 1. Once you have reached level 1, you will be able to create your own minting key and start earning rewards for helping secure the Qortal Blockchain.",
|
||||
"mchange35": "Sponsorship",
|
||||
"mchange36": "Your Sponsor will issue you a ‘Sponsorship Key’ which you will use to add to your Node, and begin minting for no rewards (until reaching level 1.) Once you reach level 1, you create/assign your own ‘Minting Key’ and begin earning rewards.",
|
||||
"mchange37": "Simply reach out to a Minter in Qortal who is high enough level to issue a Minting Key, obtain that key, then come back here and input the key to begin your minting journey!",
|
||||
"mchange36": "Your sponsor will issue you a ‘Minting Key’ which you will use to add to your node, and begin minting (for no rewards until reaching level 1.) Once you reach level 1, you create/assign your own ‘Minting Key’ and begin earning rewards.",
|
||||
"mchange37": "Simply reach out to a minter in Qortal who is high enough level to issue a minting key, obtain that key, then come back here and input the key to begin your minting journey!",
|
||||
"mchange38": "in"
|
||||
},
|
||||
"becomeMinterPage": {
|
||||
"bchange7": "Enter Minting Key",
|
||||
"bchange8": "Input key from your sponsor here",
|
||||
"bchange10": "Current Sponsorship Status",
|
||||
"bchange12": "Minting with Sponsorship Key",
|
||||
"bchange12": "Minting with sponsor's key",
|
||||
"bchange13": "Blocks Remaining in Sponsorship Period",
|
||||
"bchange15": "Sponsorship Relationship",
|
||||
"bchange16": "Sponsor Account",
|
||||
@ -442,17 +433,17 @@
|
||||
"tchange31": "SOLD",
|
||||
"tchange32": "BOUGHT",
|
||||
"tchange33": "Average",
|
||||
"tchange34": "Amount cannot be 0",
|
||||
"tchange35": "Price cannot be 0",
|
||||
"tchange34": "Amount can not be 0",
|
||||
"tchange35": "Price can not be 0",
|
||||
"tchange36": "PENDING AUTO BUY",
|
||||
"tchange37": "No Auto Buy order found!",
|
||||
"tchange37": "No auto buy order found!",
|
||||
"tchange38": "ADD",
|
||||
"tchange39": "AUTO BUY ORDER",
|
||||
"tchange40": "Price",
|
||||
"tchange41": "Successfully removed Auto Buy order!",
|
||||
"tchange41": "Successfully removed auto buy order!",
|
||||
"tchange42": "MARKET OPEN SELL ORDERS",
|
||||
"tchange43": "MY BUY HISTORY",
|
||||
"tchange44": "Successfully added Auto Buy order!",
|
||||
"tchange44": "Successfully added auto buy order!",
|
||||
"tchange45": "AUTO BUY WITH",
|
||||
"tchange46": "AUTO BUY",
|
||||
"tchange47": "Sell for this price",
|
||||
@ -460,22 +451,22 @@
|
||||
"tchange49": "Price Chart"
|
||||
},
|
||||
"rewardsharepage": {
|
||||
"rchange1": "Reward Shares",
|
||||
"rchange2": "Create Reward Share",
|
||||
"rchange3": "Rewardshares Involving This Account",
|
||||
"rchange1": "Rewardshares",
|
||||
"rchange2": "Create reward share",
|
||||
"rchange3": "Rewardshares Involving In This Account",
|
||||
"rchange4": "Minting Account",
|
||||
"rchange5": "Share Percent",
|
||||
"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!",
|
||||
"rchange10": "Recipient's Public Key",
|
||||
"rchange11": "Reward Share percentage",
|
||||
"rchange12": "Executing Requested Command...",
|
||||
"rchange13": "Adding Minting Account",
|
||||
"rchange9": "Level 1 - 4 can create a Self Share and Level 5 or above can create a Reward Share!",
|
||||
"rchange10": "Recipient Public Key",
|
||||
"rchange11": "Reward share percentage",
|
||||
"rchange12": "Doing something delicious",
|
||||
"rchange13": "Adding minting account",
|
||||
"rchange14": "Add",
|
||||
"rchange15": "Account is not involved in any Reward Shares",
|
||||
"rchange16": "Create Minting Key",
|
||||
"rchange15": "Account is not involved in any reward shares",
|
||||
"rchange16": "Own Rewardshare",
|
||||
"rchange17": "Remove",
|
||||
"rchange18": "Cannot Create Multiple Reward Shares!",
|
||||
"rchange19": "Cannot Create Multiple Self Shares!",
|
||||
@ -509,29 +500,29 @@
|
||||
"nchange23": "Sell Price",
|
||||
"nchange24": "No Names To Sell",
|
||||
"nchange25": "Name To Sell",
|
||||
"nchange26": "Are you sure you want to sell this name? If Name is purchased by another account, all data Published by this Name will be out of your control!",
|
||||
"nchange26": "Are you sure to sell this name?",
|
||||
"nchange27": "For this price in QORT",
|
||||
"nchange28": "On pressing confirm, your Name will be listed for sale!",
|
||||
"nchange28": "On pressing confirm, the sell name request will be sent!",
|
||||
"nchange29": "Name To Cancel",
|
||||
"nchange30": "Are you sure to cancel the sell for this Name?",
|
||||
"nchange31": "On pressing confirm, the Name Sale will be canceled!",
|
||||
"nchange30": "Are you sure to cancel the sell for this name?",
|
||||
"nchange31": "On pressing confirm, the cancel sell name request will be sent!",
|
||||
"nchange32": "Sell Name Request Successful!",
|
||||
"nchange33": "Cancel Sell Name Request Successful!",
|
||||
"nchange34": "Buy Name Request Successful!",
|
||||
"nchange35": "YOU HAVE A NAME!",
|
||||
"nchange36": "Only accounts with no Registered Name can buy a Name.",
|
||||
"nchange36": "Only accounts with no registered name can buy a name.",
|
||||
"nchange37": "ATTENTION!",
|
||||
"nchange38": "You not have enough QORT to buy this Name.",
|
||||
"nchange39": "Are you sure to buy this Name?",
|
||||
"nchange40": "On pressing confirm, the Buy Name request will be sent!",
|
||||
"nchange38": "You not have enough QORT to buy this name.",
|
||||
"nchange39": "Are you sure to buy this name?",
|
||||
"nchange40": "On pressing confirm, the buy name request will be sent!",
|
||||
"nchange41": "Old Name",
|
||||
"nchange42": "New Name",
|
||||
"nchange43": "Are you sure to change this name?",
|
||||
"nchange44": "To the new name",
|
||||
"nchange45": "On pressing confirm, the Update Name request will be sent!",
|
||||
"nchange45": "On pressing confirm, the name update request will be sent!",
|
||||
"nchange46": "Name Sale History",
|
||||
"nchange47": "Name Update Successful!",
|
||||
"nchange48": "Warning! If you update your Name, you will forfeit the resources associated with the original Name. In other words, you will lose ownership of the content under the original Name on QDN. Proceed with caution!"
|
||||
"nchange48": "Warning! If you update your name, you will forfeit the resources associated with the original name. In other words, you will lose ownership of the content under the original name in the QDN. Proceed with caution!"
|
||||
},
|
||||
"websitespage": {
|
||||
"schange1": "Browse Websites",
|
||||
@ -540,7 +531,7 @@
|
||||
"schange4": "Search Websites",
|
||||
"schange5": "Avatar",
|
||||
"schange6": "Details",
|
||||
"schange7": "Published by:",
|
||||
"schange7": "Published by",
|
||||
"schange8": "Actions",
|
||||
"schange9": "Websites",
|
||||
"schange10": "No websites available",
|
||||
@ -551,14 +542,14 @@
|
||||
"schange15": "Blocked Websites",
|
||||
"schange16": "You have not blocked any websites",
|
||||
"schange17": "Name Not Found!",
|
||||
"schange18": "Relay Mode is ENABLED. This means that your Node will help to transport ENCRYPTED/CHUNKED data around the network when a peer requests it. You can opt out by setting:",
|
||||
"schange18": "Relay mode is enabled. This means that your node will help to transport encrypted data around the network when a peer requests it. You can opt out by setting",
|
||||
"schange19": "in",
|
||||
"schange20": "Relay mode is DISABLED. You can enable it by setting:",
|
||||
"schange20": "Relay mode is disabled. You can enable it by setting",
|
||||
"schange21": "Publish Website",
|
||||
"schange22": "Error occurred when trying to follow this Registered Name. Please try again!",
|
||||
"schange23": "Error occurred when trying to unfollow this Registered Name. Please try again!",
|
||||
"schange24": "Error occurred when trying to block this Registered Name. Please try again!",
|
||||
"schange25": "Error occurred when trying to unblock this Registered Name. Please try again!",
|
||||
"schange22": "Error occurred when trying to follow this registered name. Please try again!",
|
||||
"schange23": "Error occurred when trying to unfollow this registered name. Please try again!",
|
||||
"schange24": "Error occurred when trying to block this registered name. Please try again!",
|
||||
"schange25": "Error occurred when trying to unblock this registered name. Please try again!",
|
||||
"schange26": "Uncategorized",
|
||||
"schange27": "Size",
|
||||
"schange28": "Status",
|
||||
@ -588,14 +579,14 @@
|
||||
"schange15": "Blocked Q-Apps",
|
||||
"schange16": "You have not blocked any Q-Apps",
|
||||
"schange17": "Name Not Found!",
|
||||
"schange18": "Relay mode is enabled. This means that your Node will help to transport ENCRYPTED/CHUNKED data around the network when a peer requests it. You can opt out by setting",
|
||||
"schange18": "Relay mode is enabled. This means that your node will help to transport encrypted data around the network when a peer requests it. You can opt out by setting",
|
||||
"schange19": "in",
|
||||
"schange20": "Relay mode is disabled. You can enable it by setting",
|
||||
"schange21": "Publish Q-App",
|
||||
"schange22": "Error occurred when trying to follow this Registered Name. Please try again!",
|
||||
"schange23": "Error occurred when trying to unfollow this Registered Name. Please try again!",
|
||||
"schange24": "Error occurred when trying to block this Registered Name. Please try again!",
|
||||
"schange25": "Error occurred when trying to unblock this Registered Name. Please try again!",
|
||||
"schange22": "Error occurred when trying to follow this registered name. Please try again!",
|
||||
"schange23": "Error occurred when trying to unfollow this registered name. Please try again!",
|
||||
"schange24": "Error occurred when trying to block this registered name. Please try again!",
|
||||
"schange25": "Error occurred when trying to unblock this registered name. Please try again!",
|
||||
"schange26": "Uncategorized",
|
||||
"schange27": "Size",
|
||||
"schange28": "Status",
|
||||
@ -604,7 +595,7 @@
|
||||
"schange31": "Block",
|
||||
"schange32": "Unblock",
|
||||
"schange33": "Name to search",
|
||||
"schange34": "Name cannot be empty!",
|
||||
"schange34": "Name can not be empty!",
|
||||
"schange35": "Search",
|
||||
"schange36": "Download",
|
||||
"schange37": "Downloaded",
|
||||
@ -612,8 +603,7 @@
|
||||
"schange39": "Open",
|
||||
"schange40": "Preview",
|
||||
"schange41": "Downloading please wait...",
|
||||
"schange42": "Files downloaded",
|
||||
"schange43": "Any attempted downloads will continue in the background, please try again after a while."
|
||||
"schange42": "Files downloaded"
|
||||
},
|
||||
"tubespage": {
|
||||
"schange1": "Browse Q-Tubes",
|
||||
@ -633,14 +623,14 @@
|
||||
"schange15": "Blocked Q-Tubes",
|
||||
"schange16": "You have not blocked any Q-Tubes",
|
||||
"schange17": "Name Not Found!",
|
||||
"schange18": "Relay Mode is ENABLED. This means that your Node will help to transport ENCRYPTED/CHUNKED data around the network when a peer requests it. You can opt out by setting:",
|
||||
"schange18": "Relay mode is enabled. This means that your node will help to transport encrypted data around the network when a peer requests it. You can opt out by setting",
|
||||
"schange19": "in",
|
||||
"schange20": "Relay mode is DISABLED. You can enable it by setting:",
|
||||
"schange20": "Relay mode is disabled. You can enable it by setting",
|
||||
"schange21": "Publish Video",
|
||||
"schange22": "Error occurred when trying to follow this Registered Name. Please try again!",
|
||||
"schange23": "Error occurred when trying to unfollow this Registered Name. Please try again!",
|
||||
"schange24": "Error occurred when trying to block this Registered Name. Please try again!",
|
||||
"schange25": "Error occurred when trying to unblock this Registered Name. Please try again!",
|
||||
"schange22": "Error occurred when trying to follow this registered name. Please try again!",
|
||||
"schange23": "Error occurred when trying to unfollow this registered name. Please try again!",
|
||||
"schange24": "Error occurred when trying to block this registered name. Please try again!",
|
||||
"schange25": "Error occurred when trying to unblock this registered name. Please try again!",
|
||||
"schange26": "Uncategorized",
|
||||
"schange27": "Size",
|
||||
"schange28": "Status",
|
||||
@ -663,7 +653,7 @@
|
||||
"publishpage": {
|
||||
"pchange1": "Publish",
|
||||
"pchange2": "Update",
|
||||
"pchange3": "Note: it is recommended that you set up Port Forwarding before hosting data, so that it can more easily be accessed by peers on the network.",
|
||||
"pchange3": "Note: it is recommended that you set up port forwarding before hosting data, so that it can more easily be accessed by peers on the network.",
|
||||
"pchange4": "Select Name",
|
||||
"pchange5": "Title",
|
||||
"pchange6": "Description",
|
||||
@ -674,11 +664,11 @@
|
||||
"pchange11": "Publish",
|
||||
"pchange12": "Select zip file containing static content",
|
||||
"pchange13": "Local path to static files",
|
||||
"pchange14": "Please select a Registered Name to publish data for",
|
||||
"pchange14": "Please select a registered name to publish data for",
|
||||
"pchange15": "Please select a file to host",
|
||||
"pchange16": "Please select a zip file to host",
|
||||
"pchange17": "Please enter the directory path containing the static content",
|
||||
"pchange18": "Please enter a Service Name",
|
||||
"pchange18": "Please enter a service name",
|
||||
"pchange19": "Processing data... this can take some time...",
|
||||
"pchange20": "Error:",
|
||||
"pchange21": "Internal Server Error when publishing data",
|
||||
@ -693,16 +683,16 @@
|
||||
"bchange2": "Reload",
|
||||
"bchange3": "Back to list",
|
||||
"bchange4": "Delete",
|
||||
"bchange5": "From Node",
|
||||
"bchange5": "from node",
|
||||
"bchange6": "Your browser doesn't support iframes",
|
||||
"bchange7": "Follow",
|
||||
"bchange8": "Unfollow",
|
||||
"bchange9": "Block",
|
||||
"bchange10": "Unblock",
|
||||
"bchange11": "Error occurred when trying to follow this Registered Name. Please try again!",
|
||||
"bchange12": "Error occurred when trying to unfollow this Registered Name. Please try again!",
|
||||
"bchange13": "Error occurred when trying to block this Registered Name. Please try again!",
|
||||
"bchange14": "Error occurred when trying to unblock this Registered Name. Please try again!",
|
||||
"bchange11": "Error occurred when trying to follow this registered name. Please try again!",
|
||||
"bchange12": "Error occurred when trying to unfollow this registered name. Please try again!",
|
||||
"bchange13": "Error occurred when trying to block this registered name. Please try again!",
|
||||
"bchange14": "Error occurred when trying to unblock this registered name. Please try again!",
|
||||
"bchange15": "Can't delete data from followed names. Please unfollow first.",
|
||||
"bchange16": "Error occurred when trying to delete this resource. Please try again!",
|
||||
"bchange17": "User declined to share account details",
|
||||
@ -736,35 +726,29 @@
|
||||
"bchange45": "Encrypt",
|
||||
"bchange46": "Do you give this application permission to save the following file",
|
||||
"bchange47": "Instant publish - requires",
|
||||
"bchange48": "Do you give this application permission to send you notifications",
|
||||
"bchange49": "Do you grant this application permission to access the following private information from your profile?",
|
||||
"bchange50": "This app has requested a change to your public profile. Property: ",
|
||||
"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?"
|
||||
"bchange48": "Do you give this application permission to send you notifications"
|
||||
},
|
||||
"datapage": {
|
||||
"dchange1": "Data Management",
|
||||
"dchange2": "Search in hosted data by this Node",
|
||||
"dchange2": "Search in hosted data by this node",
|
||||
"dchange3": "Data to search",
|
||||
"dchange4": "Search",
|
||||
"dchange5": "Registered Name",
|
||||
"dchange6": "Service",
|
||||
"dchange7": "Identifier",
|
||||
"dchange8": "Actions",
|
||||
"dchange9": "Data hosted by this Node",
|
||||
"dchange9": "Data hosted by this node",
|
||||
"dchange10": "Data name can not be empty!",
|
||||
"dchange11": "Data not found!",
|
||||
"dchange12": "Couldn't fetch hosted data list from Node",
|
||||
"dchange13": "This Node isn't hosting any data",
|
||||
"dchange12": "Couldn't fetch hosted data list from node",
|
||||
"dchange13": "This node isn't hosting any data",
|
||||
"dchange14": "Unfollow",
|
||||
"dchange15": "Delete",
|
||||
"dchange16": "Block",
|
||||
"dchange17": "Unblock",
|
||||
"dchange18": "Error occurred when trying to block this Registered Name. Please try again!",
|
||||
"dchange19": "Error occurred when trying to unfollow this Registered Name. Please try again!",
|
||||
"dchange20": "Error occurred when trying to unblock this Registered Name. Please try again!",
|
||||
"dchange18": "Error occurred when trying to block this registered name. Please try again!",
|
||||
"dchange19": "Error occurred when trying to unfollow this registered name. Please try again!",
|
||||
"dchange20": "Error occurred when trying to unblock this registered name. Please try again!",
|
||||
"dchange21": "Error occurred when trying to delete this resource. Please try again!"
|
||||
},
|
||||
"chatpage": {
|
||||
@ -782,7 +766,7 @@
|
||||
"cchange12": "Owner",
|
||||
"cchange13": "Action",
|
||||
"cchange14": "This account has not blocked any users.",
|
||||
"cchange15": "No Registered Name",
|
||||
"cchange15": "No registered name",
|
||||
"cchange16": "Successfully unblocked this user.",
|
||||
"cchange17": "Error occurred when trying to unblock this user. Please try again!",
|
||||
"cchange18": "unblock",
|
||||
@ -794,7 +778,7 @@
|
||||
"cchange24": "Maximum Characters per message is 255",
|
||||
"cchange25": "Edit Message",
|
||||
"cchange26": "File size exceeds 0.5 MB",
|
||||
"cchange27": "A Registered Name is required to send images",
|
||||
"cchange27": "A registered name is required to send images",
|
||||
"cchange28": "This file is not an image",
|
||||
"cchange29": "Maximum message size is 1000 bytes",
|
||||
"cchange30": "Uploading image. This may take up to one minute.",
|
||||
@ -808,7 +792,7 @@
|
||||
"cchange39": "Cannot send an encrypted message to this user since they do not have their publickey on chain.",
|
||||
"cchange40": "IMAGE (click to view)",
|
||||
"cchange41": "Your Balance Is Under 4 QORT",
|
||||
"cchange42": "Out of the need to combat spam, accounts with UNDER 4 QORT BALANCE will take a long time to SEND messages in Q-Chat. If you wish to immediately increase the send speed for Q-Chat messages, obtain over 4 QORT to your address. This can be done with trades in the Trade Portal, or by way of another Qortian giving you the QORT. Once you have over 4 QORT in your account, Q-Chat messages will be instant and this dialog will not show. It does NOT cost QORT to send messages. Thank you for your understanding of this necessary spam prevention method, and we hope you enjoy Qortal!",
|
||||
"cchange42": "Out of the need to combat spam, accounts with under 4 QORT balance will take a long time to SEND messages in Q-Chat. If you wish to immediately increase the send speed for Q-Chat messages, obtain over 4 QORT to your address. This can be done with trades in the Trade Portal, or by way of another Qortian giving you the QORT. Once you have over 4 QORT in your account, Q-Chat messages will be instant and this dialog will no more show. Thank you for your understanding of this necessary spam prevention method, and we hope you enjoy Qortal!",
|
||||
"cchange43": "Tip QORT to",
|
||||
"cchange44": "SEND MESSAGE",
|
||||
"cchange45": "TIP USER",
|
||||
@ -842,7 +826,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 10 MB",
|
||||
"cchange77": "Attachment size exceeds 1 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",
|
||||
@ -855,24 +839,7 @@
|
||||
"cchange94": "loaded",
|
||||
"cchange95": "Only my resources",
|
||||
"cchange96": "Open Group Management",
|
||||
"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 ..."
|
||||
"cchange97": "Join group link copied to clipboard"
|
||||
},
|
||||
"welcomepage": {
|
||||
"wcchange1": "Welcome to Q-Chat",
|
||||
@ -889,7 +856,7 @@
|
||||
"bcchange1": "Block User",
|
||||
"bcchange2": "Successfully blocked this user!",
|
||||
"bcchange3": "Error occurred when trying to block this user. Please try again!",
|
||||
"bcchange4": "No Registered Name",
|
||||
"bcchange4": "No registered name",
|
||||
"bcchange5": "Block User Request",
|
||||
"bcchange6": "Are you sure to block this user?",
|
||||
"bcchange7": "MENU",
|
||||
@ -920,7 +887,7 @@
|
||||
"gchange12": "Create a New Group",
|
||||
"gchange13": "Group Type",
|
||||
"gchange14": "This Field is Required",
|
||||
"gchange15": "--SELECT AN OPTION--",
|
||||
"gchange15": "Select an option",
|
||||
"gchange16": "Public",
|
||||
"gchange17": "Private",
|
||||
"gchange18": "Group Approval Threshold (number / percentage of Admins that must approve a transaction):",
|
||||
@ -949,7 +916,7 @@
|
||||
"gchange41": "Group Creation Successful!",
|
||||
"gchange42": "Invalid Group Name",
|
||||
"gchange43": "Invalid Group Description",
|
||||
"gchange44": "Select Group Type",
|
||||
"gchange44": "Select a Group Type",
|
||||
"gchange45": "Select a Group Approval Threshold",
|
||||
"gchange46": "Select a Minimum Block delay for Group Transaction Approvals",
|
||||
"gchange47": "Select a Maximum Block delay for Group Transaction Approvals",
|
||||
@ -963,20 +930,8 @@
|
||||
"gchange55": "Search Private Group",
|
||||
"gchange56": "Group Name To Search",
|
||||
"gchange57": "Private Group Name Not Found",
|
||||
"gchange58": "Note that group name must be an exact match.",
|
||||
"gchange59": "Show / Hide Ticker",
|
||||
"gchange60": "Please enter group name",
|
||||
"gchange61": "Please enter description",
|
||||
"gchange62": "Are you sure to UPDATE this group?",
|
||||
"gchange63": "On pressing CONFIRM, the UPDATE_GROUP request will be sent!",
|
||||
"gchange64": "Current Owner / New Owner",
|
||||
"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",
|
||||
"gchange69": "Messages",
|
||||
"gchange70": "No messages in the last 24 hours!",
|
||||
"gchange71": "You have already joined this group!"
|
||||
"gchange58": "Note that group name must exact match.",
|
||||
"gchange59": "Show / Hide Ticker"
|
||||
},
|
||||
"puzzlepage": {
|
||||
"pchange1": "Puzzles",
|
||||
@ -1002,7 +957,7 @@
|
||||
"nchange2": "Node has been online for:",
|
||||
"nchange3": "Node's minting accounts",
|
||||
"nchange4": "Add minting account",
|
||||
"nchange5": "If you would like to mint with your own account you will need to create a reward share transaction to yourself (with reward share percent set to 0), and then mint with the reward share key it gives you.",
|
||||
"nchange5": "If you would like to mint with your own account you will need to create a rewardshare transaction to yourself (with rewardshare percent set to 0), and then mint with the rewardshare key it gives you.",
|
||||
"nchange6": "Rewardshare key",
|
||||
"nchange7": "Adding minting account",
|
||||
"nchange8": "Add",
|
||||
@ -1010,8 +965,8 @@
|
||||
"nchange10": "Recipient Account",
|
||||
"nchange11": "Action",
|
||||
"nchange12": "Remove",
|
||||
"nchange13": "No minting accounts found for this Node",
|
||||
"nchange14": "Peers connected to this Node",
|
||||
"nchange13": "No minting accounts found for this node",
|
||||
"nchange14": "Peers connected to this node",
|
||||
"nchange15": "Add peer",
|
||||
"nchange16": "Type the peer you wish to add's address below",
|
||||
"nchange17": "Peer Address",
|
||||
@ -1031,16 +986,7 @@
|
||||
"nchange31": "Stop Node",
|
||||
"nchange32": "Successfully Sent Stop Request!",
|
||||
"nchange33": "Restart Node",
|
||||
"nchange34": "Successfully Sent Restart Request!",
|
||||
"nchange35": "Start Node",
|
||||
"nchange36": "Successfully Started Node!",
|
||||
"nchange37": "Clicking on continue will refresh your Qortal Core, your db will be removed, and you will download a new copy of the db, called “bootstrapping“.",
|
||||
"nchange38": "Repair LTC Wallet",
|
||||
"nchange39": "This will repair LTC wallets that show a balance that cannot be spent. It requires a single transaction to be made on the Litecoin network, after confirmation the wallet balance will be functional and the issue will not happen again.",
|
||||
"nchange40": "This transaction will consume a small LTC fee. Continue?",
|
||||
"nchange41": "Trying to repair. Please wait...",
|
||||
"nchange42": "Successfully Repaired LTC Wallet!",
|
||||
"nchange43": "Error occurred when trying to repair LTC wallet. Please try again!"
|
||||
"nchange34": "Successfully Sent Restart Request!"
|
||||
},
|
||||
"transpage": {
|
||||
"tchange1": "Transaction request",
|
||||
@ -1052,7 +998,7 @@
|
||||
"apipage": {
|
||||
"achange1": "Add API key",
|
||||
"achange2": "API key",
|
||||
"achange3": "Please enter the API key for this Node. It can be found in a file called “apikey.txt“ in the directory where the core is installed. Alternatively, click Cancel to use the core with reduced functionality.",
|
||||
"achange3": "Please enter the API key for this node. It can be found in a file called “apikey.txt“ in the directory where the core is installed. Alternatively, click Cancel to use the core with reduced functionality.",
|
||||
"achange4": "Cancel",
|
||||
"achange5": "Add",
|
||||
"achange6": "Successfully added API Key",
|
||||
@ -1072,19 +1018,13 @@
|
||||
"groupdialog6": "On pressing confirm, the group creating request will be sent!",
|
||||
"rewarddialog1": "Would you like to create a reward share transaction, sharing",
|
||||
"rewarddialog2": "of your minting rewards with",
|
||||
"rewarddialog3": "If yes, you will need to save the key below in order to mint. It can be supplied to any Node in order to allow it to mint on your behalf.",
|
||||
"rewarddialog4": "On pressing confirm, the reward share will be created, but you will still need to supply the above key to a Node in order to mint with the account.",
|
||||
"rewarddialog3": "If yes, you will need to save the key below in order to mint. It can be supplied to any node in order to allow it to mint on your behalf.",
|
||||
"rewarddialog4": "On pressing confirm, the rewardshare will be created, but you will still need to supply the above key to a node in order to mint with the account.",
|
||||
"rewarddialog5": "You are removing a reward share transaction associated with account:",
|
||||
"rewarddialog6": "On pressing confirm, the reward share will be removed and the minting key will become invalid.",
|
||||
"rewarddialog6": "On pressing confirm, the rewardshare will be removed and the minting key will become invalid.",
|
||||
"deployAtdialog1": "You are deploying the AT",
|
||||
"deployAtdialog2": "On pressing confirm, the AT will be deployed!",
|
||||
"deployAtdialog3": "Initial amount balance",
|
||||
"votedialog1": "You are requesting to vote on the poll below:",
|
||||
"votedialog2": "On pressing confirm, the vote request will be sent!",
|
||||
"votedialog3": "You are requesting to create the poll below:",
|
||||
"votedialog4": "Poll Description",
|
||||
"votedialog5": "Options",
|
||||
"votedialog6": "On pressing confirm, the poll will be created!"
|
||||
"deployAtdialog3": "Initial amount balance"
|
||||
},
|
||||
"sponsorshipspage": {
|
||||
"schange1": "Active Sponsorships",
|
||||
@ -1114,7 +1054,7 @@
|
||||
"exp2": "Account Balance",
|
||||
"exp3": "More Info",
|
||||
"exp4": "Address or Name not found!",
|
||||
"exp5": "Note that Registered Names are case-sensitive.",
|
||||
"exp5": "Note that registered names are case-sensitive.",
|
||||
"exp6": "Founder",
|
||||
"exp7": "Info",
|
||||
"exp8": "Show all buy trades",
|
||||
@ -1162,7 +1102,7 @@
|
||||
"mg25": "Banned Members",
|
||||
"mg26": "CANCEL BAN",
|
||||
"mg27": "Ban Expiry",
|
||||
"mg28": "Cancel Ban for Member From Group",
|
||||
"mg28": "Cancel Ban Member From Group",
|
||||
"mg29": "Are you sure to cancel the ban for this member from the group?",
|
||||
"mg30": "On pressing confirm, the cancel ban request will be sent!",
|
||||
"mg31": "Kick Member From Group",
|
||||
@ -1202,12 +1142,12 @@
|
||||
"inf2": "Close Trade Portal Info",
|
||||
"inf3": "This is a market to BUY QORT with",
|
||||
"inf4": "- 'open market sells' are QORT SELL ORDERS.",
|
||||
"inf5": "You can only buy ONE order at a time. Simply click an order that you wish to buy with",
|
||||
"inf5": "You can only buy ONE order at a time simply click an order that you wish to buy with",
|
||||
"inf6": "and it will populate the 'BUY QORT' box with the details, then click BUY.",
|
||||
"inf7": "Auto Buy Information",
|
||||
"inf8": "Close Auto Buy Info",
|
||||
"inf9": "'Auto Buy' is a feature that allows 'buy orders' to be placed on the Trade Portal. These 'buy orders' are only visible by the person placing them. They are not 'public' buy orders like the 'open market sells' are, and are NOT stored on the Qortal blockchain. Auto Buy is a UI feature, and as such requires that the UI is RUNNING.",
|
||||
"inf10": "To place an Auto Buy order click 'Add Auto Buy Order' button and fill out the box that comes up. Input the AMOUNT OF QORT you wish to BUY or the amount of LTC you wish to use, and the PRICE you are willing to BUY UP TO. Once the order is active, Auto Buy will buy UP TO that amount of QORT for you, at UP TO the price you set (starting at the lowest order and moving up the books.)",
|
||||
"inf10": "To place an Auto Buy order click 'Add Auto Buy Order' button and fill out the box that comes up. Input the AMOUNT OF QORT you wish to BUY, and the PRICE you are willing to BUY UP TO. Once the order is active, Auto Buy will buy UP TO that amount of QORT for you, at UP TO the price you set (starting at the lowest order and moving up the books.)",
|
||||
"inf11": "Simply LEAVE YOUR UI RUNNING and Auto Buy does the rest, automatically!",
|
||||
"inf12": "You CAN browse other plugins in the UI (Q-Chat, wallets, etc.) but you CANNOT CLOSE THE UI if you want your Auto Buy to complete. Leaving the UI 'minimized' on the 'taskbar' or 'panel' is just fine, as long as the UI remains OPEN Auto Buy will function.",
|
||||
"inf13": "Automatically buy",
|
||||
@ -1215,9 +1155,7 @@
|
||||
"inf15": "Active Auto Buy Orders",
|
||||
"inf16": "Auto Buy",
|
||||
"inf17": "Switch to light theme",
|
||||
"inf18": "Switch to dark theme",
|
||||
"inf19": "Trade Information",
|
||||
"inf20": "Buyer"
|
||||
"inf18": "Switch to dark theme"
|
||||
},
|
||||
"lotterypage": {
|
||||
"lot1": "Open Qortal Lotteries",
|
||||
@ -1237,97 +1175,6 @@
|
||||
"notifications": {
|
||||
"notify1": "Confirming transaction",
|
||||
"notify2": "Transaction confirmed",
|
||||
"explanation": "Your transaction is getting confirmed. To track its progress, click on the bell icon.",
|
||||
"status1": "Fully synced",
|
||||
"status2": "Not synced",
|
||||
"notify3": "No notifications",
|
||||
"notify4": "Tx notifications"
|
||||
},
|
||||
"friends": {
|
||||
"friend1": "Add name",
|
||||
"friend2": "Add friend",
|
||||
"friend3": "Adding a friend allows you to connect easily with that person. Be sure to also follow that user to support the hosting of their published resources.",
|
||||
"friend4": "Notes",
|
||||
"friend5": "Follow name",
|
||||
"friend6": "Alias",
|
||||
"friend7": "Add an alias to better remember your friend (Optional)",
|
||||
"friend8": "Send Q-Chat",
|
||||
"friend9": "Send Q-Mail",
|
||||
"friend10": "Edit friend",
|
||||
"friend11": "Following",
|
||||
"friend12": "Friends",
|
||||
"friend13": "Feed",
|
||||
"friend14": "Remove friend",
|
||||
"friend15": "Feed settings",
|
||||
"friend16": "Select the Q-Apps you want updates from, especially those related to your friends.",
|
||||
"friend17": "No items in your feed"
|
||||
},
|
||||
"save": {
|
||||
"saving1": "Unable to fetch saved settings",
|
||||
"saving2": "Nothing to save",
|
||||
"saving3": "Save unsaved changes",
|
||||
"saving4": "Undo changes"
|
||||
},
|
||||
"profile": {
|
||||
"profile1": "You do not have a name",
|
||||
"profile2": "Go to name registration",
|
||||
"profile3": "Update profile",
|
||||
"profile4": "Tagline",
|
||||
"profile5": "Bio",
|
||||
"profile6": "Wallet Addresses",
|
||||
"profile7": "Fill from UI",
|
||||
"profile8": "Add custom property",
|
||||
"profile9": "Property name",
|
||||
"profile10": "Fields",
|
||||
"profile11": "Add field",
|
||||
"profile12": "Field name",
|
||||
"profile13": "Field value",
|
||||
"profile14": "Activity",
|
||||
"profile15": "No value",
|
||||
"profile16": "This name has no profile",
|
||||
"profile17": "Unable to fetch profile",
|
||||
"profile18": "Open profile",
|
||||
"profile19": "Cannot fetch profile",
|
||||
"profile20": "Register name",
|
||||
"profile21": "Insert address from UI",
|
||||
"profile22": "Success",
|
||||
"profile23": "encrypted",
|
||||
"profile24": "You must fill out both field name and field value to add a custom property",
|
||||
"profile25": "Is your friend",
|
||||
"profile26": "Add as friend"
|
||||
},
|
||||
"tour": {
|
||||
"tour1": "In order to use Qortal, the Core must be synced. This icon will be in blue when it's synced.",
|
||||
"tour2": "Synced",
|
||||
"tour3": "Synced and minting",
|
||||
"tour4": "Syncing",
|
||||
"tour5": "Sync your core",
|
||||
"tour6": "The Unstoppable Force of Qortal",
|
||||
"tour7": "Only you control your data on Qortal",
|
||||
"tour8": "Qortal cannot be taken down",
|
||||
"tour9": "Completely peer-to-peer with no centralized intermediaries",
|
||||
"tour10": "This is the default tab view where you can access important Qortal settings and Q-apps such as Q-Tube.",
|
||||
"tour11": "Get the full experience",
|
||||
"tour12": "To get the full Qortal experience, we recommend following this checklist.",
|
||||
"tour13": "You are fully synced! You can now experience the power of the Qortal blockchain.",
|
||||
"tour14": "Let's try visiting Q-Tube!",
|
||||
"tour15": "Visit Q-Tube",
|
||||
"tour16": "Checklist",
|
||||
"tour17": "Please start the Core to access the Qortal blockchain.",
|
||||
"tour18": "Refresh (bootstrap)",
|
||||
"tour19": "Currently syncing... you must be fully synchronized to use Qortal.",
|
||||
"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"
|
||||
"explanation": "Your transaction is getting confirmed. To track its progress, click on the bell icon."
|
||||
}
|
||||
}
|
||||
}
|
@ -5,10 +5,8 @@
|
||||
"chinese1": "简体中文",
|
||||
"chinese2": "繁体中文",
|
||||
"croatian": "克罗地亚文",
|
||||
"dutch": "荷兰语",
|
||||
"english": "英文",
|
||||
"estonian": "爱沙尼亚文",
|
||||
"finnish": "芬兰语",
|
||||
"french": "法文",
|
||||
"german": "德文",
|
||||
"hindi": "印度文",
|
||||
@ -80,7 +78,7 @@
|
||||
"tm32": "该帐户没有关注任何用户",
|
||||
"tm33": "导入选项卡菜单",
|
||||
"tm34": "导出选项卡菜单",
|
||||
"tm35": "您现有的选项卡菜单将被删除并设置为导入的选项卡菜单。",
|
||||
"tm35": "您现有的选项卡菜单将被删除并设置为上传的选项卡菜单。",
|
||||
"tm36": "选项卡菜单恢复成功",
|
||||
"tm37": "选项卡菜单成功另存为",
|
||||
"tm38": "开发模式",
|
||||
@ -108,33 +106,33 @@
|
||||
"decrypt": "正在解密钱包备份文件",
|
||||
"save": "保存钱包,以便下次登入.",
|
||||
"prepare": "正在加载你的钱包",
|
||||
"areyousure": "您确定要从已保存的帐户中删除此帐户吗? (如果删除并且不存在备份文件,帐户可能会永远丢失!在执行此操作之前确保您有备份文件!",
|
||||
"areyousure": "你确定将此钱包在已保存钱包列表中删除吗?",
|
||||
"error1": "备份文件必须为有效的JSON格式文件",
|
||||
"error2": "请选择登入方式",
|
||||
"createwelcome": "欢迎来到Qortal! 您的去中心化数字未来正等待着您! 在 Qortal 上,只有您对您的数据拥有绝对的控制权。 Qortal 提供了一个新的、完全由用户控制的数字世界的基础水平。",
|
||||
"createwelcome": "欢迎来到Qortal,您会发现它类似于RPG 游戏,作为Qortal 网络上的铸币者(如果您选择成为其中的铸币者),您将有机会升级您的帐户,并随着等级提高而获得更多QORT 区块奖励以及参与平台上各种决策投票。",
|
||||
"createa": "你的",
|
||||
"click": "点击查看助记词",
|
||||
"confirmpass": "确认密码",
|
||||
"willbe": "将在后台随机生成。 如果您想查看种子短语,请单击本文中突出显示的“种子短语”。 这用作您在 Qortal 中的区块链帐户的私钥生成器。 为了安全起见,默认情况下,除非特别选择,否则不会显示助记词。",
|
||||
"willbe": "将在后台随机生成。 这将用作您在Qortal 中的区块链帐户的私人密钥。",
|
||||
"clicknext": " ▼▼▼点击下一步创建你的Qortal账号▼▼▼",
|
||||
"ready": "您的帐户现在已准备好创建。 默认情况下,它将以加密形式保存在 Qortal UI 的此副本中。 如果您不希望在此处保存您的新帐户,您可以取消选中下面的复选框。 您仍然可以使用新帐户登录(注销后),使用创建帐户后必须下载的钱包备份文件。",
|
||||
"ready": "您的帐户即将创建成功, 它将保存在此浏览器中。 如果您不希望将新帐户保存在浏览器中,可以取消勾选下面的选项。 您仍可透过使用创建帐户时载的钱包备份文件进行的登入。",
|
||||
"welmessage": "欢迎来到Qortal",
|
||||
"pleaseenter": "请密码!",
|
||||
"notmatch": "密码不一致!",
|
||||
"lessthen8": "你的密码长度少于5位! 我们不建议使用,但你仍可继续使用此密码。",
|
||||
"lessthen8-2": "你的密码长度少于5位!",
|
||||
"entername": "请输入显示名称!",
|
||||
"lessthen8": "你的密码长度少于8位! 我们不建议使用,但你仍可继续使用此密码。",
|
||||
"lessthen8-2": "你的密码长度少于8位!",
|
||||
"entername": "请输入一个代称",
|
||||
"downloaded": "你的钱包备份文件已顺利下载!",
|
||||
"loading": "加载中,请耐心等候...",
|
||||
"createdseed": "你已创建的助记词",
|
||||
"saveseed": "保存助记词",
|
||||
"savein": "保存在UI上",
|
||||
"backup2": "除非保存到 UI,否则此文件是访问您帐户的唯一方式(默认情况下)。 请务必在多个位置备份此文件。 该文件经过非常安全的加密,并使用您在上一步中创建的本地密码进行解密。 您可以将其安全地保存在任何地方,但请务必在多个位置执行此操作。",
|
||||
"savewallet": "保存 Qortal 备份文件",
|
||||
"backup2": "请小心保存钱包备份文件,并谨记之前设置好的密码。否则你将会失去这个钱包的所有控制权,请务必将备份文件放在不同的存储装置上",
|
||||
"savewallet": "下载并保存钱包备份文件",
|
||||
"created1": "你的账号已创建成功",
|
||||
"created2": "并以加密形式保存在此 UI 中。",
|
||||
"downloadbackup": "保存 Qortal 备份文件",
|
||||
"passwordhint": "密码必须至少为5 个字符。",
|
||||
"created2": "并会储存在UI上.",
|
||||
"downloadbackup": "下载钱包备份文件",
|
||||
"passwordhint": "密码必须至少为8 个字符。",
|
||||
"lp1": "锁定屏幕",
|
||||
"lp2": "未设置锁屏密码!",
|
||||
"lp3": "请设置一个",
|
||||
@ -164,7 +162,7 @@
|
||||
},
|
||||
"fragfile": {
|
||||
"selectfile": "选择文件",
|
||||
"dragfile": "拖放或单击此处选择备份文件"
|
||||
"dragfile": "将备份文件拖到此处"
|
||||
},
|
||||
"settings": {
|
||||
"generalinfo": "一般钱包信息",
|
||||
@ -181,8 +179,9 @@
|
||||
"notifications": "通知",
|
||||
"accountsecurity": "钱包安全性",
|
||||
"password": "密码",
|
||||
"download": "导出/保存 Qortal 备份文件",
|
||||
"download": "下载备份文件",
|
||||
"choose": "请输入一组密码加密你的备份文件。(可使用你刚才登入时的相同密码或者不同的密码)",
|
||||
"block": "区块通知(即将推出...)",
|
||||
"playsound": "开启音效",
|
||||
"shownotifications": "显示通知",
|
||||
"nodeurl": "节点地址",
|
||||
@ -192,8 +191,8 @@
|
||||
"protocol": "协议",
|
||||
"domain": "域名",
|
||||
"port": "端口",
|
||||
"import": "导入已保存的节点",
|
||||
"export": "导出保存的节点",
|
||||
"import": "导入节点",
|
||||
"export": "导出节点",
|
||||
"deletecustomnode": "删除所有自定义节点",
|
||||
"warning": "您现有的节点将被删除并从备份中创建新的。",
|
||||
"snack1": "成功删除和添加标准节点",
|
||||
@ -201,20 +200,12 @@
|
||||
"snack3": "成功添加并保存自定义节点",
|
||||
"snack4": "节点成功保存为",
|
||||
"snack5": "节点成功导入",
|
||||
"snack6": "成功删除自定义节点",
|
||||
"snack7": "自定义节点编辑成功",
|
||||
"exp1": "导出主私钥 (xpriv)",
|
||||
"exp1": "导出主密钥",
|
||||
"exp2": "导出主密钥",
|
||||
"exp3": "导出",
|
||||
"exp4": "请选择一个钱包来备份私钥。",
|
||||
"core": "Qortal Core 自动启动设置",
|
||||
"qappNotification1": "Q-App 通知",
|
||||
"selectnode": "请选择一个选项",
|
||||
"arrr1": "ARRR 钱包未初始化!",
|
||||
"arrr2": "请先进入“钱包”选项卡并访问 ARRR 钱包以初始化钱包。",
|
||||
"arrr3": "需要核心更新!",
|
||||
"arrr4": "要保存 ARRR 钱包的私钥,您必须首先更新 Qortal Core!",
|
||||
"sync_indicator": "禁用同步指示器弹出窗口"
|
||||
"core": "开始核心设置",
|
||||
"qappNotification1": "Q-App 通知"
|
||||
},
|
||||
"appinfo": {
|
||||
"blockheight": "区块高度",
|
||||
@ -248,9 +239,7 @@
|
||||
"balance": "余额",
|
||||
"balances": "您的钱包余额",
|
||||
"update": "更新钱包余额",
|
||||
"view": "看法",
|
||||
"all": "全部",
|
||||
"page": "页"
|
||||
"view": "看法"
|
||||
},
|
||||
"gifs": {
|
||||
"gchange1": "Gif 浏览器",
|
||||
@ -285,8 +274,8 @@
|
||||
},
|
||||
"startminting": {
|
||||
"smchange1": "无法获取铸币帐户",
|
||||
"smchange2": "无法删除 Minting 密钥",
|
||||
"smchange3": "无法添加 Minting key,如果刚刚创建 key,请尝试等待几个块并再次添加",
|
||||
"smchange2": "无法移除密钥",
|
||||
"smchange3": "添加铸币密钥失败",
|
||||
"smchange4": "无法创建赞助密钥",
|
||||
"smchange5": "建立关系",
|
||||
"smchange6": "等待区块链确认",
|
||||
@ -405,8 +394,7 @@
|
||||
"wchange55": "您现有的通讯簿将被删除并从新创建的备份中。",
|
||||
"wchange56": "警告!",
|
||||
"wchange57": "备忘录",
|
||||
"wchange58": "新的钱包地址",
|
||||
"wchange59": "硬币"
|
||||
"wchange58": "新的钱包地址"
|
||||
},
|
||||
"tradepage": {
|
||||
"tchange1": "交易门户",
|
||||
@ -509,7 +497,7 @@
|
||||
"nchange23": "卖出价",
|
||||
"nchange24": "没有名字可以卖",
|
||||
"nchange25": "出售名称",
|
||||
"nchange26": "您确定要出售这个名字吗? 如果名称被其他帐户购买,则将不受您的控制!",
|
||||
"nchange26": "你确定要卖这个名字吗?",
|
||||
"nchange27": "对于QORT 中的这个价格",
|
||||
"nchange28": "按下确认后,将发送销售名称请求!",
|
||||
"nchange29": "要取消的名称",
|
||||
@ -530,8 +518,7 @@
|
||||
"nchange44": "改成新名字",
|
||||
"nchange45": "按下确认后,将发送名称更新请求!",
|
||||
"nchange46": "命名销售历史",
|
||||
"nchange47": "名称更新成功!",
|
||||
"nchange48": "警告!如果您更新名称,您将失去与原名称相关的资源。换句话说,您将失去对 QDN 中原名称下的内容的所有权。请谨慎操作!"
|
||||
"nchange47": "名称更新成功!"
|
||||
},
|
||||
"websitespage": {
|
||||
"schange1": "浏览网站",
|
||||
@ -612,8 +599,7 @@
|
||||
"schange39": "打开",
|
||||
"schange40": "预览",
|
||||
"schange41": "下载中请稍候...",
|
||||
"schange42": "文件已下载",
|
||||
"schange43": "任何尝试的下载都将在后台继续,请稍后重试。"
|
||||
"schange42": "文件已下载"
|
||||
},
|
||||
"tubespage": {
|
||||
"schange1": "浏览 Q-Tubes",
|
||||
@ -735,14 +721,7 @@
|
||||
"bchange44": "您授予此应用程序从列表中删除的权限吗?",
|
||||
"bchange45": "加密",
|
||||
"bchange46": "您是否授予此应用程序保存以下文件的权限",
|
||||
"bchange47": "即时发布 - 需要",
|
||||
"bchange48": "您是否授予此应用程序向您发送通知的权限",
|
||||
"bchange49": "您是否授予此应用程序获取您的钱包信息的权限?",
|
||||
"bchange50": "此应用已请求更改您的公开个人资料。属性:",
|
||||
"bchange51": "要提交更改,请不要忘记单击“更新个人资料”",
|
||||
"bchange52": "您是否授予此应用程序获取您的钱包信息的权限?",
|
||||
"bchange53": "始终允许所有应用自动检索您的好友列表",
|
||||
"bchange54": "您是否授予此应用程序访问您的好友列表的权限?"
|
||||
"bchange47": "即时发布 - 需要"
|
||||
},
|
||||
"datapage": {
|
||||
"dchange1": "资料管理",
|
||||
@ -842,37 +821,13 @@
|
||||
"cchange74": "心情回应",
|
||||
"cchange75": "上传附件。这可能需要一分钟。",
|
||||
"cchange76": "正在删除附件。这可能需要一分钟。",
|
||||
"cchange77": "附件大小超过 10 MB",
|
||||
"cchange77": "附件大小超过 1 MB",
|
||||
"cchange78": "你确定要删除这张图片吗?",
|
||||
"cchange79": "你确定要删除这个附件吗?",
|
||||
"cchange80": "这张图片已被删除",
|
||||
"cchange81": "不支持这种图片类型",
|
||||
"cchange82": "该附件已被删除",
|
||||
"cchange90": "没有消息",
|
||||
"cchange91": "正在发送...",
|
||||
"cchange92": "下面未读消息",
|
||||
"cchange93": "图像已复制到剪贴板",
|
||||
"cchange94": "已加载",
|
||||
"cchange95": "只有我的资源",
|
||||
"cchange96": "打开群组管理",
|
||||
"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": "写点东西 ..."
|
||||
"cchange90": "没有消息"
|
||||
},
|
||||
"welcomepage": {
|
||||
"wcchange1": "欢迎来到Q-Chat",
|
||||
@ -964,19 +919,7 @@
|
||||
"gchange56": "要搜索的群组名称",
|
||||
"gchange57": "未找到私人群组名称",
|
||||
"gchange58": "注意群组名称必须完全匹配。",
|
||||
"gchange59": "显示/隐藏代码",
|
||||
"gchange60": "请输入组名",
|
||||
"gchange61": "请输入描述",
|
||||
"gchange62": "你确定要更新这个组吗?",
|
||||
"gchange63": "按 CONFIRM 后,将发送UPDATE_GROUP请求!",
|
||||
"gchange64": "当前所有者/新所有者",
|
||||
"gchange65": "将此地址替换为组的 TRANSFER OWNERSHIP!",
|
||||
"gchange66": "无效的所有者/新所有者地址",
|
||||
"gchange67": "组更新成功!",
|
||||
"gchange68": "设置组头像",
|
||||
"gchange69": "消息",
|
||||
"gchange70": "过去 24 小时内没有消息!",
|
||||
"gchange71": "您已经加入此群组!"
|
||||
"gchange59": "显示/隐藏代码"
|
||||
},
|
||||
"puzzlepage": {
|
||||
"pchange1": "益智游戏",
|
||||
@ -1031,16 +974,7 @@
|
||||
"nchange31": "关闭节点",
|
||||
"nchange32": "成功发送关闭节点请求!",
|
||||
"nchange33": "重启节点",
|
||||
"nchange34": "成功发送重启节点请求!",
|
||||
"nchange35": "启动节点",
|
||||
"nchange36": "节点启动成功!",
|
||||
"nchange37": "点击继续将刷新您的 Qortal Core,您的数据库将被删除,您将下载数据库的新副本,称为 bootstrapping。",
|
||||
"nchange38": "修复 LTC 钱包",
|
||||
"nchange39": "这将修复显示余额无法使用的 LTC 钱包。它需要在莱特币网络上进行单笔交易,确认后钱包余额将起作用,并且问题不会再次发生。",
|
||||
"nchange40": "此交易将消耗少量LTC费用。是否继续?",
|
||||
"nchange41": "正在尝试修复。请稍候...",
|
||||
"nchange42": "LTC钱包修复成功!",
|
||||
"nchange43": "尝试修复 LTC 钱包时发生错误。请重试!"
|
||||
"nchange34": "成功发送重启节点请求!"
|
||||
},
|
||||
"transpage": {
|
||||
"tchange1": "请求交易",
|
||||
@ -1075,16 +1009,7 @@
|
||||
"rewarddialog3": "如果是的话,请保存下面的铸币密钥并添加到任何节点上,以允许它代表您铸币.",
|
||||
"rewarddialog4": "点击确认后,铸币密钥将会创建,但你必须将该密钥添加到节点中才能成功铸币并获得相对应的奖励.",
|
||||
"rewarddialog5": "您正在删除与此账号关联的铸币密钥:",
|
||||
"rewarddialog6": "点击确认后,铸币密钥将被移除并失效。",
|
||||
"deployAtdialog1": "您正在部署 AT",
|
||||
"deployAtdialog2": "按下确认键后,AT 将被部署!",
|
||||
"deployAtdialog3": "初始金额余额",
|
||||
"votedialog1": "您请求对以下民意调查进行投票:",
|
||||
"votedialog2": "按下确认后,投票请求将被发送!",
|
||||
"votedialog3": "您请求创建以下投票:",
|
||||
"votedialog4": "投票说明",
|
||||
"votedialog5": "选项",
|
||||
"votedialog6": "按确认后,将创建投票!"
|
||||
"rewarddialog6": "点击确认后,铸币密钥将被移除并失效。"
|
||||
},
|
||||
"sponsorshipspage": {
|
||||
"schange1": "目前有效的赞助记录",
|
||||
@ -1215,9 +1140,7 @@
|
||||
"inf15": "有效的自动购买订单",
|
||||
"inf16": "自动购买",
|
||||
"inf17": "切换到浅色主题",
|
||||
"inf18": "切换到深色主题",
|
||||
"inf19": "贸易信息",
|
||||
"inf20": "买家"
|
||||
"inf18": "切换到深色主题"
|
||||
},
|
||||
"lotterypage": {
|
||||
"lot1": "开放 Qortal 彩票",
|
||||
@ -1233,101 +1156,5 @@
|
||||
"lot11": "没有公开抽奖!",
|
||||
"lot12": "没有完成的彩票!",
|
||||
"lot13": "玩家"
|
||||
},
|
||||
"notifications": {
|
||||
"notify1": "确认交易",
|
||||
"notify2": "交易已确认",
|
||||
"explanation": "您的交易正在得到确认。要跟踪其进度,请单击响铃图标。",
|
||||
"status1": "完全同步",
|
||||
"status2": "未同步",
|
||||
"notify3": "无通知",
|
||||
"notify4": "发送通知"
|
||||
},
|
||||
"friends": {
|
||||
"friend1": "添加姓名",
|
||||
"friend2": "添加好友",
|
||||
"friend3": "添加好友可以让您轻松地与该人联系。 请务必关注该用户以支持其已发布资源的托管。",
|
||||
"friend4": "笔记",
|
||||
"friend5": "关注姓名",
|
||||
"friend6": "别名",
|
||||
"friend7": "添加别名以更好地记住您的朋友(可选)",
|
||||
"friend8": "发送 Q 聊天",
|
||||
"friend9": "发送 Q 邮件",
|
||||
"friend10": "编辑好友",
|
||||
"friend11": "下列的",
|
||||
"friend12": "朋友们",
|
||||
"friend13": "喂养",
|
||||
"friend14": "删除好友",
|
||||
"friend15": "饲料设置",
|
||||
"friend16": "选择您想要更新的 Q-App,尤其是与您的朋友相关的 Q-App。",
|
||||
"friend17": "您的 Feed 中没有任何项目"
|
||||
},
|
||||
"save": {
|
||||
"saving1": "无法获取保存的设置",
|
||||
"saving2": "没有什么可保存的",
|
||||
"saving3": "保存未保存的更改",
|
||||
"saving4": "取消更改"
|
||||
},
|
||||
"profile": {
|
||||
"profile1": "你没有名字",
|
||||
"profile2": "前往姓名注册",
|
||||
"profile3": "更新个人资料",
|
||||
"profile4": "标语",
|
||||
"profile5": "个人简介",
|
||||
"profile6": "钱包地址",
|
||||
"profile7": "从用户界面填写",
|
||||
"profile8": "添加自定义属性",
|
||||
"profile9": "属性名称",
|
||||
"profile10": "字段",
|
||||
"profile11": "添加字段",
|
||||
"profile12": "字段名称",
|
||||
"profile13": "字段值",
|
||||
"profile14": "活动",
|
||||
"profile15": "无值",
|
||||
"profile16": "该名字没有个人资料",
|
||||
"profile17": "无法获取个人资料",
|
||||
"profile18": "打开个人资料",
|
||||
"profile19": "无法获取个人资料",
|
||||
"profile20": "注册名称",
|
||||
"profile21": "从 UI 插入地址",
|
||||
"profile22": "成功",
|
||||
"profile23": "加密",
|
||||
"profile24": "您必须填写字段名称和字段值才能添加自定义属性",
|
||||
"profile25": "是你的朋友",
|
||||
"profile26": "添加为好友"
|
||||
},
|
||||
"tour": {
|
||||
"tour1": "为了使用 Qortal,Core 必须同步。同步时该图标将呈蓝色。",
|
||||
"tour2": "已同步",
|
||||
"tour3": "同步并铸造",
|
||||
"tour4": "正在同步",
|
||||
"tour5": "同步你的核心",
|
||||
"tour6": "Qortal 不可阻挡的力量",
|
||||
"tour7": "只有您可以控制 Qortal 上的数据",
|
||||
"tour8": "Qortal 无法被拿下",
|
||||
"tour9": "完全点对点,没有中心化中介",
|
||||
"tour10": "这是默认选项卡视图,您可以在其中访问重要的 Qortal 设置和 Q-app,例如 Q-Tube。",
|
||||
"tour11": "获得完整体验",
|
||||
"tour12": "要获得完整的 Qortal 体验,我们建议遵循此清单。",
|
||||
"tour13": "您已完全同步!您现在可以体验 Qortal 区块链的强大功能了。",
|
||||
"tour14": "让我们尝试参观 Q-Tube!",
|
||||
"tour15": "参观 Q-Tube",
|
||||
"tour16": "清单",
|
||||
"tour17": "请启动Core以访问Qortal区块链。",
|
||||
"tour18": "刷新(引导程序)",
|
||||
"tour19": "当前正在同步...您必须完全同步才能使用 Qortal",
|
||||
"tour20": "落后了。您想刷新(引导)以加快同步过程吗?",
|
||||
"tour21": "剩余块数。",
|
||||
"tour22": "已请求刷新(引导)。请稍候。"
|
||||
},
|
||||
"chatsettings": {
|
||||
"cs1": "聊天设置",
|
||||
"cs2": "常规聊天设置",
|
||||
"cs3": "聊天消息时间戳",
|
||||
"cs4": "时间前",
|
||||
"cs5": "当地时间",
|
||||
"cs6": "聊天消息字体大小",
|
||||
"cs7": "标准",
|
||||
"cs8": "px"
|
||||
}
|
||||
}
|
||||
}
|
@ -5,10 +5,8 @@
|
||||
"chinese1": "簡體中文",
|
||||
"chinese2": "繁體中文",
|
||||
"croatian": "克羅地亞文",
|
||||
"dutch": "荷蘭語",
|
||||
"english": "英文",
|
||||
"estonian": "愛沙尼亞文",
|
||||
"finnish": "芬蘭語",
|
||||
"french": "法文",
|
||||
"german": "德文",
|
||||
"hindi": "印度文",
|
||||
@ -80,7 +78,7 @@
|
||||
"tm32": "該帳戶沒有關注任何用戶",
|
||||
"tm33": "導入選項卡菜單",
|
||||
"tm34": "導出選項卡菜單",
|
||||
"tm35": "您现有的选项卡菜单将被删除并设置为导入的选项卡菜单。",
|
||||
"tm35": "您現有的選項卡菜單將被刪除並設置為上傳的選項卡菜單。",
|
||||
"tm36": "選項卡菜單恢復成功",
|
||||
"tm37": "選項卡菜單成功另存為",
|
||||
"tm38": "開發模式",
|
||||
@ -98,7 +96,7 @@
|
||||
"youraccounts": "你的錢包",
|
||||
"clickto": "點擊你的錢包進行登錄",
|
||||
"needcreate": "你必須創建或保存錢包才能登入!",
|
||||
"upload": "匯入您的 Qortal 備份文件",
|
||||
"upload": "上傳你的Qortal錢包備份文件",
|
||||
"howlogin": "你想透過下列哪種方式登入?",
|
||||
"seed": "助記詞",
|
||||
"seedphrase": "助記詞",
|
||||
@ -108,33 +106,33 @@
|
||||
"decrypt": "正在解密錢包備份文件",
|
||||
"save": "保存錢包,以便下次登入.",
|
||||
"prepare": "正在加載你的錢包",
|
||||
"areyousure": "您確定要從已儲存的帳戶中刪除此帳戶嗎? (如果刪除並且不存在備份文件,帳戶可能會永遠丟失!在執行此操作之前確保您有備份文件!)",
|
||||
"areyousure": "你確定將此錢包在已保存錢包列表中刪除嗎?",
|
||||
"error1": "備份文件必須為有效的JSON格式文件",
|
||||
"error2": "請選擇登入方式",
|
||||
"createwelcome": "歡迎來到Qortal! 您的去中心化數位未來正等著您! 在 Qortal 上,只有您對您的資料擁有絕對的控制權。 Qortal 提供了一個新的、完全由使用者控制的數位世界的基礎水準。",
|
||||
"createwelcome": "歡迎來到 Qortal,您會發現它類似於 RPG 遊戲,作為 Qortal 網絡上的鑄幣者(如果您選擇成為其中的鑄幣者),您將有機會升級您的帳戶,並隨著等級提高而獲得更多 QORT 區塊獎勵以及參與平台上各種決策投票。",
|
||||
"createa": "你的",
|
||||
"click": "點擊查看助記詞",
|
||||
"confirmpass": "確認密碼",
|
||||
"willbe": "將在後台隨機產生。 如果您想查看種子短語,請點擊本文中突出顯示的「種子短語」。 這用作您在 Qortal 中的區塊鏈帳戶的私鑰產生器。 為了安全起見,預設情況下,除非特別選擇,否則不會顯示助記詞。",
|
||||
"willbe": "將在後台隨機生成。 這將用作您在 Qortal 中的區塊鏈帳戶的私人密鑰。",
|
||||
"clicknext": "▼▼▼點擊下一步創建你的Qortal賬號▼▼▼",
|
||||
"ready": "您的帳戶現在已準備好建立。 預設情況下,它將以加密形式保存在 Qortal UI 的此副本中。 如果您不希望在此處儲存您的新帳戶,您可以取消選取下面的複選框。 您仍然可以使用新帳戶登入(登出後),使用建立帳戶後必須下載的錢包備份檔案。",
|
||||
"ready": "您的帳戶即將創建成功, 它將保存在此瀏覽器中。 如果您不希望將新帳戶保存在瀏覽器中,可以取消勾選下面的選項。 您仍可透過使用創建帳戶時載的錢包備份文件進行的登入。",
|
||||
"welmessage": "歡迎來到 Qortal",
|
||||
"pleaseenter": "請密碼!",
|
||||
"notmatch": "密碼不一致!",
|
||||
"lessthen8": "你的密碼長度少於5位! 我們不建議使用,但你仍可繼續使用此密碼。",
|
||||
"lessthen8-2": "你的密碼長度少於5位!",
|
||||
"lessthen8": "你的密碼長度少於8位! 我們不建議使用,但你仍可繼續使用此密碼。",
|
||||
"lessthen8-2": "你的密碼長度少於8位!",
|
||||
"entername": "請輸入一個代稱",
|
||||
"downloaded": "你的錢包備份文件已順利下載!",
|
||||
"loading": "加載中,請耐心等候...",
|
||||
"createdseed": "你已創建的助記詞",
|
||||
"saveseed": "保存助記詞",
|
||||
"savein": "保存在UI上",
|
||||
"backup2": "除非儲存到 UI,否則此文件是存取您帳戶的唯一方式(預設)。 請務必在多個位置備份此文件。 該檔案經過非常安全的加密,並使用您在上一個步驟中建立的本機密碼進行解密。 您可以將其安全地保存在任何地方,但請務必在多個位置執行此操作。",
|
||||
"backup2": "請小心保存錢包備份文件,並謹記之前設置好的密碼。否則你將會失去這個錢包的所有控制權,請務必將備份文件放在不同的存儲裝置上",
|
||||
"savewallet": "下載並保存錢包備份文件",
|
||||
"created1": "你的賬號已創建成功",
|
||||
"created2": "並以加密形式儲存在此 UI 中。",
|
||||
"downloadbackup": "保存 Qortal 備份文件",
|
||||
"passwordhint": "密碼必須至少為 5 個字符。",
|
||||
"created2": " 並會儲存在UI上.",
|
||||
"downloadbackup": "下載錢包備份文件",
|
||||
"passwordhint": "密碼必須至少為 8 個字符。",
|
||||
"lp1": "鎖定屏幕",
|
||||
"lp2": "未設置鎖屏密碼!",
|
||||
"lp3": "請設置一個",
|
||||
@ -163,8 +161,8 @@
|
||||
"confirmlogout": "你確定登出嗎?"
|
||||
},
|
||||
"fragfile": {
|
||||
"selectfile": "選擇 Qortal 備份文件",
|
||||
"dragfile": "拖放或點擊此處選擇備份文件"
|
||||
"selectfile": "選擇文件",
|
||||
"dragfile": "將備份文件拖到此處"
|
||||
},
|
||||
"settings": {
|
||||
"generalinfo": "一般錢包信息",
|
||||
@ -183,6 +181,7 @@
|
||||
"password": "密碼",
|
||||
"download": "下載備份文件",
|
||||
"choose": "請輸入一組密碼加密你的備份文件。(可使用你剛才登入時的相同密碼或者不同的密碼)",
|
||||
"block": "區塊通知(即將推出...)",
|
||||
"playsound": "開啓音效",
|
||||
"shownotifications": "顯示通知",
|
||||
"nodeurl": "節點地址",
|
||||
@ -192,8 +191,8 @@
|
||||
"protocol": "協議",
|
||||
"domain": "域名",
|
||||
"port": "端口",
|
||||
"import": "導入已儲存的節點",
|
||||
"export": "導出已儲存的節點",
|
||||
"import": "導入節點",
|
||||
"export": "導出節點",
|
||||
"deletecustomnode": "刪除所有自定義節點",
|
||||
"warning": "您現有的節點將被刪除並從備份中創建新的。",
|
||||
"snack1": "成功刪除和添加標準節點",
|
||||
@ -201,20 +200,12 @@
|
||||
"snack3": "成功添加並保存自定義節點",
|
||||
"snack4": "節點成功保存為",
|
||||
"snack5": "節點成功導入",
|
||||
"snack6": "成功刪除自訂節點",
|
||||
"snack7": "自訂節點編輯成功",
|
||||
"exp1": "匯出主私鑰 (xpriv)",
|
||||
"exp1": "導出主密鑰",
|
||||
"exp2": "導出主密鑰",
|
||||
"exp3": "導出",
|
||||
"exp4": "請選擇一個錢包來備份私鑰。",
|
||||
"core": "Qortal Core 自動啟動設定",
|
||||
"qappNotification1": "Q-App 通知",
|
||||
"selectnode": "請選擇一個選項",
|
||||
"arrr1": "ARRR 錢包未初始化!",
|
||||
"arrr2": "請先進入錢包並訪問 ARRR 錢包來初始化錢包",
|
||||
"arrr3": "需要核心更新!",
|
||||
"arrr4": "要保存 ARRR 錢包的私鑰,您必須先更新 Qortal Core!",
|
||||
"sync_indicator": "停用同步指示器彈出視窗"
|
||||
"core": "開始核心設置",
|
||||
"qappNotification1": "Q-App 通知"
|
||||
},
|
||||
"appinfo": {
|
||||
"blockheight": "區塊高度",
|
||||
@ -248,9 +239,7 @@
|
||||
"balance": "餘額",
|
||||
"balances": "您的錢包餘額",
|
||||
"update": "更新錢包餘額",
|
||||
"view": "看法",
|
||||
"all": "全部",
|
||||
"page": "頁"
|
||||
"view": "看法"
|
||||
},
|
||||
"gifs": {
|
||||
"gchange1": "Gif 瀏覽器",
|
||||
@ -285,8 +274,8 @@
|
||||
},
|
||||
"startminting": {
|
||||
"smchange1": "無法獲取鑄幣帳戶",
|
||||
"smchange2": "無法刪除鑄造金鑰",
|
||||
"smchange3": "無法添加鑄造密鑰,如果剛剛創建密鑰,請嘗試等待幾個塊並再次添加",
|
||||
"smchange2": "無法移除密鑰",
|
||||
"smchange3": "添加鑄幣密鑰失敗",
|
||||
"smchange4": "無法創建贊助密鑰",
|
||||
"smchange5": "建立關係",
|
||||
"smchange6": "等待區塊鏈確認",
|
||||
@ -405,8 +394,7 @@
|
||||
"wchange55": "您現有的通訊簿將被刪除並從新創建的備份中。",
|
||||
"wchange56": "警告!",
|
||||
"wchange57": "備忘錄",
|
||||
"wchange58": "新的錢包地址",
|
||||
"wchange59": "硬幣"
|
||||
"wchange58": "新的錢包地址"
|
||||
},
|
||||
"tradepage": {
|
||||
"tchange1": "交易門戶",
|
||||
@ -509,7 +497,7 @@
|
||||
"nchange23": "賣出價",
|
||||
"nchange24": "沒有名字可以賣",
|
||||
"nchange25": "出售名稱",
|
||||
"nchange26": "您確定要出售這個名字嗎? 如果名稱被其他帳戶購買,則將不受您的控制!",
|
||||
"nchange26": "你確定要賣這個名字嗎?",
|
||||
"nchange27": "對於 QORT 中的這個價格",
|
||||
"nchange28": "按下確認後,將發送銷售名稱請求!",
|
||||
"nchange29": "要取消的名稱",
|
||||
@ -530,8 +518,7 @@
|
||||
"nchange44": "改成新名字",
|
||||
"nchange45": "按下確認後,將發送名稱更新請求!",
|
||||
"nchange46": "命名銷售歷史",
|
||||
"nchange47": "名稱更新成功!",
|
||||
"nchange48": "警告!如果您更新名稱,您將失去與原始名稱相關的資源。換句話說,您將失去對 QDN 中原始名稱下的內容的所有權。請謹慎操作!"
|
||||
"nchange47": "名稱更新成功!"
|
||||
},
|
||||
"websitespage": {
|
||||
"schange1": "瀏覽網站",
|
||||
@ -612,8 +599,7 @@
|
||||
"schange39": "打開",
|
||||
"schange40": "預覽",
|
||||
"schange41": "下載中請稍候...",
|
||||
"schange42": "文件已下載",
|
||||
"schange43": "任何嘗試的下載都會在背景繼續,請稍後重試。"
|
||||
"schange42": "文件已下載"
|
||||
},
|
||||
"tubespage": {
|
||||
"schange1": "瀏覽 Q-Tubes",
|
||||
@ -735,14 +721,7 @@
|
||||
"bchange44": "您授予此應用程序從列表中刪除的權限嗎?",
|
||||
"bchange45": "加密",
|
||||
"bchange46": "您是否授予此應用程序保存以下文件的權限",
|
||||
"bchange47": "即時發布 - 需要",
|
||||
"bchange48": "您是否授予此應用程式向您發送通知的權限",
|
||||
"bchange49": "您是否授予此應用程式以取得您的錢包資訊的權限?",
|
||||
"bchange50": "此應用程式已要求更改您的公開個人資料。屬性:",
|
||||
"bchange51": "要提交更改,請不要忘記點擊「更新個人資料」",
|
||||
"bchange52": "您是否授予此應用程式取得您的錢包資訊的權限?",
|
||||
"bchange53": "始終允許所有應用程式自動檢索您的好友清單",
|
||||
"bchange54": "您是否授予此應用程式存取您的好友清單的權限?"
|
||||
"bchange47": "即時發布 - 需要"
|
||||
},
|
||||
"datapage": {
|
||||
"dchange1": "資料管理",
|
||||
@ -842,37 +821,13 @@
|
||||
"cchange74": "心情回應",
|
||||
"cchange75": "上傳附件。這可能需要一分鐘。",
|
||||
"cchange76": "正在刪除附件。這可能需要一分鐘。",
|
||||
"cchange77": "附件大小超過 10 MB",
|
||||
"cchange77": "附件大小超過 1 MB",
|
||||
"cchange78": "你確定要刪除這張圖片嗎?",
|
||||
"cchange79": "你確定要刪除這個附件嗎?",
|
||||
"cchange80": "這張圖片已被刪除",
|
||||
"cchange81": "不支持這種圖片類型",
|
||||
"cchange82": "該附件已被刪除",
|
||||
"cchange90": "沒有消息",
|
||||
"cchange91": "正在發送...",
|
||||
"cchange92": "下面未讀訊息",
|
||||
"cchange93": "影像已複製到剪貼簿",
|
||||
"cchange94": "已載入",
|
||||
"cchange95": "只有我的資源",
|
||||
"cchange96": "開啟群組管理",
|
||||
"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": "寫點東西 ..."
|
||||
"cchange90": "沒有消息"
|
||||
},
|
||||
"welcomepage": {
|
||||
"wcchange1": "歡迎來到 Q-Chat",
|
||||
@ -964,19 +919,7 @@
|
||||
"gchange56": "要搜索的群組名稱",
|
||||
"gchange57": "未找到私人群組名稱",
|
||||
"gchange58": "注意群組名稱必須完全匹配。",
|
||||
"gchange59": "顯示/隱藏代碼",
|
||||
"gchange60": "請輸入組名",
|
||||
"gchange61": "請輸入描述",
|
||||
"gchange62": "你確定要更新這個組嗎?",
|
||||
"gchange63": "按 CONFIRM 後,將發送UPDATE_GROUP請求!",
|
||||
"gchange64": "當前擁有者/新擁有者",
|
||||
"gchange65": "將此位址替換為組的 TRANSFER OWNERSHIP!",
|
||||
"gchange66": "無效的擁有者/新擁有者位址",
|
||||
"gchange67": "組更新成功!",
|
||||
"gchange68": "設置組頭像",
|
||||
"gchange69": "訊息",
|
||||
"gchange70": "過去 24 小時內沒有訊息!",
|
||||
"gchange71": "你已經加入這個群組了!"
|
||||
"gchange59": "顯示/隱藏代碼"
|
||||
},
|
||||
"puzzlepage": {
|
||||
"pchange1": "益智游戲",
|
||||
@ -1031,16 +974,7 @@
|
||||
"nchange31": "關閉節點",
|
||||
"nchange32": "成功發送關閉節點請求!",
|
||||
"nchange33": "重啟節點",
|
||||
"nchange34": "成功發送重啟節點請求!",
|
||||
"nchange35": "啟動節點",
|
||||
"nchange36": "節點啟動成功!",
|
||||
"nchange37": "點擊繼續將刷新您的 Qortal Core,您的資料庫將被刪除,您將下載資料庫的新副本,稱為 bootstrapping。",
|
||||
"nchange38": "修復 LTC 錢包",
|
||||
"nchange39": "這將修復顯示餘額無法使用的 LTC 錢包。它需要在萊特幣網絡上進行單筆交易,確認後錢包餘額將起作用,並且問題不會再次發生。",
|
||||
"nchange40": "此交易將消耗少量LTC費用。是否繼續?",
|
||||
"nchange41": "正在嘗試修復。請稍候...",
|
||||
"nchange42": "LTC錢包修復成功!",
|
||||
"nchange43": "嘗試修復 LTC 錢包時發生錯誤。請重試!"
|
||||
"nchange34": "成功發送重啟節點請求!"
|
||||
},
|
||||
"transpage": {
|
||||
"tchange1": "請求交易",
|
||||
@ -1075,16 +1009,7 @@
|
||||
"rewarddialog3": "如果是的話,請保存下面的鑄幣密鑰並添加到任何節點上,以允許它代表您鑄幣.",
|
||||
"rewarddialog4": "點擊確認後,鑄幣密鑰將會創建,但你必須將該密鑰添加到節點中才能成功鑄幣並獲得相對應的獎勵.",
|
||||
"rewarddialog5": "您正在刪除與此賬號關聯的鑄幣密鑰:",
|
||||
"rewarddialog6": "點擊確認後,鑄幣密鑰將被移除並失效。",
|
||||
"deployAtdialog1": "您正在部署 AT",
|
||||
"deployAtdialog2": "按下確認鍵後,AT 將被部署!",
|
||||
"deployAtdialog3": "初始金額餘額",
|
||||
"votedialog1": "您要求對以下民意調查進行投票:",
|
||||
"votedialog2": "按下確認後,投票請求將被發送!",
|
||||
"votedialog3": "您請求建立以下投票:",
|
||||
"votedialog4": "投票說明",
|
||||
"votedialog5": "選項",
|
||||
"votedialog6": "按確認後,將創建投票!"
|
||||
"rewarddialog6": "點擊確認後,鑄幣密鑰將被移除並失效。"
|
||||
},
|
||||
"sponsorshipspage": {
|
||||
"schange1": "目前有效的贊助記錄",
|
||||
@ -1215,9 +1140,7 @@
|
||||
"inf15": "有效的自動購買訂單",
|
||||
"inf16": "自動購買",
|
||||
"inf17": "切換到淺色主題",
|
||||
"inf18": "切換到深色主題",
|
||||
"inf19": "貿易資訊",
|
||||
"inf20": "買家"
|
||||
"inf18": "切換到深色主題"
|
||||
},
|
||||
"lotterypage": {
|
||||
"lot1": "開放 Qortal 彩票",
|
||||
@ -1233,101 +1156,5 @@
|
||||
"lot11": "沒有公開抽獎!",
|
||||
"lot12": "沒有完成的彩票!",
|
||||
"lot13": "玩家"
|
||||
},
|
||||
"notifications": {
|
||||
"notify1": "確認交易",
|
||||
"notify2": "交易已確認",
|
||||
"explanation": "您的交易正在確認。若要追蹤其進度,請按一下響鈴圖示。",
|
||||
"status1": "完全同步",
|
||||
"status2": "未同步",
|
||||
"notify3": "無通知",
|
||||
"notify4": "發送通知"
|
||||
},
|
||||
"friends": {
|
||||
"friend1": "新增姓名",
|
||||
"friend2": "新增好友",
|
||||
"friend3": "添加朋友可以讓您輕鬆地與該人聯繫。 請務必關注該用戶以支援其已發布資源的託管。",
|
||||
"friend4": "筆記",
|
||||
"friend5": "關注姓名",
|
||||
"friend6": "別名",
|
||||
"friend7": "添加別名以更好地記住您的朋友(可選)",
|
||||
"friend8": "發送 Q 聊天",
|
||||
"friend9": "發送 Q 郵件",
|
||||
"friend10": "編輯好友",
|
||||
"friend11": "下列的",
|
||||
"friend12": "朋友們",
|
||||
"friend13": "餵食",
|
||||
"friend14": "刪除好友",
|
||||
"friend15": "飼料設定",
|
||||
"friend16": "選擇您想要更新的 Q-App,尤其是與您的朋友相關的 Q-App。",
|
||||
"friend17": "您的 Feed 中沒有任何項目"
|
||||
},
|
||||
"save": {
|
||||
"saving1": "無法取得已儲存的設定",
|
||||
"saving2": "沒有什麼可保存的",
|
||||
"saving3": "儲存未儲存的更改",
|
||||
"saving4": "取消更改"
|
||||
},
|
||||
"profile": {
|
||||
"profile1": "你沒有名字",
|
||||
"profile2": "前往姓名註冊",
|
||||
"profile3": "更新個人資料",
|
||||
"profile4": "標語",
|
||||
"profile5": "個人簡介",
|
||||
"profile6": "錢包位址",
|
||||
"profile7": "從使用者介面填寫",
|
||||
"profile8": "新增自訂屬性",
|
||||
"profile9": "屬性名稱",
|
||||
"profile10": "字段",
|
||||
"profile11": "新增欄位",
|
||||
"profile12": "欄位名稱",
|
||||
"profile13": "字段值",
|
||||
"profile14": "活動",
|
||||
"profile15": "無值",
|
||||
"profile16": "該名字沒有個人資料",
|
||||
"profile17": "無法取得個人資料",
|
||||
"profile18": "開啟個人資料",
|
||||
"profile19": "無法取得個人資料",
|
||||
"profile20": "註冊名稱",
|
||||
"profile21": "從 UI 插入位址",
|
||||
"profile22": "成功",
|
||||
"profile23": "加密",
|
||||
"profile24": "您必須填入欄位名稱和欄位值才能新增自訂屬性",
|
||||
"profile25": "是你的朋友",
|
||||
"profile26": "新增為好友"
|
||||
},
|
||||
"tour": {
|
||||
"tour1": "為了使用 Qortal,Core 必須同步。同步時該圖示將呈現藍色。",
|
||||
"tour2": "已同步",
|
||||
"tour3": "同步並鑄造",
|
||||
"tour4": "正在同步",
|
||||
"tour5": "同步你的核心",
|
||||
"tour6": "Qortal 不可阻擋的力量",
|
||||
"tour7": "只有您可以控制 Qortal 上的資料",
|
||||
"tour8": "Qortal 無法被拿下",
|
||||
"tour9": "完全點對點,沒有中心化中介",
|
||||
"tour10": "這是預設選項卡視圖,您可以在其中存取重要的 Qortal 設定和 Q-app,例如 Q-Tube。",
|
||||
"tour11": "獲得完整體驗",
|
||||
"tour12": "要獲得完整的 Qortal 體驗,我們建議遵循此清單。",
|
||||
"tour13": "您已完全同步!您現在可以體驗 Qortal 區塊鏈的強大功能了。",
|
||||
"tour14": "讓我們嘗試參觀 Q-Tube!",
|
||||
"tour15": "參觀 Q-Tube",
|
||||
"tour16": "清單",
|
||||
"tour17": "請啟動Core以存取Qortal區塊鏈。",
|
||||
"tour18": "刷新(引導程式)",
|
||||
"tour19": "目前正在同步...您必須完全同步才能使用 Qortal",
|
||||
"tour20": "落後了。您想刷新(引導)以加快同步過程嗎?",
|
||||
"tour21": "剩餘塊數。",
|
||||
"tour22": "已要求刷新(引導)。請稍候。"
|
||||
},
|
||||
"chatsettings": {
|
||||
"cs1": "聊天設定",
|
||||
"cs2": "常規聊天設定",
|
||||
"cs3": "聊天訊息時間戳",
|
||||
"cs4": "很久以前",
|
||||
"cs5": "當地時間",
|
||||
"cs6": "聊天訊息字體大小",
|
||||
"cs7": "標準",
|
||||
"cs8": "px"
|
||||
}
|
||||
}
|
||||
}
|
@ -1,121 +1,139 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en-us">
|
||||
<head>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover">
|
||||
<meta charset="UTF-8">
|
||||
<meta name="Description" content="Qortal Platform UI">
|
||||
<link rel="apple-touch-icon" sizes="57x57" href="/img/favicon/apple-icon-57x57.png">
|
||||
<link rel="apple-touch-icon" sizes="60x60" href="/img/favicon/apple-icon-60x60.png">
|
||||
<link rel="apple-touch-icon" sizes="72x72" href="/img/favicon/apple-icon-72x72.png">
|
||||
<link rel="apple-touch-icon" sizes="76x76" href="/img/favicon/apple-icon-76x76.png">
|
||||
<link rel="apple-touch-icon" sizes="114x114" href="/img/favicon/apple-icon-114x114.png">
|
||||
<link rel="apple-touch-icon" sizes="120x120" href="/img/favicon/apple-icon-120x120.png">
|
||||
<link rel="apple-touch-icon" sizes="144x144" href="/img/favicon/apple-icon-144x144.png">
|
||||
<link rel="apple-touch-icon" sizes="152x152" href="/img/favicon/apple-icon-152x152.png">
|
||||
<link rel="apple-touch-icon" sizes="180x180" href="/img/favicon/apple-icon-180x180.png">
|
||||
<link rel="icon" type="image/png" sizes="192x192" href="/img/favicon/android-icon-192x192.png">
|
||||
<link rel="icon" type="image/png" sizes="32x32" href="/img/favicon/favicon-32x32.png">
|
||||
<link rel="icon" type="image/png" sizes="96x96" href="/img/favicon/favicon-96x96.png">
|
||||
<link rel="icon" type="image/png" sizes="16x16" href="/img/favicon/favicon-16x16.png">
|
||||
<link rel="manifest" href="/img/favicon/manifest.json">
|
||||
<meta name="msapplication-TileColor" content="var(--white)">
|
||||
<meta name="msapplication-TileImage" content="/img/favicon/ms-icon-144x144.png">
|
||||
<meta name="theme-color" content="var(--white)">
|
||||
<style>
|
||||
html {
|
||||
--scrollbarBG: #a1a1a1;
|
||||
--thumbBG: #6a6c75;
|
||||
overflow: hidden;
|
||||
}
|
||||
*::-webkit-scrollbar {
|
||||
width: 11px;
|
||||
}
|
||||
* {
|
||||
scrollbar-width: thin;
|
||||
scrollbar-color: var(--thumbBG) var(--scrollbarBG);
|
||||
}
|
||||
*::-webkit-scrollbar-track {
|
||||
background: var(--scrollbarBG);
|
||||
}
|
||||
*::-webkit-scrollbar-thumb {
|
||||
background-color: var(--thumbBG);
|
||||
border-radius: 6px;
|
||||
border: 3px solid var(--scrollbarBG);
|
||||
}
|
||||
html,
|
||||
body {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
background: var(--plugback);
|
||||
overflow: hidden;
|
||||
}
|
||||
</style>
|
||||
<link rel="stylesheet" href="/build/styles.bundle.css">
|
||||
<link rel="stylesheet" href="/font/material-icons.css">
|
||||
<link rel="stylesheet" href="/font/switch-theme.css">
|
||||
<title>Qortal UI</title>
|
||||
<script>
|
||||
const checkTheme = localStorage.getItem('qortalTheme')
|
||||
if (checkTheme === 'dark') {
|
||||
newtheme = 'dark';
|
||||
} else {
|
||||
newtheme = 'light';
|
||||
}
|
||||
document.querySelector('html').setAttribute('theme', newtheme);
|
||||
|
||||
const memory = new WebAssembly.Memory({ initial: 256, maximum: 256 });
|
||||
const heap = new Uint8Array(memory.buffer);
|
||||
|
||||
const sbrk = function (size, heap) {
|
||||
let brk = 512 * 1024; // stack top
|
||||
let old = brk;
|
||||
brk += size;
|
||||
|
||||
if (brk > heap.length)
|
||||
throw new Error("heap exhausted");
|
||||
|
||||
return old;
|
||||
};
|
||||
|
||||
const importObject = {
|
||||
env: {
|
||||
memory: memory
|
||||
},
|
||||
};
|
||||
|
||||
function loadWebAssembly(filename, imports) {
|
||||
// Fetch the file and compile it
|
||||
return fetch(filename)
|
||||
.then(response => response.arrayBuffer())
|
||||
.then(buffer => WebAssembly.compile(buffer))
|
||||
.then(module => {
|
||||
|
||||
// Create the instance.
|
||||
return new WebAssembly.Instance(module, importObject);
|
||||
});
|
||||
}
|
||||
|
||||
const path = window.parent.location.origin + '/memory-pow/memory-pow.wasm.full'
|
||||
|
||||
loadWebAssembly(path)
|
||||
.then(wasmModule => {
|
||||
window.sbrk = sbrk
|
||||
window.memory = memory
|
||||
window.heap = heap
|
||||
window.powInstance = wasmModule.instance;
|
||||
window.computePow = wasmModule.exports.compute2;
|
||||
});
|
||||
|
||||
</script>
|
||||
</head>
|
||||
<body>
|
||||
<app-styles></app-styles>
|
||||
<main>
|
||||
<noscript>
|
||||
You need to enable JavaScript to run this app. 😞
|
||||
</noscript>
|
||||
<main-app id="main-app"></main-app>
|
||||
</main>
|
||||
<script type="module" src="/build/es6/main.js"></script>
|
||||
</body>
|
||||
|
||||
<head>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover">
|
||||
<meta charset="UTF-8">
|
||||
<meta name="Description" content="Qortal Platform UI">
|
||||
|
||||
<link rel="apple-touch-icon" sizes="57x57" href="/img/favicon/apple-icon-57x57.png">
|
||||
<link rel="apple-touch-icon" sizes="60x60" href="/img/favicon/apple-icon-60x60.png">
|
||||
<link rel="apple-touch-icon" sizes="72x72" href="/img/favicon/apple-icon-72x72.png">
|
||||
<link rel="apple-touch-icon" sizes="76x76" href="/img/favicon/apple-icon-76x76.png">
|
||||
<link rel="apple-touch-icon" sizes="114x114" href="/img/favicon/apple-icon-114x114.png">
|
||||
<link rel="apple-touch-icon" sizes="120x120" href="/img/favicon/apple-icon-120x120.png">
|
||||
<link rel="apple-touch-icon" sizes="144x144" href="/img/favicon/apple-icon-144x144.png">
|
||||
<link rel="apple-touch-icon" sizes="152x152" href="/img/favicon/apple-icon-152x152.png">
|
||||
<link rel="apple-touch-icon" sizes="180x180" href="/img/favicon/apple-icon-180x180.png">
|
||||
<link rel="icon" type="image/png" sizes="192x192" href="/img/favicon/android-icon-192x192.png">
|
||||
<link rel="icon" type="image/png" sizes="32x32" href="/img/favicon/favicon-32x32.png">
|
||||
<link rel="icon" type="image/png" sizes="96x96" href="/img/favicon/favicon-96x96.png">
|
||||
<link rel="icon" type="image/png" sizes="16x16" href="/img/favicon/favicon-16x16.png">
|
||||
<link rel="manifest" href="/img/favicon/manifest.json">
|
||||
|
||||
<meta name="msapplication-TileColor" content="var(--white)">
|
||||
<meta name="msapplication-TileImage" content="/img/favicon/ms-icon-144x144.png">
|
||||
<meta name="theme-color" content="var(--white)">
|
||||
|
||||
<style>
|
||||
html {
|
||||
--scrollbarBG: #a1a1a1;
|
||||
--thumbBG: #6a6c75;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
*::-webkit-scrollbar {
|
||||
width: 11px;
|
||||
}
|
||||
|
||||
* {
|
||||
scrollbar-width: thin;
|
||||
scrollbar-color: var(--thumbBG) var(--scrollbarBG);
|
||||
}
|
||||
|
||||
*::-webkit-scrollbar-track {
|
||||
background: var(--scrollbarBG);
|
||||
}
|
||||
|
||||
*::-webkit-scrollbar-thumb {
|
||||
background-color: var(--thumbBG);
|
||||
border-radius: 6px;
|
||||
border: 3px solid var(--scrollbarBG);
|
||||
}
|
||||
|
||||
html,
|
||||
body {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
background: var(--plugback);
|
||||
overflow: hidden;
|
||||
}
|
||||
</style>
|
||||
<link rel="stylesheet" href="/build/styles.bundle.css">
|
||||
<link rel="stylesheet" href="/font/material-icons.css">
|
||||
<link rel="stylesheet" href="/font/switch-theme.css">
|
||||
<title>Qortal UI</title>
|
||||
|
||||
|
||||
<script>
|
||||
const checkTheme = localStorage.getItem('qortalTheme')
|
||||
if (checkTheme === 'dark') {
|
||||
newtheme = 'dark';
|
||||
} else {
|
||||
newtheme = 'light';
|
||||
}
|
||||
document.querySelector('html').setAttribute('theme', newtheme);
|
||||
|
||||
const memory = new WebAssembly.Memory({ initial: 256, maximum: 256 });
|
||||
const heap = new Uint8Array(memory.buffer);
|
||||
|
||||
const sbrk = function (size, heap) {
|
||||
let brk = 512 * 1024; // stack top
|
||||
let old = brk;
|
||||
brk += size;
|
||||
|
||||
if (brk > heap.length)
|
||||
throw new Error("heap exhausted");
|
||||
|
||||
return old;
|
||||
};
|
||||
|
||||
const importObject = {
|
||||
env: {
|
||||
memory: memory
|
||||
},
|
||||
};
|
||||
|
||||
function loadWebAssembly(filename, imports) {
|
||||
// Fetch the file and compile it
|
||||
return fetch(filename)
|
||||
.then(response => response.arrayBuffer())
|
||||
.then(buffer => WebAssembly.compile(buffer))
|
||||
.then(module => {
|
||||
|
||||
// Create the instance.
|
||||
return new WebAssembly.Instance(module, importObject);
|
||||
});
|
||||
}
|
||||
|
||||
const path = window.parent.location.origin + '/memory-pow/memory-pow.wasm.full'
|
||||
|
||||
loadWebAssembly(path)
|
||||
.then(wasmModule => {
|
||||
window.sbrk = sbrk
|
||||
window.memory = memory
|
||||
window.heap = heap
|
||||
window.powInstance = wasmModule.instance;
|
||||
window.computePow = wasmModule.exports.compute2;
|
||||
});
|
||||
|
||||
</script>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<app-styles></app-styles>
|
||||
<main>
|
||||
|
||||
<noscript>
|
||||
You need to enable JavaScript to run this app. 😞
|
||||
</noscript>
|
||||
|
||||
<main-app id="main-app"></main-app>
|
||||
|
||||
</main>
|
||||
|
||||
<script type="module" src="/build/es6/main.js"></script>
|
||||
|
||||
</body>
|
||||
|
||||
</html>
|
||||
|
@ -3,33 +3,32 @@ const Hapi = require('@hapi/hapi')
|
||||
const Inert = require('@hapi/inert')
|
||||
|
||||
function serverFactory(routes, address, port, tls) {
|
||||
this.server = new Hapi.Server({
|
||||
routes: {
|
||||
files: {
|
||||
relativeTo: Path.join(__dirname, '../')
|
||||
}
|
||||
},
|
||||
address: address,
|
||||
port: port,
|
||||
tls: tls
|
||||
})
|
||||
this.server = new Hapi.Server({
|
||||
routes: {
|
||||
files: {
|
||||
relativeTo: Path.join(__dirname, '../')
|
||||
}
|
||||
},
|
||||
address: address,
|
||||
port: port,
|
||||
tls: tls
|
||||
})
|
||||
|
||||
this.startServer = async () => {
|
||||
try {
|
||||
await this.server.register([Inert])
|
||||
this.startServer = async () => {
|
||||
try {
|
||||
await this.server.register([Inert])
|
||||
|
||||
this.server.route(routes)
|
||||
this.server.route(routes)
|
||||
|
||||
await this.server.start()
|
||||
await this.server.start()
|
||||
|
||||
delete this.startServer
|
||||
|
||||
return this.server
|
||||
} catch (e) {
|
||||
console.error(e)
|
||||
throw e
|
||||
}
|
||||
}
|
||||
delete this.startServer
|
||||
return this.server
|
||||
} catch (e) {
|
||||
console.error(e)
|
||||
throw e
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = serverFactory
|
||||
module.exports = serverFactory
|
||||
|
@ -1,106 +1,106 @@
|
||||
const path = require('path')
|
||||
|
||||
const routesOptions = {
|
||||
security: {
|
||||
hsts: {
|
||||
maxAge: 15768000,
|
||||
includeSubDomains: true,
|
||||
preload: true
|
||||
},
|
||||
xframe: 'sameorigin'
|
||||
}
|
||||
security: {
|
||||
hsts: {
|
||||
maxAge: 15768000,
|
||||
includeSubDomains: true,
|
||||
preload: true
|
||||
},
|
||||
xframe: 'sameorigin'
|
||||
}
|
||||
}
|
||||
|
||||
const createRoutes = config => [
|
||||
{
|
||||
method: 'GET',
|
||||
path: '/img/{param*}',
|
||||
handler: {
|
||||
directory: {
|
||||
path: config.build.options.imgDir,
|
||||
redirectToSlash: true,
|
||||
index: true
|
||||
}
|
||||
},
|
||||
options: routesOptions
|
||||
},
|
||||
{
|
||||
method: 'GET',
|
||||
path: '/language/{param*}',
|
||||
handler: {
|
||||
directory: {
|
||||
path: path.join(__dirname, '../../language'),
|
||||
redirectToSlash: true,
|
||||
index: true
|
||||
}
|
||||
},
|
||||
options: routesOptions
|
||||
},
|
||||
{
|
||||
method: 'GET',
|
||||
path: '/font/{param*}',
|
||||
handler: {
|
||||
directory: {
|
||||
path: path.join(__dirname, '../../font'),
|
||||
redirectToSlash: true,
|
||||
index: true
|
||||
}
|
||||
},
|
||||
options: routesOptions
|
||||
},
|
||||
{
|
||||
method: 'GET',
|
||||
path: '/sound/{param*}',
|
||||
handler: {
|
||||
directory: {
|
||||
path: path.join(__dirname, '../../sound/'),
|
||||
redirectToSlash: true,
|
||||
index: true
|
||||
}
|
||||
},
|
||||
options: routesOptions
|
||||
},
|
||||
{
|
||||
method: 'GET',
|
||||
path: '/emoji/{param*}',
|
||||
handler: {
|
||||
directory: {
|
||||
path: path.join(__dirname, '../../emoji/'),
|
||||
redirectToSlash: true,
|
||||
index: true
|
||||
}
|
||||
},
|
||||
options: routesOptions
|
||||
},
|
||||
{
|
||||
method: 'GET',
|
||||
path: '/memory-pow/{param*}',
|
||||
handler: {
|
||||
directory: {
|
||||
path: path.join(__dirname, '../../memory-pow/'),
|
||||
redirectToSlash: true,
|
||||
index: true
|
||||
}
|
||||
},
|
||||
options: routesOptions
|
||||
},
|
||||
{
|
||||
method: 'GET',
|
||||
path: '/getConfig',
|
||||
handler: (request, h) => {
|
||||
const response = {
|
||||
config: {
|
||||
...config
|
||||
}
|
||||
}
|
||||
|
||||
delete response.config.user.tls
|
||||
delete response.config.build
|
||||
{
|
||||
method: 'GET',
|
||||
path: '/img/{param*}',
|
||||
handler: {
|
||||
directory: {
|
||||
path: config.build.options.imgDir,
|
||||
redirectToSlash: true,
|
||||
index: true
|
||||
}
|
||||
},
|
||||
options: routesOptions
|
||||
},
|
||||
{
|
||||
method: 'GET',
|
||||
path: '/language/{param*}',
|
||||
handler: {
|
||||
directory: {
|
||||
path: path.join(__dirname, '../../language'),
|
||||
redirectToSlash: true,
|
||||
index: true
|
||||
}
|
||||
},
|
||||
options: routesOptions
|
||||
},
|
||||
{
|
||||
method: 'GET',
|
||||
path: '/font/{param*}',
|
||||
handler: {
|
||||
directory: {
|
||||
path: path.join(__dirname, '../../font'),
|
||||
redirectToSlash: true,
|
||||
index: true
|
||||
}
|
||||
},
|
||||
options: routesOptions
|
||||
},
|
||||
{
|
||||
method: 'GET',
|
||||
path: '/sound/{param*}',
|
||||
handler: {
|
||||
directory: {
|
||||
path: path.join(__dirname, '../../sound/'),
|
||||
redirectToSlash: true,
|
||||
index: true
|
||||
}
|
||||
},
|
||||
options: routesOptions
|
||||
},
|
||||
{
|
||||
method: 'GET',
|
||||
path: '/emoji/{param*}',
|
||||
handler: {
|
||||
directory: {
|
||||
path: path.join(__dirname, '../../emoji/'),
|
||||
redirectToSlash: true,
|
||||
index: true
|
||||
}
|
||||
},
|
||||
options: routesOptions
|
||||
},
|
||||
{
|
||||
method: 'GET',
|
||||
path: '/memory-pow/{param*}',
|
||||
handler: {
|
||||
directory: {
|
||||
path: path.join(__dirname, '../../memory-pow/'),
|
||||
redirectToSlash: true,
|
||||
index: true
|
||||
}
|
||||
},
|
||||
options: routesOptions
|
||||
},
|
||||
{
|
||||
method: 'GET',
|
||||
path: '/getConfig',
|
||||
handler: (request, h) => {
|
||||
const response = {
|
||||
config: {
|
||||
...config
|
||||
}
|
||||
}
|
||||
|
||||
return JSON.stringify(response)
|
||||
},
|
||||
options: routesOptions
|
||||
}
|
||||
delete response.config.user.tls
|
||||
delete response.config.build
|
||||
return JSON.stringify(response)
|
||||
},
|
||||
options: routesOptions
|
||||
}
|
||||
]
|
||||
|
||||
module.exports = createRoutes
|
||||
module.exports = createRoutes
|
||||
|
@ -1,140 +1,141 @@
|
||||
const path = require('path')
|
||||
|
||||
const createCommonRoutes = require('./createCommonRoutes.js')
|
||||
|
||||
const createPrimaryRoutes = (config, plugins) => {
|
||||
const routes = createCommonRoutes(config)
|
||||
const routes = createCommonRoutes(config)
|
||||
|
||||
let myPlugins = plugins
|
||||
let myPlugins = plugins
|
||||
|
||||
const pluginFolders = {}
|
||||
const pluginFolders = {}
|
||||
|
||||
const routesOptions = {
|
||||
security: {
|
||||
hsts: {
|
||||
maxAge: 15768000,
|
||||
includeSubDomains: true,
|
||||
preload: true
|
||||
},
|
||||
xframe: 'sameorigin'
|
||||
}
|
||||
}
|
||||
const routesOptions = {
|
||||
security: {
|
||||
hsts: {
|
||||
maxAge: 15768000,
|
||||
includeSubDomains: true,
|
||||
preload: true
|
||||
},
|
||||
xframe: 'sameorigin'
|
||||
}
|
||||
}
|
||||
|
||||
plugins.reduce((obj, plugin) => {
|
||||
obj[plugin.name] = plugin.folder
|
||||
return obj
|
||||
}, pluginFolders)
|
||||
plugins.reduce((obj, plugin) => {
|
||||
obj[plugin.name] = plugin.folder
|
||||
return obj
|
||||
}, pluginFolders)
|
||||
|
||||
|
||||
routes.push(
|
||||
{
|
||||
method: 'GET',
|
||||
path: '/',
|
||||
handler: (request, reply) => {
|
||||
return reply.redirect('/app')
|
||||
},
|
||||
options: routesOptions
|
||||
},
|
||||
{
|
||||
method: 'GET',
|
||||
path: '/{path*}',
|
||||
handler: (request, h) => {
|
||||
const filePath = path.join(__dirname, '../../public/index.html')
|
||||
const response = h.file(filePath, {
|
||||
confine: true
|
||||
})
|
||||
response.header('Access-Control-Allow-Origin', request.info.host)
|
||||
return response
|
||||
},
|
||||
options: routesOptions
|
||||
},
|
||||
{
|
||||
method: 'GET',
|
||||
path: '/getPlugins',
|
||||
handler: (request, h) => {
|
||||
return { plugins: myPlugins.map(p => p.name) }
|
||||
},
|
||||
options: routesOptions
|
||||
},
|
||||
{
|
||||
method: 'GET',
|
||||
path: '/build/{param*}',
|
||||
handler: {
|
||||
directory: {
|
||||
path: config.build.options.outputDir,
|
||||
redirectToSlash: true,
|
||||
index: true
|
||||
}
|
||||
},
|
||||
options: routesOptions
|
||||
},
|
||||
{
|
||||
method: 'GET',
|
||||
path: '/src/{param*}',
|
||||
handler: {
|
||||
directory: {
|
||||
path: path.join(__dirname, '../../src'),
|
||||
redirectToSlash: true,
|
||||
index: true
|
||||
}
|
||||
},
|
||||
options: routesOptions
|
||||
},
|
||||
{
|
||||
method: 'GET',
|
||||
path: '/plugin/{path*}',
|
||||
handler: (request, h) => {
|
||||
routes.push(
|
||||
{
|
||||
method: 'GET',
|
||||
path: '/',
|
||||
handler: (request, reply) => {
|
||||
return reply.redirect('/app')
|
||||
},
|
||||
options: routesOptions
|
||||
},
|
||||
{
|
||||
method: 'GET',
|
||||
path: '/{path*}',
|
||||
handler: (request, h) => {
|
||||
const filePath = path.join(__dirname, '../../public/index.html')
|
||||
const response = h.file(filePath, {
|
||||
confine: true
|
||||
})
|
||||
response.header('Access-Control-Allow-Origin', request.info.host)
|
||||
return response
|
||||
},
|
||||
options: routesOptions
|
||||
},
|
||||
{
|
||||
method: 'GET',
|
||||
path: '/getPlugins',
|
||||
handler: (request, h) => {
|
||||
return { plugins: myPlugins.map(p => p.name) }
|
||||
},
|
||||
options: routesOptions
|
||||
},
|
||||
{
|
||||
method: 'GET',
|
||||
path: '/build/{param*}',
|
||||
handler: {
|
||||
directory: {
|
||||
path: config.build.options.outputDir,
|
||||
redirectToSlash: true,
|
||||
index: true
|
||||
}
|
||||
},
|
||||
options: routesOptions
|
||||
},
|
||||
{
|
||||
method: 'GET',
|
||||
path: '/src/{param*}',
|
||||
handler: {
|
||||
directory: {
|
||||
path: path.join(__dirname, '../../src'),
|
||||
redirectToSlash: true,
|
||||
index: true
|
||||
}
|
||||
},
|
||||
options: routesOptions
|
||||
},
|
||||
{
|
||||
method: 'GET',
|
||||
path: '/plugin/{path*}',
|
||||
handler: (request, h) => {
|
||||
|
||||
const plugin = request.params.path.split('/')[0]
|
||||
const filePath = path.join(pluginFolders[plugin], '../', request.params.path)
|
||||
const plugin = request.params.path.split('/')[0]
|
||||
const filePath = path.join(pluginFolders[plugin], '../', request.params.path)
|
||||
|
||||
const response = h.file(filePath, {
|
||||
confine: false
|
||||
})
|
||||
response.header('Access-Control-Allow-Origin', request.info.host)
|
||||
return response
|
||||
},
|
||||
options: routesOptions
|
||||
},
|
||||
{
|
||||
method: 'GET',
|
||||
path: '/plugin/404',
|
||||
handler: (request, h) => {
|
||||
const response = h.file(path.join(config.server.primary.page404))
|
||||
response.header('Access-Control-Allow-Origin', request.info.host)
|
||||
return response
|
||||
},
|
||||
options: routesOptions
|
||||
},
|
||||
{
|
||||
method: 'GET',
|
||||
path: '/qortal-components/plugin-mainjs-loader.html',
|
||||
handler: (request, h) => {
|
||||
const response = h.file(path.join(__dirname, '../../src/plugins/plugin-mainjs-loader.html'), {
|
||||
confine: false
|
||||
})
|
||||
response.header('Access-Control-Allow-Origin', request.info.host)
|
||||
return response
|
||||
},
|
||||
options: routesOptions
|
||||
},
|
||||
{
|
||||
method: 'GET',
|
||||
path: '/qortal-components/plugin-mainjs-loader.js',
|
||||
handler: (request, h) => {
|
||||
const file = path.join(config.build.options.outputDir, '/plugins/plugin-mainjs-loader.js')
|
||||
const response = h.file(filePath, {
|
||||
confine: false
|
||||
})
|
||||
response.header('Access-Control-Allow-Origin', request.info.host)
|
||||
return response
|
||||
},
|
||||
options: routesOptions
|
||||
},
|
||||
{
|
||||
method: 'GET',
|
||||
path: '/plugin/404',
|
||||
handler: (request, h) => {
|
||||
const response = h.file(path.join(config.server.primary.page404))
|
||||
response.header('Access-Control-Allow-Origin', request.info.host)
|
||||
return response
|
||||
},
|
||||
options: routesOptions
|
||||
},
|
||||
{
|
||||
method: 'GET',
|
||||
path: '/qortal-components/plugin-mainjs-loader.html',
|
||||
handler: (request, h) => {
|
||||
const response = h.file(path.join(__dirname, '../../src/plugins/plugin-mainjs-loader.html'), {
|
||||
confine: false
|
||||
})
|
||||
response.header('Access-Control-Allow-Origin', request.info.host)
|
||||
return response
|
||||
},
|
||||
options: routesOptions
|
||||
},
|
||||
{
|
||||
method: 'GET',
|
||||
path: '/qortal-components/plugin-mainjs-loader.js',
|
||||
handler: (request, h) => {
|
||||
const file = path.join(config.build.options.outputDir, '/plugins/plugin-mainjs-loader.js')
|
||||
|
||||
const response = h.file(file, {
|
||||
confine: false
|
||||
})
|
||||
response.header('Access-Control-Allow-Origin', request.info.host)
|
||||
return response
|
||||
},
|
||||
options: routesOptions
|
||||
}
|
||||
const response = h.file(file, {
|
||||
confine: false
|
||||
})
|
||||
response.header('Access-Control-Allow-Origin', request.info.host)
|
||||
return response
|
||||
},
|
||||
options: routesOptions
|
||||
},
|
||||
|
||||
)
|
||||
)
|
||||
|
||||
return routes
|
||||
return routes
|
||||
}
|
||||
|
||||
module.exports = createPrimaryRoutes
|
||||
module.exports = createPrimaryRoutes
|
||||
|
@ -3,20 +3,22 @@ const ServerFactory = require('./ServerFactory.js')
|
||||
const createPrimaryRoutes = require('./routes/createPrimaryRoutes.js')
|
||||
|
||||
const createServer = (config, plugins) => {
|
||||
this.start = async function () {
|
||||
const primaryServer = new ServerFactory(createPrimaryRoutes(config, plugins), config.user.server.primary.host, config.user.server.primary.port, config.user.tls.enabled ? config.user.tls.options : void 0)
|
||||
primaryServer.startServer().then(server => {
|
||||
console.log(`Qortal UI Server started at ${server.info.uri} and listening on ${server.info.address}`)
|
||||
}).catch(e => {
|
||||
console.error(e)
|
||||
})
|
||||
}
|
||||
|
||||
return this
|
||||
this.start = async function () {
|
||||
const primaryServer = new ServerFactory(createPrimaryRoutes(config, plugins), config.user.server.primary.host, config.user.server.primary.port, config.user.tls.enabled ? config.user.tls.options : void 0)
|
||||
primaryServer.startServer()
|
||||
.then(server => {
|
||||
console.log(`Qortal UI Server started at ${server.info.uri} and listening on ${server.info.address}`)
|
||||
})
|
||||
.catch(e => {
|
||||
console.error(e)
|
||||
})
|
||||
}
|
||||
return this
|
||||
}
|
||||
|
||||
|
||||
const serverExports = {
|
||||
createServer
|
||||
createServer
|
||||
}
|
||||
|
||||
module.exports = serverExports
|
||||
module.exports = serverExports
|
||||
|
@ -1,55 +1,50 @@
|
||||
import * as api from 'qortal-ui-crypto'
|
||||
import mykey from './functional-components/mykey-page'
|
||||
import mykey from './functional-components/mykey-page.js'
|
||||
|
||||
'use strict'
|
||||
|
||||
export const checkApiKey = async (nodeConfig) => {
|
||||
let selectedNode = nodeConfig.knownNodes[nodeConfig.node]
|
||||
let apiKey = selectedNode.apiKey
|
||||
|
||||
// Attempt to generate an API key
|
||||
const generateUrl = '/admin/apikey/generate'
|
||||
let selectedNode = nodeConfig.knownNodes[nodeConfig.node];
|
||||
let apiKey = selectedNode.apiKey;
|
||||
|
||||
let generateRes = await api.request(generateUrl, {
|
||||
method: 'POST'
|
||||
})
|
||||
// Attempt to generate an API key
|
||||
const generateUrl = "/admin/apikey/generate";
|
||||
let generateRes = await api.request(generateUrl, {
|
||||
method: "POST"
|
||||
});
|
||||
|
||||
if (generateRes != null && generateRes.error == null && generateRes.length >= 8) {
|
||||
console.log('Generated API key')
|
||||
if (generateRes != null && generateRes.error == null && generateRes.length >= 8) {
|
||||
console.log("Generated API key");
|
||||
apiKey = generateRes;
|
||||
|
||||
apiKey = generateRes
|
||||
// Store the generated API key
|
||||
selectedNode.apiKey = apiKey;
|
||||
nodeConfig.knownNodes[nodeConfig.node] = selectedNode;
|
||||
localStorage.setItem('myQortalNodes', JSON.stringify(nodeConfig.knownNodes));
|
||||
}
|
||||
else {
|
||||
console.log("Unable to generate API key");
|
||||
}
|
||||
|
||||
// Store the generated API key
|
||||
selectedNode.apiKey = apiKey
|
||||
nodeConfig.knownNodes[nodeConfig.node] = selectedNode
|
||||
localStorage.setItem('myQortalNodes', JSON.stringify(nodeConfig.knownNodes))
|
||||
} else {
|
||||
console.log("Unable to generate API key")
|
||||
}
|
||||
|
||||
// Now test the API key
|
||||
let testResult = await testApiKey(apiKey)
|
||||
|
||||
if (testResult === true) {
|
||||
console.log('API key test passed')
|
||||
} else {
|
||||
console.log('API key test failed')
|
||||
|
||||
mykey.show()
|
||||
|
||||
this.dispatchEvent(
|
||||
new CustomEvent('disable-tour', {
|
||||
bubbles: true,
|
||||
composed: true
|
||||
})
|
||||
)
|
||||
}
|
||||
// Now test the API key
|
||||
let testResult = await testApiKey(apiKey);
|
||||
if (testResult === true) {
|
||||
console.log("API key test passed");
|
||||
}
|
||||
else {
|
||||
console.log("API key test failed");
|
||||
mykey.show();
|
||||
}
|
||||
}
|
||||
|
||||
export const testApiKey = async (apiKey) => {
|
||||
const testUrl = '/admin/apikey/test?apiKey=' + apiKey
|
||||
|
||||
let testRes = await api.request(testUrl, {
|
||||
method: 'GET'
|
||||
})
|
||||
|
||||
return testRes === true
|
||||
}
|
||||
const testUrl = "/admin/apikey/test?apiKey=" + apiKey;
|
||||
let testRes = await api.request(testUrl, {
|
||||
method: "GET"
|
||||
});
|
||||
if (testRes === true) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
@ -1,3 +0,0 @@
|
||||
import WebWorker from 'web-worker:./computePowWorkerFile.js'
|
||||
|
||||
export default WebWorker
|
@ -1,107 +1,304 @@
|
||||
import { html, LitElement } from 'lit'
|
||||
import { LitElement, html, css } from 'lit'
|
||||
import { connect } from 'pwa-helpers'
|
||||
import { store } from '../store'
|
||||
import { appInfoStyles } from '../styles/core-css'
|
||||
import { store } from '../store.js'
|
||||
import { doPageUrl } from '../redux/app/app-actions.js'
|
||||
import { translate, translateUnsafeHTML } from 'lit-translate'
|
||||
import WebWorker from 'web-worker:./computePowWorker.js';
|
||||
import { routes } from '../plugins/routes.js';
|
||||
|
||||
// Multi language support
|
||||
import { translate } from '../../translate'
|
||||
import '@material/mwc-icon'
|
||||
import '@material/mwc-button'
|
||||
|
||||
class AppInfo extends connect(store)(LitElement) {
|
||||
static get properties() {
|
||||
return {
|
||||
nodeInfo: { type: Array },
|
||||
coreInfo: { type: Array },
|
||||
nodeConfig: { type: Object },
|
||||
theme: { type: String, reflect: true }
|
||||
}
|
||||
}
|
||||
static get properties() {
|
||||
return {
|
||||
blockInfo: { type: Object },
|
||||
nodeStatus: { type: Object },
|
||||
nodeInfo: { type: Array },
|
||||
coreInfo: { type: Array },
|
||||
nodeConfig: { type: Object },
|
||||
pageUrl: { type: String },
|
||||
publicizeAddress: { type: String },
|
||||
theme: { type: String, reflect: true }
|
||||
}
|
||||
}
|
||||
|
||||
static get styles() {
|
||||
return [appInfoStyles]
|
||||
}
|
||||
static get styles() {
|
||||
return [
|
||||
css`
|
||||
* {
|
||||
--mdc-theme-primary: rgb(3, 169, 244);
|
||||
--paper-input-container-focus-color: var(--mdc-theme-primary);
|
||||
}
|
||||
.normal {
|
||||
--mdc-theme-primary: rgb(3, 169, 244);
|
||||
}
|
||||
|
||||
constructor() {
|
||||
super()
|
||||
this.nodeInfo = []
|
||||
this.coreInfo = []
|
||||
this.nodeConfig = {}
|
||||
this.theme = localStorage.getItem('qortalTheme') ? localStorage.getItem('qortalTheme') : 'light'
|
||||
}
|
||||
.normal-button {
|
||||
--mdc-theme-primary: rgb(3, 169, 244);
|
||||
--mdc-theme-on-primary: white;
|
||||
}
|
||||
|
||||
render() {
|
||||
return html`
|
||||
<div id="profileInMenu">
|
||||
<span class="info">${translate("appinfo.uiversion")}: ${this.nodeConfig.version ? this.nodeConfig.version : ''}</span>
|
||||
${this._renderCoreVersion()}
|
||||
<span class="info">${translate("appinfo.blockheight")}: ${this.nodeInfo.height ? this.nodeInfo.height : ''} <span class=${this.cssStatus}>${this._renderStatus()}</span></span>
|
||||
<span class="info">${translate("appinfo.peers")}: ${this.nodeInfo.numberOfConnections ? this.nodeInfo.numberOfConnections : ''}
|
||||
</div>
|
||||
`
|
||||
}
|
||||
mwc-button.normal-button {
|
||||
--mdc-theme-primary: rgb(3, 169, 244);
|
||||
--mdc-theme-on-primary: white;
|
||||
}
|
||||
.test-net {
|
||||
--mdc-theme-primary: black;
|
||||
}
|
||||
|
||||
firstUpdated() {
|
||||
this.getNodeInfo()
|
||||
this.getCoreInfo()
|
||||
.test-net-button {
|
||||
--mdc-theme-primary: black;
|
||||
--mdc-theme-on-primary: white;
|
||||
}
|
||||
|
||||
setInterval(() => {
|
||||
this.getNodeInfo()
|
||||
this.getCoreInfo()
|
||||
}, 60000)
|
||||
}
|
||||
mwc-button.test-net-button {
|
||||
--mdc-theme-primary: black;
|
||||
--mdc-theme-on-primary: white;
|
||||
}
|
||||
#profileInMenu {
|
||||
flex: 0 0 100px;
|
||||
padding:12px;
|
||||
border-top: 1px solid var(--border);
|
||||
background: var(--sidetopbar);
|
||||
}
|
||||
.info {
|
||||
margin: 0;
|
||||
font-size: 14px;
|
||||
font-weight:100;
|
||||
display: inline-block;
|
||||
width:100%;
|
||||
padding-bottom:8px;
|
||||
color: var(--black);
|
||||
}
|
||||
.blue {
|
||||
color: #03a9f4;
|
||||
margin: 0;
|
||||
font-size: 14px;
|
||||
font-weight:200;
|
||||
display: inline;
|
||||
}
|
||||
.black {
|
||||
color: var(--black);
|
||||
margin: 0;
|
||||
font-size: 14px;
|
||||
font-weight:200;
|
||||
display: inline;
|
||||
}
|
||||
`
|
||||
]
|
||||
}
|
||||
|
||||
async getNodeInfo() {
|
||||
const appinfoNode = store.getState().app.nodeConfig.knownNodes[store.getState().app.nodeConfig.node]
|
||||
const appinfoUrl = appinfoNode.protocol + '://' + appinfoNode.domain + ':' + appinfoNode.port
|
||||
const url = `${appinfoUrl}/admin/status`
|
||||
constructor() {
|
||||
super()
|
||||
this.blockInfo = {}
|
||||
this.nodeInfo = []
|
||||
this.coreInfo = []
|
||||
this.nodeStatus = {}
|
||||
this.pageUrl = ''
|
||||
this.publicizeAddress = ''
|
||||
this.theme = localStorage.getItem('qortalTheme') ? localStorage.getItem('qortalTheme') : 'light'
|
||||
this.publicKeyisOnChainConfirmation = false
|
||||
this.interval
|
||||
}
|
||||
|
||||
await fetch(url).then(response => {
|
||||
return response.json()
|
||||
}).then(data => {
|
||||
this.nodeInfo = data
|
||||
}).catch(err => {
|
||||
console.error('Request failed', err)
|
||||
})
|
||||
}
|
||||
render() {
|
||||
return html`
|
||||
<div id="profileInMenu">
|
||||
<span class="info">${translate("appinfo.uiversion")}: ${this.nodeConfig.version ? this.nodeConfig.version : ''}</span>
|
||||
${this._renderCoreVersion()}
|
||||
<span class="info">${translate("appinfo.blockheight")}: ${this.nodeInfo.height ? this.nodeInfo.height : ''} <span class=${this.cssStatus}>${this._renderStatus()}</span></span>
|
||||
<span class="info">${translate("appinfo.peers")}: ${this.nodeInfo.numberOfConnections ? this.nodeInfo.numberOfConnections : ''}
|
||||
<a id="pageLink"></a>
|
||||
</div>
|
||||
`
|
||||
}
|
||||
|
||||
async getCoreInfo() {
|
||||
const appinfoNode = store.getState().app.nodeConfig.knownNodes[store.getState().app.nodeConfig.node]
|
||||
const appinfoUrl = appinfoNode.protocol + '://' + appinfoNode.domain + ':' + appinfoNode.port
|
||||
const url = `${appinfoUrl}/admin/info`
|
||||
firstUpdated() {
|
||||
this.publicizeAddress = store.getState().app.selectedAddress.address + '_publicize'
|
||||
this.setStorage()
|
||||
this.getNodeInfo()
|
||||
this.getCoreInfo()
|
||||
// try {
|
||||
// this.confirmPublicKeyOnChain(store.getState().app.selectedAddress.address)
|
||||
// } catch (error) {
|
||||
// console.error(error)
|
||||
// }
|
||||
|
||||
setInterval(() => {
|
||||
this.getNodeInfo()
|
||||
this.getCoreInfo()
|
||||
}, 30000)
|
||||
}
|
||||
|
||||
await fetch(url).then(response => {
|
||||
return response.json()
|
||||
}).then(data => {
|
||||
this.coreInfo = data
|
||||
}).catch(err => {
|
||||
console.error('Request failed', err)
|
||||
})
|
||||
}
|
||||
setStorage() {
|
||||
if (localStorage.getItem(this.publicizeAddress) === null) {
|
||||
localStorage.setItem(this.publicizeAddress, 'false')
|
||||
}
|
||||
}
|
||||
|
||||
_renderStatus() {
|
||||
if (this.nodeInfo.isMintingPossible === true && this.nodeInfo.isSynchronizing === true) {
|
||||
this.cssStatus = 'blue'
|
||||
return html`${translate("appinfo.minting")}`
|
||||
} else if (this.nodeInfo.isMintingPossible === true && this.nodeInfo.isSynchronizing === false) {
|
||||
this.cssStatus = 'blue'
|
||||
return html`${translate("appinfo.minting")}`
|
||||
} else if (this.nodeInfo.isMintingPossible === false && this.nodeInfo.isSynchronizing === true) {
|
||||
this.cssStatus = 'black'
|
||||
return html`(${translate("appinfo.synchronizing")}... ${this.nodeInfo.syncPercent !== undefined ? this.nodeInfo.syncPercent + '%' : ''})`
|
||||
} else if (this.nodeInfo.isMintingPossible === false && this.nodeInfo.isSynchronizing === false) {
|
||||
this.cssStatus = 'black'
|
||||
return ''
|
||||
} else {
|
||||
return ''
|
||||
}
|
||||
}
|
||||
async confirmPublicKeyOnChain(address) {
|
||||
const _computePow2 = async (chatBytes) => {
|
||||
const difficulty = 14
|
||||
const path = window.parent.location.origin + '/memory-pow/memory-pow.wasm.full'
|
||||
const worker = new WebWorker();
|
||||
let nonce = null
|
||||
let chatBytesArray = null
|
||||
await new Promise((res, rej) => {
|
||||
worker.postMessage({chatBytes, path, difficulty})
|
||||
|
||||
_renderCoreVersion() {
|
||||
return html`<span class="info">${translate("appinfo.coreversion")}: ${this.coreInfo.buildVersion ? this.coreInfo.buildVersion : ''}</span>`
|
||||
}
|
||||
worker.onmessage = e => {
|
||||
worker.terminate()
|
||||
chatBytesArray = e.data.chatBytesArray
|
||||
nonce = e.data.nonce
|
||||
res()
|
||||
}
|
||||
})
|
||||
|
||||
stateChanged(state) {
|
||||
this.nodeConfig = state.app.nodeConfig
|
||||
}
|
||||
let _response = await routes.sign_chat({
|
||||
data: {
|
||||
nonce: store.getState().app.selectedAddress.nonce,
|
||||
chatBytesArray: chatBytesArray,
|
||||
chatNonce: nonce
|
||||
},
|
||||
})
|
||||
return _response
|
||||
}
|
||||
|
||||
let stop = false
|
||||
const checkPublicKey = async () => {
|
||||
if (!stop) {
|
||||
stop = true
|
||||
try {
|
||||
if(localStorage.getItem(this.publicizeAddress) === 'true') {
|
||||
clearInterval(this.interval)
|
||||
return
|
||||
}
|
||||
const myNode = store.getState().app.nodeConfig.knownNodes[store.getState().app.nodeConfig.node]
|
||||
const nodeUrl = myNode.protocol + '://' + myNode.domain + ':' + myNode.port
|
||||
const url = `${nodeUrl}/addresses/publickey/${address}`
|
||||
const res = await fetch(url)
|
||||
let data = ''
|
||||
try {
|
||||
data = await res.text()
|
||||
} catch (error) {
|
||||
data = {
|
||||
error: 'error'
|
||||
}
|
||||
}
|
||||
if(data === 'false' && this.nodeInfo.isSynchronizing !== true) {
|
||||
let _reference = new Uint8Array(64)
|
||||
window.crypto.getRandomValues(_reference)
|
||||
let reference = window.parent.Base58.encode(_reference)
|
||||
const chatRes = await routes.chat({
|
||||
data: {
|
||||
type: 19,
|
||||
nonce: store.getState().app.selectedAddress.nonce,
|
||||
params: {
|
||||
lastReference: reference,
|
||||
proofOfWorkNonce: 0,
|
||||
fee: 0,
|
||||
timestamp: Date.now(),
|
||||
},
|
||||
disableModal: true
|
||||
},
|
||||
disableModal: true,
|
||||
});
|
||||
|
||||
try {
|
||||
const powRes = await _computePow2(chatRes)
|
||||
if(powRes === true) {
|
||||
clearInterval(this.interval)
|
||||
localStorage.removeItem(this.publicizeAddress)
|
||||
localStorage.setItem(this.publicizeAddress, 'true')
|
||||
}
|
||||
} catch (error) {
|
||||
console.error(error)
|
||||
}
|
||||
}
|
||||
|
||||
if (!data.error && data !== 'false' && data) {
|
||||
clearInterval(this.interval)
|
||||
localStorage.removeItem(this.publicizeAddress)
|
||||
localStorage.setItem(this.publicizeAddress, 'true')
|
||||
}
|
||||
|
||||
} catch (error) {
|
||||
}
|
||||
stop = false
|
||||
}
|
||||
}
|
||||
this.interval = setInterval(checkPublicKey, 5000);
|
||||
}
|
||||
|
||||
async getNodeInfo() {
|
||||
const appinfoNode = store.getState().app.nodeConfig.knownNodes[store.getState().app.nodeConfig.node]
|
||||
const appinfoUrl = appinfoNode.protocol + '://' + appinfoNode.domain + ':' + appinfoNode.port
|
||||
const url = `${appinfoUrl}/admin/status`
|
||||
await fetch(url).then(response => {
|
||||
return response.json()
|
||||
})
|
||||
.then(data => {
|
||||
this.nodeInfo = data
|
||||
})
|
||||
.catch(err => {
|
||||
console.error('Request failed', err)
|
||||
})
|
||||
}
|
||||
|
||||
async getCoreInfo() {
|
||||
const appinfoNode = store.getState().app.nodeConfig.knownNodes[store.getState().app.nodeConfig.node]
|
||||
const appinfoUrl = appinfoNode.protocol + '://' + appinfoNode.domain + ':' + appinfoNode.port
|
||||
const url = `${appinfoUrl}/admin/info`
|
||||
await fetch(url).then(response => {
|
||||
return response.json()
|
||||
})
|
||||
.then(data => {
|
||||
this.coreInfo = data
|
||||
})
|
||||
.catch(err => {
|
||||
console.error('Request failed', err)
|
||||
})
|
||||
}
|
||||
|
||||
_renderStatus() {
|
||||
if (this.nodeInfo.isMintingPossible === true && this.nodeInfo.isSynchronizing === true) {
|
||||
this.cssStatus = 'blue'
|
||||
return html`${translate("appinfo.minting")}`
|
||||
} else if (this.nodeInfo.isMintingPossible === true && this.nodeInfo.isSynchronizing === false) {
|
||||
this.cssStatus = 'blue'
|
||||
return html`${translate("appinfo.minting")}`
|
||||
} else if (this.nodeInfo.isMintingPossible === false && this.nodeInfo.isSynchronizing === true) {
|
||||
this.cssStatus = 'black'
|
||||
return html`(${translate("appinfo.synchronizing")}... ${this.nodeInfo.syncPercent !== undefined ? this.nodeInfo.syncPercent + '%' : ''})`
|
||||
} else if (this.nodeInfo.isMintingPossible === false && this.nodeInfo.isSynchronizing === false) {
|
||||
this.cssStatus = 'black'
|
||||
return ''
|
||||
} else {
|
||||
return ''
|
||||
}
|
||||
}
|
||||
|
||||
_renderCoreVersion() {
|
||||
return html`<span class="info">${translate("appinfo.coreversion")}: ${this.coreInfo.buildVersion ? this.coreInfo.buildVersion : ''}</span>`
|
||||
}
|
||||
|
||||
gotoPage(url) {
|
||||
const myLink = this.shadowRoot.querySelector('#pageLink')
|
||||
myLink.href = url
|
||||
myLink.click()
|
||||
store.dispatch(doPageUrl(''))
|
||||
}
|
||||
|
||||
stateChanged(state) {
|
||||
this.blockInfo = state.app.blockInfo
|
||||
this.nodeStatus = state.app.nodeStatus
|
||||
this.nodeConfig = state.app.nodeConfig
|
||||
this.pageUrl = state.app.pageUrl
|
||||
if (this.pageUrl.length > 5) {
|
||||
this.gotoPage(this.pageUrl)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
window.customElements.define('app-info', AppInfo)
|
||||
window.customElements.define('app-info', AppInfo)
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -1,11 +1,26 @@
|
||||
import { html, LitElement } from 'lit'
|
||||
import { LitElement, html, css } from 'lit'
|
||||
import { connect } from 'pwa-helpers'
|
||||
import { store } from '../store'
|
||||
import { store } from '../store.js'
|
||||
|
||||
class MyElement extends connect(store)(LitElement) {
|
||||
render () {
|
||||
return html`<style></style>`
|
||||
}
|
||||
static get properties () {
|
||||
return {
|
||||
}
|
||||
}
|
||||
|
||||
static get styles () {
|
||||
return css``
|
||||
}
|
||||
|
||||
render () {
|
||||
return html`
|
||||
<style>
|
||||
</style>
|
||||
`
|
||||
}
|
||||
|
||||
stateChanged (state) {
|
||||
}
|
||||
}
|
||||
|
||||
window.customElements.define('my-element', MyElement)
|
||||
window.customElements.define('my-element', MyElement)
|
||||
|
@ -1,208 +0,0 @@
|
||||
import { html, LitElement } from 'lit'
|
||||
import { connect } from 'pwa-helpers'
|
||||
import { store } from '../../store'
|
||||
import { parentEpml } from '../show-plugin'
|
||||
import { syncIndicator2Styles } from '../../styles/core-css'
|
||||
import '@material/mwc-icon'
|
||||
|
||||
// Multi language support
|
||||
import {translate} from '../../../translate'
|
||||
|
||||
class SyncIndicator extends connect(store)(LitElement) {
|
||||
static get properties() {
|
||||
return {
|
||||
blocksBehind: { type: Number },
|
||||
nodeUrl: { type: String },
|
||||
address: { type: String },
|
||||
isBehind: { type: Boolean },
|
||||
isSynchronizing: { type: Boolean },
|
||||
hasCoreRunning: { type: Boolean }
|
||||
}
|
||||
}
|
||||
|
||||
static get styles() {
|
||||
return [syncIndicator2Styles]
|
||||
}
|
||||
|
||||
constructor() {
|
||||
super()
|
||||
this.blocksBehind = 0
|
||||
this.nodeUrl = ''
|
||||
this.address = ''
|
||||
this.isBehind = false
|
||||
this.isSynchronizing = false
|
||||
this.hasCoreRunning = true
|
||||
this.interval = null
|
||||
this.seenWelcomeSync = false
|
||||
this.numberOfTries = 0
|
||||
this.hasOpened = false
|
||||
}
|
||||
|
||||
render() {
|
||||
return html`
|
||||
${!this.hasCoreRunning ? html`
|
||||
<div class="parent">
|
||||
<span>
|
||||
<mwc-icon id="notification-general-icon" style="color: red; cursor:pointer;user-select:none">
|
||||
priority_high
|
||||
</mwc-icon>
|
||||
</span>
|
||||
<p>
|
||||
${translate("tour.tour17")}
|
||||
</p>
|
||||
</div>
|
||||
` : (this.blocksBehind > 1050 && this.isSynchronizing) ? html`
|
||||
<div class="parent">
|
||||
<div class="column">
|
||||
<div class="row">
|
||||
<span>
|
||||
<img src="/img/syncing.png" style="height: 24px; width: 24px;" />
|
||||
</span>
|
||||
<p>
|
||||
${this.blocksBehind} ${translate("tour.tour20")}
|
||||
</p>
|
||||
</div>
|
||||
<div class="row" style="justify-content: center">
|
||||
<button class="bootstrap-button" @click="${() => {this.bootstrap()}}">
|
||||
${translate("tour.tour18")}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
` : this.isSynchronizing ? html`
|
||||
<div class="parent">
|
||||
<span>
|
||||
<img src="/img/syncing.png" style="height: 24px; width: 24px;" />
|
||||
</span>
|
||||
<p>
|
||||
${translate("tour.tour19")} ${this.blocksBehind ? this.blocksBehind : ""} ${this.blocksBehind ? translate("tour.tour21"): ""}
|
||||
</p>
|
||||
</div>
|
||||
` : "" }
|
||||
`
|
||||
}
|
||||
|
||||
firstUpdated() {
|
||||
this.getNodeUrl()
|
||||
this.address = store.getState().app.selectedAddress.address
|
||||
|
||||
this.seenWelcomeSync = JSON.parse(
|
||||
localStorage.getItem(`welcome-sync-${this.address}`) || 'false'
|
||||
)
|
||||
|
||||
setInterval(() => {
|
||||
this.getNodeUrl()
|
||||
}, 60000)
|
||||
}
|
||||
|
||||
getNodeUrl() {
|
||||
const syncInfoNode = store.getState().app.nodeConfig.knownNodes[store.getState().app.nodeConfig.node]
|
||||
const syncInfoUrl = syncInfoNode.protocol + '://' + syncInfoNode.domain + ':' + syncInfoNode.port
|
||||
this.nodeUrl = syncInfoUrl
|
||||
}
|
||||
|
||||
async getDaySummary() {
|
||||
try {
|
||||
this.fetchingSummary = true
|
||||
|
||||
const endpointLastBlock = `${this.nodeUrl}/blocks/last`
|
||||
const resLastBlock = await fetch(endpointLastBlock)
|
||||
const dataLastBlock = await resLastBlock.json()
|
||||
const timestampNow = Date.now()
|
||||
const currentBlockTimestamp = dataLastBlock.timestamp
|
||||
|
||||
if (currentBlockTimestamp < timestampNow) {
|
||||
const diff = timestampNow - currentBlockTimestamp
|
||||
const inSeconds = diff / 1000
|
||||
const inBlocks = inSeconds / 70
|
||||
this.blocksBehind = parseInt(inBlocks)
|
||||
if (inBlocks >= 100) {
|
||||
this.isBehind = true
|
||||
} else {
|
||||
this.isBehind = false
|
||||
this.blocksBehind = 0
|
||||
}
|
||||
} else {
|
||||
this.blocksBehind = 0
|
||||
this.isBehind = false
|
||||
}
|
||||
} catch (error) {} finally {
|
||||
this.fetchingSummary = false
|
||||
}
|
||||
}
|
||||
|
||||
async checkHowManyBlocksBehind() {
|
||||
try {
|
||||
await this.getDaySummary()
|
||||
this.interval = setInterval(() => {
|
||||
if(this.fetchingSummary) return
|
||||
if (this.isBehind === false) {
|
||||
this.isBehind = null
|
||||
clearInterval(this.interval)
|
||||
}
|
||||
this.getDaySummary()
|
||||
}, 20000)
|
||||
} catch (error) {
|
||||
// ...
|
||||
}
|
||||
}
|
||||
|
||||
async bootstrap() {
|
||||
try {
|
||||
const endpoint = `${this.nodeUrl}/admin/bootstrap/?apiKey=${this.getApiKey()}`
|
||||
const res = await fetch(endpoint)
|
||||
const data = await res.json()
|
||||
if (data === true) {
|
||||
parentEpml.request('showSnackBar', get('tour.tour22'))
|
||||
}
|
||||
} catch (error) {
|
||||
// ...
|
||||
}
|
||||
}
|
||||
|
||||
getApiKey() {
|
||||
const apiNode = store.getState().app.nodeConfig.knownNodes[store.getState().app.nodeConfig.node]
|
||||
return apiNode.apiKey
|
||||
}
|
||||
|
||||
stateChanged(state) {
|
||||
this.address = store.getState().app.selectedAddress.address
|
||||
|
||||
if (!this.seenWelcomeSync && state.app.nodeStatus && state.app.nodeStatus.syncPercent === 100 && this.hasOpened === false) {
|
||||
this.hasOpened = true
|
||||
this.dispatchEvent(
|
||||
new CustomEvent('open-welcome-modal-sync', {
|
||||
bubbles: true,
|
||||
composed: true
|
||||
})
|
||||
)
|
||||
}
|
||||
|
||||
if (state.app.nodeStatus && Object.keys(state.app.nodeStatus).length === 0) {
|
||||
if (this.numberOfTries > 5) {
|
||||
this.hasCoreRunning = false
|
||||
} else {
|
||||
this.numberOfTries = this.numberOfTries + 1
|
||||
}
|
||||
} else if (state.app.nodeStatus && state.app.nodeStatus.syncPercent === 100 && state.app.nodeStatus.syncPercent !== this.syncPercentage) {
|
||||
this.syncPercentage = state.app.nodeStatus.syncPercent
|
||||
this.isSynchronizing = false
|
||||
} else if (state.app.nodeStatus) {
|
||||
this.hasCoreRunning = true
|
||||
this.numberOfTries = 0
|
||||
this.syncPercentage = state.app.nodeStatus.syncPercent
|
||||
|
||||
if (state.app.nodeStatus.syncPercent !== 100) {
|
||||
this.isSynchronizing = true
|
||||
}
|
||||
|
||||
if (!this.interval && this.isBehind === null && state.app.nodeStatus.isSynchronizing && state.app.nodeStatus.syncPercent !== 100) {
|
||||
this.checkHowManyBlocksBehind()
|
||||
}
|
||||
} else {
|
||||
this.hasCoreRunning = true
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
window.customElements.define('sync-indicator', SyncIndicator)
|
@ -1,302 +0,0 @@
|
||||
import { html, LitElement } from 'lit'
|
||||
import { connect } from 'pwa-helpers'
|
||||
import { store } from '../../store'
|
||||
import { setNewTab } from '../../redux/app/app-actions'
|
||||
import { tourComponentStyles } from '../../styles/core-css'
|
||||
import { driver } from 'driver.js'
|
||||
import 'driver.js/dist/driver.css'
|
||||
import './tour.css'
|
||||
import '@material/mwc-button'
|
||||
import '@material/mwc-icon'
|
||||
import '@polymer/paper-dialog/paper-dialog.js'
|
||||
import '@polymer/paper-spinner/paper-spinner-lite.js'
|
||||
import '@vaadin/tooltip'
|
||||
|
||||
// Multi language support
|
||||
import { get, translate } from '../../../translate'
|
||||
|
||||
class TourComponent extends connect(store)(LitElement) {
|
||||
static get properties() {
|
||||
return {
|
||||
getElements: { attribute: false },
|
||||
dialogOpenedCongrats: { type: Boolean },
|
||||
hasViewedTour: { type: Boolean },
|
||||
disableTour: { type: Boolean },
|
||||
nodeUrl: { type: String },
|
||||
address: { type: String }
|
||||
}
|
||||
}
|
||||
|
||||
static get styles() {
|
||||
return [tourComponentStyles]
|
||||
}
|
||||
|
||||
constructor() {
|
||||
super()
|
||||
this.dialogOpenedCongrats = false
|
||||
this._controlOpenWelcomeModal = this._controlOpenWelcomeModal.bind(this)
|
||||
this.hasName = false
|
||||
this.nodeUrl = ''
|
||||
this.address = ''
|
||||
this._disableTour = this._disableTour.bind(this)
|
||||
this.disableTour = false
|
||||
}
|
||||
|
||||
render() {
|
||||
return html`
|
||||
<!-- Profile read-view -->
|
||||
${this.dialogOpenedCongrats && this.hasViewedTour ? html`
|
||||
<paper-dialog class="full-info-wrapper" ?opened="${this.dialogOpenedCongrats}">
|
||||
<h3>Congratulations!</h3>
|
||||
<div style="display:flex;gap:15px;justify-content:center;margin-top:10px">
|
||||
${translate("tour.tour13")}
|
||||
</div>
|
||||
<div style="display:flex;gap:15px;justify-content:center;margin-top:10px">
|
||||
${translate("tour.tour14")}
|
||||
</div>
|
||||
<div class="accept-button" @click=${this.visitQtube}>
|
||||
${translate("tour.tour15")}
|
||||
</div>
|
||||
<div style="width:100%;display:flex;justify-content:center;margin-top:10px">
|
||||
<div class="close-button" @click=${() => { this.onClose() }}>
|
||||
${translate("general.close")}
|
||||
</div>
|
||||
</div>
|
||||
</paper-dialog>
|
||||
` : ''}
|
||||
`
|
||||
}
|
||||
|
||||
async firstUpdated() {
|
||||
this.getNodeUrl()
|
||||
this.address = store.getState().app.selectedAddress.address
|
||||
|
||||
const hasViewedTour = JSON.parse(localStorage.getItem(`hasViewedTour-${this.address}`) || 'false')
|
||||
const name = await this.getName(this.address)
|
||||
|
||||
if (name) {
|
||||
this.hasName = true
|
||||
}
|
||||
|
||||
this.hasViewedTour = hasViewedTour
|
||||
|
||||
if (!hasViewedTour) {
|
||||
try {
|
||||
if (name) {
|
||||
this.hasViewedTour = true
|
||||
this.hasName = true
|
||||
localStorage.setItem(`hasViewedTour-${this.address}`, JSON.stringify(true))
|
||||
}
|
||||
} catch (error) {
|
||||
console.log({ error })
|
||||
}
|
||||
}
|
||||
|
||||
await new Promise((res) => {
|
||||
setTimeout(() => {
|
||||
res()
|
||||
}, 1000)
|
||||
})
|
||||
|
||||
if (!this.hasViewedTour && this.disableTour !== true) {
|
||||
const elements = this.getElements()
|
||||
|
||||
let steps = [{
|
||||
popover: {
|
||||
title: get("tour.tour6"),
|
||||
description: `
|
||||
<div style="display:flex;justify-content:center;gap:15px">
|
||||
<img style="height:40px;width:auto;margin:15px 0px;" src="/img/qort.png" />
|
||||
</div>
|
||||
<div style="display:flex;gap:15px;align-items:center;margin-top:15px;">
|
||||
<div style="height:6px;width:6px;border-radius:50%;background:var(--black)"></div>
|
||||
<p style="margin:0px;padding:0px">${get("tour.tour7")}</p>
|
||||
</div>
|
||||
<div style="display:flex;gap:15px;align-items:center;margin-top:15px;">
|
||||
<div style="height:6px;width:6px;border-radius:50%;background:var(--black)"></div>
|
||||
<p style="margin:0px;padding:0px">${get("tour.tour8")}</p>
|
||||
</div>
|
||||
<div style="display:flex;gap:15px;align-items:center;margin-top:15px;margin-bottom:30px">
|
||||
<div style="height:6px;width:6px;border-radius:50%;background:var(--black)"></div>
|
||||
<p style="margin:0px;padding:0px">${get("tour.tour9")}</p>
|
||||
</div>
|
||||
`
|
||||
}
|
||||
}]
|
||||
|
||||
const step2 = elements['core-sync-status-id']
|
||||
const step3 = elements['tab']
|
||||
const step4 = elements['checklist']
|
||||
|
||||
if (step2) {
|
||||
steps.push({
|
||||
element: step2,
|
||||
popover: {
|
||||
title: get("tour.tour5"),
|
||||
description: `
|
||||
<div style="display:flex;gap:15px;align-items:center;margin-top:15px;margin-bottom:30px">
|
||||
<p style="margin:0px;padding:0px">${get("tour.tour1")}</p>
|
||||
</div>
|
||||
<div style="display:flex;gap:15px;align-items:center;margin-top:15px;">
|
||||
<span><img src="/img/synced.png" style="height: 24px; width: 24px; padding-top: 4px;" /></span>
|
||||
<p style="margin:0px;padding:0px">${get("tour.tour2")}</p>
|
||||
</div>
|
||||
<div style="display:flex;gap:15px;align-items:center;margin-top:15px;">
|
||||
<span><img src="/img/synced_minting.png" style="height: 24px; width: 24px; padding-top: 4px;" /></span>
|
||||
<p style="margin:0px;padding:0px">${get("tour.tour3")}</p>
|
||||
</div>
|
||||
<div style="display:flex;gap:15px;align-items:center;margin-top:15px;margin-bottom:30px">
|
||||
<span><img src="/img/syncing.png" style="height: 24px; width: 24px; padding-top: 4px;" /></span>
|
||||
<p style="margin:0px;padding:0px">${get("tour.tour4")}</p>
|
||||
</div>
|
||||
|
||||
`
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
if (step3) {
|
||||
steps.push({
|
||||
element: step3,
|
||||
popover: {
|
||||
title: 'Tab View',
|
||||
description: `
|
||||
<div style="display:flex;gap:15px;align-items:center;margin-top:15px;margin-bottom:30px">
|
||||
<p style="margin:0px;padding:0px">${get("tour.tour10")}</p>
|
||||
</div>
|
||||
<div style="display:flex;gap:15px;align-items:center;margin-top:15px;">
|
||||
<span><img src="/img/addplugin.webp" style="height: 36px; width: 36px; padding-top: 4px;" /></span>
|
||||
<p style="margin:0px;padding:0px">
|
||||
You can also bookmark other Q-Apps and Plugins by clicking on the ${get('tabmenu.tm19')} button
|
||||
</p>
|
||||
</div>
|
||||
`
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
if (step4) {
|
||||
steps.push({ element: step4, popover: { title: get("tour.tour11"), description: get("tour.tour12")}})
|
||||
this.hasViewedTour
|
||||
}
|
||||
|
||||
let currentStepIndex = 0
|
||||
|
||||
const driverObj = driver({
|
||||
popoverClass: 'driverjs-theme',
|
||||
showProgress: true,
|
||||
showButtons: ['next', 'previous'],
|
||||
steps: steps,
|
||||
allowClose: false,
|
||||
onDestroyed: () => {
|
||||
localStorage.setItem(`hasViewedTour-${this.address}`, JSON.stringify(true))
|
||||
this.hasViewedTour = true
|
||||
this.openWelcomeModal()
|
||||
}
|
||||
})
|
||||
|
||||
driverObj.drive()
|
||||
} else {
|
||||
this.dispatchEvent(
|
||||
new CustomEvent('send-tour-finished', {
|
||||
bubbles: true,
|
||||
composed: true
|
||||
})
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
_controlOpenWelcomeModal() {
|
||||
this.isSynced = true
|
||||
|
||||
const seenWelcomeSync = JSON.parse(localStorage.getItem('welcome-sync') || 'false')
|
||||
|
||||
if (this.hasName) return
|
||||
if (seenWelcomeSync) return
|
||||
if (!this.hasViewedTour) return
|
||||
|
||||
this.dialogOpenedCongrats = true
|
||||
}
|
||||
|
||||
openWelcomeModal() {
|
||||
this.dispatchEvent(
|
||||
new CustomEvent('send-tour-finished', {
|
||||
bubbles: true,
|
||||
composed: true
|
||||
})
|
||||
)
|
||||
|
||||
const seenWelcomeSync = JSON.parse(localStorage.getItem('welcome-sync') || 'false')
|
||||
|
||||
if (this.hasName) return
|
||||
if (seenWelcomeSync) return
|
||||
if (!this.isSynced) return
|
||||
|
||||
this.dialogOpenedCongrats = true
|
||||
}
|
||||
|
||||
_disableTour() {
|
||||
this.disableTour = true
|
||||
driver.reset()
|
||||
}
|
||||
|
||||
connectedCallback() {
|
||||
super.connectedCallback()
|
||||
window.addEventListener('open-welcome-modal-sync', this._controlOpenWelcomeModal)
|
||||
window.addEventListener('disable-tour', this._disableTour)
|
||||
}
|
||||
|
||||
disconnectedCallback() {
|
||||
window.removeEventListener('open-welcome-modal-sync', this._controlOpenWelcomeModal)
|
||||
window.addEventListener('disable-tour', this._disableTour)
|
||||
super.disconnectedCallback()
|
||||
}
|
||||
|
||||
getNodeUrl() {
|
||||
const myNode = store.getState().app.nodeConfig.knownNodes[store.getState().app.nodeConfig.node]
|
||||
const myNodeUrl = myNode.protocol + '://' + myNode.domain + ':' + myNode.port
|
||||
this.nodeUrl = myNodeUrl
|
||||
}
|
||||
|
||||
async getName(recipient) {
|
||||
try {
|
||||
const endpoint = `${this.nodeUrl}/names/address/${recipient}`
|
||||
const res = await fetch(endpoint)
|
||||
const getNames = await res.json()
|
||||
|
||||
if (Array.isArray(getNames) && getNames.length > 0) {
|
||||
return getNames[0].name
|
||||
} else {
|
||||
return ''
|
||||
}
|
||||
} catch (error) {
|
||||
return ''
|
||||
}
|
||||
}
|
||||
|
||||
visitQtube() {
|
||||
this.onClose()
|
||||
const query = `?service=APP&name=Q-Tube`
|
||||
store.dispatch(
|
||||
setNewTab({
|
||||
url: `qdn/browser/index.html${query}`,
|
||||
id: 'q-mail-notification',
|
||||
myPlugObj: {
|
||||
url: 'myapp',
|
||||
domain: 'core',
|
||||
page: `qdn/browser/index.html${query}`,
|
||||
title: 'Q-Tube',
|
||||
menus: [],
|
||||
parent: false
|
||||
}
|
||||
})
|
||||
)
|
||||
}
|
||||
|
||||
onClose() {
|
||||
localStorage.setItem(`welcome-sync-${this.address}`, JSON.stringify(true))
|
||||
this.dialogOpenedCongrats = false
|
||||
}
|
||||
}
|
||||
|
||||
window.customElements.define('tour-component', TourComponent)
|
@ -1,77 +0,0 @@
|
||||
.driver-popover.driverjs-theme {
|
||||
background-color: var(--white);
|
||||
color: var(--black);
|
||||
max-width: 500px;
|
||||
width: auto;
|
||||
}
|
||||
|
||||
.driver-popover.driverjs-theme .driver-popover-title {
|
||||
font-size: 20px;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.driver-popover.driverjs-theme .driver-popover-title,
|
||||
.driver-popover.driverjs-theme .driver-popover-description,
|
||||
.driver-popover.driverjs-theme .driver-popover-progress-text {
|
||||
color: var(--black);
|
||||
font-family: Roboto, sans-serif;
|
||||
}
|
||||
.driver-popover.driverjs-theme .driver-popover-description {
|
||||
font-size: 16px;
|
||||
}
|
||||
|
||||
.driver-popover.driverjs-theme button {
|
||||
flex: 1;
|
||||
text-align: center;
|
||||
background-color: #000;
|
||||
color: #ffffff;
|
||||
border: 2px solid #000;
|
||||
text-shadow: none;
|
||||
font-size: 14px;
|
||||
padding: 5px 8px;
|
||||
border-radius: 6px;
|
||||
}
|
||||
|
||||
.driver-popover.driverjs-theme .test-span {
|
||||
color: green;
|
||||
}
|
||||
|
||||
.driver-popover.driverjs-theme button:hover {
|
||||
background-color: #000;
|
||||
color: #ffffff;
|
||||
}
|
||||
|
||||
.driver-popover.driverjs-theme .driver-popover-navigation-btns {
|
||||
justify-content: space-between;
|
||||
gap: 3px;
|
||||
}
|
||||
|
||||
.driver-popover.driverjs-theme .driver-popover-close-btn {
|
||||
color: #9b9b9b;
|
||||
}
|
||||
|
||||
.driver-popover.driverjs-theme .driver-popover-close-btn:hover {
|
||||
color: #000;
|
||||
}
|
||||
.driver-popover.driverjs-theme .driver-popover-footer {
|
||||
gap: 20px;
|
||||
}
|
||||
.driver-popover.driverjs-theme .driver-popover-footer button {
|
||||
background-color: #000 !important;
|
||||
}
|
||||
|
||||
.driver-popover.driverjs-theme .driver-popover-arrow-side-left.driver-popover-arrow {
|
||||
border-left-color: #fde047;
|
||||
}
|
||||
|
||||
.driver-popover.driverjs-theme .driver-popover-arrow-side-right.driver-popover-arrow {
|
||||
border-right-color: #fde047;
|
||||
}
|
||||
|
||||
.driver-popover.driverjs-theme .driver-popover-arrow-side-top.driver-popover-arrow {
|
||||
border-top-color: #fde047;
|
||||
}
|
||||
|
||||
.driver-popover.driverjs-theme .driver-popover-arrow-side-bottom.driver-popover-arrow {
|
||||
border-bottom-color: #fde047;
|
||||
}
|
@ -1,11 +1,10 @@
|
||||
import { html, LitElement } from 'lit'
|
||||
import { LitElement, html, css } from 'lit'
|
||||
import { get, translate, translateUnsafeHTML } from 'lit-translate'
|
||||
import isElectron from 'is-electron'
|
||||
|
||||
import '@polymer/paper-icon-button/paper-icon-button.js'
|
||||
import '@polymer/iron-icons/iron-icons.js'
|
||||
|
||||
// Multi language support
|
||||
import { translate } from '../../translate'
|
||||
|
||||
class CheckForUpdate extends LitElement {
|
||||
static get properties() {
|
||||
return {
|
||||
@ -18,6 +17,11 @@ class CheckForUpdate extends LitElement {
|
||||
this.theme = localStorage.getItem('qortalTheme') ? localStorage.getItem('qortalTheme') : 'light'
|
||||
}
|
||||
|
||||
static styles = [
|
||||
css`
|
||||
`
|
||||
]
|
||||
|
||||
render() {
|
||||
return html`
|
||||
${this.renderUpdateButton()}
|
||||
@ -25,7 +29,6 @@ class CheckForUpdate extends LitElement {
|
||||
}
|
||||
|
||||
firstUpdated() {
|
||||
// ...
|
||||
}
|
||||
|
||||
renderUpdateButton() {
|
||||
@ -45,4 +48,4 @@ class CheckForUpdate extends LitElement {
|
||||
}
|
||||
}
|
||||
|
||||
window.customElements.define('check-for-update', CheckForUpdate)
|
||||
window.customElements.define('check-for-update', CheckForUpdate)
|
||||
|
@ -1,58 +1,82 @@
|
||||
import { Sha256 } from 'asmcrypto.js'
|
||||
|
||||
function sbrk(size, heap) {
|
||||
let brk = 512 * 1024 // stack top
|
||||
let old = brk
|
||||
brk += size
|
||||
if (brk > heap.length) throw new Error('heap exhausted')
|
||||
return old
|
||||
|
||||
function sbrk(size, heap){
|
||||
let brk = 512 * 1024 // stack top
|
||||
let old = brk
|
||||
brk += size
|
||||
|
||||
if (brk > heap.length)
|
||||
throw new Error('heap exhausted')
|
||||
|
||||
return old
|
||||
}
|
||||
|
||||
|
||||
|
||||
self.addEventListener('message', async e => {
|
||||
const response = await computePow(e.data.chatBytes, e.data.path, e.data.difficulty)
|
||||
postMessage(response)
|
||||
const response = await computePow(e.data.chatBytes, e.data.path, e.data.difficulty)
|
||||
postMessage(response)
|
||||
|
||||
})
|
||||
|
||||
|
||||
const memory = new WebAssembly.Memory({ initial: 256, maximum: 256 })
|
||||
const heap = new Uint8Array(memory.buffer)
|
||||
|
||||
|
||||
|
||||
const computePow = async (chatBytes, path, difficulty) => {
|
||||
let response = null
|
||||
await new Promise((resolve, reject) => {
|
||||
const _chatBytesArray = Object.keys(chatBytes).map(function (key) { return chatBytes[key]; })
|
||||
const chatBytesArray = new Uint8Array(_chatBytesArray)
|
||||
const chatBytesHash = new Sha256().process(chatBytesArray).finish().result
|
||||
const hashPtr = sbrk(32, heap)
|
||||
const hashAry = new Uint8Array(memory.buffer, hashPtr, 32)
|
||||
hashAry.set(chatBytesHash)
|
||||
const workBufferLength = 8 * 1024 * 1024
|
||||
const workBufferPtr = sbrk(workBufferLength, heap)
|
||||
const importObject = {
|
||||
env: {
|
||||
memory: memory
|
||||
}
|
||||
}
|
||||
function loadWebAssembly(filename, imports) {
|
||||
// Fetch the file and compile it
|
||||
return fetch(filename)
|
||||
.then(response => response.arrayBuffer())
|
||||
.then(buffer => WebAssembly.compile(buffer))
|
||||
.then(module => {
|
||||
// Create the instance.
|
||||
return new WebAssembly.Instance(module, importObject)
|
||||
})
|
||||
}
|
||||
loadWebAssembly(path)
|
||||
.then(wasmModule => {
|
||||
response = {
|
||||
nonce: wasmModule.exports.compute2(hashPtr, workBufferPtr, workBufferLength, difficulty),
|
||||
chatBytesArray
|
||||
}
|
||||
resolve()
|
||||
})
|
||||
})
|
||||
return response
|
||||
|
||||
let response = null
|
||||
|
||||
await new Promise((resolve, reject)=> {
|
||||
|
||||
const _chatBytesArray = Object.keys(chatBytes).map(function (key) { return chatBytes[key]; });
|
||||
const chatBytesArray = new Uint8Array(_chatBytesArray);
|
||||
const chatBytesHash = new Sha256().process(chatBytesArray).finish().result;
|
||||
const hashPtr = sbrk(32, heap);
|
||||
const hashAry = new Uint8Array(memory.buffer, hashPtr, 32);
|
||||
hashAry.set(chatBytesHash);
|
||||
|
||||
|
||||
const workBufferLength = 8 * 1024 * 1024;
|
||||
const workBufferPtr = sbrk(workBufferLength, heap);
|
||||
|
||||
|
||||
|
||||
const importObject = {
|
||||
env: {
|
||||
memory: memory
|
||||
},
|
||||
};
|
||||
|
||||
function loadWebAssembly(filename, imports) {
|
||||
// Fetch the file and compile it
|
||||
return fetch(filename)
|
||||
.then(response => response.arrayBuffer())
|
||||
.then(buffer => WebAssembly.compile(buffer))
|
||||
.then(module => {
|
||||
|
||||
// Create the instance.
|
||||
return new WebAssembly.Instance(module, importObject);
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
loadWebAssembly(path)
|
||||
.then(wasmModule => {
|
||||
response = {
|
||||
nonce : wasmModule.exports.compute2(hashPtr, workBufferPtr, workBufferLength, difficulty),
|
||||
chatBytesArray
|
||||
}
|
||||
|
||||
resolve()
|
||||
|
||||
});
|
||||
|
||||
|
||||
})
|
||||
|
||||
return response
|
||||
}
|
@ -1,68 +0,0 @@
|
||||
import { Sha256 } from 'asmcrypto.js'
|
||||
|
||||
function sbrk(size, heap) {
|
||||
let brk = 512 * 1024 // stack top
|
||||
let old = brk
|
||||
brk += size
|
||||
if (brk > heap.length) throw new Error('heap exhausted')
|
||||
return old
|
||||
}
|
||||
|
||||
self.addEventListener('message', async e => {
|
||||
const response = await computePow(e.data.convertedBytes, e.data.path)
|
||||
postMessage(response)
|
||||
|
||||
})
|
||||
|
||||
const memory = new WebAssembly.Memory({ initial: 256, maximum: 256 })
|
||||
const heap = new Uint8Array(memory.buffer)
|
||||
|
||||
const computePow = async (convertedBytes, path) => {
|
||||
let response = null
|
||||
await new Promise((resolve, reject) => {
|
||||
const _convertedBytesArray = Object.keys(convertedBytes).map(
|
||||
function (key) {
|
||||
return convertedBytes[key]
|
||||
}
|
||||
)
|
||||
const convertedBytesArray = new Uint8Array(_convertedBytesArray)
|
||||
const convertedBytesHash = new Sha256()
|
||||
.process(convertedBytesArray)
|
||||
.finish().result
|
||||
const hashPtr = sbrk(32, heap)
|
||||
const hashAry = new Uint8Array(
|
||||
memory.buffer,
|
||||
hashPtr,
|
||||
32
|
||||
)
|
||||
hashAry.set(convertedBytesHash)
|
||||
const difficulty = 14
|
||||
const workBufferLength = 8 * 1024 * 1024
|
||||
const workBufferPtr = sbrk(
|
||||
workBufferLength,
|
||||
heap
|
||||
)
|
||||
const importObject = {
|
||||
env: {
|
||||
memory: memory
|
||||
}
|
||||
}
|
||||
function loadWebAssembly(filename, imports) {
|
||||
return fetch(filename)
|
||||
.then(response => response.arrayBuffer())
|
||||
.then(buffer => WebAssembly.compile(buffer))
|
||||
.then(module => {
|
||||
return new WebAssembly.Instance(module, importObject)
|
||||
})
|
||||
}
|
||||
loadWebAssembly(path)
|
||||
.then(wasmModule => {
|
||||
response = {
|
||||
nonce: wasmModule.exports.compute2(hashPtr, workBufferPtr, workBufferLength, difficulty),
|
||||
|
||||
}
|
||||
resolve()
|
||||
})
|
||||
})
|
||||
return response
|
||||
}
|
@ -1,303 +0,0 @@
|
||||
import { html, LitElement } from 'lit'
|
||||
import { connect } from 'pwa-helpers'
|
||||
import { store } from '../../store'
|
||||
import { parentEpml } from '../show-plugin'
|
||||
import { setCoinBalances } from '../../redux/app/app-actions'
|
||||
|
||||
class CoinBalancesController extends connect(store)(LitElement) {
|
||||
static get properties() {
|
||||
return {
|
||||
coinList: { type: Object }
|
||||
}
|
||||
}
|
||||
|
||||
constructor() {
|
||||
super();
|
||||
this.coinList = {}
|
||||
this.nodeUrl = this.getNodeUrl()
|
||||
this.myNode = this.getMyNode()
|
||||
this.fetchBalance = this.fetchBalance.bind(this)
|
||||
this._updateCoinList = this._updateCoinList.bind(this)
|
||||
this.stop = false
|
||||
}
|
||||
|
||||
render() {
|
||||
return html``
|
||||
}
|
||||
|
||||
getNodeUrl() {
|
||||
const myNode = store.getState().app.nodeConfig.knownNodes[store.getState().app.nodeConfig.node]
|
||||
return myNode.protocol + '://' + myNode.domain + ':' + myNode.port
|
||||
}
|
||||
|
||||
getMyNode() {
|
||||
return store.getState().app.nodeConfig.knownNodes[store.getState().app.nodeConfig.node]
|
||||
}
|
||||
|
||||
async updateQortWalletBalance() {
|
||||
let qortAddress = store.getState().app.selectedAddress.address
|
||||
|
||||
await parentEpml.request('apiCall', {
|
||||
url: `/addresses/balance/${qortAddress}?apiKey=${this.myNode.apiKey}`,
|
||||
}).then((res) => {
|
||||
this.qortWalletBalance = res
|
||||
store.dispatch(
|
||||
setCoinBalances({
|
||||
type: 'qort',
|
||||
fullValue: Number(res)
|
||||
})
|
||||
)
|
||||
}).catch(() => {
|
||||
console.log('error')
|
||||
})
|
||||
}
|
||||
|
||||
async updateBtcWalletBalance() {
|
||||
let _url = `/crosschain/btc/walletbalance?apiKey=${this.myNode.apiKey}`
|
||||
let _body = store.getState().app.selectedAddress.btcWallet.derivedMasterPublicKey
|
||||
|
||||
await parentEpml.request('apiCall', {
|
||||
url: _url,
|
||||
method: 'POST',
|
||||
body: _body
|
||||
}).then((res) => {
|
||||
if (isNaN(Number(res))) {
|
||||
//...
|
||||
} else {
|
||||
this.btcWalletBalance = (Number(res) / 1e8).toFixed(8)
|
||||
store.dispatch(
|
||||
setCoinBalances({
|
||||
type: 'btc',
|
||||
fullValue: Number(res)
|
||||
})
|
||||
)
|
||||
}
|
||||
}).catch(() => {
|
||||
console.log('error')
|
||||
})
|
||||
}
|
||||
|
||||
async updateLtcWalletBalance() {
|
||||
let _url = `/crosschain/ltc/walletbalance?apiKey=${this.myNode.apiKey}`
|
||||
let _body = store.getState().app.selectedAddress.ltcWallet.derivedMasterPublicKey
|
||||
|
||||
await parentEpml.request('apiCall', {
|
||||
url: _url,
|
||||
method: 'POST',
|
||||
body: _body
|
||||
}).then((res) => {
|
||||
if (isNaN(Number(res))) {
|
||||
//...
|
||||
} else {
|
||||
this.ltcWalletBalance = (Number(res) / 1e8).toFixed(8)
|
||||
store.dispatch(
|
||||
setCoinBalances({
|
||||
type: 'ltc',
|
||||
fullValue: Number(res)
|
||||
})
|
||||
)
|
||||
|
||||
}
|
||||
}).catch(() => {
|
||||
console.log('error')
|
||||
})
|
||||
}
|
||||
|
||||
async updateDogeWalletBalance() {
|
||||
let _url = `/crosschain/doge/walletbalance?apiKey=${this.myNode.apiKey}`
|
||||
let _body = store.getState().app.selectedAddress.dogeWallet.derivedMasterPublicKey
|
||||
|
||||
await parentEpml.request('apiCall', {
|
||||
url: _url,
|
||||
method: 'POST',
|
||||
body: _body
|
||||
}).then((res) => {
|
||||
if (isNaN(Number(res))) {
|
||||
//...
|
||||
} else {
|
||||
this.dogeWalletBalance = (Number(res) / 1e8).toFixed(8)
|
||||
store.dispatch(
|
||||
setCoinBalances({
|
||||
type: 'doge',
|
||||
fullValue: Number(res)
|
||||
})
|
||||
)
|
||||
}
|
||||
}).catch(() => {
|
||||
console.log('error')
|
||||
})
|
||||
}
|
||||
|
||||
async updateDgbWalletBalance() {
|
||||
let _url = `/crosschain/dgb/walletbalance?apiKey=${this.myNode.apiKey}`
|
||||
let _body = store.getState().app.selectedAddress.dgbWallet.derivedMasterPublicKey
|
||||
|
||||
await parentEpml.request('apiCall', {
|
||||
url: _url,
|
||||
method: 'POST',
|
||||
body: _body
|
||||
}).then((res) => {
|
||||
if (isNaN(Number(res))) {
|
||||
//...
|
||||
} else {
|
||||
this.dgbWalletBalance = (Number(res) / 1e8).toFixed(8)
|
||||
store.dispatch(
|
||||
setCoinBalances({
|
||||
type: 'dgb',
|
||||
fullValue: Number(res)
|
||||
})
|
||||
)
|
||||
}
|
||||
}).catch(() => {
|
||||
console.log('error')
|
||||
})
|
||||
}
|
||||
|
||||
async updateRvnWalletBalance() {
|
||||
let _url = `/crosschain/rvn/walletbalance?apiKey=${this.myNode.apiKey}`
|
||||
let _body = store.getState().app.selectedAddress.rvnWallet.derivedMasterPublicKey
|
||||
|
||||
await parentEpml.request('apiCall', {
|
||||
url: _url,
|
||||
method: 'POST',
|
||||
body: _body
|
||||
}).then((res) => {
|
||||
if (isNaN(Number(res))) {
|
||||
//...
|
||||
} else {
|
||||
this.rvnWalletBalance = (Number(res) / 1e8).toFixed(8)
|
||||
store.dispatch(
|
||||
setCoinBalances({
|
||||
type: 'rvn',
|
||||
fullValue: Number(res)
|
||||
})
|
||||
)
|
||||
}
|
||||
}).catch(() => {
|
||||
console.log('error')
|
||||
})
|
||||
}
|
||||
|
||||
async updateArrrWalletBalance() {
|
||||
let _url = `/crosschain/arrr/walletbalance?apiKey=${this.myNode.apiKey}`
|
||||
let _body = store.getState().app.selectedAddress.arrrWallet.seed58
|
||||
|
||||
await parentEpml.request('apiCall', {
|
||||
url: _url,
|
||||
method: 'POST',
|
||||
body: _body,
|
||||
}).then((res) => {
|
||||
if (isNaN(Number(res))) {
|
||||
//...
|
||||
} else {
|
||||
this.arrrWalletBalance = (Number(res) / 1e8).toFixed(8)
|
||||
store.dispatch(
|
||||
setCoinBalances({
|
||||
type: 'arrr',
|
||||
fullValue: Number(res)
|
||||
})
|
||||
)
|
||||
}
|
||||
}).catch(() => {
|
||||
console.log('error')
|
||||
})
|
||||
}
|
||||
|
||||
_updateCoinList(event) {
|
||||
const copyCoinList = { ...this.coinList }
|
||||
const coin = event.detail
|
||||
|
||||
if (!copyCoinList[coin]) {
|
||||
try {
|
||||
if (coin === 'qort') {
|
||||
this.updateQortWalletBalance()
|
||||
} else if (coin === 'btc') {
|
||||
this.updateBtcWalletBalance()
|
||||
} else if (coin === 'ltc') {
|
||||
this.updateLtcWalletBalance()
|
||||
} else if (coin === 'doge') {
|
||||
this.updateDogeWalletBalance()
|
||||
} else if (coin === 'dgb') {
|
||||
this.updateDgbWalletBalance()
|
||||
} else if (coin === 'rvn') {
|
||||
this.updateRvnWalletBalance()
|
||||
} else if (coin === 'arrr') {
|
||||
this.updateArrrWalletBalance()
|
||||
}
|
||||
} catch (error) { }
|
||||
}
|
||||
|
||||
copyCoinList[coin] = Date.now() + 120000
|
||||
|
||||
this.coinList = copyCoinList
|
||||
this.requestUpdate()
|
||||
}
|
||||
|
||||
async fetchCoins(arrayOfCoins) {
|
||||
const getCoinBalances = (arrayOfCoins || []).map(async (coin) => {
|
||||
if (coin === 'qort') {
|
||||
await this.updateQortWalletBalance()
|
||||
} else if (coin === 'btc') {
|
||||
await this.updateBtcWalletBalance()
|
||||
} else if (coin === 'ltc') {
|
||||
await this.updateLtcWalletBalance()
|
||||
} else if (coin === 'doge') {
|
||||
await this.updateDogeWalletBalance()
|
||||
} else if (coin === 'dgb') {
|
||||
await this.updateDgbWalletBalance()
|
||||
} else if (coin === 'rvn') {
|
||||
await this.updateRvnWalletBalance()
|
||||
} else if (coin === 'arrr') {
|
||||
await this.updateArrrWalletBalance()
|
||||
}
|
||||
})
|
||||
|
||||
await Promise.all(getCoinBalances)
|
||||
}
|
||||
|
||||
async fetchBalance() {
|
||||
try {
|
||||
let arrayOfCoins = []
|
||||
|
||||
const copyObject = { ...this.coinList }
|
||||
const currentDate = Date.now()
|
||||
const array = Object.keys(this.coinList)
|
||||
|
||||
for (const key of array) {
|
||||
const item = this.coinList[key]
|
||||
|
||||
if (item < currentDate) {
|
||||
delete copyObject[key]
|
||||
} else {
|
||||
arrayOfCoins.push(key)
|
||||
}
|
||||
}
|
||||
|
||||
if (!this.stop) {
|
||||
this.stop = true
|
||||
|
||||
await this.fetchCoins(arrayOfCoins)
|
||||
|
||||
this.stop = false
|
||||
}
|
||||
|
||||
this.coinList = copyObject
|
||||
} catch (error) {
|
||||
this.stop = false
|
||||
}
|
||||
}
|
||||
|
||||
connectedCallback() {
|
||||
super.connectedCallback()
|
||||
this.intervalID = setInterval(this.fetchBalance, 45000)
|
||||
window.addEventListener('ping-coin-controller-with-coin', this._updateCoinList)
|
||||
}
|
||||
|
||||
disconnectedCallback() {
|
||||
if (this.intervalID) { clearInterval(this.intervalID) }
|
||||
window.removeEventListener('ping-coin-controller-with-coin', this._updateCoinList)
|
||||
super.disconnectedCallback()
|
||||
}
|
||||
}
|
||||
|
||||
window.customElements.define('coin-balances-controller', CoinBalancesController)
|
@ -1,204 +0,0 @@
|
||||
import { html, LitElement } from 'lit'
|
||||
import { connect } from 'pwa-helpers'
|
||||
import { store } from '../../store'
|
||||
import { get } from '../../../translate'
|
||||
import { chatSideNavHeadsStyles } from '../../styles/core-css'
|
||||
import './friend-item-actions'
|
||||
import '@material/mwc-icon'
|
||||
import '@vaadin/tooltip'
|
||||
|
||||
class ChatSideNavHeads extends connect(store)(LitElement) {
|
||||
static get properties() {
|
||||
return {
|
||||
selectedAddress: { type: Object },
|
||||
config: { type: Object },
|
||||
chatInfo: { type: Object },
|
||||
iconName: { type: String },
|
||||
activeChatHeadUrl: { type: String },
|
||||
isImageLoaded: { type: Boolean },
|
||||
setActiveChatHeadUrl: { attribute: false },
|
||||
openEditFriend: { attribute: false },
|
||||
closeSidePanel: { attribute: false, type: Object }
|
||||
}
|
||||
}
|
||||
|
||||
static get styles() {
|
||||
return [chatSideNavHeadsStyles]
|
||||
}
|
||||
|
||||
constructor() {
|
||||
super()
|
||||
this.selectedAddress = {}
|
||||
this.config = {
|
||||
user: {
|
||||
node: {
|
||||
}
|
||||
}
|
||||
}
|
||||
this.chatInfo = {}
|
||||
this.iconName = ''
|
||||
this.activeChatHeadUrl = ''
|
||||
this.isImageLoaded = false
|
||||
this.imageFetches = 0
|
||||
}
|
||||
|
||||
render() {
|
||||
let avatarImg = ''
|
||||
|
||||
if (this.chatInfo.name) {
|
||||
const myNode = store.getState().app.nodeConfig.knownNodes[store.getState().app.nodeConfig.node]
|
||||
const nodeUrl = myNode.protocol + '://' + myNode.domain + ':' + myNode.port
|
||||
const avatarUrl = `${nodeUrl}/arbitrary/THUMBNAIL/${this.chatInfo.name}/qortal_avatar?async=true`
|
||||
avatarImg = this.createImage(avatarUrl)
|
||||
}
|
||||
|
||||
return html`
|
||||
<li
|
||||
style="display:flex; justify-content: space-between; align-items: center"
|
||||
@click=${(e) => {
|
||||
const target = e.target
|
||||
const popover = this.shadowRoot.querySelector('friend-item-actions');
|
||||
if (popover) {
|
||||
popover.openPopover(target);
|
||||
}
|
||||
}}
|
||||
class="clearfix" id=${`friend-item-parent-${this.chatInfo.name}`}
|
||||
>
|
||||
<div style="display:flex; flex-grow: 1; align-items: center">
|
||||
${this.isImageLoaded ? html`${avatarImg}` : html``}
|
||||
${!this.isImageLoaded && !this.chatInfo.name && !this.chatInfo.groupName ?
|
||||
html`
|
||||
<mwc-icon class="img-icon">account_circle</mwc-icon>
|
||||
`
|
||||
: html``
|
||||
}
|
||||
${!this.isImageLoaded && this.chatInfo.name ?
|
||||
html`
|
||||
<div
|
||||
style="width:30px; height:30px; float: left; border-radius:50%; background: ${this.activeChatHeadUrl === this.chatInfo.url
|
||||
? "var(--chatHeadBgActive)"
|
||||
: "var(--chatHeadBg)"}; color: ${this.activeChatHeadUrl === this.chatInfo.url
|
||||
? "var(--chatHeadTextActive)"
|
||||
: "var(--chatHeadText)"}; font-weight:bold; display: flex; justify-content: center; align-items: center; text-transform: capitalize"
|
||||
>
|
||||
${this.chatInfo.name.charAt(0)}
|
||||
</div>
|
||||
` : ''
|
||||
}
|
||||
${!this.isImageLoaded && this.chatInfo.groupName ?
|
||||
html`
|
||||
<div
|
||||
style="width:30px; height:30px; float: left; border-radius:50%; background: ${this.activeChatHeadUrl === this.chatInfo.url
|
||||
? "var(--chatHeadBgActive)"
|
||||
: "var(--chatHeadBg)"}; color: ${this.activeChatHeadUrl === this.chatInfo.url
|
||||
? "var(--chatHeadTextActive)"
|
||||
: "var(--chatHeadText)"}; font-weight:bold; display: flex; justify-content: center; align-items: center; text-transform: capitalize"
|
||||
>
|
||||
${this.chatInfo.groupName.charAt(0)}
|
||||
</div>
|
||||
` : ''
|
||||
}
|
||||
<div>
|
||||
<div class="name">
|
||||
<span style="float:left; padding-left: 8px; color: var(--chat-group);">
|
||||
${this.chatInfo.groupName
|
||||
? this.chatInfo.groupName
|
||||
: this.chatInfo.name !== undefined
|
||||
? (this.chatInfo.alias || this.chatInfo.name)
|
||||
: this.chatInfo.address.substr(0, 15)
|
||||
}
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div style="display:flex; align-items: center">
|
||||
${this.chatInfo.willFollow ?
|
||||
html`
|
||||
<mwc-icon id="willFollowIcon" style="color: var(--black)">connect_without_contact</mwc-icon>
|
||||
<vaadin-tooltip
|
||||
for="willFollowIcon"
|
||||
position="top"
|
||||
hover-delay=${200}
|
||||
hide-delay=${1}
|
||||
text=${get('friends.friend11')}
|
||||
></vaadin-tooltip>
|
||||
` : ''
|
||||
}
|
||||
</div>
|
||||
</li>
|
||||
<friend-item-actions
|
||||
for=${`friend-item-parent-${this.chatInfo.name}`}
|
||||
message=${get('notifications.explanation')}
|
||||
.openEditFriend=${() => {
|
||||
this.openEditFriend(this.chatInfo)
|
||||
}}
|
||||
name=${this.chatInfo.name}
|
||||
.closeSidePanel=${this.closeSidePanel}
|
||||
></friend-item-actions>
|
||||
`
|
||||
}
|
||||
|
||||
firstUpdated() {
|
||||
// ...
|
||||
}
|
||||
|
||||
createImage(imageUrl) {
|
||||
const imageHTMLRes = new Image()
|
||||
imageHTMLRes.src = imageUrl
|
||||
imageHTMLRes.style = "width:30px; height:30px; float: left; border-radius:50%; font-size:14px"
|
||||
|
||||
imageHTMLRes.onclick = () => {
|
||||
this.openDialogImage = true
|
||||
}
|
||||
|
||||
imageHTMLRes.onload = () => {
|
||||
this.isImageLoaded = true
|
||||
}
|
||||
|
||||
imageHTMLRes.onerror = () => {
|
||||
if (this.imageFetches < 4) {
|
||||
setTimeout(() => {
|
||||
this.imageFetches = this.imageFetches + 1
|
||||
imageHTMLRes.src = imageUrl
|
||||
}, 500)
|
||||
} else {
|
||||
this.isImageLoaded = false
|
||||
}
|
||||
}
|
||||
|
||||
return imageHTMLRes
|
||||
}
|
||||
|
||||
shouldUpdate(changedProperties) {
|
||||
if (changedProperties.has('activeChatHeadUrl')) {
|
||||
return true
|
||||
}
|
||||
|
||||
if (changedProperties.has('chatInfo')) {
|
||||
return true
|
||||
}
|
||||
|
||||
return !!changedProperties.has('isImageLoaded')
|
||||
}
|
||||
|
||||
getUrl(chatUrl) {
|
||||
this.setActiveChatHeadUrl(chatUrl)
|
||||
}
|
||||
|
||||
// Standard functions
|
||||
getApiKey() {
|
||||
const coreNode = store.getState().app.nodeConfig.knownNodes[store.getState().app.nodeConfig.node]
|
||||
return coreNode.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-side-nav-heads', ChatSideNavHeads)
|
@ -1,295 +0,0 @@
|
||||
import { html, LitElement } from 'lit'
|
||||
import { connect } from 'pwa-helpers'
|
||||
import { store } from '../../store'
|
||||
import { translate, } from '../../../translate'
|
||||
import { addFriendsModalStyles } from '../../styles/core-css'
|
||||
import '@material/mwc-button'
|
||||
import '@material/mwc-checkbox'
|
||||
import '@material/mwc-dialog'
|
||||
import '@polymer/paper-spinner/paper-spinner-lite.js'
|
||||
|
||||
class AddFriendsModal extends connect(store)(LitElement) {
|
||||
static get properties() {
|
||||
return {
|
||||
isOpen: { type: Boolean },
|
||||
setIsOpen: { attribute: false },
|
||||
isLoading: { type: Boolean },
|
||||
userSelected: { type: Object },
|
||||
alias: { type: String },
|
||||
willFollow: { type: Boolean },
|
||||
notes: { type: String },
|
||||
onSubmit: { attribute: false },
|
||||
editContent: { type: Object },
|
||||
onClose: { attribute: false },
|
||||
mySelectedFeeds: { type: Array },
|
||||
availableFeeedSchemas: { type: Array },
|
||||
isLoadingSchemas: { type: Boolean }
|
||||
}
|
||||
}
|
||||
|
||||
static get styles() {
|
||||
return [addFriendsModalStyles]
|
||||
}
|
||||
|
||||
constructor() {
|
||||
super()
|
||||
this.isOpen = false
|
||||
this.isLoading = false
|
||||
this.alias = ''
|
||||
this.willFollow = true
|
||||
this.notes = ''
|
||||
this.nodeUrl = this.getNodeUrl()
|
||||
this.myNode = this.getMyNode()
|
||||
this.mySelectedFeeds = []
|
||||
this.availableFeeedSchemas = []
|
||||
this.isLoadingSchemas = false
|
||||
}
|
||||
|
||||
render() {
|
||||
return html`
|
||||
<div class="modal-overlay ${this.isOpen ? '' : 'hidden'}">
|
||||
<div class="modal-content">
|
||||
<div class="inner-content">
|
||||
<div style="text-align:center">
|
||||
<h1>
|
||||
${this.editContent
|
||||
? translate('friends.friend10')
|
||||
: translate('friends.friend2')}
|
||||
</h1>
|
||||
<hr />
|
||||
</div>
|
||||
<p>${translate('friends.friend3')}</p>
|
||||
<div class="checkbox-row">
|
||||
<label
|
||||
for="willFollow"
|
||||
id="willFollowLabel"
|
||||
style="color: var(--black);"
|
||||
>
|
||||
${translate('friends.friend5')}
|
||||
</label>
|
||||
<mwc-checkbox
|
||||
style="margin-right: -15px;"
|
||||
id="willFollow"
|
||||
@change=${(e) => {
|
||||
this.willFollow = e.target.checked;
|
||||
}}
|
||||
?checked=${this.willFollow}
|
||||
></mwc-checkbox>
|
||||
</div>
|
||||
<div style="height:15px"></div>
|
||||
<div style="display: flex;flex-direction: column;">
|
||||
<label
|
||||
for="name"
|
||||
id="nameLabel"
|
||||
style="color: var(--black);"
|
||||
>
|
||||
${translate('login.name')}
|
||||
</label>
|
||||
<input
|
||||
id="name"
|
||||
class="input"
|
||||
?disabled=${true}
|
||||
value=${this.userSelected ? this.userSelected.name : ''}
|
||||
/>
|
||||
</div>
|
||||
<div style="height:15px"></div>
|
||||
<div style="display: flex;flex-direction: column;">
|
||||
<label
|
||||
for="alias"
|
||||
id="aliasLabel"
|
||||
style="color: var(--black);"
|
||||
>
|
||||
${translate('friends.friend6')}
|
||||
</label>
|
||||
<input
|
||||
id="alias"
|
||||
placeholder=${translate('friends.friend7')}
|
||||
class="input"
|
||||
.value=${this.alias}
|
||||
@change=${(e) => {
|
||||
this.alias = e.target.value
|
||||
}}
|
||||
/>
|
||||
</div>
|
||||
<div style="height:15px"></div>
|
||||
<div style="margin-bottom:0;">
|
||||
<textarea
|
||||
class="input"
|
||||
@change=${(e) => {
|
||||
this.notes = e.target.value
|
||||
}}
|
||||
.value=${this.notes}
|
||||
?disabled=${this.isLoading}
|
||||
id="messageBoxAddFriend"
|
||||
placeholder="${translate('friends.friend4')}"
|
||||
rows="3"
|
||||
></textarea>
|
||||
</div>
|
||||
<div style="height:15px"></div>
|
||||
<h2>${translate('friends.friend15')}</h2>
|
||||
<div style="margin-bottom:0;">
|
||||
<p>${translate('friends.friend16')}</p>
|
||||
</div>
|
||||
<div>
|
||||
${this.isLoadingSchemas ?
|
||||
html`
|
||||
<div style="width:100%;display: flex; justify-content:center">
|
||||
<paper-spinner-lite active></paper-spinner-lite>
|
||||
</div>
|
||||
` : ''
|
||||
}
|
||||
${this.availableFeeedSchemas.map((schema) => {
|
||||
const isAlreadySelected = this.mySelectedFeeds.find((item) => item.name === schema.name);
|
||||
let avatarImgApp;
|
||||
const avatarUrl2 = `${this.nodeUrl}/arbitrary/THUMBNAIL/${schema.name}/qortal_avatar?async=true&apiKey=${this.myNode.apiKey}`;
|
||||
avatarImgApp = html`<img src="${avatarUrl2}" style="max-width:100%; max-height:100%;" onerror="this.onerror=null; this.src='/img/incognito.png';"/>`;
|
||||
return html`
|
||||
<div
|
||||
class="app-name"
|
||||
style="background:${isAlreadySelected ? 'lightblue' : ''}"
|
||||
@click=${() => {
|
||||
const copymySelectedFeeds = [...this.mySelectedFeeds];
|
||||
const findIndex = copymySelectedFeeds.findIndex((item) => item.name === schema.name);
|
||||
if (findIndex === -1) {
|
||||
if (this.mySelectedFeeds.length > 4) return
|
||||
copymySelectedFeeds.push({name: schema.name, identifier: schema.identifier, service: schema.service});
|
||||
this.mySelectedFeeds = copymySelectedFeeds;
|
||||
} else {
|
||||
this.mySelectedFeeds = copymySelectedFeeds.filter((item) => item.name !== schema.name);
|
||||
}
|
||||
}}
|
||||
>
|
||||
<div class="avatar">${avatarImgApp}</div>
|
||||
<span style="color:${isAlreadySelected ? 'var(--white)' : 'var(--black)'};font-size:16px">${schema.name}</span>
|
||||
</div>
|
||||
`
|
||||
})}
|
||||
</div>
|
||||
</div>
|
||||
<div style="display:flex;justify-content:space-between;align-items:center;margin-top:20px">
|
||||
<button
|
||||
class="modal-button-red"
|
||||
?disabled="${this.isLoading}"
|
||||
@click="${() => {
|
||||
this.setIsOpen(false);
|
||||
this.clearFields();
|
||||
this.onClose();
|
||||
}}"
|
||||
>
|
||||
${translate('general.close')}
|
||||
</button>
|
||||
${this.editContent ?
|
||||
html`
|
||||
<button ?disabled="${this.isLoading}" class="modal-button-red" @click=${() => {this.removeFriend();}}>
|
||||
${translate('friends.friend14')}
|
||||
</button>
|
||||
` : ''
|
||||
}
|
||||
<button ?disabled="${this.isLoading}" class="modal-button" @click=${() => {this.addFriend();}}>
|
||||
${this.editContent ? translate('friends.friend10') : translate('friends.friend2')}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
`
|
||||
}
|
||||
|
||||
firstUpdated() {
|
||||
// ...
|
||||
}
|
||||
|
||||
getNodeUrl() {
|
||||
const myNode = store.getState().app.nodeConfig.knownNodes[store.getState().app.nodeConfig.node]
|
||||
return myNode.protocol + '://' + myNode.domain + ':' + myNode.port
|
||||
}
|
||||
|
||||
getMyNode() {
|
||||
return store.getState().app.nodeConfig.knownNodes[store.getState().app.nodeConfig.node]
|
||||
}
|
||||
|
||||
clearFields() {
|
||||
this.alias = ''
|
||||
this.willFollow = true
|
||||
this.notes = ''
|
||||
}
|
||||
|
||||
addFriend() {
|
||||
this.onSubmit({
|
||||
name: this.userSelected.name,
|
||||
alias: this.alias,
|
||||
notes: this.notes,
|
||||
willFollow: this.willFollow,
|
||||
mySelectedFeeds: this.mySelectedFeeds
|
||||
})
|
||||
|
||||
this.clearFields()
|
||||
this.onClose()
|
||||
}
|
||||
|
||||
removeFriend() {
|
||||
this.onSubmit(
|
||||
{
|
||||
name: this.userSelected.name,
|
||||
alias: this.alias,
|
||||
notes: this.notes,
|
||||
willFollow: this.willFollow,
|
||||
mySelectedFeeds: this.mySelectedFeeds
|
||||
},
|
||||
true
|
||||
)
|
||||
|
||||
this.clearFields()
|
||||
this.onClose()
|
||||
}
|
||||
|
||||
async updated(changedProperties) {
|
||||
if (changedProperties && changedProperties.has('editContent') && this.editContent) {
|
||||
this.userSelected = { name: this.editContent.name ?? '' }
|
||||
this.notes = this.editContent.notes ?? ''
|
||||
this.willFollow = this.editContent.willFollow ?? true
|
||||
this.alias = this.editContent.alias ?? ''
|
||||
this.requestUpdate()
|
||||
}
|
||||
|
||||
if (changedProperties && changedProperties.has('isOpen') && this.isOpen) {
|
||||
await this.getAvailableFeedSchemas()
|
||||
}
|
||||
}
|
||||
|
||||
async getAvailableFeedSchemas() {
|
||||
try {
|
||||
this.isLoadingSchemas = true
|
||||
const url = `${this.nodeUrl}/arbitrary/resources/search?service=DOCUMENT&identifier=ui_schema_feed&prefix=true`
|
||||
const res = await fetch(url)
|
||||
const data = await res.json()
|
||||
|
||||
if (data.error === 401) {
|
||||
this.availableFeeedSchemas = []
|
||||
} else {
|
||||
this.availableFeeedSchemas = data.filter((item) => item.identifier === 'ui_schema_feed')
|
||||
}
|
||||
|
||||
this.userFoundModalOpen = true
|
||||
} catch (error) {
|
||||
} finally {
|
||||
this.isLoadingSchemas = false
|
||||
}
|
||||
}
|
||||
|
||||
// Standard functions
|
||||
getApiKey() {
|
||||
const coreNode = store.getState().app.nodeConfig.knownNodes[store.getState().app.nodeConfig.node]
|
||||
return coreNode.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('add-friends-modal', AddFriendsModal)
|
@ -1,228 +0,0 @@
|
||||
import { html, LitElement } from 'lit'
|
||||
import { connect } from 'pwa-helpers'
|
||||
import { store } from '../../store'
|
||||
import { RequestQueueWithPromise } from '../../../../plugins/plugins/utils/classes'
|
||||
import { avatarComponentStyles } from '../../styles/core-css'
|
||||
import axios from 'axios'
|
||||
import ShortUniqueId from 'short-unique-id'
|
||||
import '../../../../plugins/plugins/core/components/TimeAgo'
|
||||
import '@material/mwc-menu'
|
||||
import '@material/mwc-list/mwc-list-item.js'
|
||||
|
||||
const requestQueue = new RequestQueueWithPromise(3)
|
||||
const requestQueueRawData = new RequestQueueWithPromise(3)
|
||||
const requestQueueStatus = new RequestQueueWithPromise(3)
|
||||
|
||||
export class AvatarComponent extends connect(store)(LitElement) {
|
||||
static get properties() {
|
||||
return {
|
||||
resource: { type: Object },
|
||||
isReady: { type: Boolean },
|
||||
status: { type: Object },
|
||||
name: { type: String }
|
||||
}
|
||||
}
|
||||
|
||||
static get styles() {
|
||||
return [avatarComponentStyles]
|
||||
}
|
||||
|
||||
constructor() {
|
||||
super()
|
||||
this.resource = {
|
||||
identifier: '',
|
||||
name: '',
|
||||
service: ''
|
||||
}
|
||||
this.status = {
|
||||
status: ''
|
||||
}
|
||||
this.isReady = false
|
||||
this.nodeUrl = this.getNodeUrl()
|
||||
this.myNode = this.getMyNode()
|
||||
this.isFetching = false
|
||||
this.uid = new ShortUniqueId()
|
||||
}
|
||||
|
||||
render() {
|
||||
return html`
|
||||
<div>
|
||||
${this.status.status !== 'READY' ?
|
||||
html`
|
||||
<mwc-icon style="user-select:none;">account_circle</mwc-icon>
|
||||
` : ''
|
||||
}
|
||||
${this.status.status === 'READY' ?
|
||||
html`
|
||||
<div style="height: 24px;width: 24px;overflow: hidden;">
|
||||
<img
|
||||
src="${this.nodeUrl}/arbitrary/THUMBNAIL/${this.name}/qortal_avatar?async=true&apiKey=${this.myNode.apiKey}"
|
||||
style="width:100%; height:100%;border-radius:50%"
|
||||
onerror="this.onerror=null; this.src='/img/incognito.png';"
|
||||
/>
|
||||
</div>
|
||||
` : ''
|
||||
}
|
||||
</div>
|
||||
`
|
||||
}
|
||||
|
||||
firstUpdated() {
|
||||
this._fetchImage()
|
||||
}
|
||||
|
||||
getNodeUrl() {
|
||||
const myNode = store.getState().app.nodeConfig.knownNodes[store.getState().app.nodeConfig.node]
|
||||
return myNode.protocol + '://' + myNode.domain + ':' + myNode.port
|
||||
}
|
||||
|
||||
getMyNode() {
|
||||
return store.getState().app.nodeConfig.knownNodes[store.getState().app.nodeConfig.node]
|
||||
}
|
||||
|
||||
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}?apiKey=${this.myNode.apiKey}`
|
||||
)
|
||||
|
||||
this.isFetching = false
|
||||
} catch (error) {
|
||||
this.isFetching = false
|
||||
}
|
||||
}
|
||||
|
||||
async fetchVideoUrl() {
|
||||
await this.fetchResource()
|
||||
}
|
||||
|
||||
async getRawData() {
|
||||
const url = `${this.nodeUrl}/arbitrary/${this.resource.service}/${this.resource.name}/${this.resource.identifier}?apiKey=${this.myNode.apiKey}`
|
||||
|
||||
return await requestQueueRawData.enqueue(() => {
|
||||
return axios.get(url)
|
||||
})
|
||||
}
|
||||
|
||||
updateDisplayWithPlaceholders(display, resource, rawdata) {
|
||||
const pattern = /\$\$\{([a-zA-Z0-9_\.]+)\}\$\$/g
|
||||
|
||||
for (const key in display) {
|
||||
const value = display[key]
|
||||
|
||||
display[key] = value.replace(pattern, (match, p1) => {
|
||||
if (p1.startsWith('rawdata.')) {
|
||||
const dataKey = p1.split('.')[1]
|
||||
|
||||
if (rawdata[dataKey] === undefined) {
|
||||
console.error('rawdata key not found:', dataKey)
|
||||
}
|
||||
|
||||
return rawdata[dataKey] || match
|
||||
} else if (p1.startsWith('resource.')) {
|
||||
const resourceKey = p1.split('.')[1]
|
||||
|
||||
if (resource[resourceKey] === undefined) {
|
||||
console.error('resource key not found:', resourceKey)
|
||||
}
|
||||
|
||||
return resource[resourceKey] || match
|
||||
}
|
||||
|
||||
return match
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
async fetchStatus() {
|
||||
let isCalling = false
|
||||
let percentLoaded = 0
|
||||
let timer = 24
|
||||
|
||||
const response = await requestQueueStatus.enqueue(() => {
|
||||
return axios.get(
|
||||
`${this.nodeUrl}/arbitrary/resource/status/${this.resource.service}/${this.resource.name}/${this.resource.identifier}?apiKey=${this.myNode.apiKey}`
|
||||
)
|
||||
})
|
||||
|
||||
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}?apiKey=${this.myNode.apiKey}`
|
||||
)
|
||||
})
|
||||
|
||||
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) {
|
||||
clearInterval(intervalId)
|
||||
}
|
||||
|
||||
percentLoaded = res.percentLoaded
|
||||
}
|
||||
|
||||
this.status = res
|
||||
|
||||
if (this.status.status === 'DOWNLOADED') {
|
||||
await 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 _fetchImage() {
|
||||
try {
|
||||
await this.fetchVideoUrl()
|
||||
await this.fetchStatus()
|
||||
} catch (error) {
|
||||
/* empty */
|
||||
}
|
||||
}
|
||||
|
||||
// Standard functions
|
||||
getApiKey() {
|
||||
const coreNode = store.getState().app.nodeConfig.knownNodes[store.getState().app.nodeConfig.node]
|
||||
return coreNode.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('avatar-component', AvatarComponent)
|
@ -1,214 +0,0 @@
|
||||
import { html, LitElement } from 'lit'
|
||||
import { connect } from 'pwa-helpers'
|
||||
import { store } from '../../store'
|
||||
import { setNewTab } from '../../redux/app/app-actions'
|
||||
import { get } from '../../../translate'
|
||||
import { beginnerChecklistStyles } from '../../styles/core-css'
|
||||
import ShortUniqueId from 'short-unique-id'
|
||||
import '../notification-view/popover'
|
||||
import '../../../../plugins/plugins/core/components/TimeAgo'
|
||||
import '@material/mwc-icon'
|
||||
import '@polymer/paper-icon-button/paper-icon-button.js'
|
||||
import '@polymer/iron-icons/iron-icons.js'
|
||||
import '@vaadin/item'
|
||||
import '@vaadin/list-box'
|
||||
|
||||
class BeginnerChecklist extends connect(store)(LitElement) {
|
||||
static get properties() {
|
||||
return {
|
||||
notifications: { type: Array },
|
||||
showChecklist: { type: Boolean },
|
||||
isSynced: { type: Boolean },
|
||||
hasName: { type: Boolean },
|
||||
hasTourFinished: { type: Boolean },
|
||||
theme: { type: String, reflect: true }
|
||||
}
|
||||
}
|
||||
|
||||
static get styles() {
|
||||
return [beginnerChecklistStyles]
|
||||
}
|
||||
|
||||
constructor() {
|
||||
super()
|
||||
this.showChecklist = false
|
||||
this.initialFetch = false
|
||||
this.isSynced = false
|
||||
this.hasName = null
|
||||
this.nodeUrl = this.getNodeUrl()
|
||||
this.myNode = this.getMyNode()
|
||||
this.hasTourFinished = null
|
||||
this._controlTourFinished = this._controlTourFinished.bind(this)
|
||||
this.uid = new ShortUniqueId()
|
||||
this.theme = localStorage.getItem('qortalTheme') ? localStorage.getItem('qortalTheme') : 'light'
|
||||
}
|
||||
|
||||
render() {
|
||||
return this.hasName === false || this.hasTourFinished === false ?
|
||||
html`
|
||||
<div class="layout">
|
||||
<popover-component for="popover-checklist" message=${get('tour.tour16')}></popover-component>
|
||||
<div id="popover-checklist" @click=${() => this._toggleChecklist()}>
|
||||
<mwc-icon id="checklist-general-icon" style=${`color: ${!this.hasName ? 'red' : 'var(--black)'}; cursor:pointer;user-select:none`}>
|
||||
checklist
|
||||
</mwc-icon>
|
||||
<vaadin-tooltip for="checklist-general-icon" position="bottom" hover-delay=${400} hide-delay=${1} text=${get('tour.tour16')}></vaadin-tooltip>
|
||||
</div>
|
||||
<div id="checklist-panel" class="popover-panel" style="visibility:${this.showChecklist ? 'visibile' : 'hidden'}" tabindex="0" @blur=${this.handleBlur}>
|
||||
<div class="list">
|
||||
<div class="task-list-item">
|
||||
<p>Are you synced?</p>
|
||||
${this.syncPercentage === 100 ?
|
||||
html`
|
||||
<mwc-icon id="checklist-general-icon" style="color: green; user-select:none">
|
||||
task_alt
|
||||
</mwc-icon>
|
||||
`
|
||||
: html`
|
||||
<mwc-icon id="checklist-general-icon" style="color: red; user-select:none">
|
||||
radio_button_unchecked
|
||||
</mwc-icon>
|
||||
`
|
||||
}
|
||||
</div>
|
||||
<div
|
||||
class="task-list-item"
|
||||
style="cursor:pointer"
|
||||
@click=${() => {
|
||||
store.dispatch(
|
||||
setNewTab({
|
||||
url: `group-management`,
|
||||
id: this.uid.rnd(),
|
||||
myPlugObj: {
|
||||
url: 'name-registration',
|
||||
domain: 'core',
|
||||
page: 'name-registration/index.html',
|
||||
title: 'Name Registration',
|
||||
icon: 'vaadin:user-check',
|
||||
mwcicon: 'manage_accounts',
|
||||
pluginNumber: 'plugin-qCmtXAQmtu',
|
||||
menus: [],
|
||||
parent: false
|
||||
},
|
||||
openExisting: true
|
||||
})
|
||||
);
|
||||
this.handleBlur();
|
||||
}}
|
||||
>
|
||||
<p>Do you have a name registered?</p>
|
||||
${this.hasName ?
|
||||
html`
|
||||
<mwc-icon id="checklist-general-icon" style="color: green; user-select:none">
|
||||
task_alt
|
||||
</mwc-icon>
|
||||
` : html`
|
||||
<mwc-icon id="checklist-general-icon" style="color: red; user-select:none">
|
||||
radio_button_unchecked
|
||||
</mwc-icon>
|
||||
`
|
||||
}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
`
|
||||
: ''
|
||||
}
|
||||
|
||||
firstUpdated() {
|
||||
this.address = store.getState().app.selectedAddress.address
|
||||
this.hasTourFinished = JSON.parse(localStorage.getItem(`hasViewedTour-${this.address}`) || 'null')
|
||||
}
|
||||
|
||||
_controlTourFinished() {
|
||||
this.hasTourFinished = true
|
||||
}
|
||||
|
||||
connectedCallback() {
|
||||
super.connectedCallback()
|
||||
window.addEventListener('send-tour-finished', this._controlTourFinished)
|
||||
}
|
||||
|
||||
disconnectedCallback() {
|
||||
window.removeEventListener('send-tour-finished', this._controlTourFinished)
|
||||
super.disconnectedCallback()
|
||||
}
|
||||
|
||||
getNodeUrl() {
|
||||
const myNode = store.getState().app.nodeConfig.knownNodes[store.getState().app.nodeConfig.node]
|
||||
return myNode.protocol + '://' + myNode.domain + ':' + myNode.port
|
||||
}
|
||||
|
||||
getMyNode() {
|
||||
return store.getState().app.nodeConfig.knownNodes[store.getState().app.nodeConfig.node]
|
||||
}
|
||||
|
||||
async getName(recipient) {
|
||||
try {
|
||||
if (!recipient) return ''
|
||||
|
||||
const endpoint = `${this.nodeUrl}/names/address/${recipient}`
|
||||
const res = await fetch(endpoint)
|
||||
const getNames = await res.json()
|
||||
|
||||
this.hasName = Array.isArray(getNames) && getNames.length > 0
|
||||
} catch (error) {
|
||||
return ''
|
||||
}
|
||||
}
|
||||
|
||||
stateChanged(state) {
|
||||
if (state.app.nodeStatus && state.app.nodeStatus.syncPercent !== this.syncPercentage) {
|
||||
this.syncPercentage = state.app.nodeStatus.syncPercent
|
||||
|
||||
if (!this.hasAttempted && state.app.selectedAddress && state.app.nodeStatus.syncPercent === 100) {
|
||||
this.hasAttempted = true
|
||||
this.getName(state.app.selectedAddress.address)
|
||||
}
|
||||
}
|
||||
|
||||
if (state.app.accountInfo &&
|
||||
state.app.accountInfo.names.length && state.app.nodeStatus && state.app.nodeStatus.syncPercent === 100 &&
|
||||
this.hasName === false && this.hasAttempted && state.app.accountInfo && state.app.accountInfo.names &&
|
||||
state.app.accountInfo.names.length > 0
|
||||
) {
|
||||
this.hasName = true
|
||||
}
|
||||
}
|
||||
|
||||
handleBlur() {
|
||||
setTimeout(() => {
|
||||
if (!this.shadowRoot.contains(document.activeElement)) {
|
||||
this.showChecklist = false
|
||||
}
|
||||
}, 0)
|
||||
}
|
||||
|
||||
_toggleChecklist() {
|
||||
this.showChecklist = !this.showChecklist
|
||||
|
||||
if (this.showChecklist) {
|
||||
requestAnimationFrame(() => {
|
||||
this.shadowRoot.getElementById('checklist-panel').focus()
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
// Standard functions
|
||||
getApiKey() {
|
||||
const coreNode = store.getState().app.nodeConfig.knownNodes[store.getState().app.nodeConfig.node]
|
||||
return coreNode.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('beginner-checklist', BeginnerChecklist)
|
@ -1,67 +0,0 @@
|
||||
import { Sha256 } from 'asmcrypto.js'
|
||||
|
||||
function sbrk(size, heap) {
|
||||
let brk = 512 * 1024 // stack top
|
||||
let old = brk
|
||||
brk += size
|
||||
if (brk > heap.length) throw new Error('heap exhausted')
|
||||
return old
|
||||
}
|
||||
|
||||
self.addEventListener('message', async e => {
|
||||
const response = await computePow(e.data.convertedBytes, e.data.path)
|
||||
postMessage(response)
|
||||
})
|
||||
|
||||
const memory = new WebAssembly.Memory({ initial: 256, maximum: 256 })
|
||||
const heap = new Uint8Array(memory.buffer)
|
||||
|
||||
const computePow = async (convertedBytes, path) => {
|
||||
let response = null
|
||||
await new Promise((resolve, reject) => {
|
||||
const _convertedBytesArray = Object.keys(convertedBytes).map(
|
||||
function (key) {
|
||||
return convertedBytes[key]
|
||||
}
|
||||
)
|
||||
const convertedBytesArray = new Uint8Array(_convertedBytesArray)
|
||||
const convertedBytesHash = new Sha256()
|
||||
.process(convertedBytesArray)
|
||||
.finish().result
|
||||
const hashPtr = sbrk(32, heap)
|
||||
const hashAry = new Uint8Array(
|
||||
memory.buffer,
|
||||
hashPtr,
|
||||
32
|
||||
)
|
||||
hashAry.set(convertedBytesHash)
|
||||
const difficulty = 14
|
||||
const workBufferLength = 8 * 1024 * 1024
|
||||
const workBufferPtr = sbrk(
|
||||
workBufferLength,
|
||||
heap
|
||||
)
|
||||
const importObject = {
|
||||
env: {
|
||||
memory: memory
|
||||
}
|
||||
}
|
||||
function loadWebAssembly(filename, imports) {
|
||||
return fetch(filename)
|
||||
.then(response => response.arrayBuffer())
|
||||
.then(buffer => WebAssembly.compile(buffer))
|
||||
.then(module => {
|
||||
return new WebAssembly.Instance(module, importObject)
|
||||
})
|
||||
}
|
||||
loadWebAssembly(path)
|
||||
.then(wasmModule => {
|
||||
response = {
|
||||
nonce: wasmModule.exports.compute2(hashPtr, workBufferPtr, workBufferLength, difficulty),
|
||||
|
||||
}
|
||||
resolve()
|
||||
})
|
||||
})
|
||||
return response
|
||||
}
|
@ -1,182 +0,0 @@
|
||||
import { html, LitElement } from 'lit'
|
||||
import { connect } from 'pwa-helpers'
|
||||
import { store } from '../../store'
|
||||
import { translate } from '../../../translate'
|
||||
import { coreSyncStatusStyles } from '../../styles/core-css'
|
||||
|
||||
class CoreSyncStatus extends connect(store)(LitElement) {
|
||||
static get properties() {
|
||||
return {
|
||||
nodeInfos: { type: Array },
|
||||
coreInfos: { type: Array },
|
||||
theme: { type: String, reflect: true }
|
||||
}
|
||||
}
|
||||
|
||||
static get styles() {
|
||||
return [coreSyncStatusStyles]
|
||||
}
|
||||
|
||||
constructor() {
|
||||
super()
|
||||
this.nodeInfos = []
|
||||
this.coreInfos = []
|
||||
this.theme = localStorage.getItem('qortalTheme') ? localStorage.getItem('qortalTheme') : 'light'
|
||||
}
|
||||
|
||||
render() {
|
||||
return html`
|
||||
<div id="core-sync-status-id">
|
||||
${this.renderSyncStatusIcon()}
|
||||
</div>
|
||||
`
|
||||
}
|
||||
|
||||
firstUpdated() {
|
||||
this.getNodeInfos()
|
||||
this.getCoreInfos()
|
||||
|
||||
setInterval(() => {
|
||||
this.getNodeInfos()
|
||||
this.getCoreInfos()
|
||||
}, 30000)
|
||||
}
|
||||
|
||||
|
||||
async getNodeInfos() {
|
||||
const appInfoNode = store.getState().app.nodeConfig.knownNodes[store.getState().app.nodeConfig.node]
|
||||
const appInfoUrl = appInfoNode.protocol + '://' + appInfoNode.domain + ':' + appInfoNode.port
|
||||
const nodeInfoUrl = `${appInfoUrl}/admin/status`
|
||||
|
||||
await fetch(nodeInfoUrl).then(response => {
|
||||
return response.json()
|
||||
}).then(data => {
|
||||
this.nodeInfos = data
|
||||
}).catch(err => {
|
||||
console.error('Request failed', err)
|
||||
})
|
||||
}
|
||||
|
||||
async getCoreInfos() {
|
||||
const appCoreNode = store.getState().app.nodeConfig.knownNodes[store.getState().app.nodeConfig.node]
|
||||
const appCoreUrl = appCoreNode.protocol + '://' + appCoreNode.domain + ':' + appCoreNode.port
|
||||
const coreInfoUrl = `${appCoreUrl}/admin/info`
|
||||
|
||||
await fetch(coreInfoUrl).then(response => {
|
||||
return response.json()
|
||||
}).then(data => {
|
||||
this.coreInfos = data
|
||||
}).catch(err => {
|
||||
console.error('Request failed', err)
|
||||
})
|
||||
}
|
||||
|
||||
renderSyncStatusIcon() {
|
||||
if (this.nodeInfos.isSynchronizing === true && this.nodeInfos.syncPercent === 99) {
|
||||
return html`
|
||||
<div class="tooltip" style="display: inline;">
|
||||
<span><img src="/img/syncing.png" style="height: 24px; width: 24px; padding-top: 4px;"></span>
|
||||
<div class="bottom">
|
||||
<h3>${translate("walletprofile.wp3")}</h3>
|
||||
<h4 class="lineHeight">${translate("appinfo.coreversion")}: <span style="color: #03a9f4">${this.coreInfos.buildVersion ? (this.coreInfos.buildVersion).substring(0, 12) : ''}</span></h4>
|
||||
<h4 class="lineHeight">${translate("appinfo.synchronizing")}... <span style="color: #03a9f4">${this.nodeInfos.syncPercent !== undefined ? this.nodeInfos.syncPercent + '%' : ''}</span></h4>
|
||||
<h4 class="lineHeight">${translate("appinfo.blockheight")}: <span style="color: #03a9f4">${this.nodeInfos.height ? this.nodeInfos.height : ''}</span></h4>
|
||||
<h4 class="lineHeight">${translate("appinfo.peers")}: <span style="color: #03a9f4">${this.nodeInfos.numberOfConnections ? this.nodeInfos.numberOfConnections : ''}</span></h4>
|
||||
<i></i>
|
||||
</div>
|
||||
</div>
|
||||
`
|
||||
} else if (this.nodeInfos.isSynchronizing === true && this.nodeInfos.isMintingPossible === false && this.nodeInfos.syncPercent === 100) {
|
||||
return html`
|
||||
<div class="tooltip" style="display: inline;">
|
||||
<span><img src="/img/synced.png" style="height: 24px; width: 24px; padding-top: 4px;"></span>
|
||||
<div class="bottom">
|
||||
<h3>${translate("walletprofile.wp3")}</h3>
|
||||
<h4 class="lineHeight">${translate("appinfo.coreversion")}: <span style="color: #03a9f4">${this.coreInfos.buildVersion ? (this.coreInfos.buildVersion).substring(0, 12) : ''}</span></h4>
|
||||
<h4 class="lineHeight">${translate("walletprofile.wp4")} ${translate("walletprofile.wp2")}</h4>
|
||||
<h4 class="lineHeight">${translate("appinfo.blockheight")}: <span style="color: #03a9f4">${this.nodeInfos.height ? this.nodeInfos.height : ''}</span></h4>
|
||||
<h4 class="lineHeight">${translate("appinfo.peers")}: <span style="color: #03a9f4">${this.nodeInfos.numberOfConnections ? this.nodeInfos.numberOfConnections : ''}</span></h4>
|
||||
<i></i>
|
||||
</div>
|
||||
</div>
|
||||
`
|
||||
} else if (this.nodeInfos.isSynchronizing === false && this.nodeInfos.isMintingPossible === false && this.nodeInfos.syncPercent === 100) {
|
||||
return html`
|
||||
<div class="tooltip" style="display: inline;">
|
||||
<span><img src="/img/synced.png" style="height: 24px; width: 24px; padding-top: 4px;"></span>
|
||||
<div class="bottom">
|
||||
<h3>${translate("walletprofile.wp3")}</h3>
|
||||
<h4 class="lineHeight">${translate("appinfo.coreversion")}: <span style="color: #03a9f4">${this.coreInfos.buildVersion ? (this.coreInfos.buildVersion).substring(0, 12) : ''}</span></h4>
|
||||
<h4 class="lineHeight">${translate("walletprofile.wp4")} ${translate("walletprofile.wp2")}</h4>
|
||||
<h4 class="lineHeight">${translate("appinfo.blockheight")}: <span style="color: #03a9f4">${this.nodeInfos.height ? this.nodeInfos.height : ''}</span></h4>
|
||||
<h4 class="lineHeight">${translate("appinfo.peers")}: <span style="color: #03a9f4">${this.nodeInfos.numberOfConnections ? this.nodeInfos.numberOfConnections : ''}</span></h4>
|
||||
<i></i>
|
||||
</div>
|
||||
</div>
|
||||
`
|
||||
} else if (this.nodeInfos.isSynchronizing === true && this.nodeInfos.isMintingPossible === true && this.nodeInfos.syncPercent === 100) {
|
||||
return html`
|
||||
<div class="tooltip" style="display: inline;">
|
||||
<span><img src="/img/synced_minting.png" style="height: 24px; width: 24px; padding-top: 4px;"></span>
|
||||
<div class="bottom">
|
||||
<h3>${translate("walletprofile.wp3")}</h3>
|
||||
<h4 class="lineHeight">${translate("appinfo.coreversion")}: <span style="color: #03a9f4">${this.coreInfos.buildVersion ? (this.coreInfos.buildVersion).substring(0, 12) : ''}</span></h4>
|
||||
<h4 class="lineHeight">${translate("walletprofile.wp4")} <span style="color: #03a9f4">( ${translate("walletprofile.wp1")} )</span></h4>
|
||||
<h4 class="lineHeight">${translate("appinfo.blockheight")}: <span style="color: #03a9f4">${this.nodeInfos.height ? this.nodeInfos.height : ''}</span></h4>
|
||||
<h4 class="lineHeight">${translate("appinfo.peers")}: <span style="color: #03a9f4">${this.nodeInfos.numberOfConnections ? this.nodeInfos.numberOfConnections : ''}</span></h4>
|
||||
<i></i>
|
||||
</div>
|
||||
</div>
|
||||
`
|
||||
} else if (this.nodeInfos.isSynchronizing === false && this.nodeInfos.isMintingPossible === true && this.nodeInfos.syncPercent === 100) {
|
||||
return html`
|
||||
<div class="tooltip" style="display: inline;">
|
||||
<span><img src="/img/synced_minting.png" style="height: 24px; width: 24px; padding-top: 4px;"></span>
|
||||
<div class="bottom">
|
||||
<h3>${translate("walletprofile.wp3")}</h3>
|
||||
<h4 class="lineHeight">${translate("appinfo.coreversion")}: <span style="color: #03a9f4">${this.coreInfos.buildVersion ? (this.coreInfos.buildVersion).substring(0, 12) : ''}</span></h4>
|
||||
<h4 class="lineHeight">${translate("walletprofile.wp4")} <span style="color: #03a9f4">( ${translate("walletprofile.wp1")} )</span></h4>
|
||||
<h4 class="lineHeight">${translate("appinfo.blockheight")}: <span style="color: #03a9f4">${this.nodeInfos.height ? this.nodeInfos.height : ''}</span></h4>
|
||||
<h4 class="lineHeight">${translate("appinfo.peers")}: <span style="color: #03a9f4">${this.nodeInfos.numberOfConnections ? this.nodeInfos.numberOfConnections : ''}</span></h4>
|
||||
<i></i>
|
||||
</div>
|
||||
</div>
|
||||
`
|
||||
} else {
|
||||
return html`
|
||||
<div class="tooltip" style="display: inline;">
|
||||
<span><img src="/img/syncing.png" style="height: 24px; width: 24px; padding-top: 4px;"></span>
|
||||
<div class="bottom">
|
||||
<h3>${translate("walletprofile.wp3")}</h3>
|
||||
<h4 class="lineHeight">${translate("appinfo.coreversion")}: <span style="color: #03a9f4">${this.coreInfos.buildVersion ? (this.coreInfos.buildVersion).substring(0, 12) : ''}</span></h4>
|
||||
<h4 class="lineHeight">${translate("appinfo.synchronizing")}... <span style="color: #03a9f4">${this.nodeInfos.syncPercent !== undefined ? this.nodeInfos.syncPercent + '%' : ''}</span></h4>
|
||||
<h4 class="lineHeight">${translate("appinfo.blockheight")}: <span style="color: #03a9f4">${this.nodeInfos.height ? this.nodeInfos.height : ''}</span></h4>
|
||||
<h4 class="lineHeight">${translate("appinfo.peers")}: <span style="color: #03a9f4">${this.nodeInfos.numberOfConnections ? this.nodeInfos.numberOfConnections : ''}</span></h4>
|
||||
<i></i>
|
||||
</div>
|
||||
</div>
|
||||
`
|
||||
}
|
||||
}
|
||||
|
||||
stateChanged(state) {
|
||||
// ...
|
||||
}
|
||||
|
||||
// Standard functions
|
||||
getApiKey() {
|
||||
const coreNode = store.getState().app.nodeConfig.knownNodes[store.getState().app.nodeConfig.node]
|
||||
return coreNode.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('core-sync-status', CoreSyncStatus)
|
@ -1,360 +0,0 @@
|
||||
import { html, LitElement } from 'lit'
|
||||
import { connect } from 'pwa-helpers'
|
||||
import { store } from '../../store'
|
||||
import { setNewTab } from '../../redux/app/app-actions'
|
||||
import { RequestQueueWithPromise } from '../../../../plugins/plugins/utils/classes'
|
||||
import { translate, } from '../../../translate'
|
||||
import { feedItemStyles } from '../../styles/core-css'
|
||||
import axios from 'axios'
|
||||
import ShortUniqueId from 'short-unique-id'
|
||||
import '../../../../plugins/plugins/core/components/TimeAgo'
|
||||
import '@material/mwc-menu'
|
||||
import '@material/mwc-list/mwc-list-item.js'
|
||||
|
||||
const requestQueue = new RequestQueueWithPromise(3)
|
||||
const requestQueueRawData = new RequestQueueWithPromise(3)
|
||||
const requestQueueStatus = new RequestQueueWithPromise(3)
|
||||
|
||||
export class FeedItem extends connect(store)(LitElement) {
|
||||
static get properties() {
|
||||
return {
|
||||
resource: { type: Object },
|
||||
isReady: { type: Boolean },
|
||||
status: { type: Object },
|
||||
feedItem: { type: Object },
|
||||
appName: { type: String },
|
||||
link: { type: String }
|
||||
}
|
||||
}
|
||||
|
||||
static get styles() {
|
||||
return [feedItemStyles]
|
||||
}
|
||||
|
||||
constructor() {
|
||||
super()
|
||||
this.resource = {
|
||||
identifier: "",
|
||||
name: "",
|
||||
service: ""
|
||||
}
|
||||
this.status = {
|
||||
status: ''
|
||||
}
|
||||
this.isReady = false
|
||||
this.nodeUrl = this.getNodeUrl()
|
||||
this.myNode = this.getMyNode()
|
||||
this.hasCalledWhenDownloaded = false
|
||||
this.isFetching = false
|
||||
this.uid = new ShortUniqueId()
|
||||
this.observer = new IntersectionObserver(entries => {
|
||||
for (const entry of entries) {
|
||||
if (entry.isIntersecting && this.status.status !== 'READY') {
|
||||
this._fetchImage()
|
||||
// Stop observing after the image has started loading
|
||||
this.observer.unobserve(this)
|
||||
}
|
||||
}
|
||||
})
|
||||
this.feedItem = null
|
||||
}
|
||||
|
||||
render() {
|
||||
let avatarImg
|
||||
const avatarUrl = `${this.nodeUrl}/arbitrary/THUMBNAIL/${this.resource.name}/qortal_avatar?async=true`
|
||||
avatarImg = html`<img src="${avatarUrl}" style="width:100%; height:100%;" onerror="this.onerror=null; this.src='/img/incognito.png';" />`
|
||||
|
||||
let avatarImgApp
|
||||
const avatarUrl2 = `${this.nodeUrl}/arbitrary/THUMBNAIL/${this.appName}/qortal_avatar?async=true`
|
||||
avatarImgApp = html`<img src="${avatarUrl2}" style="width:100%; height:100%;" onerror="this.onerror=null; this.src='/img/incognito.png';" />`
|
||||
|
||||
return html`
|
||||
<div
|
||||
class=${[`image-container`, this.status.status !== 'READY' ? 'defaultSize' : '', this.status.status !== 'READY' ? 'hideImg' : '',].join(' ')}
|
||||
style=" box-sizing: border-box;"
|
||||
>
|
||||
${this.status.status !== 'READY' ?
|
||||
html`
|
||||
<div style="display:flex;flex-direction:column;width:100%;height:100%;justify-content:center;align-items:center; box-sizing: border-box;">
|
||||
<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' && this.feedItem ?
|
||||
html`
|
||||
<div class="parent-feed-item" style="position:relative" @click=${this.goToFeedLink}>
|
||||
<div style="display:flex;gap:10px;margin-bottom:5px">
|
||||
<div class="avatar">${avatarImg}</div>
|
||||
<span class="feed-item-name">${this.resource.name}</span>
|
||||
</div>
|
||||
<div>
|
||||
<p>${this.feedItem.title}</p>
|
||||
</div>
|
||||
<div class="app-name">
|
||||
<div class="avatarApp">${avatarImgApp}</div>
|
||||
<message-time timestamp=${this.resource.created}></message-time>
|
||||
</div>
|
||||
</div>
|
||||
`
|
||||
: ''
|
||||
}
|
||||
</div>
|
||||
`
|
||||
}
|
||||
|
||||
firstUpdated() {
|
||||
this.observer.observe(this)
|
||||
}
|
||||
|
||||
getNodeUrl() {
|
||||
const myNode = store.getState().app.nodeConfig.knownNodes[store.getState().app.nodeConfig.node]
|
||||
return myNode.protocol + '://' + myNode.domain + ':' + myNode.port
|
||||
}
|
||||
|
||||
getMyNode() {
|
||||
return store.getState().app.nodeConfig.knownNodes[store.getState().app.nodeConfig.node]
|
||||
}
|
||||
|
||||
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}?apiKey=${this.myNode.apiKey}`)
|
||||
this.isFetching = false
|
||||
|
||||
} catch (error) {
|
||||
this.isFetching = false
|
||||
}
|
||||
}
|
||||
|
||||
async fetchVideoUrl() {
|
||||
await this.fetchResource()
|
||||
}
|
||||
|
||||
async getRawData() {
|
||||
const url = `${this.nodeUrl}/arbitrary/${this.resource.service}/${this.resource.name}/${this.resource.identifier}?apiKey=${this.myNode.apiKey}`
|
||||
|
||||
return await requestQueueRawData.enqueue(() => {
|
||||
return axios.get(url)
|
||||
})
|
||||
}
|
||||
|
||||
updateDisplayWithPlaceholders(display, resource, rawdata) {
|
||||
const pattern = /\$\$\{([a-zA-Z0-9_\.]+)\}\$\$/g
|
||||
|
||||
for (const key in display) {
|
||||
const value = display[key]
|
||||
|
||||
display[key] = value.replace(pattern, (match, p1) => {
|
||||
if (p1.startsWith('rawdata.')) {
|
||||
const dataKey = p1.split('.')[1]
|
||||
if (rawdata[dataKey] === undefined) {
|
||||
console.error("rawdata key not found:", dataKey)
|
||||
}
|
||||
return rawdata[dataKey] || match
|
||||
} else if (p1.startsWith('resource.')) {
|
||||
const resourceKey = p1.split('.')[1]
|
||||
if (resource[resourceKey] === undefined) {
|
||||
console.error("resource key not found:", resourceKey)
|
||||
}
|
||||
return resource[resourceKey] || match
|
||||
}
|
||||
return match
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
async fetchStatus() {
|
||||
let isCalling = false
|
||||
let percentLoaded = 0
|
||||
let timer = 24
|
||||
|
||||
const response = await requestQueueStatus.enqueue(() => {
|
||||
return axios.get(`${this.nodeUrl}/arbitrary/resource/status/${this.resource.service}/${this.resource.name}/${this.resource.identifier}?apiKey=${this.myNode.apiKey}`)
|
||||
})
|
||||
|
||||
if (response && response.data && response.data.status === 'READY') {
|
||||
const rawData = await this.getRawData()
|
||||
|
||||
const object = {
|
||||
...this.resource.schema.display
|
||||
}
|
||||
|
||||
this.updateDisplayWithPlaceholders(object, {}, rawData.data)
|
||||
this.feedItem = object
|
||||
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}?apiKey=${this.myNode.apiKey}`)
|
||||
})
|
||||
|
||||
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') {
|
||||
await this.fetchResource()
|
||||
}
|
||||
}
|
||||
|
||||
// check if progress is 100% and clear interval if true
|
||||
if (res.status === 'READY') {
|
||||
const rawData = await this.getRawData()
|
||||
const object = {
|
||||
...this.resource.schema.display
|
||||
}
|
||||
this.updateDisplayWithPlaceholders(object, {}, rawData.data)
|
||||
this.feedItem = object
|
||||
clearInterval(intervalId)
|
||||
this.status = res
|
||||
this.isReady = true
|
||||
}
|
||||
}, 5000) // 5 second interval
|
||||
}
|
||||
|
||||
async _fetchImage() {
|
||||
try {
|
||||
await this.fetchVideoUrl()
|
||||
await this.fetchStatus()
|
||||
} catch (error) { /* empty */ }
|
||||
}
|
||||
|
||||
async goToFeedLink() {
|
||||
try {
|
||||
let newQuery = this.link
|
||||
if (newQuery.endsWith('/')) {
|
||||
newQuery = newQuery.slice(0, -1)
|
||||
}
|
||||
const res = await this.extractComponents(newQuery)
|
||||
if (!res) return
|
||||
const { service, name, identifier, path } = res
|
||||
let query = `?service=${service}`
|
||||
if (name) {
|
||||
query = query + `&name=${name}`
|
||||
}
|
||||
if (identifier) {
|
||||
query = query + `&identifier=${identifier}`
|
||||
}
|
||||
if (path) {
|
||||
query = query + `&path=${path}`
|
||||
}
|
||||
|
||||
store.dispatch(setNewTab({
|
||||
url: `qdn/browser/index.html${query}`,
|
||||
id: this.uid.rnd(),
|
||||
myPlugObj: {
|
||||
"url": "myapp",
|
||||
"domain": "core",
|
||||
"page": `qdn/browser/index.html${query}`,
|
||||
"title": name,
|
||||
"icon": 'vaadin:external-browser',
|
||||
"mwcicon": 'open_in_browser',
|
||||
"menus": [],
|
||||
"parent": false
|
||||
},
|
||||
openExisting: true
|
||||
}))
|
||||
} catch (error) {
|
||||
console.log({ error })
|
||||
}
|
||||
}
|
||||
|
||||
async extractComponents(url) {
|
||||
if (!url.startsWith("qortal://")) {
|
||||
return null
|
||||
}
|
||||
|
||||
url = url.replace(/^(qortal\:\/\/)/, "")
|
||||
|
||||
if (url.includes("/")) {
|
||||
let parts = url.split("/")
|
||||
const service = parts[0].toUpperCase()
|
||||
parts.shift()
|
||||
const name = parts[0]
|
||||
parts.shift()
|
||||
let identifier
|
||||
|
||||
if (parts.length > 0) {
|
||||
identifier = parts[0] // Do not shift yet
|
||||
// Check if a resource exists with this service, name and identifier combination
|
||||
const myNode = store.getState().app.nodeConfig.knownNodes[store.getState().app.nodeConfig.node]
|
||||
const nodeUrl = myNode.protocol + '://' + myNode.domain + ':' + myNode.port
|
||||
const url = `${nodeUrl}/arbitrary/resource/status/${service}/${name}/${identifier}?apiKey=${myNode.apiKey}}`
|
||||
|
||||
const res = await fetch(url);
|
||||
const data = await res.json();
|
||||
if (data.totalChunkCount > 0) {
|
||||
// Identifier exists, so don't include it in the path
|
||||
parts.shift()
|
||||
}
|
||||
else {
|
||||
identifier = null
|
||||
}
|
||||
}
|
||||
|
||||
const path = parts.join("/")
|
||||
|
||||
const components = {}
|
||||
components["service"] = service
|
||||
components["name"] = name
|
||||
components["identifier"] = identifier
|
||||
components["path"] = path
|
||||
return components
|
||||
}
|
||||
return null
|
||||
}
|
||||
|
||||
// Standard functions
|
||||
getApiKey() {
|
||||
const coreNode = store.getState().app.nodeConfig.knownNodes[store.getState().app.nodeConfig.node]
|
||||
return coreNode.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('feed-item', FeedItem)
|
@ -1,206 +0,0 @@
|
||||
import { html, LitElement } from 'lit'
|
||||
import { connect } from 'pwa-helpers'
|
||||
import { store } from '../../store'
|
||||
import { createPopper } from '@popperjs/core'
|
||||
import { setNewTab, setSideEffectAction } from '../../redux/app/app-actions'
|
||||
import { translate } from '../../../translate'
|
||||
import { friendItemActionsStyles } from '../../styles/core-css'
|
||||
import ShortUniqueId from 'short-unique-id'
|
||||
import '@material/mwc-icon'
|
||||
|
||||
export class FriendItemActions extends connect(store)(LitElement) {
|
||||
static get properties() {
|
||||
return {
|
||||
for: { type: String, reflect: true },
|
||||
message: { type: String },
|
||||
openEditFriend: { attribute: false },
|
||||
name: { type: String },
|
||||
closeSidePanel: { attribute: false, type: Object }
|
||||
}
|
||||
}
|
||||
|
||||
static get styles() {
|
||||
return [friendItemActionsStyles]
|
||||
}
|
||||
|
||||
constructor() {
|
||||
super()
|
||||
this.message = ''
|
||||
this.nodeUrl = this.getNodeUrl()
|
||||
this.uid = new ShortUniqueId()
|
||||
this.getUserAddress = this.getUserAddress.bind(this)
|
||||
}
|
||||
|
||||
render() {
|
||||
return html`
|
||||
<div id="parent-div" tabindex="0" @blur=${this.handleBlur}>
|
||||
<span class="close-icon" @click="${this.closePopover}">
|
||||
<mwc-icon style="color: var(--black)">close</mwc-icon>
|
||||
</span>
|
||||
<div class="action-parent">
|
||||
<div
|
||||
class="send-message-button"
|
||||
@click="${() => {
|
||||
this.openEditFriend();
|
||||
this.closePopover();
|
||||
}}"
|
||||
>
|
||||
<mwc-icon style="color: var(--black)">edit</mwc-icon>
|
||||
${translate('friends.friend10')}
|
||||
</div>
|
||||
<div
|
||||
class="send-message-button"
|
||||
@click="${async () => {
|
||||
const address = await this.getUserAddress();
|
||||
if (!address) return;
|
||||
store.dispatch(
|
||||
setNewTab({
|
||||
url: `q-chat`,
|
||||
id: this.uid.rnd(),
|
||||
myPlugObj: {
|
||||
url: 'q-chat',
|
||||
domain: 'core',
|
||||
page: 'q-chat/index.html',
|
||||
title: 'Q-Chat',
|
||||
icon: 'vaadin:chat',
|
||||
mwcicon: 'forum',
|
||||
pluginNumber: 'plugin-qhsyOnpRhT',
|
||||
menus: [],
|
||||
parent: false
|
||||
},
|
||||
openExisting: true
|
||||
})
|
||||
);
|
||||
store.dispatch(
|
||||
setSideEffectAction({
|
||||
type: 'openPrivateChat',
|
||||
data: {
|
||||
address,
|
||||
name: this.name
|
||||
}
|
||||
})
|
||||
);
|
||||
this.closePopover();
|
||||
this.closeSidePanel();
|
||||
}}"
|
||||
>
|
||||
<mwc-icon style="color: var(--black)">send</mwc-icon>
|
||||
${translate('friends.friend8')}
|
||||
</div>
|
||||
<div
|
||||
class="send-message-button"
|
||||
@click="${() => {
|
||||
const query = `?service=APP&name=Q-Mail/to/${this.name}`;
|
||||
store.dispatch(
|
||||
setNewTab({
|
||||
url: `qdn/browser/index.html${query}`,
|
||||
id: this.uid.rnd(),
|
||||
myPlugObj: {
|
||||
url: 'myapp',
|
||||
domain: 'core',
|
||||
page: `qdn/browser/index.html${query}`,
|
||||
title: 'Q-Mail',
|
||||
icon: 'vaadin:mailbox',
|
||||
mwcicon: 'mail_outline',
|
||||
menus: [],
|
||||
parent: false
|
||||
},
|
||||
openExisting: true
|
||||
})
|
||||
);
|
||||
this.closePopover();
|
||||
this.closeSidePanel();
|
||||
}}"
|
||||
>
|
||||
<mwc-icon style="color: var(--black)">mail</mwc-icon>
|
||||
${translate('friends.friend9')}
|
||||
</div>
|
||||
<div
|
||||
class="send-message-button"
|
||||
@click="${() => {
|
||||
const customEvent = new CustomEvent('open-visiting-profile', { detail: this.name });
|
||||
window.dispatchEvent(customEvent);
|
||||
this.closePopover();
|
||||
this.closeSidePanel();
|
||||
}}"
|
||||
>
|
||||
<mwc-icon style="color: var(--black)">person</mwc-icon>
|
||||
${translate('profile.profile18')}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
`
|
||||
}
|
||||
|
||||
firstUpdated() {
|
||||
// ...
|
||||
}
|
||||
|
||||
getNodeUrl() {
|
||||
const myNode = store.getState().app.nodeConfig.knownNodes[store.getState().app.nodeConfig.node]
|
||||
return myNode.protocol + '://' + myNode.domain + ':' + myNode.port
|
||||
}
|
||||
|
||||
attachToTarget(target) {
|
||||
if (!this.popperInstance && target) {
|
||||
this.popperInstance = createPopper(target, this, {
|
||||
placement: 'bottom'
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
openPopover(target) {
|
||||
this.attachToTarget(target)
|
||||
this.style.display = 'block'
|
||||
setTimeout(() => {
|
||||
this.shadowRoot.getElementById('parent-div').focus()
|
||||
}, 50)
|
||||
}
|
||||
|
||||
closePopover() {
|
||||
this.style.display = 'none'
|
||||
if (this.popperInstance) {
|
||||
this.popperInstance.destroy()
|
||||
this.popperInstance = null
|
||||
}
|
||||
this.requestUpdate()
|
||||
}
|
||||
|
||||
handleBlur() {
|
||||
setTimeout(() => {
|
||||
this.closePopover()
|
||||
}, 0)
|
||||
}
|
||||
|
||||
async getUserAddress() {
|
||||
try {
|
||||
const url = `${this.nodeUrl}/names/${this.name}`
|
||||
const res = await fetch(url)
|
||||
const result = await res.json()
|
||||
if (result.error === 401) {
|
||||
return ''
|
||||
} else {
|
||||
return result.owner
|
||||
}
|
||||
} catch (error) {
|
||||
return ''
|
||||
}
|
||||
}
|
||||
|
||||
// Standard functions
|
||||
getApiKey() {
|
||||
const coreNode = store.getState().app.nodeConfig.knownNodes[store.getState().app.nodeConfig.node]
|
||||
return coreNode.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('friend-item-actions', FriendItemActions)
|
@ -1,461 +0,0 @@
|
||||
import { html, LitElement } from 'lit'
|
||||
import { store } from '../../store'
|
||||
import { connect } from 'pwa-helpers'
|
||||
import { translate } from '../../../translate'
|
||||
import { friendsViewStyles } from '../../styles/core-css'
|
||||
import './feed-item'
|
||||
import './friends-view'
|
||||
import '@material/mwc-icon'
|
||||
import '@polymer/paper-spinner/paper-spinner-lite.js'
|
||||
|
||||
const perEndpointCount = 20
|
||||
const totalDesiredCount = 100
|
||||
const maxResultsInMemory = 300
|
||||
|
||||
class FriendsFeed extends connect(store)(LitElement) {
|
||||
static get properties() {
|
||||
return {
|
||||
feed: { type: Array },
|
||||
setHasNewFeed: { attribute: false },
|
||||
isLoading: { type: Boolean },
|
||||
hasFetched: { type: Boolean },
|
||||
mySelectedFeeds: { type: Array }
|
||||
}
|
||||
}
|
||||
|
||||
static get styles() {
|
||||
return [friendsViewStyles]
|
||||
}
|
||||
|
||||
constructor() {
|
||||
super()
|
||||
this.feed = []
|
||||
this.feedToRender = []
|
||||
this.nodeUrl = this.getNodeUrl()
|
||||
this.myNode = this.getMyNode()
|
||||
this.endpoints = []
|
||||
this.endpointOffsets = [] // Initialize offsets for each endpoint to 0
|
||||
this.loadAndMergeData = this.loadAndMergeData.bind(this)
|
||||
this.hasInitialFetch = false
|
||||
this.observerHandler = this.observerHandler.bind(this)
|
||||
this.elementObserver = this.elementObserver.bind(this)
|
||||
this.mySelectedFeeds = []
|
||||
this.getSchemas = this.getSchemas.bind(this)
|
||||
this.hasFetched = false
|
||||
this._updateFeeds = this._updateFeeds.bind(this)
|
||||
}
|
||||
|
||||
render() {
|
||||
return html`
|
||||
<div class="container">
|
||||
<div id="viewElement" class="container-body" style=${"position: relative"}>
|
||||
${this.isLoading ? html`
|
||||
<div style="width:100%;display: flex; justify-content:center">
|
||||
<paper-spinner-lite active></paper-spinner-lite>
|
||||
</div>
|
||||
` : ''}
|
||||
${this.hasFetched && !this.isLoading && this.feed.length === 0 ? html`
|
||||
<div style="width:100%;display: flex; justify-content:center">
|
||||
<p>${translate('friends.friend17')}</p>
|
||||
</div>
|
||||
` : ''}
|
||||
${this.feedToRender.map((item) => {
|
||||
return html`
|
||||
<feed-item
|
||||
.resource=${item}
|
||||
appName=${'Q-Blog'}
|
||||
link=${item.link}
|
||||
>
|
||||
</feed-item>
|
||||
`
|
||||
})}
|
||||
<div id="downObserver"></div>
|
||||
</div>
|
||||
</div>
|
||||
`
|
||||
}
|
||||
|
||||
|
||||
async firstUpdated() {
|
||||
this.viewElement = this.shadowRoot.getElementById('viewElement')
|
||||
this.downObserverElement = this.shadowRoot.getElementById('downObserver')
|
||||
this.elementObserver()
|
||||
|
||||
try {
|
||||
await new Promise((res) => {
|
||||
setTimeout(() => {
|
||||
res()
|
||||
}, 5000)
|
||||
})
|
||||
|
||||
if (this.mySelectedFeeds.length === 0) {
|
||||
await this.getEndpoints()
|
||||
await this.loadAndMergeData()
|
||||
}
|
||||
|
||||
this.getFeedOnInterval()
|
||||
} catch (error) {
|
||||
console.log(error)
|
||||
}
|
||||
}
|
||||
|
||||
getNodeUrl() {
|
||||
const myNode = store.getState().app.nodeConfig.knownNodes[store.getState().app.nodeConfig.node]
|
||||
return myNode.protocol + '://' + myNode.domain + ':' + myNode.port
|
||||
}
|
||||
|
||||
getMyNode() {
|
||||
return store.getState().app.nodeConfig.knownNodes[store.getState().app.nodeConfig.node]
|
||||
}
|
||||
|
||||
_updateFeeds(event) {
|
||||
this.mySelectedFeeds = event.detail
|
||||
this.reFetchFeedData()
|
||||
this.requestUpdate()
|
||||
}
|
||||
|
||||
connectedCallback() {
|
||||
super.connectedCallback()
|
||||
window.addEventListener('friends-my-selected-feeds-event', this._updateFeeds)
|
||||
}
|
||||
|
||||
disconnectedCallback() {
|
||||
window.removeEventListener('friends-my-selected-feeds-event', this._updateFeeds)
|
||||
super.disconnectedCallback()
|
||||
}
|
||||
|
||||
async getSchemas() {
|
||||
this.mySelectedFeeds = JSON.parse(localStorage.getItem('friends-my-selected-feeds') || "[]")
|
||||
const schemas = this.mySelectedFeeds
|
||||
|
||||
const getAllSchemas = (schemas || []).map(
|
||||
async (schema) => {
|
||||
try {
|
||||
const url = `${this.nodeUrl}/arbitrary/${schema.service}/${schema.name}/${schema.identifier}`
|
||||
const res = await fetch(url)
|
||||
const data = await res.json()
|
||||
if (data.error) return false
|
||||
return data
|
||||
} catch (error) {
|
||||
console.log(error)
|
||||
return false
|
||||
}
|
||||
}
|
||||
)
|
||||
|
||||
const res = await Promise.all(getAllSchemas)
|
||||
return res.filter((item) => !!item)
|
||||
}
|
||||
|
||||
getFeedOnInterval() {
|
||||
let interval = null
|
||||
let stop = false
|
||||
|
||||
const getAnswer = async () => {
|
||||
if (!stop) {
|
||||
stop = true
|
||||
try {
|
||||
await this.reFetchFeedData()
|
||||
} catch (error) { }
|
||||
stop = false
|
||||
}
|
||||
}
|
||||
|
||||
interval = setInterval(getAnswer, 900000)
|
||||
}
|
||||
|
||||
async getEndpoints() {
|
||||
const dynamicVars = { }
|
||||
const schemas = await this.getSchemas()
|
||||
const friendList = JSON.parse(localStorage.getItem('friends-my-friend-list') || "[]")
|
||||
const names = friendList.map(friend => `name=${friend.name}`).join('&')
|
||||
|
||||
if (names.length === 0) {
|
||||
this.endpoints = []
|
||||
this.endpointOffsets = Array(this.endpoints.length).fill(0)
|
||||
return
|
||||
}
|
||||
|
||||
const baseurl = `${this.nodeUrl}/arbitrary/resources/search?reverse=true&mode=ALL&exactmatchnames=true&${names}`
|
||||
let formEndpoints = []
|
||||
|
||||
schemas.forEach((schema) => {
|
||||
const feedData = schema.feed[0]
|
||||
if (feedData) {
|
||||
const copyFeedData = { ...feedData }
|
||||
const fullUrl = constructUrl(baseurl, copyFeedData.search, dynamicVars)
|
||||
if (fullUrl) {
|
||||
formEndpoints.push({
|
||||
url: fullUrl, schemaName: schema.name, schema: copyFeedData
|
||||
})
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
this.endpoints = formEndpoints
|
||||
this.endpointOffsets = Array(this.endpoints.length).fill(0)
|
||||
}
|
||||
|
||||
getMoreFeed() {
|
||||
if (!this.hasInitialFetch) return
|
||||
if (this.feedToRender.length === this.feed.length) return
|
||||
this.feedToRender = this.feed.slice(0, this.feedToRender.length + 20)
|
||||
this.requestUpdate()
|
||||
}
|
||||
|
||||
async refresh() {
|
||||
try {
|
||||
await this.getEndpoints()
|
||||
await this.reFetchFeedData()
|
||||
} catch (error) {
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
elementObserver() {
|
||||
const options = {
|
||||
rootMargin: '0px',
|
||||
threshold: 1
|
||||
}
|
||||
|
||||
// identify an element to observe
|
||||
const elementToObserve = this.downObserverElement
|
||||
|
||||
// passing it a callback function
|
||||
const observer = new IntersectionObserver(
|
||||
this.observerHandler,
|
||||
options
|
||||
)
|
||||
|
||||
// call `observe()` on that MutationObserver instance,
|
||||
// passing it the element to observe, and the options object
|
||||
observer.observe(elementToObserve)
|
||||
}
|
||||
|
||||
observerHandler(entries) {
|
||||
if (!entries[0].isIntersecting) {
|
||||
} else {
|
||||
if (this.feedToRender.length < 20) {
|
||||
return
|
||||
}
|
||||
this.getMoreFeed()
|
||||
}
|
||||
}
|
||||
|
||||
async fetchDataFromEndpoint(endpointIndex, count) {
|
||||
const offset = this.endpointOffsets[endpointIndex]
|
||||
const url = `${this.endpoints[endpointIndex].url}&limit=${count}&offset=${offset}`
|
||||
const res = await fetch(url)
|
||||
const data = await res.json()
|
||||
|
||||
return data.map((i) => {
|
||||
return {
|
||||
...this.endpoints[endpointIndex],
|
||||
...i
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
async initialLoad() {
|
||||
let results = []
|
||||
let totalFetched = 0
|
||||
let i = 0
|
||||
let madeProgress = true
|
||||
let exhaustedEndpoints = new Set()
|
||||
|
||||
while (totalFetched < totalDesiredCount && madeProgress) {
|
||||
madeProgress = false
|
||||
this.isLoading = true
|
||||
for (i = 0; i < this.endpoints.length; i++) {
|
||||
if (exhaustedEndpoints.has(i)) {
|
||||
continue
|
||||
}
|
||||
|
||||
const remainingCount = totalDesiredCount - totalFetched
|
||||
|
||||
// If we've already reached the desired count, break
|
||||
if (remainingCount <= 0) {
|
||||
break;
|
||||
}
|
||||
|
||||
let fetchCount = Math.min(perEndpointCount, remainingCount)
|
||||
let data = await this.fetchDataFromEndpoint(i, fetchCount)
|
||||
|
||||
// Increment the offset for this endpoint by the number of items fetched
|
||||
this.endpointOffsets[i] += data.length
|
||||
|
||||
if (data.length > 0) {
|
||||
madeProgress = true
|
||||
}
|
||||
|
||||
if (data.length < fetchCount) {
|
||||
exhaustedEndpoints.add(i)
|
||||
}
|
||||
|
||||
results = results.concat(data)
|
||||
totalFetched += data.length
|
||||
}
|
||||
|
||||
if (exhaustedEndpoints.size === this.endpoints.length) {
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
this.isLoading = false
|
||||
this.hasFetched = true
|
||||
|
||||
// Trim the results if somehow they are over the totalDesiredCount
|
||||
return results.slice(0, totalDesiredCount)
|
||||
}
|
||||
|
||||
trimDataToLimit(data, limit) {
|
||||
return data.slice(0, limit)
|
||||
}
|
||||
|
||||
mergeData(newData, existingData) {
|
||||
const existingIds = new Set(existingData.map(item => item.identifier)) // Assume each item has a unique 'id'
|
||||
const uniqueNewData = newData.filter(item => !existingIds.has(item.identifier))
|
||||
return uniqueNewData.concat(existingData)
|
||||
}
|
||||
|
||||
async addExtraData(data) {
|
||||
let newData = []
|
||||
for (let item of data) {
|
||||
let newItem = {
|
||||
...item,
|
||||
schema: {
|
||||
...item.schema,
|
||||
customParams: { ...item.schema.customParams }
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
let newResource = {
|
||||
identifier: newItem.identifier,
|
||||
service: newItem.service,
|
||||
name: newItem.name
|
||||
}
|
||||
|
||||
if (newItem.schema) {
|
||||
const resource = newItem
|
||||
|
||||
let clickValue1 = newItem.schema.click;
|
||||
|
||||
newItem.link = replacePlaceholders(clickValue1, resource, newItem.schema.customParams)
|
||||
newData.push(newItem)
|
||||
}
|
||||
}
|
||||
return newData
|
||||
}
|
||||
|
||||
async reFetchFeedData() {
|
||||
// Resetting offsets to start fresh.
|
||||
this.endpointOffsets = Array(this.endpoints.length).fill(0)
|
||||
await this.getEndpoints()
|
||||
const oldIdentifiers = new Set(this.feed.map(item => item.identifier))
|
||||
const newData = await this.initialLoad()
|
||||
|
||||
// Filter out items that are already in the feed
|
||||
const trulyNewData = newData.filter(item => !oldIdentifiers.has(item.identifier))
|
||||
|
||||
if (trulyNewData.length > 0) {
|
||||
// Adding extra data and merging with old data
|
||||
const enhancedNewData = await this.addExtraData(trulyNewData)
|
||||
|
||||
// Merge new data with old data immutably
|
||||
this.feed = [...enhancedNewData, ...this.feed]
|
||||
this.feed = this.removeDuplicates(this.feed)
|
||||
this.feed.sort((a, b) => new Date(b.created) - new Date(a.created)) // Sort by timestamp, most recent first
|
||||
this.feed = this.trimDataToLimit(this.feed, maxResultsInMemory) // Trim to the maximum allowed in memory
|
||||
this.feedToRender = this.feed.slice(0, 20)
|
||||
this.hasInitialFetch = true
|
||||
|
||||
const created = trulyNewData[0].created
|
||||
let value = localStorage.getItem('lastSeenFeed')
|
||||
if (((+value || 0) < created)) {
|
||||
this.setHasNewFeed(true)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
removeDuplicates(array) {
|
||||
const seenIds = new Set()
|
||||
return array.filter(item => {
|
||||
if (!seenIds.has(item.identifier)) {
|
||||
seenIds.add(item.identifier)
|
||||
return true
|
||||
}
|
||||
return false
|
||||
})
|
||||
}
|
||||
|
||||
async loadAndMergeData() {
|
||||
let allData = this.feed
|
||||
const newData = await this.initialLoad();
|
||||
allData = await this.addExtraData(newData)
|
||||
allData = this.mergeData(newData, allData);
|
||||
allData.sort((a, b) => new Date(b.created) - new Date(a.created)); // Sort by timestamp, most recent first
|
||||
allData = this.trimDataToLimit(allData, maxResultsInMemory); // Trim to the maximum allowed in memory
|
||||
allData = this.removeDuplicates(allData)
|
||||
this.feed = [...allData]
|
||||
this.feedToRender = this.feed.slice(0, 20)
|
||||
this.hasInitialFetch = true
|
||||
if (allData.length > 0) {
|
||||
const created = allData[0].created
|
||||
let value = localStorage.getItem('lastSeenFeed')
|
||||
if (((+value || 0) < created)) {
|
||||
this.setHasNewFeed(true)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Standard functions
|
||||
getApiKey() {
|
||||
const coreNode = store.getState().app.nodeConfig.knownNodes[store.getState().app.nodeConfig.node]
|
||||
return coreNode.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('friends-feed', FriendsFeed)
|
||||
|
||||
export function substituteDynamicVar(value, dynamicVars) {
|
||||
if (typeof value !== 'string') return value
|
||||
const pattern = /\$\$\{([a-zA-Z0-9_]+)\}\$\$/g // Adjusted pattern to capture $${name}$$ with curly braces
|
||||
return value.replace(pattern, (match, p1) => {
|
||||
return dynamicVars[p1] !== undefined ? dynamicVars[p1] : match
|
||||
})
|
||||
}
|
||||
|
||||
export function constructUrl(base, search, dynamicVars) {
|
||||
let queryStrings = []
|
||||
for (const [key, value] of Object.entries(search)) {
|
||||
const substitutedValue = substituteDynamicVar(value, dynamicVars)
|
||||
queryStrings.push(`${key}=${encodeURIComponent(substitutedValue)}`)
|
||||
}
|
||||
return queryStrings.length > 0 ? `${base}&${queryStrings.join('&')}` : base
|
||||
}
|
||||
|
||||
export function replacePlaceholders(template, resource, customParams) {
|
||||
const dataSource = { resource, customParams }
|
||||
return template.replace(/\$\$\{(.*?)\}\$\$/g, (match, p1) => {
|
||||
const keys = p1.split('.')
|
||||
let value = dataSource
|
||||
for (let key of keys) {
|
||||
if (value[key] !== undefined) {
|
||||
value = value[key]
|
||||
} else {
|
||||
return match // Return placeholder unchanged
|
||||
}
|
||||
}
|
||||
return value
|
||||
})
|
||||
}
|
@ -1,79 +0,0 @@
|
||||
import { html, LitElement } from 'lit'
|
||||
import { connect } from 'pwa-helpers'
|
||||
import { store } from '../../store'
|
||||
import { translate } from '../../../translate'
|
||||
import { friendsSidePanelParentStyles } from '../../styles/core-css'
|
||||
import './friends-side-panel'
|
||||
import '@material/mwc-icon'
|
||||
import '@vaadin/tooltip'
|
||||
|
||||
class FriendsSidePanelParent extends connect(store)(LitElement) {
|
||||
static get properties() {
|
||||
return {
|
||||
isOpen: { type: Boolean },
|
||||
hasNewFeed: { type: Boolean }
|
||||
}
|
||||
}
|
||||
|
||||
static get styles() {
|
||||
return [friendsSidePanelParentStyles]
|
||||
}
|
||||
|
||||
constructor() {
|
||||
super()
|
||||
this.isOpen = false
|
||||
this.hasNewFeed = false
|
||||
}
|
||||
|
||||
render() {
|
||||
return html`
|
||||
<mwc-icon
|
||||
id="friends-icon"
|
||||
@click=${() => {
|
||||
this.isOpen = !this.isOpen
|
||||
if (this.isOpen && this.hasNewFeed) {
|
||||
localStorage.setItem('lastSeenFeed', Date.now())
|
||||
this.hasNewFeed = false
|
||||
this.shadowRoot.querySelector("friends-side-panel").selected = 'feed'
|
||||
}
|
||||
}}
|
||||
style="color: ${this.hasNewFeed ? 'green' : 'var(--black)'}; cursor:pointer;user-select:none"
|
||||
>
|
||||
group
|
||||
</mwc-icon>
|
||||
<vaadin-tooltip
|
||||
for="friends-icon"
|
||||
position="bottom"
|
||||
hover-delay=${400}
|
||||
hide-delay=${1}
|
||||
text=${translate('friends.friend12')}
|
||||
></vaadin-tooltip>
|
||||
<friends-side-panel .setHasNewFeed=${(val) => this.setHasNewFeed(val)} ?isOpen=${this.isOpen} .setIsOpen=${(val) => this.isOpen = val}></friends-side-panel>
|
||||
`
|
||||
}
|
||||
|
||||
firstUpdated() {
|
||||
// ...
|
||||
}
|
||||
|
||||
setHasNewFeed(val) {
|
||||
this.hasNewFeed = val
|
||||
}
|
||||
|
||||
// Standard functions
|
||||
getApiKey() {
|
||||
const coreNode = store.getState().app.nodeConfig.knownNodes[store.getState().app.nodeConfig.node]
|
||||
return coreNode.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('friends-side-panel-parent', FriendsSidePanelParent)
|
@ -1,94 +0,0 @@
|
||||
import { html, LitElement } from 'lit'
|
||||
import { connect } from 'pwa-helpers'
|
||||
import { store } from '../../store'
|
||||
import { translate } from '../../../translate'
|
||||
import { friendsSidePanelStyles } from '../../styles/core-css'
|
||||
import './friends-view'
|
||||
import './friends-feed'
|
||||
import '@material/mwc-icon'
|
||||
|
||||
class FriendsSidePanel extends connect(store)(LitElement) {
|
||||
static get properties() {
|
||||
return {
|
||||
setIsOpen: { attribute: false },
|
||||
isOpen: { type: Boolean },
|
||||
selected: { type: String },
|
||||
setHasNewFeed: { attribute: false },
|
||||
closeSidePanel: { attribute: false, type: Object },
|
||||
openSidePanel: { attribute: false, type: Object }
|
||||
}
|
||||
}
|
||||
|
||||
static get styles() {
|
||||
return [friendsSidePanelStyles]
|
||||
}
|
||||
|
||||
constructor() {
|
||||
super()
|
||||
this.selected = 'friends'
|
||||
this.closeSidePanel = this.closeSidePanel.bind(this)
|
||||
this.openSidePanel = this.openSidePanel.bind(this)
|
||||
}
|
||||
|
||||
render() {
|
||||
return html`
|
||||
<div class="parent">
|
||||
<div class="header">
|
||||
<div style="display:flex;align-items:center;gap:10px">
|
||||
<span @click=${() => this.selected = 'friends'} class="${this.selected === 'friends' ? 'active' : 'default'}">${translate('friends.friend12')}</span>
|
||||
<span @click=${() => this.selected = 'feed'} class="${this.selected === 'feed' ? 'active' : 'default'}">${translate('friends.friend13')}</span>
|
||||
</div>
|
||||
<div style="display:flex;gap:15px;align-items:center">
|
||||
<mwc-icon @click=${() => { this.refreshFeed(); }} style="color: var(--black); cursor:pointer;">
|
||||
refresh
|
||||
</mwc-icon>
|
||||
<mwc-icon style="cursor:pointer" @click=${() => { this.setIsOpen(false); }}>
|
||||
close
|
||||
</mwc-icon>
|
||||
</div>
|
||||
</div>
|
||||
<div class="content">
|
||||
<div class="${this.selected === 'friends' ? 'active-content' : 'default-content'}">
|
||||
<friends-view .openSidePanel=${this.openSidePanel} .closeSidePanel=${this.closeSidePanel} .refreshFeed=${() => this.refreshFeed()}></friends-view>
|
||||
</div>
|
||||
<div class="${this.selected === 'feed' ? 'active-content' : 'default-content'}">
|
||||
<friends-feed .setHasNewFeed=${(val) => this.setHasNewFeed(val)}></friends-feed>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
`
|
||||
}
|
||||
|
||||
firstUpdated() {
|
||||
// ...
|
||||
}
|
||||
|
||||
refreshFeed() {
|
||||
this.shadowRoot.querySelector('friends-feed').refresh()
|
||||
}
|
||||
|
||||
closeSidePanel() {
|
||||
this.setIsOpen(false)
|
||||
}
|
||||
|
||||
openSidePanel() {
|
||||
this.setIsOpen(true)
|
||||
}
|
||||
|
||||
// Standard functions
|
||||
getApiKey() {
|
||||
const coreNode = store.getState().app.nodeConfig.knownNodes[store.getState().app.nodeConfig.node]
|
||||
return coreNode.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('friends-side-panel', FriendsSidePanel)
|
@ -1,409 +0,0 @@
|
||||
import { html, LitElement } from 'lit'
|
||||
import { store } from '../../store'
|
||||
import { connect } from 'pwa-helpers'
|
||||
import { parentEpml } from '../show-plugin'
|
||||
import { translate } from '../../../translate'
|
||||
import { friendsViewStyles } from '../../styles/core-css'
|
||||
import './add-friends-modal'
|
||||
import './ChatSideNavHeads'
|
||||
import '../../../../plugins/plugins/core/components/ChatSearchResults'
|
||||
import '@material/mwc-button'
|
||||
import '@material/mwc-dialog'
|
||||
import '@material/mwc-icon'
|
||||
import '@polymer/paper-spinner/paper-spinner-lite.js'
|
||||
import '@polymer/paper-progress/paper-progress.js'
|
||||
import '@vaadin/icon'
|
||||
import '@vaadin/icons'
|
||||
import '@vaadin/button'
|
||||
|
||||
class FriendsView extends connect(store)(LitElement) {
|
||||
static get properties() {
|
||||
return {
|
||||
error: { type: Boolean },
|
||||
toggle: { attribute: false },
|
||||
userName: { type: String },
|
||||
errorMessage: { type: String },
|
||||
successMessage: { type: String },
|
||||
setUserName: { attribute: false },
|
||||
friendList: { type: Array },
|
||||
userSelected: { type: Object },
|
||||
isLoading: { type: Boolean },
|
||||
userFoundModalOpen: { type: Boolean },
|
||||
userFound: { type: Array },
|
||||
isOpenAddFriendsModal: { type: Boolean },
|
||||
editContent: { type: Object },
|
||||
mySelectedFeeds: { type: Array },
|
||||
refreshFeed: { attribute: false },
|
||||
closeSidePanel: { attribute: false, type: Object },
|
||||
openSidePanel: { attribute: false, type: Object }
|
||||
}
|
||||
}
|
||||
|
||||
static get styles() {
|
||||
return [friendsViewStyles]
|
||||
}
|
||||
|
||||
constructor() {
|
||||
super()
|
||||
this.error = false
|
||||
this.observerHandler = this.observerHandler.bind(this)
|
||||
this.viewElement = ''
|
||||
this.downObserverElement = ''
|
||||
this.myAddress = store.getState().app.selectedAddress.address
|
||||
this.errorMessage = ''
|
||||
this.successMessage = ''
|
||||
this.friendList = []
|
||||
this.userSelected = {}
|
||||
this.isLoading = false
|
||||
this.userFoundModalOpen = false
|
||||
this.userFound = []
|
||||
this.nodeUrl = this.getNodeUrl()
|
||||
this.myNode = this.getMyNode()
|
||||
this.isOpenAddFriendsModal = false
|
||||
this.editContent = null
|
||||
this.addToFriendList = this.addToFriendList.bind(this)
|
||||
this._updateFriends = this._updateFriends.bind(this)
|
||||
this._updateFeed = this._updateFeed.bind(this)
|
||||
this._addFriend = this._addFriend.bind(this)
|
||||
}
|
||||
|
||||
render() {
|
||||
return html`
|
||||
<div class="container">
|
||||
<div id="viewElement" class="container-body" style=${"position: relative"}>
|
||||
<p class="group-name">My Friends</p>
|
||||
<div class="search-field">
|
||||
<input
|
||||
type="text"
|
||||
class="name-input"
|
||||
?disabled=${this.isLoading}
|
||||
id="sendTo"
|
||||
placeholder="${translate("friends.friend1")}"
|
||||
value=${this.userSelected.name ? this.userSelected.name : ''}
|
||||
@keypress=${(e) => {
|
||||
if (e.key === 'Enter') {
|
||||
this.userSearch()
|
||||
}
|
||||
}}
|
||||
>
|
||||
<vaadin-icon
|
||||
@click=${this.userSearch}
|
||||
slot="icon"
|
||||
icon="vaadin:search"
|
||||
class="search-icon"
|
||||
>
|
||||
</vaadin-icon>
|
||||
</div>
|
||||
<div class="search-results-div">
|
||||
<chat-search-results
|
||||
.onClickFunc=${(result) => {
|
||||
this.userSelected = result;
|
||||
this.isOpenAddFriendsModal = true
|
||||
this.userFound = [];
|
||||
this.userFoundModalOpen = false;
|
||||
}}
|
||||
.closeFunc=${() => {
|
||||
this.userFoundModalOpen = false;
|
||||
this.userFound = [];
|
||||
}}
|
||||
.searchResults=${this.userFound}
|
||||
?isOpen=${this.userFoundModalOpen}
|
||||
?loading=${this.isLoading}
|
||||
>
|
||||
</chat-search-results>
|
||||
</div>
|
||||
${this.friendList.map((item) => {
|
||||
return html`
|
||||
<chat-side-nav-heads
|
||||
activeChatHeadUrl=""
|
||||
.setActiveChatHeadUrl=${(val) => { }}
|
||||
.chatInfo=${item}
|
||||
.openEditFriend=${(val) => this.openEditFriend(val)}
|
||||
.closeSidePanel=${this.closeSidePanel}
|
||||
>
|
||||
</chat-side-nav-heads>
|
||||
`
|
||||
})}
|
||||
<div id="downObserver"></div>
|
||||
</div>
|
||||
</div>
|
||||
<add-friends-modal
|
||||
?isOpen=${this.isOpenAddFriendsModal}
|
||||
.setIsOpen=${(val) => {
|
||||
this.isOpenAddFriendsModal = val
|
||||
}}
|
||||
.userSelected=${this.userSelected}
|
||||
.onSubmit=${(val, isRemove) => this.addToFriendList(val, isRemove)}
|
||||
.editContent=${this.editContent}
|
||||
.onClose=${() => this.onClose()}
|
||||
.mySelectedFeeds=${this.mySelectedFeeds}
|
||||
>
|
||||
</add-friends-modal>
|
||||
`
|
||||
}
|
||||
|
||||
firstUpdated() {
|
||||
this.viewElement = this.shadowRoot.getElementById('viewElement')
|
||||
this.downObserverElement = this.shadowRoot.getElementById('downObserver')
|
||||
this.elementObserver()
|
||||
this.mySelectedFeeds = JSON.parse(localStorage.getItem('friends-my-selected-feeds') || "[]")
|
||||
this.friendList = JSON.parse(localStorage.getItem('friends-my-friend-list') || "[]")
|
||||
}
|
||||
|
||||
getNodeUrl() {
|
||||
const myNode = store.getState().app.nodeConfig.knownNodes[store.getState().app.nodeConfig.node]
|
||||
return myNode.protocol + '://' + myNode.domain + ':' + myNode.port
|
||||
}
|
||||
|
||||
getMyNode() {
|
||||
return store.getState().app.nodeConfig.knownNodes[store.getState().app.nodeConfig.node]
|
||||
}
|
||||
|
||||
getMoreFriends() { }
|
||||
|
||||
_updateFriends(event) {
|
||||
this.friendList = event.detail
|
||||
}
|
||||
|
||||
_updateFeed(event) {
|
||||
this.mySelectedFeeds = event.detail
|
||||
this.requestUpdate()
|
||||
}
|
||||
|
||||
_addFriend(event) {
|
||||
const name = event.detail;
|
||||
const findFriend = this.friendList.find((friend) => friend.name === name)
|
||||
if (findFriend) {
|
||||
this.editContent = { ...findFriend, mySelectedFeeds: this.mySelectedFeeds }
|
||||
this.userSelected = findFriend
|
||||
} else {
|
||||
this.userSelected = {
|
||||
name
|
||||
}
|
||||
}
|
||||
|
||||
this.isOpenAddFriendsModal = true
|
||||
this.openSidePanel()
|
||||
}
|
||||
|
||||
connectedCallback() {
|
||||
super.connectedCallback()
|
||||
window.addEventListener('friends-my-friend-list-event', this._updateFriends)
|
||||
window.addEventListener('friends-my-selected-feeds-event', this._updateFeed)
|
||||
window.addEventListener('add-friend', this._addFriend)
|
||||
}
|
||||
|
||||
disconnectedCallback() {
|
||||
window.removeEventListener('friends-my-friend-list-event', this._updateFriends)
|
||||
window.removeEventListener('friends-my-selected-feeds-event', this._updateFeed)
|
||||
window.removeEventListener('add-friend', this._addFriend)
|
||||
super.disconnectedCallback()
|
||||
}
|
||||
|
||||
elementObserver() {
|
||||
const options = {
|
||||
root: this.viewElement,
|
||||
rootMargin: '0px',
|
||||
threshold: 1
|
||||
}
|
||||
|
||||
// identify an element to observe
|
||||
const elementToObserve = this.downObserverElement
|
||||
|
||||
// passing it a callback function
|
||||
const observer = new IntersectionObserver(
|
||||
this.observerHandler,
|
||||
options
|
||||
)
|
||||
|
||||
// call `observe()` on that MutationObserver instance,
|
||||
// passing it the element to observe, and the options object
|
||||
observer.observe(elementToObserve)
|
||||
}
|
||||
|
||||
observerHandler(entries) {
|
||||
if (!entries[0].isIntersecting) {
|
||||
|
||||
} else {
|
||||
if (this.friendList.length < 20) {
|
||||
return;
|
||||
}
|
||||
|
||||
this.getMoreFriends()
|
||||
}
|
||||
}
|
||||
|
||||
async userSearch() {
|
||||
const nameValue = this.shadowRoot.getElementById('sendTo').value
|
||||
|
||||
if (!nameValue) {
|
||||
this.userFound = []
|
||||
this.userFoundModalOpen = true
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
const url = `${this.nodeUrl}/names/${nameValue}`
|
||||
const res = await fetch(url)
|
||||
const result = await res.json()
|
||||
|
||||
if (result.error === 401) {
|
||||
this.userFound = []
|
||||
} else {
|
||||
this.userFound = [
|
||||
result
|
||||
]
|
||||
}
|
||||
|
||||
this.userFoundModalOpen = true;
|
||||
} catch (error) {
|
||||
// let err4string = get("chatpage.cchange35")
|
||||
// parentEpml.request('showSnackBar', `${err4string}`)
|
||||
}
|
||||
}
|
||||
|
||||
async myFollowName(name) {
|
||||
let items = [
|
||||
name
|
||||
]
|
||||
|
||||
let namesJsonString = JSON.stringify({ "items": items })
|
||||
|
||||
return await parentEpml.request('apiCall', {
|
||||
url: `/lists/followedNames?apiKey=${this.getApiKey()}`,
|
||||
method: 'POST',
|
||||
headers: {
|
||||
'Content-Type': 'application/json'
|
||||
},
|
||||
body: `${namesJsonString}`
|
||||
})
|
||||
}
|
||||
|
||||
async unFollowName(name) {
|
||||
let items = [
|
||||
name
|
||||
]
|
||||
|
||||
let namesJsonString = JSON.stringify({ "items": items })
|
||||
|
||||
return await parentEpml.request('apiCall', {
|
||||
url: `/lists/followedNames?apiKey=${this.getApiKey()}`,
|
||||
method: 'DELETE',
|
||||
headers: {
|
||||
'Content-Type': 'application/json'
|
||||
},
|
||||
body: `${namesJsonString}`
|
||||
})
|
||||
}
|
||||
|
||||
async addToFriendList(val, isRemove) {
|
||||
const copyVal = { ...val }
|
||||
delete copyVal.mySelectedFeeds
|
||||
|
||||
if (isRemove) {
|
||||
this.friendList = this.friendList.filter((item) => item.name !== copyVal.name)
|
||||
} else if (this.editContent) {
|
||||
const findFriend = this.friendList.findIndex(item => item.name === copyVal.name)
|
||||
if (findFriend !== -1) {
|
||||
const copyList = [...this.friendList]
|
||||
copyList[findFriend] = copyVal
|
||||
this.friendList = copyList
|
||||
|
||||
}
|
||||
} else {
|
||||
this.friendList = [...this.friendList, copyVal]
|
||||
}
|
||||
|
||||
if (!copyVal.willFollow || isRemove) {
|
||||
await this.unFollowName(copyVal.name)
|
||||
} else if (copyVal.willFollow) {
|
||||
await this.myFollowName(copyVal.name)
|
||||
}
|
||||
|
||||
this.setMySelectedFeeds(val.mySelectedFeeds)
|
||||
|
||||
await new Promise((res) => {
|
||||
setTimeout(() => {
|
||||
res()
|
||||
}, 50)
|
||||
})
|
||||
|
||||
this.userSelected = {}
|
||||
this.shadowRoot.getElementById('sendTo').value = ''
|
||||
this.isLoading = false
|
||||
this.isOpenAddFriendsModal = false
|
||||
this.editContent = null
|
||||
this.setMyFriends(this.friendList)
|
||||
|
||||
if (!isRemove && this.friendList.length === 1) {
|
||||
this.refreshFeed()
|
||||
}
|
||||
}
|
||||
|
||||
setMyFriends(friendList) {
|
||||
localStorage.setItem('friends-my-friend-list', JSON.stringify(friendList));
|
||||
const tempSettingsData = JSON.parse(localStorage.getItem('temp-settings-data') || "{}")
|
||||
const newTemp = {
|
||||
...tempSettingsData,
|
||||
userLists: {
|
||||
data: [friendList],
|
||||
timestamp: Date.now()
|
||||
}
|
||||
}
|
||||
|
||||
localStorage.setItem('temp-settings-data', JSON.stringify(newTemp))
|
||||
|
||||
this.dispatchEvent(
|
||||
new CustomEvent('temp-settings-data-event', {
|
||||
bubbles: true,
|
||||
composed: true
|
||||
})
|
||||
)
|
||||
}
|
||||
|
||||
setMySelectedFeeds(mySelectedFeeds) {
|
||||
this.mySelectedFeeds = mySelectedFeeds
|
||||
const tempSettingsData = JSON.parse(localStorage.getItem('temp-settings-data') || "{}")
|
||||
|
||||
const newTemp = {
|
||||
...tempSettingsData,
|
||||
friendsFeed: {
|
||||
data: mySelectedFeeds,
|
||||
timestamp: Date.now()
|
||||
}
|
||||
}
|
||||
|
||||
localStorage.setItem('temp-settings-data', JSON.stringify(newTemp))
|
||||
localStorage.setItem('friends-my-selected-feeds', JSON.stringify(mySelectedFeeds))
|
||||
}
|
||||
|
||||
openEditFriend(val) {
|
||||
this.isOpenAddFriendsModal = true
|
||||
this.userSelected = val
|
||||
this.editContent = { ...val, mySelectedFeeds: this.mySelectedFeeds }
|
||||
}
|
||||
|
||||
onClose() {
|
||||
this.isLoading = false;
|
||||
this.isOpenAddFriendsModal = false
|
||||
this.editContent = null
|
||||
this.userSelected = {}
|
||||
}
|
||||
|
||||
// Standard functions
|
||||
getApiKey() {
|
||||
const coreNode = store.getState().app.nodeConfig.knownNodes[store.getState().app.nodeConfig.node]
|
||||
return coreNode.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('friends-view', FriendsView)
|
@ -1,562 +0,0 @@
|
||||
import { html, LitElement } from 'lit'
|
||||
import { connect } from 'pwa-helpers'
|
||||
import { store } from '../../store'
|
||||
import { parentEpml } from '../show-plugin'
|
||||
import { get, translate } from '../../../translate'
|
||||
import { profileModalUpdateStyles } from '../../styles/core-css'
|
||||
import '@material/mwc-button'
|
||||
import '@material/mwc-checkbox'
|
||||
import '@material/mwc-dialog'
|
||||
import '@material/mwc-icon'
|
||||
import '@polymer/paper-spinner/paper-spinner-lite.js'
|
||||
import '@vaadin/tooltip'
|
||||
|
||||
class ProfileModalUpdate extends connect(store)(LitElement) {
|
||||
static get properties() {
|
||||
return {
|
||||
isOpen: { type: Boolean },
|
||||
setIsOpen: { attribute: false },
|
||||
isLoading: { type: Boolean },
|
||||
onSubmit: { attribute: false },
|
||||
editContent: { type: Object },
|
||||
onClose: { attribute: false },
|
||||
tagline: { type: String },
|
||||
bio: { type: String },
|
||||
wallets: { type: Array },
|
||||
hasFetchedArrr: { type: Boolean },
|
||||
isOpenCustomDataModal: { type: Boolean },
|
||||
customData: { type: Object },
|
||||
newCustomDataField: { type: Object },
|
||||
newFieldName: { type: String },
|
||||
qortalRequestCustomData: { type: Object },
|
||||
newCustomDataKey: { type: String },
|
||||
newCustomDataValue: { type: String },
|
||||
isSaving: { type: Boolean }
|
||||
}
|
||||
}
|
||||
|
||||
static get styles() {
|
||||
return [profileModalUpdateStyles]
|
||||
}
|
||||
|
||||
constructor() {
|
||||
super();
|
||||
this.isOpen = false
|
||||
this.isLoading = false
|
||||
this.nodeUrl = this.getNodeUrl()
|
||||
this.myNode = this.getMyNode()
|
||||
this.tagline = ''
|
||||
this.bio = ''
|
||||
this.walletList = ['btc', 'ltc', 'doge', 'dgb', 'rvn', 'arrr']
|
||||
let wallets = {}
|
||||
this.walletList.forEach((item) => {
|
||||
wallets[item] = ''
|
||||
})
|
||||
this.wallets = wallets
|
||||
this.walletsUi = new Map()
|
||||
let coinProp = {
|
||||
wallet: null
|
||||
}
|
||||
this.walletList.forEach((c, i) => {
|
||||
this.walletsUi.set(c, { ...coinProp })
|
||||
})
|
||||
this.walletsUi.get('btc').wallet = store.getState().app.selectedAddress.btcWallet
|
||||
this.walletsUi.get('ltc').wallet = store.getState().app.selectedAddress.ltcWallet
|
||||
this.walletsUi.get('doge').wallet = store.getState().app.selectedAddress.dogeWallet
|
||||
this.walletsUi.get('dgb').wallet = store.getState().app.selectedAddress.dgbWallet
|
||||
this.walletsUi.get('rvn').wallet = store.getState().app.selectedAddress.rvnWallet
|
||||
this.hasFetchedArrr = false
|
||||
this.isOpenCustomDataModal = false
|
||||
this.customData = {}
|
||||
this.newCustomDataKey = ""
|
||||
this.newCustomDataValue = ""
|
||||
this.newCustomDataField = {}
|
||||
this.newFieldName = ''
|
||||
this.isSaving = false
|
||||
this.addPrivate = this.addPrivate.bind(this)
|
||||
this.checkForPrivate = this.checkForPrivate.bind(this)
|
||||
}
|
||||
|
||||
render() {
|
||||
return html`
|
||||
<div class="modal-overlay ${this.isOpen ? '' : 'hidden'}">
|
||||
<div class="modal-content">
|
||||
<div class="inner-content">
|
||||
<div style="height:15px"></div>
|
||||
<div style="display: flex;flex-direction: column;">
|
||||
<label
|
||||
for="tagline"
|
||||
id="taglineLabel"
|
||||
style="color: var(--black);"
|
||||
>
|
||||
${translate('profile.profile4')}
|
||||
</label>
|
||||
<textarea
|
||||
class="input"
|
||||
@change=${(e) => {
|
||||
this.tagline = e.target.value;
|
||||
}}
|
||||
.value=${this.tagline}
|
||||
?disabled=${this.isLoading}
|
||||
id="tagline"
|
||||
placeholder="${translate('profile.profile4')}"
|
||||
rows="3"
|
||||
></textarea>
|
||||
</div>
|
||||
<div style="height:15px"></div>
|
||||
<div style="display: flex;flex-direction: column;">
|
||||
<label
|
||||
for="bio"
|
||||
id="bioLabel"
|
||||
style="color: var(--black);"
|
||||
>
|
||||
${translate('profile.profile5')}
|
||||
</label>
|
||||
<textarea
|
||||
class="input"
|
||||
@change=${(e) => {
|
||||
this.bio = e.target.value;
|
||||
}}
|
||||
.value=${this.bio}
|
||||
?disabled=${this.isLoading}
|
||||
id="bio"
|
||||
placeholder="${translate('profile.profile5')}"
|
||||
rows="3"
|
||||
></textarea>
|
||||
</div>
|
||||
<div style="height:15px"></div>
|
||||
<p>${translate('profile.profile6')}</p>
|
||||
<div style="display: flex;flex-direction: column;">
|
||||
${Object.keys(this.wallets).map((key) => {
|
||||
return html`
|
||||
<div style="display:flex;justify-content:center;flex-direction:column">
|
||||
<label
|
||||
for=${key}
|
||||
id="taglineLabel"
|
||||
style="color: var(--black);font-size:16px"
|
||||
>
|
||||
${key}
|
||||
</label>
|
||||
<div style="display:flex;gap:15px;align-items:center">
|
||||
<input
|
||||
id=${key}
|
||||
placeholder=${key + ' ' + get('settings.address')}
|
||||
class="input"
|
||||
.value=${this.wallets[key]}
|
||||
@change=${(e) => {
|
||||
this.wallets = {
|
||||
...this.wallets,
|
||||
[key]: e.target.value,
|
||||
};
|
||||
}}
|
||||
/>
|
||||
<mwc-icon
|
||||
id=${`${key}-upload`}
|
||||
@click=${() =>
|
||||
this.fillAddress(key)}
|
||||
style="color:var(--black);cursor:pointer"
|
||||
>
|
||||
upload_2
|
||||
</mwc-icon>
|
||||
<vaadin-tooltip
|
||||
for=${`${key}-upload`}
|
||||
position="bottom"
|
||||
hover-delay=${200}
|
||||
hide-delay=${1}
|
||||
text=${translate('profile.profile21')}
|
||||
></vaadin-tooltip>
|
||||
</div>
|
||||
</div>
|
||||
`
|
||||
})}
|
||||
</div>
|
||||
<div style="display: flex;flex-direction: column;">
|
||||
${Object.keys(this.customData).map((key) => {
|
||||
return html`
|
||||
<div style="display:flex;justify-content:center;flex-direction:column;gap:25px">
|
||||
<div style="display:flex;gap:15px;align-items:center">
|
||||
<p style="color: var(--black);font-size:16px">${key}</p>
|
||||
<mwc-icon
|
||||
@click=${() => this.updateCustomData(key, this.customData[key])}
|
||||
style="color:var(--black);cursor:pointer"
|
||||
>
|
||||
edit
|
||||
</mwc-icon>
|
||||
<mwc-icon
|
||||
@click=${() => this.removeCustomData(key)}
|
||||
style="color:var(--black);cursor:pointer"
|
||||
>
|
||||
remove
|
||||
</mwc-icon>
|
||||
</div>
|
||||
</div>
|
||||
`
|
||||
})}
|
||||
</div>
|
||||
</div>
|
||||
<div style="display:flex;justify-content:space-between;align-items:center;margin-top:20px">
|
||||
<button
|
||||
class="modal-button-red"
|
||||
?disabled="${this.isLoading}"
|
||||
@click="${() => {
|
||||
this.setIsOpen(false);
|
||||
this.clearFields();
|
||||
this.onClose();
|
||||
}}"
|
||||
>
|
||||
${translate('general.close')}
|
||||
</button>
|
||||
<div style="display:flex;gap:10px;align-items:center">
|
||||
<button
|
||||
?disabled="${this.isLoading}"
|
||||
class="modal-button"
|
||||
@click=${() => {
|
||||
this.isOpenCustomDataModal = true;
|
||||
}}
|
||||
>
|
||||
${translate('profile.profile8')}
|
||||
</button>
|
||||
<button
|
||||
?disabled="${this.isLoading}"
|
||||
class="modal-button"
|
||||
@click=${() => {
|
||||
if (this.isSaving) return
|
||||
this.saveProfile();
|
||||
}}
|
||||
>
|
||||
${this.isSaving ? html`
|
||||
<paper-spinner-lite active></paper-spinner-lite>
|
||||
` : ''}
|
||||
${this.isSaving ? '' : translate('profile.profile3')}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- add custom vars -->
|
||||
<div
|
||||
class="modal-overlay ${this.isOpenCustomDataModal
|
||||
? ''
|
||||
: 'hidden'}"
|
||||
style="z-index:1001"
|
||||
>
|
||||
<div class="modal-content" style="max-width: 950px">
|
||||
<div class="inner-content">
|
||||
<div style="display:flex; justify-content:flex-end">
|
||||
<div class="checkbox-row" style="font-size:16px">
|
||||
<label for="isPrivate" style="color: var(--black);">${get('profile.profile23')}</label>
|
||||
<mwc-checkbox id="isPrivate" @change=${(e) => this.addPrivate(e)} ?checked=${this.checkForPrivate()}></mwc-checkbox>
|
||||
</div>
|
||||
</div>
|
||||
<div style="height:15px"></div>
|
||||
<div style="display:flex;justify-content:center;flex-direction:column">
|
||||
<label
|
||||
for="key-name"
|
||||
id="taglineLabel"
|
||||
style="color: var(--black);font-size:16px"
|
||||
>
|
||||
${translate('profile.profile9')}
|
||||
</label>
|
||||
<div style="display:flex;gap:15px;align-items:center">
|
||||
<input
|
||||
id="key-name"
|
||||
placeholder=${translate(
|
||||
'profile.profile9'
|
||||
)}
|
||||
?disabled=${!!this.qortalRequestCustomData}
|
||||
class="input"
|
||||
.value=${this.newCustomDataKey}
|
||||
@change=${(e) => {
|
||||
this.newCustomDataKey = e.target.value
|
||||
}}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
<p style=${`${Object.keys(this.newCustomDataField).length ? "margin: 10px 0 10px 0;" : "margin: 10px 0 0 0;"}`}>
|
||||
${translate('profile.profile10')}
|
||||
</p>
|
||||
<div style="display: flex;flex-direction: column;">
|
||||
${Object.keys(this.newCustomDataField).map((key) => {
|
||||
return html`
|
||||
<div style="display:flex;justify-content:center;flex-direction:column">
|
||||
<label for=${key} id="taglineLabel" style="color: var(--black);font-size:16px">${key}</label>
|
||||
<div style="display:flex;gap:15px;align-items:center">
|
||||
<input
|
||||
id=${key}
|
||||
placeholder=${translate('profile.profile13')}
|
||||
class="input"
|
||||
.value=${this.newCustomDataField[key]}
|
||||
@change=${(e) => {
|
||||
this.newCustomDataField = {
|
||||
...this.newCustomDataField,
|
||||
[key]: e.target.value,
|
||||
};
|
||||
}}
|
||||
/>
|
||||
<mwc-icon
|
||||
@click=${() => this.removeField(key)}
|
||||
style="color:var(--black);cursor:pointer"
|
||||
>
|
||||
remove
|
||||
</mwc-icon>
|
||||
</div>
|
||||
</div>
|
||||
`
|
||||
})}
|
||||
</div>
|
||||
<div style=${`display: flex; flex-direction: row; align-items: center;justify-content:space-between; ${Object.keys(this.newCustomDataField).length ? "margin-top: 10px" : ""}`}>
|
||||
<div style="width:100%;display:flex; flex-direction: column; align-items: flex-start;justify-content:center;gap:10px;">
|
||||
<input
|
||||
placeholder=${translate('profile.profile12')}
|
||||
class="input"
|
||||
.value=${this.newFieldName}
|
||||
@change=${(e) => {
|
||||
this.newFieldName = e.target.value
|
||||
}}
|
||||
/>
|
||||
<input
|
||||
id="value-name"
|
||||
placeholder=${translate('profile.profile13')}
|
||||
class="input"
|
||||
.value=${this.newCustomDataValue}
|
||||
@change=${(e) => {
|
||||
this.newCustomDataValue = e.target.value;
|
||||
}}
|
||||
/>
|
||||
</div>
|
||||
<button
|
||||
class="modal-button"
|
||||
style="margin-top: 25px; width: 100px; min-height: 80px;"
|
||||
@click=${() => {
|
||||
this.addField();
|
||||
}}
|
||||
>
|
||||
${translate('profile.profile11')}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
<div style="display:flex;justify-content:space-between;align-items:center;margin-top:20px">
|
||||
<button
|
||||
class="modal-button-red"
|
||||
?disabled="${this.isLoading}"
|
||||
@click="${() => {
|
||||
this.isOpenCustomDataModal = false
|
||||
this.newCustomDataKey = ""
|
||||
this.newCustomDataField = {};
|
||||
}}"
|
||||
>
|
||||
${translate('general.close')}
|
||||
</button>
|
||||
<button
|
||||
?disabled="${this.isSaving}"
|
||||
class="modal-button"
|
||||
@click=${() => {
|
||||
this.addCustomData();
|
||||
}}
|
||||
>
|
||||
${translate('profile.profile8')}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
`
|
||||
}
|
||||
|
||||
async firstUpdated() {
|
||||
try {
|
||||
await this.fetchWalletAddress('arrr')
|
||||
} catch (error) {
|
||||
console.log({ error })
|
||||
} finally {
|
||||
}
|
||||
}
|
||||
|
||||
async updated(changedProperties) {
|
||||
if (changedProperties && changedProperties.has('editContent') && this.editContent) {
|
||||
const { bio, tagline, wallets, customData } = this.editContent
|
||||
this.bio = bio ?? ''
|
||||
this.tagline = tagline ?? ''
|
||||
let formWallets = { ...this.wallets }
|
||||
if (wallets && Object.keys(wallets).length) {
|
||||
Object.keys(formWallets).forEach((key) => {
|
||||
if (wallets[key]) {
|
||||
formWallets[key] = wallets[key]
|
||||
}
|
||||
})
|
||||
}
|
||||
this.wallets = formWallets
|
||||
|
||||
this.customData = { ...customData }
|
||||
this.requestUpdate();
|
||||
}
|
||||
if (changedProperties && changedProperties.has('qortalRequestCustomData') && this.qortalRequestCustomData) {
|
||||
this.isOpenCustomDataModal = true
|
||||
this.newCustomDataField = { ...this.qortalRequestCustomData.payload.customData }
|
||||
this.newCustomDataKey = this.qortalRequestCustomData.property
|
||||
this.requestUpdate()
|
||||
}
|
||||
}
|
||||
|
||||
async fetchWalletAddress(coin) {
|
||||
switch (coin) {
|
||||
case 'arrr':
|
||||
const arrrWalletName = `${coin}Wallet`;
|
||||
|
||||
let res = await parentEpml.request('apiCall', {
|
||||
url: `/crosschain/${coin}/walletaddress?apiKey=${this.myNode.apiKey}`,
|
||||
method: 'POST',
|
||||
body: `${store.getState().app.selectedAddress[arrrWalletName].seed58}`
|
||||
})
|
||||
if (res != null && res.error != 1201 && res.length === 78) {
|
||||
this.arrrWalletAddress = res
|
||||
this.hasFetchedArrr = true
|
||||
}
|
||||
break
|
||||
|
||||
default:
|
||||
// Not used for other coins yet
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
async getSelectedWalletAddress(wallet) {
|
||||
switch (wallet) {
|
||||
case 'arrr':
|
||||
if (!this.arrrWalletAddress) {
|
||||
try {
|
||||
await this.fetchWalletAddress('arrr')
|
||||
} catch (error) {
|
||||
console.log({ error })
|
||||
}
|
||||
}
|
||||
// Use address returned by core API
|
||||
return this.arrrWalletAddress
|
||||
|
||||
default:
|
||||
// Use locally derived address
|
||||
return this.walletsUi.get(wallet).wallet.address
|
||||
}
|
||||
}
|
||||
|
||||
getNodeUrl() {
|
||||
const myNode = store.getState().app.nodeConfig.knownNodes[store.getState().app.nodeConfig.node]
|
||||
return myNode.protocol + '://' + myNode.domain + ':' + myNode.port
|
||||
}
|
||||
|
||||
getMyNode() {
|
||||
return store.getState().app.nodeConfig.knownNodes[store.getState().app.nodeConfig.node]
|
||||
}
|
||||
|
||||
clearFields() {
|
||||
this.bio = ''
|
||||
this.tagline = ''
|
||||
}
|
||||
|
||||
async fillAddress(coin) {
|
||||
const address = await this.getSelectedWalletAddress(coin)
|
||||
|
||||
if (address) {
|
||||
this.wallets = {
|
||||
...this.wallets,
|
||||
[coin]: address
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
async saveProfile() {
|
||||
try {
|
||||
const data = {
|
||||
version: 1,
|
||||
tagline: this.tagline,
|
||||
bio: this.bio,
|
||||
wallets: this.wallets,
|
||||
customData: this.customData
|
||||
}
|
||||
this.isSaving = true
|
||||
await this.onSubmit(data)
|
||||
this.setIsOpen(false)
|
||||
this.clearFields()
|
||||
this.onClose('success')
|
||||
} catch (error) { } finally {
|
||||
this.isSaving = false
|
||||
}
|
||||
}
|
||||
|
||||
removeField(key) {
|
||||
const copyObj = { ...this.newCustomDataField }
|
||||
delete copyObj[key]
|
||||
this.newCustomDataField = copyObj
|
||||
}
|
||||
|
||||
addField() {
|
||||
if (!this.newFieldName || !this.newCustomDataValue) {
|
||||
let snack5string = get("profile.profile24")
|
||||
parentEpml.request('showSnackBar', `${snack5string}`)
|
||||
return
|
||||
}
|
||||
const copyObj = { ...this.newCustomDataField }
|
||||
copyObj[this.newFieldName] = this.newCustomDataValue
|
||||
this.newCustomDataField = copyObj
|
||||
this.newFieldName = ''
|
||||
this.newCustomDataValue = ''
|
||||
}
|
||||
|
||||
addCustomData() {
|
||||
const copyObj = { ...this.customData }
|
||||
copyObj[this.newCustomDataKey] = this.newCustomDataField
|
||||
this.customData = copyObj
|
||||
this.newCustomDataKey = ''
|
||||
this.newCustomDataField = {}
|
||||
this.newFieldName = ''
|
||||
this.newCustomDataValue = ''
|
||||
this.isOpenCustomDataModal = false
|
||||
}
|
||||
|
||||
updateCustomData(key, data) {
|
||||
this.isOpenCustomDataModal = true
|
||||
this.newCustomDataField = data
|
||||
this.newCustomDataKey = key
|
||||
|
||||
}
|
||||
|
||||
removeCustomData(key) {
|
||||
const copyObj = { ...this.customData }
|
||||
delete copyObj[key]
|
||||
this.customData = copyObj
|
||||
}
|
||||
|
||||
checkForPrivate() {
|
||||
let isPrivate = false
|
||||
if (this.newCustomDataKey.includes('-private')) isPrivate = true
|
||||
return isPrivate
|
||||
}
|
||||
|
||||
addPrivate(e) {
|
||||
if (e.target.checked) {
|
||||
if (this.newCustomDataKey.includes('-private')) {
|
||||
|
||||
} else {
|
||||
this.newCustomDataKey = this.newCustomDataKey + '-private'
|
||||
}
|
||||
} else {
|
||||
this.newCustomDataKey = this.newCustomDataKey.replace('-private', '')
|
||||
}
|
||||
}
|
||||
|
||||
// Standard functions
|
||||
getApiKey() {
|
||||
const coreNode = store.getState().app.nodeConfig.knownNodes[store.getState().app.nodeConfig.node]
|
||||
return coreNode.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('profile-modal-update', ProfileModalUpdate)
|
@ -1,929 +0,0 @@
|
||||
import { html, LitElement } from 'lit'
|
||||
import { connect } from 'pwa-helpers'
|
||||
import { store } from '../../store'
|
||||
import { parentEpml } from '../show-plugin'
|
||||
import { publishData, modalHelper } from '../../../../plugins/plugins/utils/classes'
|
||||
import { setNewTab, setProfileData, setSideEffectAction } from '../../redux/app/app-actions'
|
||||
import {
|
||||
decryptGroupData,
|
||||
encryptDataGroup,
|
||||
objectToBase64,
|
||||
uint8ArrayToObject
|
||||
} from '../../../../plugins/plugins/core/components/qdn-action-encryption'
|
||||
import { get, translate } from '../../../translate'
|
||||
import { profileQdnStyles } from '../../styles/core-css'
|
||||
import ShortUniqueId from 'short-unique-id'
|
||||
import WebWorker2 from '../WebWorkerFile.js'
|
||||
import './avatar'
|
||||
import './friends-side-panel'
|
||||
import './profile-modal-update'
|
||||
import '../notification-view/popover'
|
||||
import '@material/mwc-icon'
|
||||
import '@polymer/paper-dialog/paper-dialog.js'
|
||||
import '@polymer/paper-spinner/paper-spinner-lite.js'
|
||||
import '@vaadin/tooltip'
|
||||
|
||||
class ProfileQdn extends connect(store)(LitElement) {
|
||||
static get properties() {
|
||||
return {
|
||||
isOpen: { type: Boolean },
|
||||
syncPercentage: { type: Number },
|
||||
settingsRawData: { type: Object },
|
||||
valuesToBeSavedOnQdn: { type: Object },
|
||||
resourceExists: { type: Boolean },
|
||||
isSaving: { type: Boolean },
|
||||
fee: { type: Object },
|
||||
name: { type: String },
|
||||
isOpenProfileModalUpdate: { type: Boolean },
|
||||
editContent: { type: Object },
|
||||
profileData: { type: Object },
|
||||
imageUrl: { type: String },
|
||||
dialogOpenedProfile: { type: Boolean },
|
||||
profileDataVisiting: { type: Object },
|
||||
nameVisiting: { type: String },
|
||||
hasName: { type: Boolean },
|
||||
resourceExistsVisiting: { type: Boolean },
|
||||
error: { type: String },
|
||||
isFriend: { type: Boolean }
|
||||
}
|
||||
}
|
||||
|
||||
static get styles() {
|
||||
return [profileQdnStyles]
|
||||
}
|
||||
|
||||
constructor() {
|
||||
super()
|
||||
this.isOpen = false
|
||||
this.getProfile = this.getProfile.bind(this)
|
||||
this._handleQortalRequestSetData = this._handleQortalRequestSetData.bind(this)
|
||||
this._handleOpenVisiting = this._handleOpenVisiting.bind(this)
|
||||
this.setValues = this.setValues.bind(this)
|
||||
this.saveToQdn = this.saveToQdn.bind(this)
|
||||
this.syncPercentage = 0
|
||||
this.hasRetrievedResource = false
|
||||
this.hasAttemptedToFetchResource = false
|
||||
this.resourceExists = undefined
|
||||
this.settingsRawData = null
|
||||
this.nodeUrl = this.getNodeUrl()
|
||||
this.myNode = this.getMyNode()
|
||||
this.valuesToBeSavedOnQdn = {}
|
||||
this.isSaving = false
|
||||
this.fee = null
|
||||
this.name = undefined
|
||||
this.uid = new ShortUniqueId()
|
||||
this.isOpenProfileModalUpdate = false
|
||||
this.editContent = null
|
||||
this.profileData = null
|
||||
this.qortalRequestCustomData = null
|
||||
this.imageUrl = ''
|
||||
this.dialogOpenedProfile = false
|
||||
this.profileDataVisiting = null
|
||||
this.nameVisiting = ''
|
||||
this.hasName = false
|
||||
this.resourceExistsVisiting = undefined
|
||||
this.error = ''
|
||||
this.getUserAddress = this.getUserAddress.bind(this)
|
||||
this.checkIfInFriendsList = this.checkIfInFriendsList.bind(this)
|
||||
this.isFriend = undefined
|
||||
}
|
||||
|
||||
render() {
|
||||
return html`
|
||||
${this.isSaving || (!this.error && this.resourceExists === undefined) ?
|
||||
html`
|
||||
<paper-spinner-lite active style="display: block; margin: 0 auto;"></paper-spinner-lite>
|
||||
`
|
||||
: !this.name ? html`
|
||||
<mwc-icon
|
||||
id="profile-icon"
|
||||
class=${'notActive'}
|
||||
@click=${() => {
|
||||
const target = this.shadowRoot.getElementById('popover-notification');
|
||||
const popover = this.shadowRoot.querySelector('popover-component');
|
||||
if (popover) {
|
||||
popover.openPopover(target);
|
||||
}
|
||||
}}
|
||||
style="user-select:none;cursor:pointer"
|
||||
>
|
||||
account_circle
|
||||
</mwc-icon>
|
||||
<vaadin-tooltip
|
||||
for="profile-icon"
|
||||
position="bottom"
|
||||
hover-delay=${300}
|
||||
hide-delay=${1}
|
||||
text=${translate('profile.profile20')}
|
||||
></vaadin-tooltip>
|
||||
<popover-component for="profile-icon" message="">
|
||||
<div style="margin-bottom:20px">
|
||||
<p style="margin:10px 0px; font-size:16px">
|
||||
${translate('profile.profile1')}
|
||||
</p>
|
||||
</div>
|
||||
<div style="display:flex;justify-content:center;gap:10px">
|
||||
<div
|
||||
class="accept-button"
|
||||
@click="${() => {
|
||||
store.dispatch(
|
||||
setNewTab({
|
||||
url: `group-management`,
|
||||
id: this.uid.rnd(),
|
||||
myPlugObj: {
|
||||
url: 'name-registration',
|
||||
domain: 'core',
|
||||
page: 'name-registration/index.html',
|
||||
title: 'Name Registration',
|
||||
icon: 'vaadin:user-check',
|
||||
mwcicon: 'manage_accounts',
|
||||
pluginNumber: 'plugin-qCmtXAQmtu',
|
||||
menus: [],
|
||||
parent: false
|
||||
},
|
||||
openExisting: true
|
||||
})
|
||||
);
|
||||
const popover = this.shadowRoot.querySelector('popover-component');
|
||||
if (popover) {
|
||||
popover.closePopover();
|
||||
}
|
||||
}}"
|
||||
>
|
||||
${translate('profile.profile2')}
|
||||
</div>
|
||||
</div>
|
||||
</popover-component>
|
||||
`
|
||||
: this.error ? html`
|
||||
<div style="user-select:none;cursor:pointer;opacity:0.5" id="profile-error">
|
||||
<avatar-component
|
||||
.resource=${{
|
||||
name: this.name,
|
||||
service: 'THUMBNAIL',
|
||||
identifier: 'qortal_avatar'
|
||||
}}
|
||||
name=${this.name}
|
||||
></avatar-component>
|
||||
</div>
|
||||
<vaadin-tooltip
|
||||
for="profile-error"
|
||||
position="bottom"
|
||||
hover-delay=${200}
|
||||
hide-delay=${1}
|
||||
text=${translate('profile.profile19')}
|
||||
></vaadin-tooltip>
|
||||
`
|
||||
: html`
|
||||
<div
|
||||
style="user-select:none;cursor:pointer"
|
||||
@click=${() => {
|
||||
if (this.resourceExists && this.profileData) {
|
||||
this.editContent = this.profileData;
|
||||
} else if (this.resourceExists && !this.profileData) {
|
||||
return;
|
||||
}
|
||||
if (this.profileData) {
|
||||
this.profileDataVisiting = this.profileData;
|
||||
this.nameVisiting = this.name;
|
||||
this.dialogOpenedProfile = true;
|
||||
} else {
|
||||
this.isOpenProfileModalUpdate = !this.isOpenProfileModalUpdate;
|
||||
}
|
||||
}}
|
||||
>
|
||||
<avatar-component
|
||||
.resource=${{
|
||||
name: this.name,
|
||||
service: 'THUMBNAIL',
|
||||
identifier: 'qortal_avatar'
|
||||
}}
|
||||
name=${this.name}
|
||||
></avatar-component>
|
||||
</div>
|
||||
`
|
||||
}
|
||||
<profile-modal-update
|
||||
?isOpen=${this.isOpenProfileModalUpdate}
|
||||
.setIsOpen=${(val) => {
|
||||
this.isOpenProfileModalUpdate = val;
|
||||
}}
|
||||
.onSubmit=${this.saveToQdn}
|
||||
.editContent=${this.editContent}
|
||||
.onClose=${(val) => this.onClose(val)}
|
||||
.qortalRequestCustomData=${this.qortalRequestCustomData}
|
||||
></profile-modal-update>
|
||||
<!-- Profile read-view -->
|
||||
${this.dialogOpenedProfile ?
|
||||
html`
|
||||
<paper-dialog class="full-info-wrapper" ?opened="${this.dialogOpenedProfile}">
|
||||
<div class="full-info-logo">
|
||||
${this.avatarFullImage()}
|
||||
</div>
|
||||
<h3>${this.nameVisiting}</h3>
|
||||
<div style="display:flex;gap:15px;justify-content:center;margin-top:10px">
|
||||
${this.nameVisiting !== this.name ?
|
||||
html`
|
||||
<div
|
||||
class="send-message-button"
|
||||
@click="${async () => {
|
||||
const address = await this.getUserAddress();
|
||||
if (!address) return;
|
||||
store.dispatch(
|
||||
setNewTab({
|
||||
url: `q-chat`,
|
||||
id: this.uid.rnd(),
|
||||
myPlugObj: {
|
||||
url: 'q-chat',
|
||||
domain: 'core',
|
||||
page: 'q-chat/index.html',
|
||||
title: 'Q-Chat',
|
||||
icon: 'vaadin:chat',
|
||||
mwcicon: 'forum',
|
||||
pluginNumber: 'plugin-qhsyOnpRhT',
|
||||
menus: [],
|
||||
parent: false
|
||||
},
|
||||
openExisting: true
|
||||
})
|
||||
);
|
||||
store.dispatch(
|
||||
setSideEffectAction({
|
||||
type: 'openPrivateChat',
|
||||
data: {
|
||||
address,
|
||||
name: this.nameVisiting
|
||||
}
|
||||
})
|
||||
);
|
||||
this.dialogOpenedProfile = false;
|
||||
}}"
|
||||
>
|
||||
<mwc-icon id="send-chat-icon" style="color: var(--black)">send</mwc-icon>
|
||||
<vaadin-tooltip
|
||||
for="send-chat-icon"
|
||||
position="bottom"
|
||||
hover-delay=${200}
|
||||
hide-delay=${1}
|
||||
text=${translate('friends.friend8')}
|
||||
></vaadin-tooltip>
|
||||
</div>
|
||||
`
|
||||
: ''
|
||||
}
|
||||
${this.nameVisiting !== this.name ?
|
||||
html`
|
||||
<div
|
||||
class="send-message-button"
|
||||
@click="${() => {
|
||||
const query = `?service=APP&name=Q-Mail/to/${this.nameVisiting}`;
|
||||
store.dispatch(
|
||||
setNewTab({
|
||||
url: `qdn/browser/index.html${query}`,
|
||||
id: this.uid.rnd(),
|
||||
myPlugObj: {
|
||||
url: 'myapp',
|
||||
domain: 'core',
|
||||
page: `qdn/browser/index.html${query}`,
|
||||
title: 'Q-Mail',
|
||||
icon: 'vaadin:mailbox',
|
||||
mwcicon: 'mail_outline',
|
||||
menus: [],
|
||||
parent: false
|
||||
},
|
||||
openExisting: true
|
||||
})
|
||||
);
|
||||
this.dialogOpenedProfile = false;
|
||||
}}"
|
||||
>
|
||||
<mwc-icon id="send-mail-icon" style="color: var(--black)">mail</mwc-icon>
|
||||
<vaadin-tooltip
|
||||
for="send-mail-icon"
|
||||
position="bottom"
|
||||
hover-delay=${200}
|
||||
hide-delay=${1}
|
||||
text=${translate('friends.friend9')}
|
||||
></vaadin-tooltip>
|
||||
</div>
|
||||
`
|
||||
: ''
|
||||
}
|
||||
${this.nameVisiting !== this.name && this.isFriend === false ?
|
||||
html`
|
||||
<div
|
||||
class="send-message-button"
|
||||
@click="${() => {
|
||||
this.dispatchEvent(new CustomEvent('add-friend', {bubbles: true, composed: true, detail: this.nameVisiting}));
|
||||
this.dialogOpenedProfile = false;
|
||||
}}"
|
||||
>
|
||||
<mwc-icon id="add-friend-icon" style="color: var(--black)">person_add</mwc-icon>
|
||||
<vaadin-tooltip
|
||||
for="add-friend-icon"
|
||||
position="bottom"
|
||||
hover-delay=${200}
|
||||
hide-delay=${1}
|
||||
text=${translate('profile.profile26')}
|
||||
></vaadin-tooltip>
|
||||
</div>
|
||||
`
|
||||
: ''
|
||||
}
|
||||
${this.nameVisiting !== this.name && this.isFriend === true ?
|
||||
html`
|
||||
<div
|
||||
class="send-message-button"
|
||||
@click="${() => {
|
||||
this.dispatchEvent(new CustomEvent('add-friend', {bubbles: true, composed: true, detail: this.nameVisiting}));
|
||||
this.dialogOpenedProfile = false;
|
||||
}}"
|
||||
>
|
||||
<mwc-icon id="add-friend-icon" style="color: green">person</mwc-icon>
|
||||
<vaadin-tooltip
|
||||
for="add-friend-icon"
|
||||
position="bottom"
|
||||
hover-delay=${200}
|
||||
hide-delay=${1}
|
||||
text=${translate('profile.profile25')}
|
||||
></vaadin-tooltip>
|
||||
</div>
|
||||
`
|
||||
: ''
|
||||
}
|
||||
</div>
|
||||
<div class="data-info">
|
||||
${this.isLoadingVisitingProfile ?
|
||||
html`
|
||||
<div style="width:100%;display:flex;justify-content:center">
|
||||
<paper-spinner-lite active style="display: block; margin: 0 auto;"></paper-spinner-lite>
|
||||
</div>
|
||||
`
|
||||
: this.resourceExistsVisiting === false ?
|
||||
html`
|
||||
<div style="width:100%;display:flex;justify-content:center">
|
||||
<p>${translate('profile.profile16')}</p>
|
||||
</div>
|
||||
`
|
||||
: this.profileDataVisiting === null ?
|
||||
html`
|
||||
<div style="width:100%;display:flex;justify-content:center">
|
||||
<p>${translate('profile.profile17')}</p>
|
||||
</div>
|
||||
`
|
||||
: html`
|
||||
<p style="font-weight:bold;color:#03a9f4;font-size:17px">
|
||||
${translate('profile.profile4')}
|
||||
</p>
|
||||
<p style="font-size:15px">
|
||||
${this.profileDataVisiting.tagline || translate('profile.profile15')}
|
||||
</p>
|
||||
<p style="font-weight:bold;color:#03a9f4;font-size:17px">
|
||||
${translate('profile.profile5')}
|
||||
</p>
|
||||
<p>
|
||||
${this.profileDataVisiting.bio || translate('profile.profile15')}
|
||||
</p>
|
||||
<p style="font-weight:bold;color:#03a9f4;font-size:17px">
|
||||
${translate('profile.profile6')}
|
||||
</p>
|
||||
${Object.keys(this.profileDataVisiting.wallets).map((key, i) => {
|
||||
return html`
|
||||
<p>
|
||||
<span style="font-weight:bold;text-transform: uppercase">${key}</span>:
|
||||
<span>${this.profileDataVisiting.wallets[key] || translate('profile.profile15')}</span>
|
||||
</p>
|
||||
`
|
||||
})}
|
||||
`
|
||||
}
|
||||
</div>
|
||||
<div>
|
||||
<span class="paybutton">
|
||||
<mwc-button class="green" @click=${() => this.openUserInfo()}>${translate('profile.profile14')}</mwc-button>
|
||||
</span>
|
||||
<span class="buttons">
|
||||
${this.nameVisiting === this.name ?
|
||||
html`
|
||||
<mwc-button @click=${() => this.openEdit()}>${translate('profile.profile3')}</mwc-button>
|
||||
` : ''
|
||||
}
|
||||
<mwc-button class="decline" @click=${() => {this.dialogOpenedProfile = false;}}>${translate('general.close')}</mwc-button>
|
||||
</span>
|
||||
</div>
|
||||
</paper-dialog>
|
||||
`: ''
|
||||
}
|
||||
`
|
||||
}
|
||||
|
||||
firstUpdated() {
|
||||
// ...
|
||||
}
|
||||
|
||||
getNodeUrl() {
|
||||
const myNode = store.getState().app.nodeConfig.knownNodes[store.getState().app.nodeConfig.node]
|
||||
return myNode.protocol + '://' + myNode.domain + ':' + myNode.port
|
||||
}
|
||||
|
||||
getMyNode() {
|
||||
return store.getState().app.nodeConfig.knownNodes[store.getState().app.nodeConfig.node]
|
||||
}
|
||||
|
||||
async getRawData(dataItem) {
|
||||
const url = `${this.nodeUrl}/arbitrary/${dataItem.service}/${dataItem.name}/${dataItem.identifier}`
|
||||
const res = await fetch(url)
|
||||
const data = await res.json()
|
||||
if (data.error) throw new Error('Cannot retrieve your data from qdn')
|
||||
return data
|
||||
}
|
||||
|
||||
async getMyFollowedNames() {
|
||||
let myFollowedNames = []
|
||||
|
||||
try {
|
||||
myFollowedNames = await parentEpml.request('apiCall', {
|
||||
url: `/lists/followedNames?apiKey=${this.myNode.apiKey}`
|
||||
})
|
||||
} catch (error) { }
|
||||
|
||||
return myFollowedNames
|
||||
}
|
||||
|
||||
async followNames(names) {
|
||||
let namesJsonString = JSON.stringify({ items: names })
|
||||
|
||||
return await parentEpml.request('apiCall', {
|
||||
url: `/lists/followedNames?apiKey=${this.myNode.apiKey}`,
|
||||
method: 'POST',
|
||||
headers: {
|
||||
'Content-Type': 'application/json'
|
||||
},
|
||||
body: `${namesJsonString}`
|
||||
})
|
||||
}
|
||||
|
||||
async setValues(response, resource) {
|
||||
if (response) {
|
||||
let data = { ...response }
|
||||
let customData = {}
|
||||
|
||||
for (const key of Object.keys(data.customData || {})) {
|
||||
if (key.includes('-private')) {
|
||||
try {
|
||||
const decryptedData = decryptGroupData(data.customData[key])
|
||||
|
||||
if (decryptedData && !decryptedData.error) {
|
||||
const decryptedDataToBase64 =
|
||||
uint8ArrayToObject(decryptedData)
|
||||
if (decryptedDataToBase64 && !decryptedDataToBase64.error) {
|
||||
customData[key] = decryptedDataToBase64
|
||||
}
|
||||
}
|
||||
} catch (error) {
|
||||
console.log({ error })
|
||||
}
|
||||
} else {
|
||||
customData[key] = data.customData[key]
|
||||
}
|
||||
}
|
||||
|
||||
this.profileData = {
|
||||
...response,
|
||||
customData
|
||||
}
|
||||
|
||||
store.dispatch(setProfileData(this.profileData))
|
||||
}
|
||||
}
|
||||
|
||||
async getVisitingProfile(name) {
|
||||
try {
|
||||
this.isLoadingVisitingProfile = true
|
||||
this.nameVisiting = name
|
||||
this.checkIfInFriendsList(this.nameVisiting)
|
||||
const url = `${this.nodeUrl}/arbitrary/resources/search?service=DOCUMENT&identifier=qortal_profile&mode=ALL&name=${name}&prefix=true&exactmatchnames=true&excludeblocked=true&limit=20`
|
||||
const res = await fetch(url)
|
||||
let data = ''
|
||||
|
||||
try {
|
||||
data = await res.json();
|
||||
if (Array.isArray(data)) {
|
||||
data = data.filter(
|
||||
(item) => item.identifier === 'qortal_profile'
|
||||
)
|
||||
|
||||
if (data.length > 0) {
|
||||
this.resourceExistsVisiting = true
|
||||
const dataItem = data[0]
|
||||
|
||||
try {
|
||||
const response = await this.getRawData(dataItem)
|
||||
|
||||
if (response.wallets) {
|
||||
this.profileDataVisiting = response
|
||||
} else {
|
||||
// this.error = 'Cannot get saved user settings'
|
||||
}
|
||||
} catch (error) {
|
||||
console.log({ error })
|
||||
}
|
||||
} else {
|
||||
this.resourceExistsVisiting = false
|
||||
}
|
||||
} else {
|
||||
// this.error = 'Unable to perform query'
|
||||
}
|
||||
} catch (error) {
|
||||
console.log({ error })
|
||||
data = {
|
||||
error: 'No resource found'
|
||||
}
|
||||
}
|
||||
} catch (error) {
|
||||
console.log({ error })
|
||||
} finally {
|
||||
this.isLoadingVisitingProfile = false
|
||||
}
|
||||
}
|
||||
|
||||
async getProfile() {
|
||||
try {
|
||||
this.error = ''
|
||||
this.fee = await this.getArbitraryFee()
|
||||
this.hasAttemptedToFetchResource = true
|
||||
let resource
|
||||
let nameObject
|
||||
|
||||
try {
|
||||
nameObject = store.getState().app.accountInfo.names[0]
|
||||
} catch (error) { }
|
||||
|
||||
if (!nameObject) {
|
||||
this.name = null
|
||||
this.error = 'no name'
|
||||
throw new Error('no name')
|
||||
}
|
||||
|
||||
this.hasName = true
|
||||
const name = nameObject.name
|
||||
this.name = name
|
||||
const url = `${this.nodeUrl}/arbitrary/resources/search?service=DOCUMENT&mode=ALL&identifier=qortal_profile&name=${name}&prefix=true&exactmatchnames=true&excludeblocked=true&limit=20`
|
||||
const res = await fetch(url)
|
||||
let data = ''
|
||||
|
||||
try {
|
||||
data = await res.json()
|
||||
|
||||
if (Array.isArray(data)) {
|
||||
data = data.filter(
|
||||
(item) => item.identifier === 'qortal_profile'
|
||||
)
|
||||
|
||||
if (data.length > 0) {
|
||||
this.resourceExists = true
|
||||
const dataItem = data[0]
|
||||
|
||||
try {
|
||||
const response = await this.getRawData(dataItem)
|
||||
|
||||
if (response.wallets) {
|
||||
await this.setValues(response, dataItem)
|
||||
} else {
|
||||
this.error = 'Cannot get saved user settings'
|
||||
}
|
||||
} catch (error) {
|
||||
this.error = 'Cannot get saved user settings'
|
||||
}
|
||||
} else {
|
||||
this.resourceExists = false
|
||||
}
|
||||
} else {
|
||||
this.error = 'Unable to perform query'
|
||||
}
|
||||
} catch (error) {
|
||||
data = {
|
||||
error: 'No resource found'
|
||||
}
|
||||
}
|
||||
|
||||
if (resource) {
|
||||
this.hasRetrievedResource = true
|
||||
}
|
||||
} catch (error) {
|
||||
console.log({ error })
|
||||
}
|
||||
}
|
||||
|
||||
stateChanged(state) {
|
||||
if (state.app.nodeStatus && state.app.nodeStatus.syncPercent !== this.syncPercentage) {
|
||||
this.syncPercentage = state.app.nodeStatus.syncPercent
|
||||
|
||||
if (!this.hasAttemptedToFetchResource && state.app.nodeStatus.syncPercent === 100) {
|
||||
this.getProfile()
|
||||
}
|
||||
}
|
||||
|
||||
if (
|
||||
state.app.accountInfo && state.app.accountInfo.names.length &&
|
||||
state.app.nodeStatus && state.app.nodeStatus.syncPercent === 100 &&
|
||||
this.hasName === false && this.hasAttemptedToFetchResource &&
|
||||
state.app.accountInfo && state.app.accountInfo.names &&
|
||||
state.app.accountInfo.names.length > 0
|
||||
) {
|
||||
this.getProfile()
|
||||
}
|
||||
}
|
||||
|
||||
async getArbitraryFee() {
|
||||
const timestamp = Date.now()
|
||||
const url = `${this.nodeUrl}/transactions/unitfee?txType=ARBITRARY×tamp=${timestamp}`
|
||||
const response = await fetch(url)
|
||||
|
||||
if (!response.ok) {
|
||||
throw new Error('Error when fetching arbitrary fee')
|
||||
}
|
||||
|
||||
const data = await response.json()
|
||||
const arbitraryFee = (Number(data) / 1e8).toFixed(8)
|
||||
|
||||
return {
|
||||
timestamp,
|
||||
fee: Number(data),
|
||||
feeToShow: arbitraryFee
|
||||
}
|
||||
}
|
||||
|
||||
async saveToQdn(data) {
|
||||
try {
|
||||
this.isSaving = true
|
||||
|
||||
if (this.resourceExists === true && this.error) throw new Error('Unable to save')
|
||||
|
||||
const nameObject = store.getState().app.accountInfo.names[0]
|
||||
|
||||
if (!nameObject) throw new Error('no name')
|
||||
|
||||
const arbitraryFeeData = await modalHelper.getArbitraryFee()
|
||||
const res = await modalHelper.showModalAndWaitPublish({
|
||||
feeAmount: arbitraryFeeData.feeToShow,
|
||||
})
|
||||
|
||||
if (res.action !== 'accept') throw new Error('User declined publish')
|
||||
|
||||
const name = nameObject.name
|
||||
const identifer = 'qortal_profile'
|
||||
const filename = 'qortal_profile.json'
|
||||
const selectedAddress = store.getState().app.selectedAddress
|
||||
const getArbitraryFee = await this.getArbitraryFee()
|
||||
const feeAmount = getArbitraryFee.fee
|
||||
|
||||
let newObject = structuredClone(data)
|
||||
|
||||
for (const key of Object.keys(newObject.customData || {})) {
|
||||
if (key.includes('-private')) {
|
||||
const dataKey = newObject.customData[key]
|
||||
let isBase64 = false
|
||||
|
||||
try {
|
||||
const decodedString = atob(dataKey)
|
||||
isBase64 = decodedString.includes('qortalGroupEncryptedData')
|
||||
} catch (e) {
|
||||
console.log(e)
|
||||
}
|
||||
|
||||
if (isBase64) {
|
||||
newObject['customData'][key] = newObject.customData[key]
|
||||
} else {
|
||||
const toBase64 = await objectToBase64(newObject.customData[key])
|
||||
|
||||
newObject['customData'][key] = encryptDataGroup({
|
||||
data64: toBase64,
|
||||
publicKeys: []
|
||||
})
|
||||
}
|
||||
} else {
|
||||
newObject['customData'][key] = newObject.customData[key]
|
||||
}
|
||||
}
|
||||
|
||||
const newObjectToBase64 = await objectToBase64(newObject)
|
||||
const worker = new WebWorker2()
|
||||
|
||||
try {
|
||||
const resPublish = await publishData({
|
||||
registeredName: encodeURIComponent(name),
|
||||
file: newObjectToBase64,
|
||||
service: 'DOCUMENT',
|
||||
identifier: encodeURIComponent(identifer),
|
||||
parentEpml: parentEpml,
|
||||
uploadType: 'file',
|
||||
selectedAddress: selectedAddress,
|
||||
worker: worker,
|
||||
isBase64: true,
|
||||
filename: filename,
|
||||
apiVersion: 2,
|
||||
withFee: true,
|
||||
feeAmount: feeAmount
|
||||
})
|
||||
|
||||
this.resourceExists = true
|
||||
this.profileData = data
|
||||
store.dispatch(setProfileData(data))
|
||||
parentEpml.request('showSnackBar', get('profile.profile22'))
|
||||
|
||||
worker.terminate()
|
||||
} catch (error) {
|
||||
worker.terminate()
|
||||
}
|
||||
} catch (error) {
|
||||
console.log({ error })
|
||||
throw new Error(error.message)
|
||||
} finally {
|
||||
this.isSaving = false
|
||||
}
|
||||
}
|
||||
|
||||
sendBackEvent(detail) {
|
||||
let iframes
|
||||
|
||||
const mainApp = document.getElementById('main-app')
|
||||
|
||||
if (mainApp && mainApp.shadowRoot) {
|
||||
const appView = mainApp.shadowRoot.querySelector('app-view')
|
||||
if (appView && appView.shadowRoot) {
|
||||
const showPlugin = appView.shadowRoot.querySelector('show-plugin')
|
||||
if (showPlugin && showPlugin.shadowRoot) {
|
||||
iframes = showPlugin.shadowRoot.querySelectorAll('iframe')
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
iframes.forEach((iframe) => {
|
||||
const iframeWindow = iframe.contentWindow;
|
||||
const customEvent = new CustomEvent('qortal-request-set-profile-data-response', { detail: detail })
|
||||
|
||||
iframeWindow.dispatchEvent(customEvent)
|
||||
})
|
||||
}
|
||||
|
||||
async _handleQortalRequestSetData(event) {
|
||||
const detail = event.detail
|
||||
|
||||
try {
|
||||
if (!detail.property || !detail.payload) throw new Error('not saved')
|
||||
if (!this.profileData && (this.resourceExists || this.resourceExists === undefined)) throw new Error('unable to fetch the users profile data')
|
||||
|
||||
this.isOpenProfileModalUpdate = true
|
||||
|
||||
this.editContent = {...(this.profileData || {}),}
|
||||
|
||||
if (detail.payload.customData) {
|
||||
this.qortalRequestCustomData = detail
|
||||
}
|
||||
|
||||
// Wait for response event
|
||||
const response = await new Promise((resolve, reject) => {
|
||||
function handleResponseEvent(event) {
|
||||
// Handle the data from the event, if any
|
||||
const responseData = event.detail
|
||||
|
||||
// Clean up by removing the event listener once we've received the response
|
||||
window.removeEventListener('send-back-event', handleResponseEvent)
|
||||
|
||||
if (responseData.response === 'saved') {
|
||||
resolve(responseData)
|
||||
} else {
|
||||
reject(new Error(responseData.error))
|
||||
}
|
||||
}
|
||||
|
||||
// Set up an event listener to wait for the response
|
||||
window.addEventListener('send-back-event', handleResponseEvent)
|
||||
})
|
||||
|
||||
this.sendBackEvent({
|
||||
response: response.response,
|
||||
uniqueId: detail.uniqueId
|
||||
})
|
||||
} catch (error) {
|
||||
this.sendBackEvent({
|
||||
response: 'error',
|
||||
uniqueId: detail.uniqueId
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
_handleOpenVisiting(event) {
|
||||
try {
|
||||
const name = event.detail
|
||||
this.getVisitingProfile(name)
|
||||
this.dialogOpenedProfile = true
|
||||
} catch (error) { }
|
||||
}
|
||||
|
||||
connectedCallback() {
|
||||
super.connectedCallback()
|
||||
window.addEventListener('qortal-request-set-profile-data', this._handleQortalRequestSetData)
|
||||
window.addEventListener('open-visiting-profile', this._handleOpenVisiting)
|
||||
}
|
||||
|
||||
disconnectedCallback() {
|
||||
window.removeEventListener('qortal-request-set-profile-data', this._handleQortalRequestSetData)
|
||||
window.removeEventListener('open-visiting-profile', this._handleOpenVisiting)
|
||||
super.disconnectedCallback()
|
||||
}
|
||||
|
||||
onClose(isSuccess) {
|
||||
this.isOpenProfileModalUpdate = false
|
||||
this.editContent = null
|
||||
|
||||
if (this.qortalRequestCustomData) {
|
||||
// Create and dispatch custom event
|
||||
const customEvent = new CustomEvent('send-back-event', {
|
||||
detail: {
|
||||
response: isSuccess ? 'saved' : 'not saved'
|
||||
}
|
||||
})
|
||||
|
||||
window.dispatchEvent(customEvent)
|
||||
|
||||
this.qortalRequestCustomData = null
|
||||
}
|
||||
}
|
||||
|
||||
avatarFullImage() {
|
||||
this.imageUrl = `${this.nodeUrl}/arbitrary/THUMBNAIL/${this.nameVisiting}/qortal_avatar?async=true&apiKey=${this.myNode.apiKey}`
|
||||
|
||||
return html`<img class="round-fullinfo" src="${this.imageUrl}" onerror="this.src='/img/incognito.png';" />`
|
||||
}
|
||||
|
||||
openUserInfo() {
|
||||
const infoDialog = document
|
||||
.getElementById('main-app')
|
||||
.shadowRoot.querySelector('app-view')
|
||||
.shadowRoot.querySelector('user-info-view')
|
||||
infoDialog.openUserInfo(this.nameVisiting)
|
||||
}
|
||||
|
||||
openEdit() {
|
||||
this.isOpenProfileModalUpdate = !this.isOpenProfileModalUpdate
|
||||
}
|
||||
|
||||
onCloseVisitingProfile() {
|
||||
this.profileDataVisiting = null
|
||||
this.nameVisiting = ''
|
||||
this.imageUrl = ''
|
||||
this.resourceExistsVisiting = undefined
|
||||
this.isFriend = undefined
|
||||
}
|
||||
|
||||
updated(changedProperties) {
|
||||
if (changedProperties && changedProperties.has('dialogOpenedProfile') && this.dialogOpenedProfile === false) {
|
||||
const prevVal = changedProperties.get('dialogOpenedProfile')
|
||||
if (prevVal === true) this.onCloseVisitingProfile()
|
||||
}
|
||||
}
|
||||
|
||||
async getUserAddress() {
|
||||
try {
|
||||
const url = `${this.nodeUrl}/names/${this.nameVisiting}`
|
||||
const res = await fetch(url)
|
||||
const result = await res.json()
|
||||
|
||||
if (result.error === 401) {
|
||||
return ''
|
||||
} else {
|
||||
return result.owner
|
||||
}
|
||||
} catch (error) {
|
||||
return ''
|
||||
}
|
||||
}
|
||||
|
||||
checkIfInFriendsList(name) {
|
||||
try {
|
||||
this.isFriend = undefined
|
||||
const friendList = JSON.parse(localStorage.getItem('friends-my-friend-list') || '[]')
|
||||
const findIndex = friendList.findIndex((friend) => friend.name === name)
|
||||
this.isFriend = findIndex !== -1
|
||||
} catch (error) { }
|
||||
}
|
||||
|
||||
// Standard functions
|
||||
getApiKey() {
|
||||
const coreNode = store.getState().app.nodeConfig.knownNodes[store.getState().app.nodeConfig.node]
|
||||
return coreNode.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('profile-qdn', ProfileQdn)
|
@ -1,560 +0,0 @@
|
||||
import { html, LitElement } from 'lit'
|
||||
import { connect } from 'pwa-helpers'
|
||||
import { store } from '../../store'
|
||||
import { parentEpml } from '../show-plugin'
|
||||
import { setNewTab } from '../../redux/app/app-actions'
|
||||
import { publishData } from '../../../../plugins/plugins/utils/classes'
|
||||
import {
|
||||
decryptGroupData,
|
||||
encryptDataGroup,
|
||||
objectToBase64,
|
||||
uint8ArrayToObject
|
||||
} from '../../../../plugins/plugins/core/components/qdn-action-encryption'
|
||||
import { translate } from '../../../translate'
|
||||
import { saveSettingsQdnStyles } from '../../styles/core-css'
|
||||
import ShortUniqueId from 'short-unique-id'
|
||||
import WebWorker from '../WebWorkerFile.js'
|
||||
import './friends-side-panel'
|
||||
import '../notification-view/popover'
|
||||
import '@material/mwc-icon'
|
||||
import '@polymer/paper-spinner/paper-spinner-lite.js'
|
||||
import '@vaadin/tooltip'
|
||||
|
||||
class SaveSettingsQdn extends connect(store)(LitElement) {
|
||||
static get properties() {
|
||||
return {
|
||||
isOpen: { type: Boolean },
|
||||
syncPercentage: { type: Number },
|
||||
settingsRawData: { type: Object },
|
||||
valuesToBeSavedOnQdn: { type: Object },
|
||||
resourceExists: { type: Boolean },
|
||||
isSaving: { type: Boolean },
|
||||
fee: { type: Object },
|
||||
hasName: { type: Boolean },
|
||||
error: { type: String },
|
||||
name: { type: String }
|
||||
}
|
||||
}
|
||||
|
||||
static get styles() {
|
||||
return [saveSettingsQdnStyles]
|
||||
}
|
||||
|
||||
constructor() {
|
||||
super()
|
||||
this.isOpen = false
|
||||
this.getGeneralSettingsQdn = this.getGeneralSettingsQdn.bind(this)
|
||||
this._updateTempSettingsData = this._updateTempSettingsData.bind(this)
|
||||
this.setValues = this.setValues.bind(this)
|
||||
this.saveToQdn = this.saveToQdn.bind(this)
|
||||
this.syncPercentage = 0
|
||||
this.hasRetrievedResource = false
|
||||
this.hasAttemptedToFetchResource = false
|
||||
this.resourceExists = undefined
|
||||
this.settingsRawData = null
|
||||
this.nodeUrl = this.getNodeUrl()
|
||||
this.myNode = this.getMyNode()
|
||||
this.valuesToBeSavedOnQdn = {}
|
||||
this.isSaving = false
|
||||
this.fee = null
|
||||
this.hasName = false
|
||||
this.error = ''
|
||||
this.uid = new ShortUniqueId()
|
||||
this.name = undefined
|
||||
}
|
||||
|
||||
render() {
|
||||
return html`
|
||||
${this.isSaving || (!this.error && this.resourceExists === undefined) ?
|
||||
html`
|
||||
<paper-spinner-lite active style="display: block; margin: 0 auto;"></paper-spinner-lite>
|
||||
` : !this.name ? html`
|
||||
<mwc-icon
|
||||
id="profile-icon"
|
||||
class=${'notActive'}
|
||||
@click=${() => {
|
||||
const target = this.shadowRoot.getElementById('popover-notification');
|
||||
const popover = this.shadowRoot.querySelector('popover-component');
|
||||
if (popover) {
|
||||
popover.openPopover(target);
|
||||
}
|
||||
}}
|
||||
style="user-select:none;cursor:pointer"
|
||||
>
|
||||
save
|
||||
</mwc-icon>
|
||||
<vaadin-tooltip
|
||||
for="profile-icon"
|
||||
position="bottom"
|
||||
hover-delay=${300}
|
||||
hide-delay=${1}
|
||||
text=${translate('profile.profile20')}
|
||||
>
|
||||
</vaadin-tooltip>
|
||||
<popover-component for="profile-icon" message="">
|
||||
<div style="margin-bottom:20px">
|
||||
<p style="margin:10px 0px; font-size:16px">
|
||||
${translate('profile.profile1')}
|
||||
</p>
|
||||
</div>
|
||||
<div style="display:flex;justify-content:center;gap:10px">
|
||||
<div
|
||||
class="accept-button"
|
||||
@click="${() => {
|
||||
store.dispatch(
|
||||
setNewTab({
|
||||
url: `group-management`,
|
||||
id: this.uid.rnd(),
|
||||
myPlugObj: {
|
||||
url: 'name-registration',
|
||||
domain: 'core',
|
||||
page: 'name-registration/index.html',
|
||||
title: 'Name Registration',
|
||||
icon: 'vaadin:user-check',
|
||||
mwcicon: 'manage_accounts',
|
||||
pluginNumber: 'plugin-qCmtXAQmtu',
|
||||
menus: [],
|
||||
parent: fals
|
||||
},
|
||||
openExisting: true
|
||||
})
|
||||
);
|
||||
const popover = this.shadowRoot.querySelector('popover-component');
|
||||
if (popover) {
|
||||
popover.closePopover();
|
||||
}
|
||||
}}"
|
||||
>
|
||||
${translate('profile.profile2')}
|
||||
</div>
|
||||
</div>
|
||||
</popover-component>
|
||||
` : html`
|
||||
<mwc-icon
|
||||
id="save-icon"
|
||||
class=${Object.values(this.valuesToBeSavedOnQdn).length > 0 || this.resourceExists === false? 'active' : 'notActive'}
|
||||
@click=${() => {
|
||||
if (Object.values(this.valuesToBeSavedOnQdn).length > 0 || this.resourceExists === false) {
|
||||
if (!this.fee) return;
|
||||
const target = this.shadowRoot.getElementById('popover-notification');
|
||||
const popover = this.shadowRoot.querySelector('popover-component');
|
||||
if (popover) {
|
||||
popover.openPopover(target);
|
||||
}
|
||||
}
|
||||
}}
|
||||
style="user-select:none"
|
||||
>
|
||||
save
|
||||
</mwc-icon>
|
||||
<vaadin-tooltip
|
||||
for="save-icon"
|
||||
position="bottom"
|
||||
hover-delay=${300}
|
||||
hide-delay=${1}
|
||||
text=${
|
||||
this.error ? translate('save.saving1')
|
||||
: Object.values(this.valuesToBeSavedOnQdn).length > 0 || this.resourceExists === false
|
||||
? translate('save.saving3') : translate('save.saving2')
|
||||
}
|
||||
></vaadin-tooltip>
|
||||
<popover-component for="save-icon" message="">
|
||||
<div style="margin-bottom:20px">
|
||||
<p style="margin:10px 0px; font-size:16px">
|
||||
${translate('walletpage.wchange12')}: ${this.fee ? this.fee.feeToShow : ''}
|
||||
</p>
|
||||
</div>
|
||||
<div style="display:flex;justify-content:space-between;gap:10px">
|
||||
<div
|
||||
class="undo-button"
|
||||
@click="${() => {
|
||||
localStorage.setItem('temp-settings-data', JSON.stringify({}));
|
||||
this.valuesToBeSavedOnQdn = {};
|
||||
const popover = this.shadowRoot.querySelector('popover-component');
|
||||
if (popover) {
|
||||
popover.closePopover();
|
||||
}
|
||||
this.getGeneralSettingsQdn();
|
||||
}}"
|
||||
>
|
||||
${translate('save.saving4')}
|
||||
</div>
|
||||
<div
|
||||
class="accept-button"
|
||||
@click="${() => {
|
||||
this.saveToQdn();
|
||||
const popover = this.shadowRoot.querySelector('popover-component');
|
||||
if (popover) {
|
||||
popover.closePopover();
|
||||
}
|
||||
}}"
|
||||
>
|
||||
${translate('browserpage.bchange28')}
|
||||
</div>
|
||||
</div>
|
||||
</popover-component>
|
||||
`
|
||||
}
|
||||
`
|
||||
}
|
||||
|
||||
firstUpdated() {
|
||||
// ...
|
||||
}
|
||||
|
||||
getNodeUrl() {
|
||||
const myNode = store.getState().app.nodeConfig.knownNodes[store.getState().app.nodeConfig.node]
|
||||
return myNode.protocol + '://' + myNode.domain + ':' + myNode.port
|
||||
}
|
||||
|
||||
getMyNode() {
|
||||
return store.getState().app.nodeConfig.knownNodes[store.getState().app.nodeConfig.node]
|
||||
}
|
||||
|
||||
async getRawData(dataItem) {
|
||||
const url = `${this.nodeUrl}/arbitrary/${dataItem.service}/${dataItem.name}/${dataItem.identifier}?encoding=base64`
|
||||
const res = await fetch(url)
|
||||
const data = await res.text()
|
||||
if (data.error) throw new Error('Cannot retrieve your data from qdn')
|
||||
const decryptedData = decryptGroupData(data)
|
||||
return uint8ArrayToObject(decryptedData)
|
||||
}
|
||||
|
||||
async getMyFollowedNames() {
|
||||
let myFollowedNames = []
|
||||
|
||||
try {
|
||||
myFollowedNames = await parentEpml.request('apiCall', {
|
||||
url: `/lists/followedNames?apiKey=${this.myNode.apiKey}`
|
||||
})
|
||||
} catch (error) { }
|
||||
|
||||
return myFollowedNames
|
||||
}
|
||||
|
||||
async followNames(names) {
|
||||
let namesJsonString = JSON.stringify({ "items": names })
|
||||
|
||||
return await parentEpml.request('apiCall', {
|
||||
url: `/lists/followedNames?apiKey=${this.myNode.apiKey}`,
|
||||
method: 'POST',
|
||||
headers: {
|
||||
'Content-Type': 'application/json'
|
||||
},
|
||||
body: `${namesJsonString}`
|
||||
})
|
||||
}
|
||||
|
||||
async setValues(response, resource) {
|
||||
this.settingsRawData = response
|
||||
const rawDataTimestamp = resource.updated
|
||||
|
||||
const tempSettingsData = JSON.parse(
|
||||
localStorage.getItem('temp-settings-data') || '{}'
|
||||
)
|
||||
|
||||
const userLists = response.userLists || []
|
||||
const friendsFeed = response.friendsFeed
|
||||
const myMenuPlugs = response.myMenuPlugs
|
||||
|
||||
this.valuesToBeSavedOnQdn = {}
|
||||
|
||||
if (userLists.length > 0 && (!tempSettingsData.userLists || (tempSettingsData.userLists && tempSettingsData.userLists.timestamp < rawDataTimestamp))) {
|
||||
const friendList = userLists[0]
|
||||
const copyPayload = [...friendList]
|
||||
const onlyNames = copyPayload.map((item) => item.name)
|
||||
const followedList = await this.getMyFollowedNames()
|
||||
const namesNotInFollowedList = onlyNames.filter(name => !followedList.includes(name))
|
||||
|
||||
if (namesNotInFollowedList.length > 0) {
|
||||
await this.followNames(namesNotInFollowedList)
|
||||
}
|
||||
|
||||
localStorage.setItem('friends-my-friend-list', JSON.stringify(friendList))
|
||||
|
||||
this.dispatchEvent(
|
||||
new CustomEvent('friends-my-friend-list-event', {
|
||||
bubbles: true,
|
||||
composed: true,
|
||||
detail: copyPayload
|
||||
})
|
||||
)
|
||||
} else if (tempSettingsData.userLists && tempSettingsData.userLists.timestamp > rawDataTimestamp) {
|
||||
this.valuesToBeSavedOnQdn = {
|
||||
...this.valuesToBeSavedOnQdn,
|
||||
userLists: {
|
||||
data: tempSettingsData.userLists.data
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (friendsFeed && (!tempSettingsData.friendsFeed || (tempSettingsData.friendsFeed && tempSettingsData.friendsFeed.timestamp < rawDataTimestamp))) {
|
||||
const copyPayload = [...friendsFeed]
|
||||
|
||||
localStorage.setItem('friends-my-selected-feeds', JSON.stringify(friendsFeed))
|
||||
|
||||
this.dispatchEvent(
|
||||
new CustomEvent('friends-my-selected-feeds-event', {
|
||||
bubbles: true,
|
||||
composed: true,
|
||||
detail: copyPayload
|
||||
})
|
||||
)
|
||||
} else if (tempSettingsData.friendsFeed && tempSettingsData.friendsFeed.timestamp > rawDataTimestamp) {
|
||||
this.valuesToBeSavedOnQdn = {
|
||||
...this.valuesToBeSavedOnQdn,
|
||||
friendsFeed: {
|
||||
data: tempSettingsData.friendsFeed.data
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (myMenuPlugs && (!tempSettingsData.myMenuPlugs || (tempSettingsData.myMenuPlugs && tempSettingsData.myMenuPlugs.timestamp < rawDataTimestamp))) {
|
||||
if (Array.isArray(myMenuPlugs)) {
|
||||
const copyPayload = [...myMenuPlugs]
|
||||
|
||||
localStorage.setItem('myMenuPlugs', JSON.stringify(myMenuPlugs))
|
||||
|
||||
this.dispatchEvent(
|
||||
new CustomEvent('myMenuPlugs-event', {
|
||||
bubbles: true,
|
||||
composed: true,
|
||||
detail: copyPayload
|
||||
})
|
||||
)
|
||||
}
|
||||
} else if (tempSettingsData.myMenuPlugs && tempSettingsData.myMenuPlugs.timestamp > rawDataTimestamp) {
|
||||
this.valuesToBeSavedOnQdn = {
|
||||
...this.valuesToBeSavedOnQdn,
|
||||
myMenuPlugs: {
|
||||
data: tempSettingsData.myMenuPlugs.data
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
async getGeneralSettingsQdn() {
|
||||
try {
|
||||
this.error = ""
|
||||
this.fee = await this.getArbitraryFee()
|
||||
this.hasAttemptedToFetchResource = true
|
||||
let resource
|
||||
let nameObject
|
||||
|
||||
try {
|
||||
nameObject = store.getState().app.accountInfo.names[0]
|
||||
} catch (error) { }
|
||||
|
||||
if (!nameObject) {
|
||||
this.name = null
|
||||
this.error = 'no name'
|
||||
throw new Error('no name')
|
||||
}
|
||||
|
||||
const name = nameObject.name
|
||||
this.name = name
|
||||
this.hasName = true
|
||||
this.error = ''
|
||||
const url = `${this.nodeUrl}/arbitrary/resources/search?service=DOCUMENT_PRIVATE&mode=ALL&identifier=qortal_general_settings&name=${name}&prefix=true&exactmatchnames=true&excludeblocked=true&limit=20`
|
||||
const res = await fetch(url)
|
||||
let data = ''
|
||||
|
||||
try {
|
||||
data = await res.json()
|
||||
|
||||
if (Array.isArray(data)) {
|
||||
data = data.filter(
|
||||
(item) => item.identifier === 'qortal_general_settings'
|
||||
)
|
||||
|
||||
if (data.length > 0) {
|
||||
this.resourceExists = true
|
||||
const dataItem = data[0]
|
||||
|
||||
try {
|
||||
const response = await this.getRawData(dataItem)
|
||||
|
||||
if (response.version) {
|
||||
await this.setValues(response, dataItem)
|
||||
} else {
|
||||
this.error = 'Cannot get saved user settings'
|
||||
}
|
||||
} catch (error) {
|
||||
console.log({ error })
|
||||
this.error = 'Cannot get saved user settings'
|
||||
}
|
||||
} else {
|
||||
this.resourceExists = false
|
||||
}
|
||||
} else {
|
||||
this.error = 'Unable to perform query'
|
||||
}
|
||||
} catch (error) {
|
||||
data = {error: 'No resource found'}
|
||||
}
|
||||
|
||||
if (resource) {
|
||||
this.hasRetrievedResource = true
|
||||
}
|
||||
} catch (error) {
|
||||
console.log({ error })
|
||||
}
|
||||
}
|
||||
|
||||
stateChanged(state) {
|
||||
if (state.app.nodeStatus && state.app.nodeStatus.syncPercent !== this.syncPercentage) {
|
||||
this.syncPercentage = state.app.nodeStatus.syncPercent
|
||||
|
||||
if (!this.hasAttemptedToFetchResource && state.app.nodeStatus.syncPercent === 100) {
|
||||
this.getGeneralSettingsQdn()
|
||||
}
|
||||
}
|
||||
|
||||
if (
|
||||
state.app.accountInfo && state.app.accountInfo.names.length && state.app.nodeStatus &&
|
||||
state.app.nodeStatus.syncPercent === 100 && this.hasName === false && this.hasAttemptedToFetchResource &&
|
||||
state.app.accountInfo && state.app.accountInfo.names && state.app.accountInfo.names.length > 0
|
||||
) {
|
||||
this.getGeneralSettingsQdn()
|
||||
}
|
||||
}
|
||||
|
||||
async getArbitraryFee() {
|
||||
const timestamp = Date.now()
|
||||
const url = `${this.nodeUrl}/transactions/unitfee?txType=ARBITRARY×tamp=${timestamp}`
|
||||
const response = await fetch(url)
|
||||
|
||||
if (!response.ok) {
|
||||
throw new Error('Error when fetching arbitrary fee')
|
||||
}
|
||||
|
||||
const data = await response.json()
|
||||
const arbitraryFee = (Number(data) / 1e8).toFixed(8)
|
||||
|
||||
return {
|
||||
timestamp,
|
||||
fee: Number(data),
|
||||
feeToShow: arbitraryFee
|
||||
}
|
||||
}
|
||||
|
||||
async saveToQdn() {
|
||||
try {
|
||||
this.isSaving = true
|
||||
|
||||
if (this.resourceExists === true && this.error) throw new Error('Unable to save')
|
||||
|
||||
const nameObject = store.getState().app.accountInfo.names[0]
|
||||
|
||||
if (!nameObject) throw new Error('no name')
|
||||
|
||||
const name = nameObject.name
|
||||
const identifer = 'qortal_general_settings'
|
||||
const filename = 'qortal_general_settings.json'
|
||||
const selectedAddress = store.getState().app.selectedAddress
|
||||
const getArbitraryFee = await this.getArbitraryFee()
|
||||
const feeAmount = getArbitraryFee.fee
|
||||
const friendsList = JSON.parse(localStorage.getItem('friends-my-friend-list') || '[]')
|
||||
const friendsFeed = JSON.parse(localStorage.getItem('friends-my-selected-feeds') || '[]')
|
||||
const myMenuPlugs = JSON.parse(localStorage.getItem('myMenuPlugs') || '[]')
|
||||
|
||||
let newObject
|
||||
|
||||
if (this.resourceExists === false) {
|
||||
newObject = {
|
||||
version: 1,
|
||||
userLists: [friendsList],
|
||||
friendsFeed,
|
||||
myMenuPlugs
|
||||
}
|
||||
} else if (this.settingsRawData) {
|
||||
const tempSettingsData = JSON.parse(localStorage.getItem('temp-settings-data') || '{}')
|
||||
|
||||
newObject = {...this.settingsRawData}
|
||||
|
||||
for (const key in tempSettingsData) {
|
||||
if (tempSettingsData[key].hasOwnProperty('data')) {
|
||||
if (key === 'userLists' && !Array.isArray(tempSettingsData[key].data)) {
|
||||
continue
|
||||
}
|
||||
|
||||
if (key === 'friendsFeed' && !Array.isArray(tempSettingsData[key].data)) {
|
||||
continue
|
||||
}
|
||||
|
||||
if (key === 'myMenuPlugs' && !Array.isArray(tempSettingsData[key].data)) {
|
||||
continue
|
||||
}
|
||||
|
||||
newObject[key] = tempSettingsData[key].data
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
const newObjectToBase64 = await objectToBase64(newObject)
|
||||
const encryptedData = encryptDataGroup({data64: newObjectToBase64, publicKeys: []})
|
||||
const worker = new WebWorker()
|
||||
|
||||
try {
|
||||
const resPublish = await publishData({
|
||||
registeredName: encodeURIComponent(name),
|
||||
file: encryptedData,
|
||||
service: 'DOCUMENT_PRIVATE',
|
||||
identifier: encodeURIComponent(identifer),
|
||||
parentEpml: parentEpml,
|
||||
uploadType: 'file',
|
||||
selectedAddress: selectedAddress,
|
||||
worker: worker,
|
||||
isBase64: true,
|
||||
filename: filename,
|
||||
apiVersion: 2,
|
||||
withFee: true,
|
||||
feeAmount: feeAmount
|
||||
})
|
||||
|
||||
this.resourceExists = true
|
||||
await this.setValues(newObject, { updated: Date.now() })
|
||||
localStorage.setItem('temp-settings-data', JSON.stringify({}))
|
||||
this.valuesToBeSavedOnQdn = {}
|
||||
worker.terminate()
|
||||
} catch (error) {
|
||||
worker.terminate()
|
||||
}
|
||||
} catch (error) {
|
||||
console.log({ error })
|
||||
} finally {
|
||||
this.isSaving = false
|
||||
}
|
||||
}
|
||||
|
||||
_updateTempSettingsData() {
|
||||
this.valuesToBeSavedOnQdn = JSON.parse(localStorage.getItem('temp-settings-data') || '{}')
|
||||
}
|
||||
|
||||
connectedCallback() {
|
||||
super.connectedCallback()
|
||||
window.addEventListener('temp-settings-data-event', this._updateTempSettingsData)
|
||||
}
|
||||
|
||||
disconnectedCallback() {
|
||||
window.removeEventListener('temp-settings-data-event', this._updateTempSettingsData)
|
||||
super.disconnectedCallback()
|
||||
}
|
||||
|
||||
// Standard functions
|
||||
getApiKey() {
|
||||
const coreNode = store.getState().app.nodeConfig.knownNodes[store.getState().app.nodeConfig.node]
|
||||
return coreNode.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('save-settings-qdn', SaveSettingsQdn)
|
@ -1,88 +1,123 @@
|
||||
import { html, LitElement } from 'lit'
|
||||
import { languageSelectorStyles } from '../styles/core-css'
|
||||
|
||||
// Multi language support
|
||||
import { registerTranslateConfig, translate, use } from '../../translate'
|
||||
import { LitElement, html, css } from 'lit'
|
||||
import { use, translate, translateUnsafeHTML, registerTranslateConfig } from 'lit-translate'
|
||||
|
||||
registerTranslateConfig({
|
||||
loader: lang => fetch(`/language/${lang}.json`).then(res => res.json())
|
||||
loader: lang => fetch(`/language/${lang}.json`).then(res => res.json())
|
||||
})
|
||||
|
||||
const checkLanguage = localStorage.getItem('qortalLanguage')
|
||||
|
||||
if (checkLanguage === null || checkLanguage.length === 0) {
|
||||
localStorage.setItem('qortalLanguage', 'us')
|
||||
use('us')
|
||||
localStorage.setItem('qortalLanguage', 'us')
|
||||
use('us')
|
||||
} else {
|
||||
use(checkLanguage)
|
||||
use(checkLanguage)
|
||||
}
|
||||
|
||||
class LanguageSelector extends LitElement {
|
||||
static get properties() {
|
||||
return {
|
||||
theme: { type: String, reflect: true }
|
||||
}
|
||||
}
|
||||
static get properties() {
|
||||
return {
|
||||
theme: { type: String, reflect: true }
|
||||
}
|
||||
}
|
||||
|
||||
static get styles() {
|
||||
return [languageSelectorStyles]
|
||||
}
|
||||
static get styles() {
|
||||
return [
|
||||
css`
|
||||
select {
|
||||
width: 175px;
|
||||
height: 34px;
|
||||
padding: 5px 0px 5px 5px;
|
||||
font-size: 16px;
|
||||
border: 1px solid var(--black);
|
||||
border-radius: 3px;
|
||||
color: var(--black);
|
||||
background:
|
||||
linear-gradient(45deg, transparent 50%, white 50%),
|
||||
linear-gradient(135deg, white 50%, transparent 50%),
|
||||
linear-gradient(to right, #03a9f4, #03a9f4);
|
||||
background-position:
|
||||
calc(100% - 17px) calc(0.5em + 4px),
|
||||
calc(100% - 7px) calc(0.5em + 4px),
|
||||
100% 0;
|
||||
background-size:
|
||||
10px 10px,
|
||||
10px 10px,
|
||||
2.2em 2.2em;
|
||||
background-repeat: no-repeat;
|
||||
-webkit-box-sizing: border-box;
|
||||
-moz-box-sizing: border-box;
|
||||
box-sizing: border-box;
|
||||
-webkit-appearance:none;
|
||||
-moz-appearance:none;
|
||||
}
|
||||
|
||||
constructor() {
|
||||
super()
|
||||
this.theme = localStorage.getItem('qortalTheme') ? localStorage.getItem('qortalTheme') : 'light'
|
||||
}
|
||||
*:focus {
|
||||
outline: none;
|
||||
}
|
||||
|
||||
render() {
|
||||
return html`
|
||||
<div style="display: inline;">
|
||||
<select id="languageSelect" @change="${this.changeLanguage}">
|
||||
<option value="us">US - ${translate("selectmenu.english")}</option>
|
||||
<option value="de">DE - ${translate("selectmenu.german")}</option>
|
||||
<option value="es">ES - ${translate("selectmenu.spanish")}</option>
|
||||
<option value="et">ET - ${translate("selectmenu.estonian")}</option>
|
||||
<option value="fi">FI - ${translate("selectmenu.finnish")}</option>
|
||||
<option value="fr">FR - ${translate("selectmenu.french")}</option>
|
||||
<option value="hr">HR - ${translate("selectmenu.croatian")}</option>
|
||||
<option value="hu">HU - ${translate("selectmenu.hungarian")}</option>
|
||||
<option value="hindi">IN - ${translate("selectmenu.hindi")}</option>
|
||||
<option value="it">IT - ${translate("selectmenu.italian")}</option>
|
||||
<option value="jp">JP - ${translate("selectmenu.japanese")}</option>
|
||||
<option value="ko">KO - ${translate("selectmenu.korean")}</option>
|
||||
<option value="nl">NL - ${translate("selectmenu.dutch")}</option>
|
||||
<option value="no">NO - ${translate("selectmenu.norwegian")}</option>
|
||||
<option value="pl">PL - ${translate("selectmenu.polish")}</option>
|
||||
<option value="pt">PT - ${translate("selectmenu.portuguese")}</option>
|
||||
<option value="rs">RS - ${translate("selectmenu.serbian")}</option>
|
||||
<option value="ro">RO - ${translate("selectmenu.romanian")}</option>
|
||||
<option value="ru">RU - ${translate("selectmenu.russian")}</option>
|
||||
<option value="zht">ZHT - ${translate("selectmenu.chinese2")}</option>
|
||||
<option value="zhc">ZHC - ${translate("selectmenu.chinese1")}</option>
|
||||
</select>
|
||||
</div>
|
||||
`
|
||||
}
|
||||
select option {
|
||||
color: var(--black);
|
||||
background: var(--white);
|
||||
line-height: 34px;
|
||||
}
|
||||
`
|
||||
]
|
||||
}
|
||||
|
||||
firstUpdated() {
|
||||
const myElement = this.shadowRoot.getElementById('languageSelect')
|
||||
constructor() {
|
||||
super()
|
||||
this.theme = localStorage.getItem('qortalTheme') ? localStorage.getItem('qortalTheme') : 'light'
|
||||
}
|
||||
|
||||
myElement.addEventListener('change', () => {
|
||||
this.selectElement()
|
||||
})
|
||||
render() {
|
||||
return html`
|
||||
<div style="display: inline;">
|
||||
<select id="languageSelect" @change="${this.changeLanguage}">
|
||||
<option value="us">US - ${translate("selectmenu.english")}</option>
|
||||
<option value="de">DE - ${translate("selectmenu.german")}</option>
|
||||
<option value="es">ES - ${translate("selectmenu.spanish")}</option>
|
||||
<option value="et">ET - ${translate("selectmenu.estonian")}</option>
|
||||
<option value="fr">FR - ${translate("selectmenu.french")}</option>
|
||||
<option value="hr">HR - ${translate("selectmenu.croatian")}</option>
|
||||
<option value="hu">HU - ${translate("selectmenu.hungarian")}</option>
|
||||
<option value="hindi">IN - ${translate("selectmenu.hindi")}</option>
|
||||
<option value="it">IT - ${translate("selectmenu.italian")}</option>
|
||||
<option value="jp">JP - ${translate("selectmenu.japanese")}</option>
|
||||
<option value="ko">KO - ${translate("selectmenu.korean")}</option>
|
||||
<option value="no">NO - ${translate("selectmenu.norwegian")}</option>
|
||||
<option value="pl">PL - ${translate("selectmenu.polish")}</option>
|
||||
<option value="pt">PT - ${translate("selectmenu.portuguese")}</option>
|
||||
<option value="rs">RS - ${translate("selectmenu.serbian")}</option>
|
||||
<option value="ro">RO - ${translate("selectmenu.romanian")}</option>
|
||||
<option value="ru">RU - ${translate("selectmenu.russian")}</option>
|
||||
<option value="zht">ZHT - ${translate("selectmenu.chinese2")}</option>
|
||||
<option value="zhc">ZHC - ${translate("selectmenu.chinese1")}</option>
|
||||
</select>
|
||||
</div>
|
||||
`
|
||||
}
|
||||
|
||||
this.selectElement()
|
||||
}
|
||||
firstUpdated() {
|
||||
const myElement = this.shadowRoot.getElementById('languageSelect')
|
||||
|
||||
selectElement() {
|
||||
const selectedLanguage = localStorage.getItem('qortalLanguage')
|
||||
let element = this.shadowRoot.getElementById('languageSelect')
|
||||
element.value = selectedLanguage
|
||||
}
|
||||
myElement.addEventListener("change", () => {
|
||||
this.selectElement()
|
||||
})
|
||||
|
||||
changeLanguage(event) {
|
||||
use(event.target.value)
|
||||
localStorage.setItem('qortalLanguage', event.target.value)
|
||||
}
|
||||
this.selectElement()
|
||||
}
|
||||
|
||||
selectElement() {
|
||||
const selectedLanguage = localStorage.getItem('qortalLanguage')
|
||||
let element = this.shadowRoot.getElementById('languageSelect')
|
||||
element.value = selectedLanguage
|
||||
}
|
||||
|
||||
changeLanguage(event) {
|
||||
use(event.target.value)
|
||||
localStorage.setItem('qortalLanguage', event.target.value)
|
||||
}
|
||||
}
|
||||
|
||||
window.customElements.define('language-selector', LanguageSelector)
|
||||
window.customElements.define('language-selector', LanguageSelector)
|
||||
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -1,406 +1,311 @@
|
||||
import { html, LitElement } from 'lit'
|
||||
import { LitElement, html, css } from 'lit'
|
||||
import { connect } from 'pwa-helpers'
|
||||
import { store } from '../../store'
|
||||
import { stateAwait } from '../../stateAwait'
|
||||
import {
|
||||
addAutoLoadImageChat,
|
||||
addChatLastSeen,
|
||||
addTabInfo,
|
||||
allowQAPPAutoAuth,
|
||||
allowQAPPAutoFriendsList,
|
||||
allowQAPPAutoLists,
|
||||
allowShowSyncIndicator,
|
||||
removeAutoLoadImageChat,
|
||||
removeQAPPAutoAuth,
|
||||
removeQAPPAutoFriendsList,
|
||||
removeQAPPAutoLists,
|
||||
removeShowSyncIndicator,
|
||||
setNewNotification,
|
||||
setNewTab,
|
||||
setSideEffectAction,
|
||||
setTabNotifications
|
||||
} from '../../redux/app/app-actions'
|
||||
import settings from '../../functional-components/settings-page'
|
||||
import './welcome-page'
|
||||
import './create-account-section'
|
||||
import './login-section'
|
||||
import '../qort-theme-toggle'
|
||||
import { store } from '../../store.js'
|
||||
import { stateAwait } from '../../stateAwait.js'
|
||||
import { translate, translateUnsafeHTML } from 'lit-translate'
|
||||
|
||||
import '@material/mwc-button'
|
||||
import '@material/mwc-icon'
|
||||
import '@material/mwc-fab'
|
||||
import '@polymer/iron-pages'
|
||||
import '@polymer/paper-icon-button/paper-icon-button.js'
|
||||
import './welcome-page.js'
|
||||
import './create-account-section.js'
|
||||
import './login-section.js'
|
||||
import '../qort-theme-toggle.js'
|
||||
|
||||
// Multi language support
|
||||
import { get } from '../../../translate'
|
||||
import settings from '../../functional-components/settings-page.js'
|
||||
import { addAutoLoadImageChat, removeAutoLoadImageChat, addChatLastSeen, allowQAPPAutoAuth, removeQAPPAutoAuth, removeQAPPAutoLists, allowQAPPAutoLists, addTabInfo, setTabNotifications, setNewTab, setNewNotification, setSideEffectAction } from '../../redux/app/app-actions.js'
|
||||
|
||||
window.reduxStore = store
|
||||
|
||||
window.reduxAction = {
|
||||
addAutoLoadImageChat: addAutoLoadImageChat,
|
||||
removeAutoLoadImageChat: removeAutoLoadImageChat,
|
||||
addChatLastSeen: addChatLastSeen,
|
||||
allowQAPPAutoAuth: allowQAPPAutoAuth,
|
||||
removeQAPPAutoAuth: removeQAPPAutoAuth,
|
||||
allowQAPPAutoLists: allowQAPPAutoLists,
|
||||
removeQAPPAutoLists: removeQAPPAutoLists,
|
||||
addTabInfo: addTabInfo,
|
||||
setTabNotifications: setTabNotifications,
|
||||
setNewTab: setNewTab,
|
||||
setNewNotification: setNewNotification,
|
||||
setSideEffectAction: setSideEffectAction,
|
||||
allowQAPPAutoFriendsList: allowQAPPAutoFriendsList,
|
||||
removeQAPPAutoFriendsList: removeQAPPAutoFriendsList,
|
||||
allowShowSyncIndicator: allowShowSyncIndicator,
|
||||
removeShowSyncIndicator: removeShowSyncIndicator
|
||||
addAutoLoadImageChat: addAutoLoadImageChat,
|
||||
removeAutoLoadImageChat: removeAutoLoadImageChat,
|
||||
addChatLastSeen: addChatLastSeen,
|
||||
allowQAPPAutoAuth: allowQAPPAutoAuth,
|
||||
removeQAPPAutoAuth: removeQAPPAutoAuth,
|
||||
allowQAPPAutoLists: allowQAPPAutoLists,
|
||||
removeQAPPAutoLists: removeQAPPAutoLists,
|
||||
addTabInfo: addTabInfo,
|
||||
setTabNotifications: setTabNotifications,
|
||||
setNewTab: setNewTab,
|
||||
setNewNotification: setNewNotification,
|
||||
setSideEffectAction: setSideEffectAction
|
||||
}
|
||||
|
||||
const animationDuration = 0.7 // Seconds
|
||||
|
||||
class LoginView extends connect(store)(LitElement) {
|
||||
static get properties() {
|
||||
return {
|
||||
loggedIn: { type: Boolean },
|
||||
selectedPage: { type: String },
|
||||
pages: { type: Object },
|
||||
rippleIsOpen: { type: Boolean },
|
||||
config: { type: Object },
|
||||
rippleLoadingMessage: { type: String },
|
||||
selectedPageElement: {},
|
||||
nodeConfig: { type: Object },
|
||||
theme: { type: String, reflect: true }
|
||||
}
|
||||
}
|
||||
static get properties() {
|
||||
return {
|
||||
loggedIn: { type: Boolean },
|
||||
selectedPage: { type: String },
|
||||
pages: { type: Object },
|
||||
rippleIsOpen: { type: Boolean },
|
||||
config: { type: Object },
|
||||
rippleLoadingMessage: { type: String },
|
||||
selectedPageElement: {},
|
||||
nodeConfig: { type: Object },
|
||||
theme: { type: String, reflect: true }
|
||||
}
|
||||
}
|
||||
|
||||
constructor() {
|
||||
super()
|
||||
this.selectedPage = this.getPreSelectedPage()
|
||||
this.selectedPageElement = {}
|
||||
this.rippleIsOpen = false
|
||||
this.pages = {
|
||||
welcome: 0,
|
||||
'create-account': 1,
|
||||
login: 2
|
||||
}
|
||||
this.rippleLoadingMessage = 'Getting information'
|
||||
this.theme = localStorage.getItem('qortalTheme') ? localStorage.getItem('qortalTheme') : 'light'
|
||||
}
|
||||
static get styles() {
|
||||
return [
|
||||
css``
|
||||
]
|
||||
}
|
||||
|
||||
render() {
|
||||
return html`
|
||||
<style>
|
||||
getPreSelectedPage() {
|
||||
return 'welcome'
|
||||
}
|
||||
|
||||
canvas {
|
||||
display: block;
|
||||
vertical-align: bottom;
|
||||
}
|
||||
constructor() {
|
||||
super()
|
||||
this.selectedPage = this.getPreSelectedPage()
|
||||
this.selectedPageElement = {}
|
||||
this.rippleIsOpen = false
|
||||
this.pages = {
|
||||
welcome: 0,
|
||||
'create-account': 1,
|
||||
login: 2
|
||||
}
|
||||
this.rippleLoadingMessage = 'Getting information'
|
||||
this.theme = localStorage.getItem('qortalTheme') ? localStorage.getItem('qortalTheme') : 'light'
|
||||
}
|
||||
|
||||
.login-page {
|
||||
background: var(--background);
|
||||
background-repeat: no-repeat;
|
||||
background-attachment: fixed;
|
||||
background-position: center;
|
||||
height: var(--window-height);
|
||||
width: 100vw;
|
||||
max-width: 100vw;
|
||||
max-height: var(--window-height);
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
z-index: 1;
|
||||
}
|
||||
firstUpdated() {
|
||||
|
||||
.login-card-container {
|
||||
max-width: 1240px;
|
||||
max-height: var(--window-height);
|
||||
margin-right: auto;
|
||||
margin-left: auto;
|
||||
width: calc(100vw);
|
||||
}
|
||||
stateAwait(state => {
|
||||
return 'primary' in state.config.styles.theme.colors
|
||||
}).catch(e => console.error(e))
|
||||
|
||||
.qortal-logo {
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
width: 200px;
|
||||
max-width: 40%;
|
||||
z-index: 1;
|
||||
}
|
||||
const loginContainerPages = this.shadowRoot.querySelector('#loginContainerPages')
|
||||
const loginCard = this.shadowRoot.querySelector('#login-card')
|
||||
const navigate = e => {
|
||||
this.selectPage(e.detail.page)
|
||||
}
|
||||
const updatedProperty = e => {
|
||||
// ...
|
||||
const selectedPageElement = this.selectedPageElement
|
||||
this.selectedPageElement = {}
|
||||
setTimeout(() => { this.selectedPageElement = selectedPageElement }, 1) // Yuck
|
||||
}
|
||||
loginContainerPages.addEventListener('selected-item-changed', () => {
|
||||
|
||||
.login-card-center-container {
|
||||
max-width: 100%;
|
||||
max-height: var(--window-height);
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
height: var(--window-height);
|
||||
overflow: hidden;
|
||||
}
|
||||
if (!loginContainerPages.selectedItem) {
|
||||
|
||||
#loginContainerPages {
|
||||
display: inline;
|
||||
}
|
||||
if (this.selectedPageElement.removeEventListener) {
|
||||
this.selectedPageElement.removeEventListener('navigate', navigate)
|
||||
this.selectedPageElement.removeEventListener('updatedProperty', updatedProperty)
|
||||
}
|
||||
this.selectedPageElement = {}
|
||||
loginCard.classList.remove('animated')
|
||||
loginCard.className += ' animated'
|
||||
} else {
|
||||
setTimeout(() => {
|
||||
|
||||
#loginContainerPages [page] {
|
||||
background: none;
|
||||
padding: 0;
|
||||
}
|
||||
this.selectedPageElement = loginContainerPages.selectedItem
|
||||
|
||||
.login-card {
|
||||
min-width: 340px;
|
||||
border-bottom: 2px solid var(--mdc-theme-primary);
|
||||
border-top: 2px solid var(--mdc-theme-primary);
|
||||
text-align: center;
|
||||
z-index: 0;
|
||||
padding: 0;
|
||||
border: 0;
|
||||
border-radius: 4px;
|
||||
}
|
||||
this.selectedPageElement.addEventListener('navigate', navigate)
|
||||
this.selectedPageElement.addEventListener('updatedProperty', updatedProperty)
|
||||
setTimeout(() => loginCard.classList.remove('animated'), animationDuration * 1000)
|
||||
}, 1)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
.login-card p {
|
||||
margin-top: 0;
|
||||
font-size: 1rem;
|
||||
font-style: italic;
|
||||
}
|
||||
render() {
|
||||
return html`
|
||||
<style>
|
||||
canvas {
|
||||
display: block;
|
||||
vertical-align: bottom;
|
||||
}
|
||||
|
||||
.login-page {
|
||||
background: var(--background);
|
||||
background-repeat: no-repeat;
|
||||
background-attachment: fixed;
|
||||
background-position: center;
|
||||
height: var(--window-height);
|
||||
width:100vw;
|
||||
max-width:100vw;
|
||||
max-height:var(--window-height);
|
||||
position:absolute;
|
||||
top:0;
|
||||
left:0;
|
||||
z-index:1;
|
||||
}
|
||||
.login-card-container {
|
||||
max-width:1240px;
|
||||
max-height:var(--window-height);
|
||||
margin-right: auto;
|
||||
margin-left: auto;
|
||||
width: calc(100vw);
|
||||
}
|
||||
.qortal-logo {
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
width:200px;
|
||||
max-width:40%;
|
||||
z-index:1;
|
||||
}
|
||||
.login-card-center-container {
|
||||
max-width:100%;
|
||||
max-height:var(--window-height);
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
height: var(--window-height);
|
||||
overflow:hidden;
|
||||
}
|
||||
#loginContainerPages {
|
||||
display:inline;
|
||||
}
|
||||
#loginContainerPages [page] {
|
||||
background: none;
|
||||
padding:0;
|
||||
}
|
||||
.login-card {
|
||||
min-width: 340px;
|
||||
border-bottom: 2px solid var(--mdc-theme-primary);
|
||||
border-top: 2px solid var(--mdc-theme-primary);
|
||||
text-align:center;
|
||||
z-index:0;
|
||||
padding:0;
|
||||
border: 0;
|
||||
border-radius: 4px;
|
||||
}
|
||||
.login-card p {
|
||||
margin-top: 0;
|
||||
font-size: 1rem;
|
||||
font-style: italic;
|
||||
}
|
||||
.login-card h1{
|
||||
margin-bottom:12px;
|
||||
font-size:64px;
|
||||
}
|
||||
.login-card iron-pages {
|
||||
height:100%;
|
||||
}
|
||||
.backButton {
|
||||
padding-top:18px;
|
||||
text-align:center;
|
||||
}
|
||||
#login-pages-nav {
|
||||
text-align: left;
|
||||
/* padding-bottom:8px; */
|
||||
padding: 12px 0 8px 0;
|
||||
}
|
||||
#nav-next {
|
||||
float: right;
|
||||
}
|
||||
@media only screen and (min-width: ${getComputedStyle(document.body).getPropertyValue('--layout-breakpoint-tablet')}) {
|
||||
/* Desktop/tablet */
|
||||
.login-card {
|
||||
max-width:460px;
|
||||
}
|
||||
#loginContainerPages [page] {
|
||||
border-radius: 4px;
|
||||
}
|
||||
#loginContainerPages [page="welcome"] {
|
||||
}
|
||||
}
|
||||
@media only screen and (max-width: ${getComputedStyle(document.body).getPropertyValue('--layout-breakpoint-tablet')}) {
|
||||
/* Mobile */
|
||||
.qortal-logo {
|
||||
display:none;
|
||||
visibility:hidden;
|
||||
}
|
||||
.login-card{
|
||||
width:100%;
|
||||
margin:0;
|
||||
top:0;
|
||||
max-width:100%;
|
||||
}
|
||||
.backButton {
|
||||
text-align: left;
|
||||
padding-left:12px;
|
||||
}
|
||||
}
|
||||
@keyframes fade {
|
||||
from {
|
||||
opacity: 0;
|
||||
transform: translateX(-20%);
|
||||
}
|
||||
to {
|
||||
opacity: 1;
|
||||
transform: translateX(0);
|
||||
}
|
||||
}
|
||||
@keyframes grow-up {
|
||||
from {
|
||||
overflow:hidden;
|
||||
max-height:0;
|
||||
}
|
||||
to {
|
||||
overflow:hidden;
|
||||
max-height:var(--window-height);
|
||||
}
|
||||
}
|
||||
iron-pages .animated, .animated {
|
||||
animation-duration: ${animationDuration}s;
|
||||
animation-name: grow-up;
|
||||
}
|
||||
div[page] > paper-icon-button {
|
||||
margin:12px;
|
||||
}
|
||||
.corner-box {
|
||||
border-color: var(--mdc-theme-primary) !important;
|
||||
}
|
||||
[hidden] {
|
||||
visibility: hidden;
|
||||
display: none;
|
||||
}
|
||||
</style>
|
||||
<div class="login-page" ?hidden=${this.loggedIn}>
|
||||
<mwc-fab icon="settings" style="position:fixed; right:24px; bottom:24px;" @click=${() => settings.show()}></mwc-fab>
|
||||
<span style="position:fixed; left:24px; bottom:24px;"><qort-theme-toggle></qort-theme-toggle></span>
|
||||
<div class="login-card-container">
|
||||
<div class="login-card-center-container">
|
||||
<div class="login-card" id="login-card">
|
||||
<img class="qortal-logo" src="${this.config.coin.logo}">
|
||||
<h5 style="color:var(--mdc-theme-primary)" ?hidden="${this.selectedPage != "welcome"}">${translate("appinfo.uiversion")}: ${this.nodeConfig.version ? this.nodeConfig.version : ''}</h5>
|
||||
<iron-pages selected="${this.selectedPage}" attr-for-selected="page" id="loginContainerPages">
|
||||
<welcome-page @next=${e => this.selectedPageElement.next(e)} page="welcome"></welcome-page>
|
||||
<create-account-section @next=${e => this.selectedPageElement.next(e)} page="create-account"></create-account-section>
|
||||
<login-section @next=${e => this.selectedPageElement.next(e)} page="login"></login-section>
|
||||
</iron-pages>
|
||||
<div id="login-pages-nav" ?hidden="${this.selectedPageElement.hideNav}">
|
||||
<mwc-button @click=${e => this.selectedPageElement.back(e)} id="nav-back" ?hidden="${this.selectedPageElement.backHidden}" ?disabled="${this.selectedPageElement.backDisabled}">
|
||||
<mwc-icon>keyboard_arrow_left</mwc-icon>${this.selectedPageElement.backText}
|
||||
</mwc-button>
|
||||
<mwc-button @click=${e => this.selectedPageElement.next(e)} id="nav-next" ?hidden="${this.selectedPageElement.nextHidden}" ?disabled="${this.selectedPageElement.nextDisabled}">
|
||||
${this.selectedPageElement.nextText}<mwc-icon>keyboard_arrow_right</mwc-icon>
|
||||
</mwc-button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
`
|
||||
}
|
||||
|
||||
.login-card h1 {
|
||||
margin-bottom: 12px;
|
||||
font-size: 64px;
|
||||
}
|
||||
selectPage(newPage) {
|
||||
this.selectedPage = newPage
|
||||
}
|
||||
|
||||
.login-card h5 {
|
||||
margin-top: -16px;
|
||||
margin-left: 100px;
|
||||
font-size: 14px;
|
||||
color: var(--black);
|
||||
}
|
||||
stateChanged(state) {
|
||||
if (this.loggedIn && !state.app.loggedIn) this.cleanup()
|
||||
this.loggedIn = state.app.loggedIn
|
||||
this.config = state.config
|
||||
this.nodeConfig = state.app.nodeConfig
|
||||
}
|
||||
|
||||
.login-card h6 {
|
||||
font-size: 12px;
|
||||
color: var(--mdc-theme-primary);
|
||||
}
|
||||
|
||||
.login-card iron-pages {
|
||||
height: 100%;
|
||||
margin-top: -16px;
|
||||
}
|
||||
|
||||
.backButton {
|
||||
padding-top: 18px;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
#login-pages-nav {
|
||||
text-align: left;
|
||||
padding: 12px 0 8px 0;
|
||||
}
|
||||
|
||||
#nav-next {
|
||||
float: right;
|
||||
}
|
||||
|
||||
@media only screen and (min-width: ${getComputedStyle(document.body).getPropertyValue('--layout-breakpoint-tablet')}) {
|
||||
|
||||
/* Desktop/tablet */
|
||||
.login-card {
|
||||
max-width: 460px;
|
||||
}
|
||||
|
||||
#loginContainerPages [page] {
|
||||
border-radius: 4px;
|
||||
}
|
||||
|
||||
#loginContainerPages [page="welcome"] {}
|
||||
}
|
||||
|
||||
@media only screen and (max-width: ${getComputedStyle(document.body).getPropertyValue('--layout-breakpoint-tablet')}) {
|
||||
|
||||
/* Mobile */
|
||||
.qortal-logo {
|
||||
display: none;
|
||||
visibility: hidden;
|
||||
}
|
||||
|
||||
.login-card {
|
||||
width: 100%;
|
||||
margin: 0;
|
||||
top: 0;
|
||||
max-width: 100%;
|
||||
}
|
||||
|
||||
.backButton {
|
||||
text-align: left;
|
||||
padding-left: 12px;
|
||||
}
|
||||
|
||||
.login-card h5 {
|
||||
margin-top: 0px;
|
||||
margin-left: 0px;
|
||||
font-size: 14px;
|
||||
color: var(--black);
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes fade {
|
||||
from {
|
||||
opacity: 0;
|
||||
transform: translateX(-20%);
|
||||
}
|
||||
|
||||
to {
|
||||
opacity: 1;
|
||||
transform: translateX(0);
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes grow-up {
|
||||
from {
|
||||
overflow: hidden;
|
||||
max-height: 0;
|
||||
}
|
||||
|
||||
to {
|
||||
overflow: hidden;
|
||||
max-height: var(--window-height);
|
||||
}
|
||||
}
|
||||
|
||||
iron-pages .animated,
|
||||
.animated {
|
||||
animation-duration: ${animationDuration}s;
|
||||
animation-name: grow-up;
|
||||
}
|
||||
|
||||
div[page]>paper-icon-button {
|
||||
margin: 12px;
|
||||
}
|
||||
|
||||
.corner-box {
|
||||
border-color: var(--mdc-theme-primary) !important;
|
||||
}
|
||||
|
||||
[hidden] {
|
||||
visibility: hidden;
|
||||
display: none;
|
||||
}
|
||||
</style>
|
||||
<div class="login-page" ?hidden=${this.loggedIn}>
|
||||
<mwc-fab icon="settings" style="position:fixed; right:24px; bottom:24px;" @click=${() => settings.show()}></mwc-fab>
|
||||
<span style="position:fixed; left:24px; bottom:24px;">
|
||||
<qort-theme-toggle></qort-theme-toggle>
|
||||
</span>
|
||||
<div class="login-card-container">
|
||||
<div class="login-card-center-container">
|
||||
<div class="login-card" id="login-card">
|
||||
<img class="qortal-logo" src="${this.config.coin.logo}">
|
||||
<h5 ?hidden="${this.selectedPage != "welcome"}">UI: v${this.nodeConfig.version ? this.nodeConfig.version : ''}</h5>
|
||||
${this.renderSelectedNodeOnStart()}
|
||||
<iron-pages selected="${this.selectedPage}" attr-for-selected="page" id="loginContainerPages">
|
||||
<welcome-page @next=${e => this.selectedPageElement.next(e)} page="welcome"></welcome-page>
|
||||
<create-account-section @next=${e => this.selectedPageElement.next(e)} page="create-account"></create-account-section>
|
||||
<login-section @next=${e => this.selectedPageElement.next(e)} page="login"></login-section>
|
||||
</iron-pages>
|
||||
<div id="login-pages-nav" ?hidden="${this.selectedPageElement.hideNav}">
|
||||
<mwc-button
|
||||
@click=${e => this.selectedPageElement.back(e)}
|
||||
id="nav-back"
|
||||
?hidden="${this.selectedPageElement.backHidden}"
|
||||
?disabled="${this.selectedPageElement.backDisabled}"
|
||||
>
|
||||
<mwc-icon>keyboard_arrow_left</mwc-icon>
|
||||
${this.selectedPageElement.backText}
|
||||
</mwc-button>
|
||||
<mwc-button
|
||||
@click=${e => this.selectedPageElement.next(e)}
|
||||
id="nav-next"
|
||||
?hidden="${this.selectedPageElement.nextHidden}"
|
||||
?disabled="${this.selectedPageElement.nextDisabled}"
|
||||
>
|
||||
${this.selectedPageElement.nextText}
|
||||
<mwc-icon>keyboard_arrow_right</mwc-icon>
|
||||
</mwc-button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
`
|
||||
}
|
||||
|
||||
firstUpdated() {
|
||||
stateAwait(state => {
|
||||
return 'primary' in state.config.styles.theme.colors
|
||||
}).catch(e => console.error(e))
|
||||
|
||||
const loginContainerPages = this.shadowRoot.querySelector('#loginContainerPages')
|
||||
const loginCard = this.shadowRoot.querySelector('#login-card')
|
||||
|
||||
const navigate = e => {
|
||||
this.selectPage(e.detail.page)
|
||||
}
|
||||
|
||||
const updatedProperty = e => {
|
||||
const selectedPageElement = this.selectedPageElement
|
||||
|
||||
this.selectedPageElement = {}
|
||||
|
||||
setTimeout(() => { this.selectedPageElement = selectedPageElement }, 1)
|
||||
}
|
||||
|
||||
loginContainerPages.addEventListener('selected-item-changed', () => {
|
||||
if (!loginContainerPages.selectedItem) {
|
||||
|
||||
if (this.selectedPageElement.removeEventListener) {
|
||||
this.selectedPageElement.removeEventListener('navigate', navigate)
|
||||
this.selectedPageElement.removeEventListener('updatedProperty', updatedProperty)
|
||||
}
|
||||
|
||||
this.selectedPageElement = {}
|
||||
|
||||
loginCard.classList.remove('animated')
|
||||
loginCard.className += ' animated'
|
||||
} else {
|
||||
setTimeout(() => {
|
||||
this.selectedPageElement = loginContainerPages.selectedItem
|
||||
this.selectedPageElement.addEventListener('navigate', navigate)
|
||||
this.selectedPageElement.addEventListener('updatedProperty', updatedProperty)
|
||||
|
||||
setTimeout(() => loginCard.classList.remove('animated'), animationDuration * 1000)
|
||||
}, 1)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
getPreSelectedPage() {
|
||||
return 'welcome'
|
||||
}
|
||||
|
||||
renderSelectedNodeOnStart() {
|
||||
const selectedNodeIndexOnStart = localStorage.getItem('mySelectedNode')
|
||||
const catchSavedNodes = JSON.parse(localStorage.getItem('myQortalNodes'))
|
||||
const selectedNodeOnStart = catchSavedNodes[selectedNodeIndexOnStart]
|
||||
const selectedNameOnStart = `${selectedNodeOnStart.name}`
|
||||
const selectedNodeUrlOnStart = `${selectedNodeOnStart.protocol + '://' + selectedNodeOnStart.domain + ':' + selectedNodeOnStart.port}`
|
||||
|
||||
let connectString = get('settings.snack2')
|
||||
|
||||
return html`<h6>${connectString} : ${selectedNameOnStart} ${selectedNodeUrlOnStart}</h6>`
|
||||
}
|
||||
|
||||
selectPage(newPage) {
|
||||
this.selectedPage = newPage
|
||||
}
|
||||
|
||||
stateChanged(state) {
|
||||
if (this.loggedIn && !state.app.loggedIn) this.cleanup()
|
||||
|
||||
this.loggedIn = state.app.loggedIn
|
||||
this.config = state.config
|
||||
this.nodeConfig = state.app.nodeConfig
|
||||
}
|
||||
|
||||
cleanup() {
|
||||
this.selectedPage = 'welcome'
|
||||
}
|
||||
cleanup() {
|
||||
this.selectedPage = 'welcome'
|
||||
}
|
||||
}
|
||||
|
||||
window.customElements.define('login-view', LoginView)
|
||||
window.customElements.define('login-view', LoginView)
|
||||
|
@ -346,7 +346,8 @@ var pJS = function (tag_id, params) {
|
||||
var shape_type = pJS.particles.shape.type
|
||||
if (typeof (shape_type) === 'object') {
|
||||
if (shape_type instanceof Array) {
|
||||
this.shape = shape_type[Math.floor(Math.random() * shape_type.length)]
|
||||
var shape_selected = shape_type[Math.floor(Math.random() * shape_type.length)]
|
||||
this.shape = shape_selected
|
||||
}
|
||||
} else {
|
||||
this.shape = shape_type
|
||||
@ -1254,11 +1255,11 @@ function hexToRgb(hex) {
|
||||
g: parseInt(result[2], 16),
|
||||
b: parseInt(result[3], 16)
|
||||
} : null
|
||||
}
|
||||
};
|
||||
|
||||
function clamp(number, min, max) {
|
||||
return Math.min(Math.max(number, min), max)
|
||||
}
|
||||
};
|
||||
|
||||
function isInArray(value, array) {
|
||||
return array.indexOf(value) > -1
|
||||
|
@ -1,44 +1,88 @@
|
||||
import { html, LitElement } from 'lit'
|
||||
import { welcomePageStyles } from '../../styles/core-css'
|
||||
import { LitElement, html, css } from 'lit'
|
||||
import { translate, translateUnsafeHTML } from 'lit-translate'
|
||||
|
||||
import '@material/mwc-button'
|
||||
|
||||
// Multi language support
|
||||
import { translate } from '../../../translate'
|
||||
|
||||
class WelcomePage extends LitElement {
|
||||
static get properties() {
|
||||
return {
|
||||
hideNav: { type: Boolean, notify: true },
|
||||
theme: { type: String, reflect: true }
|
||||
}
|
||||
}
|
||||
static get properties() {
|
||||
return {
|
||||
nextHidden: { type: Boolean, notify: true },
|
||||
nextEnabled: { type: Boolean, notify: true },
|
||||
nextText: { type: String, notify: true },
|
||||
backHidden: { type: Boolean, notify: true },
|
||||
backDisabled: { type: Boolean, notify: true },
|
||||
backText: { type: String, notify: true },
|
||||
hideNav: { type: Boolean, notify: true },
|
||||
theme: { type: String, reflect: true }
|
||||
}
|
||||
}
|
||||
|
||||
static get styles() {
|
||||
return [welcomePageStyles]
|
||||
}
|
||||
static get styles() {
|
||||
return [
|
||||
css`
|
||||
* {
|
||||
--mdc-theme-primary: rgb(3, 169, 244);
|
||||
--mdc-theme-secondary: var(--mdc-theme-primary);
|
||||
--mdc-button-outline-color: #03a9f4;
|
||||
}
|
||||
|
||||
constructor() {
|
||||
super()
|
||||
this.hideNav = true
|
||||
this.theme = localStorage.getItem('qortalTheme') ? localStorage.getItem('qortalTheme') : 'light'
|
||||
}
|
||||
mwc-button {
|
||||
margin: 6px;
|
||||
width: 90%;
|
||||
max-width:90vw;
|
||||
margin: 4px;
|
||||
}
|
||||
|
||||
render() {
|
||||
return html`
|
||||
<div class="welcome-page">
|
||||
<mwc-button class="button-outline" @click=${() => this.navigate('login')} outlined>${translate("login.login")}</mwc-button>
|
||||
<mwc-button class="button-outline" @click=${() => this.navigate('create-account')} outlined>${translate("login.createaccount")}</mwc-button>
|
||||
</div>
|
||||
`
|
||||
}
|
||||
.welcome-page {
|
||||
padding: 12px 0;
|
||||
}
|
||||
`
|
||||
]
|
||||
}
|
||||
|
||||
navigate(page) {
|
||||
this.dispatchEvent(new CustomEvent('navigate', {
|
||||
detail: { page },
|
||||
bubbles: true,
|
||||
composed: true
|
||||
}))
|
||||
}
|
||||
constructor() {
|
||||
super()
|
||||
this.hideNav = true
|
||||
this.nextText = ''
|
||||
const welcomeMessage = 'Welcome to Qortal';
|
||||
this.welcomeMessage = welcomeMessage
|
||||
this.theme = localStorage.getItem('qortalTheme') ? localStorage.getItem('qortalTheme') : 'light'
|
||||
}
|
||||
|
||||
firstUpdate() {
|
||||
// ...
|
||||
}
|
||||
|
||||
render() {
|
||||
return html`
|
||||
<style>
|
||||
#mobile-logo {}
|
||||
@media only screen and (min-width: ${getComputedStyle(document.body).getPropertyValue('--layout-breakpoint-tablet')}) {
|
||||
#mobile-logo {
|
||||
display:hidden;
|
||||
visibility:none;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
<div class='welcome-page' style="overflow:hidden;">
|
||||
<div id="mobile-logo"></div>
|
||||
<mwc-button @click=${() => this.navigate('login')} outlined style="border-top:0; border-bottom:0;">${translate("login.login")}</mwc-button>
|
||||
<mwc-button @click=${() => this.navigate('create-account')} outlined style="border-top:0; border-bottom:0;">${translate("login.createaccount")}</mwc-button>
|
||||
</div>
|
||||
`
|
||||
}
|
||||
|
||||
back() { }
|
||||
|
||||
next() { }
|
||||
|
||||
navigate(page) {
|
||||
this.dispatchEvent(new CustomEvent('navigate', {
|
||||
detail: { page },
|
||||
bubbles: true,
|
||||
composed: true
|
||||
}))
|
||||
}
|
||||
}
|
||||
|
||||
window.customElements.define('welcome-page', WelcomePage)
|
||||
window.customElements.define('welcome-page', WelcomePage)
|
||||
|
@ -1,61 +1,72 @@
|
||||
import { html, LitElement } from 'lit'
|
||||
import { LitElement, html, css } from 'lit'
|
||||
import { connect } from 'pwa-helpers'
|
||||
import { store } from '../../store.js'
|
||||
import { doLogout } from '../../redux/app/app-actions.js'
|
||||
import { logoutViewStyles } from '../../styles/core-css'
|
||||
import '@material/mwc-button'
|
||||
import '@polymer/paper-dialog/paper-dialog.js'
|
||||
import { translate, translateUnsafeHTML } from 'lit-translate'
|
||||
|
||||
// Multi language support
|
||||
import { translate } from '../../../translate'
|
||||
import '@polymer/paper-dialog/paper-dialog.js'
|
||||
import '@material/mwc-button'
|
||||
|
||||
class LogoutView extends connect(store)(LitElement) {
|
||||
static get properties() {
|
||||
return {
|
||||
theme: { type: String, reflect: true }
|
||||
}
|
||||
}
|
||||
static get properties() {
|
||||
return {
|
||||
theme: { type: String, reflect: true }
|
||||
}
|
||||
}
|
||||
|
||||
static get styles() {
|
||||
return [logoutViewStyles]
|
||||
}
|
||||
static get styles() {
|
||||
return css`
|
||||
* {
|
||||
--mdc-theme-primary: rgb(3, 169, 244);
|
||||
--mdc-theme-secondary: var(--mdc-theme-primary);
|
||||
--mdc-theme-surface: var(--white);
|
||||
--mdc-dialog-content-ink-color: var(--black);
|
||||
}
|
||||
|
||||
constructor() {
|
||||
super()
|
||||
this.theme = localStorage.getItem('qortalTheme') ? localStorage.getItem('qortalTheme') : 'light'
|
||||
}
|
||||
.decline {
|
||||
--mdc-theme-primary: var(--mdc-theme-error)
|
||||
}
|
||||
|
||||
render() {
|
||||
return html`
|
||||
<paper-dialog style="background: var(--white);" id="userLogoutDialog" modal>
|
||||
<div style="text-align: center;">
|
||||
<h2 style="color: var(--black);">Qortal UI</h2>
|
||||
<hr>
|
||||
</div>
|
||||
<div style="text-align: center;">
|
||||
<h2 style="color: var(--black);">${translate("logout.confirmlogout")}</h2>
|
||||
</div>
|
||||
<div class="buttons">
|
||||
<mwc-button class='decline' @click=${() => this.decline()} dialog-dismiss>${translate("general.no")}</mwc-button>
|
||||
<mwc-button class='confirm' @click=${e => this.confirm(e)} dialog-confirm autofocus>${translate("general.yes")}</mwc-button>
|
||||
</div>
|
||||
</paper-dialog>
|
||||
`
|
||||
}
|
||||
.buttons {
|
||||
text-align:right;
|
||||
}
|
||||
`
|
||||
}
|
||||
|
||||
openLogout() {
|
||||
this.shadowRoot.getElementById('userLogoutDialog').open()
|
||||
}
|
||||
constructor() {
|
||||
super()
|
||||
this.theme = localStorage.getItem('qortalTheme') ? localStorage.getItem('qortalTheme') : 'light'
|
||||
}
|
||||
|
||||
async confirm(e) {
|
||||
store.dispatch(doLogout())
|
||||
e.stopPropagation()
|
||||
}
|
||||
render() {
|
||||
return html`
|
||||
<paper-dialog style="background: var(--white);" id="userLogoutDialog" modal>
|
||||
<div style="text-align: center;">
|
||||
<h2 style="color: var(--black);">Qortal UI</h2>
|
||||
<hr>
|
||||
</div>
|
||||
<div style="text-align: center;">
|
||||
<h2 style="color: var(--black);">${translate("logout.confirmlogout")}</h2>
|
||||
</div>
|
||||
<div class="buttons">
|
||||
<mwc-button class='decline' @click=${e => this.decline(e)} dialog-dismiss>${translate("general.no")}</mwc-button>
|
||||
<mwc-button class='confirm' @click=${e => this.confirm(e)} dialog-confirm autofocus>${translate("general.yes")}</mwc-button>
|
||||
</div>
|
||||
</paper-dialog>
|
||||
`
|
||||
}
|
||||
|
||||
decline() {
|
||||
this.shadowRoot.getElementById('userLogoutDialog').close()
|
||||
this.requestUpdate()
|
||||
}
|
||||
openLogout() {
|
||||
this.shadowRoot.getElementById('userLogoutDialog').open()
|
||||
}
|
||||
|
||||
async confirm(e) {
|
||||
store.dispatch(doLogout())
|
||||
}
|
||||
|
||||
decline(e) {
|
||||
this.shadowRoot.getElementById('userLogoutDialog').close()
|
||||
}
|
||||
}
|
||||
|
||||
window.customElements.define('logout-view', LogoutView)
|
||||
window.customElements.define('logout-view', LogoutView)
|
||||
|
@ -1,66 +1,77 @@
|
||||
import { html, LitElement } from 'lit'
|
||||
import { LitElement, html } from 'lit'
|
||||
import { installRouter } from 'pwa-helpers/router.js'
|
||||
import { connect } from 'pwa-helpers'
|
||||
import { store } from '../store'
|
||||
import { installRouter } from 'pwa-helpers/router'
|
||||
import { doNavigate } from '../redux/app/app-actions'
|
||||
import { loadPlugins } from '../plugins/load-plugins'
|
||||
import { store } from '../store.js'
|
||||
import { doNavigate } from '../redux/app/app-actions.js'
|
||||
import isElectron from 'is-electron'
|
||||
import './login-view/login-view'
|
||||
import './app-view'
|
||||
import '../plugins/streams'
|
||||
import '../styles/app-styles'
|
||||
import '../plugins/streams.js'
|
||||
|
||||
import { loadPlugins } from '../plugins/load-plugins.js'
|
||||
|
||||
import '../styles/app-styles.js'
|
||||
import './login-view/login-view.js'
|
||||
import './app-view.js'
|
||||
|
||||
installRouter((location) => store.dispatch(doNavigate(location)))
|
||||
|
||||
class MainApp extends connect(store)(LitElement) {
|
||||
static get properties() {
|
||||
return {
|
||||
name: { type: String },
|
||||
loggedIn: { type: Boolean }
|
||||
}
|
||||
}
|
||||
static get properties() {
|
||||
return {
|
||||
name: { type: String },
|
||||
loggedIn: { type: Boolean }
|
||||
}
|
||||
}
|
||||
|
||||
render() {
|
||||
return html`${this.renderViews(this.loggedIn)}`
|
||||
}
|
||||
static get styles() {
|
||||
return []
|
||||
}
|
||||
|
||||
connectedCallback() {
|
||||
super.connectedCallback()
|
||||
this.initial = 0
|
||||
render() {
|
||||
return html`${this.renderViews(this.loggedIn)}`
|
||||
}
|
||||
|
||||
if (!isElectron()) {
|
||||
} else {
|
||||
window.addEventListener('contextmenu', (event) => {
|
||||
event.preventDefault()
|
||||
window.electronAPI.showMyMenu()
|
||||
})
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Dynamic renderViews method to introduce conditional rendering of views based on user's logged in state.
|
||||
* @param {Boolean} isLoggedIn
|
||||
*/
|
||||
|
||||
/**
|
||||
* Dynamic renderViews method to introduce conditional rendering of views based on user's logged in state.
|
||||
* @param {Boolean} isLoggedIn
|
||||
*/
|
||||
renderViews(isLoggedIn) {
|
||||
if (isLoggedIn) {
|
||||
return html`<app-view></app-view>`
|
||||
} else {
|
||||
return html`<login-view></login-view>`
|
||||
}
|
||||
}
|
||||
renderViews(isLoggedIn) {
|
||||
if (isLoggedIn) {
|
||||
return html`
|
||||
<app-view></app-view>
|
||||
`
|
||||
} else {
|
||||
return html`
|
||||
<login-view></login-view>
|
||||
`
|
||||
}
|
||||
}
|
||||
|
||||
_loadPlugins() {
|
||||
loadPlugins()
|
||||
}
|
||||
stateChanged(state) {
|
||||
this.loggedIn = state.app.loggedIn
|
||||
if (this.loggedIn === true && this.initial === 0) {
|
||||
this.initial = this.initial + 1
|
||||
this._loadPlugins()
|
||||
}
|
||||
document.title = state.config.coin.name
|
||||
}
|
||||
|
||||
stateChanged(state) {
|
||||
this.loggedIn = state.app.loggedIn
|
||||
if (this.loggedIn === true && this.initial === 0) {
|
||||
this.initial = this.initial + 1
|
||||
this._loadPlugins()
|
||||
}
|
||||
document.title = state.config.coin.name
|
||||
}
|
||||
_loadPlugins() {
|
||||
loadPlugins()
|
||||
}
|
||||
|
||||
connectedCallback() {
|
||||
super.connectedCallback()
|
||||
this.initial = 0
|
||||
|
||||
if (!isElectron()) {
|
||||
} else {
|
||||
window.addEventListener('contextmenu', (event) => {
|
||||
event.preventDefault()
|
||||
window.electronAPI.showMyMenu()
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
window.customElements.define('main-app', MainApp)
|
||||
window.customElements.define('main-app', MainApp)
|
||||
|
@ -1,114 +0,0 @@
|
||||
import { html, LitElement } from 'lit'
|
||||
import { newSelectorStyles } from '../styles/core-css'
|
||||
|
||||
// Multi language support
|
||||
import { registerTranslateConfig, translate, use } from '../../translate'
|
||||
|
||||
registerTranslateConfig({
|
||||
loader: lang => fetch(`/language/${lang}.json`).then(res => res.json())
|
||||
})
|
||||
|
||||
const checkLanguage = localStorage.getItem('qortalLanguage')
|
||||
|
||||
if (checkLanguage === null || checkLanguage.length === 0) {
|
||||
localStorage.setItem('qortalLanguage', 'us')
|
||||
use('us')
|
||||
} else {
|
||||
use(checkLanguage)
|
||||
}
|
||||
|
||||
class NewSelector extends LitElement {
|
||||
static get properties() {
|
||||
return {
|
||||
theme: { type: String, reflect: true }
|
||||
}
|
||||
}
|
||||
|
||||
static get styles() {
|
||||
return [newSelectorStyles]
|
||||
}
|
||||
|
||||
constructor() {
|
||||
super()
|
||||
this.theme = localStorage.getItem('qortalTheme') ? localStorage.getItem('qortalTheme') : 'light'
|
||||
}
|
||||
|
||||
render() {
|
||||
return html`
|
||||
<div style="display: inline;">
|
||||
<span>
|
||||
<img src="/img/${translate("selectmenu.languageflag")}-flag-round-icon-32.png" style="width: 24px; height: 24px; padding-top: 4px;" @click=${() => this.toggleMenu()}>
|
||||
</span>
|
||||
<select id="languageNew" style="display: none;" size="20" tabindex="0" @change="${this.changeLanguage}">
|
||||
<option value="us">US - ${translate("selectmenu.english")}</option>
|
||||
<option value="de">DE - ${translate("selectmenu.german")}</option>
|
||||
<option value="es">ES - ${translate("selectmenu.spanish")}</option>
|
||||
<option value="et">ET - ${translate("selectmenu.estonian")}</option>
|
||||
<option value="fi">FI - ${translate("selectmenu.finnish")}</option>
|
||||
<option value="fr">FR - ${translate("selectmenu.french")}</option>
|
||||
<option value="hr">HR - ${translate("selectmenu.croatian")}</option>
|
||||
<option value="hu">HU - ${translate("selectmenu.hungarian")}</option>
|
||||
<option value="hindi">IN - ${translate("selectmenu.hindi")}</option>
|
||||
<option value="it">IT - ${translate("selectmenu.italian")}</option>
|
||||
<option value="jp">JP - ${translate("selectmenu.japanese")}</option>
|
||||
<option value="ko">KO - ${translate("selectmenu.korean")}</option>
|
||||
<option value="nl">NL - ${translate("selectmenu.dutch")}</option>
|
||||
<option value="no">NO - ${translate("selectmenu.norwegian")}</option>
|
||||
<option value="pl">PL - ${translate("selectmenu.polish")}</option>
|
||||
<option value="pt">PT - ${translate("selectmenu.portuguese")}</option>
|
||||
<option value="rs">RS - ${translate("selectmenu.serbian")}</option>
|
||||
<option value="ro">RO - ${translate("selectmenu.romanian")}</option>
|
||||
<option value="ru">RU - ${translate("selectmenu.russian")}</option>
|
||||
<option value="zht">ZHT - ${translate("selectmenu.chinese2")}</option>
|
||||
<option value="zhc">ZHC - ${translate("selectmenu.chinese1")}</option>
|
||||
</select>
|
||||
</div>
|
||||
|
||||
`
|
||||
}
|
||||
|
||||
firstUpdated() {
|
||||
const myElement = this.shadowRoot.getElementById('languageNew')
|
||||
|
||||
myElement.addEventListener('change', () => {
|
||||
this.selectElement()
|
||||
})
|
||||
|
||||
myElement.addEventListener('click', () => {
|
||||
const element1 = localStorage.getItem('qortalLanguage')
|
||||
const element2 = this.shadowRoot.getElementById('languageNew').value
|
||||
|
||||
if (element1 === element2) {
|
||||
myElement.style.display = 'none'
|
||||
}
|
||||
})
|
||||
|
||||
this.selectElement()
|
||||
}
|
||||
|
||||
selectElement() {
|
||||
const selectedLanguage = localStorage.getItem('qortalLanguage')
|
||||
|
||||
let element = this.shadowRoot.getElementById('languageNew')
|
||||
|
||||
element.value = selectedLanguage
|
||||
element.style.display = 'none'
|
||||
}
|
||||
|
||||
changeLanguage(event) {
|
||||
use(event.target.value)
|
||||
localStorage.setItem('qortalLanguage', event.target.value)
|
||||
}
|
||||
|
||||
toggleMenu() {
|
||||
let mySwitchDisplay = this.shadowRoot.getElementById('languageNew')
|
||||
|
||||
if (mySwitchDisplay.style.display == 'none') {
|
||||
mySwitchDisplay.style.display = 'block'
|
||||
} else {
|
||||
mySwitchDisplay.style.display = 'none'
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
window.customElements.define('new-selector', NewSelector)
|
@ -1,128 +1,73 @@
|
||||
import { html, LitElement } from 'lit'
|
||||
import { repeat } from 'lit/directives/repeat.js'
|
||||
import { connect } from 'pwa-helpers'
|
||||
import { store } from '../../store'
|
||||
import { setNewNotification } from '../../redux/app/app-actions'
|
||||
import { notificationBellGeneralStyles, notificationItemTxStyles } from '../../styles/core-css'
|
||||
import './popover.js'
|
||||
import '../../../../plugins/plugins/core/components/TimeAgo'
|
||||
import '@material/mwc-icon'
|
||||
import '@polymer/paper-icon-button/paper-icon-button.js'
|
||||
import '@polymer/iron-icons/iron-icons.js'
|
||||
import '@vaadin/item'
|
||||
import '@vaadin/list-box'
|
||||
import { LitElement, html, css } from 'lit';
|
||||
import { connect } from 'pwa-helpers';
|
||||
|
||||
import '@vaadin/item';
|
||||
import '@vaadin/list-box';
|
||||
import '@polymer/paper-icon-button/paper-icon-button.js';
|
||||
import '@polymer/iron-icons/iron-icons.js';
|
||||
import { store } from '../../store.js';
|
||||
import { setNewNotification, setNewTab } from '../../redux/app/app-actions.js';
|
||||
import { routes } from '../../plugins/routes.js';
|
||||
import '@material/mwc-icon';
|
||||
import { translate, get } from 'lit-translate';
|
||||
import { repeat } from 'lit/directives/repeat.js';
|
||||
|
||||
import config from '../../notifications/config.js';
|
||||
import '../../../../plugins/plugins/core/components/TimeAgo.js';
|
||||
import './popover.js';
|
||||
|
||||
|
||||
|
||||
// Multi language support
|
||||
import { get, translate } from '../../../translate'
|
||||
|
||||
class NotificationBellGeneral extends connect(store)(LitElement) {
|
||||
static get properties() {
|
||||
return {
|
||||
notifications: { type: Array },
|
||||
showNotifications: { type: Boolean },
|
||||
notificationCount: { type: Boolean },
|
||||
currentNotification: { type: Object },
|
||||
theme: { type: String, reflect: true }
|
||||
}
|
||||
}
|
||||
|
||||
static get styles() {
|
||||
return [notificationBellGeneralStyles]
|
||||
}
|
||||
static properties = {
|
||||
notifications: { type: Array },
|
||||
showNotifications: { type: Boolean },
|
||||
notificationCount: { type: Boolean },
|
||||
theme: { type: String, reflect: true },
|
||||
notifications: { type: Array },
|
||||
currentNotification: { type: Object },
|
||||
};
|
||||
|
||||
constructor() {
|
||||
super()
|
||||
this.notifications = []
|
||||
this.showNotifications = false
|
||||
this.notificationCount = false
|
||||
this.initialFetch = false
|
||||
this.currentNotification = null
|
||||
this.theme = localStorage.getItem('qortalTheme') ? localStorage.getItem('qortalTheme') : 'light'
|
||||
}
|
||||
|
||||
render() {
|
||||
const hasOngoing = this.notifications.find(
|
||||
(notification) => notification.status !== 'confirmed'
|
||||
)
|
||||
|
||||
return html`
|
||||
<div class="layout">
|
||||
<popover-component for="popover-notification" message=${get('notifications.explanation')}></popover-component>
|
||||
<div id="popover-notification" @click=${() => this._toggleNotifications()}>
|
||||
${hasOngoing ? html`
|
||||
<mwc-icon id="notification-general-icon" style="color: green;cursor:pointer;user-select:none">notifications</mwc-icon>
|
||||
<vaadin-tooltip for="notification-general-icon" position="bottom" hover-delay=${400} hide-delay=${1} text=${get('notifications.notify4')}></vaadin-tooltip>
|
||||
` : html`
|
||||
<mwc-icon id="notification-general-icon" style="color: var(--black); cursor:pointer;user-select:none">notifications</mwc-icon>
|
||||
<vaadin-tooltip for="notification-general-icon" position="bottom" hover-delay=${400} hide-delay=${1}text=${get('notifications.notify4')}></vaadin-tooltip>
|
||||
`}
|
||||
</div>
|
||||
${hasOngoing ? html`
|
||||
<span class="count" style="cursor:pointer" @click=${() => this._toggleNotifications()}>
|
||||
<mwc-icon style="color: var(--black);font-size:18px">pending</mwc-icon>
|
||||
</span>
|
||||
` : ''}
|
||||
<div id="notification-panel" class="popover-panel" style="visibility:${this.showNotifications ? 'visibile' : 'hidden'}" tabindex="0" @blur=${this.handleBlur}>
|
||||
<div class="notifications-list">
|
||||
${this.notifications.length === 0 ? html`
|
||||
<p style="font-size: 16px; width: 100%; text-align:center;margin-top:20px;">${translate('notifications.notify3')}</p>
|
||||
` : ''}
|
||||
${repeat(
|
||||
this.notifications,
|
||||
(notification) => notification.reference.signature, // key function
|
||||
(notification) => html`
|
||||
<notification-item-tx
|
||||
.changeStatus=${(val1, val2) =>
|
||||
this.changeStatus(val1, val2)}
|
||||
status=${notification.status}
|
||||
timestamp=${notification.timestamp}
|
||||
type=${notification.type}
|
||||
signature=${notification.reference
|
||||
.signature
|
||||
}
|
||||
></notification-item-tx>
|
||||
`
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
`
|
||||
super();
|
||||
this.notifications = [];
|
||||
this.showNotifications = false;
|
||||
this.notificationCount = false;
|
||||
this.initialFetch = false;
|
||||
this.theme = localStorage.getItem('qortalTheme')
|
||||
? localStorage.getItem('qortalTheme')
|
||||
: 'light';
|
||||
this.currentNotification = null;
|
||||
}
|
||||
|
||||
firstUpdated() {
|
||||
try {
|
||||
let value = JSON.parse(localStorage.getItem('isFirstTimeUser'))
|
||||
|
||||
let value = JSON.parse(localStorage.getItem('isFirstTimeUser'));
|
||||
if (!value && value !== false) {
|
||||
value = true
|
||||
value = true;
|
||||
}
|
||||
|
||||
this.isFirstTimeUser = value
|
||||
} catch (error) { }
|
||||
this.isFirstTimeUser = value;
|
||||
} catch (error) {}
|
||||
}
|
||||
|
||||
async stateChanged(state) {
|
||||
if (state.app.newNotification) {
|
||||
const newNotification = state.app.newNotification
|
||||
|
||||
this.notifications = [newNotification, ...this.notifications]
|
||||
|
||||
store.dispatch(setNewNotification(null))
|
||||
|
||||
const newNotification = state.app.newNotification;
|
||||
this.notifications = [newNotification, ...this.notifications];
|
||||
store.dispatch(setNewNotification(null));
|
||||
if (this.isFirstTimeUser) {
|
||||
const target = this.shadowRoot.getElementById(
|
||||
'popover-notification'
|
||||
)
|
||||
|
||||
const popover = this.shadowRoot.querySelector('popover-component')
|
||||
|
||||
);
|
||||
const popover =
|
||||
this.shadowRoot.querySelector('popover-component');
|
||||
if (popover) {
|
||||
popover.openPopover(target)
|
||||
popover.openPopover(target);
|
||||
}
|
||||
|
||||
localStorage.setItem('isFirstTimeUser', JSON.stringify(false))
|
||||
|
||||
this.isFirstTimeUser = false
|
||||
localStorage.setItem('isFirstTimeUser', JSON.stringify(false));
|
||||
this.isFirstTimeUser = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -130,29 +75,101 @@ class NotificationBellGeneral extends connect(store)(LitElement) {
|
||||
handleBlur() {
|
||||
setTimeout(() => {
|
||||
if (!this.shadowRoot.contains(document.activeElement)) {
|
||||
this.showNotifications = false
|
||||
this.showNotifications = false;
|
||||
}
|
||||
}, 0)
|
||||
}, 0);
|
||||
}
|
||||
|
||||
changeStatus(signature, statusTx) {
|
||||
const copyNotifications = [...this.notifications]
|
||||
|
||||
const copyNotifications = [...this.notifications];
|
||||
const findNotification = this.notifications.findIndex(
|
||||
(notification) => notification.reference.signature === signature
|
||||
)
|
||||
|
||||
);
|
||||
if (findNotification !== -1) {
|
||||
copyNotifications[findNotification] = {
|
||||
...copyNotifications[findNotification],
|
||||
status: statusTx
|
||||
}
|
||||
|
||||
this.notifications = copyNotifications
|
||||
status: statusTx,
|
||||
};
|
||||
this.notifications = copyNotifications;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
render() {
|
||||
const hasOngoing = this.notifications.find(
|
||||
(notification) => notification.status !== 'confirmed'
|
||||
);
|
||||
return html`
|
||||
<div class="layout">
|
||||
<popover-component
|
||||
for="popover-notification"
|
||||
message=${get('notifications.explanation')}
|
||||
></popover-component>
|
||||
<div
|
||||
id="popover-notification"
|
||||
@click=${() => this._toggleNotifications()}
|
||||
>
|
||||
${hasOngoing
|
||||
? html`
|
||||
<mwc-icon style="color: green;cursor:pointer"
|
||||
>notifications</mwc-icon
|
||||
>
|
||||
`
|
||||
: html`
|
||||
<mwc-icon
|
||||
style="color: var(--black); cursor:pointer"
|
||||
>notifications</mwc-icon
|
||||
>
|
||||
`}
|
||||
</div>
|
||||
${hasOngoing
|
||||
? html`
|
||||
<span
|
||||
class="count"
|
||||
style="cursor:pointer"
|
||||
@click=${() => this._toggleNotifications()}
|
||||
>
|
||||
<mwc-icon
|
||||
style="color: var(--black);font-size:18px"
|
||||
>pending</mwc-icon
|
||||
>
|
||||
</span>
|
||||
`
|
||||
: ''}
|
||||
|
||||
<div
|
||||
id="notification-panel"
|
||||
class="popover-panel"
|
||||
style="visibility:${this.showNotifications
|
||||
? 'visibile'
|
||||
: 'hidden'}"
|
||||
tabindex="0"
|
||||
@blur=${this.handleBlur}
|
||||
>
|
||||
<div class="notifications-list">
|
||||
${repeat(
|
||||
this.notifications,
|
||||
(notification) => notification.reference.signature, // key function
|
||||
(notification) => html`
|
||||
<notification-item-tx
|
||||
.changeStatus=${(val1, val2) =>
|
||||
this.changeStatus(val1, val2)}
|
||||
status=${notification.status}
|
||||
timestamp=${notification.timestamp}
|
||||
type=${notification.type}
|
||||
signature=${notification.reference
|
||||
.signature}
|
||||
></notification-item-tx>
|
||||
`
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
`;
|
||||
}
|
||||
|
||||
_toggleNotifications() {
|
||||
if (this.notifications.length === 0) return;
|
||||
this.showNotifications = !this.showNotifications;
|
||||
if (this.showNotifications) {
|
||||
requestAnimationFrame(() => {
|
||||
@ -160,34 +177,160 @@ class NotificationBellGeneral extends connect(store)(LitElement) {
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
static styles = css`
|
||||
.layout {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
position: relative;
|
||||
margin-right: 20px;
|
||||
}
|
||||
|
||||
.count {
|
||||
position: absolute;
|
||||
top: -5px;
|
||||
right: -5px;
|
||||
font-size: 12px;
|
||||
background-color: red;
|
||||
color: white;
|
||||
border-radius: 50%;
|
||||
width: 16px;
|
||||
height: 16px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
.nocount {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.popover-panel {
|
||||
position: absolute;
|
||||
width: 200px;
|
||||
padding: 10px;
|
||||
background-color: var(--white);
|
||||
border: 1px solid var(--black);
|
||||
border-radius: 4px;
|
||||
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
|
||||
top: 40px;
|
||||
max-height: 350px;
|
||||
overflow: auto;
|
||||
scrollbar-width: thin;
|
||||
scrollbar-color: #6a6c75 #a1a1a1;
|
||||
}
|
||||
|
||||
.popover-panel::-webkit-scrollbar {
|
||||
width: 11px;
|
||||
}
|
||||
|
||||
.popover-panel::-webkit-scrollbar-track {
|
||||
background: #a1a1a1;
|
||||
}
|
||||
|
||||
.popover-panel::-webkit-scrollbar-thumb {
|
||||
background-color: #6a6c75;
|
||||
border-radius: 6px;
|
||||
border: 3px solid #a1a1a1;
|
||||
}
|
||||
|
||||
.notifications-list {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
.notification-item {
|
||||
padding: 5px;
|
||||
border-bottom: 1px solid;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
cursor: pointer;
|
||||
transition: 0.2s all;
|
||||
}
|
||||
|
||||
.notification-item:hover {
|
||||
background: var(--nav-color-hover);
|
||||
}
|
||||
|
||||
p {
|
||||
font-size: 14px;
|
||||
color: var(--black);
|
||||
margin: 0px;
|
||||
padding: 0px;
|
||||
}
|
||||
`;
|
||||
}
|
||||
|
||||
window.customElements.define('notification-bell-general', NotificationBellGeneral)
|
||||
customElements.define('notification-bell-general', NotificationBellGeneral);
|
||||
|
||||
class NotificationItemTx extends connect(store)(LitElement) {
|
||||
static get properties() {
|
||||
return {
|
||||
status: { type: String },
|
||||
type: { type: String },
|
||||
timestamp: { type: Number },
|
||||
signature: { type: String },
|
||||
changeStatus: { attribute: false }
|
||||
}
|
||||
}
|
||||
|
||||
static get styles() {
|
||||
return [notificationItemTxStyles]
|
||||
}
|
||||
static properties = {
|
||||
status: { type: String },
|
||||
type: { type: String },
|
||||
timestamp: { type: Number },
|
||||
signature: { type: String },
|
||||
changeStatus: { attribute: false },
|
||||
};
|
||||
|
||||
constructor() {
|
||||
super()
|
||||
this.nodeUrl = this.getNodeUrl()
|
||||
this.myNode = this.getMyNode()
|
||||
super();
|
||||
this.nodeUrl = this.getNodeUrl();
|
||||
this.myNode = this.getMyNode();
|
||||
}
|
||||
|
||||
getNodeUrl() {
|
||||
const myNode =
|
||||
store.getState().app.nodeConfig.knownNodes[
|
||||
window.parent.reduxStore.getState().app.nodeConfig.node
|
||||
];
|
||||
|
||||
const nodeUrl =
|
||||
myNode.protocol + '://' + myNode.domain + ':' + myNode.port;
|
||||
return nodeUrl;
|
||||
}
|
||||
getMyNode() {
|
||||
const myNode =
|
||||
store.getState().app.nodeConfig.knownNodes[
|
||||
window.parent.reduxStore.getState().app.nodeConfig.node
|
||||
];
|
||||
|
||||
return myNode;
|
||||
}
|
||||
|
||||
async getStatus() {
|
||||
let interval = null;
|
||||
let stop = false;
|
||||
const getAnswer = async () => {
|
||||
const getTx = async (minterAddr) => {
|
||||
const url = `${this.nodeUrl}/transactions/signature/${this.signature}`;
|
||||
const res = await fetch(url);
|
||||
const data = await res.json();
|
||||
return data;
|
||||
};
|
||||
|
||||
if (!stop) {
|
||||
stop = true;
|
||||
try {
|
||||
const txTransaction = await getTx();
|
||||
if (!txTransaction.error && txTransaction.signature && txTransaction.blockHeight) {
|
||||
clearInterval(interval);
|
||||
this.changeStatus(this.signature, 'confirmed');
|
||||
}
|
||||
} catch (error) {}
|
||||
stop = false;
|
||||
}
|
||||
};
|
||||
interval = setInterval(getAnswer, 20000);
|
||||
}
|
||||
|
||||
firstUpdated() {
|
||||
this.getStatus();
|
||||
}
|
||||
|
||||
render() {
|
||||
return html`
|
||||
<div class="notification-item" @click=${() => { }}>
|
||||
<div class="notification-item" @click=${() => {}}>
|
||||
<div>
|
||||
<p style="margin-bottom:10px; font-weight:bold">
|
||||
${translate('transpage.tchange1')}
|
||||
@ -198,66 +341,187 @@ class NotificationItemTx extends connect(store)(LitElement) {
|
||||
${translate('walletpage.wchange35')}: ${this.type}
|
||||
</p>
|
||||
<p style="margin-bottom:5px">
|
||||
${translate('tubespage.schange28')}: ${this.status === 'confirming' ? translate('notifications.notify1') : translate('notifications.notify2')}
|
||||
${translate('tubespage.schange28')}:
|
||||
${this.status === 'confirming'
|
||||
? translate('notifications.notify1')
|
||||
: translate('notifications.notify2')}
|
||||
</p>
|
||||
${this.status !== 'confirmed' ? html`<div class="centered"><div class="loader">Loading...</div></div>` : ''}
|
||||
<div style="display:flex;justify-content:space-between;align-items:center">
|
||||
<message-time timestamp=${this.timestamp} style="color:red;font-size:12px"></message-time>
|
||||
${this.status === 'confirmed' ? html`<mwc-icon style="color: green;">done</mwc-icon>` : ''}
|
||||
${this.status !== 'confirmed'
|
||||
? html`
|
||||
<div class="centered">
|
||||
<div class="loader">Loading...</div>
|
||||
</div>
|
||||
`
|
||||
: ''}
|
||||
<div
|
||||
style="display:flex;justify-content:space-between;align-items:center"
|
||||
>
|
||||
<message-time
|
||||
timestamp=${this.timestamp}
|
||||
style="color:red;font-size:12px"
|
||||
></message-time>
|
||||
${this.status === 'confirmed'
|
||||
? html`
|
||||
<mwc-icon style="color: green;"
|
||||
>done</mwc-icon
|
||||
>
|
||||
`
|
||||
: ''}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
`
|
||||
}
|
||||
|
||||
firstUpdated() {
|
||||
this.getStatus()
|
||||
}
|
||||
|
||||
getNodeUrl() {
|
||||
const myNode = store.getState().app.nodeConfig.knownNodes[store.getState().app.nodeConfig.node]
|
||||
return myNode.protocol + '://' + myNode.domain + ':' + myNode.port
|
||||
}
|
||||
|
||||
getMyNode() {
|
||||
return store.getState().app.nodeConfig.knownNodes[store.getState().app.nodeConfig.node]
|
||||
}
|
||||
|
||||
async getStatus() {
|
||||
let interval = null
|
||||
let stop = false
|
||||
|
||||
const getAnswer = async () => {
|
||||
const getTx = async (minterAddr) => {
|
||||
const url = `${this.nodeUrl}/transactions/signature/${this.signature}`
|
||||
const res = await fetch(url)
|
||||
|
||||
return await res.json()
|
||||
}
|
||||
|
||||
if (!stop) {
|
||||
stop = true
|
||||
|
||||
try {
|
||||
const txTransaction = await getTx()
|
||||
|
||||
if (!txTransaction.error && txTransaction.signature && txTransaction.blockHeight) {
|
||||
clearInterval(interval)
|
||||
this.changeStatus(this.signature, 'confirmed')
|
||||
}
|
||||
} catch (error) { }
|
||||
|
||||
stop = false
|
||||
}
|
||||
}
|
||||
|
||||
interval = setInterval(getAnswer, 20000)
|
||||
`;
|
||||
}
|
||||
|
||||
_toggleNotifications() {
|
||||
if (this.notifications.length === 0) return
|
||||
this.showNotifications = !this.showNotifications
|
||||
if (this.notifications.length === 0) return;
|
||||
this.showNotifications = !this.showNotifications;
|
||||
}
|
||||
|
||||
static styles = css`
|
||||
.centered {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
}
|
||||
.layout {
|
||||
width: 100px;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.count {
|
||||
position: absolute;
|
||||
top: -5px;
|
||||
right: -5px;
|
||||
font-size: 12px;
|
||||
background-color: red;
|
||||
color: white;
|
||||
border-radius: 50%;
|
||||
width: 16px;
|
||||
height: 16px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
.nocount {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.popover-panel {
|
||||
position: absolute;
|
||||
width: 200px;
|
||||
padding: 10px;
|
||||
background-color: var(--white);
|
||||
border: 1px solid var(--black);
|
||||
border-radius: 4px;
|
||||
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
|
||||
top: 40px;
|
||||
max-height: 350px;
|
||||
overflow: auto;
|
||||
scrollbar-width: thin;
|
||||
scrollbar-color: #6a6c75 #a1a1a1;
|
||||
}
|
||||
|
||||
.popover-panel::-webkit-scrollbar {
|
||||
width: 11px;
|
||||
}
|
||||
|
||||
.popover-panel::-webkit-scrollbar-track {
|
||||
background: #a1a1a1;
|
||||
}
|
||||
|
||||
.popover-panel::-webkit-scrollbar-thumb {
|
||||
background-color: #6a6c75;
|
||||
border-radius: 6px;
|
||||
border: 3px solid #a1a1a1;
|
||||
}
|
||||
|
||||
.notifications-list {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
.notification-item {
|
||||
padding: 5px;
|
||||
border-bottom: 1px solid;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
cursor: default;
|
||||
}
|
||||
|
||||
.notification-item:hover {
|
||||
background: var(--nav-color-hover);
|
||||
}
|
||||
|
||||
p {
|
||||
font-size: 14px;
|
||||
color: var(--black);
|
||||
margin: 0px;
|
||||
padding: 0px;
|
||||
}
|
||||
|
||||
.loader,
|
||||
.loader:before,
|
||||
.loader:after {
|
||||
border-radius: 50%;
|
||||
width: 10px;
|
||||
height: 10px;
|
||||
-webkit-animation-fill-mode: both;
|
||||
animation-fill-mode: both;
|
||||
-webkit-animation: load7 1.8s infinite ease-in-out;
|
||||
animation: load7 1.8s infinite ease-in-out;
|
||||
}
|
||||
.loader {
|
||||
color: var(--black);
|
||||
font-size: 5px;
|
||||
margin-bottom: 20px;
|
||||
position: relative;
|
||||
text-indent: -9999em;
|
||||
-webkit-transform: translateZ(0);
|
||||
-ms-transform: translateZ(0);
|
||||
transform: translateZ(0);
|
||||
-webkit-animation-delay: -0.16s;
|
||||
animation-delay: -0.16s;
|
||||
}
|
||||
.loader:before,
|
||||
.loader:after {
|
||||
content: '';
|
||||
position: absolute;
|
||||
top: 0;
|
||||
}
|
||||
.loader:before {
|
||||
left: -3.5em;
|
||||
-webkit-animation-delay: -0.32s;
|
||||
animation-delay: -0.32s;
|
||||
}
|
||||
.loader:after {
|
||||
left: 3.5em;
|
||||
}
|
||||
@-webkit-keyframes load7 {
|
||||
0%,
|
||||
80%,
|
||||
100% {
|
||||
box-shadow: 0 2.5em 0 -1.3em;
|
||||
}
|
||||
40% {
|
||||
box-shadow: 0 2.5em 0 0;
|
||||
}
|
||||
}
|
||||
@keyframes load7 {
|
||||
0%,
|
||||
80%,
|
||||
100% {
|
||||
box-shadow: 0 2.5em 0 -1.3em;
|
||||
}
|
||||
40% {
|
||||
box-shadow: 0 2.5em 0 0;
|
||||
}
|
||||
}
|
||||
`;
|
||||
}
|
||||
|
||||
window.customElements.define('notification-item-tx', NotificationItemTx)
|
||||
customElements.define('notification-item-tx', NotificationItemTx);
|
||||
|
@ -1,262 +1,294 @@
|
||||
import { css, html, LitElement } from 'lit'
|
||||
import { LitElement, html, css } from 'lit'
|
||||
import { connect } from 'pwa-helpers'
|
||||
import { store } from '../../store'
|
||||
import { setNewTab } from '../../redux/app/app-actions'
|
||||
import { routes } from '../../plugins/routes'
|
||||
import { notificationBellStyles } from '../../styles/core-css'
|
||||
import config from '../../notifications/config'
|
||||
import '../../../../plugins/plugins/core/components/TimeAgo'
|
||||
import '@material/mwc-icon'
|
||||
import '@polymer/paper-icon-button/paper-icon-button'
|
||||
import '@polymer/iron-icons/iron-icons.js'
|
||||
|
||||
import '@vaadin/item'
|
||||
import '@vaadin/list-box'
|
||||
import '@polymer/paper-icon-button/paper-icon-button.js'
|
||||
import '@polymer/iron-icons/iron-icons.js'
|
||||
import { store } from '../../store.js'
|
||||
import { setNewTab } from '../../redux/app/app-actions.js'
|
||||
import { routes } from '../../plugins/routes.js'
|
||||
import config from '../../notifications/config.js'
|
||||
import '../../../../plugins/plugins/core/components/TimeAgo.js'
|
||||
|
||||
class NotificationBell extends connect(store)(LitElement) {
|
||||
static get properties() {
|
||||
return {
|
||||
notifications: { type: Array },
|
||||
showNotifications: { type: Boolean },
|
||||
notificationCount: { type: Boolean },
|
||||
theme: { type: String, reflect: true }
|
||||
}
|
||||
}
|
||||
|
||||
static get styles() {
|
||||
return [notificationBellStyles]
|
||||
}
|
||||
static properties = {
|
||||
notifications: { type: Array },
|
||||
showNotifications: { type: Boolean },
|
||||
notificationCount: { type: Boolean },
|
||||
theme: { type: String, reflect: true },
|
||||
}
|
||||
|
||||
constructor() {
|
||||
super()
|
||||
this.notifications = []
|
||||
this.showNotifications = false
|
||||
this.notificationCount = false
|
||||
this.initialFetch = false
|
||||
this.theme = localStorage.getItem('qortalTheme') ? localStorage.getItem('qortalTheme') : 'light'
|
||||
}
|
||||
constructor() {
|
||||
super()
|
||||
this.notifications = []
|
||||
this.showNotifications = false
|
||||
this.notificationCount = false
|
||||
this.initialFetch = false
|
||||
this.theme = localStorage.getItem('qortalTheme') ? localStorage.getItem('qortalTheme') : 'light'
|
||||
}
|
||||
|
||||
render() {
|
||||
return html`
|
||||
<div class="layout">
|
||||
${this.notificationCount ? html`
|
||||
<mwc-icon @click=${() => this._toggleNotifications()} id="notification-mail-icon" style="color: green;cursor:pointer;user-select:none">
|
||||
mail
|
||||
</mwc-icon>
|
||||
<vaadin-tooltip
|
||||
for="notification-mail-icon"
|
||||
position="bottom"
|
||||
hover-delay=${400}
|
||||
hide-delay=${1}
|
||||
text="Q-Mail">
|
||||
</vaadin-tooltip>
|
||||
` : html`
|
||||
<mwc-icon @click=${() => this._openTabQmail()} id="notification-mail-icon" style="color: var(--black); cursor:pointer;user-select:none">
|
||||
mail
|
||||
</mwc-icon>
|
||||
<vaadin-tooltip
|
||||
for="notification-mail-icon"
|
||||
position="bottom"
|
||||
hover-delay=${400}
|
||||
hide-delay=${1}
|
||||
text="Q-Mail">
|
||||
</vaadin-tooltip>
|
||||
`}
|
||||
${this.notificationCount ? html`
|
||||
<span class="count">${this.notifications.length}</span>
|
||||
` : ''}
|
||||
<div class="popover-panel" ?hidden=${!this.showNotifications}>
|
||||
<div class="notifications-list">
|
||||
${this.notifications.map(notification => html`
|
||||
<div
|
||||
class="notification-item"
|
||||
@click=${() => {
|
||||
const query = `?service=APP&name=Q-Mail`
|
||||
store.dispatch(setNewTab({
|
||||
url: `qdn/browser/index.html${query}`,
|
||||
id: 'q-mail-notification',
|
||||
myPlugObj: {
|
||||
"url": "myapp",
|
||||
"domain": "core",
|
||||
"page": `qdn/browser/index.html${query}`,
|
||||
"title": "Q-Mail",
|
||||
"icon": "vaadin:mailbox",
|
||||
"mwcicon": "mail_outline",
|
||||
"menus": [],
|
||||
"parent": false
|
||||
}
|
||||
}))
|
||||
this.showNotifications = false
|
||||
this.notifications = []
|
||||
}}
|
||||
>
|
||||
<div>
|
||||
<p>Q-Mail</p>
|
||||
<message-time timestamp=${notification.created} style="color:red;font-size:12px"></message-time>
|
||||
</div>
|
||||
<div>
|
||||
<p>${notification.name}</p>
|
||||
</div>
|
||||
</div>
|
||||
`)}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
`
|
||||
}
|
||||
firstUpdated() {
|
||||
this.getNotifications();
|
||||
document.addEventListener('click', (event) => {
|
||||
const path = event.composedPath()
|
||||
if (!path.includes(this)) {
|
||||
this.showNotifications = false
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
firstUpdated() {
|
||||
this.getNotifications()
|
||||
getApiKey() {
|
||||
const apiNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node]
|
||||
let apiKey = apiNode.apiKey
|
||||
return apiKey
|
||||
}
|
||||
|
||||
document.addEventListener('click', (event) => {
|
||||
const path = event.composedPath()
|
||||
if (!path.includes(this)) {
|
||||
this.showNotifications = false
|
||||
}
|
||||
})
|
||||
}
|
||||
async getNotifications() {
|
||||
const myNode = store.getState().app.nodeConfig.knownNodes[store.getState().app.nodeConfig.node]
|
||||
const nodeUrl = myNode.protocol + '://' + myNode.domain + ':' + myNode.port
|
||||
|
||||
getApiKey() {
|
||||
const apiNode = store.getState().app.nodeConfig.knownNodes[store.getState().app.nodeConfig.node]
|
||||
return apiNode.apiKey
|
||||
}
|
||||
let interval = null
|
||||
let stop = false
|
||||
|
||||
async getNotifications() {
|
||||
const myNode = store.getState().app.nodeConfig.knownNodes[store.getState().app.nodeConfig.node]
|
||||
const nodeUrl = myNode.protocol + '://' + myNode.domain + ':' + myNode.port
|
||||
const getNewMail = async () => {
|
||||
|
||||
let interval = null
|
||||
let stop = false
|
||||
const getMail = async (recipientName, recipientAddress) => {
|
||||
const query = `qortal_qmail_${recipientName.slice(
|
||||
0,
|
||||
20
|
||||
)}_${recipientAddress.slice(-6)}_mail_`
|
||||
const url = `${nodeUrl}/arbitrary/resources/search?service=MAIL_PRIVATE&query=${query}&limit=10&includemetadata=true&offset=0&reverse=true&excludeblocked=true`
|
||||
const response = await fetch(url, {
|
||||
method: 'GET',
|
||||
headers: {
|
||||
'Content-Type': 'application/json'
|
||||
}
|
||||
})
|
||||
|
||||
const getNewMail = async () => {
|
||||
const getMail = async (recipientName, recipientAddress) => {
|
||||
const query = `qortal_qmail_${recipientName.slice(
|
||||
0,
|
||||
20
|
||||
)}_${recipientAddress.slice(-6)}_mail_`
|
||||
const data = await response.json()
|
||||
return data;
|
||||
}
|
||||
|
||||
const url = `${nodeUrl}/arbitrary/resources/search?service=MAIL_PRIVATE&query=${query}&limit=10&includemetadata=false&offset=0&reverse=true&excludeblocked=true`
|
||||
if (!stop && !this.showNotifications) {
|
||||
stop = true
|
||||
try {
|
||||
const address = window.parent.reduxStore.getState().app?.selectedAddress?.address;
|
||||
const name = window.parent.reduxStore.getState().app?.accountInfo?.names[0]?.name
|
||||
|
||||
const response = await fetch(url, {
|
||||
method: 'GET',
|
||||
headers: {
|
||||
'Content-Type': 'application/json'
|
||||
}
|
||||
})
|
||||
if (!name || !address) return
|
||||
const mailArray = await getMail(name, address)
|
||||
let notificationsToShow = []
|
||||
if (mailArray.length > 0) {
|
||||
const lastVisited = localStorage.getItem("Q-Mail-last-visited")
|
||||
|
||||
return await response.json()
|
||||
}
|
||||
if (lastVisited) {
|
||||
mailArray.forEach((mail) => {
|
||||
if (mail.created > lastVisited) notificationsToShow.push(mail)
|
||||
})
|
||||
} else {
|
||||
notificationsToShow = mailArray
|
||||
}
|
||||
|
||||
if (!stop && !this.showNotifications) {
|
||||
stop = true
|
||||
}
|
||||
if (!this.initialFetch && notificationsToShow.length > 0) {
|
||||
const mail = notificationsToShow[0]
|
||||
const urlPic = `${nodeUrl}/arbitrary/THUMBNAIL/${mail.name}/qortal_avatar?async=true&apiKey=${this.getApiKey()}`
|
||||
routes.showNotification({
|
||||
data: { title: "New Q-Mail", type: "qapp", sound: config.messageAlert, url: "", options: { body: `You have an unread mail from ${mail.name}`, icon: urlPic, badge: urlPic } }
|
||||
})
|
||||
} else if (notificationsToShow.length > 0) {
|
||||
if (notificationsToShow[0].created > (this.notifications[0]?.created || 0)) {
|
||||
const mail = notificationsToShow[0]
|
||||
const urlPic = `${nodeUrl}/arbitrary/THUMBNAIL/${mail.name}/qortal_avatar?async=true&apiKey=${this.getApiKey()}`
|
||||
routes.showNotification({
|
||||
data: { title: "New Q-Mail", type: "qapp", sound: config.messageAlert, url: "", options: { body: `You have an unread mail from ${mail.name}`, icon: urlPic, badge: urlPic } }
|
||||
})
|
||||
}
|
||||
}
|
||||
this.notifications = notificationsToShow
|
||||
|
||||
try {
|
||||
const address = window.parent.reduxStore.getState().app?.selectedAddress?.address;
|
||||
const name = window.parent.reduxStore.getState().app?.accountInfo?.names[0]?.name
|
||||
if (this.notifications.length === 0) {
|
||||
this.notificationCount = false
|
||||
} else {
|
||||
this.notificationCount = true
|
||||
}
|
||||
|
||||
if (!name || !address) return
|
||||
if (!this.initialFetch) this.initialFetch = true
|
||||
} catch (error) {
|
||||
console.error(error)
|
||||
}
|
||||
stop = false
|
||||
}
|
||||
}
|
||||
try {
|
||||
|
||||
const mailArray = await getMail(name, address)
|
||||
setTimeout(() => {
|
||||
getNewMail()
|
||||
}, 5000)
|
||||
|
||||
let notificationsToShow = []
|
||||
interval = setInterval(getNewMail, 60000)
|
||||
} catch (error) {
|
||||
console.error(error)
|
||||
}
|
||||
}
|
||||
|
||||
if (mailArray.length > 0) {
|
||||
const lastVisited = localStorage.getItem("Q-Mail-last-visited")
|
||||
render() {
|
||||
return html`
|
||||
<div class="layout">
|
||||
${this.notificationCount ? html`
|
||||
<paper-icon-button style="color: green;" icon="icons:mail" @click=${() => this._toggleNotifications()} title="Q-Mail"></paper-icon-button>
|
||||
` : html`
|
||||
<paper-icon-button icon="icons:mail" @click=${() => {
|
||||
this._openTabQmail()
|
||||
}} title="Q-Mail"></paper-icon-button>
|
||||
`}
|
||||
|
||||
if (lastVisited) {
|
||||
mailArray.forEach((mail) => {
|
||||
if (mail.created > lastVisited) notificationsToShow.push(mail)
|
||||
})
|
||||
} else {
|
||||
notificationsToShow = mailArray
|
||||
}
|
||||
${this.notificationCount ? html`
|
||||
<span class="count">${this.notifications.length}</span>
|
||||
` : ''}
|
||||
|
||||
}
|
||||
<div class="popover-panel" ?hidden=${!this.showNotifications}>
|
||||
<div class="notifications-list">
|
||||
${this.notifications.map(notification => html`
|
||||
<div class="notification-item" @click=${() => {
|
||||
const query = `?service=APP&name=Q-Mail`
|
||||
store.dispatch(setNewTab({
|
||||
url: `qdn/browser/index.html${query}`,
|
||||
id: 'q-mail-notification',
|
||||
myPlugObj: {
|
||||
"url": "myapp",
|
||||
"domain": "core",
|
||||
"page": `qdn/browser/index.html${query}`,
|
||||
"title": "Q-Mail",
|
||||
"icon": "vaadin:mailbox",
|
||||
"mwcicon": "mail_outline",
|
||||
"menus": [],
|
||||
"parent": false
|
||||
}
|
||||
}))
|
||||
this.showNotifications = false
|
||||
this.notifications = []
|
||||
}}>
|
||||
<div>
|
||||
<p>Q-Mail</p>
|
||||
<message-time timestamp=${notification.created} style="color:red;font-size:12px"></message-time>
|
||||
</div>
|
||||
<div>
|
||||
<p>${notification.name}</p>
|
||||
</div>
|
||||
</div>
|
||||
`)}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
`
|
||||
}
|
||||
|
||||
if (!this.initialFetch && notificationsToShow.length > 0) {
|
||||
const mail = notificationsToShow[0]
|
||||
const urlPic = `${nodeUrl}/arbitrary/THUMBNAIL/${mail.name}/qortal_avatar?async=true}`
|
||||
_toggleNotifications() {
|
||||
if (this.notifications.length === 0) return
|
||||
this.showNotifications = !this.showNotifications
|
||||
}
|
||||
_openTabQmail() {
|
||||
const query = `?service=APP&name=Q-Mail`
|
||||
store.dispatch(setNewTab({
|
||||
url: `qdn/browser/index.html${query}`,
|
||||
id: 'q-mail-notification',
|
||||
myPlugObj: {
|
||||
"url": "myapp",
|
||||
"domain": "core",
|
||||
"page": `qdn/browser/index.html${query}`,
|
||||
"title": "Q-Mail",
|
||||
"icon": "vaadin:mailbox",
|
||||
"mwcicon": "mail_outline",
|
||||
"menus": [],
|
||||
"parent": false
|
||||
}
|
||||
}))
|
||||
}
|
||||
|
||||
await routes.showNotification({
|
||||
data: {
|
||||
title: 'New Q-Mail',
|
||||
type: 'qapp',
|
||||
sound: config.messageAlert,
|
||||
url: '',
|
||||
options: {
|
||||
body: `You have an unread mail from ${mail.name}`,
|
||||
icon: urlPic,
|
||||
badge: urlPic
|
||||
}
|
||||
}
|
||||
})
|
||||
} else if (notificationsToShow.length > 0) {
|
||||
if (notificationsToShow[0].created > (this.notifications[0]?.created || 0)) {
|
||||
const mail = notificationsToShow[0]
|
||||
const urlPic = `${nodeUrl}/arbitrary/THUMBNAIL/${mail.name}/qortal_avatar?async=true}`
|
||||
static styles = css`
|
||||
.layout {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
await routes.showNotification({
|
||||
data: {
|
||||
title: 'New Q-Mail',
|
||||
type: 'qapp',
|
||||
sound: config.messageAlert,
|
||||
url: '',
|
||||
options: {
|
||||
body: `You have an unread mail from ${mail.name}`,
|
||||
icon: urlPic,
|
||||
badge: urlPic
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
.count {
|
||||
position: absolute;
|
||||
top: 2px;
|
||||
right: 0px;
|
||||
font-size: 12px;
|
||||
background-color: red;
|
||||
color: white;
|
||||
border-radius: 50%;
|
||||
width: 16px;
|
||||
height: 16px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
this.notifications = notificationsToShow
|
||||
.nocount {
|
||||
display: none;
|
||||
}
|
||||
|
||||
this.notificationCount = this.notifications.length !== 0
|
||||
.popover-panel {
|
||||
position: absolute;
|
||||
width: 200px;
|
||||
padding: 10px;
|
||||
background-color: var(--white);
|
||||
border: 1px solid var(--black);
|
||||
border-radius: 4px;
|
||||
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
|
||||
top: 40px;
|
||||
max-height: 350px;
|
||||
overflow: auto;
|
||||
scrollbar-width: thin;
|
||||
scrollbar-color: #6a6c75 #a1a1a1;
|
||||
}
|
||||
|
||||
if (!this.initialFetch) this.initialFetch = true
|
||||
} catch (error) {
|
||||
console.error(error)
|
||||
}
|
||||
.popover-panel::-webkit-scrollbar {
|
||||
width: 11px;
|
||||
}
|
||||
|
||||
stop = false
|
||||
}
|
||||
}
|
||||
.popover-panel::-webkit-scrollbar-track {
|
||||
background: #a1a1a1;
|
||||
}
|
||||
|
||||
try {
|
||||
setTimeout(() => {
|
||||
getNewMail()
|
||||
}, 5000)
|
||||
.popover-panel::-webkit-scrollbar-thumb {
|
||||
background-color: #6a6c75;
|
||||
border-radius: 6px;
|
||||
border: 3px solid #a1a1a1;
|
||||
}
|
||||
|
||||
interval = setInterval(getNewMail, 60000)
|
||||
} catch (error) {
|
||||
console.error(error)
|
||||
}
|
||||
}
|
||||
.notifications-list {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
_toggleNotifications() {
|
||||
if (this.notifications.length === 0) return
|
||||
this.showNotifications = !this.showNotifications
|
||||
}
|
||||
.notification-item {
|
||||
padding: 5px;
|
||||
border-bottom: 1px solid;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
cursor: pointer;
|
||||
transition: 0.2s all;
|
||||
}
|
||||
|
||||
_openTabQmail() {
|
||||
const query = `?service=APP&name=Q-Mail`
|
||||
.notification-item:hover {
|
||||
background: var(--nav-color-hover);
|
||||
}
|
||||
|
||||
store.dispatch(setNewTab({
|
||||
url: `qdn/browser/index.html${query}`,
|
||||
id: 'q-mail-notification',
|
||||
myPlugObj: {
|
||||
"url": "myapp",
|
||||
"domain": "core",
|
||||
"page": `qdn/browser/index.html${query}`,
|
||||
"title": "Q-Mail",
|
||||
"icon": "vaadin:mailbox",
|
||||
"mwcicon": "mail_outline",
|
||||
"menus": [],
|
||||
"parent": false
|
||||
}
|
||||
}))
|
||||
}
|
||||
p {
|
||||
font-size: 14px;
|
||||
color: var(--black);
|
||||
margin: 0px;
|
||||
padding: 0px;
|
||||
}
|
||||
`
|
||||
}
|
||||
|
||||
window.customElements.define('notification-bell', NotificationBell)
|
||||
customElements.define('notification-bell', NotificationBell)
|
||||
|
@ -1,56 +1,74 @@
|
||||
import { css, html, LitElement } from 'lit'
|
||||
import { createPopper } from '@popperjs/core'
|
||||
import { popoverComponentStyles } from '../../styles/core-css'
|
||||
// popover-component.js
|
||||
import { LitElement, html, css } from 'lit';
|
||||
import { createPopper } from '@popperjs/core';
|
||||
import '@material/mwc-icon'
|
||||
|
||||
export class PopoverComponent extends LitElement {
|
||||
static get properties() {
|
||||
return {
|
||||
for: { type: String, reflect: true },
|
||||
message: { type: String }
|
||||
}
|
||||
}
|
||||
static styles = css`
|
||||
:host {
|
||||
display: none;
|
||||
position: absolute;
|
||||
background-color: var(--white);
|
||||
border: 1px solid #ddd;
|
||||
padding: 8px;
|
||||
z-index: 10;
|
||||
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
|
||||
color: var(--black);
|
||||
max-width: 250px;
|
||||
}
|
||||
|
||||
static get styles() {
|
||||
return [popoverComponentStyles]
|
||||
}
|
||||
.close-icon {
|
||||
cursor: pointer;
|
||||
float: right;
|
||||
margin-left: 10px;
|
||||
color: var(--black)
|
||||
}
|
||||
`;
|
||||
|
||||
constructor() {
|
||||
super()
|
||||
this.message = ''
|
||||
}
|
||||
static properties = {
|
||||
for: { type: String, reflect: true },
|
||||
message: { type: String }
|
||||
};
|
||||
|
||||
render() {
|
||||
return html`
|
||||
<span class="close-icon" @click="${this.closePopover}"><mwc-icon style="color: var(--black)">close</mwc-icon></span>
|
||||
<div><mwc-icon style="color: var(--black)">info</mwc-icon> ${this.message} <slot></slot></div>
|
||||
`
|
||||
}
|
||||
constructor() {
|
||||
super();
|
||||
this.message = '';
|
||||
}
|
||||
|
||||
attachToTarget(target) {
|
||||
if (!this.popperInstance && target) {
|
||||
this.popperInstance = createPopper(target, this, {
|
||||
placement: 'bottom',
|
||||
strategy: 'fixed'
|
||||
})
|
||||
}
|
||||
}
|
||||
firstUpdated() {
|
||||
// We'll defer the popper attachment to the openPopover() method to ensure target availability
|
||||
}
|
||||
|
||||
openPopover(target) {
|
||||
this.attachToTarget(target)
|
||||
this.style.display = 'block'
|
||||
}
|
||||
attachToTarget(target) {
|
||||
console.log({target})
|
||||
if (!this.popperInstance && target) {
|
||||
this.popperInstance = createPopper(target, this, {
|
||||
placement: 'bottom',
|
||||
strategy: 'fixed'
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
closePopover() {
|
||||
this.style.display = 'none'
|
||||
openPopover(target) {
|
||||
this.attachToTarget(target);
|
||||
this.style.display = 'block';
|
||||
}
|
||||
|
||||
if (this.popperInstance) {
|
||||
this.popperInstance.destroy()
|
||||
this.popperInstance = null
|
||||
}
|
||||
closePopover() {
|
||||
this.style.display = 'none';
|
||||
if (this.popperInstance) {
|
||||
this.popperInstance.destroy();
|
||||
this.popperInstance = null;
|
||||
}
|
||||
this.requestUpdate();
|
||||
}
|
||||
|
||||
this.requestUpdate()
|
||||
}
|
||||
render() {
|
||||
return html`
|
||||
<span class="close-icon" @click="${this.closePopover}"><mwc-icon style="color: var(--black)">close</mwc-icon></span>
|
||||
<div><mwc-icon style="color: var(--black)">info</mwc-icon> ${this.message}</div>
|
||||
`;
|
||||
}
|
||||
}
|
||||
|
||||
window.customElements.define('popover-component', PopoverComponent)
|
||||
customElements.define('popover-component', PopoverComponent);
|
||||
|
@ -1,62 +1,135 @@
|
||||
import { html, LitElement } from 'lit'
|
||||
import { svgMoon, svgSun } from '../../assets/js/svg'
|
||||
import { qortThemeToggleStyles } from '../styles/core-css'
|
||||
import { LitElement, html, css } from 'lit'
|
||||
import { svgSun, svgMoon } from '../../assets/js/svg.js'
|
||||
|
||||
class QortThemeToggle extends LitElement {
|
||||
static get properties() {
|
||||
return {
|
||||
theme: { type: String, reflect: true }
|
||||
}
|
||||
}
|
||||
static get properties() {
|
||||
return {
|
||||
theme: {
|
||||
type: String,
|
||||
reflect: true
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
constructor() {
|
||||
super()
|
||||
this.theme = localStorage.getItem('qortalTheme') ? localStorage.getItem('qortalTheme') : 'light'
|
||||
}
|
||||
constructor() {
|
||||
super();
|
||||
this.theme = localStorage.getItem('qortalTheme') ? localStorage.getItem('qortalTheme') : 'light';
|
||||
}
|
||||
|
||||
static get styles() {
|
||||
return [qortThemeToggleStyles]
|
||||
}
|
||||
static styles = [
|
||||
css`
|
||||
:host {
|
||||
display: inline-block;
|
||||
position: relative;
|
||||
width: 54px;
|
||||
height: 32px;
|
||||
transform: translateY(-2px);
|
||||
}
|
||||
|
||||
render() {
|
||||
return html`
|
||||
<input type="checkbox" @change=${() => this.toggleTheme()}/>
|
||||
<div class="slider"></div>
|
||||
<div class="icon">
|
||||
<span class="sun">${svgSun}</span>
|
||||
<span class="moon">${svgMoon}</span>
|
||||
</div>
|
||||
`
|
||||
}
|
||||
svg {
|
||||
width: 32px;
|
||||
height: 32px;
|
||||
}
|
||||
|
||||
firstUpdated() {
|
||||
this.initTheme()
|
||||
}
|
||||
input {
|
||||
cursor: pointer;
|
||||
position: absolute;
|
||||
z-index: 1;
|
||||
opacity: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
.slider {
|
||||
position: absolute;
|
||||
cursor: pointer;
|
||||
width: 100%;
|
||||
height: 16px;
|
||||
top: 50%;
|
||||
transform: translateY(-50%);
|
||||
background-color: var(--switchbackground);
|
||||
border: 2px solid var(--switchborder);
|
||||
border-radius: 1rem;
|
||||
transition: all .4s ease;
|
||||
}
|
||||
|
||||
.icon {
|
||||
width: 32px;
|
||||
height: 32px;
|
||||
display: inline-block;
|
||||
position: absolute;
|
||||
top: 50%;
|
||||
background: var(--switchbackground);
|
||||
border: 2px solid var(--switchborder);
|
||||
border-radius: 50%;
|
||||
transition: transform 300ms ease;
|
||||
}
|
||||
|
||||
:host([theme="light"]) .icon {
|
||||
transform: translate(0, -50%);
|
||||
}
|
||||
|
||||
input:checked ~ .icon,
|
||||
:host([theme="dark"]) .icon {
|
||||
transform: translate(calc(100% - 12px), -50%);
|
||||
}
|
||||
|
||||
.moon {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.moon svg {
|
||||
transform: scale(0.6);
|
||||
}
|
||||
|
||||
:host([theme="dark"]) .sun {
|
||||
display: none;
|
||||
}
|
||||
|
||||
:host([theme="dark"]) .moon {
|
||||
display: inline-block;
|
||||
}
|
||||
`
|
||||
];
|
||||
|
||||
render() {
|
||||
return html`
|
||||
<input type="checkbox" @change=${() => this.toggleTheme()}/>
|
||||
<div class="slider"></div>
|
||||
<div class="icon">
|
||||
<span class="sun">${svgSun}</span>
|
||||
<span class="moon">${svgMoon}</span>
|
||||
</div>
|
||||
`;
|
||||
}
|
||||
|
||||
firstUpdated() {
|
||||
this.initTheme();
|
||||
}
|
||||
|
||||
|
||||
toggleTheme() {
|
||||
if (this.theme === 'light') {
|
||||
this.theme = 'dark'
|
||||
} else {
|
||||
this.theme = 'light'
|
||||
}
|
||||
toggleTheme() {
|
||||
if (this.theme === 'light') {
|
||||
this.theme = 'dark';
|
||||
} else {
|
||||
this.theme = 'light';
|
||||
}
|
||||
|
||||
this.dispatchEvent(
|
||||
new CustomEvent('qort-theme-change', {
|
||||
bubbles: true,
|
||||
composed: true,
|
||||
detail: this.theme
|
||||
})
|
||||
)
|
||||
this.dispatchEvent(
|
||||
new CustomEvent('qort-theme-change', {
|
||||
bubbles: true,
|
||||
composed: true,
|
||||
detail: this.theme,
|
||||
}),
|
||||
);
|
||||
|
||||
window.localStorage.setItem('qortalTheme', this.theme)
|
||||
window.localStorage.setItem('qortalTheme', this.theme);
|
||||
this.initTheme();
|
||||
}
|
||||
|
||||
this.initTheme()
|
||||
}
|
||||
|
||||
initTheme() {
|
||||
document.querySelector('html').setAttribute('theme', this.theme)
|
||||
}
|
||||
initTheme() {
|
||||
document.querySelector('html').setAttribute('theme', this.theme);
|
||||
}
|
||||
}
|
||||
|
||||
window.customElements.define('qort-theme-toggle', QortThemeToggle)
|
||||
window.customElements.define('qort-theme-toggle', QortThemeToggle);
|
||||
|
@ -1,14 +1,12 @@
|
||||
import { html, LitElement } from 'lit'
|
||||
import { searchModalStyles } from '../styles/core-css'
|
||||
import snackbar from '../functional-components/snackbar'
|
||||
import { LitElement, html, css } from 'lit'
|
||||
import { get, translate, translateUnsafeHTML } from 'lit-translate'
|
||||
import snackbar from '../functional-components/snackbar.js'
|
||||
|
||||
import '@polymer/paper-icon-button/paper-icon-button.js'
|
||||
import '@polymer/iron-icons/iron-icons.js'
|
||||
import '@polymer/paper-dialog/paper-dialog.js'
|
||||
import '@vaadin/text-field'
|
||||
|
||||
// Multi language support
|
||||
import { get, translate } from '../../translate'
|
||||
|
||||
class SearchModal extends LitElement {
|
||||
static get properties() {
|
||||
return {
|
||||
@ -17,16 +15,56 @@ class SearchModal extends LitElement {
|
||||
}
|
||||
}
|
||||
|
||||
static get styles() {
|
||||
return [searchModalStyles]
|
||||
}
|
||||
|
||||
constructor() {
|
||||
super()
|
||||
this.searchContentString = ''
|
||||
this.theme = localStorage.getItem('qortalTheme') ? localStorage.getItem('qortalTheme') : 'light'
|
||||
}
|
||||
|
||||
static get styles() {
|
||||
return css`
|
||||
* {
|
||||
--lumo-primary-text-color: rgb(0, 167, 245);
|
||||
--lumo-primary-color-50pct: rgba(0, 167, 245, 0.5);
|
||||
--lumo-primary-color-10pct: rgba(0, 167, 245, 0.1);
|
||||
--lumo-primary-color: hsl(199, 100%, 48%);
|
||||
--lumo-base-color: var(--white);
|
||||
--lumo-body-text-color: var(--black);
|
||||
--lumo-secondary-text-color: var(--sectxt);
|
||||
--lumo-contrast-60pct: var(--vdicon);
|
||||
--item-selected-color: var(--nav-selected-color);
|
||||
--item-selected-color-text: var(--nav-selected-color-text);
|
||||
--item-color-active: var(--nav-color-active);
|
||||
--item-color-hover: var(--nav-color-hover);
|
||||
--item-text-color: var(--nav-text-color);
|
||||
--item-icon-color: var(--nav-icon-color);
|
||||
--item-border-color: var(--nav-border-color);
|
||||
--item-border-selected-color: var(--nav-border-selected-color);
|
||||
}
|
||||
|
||||
paper-dialog.searchSettings {
|
||||
min-width: 525px;
|
||||
max-width: 525px;
|
||||
min-height: auto;
|
||||
max-height: 150px;
|
||||
background-color: var(--white);
|
||||
color: var(--black);
|
||||
line-height: 1.6;
|
||||
overflow: hidden;
|
||||
border: 1px solid var(--black);
|
||||
border-radius: 10px;
|
||||
padding: 15px;
|
||||
box-shadow: 0px 10px 15px rgba(0, 0, 0, 0.1);
|
||||
}
|
||||
|
||||
.search {
|
||||
display: inline;
|
||||
width: 50%;
|
||||
align-items: center;
|
||||
}
|
||||
`
|
||||
}
|
||||
|
||||
render() {
|
||||
return html`
|
||||
<div style="display: inline;">
|
||||
@ -54,7 +92,6 @@ class SearchModal extends LitElement {
|
||||
}
|
||||
|
||||
firstUpdated() {
|
||||
// ...
|
||||
}
|
||||
|
||||
openSearch() {
|
||||
@ -73,24 +110,19 @@ class SearchModal extends LitElement {
|
||||
|
||||
openUserInfo() {
|
||||
const checkvalue = this.shadowRoot.getElementById('searchContent').value
|
||||
|
||||
if (checkvalue.length < 3) {
|
||||
let snackbar1string = get("publishpage.pchange20")
|
||||
let snackbar2string = get("welcomepage.wcchange4")
|
||||
|
||||
snackbar.add({
|
||||
labelText: `${snackbar1string} ${snackbar2string}`,
|
||||
dismiss: true
|
||||
})
|
||||
|
||||
this.shadowRoot.getElementById('searchContent').value = this.searchContentString
|
||||
return
|
||||
} else {
|
||||
let sendInfoAddress = this.shadowRoot.getElementById('searchContent').value
|
||||
|
||||
const infoDialog = document.getElementById('main-app').shadowRoot.querySelector('app-view').shadowRoot.querySelector('user-info-view')
|
||||
|
||||
infoDialog.openUserInfo(sendInfoAddress)
|
||||
|
||||
this.shadowRoot.getElementById('searchContent').value = this.searchContentString
|
||||
this.shadowRoot.getElementById('searchSettingsDialog').close()
|
||||
}
|
||||
|
@ -1,92 +1,114 @@
|
||||
import { html, LitElement } from 'lit'
|
||||
import { connect } from 'pwa-helpers'
|
||||
import { store } from '../../store'
|
||||
import { accountViewStyles } from '../../styles/core-css'
|
||||
|
||||
// Multi language support
|
||||
import { get, translate } from '../../../translate'
|
||||
import { LitElement, html, css } from 'lit';
|
||||
import { connect } from 'pwa-helpers';
|
||||
import { store } from '../../store.js';
|
||||
import { translate, translateUnsafeHTML } from 'lit-translate'
|
||||
|
||||
class AccountView extends connect(store)(LitElement) {
|
||||
static get properties() {
|
||||
return {
|
||||
accountInfo: { type: Object },
|
||||
switchAvatar: { type: String },
|
||||
theme: { type: String, reflect: true }
|
||||
}
|
||||
}
|
||||
static get properties() {
|
||||
return {
|
||||
accountInfo: { type: Object },
|
||||
theme: { type: String, reflect: true }
|
||||
}
|
||||
}
|
||||
|
||||
static get styles() {
|
||||
return [accountViewStyles]
|
||||
}
|
||||
static get styles() {
|
||||
return css`
|
||||
|
||||
constructor() {
|
||||
super()
|
||||
this.accountInfo = store.getState().app.accountInfo
|
||||
this.switchAvatar = ''
|
||||
this.theme = localStorage.getItem('qortalTheme') ? localStorage.getItem('qortalTheme') : 'light'
|
||||
}
|
||||
.sub-main {
|
||||
position: relative;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
render() {
|
||||
return html`
|
||||
<div class="sub-main">
|
||||
<div class="center-box">
|
||||
<div class="img-icon">${this.getAvatar()}</div>
|
||||
<span id="accountName">
|
||||
${this.accountInfo.names.length !== 0 ? this.accountInfo.names[0].name : get("chatpage.cchange15")}
|
||||
</span>
|
||||
<div class="content-box">
|
||||
<span class="title">${translate("settings.address")}: </span>
|
||||
<span class="value">${store.getState().app.selectedAddress.address}</span>
|
||||
<br/>
|
||||
<span class="title">${translate("settings.publickey")}: </span>
|
||||
<span class="value">${store.getState().app.selectedAddress.base58PublicKey}</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
`
|
||||
}
|
||||
.center-box {
|
||||
position: relative;
|
||||
top: 45%;
|
||||
left: 50%;
|
||||
transform: translate(-50%, 0%);
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
firstUpdated() {
|
||||
this.getSwitchAvatar()
|
||||
.img-icon {
|
||||
display: block;
|
||||
margin-top: 10px;
|
||||
}
|
||||
|
||||
setInterval(() => {
|
||||
this.getSwitchAvatar()
|
||||
}, 10000)
|
||||
}
|
||||
.content-box {
|
||||
border: 1px solid #a1a1a1;
|
||||
padding: 10px 25px;
|
||||
text-align: left;
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
getAvatar() {
|
||||
if (this.switchAvatar === 'light') {
|
||||
if (this.accountInfo.names.length === 0) {
|
||||
return html`<img src="/img/noavatar_light.png" style="width:150px; height:150px; border-radius: 25%;">`
|
||||
} else {
|
||||
const avatarName = this.accountInfo.names[0].name
|
||||
const avatarNode = store.getState().app.nodeConfig.knownNodes[store.getState().app.nodeConfig.node]
|
||||
const avatarUrl = avatarNode.protocol + '://' + avatarNode.domain + ':' + avatarNode.port
|
||||
const url = `${avatarUrl}/arbitrary/THUMBNAIL/${avatarName}/qortal_avatar?async=true`
|
||||
.title {
|
||||
font-weight: 600;
|
||||
font-size: 15px;
|
||||
display: block;
|
||||
line-height: 32px;
|
||||
opacity: 0.66;
|
||||
}
|
||||
|
||||
return html`<img src="${url}" style="width:150px; height:150px; border-radius: 25%;" onerror="this.src='/img/noavatar_light.png';">`
|
||||
}
|
||||
} else if (this.switchAvatar === 'dark') {
|
||||
if (this.accountInfo.names.length === 0) {
|
||||
return html`<img src="/img/noavatar_dark.png" style="width:150px; height:150px; border-radius: 25%;">`
|
||||
} else {
|
||||
const avatarName = this.accountInfo.names[0].name
|
||||
const avatarNode = store.getState().app.nodeConfig.knownNodes[store.getState().app.nodeConfig.node]
|
||||
const avatarUrl = avatarNode.protocol + '://' + avatarNode.domain + ':' + avatarNode.port
|
||||
const url = `${avatarUrl}/arbitrary/THUMBNAIL/${avatarName}/qortal_avatar?async=true`
|
||||
.value {
|
||||
font-size: 16px;
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
return html`<img src="${url}" style="width:150px; height:150px; border-radius: 25%;" onerror="this.src='/img/noavatar_dark.png';">`
|
||||
}
|
||||
}
|
||||
}
|
||||
#accountName {
|
||||
margin: 0;
|
||||
font-size: 24px;
|
||||
font-weight:500;
|
||||
display: inline-block;
|
||||
width:100%;
|
||||
}
|
||||
`
|
||||
}
|
||||
|
||||
getSwitchAvatar() {
|
||||
this.switchAvatar = localStorage.getItem('qortalTheme')
|
||||
}
|
||||
constructor() {
|
||||
super()
|
||||
this.accountInfo = { names: [], addressInfo: {} }
|
||||
this.theme = localStorage.getItem('qortalTheme') ? localStorage.getItem('qortalTheme') : 'light'
|
||||
}
|
||||
|
||||
stateChanged(state) {
|
||||
this.accountInfo = state.app.accountInfo
|
||||
}
|
||||
render() {
|
||||
return html`
|
||||
<div class="sub-main">
|
||||
<div class="center-box">
|
||||
<div class="img-icon">${this.getAvatar()}</div>
|
||||
<span id="accountName">
|
||||
${this.accountInfo.names.length !== 0 ? this.accountInfo.names[0].name : 'No Registered Name'}
|
||||
</span>
|
||||
<div class="content-box">
|
||||
<span class="title">${translate("settings.address")}: </span>
|
||||
<span class="value">${store.getState().app.selectedAddress.address}</span>
|
||||
<br/>
|
||||
<span class="title">${translate("settings.publickey")}: </span>
|
||||
<span class="value">${store.getState().app.selectedAddress.base58PublicKey}</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
`
|
||||
}
|
||||
|
||||
stateChanged(state) {
|
||||
this.accountInfo = state.app.accountInfo
|
||||
}
|
||||
|
||||
getAvatar() {
|
||||
let numberBlocks = (this.accountInfo.addressInfo.blocksMinted + this.accountInfo.addressInfo.blocksMintedAdjustment);
|
||||
if (Number.isNaN(numberBlocks) || numberBlocks == "" || numberBlocks === null) {
|
||||
return html`<img src="/img/noavatar.png" style="width:150px; height:150px; border-radius: 50%;">`
|
||||
} else {
|
||||
const avatarNode = store.getState().app.nodeConfig.knownNodes[store.getState().app.nodeConfig.node]
|
||||
const avatarUrl = avatarNode.protocol + '://' + avatarNode.domain + ':' + avatarNode.port
|
||||
const url = `${avatarUrl}/arbitrary/THUMBNAIL/${this.accountInfo.names[0].name}/qortal_avatar?async=true&apiKey=${this.getApiKey()}`
|
||||
return html`<img src="${url}" style="width:150px; height:150px; border-radius: 50%;" onerror="this.src='/img/noavatar.png';">`
|
||||
}
|
||||
}
|
||||
|
||||
getApiKey() {
|
||||
const apiNode = store.getState().app.nodeConfig.knownNodes[store.getState().app.nodeConfig.node];
|
||||
let apiKey = apiNode.apiKey;
|
||||
return apiKey;
|
||||
}
|
||||
}
|
||||
|
||||
window.customElements.define('account-view', AccountView)
|
||||
window.customElements.define('account-view', AccountView)
|
||||
|
@ -1,423 +1,266 @@
|
||||
import { html, LitElement } from 'lit'
|
||||
import { LitElement, html, css } from 'lit'
|
||||
import { connect } from 'pwa-helpers'
|
||||
import { store } from '../../store'
|
||||
import { Epml } from '../../epml'
|
||||
import { addTradeBotRoutes } from '../../tradebot/addTradeBotRoutes'
|
||||
import { exportKeysStyles } from '../../styles/core-css'
|
||||
import { store } from '../../store.js'
|
||||
import { use, get, translate, translateUnsafeHTML, registerTranslateConfig } from 'lit-translate'
|
||||
import snackbar from '../../functional-components/snackbar.js'
|
||||
import FileSaver from 'file-saver'
|
||||
import snackbar from '../../functional-components/snackbar'
|
||||
import '@material/mwc-button'
|
||||
|
||||
import '@material/mwc-dialog'
|
||||
import '@material/mwc-button'
|
||||
import '@material/mwc-icon'
|
||||
|
||||
// Multi language support
|
||||
import { get, translate } from '../../../translate'
|
||||
|
||||
const parentEpml = new Epml({ type: 'WINDOW', source: window.parent })
|
||||
|
||||
class ExportKeys extends connect(store)(LitElement) {
|
||||
static get properties() {
|
||||
return {
|
||||
theme: { type: String, reflect: true },
|
||||
backupErrorMessage: { type: String },
|
||||
btcPMK: { type: String },
|
||||
ltcPMK: { type: String },
|
||||
dogePMK: { type: String },
|
||||
dgbPMK: { type: String },
|
||||
rvnPMK: { type: String },
|
||||
arrrPMK: { type: String },
|
||||
btcWALLET: { type: String },
|
||||
ltcWALLET: { type: String },
|
||||
dogeWALLET: { type: String },
|
||||
dgbWALLET: { type: String },
|
||||
rvnWALLET: { type: String },
|
||||
arrrWALLET: { type: String },
|
||||
btcName: { type: String },
|
||||
ltcName: { type: String },
|
||||
dogeName: { type: String },
|
||||
dgbName: { type: String },
|
||||
rvnName: { type: String },
|
||||
arrrName: { type: String },
|
||||
btcShort: { type: String },
|
||||
ltcShort: { type: String },
|
||||
dogeShort: { type: String },
|
||||
dgbShort: { type: String },
|
||||
rvnShort: { type: String },
|
||||
arrrShort: { type: String },
|
||||
enableArrr: { type: Boolean },
|
||||
dWalletAddress: { type: String },
|
||||
dPrivateKey: { type: String },
|
||||
dCoinName: { type: String },
|
||||
dCoinShort: { type: String }
|
||||
}
|
||||
}
|
||||
static get properties() {
|
||||
return {
|
||||
theme: { type: String, reflect: true },
|
||||
backupErrorMessage: { type: String },
|
||||
btcPMK: { type: String },
|
||||
ltcPMK: { type: String },
|
||||
dogePMK: { type: String },
|
||||
dgbPMK: { type: String },
|
||||
rvnPMK: { type: String },
|
||||
btcWALLET: { type: String },
|
||||
ltcWALLET: { type: String },
|
||||
dogeWALLET: { type: String },
|
||||
dgbWALLET: { type: String },
|
||||
rvnWALLET: { type: String },
|
||||
btcName: { type: String },
|
||||
ltcName: { type: String },
|
||||
dogeName: { type: String },
|
||||
dgbName: { type: String },
|
||||
rvnName: { type: String },
|
||||
btcShort: { type: String },
|
||||
ltcShort: { type: String },
|
||||
dogeShort: { type: String },
|
||||
dgbShort: { type: String },
|
||||
rvnShort: { type: String },
|
||||
dWalletAddress: { type: String },
|
||||
dPrivateKey: { type: String },
|
||||
dCoinName: { type: String },
|
||||
dCoinShort: { type: String }
|
||||
}
|
||||
}
|
||||
|
||||
static get styles() {
|
||||
return [exportKeysStyles]
|
||||
}
|
||||
static get styles() {
|
||||
return css`
|
||||
* {
|
||||
--mdc-theme-primary: rgb(3, 169, 244);
|
||||
--mdc-theme-surface: var(--white);
|
||||
--mdc-dialog-content-ink-color: var(--black);
|
||||
--mdc-dialog-min-width: 500px;
|
||||
--mdc-dialog-max-width: 500px;
|
||||
--lumo-primary-text-color: rgb(0, 167, 245);
|
||||
--lumo-primary-color-50pct: rgba(0, 167, 245, 0.5);
|
||||
--lumo-primary-color-10pct: rgba(0, 167, 245, 0.1);
|
||||
--lumo-primary-color: hsl(199, 100%, 48%);
|
||||
--lumo-base-color: var(--white);
|
||||
--lumo-body-text-color: var(--black);
|
||||
--lumo-secondary-text-color: var(--sectxt);
|
||||
--lumo-contrast-60pct: var(--vdicon);
|
||||
}
|
||||
|
||||
constructor() {
|
||||
super()
|
||||
this.theme = localStorage.getItem('qortalTheme') ? localStorage.getItem('qortalTheme') : 'light'
|
||||
this.backupErrorMessage = ''
|
||||
this.btcPMK = store.getState().app.selectedAddress.btcWallet.derivedMasterPrivateKey
|
||||
this.btcWALLET = store.getState().app.selectedAddress.btcWallet.address
|
||||
this.btcName = 'Bitcoin'
|
||||
this.btcShort = 'btc'
|
||||
this.ltcPMK = store.getState().app.selectedAddress.ltcWallet.derivedMasterPrivateKey
|
||||
this.ltcWALLET = store.getState().app.selectedAddress.ltcWallet.address
|
||||
this.ltcName = 'Litecoin'
|
||||
this.ltcShort = 'ltc'
|
||||
this.dogePMK = store.getState().app.selectedAddress.dogeWallet.derivedMasterPrivateKey
|
||||
this.dogeWALLET = store.getState().app.selectedAddress.dogeWallet.address
|
||||
this.dogeName = 'Dogecoin'
|
||||
this.dogeShort = 'doge'
|
||||
this.dgbPMK = store.getState().app.selectedAddress.dgbWallet.derivedMasterPrivateKey
|
||||
this.dgbWALLET = store.getState().app.selectedAddress.dgbWallet.address
|
||||
this.dgbName = 'Digibyte'
|
||||
this.dgbShort = 'dgb'
|
||||
this.rvnPMK = store.getState().app.selectedAddress.rvnWallet.derivedMasterPrivateKey
|
||||
this.rvnWALLET = store.getState().app.selectedAddress.rvnWallet.address
|
||||
this.rvnName = 'Ravencoin'
|
||||
this.rvnShort = 'rvn'
|
||||
this.arrrPMK = ''
|
||||
this.arrrWALLET = ''
|
||||
this.arrrName = 'Pirate Chain'
|
||||
this.arrrShort = 'arrr'
|
||||
this.enableArrr = false
|
||||
this.dWalletAddress = ''
|
||||
this.dPrivateKey = ''
|
||||
this.dCoinName = ''
|
||||
this.dCoinShort = 'btc'
|
||||
}
|
||||
.center-box {
|
||||
position: absolute;
|
||||
width: 100%;
|
||||
top: 50%;
|
||||
left: 50%;
|
||||
transform: translate(-50%, 0%);
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
render() {
|
||||
return html`
|
||||
<div style="position: relative;">
|
||||
<div class="center-box">
|
||||
<p>
|
||||
${translate("settings.exp4")}
|
||||
</p>
|
||||
</div>
|
||||
<div class="sub-main">
|
||||
<div class="center-box">
|
||||
<div class="content-box">
|
||||
<div style="display: flex; align-items: center; justify-content: center;">
|
||||
<img src="/img/btc.png" style="width: 32px; height: 32px;"> ${this.btcWALLET}<br>
|
||||
</div>
|
||||
<div @click=${() => this.checkForPmkDownload(this.btcWALLET, this.btcPMK, this.btcName, this.btcShort)} class="export-button"> ${translate("settings.exp2")} </div>
|
||||
</div>
|
||||
<div class="content-box">
|
||||
<div style="display: flex; align-items: center; justify-content: center;">
|
||||
<img src="/img/ltc.png" style="width: 32px; height: 32px;"> ${this.ltcWALLET}<br>
|
||||
</div>
|
||||
<div @click=${() => this.checkForPmkDownload(this.ltcWALLET, this.ltcPMK, this.ltcName, this.ltcShort)} class="export-button"> ${translate("settings.exp2")} </div>
|
||||
</div>
|
||||
<div class="content-box">
|
||||
<div style="display: flex; align-items: center; justify-content: center;">
|
||||
<img src="/img/doge.png" style="width: 32px; height: 32px;"> ${this.dogeWALLET}<br>
|
||||
</div>
|
||||
<div @click=${() => this.checkForPmkDownload(this.dogeWALLET, this.dogePMK, this.dogeName, this.dogeShort)} class="export-button"> ${translate("settings.exp2")} </div>
|
||||
</div>
|
||||
<div class="content-box">
|
||||
<div style="display: flex; align-items: center; justify-content: center;">
|
||||
<img src="/img/dgb.png" style="width: 32px; height: 32px;"> ${this.dgbWALLET}<br>
|
||||
</div>
|
||||
<div @click=${() => this.checkForPmkDownload(this.dgbWALLET, this.dgbPMK, this.dgbName, this.dgbShort)} class="export-button"> ${translate("settings.exp2")} </div>
|
||||
</div>
|
||||
<div class="content-box">
|
||||
<div style="display: flex; align-items: center; justify-content: center;">
|
||||
<img src="/img/rvn.png" style="width: 32px; height: 32px;"> ${this.rvnWALLET}<br>
|
||||
</div>
|
||||
<div @click=${() => this.checkForPmkDownload(this.rvnWALLET, this.rvnPMK, this.rvnName, this.rvnShort)} class="export-button"> ${translate("settings.exp2")} </div>
|
||||
</div>
|
||||
<div class="content-box" style="display:${this.enableArrr ? 'block' : 'none'}">
|
||||
<div style="display: flex; align-items: center; justify-content: center;">
|
||||
<img src="/img/arrr.png" style="width: 32px; height: 32px;"> ${this.arrrWALLET}<br>
|
||||
</div>
|
||||
<div @click=${() => this.checkForPmkDownload(this.arrrWALLET, this.arrrPMK, this.arrrName, this.arrrShort)} class="export-button"> ${translate("settings.exp2")} </div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<hr style="margin-top: 20px;">
|
||||
<div class="button-row">
|
||||
<button class="repair-button" title="${translate('nodepage.nchange38')}" @click="${() => this.openRepairLTCDialog()}">${translate("nodepage.nchange38")}</button>
|
||||
</div>
|
||||
</div>
|
||||
<mwc-dialog id="savePkmDialog" scrimClickAction="" escapeKeyAction="">
|
||||
<img src="/img/${this.dCoinShort}.png" style="width: 32px; height: 32px;">
|
||||
<h3>${this.dCoinName} ${translate("settings.exp2")}</h3>
|
||||
<hr>
|
||||
<h4>${translate("settings.address")}: ${this.dWalletAddress}</h4>
|
||||
<mwc-button
|
||||
slot="primaryAction"
|
||||
@click="${() => this.closeSavePkmDialog()}"
|
||||
class="red"
|
||||
>
|
||||
${translate("general.close")}
|
||||
</mwc-button>
|
||||
<mwc-button
|
||||
slot="secondaryAction"
|
||||
@click="${() => this.exportKey(this.dPrivateKey, this.dCoinName, this.dWalletAddress)}"
|
||||
>
|
||||
${translate("settings.exp3")}
|
||||
</mwc-button>
|
||||
</mwc-dialog>
|
||||
<mwc-dialog id="arrrWalletNotSynced" scrimClickAction="" escapeKeyAction="">
|
||||
<img src="/img/arrr.png" style="width: 32px; height: 32px;">
|
||||
<h3>${translate("settings.arrr1")}</h3>
|
||||
<hr>
|
||||
<h4>${translate("settings.arrr2")}</h4>
|
||||
<mwc-button
|
||||
slot="primaryAction"
|
||||
@click="${() => this.closeArrrWalletNotSynced()}"
|
||||
class="red"
|
||||
>
|
||||
${translate("general.close")}
|
||||
</mwc-button>
|
||||
</mwc-dialog>
|
||||
<mwc-dialog id="needCoreUpdate" scrimClickAction="" escapeKeyAction="">
|
||||
<img src="/img/arrr.png" style="width: 32px; height: 32px;">
|
||||
<h3>${translate("settings.arrr3")}</h3>
|
||||
<hr>
|
||||
<h4>${translate("settings.arrr4")}</h4>
|
||||
<mwc-button
|
||||
slot="primaryAction"
|
||||
@click="${() => this.closeNeedCoreUpdate()}"
|
||||
class="red"
|
||||
>
|
||||
${translate("general.close")}
|
||||
</mwc-button>
|
||||
</mwc-dialog>
|
||||
<mwc-dialog id="repairLTCDialog" scrimClickAction="" escapeKeyAction="">
|
||||
<img src="/img/ltc.png" style="width: 32px; height: 32px;">
|
||||
<h3>${translate("nodepage.nchange38")}</h3>
|
||||
<hr>
|
||||
<h4>${translate("nodepage.nchange39")}</h4>
|
||||
<h4>${translate("nodepage.nchange40")}</h4>
|
||||
<mwc-button slot="primaryAction" @click="${() => this.repairLtcWallet()}" class="green">
|
||||
${translate("general.continue")}
|
||||
</mwc-button>
|
||||
<mwc-button slot="secondaryAction" @click="${() => this.closeRepairLTCDialog()}" class="red">
|
||||
${translate("login.lp4")}
|
||||
</mwc-button>
|
||||
</mwc-dialog>
|
||||
<mwc-dialog id="pleaseWaitDialog" scrimClickAction="" escapeKeyAction="">
|
||||
<div class="lds-roller">
|
||||
<div></div>
|
||||
<div></div>
|
||||
<div></div>
|
||||
<div></div>
|
||||
<div></div>
|
||||
<div></div>
|
||||
<div></div>
|
||||
<div></div>
|
||||
</div>
|
||||
<h2>${translate("nodepage.nchange41")}</h2>
|
||||
</mwc-dialog>
|
||||
<mwc-dialog id="okDialog" scrimClickAction="" escapeKeyAction="">
|
||||
<img src="/img/ltc.png" style="width: 32px; height: 32px;">
|
||||
<h3>${translate("nodepage.nchange38")}</h3>
|
||||
<hr>
|
||||
<h3>${translate("nodepage.nchange42")}</h3>
|
||||
</mwc-dialog>
|
||||
<mwc-dialog id="errorDialog" scrimClickAction="" escapeKeyAction="">
|
||||
<img src="/img/ltc.png" style="width: 32px; height: 32px;">
|
||||
<h3>${translate("nodepage.nchange38")}</h3>
|
||||
<hr>
|
||||
<h3>${translate("nodepage.nchange43")}</h3>
|
||||
</mwc-dialog>
|
||||
`
|
||||
}
|
||||
.sub-main {
|
||||
position: relative;
|
||||
text-align: center;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
async firstUpdated() {
|
||||
addTradeBotRoutes(parentEpml)
|
||||
parentEpml.imReady()
|
||||
.content-box {
|
||||
text-align: center;
|
||||
display: inline-block;
|
||||
min-width: 400px;
|
||||
margin-bottom: 10px;
|
||||
margin-left: 10px;
|
||||
margin-top: 20px;
|
||||
}
|
||||
|
||||
await this.fetchArrrWalletAddress()
|
||||
await this.checkArrrWalletPrivateKey()
|
||||
}
|
||||
.export-button {
|
||||
display: inline-flex;
|
||||
flex-direction: column;
|
||||
justify-content: center;
|
||||
align-content: center;
|
||||
border: none;
|
||||
border-radius: 20px;
|
||||
padding-left: 10px;
|
||||
padding-right: 10px;
|
||||
color: white;
|
||||
background: #03a9f4;
|
||||
width: 75%;
|
||||
font-size: 16px;
|
||||
cursor: pointer;
|
||||
height: 40px;
|
||||
margin-top: 1rem;
|
||||
text-transform: uppercase;
|
||||
text-decoration: none;
|
||||
transition: all .2s;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
async fetchArrrWalletAddress() {
|
||||
let resAD = await parentEpml.request('apiCall', {
|
||||
url: `/crosschain/arrr/walletaddress?apiKey=${this.getApiKey()}`,
|
||||
method: 'POST',
|
||||
body: `${store.getState().app.selectedAddress.arrrWallet.seed58}`
|
||||
})
|
||||
.red {
|
||||
--mdc-theme-primary: red;
|
||||
}
|
||||
`
|
||||
}
|
||||
|
||||
if (resAD != null && resAD.error != 1201) {
|
||||
this.arrrWALLET = ''
|
||||
this.enableArrr = true
|
||||
this.arrrWALLET = resAD
|
||||
} else {
|
||||
this.arrrWALLET = ''
|
||||
this.enableArrr = false
|
||||
this.shadowRoot.querySelector('#arrrWalletNotSynced').show()
|
||||
}
|
||||
}
|
||||
constructor() {
|
||||
super()
|
||||
this.theme = localStorage.getItem('qortalTheme') ? localStorage.getItem('qortalTheme') : 'light'
|
||||
this.backupErrorMessage = ''
|
||||
this.btcPMK = store.getState().app.selectedAddress.btcWallet.derivedMasterPrivateKey
|
||||
this.btcWALLET = store.getState().app.selectedAddress.btcWallet.address
|
||||
this.btcName = 'Bitcoin'
|
||||
this.btcShort = 'btc'
|
||||
this.ltcPMK = store.getState().app.selectedAddress.ltcWallet.derivedMasterPrivateKey
|
||||
this.ltcWALLET = store.getState().app.selectedAddress.ltcWallet.address
|
||||
this.ltcName = 'Litecoin'
|
||||
this.ltcShort = 'ltc'
|
||||
this.dogePMK = store.getState().app.selectedAddress.dogeWallet.derivedMasterPrivateKey
|
||||
this.dogeWALLET = store.getState().app.selectedAddress.dogeWallet.address
|
||||
this.dogeName = 'Dogecoin'
|
||||
this.dogeShort = 'doge'
|
||||
this.dgbPMK = store.getState().app.selectedAddress.dgbWallet.derivedMasterPrivateKey
|
||||
this.dgbWALLET = store.getState().app.selectedAddress.dgbWallet.address
|
||||
this.dgbName = 'Digibyte'
|
||||
this.dgbShort = 'dgb'
|
||||
this.rvnPMK = store.getState().app.selectedAddress.rvnWallet.derivedMasterPrivateKey
|
||||
this.rvnWALLET = store.getState().app.selectedAddress.rvnWallet.address
|
||||
this.rvnName = 'Ravencoin'
|
||||
this.rvnShort = 'rvn'
|
||||
this.dWalletAddress = ''
|
||||
this.dPrivateKey = ''
|
||||
this.dCoinName = ''
|
||||
this.dCoinShort = 'btc'
|
||||
}
|
||||
|
||||
async checkArrrWalletPrivateKey() {
|
||||
const myNode = store.getState().app.nodeConfig.knownNodes[store.getState().app.nodeConfig.node]
|
||||
const nodeUrl = myNode.protocol + '://' + myNode.domain + ':' + myNode.port
|
||||
const privateKeyUrl = `${nodeUrl}/crosschain/arrr/walletprivatekey?apiKey=${this.getApiKey()}`
|
||||
render() {
|
||||
return html`
|
||||
<div>
|
||||
<div>
|
||||
<p>
|
||||
${translate("settings.exp4")}
|
||||
</p>
|
||||
</div>
|
||||
<div class="sub-main">
|
||||
<div class="center-box">
|
||||
<div class="content-box">
|
||||
<div style="display: flex; align-items: center; justify-content: center;">
|
||||
<img src="/img/btc.png" style="width: 32px; height: 32px;"> ${this.btcWALLET}<br>
|
||||
</div>
|
||||
<div @click=${() => this.checkForPmkDownload(this.btcWALLET, this.btcPMK, this.btcName, this.btcShort)} class="export-button"> ${translate("settings.exp2")} </div>
|
||||
</div>
|
||||
<div class="content-box">
|
||||
<div style="display: flex; align-items: center; justify-content: center;">
|
||||
<img src="/img/ltc.png" style="width: 32px; height: 32px;"> ${this.ltcWALLET}<br>
|
||||
</div>
|
||||
<div @click=${() => this.checkForPmkDownload(this.ltcWALLET, this.ltcPMK, this.ltcName, this.ltcShort)} class="export-button"> ${translate("settings.exp2")} </div>
|
||||
</div>
|
||||
<div class="content-box">
|
||||
<div style="display: flex; align-items: center; justify-content: center;">
|
||||
<img src="/img/doge.png" style="width: 32px; height: 32px;"> ${this.dogeWALLET}<br>
|
||||
</div>
|
||||
<div @click=${() => this.checkForPmkDownload(this.dogeWALLET, this.dogePMK, this.dogeName, this.dogeShort)} class="export-button"> ${translate("settings.exp2")} </div>
|
||||
</div>
|
||||
<div class="content-box">
|
||||
<div style="display: flex; align-items: center; justify-content: center;">
|
||||
<img src="/img/dgb.png" style="width: 32px; height: 32px;"> ${this.dgbWALLET}<br>
|
||||
</div>
|
||||
<div @click=${() => this.checkForPmkDownload(this.dgbWALLET, this.dgbPMK, this.dgbName, this.dgbShort)} class="export-button"> ${translate("settings.exp2")} </div>
|
||||
</div>
|
||||
<div class="content-box">
|
||||
<div style="display: flex; align-items: center; justify-content: center;">
|
||||
<img src="/img/rvn.png" style="width: 32px; height: 32px;"> ${this.rvnWALLET}<br>
|
||||
</div>
|
||||
<div @click=${() => this.checkForPmkDownload(this.rvnWALLET, this.rvnPMK, this.rvnName, this.rvnShort)} class="export-button"> ${translate("settings.exp2")} </div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<mwc-dialog id="savePkmDialog" scrimClickAction="" escapeKeyAction="">
|
||||
<img src="/img/${this.dCoinShort}.png" style="width: 32px; height: 32px;">
|
||||
<h3>${this.dCoinName} ${translate("settings.exp2")}</h3>
|
||||
<hr>
|
||||
<h4>${translate("settings.address")}: ${this.dWalletAddress}</h4>
|
||||
<mwc-button
|
||||
slot="primaryAction"
|
||||
@click="${() => this.closeSavePkmDialog()}"
|
||||
class="red"
|
||||
>
|
||||
${translate("general.close")}
|
||||
</mwc-button>
|
||||
<mwc-button
|
||||
slot="secondaryAction"
|
||||
@click="${() => this.exportKey(this.dPrivateKey, this.dCoinName, this.dWalletAddress)}"
|
||||
>
|
||||
${translate("settings.exp3")}
|
||||
</mwc-button>
|
||||
</mwc-dialog>
|
||||
</div>
|
||||
`
|
||||
}
|
||||
|
||||
await fetch(privateKeyUrl, {
|
||||
method: 'POST',
|
||||
body: `${store.getState().app.selectedAddress.arrrWallet.seed58}`
|
||||
}).then(res => {
|
||||
if (res.status === 404) {
|
||||
this.arrrPMK = ''
|
||||
this.enableArrr = false
|
||||
this.shadowRoot.querySelector('#needCoreUpdate').show()
|
||||
} else {
|
||||
this.fetchArrrWalletPrivateKey()
|
||||
}
|
||||
})
|
||||
}
|
||||
closeSavePkmDialog() {
|
||||
this.shadowRoot.querySelector('#savePkmDialog').close()
|
||||
}
|
||||
|
||||
async fetchArrrWalletPrivateKey() {
|
||||
let resPK = await parentEpml.request('apiCall', {
|
||||
url: `/crosschain/arrr/walletprivatekey?apiKey=${this.getApiKey()}`,
|
||||
method: 'POST',
|
||||
body: `${store.getState().app.selectedAddress.arrrWallet.seed58}`
|
||||
})
|
||||
checkForPmkDownload(wAddress, wPkm, wName, wShort) {
|
||||
this.dWalletAddress = ''
|
||||
this.dPrivateKey = ''
|
||||
this.dCoinName = ''
|
||||
this.dCoinShort = ''
|
||||
this.dWalletAddress = wAddress
|
||||
this.dPrivateKey = wPkm
|
||||
this.dCoinName = wName
|
||||
this.dCoinShort = wShort
|
||||
this.shadowRoot.querySelector('#savePkmDialog').show()
|
||||
}
|
||||
|
||||
if (resPK != null && resPK.error != 1201) {
|
||||
this.arrrPMK = ''
|
||||
this.enableArrr = true
|
||||
this.arrrPMK = resPK
|
||||
} else {
|
||||
this.arrrPMK = ''
|
||||
this.enableArrr = false
|
||||
this.shadowRoot.querySelector('#arrrWalletNotSynced').show()
|
||||
}
|
||||
}
|
||||
async exportKey(cMasterKey, cName, cAddress) {
|
||||
let exportname = ""
|
||||
const myPrivateMasterKey = cMasterKey
|
||||
const myCoinName = cName
|
||||
const myCoinAddress = cAddress
|
||||
const blob = new Blob([`${myPrivateMasterKey}`], { type: 'text/plain;charset=utf-8' })
|
||||
exportname = "Private_Master_Key_" + myCoinName + "_" + myCoinAddress + ".txt"
|
||||
this.saveFileToDisk(blob, exportname)
|
||||
}
|
||||
|
||||
closeArrrWalletNotSynced() {
|
||||
this.shadowRoot.querySelector('#arrrWalletNotSynced').close()
|
||||
}
|
||||
async saveFileToDisk(blob, fileName) {
|
||||
try {
|
||||
const fileHandle = await self.showSaveFilePicker({
|
||||
suggestedName: fileName,
|
||||
types: [{
|
||||
description: "File",
|
||||
}]
|
||||
})
|
||||
const writeFile = async (fileHandle, contents) => {
|
||||
const writable = await fileHandle.createWritable()
|
||||
await writable.write(contents)
|
||||
await writable.close()
|
||||
}
|
||||
writeFile(fileHandle, blob).then(() => console.log("FILE SAVED"))
|
||||
let snack4string = get("general.save")
|
||||
snackbar.add({
|
||||
labelText: `${snack4string} ${fileName} ✅`,
|
||||
dismiss: true
|
||||
})
|
||||
} catch (error) {
|
||||
if (error.name === 'AbortError') {
|
||||
return
|
||||
}
|
||||
FileSaver.saveAs(blob, fileName)
|
||||
}
|
||||
}
|
||||
|
||||
closeNeedCoreUpdate() {
|
||||
this.arrrPMK = ''
|
||||
this.enableArrr = false
|
||||
this.shadowRoot.querySelector('#needCoreUpdate').close()
|
||||
}
|
||||
|
||||
closeSavePkmDialog() {
|
||||
this.shadowRoot.querySelector('#savePkmDialog').close()
|
||||
}
|
||||
|
||||
openRepairLTCDialog() {
|
||||
this.shadowRoot.querySelector('#repairLTCDialog').show()
|
||||
}
|
||||
|
||||
closeRepairLTCDialog() {
|
||||
this.shadowRoot.querySelector('#repairLTCDialog').close()
|
||||
}
|
||||
|
||||
async repairLtcWallet() {
|
||||
this.shadowRoot.querySelector('#repairLTCDialog').close()
|
||||
this.shadowRoot.querySelector('#pleaseWaitDialog').show()
|
||||
|
||||
let resRepair = await parentEpml.request('apiCall', {
|
||||
url: `/crosschain/ltc/repair?apiKey=${this.getApiKey()}`,
|
||||
method: 'POST',
|
||||
body: `${store.getState().app.selectedAddress.ltcWallet.derivedMasterPrivateKey}`
|
||||
})
|
||||
|
||||
if (resRepair != null && resRepair.error != 128) {
|
||||
this.shadowRoot.querySelector('#pleaseWaitDialog').close()
|
||||
|
||||
await this.openOkDialog()
|
||||
} else {
|
||||
this.shadowRoot.querySelector('#pleaseWaitDialog').close()
|
||||
|
||||
await this.openErrorDialog()
|
||||
}
|
||||
}
|
||||
|
||||
async openOkDialog() {
|
||||
const okDelay = ms => new Promise(res => setTimeout(res, ms))
|
||||
|
||||
this.shadowRoot.querySelector('#okDialog').show()
|
||||
|
||||
await okDelay(3000)
|
||||
|
||||
this.shadowRoot.querySelector('#okDialog').close()
|
||||
}
|
||||
|
||||
async openErrorDialog() {
|
||||
const errorDelay = ms => new Promise(res => setTimeout(res, ms))
|
||||
|
||||
this.shadowRoot.querySelector('#errorDialog').show()
|
||||
|
||||
await errorDelay(3000)
|
||||
|
||||
this.shadowRoot.querySelector('#errorDialog').close()
|
||||
}
|
||||
|
||||
checkForPmkDownload(wAddress, wPkm, wName, wShort) {
|
||||
this.dWalletAddress = ''
|
||||
this.dPrivateKey = ''
|
||||
this.dCoinName = ''
|
||||
this.dCoinShort = ''
|
||||
this.dWalletAddress = wAddress
|
||||
this.dPrivateKey = wPkm
|
||||
this.dCoinName = wName
|
||||
this.dCoinShort = wShort
|
||||
this.shadowRoot.querySelector('#savePkmDialog').show()
|
||||
}
|
||||
|
||||
async exportKey(cMasterKey, cName, cAddress) {
|
||||
let exportname = ''
|
||||
|
||||
const myPrivateMasterKey = cMasterKey
|
||||
const myCoinName = cName
|
||||
const myCoinAddress = cAddress
|
||||
const blob = new Blob([`${myPrivateMasterKey}`], { type: 'text/plain;charset=utf-8' })
|
||||
|
||||
exportname = 'Private_Master_Key_' + myCoinName + '_' + myCoinAddress + '.txt'
|
||||
|
||||
await this.saveFileToDisk(blob, exportname)
|
||||
}
|
||||
|
||||
async saveFileToDisk(blob, fileName) {
|
||||
try {
|
||||
const fileHandle = await self.showSaveFilePicker({
|
||||
suggestedName: fileName,
|
||||
types: [{
|
||||
description: "File"
|
||||
}]
|
||||
})
|
||||
|
||||
const writeFile = async (fileHandle, contents) => {
|
||||
const writable = await fileHandle.createWritable()
|
||||
|
||||
await writable.write(contents)
|
||||
await writable.close()
|
||||
}
|
||||
|
||||
writeFile(fileHandle, blob).then(() => console.log("FILE SAVED"))
|
||||
|
||||
let snack4string = get("general.save")
|
||||
|
||||
snackbar.add({
|
||||
labelText: `${snack4string} ${fileName} ✅`,
|
||||
dismiss: true
|
||||
})
|
||||
} catch (error) {
|
||||
if (error.name === 'AbortError') {
|
||||
return
|
||||
}
|
||||
|
||||
FileSaver.saveAs(blob, fileName)
|
||||
}
|
||||
}
|
||||
|
||||
getApiKey() {
|
||||
const apiNode = store.getState().app.nodeConfig.knownNodes[store.getState().app.nodeConfig.node]
|
||||
return apiNode.apiKey
|
||||
}
|
||||
stateChanged(state) {
|
||||
}
|
||||
}
|
||||
|
||||
window.customElements.define('export-keys', ExportKeys)
|
||||
window.customElements.define('export-keys', ExportKeys)
|
||||
|
@ -1,160 +1,249 @@
|
||||
import { html, LitElement } from 'lit'
|
||||
import { LitElement, html, css } from 'lit'
|
||||
import { connect } from 'pwa-helpers'
|
||||
import { store } from '../../store'
|
||||
import { allowShowSyncIndicator, removeShowSyncIndicator } from '../../redux/app/app-actions'
|
||||
import { doSetQChatNotificationConfig } from '../../redux/user/user-actions'
|
||||
import { notificationsViewStyles } from '../../styles/core-css'
|
||||
import { store } from '../../store.js'
|
||||
import { doSetQChatNotificationConfig } from '../../redux/user/user-actions.js'
|
||||
import { translate, translateUnsafeHTML } from 'lit-translate'
|
||||
import isElectron from 'is-electron'
|
||||
|
||||
import '@material/mwc-checkbox'
|
||||
|
||||
// Multi language support
|
||||
import { translate } from '../../../translate'
|
||||
|
||||
class NotificationsView extends connect(store)(LitElement) {
|
||||
static get properties() {
|
||||
return {
|
||||
notificationConfig: { type: Object },
|
||||
q_chatConfig: { type: Object },
|
||||
theme: { type: String, reflect: true },
|
||||
appNotificationList: { type: Array }
|
||||
}
|
||||
}
|
||||
static get properties() {
|
||||
return {
|
||||
notificationConfig: { type: Object },
|
||||
q_chatConfig: { type: Object },
|
||||
blockConfig: { type: Object },
|
||||
theme: { type: String, reflect: true },
|
||||
appNotificationList: {type: Array}
|
||||
}
|
||||
}
|
||||
|
||||
static get styles() {
|
||||
return [notificationsViewStyles]
|
||||
}
|
||||
constructor() {
|
||||
super()
|
||||
this.notificationConfig = {}
|
||||
this.q_chatConfig = {}
|
||||
this.blockConfig = {}
|
||||
this.theme = localStorage.getItem('qortalTheme') ? localStorage.getItem('qortalTheme') : 'light'
|
||||
this.appNotificationList = [] // Fetch the list of apps from local storage
|
||||
}
|
||||
|
||||
constructor() {
|
||||
super()
|
||||
this.notificationConfig = {}
|
||||
this.q_chatConfig = {}
|
||||
this.theme = localStorage.getItem('qortalTheme') ? localStorage.getItem('qortalTheme') : 'light'
|
||||
this.appNotificationList = []
|
||||
}
|
||||
firstUpdated(){
|
||||
this.appNotificationList = this.getAppsFromStorage();
|
||||
}
|
||||
|
||||
firstUpdated() {
|
||||
this.appNotificationList = this.getAppsFromStorage()
|
||||
}
|
||||
static get styles() {
|
||||
return css`
|
||||
.sub-main {
|
||||
position: relative;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
render() {
|
||||
return html`
|
||||
<div class="sub-main">
|
||||
<div class="notification-box">
|
||||
<div class="content-box">
|
||||
<h4>Q-Chat ${translate("settings.notifications")}</h4>
|
||||
<div style="line-height: 3rem;">
|
||||
<mwc-checkbox id="qChatPlaySound" @click=${e => this.setQChatNotificationConfig({ type: 'PLAY_SOUND', value: e.target.checked })} ?checked=${this.q_chatConfig.playSound}></mwc-checkbox>
|
||||
<label
|
||||
for="qChatPlaySound"
|
||||
@click=${() => this.shadowRoot.getElementById('qChatPlaySound').click()}
|
||||
>
|
||||
${translate("settings.playsound")}
|
||||
</label>
|
||||
</div>
|
||||
<div style="line-height: 3rem;">
|
||||
<mwc-checkbox id="qChatShowNotification" @click=${e => this.setQChatNotificationConfig({ type: 'SHOW_NOTIFICATION', value: e.target.checked })} ?checked=${this.q_chatConfig.showNotification}></mwc-checkbox>
|
||||
<label
|
||||
for="qChatShowNotification"
|
||||
@click=${() => this.shadowRoot.getElementById('qChatShowNotification').click()}
|
||||
>
|
||||
${translate("settings.shownotifications")}
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="content-box">
|
||||
<h4>${translate("settings.qappNotification1")}</h4>
|
||||
${this.appNotificationList.map((app) => html`
|
||||
<div style="display: flex; justify-content: space-between; margin-top: 10px;">
|
||||
${app}
|
||||
<button class="remove-button" @click=${() => this.removeApp(app)}>Remove</button>
|
||||
</div>
|
||||
`)}
|
||||
</div>
|
||||
</div>
|
||||
<div class="checkbox-row">
|
||||
<label for="syncIndicator" id="syncIndicatorLabel" style="color: var(--black);">
|
||||
${translate("settings.sync_indicator")}
|
||||
</label>
|
||||
<mwc-checkbox style="margin-right: -15px;" id="syncIndicator" @click=${(e) => this.checkForSyncMessages(e)} ?checked=${store.getState().app.showSyncIndicator}></mwc-checkbox>
|
||||
</div>
|
||||
${this.renderSetCoreButton()}
|
||||
</div>
|
||||
`
|
||||
}
|
||||
.notification-box {
|
||||
display: block;
|
||||
position: relative;
|
||||
top: 45%;
|
||||
left: 50%;
|
||||
transform: translate(-50%, 0%);
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
getAppsFromStorage() {
|
||||
const address = store.getState().app.selectedAddress.address
|
||||
const id = `appNotificationList-${address}`
|
||||
const data = localStorage.getItem(id)
|
||||
@media(min-width: 1400px) {
|
||||
.notification-box {
|
||||
display: grid;
|
||||
grid-template-columns: 1fr 1fr;
|
||||
grid-gap: 30px;
|
||||
}
|
||||
}
|
||||
|
||||
return data ? Object.keys(JSON.parse(data)) : []
|
||||
}
|
||||
.content-box {
|
||||
border: 1px solid #a1a1a1;
|
||||
padding: 10px 25px;
|
||||
text-align: left;
|
||||
display: inline-block;
|
||||
min-width: 350px;
|
||||
min-height: 150px;
|
||||
margin: 20px 0;
|
||||
}
|
||||
|
||||
removeApp(appName) {
|
||||
// Remove the app from local storage
|
||||
this.removeAppFromStorage(appName)
|
||||
h4 {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
// Update the apps list in the component
|
||||
this.appNotificationList = this.appNotificationList.filter(app => app !== appName)
|
||||
}
|
||||
mwc-checkbox::shadow .mdc-checkbox::after, mwc-checkbox::shadow .mdc-checkbox::before {
|
||||
background-color:var(--mdc-theme-primary)
|
||||
}
|
||||
|
||||
removeAppFromStorage(appName) {
|
||||
// Your method to remove the app from local storage
|
||||
const address = store.getState().app.selectedAddress.address
|
||||
const id = `appNotificationList-${address}`
|
||||
const data = JSON.parse(localStorage.getItem(id) || '{}')
|
||||
label:hover {
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
delete data[appName]
|
||||
.title {
|
||||
font-weight: 600;
|
||||
font-size: 15px;
|
||||
display: block;
|
||||
line-height: 32px;
|
||||
opacity: 0.66;
|
||||
}
|
||||
|
||||
localStorage.setItem(id, JSON.stringify(data));
|
||||
}
|
||||
.value {
|
||||
font-size: 16px;
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
renderSetCoreButton() {
|
||||
if (!isElectron()) {
|
||||
return html``
|
||||
} else {
|
||||
return html`
|
||||
<div style="max-width: 500px; display: flex; justify-content: center; margin: auto;">
|
||||
<div @click=${() => this.checkCoreSettings()} class="q-button">${translate("settings.core")}</div>
|
||||
</div>
|
||||
`
|
||||
}
|
||||
}
|
||||
.q-button {
|
||||
display: inline-flex;
|
||||
flex-direction: column;
|
||||
justify-content: center;
|
||||
align-content: center;
|
||||
border: none;
|
||||
border-radius: 20px;
|
||||
padding-left: 25px;
|
||||
padding-right: 25px;
|
||||
color: white;
|
||||
background: #03a9f4;
|
||||
width: 50%;
|
||||
font-size: 17px;
|
||||
cursor: pointer;
|
||||
height: 50px;
|
||||
margin-top: 1rem;
|
||||
text-transform: uppercase;
|
||||
text-decoration: none;
|
||||
transition: all .2s;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
checkCoreSettings() {
|
||||
window.electronAPI.setStartCore()
|
||||
}
|
||||
.remove-button {
|
||||
font-family: Roboto, sans-serif;
|
||||
font-size: 16px;
|
||||
color: var(--mdc-theme-primary);
|
||||
background-color: transparent;
|
||||
padding: 8px 10px;
|
||||
border-radius: 5px;
|
||||
border: none;
|
||||
transition: all 0.3s ease-in-out;
|
||||
cursor: pointer;
|
||||
}
|
||||
`
|
||||
}
|
||||
|
||||
checkForSyncMessages(e) {
|
||||
if (e.target.checked) {
|
||||
store.dispatch(removeShowSyncIndicator(false))
|
||||
} else {
|
||||
store.dispatch(allowShowSyncIndicator(true))
|
||||
}
|
||||
}
|
||||
render() {
|
||||
return html`
|
||||
<div class="sub-main">
|
||||
<div class="notification-box">
|
||||
<div class="content-box">
|
||||
<h4> Q-Chat ${translate("settings.notifications")} </h4>
|
||||
|
||||
stateChanged(state) {
|
||||
this.notificationConfig = state.user.notifications
|
||||
this.q_chatConfig = this.notificationConfig.q_chat
|
||||
}
|
||||
<div style="line-height: 3rem;">
|
||||
<mwc-checkbox id="qChatPlaySound" @click=${e => this.setQChatNotificationConfig({ type: 'PLAY_SOUND', value: e.target.checked })} ?checked=${this.q_chatConfig.playSound}></mwc-checkbox>
|
||||
<label
|
||||
for="qChatPlaySound"
|
||||
@click=${() => this.shadowRoot.getElementById('qChatPlaySound').click()}
|
||||
>${translate("settings.playsound")}</label>
|
||||
</div>
|
||||
|
||||
setQChatNotificationConfig(valueObject) {
|
||||
if (valueObject.type === 'PLAY_SOUND') {
|
||||
let data = {
|
||||
playSound: !valueObject.value,
|
||||
showNotification: this.q_chatConfig.showNotification
|
||||
}
|
||||
<div style="line-height: 3rem;">
|
||||
<mwc-checkbox id="qChatShowNotification" @click=${e => this.setQChatNotificationConfig({ type: 'SHOW_NOTIFICATION', value: e.target.checked })} ?checked=${this.q_chatConfig.showNotification}></mwc-checkbox>
|
||||
<label
|
||||
for="qChatShowNotification"
|
||||
@click=${() => this.shadowRoot.getElementById('qChatShowNotification').click()}
|
||||
>${translate("settings.shownotifications")}</label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="content-box">
|
||||
<h4> ${translate("settings.block")} </h4>
|
||||
|
||||
<div style="line-height: 3rem;">
|
||||
<mwc-checkbox indeterminate disabled id="blockPlaySound"></mwc-checkbox>
|
||||
<label for="blockPlaySound">${translate("settings.playsound")}</label>
|
||||
</div>
|
||||
|
||||
<div style="line-height: 3rem;">
|
||||
<mwc-checkbox indeterminate disabled id="blockShowNotification"></mwc-checkbox>
|
||||
<label for="blockShowNotification">${translate("settings.shownotifications")}</label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="content-box">
|
||||
<h4>${translate("settings.qappNotification1")}</h4>
|
||||
${this.appNotificationList.map((app)=> html`
|
||||
<div style="display: flex; justify-content: space-between; margin-top: 10px;">
|
||||
${app}
|
||||
<button class="remove-button" @click=${() => this.removeApp(app)}>Remove</button>
|
||||
</div>
|
||||
`)}
|
||||
|
||||
</div>
|
||||
</div>
|
||||
${this.renderSetCoreButton()}
|
||||
</div>
|
||||
`
|
||||
}
|
||||
|
||||
getAppsFromStorage() {
|
||||
// Your method to fetch the list of apps from local storage
|
||||
// Example:
|
||||
const address= store.getState().app.selectedAddress.address
|
||||
const id = `appNotificationList-${address}`;
|
||||
const data = localStorage.getItem(id);
|
||||
return data ? Object.keys(JSON.parse(data)) : [];
|
||||
}
|
||||
|
||||
removeApp(appName) {
|
||||
// Remove the app from local storage
|
||||
this.removeAppFromStorage(appName);
|
||||
// Update the apps list in the component
|
||||
this.appNotificationList = this.appNotificationList.filter(app => app !== appName);
|
||||
}
|
||||
|
||||
removeAppFromStorage(appName) {
|
||||
// Your method to remove the app from local storage
|
||||
const address= store.getState().app.selectedAddress.address
|
||||
const id = `appNotificationList-${address}`;
|
||||
const data = JSON.parse(localStorage.getItem(id) || '{}');
|
||||
delete data[appName];
|
||||
localStorage.setItem(id, JSON.stringify(data));
|
||||
}
|
||||
|
||||
renderSetCoreButton() {
|
||||
if (!isElectron()) {
|
||||
return html``
|
||||
} else {
|
||||
return html`
|
||||
<div style="max-width: 500px; display: flex; justify-content: center; margin: auto;">
|
||||
<div @click=${() => this.checkCoreSettings()} class="q-button"> ${translate("settings.core")} </div>
|
||||
</div>
|
||||
`
|
||||
}
|
||||
}
|
||||
|
||||
checkCoreSettings() {
|
||||
window.electronAPI.setStartCore()
|
||||
}
|
||||
|
||||
stateChanged(state) {
|
||||
this.notificationConfig = state.user.notifications
|
||||
this.q_chatConfig = this.notificationConfig.q_chat
|
||||
this.blockConfig = this.notificationConfig.block
|
||||
}
|
||||
|
||||
setQChatNotificationConfig(valueObject) {
|
||||
if (valueObject.type === 'PLAY_SOUND') {
|
||||
let data = {
|
||||
playSound: !valueObject.value,
|
||||
showNotification: this.q_chatConfig.showNotification
|
||||
}
|
||||
store.dispatch(doSetQChatNotificationConfig(data))
|
||||
} if (valueObject.type === 'SHOW_NOTIFICATION') {
|
||||
|
||||
let data = {
|
||||
playSound: this.q_chatConfig.playSound,
|
||||
showNotification: !valueObject.value
|
||||
}
|
||||
store.dispatch(doSetQChatNotificationConfig(data))
|
||||
}
|
||||
}
|
||||
|
||||
store.dispatch(doSetQChatNotificationConfig(data))
|
||||
} if (valueObject.type === 'SHOW_NOTIFICATION') {
|
||||
let data = {
|
||||
playSound: this.q_chatConfig.playSound,
|
||||
showNotification: !valueObject.value
|
||||
}
|
||||
|
||||
store.dispatch(doSetQChatNotificationConfig(data))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
window.customElements.define('notifications-view', NotificationsView)
|
||||
window.customElements.define('notifications-view', NotificationsView)
|
||||
|
@ -1,91 +1,140 @@
|
||||
import { html, LitElement } from 'lit'
|
||||
import { css, html, LitElement } from 'lit'
|
||||
import { connect } from 'pwa-helpers'
|
||||
import { store } from '../../store'
|
||||
import { qrLoginViewStyles } from '../../styles/core-css'
|
||||
import '../../../../plugins/plugins/core/components/QortalQrcodeGenerator'
|
||||
import '@material/mwc-icon'
|
||||
import '@material/mwc-textfield'
|
||||
import '@vaadin/password-field/vaadin-password-field.js'
|
||||
import { store } from '../../store.js'
|
||||
import { translate } from 'lit-translate'
|
||||
|
||||
// Multi language support
|
||||
import { translate } from '../../../translate'
|
||||
import '@material/mwc-textfield'
|
||||
import '@material/mwc-icon'
|
||||
import '@vaadin/password-field/vaadin-password-field.js'
|
||||
import '../../../../plugins/plugins/core/components/QortalQrcodeGenerator.js'
|
||||
|
||||
class QRLoginView extends connect(store)(LitElement) {
|
||||
static get properties() {
|
||||
return {
|
||||
theme: { type: String, reflect: true },
|
||||
savedWalletDataJson: { type: String },
|
||||
translateDescriptionKey: { type: String },
|
||||
translateButtonKey: { type: String }
|
||||
}
|
||||
}
|
||||
static get properties() {
|
||||
return {
|
||||
theme: { type: String, reflect: true },
|
||||
savedWalletDataJson: { type: String },
|
||||
translateDescriptionKey: { type: String }, // Description text
|
||||
translateButtonKey: { type: String }, // Button text
|
||||
}
|
||||
}
|
||||
|
||||
static get styles() {
|
||||
return [qrLoginViewStyles]
|
||||
}
|
||||
static get styles() {
|
||||
return css`
|
||||
* {
|
||||
--lumo-primary-text-color: rgb(0, 167, 245);
|
||||
--lumo-primary-color-50pct: rgba(0, 167, 245, 0.5);
|
||||
--lumo-primary-color-10pct: rgba(0, 167, 245, 0.1);
|
||||
--lumo-primary-color: hsl(199, 100%, 48%);
|
||||
--lumo-base-color: var(--white);
|
||||
--lumo-body-text-color: var(--black);
|
||||
--lumo-secondary-text-color: var(--sectxt);
|
||||
--lumo-contrast-60pct: var(--vdicon);
|
||||
}
|
||||
|
||||
constructor() {
|
||||
super()
|
||||
this.theme = localStorage.getItem('qortalTheme') ? localStorage.getItem('qortalTheme') : 'light'
|
||||
this.translateDescriptionKey = 'settings.qr_login_description_' + (this.isWalletStored() ? '1' : '2')
|
||||
this.translateButtonKey = 'settings.qr_login_button_' + (this.isWalletStored() ? '1' : '2')
|
||||
}
|
||||
.center-box {
|
||||
position: relative;
|
||||
top: 45%;
|
||||
left: 50%;
|
||||
transform: translate(-50%, 0%);
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
render() {
|
||||
return html`
|
||||
<div style="position: relative;" >
|
||||
<div class="center-box">
|
||||
<p>
|
||||
${translate(this.translateDescriptionKey)}
|
||||
</p>
|
||||
<div style="max-width: 500px; justify-content: center; margin: auto; display: ${this.isWalletStored() ? 'none' : 'flex'}">
|
||||
<mwc-icon style="padding: 10px; padding-left:0; padding-top: 42px;">password</mwc-icon>
|
||||
<vaadin-password-field id="newWalletPassword" style="width: 100%; color: var(--black);" label="${translate("settings.password")}" autofocus></vaadin-password-field>
|
||||
</div>
|
||||
<div style="max-width: 600px; display: flex; justify-content: center; margin: auto;">
|
||||
<div id="qr-toggle-button" @click=${() => this.showQRCode()} class="q-button outlined"> ${translate(this.translateButtonKey)} </div>
|
||||
</div>
|
||||
<div id="login-qr-code" style="display: none;">
|
||||
<qortal-qrcode-generator id="login-qr-code" data="${this.savedWalletDataJson}" mode="octet" format="html" auto></qortal-qrcode-generator>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
`
|
||||
}
|
||||
.q-button {
|
||||
display: inline-flex;
|
||||
flex-direction: column;
|
||||
justify-content: center;
|
||||
align-content: center;
|
||||
border: none;
|
||||
border-radius: 20px;
|
||||
padding-left: 25px;
|
||||
padding-right: 25px;
|
||||
color: white;
|
||||
background: #03a9f4;
|
||||
width: 50%;
|
||||
font-size: 17px;
|
||||
cursor: pointer;
|
||||
height: 50px;
|
||||
margin-top: 1rem;
|
||||
text-transform: uppercase;
|
||||
text-decoration: none;
|
||||
transition: all .2s;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.q-button.outlined {
|
||||
background: unset;
|
||||
border: 1px solid #03a9f4;
|
||||
}
|
||||
|
||||
:host([theme="light"]) .q-button.outlined {
|
||||
color: #03a9f4;
|
||||
}
|
||||
|
||||
#qr-toggle-button {
|
||||
margin-left: 12px;
|
||||
}
|
||||
|
||||
#login-qr-code {
|
||||
margin: auto;
|
||||
}
|
||||
`
|
||||
}
|
||||
|
||||
isWalletStored() {
|
||||
const state = store.getState()
|
||||
const address0 = state.app.wallet._addresses[0].address
|
||||
const savedWalletData = state.user.storedWallets && state.user.storedWallets[address0]
|
||||
constructor() {
|
||||
super()
|
||||
this.theme = localStorage.getItem('qortalTheme') ? localStorage.getItem('qortalTheme') : 'light'
|
||||
this.translateDescriptionKey = 'settings.qr_login_description_' + (this.isWalletStored() ? '1' : '2')
|
||||
this.translateButtonKey = 'settings.qr_login_button_' + (this.isWalletStored() ? '1' : '2')
|
||||
}
|
||||
|
||||
return !!savedWalletData
|
||||
}
|
||||
render() {
|
||||
return html`
|
||||
<div style="position: relative;" >
|
||||
<div class="center-box">
|
||||
<p>
|
||||
${translate(this.translateDescriptionKey)}
|
||||
</p>
|
||||
<div style="max-width: 500px; justify-content: center; margin: auto; display: ${this.isWalletStored() ? 'none' : 'flex' }">
|
||||
<mwc-icon style="padding: 10px; padding-left:0; padding-top: 42px;">password</mwc-icon>
|
||||
<vaadin-password-field id="newWalletPassword" style="width: 100%; color: var(--black);" label="${translate("settings.password")}" autofocus></vaadin-password-field>
|
||||
</div>
|
||||
<div style="max-width: 600px; display: flex; justify-content: center; margin: auto;">
|
||||
<div id="qr-toggle-button" @click=${() => this.showQRCode()} class="q-button outlined"> ${translate(this.translateButtonKey)} </div>
|
||||
</div>
|
||||
|
||||
<div id="login-qr-code" style="display: none;">
|
||||
<qortal-qrcode-generator id="login-qr-code" data="${this.savedWalletDataJson}" mode="octet" format="html" auto></qortal-qrcode-generator>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
`
|
||||
}
|
||||
|
||||
async setSavedWalletDataJson() {
|
||||
const state = store.getState()
|
||||
isWalletStored() {
|
||||
const state = store.getState()
|
||||
const address0 = state.app.wallet._addresses[0].address
|
||||
const savedWalletData = state.user.storedWallets && state.user.storedWallets[address0]
|
||||
return !!savedWalletData
|
||||
}
|
||||
|
||||
let data
|
||||
async setSavedWalletDataJson() {
|
||||
const state = store.getState()
|
||||
let data
|
||||
if (this.isWalletStored()) { // if the wallet is stored, we use the existing encrypted backup
|
||||
const address0 = state.app.wallet._addresses[0].address
|
||||
data = state.user.storedWallets[address0]
|
||||
} else { // if the wallet is not stored, we generate new `saveWalletData` backup encrypted with the new password
|
||||
const password = this.shadowRoot.getElementById('newWalletPassword').value
|
||||
data = await state.app.wallet.generateSaveWalletData(password, state.config.crypto.kdfThreads, () => { })
|
||||
}
|
||||
this.savedWalletDataJson = JSON.stringify(data)
|
||||
}
|
||||
|
||||
if (this.isWalletStored()) {
|
||||
const address0 = state.app.wallet._addresses[0].address
|
||||
|
||||
data = state.user.storedWallets[address0]
|
||||
} else {
|
||||
const password = this.shadowRoot.getElementById('newWalletPassword').value
|
||||
|
||||
data = await state.app.wallet.generateSaveWalletData(password, state.config.crypto.kdfThreads, () => { })
|
||||
}
|
||||
|
||||
this.savedWalletDataJson = JSON.stringify(data)
|
||||
}
|
||||
|
||||
async showQRCode() {
|
||||
await this.setSavedWalletDataJson()
|
||||
|
||||
let el = this.shadowRoot.getElementById('login-qr-code')
|
||||
|
||||
el.style.display = 'flex'
|
||||
}
|
||||
async showQRCode() {
|
||||
await this.setSavedWalletDataJson()
|
||||
let el = this.shadowRoot.getElementById('login-qr-code')
|
||||
el.style.display = 'flex'
|
||||
}
|
||||
}
|
||||
|
||||
window.customElements.define('qr-login-view', QRLoginView)
|
||||
window.customElements.define('qr-login-view', QRLoginView)
|
||||
|
@ -1,202 +1,229 @@
|
||||
import { html, LitElement } from 'lit'
|
||||
import { LitElement, html, css } from 'lit'
|
||||
import { connect } from 'pwa-helpers'
|
||||
import { store } from '../../store'
|
||||
import {
|
||||
allowQAPPAutoAuth,
|
||||
allowQAPPAutoFriendsList,
|
||||
allowQAPPAutoLists,
|
||||
removeQAPPAutoAuth,
|
||||
removeQAPPAutoFriendsList,
|
||||
removeQAPPAutoLists,
|
||||
setIsOpenDevDialog
|
||||
} from '../../redux/app/app-actions'
|
||||
import { securityViewStyles } from '../../styles/core-css'
|
||||
import { store } from '../../store.js'
|
||||
import { allowQAPPAutoAuth, removeQAPPAutoAuth, removeQAPPAutoLists, allowQAPPAutoLists, setIsOpenDevDialog } from '../../redux/app/app-actions.js'
|
||||
import { use, get, translate, translateUnsafeHTML, registerTranslateConfig } from 'lit-translate'
|
||||
import snackbar from '../../functional-components/snackbar.js'
|
||||
import FileSaver from 'file-saver'
|
||||
import snackbar from '../../functional-components/snackbar'
|
||||
|
||||
import '@material/mwc-checkbox'
|
||||
import '@material/mwc-icon'
|
||||
import '@material/mwc-textfield'
|
||||
import '@material/mwc-icon'
|
||||
import '@vaadin/password-field/vaadin-password-field.js'
|
||||
|
||||
// Multi language support
|
||||
import { get, translate } from '../../../translate'
|
||||
|
||||
class SecurityView extends connect(store)(LitElement) {
|
||||
static get properties() {
|
||||
return {
|
||||
theme: { type: String, reflect: true },
|
||||
backupErrorMessage: { type: String },
|
||||
closeSettings: { attribute: false }
|
||||
}
|
||||
}
|
||||
static get properties() {
|
||||
return {
|
||||
theme: { type: String, reflect: true },
|
||||
backupErrorMessage: { type: String },
|
||||
closeSettings: {attribute: false}
|
||||
}
|
||||
}
|
||||
|
||||
static get styles() {
|
||||
return [securityViewStyles]
|
||||
}
|
||||
static get styles() {
|
||||
return css`
|
||||
* {
|
||||
--lumo-primary-text-color: rgb(0, 167, 245);
|
||||
--lumo-primary-color-50pct: rgba(0, 167, 245, 0.5);
|
||||
--lumo-primary-color-10pct: rgba(0, 167, 245, 0.1);
|
||||
--lumo-primary-color: hsl(199, 100%, 48%);
|
||||
--lumo-base-color: var(--white);
|
||||
--lumo-body-text-color: var(--black);
|
||||
--lumo-secondary-text-color: var(--sectxt);
|
||||
--lumo-contrast-60pct: var(--vdicon);
|
||||
--mdc-checkbox-unchecked-color: var(--black);
|
||||
--mdc-theme-on-surface: var(--black);
|
||||
--mdc-checkbox-disabled-color: var(--black);
|
||||
--mdc-checkbox-ink-color: var(--black);
|
||||
}
|
||||
|
||||
constructor() {
|
||||
super()
|
||||
this.theme = localStorage.getItem('qortalTheme') ? localStorage.getItem('qortalTheme') : 'light'
|
||||
this.backupErrorMessage = ''
|
||||
}
|
||||
.center-box {
|
||||
position: relative;
|
||||
top: 45%;
|
||||
left: 50%;
|
||||
transform: translate(-50%, 0%);
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
render() {
|
||||
return html`
|
||||
<div style="position: relative;" >
|
||||
<div class="center-box">
|
||||
<p>
|
||||
${translate("settings.choose")}
|
||||
</p>
|
||||
<div style="max-width: 500px; display: flex; justify-content: center; margin: auto;">
|
||||
<mwc-icon style="padding: 10px; padding-left:0; padding-top: 42px;">password</mwc-icon>
|
||||
<vaadin-password-field
|
||||
style="width: 100%; color: var(--black);"
|
||||
label="${translate("settings.password")}"
|
||||
id="downloadBackupPassword"
|
||||
helper-text="${translate("login.passwordhint")}"
|
||||
autofocus
|
||||
></vaadin-password-field>
|
||||
</div>
|
||||
<div style="max-width: 500px; display: flex; justify-content: center; margin: auto;">
|
||||
<mwc-icon style="padding: 10px; padding-left:0; padding-top: 42px;">password</mwc-icon>
|
||||
<vaadin-password-field
|
||||
style="width: 100%; color: var(--black);"
|
||||
label="${translate("login.confirmpass")}"
|
||||
id="rePassword"
|
||||
></vaadin-password-field>
|
||||
</div>
|
||||
<div style="text-align: center; color: var(--mdc-theme-error); text-transform: uppercase; font-size: 15px;">
|
||||
${this.backupErrorMessage}
|
||||
</div>
|
||||
<div style="max-width: 500px; display: flex; justify-content: center; margin: auto;">
|
||||
<div @click=${() => this.checkForDownload()} class="q-button"> ${translate("settings.download")} </div>
|
||||
</div>
|
||||
</div>
|
||||
<hr style="margin-top: 20px;">
|
||||
<div class="checkbox-row">
|
||||
<label for="authButton" id="authButtonLabel" style="color: var(--black);">
|
||||
${get('browserpage.bchange26')}
|
||||
</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="authButton" id="authButtonLabel" style="color: var(--black);">
|
||||
${get('browserpage.bchange39')}
|
||||
</label>
|
||||
<mwc-checkbox style="margin-right: -15px;" id="authButton" @click=${(e) => this.checkForLists(e)} ?checked=${store.getState().app.qAPPAutoLists}></mwc-checkbox>
|
||||
</div>
|
||||
<div class="checkbox-row">
|
||||
<label for="authButton" id="authButtonLabel" style="color: var(--black);">
|
||||
${get('browserpage.bchange53')}
|
||||
</label>
|
||||
<mwc-checkbox style="margin-right: -15px;" id="authButton" @click=${(e) => this.checkForFriends(e)} ?checked=${store.getState().app.qAPPFriendsList}></mwc-checkbox>
|
||||
</div>
|
||||
<div class="checkbox-row">
|
||||
<button class="add-dev-button" title="${translate('tabmenu.tm18')}" @click=${this.openDevDialog}>
|
||||
${translate('tabmenu.tm38')}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
`
|
||||
}
|
||||
.checkbox-row {
|
||||
position: relative;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
align-content: center;
|
||||
font-family: Montserrat, sans-serif;
|
||||
font-weight: 600;
|
||||
color: var(--black);
|
||||
}
|
||||
|
||||
checkForAuth(e) {
|
||||
if (e.target.checked) {
|
||||
store.dispatch(removeQAPPAutoAuth(false))
|
||||
} else {
|
||||
store.dispatch(allowQAPPAutoAuth(true))
|
||||
}
|
||||
}
|
||||
.q-button {
|
||||
display: inline-flex;
|
||||
flex-direction: column;
|
||||
justify-content: center;
|
||||
align-content: center;
|
||||
border: none;
|
||||
border-radius: 20px;
|
||||
padding-left: 25px;
|
||||
padding-right: 25px;
|
||||
color: white;
|
||||
background: #03a9f4;
|
||||
width: 50%;
|
||||
font-size: 17px;
|
||||
cursor: pointer;
|
||||
height: 50px;
|
||||
margin-top: 1rem;
|
||||
text-transform: uppercase;
|
||||
text-decoration: none;
|
||||
transition: all .2s;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
checkForLists(e) {
|
||||
if (e.target.checked) {
|
||||
store.dispatch(removeQAPPAutoLists(false))
|
||||
} else {
|
||||
store.dispatch(allowQAPPAutoLists(true))
|
||||
}
|
||||
}
|
||||
.add-dev-button {
|
||||
margin-top: 4px;
|
||||
max-height: 28px;
|
||||
padding: 5px 5px;
|
||||
font-size: 14px;
|
||||
background-color: #03a9f4;
|
||||
color: white;
|
||||
border: 1px solid transparent;
|
||||
border-radius: 3px;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
checkForFriends(e) {
|
||||
if (e.target.checked) {
|
||||
store.dispatch(removeQAPPAutoFriendsList(false))
|
||||
} else {
|
||||
store.dispatch(allowQAPPAutoFriendsList(true))
|
||||
}
|
||||
}
|
||||
.add-dev-button:hover {
|
||||
opacity: 0.8;
|
||||
cursor: pointer;
|
||||
}
|
||||
`
|
||||
}
|
||||
|
||||
checkForDownload() {
|
||||
const checkPass = this.shadowRoot.getElementById('downloadBackupPassword').value
|
||||
const rePass = this.shadowRoot.getElementById('rePassword').value
|
||||
constructor() {
|
||||
super()
|
||||
this.theme = localStorage.getItem('qortalTheme') ? localStorage.getItem('qortalTheme') : 'light'
|
||||
this.backupErrorMessage = ''
|
||||
}
|
||||
|
||||
if (checkPass === '') {
|
||||
this.backupErrorMessage = get("login.pleaseenter")
|
||||
} else if (checkPass.length < 5) {
|
||||
this.backupErrorMessage = get("login.lessthen8-2")
|
||||
} else if (checkPass != rePass) {
|
||||
this.backupErrorMessage = get("login.notmatch")
|
||||
} else {
|
||||
this.downloadBackup()
|
||||
}
|
||||
}
|
||||
render() {
|
||||
return html`
|
||||
<div style="position: relative;" >
|
||||
<div class="center-box">
|
||||
<p>
|
||||
${translate("settings.choose")}
|
||||
</p>
|
||||
<div style="max-width: 500px; display: flex; justify-content: center; margin: auto;">
|
||||
<mwc-icon style="padding: 10px; padding-left:0; padding-top: 42px;">password</mwc-icon>
|
||||
<vaadin-password-field
|
||||
style="width: 100%; color: var(--black);"
|
||||
label="${translate("settings.password")}"
|
||||
id="downloadBackupPassword"
|
||||
helper-text="${translate("login.passwordhint")}"
|
||||
autofocus
|
||||
>
|
||||
</vaadin-password-field>
|
||||
</div>
|
||||
<div style="text-align: center; color: var(--mdc-theme-error); text-transform: uppercase; font-size: 15px;">
|
||||
${this.backupErrorMessage}
|
||||
</div>
|
||||
<div style="max-width: 500px; display: flex; justify-content: center; margin: auto;">
|
||||
<div @click=${() => this.checkForDownload()} class="q-button"> ${translate("settings.download")} </div>
|
||||
</div>
|
||||
</div>
|
||||
<hr style="margin-top: 20px;">
|
||||
<div class="checkbox-row">
|
||||
<label for="authButton" id="authButtonLabel" style="color: var(--black);">
|
||||
${get('browserpage.bchange26')}
|
||||
</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="authButton" id="authButtonLabel" style="color: var(--black);">
|
||||
${get('browserpage.bchange39')}
|
||||
</label>
|
||||
<mwc-checkbox style="margin-right: -15px;" id="authButton" @click=${(e) => this.checkForLists(e)} ?checked=${store.getState().app.qAPPAutoLists}></mwc-checkbox>
|
||||
</div>
|
||||
<div class="checkbox-row">
|
||||
<button
|
||||
class="add-dev-button"
|
||||
title="${translate('tabmenu.tm18')}"
|
||||
@click=${this.openDevDialog}
|
||||
>${translate('tabmenu.tm38')}</button>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
`
|
||||
}
|
||||
|
||||
openDevDialog() {
|
||||
this.closeSettings()
|
||||
store.dispatch(setIsOpenDevDialog(true))
|
||||
}
|
||||
stateChanged(state) {
|
||||
}
|
||||
|
||||
async downloadBackup() {
|
||||
let backupname = ''
|
||||
checkForAuth(e) {
|
||||
if (e.target.checked) {
|
||||
store.dispatch(removeQAPPAutoAuth(false))
|
||||
} else {
|
||||
store.dispatch(allowQAPPAutoAuth(true))
|
||||
}
|
||||
}
|
||||
checkForLists(e) {
|
||||
if (e.target.checked) {
|
||||
store.dispatch(removeQAPPAutoLists(false))
|
||||
} else {
|
||||
store.dispatch(allowQAPPAutoLists(true))
|
||||
}
|
||||
}
|
||||
|
||||
this.backupErrorMessage = ''
|
||||
checkForDownload() {
|
||||
const checkPass = this.shadowRoot.getElementById('downloadBackupPassword').value
|
||||
if (checkPass === '') {
|
||||
this.backupErrorMessage = get("login.pleaseenter")
|
||||
} else if (checkPass.length < 8) {
|
||||
this.backupErrorMessage = get("login.lessthen8-2")
|
||||
} else {
|
||||
this.downloadBackup()
|
||||
}
|
||||
}
|
||||
|
||||
const state = store.getState()
|
||||
const password = this.shadowRoot.getElementById('downloadBackupPassword').value
|
||||
const data = await state.app.wallet.generateSaveWalletData(password, state.config.crypto.kdfThreads, () => { })
|
||||
const dataString = JSON.stringify(data)
|
||||
const blob = new Blob([dataString], { type: 'text/plain;charset=utf-8' })
|
||||
openDevDialog() {
|
||||
this.closeSettings()
|
||||
store.dispatch(setIsOpenDevDialog(true))
|
||||
}
|
||||
|
||||
backupname = 'qortal_backup_' + state.app.selectedAddress.address + '.json'
|
||||
async downloadBackup() {
|
||||
let backupname = ''
|
||||
this.backupErrorMessage = ''
|
||||
const state = store.getState()
|
||||
const password = this.shadowRoot.getElementById('downloadBackupPassword').value
|
||||
const data = await state.app.wallet.generateSaveWalletData(password, state.config.crypto.kdfThreads, () => { })
|
||||
const dataString = JSON.stringify(data)
|
||||
const blob = new Blob([dataString], { type: 'text/plain;charset=utf-8' })
|
||||
backupname = "qortal_backup_" + state.app.selectedAddress.address + ".json"
|
||||
this.saveFileToDisk(blob, backupname)
|
||||
}
|
||||
|
||||
await this.saveFileToDisk(blob, backupname)
|
||||
}
|
||||
|
||||
async saveFileToDisk(blob, fileName) {
|
||||
try {
|
||||
const fileHandle = await self.showSaveFilePicker({
|
||||
suggestedName: fileName,
|
||||
types: [{
|
||||
description: "File"
|
||||
}]
|
||||
})
|
||||
|
||||
const writeFile = async (fileHandle, contents) => {
|
||||
const writable = await fileHandle.createWritable()
|
||||
|
||||
await writable.write(contents)
|
||||
await writable.close()
|
||||
}
|
||||
|
||||
writeFile(fileHandle, blob).then(() => console.log("FILE SAVED"))
|
||||
|
||||
let snack4string = get("general.save")
|
||||
|
||||
snackbar.add({
|
||||
labelText: `${snack4string} ${fileName} ✅`,
|
||||
dismiss: true
|
||||
})
|
||||
|
||||
this.shadowRoot.getElementById('downloadBackupPassword').value = ''
|
||||
this.shadowRoot.getElementById('rePassword').value = ''
|
||||
} catch (error) {
|
||||
if (error.name === 'AbortError') {
|
||||
return
|
||||
}
|
||||
|
||||
FileSaver.saveAs(blob, fileName)
|
||||
this.shadowRoot.getElementById('downloadBackupPassword').value = ''
|
||||
this.shadowRoot.getElementById('rePassword').value = ''
|
||||
}
|
||||
}
|
||||
async saveFileToDisk(blob, fileName) {
|
||||
try {
|
||||
const fileHandle = await self.showSaveFilePicker({
|
||||
suggestedName: fileName,
|
||||
types: [{
|
||||
description: "File",
|
||||
}]
|
||||
})
|
||||
const writeFile = async (fileHandle, contents) => {
|
||||
const writable = await fileHandle.createWritable()
|
||||
await writable.write(contents)
|
||||
await writable.close()
|
||||
}
|
||||
writeFile(fileHandle, blob).then(() => console.log("FILE SAVED"))
|
||||
let snack4string = get("general.save")
|
||||
snackbar.add({
|
||||
labelText: `${snack4string} ${fileName} ✅`,
|
||||
dismiss: true
|
||||
})
|
||||
} catch (error) {
|
||||
if (error.name === 'AbortError') {
|
||||
return
|
||||
}
|
||||
FileSaver.saveAs(blob, fileName)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
window.customElements.define('security-view', SecurityView)
|
||||
window.customElements.define('security-view', SecurityView)
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user