From 3f29c5eaf0c157f5ce3e57d35c2ab85d082d7986 Mon Sep 17 00:00:00 2001 From: Brandon Kim Date: Thu, 28 Jan 2021 17:10:01 +0900 Subject: [PATCH 01/18] add email_verified migration --- .../20210128065940-add-user-email_verified.js | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 server/db/migrations/20210128065940-add-user-email_verified.js diff --git a/server/db/migrations/20210128065940-add-user-email_verified.js b/server/db/migrations/20210128065940-add-user-email_verified.js new file mode 100644 index 0000000000..bbe50816b6 --- /dev/null +++ b/server/db/migrations/20210128065940-add-user-email_verified.js @@ -0,0 +1,30 @@ +'use strict'; +const TABLE = 'Users'; +const COLUMN = 'email_verified'; + +module.exports = { + up: (queryInterface, Sequelize) => + queryInterface + .addColumn(TABLE, COLUMN, { + type: Sequelize.BOOLEAN, + defaultValue: false + }) + .then(() => { + return queryInterface.sequelize.query( + `UPDATE "${TABLE}" + SET ${COLUMN} = true + WHERE verification_level > 0 + ` + ); + }) + .then(() => { + return queryInterface.sequelize.query( + `UPDATE "${TABLE}" + SET verification_level = 1 + WHERE verification_level = 0 + ` + ); + }), + down: (queryInterface, Sequelize) => + queryInterface.removeColumn(TABLE, COLUMN) +}; \ No newline at end of file From dfd3d922f7b4cf788cf3221e53c743a82f4a72e5 Mon Sep 17 00:00:00 2001 From: Brandon Kim Date: Thu, 28 Jan 2021 17:10:11 +0900 Subject: [PATCH 02/18] messages updagte --- server/messages.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/server/messages.js b/server/messages.js index 96dff2deee..d37aa0425a 100644 --- a/server/messages.js +++ b/server/messages.js @@ -6,6 +6,7 @@ exports.MISSING_ORDER = 'Missing order'; exports.INVALID_USER_ID = 'Invalid user.'; exports.USER_NOT_FOUND = 'User not found'; exports.USER_NOT_REGISTERED_ON_NETWORK = 'User is not registered on the network'; +exports.USER_EMAIL_NOT_VERIFIED = 'User email is not verified'; exports.SIGNUP_NOT_AVAILABLE = 'Sign up not available'; exports.USER_NOT_VERIFIED = 'User is not verified'; exports.USER_NOT_ACTIVATED = 'User is not activated'; @@ -167,7 +168,7 @@ exports.SUPPORT_DISABLED = 'Cannot send email to support at this time'; exports.COMMUNICATOR_CANNOT_UPDATE = (value) => `Communicator operators cannot update value: ${value}`; exports.MASK_VALUE_GIVEN = 'Masked value given'; exports.NO_DATA_FOR_CSV = 'No data to convert to CSV'; -exports.USER_IS_VERIFIED = 'User is already verified'; +exports.USER_EMAIL_IS_VERIFIED = 'User email is already verified'; exports.PROVIDE_USER_CREDENTIALS = 'Please provide a a user\'s kit id, network id, or email'; exports.PROVIDE_KIT_ID = 'Please provide a user\'s kit id'; exports.PROVIDE_NETWORK_ID = 'Please provide a user\'s network id'; From 1b00852d51c1fb30070a67306450c8de82e38edf Mon Sep 17 00:00:00 2001 From: Brandon Kim Date: Thu, 28 Jan 2021 17:10:27 +0900 Subject: [PATCH 03/18] add email_verified to model --- server/db/models/user.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/server/db/models/user.js b/server/db/models/user.js index 18713d8006..2d74dd749b 100644 --- a/server/db/models/user.js +++ b/server/db/models/user.js @@ -98,7 +98,11 @@ module.exports = function(sequelize, DataTypes) { }, verification_level: { type: DataTypes.INTEGER, - defaultValue: 0 + defaultValue: 1 + }, + email_verified: { + type: DataTypes.BOOLEAN, + defaultValue: false }, otp_enabled: { type: DataTypes.BOOLEAN, From a13ebfb7585f6a8ddb0eb6578e35184cd1ce19ca Mon Sep 17 00:00:00 2001 From: Brandon Kim Date: Thu, 28 Jan 2021 17:12:06 +0900 Subject: [PATCH 04/18] checkconfig setconfig status seeder swagger add email_verification_required --- server/api/swagger/swagger.yaml | 2 ++ server/db/seeders/20190825120350-add-status.js | 1 + server/tools/dbs/checkConfig.js | 1 + server/tools/dbs/setConfig.js | 1 + 4 files changed, 5 insertions(+) diff --git a/server/api/swagger/swagger.yaml b/server/api/swagger/swagger.yaml index a253632cee..6b8da6a902 100644 --- a/server/api/swagger/swagger.yaml +++ b/server/api/swagger/swagger.yaml @@ -3716,6 +3716,8 @@ definitions: type: string new_user_is_activated: type: boolean + email_verification_required: + type: boolean native_currency: type: string secrets: diff --git a/server/db/seeders/20190825120350-add-status.js b/server/db/seeders/20190825120350-add-status.js index 9d7ed793f8..aec8a02e38 100644 --- a/server/db/seeders/20190825120350-add-status.js +++ b/server/db/seeders/20190825120350-add-status.js @@ -80,6 +80,7 @@ module.exports = { website: '', information: '', }, + email_verification_required: false, setup_completed: false, native_currency: NATIVE_CURRENCY, logo_image: LOGO_IMAGE || 'https://dash.testnet.bitholla.com/assets/img/hex-pattern-icon-black-01.svg', diff --git a/server/tools/dbs/checkConfig.js b/server/tools/dbs/checkConfig.js index b6054e3b3b..ebdf06df65 100644 --- a/server/tools/dbs/checkConfig.js +++ b/server/tools/dbs/checkConfig.js @@ -33,6 +33,7 @@ Status.findOne() website: '', information: '', }, + email_verification_required: isBoolean(existingKitConfigurations.email_verification_required) ? existingKitConfigurations.email_verification_required : false, setup_completed: isBoolean(existingKitConfigurations.setup_completed) ? existingKitConfigurations.setup_completed : false, native_currency: existingKitConfigurations.native_currency || process.env.NATIVE_CURRENCY, logo_image: existingKitConfigurations.logo_image || existingKitConfigurations.logo_path || process.env.LOGO_IMAGE || 'https://dash.testnet.bitholla.com/assets/img/hex-pattern-icon-black-01.svg', diff --git a/server/tools/dbs/setConfig.js b/server/tools/dbs/setConfig.js index fbfc062c41..215a2f0968 100644 --- a/server/tools/dbs/setConfig.js +++ b/server/tools/dbs/setConfig.js @@ -51,6 +51,7 @@ const kit = { website: '', information: '', }, + email_verification_required: false, setup_completed: false, native_currency: NATIVE_CURRENCY || 'usdt', logo_image: LOGO_IMAGE || 'https://dash.testnet.bitholla.com/assets/img/hex-pattern-icon-black-01.svg', From fcceeac78fe5a38eba9c126b0f22d0d71327c3fe Mon Sep 17 00:00:00 2001 From: Brandon Kim Date: Thu, 28 Jan 2021 17:36:30 +0900 Subject: [PATCH 05/18] signup and verify flow change --- server/api/controllers/user.js | 87 ++++++++++--------- server/constants.js | 3 +- .../triggers/update_userlevel_after_verify.js | 2 +- 3 files changed, 51 insertions(+), 41 deletions(-) diff --git a/server/api/controllers/user.js b/server/api/controllers/user.js index 7b7c465b79..092beb594e 100644 --- a/server/api/controllers/user.js +++ b/server/api/controllers/user.js @@ -11,6 +11,7 @@ const { USER_REGISTERED, USER_NOT_FOUND, SERVICE_NOT_SUPPORTED, + USER_EMAIL_NOT_VERIFIED, VERIFICATION_EMAIL_MESSAGE, TOKEN_REMOVED, INVALID_CREDENTIALS, @@ -21,7 +22,7 @@ const { PROVIDE_VALID_EMAIL, INVALID_PASSWORD, USER_EXISTS, - USER_IS_VERIFIED, + USER_EMAIL_IS_VERIFIED, INVALID_VERIFICATION_CODE } = require('../../messages'); const { DEFAULT_ORDER_RISK_PERCENTAGE } = require('../../constants'); @@ -91,10 +92,25 @@ const signUpUser = (req, res) => { if (user) { throw new Error(USER_EXISTS); } - return toolsLib.database.getModel('user').create({ - email, - password, - settings: INITIAL_SETTINGS() + return toolsLib.database.getModel('sequelize').transaction((transaction) => { + return toolsLib.database.getModel('user').create({ + email, + password, + verification_level: 1, + settings: INITIAL_SETTINGS() + }, { transaction }) + .then((user) => { + return all([ + toolsLib.user.createUserOnNetwork(email), + user + ]); + }) + .then(([ networkUser, user ]) => { + return user.update( + { network_id: networkUser.id }, + { fields: ['network_id'], returning: true, transaction } + ); + }); }); }) .then((user) => { @@ -182,43 +198,34 @@ const verifyUser = (req, res) => { const { email, verification_code } = req.swagger.params.data.value; const domain = req.headers['x-real-origin']; - toolsLib.database.getModel('sequelize').transaction((transaction) => { - return toolsLib.database.findOne('user', { - where: { email }, - attributes: ['id', 'email', 'settings', 'network_id'] + return toolsLib.database.findOne('user', { + where: { email }, + attributes: ['id', 'email', 'settings', 'network_id'] + }) + .then((user) => { + return all([ + toolsLib.user.getVerificationCodeByUserId(user.id), + user + ]); }) - .then((user) => { - return all([ - toolsLib.user.getVerificationCodeByUserId(user.id), - user - ]); - }) - .then(([ verificationCode, user ]) => { - if (verificationCode.verified) { - throw new Error(USER_IS_VERIFIED); - } + .then(([ verificationCode, user ]) => { + if (verificationCode.verified) { + throw new Error(USER_EMAIL_IS_VERIFIED); + } - if (verification_code !== verificationCode.code) { - throw new Error(INVALID_VERIFICATION_CODE); - } + if (verification_code !== verificationCode.code) { + throw new Error(INVALID_VERIFICATION_CODE); + } - return all([ - user, - toolsLib.user.createUserOnNetwork(email), - verificationCode.update( - { verified: true }, - { fields: ['verified'], transaction } - ) - ]); - }) - .then(([ user, networkUser ]) => { - return user.update( - { network_id: networkUser.id }, - { fields: ['network_id'], returning: true, transaction } - ); - }); - }) - .then((user) => { + return all([ + user, + verificationCode.update( + { verified: true }, + { fields: ['verified'] } + ) + ]); + }) + .then(([ user ]) => { sendEmail( MAILTYPE.WELCOME, user.email, @@ -256,6 +263,8 @@ const loginPost = (req, res) => { } if (user.verification_level === 0) { throw new Error(USER_NOT_VERIFIED); + } else if (toolsLib.getKitConfig().email_verification_required && !user.email_verified) { + throw new Error(USER_EMAIL_NOT_VERIFIED); } else if (!user.activated) { throw new Error(USER_NOT_ACTIVATED); } diff --git a/server/constants.js b/server/constants.js index de1aa3bff6..233a566846 100644 --- a/server/constants.js +++ b/server/constants.js @@ -149,7 +149,8 @@ exports.KIT_CONFIG_KEYS = [ 'strings', 'meta', 'features', - 'setup_completed' + 'setup_completed', + 'email_verification_required' ]; exports.KIT_SECRETS_KEYS = [ diff --git a/server/db/triggers/update_userlevel_after_verify.js b/server/db/triggers/update_userlevel_after_verify.js index 374113de60..5f78aa2f0a 100644 --- a/server/db/triggers/update_userlevel_after_verify.js +++ b/server/db/triggers/update_userlevel_after_verify.js @@ -4,7 +4,7 @@ RETURNS TRIGGER AS $update_userlevel_after_verify$ BEGIN IF new.verified IS TRUE THEN UPDATE "Users" - SET verification_level = 1, updated_at = current_timestamp + SET email_verified = true, updated_at = current_timestamp WHERE id = new.user_id; END IF; RETURN NEW; From 5b6b704a0df796113dfb9234fdf76ae167a09ddc Mon Sep 17 00:00:00 2001 From: Brandon Kim Date: Thu, 28 Jan 2021 18:11:22 +0900 Subject: [PATCH 06/18] set default native currency as usdt --- server/db/seeders/20190825120350-add-status.js | 2 +- server/tools/dbs/checkConfig.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/server/db/seeders/20190825120350-add-status.js b/server/db/seeders/20190825120350-add-status.js index aec8a02e38..b2f452ca9e 100644 --- a/server/db/seeders/20190825120350-add-status.js +++ b/server/db/seeders/20190825120350-add-status.js @@ -82,7 +82,7 @@ module.exports = { }, email_verification_required: false, setup_completed: false, - native_currency: NATIVE_CURRENCY, + native_currency: NATIVE_CURRENCY || 'usdt', logo_image: LOGO_IMAGE || 'https://dash.testnet.bitholla.com/assets/img/hex-pattern-icon-black-01.svg', valid_languages: VALID_LANGUAGES || 'en,fa,ko,ar,fr', new_user_is_activated: (NEW_USER_IS_ACTIVATED && NEW_USER_IS_ACTIVATED === 'true') || false, diff --git a/server/tools/dbs/checkConfig.js b/server/tools/dbs/checkConfig.js index ebdf06df65..4ae7171bef 100644 --- a/server/tools/dbs/checkConfig.js +++ b/server/tools/dbs/checkConfig.js @@ -35,7 +35,7 @@ Status.findOne() }, email_verification_required: isBoolean(existingKitConfigurations.email_verification_required) ? existingKitConfigurations.email_verification_required : false, setup_completed: isBoolean(existingKitConfigurations.setup_completed) ? existingKitConfigurations.setup_completed : false, - native_currency: existingKitConfigurations.native_currency || process.env.NATIVE_CURRENCY, + native_currency: existingKitConfigurations.native_currency || process.env.NATIVE_CURRENCY || 'usdt', logo_image: existingKitConfigurations.logo_image || existingKitConfigurations.logo_path || process.env.LOGO_IMAGE || 'https://dash.testnet.bitholla.com/assets/img/hex-pattern-icon-black-01.svg', valid_languages: existingKitConfigurations.valid_languages || process.env.VALID_LANGUAGES || 'en,fa,ko,ar,fr', new_user_is_activated: existingKitConfigurations.new_user_is_activated || (process.env.NEW_USER_IS_ACTIVATED && process.env.NEW_USER_IS_ACTIVATED === 'true') || false, From 6273ec531b895211084c16ae6c2824801d0b93a7 Mon Sep 17 00:00:00 2001 From: Brandon Kim Date: Thu, 28 Jan 2021 18:21:13 +0900 Subject: [PATCH 07/18] admin/verify-email --- server/api/controllers/admin.js | 34 ++++++++++++++++++++++++++++++++- server/api/swagger/swagger.yaml | 31 ++++++++++++++++++++++++++++++ 2 files changed, 64 insertions(+), 1 deletion(-) diff --git a/server/api/controllers/admin.js b/server/api/controllers/admin.js index 7c9bf7d46a..16089ac578 100644 --- a/server/api/controllers/admin.js +++ b/server/api/controllers/admin.js @@ -5,6 +5,8 @@ const toolsLib = require('hollaex-tools-lib'); const { cloneDeep } = require('lodash'); const { all } = require('bluebird'); const { USER_NOT_FOUND } = require('../../messages'); +const { sendEmail } = require('../../mail'); +const { MAILTYPE } = require('../../mail/strings'); const getAdminKit = (req, res) => { loggerAdmin.verbose(req.uuid, 'controllers/admin/getAdminKit', req.auth.sub); @@ -268,6 +270,35 @@ const upgradeUser = (req, res) => { }); }; +const verifyEmailUser = (req, res) => { + loggerAdmin.verbose( + req.uuid, + 'controllers/admin/verifyEmailUser auth', + req.auth + ); + + const { user_id } = req.swagger.params.data.value; + + toolsLib.user.verifyUserEmailByKitId(user_id) + .then((user) => { + sendEmail( + MAILTYPE.WELCOME, + user.email, + {}, + user.settings + ); + return res.json({ message: 'Success' }); + }) + .catch((err) => { + loggerAdmin.error( + req.uuid, + 'controllers/admin/verifyEmailUser', + err.message + ); + return res.status(err.status || 400).json({ message: err.message }); + }); +}; + const flagUser = (req, res) => { loggerAdmin.verbose(req.uuid, 'controllers/admin/flagUser/auth', req.auth); const { user_id } = req.swagger.params.data.value; @@ -696,5 +727,6 @@ module.exports = { inviteNewOperator, getExchangeGeneratedFees, mintAsset, - burnAsset + burnAsset, + verifyEmailUser }; diff --git a/server/api/swagger/swagger.yaml b/server/api/swagger/swagger.yaml index 6b8da6a902..764a9ec1ea 100644 --- a/server/api/swagger/swagger.yaml +++ b/server/api/swagger/swagger.yaml @@ -2833,6 +2833,37 @@ paths: - admin - supervisor - kyc + /admin/verify-email: + x-swagger-router-controller: admin + post: + description: Verify email of user + operationId: verifyEmailUser + tags: + - Admin + parameters: + - in: body + name: data + description: Upgrade data + schema: + type: object + properties: + user_id: + type: integer + responses: + 200: + description: Success + schema: + $ref: "#/definitions/MessageResponse" + default: + description: Error + schema: + $ref: "#/definitions/MessageResponse" + security: + - Bearer: [] + x-security-scopes: + - admin + - supervisor + - kyc /admin/deactivate-otp: x-swagger-router-controller: otp post: From bdd724f6ce7073a178fc323212dfba0fd21465ac Mon Sep 17 00:00:00 2001 From: Amir Hossein Salar Date: Thu, 28 Jan 2021 14:00:45 +0330 Subject: [PATCH 08/18] update package.json --- web/package-lock.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/package-lock.json b/web/package-lock.json index b89e08b2c2..227d0bde0e 100644 --- a/web/package-lock.json +++ b/web/package-lock.json @@ -1,6 +1,6 @@ { "name": "hollaex-kit", - "version": "2.0.0", + "version": "2.0.2", "lockfileVersion": 1, "requires": true, "dependencies": { From 7f2a127851467165954f867bdd78fae4872f6708 Mon Sep 17 00:00:00 2001 From: Amir Hossein Salar Date: Thu, 28 Jan 2021 14:01:32 +0330 Subject: [PATCH 09/18] changes for orderbook webSocket issues --- web/src/containers/Trade/index.js | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/web/src/containers/Trade/index.js b/web/src/containers/Trade/index.js index 0e1c2fa711..cf8637d6c5 100644 --- a/web/src/containers/Trade/index.js +++ b/web/src/containers/Trade/index.js @@ -42,6 +42,7 @@ class Trade extends PureComponent { constructor(props) { super(props); this.state = { + wsInitialized: false, orderbookWs: null, activeTab: 0, chartHeight: 0, @@ -202,7 +203,12 @@ class Trade extends PureComponent { this.setState({ orderbookWs }); orderbookWs.onopen = (evt) => { - this.subscribe(symbol); + this.setState({ wsInitialized: true }, () => { + const { + routeParams: { pair }, + } = this.props; + this.subscribe(pair); + }); setWsHeartbeat(orderbookWs, JSON.stringify({ op: 'ping' }), { pingTimeout: 60000, @@ -235,8 +241,8 @@ class Trade extends PureComponent { }; subscribe = (pair) => { - const { orderbookWs } = this.state; - if (orderbookWs) { + const { orderbookWs, wsInitialized } = this.state; + if (orderbookWs && wsInitialized) { orderbookWs.send( JSON.stringify({ op: 'subscribe', @@ -247,8 +253,8 @@ class Trade extends PureComponent { }; unsubscribe = (pair) => { - const { orderbookWs } = this.state; - if (orderbookWs) { + const { orderbookWs, wsInitialized } = this.state; + if (orderbookWs && wsInitialized) { orderbookWs.send( JSON.stringify({ op: 'unsubscribe', args: [`orderbook:${pair}`] }) ); @@ -256,8 +262,8 @@ class Trade extends PureComponent { }; closeOrderbookSocket = () => { - const { orderbookWs } = this.state; - if (orderbookWs) { + const { orderbookWs, wsInitialized } = this.state; + if (orderbookWs && wsInitialized) { orderbookWs.close(); } }; From 22f27124d818e50db83cc9eef488c4c0364ca472 Mon Sep 17 00:00:00 2001 From: Amir Hossein Salar Date: Thu, 28 Jan 2021 14:02:32 +0330 Subject: [PATCH 10/18] changes for cancel all orders modal --- .../assets/images/cancel-all-orders.svg | 16 +++ web/src/config/icons/dark.js | 2 + web/src/config/icons/light.js | 2 + web/src/config/lang/en.js | 6 + web/src/containers/Trade/MobileOrders.js | 1 + .../Trade/components/OrdersWrapper.js | 112 +++++++++++++----- web/src/index.css | 3 +- web/src/index.scss | 3 +- 8 files changed, 113 insertions(+), 32 deletions(-) create mode 100644 web/public/assets/images/cancel-all-orders.svg diff --git a/web/public/assets/images/cancel-all-orders.svg b/web/public/assets/images/cancel-all-orders.svg new file mode 100644 index 0000000000..ba7582facf --- /dev/null +++ b/web/public/assets/images/cancel-all-orders.svg @@ -0,0 +1,16 @@ + + + + + + + + diff --git a/web/src/config/icons/dark.js b/web/src/config/icons/dark.js index 07d346a0d5..7ff174a938 100644 --- a/web/src/config/icons/dark.js +++ b/web/src/config/icons/dark.js @@ -248,6 +248,8 @@ const nestedIcons = { TRADE_ANNOUNCEMENT: '/assets/images/announcement.svg', BONUS_OFFERING: '/assets/icons/bonus_offering.svg', + CANCEL_ORDERS: '/assets/images/cancel-all-orders.svg', + ...coinIcons, }; diff --git a/web/src/config/icons/light.js b/web/src/config/icons/light.js index 83639bec62..c5c5bef6e1 100644 --- a/web/src/config/icons/light.js +++ b/web/src/config/icons/light.js @@ -247,6 +247,8 @@ const nestedIcons = { TRADE_ANNOUNCEMENT: '/assets/images/announcement.svg', BONUS_OFFERING: '/assets/icons/bonus_offering.svg', + CANCEL_ORDERS: '/assets/images/cancel-all-orders.svg', + ...coinIcons, }; diff --git a/web/src/config/lang/en.js b/web/src/config/lang/en.js index 7bf32f7af8..17c7682e03 100644 --- a/web/src/config/lang/en.js +++ b/web/src/config/lang/en.js @@ -1405,6 +1405,12 @@ const nestedContent = { SEARCH_ERROR: 'Transaction not found. Please check the ID and try again. If your believe there is a problem please contact support.', }, + CANCEL_ORDERS: { + HEADING: 'Cancel orders', + SUB_HEADING: 'Cancel all orders', + INFO_1: 'This will cancel your open orders for this markets.', + INFO_2: 'Are you sure you want to cancel all your open orders?', + }, }; const content = flatten(nestedContent, options); diff --git a/web/src/containers/Trade/MobileOrders.js b/web/src/containers/Trade/MobileOrders.js index f0c59606eb..dfd5c8d1d5 100644 --- a/web/src/containers/Trade/MobileOrders.js +++ b/web/src/containers/Trade/MobileOrders.js @@ -57,6 +57,7 @@ const MobileOrders = ({ cancelDelayData={cancelDelayData} orders={activeOrders} onCancel={cancelOrder} + onCancelAll={cancelAllOrders} /> ) : ( diff --git a/web/src/containers/Trade/components/OrdersWrapper.js b/web/src/containers/Trade/components/OrdersWrapper.js index 7d69cbe7b0..288157a8fb 100644 --- a/web/src/containers/Trade/components/OrdersWrapper.js +++ b/web/src/containers/Trade/components/OrdersWrapper.js @@ -1,8 +1,7 @@ -import React, { Component } from 'react'; +import React, { Component, Fragment } from 'react'; import { connect } from 'react-redux'; import { bindActionCreators } from 'redux'; import { isMobile } from 'react-device-detect'; -import { Modal as ConfirmationModal } from 'antd'; import ActiveOrders from './ActiveOrders'; import UserTrades from './UserTrades'; @@ -12,27 +11,24 @@ import LogoutInfoTrade from './LogoutInfoTrade'; import MobileOrders from '../MobileOrders'; import { cancelOrder, cancelAllOrders } from '../../../actions/orderAction'; import { isLoggedIn } from '../../../utils/token'; -import { ActionNotification } from '../../../components'; +import { ActionNotification, Dialog, IconTitle, Button } from 'components'; import STRINGS from '../../../config/localizedStrings'; import withConfig from 'components/ConfigProvider/withConfig'; import { userTradesSelector, activeOrdersSelector } from '../utils'; +import { EditWrapper } from 'components'; class OrdersWrapper extends Component { constructor(props) { super(props); this.state = { cancelDelayData: [], + showCancelAllModal: false, }; } openConfirm = () => { - ConfirmationModal.confirm({ - content: 'Do you want cancel all orders?', - okText: 'Yes', - cancelText: 'No', - onOk: this.cancelAllOrders, - onCancel: () => {}, - className: 'trade_cancel-All-confirmation', + this.setState({ + showCancelAllModal: true, }); }; @@ -45,6 +41,7 @@ class OrdersWrapper extends Component { this.setState({ cancelDelayData }); setTimeout(() => { this.props.cancelAllOrders(this.props.pair, this.props.settings); + this.onCloseDialog(); }, 700); }; @@ -55,6 +52,10 @@ class OrdersWrapper extends Component { }, 700); }; + onCloseDialog = () => { + this.setState({ showCancelAllModal: false }); + }; + render() { const { pair, @@ -67,7 +68,7 @@ class OrdersWrapper extends Component { discount, icons: ICONS, } = this.props; - const { cancelDelayData } = this.state; + const { cancelDelayData, showCancelAllModal } = this.state; const USER_TABS = [ { stringId: 'ORDERS', @@ -126,25 +127,76 @@ class OrdersWrapper extends Component { ), }, ]; - if (isMobile) { - return ( - - ); - } - return ; + + return ( + + {isMobile ? ( + + ) : ( + + )} + +
+ +
+
+ +
{STRINGS['CANCEL_ORDERS.SUB_HEADING']}
+
+
+
+ +
{STRINGS['CANCEL_ORDERS.INFO_1']}
+
+
+
+ +
{STRINGS['CANCEL_ORDERS.INFO_2']}
+
+
+
+
+
+
+
+
+ ); } } diff --git a/web/src/index.css b/web/src/index.css index e1d64519fc..31ffe413ff 100644 --- a/web/src/index.css +++ b/web/src/index.css @@ -9062,7 +9062,8 @@ svg .post-icon, svg .item-options, svg .check-order, svg .otp-inactive, -svg .otp-active { +svg .otp-active, +svg .cancel-all { fill: var(--labels_important-active-labels-text-graphics); } svg .trade-history-2, diff --git a/web/src/index.scss b/web/src/index.scss index 8abef9f2ae..9d2c026c01 100644 --- a/web/src/index.scss +++ b/web/src/index.scss @@ -276,7 +276,8 @@ svg { .item-options, .check-order, .otp-inactive, - .otp-active { + .otp-active, + .cancel-all { fill: $colors-main-black; } From 33b2bbac7d4558ccb35ce20cee00951b0b09017f Mon Sep 17 00:00:00 2001 From: Amir Hossein Salar Date: Fri, 29 Jan 2021 09:35:34 +0330 Subject: [PATCH 11/18] changes for default native currency in setup wizard --- .../containers/Admin/SetupWizard/Assets.js | 21 ++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/web/src/containers/Admin/SetupWizard/Assets.js b/web/src/containers/Admin/SetupWizard/Assets.js index 700af077c6..19632764d7 100644 --- a/web/src/containers/Admin/SetupWizard/Assets.js +++ b/web/src/containers/Admin/SetupWizard/Assets.js @@ -13,13 +13,26 @@ const Assets = ({ handleNext, updateConstants, }) => { - const [native_currency, setCurrency] = useState(''); + const getDefaultNativeCurrency = () => { + if (Object.keys(coins).length !== 0) { + if (coins['usdt']) { + return coins['usdt'].symbol; + } else { + const firstCoinKey = Object.keys(coins)[0]; + return coins[firstCoinKey].symbol; + } + } + }; + + const [native_currency, setCurrency] = useState(getDefaultNativeCurrency()); useEffect(() => { let base_coin = Object.keys(coins).length ? Object.keys(coins)[0] : ''; setCurrency(base_coin); }, [coins]); useEffect(() => { - setCurrency(constants.native_currency); + setCurrency(constants.native_currency || getDefaultNativeCurrency()); + // TODO: Fix react-hooks/exhaustive-deps + // eslint-disable-next-line react-hooks/exhaustive-deps }, [constants.native_currency]); const onChange = (key) => { setCurrency(key); @@ -93,7 +106,9 @@ const Assets = ({
- +
{/* handleNext(3)}> Skip this step From 7feb45c8c0a9336e7da346fb848c9ac8b44aaa49 Mon Sep 17 00:00:00 2001 From: Amir Hossein Salar Date: Fri, 29 Jan 2021 15:25:05 +0330 Subject: [PATCH 12/18] changes for amount in native currency column --- web/src/config/lang/en.js | 1 + .../Trade/components/OrdersWrapper.js | 3 + .../containers/Trade/components/UserTrades.js | 3 +- .../containers/TransactionsHistory/index.js | 20 ++++--- .../containers/TransactionsHistory/utils.js | 55 ++++++++++++++++++- 5 files changed, 73 insertions(+), 9 deletions(-) diff --git a/web/src/config/lang/en.js b/web/src/config/lang/en.js index 17c7682e03..4890f96029 100644 --- a/web/src/config/lang/en.js +++ b/web/src/config/lang/en.js @@ -1411,6 +1411,7 @@ const nestedContent = { INFO_1: 'This will cancel your open orders for this markets.', INFO_2: 'Are you sure you want to cancel all your open orders?', }, + AMOUNT_IN: 'Amount in', }; const content = flatten(nestedContent, options); diff --git a/web/src/containers/Trade/components/OrdersWrapper.js b/web/src/containers/Trade/components/OrdersWrapper.js index 288157a8fb..d334e5bc4f 100644 --- a/web/src/containers/Trade/components/OrdersWrapper.js +++ b/web/src/containers/Trade/components/OrdersWrapper.js @@ -66,6 +66,7 @@ class OrdersWrapper extends Component { pairs, coins, discount, + prices, icons: ICONS, } = this.props; const { cancelDelayData, showCancelAllModal } = this.state; @@ -109,6 +110,7 @@ class OrdersWrapper extends Component { pairs={pairs} coins={coins} discount={discount} + prices={prices} /> ) : ( @@ -206,6 +208,7 @@ OrdersWrapper.defaultProps = { }; const mapStateToProps = (state) => ({ + prices: state.asset.oraclePrices, activeOrders: activeOrdersSelector(state), userTrades: userTradesSelector(state), settings: state.user.settings, diff --git a/web/src/containers/Trade/components/UserTrades.js b/web/src/containers/Trade/components/UserTrades.js index 5611e4f6fe..15c97fe9a4 100644 --- a/web/src/containers/Trade/components/UserTrades.js +++ b/web/src/containers/Trade/components/UserTrades.js @@ -15,10 +15,11 @@ const ActiveOrders = ({ pageSize, coins, discount, + prices, }) => { const headers = lessHeaders ? generateLessTradeHeaders(pairData.pair_base, pairs, coins, discount) - : generateTradeHeaders(pairData.pair_base, pairs, coins, discount); + : generateTradeHeaders(pairData.pair_base, pairs, coins, discount, prices); if (!pair) { return
; } diff --git a/web/src/containers/TransactionsHistory/index.js b/web/src/containers/TransactionsHistory/index.js index 31d4518837..93a20c3dd0 100644 --- a/web/src/containers/TransactionsHistory/index.js +++ b/web/src/containers/TransactionsHistory/index.js @@ -57,7 +57,8 @@ class TransactionsHistory extends Component { this.generateHeaders( this.props.symbol, this.props.coins, - this.props.discount + this.props.discount, + this.props.prices ); this.generateFilters(); if ( @@ -70,16 +71,20 @@ class TransactionsHistory extends Component { } UNSAFE_componentWillReceiveProps(nextProps) { - const { pairs, coins } = this.props; + const { pairs, coins, prices } = this.props; // if (nextProps.symbol !== this.props.symbol) { // this.requestData(nextProps.symbol); // this.generateHeaders(nextProps.symbol, nextProps.activeLanguage); // } else if (nextProps.activeLanguage !== this.props.activeLanguage) { - if (nextProps.activeLanguage !== this.props.activeLanguage) { + if ( + nextProps.activeLanguage !== this.props.activeLanguage || + JSON.stringify(nextProps.prices) !== JSON.stringify(prices) + ) { this.generateHeaders( nextProps.symbol, nextProps.coins, - nextProps.discount + nextProps.discount, + nextProps.prices ); } if ( @@ -149,17 +154,17 @@ class TransactionsHistory extends Component { ); }; - generateHeaders(symbol, coins, discount) { + generateHeaders(symbol, coins, discount, prices) { const { withdrawalPopup } = this; const { pairs } = this.props; this.setState({ headers: { orders: isMobile ? generateTradeHeadersMobile(symbol, pairs, coins, discount) - : generateTradeHeaders(symbol, pairs, coins, discount), + : generateTradeHeaders(symbol, pairs, coins, discount, prices), trades: isMobile ? generateTradeHeadersMobile(symbol, pairs, coins, discount) - : generateTradeHeaders(symbol, pairs, coins, discount), + : generateTradeHeaders(symbol, pairs, coins, discount, prices), deposits: generateDepositsHeaders(symbol, coins, withdrawalPopup), withdrawals: generateWithdrawalsHeaders(symbol, coins, withdrawalPopup), }, @@ -524,6 +529,7 @@ class TransactionsHistory extends Component { } const mapStateToProps = (store) => ({ + prices: store.asset.oraclePrices, pairs: store.app.pairs, coins: store.app.coins, id: store.user.id, diff --git a/web/src/containers/TransactionsHistory/utils.js b/web/src/containers/TransactionsHistory/utils.js index f95834bc7c..e48c559a58 100644 --- a/web/src/containers/TransactionsHistory/utils.js +++ b/web/src/containers/TransactionsHistory/utils.js @@ -58,7 +58,13 @@ const calculatePrice = (isQuick = false, price, size) => { return price; }; -export const generateTradeHeaders = (symbol, pairs, coins, discount) => { +export const generateTradeHeaders = ( + symbol, + pairs, + coins, + discount, + prices = {} +) => { return [ { stringId: 'PAIR', @@ -217,6 +223,51 @@ export const generateTradeHeaders = (symbol, pairs, coins, discount) => { } }, }, + { + stringId: 'AMOUNT_IN', + label: `${STRINGS['AMOUNT_IN']} ${BASE_CURRENCY.toUpperCase()}`, + key: 'amount-in', + exportToCsv: ({ price = 0, size = 0, quick, symbol }) => { + if (pairs[symbol]) { + const { increment_price, pair_base } = pairs[symbol]; + const { min, ...rest } = coins[BASE_CURRENCY] || DEFAULT_COIN_DATA; + return STRINGS.formatString( + CURRENCY_PRICE_FORMAT, + formatToCurrency( + calculateAmount(quick, prices[pair_base] || 0, size), + increment_price + ), + rest.symbol.toUpperCase() + ).join(''); + } else { + return calculateAmount(quick, price, size); + } + }, + renderCell: ({ price = 0, size = 0, quick, symbol }, key, index) => { + if (pairs[symbol]) { + const { increment_price, pair_base } = pairs[symbol]; + const { min, ...rest } = coins[BASE_CURRENCY] || DEFAULT_COIN_DATA; + return ( + + {STRINGS.formatString( + CURRENCY_PRICE_FORMAT, + formatToCurrency( + calculateAmount(quick, prices[pair_base] || 0, size), + increment_price + ), + rest.symbol.toUpperCase() + )} + + ); + } else { + return ( + + {formatToCurrency(calculateAmount(quick, price, size), 0.0001)} + + ); + } + }, + }, { stringId: 'FEE,NO_FEE', label: STRINGS['FEE'], @@ -408,6 +459,8 @@ export const generateWithdrawalsHeaders = ( /*: {fee}*/ /*: {fee}*/ /*: {fee}*/ + /*: {fee}*/ + /*: {fee}*/ /*: {fee}*/); }, }, From a03636b5a7a0e1c1057c5d6af58c39aea71ec631 Mon Sep 17 00:00:00 2001 From: Amir Hossein Salar Date: Fri, 29 Jan 2021 15:30:15 +0330 Subject: [PATCH 13/18] changes for sparkLine time period --- web/src/actions/chartAction.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/src/actions/chartAction.js b/web/src/actions/chartAction.js index 473604babf..a29ed474f9 100644 --- a/web/src/actions/chartAction.js +++ b/web/src/actions/chartAction.js @@ -62,7 +62,7 @@ export const getChartHistory = ( }; export const getSparklines = async () => { - const from = moment().subtract('1', 'month').format('X'); + const from = moment().subtract('1', 'days').format('X'); const to = moment().format('X'); const { data = {} } = await axios({ From e2a4bcbcbf396754aff3d91dd245498987a03ffd Mon Sep 17 00:00:00 2001 From: Ali Beikverdi Date: Sun, 31 Jan 2021 01:08:16 +0900 Subject: [PATCH 14/18] added german language --- server/mail/strings/de.js | 297 +++++++ web/src/config/lang/de.js | 1335 ++++++++++++++++++++++++++++ web/src/config/localizedStrings.js | 2 + 3 files changed, 1634 insertions(+) create mode 100644 server/mail/strings/de.js create mode 100644 web/src/config/lang/de.js diff --git a/server/mail/strings/de.js b/server/mail/strings/de.js new file mode 100644 index 0000000000..d349ae8ddf --- /dev/null +++ b/server/mail/strings/de.js @@ -0,0 +1,297 @@ +'use strict'; + +const { GET_CONFIGURATION } = require('../../constants'); +const API_NAME = () => GET_CONFIGURATION().constants.api_name; + +const COMMON = { + GREETING: (name) => `Sehr geehrte/r ${name}`, + CLOSING: { + 1: 'Mit freundlichen Grüßen', + 2: () => `${API_NAME()} team` + }, + IP_ADDRESS: (ip) => `IP-Adresse: ${ip}`, + IP_REQUEST_FROM: (ip) => `Anfrage initiiert von: ${ip}`, + TXID: (txid) => `Transaktionsnummer: ${txid}`, + FEE: (fee) => `Gebühr: ${fee}`, + AMOUNT: (amount) => `Betrag: ${amount}`, + ADDRESS: (address) => `Adresse: ${address}`, + TIME: (time) => `Zeit: ${time}`, + COUNTRY: (country) => `Land: ${country}`, + DEVICE: (device) => `Gerät: ${device}`, + MESSAGE: (message) => `Nachricht: ${message}`, + ERROR_REQUEST: + 'Wenn diese Anfrage fälschlicherweise gestellt wurde, können Sie sie getrost ignorieren; es werden keine Änderungen an Ihrem Konto vorgenommen.', + EXPLORER: + 'Sie können den Status Ihrer Transaktion auf der Blockchain durch diese Block Explorers finden:', + DEPOSIT: 'Einzahlung', + WITHDRAWAL: 'Abbuchung' +}; + +const FOOTER = { + FOLLOW_US: 'Folgen Sie uns auf', + NEED_HELP: 'Brauchen Sie Hilfe? Antworten Sie einfach auf diese E-Mail', + PRIVACY_POLICY: 'Datenschutzbestimmungen', + TERMS: 'Konditionen und Bedingungen', + INVITE_YOUR_FRIENDS: 'Laden Sie Ihre Freunde ein', + POWERED_BY: 'Powered by' +}; + +const SIGNUP = { + TITLE: 'Sign Up', + GREETING: (name) => COMMON.GREETING(name), + BODY: { + 1: () => `Sie müssen Ihr E-Mail-Konto bestätigen, indem Sie auf die unten angezeigte Taste klicken. + Wenn Sie Fragen haben, können Sie uns gerne kontaktieren, indem Sie einfach auf diese E-Mail antworten.`, + 2: 'Bitte klicken Sie auf die Schaltfläche unten, um mit Ihrer Registrierung fortzufahren.', + 3: 'Bestätigen' + }, + CLOSING: COMMON.CLOSING +}; + +const WELCOME = { + TITLE: 'Willkommen', + GREETING: (name) => COMMON.GREETING(name), + BODY: { + 1: () => `Vielen Dank, dass Sie sich bei ${API_NAME()} angemeldet haben.`, + 2: (account, deposit) => ` + Um mit dem Trading zu beginnen, müssen Sie zunächst Kryptowährungen oder Geld auf Ihr Konto einzahlen. + Bitte gehen Sie zu Ihrem ${account} und besuchen Sie die ${deposit} Seite.`, + 3: 'Konto', + 4: 'Einzahlung', + 5: 'Wenn Sie Fragen oder Bedenken haben, kontaktieren Sie uns bitte einfach durch Beantwortung dieser E-Mail.' + }, + CLOSING: COMMON.CLOSING +}; + +const LOGIN = { + TITLE: 'Login', + GREETING: (name) => COMMON.GREETING(name), + BODY: { + 1: 'Wir haben eine Anmeldung zu Ihrem Konto mit den folgenden Daten aufgezeichnet', + 2: (time) => COMMON.TIME(time), + 3: (country) => COMMON.COUNTRY(country), + 4: (device) => COMMON.DEVICE(device), + 5: (ip) => COMMON.IP_ADDRESS(ip), + 6: 'Wenn Sie das nicht waren, ändern Sie bitte Ihr Passwort, richten Sie eine Zwei-Faktor-Authentifizierung ein und kontaktieren Sie uns umgehend.' + }, + CLOSING: COMMON.CLOSING +}; + +const RESETPASSWORD = { + TITLE: 'Passwort zurücksetzen', + GREETING: (name) => COMMON.GREETING(name), + BODY: { + 1: 'Sie haben eine Anfrage zum Zurücksetzen des Passworts für Ihr Konto gestellt.', + 2: 'Um Ihr Passwort zu aktualisieren, klicken Sie auf den unten stehenden Link.', + 3: 'Mein Passwort zurücksetzen', + 4: COMMON.ERROR_REQUEST, + 5: (ip) => COMMON.IP_REQUEST_FROM(ip) + }, + CLOSING: COMMON.CLOSING +}; + +const DEPOSIT = { + TITLE: (currency) => `${currency.toUpperCase()} ${COMMON.DEPOSIT}`, + GREETING: (name) => COMMON.GREETING(name), + BODY: { + PENDING: (amount, confirmation = 1, currency) => + `Sie haben eine neue Einzahlung von ${amount} ${currency.toUpperCase()} in Ihrer ${API_NAME()} Geldbörse ausstehend. Bitte warten Sie, bis die Transaktion bestätigt ist und Ihr Guthaben in Ihrer Geldbörse verfügbar ist. Ihre Transaktion erfordert ${confirmation} Bestätigung(en) in der Blockchain.`, + COMPLETED: (amount, confirmation, currency) => + `Ihre ${ + currency.toUpperCase() + } Anzahlung für ${amount} ${currency.toUpperCase()} ist bestätigt und abgeschlossen und steht in Ihrer ${ + currency.toUpperCase() + } Geldbörse zur Verfügung.`, + 1: (amount, currency) => `${COMMON.AMOUNT(amount)} ${currency.toUpperCase()}`, + 2: (status) => `Status: ${status}`, + 3: (address) => COMMON.ADDRESS(address), + 4: (txid) => COMMON.TXID(txid), + 5: COMMON.EXPLORER + }, + CLOSING: COMMON.CLOSING +}; + +const ACCOUNTVERIFY = { + TITLE: 'Konto verifiziert', + GREETING: (name) => COMMON.GREETING(name), + BODY: { + 1: 'Herzlichen Glückwunsch! Ihr Konto wurde erfolgreich verifiziert.', + 2: 'Jetzt handeln' + }, + CLOSING: COMMON.CLOSING +}; + +const ACCOUNTUPGRADE = { + TITLE: 'Konto aktualisiert', + GREETING: (name) => COMMON.GREETING(name), + BODY: { + 1: (level) => + `Herzlichen Glückwunsch. Ihre Kontozugriffsstufe wird auf Stufe ${level} hochgestuft. Sie profitieren von niedrigeren Gebühren, höheren Auszahlungslimits und anderen Premium-Funktionen.`, + 2: 'Jetzt handeln' + }, + CLOSING: COMMON.CLOSING +}; + +const DEPOSITCANCEL = { + TITLE: (currency, type) => + `${currency.toUpperCase()} ${ + COMMON[type.toUpperCase()] + } abgelehnt`, + GREETING: (name) => COMMON.GREETING(name), + BODY: { + DEPOSIT: (currency, date, amount) => + `Wir waren nicht in der Lage, Ihre ${currency.toUpperCase()} Einzahlung zu finden oder zu bearbeiten, die am ${date} für ${amount} gemacht wurde. Daher wird die Transaktion von unserem System abgelehnt.`, + WITHDRAWAL: (currency, date, amount) => + `Wir waren nicht in der Lage, Ihre ${currency.toUpperCase()} Auszahlung zu finden oder zu bearbeiten, die am ${date} für ${amount} gemacht wurde. Dadurch wird die Transaktion von unserem System abgelehnt und Ihr ausstehender Abhebungsbetrag wird Ihrer ${API_NAME()} Geldbörse wieder gutgeschrieben.`, + 1: 'Wenn Sie weitere Fragen haben, können Sie auf diese E-Mail antworten', + 2: (txid) => COMMON.TXID(txid), + 3: (amount) => COMMON.AMOUNT(amount), + 4: 'Status: Abgelehnt' + }, + CLOSING: COMMON.CLOSING +}; + +const WITHDRAWAL = { + TITLE: (currency) => + `${currency.toUpperCase()} ${COMMON.WITHDRAWAL}`, + GREETING: (name) => COMMON.GREETING(name), + BODY: { + PENDING: (amount, address, currency) => + `Sie haben eine Auszahlungsanforderung für ${amount} ${currency.toUpperCase()} an die Adresse ${address} gemacht. Ihr Auszahlungsstatus ist ausstehend und wird in Kürze bearbeitet.`, + COMPLETED: (amount, address, currency) => + `Ihr Auszahlungsantrag für ${amount} ${currency.toUpperCase()} wurde bearbeitet und an die Adresse ${address} gesendet.`, + 1: (amount, currency) => `${COMMON.AMOUNT(amount)} ${currency.toUpperCase()}`, + 2: (fee) => COMMON.FEE(fee), + 3: (status) => `Status: ${status}`, + 4: (address) => COMMON.ADDRESS(address), + 5: (txid) => COMMON.TXID(txid), + 6: COMMON.EXPLORER + }, + CLOSING: COMMON.CLOSING +}; + +const WITHDRAWALREQUEST = { + TITLE: (currency) => + `${currency.toUpperCase()} ${COMMON.WITHDRAWAL} Anfrage`, + GREETING: (name) => COMMON.GREETING(name), + BODY: { + 1: (currency, amount, address) => + `Sie haben einen ${currency.toUpperCase()} Auszahlungsantrag von ${amount} an die Adresse ${address} gemacht`, + 2: (amount) => COMMON.AMOUNT(amount), + 3: (fee) => COMMON.FEE(fee), + 4: (address) => `Adresse: ${address}`, + 5: 'Um diese Auszahlung zu bestätigen, klicken Sie bitte auf die Taste unten.', + 6: 'Bestätigen', + 7: COMMON.ERROR_REQUEST, + 8: (ip) => COMMON.IP_REQUEST_FROM(ip) + }, + CLOSING: COMMON.CLOSING +}; + +const INVALIDADDRESS = { + TITLE: 'Ungültige Auszahlungsadresse', + GREETING: (name) => COMMON.GREETING(name), + BODY: { + 1: (currency, amount) => `Ihre ${currency} Auszahlung für ${amount} wurde an eine ungültige Adresse gesendet und wurde abgelehnt.`, + 2: (address) => `Adresse: ${address}` + }, + CLOSING: COMMON.CLOSING +}; + +const ALERT = { + TITLE: (title) => `WARNUNG: ${title}`, + BODY: { + 1: (type) => `Warnung: ${type}` + } +}; + +const USERVERIFICATIONREJECT = { + TITLE: (type) => + type === 'id' + ? 'ID-Verifizierung abgelehnt' + : 'Neuer Bankantrag abgelehnt', + GREETING: (name) => COMMON.GREETING(name), + BODY: { + 1: (type) => + type === 'id' + ? 'Ihre aktuelle ID-Verifizierung wurde bearbeitet und ist leider abgelehnt worden. Für weitere Aktionen lesen Sie die Nachricht unseres Experten unten:' + : 'Ihre neue Bankanmeldung wurde bearbeitet und ist leider abgelehnt worden. Für weitere Aktionen lesen Sie die Nachricht unseres Experten unten:', + 2: (message) => COMMON.MESSAGE(message) + }, + CLOSING: COMMON.CLOSING +}; + +const USERDEACTIVATED = { + TITLE: (type) => `Account ${type}`, + GREETING: (name) => COMMON.GREETING(name), + BODY: { + ACTIVATED: (email) => `Ihr Konto ${email} wurde aktiviert. Sie können nun Ihr Konto verwenden.`, + DEACTIVATED: (email) => `Ihr Konto ${email} wurde deaktiviert. Sie können Ihr Konto erst wieder verwenden, wenn es vom Administrator aktiviert wurde.` + }, + CLOSING: COMMON.CLOSING +}; + +const CONTACTFORM = { + TITLE: 'Kontakt-Formular', + BODY: { + 1: 'Kontakt-Formular Daten', + 2: (email) => + `Der Kunde mit der E-Mail ${email} hat das Kontaktformular abgeschickt.`, + 3: (data) => `${JSON.stringify(data, null, 2)}` + } +}; + +const USERVERIFICATION = { + TITLE: 'Benutzerverifizierung', + BODY: { + 1: 'Benutzerverifizierung erforderlich', + 2: (email) => + `Der Benutzer "${email}" hat seine Dokumente zur Überprüfung hochgeladen. Bitte verifizieren Sie seine Dokumente.` + } +}; + +const SUSPICIOUSDEPOSIT = { + TITLE: 'Verdächtige Einzahlung', + BODY: { + 1: 'Verdächtige Einzahlung', + 2: (email, currency) => + `Der Client mit der E-Mail ${email} hat eine ${currency.toUpperCase()} Einzahlung erhalten, die verdächtig ist.`, + 3: (txid) => COMMON.TXID(txid), + 4: 'Transaktionsdaten:', + 5: (data) => `${JSON.stringify(data)}` + } +}; + +const SMS = { + verificationCode: (code) => + `Ihr Verifizierungscode lautet ${code}` + , + deposit: (currency, amount) => + `Ihre ${currency.toUpperCase()} Einzahlung für den Betrag von ${amount} wurde bestätigt und in Ihrer Geldbörse hinterlegt` + , + withdrawal: (currency, amount) => + `Ihre ${currency.toUpperCase()} Abhebung für den Betrag von ${amount} wurde bestätigt.` +}; + +module.exports = { + FOOTER, + COMMON, + SIGNUP, + WELCOME, + LOGIN, + RESETPASSWORD, + DEPOSIT, + ACCOUNTVERIFY, + ACCOUNTUPGRADE, + USERVERIFICATIONREJECT, + DEPOSITCANCEL, + WITHDRAWAL, + WITHDRAWALREQUEST, + USERVERIFICATION, + SUSPICIOUSDEPOSIT, + INVALIDADDRESS, + CONTACTFORM, + USERDEACTIVATED, + ALERT, + SMS +}; diff --git a/web/src/config/lang/de.js b/web/src/config/lang/de.js new file mode 100644 index 0000000000..cf200c5749 --- /dev/null +++ b/web/src/config/lang/de.js @@ -0,0 +1,1335 @@ +import AGREEMENT from '../agreement'; +import LANGUAGES from '../languages'; + +export default { + APP_TITLE: 'HollaEx', + APP_SUB_TITLE: 'Open Crypto Exchange', // slogan + + LOGOUT_CONFIRM_TEXT: 'Sind Sie sicher, dass Sie sich abmelden wollen?', + ADD_TRADING_PAIR: 'Trading-Paar hinzufügen', + ACTIVE_TRADES: 'Sie müssen {0}, um auf Ihre aktiven Trades zuzugreifen', + CANCEL_BASE_WITHDRAWAL: 'Abbrechen {0} Auszahlung', + CANCEL_WITHDRAWAL: 'Auszahlung abbrechen', + CANCEL_WITHDRAWAL_POPUP_CONFIRM: + 'Möchten Sie Ihre ausstehende Auszahlung stornieren?:', + CANT_BE_CANCELLED: '-', + ALREADY_CANCELLED: '-', + TIMESTAMP_FORMAT: 'YYYY/MM/DD HH:mm:ss', + HOUR_FORMAT: 'HH:mm:ss', + LOGIN_TEXT: 'Login', + SIGN_IN: 'Anmelden', + SIGNUP_TEXT: 'Registrieren', + REGISTER_TEXT: 'Registrieren', + ACCOUNT_TEXT: 'Account', + HOME_TEXT: 'Startseite', + CLOSE_TEXT: 'Schließen', + COPY_TEXT: 'Kopieren', + COPY_SUCCESS_TEXT: 'Erfolgreich kopiert', + CANCEL_SUCCESS_TEXT: 'Erfolgreich abgebrochen!', + UPLOAD_TEXT: 'Hochladen', + ADD_FILES: 'DATEIEN HINZUFÜGEN', // ToDo + OR_TEXT: 'Oder', + CONTACT_US_TEXT: 'Kontaktieren Sie uns', + HELPFUL_RESOURCES_TEXT: 'Hilfreiche Ressourcen', + HELP_RESOURCE_GUIDE_TEXT: + 'Für weitere Informationen und bei Fragen können Sie uns gerne eine E-Mail senden', + HELP_TELEGRAM_TEXT: 'Prüfen Sie die offene API-Dokumentation:', + HELP_TELEGRAM_LINK: 'https://apidocs.hollaex.com', + NEED_HELP_TEXT: 'Brauchen Sie Hilfe?', // new + HELP_TEXT: 'Hilfe', + SUCCESS_TEXT: 'Erfolg', + ERROR_TEXT: 'Fehler', + PROCEED: 'FORTFAHREN', + EDIT_TEXT: 'Bearbeiten', + BACK_TEXT: 'Zurück', + NO_OPTIONS: 'Es sind keine Optionen verfügbar', + SECONDS: 'Sekunden', + VIEW_MARKET: 'Markt ansehen', // new + GO_TRADE: 'Gehen Sie traden', // new + VIEW_INFO: 'Info-Seite anzeigen', // new + APPLY_HERE: 'Hier bewerben', // new + HOME: { + SECTION_1_TITLE: 'Willkommen bei HollaEx Exchange Kit!', + SECTION_1_TEXT_1: + 'Bauen Sie Ihre eigene skalierbare Börse für digitale Vermögenswerte mit dem HollaEx Kit und seien Sie Teil der Zukunft des Finanzwesens.', + SECTION_1_TEXT_2: + 'Wir streben danach, die Finanztechnologie durch einen erschwinglichen und einfachen Zugang zur Handelstechnologie voranzubringen.', + SECTION_1_BUTTON_1: 'Mehr erfahren', + SECTION_3_TITLE: 'Merkmale', + SECTION_3_CARD_1_TITLE: 'SKALIERBARE MATCHING-ENGINE', + SECTION_3_CARD_1_TEXT: + 'Leistungsstarke und skalierbare Order-Matching-Engine mit den effizientesten Algorithmen', + SECTION_3_CARD_2_TITLE: 'BANKINTEGRATION', + SECTION_3_CARD_2_TEXT: + 'Plugins mit anpassbaren Modulen für die Bankintegration verfügbar. Wir kennen das traditionelle Finanzwesen und können Ihnen helfen, Ihren Austausch lokal zu machen', + SECTION_3_CARD_3_TITLE: 'HOHE SICHERHEIT', + SECTION_3_CARD_3_TEXT: + 'HollaEx verwendet die besten Sicherheitspraktiken und die sichersten und zuverlässigsten Algorithmen, um die Guthaben sicher zu halten. Es ist unsere oberste Priorität und wir haben uns ganz besonders darum gekümmert.', + SECTION_3_CARD_4_TITLE: 'ERWEITERTE BERICHTERSTATTUNG', + SECTION_3_CARD_4_TEXT: + 'Admin-Panel mit anpassbaren E-Mails und Berichten zur Benachrichtigung von Support und Administrator über den Status des Systems und der Transaktionen.', + SECTION_3_CARD_5_TITLE: 'SUPPORT', + SECTION_3_CARD_5_TEXT: + 'Wir kümmern uns um Ihre Bedürfnisse und haben einen Online-Profi, der Ihnen bei Ihren Problemen und Anfragen helfen kann.', + SECTION_3_CARD_6_TITLE: 'KYC-INTEGRATION', + SECTION_3_CARD_6_TEXT: + 'Flexible und integrierbare Module zur Anwendung von KYC- und Benutzerverifizierungsmethoden in verschiedenen Rechtsordnungen.', + SECTION_3_BUTTON_1: 'Demo ansehen' + }, + FOOTER: { + FOOTER_LEGAL: ['Proudly made in Seoul, South Korea', 'bitHolla Inc.'], + FOOTER_LANGUAGE_TEXT: 'SPRACHE', + FOOTER_COPYRIGHT: 'Powered by bitHolla', + SECTIONS: { + SECTION_1_TITLE: 'ÜBER', + SECTION_1_LINK_1: 'Über uns', + SECTION_1_LINK_2: 'Nutzungsbedingungen', + SECTION_1_LINK_3: 'Datenschutzrichtlinie', + SECTION_1_LINK_4: 'Kontaktieren Sie uns', + SECTION_2_TITLE: 'Informationen', + SECTION_2_LINK_1: 'Blog', + SECTION_2_LINK_2: 'Kontaktieren Sie uns', + SECTION_2_LINK_3: 'Karriere', + SECTION_3_TITLE: 'ENTWICKLER', + SECTION_3_LINK_1: 'Dokumentation', + SECTION_3_LINK_2: 'Forum', + SECTION_3_LINK_3: 'GitHub', + SECTION_3_LINK_4: 'Bibliothek', + SECTION_3_LINK_5: 'API doc', + SECTION_3_LINK_6: 'Trading API', + SECTION_3_LINK_7: 'Entwickler-Tools', + SECTION_3_LINK_8: 'Dokumentation', + SECTION_4_TITLE: 'EXCHANGE', + SECTION_4_LINK_1: 'Anmeldung', + SECTION_4_LINK_2: 'Registrieren', + SECTION_4_LINK_3: 'Kontaktieren Sie uns', + SECTION_4_LINK_4: 'Nutzungsbedingungen', + SECTION_5_TITLE: 'RESSOURCEN', + SECTION_5_LINK_1: 'Whitepaper', + SECTION_5_LINK_2: 'HollaEx Token (XHT) ', + SECTION_5_LINK_3: 'GitHub', + SECTION_5_LINK_4: 'HÄUFIG GESTELLTE FRAGEN', // new + SECTION_6_TITLE: 'SOCIAL', + SECTION_6_LINK_1: 'Twitter', + SECTION_6_LINK_2: 'Telegram', + SECTION_6_LINK_3: 'Facebook', // new + SECTION_6_LINK_4: 'Instagram', // new + SECTION_6_LINK_5: 'Linkedin', // new + SECTION_6_LINK_6: 'Website', // new + SECTION_6_LINK_7: 'Helpdesk', // new + SECTION_6_LINK_8: 'Information', // new + SECTION_6_LINK_9: 'YouTube', // new + }, + XHT_DESCRIPTION: + 'HollaEx Kit ist eine Open-Source-Handelsplattform, die von bitHolla Inc. entwickelt wurde. Mit diesem Exchange Kit können Sie beliebige digitale Assets erstellen und auflisten und Benutzer für den Handel an Ihrer Börse einbinden. Um einfach einen selbst zu betreiben {1}.', + CLICK_HERE: 'klicken Sie hier', + VISIT_HERE: 'besuchen Sie hier' + }, + ACCOUNTS: { + TITLE: 'Konto', + TAB_VERIFICATION: 'Verifizierung', + TAB_SECURITY: 'Sicherheit', + TAB_NOTIFICATIONS: 'Benachrichtigungen', + TAB_SETTINGS: 'Einstellungen', + TAB_PROFILE: 'Profil', + TAB_WALLET: 'Geldbörse', + TAB_SUMMARY: 'Zusammenfassung', + TAB_HISTORY: 'Verlauf', + TAB_API: 'API', + TAB_SIGNOUT: 'Abmelden' + }, + REQUEST_XHT_ACCESS: { + // new + REQUEST_TITLE: 'Zugang anfordern', + REQUEST_INVITE: 'Einladung anfordern', + CATEGORY_PLACEHOLDER: 'Wählen Sie die Kategorie, die am besten zu Ihrem Problem passt', + INTRODUCTION_LABEL: 'Stellen Sie sich vor', + INTRODUCTION_PLACEHOLDER: + 'Wo sind Sie ansässig? Sind Sie an einem Exchange interessiert?' + }, + CONTACT_FORM: { + CATEGORY_LABEL: 'Kategorie', + CATEGORY_PLACEHOLDER: 'Wählen Sie die Kategorie, die am besten zu Ihrem Problem passt', + CATEGORY_OPTIONS: { + OPTION_VERIFY: 'Benutzerverifizierung', + OPTION_LEVEL: 'Benutzerlevel erhöhen', + OPTION_DEPOSIT: 'Einzahlung & Auszahlung', + OPTION_BUG: 'Fehler melden', // ToDo: + OPTION_PERSONAL_INFO: 'Persönliche Informationen ändern', // ToDo: + OPTION_BANK_TRANSFER: 'Banküberweisung', // new + OPTION_REQUEST: 'Einladung für die XIV Exchange anfordern' // new + }, + SUBJECT_LABEL: 'Betreff', + SUBJECT_PLACEHOLDER: 'Geben Sie den Betreff Ihres Problems ein', + DESCRIPTION_LABEL: 'Beschreibung', + DESCRIPTION_PLACEHOLDER: 'Geben Sie detailliert an, was das Problem ist', + ATTACHMENT_LABEL: 'Anhänge hinzufügen (max. 3)', // ToDo: + ATTACHMENT_PLACEHOLDER: + 'Fügen Sie eine Datei hinzu, um Ihr Problem zu verdeutlichen. PDF-, JPG-, PNG- und GIF-Dateien werden akzeptiert', + SUCCESS_MESSAGE: 'Die E-Mail wurde an unseren Kundensupport gesendet', + SUCCESS_TITLE: 'Nachricht gesendet', + SUCCESS_MESSAGE_1: 'Ihr Problem wurde an den Kundensupport weitergeleitet.', + SUCCESS_MESSAGE_2: 'Sie können in 1 bis 3 Tagen mit einer Antwort rechnen.' + }, + DEPOSIT: { + CRYPTO_LABELS: { + ADDRESS: 'Ihre {0} Empfangsadresse', // new + DESTINATION_TAG: 'Ihr {0} Ziel-Etikett', // new + MEMO: 'Ihr {0} Memo', // new + BTC: 'Ihre Bitcoin-Empfangsadresse', + ETH: 'Ihre Ethereum-Empfangsadresse', + BCH: 'Ihre Bitcoin Cash-Empfangsadresse' + }, + INCREASE_LIMIT: 'Möchten Sie Ihr Tageslimit erhöhen?', + QR_CODE: + 'Dieser QR-Code kann von der Person gescannt werden, die Ihnen Geld senden möchte', + NO_DATA: 'Keine Informationen verfügbar', + FULL_MESSAGE_LIMIT: '{0}: {1} {2} {3}' // 0 -> {Daily deposit max amount}: 1 -> {50,000,000} 2 -> {T} 3 -> {(Want to increase your daily limit?)} + }, + LOGIN: { + LOGIN_TO: 'Bei {0} anmelden', + CANT_LOGIN: "Sie können sich nicht anmelden?", + NO_ACCOUNT: "Sie haben noch kein Konto?", + CREATE_ACCOUNT: 'Erstellen Sie hier ein Konto', + HELP: 'Hilfe' + }, + FORM_FIELDS: { + EMAIL_LABEL: 'E-Mail', + EMAIL_PLACEHOLDER: 'Geben Sie Ihre E-Mail Adresse ein', + PASSWORD_LABEL: 'Passwort', + PASSWORD_PLACEHOLDER: 'Geben Sie Ihr Passwort ein', + PASSWORD_REPEAT_LABEL: 'Geben Sie Ihr Passwort erneut ein', + PASSWORD_REPEAT_PLACEHOLDER: 'Geben Sie Ihr Passwort erneut ein' + }, + VALIDATIONS: { + OTP_LOGIN: 'OTP-Code zur Anmeldung bereitstellen', + CAPTCHA: 'Abgelaufene Sitzung. Bitte aktualisieren Sie die Seite', + FROZEN_ACCOUNT: 'Dieses Konto ist eingefrorenn', + INVALID_EMAIL: 'Ungültige E-Mail Adresse', + TYPE_EMAIL: 'Geben Sie Ihre E-Mail ein', + REQUIRED: 'Erforderliches Feld', + INVALID_DATE: 'Ungültiges Datum', + INVALID_PASSWORD: + 'Ungültiges Passwort. Es muss mindestens 8 Zeichen, eine Ziffer im Passwort und ein Sonderzeichen enthalten.', + INVALID_PASSWORD_2: + 'Ungültiges Passwort. Es muss mindestens 8 Zeichen, mindestens eine Ziffer und ein Zeichen enthalten.', + INVALID_CURRENCY: 'Ungültige {0} Adresse ({1})', + INVALID_BALANCE: + 'Unzureichender Saldo verfügbar ({0}), um den Vorgang durchzuführen ({1}).', + MIN_VALUE: 'Wert muss {0} oder höher sein.', + MAX_VALUE: 'Wert muss {0} oder niedriger sein.', + INSUFFICIENT_BALANCE: 'Unzureichende Balance', + PASSWORDS_DONT_MATCH: "Passwort stimmt nicht überein", + USER_EXIST: 'E-Mail wurde bereits registriert', + ACCEPT_TERMS: 'Sie haben den Nutzungsbedingungen und der Datenschutzrichtlinie nicht zugestimmt', + STEP: 'Ungültiger Wert, Schritt ist {0}', + ONLY_NUMBERS: 'Wert kann nur Zahlen enthalten' + }, + LEGAL: { + PRIVACY_POLICY: { + TITLE: 'Datenschutzrichtlinie', + SUBTITLE: + 'Zuletzt aktualisiert am 1. April 2019. Ersetzt die vorherige Version in ihrer Gesamtheit.', + TEXTS: [ + 'HollaEx Web ist eine virtuelle Trading-Plattform, die sich zu 100 % im Besitz von bitHolla Inc. befindet. bitHolla Inc (im Folgenden bitHolla genannt) wurde in Seoul, Südkorea, gegründet.', + 'Die Nutzung dieser HollaEx-Website ("Website") und der auf der Website angebotene Service ("Service") unterliegen den auf dieser Seite mit den Allgemeinen Geschäftsbedingungen ("Bedingungen") enthaltenen Bestimmungen. Diese Vereinbarung stellt die gesamte Vereinbarung zwischen den Parteien dar. Alle anderen auf der Website zur Verfügung gestellten Informationen oder mündlich/schriftlich abgegebenen Erklärungen sind von dieser Vereinbarung ausgeschlossen; die Umtauschbestimmungen dienen nur zur Orientierung und stellen keine rechtliche Vereinbarung zwischen den Parteien dar.', + 'Durch den Zugriff, die Ansicht oder das Herunterladen von Informationen von der Website und die Nutzung des von bitHolla bereitgestellten Dienstes bestätigen Sie, dass Sie diese Bedingungen gelesen und verstanden haben und bedingungslos zustimmen, an sie gebunden zu sein. bitHolla kann die Bedingungen jederzeit und ohne vorherige Ankündigung ändern. Sie stimmen zu, dass Sie weiterhin an alle geänderten Bedingungen gebunden sind und dass bitHolla keine Verpflichtung hat, Sie über solche Änderungen zu informieren. Sie erkennen an, dass es in Ihrer Verantwortung liegt, diese Bedingungen regelmäßig auf Änderungen zu überprüfen und dass Ihre fortgesetzte Nutzung der Website und der von bitHolla angebotenen Dienste nach der Veröffentlichung von Änderungen der Bedingungen bedeutet, dass Sie diese Änderungen akzeptieren.', + 'Die Website und das Urheberrecht an allen Texten, Grafiken, Bildern, Software und allen anderen Materialien auf der Website sind Eigentum von bitHolla, einschließlich aller Marken und anderer geistiger Eigentumsrechte in Bezug auf die Materialien und den Service auf der Website. Die Materialien auf dieser Website dürfen nur für den persönlichen Gebrauch und für nicht-kommerzielle Zwecke verwendet werden.', + 'Sie dürfen Auszüge der Website nur für den oben genannten Zweck auf einem Computerbildschirm anzeigen oder ausdrucken, vorausgesetzt, dass Sie alle Urheberrechts- und sonstigen Eigentumshinweise sowie alle bitHolla-Marken oder -Logos beibehalten, wie sie auf dem ersten Ausdruck oder Download angezeigt werden, ohne sie zu ändern, hinzuzufügen oder zu löschen. Sofern nicht ausdrücklich angegeben, dürfen Sie ohne die vorherige schriftliche Genehmigung von bitHolla keine Materialien der Website verändern, modifizieren, reproduzieren, verteilen oder in einem anderen kommerziellen Kontext verwenden.', + 'Sie erkennen an, dass bitHolla und das bitHolla-Logo Warenzeichen von bitHolla Inc. sind. Sie dürfen diese Warenzeichen ohne Änderungen auf dem von dieser Website heruntergeladenen Material in dem oben genehmigten Umfang wiedergeben, aber Sie dürfen sie nicht anderweitig verwenden, kopieren, anpassen oder löschen.', + 'Sie dürfen unter keinen Umständen irgendwelche Rechte über oder in Bezug auf die Website erhalten (außer den Rechten zur Nutzung der Website gemäß diesen Bedingungen und anderen Bedingungen, die einen bestimmten Dienst oder Abschnitt der Website regeln) oder sich als Inhaber solcher Rechte über oder in Bezug auf die Website ausgeben.' + ] + }, + GENERAL_TERMS: { + TITLE: 'Allgemeine Geschäftsbedingungen', + SUBTITLE: + 'Zuletzt aktualisiert am 1. April 2019. Ersetzt die vorherige Version in vollem Umfang.', + TEXTS: [ + 'HollaEx Web ist eine virtuelle Trading-Plattform, die sich zu 100 % im Besitz von bitHolla Inc. befindet. bitHolla Inc (im Folgenden bitHolla genannt) wurde in Seoul, Südkorea, gegründet.', + 'Die Nutzung dieser HollaEx-Website ("Website") und der auf der Website angebotene Service ("Service") unterliegen den auf dieser Seite mit den Allgemeinen Geschäftsbedingungen ("Bedingungen") enthaltenen Bestimmungen. Diese Vereinbarung stellt die gesamte Vereinbarung zwischen den Parteien dar. Alle anderen auf der Website zur Verfügung gestellten Informationen oder mündlich/schriftlich abgegebenen Erklärungen sind von dieser Vereinbarung ausgeschlossen; die Umtauschbestimmungen dienen nur zur Orientierung und stellen keine rechtliche Vereinbarung zwischen den Parteien dar.', + 'Durch den Zugriff, die Ansicht oder das Herunterladen von Informationen von der Website und die Nutzung des von bitHolla bereitgestellten Dienstes bestätigen Sie, dass Sie diese Bedingungen gelesen und verstanden haben und bedingungslos zustimmen, an sie gebunden zu sein. bitHolla kann die Bedingungen jederzeit und ohne vorherige Ankündigung ändern. Sie stimmen zu, dass Sie weiterhin an alle geänderten Bedingungen gebunden sind und dass bitHolla keine Verpflichtung hat, Sie über solche Änderungen zu informieren. Sie erkennen an, dass es in Ihrer Verantwortung liegt, diese Bedingungen regelmäßig auf Änderungen zu überprüfen und dass Ihre fortgesetzte Nutzung der Website und der von bitHolla angebotenen Dienste nach der Veröffentlichung von Änderungen der Bedingungen bedeutet, dass Sie diese Änderungen akzeptieren.', + 'Die Website und das Urheberrecht an allen Texten, Grafiken, Bildern, Software und allen anderen Materialien auf der Website sind Eigentum von bitHolla, einschließlich aller Marken und anderer geistiger Eigentumsrechte in Bezug auf die Materialien und den Service auf der Website. Die Materialien auf dieser Website dürfen nur für den persönlichen Gebrauch und für nicht-kommerzielle Zwecke verwendet werden.', + 'Sie dürfen Auszüge der Website nur für den oben genannten Zweck auf einem Computerbildschirm anzeigen oder ausdrucken, vorausgesetzt, dass Sie alle Urheberrechts- und sonstigen Eigentumshinweise sowie alle bitHolla-Marken oder -Logos beibehalten, wie sie auf dem ersten Ausdruck oder Download angezeigt werden, ohne sie zu ändern, hinzuzufügen oder zu löschen. Sofern nicht ausdrücklich angegeben, dürfen Sie ohne die vorherige schriftliche Genehmigung von bitHolla keine Materialien der Website verändern, modifizieren, reproduzieren, verteilen oder in einem anderen kommerziellen Kontext verwenden.', + 'Sie erkennen an, dass bitHolla und das bitHolla-Logo Warenzeichen von bitHolla Inc. sind. Sie dürfen diese Warenzeichen ohne Änderungen auf dem von dieser Website heruntergeladenen Material in dem oben genehmigten Umfang wiedergeben, aber Sie dürfen sie nicht anderweitig verwenden, kopieren, anpassen oder löschen.', + 'Sie dürfen unter keinen Umständen irgendwelche Rechte über oder in Bezug auf die Website erhalten (außer den Rechten zur Nutzung der Website gemäß diesen Bedingungen und anderen Bedingungen, die einen bestimmten Dienst oder Abschnitt der Website regeln) oder sich als Inhaber solcher Rechte über oder in Bezug auf die Website ausgeben.' + ] + } + }, + NOTIFICATIONS: { + BUTTONS: { + OKAY: 'Okay', + START_TRADING: 'Handel beginnen', + SEE_HISTORY: 'siehe Verlauf' + }, + DEPOSITS: { + TITLE_RECEIVED: '{0} Einzahlung erhalten', + TITLE_INCOMING: 'Eingehend {0}', + SUBTITLE_RECEIVED: 'Sie haben Ihre {0} Einzahlung erhalten', + SUBTITLE_INCOMING: 'Sie haben eingehende {0}', + INFORMATION_PENDING_1: + 'Ihre {0} benötigen 1 Bestätigungen, bevor Sie mit dem Handel beginnen können.', + INFORMATION_PENDING_2: + 'Dies kann 10-30 Minuten dauern. Wir senden eine E-Mail, sobald Ihre {0} in der Blockchain bestätigt wurde.' + } + }, + REFERRAL_SUCCESS: { + TITLE: 'Anfrage gesendet', + BUTTON_TEXT: 'Okay' + }, + OTP_FORM: { + OTP_FORM_TITLE: 'Geben Sie Ihren Authentifizierungscode ein, um fortzufahren', + OTP_LABEL: 'OTP-Code', + OTP_PLACEHOLDER: 'Geben Sie den Authentifizierungscode ein', + OTP_TITLE: 'Authentifizierungscode', + OTP_HELP: 'Hilfe', + OTP_BUTTON: 'einreichen', + ERROR_INVALID: 'Ungültiger OTP-Code' + }, + QUICK_TRADE_COMPONENT: { + TITLE: 'Quick', + TOTAL_COST: 'Gesamtkosten', + BUTTON: 'Überprüfung {0} Auftrag', + INPUT: '{0} bis {1}', + TRADE_TITLE: '{0} {1}' // quick buy + }, + PREVIOUS_PAGE: 'vorherige Seite', + NEXT_PAGE: 'nächste Seite', + WALLET: { + LOADING_ASSETS: 'Assets werden geladen...', // new + TOTAL_ASSETS: 'Gesamtvermögen', + AVAILABLE_WITHDRAWAL: 'Für den Handel verfügbar', + AVAILABLE_TRADING: 'Für Entnahme verfügbar', + ORDERS_PLURAL: 'orders', + ORDERS_SINGULAR: 'order', + HOLD_ORDERS: + 'Sie haben {0} offen {1}, was zu einem Halt von {2} {3} auf Ihrem {4} Saldo führt' + }, + REQUEST_RESET_PASSWORD: { + TITLE: 'Konto-Wiederherstellung', + SUBTITLE: `Stellen Sie Ihr Konto unten wieder her`, + SUPPORT: 'Kontaktieren Sie den Kundendienst.', + BUTTON: 'Wiederherstellungslink senden' + }, + REQUEST_RESET_PASSWORD_SUCCESS: { + TITLE: 'Passwortrücksetzung gesendet', + TEXT: + 'Wenn für die E-Mail-Adresse ein Konto existiert, wurde eine E-Mail mit Anweisungen zum Zurücksetzen an diese Adresse gesendet. Bitte prüfen Sie Ihre E-Mail und klicken Sie auf den Link, um das Zurücksetzen des Passworts abzuschließen.' + }, + RESET_PASSWORD: { + TITLE: 'Neues Passwort festlegen', + SUBTITLE: 'Neues Passwort festlegen', + BUTTON: 'Neues Passwort festlegen' + }, + RESET_PASSWORD_SUCCESS: { + TEXT_1: 'Sie haben erfolgreich ein neues Passwort eingerichtet.', + TEXT_2: 'Klicken Sie unten auf Login, um fortzufahren.' + }, + SIGN_UP: { + SIGNUP_TO: 'Registrieren Sie sich bei {0}', + NO_EMAIL: "Haben Sie die E-Mail nicht erhalten?", + REQUEST_EMAIL: 'Hier ein weitere E-Mail anfordern', + HAVE_ACCOUNT: 'Sie haben bereits ein Konto?', + GOTO_LOGIN: 'Gehen Sie zur Anmeldeseite', + AFFILIATION_CODE: 'Empfehlungscode (optional)', + AFFILIATION_CODE_PLACEHOLDER:'Geben Sie Ihren Empfehlungscode ein', + TERMS: { + terms: 'Allgemeine Bedingungen', + policy: 'Datenschutzrichtlinie', + text: 'Ich habe die {0} und {1} gelesen und stimme ihnen zu.' + } + }, + VERIFICATION_TEXTS: { + TITLE: 'E-Mail gesendet', + TEXT_1: 'Prüfen Sie Ihre E-Mail und klicken Sie auf den Link, um Ihre E-Mail zu verifizieren.', + TEXT_2: + 'If you have not received any email verification and you have checked your junk mail then you can try clicking resend below.' + }, + VERIFICATION_EMAIL_REQUEST: { + TITLE: 'E-Mail-Anfrage erneut senden', + BUTTON: 'E-Mail anfordern' + }, + VERIFICATION_EMAIL_REQUEST_SUCCESS: { + TITLE: 'E-Mail erneut senden', + TEXT_1: + 'Wenn Sie nach einigen Minuten immer noch keine E-Mail-Bestätigung erhalten haben, kontaktieren Sie uns bitte unten.' + }, + VERIFICATION_EMAIL: { + INVALID_UUID: 'Ungültiger Code', + TEXT_1: "Sie haben Ihre E-Mail erfolgreich verifiziert.", + TEXT_2: 'Sie können nun zur Anmeldung fortfahren.' + }, + USER_VERIFICATION: { + INFO_TXT: + 'Hier können Sie Ihren Fortschritt auf dem Weg zur Verifizierung und zu einem Konto-Upgrade überwachen.', + INFO_TXT_1: + 'Bitte übermitteln Sie die relevanten Informationen, die für jeden Abschnitt unten benötigt werden. Erst wenn alle Abschnitte ausgefüllt sind, werden Ihre Informationen geprüft und für ein Konto-Upgrade genehmigt.', + INFO_TXT_2: + '* Für die Verifizierung des Identitätsabschnitts benötigen Sie {0} bestimmte Dokumente.', + DOCUMENTATIONS: 'upload', + COMPLETED: 'Abgeschlossen', + PENDING_VERIFICATION: 'Ausstehende Überprüfung', + TITLE_EMAIL: 'E-Mail', + MY_EMAIL: 'Meine E-mail', + MAKE_FIRST_DEPOSIT: 'Erste Einzahlung vornehmen', // new + OBTAIN_XHT: 'XHT erhalten', // new + TITLE_USER_DOCUMENTATION: 'Identifikation', + TITLE_ID_DOCUMENTS: 'Upload', + TITLE_BANK_ACCOUNT: 'Bankkonto', + TITLE_MOBILE_PHONE: 'Mobiltelefon', + TITLE_PERSONAL_INFORMATION: 'Persönliche Informationen', + VERIFY_EMAIL: 'E-Mail verifizieren', + VERIFY_MOBILE_PHONE: 'Mobiltelefon verifizieren', + VERIFY_USER_DOCUMENTATION: 'Benutzerdokumentation überprüfen', + VERIFY_ID_DOCUMENTS: 'Ausweisdokumente prüfen', + VERIFY_BANK_ACCOUNT: 'Bankkonto überprüfen', + BUTTON: 'Verifizierungsanfrage einreichen', + TITLE_IDENTITY: 'Identität', + TITLE_MOBILE: 'Mobiltelefon', + TITLE_MOBILE_HEADER: 'Mobiltelefon-Nummer', + TITLE_BANK: 'Bank', + TITLE_BANK_HEADER: 'Bankverbindung', + CHANGE_VALUE: 'Wert ändern', + PENDING_VERIFICATION_PERSONAL_INFORMATION: + 'Ihre persönlichen Daten werden bearbeitet.', + PENDING_VERIFICATION_BANK: 'Ihre Bankverbindung wird überprüft', + PENDING_VERIFICATION_DOCUMENTS: 'Ihre Dokumente werden geprüft', + GOTO_VERIFICATION: 'Zur Verifizierung gehen', + GOTO_WALLET: 'Zur Geldbörse gehen', // new + CONNECT_BANK_ACCOUNT: 'Bankkonto verbinden', + ACTIVATE_2FA: '2FA aktivieren', + INCOMPLETED: 'Unvollständig', + BANK_VERIFICATION: 'Bank Verifizierung', + IDENTITY_VERIFICATION: 'Identitätsverifizierung', + PHONE_VERIFICATION: 'Telefonverifizierung', + DOCUMENT_VERIFICATION: 'Dokumentenverifizierung', + START_BANK_VERIFICATION: 'Bankverifizierung starten', + START_IDENTITY_VERIFICATION: 'Identitätsverifizierung starten', + START_PHONE_VERIFICATION: 'Telefonverifizierung starten', + START_DOCUMENTATION_SUBMISSION: 'Dokumentationsübermittlung beginnen', + GO_BACK: 'Zurück', + BANK_VERIFICATION_TEXT_1: + 'Sie können bis zu 3 Bankkonten hinzufügen. Bei internationalen Bankkonten müssen Sie den Kundensupport kontaktieren und haben begrenzte Abhebungslimits.', + BANK_VERIFICATION_TEXT_2: + 'Durch die Verifizierung Ihres Bankkontos können Sie Folgendes erhalten:', + BASE_WITHDRAWAL: 'Fiat Abhebung', + BASE_DEPOSITS: 'Fiat Anlagen', + ADD_ANOTHER_BANK_ACCOUNT: 'Weiteres Bankkonto hinzufügen', + BANK_NAME: 'Bank Name', + ACCOUNT_NUMBER: 'Kontonummer', + CARD_NUMBER: 'Kartennummer', + BANK_VERIFICATION_HELP_TEXT: + 'Damit dieser Abschnitt verifiziert werden kann, müssen Sie den Abschnitt {0} ausfüllen.', + DOCUMENT_SUBMISSION: 'Dokument einreichen', + REVIEW_IDENTITY_VERIFICATION: 'Überprüfung der Identitätsverifizierung', + PHONE_DETAILS: 'Telefon Details', + PHONE_COUNTRY_ORIGIN: 'Tel. Anwendungsland', + MOBILE_NUMBER: 'Handy-Nummer', + DOCUMENT_PROOF_SUBMISSION: 'Einreichung von Dokumentenbeweisen', + START_DOCUMENTATION_RESUBMISSION: 'Start Dokumentation Neueinreichung', + SUBMISSION_PENDING_TXT: + '*Dieser Abschnitt wurde bereits übermittelt. Wenn Sie Änderungen vornehmen und erneut übermitteln, werden Ihre vorherigen Informationen überschrieben.', + CUSTOMER_SUPPORT_MESSAGE: 'Meldung des Kundendienstes', + DOCUMENT_PENDING_NOTE: + 'Ihre Dokumente sind eingereicht und warten auf die Überprüfung. Bitte haben Sie etwas Geduld.', + DOCUMENT_VERIFIED_NOTE: 'Ihre Dokumente sind vollständig.', + NOTE_FROM_VERIFICATION_DEPARTMENT: 'Hinweis aus der Verifikationsabteilung', + CODE_EXPIRES_IN: 'Code läuft ab in', + USER_DOCUMENTATION_FORM: { + FORM_FIELDS: { + FIRST_NAME_LABEL: 'Vorname', + FIRST_NAME_PLACEHOLDER: + 'Geben Sie Ihren Vornamen so ein, wie er in Ihrem Ausweisdokument steht', + LAST_NAME_LABEL: 'Nachname', + LAST_NAME_PLACEHOLDER: + 'Geben Sie Ihren Nachnamen so ein, wie er in Ihrem Ausweisdokument steht', + FULL_NAME_LABEL: 'Ihr vollständiger Name', + FULL_NAME_PLACEHOLDER: + 'Geben Sie Ihren vollständigen Namen ein, wie er in Ihrem Ausweisdokument steht', + GENDER_LABEL: 'Geschlecht', + GENDER_PLACEHOLDER: 'Geben Sie an, welches Geschlecht Sie haben', + GENDER_OPTIONS: { + MAN: 'Männlich', + WOMAN: 'Weiblich' + }, + NATIONALITY_LABEL: 'Nationalität', + NATIONALITY_PLACEHOLDER: + 'Geben Sie ein, welche Nationalität in Ihrem Ausweisdokument steht', + DOB_LABEL: 'Geburtsdatum', + COUNTRY_LABEL: 'Land Ihres Wohnsitzes', + COUNTRY_PLACEHOLDER: 'Wählen Sie das Land aus, in dem Sie sich derzeit befinden.', + CITY_LABEL: 'Stadt', + CITY_PLACEHOLDER: 'Geben Sie die Stadt ein, in der Sie wohnen', + ADDRESS_LABEL: 'Adresse', + ADDRESS_PLACEHOLDER: 'Geben Sie die Adresse ein, wo Sie derzeit wohnen', + POSTAL_CODE_LABEL: 'Postleitzahl', + POSTAL_CODE_PLACEHOLDER: 'Geben Sie Ihre Postleitzahl ein', + PHONE_CODE_LABEL: 'Land', + PHONE_CODE_PLACEHOLDER: 'Wählen Sie das Land, in dem Ihr Telefon angemeldet ist', + PHONE_CODE_DISPLAY: '({0}) {1}', // 0 -> (+21) 1 -> South Korea + PHONE_NUMBER_LABEL: 'Telefonnummer', + PHONE_NUMBER_PLACEHOLDER: 'Geben Sie Ihre Telefonnummer ein', + CONNECTING_LOADING: 'Verbinden', + SMS_SEND: 'SMS senden', + SMS_CODE_LABEL: 'SMS-Code', + SMS_CODE_PLACEHOLDER: 'Geben Sie Ihren SMS-Code ein' + }, + INFORMATION: { + TEXT: + 'WICHTIG: Geben Sie Ihren Namen genau so in die Felder ein, wie er in Ihrem Ausweisdokument steht (vollständiger Vorname, eventuelle Zweitnamen/Initialen und vollständiger Nachname(n)). Sind Sie ein Unternehmen? Wenden Sie sich an den Kundensupport für ein Firmenkonto.', + TITLE_PERSONAL_INFORMATION: 'Persönliche Informationen', + TITLE_PHONE: 'Handy', + PHONE_VERIFICATION_TXT: + 'Die Angabe gültiger Kontaktdaten hilft uns sehr bei der Konfliktlösung und verhindert unerwünschte Transaktionen auf Ihrem Konto.', + PHONE_VERIFICATION_TXT_1: + 'Erhalten Sie Echtzeit-Updates für Ein- und Auszahlungen, indem Sie Ihre Handynummer mitteilen.', + PHONE_VERIFICATION_TXT_2: + 'Beweisen Sie außerdem Ihre Identität und Adresse, indem Sie Ihre LAN-Telefonnummer angeben (optional).' + } + }, + ID_DOCUMENTS_FORM: { + VALIDATIONS: { + ID_TYPE: 'Bitte wählen Sie eine Art von Ausweisdokument', + ID_NUMBER: 'Bitte geben Sie Ihre Dokumentennummer ein', + ISSUED_DATE: 'Bitte wählen Sie das Datum, an dem Ihr Dokument ausgestellt wurde', + EXPIRATION_DATE: + 'Bitte wählen Sie das Datum, an dem Ihr Dokument abläuft', + FRONT: 'Bitte laden Sie eine Kopie Ihres Reisepasses hoch', + PROOF_OF_RESIDENCY: + 'Bitte laden Sie eine Kopie des Dokuments hoch, das Ihren aktuellen Wohnsitz belegt', + SELFIE_PHOTO_ID: 'Bitte laden Sie ein Selfie mit Reisepass und Notiz hoch' + }, + FORM_FIELDS: { + TYPE_LABEL: 'Dokument-ID Typ', + TYPE_PLACEHOLDER: 'Art des Ausweises wählen', + TYPE_OPTIONS: { + ID: 'ID', + PASSPORT: 'Reisepass' + }, + ID_NUMBER_LABEL: 'Reisepassnummer', + ID_NUMBER_PLACEHOLDER: 'Geben Sie Ihre Reisepassnummer ein', + ID_PASSPORT_NUMBER_LABEL: 'Reisepassnummer', + ID_PASSPORT_NUMBER_PLACEHOLDER: 'Geben Sie Ihre Reisepassnummer ein', + ISSUED_DATE_LABEL: 'Ausstellungsdatum des Reisepasses', + EXPIRATION_DATE_LABEL: 'Ablaufdatum des Reisepasses', + FRONT_LABEL: 'Reisepass', + FRONT_PLACEHOLDER: 'Fügen Sie eine Kopie Ihres Reisepasses hinzu', + BACK_LABEL: 'Rückseite des Passes', + BACK_PLACEHOLDER: + 'Fügen Sie eine Kopie der Rückseite Ihres Ausweises hinzu (falls zutreffend)', + PASSPORT_LABEL: 'Reisepass-Dokument', + PASSPORT_PLACEHOLDER: 'Fügen Sie eine Kopie Ihres Passdokuments hinzu', + POR_LABEL: 'Dokument zum Nachweis Ihrer Adresse', + POR_PLACEHOLDER: 'Fügen Sie eine Kopie eines Dokuments hinzu, das Ihre Adresse belegt', + SELFIE_PHOTO_ID_LABEL: 'Ihr Selfie mit Reisepass und Notiz', + SELFIE_PHOTO_ID_PLACEHOLDER: + 'Fügen Sie eine Kopie Ihres Selfies mit Reisepass und Notiz hinzu' + }, + INFORMATION: { + IDENTITY_DOCUMENT: 'Ausweisdokument', + PROOF_OF_RESIDENCY: 'Wohnsitznachweis', + ID_SECTION: { + TITLE: 'Bitte stellen Sie sicher, dass Ihre eingereichten Dokumente:', + LIST_ITEM_1: + 'HOHE QUALITÄT (Farbbilder, 300dpi Auflösung oder höher) sind.', + LIST_ITEM_2: 'VOLLSTÄNDIG SICHTBAR (Wasserzeichen sind erlaubt) sind.', + LIST_ITEM_3: 'GÜLTIG, mit deutlich sichtbarem Gültigkeitsdatum, sind.', + WARNING_1: + 'Es wird nur ein gültiger Reisepass akzeptiert; Fotos in hoher Qualität oder gescannte Bilder dieser Dokumente sind akzeptabel:', + WARNING_2: + 'Stellen Sie sicher, dass Sie Ihre eigenen Dokumente hochladen. Jede Verwendung von falschen oder gefälschten Dokumenten hat rechtliche Konsequenzen und führt zur sofortigen Sperrung Ihres Kontos.', + WARNING_3: + 'Reichen Sie bitte nicht den Reisepass als Wohnsitznachweis ein.' + }, + POR: { + SECTION_1_TEXT_1: + 'Um Verzögerungen bei der Verifizierung Ihres Kontos zu vermeiden, stellen Sie bitte sicher:', + SECTION_1_TEXT_2: + 'NAME, ADRESSE, AUSGABEDATUM und AUSSTELLER gut sichtbar sind.', + SECTION_1_TEXT_3: + 'Das eingereichte Dokument zum Nachweis des Wohnsitzes NICHT ÄLTER ALS DREI MONATE ist.', + SECTION_1_TEXT_4: + 'Sie Farbfotos oder gescannte Bilder in HOHER QUALITÄT (mindestens 300 DPI) eingereicht haben', + SECTION_2_TITLE: 'EIN AKZEPTABLER WOHNSITZNACHWEIS IST:', + SECTION_2_LIST_ITEM_1: 'Ein Bankkontoauszug.', + SECTION_2_LIST_ITEM_2: + 'Eine Rechnung des Versorgungsunternehmens (Strom, Wasser, Internet, etc.).', + SECTION_2_LIST_ITEM_3: + 'Ein von der Regierung ausgestelltes Dokument (Steuererklärung, Wohnsitzbescheinigung usw.).', + WARNING: + 'Wir können die Adresse auf Ihrem eingereichten Ausweisdokument nicht als gültigen Wohnsitznachweis akzeptieren.' + }, + SELFIE: { + TITLE: 'Selfie mit Reisepass und Notiz', + INFO_TEXT: + "Bitte stellen Sie ein Foto zur Verfügung, auf dem Sie Ihren Reisepass halten. Im gleichen Bild und haben einen Hinweis auf die Austausch-Url', das heutige Datum und Ihre Unterschrift angezeigt. Achten Sie darauf, dass Ihr Gesicht deutlich zu sehen ist und Ihre Ausweisdaten gut lesbar sind.", + REQUIRED: 'Erforderlich:', + INSTRUCTION_1: 'Ihr Gesicht muss deutlich sichtbar sein', + INSTRUCTION_2: 'Reisepass muss deutlich lesbar sein', + INSTRUCTION_3: 'Schreiben Sie den Namen des Exchange.', + INSTRUCTION_4: "Schreiben Sie das heutige Datum", + INSTRUCTION_5: 'Unterschreiben Sie die Notiz.', + WARNING: + 'Selfie mit einem anderen Reisepass mit hochgeladenem Inhalt wird abgelehnt' + } + } + }, + BANK_ACCOUNT_FORM: { + VALIDATIONS: { + ACCOUNT_OWNER: + 'Bitte geben Sie Ihren Vor- und Nachnamen ein, wie er mit Ihrem Bankkonto verbunden ist', + ACCOUNT_NUMBER: + 'Ihre Bankkontonummer sollte weniger als 50 Ziffern haben', + ACCOUNT_NUMBER_MAX_LENGTH: + 'Ihre Bankkontonummer hat ein Limit von 50 Zeichen', + CARD_NUMBER: 'Ihre Kartennummer hat ein falsches Format' + }, + FORM_FIELDS: { + BANK_NAME_LABEL: 'Bank Name', + BANK_NAME_PLACEHOLDER: 'Geben Sie den Namen Ihrer Bank ein', + ACCOUNT_NUMBER_LABEL: 'Bankkontonummer', + ACCOUNT_NUMBER_PLACEHOLDER: 'Geben Sie Ihre Bankkontonummer ein', + ACCOUNT_OWNER_LABEL: 'Name des Bankkontoinhabers', + ACCOUNT_OWNER_PLACEHOLDER: 'Type the name as on your bank account', + CARD_NUMBER_LABEL: 'Bankkartennummer', + CARD_NUMBER_PLACEHOLDER: + 'Geben Sie die 16-stellige Nummer ein, die sich auf der Vorderseite Ihrer Bankkarte befindet' + } + }, + WARNING: { + TEXT_1: 'Durch die Verifizierung Ihrer Identität können Sie Folgendes erhalten:', + LIST_ITEM_1: 'Erhöhte Abhebungslimits', + LIST_ITEM_2: 'Erhöhte Einzahlungslimits', + LIST_ITEM_3: 'Niedrigere Gebühren' + } + }, + USER_SETTINGS: { + TITLE_TEXT_1: + 'Ändern Sie die Einstellungen Ihres Kontos. Von Schnittstelle, Benachrichtigungen, Benutzername und anderen Anpassungen.', + TITLE_TEXT_2: 'Wenn Sie die Einstellungen speichern, werden die Änderungen übernommen und gespeichert.', + TITLE_NOTIFICATION: 'Benachrichtigung', + TITLE_INTERFACE: 'Interface', + TITLE_LANGUAGE: 'Sprache', + TITLE_CHAT: 'Chat', + TITLE_AUDIO_CUE: 'Audio-Cue abspielen', // new + TITLE_MANAGE_RISK: 'Risikomanagement', + ORDERBOOK_LEVEL: 'Auftragsbuch-Ebenen (max. 20)', + SET_TXT: 'SET', + CREATE_ORDER_WARING: 'Auftragswarnung erstellen', + RISKY_TRADE_DETECTED: 'Riskanter Handel erkannt', + RISKY_WARNING_TEXT_1: + 'Dieser Auftragswert liegt über dem von Ihnen festgelegten Auftragslimitbetrag {0} .', + RISKY_WARNING_TEXT_2: '({0} des Portfolios)', + RISKY_WARNING_TEXT_3: + ' Bitte prüfen und bestätigen Sie, dass Sie diesen Handel tatsächlich durchführen möchten.', + GO_TO_RISK_MANAGMENT: 'ZUM RISIKOMANAGEMENT GEHEN', + CREATE_ORDER_WARING_TEXT: + 'Erstellen eines Warn-Pop-ups, wenn Ihr Handelsauftrag mehr als {0} Ihres Portfolios verwendet', + ORDER_PORTFOLIO_LABEL: 'Prozentualer Anteil des Portfolios:', + NOTIFICATION_FORM: { + TRADE_POPUPS: 'Handel Pop-ups', + POPUP_ORDER_CONFIRMATION: 'Vor dem Absenden von Bestellungen um Bestätigung bitten', + POPUP_ORDER_COMPLETED: 'Pop-up anzeigen, wenn die Bestellung abgeschlossen ist', + POPUP_ORDER_PARTIALLY_FILLED: + 'Pop-up anzeigen, wenn der Auftrag teilweise gefüllt ist' + }, + AUDIO_CUE_FORM: { // new + ALL_AUDIO: 'Alle Audio-Cues', + PUBLIC_TRADE_AUDIO: 'Wenn ein öffentlicher Handel stattgefunden hat', + ORDERS_PARTIAL_AUDIO: + 'Wenn einer Ihrer Aufträge teilweise erfüllt ist', + ORDERS_PLACED_AUDIO: + 'Wenn eine Bestellung aufgegeben wird', + ORDERS_CANCELED_AUDIO: + 'Wenn ein Auftrag storniert wird', + ORDERS_COMPLETED_AUDIO: + 'Wenn einer Ihrer Aufträge vollständig gefüllt ist', + CLICK_AMOUNTS_AUDIO: + 'Wenn Sie Beträge und Preise im Auftragsbuch anklicken', + GET_QUICK_TRADE_AUDIO: + 'Wenn Sie ein Angebot für das Protrading einholen', + SUCCESS_QUICK_TRADE_AUDIO: + 'Wenn ein erfolgreicher Quick-Trade stattfindet', + QUICK_TRADE_TIMEOUT_AUDIO: + 'Wenn Quick-Trade-Timeout ', + }, + RISK_MANAGEMENT: { + INFO_TEXT: + 'Erstellen Sie ein Warn-Popup, wenn der Wert eines Handelsauftrags einen bestimmten Prozentsatz Ihres Portfolios überschreitet', + INFO_TEXT_1: 'Gesamtwert der Vermögenswerte in {0}: {1}', + PORTFOLIO: 'Prozentsatz des Portfolios', + TOMAN_ASSET: 'Ungefährer Wert', + ADJUST: '(PROZENTSATZ ANPASSEN)', + ACTIVATE_RISK_MANAGMENT: 'Aktivieren Sie das Risikomanagement', + WARNING_POP_UP: 'Warn-Pop-ups' + } + }, + TRANSACTION_HISTORY: { + TITLE: 'Verlauf', + TITLE_TRADES: 'Trades Verlaufsdaten', + TITLE_DEPOSITS: 'Verlaufsdaten der Einzahlungen', + TITLE_WITHDRAWALS: 'Verlaufsdaten der Abhebungen', + TEXT_DOWNLOAD: 'DOWNLOAD-HISTORIE', + TRADES: 'Trades', + DEPOSITS: 'Einzahlungen', + WITHDRAWALS: 'Abhebungen' + }, + ACCOUNT_SECURITY: { + OTP: { + TITLE: 'Zwei-Faktor-Authentifizierung', + OTP_ENABLED: 'otp aktiviert', + OTP_DISABLED: 'BITTE SCHALTEN SIE DIE 2FA FUNKTION EIN', + ENABLED_TEXTS: { + TEXT_1: 'OTP bei der Anmeldung verlangen', + TEXT_2: 'OTP beim Abheben von Geldern verlangen' + }, + DIALOG: { + SUCCESS: 'Sie haben das OTP erfolgreich aktiviert', + REVOKE: 'Sie haben Ihr OTP erfolgreich widerrufen' + }, + CONTENT: { + TITLE: 'Aktivieren der Zwei-Faktor-Authentifizierung', + MESSAGE_1: 'Scannen', + MESSAGE_2: + 'Scannen Sie den QR Code unten mit Google Authenticator oder Authy, um automatisch die Zwei-Faktor-Authentifizierung in Ihrem Gerät einzurichten.', + MESSAGE_3: + 'Wenn Sie Probleme beim Scannen haben, können Sie den Code manuell eingeben', + MESSAGE_4: + 'Sie können diesen Code sicher speichern, um Ihren 2FA wiederherzustellen, falls Sie Ihr Mobiltelefon in Zukunft wechseln oder verlieren.', + MESSAGE_5: 'Anleitung', + INPUT: 'Einmaliges Passwort (OTP) eingeben', + WARNING: + 'Wir empfehlen Ihnen dringend, die 2-Faktor-Authentifizierung (2FA) einzurichten. Dadurch wird die Sicherheit Ihrer Gelder erheblich erhöht.', + ENABLE: 'Aktivieren der Zwei-Faktoren-Authentifizierung', + DISABLE: 'Zwei-Faktor-Authentifizierung deaktivieren' + }, + FORM: { + PLACEHOLDER: 'Geben Sie Ihr von Google Authenticator bereitgestelltes OTP ein.', + BUTTON: '2FA aktivieren' + } + }, + CHANGE_PASSWORD: { + TITLE: 'Passwort ändern', + ACTIVE: 'AKTIV', + DIALOG: { + SUCCESS: 'Sie haben Ihr Passwort erfolgreich geändert' + }, + FORM: { + BUTTON: 'Passwort ändern', + CURRENT_PASSWORD: { + label: 'Aktuelles Passwort', + placeholder: 'Geben Sie Ihr aktuelles Passwort ein' + }, + NEW_PASSWORD: { + label: 'Neues Passwort', + placeholder: 'Geben Sie ein neues Passwort ein' + }, + NEW_PASSWORD_REPEAT: { + label: 'Neues Passwort bestätigen', + placeholder: 'Geben Sie Ihr neues Passwort erneut ein' + } + } + } + }, + CURRENCY: 'Währung', + TYPE: 'Typ', + TYPES_VALUES: { + market: 'Markt', + limit: 'Limit' + }, + TYPES: [ + { value: 'market', label: 'Markt' }, // DO NOT CHANGE value, ONLY TRANSLATE label + { value: 'limit', label: 'Limit' } // DO NOT CHANGE value, ONLY TRANSLATE label + ], + SIDE: 'Seite', + SIDES_VALUES: { + buy: 'kaufen', + sell: 'verkaufen' + }, + SIDES: [{ value: 'buy', label: 'kaufen' }, { value: 'sell', label: 'verkaufen' }], // DO NOT CHANGE value, ONLY TRANSLATE label + DEFAULT_TOGGLE_OPTIONS: [ + { value: true, label: 'an' }, // DO NOT CHANGE value, ONLY TRANSLATE label + { value: false, label: 'aus' } // DO NOT CHANGE value, ONLY TRANSLATE label + ], + SIZE: 'Größe', + PRICE: 'Preis', + FEE: 'Gebühr', + FEES: 'Gebühren', + LIMIT: 'Limit', + TIME: 'Zeit', + TIMESTAMP: 'Zeitstempel', + MORE: 'Mehr', + VIEW: 'Ansicht', + STATUS: 'Status', + AMOUNT: 'Betrag', + COMPLETE: 'Vollständig', + PENDING: 'Ausstehend', + REJECTED: 'Abgelehnt', + ORDERBOOK: 'Auftragsbuch', + CANCEL: 'Abbrechen', + CANCEL_ALL: 'Alles abbrechen', + GO_TRADE_HISTORY: 'Zur Transaktionshistorie gehen', + ORDER_ENTRY: 'Auftragseingang', + TRADE_HISTORY: 'Historie', + CHART: 'Kurschart', + ORDERS: 'Meine aktiven Aufträge', + TRADES: 'Meine Transaktionshistorie', + RECENT_TRADES: 'Meine letzten Trades', // ToDo + PUBLIC_SALES: 'öffentliche Verkäufe', // ToDo + REMAINING: 'Verbleibend', + FULLFILLED: '{0} % Erfüllt', + FILLED: 'Gefüllt', // new + LOWEST_PRICE: 'Niedrigster Preis ({0})', // new + PHASE: 'Phase', // new + INCOMING: 'Eingehend', // new + PRICE_CURRENCY: 'PREIS ({0})', + AMOUNT_SYMBOL: 'BETRAG ({0})', + MARKET_PRICE: 'Marktpreis', + ORDER_PRICE: 'Bestellpreis', + TOTAL_ORDER: 'Order Total', + NO_DATA: 'Keine Daten', + LOADING: 'Laden', + CHART_TEXTS: { + d: 'Datum', + o: 'Open', + h: 'Hoch', + l: 'Tief', + c: 'Schließen', + v: 'Volumen' + }, + QUICK_TRADE: 'Quick trade', + PRO_TRADE: 'Pro trade', + ADMIN_DASH: 'Verwaltungsseite', + WALLET_TITLE: 'Geldbörse', + TRADING_MODE_TITLE: 'Handelsmodus', + TRADING_TITLE: 'Trading', + LOGOUT: 'Abmelden', + WITHDRAWALS_MIN_VALUE_ERROR: + 'Die Transaktion ist zu klein zum Senden. Versuchen Sie es mit einem größeren Betrag.', + WITHDRAWALS_MAX_VALUE_ERROR: + 'Die Transaktion ist zu groß, um sie zu senden. Versuchen Sie einen kleineren Betrag.', + WITHDRAWALS_LOWER_BALANCE: + 'Ihr Guthaben reicht nicht aus, um diese Transaktion zu senden.', + WITHDRAWALS_FEE_TOO_LARGE: + 'Die Gebühr beträgt mehr als {0}% Ihrer gesamten Transaktion', + WITHDRAWALS_BTC_INVALID_ADDRESS: + 'Die Bitcoin-Adresse ist ungültig. Bitte sorgfältig prüfen und erneut eingeben', + WITHDRAWALS_ETH_INVALID_ADDRESS: + 'Die Ethereum-Adresse ist ungültig. Bitte sorgfältig prüfen und erneut eingeben', + WITHDRAWALS_BUTTON_TEXT: 'Abhebung überprüfen', + WITHDRAWALS_FORM_ADDRESS_LABEL: 'Zieladresse', + WITHDRAWALS_FORM_ADDRESS_PLACEHOLDER: 'Geben Sie die Adresse ein', + WITHDRAWALS_FORM_DESTINATION_TAG_LABEL: 'Ziel-Tag (optional)', // new + WITHDRAWALS_FORM_MEMO_LABEL: 'Notiz (optional)', // new + WITHDRAWALS_FORM_DESTINATION_TAG_PLACEHOLDER: 'Geben Sie das Ziel-Tag ein', // new + WITHDRAWALS_FORM_MEMO_PLACEHOLDER: 'Geben Sie die Transaktionsnotiz ein', // new + WITHDRAWALS_FORM_AMOUNT_LABEL: '{0} abzuhebender Betrag', + WITHDRAWALS_FORM_AMOUNT_PLACEHOLDER: + 'Geben Sie den Betrag von {0} ein, den Sie abheben möchten', + WITHDRAWALS_FORM_FEE_COMMON_LABEL: + 'Transaktionsgebühr', + WITHDRAWALS_FORM_FEE_FIAT_LABEL: 'Bankabhebungsgebühr', + WITHDRAWALS_FORM_FEE_PLACEHOLDER: + 'Geben Sie den Betrag von {0} ein, den Sie als Gebühr für die Transaktion verwenden möchten', + WITHDRAWALS_FORM_FEE_OPTIMAL_VALUE: 'Optimale Gebühr: {0} {1}', // TODO {0} -> amount {1} -> currency name + DEPOSITS_FORM_AMOUNT_LABEL: '{0} einzuzahlender Betrag', + DEPOSITS_FORM_AMOUNT_PLACEHOLDER: + 'Geben Sie den Betrag von {0} ein, den Sie einzahlen möchten', + DEPOSITS_BUTTON_TEXT: 'Einzahlung überprüfen', + DEPOSIT_PROCEED_PAYMENT: 'Bezahlen', + DEPOSIT_BANK_REFERENCE: + 'Fügen Sie diesen "{0}"-Code in die Banktransation ein, um die Einzahlung zu identifizieren', + DEPOSIT_METHOD: 'Zahlungsmethode {0}', + DEPOSIT_METHOD_DIRECT_PAYMENT: 'Kreditkarte', + DEPOSIT_METHOD_DIRECT_PAYMENT_MESSAGE_1: + 'Fahren Sie mit der Zahlungsmethode Kreditkarte fort.', + DEPOSIT_METHOD_DIRECT_PAYMENT_MESSAGE_2: + 'Sie verlassen die Plattform, um die Zahlung durchzuführen.', + DEPOSIT_VERIFICATION_WAITING_TITLE: 'Verifizierung der Zahlung', + DEPOSIT_VERIFICATION_WAITING_MESSAGE: + 'Bitte schließen Sie die Anwendung nicht, während die Zahlung verifiziert wird', + DEPOSIT_VERIFICATION_WARNING_MESSAGE: + 'Wenn bei der Verifizierung etwas schief gelaufen ist, kontaktieren Sie uns bitte.', + DEPOSIT_VERIFICATION_WARNING_INFORMATION: + 'Dies ist die ID des Vorgangs: "{0}", bitte teilen Sie uns diese ID mit, damit wir Ihnen helfen können.', + DEPOSIT_VERIFICATION_SUCCESS: 'Zahlung verifiziert', + DEPOSIT_VERIFICATION_ERROR: 'Es ist ein Fehler bei der Verifizierung der Einzahlung aufgetreten.', + DEPOSIT_VERIFICATION_ERROR_VERIFIED: 'Die Einzahlung wurde bereits verifiziert', + DEPOSIT_VERIFICATION_ERROR_STATUS: 'Ungültiger Status', + DEPOSIT_VERIFICATION_ERROR_USER_MATCH: + 'Die Karte, mit der Sie die Einzahlung vorgenommen haben, ist nicht dieselbe wie Ihre registrierte Karte. Daher wird Ihre Einzahlung abgelehnt und Ihr Geld wird in weniger als einer Stunde zurückerstattet.', + QUOTE_MESSAGE: 'Sie gehen zu {0} {1} {2} für {3} {4}', + QUOTE_BUTTON: 'Akzeptieren', + QUOTE_REVIEW: 'Überprüfen', + QUOTE_COUNTDOWN_MESSAGE: 'Sie haben {0} Sekunden, um den Handel durchzuführen', + QUOTE_EXPIRED_TOKEN: 'Der Quote-Token ist abgelaufen.', + QUOTE_SUCCESS_REVIEW_TITLE: 'Quick Trade', + QUOTE_SUCCESS_REVIEW_MESSAGE: 'Sie haben erfolgreich {0} {1} {2} für {3} {4}', // you have successfully buy 1 btc from x toman + COUNTDOWN_ERROR_MESSAGE: 'Countdown ist beende', + WITHDRAW_PAGE: { + BANK_TO_WITHDRAW: 'Bank, an die abgehoben werden soll', + MESSAGE_ABOUT_SEND: 'Sie sind dabei zu senden', + MESSAGE_BTC_WARNING: + 'Bitte stellen Sie die Richtigkeit dieser Adresse sicher, da {0} Überweisungen irreversibel sind', + MESSAGE_ABOUT_WITHDRAW: 'Sie sind dabei, auf Ihr Bankkonto zu überweisen', + MESSAGE_FEE: 'Transaktionsgebühr von {0} ({1}) enthalten', + MESSAGE_FEE_BASE: 'Transaktionsgebühr von {0} enthalten', + BASE_MESSAGE_1: + 'Sie können nur auf ein Bankkonto mit einem Namen abheben, der mit dem bei Ihrem Konto registrierten Namen übereinstimmt.', + BASE_MESSAGE_2: 'Abhebungs-Mindestbetrag', + BASE_MESSAGE_3: 'Täglicher Abhebungs-Maximalbetragt', + BASE_INCREASE_LIMIT: 'Erhöhen Sie Ihr Tageslimit', + CONFIRM_VIA_EMAIL: 'Bestätigen Sie per E-Mail', + CONFIRM_VIA_EMAIL_1: 'Wir haben Ihnen eine Bestätigungs-E-Mail zur Abhebung geschickt.', + CONFIRM_VIA_EMAIL_2: + 'Um den Abhebungsvorgang abzuschließen, bestätigen Sie bitte', + CONFIRM_VIA_EMAIL_3: 'die Abhebung über Ihre E-Mail innerhalb von 5 Minuten.', + WITHDRAW_CONFIRM_SUCCESS_1: 'Ihre Abhebungsanfrage ist bestätigt. Sie wird in Kürze bearbeitet.', + WITHDRAW_CONFIRM_SUCCESS_2: + 'Um Ihren Abhebungsstatus zu sehen, besuchen Sie bitte Ihre Abhebungs-Historienseite', + GO_WITHDRAWAL_HISTORY: 'Zur Abhebungsverlaufsseite gehen' + }, + WALLET_BUTTON_BASE_DEPOSIT: 'einzahlen', + WALLET_BUTTON_BASE_WITHDRAW: 'abheben', + WALLET_BUTTON_CRYPTOCURRENCY_DEPOSIT: 'empfangen', + WALLET_BUTTON_CRYPTOCURRENCY_WITHDRAW: 'senden', + AVAILABLE_TEXT: 'Verfügbar', + AVAILABLE_BALANCE_TEXT: 'Verfügbarer {0} Saldo: {1} {2}', // Available Bitcoin Balance: 2.6 BTC + BALANCE_TEXT: 'Saldo', + CURRENCY_BALANCE_TEXT: '{0} Balance', + WALLET_TABLE_AMOUNT_IN: `Betrag in {0}`, + WALLET_TABLE_TOTAL: 'Gesamtsumme', + WALLET_ALL_ASSETS: 'Alle Vermögenswerte', + WALLET_DEPOSIT_USD: + 'Für Fiat-Währung D/W in verschiedenen Ländern und andere Wallet-Anfragen {0}', // new + HIDE_TEXT: 'Ausblenden', + PAGINATOR_FORMAT: '{0} / {1}', + ORDERBOOK_SELLERS: 'Verkäufer', + ORDERBOOK_BUYERS: 'BuyKäuferers', + ORDERBOOK_SPREAD: '{0} spread', // 0 -> 660,000 T + ORDERBOOK_SPREAD_PRICE: '{0} {1}', //// 0-> amount 1 -> symbol 600,000 T + CALCULATE_MAX: 'Max', + DATEFIELD_TOOGLE_DATE_GR: 'Gregorianischer Kalender', + VERIFICATION_WARNING_TITLE: 'Verifizierung Ihrer Bankverbindung', + VERIFICATION_WARNING_MESSAGE: + 'Bevor Sie abheben, müssen Sie Ihre Bankverbindung überprüfen.', + ORDER_SPENT: 'Spent', + ORDER_RECEIVED: 'Empfangen', + ORDER_SOLD: 'Verkauft', + ORDER_BOUGHT: 'Gekauft', + ORDER_AVERAGE_PRICE: 'Durchschnittspreis', + ORDER_TITLE_CREATED: 'Erfolgreich ein Limit {0} erstellt', // 0 -> buy / sell + ORDER_TITLE_FULLY_FILLED: '{0} Order erfolgreich gefüllt', // 0 -> buy / sell + ORDER_TITLE_PARTIALLY_FILLED: '{0} Auftrag teilweise ausgeführt', // 0 -> buy / sell + ORDER_TITLE_TRADE_COMPLETE: '{0} {1} Auftrag wurde erfolgreich ausgeführt', // 0 -> buy / sell + LOGOUT_TITLE: 'ie sind abgemeldet worden', + LOGOUT_ERROR_TOKEN_EXPIRED: 'Token ist abgelaufen', + LOGOUT_ERROR_LOGIN_AGAIN: 'Erneut anmelden', // ip doesnt match + LOGOUT_ERROR_INVALID_TOKEN: 'Ungültiges Token', + LOGOUT_ERROR_INACTIVE: + 'Sie wurden abgemeldet, weil Sie inaktiv waren', + ORDER_ENTRY_BUTTON: '{0} {1}', // 0 -> buy/sell 1 -> btc/.. + QUICK_TRADE_OUT_OF_LIMITS: 'Auftragsgröße ist außerhalb der Grenzen', + QUICK_TRADE_TOKEN_USED: 'Token wurde verwendet', + QUICK_TRADE_QUOTE_EXPIRED: 'Quote ist abgelaufen', + QUICK_TRADE_QUOTE_INVALID: 'Ungültige Quote', + QUICK_TRADE_QUOTE_CALCULATING_ERROR: 'Fehler bei der Berechnung der Quote', + QUICK_TRADE_ORDER_CAN_NOT_BE_FILLED: + 'Der Auftrag mit der aktuellen Größe kann nicht gefüllt werden', + QUICK_TRADE_ORDER_NOT_FILLED: 'Auftrag wird nicht ausgeführt', + QUICK_TRADE_NO_BALANCE: 'Unzureichendes Guthaben zur Ausführung des Auftrags', + YES: 'Ja', + NO: 'Nein', + NEXT: 'Weiter', + SKIP_FOR_NOW: 'Vorerst überspringen', + SUBMIT: 'einreichen', + RESUBMIT: 'Erneut einreichen', + VERIFICATION_NOTIFICATION_SKIP_TITLE: 'Fehlende Dokumente!', + VERIFICATION_NOTIFICATION_SKIP_TEXT: + 'Um vollen Zugriff auf die Abhebungs- und Einzahlungsfunktionen zu erhalten, müssen Sie Ihre Identitätsdokumente auf Ihrer Kontoseite einreichen.', + VERIFICATION_NOTIFICATION_SUCCESS_TITLE: 'Erfolg!', + VERIFICATION_NOTIFICATION_SUCCESS_TEXT: + 'Sie erhalten eine E-Mail-Benachrichtigung, wenn Ihre Informationen verarbeitet wurden. Die Bearbeitung kann in der Regel 1-3 Tage dauern.', + VERIFICATION_NOTIFICATION_BUTTON: 'ZUM EXCHANGE GEHEN', + ERROR_USER_ALREADY_VERIFIED: 'Benutzer bereits verifiziert', + ERROR_INVALID_CARD_USER: 'Die angegebenen Bank- oder Kartendaten sind falsch', + ERROR_INVALID_CARD_NUMBER: 'Ungültige Kartennummer', + ERROR_LOGIN_USER_NOT_VERIFIED: 'Benutzer ist nicht verifiziert', + ERROR_LOGIN_USER_NOT_ACTIVATED: 'Benutzer ist nicht aktiviert', + ERROR_LOGIN_INVALID_CREDENTIALS: 'Berechtigungsnachweise sind nicht korrekt', + SMS_SENT_TO: 'SMS gesendet an {0}', // TODO check msg + SMS_ERROR_SENT_TO: + 'Fehler beim Senden der SMS an {0}. Bitte aktualisieren Sie die Seite und versuchen Sie es erneut.', // TODO check msg + WITHDRAW_NOTIFICATION_TRANSACTION_ID: 'Transaktions-ID:', // TODO check msg + CHECK_ORDER: 'Prüfen und bestätigen Sie Ihre Bestellung', + CHECK_ORDER_TYPE: '{0} {1}', // 0 -> maker/limit 1 -> sell/buy + CONFIRM_TEXT: 'Bestätigen', + GOTO_XHT_MARKET: 'Zum XHT-Markt gehen', // new + INVALID_CAPTCHA: 'Ungültiges Captcha', + NO_FEE: 'N/A', + SETTINGS_LANGUAGE_LABEL: 'Spracheinstellungen (schließt E-Mails ein)', + SETTINGS_LANGUAGE_OPTIONS: LANGUAGES, + SETTINGS_ORDERPOPUP_LABEL: 'Pop-up zur Auftragsbestätigung anzeigen', + SETTINGS_ORDERPOPUP_OPTIONS: [ + { value: false, label: 'NEIN' }, // DO NOT CHANGE value, ONLY TRANSLATE label + { value: true, label: 'Ja' } // DO NOT CHANGE value, ONLY TRANSLATE label + ], + SETTINGS_THEME_LABEL: 'User Interface Theme', // TODO set right labels // ToDo + SETTINGS_THEME_OPTIONS: [ + { value: 'white', label: 'Weiß' }, // DO NOT CHANGE value, ONLY TRANSLATE label + { value: 'dark', label: 'Dunkel' } // DO NOT CHANGE value, ONLY TRANSLATE label + ], + SETTING_BUTTON: 'speichern', + STRING_WITH_PARENTHESIS: '{0} ({1})', + VERIFICATION_NO_WITHDRAW_TITLE: 'Abhebungen deaktiviert', + VERIFICATION_NO_WITHDRAW_MESSAGE: 'Ihr Konto ist für Abhebungen gesperrt', + UP_TO_MARKET: 'Up to market', + VIEW_MY_FEES: 'Meine Gebühren anzeigen', // new + DEVELOPER_SECTION: { + TITLE: 'API-Schlüssel', + INFORMATION_TEXT: + 'Die API bietet Funktionen wie das Abrufen von Wallet-Salden, das Verwalten von Kauf-/Verkaufsaufträgen, das Anfordern von Abhebungen sowie Marktdaten wie die letzten Trades, Orderbuch und Ticker.', + ERROR_INACTIVE_OTP: + 'Um einen API-Schlüssel zu generieren, müssen Sie die 2-Faktor-Authentifizierung aktivieren.', + ENABLE_2FA: '2FA aktivieren', + WARNING_TEXT: 'Geben Sie Ihren API-Schlüssel nicht an andere weiter.', + GENERATE_KEY: 'API-Schlüssel generieren', + ACTIVE: 'Aktiv', + INACTIVE: 'Inaktiv', + INVALID_LEVEL: + 'Sie müssen Ihre Verifizierungsstufe erhöhen, um Zugriff auf diese Funktion zu haben' // TODO + }, + DEVELOPERS_TOKENS_POPUP: { + GENERATE_TITLE: 'API-Schlüssel generieren', + GENERATE_TEXT: + 'Bitte benennen Sie Ihren API-Schlüssel und bewahren Sie ihn nach der Generierung privat auf. Sie werden ihn später nicht mehr abrufen können.', + GENERATE: 'Generieren', + DELETE_TITLE: 'API-Schlüssel löschen', + DELETE_TEXT: + 'Das Löschen Ihres API-Schlüssels ist nicht rückgängig zu machen, obwohl Sie jederzeit einen neuen API-Schlüssel generieren können. Möchten Sie Ihren API-Schlüssel löschen?', + DELETE: 'LÖSCHEN', + FORM_NAME_LABEL: 'Name', + FORM_LABLE_PLACEHOLDER: 'Name für den API-Schlüssel', + API_KEY_LABEL: 'API Schlüssel', + SECRET_KEY_LABEL: 'GEHEIM-Schlüssel', + CREATED_TITLE: 'Kopieren Sie Ihren API-Schlüssel', + CREATED_TEXT_1: + 'Bitte kopieren Sie Ihren API-Schlüssel, da dieser in Zukunft nicht mehr erreichbar sein wird.', + CREATED_TEXT_2: 'Halten Sie Ihren Schlüssel privat.' + }, + DEVELOPERS_TOKENS_TABLE: { + NAME: 'Name', + API_KEY: 'API Key', + SECRET: 'Geheimnis', + CREATED: 'Erstelltes Datum', + REVOKE: 'Widerrufen', + REVOKED: 'Widerrufen', + REVOKE_TOOLTIP: 'Sie müssen 2FA aktivieren, um das Token zu widerrufen' // TODO + }, + CHAT: { + CHAT_TEXT: 'Chat', + MARKET_CHAT: 'Market Chat', + CHAT_UNREAD: '{0} ({1})', // 0 -> CHAT_TEXT, 1 -> number + READ_MORE: 'Mehr lesen', + SHOW_IMAGE: 'Bild einblenden', + HIDE_IMAGE: 'Bild ausblenden', + CHAT_MESSAGE_BOX_PLACEHOLDER: 'Mitteilungen', + SIGN_UP_CHAT: 'Zum Chatten anmelden', + JOIN_CHAT: 'Benutzername für den Chat festlegen', + TROLLBOX: 'Trollbox ({0})' // new + }, + INVALID_USERNAME: + 'Der Benutzername muss zwischen 3 und 15 Zeichen lang sein. Enthält nur Kleinbuchstaben, Zahlen und Unterstrich', + USERNAME_TAKEN: 'Dieser Benutzername ist bereits vergeben. Bitte versuchen Sie einen anderen.', + USERNAME_LABEL: 'Benutzername (wird für den Chat verwendet)', + USERNAME_PLACEHOLDER: 'Benutzername', + TAB_USERNAME: 'Benutzername', + USERNAME_WARNING: + 'Ihr Benutzername kann nur einmal geändert werden. Bitte stellen Sie sicher, dass Ihr Benutzername erwünscht ist.', + USERNAME_CANNOT_BE_CHANGED: 'Benutzername kann nicht geändert werden', + UPGRADE_LEVEL: 'Kontostufe aktualisieren', + LEVELS: { + LABEL_LEVEL: 'Level', + LABEL_LEVEL_1: 'Eins', + LABEL_LEVEL_2: 'Zwei', + LABEL_LEVEL_3: 'Drei', + LABEL_MAKER_FEE: 'Maker Gebühr', + LABEL_TAKER_FEE: 'Taker Gebühr', + LABEL_BASE_DEPOSIT: 'Tägliche Euro-Einzahlung', + LABEL_BASE_WITHDRAWAL: 'Tägliche Euro-Abhebung', + LABEL_BTC_DEPOSIT: 'Tägliche Bitcoin-Einzahlung', + LABEL_BTC_WITHDRAWAL: 'Tägliche Bitcoin-Abhebung', + LABEL_ETH_DEPOSIT: 'Tägliche Ethereum-Einzahlung', + LABEL_ETH_WITHDRAWAL: 'Tägliche Ethereum-Abhebung', + LABEL_PAIR_MAKER_FEE: '{0} Maker Gebühr', + LABEL_PAIR_TAKER_FEE: '{0} Taker Gebühr', + UNLIMITED: 'Unbegrenzt', + BLOCKED: '0' + }, + WALLET_ADDRESS_TITLE: 'Geldbörse {0} generieren', + WALLET_ADDRESS_GENERATE: 'Erzeugen', + WALLET_ADDRESS_MESSAGE: + 'Wenn Sie eine Wallet erstellen, legen Sie eine Einzahlungs- und Auszahlungsadresse an.', + WALLET_ADDRESS_ERROR: + 'Fehler beim Generieren der Adresse, bitte aktualisieren und erneut versuchen.', + DEPOSIT_WITHDRAW: 'Einzahlen/Abheben', + GENERATE_WALLET: 'Geldbörse generieren', + TRADE_TAB_CHART: 'Grafik', + TRADE_TAB_TRADE: 'Handeln', + TRADE_TAB_ORDERS: 'Bestellungen', + TRADE_TAB_POSTS: 'Beiträge', // new + WALLET_TAB_WALLET: 'Geldbörse', + WALLET_TAB_TRANSACTIONS: 'Transaktionen', + RECEIVE_CURRENCY: '{0} empfangen', + SEND_CURRENCY: '{0} senden', + COPY_ADDRESS: 'Adresse kopieren', + SUCCESFUL_COPY: 'Erfolgreich kopiert!', + QUICK_TRADE_MODE: 'Quick Trade Modus', + JUST_NOW: 'gerade jetzt', + PAIR: 'Paar', + ZERO_ASSET: 'Sie haben kein Vermögen', + DEPOSIT_ASSETS: 'Assets einzahlen', + SEARCH_TXT: 'Suchen', + SEARCH_ASSETS: 'Assets suchen', + TOTAL_ASSETS_VALUE: 'Gesamtwert der Vermögenswerte in {0}: {1}', + SUMMARY: { + TITLE: 'Zusammenfassung', + TINY_PINK_SHRIMP_TRADER: 'Tiny Pink Shrimp Trader', + TINY_PINK_SHRIMP_TRADER_ACCOUNT: 'Tiny Pink Shrimp Händlerkonto', + LITTLE_RED_SNAPPER_TRADER: 'Little Red Snapper Trader', + LITTLE_RED_SNAPPER_TRADER_ACCOUNT: 'Little Red Snapper Händlerkonto', + CUNNING_BLUE_KRAKEN_TRADING: 'Listiger blauer Kraken Handel', + CUNNING_BLUE_KRAKEN_TRADING_ACCOUNT: 'Cunning Blue Kraken Handelskonto', + BLACK_LEVIATHAN_TRADING: 'Schwarzer Leviathan Handel', + BLACK_LEVIATHAN_TRADING_ACCOUNT: 'Schwarzer Leviathan Handelskonto', + URGENT_REQUIREMENTS: 'Dringende Anforderungen', + TRADING_VOLUME: 'Handelsvolumen', + ACCOUNT_ASSETS: 'Konto Vermögen', + ACCOUNT_DETAILS: 'Konto-Details', + SHRIMP_ACCOUNT_TXT_1: 'Ihre Reise beginnt hier!', + SHRIMP_ACCOUNT_TXT_2: + 'Schwimmen Sie weiter, Sie werden sich bald vom Rest des Schwarms abheben.', + SNAPPER_ACCOUNT_TXT_1: + 'Glückwunsch, dass Sie durch die Marktschwemme hindurch Ihren Kurs halten.', + SNAPPER_ACCOUNT_TXT_2: + 'Schmieden Sie sich durch und kämpfen Sie den Anstieg für mehr Krypto-Schätze voraus.', + KRAKEN_ACCOUNT_TXT_1: + 'Dieses Krustentier, das eher Witze als Rümpfe reißt, hat schon so manchen Sturm überstanden!', + LEVIATHAN_ACCOUNT_TXT_1: + 'Bestie aus dem Abgrund, die durch Altcoins in unergründliche Tiefen blickt, Meister der mitternächtlichen Gewässer und der Flutwelle.', + VIEW_FEE_STRUCTURE: 'Gebührenstruktur und Limits anzeigen', + UPGRADE_ACCOUNT: 'Konto aktualisieren', + ACTIVE_2FA_SECURITY: 'Aktive 2FA-Sicherheit', + ACCOUNT_ASSETS_TXT_1: 'Angezeigt wird eine Übersicht über alle Ihre Assets.', + ACCOUNT_ASSETS_TXT_2: + 'Das Halten einer großen Menge an Vermögenswerten berechtigt Sie zu einem Konto-Upgrade, das ein einzigartiges Abzeichen und niedrigere Handelsgebühren beinhaltet.', + TRADING_VOLUME_TXT_1: + 'Ihre Handelsvolumen-Historie wird in {0} angezeigt und ist ein nominaler Wert, der am Ende eines jeden Monats aus allen Handelspaaren berechnet wird.', + TRADING_VOLUME_TXT_2: + 'Hohe Handelsaktivitäten berechtigen Sie zu einem Konto-Upgrade, das Sie mit einem einzigartigen Abzeichen und anderen Vergünstigungen belohnt.', + ACCOUNT_DETAILS_TXT_1: + 'Ihr Kontotyp bestimmt Ihr Kontoabzeichen, die Handelsgebühr, Einzahlungs- und Auszahlungslimits.', + ACCOUNT_DETAILS_TXT_2: + 'Das Alter Ihres Handelskontos, das Aktivitätsniveau und die Höhe des gesamten Kontoguthabens bestimmen, ob Ihr Konto für ein Upgrade in Frage kommt.', + ACCOUNT_DETAILS_TXT_3: + 'Die Aufrechterhaltung Ihres Kontostandes erfordert ständiges Handeln und die Aufrechterhaltung einer bestimmten Menge an eingezahltem Vermögen.', + ACCOUNT_DETAILS_TXT_4: + 'Die Konten werden periodisch herabgestuft, wenn Aktivität und Vermögenswerte nicht beibehalten werden.', + REQUIREMENTS: 'Anforderungen', + ONE_REQUIREMENT: 'Nur eine Bedingung:', // new + REQUEST_ACCOUNT_UPGRADE: 'Konto-Upgrade anfordern', + FEES_AND_LIMIT: '{0} Gebühren- & Limitstruktur', // new + FEES_AND_LIMIT_TXT_1: + 'Ein Krypto-Trader zu werden, markiert einen Neuanfang. Bewaffnet mit Verstand, Wille und Geschwindigkeit nur durch das Eingehen von Risiken und Handel werden Sie Ihr Konto aktualisieren dürfen.', + FEES_AND_LIMIT_TXT_2: + 'Jedes Konto hat seine eigenen Gebühren und Ein- und Auszahlungslimits.', + DEPOSIT_WITHDRAWAL_ALLOWENCE: 'Einzahlungs- und Abhebungsfreibetrag', + TRADING_FEE_STRUCTURE: 'Struktur der Handelsgebühren', + WITHDRAWAL: 'Abhebungen', + DEPOSIT: 'Einzahlungen', + TAKER: 'Taker', + MAKER: 'Maker', + WEBSITE: 'Website', + VIP_TRADER_ACCOUNT_ELIGIBLITY: 'VIP-Trader-Konto Upgrade-Berechtigung', + PRO_TRADER_ACCOUNT_ELIGIBLITY: 'Pro Trader-Konto Upgrade-Berechtigung', + TRADER_ACCOUNT_ELIGIBILITY: 'Level {0} Kontoberechtigung', + NOMINAL_TRADING: 'Nominaler Handel', + NOMINAL_TRADING_WITH_MONTH: 'Nominaler Handel Letzter {0}', + ACCOUNT_AGE_OF_MONTHS: 'Konto Alter von {0} Monaten', + TRADING_VOLUME_EQUIVALENT: '{0} {1} Handelsvolumen Äquivalent', + LEVEL_OF_ACCOUNT: 'Level {0} Konto', + LEVEL_TXT_DEFAULT: 'Fügen Sie hier Ihre Levelbeschreibung hinzu', + LEVEL_1_TXT: + 'Ihre Reise beginnt hier XIV Trader! Um Prämien zu erhalten, können Sie Ihre Identifikation verifizieren und auch größere Ein- und Auszahlungslimits mit reduzierten Handelsgebühren erhalten.', // new + LEVEL_2_TXT: + 'Handeln Sie einfach monatlich im Wert von mehr als 3.000 USDT oder haben Sie ein Guthaben von mehr als 5.000 XHT und genießen Sie niedrigere Handelsgebühren.', // new + LEVEL_3_TXT: + 'Hier geht es richtig zur Sache! Genießen Sie reduzierte Handelsgebühren und große Ein- und Auszahlungslimits. Um zu Level 3 zu gelangen, müssen Sie Ihre Verifizierung abschließen', // new + LEVEL_4_TXT: + 'Handeln Sie einfach monatlich im Wert von mehr als 10.000 USDT oder haben Sie ein Guthaben von mehr als 10.000 XHT und genießen Sie niedrigere Handelsgebühren.', // new + LEVEL_5_TXT: + 'Sie haben es geschafft! Das Level 5-Konto ist ein seltenes Konto nur für Exchangebetreiber, Vault-Nutzer oder das HollaEx-Partnerprogramm (HAP). Genießen Sie große Limits und freuen Sie sich über null Maker-Gebühren.', // new + LEVEL_6_TXT: + 'Handeln Sie einfach monatlich im Wert von über 300.000 USDT oder haben Sie ein Guthaben von über 100.000 XHT und genießen Sie niedrigere Handelsgebühren. Erhöhter Auszahlungsbetrag.', // new + LEVEL_7_TXT: + 'Handeln Sie einfach monatlich im Wert von über 500.000 USDT oder haben Sie ein Guthaben von über 300.000 XHT und genießen Sie niedrigere Handelsgebühren. Erhöhter Auszahlungsbetrag.', // new + LEVEL_8_TXT: + 'Handeln Sie einfach monatlich im Wert von mehr als 600.000 USDT oder haben Sie ein Guthaben von mehr als 400.000 XHT und genießen Sie niedrigere Handelsgebühren.', // new + LEVEL_9_TXT: + 'Handeln Sie einfach monatlich im Wert von mehr als 2.000.000 USDT oder haben Sie ein Guthaben von mehr als 1.000.000 XHT und genießen Sie niedrigere Handelsgebühren.', // new + LEVEL_10_TXT: + 'Das Waltrader-Konto, mit dem Sie Geld für Market Making zurückverdienen. Um dieses spezielle Konto zu erhalten, nehmen Sie bitte Kontakt mit uns auf.', // new + CURRENT_TXT: 'Aktuell', + TRADER_ACCOUNT_XHT_TEXT: + 'Ihr Konto befindet sich in der Vorverkaufsphase von XHT, das heißt, Sie können XHT für $0,10 pro XHT erhalten. Alle Einzahlungen werden in XHT umgewandelt, sobald die Transaktion abgeschlossen ist.', + TRADER_ACCOUNT_TITLE: 'Konto - Vorverkaufszeitraum', // new + HAP_ACCOUNT: 'HAP-Konto', // new + HAP_ACCOUNT_TXT: + 'Ihr Konto ist ein verifiziertes Konto für das HollaEx-Partnerprogramm. Sie können jetzt 10 % Bonus für jede Person verdienen, die Sie einladen und die XHT kauft.', // new + EMAIL_VERIFICATION: 'E-Mail-Verifizierung', // new + DOCUMENTS: 'Dokumente', // new + HAP_TEXT: 'HollaEx Partnerprogramm (HAP) {0}', // new + LOCK_AN_EXCHANGE: 'Sperren einer Exchange {0}', // new + WALLET_SUBSCRIPTION_USERS: 'Vault-Abonnement-Benutzer {0}', // new + TRADE_OVER_XHT: 'Handel über {0} USDT Wert', // new + TRADE_OVER_BTC: 'Handel über {0} BTC Wert', // new + XHT_IN_WALLET: '{0} XHT in der Geldbörse', // new + REWARDS_BONUS: 'Belohnungen und Prämien', // new + COMPLETE_TASK_DESC: 'Erfüllen Sie Aufgaben und verdienen Sie Prämien im Wert von über 10.000 $.', // new + TASKS: 'Aufgaben', // new + MAKE_FIRST_DEPOSIT: 'Machen Sie Ihre erste Einzahlung und erhalten Sie 1 XHT', // new + BUY_FIRST_XHT: 'Kaufen Sie Ihr ersten XHT und erhalten Sie einen Bonus von 5 XHT', // new + COMPLETE_ACC_VERIFICATION: + 'Schließen Sie die Kontoverifizierung ab und erhalten Sie einen 20 XHT-Bonus', // new + INVITE_USER: 'Laden Sie Benutzer ein und genießen Sie Provisionen aus deren Handel', // new + JOIN_HAP: 'Werden Sie Mitglied bei HAP und verdienen Sie 10% für jedes verkaufte HollaEx Kit', // new + EARN_RUNNING_EXCHANGE: 'Verdienen Sie passives Einkommen durch den Betrieb Ihrer eigenen Exchange.', // new + XHT_WAVE_AUCTION: 'XHT-Wellen-Auktionsdaten', // new + XHT_WAVE_DESC_1: + 'Die Verteilung des HollaEx-Tokens (XHT) erfolgt über eine Wave-Auktion.', // new + XHT_WAVE_DESC_2: + 'Die Wellenauktion verkauft eine zufällige Menge an XHT zu zufälligen Zeitpunkten an die Höchstbietenden im Auftragsbuch', // new + XHT_WAVE_DESC_3: + 'Im Folgenden werden die historischen Daten der Wave-Auktionshistorie angezeigt', // new + WAVE_AUCTION_PHASE: 'Wellenauktion Phase {0}', // new + LEARN_MORE_WAVE_AUCTION: 'Erfahren Sie mehr über die Wave Auktion', // new + WAVE_NUMBER: 'Wellennummer', // new + DISCOUNT: '( {0}% Rabatt )', // new + MY_FEES_LIMITS: ' Meine Gebühren und Limits' // new + }, + REFERRAL_LINK: { + TITLE: 'Freunde einladen', // new + INFO_TEXT: + 'Empfehlen Sie Ihre Freunde, indem Sie diesen Link weitergeben und erhalten Sie Vorteile, wenn Sie andere Personen einladen.', + COPY_FIELD_LABEL: 'Teilen Sie den untenstehenden Link mit Freunden und verdienen Sie Provisionen:', // new + REFERRED_USER_COUT: 'Sie haben {0} Benutzer empfohlen.', // new + COPY_LINK_BUTTON: 'EMPFEHLUNGSLINK KOPIEREN', // new + XHT_TITLE: 'MEINE REFERRALS', // new + XHT_INFO_TEXT: 'Verdienen Sie Provisionen, indem Sie Ihre Freunde einladen.', // new + XHT_INFO_TEXT_1: 'Provisionen werden periodisch an Ihre Geldbörse gezahlt', // new + APPLICATION_TXT: + 'Um ein HollaEx-Kit-Vertriebspartner zu werden, füllen Sie bitte einen Antrag aus.', // new + TOTAL_REFERRAL: 'Insgesamt durch Empfehlungen gekauft:', // new + PENDING_REFERRAL: 'Ausstehende Kommissionen:', // new + EARN_REFERRAL: 'Verdiente Provisionen:', // new + XHT_COUNT: '{0} XHT', // new + APPLY_BUTTON: 'ANWENDEN' // new + }, + STAKE_TOKEN: { + TITLE: 'Staken von HollaEx Token', // new + INFO_TXT1: + 'HollaEx-Tokens (XHT) müssen abgesichert (abgesteckt) werden, um die HollaEx-Kit-Tauschsoftware zu betreiben.', // new + INFO_TXT2: + 'Sie können Ihre HollaEx-Token auf ähnliche Weise sichern und XHT verdienen, die während der Wave-Auktion nicht verkauft werden.', // new + INFO_TXT3: + 'Gehen Sie einfach auf dash.bitholla.com und sichern Sie sich noch heute Ihren eigenen Exchange und verdienen Sie kostenlos XHT', // new + BUTTON_TXT: 'FINDEN SIE MEHR' // new + }, + TERMS_OF_SERVICES: { + // new + TITLE: 'HollaEx Token-Kaufvertrag', + SERVICE_AGREEMENT: AGREEMENT, + PROCEED: 'FORTFAHREN', + AGREE_TERMS_LABEL: + 'Ich habe den HollaEx-Token-Kaufvertrag gelesen und stimme ihm zu', + RISK_INVOLVED_LABEL: 'Ich verstehe die damit verbundenen Risiken', + DOWNLOAD_PDF: 'Laden Sie die PDF-Datei herunter', + DEPOSIT_FUNDS: + 'Zahlen Sie Geld in Ihre Geldbörse ein, um HollaEx Token (XHT) zu erhalten', + READ_FAG: 'Lesen Sie HollaEx FAQ hier: {0}', + READ_DOCUMENTATION: 'Lesen Sie das HollaEx Whitepaper hier: {0}', + READ_WAVES: 'Regeln für die kommende öffentliche Wellenauktion im Dezember{0}', // new + DOWNLOAD_BUY_XHT: + 'Laden Sie die PDF-Datei herunter, um eine visuelle Schritt-für-Schritt-Anleitung zu sehen {0}', + HOW_TO_BUY: 'wie man HollaEx Token (XHT) kauft', + PUBLIC_SALES: 'Öffentliche Wellen-Auktion', // new + CONTACT_US: + 'Für weitere Informationen und bei Problemen können Sie uns gerne eine E-Mail an {0} senden.', + VISUAL_STEP: 'Sehen Sie eine visuelle Schritt-für-Schritt-Anleitung auf {0}', // new + WARNING_TXT: + 'Wir werden Ihre Anfrage prüfen und Ihnen weitere Anweisungen für den Zugang zur XIV Exchange per E-Mail zusenden.', // new + WARNING_TXT1: + 'In der Zwischenzeit können Sie sich mit Hilfe der folgenden Ressourcen mit dem HollaEx-Netzwerk vertraut machen', // new + XHT_ORDER_TXT_1: 'Um den Handel zu starten, müssen Sie sich anmelden', // new + XHT_ORDER_TXT_2: '', // new + XHT_ORDER_TXT_3: '{0} or {1}', // new + XHT_TITLE: 'XHT', //new + XHT_TRADE_TXT_1: 'Anmelden, um Ihre letzten Trades zu sehen', //new + XHT_TRADE_TXT_2: 'Sie können {0}, um Ihren letzten Handelsverlauf zu sehen', //new + LOGIN_HERE: 'hier anmelden' + }, + WAVES: { + // new + TITLE: 'Wellen Info', + NEXT_WAVE: 'Nächste Welle', + WAVE_AMOUNT: 'Menge in Welle', + FLOOR: 'Etage', + LAST_WAVE: 'Letzte Wellee' + }, + TYPES_OF_POSTS: { + // new + TITLE: 'BEITRÄGE', + ANNOUNCEMEN: 'Ankündigung', + SYSTEM_UPDATE: 'System-Update', + LAST_WAVE: 'Letzte Welle', + ANNOUNCEMENT_TXT: 'Kostenloses XHT wird an alle Geldbörsen verteilt, die sich für diese Funktion qualifizieren.', + SYSTEM_UPDATE_TIME: 'Zeit: 12:31 PM, 19. Dezember 2019 ', + SYSTEM_UPDATE_DURATION: '1 Stunde', + LAST_WAVE_AMOUNT: '100, 213 XHT', + LAST_WAVE_REDISTRIBUTED: ' 11, 211', + LAST_WAVE_TIME: ' 12: 31 PM, 19. Dezember 2019' + }, + USER_LEVEL: 'User Level', // new + LIMIT_AMOUNT: 'Grenzwertbetrag', // new + FEE_AMOUNT: 'Betrag der Gebühr', // new + COINS: 'Münzen', // new + PAIRS: 'Paare', // new + NOTE_FOR_EDIT_COIN: + 'Hinweis: Zum Hinzufügen und Entfernen von {0} beachten Sie bitte die {1}.', // new + REFER_DOCS_LINK: 'docs', // new + RESTART_TO_APPLY: + 'Sie müssen Ihren Exchange neu starten, um diese Änderungen zu übernehmen.', // new + TRIAL_EXCHANGE_MSG: + 'Sie verwenden eine Testversion von {0} und diese läuft in {1} Tagen ab.', // new + EXPIRY_EXCHANGE_MSG: + 'Ihr Exchange ist abgelaufen. Gehen Sie zu dash.bitholla.com, um es wieder zu aktivieren.', // new + EXPIRED_INFO_1: 'Ihre Testphase ist beendet.', // new + EXPIRED_INFO_2: 'Sichern Sie Ihren Exchange, um ihn wieder zu aktivieren.', // new + EXPIRED_BUTTON_TXT: 'ACTIVATE EXCHANGE', // new + TRADE_POSTS: { + // new + ANNOUNCEMENT: 'Ankündigung', + ANNOUNCEMNT_TXT_3: + 'Der öffentliche Start und die Wave-Auktion wurden auf den 1. Januar 2020 verschoben. Wallet-Einzahlungen und -Abhebungen sind jetzt möglich.', + ANNOUNCEMNT_TXT_4: + 'Frohes neues Jahr Hollaers. Wir machen ein neues Zeichen ab 2020 mit dem Start der offensten Handelsplattform mit der Hilfe von Ihnen allen.', + ANNOUNCEMNT_TXT_1: + 'Verdienen Sie XHT mit dem HAP-Programm, indem Sie Ihre Freunde in den Exchange einladen. {0}.', + DEFAULT_ANNOUNCEMENT: + 'In diesem Bereich werden Ihre öffentlichen Ankündigungen für den Exchange angezeigt!', + ANNOUNCEMENT_TXT_2: 'Kostenloses XHT wird an alle Geldbörsen verteilt, die {0}.', + LEARN_MORE: 'Mehr erfahren', + APPLY_TODAY: 'Heute bewerben' // new + }, + OPEN_WALLET: 'Offener Geldbeutel', // new + AGO: 'ago' // new +}; diff --git a/web/src/config/localizedStrings.js b/web/src/config/localizedStrings.js index 0660888ac4..b7e90cae6e 100644 --- a/web/src/config/localizedStrings.js +++ b/web/src/config/localizedStrings.js @@ -1,6 +1,7 @@ import LocalizedStrings from 'react-localization'; import en from './lang/en'; +import de from './lang/de'; import ko from './lang/ko'; import fa from './lang/fa'; import ar from './lang/ar'; @@ -13,6 +14,7 @@ import zh from './lang/zh'; export const content = { en, + de, ko, ja, fa, From 6f6197d00221d145e0a210da2cc594527e5dd8f9 Mon Sep 17 00:00:00 2001 From: Ali Beikverdi Date: Sun, 31 Jan 2021 01:43:11 +0900 Subject: [PATCH 15/18] change testnet bitholla domain redirection to production --- web/src/containers/Admin/AppWrapper/index.js | 2 +- web/src/containers/Admin/MoveToDash/index.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/web/src/containers/Admin/AppWrapper/index.js b/web/src/containers/Admin/AppWrapper/index.js index 3903d3f200..298abb14d1 100644 --- a/web/src/containers/Admin/AppWrapper/index.js +++ b/web/src/containers/Admin/AppWrapper/index.js @@ -464,7 +464,7 @@ class AppWrapper extends React.Component { alt="Link-icon" />{' '} diff --git a/web/src/containers/Admin/MoveToDash/index.js b/web/src/containers/Admin/MoveToDash/index.js index 4661b96d25..8efa7cc0fc 100644 --- a/web/src/containers/Admin/MoveToDash/index.js +++ b/web/src/containers/Admin/MoveToDash/index.js @@ -17,7 +17,7 @@ const MoveToDash = () => { />
From 9eb198a73659d764b3c5c766fa12b36d6ced9e5a Mon Sep 17 00:00:00 2001 From: Ali Beikverdi Date: Sun, 31 Jan 2021 02:30:39 +0900 Subject: [PATCH 16/18] updated plugin endpoints on web --- web/src/actions/appActions.js | 6 +++--- web/src/actions/userAction.js | 5 +++-- web/src/actions/verificationActions.js | 5 +++-- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/web/src/actions/appActions.js b/web/src/actions/appActions.js index ded329c128..3e279dfb5a 100644 --- a/web/src/actions/appActions.js +++ b/web/src/actions/appActions.js @@ -1,6 +1,6 @@ import { setLanguage as storeLanguageInBrowser } from '../utils/string'; import { hasTheme } from 'utils/theme'; -import { DEFAULT_LANGUAGE, LANGUAGE_KEY } from '../config/constants'; +import { DEFAULT_LANGUAGE, LANGUAGE_KEY, PLUGIN_URL } from '../config/constants'; import axios from 'axios'; export const SET_NOTIFICATION = 'SET_NOTIFICATION'; @@ -304,7 +304,7 @@ export const getWaveAuction = () => { export const getAnnouncement = () => (dispatch) => { return axios - .get('/plugins/announcement') + .get(`${PLUGIN_URL}/plugins/announcement`) .then((res) => { if (res.data && res.data.data) { dispatch({ @@ -319,7 +319,7 @@ export const getAnnouncement = () => (dispatch) => { export const requestAvailPlugins = () => (dispatch) => { dispatch({ type: SET_PLUGINS_REQUEST }); return axios - .get('/plugins') + .get(`${PLUGIN_URL}/plugins`) .then((res) => { if (res.data) { let available = res.data.available ? [...res.data.available] : []; diff --git a/web/src/actions/userAction.js b/web/src/actions/userAction.js index bb9e8ff63d..ed41653f72 100644 --- a/web/src/actions/userAction.js +++ b/web/src/actions/userAction.js @@ -1,4 +1,5 @@ import axios from 'axios'; +import { PLUGIN_URL } from '../config/constants'; export function getMe() { return { @@ -81,7 +82,7 @@ export const updateUser = (values) => { userValues.settings = values.settings; } - return axios.put('/plugins/kyc/user', userValues); + return axios.put(`${PLUGIN_URL}/plugins/kyc/user`, userValues); }; export const updateUserSettings = (values) => { @@ -104,7 +105,7 @@ export const updateDocuments = (values) => { 'Content-Type': 'multipart/form-data', }, data: formData, - url: '/plugins/kyc/user/upload', + url: `${PLUGIN_URL}/plugins/kyc/user/upload`, method: 'POST', }); }; diff --git a/web/src/actions/verificationActions.js b/web/src/actions/verificationActions.js index 59ac09c93b..90cc99a804 100644 --- a/web/src/actions/verificationActions.js +++ b/web/src/actions/verificationActions.js @@ -1,9 +1,10 @@ import axios from 'axios'; import querystring from 'query-string'; +import { PLUGIN_URL } from '../config/constants'; const VERIFICATION_ENDPOINTS = { - VERIFY_SMS_CODE: '/plugins/sms/verify', - VERIFY_BANK: '/plugins/bank/user', + VERIFY_SMS_CODE: `${PLUGIN_URL}/plugins/sms/verify`, + VERIFY_BANK: `${PLUGIN_URL}/plugins/bank/user`, GET_USER: '/user', }; From 982d6784023acd525bbc90e30bc0630f12811dc0 Mon Sep 17 00:00:00 2001 From: ram Date: Mon, 1 Feb 2021 17:18:36 +0530 Subject: [PATCH 17/18] Changes for admin plugins meta and endpoints --- .../Admin/Plugins/PluginConfigureForm.js | 61 ++++++++++++++----- web/src/containers/Admin/Plugins/action.js | 56 ++++++++++++++--- web/src/containers/Admin/UploadIds/actions.js | 4 +- web/src/containers/Admin/User/AboutData.js | 2 +- web/src/containers/Admin/User/BankData.js | 5 +- web/src/containers/Admin/User/actions.js | 32 ++++++++-- .../containers/Admin/Verification/actions.js | 15 ++++- .../containers/Admin/Verification/index.js | 2 +- web/src/containers/Admin/Wallets/actions.js | 8 ++- 9 files changed, 148 insertions(+), 37 deletions(-) diff --git a/web/src/containers/Admin/Plugins/PluginConfigureForm.js b/web/src/containers/Admin/Plugins/PluginConfigureForm.js index 5810526e0c..60fd228f56 100644 --- a/web/src/containers/Admin/Plugins/PluginConfigureForm.js +++ b/web/src/containers/Admin/Plugins/PluginConfigureForm.js @@ -1,15 +1,15 @@ -import React from 'react'; +import React, { useEffect, useState, useCallback } from 'react'; import { SubmissionError } from 'redux-form'; -import { message } from 'antd'; +import { message, Spin } from 'antd'; import { STATIC_ICONS } from 'config/icons'; import { AdminHocForm } from '../../../components'; -import { updatePlugin } from './action'; +import { updatePlugin, getPluginMeta } from './action'; import './index.css'; const Form = AdminHocForm('PLUGIN_CONFIGURE_FORM'); -const renderContent = (selectedPlugin, requestPlugin) => { +const renderContent = (selectedPlugin, requestPlugin, metaData) => { const onSaveMeta = (values, plugin) => { return updatePlugin({ name: plugin.name, meta: values }) .then((res) => { @@ -27,22 +27,30 @@ const renderContent = (selectedPlugin, requestPlugin) => { const metaFields = meta ? Object.keys(meta) : []; const fieldData = {}; metaFields.forEach((key) => { - fieldData[key] = { - type: 'text', - label: key, - placeholder: key, - }; + if (key.toLowerCase().includes('secret')) { + fieldData[key] = { + type: 'password', + label: key, + placeholder: key, + }; + } else { + fieldData[key] = { + type: 'text', + label: key, + placeholder: key, + }; + } }); return (
Configure
onSaveMeta(formProps, selectedPlugin)} + onSubmit={(formProps) => onSaveMeta(formProps, metaData)} buttonText="Save" buttonClass="plugin-config-btn" fields={fieldData} - initialValues={selectedPlugin.meta} + initialValues={metaData.meta} />
@@ -66,6 +74,31 @@ const renderContent = (selectedPlugin, requestPlugin) => { }; const PluginConfigureForm = ({ selectedPlugin, requestPlugin }) => { + const [isLoading, setLoading] = useState(true); + const [metaData, setMetaData] = useState({}); + const getMetaData = useCallback(() => { + getPluginMeta({ name: selectedPlugin.name }) + .then((res) => { + if (res) { + setMetaData(res); + } + setLoading(false); + }) + .catch((err) => { + setLoading(false); + setMetaData({}); + }); + }, [selectedPlugin]); + useEffect(() => { + getMetaData(); + }, [getMetaData]); + if (isLoading) { + return ( +
+ +
+ ); + } return (
@@ -79,13 +112,13 @@ const PluginConfigureForm = ({ selectedPlugin, requestPlugin }) => { className="plugins-icon" />
-

{selectedPlugin.name}

+

{metaData.name}

- Version: {selectedPlugin.version} + Version: {metaData.version}
-
{renderContent(selectedPlugin, requestPlugin)}
+
{renderContent(selectedPlugin, requestPlugin, metaData)}
); }; diff --git a/web/src/containers/Admin/Plugins/action.js b/web/src/containers/Admin/Plugins/action.js index c50d2462da..240cfd8900 100644 --- a/web/src/containers/Admin/Plugins/action.js +++ b/web/src/containers/Admin/Plugins/action.js @@ -48,6 +48,15 @@ export const addPlugin = (values) => { return requestAuthenticated('/plugins', options, null, PLUGIN_URL); }; +export const getPluginMeta = (params) => { + return requestAuthenticated( + `/plugins/meta?${querystring.stringify(params)}`, + {}, + null, + PLUGIN_URL + ); +}; + export const updatePlugin = (values) => { const options = { method: 'PUT', @@ -82,17 +91,32 @@ export const getPlugins = (service) => requestAuthenticated(`/plugins?${service}`, {}); export const connectPlugin = (service) => - requestAuthenticated(`/plugins/enable?plugin=${service}`); + requestAuthenticated( + `/plugins/enable?plugin=${service}`, + {}, + null, + PLUGIN_URL + ); export const disconnectPlugin = (service) => - requestAuthenticated(`/plugins/disable?plugin=${service}`); + requestAuthenticated( + `/plugins/disable?plugin=${service}`, + {}, + null, + PLUGIN_URL + ); export const updatePluginsService = (service, values) => { const options = { method: 'PUT', body: JSON.stringify(values), }; - return requestAuthenticated(`/plugins?plugin=${service}`, options); + return requestAuthenticated( + `/plugins?plugin=${service}`, + options, + null, + PLUGIN_URL + ); }; export const connectVault = (values) => { @@ -101,17 +125,26 @@ export const connectVault = (values) => { body: JSON.stringify(values), }; - return requestAuthenticated('/plugins/vault/connect', options); + return requestAuthenticated( + '/plugins/vault/connect', + options, + null, + PLUGIN_URL + ); }; export const disconnectVault = () => - requestAuthenticated('/plugins/vault/disconnect'); + requestAuthenticated('/plugins/vault/disconnect', null, PLUGIN_URL); export const requestVaultSupportCoins = () => axios.get(REQUEST_VAULT_SUPPORTED_COINS); export const requestAnnouncements = (query) => - requestAuthenticated(`/plugins/announcement?${querystring.stringify(query)}`); + requestAuthenticated( + `/plugins/announcement?${querystring.stringify(query)}`, + null, + PLUGIN_URL + ); export const requestPostAnnouncement = (values) => { const options = { @@ -119,7 +152,12 @@ export const requestPostAnnouncement = (values) => { body: JSON.stringify(values), }; - return requestAuthenticated('/plugins/announcement', options); + return requestAuthenticated( + '/plugins/announcement', + options, + null, + PLUGIN_URL + ); }; export const requestDeleteAnnouncement = (query) => { const options = { @@ -128,6 +166,8 @@ export const requestDeleteAnnouncement = (query) => { return requestAuthenticated( `/plugins/announcement?${querystring.stringify(query)}`, - options + options, + null, + PLUGIN_URL ); }; diff --git a/web/src/containers/Admin/UploadIds/actions.js b/web/src/containers/Admin/UploadIds/actions.js index b0e9d514e6..8f62adf75a 100644 --- a/web/src/containers/Admin/UploadIds/actions.js +++ b/web/src/containers/Admin/UploadIds/actions.js @@ -1,3 +1,4 @@ +import { PLUGIN_URL } from 'config/constants'; import { requestAuthenticated } from '../../../utils'; export const uploadFiles = (id, values) => { @@ -18,6 +19,7 @@ export const uploadFiles = (id, values) => { return requestAuthenticated( `/plugins/kyc/admin/upload?user_id=${id}`, options, - headers + headers, + PLUGIN_URL ); }; diff --git a/web/src/containers/Admin/User/AboutData.js b/web/src/containers/Admin/User/AboutData.js index e0b0570c8c..42dc439838 100644 --- a/web/src/containers/Admin/User/AboutData.js +++ b/web/src/containers/Admin/User/AboutData.js @@ -192,7 +192,7 @@ const AboutData = ({ nationality, dob, phone_number, - address, + address = {}, ...rest } = userData; const userInfo = { diff --git a/web/src/containers/Admin/User/BankData.js b/web/src/containers/Admin/User/BankData.js index b1222eef0e..159d5cc081 100644 --- a/web/src/containers/Admin/User/BankData.js +++ b/web/src/containers/Admin/User/BankData.js @@ -77,9 +77,8 @@ class BankData extends Component { this.closeModal(); if (onChangeSuccess) { onChangeSuccess({ - ...values, + ...this.props.initialValues, ...submitData, - ...data, }); } this.setState({ bank: data }); @@ -129,7 +128,7 @@ class BankData extends Component { // }); approveBank(values) .then((data) => { - this.setState({ bank: data.bank_account }); + this.setState({ bank: data }); message.success('Bank approved'); }) .catch((err) => { diff --git a/web/src/containers/Admin/User/actions.js b/web/src/containers/Admin/User/actions.js index cda147d4ea..0d5c336696 100644 --- a/web/src/containers/Admin/User/actions.js +++ b/web/src/containers/Admin/User/actions.js @@ -2,6 +2,7 @@ import { all } from 'bluebird'; import querystring from 'query-string'; import axios from 'axios'; +import { PLUGIN_URL } from '../../../config/constants'; import { requestAuthenticated } from '../../../utils'; const toQueryString = (values) => { @@ -30,7 +31,12 @@ export const updateNotes = (values) => { return requestAuthenticated(`/admin/user/note?user_id=${values.id}`, options); }; export const requestUserImages = (values) => - requestAuthenticated(`/plugins/kyc/id?${toQueryString(values)}`) + requestAuthenticated( + `/plugins/kyc/id?${toQueryString(values)}`, + {}, + null, + PLUGIN_URL + ) .catch(handleError) .then((data) => data); @@ -41,7 +47,9 @@ export const updateUserData = (values) => { }; return requestAuthenticated( `/plugins/kyc/admin?user_id=${values.id}`, - options + options, + null, + PLUGIN_URL ); }; @@ -51,8 +59,10 @@ export const addBankData = (values) => { body: JSON.stringify(values), }; return requestAuthenticated( - `/plugins/bank/admin?user_id=${values.id}`, - options + `/plugins/bank/admin?id=${values.id}`, + options, + null, + PLUGIN_URL ); }; @@ -61,7 +71,12 @@ export const approveBank = (values) => { method: 'POST', body: JSON.stringify(values), }; - return requestAuthenticated('/plugins/bank/verify', options); + return requestAuthenticated( + '/plugins/bank/verify', + options, + null, + PLUGIN_URL + ); }; export const rejectBank = (values) => { @@ -69,7 +84,12 @@ export const rejectBank = (values) => { method: 'POST', body: JSON.stringify(values), }; - return requestAuthenticated('/plugins/bank/revoke', options); + return requestAuthenticated( + '/plugins/bank/revoke', + options, + null, + PLUGIN_URL + ); }; export const requestUser = (values) => { diff --git a/web/src/containers/Admin/Verification/actions.js b/web/src/containers/Admin/Verification/actions.js index 4a3dd2a25a..c74e92faf7 100644 --- a/web/src/containers/Admin/Verification/actions.js +++ b/web/src/containers/Admin/Verification/actions.js @@ -1,3 +1,4 @@ +import { PLUGIN_URL } from 'config/constants'; import { requestAuthenticated } from '../../../utils'; export const performVerificationLevelUpdate = (values) => { @@ -25,7 +26,12 @@ export const verifyData = (values) => { body: JSON.stringify(values), }; - return requestAuthenticated('/plugins/kyc/id/verify', options); + return requestAuthenticated( + '/plugins/kyc/id/verify', + options, + null, + PLUGIN_URL + ); }; export const revokeData = (values) => { @@ -34,5 +40,10 @@ export const revokeData = (values) => { body: JSON.stringify(values), }; - return requestAuthenticated('/plugins/kyc/id/revoke', options); + return requestAuthenticated( + '/plugins/kyc/id/revoke', + options, + null, + PLUGIN_URL + ); }; diff --git a/web/src/containers/Admin/Verification/index.js b/web/src/containers/Admin/Verification/index.js index daada4702e..6c42cfa3da 100644 --- a/web/src/containers/Admin/Verification/index.js +++ b/web/src/containers/Admin/Verification/index.js @@ -144,7 +144,7 @@ class Verification extends Component { closeUpload, // constants } = this.props; - const { id, id_data } = userInformation; + const { id, id_data = {} } = userInformation; // let VERIFICATION_LEVELS = // isSupport() || isSupervisor() // ? VERIFICATION_LEVELS_SUPPORT diff --git a/web/src/containers/Admin/Wallets/actions.js b/web/src/containers/Admin/Wallets/actions.js index 144ad0b373..d03b5f021b 100644 --- a/web/src/containers/Admin/Wallets/actions.js +++ b/web/src/containers/Admin/Wallets/actions.js @@ -1,3 +1,4 @@ +import { PLUGIN_URL } from 'config/constants'; import { requestAuthenticated } from '../../../utils'; export const requestTotalBalance = () => requestAuthenticated('/admin/balance'); @@ -13,5 +14,10 @@ export const connectVault = (values) => { body: JSON.stringify(values), }; - return requestAuthenticated('/plugins/vault/connect', options); + return requestAuthenticated( + '/plugins/vault/connect', + options, + null, + PLUGIN_URL + ); }; From 045565423739769a266f91c491ccf1c78fc730d6 Mon Sep 17 00:00:00 2001 From: user Date: Tue, 2 Feb 2021 13:09:20 +0900 Subject: [PATCH 18/18] version update --- server/api/swagger/swagger.yaml | 2 +- server/package.json | 2 +- version | 2 +- web/package.json | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/server/api/swagger/swagger.yaml b/server/api/swagger/swagger.yaml index 764a9ec1ea..df9c2835a8 100644 --- a/server/api/swagger/swagger.yaml +++ b/server/api/swagger/swagger.yaml @@ -1,6 +1,6 @@ swagger: "2.0" info: - version: "2.0.2" + version: "2.0.3" title: HollaEx Kit host: api.hollaex.com basePath: /v2 diff --git a/server/package.json b/server/package.json index 31a4f9f1a0..7518f237f8 100644 --- a/server/package.json +++ b/server/package.json @@ -1,5 +1,5 @@ { - "version": "2.0.2", + "version": "2.0.3", "private": false, "description": "HollaEx Kit", "keywords": [ diff --git a/version b/version index f93ea0ca33..6acdb44289 100644 --- a/version +++ b/version @@ -1 +1 @@ -2.0.2 \ No newline at end of file +2.0.3 \ No newline at end of file diff --git a/web/package.json b/web/package.json index a14e70cd84..a9bd50720d 100644 --- a/web/package.json +++ b/web/package.json @@ -1,6 +1,6 @@ { "name": "hollaex-kit", - "version": "2.0.2", + "version": "2.0.3", "private": true, "dependencies": { "@ant-design/compatible": "1.0.5",