diff --git a/server/api/controllers/admin.js b/server/api/controllers/admin.js index 264dd57d43..51bc593d0f 100644 --- a/server/api/controllers/admin.js +++ b/server/api/controllers/admin.js @@ -71,6 +71,14 @@ const createInitialAdmin = (req, res) => { if (user) { throw new Error('Admin already exists'); } + + if (!email || !isEmail(email)) { + throw new Error(PROVIDE_VALID_EMAIL); + } + if (!toolsLib.security.isValidPassword(password)) { + throw new Error(INVALID_PASSWORD); + } + return toolsLib.user.createUser(email, password, { role: 'admin', id: 1, @@ -2096,7 +2104,7 @@ const setUserBank = (req, res) => { if (!foundBank) { deletedBankInfoLog.push(existingBank); } - }) + }); const newBankAccounts = bank_account.map((bank) => { let existingBank = existingBankAccounts.filter((b) => b.id === bank.id); @@ -2126,8 +2134,8 @@ const setUserBank = (req, res) => { } } - newBankInfoLog.map(bank => toolsLib.user.createAuditLog({ email: req?.auth?.sub?.email, session_id: req?.session_id }, req?.swagger?.apiPath, req?.swagger?.operationPath?.[2], bank)) - deletedBankInfoLog.map(bank => toolsLib.user.createAuditLog({ email: req?.auth?.sub?.email, session_id: req?.session_id }, req?.swagger?.apiPath, 'delete', bank)) + newBankInfoLog.map(bank => toolsLib.user.createAuditLog({ email: req?.auth?.sub?.email, session_id: req?.session_id }, req?.swagger?.apiPath, req?.swagger?.operationPath?.[2], bank)); + deletedBankInfoLog.map(bank => toolsLib.user.createAuditLog({ email: req?.auth?.sub?.email, session_id: req?.session_id }, req?.swagger?.apiPath, 'delete', bank)); return res.json(updatedUser.bank_account); }) .catch((err) => { @@ -2300,7 +2308,7 @@ const getUserReferer = (req, res) => { }; const createUserByAdmin = (req, res) => { - const { email, password } = req.swagger.params.data.value; + const { email, password, referral } = req.swagger.params.data.value; loggerAdmin.info(req.uuid, 'controllers/admin/createUserByAdmin email', email); @@ -2325,6 +2333,7 @@ const createUserByAdmin = (req, res) => { role: 'user', id: null, email_verified: true, + referral, additionalHeaders: { 'x-forwarded-for': req.headers['x-forwarded-for'] } @@ -2858,7 +2867,7 @@ const disableUserWithdrawal = (req, res) => { expiry_date ); - toolsLib.user.disableUserWithdrawal(user_id, { expiry_date }) + toolsLib.user.disableUserWithdrawal(user_id, { expiry_date }) .then((data) => { toolsLib.user.createAuditLog({ email: req?.auth?.sub?.email, session_id: req?.session_id }, req?.swagger?.apiPath, req?.swagger?.operationPath?.[2], req?.swagger?.params?.data?.value); loggerAdmin.info( @@ -2908,10 +2917,10 @@ const createTradeByAdmin = (req, res) => { taker_fee ); - toolsLib.order.createTrade({symbol, side, price, size, maker_id, taker_id, maker_fee, taker_fee }, - { - 'x-forwarded-for': req.headers['x-forwarded-for'] - }) + toolsLib.order.createTrade({symbol, side, price, size, maker_id, taker_id, maker_fee, taker_fee }, + { + 'x-forwarded-for': req.headers['x-forwarded-for'] + }) .then((data) => { toolsLib.user.createAuditLog({ email: req?.auth?.sub?.email, session_id: req?.session_id }, req?.swagger?.apiPath, req?.swagger?.operationPath?.[2], req?.swagger?.params?.data?.value); loggerAdmin.info( @@ -3001,6 +3010,35 @@ const createUserReferralCodeByAdmin = (req, res) => { }); }; +const fetchUserTradingVolumeByAdmin = (req, res) => { + const { user_id, to, from } = req.swagger.params; + + loggerAdmin.info( + user_id.value, + 'controllers/user/fetchUserTradingVolumeByAdmin', + to.value, + from.value + ); + + toolsLib.user.fetchUserTradingVolume( + user_id.value, + { + to: to.value, + from: from.value + } + ) + .then((data) => { + return res.json(data); + }) + .catch((err) => { + loggerAdmin.error( + req.uuid, + 'controllers/user/fetchUserTradingVolumeByAdmin err', + err.message + ); + return res.status(err.statusCode || 400).json({ message: errorMessageConverter(err) }); + }); +}; const getPaymentDetailsByAdmin = (req, res) => { loggerAdmin.verbose(req.uuid, 'controllers/admin/getPaymentDetailsByAdmin/auth', req.auth); @@ -3082,7 +3120,7 @@ const deletePaymentDetailByAdmin = (req, res) => { toolsLib.user.deletePaymentDetail(id, user_id) .then(() => { return res.json({ - message: "Success" + message: 'Success' }); }) .catch((err) => { @@ -3091,6 +3129,27 @@ const deletePaymentDetailByAdmin = (req, res) => { }); }; +const deleteUserByAdmin = (req, res) => { + loggerAdmin.verbose(req.uuid, 'controllers/admin/deleteUserByAdmin/auth', req.auth); + + const { user_id } = req.swagger.params.data.value; + + loggerAdmin.verbose( + req.uuid, + 'controllers/admin/deleteUserByAdmin', + 'user_id', + user_id, + ); + toolsLib.user.deleteKitUser(user_id, false) + .then(() => { + return res.json({ message: 'Success' }); + }) + .catch((err) => { + loggerAdmin.error(req.uuid, 'controllers/admin/deleteUserByAdmin', err.message); + return res.status(err.statusCode || 400).json({ message: errorMessageConverter(err, req?.auth?.sub?.lang) }); + }); +}; + module.exports = { createInitialAdmin, getAdminKit, @@ -3165,8 +3224,10 @@ module.exports = { performDirectWithdrawalByAdmin, getUserReferralCodesByAdmin, createUserReferralCodeByAdmin, + fetchUserTradingVolumeByAdmin, getPaymentDetailsByAdmin, createPaymentDetailByAdmin, updatePaymentDetailByAdmin, - deletePaymentDetailByAdmin + deletePaymentDetailByAdmin, + deleteUserByAdmin }; diff --git a/server/api/controllers/order.js b/server/api/controllers/order.js index 9a865715e5..13adefa0a3 100644 --- a/server/api/controllers/order.js +++ b/server/api/controllers/order.js @@ -484,6 +484,7 @@ const adminCancelOrder = (req, res) => { }); }; + module.exports = { createOrder, createOrderByAdmin, diff --git a/server/api/controllers/p2p.js b/server/api/controllers/p2p.js index 78079832bf..f5b00ac44b 100644 --- a/server/api/controllers/p2p.js +++ b/server/api/controllers/p2p.js @@ -509,7 +509,7 @@ const createP2PFeedback = (req, res) => { const fetchP2PFeedbacks = (req, res) => { loggerP2P.verbose(req.uuid, 'controllers/p2p/fetchP2PFeedbacks/auth', req.auth); - const { transaction_id, merchant_id, limit, page, order_by, order, start_date, end_date, format } = req.swagger.params; + const { transaction_id, merchant_id, user_id, limit, page, order_by, order, start_date, end_date, format } = req.swagger.params; if (format.value && req.auth.scopes.indexOf(ROLES.ADMIN) === -1) { return res.status(403).json({ message: API_KEY_NOT_PERMITTED }); @@ -527,6 +527,7 @@ const fetchP2PFeedbacks = (req, res) => { toolsLib.p2p.fetchP2PFeedbacks({ transaction_id: transaction_id.value, merchant_id: merchant_id.value, + user_id: user_id.value, limit: limit.value, page: page.value, order_by: order_by.value, diff --git a/server/api/controllers/user.js b/server/api/controllers/user.js index c4fb4eb459..6735c2fbce 100644 --- a/server/api/controllers/user.js +++ b/server/api/controllers/user.js @@ -35,6 +35,7 @@ const { all } = require('bluebird'); const { each, isInteger } = require('lodash'); const { publisher } = require('../../db/pubsub'); const { isDate } = require('moment'); +const moment = require('moment'); const DeviceDetector = require('node-device-detector'); const uuid = require('uuid/v4'); @@ -1476,6 +1477,36 @@ const fetchUserReferrals = (req, res) => { }); }; +const fetchUserTradingVolume = (req, res) => { + const { to, from } = req.swagger.params; + + loggerUser.info( + req.uuid, + 'controllers/user/fetchUserTradingVolume', + to.value, + from.value + ); + + toolsLib.user.fetchUserTradingVolume( + req.auth.sub.id, + { + to: to.value, + from: from.value + } + ) + .then((data) => { + return res.json(data); + }) + .catch((err) => { + loggerUser.error( + req.uuid, + 'controllers/user/fetchUserTradingVolume err', + err.message + ); + return res.status(err.statusCode || 400).json({ message: errorMessageConverter(err) }); + }); +}; + const fetchUserAddressBook = (req, res) => { loggerUser.verbose(req.uuid, 'controllers/user/fetchUserAddressBook/auth', req.auth); @@ -1600,6 +1631,113 @@ const deletePaymentDetail = (req, res) => { }; +const fetchUserAutoTrades = (req, res) => { + loggerUser.verbose(req.uuid, 'controllers/user/fetchUserAutoTrades/auth', req.auth); + + const { limit, page, order_by, order, start_date, end_date, active } = req.swagger.params; + + if (order_by.value && typeof order_by.value !== 'string') { + loggerUser.error( + req.uuid, + 'controllers/user/fetchUserAutoTrades invalid order_by', + order_by.value + ); + return res.status(400).json({ message: 'Invalid order by' }); + } + + toolsLib.user.fetchUserAutoTrades(req.auth.sub.id, { + limit: limit.value, + page: page.value, + order_by: order_by.value, + order: order.value, + start_date: start_date.value, + end_date: end_date.value, + active: active.value + }) + .then((data) => res.json(data)) + .catch((err) => { + loggerUser.error(req.uuid, 'controllers/user/fetchUserAutoTrades', err.message); + return res.status(err.statusCode || 400).json({ message: errorMessageConverter(err) }); + }); +}; + +const createUserAutoTrade = (req, res) => { + loggerUser.verbose(req.uuid, 'controllers/user/createUserAutoTrade/auth', req.auth); + + const { spend_coin, buy_coin, spend_amount, frequency, week_days, day_of_month, trade_hour, active, description } = req.swagger.params.data.value; + + loggerUser.verbose( + req.uuid, + 'controllers/user/createUserAutoTrade data', + spend_coin, buy_coin, spend_amount, frequency, week_days, day_of_month, trade_hour, active, description + ); + + toolsLib.user.createUserAutoTrade(req.auth.sub.id, { + spend_coin, + buy_coin, + spend_amount, + frequency, + week_days, + day_of_month, + trade_hour, + active, + description + }) + .then((data) => res.json(data)) + .catch((err) => { + loggerUser.error(req.uuid, 'controllers/user/createUserAutoTrade', err.message); + return res.status(err.statusCode || 400).json({ message: errorMessageConverter(err) }); + }); +}; + +const updateUserAutoTrade = (req, res) => { + loggerUser.verbose(req.uuid, 'controllers/user/updateUserAutoTrade/auth', req.auth); + + const { id, spend_coin, buy_coin, spend_amount, frequency, week_days, day_of_month, trade_hour, active, description } = req.swagger.params.data.value; + + loggerUser.verbose( + req.uuid, + 'controllers/user/updateUserAutoTrade data', + id, spend_coin, buy_coin, spend_amount, frequency, week_days, day_of_month, trade_hour, active, description + ); + + toolsLib.user.updateUserAutoTrade(req.auth.sub.id, { + id, + spend_coin, + buy_coin, + spend_amount, + frequency, + week_days, + day_of_month, + trade_hour, + active, + description + }) + .then((data) => res.json(data)) + .catch((err) => { + loggerUser.error(req.uuid, 'controllers/user/updateUserAutoTrade', err.message); + return res.status(err.statusCode || 400).json({ message: errorMessageConverter(err) }); + }); +}; + +const deleteUserAutoTrade = (req, res) => { + loggerUser.verbose(req.uuid, 'controllers/user/deleteUserAutoTrade/auth', req.auth); + + const { removed_ids } = req.swagger.params.data.value; + + loggerUser.verbose(req.uuid, 'controllers/user/deleteUserAutoTrade data', removed_ids); + + toolsLib.user.deleteUserAutoTrade({ + user_id: req.auth.sub.id, + removed_ids + }) + .then((data) => res.json(data)) + .catch((err) => { + loggerUser.error(req.uuid, 'controllers/user/deleteUserAutoTrade', err.message); + return res.status(err.statusCode || 400).json({ message: errorMessageConverter(err) }); + }); +}; + module.exports = { signUpUser, getVerifyUser, @@ -1638,10 +1776,15 @@ module.exports = { fetchUserReferrals, createUserReferralCode, getUserReferralCodes, + fetchUserTradingVolume, updateUserAddresses, fetchUserAddressBook, getPaymentDetails, createPaymentDetail, updatePaymentDetail, - deletePaymentDetail + deletePaymentDetail, + fetchUserAutoTrades, + createUserAutoTrade, + updateUserAutoTrade, + deleteUserAutoTrade }; \ No newline at end of file diff --git a/server/api/swagger/admin.yaml b/server/api/swagger/admin.yaml index d0339f95a2..893fd54aaa 100644 --- a/server/api/swagger/admin.yaml +++ b/server/api/swagger/admin.yaml @@ -1240,6 +1240,9 @@ paths: type: string format: password maxLength: 128 + referral: + type: string + maxLength: 256 responses: 201: description: Created @@ -1328,6 +1331,42 @@ paths: - kyc x-token-permissions: - can_withdraw + delete: + operationId: deleteUserByAdmin + description: delete user by admin + tags: + - Admin + parameters: + - name: data + in: body + required: true + schema: + type: object + required: + - user_id + properties: + user_id: + type: number + format: int32 + + responses: + 200: + description: Success + schema: + $ref: "#/definitions/UserResponse" + default: + description: Error + schema: + $ref: "#/definitions/MessageResponse" + security: + - Token: [] + x-security-types: + - bearer + - hmac + x-security-scopes: + - admin + x-token-permissions: + - can_withdraw /admin/user/role: x-swagger-router-controller: admin put: @@ -3395,6 +3434,53 @@ paths: x-security-scopes: - admin - supervisor + /admin/user/trading-volume: + x-swagger-router-controller: admin + get: + description: Get user trading volume of last 30 days by admin + operationId: fetchUserTradingVolumeByAdmin + tags: + - User + parameters: + - in: query + name: user_id + description: user_id + required: true + type: number + format: int32 + - in: query + name: to + description: starting date + required: false + type: string + format: date-time + - in: query + name: from + description: ending date + required: false + type: string + format: date-time + responses: + 200: + description: Success + schema: + $ref: "#/definitions/ObjectResponse" + 202: + description: CSV + schema: + type: string + default: + description: Error + schema: + $ref: "#/definitions/MessageResponse" + security: + - Token: [] + x-security-types: + - bearer + x-security-scopes: + - admin + x-token-permissions: + - can_read /admin/user/referral/code: x-swagger-router-controller: admin get: diff --git a/server/api/swagger/definitions.yaml b/server/api/swagger/definitions.yaml index 67a3f80bb1..4702df0721 100644 --- a/server/api/swagger/definitions.yaml +++ b/server/api/swagger/definitions.yaml @@ -204,6 +204,10 @@ definitions: theme: type: string maxLength: 256 + display_currency: + type: string + maxLength: 32 + minLength: 1 order_book_levels: type: number format: int32 diff --git a/server/api/swagger/p2p.yaml b/server/api/swagger/p2p.yaml index 8a13e40582..7da63ab4fa 100644 --- a/server/api/swagger/p2p.yaml +++ b/server/api/swagger/p2p.yaml @@ -460,6 +460,12 @@ paths: required: false type: number format: int32 + - in: query + name: user_id + description: "id for user" + required: false + type: number + format: int32 - in: query name: limit description: "Number of elements to return. Default: 50. Maximun: 100" diff --git a/server/api/swagger/swagger.js b/server/api/swagger/swagger.js index 4a444663a2..474d96dd68 100644 --- a/server/api/swagger/swagger.js +++ b/server/api/swagger/swagger.js @@ -4,7 +4,7 @@ const definition = { swagger: '2.0', info: { title: 'HollaEx Kit', - version: '2.12.0' + version: '2.13.0' }, host: 'api.hollaex.com', basePath: '/v2', diff --git a/server/api/swagger/user.yaml b/server/api/swagger/user.yaml index 2e2d83b8fb..c1426eef1c 100644 --- a/server/api/swagger/user.yaml +++ b/server/api/swagger/user.yaml @@ -840,14 +840,14 @@ paths: in: query required: true type: string - minLength: 2 + minLength: 1 maxLength: 15 - name: network in: query required: false type: string description: Blockchain network - minLength: 2 + minLength: 1 maxLength: 10 responses: 201: @@ -1560,6 +1560,47 @@ paths: - bearer x-security-scopes: - user + /user/trading-volume: + x-swagger-router-controller: user + get: + description: Get user's trading volume of last 30 days + operationId: fetchUserTradingVolume + tags: + - User + parameters: + - in: query + name: to + description: starting date + required: false + type: string + format: date-time + - in: query + name: from + description: ending date + required: false + type: string + format: date-time + responses: + 200: + description: Success + schema: + $ref: "#/definitions/ObjectResponse" + 202: + description: CSV + schema: + type: string + default: + description: Error + schema: + $ref: "#/definitions/MessageResponse" + security: + - Token: [] + x-security-types: + - bearer + x-security-scopes: + - user + x-token-permissions: + - can_read /user/referral/code: x-swagger-router-controller: user get: @@ -2007,6 +2048,212 @@ paths: - hmac x-security-scopes: - user + /user/autotrade: + x-swagger-router-controller: user + get: + operationId: fetchUserAutoTrades + description: Get user auto trades + tags: + - User + parameters: + - in: query + name: active + description: filter by active status + required: false + type: boolean + - in: query + name: limit + description: "Number of elements to return. Default: 50. Maximum: 100" + required: false + type: number + format: int32 + - in: query + name: page + description: Page of data to retrieve + required: false + type: number + format: int32 + - in: query + name: order_by + description: Field to order data by + required: false + type: string + - in: query + name: order + description: order + required: false + type: string + enum: ['asc', 'desc'] + - in: query + name: start_date + description: starting date of queried data + required: false + type: string + format: date-time + - in: query + name: end_date + description: ending date of queried data + required: false + type: string + format: date-time + responses: + 200: + description: Success + schema: + $ref: "#/definitions/ObjectResponse" + default: + description: Error + schema: + $ref: "#/definitions/MessageResponse" + security: + - Token: [] + x-security-types: + - bearer + - hmac + x-security-scopes: + - user + post: + operationId: createUserAutoTrade + description: Create auto trade + tags: + - user + parameters: + - name: data + in: body + required: true + schema: + type: object + properties: + spend_coin: + type: string + buy_coin: + type: string + spend_amount: + type: number + format: double + frequency: + type: string + enum: ['daily', 'weekly', 'monthly'] + week_days: + type: array + items: + type: integer + format: int32 + day_of_month: + type: number + format: int32 + trade_hour: + type: number + format: int32 + active: + type: boolean + description: + type: string + responses: + 200: + description: Success + schema: + $ref: "#/definitions/ObjectResponse" + default: + description: Error + schema: + $ref: "#/definitions/MessageResponse" + security: + - Token: [] + x-security-types: + - bearer + - hmac + x-security-scopes: + - user + put: + operationId: updateUserAutoTrade + description: Update auto trade + tags: + - User + parameters: + - name: data + in: body + required: true + schema: + type: object + properties: + spend_coin: + type: string + buy_coin: + type: string + spend_amount: + type: number + format: double + frequency: + type: string + enum: ['daily', 'weekly', 'monthly'] + week_days: + type: array + items: + type: integer + format: int32 + day_of_month: + type: number + format: int32 + trade_hour: + type: number + format: int32 + active: + type: boolean + description: + type: string + id: + type: integer + format: int32 + responses: + 200: + description: Success + schema: + $ref: "#/definitions/ObjectResponse" + default: + description: Error + schema: + $ref: "#/definitions/MessageResponse" + security: + - Token: [] + x-security-types: + - bearer + - hmac + x-security-scopes: + - user + delete: + operationId: deleteUserAutoTrade + description: Delete auto trade + tags: + - User + parameters: + - name: data + in: body + required: true + schema: + type: object + properties: + removed_ids: + type: array + items: + type: integer + format: int32 + responses: + 200: + description: Success + schema: + $ref: "#/definitions/ObjectResponse" + default: + description: Error + schema: + $ref: "#/definitions/MessageResponse" + security: + - Token: [] + x-security-types: + - bearer + - hmac + x-security-scopes: + - user /logout: x-swagger-router-controller: user get: diff --git a/server/constants.js b/server/constants.js index 814dab3210..a1395433bd 100644 --- a/server/constants.js +++ b/server/constants.js @@ -172,6 +172,7 @@ exports.GET_FROZEN_USERS = () => cloneDeep(frozenUsers); exports.GET_EMAIL = () => cloneDeep(configuration.email); exports.GET_BROKER = () => cloneDeep(configuration.broker); exports.GET_QUICKTRADE = () => cloneDeep(configuration.quicktrade); +exports.GET_TRADEPATHS = () => cloneDeep(configuration.tradePaths); exports.GET_NETWORK_QUICKTRADE = () => cloneDeep(configuration.networkQuickTrades); exports.USER_META_KEYS = [ @@ -219,7 +220,10 @@ exports.KIT_CONFIG_KEYS = [ 'balance_history_config', 'transaction_limits', 'p2p_config', - 'referral_history_config' + 'referral_history_config', + 'chain_trade_config', + 'selectable_native_currencies', + 'auto_trade_config' ]; exports.KIT_SECRETS_KEYS = [ @@ -584,6 +588,13 @@ exports.EXPLORERS = { txPath: '/tx' } ], + pol: [ + { + name: 'PolygonScan', + baseUrl: 'https://polygonscan.com', + txPath: '/tx' + } + ], etc: [ { name: 'Ethereum Classic Explorer', @@ -685,6 +696,12 @@ exports.BALANCE_HISTORY_SUPPORTED_PLANS = ['fiat', 'boost', 'enterprise']; exports.REFERRAL_HISTORY_SUPPORTED_PLANS = ['fiat', 'boost', 'enterprise']; //REFERRAL HISTORY CONSTANTS END +//AUTO_TRADE CONSTANTS START + +exports.AUTO_TRADE_SUPPORTED_PLANS = ['boost', 'enterprise']; +//AUTO_TRADE CONSTANTS END + + exports.CUSTOM_CSS = ` .topbar-wrapper img { content:url('${exports.GET_KIT_CONFIG().logo_image}}'); diff --git a/server/db/migrations/20240129532541-add-balance-history-index.js b/server/db/migrations/20240129532541-add-balance-history-index.js new file mode 100644 index 0000000000..78cf9629ad --- /dev/null +++ b/server/db/migrations/20240129532541-add-balance-history-index.js @@ -0,0 +1,21 @@ +'use strict'; + +const TABLE = 'BalanceHistories'; +const COLUMN = 'user_id'; + +module.exports = { + up: async (queryInterface, Sequelize) => { + try { + await queryInterface.addIndex(TABLE, [COLUMN]); + } catch (error) { + return error; + } + }, + down: async (queryInterface, Sequelize) => { + try { + await queryInterface.removeIndex(TABLE, COLUMN); + } catch (error) { + return error; + } + } +}; diff --git a/server/db/migrations/20241025624163-create-auto-trade-user.js b/server/db/migrations/20241025624163-create-auto-trade-user.js new file mode 100644 index 0000000000..77e2681a0c --- /dev/null +++ b/server/db/migrations/20241025624163-create-auto-trade-user.js @@ -0,0 +1,81 @@ +'use strict'; + +const TABLE_NAME = 'AutoTradeConfigs'; + +module.exports = { + up: (queryInterface, Sequelize) => { + return queryInterface.createTable( + TABLE_NAME, + { + id: { + allowNull: false, + autoIncrement: true, + primaryKey: true, + type: Sequelize.INTEGER + }, + user_id: { + type: Sequelize.INTEGER, + onDelete: 'CASCADE', + allowNull: false, + references: { + model: 'Users', + key: 'id' + } + }, + spend_coin: { + type: Sequelize.STRING, + allowNull: false + }, + buy_coin: { + type: Sequelize.STRING, + allowNull: false + }, + spend_amount: { + type: Sequelize.DOUBLE, + allowNull: false + }, + frequency: { + type: Sequelize.ENUM('daily', 'weekly', 'monthly'), + allowNull: false + }, + week_days: { + type: Sequelize.ARRAY(Sequelize.INTEGER), + allowNull: true + }, + day_of_month: { + type: Sequelize.INTEGER, + allowNull: true + }, + trade_hour: { + type: Sequelize.INTEGER, + allowNull: false, + defaultValue: 0 + }, + description: { + type: Sequelize.TEXT, + allowNull: true + }, + active: { + type: Sequelize.BOOLEAN, + allowNull: false, + defaultValue: true + }, + created_at: { + allowNull: false, + type: Sequelize.DATE, + defaultValue: Sequelize.literal('NOW()') + }, + updated_at: { + allowNull: false, + type: Sequelize.DATE, + defaultValue: Sequelize.literal('NOW()') + } + }, + { + timestamps: true, + underscored: true + } + ); + }, + down: (queryInterface) => queryInterface.dropTable(TABLE_NAME) +}; diff --git a/server/db/migrations/20241026732561-auto-traade-balance-email-template.js b/server/db/migrations/20241026732561-auto-traade-balance-email-template.js new file mode 100644 index 0000000000..b5d0bc68cf --- /dev/null +++ b/server/db/migrations/20241026732561-auto-traade-balance-email-template.js @@ -0,0 +1,66 @@ +'use strict'; +const TABLE = 'Status'; + +const templetes = [ + 'AUTO_TRADE_ERROR' +] + +const languages = { + 'AUTO_TRADE_ERROR': { + 'en': require('../../mail/strings/en.json').en.AUTO_TRADE_ERROR, + 'ar': require('../../mail/strings/ar.json').ar.AUTO_TRADE_ERROR, + 'de': require('../../mail/strings/de.json').de.AUTO_TRADE_ERROR, + 'es': require('../../mail/strings/es.json').es.AUTO_TRADE_ERROR, + 'fa': require('../../mail/strings/fa.json').fa.AUTO_TRADE_ERROR, + 'fr': require('../../mail/strings/fr.json').fr.AUTO_TRADE_ERROR, + 'id': require('../../mail/strings/id.json').id.AUTO_TRADE_ERROR, + 'ja': require('../../mail/strings/ja.json').ja.AUTO_TRADE_ERROR, + 'ko': require('../../mail/strings/ko.json').ko.AUTO_TRADE_ERROR, + 'pt': require('../../mail/strings/pt.json').pt.AUTO_TRADE_ERROR, + 'vi': require('../../mail/strings/vi.json').vi.AUTO_TRADE_ERROR, + 'zh': require('../../mail/strings/zh.json').zh.AUTO_TRADE_ERROR, + }, +}; + +const models = require('../models'); + + +module.exports = { + async up(queryInterface) { + + for (const templete of templetes) { + const statusModel = models[TABLE]; + const status = await statusModel.findOne({}); + + if(!status?.email) return; + const emailTemplates = { + ...status.email, + }; + + let hasTemplate = true; + for (const [language, emailTemplate] of Object.entries(languages[templete])) { + + if (status.email && status.email[language] && !status.email[language].hasOwnProperty(templete)) { + hasTemplate = false; + emailTemplates[language] = { + ...status.email[language], + [templete]: emailTemplate + }; + } + } + + if (!hasTemplate) { + await statusModel.update( + { email: emailTemplates }, + { where: { id: status.id } } + ); + } + } + }, + + down: () => { + return new Promise((resolve) => { + resolve(); + }); + } +}; diff --git a/server/db/migrations/20241101125474-update-p2p-templates.js b/server/db/migrations/20241101125474-update-p2p-templates.js new file mode 100644 index 0000000000..5ca444312c --- /dev/null +++ b/server/db/migrations/20241101125474-update-p2p-templates.js @@ -0,0 +1,55 @@ +'use strict'; +const TABLE = 'Status'; + +const templetes = [ + 'P2P_BUYER_PAID_ORDER' +] + +const languages = { + 'P2P_BUYER_PAID_ORDER': { + 'en': require('../../mail/strings/en.json').en.P2P_BUYER_PAID_ORDER, + }, +}; + +const models = require('../models'); + + +module.exports = { + async up(queryInterface) { + + for (const templete of templetes) { + const statusModel = models[TABLE]; + const status = await statusModel.findOne({}); + + if(!status?.email) return; + const emailTemplates = { + ...status.email, + }; + + let hasTemplate = true; + for (const [language, emailTemplate] of Object.entries(languages[templete])) { + + if (status.email && status.email[language]) { + hasTemplate = false; + emailTemplates[language] = { + ...status.email[language], + [templete]: emailTemplate + }; + } + } + + if (!hasTemplate) { + await statusModel.update( + { email: emailTemplates }, + { where: { id: status.id } } + ); + } + } + }, + + down: () => { + return new Promise((resolve) => { + resolve(); + }); + } +}; diff --git a/server/db/models/autoTradeConfig.js b/server/db/models/autoTradeConfig.js new file mode 100644 index 0000000000..39884cd2c0 --- /dev/null +++ b/server/db/models/autoTradeConfig.js @@ -0,0 +1,68 @@ +module.exports = function (sequelize, DataTypes) { + const AutoTradeConfig = sequelize.define( + 'AutoTradeConfig', + { + user_id: { + type: DataTypes.INTEGER, + onDelete: 'CASCADE', + allowNull: false, + references: { + model: 'Users', + key: 'id' + } + }, + spend_coin: { + type: DataTypes.STRING, + allowNull: false + }, + buy_coin: { + type: DataTypes.STRING, + allowNull: false + }, + spend_amount: { + type: DataTypes.DOUBLE, + allowNull: false + }, + frequency: { + type: DataTypes.ENUM('daily', 'weekly', 'monthly'), + allowNull: false + }, + week_days: { + type: DataTypes.ARRAY(DataTypes.INTEGER), // 0-6 + allowNull: true + }, + day_of_month: { + type: DataTypes.INTEGER, // 1-31 + allowNull: true + }, + trade_hour: { + type: DataTypes.INTEGER, // 0-23 + allowNull: false, + defaultValue: 0 + }, + description: { + type: DataTypes.TEXT, + allowNull: true + }, + active: { + type: DataTypes.BOOLEAN, + allowNull: false, + defaultValue: true + } + }, + { + timestamps: true, + underscored: true, + tableName: 'AutoTradeConfigs' + } + ); + AutoTradeConfig.associate = (models) => { + AutoTradeConfig.belongsTo(models.User, { + as: 'user', + foreignKey: 'user_id', + targetKey: 'id', + onDelete: 'CASCADE' + }); + }; + return AutoTradeConfig; +}; \ No newline at end of file diff --git a/server/db/models/index.js b/server/db/models/index.js index 2d94bba38c..1cae5de7a5 100644 --- a/server/db/models/index.js +++ b/server/db/models/index.js @@ -70,6 +70,8 @@ model = require(path.join(__dirname, './userAddressBook'))(sequelize, Sequelize. db[model.name] = model; model = require(path.join(__dirname, './paymentDetail'))(sequelize, Sequelize.DataTypes); db[model.name] = model; +model = require(path.join(__dirname, './autoTradeConfig'))(sequelize, Sequelize.DataTypes); +db[model.name] = model; Object.keys(db).forEach(function (modelName) { if ('associate' in db[modelName]) { diff --git a/server/db/models/user.js b/server/db/models/user.js index f245a2d955..8e92065c3b 100644 --- a/server/db/models/user.js +++ b/server/db/models/user.js @@ -22,7 +22,8 @@ const SETTINGS_DATA_DEFAULT = { }, interface: { order_book_levels: 10, - theme: process.env.DEFAULT_THEME || 'white' + theme: process.env.DEFAULT_THEME || 'white', + display_currency: process.env.NATIVE_CURRENCY || 'usdt', }, language: process.env.DEFAULT_LANGUAGE || 'en', audio: { diff --git a/server/init.js b/server/init.js index ff9350fdeb..102cbec0ec 100644 --- a/server/init.js +++ b/server/init.js @@ -223,6 +223,7 @@ const checkStatus = () => { configuration.quicktrade.push(item); }); + configuration.tradePaths = {}; for (let tier of tiers) { if (!('maker' in tier.fees)) { diff --git a/server/mail/index.js b/server/mail/index.js index 21f1db819e..325c8a430e 100644 --- a/server/mail/index.js +++ b/server/mail/index.js @@ -71,6 +71,7 @@ const sendEmail = ( case MAILTYPE.P2P_VENDOR_CONFIRMED_ORDER: case MAILTYPE.P2P_VENDOR_CANCELLED_ORDER: case MAILTYPE.P2P_VENDOR_APPEALED_ORDER: + case MAILTYPE.AUTO_TRADE_ERROR: case MAILTYPE.DOC_REJECTED: case MAILTYPE.DOC_VERIFIED: { to.BccAddresses = BCC_ADDRESSES(); diff --git a/server/mail/strings/ar.json b/server/mail/strings/ar.json index 14708b0b6c..70f9468383 100644 --- a/server/mail/strings/ar.json +++ b/server/mail/strings/ar.json @@ -159,6 +159,12 @@ "P2P_VENDOR_APPEALED_ORDER": { "html": "

عزيزي ${name}

لقد قمت بالاستئناف على طلبك. يرجى الاتصال بالدعم لحل المشكلة.

شكرًا لاستخدامك منصتنا.

تم تقديم الطلب من: ${ip}

تحياتنا
فريق ${api_name}

", "title": "تم اكتشاف نشاط في طلبك P2P" + }, + "AUTO_TRADE_ERROR": { + "html": "

عزيزي ${name}،

لقد اكتشفنا أن إعداد التجارة الآلية الخاص بك قد فشل بسبب نقص الرصيد للتداول التالي. يرجى التحقق وتحديث رصيدك. مبلغ الإنفاق: ${spend_amount}، العملة المنفقة: ${spend_coin}، العملة المشتراة: ${buy_coin}.

شكرًا لاستخدامك منصتنا.

مع تحيات فريق ${api_name}

", + "title": "خطأ في إعداد التجارة الآلية الخاص بك" } + + } } \ No newline at end of file diff --git a/server/mail/strings/de.json b/server/mail/strings/de.json index 60354cb7b3..e50c357413 100644 --- a/server/mail/strings/de.json +++ b/server/mail/strings/de.json @@ -159,6 +159,10 @@ "P2P_VENDOR_APPEALED_ORDER": { "html": "

Lieber ${name}

Sie haben Ihre Bestellung angefochten. Bitte kontaktieren Sie den Support, um das Problem zu lösen.

Vielen Dank, dass Sie unsere Plattform nutzen.

Anfrage eingeleitet von: ${ip}

Mit freundlichen Grüßen
Ihr ${api_name} Team

", "title": "Aktivität auf Ihrer P2P-Bestellung festgestellt" - } + }, + "AUTO_TRADE_ERROR": { + "html": "

Lieber ${name},

Wir haben festgestellt, dass Ihre automatische Handelskonfiguration aufgrund unzureichender Mittel für den folgenden Handel fehlgeschlagen ist. Bitte überprüfen und aktualisieren Sie Ihr Guthaben. Ausgabebetrag: ${spend_amount}, Ausgabewährung: ${spend_coin}, Kaufwährung: ${buy_coin}.

Vielen Dank, dass Sie unsere Plattform nutzen.

Mit freundlichen Grüßen, das ${api_name} Team

", + "title": "Fehler in Ihrer Auto-Handelskonfiguration" + } } } \ No newline at end of file diff --git a/server/mail/strings/en.json b/server/mail/strings/en.json index 2ca334c27d..91bda12231 100644 --- a/server/mail/strings/en.json +++ b/server/mail/strings/en.json @@ -77,16 +77,16 @@ "title": "Discount Rate Change" }, "BANK_VERIFIED": { - "html": "

Dear ${name}

A pending bank account has been verified. Your valid account can now be used for exchange operations requiring a bank account.

Verified Bank Accounts:${list_detail_bank_account}

To view your current bank accounts, please visit the exchange verification Tab

Regards
${api_name} team

", - "title": "Bank Verified" + "html": "

Dear ${name}

A pending payment account has been verified. Your valid account can now be used for exchange operations.

Verified Accounts:${list_detail_bank_account}

To view your current accounts, please visit the exchange verification Tab

Regards
${api_name} team

", + "title": "Payment account Verified" }, "USER_ID_VERIFICATION_REJECT": { "html": "

Dear ${name}

Your recent ID verification is processed and is unfortunately rejected. For further actions read the message from our expert below:

Message: ${message}

Regards
${api_name} team

", "title": "ID Verification Rejected" }, "USER_BANK_VERIFICATION_REJECT": { - "html": "

Dear ${name}

Your new bank registration is processed and is unfortunately rejected. For further actions read the message from our expert below:

Message: ${message}

Regards
${api_name} team

", - "title": "New Bank Application Rejected" + "html": "

Dear ${name}

Your new payment option is processed and is unfortunately rejected. For further actions read the message from our expert below:

Message: ${message}

Regards
${api_name} team

", + "title": "New Payment Option Rejected" }, "PASSWORD_CHANGED": { "html": "

Dear ${name}

This email confirms that you recently changed the password for your account. No further action is required.
If you did not authorize this change please contact us immediately.

Regards
${api_name} team

", @@ -129,7 +129,7 @@ "title": "Update on Your P2P Deal" }, "P2P_BUYER_PAID_ORDER": { - "html": "

Dear ${name}

You have marked your order as paid. Waiting for vendor to check, confirm and release funds

Thank you for using our platform.

Request initiated from: ${ip}

Regards
${api_name} team

", + "html": "

Dear ${name}

You have marked your order as paid. Waiting for seller to check, confirm and release funds

Thank you for using our platform.

Request initiated from: ${ip}

Regards
${api_name} team

", "title": "Activity Detected on Your P2P Order" }, "P2P_ORDER_EXPIRED": { @@ -159,6 +159,10 @@ "P2P_VENDOR_APPEALED_ORDER": { "html": "

Dear ${name}

You have appealed your order. Please contact support to resolve the issue.

Thank you for using our platform.

Request initiated from: ${ip}

Regards
${api_name} team

", "title": "Activity Detected on Your P2P Order" + }, + "AUTO_TRADE_ERROR": { + "html": "

Dear ${name},

We have detected your auto trade config failed due to insufficient balance for the following trade. Please check and update your balance. Spend Amount: ${spend_amount}, Spend Coin: ${spend_coin}, Buy Coin: ${buy_coin}

Thank you for using our platform.

Regards,
${api_name} team

", + "title": "Error on your Auto Trade Config" } } } \ No newline at end of file diff --git a/server/mail/strings/es.json b/server/mail/strings/es.json index 1cb77b5c3f..2a692edda3 100644 --- a/server/mail/strings/es.json +++ b/server/mail/strings/es.json @@ -159,6 +159,10 @@ "P2P_VENDOR_APPEALED_ORDER": { "html": "

Estimado ${name}

Ha apelado su pedido. Por favor, póngase en contacto con el soporte para resolver el problema.

Gracias por usar nuestra plataforma.

Solicitud iniciada desde: ${ip}

Saludos
equipo ${api_name}

", "title": "Actividad detectada en su pedido P2P" - } + }, + "AUTO_TRADE_ERROR": { + "html": "

Estimado ${name},

Hemos detectado que su configuración de comercio automático falló debido a un saldo insuficiente para la siguiente operación. Por favor, revise y actualice su saldo. Monto gastado: ${spend_amount}, Moneda gastada: ${spend_coin}, Moneda comprada: ${buy_coin}.

Gracias por usar nuestra plataforma.

Saludos,
El equipo de ${api_name}

", + "title": "Error en su configuración de comercio automático" + } } } \ No newline at end of file diff --git a/server/mail/strings/fa.json b/server/mail/strings/fa.json index 9566bea230..727f78a2a4 100644 --- a/server/mail/strings/fa.json +++ b/server/mail/strings/fa.json @@ -159,7 +159,10 @@ "P2P_VENDOR_APPEALED_ORDER": { "html": "

عزیز ${name}

شما به سفارش خود اعتراض کرده‌اید. لطفاً با پشتیبانی تماس بگیرید تا مشکل حل شود.

از اینکه از پلتفرم ما استفاده می‌کنید سپاسگزاریم.

درخواست از: ${ip}

با احترام
تیم ${api_name}

", "title": "فعالیت شناسایی شده در سفارش P2P شما" - } - + }, + "AUTO_TRADE_ERROR": { + "html": "

کاربر گرامی ${name}،

ما متوجه شدیم که تنظیمات تجارت خودکار شما به دلیل موجودی ناکافی برای معامله زیر انجام نشد. لطفاً موجودی خود را بررسی و به‌روزرسانی کنید. مقدار هزینه: ${spend_amount}، ارز هزینه شده: ${spend_coin}، ارز خریداری شده: ${buy_coin}.

از استفاده شما از پلتفرم ما متشکریم.

با احترام، تیم ${api_name}

", + "title": "خطا در تنظیم تجارت خودکار شما" + } } } \ No newline at end of file diff --git a/server/mail/strings/fr.json b/server/mail/strings/fr.json index 688c11bb63..94a19a66f8 100644 --- a/server/mail/strings/fr.json +++ b/server/mail/strings/fr.json @@ -159,6 +159,11 @@ "P2P_VENDOR_APPEALED_ORDER": { "html": "

Cher ${name}

Vous avez fait appel de votre commande. Veuillez contacter le support pour résoudre le problème.

Merci d'utiliser notre plateforme.

Requête initiée depuis: ${ip}

Cordialement
L'équipe ${api_name}

", "title": "Activité détectée sur votre commande P2P" - } + }, + "AUTO_TRADE_ERROR": { + "html": "

Cher ${name},

Nous avons détecté que votre configuration de commerce automatique a échoué en raison d'un solde insuffisant pour l'échange suivant. Veuillez vérifier et mettre à jour votre solde. Montant dépensé : ${spend_amount}, Monnaie dépensée : ${spend_coin}, Monnaie achetée : ${buy_coin}.

Merci d'utiliser notre plateforme.

Cordialement, l'équipe ${api_name}

", + "title": "Erreur dans votre configuration de commerce automatique" + } + } } \ No newline at end of file diff --git a/server/mail/strings/id.json b/server/mail/strings/id.json index 9b6e4a52e7..99ca35c307 100644 --- a/server/mail/strings/id.json +++ b/server/mail/strings/id.json @@ -159,6 +159,11 @@ "P2P_VENDOR_APPEALED_ORDER": { "html": "

Dear ${name}

Anda telah mengajukan banding untuk pesanan Anda. Silakan hubungi dukungan untuk menyelesaikan masalah ini.

Terima kasih telah menggunakan platform kami.

Permintaan diajukan dari: ${ip}

Salam Hormat
tim ${api_name}

", "title": "Aktivitas Terdeteksi pada Pesanan P2P Anda" - } + }, + "AUTO_TRADE_ERROR":{ + "html": "

Dear ${name},

Kami telah mendeteksi bahwa konfigurasi perdagangan otomatis Anda gagal karena saldo yang tidak mencukupi untuk perdagangan berikutnya. Harap periksa dan perbarui saldo Anda. Jumlah Pengeluaran: ${spend_amount}, Mata Uang yang Dibelanjakan: ${spend_coin}, Mata Uang yang Dibeli: ${buy_coin}.

Terima kasih telah menggunakan platform kami.

Salam hormat, tim ${api_name}

", + "title": "Kesalahan pada konfigurasi perdagangan otomatis Anda" + } + } } \ No newline at end of file diff --git a/server/mail/strings/index.js b/server/mail/strings/index.js index cac55a91a3..66a4aa6c34 100644 --- a/server/mail/strings/index.js +++ b/server/mail/strings/index.js @@ -65,6 +65,9 @@ const MAILTYPE = { P2P_VENDOR_CONFIRMED_ORDER: 'p2p_vendor_confirmed_order', P2P_VENDOR_CANCELLED_ORDER: 'p2p_vendor_cancelled_order', P2P_VENDOR_APPEALED_ORDER: 'p2p_vendor_appealed_order', + + //AUTO TRADE + AUTO_TRADE_ERROR: 'auto_trade_error' }; const languageFile = (lang) => { diff --git a/server/mail/strings/ja.json b/server/mail/strings/ja.json index 143fa7442a..993365aae6 100644 --- a/server/mail/strings/ja.json +++ b/server/mail/strings/ja.json @@ -159,6 +159,11 @@ "P2P_VENDOR_APPEALED_ORDER": { "html": "

親愛なる${name}様

お客様は注文に対して異議を申し立てました。問題を解決するためにサポートに連絡してください。

私たちのプラットフォームをご利用いただきありがとうございます。

リクエスト発行元: ${ip}

敬具
${api_name}チーム

", "title": "P2P注文にアクティビティが検出されました" - } + }, + "AUTO_TRADE_ERROR": { + "html": "

親愛なる${name}様、

お客様の自動取引設定が、残高不足のため次の取引で失敗しました。残高を確認して更新してください。支出額: ${spend_amount}、支出通貨: ${spend_coin}、購入通貨: ${buy_coin}。

当プラットフォームをご利用いただきありがとうございます。

敬具、${api_name}チーム

", + "title": "自動取引設定のエラー" + } + } } \ No newline at end of file diff --git a/server/mail/strings/ko.json b/server/mail/strings/ko.json index b63a8c31fe..d03759dbdc 100644 --- a/server/mail/strings/ko.json +++ b/server/mail/strings/ko.json @@ -159,6 +159,11 @@ "P2P_VENDOR_APPEALED_ORDER": { "html": "

친애하는 ${name} 님

귀하는 주문에 대해 이의를 제기했습니다. 문제를 해결하려면 지원팀에 문의하십시오.

저희 플랫폼을 이용해 주셔서 감사합니다.

요청이 발생한 위치: ${ip}

감사합니다
${api_name} 팀

", "title": "귀하의 P2P 주문에서 감지된 활동" - } + }, + "AUTO_TRADE_ERROR": { + "html": "

${name}님,

다음 거래에 대해 잔액 부족으로 인해 자동 거래 설정이 실패한 것을 감지했습니다. 잔액을 확인하고 업데이트하세요. 지출 금액: ${spend_amount}, 지출 화폐: ${spend_coin}, 구매 화폐: ${buy_coin}.

당사 플랫폼을 이용해 주셔서 감사합니다.

감사합니다, ${api_name} 팀

", + "title": "자동 거래 설정 오류" + } + } } \ No newline at end of file diff --git a/server/mail/strings/mn.json b/server/mail/strings/mn.json index 163402204b..2fe4311c89 100644 --- a/server/mail/strings/mn.json +++ b/server/mail/strings/mn.json @@ -159,6 +159,11 @@ "P2P_VENDOR_APPEALED_ORDER": { "html": "

Эрхэм ${name}

Та захиалгандаа гомдол гаргасан байна. Асуудлыг шийдвэрлэхийн тулд дэмжлэгтэй холбогдоно уу.

Манай платформыг ашигласанд баярлалаа.

Хүсэлт ирсэн IP: ${ip}

Хүндэтгэсэн
${api_name} баг

", "title": "Таны P2P захиалгад үйл ажиллагаа илэрсэн байна" - } + }, + "AUTO_TRADE_ERROR":{ + "html": "

Хүндэт ${name},

Таны автоматаар худалдааны тохиргоо дараах гүйлгээний үед үлдэгдэл дутагдлын улмаас амжилтгүй болсон байна. Та үлдэгдлээ шалгаж шинэчилнэ үү. Зарцуулах хэмжээ: ${spend_amount}, Зарцуулах валют: ${spend_coin}, Худалдаж авах валют: ${buy_coin}.

Манай платформыг ашигласанд баярлалаа.

Хүндэтгэсэн, ${api_name} баг

", + "title": "Таны автоматаар худалдааны тохиргоонд алдаа гарсан" + } + } } \ No newline at end of file diff --git a/server/mail/strings/pt.json b/server/mail/strings/pt.json index 9288f8936a..e80f099653 100644 --- a/server/mail/strings/pt.json +++ b/server/mail/strings/pt.json @@ -159,6 +159,11 @@ "P2P_VENDOR_APPEALED_ORDER": { "html": "

Caro(a) ${name}

Você recorreu do seu pedido. Por favor, entre em contato com o suporte para resolver o problema.

Obrigado por usar nossa plataforma.

Solicitação iniciada de: ${ip}

Atenciosamente
equipe ${api_name}

", "title": "Atividade Detectada em seu Pedido P2P" - } + }, + "AUTO_TRADE_ERROR":{ + "html": "

Caro(a) ${name},

Detectamos que sua configuração de negociação automática falhou devido a saldo insuficiente para a seguinte transação. Por favor, verifique e atualize seu saldo. Valor gasto: ${spend_amount}, Moeda gasta: ${spend_coin}, Moeda comprada: ${buy_coin}.

Obrigado por usar nossa plataforma.

Atenciosamente, equipe ${api_name}

", + "title": "Erro na sua configuração de negociação automática" + } + } } \ No newline at end of file diff --git a/server/mail/strings/tr.json b/server/mail/strings/tr.json index afd18392fd..30f7ed0f7f 100644 --- a/server/mail/strings/tr.json +++ b/server/mail/strings/tr.json @@ -159,6 +159,11 @@ "P2P_VENDOR_APPEALED_ORDER": { "html": "

Sevgili ${name}

Siparişinize itiraz ettiniz. Sorunu çözmek için lütfen destek ile iletişime geçin.

Platformumuzu kullandığınız için teşekkür ederiz.

İstek şu IP den yapıldı: ${ip}

Saygılarımızla
${api_name} ekibi

", "title": "P2P Siparişinizde Aktivite Tespit Edildi" - } + }, + "AUTO_TRADE_ERROR":{ + "html": "

Sayın ${name},

Otomatik ticaret yapılandırmanız, aşağıdaki işlem için yetersiz bakiye nedeniyle başarısız oldu. Lütfen bakiyenizi kontrol edin ve güncelleyin. Harcama Tutarı: ${spend_amount}, Harcanan Coin: ${spend_coin}, Satın Alınan Coin: ${buy_coin}.

Platformumuzu kullandığınız için teşekkür ederiz.

Saygılarımızla, ${api_name} ekibi

", + "title": "Otomatik Ticaret Yapılandırmanızda Hata" + } + } } diff --git a/server/mail/strings/ur.json b/server/mail/strings/ur.json index 2d4b0975a1..e427a26301 100644 --- a/server/mail/strings/ur.json +++ b/server/mail/strings/ur.json @@ -159,6 +159,11 @@ "P2P_VENDOR_APPEALED_ORDER": { "html": "

محترم ${name}

آپ نے اپنے آرڈر پر اپیل کی ہے۔ مسئلہ حل کرنے کے لئے برائے مہربانی سپورٹ سے رابطہ کریں۔

ہمارا پلیٹ فارم استعمال کرنے کا شکریہ۔

درخواست شروع کی گئی IP: ${ip}

نیک تمنائیں
${api_name} ٹیم

", "title": "آپ کے P2P آرڈر میں سرگرمی کا پتہ چلا ہے" - } + }, + "AUTO_TRADE_ERROR":{ + "html": "

محترم ${name},

ہم نے دیکھا کہ آپ کی خودکار تجارتی ترتیب درج ذیل تجارت کے لیے ناکافی بیلنس کی وجہ سے ناکام ہوگئی ہے۔ براہ کرم اپنے بیلنس کو چیک کریں اور اپ ڈیٹ کریں۔ خرچ کی رقم: ${spend_amount}, خرچ کی گئی کرنسی: ${spend_coin}, خریدی گئی کرنسی: ${buy_coin}۔

ہمارا پلیٹ فارم استعمال کرنے کے لئے آپ کا شکریہ۔

نیک تمنائیں،
${api_name} ٹیم

", + "title": "آپ کی خودکار تجارتی ترتیب میں خرابی" + } + } } diff --git a/server/mail/strings/vi.json b/server/mail/strings/vi.json index 7e01ce8258..df9c775099 100644 --- a/server/mail/strings/vi.json +++ b/server/mail/strings/vi.json @@ -159,6 +159,11 @@ "P2P_VENDOR_APPEALED_ORDER": { "html": "

Kính gửi ${name}

Bạn đã khiếu nại đơn hàng của mình. Vui lòng liên hệ với bộ phận hỗ trợ để giải quyết vấn đề.

Cảm ơn bạn đã sử dụng nền tảng của chúng tôi.

Yêu cầu được thực hiện từ: ${ip}

Trân trọng
đội ngũ ${api_name}

", "title": "Hoạt động được phát hiện trên Đơn hàng P2P của bạn" - } + }, + "AUTO_TRADE_ERROR":{ + "html": "

Xin chào ${name},

Chúng tôi đã phát hiện cấu hình giao dịch tự động của bạn đã thất bại do số dư không đủ cho giao dịch sau. Vui lòng kiểm tra và cập nhật số dư của bạn. Số tiền chi tiêu: ${spend_amount}, Đồng tiền chi tiêu: ${spend_coin}, Đồng tiền mua: ${buy_coin}.

Cảm ơn bạn đã sử dụng nền tảng của chúng tôi.

Trân trọng, đội ngũ ${api_name}

", + "title": "Lỗi trong cấu hình giao dịch tự động của bạn" + } + } } \ No newline at end of file diff --git a/server/mail/strings/zh.json b/server/mail/strings/zh.json index 086872cbc8..88bb26b0dd 100644 --- a/server/mail/strings/zh.json +++ b/server/mail/strings/zh.json @@ -155,6 +155,11 @@ "P2P_VENDOR_APPEALED_ORDER": { "html": "

亲爱的 ${name}

您已对您的订单提出申诉。请联系支持以解决此问题。

感谢您使用我们的平台。

请求发起自:${ip}

此致
${api_name}团队

", "title": "您的P2P订单中检测到活动" - } + }, + "AUTO_TRADE_ERROR":{ + "html": "

亲爱的${name},

我们检测到您的自动交易配置因余额不足而失败,无法进行以下交易。请检查并更新您的余额。支出金额:${spend_amount},支出货币:${spend_coin},购买货币:${buy_coin}。

感谢您使用我们的平台。

此致,${api_name}团队

", + "title": "您的自动交易配置出错" + } + } } \ No newline at end of file diff --git a/server/mail/templates/index.js b/server/mail/templates/index.js index 8e6174e932..7b2bde1b1b 100644 --- a/server/mail/templates/index.js +++ b/server/mail/templates/index.js @@ -450,6 +450,13 @@ const replaceHTMLContent = (type, html = '', email, data, language, domain) => { html = html.replace(/\$\{ip\}/g, data.ip || ''); html = html.replace(/\$\{link\}/g, `${domain}/p2p/order/${data.order_id}`); } + else if (type === MAILTYPE.AUTO_TRADE_ERROR) { + html = html.replace(/\$\{name\}/g, email || ''); + html = html.replace(/\$\{api_name\}/g, API_NAME() || ''); + html = html.replace(/\$\{spend_amount\}/g, data.spend_amount || ''); + html = html.replace(/\$\{spend_coin\}/g, data.spend_coin || ''); + html = html.replace(/\$\{buy_coin\}/g, data.buy_coin || ''); + } return html; }; diff --git a/server/messages.js b/server/messages.js index f304b28e1f..7ccdb6b491 100644 --- a/server/messages.js +++ b/server/messages.js @@ -262,9 +262,10 @@ exports.CANNOT_CHANGE_DELETED_EMAIL = 'Cannot change deleted email'; exports.FAILED_GET_QUOTE = 'Failed to get the quote'; exports.BALANCE_HISTORY_NOT_ACTIVE = 'This feature is not active on the exchange'; exports.WITHDRAWAL_DISABLED = 'Withdrawal disabled for this user'; +exports.FEATURE_NOT_ACTIVE = 'This feature is not active on the exchange'; exports.ADDRESSBOOK_MISSING_FIELDS = 'Each address must contain both address, network, currency and label fields'; exports.ADDRESSBOOK_ALREADY_EXISTS = 'Address label already exists in the payload'; exports.ADDRESSBOOK_NOT_FOUND = 'User address book not found'; exports.PAYMENT_DETAIL_NOT_FOUND = 'Payment detail not found'; exports.UNAUTHORIZED_UPDATE_METHOD = 'You cannot update verified payment method'; -exports.P2P_DEAL_NOT_FOUND = 'P2P Deal not found!'; \ No newline at end of file +exports.P2P_DEAL_NOT_FOUND = 'P2P Deal not found!'; diff --git a/server/package.json b/server/package.json index 7f26c8eaaa..7d772248cc 100644 --- a/server/package.json +++ b/server/package.json @@ -1,5 +1,5 @@ { - "version": "2.12.0", + "version": "2.13.0", "private": false, "description": "HollaEx Kit", "keywords": [ diff --git a/server/plugins/job.js b/server/plugins/job.js index 9c7c341895..69812e2274 100644 --- a/server/plugins/job.js +++ b/server/plugins/job.js @@ -287,6 +287,126 @@ const referralTradesRunner = () =>{ }); } +const scheduleAutoTrade = () => { + cron.schedule('0 0 * * * *', async () => { + loggerPlugin.verbose('Auto trade job start'); + + try { + const statusModel = toolsLib.database.getModel('status'); + const status = await statusModel.findOne({ }); + if (!status?.kit?.auto_trade_config?.active) return; + + const autoTradeConfigModel = toolsLib.database.getModel('autoTradeConfig'); + const today = moment(); + const currentHour = today.hour(); + const autoTradeConfigs = await autoTradeConfigModel.findAll({ where: { active: true, trade_hour: currentHour } }); + + if (!autoTradeConfigs || autoTradeConfigs?.length === 0) return; + + const currentDay = today.day(); + const currentDate = today.date(); + + for (const autoTradeConfig of autoTradeConfigs) { + const { frequency, week_days, day_of_month, trade_hour } = autoTradeConfig; + + if (shouldExecuteTrade(frequency, week_days, currentDay, currentDate, day_of_month, trade_hour, currentHour)) { + await executeTrade(autoTradeConfig); + } + } + + } catch (err) { + loggerPlugin.error('Auto trade job error:', err.message); + } + }, { + scheduled: true, + timezone: getTimezone() + }); +}; + +const shouldExecuteTrade = (frequency, weekDays, currentDay, currentDate, dayOfMonth, tradeHour, currentHour) => { + if (currentHour !== tradeHour) { + return false; + } + + if (frequency === 'daily') { + return true; + } else if (frequency === 'weekly') { + return weekDays.includes(currentDay); + } else if (frequency === 'monthly') { + return currentDate === dayOfMonth; + } + + return false; +}; + +const executeTrade = async (autoTradeConfig) => { + const { spend_coin, buy_coin, spend_amount, user_id } = autoTradeConfig; + const symbol = `${buy_coin}-${spend_coin}`; + const side = "buy"; + const size = spend_amount; + + let hasError = false; + try { + const exchangeCoins = toolsLib.getKitCoins(); + + if (!exchangeCoins.includes(spend_coin) || !exchangeCoins.includes(buy_coin)) { + throw new Error(`Invalid trade pair: ${spend_coin}-${buy_coin}`); + } + //Balance check + const balance = await toolsLib.wallet.getUserBalanceByKitId(user_id); + if (balance[`${spend_coin}_available`] < size) { + throw new Error(`Balance insufficient for auto trade: ${symbol} size: ${size}`); + }; + + } catch (error) { + hasError = true; + loggerPlugin.error(`Auto trade execution error for user ${user_id}:`, error.message); + const user = await toolsLib.user.getUserByKitId(user_id); + sendEmail( + MAILTYPE.AUTO_TRADE_ERROR, + user.email, + { + spend_amount, + spend_coin, + buy_coin, + }, + user.settings + ); + } + + try { + const conversions = await toolsLib.getAssetsPrices([spend_coin], buy_coin, spend_amount); + + const pairInfo = toolsLib.getKitPairsConfig()[symbol]; + const decimalPoint = new BigNumber(pairInfo.increment_size).dp(); + let roundedAmount = new BigNumber(conversions[spend_coin]).decimalPlaces(decimalPoint, BigNumber.ROUND_DOWN).toNumber(); + + if (!hasError) { + await toolsLib.order.createUserOrderByKitId( + user_id, + symbol, + side, + roundedAmount, + "market", + ); + } + loggerPlugin.verbose(`Auto trade completed for user ${user_id}: ${buy_coin} -> ${spend_coin} for ${roundedAmount} ${spend_coin}`); + } catch (error) { + const adminAccount = await toolsLib.user.getUserByKitId(1); + sendEmail( + MAILTYPE.ALERT, + adminAccount.email, + { + type: 'Auto trade execution failed', + data: `Trade execution for user id ${user_id} failed, symbol: ${symbol}, side: ${side} error message ${error.message}` + }, + adminAccount.settings + ); + } + +}; + +scheduleAutoTrade(); unstakingCheckRunner(); updateRewardsCheckRunner(); referralTradesRunner(); diff --git a/server/tools/dbs/checkConfig.js b/server/tools/dbs/checkConfig.js index 8d5ca7d7bd..a31bf2a56b 100644 --- a/server/tools/dbs/checkConfig.js +++ b/server/tools/dbs/checkConfig.js @@ -62,11 +62,14 @@ Status.findOne() spread: 0 }, referral_history_config: existingKitConfigurations.referral_history_config || {}, + chain_trade_config: existingKitConfigurations.chain_trade_config || {}, coin_customizations: existingKitConfigurations.coin_customizations || {}, balance_history_config: existingKitConfigurations.balance_history_config || {}, p2p_config: existingKitConfigurations.p2p_config || {}, fiat_fees: existingKitConfigurations.fiat_fees || {}, - balance_history_config: existingKitConfigurations.balance_history_config || {} + balance_history_config: existingKitConfigurations.balance_history_config || {}, + selectable_native_currencies: existingKitConfigurations?.selectable_native_currencies || [existingKitConfigurations.native_currency || process.env.NATIVE_CURRENCY || 'usdt'], + auto_trade_config: existingKitConfigurations.auto_trade_config || {}, }; const secrets = { diff --git a/server/tools/kubernetes/helm-chart/hollaex-kit-server/templates/deployment.yaml b/server/tools/kubernetes/helm-chart/hollaex-kit-server/templates/deployment.yaml index 99df801a52..781bf551a9 100644 --- a/server/tools/kubernetes/helm-chart/hollaex-kit-server/templates/deployment.yaml +++ b/server/tools/kubernetes/helm-chart/hollaex-kit-server/templates/deployment.yaml @@ -1,3 +1,4 @@ +{{- if eq .Values.job.enable false }} apiVersion: apps/v1 kind: Deployment @@ -152,3 +153,5 @@ spec: imagePullSecrets: {{ toYaml .Values.imagePullSecrets | indent 8 }} {{- end }} + +{{- end }} \ No newline at end of file diff --git a/server/utils/hollaex-tools-lib/tools/broker.js b/server/utils/hollaex-tools-lib/tools/broker.js index 412d559829..d89e63fd7a 100644 --- a/server/utils/hollaex-tools-lib/tools/broker.js +++ b/server/utils/hollaex-tools-lib/tools/broker.js @@ -156,7 +156,7 @@ const calculateSize = (orderData, side, responseObject, symbol) => { if (incrementUnit < 1) { const decimalPoint = new BigNumber(incrementUnit).dp(); - const sourceAmount = new BigNumber(targetedAmount)?.decimalPlaces(decimalPoint, BigNumber.ROUND_DOWN)?.toNumber(); + const sourceAmount = new BigNumber(targetedAmount)?.decimalPlaces(decimalPoint)?.toNumber(); receiving_amount = sourceAmount; } else { receiving_amount = targetedAmount - (targetedAmount % incrementUnit); @@ -169,7 +169,7 @@ const calculateSize = (orderData, side, responseObject, symbol) => { if (incrementUnit < 1) { const decimalPoint = new BigNumber(incrementUnit).dp(); - const sourceAmount = new BigNumber(targetedAmount)?.decimalPlaces(decimalPoint, BigNumber.ROUND_DOWN)?.toNumber(); + const sourceAmount = new BigNumber(targetedAmount)?.decimalPlaces(decimalPoint)?.toNumber(); spending_amount = sourceAmount; } else { spending_amount = targetedAmount - (targetedAmount % incrementUnit); @@ -378,8 +378,8 @@ const testBroker = async (data) => { const decimalPoint = new BigNumber(price).dp(); return { - buy_price: new BigNumber(price * (1 - (spread / 100)))?.decimalPlaces(decimalPoint, BigNumber.ROUND_DOWN)?.toNumber(), - sell_price: new BigNumber(price * (1 + (spread / 100)))?.decimalPlaces(decimalPoint, BigNumber.ROUND_DOWN)?.toNumber() + buy_price: new BigNumber(price * (1 - (spread / 100)))?.decimalPlaces(decimalPoint)?.toNumber(), + sell_price: new BigNumber(price * (1 + (spread / 100)))?.decimalPlaces(decimalPoint)?.toNumber() }; } catch (err) { throw new Error(err); diff --git a/server/utils/hollaex-tools-lib/tools/common.js b/server/utils/hollaex-tools-lib/tools/common.js index 6f93ac17c5..ef5812c757 100644 --- a/server/utils/hollaex-tools-lib/tools/common.js +++ b/server/utils/hollaex-tools-lib/tools/common.js @@ -27,6 +27,7 @@ const { DEFAULT_FEES, BALANCE_HISTORY_SUPPORTED_PLANS, REFERRAL_HISTORY_SUPPORTED_PLANS, + AUTO_TRADE_SUPPORTED_PLANS } = require(`${SERVER_PATH}/constants`); const { COMMUNICATOR_CANNOT_UPDATE, @@ -47,7 +48,7 @@ const { checkStatus: checkExchangeStatus, getNodeLib } = require(`${SERVER_PATH} const rp = require('request-promise'); const { isEmail: isValidEmail } = require('validator'); const moment = require('moment'); -const { GET_BROKER, GET_QUICKTRADE, GET_NETWORK_QUICKTRADE } = require('../../../constants'); +const { GET_BROKER, GET_QUICKTRADE, GET_NETWORK_QUICKTRADE, GET_TRADEPATHS } = require('../../../constants'); const BigNumber = require('bignumber.js'); // const { Transform } = require('json2csv'); @@ -458,6 +459,51 @@ const joinKitConfig = (existingKitConfig = {}, newKitConfig = {}) => { throw new Error('Distributor ID required for plugin'); } } + if (newKitConfig.chain_trade_config) { + const exchangeInfo = getKitConfig().info; + + if (!REFERRAL_HISTORY_SUPPORTED_PLANS.includes(exchangeInfo.plan)) { + throw new Error('Exchange plan does not support this feature'); + } + + if (!newKitConfig.chain_trade_config.hasOwnProperty('active')) { + throw new Error('active key does not exist'); + } + + if (!newKitConfig.chain_trade_config.hasOwnProperty('source_account')) { + throw new Error('source account does not exist'); + } + + if (!newKitConfig.chain_trade_config.hasOwnProperty('currency')) { + throw new Error('currency does not exist'); + } + + if (!newKitConfig.chain_trade_config.hasOwnProperty('spread')) { + throw new Error('spread does not exist'); + } + + } + + if (newKitConfig.selectable_native_currencies) { + + for (let coin of newKitConfig.selectable_native_currencies) { + if (!subscribedToCoin(coin)) { + throw new Error('Invalid coin ' + coin); + } + } + } + + if (newKitConfig.auto_trade_config) { + const exchangeInfo = getKitConfig().info; + + if (!AUTO_TRADE_SUPPORTED_PLANS.includes(exchangeInfo.plan)) { + throw new Error('Exchange plan does not support this feature'); + } + + if (!newKitConfig.auto_trade_config.hasOwnProperty('active')) { + throw new Error('active key does not exist'); + } + } const joinedKitConfig = {}; @@ -1016,6 +1062,10 @@ const getQuickTrades = () => { return GET_QUICKTRADE(); }; +const getTradePaths = () => { + return GET_TRADEPATHS(); +}; + const getTransactionLimits = () => { return GET_TRANSACTION_LIMITS(); }; @@ -1028,6 +1078,16 @@ const getNetworkQuickTrades = () => { const parseNumber = (number, precisionValue) => { return BigNumber(number).precision(precisionValue, BigNumber.ROUND_DOWN).toNumber(); } +const removeRepeatingDecimals = (num) => { + let numStr = num.toString(); + if (numStr.includes('.') && numStr?.length > 8) { + let [integerPart, decimalPart] = numStr.split('.'); + decimalPart = decimalPart.replace(/(\d)\1{2,}$/, '$1'); + return parseFloat(`${integerPart}.${decimalPart}`); + } + + return parseFloat(num); +} module.exports = { getKitVersion, @@ -1097,5 +1157,7 @@ module.exports = { getNetworkQuickTrades, parseNumber, getQuickTradePairs, - getTransactionLimits + getTransactionLimits, + getTradePaths, + removeRepeatingDecimals }; \ No newline at end of file diff --git a/server/utils/hollaex-tools-lib/tools/order.js b/server/utils/hollaex-tools-lib/tools/order.js index 6405608444..d1b481d22a 100644 --- a/server/utils/hollaex-tools-lib/tools/order.js +++ b/server/utils/hollaex-tools-lib/tools/order.js @@ -5,20 +5,23 @@ const { SERVER_PATH } = require('../constants'); const { getModel } = require('./database/model'); const { fetchBrokerQuote, generateRandomToken, isFairPriceForBroker } = require('./broker'); const { getNodeLib } = require(`${SERVER_PATH}/init`); -const { INVALID_SYMBOL, NO_DATA_FOR_CSV, USER_NOT_FOUND, USER_NOT_REGISTERED_ON_NETWORK, TOKEN_EXPIRED, BROKER_NOT_FOUND, BROKER_PAUSED, BROKER_SIZE_EXCEED, QUICK_TRADE_ORDER_CAN_NOT_BE_FILLED, QUICK_TRADE_ORDER_CURRENT_PRICE_ERROR, QUICK_TRADE_VALUE_IS_TOO_SMALL, FAIR_PRICE_BROKER_ERROR, AMOUNT_NEGATIVE_ERROR, QUICK_TRADE_CONFIG_NOT_FOUND, QUICK_TRADE_TYPE_NOT_SUPPORTED, PRICE_NOT_FOUND, INVALID_PRICE, INVALID_SIZE, BALANCE_NOT_AVAILABLE } = require(`${SERVER_PATH}/messages`); +const { INVALID_SYMBOL, NO_DATA_FOR_CSV, USER_NOT_FOUND, USER_NOT_REGISTERED_ON_NETWORK, TOKEN_EXPIRED, BROKER_NOT_FOUND, BROKER_PAUSED, BROKER_SIZE_EXCEED, QUICK_TRADE_ORDER_CAN_NOT_BE_FILLED, QUICK_TRADE_ORDER_CURRENT_PRICE_ERROR, QUICK_TRADE_VALUE_IS_TOO_SMALL, FAIR_PRICE_BROKER_ERROR, AMOUNT_NEGATIVE_ERROR, QUICK_TRADE_CONFIG_NOT_FOUND, QUICK_TRADE_TYPE_NOT_SUPPORTED, PRICE_NOT_FOUND, INVALID_PRICE, INVALID_SIZE, BALANCE_NOT_AVAILABLE, FEATURE_NOT_ACTIVE } = require(`${SERVER_PATH}/messages`); const { parse } = require('json2csv'); const { BASE_SCOPES } = require(`${SERVER_PATH}/constants`); -const { subscribedToPair, getKitTier, getDefaultFees, getAssetsPrices, getPublicTrades, getQuickTrades, getKitPairsConfig } = require('./common'); +const { subscribedToPair, getKitTier, getDefaultFees, getAssetsPrices, getPublicTrades, getQuickTrades, getKitPairsConfig, getTradePaths, getKitConfig, getKitCoin, removeRepeatingDecimals } = require('./common'); const { reject } = require('bluebird'); const { loggerOrders } = require(`${SERVER_PATH}/config/logger`); const math = require('mathjs'); const { has } = require('lodash'); const { setPriceEssentials } = require('../../orderbook'); -const { getUserBalanceByKitId } = require('./wallet'); +const { getUserBalanceByKitId, transferAssetByKitIds } = require('./wallet'); const { verifyBearerTokenPromise, verifyHmacTokenPromise} = require('./security'); const { client } = require('./database/redis'); -const { parseNumber } = require('./common'); +const { parseNumber, getTickers } = require('./common'); const BigNumber = require('bignumber.js'); +const randomString = require('random-string'); +const { sendEmail } = require('../../../mail'); +const { MAILTYPE } = require('../../../mail/strings'); const createUserOrderByKitId = (userKitId, symbol, side, size, type, price = 0, opts = { stop: null, meta: null, additionalHeaders: null }) => { if (symbol && !subscribedToPair(symbol)) { @@ -49,7 +52,8 @@ const executeUserOrder = async (user_id, opts, token) => { if (!storedToken) { throw new Error(TOKEN_EXPIRED); } - const { symbol, price, side, size, type } = JSON.parse(storedToken); + const { symbol, price, side, size, type, chain } = JSON.parse(storedToken); + if (chain) { return executeUserChainTrade(user_id, token) }; if (size < 0) { throw new Error(INVALID_SIZE); @@ -122,7 +126,7 @@ const executeUserOrder = async (user_id, opts, token) => { return res; }; -const getUserQuickTrade = async (spending_currency, spending_amount, receiving_amount, receiving_currency, bearerToken, ip, opts, req = null) => { +const getUserQuickTrade = async (spending_currency, spending_amount, receiving_amount, receiving_currency, bearerToken, ip, opts, req = null, user) => { if (spending_amount) spending_amount = new BigNumber(spending_amount).toNumber(); if (receiving_amount) receiving_amount = new BigNumber(receiving_amount).toNumber(); @@ -144,9 +148,9 @@ const getUserQuickTrade = async (spending_currency, spending_amount, receiving_a symbol = flippedPair; side = 'buy'; } - if (!quickTradeConfig) throw new Error(QUICK_TRADE_CONFIG_NOT_FOUND); + // if (!quickTradeConfig) throw new Error(QUICK_TRADE_CONFIG_NOT_FOUND); - let userInfo = null; + let userInfo = user || null; const apiKey = req.headers['api-key']; if (apiKey && req) { @@ -351,6 +355,31 @@ const getUserQuickTrade = async (spending_currency, spending_amount, receiving_a return responseObj; } else { + let symbol = spending_amount ? `${spending_currency}-${receiving_currency}` : `${receiving_currency}-${spending_currency}`; + let size = spending_amount || receiving_amount; + let result = await getUserChainTradeQuote(bearerToken, symbol, size, ip); + + if (spending_amount == null && result?.quote_amount) { + const spendingAmount = await getUserChainTradeQuote(bearerToken, `${spending_currency}-${receiving_currency}`, result.quote_amount, ip); + result.token = spendingAmount?.token; + } + if (result?.quote_amount) { + result.spending_amount = spending_amount || result?.quote_amount; + result.receiving_amount = receiving_amount || result?.quote_amount; + result.spending_currency = spending_currency; + result.receiving_currency = receiving_currency; + + const baseCoin = getKitCoin(result.spending_currency); + const decimalPointBase = new BigNumber(baseCoin.increment_unit).dp(); + result.spending_amount = new BigNumber(result.spending_amount).decimalPlaces(decimalPointBase, BigNumber.ROUND_DOWN).toNumber(); + const quoteCoin = getKitCoin(result.receiving_currency); + const decimalPointQuote = new BigNumber(quoteCoin.increment_unit).dp(); + result.receiving_amount = new BigNumber(result.receiving_amount).decimalPlaces(decimalPointQuote, BigNumber.ROUND_DOWN).toNumber(); + const expiryDate = new Date(); + expiryDate.setSeconds(30); + result.expiry = expiryDate; + return result; + } throw new Error(QUICK_TRADE_TYPE_NOT_SUPPORTED); } }; @@ -1260,6 +1289,375 @@ const createTrade = async (order, opts = { additionalHeaders: null }) => { ); }; +const findConversionRate = (startCurrency, endCurrency, rates, visited = new Set(), initialAmount) => { + if (startCurrency === endCurrency) return { path: [startCurrency], totalRate: initialAmount, trades: [] }; + + visited.add(startCurrency); + let shortestPath = null; + + for (let [pair, { type, active, price, token }] of Object.entries(rates)) { + const [from, to] = pair.split('-'); + if (from === startCurrency && !visited.has(to)) { + const result = findConversionRate(to, endCurrency, rates, visited, initialAmount * price); + if (result) { + const currentPath = { + path: [startCurrency, ...result.path], + totalRate: result.totalRate, + trades: [ + { + symbol: `${from}-${to}`, + type, + active, + side: 'sell', + size: initialAmount, + price: price, + token + }, + ...result.trades + ] + }; + if (!shortestPath || currentPath.trades.length < shortestPath.trades.length) { + shortestPath = currentPath; + } + } + } else if (to === startCurrency && !visited.has(from)) { + const result = findConversionRate(from, endCurrency, rates, visited, initialAmount / price); + if (result) { + const currentPath = { + path: [startCurrency, ...result.path], + totalRate: result.totalRate, + trades: [ + { + symbol: `${from}-${to}`, + type, + active, + side: 'buy', + size: initialAmount / price, + price: price, + token + }, + ...result.trades + ] + }; + if (!shortestPath || currentPath.trades.length < shortestPath.trades.length) { + shortestPath = currentPath; + } + } + } + } + + visited.delete(startCurrency); + return shortestPath; +} +const getUserChainTradeQuote = async (bearerToken, symbol, size = 1, ip, id = null, network_id = null) => { + if ( + !getKitConfig().chain_trade_config || + !getKitConfig().chain_trade_config.active + ) { + throw new Error(FEATURE_NOT_ACTIVE); + } + + let user_id = id; + if (bearerToken) { + const auth = await verifyBearerTokenPromise(bearerToken, ip); + if (auth) { + user_id = auth.sub.id; + } + } + + const assets = symbol.split('-'); + const from = assets[0]; + const to = assets[1]; + //Check min values + const baseCoinInfo = getKitCoin(from); + const quoteCoinInfo = getKitCoin(to); + if (size < baseCoinInfo.min) { + throw new Error('Size too small for the rate'); + }; + + + const quickTrades = getQuickTrades(); + + let data = null; + const tickers = await getTickers(); + let prices = {}; + if (user_id) { + data = await client.getAsync(`${user_id}-${symbol}-rates`); + prices = data ? JSON.parse(data) : {}; + } + + //Find all the available prices with their types on the exchange. + if(!data) { + for (const rate of quickTrades) { + try { + if (rate.type === 'pro' && rate.active) { + prices[rate.symbol] = { type: rate.type, price: tickers[rate.symbol].open }; + } else { + const assets = rate.symbol.split('-'); + const quotePrice = await getUserQuickTrade(assets[0], 1, null, assets[1], bearerToken, ip, { additionalHeaders: null }, { headers: { 'api-key': null } }, { user_id: id, network_id }); + prices[rate.symbol] = { type: rate.type, price: quotePrice.receiving_amount, token: quotePrice?.token || null } + } + } catch (error) { + continue; + } + } + } + let hasNetworkBroker = Object.values(prices || {}).find(price => price.type === 'network'); + if (!hasNetworkBroker) + await client.setexAsync(`${user_id}-${symbol}-rates`, 25, JSON.stringify(prices)); + + const result = findConversionRate(from, to, prices, new Set(), size); + let token; + + if (result?.totalRate && result.totalRate < quoteCoinInfo.min) { + throw new Error('Size too small for the rate'); + }; + + if (result?.trades && result?.trades?.length > 3) { + throw new Error('Rate not found'); + } + + if (result?.totalRate && user_id) { + try { + for(const trade of result?.trades) { + // This is for getting the right token for network brokers, because we obtained the size for the trade so we need to get a new token with the updated size + if (trade.type === 'network') { + const assets = trade.symbol.split('-'); + const quotePrice = await getUserQuickTrade(assets[0], 1, null, assets[1], bearerToken, ip, { additionalHeaders: null }, { headers: { 'api-key': null } }, { user_id: id, network_id }); + trade.token = quotePrice?.token || null; + } + } + + } catch (error) { + throw new Error('Rate not found!'); + } + + result.symbol = symbol; + result.size = size; + result.price = result?.totalRate / size; + result.quote_asset = to; + result.base_asset = from; + result.chain = true; + result.user_id = user_id; + token = randomString({ + length: 32, + numeric: true, + letters: true + }); + + client.setexAsync(token, 30, JSON.stringify(result)); + } + + return { token, quote_amount: result?.totalRate }; +} + +const executeUserChainTrade = async (user_id, userToken) => { + if ( + !getKitConfig().chain_trade_config || + !getKitConfig().chain_trade_config.active + ) { + throw new Error(FEATURE_NOT_ACTIVE); + } + + const storedToken = await client.getAsync(userToken); + if (!storedToken) { + throw new Error(TOKEN_EXPIRED); + } + const { source_account, currency, spread } = getKitConfig()?.chain_trade_config || {}; + + const tradeInfo = JSON.parse(storedToken); + + const user = await getUserByKitId(user_id); + + if (!user) { + throw new Error(USER_NOT_FOUND); + } + + if (tradeInfo.user_id !== user.id) { + throw new Error(USER_NOT_FOUND); + } + + const sourceUser = await getUserByKitId(source_account); + + if (!sourceUser) { + throw new Error(USER_NOT_FOUND); + } + + let lastRate; + + if (tradeInfo.quote_asset !== currency) { + const initialRate = await getUserChainTradeQuote(null, `${tradeInfo.base_asset}-${currency}`, tradeInfo.size, null, sourceUser.id, sourceUser.network_id); + if (!initialRate?.token) { + throw new Error('Rate not found!'); + }; + + lastRate = await getUserChainTradeQuote(null, `${currency}-${tradeInfo.quote_asset}`, JSON.parse(await client.getAsync(initialRate.token)).totalRate, null, sourceUser.id, sourceUser.network_id); + } else { + lastRate = await getUserChainTradeQuote(null, `${tradeInfo.base_asset}-${currency}`, tradeInfo.size, null, sourceUser.id, sourceUser.network_id); + } + + if (!lastRate?.token) { + throw new Error('Rate not found!'); + }; + + const token = JSON.parse(await client.getAsync(lastRate.token)); + let successfulTrades = []; + try { + successfulTrades = await executeTrades(token, sourceUser); + } catch (error) { + throw new Error(error.message); + } + const lastTrade = successfulTrades[successfulTrades.length - 1]; + + const assets = lastTrade.symbol.split('-'); + const to = assets[0]; + + const brokerPrice = to === tradeInfo.quote_asset ? (lastTrade.size / tradeInfo.size) : ((lastTrade.size * lastTrade.price ) / tradeInfo.size); + // trade between end user and middle man account + const feeAmount = parseNumber(removeRepeatingDecimals(tradeInfo.size * ((spread || 0) / 100)), 10); + const spreadSize = parseNumber(removeRepeatingDecimals(tradeInfo.size - feeAmount), 10); + + let result; + try { + result = await getNodeLib().createBrokerTrade( + tradeInfo.symbol, + 'sell', + parseNumber(removeRepeatingDecimals(brokerPrice), 10), + spreadSize, + sourceUser.network_id, + user.network_id, + { maker: 0, taker: 0 } + ); + } catch (error) { + const admin = await getUserByKitId(1); + sendEmail( + MAILTYPE.ALERT, + admin.email, + { + type: 'Error in chain trades!', + data: `Error encountered while making the final trade between the user and the middleman account id: ${sourceUser.id}, user id: ${user.id}. Error message: ${error.message}` + }, + admin.settings + ); + throw new Error(error.message); + } + + // send the fee amount to the middle man account + try { + const baseSymbol = tradeInfo.symbol.split('-')[0]; + if (feeAmount > 0) await transferAssetByKitIds(user.id, sourceUser.id, baseSymbol, feeAmount, 'Chain trade transaction', false, { category: 'chain_trade' }); + } catch (error) { + const admin = await getUserByKitId(1); + sendEmail( + MAILTYPE.ALERT, + admin.email, + { + type: 'Error in chain trades!', + data: `Error encountered while sending the fee amount from user transaction to middleman account id: ${sourceUser.id}, user id: ${user.id}. Error message: ${error.message}` + }, + admin.settings + ); + } + try { + // get the currency amount back for the middle man account + const { token } = await getUserChainTradeQuote(null, `${tradeInfo.base_asset}-${currency}`, tradeInfo.size, null, sourceUser.id, sourceUser.network_id); + if (!token) { + throw new Error('Rate not found!'); + }; + + const sourceTradeInfo = JSON.parse(await client.getAsync(token)); + await executeTrades(sourceTradeInfo, sourceUser); + + } catch (error) { + const admin = await getUserByKitId(1); + sendEmail( + MAILTYPE.ALERT, + admin.email, + { + type: 'Error in chain trades!', + data: `Error encountered for source account id: ${sourceUser.id}. Error message: ${error.message}` + }, + admin.settings + ); + } + + return result; +} + +const executeTrades = async (tradeInfo, sourceUser) => { + const successfulTrades = []; + + for (const trade of tradeInfo?.trades) { + try { + let { symbol, price, side, size, type } = trade; + if (size < 0) { + throw new Error(INVALID_SIZE); + } + + if (price < 0) { + throw new Error(INVALID_PRICE); + } + + let res; + let currentFee = 0; + if (type === 'pro') { + const fee = size * currentFee; + size = size - fee; + + const pairInfo = getKitPairsConfig()[symbol] + const decimalPoint = new BigNumber(pairInfo.increment_size).dp(); + let roundedAmount = size; + roundedAmount = new BigNumber(size).decimalPlaces(decimalPoint, BigNumber.ROUND_DOWN).toNumber(); + + res = await createUserOrderByKitId(sourceUser.id, symbol, side, roundedAmount, 'market', 0, { + additionalHeaders: { + 'x-forwarded-for': null + } + }); + + currentFee = res?.fee_structure?.taker || 0; + } + else if (type === 'broker') { + + const brokerPair = await getModel('broker').findOne({ where: { symbol } }); + + const broker = await getUserByKitId(brokerPair.user_id); + + const tierBroker = getKitTier(broker.verification_level); + const tierUser = getKitTier(sourceUser.verification_level); + + const makerFee = tierBroker.fees.maker[symbol]; + const takerFee = tierUser.fees.taker[symbol]; + + const fee = size * currentFee; + size = size - fee; + + res = await getNodeLib().createBrokerTrade( + symbol, + side, + price, + size, + broker.network_id, + sourceUser.network_id, + { maker: makerFee, taker: takerFee } + ); + currentFee = takerFee || 0; + } + else if (type === 'network') { + const tierUser = getKitTier(sourceUser.verification_level); + const fee = tierUser.fees.taker[symbol]; + res = await getNodeLib().executeQuote(trade?.token, sourceUser.network_id, fee); + } + + successfulTrades.push(res); + } catch (error) { + throw new Error(`Error occured during trade executions. Error: ${error.message} Failed trade ${trade.symbol}, successful trades: ${successfulTrades.map(trade => trade.symbol).join(', ')}`); + } + } + + return successfulTrades; +} + module.exports = { getAllExchangeOrders, createUserOrderByKitId, @@ -1289,7 +1687,10 @@ module.exports = { executeUserOrder, dustPriceEstimate, updateQuickTradeConfig, - createTrade + createTrade, + getUserChainTradeQuote, + executeUserChainTrade, + findConversionRate // getUserTradesByKitIdStream, // getUserTradesByNetworkIdStream, // getAllTradesNetworkStream, diff --git a/server/utils/hollaex-tools-lib/tools/p2p.js b/server/utils/hollaex-tools-lib/tools/p2p.js index ad04c5225f..6aff25db5d 100644 --- a/server/utils/hollaex-tools-lib/tools/p2p.js +++ b/server/utils/hollaex-tools-lib/tools/p2p.js @@ -117,7 +117,7 @@ const fetchP2PDeals = async (opts = { } }); } else { - const p2pDeals = await client.getAsync(`p2p-deals`); + const p2pDeals = await client.getAsync(`p2p-deals${opts.user_id}`); if (p2pDeals) return JSON.parse(p2pDeals); else { @@ -138,7 +138,8 @@ const fetchP2PDeals = async (opts = { } } - await client.setexAsync(`p2p-deals`, 30, JSON.stringify(deals)); + await client.setexAsync(`p2p-deals${opts.user_id}`, 30, JSON.stringify(deals)); + return deals; } } @@ -350,6 +351,7 @@ const updateP2PDeal = async (data) => { throw new Error('Merchant id is not the same'); } }); + await client.delAsync(`p2p-deals${merchant_id}`); await getModel('p2pDeal').update({ status }, { where : { id : edited_ids }}); return { message : 'success' }; } @@ -407,6 +409,8 @@ const updateP2PDeal = async (data) => { data.status = true; }; + await client.delAsync(`p2p-deals${merchant_id}`); + return p2pDeal.update(data, { fields: [ 'merchant_id', @@ -441,7 +445,7 @@ const deleteP2PDeal = async (removed_ids, user_id) => { throw new Error(P2P_DEAL_NOT_FOUND); }; - + await client.delAsync(`p2p-deals${user_id}`); const promises = deals.map(async (deal) => { return await deal.destroy(); }); @@ -1054,15 +1058,20 @@ const updateMerchantProfile = async (data) => { const createMerchantFeedback = async (data) => { const transaction = await getModel('p2pTransaction').findOne({ where: { id: data.transaction_id } }); + const deal = await getModel('p2pDeal').findOne({ where : { id: transaction.deal_id }}); if (!transaction) { throw new Error ('no transaction found'); } - if (transaction.user_id !== data.user_id) { + if (deal.side === 'sell' && (transaction.user_id !== data.user_id && transaction.merchant_id !== data.user_id)) { throw new Error ('unauthorized'); - } + }; - const foundFeedback = await getModel('P2pMerchantsFeedback').findOne({ where: { transaction_id: data.transaction_id } }); + if (deal.side === 'buy' && (transaction.merchant_id !== data.user_id && transaction.user_id !== data.user_id)) { + throw new Error ('unauthorized'); + }; + + const foundFeedback = await getModel('P2pMerchantsFeedback').findOne({ where: { transaction_id: data.transaction_id, user_id: data.user_id } }); if (foundFeedback) { throw new Error ('you already made a feedback'); @@ -1076,7 +1085,7 @@ const createMerchantFeedback = async (data) => { throw new Error ('undefined rating'); } - data.merchant_id = transaction.merchant_id; + data.merchant_id = data.user_id === transaction.merchant_id ? transaction?.user_id : transaction.merchant_id; return getModel('P2pMerchantsFeedback').create(data, { fields: [ 'merchant_id', @@ -1091,6 +1100,7 @@ const createMerchantFeedback = async (data) => { const fetchP2PFeedbacks = async (opts = { transaction_id: null, merchant_id: null, + user_id: null, limit: null, page: null, order_by: null, @@ -1108,6 +1118,7 @@ const fetchP2PFeedbacks = async (opts = { created_at: timeframe, ...(opts.transaction_id && { transaction_id: opts.transaction_id }), ...(opts.merchant_id && { merchant_id: opts.merchant_id }), + ...(opts.user_id && { user_id: opts.user_id }), }, order: [ordering], ...(!opts.format && pagination), diff --git a/server/utils/hollaex-tools-lib/tools/user.js b/server/utils/hollaex-tools-lib/tools/user.js index e0d47cd531..0bc5a20917 100644 --- a/server/utils/hollaex-tools-lib/tools/user.js +++ b/server/utils/hollaex-tools-lib/tools/user.js @@ -91,7 +91,7 @@ const { } = require(`${SERVER_PATH}/constants`); const { sendEmail } = require(`${SERVER_PATH}/mail`); const { MAILTYPE } = require(`${SERVER_PATH}/mail/strings`); -const { getKitConfig, isValidTierLevel, getKitTier, isDatetime, getKitSecrets, sendCustomEmail, emailHtmlBoilerplate, getDomain, updateKitConfigSecrets, sleep, getKitCoins } = require('./common'); +const { getKitConfig, isValidTierLevel, getKitTier, isDatetime, getAssetsPrices, getKitSecrets, sendCustomEmail, emailHtmlBoilerplate, getDomain, updateKitConfigSecrets, sleep, getKitCoins, getKitCoin } = require('./common'); const { isValidPassword, createSession } = require('./security'); const { getNodeLib } = require(`${SERVER_PATH}/init`); const { all, reject } = require('bluebird'); @@ -253,6 +253,7 @@ const createUser = ( role: 'user', id: null, email_verified: false, + referral: null, additionalHeaders: null } ) => { @@ -312,6 +313,10 @@ const createUser = ( }); }) .then((user) => { + if (opts.referral && isString(opts.referral)) { + checkAffiliation(opts.referral, user.id); + } + return all([ user ]); @@ -2267,7 +2272,7 @@ const revokeAllUserSessions = async (userId) => { return true; }; -const deleteKitUser = async (userId) => { +const deleteKitUser = async (userId, sendEmail = true) => { const user = await dbQuery.findOne('user', { where: { id: userId @@ -2290,12 +2295,14 @@ const deleteKitUser = async (userId) => { { fields: ['email', 'activated'], returning: true } ); - sendEmail( - MAILTYPE.USER_DELETED, - userEmail, - {}, - user.settings - ); + if (sendEmail) { + sendEmail( + MAILTYPE.USER_DELETED, + userEmail, + {}, + user.settings + ); + } return updatedUser; }; @@ -2418,7 +2425,28 @@ const addAmounts = (amount1, amount2) => { ) ); }; +const sortTopVolumes = (volumeData, topN = 4) => { + const topSortedVolumes = {}; + + for (const period in volumeData) { + const periodData = volumeData[period]; + + if (Object.keys(periodData).length > 0) { + topSortedVolumes[period] = Object.entries(periodData) + .sort(([, valueA], [, valueB]) => valueB - valueA) + .slice(0, topN) + .map(([key, value]) => ({ [key]: value })); + } + } + + return topSortedVolumes; +}; +const multiplyAmounts = (x, y) => { + return mathjs.number( + mathjs.multiply(mathjs.bignumber(x), mathjs.bignumber(y)) + ); +}; const getUserReferralCodes = async ( opts = { @@ -2842,6 +2870,11 @@ const settleFees = async (user_id) => { throw new Error('Total unrealized earned fees are too small to be converted to realized earnings'); } + const coinConfiguration = getKitCoin(nativeCurrency); + const { increment_unit } = coinConfiguration; + const decimalPoint = new BigNumber(increment_unit).dp(); + totalValue = new BigNumber(totalValue).decimalPlaces(decimalPoint, BigNumber.ROUND_DOWN).toNumber(); + if (distributor.balance[`${nativeCurrency}_available`] < totalValue) { // send email to admin for insufficient balance sendEmail( @@ -3455,6 +3488,320 @@ const deletePaymentDetail = async (id, user_id) => { }; +const getOracleIndex = async () => { + const coins = getKitCoins(); + const data = await getAssetsPrices( + coins, + getKitConfig().native_currency + ); + + return data; +}; + + +const fetchUserTradingVolume = async (user_id, opts = { + to: null, + from: null +}) => { + + let { to, from } = opts; + const currentTime = moment().seconds(0).milliseconds(0).toISOString(); + + const { getAllUserTradesByKitId } = require('./order'); + + if(from && to) { + let volume = {}; + + const oracleIndex = await getOracleIndex(); + + const trades = await getAllUserTradesByKitId( + user_id, + null, + null, + null, + null, + null, + from, + to, + 'all' + ); + + if (trades.data && trades.data.length > 0) { + for (const trade of trades.data) { + const { symbol } = trade; + let size = trade.size; + + const basePair = symbol.split('-')[0]; + + if (basePair !== getKitConfig().native_currency) { + if (!isNumber(oracleIndex[basePair]) || oracleIndex[basePair] <= 0) { + continue; + } + size = multiplyAmounts(oracleIndex[basePair], size); + } + volume[basePair] = addAmounts(volume[basePair] || 0, size); + } + } + + return { user_id, volume }; + } else { + const data = await client.getAsync(`${user_id}-asset-volumes`); + if(data) return JSON.parse(data); + let volume = { + 1: {}, + 7: {}, + 30: {}, + 90: {}, + }; + + let volumeNative = { + 1: {}, + 7: {}, + 30: {}, + 90: {}, + }; + + const to = moment(currentTime).toISOString(); + const from90Days = moment(currentTime).subtract(90, 'days').toISOString(); + + const oracleIndex = await getOracleIndex(); + const trades = await getAllUserTradesByKitId( + user_id, + null, + null, + null, + null, + null, + from90Days, + to, + 'all' + ); + + if (trades.data && trades.data.length > 0) { + for (const trade of trades.data) { + const { symbol, timestamp } = trade; + let size = trade.size; + let nativeSize = trade.size; + const basePair = symbol.split('-')[0]; + + if (basePair !== getKitConfig().native_currency) { + if (!isNumber(oracleIndex[basePair]) || oracleIndex[basePair] <= 0) { + continue; + } + size = multiplyAmounts(oracleIndex[basePair], size); + } + + const tradeDate = moment(timestamp); + const daysDiff = moment(currentTime).diff(tradeDate, 'days'); + + if (daysDiff <= 1) { + volume[1][basePair] = addAmounts(volume[1][basePair] || 0, size); + volumeNative[1][basePair] = addAmounts(volumeNative[1][basePair] || 0, nativeSize); + } + if (daysDiff <= 7) { + volume[7][basePair] = addAmounts(volume[7][basePair] || 0, size); + volumeNative[7][basePair] = addAmounts(volumeNative[7][basePair] || 0, nativeSize); + } + if (daysDiff <= 30) { + volume[30][basePair] = addAmounts(volume[30][basePair] || 0, size); + volumeNative[30][basePair] = addAmounts(volumeNative[30][basePair] || 0, nativeSize); + } + volume[90][basePair] = addAmounts(volume[90][basePair] || 0, size); + volumeNative[90][basePair] = addAmounts(volumeNative[90][basePair] || 0, nativeSize); + } + } + + for (const period in volume) { + const periodData = volume[period]; + let totalGain = 0; + + for(const coin in periodData) { + totalGain += periodData[coin]; + } + + volume[period].total = totalGain; + } + + const sortedVolumes = sortTopVolumes(volume); + + await client.setexAsync(`${user_id}-asset-volumes`, 60 * 60 * 2, JSON.stringify({ user_id, volume: sortedVolumes, volumeNative })); + + return { user_id, volume: sortedVolumes, volumeNative }; + + } + + +}; +const fetchUserAutoTrades = async (user_id, opts = { + limit: null, + page: null, + order_by: null, + order: null, + start_date: null, + end_date: null, + active: null +}) => { + + const pagination = paginationQuery(opts.limit, opts.page); + const ordering = orderingQuery(opts.order_by, opts.order); + const timeframe = timeframeQuery(opts.start_date, opts.end_date); + + const query = { + where: { + created_at: timeframe, + user_id, + ...(opts.active != null && { active: opts.active }) + }, + order: [ordering], + ...pagination + }; + + return dbQuery.findAndCountAllWithRows('AutoTradeConfig', query); +}; + +const createUserAutoTrade = async (user_id, { + spend_coin, + buy_coin, + spend_amount, + frequency, + week_days, + day_of_month, + trade_hour, + active, + description +}) => { + + if (!subscribedToCoin(buy_coin)) { + throw new Error('Invalid coin ' + buy_coin); + } + + if (!subscribedToCoin(spend_coin)) { + throw new Error('Invalid coin ' + spend_coin); + } + + if (week_days && !week_days.every(day => day >= 0 && day <= 6)) { + throw new Error('invalid week_days'); + } + + const daysInMonth = moment().daysInMonth(); + if (day_of_month && (day_of_month < 1 || day_of_month > daysInMonth)) { + throw new Error(`Iinvalid day_of_month`); + } + + if (trade_hour < 0 || trade_hour > 23) { + throw new Error('invalid trade_hour'); + } + const autoTradeModel = getModel('AutoTradeConfig'); + + const userAutoTrades = await autoTradeModel.findAll({ where: { user_id } }); + if (userAutoTrades?.length > 20) { + throw new Error("You can't have more than 20 auto trades"); + } + + const { getUserBalanceByKitId } = require('./wallet'); + const balance = await getUserBalanceByKitId(user_id); + if (balance[`${buy_coin}_available`] < spend_amount) { + throw new Error(`Balance insufficient for auto trade: ${buy_coin} size: ${size}`); + }; + + return autoTradeModel.create({ + user_id, + spend_coin, + buy_coin, + spend_amount, + frequency, + week_days, + day_of_month, + trade_hour, + active, + description + }); +}; + +const updateUserAutoTrade = async (user_id, { + id, + spend_coin, + buy_coin, + spend_amount, + frequency, + week_days, + day_of_month, + trade_hour, + active, + description +}) => { + + if (!subscribedToCoin(buy_coin)) { + throw new Error('Invalid coin ' + buy_coin); + } + + if (!subscribedToCoin(spend_coin)) { + throw new Error('Invalid coin ' + spend_coin); + } + + if (week_days && !week_days.every(day => day >= 0 && day <= 6)) { + throw new Error('invalid week_days'); + } + + const daysInMonth = moment().daysInMonth(); + if (day_of_month && (day_of_month < 1 || day_of_month > daysInMonth)) { + throw new Error(`invalid day_of_month`); + } + + if (trade_hour < 0 || trade_hour > 23) { + throw new Error('invalid trade_hour'); + } + + const trade = await getModel('AutoTradeConfig').findOne({ + where: { + id, + user_id + } + }); + + if (!trade) { + throw new Error('Auto trade not found'); + } + + const { getUserBalanceByKitId } = require('./wallet'); + const balance = await getUserBalanceByKitId(user_id); + if (balance[`${buy_coin}_available`] < spend_amount) { + throw new Error(`Balance insufficient for auto trade: ${buy_coin} size: ${size}`); + }; + + return await trade.update({ + spend_coin, + buy_coin, + spend_amount, + frequency, + week_days, + day_of_month, + trade_hour, + active, + description + }); +}; + +const deleteUserAutoTrade = async (removed_ids, user_id) => { + const trades = await getModel('AutoTradeConfig').findAll({ + where: { + id: removed_ids, + user_id + } + }); + + if (trades?.length === 0) { + throw new Error('Auto trade not found'); + } + + const promises = trades.map(async (trade) => { + return await trade.destroy(); + }); + + const results = await Promise.all(promises); + return results; +}; + module.exports = { loginUser, getUserTier, @@ -3529,10 +3876,15 @@ module.exports = { createUnrealizedReferralFees, getUserReferralCodes, createUserReferralCode, + fetchUserTradingVolume, updateUserAddresses, fetchUserAddressBook, getPaymentDetails, createPaymentDetail, updatePaymentDetail, - deletePaymentDetail + deletePaymentDetail, + fetchUserAutoTrades, + createUserAutoTrade, + updateUserAutoTrade, + deleteUserAutoTrade }; diff --git a/server/ws/chat/index.js b/server/ws/chat/index.js index 6fbe021e0f..4a71a6ed4a 100644 --- a/server/ws/chat/index.js +++ b/server/ws/chat/index.js @@ -114,15 +114,17 @@ const publishChatMessage = (event, data) => { }; const publishP2PChatMessage = (event, data) => { - each(getChannels()[WEBSOCKET_CHANNEL('p2pChat', data.receiver_id)], (ws) => { - if (ws.readyState === WebSocket.OPEN) { - ws.send(JSON.stringify({ - topic: `p2pChat`, - action: event, - data - })); - } - }); + if (data.receiver_id) { + each(getChannels()[WEBSOCKET_CHANNEL('p2pChat', data.receiver_id)], (ws) => { + if (ws.readyState === WebSocket.OPEN) { + ws.send(JSON.stringify({ + topic: `p2pChat`, + action: event, + data + })); + } + }); + }; }; const maintenanceMessageList = debounce(() => { diff --git a/server/ws/sub.js b/server/ws/sub.js index c9c0ab6a10..d501bb3715 100644 --- a/server/ws/sub.js +++ b/server/ws/sub.js @@ -175,7 +175,6 @@ const terminateTopic = (topic, ws, symbol) => { ws.send(JSON.stringify({ message: `Unsubscribed from channel ${topic}:${ws.auth.sub.id}` })); break; case 'p2pChat': - removeSubscriber(WEBSOCKET_CHANNEL(topic, symbol), ws); removeSubscriber(WEBSOCKET_CHANNEL(topic, ws.auth.sub.id), ws); ws.send(JSON.stringify({ message: `Unsubscribed from channel ${topic}:${ws.auth.sub.id}` })); break; diff --git a/version b/version index 3ca2c9b2cc..fb2c0766b7 100644 --- a/version +++ b/version @@ -1 +1 @@ -2.12.0 \ No newline at end of file +2.13.0 diff --git a/web/.env b/web/.env index 3ac4476533..7dd44ef30a 100644 --- a/web/.env +++ b/web/.env @@ -3,6 +3,7 @@ NODE_ENV=production REACT_APP_PUBLIC_URL=http://yourdomain.com REACT_APP_SERVER_ENDPOINT=http://localhost/api +REACT_APP_STREAM_ENDPOINT= REACT_APP_NETWORK=mainnet diff --git a/web/craco.config.js b/web/craco.config.js index ec94539393..1e5ef55124 100644 --- a/web/craco.config.js +++ b/web/craco.config.js @@ -59,6 +59,21 @@ module.exports = function () { ...webpackConfig.optimization.splitChunks, chunks: 'all', cacheGroups, + // minSize: 20000, + // maxSize: 100000, + // automaticNameDelimiter: '_', + // cacheGroups: { + // vendors: { + // test: /[\\/]node_modules[\\/]/, + // name: 'vendors', + // chunks: 'all', + // }, + // default: { + // minChunks: 2, + // priority: -20, + // reuseExistingChunk: true, + // }, + // }, }; return webpackConfig; }, diff --git a/web/package-lock.json b/web/package-lock.json index b6d23b79d3..535ea0ce09 100644 --- a/web/package-lock.json +++ b/web/package-lock.json @@ -1,6 +1,6 @@ { "name": "hollaex-kit", - "version": "2.11.4", + "version": "2.12.1", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/web/package.json b/web/package.json index e14387a94e..a70e5ce5fd 100644 --- a/web/package.json +++ b/web/package.json @@ -1,6 +1,6 @@ { "name": "hollaex-kit", - "version": "2.12.0", + "version": "2.13.0", "private": true, "dependencies": { "@ant-design/compatible": "1.0.5", @@ -59,6 +59,7 @@ "react-ga": "2.5.7", "react-grid-layout": "1.3.0", "react-helmet": "6.0.0", + "react-loadable": "5.5.0", "react-localization": "0.1.10", "react-modal": "3.8.1", "react-moment": "0.9.2", diff --git a/web/public/assets/images/2fa-option-icon.svg b/web/public/assets/images/2fa-option-icon.svg new file mode 100644 index 0000000000..c948443dee --- /dev/null +++ b/web/public/assets/images/2fa-option-icon.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/web/public/assets/images/address-option-icon.svg b/web/public/assets/images/address-option-icon.svg new file mode 100644 index 0000000000..7f77a8f0d0 --- /dev/null +++ b/web/public/assets/images/address-option-icon.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/web/public/assets/images/api-option-icon.svg b/web/public/assets/images/api-option-icon.svg new file mode 100644 index 0000000000..ecf186378a --- /dev/null +++ b/web/public/assets/images/api-option-icon.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/web/public/assets/images/arrow-down-loser.svg b/web/public/assets/images/arrow-down-loser.svg new file mode 100644 index 0000000000..10c7bae757 --- /dev/null +++ b/web/public/assets/images/arrow-down-loser.svg @@ -0,0 +1,4 @@ + + + + diff --git a/web/public/assets/images/asset-option-icon.svg b/web/public/assets/images/asset-option-icon.svg new file mode 100644 index 0000000000..e9f665e332 --- /dev/null +++ b/web/public/assets/images/asset-option-icon.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/web/public/assets/images/audio-option-icon.svg b/web/public/assets/images/audio-option-icon.svg new file mode 100644 index 0000000000..d978aeac1f --- /dev/null +++ b/web/public/assets/images/audio-option-icon.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/web/public/assets/images/bank-option-icon.svg b/web/public/assets/images/bank-option-icon.svg new file mode 100644 index 0000000000..c159fd073b --- /dev/null +++ b/web/public/assets/images/bank-option-icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/web/public/assets/images/buy-crypto-option.svg b/web/public/assets/images/buy-crypto-option.svg new file mode 100644 index 0000000000..6644b4e231 --- /dev/null +++ b/web/public/assets/images/buy-crypto-option.svg @@ -0,0 +1,3 @@ + + + diff --git a/web/public/assets/images/cefi-stake.svg b/web/public/assets/images/cefi-stake.svg new file mode 100644 index 0000000000..34e7bc25c2 --- /dev/null +++ b/web/public/assets/images/cefi-stake.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/web/public/assets/images/chat-icon-p2p-02.svg b/web/public/assets/images/chat-icon-p2p-02.svg new file mode 100644 index 0000000000..642950786f --- /dev/null +++ b/web/public/assets/images/chat-icon-p2p-02.svg @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/web/public/assets/images/convert.svg b/web/public/assets/images/convert.svg new file mode 100644 index 0000000000..ea593d3eec --- /dev/null +++ b/web/public/assets/images/convert.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/web/public/assets/images/defi-stake.svg b/web/public/assets/images/defi-stake.svg new file mode 100644 index 0000000000..cc560f2104 --- /dev/null +++ b/web/public/assets/images/defi-stake.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/web/public/assets/images/deposit-hot.svg b/web/public/assets/images/deposit-hot.svg new file mode 100644 index 0000000000..de787b23c9 --- /dev/null +++ b/web/public/assets/images/deposit-hot.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/web/public/assets/images/email-option-icon.svg b/web/public/assets/images/email-option-icon.svg new file mode 100644 index 0000000000..db156ce312 --- /dev/null +++ b/web/public/assets/images/email-option-icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/web/public/assets/images/fees-option-icon.svg b/web/public/assets/images/fees-option-icon.svg new file mode 100644 index 0000000000..ddfd27999a --- /dev/null +++ b/web/public/assets/images/fees-option-icon.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/web/public/assets/images/fire-emoji.svg b/web/public/assets/images/fire-emoji.svg new file mode 100644 index 0000000000..528eeaf7ec --- /dev/null +++ b/web/public/assets/images/fire-emoji.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/web/public/assets/images/gainer-arrow-up.svg b/web/public/assets/images/gainer-arrow-up.svg new file mode 100644 index 0000000000..989c9a2234 --- /dev/null +++ b/web/public/assets/images/gainer-arrow-up.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/web/public/assets/images/help-bubble.svg b/web/public/assets/images/help-bubble.svg new file mode 100644 index 0000000000..3b7cec6102 --- /dev/null +++ b/web/public/assets/images/help-bubble.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/web/public/assets/images/history-option-icon.svg b/web/public/assets/images/history-option-icon.svg new file mode 100644 index 0000000000..b0eeb3f7d7 --- /dev/null +++ b/web/public/assets/images/history-option-icon.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/web/public/assets/images/identity-option-icon.svg b/web/public/assets/images/identity-option-icon.svg new file mode 100644 index 0000000000..8d5ec722fa --- /dev/null +++ b/web/public/assets/images/identity-option-icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/web/public/assets/images/interface-option-icon.svg b/web/public/assets/images/interface-option-icon.svg new file mode 100644 index 0000000000..473f296b2d --- /dev/null +++ b/web/public/assets/images/interface-option-icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/web/public/assets/images/language-option-icon.svg b/web/public/assets/images/language-option-icon.svg new file mode 100644 index 0000000000..94c10e4945 --- /dev/null +++ b/web/public/assets/images/language-option-icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/web/public/assets/images/limits-option-icon.svg b/web/public/assets/images/limits-option-icon.svg new file mode 100644 index 0000000000..7b4bf4e689 --- /dev/null +++ b/web/public/assets/images/limits-option-icon.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/web/public/assets/images/login-option-icon.svg b/web/public/assets/images/login-option-icon.svg new file mode 100644 index 0000000000..864a61c09c --- /dev/null +++ b/web/public/assets/images/login-option-icon.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/web/public/assets/images/new-coin-bolt.svg b/web/public/assets/images/new-coin-bolt.svg new file mode 100644 index 0000000000..197352afec --- /dev/null +++ b/web/public/assets/images/new-coin-bolt.svg @@ -0,0 +1,3 @@ + + + diff --git a/web/public/assets/images/no-icon-drop-down-icon.svg b/web/public/assets/images/no-icon-drop-down-icon.svg new file mode 100644 index 0000000000..2377af08b1 --- /dev/null +++ b/web/public/assets/images/no-icon-drop-down-icon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/web/public/assets/images/notification-option-icon.svg b/web/public/assets/images/notification-option-icon.svg new file mode 100644 index 0000000000..bd429835e9 --- /dev/null +++ b/web/public/assets/images/notification-option-icon.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/web/public/assets/images/onramper.svg b/web/public/assets/images/onramper.svg new file mode 100644 index 0000000000..d66aacc911 --- /dev/null +++ b/web/public/assets/images/onramper.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/web/public/assets/images/p2p-option-icon.svg b/web/public/assets/images/p2p-option-icon.svg new file mode 100644 index 0000000000..333a735ea2 --- /dev/null +++ b/web/public/assets/images/p2p-option-icon.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/web/public/assets/images/password-option-icon.svg b/web/public/assets/images/password-option-icon.svg new file mode 100644 index 0000000000..7b5ff0d5db --- /dev/null +++ b/web/public/assets/images/password-option-icon.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/web/public/assets/images/phone-option-icon.svg b/web/public/assets/images/phone-option-icon.svg new file mode 100644 index 0000000000..be8eff27cc --- /dev/null +++ b/web/public/assets/images/phone-option-icon.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/web/public/assets/images/ping-connection-check.svg b/web/public/assets/images/ping-connection-check.svg new file mode 100644 index 0000000000..bef665bb22 --- /dev/null +++ b/web/public/assets/images/ping-connection-check.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/web/public/assets/images/profit-loss-option-icon.svg b/web/public/assets/images/profit-loss-option-icon.svg new file mode 100644 index 0000000000..e67f8aa66f --- /dev/null +++ b/web/public/assets/images/profit-loss-option-icon.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/web/public/assets/images/referral-gift.svg b/web/public/assets/images/referral-gift.svg new file mode 100644 index 0000000000..9a4d177b46 --- /dev/null +++ b/web/public/assets/images/referral-gift.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/web/public/assets/images/session-option-icon.svg b/web/public/assets/images/session-option-icon.svg new file mode 100644 index 0000000000..56693d06a9 --- /dev/null +++ b/web/public/assets/images/session-option-icon.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/web/public/assets/images/trade-hot.svg b/web/public/assets/images/trade-hot.svg new file mode 100644 index 0000000000..8b1410a005 --- /dev/null +++ b/web/public/assets/images/trade-hot.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/web/public/assets/images/volume-option-icon.svg b/web/public/assets/images/volume-option-icon.svg new file mode 100644 index 0000000000..41660654c4 --- /dev/null +++ b/web/public/assets/images/volume-option-icon.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/web/public/assets/images/wallet-option-icon.svg b/web/public/assets/images/wallet-option-icon.svg new file mode 100644 index 0000000000..d88f605a14 --- /dev/null +++ b/web/public/assets/images/wallet-option-icon.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/web/public/assets/images/withdraw-option-icon.svg b/web/public/assets/images/withdraw-option-icon.svg new file mode 100644 index 0000000000..4ccc75efde --- /dev/null +++ b/web/public/assets/images/withdraw-option-icon.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/web/src/_common.scss b/web/src/_common.scss index 0dd66bf6cc..25b1a28b22 100644 --- a/web/src/_common.scss +++ b/web/src/_common.scss @@ -312,7 +312,7 @@ table th { } .important-text { - color: $colors-main-black; + color: $colors-main-black !important; } .secondary-text { @@ -372,3 +372,19 @@ table th { border-top: $colors-notifications-red 4px solid; background-color: $calculated_specials_notifications-alerts-pale; } + +.fs-12 { + font-size: 12px; +} + +.fs-16 { + font-size: 16px; +} + +.fs-24 { + font-size: 24px; +} + +.text-decoration-underline { + text-decoration: underline; +} diff --git a/web/src/actions/appActions.js b/web/src/actions/appActions.js index 7e1d8f94f9..0220307c70 100644 --- a/web/src/actions/appActions.js +++ b/web/src/actions/appActions.js @@ -113,6 +113,13 @@ export const SET_SELECTED_METHOD = 'SET_SELECTED_METHOD'; export const SET_RECEIVER_EMAIL = 'SET_RECEIVER_EMAIL'; export const SET_WITHDRAW_OTIONAL_TAG = 'SET_WITHDRAW_OTIONAL_TAG'; export const SET_CHART_DATA = 'SET_CHART_DATA'; +export const SET_COINS_DATA = 'SET_COINS_DATA'; +export const SET_STAKE = 'SET_STAKE'; +export const SET_LIMITS_TAB = 'SET_LIMITS_TAB'; +export const SET_SECURITY_TAB = 'SET_SECURITY_TAB'; +export const SET_VERIFICATION_TAB = 'SET_VERIFICATION_TAB'; +export const SET_SETTINGS_TAB = 'SET_SETTINGS_TAB'; +export const SET_ACTIVE_CHAT = 'SET_ACTIVE_CHAT'; export const SORT = { VOL: 'volume', @@ -767,3 +774,38 @@ export const setWithdrawOptionaltag = (tag) => ({ type: SET_WITHDRAW_OTIONAL_TAG, payload: tag, }); + +export const setCoinsData = (coinsData) => ({ + type: SET_COINS_DATA, + payload: coinsData, +}); + +export const setStake = (selectedStake) => ({ + type: SET_STAKE, + payload: selectedStake, +}); + +export const setLimitTab = (selectedTab) => ({ + type: SET_LIMITS_TAB, + payload: selectedTab, +}); + +export const setSecurityTab = (selectedSecurityTab) => ({ + type: SET_SECURITY_TAB, + payload: selectedSecurityTab, +}); + +export const setVerificationTab = (selectedVerificationTab) => ({ + type: SET_VERIFICATION_TAB, + payload: selectedVerificationTab, +}); + +export const setSettingsTab = (selectedSettingsTab) => ({ + type: SET_SETTINGS_TAB, + payload: selectedSettingsTab, +}); + +export const setIsChat = (setIsChat) => ({ + type: SET_ACTIVE_CHAT, + payload: setIsChat, +}); diff --git a/web/src/actions/walletActions.js b/web/src/actions/walletActions.js index 2b0aa56081..fadedcf4f9 100644 --- a/web/src/actions/walletActions.js +++ b/web/src/actions/walletActions.js @@ -476,3 +476,8 @@ export const setActiveBalanceHistory = (activeBalanceHistory) => ({ activeBalanceHistory, }, }); + +export const setScannedAddress = (address) => ({ + type: 'SETSCANNEDADDRESS', + payload: address, +}); diff --git a/web/src/components/ActionNotification/index.js b/web/src/components/ActionNotification/index.js index 905311c14b..1abba3ad1e 100644 --- a/web/src/components/ActionNotification/index.js +++ b/web/src/components/ActionNotification/index.js @@ -81,16 +81,17 @@ const ActionNotification = ({ {text} )} - {isMobile && text === 'Check deposit status' && ( -
- {text} -
- )} + {isMobile && + (text === 'Check deposit status' || text === 'Need help?') && ( +
+ {text} +
+ )} { + const [isIconActive, setIsIconActive] = useState(false); + const [isToolTipVisible, setIsToolTipVisible] = useState(false); + + const totalPending = securityPending + verificationPending; + + const onHandleRedirect = (path = '/') => { + setIsToolTipVisible(false); + setIsIconActive(false); + browserHistory.push(path); + }; + + return ( + + } + placement="bottomRight" + overlayClassName="navigation-bar-wrapper account-tab-dropdown" + onVisibleChange={() => { + setIsIconActive(!isIconActive); + setIsToolTipVisible(!isToolTipVisible); + }} + mouseEnterDelay={0} + > +
onHandleRedirect('/summary')} + > +
+ + {!!totalPending && ( +
{totalPending}
+ )} +
+ + {STRINGS['ACCOUNT_TEXT']} + + + {!isIconActive ? : } + +
+
+ ); +}; + +const AccountList = ({ + config_level, + verification_level, + user, + Icons, + securityPending, + verificationPending, + setIsIconActive, + setIsToolTipVisible, + setSecurityTab, + setSettingsTab, + onHandleRedirect, +}) => { + const [isHelpResources, setIsHelpResources] = useState(false); + const [currPath, setCurrpath] = useState('/summary'); + + useEffect(() => { + const getCurrPage = window.location.pathname; + setCurrpath(getCurrPage); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [window.location.pathname]); + + const accountOptions = [ + { + icon: 'OPTION_2FA_ICON', + title: 'ACCOUNTS.TAB_SECURITY', + description: 'DESKTOP_NAVIGATION.SECURITY_DESC', + path: '/security', + isDisplay: true, + }, + { + icon: 'IDENTITY_OPTION_ICON', + title: 'ACCOUNTS.TAB_VERIFICATION', + description: 'DESKTOP_NAVIGATION.VERIFICATION_DESC', + path: '/verification', + isDisplay: true, + }, + { + icon: 'PASSWORD_OPTION_ICON', + title: 'ACCOUNTS.TAB_SETTINGS', + description: 'DESKTOP_NAVIGATION.SETTINGS_DESC', + path: '/settings', + isDisplay: true, + }, + ]; + + const optionsRoute = [ + { + icon: 'REVOKE_SESSION', + title: 'ACCOUNTS.TAB_SIGNOUT', + toolTipText: 'DESKTOP_NAVIGATION.SIGNOUT_DESC', + path: '/login', + }, + { + icon: 'API_OPTION_ICON', + title: 'MORE_OPTIONS_LABEL.ICONS.API', + toolTipText: 'DESKTOP_NAVIGATION.API_DESC', + path: '/security?apiKeys', + }, + { + icon: 'LANGUAGE_OPTION_ICON', + title: 'USER_SETTINGS.TITLE_LANGUAGE', + toolTipText: 'DESKTOP_NAVIGATION.LANGUAGE_DESC', + path: '/settings?language', + }, + { + icon: 'HELP_OPTION_ICON', + title: 'LOGIN.HELP', + toolTipText: 'DESKTOP_NAVIGATION.HELP_DESC', + path: browserHistory?.getCurrentLocation(), + }, + { + icon: 'HISTORY_OPTION_ICON', + title: 'ACCOUNTS.TAB_HISTORY', + toolTipText: 'DESKTOP_NAVIGATION.TRANSACTION_DESC', + path: '/transactions', + }, + ]; + + const renderHelpResource = () => { + return ( + setIsHelpResources(false)} + > + setIsHelpResources(false)} + onClose={() => setIsHelpResources(false)} + /> + + ); + }; + + const onHandleRoutes = (value = '/', title = '') => { + const selectedTab = { + 'LOGIN.HELP': () => setIsHelpResources(true), + 'ACCOUNTS.TAB_SIGNOUT': () => removeToken(), + 'ACCOUNTS.TAB_SECURITY': () => setSecurityTab(0), + 'MORE_OPTIONS_LABEL.ICONS.API': () => setSecurityTab(2), + 'USER_SETTINGS.TITLE_LANGUAGE': () => setSettingsTab(2), + 'ACCOUNTS.TAB_SETTINGS': () => setSettingsTab(0), + }; + + if (selectedTab[title]) { + selectedTab[title](); + } + + setIsToolTipVisible(false); + setIsIconActive(false); + + return browserHistory?.push(value); + }; + + const userData = + config_level[ + isLoggedIn() ? verification_level : Object.keys(config_level)[0] + ] || {}; + const userAccountTitle = + userData.name || + STRINGS.formatString( + STRINGS['SUMMARY.LEVEL_OF_ACCOUNT'], + verification_level + ); + const icon = Icons[`LEVEL_ACCOUNT_ICON_${verification_level}`] + ? Icons[`LEVEL_ACCOUNT_ICON_${verification_level}`] + : Icons['LEVEL_ACCOUNT_ICON_4']; + + return ( +
+ {isHelpResources && renderHelpResource()} +
+ + onHandleRedirect('/fees-and-limits')} + > + {userAccountTitle} + + ({user?.email}) +
+ {accountOptions?.map((options) => { + return ( + options?.isDisplay && ( +
onHandleRoutes(options?.path, options?.title)} + > + +
+
+ + {STRINGS[options?.title]} + + {!!securityPending && + options?.title === 'ACCOUNTS.TAB_SECURITY' && ( +
+ {securityPending} +
+ )} + {!!verificationPending && + options?.title === 'ACCOUNTS.TAB_VERIFICATION' && ( +
+ {verificationPending} +
+ )} +
+ + + {STRINGS[options?.description]} + + +
+
+ ) + ); + })} +
+ {optionsRoute?.map((option) => { + return ( + +
onHandleRoutes(option?.path, option?.title)} + > + + + {STRINGS[option?.title]} + +
+
+ ); + })} +
+
onHandleRedirect('/summary')} + > + + + {STRINGS['DESKTOP_NAVIGATION.SUMMARY_PAGE']} + + +
+
+ ); +}; + +const mapStateToProps = (state) => ({ + config_level: state.app.config_level, + verification_level: state.user.verification_level, +}); + +const mapDispatchToProps = (dispatch) => ({ + setSecurityTab: bindActionCreators(setSecurityTab, dispatch), + setSettingsTab: bindActionCreators(setSettingsTab, dispatch), +}); + +export default connect( + mapStateToProps, + mapDispatchToProps +)(withConfig(AccountTab)); diff --git a/web/src/components/AppBar/AppMenuBarItem.js b/web/src/components/AppBar/AppMenuBarItem.js index 69d95943e2..81075f7502 100644 --- a/web/src/components/AppBar/AppMenuBarItem.js +++ b/web/src/components/AppBar/AppMenuBarItem.js @@ -1,21 +1,399 @@ -import React from 'react'; +import React, { useEffect, useState } from 'react'; +import { connect } from 'react-redux'; +import { bindActionCreators } from 'redux'; +import { browserHistory } from 'react-router'; +import { Tooltip } from 'antd'; +import { CaretDownFilled, CaretUpFilled } from '@ant-design/icons'; + import classnames from 'classnames'; import STRINGS from 'config/localizedStrings'; -import { EditWrapper } from 'components'; +import withConfig from 'components/ConfigProvider/withConfig'; +import { EditWrapper, Image } from 'components'; +import { setStake } from 'actions/appActions'; +import { MarketsSelector } from 'containers/Trade/utils'; +import { setActiveBalanceHistory } from 'actions/walletActions'; + +const AppMenuBarItem = ({ + path, + isActive, + onClick, + stringId, + setSelectedStake, + features, + getMarkets, + getFavourites, + pair, + getRemoteRoutes, + icons, + setActiveBalanceHistory, + getStake, +}) => { + const summaryOptions = [ + { + icon: 'INTERFACE_OPTION_ICON', + title: 'ACCOUNT_TEXT', + title_2: 'SUMMARY.TITLE', + description: 'DESKTOP_NAVIGATION.SUMMARY_DESCRIPTION', + path: '/summary', + isDisplay: true, + }, + { + icon: 'FEES_OPTION_ICON', + title: 'FEES_AND_LIMITS.TITLE', + description: 'DESKTOP_NAVIGATION.FEES_LIMITS_DESC', + path: '/fees-and-limits', + isDisplay: true, + }, + { + icon: 'VOLUME_OPTION_ICON', + title: 'CHART_TEXTS.v', + description: 'DESKTOP_NAVIGATION.VOLUME_DESC', + path: '/wallet/volume', + isDisplay: true, + }, + ]; + + const walletOptions = [ + { + icon: 'DEPOSIT_OPTION_ICON', + title: 'SUMMARY.DEPOSIT', + description: 'DESKTOP_NAVIGATION.DEPOSIT_DESC', + path: '/wallet/deposit', + isDisplay: true, + }, + { + icon: 'WALLET_OPTION_ICON', + title: 'BALANCE_TEXT', + description: 'DESKTOP_NAVIGATION.BALANCE_DESC', + path: '/wallet', + isDisplay: true, + }, + { + icon: 'PROFIT_LOSS_OPTION_ICON', + title: 'MORE_OPTIONS_LABEL.OTHER_FUNCTIONS.PERFORMANCE', + description: 'DESKTOP_NAVIGATION.PERFORMANCE_DESC', + path: '/wallet/history', + isDisplay: true, + }, + { + icon: 'HISTORY_OPTION_ICON', + title: 'ACCOUNTS.TAB_HISTORY', + description: 'DESKTOP_NAVIGATION.HISTORY_DESC', + path: '/transactions', + isDisplay: true, + }, + { + icon: 'ADDRESS_OPTION_ICON', + title: 'MORE_OPTIONS_LABEL.OTHER_FUNCTIONS.ADDRESS_BOOK', + description: 'DESKTOP_NAVIGATION.ADDRESS_BOOK_DESC', + path: '/wallet/address-book', + isDisplay: true, + }, + { + icon: 'WITHDRAW_OPTION_ICON', + title: 'WITHDRAW_PAGE.WITHDRAW', + description: 'DESKTOP_NAVIGATION.WITHDRAW_DESC', + path: '/wallet/withdraw', + isDisplay: true, + }, + ]; + + const tradeOptions = [ + { + icon: 'ASSET_OPTION_ICON', + title: 'PRICE', + description: 'DESKTOP_NAVIGATION.ASSETS_DESC', + path: '/prices', + isDisplay: true, + }, + { + icon: 'CONVERT_OPTION_ICON', + title: 'CONVERT', + description: 'DESKTOP_NAVIGATION.CONVERT_DESC', + path: `/quick-trade/${pair}`, + isDisplay: features?.quick_trade, + }, + { + icon: 'TRADE_OPTION_ICON', + title: 'SUMMARY.MARKETS', + description: 'DESKTOP_NAVIGATION.MARKET_DESC', + path: + getFavourites && getFavourites.length + ? `/trade/${getFavourites[0]}` + : `/trade/${getMarkets[0]?.key}`, + isDisplay: features?.pro_trade, + }, + { + icon: 'P2P_OPTION_ICON', + title: 'P2P.TAB_P2P', + path: '/p2p', + description: 'MORE_OPTIONS_LABEL.OTHER_FUNCTIONS.PEER_TO_PEER', + description_2: 'DESKTOP_NAVIGATION.P2P_DESC', + isDisplay: features?.p2p, + }, + ]; + + const earnOptions = [ + { + icon: 'REFERRAL_OPTION_ICON', + title: 'SUMMARY.EARN_COMMISSION', + description: 'DESKTOP_NAVIGATION.REFERRAL_DESC', + path: '/referral', + isDisplay: features?.referral_history_config, + }, + { + icon: 'CEFI_STAKE_OPTION_ICON', + title: 'STAKE.CEFI_STAKING', + description: 'DESKTOP_NAVIGATION.CEFI_STAKE_DESC', + path: '/stake', + isDisplay: features?.cefi_stake, + }, + { + icon: 'DEFI_STAKE_OPTION_ICON', + title: 'STAKE.DEFI_STAKING', + description: 'DESKTOP_NAVIGATION.DEFI_STAKE_DESC', + path: '/stake', + isDisplay: features?.stake_page, + }, + ]; + + const othersOptions = getRemoteRoutes?.map((route, index) => ({ + ...route, + isDisplay: true, + })); + + const [isIconActive, setIsIconActive] = useState(false); + const [isToolTipVisible, setIsToolTipVisible] = useState(false); + const [isTabActive, setIsTabActive] = useState(false); + + useEffect(() => { + const tabOptions = getTabOptions(); + setIsTabActive(checkActiveTab(tabOptions)); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [window.location.pathname]); + + const checkActiveTab = (tabOptions) => { + const currentPath = window.location.pathname; + return tabOptions?.some((option) => option?.path === currentPath); + }; + + const getTabOptions = () => { + if (path === '/summary') { + return summaryOptions; + } else if (path === '/wallet') { + return walletOptions; + } else if (path === '/prices') { + return tradeOptions; + } else if (path === '/referral') { + return earnOptions; + } else { + return othersOptions; + } + }; -const AppMenuBarItem = ({ path, isActive, onClick, stringId }) => { return ( -
onClick(path)} + + } + mouseEnterDelay={0} + overlayClassName="navigation-bar-wrapper" + placement="bottomLeft" + onVisibleChange={() => { + setIsIconActive(!isIconActive); + setIsToolTipVisible(!isToolTipVisible); + }} > -
- {STRINGS[stringId]} +
onClick(path)} + > +
+ + {STRINGS[stringId] === 'Others' && getRemoteRoutes?.length > 0 ? ( + {STRINGS[stringId]} + ) : STRINGS[stringId] !== 'Others' ? ( + {STRINGS[stringId]} + ) : null} + + {STRINGS[stringId] === 'Others' && getRemoteRoutes?.length > 0 ? ( + + {!isIconActive ? : } + + ) : ( + STRINGS[stringId] !== 'Others' && ( + + {!isIconActive ? : } + + ) + )} +
+ + ); +}; + +const DesktopDropdown = ({ + setSelectedStake, + icons, + setIsIconActive, + setIsToolTipVisible, + setActiveBalanceHistory, + getTabOptions, + getStake, +}) => { + const [currPath, setCurrpath] = useState('/summary'); + const [isSelectedStake, setIsSelectedStake] = useState(); + + useEffect(() => { + const getCurrPage = window.location.pathname; + setCurrpath(getCurrPage); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [window.location.pathname]); + + useEffect(() => { + setIsSelectedStake( + getStake === 'cefi' ? 'STAKE.CEFI_STAKING' : 'STAKE.DEFI_STAKING' + ); + }, [getStake]); + + const onHandleRoutes = (text = '', value = '/') => { + setActiveBalanceHistory(false); + + const selectedTab = { + 'STAKE.CEFI_STAKING': () => { + setSelectedStake('cefi'); + setIsSelectedStake(text); + }, + 'STAKE.DEFI_STAKING': () => { + setSelectedStake('defi'); + setIsSelectedStake(text); + }, + 'MORE_OPTIONS_LABEL.OTHER_FUNCTIONS.PERFORMANCE': () => + setActiveBalanceHistory(true), + }; + + if (selectedTab[text]) { + selectedTab[text](); + } + + setIsToolTipVisible(false); + setIsIconActive(false); + return browserHistory?.push(value); + }; + + return ( +
+ {getTabOptions()?.map((options, index) => { + const isActivePath = + options?.title === 'STAKE.CEFI_STAKING' || + options?.title === 'STAKE.DEFI_STAKING' + ? isSelectedStake === options?.title && currPath === options?.path + : currPath === options?.path; + return ( + options?.isDisplay && ( +
onHandleRoutes(options?.title, options?.path)} + > + +
+ + + { + STRINGS[ + options?.title ? options?.title : options?.string_id + ] + } + + {options?.title === 'SUMMARY.EARN_COMMISSION' && ( + + )} + {options?.title_2 && ( + {STRINGS[options?.title_2]} + )} + + + + {STRINGS[options?.description]} + + {options?.description_2 && ( + + {STRINGS[options?.description_2]} + + )} + {STRINGS[options?.string_id] === 'Buy crypto' ? ( + + {STRINGS['DESKTOP_NAVIGATION.BUY_CRYPTO_DESC']} + + ) : ( + STRINGS[options?.string_id] === 'Onramper' && ( + + {STRINGS['DESKTOP_NAVIGATION.ONRAMPER_DESC']} + + ) + )} + +
+
+ ) + ); + })}
); }; -export default AppMenuBarItem; +const mapStateToProps = (state) => ({ + features: state.app.features, + getFavourites: state.app.favourites, + getMarkets: MarketsSelector(state), + pair: state.app.pair, + getRemoteRoutes: state.app.remoteRoutes, + getStake: state.app.selectedStake, +}); + +const mapDispatchToProps = (dispatch) => ({ + setSelectedStake: bindActionCreators(setStake, dispatch), + setActiveBalanceHistory: bindActionCreators( + setActiveBalanceHistory, + dispatch + ), +}); + +export default connect( + mapStateToProps, + mapDispatchToProps +)(withConfig(AppMenuBarItem)); diff --git a/web/src/components/AppBar/Connections.js b/web/src/components/AppBar/Connections.js new file mode 100644 index 0000000000..17e74ea1d8 --- /dev/null +++ b/web/src/components/AppBar/Connections.js @@ -0,0 +1,215 @@ +import React, { useCallback, useEffect, useState } from 'react'; +import { Tooltip } from 'antd'; + +import './_Connections.scss'; +import STRINGS from 'config/localizedStrings'; +import icons from 'config/icons/dark'; +import EditWrapper from 'components/EditWrapper'; +import Image from 'components/Image'; +import { getLogins } from 'actions/userAction'; +import { requestAuthenticated } from 'utils'; +import { ConnectionPopup, ReconnectPopup } from './Utils'; + +const INITIAL_LOGINS_STATE = { + count: 0, + data: [], +}; + +const Connections = () => { + const [isDisplayPopup, setIsDisplayPopup] = useState({ + isDisplayConnection: false, + isDisplayReconnect: false, + }); + const [loginDetail, setLoginDetail] = useState(INITIAL_LOGINS_STATE); + const [hasResponseData, setHasResponseData] = useState(false); + const [isLoading, setIsLoading] = useState(false); + const [toolTipKey, setToolTipKey] = useState(0); + const [pingDetails, setPingDetails] = useState({ + isDisplayPingText: true, + pingValue: null, + isDisplayPing: false, + }); + + useEffect(() => { + const fetchData = async () => { + try { + await requestLogins(); + await fetchHealthData(); + } catch (error) { + setHasResponseData(false); + console.error('Error fetching data:', error); + } + }; + + fetchData(); + //eslint-disable-next-line + }, []); + + const requestLogins = useCallback((page = 1) => { + getLogins({ page }) + .then(({ data: { count, data } }) => { + setLoginDetail((prevLogins) => ({ + count, + data: prevLogins.data.concat(data), + })); + }) + .catch((error) => { + console.error(error); + }); + }, []); + + const fetchHealthData = async () => { + setIsLoading(true); + const startTime = Date.now(); + try { + await requestAuthenticated('/health'); + setHasResponseData(true); + const duration = Date.now() - startTime; + setPingDetails((prev) => ({ + ...prev, + pingValue: duration, + })); + } catch (error) { + setHasResponseData(false); + console.error('Error fetching health data:', error); + } finally { + setIsLoading(false); + } + }; + + const onHandleClose = (value) => { + if (value === 'connection') { + setIsDisplayPopup((prev) => ({ + ...prev, + isDisplayConnection: false, + })); + } else { + setIsDisplayPopup((prev) => ({ + ...prev, + isDisplayReconnect: false, + })); + } + setPingDetails((prev) => ({ + ...prev, + isDisplayPing: false, + isDisplayPingText: true, + })); + setToolTipKey(0); + }; + + const onHandleConnection = () => { + if (hasResponseData) { + setToolTipKey(toolTipKey + 1); + setIsDisplayPopup((prev) => ({ + ...prev, + isDisplayConnection: true, + })); + fetchHealthData(); + } else { + setToolTipKey(toolTipKey + 1); + setIsDisplayPopup((prev) => ({ + ...prev, + isDisplayReconnect: true, + })); + } + }; + + return ( +
+ onHandleConnection()} + > + {hasResponseData ? ( +
+
+
+ + {STRINGS['CONNECTIONS.STATUS_NORMAL']} + +
+
+ + + + {STRINGS['CONNECTIONS.CHECK_CONNECTION']} + + +
+
+ ) : ( + + +
+ + {STRINGS['CONNECTIONS.CONNECTION_ISSUE_DETECTED']} + +
+
+ + + + {STRINGS['CONNECTIONS.CHECK_CONNECTION']} + + +
+
+ )} +
+ } + overlayClassName={ + hasResponseData + ? 'connection-status-details' + : 'connection-status-error-details connection-status-details' + } + placement="bottomRight" + > +
onHandleConnection()} + > +
+
+ + {isDisplayPopup?.isDisplayConnection && ( + + )} + + {isDisplayPopup?.isDisplayReconnect && ( + + )} +
+ ); +}; + +export default Connections; diff --git a/web/src/components/AppBar/Utils.js b/web/src/components/AppBar/Utils.js new file mode 100644 index 0000000000..6e2328512c --- /dev/null +++ b/web/src/components/AppBar/Utils.js @@ -0,0 +1,353 @@ +import React from 'react'; +import { isMobile } from 'react-device-detect'; +import { Tooltip } from 'antd'; +import { ExclamationCircleOutlined, ReloadOutlined } from '@ant-design/icons'; + +import Dialog from 'components/Dialog'; +import icons from 'config/icons/dark'; +import STRINGS from 'config/localizedStrings'; +import { Button, EditWrapper, Image } from 'components'; +import { getCountry } from 'containers/Verification/utils'; +import { getFormatTimestamp } from 'utils/utils'; +import { Loading } from 'containers/DigitalAssets/components/utils'; + +export const ConnectionPopup = ({ + isDisplayPopup, + setIsDisplayPopup, + pingDetails, + setPingDetails, + onHandleClose, + isLoading, + hasResponseData, + loginDetail, + fetchHealthData, +}) => { + const { name } = getCountry(loginDetail?.data[0]?.country); + const time = getFormatTimestamp(loginDetail?.data[0]?.created_at); + + const connectionDetails = [ + { + stringId: 'STATUS', + value: hasResponseData + ? STRINGS['CONNECTIONS.NORMAL_TEXT'] + : STRINGS['CONNECTIONS.CONNECTION_ISSUE'], + icon: true, + }, + { + stringId: 'CONNECTIONS.IP', + value: loginDetail?.data[0]?.ip, + country: name, + }, + { + stringId: 'CONNECTIONS.SESSION', + value: STRINGS['CONNECTIONS.LOGGED_IN_AT'], + time: time, + }, + ]; + return ( + onHandleClose('connection')} + className="check-connection-popup-wrapper" + > +
+
+ + + + {STRINGS['CONNECTIONS.CHECK_CONNECTION']} + + +
+ {connectionDetails?.map((detail, index) => ( +
+
+ + {STRINGS[detail?.stringId]}: + +
+
+ {detail?.stringId === 'STATUS' && isLoading && ( + + + + )} + + {detail?.stringId === 'STATUS' && !isLoading && ( + + {detail?.value} + + )} + {(detail?.stringId === 'CONNECTIONS.SESSION' || + detail?.stringId === 'CONNECTIONS.IP') && ( + + {detail?.value} + + )} + {(detail?.country || detail?.time) && ( + + {detail?.country ? ( + ({detail?.country}) + ) : ( + detail?.time + )} + + )} + {detail?.icon && !isLoading && ( + + )} + + {!hasResponseData && + detail?.icon && + detail?.value === 'Connection issue' && + !isLoading && ( + +
{ + setIsDisplayPopup((prev) => ({ + ...prev, + isDisplayConnection: false, + isDisplayReconnect: true, + })); + }} + > + ( + + {STRINGS['CONNECTIONS.RECONNECT'].toUpperCase()} + + + {' '} + + + ) +
+
+ )} +
+
+ ))} +
+
+
+ + {STRINGS['CONNECTIONS.PING']}: + + + ({STRINGS['CONNECTIONS.TOOLTIP_DESC_2']})
+ )} + placement="right" + overlayClassName="connection-tool-tip" + > + + + +
+
{ + setPingDetails((prev) => ({ + ...prev, + isDisplayPing: true, + })); + fetchHealthData(); + }} + > + {isLoading && pingDetails?.isDisplayPing ? ( + + + {STRINGS['CONNECTIONS.PING_CHECK_TEXT']} + + + ) : !pingDetails?.isDisplayPingText ? ( + +
+ +
+
100 && + pingDetails?.pingValue <= 200 + ? 'slow-ping' + : pingDetails?.pingValue > 200 && 'very-slow-ping' + } + >
+ {pingDetails?.pingValue > 100 && ( +
100 && + pingDetails?.pingValue <= 200 + ? 'slow-ping' + : pingDetails?.pingValue > 200 && 'very-slow-ping' + } + >
+ )} + {pingDetails?.pingValue > 200 && ( +
200 && 'very-slow-ping' + } + >
+ )} +
+ + + {STRINGS.formatString( + STRINGS['CONNECTIONS.MS'], + pingDetails?.pingValue + )} + + + + 100 && + pingDetails?.pingValue <= 200 + ? STRINGS['CONNECTIONS.SLOW'] + : pingDetails?.pingValue > 200 && + STRINGS['CONNECTIONS.VERY_SLOW'] + } + > + ( + + {pingDetails?.pingValue <= 100 + ? STRINGS['CONNECTIONS.FAST'] + : pingDetails?.pingValue > 100 && + pingDetails?.pingValue <= 200 + ? STRINGS['CONNECTIONS.SLOW'] + : pingDetails?.pingValue > 200 && + STRINGS['CONNECTIONS.VERY_SLOW']} + + ) + + +
+ + ( + + {STRINGS['CONNECTIONS.RECHECK_PING']} + + ) + +
+
+ ) : ( + + ( + + setPingDetails((prev) => ({ + ...prev, + isDisplayPingText: false, + })) + } + > + {STRINGS['CONNECTIONS.CHECK_PING']} + + ) + + )} +
+
+
+ + +
+
+ + ); +}; + +export const ReconnectPopup = ({ isDisplayPopup, onHandleClose }) => { + return ( + onHandleClose('reconnect')} + className="reconnect-popup-wrapper" + > +
+
+ + + + + + {STRINGS['CONNECTIONS.RECONNECT']} + + +
+
+ + + {STRINGS['CONNECTIONS.RECONNECT_DESC']} + + +
+ + {STRINGS['CONNECTIONS.CONFIRM_RECONNECT_MESSAGE']} + +
+
+
+ +
+
+
+ ); +}; diff --git a/web/src/components/AppBar/_AppBar.scss b/web/src/components/AppBar/_AppBar.scss index 0431f2b232..d92598bd2e 100644 --- a/web/src/components/AppBar/_AppBar.scss +++ b/web/src/components/AppBar/_AppBar.scss @@ -63,8 +63,34 @@ $app-menu-width: calc(100vw - 40rem); min-height: $navigation_bar-height; } + .app-bar-dropdown-icon { + transform: scale(4, 4); + display: flex; + align-items: center; + justify-content: center; + position: relative; + top: 1.5px; + .anticon { + svg { + position: relative; + height: 3px; + margin-bottom: 1px; + } + } + } + .trade-navbar-wrapper { + gap: 2%; + .custom-select-input-style { + &.appbar { + &.ant-select { + margin: 0 !important; + } + } + } + } + .app_bar-quicktrade-container { - margin: 0 0.25rem; + // margin: 0 0.25rem; .toggle_button-wrapper { .toggle-content { .toggle-action_button { @@ -126,7 +152,7 @@ $app-menu-width: calc(100vw - 40rem); .app-bar-account { color: $base_top-bar-navigation_text; cursor: pointer; - margin-right: 0.8rem; + margin-right: 5px; // width: 15rem; svg { @@ -179,6 +205,11 @@ $app-menu-width: calc(100vw - 40rem); } } + .active-text { + color: $base_top-bar-navigation_text !important; + opacity: 1 !important; + } + .app-bar-currency-icon { margin: 0.5rem 0.3rem 0 0.3rem; width: 1.5rem; @@ -309,6 +340,7 @@ $app-menu-width: calc(100vw - 40rem); position: relative; color: $app-bar-icon-inactive; } + .app-announcement-list { height: 335px; width: 280px; @@ -606,14 +638,18 @@ $app-menu-width: calc(100vw - 40rem); display: flex; align-items: center; border-top: 3px solid transparent; + + .arrow-icon { + font-size: 10px; + } } .app-menu-bar-content-item { margin: auto; position: relative; - &:hover { - opacity: 0.5; - } + // &:hover { + // opacity: 0.5; + // } } .app-menu-bar-icon { @@ -633,6 +669,11 @@ $app-menu-width: calc(100vw - 40rem); } } + .active-text { + color: $base_top-bar-navigation_text !important; + opacity: 1 !important; + } + .active-menu { color: $base_top-bar-navigation_text; border-top: 4px solid $link; @@ -1098,6 +1139,151 @@ $app-menu-width: calc(100vw - 40rem); color: $colors-main-black; } +.account-tab-dropdown { + .ant-tooltip-inner { + padding: unset; + .navigation-dropdown-container { + padding: unset; + .options-container { + margin: 0% 4%; + padding: 2% 4%; + } + } + } +} +.account-tab-options-tooltip { + font-size: 12px; + z-index: 2; +} +.navigation-bar-wrapper { + max-width: 100% !important; + background-color: transparent; + top: 35px !important; + bottom: 25px; + z-index: 2; + .app-bar-account-notification { + height: $app-menu-notification-size; + width: $app-menu-notification-size; + border-radius: $app-menu-notification-size; + background-color: $colors-notifications-red; + color: $colors-notification-alert-text; + display: flex; + justify-content: center; + align-items: center; + font-size: 0.8rem; + line-height: 1; + font-weight: bold; + } + .ant-tooltip-inner { + width: 30rem; + background-color: $app-background-color; + color: $colors-main-black; + border-radius: 5px; + border: 2px solid $colors-border-hover; + box-shadow: 4px 4px 15px $app-bar-background-color; + } + .navigation-dropdown-container { + padding: 2%; + .main-active { + background-color: var(--base_wallet-sidebar-and-popup); + } + .options-container { + border-radius: 5px; + padding: 2% 2% 2% 5%; + display: flex; + gap: 15px; + align-items: center; + .option-details { + font-size: 12px; + display: flex; + flex-direction: column; + align-items: flex-start; + .hot-icon { + margin-left: 0.3rem; + svg { + width: 1.2rem; + path { + fill: var(--specials_pending-waiting-caution) !important; + } + } + } + } + .filtered-option-icon { + svg { + width: 1.8rem; + path { + fill: var( + --labels_important-active-labels-text-graphics + ) !important; + } + } + } + } + .options-container:hover, + .icon-option-container:hover { + background-color: $app-sidebar-background; + cursor: pointer; + } + .options-route-wrapper { + margin-top: 2%; + border-top: 1px solid $colors-black; + padding: 3%; + display: flex; + gap: 3%; + justify-content: space-around; + font-size: 12px; + + .icon-option-container { + display: flex; + flex-direction: column; + gap: 3%; + align-items: center; + padding: 2%; + min-width: 5rem; + svg { + width: 1.5rem; + path { + fill: $colors-main-black; + } + } + } + .icon-option-container:hover { + cursor: pointer; + border-radius: 3px; + } + } + .tier-wrapper { + padding: 3% 7%; + margin-bottom: 2%; + display: flex; + gap: 3%; + font-size: 12px; + align-items: center; + background-color: $app-sidebar-background; + .blue-link:hover { + cursor: pointer; + } + .trader-wrapper-icon { + width: 2.5rem; + margin-right: unset; + position: relative; + top: 3px; + } + } + .summary-page-link { + text-transform: uppercase; + text-align: center; + padding: 2% 0 6% 0; + .blue-link { + font-size: 13px; + } + .blue-link:hover { + cursor: pointer; + } + } + } +} + @media (min-width: 1920px) { .app_bar { font-size: 1rem; @@ -1143,7 +1329,7 @@ $app-menu-width: calc(100vw - 40rem); // } .app-menu-bar-content { - width: 8rem; + width: unset; } } .app-bar-add-tab-menu { diff --git a/web/src/components/AppBar/_Connections.scss b/web/src/components/AppBar/_Connections.scss new file mode 100644 index 0000000000..ad6d6ed48e --- /dev/null +++ b/web/src/components/AppBar/_Connections.scss @@ -0,0 +1,249 @@ +.check-connection-tab { + .connection-icon-wrapper { + padding: 1rem; + .network-connection-icon, + .network-connection-icon-danger { + height: 12px; + width: 12px; + border-radius: 12px; + background-color: var(--specials_checks-okay-done); + } + + .network-connection-icon-danger { + background-color: var( + --specials_notifications-alerts-warnings + ) !important; + } + } +} + +.check-connection-tab:hover { + opacity: 0.5; +} + +.check-connection-popup-wrapper, +.reconnect-popup-wrapper { + .ReactModal__Content { + width: 35rem; + + .check-connection-popup-container { + .loading-anime { + height: 20px; + width: 100px; + border-radius: 7px; + animation: mymove 3s infinite; + } + + .connection-title-wrapper { + display: flex; + gap: 5px; + align-items: center; + margin-bottom: 3%; + + .check-connection-text { + font-size: 20px; + } + } + + .connection-details-container { + margin-top: 1%; + display: flex; + font-size: 14px; + + .status-title { + width: 25%; + + .connection-icon { + position: relative; + bottom: 5px; + } + } + + .connection-status-details { + overflow-x: scroll; + } + + .connection-status { + display: flex; + align-items: center; + gap: 5px; + flex-wrap: wrap; + + .success-icon { + width: 12px; + height: 12px; + background-color: var(--specials_checks-okay-done); + border-radius: 25px; + } + + .danger-icon { + background-color: var( + --specials_notifications-alerts-warnings + ) !important; + } + + .ping-details { + display: flex; + align-items: center; + gap: 5px; + + .ping-status-bar { + display: flex; + align-items: center; + gap: 5px; + + .fast-ping, + .slow-ping, + .very-slow-ping { + height: 15px; + width: 2px; + background-color: var(--specials_checks-okay-done); + } + + .slow-ping { + background-color: var( + --specials_my-username-in-chat + ) !important; + } + + .very-slow-ping { + background-color: var( + --specials_notifications-alerts-warnings + ) !important; + } + } + } + } + + .blue-link:hover { + cursor: pointer; + } + } + + .custom-line { + margin: 3% 0; + width: 7%; + height: 1.5px; + background-color: var(--labels_secondary-inactive-label-text-graphics); + } + + .connection-button-container { + margin-top: 5%; + display: flex; + gap: 10px; + } + } + } +} + +.connection-tool-tip { + background-color: var(--base_background); +} + +.reconnect-popup-wrapper { + .reconnect-title-wrapper { + display: flex; + align-items: center; + font-size: 20px; + gap: 5px; + + .reconnect-title { + text-transform: capitalize !important; + } + } + + .reconnect-details-container { + margin-top: 2%; + font-size: 14px; + + .reconnect-confirmation-message { + margin-top: 3%; + } + } + + .connection-button-container { + margin-top: 5%; + display: flex; + gap: 10px; + } +} + +.connection-tool-tip, +.connection-status-details { + max-width: fit-content !important; + + .ant-tooltip-inner, + .ant-tooltip-arrow-content { + color: var(--labels_important-active-labels-text-graphics); + background-color: var(--base_background); + } +} + +.connection-tool-tip, +.connection-status-details, +.connection-status-error-details { + max-width: fit-content !important; + + .ant-tooltip-inner, + .ant-tooltip-arrow-content { + color: var(--labels_important-active-labels-text-graphics); + background-color: var(--base_background); + } +} + +.connection-status-details, +.connection-status-error-details { + .ant-tooltip-inner, + .ant-tooltip-arrow-content { + background-color: var(--base_background) !important; + } + + .ant-tooltip-inner { + border-top: 2px solid var(--specials_checks-okay-done); + font-size: 13px; + + .conncetion-detail { + padding: 3% 0; + border-bottom: 1px solid + var(--labels_secondary-inactive-label-text-graphics); + } + + .circle-icon { + padding: 5px; + background-color: var(--specials_checks-okay-done); + border-radius: 25px; + height: 2px; + width: 2px; + } + + .connection-title-wrapper { + display: flex; + align-items: center; + gap: 3%; + text-wrap: nowrap; + padding: 4% 0; + + .connection-logo { + svg { + width: 1.5rem; + } + } + } + } +} + +.connection-status-error-details { + .ant-tooltip-inner { + border-top: 2px solid var(--specials_notifications-alerts-warnings) !important; + + .circle-icon { + background-color: var( + --specials_notifications-alerts-warnings + ) !important; + } + } +} + +.connection-status-details:hover { + cursor: pointer; +} diff --git a/web/src/components/AppBar/index.js b/web/src/components/AppBar/index.js index b74ed6b1dd..de71f3ea4e 100644 --- a/web/src/components/AppBar/index.js +++ b/web/src/components/AppBar/index.js @@ -5,7 +5,6 @@ import classnames from 'classnames'; import { Link } from 'react-router'; import { isMobile } from 'react-device-detect'; import { DEFAULT_URL } from 'config/constants'; -import MenuList from './MenuList'; import { MobileBarWrapper, EditWrapper, ButtonLink, Image } from 'components'; import { isLoggedIn } from 'utils/token'; import { @@ -18,9 +17,10 @@ import { updateUserSettings, setUserData } from 'actions/userAction'; import ThemeSwitcher from './ThemeSwitcher'; import withEdit from 'components/EditProvider/withEdit'; import withConfig from 'components/ConfigProvider/withConfig'; -import AnnouncementList from './AnnouncementList'; import STRINGS from 'config/localizedStrings'; import LanguageSwitcher from './LanguageSwitcher'; +import Connections from './Connections'; +import AccountTab from './AccountTab'; class AppBar extends Component { state = { @@ -238,9 +238,9 @@ class AppBar extends Component { constants: { valid_languages } = {}, constants = {}, children, - activePath, - onMenuChange, - menuItems, + // activePath, + // onMenuChange, + // menuItems, router, isHome, activeLanguage, @@ -251,7 +251,7 @@ class AppBar extends Component { const { securityPending, verificationPending, - walletPending, + // walletPending, selected, } = this.state; return isHome ? ( @@ -322,7 +322,7 @@ class AppBar extends Component { {isLoggedIn() && (
- - */} + {/* */} + +
)} diff --git a/web/src/components/Form/validations.js b/web/src/components/Form/validations.js index e915207a60..13cde4a369 100644 --- a/web/src/components/Form/validations.js +++ b/web/src/components/Form/validations.js @@ -43,7 +43,7 @@ export const validAddress = (symbol = '', message, network, key = '') => { let valid; try { - if (currency === 'bnb' || currency === 'klay' || currency === 'matic') + if (currency === 'bnb' || currency === 'klay' || currency === 'matic' || currency === 'pol') currency = 'eth'; const supported = WAValidator.findCurrency(currency); diff --git a/web/src/components/Loader/_Loader.scss b/web/src/components/Loader/_Loader.scss index 20539c65d0..6b54c61248 100644 --- a/web/src/components/Loader/_Loader.scss +++ b/web/src/components/Loader/_Loader.scss @@ -6,7 +6,7 @@ $loader-full--height: 5rem; position: absolute; width: 100%; height: $loader-absolute--height; - z-index: 99999; + z-index: 1; .loader_background { height: $loader-absolute--height; } diff --git a/web/src/components/QuickTrade/index.js b/web/src/components/QuickTrade/index.js index 4de9f6b236..b59af535ea 100644 --- a/web/src/components/QuickTrade/index.js +++ b/web/src/components/QuickTrade/index.js @@ -60,6 +60,7 @@ const QuickTrade = ({ router: { params }, changePair, icons: ICONS, + chain_trade_config, }) => { const getTargetOptions = (source) => sourceOptions.filter((key) => { @@ -84,7 +85,9 @@ const QuickTrade = ({ const [targetAmount, setTargetAmount] = useState(); const [selectedSource, setSelectedSource] = useState(initialSelectedSource); const [selectedTarget, setSelectedTarget] = useState(initialSelectedTarget); - const [targetOptions, setTargetOptions] = useState(initialTargetOptions); + const [targetOptions, setTargetOptions] = useState( + chain_trade_config?.active ? sourceOptions : initialTargetOptions + ); const [showModal, setShowModal] = useState(false); const [isReview, setIsReview] = useState(true); const [loading, setLoading] = useState(false); @@ -327,17 +330,22 @@ const QuickTrade = ({ useEffect(() => { if (mounted) { const options = getTargetOptions(selectedSource); - setTargetOptions(options); - setSelectedTarget(options[0]); + if (chain_trade_config?.active) { + setSelectedTarget(sourceOptions[0]); + } else { + setTargetOptions(options); + setSelectedTarget(options[0]); + } } // eslint-disable-next-line react-hooks/exhaustive-deps }, [selectedSource]); useEffect(() => { + if (selectedSource === selectedTarget) return; const symbol = `${selectedSource}-${selectedTarget}`; const flippedSymbol = flipPair(symbol); - if (quicktradePairs[symbol]) { + if (quicktradePairs[symbol] || chain_trade_config?.active) { setSymbol(symbol); goToPair(symbol); } else if (quicktradePairs[flippedSymbol]) { @@ -518,7 +526,9 @@ const QuickTrade = ({ /> coin !== selectedTarget + )} inputValue={sourceAmount} selectValue={selectedSource} onSelect={onSelectSource} @@ -571,7 +581,9 @@ const QuickTrade = ({ /> coin !== selectedSource + )} inputValue={targetAmount} selectValue={selectedTarget} onSelect={onSelectTarget} @@ -705,6 +717,7 @@ const mapStateToProps = (store) => { constants: store.app.constants, markets: MarketsSelector(store), user: store.user, + chain_trade_config: store.app.constants.chain_trade_config, }; }; diff --git a/web/src/components/Sidebar/_Sidebar.scss b/web/src/components/Sidebar/_Sidebar.scss index 94eb29fa69..8789e56ac4 100644 --- a/web/src/components/Sidebar/_Sidebar.scss +++ b/web/src/components/Sidebar/_Sidebar.scss @@ -54,7 +54,8 @@ $row--size: calc(#{$row--height} - #{$sidebar-sections-padding}); .account-svg-1, .quick-trade-tab-active, .assets-icon-tab, - .onramp-icon { + .onramp-icon, + .item-options { fill: $colors-black; } @@ -64,7 +65,8 @@ $row--size: calc(#{$row--height} - #{$sidebar-sections-padding}); .trade-active-2, .chat-0, .quick-trade-tab-active, - .assets-icon-tab { + .assets-icon-tab, + .item-options { stroke: $colors-black; } @@ -82,7 +84,8 @@ $row--size: calc(#{$row--height} - #{$sidebar-sections-padding}); .chat-0, .account-svg-1, .assets-icon-tab, - .onramp-icon { + .onramp-icon, + .item-options { fill: $base_top-bar-navigation_text; } @@ -90,7 +93,8 @@ $row--size: calc(#{$row--height} - #{$sidebar-sections-padding}); .trade-active-2, .chat-0, .quick-trade-tab-active, - .assets-icon-tab { + .assets-icon-tab, + .item-options { stroke: $base-top-bar-navigation_text; } } diff --git a/web/src/components/_components.scss b/web/src/components/_components.scss index ca86850aff..c96a5404c7 100644 --- a/web/src/components/_components.scss +++ b/web/src/components/_components.scss @@ -42,3 +42,4 @@ @import './Views/NotLoggedIn'; @import './Coin/Coin'; @import './IntensityBar/IntensityBar'; +@import './AppBar/Connections'; diff --git a/web/src/config/constants.js b/web/src/config/constants.js index 638b7ca71f..828f85ac68 100644 --- a/web/src/config/constants.js +++ b/web/src/config/constants.js @@ -185,6 +185,9 @@ export const EXPLORERS_ENDPOINT = (currency) => { case 'matic': endpoint = 'https://polygonscan.com/tx/'; break; + case 'pol': + endpoint = 'https://polygonscan.com/tx/'; + break; case 'etc': endpoint = 'https://etc.blockscout.com/tx/'; break; diff --git a/web/src/config/icons/dark.js b/web/src/config/icons/dark.js index 61b07a83d4..e3a426e2e9 100644 --- a/web/src/config/icons/dark.js +++ b/web/src/config/icons/dark.js @@ -292,6 +292,9 @@ const nestedIcons = { CONNECT_DESKTOP: '/assets/stake/connect-via-desktop.svg', SEARCH_BLOCKCHAIN: '/assets/images/search-blockchain.svg', ASSET_INFO_COIN: '/assets/images/digital-assets-coins.svg', + GAINER_CARD_ICON: '/assets/images/gainer-arrow-up.svg', + LOSER_CARD_ICON: '/assets/images/arrow-down-loser.svg', + NEW_ASSET_CARD_ICON: '/assets/images/new-coin-bolt.svg', CLOCK: '/assets/images/clock.svg', REVOKE_SESSION: '/assets/images/signout.svg', @@ -311,6 +314,44 @@ const nestedIcons = { DEPOSIT_TITLE: '/assets/images/deposit-box.svg', ADDRESS_BOOK: '/assets/images/global-address-book.svg', + CHAT_P2P_ICON: '/assets/images/chat-icon-p2p-02.svg', + + WITHDRAW_OPTION_ICON: '/assets/images/withdraw-option-icon.svg', + BUY_CRYPTO_OPTION: '/assets/images/buy-crypto-option.svg', + API_OPTION_ICON: '/assets/images/api-option-icon.svg', + DEFI_STAKE_OPTION_ICON: '/assets/images/defi-stake.svg', + CEFI_STAKE_OPTION_ICON: '/assets/images/cefi-stake.svg', + PROFIT_LOSS_OPTION_ICON: '/assets/images/profit-loss-option-icon.svg', + FEES_OPTION_ICON: '/assets/images/fees-option-icon.svg', + LIMITS_OPTION_ICON: '/assets/images/limits-option-icon.svg', + WALLET_OPTION_ICON: '/assets/images/wallet-option-icon.svg', + LANGUAGE_OPTION_ICON: '/assets/images/language-option-icon.svg', + P2P_OPTION_ICON: '/assets/images/p2p-option-icon.svg', + HISTORY_OPTION_ICON: '/assets/images/history-option-icon.svg', + VOLUME_OPTION_ICON: '/assets/images/volume-option-icon.svg', + ASSET_OPTION_ICON: '/assets/images/asset-option-icon.svg', + OPTION_2FA_ICON: '/assets/images/2fa-option-icon.svg', + PASSWORD_OPTION_ICON: '/assets/images/password-option-icon.svg', + LOGIN_OPTION_ICON: '/assets/images/login-option-icon.svg', + SESSION_OPTION_ICON: '/assets/images/session-option-icon.svg', + BANK_OPTION_ICON: '/assets/images/bank-option-icon.svg', + AUDIO_OPTION_ICON: '/assets/images/audio-option-icon.svg', + ADDRESS_OPTION_ICON: '/assets/images/address-option-icon.svg', + NOTIFICATION_OPTION_ICON: '/assets/images/notification-option-icon.svg', + HELP_OPTION_ICON: '/assets/images/help-bubble.svg', + INTERFACE_OPTION_ICON: '/assets/images/interface-option-icon.svg', + IDENTITY_OPTION_ICON: '/assets/images/identity-option-icon.svg', + PHONE_OPTION_ICON: '/assets/images/phone-option-icon.svg', + EMAIL_OPTION_ICON: '/assets/images/email-option-icon.svg', + DEPOSIT_OPTION_ICON: '/assets/images/deposit-hot.svg', + TRADE_OPTION_ICON: '/assets/images/trade-hot.svg', + CONVERT_OPTION_ICON: '/assets/images/convert.svg', + REFERRAL_OPTION_ICON: '/assets/images/referral-gift.svg', + + PING_CONNECTION: '/assets/images/ping-connection-check.svg', + NO_ICON: '/assets/images/no-icon-drop-down-icon.svg', + ONRAMPER_ICON: '/assets/images/onramper.svg', + HOT_ICON: '/assets/images/fire-emoji.svg', }; const icons = flatten(nestedIcons, options); diff --git a/web/src/config/lang/ar.json b/web/src/config/lang/ar.json index 5d3a5af2d6..de7ce0fd47 100644 --- a/web/src/config/lang/ar.json +++ b/web/src/config/lang/ar.json @@ -119,7 +119,8 @@ "TAB_FIAT": "ضوابط فيات", "TAB_TRADE": "تجارة", "PRO_TRADE": "طليعة", - "QUICK_TRADE": "سريع" + "QUICK_TRADE": "سريع", + "P2P": "نظير إلى نظير" }, "CONTACT_FORM": { "CATEGORY_LABEL": "الفئة", @@ -157,7 +158,8 @@ "QR_CODE": "يمكن فحص رمز الاستجابة السريعة(QR Code) هذا بواسطة الشخص الذي يريد إرسال الأموال إليك", "NO_DATA": "لا توجد معلومات متاحة", "FULL_MESSAGE_LIMIT": "{0}: {1} {2} {3}", - "QR_CODE_TITLE": "{0} معلومات الإيداع" + "QR_CODE_TITLE": "{0} معلومات الإيداع", + "VIEW_DEPOSIT": "عرض الوديعة" }, "LOGIN": { "LOGIN_TO": "تسجيل الدخول إلى {0}", @@ -221,7 +223,9 @@ "ERROR_INVALID": "رمز السري المتغير غير صالح", "OTP_FORM_INFO": "أدخل الرمز المكون من 6 أرقام للمتابعة", "OTP_FORM_SUBNOTE_LINE_1": "يُعرف الرمز الخاص بك أيضًا باسم المصادقة الثنائية (2FA) أو رمز OTP.", - "OTP_FORM_SUBNOTE_LINE_2": "إذا فقدت الرمز الخاص بك، فيرجى التواصل مع فريق الدعم." + "OTP_FORM_SUBNOTE_LINE_2": "إذا فقدت الرمز الخاص بك، فيرجى التواصل مع فريق الدعم.", + "OTP_FORM_SUBNOTE_LINE_3": "(لإضافة حساب جديد إلى Google Authenticator، انقر فوق الزر \"+\". يمكنك إما مسح رمز الاستجابة السريعة المقدم في الخطوة السابقة أو إدخال المفتاح يدويًا لإضافة حسابك إلى التطبيق.)", + "INPUT_TEXT": "أدخل الرمز المكون من 6 أرقام من تطبيق Google Authenticator على هاتفك:" }, "QUICK_TRADE_COMPONENT": { "TITLE": "التداول السريع", @@ -261,7 +265,14 @@ "ORDERS_PLURAL": "الطلبات", "ORDERS_SINGULAR": "الطلب", "HOLD_ORDERS": "لديك {0} مفتوحة {1} ، مما أدى إلى إمتلاك {2} {3} في رصيدك بعملة {4}", - "LOADING_ASSETS": "جارٍ تحميل الأصول..." + "LOADING_ASSETS": "جارٍ تحميل الأصول...", + "MOBILE_WALLET_BALANCE_LABEL": "الميزان / الشرق. USDT", + "MOBILE_WALLET_SHARE_LABEL": "حصة / تقديرات. USDT", + "VIEW_MORE_WALLET_INFO": "عرض المزيد من معلومات المحفظة", + "VIEW_WALLET_TRANSACTION_HISTORY": "عرض سجل معاملات المحفظة", + "ORDERS_HOLD": "لديك {0} {1}، مما أدى إلى حجز {2} {3} على رصيدك {4}", + "OPEN_ORDERS_SINGULAR": "طلب مفتوح", + "VIEW_WALLET": "عرض المحفظة" }, "REQUEST_RESET_PASSWORD": { "TITLE": "استرجاع الحساب", @@ -600,7 +611,8 @@ "CANCEL": "يلغي", "PLACEHOLDER": "أكتب هنا" } - } + }, + "TITLE_TEXT": "قم بمراجعة إعدادات حسابك عن طريق ضبط التفضيلات مثل تخطيط الواجهة، وتفضيلات الإشعارات، واسم المستخدم، والتخصيصات الأخرى." }, "TRANSACTION_HISTORY": { "TITLE": "سجل", @@ -618,7 +630,8 @@ "INTERNAL": "داخلي", "BLOCKCHAIN": "blockchain", "STAKE": "حصة", - "REFERRAL": "الإحالة" + "REFERRAL": "الإحالة", + "QUICK_TRADE_TOOLTIP": "أمر تم تنفيذه من خلال OTC" }, "ACCOUNT_SECURITY": { "TITLE_TEXT": "اضبط إعدادات الأمان لحسابك. من المصادقة ذات العاملين ، وكلمة المرور ، ومفاتيح واجهة برمجة التطبيقات (API)، والوظائف الأخرى المتعلقة بالأمان.", @@ -641,15 +654,46 @@ "MESSAGE_3": "إذا كنت تواجه مشكلات في مسح هذا ، فيمكنك إدخال الرمز يدويًا أدناه", "MESSAGE_4": "يجب عليك تخزين هذا الرمز بشكل آمن لاستعادة المصادقة ذات العاملين الخاص بك في حالة تغيير هاتفك المحمول أو فقده في المستقبل.", "MESSAGE_5": "يدوي", - "WARNING": "نوصي بشدة بإعداد المصادقة اذات العاملين(2FA) .سيؤدي القيام بذلك إلى زيادة أمان أموالك بشكل كبير.", + "WARNING": "نحن {0} {1}", "ENABLE": "مَكِّن المصادقة الثنائية", "DISABLE": "تعطيل المصادقة ذات العاملين", - "INPUT": "الرجاء إدخال كلمة المرور لمرة واحدة (OTP) الخاصة بك" + "INPUT": "الرجاء إدخال كلمة المرور لمرة واحدة (OTP) الخاصة بك", + "STRONGLY_RECOMMEND": "أوصي بشدة", + "WARNING_CONTENT": "أن تقوم بتفعيل المصادقة الثنائية لتعزيز أمان حسابك وحماية أموالك" }, "FORM": { "PLACEHOLDER": "أدخل الرقم السري المتغير المقدم من Google Authenticator.", "BUTTON": "تمكين المصادقة ذات العاملين" - } + }, + "DOWNLOAD_APP": "تنزيل وتثبيت", + "GOOGLE_AUTHENTICATOR": "مُصادق جوجل:", + "DOWNLOAD_FROM": "تنزيل من", + "GOOGLE_PLAY": "جوجل بلاي", + "APPLE": "متجر التطبيقات", + "APP_INFO": "سيقوم Google Authenticator بإنشاء رموز عشوائية ضرورية للإجراءات الحساسة، مثل تسجيل الدخول وسحب الأموال.", + "DONT_UNINSTALL": "من فضلك لا تقم بإلغاء تثبيت التطبيق.", + "INFO_UNINSTALL": "في حالة فقدان الهاتف عن طريق الخطأ أو إلغاء التثبيت عن غير قصد، قد تواجه تأخيرات في استعادة الوصول إلى حسابك. في مثل هذه الحالات، ستحتاج إلى الاتصال بفريق الدعم لدينا للحصول على المساعدة.", + "BACK": "خلف", + "PROCEED": "يتابع", + "NEXT": "التالي", + "NOTE": "ملحوظة: {0} {1}", + "MANUEL_DESCRIPTION": "يرجى إدخال بذرة 2FA اليدوية من الخطوة السابقة.", + "MANUEL_DESCRIPTION_2": "يرجى كتابة وتخزين التحقق اليدوي المذكور أعلاه بعناية", + "MANUEL_DESCRIPTION_3": "المفتاح حيث يمكن استخدامه لاستعادة الحساب.", + "MANUEL_KEY": "بذرة 2FA اليدوية", + "MANUEL_PLACEHOLDER": "أدخل بذرة 2FA الخاصة بك", + "MANUEL_WARNING": "(تأكد من كتابتها وتخزينها بشكل آمن لاستخدامها في المستقبل.)", + "MANUEL_ERROR_1": "الرجاء إدخال بذرة 2FA اليدوية", + "MANUEL_ERROR_2": "يرجى إدخال بذرة 2FA اليدوية من الخطوة السابقة", + "ACCOUNT_SECURED": "الحساب مؤمن", + "2FA_ENABLED": "تم تمكين 2FA", + "2FA_DISABLED": "تم تعطيل 2FA", + "2FA_CONTENT_ONE": "تفعيل {0} {1}.", + "2FA_CONTENT_TWO": "(المصادقة الثنائية) تضيف طبقة إضافية من الحماية لحماية أموالك. بمجرد تمكينها، سيُطلب منك إدخال رمز التحقق من هاتفك في كل مرة تسجل فيها الدخول أو تسحب أصولاً. تعمل هذه الميزة على تعزيز أمان حسابك بشكل كبير", + "2FA_CONTENT_THREE": "(المصادقة الثنائية) تضيف طبقة إضافية من الحماية لحماية أموالك", + "2FA_CONTENT_FOUR": "لتعطيل 2FA، ستحتاج إلى إدخال رمز 2FA (OTP) الخاص بك", + "INPUT_SIX_DIGIT_CODE": "أدخل الرمز المكون من 6 أرقام من تطبيق Google Authenticator على هاتفك:", + "INPUT_CONTENT": "(لإضافة حساب جديد إلى Google Authenticator، انقر فوق الزر \"+\". يمكنك إما مسح رمز الاستجابة السريعة المقدم في الخطوة السابقة أو إدخال المفتاح يدويًا لإضافة حسابك إلى التطبيق.)" }, "CHANGE_PASSWORD": { "TITLE": "كلمة المرور", @@ -728,13 +772,13 @@ "FORFEITURE_OF_EARNINGS_DETAILS_LABEL": "ضياع الأرباح", "STAKE_AMOUNT_LABEL": "مبلغ الرهان", "DISCLAIMER_NOTICE": "تنويه: يُرجى ملاحظة أن المبالغ التي تزيد قيمتها عن 1,000 دولار أمريكي ستتطلب إكمال التحقق من الهوية. تشمل هذه القيمة الأرباح، وتحتفظ المنصة بالحق في طلب معلومات إضافية عن المستخدم.", - "SETTLEMENT_NOTICE": "تسوية: سيتم تطبيق فترة تسوية لمدة 24 ساعة عند سحب الرهان.", + "SETTLEMENT_NOTICE": "{0} سيتم تطبيق فترة تسوية مدتها 24 ساعة عند إلغاء المراهنة.", "CONFIRM_BUTTON": "تأكيد", "STAKE_RULES_NOTICE": "بمجرد أن تراهن، ستكون ملتزمًا بقواعد الحوض.", "I_UNDERSTAND_AGAIN_BUTTON": "أنا أفهم", "CONGRATULATIONS_NOTICE": "تهانينا!", "EARNINGS_START_NOTICE": "سيبدأ رهانك في كسب الأرباح.", - "REVIEW_PROGRESS_LABEL": "يمكنك مراجعة تقدم رهانك على صفحة الرهانات النشطة.", + "REVIEW_PROGRESS_LABEL": "يمكنك مراجعة تقدم حصتك على {0}", "TIME_REMAINING_LABEL": "الوقت المتبقي", "PENALTY_UPON_INITIAL_STAKE_PRINCIPLE_LABEL_2": "العقوبة على مبدأ الرهان الأولي", "FORFEITURE_OF_EARNINGS_LABEL_2": "ضياع الأرباح", @@ -744,7 +788,26 @@ "VISIT_WALLET_BUTTON": "زيارة المحفظة", "CLOSE_BUTTON": "إغلاق", "ACTIVE_STAKES": "حصص نشطة", - "STAKES_HISTORY": "تاريخ" + "STAKES_HISTORY": "تاريخ", + "SETTLEMENT_NOTICE_TITLE": "مستعمرة:", + "REVIEW_PROGRESS_ACTIVE_LINK": "صفحة الرهانات النشطة", + "STAKING": "أساسيات المراهنة 101", + "SLASHING": "التقطيع", + "MINIMUM_AMOUNT_ALLOWED": "الحد الأدنى للمبلغ المسموح به في مجموعة الرهان هو", + "MAXIMUM_AMOUNT_ALLOWED": "الحد الأقصى المسموح به لمبلغ مجموعة الرهان هو", + "DAYS": "أيام", + "CONFIRM_STAKE_DECS": "ها نحن!", + "DO_YOU_UNDERSTAND": "هل تفهم؟", + "SUCCESSFULLY_STAKED_IN": "تم الرهان بنجاح", + "SUCCESSFULLY_STAKED": "تم الرهان بنجاح", + "VIEW_ACTIVE_STAKES": "عرض الرهانات النشطة", + "REVIEW_AND_UNSTAKE": "المراجعة والإزالة", + "NO_REWARD": "لا يوجد مبلغ مكافأة لتلقيه", + "SUCCESSFULLY_UNSTAKED": "لقد نجحت في إلغاء الرهان", + "MIN": "الحد الأدنى", + "UNSTAKING": "إلغاء التثبيت...", + "UNSTAKED": "غير موثق", + "TOOLTIP": "العقوبة التي ستتحملها إذا قمت بإلغاء الرهان مبكرًا جدًا. {0}" }, "CURRENCY": "عملة", "TYPE": "نوع", @@ -839,7 +902,31 @@ "WITHDRAWAL_CONFIRM_BUTTON": "تأكيد السحب", "MESSAGE_FEE_COIN": "رسوم المعاملات بقيمة {0}", "WITHDRAWALS_FORM_ERROR_TITLE": "معلومات النقل غير صحيحة", - "WITHDRAWALS_FORM_ERROR": "لقد فشل تحويل الأموال الخاص بك. يتطلب إرسال الأموال إلى البريد الإلكتروني أن يكون لدى المستخدم حساب داخل هذا التبادل. تأكد من صحة البريد الإلكتروني ويرجى المحاولة مرة أخرى." + "WITHDRAWALS_FORM_ERROR": "لقد فشل تحويل الأموال الخاص بك. يتطلب إرسال الأموال إلى البريد الإلكتروني أن يكون لدى المستخدم حساب داخل هذا التبادل. تأكد من صحة البريد الإلكتروني ويرجى المحاولة مرة أخرى.", + "WITHDRAW": "ينسحب", + "REMOVE_TAG_NOTE_1": "لقد قمت بتحديد خيار إزالة العلامة (المعروفة أيضًا باسم المذكرة والمعرف الرقمي والملصق والملاحظات)", + "REMOVE_TAG_NOTE_2": "تتطلب معظم البورصات والمحافظ والمنصات الأخرى علامة. {0} {1}", + "REMOVE_TAG_NOTE_3": "يرجى التحقق مرة أخرى", + "REMOVE_TAG_NOTE_4": "متطلبات العلامة.", + "BACK_BTN": "خلف", + "REMOVE_TAG": "نعم، قم بإزالة العلامة", + "GENERATE_DEPOSIT_TEXT_1": "لم يتم الكشف عن عنوان الإيداع", + "GENERATE_DEPOSIT_TEXT_2": "إنشاء واحد أدناه:", + "WITHDRAW_ADDRESS": "عنوان السحب", + "WITHDRAW_EMAIL_ADDRESS": "بريد إلكتروني للانسحاب", + "WARNING": "تحذير", + "WARNING_DEPOSIT_INFO_1": "لتلقي هذا الوديعة، مطلوب كل من العنوان والعلامة.", + "WARNING_DEPOSIT_INFO_2": "قد يؤدي إدخال تفاصيل غير صحيحة إلى خسارة دائمة للأموال أو تأخيرات كبيرة.", + "WARNING_WITHDRAW_INFO_1": "عند سحب هذا الأصل، تأكد من ملء جميع الحقول المطلوبة بشكل صحيح.", + "WARNING_WITHDRAW_INFO_2": "التفاصيل غير الصحيحة يمكن أن تؤدي إلى خسارة دائمة للأموال أو تأخيرات كبيرة.", + "METHOD_FIELD_LABEL": "اختر الطريقة", + "SELECT": "يختار", + "ENTER_AMOUNT": "أدخل المبلغ", + "REMOVE_TITLE": "إزالة العلامة", + "MAX_AMOUNT_WARNING_INFO": "هذا المبلغ يتجاوز الحد الأقصى للسحب الخاص بك.", + "MIN_AMOUNT_WARNING_INFO": "الحد الأدنى لمبلغ السحب هو {0}", + "ZERO_BALANCE": "ليس لديك رصيد متاح كافي.", + "NEW_ADDRESS": "عنوان جديد" }, "WALLET_BUTTON_BASE_DEPOSIT": "الوديعة", "WALLET_BUTTON_BASE_WITHDRAW": "سحب", @@ -1118,7 +1205,9 @@ "VOLUME_7D": "7D Volume", "VIEW_VERIFICATION": "عرض التحقق", "EARN_COMMISSION": "كسب العمولات", - "ID_VERIFICATION": "التحقق من الهوية:" + "ID_VERIFICATION": "التحقق من الهوية:", + "WALLET_FUNDING": "تمويل المحفظة", + "MAKE_A_DEPOSIT": "قم بإيداع" }, "REFERRAL_LINK": { "TITLE": "ادعو صديقك", @@ -1129,7 +1218,85 @@ "VIEW": "منظر", "TABLE_TITLE": "جميع الإحالات الناجحة", "USER": "البريد الالكتروني للمستخدم", - "TIME": "وقت التسجيل" + "TIME": "وقت التسجيل", + "CODE": "شفرة", + "EARNING": "قيمة الأرباح", + "HISTORY_DESCRIPTION": "حدد تواريخ محددة لجلب بيانات سجل الإحالة الخاص بك", + "START_DATE": "تاريخ البدء", + "SELECT_START_DATE": "حدد تاريخ البدء", + "END_DATE": "تاريخ النهاية", + "SELECT_END_DATE": "حدد تاريخ النهاية", + "BACK": "خلف", + "PROCEED": "يتابع", + "INVITE_LINK": "رابط دعوة الإحالة", + "MIN_TO_SETTLE": "الحد الأدنى للمبلغ المطلوب تسويته", + "BACK_LOWER": "خلف", + "EARNINGS": "الأرباح", + "EARNINGS_DESCRIPTION": "الأرباح التي تم إنشاؤها بمرور الوقت من جميع المستخدمين المحالين إليك.", + "NO_DATA_TO_DISPLAY": "لا توجد بيانات لعرضها لهذه الفترة", + "TOTAL_EARNT": "مجموع المكاسب", + "UNREALIZED_EARNINGS": "أرباح الرسوم غير المحققة", + "SETTLE_FEES": "تسوية الرسوم", + "ALL": "الجميع", + "WEEK": "أسبوع", + "MONTH": "شهر", + "MONTHS": "شهور", + "CUSTOM": "مخصص", + "USERS_LIST": "قائمة تسجيل المستخدمين", + "USERS_LIST_DESC": "أفضل المستخدمين الذين قمت بإحالتهم والأرباح التي حققوها لك.", + "DATA_COLLECTION": "تم جمع بيانات الجدول أدناه بدءًا من {0}.", + "TIME_OF_SETTLEMENT": "وقت التسوية", + "CREATION_DATE": "تاريخ الإنشاء", + "REFERRAL_COUNT": "عدد الإحالات", + "YOUR_EARNING_RATE": "معدل الربح:", + "DISCOUNT_GIVEN": "الخصم الممنوح:", + "LINK": "وصلة", + "CREATE_REFERRAL_LINK": "إنشاء رمز/رابط إحالة جديد", + "CREATE_UNIQUE_REFERRAL": "قم بإنشاء رابط إحالة فريد باستخدام رمز يمكنك مشاركته وكسب دخل سلبي من خلاله.", + "REFERRAL_CODE": "كود الإحالة / الرابط:", + "EXAMPLE": "مثال:", + "NO_SPECIAL": "(لا توجد أحرف خاصة ومسافات)", + "NEXT": "التالي", + "EARNING_DISCOUNT": "الأرباح مقابل معدل الخصم", + "DESCRIPTION": "شارك أرباحك عن طريق إضافة خصم إلى رابط الإحالة الخاص بك. سيتم تطبيق هذا الخصم على رسوم التداول لأصدقائك المحالين.", + "DISCOUNT_RATION": "نسبة الخصم:", + "DISCOUNT_GIVEN_TO_FRIEND": "خصم مقدم لصديقك:", + "REVIEW_AND_CONFIRM": "المراجعة والتأكيد", + "PLEASE_CHECK_BELOW": "يرجى التحقق بعناية والتأكد مما يلي:", + "DISCOUNT_RATIO": "نسبة الخصم:", + "CONFIRM": "يتأكد", + "LINK_CREATED": "تم إنشاء الرابط بنجاح!", + "DESCRIPTION_2": "للبدء في كسب المال، ما عليك سوى مشاركة الرابط أدناه مع أصدقائك:", + "REFERRAL_LINK": "رابط الإحالة:", + "COPY": "ينسخ", + "OKAY": "تمام", + "EARNING_SETTLEMENT": "تسوية أرباح الإحالة", + "DO_YOU_WANT_TO_SETTLE": "هل تريد تسوية كافة أرباحك الآن؟", + "SETTLE": "يستقر", + "EARNING_DESC": "يتم توليد الأرباح بمرور الوقت من جميع أنشطة التداول التي يقوم بها المستخدمون المحالون إليك.", + "VIEW_HISTORY": "عرض تاريخ المكاسب.", + "DATA_COLLECTED": "البيانات التي تم جمعها ابتداءً من:", + "DATA_DESC": "للحصول على أحدث تقرير للأرباح، يرجى", + "SETTLE_HERE": "قم بتسوية أرباحك هنا.", + "EARNT": "مجموع المكاسب:", + "UNSETTLED": "أرباح غير مستقرة:", + "INVITE_LINKS": "روابط دعوة الإحالة الخاصة بك", + "INVITE_LINKS_DESC": "قم بمشاركة الرابط أدناه مع الأصدقاء لبدء كسب العمولات على تداولاتهم:", + "CREATE_LINK": "إنشاء رابط إحالة جديد", + "NO_LINK": "لم تقم بإنشاء أي روابط إحالة بعد.", + "SETTLEMENT_SUCCESS": "تم التسوية بنجاح!", + "ALL_EVENTS": "جميع أحداث التسوية", + "EVENTS_DESC": "فيما يلي جميع أحداث تسوية الأرباح من الإحالات المدعوة الخاصة بك.", + "REFERRAL_CODE_ZERO": "الرجاء إدخال الرمز", + "REFERRAL_EARNINGS": "أرباح الإحالة", + "DISCOUNT_HOVER_CONTENT": "إن إضافة خصم إلى الرابط الخاص بك يمكن أن يساعد في تشجيع التسجيلات، وتعزيز نشاط التداول، وقد يعزز الدخل السلبي الناتج عن رابط الإحالة الخاص بك.", + "REFERRAL_INFO": "معلومات الإحالة والأرباح", + "BACK_TO_SUMMARY": "إلى صفحة الملخص", + "INSUFFICIENT_LABEL": "مبلغ التسوية غير كاف", + "INSUFFICIENT_INFO_1": "أرباحك غير كافية حاليًا للتسوية. يُرجى دعوة المزيد من الأعضاء باستخدام رابط الإحالة الخاص بك والانتظار حتى يتم تسوية أرباحك غير المستقرة {0} {1}", + "INSUFFICIENT_INFO_2": "تجاوز 1", + "GO_TO_REFERRAL": "انتقل إلى الإحالة", + "REFER_DESC": "شارك الرابط أدناه مع الأصدقاء لبدء كسب العمولات على تداولاتهم" }, "NOT_LOGGEDIN": { "TXT_1": "لبدء التداول يجب عليك تسجيل الدخول", @@ -1207,7 +1374,11 @@ "TRADING_SYMBOL": "رمز التداول", "ASSET": "أصل", "TYPE": "يكتب", - "SOURCE": "مصدر" + "SOURCE": "مصدر", + "PERCENTAGE": "% {0}", + "24H": "24 ساعة", + "TREND_7D": "الاتجاه 7D", + "BUY": "شراء {0} {1}" }, "TRADE_TOOLS": "أدوات", "NO_ACTIVE_TRADES": "يبدو أنه لا توجد أي صفقات حتى الآن", @@ -1360,7 +1531,10 @@ "COMPLETED_TOOLTIP": "الحصة ناضجة. استمر في التوقيع المساحي لكسب المزيد من المكافآت أو قم بإلغاء الرهان للمطالبة بالمكافآت.", "CONNECT_ERROR": "يرجى التحقق من محفظتك", "INSTALL_METAMASK_DETAILS": { "TITLE": "تثبيت ميتا ماسك", "PROMPT": "يجب عليك تثبيت Metamask في متصفحك: {0}" }, - "INSTALL_METAMASK_TITLE": "لم يتم الكشف عن MetaMask" + "INSTALL_METAMASK_TITLE": "لم يتم الكشف عن MetaMask", + "EARN_REWARD": "احصل على مكافآت مقابل وضع أصولك الرقمية في المحفظتك", + "DEFI_STAKING": "المشاركة في DeFi", + "CEFI_STAKING": "التوقيع المساحي لـ CeFi" }, "UNSTAKE": { "TITLE": "غير مستقر", @@ -1683,7 +1857,19 @@ "SELECT_END_DATE": "حدد تاريخ الانتهاء", "CUSTOM": "مخصص", "BACK_CUSTOM": "خلف", - "PROOCED_CUSTOM": "تم إجراؤه" + "PROOCED_CUSTOM": "تم إجراؤه", + "PL_DAYS": "الربح والخسارة اليومية", + "DAY": "يوم", + "VIEW_MORE": "عرض المزيد {0}", + "SHOW_ASSET_BREAKDOWN": "إظهار تفاصيل الأصول", + "PL_SUMMARY": "P&L Summary", + "BALANCE_HISTORY": "تاريخ الرصيد", + "PERCENTAGE": "نسبة مئوية", + "WALLET_BALANCE_ESTIMATE": "تقدير رصيد المحفظة اليوم", + "VIEW_BALANCE_HISTORY": "عرض سجل الرصيد", + "VIEW_PERCENTAGE_SHARE": "عرض نسبة المشاركة", + "VIEW_WALLET_P&L": "عرض محفظة الأرباح والخسائر", + "BALANCE_PERCENTAGE": "نسبة الرصيد" }, "ASSET_INFO": "معلومات الأصول", "TAKER_FEES_APPLIED": "يتم تطبيق رسوم المتلقي", @@ -1701,7 +1887,18 @@ "ORDERBOOK": "سجل الطلبيات", "NETWORK": "وسيط الشبكة خارج البورصة", "BROKER": "وسيط محلي خارج البورصة", - "BROKERAGE": "غير متاح - (الوساطة)" + "BROKERAGE": "غير متاح - (الوساطة)", + "LOADING_PRICES": "جاري تحميل الأسعار...", + "INPUT_LABEL": "أدخل اسم الأصل أو الرمز", + "HIGHLIGHTS": "أبرز الأحداث", + "MOBILE_DESC": "حدد السوق أدناه لبدء التداول.", + "PRICE_24H": "السعر/24 ساعة %", + "CARDS": { + "GAINERS": "الرابحون", + "LOSERS": "الخاسرون", + "MARKET_CAP": "القيمة السوقية", + "24H": "{0} 24 ساعة" + } }, "HOLLAEX_TOKEN": { "REMOVE_FAVOURITES": "إزالة من المفضلة", @@ -1726,12 +1923,29 @@ }, "LIST": "هل تريد إدراج أصولك الرقمية؟", "WEBSITE": "موقع إلكتروني", - "EXPLORER": "إكسبلورر" + "EXPLORER": "إكسبلورر", + "PRO_TRADE": "عرض {0} السوق" }, "ACCORDIAN": { "ACCORDIAN_ASSETS": "جميع أصول المحفظة", "ACCORDIAN_INFO": "صفحة معلومات الأصول", - "ACCORDIAN_HISTORY": "تاريخ" + "ACCORDIAN_HISTORY": "تاريخ", + "DEPOSIT": "إيداع", + "VOLUME": "مقدار", + "WITHDRAW": "ينسحب", + "SELECT_ASSET": "حدد الأصول:", + "SELECT_NETWORK": "حدد الشبكة:", + "DESTINATION": "وجهة:", + "AMOUNT": "كمية:", + "ESTIMATED": "قيمة السحب المقدرة", + "TRANSACTION_FEE": "رسوم المعاملة المراد إضافتها:", + "SCAN": "مسح ضوئي", + "ADDRESS": "عنوان:", + "OPTIONAL_TAG": "العلامة (اختياري)", + "TAG": "العلامة:", + "DISABLED_DEPOSIT_CONTENT": "وظيفة الإيداع غير متاحة مؤقتًا.", + "DISABLED_WITHDRAW_CONTENT": "وظيفة السحب غير متاحة مؤقتًا.", + "DEPOSIT_LABEL": "إيداع" }, "ASYNC_LINK": { "TITLE": "الصفحة لا تفتح تلقائيا؟", @@ -1858,5 +2072,587 @@ "CONFIRM": "يتأكد" } } + }, + "CANCEL_WITHDRAWAL_ADDRESS": "عنوان السحب", + "BALANCES": "الأرصدة", + "CUSTOM_NATIVE_CURRENCY": "العملة (تقديرات الأسعار وقيمة الأصول)", + "ADDRESS_BOOK": { + "ADDRESS_BOOK_LABEL": "دفتر العناوين", + "ADDRESS_BOOK_DESC_1": "أضف عنوان السحب المدرج في القائمة البيضاء إلى دفتر العناوين الشخصي الخاص بك", + "ADDRESS_BOOK_DESC_2": "سيكون بإمكانك استخدام هذه العناوين بسهولة عند السحب.", + "ADD_ADDRESS_LINK": "إضافة عنوان", + "ADD_WITHDRAW_ADDRESS": "إضافة عنوان السحب", + "DATE_ADDED": "تاريخ الإضافة", + "REMOVE": "يزيل", + "NO_LINK": "لم يتم إضافة عنوان السحب بعد.", + "ADD_WITHDRAW_ADDRESS_DESC_1": "أضف عنوانًا مدرجًا في القائمة البيضاء حتى تتمكن من سحب العملات إليه بأمان.", + "ADD_WITHDRAW_ADDRESS_DESC_2": "يجب أن يكون عنوان السحب هذا عنوانًا تحت سيطرتك.", + "NAME_YOUR_ADDRESS_TITLE": "قم بتسمية عنوانك", + "NAME_YOUR_ADDRESS_DESC": "أعط عنوان السحب هذا اسمًا للرجوع إليه في المستقبل.", + "USER_LABEL": "الاسم/التسمية:", + "USER_FIELD_PLACEHOLDER": "قم بتسمية عنوان السحب هذا", + "CHECK_AND_CONFIRM": "التحقق والتأكيد", + "WARNING_ADDRESS": "قبل إضافة هذا العنوان إلى دفتر العناوين الخاص بك، يرجى أن تأخذ الوقت الكافي للتحقق والتأكد من صحة التفاصيل:", + "ENSURE_DESC": "تأكد من أن العنوان صحيح وتحت سيطرتك.", + "ADDRESSES": "العناوين", + "WITHDRAWAL_ADDRESS_BOOK": "دفتر عناوين السحب", + "ADD_ADDRESS_DESC": "أضف عنوان السحب إلى {0}", + "ADDRESS_BOOK": "دفتر العناوين", + "MANAGE_ADDRESS_BOOK": "إدارة دفتر العناوين", + "VIEW_ADDRESS_BOOK_LABEL": "عرض دفتر العناوين", + "ADD_WITHDRAWAL_ADDRESS_LINK": "إضافة عنوان السحب", + "REVOKE_ADDRESS": "تم إزالة عنوانك", + "REMOVE_ADDRESS": "إزالة العنوان", + "REMOVE_CONTENT": "هل تريد إزالة عنوان السحب هذا من دفتر العناوين الخاص بك؟" + }, + "P2P": { + "I_WANT_TO_BUY": "أريد أن أشتري", + "I_WANT_TO_SELL": "أريد أن أبيع", + "SPEND_FIAT_CURRENCY": "اختر العملة الورقية", + "AMOUNT": "كمية", + "PAYMENT_METHOD": "طريقة", + "AVAILABLE_REGIONS": "المناطق المتاحة", + "VENDOR": "بائع", + "PRICE_LOWEST_FIRST": "السعر (الأقل أولاً)", + "LIMIT_AVAILABLE": "الحد الأقصى/متاح", + "PAYMENT": "قسط", + "TRADE": "تجارة", + "SELECT_PAYMENT_METHOD": "اختر الطريقة", + "SPEND_AMOUNT": "مبلغ الإنفاق", + "P2P_METHODS": "طرق الدفع من نظير إلى نظير", + "PAYMENT_METHODS": "طرق الدفع", + "PAYMENT_METHODS_DEC": "يمكنك بيع العملات المشفرة واستلام المدفوعات بالعملة الورقية عن طريق إضافة تفاصيل حساب الدفع الشخصي الخاص بك، مثل معلومات البنك أو طرق الدفع المحلية الأخرى. تأكد من أن الاسم المرتبط بحساب الدفع الخاص بك يتطابق مع الاسم الموجود في تفاصيلك التي تم التحقق منها قبل إضافة معلومات الدفع الخاصة بك.", + "SELL_AMOUNT": "بيع المبلغ", + "AMOUNT_TO_RECEIVE": "المبلغ المطلوب استلامه", + "ORDER_CREATED": "تم إنشاء الطلب.", + "ADD_PAYMENT_METHOD": "+ أضف طريقة الدفع", + "SELECT_PAYMENT_METHOD_AND_AMOUNT": "الرجاء تحديد الطريقة وإدخال مبلغ الإنفاق", + "ERROR_MESSAGE": "حدث خطأ.", + "TRANSACTION_NOT_FOUND": "لم يتم العثور على المعاملة", + "TITLE": "عروض P2P", + "DESCRIPTION": "صفقات P2P لشراء وبيع Bitcoin وUSDT والعملات المشفرة الأخرى.", + "TAB_P2P": "نظير إلى نظير", + "TAB_ORDERS": "طلبات", + "TAB_PROFILE": "حساب تعريفي", + "TAB_POST_DEAL": "بعد الصفقة", + "TAB_MY_DEALS": "عروضي", + "NO_DEALS": "لا توجد صفقات", + "NUM_DEALS": "العروض:", + "CHANGES_SAVED": "تم حفظ التغييرات", + "ACTIVATE": "فعل", + "TAKE_OFFLINE": "افصل عن الانترنت", + "REMOVE": "يزيل", + "DYNAMIC": "متحرك", + "TYPE": "يكتب", + "EDIT": "يحرر", + "SIDE": "جانب", + "STATUS": "حالة", + "PRICE_DISPLAYED": "السعر المعروض", + "EDIT_DEAL": "تعديل الصفقة", + "ACTIVE": "نشيط", + "INACTIVE": "غير نشط", + "AVAILABLE": "متاح", + "LIMIT": "حد", + "EDIT_DEAL_BUTTON": "تعديل الصفقة", + "APPEAL_TRANSACTION": "استئناف هذه المعاملة", + "ENTER_REASON": "أدخل السبب الذي يجعلك تستأنف هذه المعاملة", + "CANCEL": "يلغي", + "OKAY": "تمام", + "APPEALED_TRANSACTION": "لقد قمت باستئناف المعاملة، اتصل بالدعم لحل مشكلتك", + "SUBMIT_FEEDBACK": "إرسال تعليقات على هذه المعاملة", + "INPUT_FEEDBACK": "أدخل تعليقك", + "SELECT_RATING": "حدد التقييم", + "FEEDBACK_SUBMITTED": "تم تقديم التعليقات", + "PROCEED": "يتابع", + "BACK_TO_ORDERS": "الى الطلبات", + "ORDER": "طلب", + "BUY_COIN": "يشتري", + "SELL_COIN": "يبيع", + "TRANSACTION_ID": "معرف المعاملة:", + "AMOUNT_TO": "المبلغ إلى", + "SELL": "يبيع", + "RELEASE": "يطلق", + "SEND": "يرسل", + "REQUIRED_FLAT_TRANSFER_AMOUNT": "(مبلغ التحويل النقدي المطلوب)", + "PRICE": "سعر", + "PER_COIN": "(للعملات المعدنية)", + "RECEIVING_AMOUNT": "مبلغ الاستلام", + "SPENDING_AMOUNT": "(المبلغ الذي سوف تتلقاه)", + "BUYING_AMOUNT": "(المبلغ الذي سوف تتلقاه)", + "FEE": "مصاريف", + "TRANSFER_DETAILS": "تفاصيل النقل", + "PAYMENT_INSTRUCTIONS": "إليك طريقة الدفع المحددة، تحويل الأموال إلى البائع. بعد تحويل الأموال بنجاح، يرجى النقر فوق \"تأكيد\" أدناه لإخطار البائع", + "PAYMENT_ACCOUNT": "فيما يلي حساب الدفع وطريقة الدفع المشتركة مع المشتري.", + "EXPECTED_TIME": "الوقت المتوقع حتى يتم إصدار الأموال: 30 دقيقة", + "PAYMENT_TIME": "يرجى إجراء الدفع في الوقت المحدد أعلاه.", + "ORDER_CANCELLED": "سيتم إلغاء الطلب خلاف ذلك", + "AUTO_RESPONSE_LIMIT": "يجب ألا يتجاوز نص الرد التلقائي 240 حرفًا", + "TERMS_RESPONSE_LIMIT": "يجب ألا تزيد الشروط عن 240 حرفًا", + "FUNDS_CREDITED": "بمجرد إصدار الأموال، ستجد الأموال مُضافة إلى محفظة التمويل الخاصة بك", + "VENDOR_CANCELLED": "قام البائع بإلغاء الطلب، ولن يكون هناك تحويل للأموال، إذا كنت تعتقد أن هذا خطأ، يرجى الاتصال بالدعم", + "ORDER_COMPLETE": "تم إكمال الطلب", + "FUNDS_TRANSFERRED": "لقد أكد البائع المعاملة وتم تحويل الأموال إلى رصيدك.", + "FUNDS_TRANSFERRED_USER": "أكد المستخدم المعاملة وتم تحويل الأموال إلى رصيدك.", + "GO_DEPOSIT": "انتقل إلى ودائعك", + "GO_WITHDRAWALS": "انتقل إلى سحوباتك", + "VENDOR_APPEALED": "تم تقديم استئناف على المعاملة من قبل البائع، يرجى الاتصال بالدعم مع معرف المعاملة لحل المشكلة", + "USER_APPEALED": "لقد قمت باستئناف المعاملة، يرجى الاتصال بالدعم باستخدام معرف المعاملة لحل المشكلة", + "ORDER_COMPLETE_VENDOR": "لقد قمت بوضع علامة على هذا الطلب باعتباره مكتملًا وقمت بتحرير الأموال", + "PAYMENT_NOT_SENT": "لم يرسل المشتري الدفعة بعد. بمجرد استلام الدفعة، سيتم إعلامك هنا.", + "CONFIRM_AND_RELEASE": "يرجى التأكيد وإطلاق أموال التشفير للمشتري أدناه بمجرد اكتمالها", + "TRANSACTION_CANCELLED": "تم إلغاء الصفقة من قبل المشتري", + "BUYER_CONFIRMED": "أكد المشتري الدفع", + "CHECK_AND_RELEASE": "يرجى التأكد من إرسال الدفعة من المشتري وتأكيد وإطلاق الأموال أدناه.", + "APPEAL": "جاذبية", + "CANCEL_ORDER": "إلغاء الطلب", + "CONFIRM_AND_RELEASE_CRYPTO": "تأكيد وإصدار التشفير", + "CONFIRMED_TRANSACTION": "لقد قمت بتأكيد المعاملة", + "CHAT_WITH_VENDOR": "الدردشة مع البائع", + "CHAT_WITH_USER": "الدردشة مع المشتري", + "VENDOR_NAME": "اسم البائع:", + "USER_NAME": "اسم المشتري:", + "ORDER_INITIATED_VENDOR": "تم البدء في الطلب من قبل", + "CONFIRM_PAYMENT_VENDOR": "يرجى التواصل مع المشتري لتأكيد هذه الصفقة.", + "ORDER_INITIATED": "لقد قمت ببدء وإنشاء طلب باستخدام", + "CONFIRM_PAYMENT": "يرجى التواصل مع البائع لتأكيد الدفع الوارد.", + "YOU": "أنت", + "BUYER": "المشتري", + "SEND_UPPER": "يرسل", + "CONFIRM_TRANSFER": "تأكيد التحويل وإخطار البائع", + "CONFIRM_TRANSFER_USER": "تأكيد النقل وإخطار المستخدم", + "PROCESSING": "يعالج", + "ALL_ORDERS": "جميع الطلبات", + "TYPE_COIN": "النوع/العملة", + "FIAT_AMOUNT": "مبلغ فيات", + "CRYPTO_AMOUNT": "كمية التشفير", + "COUNTERPARTY": "الطرف المقابل", + "OPERATION": "عملية", + "VIEW_ORDER": "عرض الطلب", + "USER": "مستخدم", + "COMMENT": "تعليق", + "RATING": "تصنيف", + "BUYER_PAID_ORDER": "قام المشتري بوضع علامة على هذا الطلب باعتباره مدفوعًا. في انتظار البائع للتحقق والتأكيد وإطلاق الأموال.", + "BUYER_SENT_FUNDS": "لقد أبلغت البائع بأنك أرسلت الأموال. يرجى انتظار رد من البائع.", + "BUYER_SENT_FUNDS_USER": "لقد قمت بإخطار المستخدم بأنك قمت بإرسال الأموال. يرجى انتظار الرد من المستخدم.", + "ORDER_EXPIRED": "انتهى هذا الطلب بسبب عدم النشاط في الوقت المحدد.", + "BUYER_CANCELLED_ORDER": "لقد قام المشتري بإلغاء هذا الطلب، وتم إغلاق المعاملة.", + "BUYER_APPEALED_ORDER": "لقد استأنف المشتري هذا الطلب، يرجى الاتصال بالدعم لحل المشكلة.", + "VENDOR_CONFIRMED_ORDER": "أكد البائع المعاملة وأفرج عن الأموال.", + "VENDOR_CONFIRMED_ORDER_USER": "أكد المستخدم المعاملة وأفرج عن الأموال.", + "ORDER_CLOSED": "تم إغلاق الطلب بعد التوصل إلى حكم بشأن طلب الاستئناف.", + "VENDOR_CANCELLED_ORDER": "لقد قام البائع بإلغاء هذا الطلب، وتم إغلاق المعاملة.", + "VENDOR_APPEALED_ORDER": "لقد استأنف البائع هذا الطلب، يرجى الاتصال بالدعم لحل المشكلة.", + "SET_TYPE_PRICE": "حدد النوع والسعر", + "SET_AMOUNT_PAYMENT_METHODS": "حدد المبلغ الإجمالي وطرق الدفع", + "SET_TERMS_RESPONSE": "تعيين الشروط والاستجابة التلقائية", + "UPDATE_DEAL": "تحديث الصفقة", + "SELL_UPPER": "يبيع", + "BUY_UPPER": "يشتري", + "CRYPTO_WANT_TO_SELL": "العملة المشفرة التي تريد بيعها", + "CRYPTO_WANT_TO_BUY": "العملة المشفرة التي تريد شراءها", + "RECEIVE": "يستلم", + "FIAT_CURRENCY_WANT_TO_RECEIVE": "العملة الورقية لاستلامها", + "FIAT_CURRENCY_WANT_TO_SPEND": "العملة الورقية للإنفاق", + "PRICE_UPPER": "سعر", + "STATIC": "ثابت", + "FIXED_PRICE": "سعر ثابت", + "SPREAD_PERCENTAGE": "الانتشار (٪)", + "PRICE_PROFIT_SPREAD_SET": "السعر وفارق الربح لتحديد", + "UNIT_PRICE": "سعر وحدة USDT", + "PRICE_ADVERTISE": "السعر الذي ستعلن عنه {0}", + "TOTAL_AMOUNT": "المبلغ الإجمالي", + "BUY_SELL_DESC": "يمكنك {0}", + "BUY_ORDER_LIMITS": "حدود أوامر الشراء", + "SELL_ORDER_LIMITS": "حدود أوامر البيع", + "MIN_MAX_ORDER_VALUE_1": "الحد الأدنى والحد الأقصى {0} {1}", + "MIN_MAX_ORDER_VALUE_2": "قيمة أمر الشراء", + "MIN_MAX_ORDER_VALUE_3": "قيمة أمر البيع", + "PAYMENT_METHODS_SEND_FIAT": "طرق الدفع لإرسال الأموال بالعملة الورقية", + "PAYMENT_METHODS_RECEIVE_FIAT": "طرق الدفع لاستلام العملة الورقية", + "SELECT_PAYMENT_METHODS_1": "حدد ما يصل إلى", + "SELECT_PAYMENT_METHODS_2": "طرق ل", + "REGION": "منطقة", + "SELECT_REGION": "حدد منطقتك التي سيتم إدراج الصفقة الخاصة بك ضمنها", + "TERMS": "شروط", + "TERMS_CONDITIONS_DEAL": "الشروط والأحكام لهذه الصفقة", + "FIRST_RESPONSE": "الرد الأول", + "CHAT_RESPONSE": "استجابة الدردشة التي سيراها الطرف الآخر عند دخول غرفة الصفقات P2P", + "BACK_UPPER": "خلف", + "PLEASE_FILL_INPUTS": "يرجى ملء جميع المدخلات", + "DEAL_EDITED": "تم تعديل الصفقة", + "DEAL_CREATED": "تم إنشاء الصفقة", + "NEXT": "التالي", + "ADD_PAYMENT_METHOD_DETAILS": "{0} تفاصيل طريقة الدفع", + "COMPLETE": "مكتمل", + "STEP_SET_TYPE_PRICE": "حدد النوع والسعر", + "STEP_SET_TOTAL_AMOUNT_PAYMENT_METHODS": "حدد المبلغ الإجمالي وطرق الدفع", + "STEP_SET_TERMS_AUTO_RESPONSE": "تعيين الشروط والاستجابة التلقائية", + "NO": "لا", + "CANCEL_WARNING": "هل أنت متأكد أنك تريد إلغاء هذا الطلب؟", + "CONFIRM_WARNING": "هل أنت متأكد أنك تريد تأكيد هذا الطلب؟", + "RELEASE_WARNING": "هل أنت متأكد أنك تريد إصدار هذا الطلب؟", + "ALL": "الجميع", + "ANONYMOUS": "مجهول", + "TERMS_CONDITIONS": "الشروط والأحكام", + "PAYMENT_TIME_LIMIT_LABEL": "مهلة الدفع: {0}", + "30_MINUTES": "30 دقيقة", + "AMOUNT_SEND_RELEASE": "(كمية العملات المشفرة التي ستبيعها وتصدرها)", + "MINUTES": "دقائق", + "EDIT_UPPERCASE": "يحرر", + "DELETE_UPPERCASE": "يمسح", + "DATE": "تاريخ", + "DISPLAY_NAME": "اسم العرض", + "TOTAL_ORDERS": "مجموع الطلبات", + "COMPLETION_RATE": "معدل الإنجاز", + "POSITIVE_FEEDBACK": "ردود الفعل الإيجابية", + "POSITIVE": "إيجابي", + "NEGATIVE": "سلبي", + "NO_FEEDBACK": "لم يتم العثور على أي تعليق", + "INPUT_FIAT_AMOUNT": "إدخال مبلغ نقدي", + "SELECT_FIAT": "اختر فيات", + "ALL_PAYMENT_METHODS": "جميع طرق الدفع", + "ALL_REGION": "جميع المناطق", + "BUYER_NOT_MADE_THE_PAYMENT": "لم يؤكد المشتري دفعه بعد.", + "PRICE_TO_ADVERTISE": "السعر الذي ستعلن عنه للبيع", + "VIEW_PROFILE": "عرض الملف الشخصي للبائع", + "CLICK_TO_VIEW": "انقر للعرض", + "NEW_MESSAGE": "لقد تلقيت رسالة P2P", + "STATUS_UPDATE": "لديك تحديث بشأن طلبك P2P", + "APPEAL_STATUS_MESSAGE": "لقد تم استئناف طلبك P2P", + "CANCEL_STATUS_MESSAGE": "لقد تم إلغاء طلبك P2P", + "CONFIRM_STATUS_MESSAGE": "لقد تم تأكيد طلبك P2P", + "NEW_ORDER_CREATED": "تم إنشاء طلب P2P جديد", + "CRYPTO_RELEASE_STATUS_MESSAGE": "تم إصدار العملة المشفرة من الطلب", + "ADDITIONAL_PAYMENT_DETAILS": "أضف تفاصيل الدفع الإضافية", + "PAYMENT_FIELD_INFO": "حقل الدفع الجديد هذا إضافي وينبغي أن يساعد المشاركين في نظام P2P في تحويلات العملة الورقية الخاصة بهم. يجب أن تكون هذه تفاصيل الحساب المتعلقة بطريقة الدفع. قد تتضمن أرقام الهواتف وأسماء المستخدمين وأرقام الحسابات الفريدة والمعلومات الضرورية الأخرى للمعاملات حسب نظام طرق الدفع.", + "PAYMENT_DETAIL_NAME": "اسم تفاصيل الدفع", + "REQUIRED_OR_OPTIONAL": "مطلوب أو اختياري", + "CREATE_NEW_PAYMENT_METHODS": "إنشاء وإضافة طرق دفع جديدة", + "MANUAL_PAYMENT_METHOD_ENTRY": "لإضافة طريقة دفع إلى منصة P2P الخاصة بك، يمكنك القيام بذلك يدويًا عن طريق إدخال اسم طريقة الدفع وتفاصيل الدفع المطلوبة. على سبيل المثال، يستخدم PayPal عناوين البريد الإلكتروني لإرسال واستقبال الأموال.", + "USERS_PAYMENT_SELECTION": "بمجرد إضافة طريقة الدفع، سيتمكن تجار P2P ومستخدموها من تحديدها وإدخال المعلومات اللازمة عند إجراء المدفوعات أو استلامها. وسيتم مشاركة التفاصيل التي يقدمونها مع الطرف الآخر في معاملة P2P.", + "METHOD_NAME_AND_DETAIL": "اسم الطريقة وتفاصيل الدفع الرئيسية", + "ADD_NEW_PAYMENT_METHODS": "اختر طرق الدفع الجديدة :", + "DETAIL_NAME": "اسم تفاصيل الدفع", + "DETAIL_VALUE": "قيمة تفاصيل الدفع", + "DETAIL_REQUIRED": "مطلوب", + "IMPORTANT_DETAIL": "(تفاصيل الدفع الهامة)", + "DETAIL_OPTIONAL": "خياري", + "OPTIONAL_DETAIL": "(تفاصيل الدفع الاختيارية)", + "ADD_NEW_PAYMENT_FIELD": "إضافة حقل تفاصيل الدفع الجديد", + "PAYMENT_METHOD_CREATED": "تم إنشاء طريقة الدفع! في انتظار التحقق من قبل المشرف", + "PAYMENT_METHOD_DELETED": "تم حذف طريقة الدفع.", + "PAYMENT_METHOD_UPDATED": "تم تحديث طريقة الدفع.", + "CRYPTO": "التشفير:", + "INPUT_SPEND_AMOUNT": "إدخال مبلغ الإنفاق", + "INPUT_SELL_AMOUNT": "إدخال مبلغ البيع", + "TIMES": "مرات", + "FEEDBACK": "تعليق", + "ASSET": "أصل: ", + "CUSTOM": "مخصص", + "CANCELLED": "تم الإلغاء", + "APPEALED": "مستأنف", + "EXPIRED": "منتهي الصلاحية", + "RATE": "معدل:", + "BUYING": "شراء {0}", + "SELLING": "بيع {0}", + "TERMS_AND_CONDITION_DESCRIPTION": "يرجى النشر خلال 15 دقيقة من إبرام الصفقة", + "VISIT_OUR_WEBSITE": "قم بزيارة موقعنا", + "SELECT_PAYMENT_SYSTEM_LABEL": "حدد نظام الدفع", + "FIELD": "مجال", + "NEW_PAYMENT_PLACEHOLDER": "أدخل قيمة تفاصيل الدفع", + "FIELD_VALIDATION_TEXT": "الرجاء إدخال كافة حقول الطريقة", + "INPUT_METHOD_NAME_TEXT": "الرجاء إدخال اسم الطريقة", + "INPUT_PAYMENT_DETAIL_TEXT": "أدخل اسم تفاصيل الدفع", + "UNVERIFIED": "غير مُتحقق", + "VERIFIED": "تم التحقق منه", + "AMOUNT_RECEIVE": "سيتم تحريرها من رصيدك", + "DELETE_WARNING": "هل أنت متأكد أنك تريد حذف طريقة الدفع هذه؟", + "STEP_1": "الخطوة 1/3", + "STEP_2": "الخطوة 2/3", + "STEP_3": "الخطوة 3/3", + "P2P_ORDER_CREATED": "تم إنشاء طلب P2P", + "VENDOR_CHECKS_TITLE": "التحقق وتأكيد الدفع", + "FUND_RELEASED": "الأموال المفرج عنها", + "ORDER_EXPIRY": "انتهاء صلاحية الطلب في", + "MINIMUM_AMOUNT_WARNING": "الحد الأدنى {0} هو {1}", + "MAXIMUM_AMOUNT_WARNING": "الحد الأقصى {0} هو {1}", + "ORDER_CREATION": "إنشاء الطلب", + "ORDER_CREATION_DESC_1": "بالنقر فوق \"إنشاء طلب\"، ستُعلم البائع وستتلقى عرض أسعار فوريًا بالإضافة إلى تفاصيل دقيقة لتحويل الدفع. {0} {1} {2} {3}", + "ORDER_CREATION_DESC_2": "يتضمن هذا المبلغ الدقيق المطلوب لإتمام طلبك.", + "YOU_HAVE_TEXT": "سيكون لديك", + "COMPLETE_PAYMENT_PROCESS": "لإكمال عملية تحويل الدفع.", + "WARINNG_DESC": "يرجى الاستمرار في إنشاء الطلب فقط إذا كنت تنوي حقًا إكمال الطلب.", + "ORDER_CANCEL_DESC": "قد يؤدي إلغاء الطلب إلى تعليق الحساب.", + "CONFIRM_ORDER_CREATION": "عندما تكون مستعدًا {0}، يرجى النقر فوق \"إنشاء طلب\" أدناه.", + "SEND_MONEY": "أرسل المال", + "RECEIVE_MONEY": "تلقي المال", + "CREATE_ORDER": "إنشاء الطلب", + "NO_ORDERS_DESC": "يبدو أنه لا توجد أوامر هنا.", + "NO_DEALS_DESC": "يبدو أنه لا توجد صفقات هنا.", + "ONLINE": "متصل", + "OFFLINE": "غير متصل", + "SELECT_CRYPTO": "اختر العملة المشفرة", + "REMOVE_WARNING": "هل أنت متأكد أنك تريد إزالة هذه الصفقة؟", + "SHOW_FILTERS": "إظهار المرشحات", + "HIDE_FILTERS": "إخفاء المرشحات", + "ORDERS_COMPLETED": "الطلبات المكتملة:", + "CANCEL_WARNING_TEXT": "يرجى ملاحظة أن إلغاء الطلبات بشكل متكرر قد يؤثر سلبًا على ملفك الشخصي العام P2P وقد يؤدي إلى تعليق حسابك.", + "UPDATE": "تحديث", + "TERMS_ERROR_TEXT": "الرجاء إدخال حقل الشروط", + "RESPONSE_ERROR_TEXT": "الرجاء إدخال حقل الاستجابة" + }, + "VOLUME": { + "VOLUME": "مقدار", + "BACK": "خلف", + "MARKETS": "الأسواق", + "CONVERT": "يتحول", + "HISTORY": "تاريخ", + "TRADING_VOLUME": "حجم التداول", + "VOLUME_DECS": "المبالغ المتداولة في حسابك عبر فترات زمنية مختلفة، بالإضافة إلى أفضل 3 أصول تم تداولها في كل فترة", + "ALL_ASSETS": "جميع الأصول", + "DAY_VOLUME": "حجم اليوم", + "HOUR_VOLUME": "حجم 24 ساعة", + "TOP": "الأعلى {0} {1}", + "VOL_ASSET": "د المجلد الأصول", + "NO_DATA_DESC_1": "يبدو أنك لم تقم بأية صفقات حتى الآن. ابدأ التداول الآن لترى نشاطك هنا!", + "NO_DATA_DESC_2": "ابدأ التداول", + "NO_DATA_DESC_3": "الآن لرؤية نشاطك هنا!", + "TRADE_VOLUME": "حجم التجارة", + "VIEW_VOLUME": "عرض الحجم", + "TRADE_DESCRIPTION": "عرض الأصول الأكثر تداولاً", + "MARKET_TABLE_DESC": "قم بزيارة صفحة حجم التداول الخاصة بك {0}" + }, + "MORE_OPTIONS_LABEL": { + "MORE_OPTION_SEARCH_TXT": "ميزة البحث أو الصفحات", + "NO_RESULT_DESC_1": "يبدو أنه لا يوجد أي نتائج لهذا.", + "NO_RESULT_DESC_2": "حاول البحث عن كلمة رئيسية أخرى.", + "ICONS": { + "REFERRALS": "الإحالات", + "BUY_CRYPTO": "شراء العملات المشفرة", + "API": "واجهة برمجة التطبيقات", + "DEFI_STAKE": "حصة ديفي", + "CEFI_STAKE": "حصة سيفي", + "PROFIT_LOSS": "الربح والخسارة", + "LIMITS": "الحدود", + "LOGINS": "تسجيلات الدخول", + "AUDIO": "صوتي" + }, + "HOT_FUNCTION": { + "HOT_FUNCTION_LABEL": "الوظائف الساخنة", + "ADD_FUNDS": "إضافة الأموال", + "TOP_UP": "إعادة التعبئة", + "LOAD": "حمولة", + "CREDIT": "ائتمان", + "FUND_ACCOUNT": "حساب التمويل", + "BTC": "بي تي سي", + "USTD": "usdt", + "ETH": "إيثر", + "USD": "دولار أمريكي", + "XHT": "xht", + "TRANSFER": "تحويل", + "MONEY": "مال", + "FUNDING": "التمويل", + "RECHARGE": "إعادة الشحن", + "REFILL": "إعادة التعبئة", + "CASH_IN": "نقدا في", + "ADD_MONEY": "أضف المال", + "EXCHANGE": "تبادل", + "SWAP": "تبديل", + "BUY_SELL": "شراء/بيع", + "TRADE": "تجارة", + "CONVERT_CURRENCY": "تحويل العملة", + "INVITE": "يدعو", + "REFER": "يشير إلى", + "REWARDS": "المكافآت", + "BONUS": "علاوة", + "AFFILIATION": "انتساب", + "AFFILIATE": "شركة تابعة", + "PASSIVE_INCOME": "الدخل السلبي", + "REVENUE": "ربح" + }, + "OTHER_FUNCTIONS": { + "OTHER_FUNCTIONS_LABEL": "وظائف أخرى", + "INTEGRATION": "اندماج", + "PROGRAMMATIC_ACCESS": "الوصول البرمجي", + "DEVELOPER": "المطور", + "AUTOMATED_TRADING": "التداول الآلي", + "BOT": "بوت", + "ALGO": "شئ ما", + "ALGORITHM": "خوارزمية", + "FIAT": "فيات", + "DOLLAR": "دولار", + "PURCHASE": "شراء", + "BUY_COIN": "شراء العملة", + "BUY_TOKEN": "شراء الرمز", + "YIELD": "أَثْمَر", + "INTEREST": "اهتمام", + "REVENUE": "ربح", + "CENTRALIZED_STAKING": "التخزين المركزي", + "PERFORMANCE": "أداء", + "GAINS": "المكاسب", + "LOSSES": "خسائر", + "PORTFOLIO_PROFIT": "أرباح المحفظة", + "LOSS": "خسارة", + "PNL": "رر", + "CHARGES": "رسوم", + "COSTS": "التكاليف", + "COMMISSION": "عمولة", + "TRADING_FEES": "رسوم التداول", + "TRANSACTION_FEES": "رسوم المعاملات", + "RESTRICTIONS": "قيود", + "BOUNDARIES": "حدود", + "CAPS": "قبعات", + "MAXIMUM": "الحد الأقصى", + "WITHDRAWAL_LIMITS": "حدود السحب", + "STORAGE": "تخزين", + "FUNDS": "أموال", + "BALANCE": "توازن", + "CRYPTO_WALLET": "محفظة العملات المشفرة", + "MY": "لي", + "ENGLISH": "إنجليزي", + "LOCALIZATION": "التوطين", + "TRANSLATE": "يترجم", + "LANGUAGE_SETTINGS": "إعدادات اللغة", + "MULTILINGUAL": "متعدد اللغات", + "LANGUAGE_PREFERENCE": "تفضيلات اللغة", + "TEXT": "نص", + "WORD": "كلمة", + "PEER_TO_PEER": "الند للند", + "DIRECT_TRADE": "التجارة المباشرة", + "USER_TO_USER": "من مستخدم إلى مستخدم", + "PRIVATE_TRADE": "التجارة الخاصة", + "TRANSACTIONS": "المعاملات", + "ACTIVITY": "نشاط", + "RECORD": "سِجِلّ", + "LOG": "سجل", + "TRANSACTION_HISTORY": "سجل المعاملات", + "LIQUIDITY": "السيولة", + "MARKET_VOLUME": "حجم السوق", + "TRADING_ACTIVITY": "نشاط التداول", + "MARKETS": "الأسواق", + "CRYPTO": "التشفير", + "TWO_FACTOR_AUTHENTICATION": "المصادقة الثنائية", + "MFA": "وزارة الخارجية", + "AUTHENTICATOR": "المُصدِّق", + "OTP": "او تي بي", + "CREDENTIALS": "أوراق اعتماد", + "PASSWORD_RESET": "إعادة تعيين كلمة المرور", + "SIGN_INS": "تسجيلات الدخول", + "ACCOUNT_ACCESS": "الوصول إلى الحساب", + "SESSION_HISTORY": "سجل الجلسة", + "LOGGED_IN": "تم تسجيل الدخول", + "SESSION_MANAGEMENT": "إدارة الجلسة", + "CURRENT_SESSIONS": "الجلسات الحالية", + "BANKING_DETAILS": "تفاصيل الخدمات المصرفية", + "BANK_ACCOUNT": "حساب بنكي", + "FINANCIAL_INSTITUTION": "مؤسسة مالية", + "BANK_INFO": "معلومات البنك", + "WITHDRAWAL_ACCOUNT": "حساب السحب", + "FUND": "تمويل", + "SOUND": "صوت", + "AUDIO_SETTINGS": "إعدادات الصوت", + "ALERTS": "تنبيهات", + "NOTIFICATIONS": "إشعارات", + "AUDIO_ALERTS": "تنبيهات صوتية", + "SECURITY": "حماية", + "CONTACT": "اتصال", + "EMAIL_ADDRESS": "عنوان البريد الإلكتروني", + "MAIL": "بريد", + "EMAIL_CONTACT": "الاتصال بالبريد الإلكتروني", + "KYC": "اعرف عميلك", + "SMS": "رسالة قصيرة", + "KYC_CAPS": "اعرف عميلك", + "ID": "بطاقة تعريف", + "PERSONAL_INFO": "معلومات شخصية", + "IDENTITY_CHECK": "التحقق من الهوية", + "PAYOUT": "الدفع", + "CASH_OUT": "صرف النقود", + "REMOVE_FUNDS": "إزالة الأموال", + "OUT": "خارج", + "SUPPORT": "يدعم", + "CONTACT_LOWER": "اتصال", + "EMAIL_LOWER": "بريد إلكتروني", + "RESOURCE": "موارد", + "GUIDES": "أدلة", + "FAQ": "التعليمات", + "CUSTOMER_SERVICE": "خدمة العملاء", + "ASSISTANCE": "مساعدة", + "API_LOWER": "واجهة برمجة التطبيقات", + "MESSAGE": "رسالة", + "LIVE_CHAT": "الدردشة المباشرة", + "SETTINGS": "إعدادات", + "ALERT": "يُحذًِر", + "UPDATES": "التحديثات", + "REMINDERS": "تذكيرات", + "UI": "واجهة المستخدم", + "USER_INTERFACE": "واجهة المستخدم", + "LAYOUT": "تَخطِيط", + "DESIGN": "تصميم", + "DASHBOARD": "لوحة القيادة", + "COLOR_THEME": "موضوع اللون", + "ORDER_BOOK": "دفتر الطلبات", + "DARK": "مظلم", + "LIGHT": "ضوء", + "WITHDRAWAL_ADDRESSES": "عناوين الانسحاب", + "CRYPTO_ADDRESSES": "عناوين التشفير", + "WALLET_ADDRESSES": "عناوين المحفظة", + "SAVED_ADDRESSES": "العناوين المحفوظة", + "ADDRESS_BOOK": "دفتر العناوين", + "WHITE_LISTED": "القائمة البيضاء" + } + }, + "CONNECTIONS": { + "CHECK_CONNECTION": "التحقق من الاتصال", + "IP": "الملكية الفكرية", + "NORMAL_TEXT": "طبيعي", + "CONNECTION_ISSUE": "مشكلة الاتصال", + "SESSION": "حصة", + "SERVER_TIME": "وقت الخادم", + "PING": "بينغ", + "CHECK_PING": "التحقق من ping", + "RECONNECT": "إعادة الاتصال", + "TOOLTIP_DESC_1": "تحقق من ping الخاص بك إلى خادم التبادل {0}", + "TOOLTIP_DESC_2": "\"الملي ثانية\" الأقل أفضل\"", + "LOGGED_IN_AT": "تم تسجيل الدخول في", + "RECONNECT_DESC": "قد يؤدي إعادة الاتصال إلى حل المشكلات غير المعروفة التي تواجهها.", + "CONFIRM_RECONNECT_MESSAGE": "هل تريد إعادة الاتصال؟", + "PING_CHECK_TEXT": "جاري إرسال إشارة إلى الخادم. يرجى الانتظار...", + "RECHECK_PING": "إعادة التحقق من PING", + "FAST": "سريع", + "SLOW": "بطيئ", + "MS": "{0} مللي ثانية", + "STATUS_NORMAL": "اتصال عادي", + "CONNECTION_LABEL": "اتصال", + "CONNECTION_ISSUE_DETECTED": "تم اكتشاف مشكلة في الاتصال" + }, + "DESKTOP_NAVIGATION": { + "OTHERS": "آحرون", + "SUMMARY_DESCRIPTION": "معلومات مستوى الحساب وإمكانية الوصول إليه", + "FEES_LIMITS_DESC": "رسوم التداول والسحب وحدود الحساب", + "VOLUME_DESC": "ملخص حجم التداول على مر الزمن", + "DEPOSIT_DESC": "الوصول إلى خيارات تمويل إيداع المحفظة", + "BALANCE_DESC": "جميع أصولك وأرصدتها", + "PERFORMANCE_DESC": "الربح والخسارة في المحفظة", + "HISTORY_DESC": "مراجعة جميع الصفقات والإيداعات والسحوبات", + "ADDRESS_BOOK_DESC": "اتصل بدفتر العناوين للسحب", + "WITHDRAW_DESC": "عمليات السحب والتحويل من المحفظة", + "ASSETS_DESC": "تتبع الأسعار واكتشف بيانات الأصول", + "CONVERT_DESC": "تداول أي أصل مقابل آخر ببساطة", + "MARKET_DESC": "أسواق كتاب أوامر التداول الفوري.", + "P2P_DESC": "تداول العملات المشفرة", + "REFERRAL_DESC": "اكسب دخل سلبي عن طريق دعوة أصدقائك", + "CEFI_STAKE_DESC": "قم بإيداع الأصول من محفظة التبادل الخاصة بك", + "DEFI_STAKE_DESC": "قم بربط المحفظة ووضع أصولك في الحسبان", + "BUY_CRYPTO_DESC": "الشراء عن طريق التحويل البنكي المباشر أو البطاقات", + "SECURITY_DESC": "حساب 2FA وكلمة المرور وواجهات برمجة التطبيقات", + "VERIFICATION_DESC": "التحقق من هوية الحساب", + "SETTINGS_DESC": "الواجهة وإعدادات الحساب الأخرى", + "SUMMARY_PAGE": "صفحة الملخص", + "SIGNOUT_DESC": "تسجيل الخروج من الحساب", + "LANGUAGE_DESC": "تغيير تفضيلات اللغة", + "API_DESC": "استخدم مفاتيح API للوصول إلى حسابك برمجيًا", + "HELP_DESC": "احصل على المساعدة. اتصل بالدعم", + "TRANSACTION_DESC": "مراجعة جميع الصفقات والإيداعات والسحوبات", + "ONRAMPER_DESC": "استخدم Onramper لشراء وبيع العملات المشفرة" } } \ No newline at end of file diff --git a/web/src/config/lang/de.json b/web/src/config/lang/de.json index 948494fcbf..18e59c696b 100644 --- a/web/src/config/lang/de.json +++ b/web/src/config/lang/de.json @@ -165,7 +165,8 @@ "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}", - "QR_CODE_TITLE": "{0} Einzahlungsinformationen" + "QR_CODE_TITLE": "{0} Einzahlungsinformationen", + "VIEW_DEPOSIT": "Einzahlung anzeigen" }, "LOGIN": { "LOGIN_TO": "Bei {0} anmelden", @@ -275,7 +276,10 @@ "MOBILE_WALLET_BALANCE_LABEL": "Waage/Osten. USDT", "MOBILE_WALLET_SHARE_LABEL": "%Anteil/Schätzung USDT", "VIEW_MORE_WALLET_INFO": "MEHR WALLET-INFOS ANZEIGEN", - "VIEW_WALLET_TRANSACTION_HISTORY": "WALLET-TRANSAKTIONSVERLAUF ANZEIGEN" + "VIEW_WALLET_TRANSACTION_HISTORY": "WALLET-TRANSAKTIONSVERLAUF ANZEIGEN", + "ORDERS_HOLD": "Sie haben {0} {1}, was zu einer Sperrung von {2} {3} auf Ihrem {4}-Guthaben führt", + "OPEN_ORDERS_SINGULAR": "offene Bestellung", + "VIEW_WALLET": "Wallet anzeigen" }, "REQUEST_RESET_PASSWORD": { "TITLE": "Konto-Wiederherstellung", @@ -614,7 +618,8 @@ "CANCEL": "Stornieren", "PLACEHOLDER": "Geben Sie hier ein" } - } + }, + "TITLE_TEXT": "Überarbeiten Sie Ihre Kontoeinstellungen, indem Sie Einstellungen wie das Schnittstellenlayout, Benachrichtigungseinstellungen, den Benutzernamen und andere Anpassungen vornehmen." }, "TRANSACTION_HISTORY": { "TITLE": "Verlauf", @@ -773,13 +778,13 @@ "FORFEITURE_OF_EARNINGS_DETAILS_LABEL": "Verlust der Einnahmen", "STAKE_AMOUNT_LABEL": "Einsatzbetrag", "DISCLAIMER_NOTICE": "Hinweis: Bitte beachten Sie, dass für Beträge, die in USD den Wert von 1.000 USD überschreiten, eine Identitätsprüfung erforderlich ist. Dieser Wert umfasst Einnahmen, und die Plattform behält sich das Recht vor, zusätzliche Benutzerinformationen anzufordern.", - "SETTLEMENT_NOTICE": "Abwicklung: Bei der Abhebung wird eine Abwicklungsfrist von 24 Stunden angewendet.", + "SETTLEMENT_NOTICE": "{0} Beim Aufheben der Absteckung wird eine Abrechnungsfrist von 24 Stunden angewendet.", "CONFIRM_BUTTON": "Bestätigen", "STAKE_RULES_NOTICE": "Sobald Sie gestaked haben, sind Sie an die Regeln des Pools gebunden.", "I_UNDERSTAND_AGAIN_BUTTON": "Ich verstehe erneut", "CONGRATULATIONS_NOTICE": "Herzlichen Glückwunsch!", "EARNINGS_START_NOTICE": "Ihr Einsatz wird ab sofort Gewinne generieren.", - "REVIEW_PROGRESS_LABEL": "Sie können den Fortschritt Ihres Einsatzes auf der Seite 'Aktive Einsätze' überprüfen.", + "REVIEW_PROGRESS_LABEL": "Sie können den Fortschritt Ihres Einsatzes auf der {0} überprüfen.", "TIME_REMAINING_LABEL": "Verbleibende Zeit", "PENALTY_UPON_INITIAL_STAKE_PRINCIPLE_LABEL_2": "Strafe bei erstmaligem Einsatzprinzip", "FORFEITURE_OF_EARNINGS_LABEL_2": "Verlust der Einnahmen", @@ -789,7 +794,26 @@ "VISIT_WALLET_BUTTON": "BESUCHEN SIE DAS WALLET", "CLOSE_BUTTON": "SCHLIESSEN", "ACTIVE_STAKES": "Aktive Einsätze", - "STAKES_HISTORY": "Geschichte" + "STAKES_HISTORY": "Geschichte", + "SETTLEMENT_NOTICE_TITLE": "Siedlung:", + "REVIEW_PROGRESS_ACTIVE_LINK": "Seite „Aktive Einsätze“", + "STAKING": "Abstecken 101", + "SLASHING": "Hieb", + "MINIMUM_AMOUNT_ALLOWED": "Der Mindestbetrag für Staking-Pools beträgt", + "MAXIMUM_AMOUNT_ALLOWED": "Der maximal zulässige Betrag des Staking-Pools beträgt", + "DAYS": "Tage", + "CONFIRM_STAKE_DECS": "Auf geht's!", + "DO_YOU_UNDERSTAND": "Verstehst du?", + "SUCCESSFULLY_STAKED_IN": "Erfolgreich eingesetzt in", + "SUCCESSFULLY_STAKED": "Erfolgreich abgesteckt", + "VIEW_ACTIVE_STAKES": "AKTIVE EINSÄTZE ANZEIGEN", + "REVIEW_AND_UNSTAKE": "Überprüfen und Aufheben der Absteckung", + "NO_REWARD": "Kein Belohnungsbetrag zu erhalten", + "SUCCESSFULLY_UNSTAKED": "Sie haben erfolgreich Ihren Einsatz aufgehoben", + "MIN": "Mindest", + "UNSTAKING": "AUFHEBEN...", + "UNSTAKED": "UNABGESETZT", + "TOOLTIP": "Die Strafe, die Ihnen auferlegt wird, wenn Sie Ihren Einsatz zu früh aufheben. {0}" }, "CURRENCY": "Währung", "TYPE": "Typ", @@ -904,7 +928,9 @@ "ENTER_AMOUNT": "Menge eingeben", "REMOVE_TITLE": "Tag entfernen", "MAX_AMOUNT_WARNING_INFO": "Dieser Betrag überschreitet Ihr maximales Auszahlungslimit.", - "ZERO_BALANCE": "Ihr verfügbares Guthaben reicht nicht aus." + "ZERO_BALANCE": "Ihr verfügbares Guthaben reicht nicht aus.", + "MIN_AMOUNT_WARNING_INFO": "Der Mindestauszahlungsbetrag beträgt {0}", + "NEW_ADDRESS": "Neue Adresse" }, "WALLET_BUTTON_BASE_DEPOSIT": "einzahlen", "WALLET_BUTTON_BASE_WITHDRAW": "abheben", @@ -1265,7 +1291,8 @@ "INSUFFICIENT_LABEL": "Unzureichender Abrechnungsbetrag", "INSUFFICIENT_INFO_1": "Ihre Einnahmen reichen derzeit nicht für eine Abrechnung. Bitte laden Sie über Ihren Empfehlungslink weitere Mitglieder ein und warten Sie, bis Ihre offenen Einnahmen {0} {1}", "INSUFFICIENT_INFO_2": "übersteigen 1", - "GO_TO_REFERRAL": "Zur Empfehlung" + "GO_TO_REFERRAL": "Zur Empfehlung", + "REFER_DESC": "Teilen Sie den untenstehenden Link mit Freunden, um Provisionen für deren Handel zu verdienen" }, "NOT_LOGGEDIN": { "TXT_1": "Um den Handel zu starten, müssen Sie sich anmelden", @@ -1448,7 +1475,10 @@ "INSTALL_METAMASK_DETAILS": { "TITLE": "Installieren Sie MetaMask", "PROMPT": "Sie müssen Metamask in Ihrem Browser installieren: {0}" - } + }, + "EARN_REWARD": "Verdienen Sie Belohnungen für das Staking Ihrer digitalen Assets", + "DEFI_STAKING": "DeFi-Einsatz", + "CEFI_STAKING": "CeFi-Einsatz" }, "UNSTAKE": { "TITLE": "Unstake", @@ -1655,7 +1685,11 @@ "CHANGE_7D": "Änderung (7 Tage)", "CHANGE_1D": "Änderung (1 Tag)", "CHART_7D": "Diagramm (7 Tage)", - "ASSET": "Vermögenswert" + "ASSET": "Vermögenswert", + "PERCENTAGE": "% {0}", + "24H": "24 Stunden", + "TREND_7D": "Trend 7D", + "BUY": "Kaufen Sie {0} {1}" }, "SUMMARY_MARKETS": { "HOLLAEX": "Möchten Sie Ihre digitalen Assets auflisten? Starten Sie Ihren eigenen Markt mit Ihrem HollaEx {0} {1}", @@ -1804,7 +1838,18 @@ "ORDERBOOK": "Auftragsbuch", "NETWORK": "Netzwerkbroker OTC", "BROKER": "Lokaler Broker OTC", - "BROKERAGE": "NA – (Vermittlung)" + "BROKERAGE": "NA – (Vermittlung)", + "LOADING_PRICES": "Preise werden geladen...", + "INPUT_LABEL": "Geben Sie den Asset-Namen oder das Symbol ein", + "HIGHLIGHTS": "Highlights", + "MOBILE_DESC": "Wählen Sie unten einen Markt aus, um mit dem Handel zu beginnen.", + "PRICE_24H": "Preis/24H %", + "CARDS": { + "GAINERS": "Gewinner", + "LOSERS": "Verlierer", + "MARKET_CAP": "Marktkapitalisierung", + "24H": "{0} 24 Stunden" + } }, "HOLLAEX_TOKEN": { "REMOVE_FAVOURITES": "Von den Favoriten entfernen", @@ -1850,7 +1895,8 @@ "TAG": "Etikett:", "DISABLED_DEPOSIT_CONTENT": "Die Einzahlungsfunktion ist vorübergehend nicht verfügbar.", "DISABLED_WITHDRAW_CONTENT": "Die Auszahlungsfunktion ist vorübergehend nicht verfügbar.", - "DEPOSIT_LABEL": "Kaution" + "DEPOSIT_LABEL": "Kaution", + "VOLUME": "VOLUMEN" }, "ASYNC_LINK": { "TITLE": "Seite öffnet sich nicht automatisch?", @@ -2039,7 +2085,8 @@ "WALLET_BALANCE_ESTIMATE": "Schätzung des heutigen Wallet-Guthabens", "VIEW_BALANCE_HISTORY": "SALDOVERLAUF ANZEIGEN", "VIEW_PERCENTAGE_SHARE": "PROZENTUALEN ANTEIL ANZEIGEN", - "VIEW_WALLET_P&L": "WALLET-GEWINN- UND VERLUSTANZEIGE ANZEIGEN" + "VIEW_WALLET_P&L": "WALLET-GEWINN- UND VERLUSTANZEIGE ANZEIGEN", + "BALANCE_PERCENTAGE": "Saldoprozentsatz" }, "ASSET_INFO": "Asset-Informationen", "TAKER_FEES_APPLIED": "Es fallen Taker-Gebühren an", @@ -2188,7 +2235,7 @@ "TOTAL_ASSET_SELL_1": "Gesamt", "TOTAL_ASSET_SELL_2": "Sie können verkaufen", "BUY_ORDER_LIMITS": "KAUFBESTIMMUNGEN", - "MIN_MAX_ORDER_VALUE_1": "Minimum und Maximum", + "MIN_MAX_ORDER_VALUE_1": "Minimum und Maximum {0} {1}", "MIN_MAX_ORDER_VALUE_2": "Kaufauftragswert in", "PAYMENT_METHODS_SEND_FIAT": "ZAHLUNGSMETHODEN ZUM SENDEN VON FIAT", "SELECT_PAYMENT_METHODS_1": "Wählen Sie bis zu", @@ -2204,7 +2251,7 @@ "DEAL_EDITED": "Der Deal wurde bearbeitet", "DEAL_CREATED": "Deal wurde erstellt", "NEXT": "NÄCHSTE", - "ADD_PAYMENT_METHOD_DETAILS": "Details zur Zahlungsmethode hinzufügen", + "ADD_PAYMENT_METHOD_DETAILS": "{0} Einzelheiten zur Zahlungsmethode", "COMPLETE": "Vollständig", "STEP_SET_TYPE_PRICE": "Legen Sie Typ und Preis fest", "STEP_SET_TOTAL_AMOUNT_PAYMENT_METHODS": "Legen Sie den Gesamtbetrag und die Zahlungsmethoden fest", @@ -2234,6 +2281,400 @@ "ALL_REGION": "Alle Regionen", "BUYER_NOT_MADE_THE_PAYMENT": "Der Käufer hat seine Zahlung noch nicht bestätigt.", "PRICE_TO_ADVERTISE": "Preis, zu dem Sie werben, um zu verkaufen", - "VIEW_PROFILE": "Profil des Anbieters anzeigen" + "VIEW_PROFILE": "Profil des Anbieters anzeigen", + "P2P_METHODS": "P2P-Zahlungsmethoden", + "PAYMENT_METHODS": "Zahlungsmöglichkeiten", + "PAYMENT_METHODS_DEC": "Sie können Kryptowährungen verkaufen und Fiat-Zahlungen empfangen, indem Sie Ihre persönlichen Zahlungskontodaten hinzufügen, z. B. Bankdaten oder andere lokale Zahlungsmethoden. Stellen Sie sicher, dass der mit Ihrem Zahlungskonto verknüpfte Name mit dem Namen in Ihren verifizierten Daten übereinstimmt, bevor Sie Ihre Zahlungsinformationen hinzufügen.", + "SELL_AMOUNT": "Verkaufsbetrag", + "ADD_PAYMENT_METHOD": "+ ZAHLUNGSMETHODE HINZUFÜGEN", + "REMOVE": "ENTFERNEN", + "DYNAMIC": "DYNAMISCH", + "TYPE": "TYP", + "BACK_TO_ORDERS": "zu den Bestellungen", + "FUNDS_TRANSFERRED_USER": "Der Benutzer hat die Transaktion bestätigt und das Geld wurde auf Ihr Guthaben überwiesen.", + "CONFIRM_TRANSFER_USER": "ÜBERTRAGUNG BESTÄTIGEN UND BENACHRICHTIGEN", + "BUYER_SENT_FUNDS_USER": "Sie haben dem Benutzer signalisiert, dass Sie das Geld gesendet haben. Bitte warten Sie auf eine Antwort des Benutzers.", + "VENDOR_CONFIRMED_ORDER_USER": "Der Benutzer hat die Transaktion bestätigt und die Mittel freigegeben.", + "BUY_UPPER": "KAUFEN", + "CRYPTO_WANT_TO_BUY": "Krypto, das Sie kaufen möchten", + "FIAT_CURRENCY_WANT_TO_SPEND": "Fiat-Währung zum Ausgeben", + "PRICE_ADVERTISE": "Preis, zu dem Sie werben werden: {0}", + "TOTAL_AMOUNT": "Gesamtbetrag", + "BUY_SELL_DESC": "Sie können {0}", + "SELL_ORDER_LIMITS": "VERKAUFSAUFTRÄGE-LIMITS", + "MIN_MAX_ORDER_VALUE_3": "Wert der Verkaufsorder", + "PAYMENT_METHODS_RECEIVE_FIAT": "ZAHLUNGSMETHODEN ZUM ERHALT VON FIAT", + "PAYMENT_TIME_LIMIT_LABEL": "Zahlungsfrist: {0}", + "30_MINUTES": "30 Minuten", + "DELETE_UPPERCASE": "LÖSCHEN", + "CLICK_TO_VIEW": "KLICKEN ZUM ANZEIGEN", + "NEW_MESSAGE": "Sie haben eine P2P-Nachricht erhalten", + "STATUS_UPDATE": "Sie haben ein Update zu Ihrer P2P-Bestellung", + "APPEAL_STATUS_MESSAGE": "Gegen Ihre P2P-Bestellung wurde Einspruch erhoben", + "CANCEL_STATUS_MESSAGE": "Ihre P2P-Bestellung wurde storniert", + "CONFIRM_STATUS_MESSAGE": "Ihre P2P-Bestellung wurde bestätigt", + "NEW_ORDER_CREATED": "Neue P2P-Bestellung wurde erstellt", + "CRYPTO_RELEASE_STATUS_MESSAGE": "Krypto wurde aus der Bestellung entlassen", + "ADDITIONAL_PAYMENT_DETAILS": "Fügen Sie zusätzliche Zahlungsdetails hinzu", + "PAYMENT_FIELD_INFO": "Dieses neue Zahlungsfeld ist zusätzlich und soll P2P-Teilnehmer bei ihren Fiat-Währungstransfers unterstützen. Dabei sollte es sich um Kontodetails im Zusammenhang mit der Zahlungsmethode handeln. Je nach Zahlungssystem können dazu Telefonnummern, Benutzernamen, eindeutige Kontonummern und andere für Transaktionen erforderliche Informationen gehören.", + "PAYMENT_DETAIL_NAME": "Name des Zahlungsdetails", + "REQUIRED_OR_OPTIONAL": "Erforderlich oder optional", + "CREATE_NEW_PAYMENT_METHODS": "Neue Zahlungsmethoden erstellen und hinzufügen", + "MANUAL_PAYMENT_METHOD_ENTRY": "Um Ihrer P2P-Plattform eine Zahlungsmethode hinzuzufügen, können Sie dies manuell tun, indem Sie den Namen der Zahlungsmethode und die erforderlichen Zahlungsdetails eingeben. PayPal verwendet beispielsweise E-Mail-Adressen zum Senden und Empfangen von Geldern.", + "USERS_PAYMENT_SELECTION": "Sobald die Zahlungsmethode hinzugefügt wurde, können Ihre P2P-Händler und -Benutzer sie auswählen und die erforderlichen Informationen eingeben, wenn sie Zahlungen tätigen oder empfangen. Die von ihnen bereitgestellten Details werden an die andere Partei der P2P-Transaktion weitergegeben.", + "METHOD_NAME_AND_DETAIL": "Name der Methode und Hauptzahlungsdetails", + "ADD_NEW_PAYMENT_METHODS": "Neue Zahlungsmethoden auswählen:", + "DETAIL_NAME": "Name des Zahlungsdetails", + "DETAIL_VALUE": "Zahlungsdetailwert", + "DETAIL_REQUIRED": "Erforderlich", + "IMPORTANT_DETAIL": "(Wichtige Zahlungsdetails)", + "DETAIL_OPTIONAL": "Optional", + "OPTIONAL_DETAIL": "(Optionale Zahlungsdetails)", + "ADD_NEW_PAYMENT_FIELD": "Neues Zahlungsdetailfeld hinzufügen", + "PAYMENT_METHOD_CREATED": "Zahlungsmethode erstellt! Warte auf Bestätigung durch den Administrator", + "PAYMENT_METHOD_DELETED": "Zahlungsmethode gelöscht.", + "PAYMENT_METHOD_UPDATED": "Zahlungsmethode aktualisiert.", + "CRYPTO": "Krypto:", + "INPUT_SPEND_AMOUNT": "Geben Sie den Ausgabenbetrag ein", + "INPUT_SELL_AMOUNT": "Geben Sie den Verkaufsbetrag ein", + "TIMES": "mal", + "FEEDBACK": "Rückmeldung", + "ASSET": "Vermögenswert: ", + "CUSTOM": "Brauch", + "CANCELLED": "Abgesagt", + "APPEALED": "Berufung eingelegt", + "EXPIRED": "Abgelaufen", + "RATE": "Rate:", + "BUYING": "Kaufe {0}", + "SELLING": "Verkaufe {0}", + "TERMS_AND_CONDITION_DESCRIPTION": "Bitte posten Sie innerhalb von 15 Minuten nach Dealbeginn", + "VISIT_OUR_WEBSITE": "Besuchen Sie unsere Website", + "SELECT_PAYMENT_SYSTEM_LABEL": "Zahlungssystem auswählen", + "FIELD": "Feld", + "NEW_PAYMENT_PLACEHOLDER": "Geben Sie den Wert der Zahlungsdetails ein", + "FIELD_VALIDATION_TEXT": "Bitte füllen Sie alle Methodenfelder aus", + "INPUT_METHOD_NAME_TEXT": "Bitte geben Sie den Methodennamen ein", + "INPUT_PAYMENT_DETAIL_TEXT": "Geben Sie den Namen der Zahlungsdetails ein", + "UNVERIFIED": "Nicht verifiziert", + "VERIFIED": "Verifiziert", + "AMOUNT_RECEIVE": "wird von Ihrem Guthaben abgebucht", + "DELETE_WARNING": "Möchten Sie diese Zahlungsmethode wirklich löschen?", + "STEP_1": "Schritt 1/3", + "STEP_2": "Schritt 2/3", + "STEP_3": "Schritt 3/3", + "P2P_ORDER_CREATED": "P2P-Auftrag erstellt", + "VENDOR_CHECKS_TITLE": "Zahlung prüfen und bestätigen", + "FUND_RELEASED": "Freigegebene Mittel", + "ORDER_EXPIRY": "Auftragsablauf in", + "MINIMUM_AMOUNT_WARNING": "Das Minimum {0} beträgt {1}", + "MAXIMUM_AMOUNT_WARNING": "Das Maximum {0} beträgt {1}", + "ORDER_CREATION": "Auftragserstellung", + "ORDER_CREATION_DESC_1": "Wenn Sie auf \"Bestellung erstellen\" klicken, benachrichtigen Sie den Verkäufer und erhalten sofort ein Preisangebot sowie genaue Zahlungsdetails. {0} {1} {2} {3}", + "ORDER_CREATION_DESC_2": "Darin ist der genaue Betrag enthalten, der zur Finalisierung Ihrer Bestellung erforderlich ist.", + "YOU_HAVE_TEXT": "Sie haben", + "COMPLETE_PAYMENT_PROCESS": "um den Zahlungstransfervorgang abzuschließen.", + "WARINNG_DESC": "Bitte fahren Sie mit der Auftragserstellung nur fort, wenn Sie die Bestellung wirklich abschließen möchten.", + "ORDER_CANCEL_DESC": "Die Stornierung der Bestellung kann zur Sperrung des Kontos führen.", + "CONFIRM_ORDER_CREATION": "Wenn Sie bereit sind, {0}, klicken Sie unten auf „Bestellung erstellen“.", + "SEND_MONEY": "Geld senden", + "RECEIVE_MONEY": "das Geld erhalten", + "CREATE_ORDER": "Auftrag anlegen", + "NO_ORDERS_DESC": "Es sieht so aus, als ob hier keine Bestellungen vorliegen.", + "NO_DEALS_DESC": "Sieht aus, als gäbe es hier keine Angebote.", + "ONLINE": "ONLINE", + "OFFLINE": "OFFLINE", + "SELECT_CRYPTO": "Krypto auswählen", + "REMOVE_WARNING": "Möchten Sie dieses Angebot wirklich entfernen?", + "SHOW_FILTERS": "FILTER ANZEIGEN", + "HIDE_FILTERS": "FILTER AUSBLENDEN", + "ORDERS_COMPLETED": "Abgeschlossene Aufträge:", + "CANCEL_WARNING_TEXT": "Bitte beachten Sie, dass häufige Stornierungen von Bestellungen sich negativ auf Ihr öffentliches P2P-Profil auswirken und zur Sperrung Ihres Kontos führen können.", + "UPDATE": "Aktualisieren", + "TERMS_ERROR_TEXT": "Bitte geben Sie das Feld „Begriffe“ ein", + "RESPONSE_ERROR_TEXT": "Bitte geben Sie das Antwortfeld ein" + }, + "CUSTOM_NATIVE_CURRENCY": "Währung (Preis- und Vermögenswertschätzungen)", + "ADDRESS_BOOK": { + "ADDRESS_BOOK_LABEL": "Adressbuch", + "ADDRESS_BOOK_DESC_1": "Fügen Sie Ihrem persönlichen Adressbuch eine Whitelist-Abhebungsadresse hinzu", + "ADDRESS_BOOK_DESC_2": "Sie können diese Adressen problemlos zum Abheben verwenden.", + "ADD_ADDRESS_LINK": "Adresse hinzufügen", + "ADD_WITHDRAW_ADDRESS": "Auszahlungsadresse hinzufügen", + "DATE_ADDED": "Datum hinzugefügt", + "REMOVE": "Entfernen", + "NO_LINK": "Es wurde noch keine Auszahlungsadresse hinzugefügt.", + "ADD_WITHDRAW_ADDRESS_DESC_1": "Fügen Sie eine Whitelist-Adresse hinzu, an die Sie sicher Münzen abheben können.", + "ADD_WITHDRAW_ADDRESS_DESC_2": "Bei dieser Auszahlungsadresse sollte es sich um eine Adresse unter Ihrer Kontrolle handeln.", + "NAME_YOUR_ADDRESS_TITLE": "Geben Sie Ihre Adresse an", + "NAME_YOUR_ADDRESS_DESC": "Geben Sie dieser Auszahlungsadresse einen Namen, damit Sie sie in Zukunft wiedererkennen können.", + "USER_LABEL": "Name/Bezeichnung:", + "USER_FIELD_PLACEHOLDER": "Nennen Sie diese Auszahlungsadresse", + "CHECK_AND_CONFIRM": "Prüfen und bestätigen", + "WARNING_ADDRESS": "Bevor Sie diese Adresse zu Ihrem Adressbuch hinzufügen, nehmen Sie sich bitte die Zeit, die Angaben auf ihre Richtigkeit zu überprüfen:", + "ENSURE_DESC": "Stellen Sie sicher, dass die Adresse korrekt und unter Ihrer Kontrolle ist.", + "ADDRESSES": "Adressen", + "WITHDRAWAL_ADDRESS_BOOK": "Adressbuch für Auszahlungen", + "ADD_ADDRESS_DESC": "Auszahlungsadresse zu {0} hinzufügen", + "ADDRESS_BOOK": "Adressbuch", + "MANAGE_ADDRESS_BOOK": "Adressbuch verwalten", + "VIEW_ADDRESS_BOOK_LABEL": "Adressbuch anzeigen", + "ADD_WITHDRAWAL_ADDRESS_LINK": "Auszahlungsadresse hinzufügen", + "REVOKE_ADDRESS": "Ihre Adresse wurde entfernt", + "REMOVE_ADDRESS": "Adresse entfernen", + "REMOVE_CONTENT": "Möchten Sie diese Auszahlungsadresse aus Ihrem Adressbuch entfernen?" + }, + "VOLUME": { + "VOLUME": "VOLUMEN", + "BACK": "Zurück", + "MARKETS": "MÄRKTE", + "CONVERT": "KONVERTIEREN", + "HISTORY": "GESCHICHTE", + "TRADING_VOLUME": "Handelsvolumen", + "VOLUME_DECS": "Gehandelte Beträge auf Ihrem Konto über verschiedene Zeiträume hinweg, zusammen mit den drei am häufigsten gehandelten Vermögenswerten in jedem Zeitraum", + "ALL_ASSETS": "alle Vermögenswerte", + "DAY_VOLUME": "TAGEVOLUMEN", + "HOUR_VOLUME": "24 STUNDEN VOLUMEN", + "TOP": "NACH OBEN {0} {1}", + "VOL_ASSET": "D VOL. VERMÖGEN", + "NO_DATA_DESC_1": "Sieht so aus, als hätten Sie noch keine Trades getätigt. Beginnen Sie jetzt mit dem Traden, um Ihre Aktivität hier anzuzeigen!", + "NO_DATA_DESC_2": "Beginnen Sie zu handeln", + "NO_DATA_DESC_3": "jetzt, um Ihre Aktivität hier zu sehen!", + "TRADE_VOLUME": "Handelsvolumen", + "VIEW_VOLUME": "VOLUMEN ANZEIGEN", + "TRADE_DESCRIPTION": "Sehen Sie sich Ihren meistgehandelten Vermögenswert an", + "MARKET_TABLE_DESC": "Besuchen Sie Ihre Handelsvolumenseite {0}" + }, + "MORE_OPTIONS_LABEL": { + "MORE_OPTION_SEARCH_TXT": "Suchfunktion oder Seiten", + "NO_RESULT_DESC_1": "Es sieht so aus, als gäbe es hierfür keine Ergebnisse.", + "NO_RESULT_DESC_2": "Versuchen Sie es mit einem anderen Stichwort.", + "ICONS": { + "REFERRALS": "Empfehlungen", + "BUY_CRYPTO": "Krypto kaufen", + "API": "API", + "DEFI_STAKE": "Defi-Einsatz", + "CEFI_STAKE": "Cefi-Anteil", + "PROFIT_LOSS": "Gewinn- und Verlustrechnung", + "LIMITS": "Grenzen", + "LOGINS": "Anmeldungen", + "AUDIO": "Audio" + }, + "HOT_FUNCTION": { + "HOT_FUNCTION_LABEL": "Heiße Funktionen", + "ADD_FUNDS": "Guthaben hinzufügen", + "TOP_UP": "Aufladen", + "LOAD": "Laden", + "CREDIT": "Kredit", + "FUND_ACCOUNT": "Fondskonto", + "BTC": "btc", + "USTD": "USDT", + "ETH": "eth", + "USD": "US-Dollar", + "XHT": "xht", + "TRANSFER": "überweisen", + "MONEY": "Geld", + "FUNDING": "Finanzierung", + "RECHARGE": "aufladen", + "REFILL": "Nachfüllung", + "CASH_IN": "einlösen", + "ADD_MONEY": "Geld hinzufügen", + "EXCHANGE": "Austausch", + "SWAP": "Tauschen", + "BUY_SELL": "Kaufen/Verkaufen", + "TRADE": "Handel", + "CONVERT_CURRENCY": "Währung umrechnen", + "INVITE": "Einladen", + "REFER": "Verweisen", + "REWARDS": "Belohnungen", + "BONUS": "Bonus", + "AFFILIATION": "Zugehörigkeit", + "AFFILIATE": "Partnerunternehmen", + "PASSIVE_INCOME": "Passives Einkommen", + "REVENUE": "Einnahmen" + }, + "OTHER_FUNCTIONS": { + "OTHER_FUNCTIONS_LABEL": "Andere Funktionen", + "INTEGRATION": "Integration", + "PROGRAMMATIC_ACCESS": "Programmatischer Zugriff", + "DEVELOPER": "Entwickler", + "AUTOMATED_TRADING": "Automatisierter Handel", + "BOT": "Bot", + "ALGO": "Etwas", + "ALGORITHM": "Algorithmus", + "FIAT": "Fiat", + "DOLLAR": "Dollar", + "PURCHASE": "kaufen", + "BUY_COIN": "Münze kaufen", + "BUY_TOKEN": "Token kaufen", + "YIELD": "Ertrag", + "INTEREST": "Interesse", + "REVENUE": "Einnahmen", + "CENTRALIZED_STAKING": "Zentralisiertes Staking", + "PERFORMANCE": "Leistung", + "GAINS": "Belohnungen", + "LOSSES": "Verluste", + "PORTFOLIO_PROFIT": "Portfoliogewinn", + "LOSS": "Verlust", + "PNL": "pl", + "CHARGES": "Gebühren", + "COSTS": "Kosten", + "COMMISSION": "Kommission", + "TRADING_FEES": "Handelsgebühren", + "TRANSACTION_FEES": "Transaktionsgebühren", + "RESTRICTIONS": "Einschränkungen", + "BOUNDARIES": "Grenzen", + "CAPS": "Kappen", + "MAXIMUM": "Maximal", + "WITHDRAWAL_LIMITS": "Auszahlungslimits", + "STORAGE": "Lagerung", + "FUNDS": "Mittel", + "BALANCE": "Gleichgewicht", + "CRYPTO_WALLET": "Krypto-Wallet", + "MY": "Mein", + "ENGLISH": "Englisch", + "LOCALIZATION": "Lokalisierung", + "TRANSLATE": "Übersetzen", + "LANGUAGE_SETTINGS": "Spracheinstellungen", + "MULTILINGUAL": "Mehrsprachig", + "LANGUAGE_PREFERENCE": "Spracheinstellung", + "TEXT": "Text", + "WORD": "Wort", + "PEER_TO_PEER": "Peer-to-Peer", + "DIRECT_TRADE": "Direkthandel", + "USER_TO_USER": "Benutzer-zu-Benutzer", + "PRIVATE_TRADE": "Privater Handel", + "TRANSACTIONS": "Transaktionen", + "ACTIVITY": "Aktivität", + "RECORD": "Aufzeichnen", + "LOG": "Protokoll", + "TRANSACTION_HISTORY": "Verlauf der Transaktionen", + "LIQUIDITY": "Liquidität", + "MARKET_VOLUME": "Marktvolumen", + "TRADING_ACTIVITY": "Handelsaktivität", + "MARKETS": "Märkte", + "CRYPTO": "Krypto", + "TWO_FACTOR_AUTHENTICATION": "Zwei-Faktor-Authentifizierung", + "MFA": "MFA", + "AUTHENTICATOR": "Authentifikator", + "OTP": "otp", + "CREDENTIALS": "Qualifikationen", + "PASSWORD_RESET": "Passwort zurücksetzen", + "SIGN_INS": "Anmeldungen", + "ACCOUNT_ACCESS": "Kontozugriff", + "SESSION_HISTORY": "Sitzungsverlauf", + "LOGGED_IN": "Eingeloggt", + "SESSION_MANAGEMENT": "Sitzungsverwaltung", + "CURRENT_SESSIONS": "Aktuelle Sitzungen", + "BANKING_DETAILS": "Bankverbindung", + "BANK_ACCOUNT": "Bankkonto", + "FINANCIAL_INSTITUTION": "Finanzinstitut", + "BANK_INFO": "Bankinformationen", + "WITHDRAWAL_ACCOUNT": "Auszahlungskonto", + "FUND": "Fonds", + "SOUND": "Klang", + "AUDIO_SETTINGS": "Audioeinstellungen", + "ALERTS": "Warnmeldungen", + "NOTIFICATIONS": "Benachrichtigungen", + "AUDIO_ALERTS": "Audiowarnungen", + "SECURITY": "Sicherheit", + "CONTACT": "Kontakt", + "EMAIL_ADDRESS": "E-Mail-Adresse", + "MAIL": "Mail", + "EMAIL_CONTACT": "E-Mail-Kontakt", + "KYC": "kyc", + "SMS": "Direct Mail", + "KYC_CAPS": "KYC", + "ID": "AUSWEIS", + "PERSONAL_INFO": "Persönliches", + "IDENTITY_CHECK": "Identitätsprüfung", + "PAYOUT": "Auszahlung", + "CASH_OUT": "Auszahlung", + "REMOVE_FUNDS": "Guthaben abheben", + "OUT": "Aus", + "SUPPORT": "Unterstützung", + "CONTACT_LOWER": "Kontakt", + "EMAIL_LOWER": "E-Mail", + "RESOURCE": "Ressourcen", + "GUIDES": "Anleitungen", + "FAQ": "Häufig gestellte Fragen", + "CUSTOMER_SERVICE": "Kundendienst", + "ASSISTANCE": "Hilfe", + "API_LOWER": "API", + "MESSAGE": "Nachricht", + "LIVE_CHAT": "Live-Chat", + "SETTINGS": "Einstellungen", + "ALERT": "Alarm", + "UPDATES": "Aktualisierungen", + "REMINDERS": "Erinnerung", + "UI": "Benutzeroberfläche", + "USER_INTERFACE": "Benutzeroberfläche", + "LAYOUT": "Layout", + "DESIGN": "Design", + "DASHBOARD": "Armaturenbrett", + "COLOR_THEME": "Farbthema", + "ORDER_BOOK": "Auftragsbuch", + "DARK": "dunkel", + "LIGHT": "Licht", + "WITHDRAWAL_ADDRESSES": "Auszahlungsadressen", + "CRYPTO_ADDRESSES": "Krypto-Adressen", + "WALLET_ADDRESSES": "Wallet-Adressen", + "SAVED_ADDRESSES": "Gespeicherte Adressen", + "ADDRESS_BOOK": "Adressbuch", + "WHITE_LISTED": "weiße Liste" + } + }, + "CONNECTIONS": { + "CHECK_CONNECTION": "Verbindung prüfen", + "IP": "IP", + "NORMAL_TEXT": "Normal", + "CONNECTION_ISSUE": "Verbindungsproblem", + "SESSION": "Sitzung", + "SERVER_TIME": "Serverzeit", + "PING": "Klingeln", + "CHECK_PING": "PING PRÜFEN", + "RECONNECT": "Erneut verbinden", + "TOOLTIP_DESC_1": "Überprüfen Sie Ihren Ping zum Exchange-Server {0}", + "TOOLTIP_DESC_2": "Niedrigere „ms“ sind besser", + "LOGGED_IN_AT": "Eingeloggt bei", + "RECONNECT_DESC": "Durch die erneute Verbindung können möglicherweise unbekannte Probleme behoben werden, die bei Ihnen auftreten.", + "CONFIRM_RECONNECT_MESSAGE": "Möchten Sie die Verbindung wiederherstellen?", + "PING_CHECK_TEXT": "Ping an den Server. Bitte warten …", + "RECHECK_PING": "PING ERNEUT PRÜFEN", + "FAST": "Schnell", + "SLOW": "Langsam", + "MS": "{0} ms", + "STATUS_NORMAL": "Verbindung Normal", + "CONNECTION_LABEL": "Verbindung", + "CONNECTION_ISSUE_DETECTED": "Verbindungsproblem erkannt" + }, + "DESKTOP_NAVIGATION": { + "OTHERS": "Sonstiges", + "SUMMARY_DESCRIPTION": "Informationen und Zugänglichkeit auf Kontoebene", + "FEES_LIMITS_DESC": "Handels- und Auszahlungsgebühren. Kontolimits", + "VOLUME_DESC": "Zusammenfassung des Handelsvolumens im Zeitverlauf", + "DEPOSIT_DESC": "Greifen Sie auf Einzahlungsoptionen für Ihr Wallet zu", + "BALANCE_DESC": "Alle Ihre Vermögenswerte und deren Salden", + "PERFORMANCE_DESC": "Wallet Gewinn und Verlust", + "HISTORY_DESC": "Überprüfen Sie alle Trades, Einzahlungen und Abhebungen", + "ADDRESS_BOOK_DESC": "Kontaktadressbuch für Abhebungen", + "WITHDRAW_DESC": "Abhebungen und Überweisungen aus dem Wallet", + "ASSETS_DESC": "Verfolgen Sie Preise und entdecken Sie Vermögensdaten", + "CONVERT_DESC": "Tauschen Sie einfach einen beliebigen Vermögenswert gegen einen anderen", + "MARKET_DESC": "Spothandels-Orderbuchmärkte.", + "P2P_DESC": "Krypto-Handel", + "REFERRAL_DESC": "Verdienen Sie passives Einkommen, indem Sie Ihre Freunde einladen", + "CEFI_STAKE_DESC": "Setzen Sie Vermögenswerte aus Ihrem Exchange-Wallet ein", + "DEFI_STAKE_DESC": "Verbinden Sie Ihre Brieftasche und setzen Sie Ihr Vermögen ein", + "BUY_CRYPTO_DESC": "Kauf per Banküberweisung oder Kreditkarte", + "SECURITY_DESC": "Konto 2FA, Passwort und APIs", + "VERIFICATION_DESC": "Überprüfung der Kontoidentität", + "SETTINGS_DESC": "Benutzeroberfläche und andere Kontoeinstellungen", + "SUMMARY_PAGE": "Seite „Zusammenfassung“", + "SIGNOUT_DESC": "Kontoabmeldung", + "LANGUAGE_DESC": "Spracheinstellung ändern", + "API_DESC": "Verwenden Sie API-Schlüssel, um programmgesteuert auf Ihr Konto zuzugreifen", + "HELP_DESC": "Hilfe erhalten. Support-Kontakt", + "TRANSACTION_DESC": "Überprüfen Sie alle Trades, Einzahlungen und Abhebungen", + "ONRAMPER_DESC": "Verwenden Sie Onramper, um Krypto zu kaufen und zu verkaufen" } } \ No newline at end of file diff --git a/web/src/config/lang/en.json b/web/src/config/lang/en.json index a1feda819c..abf32c8328 100644 --- a/web/src/config/lang/en.json +++ b/web/src/config/lang/en.json @@ -95,7 +95,7 @@ "OPTION_BUG": "Report bug", "OPTION_PERSONAL_INFO": "Change personal information", "OPTION_BANK_TRANSFER": "Bank wire transfer", - "OPTION_REQUEST": "Request Invite for the HollaEx Exchange" + "OPTION_REQUEST": "Request Invite for the Exchange" }, "SUBJECT_LABEL": "Subject", "SUBJECT_PLACEHOLDER": "Type the subject of your issue", @@ -1216,6 +1216,7 @@ "NO_FEE": "N/A", "SETTINGS_LANGUAGE_LABEL": "Language preferences (Includes Emails)", "SETTINGS_THEME_LABEL": "User Interface Theme", + "CUSTOM_NATIVE_CURRENCY": "Currency (Pricing & asset value estimates)", "SETTING_BUTTON": "save", "VERIFICATION_NO_WITHDRAW_TITLE": "Withdrawals disabled", "VERIFICATION_NO_WITHDRAW_MESSAGE": "Your account is disabled for withdrawals", @@ -1550,7 +1551,11 @@ "TRADING_SYMBOL": "Trading Symbol", "ASSET": "Asset", "TYPE": "Type", - "SOURCE": "SOURCE" + "SOURCE": "SOURCE", + "PERCENTAGE": "% {0}", + "24H": "24H", + "TREND_7D": "Trend 7D", + "BUY": "Buy {0} {1}" }, "SUMMARY_MARKETS": { "HOLLAEX": "Want to list your digital assets? Start your own market with your HollaEx {0} {1}", @@ -1655,7 +1660,7 @@ "WITHDRAWALS_FORM_METHOD": "Method", "WITHDRAWALS_FORM_ADDRESS_EXCHANGE": "Exchange user email", "WITHDRAWALS_FORM_EXCHANGE_PLACEHOLDER": "Input user's email on this exchange", - "WITHDRAWALS_FORM_MAIL_INFO": "Input a user's HollaEx account email that is on this exchange and transfer for free.", + "WITHDRAWALS_FORM_MAIL_INFO": "Input a user's account email that is on this exchange and transfer for free.", "RISKY_TRADE_DISCLAIMER": { "MSG_1": "Please check that you indeed want to trade {0} ({1}) as this asset may carry a high risk of", "MSG_2": "extreme volatility", @@ -1777,7 +1782,17 @@ "NETWORK": "Network Broker OTC", "BROKER": "Local Broker OTC", "BROKERAGE": "NA - (Brokerage)", - "LOADING_PRICES": "Loading Prices..." + "LOADING_PRICES": "Loading Prices...", + "INPUT_LABEL": "Input asset name or symbol", + "HIGHLIGHTS": "Highlights", + "MOBILE_DESC": "Select a market below to start trading.", + "PRICE_24H": "Price/24H %", + "CARDS": { + "GAINERS": "Gainers", + "LOSERS": "Losers", + "MARKET_CAP": "Market Cap", + "24H": "{0} 24H" + } }, "HOLLAEX_TOKEN": { "REMOVE_FAVOURITES": "Remove from favourites", @@ -1810,6 +1825,7 @@ "ACCORDIAN_INFO": "ASSET INFO PAGE", "ACCORDIAN_HISTORY": "HISTORY", "DEPOSIT": "DEPOSIT", + "VOLUME": "VOLUME", "WITHDRAW": "WITHDRAW", "SELECT_ASSET": "Select asset:", "SELECT_NETWORK": "Select network:", @@ -1973,14 +1989,14 @@ "I_WANT_TO_SELL": "I want to sell", "SPEND_FIAT_CURRENCY": "Select Fiat currency", "AMOUNT": "Amount", - "PAYMENT_METHOD": "Payment Method", + "PAYMENT_METHOD": "Method", "AVAILABLE_REGIONS": "Available Regions", "VENDOR": "Vendor", "PRICE_LOWEST_FIRST": "Price (Lowest first)", "LIMIT_AVAILABLE": "Limit/Available", "PAYMENT": "Payment", "TRADE": "Trade", - "SELECT_PAYMENT_METHOD": "Select payment Method", + "SELECT_PAYMENT_METHOD": "Select method", "SPEND_AMOUNT": "Spend Amount", "P2P_METHODS": "P2P Payment Methods", "PAYMENT_METHODS": "PAYMENT METHODS", @@ -1989,7 +2005,7 @@ "AMOUNT_TO_RECEIVE": "Amount to receive", "ORDER_CREATED": "Order Created.", "ADD_PAYMENT_METHOD": "+ ADD PAYMENT METHOD", - "SELECT_PAYMENT_METHOD_AND_AMOUNT": "please select payment method and input amount", + "SELECT_PAYMENT_METHOD_AND_AMOUNT": "Please select method and input spend amount", "ERROR_MESSAGE": "An error occurred.", "TRANSACTION_NOT_FOUND": "Transaction not found", "TITLE": "P2P Deals", @@ -2027,16 +2043,16 @@ "SELECT_RATING": "Select Rating", "FEEDBACK_SUBMITTED": "Feedback submitted", "PROCEED": "PROCEED", - "BACK": "Back", + "BACK_TO_ORDERS": "to orders", "ORDER": "ORDER", "BUY_COIN": "Buy", "SELL_COIN": "Sell", - "TRANSACTION_ID": "Transaction ID", + "TRANSACTION_ID": "Transaction ID:", "AMOUNT_TO": "Amount to", "SELL": "sell", "RELEASE": "release", "SEND": "send", - "REQUIRED_FLAT_TRANSFER_AMOUNT": "(required flat transfer amount)", + "REQUIRED_FLAT_TRANSFER_AMOUNT": "(required fiat transfer amount)", "PRICE": "Price", "PER_COIN": "(per coin)", "RECEIVING_AMOUNT": "Receiving amount", @@ -2052,12 +2068,13 @@ "AUTO_RESPONSE_LIMIT": "Auto response text must be no longer than 240 characters", "TERMS_RESPONSE_LIMIT": "Terms must be no longer than 240 characters", "FUNDS_CREDITED": "Once funds are released you will find the funds credited to your funding wallet", - "VENDOR_CANCELLED": "Vendor cancelled the order, there will not be transfer of funds, If you think this is an error, Please contact support", + "VENDOR_CANCELLED": "Seller cancelled the order, there will not be transfer of funds, If you think this is an error, Please contact support", "ORDER_COMPLETE": "ORDER COMPLETE", - "FUNDS_TRANSFERRED": "Vendor confirmed the transaction and funds have been transferred to your balance.", + "FUNDS_TRANSFERRED": "Seller confirmed the transaction and funds have been transferred to your balance.", + "FUNDS_TRANSFERRED_USER": "User confirmed the transaction and funds have been transferred to your balance.", "GO_DEPOSIT": "Go to your deposits", "GO_WITHDRAWALS": "Go to your withdrawals", - "VENDOR_APPEALED": "Transaction appealed by the vendor, Please contact support with transaction id to resolve the issue", + "VENDOR_APPEALED": "Transaction appealed by the seller, Please contact support with transaction id to resolve the issue", "USER_APPEALED": "You appealed the transaction, Please contact support with transaction id to resolve the issue", "ORDER_COMPLETE_VENDOR": "You've marked this order as complete and released the funds", "PAYMENT_NOT_SENT": "The buyer has not sent the payment yet. Once you receive payment you will be notified here.", @@ -2069,18 +2086,19 @@ "CANCEL_ORDER": "Cancel order", "CONFIRM_AND_RELEASE_CRYPTO": "CONFIRM AND RELEASE CRYPTO", "CONFIRMED_TRANSACTION": "You have confirmed the transaction", - "CHAT_WITH_VENDOR": "CHAT WITH VENDOR", - "CHAT_WITH_USER": "CHAT WITH USER", - "VENDOR_NAME": "Vendor name:", - "USER_NAME": "User name:", - "ORDER_INITIATED_VENDOR": "Order has been initiated with", + "CHAT_WITH_VENDOR": "CHAT WITH SELLER", + "CHAT_WITH_USER": "CHAT WITH BUYER", + "VENDOR_NAME": "Seller name:", + "USER_NAME": "Buyer name:", + "ORDER_INITIATED_VENDOR": "Order has been initiated by", "CONFIRM_PAYMENT_VENDOR": "Please communicate with the buyer to confirm this transaction.", "ORDER_INITIATED": "You've initiated and created an order with", - "CONFIRM_PAYMENT": "Please communicate with the vendor to confirm your incoming payment.", + "CONFIRM_PAYMENT": "Please communicate with the seller to confirm your incoming payment.", "YOU": "You", "BUYER": "Buyer", "SEND_UPPER": "SEND", - "CONFIRM_TRANSFER": "CONFIRM TRANSFER AND NOTIFY VENDOR", + "CONFIRM_TRANSFER": "CONFIRM TRANSFER AND NOTIFY SELLER", + "CONFIRM_TRANSFER_USER": "CONFIRM TRANSFER AND NOTIFY USER", "PROCESSING": "Processing", "ALL_ORDERS": "All Orders", "TYPE_COIN": "Type/Coin", @@ -2092,15 +2110,17 @@ "USER": "User", "COMMENT": "Comment", "RATING": "Rating", - "BUYER_PAID_ORDER": "Buyer has marked this order as paid. Waiting for vendor to check, confirm and release funds.", - "BUYER_SENT_FUNDS": "You’ve signaled to the merchant that you’ve sent the funds. Please wait for a response from the vendor merchant.", + "BUYER_PAID_ORDER": "Buyer has marked this order as paid. Waiting for seller to check, confirm and release funds.", + "BUYER_SENT_FUNDS": "You’ve signaled to the seller that you’ve sent the funds. Please wait for a response from the seller.", + "BUYER_SENT_FUNDS_USER": "You’ve signaled to the user that you’ve sent the funds. Please wait for a response from the user.", "ORDER_EXPIRED": "This order expired due to inactivity in the given time.", "BUYER_CANCELLED_ORDER": "Buyer has cancelled this order, Transaction is closed.", "BUYER_APPEALED_ORDER": "Buyer has appealed this order, Please contact support to resolve the issue.", - "VENDOR_CONFIRMED_ORDER": "Vendor confirmed the transaction and released the funds.", + "VENDOR_CONFIRMED_ORDER": "Seller confirmed the transaction and released the funds.", + "VENDOR_CONFIRMED_ORDER_USER": "User confirmed the transaction and released the funds.", "ORDER_CLOSED": "The order has been closed after reaching a verdict on the appeal request.", "VENDOR_CANCELLED_ORDER": "Vendor has cancelled this order, Transaction is closed.", - "VENDOR_APPEALED_ORDER": "Vendor has appealed this order, Please contact support to resolve the issue.", + "VENDOR_APPEALED_ORDER": "Seller has appealed this order, Please contact support to resolve the issue.", "SET_TYPE_PRICE": "Set the type and price", "SET_AMOUNT_PAYMENT_METHODS": "Set the total amount and payment methods", "SET_TERMS_RESPONSE": "Set terms and an automated response", @@ -2108,25 +2128,26 @@ "SELL_UPPER": "SELL", "BUY_UPPER": "BUY", "CRYPTO_WANT_TO_SELL": "Crypto you want to sell", + "CRYPTO_WANT_TO_BUY": "Crypto you want to buy", "RECEIVE": "RECEIVE", - "FIAT_CURRENCY_WANT_TO_RECEIVE": "Fiat currency you want to receive", + "FIAT_CURRENCY_WANT_TO_RECEIVE": "Fiat currency to receive", + "FIAT_CURRENCY_WANT_TO_SPEND": "Fiat currency to spend", "PRICE_UPPER": "PRICE", "STATIC": "STATIC", "FIXED_PRICE": "Fixed Price", "SPREAD_PERCENTAGE": "SPREAD (%)", "PRICE_PROFIT_SPREAD_SET": "Price and profit spread to set", - "UNIT_PRICE": "UNIT PRICE", - "PRICE_ADVERTISE_SELL": "Price you'll advertise to sell", - "PRICE_ADVERTISE_BUY": "Price you'll advertise to buy", - "TOTAL_ASSET_SELL_1": "Total", - "TOTAL_ASSET_SELL_2": "you can sell", - "TOTAL_ASSET_SEND_2": "you can send", + "UNIT_PRICE": "USDT UNIT PRICE", + "PRICE_ADVERTISE": "Price you'll advertise to {0}", + "TOTAL_AMOUNT": "Total Amount", + "BUY_SELL_DESC": "you can {0}", "BUY_ORDER_LIMITS": "BUY ORDER LIMITS", "SELL_ORDER_LIMITS": "SELL ORDER LIMITS", - "MIN_MAX_ORDER_VALUE_1": "Minimum and max", - "MIN_MAX_ORDER_VALUE_2": "buy order value in", - "MIN_MAX_ORDER_VALUE_3": "sell order value in", + "MIN_MAX_ORDER_VALUE_1": "Minimum and max {0} {1}", + "MIN_MAX_ORDER_VALUE_2": "buy order value", + "MIN_MAX_ORDER_VALUE_3": "sell order value", "PAYMENT_METHODS_SEND_FIAT": "PAYMENT METHODS TO SEND FIAT", + "PAYMENT_METHODS_RECEIVE_FIAT": "PAYMENT METHODS TO RECEIVE FIAT", "SELECT_PAYMENT_METHODS_1": "Select up to", "SELECT_PAYMENT_METHODS_2": "methods for", "REGION": "Region", @@ -2134,25 +2155,26 @@ "TERMS": "TERMS", "TERMS_CONDITIONS_DEAL": "Terms and conditions for this deal", "FIRST_RESPONSE": "FIRST RESPONSE", - "CHAT_RESPONSE": "Chat response that your counterpart will see upon entering the P2P deal room", + "CHAT_RESPONSE": "Chat response that your counter-party will see upon entering the P2P deal room", "BACK_UPPER": "BACK", "PLEASE_FILL_INPUTS": "Please fill all the inputs", "DEAL_EDITED": "Deal has been edited", "DEAL_CREATED": "Deal has been created", "NEXT": "NEXT", - "ADD_PAYMENT_METHOD_DETAILS": "Add Payment Method Details", + "ADD_PAYMENT_METHOD_DETAILS": "{0} Payment Method Details", "COMPLETE": "Complete", "STEP_SET_TYPE_PRICE": "Set the type and price", "STEP_SET_TOTAL_AMOUNT_PAYMENT_METHODS": "Set the total amount and payment methods", "STEP_SET_TERMS_AUTO_RESPONSE": "Set terms and an automated response", "NO": "NO", "CANCEL_WARNING": "Are you sure you want to cancel this order?", - "CONFIRM_WARNING": "Are you sure to confirm this order?", - "RELEASE_WARNING": "Are you sure to release this order?", + "CONFIRM_WARNING": "Are you sure you want to confirm this order?", + "RELEASE_WARNING": "Are you sure you want to release this order?", "ALL": "ALL", "ANONYMOUS": "Anonymous", "TERMS_CONDITIONS": "Terms and conditions", - "PAYMENT_TIME_LIMIT": "Payment time limit 30 minutes", + "PAYMENT_TIME_LIMIT_LABEL": "Payment time limit: {0}", + "30_MINUTES": "30 Minutes", "AMOUNT_SEND_RELEASE": "(Amount of crypto you'll sell and release)", "MINUTES": "minutes", "EDIT_UPPERCASE": "EDIT", @@ -2173,8 +2195,13 @@ "PRICE_TO_ADVERTISE": "Price you’ll advertise to sell", "VIEW_PROFILE": "View vendor's profile", "CLICK_TO_VIEW": "CLICK TO VIEW", - "NEW_MESSAGE:": "You have a new message for your order", - "STATUS_UPDATE": "You have an update on your order", + "NEW_MESSAGE": "You have received a P2P message", + "STATUS_UPDATE": "You have an update on your P2P order", + "APPEAL_STATUS_MESSAGE": "Your P2P order has been appealed", + "CANCEL_STATUS_MESSAGE": "Your P2P order has been cancelled", + "CONFIRM_STATUS_MESSAGE": "Your P2P order has been confirmed", + "NEW_ORDER_CREATED": "New P2P Order has been created", + "CRYPTO_RELEASE_STATUS_MESSAGE": "Crypto has been released from order", "ADDITIONAL_PAYMENT_DETAILS": "Add an additional payment details", "PAYMENT_FIELD_INFO": "This new payment field is additional and should assist P2P participants in their fiat currency transfers. This should be account details related to payment method. This may including phone numbers, usernames, unique account numbers, and other necessary information for transactions depending on the payment methods system.", "PAYMENT_DETAIL_NAME": "Payment detail name", @@ -2183,7 +2210,7 @@ "MANUAL_PAYMENT_METHOD_ENTRY": "To add a payment method to your P2P platform, you can do so manually by entering the name of the payment method and the required payment details. For example, PayPal uses email addresses to send and receive funds.", "USERS_PAYMENT_SELECTION": "Once the payment method is added, your P2P merchants and users will be able to select it and enter the necessary information when making or receiving payments. The details they provide will be shared with the other party in the P2P transaction.", "METHOD_NAME_AND_DETAIL": "Name of method and main payment detail", - "ADD_NEW_PAYMENT_METHODS": "Select new payment methods", + "ADD_NEW_PAYMENT_METHODS": "Select new payment methods :", "DETAIL_NAME": "Payment detail name", "DETAIL_VALUE": "Payment detail value", "DETAIL_REQUIRED": "Required", @@ -2193,6 +2220,318 @@ "ADD_NEW_PAYMENT_FIELD": "Add new payment detail field", "PAYMENT_METHOD_CREATED": "Payment method created! Waiting for verification by admin", "PAYMENT_METHOD_DELETED": "Payment method deleted.", - "PAYMENT_METHOD_UPDATED": "Payment method updated." + "PAYMENT_METHOD_UPDATED": "Payment method updated.", + "CRYPTO": "Crypto: ", + "INPUT_SPEND_AMOUNT": "Input spend amount", + "INPUT_SELL_AMOUNT": "Input sell amount", + "TIMES": "times", + "FEEDBACK": "Feedback", + "ASSET": "Asset: ", + "CUSTOM": "Custom", + "CANCELLED": "Cancelled", + "APPEALED": "Appealed", + "EXPIRED": "Expired", + "RATE": "Rate:", + "BUYING": "Buying {0}", + "SELLING": "Selling {0}", + "TERMS_AND_CONDITION_DESCRIPTION": "Please post within 15 minutes of the deal going", + "VISIT_OUR_WEBSITE": "Visit our website", + "SELECT_PAYMENT_SYSTEM_LABEL": "Select Payment System", + "FIELD": "Field", + "NEW_PAYMENT_PLACEHOLDER": "Input the payment detail value", + "FIELD_VALIDATION_TEXT": "Please input all method fields", + "INPUT_METHOD_NAME_TEXT": "Please input method name", + "INPUT_PAYMENT_DETAIL_TEXT": "Input the payment detail name", + "UNVERIFIED": "Unverified", + "VERIFIED": "Verified", + "AMOUNT_RECEIVE": "will be released from your balance", + "DELETE_WARNING": "Are you sure you want to delete this payment method?", + "STEP_1": "Step 1/3", + "STEP_2": "Step 2/3", + "STEP_3": "Step 3/3", + "P2P_ORDER_CREATED": "P2P Order Created", + "VENDOR_CHECKS_TITLE": "Check & Confirm Payment", + "FUND_RELEASED": "Funds released", + "ORDER_EXPIRY": "Order expiry in", + "MINIMUM_AMOUNT_WARNING": "The minimum {0} is {1}", + "MAXIMUM_AMOUNT_WARNING": "The maximum {0} is {1}", + "ORDER_CREATION": "Order Creation", + "ORDER_CREATION_DESC_1": "By clicking 'Create Order', you'll notify the vendor and receive an instant price quote along with precise payment transfer details. {0} {1} {2} {3}", + "ORDER_CREATION_DESC_2": "This includes the exact amount required to finalize your order.", + "YOU_HAVE_TEXT": "You'll have", + "COMPLETE_PAYMENT_PROCESS": "to complete the payment transfer process.", + "WARINNG_DESC": "Please only continue with the order creation if you truly intend to complete the order.", + "ORDER_CANCEL_DESC": "Cancelling the order may result in account suspension.", + "CONFIRM_ORDER_CREATION": "When you are ready to {0} please click 'Create Order' below.", + "SEND_MONEY": "send the money", + "RECEIVE_MONEY": "receive the money", + "CREATE_ORDER": "Create Order", + "NO_ORDERS_DESC": "Looks like there are no orders here.", + "NO_DEALS_DESC": "Looks like there are no deals here.", + "ONLINE": "ONLINE", + "OFFLINE": "OFFLINE", + "SELECT_CRYPTO": "Select crypto", + "REMOVE_WARNING": "Are you sure you want to remove this deal?", + "SHOW_FILTERS": "SHOW FILTERS", + "HIDE_FILTERS": "HIDE FILTERS", + "ORDERS_COMPLETED": "Orders completed:", + "CANCEL_WARNING_TEXT": "Please note that frequent order cancellations may negatively affect your public P2P profile and could result in your account being suspended.", + "UPDATE": "Update", + "TERMS_ERROR_TEXT": "Please Input Terms field", + "RESPONSE_ERROR_TEXT": "Please Input Response field" + }, + "VOLUME": { + "VOLUME": "VOLUME", + "BACK": "Back", + "MARKETS": "MARKETS", + "CONVERT": "CONVERT", + "HISTORY": "HISTORY", + "TRADING_VOLUME": "Trading Volume", + "VOLUME_DECS": "Traded amounts on your account across different time periods, along with the top 3 assets traded in each period", + "ALL_ASSETS": "all assets", + "DAY_VOLUME": "DAY VOLUME", + "HOUR_VOLUME": "24 HOUR VOLUME", + "TOP": "TOP {0} {1}", + "VOL_ASSET": "D VOL. ASSET", + "NO_DATA_DESC_1": "Looks like you haven't made any trades yet. Start trading now to see your activity here!", + "NO_DATA_DESC_2": "Start trading ", + "NO_DATA_DESC_3": "now to see your activity here!", + "TRADE_VOLUME": "Trade Volume", + "VIEW_VOLUME": "VIEW VOLUME", + "TRADE_DESCRIPTION": "View your top traded asset", + "MARKET_TABLE_DESC": "Visit your trading volume page {0}" + }, + "MORE_OPTIONS_LABEL": { + "MORE_OPTION_SEARCH_TXT": "Search feature or pages", + "NO_RESULT_DESC_1": "Looks there is isn't any results for this.", + "NO_RESULT_DESC_2": "Try searching another keyword.", + "ICONS": { + "REFERRALS": "Referrals", + "BUY_CRYPTO": "Buy crypto", + "API": "API", + "DEFI_STAKE": "Defi Stake", + "CEFI_STAKE": "Cefi Stake", + "PROFIT_LOSS": "P&L", + "LIMITS": "Limits", + "LOGINS": "Logins", + "AUDIO": "Audio" + }, + "HOT_FUNCTION": { + "HOT_FUNCTION_LABEL": "Hot functions", + "ADD_FUNDS": "Add Funds", + "TOP_UP": " Top-Up", + "LOAD": "Load", + "CREDIT": "Credit", + "FUND_ACCOUNT": "Fund Account", + "BTC": "btc", + "USTD": "usdt", + "ETH": "eth", + "USD": "usd", + "XHT": "xht", + "TRANSFER": "transfer", + "MONEY": "money", + "FUNDING": "funding", + "RECHARGE": "recharge", + "REFILL": "refill", + "CASH_IN": "cash in", + "ADD_MONEY": "add money", + "EXCHANGE": "Exchange", + "SWAP": "Swap", + "BUY_SELL": "Buy/Sell", + "TRADE": "Trade", + "CONVERT_CURRENCY": "Convert Currency", + "INVITE": "Invite", + "REFER": "Refer", + "REWARDS": "Rewards", + "BONUS": "Bonus", + "AFFILIATION": "affiliation", + "AFFILIATE": "affiliate", + "PASSIVE_INCOME": "Passive Income", + "REVENUE": "revenue" + }, + "OTHER_FUNCTIONS": { + "OTHER_FUNCTIONS_LABEL": "Other Functions", + "INTEGRATION": "Integration", + "PROGRAMMATIC_ACCESS": "Programmatic Access", + "DEVELOPER": "Developer", + "AUTOMATED_TRADING": "Automated Trading", + "BOT": "Bot", + "ALGO": "Algo", + "ALGORITHM": "algorithm", + "FIAT": "fiat", + "DOLLAR": "dollar", + "PURCHASE": "purchase", + "BUY_COIN": "Buy Coin", + "BUY_TOKEN": "Buy Token", + "YIELD": "Yield", + "INTEREST": "Interest", + "REVENUE": "revenue", + "CENTRALIZED_STAKING": "Centralized Staking", + "PERFORMANCE": "Performance", + "GAINS": "Gains", + "LOSSES": "Losses", + "PORTFOLIO_PROFIT": "Portfolio profit", + "LOSS": "loss", + "PNL": "pnl", + "CHARGES": "Charges", + "COSTS": "Costs", + "COMMISSION": "Commission", + "TRADING_FEES": "Trading Fees", + "TRANSACTION_FEES": "Transaction Fees", + "RESTRICTIONS": "Restrictions", + "BOUNDARIES": "Boundaries", + "CAPS": "Caps", + "MAXIMUM": "Maximum", + "WITHDRAWAL_LIMITS": "Withdrawal Limits", + "STORAGE": "Storage", + "FUNDS": "Funds", + "BALANCE": "Balance", + "CRYPTO_WALLET": "Crypto Wallet", + "MY": "my", + "ENGLISH": "english", + "LOCALIZATION": "Localization", + "TRANSLATE": "Translate", + "LANGUAGE_SETTINGS": "Language Settings", + "MULTILINGUAL": "Multilingual", + "LANGUAGE_PREFERENCE": "Language Preference", + "TEXT": "text", + "WORD": "word", + "PEER_TO_PEER": "Peer-to-Peer", + "DIRECT_TRADE": "Direct Trade", + "USER_TO_USER": "User-to-User", + "PRIVATE_TRADE": "Private Trade", + "TRANSACTIONS": "Transactions", + "ACTIVITY": "Activity", + "RECORD": "Record", + "LOG": "Log", + "TRANSACTION_HISTORY": "Transaction History", + "LIQUIDITY": "Liquidity", + "MARKET_VOLUME": "Market Volume", + "TRADING_ACTIVITY": "Trading Activity", + "MARKETS": "markets", + "CRYPTO": "crypto", + "TWO_FACTOR_AUTHENTICATION": "Two-Factor Authentication", + "MFA": "MFA", + "AUTHENTICATOR": "Authenticator", + "OTP": "otp", + "CREDENTIALS": "Credentials", + "PASSWORD_RESET": "Password Reset", + "SIGN_INS": "Sign-ins", + "ACCOUNT_ACCESS": "Account Access", + "SESSION_HISTORY": "Session History", + "LOGGED_IN": "Logged In", + "SESSION_MANAGEMENT": "Session Management", + "CURRENT_SESSIONS": "Current Sessions", + "BANKING_DETAILS": "Banking Details", + "BANK_ACCOUNT": "Bank Account", + "FINANCIAL_INSTITUTION": "Financial Institution", + "BANK_INFO": "Bank Info", + "WITHDRAWAL_ACCOUNT": "Withdrawal Account", + "FUND": "fund", + "SOUND": "Sound", + "AUDIO_SETTINGS": "Audio Settings", + "ALERTS": "Alerts", + "NOTIFICATIONS": "Notifications", + "AUDIO_ALERTS": "Audio Alerts", + "SECURITY": "security", + "CONTACT": "Contact", + "EMAIL_ADDRESS": "Email Address", + "MAIL": "Mail", + "EMAIL_CONTACT": "Email Contact", + "KYC": "kyc", + "SMS": "SMS", + "KYC_CAPS": "KYC", + "ID": "ID", + "PERSONAL_INFO": "Personal Info", + "IDENTITY_CHECK": "Identity Check", + "PAYOUT": "Payout", + "CASH_OUT": "Cash Out", + "REMOVE_FUNDS": "Remove Funds", + "OUT": "Out", + "SUPPORT": "support", + "CONTACT_LOWER": "contact", + "EMAIL_LOWER": "email", + "RESOURCE": "resources", + "GUIDES": "guides", + "FAQ": "faq", + "CUSTOMER_SERVICE": "customer service", + "ASSISTANCE": "assistance", + "API_LOWER": "api", + "MESSAGE": "message", + "LIVE_CHAT": "live chat", + "SETTINGS": "settings", + "ALERT": "Alert", + "UPDATES": "Updates", + "REMINDERS": "Reminders", + "UI": "UI", + "USER_INTERFACE": " User Interface", + "LAYOUT": "Layout", + "DESIGN": "Design", + "DASHBOARD": "Dashboard", + "COLOR_THEME": "color theme", + "ORDER_BOOK": "orderbook", + "DARK": "dark", + "LIGHT": "light", + "WITHDRAWAL_ADDRESSES": "Withdrawal Addresses", + "CRYPTO_ADDRESSES": "Crypto Addresses", + "WALLET_ADDRESSES": " Wallet Addresses", + "SAVED_ADDRESSES": "Saved Addresses", + "ADDRESS_BOOK": "Address Book", + "WHITE_LISTED": "white listed" + } + }, + "CONNECTIONS": { + "CHECK_CONNECTION": "Check Connection", + "IP": "IP", + "NORMAL_TEXT": "Normal", + "CONNECTION_ISSUE": "Connection issue", + "SESSION": "Session", + "SERVER_TIME": "Server time", + "PING": "Ping", + "CHECK_PING": "CHECK PING", + "RECONNECT": "Reconnect", + "TOOLTIP_DESC_1": "Check your ping to the exchange server {0}", + "TOOLTIP_DESC_2": "Lower 'ms' is better", + "LOGGED_IN_AT": "Logged in at", + "RECONNECT_DESC": "Reconnect might resolve unknown issues you're experiencing.", + "CONFIRM_RECONNECT_MESSAGE": "Do you want to reconnect?", + "PING_CHECK_TEXT": "Pinging the server. Please wait...", + "RECHECK_PING": "RECHECK PING", + "FAST": "Fast", + "SLOW": "Slow", + "MS": "{0} ms", + "STATUS_NORMAL": "Connection Normal", + "CONNECTION_LABEL": "Connection", + "CONNECTION_ISSUE_DETECTED": "Connection issue detected" + }, + "DESKTOP_NAVIGATION": { + "OTHERS": "Others", + "SUMMARY_DESCRIPTION": "Account level information and accessibility", + "FEES_LIMITS_DESC": "Trading and withdrawal fees. Account limits", + "VOLUME_DESC": "Trading volume summary over time", + "DEPOSIT_DESC": "Access wallet deposit funding options", + "BALANCE_DESC": "All your assets and their balances", + "PERFORMANCE_DESC": "Wallet profit and loss", + "HISTORY_DESC": "Review all trades, deposit & withdrawals", + "ADDRESS_BOOK_DESC": "Contact address book for withdrawals", + "WITHDRAW_DESC": "Wallet withdrawals & transfers", + "ASSETS_DESC": "Track prices and discover asset data", + "CONVERT_DESC": "Trade any asset for another simply", + "MARKET_DESC": "Spot trading orderbook markets.", + "P2P_DESC": "Crypto trading", + "REFERRAL_DESC": "Earn passive income by inviting your friends", + "CEFI_STAKE_DESC": "Stake asset from your exchange wallet", + "DEFI_STAKE_DESC": "Connect wallet and stake your asset", + "BUY_CRYPTO_DESC": "Buy through direct bank transfer or cards", + "SECURITY_DESC": "Account 2FA, password and APIs", + "VERIFICATION_DESC": "Account identity verification", + "SETTINGS_DESC": "Interface and other account settings", + "SUMMARY_PAGE": "Summary page", + "SIGNOUT_DESC": "Account logout", + "LANGUAGE_DESC": "Change Language Preference", + "API_DESC": "Use API keys to programatically access your account", + "HELP_DESC": "Get help. Support contact", + "TRANSACTION_DESC": "Review all trades, deposits & withdrawals", + "ONRAMPER_DESC": "Use Onramper to buy and sell crypto" } } diff --git a/web/src/config/lang/es.json b/web/src/config/lang/es.json index c6c405cd09..9ae8046821 100644 --- a/web/src/config/lang/es.json +++ b/web/src/config/lang/es.json @@ -143,7 +143,7 @@ "OPTION_BUG": "Reportar error", "OPTION_PERSONAL_INFO": "Cambiar información personal", "OPTION_BANK_TRANSFER": "Transferencia bancaria", - "OPTION_REQUEST": "Solicitar invitación para HollaEx Exchange" + "OPTION_REQUEST": "Solicitar invitación para Exchange" }, "SUBJECT_LABEL": "Tema", "SUBJECT_PLACEHOLDER": "Escribir el tema de su problema", @@ -169,7 +169,8 @@ "QR_CODE": "Este Código QR se puede escanear por la persona que quiere enviarle fondos", "NO_DATA": "No hay información disponible", "FULL_MESSAGE_LIMIT": "{0}: {1} {2} {3}", - "QR_CODE_TITLE": "{0} Información de depósito" + "QR_CODE_TITLE": "{0} Información de depósito", + "VIEW_DEPOSIT": "Ver depósito" }, "LOGIN": { "LOGIN_TO": "Iniciar sesión a {0}", @@ -283,7 +284,10 @@ "MOBILE_WALLET_BALANCE_LABEL": "Libra/Este. USDT", "MOBILE_WALLET_SHARE_LABEL": "%Compartir/Est. USDT", "VIEW_MORE_WALLET_INFO": "VER MÁS INFORMACIÓN DE LA BILLETERA", - "VIEW_WALLET_TRANSACTION_HISTORY": "VER EL HISTORIAL DE TRANSACCIONES DE WALLET" + "VIEW_WALLET_TRANSACTION_HISTORY": "VER EL HISTORIAL DE TRANSACCIONES DE WALLET", + "ORDERS_HOLD": "Tienes {0} {1}, lo que resulta en una retención de {2} {3} en tu saldo de {4}", + "OPEN_ORDERS_SINGULAR": "orden abierta", + "VIEW_WALLET": "Ver billetera" }, "REQUEST_RESET_PASSWORD": { "TITLE": "Recuperar Cuenta", @@ -622,7 +626,8 @@ "CANCEL": "Cancelar", "PLACEHOLDER": "Escriba aquí" } - } + }, + "TITLE_TEXT": "Revise la configuración de su cuenta ajustando preferencias como el diseño de la interfaz, las preferencias de notificación, el nombre de usuario y otras personalizaciones." }, "TRANSACTION_HISTORY": { "TITLE": "Historial", @@ -677,13 +682,13 @@ "FORFEITURE_OF_EARNINGS_DETAILS_LABEL": "Pérdida de ganancias", "STAKE_AMOUNT_LABEL": "Cantidad de apuesta", "DISCLAIMER_NOTICE": "Descargo de responsabilidad: tenga en cuenta que para cantidades valoradas en USD que superen los $1,000, se requerirá completar la verificación de identidad. Este valor incluye ganancias, y la plataforma se reserva el derecho de solicitar información adicional del usuario.", - "SETTLEMENT_NOTICE": "Liquidación: Se aplicará un período de liquidación de 24 horas al desbloquear.", + "SETTLEMENT_NOTICE": "{0} Se aplicará un período de liquidación de 24 horas al momento de deshacer el staking.", "CONFIRM_BUTTON": "Confirmar", "STAKE_RULES_NOTICE": "Tan pronto como haya realizado la apuesta, estará comprometido con las reglas del pool.", "I_UNDERSTAND_AGAIN_BUTTON": "Entiendo nuevamente", "CONGRATULATIONS_NOTICE": "¡Felicidades!", "EARNINGS_START_NOTICE": "Su apuesta comenzará a generar ganancias.", - "REVIEW_PROGRESS_LABEL": "Puede revisar el progreso de su apuesta en la página de Apuestas Activas.", + "REVIEW_PROGRESS_LABEL": "Puede revisar el progreso de su apuesta en {0}", "TIME_REMAINING_LABEL": "Tiempo restante", "PENALTY_UPON_INITIAL_STAKE_PRINCIPLE_LABEL_2": "Penalización al principio del principio de la apuesta", "FORFEITURE_OF_EARNINGS_LABEL_2": "Pérdida de ganancias", @@ -693,7 +698,26 @@ "VISIT_WALLET_BUTTON": "VISITAR BILLETERA", "CLOSE_BUTTON": "CERRAR", "ACTIVE_STAKES": "Apuestas activas", - "STAKES_HISTORY": "Historia" + "STAKES_HISTORY": "Historia", + "SETTLEMENT_NOTICE_TITLE": "Asentamiento:", + "REVIEW_PROGRESS_ACTIVE_LINK": "Página de apuestas activas", + "STAKING": "Conceptos básicos de apuestas", + "SLASHING": "Cuchillada", + "MINIMUM_AMOUNT_ALLOWED": "La cantidad mínima permitida para el pool de staking es", + "MAXIMUM_AMOUNT_ALLOWED": "La cantidad máxima permitida del pool de staking es", + "DAYS": "Días", + "CONFIRM_STAKE_DECS": "¡Aquí vamos!", + "DO_YOU_UNDERSTAND": "¿Lo entiendes?", + "SUCCESSFULLY_STAKED_IN": "Apostado con éxito en", + "SUCCESSFULLY_STAKED": "Apostado con éxito", + "VIEW_ACTIVE_STAKES": "VER PARTICIPACIONES ACTIVAS", + "REVIEW_AND_UNSTAKE": "Revisar y anular el stake", + "NO_REWARD": "No hay monto de recompensa a recibir", + "SUCCESSFULLY_UNSTAKED": "Has desdoblado tu apuesta con éxito", + "MIN": "Mínimo", + "UNSTAKING": "DESESTIMULANDO...", + "UNSTAKED": "SIN ESTAFAR", + "TOOLTIP": "La penalización que recibirás si cancelas tu apuesta demasiado pronto. {0}" }, "ACCOUNT_SECURITY": { "TITLE_TEXT": "Ajustar la configuración de seguridad para su cuenta, desde la autenticación de dos factores, contraseña, Clave API y otras funciones relacionadas a la seguridad.", @@ -920,7 +944,9 @@ "ENTER_AMOUNT": "Ingrese el monto", "REMOVE_TITLE": "Remover etiqueta", "MAX_AMOUNT_WARNING_INFO": "Esta cantidad excede su límite máximo de retiro.", - "ZERO_BALANCE": "No tienes suficiente saldo disponible." + "ZERO_BALANCE": "No tienes suficiente saldo disponible.", + "MIN_AMOUNT_WARNING_INFO": "El monto mínimo de retiro es {0}", + "NEW_ADDRESS": "Nueva dirección" }, "WALLET_BUTTON_BASE_DEPOSIT": "depósito", "WALLET_BUTTON_BASE_WITHDRAW": "retirar", @@ -1281,7 +1307,8 @@ "INSUFFICIENT_LABEL": "Monto de liquidación insuficiente", "INSUFFICIENT_INFO_1": "Actualmente sus ingresos no son suficientes para la liquidación. Invita a más miembros utilizando tu enlace de referencia y espera hasta que tus ganancias pendientes de pago {0} {1}", "INSUFFICIENT_INFO_2": "exceder 1", - "GO_TO_REFERRAL": "Ir a referencia" + "GO_TO_REFERRAL": "Ir a referencia", + "REFER_DESC": "Comparte el enlace a continuación con tus amigos para comenzar a ganar comisiones por sus operaciones." }, "NOT_LOGGEDIN": { "TXT_1": "Para empezar a comerciar tiene que iniciar sesión", @@ -1343,7 +1370,11 @@ "TRADING_SYMBOL": "Símbolo comercial", "ASSET": "Activo", "TYPE": "Tipo", - "SOURCE": "FUENTE" + "SOURCE": "FUENTE", + "PERCENTAGE": "% {0}", + "24H": "24H", + "TREND_7D": "Tendencia 7D", + "BUY": "Comprar {0} {1}" }, "DEPOSIT_STATUS": { "STATUS_DESCRIPTION": "Puede revisar el estado de su depósito introduciendo el ID de transacción (hash) abajo.", @@ -1516,7 +1547,10 @@ "TITLE": "Instalar MetaMask", "PROMPT": "Debes instalar Metamask en tu navegador: {0}" }, - "INSTALL_METAMASK_TITLE": "MetaMask no detectado" + "INSTALL_METAMASK_TITLE": "MetaMask no detectado", + "EARN_REWARD": "Gane recompensas por hacer staking de sus activos digitales", + "DEFI_STAKING": "Participación en DeFi", + "CEFI_STAKING": "Estaca CeFi" }, "UNSTAKE": { "TITLE": "Desapuesta", @@ -1690,7 +1724,7 @@ }, "AMOUNT_IN": "Cantidad en", "SUMMARY_MARKETS": { - "HOLLAEX": "¿Quiere enumerar sus activos digitales? Inicie su propio mercado con su HollaEx {0} {1}", + "HOLLAEX": "¿Quiere enumerar sus activos digitales? Inicie su propio mercado con su {0} {1}", "WHITE_LABEL": "etiqueta blanca", "SOLUTION": "solución", "VISIT_COIN_INFO_PAGE": "Visita la página de información de monedas {0}", @@ -1781,7 +1815,7 @@ "WITHDRAWALS_FORM_METHOD": "Método", "WITHDRAWALS_FORM_ADDRESS_EXCHANGE": "Correo electrónico de usuario de Exchange", "WITHDRAWALS_FORM_EXCHANGE_PLACEHOLDER": "Ingrese el correo electrónico del usuario en este intercambio", - "WITHDRAWALS_FORM_MAIL_INFO": "Ingrese el correo electrónico de la cuenta HollaEx de un usuario que esté en este intercambio y transfiera de forma gratuita.", + "WITHDRAWALS_FORM_MAIL_INFO": "Ingrese el correo electrónico de la cuenta de un usuario que esté en este intercambio y transfiera de forma gratuita.", "RISKY_TRADE_DISCLAIMER": { "MSG_1": "Compruebe que realmente desea intercambiar {0} ({1}), ya que este activo puede conllevar un alto riesgo de", "MSG_2": "volatilidad extrema", @@ -1854,7 +1888,8 @@ "WALLET_BALANCE_ESTIMATE": "Estimación del saldo de la billetera de hoy ", "VIEW_BALANCE_HISTORY": "VER HISTORIAL DE SALDO", "VIEW_PERCENTAGE_SHARE": "VER PORCENTAJE DE PARTICIPACIÓN", - "VIEW_WALLET_P&L": "VER P&L DE MONEDERO" + "VIEW_WALLET_P&L": "VER P&L DE MONEDERO", + "BALANCE_PERCENTAGE": "Porcentaje de saldo" }, "ASSET_INFO": "Información del activo", "TAKER_FEES_APPLIED": "Se aplican tarifas al tomador", @@ -1872,7 +1907,18 @@ "ORDERBOOK": "Cartera de pedidos", "NETWORK": "Corredor de red OTC", "BROKER": "Corredor local OTC", - "BROKERAGE": "NA - (Corretaje)" + "BROKERAGE": "NA - (Corretaje)", + "LOADING_PRICES": "Cargando precios...", + "INPUT_LABEL": "Ingrese el nombre o símbolo del activo", + "HIGHLIGHTS": "Reflejos", + "MOBILE_DESC": "Seleccione un mercado a continuación para comenzar a operar.", + "PRICE_24H": "Precio/24H %", + "CARDS": { + "GAINERS": "Ganadores", + "LOSERS": "Perdedores", + "MARKET_CAP": "Capitalización de mercado", + "24H": "{0} 24H" + } }, "HOLLAEX_TOKEN": { "REMOVE_FAVOURITES": "Quitar de favoritos", @@ -1918,7 +1964,8 @@ "TAG": "Etiqueta:", "DISABLED_DEPOSIT_CONTENT": "La función de depósito no está disponible temporalmente.", "DISABLED_WITHDRAW_CONTENT": "La función de retiro no está disponible temporalmente.", - "DEPOSIT_LABEL": "Depósito" + "DEPOSIT_LABEL": "Depósito", + "VOLUME": "VOLUMEN" }, "ASYNC_LINK": { "TITLE": "¿La página no se abre automáticamente?", @@ -2191,7 +2238,7 @@ "TOTAL_ASSET_SELL_1": "Total", "TOTAL_ASSET_SELL_2": "puedes vender", "BUY_ORDER_LIMITS": "LÍMITES DE ORDEN DE COMPRA", - "MIN_MAX_ORDER_VALUE_1": "Mínimo y máximo", + "MIN_MAX_ORDER_VALUE_1": "Mínimo y máximo {0} {1}", "MIN_MAX_ORDER_VALUE_2": "valor del pedido de compra en", "PAYMENT_METHODS_SEND_FIAT": "FORMAS DE PAGO PARA ENVIAR FIAT", "SELECT_PAYMENT_METHODS_1": "Seleccione hasta", @@ -2207,7 +2254,7 @@ "DEAL_EDITED": "La oferta ha sido editada.", "DEAL_CREATED": "Se ha creado el trato.", "NEXT": "PRÓXIMO", - "ADD_PAYMENT_METHOD_DETAILS": "Agregar detalles del método de pago", + "ADD_PAYMENT_METHOD_DETAILS": "{0} Detalles del método de pago", "COMPLETE": "Completo", "STEP_SET_TYPE_PRICE": "Establecer el tipo y precio", "STEP_SET_TOTAL_AMOUNT_PAYMENT_METHODS": "Establecer el monto total y los métodos de pago", @@ -2237,6 +2284,400 @@ "ALL_REGION": "Toda la región", "BUYER_NOT_MADE_THE_PAYMENT": "El comprador aún no ha confirmado su pago.", "PRICE_TO_ADVERTISE": "Precio que anunciarás para vender", - "VIEW_PROFILE": "Ver el perfil del proveedor" + "VIEW_PROFILE": "Ver el perfil del proveedor", + "P2P_METHODS": "Métodos de pago P2P", + "PAYMENT_METHODS": "MÉTODOS DE PAGO", + "PAYMENT_METHODS_DEC": "Puede vender criptomonedas y recibir pagos en moneda fiduciaria agregando los datos de su cuenta de pago personal, como información bancaria u otros métodos de pago locales. Asegúrese de que el nombre asociado a su cuenta de pago coincida con el nombre que figura en sus datos verificados antes de agregar su información de pago.", + "SELL_AMOUNT": "Monto de venta", + "ADD_PAYMENT_METHOD": "+ AÑADIR MÉTODO DE PAGO", + "REMOVE": "ELIMINAR", + "DYNAMIC": "DINÁMICA", + "TYPE": "TIPO", + "BACK_TO_ORDERS": "A las órdenes", + "FUNDS_TRANSFERRED_USER": "El usuario confirmó la transacción y los fondos se han transferido a su saldo.", + "CONFIRM_TRANSFER_USER": "CONFIRMAR TRANSFERENCIA Y NOTIFICAR AL USUARIO", + "BUYER_SENT_FUNDS_USER": "Le has indicado al usuario que has enviado los fondos. Espera una respuesta del usuario.", + "VENDOR_CONFIRMED_ORDER_USER": "El usuario confirmó la transacción y liberó los fondos.", + "BUY_UPPER": "COMPRAR", + "CRYPTO_WANT_TO_BUY": "Criptomoneda que quieres comprar", + "FIAT_CURRENCY_WANT_TO_SPEND": "Moneda fiduciaria para gastar", + "PRICE_ADVERTISE": "Precio que anunciarás a {0}", + "TOTAL_AMOUNT": "Importe total", + "BUY_SELL_DESC": "Puedes {0}", + "SELL_ORDER_LIMITS": "LÍMITES DE LA ÓRDEN DE VENTA", + "MIN_MAX_ORDER_VALUE_3": "valor de la orden de venta", + "PAYMENT_METHODS_RECEIVE_FIAT": "MÉTODOS DE PAGO PARA RECIBIR FIAT", + "PAYMENT_TIME_LIMIT_LABEL": "Límite de tiempo de pago: {0}", + "30_MINUTES": "30 minutos", + "DELETE_UPPERCASE": "BORRAR", + "CLICK_TO_VIEW": "HAGA CLIC PARA VER", + "NEW_MESSAGE": "Has recibido un mensaje P2P", + "STATUS_UPDATE": "Tienes una actualización sobre tu pedido P2P", + "APPEAL_STATUS_MESSAGE": "Su orden P2P ha sido apelada", + "CANCEL_STATUS_MESSAGE": "Su pedido P2P ha sido cancelado", + "CONFIRM_STATUS_MESSAGE": "Su pedido P2P ha sido confirmado", + "NEW_ORDER_CREATED": "Se ha creado una nueva orden P2P", + "CRYPTO_RELEASE_STATUS_MESSAGE": "Crypto ha sido liberado del orden", + "ADDITIONAL_PAYMENT_DETAILS": "Añadir detalles de pago adicionales", + "PAYMENT_FIELD_INFO": "Este nuevo campo de pago es adicional y debería ayudar a los participantes P2P en sus transferencias de moneda fiduciaria. Debe incluir detalles de la cuenta relacionados con el método de pago. Esto puede incluir números de teléfono, nombres de usuario, números de cuenta únicos y otra información necesaria para las transacciones según el sistema de métodos de pago.", + "PAYMENT_DETAIL_NAME": "Nombre del detalle del pago", + "REQUIRED_OR_OPTIONAL": "Obligatorio u opcional", + "CREATE_NEW_PAYMENT_METHODS": "Crear y agregar nuevos métodos de pago", + "MANUAL_PAYMENT_METHOD_ENTRY": "Para agregar un método de pago a su plataforma P2P, puede hacerlo manualmente ingresando el nombre del método de pago y los detalles de pago requeridos. Por ejemplo, PayPal utiliza direcciones de correo electrónico para enviar y recibir fondos.", + "USERS_PAYMENT_SELECTION": "Una vez que se agrega el método de pago, los comerciantes y usuarios P2P podrán seleccionarlo e ingresar la información necesaria al realizar o recibir pagos. Los detalles que proporcionen se compartirán con la otra parte en la transacción P2P.", + "METHOD_NAME_AND_DETAIL": "Nombre del método y detalle principal del pago", + "ADD_NEW_PAYMENT_METHODS": "Seleccione nuevos métodos de pago:", + "DETAIL_NAME": "Nombre del detalle del pago", + "DETAIL_VALUE": "Valor del detalle del pago", + "DETAIL_REQUIRED": "Requerido", + "IMPORTANT_DETAIL": "(Detalle de pago importante)", + "DETAIL_OPTIONAL": "Opcional", + "OPTIONAL_DETAIL": "(Detalle de pago opcional)", + "ADD_NEW_PAYMENT_FIELD": "Agregar nuevo campo de detalle de pago", + "PAYMENT_METHOD_CREATED": "¡Método de pago creado! Esperando verificación por parte del administrador", + "PAYMENT_METHOD_DELETED": "Método de pago eliminado.", + "PAYMENT_METHOD_UPDATED": "Método de pago actualizado.", + "CRYPTO": "Criptomoneda:", + "INPUT_SPEND_AMOUNT": "Ingrese el monto gastado", + "INPUT_SELL_AMOUNT": "Ingrese el monto de venta", + "TIMES": "veces", + "FEEDBACK": "Comentario", + "ASSET": "Activo: ", + "CUSTOM": "Costumbre", + "CANCELLED": "Cancelado", + "APPEALED": "Apelado", + "EXPIRED": "Venció", + "RATE": "Tasa:", + "BUYING": "Comprando {0}", + "SELLING": "Venta {0}", + "TERMS_AND_CONDITION_DESCRIPTION": "Publique dentro de los 15 minutos posteriores a la finalización de la oferta.", + "VISIT_OUR_WEBSITE": "Visita nuestro sitio web", + "SELECT_PAYMENT_SYSTEM_LABEL": "Seleccione el sistema de pago", + "FIELD": "Campo", + "NEW_PAYMENT_PLACEHOLDER": "Ingrese el valor del detalle del pago", + "FIELD_VALIDATION_TEXT": "Por favor, introduzca todos los campos del método", + "INPUT_METHOD_NAME_TEXT": "Por favor ingrese el nombre del método", + "INPUT_PAYMENT_DETAIL_TEXT": "Introduzca el nombre del detalle del pago", + "UNVERIFIED": "Inconfirmado", + "VERIFIED": "Verificado", + "AMOUNT_RECEIVE": "se liberará de su saldo", + "DELETE_WARNING": "¿Está seguro de que desea eliminar este método de pago?", + "STEP_1": "Paso 1/3", + "STEP_2": "Paso 2/3", + "STEP_3": "Paso 3/3", + "P2P_ORDER_CREATED": "Orden P2P creada", + "VENDOR_CHECKS_TITLE": "Verificar y confirmar pago", + "FUND_RELEASED": "Fondos liberados", + "ORDER_EXPIRY": "Vencimiento del pedido en", + "MINIMUM_AMOUNT_WARNING": "El mínimo {0} es {1}", + "MAXIMUM_AMOUNT_WARNING": "El máximo {0} es {1}", + "ORDER_CREATION": "Creación de pedidos", + "ORDER_CREATION_DESC_1": "Al hacer clic en \"Crear pedido\", notificará al proveedor y recibirá una cotización instantánea junto con los detalles precisos de la transferencia de pago. {0} {1} {2} {3}", + "ORDER_CREATION_DESC_2": "Esto incluye la cantidad exacta necesaria para finalizar su pedido.", + "YOU_HAVE_TEXT": "Tendrás", + "COMPLETE_PAYMENT_PROCESS": "para completar el proceso de transferencia de pago.", + "WARINNG_DESC": "Continúe con la creación del pedido solo si realmente desea completarlo.", + "ORDER_CANCEL_DESC": "La cancelación del pedido puede resultar en la suspensión de la cuenta.", + "CONFIRM_ORDER_CREATION": "Cuando esté listo para {0}, haga clic en \"Crear pedido\" a continuación.", + "SEND_MONEY": "Envía el dinero", + "RECEIVE_MONEY": "recibir el dinero", + "CREATE_ORDER": "Crear orden", + "NO_ORDERS_DESC": "Parece que no hay pedidos aquí.", + "NO_DEALS_DESC": "Parece que no hay ofertas aquí.", + "ONLINE": "EN LÍNEA", + "OFFLINE": "DESCONECTADO", + "SELECT_CRYPTO": "Seleccione cripto", + "REMOVE_WARNING": "¿Está seguro de que desea eliminar esta oferta?", + "SHOW_FILTERS": "MOSTRAR FILTROS", + "HIDE_FILTERS": "OCULTAR FILTROS", + "ORDERS_COMPLETED": "Pedidos completados:", + "CANCEL_WARNING_TEXT": "Tenga en cuenta que las cancelaciones frecuentes de pedidos pueden afectar negativamente su perfil P2P público y podrían provocar la suspensión de su cuenta.", + "UPDATE": "Actualizar", + "TERMS_ERROR_TEXT": "Por favor ingrese el campo Términos", + "RESPONSE_ERROR_TEXT": "Por favor ingrese el campo de respuesta" + }, + "CUSTOM_NATIVE_CURRENCY": "Moneda (estimaciones de precios y valores de activos)", + "ADDRESS_BOOK": { + "ADDRESS_BOOK_LABEL": "Libreta de direcciones", + "ADDRESS_BOOK_DESC_1": "Agregue una dirección de retiro incluida en la lista blanca a su libreta de direcciones personal", + "ADDRESS_BOOK_DESC_2": "Podrás utilizar estas direcciones fácilmente al momento de realizar retiros.", + "ADD_ADDRESS_LINK": "Agregar dirección", + "ADD_WITHDRAW_ADDRESS": "Agregar dirección de retiro", + "DATE_ADDED": "Fecha añadida", + "REMOVE": "Eliminar", + "NO_LINK": "Aún no se ha agregado ninguna dirección de retiro.", + "ADD_WITHDRAW_ADDRESS_DESC_1": "Agregue una dirección incluida en la lista blanca a la que pueda retirar monedas de forma segura.", + "ADD_WITHDRAW_ADDRESS_DESC_2": "Esta dirección de retiro debe ser una dirección bajo su control.", + "NAME_YOUR_ADDRESS_TITLE": "Nombre su dirección", + "NAME_YOUR_ADDRESS_DESC": "Dale un nombre a esta dirección de retiro para tu futura referencia.", + "USER_LABEL": "Nombre/etiqueta:", + "USER_FIELD_PLACEHOLDER": "Nombra esta dirección de retiro", + "CHECK_AND_CONFIRM": "Comprobar y confirmar", + "WARNING_ADDRESS": "Antes de agregar esta dirección a su libreta de direcciones, tómese el tiempo para verificar y confirmar que los detalles sean correctos:", + "ENSURE_DESC": "Asegúrese de que la dirección sea correcta y esté bajo su control.", + "ADDRESSES": "Direcciones", + "WITHDRAWAL_ADDRESS_BOOK": "Libreta de direcciones de retiro", + "ADD_ADDRESS_DESC": "Agregar dirección de retiro a {0}", + "ADDRESS_BOOK": "Libreta de direcciones", + "MANAGE_ADDRESS_BOOK": "Administrar la libreta de direcciones", + "VIEW_ADDRESS_BOOK_LABEL": "Ver libreta de direcciones", + "ADD_WITHDRAWAL_ADDRESS_LINK": "Agregar dirección de retiro", + "REVOKE_ADDRESS": "Su dirección ha sido eliminada", + "REMOVE_ADDRESS": "Eliminar dirección", + "REMOVE_CONTENT": "¿Quieres eliminar esta dirección de retiro de tu libreta de direcciones?" + }, + "VOLUME": { + "VOLUME": "VOLUMEN", + "BACK": "Atrás", + "MARKETS": "MERCADOS", + "CONVERT": "CONVERTIR", + "HISTORY": "HISTORIA", + "TRADING_VOLUME": "Volumen de operaciones", + "VOLUME_DECS": "Montos negociados en su cuenta en diferentes períodos de tiempo, junto con los 3 principales activos negociados en cada período", + "ALL_ASSETS": "Todos los activos", + "DAY_VOLUME": "VOLUMEN DIA", + "HOUR_VOLUME": "VOLUMEN DE 24 HORAS", + "TOP": "ARRIBA {0} {1}", + "VOL_ASSET": "D VOL. ACTIVO", + "NO_DATA_DESC_1": "Parece que aún no has realizado ninguna operación. ¡Comienza a operar ahora para ver tu actividad aquí!", + "NO_DATA_DESC_2": "Empiece a operar", + "NO_DATA_DESC_3": "¡Ahora a ver tu actividad aquí!", + "TRADE_VOLUME": "Volumen comercial", + "VIEW_VOLUME": "VER VOLUMEN", + "TRADE_DESCRIPTION": "Vea su activo más comercializado", + "MARKET_TABLE_DESC": "Visita tu página de volumen de operaciones {0}" + }, + "MORE_OPTIONS_LABEL": { + "MORE_OPTION_SEARCH_TXT": "Función de búsqueda o páginas", + "NO_RESULT_DESC_1": "Parece que no hay ningún resultado para esto.", + "NO_RESULT_DESC_2": "Intente buscar otra palabra clave.", + "ICONS": { + "REFERRALS": "Referencias", + "BUY_CRYPTO": "Comprar criptomonedas", + "API": "API", + "DEFI_STAKE": "Participación en DeFi", + "CEFI_STAKE": "Estaca Cefi", + "PROFIT_LOSS": "Pérdidas y ganancias", + "LIMITS": "Límites", + "LOGINS": "Inicios de sesión", + "AUDIO": "Audio" + }, + "HOT_FUNCTION": { + "HOT_FUNCTION_LABEL": "Funciones calientes", + "ADD_FUNDS": "Añadir fondos", + "TOP_UP": "Recarga", + "LOAD": "Carga", + "CREDIT": "Crédito", + "FUND_ACCOUNT": "Cuenta de fondos", + "BTC": "Bitcoin", + "USTD": "usdt", + "ETH": "Ét", + "USD": "Dólar estadounidense", + "XHT": "xht", + "TRANSFER": "transferir", + "MONEY": "dinero", + "FUNDING": "fondos", + "RECHARGE": "recargar", + "REFILL": "rellenar", + "CASH_IN": "pagar en", + "ADD_MONEY": "añadir dinero", + "EXCHANGE": "Intercambio", + "SWAP": "Intercambio", + "BUY_SELL": "Comprar/Vender", + "TRADE": "Comercio", + "CONVERT_CURRENCY": "Convertir moneda", + "INVITE": "Invitar", + "REFER": "Referirse", + "REWARDS": "Recompensas", + "BONUS": "Prima", + "AFFILIATION": "afiliación", + "AFFILIATE": "filial", + "PASSIVE_INCOME": "Ingresos pasivos", + "REVENUE": "ganancia" + }, + "OTHER_FUNCTIONS": { + "OTHER_FUNCTIONS_LABEL": "Otras funciones", + "INTEGRATION": "Integración", + "PROGRAMMATIC_ACCESS": "Acceso programático", + "DEVELOPER": "Revelador", + "AUTOMATED_TRADING": "Comercio automatizado", + "BOT": "Bot", + "ALGO": "Algo", + "ALGORITHM": "algoritmo", + "FIAT": "fíat", + "DOLLAR": "dólar", + "PURCHASE": "compra", + "BUY_COIN": "Comprar moneda", + "BUY_TOKEN": "Comprar token", + "YIELD": "Producir", + "INTEREST": "Interés", + "REVENUE": "ganancia", + "CENTRALIZED_STAKING": "Staking centralizado", + "PERFORMANCE": "Actuación", + "GAINS": "Ganancias", + "LOSSES": "Pérdidas", + "PORTFOLIO_PROFIT": "Beneficio de cartera", + "LOSS": "pérdida", + "PNL": "sustantivo, masculino, plural—", + "CHARGES": "Cargos", + "COSTS": "Costos", + "COMMISSION": "Comisión", + "TRADING_FEES": "Tarifas de negociación", + "TRANSACTION_FEES": "Tarifas de transacción", + "RESTRICTIONS": "Restricciones", + "BOUNDARIES": "Límites", + "CAPS": "Gorras", + "MAXIMUM": "Máximo", + "WITHDRAWAL_LIMITS": "Límites de retiro", + "STORAGE": "Almacenamiento", + "FUNDS": "Fondos", + "BALANCE": "Balance", + "CRYPTO_WALLET": "Monedero criptográfico", + "MY": "mi", + "ENGLISH": "inglés", + "LOCALIZATION": "Localización", + "TRANSLATE": "Traducir", + "LANGUAGE_SETTINGS": "Configuración de idioma", + "MULTILINGUAL": "Plurilingüe", + "LANGUAGE_PREFERENCE": "Preferencia de idioma", + "TEXT": "texto", + "WORD": "palabra", + "PEER_TO_PEER": "De igual a igual", + "DIRECT_TRADE": "Comercio directo", + "USER_TO_USER": "De usuario a usuario", + "PRIVATE_TRADE": "Comercio privado", + "TRANSACTIONS": "Actas", + "ACTIVITY": "Actividad", + "RECORD": "Registro", + "LOG": "Registro", + "TRANSACTION_HISTORY": "Historial de transacciones", + "LIQUIDITY": "Liquidez", + "MARKET_VOLUME": "Volumen del mercado", + "TRADING_ACTIVITY": "Actividad comercial", + "MARKETS": "mercados", + "CRYPTO": "cripto", + "TWO_FACTOR_AUTHENTICATION": "Autenticación de dos factores", + "MFA": "Maestría en Bellas Artes", + "AUTHENTICATOR": "Autenticador", + "OTP": "OTP-oficial", + "CREDENTIALS": "Cartas credenciales", + "PASSWORD_RESET": "Restablecer contraseña", + "SIGN_INS": "Registros", + "ACCOUNT_ACCESS": "Acceso a la cuenta", + "SESSION_HISTORY": "Historial de sesiones", + "LOGGED_IN": "Iniciado sesión", + "SESSION_MANAGEMENT": "Gestión de sesiones", + "CURRENT_SESSIONS": "Sesiones actuales", + "BANKING_DETAILS": "Datos bancarios", + "BANK_ACCOUNT": "Cuenta bancaria", + "FINANCIAL_INSTITUTION": "Institución financiera", + "BANK_INFO": "Información bancaria", + "WITHDRAWAL_ACCOUNT": "Cuenta de retiro", + "FUND": "financiar", + "SOUND": "Sonido", + "AUDIO_SETTINGS": "Configuración de audio", + "ALERTS": "Alertas", + "NOTIFICATIONS": "Notificaciones", + "AUDIO_ALERTS": "Alertas de audio", + "SECURITY": "seguridad", + "CONTACT": "Contacto", + "EMAIL_ADDRESS": "Dirección de correo electrónico", + "MAIL": "Correo", + "EMAIL_CONTACT": "Contacto por correo electrónico", + "KYC": "KYC", + "SMS": "Mensaje de texto", + "KYC_CAPS": "Conozca a su cliente", + "ID": "IDENTIFICACIÓN", + "PERSONAL_INFO": "Información personal", + "IDENTITY_CHECK": "Comprobación de identidad", + "PAYOUT": "Pago", + "CASH_OUT": "Retirar dinero en efectivo", + "REMOVE_FUNDS": "Retirar fondos", + "OUT": "Afuera", + "SUPPORT": "apoyo", + "CONTACT_LOWER": "contacto", + "EMAIL_LOWER": "correo electrónico", + "RESOURCE": "recursos", + "GUIDES": "guías", + "FAQ": "Preguntas frecuentes", + "CUSTOMER_SERVICE": "servicio al cliente", + "ASSISTANCE": "asistencia", + "API_LOWER": "api", + "MESSAGE": "mensaje", + "LIVE_CHAT": "chat en vivo", + "SETTINGS": "ajustes", + "ALERT": "Alerta", + "UPDATES": "Actualizaciones", + "REMINDERS": "Recordatorios", + "UI": "Interfaz de usuario", + "USER_INTERFACE": "Interfaz de usuario", + "LAYOUT": "Disposición", + "DESIGN": "Diseño", + "DASHBOARD": "Panel", + "COLOR_THEME": "Tema de color", + "ORDER_BOOK": "cartera de pedidos", + "DARK": "oscuro", + "LIGHT": "luz", + "WITHDRAWAL_ADDRESSES": "Direcciones de retiro", + "CRYPTO_ADDRESSES": "Direcciones criptográficas", + "WALLET_ADDRESSES": "Direcciones de billetera", + "SAVED_ADDRESSES": "Direcciones guardadas", + "ADDRESS_BOOK": "Libreta de direcciones", + "WHITE_LISTED": "en la lista blanca" + } + }, + "CONNECTIONS": { + "CHECK_CONNECTION": "Comprobar conexión", + "IP": "Propiedad intelectual", + "NORMAL_TEXT": "Normal", + "CONNECTION_ISSUE": "Problema de conexión", + "SESSION": "Sesión", + "SERVER_TIME": "Hora del servidor", + "PING": "Silbido", + "CHECK_PING": "COMPROBAR PING", + "RECONNECT": "Reconectar", + "TOOLTIP_DESC_1": "Comprueba tu ping al servidor Exchange {0}", + "TOOLTIP_DESC_2": "Cuanto menor sea el 'ms', mejor", + "LOGGED_IN_AT": "Inició sesión en", + "RECONNECT_DESC": "La reconexión podría resolver problemas desconocidos que estás experimentando.", + "CONFIRM_RECONNECT_MESSAGE": "¿Quieres reconectarte?", + "PING_CHECK_TEXT": "Haciendo ping al servidor. Por favor, espere...", + "RECHECK_PING": "VUELVA A COMPROBAR EL PING", + "FAST": "Rápido", + "SLOW": "Lento", + "MS": "{0} ms", + "STATUS_NORMAL": "Conexión normal", + "CONNECTION_LABEL": "Conexión", + "CONNECTION_ISSUE_DETECTED": "Problema de conexión detectado" + }, + "DESKTOP_NAVIGATION": { + "OTHERS": "Otros", + "SUMMARY_DESCRIPTION": "Información y accesibilidad a nivel de cuenta", + "FEES_LIMITS_DESC": "Tarifas de operaciones y retiros. Límites de cuenta", + "VOLUME_DESC": "Resumen del volumen de operaciones a lo largo del tiempo", + "DEPOSIT_DESC": "Opciones de financiación de depósitos de Access Wallet", + "BALANCE_DESC": "Todos sus activos y sus saldos", + "PERFORMANCE_DESC": "Ganancias y pérdidas de la billetera", + "HISTORY_DESC": "Revisar todas las operaciones, depósitos y retiros", + "ADDRESS_BOOK_DESC": "Libreta de direcciones de contacto para retiros", + "WITHDRAW_DESC": "Retiros y transferencias de billetera", + "ASSETS_DESC": "Realice un seguimiento de los precios y descubra datos de activos", + "CONVERT_DESC": "Intercambiar cualquier activo por otro simplemente", + "MARKET_DESC": "Mercados de libros de órdenes de negociación al contado.", + "P2P_DESC": "Comercio de criptomonedas", + "REFERRAL_DESC": "Gana ingresos pasivos invitando a tus amigos", + "CEFI_STAKE_DESC": "Apuesta por activos desde tu billetera de exchange", + "DEFI_STAKE_DESC": "Conecte su billetera y haga staking de sus activos", + "BUY_CRYPTO_DESC": "Compra mediante transferencia bancaria directa o tarjetas", + "SECURITY_DESC": "Cuenta 2FA, contraseña y API", + "VERIFICATION_DESC": "Verificación de identidad de la cuenta", + "SETTINGS_DESC": "Interfaz y otras configuraciones de la cuenta", + "SUMMARY_PAGE": "Página de resumen", + "SIGNOUT_DESC": "Cerrar sesión de cuenta", + "LANGUAGE_DESC": "Cambiar la preferencia de idioma", + "API_DESC": "Utilice claves API para acceder programáticamente a su cuenta", + "HELP_DESC": "Obtener ayuda. Contacto de soporte", + "TRANSACTION_DESC": "Revisar todas las transacciones, depósitos y retiros", + "ONRAMPER_DESC": "Utilice Onramper para comprar y vender criptomonedas" } } \ No newline at end of file diff --git a/web/src/config/lang/fa.json b/web/src/config/lang/fa.json index acbc51dbef..91923bc622 100644 --- a/web/src/config/lang/fa.json +++ b/web/src/config/lang/fa.json @@ -135,7 +135,7 @@ "OPTION_BUG": "گزارش خطا", "OPTION_PERSONAL_INFO": "تغییر اطلاعات شخصی", "OPTION_BANK_TRANSFER": "تراکنش بانکی", - "OPTION_REQUEST": "درخواست دعوت به اکسچنج HollaEx" + "OPTION_REQUEST": "درخواست دعوت به اکسچنج" }, "SUBJECT_LABEL": "موضوع", "SUBJECT_PLACEHOLDER": "موضوع مشکل خود را تایپ کنید", diff --git a/web/src/config/lang/fr.json b/web/src/config/lang/fr.json index 92c88cdeb2..f423743962 100644 --- a/web/src/config/lang/fr.json +++ b/web/src/config/lang/fr.json @@ -139,7 +139,7 @@ "OPTION_BUG": "Rapporter une erreur", "OPTION_PERSONAL_INFO": "Changer vos informations personnelles", "OPTION_BANK_TRANSFER": "Virement bancaire", - "OPTION_REQUEST": "Demander une invitation pour HollaEx Exchange" + "OPTION_REQUEST": "Demander une invitation pour Exchange" }, "SUBJECT_LABEL": "Sujet", "SUBJECT_PLACEHOLDER": "Indiquez le sujet de votre problème", @@ -165,7 +165,8 @@ "QR_CODE": "Ce QR Code peut être scanner par une personne qui souhaite vous envoyer des fonds", "NO_DATA": "Aucune information disponible", "FULL_MESSAGE_LIMIT": "{0}: {1} {2} {3}", - "QR_CODE_TITLE": "{0} Informations sur le dépôt" + "QR_CODE_TITLE": "{0} Informations sur le dépôt", + "VIEW_DEPOSIT": "Voir le dépôt" }, "LOGIN": { "LOGIN_TO": "S'identifier à {0}", @@ -279,7 +280,10 @@ "MOBILE_WALLET_BALANCE_LABEL": "Balance/Est. USDT", "MOBILE_WALLET_SHARE_LABEL": "%Part/Est. USDT", "VIEW_MORE_WALLET_INFO": "VOIR PLUS D'INFORMATIONS SUR LE PORTEFEUILLE", - "VIEW_WALLET_TRANSACTION_HISTORY": "CONSULTER L'HISTOIRE DES TRANSACTIONS DU PORTEFEUILLE" + "VIEW_WALLET_TRANSACTION_HISTORY": "CONSULTER L'HISTOIRE DES TRANSACTIONS DU PORTEFEUILLE", + "ORDERS_HOLD": "Vous avez {0} {1}, ce qui entraîne une retenue de {2} {3} sur votre solde {4}", + "OPEN_ORDERS_SINGULAR": "commande ouverte", + "VIEW_WALLET": "Voir le portefeuille" }, "REQUEST_RESET_PASSWORD": { "TITLE": "Compte de récupération", @@ -618,7 +622,8 @@ "CANCEL": "Annuler", "PLACEHOLDER": "Écrivez ici" } - } + }, + "TITLE_TEXT": "Révisez les paramètres de votre compte en ajustant les préférences telles que la disposition de l'interface, les préférences de notification, le nom d'utilisateur et d'autres personnalisations." }, "TRANSACTION_HISTORY": { "TITLE": "Historique", @@ -790,13 +795,13 @@ "FORFEITURE_OF_EARNINGS_DETAILS_LABEL": "Confiscation des gains", "STAKE_AMOUNT_LABEL": "Montant du staking", "DISCLAIMER_NOTICE": "Avis de non-responsabilité : Veuillez noter que pour les montants en USD dépassant 1 000 $, une vérification d'identité complète sera nécessaire. Cette valeur inclut les gains, et la plateforme se réserve le droit de demander des informations supplémentaires sur l'utilisateur.", - "SETTLEMENT_NOTICE": "Règlement : Un délai de règlement de 24 heures sera appliqué lors du déstaking.", + "SETTLEMENT_NOTICE": "{0} Un délai de règlement de 24h sera appliqué lors du déblocage.", "CONFIRM_BUTTON": "Confirmer", "STAKE_RULES_NOTICE": "Dès que vous avez staké, vous vous engagez à respecter les règles du pool.", "I_UNDERSTAND_AGAIN_BUTTON": "Je comprends à nouveau", "CONGRATULATIONS_NOTICE": "Félicitations !", "EARNINGS_START_NOTICE": "Votre staking commencera à générer des récompenses.", - "REVIEW_PROGRESS_LABEL": "Vous pouvez suivre l'évolution de votre staking sur la page des Stakings Actifs.", + "REVIEW_PROGRESS_LABEL": "Vous pouvez suivre la progression de votre mise sur le {0}", "TIME_REMAINING_LABEL": "Temps restant", "PENALTY_UPON_INITIAL_STAKE_PRINCIPLE_LABEL_2": "Pénalité sur le montant initial staké", "FORFEITURE_OF_EARNINGS_LABEL_2": "Confiscation des gains", @@ -806,7 +811,26 @@ "VISIT_WALLET_BUTTON": "VISITER LE PORTEFEUILLE", "CLOSE_BUTTON": "FERMER", "ACTIVE_STAKES": "Enjeux actifs", - "STAKES_HISTORY": "Histoire" + "STAKES_HISTORY": "Histoire", + "SETTLEMENT_NOTICE_TITLE": "Règlement:", + "REVIEW_PROGRESS_ACTIVE_LINK": "Page des enjeux actifs", + "STAKING": "Jalonnement 101", + "SLASHING": "Coupure", + "MINIMUM_AMOUNT_ALLOWED": "Le montant minimum autorisé du pool de jalonnement est", + "MAXIMUM_AMOUNT_ALLOWED": "Le montant maximum autorisé du pool de jalonnement est", + "DAYS": "Jours", + "CONFIRM_STAKE_DECS": "On y va!", + "DO_YOU_UNDERSTAND": "Est-ce que tu comprends?", + "SUCCESSFULLY_STAKED_IN": "Jalonnement réussi", + "SUCCESSFULLY_STAKED": "Jalonnement réussi", + "VIEW_ACTIVE_STAKES": "VOIR LES ENJEUX ACTIFS", + "REVIEW_AND_UNSTAKE": "Réviser et désengager", + "NO_REWARD": "Aucun montant de récompense à recevoir", + "SUCCESSFULLY_UNSTAKED": "Vous avez réussi à désengager", + "MIN": "Min", + "UNSTAKING": "DÉGAGEMENT...", + "UNSTAKED": "NON JAUGE", + "TOOLTIP": "La pénalité que vous encourrez si vous annulez votre mise trop tôt. {0}" }, "CURRENCY": "Devise", "TYPE": "Type", @@ -921,7 +945,9 @@ "ENTER_AMOUNT": "Entrer le montant", "REMOVE_TITLE": "Enlever l'étiquette", "MAX_AMOUNT_WARNING_INFO": "Ce montant dépasse votre limite de retrait maximale.", - "ZERO_BALANCE": "Vous n'avez pas suffisamment de solde disponible." + "ZERO_BALANCE": "Vous n'avez pas suffisamment de solde disponible.", + "MIN_AMOUNT_WARNING_INFO": "Le montant minimum de retrait est de {0}", + "NEW_ADDRESS": "Nouvelle adresse" }, "WALLET_BUTTON_BASE_DEPOSIT": "dépôt", "WALLET_BUTTON_BASE_WITHDRAW": "retrait", @@ -1282,7 +1308,8 @@ "INSUFFICIENT_LABEL": "Montant de règlement insuffisant", "INSUFFICIENT_INFO_1": "Vos revenus sont actuellement insuffisants pour le règlement. Veuillez inviter davantage de membres en utilisant votre lien de parrainage et attendre vos revenus non réglés {0} {1}", "INSUFFICIENT_INFO_2": "dépasser 1", - "GO_TO_REFERRAL": "Aller à la référence" + "GO_TO_REFERRAL": "Aller à la référence", + "REFER_DESC": "Partagez un lien ci-dessous avec vos amis pour commencer à gagner des commissions sur leurs transactions" }, "NOT_LOGGEDIN": { "TXT_1": "Pour commencer à trader, vous devez vous connecter", @@ -1468,7 +1495,10 @@ "TITLE": "Installer MetaMask", "PROMPT": "Vous devez installer Metamask dans votre navigateur : {0}" }, - "INSTALL_METAMASK_TITLE": "MetaMask non détecté" + "INSTALL_METAMASK_TITLE": "MetaMask non détecté", + "EARN_REWARD": "Gagnez des récompenses en jalonnant vos actifs numériques", + "DEFI_STAKING": "Jalonnement DeFi", + "CEFI_STAKING": "Jalonnement CeFi" }, "UNSTAKE": { "TITLE": "Détacher", @@ -1683,10 +1713,14 @@ "TRADING_SYMBOL": "Symbole commercial", "ASSET": "Actif", "TYPE": "Taper", - "SOURCE": "SOURCE" + "SOURCE": "SOURCE", + "PERCENTAGE": "% {0}", + "24H": "24H", + "TREND_7D": "Tendance 7D", + "BUY": "Acheter {0} {1}" }, "SUMMARY_MARKETS": { - "HOLLAEX": "Vous souhaitez lister vos actifs numériques ? Démarrez votre propre marché avec votre HollaEx {0} {1}", + "HOLLAEX": "Vous souhaitez lister vos actifs numériques ? Démarrez votre propre marché avec votre {0} {1}", "WHITE_LABEL": "marque blanche", "SOLUTION": "solution", "VISIT_COIN_INFO_PAGE": "Consultez la page d'informations sur les pièces {0}", @@ -1860,7 +1894,8 @@ "WALLET_BALANCE_ESTIMATE": "Estimation du solde du portefeuille aujourd'hui ", "VIEW_BALANCE_HISTORY": "VOIR L'HISTOIRE DU SOLDE", "VIEW_PERCENTAGE_SHARE": "VOIR LA PART EN POURCENTAGE", - "VIEW_WALLET_P&L": "VOIR LE P&L DU PORTEFEUILLE" + "VIEW_WALLET_P&L": "VOIR LE P&L DU PORTEFEUILLE", + "BALANCE_PERCENTAGE": "Pourcentage du solde" }, "ASSET_INFO": "Informations sur l'actif", "TAKER_FEES_APPLIED": "Des frais de preneur sont appliqués", @@ -1878,7 +1913,18 @@ "ORDERBOOK": "Carnet de commande", "NETWORK": "Courtier de réseau OTC", "BROKER": "Courtier local OTC", - "BROKERAGE": "NA - (Courtage)" + "BROKERAGE": "NA - (Courtage)", + "LOADING_PRICES": "Chargement des prix...", + "INPUT_LABEL": "Entrez le nom ou le symbole de l'actif", + "HIGHLIGHTS": "Points forts", + "MOBILE_DESC": "Sélectionnez un marché ci-dessous pour commencer à trader.", + "PRICE_24H": "Prix/24H %", + "CARDS": { + "GAINERS": "Les gagnants", + "LOSERS": "Les perdants", + "MARKET_CAP": "Capitalisation boursière", + "24H": "{0} 24 heures" + } }, "HOLLAEX_TOKEN": { "REMOVE_FAVOURITES": "Supprimer des favoris", @@ -1924,7 +1970,8 @@ "TAG": "Étiqueter:", "DISABLED_DEPOSIT_CONTENT": "La fonctionnalité de dépôt est temporairement indisponible.", "DISABLED_WITHDRAW_CONTENT": "La fonctionnalité de retrait est temporairement indisponible.", - "DEPOSIT_LABEL": "Dépôt" + "DEPOSIT_LABEL": "Dépôt", + "VOLUME": "VOLUME" }, "ASYNC_LINK": { "TITLE": "La page ne s'ouvre pas automatiquement ?", @@ -2203,7 +2250,7 @@ "TOTAL_ASSET_SELL_1": "Total", "TOTAL_ASSET_SELL_2": "tu peux vendre", "BUY_ORDER_LIMITS": "LIMITES DES COMMANDES D'ACHAT", - "MIN_MAX_ORDER_VALUE_1": "Minimum et maximum", + "MIN_MAX_ORDER_VALUE_1": "Minimum et maximum {0} {1}", "MIN_MAX_ORDER_VALUE_2": "acheter la valeur de la commande en", "PAYMENT_METHODS_SEND_FIAT": "MÉTHODES DE PAIEMENT POUR ENVOYER FIAT", "SELECT_PAYMENT_METHODS_1": "Sélectionnez jusqu'à", @@ -2219,7 +2266,7 @@ "DEAL_EDITED": "L'offre a été modifiée", "DEAL_CREATED": "L'accord a été créé", "NEXT": "SUIVANT", - "ADD_PAYMENT_METHOD_DETAILS": "Ajouter les détails du mode de paiement", + "ADD_PAYMENT_METHOD_DETAILS": "{0} Détails du mode de paiement", "COMPLETE": "Complet", "STEP_SET_TYPE_PRICE": "Définir le type et le prix", "STEP_SET_TOTAL_AMOUNT_PAYMENT_METHODS": "Définir le montant total et les modes de paiement", @@ -2249,6 +2296,400 @@ "ALL_REGION": "Toute la région", "BUYER_NOT_MADE_THE_PAYMENT": "L'acheteur n'a pas encore confirmé son paiement.", "PRICE_TO_ADVERTISE": "Prix que vous annoncerez pour vendre", - "VIEW_PROFILE": "Afficher le profil du fournisseur" + "VIEW_PROFILE": "Afficher le profil du fournisseur", + "P2P_METHODS": "Méthodes de paiement P2P", + "PAYMENT_METHODS": "MODES DE PAIEMENT", + "PAYMENT_METHODS_DEC": "Vous pouvez vendre des cryptomonnaies et recevoir des paiements fiduciaires en ajoutant les informations de votre compte de paiement personnel, telles que vos informations bancaires ou d'autres méthodes de paiement locales. Assurez-vous que le nom associé à votre compte de paiement correspond au nom figurant dans vos informations vérifiées avant d'ajouter vos informations de paiement.", + "SELL_AMOUNT": "Montant de la vente", + "ADD_PAYMENT_METHOD": "+ AJOUTER UN MODE DE PAIEMENT", + "REMOVE": "RETIRER", + "DYNAMIC": "DYNAMIQUE", + "TYPE": "TAPER", + "BACK_TO_ORDERS": "aux commandes", + "FUNDS_TRANSFERRED_USER": "L'utilisateur a confirmé la transaction et les fonds ont été transférés sur votre solde.", + "CONFIRM_TRANSFER_USER": "CONFIRMER LE TRANSFERT ET NOTIFIER L'UTILISATEUR", + "BUYER_SENT_FUNDS_USER": "Vous avez signalé à l'utilisateur que vous avez envoyé les fonds. Veuillez attendre une réponse de l'utilisateur.", + "VENDOR_CONFIRMED_ORDER_USER": "L'utilisateur a confirmé la transaction et libéré les fonds.", + "BUY_UPPER": "ACHETER", + "CRYPTO_WANT_TO_BUY": "Crypto que vous souhaitez acheter", + "FIAT_CURRENCY_WANT_TO_SPEND": "Monnaie fiduciaire à dépenser", + "PRICE_ADVERTISE": "Prix que vous annoncerez à {0}", + "TOTAL_AMOUNT": "Montant total", + "BUY_SELL_DESC": "tu peux {0}", + "SELL_ORDER_LIMITS": "LIMITES DES ORDRES DE VENTE", + "MIN_MAX_ORDER_VALUE_3": "valeur de l'ordre de vente", + "PAYMENT_METHODS_RECEIVE_FIAT": "MOYENS DE PAIEMENT POUR RECEVOIR FIAT", + "PAYMENT_TIME_LIMIT_LABEL": "Délai de paiement : {0}", + "30_MINUTES": "30 minutes", + "DELETE_UPPERCASE": "SUPPRIMER", + "CLICK_TO_VIEW": "CLIQUEZ POUR VOIR", + "NEW_MESSAGE": "Vous avez reçu un message P2P", + "STATUS_UPDATE": "Vous avez une mise à jour sur votre commande P2P", + "APPEAL_STATUS_MESSAGE": "Votre commande P2P a fait l'objet d'un appel", + "CANCEL_STATUS_MESSAGE": "Votre commande P2P a été annulée", + "CONFIRM_STATUS_MESSAGE": "Votre commande P2P a été confirmée", + "NEW_ORDER_CREATED": "Une nouvelle commande P2P a été créée", + "CRYPTO_RELEASE_STATUS_MESSAGE": "La crypto a été libérée de l'ordre", + "ADDITIONAL_PAYMENT_DETAILS": "Ajouter des détails de paiement supplémentaires", + "PAYMENT_FIELD_INFO": "Ce nouveau champ de paiement est supplémentaire et devrait aider les participants P2P dans leurs transferts de monnaie fiduciaire. Il doit s'agir des détails du compte liés au mode de paiement. Cela peut inclure des numéros de téléphone, des noms d'utilisateur, des numéros de compte uniques et d'autres informations nécessaires aux transactions en fonction du système de méthodes de paiement.", + "PAYMENT_DETAIL_NAME": "Nom des détails de paiement", + "REQUIRED_OR_OPTIONAL": "Obligatoire ou facultatif", + "CREATE_NEW_PAYMENT_METHODS": "Créer et ajouter de nouveaux modes de paiement", + "MANUAL_PAYMENT_METHOD_ENTRY": "Pour ajouter un mode de paiement à votre plateforme P2P, vous pouvez le faire manuellement en saisissant le nom du mode de paiement et les informations de paiement requises. Par exemple, PayPal utilise des adresses e-mail pour envoyer et recevoir des fonds.", + "USERS_PAYMENT_SELECTION": "Une fois le mode de paiement ajouté, vos marchands et utilisateurs P2P pourront le sélectionner et saisir les informations nécessaires lors de l'exécution ou de la réception des paiements. Les détails qu'ils fournissent seront partagés avec l'autre partie lors de la transaction P2P.", + "METHOD_NAME_AND_DETAIL": "Nom de la méthode et principal détail de paiement", + "ADD_NEW_PAYMENT_METHODS": "Sélectionnez de nouveaux modes de paiement :", + "DETAIL_NAME": "Nom des détails de paiement", + "DETAIL_VALUE": "Valeur détaillée du paiement", + "DETAIL_REQUIRED": "Requis", + "IMPORTANT_DETAIL": "(Détail de paiement important)", + "DETAIL_OPTIONAL": "Facultatif", + "OPTIONAL_DETAIL": "(Détails de paiement facultatifs)", + "ADD_NEW_PAYMENT_FIELD": "Ajouter un nouveau champ de détails de paiement", + "PAYMENT_METHOD_CREATED": "Mode de paiement créé ! En attente de vérification par l'administrateur", + "PAYMENT_METHOD_DELETED": "Mode de paiement supprimé.", + "PAYMENT_METHOD_UPDATED": "Mode de paiement mis à jour.", + "CRYPTO": "Cryptographie:", + "INPUT_SPEND_AMOUNT": "Saisir le montant dépensé", + "INPUT_SELL_AMOUNT": "Saisir le montant de la vente", + "TIMES": "fois", + "FEEDBACK": "Retour", + "ASSET": "Actif: ", + "CUSTOM": "Coutume", + "CANCELLED": "Annulé", + "APPEALED": "Appel", + "EXPIRED": "Expiré", + "RATE": "Taux:", + "BUYING": "Acheter {0}", + "SELLING": "Vente {0}", + "TERMS_AND_CONDITION_DESCRIPTION": "Merci de poster dans les 15 minutes suivant la conclusion de l'affaire", + "VISIT_OUR_WEBSITE": "Visitez notre site Web", + "SELECT_PAYMENT_SYSTEM_LABEL": "Sélectionnez le système de paiement", + "FIELD": "Champ", + "NEW_PAYMENT_PLACEHOLDER": "Saisissez la valeur des détails du paiement", + "FIELD_VALIDATION_TEXT": "Veuillez saisir tous les champs de la méthode", + "INPUT_METHOD_NAME_TEXT": "Veuillez saisir le nom de la méthode", + "INPUT_PAYMENT_DETAIL_TEXT": "Entrez le nom du détail du paiement", + "UNVERIFIED": "Non vérifié", + "VERIFIED": "Vérifié", + "AMOUNT_RECEIVE": "sera débloqué de votre solde", + "DELETE_WARNING": "Etes-vous sûr de vouloir supprimer ce mode de paiement ?", + "STEP_1": "Étape 1/3", + "STEP_2": "Étape 2/3", + "STEP_3": "Étape 3/3", + "P2P_ORDER_CREATED": "Commande P2P créée", + "VENDOR_CHECKS_TITLE": "Vérifier et confirmer le paiement", + "FUND_RELEASED": "Fonds débloqués", + "ORDER_EXPIRY": "Expiration de la commande dans", + "MINIMUM_AMOUNT_WARNING": "Le minimum {0} est {1}", + "MAXIMUM_AMOUNT_WARNING": "Le maximum {0} est {1}", + "ORDER_CREATION": "Création de commande", + "ORDER_CREATION_DESC_1": "En cliquant sur « Créer une commande », vous informerez le vendeur et recevrez un devis instantané ainsi que des informations précises sur le transfert de paiement. {0} {1} {2} {3}", + "ORDER_CREATION_DESC_2": "Cela comprend le montant exact requis pour finaliser votre commande.", + "YOU_HAVE_TEXT": "Vous aurez", + "COMPLETE_PAYMENT_PROCESS": "pour terminer le processus de transfert de paiement.", + "WARINNG_DESC": "Veuillez continuer la création de la commande uniquement si vous avez réellement l'intention de finaliser la commande.", + "ORDER_CANCEL_DESC": "L'annulation de la commande peut entraîner la suspension du compte.", + "CONFIRM_ORDER_CREATION": "Lorsque vous êtes prêt à {0}, veuillez cliquer sur « Créer une commande » ci-dessous.", + "SEND_MONEY": "envoyer l'argent", + "RECEIVE_MONEY": "recevoir l'argent", + "CREATE_ORDER": "Créer une commande", + "NO_ORDERS_DESC": "On dirait qu'il n'y a pas de commandes ici.", + "NO_DEALS_DESC": "Il semble qu'il n'y ait aucune offre ici.", + "ONLINE": "EN LIGNE", + "OFFLINE": "HORS LIGNE", + "SELECT_CRYPTO": "Sélectionnez la crypto", + "REMOVE_WARNING": "Etes-vous sûr de vouloir supprimer cette offre ?", + "SHOW_FILTERS": "AFFICHER LES FILTRES", + "HIDE_FILTERS": "MASQUER LES FILTRES", + "ORDERS_COMPLETED": "Commandes complétées :", + "CANCEL_WARNING_TEXT": "Veuillez noter que les annulations de commandes fréquentes peuvent affecter négativement votre profil P2P public et peuvent entraîner la suspension de votre compte.", + "UPDATE": "Mise à jour", + "TERMS_ERROR_TEXT": "Veuillez saisir les termes du champ", + "RESPONSE_ERROR_TEXT": "Veuillez saisir le champ de réponse" + }, + "CUSTOM_NATIVE_CURRENCY": "Devise (estimation des prix et de la valeur des actifs)", + "ADDRESS_BOOK": { + "ADDRESS_BOOK_LABEL": "Carnet d'adresses", + "ADDRESS_BOOK_DESC_1": "Ajoutez une adresse de retrait sur liste blanche à votre carnet d'adresses personnel", + "ADDRESS_BOOK_DESC_2": "Vous pourrez facilement utiliser ces adresses lors de vos retraits.", + "ADD_ADDRESS_LINK": "Ajouter une adresse", + "ADD_WITHDRAW_ADDRESS": "Ajouter une adresse de retrait", + "DATE_ADDED": "Date d'ajout", + "REMOVE": "Retirer", + "NO_LINK": "Aucune adresse de retrait n'a encore été ajoutée.", + "ADD_WITHDRAW_ADDRESS_DESC_1": "Ajoutez une adresse sur liste blanche vers laquelle vous pouvez retirer des pièces en toute sécurité.", + "ADD_WITHDRAW_ADDRESS_DESC_2": "Cette adresse de retrait doit être une adresse sous votre contrôle.", + "NAME_YOUR_ADDRESS_TITLE": "Nommez votre adresse", + "NAME_YOUR_ADDRESS_DESC": "Donnez un nom à cette adresse de retrait pour votre référence future.", + "USER_LABEL": "Nom/étiquette :", + "USER_FIELD_PLACEHOLDER": "Nommez cette adresse de retrait", + "CHECK_AND_CONFIRM": "Vérifier et confirmer", + "WARNING_ADDRESS": "Avant d'ajouter cette adresse à votre carnet d'adresses, veuillez prendre le temps de vérifier et de confirmer que les détails sont corrects :", + "ENSURE_DESC": "Assurez-vous que l'adresse est correcte et sous votre contrôle.", + "ADDRESSES": "Adresses", + "WITHDRAWAL_ADDRESS_BOOK": "Carnet d'adresses de retrait", + "ADD_ADDRESS_DESC": "Ajoutez l'adresse de retrait à {0}", + "ADDRESS_BOOK": "Carnet d'adresses", + "MANAGE_ADDRESS_BOOK": "Gérer le carnet d'adresses", + "VIEW_ADDRESS_BOOK_LABEL": "Voir le carnet d'adresses", + "ADD_WITHDRAWAL_ADDRESS_LINK": "Ajouter une adresse de retrait", + "REVOKE_ADDRESS": "Votre adresse est supprimée", + "REMOVE_ADDRESS": "Supprimer l'adresse", + "REMOVE_CONTENT": "Souhaitez-vous supprimer cette adresse de retrait de votre carnet d'adresses ?" + }, + "VOLUME": { + "VOLUME": "VOLUME", + "BACK": "Dos", + "MARKETS": "MARCHÉS", + "CONVERT": "CONVERTIR", + "HISTORY": "HISTOIRE", + "TRADING_VOLUME": "Volume des échanges", + "VOLUME_DECS": "Montants négociés sur votre compte sur différentes périodes, ainsi que les 3 principaux actifs négociés au cours de chaque période", + "ALL_ASSETS": "tous les actifs", + "DAY_VOLUME": "VOLUME DU JOUR", + "HOUR_VOLUME": "VOLUME SUR 24 HEURES", + "TOP": "HAUT {0} {1}", + "VOL_ASSET": "VOL D. ACTIFS", + "NO_DATA_DESC_1": "Il semblerait que vous n'ayez pas encore effectué de transactions. Commencez à trader maintenant pour voir votre activité ici !", + "NO_DATA_DESC_2": "Commencer à trader", + "NO_DATA_DESC_3": "maintenant pour voir votre activité ici !", + "TRADE_VOLUME": "Volume des échanges", + "VIEW_VOLUME": "VOIR LE VOLUME", + "TRADE_DESCRIPTION": "Consultez votre actif le plus négocié", + "MARKET_TABLE_DESC": "Visitez votre page de volume de transactions {0}" + }, + "MORE_OPTIONS_LABEL": { + "MORE_OPTION_SEARCH_TXT": "Fonctionnalité de recherche ou pages", + "NO_RESULT_DESC_1": "Il semble qu'il n'y ait aucun résultat pour cela.", + "NO_RESULT_DESC_2": "Essayez de rechercher un autre mot-clé.", + "ICONS": { + "REFERRALS": "Références", + "BUY_CRYPTO": "Acheter des crypto-monnaies", + "API": "API", + "DEFI_STAKE": "Enjeu Defi", + "CEFI_STAKE": "Pieu Cefi", + "PROFIT_LOSS": "Compte de résultat", + "LIMITS": "Limites", + "LOGINS": "Connexions", + "AUDIO": "Audio" + }, + "HOT_FUNCTION": { + "HOT_FUNCTION_LABEL": "Fonctions à chaud", + "ADD_FUNDS": "Ajouter des fonds", + "TOP_UP": "Recharge", + "LOAD": "Charger", + "CREDIT": "Crédit", + "FUND_ACCOUNT": "Compte de fonds", + "BTC": "Bitcoin", + "USTD": "USDT", + "ETH": "éth", + "USD": "dollars américains", + "XHT": "xht", + "TRANSFER": "transfert", + "MONEY": "argent", + "FUNDING": "financement", + "RECHARGE": "recharger", + "REFILL": "recharge", + "CASH_IN": "encaisser", + "ADD_MONEY": "ajouter de l'argent", + "EXCHANGE": "Échange", + "SWAP": "Échanger", + "BUY_SELL": "Acheter/Vendre", + "TRADE": "Commerce", + "CONVERT_CURRENCY": "Convertir la devise", + "INVITE": "Inviter", + "REFER": "Référer", + "REWARDS": "Récompenses", + "BONUS": "Prime", + "AFFILIATION": "affiliation", + "AFFILIATE": "filiale", + "PASSIVE_INCOME": "Revenus passifs", + "REVENUE": "revenu" + }, + "OTHER_FUNCTIONS": { + "OTHER_FUNCTIONS_LABEL": "Autres fonctions", + "INTEGRATION": "Intégration", + "PROGRAMMATIC_ACCESS": "Accès programmatique", + "DEVELOPER": "Promoteur", + "AUTOMATED_TRADING": "Trading automatisé", + "BOT": "Bot", + "ALGO": "Quelque chose", + "ALGORITHM": "algorithme", + "FIAT": "décret", + "DOLLAR": "dollar", + "PURCHASE": "achat", + "BUY_COIN": "Acheter des pièces", + "BUY_TOKEN": "Acheter un jeton", + "YIELD": "Rendement", + "INTEREST": "Intérêt", + "REVENUE": "revenu", + "CENTRALIZED_STAKING": "Jalonnement centralisé", + "PERFORMANCE": "Performance", + "GAINS": "Gains", + "LOSSES": "Pertes", + "PORTFOLIO_PROFIT": "Bénéfice du portefeuille", + "LOSS": "perte", + "PNL": "svp", + "CHARGES": "Frais", + "COSTS": "Frais", + "COMMISSION": "Commission", + "TRADING_FEES": "Frais de négociation", + "TRANSACTION_FEES": "Frais de transaction", + "RESTRICTIONS": "Restrictions", + "BOUNDARIES": "Frontières", + "CAPS": "Casquettes", + "MAXIMUM": "Maximum", + "WITHDRAWAL_LIMITS": "Limites de retrait", + "STORAGE": "Stockage", + "FUNDS": "Fonds", + "BALANCE": "Équilibre", + "CRYPTO_WALLET": "Portefeuille cryptographique", + "MY": "mon", + "ENGLISH": "Anglais", + "LOCALIZATION": "Localisation", + "TRANSLATE": "Traduire", + "LANGUAGE_SETTINGS": "Paramètres de langue", + "MULTILINGUAL": "Multilingue", + "LANGUAGE_PREFERENCE": "Préférence de langue", + "TEXT": "texte", + "WORD": "mot", + "PEER_TO_PEER": "Pair à pair", + "DIRECT_TRADE": "Commerce direct", + "USER_TO_USER": "Utilisateur à utilisateur", + "PRIVATE_TRADE": "Commerce privé", + "TRANSACTIONS": "Transactions", + "ACTIVITY": "Activité", + "RECORD": "Enregistrer", + "LOG": "Enregistrer", + "TRANSACTION_HISTORY": "Historique des transactions", + "LIQUIDITY": "Liquidité", + "MARKET_VOLUME": "Volume du marché", + "TRADING_ACTIVITY": "Activité commerciale", + "MARKETS": "marchés", + "CRYPTO": "crypto", + "TWO_FACTOR_AUTHENTICATION": "Authentification à deux facteurs", + "MFA": "MAE", + "AUTHENTICATOR": "Authentificateur", + "OTP": "otp", + "CREDENTIALS": "Informations d'identification", + "PASSWORD_RESET": "Réinitialisation du mot de passe", + "SIGN_INS": "Connexions", + "ACCOUNT_ACCESS": "Accès au compte", + "SESSION_HISTORY": "Historique de la session", + "LOGGED_IN": "Connecté", + "SESSION_MANAGEMENT": "Gestion des sessions", + "CURRENT_SESSIONS": "Sessions en cours", + "BANKING_DETAILS": "Coordonnées bancaires", + "BANK_ACCOUNT": "Compte bancaire", + "FINANCIAL_INSTITUTION": "Institution financière", + "BANK_INFO": "Informations bancaires", + "WITHDRAWAL_ACCOUNT": "Compte de retrait", + "FUND": "fonds", + "SOUND": "Son", + "AUDIO_SETTINGS": "Paramètres audio", + "ALERTS": "Alertes", + "NOTIFICATIONS": "Notifications", + "AUDIO_ALERTS": "Alertes audio", + "SECURITY": "sécurité", + "CONTACT": "Contact", + "EMAIL_ADDRESS": "Adresse email", + "MAIL": "Mail", + "EMAIL_CONTACT": "Contact par e-mail", + "KYC": "KYC", + "SMS": "SMS", + "KYC_CAPS": "Connaissance de la clientèle", + "ID": "IDENTIFIANT", + "PERSONAL_INFO": "Informations personnelles", + "IDENTITY_CHECK": "Vérification d'identité", + "PAYOUT": "Paiement", + "CASH_OUT": "Encaissement", + "REMOVE_FUNDS": "Supprimer des fonds", + "OUT": "Dehors", + "SUPPORT": "soutien", + "CONTACT_LOWER": "contact", + "EMAIL_LOWER": "e-mail", + "RESOURCE": "ressources", + "GUIDES": "guides", + "FAQ": "FAQ", + "CUSTOMER_SERVICE": "service client", + "ASSISTANCE": "assistance", + "API_LOWER": "API", + "MESSAGE": "message", + "LIVE_CHAT": "Chat en direct", + "SETTINGS": "paramètres", + "ALERT": "Alerte", + "UPDATES": "Mises à jour", + "REMINDERS": "Rappels", + "UI": "Interface utilisateur", + "USER_INTERFACE": "Interface utilisateur", + "LAYOUT": "Mise en page", + "DESIGN": "Conception", + "DASHBOARD": "Tableau de bord", + "COLOR_THEME": "thème de couleur", + "ORDER_BOOK": "carnet de commandes", + "DARK": "sombre", + "LIGHT": "lumière", + "WITHDRAWAL_ADDRESSES": "Adresses de retrait", + "CRYPTO_ADDRESSES": "Adresses cryptographiques", + "WALLET_ADDRESSES": "Adresses de portefeuille", + "SAVED_ADDRESSES": "Adresses enregistrées", + "ADDRESS_BOOK": "Carnet d'adresses", + "WHITE_LISTED": "liste blanche" + } + }, + "CONNECTIONS": { + "CHECK_CONNECTION": "Vérifier la connexion", + "IP": "Propriété intellectuelle", + "NORMAL_TEXT": "Normale", + "CONNECTION_ISSUE": "Problème de connexion", + "SESSION": "Session", + "SERVER_TIME": "Heure du serveur", + "PING": "Ping", + "CHECK_PING": "VÉRIFIER LE PING", + "RECONNECT": "Reconnect", + "TOOLTIP_DESC_1": "Vérifiez votre ping sur le serveur Exchange {0}", + "TOOLTIP_DESC_2": "Un « ms » plus bas est meilleur", + "LOGGED_IN_AT": "Connecté à", + "RECONNECT_DESC": "La reconnexion peut résoudre les problèmes inconnus que vous rencontrez.", + "CONFIRM_RECONNECT_MESSAGE": "Voulez-vous vous reconnecter ?", + "PING_CHECK_TEXT": "Ping du serveur. Veuillez patienter...", + "RECHECK_PING": "Revérifier le ping", + "FAST": "Rapide", + "SLOW": "Lent", + "MS": "{0} ms", + "STATUS_NORMAL": "Connexion normale", + "CONNECTION_LABEL": "Connexion", + "CONNECTION_ISSUE_DETECTED": "Problème de connexion détecté" + }, + "DESKTOP_NAVIGATION": { + "OTHERS": "Autres", + "SUMMARY_DESCRIPTION": "Informations au niveau du compte et accessibilité", + "FEES_LIMITS_DESC": "Frais de transaction et de retrait. Limites de compte", + "VOLUME_DESC": "Résumé du volume des échanges au fil du temps", + "DEPOSIT_DESC": "Accéder aux options de financement des dépôts de portefeuille", + "BALANCE_DESC": "Tous vos actifs et leurs soldes", + "PERFORMANCE_DESC": "Bénéfice et perte du portefeuille", + "HISTORY_DESC": "Examinez toutes les transactions, dépôts et retraits", + "ADDRESS_BOOK_DESC": "Carnet d'adresses de contact pour les retraits", + "WITHDRAW_DESC": "Retraits et transferts de portefeuille", + "ASSETS_DESC": "Suivez les prix et découvrez les données sur les actifs", + "CONVERT_DESC": "Échangez simplement un actif contre un autre", + "MARKET_DESC": "Marchés du carnet d’ordres de négociation au comptant.", + "P2P_DESC": "Trading de crypto-monnaies", + "REFERRAL_DESC": "Gagnez un revenu passif en invitant vos amis", + "CEFI_STAKE_DESC": "Mettez en jeu des actifs à partir de votre portefeuille d'échange", + "DEFI_STAKE_DESC": "Connectez votre portefeuille et misez votre actif", + "BUY_CRYPTO_DESC": "Achetez par virement bancaire direct ou par carte", + "SECURITY_DESC": "Compte 2FA, mot de passe et API", + "VERIFICATION_DESC": "Vérification de l'identité du compte", + "SETTINGS_DESC": "Interface et autres paramètres du compte", + "SUMMARY_PAGE": "Page de résumé", + "SIGNOUT_DESC": "Déconnexion du compte", + "LANGUAGE_DESC": "Changer la préférence de langue", + "API_DESC": "Utilisez les clés API pour accéder par programmation à votre compte", + "HELP_DESC": "Obtenir de l'aide. Contacter le support", + "TRANSACTION_DESC": "Examinez toutes les transactions, dépôts et retraits", + "ONRAMPER_DESC": "Utilisez Onramper pour acheter et vendre des crypto-monnaies" } } \ No newline at end of file diff --git a/web/src/config/lang/id.json b/web/src/config/lang/id.json index 123e48ec3e..253c582583 100644 --- a/web/src/config/lang/id.json +++ b/web/src/config/lang/id.json @@ -138,7 +138,7 @@ "OPTION_BUG": "Laporkan bug", "OPTION_PERSONAL_INFO": "Ganti informasi pribadi", "OPTION_BANK_TRANSFER": "Transfer kawat bank", - "OPTION_REQUEST": "Permintaan undangan untuk Bursa HollaeX" + "OPTION_REQUEST": "Permintaan undangan untuk Bursa" }, "SUBJECT_LABEL": "Judul", "SUBJECT_PLACEHOLDER": "Masukkan judul isu Anda", @@ -164,7 +164,8 @@ "QR_CODE": "Kode QR ini dapat dipindai oleh siapa yang ingin mengirimkan dana kepada Anda", "NO_DATA": "Tidak tersedia informasi", "FULL_MESSAGE_LIMIT": "{0}: {1} {2} {3}", - "QR_CODE_TITLE": "{0} Informasi Setoran" + "QR_CODE_TITLE": "{0} Informasi Setoran", + "VIEW_DEPOSIT": "Lihat Deposit" }, "LOGIN": { "LOGIN_TO": "Masuk {0}", @@ -274,7 +275,10 @@ "MOBILE_WALLET_BALANCE_LABEL": "Libra/Timur. USDT", "MOBILE_WALLET_SHARE_LABEL": "%Bagikan/Est. USDT", "VIEW_MORE_WALLET_INFO": "LIHAT INFO DOMPET LEBIH LANJUT", - "VIEW_WALLET_TRANSACTION_HISTORY": "LIHAT RIWAYAT TRANSAKSI DOMPET" + "VIEW_WALLET_TRANSACTION_HISTORY": "LIHAT RIWAYAT TRANSAKSI DOMPET", + "ORDERS_HOLD": "Anda memiliki {0} {1}, yang mengakibatkan penahanan {2} {3} pada saldo {4} Anda", + "OPEN_ORDERS_SINGULAR": "pesanan terbuka", + "VIEW_WALLET": "Lihat dompet" }, "REQUEST_RESET_PASSWORD": { "TITLE": "Pemulihan Akun", @@ -613,7 +617,8 @@ "CANCEL": "Membatalkan", "PLACEHOLDER": "Ketik di sini" } - } + }, + "TITLE_TEXT": "Revisi pengaturan akun Anda dengan menyesuaikan preferensi seperti tata letak antarmuka, preferensi notifikasi, nama pengguna, dan penyesuaian lainnya." }, "TRANSACTION_HISTORY": { "TITLE": "Riwayat", @@ -860,7 +865,9 @@ "ENTER_AMOUNT": "Masukan jumlah", "REMOVE_TITLE": "Hapus tanda", "MAX_AMOUNT_WARNING_INFO": "Jumlah ini melebihi batas maksimum penarikan Anda.", - "ZERO_BALANCE": "Anda tidak memiliki cukup saldo." + "ZERO_BALANCE": "Anda tidak memiliki cukup saldo.", + "MIN_AMOUNT_WARNING_INFO": "Jumlah penarikan minimum adalah {0}", + "NEW_ADDRESS": "Alamat Baru" }, "WALLET_BUTTON_BASE_DEPOSIT": "deposit", "WALLET_BUTTON_BASE_WITHDRAW": "Penarikan", @@ -1186,7 +1193,8 @@ "INSUFFICIENT_LABEL": "Jumlah Penyelesaian Tidak Memadai", "INSUFFICIENT_INFO_1": "Penghasilan Anda saat ini tidak mencukupi untuk penyelesaian. Silakan undang lebih banyak anggota menggunakan tautan rujukan Anda dan tunggu hingga penghasilan Anda belum ditetapkan {0} {1}", "INSUFFICIENT_INFO_2": "melebihi 1", - "GO_TO_REFERRAL": "Pergi ke Referensi" + "GO_TO_REFERRAL": "Pergi ke Referensi", + "REFER_DESC": "Bagikan tautan di bawah ini dengan teman-teman Anda untuk Mulai mendapatkan komisi atas perdagangan mereka" }, "NOT_LOGGEDIN": { "TXT_1": "Untuk mulai perdagangan, harap masuk terlebih dahulu", @@ -1370,7 +1378,10 @@ "INSTALL_METAMASK_DETAILS": { "TITLE": "Instal MetaMask", "PROMPT": "Anda harus memasang Metamask ke browser Anda: {0}" - } + }, + "EARN_REWARD": "Dapatkan hadiah dengan mempertaruhkan aset digital Anda", + "DEFI_STAKING": "Taruhan DeFi", + "CEFI_STAKING": "Taruhan CeFi" }, "UNSTAKE": { "TITLE": "Lepas pasak", @@ -1488,13 +1499,13 @@ "FORFEITURE_OF_EARNINGS_DETAILS_LABEL": "Penggelembungan pendapatan", "STAKE_AMOUNT_LABEL": "Jumlah yang akan distaking", "DISCLAIMER_NOTICE": "Catatan: Harap dicatat bahwa untuk jumlah dalam USD yang melebihi $1,000, diperlukan verifikasi identitas lengkap. Nilai ini termasuk pendapatan, dan platform berhak untuk meminta informasi tambahan dari pengguna.", - "SETTLEMENT_NOTICE": "Penyelesaian: Periode penyelesaian 24 jam akan diterapkan saat menarik.", + "SETTLEMENT_NOTICE": "{0} Periode penyelesaian 24 jam akan diterapkan setelah unstaking.", "CONFIRM_BUTTON": "Konfirmasi", "STAKE_RULES_NOTICE": "Segera setelah Anda melakukan staking, Anda akan terikat pada aturan pool.", "I_UNDERSTAND_AGAIN_BUTTON": "Saya Mengerti Lagi", "CONGRATULATIONS_NOTICE": "Selamat!", "EARNINGS_START_NOTICE": "Staking Anda akan mulai menghasilkan imbalan.", - "REVIEW_PROGRESS_LABEL": "Anda dapat meninjau perkembangan staking Anda di halaman Staking Aktif.", + "REVIEW_PROGRESS_LABEL": "Anda dapat meninjau kemajuan taruhan Anda di {0}", "TIME_REMAINING_LABEL": "Sisa Waktu", "PENALTY_UPON_INITIAL_STAKE_PRINCIPLE_LABEL_2": "Hukuman atas prinsip staking awal", "FORFEITURE_OF_EARNINGS_LABEL_2": "Penggelembungan pendapatan", @@ -1504,7 +1515,26 @@ "VISIT_WALLET_BUTTON": "KUNJUNGI DOMPET", "CLOSE_BUTTON": "TUTUP", "ACTIVE_STAKES": "Taruhan Aktif", - "STAKES_HISTORY": "Sejarah" + "STAKES_HISTORY": "Sejarah", + "SETTLEMENT_NOTICE_TITLE": "Hunian:", + "REVIEW_PROGRESS_ACTIVE_LINK": "Halaman Taruhan Aktif", + "STAKING": "Dasar-dasar Taruhan", + "SLASHING": "Nekat", + "MINIMUM_AMOUNT_ALLOWED": "Jumlah minimum pool taruhan yang diizinkan adalah", + "MAXIMUM_AMOUNT_ALLOWED": "Jumlah maksimum pool taruhan yang diizinkan adalah", + "DAYS": "Hari", + "CONFIRM_STAKE_DECS": "Ini dia!", + "DO_YOU_UNDERSTAND": "Apakah kamu mengerti?", + "SUCCESSFULLY_STAKED_IN": "Berhasil dipertaruhkan", + "SUCCESSFULLY_STAKED": "Berhasil dipertaruhkan", + "VIEW_ACTIVE_STAKES": "LIHAT TARUHAN AKTIF", + "REVIEW_AND_UNSTAKE": "Tinjau dan batalkan taruhan", + "NO_REWARD": "Tidak ada jumlah hadiah yang akan diterima", + "SUCCESSFULLY_UNSTAKED": "Anda telah berhasil membatalkan taruhan", + "MIN": "menit", + "UNSTAKING": "MELEPASKAN PASANG...", + "UNSTAKED": "TIDAK DIPERTARUHKAN", + "TOOLTIP": "Penalti yang akan Anda terima jika Anda membatalkan staking terlalu dini. {0}" }, "MOVE_XHT": { "TITLE": "Pindahkan XHT", @@ -1630,7 +1660,11 @@ "CHANGE_7D": "Perubahan (7 hari)", "CHANGE_1D": "Ganti (1 hari)", "CHART_7D": "Grafik (7 hari)", - "ASSET": "Aset" + "ASSET": "Aset", + "PERCENTAGE": "% {0}", + "24H": "24 jam", + "TREND_7D": "Tren 7D", + "BUY": "Beli {0} {1}" }, "SUMMARY_MARKETS": { "HOLLAEX": "Ingin mendaftarkan aset digital Anda? Mulai pasar Anda sendiri dengan HollaEx Anda {0} {1}", @@ -1779,7 +1813,18 @@ "ORDERBOOK": "Memesan buku", "NETWORK": "Pialang Jaringan OTC", "BROKER": "OTC Broker Lokal", - "BROKERAGE": "NA - (Perantara)" + "BROKERAGE": "NA - (Perantara)", + "LOADING_PRICES": "Memuat Harga...", + "INPUT_LABEL": "Masukkan nama aset atau simbol", + "HIGHLIGHTS": "Highlight", + "MOBILE_DESC": "Pilih pasar di bawah ini untuk memulai perdagangan.", + "PRICE_24H": "Harga/24H %", + "CARDS": { + "GAINERS": "Pemenang", + "LOSERS": "Pecundang", + "MARKET_CAP": "Kapitalisasi Pasar", + "24H": "{0} 24 jam" + } }, "HOLLAEX_TOKEN": { "REMOVE_FAVOURITES": "Hapus dari favorit", @@ -1825,7 +1870,8 @@ "TAG": "Menandai:", "DISABLED_DEPOSIT_CONTENT": "Fungsi deposit untuk sementara tidak tersedia.", "DISABLED_WITHDRAW_CONTENT": "Fungsi penarikan untuk sementara tidak tersedia.", - "DEPOSIT_LABEL": "Menyetorkan" + "DEPOSIT_LABEL": "Menyetorkan", + "VOLUME": "VOLUME" }, "ASYNC_LINK": { "TITLE": "Halaman tidak terbuka secara otomatis?", @@ -2009,7 +2055,8 @@ "WALLET_BALANCE_ESTIMATE": "Perkiraan saldo dompet hari ini ", "VIEW_BALANCE_HISTORY": "LIHAT RIWAYAT SALDO", "VIEW_PERCENTAGE_SHARE": "LIHAT PERSENTASE SAHAM", - "VIEW_WALLET_P&L": "LIHAT P&L DOMPET" + "VIEW_WALLET_P&L": "LIHAT P&L DOMPET", + "BALANCE_PERCENTAGE": "Persentase Saldo" }, "ASSET_INFO": "Informasi aset", "TAKER_FEES_APPLIED": "Biaya pengambil diterapkan", @@ -2158,7 +2205,7 @@ "TOTAL_ASSET_SELL_1": "Total", "TOTAL_ASSET_SELL_2": "kamu bisa menjual", "BUY_ORDER_LIMITS": "BATAS PESANAN BELI", - "MIN_MAX_ORDER_VALUE_1": "Minimum dan maks", + "MIN_MAX_ORDER_VALUE_1": "Minimum dan maks {0} {1}", "MIN_MAX_ORDER_VALUE_2": "nilai pesanan beli masuk", "PAYMENT_METHODS_SEND_FIAT": "METODE PEMBAYARAN UNTUK MENGIRIM FIAT", "SELECT_PAYMENT_METHODS_1": "Pilih hingga", @@ -2174,7 +2221,7 @@ "DEAL_EDITED": "Kesepakatan telah diedit", "DEAL_CREATED": "Kesepakatan telah dibuat", "NEXT": "BERIKUTNYA", - "ADD_PAYMENT_METHOD_DETAILS": "Tambahkan Detail Metode Pembayaran", + "ADD_PAYMENT_METHOD_DETAILS": "{0} Rincian Metode Pembayaran", "COMPLETE": "Menyelesaikan", "STEP_SET_TYPE_PRICE": "Tentukan jenis dan harganya", "STEP_SET_TOTAL_AMOUNT_PAYMENT_METHODS": "Tetapkan jumlah total dan metode pembayaran", @@ -2204,6 +2251,400 @@ "ALL_REGION": "Semua Wilayah", "BUYER_NOT_MADE_THE_PAYMENT": "Pembeli belum mengkonfirmasi pembayarannya.", "PRICE_TO_ADVERTISE": "Harga yang akan Anda iklankan untuk dijual", - "VIEW_PROFILE": "Lihat profil vendor" + "VIEW_PROFILE": "Lihat profil vendor", + "P2P_METHODS": "Metode Pembayaran P2P", + "PAYMENT_METHODS": "METODE PEMBAYARAN", + "PAYMENT_METHODS_DEC": "Anda dapat menjual mata uang kripto dan menerima pembayaran fiat dengan menambahkan detail akun pembayaran pribadi Anda, seperti informasi bank atau metode pembayaran lokal lainnya. Pastikan nama yang terkait dengan akun pembayaran Anda sesuai dengan nama pada detail terverifikasi Anda sebelum menambahkan informasi pembayaran Anda.", + "SELL_AMOUNT": "Jumlah Penjualan", + "ADD_PAYMENT_METHOD": "+ TAMBAHKAN METODE PEMBAYARAN", + "REMOVE": "MENGHAPUS", + "DYNAMIC": "DINAMIS", + "TYPE": "JENIS", + "BACK_TO_ORDERS": "untuk memesan", + "FUNDS_TRANSFERRED_USER": "Pengguna mengonfirmasi transaksi dan dana telah ditransfer ke saldo Anda.", + "CONFIRM_TRANSFER_USER": "KONFIRMASI TRANSFER DAN BERITAHU PENGGUNA", + "BUYER_SENT_FUNDS_USER": "Anda telah memberi tahu pengguna bahwa Anda telah mengirim dana. Harap tunggu respons dari pengguna.", + "VENDOR_CONFIRMED_ORDER_USER": "Pengguna mengonfirmasikan transaksi dan mencairkan dana.", + "BUY_UPPER": "MEMBELI", + "CRYPTO_WANT_TO_BUY": "Kripto yang ingin Anda beli", + "FIAT_CURRENCY_WANT_TO_SPEND": "Mata uang fiat untuk dibelanjakan", + "PRICE_ADVERTISE": "Harga yang akan Anda iklankan ke {0}", + "TOTAL_AMOUNT": "Jumlah Total", + "BUY_SELL_DESC": "kamu bisa {0}", + "SELL_ORDER_LIMITS": "BATAS PESANAN JUAL", + "MIN_MAX_ORDER_VALUE_3": "nilai pesanan jual", + "PAYMENT_METHODS_RECEIVE_FIAT": "METODE PEMBAYARAN UNTUK MENERIMA FIAT", + "PAYMENT_TIME_LIMIT_LABEL": "Batas waktu pembayaran: {0}", + "30_MINUTES": "30 menit", + "DELETE_UPPERCASE": "MENGHAPUS", + "CLICK_TO_VIEW": "KLIK UNTUK MELIHAT", + "NEW_MESSAGE": "Anda telah menerima pesan P2P", + "STATUS_UPDATE": "Anda memiliki pembaruan pada pesanan P2P Anda", + "APPEAL_STATUS_MESSAGE": "Pesanan P2P Anda telah diajukan banding", + "CANCEL_STATUS_MESSAGE": "Pesanan P2P Anda telah dibatalkan", + "CONFIRM_STATUS_MESSAGE": "Pesanan P2P Anda telah dikonfirmasi", + "NEW_ORDER_CREATED": "Pesanan P2P Baru telah dibuat", + "CRYPTO_RELEASE_STATUS_MESSAGE": "Crypto telah dibebaskan dari pesanan", + "ADDITIONAL_PAYMENT_DETAILS": "Tambahkan detail pembayaran tambahan", + "PAYMENT_FIELD_INFO": "Bidang pembayaran baru ini bersifat tambahan dan akan membantu peserta P2P dalam transfer mata uang fiat mereka. Bidang ini akan berisi detail akun yang terkait dengan metode pembayaran. Bidang ini dapat mencakup nomor telepon, nama pengguna, nomor akun unik, dan informasi lain yang diperlukan untuk transaksi, tergantung pada sistem metode pembayaran.", + "PAYMENT_DETAIL_NAME": "Nama detail pembayaran", + "REQUIRED_OR_OPTIONAL": "Diperlukan atau opsional", + "CREATE_NEW_PAYMENT_METHODS": "Buat dan tambahkan metode pembayaran baru", + "MANUAL_PAYMENT_METHOD_ENTRY": "Untuk menambahkan metode pembayaran ke platform P2P Anda, Anda dapat melakukannya secara manual dengan memasukkan nama metode pembayaran dan detail pembayaran yang diperlukan. Misalnya, PayPal menggunakan alamat email untuk mengirim dan menerima dana.", + "USERS_PAYMENT_SELECTION": "Setelah metode pembayaran ditambahkan, pedagang dan pengguna P2P Anda akan dapat memilihnya dan memasukkan informasi yang diperlukan saat melakukan atau menerima pembayaran. Rincian yang mereka berikan akan dibagikan dengan pihak lain dalam transaksi P2P.", + "METHOD_NAME_AND_DETAIL": "Nama metode dan detail pembayaran utama", + "ADD_NEW_PAYMENT_METHODS": "Pilih metode pembayaran baru:", + "DETAIL_NAME": "Nama detail pembayaran", + "DETAIL_VALUE": "Nilai detail pembayaran", + "DETAIL_REQUIRED": "Diperlukan", + "IMPORTANT_DETAIL": "(Detail pembayaran penting)", + "DETAIL_OPTIONAL": "Opsional", + "OPTIONAL_DETAIL": "(Detail pembayaran opsional)", + "ADD_NEW_PAYMENT_FIELD": "Tambahkan bidang detail pembayaran baru", + "PAYMENT_METHOD_CREATED": "Metode pembayaran telah dibuat! Menunggu verifikasi oleh admin", + "PAYMENT_METHOD_DELETED": "Metode pembayaran dihapus.", + "PAYMENT_METHOD_UPDATED": "Metode pembayaran diperbarui.", + "CRYPTO": "Kripto:", + "INPUT_SPEND_AMOUNT": "Masukkan jumlah pengeluaran", + "INPUT_SELL_AMOUNT": "Masukkan jumlah penjualan", + "TIMES": "waktu", + "FEEDBACK": "Masukan", + "ASSET": "Aset:", + "CUSTOM": "Kebiasaan", + "CANCELLED": "Dibatalkan", + "APPEALED": "Dibanding", + "EXPIRED": "Kedaluwarsa", + "RATE": "Kecepatan:", + "BUYING": "Membeli {0}", + "SELLING": "Menjual {0}", + "TERMS_AND_CONDITION_DESCRIPTION": "Harap posting dalam waktu 15 menit setelah transaksi dimulai", + "VISIT_OUR_WEBSITE": "Kunjungi situs web kami", + "SELECT_PAYMENT_SYSTEM_LABEL": "Pilih Sistem Pembayaran", + "FIELD": "Bidang", + "NEW_PAYMENT_PLACEHOLDER": "Masukkan nilai detail pembayaran", + "FIELD_VALIDATION_TEXT": "Harap masukkan semua bidang metode", + "INPUT_METHOD_NAME_TEXT": "Silakan masukkan nama metode", + "INPUT_PAYMENT_DETAIL_TEXT": "Masukkan nama detail pembayaran", + "UNVERIFIED": "Belum diverifikasi", + "VERIFIED": "Terverifikasi", + "AMOUNT_RECEIVE": "akan dilepaskan dari saldo Anda", + "DELETE_WARNING": "Apakah Anda yakin ingin menghapus metode pembayaran ini?", + "STEP_1": "Langkah 1/3", + "STEP_2": "Langkah 2/3", + "STEP_3": "Langkah 3/3", + "P2P_ORDER_CREATED": "Pesanan P2P Dibuat", + "VENDOR_CHECKS_TITLE": "Periksa & Konfirmasi Pembayaran", + "FUND_RELEASED": "Dana yang dirilis", + "ORDER_EXPIRY": "Pesanan kedaluwarsa dalam", + "MINIMUM_AMOUNT_WARNING": "Minimum {0} adalah {1}", + "MAXIMUM_AMOUNT_WARNING": "Nilai maksimum {0} adalah {1}", + "ORDER_CREATION": "Pembuatan Pesanan", + "ORDER_CREATION_DESC_1": "Dengan mengklik 'Buat Pesanan', Anda akan memberi tahu vendor dan menerima penawaran harga instan beserta rincian transfer pembayaran yang tepat. {0} {1} {2} {3}", + "ORDER_CREATION_DESC_2": "Ini termasuk jumlah pasti yang dibutuhkan untuk menyelesaikan pesanan Anda.", + "YOU_HAVE_TEXT": "Kamu akan memiliki", + "COMPLETE_PAYMENT_PROCESS": "untuk menyelesaikan proses transfer pembayaran.", + "WARINNG_DESC": "Harap lanjutkan pembuatan pesanan hanya jika Anda benar-benar ingin menyelesaikan pesanan.", + "ORDER_CANCEL_DESC": "Pembatalan pesanan dapat mengakibatkan penangguhan akun.", + "CONFIRM_ORDER_CREATION": "Jika Anda siap untuk {0} silakan klik 'Buat Pesanan' di bawah.", + "SEND_MONEY": "kirim uangnya", + "RECEIVE_MONEY": "menerima uangnya", + "CREATE_ORDER": "Buat Pesanan", + "NO_ORDERS_DESC": "Sepertinya tidak ada pesanan di sini.", + "NO_DEALS_DESC": "Sepertinya tidak ada transaksi di sini.", + "ONLINE": "ON LINE", + "OFFLINE": "Bahasa Indonesia: Offline", + "SELECT_CRYPTO": "Pilih kripto", + "REMOVE_WARNING": "Apakah Anda yakin ingin menghapus kesepakatan ini?", + "SHOW_FILTERS": "TAMPILKAN FILTER", + "HIDE_FILTERS": "SEMBUNYIKAN FILTER", + "ORDERS_COMPLETED": "Pesanan yang telah selesai:", + "CANCEL_WARNING_TEXT": "Harap perhatikan bahwa pembatalan pesanan yang sering dapat berdampak negatif pada profil P2P publik Anda dan dapat mengakibatkan akun Anda ditangguhkan.", + "UPDATE": "Memperbarui", + "TERMS_ERROR_TEXT": "Silakan masukkan kolom Persyaratan", + "RESPONSE_ERROR_TEXT": "Silakan masukkan kolom Respons" + }, + "CUSTOM_NATIVE_CURRENCY": "Mata Uang (Perkiraan harga & nilai aset)", + "ADDRESS_BOOK": { + "ADDRESS_BOOK_LABEL": "Buku alamat", + "ADDRESS_BOOK_DESC_1": "Tambahkan alamat penarikan yang masuk daftar putih ke buku alamat pribadi Anda", + "ADDRESS_BOOK_DESC_2": "Anda dapat dengan mudah menggunakan alamat ini saat melakukan penarikan.", + "ADD_ADDRESS_LINK": "Tambahkan alamat", + "ADD_WITHDRAW_ADDRESS": "Tambahkan alamat penarikan", + "DATE_ADDED": "Tanggal ditambahkan", + "REMOVE": "Menghapus", + "NO_LINK": "Belum ada alamat penarikan yang ditambahkan.", + "ADD_WITHDRAW_ADDRESS_DESC_1": "Tambahkan alamat yang masuk daftar putih tempat Anda dapat menarik koin dengan aman.", + "ADD_WITHDRAW_ADDRESS_DESC_2": "Alamat penarikan ini harus menjadi alamat yang Anda kendalikan.", + "NAME_YOUR_ADDRESS_TITLE": "Beri nama alamat Anda", + "NAME_YOUR_ADDRESS_DESC": "Berikan alamat penarikan ini nama untuk referensi Anda di masa mendatang.", + "USER_LABEL": "Nama/label:", + "USER_FIELD_PLACEHOLDER": "Beri nama alamat penarikan ini", + "CHECK_AND_CONFIRM": "Periksa dan konfirmasi", + "WARNING_ADDRESS": "Sebelum menambahkan alamat ini ke buku alamat Anda, luangkan waktu untuk memeriksa dan mengonfirmasi apakah rinciannya benar:", + "ENSURE_DESC": "Pastikan Alamatnya benar dan di bawah kendali Anda.", + "ADDRESSES": "Alamat", + "WITHDRAWAL_ADDRESS_BOOK": "Buku alamat penarikan", + "ADD_ADDRESS_DESC": "Tambahkan alamat penarikan ke {0}", + "ADDRESS_BOOK": "Buku alamat", + "MANAGE_ADDRESS_BOOK": "Kelola buku alamat", + "VIEW_ADDRESS_BOOK_LABEL": "Lihat buku alamat", + "ADD_WITHDRAWAL_ADDRESS_LINK": "Tambahkan alamat penarikan", + "REVOKE_ADDRESS": "Alamat Anda Dihapus", + "REMOVE_ADDRESS": "Hapus Alamat", + "REMOVE_CONTENT": "Apakah Anda ingin menghapus alamat penarikan ini dari buku alamat Anda?" + }, + "VOLUME": { + "VOLUME": "VOLUME", + "BACK": "Kembali", + "MARKETS": "PASAR", + "CONVERT": "MENGUBAH", + "HISTORY": "SEJARAH", + "TRADING_VOLUME": "Volume Perdagangan", + "VOLUME_DECS": "Jumlah yang diperdagangkan di akun Anda selama periode waktu yang berbeda, beserta 3 aset teratas yang diperdagangkan di setiap periode", + "ALL_ASSETS": "semua aset", + "DAY_VOLUME": "VOLUME HARI", + "HOUR_VOLUME": "VOLUME 24 JAM", + "TOP": "ATAS {0} {1}", + "VOL_ASSET": "D VOL. ASET", + "NO_DATA_DESC_1": "Sepertinya Anda belum melakukan transaksi apa pun. Mulailah bertransaksi sekarang untuk melihat aktivitas Anda di sini!", + "NO_DATA_DESC_2": "Mulai berdagang", + "NO_DATA_DESC_3": "sekarang untuk melihat aktivitas Anda di sini!", + "TRADE_VOLUME": "Volume Perdagangan", + "VIEW_VOLUME": "LIHAT VOLUME", + "TRADE_DESCRIPTION": "Lihat aset yang paling banyak diperdagangkan", + "MARKET_TABLE_DESC": "Kunjungi halaman volume perdagangan Anda {0}" + }, + "MORE_OPTIONS_LABEL": { + "MORE_OPTION_SEARCH_TXT": "Fitur pencarian atau halaman", + "NO_RESULT_DESC_1": "Sepertinya tidak ada hasil untuk ini.", + "NO_RESULT_DESC_2": "Coba mencari kata kunci lainnya.", + "ICONS": { + "REFERRALS": "Rujukan", + "BUY_CRYPTO": "Beli kripto", + "API": "API", + "DEFI_STAKE": "Taruhan Defi", + "CEFI_STAKE": "Taruhan Cefi", + "PROFIT_LOSS": "Laba dan Rugi", + "LIMITS": "Batasan", + "LOGINS": "Login", + "AUDIO": "Suara" + }, + "HOT_FUNCTION": { + "HOT_FUNCTION_LABEL": "Fungsi panas", + "ADD_FUNDS": "Tambahkan Dana", + "TOP_UP": "Isi Ulang", + "LOAD": "Memuat", + "CREDIT": "Kredit", + "FUND_ACCOUNT": "Akun Dana", + "BTC": "Bitcoin", + "USTD": "usdt", + "ETH": "etnik", + "USD": "dolar AS", + "XHT": "xht", + "TRANSFER": "transfer", + "MONEY": "uang", + "FUNDING": "pendanaan", + "RECHARGE": "isi ulang", + "REFILL": "isi ulang", + "CASH_IN": "uang tunai", + "ADD_MONEY": "menambahkan uang", + "EXCHANGE": "Menukarkan", + "SWAP": "Menukar", + "BUY_SELL": "Beli/Jual", + "TRADE": "Berdagang", + "CONVERT_CURRENCY": "Konversi Mata Uang", + "INVITE": "Mengundang", + "REFER": "Merujuk", + "REWARDS": "Hadiah", + "BONUS": "Bonus", + "AFFILIATION": "afiliasi", + "AFFILIATE": "afiliasi", + "PASSIVE_INCOME": "Pendapatan Pasif", + "REVENUE": "pendapatan" + }, + "OTHER_FUNCTIONS": { + "OTHER_FUNCTIONS_LABEL": "Fungsi Lainnya", + "INTEGRATION": "Integrasi", + "PROGRAMMATIC_ACCESS": "Akses Terprogram", + "DEVELOPER": "Pengembang", + "AUTOMATED_TRADING": "Perdagangan Otomatis", + "BOT": "Robot", + "ALGO": "Sesuatu", + "ALGORITHM": "algoritma", + "FIAT": "perintah", + "DOLLAR": "dolar", + "PURCHASE": "pembelian", + "BUY_COIN": "Beli Koin", + "BUY_TOKEN": "Beli Token", + "YIELD": "Menghasilkan", + "INTEREST": "Minat", + "REVENUE": "pendapatan", + "CENTRALIZED_STAKING": "Taruhan Terpusat", + "PERFORMANCE": "Pertunjukan", + "GAINS": "Keuntungan", + "LOSSES": "Kerugian", + "PORTFOLIO_PROFIT": "Keuntungan portofolio", + "LOSS": "kehilangan", + "PNL": "hal", + "CHARGES": "Biaya", + "COSTS": "Biaya", + "COMMISSION": "Komisi", + "TRADING_FEES": "Biaya Perdagangan", + "TRANSACTION_FEES": "Biaya Transaksi", + "RESTRICTIONS": "Pembatasan", + "BOUNDARIES": "Batasan", + "CAPS": "Topi", + "MAXIMUM": "Maksimum", + "WITHDRAWAL_LIMITS": "Batas Penarikan", + "STORAGE": "Penyimpanan", + "FUNDS": "Dana", + "BALANCE": "Keseimbangan", + "CRYPTO_WALLET": "Dompet Kripto", + "MY": "-ku", + "ENGLISH": "bahasa inggris", + "LOCALIZATION": "Lokalisasi", + "TRANSLATE": "Menerjemahkan", + "LANGUAGE_SETTINGS": "Pengaturan Bahasa", + "MULTILINGUAL": "Multibahasa", + "LANGUAGE_PREFERENCE": "Preferensi Bahasa", + "TEXT": "teks", + "WORD": "kata", + "PEER_TO_PEER": "Antar Teman", + "DIRECT_TRADE": "Perdagangan Langsung", + "USER_TO_USER": "Pengguna ke Pengguna", + "PRIVATE_TRADE": "Perdagangan Swasta", + "TRANSACTIONS": "Transaksi", + "ACTIVITY": "Aktivitas", + "RECORD": "Catatan", + "LOG": "Catatan", + "TRANSACTION_HISTORY": "Riwayat Transaksi", + "LIQUIDITY": "Likuiditas", + "MARKET_VOLUME": "Volume Pasar", + "TRADING_ACTIVITY": "Aktivitas Perdagangan", + "MARKETS": "pasar", + "CRYPTO": "kripto", + "TWO_FACTOR_AUTHENTICATION": "Otentikasi Dua Faktor", + "MFA": "Kementerian Luar Negeri", + "AUTHENTICATOR": "Pengautentikasi", + "OTP": "tidak ada", + "CREDENTIALS": "Kredensial", + "PASSWORD_RESET": "Setel Ulang Kata Sandi", + "SIGN_INS": "Masuk", + "ACCOUNT_ACCESS": "Akses Akun", + "SESSION_HISTORY": "Riwayat Sesi", + "LOGGED_IN": "Sudah Masuk", + "SESSION_MANAGEMENT": "Manajemen Sesi", + "CURRENT_SESSIONS": "Sesi Saat Ini", + "BANKING_DETAILS": "Rincian Perbankan", + "BANK_ACCOUNT": "Rekening Bank", + "FINANCIAL_INSTITUTION": "Lembaga Keuangan", + "BANK_INFO": "Informasi Bank", + "WITHDRAWAL_ACCOUNT": "Penarikan Akun", + "FUND": "dana", + "SOUND": "Suara", + "AUDIO_SETTINGS": "Pengaturan Audio", + "ALERTS": "Peringatan", + "NOTIFICATIONS": "Pemberitahuan", + "AUDIO_ALERTS": "Peringatan Audio", + "SECURITY": "keamanan", + "CONTACT": "Kontak", + "EMAIL_ADDRESS": "Alamat Email", + "MAIL": "Surat", + "EMAIL_CONTACT": "Kontak Email", + "KYC": "kyc", + "SMS": "Pesan singkat", + "KYC_CAPS": "Informasi KYC", + "ID": "PENGENAL", + "PERSONAL_INFO": "Info Pribadi", + "IDENTITY_CHECK": "Pemeriksaan Identitas", + "PAYOUT": "Pembayaran", + "CASH_OUT": "Penarikan Uang Tunai", + "REMOVE_FUNDS": "Hapus Dana", + "OUT": "Keluar", + "SUPPORT": "mendukung", + "CONTACT_LOWER": "kontak", + "EMAIL_LOWER": "e-mail", + "RESOURCE": "sumber daya", + "GUIDES": "panduan", + "FAQ": "Tanya Jawab", + "CUSTOMER_SERVICE": "pelayanan pelanggan", + "ASSISTANCE": "bantuan", + "API_LOWER": "api", + "MESSAGE": "pesan", + "LIVE_CHAT": "obrolan langsung", + "SETTINGS": "pengaturan", + "ALERT": "Peringatan", + "UPDATES": "Pembaruan", + "REMINDERS": "Pengingat", + "UI": "Antarmuka Pengguna", + "USER_INTERFACE": "Antarmuka Pengguna", + "LAYOUT": "Tata Letak", + "DESIGN": "Desain", + "DASHBOARD": "Dasbor", + "COLOR_THEME": "tema warna", + "ORDER_BOOK": "buku pesanan", + "DARK": "gelap", + "LIGHT": "lampu", + "WITHDRAWAL_ADDRESSES": "Alamat Penarikan", + "CRYPTO_ADDRESSES": "Alamat Kripto", + "WALLET_ADDRESSES": "Alamat Dompet", + "SAVED_ADDRESSES": "Alamat Tersimpan", + "ADDRESS_BOOK": "Buku Alamat", + "WHITE_LISTED": "masuk daftar putih" + } + }, + "CONNECTIONS": { + "CHECK_CONNECTION": "Periksa Koneksi", + "IP": "AKU P", + "NORMAL_TEXT": "Normal", + "CONNECTION_ISSUE": "Masalah koneksi", + "SESSION": "Sidang", + "SERVER_TIME": "Waktu server", + "PING": "Bahasa Indonesia: Ping", + "CHECK_PING": "PERIKSA PING", + "RECONNECT": "Hubungkan kembali", + "TOOLTIP_DESC_1": "Periksa ping Anda ke server pertukaran {0}", + "TOOLTIP_DESC_2": "'ms' yang lebih rendah lebih baik", + "LOGGED_IN_AT": "Masuk di", + "RECONNECT_DESC": "Menyambungkan kembali mungkin dapat menyelesaikan masalah tak diketahui yang Anda alami.", + "CONFIRM_RECONNECT_MESSAGE": "Apakah Anda ingin menyambung kembali?", + "PING_CHECK_TEXT": "Ping ke server. Harap tunggu...", + "RECHECK_PING": "PERIKSA ULANG PING", + "FAST": "Cepat", + "SLOW": "Lambat", + "MS": "{0} md", + "STATUS_NORMAL": "Koneksi Normal", + "CONNECTION_LABEL": "Koneksi", + "CONNECTION_ISSUE_DETECTED": "Masalah koneksi terdeteksi" + }, + "DESKTOP_NAVIGATION": { + "OTHERS": "Yang lain", + "SUMMARY_DESCRIPTION": "Informasi dan aksesibilitas tingkat akun", + "FEES_LIMITS_DESC": "Biaya perdagangan dan penarikan. Batasan akun", + "VOLUME_DESC": "Ringkasan volume perdagangan dari waktu ke waktu", + "DEPOSIT_DESC": "Akses opsi pendanaan setoran dompet", + "BALANCE_DESC": "Semua aset Anda dan saldonya", + "PERFORMANCE_DESC": "Keuntungan dan kerugian dompet", + "HISTORY_DESC": "Tinjau semua perdagangan, setoran & penarikan", + "ADDRESS_BOOK_DESC": "Hubungi buku alamat untuk penarikan", + "WITHDRAW_DESC": "Penarikan & transfer dompet", + "ASSETS_DESC": "Lacak harga dan temukan data aset", + "CONVERT_DESC": "Perdagangkan aset apa pun dengan aset lain dengan mudah", + "MARKET_DESC": "Pasar buku pesanan perdagangan spot.", + "P2P_DESC": "Perdagangan kripto", + "REFERRAL_DESC": "Dapatkan penghasilan pasif dengan mengundang teman-teman Anda", + "CEFI_STAKE_DESC": "Pertaruhkan aset dari dompet bursa Anda", + "DEFI_STAKE_DESC": "Hubungkan dompet dan pertaruhkan aset Anda", + "BUY_CRYPTO_DESC": "Beli melalui transfer bank langsung atau kartu", + "SECURITY_DESC": "Akun 2FA, kata sandi dan API", + "VERIFICATION_DESC": "Verifikasi identitas akun", + "SETTINGS_DESC": "Antarmuka dan pengaturan akun lainnya", + "SUMMARY_PAGE": "Halaman ringkasan", + "SIGNOUT_DESC": "Keluar dari akun", + "LANGUAGE_DESC": "Ubah Preferensi Bahasa", + "API_DESC": "Gunakan kunci API untuk mengakses akun Anda secara terprogram", + "HELP_DESC": "Dapatkan bantuan. Hubungi dukungan", + "TRANSACTION_DESC": "Tinjau semua perdagangan, setoran & penarikan", + "ONRAMPER_DESC": "Gunakan Onramper untuk membeli dan menjual kripto" } } \ No newline at end of file diff --git a/web/src/config/lang/it.json b/web/src/config/lang/it.json index 05002b8b7a..f3c4aba40c 100644 --- a/web/src/config/lang/it.json +++ b/web/src/config/lang/it.json @@ -86,7 +86,7 @@ "OPTION_BUG": "Segnala un errore", "OPTION_PERSONAL_INFO": "Modificare le informazioni personali", "OPTION_BANK_TRANSFER": "Bonifico bancario", - "OPTION_REQUEST": "Richiedi un invito per lo scambio HollaEx" + "OPTION_REQUEST": "Richiedi un invito per lo scambio" }, "SUBJECT_LABEL": "Soggetto", "SUBJECT_PLACEHOLDER": "Digita l'oggetto del tuo problema", @@ -106,7 +106,8 @@ }, "QR_CODE": "Questo codice QR contiene le informazioni sul deposito e può essere scansionato con un lettore di codici QR.", "NO_DATA": "Nessuna informazione disponibile", - "QR_CODE_TITLE": "{0} Informazioni sul deposito" + "QR_CODE_TITLE": "{0} Informazioni sul deposito", + "VIEW_DEPOSIT": "Visualizza deposito" }, "QR_CODE": { "SCAN": "Scansione", @@ -234,7 +235,10 @@ "MOBILE_WALLET_BALANCE_LABEL": "Bilancia/Est. USDT", "MOBILE_WALLET_SHARE_LABEL": "% Quota/Stima USDT", "VIEW_MORE_WALLET_INFO": "VISUALIZZA ALTRE INFORMAZIONI SUL PORTAFOGLIO", - "VIEW_WALLET_TRANSACTION_HISTORY": "VISUALIZZA LA CRONOLOGIA DELLE TRANSAZIONI DEL PORTAFOGLIO" + "VIEW_WALLET_TRANSACTION_HISTORY": "VISUALIZZA LA CRONOLOGIA DELLE TRANSAZIONI DEL PORTAFOGLIO", + "ORDERS_HOLD": "Hai {0} {1}, con conseguente blocco di {2} {3} sul tuo saldo {4}", + "OPEN_ORDERS_SINGULAR": "ordine aperto", + "VIEW_WALLET": "Visualizza portafoglio" }, "REQUEST_RESET_PASSWORD": { "TITLE": "Recupero dell'account", @@ -539,7 +543,8 @@ "CANCEL": "Annulla", "PLACEHOLDER": "Digitare qui" } - } + }, + "TITLE_TEXT": "Modifica le impostazioni del tuo account modificando le preferenze, come il layout dell'interfaccia, le preferenze di notifica, il nome utente e altre personalizzazioni." }, "USER_APPS": { "TITLE": "Le tue app di scambio", @@ -783,7 +788,10 @@ "INSTALL_METAMASK_DETAILS": { "TITLE": "Installa MetaMask", "PROMPT": "Devi installare Metamask nel tuo browser: {0}" - } + }, + "EARN_REWARD": "Guadagna premi per lo staking dei tuoi asset digitali", + "DEFI_STAKING": "Staking DeFi", + "CEFI_STAKING": "Staking CeFi" }, "UNSTAKE": { "TITLE": "Annulla puntata", @@ -901,13 +909,13 @@ "FORFEITURE_OF_EARNINGS_DETAILS_LABEL": "Confisca dei guadagni", "STAKE_AMOUNT_LABEL": "Importo dello staking", "DISCLAIMER_NOTICE": "Nota: Si prega di notare che per importi valutati in USD superiori a $1,000 è richiesta la verifica dell'identità completa. Questo valore include i guadagni, e la piattaforma si riserva il diritto di richiedere ulteriori informazioni sull'utente.", - "SETTLEMENT_NOTICE": "Regolamento: Verrà applicato un periodo di regolamento di 24 ore al momento del ritiro.", + "SETTLEMENT_NOTICE": "{0} Verrà applicato un periodo di liquidazione di 24 ore al momento dell'annullamento dello staking.", "CONFIRM_BUTTON": "Conferma", "STAKE_RULES_NOTICE": "Non appena avrai fatto lo staking, sarai vincolato alle regole del pool.", "I_UNDERSTAND_AGAIN_BUTTON": "Ho Capito di Nuovo", "CONGRATULATIONS_NOTICE": "Congratulazioni!", "EARNINGS_START_NOTICE": "Il tuo staking inizierà a generare guadagni.", - "REVIEW_PROGRESS_LABEL": "Puoi consultare l'andamento del tuo staking nella pagina degli Staking Attivi.", + "REVIEW_PROGRESS_LABEL": "Puoi rivedere l'avanzamento della tua posta in gioco su {0}", "TIME_REMAINING_LABEL": "Tempo Rimanente", "PENALTY_UPON_INITIAL_STAKE_PRINCIPLE_LABEL_2": "Penalità sul capitale iniziale stakato", "FORFEITURE_OF_EARNINGS_LABEL_2": "Confisca dei guadagni", @@ -917,7 +925,26 @@ "VISIT_WALLET_BUTTON": "VISITA IL PORTAFOGLIO", "CLOSE_BUTTON": "CHIUDI", "ACTIVE_STAKES": "Puntate attive", - "STAKES_HISTORY": "Storia" + "STAKES_HISTORY": "Storia", + "SETTLEMENT_NOTICE_TITLE": "Insediamento:", + "REVIEW_PROGRESS_ACTIVE_LINK": "Pagina delle puntate attive", + "STAKING": "Picchettamento 101", + "SLASHING": "Taglio", + "MINIMUM_AMOUNT_ALLOWED": "L'importo minimo consentito per lo staking pool è", + "MAXIMUM_AMOUNT_ALLOWED": "L'importo massimo consentito per lo staking pool è", + "DAYS": "Giorni", + "CONFIRM_STAKE_DECS": "Eccoci qui!", + "DO_YOU_UNDERSTAND": "Capisci?", + "SUCCESSFULLY_STAKED_IN": "Puntato con successo", + "SUCCESSFULLY_STAKED": "Puntato con successo", + "VIEW_ACTIVE_STAKES": "VISUALIZZA LE POSTAZIONI ATTIVE", + "REVIEW_AND_UNSTAKE": "Rivedi e annulla la partecipazione", + "NO_REWARD": "Nessun importo di ricompensa da ricevere", + "SUCCESSFULLY_UNSTAKED": "Hai annullato con successo lo staking", + "MIN": "Minimo", + "UNSTAKING": "SMONTAGGIO...", + "UNSTAKED": "NON PICCHIATO", + "TOOLTIP": "La penalità che incorrerai se annulli la puntata troppo presto. {0}" }, "MOVE_XHT": { "TITLE": "Sposta XHT", @@ -1072,7 +1099,9 @@ "ENTER_AMOUNT": "Inserire l'importo", "REMOVE_TITLE": "Rimuovi tag", "MAX_AMOUNT_WARNING_INFO": "Questo importo supera il limite massimo di prelievo.", - "ZERO_BALANCE": "Non hai abbastanza saldo disponibile." + "ZERO_BALANCE": "Non hai abbastanza saldo disponibile.", + "MIN_AMOUNT_WARNING_INFO": "L'importo minimo di prelievo è {0}", + "NEW_ADDRESS": "Nuovo indirizzo" }, "WALLET_BUTTON_BASE_DEPOSIT": "depositare", "WALLET_BUTTON_BASE_WITHDRAW": "ritirare", @@ -1405,7 +1434,8 @@ "INSUFFICIENT_LABEL": "Importo di liquidazione insufficiente", "INSUFFICIENT_INFO_1": "I tuoi guadagni al momento non sono sufficienti per la liquidazione. Invita altri membri utilizzando il tuo link di riferimento e attendi fino a quando le tue entrate non definite {0} {1}", "INSUFFICIENT_INFO_2": "superare 1", - "GO_TO_REFERRAL": "Vai a Referral" + "GO_TO_REFERRAL": "Vai a Referral", + "REFER_DESC": "Condividi un link qui sotto con i tuoi amici per iniziare a guadagnare commissioni sul loro trading" }, "NOT_LOGGEDIN": { "TEXT_GENERAL": "Per visualizzare devi effettuare il login", @@ -1473,7 +1503,11 @@ "CHANGE_7D": "Modifica (7 giorni)", "CHANGE_1D": "Modifica (1 giorno)", "CHART_7D": "Grafico (7 giorni)", - "ASSET": "Risorsa" + "ASSET": "Risorsa", + "PERCENTAGE": "% {0}", + "24H": "24 ore", + "TREND_7D": "Tendenza 7D", + "BUY": "Acquista {0} {1}" }, "SUMMARY_MARKETS": { "HOLLAEX": "Vuoi elencare le tue risorse digitali? Avvia il tuo mercato con il tuo HollaEx {0} {1}", @@ -1623,7 +1657,18 @@ "ORDERBOOK": "Portafoglio ordini", "NETWORK": "Broker di rete OTC", "BROKER": "Broker locale OTC", - "BROKERAGE": "NA - (Intermediazione)" + "BROKERAGE": "NA - (Intermediazione)", + "LOADING_PRICES": "Caricamento prezzi...", + "INPUT_LABEL": "Inserisci il nome o il simbolo della risorsa", + "HIGHLIGHTS": "Punti salienti", + "MOBILE_DESC": "Seleziona uno dei mercati qui sotto per iniziare a fare trading.", + "PRICE_24H": "Prezzo/24H %", + "CARDS": { + "GAINERS": "Guadagnatori", + "LOSERS": "Perdenti", + "MARKET_CAP": "Capitalizzazione di mercato", + "24H": "{0} 24 ore" + } }, "HOLLAEX_TOKEN": { "REMOVE_FAVOURITES": "Rimuovi dai preferiti", @@ -1669,7 +1714,8 @@ "TAG": "Etichetta:", "DISABLED_DEPOSIT_CONTENT": "La funzionalità di deposito è temporaneamente non disponibile.", "DISABLED_WITHDRAW_CONTENT": "La funzionalità di prelievo è temporaneamente non disponibile.", - "DEPOSIT_LABEL": "Depositare" + "DEPOSIT_LABEL": "Depositare", + "VOLUME": "VOLUME" }, "ASYNC_LINK": { "TITLE": "La pagina non si apre automaticamente?", @@ -1859,7 +1905,8 @@ "WALLET_BALANCE_ESTIMATE": "Stima del saldo del portafoglio di oggi ", "VIEW_BALANCE_HISTORY": "VISUALIZZA LA CRONOLOGIA DEL SALDO", "VIEW_PERCENTAGE_SHARE": "VISUALIZZA QUOTA PERCENTUALE", - "VIEW_WALLET_P&L": "VISUALIZZA P&L DEL PORTAFOGLIO" + "VIEW_WALLET_P&L": "VISUALIZZA P&L DEL PORTAFOGLIO", + "BALANCE_PERCENTAGE": "Percentuale di saldo" }, "ASSET_INFO": "Informazioni sulle risorse", "TAKER_FEES_APPLIED": "Vengono applicate le commissioni dell'acquirente", @@ -2008,7 +2055,7 @@ "TOTAL_ASSET_SELL_1": "Totale", "TOTAL_ASSET_SELL_2": "puoi vendere", "BUY_ORDER_LIMITS": "LIMITI DELL'ORDINE DI ACQUISTO", - "MIN_MAX_ORDER_VALUE_1": "Minimo e massimo", + "MIN_MAX_ORDER_VALUE_1": "Minimo e massimo {0} {1}", "MIN_MAX_ORDER_VALUE_2": "acquista il valore dell'ordine in", "PAYMENT_METHODS_SEND_FIAT": "METODI DI PAGAMENTO PER INVIARE FIAT", "SELECT_PAYMENT_METHODS_1": "Seleziona fino a", @@ -2024,7 +2071,7 @@ "DEAL_EDITED": "L'offerta è stata modificata", "DEAL_CREATED": "L'offerta è stata creata", "NEXT": "PROSSIMO", - "ADD_PAYMENT_METHOD_DETAILS": "Aggiungi i dettagli del metodo di pagamento", + "ADD_PAYMENT_METHOD_DETAILS": "{0} Dettagli del metodo di pagamento", "COMPLETE": "Completare", "STEP_SET_TYPE_PRICE": "Imposta il tipo e il prezzo", "STEP_SET_TOTAL_AMOUNT_PAYMENT_METHODS": "Imposta l'importo totale e i metodi di pagamento", @@ -2054,6 +2101,400 @@ "ALL_REGION": "Tutta la Regione", "BUYER_NOT_MADE_THE_PAYMENT": "L'acquirente non ha ancora confermato il pagamento.", "PRICE_TO_ADVERTISE": "Prezzo che pubblicizzerai per vendere", - "VIEW_PROFILE": "Visualizza il profilo del venditore" + "VIEW_PROFILE": "Visualizza il profilo del venditore", + "P2P_METHODS": "Metodi di pagamento P2P", + "PAYMENT_METHODS": "METODI DI PAGAMENTO", + "PAYMENT_METHODS_DEC": "Puoi vendere criptovalute e ricevere pagamenti fiat aggiungendo i dettagli del tuo conto di pagamento personale, come le informazioni bancarie o altri metodi di pagamento locali. Assicurati che il nome associato al tuo conto di pagamento corrisponda al nome nei tuoi dettagli verificati prima di aggiungere le tue informazioni di pagamento.", + "SELL_AMOUNT": "Importo di vendita", + "ADD_PAYMENT_METHOD": "+ AGGIUNGI METODO DI PAGAMENTO", + "REMOVE": "RIMUOVERE", + "DYNAMIC": "DINAMICO", + "TYPE": "TIPO", + "BACK_TO_ORDERS": "agli ordini", + "FUNDS_TRANSFERRED_USER": "L'utente ha confermato la transazione e i fondi sono stati trasferiti sul tuo saldo.", + "CONFIRM_TRANSFER_USER": "CONFERMA TRASFERIMENTO E NOTIFICA UTENTE", + "BUYER_SENT_FUNDS_USER": "Hai segnalato all'utente che hai inviato i fondi. Attendi una risposta dall'utente.", + "VENDOR_CONFIRMED_ORDER_USER": "L'utente ha confermato la transazione e sbloccato i fondi.", + "BUY_UPPER": "ACQUISTARE", + "CRYPTO_WANT_TO_BUY": "Criptovaluta che vuoi acquistare", + "FIAT_CURRENCY_WANT_TO_SPEND": "Valuta fiat da spendere", + "PRICE_ADVERTISE": "Prezzo che pubblicizzerai a {0}", + "TOTAL_AMOUNT": "Importo totale", + "BUY_SELL_DESC": "puoi {0}", + "SELL_ORDER_LIMITS": "LIMITI DEGLI ORDINI DI VENDITA", + "MIN_MAX_ORDER_VALUE_3": "valore dell'ordine di vendita", + "PAYMENT_METHODS_RECEIVE_FIAT": "METODI DI PAGAMENTO PER RICEVERE FIAT", + "PAYMENT_TIME_LIMIT_LABEL": "Termine di pagamento: {0}", + "30_MINUTES": "30 minuti", + "DELETE_UPPERCASE": "ELIMINARE", + "CLICK_TO_VIEW": "CLICCA PER VISUALIZZARE", + "NEW_MESSAGE": "Hai ricevuto un messaggio P2P", + "STATUS_UPDATE": "Hai un aggiornamento sul tuo ordine P2P", + "APPEAL_STATUS_MESSAGE": "Il tuo ordine P2P è stato contestato", + "CANCEL_STATUS_MESSAGE": "Il tuo ordine P2P è stato annullato", + "CONFIRM_STATUS_MESSAGE": "Il tuo ordine P2P è stato confermato", + "NEW_ORDER_CREATED": "È stato creato un nuovo ordine P2P", + "CRYPTO_RELEASE_STATUS_MESSAGE": "La criptovaluta è stata rilasciata dall'ordine", + "ADDITIONAL_PAYMENT_DETAILS": "Aggiungi ulteriori dettagli di pagamento", + "PAYMENT_FIELD_INFO": "Questo nuovo campo di pagamento è aggiuntivo e dovrebbe assistere i partecipanti P2P nei loro trasferimenti di valuta fiat. Dovrebbero essere i dettagli dell'account relativi al metodo di pagamento. Potrebbero includere numeri di telefono, nomi utente, numeri di account univoci e altre informazioni necessarie per le transazioni a seconda del sistema di metodi di pagamento.", + "PAYMENT_DETAIL_NAME": "Nome del dettaglio del pagamento", + "REQUIRED_OR_OPTIONAL": "Obbligatorio o facoltativo", + "CREATE_NEW_PAYMENT_METHODS": "Crea e aggiungi nuovi metodi di pagamento", + "MANUAL_PAYMENT_METHOD_ENTRY": "Per aggiungere un metodo di pagamento alla tua piattaforma P2P, puoi farlo manualmente inserendo il nome del metodo di pagamento e i dettagli di pagamento richiesti. Ad esempio, PayPal utilizza indirizzi email per inviare e ricevere fondi.", + "USERS_PAYMENT_SELECTION": "Una volta aggiunto il metodo di pagamento, i tuoi commercianti e utenti P2P potranno selezionarlo e inserire le informazioni necessarie quando effettuano o ricevono pagamenti. I dettagli forniti saranno condivisi con l'altra parte nella transazione P2P.", + "METHOD_NAME_AND_DETAIL": "Nome del metodo e dettaglio del pagamento principale", + "ADD_NEW_PAYMENT_METHODS": "Seleziona nuovi metodi di pagamento:", + "DETAIL_NAME": "Nome del dettaglio del pagamento", + "DETAIL_VALUE": "Valore dei dettagli del pagamento", + "DETAIL_REQUIRED": "Necessario", + "IMPORTANT_DETAIL": "(Dettagli importanti sul pagamento)", + "DETAIL_OPTIONAL": "Opzionale", + "OPTIONAL_DETAIL": "(Dettagli di pagamento facoltativi)", + "ADD_NEW_PAYMENT_FIELD": "Aggiungi nuovo campo dettagli pagamento", + "PAYMENT_METHOD_CREATED": "Metodo di pagamento creato! In attesa di verifica da parte dell'amministratore", + "PAYMENT_METHOD_DELETED": "Metodo di pagamento eliminato.", + "PAYMENT_METHOD_UPDATED": "Metodo di pagamento aggiornato.", + "CRYPTO": "Cripto:", + "INPUT_SPEND_AMOUNT": "Inserisci l'importo della spesa", + "INPUT_SELL_AMOUNT": "Inserisci l'importo da vendere", + "TIMES": "volte", + "FEEDBACK": "Feedback", + "ASSET": "Risorsa: ", + "CUSTOM": "Costume", + "CANCELLED": "Annullato", + "APPEALED": "Appellato", + "EXPIRED": "Scaduto", + "RATE": "Valutare:", + "BUYING": "Acquistando {0}", + "SELLING": "Vendita {0}", + "TERMS_AND_CONDITION_DESCRIPTION": "Si prega di pubblicare entro 15 minuti dall'inizio dell'affare", + "VISIT_OUR_WEBSITE": "Visita il nostro sito web", + "SELECT_PAYMENT_SYSTEM_LABEL": "Seleziona il sistema di pagamento", + "FIELD": "Campo", + "NEW_PAYMENT_PLACEHOLDER": "Inserisci il valore dei dettagli del pagamento", + "FIELD_VALIDATION_TEXT": "Inserisci tutti i campi del metodo", + "INPUT_METHOD_NAME_TEXT": "Inserisci il nome del metodo", + "INPUT_PAYMENT_DETAIL_TEXT": "Inserisci il nome del dettaglio del pagamento", + "UNVERIFIED": "Non verificato", + "VERIFIED": "Verificato", + "AMOUNT_RECEIVE": "verrà rilasciato dal tuo saldo", + "DELETE_WARNING": "Vuoi davvero eliminare questo metodo di pagamento?", + "STEP_1": "Passo 1/3", + "STEP_2": "Passo 2/3", + "STEP_3": "Passo 3/3", + "P2P_ORDER_CREATED": "Ordine P2P creato", + "VENDOR_CHECKS_TITLE": "Controlla e conferma il pagamento", + "FUND_RELEASED": "Fondi liberati", + "ORDER_EXPIRY": "Scadenza ordine in", + "MINIMUM_AMOUNT_WARNING": "Il minimo {0} è {1}", + "MAXIMUM_AMOUNT_WARNING": "Il massimo {0} è {1}", + "ORDER_CREATION": "Creazione dell'ordine", + "ORDER_CREATION_DESC_1": "Cliccando su \"Crea ordine\", avviserai il fornitore e riceverai un preventivo immediato insieme ai dettagli precisi per il trasferimento del pagamento. {0} {1} {2} {3}", + "ORDER_CREATION_DESC_2": "Questo include l'importo esatto necessario per finalizzare l'ordine.", + "YOU_HAVE_TEXT": "Avrai", + "COMPLETE_PAYMENT_PROCESS": "per completare la procedura di trasferimento del pagamento.", + "WARINNG_DESC": "Si prega di procedere con la creazione dell'ordine solo se si ha realmente intenzione di completarlo.", + "ORDER_CANCEL_DESC": "L'annullamento dell'ordine potrebbe comportare la sospensione dell'account.", + "CONFIRM_ORDER_CREATION": "Quando sei pronto per {0}, clicca su \"Crea ordine\" qui sotto.", + "SEND_MONEY": "inviare i soldi", + "RECEIVE_MONEY": "ricevere i soldi", + "CREATE_ORDER": "Crea ordine", + "NO_ORDERS_DESC": "Sembra che qui non ci siano ordini.", + "NO_DEALS_DESC": "Sembra che qui non ci siano offerte.", + "ONLINE": "IN LINEA", + "OFFLINE": "NON IN LINEA", + "SELECT_CRYPTO": "Seleziona criptovaluta", + "REMOVE_WARNING": "Sei sicuro di voler rimuovere questa offerta?", + "SHOW_FILTERS": "MOSTRA FILTRI", + "HIDE_FILTERS": "NASCONDI FILTRI", + "ORDERS_COMPLETED": "Ordini completati:", + "CANCEL_WARNING_TEXT": "Tieni presente che le frequenti cancellazioni degli ordini potrebbero influire negativamente sul tuo profilo P2P pubblico e potrebbero comportare la sospensione del tuo account.", + "UPDATE": "Aggiornamento", + "TERMS_ERROR_TEXT": "Inserisci il campo Termini", + "RESPONSE_ERROR_TEXT": "Inserisci il campo Risposta" + }, + "CUSTOM_NATIVE_CURRENCY": "Valuta (stime di prezzi e valore delle attività)", + "ADDRESS_BOOK": { + "ADDRESS_BOOK_LABEL": "Rubrica", + "ADDRESS_BOOK_DESC_1": "Aggiungi un indirizzo di prelievo nella whitelist alla tua rubrica personale", + "ADDRESS_BOOK_DESC_2": "Potrai utilizzare facilmente questi indirizzi per effettuare prelievi.", + "ADD_ADDRESS_LINK": "Aggiungi indirizzo", + "ADD_WITHDRAW_ADDRESS": "Aggiungi indirizzo di prelievo", + "DATE_ADDED": "Data aggiunta", + "REMOVE": "Rimuovere", + "NO_LINK": "Non è stato ancora aggiunto alcun indirizzo di prelievo.", + "ADD_WITHDRAW_ADDRESS_DESC_1": "Aggiungi un indirizzo nella whitelist su cui puoi prelevare monete in tutta sicurezza.", + "ADD_WITHDRAW_ADDRESS_DESC_2": "L'indirizzo di prelievo deve essere un indirizzo sotto il tuo controllo.", + "NAME_YOUR_ADDRESS_TITLE": "Indica il tuo indirizzo", + "NAME_YOUR_ADDRESS_DESC": "Assegna un nome a questo indirizzo di prelievo per riferimento futuro.", + "USER_LABEL": "Nome/etichetta:", + "USER_FIELD_PLACEHOLDER": "Assegna un nome a questo indirizzo di prelievo", + "CHECK_AND_CONFIRM": "Controllare e confermare", + "WARNING_ADDRESS": "Prima di aggiungere questo indirizzo alla tua rubrica, prenditi il tempo di controllare e confermare che i dettagli siano corretti:", + "ENSURE_DESC": "Assicurati che l'indirizzo sia corretto e sotto il tuo controllo.", + "ADDRESSES": "Indirizzi", + "WITHDRAWAL_ADDRESS_BOOK": "Rubrica di prelievo", + "ADD_ADDRESS_DESC": "Aggiungi l'indirizzo di prelievo a {0}", + "ADDRESS_BOOK": "Rubrica", + "MANAGE_ADDRESS_BOOK": "Gestisci la rubrica", + "VIEW_ADDRESS_BOOK_LABEL": "Visualizza la rubrica", + "ADD_WITHDRAWAL_ADDRESS_LINK": "Aggiungi indirizzo di prelievo", + "REVOKE_ADDRESS": "Il tuo indirizzo è stato rimosso", + "REMOVE_ADDRESS": "Rimuovi indirizzo", + "REMOVE_CONTENT": "Vuoi rimuovere questo indirizzo di prelievo dalla tua rubrica?" + }, + "VOLUME": { + "VOLUME": "VOLUME", + "BACK": "Indietro", + "MARKETS": "MERCATI", + "CONVERT": "CONVERTIRE", + "HISTORY": "STORIA", + "TRADING_VOLUME": "Volume di trading", + "VOLUME_DECS": "Importi negoziati sul tuo account in diversi periodi di tempo, insieme ai 3 asset principali negoziati in ciascun periodo", + "ALL_ASSETS": "tutte le attività", + "DAY_VOLUME": "VOLUME GIORNALIERO", + "HOUR_VOLUME": "VOLUME 24 ORE", + "TOP": "ALTO {0} {1}", + "VOL_ASSET": "D VOL. PATRIMONIO", + "NO_DATA_DESC_1": "Sembra che tu non abbia ancora fatto alcun trade. Inizia a fare trading ora per vedere la tua attività qui!", + "NO_DATA_DESC_2": "Inizia a fare trading", + "NO_DATA_DESC_3": "ora per vedere la tua attività qui!", + "TRADE_VOLUME": "Volume degli scambi", + "VIEW_VOLUME": "VISUALIZZA VOLUME", + "TRADE_DESCRIPTION": "Visualizza i tuoi asset più scambiati", + "MARKET_TABLE_DESC": "Visita la pagina del volume di trading {0}" + }, + "MORE_OPTIONS_LABEL": { + "MORE_OPTION_SEARCH_TXT": "Funzionalità di ricerca o pagine", + "NO_RESULT_DESC_1": "Sembra che non ci siano risultati per questo.", + "NO_RESULT_DESC_2": "Prova a cercare un'altra parola chiave.", + "ICONS": { + "REFERRALS": "Riferimenti", + "BUY_CRYPTO": "Acquista criptovalute", + "API": "API", + "DEFI_STAKE": "Puntata Defi", + "CEFI_STAKE": "Palo di Cefi", + "PROFIT_LOSS": "Profitti e perdite", + "LIMITS": "Limiti", + "LOGINS": "Accesso", + "AUDIO": "Audio" + }, + "HOT_FUNCTION": { + "HOT_FUNCTION_LABEL": "Funzioni calde", + "ADD_FUNDS": "Aggiungi fondi", + "TOP_UP": "Ricarica", + "LOAD": "Carico", + "CREDIT": "Credito", + "FUND_ACCOUNT": "Conto di fondi", + "BTC": "BTC-B ...", + "USTD": "USDT", + "ETH": "eth", + "USD": "Dollaro statunitense", + "XHT": "xht", + "TRANSFER": "trasferire", + "MONEY": "soldi", + "FUNDING": "finanziamento", + "RECHARGE": "ricaricare", + "REFILL": "ricarica", + "CASH_IN": "incassare", + "ADD_MONEY": "aggiungere denaro", + "EXCHANGE": "Scambio", + "SWAP": "Scambio", + "BUY_SELL": "Acquista/Vendi", + "TRADE": "Commercio", + "CONVERT_CURRENCY": "Convertire valuta", + "INVITE": "Invitare", + "REFER": "Fare riferimento", + "REWARDS": "Ricompense", + "BONUS": "Premio", + "AFFILIATION": "affiliazione", + "AFFILIATE": "affiliato", + "PASSIVE_INCOME": "Reddito passivo", + "REVENUE": "reddito" + }, + "OTHER_FUNCTIONS": { + "OTHER_FUNCTIONS_LABEL": "Altre funzioni", + "INTEGRATION": "Integrazione", + "PROGRAMMATIC_ACCESS": "Accesso programmatico", + "DEVELOPER": "Sviluppatore", + "AUTOMATED_TRADING": "Trading automatico", + "BOT": "Roboto", + "ALGO": "Qualcosa", + "ALGORITHM": "algoritmo", + "FIAT": "fiat", + "DOLLAR": "dollaro", + "PURCHASE": "acquistare", + "BUY_COIN": "Acquista moneta", + "BUY_TOKEN": "Acquista token", + "YIELD": "Prodotto", + "INTEREST": "Interesse", + "REVENUE": "reddito", + "CENTRALIZED_STAKING": "Picchettamento centralizzato", + "PERFORMANCE": "Prestazione", + "GAINS": "Guadagni", + "LOSSES": "Perdite", + "PORTFOLIO_PROFIT": "Profitto del portafoglio", + "LOSS": "perdita", + "PNL": "per favore", + "CHARGES": "Addebiti", + "COSTS": "Costi", + "COMMISSION": "Commissione", + "TRADING_FEES": "Commissioni di negoziazione", + "TRANSACTION_FEES": "Commissioni di transazione", + "RESTRICTIONS": "Restrizioni", + "BOUNDARIES": "Confini", + "CAPS": "Cappellini", + "MAXIMUM": "Massimo", + "WITHDRAWAL_LIMITS": "Limiti di prelievo", + "STORAGE": "Magazzinaggio", + "FUNDS": "Fondi", + "BALANCE": "Bilancia", + "CRYPTO_WALLET": "Portafoglio crittografico", + "MY": "Mio", + "ENGLISH": "inglese", + "LOCALIZATION": "Localizzazione", + "TRANSLATE": "Tradurre", + "LANGUAGE_SETTINGS": "Impostazioni della lingua", + "MULTILINGUAL": "Multilingue", + "LANGUAGE_PREFERENCE": "Preferenza di lingua", + "TEXT": "testo", + "WORD": "parola", + "PEER_TO_PEER": "Peer to peer", + "DIRECT_TRADE": "Commercio diretto", + "USER_TO_USER": "Da utente a utente", + "PRIVATE_TRADE": "Commercio privato", + "TRANSACTIONS": "Transazioni", + "ACTIVITY": "Attività", + "RECORD": "Documentazione", + "LOG": "Tronco d'albero", + "TRANSACTION_HISTORY": "Cronologia delle transazioni", + "LIQUIDITY": "Liquidità", + "MARKET_VOLUME": "Volume di mercato", + "TRADING_ACTIVITY": "Attività di trading", + "MARKETS": "mercati", + "CRYPTO": "Criptare", + "TWO_FACTOR_AUTHENTICATION": "Autenticazione a due fattori", + "MFA": "MAE", + "AUTHENTICATOR": "Autenticatore", + "OTP": "otp", + "CREDENTIALS": "Credenziali", + "PASSWORD_RESET": "Reimposta password", + "SIGN_INS": "Registrazioni", + "ACCOUNT_ACCESS": "Accesso all'account", + "SESSION_HISTORY": "Cronologia della sessione", + "LOGGED_IN": "Connesso", + "SESSION_MANAGEMENT": "Gestione della sessione", + "CURRENT_SESSIONS": "Sessioni correnti", + "BANKING_DETAILS": "Dettagli bancari", + "BANK_ACCOUNT": "Conto bancario", + "FINANCIAL_INSTITUTION": "Istituto finanziario", + "BANK_INFO": "Informazioni bancarie", + "WITHDRAWAL_ACCOUNT": "Conto di prelievo", + "FUND": "finanziare", + "SOUND": "Suono", + "AUDIO_SETTINGS": "Impostazioni audio", + "ALERTS": "Avvisi", + "NOTIFICATIONS": "Notifiche", + "AUDIO_ALERTS": "Avvisi audio", + "SECURITY": "sicurezza", + "CONTACT": "Contatto", + "EMAIL_ADDRESS": "Indirizzo e-mail", + "MAIL": "Posta", + "EMAIL_CONTACT": "Contatto e-mail", + "KYC": "KYC-Italiano", + "SMS": "sms", + "KYC_CAPS": "Controllo qualità", + "ID": "ID", + "PERSONAL_INFO": "Informazioni personali", + "IDENTITY_CHECK": "Controllo dell'identità", + "PAYOUT": "Pagamento", + "CASH_OUT": "Incassare", + "REMOVE_FUNDS": "Rimuovi fondi", + "OUT": "Fuori", + "SUPPORT": "supporto", + "CONTACT_LOWER": "contatto", + "EMAIL_LOWER": "e-mail", + "RESOURCE": "risorse", + "GUIDES": "guide", + "FAQ": "Domande frequenti", + "CUSTOMER_SERVICE": "assistenza clienti", + "ASSISTANCE": "assistenza", + "API_LOWER": "API", + "MESSAGE": "messaggio", + "LIVE_CHAT": "chat dal vivo", + "SETTINGS": "impostazioni", + "ALERT": "Attenzione", + "UPDATES": "Aggiornamenti", + "REMINDERS": "Promemoria", + "UI": "Interfaccia utente", + "USER_INTERFACE": "Interfaccia utente", + "LAYOUT": "Disposizione", + "DESIGN": "Progetto", + "DASHBOARD": "Pannello di controllo", + "COLOR_THEME": "tema colore", + "ORDER_BOOK": "libro degli ordini", + "DARK": "buio", + "LIGHT": "leggero", + "WITHDRAWAL_ADDRESSES": "Indirizzi di prelievo", + "CRYPTO_ADDRESSES": "Indirizzi crittografici", + "WALLET_ADDRESSES": "Indirizzi del portafoglio", + "SAVED_ADDRESSES": "Indirizzi salvati", + "ADDRESS_BOOK": "Rubrica", + "WHITE_LISTED": "lista bianca" + } + }, + "CONNECTIONS": { + "CHECK_CONNECTION": "Controlla la connessione", + "IP": "Proprietà intellettuale", + "NORMAL_TEXT": "Normale", + "CONNECTION_ISSUE": "Problema di connessione", + "SESSION": "Sessione", + "SERVER_TIME": "Ora del server", + "PING": "Segnale acustico", + "CHECK_PING": "CONTROLLA PING", + "RECONNECT": "Riconnettersi", + "TOOLTIP_DESC_1": "Controlla il tuo ping sul server di Exchange {0}", + "TOOLTIP_DESC_2": "Meglio un 'ms' più basso", + "LOGGED_IN_AT": "Effettuato l'accesso a", + "RECONNECT_DESC": "Riconnetti potrebbe risolvere i problemi sconosciuti che stai riscontrando.", + "CONFIRM_RECONNECT_MESSAGE": "Vuoi riconnetterti?", + "PING_CHECK_TEXT": "Ping del server. Attendi...", + "RECHECK_PING": "RICONTROLLA PING", + "FAST": "Veloce", + "SLOW": "Lento", + "MS": "{0} millisecondi", + "STATUS_NORMAL": "Connessione Normale", + "CONNECTION_LABEL": "Connessione", + "CONNECTION_ISSUE_DETECTED": "Rilevato problema di connessione" + }, + "DESKTOP_NAVIGATION": { + "OTHERS": "Altri", + "SUMMARY_DESCRIPTION": "Informazioni e accessibilità a livello di account", + "FEES_LIMITS_DESC": "Commissioni di trading e prelievo. Limiti del conto", + "VOLUME_DESC": "Riepilogo del volume degli scambi nel tempo", + "DEPOSIT_DESC": "Accedi alle opzioni di finanziamento del deposito del portafoglio", + "BALANCE_DESC": "Tutti i tuoi beni e i loro saldi", + "PERFORMANCE_DESC": "Profitti e perdite del portafoglio", + "HISTORY_DESC": "Controlla tutte le negoziazioni, i depositi e i prelievi", + "ADDRESS_BOOK_DESC": "Contatti rubrica per prelievi", + "WITHDRAW_DESC": "Prelievi e trasferimenti dal portafoglio", + "ASSETS_DESC": "Tieni traccia dei prezzi e scopri i dati delle risorse", + "CONVERT_DESC": "Scambia qualsiasi asset con un altro semplicemente", + "MARKET_DESC": "Mercati degli ordini di negoziazione spot.", + "P2P_DESC": "Trading di criptovalute", + "REFERRAL_DESC": "Guadagna un reddito passivo invitando i tuoi amici", + "CEFI_STAKE_DESC": "Metti in gioco l'asset dal tuo portafoglio di scambio", + "DEFI_STAKE_DESC": "Collega il portafoglio e punta il tuo asset", + "BUY_CRYPTO_DESC": "Acquista tramite bonifico bancario diretto o carte", + "SECURITY_DESC": "Account 2FA, password e API", + "VERIFICATION_DESC": "Verifica dell'identità dell'account", + "SETTINGS_DESC": "Interfaccia e altre impostazioni dell'account", + "SUMMARY_PAGE": "Pagina di riepilogo", + "SIGNOUT_DESC": "Disconnessione dall'account", + "LANGUAGE_DESC": "Cambia la preferenza della lingua", + "API_DESC": "Utilizza le chiavi API per accedere in modo programmatico al tuo account", + "HELP_DESC": "Ottieni aiuto. Contatto di supporto", + "TRANSACTION_DESC": "Rivedi tutte le negoziazioni, i depositi e i prelievi", + "ONRAMPER_DESC": "Usa Onraper per acquistare e vendere criptovalute" } } \ No newline at end of file diff --git a/web/src/config/lang/ja.json b/web/src/config/lang/ja.json index ec6be93589..0eea0a14d8 100644 --- a/web/src/config/lang/ja.json +++ b/web/src/config/lang/ja.json @@ -139,7 +139,7 @@ "OPTION_BUG": "エラー報告", "OPTION_PERSONAL_INFO": "個人情報の変更", "OPTION_BANK_TRANSFER": "銀行送金", - "OPTION_REQUEST": "HollaEx招待リクエスト" + "OPTION_REQUEST": "招待リクエスト" }, "SUBJECT_LABEL": "件名", "SUBJECT_PLACEHOLDER": "お問い合わせの件名を入力してください。", @@ -165,7 +165,8 @@ "QR_CODE": "このQRコードをスキャンして、お客様専用の入金アドレスへ入金できます。", "NO_DATA": "利用可能な情報がありません。", "FULL_MESSAGE_LIMIT": "{0}: {1} {2} {3}", - "QR_CODE_TITLE": "{0} 入金情報" + "QR_CODE_TITLE": "{0} 入金情報", + "VIEW_DEPOSIT": "預金を見る" }, "LOGIN": { "LOGIN_TO": "{0}にログイン", @@ -275,7 +276,10 @@ "MOBILE_WALLET_BALANCE_LABEL": "天秤座/東。 USDT", "MOBILE_WALLET_SHARE_LABEL": "%シェア/推定 USDT", "VIEW_MORE_WALLET_INFO": "ウォレットの詳細を見る", - "VIEW_WALLET_TRANSACTION_HISTORY": "ウォレット取引履歴を表示" + "VIEW_WALLET_TRANSACTION_HISTORY": "ウォレット取引履歴を表示", + "ORDERS_HOLD": "{0} {1} があり、{4} 残高に {2} {3} が保留されます", + "OPEN_ORDERS_SINGULAR": "オープン注文", + "VIEW_WALLET": "ウォレットを表示" }, "REQUEST_RESET_PASSWORD": { "TITLE": "パスワードの再設定", @@ -600,7 +604,8 @@ "CANCEL": "キャンセル", "PLACEHOLDER": "ここに入力" } - } + }, + "TITLE_TEXT": "インターフェースのレイアウト、通知設定、ユーザー名、その他のカスタマイズなどの設定を調整して、アカウント設定を修正します。" }, "TRANSACTION_HISTORY": { "TITLE": "履歴", @@ -835,7 +840,9 @@ "ENTER_AMOUNT": "金額を入力します", "REMOVE_TITLE": "タグを削除", "MAX_AMOUNT_WARNING_INFO": "この金額は最大引き出し限度額を超えています。", - "ZERO_BALANCE": "利用可能な残高が十分ではありません。" + "ZERO_BALANCE": "利用可能な残高が十分ではありません。", + "MIN_AMOUNT_WARNING_INFO": "最低引出額は{0}です", + "NEW_ADDRESS": "新しい住所" }, "WALLET_BUTTON_BASE_DEPOSIT": "入金", "WALLET_BUTTON_BASE_WITHDRAW": "出金", @@ -1196,7 +1203,8 @@ "INSUFFICIENT_LABEL": "決済金額が不足", "INSUFFICIENT_INFO_1": "現在、収益は決済に十分ではありません。紹介リンクを使用してさらにメンバーを招待し、未決済の収益が{0} {1}になるまでお待ちください。", "INSUFFICIENT_INFO_2": "1を超える", - "GO_TO_REFERRAL": "紹介へ進む" + "GO_TO_REFERRAL": "紹介へ進む", + "REFER_DESC": "以下のリンクを友達と共有して、彼らの取引で手数料を獲得しましょう" }, "NOT_LOGGEDIN": { "TXT_1": "取引を始めるにはログインしてください。", @@ -1244,7 +1252,11 @@ "CHANGE_7D": "変更(7日間)", "CHANGE_1D": "変更(1日)", "CHART_7D": "チャート(7日間)", - "ASSET": "資産" + "ASSET": "資産", + "PERCENTAGE": "% {0}", + "24H": "24時間", + "TREND_7D": "トレンド7D", + "BUY": "{0} {1} を購入" }, "MARKET_OPTIONS": { "LIST": "リスト", "CARD": "カード" }, "ALL": "すべて", @@ -1412,7 +1424,10 @@ "CONNECT_ERROR": "財布を確認してください", "INSTALL_METAMASK": "Metamask をブラウザにインストールする必要があります: https://metamask.io/download.html", "INSTALL_METAMASK_TITLE": "メタマスクが検出されない", - "INSTALL_METAMASK_DETAILS": { "TITLE": "メタマスクをインストールする", "PROMPT": "メタマスクをブラウザにインストールする必要があります: {0}" } + "INSTALL_METAMASK_DETAILS": { "TITLE": "メタマスクをインストールする", "PROMPT": "メタマスクをブラウザにインストールする必要があります: {0}" }, + "EARN_REWARD": "デジタル資産をステーキングして報酬を獲得", + "DEFI_STAKING": "DeFiステーキング", + "CEFI_STAKING": "CeFiステーキング" }, "UNSTAKE": { "TITLE": "ステークを解除する", @@ -1526,13 +1541,13 @@ "FORFEITURE_OF_EARNINGS_DETAILS_LABEL": "収益の没収", "STAKE_AMOUNT_LABEL": "ステーク金額", "DISCLAIMER_NOTICE": "免責事項:USDで評価される金額が$1,000を超える場合、本人確認が必要です。この金額には収益も含まれており、プラットフォームは追加のユーザー情報提供を要求する権利を留保しています。", - "SETTLEMENT_NOTICE": "決済:引き出し時に24時間の決済期間が適用されます。", + "SETTLEMENT_NOTICE": "{0} ステーキング解除時には 24 時間の決済期間が適用されます。", "CONFIRM_BUTTON": "確認", "STAKE_RULES_NOTICE": "ステークしたら、プールのルールに従うことに同意します。", "I_UNDERSTAND_AGAIN_BUTTON": "再度理解しました", "CONGRATULATIONS_NOTICE": "おめでとうございます!", "EARNINGS_START_NOTICE": "ステークはリワードを獲得し始めます。", - "REVIEW_PROGRESS_LABEL": "アクティブなステークページでステークの進行状況を確認できます。", + "REVIEW_PROGRESS_LABEL": "{0}でステークの進捗状況を確認できます", "TIME_REMAINING_LABEL": "残り時間", "PENALTY_UPON_INITIAL_STAKE_PRINCIPLE_LABEL_2": "初期ステーク原則に対するペナルティ", "FORFEITURE_OF_EARNINGS_LABEL_2": "収益の没収", @@ -1542,7 +1557,26 @@ "VISIT_WALLET_BUTTON": "ウォレットを訪問", "CLOSE_BUTTON": "閉じる", "ACTIVE_STAKES": "アクティブステークス", - "STAKES_HISTORY": "歴史" + "STAKES_HISTORY": "歴史", + "SETTLEMENT_NOTICE_TITLE": "決済:", + "REVIEW_PROGRESS_ACTIVE_LINK": "アクティブステークスページ", + "STAKING": "ステーキング101", + "SLASHING": "斬撃", + "MINIMUM_AMOUNT_ALLOWED": "ステーキングプールの最小許容額は", + "MAXIMUM_AMOUNT_ALLOWED": "ステーキングプールの最大許容額は", + "DAYS": "日数", + "CONFIRM_STAKE_DECS": "さぁ行こう!", + "DO_YOU_UNDERSTAND": "わかりますか?", + "SUCCESSFULLY_STAKED_IN": "ステーキングに成功", + "SUCCESSFULLY_STAKED": "ステーキングに成功しました", + "VIEW_ACTIVE_STAKES": "アクティブなステークを表示", + "REVIEW_AND_UNSTAKE": "レビューとステーク解除", + "NO_REWARD": "受け取る報酬額はありません", + "SUCCESSFULLY_UNSTAKED": "ステーキング解除に成功しました", + "MIN": "分", + "UNSTAKING": "ステーキング解除...", + "UNSTAKED": "ステーク解除", + "TOOLTIP": "あまりにも早くステークを解除した場合に発生するペナルティ。{0}" }, "MOVE_XHT": { "TITLE": "XHTの移動", @@ -1770,7 +1804,13 @@ "ORDERBOOK": "オーダーブック", "NETWORK": "ネットワークブローカーOTC", "BROKER": "ローカルブローカーOTC", - "BROKERAGE": "NA - (仲介)" + "BROKERAGE": "NA - (仲介)", + "LOADING_PRICES": "価格を読み込んでいます...", + "INPUT_LABEL": "資産名またはシンボルを入力してください", + "HIGHLIGHTS": "ハイライト", + "MOBILE_DESC": "取引を開始するには、以下の市場を選択してください。", + "PRICE_24H": "価格/24時間 %", + "CARDS": { "GAINERS": "利益獲得者", "LOSERS": "敗者", "MARKET_CAP": "時価総額", "24H": "{0} 24時間" } }, "HOLLAEX_TOKEN": { "REMOVE_FAVOURITES": "お気に入りから削除", @@ -1816,7 +1856,8 @@ "TAG": "鬼ごっこ:", "DISABLED_DEPOSIT_CONTENT": "入金機能は一時的に利用できません。", "DISABLED_WITHDRAW_CONTENT": "引き出し機能は一時的に利用できません。", - "DEPOSIT_LABEL": "デポジット" + "DEPOSIT_LABEL": "デポジット", + "VOLUME": "音量" }, "ASYNC_LINK": { "TITLE": "ページが自動的に開きませんか?", @@ -1973,7 +2014,8 @@ "WALLET_BALANCE_ESTIMATE": "今日のウォレット残高の推定", "VIEW_BALANCE_HISTORY": "残高履歴を表示", "VIEW_PERCENTAGE_SHARE": "パーセンテージシェアを表示", - "VIEW_WALLET_P&L": "ウォレットの損益を表示" + "VIEW_WALLET_P&L": "ウォレットの損益を表示", + "BALANCE_PERCENTAGE": "残高パーセンテージ" }, "ASSET_INFO": "資産情報", "TAKER_FEES_APPLIED": "テイカー手数料が適用されます", @@ -2122,7 +2164,7 @@ "TOTAL_ASSET_SELL_1": "合計", "TOTAL_ASSET_SELL_2": "売れる", "BUY_ORDER_LIMITS": "購入注文制限", - "MIN_MAX_ORDER_VALUE_1": "最小値と最大値", + "MIN_MAX_ORDER_VALUE_1": "最小値と最大値 {0} {1}", "MIN_MAX_ORDER_VALUE_2": "購入注文金額", "PAYMENT_METHODS_SEND_FIAT": "FIAT送金の支払い方法", "SELECT_PAYMENT_METHODS_1": "選択範囲", @@ -2138,7 +2180,7 @@ "DEAL_EDITED": "取引が編集されました", "DEAL_CREATED": "取引が作成されました", "NEXT": "次", - "ADD_PAYMENT_METHOD_DETAILS": "支払い方法の詳細を追加する", + "ADD_PAYMENT_METHOD_DETAILS": "{0} 支払い方法の詳細", "COMPLETE": "完了", "STEP_SET_TYPE_PRICE": "タイプと価格を設定する", "STEP_SET_TOTAL_AMOUNT_PAYMENT_METHODS": "合計金額と支払い方法を設定する", @@ -2168,6 +2210,400 @@ "ALL_REGION": "全地域", "BUYER_NOT_MADE_THE_PAYMENT": "購入者はまだ支払いを確認していません。", "PRICE_TO_ADVERTISE": "販売広告を出す価格", - "VIEW_PROFILE": "ベンダーのプロフィールを見る" + "VIEW_PROFILE": "ベンダーのプロフィールを見る", + "P2P_METHODS": "P2P支払い方法", + "PAYMENT_METHODS": "お支払い方法", + "PAYMENT_METHODS_DEC": "銀行情報やその他の現地の支払い方法など、個人の支払い口座の詳細を追加することで、暗号通貨を販売し、法定通貨による支払いを受け取ることができます。支払い情報を追加する前に、支払い口座に関連付けられている名前が確認済みの詳細の名前と一致していることを確認してください。", + "SELL_AMOUNT": "販売金額", + "ADD_PAYMENT_METHOD": "+ 支払い方法を追加", + "REMOVE": "取り除く", + "DYNAMIC": "動的", + "TYPE": "タイプ", + "BACK_TO_ORDERS": "注文に", + "FUNDS_TRANSFERRED_USER": "ユーザーは取引を確認し、資金が残高に送金されました。", + "CONFIRM_TRANSFER_USER": "転送を確認してユーザーに通知する", + "BUYER_SENT_FUNDS_USER": "ユーザーに資金を送金したことを通知しました。ユーザーからの応答をお待ちください。", + "VENDOR_CONFIRMED_ORDER_USER": "ユーザーは取引を確認し、資金を解放しました。", + "BUY_UPPER": "買う", + "CRYPTO_WANT_TO_BUY": "購入したい暗号通貨", + "FIAT_CURRENCY_WANT_TO_SPEND": "法定通貨での支払い", + "PRICE_ADVERTISE": "{0} に広告する価格", + "TOTAL_AMOUNT": "合計金額", + "BUY_SELL_DESC": "{0}できます", + "SELL_ORDER_LIMITS": "売り注文制限", + "MIN_MAX_ORDER_VALUE_3": "売り注文額", + "PAYMENT_METHODS_RECEIVE_FIAT": "FIATを受け取るための支払い方法", + "PAYMENT_TIME_LIMIT_LABEL": "支払い期限: {0}", + "30_MINUTES": "30分", + "DELETE_UPPERCASE": "消去", + "CLICK_TO_VIEW": "クリックして見る", + "NEW_MESSAGE": "P2Pメッセージを受信しました", + "STATUS_UPDATE": "P2P注文に関する更新があります", + "APPEAL_STATUS_MESSAGE": "P2P注文は異議申し立てされました", + "CANCEL_STATUS_MESSAGE": "P2P注文はキャンセルされました", + "CONFIRM_STATUS_MESSAGE": "P2P注文が確認されました", + "NEW_ORDER_CREATED": "新しいP2P注文が作成されました", + "CRYPTO_RELEASE_STATUS_MESSAGE": "暗号は命令から解放されました", + "ADDITIONAL_PAYMENT_DETAILS": "追加の支払い詳細を追加する", + "PAYMENT_FIELD_INFO": "この新しい支払いフィールドは追加されており、P2P 参加者の法定通貨送金に役立ちます。これは支払い方法に関連するアカウントの詳細です。これには、支払い方法システムに応じて、電話番号、ユーザー名、一意のアカウント番号、および取引に必要なその他の情報が含まれる場合があります。", + "PAYMENT_DETAIL_NAME": "支払い詳細名", + "REQUIRED_OR_OPTIONAL": "必須またはオプション", + "CREATE_NEW_PAYMENT_METHODS": "新しい支払い方法を作成して追加する", + "MANUAL_PAYMENT_METHOD_ENTRY": "P2P プラットフォームに支払い方法を追加するには、支払い方法の名前と必要な支払いの詳細を入力して手動で追加します。たとえば、PayPal は資金の送受信に電子メール アドレスを使用します。", + "USERS_PAYMENT_SELECTION": "支払い方法が追加されると、P2P 加盟店とユーザーは支払いを行うときや受け取るときにその支払い方法を選択し、必要な情報を入力できるようになります。提供された詳細は、P2P 取引の相手方と共有されます。", + "METHOD_NAME_AND_DETAIL": "支払方法名と主な支払内容", + "ADD_NEW_PAYMENT_METHODS": "新しい支払い方法を選択してください:", + "DETAIL_NAME": "支払い詳細名", + "DETAIL_VALUE": "支払い詳細値", + "DETAIL_REQUIRED": "必須", + "IMPORTANT_DETAIL": "(重要なお支払い詳細)", + "DETAIL_OPTIONAL": "オプション", + "OPTIONAL_DETAIL": "(オプションの支払い詳細)", + "ADD_NEW_PAYMENT_FIELD": "新しい支払い詳細フィールドを追加する", + "PAYMENT_METHOD_CREATED": "支払い方法が作成されました。管理者による確認を待っています", + "PAYMENT_METHOD_DELETED": "支払い方法が削除されました。", + "PAYMENT_METHOD_UPDATED": "支払い方法が更新されました。", + "CRYPTO": "暗号:", + "INPUT_SPEND_AMOUNT": "支出額を入力してください", + "INPUT_SELL_AMOUNT": "販売金額を入力してください", + "TIMES": "回", + "FEEDBACK": "フィードバック", + "ASSET": "資産: ", + "CUSTOM": "カスタム", + "CANCELLED": "キャンセル", + "APPEALED": "控訴", + "EXPIRED": "期限切れ", + "RATE": "レート:", + "BUYING": "{0} を購入", + "SELLING": "{0} を販売中", + "TERMS_AND_CONDITION_DESCRIPTION": "取引開始後15分以内に投稿してください", + "VISIT_OUR_WEBSITE": "当社のウェブサイトをご覧ください", + "SELECT_PAYMENT_SYSTEM_LABEL": "支払いシステムを選択", + "FIELD": "分野", + "NEW_PAYMENT_PLACEHOLDER": "支払い詳細の値を入力してください", + "FIELD_VALIDATION_TEXT": "すべてのメソッドフィールドを入力してください", + "INPUT_METHOD_NAME_TEXT": "メソッド名を入力してください", + "INPUT_PAYMENT_DETAIL_TEXT": "支払い詳細名を入力してください", + "UNVERIFIED": "未確認", + "VERIFIED": "検証済み", + "AMOUNT_RECEIVE": "あなたの残高から解放されます", + "DELETE_WARNING": "この支払い方法を削除してもよろしいですか?", + "STEP_1": "ステップ 1/3", + "STEP_2": "ステップ 2/3", + "STEP_3": "ステップ 3/3", + "P2P_ORDER_CREATED": "P2P注文が作成されました", + "VENDOR_CHECKS_TITLE": "支払いの確認と確定", + "FUND_RELEASED": "資金が解放された", + "ORDER_EXPIRY": "注文期限は", + "MINIMUM_AMOUNT_WARNING": "最小の{0}は{1}です", + "MAXIMUM_AMOUNT_WARNING": "最大の{0}は{1}です", + "ORDER_CREATION": "注文の作成", + "ORDER_CREATION_DESC_1": "「注文を作成」をクリックすると、ベンダーに通知され、正確な支払い振替の詳細とともに即時の価格見積もりが届きます。{0} {1} {2} {3}", + "ORDER_CREATION_DESC_2": "これには、注文を確定するために必要な正確な金額が含まれます。", + "YOU_HAVE_TEXT": "あなたは", + "COMPLETE_PAYMENT_PROCESS": "支払い振替手続きを完了します。", + "WARINNG_DESC": "本当に注文を完了するつもりがある場合のみ、注文作成を続行してください。", + "ORDER_CANCEL_DESC": "注文をキャンセルするとアカウントが停止される可能性があります。", + "CONFIRM_ORDER_CREATION": "{0} の準備ができたら、下の「注文を作成」をクリックしてください。", + "SEND_MONEY": "お金を送る", + "RECEIVE_MONEY": "お金を受け取る", + "CREATE_ORDER": "注文を作成", + "NO_ORDERS_DESC": "ここには注文がないようです。", + "NO_DEALS_DESC": "ここには取引はないようです。", + "ONLINE": "オンライン", + "OFFLINE": "オフライン", + "SELECT_CRYPTO": "暗号通貨を選択", + "REMOVE_WARNING": "この取引を削除してもよろしいですか?", + "SHOW_FILTERS": "フィルターを表示", + "HIDE_FILTERS": "フィルターを非表示", + "ORDERS_COMPLETED": "完了した注文:", + "CANCEL_WARNING_TEXT": "注文を頻繁にキャンセルすると、公開 P2P プロフィールに悪影響が及び、アカウントが停止される可能性がありますのでご注意ください。", + "UPDATE": "アップデート", + "TERMS_ERROR_TEXT": "用語を入力してください", + "RESPONSE_ERROR_TEXT": "回答欄に入力してください" + }, + "CUSTOM_NATIVE_CURRENCY": "通貨(価格と資産価値の見積もり)", + "ADDRESS_BOOK": { + "ADDRESS_BOOK_LABEL": "アドレス帳", + "ADDRESS_BOOK_DESC_1": "ホワイトリストに登録された出金先アドレスを個人のアドレス帳に追加する", + "ADDRESS_BOOK_DESC_2": "出金時にこのアドレスを簡単に利用できるようになります。", + "ADD_ADDRESS_LINK": "住所を追加", + "ADD_WITHDRAW_ADDRESS": "出金アドレスを追加", + "DATE_ADDED": "追加日", + "REMOVE": "取り除く", + "NO_LINK": "出金先アドレスはまだ追加されていません。", + "ADD_WITHDRAW_ADDRESS_DESC_1": "コインを安全に引き出すことができるホワイトリストアドレスを追加します。", + "ADD_WITHDRAW_ADDRESS_DESC_2": "この出金先アドレスは、お客様が管理しているアドレスである必要があります。", + "NAME_YOUR_ADDRESS_TITLE": "住所を入力してください", + "NAME_YOUR_ADDRESS_DESC": "今後の参照用に、この引き出しアドレスに名前を付けてください。", + "USER_LABEL": "名前/ラベル:", + "USER_FIELD_PLACEHOLDER": "この出金アドレスに名前を付ける", + "CHECK_AND_CONFIRM": "確認して確認する", + "WARNING_ADDRESS": "このアドレスをアドレス帳に追加する前に、詳細が正しいことを確認してください。", + "ENSURE_DESC": "アドレスが正しく、管理されていることを確認してください。", + "ADDRESSES": "住所", + "WITHDRAWAL_ADDRESS_BOOK": "退会アドレス帳", + "ADD_ADDRESS_DESC": "{0} に引き出しアドレスを追加する", + "ADDRESS_BOOK": "アドレス帳", + "MANAGE_ADDRESS_BOOK": "アドレス帳を管理する", + "VIEW_ADDRESS_BOOK_LABEL": "アドレス帳を表示", + "ADD_WITHDRAWAL_ADDRESS_LINK": "出金アドレスを追加", + "REVOKE_ADDRESS": "あなたの住所は削除されました", + "REMOVE_ADDRESS": "住所を削除", + "REMOVE_CONTENT": "この出金先アドレスをアドレス帳から削除しますか?" + }, + "VOLUME": { + "VOLUME": "音量", + "BACK": "戻る", + "MARKETS": "市場", + "CONVERT": "変換する", + "HISTORY": "歴史", + "TRADING_VOLUME": "取引量", + "VOLUME_DECS": "さまざまな期間にわたるアカウントの取引額と、各期間に取引された上位 3 つの資産", + "ALL_ASSETS": "すべての資産", + "DAY_VOLUME": "一日の取引量", + "HOUR_VOLUME": "24時間ボリューム", + "TOP": "トップ {0} {1}", + "VOL_ASSET": "D ボリューム 資産", + "NO_DATA_DESC_1": "まだ取引を行っていないようです。今すぐ取引を開始して、ここでアクティビティを確認してください。", + "NO_DATA_DESC_2": "取引を始める", + "NO_DATA_DESC_3": "ここであなたのアクティビティを見てみましょう!", + "TRADE_VOLUME": "取引量", + "VIEW_VOLUME": "ボリュームを見る", + "TRADE_DESCRIPTION": "最も取引されている資産を表示する", + "MARKET_TABLE_DESC": "取引量ページにアクセスしてください {0}" + }, + "MORE_OPTIONS_LABEL": { + "MORE_OPTION_SEARCH_TXT": "検索機能またはページ", + "NO_RESULT_DESC_1": "これに対する結果はないようです。", + "NO_RESULT_DESC_2": "別のキーワードで検索してみてください。", + "ICONS": { + "REFERRALS": "紹介", + "BUY_CRYPTO": "暗号通貨を購入する", + "API": "翻訳", + "DEFI_STAKE": "Defiステーク", + "CEFI_STAKE": "セフィステーク", + "PROFIT_LOSS": "損益", + "LIMITS": "制限", + "LOGINS": "ログイン", + "AUDIO": "オーディオ" + }, + "HOT_FUNCTION": { + "HOT_FUNCTION_LABEL": "注目の機能", + "ADD_FUNDS": "資金を追加", + "TOP_UP": "トップアップ", + "LOAD": "負荷", + "CREDIT": "クレジット", + "FUND_ACCOUNT": "ファンド口座", + "BTC": "ビットコイン", + "USTD": "米ドル", + "ETH": "eth", + "USD": "米ドル", + "XHT": "xht", + "TRANSFER": "移行", + "MONEY": "お金", + "FUNDING": "資金調達", + "RECHARGE": "充電する", + "REFILL": "詰め替え", + "CASH_IN": "現金化する", + "ADD_MONEY": "お金を追加する", + "EXCHANGE": "交換", + "SWAP": "スワップ", + "BUY_SELL": "購入/販売", + "TRADE": "貿易", + "CONVERT_CURRENCY": "通貨を変換", + "INVITE": "招待する", + "REFER": "参照する", + "REWARDS": "報酬", + "BONUS": "ボーナス", + "AFFILIATION": "所属", + "AFFILIATE": "アフィリエイト", + "PASSIVE_INCOME": "受動的収入", + "REVENUE": "収益" + }, + "OTHER_FUNCTIONS": { + "OTHER_FUNCTIONS_LABEL": "その他の機能", + "INTEGRATION": "統合", + "PROGRAMMATIC_ACCESS": "プログラムによるアクセス", + "DEVELOPER": "開発者", + "AUTOMATED_TRADING": "自動取引", + "BOT": "ボット", + "ALGO": "何か", + "ALGORITHM": "アルゴリズム", + "FIAT": "法定通貨", + "DOLLAR": "ドル", + "PURCHASE": "購入", + "BUY_COIN": "コインを購入", + "BUY_TOKEN": "トークンを購入", + "YIELD": "収率", + "INTEREST": "興味", + "REVENUE": "収益", + "CENTRALIZED_STAKING": "集中型ステーキング", + "PERFORMANCE": "パフォーマンス", + "GAINS": "利益", + "LOSSES": "損失", + "PORTFOLIO_PROFIT": "ポートフォリオ利益", + "LOSS": "損失", + "PNL": "お願いします", + "CHARGES": "料金", + "COSTS": "費用", + "COMMISSION": "手数料", + "TRADING_FEES": "取引手数料", + "TRANSACTION_FEES": "取引手数料", + "RESTRICTIONS": "制限", + "BOUNDARIES": "境界", + "CAPS": "キャップ", + "MAXIMUM": "最大", + "WITHDRAWAL_LIMITS": "出金限度額", + "STORAGE": "ストレージ", + "FUNDS": "資金", + "BALANCE": "バランス", + "CRYPTO_WALLET": "暗号通貨ウォレット", + "MY": "私の", + "ENGLISH": "英語", + "LOCALIZATION": "ローカリゼーション", + "TRANSLATE": "翻訳する", + "LANGUAGE_SETTINGS": "言語設定", + "MULTILINGUAL": "多言語", + "LANGUAGE_PREFERENCE": "言語設定", + "TEXT": "文章", + "WORD": "言葉", + "PEER_TO_PEER": "ピアツーピア", + "DIRECT_TRADE": "直接取引", + "USER_TO_USER": "ユーザー対ユーザー", + "PRIVATE_TRADE": "民間貿易", + "TRANSACTIONS": "取引", + "ACTIVITY": "活動", + "RECORD": "記録", + "LOG": "ログ", + "TRANSACTION_HISTORY": "取引履歴", + "LIQUIDITY": "流動性", + "MARKET_VOLUME": "市場規模", + "TRADING_ACTIVITY": "取引活動", + "MARKETS": "市場", + "CRYPTO": "暗号", + "TWO_FACTOR_AUTHENTICATION": "2要素認証", + "MFA": "修士", + "AUTHENTICATOR": "認証子", + "OTP": "OTTP", + "CREDENTIALS": "資格", + "PASSWORD_RESET": "パスワードのリセット", + "SIGN_INS": "サインイン", + "ACCOUNT_ACCESS": "アカウントアクセス", + "SESSION_HISTORY": "セッション履歴", + "LOGGED_IN": "ログイン", + "SESSION_MANAGEMENT": "セッション管理", + "CURRENT_SESSIONS": "現在のセッション", + "BANKING_DETAILS": "銀行口座情報", + "BANK_ACCOUNT": "銀行口座", + "FINANCIAL_INSTITUTION": "金融機関", + "BANK_INFO": "銀行情報", + "WITHDRAWAL_ACCOUNT": "出金口座", + "FUND": "基金", + "SOUND": "音", + "AUDIO_SETTINGS": "オーディオ設定", + "ALERTS": "アラート", + "NOTIFICATIONS": "通知", + "AUDIO_ALERTS": "音声アラート", + "SECURITY": "安全", + "CONTACT": "接触", + "EMAIL_ADDRESS": "電子メールアドレス", + "MAIL": "郵便", + "EMAIL_CONTACT": "電子メールでのお問い合わせ", + "KYC": "kyc", + "SMS": "SMS", + "KYC_CAPS": "本人確認", + "ID": "ID", + "PERSONAL_INFO": "個人情報", + "IDENTITY_CHECK": "本人確認", + "PAYOUT": "支払い", + "CASH_OUT": "キャッシュアウト", + "REMOVE_FUNDS": "資金の削除", + "OUT": "外", + "SUPPORT": "サポート", + "CONTACT_LOWER": "接触", + "EMAIL_LOWER": "メール", + "RESOURCE": "リソース", + "GUIDES": "ガイド", + "FAQ": "よくある質問", + "CUSTOMER_SERVICE": "顧客サービス", + "ASSISTANCE": "援助", + "API_LOWER": "アピ", + "MESSAGE": "メッセージ", + "LIVE_CHAT": "ライブチャット", + "SETTINGS": "設定", + "ALERT": "警告", + "UPDATES": "アップデート", + "REMINDERS": "リマインダー", + "UI": "インターフェース", + "USER_INTERFACE": "ユーザーインターフェース", + "LAYOUT": "レイアウト", + "DESIGN": "デザイン", + "DASHBOARD": "ダッシュボード", + "COLOR_THEME": "カラーテーマ", + "ORDER_BOOK": "注文書", + "DARK": "暗い", + "LIGHT": "ライト", + "WITHDRAWAL_ADDRESSES": "引き出し先住所", + "CRYPTO_ADDRESSES": "暗号アドレス", + "WALLET_ADDRESSES": "ウォレットアドレス", + "SAVED_ADDRESSES": "保存されたアドレス", + "ADDRESS_BOOK": "アドレス帳", + "WHITE_LISTED": "ホワイトリスト" + } + }, + "CONNECTIONS": { + "CHECK_CONNECTION": "接続を確認する", + "IP": "IP", + "NORMAL_TEXT": "普通", + "CONNECTION_ISSUE": "接続の問題", + "SESSION": "セッション", + "SERVER_TIME": "サーバー時間", + "PING": "ピン", + "CHECK_PING": "PINGをチェック", + "RECONNECT": "再接続", + "TOOLTIP_DESC_1": "Exchange サーバー {0} への ping を確認してください", + "TOOLTIP_DESC_2": "'ms'が低いほど良い", + "LOGGED_IN_AT": "ログイン", + "RECONNECT_DESC": "再接続すると、発生している不明な問題が解決される可能性があります。", + "CONFIRM_RECONNECT_MESSAGE": "再接続しますか?", + "PING_CHECK_TEXT": "サーバーにpingを実行しています。しばらくお待ちください...", + "RECHECK_PING": "PINGを再確認", + "FAST": "速い", + "SLOW": "遅い", + "MS": "{0} ミリ秒", + "STATUS_NORMAL": "接続正常", + "CONNECTION_LABEL": "繋がり", + "CONNECTION_ISSUE_DETECTED": "接続の問題が検出されました" + }, + "DESKTOP_NAVIGATION": { + "OTHERS": "その他", + "SUMMARY_DESCRIPTION": "アカウントレベルの情報とアクセシビリティ", + "FEES_LIMITS_DESC": "取引手数料と出金手数料。口座限度額", + "VOLUME_DESC": "取引量の推移の概要", + "DEPOSIT_DESC": "ウォレット入金資金調達オプションにアクセスする", + "BALANCE_DESC": "すべての資産とその残高", + "PERFORMANCE_DESC": "ウォレットの損益", + "HISTORY_DESC": "すべての取引、入金、出金を確認する", + "ADDRESS_BOOK_DESC": "引き出し用の連絡先アドレス帳", + "WITHDRAW_DESC": "ウォレットの引き出しと送金", + "ASSETS_DESC": "価格を追跡し、資産データを発見する", + "CONVERT_DESC": "資産を他の資産と簡単に交換", + "MARKET_DESC": "現物取引のオーダーブック市場。", + "P2P_DESC": "暗号通貨取引", + "REFERRAL_DESC": "友達を招待して受動的な収入を得る", + "CEFI_STAKE_DESC": "取引所のウォレットから資産をステークする", + "DEFI_STAKE_DESC": "ウォレットを接続して資産をステークする", + "BUY_CRYPTO_DESC": "銀行振込またはカードで購入", + "SECURITY_DESC": "アカウントの2FA、パスワード、API", + "VERIFICATION_DESC": "アカウント本人確認", + "SETTINGS_DESC": "インターフェースとその他のアカウント設定", + "SUMMARY_PAGE": "概要ページ", + "SIGNOUT_DESC": "アカウントログアウト", + "LANGUAGE_DESC": "言語設定を変更する", + "API_DESC": "APIキーを使用してプログラムでアカウントにアクセスする", + "HELP_DESC": "ヘルプが必要な場合は、サポートにお問い合わせください。", + "TRANSACTION_DESC": "すべての取引、入金、出金を確認する", + "ONRAMPER_DESC": "Onramperを使用して暗号通貨を売買する" } } \ No newline at end of file diff --git a/web/src/config/lang/ko.json b/web/src/config/lang/ko.json index 0d015e5680..7525f7f189 100644 --- a/web/src/config/lang/ko.json +++ b/web/src/config/lang/ko.json @@ -129,7 +129,7 @@ "OPTION_BUG": "오류 보고", "OPTION_PERSONAL_INFO": "개인정보 변경", "OPTION_BANK_TRANSFER": "은행송금", - "OPTION_REQUEST": "HollaEx Exchange 초대요청" + "OPTION_REQUEST": "Exchange 초대요청" }, "SUBJECT_LABEL": "문의 제목", "SUBJECT_PLACEHOLDER": "문의 제목을 작성하여 주시기바랍니다.", @@ -155,7 +155,8 @@ "QR_CODE": "회원님에게 할당된 입금 전용주소로 입금을 위해 이 QR 코드를 스캔하실 수 있습니다.", "NO_DATA": "이용가능한 정보가 없습니다.", "FULL_MESSAGE_LIMIT": "{0}: {1} {2} {3}", - "QR_CODE_TITLE": "{0} 입금 정보" + "QR_CODE_TITLE": "{0} 입금 정보", + "VIEW_DEPOSIT": "보증금 보기" }, "LOGIN": { "LOGIN_TO": "{0} 로그인", @@ -265,7 +266,10 @@ "MOBILE_WALLET_BALANCE_LABEL": "천칭자리/동쪽. USDT", "MOBILE_WALLET_SHARE_LABEL": "%주/추정. USDT", "VIEW_MORE_WALLET_INFO": "더 많은 지갑 정보 보기", - "VIEW_WALLET_TRANSACTION_HISTORY": "지갑 거래 내역 보기" + "VIEW_WALLET_TRANSACTION_HISTORY": "지갑 거래 내역 보기", + "ORDERS_HOLD": "{0} {1}이(가) 있어 {4} 잔액에 {2} {3}이(가) 보류되었습니다.", + "OPEN_ORDERS_SINGULAR": "오픈 오더", + "VIEW_WALLET": "지갑보기" }, "REQUEST_RESET_PASSWORD": { "TITLE": "비밀번호 재설정", @@ -592,7 +596,8 @@ "CANCEL": "취소", "PLACEHOLDER": "여기에 입력하세요" } - } + }, + "TITLE_TEXT": "인터페이스 레이아웃, 알림 기본 설정, 사용자 이름 및 기타 사용자 지정과 같은 기본 설정을 조정하여 계정 설정을 수정합니다." }, "TRANSACTION_HISTORY": { "TITLE": "나의 거래 히스토리", @@ -749,13 +754,13 @@ "FORFEITURE_OF_EARNINGS_DETAILS_LABEL": "수익 몰수", "STAKE_AMOUNT_LABEL": "스테이크 금액", "DISCLAIMER_NOTICE": "면책 사항: USD로 평가되는 금액이 $1,000을 초과하는 경우 ID 확인을 완료해야 합니다. 이 금액에는 수익도 포함되며, 플랫폼은 추가 사용자 정보 제공을 요청할 권리를 갖습니다.", - "SETTLEMENT_NOTICE": "결제: 인출 시 24시간의 결제 기간이 적용됩니다.", + "SETTLEMENT_NOTICE": "{0} 스테이킹 해제 시 24시간 정산 기간이 적용됩니다.", "CONFIRM_BUTTON": "확인", "STAKE_RULES_NOTICE": "스테이크한 순간부터 풀의 규칙을 준수하게 됩니다.", "I_UNDERSTAND_AGAIN_BUTTON": "다시 이해했습니다", "CONGRATULATIONS_NOTICE": "축하합니다!", "EARNINGS_START_NOTICE": "스테이크가 리워드를 시작합니다.", - "REVIEW_PROGRESS_LABEL": "활성 스테이크 페이지에서 스테이크 진행 상황을 확인할 수 있습니다.", + "REVIEW_PROGRESS_LABEL": "{0}에서 지분 진행 상황을 검토할 수 있습니다.", "TIME_REMAINING_LABEL": "남은 시간", "PENALTY_UPON_INITIAL_STAKE_PRINCIPLE_LABEL_2": "초기 스테이크 원칙에 따른 벌금", "FORFEITURE_OF_EARNINGS_LABEL_2": "수익 몰수", @@ -765,7 +770,26 @@ "VISIT_WALLET_BUTTON": "지갑 방문", "CLOSE_BUTTON": "닫기", "ACTIVE_STAKES": "활성 스테이크", - "STAKES_HISTORY": "역사" + "STAKES_HISTORY": "역사", + "SETTLEMENT_NOTICE_TITLE": "합의:", + "REVIEW_PROGRESS_ACTIVE_LINK": "활성 스테이크 페이지", + "STAKING": "스테이킹 101", + "SLASHING": "날카로운", + "MINIMUM_AMOUNT_ALLOWED": "스테이킹 풀의 최소 허용 금액은 다음과 같습니다.", + "MAXIMUM_AMOUNT_ALLOWED": "스테이킹 풀의 최대 허용 금액은 다음과 같습니다.", + "DAYS": "날", + "CONFIRM_STAKE_DECS": "시작합니다!", + "DO_YOU_UNDERSTAND": "이해했나요?", + "SUCCESSFULLY_STAKED_IN": "성공적으로 지분을 확보했습니다", + "SUCCESSFULLY_STAKED": "성공적으로 스테이킹되었습니다", + "VIEW_ACTIVE_STAKES": "활성 스테이크 보기", + "REVIEW_AND_UNSTAKE": "검토 및 스테이크 해제", + "NO_REWARD": "받을 보상금액이 없습니다", + "SUCCESSFULLY_UNSTAKED": "성공적으로 스테이킹 해제되었습니다.", + "MIN": "최소", + "UNSTAKING": "언스테이킹...", + "UNSTAKED": "언스테이크", + "TOOLTIP": "너무 일찍 스테이킹을 해제할 경우 부과되는 패널티입니다. {0}" }, "CURRENCY": "Currency", "TYPE": "Type", @@ -873,7 +897,9 @@ "ENTER_AMOUNT": "금액을 입력하세요", "REMOVE_TITLE": "태그 제거", "MAX_AMOUNT_WARNING_INFO": "이 금액은 최대 인출 한도를 초과합니다.", - "ZERO_BALANCE": "사용 가능한 잔액이 충분하지 않습니다." + "ZERO_BALANCE": "사용 가능한 잔액이 충분하지 않습니다.", + "MIN_AMOUNT_WARNING_INFO": "최소 출금 금액은 {0}입니다.", + "NEW_ADDRESS": "새 주소" }, "WALLET_BUTTON_BASE_DEPOSIT": "입금", "WALLET_BUTTON_BASE_WITHDRAW": "출금", @@ -1235,7 +1261,8 @@ "INSUFFICIENT_LABEL": "정산금액 부족", "INSUFFICIENT_INFO_1": "귀하의 수입은 현재 정산하기에 부족합니다. 추천 링크를 사용하여 더 많은 회원을 초대하고 수입이 정산되지 않을 때까지 기다려 주세요. {0} {1}", "INSUFFICIENT_INFO_2": "1을 초과하다", - "GO_TO_REFERRAL": "추천으로 이동" + "GO_TO_REFERRAL": "추천으로 이동", + "REFER_DESC": "아래 링크를 친구와 공유하여 거래 수수료를 받으세요." }, "NOT_LOGGEDIN": { "TXT_1": "로그인이 필요합니다", @@ -1295,7 +1322,11 @@ "TRADING_SYMBOL": "거래 기호", "ASSET": "유산", "TYPE": "유형", - "SOURCE": "원천" + "SOURCE": "원천", + "PERCENTAGE": "% {0}", + "24H": "24시간", + "TREND_7D": "트렌드 7D", + "BUY": "{0} {1} 구매" }, "MARKET_OPTIONS": { "LIST": "리스트", "CARD": "카드" }, "LIMITS_BLOCK": { @@ -1453,7 +1484,10 @@ "COMPLETED_TOOLTIP": "스테이크가 성숙해졌습니다. 계속 스테이킹하여 더 많은 보상을 얻거나 스테이킹을 해제하여 보상을 받으세요.", "CONNECT_ERROR": "지갑을 확인해 주세요", "INSTALL_METAMASK_DETAILS": { "TITLE": "메타마스크 설치", "PROMPT": "브라우저에 Metamask를 설치해야 합니다: {0}" }, - "INSTALL_METAMASK_TITLE": "메타마스크가 감지되지 않음" + "INSTALL_METAMASK_TITLE": "메타마스크가 감지되지 않음", + "EARN_REWARD": "디지털 자산을 스테이킹하고 보상을 받으세요", + "DEFI_STAKING": "DeFi 스테이킹", + "CEFI_STAKING": "CeFi 스테이킹" }, "UNSTAKE": { "TITLE": "언스테이크", @@ -1804,7 +1838,8 @@ "WALLET_BALANCE_ESTIMATE": "오늘의 지갑 잔액 추정 ", "VIEW_BALANCE_HISTORY": "잔액 내역 보기", "VIEW_PERCENTAGE_SHARE": "백분율 점유율 보기", - "VIEW_WALLET_P&L": "월렛 손익 보기" + "VIEW_WALLET_P&L": "월렛 손익 보기", + "BALANCE_PERCENTAGE": "잔액 비율" }, "ASSET_INFO": "자산 정보", "TAKER_FEES_APPLIED": "테이커 수수료가 적용됩니다.", @@ -1822,7 +1857,13 @@ "ORDERBOOK": "주문장", "NETWORK": "네트워크 브로커 OTC", "BROKER": "지역 브로커 OTC", - "BROKERAGE": "NA - (중개)" + "BROKERAGE": "NA - (중개)", + "LOADING_PRICES": "가격을 로딩하는 중...", + "INPUT_LABEL": "자산 이름 또는 기호를 입력하세요", + "HIGHLIGHTS": "하이라이트", + "MOBILE_DESC": "거래를 시작하려면 아래 시장을 선택하세요.", + "PRICE_24H": "가격/24시간 %", + "CARDS": { "GAINERS": "게이너", "LOSERS": "패배자들", "MARKET_CAP": "시가총액", "24H": "{0} 24시간" } }, "HOLLAEX_TOKEN": { "REMOVE_FAVOURITES": "즐겨찾기에서 제거", @@ -1868,7 +1909,8 @@ "TAG": "꼬리표:", "DISABLED_DEPOSIT_CONTENT": "일시적으로 입금 기능을 사용할 수 없습니다.", "DISABLED_WITHDRAW_CONTENT": "출금 기능을 일시적으로 사용할 수 없습니다.", - "DEPOSIT_LABEL": "보증금" + "DEPOSIT_LABEL": "보증금", + "VOLUME": "용량" }, "ASYNC_LINK": { "TITLE": "페이지가 자동으로 열리지 않나요?", @@ -2118,7 +2160,7 @@ "TOTAL_ASSET_SELL_1": "총", "TOTAL_ASSET_SELL_2": "당신은 팔 수 있습니다", "BUY_ORDER_LIMITS": "구매 주문 한도", - "MIN_MAX_ORDER_VALUE_1": "최소 및 최대", + "MIN_MAX_ORDER_VALUE_1": "최소 및 최대 {0} {1}", "MIN_MAX_ORDER_VALUE_2": "주문 금액 구매", "PAYMENT_METHODS_SEND_FIAT": "명목화폐를 보내는 결제 방법", "SELECT_PAYMENT_METHODS_1": "최대 선택", @@ -2134,7 +2176,7 @@ "DEAL_EDITED": "거래가 수정되었습니다.", "DEAL_CREATED": "거래가 생성되었습니다.", "NEXT": "다음", - "ADD_PAYMENT_METHOD_DETAILS": "결제 수단 세부정보 추가", + "ADD_PAYMENT_METHOD_DETAILS": "{0} 결제 방법 세부 정보", "COMPLETE": "완벽한", "STEP_SET_TYPE_PRICE": "종류와 가격을 설정하세요", "STEP_SET_TOTAL_AMOUNT_PAYMENT_METHODS": "총액 및 결제수단 설정", @@ -2164,6 +2206,400 @@ "ALL_REGION": "모든 지역", "BUYER_NOT_MADE_THE_PAYMENT": "구매자가 아직 결제를 확인하지 않았습니다.", "PRICE_TO_ADVERTISE": "판매하기 위해 광고할 가격", - "VIEW_PROFILE": "공급업체 프로필 보기" + "VIEW_PROFILE": "공급업체 프로필 보기", + "P2P_METHODS": "P2P 결제 방법", + "PAYMENT_METHODS": "결제 방법", + "PAYMENT_METHODS_DEC": "은행 정보나 다른 현지 결제 수단과 같은 개인 결제 계좌 정보를 추가하여 암호화폐를 판매하고 법정 통화로 결제를 받을 수 있습니다. 결제 정보를 추가하기 전에 결제 계좌와 연결된 이름이 확인된 세부 정보에 있는 이름과 일치하는지 확인하세요.", + "SELL_AMOUNT": "판매 금액", + "ADD_PAYMENT_METHOD": "+ 결제수단 추가", + "REMOVE": "제거하다", + "DYNAMIC": "동적", + "TYPE": "유형", + "BACK_TO_ORDERS": "주문에", + "FUNDS_TRANSFERRED_USER": "사용자가 거래를 확인하였고 자금이 귀하의 잔액으로 이체되었습니다.", + "CONFIRM_TRANSFER_USER": "이전 확인 및 사용자에게 알림", + "BUYER_SENT_FUNDS_USER": "사용자에게 자금을 보냈다는 신호를 보냈습니다. 사용자로부터 응답을 기다려 주세요.", + "VENDOR_CONFIRMED_ORDER_USER": "사용자가 거래를 확인하고 자금을 출금했습니다.", + "BUY_UPPER": "구입하다", + "CRYPTO_WANT_TO_BUY": "구매하고 싶은 암호화폐", + "FIAT_CURRENCY_WANT_TO_SPEND": "사용할 법정화폐", + "PRICE_ADVERTISE": "광고할 가격 {0}", + "TOTAL_AMOUNT": "총액", + "BUY_SELL_DESC": "{0} 할 수 있습니다", + "SELL_ORDER_LIMITS": "판매 주문 한도", + "MIN_MAX_ORDER_VALUE_3": "판매 주문 가치", + "PAYMENT_METHODS_RECEIVE_FIAT": "FIAT를 받기 위한 지불 방법", + "PAYMENT_TIME_LIMIT_LABEL": "결제기간 : {0}", + "30_MINUTES": "30분", + "DELETE_UPPERCASE": "삭제", + "CLICK_TO_VIEW": "클릭하여 보기", + "NEW_MESSAGE": "P2P 메시지를 받았습니다.", + "STATUS_UPDATE": "P2P 주문에 대한 업데이트가 있습니다.", + "APPEAL_STATUS_MESSAGE": "귀하의 P2P 주문에 대한 항소가 접수되었습니다.", + "CANCEL_STATUS_MESSAGE": "귀하의 P2P 주문이 취소되었습니다.", + "CONFIRM_STATUS_MESSAGE": "귀하의 P2P 주문이 확인되었습니다.", + "NEW_ORDER_CREATED": "새로운 P2P 주문이 생성되었습니다.", + "CRYPTO_RELEASE_STATUS_MESSAGE": "Crypto가 주문에서 해제되었습니다.", + "ADDITIONAL_PAYMENT_DETAILS": "추가 결제 세부 정보 추가", + "PAYMENT_FIELD_INFO": "이 새로운 결제 필드는 추가적이며 P2P 참여자가 법정 통화를 이체하는 데 도움이 됩니다. 이는 결제 방법과 관련된 계정 세부 정보여야 합니다. 여기에는 전화번호, 사용자 이름, 고유 계좌 번호 및 결제 방법 시스템에 따라 거래에 필요한 기타 정보가 포함될 수 있습니다.", + "PAYMENT_DETAIL_NAME": "결제 세부 정보 이름", + "REQUIRED_OR_OPTIONAL": "필수 또는 선택 사항", + "CREATE_NEW_PAYMENT_METHODS": "새로운 결제 방법을 만들고 추가하세요", + "MANUAL_PAYMENT_METHOD_ENTRY": "P2P 플랫폼에 결제 수단을 추가하려면 결제 수단 이름과 필요한 결제 세부 정보를 입력하여 수동으로 추가할 수 있습니다. 예를 들어, PayPal은 이메일 주소를 사용하여 자금을 보내고 받습니다.", + "USERS_PAYMENT_SELECTION": "결제 방법이 추가되면 P2P 상인과 사용자는 결제를 하거나 받을 때 해당 결제 방법을 선택하고 필요한 정보를 입력할 수 있습니다. 그들이 제공하는 세부 정보는 P2P 거래에서 다른 당사자와 공유됩니다.", + "METHOD_NAME_AND_DETAIL": "결제수단명 및 주요 결제내역", + "ADD_NEW_PAYMENT_METHODS": "새로운 결제 방법을 선택하세요 :", + "DETAIL_NAME": "결제 세부 정보 이름", + "DETAIL_VALUE": "결제 세부 정보 값", + "DETAIL_REQUIRED": "필수의", + "IMPORTANT_DETAIL": "(중요 결제 세부 사항)", + "DETAIL_OPTIONAL": "선택 과목", + "OPTIONAL_DETAIL": "(선택적 결제 세부 정보)", + "ADD_NEW_PAYMENT_FIELD": "새로운 결제 세부 정보 필드 추가", + "PAYMENT_METHOD_CREATED": "결제 수단이 생성되었습니다! 관리자의 확인을 기다리는 중", + "PAYMENT_METHOD_DELETED": "결제 방법이 삭제되었습니다.", + "PAYMENT_METHOD_UPDATED": "결제 방법이 업데이트되었습니다.", + "CRYPTO": "암호화:", + "INPUT_SPEND_AMOUNT": "지출 금액을 입력하세요", + "INPUT_SELL_AMOUNT": "판매금액을 입력하세요", + "TIMES": "타임스", + "FEEDBACK": "피드백", + "ASSET": "자산:", + "CUSTOM": "관습", + "CANCELLED": "취소", + "APPEALED": "항소했다", + "EXPIRED": "만료됨", + "RATE": "비율:", + "BUYING": "{0} 구매", + "SELLING": "판매 {0}", + "TERMS_AND_CONDITION_DESCRIPTION": "거래가 성사된 후 15분 이내에 게시해 주세요.", + "VISIT_OUR_WEBSITE": "저희 웹사이트를 방문하세요", + "SELECT_PAYMENT_SYSTEM_LABEL": "결제 시스템을 선택하세요", + "FIELD": "필드", + "NEW_PAYMENT_PLACEHOLDER": "결제내역 값을 입력하세요", + "FIELD_VALIDATION_TEXT": "모든 방법 필드를 입력하세요", + "INPUT_METHOD_NAME_TEXT": "방법 이름을 입력하세요", + "INPUT_PAYMENT_DETAIL_TEXT": "결제 세부 정보 이름을 입력하세요", + "UNVERIFIED": "검증되지 않음", + "VERIFIED": "검증됨", + "AMOUNT_RECEIVE": "잔액에서 해제됩니다", + "DELETE_WARNING": "이 결제 방법을 삭제하시겠습니까?", + "STEP_1": "1/3 단계", + "STEP_2": "2/3단계", + "STEP_3": "3/3 단계", + "P2P_ORDER_CREATED": "P2P 주문 생성됨", + "VENDOR_CHECKS_TITLE": "결제 확인 및 확인", + "FUND_RELEASED": "자금이 출금됨", + "ORDER_EXPIRY": "주문 만료", + "MINIMUM_AMOUNT_WARNING": "최소값 {0}은 {1}입니다.", + "MAXIMUM_AMOUNT_WARNING": "최대 {0}은 {1}입니다.", + "ORDER_CREATION": "주문 생성", + "ORDER_CREATION_DESC_1": "'주문 생성'을 클릭하면 공급업체에 알리고 정확한 지불 이체 세부 정보와 함께 즉시 가격 견적을 받게 됩니다. {0} {1} {2} {3}", + "ORDER_CREATION_DESC_2": "여기에는 주문을 마무리하는 데 필요한 정확한 금액이 포함됩니다.", + "YOU_HAVE_TEXT": "당신은 가질 것이다", + "COMPLETE_PAYMENT_PROCESS": "결제 이체 과정을 완료하세요.", + "WARINNG_DESC": "주문을 완료할 의향이 있는 경우에만 주문 생성을 계속 진행하세요.", + "ORDER_CANCEL_DESC": "주문을 취소하면 계정이 정지될 수 있습니다.", + "CONFIRM_ORDER_CREATION": "{0} 준비가 되면 아래 '주문 만들기'를 클릭하세요.", + "SEND_MONEY": "돈을 보내다", + "RECEIVE_MONEY": "돈을 받다", + "CREATE_ORDER": "주문 생성", + "NO_ORDERS_DESC": "여기에는 주문이 없는 것 같습니다.", + "NO_DEALS_DESC": "여기에는 거래가 없는 것 같습니다.", + "ONLINE": "온라인", + "OFFLINE": "오프라인", + "SELECT_CRYPTO": "암호화폐 선택", + "REMOVE_WARNING": "이 거래를 제거하시겠습니까?", + "SHOW_FILTERS": "필터 표시", + "HIDE_FILTERS": "필터 숨기기", + "ORDERS_COMPLETED": "완료된 주문:", + "CANCEL_WARNING_TEXT": "주문을 자주 취소하면 공개 P2P 프로필에 부정적인 영향을 미칠 수 있으며 계정이 정지될 수 있습니다.", + "UPDATE": "업데이트", + "TERMS_ERROR_TEXT": "용어를 입력해 주세요", + "RESPONSE_ERROR_TEXT": "응답 필드를 입력하세요" + }, + "CUSTOM_NATIVE_CURRENCY": "통화(가격 및 자산 가치 추정)", + "ADDRESS_BOOK": { + "ADDRESS_BOOK_LABEL": "주소록", + "ADDRESS_BOOK_DESC_1": "개인 주소록에 허용 목록에 있는 출금 주소를 추가하세요", + "ADDRESS_BOOK_DESC_2": "출금 시 이 주소를 쉽게 사용할 수 있습니다.", + "ADD_ADDRESS_LINK": "주소 추가", + "ADD_WITHDRAW_ADDRESS": "출금 주소 추가", + "DATE_ADDED": "추가된 날짜", + "REMOVE": "제거하다", + "NO_LINK": "아직 출금 주소가 추가되지 않았습니다.", + "ADD_WITHDRAW_ADDRESS_DESC_1": "안전하게 코인을 출금할 수 있는 허용 주소를 추가하세요.", + "ADD_WITHDRAW_ADDRESS_DESC_2": "이 출금 주소는 귀하가 통제할 수 있는 주소여야 합니다.", + "NAME_YOUR_ADDRESS_TITLE": "주소를 적어주세요", + "NAME_YOUR_ADDRESS_DESC": "나중에 참고할 수 있도록 이 출금 주소에 이름을 지정하세요.", + "USER_LABEL": "이름/레이블:", + "USER_FIELD_PLACEHOLDER": "이 출금 주소를 지정하세요", + "CHECK_AND_CONFIRM": "확인 및 확인", + "WARNING_ADDRESS": "이 주소를 주소록에 추가하기 전에 시간을 내어 세부 정보가 올바른지 확인하세요.", + "ENSURE_DESC": "주소가 정확하고 귀하가 통제하고 있는지 확인하세요.", + "ADDRESSES": "구애", + "WITHDRAWAL_ADDRESS_BOOK": "출금주소록", + "ADD_ADDRESS_DESC": "{0}에 출금 주소를 추가하세요", + "ADDRESS_BOOK": "주소록", + "MANAGE_ADDRESS_BOOK": "주소록 관리", + "VIEW_ADDRESS_BOOK_LABEL": "주소록 보기", + "ADD_WITHDRAWAL_ADDRESS_LINK": "출금 주소 추가", + "REVOKE_ADDRESS": "귀하의 주소가 제거되었습니다", + "REMOVE_ADDRESS": "주소 제거", + "REMOVE_CONTENT": "이 출금 주소를 주소록에서 제거하시겠습니까?" + }, + "VOLUME": { + "VOLUME": "용량", + "BACK": "뒤쪽에", + "MARKETS": "시장", + "CONVERT": "전환하다", + "HISTORY": "역사", + "TRADING_VOLUME": "거래량", + "VOLUME_DECS": "각 기간 동안 거래된 상위 3개 자산과 함께 다양한 기간 동안 계정에서 거래된 금액", + "ALL_ASSETS": "모든 자산", + "DAY_VOLUME": "일 볼륨", + "HOUR_VOLUME": "24시간 볼륨", + "TOP": "상위 {0} {1}", + "VOL_ASSET": "D VOL.자산", + "NO_DATA_DESC_1": "아직 거래를 하지 않은 것 같습니다. 지금 거래를 시작하여 여기에서 활동을 확인하세요!", + "NO_DATA_DESC_2": "거래 시작", + "NO_DATA_DESC_3": "이제 여기서 여러분의 활동을 확인하세요!", + "TRADE_VOLUME": "거래량", + "VIEW_VOLUME": "볼륨 보기", + "TRADE_DESCRIPTION": "가장 많이 거래된 자산을 확인하세요", + "MARKET_TABLE_DESC": "거래량 페이지 {0}를 방문하세요" + }, + "MORE_OPTIONS_LABEL": { + "MORE_OPTION_SEARCH_TXT": "기능 또는 페이지 검색", + "NO_RESULT_DESC_1": "이에 대한 결과가 없는 것 같습니다.", + "NO_RESULT_DESC_2": "다른 키워드로 검색해 보세요.", + "ICONS": { + "REFERRALS": "추천", + "BUY_CRYPTO": "암호화폐를 구매하세요", + "API": "API", + "DEFI_STAKE": "디파이 스테이크", + "CEFI_STAKE": "세피 스테이크", + "PROFIT_LOSS": "손익계산서", + "LIMITS": "제한", + "LOGINS": "로그인", + "AUDIO": "오디오" + }, + "HOT_FUNCTION": { + "HOT_FUNCTION_LABEL": "핫 기능", + "ADD_FUNDS": "자금 추가", + "TOP_UP": "탑업", + "LOAD": "짐", + "CREDIT": "신용 거래", + "FUND_ACCOUNT": "자금 계정", + "BTC": "비트코인", + "USTD": "usdt", + "ETH": "이더리움", + "USD": "미국 달러", + "XHT": "xht", + "TRANSFER": "옮기다", + "MONEY": "돈", + "FUNDING": "자금 조달", + "RECHARGE": "재충전하다", + "REFILL": "다시 메우다", + "CASH_IN": "현금으로 환전하다", + "ADD_MONEY": "돈을 추가하다", + "EXCHANGE": "교환", + "SWAP": "교환", + "BUY_SELL": "매수/매도", + "TRADE": "거래", + "CONVERT_CURRENCY": "화폐 변환", + "INVITE": "초대하다", + "REFER": "나타내다", + "REWARDS": "보상", + "BONUS": "보너스", + "AFFILIATION": "입회", + "AFFILIATE": "제휴하다", + "PASSIVE_INCOME": "수동소득", + "REVENUE": "수익" + }, + "OTHER_FUNCTIONS": { + "OTHER_FUNCTIONS_LABEL": "기타 기능", + "INTEGRATION": "완성", + "PROGRAMMATIC_ACCESS": "프로그래밍 방식 액세스", + "DEVELOPER": "개발자", + "AUTOMATED_TRADING": "자동화된 거래", + "BOT": "봇", + "ALGO": "무엇", + "ALGORITHM": "연산", + "FIAT": "명령", + "DOLLAR": "달러", + "PURCHASE": "구입", + "BUY_COIN": "코인 구매", + "BUY_TOKEN": "토큰 구매", + "YIELD": "생산하다", + "INTEREST": "관심", + "REVENUE": "수익", + "CENTRALIZED_STAKING": "중앙집중식 스테이킹", + "PERFORMANCE": "성능", + "GAINS": "이득", + "LOSSES": "사상자 수", + "PORTFOLIO_PROFIT": "포트폴리오 이익", + "LOSS": "손실", + "PNL": "pl", + "CHARGES": "요금", + "COSTS": "소송 비용", + "COMMISSION": "수수료", + "TRADING_FEES": "거래 수수료", + "TRANSACTION_FEES": "거래 수수료", + "RESTRICTIONS": "제한", + "BOUNDARIES": "경계", + "CAPS": "캡", + "MAXIMUM": "최고", + "WITHDRAWAL_LIMITS": "출금 한도", + "STORAGE": "저장", + "FUNDS": "자금", + "BALANCE": "균형", + "CRYPTO_WALLET": "암호화폐 지갑", + "MY": "나의", + "ENGLISH": "영어", + "LOCALIZATION": "현지화", + "TRANSLATE": "번역하다", + "LANGUAGE_SETTINGS": "언어 설정", + "MULTILINGUAL": "다국어", + "LANGUAGE_PREFERENCE": "언어 선호도", + "TEXT": "텍스트", + "WORD": "단어", + "PEER_TO_PEER": "피어 투 피어", + "DIRECT_TRADE": "직접 거래", + "USER_TO_USER": "사용자 대 사용자", + "PRIVATE_TRADE": "사적 무역", + "TRANSACTIONS": "업무", + "ACTIVITY": "활동", + "RECORD": "기록", + "LOG": "통나무", + "TRANSACTION_HISTORY": "거래 내역", + "LIQUIDITY": "유동성", + "MARKET_VOLUME": "시장 규모", + "TRADING_ACTIVITY": "거래 활동", + "MARKETS": "시장", + "CRYPTO": "암호", + "TWO_FACTOR_AUTHENTICATION": "2단계 인증", + "MFA": "외국어학당", + "AUTHENTICATOR": "인증자", + "OTP": "오티피", + "CREDENTIALS": "신임장", + "PASSWORD_RESET": "비밀번호 재설정", + "SIGN_INS": "로그인", + "ACCOUNT_ACCESS": "계정 접근", + "SESSION_HISTORY": "세션 기록", + "LOGGED_IN": "로그인됨", + "SESSION_MANAGEMENT": "세션 관리", + "CURRENT_SESSIONS": "현재 세션", + "BANKING_DETAILS": "은행 세부 정보", + "BANK_ACCOUNT": "은행 계좌", + "FINANCIAL_INSTITUTION": "금융기관", + "BANK_INFO": "은행 정보", + "WITHDRAWAL_ACCOUNT": "출금계좌", + "FUND": "축적", + "SOUND": "소리", + "AUDIO_SETTINGS": "오디오 설정", + "ALERTS": "알림", + "NOTIFICATIONS": "알림", + "AUDIO_ALERTS": "오디오 알림", + "SECURITY": "보안", + "CONTACT": "연락하다", + "EMAIL_ADDRESS": "이메일 주소", + "MAIL": "우편", + "EMAIL_CONTACT": "이메일 연락처", + "KYC": "KYC(고객센터)", + "SMS": "문자 메시지", + "KYC_CAPS": "고객확인(KYC)", + "ID": "ID", + "PERSONAL_INFO": "개인 정보", + "IDENTITY_CHECK": "신원 확인", + "PAYOUT": "지불금", + "CASH_OUT": "현금화", + "REMOVE_FUNDS": "자금 제거", + "OUT": "밖으로", + "SUPPORT": "지원하다", + "CONTACT_LOWER": "연락하다", + "EMAIL_LOWER": "이메일", + "RESOURCE": "자원", + "GUIDES": "가이드", + "FAQ": "자주 묻는 질문", + "CUSTOMER_SERVICE": "고객 서비스", + "ASSISTANCE": "보조", + "API_LOWER": "아피", + "MESSAGE": "메시지", + "LIVE_CHAT": "라이브 채팅", + "SETTINGS": "설정", + "ALERT": "알리다", + "UPDATES": "업데이트", + "REMINDERS": "알림", + "UI": "사용자 인터페이스", + "USER_INTERFACE": "사용자 인터페이스", + "LAYOUT": "공들여 나열한 것", + "DESIGN": "설계", + "DASHBOARD": "계기반", + "COLOR_THEME": "색상 테마", + "ORDER_BOOK": "주문서", + "DARK": "어두운", + "LIGHT": "빛", + "WITHDRAWAL_ADDRESSES": "출금 주소", + "CRYPTO_ADDRESSES": "암호화 주소", + "WALLET_ADDRESSES": "지갑 주소", + "SAVED_ADDRESSES": "저장된 주소", + "ADDRESS_BOOK": "주소록", + "WHITE_LISTED": "화이트리스트" + } + }, + "CONNECTIONS": { + "CHECK_CONNECTION": "연결 확인", + "IP": "아이피(IP)", + "NORMAL_TEXT": "정상", + "CONNECTION_ISSUE": "연결 문제", + "SESSION": "세션", + "SERVER_TIME": "서버 시간", + "PING": "핑", + "CHECK_PING": "핑 확인", + "RECONNECT": "다시 연결", + "TOOLTIP_DESC_1": "Exchange 서버 {0}에 대한 ping을 확인하세요.", + "TOOLTIP_DESC_2": "'ms'가 낮을수록 좋습니다", + "LOGGED_IN_AT": "에 로그인했습니다", + "RECONNECT_DESC": "다시 연결하면 현재 발생한 알 수 없는 문제가 해결될 수도 있습니다.", + "CONFIRM_RECONNECT_MESSAGE": "다시 연결하시겠습니까?", + "PING_CHECK_TEXT": "서버를 ping하는 중입니다. 잠시만 기다려 주세요...", + "RECHECK_PING": "PING 재확인", + "FAST": "빠른", + "SLOW": "느린", + "MS": "{0}밀리초", + "STATUS_NORMAL": "연결 정상", + "CONNECTION_LABEL": "연결", + "CONNECTION_ISSUE_DETECTED": "연결 문제가 감지되었습니다" + }, + "DESKTOP_NAVIGATION": { + "OTHERS": "기타", + "SUMMARY_DESCRIPTION": "계정 수준 정보 및 접근성", + "FEES_LIMITS_DESC": "거래 및 출금 수수료. 계좌 한도", + "VOLUME_DESC": "시간별 거래량 요약", + "DEPOSIT_DESC": "지갑 입금 자금 조달 옵션에 액세스하세요", + "BALANCE_DESC": "귀하의 모든 자산과 잔액", + "PERFORMANCE_DESC": "지갑의 손익", + "HISTORY_DESC": "모든 거래, 입금 및 출금을 검토하세요", + "ADDRESS_BOOK_DESC": "인출을 위한 연락처 주소록", + "WITHDRAW_DESC": "지갑 출금 및 이체", + "ASSETS_DESC": "가격을 추적하고 자산 데이터를 발견하세요", + "CONVERT_DESC": "간단히 다른 자산으로 교환하세요", + "MARKET_DESC": "현물 거래 주문장 시장.", + "P2P_DESC": "암호화폐 거래", + "REFERRAL_DESC": "친구를 초대하여 수동 소득을 얻으세요", + "CEFI_STAKE_DESC": "거래소 지갑에서 자산을 스테이킹하세요", + "DEFI_STAKE_DESC": "지갑을 연결하고 자산을 스테이킹하세요", + "BUY_CRYPTO_DESC": "은행 직접 송금 또는 카드로 구매", + "SECURITY_DESC": "계정 2FA, 비밀번호 및 API", + "VERIFICATION_DESC": "계정 신원 확인", + "SETTINGS_DESC": "인터페이스 및 기타 계정 설정", + "SUMMARY_PAGE": "요약 페이지", + "SIGNOUT_DESC": "계정 로그아웃", + "LANGUAGE_DESC": "언어 환경 설정 변경", + "API_DESC": "API 키를 사용하여 프로그래밍 방식으로 계정에 액세스하세요", + "HELP_DESC": "도움말 받기. 지원 연락처", + "TRANSACTION_DESC": "모든 거래, 입금 및 출금을 검토하세요", + "ONRAMPER_DESC": "Onramper를 사용하여 암호화폐를 사고 파세요" } } \ No newline at end of file diff --git a/web/src/config/lang/mn.json b/web/src/config/lang/mn.json index 2c6471d4fd..fa3c4cc4a7 100644 --- a/web/src/config/lang/mn.json +++ b/web/src/config/lang/mn.json @@ -274,12 +274,12 @@ "TEXT_1": "Та и-мэйл хаягаа амжилттай баталгаажууллаа.", "TEXT_2": "Та одоо системд нэвтрэх боломжтой", "CANCEL_BUTTON": "ХААХ", - "CONFIRM_BUTTON": "БАТАЛГАА СИГН АП", - "CONFIRM_TEXT": "Баталгаа сигн ап", - "CONFIRM_DESCRIPTION": "Та таны данс бүртгэлээ баталгаажуулахын тулд доорх товчлуур дээр дарна уу" + "CONFIRM_BUTTON": "БАТЛАХ", + "CONFIRM_TEXT": "Батлах", + "CONFIRM_DESCRIPTION": "Та бүртгэлээ баталгаажуулахын тулд доорх товчлуур дээр дарна уу" }, "USER_VERIFICATION": { - "INFO_TXT": "Энэ хэсэгт та баталгаажуулалт болон бүртгэл шинэчлэх хэсгийг харж болно.", + "INFO_TXT": "Энэ хэсэгт та баталгаажуулалт хийх болон бүртгэлээ шинэчлэх боломжтой", "INFO_TXT_1": "Доорх хэсэг тус бүрд шаардлагатай холбогдох мэдээллийг оруулна уу. Зөвхөн бүх хэсгүүдийг бөглөж дууссаны дараа таны мэдээллийг хянаж, бүртгэл шинэчлэлтийг зөвшөөрөх болно.", "COMPLETED": "Дууссан", "PENDING_VERIFICATION": "Баталгаажуулалт хүлээгдэж байна", @@ -720,7 +720,7 @@ "SLASHING_TEXT_2": "Бүх орлогыг хураана", "REVIEW_NOTE": "Блокчэйний блокуудын цагаар хэмжигддэг тул та стэйк хийх болон стэйк цуцлахдаа дээрх мэдээллийг сайн нягтална уу. Хугацаанаас өмнө стэйкинг цуцлавал хуримтлагдсан өгөөж цуцлагдах болно", "WAITING_TITLE": "Баталгаажуулахыг хүлээж байна", - "WAITING_TEXT": "Энэ гүйлгээг түрийвчэндээ баталгаажуулна уу", + "WAITING_TEXT": "Энэ гүйлгээг Хэтэвчэндээ баталгаажуулна уу", "PENDING_TEXT": "Гүйлгээ хүлээгдэж байна...", "CHECKING_ALLOWANCE": "{0} тэтгэмжийг шалгаж байна...", "WAITING_PROMPT": "{0} {1} {2}", @@ -872,32 +872,32 @@ "I_UNDERSTAND_BUTTON": "Би мэдэхгүй", "AMOUNT_TO_STAKE_LABEL": "Стейкийн үнийн хэмжээ", "NEXT_BUTTON": "Дараах", - "LOCKUP_DURATION_LABEL": "Цооногийн хугацаа", + "LOCKUP_DURATION_LABEL": "Түгжих хугацаа", "PENALTY_UPON_INITIAL_STAKE_PRINCIPLE": "Эхлэх стейкийн төлбөр", "FORFEITURE_OF_EARNINGS_LABEL": "Орлого муутай байна", "SLASHING_RULES_ENFORCED_LABEL": "! Энэ пулд хэрэглэгчийг хураах дүрмүүд хэрэгжүүлдэг", "SLASHING_RULES_NOTICE": "Тодорхой хугацаанд өөрийн хөрөнгийг гаргахыг сонгох хувьд өмнө нь тодорхойлогдсон хэрэглэгчийн үнийг төлбөр болгохын дагуу зарцуулах шаардлагатайгаар тухайсаар магадгүй нөлөөтэй. Стейкийн хугацаа тодорхойлохоор өмнө хөрөнгийн ашиглалтын асуудлыг танилцуулж үзэх нь маш мэдрэгч байдаг тул та энэ нь баталгаажуулахыг анхаарна уу.", "UNSTAKE_ANYTIME_LABEL": "Энэ пул нь танд үйлдэлгүйгээр хөрөнгө оруулах боломжийг олгодог.", "FULL_DURATION_LOCK_LABEL": "Энэ пул нь танд цооногийн хугацаандаа хөрөнгө оруулах боломжгүй болно. Хугацаа төгсгөх өмнө таны санхүүгийн урт хэмжээг хүлээж үзэхийг зөвлөж болно.", - "CHECK_STAKE_DETAILS_BUTTON": "Стейкийн дэлгэрэнгүй мэдээлэл харах", - "STAKING_POOL_LABEL": "Стейкийн пул", + "CHECK_STAKE_DETAILS_BUTTON": "Стейкийн мэдээлэл", + "STAKING_POOL_LABEL": "Стейк сан", "ANNUAL_PERCENTAGE_YIELD_LABEL": "Жилийн хувь", "PENALTY_UPON_INITIAL_STAKE_PRINCIPLE_LABEL": "Эхлэх стейкийн төлбөр", "FORFEITURE_OF_EARNINGS_DETAILS_LABEL": "Орлого муутай байна", "STAKE_AMOUNT_LABEL": "Стейкийн хэмжээ", - "DISCLAIMER_NOTICE": "Зарчим: $1,000-с илүү үнийн утга нь ID баталгаажуулалттай болно. Энэ үнийг орлогоны хамт $1,000-тай тооцдог ба платформ нь нэмэлт хэрэглэгчийн мэдээллийг хүссэн тохиолдолд алдагдуулж болохыг хадгалдаг.", - "SETTLEMENT_NOTICE": "Төлбөр болгохдаа 24 цаг хугацаа авдаг.", + "DISCLAIMER_NOTICE": "Зарчим: $1,000 USDT-с илүү хэмжээний стэйкинг хийх тохиолдолд заавал бичиг баримт баталгаажуулалт хийсэн байх шаардлагатай.", + "SETTLEMENT_NOTICE": "Стэйкинг дуусгахад 24 цаг шаардлагата.", "CONFIRM_BUTTON": "Баталгаажуулах", "STAKE_RULES_NOTICE": "Та нэгдмэл хийгдсэний дараа тань тухайн пулийн дүрмийг дагдан гарах гэж байна.", - "I_UNDERSTAND_AGAIN_BUTTON": "Би мэдэхгүй", + "I_UNDERSTAND_AGAIN_BUTTON": "БИ ОЙЛГОЖ БАЙНА", "CONGRATULATIONS_NOTICE": "Баяр хүргэе!", "EARNINGS_START_NOTICE": "Таны стейк явагдаж эхлэнэ.", - "REVIEW_PROGRESS_LABEL": "Та Тухайн пулийн явцын мэдээллийг Дууссан Стейктэй хуудсанд харах боломжтой.", - "TIME_REMAINING_LABEL": "Үлдсэн цаг", + "REVIEW_PROGRESS_LABEL": "Та {0} хэсгийн өөрийн стэйкингээ хянах боломжтой", + "TIME_REMAINING_LABEL": "Үлдсэн хугацаа", "PENALTY_UPON_INITIAL_STAKE_PRINCIPLE_LABEL_2": "Эхлэх стейкийн төлбөр", "FORFEITURE_OF_EARNINGS_LABEL_2": "Орлого муутай байна", "AMOUNT_TO_RECEIVE_LABEL": "Өгөх дүн", - "REQUIRES_24H_TO_SETTLE_NOTICE": "Төлбөр болгохдаа 24 цаг хугацаа авдаг.", + "REQUIRES_24H_TO_SETTLE_NOTICE": "Стэйкинг дуусгахад 24 цаг шаардлагатай.", "SUCCESSFUL_UNSTAKE_NOTICE": "Та амжилттай стейкэд гарсан байна", "VISIT_WALLET_BUTTON": "Цахим газар дамжуулах", "CLOSE_BUTTON": "Хаах", @@ -922,11 +922,11 @@ "TYPE": "Төрөл", "TYPES_VALUES": { "market": "market", "limit": "limit" }, "TYPES": { "MARKET": "market", "LIMIT": "limit" }, - "SIDE": "Side", + "SIDE": "Тал", "SIDES_VALUES": { "buy": "авах", "sell": "зарах" }, "SIDES_VERBS": { "buy": "авсан", "sell": "зарсан" }, "SIDES": { "BUY": "авах", "SELL": "зарах" }, - "DEFAULT_TOGGLE_OPTIONS": { "ON": "асаалттай", "OFF": "унтарсан" }, + "DEFAULT_TOGGLE_OPTIONS": { "ON": "ON", "OFF": "OFF" }, "SIZE": "Хэмжээ", "PRICE": "Ханш", "FEE": "Шимтгэл", @@ -982,7 +982,7 @@ "WITHDRAWALS_FORM_DESTINATION_TAG_WARNING": "Хүлээн авах хаяганд tag шаардлагатай эсэхийг шалгана уу. Tag -г зарим тохиолдолд Memo, digital ID, label, note гэж нэрлэдэг.", "WITHDRAWALS_FORM_NETWORK_PLACEHOLDER": "Сүлжээ сонгох", "WITHDRAWALS_FORM_ADDRESS_LABEL": "Хүлээн авах хаяг", - "WITHDRAWALS_FORM_ADDRESS_PLACEHOLDER": "Түрийвчний хаягийг оруулна уу", + "WITHDRAWALS_FORM_ADDRESS_PLACEHOLDER": "Хэтэвчний хаягийг оруулна уу", "WITHDRAWALS_FORM_DESTINATION_TAG_LABEL": "Хүлээн авах tag оруулна уу", "WITHDRAWALS_FORM_MEMO_LABEL": "Memo (заавал биш)", "WITHDRAWALS_FORM_DESTINATION_TAG_PLACEHOLDER": "Хүлээн авах tag (заавал биш)", @@ -1022,20 +1022,20 @@ "WITHDRAWAL_CONFIRM_BUTTON": "ЗАРЛУУЛАХ БАТАЛГАА", "WITHDRAW": "Татаж авах", "REMOVE_TAG_NOTE_1": "Та шошгыг (мөн санамж, Дижитал ID, Шошго, Тэмдэглэл гэгддэг) устгах сонголтыг хийсэн.", - "REMOVE_TAG_NOTE_2": "Ихэнх бирж, түрийвч болон бусад платформууд нь Tag шаарддаг. {0} {1}", + "REMOVE_TAG_NOTE_2": "Ихэнх бирж, Хэтэвч болон бусад платформууд нь Tag шаарддаг. {0} {1}", "REMOVE_TAG_NOTE_3": "Дахин шалгана уу", "REMOVE_TAG_NOTE_4": "шошгонд тавигдах шаардлага.", "BACK_BTN": "БУЦАХ", - "REMOVE_TAG": "ТИЙМ, ШАГНЫГ УСТГАХ", - "GENERATE_DEPOSIT_TEXT_1": "Хадгаламжийн хаяг илрээгүй", - "GENERATE_DEPOSIT_TEXT_2": "Доор нэгийг үүсгэнэ үү:", - "WITHDRAW_ADDRESS": "Татгалзах хаяг", - "WITHDRAW_EMAIL_ADDRESS": "Татгалзах имэйл", + "REMOVE_TAG": "ТИЙМ, УСТГАХ", + "GENERATE_DEPOSIT_TEXT_1": "Орлого хийх хаяг байхгүй байна", + "GENERATE_DEPOSIT_TEXT_2": "Доор дарж шинээр үүсгэнэ үү:", + "WITHDRAW_ADDRESS": "Хүлээн авах хаяг", + "WITHDRAW_EMAIL_ADDRESS": "Хүлээн авах имэйл", "WARNING": "Анхааруулга", - "WARNING_DEPOSIT_INFO_1": "Энэ барьцааг авахын тулд хаяг болон шошго хоёулаа шаардлагатай.", - "WARNING_DEPOSIT_INFO_2": "Дэлгэрэнгүй мэдээллийг буруу оруулах нь санхүүгийн байнгын алдагдал эсвэл ихээхэн саатал гарахад хүргэдэг.", - "WARNING_WITHDRAW_INFO_1": "Энэ хөрөнгийг буцаан авахдаа шаардлагатай бүх талбарыг зөв бөглөсөн эсэхийг шалгаарай.", - "WARNING_WITHDRAW_INFO_2": "Буруу дэлгэрэнгүй мэдээлэл нь санхүүгийн байнгын алдагдал эсвэл ихээхэн саатал гаргахад хүргэдэг.", + "WARNING_DEPOSIT_INFO_1": "Энэ орлогыг авахын тулд хаяг болон TAG хоёулаа шаардлагатай.", + "WARNING_DEPOSIT_INFO_2": "Та хаягаа сайтар шалгана уу. Алдаатай оруулснаар гарах аливаа эрсдэлийн ВХҮҮ хариуцахгүй", + "WARNING_WITHDRAW_INFO_1": "Та мэдээллээ зөв оруулсан эсэхээ сайтар нягтлаарай.", + "WARNING_WITHDRAW_INFO_2": "Та хаягаа сайтар шалгана уу. Алдаатай оруулснаар гарах аливаа эрсдэлийн ВХҮҮ хариуцахгүй.", "METHOD_FIELD_LABEL": "Аргыг сонгоно уу", "SELECT": "Сонго", "ENTER_AMOUNT": "Дүн оруулна уу", @@ -1133,20 +1133,20 @@ "SECRET_KEY": "Нууц түлхүүр", "ACCESS": "Хандалт", "BASIC_ACCESS": "үндсэн хандалт", - "BASIC_ACCESS_PROMPT": "үндсэн хандалт", - "READING_ACCESS": "Унших (Хэтэвчний үлдэгдэл гэх мэт)", - "TRADING_ACCESS": "Арилжаа", + "BASIC_ACCESS_PROMPT": "API key -н хандалтын эрхийг сонгоно уу", + "READING_ACCESS": "Харах (Хэтэвчний үлдэгдэл гэх мэт)", + "TRADING_ACCESS": "Арилжаа хийх", "IP_ACCESS": "IP хандалт", - "IP_ACCESS_PROMPT": "Энэ API түлхүүрээр ямар IP хаяг ажиллахыг тохируулна уу.", - "ANY_IP_ADDRESS": "Аливаа IP хаяг", - "ONLY_TRUSTED_IPS": "Зөвхөн итгэмжлэгдсэн IP", + "IP_ACCESS_PROMPT": "Энэ API түлхүүрээр ямар IP хаягнаас хандахыг тохируулна уу.", + "ANY_IP_ADDRESS": "Дурын IP хаяг", + "ONLY_TRUSTED_IPS": "Зөвхөн сонгосон IP", "ADD_IP_PH": "IP хаягаа оруулна уу. Та олон IP нэмж болно", "ADD_IP": "Нэмэх", "ADVANCED_ACCESS": "Нарийвчилсан хандалт", "ADVANCED_ACCESS_PROMPT": "Итгэмжлэгдсэн IP-г идэвхжүүлэх шаардлагатай.", "WITHDRAWAL_ACCESS": "Зарлага", "SAVE": "Хадгалах", - "BEWARE": "Та зарлага хийхдээ хянамгаа байна уу!" + "BEWARE": "Та зарлагын эрхийг олгох өндөр эрсдэлтэйг анхаарна уу!" }, "DEVELOPERS_TOKENS_POPUP": { "GENERATE_TITLE": "API Түлхүүр үүсгэх", @@ -1178,7 +1178,7 @@ "HIDE_IMAGE": "Зураг нуух", "CHAT_MESSAGE_BOX_PLACEHOLDER": "Мессеж", "TROLLBOX": "Дотоод чат ({0})", - "SET_USERNAME": "ХЭРЭГЛЭГЧИЙН НЭРИЙГ ЧАТАНД ТОХИРУУЛАХ" + "SET_USERNAME": "ЧАТАНД АШИГЛАХ НЭР" }, "INVALID_USERNAME": "Хэрэглэгчийн нэр 3-15 тэмдэгтийн урттай байх ёстой. Зөвхөн жижиг үсэг, тоо, доогуур зураасыг агуулна", "USERNAME_TAKEN": "Энэ нэр бүртгэлтэй байна.", @@ -1281,7 +1281,7 @@ "VIEW_VERIFICATION": "баталгаажуулалтыг үзэх", "EARN_COMMISSION": "Комисс авах", "ID_VERIFICATION": "ID баталгаажуулалт:", - "WALLET_FUNDING": "Түрийвчний санхүүжилт", + "WALLET_FUNDING": "Орлого", "MAKE_A_DEPOSIT": "Хадгаламж хийх" }, "REFERRAL_LINK": { @@ -1331,7 +1331,7 @@ "REFERRAL_CODE": "Лавлах код / холбоос:", "EXAMPLE": "Жишээ:", "NO_SPECIAL": "(Тусгай тэмдэгт болон зай байхгүй)", - "NEXT": "ДАРААЧИЙН", + "NEXT": "ҮРГЭЛЖЛҮҮЛЭХ", "EARNING_DISCOUNT": "Орлого ба хөнгөлөлтийн хувь", "DESCRIPTION": "Лавлах холбоос дээрээ хөнгөлөлт нэмж орлогоо хуваалцаарай. Энэ хөнгөлөлтийг таны санал болгосон найзуудын арилжааны хураамжид хэрэглэнэ.", "DISCOUNT_RATION": "Хөнгөлөлтийн харьцаа:", @@ -1553,7 +1553,7 @@ "ASSETS": "Хөрөнгө", "CURRENCY_WALLET": { "BACK": "Буцах", - "WALLET_PAGE": "{0} түрийвчний хуудас руу", + "WALLET_PAGE": "{0} хэтэвч рүү", "LEARN_MORE": "Нэмэлт мэдээлэл авах {0}", "ABOUT": "тухай", "TOTAL_BALANCE": "Нийт үлдэгдэл: {0} {1}", @@ -1562,7 +1562,7 @@ "EARN_BY": "{0} {1} гэхэд олох", "STAKING": "бооцоо тавих", "TOOLTIP": "Үлдэгдэл хүлээгдэж буй төлөвт ороогүй эсвэл арилжаанд түгжигдсэн (нээлттэй захиалга)", - "WALLET_HAS_BALANCE_PERCENTAGE": "Таны түрийвч одоогоор ямар ч {0} агуулаагүй байна.", + "WALLET_HAS_BALANCE_PERCENTAGE": "Таны хэтэвчинд одоогоор {0} байхгүй байна.", "WALLET_DEPOSIT": "Та {0} байршуулах эсвэл {1} худалдаж авах боломжтой" }, "DEPOSIT_FORM_MIN_WARNING": "Зөвхөн {0} {1} ба түүнээс дээш хэмжээний орлого хүлээн авна. Энэ хамгийн бага босго хэмжээнээс доогуур орлого нь байнгын мөнгө алдахад хүргэдэг.", @@ -1593,49 +1593,49 @@ "UNDERSTAND_RISK_MSG": "Тийм ээ, би эрсдэлийг ойлгож байна" }, "DUST": { - "TITLE": "Түрийвч тоос сорогч", - "LINK": "Түрийвч тоос сорогч", - "TOOLTIP": "Жижиг түрийвчний үлдэгдлийг (тоос) крипто болгон хөрвүүлээрэй", + "TITLE": "Бага дүн хөрвүүлэгч", + "LINK": "Бага дүн хөрвүүлэгч", + "TOOLTIP": "Хэтэвчний бага үлдэгдлийг (тоос) крипто болгон хөрвүүлээрэй", "BACK_PLACEHOLDER": "{0} {1}", - "BACK_TO_WALLET": "миний түрийвч рүү", + "BACK_TO_WALLET": "буцах", "BACK": "Буцах", "ESTIMATED_TOTAL": "Тооцоолсон нийт тоосны үнэ цэнэ", "CONVERT_ALL": "хөрвүүлэх", - "NO_DUST": "Тоос шороо байхгүй!", + "NO_DUST": "Тоос байхгүй!", "SECTION": { - "TITLE": "Түрийвчний тоосыг хөрвүүлэх", - "TEXT_1": "{0} {1} буюу түүнээс бага утгатай түрийвчний бүх үлдэгдлийг хөрвүүлнэ.", - "TEXT_2": "Бүх харилцан яриаг {0} ({1}) дотор шийдвэрлэх болно." + "TITLE": "Бага дүнг хөрвүүлэх", + "TEXT_1": "{0} {1} буюу түүнээс бага дүнтэй бүх үлдэгдлийг хөрвүүлнэ.", + "TEXT_2": "Бүх хэлцэл {0} ({1}) дотор шийдвэрлэх болно." }, "CONFIRMATION": { "TITLE": "Тоосыг хөрвүүлэх", "SUBTITLE": "Хөрвүүлж байгаа хөрөнгө", "BACK": "буцаж", "CONFIRM": "батлах", - "GET": "Та авах болно", + "GET": "Таны авах дүн", "FEE": "Хөрвүүлэх хураамж", - "PLEASE": "Тэмдэглэнэ үү", + "PLEASE": "Анхаар", "NOTE": "Та 24 цаг тутамд тоосыг {0} болгон хувиргах боломжтой. Зөвхөн {1} {2}-с доош үнэлэгдсэн үлдэгдлийг хөрвүүлнэ." }, "SUCCESSFUL": { "TITLE": "Тоосжилт амжилттай боллоо!", - "TEXT": "Та хүлээн авлаа", - "VIEW_HISTORY": "түүхийг үзэх", + "TEXT": "Таны хүлээн авсан дүн", + "VIEW_HISTORY": "түүх үзэх", "CLOSE": "хаах" } }, "PROFIT_LOSS": { "BACK": "Буцах", "BACK_TO_WALLET": "буцах", - "WALLET_PERFORMANCE_TITLE": "Гүйцэтгэлийг графиъ", + "WALLET_PERFORMANCE_TITLE": "Гүйцэтгэлийн график", "WALLET_PERFORMANCE_DESCRIPTION": "Таны хэтэвчний үлдэгдлийн гүйцэтгэл болон хөрөнгийн задаргаа. Доорх огноонууд дээр дарж тухайн өдрийн гүйцэтгэлийг харна уу.", "PL_7_DAY": "7 өдрийн P&L", "EST_TOTAL_BALANCE": "Барагцаа үлдэгдэл баланс", "WEEK": "долоо хоног", "MONTH": "сар", "MONTHS": "сар", - "WALLET_BALANCE": "Түрийвчний үлдэгдлийн задаргаа", - "WALLET_BALANCE_DESCRIPTION_1": "Доорх нь түрийвчний задаргаа юм", + "WALLET_BALANCE": "Хэтэвчний үлдэгдлийн задаргаа", + "WALLET_BALANCE_DESCRIPTION_1": "Доорх нь Хэтэвчний задаргаа", "WALLET_BALANCE_DESCRIPTION_2": "Доорх хүснэгтийг шинэчлэхийн тулд дээрх график дээр дарна уу.", "DATE_SELECT": "Огноо сонгоно уу", "ASSET_NAME": "Хөрөнгийн нэр", @@ -1652,26 +1652,26 @@ "VIEW_MORE": "Илүү ихийг үзэх {0}", "SHOW_ASSET_BREAKDOWN": "Хөрөнгийн задаргааг харуулах", "PL_SUMMARY": "P&L хураангуй", - "BALANCE_HISTORY": "Тэнцвэрийн түүх", + "BALANCE_HISTORY": "Баланс түүх", "DAY": "өдөр", "PERCENTAGE": "Хувь", - "WALLET_BALANCE_ESTIMATE": "Өнөөдрийн хэтэвчний үлдэгдлийн тооцоо ", - "VIEW_BALANCE_HISTORY": "ТЭНЦЛИЙН ТҮҮХИЙГ ҮЗЭХ", - "VIEW_PERCENTAGE_SHARE": "ХУВЬЦААНЫ ХУВИЙГ ХАРАХ", - "VIEW_WALLET_P&L": "WALLET P&L-г ҮЗЭХ" + "WALLET_BALANCE_ESTIMATE": "Өнөөдрийн хэтэвчний үлдэгдлийн баланс ", + "VIEW_BALANCE_HISTORY": "БАЛАНС ТҮҮХ", + "VIEW_PERCENTAGE_SHARE": "ХУВЬ ХЭМЖЭЭ", + "VIEW_WALLET_P&L": "ХЭТЭВЧ P&L" }, "ASSET_INFO": "Хөрөнгийн мэдээлэл", - "TAKER_FEES_APPLIED": "Хүлээн авагчийн хураамж авдаг", + "TAKER_FEES_APPLIED": "Taker хураамж бодогдсон", "ASSET_INFO_PAGE": "Хөрөнгийн мэдээллийн хуудас", "DIGITAL_ASSETS": { "DIGITAL_ASSETS_TITLE": "виртуал хөрөнгө", "GO_BACK": "Буцах", - "ASSETS_INFO": "Доорх платформ дээрх боломжтой хөрөнгийг доор харуулав.", - "ASSETS_INFO_DETAIL": "Дэлгэрэнгүй үзэхийн тулд та доорх жагсаалтын өмч дээр дарж болно.", - "QUICK_TRADE": "ШУУРХАЙ ХУДАЛДАА", + "ASSETS_INFO": "Бирж дээр ашиглах боломжтой хөрөнгийг доор харуулав.", + "ASSETS_INFO_DETAIL": "Дэлгэрэнгүй үзэхийн тулд та харгалзах хөрөнгө дээр дараарай.", + "QUICK_TRADE": "ХЯЛБАР АРИЛЖАА", "PRO_TRADE": "PRO TRADE", - "MARKETS": "ЗАХ ЗЭЭЛ", - "WALLET": "ТҮРИЙВЧ", + "MARKETS": "МАРКЕТ", + "WALLET": "Хэтэвч", "PRICE_SOURCE": "Үнийн эх үүсвэр", "ORDERBOOK": "Захиалгын дэвтэр", "NETWORK": "Брокер OTC сүлжээ", @@ -1864,7 +1864,7 @@ "SPEND_FIAT_CURRENCY": "Fiat валют сонгох", "AMOUNT": "Дүн", "PAYMENT_METHOD": "Төлбөрийн хэлбэр", - "AVAILABLE_REGIONS": "Боломжтой бүс", + "AVAILABLE_REGIONS": "Бүс", "VENDOR": "Худалдагч", "PRICE_LOWEST_FIRST": "Үнэ (бага нь эхэнд)", "LIMIT_AVAILABLE": "Лимит/боломжит", @@ -1882,9 +1882,9 @@ "TAB_P2P": "P2P", "TAB_ORDERS": "Захиалга", "TAB_PROFILE": "Профайл", - "TAB_POST_DEAL": "Санал илгээх", - "TAB_MY_DEALS": "Миний саналууд", - "NO_DEALS": "Санал байхгүй", + "TAB_POST_DEAL": "Зар оруулах", + "TAB_MY_DEALS": "Миний зар", + "NO_DEALS": "Зар байхгүй", "NUM_DEALS": "Саналууд:", "CHANGES_SAVED": "Өөрчлөлт хадгалсан", "ACTIVATE": "ИДЭВХЖҮҮЛЭХ", @@ -1893,16 +1893,16 @@ "SIDE": "Тал", "STATUS": "Төлөв", "PRICE_DISPLAYED": "Үнийг харуулсан", - "EDIT_DEAL": "Хэлэлцээрийг засах", + "EDIT_DEAL": "Санал засах", "ACTIVE": "ИДЭВХТЭЙ", "INACTIVE": "ИДЭВХГҮЙ", "AVAILABLE": "Боломжтой", - "LIMIT": "Хязгаар", - "EDIT_DEAL_BUTTON": "Хэлэлцээрийг засах", + "LIMIT": "Лимит", + "EDIT_DEAL_BUTTON": "Санал засах", "APPEAL_TRANSACTION": "Энэ гүйлгээг давж заалдана уу", "ENTER_REASON": "Та энэ гүйлгээг яагаад давж заалдсан шалтгаанаа оруулна уу", "CANCEL": "Цуцлах", - "OKAY": "ЗА", + "OKAY": "OKAY", "APPEALED_TRANSACTION": "Та гүйлгээний талаар давж заалдсан тул асуудлаа шийдвэрлэхийн тулд дэмжлэгтэй холбогдоно уу", "SUBMIT_FEEDBACK": "Энэ гүйлгээний талаар санал хүсэлтээ илгээнэ үү", "INPUT_FEEDBACK": "Санал хүсэлтээ оруулна уу", @@ -1914,13 +1914,13 @@ "BUY_COIN": "Худалдан авах", "SELL_COIN": "Зарна", "TRANSACTION_ID": "Гүйлгээний ID", - "AMOUNT_TO": "Хэмжээ нь", + "AMOUNT_TO": "Хэмжээ", "SELL": "зарах", "RELEASE": "суллах", "SEND": "илгээх", "REQUIRED_FLAT_TRANSFER_AMOUNT": "(шаардлагатай тогтмол шилжүүлгийн дүн)", "PRICE": "Үнэ", - "PER_COIN": "(зоос тутамд)", + "PER_COIN": "(токен)", "RECEIVING_AMOUNT": "Хүлээн авах дүн", "SPENDING_AMOUNT": "(таны авах дүн)", "BUYING_AMOUNT": "(таны авах дүн)", @@ -1928,28 +1928,28 @@ "TRANSFER_DETAILS": "Шилжүүлгийн дэлгэрэнгүй мэдээлэл", "PAYMENT_INSTRUCTIONS": "Энд сонгосон төлбөрийн хэрэгсэл, худалдагч руу мөнгө шилжүүлэх. Та мөнгөө амжилттай шилжүүлсний дараа худалдагчид мэдэгдэхийн тулд доорх баталгаажуулах товчийг дарна уу", "PAYMENT_ACCOUNT": "Худалдан авагчтай хуваалцсан төлбөрийн данс болон аргыг доор харуулав.", - "EXPECTED_TIME": "Санхүүжилт гарах хүртэл хүлээгдэж буй хугацаа: 30 минут", + "EXPECTED_TIME": "Төлбөр төлөх хугацаа: 30 минут", "PAYMENT_TIME": "Төлбөрийг дээр заасан хугацаанд төлнө үү.", - "ORDER_CANCELLED": "Өөрөөр хэлбэл захиалга цуцлагдана", + "ORDER_CANCELLED": "Хугацаандаа төлөөгүй тохиолдолд захиалга цуцлагдана", "AUTO_RESPONSE_LIMIT": "Автомат хариултын текст 240 тэмдэгтээс хэтрэхгүй байх ёстой", - "TERMS_RESPONSE_LIMIT": "Нөхцөлүүд 240 тэмдэгтээс хэтрэхгүй байх ёстой", - "FUNDS_CREDITED": "Санхүүжилт гарсны дараа та санхүүжилтийн хэтэвч рүүгээ орсон хөрөнгийг олох болно", + "TERMS_RESPONSE_LIMIT": "Нөхцөл 240 тэмдэгтээс хэтрэхгүй байх ёстой", + "FUNDS_CREDITED": "Хөрөнгийг суллалсны дараа таны хэтэвчинд харагдах болно", "VENDOR_CANCELLED": "Худалдагч захиалгыг цуцалсан тул мөнгө шилжүүлэхгүй. Хэрэв та үүнийг алдаа гэж бодож байвал дэмжлэгтэй холбоо барина уу", - "ORDER_COMPLETE": "ЗАХИАЛГА БҮРЭН БАЙНА", - "FUNDS_TRANSFERRED": "Худалдагч гүйлгээг баталгаажуулж, мөнгө таны үлдэгдэл рүү шилжсэн.", - "GO_DEPOSIT": "Хадгаламж руугаа оч", - "GO_WITHDRAWALS": "Татан авалт руугаа оч", - "VENDOR_APPEALED": "Худалдагчаас давж заалдсан гүйлгээ. Асуудлыг шийдвэрлэхийн тулд гүйлгээний ID-тай дэмжлэгтэй холбогдоно уу", - "USER_APPEALED": "Та гүйлгээг давж заалдсан. Асуудлыг шийдвэрлэхийн тулд гүйлгээний ID-тай дэмжлэгтэй холбогдоно уу", - "ORDER_COMPLETE_VENDOR": "Та энэ захиалгыг дууссан гэж тэмдэглэж, мөнгөө гаргасан", + "ORDER_COMPLETE": "ЗАХИАЛГА ДУУССАН", + "FUNDS_TRANSFERRED": "Худалдагч гүйлгээг баталгаажуулж, хөрөнгө таны хэтэвч рүү шилжлээ.", + "GO_DEPOSIT": "Орлогын хэсэгт очих", + "GO_WITHDRAWALS": "Зарлагын хэсэгт очих", + "VENDOR_APPEALED": "Худалдагч гүйлгээнд гомдол гаргалаа, Гүйлгээний дугаарын дагуу тусламжийн хэсэгтэй холбогдож шийдвэрлэнэ үү", + "USER_APPEALED": "Та гүйлгээнд гомдол гаргалаа. Асуудлыг шийдвэрлэхийн тулд гүйлгээний ID-г тусламжийн хэсэгт өгч холбогдоно уу", + "ORDER_COMPLETE_VENDOR": "Та энэ захиалгыг дууссан гэж тэмдэглэж, хөрөнгө сулласан", "PAYMENT_NOT_SENT": "Худалдан авагч төлбөрөө илгээгээгүй байна. Төлбөрийг хүлээн авсны дараа танд энд мэдэгдэх болно.", - "CONFIRM_AND_RELEASE": "Дуусмагц доорх худалдан авагчид крипто санг баталгаажуулж, чөлөөлнө үү", + "CONFIRM_AND_RELEASE": "Төлбөр дуусмагц баталгаажуулж доорх худалдан авагчид виртуал хөрөнгийг чөлөөлж өгнө үү", "TRANSACTION_CANCELLED": "Худалдан авагч гүйлгээг цуцалсан", "BUYER_CONFIRMED": "Худалдан авагч төлбөрөө баталгаажуулсан", "CHECK_AND_RELEASE": "Худалдан авагчийн төлбөрийг илгээсэн эсэхийг шалгаж, доорх мөнгийг баталгаажуулж, чөлөөлнө үү.", - "APPEAL": "Давж заалдах", + "APPEAL": "Гомдол гаргах", "CANCEL_ORDER": "Захиалгыг цуцлах", - "CONFIRM_AND_RELEASE_CRYPTO": "КРИПТОГ БАТАЛГАЖ, ГАРНА", + "CONFIRM_AND_RELEASE_CRYPTO": "БАТАЛЖ, ХӨРӨНГӨ СУЛЛАХ", "CONFIRMED_TRANSACTION": "Та гүйлгээг баталгаажууллаа", "CHAT_WITH_VENDOR": "ХУДАЛДАГЧТЭЙ ЧАТЛАХ", "CHAT_WITH_USER": "ХЭРЭГЛЭГЧТЭЙ ЧАТЛАХ", @@ -1957,30 +1957,30 @@ "USER_NAME": "Хэрэглэгчийн нэр:", "ORDER_INITIATED_VENDOR": "-тай захиалга эхлүүлсэн", "CONFIRM_PAYMENT_VENDOR": "Энэ гүйлгээг баталгаажуулахын тулд худалдан авагчтай холбоо барина уу.", - "ORDER_INITIATED": "Та захиалга эхлүүлж, үүсгэсэн байна", - "CONFIRM_PAYMENT": "Ирж буй төлбөрөө баталгаажуулахын тулд худалдагчтай холбоо барина уу.", + "ORDER_INITIATED": "Та захиалга эхлүүллээ", + "CONFIRM_PAYMENT": "Төлбөр баталгаажуулахын тулд худалдагчтай холбоо барина уу.", "YOU": "Та", "BUYER": "Худалдан авагч", "SEND_UPPER": "ИЛГЭЭХ", - "CONFIRM_TRANSFER": "ШИЛЖҮҮЛЭГЧДЭЭ МЭДЭГДҮҮЛЭХ, ШИЛЖҮҮЛЭХИЙГ БАТАЛГААЖУУЛНА", + "CONFIRM_TRANSFER": "ТӨЛБӨР ТӨЛСӨН, ХУДАЛДАГЧИД МЭДЭГДЭХ", "PROCESSING": "Боловсруулж байна", "ALL_ORDERS": "Бүх захиалга", - "TYPE_COIN": "Төрөл/Зоос", - "FIAT_AMOUNT": "Fiat хэмжээ", - "CRYPTO_AMOUNT": "Крипто хэмжээ", + "TYPE_COIN": "Төрөл/Хөрөнгө", + "FIAT_AMOUNT": "Мөнгөн дүн", + "CRYPTO_AMOUNT": "Крипто дүн", "COUNTERPARTY": "Эсрэг тал", "OPERATION": "Үйл ажиллагаа", "VIEW_ORDER": "Захиалга харах", "USER": "Хэрэглэгч", "COMMENT": "Сэтгэгдэл", "RATING": "Үнэлгээ", - "BUYER_PAID_ORDER": "Худалдан авагч энэ захиалгыг төлбөртэй гэж тэмдэглэсэн. Худалдагчийг шалгаж, баталгаажуулж, мөнгө гаргахыг хүлээж байна.", - "BUYER_SENT_FUNDS": "Та худалдаачинд мөнгө илгээсэн гэдгээ мэдэгдсэн. Худалдагчийн хариуг хүлээнэ үү.", - "ORDER_EXPIRED": "Энэ захиалгын хугацаа нь тухайн хугацаанд идэвхгүй байсан тул хугацаа нь дууссан.", + "BUYER_PAID_ORDER": "Худалдан авагч төлбөрийг шилжүүлсэн. Худалдагч төлбөрийг шалгаж захиалгыг дуусгахыг хүлээж байна.", + "BUYER_SENT_FUNDS": "Та төлбөр шилжүүлсэн гэдгээ мэдээлсэн. Худалдагч талын хариуг хүлээн үү", + "ORDER_EXPIRED": "Энэ захиалга хугацаандаа хийгдээгүй тул цуцлагдлаа.", "BUYER_CANCELLED_ORDER": "Худалдан авагч энэ захиалгыг цуцалсан тул гүйлгээ хаагдсан.", - "BUYER_APPEALED_ORDER": "Худалдан авагч энэ захиалгыг давж заалдсан тул асуудлыг шийдвэрлэхийн тулд дэмжлэгтэй холбоо барина уу.", - "VENDOR_CONFIRMED_ORDER": "Худалдагч нь гүйлгээг баталгаажуулж, мөнгөө гаргасан.", - "ORDER_CLOSED": "Давж заалдах хүсэлтийн дагуу шийдвэр гарсны дараа захирамжийг хаасан.", + "BUYER_APPEALED_ORDER": "Худалдан авагч энэ захиалгыг давж заалдсан тул асуудлыг шийдвэрлэхийн тулд тусламжийн хэсэгтэй холбоо барина уу.", + "VENDOR_CONFIRMED_ORDER": "Худалдагч нь гүйлгээг баталгаажуулж, захиалгыг баталгаажууллаа.", + "ORDER_CLOSED": "Давж заалдах хүсэлтийн дагуу шийдвэрлэгдсэн тул захиалга хаагдсан.", "VENDOR_CANCELLED_ORDER": "Худалдагч энэ захиалгыг цуцалсан тул гүйлгээ хаагдсан.", "VENDOR_APPEALED_ORDER": "Худалдагч энэ захиалгыг давж заалдсан тул асуудлыг шийдвэрлэхийн тулд тусламж үйлчилгээтэй холбогдоно уу.", "SET_TYPE_PRICE": "Үнэ, төрөл сонгох", @@ -1988,9 +1988,9 @@ "SET_TERMS_RESPONSE": "Нөхцөл тохируулах", "UPDATE_DEAL": "Санал шинэчлэх", "SELL_UPPER": "ЗАРАХ", - "CRYPTO_WANT_TO_SELL": "Та зарахыг хүсч буй крипто", + "CRYPTO_WANT_TO_SELL": "Зарах виртуал хөрөнгө", "RECEIVE": "АВАХ", - "FIAT_CURRENCY_WANT_TO_RECEIVE": "Хүлээн авах мөнгөн тэмдэгт", + "FIAT_CURRENCY_WANT_TO_RECEIVE": "Хүлээн авах валют", "PRICE_UPPER": "ҮНЭ", "STATIC": "СТАТИК", "FIXED_PRICE": "Тогтмол үнэ", @@ -2019,9 +2019,9 @@ "NEXT": "ЦААШ НЬ", "ADD_PAYMENT_METHOD_DETAILS": "Төлбөрийн дэлгэрэнгүй мэдээллийг оруулна уу", "COMPLETE": "Болсон", - "STEP_SET_TYPE_PRICE": "Төрөл, үнийг тохируулна уу", - "STEP_SET_TOTAL_AMOUNT_PAYMENT_METHODS": "Нийт дүн болон төлбөрийн аргыг тохируулна уу", - "STEP_SET_TERMS_AUTO_RESPONSE": "Нөхцөл ба автомат хариуг тохируулах", + "STEP_SET_TYPE_PRICE": "Төрөл, үнэ", + "STEP_SET_TOTAL_AMOUNT_PAYMENT_METHODS": "Дүн, данс", + "STEP_SET_TERMS_AUTO_RESPONSE": "Нөхцөл, хариу", "NO": "ҮГҮЙ", "CANCEL_WARNING": "Та энэ захиалгыг цуцлахдаа итгэлтэй байна уу?", "CONFIRM_WARNING": "Та энэ захиалгыг баталгаажуулахдаа итгэлтэй байна уу?", @@ -2034,15 +2034,15 @@ "MINUTES": "минут", "EDIT_UPPERCASE": "ЗАСАХ", "DATE": "Огноо", - "DISPLAY_NAME": "Харагдах нэр", - "TOTAL_ORDERS": "Нийт захиалга", - "COMPLETION_RATE": "Гүйцэтгэлийн хувь", + "DISPLAY_NAME": "Нэр", + "TOTAL_ORDERS": "Захиалгын тоо", + "COMPLETION_RATE": "Гүйцэтгэл", "POSITIVE_FEEDBACK": "Үнэлгээ", "POSITIVE": "Эерэг", "NEGATIVE": "Сөрөг", - "NO_FEEDBACK": "Санал хүсэлт олдсонгүй", - "INPUT_FIAT_AMOUNT": "Fiat хэмжээг оруулна уу", - "SELECT_FIAT": "Fiat сонгоно уу", + "NO_FEEDBACK": "Үнэлгээ байхгүй", + "INPUT_FIAT_AMOUNT": "Fiat дүн оруулна уу", + "SELECT_FIAT": "Валют сонгоно уу", "ALL_PAYMENT_METHODS": "Бүх төлбөрийн хэрэгсэл", "ALL_REGION": "Бүх бүс нутаг", "BUYER_NOT_MADE_THE_PAYMENT": "Худалдан авагч төлбөрөө баталгаажуулаагүй байна.", diff --git a/web/src/config/lang/nl.json b/web/src/config/lang/nl.json index d4a1343099..5407b89927 100644 --- a/web/src/config/lang/nl.json +++ b/web/src/config/lang/nl.json @@ -86,7 +86,7 @@ "OPTION_BUG": "Fout melden", "OPTION_PERSONAL_INFO": "Persoonlijke gegevens wijzigen", "OPTION_BANK_TRANSFER": "bank overschrijving", - "OPTION_REQUEST": "Vraag een uitnodiging aan voor de HollaEx Exchange" + "OPTION_REQUEST": "Vraag een uitnodiging aan voor de Exchange" }, "SUBJECT_LABEL": "Onderwerp", "SUBJECT_PLACEHOLDER": "Typ het onderwerp van uw probleem", @@ -106,7 +106,8 @@ }, "QR_CODE": "Deze QR-code bevat de stortingsinformatie en kan worden gescand met een QR-codelezer.", "NO_DATA": "geen informatie beschikbaar", - "QR_CODE_TITLE": "{0} Stortingsinformatie" + "QR_CODE_TITLE": "{0} Stortingsinformatie", + "VIEW_DEPOSIT": "Bekijk storting" }, "QR_CODE": { "SCAN": "Scannen", @@ -234,7 +235,10 @@ "MOBILE_WALLET_BALANCE_LABEL": "Weegschaal/Oost. USDT", "MOBILE_WALLET_SHARE_LABEL": "%Aandeel/Geschat. USDT", "VIEW_MORE_WALLET_INFO": "BEKIJK MEER PORTEFEUILLE-INFO", - "VIEW_WALLET_TRANSACTION_HISTORY": "BEKIJK WALLET-TRANSACTIEGESCHIEDENIS" + "VIEW_WALLET_TRANSACTION_HISTORY": "BEKIJK WALLET-TRANSACTIEGESCHIEDENIS", + "ORDERS_HOLD": "U heeft {0} {1}, wat resulteert in een blokkering van {2} {3} op uw {4} saldo", + "OPEN_ORDERS_SINGULAR": "open bestelling", + "VIEW_WALLET": "Bekijk portemonnee" }, "REQUEST_RESET_PASSWORD": { "TITLE": "Accountherstel", @@ -539,7 +543,8 @@ "CANCEL": "Annuleren", "PLACEHOLDER": "Typ hier" } - } + }, + "TITLE_TEXT": "Wijzig uw accountinstellingen door voorkeuren aan te passen, zoals de interface-indeling, meldingsvoorkeuren, gebruikersnaam en andere aanpassingen." }, "USER_APPS": { "TITLE": "Uw uitwisselingsapps", @@ -783,7 +788,10 @@ "INSTALL_METAMASK_DETAILS": { "TITLE": "Installeer MetaMask", "PROMPT": "U moet Metamask in uw browser installeren: {0}" - } + }, + "EARN_REWARD": "Verdien beloningen voor het inzetten van uw digitale activa", + "DEFI_STAKING": "DeFi-staking", + "CEFI_STAKING": "CeFi-uitzetting" }, "UNSTAKE": { "TITLE": "Uitzetten", @@ -901,13 +909,13 @@ "FORFEITURE_OF_EARNINGS_DETAILS_LABEL": "Verbeurdverklaring van verdiensten", "STAKE_AMOUNT_LABEL": "Stakebedrag", "DISCLAIMER_NOTICE": "Let op: voor bedragen in USD boven de $1.000 moet je ID-verificatie voltooien. Dit bedrag omvat verdiensten en het platform behoudt zich het recht voor om aanvullende gebruikersinformatie op te vragen.", - "SETTLEMENT_NOTICE": "Betaling: Er wordt een afwikkelingsperiode van 24 uur toegepast bij het unstaken.", + "SETTLEMENT_NOTICE": "{0} Bij het ongedaan maken van de staking wordt een vereffeningsperiode van 24 uur toegepast.", "CONFIRM_BUTTON": "Bevestigen", "STAKE_RULES_NOTICE": "Zodra je hebt gestaked, zul je gebonden zijn aan de regels van de pool.", "I_UNDERSTAND_AGAIN_BUTTON": "Ik begrijp het opnieuw", "CONGRATULATIONS_NOTICE": "Gefeliciteerd!", "EARNINGS_START_NOTICE": "Je staking begint met het verdienen van beloningen.", - "REVIEW_PROGRESS_LABEL": "Je kunt de voortgang van je staking bekijken op de pagina Actieve Stakes.", + "REVIEW_PROGRESS_LABEL": "U kunt de voortgang van uw inzet bekijken op de {0}", "TIME_REMAINING_LABEL": "Resterende tijd", "PENALTY_UPON_INITIAL_STAKE_PRINCIPLE_LABEL_2": "Boete bij aanvang van het staken", "FORFEITURE_OF_EARNINGS_LABEL_2": "Verbeurdverklaring van verdiensten", @@ -917,7 +925,26 @@ "VISIT_WALLET_BUTTON": "BEZOEK WALLET", "CLOSE_BUTTON": "SLUITEN", "ACTIVE_STAKES": "Actieve inzet", - "STAKES_HISTORY": "Geschiedenis" + "STAKES_HISTORY": "Geschiedenis", + "SETTLEMENT_NOTICE_TITLE": "Schikking:", + "REVIEW_PROGRESS_ACTIVE_LINK": "Actieve inzetpagina", + "STAKING": "Inzetten 101", + "SLASHING": "Snijden", + "MINIMUM_AMOUNT_ALLOWED": "Het minimale toegestane bedrag voor de pool is:", + "MAXIMUM_AMOUNT_ALLOWED": "Het maximaal toegestane bedrag voor de stakingpool is", + "DAYS": "Dagen", + "CONFIRM_STAKE_DECS": "Daar gaan we!", + "DO_YOU_UNDERSTAND": "Begrijp je het?", + "SUCCESSFULLY_STAKED_IN": "Met succes ingezet", + "SUCCESSFULLY_STAKED": "Succesvol ingezet", + "VIEW_ACTIVE_STAKES": "ACTIEVE INZETTEN BEKIJKEN", + "REVIEW_AND_UNSTAKE": "Beoordelen en ontbinden", + "NO_REWARD": "Geen beloningsbedrag te ontvangen", + "SUCCESSFULLY_UNSTAKED": "Je hebt succesvol de inzet ongedaan gemaakt", + "MIN": "Mijn", + "UNSTAKING": "ONTSTAPELEN...", + "UNSTAKED": "NIET INGESPANNEN", + "TOOLTIP": "De straf die je krijgt als je te vroeg uitstapt. {0}" }, "MOVE_XHT": { "TITLE": "Verplaats XHT", @@ -1072,7 +1099,9 @@ "ENTER_AMOUNT": "Voer een bedrag in", "REMOVE_TITLE": "Tag verwijderen", "MAX_AMOUNT_WARNING_INFO": "Dit bedrag overschrijdt uw maximale opnamelimiet.", - "ZERO_BALANCE": "U beschikt niet over voldoende beschikbaar saldo." + "ZERO_BALANCE": "U beschikt niet over voldoende beschikbaar saldo.", + "MIN_AMOUNT_WARNING_INFO": "Het minimale opnamebedrag is {0}", + "NEW_ADDRESS": "Nieuw adres" }, "WALLET_BUTTON_BASE_DEPOSIT": "borg", "WALLET_BUTTON_BASE_WITHDRAW": "terugtrekken", @@ -1405,7 +1434,8 @@ "INSUFFICIENT_LABEL": "Onvoldoende schikkingsbedrag", "INSUFFICIENT_INFO_1": "Uw inkomsten zijn momenteel onvoldoende voor verrekening. Nodig meer leden uit via uw verwijzingslink en wacht tot uw niet-verrekende inkomsten {0} {1}", "INSUFFICIENT_INFO_2": "groter zijn dan 1", - "GO_TO_REFERRAL": "Ga naar verwijzing" + "GO_TO_REFERRAL": "Ga naar verwijzing", + "REFER_DESC": "Deel hieronder een link met vrienden om commissies te verdienen op hun handel" }, "NOT_LOGGEDIN": { "TEXT_GENERAL": "Om te bekijken moet u inloggen", @@ -1473,7 +1503,11 @@ "CHANGE_7D": "Wijziging (7 dagen)", "CHANGE_1D": "Wijziging (1 dag)", "CHART_7D": "Grafiek (7 dagen)", - "ASSET": "Bezit" + "ASSET": "Bezit", + "PERCENTAGE": "% {0}", + "24H": "24 uur", + "TREND_7D": "Trend 7D", + "BUY": "Koop {0} {1}" }, "SUMMARY_MARKETS": { "HOLLAEX": "Wilt u uw digitale activa vermelden? Start uw eigen markt met uw HollaEx {0} {1}", @@ -1623,7 +1657,18 @@ "ORDERBOOK": "Orderboek", "NETWORK": "Netwerkmakelaar OTC", "BROKER": "Lokale makelaar OTC", - "BROKERAGE": "NA - (makelaardij)" + "BROKERAGE": "NA - (makelaardij)", + "LOADING_PRICES": "Prijzen laden...", + "INPUT_LABEL": "Voer de naam of het symbool van het activum in", + "HIGHLIGHTS": "Hoogtepunten", + "MOBILE_DESC": "Selecteer hieronder een markt om te beginnen met handelen.", + "PRICE_24H": "Prijs/24H %", + "CARDS": { + "GAINERS": "Winnaars", + "LOSERS": "Verliezers", + "MARKET_CAP": "Marktkapitalisatie", + "24H": "{0} 24 uur" + } }, "HOLLAEX_TOKEN": { "REMOVE_FAVOURITES": "Verwijder uit favorieten", @@ -1669,7 +1714,8 @@ "TAG": "Label:", "DISABLED_DEPOSIT_CONTENT": "De stortingsfunctionaliteit is tijdelijk niet beschikbaar.", "DISABLED_WITHDRAW_CONTENT": "De opnamefunctionaliteit is tijdelijk niet beschikbaar.", - "DEPOSIT_LABEL": "Borg" + "DEPOSIT_LABEL": "Borg", + "VOLUME": "VOLUME" }, "ASYNC_LINK": { "TITLE": "Pagina wordt niet automatisch geopend?", @@ -1853,7 +1899,8 @@ "WALLET_BALANCE_ESTIMATE": "De schatting van het portemonneesaldo van vandaag ", "VIEW_BALANCE_HISTORY": "BEKIJK BALANSGESCHIEDENIS", "VIEW_PERCENTAGE_SHARE": "BEKIJK PERCENTAGE AANDEEL", - "VIEW_WALLET_P&L": "BEKIJK PORTEFEUILLE P&L" + "VIEW_WALLET_P&L": "BEKIJK PORTEFEUILLE P&L", + "BALANCE_PERCENTAGE": "Saldo Percentage" }, "ASSET_INFO": "Informatie over activa", "TAKER_FEES_APPLIED": "Er worden takerkosten in rekening gebracht", @@ -2002,7 +2049,7 @@ "TOTAL_ASSET_SELL_1": "Totaal", "TOTAL_ASSET_SELL_2": "je kunt verkopen", "BUY_ORDER_LIMITS": "KOOPORDERLIMIETEN", - "MIN_MAX_ORDER_VALUE_1": "Minimaal en maximaal", + "MIN_MAX_ORDER_VALUE_1": "Minimaal en maximaal {0} {1}", "MIN_MAX_ORDER_VALUE_2": "koop orderwaarde in", "PAYMENT_METHODS_SEND_FIAT": "BETAALMETHODEN VOOR HET VERZENDEN VAN FIAT", "SELECT_PAYMENT_METHODS_1": "Selecteer tot", @@ -2018,7 +2065,7 @@ "DEAL_EDITED": "Deal is bewerkt", "DEAL_CREATED": "Deal is gemaakt", "NEXT": "VOLGENDE", - "ADD_PAYMENT_METHOD_DETAILS": "Voeg betalingsmethodegegevens toe", + "ADD_PAYMENT_METHOD_DETAILS": "{0} Betalingsmethodegegevens", "COMPLETE": "Compleet", "STEP_SET_TYPE_PRICE": "Stel het type en de prijs in", "STEP_SET_TOTAL_AMOUNT_PAYMENT_METHODS": "Stel het totaalbedrag en de betaalmethoden in", @@ -2048,6 +2095,400 @@ "ALL_REGION": "Alle regio", "BUYER_NOT_MADE_THE_PAYMENT": "De koper heeft zijn betaling nog niet bevestigd.", "PRICE_TO_ADVERTISE": "Prijs waarvoor u adverteert om te verkopen", - "VIEW_PROFILE": "Bekijk het profiel van de leverancier" + "VIEW_PROFILE": "Bekijk het profiel van de leverancier", + "P2P_METHODS": "P2P-betaalmethoden", + "PAYMENT_METHODS": "BETALINGSMETHODEN", + "PAYMENT_METHODS_DEC": "U kunt cryptovaluta verkopen en fiatbetalingen ontvangen door uw persoonlijke betalingsrekeninggegevens toe te voegen, zoals bankgegevens of andere lokale betaalmethoden. Zorg ervoor dat de naam die aan uw betalingsrekening is gekoppeld, overeenkomt met de naam in uw geverifieerde gegevens voordat u uw betalingsgegevens toevoegt.", + "SELL_AMOUNT": "Verkoopbedrag", + "ADD_PAYMENT_METHOD": "+ BETAALMETHODE TOEVOEGEN", + "REMOVE": "VERWIJDEREN", + "DYNAMIC": "DYNAMISCH", + "TYPE": "TYPE", + "BACK_TO_ORDERS": "naar bestellingen", + "FUNDS_TRANSFERRED_USER": "De gebruiker heeft de transactie bevestigd en het geld is overgemaakt naar uw saldo.", + "CONFIRM_TRANSFER_USER": "BEVESTIG OVERDRACHT EN STEL GEBRUIKER OP DE HOOGTE", + "BUYER_SENT_FUNDS_USER": "U hebt de gebruiker laten weten dat u het geld hebt verzonden. Wacht op een reactie van de gebruiker.", + "VENDOR_CONFIRMED_ORDER_USER": "De gebruiker heeft de transactie bevestigd en het geld vrijgegeven.", + "BUY_UPPER": "KOPEN", + "CRYPTO_WANT_TO_BUY": "Crypto die u wilt kopen", + "FIAT_CURRENCY_WANT_TO_SPEND": "Fiatgeld om uit te geven", + "PRICE_ADVERTISE": "Prijs die u adverteert aan {0}", + "TOTAL_AMOUNT": "Totaalbedrag", + "BUY_SELL_DESC": "je kan {0}", + "SELL_ORDER_LIMITS": "VERKOOPORDERLIMIETEN", + "MIN_MAX_ORDER_VALUE_3": "verkooporderwaarde", + "PAYMENT_METHODS_RECEIVE_FIAT": "BETALINGSMETHODEN OM FIAT TE ONTVANGEN", + "PAYMENT_TIME_LIMIT_LABEL": "Betalingstermijn: {0}", + "30_MINUTES": "30 minuten", + "DELETE_UPPERCASE": "VERWIJDEREN", + "CLICK_TO_VIEW": "KLIK OM TE BEKIJKEN", + "NEW_MESSAGE": "U hebt een P2P-bericht ontvangen", + "STATUS_UPDATE": "U heeft een update over uw P2P-bestelling", + "APPEAL_STATUS_MESSAGE": "Er is beroep aangetekend tegen uw P2P-bestelling", + "CANCEL_STATUS_MESSAGE": "Uw P2P-bestelling is geannuleerd", + "CONFIRM_STATUS_MESSAGE": "Uw P2P-bestelling is bevestigd", + "NEW_ORDER_CREATED": "Nieuwe P2P-order is aangemaakt", + "CRYPTO_RELEASE_STATUS_MESSAGE": "Crypto is vrijgegeven uit de bestelling", + "ADDITIONAL_PAYMENT_DETAILS": "Voeg extra betalingsgegevens toe", + "PAYMENT_FIELD_INFO": "Dit nieuwe betalingsveld is extra en moet P2P-deelnemers helpen bij hun fiat-valuta-overdrachten. Dit moeten accountgegevens zijn die gerelateerd zijn aan de betaalmethode. Dit kan telefoonnummers, gebruikersnamen, unieke accountnummers en andere benodigde informatie voor transacties omvatten, afhankelijk van het betalingsmethodesysteem.", + "PAYMENT_DETAIL_NAME": "Betalingsdetailnaam", + "REQUIRED_OR_OPTIONAL": "Verplicht of optioneel", + "CREATE_NEW_PAYMENT_METHODS": "Nieuwe betaalmethoden maken en toevoegen", + "MANUAL_PAYMENT_METHOD_ENTRY": "Om een betaalmethode toe te voegen aan uw P2P-platform, kunt u dit handmatig doen door de naam van de betaalmethode en de vereiste betalingsgegevens in te voeren. PayPal gebruikt bijvoorbeeld e-mailadressen om geld te verzenden en ontvangen.", + "USERS_PAYMENT_SELECTION": "Zodra de betaalmethode is toegevoegd, kunnen uw P2P-handelaren en gebruikers deze selecteren en de benodigde informatie invoeren bij het doen of ontvangen van betalingen. De gegevens die zij verstrekken, worden gedeeld met de andere partij in de P2P-transactie.", + "METHOD_NAME_AND_DETAIL": "Naam van de methode en belangrijkste betalingsgegevens", + "ADD_NEW_PAYMENT_METHODS": "Selecteer nieuwe betaalmethoden:", + "DETAIL_NAME": "Betalingsdetailnaam", + "DETAIL_VALUE": "Betalingsdetailwaarde", + "DETAIL_REQUIRED": "Vereist", + "IMPORTANT_DETAIL": "(Belangrijke betalingsgegevens)", + "DETAIL_OPTIONAL": "Optioneel", + "OPTIONAL_DETAIL": "(Optioneel betalingsgegeven)", + "ADD_NEW_PAYMENT_FIELD": "Nieuw betalingsdetailveld toevoegen", + "PAYMENT_METHOD_CREATED": "Betaalmethode aangemaakt! Wacht op verificatie door admin", + "PAYMENT_METHOD_DELETED": "Betaalmethode verwijderd.", + "PAYMENT_METHOD_UPDATED": "Betaalmethode bijgewerkt.", + "CRYPTO": "Cryptogrammen:", + "INPUT_SPEND_AMOUNT": "Invoerbedrag besteden", + "INPUT_SELL_AMOUNT": "Voer het verkoopbedrag in", + "TIMES": "keer", + "FEEDBACK": "Feedback", + "ASSET": "Bezit: ", + "CUSTOM": "Aangepast", + "CANCELLED": "Geannuleerd", + "APPEALED": "Beroep aangetekend", + "EXPIRED": "Verlopen", + "RATE": "Tarief:", + "BUYING": "Kopen {0}", + "SELLING": "Verkopen {0}", + "TERMS_AND_CONDITION_DESCRIPTION": "Plaats dit binnen 15 minuten nadat de deal is gesloten", + "VISIT_OUR_WEBSITE": "Bezoek onze website", + "SELECT_PAYMENT_SYSTEM_LABEL": "Selecteer betalingssysteem", + "FIELD": "Veld", + "NEW_PAYMENT_PLACEHOLDER": "Voer de betalingsdetailwaarde in", + "FIELD_VALIDATION_TEXT": "Vul alle methodevelden in", + "INPUT_METHOD_NAME_TEXT": "Voer de naam van de methode in", + "INPUT_PAYMENT_DETAIL_TEXT": "Voer de naam van de betalingsgegevens in", + "UNVERIFIED": "Ongeverifieerd", + "VERIFIED": "Geverifieerd", + "AMOUNT_RECEIVE": "wordt vrijgegeven van uw saldo", + "DELETE_WARNING": "Weet u zeker dat u deze betaalmethode wilt verwijderen?", + "STEP_1": "Stap 1/3", + "STEP_2": "Stap 2/3", + "STEP_3": "Stap 3/3", + "P2P_ORDER_CREATED": "P2P-order gemaakt", + "VENDOR_CHECKS_TITLE": "Controleer en bevestig betaling", + "FUND_RELEASED": "Vrijgegeven fondsen", + "ORDER_EXPIRY": "Bestelling verloopt in", + "MINIMUM_AMOUNT_WARNING": "De minimale {0} is {1}", + "MAXIMUM_AMOUNT_WARNING": "Het maximum {0} is {1}", + "ORDER_CREATION": "Ordercreatie", + "ORDER_CREATION_DESC_1": "Door op 'Bestelling maken' te klikken, brengt u de leverancier op de hoogte en ontvangt u direct een prijsopgave met de precieze details voor de betalingsoverdracht. {0} {1} {2} {3}", + "ORDER_CREATION_DESC_2": "Hieronder vindt u het exacte bedrag dat nodig is om uw bestelling af te ronden.", + "YOU_HAVE_TEXT": "Je zult hebben", + "COMPLETE_PAYMENT_PROCESS": "om het betalingsproces te voltooien.", + "WARINNG_DESC": "Ga alleen verder met het maken van de bestelling als u de bestelling ook daadwerkelijk wilt afronden.", + "ORDER_CANCEL_DESC": "Als u de bestelling annuleert, kan uw account worden opgeschort.", + "CONFIRM_ORDER_CREATION": "Wanneer u klaar bent om {0} te bestellen, klikt u hieronder op 'Bestelling maken'.", + "SEND_MONEY": "Stuur het geld", + "RECEIVE_MONEY": "het geld ontvangen", + "CREATE_ORDER": "Bestelling maken", + "NO_ORDERS_DESC": "Het lijkt erop dat er hier geen bestellingen zijn.", + "NO_DEALS_DESC": "Het lijkt erop dat er hier geen aanbiedingen zijn.", + "ONLINE": "ONLINE", + "OFFLINE": "UITGESCHAKELD", + "SELECT_CRYPTO": "Selecteer crypto", + "REMOVE_WARNING": "Weet u zeker dat u deze deal wilt verwijderen?", + "SHOW_FILTERS": "FILTERS WEERGEVEN", + "HIDE_FILTERS": "FILTERS VERBERGEN", + "ORDERS_COMPLETED": "Voltooide bestellingen:", + "CANCEL_WARNING_TEXT": "Houd er rekening mee dat frequente annuleringen van bestellingen een negatief effect kunnen hebben op uw openbare P2P-profiel en ertoe kunnen leiden dat uw account wordt opgeschort.", + "UPDATE": "Update", + "TERMS_ERROR_TEXT": "Voer het veld Voorwaarden in", + "RESPONSE_ERROR_TEXT": "Voer het antwoordveld in" + }, + "CUSTOM_NATIVE_CURRENCY": "Valuta (Prijs- en vermogenswaardeschattingen)", + "ADDRESS_BOOK": { + "ADDRESS_BOOK_LABEL": "Adresboek", + "ADDRESS_BOOK_DESC_1": "Voeg een witgelijst opnameadres toe aan uw persoonlijke adresboek", + "ADDRESS_BOOK_DESC_2": "U kunt deze adressen eenvoudig gebruiken bij het opnemen van geld.", + "ADD_ADDRESS_LINK": "Adres toevoegen", + "ADD_WITHDRAW_ADDRESS": "Voeg een afhaaladres toe", + "DATE_ADDED": "Datum toegevoegd", + "REMOVE": "Verwijderen", + "NO_LINK": "Er is nog geen opnameadres toegevoegd.", + "ADD_WITHDRAW_ADDRESS_DESC_1": "Voeg een witlijstadres toe waar u veilig munten naartoe kunt opnemen.", + "ADD_WITHDRAW_ADDRESS_DESC_2": "Dit opnameadres moet een adres zijn dat onder uw beheer valt.", + "NAME_YOUR_ADDRESS_TITLE": "Geef uw adres op", + "NAME_YOUR_ADDRESS_DESC": "Geef dit opnameadres een naam voor toekomstig gebruik.", + "USER_LABEL": "Naam/label:", + "USER_FIELD_PLACEHOLDER": "Geef dit opnameadres een naam", + "CHECK_AND_CONFIRM": "Controleren en bevestigen", + "WARNING_ADDRESS": "Controleer en bevestig dat de gegevens correct zijn voordat u dit adres aan uw adresboek toevoegt:", + "ENSURE_DESC": "Zorg ervoor dat het adres correct is en dat u er controle over heeft.", + "ADDRESSES": "Adressen", + "WITHDRAWAL_ADDRESS_BOOK": "Opname adresboek", + "ADD_ADDRESS_DESC": "Voeg opnameadres toe aan {0}", + "ADDRESS_BOOK": "Adresboek", + "MANAGE_ADDRESS_BOOK": "Adresboek beheren", + "VIEW_ADDRESS_BOOK_LABEL": "Adresboek bekijken", + "ADD_WITHDRAWAL_ADDRESS_LINK": "Voeg opnameadres toe", + "REVOKE_ADDRESS": "Uw adres is verwijderd", + "REMOVE_ADDRESS": "Adres verwijderen", + "REMOVE_CONTENT": "Wilt u dit opnameadres uit uw adresboek verwijderen?" + }, + "VOLUME": { + "VOLUME": "VOLUME", + "BACK": "Rug", + "MARKETS": "MARKTEN", + "CONVERT": "OVERZETTEN", + "HISTORY": "GESCHIEDENIS", + "TRADING_VOLUME": "Handelsvolume", + "VOLUME_DECS": "Verhandelde bedragen op uw account gedurende verschillende tijdsperioden, samen met de top 3 activa die in elke periode zijn verhandeld", + "ALL_ASSETS": "alle activa", + "DAY_VOLUME": "DAGVOLUME", + "HOUR_VOLUME": "24 UURSVOLUME", + "TOP": "BOVEN {0} {1}", + "VOL_ASSET": "D VOL. ACTIVA", + "NO_DATA_DESC_1": "Het lijkt erop dat u nog geen trades heeft gedaan. Begin nu met traden om uw activiteit hier te zien!", + "NO_DATA_DESC_2": "Begin met handelen", + "NO_DATA_DESC_3": "nu om uw activiteit hier te zien!", + "TRADE_VOLUME": "Handelsvolume", + "VIEW_VOLUME": "Bekijk volume", + "TRADE_DESCRIPTION": "Bekijk uw meest verhandelde activa", + "MARKET_TABLE_DESC": "Bezoek uw handelsvolumepagina {0}" + }, + "MORE_OPTIONS_LABEL": { + "MORE_OPTION_SEARCH_TXT": "Zoekfunctie of pagina's", + "NO_RESULT_DESC_1": "Het lijkt erop dat er geen resultaten zijn voor dit onderwerp.", + "NO_RESULT_DESC_2": "Probeer een ander trefwoord te zoeken.", + "ICONS": { + "REFERRALS": "Verwijzingen", + "BUY_CRYPTO": "Koop crypto", + "API": "API", + "DEFI_STAKE": "Defi-inzet", + "CEFI_STAKE": "Cefi-inzet", + "PROFIT_LOSS": "Winst- en verliesrekening", + "LIMITS": "Limieten", + "LOGINS": "Inloggen", + "AUDIO": "Geluid" + }, + "HOT_FUNCTION": { + "HOT_FUNCTION_LABEL": "Hotfuncties", + "ADD_FUNDS": "Fondsen toevoegen", + "TOP_UP": "Bijvullen", + "LOAD": "Laden", + "CREDIT": "Credit", + "FUND_ACCOUNT": "Fondsrekening", + "BTC": "btc", + "USTD": "USD", + "ETH": "eth", + "USD": "USD", + "XHT": "xht", + "TRANSFER": "overdracht", + "MONEY": "geld", + "FUNDING": "financiering", + "RECHARGE": "opladen", + "REFILL": "bijvullen", + "CASH_IN": "contant geld in", + "ADD_MONEY": "geld toevoegen", + "EXCHANGE": "Aandelenbeurs", + "SWAP": "Ruil", + "BUY_SELL": "Kopen/Verkopen", + "TRADE": "Handel", + "CONVERT_CURRENCY": "Valuta omrekenen", + "INVITE": "Uitnodiging", + "REFER": "Refereren", + "REWARDS": "Beloningen", + "BONUS": "Bonus", + "AFFILIATION": "aansluiting", + "AFFILIATE": "filiaal", + "PASSIVE_INCOME": "Passief inkomen", + "REVENUE": "winst" + }, + "OTHER_FUNCTIONS": { + "OTHER_FUNCTIONS_LABEL": "Andere functies", + "INTEGRATION": "Integratie", + "PROGRAMMATIC_ACCESS": "Programmatische toegang", + "DEVELOPER": "Ontwikkelaar", + "AUTOMATED_TRADING": "Geautomatiseerde handel", + "BOT": "Bot", + "ALGO": "Iets", + "ALGORITHM": "algoritme", + "FIAT": "fiat", + "DOLLAR": "dollar", + "PURCHASE": "aankoop", + "BUY_COIN": "Koop munt", + "BUY_TOKEN": "Token kopen", + "YIELD": "Opbrengst", + "INTEREST": "Interesse", + "REVENUE": "winst", + "CENTRALIZED_STAKING": "Gecentraliseerde inzet", + "PERFORMANCE": "Prestatie", + "GAINS": "Winsten", + "LOSSES": "Verliezen", + "PORTFOLIO_PROFIT": "Portefeuillewinst", + "LOSS": "verlies", + "PNL": "pl", + "CHARGES": "Kosten", + "COSTS": "Kosten", + "COMMISSION": "Commissie", + "TRADING_FEES": "Handelskosten", + "TRANSACTION_FEES": "Transactiekosten", + "RESTRICTIONS": "Beperkingen", + "BOUNDARIES": "Grenzen", + "CAPS": "Doppen", + "MAXIMUM": "Maximaal", + "WITHDRAWAL_LIMITS": "Opnamelimieten", + "STORAGE": "Opslag", + "FUNDS": "Fondsen", + "BALANCE": "Evenwicht", + "CRYPTO_WALLET": "Crypto-portemonnee", + "MY": "Mijn", + "ENGLISH": "Engels", + "LOCALIZATION": "Lokalisatie", + "TRANSLATE": "Vertalen", + "LANGUAGE_SETTINGS": "Taalinstellingen", + "MULTILINGUAL": "Meertalig", + "LANGUAGE_PREFERENCE": "Taalvoorkeur", + "TEXT": "tekst", + "WORD": "woord", + "PEER_TO_PEER": "Peer-to-peer", + "DIRECT_TRADE": "Directe handel", + "USER_TO_USER": "Gebruiker-tot-gebruiker", + "PRIVATE_TRADE": "Privéhandel", + "TRANSACTIONS": "Transacties", + "ACTIVITY": "Activiteit", + "RECORD": "Dossier", + "LOG": "Log", + "TRANSACTION_HISTORY": "Transactiegeschiedenis", + "LIQUIDITY": "Liquiditeit", + "MARKET_VOLUME": "Marktvolume", + "TRADING_ACTIVITY": "Handelsactiviteit", + "MARKETS": "markten", + "CRYPTO": "crypto", + "TWO_FACTOR_AUTHENTICATION": "Twee-factorauthenticatie", + "MFA": "MFA", + "AUTHENTICATOR": "Authenticatie", + "OTP": "otp", + "CREDENTIALS": "Referenties", + "PASSWORD_RESET": "Wachtwoord opnieuw instellen", + "SIGN_INS": "Aanmeldingen", + "ACCOUNT_ACCESS": "Accounttoegang", + "SESSION_HISTORY": "Sessiegeschiedenis", + "LOGGED_IN": "Ingelogd", + "SESSION_MANAGEMENT": "Sessiebeheer", + "CURRENT_SESSIONS": "Huidige sessies", + "BANKING_DETAILS": "Bankgegevens", + "BANK_ACCOUNT": "Bankrekening", + "FINANCIAL_INSTITUTION": "Financiële instelling", + "BANK_INFO": "Bank Info", + "WITHDRAWAL_ACCOUNT": "Opname rekening", + "FUND": "fonds", + "SOUND": "Geluid", + "AUDIO_SETTINGS": "Audio-instellingen", + "ALERTS": "Waarschuwingen", + "NOTIFICATIONS": "Meldingen", + "AUDIO_ALERTS": "Audio-waarschuwingen", + "SECURITY": "beveiliging", + "CONTACT": "Contact", + "EMAIL_ADDRESS": "E-mailadres", + "MAIL": "Mail", + "EMAIL_CONTACT": "E-mailcontact", + "KYC": "kyc", + "SMS": "SMS", + "KYC_CAPS": "KYC", + "ID": "identiteitsbewijs", + "PERSONAL_INFO": "Persoonlijke informatie", + "IDENTITY_CHECK": "Identiteitscontrole", + "PAYOUT": "Uitbetaling", + "CASH_OUT": "Uitbetalen", + "REMOVE_FUNDS": "Fondsen verwijderen", + "OUT": "Uit", + "SUPPORT": "steun", + "CONTACT_LOWER": "contact", + "EMAIL_LOWER": "e-mail", + "RESOURCE": "bronnen", + "GUIDES": "gidsen", + "FAQ": "veelgestelde vragen", + "CUSTOMER_SERVICE": "klantenservice", + "ASSISTANCE": "bijstand", + "API_LOWER": "api", + "MESSAGE": "bericht", + "LIVE_CHAT": "livechat", + "SETTINGS": "instellingen", + "ALERT": "Waarschuwing", + "UPDATES": "Updates", + "REMINDERS": "Herinneringen", + "UI": "Gebruikersinterface", + "USER_INTERFACE": "Gebruikersinterface", + "LAYOUT": "Indeling", + "DESIGN": "Ontwerp", + "DASHBOARD": "Dashboard", + "COLOR_THEME": "kleurenthema", + "ORDER_BOOK": "orderboek", + "DARK": "donker", + "LIGHT": "licht", + "WITHDRAWAL_ADDRESSES": "Opnameadressen", + "CRYPTO_ADDRESSES": "Crypto-adressen", + "WALLET_ADDRESSES": "Portemonnee-adressen", + "SAVED_ADDRESSES": "Opgeslagen adressen", + "ADDRESS_BOOK": "Adresboek", + "WHITE_LISTED": "op de witte lijst" + } + }, + "CONNECTIONS": { + "CHECK_CONNECTION": "Controleer verbinding", + "IP": "IE", + "NORMAL_TEXT": "Normaal", + "CONNECTION_ISSUE": "Verbindingsprobleem", + "SESSION": "Sessie", + "SERVER_TIME": "Servertijd", + "PING": "Ping", + "CHECK_PING": "CONTROLEER PING", + "RECONNECT": "Opnieuw verbinden", + "TOOLTIP_DESC_1": "Controleer uw ping naar de Exchange-server {0}", + "TOOLTIP_DESC_2": "Lagere 'ms' is beter", + "LOGGED_IN_AT": "Ingelogd op", + "RECONNECT_DESC": "Door opnieuw verbinding te maken, worden onbekende problemen mogelijk opgelost.", + "CONFIRM_RECONNECT_MESSAGE": "Wilt u opnieuw verbinding maken?", + "PING_CHECK_TEXT": "De server wordt gepingd. Even geduld...", + "RECHECK_PING": "PING OPNIEUW CONTROLEREN", + "FAST": "Snel", + "SLOW": "Langzaam", + "MS": "{0} ms", + "STATUS_NORMAL": "Verbinding Normaal", + "CONNECTION_LABEL": "Verbinding", + "CONNECTION_ISSUE_DETECTED": "Verbindingsprobleem gedetecteerd" + }, + "DESKTOP_NAVIGATION": { + "OTHERS": "Anderen", + "SUMMARY_DESCRIPTION": "Informatie en toegankelijkheid op accountniveau", + "FEES_LIMITS_DESC": "Handels- en opnamekosten. Rekeninglimieten", + "VOLUME_DESC": "Samenvatting van het handelsvolume in de loop van de tijd", + "DEPOSIT_DESC": "Toegang tot opties voor het storten van geld op uw portemonnee", + "BALANCE_DESC": "Al uw activa en hun saldi", + "PERFORMANCE_DESC": "Winst en verlies van portemonnee", + "HISTORY_DESC": "Bekijk alle transacties, stortingen en opnames", + "ADDRESS_BOOK_DESC": "Contactadresboek voor opnames", + "WITHDRAW_DESC": "Opnames en overboekingen van portemonnees", + "ASSETS_DESC": "Volg prijzen en ontdek activagegevens", + "CONVERT_DESC": "Ruil eenvoudig een activum voor een ander", + "MARKET_DESC": "Spot trading orderbook markets.", + "P2P_DESC": "Cryptohandel", + "REFERRAL_DESC": "Verdien passief inkomen door je vrienden uit te nodigen", + "CEFI_STAKE_DESC": "Zet activa in vanaf uw beursportemonnee", + "DEFI_STAKE_DESC": "Verbind de portemonnee en zet uw activa in", + "BUY_CRYPTO_DESC": "Kopen via directe bankoverschrijving of kaarten", + "SECURITY_DESC": "Account 2FA, wachtwoord en API's", + "VERIFICATION_DESC": "Accountidentiteitsverificatie", + "SETTINGS_DESC": "Interface en andere accountinstellingen", + "SUMMARY_PAGE": "Samenvattingspagina", + "SIGNOUT_DESC": "Account afmelden", + "LANGUAGE_DESC": "Taalvoorkeur wijzigen", + "API_DESC": "Gebruik API-sleutels om programmatisch toegang te krijgen tot uw account", + "HELP_DESC": "Krijg hulp. Ondersteuningscontact", + "TRANSACTION_DESC": "Bekijk alle transacties, stortingen en opnames", + "ONRAMPER_DESC": "Gebruik Onramper om crypto te kopen en verkopen" } } \ No newline at end of file diff --git a/web/src/config/lang/pt.json b/web/src/config/lang/pt.json index bd42ad6b3e..7a6e3ebc97 100644 --- a/web/src/config/lang/pt.json +++ b/web/src/config/lang/pt.json @@ -138,7 +138,7 @@ "OPTION_BUG": "Relatar bug", "OPTION_PERSONAL_INFO": "Alterar informações pessoais", "OPTION_BANK_TRANSFER": "Transferência Bancária", - "OPTION_REQUEST": "Solicitar convite para a HollaEx Exchange" + "OPTION_REQUEST": "Solicitar convite para a Exchange" }, "SUBJECT_LABEL": "Assunto", "SUBJECT_PLACEHOLDER": "De que se trata o seu problema?", @@ -164,7 +164,8 @@ "QR_CODE": "Este código QR pode ser escaneado pela pessoa que deseja enviar moedas para você", "NO_DATA": "Nenhuma informação disponível", "FULL_MESSAGE_LIMIT": "{0}: {1} {2} {3}", - "QR_CODE_TITLE": "{0} Informações de Depósito" + "QR_CODE_TITLE": "{0} Informações de Depósito", + "VIEW_DEPOSIT": "Ver depósito" }, "LOGIN": { "LOGIN_TO": "Login para {0}", @@ -274,7 +275,10 @@ "MOBILE_WALLET_BALANCE_LABEL": "Libra/Leste. USDT", "MOBILE_WALLET_SHARE_LABEL": "%Compartilhamento/Est. USDT", "VIEW_MORE_WALLET_INFO": "VER MAIS INFORMAÇÕES DA CARTEIRA", - "VIEW_WALLET_TRANSACTION_HISTORY": "VER HISTÓRICO DE TRANSAÇÕES DA CARTEIRA" + "VIEW_WALLET_TRANSACTION_HISTORY": "VER HISTÓRICO DE TRANSAÇÕES DA CARTEIRA", + "ORDERS_HOLD": "Você tem {0} {1}, resultando em uma retenção de {2} {3} colocada em seu saldo {4}", + "OPEN_ORDERS_SINGULAR": "ordem aberta", + "VIEW_WALLET": "Ver carteira" }, "REQUEST_RESET_PASSWORD": { "TITLE": "Recuperação de conta", @@ -613,7 +617,8 @@ "CANCEL": "Cancelar", "PLACEHOLDER": "Digite aqui" } - } + }, + "TITLE_TEXT": "Revise as configurações da sua conta ajustando preferências como layout da interface, preferências de notificação, nome de usuário e outras personalizações." }, "TRANSACTION_HISTORY": { "TITLE": "Histórico", @@ -849,7 +854,9 @@ "ENTER_AMOUNT": "Insira o valor", "REMOVE_TITLE": "Remover etiqueta", "MAX_AMOUNT_WARNING_INFO": "Este valor excede o seu limite máximo de retirada.", - "ZERO_BALANCE": "Você não tem saldo disponível suficiente." + "ZERO_BALANCE": "Você não tem saldo disponível suficiente.", + "MIN_AMOUNT_WARNING_INFO": "O valor mínimo de retirada é {0}", + "NEW_ADDRESS": "Novo endereço" }, "WALLET_BUTTON_BASE_DEPOSIT": "depósito", "WALLET_BUTTON_BASE_WITHDRAW": "saque", @@ -1191,7 +1198,8 @@ "INSUFFICIENT_LABEL": "Valor de liquidação insuficiente", "INSUFFICIENT_INFO_1": "Seus ganhos são atualmente insuficientes para liquidação. Convide mais membros usando seu link de indicação e aguarde até que seus ganhos não sejam liquidados {0} {1}", "INSUFFICIENT_INFO_2": "exceder 1", - "GO_TO_REFERRAL": "Vá para referência" + "GO_TO_REFERRAL": "Vá para referência", + "REFER_DESC": "Compartilhe um link abaixo com amigos para começar a ganhar comissões em suas negociações" }, "NOT_LOGGEDIN": { "TXT_1": "Você deve fazer o login primeiro para começar a fazer trade", @@ -1414,7 +1422,10 @@ "INSTALL_METAMASK_DETAILS": { "TITLE": "Instale MetaMask", "PROMPT": "Você deve instalar o Metamask em seu navegador: {0}" - } + }, + "EARN_REWARD": "Ganhe recompensas por apostar seus ativos digitais", + "DEFI_STAKING": "Estaca DeFi", + "CEFI_STAKING": "Estacamento CeFi" }, "UNSTAKE": { "TITLE": "Desempacotar", @@ -1532,13 +1543,13 @@ "FORFEITURE_OF_EARNINGS_DETAILS_LABEL": "Perda dos ganhos", "STAKE_AMOUNT_LABEL": "Valor da aposta", "DISCLAIMER_NOTICE": "Aviso: observe que para valores em USD acima de $1.000, é necessário concluir a verificação de identidade. Esse valor inclui ganhos, e a plataforma se reserva o direito de solicitar informações adicionais do usuário.", - "SETTLEMENT_NOTICE": "Pagamento: Um período de liquidação de 24 horas será aplicado após o desbloqueio.", + "SETTLEMENT_NOTICE": "{0} Um período de liquidação de 24 horas será aplicado após o desinvestimento.", "CONFIRM_BUTTON": "Confirmar", "STAKE_RULES_NOTICE": "Assim que você apostar, estará comprometido com as regras do pool.", "I_UNDERSTAND_AGAIN_BUTTON": "Eu Entendo Novamente", "CONGRATULATIONS_NOTICE": "Parabéns!", "EARNINGS_START_NOTICE": "Sua aposta começará a render recompensas.", - "REVIEW_PROGRESS_LABEL": "Você pode revisar o progresso da sua aposta na página de Apostas Ativas.", + "REVIEW_PROGRESS_LABEL": "Você pode rever o progresso da sua aposta em {0}", "TIME_REMAINING_LABEL": "Tempo restante", "PENALTY_UPON_INITIAL_STAKE_PRINCIPLE_LABEL_2": "Penalidade ao princípio da aposta", "FORFEITURE_OF_EARNINGS_LABEL_2": "Perda dos ganhos", @@ -1548,7 +1559,26 @@ "VISIT_WALLET_BUTTON": "VISITAR CARTEIRA", "CLOSE_BUTTON": "FECHAR", "ACTIVE_STAKES": "Apostas ativas", - "STAKES_HISTORY": "História" + "STAKES_HISTORY": "História", + "SETTLEMENT_NOTICE_TITLE": "Povoado:", + "REVIEW_PROGRESS_ACTIVE_LINK": "Página de apostas ativas", + "STAKING": "Estacando 101", + "SLASHING": "Cortando", + "MINIMUM_AMOUNT_ALLOWED": "O valor mínimo permitido para o pool de apostas é", + "MAXIMUM_AMOUNT_ALLOWED": "O valor máximo permitido no pool de apostas é", + "DAYS": "Dias", + "CONFIRM_STAKE_DECS": "Aqui vamos nós!", + "DO_YOU_UNDERSTAND": "Você entende?", + "SUCCESSFULLY_STAKED_IN": "Apostado com sucesso em", + "SUCCESSFULLY_STAKED": "Apostado com sucesso", + "VIEW_ACTIVE_STAKES": "VER APOSTAS ATIVAS", + "REVIEW_AND_UNSTAKE": "Revisar e desmarcar", + "NO_REWARD": "Nenhum valor de recompensa para receber", + "SUCCESSFULLY_UNSTAKED": "Você desbloqueou com sucesso", + "MIN": "Mínimo", + "UNSTAKING": "DESMONTANDO...", + "UNSTAKED": "NÃO APOSTACADO", + "TOOLTIP": "A penalidade que você incorrerá se você retirar a aposta muito cedo. {0}" }, "MOVE_XHT": { "TITLE": "Mover XHT", @@ -1632,7 +1662,11 @@ "CHANGE_7D": "Mudança (7 dias)", "CHANGE_1D": "Mudança (1 dia)", "CHART_7D": "Gráfico (7 dias)", - "ASSET": "Ativo" + "ASSET": "Ativo", + "PERCENTAGE": "% {0}", + "24H": "24H", + "TREND_7D": "Tendência 7D", + "BUY": "Comprar {0} {1}" }, "SUMMARY_MARKETS": { "HOLLAEX": "Quer listar seus ativos digitais? Comece seu próprio mercado com seu HollaEx {0} {1}", @@ -1781,7 +1815,18 @@ "ORDERBOOK": "Carteira de pedidos", "NETWORK": "Corretor de rede OTC", "BROKER": "Corretor local OTC", - "BROKERAGE": "NA - (Corretora)" + "BROKERAGE": "NA - (Corretora)", + "LOADING_PRICES": "Carregando preços...", + "INPUT_LABEL": "Nome ou símbolo do ativo de entrada", + "HIGHLIGHTS": "Destaques", + "MOBILE_DESC": "Selecione um mercado abaixo para começar a negociar.", + "PRICE_24H": "Preço/24H %", + "CARDS": { + "GAINERS": "Ganhadores", + "LOSERS": "Perdedores", + "MARKET_CAP": "Capitalização de mercado", + "24H": "{0} 24H" + } }, "HOLLAEX_TOKEN": { "REMOVE_FAVOURITES": "Remova dos favoritos", @@ -1827,7 +1872,8 @@ "TAG": "Marcação:", "DISABLED_DEPOSIT_CONTENT": "A funcionalidade de depósito está temporariamente indisponível.", "DISABLED_WITHDRAW_CONTENT": "A funcionalidade de retirada está temporariamente indisponível.", - "DEPOSIT_LABEL": "Depósito" + "DEPOSIT_LABEL": "Depósito", + "VOLUME": "VOLUME" }, "ASYNC_LINK": { "TITLE": "A página não abre automaticamente?", @@ -2017,7 +2063,8 @@ "WALLET_BALANCE_ESTIMATE": "Estimativa de saldo da carteira de hoje ", "VIEW_BALANCE_HISTORY": "VER HISTÓRICO DE SALDO", "VIEW_PERCENTAGE_SHARE": "VER PERCENTAGEM DE PARTICIPAÇÃO", - "VIEW_WALLET_P&L": "VER P&L DA CARTEIRA" + "VIEW_WALLET_P&L": "VER P&L DA CARTEIRA", + "BALANCE_PERCENTAGE": "Porcentagem de saldo" }, "ASSET_INFO": "Informações do recurso", "TAKER_FEES_APPLIED": "Taxas de tomador são aplicadas", @@ -2166,7 +2213,7 @@ "TOTAL_ASSET_SELL_1": "Total", "TOTAL_ASSET_SELL_2": "você pode vender", "BUY_ORDER_LIMITS": "LIMITES DE PEDIDO DE COMPRA", - "MIN_MAX_ORDER_VALUE_1": "Mínimo e máximo", + "MIN_MAX_ORDER_VALUE_1": "Mínimo e máximo {0} {1}", "MIN_MAX_ORDER_VALUE_2": "valor do pedido de compra em", "PAYMENT_METHODS_SEND_FIAT": "FORMAS DE PAGAMENTO PARA ENVIAR FIAT", "SELECT_PAYMENT_METHODS_1": "Selecione até", @@ -2182,7 +2229,7 @@ "DEAL_EDITED": "A oferta foi editada", "DEAL_CREATED": "O acordo foi criado", "NEXT": "PRÓXIMO", - "ADD_PAYMENT_METHOD_DETAILS": "Adicionar detalhes da forma de pagamento", + "ADD_PAYMENT_METHOD_DETAILS": "{0} Detalhes do método de pagamento", "COMPLETE": "Completo", "STEP_SET_TYPE_PRICE": "Defina o tipo e o preço", "STEP_SET_TOTAL_AMOUNT_PAYMENT_METHODS": "Defina o valor total e as formas de pagamento", @@ -2212,6 +2259,400 @@ "ALL_REGION": "Todas as regiões", "BUYER_NOT_MADE_THE_PAYMENT": "O comprador ainda não confirmou o pagamento.", "PRICE_TO_ADVERTISE": "Preço que você anunciará para vender", - "VIEW_PROFILE": "Ver perfil do fornecedor" + "VIEW_PROFILE": "Ver perfil do fornecedor", + "P2P_METHODS": "Métodos de pagamento P2P", + "PAYMENT_METHODS": "MÉTODOS DE PAGAMENTO", + "PAYMENT_METHODS_DEC": "Você pode vender criptomoedas e receber pagamentos fiduciários adicionando os detalhes da sua conta de pagamento pessoal, como informações bancárias ou outros métodos de pagamento locais. Certifique-se de que o nome associado à sua conta de pagamento corresponda ao nome nos seus detalhes verificados antes de adicionar suas informações de pagamento.", + "SELL_AMOUNT": "Valor da venda", + "ADD_PAYMENT_METHOD": "+ ADICIONE MÉTODO DE PAGAMENTO", + "REMOVE": "REMOVER", + "DYNAMIC": "DINÂMICO", + "TYPE": "TIPO", + "BACK_TO_ORDERS": "para pedidos", + "FUNDS_TRANSFERRED_USER": "O usuário confirmou a transação e os fundos foram transferidos para seu saldo.", + "CONFIRM_TRANSFER_USER": "CONFIRMAR TRANSFERÊNCIA E NOTIFICAR USUÁRIO", + "BUYER_SENT_FUNDS_USER": "Você sinalizou ao usuário que enviou os fundos. Aguarde uma resposta do usuário.", + "VENDOR_CONFIRMED_ORDER_USER": "O usuário confirmou a transação e liberou os fundos.", + "BUY_UPPER": "COMPRAR", + "CRYPTO_WANT_TO_BUY": "Criptomoeda que você quer comprar", + "FIAT_CURRENCY_WANT_TO_SPEND": "Moeda fiduciária para gastar", + "PRICE_ADVERTISE": "Preço que você anunciará para {0}", + "TOTAL_AMOUNT": "Montante total", + "BUY_SELL_DESC": "você pode {0}", + "SELL_ORDER_LIMITS": "LIMITES DE ORDEM DE VENDA", + "MIN_MAX_ORDER_VALUE_3": "valor do pedido de venda", + "PAYMENT_METHODS_RECEIVE_FIAT": "MÉTODOS DE PAGAMENTO PARA RECEBER FIAT", + "PAYMENT_TIME_LIMIT_LABEL": "Prazo de pagamento: {0}", + "30_MINUTES": "30 minutos", + "DELETE_UPPERCASE": "EXCLUIR", + "CLICK_TO_VIEW": "CLIQUE PARA VER", + "NEW_MESSAGE": "Você recebeu uma mensagem P2P", + "STATUS_UPDATE": "Você tem uma atualização sobre seu pedido P2P", + "APPEAL_STATUS_MESSAGE": "Seu pedido P2P foi apelado", + "CANCEL_STATUS_MESSAGE": "Seu pedido P2P foi cancelado", + "CONFIRM_STATUS_MESSAGE": "Seu pedido P2P foi confirmado", + "NEW_ORDER_CREATED": "Nova Ordem P2P foi criada", + "CRYPTO_RELEASE_STATUS_MESSAGE": "A criptomoeda foi liberada da ordem", + "ADDITIONAL_PAYMENT_DETAILS": "Adicionar detalhes de pagamento adicionais", + "PAYMENT_FIELD_INFO": "Este novo campo de pagamento é adicional e deve auxiliar os participantes P2P em suas transferências de moeda fiduciária. Devem ser detalhes da conta relacionados ao método de pagamento. Isso pode incluir números de telefone, nomes de usuários, números de conta exclusivos e outras informações necessárias para transações, dependendo do sistema de métodos de pagamento.", + "PAYMENT_DETAIL_NAME": "Nome do detalhe do pagamento", + "REQUIRED_OR_OPTIONAL": "Obrigatório ou opcional", + "CREATE_NEW_PAYMENT_METHODS": "Crie e adicione novos métodos de pagamento", + "MANUAL_PAYMENT_METHOD_ENTRY": "Para adicionar um método de pagamento à sua plataforma P2P, você pode fazer isso manualmente inserindo o nome do método de pagamento e os detalhes de pagamento necessários. Por exemplo, o PayPal usa endereços de e-mail para enviar e receber fundos.", + "USERS_PAYMENT_SELECTION": "Depois que o método de pagamento for adicionado, seus comerciantes e usuários P2P poderão selecioná-lo e inserir as informações necessárias ao fazer ou receber pagamentos. Os detalhes que eles fornecerem serão compartilhados com a outra parte na transação P2P.", + "METHOD_NAME_AND_DETAIL": "Nome do método e principais detalhes de pagamento", + "ADD_NEW_PAYMENT_METHODS": "Selecione novos métodos de pagamento:", + "DETAIL_NAME": "Nome do detalhe do pagamento", + "DETAIL_VALUE": "Valor do detalhe do pagamento", + "DETAIL_REQUIRED": "Obrigatório", + "IMPORTANT_DETAIL": "(Detalhe importante do pagamento)", + "DETAIL_OPTIONAL": "Opcional", + "OPTIONAL_DETAIL": "(Detalhe de pagamento opcional)", + "ADD_NEW_PAYMENT_FIELD": "Adicionar novo campo de detalhes de pagamento", + "PAYMENT_METHOD_CREATED": "Método de pagamento criado! Aguardando verificação pelo administrador", + "PAYMENT_METHOD_DELETED": "Método de pagamento excluído.", + "PAYMENT_METHOD_UPDATED": "Método de pagamento atualizado.", + "CRYPTO": "Cripto:", + "INPUT_SPEND_AMOUNT": "Valor de gasto de entrada", + "INPUT_SELL_AMOUNT": "Insira o valor da venda", + "TIMES": "vezes", + "FEEDBACK": "Opinião", + "ASSET": "Ativo: ", + "CUSTOM": "Personalizado", + "CANCELLED": "Cancelado", + "APPEALED": "Apelou", + "EXPIRED": "Expirado", + "RATE": "Avaliar:", + "BUYING": "Comprando {0}", + "SELLING": "Vendendo {0}", + "TERMS_AND_CONDITION_DESCRIPTION": "Por favor, publique dentro de 15 minutos após o negócio ser fechado", + "VISIT_OUR_WEBSITE": "Visite nosso site", + "SELECT_PAYMENT_SYSTEM_LABEL": "Selecione o sistema de pagamento", + "FIELD": "Campo", + "NEW_PAYMENT_PLACEHOLDER": "Insira o valor dos detalhes do pagamento", + "FIELD_VALIDATION_TEXT": "Por favor, insira todos os campos do método", + "INPUT_METHOD_NAME_TEXT": "Por favor, insira o nome do método", + "INPUT_PAYMENT_DETAIL_TEXT": "Insira o nome do detalhe do pagamento", + "UNVERIFIED": "Não verificado", + "VERIFIED": "Verificado", + "AMOUNT_RECEIVE": "será liberado do seu saldo", + "DELETE_WARNING": "Tem certeza de que deseja excluir este método de pagamento?", + "STEP_1": "Passo 1/3", + "STEP_2": "Passo 2/3", + "STEP_3": "Passo 3/3", + "P2P_ORDER_CREATED": "Ordem P2P criada", + "VENDOR_CHECKS_TITLE": "Verifique e confirme o pagamento", + "FUND_RELEASED": "Fundos liberados", + "ORDER_EXPIRY": "Expiração do pedido em", + "MINIMUM_AMOUNT_WARNING": "O mínimo {0} é {1}", + "MAXIMUM_AMOUNT_WARNING": "O máximo {0} é {1}", + "ORDER_CREATION": "Criação de pedidos", + "ORDER_CREATION_DESC_1": "Ao clicar em \"Criar pedido\", você notificará o fornecedor e receberá uma cotação de preço instantânea, juntamente com detalhes precisos da transferência de pagamento. {0} {1} {2} {3}", + "ORDER_CREATION_DESC_2": "Isso inclui o valor exato necessário para finalizar seu pedido.", + "YOU_HAVE_TEXT": "Você terá", + "COMPLETE_PAYMENT_PROCESS": "para concluir o processo de transferência de pagamento.", + "WARINNG_DESC": "Continue com a criação do pedido somente se você realmente pretende concluí-lo.", + "ORDER_CANCEL_DESC": "Cancelar o pedido pode resultar na suspensão da conta.", + "CONFIRM_ORDER_CREATION": "Quando estiver pronto para {0}, clique em \"Criar pedido\" abaixo.", + "SEND_MONEY": "envie o dinheiro", + "RECEIVE_MONEY": "receber o dinheiro", + "CREATE_ORDER": "Criar pedido", + "NO_ORDERS_DESC": "Parece que não há pedidos aqui.", + "NO_DEALS_DESC": "Parece que não há acordos aqui.", + "ONLINE": "ON-LINE", + "OFFLINE": "OFFLINE", + "SELECT_CRYPTO": "Selecione cripto", + "REMOVE_WARNING": "Tem certeza de que deseja remover esta oferta?", + "SHOW_FILTERS": "MOSTRAR FILTROS", + "HIDE_FILTERS": "OCULTAR FILTROS", + "ORDERS_COMPLETED": "Pedidos concluídos:", + "CANCEL_WARNING_TEXT": "Observe que cancelamentos frequentes de pedidos podem afetar negativamente seu perfil P2P público e resultar na suspensão de sua conta.", + "UPDATE": "Atualizar", + "TERMS_ERROR_TEXT": "Por favor insira o campo Termos", + "RESPONSE_ERROR_TEXT": "Por favor insira o campo de resposta" + }, + "CUSTOM_NATIVE_CURRENCY": "Moeda (estimativas de preços e valor dos ativos)", + "ADDRESS_BOOK": { + "ADDRESS_BOOK_LABEL": "Livro de endereços", + "ADDRESS_BOOK_DESC_1": "Adicione um endereço de retirada da lista branca ao seu catálogo de endereços pessoal", + "ADDRESS_BOOK_DESC_2": "Você poderá usar esses endereços facilmente ao fazer saques.", + "ADD_ADDRESS_LINK": "Adicionar endereço", + "ADD_WITHDRAW_ADDRESS": "Adicionar endereço de retirada", + "DATE_ADDED": "Data adicionada", + "REMOVE": "Remover", + "NO_LINK": "Nenhum endereço de retirada foi adicionado ainda.", + "ADD_WITHDRAW_ADDRESS_DESC_1": "Adicione um endereço na lista de permissões para onde você pode sacar moedas com segurança.", + "ADD_WITHDRAW_ADDRESS_DESC_2": "Este endereço de retirada deve ser um endereço sob seu controle.", + "NAME_YOUR_ADDRESS_TITLE": "Diga seu endereço", + "NAME_YOUR_ADDRESS_DESC": "Dê um nome a este endereço de retirada para sua referência futura.", + "USER_LABEL": "Nome/rótulo:", + "USER_FIELD_PLACEHOLDER": "Nomeie este endereço de retirada", + "CHECK_AND_CONFIRM": "Verifique e confirme", + "WARNING_ADDRESS": "Antes de adicionar este endereço à sua lista de endereços, reserve um tempo para verificar e confirmar se os detalhes estão corretos:", + "ENSURE_DESC": "Certifique-se de que o endereço esteja correto e sob seu controle.", + "ADDRESSES": "Endereços", + "WITHDRAWAL_ADDRESS_BOOK": "Livro de endereços de retirada", + "ADD_ADDRESS_DESC": "Adicionar endereço de retirada para {0}", + "ADDRESS_BOOK": "Livro de endereços", + "MANAGE_ADDRESS_BOOK": "Gerenciar catálogo de endereços", + "VIEW_ADDRESS_BOOK_LABEL": "Ver catálogo de endereços", + "ADD_WITHDRAWAL_ADDRESS_LINK": "Adicionar endereço de retirada", + "REVOKE_ADDRESS": "Seu endereço foi removido", + "REMOVE_ADDRESS": "Remover endereço", + "REMOVE_CONTENT": "Deseja remover este endereço de retirada da sua lista de endereços?" + }, + "VOLUME": { + "VOLUME": "VOLUME", + "BACK": "Voltar", + "MARKETS": "MERCADOS", + "CONVERT": "CONVERTER", + "HISTORY": "HISTÓRIA", + "TRADING_VOLUME": "Volume de negociação", + "VOLUME_DECS": "Valores negociados em sua conta em diferentes períodos de tempo, juntamente com os 3 principais ativos negociados em cada período", + "ALL_ASSETS": "todos os ativos", + "DAY_VOLUME": "VOLUME DIÁRIO", + "HOUR_VOLUME": "VOLUME DE 24 HORAS", + "TOP": "TOPO {0} {1}", + "VOL_ASSET": "D VOL. ATIVO", + "NO_DATA_DESC_1": "Parece que você ainda não fez nenhuma negociação. Comece a negociar agora para ver sua atividade aqui!", + "NO_DATA_DESC_2": "Comece a negociar", + "NO_DATA_DESC_3": "agora para ver sua atividade aqui!", + "TRADE_VOLUME": "Volume de negociação", + "VIEW_VOLUME": "VER VOLUME", + "TRADE_DESCRIPTION": "Veja seu ativo mais negociado", + "MARKET_TABLE_DESC": "Visite sua página de volume de negociação {0}" + }, + "MORE_OPTIONS_LABEL": { + "MORE_OPTION_SEARCH_TXT": "Recurso de pesquisa ou páginas", + "NO_RESULT_DESC_1": "Parece que não há resultados para isso.", + "NO_RESULT_DESC_2": "Tente pesquisar outra palavra-chave.", + "ICONS": { + "REFERRALS": "Referências", + "BUY_CRYPTO": "Comprar cripto", + "API": "API", + "DEFI_STAKE": "Aposta Defi", + "CEFI_STAKE": "Estaca Cefi", + "PROFIT_LOSS": "P&L", + "LIMITS": "Limites", + "LOGINS": "Logins", + "AUDIO": "Áudio" + }, + "HOT_FUNCTION": { + "HOT_FUNCTION_LABEL": "Funções quentes", + "ADD_FUNDS": "Adicionar fundos", + "TOP_UP": "Recarga", + "LOAD": "Carregar", + "CREDIT": "Crédito", + "FUND_ACCOUNT": "Conta de Fundo", + "BTC": "BTC-BTC ...", + "USTD": "dólar", + "ETH": "é", + "USD": "USD", + "XHT": "xht", + "TRANSFER": "transferir", + "MONEY": "dinheiro", + "FUNDING": "financiamento", + "RECHARGE": "recarregar", + "REFILL": "recarregar", + "CASH_IN": "dinheiro em", + "ADD_MONEY": "adicionar dinheiro", + "EXCHANGE": "Intercâmbio", + "SWAP": "Trocar", + "BUY_SELL": "Comprar/Vender", + "TRADE": "Troca", + "CONVERT_CURRENCY": "Converter moeda", + "INVITE": "Convidar", + "REFER": "Referir", + "REWARDS": "Recompensas", + "BONUS": "Bônus", + "AFFILIATION": "afiliação", + "AFFILIATE": "afiliado", + "PASSIVE_INCOME": "Renda Passiva", + "REVENUE": "receita" + }, + "OTHER_FUNCTIONS": { + "OTHER_FUNCTIONS_LABEL": "Outras funções", + "INTEGRATION": "Integração", + "PROGRAMMATIC_ACCESS": "Acesso Programático", + "DEVELOPER": "Desenvolvedor", + "AUTOMATED_TRADING": "Negociação automatizada", + "BOT": "Robô", + "ALGO": "Algo", + "ALGORITHM": "algoritmo", + "FIAT": "decreto", + "DOLLAR": "dólar", + "PURCHASE": "comprar", + "BUY_COIN": "Comprar moeda", + "BUY_TOKEN": "Comprar Token", + "YIELD": "Colheita", + "INTEREST": "Interesse", + "REVENUE": "receita", + "CENTRALIZED_STAKING": "Estaca centralizada", + "PERFORMANCE": "Desempenho", + "GAINS": "Ganhos", + "LOSSES": "Perdas", + "PORTFOLIO_PROFIT": "Lucro do portfólio", + "LOSS": "perda", + "PNL": "por favor", + "CHARGES": "Taxas", + "COSTS": "Custos", + "COMMISSION": "Comissão", + "TRADING_FEES": "Taxas de negociação", + "TRANSACTION_FEES": "Taxas de transação", + "RESTRICTIONS": "Restrições", + "BOUNDARIES": "Limites", + "CAPS": "Bonés", + "MAXIMUM": "Máximo", + "WITHDRAWAL_LIMITS": "Limites de retirada", + "STORAGE": "Armazenar", + "FUNDS": "Fundos", + "BALANCE": "Equilíbrio", + "CRYPTO_WALLET": "Carteira de Criptomoedas", + "MY": "meu", + "ENGLISH": "inglês", + "LOCALIZATION": "Localização", + "TRANSLATE": "Traduzir", + "LANGUAGE_SETTINGS": "Configurações de idioma", + "MULTILINGUAL": "Multilíngue", + "LANGUAGE_PREFERENCE": "Preferência de idioma", + "TEXT": "texto", + "WORD": "palavra", + "PEER_TO_PEER": "Pessoa para pessoa", + "DIRECT_TRADE": "Comércio Direto", + "USER_TO_USER": "Usuário para usuário", + "PRIVATE_TRADE": "Comércio Privado", + "TRANSACTIONS": "Transações", + "ACTIVITY": "Atividade", + "RECORD": "Registro", + "LOG": "Registro", + "TRANSACTION_HISTORY": "Histórico de transações", + "LIQUIDITY": "Liquidez", + "MARKET_VOLUME": "Volume de mercado", + "TRADING_ACTIVITY": "Atividade de negociação", + "MARKETS": "mercados", + "CRYPTO": "Criptomoeda", + "TWO_FACTOR_AUTHENTICATION": "Autenticação de dois fatores", + "MFA": "Mestrado em Belas Artes", + "AUTHENTICATOR": "Autenticador", + "OTP": "otp", + "CREDENTIALS": "Credenciais", + "PASSWORD_RESET": "Redefinição de senha", + "SIGN_INS": "Logins", + "ACCOUNT_ACCESS": "Acesso à conta", + "SESSION_HISTORY": "Histórico da sessão", + "LOGGED_IN": "Conectado", + "SESSION_MANAGEMENT": "Gerenciamento de Sessão", + "CURRENT_SESSIONS": "Sessões atuais", + "BANKING_DETAILS": "Dados bancários", + "BANK_ACCOUNT": "Conta bancária", + "FINANCIAL_INSTITUTION": "Instituição financeira", + "BANK_INFO": "Informações bancárias", + "WITHDRAWAL_ACCOUNT": "Conta de retirada", + "FUND": "fundo", + "SOUND": "Som", + "AUDIO_SETTINGS": "Configurações de áudio", + "ALERTS": "Alertas", + "NOTIFICATIONS": "Notificações", + "AUDIO_ALERTS": "Alertas de áudio", + "SECURITY": "segurança", + "CONTACT": "Contato", + "EMAIL_ADDRESS": "Endereço de email", + "MAIL": "Correspondência", + "EMAIL_CONTACT": "Contato por e-mail", + "KYC": "kyc", + "SMS": "SMS", + "KYC_CAPS": "KYC", + "ID": "EU IA", + "PERSONAL_INFO": "Informações pessoais", + "IDENTITY_CHECK": "Verificação de identidade", + "PAYOUT": "Pagamento", + "CASH_OUT": "Saque", + "REMOVE_FUNDS": "Remover fundos", + "OUT": "Fora", + "SUPPORT": "apoiar", + "CONTACT_LOWER": "contato", + "EMAIL_LOWER": "e-mail", + "RESOURCE": "recursos", + "GUIDES": "guias", + "FAQ": "Perguntas frequentes", + "CUSTOMER_SERVICE": "atendimento ao Cliente", + "ASSISTANCE": "assistência", + "API_LOWER": "APIs", + "MESSAGE": "mensagem", + "LIVE_CHAT": "bate-papo ao vivo", + "SETTINGS": "configurações", + "ALERT": "Alerta", + "UPDATES": "Atualizações", + "REMINDERS": "Lembretes", + "UI": "Interface do usuário", + "USER_INTERFACE": "Interface do usuário", + "LAYOUT": "Disposição", + "DESIGN": "Projeto", + "DASHBOARD": "Painel", + "COLOR_THEME": "tema de cor", + "ORDER_BOOK": "carteira de pedidos", + "DARK": "escuro", + "LIGHT": "luz", + "WITHDRAWAL_ADDRESSES": "Endereços de retirada", + "CRYPTO_ADDRESSES": "Endereços criptográficos", + "WALLET_ADDRESSES": "Endereços de carteira", + "SAVED_ADDRESSES": "Endereços salvos", + "ADDRESS_BOOK": "Livro de endereços", + "WHITE_LISTED": "lista branca" + } + }, + "CONNECTIONS": { + "CHECK_CONNECTION": "Verificar conexão", + "IP": "Propriedade Intelectual", + "NORMAL_TEXT": "Normal", + "CONNECTION_ISSUE": "Problema de conexão", + "SESSION": "Sessão", + "SERVER_TIME": "Hora do servidor", + "PING": "Ping", + "CHECK_PING": "VERIFICAR PING", + "RECONNECT": "Reconectar", + "TOOLTIP_DESC_1": "Verifique seu ping para o servidor de troca {0}", + "TOOLTIP_DESC_2": "'Ms' mais baixo é melhor", + "LOGGED_IN_AT": "Conectado em", + "RECONNECT_DESC": "Reconectar pode resolver problemas desconhecidos que você está enfrentando.", + "CONFIRM_RECONNECT_MESSAGE": "Você quer se reconectar?", + "PING_CHECK_TEXT": "Fazendo ping no servidor. Aguarde...", + "RECHECK_PING": "VERIFICAR PING NOVAMENTE", + "FAST": "Rápido", + "SLOW": "Lento", + "MS": "{0} senhores", + "STATUS_NORMAL": "Conexão Normal", + "CONNECTION_LABEL": "Conexão", + "CONNECTION_ISSUE_DETECTED": "Problema de conexão detectado" + }, + "DESKTOP_NAVIGATION": { + "OTHERS": "Outros", + "SUMMARY_DESCRIPTION": "Informações e acessibilidade em nível de conta", + "FEES_LIMITS_DESC": "Taxas de negociação e retirada. Limites de conta", + "VOLUME_DESC": "Resumo do volume de negociação ao longo do tempo", + "DEPOSIT_DESC": "Acesse as opções de financiamento de depósito de carteira", + "BALANCE_DESC": "Todos os seus ativos e seus saldos", + "PERFORMANCE_DESC": "Lucro e perda da carteira", + "HISTORY_DESC": "Revise todas as negociações, depósitos e retiradas", + "ADDRESS_BOOK_DESC": "Contato livro de endereços para retiradas", + "WITHDRAW_DESC": "Retiradas e transferências de carteira", + "ASSETS_DESC": "Acompanhe os preços e descubra dados de ativos", + "CONVERT_DESC": "Troque qualquer ativo por outro simplesmente", + "MARKET_DESC": "Mercados de livros de ordens de negociação à vista.", + "P2P_DESC": "Negociação de criptomoedas", + "REFERRAL_DESC": "Ganhe renda passiva convidando seus amigos", + "CEFI_STAKE_DESC": "Aposte ativos da sua carteira de câmbio", + "DEFI_STAKE_DESC": "Conecte a carteira e aposte seu ativo", + "BUY_CRYPTO_DESC": "Compre por transferência bancária direta ou cartões", + "SECURITY_DESC": "Conta 2FA, senha e APIs", + "VERIFICATION_DESC": "Verificação de identidade da conta", + "SETTINGS_DESC": "Interface e outras configurações de conta", + "SUMMARY_PAGE": "Página de resumo", + "SIGNOUT_DESC": "Sair da conta", + "LANGUAGE_DESC": "Alterar preferência de idioma", + "API_DESC": "Use chaves de API para acessar sua conta programaticamente", + "HELP_DESC": "Obter ajuda. Contato de suporte", + "TRANSACTION_DESC": "Revise todas as negociações, depósitos e retiradas", + "ONRAMPER_DESC": "Use o Onramper para comprar e vender criptomoedas" } } \ No newline at end of file diff --git a/web/src/config/lang/ru.json b/web/src/config/lang/ru.json index 508b37cb1e..5418031671 100644 --- a/web/src/config/lang/ru.json +++ b/web/src/config/lang/ru.json @@ -86,7 +86,7 @@ "OPTION_BUG": "Сообщить об ошибке", "OPTION_PERSONAL_INFO": "Изменить личную информацию", "OPTION_BANK_TRANSFER": "Банковский перевод", - "OPTION_REQUEST": "Запросить приглашение на биржу HollaEx" + "OPTION_REQUEST": "Запросить приглашение на биржу" }, "SUBJECT_LABEL": "Предмет", "SUBJECT_PLACEHOLDER": "Введите тему вашего вопроса", @@ -106,7 +106,8 @@ }, "QR_CODE": "Этот QR-код содержит информацию о депозите и может быть просканирован с помощью считывателя QR-кодов.", "NO_DATA": "Информация отсутствует", - "QR_CODE_TITLE": "{0} Информация о депозите" + "QR_CODE_TITLE": "{0} Информация о депозите", + "VIEW_DEPOSIT": "Посмотреть депозит" }, "QR_CODE": { "SCAN": "Сканировать", @@ -234,7 +235,10 @@ "MOBILE_WALLET_BALANCE_LABEL": "Весы/Восток. USDT", "MOBILE_WALLET_SHARE_LABEL": "% доля/оценка. USDT", "VIEW_MORE_WALLET_INFO": "ПОСМОТРЕТЬ БОЛЬШЕ ИНФОРМАЦИИ О КОШЕЛЬКЕ", - "VIEW_WALLET_TRANSACTION_HISTORY": "ПРОСМОТРЕТЬ ИСТОРИЮ ТРАНЗАКЦИЙ В КОШЕЛЬКЕ" + "VIEW_WALLET_TRANSACTION_HISTORY": "ПРОСМОТРЕТЬ ИСТОРИЮ ТРАНЗАКЦИЙ В КОШЕЛЬКЕ", + "ORDERS_HOLD": "У вас есть {0} {1}, в результате чего на вашем балансе {4} заблокирована сумма {2} {3}", + "OPEN_ORDERS_SINGULAR": "открытый заказ", + "VIEW_WALLET": "Посмотреть кошелек" }, "REQUEST_RESET_PASSWORD": { "TITLE": "Восстановление аккаунта", @@ -539,7 +543,8 @@ "CANCEL": "Отмена", "PLACEHOLDER": "Введите здесь" } - } + }, + "TITLE_TEXT": "Пересмотрите настройки своей учетной записи, изменив такие параметры, как макет интерфейса, параметры уведомлений, имя пользователя и другие настройки." }, "USER_APPS": { "TITLE": "Ваши приложения для обмена", @@ -780,7 +785,10 @@ "INSTALL_METAMASK_DETAILS": { "TITLE": "Установить МетаМаск", "PROMPT": "Вам необходимо установить Metamask в свой браузер: {0}" - } + }, + "EARN_REWARD": "Получайте вознаграждения за размещение своих цифровых активов", + "DEFI_STAKING": "DeFi-стейкинг", + "CEFI_STAKING": "CeFi Стейкинг" }, "UNSTAKE": { "TITLE": "Отменить ставку", @@ -898,13 +906,13 @@ "FORFEITURE_OF_EARNINGS_DETAILS_LABEL": "Утрата доходов", "STAKE_AMOUNT_LABEL": "Сумма стейкинга", "DISCLAIMER_NOTICE": "Отказ от ответственности: обратите внимание, что суммы, оцениваемые в долларах США свыше 1 000 долларов, потребуют завершения идентификации. Эта сумма включает в себя доходы, и платформа оставляет за собой право запросить дополнительную информацию о пользователе.", - "SETTLEMENT_NOTICE": "Расчет: после снятия будет применен 24-часовой период расчета.", + "SETTLEMENT_NOTICE": "{0} При отмене ставки будет применен 24-часовой расчетный период.", "CONFIRM_BUTTON": "Подтвердить", "STAKE_RULES_NOTICE": "Как только вы начнете стейкинг, вы обязуетесь соблюдать правила пула.", "I_UNDERSTAND_AGAIN_BUTTON": "Я понимаю еще раз", "CONGRATULATIONS_NOTICE": "Поздравляем!", "EARNINGS_START_NOTICE": "Ваш стейкинг начнет приносить доход.", - "REVIEW_PROGRESS_LABEL": "Вы можете просмотреть прогресс своего стейкинга на странице 'Активные стейки'.", + "REVIEW_PROGRESS_LABEL": "Вы можете просмотреть ход вашей ставки на {0}", "TIME_REMAINING_LABEL": "Оставшееся время", "PENALTY_UPON_INITIAL_STAKE_PRINCIPLE_LABEL_2": "Штраф при начальном принципе стейкинга", "FORFEITURE_OF_EARNINGS_LABEL_2": "Утрата доходов", @@ -914,7 +922,26 @@ "VISIT_WALLET_BUTTON": "ПОСЕТИТЬ КОШЕЛЕК", "CLOSE_BUTTON": "ЗАКРЫТЬ", "ACTIVE_STAKES": "Активные ставки", - "STAKES_HISTORY": "История" + "STAKES_HISTORY": "История", + "SETTLEMENT_NOTICE_TITLE": "Урегулирование:", + "REVIEW_PROGRESS_ACTIVE_LINK": "Страница активных ставок", + "STAKING": "Ставка 101", + "SLASHING": "Режущий", + "MINIMUM_AMOUNT_ALLOWED": "Минимально допустимая сумма пула ставок составляет", + "MAXIMUM_AMOUNT_ALLOWED": "Максимально допустимая сумма пула ставок составляет", + "DAYS": "Дни", + "CONFIRM_STAKE_DECS": "Вот так!", + "DO_YOU_UNDERSTAND": "Вы понимаете?", + "SUCCESSFULLY_STAKED_IN": "Успешно сделана ставка", + "SUCCESSFULLY_STAKED": "Успешно поставлено", + "VIEW_ACTIVE_STAKES": "СМОТРЕТЬ АКТИВНЫЕ СТАВКИ", + "REVIEW_AND_UNSTAKE": "Просмотреть и снять ставку", + "NO_REWARD": "Нет суммы вознаграждения для получения", + "SUCCESSFULLY_UNSTAKED": "Вы успешно сняли ставку", + "MIN": "Мин.", + "UNSTAKING": "ОТМЕНА...", + "UNSTAKED": "НЕЗАВЕРШЕНО", + "TOOLTIP": "Штраф, который вы понесете, если отмените ставку слишком рано. {0}" }, "MOVE_XHT": { "TITLE": "Переместить XHT", @@ -1076,7 +1103,9 @@ "ENTER_AMOUNT": "Введите сумму", "REMOVE_TITLE": "Убрать метку", "MAX_AMOUNT_WARNING_INFO": "Эта сумма превышает максимальный лимит вывода средств.", - "ZERO_BALANCE": "У вас недостаточно доступного баланса." + "ZERO_BALANCE": "У вас недостаточно доступного баланса.", + "MIN_AMOUNT_WARNING_INFO": "Минимальная сумма вывода составляет {0}", + "NEW_ADDRESS": "Новый адрес" }, "WALLET_BUTTON_BASE_DEPOSIT": "депозит", "WALLET_BUTTON_BASE_WITHDRAW": "отзывать", @@ -1409,7 +1438,8 @@ "INSUFFICIENT_LABEL": "Недостаточная сумма расчета", "INSUFFICIENT_INFO_1": "В настоящее время вашего дохода недостаточно для расчета. Пригласите больше участников, используя вашу реферальную ссылку, и подождите, пока не будет получен нераспределенный доход {0} {1}.", "INSUFFICIENT_INFO_2": "превышать 1", - "GO_TO_REFERRAL": "Перейти к реферальной ссылке" + "GO_TO_REFERRAL": "Перейти к реферальной ссылке", + "REFER_DESC": "Поделитесь ссылкой ниже с друзьями, чтобы начать зарабатывать комиссионные за их торговлю." }, "NOT_LOGGEDIN": { "TEXT_GENERAL": "Для просмотра необходимо авторизоваться", @@ -1477,7 +1507,11 @@ "CHANGE_7D": "Изменение (7 дней)", "CHANGE_1D": "Изменение (1 день)", "CHART_7D": "График (7 дней)", - "ASSET": "Объект" + "ASSET": "Объект", + "PERCENTAGE": "% {0}", + "24H": "24 часа", + "TREND_7D": "Тренд 7Д", + "BUY": "Купить {0} {1}" }, "SUMMARY_MARKETS": { "HOLLAEX": "Хотите перечислить свои цифровые активы? Начните свой собственный рынок с HollaEx {0} {1}", @@ -1627,7 +1661,18 @@ "ORDERBOOK": "Книга заказов", "NETWORK": "Сетевой брокер внебиржевой", "BROKER": "Местный брокер внебиржевой", - "BROKERAGE": "NA – (брокерские услуги)" + "BROKERAGE": "NA – (брокерские услуги)", + "LOADING_PRICES": "Загрузка цен...", + "INPUT_LABEL": "Введите имя актива или символ", + "HIGHLIGHTS": "Основные моменты", + "MOBILE_DESC": "Выберите рынок ниже, чтобы начать торговлю.", + "PRICE_24H": "Цена/24ч %", + "CARDS": { + "GAINERS": "Выигрышные", + "LOSERS": "Проигравшие", + "MARKET_CAP": "Рыночная капитализация", + "24H": "{0} 24 часа" + } }, "HOLLAEX_TOKEN": { "REMOVE_FAVOURITES": "Удалить из избранного", @@ -1673,7 +1718,8 @@ "TAG": "Ярлык:", "DISABLED_DEPOSIT_CONTENT": "Функционал депозита временно недоступен.", "DISABLED_WITHDRAW_CONTENT": "Функция вывода средств временно недоступна.", - "DEPOSIT_LABEL": "Депозит" + "DEPOSIT_LABEL": "Депозит", + "VOLUME": "ОБЪЕМ" }, "ASYNC_LINK": { "TITLE": "Страница не открывается автоматически?", @@ -1869,7 +1915,8 @@ "WALLET_BALANCE_ESTIMATE": "Оценка баланса кошелька на сегодня ", "VIEW_BALANCE_HISTORY": "ПРОСМОТРЕТЬ ИСТОРИЮ БАЛАНСА", "VIEW_PERCENTAGE_SHARE": "ПОСМОТРЕТЬ ПРОЦЕНТ ДОЛЯ", - "VIEW_WALLET_P&L": "ПОСМОТРЕТЬ ПРИБЫТИЯ И УБЫТИЯ КОШЕЛЬКА" + "VIEW_WALLET_P&L": "ПОСМОТРЕТЬ ПРИБЫТИЯ И УБЫТИЯ КОШЕЛЬКА", + "BALANCE_PERCENTAGE": "Процент баланса" }, "ASSET_INFO": "Информация об активе", "TAKER_FEES_APPLIED": "Взимаются комиссии тейкера", @@ -2017,7 +2064,7 @@ "TOTAL_ASSET_SELL_1": "Общий", "TOTAL_ASSET_SELL_2": "ты можешь продать", "BUY_ORDER_LIMITS": "КУПИТЬ ЛИМИТЫ ЗАКАЗОВ", - "MIN_MAX_ORDER_VALUE_1": "Минимум и максимум", + "MIN_MAX_ORDER_VALUE_1": "Минимум и максимум {0} {1}", "MIN_MAX_ORDER_VALUE_2": "стоимость заказа на покупку в", "PAYMENT_METHODS_SEND_FIAT": "СПОСОБЫ ОПЛАТЫ ДЛЯ ОТПРАВКИ ФИАТ", "SELECT_PAYMENT_METHODS_1": "Выберите до", @@ -2033,7 +2080,7 @@ "DEAL_EDITED": "Сделка была отредактирована", "DEAL_CREATED": "Сделка создана", "NEXT": "СЛЕДУЮЩИЙ", - "ADD_PAYMENT_METHOD_DETAILS": "Добавить информацию о способе оплаты", + "ADD_PAYMENT_METHOD_DETAILS": "{0} Подробности способа оплаты", "COMPLETE": "Полный", "STEP_SET_TYPE_PRICE": "Укажите тип и цену", "STEP_SET_TOTAL_AMOUNT_PAYMENT_METHODS": "Укажите общую сумму и способы оплаты.", @@ -2063,6 +2110,400 @@ "ALL_REGION": "Весь регион", "BUYER_NOT_MADE_THE_PAYMENT": "Покупатель еще не подтвердил оплату.", "PRICE_TO_ADVERTISE": "Цена, которую вы объявите о продаже", - "VIEW_PROFILE": "Посмотреть профиль продавца" + "VIEW_PROFILE": "Посмотреть профиль продавца", + "P2P_METHODS": "Методы оплаты P2P", + "PAYMENT_METHODS": "СПОСОБЫ ОПЛАТЫ", + "PAYMENT_METHODS_DEC": "Вы можете продавать криптовалюты и получать фиатные платежи, добавив данные своего личного платежного счета, такие как банковская информация или другие локальные способы оплаты. Убедитесь, что имя, связанное с вашим платежным счетом, совпадает с именем в ваших проверенных данных, прежде чем добавлять платежную информацию.", + "SELL_AMOUNT": "Сумма продажи", + "ADD_PAYMENT_METHOD": "+ ДОБАВИТЬ СПОСОБ ОПЛАТЫ", + "REMOVE": "УДАЛЯТЬ", + "DYNAMIC": "ДИНАМИЧНЫЙ", + "TYPE": "ТИП", + "BACK_TO_ORDERS": "к заказам", + "FUNDS_TRANSFERRED_USER": "Пользователь подтвердил транзакцию, и средства были переведены на ваш баланс.", + "CONFIRM_TRANSFER_USER": "ПОДТВЕРДИТЬ ПЕРЕДАЧУ И УВЕДОМИТЬ ПОЛЬЗОВАТЕЛЯ", + "BUYER_SENT_FUNDS_USER": "Вы дали сигнал пользователю, что отправили средства. Пожалуйста, дождитесь ответа от пользователя.", + "VENDOR_CONFIRMED_ORDER_USER": "Пользователь подтвердил транзакцию и разблокировал средства.", + "BUY_UPPER": "КУПИТЬ", + "CRYPTO_WANT_TO_BUY": "Криптовалюта, которую вы хотите купить", + "FIAT_CURRENCY_WANT_TO_SPEND": "Фиатная валюта для трат", + "PRICE_ADVERTISE": "Цена, которую вы будете рекламировать {0}", + "TOTAL_AMOUNT": "Общая сумма", + "BUY_SELL_DESC": "вы можете {0}", + "SELL_ORDER_LIMITS": "ЛИМИТЫ ЗАКАЗА НА ПРОДАЖУ", + "MIN_MAX_ORDER_VALUE_3": "стоимость ордера на продажу", + "PAYMENT_METHODS_RECEIVE_FIAT": "СПОСОБЫ ОПЛАТЫ ДЛЯ ПОЛУЧЕНИЯ ФИАТНЫХ ДЕНЕГ", + "PAYMENT_TIME_LIMIT_LABEL": "Срок платежа: {0}", + "30_MINUTES": "30 минут", + "DELETE_UPPERCASE": "УДАЛИТЬ", + "CLICK_TO_VIEW": "НАЖМИТЕ ДЛЯ ПРОСМОТРА", + "NEW_MESSAGE": "Вы получили P2P-сообщение", + "STATUS_UPDATE": "У вас есть обновление по вашему P2P-заказу", + "APPEAL_STATUS_MESSAGE": "Ваш заказ P2P был обжалован", + "CANCEL_STATUS_MESSAGE": "Ваш P2P-заказ был отменен", + "CONFIRM_STATUS_MESSAGE": "Ваш P2P-заказ подтвержден", + "NEW_ORDER_CREATED": "Создан новый P2P-заказ", + "CRYPTO_RELEASE_STATUS_MESSAGE": "Крипто был освобожден от заказа", + "ADDITIONAL_PAYMENT_DETAILS": "Добавьте дополнительные платежные реквизиты", + "PAYMENT_FIELD_INFO": "Это новое поле оплаты является дополнительным и должно помочь участникам P2P в их переводах фиатной валюты. Это должны быть данные счета, связанные с методом оплаты. Это может включать номера телефонов, имена пользователей, уникальные номера счетов и другую необходимую информацию для транзакций в зависимости от системы методов оплаты.", + "PAYMENT_DETAIL_NAME": "Название платежной информации", + "REQUIRED_OR_OPTIONAL": "Обязательно или необязательно", + "CREATE_NEW_PAYMENT_METHODS": "Создавайте и добавляйте новые способы оплаты", + "MANUAL_PAYMENT_METHOD_ENTRY": "Чтобы добавить способ оплаты на вашу P2P-платформу, вы можете сделать это вручную, введя название способа оплаты и необходимые платежные реквизиты. Например, PayPal использует адреса электронной почты для отправки и получения средств.", + "USERS_PAYMENT_SELECTION": "После добавления способа оплаты ваши P2P-продавцы и пользователи смогут выбрать его и ввести необходимую информацию при совершении или получении платежей. Предоставленные ими данные будут переданы другой стороне в P2P-транзакции.", + "METHOD_NAME_AND_DETAIL": "Название способа и основные реквизиты платежа", + "ADD_NEW_PAYMENT_METHODS": "Выберите новые способы оплаты:", + "DETAIL_NAME": "Название платежной информации", + "DETAIL_VALUE": "Значение реквизитов платежа", + "DETAIL_REQUIRED": "Необходимый", + "IMPORTANT_DETAIL": "(Важная информация об оплате)", + "DETAIL_OPTIONAL": "Необязательный", + "OPTIONAL_DETAIL": "(Необязательные реквизиты платежа)", + "ADD_NEW_PAYMENT_FIELD": "Добавить новое поле платежных реквизитов", + "PAYMENT_METHOD_CREATED": "Способ оплаты создан! Ожидание проверки администратором", + "PAYMENT_METHOD_DELETED": "Способ оплаты удален.", + "PAYMENT_METHOD_UPDATED": "Способ оплаты обновлен.", + "CRYPTO": "Крипто:", + "INPUT_SPEND_AMOUNT": "Введите сумму расходов", + "INPUT_SELL_AMOUNT": "Введите сумму продажи", + "TIMES": "раз", + "FEEDBACK": "Обратная связь", + "ASSET": "Объект: ", + "CUSTOM": "Обычай", + "CANCELLED": "Отменено", + "APPEALED": "Обжаловано", + "EXPIRED": "Истекший", + "RATE": "Ставка:", + "BUYING": "Покупка {0}", + "SELLING": "Продаю {0}", + "TERMS_AND_CONDITION_DESCRIPTION": "Пожалуйста, опубликуйте в течение 15 минут после совершения сделки.", + "VISIT_OUR_WEBSITE": "Посетите наш сайт", + "SELECT_PAYMENT_SYSTEM_LABEL": "Выберите платежную систему", + "FIELD": "Поле", + "NEW_PAYMENT_PLACEHOLDER": "Введите значение реквизитов платежа", + "FIELD_VALIDATION_TEXT": "Пожалуйста, введите все поля метода", + "INPUT_METHOD_NAME_TEXT": "Введите название метода", + "INPUT_PAYMENT_DETAIL_TEXT": "Введите название платежной информации.", + "UNVERIFIED": "Непроверено", + "VERIFIED": "Проверено", + "AMOUNT_RECEIVE": "будут списаны с вашего баланса", + "DELETE_WARNING": "Вы уверены, что хотите удалить этот способ оплаты?", + "STEP_1": "Шаг 1/3", + "STEP_2": "Шаг 2/3", + "STEP_3": "Шаг 3/3", + "P2P_ORDER_CREATED": "Заказ P2P создан", + "VENDOR_CHECKS_TITLE": "Проверьте и подтвердите платеж", + "FUND_RELEASED": "Выделенные средства", + "ORDER_EXPIRY": "Срок действия заказа истекает через", + "MINIMUM_AMOUNT_WARNING": "Минимальное значение {0} равно {1}", + "MAXIMUM_AMOUNT_WARNING": "Максимальное {0} равно {1}", + "ORDER_CREATION": "Создание заказа", + "ORDER_CREATION_DESC_1": "Нажав «Создать заказ», вы уведомите продавца и получите мгновенное ценовое предложение вместе с точными данными для перевода платежа. {0} {1} {2} {3}", + "ORDER_CREATION_DESC_2": "Сюда входит точная сумма, необходимая для завершения вашего заказа.", + "YOU_HAVE_TEXT": "У вас будет", + "COMPLETE_PAYMENT_PROCESS": "для завершения процесса перевода платежа.", + "WARINNG_DESC": "Продолжайте создание заказа только в том случае, если вы действительно намерены его завершить.", + "ORDER_CANCEL_DESC": "Отмена заказа может привести к блокировке аккаунта.", + "CONFIRM_ORDER_CREATION": "Когда вы будете готовы {0}, нажмите «Создать заказ» ниже.", + "SEND_MONEY": "отправить деньги", + "RECEIVE_MONEY": "получить деньги", + "CREATE_ORDER": "Создать заказ", + "NO_ORDERS_DESC": "Похоже, здесь нет заказов.", + "NO_DEALS_DESC": "Похоже, здесь нет никаких предложений.", + "ONLINE": "ОНЛАЙН", + "OFFLINE": "ОФФЛАЙН", + "SELECT_CRYPTO": "Выбрать криптовалюту", + "REMOVE_WARNING": "Вы уверены, что хотите удалить эту сделку?", + "SHOW_FILTERS": "ПОКАЗАТЬ ФИЛЬТРЫ", + "HIDE_FILTERS": "СКРЫТЬ ФИЛЬТРЫ", + "ORDERS_COMPLETED": "Выполненные заказы:", + "CANCEL_WARNING_TEXT": "Обратите внимание, что частые отмены заказов могут негативно повлиять на ваш публичный профиль P2P и привести к блокировке вашего аккаунта.", + "UPDATE": "Обновлять", + "TERMS_ERROR_TEXT": "Введите поле «Условия»", + "RESPONSE_ERROR_TEXT": "Пожалуйста, введите поле ответа" + }, + "CUSTOM_NATIVE_CURRENCY": "Валюта (оценка цен и стоимости активов)", + "ADDRESS_BOOK": { + "ADDRESS_BOOK_LABEL": "Адресная книга", + "ADDRESS_BOOK_DESC_1": "Добавьте адрес для вывода средств из белого списка в свою личную адресную книгу", + "ADDRESS_BOOK_DESC_2": "Вы сможете легко использовать эти адреса при выводе средств.", + "ADD_ADDRESS_LINK": "Добавить адрес", + "ADD_WITHDRAW_ADDRESS": "Добавить адрес вывода", + "DATE_ADDED": "Дата добавления", + "REMOVE": "Удалять", + "NO_LINK": "Адреса для вывода средств пока не добавлены.", + "ADD_WITHDRAW_ADDRESS_DESC_1": "Добавьте в белый список адрес, на который вы можете безопасно вывести монеты.", + "ADD_WITHDRAW_ADDRESS_DESC_2": "Адрес для вывода средств должен находиться под вашим контролем.", + "NAME_YOUR_ADDRESS_TITLE": "Назовите свой адрес", + "NAME_YOUR_ADDRESS_DESC": "Дайте этому адресу вывода денег название для дальнейшего использования.", + "USER_LABEL": "Имя/лейбл:", + "USER_FIELD_PLACEHOLDER": "Назовите этот адрес вывода средств", + "CHECK_AND_CONFIRM": "Проверить и подтвердить", + "WARNING_ADDRESS": "Прежде чем добавить этот адрес в свою адресную книгу, пожалуйста, проверьте и подтвердите правильность данных:", + "ENSURE_DESC": "Убедитесь, что адрес указан правильно и находится под вашим контролем.", + "ADDRESSES": "Адреса", + "WITHDRAWAL_ADDRESS_BOOK": "Адресная книга для снятия наличных", + "ADD_ADDRESS_DESC": "Добавить адрес вывода средств в {0}", + "ADDRESS_BOOK": "Адресная книга", + "MANAGE_ADDRESS_BOOK": "Управление адресной книгой", + "VIEW_ADDRESS_BOOK_LABEL": "Посмотреть адресную книгу", + "ADD_WITHDRAWAL_ADDRESS_LINK": "Добавить адрес вывода средств", + "REVOKE_ADDRESS": "Ваш адрес удален", + "REMOVE_ADDRESS": "Удалить адрес", + "REMOVE_CONTENT": "Хотите ли вы удалить этот адрес для вывода средств из своей адресной книги?" + }, + "VOLUME": { + "VOLUME": "ОБЪЕМ", + "BACK": "Назад", + "MARKETS": "РЫНКИ", + "CONVERT": "КОНВЕРТИРОВАТЬ", + "HISTORY": "ИСТОРИЯ", + "TRADING_VOLUME": "Объем торговли", + "VOLUME_DECS": "Суммы торгов на вашем счете за разные периоды времени, а также 3 основных актива, которыми торговали за каждый период", + "ALL_ASSETS": "все активы", + "DAY_VOLUME": "ДНЕВНОЙ ОБЪЕМ", + "HOUR_VOLUME": "24-ЧАСОВОЙ ОБЪЕМ", + "TOP": "ТОП {0} {1}", + "VOL_ASSET": "D ТОМ АКТИВ", + "NO_DATA_DESC_1": "Похоже, вы еще не совершали никаких сделок. Начните торговать сейчас, чтобы увидеть свою активность здесь!", + "NO_DATA_DESC_2": "Начать торговлю", + "NO_DATA_DESC_3": "теперь можно увидеть вашу активность здесь!", + "TRADE_VOLUME": "Объем торговли", + "VIEW_VOLUME": "СМОТРЕТЬ ОБЪЕМ", + "TRADE_DESCRIPTION": "Посмотрите ваш самый продаваемый актив", + "MARKET_TABLE_DESC": "Посетите страницу объема торговли {0}" + }, + "MORE_OPTIONS_LABEL": { + "MORE_OPTION_SEARCH_TXT": "Функция поиска или страницы", + "NO_RESULT_DESC_1": "Похоже, по этому запросу нет никаких результатов.", + "NO_RESULT_DESC_2": "Попробуйте выполнить поиск по другому ключевому слову.", + "ICONS": { + "REFERRALS": "Рефералы", + "BUY_CRYPTO": "Купить криптовалюту", + "API": "API", + "DEFI_STAKE": "Дефи Стейк", + "CEFI_STAKE": "Чефи Кол", + "PROFIT_LOSS": "Прибыли и убытки", + "LIMITS": "Пределы", + "LOGINS": "Логины", + "AUDIO": "Аудио" + }, + "HOT_FUNCTION": { + "HOT_FUNCTION_LABEL": "Горячие функции", + "ADD_FUNDS": "Добавить средства", + "TOP_UP": "Пополнение", + "LOAD": "Нагрузка", + "CREDIT": "Кредит", + "FUND_ACCOUNT": "Счет фонда", + "BTC": "биткойн", + "USTD": "доллар США", + "ETH": "эт", + "USD": "доллар США", + "XHT": "хт", + "TRANSFER": "передача", + "MONEY": "деньги", + "FUNDING": "финансирование", + "RECHARGE": "перезарядка", + "REFILL": "пополнение", + "CASH_IN": "наличные в", + "ADD_MONEY": "добавить деньги", + "EXCHANGE": "Обмен", + "SWAP": "Менять", + "BUY_SELL": "Купить/Продать", + "TRADE": "Торговля", + "CONVERT_CURRENCY": "Конвертировать валюту", + "INVITE": "Приглашать", + "REFER": "Ссылаться", + "REWARDS": "Награды", + "BONUS": "Бонус", + "AFFILIATION": "принадлежность", + "AFFILIATE": "филиал", + "PASSIVE_INCOME": "Пассивный доход", + "REVENUE": "доход" + }, + "OTHER_FUNCTIONS": { + "OTHER_FUNCTIONS_LABEL": "Другие функции", + "INTEGRATION": "Интеграция", + "PROGRAMMATIC_ACCESS": "Программный доступ", + "DEVELOPER": "Разработчик", + "AUTOMATED_TRADING": "Автоматизированная торговля", + "BOT": "Бот", + "ALGO": "Что-нибудь", + "ALGORITHM": "алгоритм", + "FIAT": "фиат", + "DOLLAR": "доллар", + "PURCHASE": "покупка", + "BUY_COIN": "Купить монету", + "BUY_TOKEN": "Купить токен", + "YIELD": "Урожай", + "INTEREST": "Интерес", + "REVENUE": "доход", + "CENTRALIZED_STAKING": "Централизованное размещение", + "PERFORMANCE": "Производительность", + "GAINS": "Прибыль", + "LOSSES": "Потери", + "PORTFOLIO_PROFIT": "Прибыль портфеля", + "LOSS": "потеря", + "PNL": "пожалуйста", + "CHARGES": "Обвинения", + "COSTS": "Расходы", + "COMMISSION": "Комиссия", + "TRADING_FEES": "Торговые сборы", + "TRANSACTION_FEES": "Комиссии за транзакции", + "RESTRICTIONS": "Ограничения", + "BOUNDARIES": "Границы", + "CAPS": "Крышки", + "MAXIMUM": "Максимум", + "WITHDRAWAL_LIMITS": "Лимиты на снятие средств", + "STORAGE": "Хранилище", + "FUNDS": "Фонды", + "BALANCE": "Баланс", + "CRYPTO_WALLET": "Крипто-кошелек", + "MY": "мой", + "ENGLISH": "английский", + "LOCALIZATION": "Локализация", + "TRANSLATE": "Переводить", + "LANGUAGE_SETTINGS": "Настройки языка", + "MULTILINGUAL": "Многоязычный", + "LANGUAGE_PREFERENCE": "Предпочтения языка", + "TEXT": "текст", + "WORD": "слово", + "PEER_TO_PEER": "Пиринговый", + "DIRECT_TRADE": "Прямая торговля", + "USER_TO_USER": "Пользователь-пользователю", + "PRIVATE_TRADE": "Частная торговля", + "TRANSACTIONS": "Транзакции", + "ACTIVITY": "Активность", + "RECORD": "Записывать", + "LOG": "Бревно", + "TRANSACTION_HISTORY": "История транзакций", + "LIQUIDITY": "Ликвидность", + "MARKET_VOLUME": "Объем рынка", + "TRADING_ACTIVITY": "Торговая деятельность", + "MARKETS": "рынки", + "CRYPTO": "крипто", + "TWO_FACTOR_AUTHENTICATION": "Двухфакторная аутентификация", + "MFA": "МИД", + "AUTHENTICATOR": "Аутентификатор", + "OTP": "отп", + "CREDENTIALS": "Реквизиты для входа", + "PASSWORD_RESET": "Сброс пароля", + "SIGN_INS": "Входы", + "ACCOUNT_ACCESS": "Доступ к аккаунту", + "SESSION_HISTORY": "История сеанса", + "LOGGED_IN": "Вы вошли в систему", + "SESSION_MANAGEMENT": "Управление сеансом", + "CURRENT_SESSIONS": "Текущие сессии", + "BANKING_DETAILS": "Банковские реквизиты", + "BANK_ACCOUNT": "Банковский счет", + "FINANCIAL_INSTITUTION": "Финансовое учреждение", + "BANK_INFO": "Информация о банке", + "WITHDRAWAL_ACCOUNT": "Счет для снятия средств", + "FUND": "фонд", + "SOUND": "Звук", + "AUDIO_SETTINGS": "Настройки звука", + "ALERTS": "Оповещения", + "NOTIFICATIONS": "Уведомления", + "AUDIO_ALERTS": "Звуковые оповещения", + "SECURITY": "безопасность", + "CONTACT": "Контакт", + "EMAIL_ADDRESS": "Адрес электронной почты", + "MAIL": "Почта", + "EMAIL_CONTACT": "Контакт по электронной почте", + "KYC": "кик", + "SMS": "SMS", + "KYC_CAPS": "ЗСК", + "ID": "ИДЕНТИФИКАТОР", + "PERSONAL_INFO": "Личная информация", + "IDENTITY_CHECK": "Проверка личности", + "PAYOUT": "Выплата", + "CASH_OUT": "Выплата наличными", + "REMOVE_FUNDS": "Удалить средства", + "OUT": "Вне", + "SUPPORT": "поддерживать", + "CONTACT_LOWER": "контакт", + "EMAIL_LOWER": "электронная почта", + "RESOURCE": "ресурсы", + "GUIDES": "гиды", + "FAQ": "Часто задаваемые вопросы", + "CUSTOMER_SERVICE": "обслуживание клиентов", + "ASSISTANCE": "помощь", + "API_LOWER": "апи", + "MESSAGE": "сообщение", + "LIVE_CHAT": "живой чат", + "SETTINGS": "настройки", + "ALERT": "Тревога", + "UPDATES": "Обновления", + "REMINDERS": "Напоминания", + "UI": "Пользовательский интерфейс", + "USER_INTERFACE": "Пользовательский интерфейс", + "LAYOUT": "Макет", + "DESIGN": "Дизайн", + "DASHBOARD": "Панель инструментов", + "COLOR_THEME": "цветовая тема", + "ORDER_BOOK": "книга заказов", + "DARK": "темный", + "LIGHT": "свет", + "WITHDRAWAL_ADDRESSES": "Адреса для снятия средств", + "CRYPTO_ADDRESSES": "Крипто-адреса", + "WALLET_ADDRESSES": "Адреса кошельков", + "SAVED_ADDRESSES": "Сохраненные адреса", + "ADDRESS_BOOK": "Адресная книга", + "WHITE_LISTED": "белый список" + } + }, + "CONNECTIONS": { + "CHECK_CONNECTION": "Проверить соединение", + "IP": "ИС", + "NORMAL_TEXT": "Нормальный", + "CONNECTION_ISSUE": "Проблема с подключением", + "SESSION": "Сессия", + "SERVER_TIME": "Время сервера", + "PING": "Пинг", + "CHECK_PING": "ПРОВЕРКА ПИНГА", + "RECONNECT": "Повторное подключение", + "TOOLTIP_DESC_1": "Проверьте пинг до сервера обмена {0}", + "TOOLTIP_DESC_2": "Чем меньше «мс», тем лучше", + "LOGGED_IN_AT": "Авторизован в", + "RECONNECT_DESC": "Повторное подключение может решить неизвестные проблемы, с которыми вы столкнулись.", + "CONFIRM_RECONNECT_MESSAGE": "Хотите восстановить соединение?", + "PING_CHECK_TEXT": "Пинг сервера. Пожалуйста, подождите...", + "RECHECK_PING": "ПЕРЕПРОВЕРЬТЕ ПИНГ", + "FAST": "Быстрый", + "SLOW": "Медленный", + "MS": "{0} мс", + "STATUS_NORMAL": "Нормальное соединение", + "CONNECTION_LABEL": "Связь", + "CONNECTION_ISSUE_DETECTED": "Обнаружена проблема с подключением" + }, + "DESKTOP_NAVIGATION": { + "OTHERS": "Другие", + "SUMMARY_DESCRIPTION": "Информация на уровне учетной записи и доступность", + "FEES_LIMITS_DESC": "Комиссии за торговлю и снятие средств. Лимиты по счету", + "VOLUME_DESC": "Сводка объема торговли с течением времени", + "DEPOSIT_DESC": "Доступ к вариантам пополнения кошелька", + "BALANCE_DESC": "Все ваши активы и их остатки", + "PERFORMANCE_DESC": "Прибыль и убыток кошелька", + "HISTORY_DESC": "Просмотрите все сделки, депозиты и выводы средств", + "ADDRESS_BOOK_DESC": "Свяжитесь с адресной книгой для вывода средств", + "WITHDRAW_DESC": "Вывод средств и переводы с кошелька", + "ASSETS_DESC": "Отслеживайте цены и находите данные об активах", + "CONVERT_DESC": "Обменяйте любой актив на другой просто", + "MARKET_DESC": "Рынки книг заказов спотовой торговли.", + "P2P_DESC": "Криптовалютная торговля", + "REFERRAL_DESC": "Получайте пассивный доход, приглашая друзей", + "CEFI_STAKE_DESC": "Сделайте стейкинг актива из вашего биржевого кошелька", + "DEFI_STAKE_DESC": "Подключите кошелек и застейкайте свой актив", + "BUY_CRYPTO_DESC": "Купить через прямой банковский перевод или карту", + "SECURITY_DESC": "2FA аккаунта, пароль и API", + "VERIFICATION_DESC": "Проверка личности учетной записи", + "SETTINGS_DESC": "Интерфейс и другие настройки аккаунта", + "SUMMARY_PAGE": "Страница резюме", + "SIGNOUT_DESC": "Выход из учетной записи", + "LANGUAGE_DESC": "Изменить языковые предпочтения", + "API_DESC": "Используйте ключи API для программного доступа к вашей учетной записи", + "HELP_DESC": "Получить помощь. Связаться со службой поддержки", + "TRANSACTION_DESC": "Просмотрите все сделки, депозиты и выводы средств", + "ONRAMPER_DESC": "Используйте Onramper для покупки и продажи криптовалюты" } } \ No newline at end of file diff --git a/web/src/config/lang/tr.json b/web/src/config/lang/tr.json index e18293592a..7fa6ce6f8f 100644 --- a/web/src/config/lang/tr.json +++ b/web/src/config/lang/tr.json @@ -107,7 +107,7 @@ "OPTION_BUG": "Bug raporla", "OPTION_PERSONAL_INFO": "Kişisel bilgiyi değiştir", "OPTION_BANK_TRANSFER": "Banka EFT transferi", - "OPTION_REQUEST": "HollaEx Borsası için davet oluşturun" + "OPTION_REQUEST": "Borsası için davet oluşturun" }, "SUBJECT_LABEL": "Konu", "SUBJECT_PLACEHOLDER": "Sorunun konusunu yazınız", @@ -127,7 +127,8 @@ }, "QR_CODE": "Bu QR kodu, size fon göndermek isteyen kişi tarafından okutulabilir.", "NO_DATA": "Bilgi yok", - "QR_CODE_TITLE": "{0} Para Yatırma Bilgileri" + "QR_CODE_TITLE": "{0} Para Yatırma Bilgileri", + "VIEW_DEPOSIT": "Depozitoyu Görüntüle" }, "LOGIN": { "LOGIN_TO": "{0}'a giriş yapın", @@ -248,7 +249,10 @@ "MOBILE_WALLET_BALANCE_LABEL": "Terazi/Doğu. USDT", "MOBILE_WALLET_SHARE_LABEL": "%Paylaş/Tah. USDT", "VIEW_MORE_WALLET_INFO": "DAHA FAZLA CÜZDAN BİLGİSİNİ GÖRÜNTÜLEYİN", - "VIEW_WALLET_TRANSACTION_HISTORY": "CÜZDAN İŞLEM GEÇMİŞİNİ GÖRÜNTÜLEYİN" + "VIEW_WALLET_TRANSACTION_HISTORY": "CÜZDAN İŞLEM GEÇMİŞİNİ GÖRÜNTÜLEYİN", + "ORDERS_HOLD": "{0} {1} bakiyeniz var ve bu da {4} bakiyenizde {2} {3} tutarında bir beklemeye neden oluyor", + "OPEN_ORDERS_SINGULAR": "açık sipariş", + "VIEW_WALLET": "Cüzdanı görüntüle" }, "REQUEST_RESET_PASSWORD": { "TITLE": "Hesap Kurtarma", @@ -555,7 +559,8 @@ "CANCEL": "İptal etmek", "PLACEHOLDER": "Buraya yaz" } - } + }, + "TITLE_TEXT": "Arayüz düzeni, bildirim tercihleri, kullanıcı adı ve diğer özelleştirmeler gibi tercihlerinizi düzenleyerek hesap ayarlarınızı gözden geçirin." }, "TRANSACTION_HISTORY": { "TITLE": "Geçmiş", @@ -758,7 +763,10 @@ "TITLE": "MetaMask'ı yükleyin", "PROMPT": "Tarayıcınıza Metamask'ı yüklemelisiniz: {0}" }, - "INSTALL_METAMASK_TITLE": "MetaMask algılanmadı" + "INSTALL_METAMASK_TITLE": "MetaMask algılanmadı", + "EARN_REWARD": "Dijital varlıklarınızı stake ederek ödüller kazanın", + "DEFI_STAKING": "DeFi Staking", + "CEFI_STAKING": "CeFi Stakingi" }, "UNSTAKE": { "TITLE": "Stake İptal", @@ -876,13 +884,13 @@ "FORFEITURE_OF_EARNINGS_DETAILS_LABEL": "Kazançların Kaybedilmesi", "STAKE_AMOUNT_LABEL": "Stake Miktarı", "DISCLAIMER_NOTICE": "Not: 1.000 ABD Doları üzerinde değerlendirilen miktarlar için kimlik doğrulamasını tamamlamanız gerekeceğini unutmayın. Bu miktar kazançları içerir ve platform ekstra kullanıcı bilgileri talep etme hakkını saklı tutar.", - "SETTLEMENT_NOTICE": "Ödeme: Unstaking sonrası 24 saatlik bir uzlaşma dönemi uygulanacaktır.", + "SETTLEMENT_NOTICE": "{0} Stake'ten çıkılması durumunda 24 saatlik bir yerleşim süresi uygulanacaktır.", "CONFIRM_BUTTON": "Onayla", "STAKE_RULES_NOTICE": "Stake yaptığınızda havuzun kurallarına bağlı olacaksınız.", "I_UNDERSTAND_AGAIN_BUTTON": "Tekrar Anladım", "CONGRATULATIONS_NOTICE": "Tebrikler!", "EARNINGS_START_NOTICE": "Stake'iniz kazanmaya başlayacak.", - "REVIEW_PROGRESS_LABEL": "Açık Stakeler sayfasında stakenizin ilerlemesini inceleyebilirsiniz.", + "REVIEW_PROGRESS_LABEL": "Bahsinizin ilerlemesini {0} adresinden inceleyebilirsiniz", "TIME_REMAINING_LABEL": "Kalan Zaman", "PENALTY_UPON_INITIAL_STAKE_PRINCIPLE_LABEL_2": "Başlangıç ​​Stake İlkesi Üzerinden Cezalar", "FORFEITURE_OF_EARNINGS_LABEL_2": "Kazançların Kaybedilmesi", @@ -892,7 +900,26 @@ "VISIT_WALLET_BUTTON": "CÜZDANI GÖRÜNTÜLE", "CLOSE_BUTTON": "KAPAT", "ACTIVE_STAKES": "Aktif Bahisler", - "STAKES_HISTORY": "Tarih" + "STAKES_HISTORY": "Tarih", + "SETTLEMENT_NOTICE_TITLE": "Yerleşim:", + "REVIEW_PROGRESS_ACTIVE_LINK": "Aktif Bahisler sayfası", + "STAKING": "Bahis 101", + "SLASHING": "Kesme", + "MINIMUM_AMOUNT_ALLOWED": "Staking havuzunun izin verdiği minimum miktar", + "MAXIMUM_AMOUNT_ALLOWED": "Staking havuzunun izin verdiği maksimum miktar", + "DAYS": "Günler", + "CONFIRM_STAKE_DECS": "İşte başlıyoruz!", + "DO_YOU_UNDERSTAND": "Anlıyor musunuz?", + "SUCCESSFULLY_STAKED_IN": "Başarıyla kazıklandı", + "SUCCESSFULLY_STAKED": "Başarıyla bahis yapıldı", + "VIEW_ACTIVE_STAKES": "AKTİF Stake'leri görüntüle", + "REVIEW_AND_UNSTAKE": "Gözden geçir ve bahisleri kaldır", + "NO_REWARD": "Alınacak ödül miktarı yok", + "SUCCESSFULLY_UNSTAKED": "Başarıyla stake'inizi kaldırdınız", + "MIN": "Dakika", + "UNSTAKING": "ÇÖZÜLÜYOR...", + "UNSTAKED": "KURAL DIŞI", + "TOOLTIP": "Çok erken stake'inizi iptal ederseniz karşılaşacağınız ceza. {0}" }, "MOVE_XHT": { "TITLE": "XHT Aktarımı", @@ -1031,7 +1058,9 @@ "ENTER_AMOUNT": "Miktarı girin", "REMOVE_TITLE": "Etiketi kaldır", "MAX_AMOUNT_WARNING_INFO": "Bu tutar maksimum para çekme limitinizi aşıyor.", - "ZERO_BALANCE": "Yeterli bakiyeniz yok." + "ZERO_BALANCE": "Yeterli bakiyeniz yok.", + "MIN_AMOUNT_WARNING_INFO": "Minimum çekim tutarı {0}", + "NEW_ADDRESS": "Yeni Adres" }, "WALLET_BUTTON_BASE_DEPOSIT": "yatırım", "WALLET_BUTTON_BASE_WITHDRAW": "çekim", @@ -1367,7 +1396,8 @@ "INSUFFICIENT_LABEL": "Yetersiz Takas Tutarı", "INSUFFICIENT_INFO_1": "Kazançlarınız şu anda ödeme için yeterli değil. Lütfen yönlendirme bağlantınızı kullanarak daha fazla üye davet edin ve henüz ödenmemiş kazançlarınız elde edilene kadar bekleyin {0} {1}", "INSUFFICIENT_INFO_2": "1'i aş", - "GO_TO_REFERRAL": "Yönlendirmeye Git" + "GO_TO_REFERRAL": "Yönlendirmeye Git", + "REFER_DESC": "Aşağıdaki bağlantıyı arkadaşlarınızla paylaşın ve onların ticaretinden komisyon kazanmaya başlayın" }, "NOT_LOGGEDIN": { "TXT_1": "İşlem yapmak için giriş yapmanız gerekmektedir", @@ -1442,7 +1472,11 @@ "TRADING_SYMBOL": "Ticaret Sembolü", "ASSET": "Varlık", "TYPE": "Tip", - "SOURCE": "KAYNAK" + "SOURCE": "KAYNAK", + "PERCENTAGE": "% {0}", + "24H": "24 saat", + "TREND_7D": "Trend 7D", + "BUY": "{0} {1} satın al" }, "PAGE_UNDER_CONSTRUCTION": "Bu sayfa yapım aşamasındadır. Lütfen bu sayfayı daha sonra tekrar kontrol ediniz.", "UNDEFINED_ERROR_TITLE": "Tanımlanmamış Hataya sebep oldunuz.", @@ -1711,7 +1745,8 @@ "WALLET_BALANCE_ESTIMATE": "Bugünün cüzdan bakiyesi tahmini ", "VIEW_BALANCE_HISTORY": "BAKİYE GEÇMİŞİNİ GÖRÜNTÜLE", "VIEW_PERCENTAGE_SHARE": "YÜZDE PAYI GÖRÜNTÜLE", - "VIEW_WALLET_P&L": "CÜZDAN K&Z'Yİ GÖRÜNTÜLE" + "VIEW_WALLET_P&L": "CÜZDAN K&Z'Yİ GÖRÜNTÜLE", + "BALANCE_PERCENTAGE": "Bakiye Yüzdesi" }, "ASSET_INFO": "Varlık bilgisi", "TAKER_FEES_APPLIED": "Alıcı ücretleri uygulanır", @@ -1729,7 +1764,18 @@ "ORDERBOOK": "Sipariş defteri", "NETWORK": "Ağ Brokerı OTC", "BROKER": "Yerel Broker OTC", - "BROKERAGE": "NA - (Komisyonculuk)" + "BROKERAGE": "NA - (Komisyonculuk)", + "LOADING_PRICES": "Fiyatlar yükleniyor...", + "INPUT_LABEL": "Giriş varlık adı veya sembolü", + "HIGHLIGHTS": "Önemli Noktalar", + "MOBILE_DESC": "İşlem yapmaya başlamak için aşağıdan bir pazar seçin.", + "PRICE_24H": "Fiyat/24H %", + "CARDS": { + "GAINERS": "Kazananlar", + "LOSERS": "Kaybedenler", + "MARKET_CAP": "Piyasa Değeri", + "24H": "{0} 24 saat" + } }, "HOLLAEX_TOKEN": { "REMOVE_FAVOURITES": "Favorilerinden kaldır", @@ -1775,7 +1821,8 @@ "TAG": "Etiket:", "DISABLED_DEPOSIT_CONTENT": "Para yatırma işlevi geçici olarak kullanılamıyor.", "DISABLED_WITHDRAW_CONTENT": "Para çekme işlevi geçici olarak kullanılamıyor.", - "DEPOSIT_LABEL": "Depozito" + "DEPOSIT_LABEL": "Depozito", + "VOLUME": "HACİM" }, "ASYNC_LINK": { "TITLE": "Sayfa otomatik olarak açılmıyor mu?", @@ -2048,7 +2095,7 @@ "TOTAL_ASSET_SELL_1": "Toplam", "TOTAL_ASSET_SELL_2": "satabilirsin", "BUY_ORDER_LIMITS": "SATIN ALMA SİPARİŞ LİMİTLERİ", - "MIN_MAX_ORDER_VALUE_1": "Minimum ve maksimum", + "MIN_MAX_ORDER_VALUE_1": "Minimum ve maksimum {0} {1}", "MIN_MAX_ORDER_VALUE_2": "satın alma siparişi değeri", "PAYMENT_METHODS_SEND_FIAT": "FIAT GÖNDERMEK İÇİN ÖDEME YÖNTEMLERİ", "SELECT_PAYMENT_METHODS_1": "Şuna kadar seç:", @@ -2064,7 +2111,7 @@ "DEAL_EDITED": "Anlaşma düzenlendi", "DEAL_CREATED": "Anlaşma oluşturuldu", "NEXT": "SONRAKİ", - "ADD_PAYMENT_METHOD_DETAILS": "Ödeme Yöntemi Ayrıntılarını Ekle", + "ADD_PAYMENT_METHOD_DETAILS": "{0} Ödeme Yöntemi Ayrıntıları", "COMPLETE": "Tamamlamak", "STEP_SET_TYPE_PRICE": "Türü ve fiyatı belirleyin", "STEP_SET_TOTAL_AMOUNT_PAYMENT_METHODS": "Toplam tutarı ve ödeme yöntemlerini ayarlayın", @@ -2094,6 +2141,400 @@ "ALL_REGION": "Tüm Bölge", "BUYER_NOT_MADE_THE_PAYMENT": "Alıcı henüz ödemesini onaylamadı.", "PRICE_TO_ADVERTISE": "Satış için ilan vereceğiniz fiyat", - "VIEW_PROFILE": "Satıcının profilini görüntüle" + "VIEW_PROFILE": "Satıcının profilini görüntüle", + "P2P_METHODS": "P2P Ödeme Yöntemleri", + "PAYMENT_METHODS": "ÖDEME YÖNTEMLERİ", + "PAYMENT_METHODS_DEC": "Banka bilgileri veya diğer yerel ödeme yöntemleri gibi kişisel ödeme hesabı bilgilerinizi ekleyerek kripto para birimleri satabilir ve itibari ödemeler alabilirsiniz. Ödeme bilgilerinizi eklemeden önce ödeme hesabınızla ilişkili adın doğrulanmış bilgilerinizdeki adla eşleştiğinden emin olun.", + "SELL_AMOUNT": "Satış Miktarı", + "ADD_PAYMENT_METHOD": "+ ÖDEME YÖNTEMİ EKLE", + "REMOVE": "KALDIRMAK", + "DYNAMIC": "DİNAMİK", + "TYPE": "TİP", + "BACK_TO_ORDERS": "emirlere", + "FUNDS_TRANSFERRED_USER": "Kullanıcı işlemi onayladı ve para bakiyenize aktarıldı.", + "CONFIRM_TRANSFER_USER": "TRANSFERİ ONAYLA VE KULLANICIYA BİLDİR", + "BUYER_SENT_FUNDS_USER": "Kullanıcıya fonları gönderdiğinizi bildirdiniz. Lütfen kullanıcıdan bir yanıt bekleyin.", + "VENDOR_CONFIRMED_ORDER_USER": "Kullanıcı işlemi onayladı ve parayı serbest bıraktı.", + "BUY_UPPER": "SATIN ALMAK", + "CRYPTO_WANT_TO_BUY": "Satın almak istediğiniz kripto para", + "FIAT_CURRENCY_WANT_TO_SPEND": "Harcanacak fiat para birimi", + "PRICE_ADVERTISE": "{0} reklamını yapacağınız fiyat", + "TOTAL_AMOUNT": "Toplam Tutar", + "BUY_SELL_DESC": "{0} yapabilirsiniz", + "SELL_ORDER_LIMITS": "SATIŞ SİPARİŞİ SINIRLARI", + "MIN_MAX_ORDER_VALUE_3": "satış emri değeri", + "PAYMENT_METHODS_RECEIVE_FIAT": "FIAT ALMAK İÇİN ÖDEME YÖNTEMLERİ", + "PAYMENT_TIME_LIMIT_LABEL": "Ödeme süresi sınırı: {0}", + "30_MINUTES": "30 Dakika", + "DELETE_UPPERCASE": "SİLMEK", + "CLICK_TO_VIEW": "GÖRÜNTÜLEMEK İÇİN TIKLAYIN", + "NEW_MESSAGE": "Bir P2P mesajı aldınız", + "STATUS_UPDATE": "P2P siparişinizle ilgili bir güncellemeniz var", + "APPEAL_STATUS_MESSAGE": "P2P siparişinize itiraz edildi", + "CANCEL_STATUS_MESSAGE": "P2P siparişiniz iptal edildi", + "CONFIRM_STATUS_MESSAGE": "P2P siparişiniz onaylandı", + "NEW_ORDER_CREATED": "Yeni P2P Düzeni oluşturuldu", + "CRYPTO_RELEASE_STATUS_MESSAGE": "Kripto paralar siparişten çıkarıldı", + "ADDITIONAL_PAYMENT_DETAILS": "Ek ödeme ayrıntıları ekleyin", + "PAYMENT_FIELD_INFO": "Bu yeni ödeme alanı ektir ve P2P katılımcılarına itibari para transferlerinde yardımcı olmalıdır. Bu, ödeme yöntemiyle ilgili hesap ayrıntıları olmalıdır. Bu, ödeme yöntemleri sistemine bağlı olarak telefon numaraları, kullanıcı adları, benzersiz hesap numaraları ve işlemler için gerekli diğer bilgileri içerebilir.", + "PAYMENT_DETAIL_NAME": "Ödeme detay adı", + "REQUIRED_OR_OPTIONAL": "Gerekli veya isteğe bağlı", + "CREATE_NEW_PAYMENT_METHODS": "Yeni ödeme yöntemleri oluşturun ve ekleyin", + "MANUAL_PAYMENT_METHOD_ENTRY": "P2P platformunuza bir ödeme yöntemi eklemek için, ödeme yönteminin adını ve gerekli ödeme ayrıntılarını girerek bunu manuel olarak yapabilirsiniz. Örneğin, PayPal para göndermek ve almak için e-posta adreslerini kullanır.", + "USERS_PAYMENT_SELECTION": "Ödeme yöntemi eklendiğinde, P2P satıcılarınız ve kullanıcılarınız ödeme yaparken veya alırken bunu seçebilecek ve gerekli bilgileri girebilecektir. Sağladıkları bilgiler P2P işleminde diğer tarafla paylaşılacaktır.", + "METHOD_NAME_AND_DETAIL": "Yöntemin adı ve ana ödeme ayrıntısı", + "ADD_NEW_PAYMENT_METHODS": "Yeni ödeme yöntemlerini seçin:", + "DETAIL_NAME": "Ödeme detay adı", + "DETAIL_VALUE": "Ödeme detay değeri", + "DETAIL_REQUIRED": "Gerekli", + "IMPORTANT_DETAIL": "(Önemli ödeme detayı)", + "DETAIL_OPTIONAL": "İsteğe bağlı", + "OPTIONAL_DETAIL": "(İsteğe bağlı ödeme detayı)", + "ADD_NEW_PAYMENT_FIELD": "Yeni ödeme ayrıntısı alanı ekle", + "PAYMENT_METHOD_CREATED": "Ödeme yöntemi oluşturuldu! Yönetici tarafından doğrulanması bekleniyor", + "PAYMENT_METHOD_DELETED": "Ödeme yöntemi silindi.", + "PAYMENT_METHOD_UPDATED": "Ödeme yöntemi güncellendi.", + "CRYPTO": "Kripto:", + "INPUT_SPEND_AMOUNT": "Harcama tutarını girin", + "INPUT_SELL_AMOUNT": "Satış tutarını girin", + "TIMES": "kez", + "FEEDBACK": "Geri bildirim", + "ASSET": "Varlık: ", + "CUSTOM": "Gelenek", + "CANCELLED": "İptal edildi", + "APPEALED": "Temyiz edildi", + "EXPIRED": "Günü geçmiş", + "RATE": "Oran:", + "BUYING": "{0} satın alma", + "SELLING": "{0} satışı", + "TERMS_AND_CONDITION_DESCRIPTION": "Lütfen anlaşmanın gerçekleşmesinden itibaren 15 dakika içinde gönderin", + "VISIT_OUR_WEBSITE": "Web sitemizi ziyaret edin", + "SELECT_PAYMENT_SYSTEM_LABEL": "Ödeme Sistemini Seçin", + "FIELD": "Alan", + "NEW_PAYMENT_PLACEHOLDER": "Ödeme ayrıntı değerini girin", + "FIELD_VALIDATION_TEXT": "Lütfen tüm yöntem alanlarını girin", + "INPUT_METHOD_NAME_TEXT": "Lütfen yöntem adını girin", + "INPUT_PAYMENT_DETAIL_TEXT": "Ödeme ayrıntı adını girin", + "UNVERIFIED": "Doğrulanmamış", + "VERIFIED": "Doğrulandı", + "AMOUNT_RECEIVE": "bakiyenizden serbest bırakılacak", + "DELETE_WARNING": "Bu ödeme yöntemini silmek istediğinizden emin misiniz?", + "STEP_1": "Adım 1/3", + "STEP_2": "Adım 2/3", + "STEP_3": "Adım 3/3", + "P2P_ORDER_CREATED": "P2P Siparişi Oluşturuldu", + "VENDOR_CHECKS_TITLE": "Ödemeyi Kontrol Et ve Onayla", + "FUND_RELEASED": "Fonlar serbest bırakıldı", + "ORDER_EXPIRY": "Siparişin son kullanma tarihi", + "MINIMUM_AMOUNT_WARNING": "Minimum {0} {1}'dir", + "MAXIMUM_AMOUNT_WARNING": "Maksimum {0} {1}'dir", + "ORDER_CREATION": "Sipariş Oluşturma", + "ORDER_CREATION_DESC_1": "'Sipariş Oluştur'a tıklayarak, satıcıyı bilgilendirecek ve anında fiyat teklifi ve kesin ödeme transfer ayrıntılarını alacaksınız. {0} {1} {2} {3}", + "ORDER_CREATION_DESC_2": "Bu, siparişinizi tamamlamak için gereken tam tutarı içerir.", + "YOU_HAVE_TEXT": "Sahip olacaksın", + "COMPLETE_PAYMENT_PROCESS": "Ödeme transfer işlemini tamamlamak için.", + "WARINNG_DESC": "Lütfen yalnızca siparişi tamamlamayı gerçekten düşünüyorsanız sipariş oluşturma işlemine devam edin.", + "ORDER_CANCEL_DESC": "Siparişin iptal edilmesi hesabın askıya alınmasına neden olabilir.", + "CONFIRM_ORDER_CREATION": "{0} işlemine hazır olduğunuzda lütfen aşağıdaki 'Sipariş Oluştur' butonuna tıklayın.", + "SEND_MONEY": "parayı gönder", + "RECEIVE_MONEY": "parayı al", + "CREATE_ORDER": "Sipariş Oluştur", + "NO_ORDERS_DESC": "Burada herhangi bir emir bulunmuyor gibi görünüyor.", + "NO_DEALS_DESC": "Burada hiçbir anlaşma yok gibi görünüyor.", + "ONLINE": "ÇEVRİMİÇİ", + "OFFLINE": "ÇEVRİMDIŞI", + "SELECT_CRYPTO": "Kriptoyu seçin", + "REMOVE_WARNING": "Bu fırsatı kaldırmak istediğinizden emin misiniz?", + "SHOW_FILTERS": "FİLTRELERİ GÖSTER", + "HIDE_FILTERS": "FİLTRELERİ GİZLE", + "ORDERS_COMPLETED": "Tamamlanan siparişler:", + "CANCEL_WARNING_TEXT": "Sık sık gerçekleşen sipariş iptallerinin herkese açık P2P profilinizi olumsuz etkileyebileceğini ve hesabınızın askıya alınmasına yol açabileceğini lütfen unutmayın.", + "UPDATE": "Güncelleme", + "TERMS_ERROR_TEXT": "Lütfen Terimler alanını girin", + "RESPONSE_ERROR_TEXT": "Lütfen Cevap alanını girin" + }, + "CUSTOM_NATIVE_CURRENCY": "Para Birimi (Fiyatlandırma ve varlık değeri tahminleri)", + "ADDRESS_BOOK": { + "ADDRESS_BOOK_LABEL": "Adres defteri", + "ADDRESS_BOOK_DESC_1": "Kişisel adres defterinize beyaz listeye alınmış bir çekim adresi ekleyin", + "ADDRESS_BOOK_DESC_2": "Para çekme işlemlerinizde bu adresi rahatlıkla kullanabileceksiniz.", + "ADD_ADDRESS_LINK": "Adres ekle", + "ADD_WITHDRAW_ADDRESS": "Çekme adresini ekle", + "DATE_ADDED": "Eklenme tarihi", + "REMOVE": "Kaldırmak", + "NO_LINK": "Henüz çekim adresi eklenmedi.", + "ADD_WITHDRAW_ADDRESS_DESC_1": "Güvenli bir şekilde coin çekebileceğiniz beyaz listeye alınmış bir adres ekleyin.", + "ADD_WITHDRAW_ADDRESS_DESC_2": "Bu çekim adresi sizin kontrolünüzde olan bir adres olmalıdır.", + "NAME_YOUR_ADDRESS_TITLE": "Adresinizi belirtin", + "NAME_YOUR_ADDRESS_DESC": "Gelecekte referans olması açısından bu çekim adresine bir isim verin.", + "USER_LABEL": "İsim/etiket:", + "USER_FIELD_PLACEHOLDER": "Bu çekim adresini adlandırın", + "CHECK_AND_CONFIRM": "Kontrol edin ve onaylayın", + "WARNING_ADDRESS": "Bu adresi adres defterinize eklemeden önce lütfen ayrıntıların doğruluğunu kontrol edip onaylayın:", + "ENSURE_DESC": "Adresin doğru ve kontrolünüzde olduğundan emin olun.", + "ADDRESSES": "Adresler", + "WITHDRAWAL_ADDRESS_BOOK": "Para çekme adres defteri", + "ADD_ADDRESS_DESC": "Para çekme adresini {0} adresine ekleyin", + "ADDRESS_BOOK": "Adres defteri", + "MANAGE_ADDRESS_BOOK": "Adres defterini yönet", + "VIEW_ADDRESS_BOOK_LABEL": "Adres defterini görüntüle", + "ADD_WITHDRAWAL_ADDRESS_LINK": "Para çekme adresini ekle", + "REVOKE_ADDRESS": "Adresiniz Kaldırıldı", + "REMOVE_ADDRESS": "Adresi Kaldır", + "REMOVE_CONTENT": "Bu çekim adresini adres defterinizden kaldırmak istiyor musunuz?" + }, + "VOLUME": { + "VOLUME": "HACİM", + "BACK": "Geri", + "MARKETS": "PAZARLAR", + "CONVERT": "DÖNÜŞTÜRMEK", + "HISTORY": "TARİH", + "TRADING_VOLUME": "Ticaret Hacmi", + "VOLUME_DECS": "Hesabınızda farklı zaman dilimlerinde işlem gören tutarlar ve her dönemde işlem gören en büyük 3 varlık", + "ALL_ASSETS": "tüm varlıklar", + "DAY_VOLUME": "GÜN HACMİ", + "HOUR_VOLUME": "24 SAATLİK HACİM", + "TOP": "ÜST {0} {1}", + "VOL_ASSET": "D CİLT VARLIK", + "NO_DATA_DESC_1": "Görünüşe göre henüz hiçbir işlem yapmadınız. Etkinliğinizi burada görmek için hemen işlem yapmaya başlayın!", + "NO_DATA_DESC_2": "Ticarete başla", + "NO_DATA_DESC_3": "şimdi aktivitenizi burada göreceğiz!", + "TRADE_VOLUME": "Ticaret Hacmi", + "VIEW_VOLUME": "HACMİ GÖRÜNTÜLE", + "TRADE_DESCRIPTION": "En çok işlem gören varlığınızı görüntüleyin", + "MARKET_TABLE_DESC": "İşlem hacmi sayfanızı ziyaret edin {0}" + }, + "MORE_OPTIONS_LABEL": { + "MORE_OPTION_SEARCH_TXT": "Arama özelliği veya sayfaları", + "NO_RESULT_DESC_1": "Görünüşe göre bununla ilgili herhangi bir sonuç yok.", + "NO_RESULT_DESC_2": "Başka bir anahtar kelimeyle aramayı deneyin.", + "ICONS": { + "REFERRALS": "Yönlendirmeler", + "BUY_CRYPTO": "Kripto satın al", + "API": "API", + "DEFI_STAKE": "Defi Hissesi", + "CEFI_STAKE": "Cefi Hissesi", + "PROFIT_LOSS": "Kâr ve Zarar", + "LIMITS": "Sınırlar", + "LOGINS": "Girişler", + "AUDIO": "Ses" + }, + "HOT_FUNCTION": { + "HOT_FUNCTION_LABEL": "Sıcak fonksiyonlar", + "ADD_FUNDS": "Para Ekle", + "TOP_UP": "Üst-yükleme", + "LOAD": "Yük", + "CREDIT": "Kredi", + "FUND_ACCOUNT": "Fon Hesabı", + "BTC": "btc", + "USTD": "usdt", + "ETH": "et", + "USD": "Amerikan Doları", + "XHT": "xht", + "TRANSFER": "transfer", + "MONEY": "para", + "FUNDING": "fonlama", + "RECHARGE": "şarj etmek", + "REFILL": "yeniden doldurmak", + "CASH_IN": "nakite çevirmek", + "ADD_MONEY": "para ekle", + "EXCHANGE": "Değişme", + "SWAP": "Takas", + "BUY_SELL": "Al/Sat", + "TRADE": "Ticaret", + "CONVERT_CURRENCY": "Para Birimini Dönüştür", + "INVITE": "Davet etmek", + "REFER": "Bahsetmek", + "REWARDS": "Ödüller", + "BONUS": "Bonus", + "AFFILIATION": "bağlılık", + "AFFILIATE": "bağlı kuruluş", + "PASSIVE_INCOME": "Pasif Gelir", + "REVENUE": "hasılat" + }, + "OTHER_FUNCTIONS": { + "OTHER_FUNCTIONS_LABEL": "Diğer Fonksiyonlar", + "INTEGRATION": "Entegrasyon", + "PROGRAMMATIC_ACCESS": "Programatik Erişim", + "DEVELOPER": "Geliştirici", + "AUTOMATED_TRADING": "Otomatik Ticaret", + "BOT": "Bot", + "ALGO": "Bir şey", + "ALGORITHM": "algoritma", + "FIAT": "fiat", + "DOLLAR": "dolar", + "PURCHASE": "satın almak", + "BUY_COIN": "Coin satın al", + "BUY_TOKEN": "Token satın al", + "YIELD": "Teslim olmak", + "INTEREST": "Faiz", + "REVENUE": "hasılat", + "CENTRALIZED_STAKING": "Merkezi Staking", + "PERFORMANCE": "Performans", + "GAINS": "Kazançlar", + "LOSSES": "Kayıplar", + "PORTFOLIO_PROFIT": "Portföy karı", + "LOSS": "kayıp", + "PNL": "lütfen", + "CHARGES": "Ücretler", + "COSTS": "Maliyetler", + "COMMISSION": "Komisyon", + "TRADING_FEES": "İşlem Ücretleri", + "TRANSACTION_FEES": "İşlem Ücretleri", + "RESTRICTIONS": "Kısıtlamalar", + "BOUNDARIES": "Sınırlar", + "CAPS": "Kapaklar", + "MAXIMUM": "Maksimum", + "WITHDRAWAL_LIMITS": "Para Çekme Limitleri", + "STORAGE": "Depolamak", + "FUNDS": "Fonlar", + "BALANCE": "Denge", + "CRYPTO_WALLET": "Kripto Cüzdanı", + "MY": "Benim", + "ENGLISH": "İngilizce", + "LOCALIZATION": "Yerelleştirme", + "TRANSLATE": "Çevir", + "LANGUAGE_SETTINGS": "Dil Ayarları", + "MULTILINGUAL": "Çok dilli", + "LANGUAGE_PREFERENCE": "Dil Tercihi", + "TEXT": "metin", + "WORD": "kelime", + "PEER_TO_PEER": "Eşler arası", + "DIRECT_TRADE": "Doğrudan Ticaret", + "USER_TO_USER": "Kullanıcıdan Kullanıcıya", + "PRIVATE_TRADE": "Özel Ticaret", + "TRANSACTIONS": "İşlemler", + "ACTIVITY": "Etkinlik", + "RECORD": "Kayıt", + "LOG": "Kayıt", + "TRANSACTION_HISTORY": "İşlem Geçmişi", + "LIQUIDITY": "Likidite", + "MARKET_VOLUME": "Pazar Hacmi", + "TRADING_ACTIVITY": "Ticaret Faaliyeti", + "MARKETS": "pazarlar", + "CRYPTO": "kripto", + "TWO_FACTOR_AUTHENTICATION": "İki Faktörlü Kimlik Doğrulama", + "MFA": "Güzel Sanatlar Yüksek Lisansı", + "AUTHENTICATOR": "Kimlik doğrulayıcı", + "OTP": "otp", + "CREDENTIALS": "Kimlik Bilgileri", + "PASSWORD_RESET": "Şifre Sıfırlama", + "SIGN_INS": "Oturum açmalar", + "ACCOUNT_ACCESS": "Hesap Erişimi", + "SESSION_HISTORY": "Oturum Geçmişi", + "LOGGED_IN": "Giriş Yapıldı", + "SESSION_MANAGEMENT": "Oturum Yönetimi", + "CURRENT_SESSIONS": "Güncel Oturumlar", + "BANKING_DETAILS": "Banka Detayları", + "BANK_ACCOUNT": "Banka Hesabı", + "FINANCIAL_INSTITUTION": "Finansal Kuruluş", + "BANK_INFO": "Banka Bilgileri", + "WITHDRAWAL_ACCOUNT": "Para Çekme Hesabı", + "FUND": "fon", + "SOUND": "Ses", + "AUDIO_SETTINGS": "Ses Ayarları", + "ALERTS": "Uyarılar", + "NOTIFICATIONS": "Bildirimler", + "AUDIO_ALERTS": "Sesli Uyarılar", + "SECURITY": "güvenlik", + "CONTACT": "Temas etmek", + "EMAIL_ADDRESS": "E-posta Adresi", + "MAIL": "Posta", + "EMAIL_CONTACT": "E-posta İletişimi", + "KYC": "kyc", + "SMS": "SMS", + "KYC_CAPS": "KYC", + "ID": "İD", + "PERSONAL_INFO": "Kişisel Bilgiler", + "IDENTITY_CHECK": "Kimlik Kontrolü", + "PAYOUT": "Ödeme", + "CASH_OUT": "Nakit Çekme", + "REMOVE_FUNDS": "Paraları Kaldır", + "OUT": "Dışarı", + "SUPPORT": "Destek", + "CONTACT_LOWER": "temas etmek", + "EMAIL_LOWER": "e-posta", + "RESOURCE": "kaynaklar", + "GUIDES": "rehberler", + "FAQ": "SSS", + "CUSTOMER_SERVICE": "müşteri hizmetleri", + "ASSISTANCE": "yardım", + "API_LOWER": "API'si", + "MESSAGE": "mesaj", + "LIVE_CHAT": "canlı sohbet", + "SETTINGS": "ayarlar", + "ALERT": "Uyarı", + "UPDATES": "Güncellemeler", + "REMINDERS": "Hatırlatmalar", + "UI": "Kullanıcı arayüzü", + "USER_INTERFACE": "Kullanıcı Arayüzü", + "LAYOUT": "Düzen", + "DESIGN": "Tasarım", + "DASHBOARD": "Gösterge Paneli", + "COLOR_THEME": "renk teması", + "ORDER_BOOK": "sipariş defteri", + "DARK": "karanlık", + "LIGHT": "ışık", + "WITHDRAWAL_ADDRESSES": "Para Çekme Adresleri", + "CRYPTO_ADDRESSES": "Kripto Adresleri", + "WALLET_ADDRESSES": "Cüzdan Adresleri", + "SAVED_ADDRESSES": "Kaydedilen Adresler", + "ADDRESS_BOOK": "Adres Defteri", + "WHITE_LISTED": "beyaz listeye alınmış" + } + }, + "CONNECTIONS": { + "CHECK_CONNECTION": "Bağlantıyı Kontrol Et", + "IP": "IP", + "NORMAL_TEXT": "Normal", + "CONNECTION_ISSUE": "Bağlantı sorunu", + "SESSION": "Oturum", + "SERVER_TIME": "Sunucu zamanı", + "PING": "Çınlama", + "CHECK_PING": "PING'İ KONTROL ET", + "RECONNECT": "Yeniden bağlan", + "TOOLTIP_DESC_1": "{0} Exchange sunucusuna olan pinginizi kontrol edin", + "TOOLTIP_DESC_2": "Daha düşük 'ms' daha iyidir", + "LOGGED_IN_AT": "Giriş yapıldı", + "RECONNECT_DESC": "Yeniden bağlanmak, yaşadığınız bilinmeyen sorunları çözebilir.", + "CONFIRM_RECONNECT_MESSAGE": "Tekrar bağlanmak ister misiniz?", + "PING_CHECK_TEXT": "Sunucuya ping atılıyor. Lütfen bekleyin...", + "RECHECK_PING": "PING'i TEKRAR KONTROL ET", + "FAST": "Hızlı", + "SLOW": "Yavaş", + "MS": "{0} ms", + "STATUS_NORMAL": "Bağlantı Normal", + "CONNECTION_LABEL": "Bağlantı", + "CONNECTION_ISSUE_DETECTED": "Bağlantı sorunu algılandı" + }, + "DESKTOP_NAVIGATION": { + "OTHERS": "Diğerleri", + "SUMMARY_DESCRIPTION": "Hesap düzeyinde bilgi ve erişilebilirlik", + "FEES_LIMITS_DESC": "İşlem ve çekim ücretleri. Hesap limitleri", + "VOLUME_DESC": "Zaman içinde işlem hacmi özeti", + "DEPOSIT_DESC": "Cüzdan mevduat fonlama seçeneklerine erişin", + "BALANCE_DESC": "Tüm varlıklarınız ve bakiyeleri", + "PERFORMANCE_DESC": "Cüzdan karı ve zararı", + "HISTORY_DESC": "Tüm işlemleri, para yatırma ve çekme işlemlerini inceleyin", + "ADDRESS_BOOK_DESC": "Para çekme işlemleri için iletişim adres defteri", + "WITHDRAW_DESC": "Cüzdan çekimleri ve transferleri", + "ASSETS_DESC": "Fiyatları takip edin ve varlık verilerini keşfedin", + "CONVERT_DESC": "Herhangi bir varlığı başka bir varlıkla kolayca takas edin", + "MARKET_DESC": "Spot ticaret emir defteri piyasaları.", + "P2P_DESC": "Kripto ticareti", + "REFERRAL_DESC": "Arkadaşlarınızı davet ederek pasif gelir elde edin", + "CEFI_STAKE_DESC": "Borsa cüzdanınızdan varlık stake edin", + "DEFI_STAKE_DESC": "Cüzdanı bağlayın ve varlığınızı stake edin", + "BUY_CRYPTO_DESC": "Doğrudan banka havalesi veya kartlar aracılığıyla satın alın", + "SECURITY_DESC": "Hesap 2FA, şifre ve API'ler", + "VERIFICATION_DESC": "Hesap kimlik doğrulaması", + "SETTINGS_DESC": "Arayüz ve diğer hesap ayarları", + "SUMMARY_PAGE": "Özet sayfası", + "SIGNOUT_DESC": "Hesaptan çıkış", + "LANGUAGE_DESC": "Dil Tercihini Değiştir", + "API_DESC": "Hesabınıza programlı olarak erişmek için API anahtarlarını kullanın", + "HELP_DESC": "Yardım alın. Destek iletişimi", + "TRANSACTION_DESC": "Tüm işlemleri, para yatırma ve çekme işlemlerini inceleyin", + "ONRAMPER_DESC": "Kripto para alıp satmak için Onramper'ı kullanın" } } \ No newline at end of file diff --git a/web/src/config/lang/ur.json b/web/src/config/lang/ur.json index c2e760bae9..9fde2244f3 100644 --- a/web/src/config/lang/ur.json +++ b/web/src/config/lang/ur.json @@ -87,7 +87,7 @@ "OPTION_BUG": "بگ کی اطلاع دیں۔", "OPTION_PERSONAL_INFO": "ذاتی معلومات کو تبدیل کریں۔", "OPTION_BANK_TRANSFER": "بینک وائر ٹرانسفر", - "OPTION_REQUEST": "ہولاایکس ایکسچینج کے لیے دعوت کی درخواست کریں۔" + "OPTION_REQUEST": "ایکسچینج کے لیے دعوت کی درخواست کریں۔" }, "SUBJECT_LABEL": "مضمون", "SUBJECT_PLACEHOLDER": "اپنے مسئلے کا موضوع ٹائپ کریں۔", @@ -107,7 +107,8 @@ }, "QR_CODE": "اس قیو ار کوڈ کو وہ شخص اسکین کر سکتا ہے جو آپ کو فنڈز بھیجنا چاہتا ہے۔", "NO_DATA": "کوئی معلومات دستیاب نہیں۔", - "QR_CODE_TITLE": "{0} جمع کی معلومات" + "QR_CODE_TITLE": "{0} جمع کی معلومات", + "VIEW_DEPOSIT": "ڈپازٹ دیکھیں" }, "LOGIN": { "LOGIN_TO": "براہ کرم لاگ ان کریں۔ {0}", @@ -224,7 +225,10 @@ "MOBILE_WALLET_BALANCE_LABEL": "لیبرا/مشرق۔ USDT", "MOBILE_WALLET_SHARE_LABEL": "% شیئر/ تخمینہ۔ USDT", "VIEW_MORE_WALLET_INFO": "والٹ کی مزید معلومات دیکھیں", - "VIEW_WALLET_TRANSACTION_HISTORY": "والیٹ کی لین دین کی تاریخ دیکھیں" + "VIEW_WALLET_TRANSACTION_HISTORY": "والیٹ کی لین دین کی تاریخ دیکھیں", + "ORDERS_HOLD": "آپ کے پاس {0} {1} ہے، جس کے نتیجے میں آپ کے {4} بیلنس پر {2} {3} کا ہولڈ رکھا گیا ہے", + "OPEN_ORDERS_SINGULAR": "کھلا حکم", + "VIEW_WALLET": "پرس دیکھیں" }, "REQUEST_RESET_PASSWORD": { "TITLE": "اکاؤنٹ ریکوری", @@ -527,7 +531,8 @@ "CANCEL": "منسوخ کریں۔", "PLACEHOLDER": "یہاں ٹائپ کریں۔" } - } + }, + "TITLE_TEXT": "ترجیحات جیسے کہ انٹرفیس لے آؤٹ، اطلاع کی ترجیحات، صارف نام، اور دیگر حسب ضرورتوں کو ایڈجسٹ کرکے اپنے اکاؤنٹ کی ترتیبات پر نظر ثانی کریں۔" }, "USER_APPS": { "TITLE": "آپ کی ایکسچینج ایپس", @@ -727,13 +732,13 @@ "FORFEITURE_OF_EARNINGS_DETAILS_LABEL": "کمائیوں کی ضائع ہونے کی قدر", "STAKE_AMOUNT_LABEL": "اسٹیک مقدار", "DISCLAIMER_NOTICE": "تنبیہ: 1,000 ڈالر سے زیادہ قیمت والے مقداروں کے لئے آپ کو شناخت کی تصدیق کرنے کی ضرورت ہو سکتی ہے۔ یہ قیمت کمائیوں کو شامل کرتی ہے، اور پلیٹفارم کو اضافی صارف کی معلومات کی درخواست کرنے کا حق محفوظ ہے۔", - "SETTLEMENT_NOTICE": "ادائیگی: Unstaking کے بعد 24 گھنٹے کے واقعی سمجھا جائے گا۔", + "SETTLEMENT_NOTICE": "{0} ایک 24 گھنٹے کی تصفیہ کی مدت کا اطلاق کیا جائے گا۔", "CONFIRM_BUTTON": "تصدیق کریں", "STAKE_RULES_NOTICE": "جیسے ہی آپ نے اسٹیک کیا ہے، آپ پول کے قوانین کے مطابق کردار کریں گے۔", "I_UNDERSTAND_AGAIN_BUTTON": "میں پھر سمجھتا ہوں", "CONGRATULATIONS_NOTICE": "مبارک ہو!", "EARNINGS_START_NOTICE": "آپ کا اسٹیک انعامات کمانے کا آغاز کرے گا۔", - "REVIEW_PROGRESS_LABEL": "آپ اپنے اسٹیک کے پیش رفت کا جائزہ لے سکتے ہیں ایکٹو اسٹیکس پیج پر۔", + "REVIEW_PROGRESS_LABEL": "آپ {0} پر اپنے اسٹیک کی پیشرفت کا جائزہ لے سکتے ہیں", "TIME_REMAINING_LABEL": "باقی وقت", "PENALTY_UPON_INITIAL_STAKE_PRINCIPLE_LABEL_2": "ابتدائی اسٹیک اصول کی پریشانی", "FORFEITURE_OF_EARNINGS_LABEL_2": "کمائیوں کی ضائع ہونے کی قدر", @@ -743,7 +748,26 @@ "VISIT_WALLET_BUTTON": "والیٹ دیکھیں", "CLOSE_BUTTON": "بند کریں", "ACTIVE_STAKES": "ایکٹو سٹیکس", - "STAKES_HISTORY": "تاریخ" + "STAKES_HISTORY": "تاریخ", + "SETTLEMENT_NOTICE_TITLE": "تصفیہ:", + "REVIEW_PROGRESS_ACTIVE_LINK": " ایکٹو اسٹیک پیج", + "STAKING": "سٹاکنگ 101", + "SLASHING": "سلیشنگ", + "MINIMUM_AMOUNT_ALLOWED": "اسٹیکنگ پول کی کم سے کم رقم کی اجازت ہے۔", + "MAXIMUM_AMOUNT_ALLOWED": "اسٹیکنگ پول کی زیادہ سے زیادہ رقم کی اجازت ہے۔", + "DAYS": "دن", + "CONFIRM_STAKE_DECS": "یہ لو!", + "DO_YOU_UNDERSTAND": "کیا تم سمجھتے ہو؟", + "SUCCESSFULLY_STAKED_IN": "کامیابی سے داؤ پر لگا دیا گیا۔", + "SUCCESSFULLY_STAKED": "کامیابی سے داؤ پر لگا دیا گیا۔", + "VIEW_ACTIVE_STAKES": "ایکٹو اسٹیکس دیکھیں", + "REVIEW_AND_UNSTAKE": "جائزہ لیں اور داغ ہٹا دیں۔", + "NO_REWARD": "وصول کرنے کے لیے کوئی انعام کی رقم نہیں۔", + "SUCCESSFULLY_UNSTAKED": "آپ نے کامیابی سے اسٹیک کو ہٹا دیا ہے۔", + "MIN": "کم از کم", + "UNSTAKING": "غیر متزلزل...", + "UNSTAKED": "UNSTAKED", + "TOOLTIP": "اگر آپ نے بہت جلد اتار دیا تو جرمانہ آپ کو لگے گا۔ {0}" }, "STAKE": { "NETWORK_WARNING": "غیر مطابقت پذیر نیٹ ورک۔ براہ کرم اپنے نیٹ ورک کو اس میں تبدیل کریں۔ {0}", @@ -834,7 +858,10 @@ "INSTALL_METAMASK_DETAILS": { "TITLE": "میٹا ماسک انسٹال کریں۔", "PROMPT": "آپ کو اپنے براؤزر میں Metamask انسٹال کرنا چاہیے: {0}" - } + }, + "EARN_REWARD": "اپنے ڈیجیٹل اثاثوں کو داؤ پر لگانے کے لیے انعامات حاصل کریں۔", + "DEFI_STAKING": "ڈی فائی اسٹیکنگ", + "CEFI_STAKING": "CeFi Staking" }, "UNSTAKE": { "TITLE": "منسوخ اسٹیک", @@ -1055,7 +1082,9 @@ "ENTER_AMOUNT": "رقم درج کریں۔", "REMOVE_TITLE": "ٹیگ کو ہٹا دیں۔", "MAX_AMOUNT_WARNING_INFO": "یہ رقم نکلوانے کی آپ کی زیادہ سے زیادہ حد سے زیادہ ہے۔", - "ZERO_BALANCE": "آپ کے پاس کافی دستیاب بیلنس نہیں ہے۔" + "ZERO_BALANCE": "آپ کے پاس کافی دستیاب بیلنس نہیں ہے۔", + "MIN_AMOUNT_WARNING_INFO": "کم از کم نکالنے کی رقم {0} ہے", + "NEW_ADDRESS": "نیا پتہ" }, "WALLET_BUTTON_BASE_DEPOSIT": "ڈپازٹ", "WALLET_BUTTON_BASE_WITHDRAW": "واپسی", @@ -1384,7 +1413,8 @@ "INSUFFICIENT_LABEL": "تصفیہ کی ناکافی رقم", "INSUFFICIENT_INFO_1": "آپ کی کمائی فی الحال تصفیہ کے لیے ناکافی ہے۔ براہ کرم اپنے ریفرل لنک کا استعمال کرتے ہوئے مزید ممبران کو مدعو کریں اور اپنی غیر طے شدہ آمدنی تک انتظار کریں {0} {1}", "INSUFFICIENT_INFO_2": "1 سے زیادہ", - "GO_TO_REFERRAL": "ریفرل پر جائیں۔" + "GO_TO_REFERRAL": "ریفرل پر جائیں۔", + "REFER_DESC": "دوستوں کے ساتھ نیچے دیے گئے لنک کا اشتراک کرکے ان کی ٹریڈنگ پر کمیشن کمانا شروع کریں۔" }, "NOT_LOGGEDIN": { "TXT_1": "ٹریڈنگ شروع کرنے کے لیے آپ کو لاگ ان کرنا ہوگا۔", @@ -1452,7 +1482,11 @@ "TRADING_SYMBOL": "تجارتی علامت", "ASSET": "اثاثہ", "TYPE": "قسم", - "SOURCE": "ذریعہ" + "SOURCE": "ذریعہ", + "PERCENTAGE": "% {0}", + "24H": "24H", + "TREND_7D": "ٹرینڈ 7D", + "BUY": "خریدیں {0} {1}" }, "PAGE_UNDER_CONSTRUCTION": "یہ صفحہ زیر تعمیر ہے۔ براہ کرم جلد ہی اس صفحہ کو دوبارہ دیکھیں۔", "UNDEFINED_ERROR_TITLE": "آپ کو ایک نامعلوم خرابی کا سامنا کرنا پڑا ہے۔", @@ -1671,7 +1705,8 @@ "WALLET_BALANCE_ESTIMATE": "آج کے پرس بیلنس کا تخمینہ ", "VIEW_BALANCE_HISTORY": "بیلنس کی تاریخ دیکھیں", "VIEW_PERCENTAGE_SHARE": "فیصد شیئر دیکھیں", - "VIEW_WALLET_P&L": "والٹ P&L دیکھیں" + "VIEW_WALLET_P&L": "والٹ P&L دیکھیں", + "BALANCE_PERCENTAGE": "بیلنس فیصد" }, "ASSET_INFO": "اثاثہ کی معلومات", "TAKER_FEES_APPLIED": "لینے والے کی فیس لاگو ہوتی ہے۔", @@ -1689,7 +1724,18 @@ "ORDERBOOK": "آرڈر بک", "NETWORK": "نیٹ ورک بروکر او ٹی سی", "BROKER": "مقامی بروکر او ٹی سی", - "BROKERAGE": "NA - (بروکریج)" + "BROKERAGE": "NA - (بروکریج)", + "LOADING_PRICES": "قیمتیں لوڈ ہو رہی ہیں...", + "INPUT_LABEL": "ان پٹ اثاثہ کا نام یا علامت", + "HIGHLIGHTS": "جھلکیاں", + "MOBILE_DESC": "ٹریڈنگ شروع کرنے کے لیے نیچے ایک مارکیٹ منتخب کریں۔", + "PRICE_24H": "قیمت/24H%", + "CARDS": { + "GAINERS": "فائدہ اٹھانے والے", + "LOSERS": "ہارنے والے", + "MARKET_CAP": "مارکیٹ کیپ", + "24H": "{0} 24H" + } }, "HOLLAEX_TOKEN": { "REMOVE_FAVOURITES": "پسندیدہ سے ہٹا دیں۔", @@ -1735,7 +1781,8 @@ "TAG": "ٹیگ:", "DISABLED_DEPOSIT_CONTENT": "ڈپازٹ کی فعالیت عارضی طور پر دستیاب نہیں ہے۔", "DISABLED_WITHDRAW_CONTENT": "واپسی کی فعالیت عارضی طور پر دستیاب نہیں ہے۔", - "DEPOSIT_LABEL": "جمع" + "DEPOSIT_LABEL": "جمع", + "VOLUME": "حجم" }, "ASYNC_LINK": { "TITLE": "صفحہ خود بخود نہیں کھل رہا ہے؟", @@ -2008,7 +2055,7 @@ "TOTAL_ASSET_SELL_1": "کل", "TOTAL_ASSET_SELL_2": "آپ فروخت کر سکتے ہیں", "BUY_ORDER_LIMITS": "آرڈر کی حد خریدیں۔", - "MIN_MAX_ORDER_VALUE_1": "کم از کم اور زیادہ سے زیادہ", + "MIN_MAX_ORDER_VALUE_1": "کم از کم اور زیادہ سے زیادہ {0} {1}", "MIN_MAX_ORDER_VALUE_2": "میں آرڈر کی قیمت خریدیں۔", "PAYMENT_METHODS_SEND_FIAT": "FIAT بھیجنے کے لیے ادائیگی کے طریقے", "SELECT_PAYMENT_METHODS_1": "تک کا انتخاب کریں۔", @@ -2024,7 +2071,7 @@ "DEAL_EDITED": "ڈیل میں ترمیم کی گئی ہے۔", "DEAL_CREATED": "ڈیل ہو گئی ہے۔", "NEXT": "اگلے", - "ADD_PAYMENT_METHOD_DETAILS": "ادائیگی کے طریقہ کار کی تفصیلات شامل کریں۔", + "ADD_PAYMENT_METHOD_DETAILS": "{0} ادائیگی کے طریقہ کی تفصیلات", "COMPLETE": "مکمل", "STEP_SET_TYPE_PRICE": "قسم اور قیمت مقرر کریں۔", "STEP_SET_TOTAL_AMOUNT_PAYMENT_METHODS": "کل رقم اور ادائیگی کے طریقے سیٹ کریں۔", @@ -2054,6 +2101,400 @@ "ALL_REGION": "تمام علاقہ", "BUYER_NOT_MADE_THE_PAYMENT": "خریدار نے ابھی تک ان کی ادائیگی کی تصدیق نہیں کی ہے۔", "PRICE_TO_ADVERTISE": "قیمت جو آپ فروخت کرنے کے لیے اشتہار دیں گے۔", - "VIEW_PROFILE": "وینڈر کا پروفائل دیکھیں" + "VIEW_PROFILE": "وینڈر کا پروفائل دیکھیں", + "P2P_METHODS": "P2P ادائیگی کے طریقے", + "PAYMENT_METHODS": "ادائیگی کے طریقے", + "PAYMENT_METHODS_DEC": "آپ کریپٹو کرنسیوں کو فروخت کر سکتے ہیں اور اپنے ذاتی ادائیگی اکاؤنٹ کی تفصیلات، جیسے کہ بینک کی معلومات یا ادائیگی کے دیگر مقامی طریقے شامل کر کے فیاٹ ادائیگیاں حاصل کر سکتے ہیں۔ اپنی ادائیگی کی معلومات شامل کرنے سے پہلے یقینی بنائیں کہ آپ کے ادائیگی اکاؤنٹ سے وابستہ نام آپ کی تصدیق شدہ تفصیلات میں موجود نام سے مماثل ہے۔", + "SELL_AMOUNT": "فروخت کی رقم", + "ADD_PAYMENT_METHOD": "+ ادائیگی کا طریقہ شامل کریں۔", + "REMOVE": "ہٹا دیں۔", + "DYNAMIC": "متحرک", + "TYPE": "TYPE", + "BACK_TO_ORDERS": "احکامات کے لئے", + "FUNDS_TRANSFERRED_USER": "صارف نے لین دین کی تصدیق کی اور آپ کے بیلنس میں فنڈز منتقل کر دیے گئے ہیں۔", + "CONFIRM_TRANSFER_USER": "منتقلی کی تصدیق کریں اور صارف کو مطلع کریں۔", + "BUYER_SENT_FUNDS_USER": "آپ نے صارف کو اشارہ کیا ہے کہ آپ نے فنڈز بھیجے ہیں۔ براہ کرم صارف کے جواب کا انتظار کریں۔", + "VENDOR_CONFIRMED_ORDER_USER": "صارف نے لین دین کی تصدیق کی اور فنڈز جاری کر دیے۔", + "BUY_UPPER": "خریدیں۔", + "CRYPTO_WANT_TO_BUY": "کرپٹو آپ خریدنا چاہتے ہیں۔", + "FIAT_CURRENCY_WANT_TO_SPEND": "خرچ کرنے کے لیے Fiat کرنسی", + "PRICE_ADVERTISE": "قیمت جس کا آپ اشتہار دیں گے {0}", + "TOTAL_AMOUNT": "کل رقم", + "BUY_SELL_DESC": "آپ کر سکتے ہیں {0}", + "SELL_ORDER_LIMITS": "آرڈر کی حدیں فروخت کریں۔", + "MIN_MAX_ORDER_VALUE_3": "آرڈر کی قیمت فروخت کریں۔", + "PAYMENT_METHODS_RECEIVE_FIAT": "FIAT وصول کرنے کے لیے ادائیگی کے طریقے", + "PAYMENT_TIME_LIMIT_LABEL": "ادائیگی کے وقت کی حد: {0}", + "30_MINUTES": "30 منٹ", + "DELETE_UPPERCASE": "حذف کریں۔", + "CLICK_TO_VIEW": "دیکھنے کے لیے کلک کریں۔", + "NEW_MESSAGE": "آپ کو ایک P2P پیغام موصول ہوا ہے۔", + "STATUS_UPDATE": "آپ کے P2P آرڈر پر اپ ڈیٹ ہے۔", + "APPEAL_STATUS_MESSAGE": "آپ کے P2P آرڈر کے خلاف اپیل کی گئی ہے۔", + "CANCEL_STATUS_MESSAGE": "آپ کا P2P آرڈر منسوخ کر دیا گیا ہے۔", + "CONFIRM_STATUS_MESSAGE": "آپ کے P2P آرڈر کی تصدیق ہو گئی ہے۔", + "NEW_ORDER_CREATED": "نیا P2P آرڈر بنایا گیا ہے۔", + "CRYPTO_RELEASE_STATUS_MESSAGE": "کرپٹو کو آرڈر سے رہا کر دیا گیا ہے۔", + "ADDITIONAL_PAYMENT_DETAILS": "ادائیگی کی اضافی تفصیلات شامل کریں۔", + "PAYMENT_FIELD_INFO": "ادائیگی کی یہ نئی فیلڈ اضافی ہے اور اسے P2P کے شرکاء کو ان کی کرنسی کی منتقلی میں مدد کرنی چاہیے۔ یہ ادائیگی کے طریقہ کار سے متعلق اکاؤنٹ کی تفصیلات ہونی چاہیے۔ اس میں فون نمبر، صارف نام، منفرد اکاؤنٹ نمبر، اور ادائیگی کے طریقوں کے نظام کے لحاظ سے لین دین کے لیے دیگر ضروری معلومات شامل ہو سکتی ہیں۔", + "PAYMENT_DETAIL_NAME": "ادائیگی کی تفصیل کا نام", + "REQUIRED_OR_OPTIONAL": "مطلوبہ یا اختیاری۔", + "CREATE_NEW_PAYMENT_METHODS": "ادائیگی کے نئے طریقے بنائیں اور شامل کریں۔", + "MANUAL_PAYMENT_METHOD_ENTRY": "اپنے P2P پلیٹ فارم میں ادائیگی کا طریقہ شامل کرنے کے لیے، آپ ادائیگی کے طریقے کا نام اور مطلوبہ ادائیگی کی تفصیلات درج کر کے دستی طور پر ایسا کر سکتے ہیں۔ مثال کے طور پر، پے پال فنڈز بھیجنے اور وصول کرنے کے لیے ای میل پتے استعمال کرتا ہے۔", + "USERS_PAYMENT_SELECTION": "ادائیگی کا طریقہ شامل ہونے کے بعد، آپ کے P2P مرچنٹس اور صارفین اسے منتخب کر سکیں گے اور ادائیگی کرتے یا وصول کرتے وقت ضروری معلومات درج کر سکیں گے۔ ان کی فراہم کردہ تفصیلات P2P ٹرانزیکشن میں دوسرے فریق کے ساتھ شیئر کی جائیں گی۔", + "METHOD_NAME_AND_DETAIL": "طریقہ کار کا نام اور ادائیگی کی اہم تفصیل", + "ADD_NEW_PAYMENT_METHODS": "ادائیگی کے نئے طریقے منتخب کریں:", + "DETAIL_NAME": "ادائیگی کی تفصیل کا نام", + "DETAIL_VALUE": "ادائیگی کی تفصیل کی قدر", + "DETAIL_REQUIRED": "درکار ہے۔", + "IMPORTANT_DETAIL": "(ادائیگی کی اہم تفصیلات)", + "DETAIL_OPTIONAL": "اختیاری", + "OPTIONAL_DETAIL": "(اختیاری ادائیگی کی تفصیلات)", + "ADD_NEW_PAYMENT_FIELD": "نئی ادائیگی کی تفصیل کا فیلڈ شامل کریں۔", + "PAYMENT_METHOD_CREATED": "ادائیگی کا طریقہ بنایا گیا! منتظم کی طرف سے تصدیق کا انتظار ہے۔", + "PAYMENT_METHOD_DELETED": "ادائیگی کا طریقہ حذف کر دیا گیا۔", + "PAYMENT_METHOD_UPDATED": "ادائیگی کا طریقہ اپ ڈیٹ ہو گیا۔", + "CRYPTO": "کرپٹو: ", + "INPUT_SPEND_AMOUNT": "ان پٹ خرچ کی رقم", + "INPUT_SELL_AMOUNT": "ان پٹ فروخت کی رقم", + "TIMES": "اوقات", + "FEEDBACK": "تاثرات", + "ASSET": "اثاثہ: ", + "CUSTOM": "حسب ضرورت", + "CANCELLED": "منسوخ", + "APPEALED": "اپیل کی۔", + "EXPIRED": "میعاد ختم", + "RATE": "شرح:", + "BUYING": "خریدنا {0}", + "SELLING": "فروخت کرنا {0}", + "TERMS_AND_CONDITION_DESCRIPTION": "براہ کرم ڈیل کے 15 منٹ کے اندر پوسٹ کریں۔", + "VISIT_OUR_WEBSITE": "ہماری ویب سائٹ ملاحظہ کریں۔", + "SELECT_PAYMENT_SYSTEM_LABEL": "ادائیگی کا نظام منتخب کریں۔", + "FIELD": "میدان", + "NEW_PAYMENT_PLACEHOLDER": "ادائیگی کی تفصیل کی قیمت درج کریں۔", + "FIELD_VALIDATION_TEXT": "براہ کرم طریقہ کے تمام فیلڈز درج کریں۔", + "INPUT_METHOD_NAME_TEXT": "براہ کرم طریقہ کا نام درج کریں۔", + "INPUT_PAYMENT_DETAIL_TEXT": "ادائیگی کی تفصیلات کا نام درج کریں۔", + "UNVERIFIED": "غیر تصدیق شدہ", + "VERIFIED": "تصدیق شدہ", + "AMOUNT_RECEIVE": "آپ کے بیلنس سے جاری کیا جائے گا۔", + "DELETE_WARNING": "کیا آپ واقعی ادائیگی کے اس طریقے کو حذف کرنا چاہتے ہیں؟", + "STEP_1": "مرحلہ 1/3", + "STEP_2": "مرحلہ 2/3", + "STEP_3": "مرحلہ 3/3", + "P2P_ORDER_CREATED": "P2P آرڈر بنایا گیا۔", + "VENDOR_CHECKS_TITLE": "چیک کریں اور ادائیگی کی تصدیق کریں۔", + "FUND_RELEASED": "فنڈز جاری کئے", + "ORDER_EXPIRY": "آرڈر کی میعاد ختم", + "MINIMUM_AMOUNT_WARNING": "کم از کم {0} ہے {1}", + "MAXIMUM_AMOUNT_WARNING": "زیادہ سے زیادہ {0} ہے {1}", + "ORDER_CREATION": "آرڈر کی تخلیق", + "ORDER_CREATION_DESC_1": "'آرڈر بنائیں' پر کلک کرنے سے، آپ وینڈر کو مطلع کریں گے اور ادائیگی کی منتقلی کی درست تفصیلات کے ساتھ فوری قیمت کی قیمت وصول کریں گے۔ {0} {1} {2} {3}", + "ORDER_CREATION_DESC_2": "اس میں آپ کے آرڈر کو حتمی شکل دینے کے لیے درکار درست رقم شامل ہے۔", + "YOU_HAVE_TEXT": "آپ کو پڑے گا", + "COMPLETE_PAYMENT_PROCESS": "ادائیگی کی منتقلی کے عمل کو مکمل کرنے کے لیے۔", + "WARINNG_DESC": "براہ کرم صرف آرڈر کی تخلیق کے ساتھ جاری رکھیں اگر آپ واقعی آرڈر کو مکمل کرنے کا ارادہ رکھتے ہیں۔", + "ORDER_CANCEL_DESC": "آرڈر منسوخ کرنے کے نتیجے میں اکاؤنٹ معطل ہو سکتا ہے۔", + "CONFIRM_ORDER_CREATION": "جب آپ {0} کے لیے تیار ہوں تو براہ کرم نیچے 'آرڈر بنائیں' پر کلک کریں۔", + "SEND_MONEY": "پیسے بھیجیں", + "RECEIVE_MONEY": "رقم وصول کریں", + "CREATE_ORDER": "آرڈر بنائیں", + "NO_ORDERS_DESC": "ایسا لگتا ہے کہ یہاں کوئی آرڈر نہیں ہے۔", + "NO_DEALS_DESC": "ایسا لگتا ہے کہ یہاں کوئی سودے نہیں ہیں۔", + "ONLINE": "آن لائن", + "OFFLINE": "آف لائن", + "SELECT_CRYPTO": "کریپٹو کو منتخب کریں۔", + "REMOVE_WARNING": "کیا آپ واقعی اس ڈیل کو ہٹانا چاہتے ہیں؟", + "SHOW_FILTERS": "فلٹرز دکھائیں۔", + "HIDE_FILTERS": "فلٹرز چھپائیں۔", + "ORDERS_COMPLETED": "آرڈرز مکمل ہوئے:", + "CANCEL_WARNING_TEXT": "براہ کرم نوٹ کریں کہ بار بار آرڈر کی منسوخی آپ کے عوامی P2P پروفائل کو منفی طور پر متاثر کر سکتی ہے اور اس کے نتیجے میں آپ کا اکاؤنٹ معطل ہو سکتا ہے۔", + "UPDATE": "اپ ڈیٹ کریں۔", + "TERMS_ERROR_TEXT": "براہ کرم شرائط کی فیلڈ داخل کریں۔", + "RESPONSE_ERROR_TEXT": "براہ کرم جوابی فیلڈ داخل کریں۔" + }, + "CUSTOM_NATIVE_CURRENCY": "کرنسی (قیمتوں کا تعین اور اثاثہ کی قیمت کا تخمینہ)", + "ADDRESS_BOOK": { + "ADDRESS_BOOK_LABEL": "ایڈریس بک", + "ADDRESS_BOOK_DESC_1": "اپنی ذاتی ایڈریس بک میں وائٹ لسٹ میں واپسی کا پتہ شامل کریں۔", + "ADDRESS_BOOK_DESC_2": "واپسی کے وقت آپ آسانی سے یہ پتے استعمال کر سکیں گے۔", + "ADD_ADDRESS_LINK": "ایڈریس شامل کریں۔", + "ADD_WITHDRAW_ADDRESS": "واپسی کا پتہ شامل کریں۔", + "DATE_ADDED": "تاریخ شامل کی گئی۔", + "REMOVE": "ہٹا دیں۔", + "NO_LINK": "ابھی تک کوئی واپسی کا پتہ شامل نہیں کیا گیا ہے۔", + "ADD_WITHDRAW_ADDRESS_DESC_1": "ایک سفید فہرست میں شامل پتہ شامل کریں جس سے آپ محفوظ طریقے سے سکے نکال سکتے ہیں۔", + "ADD_WITHDRAW_ADDRESS_DESC_2": "یہ واپسی کا پتہ آپ کے کنٹرول میں ایک پتہ ہونا چاہیے۔", + "NAME_YOUR_ADDRESS_TITLE": "اپنے ایڈریس کا نام بتائیں", + "NAME_YOUR_ADDRESS_DESC": "واپسی کے اس پتے کو اپنے مستقبل کے حوالہ کے لیے ایک نام دیں۔", + "USER_LABEL": "نام/لیبل:", + "USER_FIELD_PLACEHOLDER": "اس واپسی کے پتہ کا نام بتائیں", + "CHECK_AND_CONFIRM": "چیک کریں اور تصدیق کریں۔", + "WARNING_ADDRESS": "اس ایڈریس کو اپنی ایڈریس بک میں شامل کرنے سے پہلے براہ کرم چیک کرنے کے لیے وقت نکالیں اور تصدیق کریں کہ تفصیلات درست ہیں:", + "ENSURE_DESC": "یقینی بنائیں کہ پتہ درست ہے اور آپ کے کنٹرول میں ہے۔", + "ADDRESSES": "پتے", + "WITHDRAWAL_ADDRESS_BOOK": "واپسی ایڈریس بک", + "ADD_ADDRESS_DESC": "واپسی کا پتہ {0} میں شامل کریں", + "ADDRESS_BOOK": "ایڈریس بک", + "MANAGE_ADDRESS_BOOK": "ایڈریس بک کا نظم کریں۔", + "VIEW_ADDRESS_BOOK_LABEL": "ایڈریس بک دیکھیں", + "ADD_WITHDRAWAL_ADDRESS_LINK": "واپسی کا پتہ شامل کریں۔", + "REVOKE_ADDRESS": "آپ کا پتہ ہٹا دیا گیا ہے۔", + "REMOVE_ADDRESS": "پتہ ہٹا دیں۔", + "REMOVE_CONTENT": "کیا آپ اپنی ایڈریس بک سے واپسی کا یہ پتہ ہٹانا چاہتے ہیں؟" + }, + "VOLUME": { + "VOLUME": "حجم", + "BACK": "پیچھے", + "MARKETS": "مارکیٹس", + "CONVERT": "کنورٹ", + "HISTORY": "تاریخ", + "TRADING_VOLUME": "تجارتی حجم", + "VOLUME_DECS": "آپ کے اکاؤنٹ پر مختلف مدتوں میں تجارت کی گئی رقم کے ساتھ ساتھ ہر مدت میں تجارت کی گئی سرفہرست 3 اثاثوں کے ساتھ", + "ALL_ASSETS": "تمام اثاثے", + "DAY_VOLUME": "دن کا حجم", + "HOUR_VOLUME": "24 گھنٹے والیوم", + "TOP": "ٹاپ {0} {1}", + "VOL_ASSET": "ڈی والیوم۔ اثاثہ", + "NO_DATA_DESC_1": "ایسا لگتا ہے کہ آپ نے ابھی تک کوئی تجارت نہیں کی ہے۔ یہاں اپنی سرگرمی دیکھنے کے لیے ابھی ٹریڈنگ شروع کریں!", + "NO_DATA_DESC_2": "تجارت شروع کریں۔ ", + "NO_DATA_DESC_3": "اب یہاں آپ کی سرگرمی دیکھنے کے لیے!", + "TRADE_VOLUME": "تجارتی حجم", + "VIEW_VOLUME": "والیوم دیکھیں", + "TRADE_DESCRIPTION": "اپنا سب سے اوپر تجارت شدہ اثاثہ دیکھیں", + "MARKET_TABLE_DESC": "اپنے تجارتی حجم کا صفحہ دیکھیں {0}" + }, + "MORE_OPTIONS_LABEL": { + "MORE_OPTION_SEARCH_TXT": "تلاش کی خصوصیت یا صفحات", + "NO_RESULT_DESC_1": "لگتا ہے کہ اس کا کوئی نتیجہ نہیں ہے۔", + "NO_RESULT_DESC_2": "دوسرا کلیدی لفظ تلاش کرنے کی کوشش کریں۔", + "ICONS": { + "REFERRALS": "حوالہ جات", + "BUY_CRYPTO": "کرپٹو خریدیں۔", + "API": "API", + "DEFI_STAKE": "ڈیفی اسٹیک", + "CEFI_STAKE": "سیفی اسٹیک", + "PROFIT_LOSS": "پی اینڈ ایل", + "LIMITS": "حدود", + "LOGINS": "لاگ ان", + "AUDIO": "آڈیو" + }, + "HOT_FUNCTION": { + "HOT_FUNCTION_LABEL": "گرم افعال", + "ADD_FUNDS": "فنڈز شامل کریں۔", + "TOP_UP": " ٹاپ اپ", + "LOAD": "لوڈ", + "CREDIT": "کریڈٹ", + "FUND_ACCOUNT": "فنڈ اکاؤنٹ", + "BTC": "بی ٹی سی", + "USTD": "usdt", + "ETH": "اخلاق", + "USD": "یو ایس ڈی", + "XHT": "xht", + "TRANSFER": "منتقلی", + "MONEY": "پیسہ", + "FUNDING": "فنڈنگ", + "RECHARGE": "ریچارج", + "REFILL": "دوبارہ بھرنا", + "CASH_IN": "نقد رقم", + "ADD_MONEY": "پیسے شامل کریں", + "EXCHANGE": "تبادلہ", + "SWAP": "تبادلہ", + "BUY_SELL": "خریدیں/فروخت کریں۔", + "TRADE": "تجارت", + "CONVERT_CURRENCY": "کرنسی کو تبدیل کریں۔", + "INVITE": "دعوت دیں۔", + "REFER": "رجوع کریں۔", + "REWARDS": "انعامات", + "BONUS": "بونس", + "AFFILIATION": "وابستگی", + "AFFILIATE": "الحاق", + "PASSIVE_INCOME": "غیر فعال آمدنی", + "REVENUE": "آمدنی" + }, + "OTHER_FUNCTIONS": { + "OTHER_FUNCTIONS_LABEL": "دیگر افعال", + "INTEGRATION": "انضمام", + "PROGRAMMATIC_ACCESS": "پروگرامیٹک رسائی", + "DEVELOPER": "ڈویلپر", + "AUTOMATED_TRADING": "خودکار ٹریڈنگ", + "BOT": "بوٹ", + "ALGO": "کچھ", + "ALGORITHM": "الگورتھم", + "FIAT": "fiat", + "DOLLAR": "ڈالر", + "PURCHASE": "خریداری", + "BUY_COIN": "سکے خریدیں۔", + "BUY_TOKEN": "ٹوکن خریدیں۔", + "YIELD": "پیداوار", + "INTEREST": "دلچسپی", + "REVENUE": "آمدنی", + "CENTRALIZED_STAKING": "سنٹرلائزڈ اسٹیکنگ", + "PERFORMANCE": "کارکردگی", + "GAINS": "حاصلات", + "LOSSES": "نقصانات", + "PORTFOLIO_PROFIT": "پورٹ فولیو منافع", + "LOSS": "نقصان", + "PNL": "pl", + "CHARGES": "چارجز", + "COSTS": "اخراجات", + "COMMISSION": "کمیشن", + "TRADING_FEES": "ٹریڈنگ فیس", + "TRANSACTION_FEES": "لین دین کی فیس", + "RESTRICTIONS": "پابندیاں", + "BOUNDARIES": "حدود", + "CAPS": "کیپس", + "MAXIMUM": "زیادہ سے زیادہ", + "WITHDRAWAL_LIMITS": "واپسی کی حدود", + "STORAGE": "ذخیرہ", + "FUNDS": "فنڈز", + "BALANCE": "توازن", + "CRYPTO_WALLET": "کرپٹو والیٹ", + "MY": "میرا", + "ENGLISH": "انگریزی", + "LOCALIZATION": "لوکلائزیشن", + "TRANSLATE": "ترجمہ کریں۔", + "LANGUAGE_SETTINGS": "زبان کی ترتیبات", + "MULTILINGUAL": "کثیر لسانی", + "LANGUAGE_PREFERENCE": "زبان کی ترجیح", + "TEXT": "متن", + "WORD": "لفظ", + "PEER_TO_PEER": "پیئر ٹو پیر", + "DIRECT_TRADE": "براہ راست تجارت", + "USER_TO_USER": "صارف سے صارف", + "PRIVATE_TRADE": "نجی تجارت", + "TRANSACTIONS": "لین دین", + "ACTIVITY": "سرگرمی", + "RECORD": "ریکارڈ", + "LOG": "لاگ", + "TRANSACTION_HISTORY": "لین دین کی تاریخ", + "LIQUIDITY": "لیکویڈیٹی", + "MARKET_VOLUME": "مارکیٹ کا حجم", + "TRADING_ACTIVITY": "تجارتی سرگرمی", + "MARKETS": "بازار", + "CRYPTO": "کرپٹو", + "TWO_FACTOR_AUTHENTICATION": "دو عنصر کی توثیق", + "MFA": "ایم ایف اے", + "AUTHENTICATOR": "تصدیق کنندہ", + "OTP": "او ٹی پی", + "CREDENTIALS": "اسناد", + "PASSWORD_RESET": "پاس ورڈ ری سیٹ کریں۔", + "SIGN_INS": "سائن ان", + "ACCOUNT_ACCESS": "اکاؤنٹ تک رسائی", + "SESSION_HISTORY": "سیشن کی تاریخ", + "LOGGED_IN": "لاگ ان", + "SESSION_MANAGEMENT": "سیشن مینجمنٹ", + "CURRENT_SESSIONS": "موجودہ سیشنز", + "BANKING_DETAILS": "بینکنگ کی تفصیلات", + "BANK_ACCOUNT": "بینک اکاؤنٹ", + "FINANCIAL_INSTITUTION": "مالیاتی ادارہ", + "BANK_INFO": "بینک کی معلومات", + "WITHDRAWAL_ACCOUNT": "واپسی اکاؤنٹ", + "FUND": "فنڈ", + "SOUND": "آواز", + "AUDIO_SETTINGS": "آڈیو کی ترتیبات", + "ALERTS": "انتباہات", + "NOTIFICATIONS": "اطلاعات", + "AUDIO_ALERTS": "آڈیو الرٹس", + "SECURITY": "سیکورٹی", + "CONTACT": "رابطہ کریں۔", + "EMAIL_ADDRESS": "ای میل ایڈریس", + "MAIL": "میل", + "EMAIL_CONTACT": "ای میل رابطہ", + "KYC": "kyc", + "SMS": "ایس ایم ایس", + "KYC_CAPS": "کے وائی سی", + "ID": "ID", + "PERSONAL_INFO": "ذاتی معلومات", + "IDENTITY_CHECK": "شناختی چیک", + "PAYOUT": "ادائیگی", + "CASH_OUT": "کیش آؤٹ", + "REMOVE_FUNDS": "فنڈز کو ہٹا دیں۔", + "OUT": "باہر", + "SUPPORT": "حمایت", + "CONTACT_LOWER": "رابطہ", + "EMAIL_LOWER": "ای میل", + "RESOURCE": "وسائل", + "GUIDES": "رہنما", + "FAQ": "سوالات", + "CUSTOMER_SERVICE": "کسٹمر سروس", + "ASSISTANCE": "مدد", + "API_LOWER": "API", + "MESSAGE": "پیغام", + "LIVE_CHAT": "لائیو چیٹ", + "SETTINGS": "ترتیبات", + "ALERT": "الرٹ", + "UPDATES": "اپڈیٹس", + "REMINDERS": "یاد دہانیاں", + "UI": "UI", + "USER_INTERFACE": " یوزر انٹرفیس", + "LAYOUT": "لے آؤٹ", + "DESIGN": "ڈیزائن", + "DASHBOARD": "ڈیش بورڈ", + "COLOR_THEME": "رنگین تھیم", + "ORDER_BOOK": "آرڈر بک", + "DARK": "اندھیرا", + "LIGHT": "روشنی", + "WITHDRAWAL_ADDRESSES": "واپسی کے پتے", + "CRYPTO_ADDRESSES": "کرپٹو ایڈریسز", + "WALLET_ADDRESSES": " بٹوے کے پتے", + "SAVED_ADDRESSES": "محفوظ کردہ پتے", + "ADDRESS_BOOK": "ایڈریس بک", + "WHITE_LISTED": "سفید فہرست" + } + }, + "CONNECTIONS": { + "CHECK_CONNECTION": "کنکشن چیک کریں۔", + "IP": "آئی پی", + "NORMAL_TEXT": "نارمل", + "CONNECTION_ISSUE": "کنکشن کا مسئلہ", + "SESSION": "سیشن", + "SERVER_TIME": "سرور کا وقت", + "PING": "پنگ", + "CHECK_PING": "پنگ چیک کریں۔", + "RECONNECT": "دوبارہ جڑیں۔", + "TOOLTIP_DESC_1": "ایکسچینج سرور پر اپنا پنگ چیک کریں {0}", + "TOOLTIP_DESC_2": "لوئر 'ایم ایس' بہتر ہے۔", + "LOGGED_IN_AT": "پر لاگ ان ہوا۔", + "RECONNECT_DESC": "دوبارہ جڑنے سے آپ کو درپیش نامعلوم مسائل حل ہو سکتے ہیں۔", + "CONFIRM_RECONNECT_MESSAGE": "کیا آپ دوبارہ جڑنا چاہتے ہیں؟", + "PING_CHECK_TEXT": "سرور کو پنگ کرنا۔ برائے مہربانی انتظار کریں...", + "RECHECK_PING": "پنگ کو دوبارہ چیک کریں۔", + "FAST": "تیز", + "SLOW": "سست", + "MS": "{0} ms", + "STATUS_NORMAL": "کنکشن نارمل", + "CONNECTION_LABEL": "کنکشن", + "CONNECTION_ISSUE_DETECTED": "کنکشن کے مسئلے کا پتہ چلا" + }, + "DESKTOP_NAVIGATION": { + "OTHERS": "دوسرے", + "SUMMARY_DESCRIPTION": "اکاؤنٹ کی سطح کی معلومات اور رسائی", + "FEES_LIMITS_DESC": "تجارت اور واپسی کی فیس۔ اکاؤنٹ کی حدود", + "VOLUME_DESC": "وقت کے ساتھ تجارتی حجم کا خلاصہ", + "DEPOSIT_DESC": "والیٹ ڈپازٹ فنڈنگ کے اختیارات تک رسائی حاصل کریں۔", + "BALANCE_DESC": "آپ کے تمام اثاثے اور ان کے بیلنس", + "PERFORMANCE_DESC": "بٹوے کا نفع اور نقصان", + "HISTORY_DESC": "تمام تجارت، جمع اور نکالنے کا جائزہ لیں۔", + "ADDRESS_BOOK_DESC": "واپسی کے لیے ایڈریس بک سے رابطہ کریں۔", + "WITHDRAW_DESC": "بٹوے کی واپسی اور منتقلی۔", + "ASSETS_DESC": "قیمتوں کو ٹریک کریں اور اثاثوں کا ڈیٹا دریافت کریں۔", + "CONVERT_DESC": "کسی بھی اثاثے کو کسی دوسرے کے لئے آسانی سے تجارت کریں۔", + "MARKET_DESC": "اسپاٹ ٹریڈنگ آرڈر بک مارکیٹس۔", + "P2P_DESC": "کرپٹو ٹریڈنگ", + "REFERRAL_DESC": "اپنے دوستوں کو مدعو کرکے غیر فعال آمدنی حاصل کریں۔", + "CEFI_STAKE_DESC": "اپنے ایکسچینج والیٹ سے اثاثہ لگائیں۔", + "DEFI_STAKE_DESC": "بٹوے کو جوڑیں اور اپنا اثاثہ داؤ پر لگائیں۔", + "BUY_CRYPTO_DESC": "براہ راست بینک ٹرانسفر یا کارڈز کے ذریعے خریدیں۔", + "SECURITY_DESC": "اکاؤنٹ 2FA، پاس ورڈ اور APIs", + "VERIFICATION_DESC": "اکاؤنٹ کی شناخت کی تصدیق", + "SETTINGS_DESC": "انٹرفیس اور اکاؤنٹ کی دیگر ترتیبات", + "SUMMARY_PAGE": "خلاصہ صفحہ", + "SIGNOUT_DESC": "اکاؤنٹ لاگ آؤٹ", + "LANGUAGE_DESC": "زبان کی ترجیحات کو تبدیل کریں۔", + "API_DESC": "پروگرامی طور پر اپنے اکاؤنٹ تک رسائی کے لیے API کیز استعمال کریں۔", + "HELP_DESC": "مدد حاصل کریں۔ سپورٹ رابطہ", + "TRANSACTION_DESC": "تمام تجارت، جمع اور نکالنے کا جائزہ لیں۔", + "ONRAMPER_DESC": "کرپٹو خریدنے اور بیچنے کے لیے Onramper استعمال کریں۔" } } \ No newline at end of file diff --git a/web/src/config/lang/vi.json b/web/src/config/lang/vi.json index a548e8af9f..8a7e265582 100644 --- a/web/src/config/lang/vi.json +++ b/web/src/config/lang/vi.json @@ -142,7 +142,7 @@ "OPTION_BUG": "Báo cáo lỗi", "OPTION_PERSONAL_INFO": "Thay đổi thông tin cá nhân", "OPTION_BANK_TRANSFER": "Chuyển khoản điện tử liên ngân hàng", - "OPTION_REQUEST": "Yêu cầu mời tham gia HollaEx Exchange" + "OPTION_REQUEST": "Yêu cầu mời tham gia Exchange" }, "SUBJECT_LABEL": "Tiêu đề", "SUBJECT_PLACEHOLDER": "Nhập tiêu đề cho vấn đề của quý khách", @@ -168,7 +168,8 @@ "QR_CODE": "Người muốn chuyển tiền cho quý khách có thể quét mã QR này.", "NO_DATA": "Không có thông tin phù hợp", "FULL_MESSAGE_LIMIT": "{0}: {1} {2} {3}", - "QR_CODE_TITLE": "{0} Thông tin tiền gửi" + "QR_CODE_TITLE": "{0} Thông tin tiền gửi", + "VIEW_DEPOSIT": "Xem tiền gửi" }, "LOGIN": { "LOGIN_TO": "Đăng nhập {0}", @@ -278,7 +279,10 @@ "MOBILE_WALLET_BALANCE_LABEL": "Thiên Bình/Đông. USDT", "MOBILE_WALLET_SHARE_LABEL": "% Chia sẻ/Ước tính USDT", "VIEW_MORE_WALLET_INFO": "XEM THÊM THÔNG TIN VÍ", - "VIEW_WALLET_TRANSACTION_HISTORY": "XEM LỊCH SỬ GIAO DỊCH VÍ" + "VIEW_WALLET_TRANSACTION_HISTORY": "XEM LỊCH SỬ GIAO DỊCH VÍ", + "ORDERS_HOLD": "Bạn có {0} {1}, dẫn đến việc giữ {2} {3} trên số dư {4} của bạn", + "OPEN_ORDERS_SINGULAR": "lệnh mở", + "VIEW_WALLET": "Xem ví" }, "REQUEST_RESET_PASSWORD": { "TITLE": "Khôi phục tài khoản", @@ -617,7 +621,8 @@ "CANCEL": "Hủy bỏ", "PLACEHOLDER": "Nhập ở đây" } - } + }, + "TITLE_TEXT": "Xem lại cài đặt tài khoản của bạn bằng cách điều chỉnh các tùy chọn như bố cục giao diện, tùy chọn thông báo, tên người dùng và các tùy chỉnh khác." }, "TRANSACTION_HISTORY": { "TITLE": "Lịch sử", @@ -783,13 +788,13 @@ "FORFEITURE_OF_EARNINGS_DETAILS_LABEL": "Mất thu nhập", "STAKE_AMOUNT_LABEL": "Số tiền cọc", "DISCLAIMER_NOTICE": "Thông báo: Vui lòng lưu ý rằng đối với số tiền có giá trị trong USD vượt quá 1.000 đô la sẽ yêu cầu hoàn thành xác minh danh tính. Giá trị này bao gồm thu nhập và nền tảng có quyền yêu cầu thông tin người dùng bổ sung.", - "SETTLEMENT_NOTICE": "Thanh toán: Một khoảng thời gian thanh toán 24 giờ sẽ được áp dụng sau khi rút sớm.", + "SETTLEMENT_NOTICE": "{0} Thời hạn thanh toán 24 giờ sẽ được áp dụng khi hủy đặt cọc.", "CONFIRM_BUTTON": "Xác nhận", "STAKE_RULES_NOTICE": "Ngay khi bạn đã đặt cọc, bạn sẽ cam kết với các quy định của hồ bơi.", "I_UNDERSTAND_AGAIN_BUTTON": "Tôi hiểu lại", "CONGRATULATIONS_NOTICE": "Chúc mừng!", "EARNINGS_START_NOTICE": "Cọc của bạn sẽ bắt đầu kiếm phần thưởng.", - "REVIEW_PROGRESS_LABEL": "Bạn có thể xem tiến trình cọc của mình trên trang Các cọc hoạt động.", + "REVIEW_PROGRESS_LABEL": "Bạn có thể xem lại tiến trình của cổ phần của bạn trên {0}", "TIME_REMAINING_LABEL": "Thời gian còn lại", "PENALTY_UPON_INITIAL_STAKE_PRINCIPLE_LABEL_2": "Phạt khi bắt đầu nguyên tắc cọc", "FORFEITURE_OF_EARNINGS_LABEL_2": "Mất thu nhập", @@ -799,7 +804,26 @@ "VISIT_WALLET_BUTTON": "TRUY CẬP VÍ", "CLOSE_BUTTON": "ĐÓNG", "ACTIVE_STAKES": "Cổ phần đang hoạt động", - "STAKES_HISTORY": "Lịch sử" + "STAKES_HISTORY": "Lịch sử", + "SETTLEMENT_NOTICE_TITLE": "Giải quyết:", + "REVIEW_PROGRESS_ACTIVE_LINK": "Trang Cổ phần đang hoạt động", + "STAKING": "Đặt cược 101", + "SLASHING": "chém", + "MINIMUM_AMOUNT_ALLOWED": "Số tiền tối thiểu được phép của nhóm đặt cược là", + "MAXIMUM_AMOUNT_ALLOWED": "Số tiền tối đa được phép của nhóm đặt cược là", + "DAYS": "Ngày", + "CONFIRM_STAKE_DECS": "Chúng ta bắt đầu thôi!", + "DO_YOU_UNDERSTAND": "Bạn hiểu không?", + "SUCCESSFULLY_STAKED_IN": "Đã đặt cược thành công", + "SUCCESSFULLY_STAKED": "Đã đặt cược thành công", + "VIEW_ACTIVE_STAKES": "XEM CỔ PHẦN ĐANG HOẠT ĐỘNG", + "REVIEW_AND_UNSTAKE": "Xem lại và hủy bỏ", + "NO_REWARD": "Không có số tiền thưởng để nhận", + "SUCCESSFULLY_UNSTAKED": "Bạn đã unstake thành công", + "MIN": "Tối thiểu", + "UNSTAKING": "GỠ CỌC...", + "UNSTAKED": "KHÔNG CÓ CỌC", + "TOOLTIP": "Hình phạt bạn sẽ phải chịu nếu bạn hủy cược quá sớm. {0}" }, "CURRENCY": "Loại tiền", "TYPE": "Type", @@ -914,7 +938,9 @@ "ENTER_AMOUNT": "Nhập số tiền", "REMOVE_TITLE": "Xóa thẻ", "MAX_AMOUNT_WARNING_INFO": "Số tiền này vượt quá giới hạn rút tiền tối đa của bạn.", - "ZERO_BALANCE": "Bạn không có đủ số dư khả dụng." + "ZERO_BALANCE": "Bạn không có đủ số dư khả dụng.", + "MIN_AMOUNT_WARNING_INFO": "Số tiền rút tối thiểu là {0}", + "NEW_ADDRESS": "Địa chỉ mới" }, "WALLET_BUTTON_BASE_DEPOSIT": "Nạp tiền", "WALLET_BUTTON_BASE_WITHDRAW": "Rút tiền", @@ -1284,7 +1310,8 @@ "INSUFFICIENT_LABEL": "Số tiền thanh toán không đủ", "INSUFFICIENT_INFO_1": "Thu nhập của bạn hiện không đủ để thanh toán. Vui lòng mời thêm thành viên bằng liên kết giới thiệu của bạn và đợi cho đến khi thu nhập chưa thanh toán của bạn {0} {1}", "INSUFFICIENT_INFO_2": "vượt quá 1", - "GO_TO_REFERRAL": "Đi tới giới thiệu" + "GO_TO_REFERRAL": "Đi tới giới thiệu", + "REFER_DESC": "Chia sẻ liên kết bên dưới với bạn bè để bắt đầu kiếm hoa hồng từ giao dịch của họ" }, "USER_LEVEL": "Cấp bậc người dùng", "LIMIT_AMOUNT": "Khối lượng hạn mức", @@ -1324,7 +1351,11 @@ "CHANGE_7D": "Thay đổi (7 ngày)", "CHANGE_1D": "Thay đổi (1 ngày)", "CHART_7D": "Biểu đồ (7 ngày)", - "ASSET": "Tài sản" + "ASSET": "Tài sản", + "PERCENTAGE": "% {0}", + "24H": "24H", + "TREND_7D": "Xu hướng 7D", + "BUY": "Mua {0} {1}" }, "ORDER_MODE": "Chế độ đặt hàng", "REGULAR": "Thông thường", @@ -1501,7 +1532,10 @@ "INSTALL_METAMASK_DETAILS": { "TITLE": "Cài đặt MetaMask", "PROMPT": "Bạn phải cài đặt Metamask vào trình duyệt của mình: {0}" - } + }, + "EARN_REWARD": "Kiếm phần thưởng khi đặt cược tài sản kỹ thuật số của bạn", + "DEFI_STAKING": "Đặt cược DeFi", + "CEFI_STAKING": "Đặt cược CeFi" }, "UNSTAKE": { "TITLE": "hủy bỏ cổ phần", @@ -1824,7 +1858,18 @@ "ORDERBOOK": "Quyển sổ đặc Mua hàng", "NETWORK": "Nhà môi giới mạng OTC", "BROKER": "Nhà môi giới địa phương OTC", - "BROKERAGE": "NA - (Môi giới)" + "BROKERAGE": "NA - (Môi giới)", + "LOADING_PRICES": "Đang tải giá...", + "INPUT_LABEL": "Nhập tên tài sản hoặc ký hiệu", + "HIGHLIGHTS": "Điểm nổi bật", + "MOBILE_DESC": "Chọn một thị trường bên dưới để bắt đầu giao dịch.", + "PRICE_24H": "Giá/24H %", + "CARDS": { + "GAINERS": "Người chiến thắng", + "LOSERS": "Những kẻ thua cuộc", + "MARKET_CAP": "Vốn hóa thị trường", + "24H": "{0} 24 giờ" + } }, "HOLLAEX_TOKEN": { "REMOVE_FAVOURITES": "Loại bỏ khỏi mục ưa thích", @@ -1870,7 +1915,8 @@ "TAG": "Nhãn:", "DISABLED_DEPOSIT_CONTENT": "Chức năng gửi tiền tạm thời không khả dụng.", "DISABLED_WITHDRAW_CONTENT": "Chức năng rút tiền tạm thời không khả dụng.", - "DEPOSIT_LABEL": "Tiền gửi" + "DEPOSIT_LABEL": "Tiền gửi", + "VOLUME": "ÂM LƯỢNG" }, "ASYNC_LINK": { "TITLE": "Trang không tự động mở?", @@ -2059,7 +2105,8 @@ "WALLET_BALANCE_ESTIMATE": "Ước tính số dư ví ngày hôm nay ", "VIEW_BALANCE_HISTORY": "XEM LỊCH SỬ SỐ DƯ", "VIEW_PERCENTAGE_SHARE": "XEM TỶ LỆ CHIA SẺ", - "VIEW_WALLET_P&L": "XEM P&L VÍ" + "VIEW_WALLET_P&L": "XEM P&L VÍ", + "BALANCE_PERCENTAGE": "Phần trăm cân bằng" }, "ASSET_INFO": "Thông tin tài sản", "TAKER_FEES_APPLIED": "Phí Taker được áp dụng", @@ -2208,7 +2255,7 @@ "TOTAL_ASSET_SELL_1": "Tổng cộng", "TOTAL_ASSET_SELL_2": "bạn có thể bán", "BUY_ORDER_LIMITS": "GIỚI HẠN ĐƠN MUA", - "MIN_MAX_ORDER_VALUE_1": "Tối thiểu và tối đa", + "MIN_MAX_ORDER_VALUE_1": "Tối thiểu và tối đa {0} {1}", "MIN_MAX_ORDER_VALUE_2": "giá trị đơn hàng mua trong", "PAYMENT_METHODS_SEND_FIAT": "PHƯƠNG THỨC THANH TOÁN ĐỂ GỬI FIAT", "SELECT_PAYMENT_METHODS_1": "Chọn tối đa", @@ -2224,7 +2271,7 @@ "DEAL_EDITED": "Thỏa thuận đã được chỉnh sửa", "DEAL_CREATED": "Giao dịch đã được tạo", "NEXT": "KẾ TIẾP", - "ADD_PAYMENT_METHOD_DETAILS": "Thêm chi tiết phương thức thanh toán", + "ADD_PAYMENT_METHOD_DETAILS": "{0} Chi tiết phương thức thanh toán", "COMPLETE": "Hoàn thành", "STEP_SET_TYPE_PRICE": "Đặt loại và giá", "STEP_SET_TOTAL_AMOUNT_PAYMENT_METHODS": "Đặt tổng số tiền và phương thức thanh toán", @@ -2254,6 +2301,400 @@ "ALL_REGION": "Tất cả khu vực", "BUYER_NOT_MADE_THE_PAYMENT": "Người mua chưa xác nhận thanh toán của họ.", "PRICE_TO_ADVERTISE": "Giá bạn sẽ quảng cáo để bán", - "VIEW_PROFILE": "Xem hồ sơ nhà cung cấp" + "VIEW_PROFILE": "Xem hồ sơ nhà cung cấp", + "P2P_METHODS": "Phương thức thanh toán P2P", + "PAYMENT_METHODS": "PHƯƠNG THỨC THANH TOÁN", + "PAYMENT_METHODS_DEC": "Bạn có thể bán tiền điện tử và nhận thanh toán bằng tiền pháp định bằng cách thêm thông tin tài khoản thanh toán cá nhân của mình, chẳng hạn như thông tin ngân hàng hoặc các phương thức thanh toán địa phương khác. Đảm bảo rằng tên được liên kết với tài khoản thanh toán của bạn khớp với tên trong thông tin đã xác minh của bạn trước khi thêm thông tin thanh toán.", + "SELL_AMOUNT": "Số lượng bán", + "ADD_PAYMENT_METHOD": "+ THÊM PHƯƠNG THỨC THANH TOÁN", + "REMOVE": "DI DỜI", + "DYNAMIC": "NĂNG ĐỘNG", + "TYPE": "KIỂU", + "BACK_TO_ORDERS": "để đặt hàng", + "FUNDS_TRANSFERRED_USER": "Người dùng đã xác nhận giao dịch và tiền đã được chuyển vào số dư của bạn.", + "CONFIRM_TRANSFER_USER": "XÁC NHẬN CHUYỂN GIAO VÀ THÔNG BÁO CHO NGƯỜI DÙNG", + "BUYER_SENT_FUNDS_USER": "Bạn đã báo hiệu cho người dùng rằng bạn đã gửi tiền. Vui lòng đợi phản hồi từ người dùng.", + "VENDOR_CONFIRMED_ORDER_USER": "Người dùng xác nhận giao dịch và giải ngân.", + "BUY_UPPER": "MUA", + "CRYPTO_WANT_TO_BUY": "Tiền điện tử bạn muốn mua", + "FIAT_CURRENCY_WANT_TO_SPEND": "Tiền tệ fiat để chi tiêu", + "PRICE_ADVERTISE": "Giá bạn sẽ quảng cáo tới {0}", + "TOTAL_AMOUNT": "Tổng số tiền", + "BUY_SELL_DESC": "bạn có thể {0}", + "SELL_ORDER_LIMITS": "GIỚI HẠN LỆNH BÁN", + "MIN_MAX_ORDER_VALUE_3": "giá trị lệnh bán", + "PAYMENT_METHODS_RECEIVE_FIAT": "PHƯƠNG THỨC THANH TOÁN ĐỂ NHẬN FIAT", + "PAYMENT_TIME_LIMIT_LABEL": "Thời hạn thanh toán: {0}", + "30_MINUTES": "30 phút", + "DELETE_UPPERCASE": "XÓA BỎ", + "CLICK_TO_VIEW": "CLICK ĐỂ XEM", + "NEW_MESSAGE": "Bạn đã nhận được tin nhắn P2P", + "STATUS_UPDATE": "Bạn có thông tin cập nhật về đơn hàng P2P của mình", + "APPEAL_STATUS_MESSAGE": "Đơn hàng P2P của bạn đã được kháng cáo", + "CANCEL_STATUS_MESSAGE": "Đơn hàng P2P của bạn đã bị hủy", + "CONFIRM_STATUS_MESSAGE": "Đơn hàng P2P của bạn đã được xác nhận", + "NEW_ORDER_CREATED": "Đơn hàng P2P mới đã được tạo", + "CRYPTO_RELEASE_STATUS_MESSAGE": "Tiền điện tử đã được giải phóng khỏi lệnh", + "ADDITIONAL_PAYMENT_DETAILS": "Thêm thông tin thanh toán bổ sung", + "PAYMENT_FIELD_INFO": "Trường thanh toán mới này là bổ sung và sẽ hỗ trợ những người tham gia P2P trong việc chuyển tiền fiat. Đây phải là thông tin chi tiết về tài khoản liên quan đến phương thức thanh toán. Có thể bao gồm số điện thoại, tên người dùng, số tài khoản duy nhất và các thông tin cần thiết khác cho giao dịch tùy thuộc vào hệ thống phương thức thanh toán.", + "PAYMENT_DETAIL_NAME": "Tên chi tiết thanh toán", + "REQUIRED_OR_OPTIONAL": "Bắt buộc hoặc tùy chọn", + "CREATE_NEW_PAYMENT_METHODS": "Tạo và thêm phương thức thanh toán mới", + "MANUAL_PAYMENT_METHOD_ENTRY": "Để thêm phương thức thanh toán vào nền tảng P2P của bạn, bạn có thể thực hiện thủ công bằng cách nhập tên phương thức thanh toán và thông tin thanh toán cần thiết. Ví dụ: PayPal sử dụng địa chỉ email để gửi và nhận tiền.", + "USERS_PAYMENT_SELECTION": "Sau khi phương thức thanh toán được thêm vào, các thương gia P2P và người dùng của bạn sẽ có thể chọn phương thức đó và nhập thông tin cần thiết khi thực hiện hoặc nhận thanh toán. Các chi tiết họ cung cấp sẽ được chia sẻ với bên kia trong giao dịch P2P.", + "METHOD_NAME_AND_DETAIL": "Tên phương thức và chi tiết thanh toán chính", + "ADD_NEW_PAYMENT_METHODS": "Chọn phương thức thanh toán mới:", + "DETAIL_NAME": "Tên chi tiết thanh toán", + "DETAIL_VALUE": "Giá trị chi tiết thanh toán", + "DETAIL_REQUIRED": "Yêu cầu", + "IMPORTANT_DETAIL": "(Chi tiết thanh toán quan trọng)", + "DETAIL_OPTIONAL": "Không bắt buộc", + "OPTIONAL_DETAIL": "(Chi tiết thanh toán tùy chọn)", + "ADD_NEW_PAYMENT_FIELD": "Thêm trường chi tiết thanh toán mới", + "PAYMENT_METHOD_CREATED": "Đã tạo phương thức thanh toán! Đang chờ xác minh của quản trị viên", + "PAYMENT_METHOD_DELETED": "Đã xóa phương thức thanh toán.", + "PAYMENT_METHOD_UPDATED": "Đã cập nhật phương thức thanh toán.", + "CRYPTO": "Tiền mã hóa:", + "INPUT_SPEND_AMOUNT": "Nhập số tiền chi tiêu", + "INPUT_SELL_AMOUNT": "Nhập số lượng bán", + "TIMES": "lần", + "FEEDBACK": "Nhận xét", + "ASSET": "Tài sản: ", + "CUSTOM": "Phong tục", + "CANCELLED": "Đã hủy", + "APPEALED": "Đã kháng cáo", + "EXPIRED": "Hết hạn", + "RATE": "Tỷ lệ:", + "BUYING": "Mua {0}", + "SELLING": "Bán {0}", + "TERMS_AND_CONDITION_DESCRIPTION": "Vui lòng đăng trong vòng 15 phút kể từ khi giao dịch diễn ra", + "VISIT_OUR_WEBSITE": "Truy cập trang web của chúng tôi", + "SELECT_PAYMENT_SYSTEM_LABEL": "Chọn hệ thống thanh toán", + "FIELD": "Cánh đồng", + "NEW_PAYMENT_PLACEHOLDER": "Nhập giá trị chi tiết thanh toán", + "FIELD_VALIDATION_TEXT": "Vui lòng nhập tất cả các trường phương pháp", + "INPUT_METHOD_NAME_TEXT": "Vui lòng nhập tên phương pháp", + "INPUT_PAYMENT_DETAIL_TEXT": "Nhập tên chi tiết thanh toán", + "UNVERIFIED": "Chưa xác minh", + "VERIFIED": "Đã xác minh", + "AMOUNT_RECEIVE": "sẽ được giải phóng khỏi số dư của bạn", + "DELETE_WARNING": "Bạn có chắc chắn muốn xóa phương thức thanh toán này không?", + "STEP_1": "Bước 1/3", + "STEP_2": "Bước 2/3", + "STEP_3": "Bước 3/3", + "P2P_ORDER_CREATED": "Đã tạo đơn hàng P2P", + "VENDOR_CHECKS_TITLE": "Kiểm tra & Xác nhận Thanh toán", + "FUND_RELEASED": "Quỹ được giải ngân", + "ORDER_EXPIRY": "Đơn hàng hết hạn trong", + "MINIMUM_AMOUNT_WARNING": "Tối thiểu {0} là {1}", + "MAXIMUM_AMOUNT_WARNING": "Giá trị {0} tối đa là {1}", + "ORDER_CREATION": "Tạo đơn hàng", + "ORDER_CREATION_DESC_1": "Bằng cách nhấp vào 'Tạo đơn hàng', bạn sẽ thông báo cho nhà cung cấp và nhận được báo giá ngay lập tức cùng với thông tin chuyển khoản thanh toán chính xác. {0} {1} {2} {3}", + "ORDER_CREATION_DESC_2": "Bao gồm số tiền chính xác cần thiết để hoàn tất đơn hàng của bạn.", + "YOU_HAVE_TEXT": "Bạn sẽ có", + "COMPLETE_PAYMENT_PROCESS": "để hoàn tất quá trình chuyển tiền.", + "WARINNG_DESC": "Vui lòng chỉ tiếp tục tạo đơn hàng nếu bạn thực sự có ý định hoàn tất đơn hàng.", + "ORDER_CANCEL_DESC": "Việc hủy đơn hàng có thể dẫn đến việc tài khoản bị đình chỉ.", + "CONFIRM_ORDER_CREATION": "Khi bạn đã sẵn sàng {0}, vui lòng nhấp vào 'Tạo đơn hàng' bên dưới.", + "SEND_MONEY": "gửi tiền", + "RECEIVE_MONEY": "nhận tiền", + "CREATE_ORDER": "Tạo đơn hàng", + "NO_ORDERS_DESC": "Có vẻ như không có đơn hàng nào ở đây.", + "NO_DEALS_DESC": "Có vẻ như không có giao dịch nào ở đây.", + "ONLINE": "TRỰC TUYẾN", + "OFFLINE": "NGOẠI TUYẾN", + "SELECT_CRYPTO": "Chọn tiền điện tử", + "REMOVE_WARNING": "Bạn có chắc chắn muốn xóa thỏa thuận này không?", + "SHOW_FILTERS": "HIỂN THỊ BỘ LỌC", + "HIDE_FILTERS": "ẨN BỘ LỌC", + "ORDERS_COMPLETED": "Đơn hàng đã hoàn thành:", + "CANCEL_WARNING_TEXT": "Xin lưu ý rằng việc hủy đơn hàng thường xuyên có thể ảnh hưởng tiêu cực đến hồ sơ P2P công khai của bạn và có thể dẫn đến việc tài khoản của bạn bị đình chỉ.", + "UPDATE": "Cập nhật", + "TERMS_ERROR_TEXT": "Vui lòng nhập trường Điều khoản", + "RESPONSE_ERROR_TEXT": "Vui lòng nhập trường Phản hồi" + }, + "CUSTOM_NATIVE_CURRENCY": "Tiền tệ (Ước tính giá trị tài sản và giá trị định giá)", + "ADDRESS_BOOK": { + "ADDRESS_BOOK_LABEL": "Sổ địa chỉ", + "ADDRESS_BOOK_DESC_1": "Thêm địa chỉ rút tiền được liệt kê trắng vào sổ địa chỉ cá nhân của bạn", + "ADDRESS_BOOK_DESC_2": "Bạn có thể dễ dàng sử dụng địa chỉ này khi rút tiền.", + "ADD_ADDRESS_LINK": "Thêm địa chỉ", + "ADD_WITHDRAW_ADDRESS": "Thêm địa chỉ rút tiền", + "DATE_ADDED": "Ngày thêm", + "REMOVE": "Di dời", + "NO_LINK": "Chưa có địa chỉ rút tiền nào được thêm vào.", + "ADD_WITHDRAW_ADDRESS_DESC_1": "Thêm một địa chỉ được liệt kê là an toàn mà bạn có thể rút tiền về đó.", + "ADD_WITHDRAW_ADDRESS_DESC_2": "Địa chỉ rút tiền này phải là địa chỉ do bạn kiểm soát.", + "NAME_YOUR_ADDRESS_TITLE": "Tên địa chỉ của bạn", + "NAME_YOUR_ADDRESS_DESC": "Đặt tên cho địa chỉ rút tiền này để bạn tham khảo sau này.", + "USER_LABEL": "Tên/nhãn:", + "USER_FIELD_PLACEHOLDER": "Đặt tên cho địa chỉ rút tiền này", + "CHECK_AND_CONFIRM": "Kiểm tra và xác nhận", + "WARNING_ADDRESS": "Trước khi thêm địa chỉ này vào sổ địa chỉ của bạn, vui lòng dành thời gian kiểm tra và xác nhận thông tin chi tiết là chính xác:", + "ENSURE_DESC": "Đảm bảo địa chỉ là chính xác và nằm trong tầm kiểm soát của bạn.", + "ADDRESSES": "Địa chỉ", + "WITHDRAWAL_ADDRESS_BOOK": "Sổ địa chỉ rút tiền", + "ADD_ADDRESS_DESC": "Thêm địa chỉ rút tiền vào {0}", + "ADDRESS_BOOK": "Sổ địa chỉ", + "MANAGE_ADDRESS_BOOK": "Quản lý sổ địa chỉ", + "VIEW_ADDRESS_BOOK_LABEL": "Xem sổ địa chỉ", + "ADD_WITHDRAWAL_ADDRESS_LINK": "Thêm địa chỉ rút tiền", + "REVOKE_ADDRESS": "Địa chỉ của bạn đã bị xóa", + "REMOVE_ADDRESS": "Xóa Địa Chỉ", + "REMOVE_CONTENT": "Bạn có muốn xóa địa chỉ rút tiền này khỏi sổ địa chỉ của mình không?" + }, + "VOLUME": { + "VOLUME": "ÂM LƯỢNG", + "BACK": "Mặt sau", + "MARKETS": "THỊ TRƯỜNG", + "CONVERT": "CHUYỂN THÀNH", + "HISTORY": "LỊCH SỬ", + "TRADING_VOLUME": "Khối lượng giao dịch", + "VOLUME_DECS": "Số tiền giao dịch trên tài khoản của bạn trong các khoảng thời gian khác nhau, cùng với 3 tài sản được giao dịch nhiều nhất trong mỗi khoảng thời gian", + "ALL_ASSETS": "tất cả tài sản", + "DAY_VOLUME": "KHỐI LƯỢNG NGÀY", + "HOUR_VOLUME": "ÂM LƯỢNG 24 GIỜ", + "TOP": "ĐẦU TRANG {0} {1}", + "VOL_ASSET": "D TẬP. TÀI SẢN", + "NO_DATA_DESC_1": "Có vẻ như bạn chưa thực hiện bất kỳ giao dịch nào. Hãy bắt đầu giao dịch ngay để xem hoạt động của bạn tại đây!", + "NO_DATA_DESC_2": "Bắt đầu giao dịch", + "NO_DATA_DESC_3": "Bây giờ hãy xem hoạt động của bạn ở đây!", + "TRADE_VOLUME": "Khối lượng giao dịch", + "VIEW_VOLUME": "XEM ÂM LƯỢNG", + "TRADE_DESCRIPTION": "Xem tài sản được giao dịch nhiều nhất của bạn", + "MARKET_TABLE_DESC": "Truy cập trang khối lượng giao dịch của bạn {0}" + }, + "MORE_OPTIONS_LABEL": { + "MORE_OPTION_SEARCH_TXT": "Tính năng tìm kiếm hoặc trang", + "NO_RESULT_DESC_1": "Có vẻ như không có kết quả nào cho việc này.", + "NO_RESULT_DESC_2": "Hãy thử tìm kiếm bằng một từ khóa khác.", + "ICONS": { + "REFERRALS": "Giới thiệu", + "BUY_CRYPTO": "Mua tiền điện tử", + "API": "Giao diện lập trình ứng dụng (API)", + "DEFI_STAKE": "Cổ phần Defi", + "CEFI_STAKE": "Cổ phần Cefi", + "PROFIT_LOSS": "L&L", + "LIMITS": "Giới hạn", + "LOGINS": "Đăng nhập", + "AUDIO": "Âm thanh" + }, + "HOT_FUNCTION": { + "HOT_FUNCTION_LABEL": "Chức năng nóng", + "ADD_FUNDS": "Thêm Quỹ", + "TOP_UP": "Nạp tiền", + "LOAD": "Trọng tải", + "CREDIT": "Tín dụng", + "FUND_ACCOUNT": "Tài khoản quỹ", + "BTC": "tiền tệ", + "USTD": "usdt", + "ETH": "và", + "USD": "đô la mỹ", + "XHT": "xht", + "TRANSFER": "chuyển khoản", + "MONEY": "tiền bạc", + "FUNDING": "tài trợ", + "RECHARGE": "nạp tiền", + "REFILL": "nạp lại", + "CASH_IN": "tiền mặt vào", + "ADD_MONEY": "thêm tiền", + "EXCHANGE": "Trao đổi", + "SWAP": "Tráo đổi", + "BUY_SELL": "Mua/Bán", + "TRADE": "Buôn bán", + "CONVERT_CURRENCY": "Chuyển đổi tiền tệ", + "INVITE": "Mời", + "REFER": "Tham khảo", + "REWARDS": "Phần thưởng", + "BONUS": "Thưởng", + "AFFILIATION": "sự liên kết", + "AFFILIATE": "liên kết", + "PASSIVE_INCOME": "Thu nhập thụ động", + "REVENUE": "doanh thu" + }, + "OTHER_FUNCTIONS": { + "OTHER_FUNCTIONS_LABEL": "Các chức năng khác", + "INTEGRATION": "Tích hợp", + "PROGRAMMATIC_ACCESS": "Truy cập theo chương trình", + "DEVELOPER": "Nhà phát triển", + "AUTOMATED_TRADING": "Giao dịch tự động", + "BOT": "Con bot", + "ALGO": "Thứ gì đó", + "ALGORITHM": "thuật toán", + "FIAT": "tiền pháp định", + "DOLLAR": "đô la", + "PURCHASE": "mua", + "BUY_COIN": "Mua Coin", + "BUY_TOKEN": "Mua Token", + "YIELD": "Năng suất", + "INTEREST": "Quan tâm", + "REVENUE": "doanh thu", + "CENTRALIZED_STAKING": "Staking tập trung", + "PERFORMANCE": "Hiệu suất", + "GAINS": "Lợi nhuận", + "LOSSES": "Mất mát", + "PORTFOLIO_PROFIT": "Lợi nhuận danh mục đầu tư", + "LOSS": "sự mất mát", + "PNL": "làm ơn", + "CHARGES": "Phí", + "COSTS": "Chi phí", + "COMMISSION": "Nhiệm vụ", + "TRADING_FEES": "Phí giao dịch", + "TRANSACTION_FEES": "Phí giao dịch", + "RESTRICTIONS": "Hạn chế", + "BOUNDARIES": "ranh giới", + "CAPS": "Mũ", + "MAXIMUM": "Tối đa", + "WITHDRAWAL_LIMITS": "Giới hạn rút tiền", + "STORAGE": "Kho", + "FUNDS": "Quỹ", + "BALANCE": "Sự cân bằng", + "CRYPTO_WALLET": "Ví tiền điện tử", + "MY": "Của tôi", + "ENGLISH": "Tiếng Anh", + "LOCALIZATION": "Bản địa hóa", + "TRANSLATE": "Dịch", + "LANGUAGE_SETTINGS": "Cài đặt ngôn ngữ", + "MULTILINGUAL": "Đa ngôn ngữ", + "LANGUAGE_PREFERENCE": "Sở thích ngôn ngữ", + "TEXT": "chữ", + "WORD": "từ", + "PEER_TO_PEER": "Ngang hàng", + "DIRECT_TRADE": "Thương mại trực tiếp", + "USER_TO_USER": "Người dùng với người dùng", + "PRIVATE_TRADE": "Thương mại tư nhân", + "TRANSACTIONS": "Giao dịch", + "ACTIVITY": "Hoạt động", + "RECORD": "Ghi", + "LOG": "Nhật ký", + "TRANSACTION_HISTORY": "Lịch sử giao dịch", + "LIQUIDITY": "Tính thanh khoản", + "MARKET_VOLUME": "Khối lượng thị trường", + "TRADING_ACTIVITY": "Hoạt động giao dịch", + "MARKETS": "thị trường", + "CRYPTO": "tiền mã hóa", + "TWO_FACTOR_AUTHENTICATION": "Xác thực hai yếu tố", + "MFA": "Thạc sĩ Mỹ thuật", + "AUTHENTICATOR": "Người xác thực", + "OTP": "otp", + "CREDENTIALS": "Chứng chỉ", + "PASSWORD_RESET": "Đặt lại mật khẩu", + "SIGN_INS": "Đăng nhập", + "ACCOUNT_ACCESS": "Truy cập tài khoản", + "SESSION_HISTORY": "Lịch sử phiên", + "LOGGED_IN": "Đã đăng nhập", + "SESSION_MANAGEMENT": "Quản lý phiên", + "CURRENT_SESSIONS": "Phiên hiện tại", + "BANKING_DETAILS": "Chi tiết Ngân hàng", + "BANK_ACCOUNT": "Tài khoản ngân hàng", + "FINANCIAL_INSTITUTION": "Tổ chức tài chính", + "BANK_INFO": "Thông tin ngân hàng", + "WITHDRAWAL_ACCOUNT": "Tài khoản rút tiền", + "FUND": "quỹ", + "SOUND": "Âm thanh", + "AUDIO_SETTINGS": "Cài đặt âm thanh", + "ALERTS": "Cảnh báo", + "NOTIFICATIONS": "Thông báo", + "AUDIO_ALERTS": "Cảnh báo âm thanh", + "SECURITY": "bảo vệ", + "CONTACT": "Liên hệ", + "EMAIL_ADDRESS": "Địa chỉ Email", + "MAIL": "Thư", + "EMAIL_CONTACT": "Email Liên hệ", + "KYC": "kyc", + "SMS": "tin nhắn", + "KYC_CAPS": "Nhận diện khách hàng", + "ID": "NHẬN DẠNG", + "PERSONAL_INFO": "Thông tin cá nhân", + "IDENTITY_CHECK": "Kiểm tra danh tính", + "PAYOUT": "Thanh toán", + "CASH_OUT": "Rút tiền", + "REMOVE_FUNDS": "Xóa Quỹ", + "OUT": "Ngoài", + "SUPPORT": "ủng hộ", + "CONTACT_LOWER": "liên hệ", + "EMAIL_LOWER": "e-mail", + "RESOURCE": "tài nguyên", + "GUIDES": "hướng dẫn", + "FAQ": "câu hỏi thường gặp", + "CUSTOMER_SERVICE": "dịch vụ khách hàng", + "ASSISTANCE": "hỗ trợ", + "API_LOWER": "api", + "MESSAGE": "tin nhắn", + "LIVE_CHAT": "trò chuyện trực tiếp", + "SETTINGS": "cài đặt", + "ALERT": "Báo động", + "UPDATES": "Cập nhật", + "REMINDERS": "Lời nhắc nhở", + "UI": "Giao diện người dùng", + "USER_INTERFACE": "Giao diện người dùng", + "LAYOUT": "Cách trình bày", + "DESIGN": "Thiết kế", + "DASHBOARD": "Bảng điều khiển", + "COLOR_THEME": "chủ đề màu sắc", + "ORDER_BOOK": "sổ lệnh", + "DARK": "tối tăm", + "LIGHT": "ánh sáng", + "WITHDRAWAL_ADDRESSES": "Địa chỉ rút tiền", + "CRYPTO_ADDRESSES": "Địa chỉ tiền điện tử", + "WALLET_ADDRESSES": "Địa chỉ ví", + "SAVED_ADDRESSES": "Địa chỉ đã lưu", + "ADDRESS_BOOK": "Sổ địa chỉ", + "WHITE_LISTED": "danh sách trắng" + } + }, + "CONNECTIONS": { + "CHECK_CONNECTION": "Kiểm tra kết nối", + "IP": "Địa chỉ IP", + "NORMAL_TEXT": "Bình thường", + "CONNECTION_ISSUE": "Vấn đề kết nối", + "SESSION": "Phiên họp", + "SERVER_TIME": "Thời gian máy chủ", + "PING": "Bình", + "CHECK_PING": "KIỂM TRA PING", + "RECONNECT": "Kết nối lại", + "TOOLTIP_DESC_1": "Kiểm tra ping của bạn tới máy chủ trao đổi {0}", + "TOOLTIP_DESC_2": "'ms' thấp hơn thì tốt hơn", + "LOGGED_IN_AT": "Đã đăng nhập tại", + "RECONNECT_DESC": "Kết nối lại có thể giải quyết được những sự cố chưa biết mà bạn đang gặp phải.", + "CONFIRM_RECONNECT_MESSAGE": "Bạn có muốn kết nối lại không?", + "PING_CHECK_TEXT": "Đang ping máy chủ. Vui lòng đợi...", + "RECHECK_PING": "KIỂM TRA LẠI PING", + "FAST": "Nhanh", + "SLOW": "Chậm", + "MS": "{0} giây", + "STATUS_NORMAL": "Kết nối bình thường", + "CONNECTION_LABEL": "Sự liên quan", + "CONNECTION_ISSUE_DETECTED": "Đã phát hiện sự cố kết nối" + }, + "DESKTOP_NAVIGATION": { + "OTHERS": "Người khác", + "SUMMARY_DESCRIPTION": "Thông tin và khả năng truy cập ở cấp độ tài khoản", + "FEES_LIMITS_DESC": "Phí giao dịch và rút tiền. Giới hạn tài khoản", + "VOLUME_DESC": "Tóm tắt khối lượng giao dịch theo thời gian", + "DEPOSIT_DESC": "Truy cập các tùy chọn gửi tiền vào ví", + "BALANCE_DESC": "Tất cả tài sản của bạn và số dư của chúng", + "PERFORMANCE_DESC": "Lợi nhuận và lỗ của ví", + "HISTORY_DESC": "Xem lại tất cả các giao dịch, gửi tiền và rút tiền", + "ADDRESS_BOOK_DESC": "Sổ địa chỉ liên hệ để rút tiền", + "WITHDRAW_DESC": "Rút tiền và chuyển tiền qua ví", + "ASSETS_DESC": "Theo dõi giá và khám phá dữ liệu tài sản", + "CONVERT_DESC": "Giao dịch bất kỳ tài sản nào để lấy một tài sản khác một cách đơn giản", + "MARKET_DESC": "Thị trường sổ lệnh giao dịch giao ngay.", + "P2P_DESC": "Giao dịch tiền điện tử", + "REFERRAL_DESC": "Kiếm thu nhập thụ động bằng cách mời bạn bè của bạn", + "CEFI_STAKE_DESC": "Đặt cọc tài sản từ ví trao đổi của bạn", + "DEFI_STAKE_DESC": "Kết nối ví và đặt cược tài sản của bạn", + "BUY_CRYPTO_DESC": "Mua qua chuyển khoản ngân hàng trực tiếp hoặc thẻ", + "SECURITY_DESC": "Tài khoản 2FA, mật khẩu và API", + "VERIFICATION_DESC": "Xác minh danh tính tài khoản", + "SETTINGS_DESC": "Giao diện và các thiết lập tài khoản khác", + "SUMMARY_PAGE": "Trang tóm tắt", + "SIGNOUT_DESC": "Đăng xuất tài khoản", + "LANGUAGE_DESC": "Thay đổi tùy chọn ngôn ngữ", + "API_DESC": "Sử dụng khóa API để truy cập tài khoản của bạn theo chương trình", + "HELP_DESC": "Nhận trợ giúp. Liên hệ hỗ trợ", + "TRANSACTION_DESC": "Xem lại tất cả các giao dịch, tiền gửi và rút tiền", + "ONRAMPER_DESC": "Sử dụng Onramper để mua và bán tiền điện tử" } } \ No newline at end of file diff --git a/web/src/config/lang/zh.json b/web/src/config/lang/zh.json index f6cca1ecd5..ae5976aa8b 100644 --- a/web/src/config/lang/zh.json +++ b/web/src/config/lang/zh.json @@ -129,7 +129,7 @@ "OPTION_BUG": "错误报告", "OPTION_PERSONAL_INFO": "更改个人信息", "OPTION_BANK_TRANSFER": "银行汇款", - "OPTION_REQUEST": "申请邀请参加HollaEx Exchange交流会" + "OPTION_REQUEST": "申请邀请参加 Exchange交流会" }, "SUBJECT_LABEL": "咨询题目", "SUBJECT_PLACEHOLDER": "输入问题的主题", @@ -155,7 +155,8 @@ "QR_CODE": "其他人可以使用该QR码像你转账。", "NO_DATA": "没有信息", "FULL_MESSAGE_LIMIT": "{0}: {1} {2} {3}", - "QR_CODE_TITLE": "{0}存款信息" + "QR_CODE_TITLE": "{0}存款信息", + "VIEW_DEPOSIT": "查看存款" }, "LOGIN": { "LOGIN_TO": "{0} 登录", @@ -265,7 +266,10 @@ "MOBILE_WALLET_BALANCE_LABEL": "天秤座/东方。泰达币", "MOBILE_WALLET_SHARE_LABEL": "%份额/估计 USDT", "VIEW_MORE_WALLET_INFO": "查看更多钱包信息", - "VIEW_WALLET_TRANSACTION_HISTORY": "查看钱包交易历史记录" + "VIEW_WALLET_TRANSACTION_HISTORY": "查看钱包交易历史记录", + "ORDERS_HOLD": "您有 {0} {1},因此您的 {4} 余额中将保留 {2} {3}", + "OPEN_ORDERS_SINGULAR": "未结订单", + "VIEW_WALLET": "查看钱包" }, "REQUEST_RESET_PASSWORD": { "TITLE": "找回账号", "SUBTITLE": "在下方找回账号", "SUPPORT": "联系客服", "BUTTON": "发送找回链接" }, "REQUEST_RESET_PASSWORD_SUCCESS": { "TITLE": "密码重置已发送", "TEXT": "如果该电子邮件是绑定于账号的电子邮件,则已向该账号发送了带有重置说明的邮件,请检查邮件并点击链接完成密码重置。" }, @@ -584,7 +588,8 @@ "CANCEL": "取消", "PLACEHOLDER": "在此输入" } - } + }, + "TITLE_TEXT": "通过调整界面布局、通知偏好、用户名和其他自定义等偏好来修改您的帐户设置。" }, "TRANSACTION_HISTORY": { "TITLE": "历史记录", @@ -735,13 +740,13 @@ "FORFEITURE_OF_EARNINGS_DETAILS_LABEL": "收益没收", "STAKE_AMOUNT_LABEL": "抵押金额", "DISCLAIMER_NOTICE": "免责声明:请注意,价值超过 1,000 美元的金额将需要完成身份验证。此金额包括收益,并且平台保留要求额外用户信息的权利。", - "SETTLEMENT_NOTICE": "结算:提前解锁将会施加 24 小时的结算期。", + "SETTLEMENT_NOTICE": "{0} 取消质押后将有 24 小时的结算期。", "CONFIRM_BUTTON": "确认", "STAKE_RULES_NOTICE": "一旦您抵押,您将承诺遵守本池的规则。", "I_UNDERSTAND_AGAIN_BUTTON": "我再次了解", "CONGRATULATIONS_NOTICE": "恭喜!", "EARNINGS_START_NOTICE": "您的抵押将开始赚取奖励。", - "REVIEW_PROGRESS_LABEL": "您可以在“活跃抵押”页面上查看您的抵押进展。", + "REVIEW_PROGRESS_LABEL": "您可以在{0}上查看您的赌注进度", "TIME_REMAINING_LABEL": "剩余时间", "PENALTY_UPON_INITIAL_STAKE_PRINCIPLE_LABEL_2": "初始抵押原则处罚", "FORFEITURE_OF_EARNINGS_LABEL_2": "收益没收", @@ -751,7 +756,26 @@ "VISIT_WALLET_BUTTON": "访问钱包", "CLOSE_BUTTON": "关闭", "ACTIVE_STAKES": "活跃股份", - "STAKES_HISTORY": "历史" + "STAKES_HISTORY": "历史", + "SETTLEMENT_NOTICE_TITLE": "沉降:", + "REVIEW_PROGRESS_ACTIVE_LINK": "活跃股份页面", + "STAKING": "质押 101", + "SLASHING": "削减", + "MINIMUM_AMOUNT_ALLOWED": "质押池允许的最低金额为", + "MAXIMUM_AMOUNT_ALLOWED": "质押池允许的最大金额为", + "DAYS": "天", + "CONFIRM_STAKE_DECS": "开始了!", + "DO_YOU_UNDERSTAND": "你明白吗?", + "SUCCESSFULLY_STAKED_IN": "成功质押", + "SUCCESSFULLY_STAKED": "成功质押", + "VIEW_ACTIVE_STAKES": "查看活跃股份", + "REVIEW_AND_UNSTAKE": "审核并取消质押", + "NO_REWARD": "暂无可领取的奖励金额", + "SUCCESSFULLY_UNSTAKED": "您已成功解除质押", + "MIN": "分钟", + "UNSTAKING": "取消质押...", + "UNSTAKED": "未质押", + "TOOLTIP": "如果您过早取消质押,您将受到惩罚。{0}" }, "CURRENCY": "加密货币", "TYPE": "Type", @@ -859,7 +883,9 @@ "ENTER_AMOUNT": "输入金额", "REMOVE_TITLE": "删除标签", "MAX_AMOUNT_WARNING_INFO": "此金额超出了您的最高提款限额。", - "ZERO_BALANCE": "您的可用余额不足。" + "ZERO_BALANCE": "您的可用余额不足。", + "MIN_AMOUNT_WARNING_INFO": "最低提款金额为{0}", + "NEW_ADDRESS": "新地址" }, "WALLET_BUTTON_BASE_DEPOSIT": "充值", "WALLET_BUTTON_BASE_WITHDRAW": "提款", @@ -1230,7 +1256,8 @@ "INSUFFICIENT_LABEL": "结算金额不足", "INSUFFICIENT_INFO_1": "您的收入目前不足以结算。请使用您的推荐链接邀请更多会员,并等待您的未结算收入{0} {1}", "INSUFFICIENT_INFO_2": "超过 1", - "GO_TO_REFERRAL": "前往推荐" + "GO_TO_REFERRAL": "前往推荐", + "REFER_DESC": "与朋友分享以下链接,开始从他们的交易中赚取佣金" }, "USER_LEVEL": "用户级别", "LIMIT_AMOUNT": "限额", @@ -1267,7 +1294,11 @@ "TRADING_SYMBOL": "交易符号", "ASSET": "资产", "TYPE": "类型", - "SOURCE": "来源" + "SOURCE": "来源", + "PERCENTAGE": "%{0}", + "24H": "24小时", + "TREND_7D": "趋势7D", + "BUY": "购买 {0} {1}" }, "MARKET_OPTIONS": { "LIST": "列表", "CARD": "图表" }, "ALL": "全部", @@ -1446,7 +1477,10 @@ "COMPLETED_TOOLTIP": "股权已经成熟。继续质押以获得更多奖励,或取消质押以获得奖励。", "CONNECT_ERROR": "请检查你的钱包", "INSTALL_METAMASK_DETAILS": { "TITLE": "安装元掩码", "PROMPT": "您必须将 Metamask 安装到您的浏览器中:{0}" }, - "INSTALL_METAMASK_TITLE": "未检测到 MetaMask" + "INSTALL_METAMASK_TITLE": "未检测到 MetaMask", + "EARN_REWARD": "通过质押数字资产获得奖励", + "DEFI_STAKING": "DeFi 质押", + "CEFI_STAKING": "CeFi 质押" }, "UNSTAKE": { "TITLE": "取消质押", @@ -1795,7 +1829,8 @@ "WALLET_BALANCE_ESTIMATE": "今日钱包余额估算", "VIEW_BALANCE_HISTORY": "查看余额历史记录", "VIEW_PERCENTAGE_SHARE": "查看百分比份额", - "VIEW_WALLET_P&L": "查看钱包盈亏" + "VIEW_WALLET_P&L": "查看钱包盈亏", + "BALANCE_PERCENTAGE": "余额百分比" }, "ASSET_INFO": "资产信息", "TAKER_FEES_APPLIED": "收取接受者费用", @@ -1813,7 +1848,13 @@ "ORDERBOOK": "订单簿", "NETWORK": "网络经纪商场外交易", "BROKER": "本地经纪商场外交易", - "BROKERAGE": "NA -(经纪业务)" + "BROKERAGE": "NA -(经纪业务)", + "LOADING_PRICES": "正在加载价格...", + "INPUT_LABEL": "输入资产名称或代码", + "HIGHLIGHTS": "亮点", + "MOBILE_DESC": "选择下面的市场开始交易。", + "PRICE_24H": "价格/24小时 %", + "CARDS": { "GAINERS": "赢家", "LOSERS": "失败者", "MARKET_CAP": "市值", "24H": "{0} 24 小时" } }, "HOLLAEX_TOKEN": { "REMOVE_FAVOURITES": "从收藏夹中删除", @@ -1859,7 +1900,8 @@ "TAG": "标签:", "DISABLED_DEPOSIT_CONTENT": "存款功能暂时不可用。", "DISABLED_WITHDRAW_CONTENT": "提款功能暂时不可用。", - "DEPOSIT_LABEL": "订金" + "DEPOSIT_LABEL": "订金", + "VOLUME": "体积" }, "ASYNC_LINK": { "TITLE": "页面没有自动打开?", "TEXT": "您的浏览器可能阻止该页面。尝试复制并粘贴下面的链接:" }, "TERMS_OF_SERVICES": { "TO_GET_ACCESS": "要获得访问权限,请联系" }, @@ -2094,7 +2136,7 @@ "TOTAL_ASSET_SELL_1": "全部的", "TOTAL_ASSET_SELL_2": "你可以卖", "BUY_ORDER_LIMITS": "买单限制", - "MIN_MAX_ORDER_VALUE_1": "最小值和最大值", + "MIN_MAX_ORDER_VALUE_1": "最小值和最大值 {0} {1}", "MIN_MAX_ORDER_VALUE_2": "买入订单价值", "PAYMENT_METHODS_SEND_FIAT": "发送法定货币的付款方式", "SELECT_PAYMENT_METHODS_1": "最多可选择", @@ -2110,7 +2152,7 @@ "DEAL_EDITED": "交易已编辑", "DEAL_CREATED": "交易已创建", "NEXT": "下一个", - "ADD_PAYMENT_METHOD_DETAILS": "添加付款方式详情", + "ADD_PAYMENT_METHOD_DETAILS": "{0} 付款方式详情", "COMPLETE": "完全的", "STEP_SET_TYPE_PRICE": "设定类型和价格", "STEP_SET_TOTAL_AMOUNT_PAYMENT_METHODS": "设置总金额和付款方式", @@ -2140,6 +2182,400 @@ "ALL_REGION": "所有地区", "BUYER_NOT_MADE_THE_PAYMENT": "买家尚未确认付款。", "PRICE_TO_ADVERTISE": "您要宣传的销售价格", - "VIEW_PROFILE": "查看供应商的资料" + "VIEW_PROFILE": "查看供应商的资料", + "P2P_METHODS": "P2P 支付方式", + "PAYMENT_METHODS": "付款方式", + "PAYMENT_METHODS_DEC": "您可以通过添加个人支付账户详细信息(例如银行信息或其他本地支付方式)来出售加密货币并接收法定付款。在添加付款信息之前,请确保与您的支付账户关联的名称与您经过验证的详细信息中的名称相符。", + "SELL_AMOUNT": "出售金额", + "ADD_PAYMENT_METHOD": "+ 添加付款方式", + "REMOVE": "消除", + "DYNAMIC": "动态的", + "TYPE": "类型", + "BACK_TO_ORDERS": "订购", + "FUNDS_TRANSFERRED_USER": "用户确认交易并且资金已转入您的余额。", + "CONFIRM_TRANSFER_USER": "确认转移并通知用户", + "BUYER_SENT_FUNDS_USER": "您已向用户发出信号,表示您已发送资金。请等待用户的回复。", + "VENDOR_CONFIRMED_ORDER_USER": "用户确认交易并释放资金。", + "BUY_UPPER": "买", + "CRYPTO_WANT_TO_BUY": "你想购买的加密货币", + "FIAT_CURRENCY_WANT_TO_SPEND": "法定货币消费", + "PRICE_ADVERTISE": "您要向 {0} 宣传的价格", + "TOTAL_AMOUNT": "总金额", + "BUY_SELL_DESC": "您可以{0}", + "SELL_ORDER_LIMITS": "卖单限制", + "MIN_MAX_ORDER_VALUE_3": "卖单价值", + "PAYMENT_METHODS_RECEIVE_FIAT": "接收法定货币的付款方式", + "PAYMENT_TIME_LIMIT_LABEL": "付款时限:{0}", + "30_MINUTES": "30 分钟", + "DELETE_UPPERCASE": "删除", + "CLICK_TO_VIEW": "点击查看", + "NEW_MESSAGE": "您已收到一条 P2P 消息", + "STATUS_UPDATE": "您的 P2P 订单有更新", + "APPEAL_STATUS_MESSAGE": "您的 P2P 订单已上诉", + "CANCEL_STATUS_MESSAGE": "您的 P2P 订单已取消", + "CONFIRM_STATUS_MESSAGE": "您的 P2P 订单已确认", + "NEW_ORDER_CREATED": "新的 P2P 订单已创建", + "CRYPTO_RELEASE_STATUS_MESSAGE": "加密货币已不再受监管", + "ADDITIONAL_PAYMENT_DETAILS": "添加其他付款详情", + "PAYMENT_FIELD_INFO": "这个新的支付字段是附加的,应该可以帮助 P2P 参与者进行法定货币转账。这应该是与支付方式相关的账户详细信息。这可能包括电话号码、用户名、唯一帐号以及根据支付方式系统进行交易的其他必要信息。", + "PAYMENT_DETAIL_NAME": "付款明细名称", + "REQUIRED_OR_OPTIONAL": "必需或可选", + "CREATE_NEW_PAYMENT_METHODS": "创建和添加新的付款方式", + "MANUAL_PAYMENT_METHOD_ENTRY": "要将付款方式添加到您的 P2P 平台,您可以手动输入付款方式的名称和所需的付款详细信息。例如,PayPal 使用电子邮件地址来发送和接收资金。", + "USERS_PAYMENT_SELECTION": "添加付款方式后,您的 P2P 商家和用户将能够选择付款方式并在付款或收款时输入必要的信息。他们提供的详细信息将与 P2P 交易中的另一方共享。", + "METHOD_NAME_AND_DETAIL": "付款方式名称及主要付款细节", + "ADD_NEW_PAYMENT_METHODS": "选择新的付款方式:", + "DETAIL_NAME": "付款明细名称", + "DETAIL_VALUE": "付款明细价值", + "DETAIL_REQUIRED": "必需的", + "IMPORTANT_DETAIL": "(重要付款细节)", + "DETAIL_OPTIONAL": "选修的", + "OPTIONAL_DETAIL": "(可选付款详情)", + "ADD_NEW_PAYMENT_FIELD": "添加新的付款详情字段", + "PAYMENT_METHOD_CREATED": "付款方式已创建!正在等待管理员验证", + "PAYMENT_METHOD_DELETED": "付款方式已删除。", + "PAYMENT_METHOD_UPDATED": "付款方式已更新。", + "CRYPTO": "加密:", + "INPUT_SPEND_AMOUNT": "输入消费金额", + "INPUT_SELL_AMOUNT": "输入卖出金额", + "TIMES": "次", + "FEEDBACK": "反馈", + "ASSET": "资产: ", + "CUSTOM": "风俗", + "CANCELLED": "取消", + "APPEALED": "上诉", + "EXPIRED": "已到期", + "RATE": "速度:", + "BUYING": "购买{0}", + "SELLING": "正在销售{0}", + "TERMS_AND_CONDITION_DESCRIPTION": "请在交易开始后 15 分钟内发布", + "VISIT_OUR_WEBSITE": "访问我们的网站", + "SELECT_PAYMENT_SYSTEM_LABEL": "选择付款系统", + "FIELD": "场地", + "NEW_PAYMENT_PLACEHOLDER": "输入付款详情值", + "FIELD_VALIDATION_TEXT": "请输入所有方法字段", + "INPUT_METHOD_NAME_TEXT": "请输入方法名称", + "INPUT_PAYMENT_DETAIL_TEXT": "输入付款详细信息名称", + "UNVERIFIED": "未经验证", + "VERIFIED": "已验证", + "AMOUNT_RECEIVE": "将从您的余额中释放", + "DELETE_WARNING": "您确定要删除此付款方式吗?", + "STEP_1": "烹饪步骤 1/3", + "STEP_2": "烹饪步骤 2/3", + "STEP_3": "步骤 3/3", + "P2P_ORDER_CREATED": "P2P 订单已创建", + "VENDOR_CHECKS_TITLE": "检查并确认付款", + "FUND_RELEASED": "资金释放", + "ORDER_EXPIRY": "订单到期时间", + "MINIMUM_AMOUNT_WARNING": "最小{0}为{1}", + "MAXIMUM_AMOUNT_WARNING": "最大{0}为{1}", + "ORDER_CREATION": "订单创建", + "ORDER_CREATION_DESC_1": "通过点击“创建订单”,您将通知供应商并收到即时报价以及精确的付款转账详情。{0} {1} {2} {3}", + "ORDER_CREATION_DESC_2": "这包括完成您的订单所需的确切金额。", + "YOU_HAVE_TEXT": "你将拥有", + "COMPLETE_PAYMENT_PROCESS": "完成付款转账流程。", + "WARINNG_DESC": "如果您确实想完成订单,请仅继续创建订单。", + "ORDER_CANCEL_DESC": "取消订单可能会导致帐户被暂停。", + "CONFIRM_ORDER_CREATION": "当您准备好{0}时请点击下面的“创建订单”。", + "SEND_MONEY": "汇款", + "RECEIVE_MONEY": "收到钱", + "CREATE_ORDER": "创建订单", + "NO_ORDERS_DESC": "这里好像没有订单。", + "NO_DEALS_DESC": "看起来这里没有交易。", + "ONLINE": "在线的", + "OFFLINE": "离线", + "SELECT_CRYPTO": "选择加密货币", + "REMOVE_WARNING": "您确定要删除此交易吗?", + "SHOW_FILTERS": "显示过滤器", + "HIDE_FILTERS": "隐藏过滤器", + "ORDERS_COMPLETED": "已完成订单:", + "CANCEL_WARNING_TEXT": "请注意,频繁取消订单可能会对您的公共 P2P 资料产生负面影响,并可能导致您的帐户被暂停。", + "UPDATE": "更新", + "TERMS_ERROR_TEXT": "请输入条款字段", + "RESPONSE_ERROR_TEXT": "请输入响应字段" + }, + "CUSTOM_NATIVE_CURRENCY": "货币(定价和资产价值估算)", + "ADDRESS_BOOK": { + "ADDRESS_BOOK_LABEL": "地址簿", + "ADDRESS_BOOK_DESC_1": "将白名单提现地址添加到您的个人通讯录", + "ADDRESS_BOOK_DESC_2": "您可以在提款时轻松使用这些地址。", + "ADD_ADDRESS_LINK": "添加地址", + "ADD_WITHDRAW_ADDRESS": "添加提现地址", + "DATE_ADDED": "添加日期", + "REMOVE": "消除", + "NO_LINK": "尚未添加提款地址。", + "ADD_WITHDRAW_ADDRESS_DESC_1": "添加一个白名单地址,您可以安全地将硬币提取到该地址。", + "ADD_WITHDRAW_ADDRESS_DESC_2": "该提现地址应为您可控制的地址。", + "NAME_YOUR_ADDRESS_TITLE": "命名您的地址", + "NAME_YOUR_ADDRESS_DESC": "给这个提款地址命名,以方便您将来参考。", + "USER_LABEL": "名称/标签:", + "USER_FIELD_PLACEHOLDER": "命名此提现地址", + "CHECK_AND_CONFIRM": "检查并确认", + "WARNING_ADDRESS": "在将此地址添加到您的地址簿之前,请花时间检查并确认详细信息正确无误:", + "ENSURE_DESC": "确保地址正确且在您的控制范围内。", + "ADDRESSES": "地址", + "WITHDRAWAL_ADDRESS_BOOK": "提现地址簿", + "ADD_ADDRESS_DESC": "将提现地址添加到{0}", + "ADDRESS_BOOK": "地址簿", + "MANAGE_ADDRESS_BOOK": "管理地址簿", + "VIEW_ADDRESS_BOOK_LABEL": "查看地址簿", + "ADD_WITHDRAWAL_ADDRESS_LINK": "添加提现地址", + "REVOKE_ADDRESS": "您的地址已被删除", + "REMOVE_ADDRESS": "移除地址", + "REMOVE_CONTENT": "您是否要从您的地址簿中删除该提现地址?" + }, + "VOLUME": { + "VOLUME": "体积", + "BACK": "后退", + "MARKETS": "市场", + "CONVERT": "转变", + "HISTORY": "历史", + "TRADING_VOLUME": "交易量", + "VOLUME_DECS": "您账户在不同时间段内的交易金额,以及每个时间段内交易额最大的 3 种资产", + "ALL_ASSETS": "所有资产", + "DAY_VOLUME": "日成交量", + "HOUR_VOLUME": "24 小时交易量", + "TOP": "顶部 {0} {1}", + "VOL_ASSET": "D 资产规模", + "NO_DATA_DESC_1": "看起来您还没有进行任何交易。立即开始交易,在此查看您的活动!", + "NO_DATA_DESC_2": "开始交易", + "NO_DATA_DESC_3": "现在在这里查看您的活动!", + "TRADE_VOLUME": "交易量", + "VIEW_VOLUME": "查看音量", + "TRADE_DESCRIPTION": "查看交易量最大的资产", + "MARKET_TABLE_DESC": "访问您的交易量页面 {0}" + }, + "MORE_OPTIONS_LABEL": { + "MORE_OPTION_SEARCH_TXT": "搜索功能或页面", + "NO_RESULT_DESC_1": "看起来没有任何结果。", + "NO_RESULT_DESC_2": "尝试搜索其他关键字。", + "ICONS": { + "REFERRALS": "推荐", + "BUY_CRYPTO": "购买加密货币", + "API": "API", + "DEFI_STAKE": "Defi 质押", + "CEFI_STAKE": "赛菲股份", + "PROFIT_LOSS": "损益表", + "LIMITS": "限制", + "LOGINS": "登录", + "AUDIO": "声音的" + }, + "HOT_FUNCTION": { + "HOT_FUNCTION_LABEL": "热门功能", + "ADD_FUNDS": "添加资金", + "TOP_UP": " 充值", + "LOAD": "加载", + "CREDIT": "信用", + "FUND_ACCOUNT": "基金账户", + "BTC": "比特币", + "USTD": "美元", + "ETH": "以太坊", + "USD": "美元", + "XHT": "xht", + "TRANSFER": "转移", + "MONEY": "钱", + "FUNDING": "资金", + "RECHARGE": "充值", + "REFILL": "重新填充", + "CASH_IN": "兑现", + "ADD_MONEY": "添加资金", + "EXCHANGE": "交换", + "SWAP": "交换", + "BUY_SELL": "买/卖", + "TRADE": "贸易", + "CONVERT_CURRENCY": "转换货币", + "INVITE": "邀请", + "REFER": "参考", + "REWARDS": "奖励", + "BONUS": "奖金", + "AFFILIATION": "联系", + "AFFILIATE": "附属机构", + "PASSIVE_INCOME": "被动收入", + "REVENUE": "收入" + }, + "OTHER_FUNCTIONS": { + "OTHER_FUNCTIONS_LABEL": "其他功能", + "INTEGRATION": "一体化", + "PROGRAMMATIC_ACCESS": "程序化访问", + "DEVELOPER": "开发人员", + "AUTOMATED_TRADING": "自动交易", + "BOT": "机器人", + "ALGO": "某物", + "ALGORITHM": "算法", + "FIAT": "菲亚特", + "DOLLAR": "美元", + "PURCHASE": "购买", + "BUY_COIN": "购买硬币", + "BUY_TOKEN": "购买代币", + "YIELD": "屈服", + "INTEREST": "兴趣", + "REVENUE": "收入", + "CENTRALIZED_STAKING": "中心化质押", + "PERFORMANCE": "表现", + "GAINS": "收获", + "LOSSES": "损失", + "PORTFOLIO_PROFIT": "投资组合利润", + "LOSS": "损失", + "PNL": "PL", + "CHARGES": "收费", + "COSTS": "成本", + "COMMISSION": "委员会", + "TRADING_FEES": "交易费用", + "TRANSACTION_FEES": "交易费用", + "RESTRICTIONS": "限制", + "BOUNDARIES": "边界", + "CAPS": "帽子", + "MAXIMUM": "最大限度", + "WITHDRAWAL_LIMITS": "提款限额", + "STORAGE": "贮存", + "FUNDS": "资金", + "BALANCE": "平衡", + "CRYPTO_WALLET": "加密钱包", + "MY": "我的", + "ENGLISH": "英语", + "LOCALIZATION": "本土化", + "TRANSLATE": "翻译", + "LANGUAGE_SETTINGS": "语言设置", + "MULTILINGUAL": "多种语言", + "LANGUAGE_PREFERENCE": "语言偏好", + "TEXT": "文本", + "WORD": "单词", + "PEER_TO_PEER": "点对点", + "DIRECT_TRADE": "直接贸易", + "USER_TO_USER": "用户对用户", + "PRIVATE_TRADE": "私人贸易", + "TRANSACTIONS": "交易", + "ACTIVITY": "活动", + "RECORD": "记录", + "LOG": "日志", + "TRANSACTION_HISTORY": "交易历史", + "LIQUIDITY": "流动性", + "MARKET_VOLUME": "市场规模", + "TRADING_ACTIVITY": "交易活动", + "MARKETS": "市场", + "CRYPTO": "加密", + "TWO_FACTOR_AUTHENTICATION": "双重身份验证", + "MFA": "外交部", + "AUTHENTICATOR": "验证器", + "OTP": "密码", + "CREDENTIALS": "证书", + "PASSWORD_RESET": "密码重置", + "SIGN_INS": "登录", + "ACCOUNT_ACCESS": "帐户访问", + "SESSION_HISTORY": "会话历史记录", + "LOGGED_IN": "登录", + "SESSION_MANAGEMENT": "会话管理", + "CURRENT_SESSIONS": "当前会议", + "BANKING_DETAILS": "银行详细信息", + "BANK_ACCOUNT": "银行账户", + "FINANCIAL_INSTITUTION": "金融机构", + "BANK_INFO": "银行信息", + "WITHDRAWAL_ACCOUNT": "提款账户", + "FUND": "基金", + "SOUND": "声音", + "AUDIO_SETTINGS": "音频设置", + "ALERTS": "警报", + "NOTIFICATIONS": "通知", + "AUDIO_ALERTS": "音频警报", + "SECURITY": "安全", + "CONTACT": "接触", + "EMAIL_ADDRESS": "电子邮件", + "MAIL": "邮件", + "EMAIL_CONTACT": "电子邮件联系", + "KYC": "了解客户", + "SMS": "短信", + "KYC_CAPS": "了解你的客户", + "ID": "ID", + "PERSONAL_INFO": "个人信息", + "IDENTITY_CHECK": "身份检查", + "PAYOUT": "付款", + "CASH_OUT": "兑现", + "REMOVE_FUNDS": "移除资金", + "OUT": "出去", + "SUPPORT": "支持", + "CONTACT_LOWER": "接触", + "EMAIL_LOWER": "电子邮件", + "RESOURCE": "资源", + "GUIDES": "指南", + "FAQ": "常问问题", + "CUSTOMER_SERVICE": "客户服务", + "ASSISTANCE": "协助", + "API_LOWER": "api", + "MESSAGE": "信息", + "LIVE_CHAT": "实时聊天", + "SETTINGS": "设置", + "ALERT": "警报", + "UPDATES": "更新", + "REMINDERS": "提醒", + "UI": "用户界面", + "USER_INTERFACE": "用户界面", + "LAYOUT": "布局", + "DESIGN": "设计", + "DASHBOARD": "仪表板", + "COLOR_THEME": "颜色主题", + "ORDER_BOOK": "订单簿", + "DARK": "黑暗的", + "LIGHT": "光", + "WITHDRAWAL_ADDRESSES": "提现地址", + "CRYPTO_ADDRESSES": "加密地址", + "WALLET_ADDRESSES": "钱包地址", + "SAVED_ADDRESSES": "已保存的地址", + "ADDRESS_BOOK": "地址簿", + "WHITE_LISTED": "白名单" + } + }, + "CONNECTIONS": { + "CHECK_CONNECTION": "检查连接", + "IP": "知识产权", + "NORMAL_TEXT": "普通的", + "CONNECTION_ISSUE": "连接问题", + "SESSION": "会议", + "SERVER_TIME": "服务器时间", + "PING": "平", + "CHECK_PING": "检查 PING", + "RECONNECT": "重新连接", + "TOOLTIP_DESC_1": "检查您对 Exchange 服务器 {0} 的 ping", + "TOOLTIP_DESC_2": "'ms' 越低越好", + "LOGGED_IN_AT": "登录于", + "RECONNECT_DESC": "重新连接可能会解决您遇到的未知问题。", + "CONFIRM_RECONNECT_MESSAGE": "您想要重新连接吗?", + "PING_CHECK_TEXT": "正在 ping 服务器。请稍候...", + "RECHECK_PING": "重新检查 PING", + "FAST": "快速地", + "SLOW": "慢的", + "MS": "{0} 毫秒", + "STATUS_NORMAL": "連線正常", + "CONNECTION_LABEL": "联系", + "CONNECTION_ISSUE_DETECTED": "检测到连接问题" + }, + "DESKTOP_NAVIGATION": { + "OTHERS": "其他的", + "SUMMARY_DESCRIPTION": "帐户级别信息和可访问性", + "FEES_LIMITS_DESC": "交易和提款费用。账户限制", + "VOLUME_DESC": "交易量随时间变化的摘要", + "DEPOSIT_DESC": "访问钱包存款资金选项", + "BALANCE_DESC": "您的所有资产及其余额", + "PERFORMANCE_DESC": "钱包盈亏", + "HISTORY_DESC": "查看所有交易、存款和取款", + "ADDRESS_BOOK_DESC": "提款联系地址簿", + "WITHDRAW_DESC": "钱包提款和转账", + "ASSETS_DESC": "跟踪价格并发现资产数据", + "CONVERT_DESC": "只需将任何资产转换为另一种资产即可", + "MARKET_DESC": "现货交易订单簿市场。", + "P2P_DESC": "加密货币交易", + "REFERRAL_DESC": "通过邀请朋友赚取被动收入", + "CEFI_STAKE_DESC": "从你的交易钱包中质押资产", + "DEFI_STAKE_DESC": "连接钱包并质押您的资产", + "BUY_CRYPTO_DESC": "通过直接银行转账或卡购买", + "SECURITY_DESC": "账户 2FA、密码和 API", + "VERIFICATION_DESC": "账户身份验证", + "SETTINGS_DESC": "界面及其他账户设置", + "SUMMARY_PAGE": "摘要页面", + "SIGNOUT_DESC": "登出帐号", + "LANGUAGE_DESC": "更改语言偏好", + "API_DESC": "使用 API 密钥以编程方式访问您的帐户", + "HELP_DESC": "获取帮助。支持联系方式", + "TRANSACTION_DESC": "查看所有交易、存款和取款", + "ONRAMPER_DESC": "使用 Onramper 购买和出售加密货币" } } \ No newline at end of file diff --git a/web/src/config/menu.js b/web/src/config/menu.js index 6783e27f5b..a0bffa3253 100644 --- a/web/src/config/menu.js +++ b/web/src/config/menu.js @@ -34,6 +34,7 @@ export const MENU_ITEMS = { isMobile ? 'FOOTER_TRADING_ACTIVE' : 'SIDEBAR_TRADING_ACTIVE' }`, string_id: 'SUMMARY.MARKETS', + hide_from_appbar: true, hide_from_sidebar: true, hide_from_bottom_nav: false, hide_from_menulist: true, @@ -43,6 +44,7 @@ export const MENU_ITEMS = { path: 'quick-trade', icon_id: 'FOOTER_QUICK_ACTIVE', string_id: 'CONVERT', + hide_from_appbar: true, hide_from_sidebar: true, hide_from_bottom_nav: false, hide_from_menulist: true, @@ -60,7 +62,7 @@ export const MENU_ITEMS = { path: '/p2p', icon_id: 'TAB_P2P', string_id: 'ACCOUNTS.P2P', - hide_from_appbar: false, + hide_from_appbar: true, hide_from_bottom_nav: true, }, { @@ -69,6 +71,7 @@ export const MENU_ITEMS = { icon_id: 'TAB_APPS', string_id: 'ACCOUNTS.TAB_APPS', hide_from_bottom_nav: true, + hide_from_appbar: true, }, { id: 'chat', @@ -113,11 +116,31 @@ export const MENU_ITEMS = { id: 'prices', path: '/prices', icon_id: 'FOOTERBAR_ASSETS_TRADE', - string_id: 'HOLLAEX_TOKEN.PRICES.TITLE', + string_id: 'ACCOUNTS.TAB_TRADE', hide_from_sidebar: true, hide_from_appbar: false, hide_from_menulist: true, - hide_from_bottom_nav: false, + hide_from_bottom_nav: true, + }, + { + id: 'earn', + path: '/referral', + string_id: 'STAKE.EARN', + hide_from_sidebar: true, + hide_from_appbar: false, + hide_from_menulist: true, + hide_from_bottom_nav: true, + }, + ], + others: [ + { + id: 'others', + path: '/buy-crypto', + string_id: 'DESKTOP_NAVIGATION.OTHERS', + hide_from_sidebar: true, + hide_from_appbar: false, + hide_from_menulist: true, + hide_from_bottom_nav: true, }, ], bottom: [ @@ -135,6 +158,16 @@ export const MENU_ITEMS = { hide_from_appbar: true, hide_from_bottom_nav: true, }, + { + id: 'More', + path: '/more', + icon_id: 'ITEM_OPTIONS', + string_id: 'HOLLAEX_TOKEN.MORE', + hide_from_sidebar: true, + hide_from_appbar: true, + hide_from_menulist: true, + hide_from_bottom_nav: false, + }, { path: 'logout', icon_id: 'TAB_SIGNOUT', diff --git a/web/src/containers/Admin/AppWrapper/index.js b/web/src/containers/Admin/AppWrapper/index.js index 1efe8c3440..985050d525 100644 --- a/web/src/containers/Admin/AppWrapper/index.js +++ b/web/src/containers/Admin/AppWrapper/index.js @@ -294,6 +294,15 @@ class AppWrapper extends React.Component { this.props.changeTheme(data.settings.interface.theme); localStorage.setItem('theme', data.settings.interface.theme); } + if ( + data.settings.interface && + data.settings.interface.display_currency + ) { + localStorage.setItem( + 'base_currnecy', + data.settings.interface.display_currency + ); + } } }) .catch((err) => { diff --git a/web/src/containers/Admin/CreateAsset/AssetConfig.js b/web/src/containers/Admin/CreateAsset/AssetConfig.js index 940421734c..b78bd58948 100644 --- a/web/src/containers/Admin/CreateAsset/AssetConfig.js +++ b/web/src/containers/Admin/CreateAsset/AssetConfig.js @@ -22,7 +22,7 @@ import { } from '../AdminFinancials/action'; const CONTACT_DESCRIPTION_LINK = - 'https://metamask.zendesk.com/hc/en-us/articles/360015488811-What-is-a-Token-Contract-Address-'; + 'https://support.metamask.io/managing-my-tokens/custom-tokens/how-to-find-a-token-contract-address/'; const { Search, TextArea } = Input; diff --git a/web/src/containers/Admin/General/General.js b/web/src/containers/Admin/General/General.js index 5f7d348eb5..72017eb751 100644 --- a/web/src/containers/Admin/General/General.js +++ b/web/src/containers/Admin/General/General.js @@ -1,5 +1,5 @@ import React, { Component } from 'react'; -import { Switch, Button, Modal, message, Spin, Input } from 'antd'; +import { Switch, Button, Modal, message, Spin, Input, Select } from 'antd'; import { connect } from 'react-redux'; import { browserHistory } from 'react-router'; import { bindActionCreators } from 'redux'; @@ -38,6 +38,10 @@ import './index.css'; import { handleFiatUpgrade, handleUpgrade } from 'utils/utils'; import { checkFileSize, fileSizeError } from 'utils/icon'; import PublishSection from './PublishSection'; +import { CloseCircleOutlined } from '@ant-design/icons'; +import Coins from '../Coins'; +import { BASE_CURRENCY } from 'config/constants'; +const { Option } = Select; const NameForm = AdminHocForm('NameForm'); const LanguageForm = AdminHocForm('LanguageForm'); @@ -81,13 +85,21 @@ class GeneralContent extends Component { updatedKey: '', isDisable: false, defaultEmailData: {}, + nativeCurrencies: [], }; } componentDidMount() { + let customCurrencies = this.props.selectable_native_currencies || []; + if (customCurrencies.length === 0) { + customCurrencies = [BASE_CURRENCY]; + } this.requestInitial(); this.props.requestTokens(); - this.setState({ isDisable: true }); + this.setState({ + isDisable: true, + nativeCurrencies: customCurrencies, + }); } componentDidUpdate(prevProps, prevState) { @@ -503,13 +515,17 @@ class GeneralContent extends Component { handleSaveInterface = ( features, balance_history_config = null, - referral_history_config = null + referral_history_config = null, + chain_trade_config = null, + selectable_native_currencies = null ) => { this.handleSubmitGeneral({ kit: { features, balance_history_config, referral_history_config, + chain_trade_config, + selectable_native_currencies, }, }); }; @@ -892,6 +908,79 @@ class GeneralContent extends Component { /> +
+
+
Other currency display options
+
+ The user can select these other currencies as alternative + valuation options to the 'default' above. +
+
+ {this.state.nativeCurrencies?.map((coin) => { + return ( +
+ + + {coins?.[coin]?.fullname} + + { + this.setState({ + nativeCurrencies: this.state.nativeCurrencies.filter( + (c) => c !== coin + ), + }); + }} + style={{ + cursor: 'pointer', + position: 'relative', + top: 10, + left: 12, + }} + > + + +
+ ); + })} + +
+ +
+ + +
+
) : null} {activeTab === 'branding' ? ( @@ -1239,6 +1328,8 @@ const mapStateToProps = (state) => ({ user: state.user, constants: state.app.constants, enabledPlugins: state.app.enabledPlugins, + selectable_native_currencies: + state.app.constants.selectable_native_currencies, }); const mapDispatchToProps = (dispatch) => ({ diff --git a/web/src/containers/Admin/General/InterfaceForm.js b/web/src/containers/Admin/General/InterfaceForm.js index ac0fbe3256..0efa973372 100644 --- a/web/src/containers/Admin/General/InterfaceForm.js +++ b/web/src/containers/Admin/General/InterfaceForm.js @@ -46,11 +46,22 @@ const InterfaceForm = ({ active: constants?.kit?.referral_history_config?.active, }); + const [chainTradeData, setChainTradeData] = useState({ + currency: constants?.kit?.chain_trade_config?.currency, + source_account: constants?.kit?.chain_trade_config?.source_account, + spread: constants?.kit?.chain_trade_config?.spread, + date_enabled: + constants?.kit?.chain_trade_config?.date_enabled || new Date(), + active: constants?.kit?.chain_trade_config?.active, + }); + const [ displayReferralHistoryModal, setDisplayReferralHistoryModal, ] = useState(false); + const [displayChainTradeModal, setDisplayChainTradeModal] = useState(false); + const handleSubmit = (values) => { let formValues = {}; if (values) { @@ -62,6 +73,7 @@ const InterfaceForm = ({ cefi_stake: !!values.cefi_stake, balance_history_config: !!values.balance_history_config, referral_history_config: !!values.referral_history_config, + chain_trade_config: !!values.chain_trade_config, home_page: isUpgrade ? false : !!values.home_page, ultimate_fiat: !!values.ultimate_fiat, apps: !!values.apps, @@ -80,10 +92,17 @@ const InterfaceForm = ({ distributor_id: Number(referralHistoryData.distributor_id), date_enabled: referralHistoryData.date_enabled, }; + const chain_trade_config = { + active: !!values.chain_trade_config, + currency: chainTradeData.currency, + spread: Number(chainTradeData.spread), + source_account: Number(chainTradeData.source_account), + }; handleSaveInterface( formValues, - balance_history_config, - referral_history_config + values.balance_history_config ? balance_history_config : null, + values.referral_history_config ? referral_history_config : null, + values.chain_trade_config ? chain_trade_config : null ); } }; @@ -109,6 +128,8 @@ const InterfaceForm = ({ } else { setDisplayReferralHistoryModal(true); } + } else if (formProps.chain_trade_config && !chainTradeData.active) { + setDisplayChainTradeModal(true); } else if ( formProps.balance_history_config && !balanceHistoryCurrency.currency @@ -405,6 +426,140 @@ const InterfaceForm = ({ )} + {displayChainTradeModal && ( + } + bodyStyle={{ + backgroundColor: '#27339D', + marginTop: 60, + }} + visible={displayChainTradeModal} + width={500} + footer={null} + onCancel={() => { + setDisplayChainTradeModal(false); + }} + > +

+ Chain Trade Config +

+ +
+
+ Currency +
+ Currency to set as main source coin +
+
+ + +
+ +
+
+ Source Account ID +
+ Account ID to send to manage chain trades from +
+
+ + { + setChainTradeData({ + ...chainTradeData, + source_account: Number(e.target.value), + }); + }} + /> +
+ +
+
+ Spread +
+ Spread to apply to the final amount +
+
+ + { + setChainTradeData({ + ...chainTradeData, + spread: Number(e.target.value), + }); + }} + /> +
+ +
+ + +
+
+ )}
Features
@@ -605,6 +760,59 @@ const InterfaceForm = ({ )} + {!isFiatUpgrade && ( + + +
+ + { + svg.setAttribute('style', 'width: 60px'); + }} + /> + +
+ Chain Trading{' '} + {chainTradeData.active && ( + { + e.stopPropagation(); + e.preventDefault(); + setDisplayChainTradeModal(true); + }} + > + Configure + + )} +
+ (Enable Chain Trading for Users) +
+
+
+
+
+ )} +
label { font-size: 12px; + color: #ffffff; } .add-user-modal .ant-input { diff --git a/web/src/containers/Admin/QuickTradesList/PairsSection.js b/web/src/containers/Admin/QuickTradesList/PairsSection.js index b8512d5086..98f1daa096 100644 --- a/web/src/containers/Admin/QuickTradesList/PairsSection.js +++ b/web/src/containers/Admin/QuickTradesList/PairsSection.js @@ -159,7 +159,7 @@ class PairsSection extends Component { const { pair, userId, open } = this.props; requestActiveOrders({ user_id: userId, - symbol: pair, + symbol: pair ? (/^[a-z0-9]+-[a-z0-9]+$/i.test(pair) ? pair : null) : null, page, limit, open, @@ -179,17 +179,12 @@ class PairsSection extends Component { } }) .catch((err) => { - if (err.status === 403) { - this.setState({ - buyOrders: { - ...this.state.buyOrders, - loading: true, - }, - }); - } - // let errorMsg = err.data && err.data.message - // ? err.data.message - // : err.message; + this.setState({ + buyOrders: { + ...this.state.buyOrders, + loading: false, + }, + }); }); }; diff --git a/web/src/containers/Admin/QuickTradesList/index.js b/web/src/containers/Admin/QuickTradesList/index.js index 46315d4540..98b29a8aad 100644 --- a/web/src/containers/Admin/QuickTradesList/index.js +++ b/web/src/containers/Admin/QuickTradesList/index.js @@ -11,7 +11,10 @@ import './index.scss'; // const TYPE_OPTIONS = [{ value: true, label: 'Active' }]; const QuickTradesList = ({ pairs, coins, userId, getThisExchangeOrder }) => { - const [options, setOptions] = useState([]); + // const [options, setOptions] = useState([]); + const [coinOptions, setCoinOptions] = useState([]); + const [baseCoin, setBaseCoin] = useState(null); + const [quoteCoin, setQuoteCoin] = useState(null); const [pair, setPair] = useState(null); const [type] = useState(true); const [displayCreateOrder, setDisplayCreateOrder] = useState(false); @@ -20,20 +23,32 @@ const QuickTradesList = ({ pairs, coins, userId, getThisExchangeOrder }) => { const [emailOptions, setEmailOptions] = useState([]); const [orderPayload, setOrderPayload] = useState({}); - useEffect(() => { - setOptions(getOptions(pairs)); - }, [pairs]); + // useEffect(() => { + // setOptions(getOptions(pairs)); + // }, [pairs]); - const getOptions = (pairs) => { - const options = [{ value: null, label: 'All' }]; - Object.keys(pairs).forEach((pair) => { + useEffect(() => { + const options = []; + Object.keys(coins).forEach((pair) => { options.push({ label: pair, value: pair, }); }); - return options; - }; + + setCoinOptions(options); + }, [coins]); + + // const getOptions = (pairs) => { + // const options = [{ value: null, label: 'All' }]; + // Object.keys(pairs).forEach((pair) => { + // options.push({ + // label: pair, + // value: pair, + // }); + // }); + // return options; + // }; const handleEmailChange = (value) => { let emailId = parseInt(value); let emailData = {}; @@ -413,14 +428,52 @@ const QuickTradesList = ({ pairs, coins, userId, getThisExchangeOrder }) => {
- { + setBaseCoin(val); + setPair(`${val}-${quoteCoin ? quoteCoin : ''}`); + }} /> +
- Change liquidity and price source for BTC/USDT Quick Trade market. + Change liquidity and price source for{' '} + {selectedConfig?.symbol?.split('-')?.join('/')?.toUpperCase()} Quick + Trade market.
diff --git a/web/src/containers/Admin/Trades/actions.js b/web/src/containers/Admin/Trades/actions.js index 113d41d5fe..c3ccc3d3b2 100644 --- a/web/src/containers/Admin/Trades/actions.js +++ b/web/src/containers/Admin/Trades/actions.js @@ -132,10 +132,14 @@ export const getBrokerConnect = ( api_secret, password ) => { - let urlString = `/broker/connect?exchange_id=${exchange_id}&api_key=${api_key}&api_secret=${api_secret}`; + let urlString = `/broker/connect?exchange_id=${encodeURIComponent( + exchange_id + )}&api_key=${encodeURIComponent(api_key)}&api_secret=${encodeURIComponent( + api_secret + )}`; if (exchange_id === 'okx') { - urlString += `&password=${password}`; + urlString += `&password=${encodeURIComponent(password)}`; } return requestAuthenticated(urlString); diff --git a/web/src/containers/Admin/Trades/index.css b/web/src/containers/Admin/Trades/index.css index 7a0181d76e..87e35983e7 100644 --- a/web/src/containers/Admin/Trades/index.css +++ b/web/src/containers/Admin/Trades/index.css @@ -16,6 +16,25 @@ border: none; } +.ant-table-thead > tr > th { + background-color: var(--admin_panel_table_thead); + color: var(--admin_panel_main_font); +} +.ant-table-tbody > tr > td { + background-color: var(--admin_panel_table_tbody); + color: var(--admin_panel_main_font); + border-bottom: 1px solid var(--admin_panel_table_tbody); +} +.ant-table-tbody > tr.ant-table-placeholder:hover > td { + background-color: var(--admin_panel_table_tbody_hover); +} +.ant-table-tbody > tr.ant-table-row:hover > td { + background-color: var(--admin_panel_table_tbody_hover); +} +.green-btn { + background-color: #288500 !important; + color: #ffffff !important; +} .preview-container { padding: 1.5rem 1rem; } @@ -761,3 +780,14 @@ .otc-Container .errMsg { color: red; } + +.p2p-admin-select-asset + .ant-select-item-option-content + .edit-wrapper__container { + position: relative; + top: 5px; +} + +.p2p-admin-select-asset .ant-select-item { + cursor: text; +} diff --git a/web/src/containers/Admin/Trades/otcdesk.js b/web/src/containers/Admin/Trades/otcdesk.js index 5b00b86a78..e526dddf90 100644 --- a/web/src/containers/Admin/Trades/otcdesk.js +++ b/web/src/containers/Admin/Trades/otcdesk.js @@ -107,6 +107,7 @@ const OtcDeskContainer = ({ if (isOpen) { getAllUserData(); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [isOpen]); useEffect(() => { @@ -195,7 +196,7 @@ const OtcDeskContainer = ({ handleClose(); }; - const getAllUserData = async (params = {}) => { + const getAllUserData = async (params = {}, emailChange = false) => { try { const res = await requestUsers(params); if (res && res.data) { @@ -205,6 +206,18 @@ const OtcDeskContainer = ({ })); setEmailOptions(userData); setUserData(res.data); + if (emailChange && userData?.[0]?.value) { + let emailId = parseInt(userData?.[0]?.value); + let emailData = {}; + userData && + userData.forEach((item) => { + if (item.value === emailId) { + emailData = item; + } + }); + setSelectedEmailData(emailData); + handleSearch(emailData.label); + } } } catch (error) { console.log('error', error); @@ -351,6 +364,9 @@ const OtcDeskContainer = ({ if (!isOpen) { setdeskStateData({}); } + if (isEdit) { + await getAllUserData({ id: data.user_id }, true); + } if (status === 'paused') { if (model === 'desk') { setdeskStateData({ ...deskStateData, paused: true }); diff --git a/web/src/containers/Admin/Trades/p2pDeals.js b/web/src/containers/Admin/Trades/p2pDeals.js index 260e3190fd..e106704751 100644 --- a/web/src/containers/Admin/Trades/p2pDeals.js +++ b/web/src/containers/Admin/Trades/p2pDeals.js @@ -1,13 +1,13 @@ /* eslint-disable */ import React, { useState, useEffect } from 'react'; +import { browserHistory } from 'react-router'; +import { connect } from 'react-redux'; import { Table, Button, Spin, Input } from 'antd'; import { requestDeals } from './actions'; -import moment from 'moment'; import BigNumber from 'bignumber.js'; -import { ExclamationCircleFilled } from '@ant-design/icons'; -import { connect } from 'react-redux'; -import { CloseOutlined } from '@ant-design/icons'; -const P2PDeals = ({ coins }) => { +import moment from 'moment'; + +const P2PDeals = ({ coins, coinSymbols }) => { const [userData, setUserData] = useState([]); const [isLoading, setIsLoading] = useState(false); const [queryValues, setQueryValues] = useState(); @@ -35,7 +35,12 @@ const P2PDeals = ({ coins }) => { key: 'merchant_id', render: (user_id, data) => { return ( -
+
+ browserHistory?.push(`admin/user?id=${data?.merchant_id}`) + } + > @@ -48,7 +53,20 @@ const P2PDeals = ({ coins }) => { dataIndex: 'side', key: 'side', render: (user_id, data) => { - return
{data?.side?.toUpperCase()}
; + return ( +
+ {data?.side?.toUpperCase()} +
+ ); }, }, { @@ -56,10 +74,18 @@ const P2PDeals = ({ coins }) => { dataIndex: 'price', key: 'price', render: (user_id, data) => { + const incrementUnit = + coinSymbols?.[data.spending_asset]?.increment_unit; + const decimalPoint = new BigNumber(incrementUnit).dp(); + const sourceAmount = new BigNumber( + data.exchange_rate * (1 + Number(data.spread || 0)) + ) + .decimalPlaces(decimalPoint) + .toNumber(); + return (
- {data.exchange_rate * (1 + Number(data.spread || 0))}{' '} - {data.spending_asset.toUpperCase()} + {sourceAmount} {data.spending_asset.toUpperCase()}
); }, @@ -174,6 +200,17 @@ const P2PDeals = ({ coins }) => { setIsLoading(true); requestDeals({ page, limit, ...queryValues }) .then((response) => { + let buyCount = 0; + let sellCount = 0; + + response?.data?.map((item) => { + if (item.side === 'buy') { + buyCount++; + } else if (item.side === 'sell') { + sellCount++; + } + }); + setUserData( page === 1 ? response.data : [...userData, ...response.data] ); @@ -184,6 +221,8 @@ const P2PDeals = ({ coins }) => { page, currentTablePage: page === 1 ? 1 : queryFilters.currentTablePage, isRemaining: response.count > page * limit, + buyCount, + sellCount, }); setIsLoading(false); @@ -284,8 +323,27 @@ const P2PDeals = ({ coins }) => { */} {/* Total: {queryFilters.total || '-'} */}
- Total disputes:{' '} + Total Public Deals:{' '} {queryFilters.total} +
+
+ Buy: + {queryFilters?.buyCount} +
+
+ Sell: + {queryFilters?.sellCount} +
+
-
@@ -364,6 +422,7 @@ const mapStateToProps = (state) => ({ coinObjects: state.app.allContracts.coins, broker: state.app.broker, features: state.app.constants.features, + coinSymbols: state.app.coins, }); const mapDispatchToProps = (dispatch) => ({}); diff --git a/web/src/containers/Admin/Trades/p2pDisputes.js b/web/src/containers/Admin/Trades/p2pDisputes.js index c3c47ef823..ea8399827e 100644 --- a/web/src/containers/Admin/Trades/p2pDisputes.js +++ b/web/src/containers/Admin/Trades/p2pDisputes.js @@ -65,7 +65,7 @@ const P2PDisputes = ({ coins }) => { }, }, { - title: 'User’s Reason', + title: 'Reason', dataIndex: 'reason', key: 'reason', render: (user_id, data) => { diff --git a/web/src/containers/Admin/Trades/p2pSettings.js b/web/src/containers/Admin/Trades/p2pSettings.js index 59d5843240..2df7aa36a5 100644 --- a/web/src/containers/Admin/Trades/p2pSettings.js +++ b/web/src/containers/Admin/Trades/p2pSettings.js @@ -1,5 +1,7 @@ /* eslint-disable */ import React, { useEffect, useState, useRef } from 'react'; +import { connect } from 'react-redux'; +import { bindActionCreators } from 'redux'; import { Tabs, message, @@ -9,15 +11,15 @@ import { Checkbox, Input, Switch, + Radio, + Space, } from 'antd'; -import { Radio, Space } from 'antd'; -import { connect } from 'react-redux'; -import { bindActionCreators } from 'redux'; import { CloseOutlined } from '@ant-design/icons'; import { setExchange } from 'actions/assetActions'; import { requestTiers } from '../Tiers/action'; import { updateConstants, requestUsers } from './actions'; import { requestAdminData } from 'actions/appActions'; +import { Coin } from 'components'; import _debounce from 'lodash/debounce'; import Coins from '../Coins'; import _toLower from 'lodash/toLower'; @@ -394,15 +396,15 @@ const P2PSettings = ({ coins, pairs, p2p_config, features, constants }) => { {step === 0 && (
-
Trade direction (side)
-
+
Trade direction (side)
+
Select what kind of deals that the vendors (market makers) can advertise.
-
+
Vendors (makers) can only offer to sell crypto to users (takers)
-
Crypto assets
-
Select the crypto assets that vendors can transact with
- {Object.values(coins || {}).map((coin) => { - return ( -
- { - if (e.target.checked) { - if (!digitalCurrencies.includes(coin.symbol)) { - setDigitalCurrencies([ - ...digitalCurrencies, - coin.symbol, - ]); - } - } else { - if (digitalCurrencies.includes(coin.symbol)) { - setDigitalCurrencies( - [...digitalCurrencies].filter( - (symbol) => symbol !== coin.symbol - ) - ); - } - } - }} +
Crypto assets
+
+ Select the crypto assets that vendors can transact with +
+
)} diff --git a/web/src/containers/Admin/User/PaymentMethods.js b/web/src/containers/Admin/User/PaymentMethods.js index 3853b66c19..c734f8caac 100644 --- a/web/src/containers/Admin/User/PaymentMethods.js +++ b/web/src/containers/Admin/User/PaymentMethods.js @@ -218,7 +218,8 @@ const PaymentMethods = ({ user }) => { return (
- Below are details of payment methods belonging to this user + Below are details of payment methods belonging to this user. These + accounts can be used for P2P trading.
diff --git a/web/src/containers/Admin/User/index.css b/web/src/containers/Admin/User/index.css index 52f46b7ce3..7bbe349437 100644 --- a/web/src/containers/Admin/User/index.css +++ b/web/src/containers/Admin/User/index.css @@ -476,6 +476,7 @@ .add-user-modal .ant-form-item-label > label { font-size: 12px; + color: #ffffff; } .add-user-modal .ant-input { diff --git a/web/src/containers/Admin/Wallets/index.js b/web/src/containers/Admin/Wallets/index.js index c7ef35fc9a..70fb208b13 100644 --- a/web/src/containers/Admin/Wallets/index.js +++ b/web/src/containers/Admin/Wallets/index.js @@ -6,7 +6,7 @@ import { ReactSVG } from 'react-svg'; import { STATIC_ICONS } from 'config/icons'; import { requestTotalBalance, requestConstants } from './actions'; import { formatCurrencyByIncrementalUnit } from 'utils/currency'; - +import './index.scss'; class Wallets extends Component { state = { users: [], @@ -90,20 +90,26 @@ class Wallets extends Component { key: 'available', title: 'Available', dataIndex: 'available', - } - ] + }, + ]; sortedCoins.forEach((coin) => { - if ( balance && balance[`${coin}_balance`]) { + if (balance && balance[`${coin}_balance`]) { const inc_unit = coins[coin]?.increment_unit; let asset = { name: coin.toUpperCase(), - total: formatCurrencyByIncrementalUnit(balance[`${coin}_balance`], inc_unit), - available: formatCurrencyByIncrementalUnit(balance[`${coin}_available`], inc_unit) - } + total: formatCurrencyByIncrementalUnit( + balance[`${coin}_balance`], + inc_unit + ), + available: formatCurrencyByIncrementalUnit( + balance[`${coin}_available`], + inc_unit + ), + }; data.push(asset); } - }) + }); return (
diff --git a/web/src/containers/Admin/Wallets/index.scss b/web/src/containers/Admin/Wallets/index.scss new file mode 100644 index 0000000000..91715c0c6f --- /dev/null +++ b/web/src/containers/Admin/Wallets/index.scss @@ -0,0 +1,503 @@ +.app_container-content-tabs_content { + padding: 8px; +} + +.user_information { + padding: 4px; +} + +.user_information > * { + padding: 4px; +} +.list_users { + padding-top: 30px; +} +.green-btn { + background-color: #288500 !important; + color: #ffffff !important; +} +.ant-checkbox-wrapper { + color: #ffffff !important; +} +.admin-tiers-wrapper .ant-tabs-nav .ant-tabs-ink-bar, +.admin-user-content .ant-tabs-nav .ant-tabs-ink-bar, +.user-container .ant-tabs-nav .ant-tabs-ink-bar { + height: 6px; + background-color: #ffffff; +} +.user-container .ant-tabs-nav .ant-tabs-ink-bar { + top: 0px; +} +.admin-tiers-wrapper .ant-tabs-nav .ant-tabs-tab, +.user-container .ant-tabs-nav .ant-tabs-tab { + font-size: 15px; + opacity: 0.6; + color: var(--admin_panel_main_font); +} +.ant-tabs-tab-active { + font-weight: bold !important; + opacity: 1 !important; +} +.ant-tabs-tab.ant-tabs-tab-active .ant-tabs-tab-btn { + font-weight: bold; + opacity: 1 !important; +} +.user-container .ant-tabs-nav .ant-tabs-tab:hover { + color: var(--admin_panel_main_font); +} +.admin-tiers-wrapper .ant-tabs-nav::before, +.admin-user-content .ant-tabs-nav::before, +.user-container .ant-tabs-nav::before { + border-bottom: 1px solid #ffffff; +} +.admin-user-container .ant-table-thead > tr > th { + background-color: var(--admin_panel_table_thead); + color: var(--admin_panel_main_font); +} +.admin-user-container .ant-table-tbody > tr > td { + background-color: var(--admin_panel_table_tbody); + color: var(--admin_panel_main_font); + border-bottom: 1px solid var(--admin_panel_table_tbody); +} +.admin-user-container .ant-table-tbody > tr.ant-table-placeholder:hover > td { + background-color: var(--admin_panel_table_tbody_hover); +} +.admin-user-container .ant-table-tbody > tr.ant-table-row:hover > td { + background-color: var(--admin_panel_table_tbody_hover); +} +.admin-user-container .ant-empty .ant-empty-image .ant-empty-img-simple-ellipse, +.admin-user-container .ant-empty .ant-empty-image .ant-empty-img-simple-path { + fill: #7d9ac9; +} +.admin-user-container .ant-empty .ant-empty-image .ant-empty-img-simple-g { + stroke: #7d9ac9; +} +.admin-user-container .ant-empty .ant-empty-description { + color: var(--admin_panel_main_font); +} +.admin-user-container .admin-wallet-icon { + margin-right: 1rem; + width: 5rem; +} +.admin-user-container .user-donut-chart-wrapper { + border-top: 1px solid grey; + height: 25rem; +} +.admin-user-modal .title { + font-size: 25px; + font-weight: bold; +} +.admin-user-modal .step-1-container .green-btn, +.admin-user-modal .step-2-container .green-btn { + background-color: #288500 !important; + border: 1px #288500 !important; + color: #ffffff; + width: 48%; + height: 40px; +} +.admin-user-modal .step-1-container .btn-container, +.admin-user-modal .step-2-container .btn-container { + display: flex; + justify-content: space-between; +} +.admin-user-modal .step-2-container .width-6 { + width: 6rem; +} +.admin-user-container .generate-link { + text-decoration: underline; + cursor: pointer; +} +.admin-user-content { + margin: 24px 0px; +} +.admin-user-content .ant-breadcrumb, +.admin-user-content .ant-breadcrumb-separator { + color: #c4c4c4; +} +.admin-user-content .ant-breadcrumb a:hover { + color: var(--admin_panel_main_font); +} +.admin-user-content .ant-breadcrumb > span:last-child { + color: var(--admin_panel_main_font); +} +.admin-user-content .ant-breadcrumb > span:last-child a { + color: var(--admin_panel_main_font); +} +.user-icon { + margin-right: 5px; + width: 3rem; +} +.user-details { + color: var(--admin_panel_main_font); + font-size: 18px; + margin: 10px 0px; +} +.user-details .user-seperator { + background-color: var(--admin_panel_main_font); + height: 20px; + margin: 0px 14px; + width: 1px; +} +.about-icon .freeze-icon { + fill: #c4c4c4; +} +.about-icon .flag-icon, +.about-icon .otp-key { + fill: none; + stroke: #c4c4c4; +} +.about-info:first-child { + border-left: none; +} +.about-info { + padding: 15px 10px; + border-left: 1px solid #c4c4c4; + width: 16rem; +} +.about-info .percentage-txt { + font-size: 42px; + letter-spacing: 0px; + color: var(--admin_panel_main_font); + opacity: 0.6; +} +.about-info .percentage-txt-active { + /* color: #FFFFFF; */ + opacity: 1; +} +.about-info .info-txt { + white-space: nowrap; +} +.about-info .verification-icon { + width: 15px; + position: relative; + bottom: 10px; + right: 3px; +} +.about-icon { + width: 3rem; + margin-left: 5px; +} +.about-icon-active .about-icon .flag-icon { + fill: #ff0000; +} +.about-icon-active .freeze-icon { + fill: #00edff; +} +.about-icon-active .about-icon .otp-key { + fill: #ffffff; +} +.info-link { + cursor: pointer; + text-decoration: underline; +} +.about-info-content { + text-align: right; +} +.about-wrapper { + padding: 0px 15px; +} +.about-verification-content { + flex: 1; + margin-right: 12px; +} +.about-notes-content { + width: 18rem; +} +.about-notes-text { + margin-bottom: 2rem; +} +.about-notes-content .ant-btn { + width: auto; +} +.about-title { + border-bottom: 1px solid #c4c4c4; + font-weight: bold; + padding: 10px 0px; + margin-bottom: 8px; +} +.verification-docs-container { + margin-bottom: 5px; + width: 20rem; +} +.admin-user-container .ant-modal-confirm-btns { + display: flex; +} +.admin-content-wrapper .blue-link { + color: var(--admin_panel_main_font) !important; + text-decoration: underline; +} +.admin-content-wrapper h1, +.admin-content-wrapper h2, +.admin-content-wrapper h3, +.admin-content-wrapper h4, +.admin-content-wrapper h5, +.admin-content-wrapper h6, +.admin-user-container .ant-modal-body h1, +.admin-user-container .ant-modal-body h3, +.user-data-form h1, +.user-data-form h3 { + color: var(--admin_panel_main_font); +} +.user-info-header-wrapper { + border-top: 1px solid #c4c4c4; +} +.user-data-form .btn-wrapper .green-btn { + background-color: #288500 !important; + border: 1px #288500 !important; + color: #ffffff; + width: 48%; + height: 35px; +} +.user-data-form .fs-12 { + font-size: 12px !important; +} +.user-data-form .ant-input.change-user-email-field { + background-color: #ffffff !important; + color: #000 !important; +} +.user-data-form .text-underline { + text-decoration: underline; +} +.user-info-container, +.user-role-container, +.user-level-container { + display: flex; + justify-content: space-between; + padding-top: 10px; +} +.user-info-container { + width: 25rem; +} +.user-info-separator { + border-right: 1px solid #c4c4c4; + margin: 0rem 2rem; + width: 1px; + height: 4rem; +} +.user-data-form .user-edit-icon { + margin-right: 1rem; + width: 3rem; +} +.user-data-form .ant-picker .ant-picker-clear path, +.user-data-form .ant-picker .ant-picker-suffix path, +.user-data-form .ant-select .ant-select-arrow path { + fill: #ffffff; +} +.user-data-form + .ant-select-single:not(.ant-select-customize-input) + .ant-select-selector, +.user-data-form .ant-input, +.user-data-form .ant-picker-input > input, +.user-data-form .ant-picker, +.user-data-form .ant-input-number-input { + background-color: var(--admin_panel_input); + color: var(--admin_panel_main_font) !important; +} +.download-csv-table { + border: 1px solid #ffffff; + padding: 2px 5px; +} +.user-info-icon { + width: 35px; + position: relative; + bottom: 5px; +} +.user-info-label { + margin-left: 15px; +} +.admin-user-container .ant-table-pagination.ant-pagination { + margin: 16px 0; + background: #ffffff; + border-radius: 50px; + padding: 15px; +} +.levels-icon { + width: 57px; + position: relative; + bottom: 15px; +} +.select-level-icon { + width: 3rem; + position: relative; + top: 0.2rem; +} +.user-data-form + .ant-select-single:not(.ant-select-customize-input) + .ant-select-selector { + height: 50px; +} +.header-section { + // border-bottom: 1px solid rgb(211, 211, 211, 0.3); + background-color: var(--admin_panel_header_section); +} +.modal-confirm-title { + font-size: 20px; + font-weight: bold; + color: var(--admin_panel_main_font); +} +.user-role-container .user-icon { + font-size: 30px; +} +.user-discount-wrapper .ant-form { + color: inherit; +} +.user-discount-wrapper .title { + font-size: 28px; + font-weight: bold; + margin-bottom: 1rem; +} +.user-discount-wrapper .box-content { + border: 1px solid #ffffff; + padding: 2rem; + margin: 1.5rem 0; +} +.user-discount-wrapper .button-wrapper { + display: flex; + justify-content: space-between; + margin-top: 2rem; +} +.user-discount-wrapper .button-wrapper .ant-btn { + width: 225px; +} + +.admin-user-content .ant-card-head-wrapper { + display: flex; + flex-direction: column; +} +.admin-user-content .ant-card-extra { + padding: 0; +} + +.user_meta-form .title { + font-size: 20px; +} +.user_meta-form .anchor { + cursor: pointer; + text-decoration: underline; +} +.user_meta-form .user-form-wrapper { + margin: 4rem 0; +} +.user_meta-form .user-form-wrapper .divider-line { + border-top: 1px solid #c4c4c4; + margin: 2rem 0; + width: 40%; +} +.user_meta-form .user-form-wrapper .ant-btn { + width: 30%; +} +.user_meta-form .user-form-wrapper .required-label { + color: #ffb300; +} +.user_meta-form .user-form-wrapper .icon-wrapper { + position: relative; +} +.user_meta-form .user-form-wrapper .anticon-close-circle { + position: absolute; + bottom: 15px; + left: 27px; + cursor: pointer; +} +.user_meta-form .user-form-wrapper .anticon-close-circle svg { + width: 18px !important; + height: 23px !important; +} +.user_meta-form .user-form-wrapper .ant-picker { + background-color: var(--admin_panel_input); +} +.user_meta-form .user-form-wrapper .ant-picker-input > input, +.user_meta-form .user-form-wrapper .ant-picker-suffix { + color: #c4c4c4; +} +.modal-wrapper .title { + font-size: 20px; + font-weight: bold; +} +.modal-wrapper .box-content { + border: 1px solid #ffffff; + padding: 2rem; +} +.modal-wrapper .small-box { + border: 1px solid #ffffff; + padding: 1rem; +} +.modal-wrapper .input_field .ant-select-arrow { + color: #c4c4c4 !important; +} +.modal-wrapper .input_field .ant-select { + margin-bottom: 1.5rem; +} +.admin-user-container .filter-select-wrapper .select-container { + width: 100%; +} +.verification-wrapper { + background-color: #27339d; + padding: 10px; +} + +.green-badge { + background-color: green; + color: #c4c4c4; + border-radius: 4px; + font-size: 1rem; + padding: 0.4rem; + font-weight: bold; +} + +.user-container .user-list-header-wrapper { + display: flex; + justify-content: space-between; + align-items: center; +} + +.user-container .user-list-header-wrapper button { + background-color: green; + color: white; +} + +.add-user-modal .header-txt span { + font-weight: bold; +} + +.add-user-modal .footer .ant-btn[disabled], +.add-user-modal .footer .ant-btn[disabled]:hover { + background-color: #288500; + border-color: #288500; + color: #ffffff; + opacity: 0.5; +} +.add-user-modal .footer { + width: 100%; + display: flex; + margin-top: 2rem; +} + +.add-user-modal .footer button { + width: 48%; + background-color: #288500; + border-color: #288500; + color: #ffffff; + margin-bottom: 1rem; +} + +.add-user-modal .ant-form-item-label > label { + font-size: 12px; + color: #ffffff; +} + +.add-user-modal .ant-input { + font-size: 12px; +} + +.add-user-modal .ant-form-item { + margin-bottom: 10px; +} + +.add-user-modal .ant-form-vertical .ant-form-item-label { + padding: 0 0 2px; +} + +.add-user-modal .ant-form-item-explain, +.ant-form-item-extra { + font-size: 12px; +} diff --git a/web/src/containers/Admin/index.js b/web/src/containers/Admin/index.js index fbcb67c79d..287c95b77c 100644 --- a/web/src/containers/Admin/index.js +++ b/web/src/containers/Admin/index.js @@ -1,33 +1,174 @@ -export { default as User } from './User'; -export { default as TradeHistory } from './TradeHistory'; -export { default as UserBalance } from './UserBalance'; -export { default as Logins } from './Logins'; -export { default as Audits } from './Audits'; -export { default as AppWrapper } from './AppWrapper'; -export { default as Main } from './Main'; -export { default as Balance } from './Balance'; -export { default as Verification } from './Verification'; -export { default as UploadIds } from './UploadIds'; -export { default as Otp } from './Otp'; -export { default as Activate } from './Activate'; -export { ListUsers, FullListUsers } from './ListUsers'; -export { default as Stakes } from './Stakes'; -export { default as Sessions } from './Sessions'; -export { default as Deposits } from './Deposits'; -export { default as Limits } from './Limits'; -export { default as DepositsPage } from './DepositsPage'; -export { default as BlockchainTransaction } from './BlockchainTransaction'; -export { default as Fees } from './Fees'; -export { default as Chat } from './Chat'; -export { default as Wallets } from './Wallets'; -export { default as Transactions } from './Transactions'; -export { default as UserFees } from './UserFees'; -export { default as Trades } from './Trades'; +import React from 'react'; +import Loadable from 'react-loadable'; +import { Loader } from 'components'; + export { PATHS } from './paths'; -export { default as ActiveOrders } from './ActiveOrders'; -export { default as Broker } from './Broker'; -export { default as Plugins } from './Plugins'; -export { default as PluginServices } from './Plugins/PluginServices'; -export { default as Settings } from './Settings'; -export { default as Transfer } from './Transfers'; -export { default as Billing } from './Billing'; + +const LoadingComponent = ({ isLoading, error }) => { + return ; +}; + +export const User = Loadable({ + loader: () => import('./User'), + loading: LoadingComponent, +}); + +export const TradeHistory = Loadable({ + loader: () => import('./TradeHistory'), + loading: LoadingComponent, +}); + +export const UserBalance = Loadable({ + loader: () => import('./UserBalance'), + loading: LoadingComponent, +}); + +export const Logins = Loadable({ + loader: () => import('./Logins'), + loading: LoadingComponent, +}); + +export const Audits = Loadable({ + loader: () => import('./Audits'), + loading: LoadingComponent, +}); + +export const AppWrapper = Loadable({ + loader: () => import('./AppWrapper'), + loading: LoadingComponent, +}); + +export const Main = Loadable({ + loader: () => import('./Main'), + loading: LoadingComponent, +}); + +export const Balance = Loadable({ + loader: () => import('./Balance'), + loading: LoadingComponent, +}); + +export const Verification = Loadable({ + loader: () => import('./Verification'), + loading: LoadingComponent, +}); + +export const UploadIds = Loadable({ + loader: () => import('./UploadIds'), + loading: LoadingComponent, +}); + +export const Otp = Loadable({ + loader: () => import('./Otp'), + loading: LoadingComponent, +}); + +export const Activate = Loadable({ + loader: () => import('./Activate'), + loading: LoadingComponent, +}); + +export const ListUsers = Loadable({ + loader: () => import('./ListUsers/ListUser'), + loading: LoadingComponent, +}); + +export const FullListUsers = Loadable({ + loader: () => import('./ListUsers/FullList'), + loading: LoadingComponent, +}); + +export const Stakes = Loadable({ + loader: () => import('./Stakes'), + loading: LoadingComponent, +}); + +export const Sessions = Loadable({ + loader: () => import('./Sessions'), + loading: LoadingComponent, +}); + +export const Deposits = Loadable({ + loader: () => import('./Deposits'), + loading: LoadingComponent, +}); + +export const Limits = Loadable({ + loader: () => import('./Limits'), + loading: LoadingComponent, +}); + +export const DepositsPage = Loadable({ + loader: () => import('./DepositsPage'), + loading: LoadingComponent, +}); + +export const BlockchainTransaction = Loadable({ + loader: () => import('./BlockchainTransaction'), + loading: LoadingComponent, +}); + +export const Fees = Loadable({ + loader: () => import('./Fees'), + loading: LoadingComponent, +}); + +export const Chat = Loadable({ + loader: () => import('./Chat'), + loading: LoadingComponent, +}); + +export const Wallets = Loadable({ + loader: () => import('./Wallets'), + loading: LoadingComponent, +}); + +export const Transactions = Loadable({ + loader: () => import('./Transactions'), + loading: LoadingComponent, +}); + +export const UserFees = Loadable({ + loader: () => import('./UserFees'), + loading: LoadingComponent, +}); + +export const Trades = Loadable({ + loader: () => import('./Trades'), + loading: LoadingComponent, +}); + +export const ActiveOrders = Loadable({ + loader: () => import('./ActiveOrders'), + loading: LoadingComponent, +}); + +export const Broker = Loadable({ + loader: () => import('./Broker'), + loading: LoadingComponent, +}); + +export const Plugins = Loadable({ + loader: () => import('./Plugins'), + loading: LoadingComponent, +}); + +export const PluginServices = Loadable({ + loader: () => import('./Plugins/PluginServices'), + loading: LoadingComponent, +}); + +export const Settings = Loadable({ + loader: () => import('./Settings'), + loading: LoadingComponent, +}); + +export const Transfer = Loadable({ + loader: () => import('./Transfers'), + loading: LoadingComponent, +}); + +export const Billing = Loadable({ + loader: () => import('./Billing'), + loading: LoadingComponent, +}); diff --git a/web/src/containers/Admin/paths.js b/web/src/containers/Admin/paths.js index b2b7832c65..4aca263b8b 100644 --- a/web/src/containers/Admin/paths.js +++ b/web/src/containers/Admin/paths.js @@ -192,6 +192,11 @@ export const ADMIN_PATHS = [ ]; export const SUPERVISOR_PATH = [ + { + path: '/admin/fiat', + label: 'Fiat controls', + routeKey: 'trade', + }, { path: '/admin/financials', label: 'Assets', diff --git a/web/src/containers/App/MobileBarMoreOptions.js b/web/src/containers/App/MobileBarMoreOptions.js new file mode 100644 index 0000000000..9a3f3e873a --- /dev/null +++ b/web/src/containers/App/MobileBarMoreOptions.js @@ -0,0 +1,935 @@ +import React, { useCallback, useEffect, useState } from 'react'; +import { browserHistory } from 'react-router'; +import { connect } from 'react-redux'; +import { bindActionCreators } from 'redux'; + +import icons from 'config/icons/dark'; +import STRINGS from 'config/localizedStrings'; +import Dialog from 'components/Dialog/MobileDialog'; +import withConfig from 'components/ConfigProvider/withConfig'; +import HelpfulResourcesForm from 'containers/HelpfulResourcesForm'; +import { Coin, EditWrapper, Image, SearchBox } from 'components'; +import { + setLimitTab, + setSecurityTab, + setSettingsTab, + setStake, + setVerificationTab, +} from 'actions/appActions'; +import { getLogins } from 'actions/userAction'; +import { requestAuthenticated } from 'utils'; +import { ConnectionPopup, ReconnectPopup } from 'components/AppBar/Utils'; +import { removeToken } from 'utils/token'; +import { MarketsSelector } from 'containers/Trade/utils'; + +const INITIAL_LOGINS_STATE = { + count: 0, + data: [], +}; + +const MobileBarMoreOptions = ({ + setVerificationTab, + setSecurityTab, + setLimitTab, + setSelectedStake, + features, + setSettingsTab, + coins, + pinnedAsset, + getMarkets, + quickTrade, +}) => { + const [search, setSearch] = useState(''); + const [isDialogOpen, setIsDialogOpen] = useState(false); + const [isDisplayPopup, setIsDisplayPopup] = useState({ + isDisplayConnection: false, + isDisplayReconnect: false, + }); + const [loginDetail, setLoginDetail] = useState(INITIAL_LOGINS_STATE); + const [hasResponseData, setHasResponseData] = useState(false); + const [isLoading, setIsLoading] = useState(false); + const [pingDetails, setPingDetails] = useState({ + isDisplayPingText: true, + pingValue: null, + isDisplayPing: false, + }); + + const fieldHasCoinIcon = [ + 'SUMMARY.DEPOSIT', + 'TRADE_TAB_TRADE', + 'CONVERT', + 'ASSET_TXT', + 'WITHDRAW_PAGE.WITHDRAW', + ]; + const searchByName = Object.entries( + coins + )?.map(([_, { symbol, fullname, type }]) => + type !== 'fiat' ? { symbol, fullname } : {} + ); + + const getSymbol = searchByName + ?.filter((data) => { + return ( + search?.length > 1 && + (data?.fullname?.toLowerCase()?.startsWith(search?.toLowerCase()) || + data?.symbol?.toLowerCase()?.startsWith(search?.toLowerCase())) + ); + }) + ?.sort((a, b) => { + const indexA = pinnedAsset?.indexOf(a?.symbol?.toLowerCase()); + const indexB = pinnedAsset?.indexOf(b?.symbol?.toLowerCase()); + + if (indexA === -1 && indexB === -1) return 0; + if (indexA === -1) return 1; + if (indexB === -1) return -1; + return indexA - indexB; + }); + + const getAsset = + getSymbol?.length >= 1 + ? getSymbol[0]?.symbol + : search?.length > 1 && search; + const isValidCoin = coins[getAsset]?.symbol; + + const assetDetails = Object.entries( + coins + )?.flatMap(([_, { symbol, fullname, type }]) => + type !== 'fiat' ? [symbol, fullname] : [] + ); + + const getPairs = getMarkets?.filter((market) => { + return market?.key?.split('-')?.includes(getAsset); + }); + + const getQuickTradePair = quickTrade?.filter((quicktrade) => { + return quicktrade?.symbol?.split('-')?.includes(getAsset); + }); + + useEffect(() => { + setSecurityTab(null); + setLimitTab(null); + setVerificationTab(null); + const fetchData = async () => { + try { + await requestLogins(); + await fetchHealthData(); + } catch (error) { + setHasResponseData(false); + console.error('Error fetching data:', error); + } + }; + + fetchData(); + //eslint-disable-next-line + }, []); + + const requestLogins = useCallback((page = 1) => { + getLogins({ page }) + .then(({ data: { count, data } }) => { + setLoginDetail((prevLogins) => ({ + count, + data: prevLogins.data.concat(data), + })); + }) + .catch((error) => { + console.error(error); + }); + }, []); + + const fetchHealthData = async () => { + setIsLoading(true); + const startTime = Date.now(); + try { + await requestAuthenticated('/health'); + setHasResponseData(true); + const duration = Date.now() - startTime; + setPingDetails((prev) => ({ + ...prev, + pingValue: duration, + })); + } catch (error) { + setHasResponseData(false); + console.error('Error fetching health data:', error); + } finally { + setIsLoading(false); + } + }; + + const hotFunctionOptions = [ + { + icon_id: 'DEPOSIT_OPTION_ICON', + iconText: 'SUMMARY.DEPOSIT', + path: isValidCoin ? `/wallet/${getAsset}/deposit` : '/wallet/deposit', + isDisplay: true, + searchContent: [ + STRINGS['MORE_OPTIONS_LABEL.HOT_FUNCTION.ADD_FUNDS'], + STRINGS['MORE_OPTIONS_LABEL.HOT_FUNCTION.TOP_UP'], + STRINGS['MORE_OPTIONS_LABEL.HOT_FUNCTION.LOAD'], + STRINGS['MORE_OPTIONS_LABEL.HOT_FUNCTION.CREDIT'], + STRINGS['MORE_OPTIONS_LABEL.HOT_FUNCTION.FUND_ACCOUNT'], + STRINGS['MORE_OPTIONS_LABEL.HOT_FUNCTION.BTC'], + STRINGS['MORE_OPTIONS_LABEL.HOT_FUNCTION.USTD'], + STRINGS['MORE_OPTIONS_LABEL.HOT_FUNCTION.ETH'], + STRINGS['MORE_OPTIONS_LABEL.HOT_FUNCTION.USD'], + STRINGS['MORE_OPTIONS_LABEL.HOT_FUNCTION.XHT'], + STRINGS['WITHDRAW_PAGE.WITHDRAWAL_CONFIRM_ADDRESS'], + STRINGS['MORE_OPTIONS_LABEL.HOT_FUNCTION.TRANSFER'], + STRINGS['MORE_OPTIONS_LABEL.HOT_FUNCTION.MONEY'], + STRINGS['MORE_OPTIONS_LABEL.HOT_FUNCTION.FUNDING'], + STRINGS['MORE_OPTIONS_LABEL.HOT_FUNCTION.RECHARGE'], + STRINGS['MORE_OPTIONS_LABEL.HOT_FUNCTION.REFILL'], + STRINGS['MORE_OPTIONS_LABEL.HOT_FUNCTION.CASH_IN'], + STRINGS['MORE_OPTIONS_LABEL.HOT_FUNCTION.ADD_MONEY'], + ...assetDetails, + ], + }, + { + icon_id: 'TRADE_OPTION_ICON', + iconText: 'TRADE_TAB_TRADE', + path: + isValidCoin && getPairs?.length >= 1 + ? `/trade/${getPairs[0]?.key}` + : '/trade', + isDisplay: features?.pro_trade, + searchContent: [ + STRINGS['MORE_OPTIONS_LABEL.HOT_FUNCTION.EXCHANGE'], + STRINGS['MORE_OPTIONS_LABEL.HOT_FUNCTION.SWAP'], + STRINGS['MORE_OPTIONS_LABEL.HOT_FUNCTION.BUY_SELL'], + STRINGS['TYPES.MARKET'], + STRINGS['DEVELOPERS_TOKEN.TRADING_ACCESS'], + STRINGS['PRO_TRADE'], + STRINGS['P2P.ORDER'], + STRINGS['MORE_OPTIONS_LABEL.HOT_FUNCTION.ETH'], + STRINGS['MORE_OPTIONS_LABEL.HOT_FUNCTION.USD'], + STRINGS['MORE_OPTIONS_LABEL.HOT_FUNCTION.XHT'], + STRINGS['MORE_OPTIONS_LABEL.HOT_FUNCTION.BTC'], + STRINGS['MORE_OPTIONS_LABEL.HOT_FUNCTION.USTD'], + ...getPairs?.flatMap((item) => [ + ...item?.key?.split('-'), + item?.fullname, + ]), + ], + }, + { + icon_id: 'CONVERT_OPTION_ICON', + iconText: 'CONVERT', + path: + getQuickTradePair?.length >= 1 + ? `/quick-trade/${getQuickTradePair[0]?.symbol}` + : '/quick-trade', + isDisplay: features?.quick_trade, + searchContent: [ + STRINGS['MORE_OPTIONS_LABEL.HOT_FUNCTION.EXCHANGE'], + STRINGS['MORE_OPTIONS_LABEL.HOT_FUNCTION.SWAP'], + STRINGS['MORE_OPTIONS_LABEL.HOT_FUNCTION.TRADE'], + STRINGS['QUICK_TRADE_COMPONENT.CHANGE_TEXT'], + STRINGS['MORE_OPTIONS_LABEL.HOT_FUNCTION.CONVERT_CURRENCY'], + STRINGS['MORE_OPTIONS_LABEL.HOT_FUNCTION.BUY_SELL'], + STRINGS['QUICK_TRADE'], + STRINGS['MORE_OPTIONS_LABEL.HOT_FUNCTION.ORDER'], + STRINGS['MORE_OPTIONS_LABEL.HOT_FUNCTION.ETH'], + STRINGS['MORE_OPTIONS_LABEL.HOT_FUNCTION.USD'], + STRINGS['MORE_OPTIONS_LABEL.HOT_FUNCTION.XHT'], + STRINGS['MORE_OPTIONS_LABEL.HOT_FUNCTION.BTC'], + STRINGS['MORE_OPTIONS_LABEL.HOT_FUNCTION.USTD'], + ...getQuickTradePair?.flatMap((item) => { + const [firstPair] = item?.symbol?.split('-'); + return [firstPair, item?.fullname]; + }), + ], + }, + { + icon_id: 'REFERRAL_OPTION_ICON', + iconText: 'MORE_OPTIONS_LABEL.ICONS.REFERRALS', + path: '/referral', + isDisplay: features?.referral_history_config, + searchContent: [ + STRINGS['MORE_OPTIONS_LABEL.HOT_FUNCTION.INVITE'], + STRINGS['MORE_OPTIONS_LABEL.HOT_FUNCTION.REFER'], + STRINGS['MORE_OPTIONS_LABEL.HOT_FUNCTION.REWARDS'], + STRINGS['MORE_OPTIONS_LABEL.HOT_FUNCTION.BONUS'], + STRINGS['STAKE.EARN'], + STRINGS['MORE_OPTIONS_LABEL.HOT_FUNCTION.AFFILIATION'], + STRINGS['MORE_OPTIONS_LABEL.HOT_FUNCTION.AFFILIATE'], + STRINGS['MORE_OPTIONS_LABEL.HOT_FUNCTION.PASSIVE_INCOME'], + STRINGS['MORE_OPTIONS_LABEL.HOT_FUNCTION.REVENUE'], + ], + }, + ]; + + const otherFunctionOptions = [ + { + icon_id: 'API_OPTION_ICON', + iconText: 'MORE_OPTIONS_LABEL.ICONS.API', + path: '/security?apiKeys', + isDisplay: true, + searchContent: [ + STRINGS['MORE_OPTIONS_LABEL.OTHER_FUNCTIONS.INTEGRATION'], + STRINGS['MORE_OPTIONS_LABEL.OTHER_FUNCTIONS.PROGRAMMATIC_ACCESS'], + STRINGS['MORE_OPTIONS_LABEL.OTHER_FUNCTIONS.DEVELOPER'], + STRINGS['MORE_OPTIONS_LABEL.OTHER_FUNCTIONS.AUTOMATED_TRADING'], + STRINGS['MORE_OPTIONS_LABEL.OTHER_FUNCTIONS.BOT'], + STRINGS['MORE_OPTIONS_LABEL.OTHER_FUNCTIONS.ALGO'], + STRINGS['MORE_OPTIONS_LABEL.OTHER_FUNCTIONS.ALGORITHM'], + STRINGS['MORE_OPTIONS_LABEL.OTHER_FUNCTIONS.SECURITY'], + ], + }, + { + icon_id: 'BUY_CRYPTO_OPTION', + iconText: 'MORE_OPTIONS_LABEL.ICONS.BUY_CRYPTO', + path: '/buy-crypto', + isDisplay: true, + searchContent: [ + STRINGS['MARKET_OPTIONS.CARD'], + STRINGS['MORE_OPTIONS_LABEL.OTHER_FUNCTIONS.CRYPTO'], + STRINGS['MORE_OPTIONS_LABEL.HOT_FUNCTION.BUY_SELL'], + STRINGS['MORE_OPTIONS_LABEL.HOT_FUNCTION.USD'], + STRINGS['MORE_OPTIONS_LABEL.OTHER_FUNCTIONS.FIAT'], + STRINGS['MORE_OPTIONS_LABEL.OTHER_FUNCTIONS.DOLLAR'], + STRINGS['MORE_OPTIONS_LABEL.OTHER_FUNCTIONS.PURCHASE'], + STRINGS['MORE_OPTIONS_LABEL.HOT_FUNCTION.XHT'], + STRINGS['P2P.ORDER'], + STRINGS['CURRENCY'], + STRINGS['MORE_OPTIONS_LABEL.OTHER_FUNCTIONS.BUY_COIN'], + STRINGS['MORE_OPTIONS_LABEL.OTHER_FUNCTIONS.BUY_TOKEN'], + ], + }, + { + icon_id: 'DEFI_STAKE_OPTION_ICON', + iconText: 'MORE_OPTIONS_LABEL.ICONS.DEFI_STAKE', + path: '/stake', + isDisplay: features?.stake_page, + searchContent: [ + STRINGS['STAKE.EARN'], + STRINGS['MORE_OPTIONS_LABEL.HOT_FUNCTION.PASSIVE_INCOME'], + STRINGS['MORE_OPTIONS_LABEL.OTHER_FUNCTIONS.YIELD'], + STRINGS['MORE_OPTIONS_LABEL.OTHER_FUNCTIONS.INTEREST'], + STRINGS['MORE_OPTIONS_LABEL.HOT_FUNCTION.XHT'], + STRINGS['CURRENCY_WALLET.STAKING'], + STRINGS['MORE_OPTIONS_LABEL.OTHER_FUNCTIONS.REVENUE'], + STRINGS['MORE_OPTIONS_LABEL.HOT_FUNCTION.BONUS'], + ], + }, + { + icon_id: 'CEFI_STAKE_OPTION_ICON', + iconText: 'MORE_OPTIONS_LABEL.ICONS.CEFI_STAKE', + path: '/stake', + isDisplay: features?.cefi_stake, + searchContent: [ + STRINGS['STAKE.EARN'], + STRINGS['MORE_OPTIONS_LABEL.HOT_FUNCTION.PASSIVE_INCOME'], + STRINGS['MORE_OPTIONS_LABEL.OTHER_FUNCTIONS.YIELD'], + STRINGS['MORE_OPTIONS_LABEL.OTHER_FUNCTIONS.INTEREST'], + STRINGS['MORE_OPTIONS_LABEL.OTHER_FUNCTIONS.REVENUE'], + STRINGS['CURRENCY_WALLET.STAKING'], + STRINGS['MORE_OPTIONS_LABEL.OTHER_FUNCTIONS.CENTRALIZED_STAKING'], + STRINGS['MORE_OPTIONS_LABEL.HOT_FUNCTION.BONUS'], + ], + }, + { + icon_id: 'PROFIT_LOSS_OPTION_ICON', + iconText: 'MORE_OPTIONS_LABEL.ICONS.PROFIT_LOSS', + path: '/wallet/history', + isDisplay: true, + searchContent: [ + STRINGS['REFERRAL_LINK.EARNING'], + STRINGS['MORE_OPTIONS_LABEL.OTHER_FUNCTIONS.PERFORMANCE'], + STRINGS['MORE_OPTIONS_LABEL.OTHER_FUNCTIONS.GAINS'], + STRINGS['MORE_OPTIONS_LABEL.OTHER_FUNCTIONS.LOSSES'], + STRINGS['MORE_OPTIONS_LABEL.OTHER_FUNCTIONS.PORTFOLIO_PROFIT'], + STRINGS['MORE_OPTIONS_LABEL.OTHER_FUNCTIONS.PNL'], + STRINGS['MORE_OPTIONS_LABEL.OTHER_FUNCTIONS.LOSS'], + ], + }, + { + icon_id: 'FEES_OPTION_ICON', + iconText: 'FEES', + path: '/fees-and-limits', + isDisplay: true, + searchContent: [ + STRINGS['MORE_OPTIONS_LABEL.OTHER_FUNCTIONS.CHARGES'], + STRINGS['MORE_OPTIONS_LABEL.OTHER_FUNCTIONS.COSTS'], + STRINGS['MORE_OPTIONS_LABEL.OTHER_FUNCTIONS.COMMISSION'], + STRINGS['MORE_OPTIONS_LABEL.OTHER_FUNCTIONS.TRADING_FEES'], + STRINGS['MORE_OPTIONS_LABEL.OTHER_FUNCTIONS.TRANSACTION_FEES'], + ], + }, + { + icon_id: 'LIMITS_OPTION_ICON', + iconText: 'MORE_OPTIONS_LABEL.ICONS.LIMITS', + path: '/fees-and-limits', + isDisplay: true, + searchContent: [ + STRINGS['MORE_OPTIONS_LABEL.OTHER_FUNCTIONS.RESTRICTIONS'], + STRINGS['MORE_OPTIONS_LABEL.OTHER_FUNCTIONS.BOUNDARIES'], + STRINGS['MORE_OPTIONS_LABEL.OTHER_FUNCTIONS.CAPS'], + STRINGS['MORE_OPTIONS_LABEL.OTHER_FUNCTIONS.MAXIMUM'], + STRINGS['MORE_OPTIONS_LABEL.OTHER_FUNCTIONS.WITHDRAWAL_LIMITS'], + STRINGS['CALCULATE_MAX'], + ], + }, + { + icon_id: 'WALLET_OPTION_ICON', + iconText: 'ACCOUNTS.TAB_WALLET', + path: '/wallet', + isDisplay: true, + searchContent: [ + STRINGS['ACCOUNT_TEXT'], + STRINGS['MORE_OPTIONS_LABEL.OTHER_FUNCTIONS.STORAGE'], + STRINGS['MORE_OPTIONS_LABEL.OTHER_FUNCTIONS.FUNDS'], + STRINGS['MORE_OPTIONS_LABEL.OTHER_FUNCTIONS.BALANCE'], + STRINGS['MORE_OPTIONS_LABEL.HOT_FUNCTION.MONEY'], + STRINGS['FIAT.UNVERIFIED.DEPOSIT'], + STRINGS['WITHDRAW_PAGE.WITHDRAW'], + STRINGS['MORE_OPTIONS_LABEL.OTHER_FUNCTIONS.CRYPTO_WALLET'], + STRINGS['MORE_OPTIONS_LABEL.OTHER_FUNCTIONS.MY'], + ], + }, + { + icon_id: 'LANGUAGE_OPTION_ICON', + iconText: 'USER_SETTINGS.TITLE_LANGUAGE', + path: '/settings?language', + isDisplay: true, + searchContent: [ + STRINGS['MORE_OPTIONS_LABEL.OTHER_FUNCTIONS.ENGLISH'], + STRINGS['MORE_OPTIONS_LABEL.OTHER_FUNCTIONS.LOCALIZATION'], + STRINGS['MORE_OPTIONS_LABEL.OTHER_FUNCTIONS.TRANSLATE'], + STRINGS['MORE_OPTIONS_LABEL.OTHER_FUNCTIONS.LANGUAGE_SETTINGS'], + STRINGS['MORE_OPTIONS_LABEL.OTHER_FUNCTIONS.MULTILINGUAL'], + STRINGS['MORE_OPTIONS_LABEL.OTHER_FUNCTIONS.LANGUAGE_PREFERENCE'], + STRINGS['MORE_OPTIONS_LABEL.OTHER_FUNCTIONS.TEXT'], + STRINGS['MORE_OPTIONS_LABEL.OTHER_FUNCTIONS.WORD'], + STRINGS['MORE_OPTIONS_LABEL.OTHER_FUNCTIONS.SETTINGS'], + ], + }, + { + icon_id: 'P2P_OPTION_ICON', + iconText: 'P2P.TAB_P2P', + path: '/p2p', + isDisplay: features?.p2p, + searchContent: [ + STRINGS['MORE_OPTIONS_LABEL.OTHER_FUNCTIONS.PEER_TO_PEER'], + STRINGS['MORE_OPTIONS_LABEL.OTHER_FUNCTIONS.DIRECT_TRADE'], + STRINGS['MORE_OPTIONS_LABEL.OTHER_FUNCTIONS.USER_TO_USER'], + STRINGS['MORE_OPTIONS_LABEL.HOT_FUNCTION.BUY_SELL'], + STRINGS['DEVELOPERS_TOKEN.TRADING_ACCESS'], + STRINGS['MORE_OPTIONS_LABEL.OTHER_FUNCTIONS.PRIVATE_TRADE'], + STRINGS['MORE_OPTIONS_LABEL.HOT_FUNCTION.EXCHANGE'], + ], + }, + { + icon_id: 'HISTORY_OPTION_ICON', + iconText: 'ACCOUNTS.TAB_HISTORY', + path: '/transactions', + isDisplay: true, + searchContent: [ + STRINGS['MORE_OPTIONS_LABEL.OTHER_FUNCTIONS.TRANSACTIONS'], + STRINGS['MORE_OPTIONS_LABEL.OTHER_FUNCTIONS.ACTIVITY'], + STRINGS['MORE_OPTIONS_LABEL.OTHER_FUNCTIONS.RECORD'], + STRINGS['MORE_OPTIONS_LABEL.OTHER_FUNCTIONS.LOG'], + STRINGS['MORE_OPTIONS_LABEL.OTHER_FUNCTIONS.TRANSACTION_HISTORY'], + ], + }, + { + icon_id: 'VOLUME_OPTION_ICON', + iconText: 'CHART_TEXTS.v', + path: 'wallet/volume', + isDisplay: true, + searchContent: [ + STRINGS['SUMMARY.TRADING_VOLUME'], + STRINGS['ACTIVITY'], + STRINGS['MORE_OPTIONS_LABEL.OTHER_FUNCTIONS.MY'], + STRINGS['MORE_OPTIONS_LABEL.OTHER_FUNCTIONS.TRADING_ACTIVITY'], + STRINGS['MORE_OPTIONS_LABEL.OTHER_FUNCTIONS.LIQUIDITY'], + STRINGS['MORE_OPTIONS_LABEL.OTHER_FUNCTIONS.MARKET_VOLUME'], + ], + }, + { + icon_id: 'ASSET_OPTION_ICON', + iconText: 'ASSET_TXT', + path: isValidCoin ? `/prices/coin/${getAsset}` : '/prices', + isDisplay: true, + searchContent: [ + STRINGS['COINS'], + STRINGS['WALLET_ASSETS_SEARCH_TXT'], + STRINGS['ASSETS'], + STRINGS['CURRENCY'], + STRINGS['MORE_OPTIONS_LABEL.OTHER_FUNCTIONS.CRYPTO'], + STRINGS['MORE_OPTIONS_LABEL.HOT_FUNCTION.ETH'], + STRINGS['MORE_OPTIONS_LABEL.HOT_FUNCTION.BTC'], + STRINGS['MORE_OPTIONS_LABEL.HOT_FUNCTION.USTD'], + STRINGS['MORE_OPTIONS_LABEL.OTHER_FUNCTIONS.MARKETS'], + STRINGS['MORE_OPTIONS_LABEL.HOT_FUNCTION.MONEY'], + ...assetDetails, + ], + }, + { + icon_id: 'OPTION_2FA_ICON', + iconText: 'ACCOUNT_SECURITY.OTP.TITLE', + path: '/security?2fa', + isDisplay: true, + searchContent: [ + STRINGS['MORE_OPTIONS_LABEL.OTHER_FUNCTIONS.TWO_FACTOR_AUTHENTICATION'], + STRINGS['MORE_OPTIONS_LABEL.OTHER_FUNCTIONS.MFA'], + STRINGS['MORE_OPTIONS_LABEL.OTHER_FUNCTIONS.AUTHENTICATOR'], + STRINGS['MORE_OPTIONS_LABEL.OTHER_FUNCTIONS.OTP'], + STRINGS['ACCOUNTS.TAB_SECURITY'], + STRINGS['ACCOUNTS.TAB_VERIFICATION'], + ], + }, + { + icon_id: 'PASSWORD_OPTION_ICON', + iconText: 'ACCOUNT_SECURITY.CHANGE_PASSWORD.TITLE', + path: '/security?password', + isDisplay: true, + searchContent: [ + STRINGS['ACCOUNTS.TAB_SECURITY'], + STRINGS['MORE_OPTIONS_LABEL.OTHER_FUNCTIONS.CREDENTIALS'], + STRINGS['LOGIN_TEXT'], + STRINGS['DEVELOPERS_TOKEN.ACCESS'], + STRINGS['MORE_OPTIONS_LABEL.OTHER_FUNCTIONS.PASSWORD_RESET'], + STRINGS['ACCOUNT_SECURITY.CHANGE_PASSWORD.FORM.BUTTON'], + ], + }, + { + icon_id: 'LOGIN_OPTION_ICON', + iconText: 'MORE_OPTIONS_LABEL.ICONS.LOGINS', + path: '/security', + isDisplay: true, + searchContent: [ + STRINGS['MORE_OPTIONS_LABEL.OTHER_FUNCTIONS.SECURITY'], + STRINGS['MORE_OPTIONS_LABEL.OTHER_FUNCTIONS.SIGN_INS'], + STRINGS['DEVELOPERS_TOKEN.ACCESS'], + STRINGS['LOGINS_HISTORY.TAB'], + STRINGS['MORE_OPTIONS_LABEL.OTHER_FUNCTIONS.ACCOUNT_ACCESS'], + STRINGS['MORE_OPTIONS_LABEL.OTHER_FUNCTIONS.SESSION_HISTORY'], + ], + }, + { + icon_id: 'SESSION_OPTION_ICON', + iconText: 'SESSIONS.TAB', + path: '/security', + isDisplay: true, + searchContent: [ + STRINGS['SESSIONS.CONTENT.TITLE'], + STRINGS['MORE_OPTIONS_LABEL.OTHER_FUNCTIONS.LOGGED_IN'], + STRINGS['MORE_OPTIONS_LABEL.OTHER_FUNCTIONS.SESSION_MANAGEMENT'], + STRINGS['MORE_OPTIONS_LABEL.OTHER_FUNCTIONS.CURRENT_SESSIONS'], + STRINGS['LOGOUT'], + STRINGS['MORE_OPTIONS_LABEL.OTHER_FUNCTIONS.SECURITY'], + ], + }, + { + icon_id: 'BANK_OPTION_ICON', + iconText: 'USER_VERIFICATION.TITLE_BANK', + path: '/verification', + isDisplay: true, + searchContent: [ + STRINGS['MORE_OPTIONS_LABEL.OTHER_FUNCTIONS.BANKING_DETAILS'], + STRINGS['MORE_OPTIONS_LABEL.OTHER_FUNCTIONS.BANK_ACCOUNT'], + STRINGS['MORE_OPTIONS_LABEL.OTHER_FUNCTIONS.FINANCIAL_INSTITUTION'], + STRINGS['MORE_OPTIONS_LABEL.OTHER_FUNCTIONS.BANK_INFO'], + STRINGS['MORE_OPTIONS_LABEL.OTHER_FUNCTIONS.WITHDRAWAL_ACCOUNT'], + STRINGS['MORE_OPTIONS_LABEL.OTHER_FUNCTIONS.FUND'], + STRINGS['WALLET_BUTTON_BASE_DEPOSIT'], + STRINGS['WALLET_BUTTON_BASE_WITHDRAW'], + STRINGS['MORE_OPTIONS_LABEL.OTHER_FUNCTIONS.KYC'], + STRINGS['ACCOUNTS.TAB_VERIFICATION'], + ], + }, + { + icon_id: 'AUDIO_OPTION_ICON', + iconText: 'MORE_OPTIONS_LABEL.ICONS.AUDIO', + path: '/settings?audioCue', + isDisplay: true, + searchContent: [ + STRINGS['MORE_OPTIONS_LABEL.OTHER_FUNCTIONS.SOUND'], + STRINGS['MORE_OPTIONS_LABEL.OTHER_FUNCTIONS.AUDIO_SETTINGS'], + STRINGS['MORE_OPTIONS_LABEL.OTHER_FUNCTIONS.ALERTS'], + STRINGS['MORE_OPTIONS_LABEL.OTHER_FUNCTIONS.NOTIFICATIONS'], + STRINGS['MORE_OPTIONS_LABEL.OTHER_FUNCTIONS.AUDIO_ALERTS'], + STRINGS['MORE_OPTIONS_LABEL.OTHER_FUNCTIONS.SETTINGS'], + ], + }, + { + icon_id: 'ADDRESS_OPTION_ICON', + iconText: 'ADDRESS_BOOK.ADDRESSES', + path: '/wallet/address-book', + isDisplay: true, + searchContent: [ + STRINGS['MORE_OPTIONS_LABEL.OTHER_FUNCTIONS.WITHDRAWAL_ADDRESSES'], + STRINGS['MORE_OPTIONS_LABEL.OTHER_FUNCTIONS.CRYPTO_ADDRESSES'], + STRINGS['MORE_OPTIONS_LABEL.OTHER_FUNCTIONS.WALLET_ADDRESSES'], + STRINGS['MORE_OPTIONS_LABEL.OTHER_FUNCTIONS.SAVED_ADDRESSES'], + STRINGS['MORE_OPTIONS_LABEL.OTHER_FUNCTIONS.ADDRESS_BOOK'], + STRINGS['MORE_OPTIONS_LABEL.OTHER_FUNCTIONS.WHITE_LISTED'], + STRINGS['MORE_OPTIONS_LABEL.OTHER_FUNCTIONS.MY'], + ], + }, + { + icon_id: 'INTERFACE_OPTION_ICON', + iconText: 'USER_SETTINGS.TITLE_INTERFACE', + path: '/settings?interface', + isDisplay: true, + searchContent: [ + STRINGS['MORE_OPTIONS_LABEL.OTHER_FUNCTIONS.UI'], + STRINGS['MORE_OPTIONS_LABEL.OTHER_FUNCTIONS.USER_INTERFACE'], + STRINGS['MORE_OPTIONS_LABEL.OTHER_FUNCTIONS.LAYOUT'], + STRINGS['MORE_OPTIONS_LABEL.OTHER_FUNCTIONS.DESIGN'], + STRINGS['MORE_OPTIONS_LABEL.OTHER_FUNCTIONS.DASHBOARD'], + STRINGS['MORE_OPTIONS_LABEL.OTHER_FUNCTIONS.COLOR_THEME'], + STRINGS['MORE_OPTIONS_LABEL.OTHER_FUNCTIONS.ORDER_BOOK'], + STRINGS['MORE_OPTIONS_LABEL.OTHER_FUNCTIONS.DARK'], + STRINGS['MORE_OPTIONS_LABEL.OTHER_FUNCTIONS.LIGHT'], + STRINGS['MORE_OPTIONS_LABEL.OTHER_FUNCTIONS.SETTINGS'], + ], + }, + { + icon_id: 'NOTIFICATION_OPTION_ICON', + iconText: 'USER_SETTINGS.TITLE_NOTIFICATION', + path: '/settings?signals', + isDisplay: true, + searchContent: [ + STRINGS['MORE_OPTIONS_LABEL.OTHER_FUNCTIONS.ALERT'], + STRINGS['MORE_OPTIONS_LABEL.OTHER_FUNCTIONS.UPDATES'], + STRINGS['MORE_OPTIONS_LABEL.OTHER_FUNCTIONS.REMINDERS'], + STRINGS['MORE_OPTIONS_LABEL.OTHER_FUNCTIONS.NOTIFICATIONS'], + STRINGS['TRADE_TAB_POSTS'], + STRINGS['MORE_OPTIONS_LABEL.OTHER_FUNCTIONS.SETTINGS'], + ], + }, + { + icon_id: 'HISTORY_OPTION_ICON', + iconText: 'USER_SETTINGS.TITLE_CHAT', + path: '/settings?account', + isDisplay: true, + searchContent: [ + STRINGS['MORE_OPTIONS_LABEL.OTHER_FUNCTIONS.MESSAGE'], + STRINGS['MORE_OPTIONS_LABEL.OTHER_FUNCTIONS.LIVE_CHAT'], + STRINGS['MORE_OPTIONS_LABEL.OTHER_FUNCTIONS.SETTINGS'], + ], + }, + { + icon_id: 'HELP_OPTION_ICON', + iconText: 'LOGIN.HELP', + path: '/more', + isDisplay: true, + searchContent: [ + STRINGS['MORE_OPTIONS_LABEL.OTHER_FUNCTIONS.SUPPORT'], + STRINGS['MORE_OPTIONS_LABEL.OTHER_FUNCTIONS.CONTACT_LOWER'], + STRINGS['MORE_OPTIONS_LABEL.OTHER_FUNCTIONS.EMAIL_LOWER'], + STRINGS['MORE_OPTIONS_LABEL.OTHER_FUNCTIONS.RESOURCE'], + STRINGS['MORE_OPTIONS_LABEL.OTHER_FUNCTIONS.GUIDES'], + STRINGS['MORE_OPTIONS_LABEL.OTHER_FUNCTIONS.FAQ'], + STRINGS['MORE_OPTIONS_LABEL.OTHER_FUNCTIONS.CUSTOMER_SERVICE'], + STRINGS['MORE_OPTIONS_LABEL.OTHER_FUNCTIONS.ASSISTANCE'], + STRINGS['REFER_DOCS_LINK'], + STRINGS['MORE_OPTIONS_LABEL.OTHER_FUNCTIONS.API_LOWER'], + ], + }, + { + icon_id: 'WITHDRAW_OPTION_ICON', + iconText: 'WITHDRAW_PAGE.WITHDRAW', + path: isValidCoin ? `/wallet/${getAsset}/withdraw` : '/wallet/withdraw', + isDisplay: true, + searchContent: [ + STRINGS['MORE_OPTIONS_LABEL.OTHER_FUNCTIONS.PAYOUT'], + STRINGS['MORE_OPTIONS_LABEL.OTHER_FUNCTIONS.CASH_OUT'], + STRINGS['MORE_OPTIONS_LABEL.OTHER_FUNCTIONS.REMOVE_FUNDS'], + STRINGS['MORE_OPTIONS_LABEL.OTHER_FUNCTIONS.OUT'], + STRINGS['SUMMARY.WITHDRAWAL'], + STRINGS['MORE_OPTIONS_LABEL.HOT_FUNCTION.TRANSFER'], + ...assetDetails, + ], + }, + { + icon_id: 'IDENTITY_OPTION_ICON', + iconText: 'USER_VERIFICATION.TITLE_IDENTITY', + path: '/verification?identity', + isDisplay: true, + searchContent: [ + STRINGS['MORE_OPTIONS_LABEL.OTHER_FUNCTIONS.PERSONAL_INFO'], + STRINGS['MORE_OPTIONS_LABEL.OTHER_FUNCTIONS.IDENTITY_CHECK'], + STRINGS['MORE_OPTIONS_LABEL.OTHER_FUNCTIONS.ID'], + STRINGS['MORE_OPTIONS_LABEL.OTHER_FUNCTIONS.KYC_CAPS'], + STRINGS['ACCOUNTS.TAB_VERIFICATION'], + STRINGS['MORE_OPTIONS_LABEL.OTHER_FUNCTIONS.MY'], + ], + }, + { + icon_id: 'PHONE_OPTION_ICON', + iconText: + 'USER_VERIFICATION.USER_DOCUMENTATION_FORM.INFORMATION.TITLE_PHONE', + path: '/verification?phone', + isDisplay: true, + searchContent: [ + STRINGS['MORE_OPTIONS_LABEL.OTHER_FUNCTIONS.CONTACT'], + STRINGS['USER_VERIFICATION.TITLE_MOBILE'], + STRINGS['USER_VERIFICATION.PHONE_VERIFICATION'], + STRINGS[ + 'USER_VERIFICATION.USER_DOCUMENTATION_FORM.FORM_FIELDS.PHONE_NUMBER_LABEL' + ], + STRINGS['MORE_OPTIONS_LABEL.OTHER_FUNCTIONS.SMS'], + STRINGS['MORE_OPTIONS_LABEL.OTHER_FUNCTIONS.KYC'], + STRINGS['ACCOUNTS.TAB_VERIFICATION'], + STRINGS['MORE_OPTIONS_LABEL.OTHER_FUNCTIONS.MY'], + ], + }, + { + icon_id: 'EMAIL_OPTION_ICON', + iconText: 'USER_VERIFICATION.TITLE_EMAIL', + path: '/verification?email', + isDisplay: true, + searchContent: [ + STRINGS['MORE_OPTIONS_LABEL.OTHER_FUNCTIONS.CONTACT'], + STRINGS['MORE_OPTIONS_LABEL.OTHER_FUNCTIONS.EMAIL_ADDRESS'], + STRINGS['MORE_OPTIONS_LABEL.OTHER_FUNCTIONS.MAIL'], + STRINGS['SUMMARY.EMAIL_VERIFICATION'], + STRINGS['MORE_OPTIONS_LABEL.OTHER_FUNCTIONS.EMAIL_CONTACT'], + STRINGS['MORE_OPTIONS_LABEL.OTHER_FUNCTIONS.KYC'], + STRINGS['ACCOUNTS.TAB_VERIFICATION'], + STRINGS['MORE_OPTIONS_LABEL.OTHER_FUNCTIONS.MY'], + ], + }, + { + icon_id: 'REVOKE_SESSION', + iconText: 'ACCOUNTS.TAB_SIGNOUT', + path: `/`, + isDisplay: true, + searchContent: [STRINGS['LOGOUT']], + }, + ]; + + const onHandleRoute = (text, path) => { + browserHistory.push(path); + const actions = { + 'MORE_OPTIONS_LABEL.ICONS.CEFI_STAKE': () => setSelectedStake('cefi'), + 'MORE_OPTIONS_LABEL.ICONS.DEFI_STAKE': () => setSelectedStake('defi'), + 'ACCOUNTS.TAB_SIGNOUT': () => removeToken(), + FEES: () => setLimitTab(0), + 'MORE_OPTIONS_LABEL.ICONS.LIMITS': () => setLimitTab(2), + 'ACCOUNT_SECURITY.CHANGE_PASSWORD.TITLE': () => setSecurityTab(1), + 'MORE_OPTIONS_LABEL.ICONS.API': () => setSecurityTab(2), + 'MORE_OPTIONS_LABEL.ICONS.LOGINS': () => setSecurityTab(4), + 'SESSIONS.TAB': () => setSecurityTab(3), + 'USER_VERIFICATION.TITLE_BANK': () => setVerificationTab(3), + 'LOGIN.HELP': () => setIsDialogOpen(true), + 'MORE_OPTIONS_LABEL.ICONS.AUDIO': () => setSettingsTab(3), + 'USER_SETTINGS.TITLE_LANGUAGE': () => setSettingsTab(2), + 'USER_SETTINGS.TITLE_INTERFACE': () => setSettingsTab(1), + 'USER_SETTINGS.TITLE_NOTIFICATION': () => setSettingsTab(0), + 'USER_SETTINGS.TITLE_CHAT': () => setSettingsTab(4), + }; + + const action = actions[text]; + if (action) action(); + }; + + const onHandleSearch = (e) => { + setSearch(e.target.value); + }; + + const filterOptions = (options) => { + return options?.filter((option) => { + const iconTextMatch = (STRINGS[option?.iconText] || '') + ?.toLowerCase() + .includes(search?.toLowerCase()); + const searchContentMatch = option?.searchContent?.some((content) => + content?.toLowerCase()?.includes(search?.toLowerCase()) + ); + return iconTextMatch || searchContentMatch; + }); + }; + + const renderOptions = (filteredOption, title) => { + return ( +
+ {title?.toUpperCase()} + {filteredOption.length > 0 ? ( +
+ {filteredOption?.map( + (data, inx) => + data.isDisplay && ( +
onHandleRoute(data?.iconText, data?.path)} + > + {fieldHasCoinIcon?.includes(data?.iconText) ? ( +
+ + + + +
+ ) : ( + + )} +
+ + {STRINGS[data?.iconText]} + +
+
+ ) + )} +
+ ) : ( +
+ + + {STRINGS['MORE_OPTIONS_LABEL.NO_RESULT_DESC_1']} + + + + + {STRINGS['MORE_OPTIONS_LABEL.NO_RESULT_DESC_2']} + + +
+ )} +
+ ); + }; + + const filteredHotFunctionOptions = filterOptions(hotFunctionOptions); + const filteredOtherFunctionOptions = filterOptions(otherFunctionOptions); + + const renderHelpDialog = () => { + return ( + setIsDialogOpen(false)} + > + setIsDialogOpen(false)} + onClose={() => setIsDialogOpen(false)} + /> + + ); + }; + + const onHandleConnection = () => { + if (hasResponseData) { + setIsDisplayPopup((prev) => ({ + ...prev, + isDisplayConnection: true, + })); + fetchHealthData(); + } else { + setIsDisplayPopup((prev) => ({ + ...prev, + isDisplayReconnect: true, + })); + } + }; + + const onHandleClose = (value) => { + if (value === 'connection') { + setIsDisplayPopup((prev) => ({ + ...prev, + isDisplayConnection: false, + })); + } else { + setIsDisplayPopup((prev) => ({ + ...prev, + isDisplayReconnect: false, + })); + } + setPingDetails((prev) => ({ + ...prev, + isDisplayPing: false, + isDisplayPingText: true, + })); + }; + + return ( +
+ {isDialogOpen && renderHelpDialog()} + onHandleSearch(e)} + /> +
+ {renderOptions( + filteredHotFunctionOptions, + STRINGS['MORE_OPTIONS_LABEL.HOT_FUNCTION.HOT_FUNCTION_LABEL'] + )} + {renderOptions( + filteredOtherFunctionOptions, + STRINGS['MORE_OPTIONS_LABEL.OTHER_FUNCTIONS.OTHER_FUNCTIONS_LABEL'] + )} +
+
+ + + + onHandleConnection()} + > + {`(${STRINGS['CONNECTIONS.CONNECTION_LABEL']})`} + + + +
+ {isDisplayPopup?.isDisplayConnection && ( + + )} + {isDisplayPopup?.isDisplayReconnect && ( + + )} +
+ ); +}; + +const mapStateToProps = (store) => ({ + features: store.app.features, + coins: store.app.coins, + pinnedAsset: store.app.pinned_assets, + getMarkets: MarketsSelector(store), + quickTrade: store.app.quicktrade, +}); + +const mapDispatchToProps = (dispatch) => ({ + setSelectedStake: bindActionCreators(setStake, dispatch), + setLimitTab: bindActionCreators(setLimitTab, dispatch), + setSecurityTab: bindActionCreators(setSecurityTab, dispatch), + setVerificationTab: bindActionCreators(setVerificationTab, dispatch), + setSettingsTab: bindActionCreators(setSettingsTab, dispatch), +}); + +export default connect( + mapStateToProps, + mapDispatchToProps +)(withConfig(MobileBarMoreOptions)); diff --git a/web/src/containers/App/Socket.js b/web/src/containers/App/Socket.js index 1b274dda67..abf004a300 100644 --- a/web/src/containers/App/Socket.js +++ b/web/src/containers/App/Socket.js @@ -1,12 +1,20 @@ import React, { Component } from 'react'; import { connect } from 'react-redux'; import { bindActionCreators } from 'redux'; -import debounce from 'lodash.debounce'; -import { WS_URL, SESSION_TIME, BASE_CURRENCY } from 'config/constants'; import { isMobile } from 'react-device-detect'; -import { setWsHeartbeat } from 'ws-heartbeat/client'; +import { notification } from 'antd'; +import { + BellOutlined, + ExclamationCircleOutlined, + FireFilled, + MailOutlined, +} from '@ant-design/icons'; +import debounce from 'lodash.debounce'; import withConfig from 'components/ConfigProvider/withConfig'; +import STRINGS from 'config/localizedStrings'; +import { WS_URL, SESSION_TIME, BASE_CURRENCY } from 'config/constants'; +import { setWsHeartbeat } from 'ws-heartbeat/client'; import { getMe, setMe, @@ -47,8 +55,6 @@ import { playBackgroundAudioNotification } from 'utils/utils'; import { getToken, isLoggedIn } from 'utils/token'; import { NORMAL_CLOSURE_CODE, isIntentionalClosure } from 'utils/webSocket'; import { ERROR_TOKEN_EXPIRED } from 'components/Notification/Logout'; -import { notification } from 'antd'; -import STRINGS from 'config/localizedStrings'; class Container extends Component { constructor(props) { @@ -63,6 +69,7 @@ class Container extends Component { }; this.orderCache = {}; this.wsInterval = null; + this.openNotifications = []; } limitTimeOut = null; @@ -144,6 +151,15 @@ class Container extends Component { const params = new URLSearchParams(window.location.search); let userData = { ...data }; if (data.settings) { + if ( + data.settings.interface && + data.settings.interface.display_currency + ) { + localStorage.setItem( + 'base_currnecy', + data.settings.interface.display_currency + ); + } if ( !data.settings.language && !this.props.activeLanguage && @@ -430,31 +446,133 @@ class Container extends Component { } else { this.props.p2pAddMessage(data.data); } - - notification.open({ - message: (data.action = 'getStatus' - ? STRINGS['P2P.STATUS_UPDATE'] - : STRINGS['P2P.NEW_MESSAGE']), - description: ( -
-
{ - window.location.href = `${window.location.origin}/p2p/order/${data.data.id}`; - }} - > - {STRINGS['P2P.CLICK_TO_VIEW']} + if ( + !isMobile + ? !this.props?.router?.location?.pathname?.includes('/p2p/order/') + : !this.props?.isChat + ) { + const key = `notification_${Date.now()}`; + + const notificationDetails = { + key, + message: + data.action === 'getStatus' && data?.data?.status === 'appeal' + ? STRINGS['P2P.APPEAL_STATUS_MESSAGE'] + : data?.action === 'getStatus' && + data?.data?.status === 'cancelled' + ? STRINGS['P2P.CANCEL_STATUS_MESSAGE'] + : data?.action === 'getStatus' && + data?.data?.status === 'confirmed' && + data?.data?.title === 'crypto' + ? STRINGS['P2P.CRYPTO_RELEASE_STATUS_MESSAGE'] + : data?.data?.status === 'confirmed' + ? STRINGS['P2P.CONFIRM_STATUS_MESSAGE'] + : data?.data?.status === 'created' + ? STRINGS['P2P.NEW_ORDER_CREATED'] + : data?.action === 'getStatus' + ? STRINGS['P2P.STATUS_UPDATE'] + : STRINGS['P2P.NEW_MESSAGE'], + description: ( +
+
{ + window.location.href = `${window.location.origin}/p2p/order/${data.data.id}`; + data?.data?.type === 'message' && + localStorage.setItem('isChat', true); + }} + > + {STRINGS['P2P.CLICK_TO_VIEW']} +
-
- ), + ), + className: isMobile + ? 'p2p-chat-notification-wrapper p2p-chat-notification-wrapper-mobile' + : 'p2p-chat-notification-wrapper', + placement: isMobile ? 'bottomLeft' : 'bottomRight', + type: 'info', + duration: 0, + icon: , + onClose: () => { + this.openNotifications = this.openNotifications?.filter( + (notification) => notification?.key !== key + ); + + if ( + this.openNotifications?.length > 0 && + this.openNotifications[this.openNotifications?.length - 1] + ?.key !== key + ) { + const newLastNotification = this.openNotifications[ + this.openNotifications?.length - 1 + ]; + + const newLastNotificationMessage = + newLastNotification?.message; + notification.close(newLastNotification?.key); + notification.open({ + ...newLastNotification, + icon: + newLastNotificationMessage === + (STRINGS['P2P.CANCEL_STATUS_MESSAGE'] || + STRINGS['P2P.APPEAL_STATUS_MESSAGE']) ? ( + + ) : newLastNotificationMessage === + STRINGS['P2P.NEW_MESSAGE'] ? ( + + ) : ( + + ), + className: isMobile + ? 'p2p-chat-notification-wrapper p2p-chat-notification-wrapper-mobile' + : 'p2p-chat-notification-wrapper', + }); + } + }, + }; + + this.openNotifications = [ + ...this.openNotifications, + notificationDetails, + ]; + + if (this.openNotifications?.length > 1) { + const previousNotification = this.openNotifications[ + this.openNotifications?.length - 2 + ]; + const previousMessage = previousNotification?.message; + notification.close(previousNotification?.key); + notification.open({ + ...previousNotification, + icon: + previousMessage === + (STRINGS['P2P.CANCEL_STATUS_MESSAGE'] || + STRINGS['P2P.APPEAL_STATUS_MESSAGE']) ? ( + + ) : previousMessage === STRINGS['P2P.NEW_MESSAGE'] ? ( + + ) : ( + + ), + className: isMobile + ? 'p2p-chat-notification-wrapper p2p-chat-notification-wrapper-mobile p2p-chat-notification' + : 'p2p-chat-notification-wrapper p2p-chat-notification', + }); + } + + notification.open(notificationDetails); + + if (this.openNotifications?.length > 3) { + const oldestNotification = this.openNotifications?.shift(); + notification.close(oldestNotification?.key); + } + } - placement: 'bottomRight', - type: 'info', - }); break; default: break; @@ -727,6 +845,7 @@ const mapStateToProps = (store) => ({ info: store.app.info, token: store.auth.token, verifyToken: store.auth.verifyToken, + isChat: store.app.isChat, }); const mapDispatchToProps = (dispatch) => ({ diff --git a/web/src/containers/App/_App.scss b/web/src/containers/App/_App.scss index a4cc139787..60f2a120cf 100644 --- a/web/src/containers/App/_App.scss +++ b/web/src/containers/App/_App.scss @@ -61,6 +61,7 @@ $inner_container-border: 1px solid $colors-super-pale-black; width: 100%; height: auto; position: relative; + background-color: var(--base_background); .presentation_container { width: $app-content-display-width; height: inherit; @@ -340,3 +341,151 @@ $inner_container-border: 1px solid $colors-super-pale-black; .background-color-layer { box-shadow: inset 0 0 0 1000px $app-background-overlay; } + +.p2p-chat-notification-wrapper-mobile { + .ant-notification-notice-message, + .ant-notification-notice-description { + font-size: 11px !important; + } +} + +.p2p-chat-notification-wrapper { + background-color: $app-light-background; + border-top: 2px solid $colors-notifications-blue; + box-shadow: 4px 4px 15px $app-bar-background-color; + padding: 10px 10px !important; + width: 100%; + + .ant-notification-notice-description, + .ant-notification-notice-message, + .ant-notification-notice-content, + .ant-notification-notice-close { + color: $colors-main-black !important; + } + .ant-notification-notice-message, + .ant-notification-notice-description { + margin-left: 40px; + font-size: 13px; + } + .ant-notification-notice-close { + top: 10px; + right: 12px; + } + .p2p-fire-icon { + svg { + path { + fill: var(--specials_pending-waiting-caution); + } + } + } +} + +.ant-notification-bottomLeft { + margin-left: 0px !important; + width: 100% !important; + max-width: unset !important; +} + +.layout-mobile { + .footer-bar-more-options-container { + display: flex; + flex-direction: column; + background-color: $app-sidebar-background; + + .field-wrapper { + flex-direction: column; + align-items: center !important; + margin: unset !important; + background-color: $app-sidebar-background; + padding: 2%; + + .search-field, + .input_icon { + width: 100%; + color: $colors-main-black !important; + } + + .input_icon { + width: 2rem !important; + } + + .field-content-outline:after, + .field-content-outline:before { + background-color: transparent !important; + } + + .field-error-content { + display: none; + } + } + + .field-wrapper > div:nth-child(1) { + width: 90%; + background-color: $app-background-color; + padding: 1%; + border: 1px solid $colors-main-black; + border-radius: 5px; + } + + .custom-connection-circle, + .custom-connection-error-circle { + height: 15px; + width: 15px; + border-radius: 12px; + background-color: var(--specials_checks-okay-done); + } + .custom-connection-error-circle { + background-color: var( + --specials_notifications-alerts-warnings + ) !important; + } + + .options-container { + padding: 4%; + font-size: 14px; + + .hot-options-container { + height: max-content; + + .hot-function-title { + font-size: 18px; + } + + .options-field { + display: grid; + grid-template-columns: repeat(4, 1fr); + gap: 15px; + padding: 5% 2%; + + .icon-logo { + width: 25px; + path { + fill: $colors-main-black; + } + } + .image-wrapper { + margin-left: 15%; + } + .icon-field { + padding: 5%; + text-align: center; + .assets-icon { + position: relative; + bottom: 10px; + margin-left: 5%; + } + } + + .option-title { + .edit-wrapper__container { + font-size: 12px; + } + } + } + .secondary-text { + font-size: 12px; + } + } + } + } +} diff --git a/web/src/containers/App/selector.js b/web/src/containers/App/selector.js index 83968c1960..8a6a47efbe 100644 --- a/web/src/containers/App/selector.js +++ b/web/src/containers/App/selector.js @@ -72,29 +72,31 @@ export const menuItemsSelector = createSelector( } ); + const getRemoteMenuPath = remoteRoutes[0]?.path; + const otherTab = MENU_ITEMS?.others?.map((data) => { + if (data?.id === 'others') { + return { + ...data, + path: getRemoteMenuPath ? getRemoteMenuPath : '/summary', + }; + } + return data; + }); + const menuItems = isMobile - ? remoteRoutes && remoteRoutes.length - ? [ - ...MENU_ITEMS.top, - ...featureItems, - MENU_ITEMS.middle[0], - remoteRoutes[0], - ...(token ? MENU_ITEMS.bottom : []), - ] - : [ - ...MENU_ITEMS.top, - ...featureItems, - ...MENU_ITEMS.middle, - ...(token ? MENU_ITEMS.bottom : []), - ] + ? [ + ...MENU_ITEMS.top, + ...featureItems, + ...MENU_ITEMS.middle, + ...(token ? MENU_ITEMS.bottom : []), + ] : [ ...MENU_ITEMS.top, ...MENU_ITEMS.middle, ...featureItems, - ...remoteRoutes, + ...otherTab, ...(token ? MENU_ITEMS.bottom : []), ]; - return menuItems; } ); diff --git a/web/src/containers/CoinPage/_CoinPage.scss b/web/src/containers/CoinPage/_CoinPage.scss index 962d5fd9d9..56f0ece17d 100644 --- a/web/src/containers/CoinPage/_CoinPage.scss +++ b/web/src/containers/CoinPage/_CoinPage.scss @@ -43,6 +43,11 @@ width: 65%; height: 100%; + .asset-icon { + position: relative; + top: 5px; + } + .link { color: $colors-notifications-blue; text-decoration: underline; diff --git a/web/src/containers/CoinPage/index.js b/web/src/containers/CoinPage/index.js index 6b5caa65b0..ce2e597caf 100644 --- a/web/src/containers/CoinPage/index.js +++ b/web/src/containers/CoinPage/index.js @@ -2,6 +2,7 @@ import React, { useEffect, useState, Fragment } from 'react'; import { Link } from 'react-router'; import { connect } from 'react-redux'; import { bindActionCreators } from 'redux'; +import { isMobile } from 'react-device-detect'; import classnames from 'classnames'; import { quicktradePairSelector } from 'containers/QuickTrade/components/utils'; @@ -136,8 +137,8 @@ const CoinPage = ({ return (
-
-
+
+
diff --git a/web/src/containers/Deposit/Deposit.js b/web/src/containers/Deposit/Deposit.js index d6cb04537e..872c371eab 100644 --- a/web/src/containers/Deposit/Deposit.js +++ b/web/src/containers/Deposit/Deposit.js @@ -27,6 +27,7 @@ import { } from 'containers/Withdraw/utils'; import STRINGS from 'config/localizedStrings'; import { onHandleSymbol } from './utils'; +import { handlePopupContainer } from 'utils/utils'; const DepositComponent = ({ coins, @@ -91,6 +92,8 @@ const DepositComponent = ({ const currentCurrency = getDepositCurrency ? getDepositCurrency : currency; const min = coins[currentCurrency]; const isDeposit = coins[getDepositCurrency]?.allow_deposit; + const networkHasTag = ['xrp', 'xlm', 'ton']; + const hasTag = ['xrp', 'xlm', 'ton', 'pmn']; useEffect(() => { const topWallet = assets @@ -106,13 +109,20 @@ const DepositComponent = ({ setTopAssets(topWallet); } if (defaultCurrency) { - if (['xrp', 'xlm', 'ton'].includes(defaultCurrency)) { - setCurrStep({ - ...currStep, - stepTwo: true, - stepThree: true, - stepFour: true, - }); + if (networkHasTag.includes(defaultCurrency)) { + coinLength?.length === 1 + ? setCurrStep({ + ...currStep, + stepTwo: true, + stepThree: true, + stepFour: true, + }) + : setCurrStep({ + ...currStep, + stepTwo: true, + stepThree: false, + stepFour: false, + }); } else { setCurrStep({ ...currStep, stepTwo: true }); } @@ -152,10 +162,7 @@ const DepositComponent = ({ useEffect(() => { if (selectedAsset) { - if ( - ['xrp', 'xlm', 'ton', 'pmn'].includes(defaultCurrency) || - ['xrp', 'xlm', 'ton', 'pmn'].includes(defaultNetwork) - ) { + if (hasTag.includes(defaultCurrency) || hasTag.includes(defaultNetwork)) { setIsVisible(true); } } @@ -168,7 +175,7 @@ const DepositComponent = ({ } if (val) { if (currStep.stepTwo || currStep.stepThree || currStep.stepFour) { - if (['xrp', 'xlm', 'ton'].includes(val)) { + if (networkHasTag.includes(val)) { setCurrStep((prev) => ({ ...prev, stepTwo: true, @@ -225,6 +232,12 @@ const DepositComponent = ({ const onHandleChangeNetwork = (val) => { if (val) { + if ( + coinLength?.length > 1 && + networkHasTag.includes(renderNetworkField(val)) + ) { + setIsVisible(true); + } setCurrStep((prev) => ({ ...prev, stepThree: true })); setDepositNetworkOptions(val); updateAddress(renderNetworkField(val), true); @@ -281,10 +294,10 @@ const DepositComponent = ({ const onHandleSelect = (symbol) => { const curr = onHandleSymbol(symbol); - if (curr !== symbol && ['xrp', 'xlm', 'ton'].includes(curr)) { + if (curr !== symbol && networkHasTag.includes(curr)) { if ( - ['xrp', 'xlm', 'ton'].includes(defaultCurrency) || - ['xrp', 'xlm', 'ton'].includes(defaultNetwork) + networkHasTag.includes(defaultCurrency) || + networkHasTag.includes(defaultNetwork) ) { setIsVisible(true); } else { @@ -319,7 +332,14 @@ const DepositComponent = ({ const renderOptionalField = (['xrp', 'xlm'].includes(selectedAsset) || - ['xlm', 'ton'].includes(network)) && + ['xlm', 'ton'].includes( + coinLength && + coinLength.length > 1 && + getDepositNetworkOptions && + getDepositNetworkOptions + ? renderNetworkField(networkData) + : network + )) && depositAddress; const networkIcon = selectedNetwork ? coins[selectedNetwork]?.icon_id @@ -340,6 +360,7 @@ const DepositComponent = ({ onCancel={() => setIsVisible(false)} footer={false} className="withdrawal-remove-tag-modal" + closeIcon={} width={'420px'} > {renderDepositWarningPopup()} @@ -412,6 +433,7 @@ const DepositComponent = ({ } }} onSelect={(e) => onHandleSelect(e)} + getPopupContainer={handlePopupContainer} > {Object.entries(coins).map( ([_, { symbol, fullname, icon_id }]) => ( @@ -515,6 +537,7 @@ const DepositComponent = ({ } placeholder={STRINGS['WITHDRAW_PAGE.SELECT']} onClear={() => onHandleClear('network')} + getPopupContainer={handlePopupContainer} > {coinLength && coinLength?.length === 1 && @@ -656,12 +679,12 @@ const DepositComponent = ({
*:first-child { + @include size-important(20rem-1rem); + } + } + } + .qr-title { + font-size: 2rem; + } + .blue-link { + font-size: 1.4rem !important; + } + .qr-text { + max-width: 30rem; + padding: 1.5rem 0 5rem 0; + .edit-wrapper__container { + font-size: 1.5rem; + } + } + } + .withdrawal-container { .withdraw-form-wrapper { .withdraw-form { diff --git a/web/src/containers/DigitalAssets/components/AssetsCards.js b/web/src/containers/DigitalAssets/components/AssetsCards.js new file mode 100644 index 0000000000..56bb76f0a5 --- /dev/null +++ b/web/src/containers/DigitalAssets/components/AssetsCards.js @@ -0,0 +1,355 @@ +import React, { useEffect, useMemo, useState } from 'react'; +import { connect } from 'react-redux'; +import { isMobile } from 'react-device-detect'; +import { browserHistory } from 'react-router'; +import { Card, Switch } from 'antd'; +import { + CaretDownOutlined, + CaretUpOutlined, + RightOutlined, +} from '@ant-design/icons'; + +import strings from 'config/localizedStrings'; +import withConfig from 'components/ConfigProvider/withConfig'; +import icons from 'config/icons/dark'; +import { Coin, EditWrapper, IconTitle } from 'components'; +import { quicktradePairSelector } from 'containers/QuickTrade/components/utils'; +import { Loading } from './utils'; + +const cardTypes = ['gainers', 'losers', 'newAssets']; +const cardTitles = [ + 'DIGITAL_ASSETS.CARDS.GAINERS', + 'DIGITAL_ASSETS.CARDS.LOSERS', + 'DEPOSIT_STATUS.NEW', +]; + +const sortCoinsData = (coinsData) => ({ + gainers: coinsData + .slice() + .sort( + (a, b) => + b.oneDayPriceDifferencePercenVal - a.oneDayPriceDifferencePercenVal + ) + .slice(0, 3), + losers: coinsData + .slice() + .sort( + (a, b) => + a.oneDayPriceDifferencePercenVal - b.oneDayPriceDifferencePercenVal + ) + .slice(0, 3), + newAssets: coinsData + .slice() + .sort((a, b) => new Date(b.created_at) - new Date(a.created_at)) + .slice(0, 3), +}); + +const renderPercentage = (percentage, type) => ( + = 0 + ? 'gainer-percentage' + : 'loser-percentage') + } + > + {percentage && + (type === 'gainers' || percentage >= 0 ? ( + + ) : ( + + ))} + {percentage ? (percentage >= 0 ? `+${percentage}` : percentage) : '0%'} + +); + +const TYPES = { + PRO: 'pro', + BROKER: 'broker', + NETWORK: 'network', +}; + +const goToCoinInfo = (symbol, features, quicktradePairs) => { + const currentQuicktradePair = Object.keys(quicktradePairs)?.find((pair) => + pair?.split('-')?.includes(symbol) + ); + + const isBroker = + currentQuicktradePair && + [TYPES.NETWORK, TYPES.BROKER]?.includes( + quicktradePairs[currentQuicktradePair]?.type + ); + if (currentQuicktradePair) { + const path = isBroker + ? features?.quick_trade + ? `/quick-trade/${currentQuicktradePair}` + : `/prices/coin/${symbol}` + : features?.pro_trade + ? `/trade/${currentQuicktradePair}` + : `/prices/coin/${symbol}`; + + browserHistory.push(path); + } else { + browserHistory.push(`/prices/coin/${symbol}`); + } +}; + +const renderCards = (data, coins, type, loading, features, quicktradePairs) => + data.map( + ( + { + symbol, + lastPrice, + oneDayPriceDifferencePercent, + oneDayPriceDifferencePercenVal, + }, + index + ) => + loading ? ( + + ) : ( +
goToCoinInfo(symbol, features, quicktradePairs)} + > +
+ +
+ + {coins[symbol].fullname} + + {symbol.toUpperCase()} +
+
+
+
+ + {lastPrice ? `$${lastPrice}` : '-'} + + {renderPercentage( + type === 'newAssets' + ? oneDayPriceDifferencePercenVal + : oneDayPriceDifferencePercent, + type + )} +
+
+ +
+
+
+ ) + ); + +const AssetsCards = ({ + coins, + coinsData, + loading, + features, + quicktradePairs, +}) => { + const [currentIndex, setCurrentIndex] = useState(0); + const [isVisible, setIsVisible] = useState(true); + const [swipe, setSwipe] = useState(0); + + const sortedCoinsData = useMemo(() => sortCoinsData(coinsData), [coinsData]); + + const handleNavigation = (direction) => { + setCurrentIndex( + (prevIndex) => + (prevIndex + (direction === 'left' ? -1 : 1) + cardTypes?.length) % + cardTypes?.length + ); + }; + + const handleTouchStart = (e) => { + setSwipe(e.touches[0]?.clientX); + }; + + const handleTouchMove = (e) => { + const touchEndX = e.touches[0]?.clientX; + const diffX = touchEndX - swipe; + + if (Math.abs(diffX) > 50) { + if (diffX > 0) { + handleNavigation('left'); + } else { + handleNavigation('right'); + } + } + }; + + useEffect(() => { + const interval = setInterval(() => { + handleNavigation('right'); + }, 4000); + + return () => clearInterval(interval); + }, []); + + return ( + <> + {!isMobile && ( +
+
+ + {strings['DIGITAL_ASSETS.HIGHLIGHTS']} + +
+ setIsVisible(!isVisible)} + className={isVisible ? 'toggle-active' : 'toggle-inactive'} + /> +
+ )} + {isVisible && + (isMobile ? ( +
+
+
handleNavigation('left')} + /> + + } + className={`digital-assets-cards ${ + cardTypes[currentIndex] === 'gainers' + ? 'gainer-asset-card' + : cardTypes[currentIndex] === 'losers' + ? 'losers-asset-card' + : 'new-asset-card' + }`} + > + {renderCards( + sortedCoinsData[cardTypes[currentIndex]], + coins, + cardTypes[currentIndex], + loading, + features, + quicktradePairs + )} + +
handleNavigation('right')} + /> +
+
+ {cardTypes.map((_, i) => ( +
+ ))} +
+
+ ) : ( +
+ {cardTypes.map((type, index) => ( + setCurrentIndex(index)} + key={index} + size="small" + title={ + + } + className={`digital-assets-cards ${ + type === 'gainers' + ? 'gainer-asset-card' + : type === 'losers' + ? 'losers-asset-card' + : 'new-asset-card' + }`} + > + {renderCards( + sortedCoinsData[type], + coins, + type, + loading, + features, + quicktradePairs + )} + + ))} +
+ ))} + + ); +}; + +const mapStateToProps = (state) => ({ + coins: state.app.coins, + quicktradePairs: quicktradePairSelector(state), + coinsData: state.app.coinsData, + features: state.app.features, +}); + +export default connect(mapStateToProps)(withConfig(AssetsCards)); diff --git a/web/src/containers/DigitalAssets/components/AssetsList.js b/web/src/containers/DigitalAssets/components/AssetsList.js index 6f273e7763..a8de876ef9 100644 --- a/web/src/containers/DigitalAssets/components/AssetsList.js +++ b/web/src/containers/DigitalAssets/components/AssetsList.js @@ -1,6 +1,7 @@ import React, { useState } from 'react'; import { connect } from 'react-redux'; import { bindActionCreators } from 'redux'; +import { isMobile } from 'react-device-detect'; import classnames from 'classnames'; import { CaretUpOutlined, CaretDownOutlined } from '@ant-design/icons'; @@ -33,11 +34,16 @@ const AssetsList = ({ pairs, pinned_assets, icons, + coinsData, + isSelectedSort, + handleSelectedSort, + selectedButton, }) => { const [isOndDaySort, setIsOneDaySort] = useState(false); - let listData = []; + // let listData = []; const handleClickChange = () => { setIsOneDaySort(false); + handleSelectedSort(true); if (mode === SORT.CHANGESEVENDAY) { toggleSort(); } else { @@ -47,6 +53,7 @@ const AssetsList = ({ const handleOneDaySort = () => { setIsOneDaySort(true); + handleSelectedSort(true); if (mode === SORT.CHANGE) { toggleSort(); } else { @@ -72,49 +79,47 @@ const AssetsList = ({
); - const movePinnedItems = (array) => { - const pinnedItems = pinned_assets; - const sortedArray = array.sort((a, b) => { - // Find the first ID that differs between the two objects - const id = pinnedItems.find((i) => a.symbol !== b.symbol); + // const movePinnedItems = (array) => { + // const pinnedItems = pinned_assets; + // const sortedArray = array.sort((a, b) => { + // // Find the first ID that differs between the two objects + // const id = pinnedItems.find((i) => a.symbol !== b.symbol); - if (id) { - // If a has the ID, move it to the top - return a.symbol === id ? -1 : 1; - } + // if (id) { + // // If a has the ID, move it to the top + // return a.symbol === id ? -1 : 1; + // } - return 0; - }); - return sortedArray; - }; + // return 0; + // }); + // return sortedArray; + // }; const getSortedList = () => { - const topAssets = []; - - pinned_assets.forEach((pin) => { - const asset = coinsListData.find(({ symbol }) => symbol === pin); - if (asset) { - topAssets.push(asset); - } - }); - const restAssets = coinsListData.filter( - (item) => !pinned_assets.includes(item.symbol) - ); - const sortedValues = restAssets.sort((a, b) => { - const aVal = parseFloat( - isOndDaySort - ? a.oneDayPriceDifferencePercenVal - : a.priceDifferencePercentVal - ); - const bVal = parseFloat( - isOndDaySort - ? b.oneDayPriceDifferencePercenVal - : b.priceDifferencePercentVal - ); - return is_descending ? bVal - aVal : aVal - bVal; - }); - listData = [...topAssets, ...sortedValues]; - return movePinnedItems(listData); + if (isSelectedSort) { + coinsListData.sort((a, b) => { + const aVal = parseFloat( + isOndDaySort + ? a.oneDayPriceDifferencePercenVal + ? a.oneDayPriceDifferencePercenVal + : 0 + : a.priceDifferencePercentVal + ? a.priceDifferencePercentVal + : 0 + ); + const bVal = parseFloat( + isOndDaySort + ? b.oneDayPriceDifferencePercenVal + ? b.oneDayPriceDifferencePercenVal + : 0 + : b.priceDifferencePercentVal + ? b.priceDifferencePercentVal + : 0 + ); + return is_descending ? bVal - aVal : aVal - bVal; + }); + } + return coinsListData; }; const totalPages = Math.ceil(count / pageSize); @@ -133,50 +138,107 @@ const AssetsList = ({ -
+
{STRINGS['MARKETS_TABLE.ASSET']}
- -
- - {STRINGS['MARKETS_TABLE.TRADING_SYMBOL']} - -
- - -
- - {STRINGS['MARKETS_TABLE.LAST_PRICE']} - -
- - -
- - {STRINGS['MARKETS_TABLE.CHANGE_1D']} - - {renderCaret(SORT.CHANGE, true)} -
- - -
- - {STRINGS['MARKETS_TABLE.CHANGE_7D']} - - {renderCaret(SORT.CHANGESEVENDAY)} -
- - -
- - {STRINGS['MARKETS_TABLE.CHART_7D']} - -
- - + {!isMobile && ( + +
+ + {STRINGS['PRICE']} + +
+ + )} + {!isMobile && ( + +
+ + {STRINGS.formatString( + STRINGS['MARKETS_TABLE.PERCENTAGE'], + STRINGS['MARKETS_TABLE.24H'] + )} + + {renderCaret(SORT.CHANGE, true)} +
+ + )} + {!isMobile && ( + +
+ + {STRINGS.formatString( + STRINGS['MARKETS_TABLE.PERCENTAGE'], + STRINGS['QUICK_TRADE_COMPONENT.7D'] + )} + + {renderCaret(SORT.CHANGESEVENDAY)} +
+ + )} + {isMobile && ( + +
+ + {STRINGS['DIGITAL_ASSETS.PRICE_24H']} + + {renderCaret(SORT.CHANGE, true)} +
+ + )} + {!isMobile && ( + +
+ + {STRINGS['MARKETS_TABLE.TREND_7D']} + +
+ + )} + {isMobile && selectedButton !== 'Market Cap' && ( + +
+ + {STRINGS['MARKETS_TABLE.TREND_7D']} + + {renderCaret(SORT.CHANGESEVENDAY)} +
+ + )} + {!isMobile && ( + +
+ + {STRINGS['DIGITAL_ASSETS.CARDS.MARKET_CAP']} + +
+ + )} + {isMobile && selectedButton === 'Market Cap' && ( + +
+ + {STRINGS['DIGITAL_ASSETS.CARDS.MARKET_CAP']} + +
+ + )} + {STRINGS['TRADE_TAB_TRADE']} @@ -193,12 +255,13 @@ const AssetsList = ({ quicktrade={quicktrade} pairs={pairs} icons={icons} + selectedButton={selectedButton} /> ))}
- {!hideViewMore && ( + {!hideViewMore && coinsListData?.length >= pageSize && (
({ mode, is_descending, - coinsData, + // coinsData, quicktrade, pairs, pinned_assets, + coinsData, }); const mapDispatchToProps = (dispatch) => ({ diff --git a/web/src/containers/DigitalAssets/components/AssetsRow.js b/web/src/containers/DigitalAssets/components/AssetsRow.js index 8fc20dd1c4..09add0c719 100644 --- a/web/src/containers/DigitalAssets/components/AssetsRow.js +++ b/web/src/containers/DigitalAssets/components/AssetsRow.js @@ -1,25 +1,26 @@ import React from 'react'; -import { PriceChange, Coin, ActionNotification } from 'components'; +import { connect } from 'react-redux'; +import { browserHistory } from 'react-router'; +import { isMobile } from 'react-device-detect'; + import TradeInputGroup from 'containers/Wallet/components/TradeInputGroup'; +import STRINGS from 'config/localizedStrings'; +import { PriceChange, Coin, ActionNotification } from 'components'; import { MiniSparkLine } from 'containers/TradeTabs/components/MiniSparkLine'; import { getLastValuesFromParts } from 'utils/array'; -import STRINGS from 'config/localizedStrings'; -import { isMobile } from 'react-device-detect'; -import { browserHistory } from 'react-router'; import { unique } from 'utils/data'; +import { Loading } from './utils'; -const Loading = ({ index }) => { - return ( -
- ); -}; - -const AssetsRow = ({ coinData, loading, index, quicktrade, pairs, icons }) => { +const AssetsRow = ({ + coinData, + loading, + index, + quicktrade, + pairs, + icons, + coins, + selectedButton, +}) => { const { icon_id, symbol, @@ -98,73 +99,209 @@ const AssetsRow = ({ coinData, loading, index, quicktrade, pairs, icons }) => { {!loading ? ( -
browserHistory.push(`/prices/coin/${symbol}`)} - > - -
{fullname}
-
- ) : ( - - )} - - - {!loading ? ( -
{symbol.toUpperCase()}
- ) : ( - - )} - - - {!loading ? ( -
- - {lastPrice} - - {'USDT'} -
- ) : ( - - )} - - - {!loading ? ( - - ) : ( - - )} - - - {!loading ? ( - - ) : ( - - )} - - - {!loading ? ( - + isMobile ? ( +
browserHistory.push(`/prices/coin/${symbol}`)} + > + +
+ {symbol?.toUpperCase()} + {fullname} +
+
+ ) : ( +
browserHistory.push(`/prices/coin/${symbol}`)} + > + +
+ {fullname} + + {symbol?.toUpperCase()} + +
+
+ ) ) : ( )} - + {isMobile && ( + + {!loading ? ( +
+
+ + {lastPrice && '$'} + + + {lastPrice ? lastPrice : '-'} + +
+ {(oneDayPriceDifferencePercent && oneDayPriceDifference) || + oneDayPriceDifference === 0 ? ( + + ) : ( + + 0% + + )} +
+ ) : ( + + )} + + )} + {isMobile && selectedButton !== 'Market Cap' && ( + + {!loading ? ( +
+ {(priceDifference && priceDifferencePercent) || + priceDifference === 0 ? ( + + ) : ( + 0% + )} + {chartData?.price ? ( + + ) : ( + {'- '} + )} +
+ ) : ( + + )} + + )} + {isMobile && selectedButton === 'Market Cap' && ( + + {!loading ? ( +
+ {coins[symbol]?.market_cap ? ( + coins[symbol].market_cap.toLocaleString('en-US', { + style: 'currency', + currency: 'USD', + }) + ) : ( + 0 + )} +
+ ) : ( + + )} + + )} + {!isMobile && ( + + {!loading ? ( +
+ + {lastPrice && '$'} + + + {lastPrice ? lastPrice : '-'} + +
+ ) : ( + + )} + + )} + {!isMobile && ( + + {!loading ? ( + (oneDayPriceDifferencePercent && oneDayPriceDifference) || + oneDayPriceDifference === 0 ? ( + + ) : ( + 0% + ) + ) : ( + + )} + + )} + {!isMobile && ( + + {!loading ? ( + (priceDifference && priceDifferencePercent) || + priceDifference === 0 ? ( + + ) : ( + 0% + ) + ) : ( + + )} + + )} + {!isMobile && ( + + {!loading ? ( + chartData?.price ? ( + + ) : ( + '-' + ) + ) : ( + + )} + + )} + {!isMobile && ( + + {!loading ? ( +
+ {coins[symbol]?.market_cap ? ( + coins[symbol].market_cap.toLocaleString('en-US', { + style: 'currency', + currency: 'USD', + }) + ) : ( + 0 + )} +
+ ) : ( + + )} + + )} + {!loading ? ( markets.length > 1 ? ( { markets={markets} goToTrade={goToTrade} pairs={pairs} + tradeClassName="market-asset-row" + hasTrigger={true} /> ) : ( /, + {STRINGS['SIDES.SELL']} + )} + text={STRINGS.formatString( + STRINGS['MARKETS_TABLE.BUY'], + /, + {STRINGS['SIDES.SELL']} + )} onClick={() => goToTrade(markets[0])} className="csv-action" showActionText={isMobile} disable={markets.length === 0} + tradeClassName={ + markets.length === 0 + ? 'market-asset-row market-asset-row-disable' + : 'market-asset-row' + } /> ) ) : ( @@ -193,4 +343,8 @@ const AssetsRow = ({ coinData, loading, index, quicktrade, pairs, icons }) => { ); }; -export default AssetsRow; +const mapStateToProps = (state) => ({ + coins: state.app.coins, +}); + +export default connect(mapStateToProps)(AssetsRow); diff --git a/web/src/containers/DigitalAssets/components/AssetsWrapper.js b/web/src/containers/DigitalAssets/components/AssetsWrapper.js index e304b1df4b..ef4d74dc05 100644 --- a/web/src/containers/DigitalAssets/components/AssetsWrapper.js +++ b/web/src/containers/DigitalAssets/components/AssetsWrapper.js @@ -1,19 +1,24 @@ import React, { Component } from 'react'; import { connect } from 'react-redux'; +import { bindActionCreators } from 'redux'; +import { reset } from 'redux-form'; import { withRouter } from 'react-router'; import { isMobile } from 'react-device-detect'; +import { CloseOutlined, SearchOutlined } from '@ant-design/icons'; + +import AssetsCards from './AssetsCards'; +import STRINGS from 'config/localizedStrings'; +import withConfig from 'components/ConfigProvider/withConfig'; +import AssetsList from 'containers/DigitalAssets/components/AssetsList'; import { formatPercentage, formatToCurrency, countDecimals, } from 'utils/currency'; import { SearchBox } from 'components'; -import STRINGS from 'config/localizedStrings'; +import { setCoinsData } from 'actions/appActions'; import { quicktradePairSelector } from 'containers/QuickTrade/components/utils'; -import withConfig from 'components/ConfigProvider/withConfig'; import { getMiniCharts } from 'actions/chartAction'; -import AssetsList from 'containers/DigitalAssets/components/AssetsList'; -import { RenderLoading } from './utils'; function onHandleInitialLoading(ms) { return new Promise((resolve) => setTimeout(resolve, ms)); @@ -26,11 +31,15 @@ class AssetsWrapper extends Component { data: [], chartData: {}, coinsData: [], - pageSize: 10, + pageSize: 100, page: 0, count: 0, searchValue: '', isLoading: true, + isSearchActive: false, + selectedButton: !isMobile ? 'Market Cap' : '', + isSelectedSort: false, + isInputFocus: false, }; } @@ -103,10 +112,14 @@ class AssetsWrapper extends Component { }; getCoinsData = (coinsList, chartValues) => { - const { coins, quicktradePairs } = this.props; + const { coins, quicktradePairs, setCoinsData } = this.props; + // const topAssets = []; + // const remainingAssets = []; const coinsData = coinsList .map((name) => { - const { code, icon_id, symbol, fullname, type } = coins[name]; + const { code, icon_id, symbol, fullname, type, created_at } = coins[ + name + ]; const key = `${code}-usdt`; const pricingData = this.getPricingData(chartValues[key]); @@ -121,12 +134,32 @@ class AssetsWrapper extends Component { type, key, networkType: quicktradePairs[key]?.type, + created_at, }; }) - .filter(({ type }) => type === 'blockchain'); - - this.setState({ coinsData }); + ?.filter(({ type }) => type === 'blockchain') + ?.sort( + (a, b) => + (coins[b?.symbol]?.market_cap || 0) - + (coins[a?.symbol]?.market_cap || 0) + ); + // pinned_assets.forEach((pin) => { + // const asset = coinsData.find(({ symbol }) => symbol === pin); + // if (asset) { + // topAssets.push(asset); + // } + // }); + // coinsData.filter((item) => { + // if (!pinned_assets.includes(item.symbol)) { + // remainingAssets.push(item); + // return true; + // } + // return false; + // }); + + this.setState({ coinsData: coinsData }); this.constructData(this.state.page); + setCoinsData(coinsData); }; async componentDidMount() { @@ -142,6 +175,7 @@ class AssetsWrapper extends Component { }); await onHandleInitialLoading(15 * 100); this.setState({ isLoading: false }); + window.addEventListener('keydown', this.handleKeyPress); } componentDidUpdate(prevProps) { @@ -153,6 +187,10 @@ class AssetsWrapper extends Component { } } + componentWillUnmount() { + window.removeEventListener('keydown', this.handleKeyPress); + } + goToPreviousPage = () => { const { page } = this.state; this.constructData(page - 1); @@ -179,7 +217,6 @@ class AssetsWrapper extends Component { const count = coinsData.length; const initItem = page * pageSize; - if (initItem < count) { const data = searchResults.slice(0, initItem + pageSize); this.setState({ data, page, count }); @@ -226,40 +263,241 @@ class AssetsWrapper extends Component { } }; + handleMarket = (value) => { + const { page, searchValue } = this.state; + const { coinsData, coins } = this.props; + + const sortFunctions = { + 'Market Cap': (data) => + data.sort( + (a, b) => + (coins[b?.symbol]?.market_cap || 0) - + (coins[a?.symbol]?.market_cap || 0) + ), + Gainers: (data) => + data + ?.filter( + ({ oneDayPriceDifferencePercenVal }) => + (oneDayPriceDifferencePercenVal || 0) >= 0 + ) + ?.sort( + (a, b) => + (b.oneDayPriceDifferencePercenVal || 0) - + (a.oneDayPriceDifferencePercenVal || 0) + ), + Losers: (data) => + data + ?.filter( + ({ oneDayPriceDifferencePercenVal }) => + (oneDayPriceDifferencePercenVal || 0) <= 0 + ) + ?.sort( + (a, b) => + (a.oneDayPriceDifferencePercenVal || 0) - + (b.oneDayPriceDifferencePercenVal || 0) + ), + New: (data) => + data?.sort((a, b) => new Date(b.created_at) - new Date(a.created_at)), + }; + + const updatedCoinsData = sortFunctions[value] + ? sortFunctions[value](coinsData) + : coinsData; + + this.setState( + { + selectedButton: value, + coinsData: updatedCoinsData, + isSelectedSort: false, + }, + () => { + this.constructData(page, searchValue); + } + ); + }; + + handleClose = () => { + const FORM_NAME = 'SearchForm'; + this.handleTabSearch(''); + this.props.dispatch(reset(FORM_NAME)); + this.setState({ isSearchActive: false, isInputFocus: false }, () => { + const inputElement = document.querySelector( + '.trade_tabs-search-field input' + ); + if (inputElement) { + inputElement.blur(); + } + }); + }; + + handleSelectedSort = (value) => { + this.setState({ isSelectedSort: value }); + }; + + handleInput = () => { + this.setState({ isSearchActive: true, isInputFocus: true }, () => { + const inputElement = document.querySelector( + '.trade_tabs-search-field input' + ); + if (inputElement) { + inputElement.focus(); + } + }); + }; + + handleKeyPress = (event) => { + const { isSearchActive } = this.state; + const key = event.key; + if (!isSearchActive && key === '/') { + event.preventDefault(); + this.handleInput(); + } + if (isSearchActive && key === 'Escape') { + this.handleClose(); + } + }; + render() { const { data, page, pageSize, count, isLoading } = this.state; + const listButton = [ + STRINGS['DIGITAL_ASSETS.CARDS.MARKET_CAP'], + STRINGS['DIGITAL_ASSETS.CARDS.GAINERS'], + STRINGS['DIGITAL_ASSETS.CARDS.LOSERS'], + STRINGS['DEPOSIT_STATUS.NEW'], + ]; return (
- {data.length ? ( -
-
-
- -
+ +
+
+
+
+ {!this.state.isSearchActive && isMobile && ( +
+ {listButton?.map((button, index) => { + return ( +
this.handleMarket(button)} + > + {button} +
+ ); + })} +
+ )} + {!isMobile && ( +
+ {listButton?.map((button, index) => { + return ( +
this.handleMarket(button)} + > + {button} +
+ ); + })} +
+ )} + {!this.state.isSearchActive ? ( + !isMobile ? ( +
this.handleInput()} + > + + this.handleInput()} + > + / + +
+ ) : ( + this.handleInput()} + > + + + ) + ) : !isMobile ? ( +
+ + this.handleClose()} + > + + +
+ ) : ( +
+
+ +
+
this.handleClose()}> + {STRINGS['CLOSE_TEXT']} +
+
+ )}
- pageSize} - />
- ) : ( - - )} + pageSize} + isSelectedSort={this.state.isSelectedSort} + handleSelectedSort={this.handleSelectedSort} + selectedButton={this.state.selectedButton} + /> +
); } @@ -270,6 +508,16 @@ const mapStateToProps = (state, props) => ({ constants: state.app.constants, coins: state.app.coins, quicktradePairs: quicktradePairSelector(state), + coinsData: state.app.coinsData, + pinned_assets: state.app.pinned_assets, +}); + +const mapDispatchToProps = (dispatch) => ({ + setCoinsData: bindActionCreators(setCoinsData, dispatch), + dispatch, }); -export default connect(mapStateToProps)(withRouter(withConfig(AssetsWrapper))); +export default connect( + mapStateToProps, + mapDispatchToProps +)(withRouter(withConfig(AssetsWrapper))); diff --git a/web/src/containers/DigitalAssets/components/utils.js b/web/src/containers/DigitalAssets/components/utils.js index cb45171be1..301c2904e3 100644 --- a/web/src/containers/DigitalAssets/components/utils.js +++ b/web/src/containers/DigitalAssets/components/utils.js @@ -1,13 +1,9 @@ import React from 'react'; -import { Spin } from 'antd'; -import { CaretDownOutlined, CaretUpOutlined } from '@ant-design/icons'; import math from 'mathjs'; -import STRINGS from 'config/localizedStrings'; import { createSelector } from 'reselect'; import { DIGITAL_ASSETS_SORT } from 'actions/appActions'; import { unsortedMarketsSelector, getPairs } from 'containers/Trade/utils'; import { getPinnedAssets } from 'containers/Wallet/utils'; -import { EditWrapper } from 'components'; const getSortMode = (state) => state.app.digital_assets_sort.mode; const getSortDir = (state) => state.app.digital_assets_sort.is_descending; @@ -153,66 +149,94 @@ export const dataSelector = createSelector( } ); -export const RenderLoading = () => { - const renderCaret = () => ( -
- - -
- ); - +export const Loading = ({ index }) => { return ( -
-
-
- - {STRINGS['MARKETS_TABLE.ASSET']} - -
-
- - {STRINGS['MARKETS_TABLE.TRADING_SYMBOL']} - -
-
- - {STRINGS['MARKETS_TABLE.LAST_PRICE']} - -
-
- - {STRINGS['MARKETS_TABLE.CHANGE_1D']} - - {renderCaret()} -
-
- - {STRINGS['MARKETS_TABLE.CHANGE_7D']} - - {renderCaret()} -
-
- - {STRINGS['MARKETS_TABLE.CHART_7D']} - -
-
- - {STRINGS['TRADE_TAB_TRADE']} - -
-
-
- -
- - {STRINGS['DIGITAL_ASSETS.LOADING_PRICES']} - -
-
+
); }; + +// export const RenderLoading = () => { +// const renderCaret = () => ( +//
+// +// +//
+// ); + +// return ( +//
+//
+//
+// +// {STRINGS['MARKETS_TABLE.ASSET']} +// +//
+// {!isMobile &&
+// +// {STRINGS['PRICE']} +// +//
} +// {!isMobile &&
+// +// {STRINGS.formatString( +// STRINGS['MARKETS_TABLE.PERCENTAGE'], +// STRINGS['MARKETS_TABLE.24H'] +// )} +// +// {renderCaret()} +//
} +// {!isMobile &&
+// +// {STRINGS.formatString( +// STRINGS['MARKETS_TABLE.PERCENTAGE'], +// STRINGS['QUICK_TRADE_COMPONENT.7D'] +// )} +// +// {renderCaret()} +//
} +// {isMobile &&
+// +// {STRINGS['DIGITAL_ASSETS.PRICE_24H']} +// +//
} +//
+// +// {STRINGS['MARKETS_TABLE.TREND_7D']} +// +//
+// {!isMobile &&
+// +// {STRINGS['DIGITAL_ASSETS.CARDS.MARKET_CAP']} +// +//
} +//
+// +// {STRINGS['TRADE_TAB_TRADE']} +// +//
+//
+//
+// +//
+// +// {STRINGS['DIGITAL_ASSETS.LOADING_PRICES']} +// +//
+//
+// ); +// }; diff --git a/web/src/containers/DigitalAssets/index.js b/web/src/containers/DigitalAssets/index.js index c94220d2a2..c896ce81cf 100644 --- a/web/src/containers/DigitalAssets/index.js +++ b/web/src/containers/DigitalAssets/index.js @@ -5,66 +5,80 @@ import { isMobile } from 'react-device-detect'; import withConfig from 'components/ConfigProvider/withConfig'; import AssetsWrapper from './components/AssetsWrapper'; -import { EditWrapper, IconTitle } from 'components'; import STRINGS from 'config/localizedStrings'; +import { EditWrapper, IconTitle } from 'components'; const DigitalAssets = ({ pair, icons: ICONS, showQuickTrade }) => { return (
-
-
-
- + {isMobile ? ( +
+
+
+
+ + {STRINGS['DIGITAL_ASSETS.DIGITAL_ASSETS_TITLE']} + +
+
+ + {STRINGS['DIGITAL_ASSETS.MOBILE_DESC']} + +
+
+
-
-
-
- - {STRINGS['DIGITAL_ASSETS.ASSETS_INFO']} - -
-
- - {STRINGS['DIGITAL_ASSETS.ASSETS_INFO_DETAIL']} - + ) : ( +
+
+
+
-
- - - {STRINGS['ACCORDIAN.DEPOSIT']} - - - {showQuickTrade && ( - - - {STRINGS['DIGITAL_ASSETS.QUICK_TRADE']} +
+
+
+ + {STRINGS['DIGITAL_ASSETS.ASSETS_INFO']} + +
+
+ + {STRINGS['DIGITAL_ASSETS.ASSETS_INFO_DETAIL']} + +
+
+
+ + + {STRINGS['ACCORDIAN.DEPOSIT']} - )} - - - {STRINGS['DIGITAL_ASSETS.PRO_TRADE']} - - + {showQuickTrade && ( + + + {STRINGS['DIGITAL_ASSETS.QUICK_TRADE']} + + + )} + + + {STRINGS['DIGITAL_ASSETS.PRO_TRADE']} + + +
+
- -
+ )}
); }; diff --git a/web/src/containers/FeesAndLimits/index.js b/web/src/containers/FeesAndLimits/index.js index 16d5b003fe..8e525b5e4c 100644 --- a/web/src/containers/FeesAndLimits/index.js +++ b/web/src/containers/FeesAndLimits/index.js @@ -2,8 +2,12 @@ import React, { useState, useEffect } from 'react'; import { connect } from 'react-redux'; import { bindActionCreators } from 'redux'; import { isMobile } from 'react-device-detect'; + import STRINGS from 'config/localizedStrings'; import withConfig from 'components/ConfigProvider/withConfig'; +import TradingFees from './TradingFees'; +import WithdrawalFees from './WithdrawalFees'; +import WithdrawalLimits from './WithdrawalLimits'; import { IconTitle, EditWrapper, @@ -13,10 +17,7 @@ import { HeaderSection, Loader, } from 'components'; -import { openContactForm } from 'actions/appActions'; -import TradingFees from './TradingFees'; -import WithdrawalFees from './WithdrawalFees'; -import WithdrawalLimits from './WithdrawalLimits'; +import { openContactForm, setLimitTab } from 'actions/appActions'; import { isLoggedIn } from 'utils/token'; const Index = ({ @@ -24,6 +25,7 @@ const Index = ({ verification_level, router, selectedAccount, + getLimitTab, }) => { const [selectedLevel, setSelectedLevel] = useState( isLoggedIn() ? verification_level?.toString() : Object.keys(config_level)[0] @@ -91,6 +93,13 @@ const Index = ({ setSelectedLevel(selectedAccount); }, [selectedAccount]); + useEffect(() => { + if (getLimitTab) { + setActiveTab(getLimitTab); + } + //eslint-disable-next-line + }, []); + const renderContent = (tabs, activeTab) => tabs[activeTab] && tabs[activeTab].content ? ( tabs[activeTab].content @@ -152,16 +161,18 @@ const Index = ({ const mapStateToProps = (state) => { const { - app: { config_level, selectedAccount }, + app: { config_level, selectedAccount, selectedTab }, } = state; return { verification_level: state.user.verification_level, config_level, selectedAccount, + getLimitTab: selectedTab, }; }; const mapDispatchToProps = (dispatch) => ({ + setLimitTab: bindActionCreators(setLimitTab, dispatch), openContactForm: bindActionCreators(openContactForm, dispatch), }); diff --git a/web/src/containers/P2P/Filters.js b/web/src/containers/P2P/Filters.js new file mode 100644 index 0000000000..2f79fef78d --- /dev/null +++ b/web/src/containers/P2P/Filters.js @@ -0,0 +1,349 @@ +import React, { useEffect, useState } from 'react'; +import { connect } from 'react-redux'; +import { DatePicker, Form, Radio, Select } from 'antd'; + +import STRINGS from 'config/localizedStrings'; +import { Coin, EditWrapper } from 'components'; +import { dateFilters } from 'containers/TransactionsHistory/filterUtils'; + +const Filter = ({ + transactionFilter, + setTransactions, + transactionDetails, + coins, + user, + selectedCurrencies, + tab, +}) => { + const [isRangePicker, setIsRangePicker] = useState(false); + const [date, setDate] = useState('All'); + const [tradeDetail, setTradeDetail] = useState({ + asset: null, + side: null, + status: null, + }); + const [customDateRange, setCustomDateRange] = useState({ + startDates: null, + endDates: null, + }); + + const trades = ['P2P.ALL', 'P2P.BUY_UPPER', 'P2P.SELL_UPPER']; + const orderStatus = [ + 'P2P.ALL', + 'P2P.COMPLETE', + 'P2P.APPEALED', + 'P2P.CANCELLED', + 'P2P.EXPIRED', + 'DEVELOPER_SECTION.ACTIVE', + 'ORDER_HISTORY_CLOSED', + ]; + + const { RangePicker } = DatePicker; + + useEffect(() => { + setDate('All'); + setTradeDetail({ + asset: null, + side: null, + status: null, + }); + setCustomDateRange({ startDates: null, endDates: null }); + setIsRangePicker(false); + + applyFilters(transactionDetails, tradeDetail, 'All'); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [tab]); + + const handleDateRange = (dates) => { + if (dates && dates.length === 2) { + const [startDate, endDate] = dates; + + const startDates = new Date(startDate?.toISOString()); + const endDates = new Date(endDate?.toISOString()); + + setCustomDateRange({ startDates, endDates }); + + const customTransaction = transactionDetails + ?.filter((x) => + transactionFilter + ? ['active', 'appealed'].includes(x.transaction_status) + : true + ) + ?.filter((data) => { + const createdAt = new Date(data.created_at); + return createdAt >= startDates && createdAt <= endDates; + }); + applyFilters( + customTransaction, + tradeDetail, + 'custom', + startDates, + endDates + ); + } + }; + + const handleDateFilter = (selectedDate) => { + setDate(selectedDate); + if (selectedDate === 'custom') { + setIsRangePicker(true); + return; + } else { + setIsRangePicker(false); + } + + let transactionList = transactionDetails?.filter((x) => + transactionFilter + ? ['active', 'appealed']?.includes(x?.transaction_status) + : true + ); + + const filterByDate = (daysAgo) => { + const targetDate = new Date(); + targetDate.setDate(targetDate.getDate() - daysAgo); + return transactionList.filter( + (data) => new Date(data?.created_at) >= targetDate + ); + }; + + const filterByMonth = (monthsAgo) => { + const targetDate = new Date(); + targetDate.setMonth(targetDate.getMonth() - monthsAgo); + return transactionList.filter( + (data) => new Date(data?.created_at) >= targetDate + ); + }; + + let filteredTransactions; + switch (selectedDate) { + case '1 day': + filteredTransactions = filterByDate(1); + break; + case '1 week': + filteredTransactions = filterByDate(7); + break; + case 'All': + filteredTransactions = transactionList; + break; + default: + if (Array.isArray(selectedDate)) { + const dateString = selectedDate.join(''); + if (dateString === '1 month') { + filteredTransactions = filterByMonth(1); + } else if (dateString === '3 month') { + filteredTransactions = filterByMonth(3); + } + } + break; + } + + if (selectedDate !== 'custom') { + applyFilters(filteredTransactions, tradeDetail, selectedDate); + } + }; + + const handleTransaction = (type, status) => { + setTradeDetail((prev) => { + const updatedTradeDetail = { + ...prev, + [type === 'status' + ? 'status' + : type === 'asset' + ? 'asset' + : 'side']: status, + }; + applyFilters(transactionDetails, updatedTradeDetail); + return updatedTradeDetail; + }); + }; + + const applyFilters = ( + transactions = transactionDetails, + filters = tradeDetail, + dateFilter = date, + startDates = customDateRange.startDates, + endDates = customDateRange.endDates + ) => { + const filteredTransactions = transactions.filter((data) => { + const statusMatch = + filters?.status === null || + filters?.status === 'ALL' || + (filters?.status === 'Completed' + ? data.transaction_status === 'complete' + : data.transaction_status?.toLowerCase() === + filters?.status?.toLowerCase()); + + const sideMatch = + filters?.side === null || + filters?.side === 'ALL' || + (filters?.side === 'BUY' + ? data?.user_id === user?.id + : data?.user_id !== user?.id); + + const assetMatch = + filters?.asset === null || + filters?.asset === 'ALL' || + data?.deal?.buying_asset === filters?.asset; + + const dateString = + Array.isArray(dateFilter) && dateFilter.length > 1 + ? dateFilter.join('') + : dateFilter; + + const dateMatch = + dateFilter === 'All' || + dateFilter === null || + (dateFilter === '1 day' && + new Date(data?.created_at) >= + new Date(new Date().setDate(new Date().getDate() - 1))) || + (dateFilter === '1 week' && + new Date(data?.created_at) >= + new Date(new Date().setDate(new Date().getDate() - 7))) || + (dateString === '1 month' && + new Date(data?.created_at) >= + new Date(new Date().setMonth(new Date().getMonth() - 1))) || + (dateString === '3 month' && + new Date(data?.created_at) >= + new Date(new Date().setMonth(new Date().getMonth() - 3))) || + (startDates && + endDates && + new Date(data?.created_at) >= startDates && + new Date(data?.created_at) <= endDates); + + return statusMatch && sideMatch && assetMatch && dateMatch; + }); + setTransactions(filteredTransactions); + }; + + const handleClearDate = () => { + setTransactions(transactionDetails); + applyFilters(transactionDetails, tradeDetail, 'All'); + }; + + return ( +
+
+
+
+
+ {STRINGS['P2P.ASSET']} +
+ +
+
+
+ {STRINGS['P2P.SIDE']}: +
+ +
+
+
+ {STRINGS['P2P.STATUS']}: +
+ +
+
+
+ + {Object.entries(dateFilters()).map(([key, { name }]) => { + const isActive = JSON.stringify(date) === JSON.stringify(name); + return ( + handleDateFilter(name)} + > + {name} + + ); + })} + +
+
handleDateFilter('custom')} + className={ + date === 'custom' + ? 'custom-text-active secondary-text custom-text ' + : 'custom-text secondary-text' + } + > + + {STRINGS['P2P.CUSTOM']} + +
+
+
+ {isRangePicker && ( + + { + if (!dates || (dates[0] === null && dates[1] === null)) { + handleClearDate(); + } else { + handleDateRange(dates, dateStrings); + } + }} + /> + + )} +
+
+ ); +}; + +const mapStateToProps = (state) => ({ + coins: state.app.coins, + user: state.user, +}); + +export default connect(mapStateToProps)(Filter); diff --git a/web/src/containers/P2P/P2PDash.js b/web/src/containers/P2P/P2PDash.js index 4699bc8489..6f6a952a4e 100644 --- a/web/src/containers/P2P/P2PDash.js +++ b/web/src/containers/P2P/P2PDash.js @@ -1,13 +1,29 @@ -/* eslint-disable */ -import React, { useState, useEffect, useRef } from 'react'; +import React, { useState, useEffect } from 'react'; import { connect } from 'react-redux'; -import { ReactSVG } from 'react-svg'; -import { Switch, message } from 'antd'; -import { IconTitle, EditWrapper, Coin } from 'components'; +import { + Switch, + message, + Button, + Select, + Input, + InputNumber, + Rate, +} from 'antd'; +import { + PlusSquareOutlined, + MinusSquareOutlined, + ExclamationOutlined, + ExclamationCircleFilled, + CloseOutlined, +} from '@ant-design/icons'; + +import './_P2P.scss'; +import classnames from 'classnames'; import STRINGS from 'config/localizedStrings'; -import { Button, Select, Input, InputNumber, Modal, Rate } from 'antd'; -// import { Link } from 'react-router'; import withConfig from 'components/ConfigProvider/withConfig'; +import NoDealsData from './Utilis'; +import P2PDashMobile from './P2PDashMobile'; +import { EditWrapper, Dialog, Coin } from 'components'; import { fetchDeals, createTransaction, @@ -17,14 +33,8 @@ import { import { COUNTRIES_OPTIONS } from 'utils/countries'; import { formatToCurrency } from 'utils/currency'; import { isMobile } from 'react-device-detect'; -import classnames from 'classnames'; -import { - CloseOutlined, - PlusSquareOutlined, - MinusSquareOutlined, -} from '@ant-design/icons'; import { fetchFeedback, fetchP2PProfile } from './actions/p2pActions'; -import './_P2P.scss'; +import { Loading } from 'containers/DigitalAssets/components/utils'; const P2PDash = ({ data, @@ -42,6 +52,7 @@ const P2PDash = ({ p2p_config, setTab, changeProfileTab, + tab, }) => { const [expandRow, setExpandRow] = useState(false); const [selectedDeal, setSelectedDeal] = useState(); @@ -50,22 +61,36 @@ const P2PDash = ({ const [amountCurrency, setAmountCurrency] = useState(); const [amountFiat, setAmountFiat] = useState(); const [filterCoin, setFilterCoin] = useState(); - const [filterDigital, setFilterDigital] = useState(); + const [filterDigital] = useState(); const [filterRegion, setFilterRegion] = useState(); const [filterAmount, setFilterAmount] = useState(); const [filterMethod, setFilterMethod] = useState(); const [methods, setMethods] = useState([]); const [loading, setLoading] = useState(false); const [displayUserFeedback, setDisplayUserFeedback] = useState(false); + const [displayOrderCreation, setDisplayOrderCreation] = useState(false); const [userFeedback, setUserFeedback] = useState([]); + const [isLoading, setIsLoading] = useState(false); const [userProfile, setUserProfile] = useState(); const [selectedProfile, setSelectedProfile] = useState(); const [myMethods, setMyMethods] = useState([]); - const inputRef = useRef(null); + // const inputRef = useRef(null); + const [isBuySelected, setIsBuySelected] = useState(true); + const [buyValue, setBuyValue] = useState([]); + const [selectedCoin, setSelectedCoin] = useState('USDT'); + const [isFilter, setIsFilter] = useState(false); + + const displayAssets = ['USDT', 'XHT', 'BTC', 'ETH']; + useEffect(() => { fetchDeals({ status: true }) .then((res) => { setDeals(res.data); + const buyDeals = res.data?.filter((deal) => deal?.side === 'sell'); + const filteredDeals = buyDeals?.filter((deal) => + selectedCoin?.includes(deal?.buying_asset?.toUpperCase()) + ); + setBuyValue(filteredDeals); const newMethods = []; res.data.forEach((deal) => { @@ -85,8 +110,15 @@ const P2PDash = ({ setMyMethods(res.data); }) .catch((err) => err); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [refresh]); + useEffect(() => { + if (tab !== 0 && isMobile) { + setIsFilter(false); + } + }, [tab]); + const formatAmount = (currency, amount) => { const min = coins[currency].min; const formattedAmount = formatToCurrency(amount, min); @@ -101,46 +133,92 @@ const P2PDash = ({ return formatAmount(asset, amount); }; + const handleToggle = () => { + const newIsBuySelected = !isBuySelected; + const filteredDeals = deals?.filter((deal) => + !newIsBuySelected ? deal?.side === 'buy' : deal?.side === 'sell' + ); + const cryptoAsset = filteredDeals?.filter((deal) => + selectedCoin?.includes(deal?.buying_asset?.toUpperCase()) + ); + setIsBuySelected(newIsBuySelected); + setBuyValue(cryptoAsset); + }; + + const handleCryptoAsset = (asset) => { + setSelectedCoin(asset); + + const filteredDeals = deals?.filter((deal) => + !isBuySelected ? deal?.side === 'buy' : deal?.side === 'sell' + ); + const cryptoAsset = filteredDeals?.filter((deal) => + asset?.includes(deal?.buying_asset?.toUpperCase()) + ); + setBuyValue(cryptoAsset); + }; + + const handleVendorFeedback = async (deal) => { + // changeProfileTab(deal.merchant); + try { + setIsLoading(true); + setSelectedProfile(deal.merchant); + const feedbacks = await fetchFeedback({ + merchant_id: deal.merchant.id, + }); + const profile = await fetchP2PProfile({ + user_id: deal.merchant.id, + }); + setUserFeedback(feedbacks.data); + setIsLoading(false); + setUserProfile(profile); + setDisplayUserFeedback(true); + } catch (error) { + return error; + } + }; + + const filteredDeals = buyValue?.filter( + (deal) => + (filterCoin ? filterCoin === deal.spending_asset : true) && + (filterDigital ? filterDigital === deal.buying_asset : true) && + (filterAmount ? filterAmount < deal.max_order_value : true) && + (filterMethod + ? deal.payment_methods.find((x) => x.system_name === filterMethod) + : true) && + (filterRegion ? filterRegion === deal.region : true) + ); + return (
0 + ? 'p2p-tab-container' + : 'p2p-tab-container p2p-no-deals-container', + isMobile ? 'mobile-view-p2p' : '', + ] + )} > {displayUserFeedback && ( - } - className="stake_table_theme stake_theme" - bodyStyle={{}} - visible={displayUserFeedback} - width={500} - footer={null} - onCancel={() => { + { setDisplayUserFeedback(false); }} > -
-
+
+ {isMobile && ( + { + setDisplayUserFeedback(false); + }} + > + + + )} +

{selectedProfile?.full_name || ( @@ -155,73 +233,35 @@ const P2PDash = ({

-
-
-
-
+
+
+
+
{STRINGS['P2P.TOTAL_ORDERS']}
-
- {userProfile?.totalTransactions} times +
+ {`${userProfile?.totalTransactions} ${STRINGS['P2P.TIMES']}`}
-
-
+
+
{STRINGS['P2P.COMPLETION_RATE']}
-
+
{(userProfile?.completionRate || 0).toFixed(2)}%
-
-
+
+
{STRINGS['P2P.POSITIVE_FEEDBACK']}
-
+
{(userProfile?.positiveFeedbackRate || 0).toFixed(2)}%
@@ -238,48 +278,20 @@ const P2PDash = ({
-
- Feedback({userFeedback.length || 0}) +
+ {STRINGS['P2P.FEEDBACK']} + ({userFeedback.length || 0})
- {userFeedback.length == 0 ? ( -
+ {userFeedback.length === 0 ? ( +
{STRINGS['P2P.NO_FEEDBACK']}
) : ( - - - +
+ + - - {userFeedback.map((deal) => { + + {userFeedback.map((deal, index) => { return ( - - + - ); @@ -324,7 +337,148 @@ const P2PDash = ({ - + + )} + + {displayOrderCreation && ( + setDisplayOrderCreation(false)} + className="p2p-order-creation-popup-wrapper" + > +
+
+ + + + {coins[selectedDeal?.buying_asset]?.fullname} + ({selectedDeal?.buying_asset?.toUpperCase()}) + + {STRINGS['P2P.ORDER_CREATION']} + +
+
+ + 15 {STRINGS['P2P.MINUTES']} + , + STRINGS['P2P.COMPLETE_PAYMENT_PROCESS'] + )} + > + {STRINGS.formatString( + STRINGS['P2P.ORDER_CREATION_DESC_1'], + STRINGS['P2P.ORDER_CREATION_DESC_2'], + STRINGS['P2P.YOU_HAVE_TEXT'], + + 15 {STRINGS['P2P.MINUTES']} + , + STRINGS['P2P.COMPLETE_PAYMENT_PROCESS'] + )} + +
+
+
+ + + {STRINGS['WITHDRAW_PAGE.WARNING']?.toUpperCase()} + + + + + + {STRINGS['P2P.WARINNG_DESC']} + + + + + + {STRINGS['P2P.ORDER_CANCEL_DESC']} + + + +
+
+ + {STRINGS.formatString( + STRINGS['P2P.CONFIRM_ORDER_CREATION'], + selectedDeal?.side === 'sell' + ? STRINGS['P2P.SEND_MONEY'] + : STRINGS['P2P.RECEIVE_MONEY'] + )} + +
+
+
+ + +
+
+
)} {/*
{STRINGS['P2P.ALL']}
*/} - -
-
- - {STRINGS['P2P.SPEND_FIAT_CURRENCY']} +
+
+ + {STRINGS['P2P.I_WANT_TO_BUY']} - - -
-
- - {STRINGS['P2P.AMOUNT']}(Fiat) - - - { - setFilterAmount(e.target.value); - }} - placeholder={STRINGS['P2P.INPUT_FIAT_AMOUNT']} - /> - +
+
- -
- - {STRINGS['P2P.PAYMENT_METHOD']} +
+ + {STRINGS['P2P.I_WANT_TO_SELL']} - - -
- -
- - {STRINGS['P2P.AVAILABLE_REGIONS']} +
+
+
+ + {STRINGS['P2P.CRYPTO']} - - -
+ {displayAssets?.map((asset) => { + return ( +
handleCryptoAsset(asset)} + > + {asset} +
+ ); + })}
-
-
{STRINGS['P2P.COMMENT']} @@ -292,28 +304,29 @@ const P2PDash = ({
- {deal.comment} +
+ {isLoading ? ( + + ) : ( + {deal.comment} + )} - + + {isLoading ? ( + + ) : ( + + )}
setIsFilter(!isFilter)} > - - - - - - - - - - - {deals - .filter( - (deal) => - (filterCoin ? filterCoin === deal.spending_asset : true) && - (filterDigital - ? filterDigital === deal.buying_asset - : true) && - (filterAmount ? filterAmount < deal.max_order_value : true) && - (filterMethod - ? deal.payment_methods.find( - (x) => x.system_name === filterMethod - ) - : true) && - (filterRegion ? filterRegion === deal.region : true) - ) - .map((deal) => { - return ( - <> - - - - - - - - {expandRow && expandRow && deal.id === selectedDeal.id && ( + + + {isFilter + ? STRINGS['P2P.HIDE_FILTERS'] + : STRINGS['P2P.SHOW_FILTERS']} + + + + )} + {!isMobile && ( +
+
+ + {STRINGS['P2P.SPEND_FIAT_CURRENCY']}: + + + + +
+
+ + {STRINGS['P2P.AMOUNT']}: + + + { + setFilterAmount(e.target.value); + }} + placeholder={ + isBuySelected + ? STRINGS['P2P.INPUT_SPEND_AMOUNT'] + : STRINGS['P2P.INPUT_SELL_AMOUNT'] + } + // suffix={STRINGS['WALLET_ASSETS_SEARCH_TXT']} + /> + +
+
+ + {STRINGS['P2P.PAYMENT_METHOD']}: + + + + +
+
+ + {STRINGS['P2P.AVAILABLE_REGIONS']}: + + + + +
+
+ )} + {isMobile && isFilter && ( +
+
+ + {STRINGS['P2P.SPEND_FIAT_CURRENCY']}: + + + + +
+
+ + {STRINGS['P2P.AMOUNT']}: + + + { + setFilterAmount(e.target.value); + }} + placeholder={ + isBuySelected + ? STRINGS['P2P.INPUT_SPEND_AMOUNT'] + : STRINGS['P2P.INPUT_SELL_AMOUNT'] + } + // suffix={STRINGS['WALLET_ASSETS_SEARCH_TXT']} + /> + +
+
+ + {STRINGS['P2P.PAYMENT_METHOD']}: + + + + +
+
+ + {STRINGS['P2P.AVAILABLE_REGIONS']}: + + + + +
+
+ )} + {filteredDeals?.length > 0 ? ( + !isMobile ? ( +
+
- - {STRINGS['P2P.VENDOR']} - - - - {STRINGS['P2P.PRICE_LOWEST_FIRST']} - - - - {STRINGS['P2P.LIMIT_AVAILABLE']} - - - - {STRINGS['P2P.PAYMENT']} - - - - {STRINGS['P2P.TRADE']} - -
{ - setExpandRow(!expandRow); - setSelectedDeal(deal); - setAmountCurrency(); - setSelectedMethod(); - setAmountFiat(); - }} - className="td-fit" - > - - {expandRow ? ( - - ) : ( - - )} - {' '} - - {deal.merchant.full_name || ( - - {STRINGS['P2P.ANONYMOUS']} - - )} - - { - setExpandRow(!expandRow); - setSelectedDeal(deal); - setAmountCurrency(); - setSelectedMethod(); - setAmountFiat(); - }} - className="td-fit" - > - {formatRate( - deal.exchange_rate, - deal.spread, - deal.spending_asset, - deal.side - )}{' '} - {deal.spending_asset.toUpperCase()} - { - setExpandRow(!expandRow); - setSelectedDeal(deal); - setAmountCurrency(); - setSelectedMethod(); - setAmountFiat(); - }} - > - <> -
- - {STRINGS['P2P.AVAILABLE']} - - : {deal.total_order_amount}{' '} - {deal.buying_asset.toUpperCase()} -
-
- - {STRINGS['P2P.LIMIT']} - - : {deal.min_order_value} - {deal.max_order_value}{' '} - {deal.spending_asset.toUpperCase()} -
- -
{ - setExpandRow(!expandRow); - setSelectedDeal(deal); - setAmountCurrency(); - setSelectedMethod(); - setAmountFiat(); - }} - > - {deal.payment_methods - .map((method) => method.system_name) - .join(', ')} - - {!( - expandRow && - expandRow && - deal.id === selectedDeal.id - ) && ( -
- -
- )} -
+ + + + + + + + + + + {filteredDeals?.map((deal) => { + return ( + <> + + - - - + + + {expandRow && expandRow && deal.id === selectedDeal.id && ( + + + - - )} - - ); - })} - -
+ + {STRINGS['P2P.VENDOR']} + + + + {STRINGS['P2P.PRICE_LOWEST_FIRST']} + + + + {STRINGS['P2P.LIMIT_AVAILABLE']} + + + + {STRINGS['P2P.PAYMENT']} + + + + {STRINGS['P2P.TRADE']} + +
{ + setExpandRow(!expandRow); + setSelectedDeal(deal); + setAmountCurrency(); + setSelectedMethod(); + setAmountFiat(); + }} + className="td-fit vendor-title" > -
{ - // changeProfileTab(deal.merchant); - - try { - setSelectedProfile(deal.merchant); - const feedbacks = await fetchFeedback({ - merchant_id: deal.merchant.id, - }); - const profile = await fetchP2PProfile({ - user_id: deal.merchant.id, - }); - setUserFeedback(feedbacks.data); - setUserProfile(profile); - setDisplayUserFeedback(true); - } catch (error) { - return error; - } - }} - style={{ - position: 'relative', - bottom: 40, - cursor: 'pointer', - }} - > - ( - - {STRINGS['P2P.VIEW_PROFILE']} + + {expandRow && deal.id === selectedDeal.id ? ( + + ) : ( + + )} + {' '} + + {deal.merchant.full_name || ( + + {STRINGS['P2P.ANONYMOUS']} + + )} + +
{ + setExpandRow(!expandRow); + setSelectedDeal(deal); + setAmountCurrency(); + setSelectedMethod(); + setAmountFiat(); + }} + className="td-fit price-value" + > + {`${formatRate( + deal.exchange_rate, + deal.spread, + deal.spending_asset, + deal.side + )}`}{' '} + {deal.spending_asset.toUpperCase()} + { + setExpandRow(!expandRow); + setSelectedDeal(deal); + setAmountCurrency(); + setSelectedMethod(); + setAmountFiat(); + }} + > +
+ + {STRINGS['P2P.AVAILABLE']}: - ) +
+ + {STRINGS['P2P.LIMIT']}: + +
- - {STRINGS['P2P.PAYMENT_TIME_LIMIT']} - -
- - {STRINGS['P2P.TERMS_CONDITIONS']} - - : {deal.terms} +
+
+ + {deal.total_order_amount}{' '} + + {deal.buying_asset.toUpperCase()} + +
+
+ + {deal.min_order_value} - {deal.max_order_value}{' '} + + {deal.spending_asset.toUpperCase()} +
{ + setExpandRow(!expandRow); + setSelectedDeal(deal); + setAmountCurrency(); + setSelectedMethod(); + setAmountFiat(); }} - > - {selectedDeal?.side === 'sell' ? ( -
-
- - {STRINGS['P2P.SELECT_PAYMENT_METHOD']} - - -
+ {!( + expandRow && + expandRow && + deal.id === selectedDeal.id + ) && ( +
+
- -
- - - {STRINGS['P2P.SPEND_AMOUNT']} - {' '} - ({deal.spending_asset.toUpperCase()}) - - - - { - setAmountFiat(e); - const currencyAmount = - Number(e) / - Number( - deal.exchange_rate * - (1 + Number(deal.spread / 100 || 0)) - ); - - const formatted = formatAmount( - deal.buying_asset, - currencyAmount + const transData = await fetchTransactions( + { + id: transaction.id, + } + ); + setSelectedTransaction(transData.data[0]); + setDisplayOrder(true); + setLoading(false); + } else { + message.error( + STRINGS[ + 'P2P.SELECT_PAYMENT_METHOD_AND_AMOUNT' + ] ); - - setAmountCurrency(formatted); - }} - placeholder={deal.spending_asset.toUpperCase()} - /> - -
-
- - - {STRINGS['P2P.AMOUNT_TO_RECEIVE']} - {' '} - ({deal.buying_asset.toUpperCase()}) - - - - - -
-
- - - -
+ } catch (error) { + message.error(error.data.message); + setLoading(false); + } + }} + > + {deal.side === 'sell' ? 'BUY' : 'SELL'}{' '} + {deal.buying_asset.toUpperCase()} {'>'} + - ) : ( + )} +
handleVendorFeedback(deal)} > -
+ ({STRINGS['P2P.VIEW_PROFILE']}) + +
+
+ - - {STRINGS['P2P.SELECT_PAYMENT_METHOD']} - - {deal?.payment_methods?.filter((a) => - myMethods?.find( - (x) => - x.name.toLowerCase() === - a.system_name?.toLowerCase() - ) - ).length === 0 && ( - - + {STRINGS.formatString( + STRINGS['P2P.PAYMENT_TIME_LIMIT_LABEL'], + + {STRINGS['P2P.30_MINUTES']} )} - {deal?.payment_methods?.filter((a) => - myMethods?.find( - (x) => - x.name.toLowerCase() === - a.system_name?.toLowerCase() - ) - ).length > 0 && ( - + +
+
+ + {STRINGS['P2P.TERMS_CONDITIONS']}: + + + {deal.terms} + +
+
+ {selectedDeal?.side === 'sell' ? ( +
+
+ + {STRINGS['P2P.SELECT_PAYMENT_METHOD']}: + + - )} -
+
-
- - - {STRINGS['P2P.SELL_AMOUNT']} - {' '} - ({deal.buying_asset.toUpperCase()}) - +
+ + + {STRINGS['P2P.SPEND_AMOUNT']} + {' '} + ({deal.spending_asset.toUpperCase()}): + - - { - setAmountFiat(e); - const currencyAmount = - Number(e) * - Number( - deal.exchange_rate * - (1 - Number(deal.spread / 100 || 0)) - ); + + amountFiat || + deal.max_order_value < amountFiat + ? 'error-field amount-spent-field' + : 'amount-spent-field' + } + value={amountFiat} + onChange={(e) => { + setAmountFiat(e); + const currencyAmount = + Number(e) / + Number( + deal.exchange_rate * + (1 + + Number(deal.spread / 100 || 0)) + ); - const formatted = formatAmount( - deal.spending_asset, - currencyAmount - ); + const formatted = formatAmount( + deal.buying_asset, + currencyAmount + ); - setAmountCurrency(formatted); - }} - placeholder={deal.buying_asset.toUpperCase()} - /> - -
-
- - - {STRINGS['P2P.AMOUNT_TO_RECEIVE']} - {' '} - ({deal.spending_asset.toUpperCase()}) - + setAmountCurrency(formatted); + }} + placeholder={deal.spending_asset.toUpperCase()} + autoFocus={true} + /> + +
+
+ {deal.min_order_value > amountFiat && ( +
+ + + + {STRINGS.formatString( + STRINGS[ + 'P2P.MINIMUM_AMOUNT_WARNING' + ], + STRINGS[ + 'P2P.SPEND_AMOUNT' + ].toLowerCase(), + deal.min_order_value + )} + + +
+ )} + {deal.max_order_value < amountFiat && ( +
+ + + + {STRINGS.formatString( + STRINGS[ + 'P2P.MAXIMUM_AMOUNT_WARNING' + ], + STRINGS[ + 'P2P.SPEND_AMOUNT' + ].toLowerCase(), + deal.max_order_value + )} + + +
+ )} +
+
+
+ + + {STRINGS['P2P.AMOUNT_TO_RECEIVE']} + {' '} + ({deal.buying_asset.toUpperCase()}) + + +
- - + + +
+
+ {deal.min_order_value <= amountFiat && + deal.max_order_value >= amountFiat && + !selectedMethod?.system_name && ( + + + + + { + STRINGS[ + 'P2P.SELECT_PAYMENT_METHOD_AND_AMOUNT' + ] + } + + + + )} +
+
+ + +
-
- + {deal?.payment_methods?.filter((a) => + myMethods?.find( + (x) => + x.name.toLowerCase() === + a.system_name?.toLowerCase() + ) + ).length === 0 && ( + + + + )} + {deal?.payment_methods?.filter((a) => + myMethods?.find( + (x) => + x.name.toLowerCase() === + a.system_name?.toLowerCase() + ) + ).length > 0 && ( + + + + )} +
- + + + }} + > + {deal.side === 'sell' ? 'BUY' : 'SELL'}{' '} + {deal.buying_asset.toUpperCase()} {'>'} + + - - )} -
-
+ )} + + + )} + + ); + })} + + +
+ ) : ( + + ) + ) : ( + + )}
); }; diff --git a/web/src/containers/P2P/P2PDashMobile.js b/web/src/containers/P2P/P2PDashMobile.js new file mode 100644 index 0000000000..6b289fbd5d --- /dev/null +++ b/web/src/containers/P2P/P2PDashMobile.js @@ -0,0 +1,578 @@ +import React, { useState } from 'react'; +import { connect } from 'react-redux'; +import { Button, Input, InputNumber, message, Select } from 'antd'; +import { CloseOutlined, ExclamationCircleFilled } from '@ant-design/icons'; + +import STRINGS from 'config/localizedStrings'; +import withConfig from 'components/ConfigProvider/withConfig'; +import { Coin, Dialog, EditWrapper } from 'components'; + +const P2PDashMobile = ({ + buyValue, + filterCoin, + filterAmount, + filterMethod, + filterRegion, + filterDigital, + formatRate, + amountFiat, + amountCurrency, + selectedDeal, + selectedMethod, + setSelectedDeal, + setDisplayOrderCreation, + setAmountCurrency, + setAmountFiat, + setSelectedMethod, + formatAmount, + coins, + handleVendorFeedback, + userProfile, + myMethods, + setTab, +}) => { + const [displayTrading, setDisplayTrading] = useState(false); + + const handleCloseTrading = () => { + setDisplayTrading(false); + setSelectedMethod(); + setAmountCurrency(); + setAmountFiat(); + setSelectedDeal(); + }; + + return ( +
+ {buyValue + ?.filter( + (deal) => + (filterCoin ? filterCoin === deal.spending_asset : true) && + (filterDigital ? filterDigital === deal.buying_asset : true) && + (filterAmount ? filterAmount < deal.max_order_value : true) && + (filterMethod + ? deal.payment_methods.find((x) => x.system_name === filterMethod) + : true) && + (filterRegion ? filterRegion === deal.region : true) + ) + .map((deal) => { + return ( + <> + {displayTrading && ( + handleCloseTrading()} + className="trading-popup-wrapper fs-16" + > +
+
+
+ + {selectedDeal.side === 'sell' + ? STRINGS['P2P.BUY_COIN'] + : STRINGS['P2P.SELL_COIN']} + + + {selectedDeal?.buying_asset.toUpperCase()}{' '} + + + + @{STRINGS['P2P.PRICE']} + + + + {formatRate( + selectedDeal?.exchange_rate, + selectedDeal?.spread, + selectedDeal?.spending_asset, + selectedDeal?.side + )} + + + {selectedDeal?.spending_asset.toUpperCase()} + +
+ handleCloseTrading()} + > + + +
+
+
+ + + {STRINGS['P2P.SPEND_AMOUNT']} + + : + +
+ + {' '} + {selectedDeal?.spending_asset.toUpperCase()} + + + + + amountFiat || + selectedDeal?.max_order_value < amountFiat + ? 'error-field amount-spent-field w-50' + : 'amount-spent-field w-50' + } + value={amountFiat} + onChange={(e) => { + setAmountFiat(e); + const currencyAmount = + Number(e) / + Number( + selectedDeal?.exchange_rate * + (1 + + Number(selectedDeal?.spread / 100 || 0)) + ); + + const formatted = formatAmount( + selectedDeal?.buying_asset, + currencyAmount + ); + + setAmountCurrency(formatted); + }} + placeholder="0" + autoFocus={true} + /> +
+
+
+ {selectedDeal?.min_order_value > amountFiat && ( +
+ + + + {STRINGS.formatString( + STRINGS['P2P.MINIMUM_AMOUNT_WARNING'], + STRINGS['P2P.SPEND_AMOUNT'].toLowerCase(), + selectedDeal?.min_order_value + )} + + +
+ )} + {selectedDeal?.max_order_value < amountFiat && ( +
+ + + + {STRINGS.formatString( + STRINGS['P2P.MAXIMUM_AMOUNT_WARNING'], + STRINGS['P2P.SPEND_AMOUNT'].toLowerCase(), + selectedDeal?.max_order_value + )} + + +
+ )} +
+
+
+ + + {STRINGS['P2P.AMOUNT_TO_RECEIVE']} + + +
+
+ + {' '} + {selectedDeal?.buying_asset.toUpperCase()} + + + + + +
+
+
+ {selectedDeal?.side === 'sell' ? ( + + + + ) : selectedDeal?.payment_methods?.filter((a) => + myMethods?.find( + (x) => + x.name.toLowerCase() === + a.system_name?.toLowerCase() + ) + ).length === 0 ? ( + + + + ) : ( + selectedDeal?.payment_methods?.filter((a) => + myMethods?.find( + (x) => + x.name.toLowerCase() === + a.system_name?.toLowerCase() + ) + ).length > 0 && ( + + + + ) + )} + +
+
+
+ {selectedDeal?.min_order_value <= amountFiat && + selectedDeal?.max_order_value >= amountFiat && + !selectedMethod?.system_name && ( + + + + + { + STRINGS[ + 'P2P.SELECT_PAYMENT_METHOD_AND_AMOUNT' + ] + } + + + + )} +
+
+
+ + {STRINGS['P2P.AVAILABLE']}: + + + {selectedDeal?.total_order_amount}{' '} + + + {selectedDeal?.buying_asset.toUpperCase()} + +
+
+
+ + {STRINGS['P2P.LIMIT']}: + + + + {selectedDeal?.min_order_value} -{' '} + {selectedDeal?.max_order_value}{' '} + + + {selectedDeal?.spending_asset.toUpperCase()} + + +
+
+
+
+
+
+ + {STRINGS['P2P.VENDOR']}: + + + {selectedDeal?.merchant.full_name || ( + + {STRINGS['P2P.ANONYMOUS']} + + )} + + + {(userProfile?.positiveFeedbackRate || 0).toFixed( + 2 + )} + % + +
+ handleVendorFeedback(selectedDeal)} + > + + ( + + {STRINGS['VIEW']?.toUpperCase()} + + ) + + +
+
+ + {STRINGS['P2P.ORDERS_COMPLETED']} + + + {userProfile?.totalTransactions} + +
+
+
+
+ + {STRINGS.formatString( + STRINGS['P2P.PAYMENT_TIME_LIMIT_LABEL'], + + {STRINGS['P2P.30_MINUTES']} + + )} + +
+
+ + {STRINGS['P2P.TERMS_CONDITIONS']}: + + + {selectedDeal?.terms} + +
+
+
+
+ )} +
+ + {deal.merchant.full_name || ( + + {STRINGS['P2P.ANONYMOUS']} + + )} + +
+ {`${formatRate( + deal.exchange_rate, + deal.spread, + deal.spending_asset, + deal.side + )}`} + + {deal.spending_asset.toUpperCase()} + +
+
+ + {STRINGS['P2P.AVAILABLE']}: + + + {deal.total_order_amount}{' '} + + + {deal.buying_asset.toUpperCase()} + + + + +
+
+
+ + {STRINGS['P2P.LIMIT']}: + + + + {deal.min_order_value} - {deal.max_order_value}{' '} + + + {deal.spending_asset.toUpperCase()} + + +
+
+
+
+
+ + {deal.payment_methods + .map((method) => method.system_name) + .join(', ')} + +
+
+ +
+
+
+ + ); + })} +
+ ); +}; + +const mapStateToProps = (state) => ({ + coins: state.app.coins, +}); + +export default connect(mapStateToProps)(withConfig(P2PDashMobile)); diff --git a/web/src/containers/P2P/P2PMyDeals.js b/web/src/containers/P2P/P2PMyDeals.js index cd1036cd6c..4a744912ed 100644 --- a/web/src/containers/P2P/P2PMyDeals.js +++ b/web/src/containers/P2P/P2PMyDeals.js @@ -1,17 +1,18 @@ -/* eslint-disable */ import React, { useEffect, useState } from 'react'; import { connect } from 'react-redux'; -// import { ReactSVG } from 'react-svg'; +import { isMobile } from 'react-device-detect'; +import { Button, Checkbox, message } from 'antd'; +import { RightOutlined } from '@ant-design/icons'; -import { IconTitle, EditWrapper } from 'components'; +import './_P2P.scss'; +import classnames from 'classnames'; import STRINGS from 'config/localizedStrings'; import withConfig from 'components/ConfigProvider/withConfig'; -import { Button, Checkbox, message } from 'antd'; +import NoDealsData from './Utilis'; +import { Coin, Dialog, EditWrapper } from 'components'; import { fetchDeals, editDeal, removeDeal } from './actions/p2pActions'; import { formatToCurrency } from 'utils/currency'; -import { isMobile } from 'react-device-detect'; -import classnames from 'classnames'; -import './_P2P.scss'; + const P2PMyDeals = ({ data, onClose, @@ -28,6 +29,8 @@ const P2PMyDeals = ({ }) => { const [myDeals, setMyDeals] = useState([]); const [checks, setCheks] = useState([]); + const [dealRemoveConfirmation, setDealRemoveConfirmation] = useState(false); + useEffect(() => { fetchDeals({ user_id: user.id }) .then((res) => { @@ -53,16 +56,61 @@ const P2PMyDeals = ({ return (
0 + ? 'p2p-mydeals-wrapper w-100' + : 'p2p-mydeals-wrapper w-100 p2p-no-deals-container', + isMobile ? 'mobile-view-p2p' : '', + ] + )} > -
- + setDealRemoveConfirmation(false)} + className="confirmation-remove-deal-popup-wrapper" + > +
+ + + {STRINGS['P2P.REMOVE_WARNING']} + + +
+ + +
+
+
+ +
+ { if (e.target.checked) { @@ -71,8 +119,7 @@ const P2PMyDeals = ({ setCheks([]); } }} - style={{ position: 'relative', top: 5 }} - className="whiteTextP2P" + className={isMobile ? 'fs-24 whiteTextP2P' : 'whiteTextP2P'} > {myDeals.length === 0 ? ( @@ -87,7 +134,9 @@ const P2PMyDeals = ({
- -
- - - - - - - - - - - - - - {myDeals.map((deal) => { - return ( - - - - + + + + + ); + })} + +
- - {STRINGS['P2P.EDIT']} - - - - {STRINGS['P2P.SIDE']} - - - - {STRINGS['P2P.STATUS']} - - - - {STRINGS['P2P.PRICE_DISPLAYED']} - - - - {STRINGS['P2P.LIMIT_AVAILABLE']} - - - - {STRINGS['P2P.PAYMENT']} - - - - {STRINGS['P2P.EDIT_DEAL']} - -
- id === deal.id)} - onChange={(e) => { - if (e.target.checked) { - if (!checks.find((id) => id === deal.id)) - setCheks([...checks, deal.id]); - } else { - setCheks(checks.filter((id) => id !== deal.id)); - } - }} - /> - - +
+ + + {STRINGS['P2P.AVAILABLE']} + + : + + {deal.total_order_amount} + {deal.buying_asset.toUpperCase()} + +
+
+ + + {STRINGS['P2P.LIMIT']} + + : + {' '} + {`${deal.min_order_value} - ${deal.max_order_value}`}{' '} + {deal.spending_asset.toUpperCase()} +
+
+ {deal.payment_methods + .map((method) => method.system_name) + .join(', ')} + + +
+ ) : ( + + )}
); diff --git a/web/src/containers/P2P/P2POrder.js b/web/src/containers/P2P/P2POrder.js deleted file mode 100644 index b1e47b3904..0000000000 --- a/web/src/containers/P2P/P2POrder.js +++ /dev/null @@ -1,1935 +0,0 @@ -/* eslint-disable */ -import React, { useEffect, useState, useRef } from 'react'; -import { connect } from 'react-redux'; -import { ReactSVG } from 'react-svg'; - -import { IconTitle, EditWrapper } from 'components'; -import STRINGS from 'config/localizedStrings'; -import withConfig from 'components/ConfigProvider/withConfig'; -import { Button, Input, message, Modal, Rate, Tooltip } from 'antd'; -import moment from 'moment'; -import { - createChatMessage, - fetchTransactions, - updateTransaction, - createFeedback, - fetchFeedback, - fetchP2PProfile, -} from './actions/p2pActions'; -import { withRouter } from 'react-router'; -import { formatToCurrency } from 'utils/currency'; -import { getToken } from 'utils/token'; -import { WS_URL } from 'config/constants'; -import { CloseOutlined } from '@ant-design/icons'; -import { isMobile } from 'react-device-detect'; -import classnames from 'classnames'; -import BigNumber from 'bignumber.js'; -import './_P2P.scss'; - -const P2POrder = ({ - data, - onClose, - coins, - pairs, - constants = {}, - icons: ICONS, - transaction_limits, - tiers = {}, - setDisplayOrder, - selectedTransaction, - setSelectedTransaction, - user, - router, - p2p_config, - p2p_message, - p2p_status, - p2p_transaction_id, -}) => { - const coin = coins[selectedTransaction.deal.buying_asset]; - const [selectedOrder, setSelectedOrder] = useState(selectedTransaction); - const [chatMessage, setChatMessage] = useState(); - const [appealReason, setAppealReason] = useState(); - const [feedback, setFeedback] = useState(); - const [rating, setRating] = useState(); - const [appealSide, setAppealSide] = useState(); - const [displayAppealModal, setDisplayAppealModel] = useState(false); - const [displayFeedbackModal, setDisplayFeedbackModel] = useState(false); - const [hasFeedback, setHasFeedback] = useState(false); - const [ws, setWs] = useState(); - const [ready, setReady] = useState(false); - const [displayCancelWarning, setDisplayCancelWarning] = useState(); - const [displayConfirmWarning, setDisplayConfirmWarning] = useState(); - const [lastClickTime, setLastClickTime] = useState(0); - const [displayUserFeedback, setDisplayUserFeedback] = useState(false); - const [userFeedback, setUserFeedback] = useState([]); - const [userProfile, setUserProfile] = useState(); - const [selectedProfile, setSelectedProfile] = useState(); - const ref = useRef(null); - const buttonRef = useRef(null); - - useEffect(() => { - ref.current.scroll({ - top: 9999, - behavior: 'smooth', - }); - }, [selectedOrder.messages]); - - const handleKeyDown = (event) => { - if (event.key === 'Enter') { - buttonRef.current.click(); - } - }; - - useEffect(() => { - document.addEventListener('keydown', handleKeyDown); - - // Cleanup the event listener on component unmount - return () => { - document.removeEventListener('keydown', handleKeyDown); - }; - }, []); - - useEffect(() => { - setSelectedOrder((prevState) => { - if ( - p2p_message.id === selectedOrder.id && - p2p_message.receiver_id === user.id && - (p2p_message.sender_id === prevState.merchant_id || - p2p_message.sender_id === prevState.user_id) - ) { - const found = - prevState?.messages?.[prevState?.messages?.length - 1]?.message === - p2p_message.message; - if (!found) { - prevState?.messages.push(p2p_message); - } - } - return { ...prevState, ...{ messages: prevState?.messages } }; - }); - }, [p2p_message]); - - useEffect(() => { - if (p2p_transaction_id === selectedOrder.id) updateP2PStatus(); - }, [p2p_status]); - - useEffect(() => { - fetchFeedback({ transaction_id: selectedOrder.id }) - .then((res) => { - if (res?.data?.length > 0) { - setHasFeedback(true); - } - }) - .catch((err) => err); - - if ( - selectedOrder.user_status === 'pending' && - moment() > - moment(selectedOrder.created_at).add( - selectedOrder.transaction_duration || 30, - 'minutes' - ) - ) { - if (selectedOrder.transaction_status !== 'expired') { - updateTransaction({ - id: selectedOrder.id, - transaction_status: 'expired', - }) - .then((res) => { - setSelectedOrder({ - ...selectedOrder, - transaction_status: 'expired', - }); - }) - .catch((err) => err); - } - } - }, []); - - useEffect(() => { - const url = `${WS_URL}/stream?authorization=Bearer ${getToken()}`; - const p2pWs = new WebSocket(url); - - p2pWs.onopen = (evt) => { - setWs(p2pWs); - setReady(true); - - setInterval(() => { - p2pWs.send( - JSON.stringify({ - op: 'ping', - }) - ); - }, 55000); - }; - - return () => { - p2pWs.close(); - }; - }, []); - - const updateP2PStatus = () => { - fetchTransactions({ id: selectedOrder.id }) - .then((transaction) => { - if (transaction.data[0].transaction_status === 'complete') { - setHasFeedback(false); - } - setSelectedOrder(transaction.data[0]); - }) - .catch((err) => err); - }; - const getTransaction = async () => { - try { - const transaction = await fetchTransactions({ - id: selectedOrder.id, - }); - setSelectedOrder(transaction.data[0]); - } catch (error) { - return error; - } - }; - - const addMessage = (message) => { - ws.send( - JSON.stringify({ - op: 'p2pChat', - args: [ - { - action: 'addMessage', - data: message, - }, - ], - }) - ); - - setSelectedOrder((prevState) => { - prevState?.messages.push(message); - return prevState; - }); - }; - - const updateStatus = (status) => { - ws.send( - JSON.stringify({ - op: 'p2pChat', - args: [ - { - action: 'getStatus', - data: { - id: selectedOrder.id, - status, - receiver_id: - user.id === selectedOrder?.merchant_id - ? selectedOrder?.user_id - : selectedOrder?.merchant_id, - }, - }, - ], - }) - ); - }; - - const userReceiveAmount = () => { - const incrementUnit = - coins?.[selectedOrder.deal.buying_asset]?.increment_unit; - const buyerFeeAmount = new BigNumber(selectedOrder?.amount_digital_currency) - .multipliedBy(p2p_config?.user_fee) - .dividedBy(100) - .toNumber(); - - const decimalPoint = new BigNumber(incrementUnit).dp(); - const sourceAmount = new BigNumber( - selectedOrder?.amount_digital_currency - buyerFeeAmount - ) - .decimalPlaces(decimalPoint) - .toNumber(); - return sourceAmount; - }; - - const sendChatMessage = async () => { - const now = Date.now(); - if (now - lastClickTime >= 1000 && chatMessage?.trim()?.length > 0) { - try { - await createChatMessage({ - receiver_id: - user.id === selectedOrder?.merchant_id - ? selectedOrder?.user_id - : selectedOrder?.merchant_id, - message: chatMessage, - transaction_id: selectedOrder.id, - }); - - addMessage({ - sender_id: user.id, - type: 'message', - receiver_id: - user.id === selectedOrder?.merchant_id - ? selectedOrder?.user_id - : selectedOrder?.merchant_id, - message: chatMessage, - id: selectedOrder.id, - }); - - setChatMessage(); - } catch (error) { - message.error(error.data.message); - } - setLastClickTime(now); - } - }; - const formatAmount = (currency, amount) => { - const min = coins[currency].min; - const formattedAmount = formatToCurrency(amount, min); - return formattedAmount; - }; - - return ( - <> - } - className="stake_table_theme stake_theme" - bodyStyle={{}} - visible={displayAppealModal} - width={450} - footer={null} - onCancel={() => { - setDisplayAppealModel(false); - }} - > -
-
-

- - {STRINGS['P2P.APPEAL_TRANSACTION']} - -

-
-
-
- - {STRINGS['P2P.ENTER_REASON']} - -
- { - setAppealReason(e.target.value); - }} - /> -
-
- -
- - -
-
- - {displayUserFeedback && ( - } - className="stake_table_theme stake_theme" - bodyStyle={{}} - visible={displayUserFeedback} - width={500} - footer={null} - onCancel={() => { - setDisplayUserFeedback(false); - }} - > -
-
-

- {selectedProfile?.full_name || ( - - {STRINGS['P2P.ANONYMOUS']} - - )} - {` `}( - - {STRINGS['P2P.TAB_PROFILE']} - - ) -

- -
-
-
-
-
- - {STRINGS['P2P.TOTAL_ORDERS']} - -
-
- {userProfile?.totalTransactions} times -
-
-
-
- - {STRINGS['P2P.COMPLETION_RATE']} - -
-
- {(userProfile?.completionRate || 0).toFixed(2)}% -
-
-
-
- - {STRINGS['P2P.POSITIVE_FEEDBACK']} - -
-
- {(userProfile?.positiveFeedbackRate || 0).toFixed(2)}% -
-
- - {STRINGS['P2P.POSITIVE']} - {' '} - {userProfile?.positiveFeedbackCount} /{' '} - - {STRINGS['P2P.NEGATIVE']} - {' '} - {userProfile?.negativeFeedbackCount} -
-
-
-
- -
- Feedback({userFeedback.length || 0}) -
- {userFeedback.length == 0 ? ( -
- - {STRINGS['P2P.NO_FEEDBACK']} - -
- ) : ( - - - - - - - - - {userFeedback.map((deal) => { - return ( - - - - - ); - })} - -
- - {STRINGS['P2P.COMMENT']} - - - - {STRINGS['P2P.RATING']} - -
- {deal.comment} - - -
- )} -
-
-
-
- )} - - {displayFeedbackModal && ( - } - className="stake_table_theme stake_theme" - bodyStyle={{}} - visible={displayFeedbackModal} - width={450} - footer={null} - onCancel={() => { - setDisplayFeedbackModel(false); - }} - > -
-
-

- - {STRINGS['P2P.SUBMIT_FEEDBACK']} - -

-
-
-
- - {STRINGS['P2P.INPUT_FEEDBACK']} - -
- { - setFeedback(e.target.value); - }} - /> -
-
-
- - {STRINGS['P2P.SELECT_RATING']} - -
- { - if (e > 0) setRating(e); - }} - value={rating} - /> -
-
- -
- - -
-
- )} - - {displayCancelWarning && ( - } - className="stake_table_theme stake_theme" - bodyStyle={{}} - visible={displayCancelWarning} - width={450} - footer={null} - onCancel={() => { - setDisplayCancelWarning(false); - }} - > -
-
-

- - {STRINGS['P2P.CANCEL_WARNING']} - -

-
-
- -
- - -
-
- )} - - {displayConfirmWarning && ( - } - className="stake_table_theme stake_theme" - bodyStyle={{}} - visible={displayConfirmWarning} - width={450} - footer={null} - onCancel={() => { - setDisplayConfirmWarning(false); - }} - > -
-
-

- - {STRINGS['P2P.CONFIRM_WARNING']} - -

-

- {userReceiveAmount()}{' '} - {selectedOrder?.deal?.buying_asset?.toUpperCase()} will be - released from your balance -

-
-
- -
- - -
-
- )} - -
{ - setDisplayOrder(false); - router.push('/p2p'); - }} - style={{ - marginBottom: 10, - cursor: 'pointer', - textDecoration: 'underline', - }} - > - {STRINGS['P2P.BACK']} -
-
-
-
-
-
-
- - {STRINGS['P2P.ORDER']} - -
-
- {user.id === selectedOrder.merchant_id ? ( - - {STRINGS['P2P.SELL_COIN']} - - ) : ( - - {STRINGS['P2P.BUY_COIN']} - - )}{' '} - {coin?.fullname?.toUpperCase()} ({coin?.symbol?.toUpperCase()} - ) -
-
-
-
-
- - {STRINGS['P2P.TRANSACTION_ID']} - - {': '} - {selectedOrder.transaction_id} -
- -
-
-
- - {STRINGS['P2P.AMOUNT_TO']} - {' '} - {user.id === selectedOrder?.merchant_id - ? STRINGS['P2P.RELEASE'] - : STRINGS['P2P.SEND_UPPER']} - : -
-
- {user.id === selectedOrder?.merchant_id && ( -
- {userReceiveAmount()}{' '} - {selectedOrder?.deal?.buying_asset?.toUpperCase()} -
- )} - {user.id === selectedOrder?.user_id && ( -
- {selectedOrder?.amount_fiat}{' '} - {selectedOrder?.deal?.spending_asset?.toUpperCase()} -
- )} -
- {user.id === selectedOrder?.merchant_id ? ( - - {STRINGS['P2P.AMOUNT_SEND_RELEASE']} - - ) : ( - - {STRINGS['P2P.REQUIRED_FLAT_TRANSFER_AMOUNT']} - - )} -
-
-
-
-
-
- - {STRINGS['P2P.PRICE']} - - : -
-
-
- {formatAmount( - selectedOrder?.deal?.spending_asset, - selectedOrder?.price - )}{' '} - {selectedOrder?.deal?.spending_asset?.toUpperCase()} -
-
- - {STRINGS['P2P.PER_COIN']} - {' '} - {selectedOrder?.deal?.buying_asset?.toUpperCase()} -
-
-
-
-
-
- - {STRINGS['P2P.RECEIVING_AMOUNT']} - - : -
- {user.id === selectedOrder?.merchant_id && ( -
-
- {selectedOrder?.amount_fiat}{' '} - {selectedOrder?.deal?.spending_asset?.toUpperCase()} -
-
- {selectedOrder?.deal?.spending_asset?.toUpperCase()}{' '} - - {STRINGS['P2P.SPENDING_AMOUNT']} - -
-
- )} - - {user.id === selectedOrder?.user_id && ( -
-
- {userReceiveAmount()}{' '} - {selectedOrder?.deal?.buying_asset?.toUpperCase()} -
-
- {selectedOrder?.deal?.buying_asset?.toUpperCase()}{' '} - - {STRINGS['P2P.BUYING_AMOUNT']} - -
-
- )} -
-
-
-
- - {STRINGS['P2P.FEE']} - - : -
- {user.id === selectedOrder?.merchant_id && ( -
-
{p2p_config?.merchant_fee}%
-
- )} - - {user.id === selectedOrder?.user_id && ( -
-
{p2p_config?.user_fee}%
-
- )} -
-
- -
-
- - {STRINGS['P2P.TRANSFER_DETAILS']} - -
- {user.id === selectedOrder?.user_id && ( -
- - {STRINGS['P2P.PAYMENT_INSTRUCTIONS']} - -
- )} - - {user.id === selectedOrder?.merchant_id && ( -
- - {STRINGS['P2P.PAYMENT_ACCOUNT']} - -
- )} - -
-
-
- - {STRINGS['P2P.PAYMENT_METHOD']} - - : -
-
- {selectedOrder?.payment_method_used?.system_name} -
-
- - {selectedOrder?.payment_method_used?.fields?.map((x) => { - return ( -
-
{x?.name}:
-
{x?.value}
-
- ); - })} -
-
- -
-
- - {STRINGS['P2P.EXPECTED_TIME']} - -
- - {user.id === selectedOrder?.user_id && ( - <> - {selectedOrder.user_status === 'pending' && ( - <> -
- - {STRINGS['P2P.PAYMENT_TIME']} - -
-
- - {STRINGS['P2P.ORDER_CANCELLED']} - -
- - )} - - {selectedOrder.user_status === 'confirmed' && ( -
- - {STRINGS['P2P.FUNDS_CREDITED']} - -
- )} - - {selectedOrder.merchant_status === 'cancelled' && ( -
- - {STRINGS['P2P.VENDOR_CANCELLED']} - -
- )} - - {selectedOrder.merchant_status === 'confirmed' && ( -
-
- - {STRINGS['P2P.ORDER_COMPLETE']} - -
-
- - {STRINGS['P2P.FUNDS_TRANSFERRED']} - -
-
{ - router.replace('/transactions?tab=deposits'); - }} - > - - - {STRINGS['P2P.GO_DEPOSIT']} - - -
- {!hasFeedback && ( - - )} -
- )} - {selectedOrder.merchant_status === 'appeal' && ( - <> -
- - {STRINGS['P2P.VENDOR_APPEALED']} - -
- - )} - {selectedOrder.user_status === 'appeal' && ( - <> -
- - {STRINGS['P2P.USER_APPEALED']} - -
- - )} - - )} - - {user.id === selectedOrder?.merchant_id && ( - <> - {selectedOrder.merchant_status === 'confirmed' && ( -
-
- - {STRINGS['P2P.ORDER_COMPLETE']} - -
-
- - {STRINGS['P2P.ORDER_COMPLETE_VENDOR']} - -
-
{ - router.replace('/transactions?tab=withdrawals'); - }} - > - - - {STRINGS['P2P.GO_WITHDRAWALS']} - - -
-
- )} - - {selectedOrder.user_status === 'pending' && ( - <> -
- - {STRINGS['P2P.PAYMENT_NOT_SENT']} - -
-
- - {STRINGS['P2P.CONFIRM_AND_RELEASE']} - -
- - )} - {selectedOrder.user_status === 'cancelled' && ( - <> -
- - {STRINGS['P2P.TRANSACTION_CANCELLED']} - -
- - )} - {selectedOrder.user_status === 'confirmed' && - selectedOrder?.merchant_status !== 'confirmed' && ( - <> -
- - {STRINGS['P2P.BUYER_CONFIRMED']} - -
-
- - {STRINGS['P2P.CHECK_AND_RELEASE']} - -
- - )} - {user.id === selectedOrder.user_id && - selectedOrder.user_status === 'appeal' && ( - <> -
- - {STRINGS['P2P.USER_APPEALED']} - -
- - )} - - {user.id === selectedOrder.merchant_id && - selectedOrder.user_status === 'appeal' && ( - <> -
- - {STRINGS['P2P.BUYER_APPEALED_ORDER']} - -
- - )} - - )} - -
- {user.id === selectedOrder?.user_id && ( - <> - {selectedOrder.user_status === 'confirmed' && - selectedOrder.merchant_status === 'pending' && ( - <> -
{ - try { - setDisplayAppealModel(true); - setAppealSide('user'); - } catch (error) { - message.error(error.data.message); - } - }} - style={{ - textDecoration: 'underline', - cursor: 'pointer', - position: 'relative', - top: 5, - }} - > - - {STRINGS['P2P.APPEAL']} - -
-
{ - setDisplayCancelWarning(true); - }} - style={{ - textDecoration: 'underline', - cursor: 'pointer', - position: 'relative', - top: 5, - }} - > - - {STRINGS['P2P.CANCEL_ORDER']} - -
- - )} - - )} - - {user.id === selectedOrder?.merchant_id && - selectedOrder?.merchant_status === 'pending' && ( - -
{ - try { - setDisplayAppealModel(true); - setAppealSide('merchant'); - } catch (error) { - message.error(error.data.message); - } - }} - style={{ - textDecoration: 'underline', - cursor: 'pointer', - position: 'relative', - top: 5, - }} - > - - {STRINGS['P2P.APPEAL']} - -
- - - - -
- )} - {user.id === selectedOrder?.merchant_id && - selectedOrder?.merchant_status === 'appeal' && ( -
- - {STRINGS['P2P.USER_APPEALED']} - -
- )} -
-
-
-
-
- {user.id === selectedOrder?.merchant_id ? ( - - {STRINGS['P2P.CHAT_WITH_USER']} - - ) : ( - - {STRINGS['P2P.CHAT_WITH_VENDOR']} - - )} -
-
-
{ - try { - if (user.id === selectedOrder?.merchant_id) return; - setSelectedProfile(selectedOrder?.merchant); - const feedbacks = await fetchFeedback({ - merchant_id: selectedOrder?.merchant_id, - }); - const profile = await fetchP2PProfile({ - user_id: selectedOrder?.merchant_id, - }); - setUserFeedback(feedbacks.data); - setUserProfile(profile); - setDisplayUserFeedback(true); - } catch (error) { - return error; - } - }} - > - {user.id === selectedOrder?.merchant_id ? ( - - {STRINGS['P2P.USER_NAME']} - - ) : ( - - {STRINGS['P2P.VENDOR_NAME']} - - )}{' '} - {user.id === selectedOrder?.merchant_id - ? selectedOrder?.buyer?.full_name || ( - - {STRINGS['P2P.ANONYMOUS']} - - ) - : selectedOrder?.merchant?.full_name || ( - - {STRINGS['P2P.ANONYMOUS']} - - )} -
-
-
- {user.id === selectedOrder?.user_id && ( -
- - {STRINGS['P2P.ORDER_INITIATED']} - {' '} - {selectedOrder?.merchant?.full_name || ( - - {STRINGS['P2P.ANONYMOUS']} - - )}{' '} - ( - {moment(selectedOrder?.created_at).format( - 'DD/MMM/YYYY, hh:mmA' - )} - ). -
- )} - - {user.id === selectedOrder?.user_id && ( -
- - {STRINGS['P2P.CONFIRM_PAYMENT']} - -
- )} - - {user.id === selectedOrder?.merchant_id && ( -
- - {STRINGS['P2P.ORDER_INITIATED_VENDOR']} - {' '} - {selectedOrder?.buyer?.full_name || ( - - {STRINGS['P2P.ANONYMOUS']} - - )}{' '} - ( - {moment(selectedOrder?.created_at).format( - 'DD/MMM/YYYY, hh:mmA' - )} - ). -
- )} - {user.id === selectedOrder?.merchant_id && ( -
- - {STRINGS['P2P.CONFIRM_PAYMENT_VENDOR']} - -
- )} -
- -
-
- {selectedOrder?.messages.map((message, index) => { - if (index === 0) { - return ( -
-
- {message.sender_id === selectedOrder?.merchant_id - ? selectedOrder?.merchant?.full_name - : selectedOrder?.buyer?.full_name} - : -
-
{message.message}
-
- {moment(message?.created_at || new Date()).format( - 'DD/MMM/YYYY, hh:mmA ' - )} -
-
- ); - } else { - if (message.type === 'notification') { - return ( -
- {message.message === 'BUYER_PAID_ORDER' && - user.id === selectedOrder.user_id ? ( - - {STRINGS[`P2P.BUYER_SENT_FUNDS`]} - - ) : ( - - {STRINGS[`P2P.${message.message}`]} - - )}{' '} - ( - {moment(message?.created_at || new Date()).format( - 'DD/MMM/YYYY, hh:mmA' - )} - ) -
- ); - } else { - if (message.sender_id === user.id) { - return ( -
-
- - {STRINGS['P2P.YOU']} - - : -
-
{message.message}
-
- {moment( - message?.created_at || new Date() - ).format('DD/MMM/YYYY, hh:mmA ')} -
-
- ); - } else { - return ( -
-
- {message.receiver_id === - selectedOrder.merchant_id - ? STRINGS['P2P.BUYER'] - : selectedOrder?.merchant?.full_name} - : -
-
{message.message}
-
- {moment( - message?.created_at || new Date() - ).format('DD/MMM/YYYY, hh:mmA ')} -
-
- ); - } - } - } - })} -
-
- -
-
-
- { - setChatMessage(e.target.value); - }} - /> -
-
- - {STRINGS['P2P.SEND_UPPER']} - -
-
-
-
-
-
-
- - {user.id === selectedOrder?.user_id && - selectedOrder?.transaction_status === 'active' && - selectedOrder.user_status === 'pending' && ( -
- - -
- )} - - ); -}; - -const mapStateToProps = (state) => ({ - pairs: state.app.pairs, - coins: state.app.coins, - constants: state.app.constants, - transaction_limits: state.app.transaction_limits, - p2p_message: state.p2p.chat, - p2p_status: state.p2p.status, - p2p_transaction_id: state.p2p.transaction_id, - user: state.user, - p2p_config: state.app.constants.p2p_config, -}); - -export default connect(mapStateToProps)(withRouter(withConfig(P2POrder))); diff --git a/web/src/containers/P2P/P2POrder/P2POrder.js b/web/src/containers/P2P/P2POrder/P2POrder.js new file mode 100644 index 0000000000..fdadce14bc --- /dev/null +++ b/web/src/containers/P2P/P2POrder/P2POrder.js @@ -0,0 +1,1909 @@ +import React, { useEffect, useState, useRef } from 'react'; +import { connect } from 'react-redux'; +import { withRouter } from 'react-router'; +import { isMobile } from 'react-device-detect'; +import { Button, Input, message, Rate, Tooltip } from 'antd'; +import { + CheckCircleTwoTone, + ExclamationOutlined, + SendOutlined, +} from '@ant-design/icons'; + +import { Coin, Dialog, EditWrapper, Image } from 'components'; +import STRINGS from 'config/localizedStrings'; +import withConfig from 'components/ConfigProvider/withConfig'; +import moment from 'moment'; +import { + createChatMessage, + fetchTransactions, + updateTransaction, + createFeedback, + fetchFeedback, + fetchP2PProfile, +} from '../actions/p2pActions'; +import { formatToCurrency } from 'utils/currency'; +import { getToken } from 'utils/token'; +import { WS_URL } from 'config/constants'; +import classnames from 'classnames'; +import BigNumber from 'bignumber.js'; +import '../_P2P.scss'; +import P2POrderChat from './P2POrderChat'; +import P2POrderDetails from './P2POrderDetails'; + +const P2POrder = ({ + data, + onClose, + coins, + pairs, + constants = {}, + icons: ICONS, + transaction_limits, + tiers = {}, + setDisplayOrder, + selectedTransaction, + setSelectedTransaction, + user, + router, + p2p_config, + p2p_message, + p2p_status, + p2p_transaction_id, + isChat, +}) => { + const coin = coins[selectedTransaction.deal.buying_asset]; + const [selectedOrder, setSelectedOrder] = useState(selectedTransaction); + const [chatMessage, setChatMessage] = useState(); + const [appealReason, setAppealReason] = useState(); + const [feedback, setFeedback] = useState(); + const [rating, setRating] = useState(); + const [appealSide, setAppealSide] = useState(); + const [displayAppealModal, setDisplayAppealModel] = useState(false); + const [displayFeedbackModal, setDisplayFeedbackModel] = useState(false); + const [hasFeedback, setHasFeedback] = useState(false); + const [ws, setWs] = useState(); + // const [ready, setReady] = useState(false); + const [displayCancelWarning, setDisplayCancelWarning] = useState(); + const [displayConfirmWarning, setDisplayConfirmWarning] = useState(); + const [lastClickTime, setLastClickTime] = useState(0); + const [displayUserFeedback, setDisplayUserFeedback] = useState(false); + const [userFeedback, setUserFeedback] = useState([]); + const [userProfile, setUserProfile] = useState(); + const [selectedProfile, setSelectedProfile] = useState(); + const ref = useRef(null); + const buttonRef = useRef(null); + + useEffect(() => { + if (ref.current) { + ref.current.scroll({ + top: 9999, + behavior: 'smooth', + }); + } + }, [selectedOrder.messages]); + + const handleKeyDown = (event) => { + if (event.key === 'Enter') { + buttonRef.current.click(); + } + }; + + useEffect(() => { + document.addEventListener('keydown', handleKeyDown); + + // Cleanup the event listener on component unmount + return () => { + document.removeEventListener('keydown', handleKeyDown); + }; + }, []); + + useEffect(() => { + setSelectedOrder((prevState) => { + if ( + p2p_message.id === selectedOrder.id && + p2p_message.receiver_id === user.id && + (p2p_message.sender_id === prevState.merchant_id || + p2p_message.sender_id === prevState.user_id) + ) { + const found = + prevState?.messages?.[prevState?.messages?.length - 1]?.message === + p2p_message.message; + if (!found) { + return { + ...prevState, + messages: [...(prevState?.messages || []), p2p_message], + }; + } + } + return { ...prevState, ...{ messages: prevState?.messages } }; + }); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [p2p_message]); + + useEffect(() => { + if (p2p_transaction_id === selectedOrder.id) updateP2PStatus(); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [p2p_status]); + + useEffect(() => { + fetchFeedback({ transaction_id: selectedOrder.id, user_id: user.id }) + .then((res) => { + if (res?.data?.length > 0) { + setHasFeedback(true); + } + }) + .catch((err) => err); + + if ( + selectedOrder.user_status === 'pending' && + moment() > + moment(selectedOrder.created_at).add( + selectedOrder.transaction_duration || 30, + 'minutes' + ) + ) { + if (selectedOrder.transaction_status !== 'expired') { + updateTransaction({ + id: selectedOrder.id, + transaction_status: 'expired', + }) + .then((res) => { + setSelectedOrder({ + ...selectedOrder, + transaction_status: 'expired', + }); + }) + .catch((err) => err); + } + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + useEffect(() => { + let pingInterval; + + const connectWebSocket = () => { + const url = `${WS_URL}/stream?authorization=Bearer ${getToken()}`; + const p2pWs = new WebSocket(url); + + p2pWs.onopen = () => { + setWs(p2pWs); + + if (selectedTransaction.first_created) { + p2pWs.send( + JSON.stringify({ + op: 'p2pChat', + args: [ + { + action: 'getStatus', + data: { + id: selectedTransaction.id, + status: 'created', + title: 'p2p', + receiver_id: + user.id === selectedTransaction?.merchant_id + ? selectedTransaction?.user_id + : selectedTransaction?.merchant_id, + }, + }, + ], + }) + ); + } + + pingInterval = setInterval(() => { + if (p2pWs.readyState === WebSocket.OPEN) { + p2pWs.send(JSON.stringify({ op: 'ping' })); + } + }, 55000); + }; + + p2pWs.onclose = (event) => { + clearInterval(pingInterval); + setTimeout(connectWebSocket, 3000); + }; + + p2pWs.onerror = (error) => { + clearInterval(pingInterval); + p2pWs.close(); + }; + + return p2pWs; + }; + + const p2pWs = connectWebSocket(); + + return () => { + clearInterval(pingInterval); + p2pWs.close(); + }; + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + const updateP2PStatus = () => { + fetchTransactions({ id: selectedOrder.id }) + .then((transaction) => { + if (transaction.data[0].transaction_status === 'complete') { + setHasFeedback(false); + } + setSelectedOrder(transaction.data[0]); + }) + .catch((err) => err); + }; + // const getTransaction = async () => { + // try { + // const transaction = await fetchTransactions({ + // id: selectedOrder.id, + // }); + // setSelectedOrder(transaction.data[0]); + // } catch (error) { + // return error; + // } + // }; + + const addMessage = (message) => { + ws.send( + JSON.stringify({ + op: 'p2pChat', + args: [ + { + action: 'addMessage', + data: message, + }, + ], + }) + ); + + setSelectedOrder((prevState) => { + return { + ...prevState, + messages: [...(prevState?.messages || []), message], + }; + }); + }; + + const updateStatus = (status, title = '') => { + ws.send( + JSON.stringify({ + op: 'p2pChat', + args: [ + { + action: 'getStatus', + data: { + id: selectedOrder.id, + status, + title, + receiver_id: + user.id === selectedOrder?.merchant_id + ? selectedOrder?.user_id + : selectedOrder?.merchant_id, + }, + }, + ], + }) + ); + }; + + const userReceiveAmount = () => { + const incrementUnit = + coins?.[selectedOrder.deal.buying_asset]?.increment_unit; + const buyerFeeAmount = new BigNumber(selectedOrder?.amount_digital_currency) + .multipliedBy(p2p_config?.user_fee) + .dividedBy(100) + .toNumber(); + + const decimalPoint = new BigNumber(incrementUnit).dp(); + const sourceAmount = new BigNumber( + selectedOrder?.amount_digital_currency - buyerFeeAmount + ) + .decimalPlaces(decimalPoint) + .toNumber(); + return sourceAmount; + }; + + const sendChatMessage = async () => { + const now = Date.now(); + if (now - lastClickTime >= 1000 && chatMessage?.trim()?.length > 0) { + try { + await createChatMessage({ + receiver_id: + user.id === selectedOrder?.merchant_id + ? selectedOrder?.user_id + : selectedOrder?.merchant_id, + message: chatMessage, + transaction_id: selectedOrder.id, + }); + + addMessage({ + sender_id: user.id, + type: 'message', + receiver_id: + user.id === selectedOrder?.merchant_id + ? selectedOrder?.user_id + : selectedOrder?.merchant_id, + message: chatMessage, + id: selectedOrder.id, + }); + + setChatMessage(); + } catch (error) { + message.error(error.data.message); + } + setLastClickTime(now); + } + }; + + const isOrderCreated = + selectedOrder?.transaction_status === 'active' && + selectedOrder.user_status === 'pending'; + const isOrderVerified = + selectedOrder.user_status === 'confirmed' && + selectedOrder.merchant_status === 'pending'; + const isOrderConfirmed = selectedOrder.merchant_status === 'confirmed'; + + const formatAmount = (currency, amount) => { + const min = coins[currency]?.min; + const formattedAmount = formatToCurrency(amount, min); + return formattedAmount; + }; + + return ( + <> + { + setDisplayAppealModel(false); + }} + > +
+
+ + {STRINGS['P2P.APPEAL_TRANSACTION']} + +
+
+
+ + {STRINGS['P2P.ENTER_REASON']} + +
+ { + setAppealReason(e.target.value); + }} + /> +
+
+ +
+ + +
+
+ + {displayUserFeedback && ( + { + setDisplayUserFeedback(false); + }} + > +
+
+
+ {selectedProfile?.full_name || ( + + {STRINGS['P2P.ANONYMOUS']} + + )} + + ( + + {STRINGS['P2P.TAB_PROFILE']} + + ) + +
+ +
+
+
+
+
+ + {STRINGS['P2P.TOTAL_ORDERS']} + +
+
+ {userProfile?.totalTransactions} + + + {STRINGS['P2P.TIMES']} + + +
+
+
+
+ + {STRINGS['P2P.COMPLETION_RATE']} + +
+
+ {(userProfile?.completionRate || 0).toFixed(2)}% +
+
+
+
+ + {STRINGS['P2P.POSITIVE_FEEDBACK']} + +
+
+ {(userProfile?.positiveFeedbackRate || 0).toFixed(2)}% +
+
+ + {STRINGS['P2P.POSITIVE']} + + {userProfile?.positiveFeedbackCount} / + + {STRINGS['P2P.NEGATIVE']} + + {userProfile?.negativeFeedbackCount} +
+
+
+
+ +
+ + + {STRINGS['P2P.FEEDBACK']} + + + ({userFeedback?.length || 0}) +
+ {userFeedback?.length === 0 ? ( +
+ + {STRINGS['P2P.NO_FEEDBACK']} + +
+ ) : ( + + + + + + + + + {userFeedback.map((deal) => { + return ( + + + + + ); + })} + +
+ + {STRINGS['P2P.COMMENT']} + + + + {STRINGS['P2P.RATING']} + +
{deal.comment} + +
+ )} +
+
+
+
+ )} + + {displayFeedbackModal && ( + { + setDisplayFeedbackModel(false); + }} + > +
+
+ + {STRINGS['P2P.SUBMIT_FEEDBACK']} + +
+
+
+ + {STRINGS['P2P.INPUT_FEEDBACK']} + +
+ { + setFeedback(e.target.value); + }} + /> +
+
+
+ + {STRINGS['P2P.SELECT_RATING']} + +
+ { + if (e > 0) setRating(e); + }} + value={rating} + /> +
+
+ +
+ + +
+
+ )} + + {displayCancelWarning && ( + { + setDisplayCancelWarning(false); + }} + > +
+
+ + {STRINGS['P2P.CANCEL_WARNING']} + +
+
+ + + {STRINGS['WITHDRAW_PAGE.WARNING']?.toUpperCase()} + + + + + {STRINGS['P2P.CANCEL_WARNING_TEXT']} + +
+
+ +
+ + +
+
+ )} + + {displayConfirmWarning && ( + { + setDisplayConfirmWarning(false); + }} + > +
+
+ + {STRINGS['P2P.CONFIRM_WARNING']} + +
+
+
+ {userReceiveAmount()} + + {selectedOrder?.deal?.buying_asset?.toUpperCase()}{' '} + + + + {STRINGS['P2P.AMOUNT_RECEIVE']} + + +
+ +
+ + +
+
+ )} + + {!isChat && ( +
+ { + setDisplayOrder(false); + router.push('/p2p'); + }} + className="back-text" + > + + + {'<'} + {STRINGS['BACK_TEXT']} + + + +
+ )} + {(isOrderCreated || isOrderVerified || isOrderConfirmed) && !isChat && ( +
+
+
+ {(isOrderCreated || isOrderVerified || isOrderConfirmed) && ( + + )} +
+
+
+ + {STRINGS['P2P.STEP_1']}: + +
+
+ + {STRINGS['P2P.P2P_ORDER_CREATED']} + +
+
+
+
+
+
+ {(isOrderVerified || isOrderConfirmed) && } +
+
+
+ + {STRINGS['P2P.STEP_2']}: + +
+
+ + {STRINGS['P2P.VENDOR_CHECKS_TITLE']} + +
+
+
+ +
+
+
+ {isOrderConfirmed && } +
+
+
+ + {STRINGS['P2P.STEP_3']}: + +
+
+ + {STRINGS['P2P.FUND_RELEASED']} + +
+
+
+
+ )} +
+ {!isMobile && ( +
+
+
+ +
+
+
+ + {STRINGS['P2P.ORDER']}: + +
+ + {selectedOrder.transaction_id} + +
+
+ {user.id === selectedOrder.merchant_id ? ( + + {STRINGS['P2P.SELL_COIN']} + + ) : ( + + {STRINGS['P2P.BUY_COIN']} + + )}{' '} + {coin?.fullname} ({coin?.symbol?.toUpperCase()}) +
+
+
+ {/*
+
+ + {STRINGS['P2P.TRANSACTION_ID']} + + {': '} + {selectedOrder.transaction_id} +
+ +
*/} +
+
+ + {STRINGS['P2P.AMOUNT_TO']} + {' '} + + {user?.id === selectedOrder?.merchant_id + ? STRINGS['P2P.RELEASE'] + : STRINGS['P2P.SEND_UPPER']} + + : +
+
+ {user.id === selectedOrder?.merchant_id && ( +
+ + {userReceiveAmount()} + + + {selectedOrder?.deal?.buying_asset?.toUpperCase()} + + +
+ )} + {user.id === selectedOrder?.user_id && ( +
+ + {selectedOrder?.amount_fiat} + + + {selectedOrder?.deal?.spending_asset?.toUpperCase()} + + +
+ )} +
+ {user.id === selectedOrder?.merchant_id ? ( + + {STRINGS['P2P.AMOUNT_SEND_RELEASE']} + + ) : ( + + {STRINGS['P2P.REQUIRED_FLAT_TRANSFER_AMOUNT']} + + )} +
+
+
+
+
+ + {STRINGS['P2P.PRICE']} + + : +
+
+
+ + {formatAmount( + selectedOrder?.deal?.spending_asset, + selectedOrder?.price + )} + + + {selectedOrder?.deal?.spending_asset?.toUpperCase()} + + +
+
+ + + {STRINGS['P2P.PER_COIN']} + {' '} + + + {selectedOrder?.deal?.buying_asset?.toUpperCase()} + + +
+
+
+
+
+ + {STRINGS['P2P.RECEIVING_AMOUNT']} + + : +
+ {user.id === selectedOrder?.merchant_id && ( +
+
+ + {selectedOrder?.amount_fiat} + + + {selectedOrder?.deal?.spending_asset?.toUpperCase()} + + +
+
+ + {selectedOrder?.deal?.spending_asset?.toUpperCase()} + + + + {STRINGS['P2P.SPENDING_AMOUNT']} + + +
+
+ )} + + {user.id === selectedOrder?.user_id && ( +
+
+ + {userReceiveAmount()} + + + {selectedOrder?.deal?.buying_asset?.toUpperCase()} + + +
+
+ + {selectedOrder?.deal?.buying_asset?.toUpperCase()} + + + + {STRINGS['P2P.BUYING_AMOUNT']} + + +
+
+ )} +
+
+
+ + {STRINGS['P2P.FEE']} + + : +
+ {user.id === selectedOrder?.merchant_id && ( +
+
{p2p_config?.merchant_fee}%
+
+ )} + + {user.id === selectedOrder?.user_id && ( +
+
{p2p_config?.user_fee}%
+
+ )} +
+
+
+ + {STRINGS['P2P.TRANSFER_DETAILS']} + +
+ {user.id === selectedOrder?.user_id && ( +
+ + {STRINGS['P2P.PAYMENT_INSTRUCTIONS']} + +
+ )} + + {user.id === selectedOrder?.merchant_id && ( +
+ + {STRINGS['P2P.PAYMENT_ACCOUNT']} + +
+ )} + +
+
+
+ + {STRINGS['P2P.PAYMENT_METHOD']} + + : +
+
{selectedOrder?.payment_method_used?.system_name}
+
+ + {selectedOrder?.payment_method_used?.fields?.map((x) => { + return ( +
+
{x?.name}:
+
{x?.value}
+
+ ); + })} +
+
+
+
+ + {STRINGS['P2P.EXPECTED_TIME']} + +
+ + {user.id === selectedOrder?.user_id && ( + <> + {selectedOrder.user_status === 'pending' && ( + <> +
+ + {STRINGS['P2P.PAYMENT_TIME']} + +
+
+ + {STRINGS['P2P.ORDER_CANCELLED']} + +
+ + )} + + {selectedOrder.user_status === 'confirmed' && ( +
+ + {STRINGS['P2P.FUNDS_CREDITED']} + +
+ )} + + {selectedOrder.merchant_status === 'cancelled' && ( +
+ + {STRINGS['P2P.VENDOR_CANCELLED']} + +
+ )} + + {selectedOrder.merchant_status === 'confirmed' && ( +
+
+ + + +
+ + {STRINGS['P2P.ORDER_COMPLETE']} + +
+
+
+ {selectedOrder?.deal?.side === 'sell' ? ( + + {STRINGS['P2P.FUNDS_TRANSFERRED']} + + ) : ( + + {STRINGS['P2P.FUNDS_TRANSFERRED_USER']} + + )} +
+
{ + router.replace('/transactions?tab=deposits'); + }} + > + + + {STRINGS['P2P.GO_DEPOSIT']} + + +
+ {!hasFeedback && ( + + )} +
+ )} + {selectedOrder.merchant_status === 'appeal' && ( + <> +
+ + {STRINGS['P2P.VENDOR_APPEALED']} + +
+ + )} + {selectedOrder.user_status === 'appeal' && ( + <> +
+ + {STRINGS['P2P.USER_APPEALED']} + +
+ + )} + + )} + + {user.id === selectedOrder?.merchant_id && ( + <> + {selectedOrder.merchant_status === 'confirmed' && ( +
+
+ + + +
+ + {STRINGS['P2P.ORDER_COMPLETE']} + +
+
+
+ + {STRINGS['P2P.ORDER_COMPLETE_VENDOR']} + +
+
{ + router.replace('/transactions?tab=withdrawals'); + }} + > + + + {STRINGS['P2P.GO_WITHDRAWALS']} + + +
+ {!hasFeedback && ( + + )} +
+ )} + + {selectedOrder.user_status === 'pending' && ( + <> +
+ + {STRINGS['P2P.PAYMENT_NOT_SENT']} + +
+
+ + {STRINGS['P2P.CONFIRM_AND_RELEASE']} + +
+ + )} + {selectedOrder.user_status === 'cancelled' && ( + <> +
+ + {STRINGS['P2P.TRANSACTION_CANCELLED']} + +
+ + )} + {selectedOrder.user_status === 'confirmed' && + selectedOrder?.merchant_status !== 'confirmed' && ( + <> +
+ + {STRINGS['P2P.BUYER_CONFIRMED']} + +
+
+ + {STRINGS['P2P.CHECK_AND_RELEASE']} + +
+ + )} + {user.id === selectedOrder.user_id && + selectedOrder.user_status === 'appeal' && ( + <> +
+ + {STRINGS['P2P.USER_APPEALED']} + +
+ + )} + + {user.id === selectedOrder.merchant_id && + selectedOrder.user_status === 'appeal' && ( + <> +
+ + {STRINGS['P2P.BUYER_APPEALED_ORDER']} + +
+ + )} + + )} + +
+ {user.id === selectedOrder?.user_id && ( + <> + {selectedOrder.user_status === 'confirmed' && + selectedOrder.merchant_status === 'pending' && ( + <> +
{ + try { + setDisplayAppealModel(true); + setAppealSide('user'); + } catch (error) { + message.error(error.data.message); + } + }} + > + + + {STRINGS['P2P.APPEAL']} + + +
+
{ + setDisplayCancelWarning(true); + }} + > + + + + {STRINGS['P2P.CANCEL_ORDER']} + + + +
+ + )} + + )} + + {user.id === selectedOrder?.merchant_id && + selectedOrder?.merchant_status === 'pending' && ( + +
{ + try { + setDisplayAppealModel(true); + setAppealSide('merchant'); + } catch (error) { + message.error(error.data.message); + } + }} + > + + {STRINGS['P2P.APPEAL']} + +
+ + + + +
+ )} + {user.id === selectedOrder?.merchant_id && + selectedOrder?.merchant_status === 'appeal' && ( +
+ + {STRINGS['P2P.USER_APPEALED']} + +
+ )} +
+
+
+
+
+ {'text'} + {user.id === selectedOrder?.merchant_id ? ( + + {STRINGS['P2P.CHAT_WITH_USER']} + + ) : ( + + {STRINGS['P2P.CHAT_WITH_VENDOR']} + + )} +
+
+
{ + try { + if (user.id === selectedOrder?.merchant_id) return; + setSelectedProfile(selectedOrder?.merchant); + const feedbacks = await fetchFeedback({ + merchant_id: selectedOrder?.merchant_id, + }); + const profile = await fetchP2PProfile({ + user_id: selectedOrder?.merchant_id, + }); + setUserFeedback(feedbacks.data); + setUserProfile(profile); + setDisplayUserFeedback(true); + } catch (error) { + return error; + } + }} + > + {user.id === selectedOrder?.merchant_id ? ( +
+ + {STRINGS['P2P.USER_NAME']} + +
+ ) : ( +
+ + {STRINGS['P2P.VENDOR_NAME']} + +
+ )} + {user.id === selectedOrder?.merchant_id + ? selectedOrder?.buyer?.full_name || ( + + {STRINGS['P2P.ANONYMOUS']} + + ) + : selectedOrder?.merchant?.full_name || ( + + {STRINGS['P2P.ANONYMOUS']} + + )} +
+
+ {user.id === selectedOrder?.user_id && ( +
+
+ {selectedOrder?.deal?.side === 'sell' ? ( + + {STRINGS['P2P.ORDER_INITIATED']} + + ) : ( + + {STRINGS['P2P.ORDER_INITIATED_VENDOR']} + + )} + + + {selectedOrder?.merchant?.full_name || ( + + {STRINGS['P2P.ANONYMOUS']} + + )} + +
+ + ( + {moment(selectedOrder?.created_at).format( + 'DD/MMM/YYYY, hh:mmA' + )} + ) + +
+ )} + + {user.id === selectedOrder?.user_id && ( +
+ + {STRINGS['P2P.CONFIRM_PAYMENT']} + +
+ )} + + {user.id === selectedOrder?.merchant_id && ( +
+
+ + {STRINGS['P2P.ORDER_INITIATED_VENDOR']} + + + {selectedOrder?.buyer?.full_name || ( + + {STRINGS['P2P.ANONYMOUS']} + + )} + +
+ + ( + {moment(selectedOrder?.created_at).format( + 'DD/MMM/YYYY, hh:mmA' + )} + ) + +
+ )} + {user.id === selectedOrder?.merchant_id && ( +
+ + {STRINGS['P2P.CONFIRM_PAYMENT_VENDOR']} + +
+ )} +
+ +
+
+ {selectedOrder?.messages?.map((message, index) => { + if (index === 0) { + return ( +
+
+ {message.sender_id === selectedOrder?.merchant_id + ? selectedOrder?.merchant?.full_name + : selectedOrder?.buyer?.full_name} + : +
+
{message.message}
+
+ {moment(message?.created_at || new Date()).format( + 'DD/MMM/YYYY, hh:mmA ' + )} +
+
+ ); + } else { + if (message.type === 'notification') { + return ( +
+ {message.message === 'BUYER_PAID_ORDER' && + user.id === selectedOrder.user_id ? ( + selectedOrder?.deal?.side === 'sell' ? ( + + {STRINGS[`P2P.BUYER_SENT_FUNDS`]} + + ) : ( + + {STRINGS[`P2P.BUYER_SENT_FUNDS_USER`]} + + ) + ) : ( + + {STRINGS[`P2P.${message.message}`]} + + )} + + ( + {moment( + message?.created_at || new Date() + ).format('DD/MMM/YYYY, hh:mmA')} + ) + +
+ ); + } else { + if (message.sender_id === user.id) { + return ( +
+
+ + + {STRINGS['P2P.YOU']}: + + + + {message?.message} + +
+ {moment( + message?.created_at || new Date() + ).format('DD/MMM/YYYY, hh:mmA ')} +
+
+
+ ); + } else { + return ( +
+
+
+
+ {message?.receiver_id === + selectedOrder?.merchant_id + ? STRINGS['P2P.BUYER'] + : selectedOrder?.merchant?.full_name || + STRINGS['P2P.ANONYMOUS']} + : +
+
+ {message?.message} +
+
+
+ {moment( + message?.created_at || new Date() + ).format('DD/MMM/YYYY, hh:mmA ')} +
+
+
+ ); + } + } + } + })} +
+
+
+
+ { + setChatMessage(e.target.value); + }} + suffix={ +
+ + {STRINGS['P2P.SEND_UPPER']} + + +
+ } + /> +
+
+
+
+
+ )} + {isMobile && ( +
+ {!isChat && ( + + )} + {isChat && ( + + )} +
+ )} +
+ + {!isMobile && + user.id === selectedOrder?.user_id && + selectedOrder?.transaction_status === 'active' && + selectedOrder.user_status === 'pending' && ( +
+ + +
+ )} + + ); +}; + +const mapStateToProps = (state) => ({ + pairs: state.app.pairs, + coins: state.app.coins, + constants: state.app.constants, + transaction_limits: state.app.transaction_limits, + p2p_message: state.p2p.chat, + p2p_status: state.p2p.status, + p2p_transaction_id: state.p2p.transaction_id, + user: state.user, + p2p_config: state.app.constants.p2p_config, + isChat: state.app.isChat, +}); + +export default connect(mapStateToProps)(withRouter(withConfig(P2POrder))); diff --git a/web/src/containers/P2P/P2POrder/P2POrderChat.js b/web/src/containers/P2P/P2POrder/P2POrderChat.js new file mode 100644 index 0000000000..035f72880a --- /dev/null +++ b/web/src/containers/P2P/P2POrder/P2POrderChat.js @@ -0,0 +1,373 @@ +import React, { useEffect, useRef } from 'react'; +import { isMobile } from 'react-device-detect'; +import { bindActionCreators } from 'redux'; +import { connect } from 'react-redux'; +import { Input } from 'antd'; +import { SendOutlined } from '@ant-design/icons'; +import moment from 'moment'; + +import '../_P2P.scss'; +import STRINGS from 'config/localizedStrings'; +import { EditWrapper, Image } from 'components'; +import { fetchFeedback, fetchP2PProfile } from '../actions/p2pActions'; +import { setIsChat } from 'actions/appActions'; + +const P2POrderChat = ({ + user, + ICONS, + selectedOrder, + chatMessage, + setChatMessage, + sendChatMessage, + setSelectedProfile, + setUserFeedback, + setDisplayUserFeedback, + setUserProfile, + isChat, + setIsChat, +}) => { + const ref = useRef(null); + const buttonRef = useRef(null); + + const handleKeyDown = (event) => { + if (event?.key === 'Enter') { + buttonRef.current.click(); + } + }; + + useEffect(() => { + document.addEventListener('keydown', handleKeyDown); + + return () => { + document.removeEventListener('keydown', handleKeyDown); + localStorage.setItem('isChat', false); + setIsChat(false); + }; + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + useEffect(() => { + ref.current.scroll({ + top: 9999, + behavior: 'smooth', + }); + }, [selectedOrder.messages]); + + const onHandleChat = () => { + setIsChat(false); + localStorage.setItem('isChat', false); + }; + + return ( +
+
+ {isChat && ( +
onHandleChat()}> + {'<'} + + {STRINGS['REFERRAL_LINK.BACK_LOWER']} + + + + {STRINGS['P2P.BACK_TO_ORDERS']} + + +
+ )} +
+ {'text'} + {user?.id === selectedOrder?.merchant_id ? ( + + {STRINGS['P2P.CHAT_WITH_USER']} + + ) : ( + + {STRINGS['P2P.CHAT_WITH_VENDOR']} + + )} +
+
+
+
{ + try { + if (user?.id === selectedOrder?.merchant_id) return; + setSelectedProfile(selectedOrder?.merchant); + const feedbacks = await fetchFeedback({ + merchant_id: selectedOrder?.merchant_id, + }); + const profile = await fetchP2PProfile({ + user_id: selectedOrder?.merchant_id, + }); + setUserFeedback(feedbacks?.data); + setUserProfile(profile); + setDisplayUserFeedback(true); + } catch (error) { + return error; + } + }} + > + {user?.id === selectedOrder?.merchant_id ? ( +
+ + {STRINGS['P2P.USER_NAME']} + +
+ ) : ( +
+ + {STRINGS['P2P.VENDOR_NAME']} + +
+ )} + {user?.id === selectedOrder?.merchant_id + ? ( + + {selectedOrder?.buyer?.full_name} + + ) || ( +
+ + {STRINGS['P2P.ANONYMOUS']} + +
+ ) + : ( + + {selectedOrder?.merchant?.full_name}{' '} + + ) || ( +
+ + {STRINGS['P2P.ANONYMOUS']} + +
+ )} +
+
+ {user?.id === selectedOrder?.user_id && ( +
+
+ + {STRINGS['P2P.ORDER_INITIATED']} + + + {selectedOrder?.merchant?.full_name || ( + + {STRINGS['P2P.ANONYMOUS']} + + )} + +
+ + ( + {moment(selectedOrder?.created_at).format( + 'DD/MMM/YYYY, hh:mmA' + )} + ) + +
+ )} + + {user?.id === selectedOrder?.user_id && ( +
+ + {STRINGS['P2P.CONFIRM_PAYMENT']} + +
+ )} + + {user?.id === selectedOrder?.merchant_id && ( +
+
+ + {STRINGS['P2P.ORDER_INITIATED_VENDOR']} + + + {selectedOrder?.buyer?.full_name || ( + + {STRINGS['P2P.ANONYMOUS']} + + )} + +
+ + ( + {moment(selectedOrder?.created_at)?.format( + 'DD/MMM/YYYY, hh:mmA' + )} + ) + +
+ )} + {user?.id === selectedOrder?.merchant_id && ( +
+ + {STRINGS['P2P.CONFIRM_PAYMENT_VENDOR']} + +
+ )} +
+ +
+
+ {selectedOrder?.messages?.map((message, index) => { + if (index === 0) { + return ( +
+
+ {message.sender_id === selectedOrder?.merchant_id + ? selectedOrder?.merchant?.full_name + : selectedOrder?.buyer?.full_name} + : +
+
{message.message}
+
+ ( + {moment(message?.created_at || new Date()).format( + 'DD/MMM/YYYY, hh:mmA' + )} + ) +
+
+ ); + } else { + if (message.type === 'notification') { + return ( +
+ {message.message === 'BUYER_PAID_ORDER' && + user?.id === selectedOrder?.user_id ? ( + + {STRINGS[`P2P.BUYER_SENT_FUNDS`]} + + ) : ( + + {STRINGS[`P2P.${message?.message}`]} + + )} + + ( + {moment(message?.created_at || new Date())?.format( + 'DD/MMM/YYYY, hh:mmA' + )} + ) + +
+ ); + } else { + if (message?.sender_id === user?.id) { + return ( +
+
+ + + {STRINGS['P2P.YOU']}: + + + + {message?.message} + +
+ ( + {moment(message?.created_at || new Date()).format( + 'DD/MMM/YYYY, hh:mmA' + )} + ) +
+
+
+ ); + } else { + return ( +
+
+
+
+ {message?.receiver_id === + selectedOrder?.merchant_id + ? STRINGS['P2P.BUYER'] + : selectedOrder?.merchant?.full_name} + : +
+
+ {message?.message} +
+
+
+ ( + {moment(message?.created_at || new Date())?.format( + 'DD/MMM/YYYY, hh:mmA' + )} + ) +
+
+
+ ); + } + } + } + })} +
+
+ +
+
+ { + setChatMessage(e.target.value); + }} + suffix={ +
+ + {STRINGS['P2P.SEND_UPPER']} + + +
+ } + /> +
+
+
+
+ ); +}; + +const mapDispatchToProps = (dispatch) => ({ + setIsChat: bindActionCreators(setIsChat, dispatch), +}); + +export default connect('', mapDispatchToProps)(P2POrderChat); diff --git a/web/src/containers/P2P/P2POrder/P2POrderDetails.js b/web/src/containers/P2P/P2POrder/P2POrderDetails.js new file mode 100644 index 0000000000..136a314beb --- /dev/null +++ b/web/src/containers/P2P/P2POrder/P2POrderDetails.js @@ -0,0 +1,675 @@ +import React from 'react'; +import { withRouter } from 'react-router'; +import { bindActionCreators } from 'redux'; +import { connect } from 'react-redux'; +import { isMobile } from 'react-device-detect'; +import { Button, message, Tooltip } from 'antd'; +import { CheckCircleTwoTone } from '@ant-design/icons'; + +import STRINGS from 'config/localizedStrings'; +import { Coin, EditWrapper, Image } from 'components'; +import { setIsChat } from 'actions/appActions'; + +const P2POrderDetails = ({ + user, + coin, + coins, + router, + p2p_config, + hasFeedback, + formatAmount, + userReceiveAmount, + selectedOrder, + setDisplayConfirmWarning, + setDisplayCancelWarning, + setDisplayAppealModel, + setAppealSide, + setDisplayFeedbackModel, + setIsChat, + ICONS, + updateP2PStatus, + updateStatus, + updateTransaction, +}) => { + const onHandleChat = () => { + setIsChat(true); + localStorage.setItem('isChat', true); + }; + + return ( +
+
+ +
+
+ + {STRINGS['P2P.ORDER']}: + +
+ + {selectedOrder?.transaction_id} + +
+ {user?.id === selectedOrder?.merchant_id ? ( + + {STRINGS['P2P.SELL_COIN']} + + ) : ( + + {STRINGS['P2P.BUY_COIN']} + + )}{' '} + {coin?.fullname} ({coin?.symbol?.toUpperCase()}) +
+
+ {isMobile && ( +
+ onHandleChat()}> + + + {STRINGS['USER_SETTINGS.TITLE_CHAT']?.toUpperCase()} + + + + {'text'} +
+ )} +
+ {/*
+
+ + {STRINGS['P2P.TRANSACTION_ID']} + +
+ {selectedOrder.transaction_id} +
*/} +
+
+ + {STRINGS['P2P.AMOUNT_TO']} + {' '} + + {user?.id === selectedOrder?.merchant_id + ? STRINGS['P2P.RELEASE'] + : STRINGS['P2P.SEND_UPPER']} + + : +
+
+ {user?.id === selectedOrder?.merchant_id && ( +
+ {userReceiveAmount()} + + {selectedOrder?.deal?.buying_asset?.toUpperCase()} + + +
+ )} + {user?.id === selectedOrder?.user_id && ( +
+ + {selectedOrder?.amount_fiat} + + + {selectedOrder?.deal?.spending_asset?.toUpperCase()} + + +
+ )} +
+ {user?.id === selectedOrder?.merchant_id ? ( + + {STRINGS['P2P.AMOUNT_SEND_RELEASE']} + + ) : ( + + {STRINGS['P2P.REQUIRED_FLAT_TRANSFER_AMOUNT']} + + )} +
+
+
+
+
+ {STRINGS['P2P.PRICE']} + : +
+
+
+ + {formatAmount( + selectedOrder?.deal?.spending_asset, + selectedOrder?.price + )} + + + {selectedOrder?.deal?.spending_asset?.toUpperCase()} + + +
+
+ + + {STRINGS['P2P.PER_COIN']} + {' '} + + {selectedOrder?.deal?.buying_asset?.toUpperCase()} + +
+
+
+
+
+ + {STRINGS['P2P.RECEIVING_AMOUNT']} + + : +
+ {user?.id === selectedOrder?.merchant_id && ( +
+
+ + {selectedOrder?.amount_fiat} + + + {selectedOrder?.deal?.spending_asset?.toUpperCase()} + + +
+
+ {selectedOrder?.deal?.spending_asset?.toUpperCase()} + + + {STRINGS['P2P.SPENDING_AMOUNT']} + + +
+
+ )} + + {user?.id === selectedOrder?.user_id && ( +
+
+ {userReceiveAmount()} + + {selectedOrder?.deal?.buying_asset?.toUpperCase()} + + +
+
+ {selectedOrder?.deal?.buying_asset?.toUpperCase()} + + + {STRINGS['P2P.BUYING_AMOUNT']} + + +
+
+ )} +
+
+
+ {STRINGS['P2P.FEE']}: +
+ {user?.id === selectedOrder?.merchant_id && ( +
+
{p2p_config?.merchant_fee}%
+
+ )} + + {user?.id === selectedOrder?.user_id && ( +
+
{p2p_config?.user_fee}%
+
+ )} +
+
+
+ + {STRINGS['P2P.TRANSFER_DETAILS']} + +
+ {user?.id === selectedOrder?.user_id && ( +
+ + {STRINGS['P2P.PAYMENT_INSTRUCTIONS']} + +
+ )} + + {user?.id === selectedOrder?.merchant_id && ( +
+ + {STRINGS['P2P.PAYMENT_ACCOUNT']} + +
+ )} + +
+
+
+ + {STRINGS['P2P.PAYMENT_METHOD']} + + : +
+
{selectedOrder?.payment_method_used?.system_name}
+
+ + {selectedOrder?.payment_method_used?.fields?.map((x) => { + return ( +
+
{x?.name}:
+
{x?.value}
+
+ ); + })} +
+
+ +
+ {/*
+ + {STRINGS['P2P.EXPECTED_TIME']} + +
*/} + + {user?.id === selectedOrder?.user_id && ( + <> + {selectedOrder?.user_status === 'pending' && ( + <> +
+ + {STRINGS['P2P.PAYMENT_TIME']} + +
+
+ + {STRINGS['P2P.ORDER_CANCELLED']} + +
+ + )} + + {selectedOrder?.user_status === 'confirmed' && ( +
+ + {STRINGS['P2P.FUNDS_CREDITED']} + +
+ )} + + {selectedOrder?.merchant_status === 'cancelled' && ( +
+ + {STRINGS['P2P.VENDOR_CANCELLED']} + +
+ )} + + {selectedOrder?.merchant_status === 'confirmed' && ( +
+
+ + + +
+ + {STRINGS['P2P.ORDER_COMPLETE']} + +
+
+
+ + {STRINGS['P2P.FUNDS_TRANSFERRED']} + +
+
{ + router.replace('/transactions?tab=deposits'); + }} + > + + + {STRINGS['P2P.GO_DEPOSIT']} + + +
+ {!hasFeedback && ( + + )} +
+ )} + {selectedOrder?.merchant_status === 'appeal' && ( + <> +
+ + {STRINGS['P2P.VENDOR_APPEALED']} + +
+ + )} + {selectedOrder?.user_status === 'appeal' && ( + <> +
+ + {STRINGS['P2P.USER_APPEALED']} + +
+ + )} + + )} + + {user?.id === selectedOrder?.merchant_id && ( + <> + {selectedOrder.merchant_status === 'confirmed' && ( +
+
+ + + +
+ + {STRINGS['P2P.ORDER_COMPLETE']} + +
+
+
+ + {STRINGS['P2P.ORDER_COMPLETE_VENDOR']} + +
+
{ + router.replace('/transactions?tab=withdrawals'); + }} + > + + + {STRINGS['P2P.GO_WITHDRAWALS']} + + +
+
+ )} + + {selectedOrder?.user_status === 'pending' && ( + <> +
+ + {STRINGS['P2P.PAYMENT_NOT_SENT']} + +
+
+ + {STRINGS['P2P.CONFIRM_AND_RELEASE']} + +
+ + )} + {selectedOrder?.user_status === 'cancelled' && ( +
+ + {STRINGS['P2P.TRANSACTION_CANCELLED']} + +
+ )} + {selectedOrder?.user_status === 'confirmed' && + selectedOrder?.merchant_status !== 'confirmed' && ( + <> +
+ + {STRINGS['P2P.BUYER_CONFIRMED']} + +
+
+ + {STRINGS['P2P.CHECK_AND_RELEASE']} + +
+ + )} + {user?.id === selectedOrder?.user_id && + selectedOrder.user_status === 'appeal' && ( +
+ + {STRINGS['P2P.USER_APPEALED']} + +
+ )} + + {user?.id === selectedOrder?.merchant_id && + selectedOrder.user_status === 'appeal' && ( +
+ + {STRINGS['P2P.BUYER_APPEALED_ORDER']} + +
+ )} + + )} + +
+ {user?.id === selectedOrder?.user_id && ( + <> + {selectedOrder?.user_status === 'confirmed' && + selectedOrder?.merchant_status === 'pending' && ( + <> +
{ + try { + setDisplayAppealModel(true); + setAppealSide('user'); + } catch (error) { + message.error(error.data.message); + } + }} + > + + + {STRINGS['P2P.APPEAL']} + + +
+
{ + setDisplayCancelWarning(true); + }} + > + + + + {STRINGS['P2P.CANCEL_ORDER']} + + + +
+ + )} + + )} + + {user?.id === selectedOrder?.merchant_id && + selectedOrder?.merchant_status === 'pending' && ( + +
{ + try { + setDisplayAppealModel(true); + setAppealSide('merchant'); + } catch (error) { + message.error(error.data.message); + } + }} + className="appeal-link blue-link" + > + + {STRINGS['P2P.APPEAL']} + +
+ + + + +
+ )} + {user?.id === selectedOrder?.merchant_id && + selectedOrder?.merchant_status === 'appeal' && ( +
+ + {STRINGS['P2P.USER_APPEALED']} + +
+ )} +
+
+ {user.id === selectedOrder?.user_id && + selectedOrder?.transaction_status === 'active' && + selectedOrder.user_status === 'pending' && ( +
+ + +
+ )} +
+ ); +}; + +const mapDispatchToProps = (dispatch) => ({ + setIsChat: bindActionCreators(setIsChat, dispatch), +}); + +export default connect('', mapDispatchToProps)(withRouter(P2POrderDetails)); diff --git a/web/src/containers/P2P/P2POrders.js b/web/src/containers/P2P/P2POrders.js index 81d410de48..19256c33ec 100644 --- a/web/src/containers/P2P/P2POrders.js +++ b/web/src/containers/P2P/P2POrders.js @@ -1,18 +1,20 @@ -/* eslint-disable */ import React, { useEffect, useState } from 'react'; +import { withRouter } from 'react-router'; import { connect } from 'react-redux'; -// import { ReactSVG } from 'react-svg'; +import { isMobile } from 'react-device-detect'; +import { Button } from 'antd'; +import { CheckCircleTwoTone, PlaySquareTwoTone } from '@ant-design/icons'; -import { IconTitle, EditWrapper } from 'components'; +import './_P2P.scss'; +import classnames from 'classnames'; import STRINGS from 'config/localizedStrings'; import withConfig from 'components/ConfigProvider/withConfig'; -import { Button, Radio } from 'antd'; +import Filter from './Filters'; +import NoDealsData from './Utilis'; +import { Coin, EditWrapper } from 'components'; import { fetchTransactions } from './actions/p2pActions'; -import { withRouter } from 'react-router'; import { formatToCurrency } from 'utils/currency'; -import { isMobile } from 'react-device-detect'; -import classnames from 'classnames'; -import './_P2P.scss'; + const P2POrders = ({ data, onClose, @@ -28,233 +30,305 @@ const P2POrders = ({ user, router, changeProfileTab, + tab, }) => { const [transactions, setTransactions] = useState([]); const [filter, setFilter] = useState(); - const [option, setOption] = useState('2'); + const [transactionDetails, setTransactionDetails] = useState([]); + // const [option, setOption] = useState('2'); + const [transactionStatus, setTransactionStatus] = useState('P2P.ALL_ORDERS'); + const [isFilter, setIsFilter] = useState(false); + + const orderStatus = ['P2P.PROCESSING', 'P2P.ALL_ORDERS']; + const digitalCurrencies = localStorage?.getItem('digitalCurrencies'); + const selectedCurrencies = JSON.parse(digitalCurrencies); useEffect(() => { fetchTransactions() .then((res) => { setTransactions(res.data); + setTransactionDetails(res.data); }) .catch((err) => err); }, [refresh]); + useEffect(() => { + if (tab !== 1 && isMobile) { + setIsFilter(false); + } + }, [tab]); + const formatAmount = (currency, amount) => { const min = coins[currency].min; const formattedAmount = formatToCurrency(amount, min); return formattedAmount; }; + const handleStatus = (status) => { + setTransactionStatus(status); + if (status === 'P2P.PROCESSING') { + setFilter('active'); + setTransactions(transactionDetails); + } + if (status === 'P2P.ALL_ORDERS') { + setFilter(); + } + }; return (
0 + ? 'P2pOrder p2p-order-tab-container' + : 'P2pOrder p2p-order-tab-container p2p-no-deals-container', + isMobile ? 'mobile-view-p2p' : '', + ] + )} > -
- setOption(e.target.value)}> - { - setFilter('active'); - }} - > - - {STRINGS['P2P.PROCESSING']} - - - { - setFilter(); - }} +
+ {orderStatus?.map((status) => { + return ( +
handleStatus(status)} + > + {STRINGS[status]} +
+ ); + })} + {isMobile && ( + setIsFilter(!isFilter)} > - - {STRINGS['P2P.ALL_ORDERS']} - - - + { + + + {isFilter + ? STRINGS['P2P.HIDE_FILTERS'] + : STRINGS['P2P.SHOW_FILTERS']} + + + } + + )}
+ {((transactionStatus === 'P2P.ALL_ORDERS' && !isMobile) || isFilter) && ( + + )} +
+ {transactions?.length > 0 ? ( + + + + + + + + + + + + + + {transactions + ?.filter((x) => + filter + ? ['active', 'appealed']?.includes(x?.transaction_status) + : true + ) + ?.map((transaction) => { + const statusClassMap = { + complete: 'active-green', + appealed: 'active-orange', + active: 'active-yellow', + }; -
-
+ + {STRINGS['P2P.TYPE_COIN']} + + + + {STRINGS['P2P.FIAT_AMOUNT']} + + + + {STRINGS['P2P.PRICE']} + + + + {STRINGS['P2P.CRYPTO_AMOUNT']} + + + + {STRINGS['P2P.COUNTERPARTY']} + + + + {STRINGS['P2P.STATUS']} + + + + {STRINGS['P2P.OPERATION']} + +
- - - - - - - - - - - - - {transactions - .filter((x) => - filter - ? ['active', 'appealed'].includes(x.transaction_status) - : true - ) - .map((transaction) => { - return ( - - + + + + + + + )} + + - - - - - - - - - ); - })} - -
- - {STRINGS['P2P.TYPE_COIN']} - - - - {STRINGS['P2P.FIAT_AMOUNT']} - - - - {STRINGS['P2P.PRICE']} - - - - {STRINGS['P2P.CRYPTO_AMOUNT']} - - - - {STRINGS['P2P.COUNTERPARTY']} - - - - {STRINGS['P2P.STATUS']} - - - - {STRINGS['P2P.OPERATION']} - -
- {transaction?.user_id === user.id ? ( -
+ {transaction?.user_id === user?.id ? ( + + ) : ( + + )} + + {transaction?.amount_fiat} + + {transaction?.deal?.spending_asset?.toUpperCase()} + + + + {formatAmount( + transaction?.deal?.buying_asset, + transaction?.price + )} + + + {transaction?.deal?.buying_asset?.toUpperCase()} + + +
+ + {formatAmount( + transaction?.deal?.buying_asset, + transaction?.amount_digital_currency + )} + - - {STRINGS['P2P.BUY_COIN']} - - {` ${transaction?.deal?.buying_asset?.toUpperCase()}`} + {transaction?.deal?.buying_asset?.toUpperCase()} + + +
+
+ {transaction?.user_id === user?.id ? ( + { + changeProfileTab(transaction?.merchant); + }} + > + {transaction?.merchant?.full_name || ( + + {STRINGS['P2P.ANONYMOUS']} + + )} - - ) : ( - - )} - +
+ + {transaction?.transaction_status} + + {transaction?.transaction_status === 'complete' && ( + + + + )} + {transaction?.transaction_status === 'active' && ( + + + + )} +
+
- {transaction?.amount_fiat}{' '} - {transaction?.deal?.spending_asset?.toUpperCase()} - - {formatAmount( - transaction?.deal?.buying_asset, - transaction?.price - )}{' '} - {transaction?.deal?.buying_asset?.toUpperCase()} - - {formatAmount( - transaction?.deal?.buying_asset, - transaction?.amount_digital_currency - )}{' '} - {transaction?.deal?.buying_asset?.toUpperCase()} - - {transaction?.user_id === user.id ? ( - +
{ - changeProfileTab(transaction?.merchant); + setDisplayOrder(true); + setSelectedTransaction(transaction); + router.replace(`/p2p/order/${transaction?.id}`); }} > - {transaction?.merchant?.full_name || ( - - {STRINGS['P2P.ANONYMOUS']} - - )} - - ) : ( - - {transaction?.buyer?.full_name || ( - - {STRINGS['P2P.ANONYMOUS']} - - )} - - )} -
- {transaction?.transaction_status?.toUpperCase()} - -
{ - setDisplayOrder(true); - setSelectedTransaction(transaction); - router.replace(`/p2p/order/${transaction.id}`); - }} - style={{ - display: 'flex', - justifyContent: 'flex-end', - cursor: 'pointer', - }} - className="purpleTextP2P" - > - - {STRINGS['P2P.VIEW_ORDER']} - -
-
+ + + {STRINGS['P2P.VIEW_ORDER']} + + +
+ + + ); + })} + + + ) : ( + + )}
); diff --git a/web/src/containers/P2P/P2PPostDeal.js b/web/src/containers/P2P/P2PPostDeal.js index b99204fa5c..6330e024b4 100644 --- a/web/src/containers/P2P/P2PPostDeal.js +++ b/web/src/containers/P2P/P2PPostDeal.js @@ -1,22 +1,24 @@ -/* eslint-disable */ import React, { useEffect, useState } from 'react'; import { connect } from 'react-redux'; -import { ReactSVG } from 'react-svg'; -import { Button, Steps, message, Modal } from 'antd'; -import { IconTitle, EditWrapper } from 'components'; -import { getBroker } from 'containers/Admin/Trades/actions'; -import { createTestBroker } from 'containers/Admin/Trades/actions'; -import STRINGS from 'config/localizedStrings'; -import withConfig from 'components/ConfigProvider/withConfig'; -import { Switch, Select, Input, InputNumber } from 'antd'; -import { postDeal, editDeal, getQuickTrade } from './actions/p2pActions'; -import { CloseOutlined } from '@ant-design/icons'; -import { formatToCurrency } from 'utils/currency'; -import { COUNTRIES_OPTIONS } from 'utils/countries'; import { isMobile } from 'react-device-detect'; +import { Button, message } from 'antd'; +import { Switch, Select, Input, InputNumber } from 'antd'; +import { + ArrowRightOutlined, + ExclamationCircleFilled, + SyncOutlined, +} from '@ant-design/icons'; + +import './_P2P.scss'; import classnames from 'classnames'; +import STRINGS from 'config/localizedStrings'; import BigNumber from 'bignumber.js'; -import './_P2P.scss'; +import withConfig from 'components/ConfigProvider/withConfig'; +import P2PPostDealMobile from './P2PPostDealMobile'; +import { Coin, Dialog, EditWrapper } from 'components'; +import { COUNTRIES_OPTIONS } from 'utils/countries'; +import { createTestBroker } from 'containers/Admin/Trades/actions'; +import { editDeal, postDeal } from './actions/p2pActions'; const P2PPostDeal = ({ data, @@ -29,6 +31,7 @@ const P2PPostDeal = ({ transaction_limits, tiers = {}, p2p_config, + tab, setTab, setRefresh, refresh, @@ -52,23 +55,16 @@ const P2PPostDeal = ({ const [paymentMethods, setPaymentMethods] = useState([]); const [selectedMethod, setSelectedMethod] = useState({}); const [addMethodDetails, setAddMethodDetails] = useState(); + const [isEditMode, setIsEditMode] = useState(false); const [region, setRegion] = useState(); const [brokerData, setBrokerData] = useState([]); const [dynamicPair, setDynamicPair] = useState(); const [dynamicRate, setDynamicRate] = useState(); - - const dataSte = [ - { - title: STRINGS['P2P.STEP_SET_TYPE_PRICE'], - }, - { - title: STRINGS['P2P.STEP_SET_TOTAL_AMOUNT_PAYMENT_METHODS'], - }, - { - title: STRINGS['P2P.STEP_SET_TERMS_AUTO_RESPONSE'], - }, - ]; - const { Step } = Steps; + const [currStep, setCurrStep] = useState({ + stepOne: true, + stepTwo: false, + stepThree: false, + }); useEffect(() => { if (selectedDealEdit) { @@ -87,24 +83,19 @@ const P2PPostDeal = ({ setP2pSide(selectedDealEdit?.side); setStep(1); } else { - setPriceType('static'); - setBuyingAsset(); - setSpendingAsset(); - setExchangeRate(); - setSpread(); - setTotalOrderAmount(); - setMinOrderValue(); - setMaxOrderValue(); - setTerms(); - setAutoResponse(); - setPaymentMethods([]); - setRegion(); - setStep(1); + onHandleDeals(); } getBrokerData(); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [selectedDealEdit]); + useEffect(() => { + return () => { + onHandleDeals(); + }; + }, [tab]); + const getBrokerData = async () => { try { const res = broker; @@ -146,999 +137,1314 @@ const P2PPostDeal = ({ return formatAmount(asset, amount); }; - return ( -
-
- - {dataSte.map((item, index) => ( - - ))} - -
+ const onHandleDeals = () => { + setDynamicRate(); + setPriceType('static'); + setBuyingAsset(); + setSpendingAsset(); + setExchangeRate(); + setSpread(); + setTotalOrderAmount(); + setMinOrderValue(); + setMaxOrderValue(); + setTerms(); + setAutoResponse(); + setPaymentMethods([]); + setRegion(); + setStep(1); + setCurrStep({ + stepOne: true, + stepTwo: false, + stepThree: false, + }); + }; + const handleNextStep = async () => { + if ( + step === 1 && + (!priceType || + !buyingAsset || + !spendingAsset || + (priceType === 'static' && !exchangeRate) || + (priceType === 'dynamic' && !dynamicRate)) + ) { + message.error(STRINGS['P2P.PLEASE_FILL_INPUTS']); + return; + } -
-
-
- - - {STRINGS['P2P.I_WANT_TO_BUY']} - - - - { - if (step !== 1) return; - if (p2p_config.side === 'sell' && !checked) return; - if (p2p_config.side === 'buy' && checked) return; + if ( + step === 2 && + (!totalOrderAmount || + !minOrderValue || + !maxOrderValue || + paymentMethods.length === 0 || + !region) + ) { + message.error(STRINGS['P2P.PLEASE_FILL_INPUTS']); + return; + } - if (checked) { - setP2pSide('sell'); - } else { - setP2pSide('buy'); - } - }} - /> - - - - {STRINGS['P2P.I_WANT_TO_SELL']} - - -
+ if (step < 3) { + if (step === 1) { + setCurrStep({ + ...currStep, + stepTwo: true, + }); + } + if (step === 2) { + setCurrStep({ + ...currStep, + stepThree: true, + }); + } + setStep(step + 1); + } else { + try { + if (autoResponse.length > 240) { + message.error(STRINGS['P2P.AUTO_RESPONSE_LIMIT']); + return; + } - {selectedDealEdit && ( -
+ if (terms.length > 240) { + message.error(STRINGS['P2P.TERMS_RESPONSE_LIMIT']); + return; + } + + if (selectedDealEdit) { + await editDeal({ + id: selectedDealEdit.id, + side: p2pSide, + price_type: priceType, + dynamic_pair: dynamicPair, + buying_asset: buyingAsset, + spending_asset: spendingAsset, + exchange_rate: Number(exchangeRate || 0), + spread: Number(spread), + region, + total_order_amount: Number(totalOrderAmount), + min_order_value: Number(minOrderValue), + max_order_value: Number(maxOrderValue), + terms: terms, + auto_response: autoResponse, + payment_methods: paymentMethods, + }); + setSelectedDealEdit(); + } else { + await postDeal({ + side: p2pSide, + price_type: priceType, + dynamic_pair: dynamicPair, + buying_asset: buyingAsset, + spending_asset: spendingAsset, + exchange_rate: Number(exchangeRate || 0), + spread: Number(spread), + region, + total_order_amount: Number(totalOrderAmount), + min_order_value: Number(minOrderValue), + max_order_value: Number(maxOrderValue), + terms: terms, + auto_response: autoResponse, + payment_methods: paymentMethods, + }); + } + + setPriceType('static'); + setBuyingAsset(); + setSpendingAsset(); + setExchangeRate(); + setSpread(); + setTotalOrderAmount(); + setMinOrderValue(); + setMaxOrderValue(); + setTerms(); + setAutoResponse(); + setPaymentMethods([]); + setRegion(); + setStep(1); + setCurrStep({ + stepOne: true, + stepTwo: false, + stepThree: false, + }); + + message.success( + `${ + selectedDealEdit + ? STRINGS['P2P.DEAL_EDITED'] + : STRINGS['P2P.DEAL_CREATED'] + }` + ); + setTab('4'); + setRefresh(!refresh); + } catch (error) { + message.error(error.data.message); + } + } + }; + + const handlePreviousStep = () => { + if (step > 1) { + setStep(step - 1); + if (step === 2) { + setCurrStep({ + ...currStep, + stepTwo: false, + }); + if (!selectedDealEdit) { + setTotalOrderAmount(); + setMinOrderValue(); + setMaxOrderValue(); + setPaymentMethods([]); + setRegion(); + } + } + if (step === 3) { + setCurrStep({ + ...currStep, + stepThree: false, + }); + if (!selectedDealEdit) { + setTerms(); + setAutoResponse(); + } + } + } + }; + + return ( +
+
+ {!isMobile && selectedDealEdit && ( +
+ + + +
- {STRINGS['P2P.UPDATE_DEAL']} + + {STRINGS['P2P.UPDATE_DEAL']} +
- )} - - {step === 1 && ( -
-
-
-
- {p2pSide === 'sell' ? ( - - {STRINGS['P2P.SELL_UPPER']} - - ) : ( - - {STRINGS['P2P.BUY_UPPER']} +
+ )} + {!isMobile ? ( +
+
+
+ {STRINGS['P2P.STEP_SET_TYPE_PRICE']} +
+
+ + {STRINGS['P2P.STEP_SET_TOTAL_AMOUNT_PAYMENT_METHODS']} + +
+
+ + {STRINGS['P2P.STEP_SET_TERMS_AUTO_RESPONSE']} + +
+
+
+ + 1 + + + + 2 + + + + 3 + +
+
+
+ {step === 1 && ( +
+ + + {STRINGS['P2P.I_WANT_TO_BUY']} - )} -
-
- -
-
- - {STRINGS['P2P.CRYPTO_WANT_TO_SELL']} - + + {STRINGS['P2P.I_WANT_TO_SELL']} + +
-
-
- {/* {'>'} */} -
-
-
+ )} + {(step === 2 || step === 3) && ( +
{p2pSide === 'sell' ? ( - - {STRINGS['P2P.RECEIVE']} - +
+ {buyingAsset?.toUpperCase()} + )} + > + {STRINGS.formatString( + STRINGS['P2P.SELLING'], + {buyingAsset?.toUpperCase()} + )} + +
) : ( - - {STRINGS['P2P.SEND_UPPER']} - +
+ {spendingAsset?.toUpperCase()} + )} + > + {STRINGS.formatString( + STRINGS['P2P.BUYING'], + {spendingAsset?.toUpperCase()} + )} + +
)}
-
- -
-
- - {STRINGS['P2P.FIAT_CURRENCY_WANT_TO_RECEIVE']} - -
-
-
-
-
-
-
- - {STRINGS['P2P.TYPE']} - - : -
-
- -
- - {priceType === 'static' && ( - <> -
- - {STRINGS['P2P.PRICE_UPPER']} - {' '} - {spendingAsset - ? `(${spendingAsset?.toUpperCase()})` - : ''} -
+ )} + {step === 1 && ( +
+
- { - if (!buyingAsset) return; - if (isNaN(e)) return; - if (e >= 0) { - setExchangeRate(e); - } - }} - /> +
+ {p2pSide === 'sell' ? ( + + {STRINGS['P2P.SELL_UPPER']} + + ) : ( + + {STRINGS['P2P.BUY_UPPER']} + + )} +
+
+ {buyingAsset && ( + + )} + +
+
+ {p2pSide === 'sell' ? ( + + {STRINGS['P2P.CRYPTO_WANT_TO_SELL']} + + ) : ( + + {STRINGS['P2P.CRYPTO_WANT_TO_BUY']} + + )} +
- - )} - - {priceType === 'dynamic' && ( - <> -
- - {STRINGS['P2P.PRICE_UPPER']} - {' '} - {spendingAsset - ? `(${spendingAsset?.toUpperCase()})` - : ''} +
+
- { + setSpendingAsset(e); + }} + > + {p2p_config?.fiat_currencies?.map((coin) => ( + + {coin?.toUpperCase()} ))} - + +
+
+ {p2pSide === 'sell' ? ( + + {STRINGS['P2P.FIAT_CURRENCY_WANT_TO_RECEIVE']} + + ) : ( + + {STRINGS['P2P.FIAT_CURRENCY_WANT_TO_SPEND']} + + )} +
-
Rate: {formatAmount('', dynamicRate) || '-'}
- - )} - -
- - {STRINGS['P2P.SPREAD_PERCENTAGE']} - -
-
- { - if (isNaN(e)) return; - if (e >= 0) { - setSpread(e); - } - }} - /> -
-
- - {STRINGS['P2P.PRICE_PROFIT_SPREAD_SET']} - -
-
-
- {/* {'>'} */} -
- - {exchangeRate && ( -
-
- - {STRINGS['P2P.UNIT_PRICE']} - -
-
- {formatRate(exchangeRate, spread, spendingAsset)} -
-
- {p2pSide === 'sell' ? ( - - {STRINGS['P2P.PRICE_ADVERTISE_SELL']} - - ) : ( - - {STRINGS['P2P.PRICE_ADVERTISE_BUY']} - - )}{' '} - {buyingAsset ? `${buyingAsset?.toUpperCase()}` : ''} -
-
- )} - - {dynamicRate && ( -
-
- - {STRINGS['P2P.UNIT_PRICE']} - -
-
- {formatRate(dynamicRate, spread, spendingAsset)} -
-
- {p2pSide === 'sell' ? ( - - {STRINGS['P2P.PRICE_ADVERTISE_SELL']} - - ) : ( - - {STRINGS['P2P.PRICE_ADVERTISE_BUY']} - - )}{' '} - {buyingAsset ? `${buyingAsset?.toUpperCase()}` : ''} -
-
- )} -
-
- )} - - {step === 2 && ( -
-
-
- {p2pSide === 'sell' ? ( -
- - {STRINGS['P2P.TOTAL_ASSET_SELL_1']} - {' '} - {buyingAsset?.toUpperCase()}{' '} - - {STRINGS['P2P.TOTAL_ASSET_SELL_2']} - -
- ) : ( -
- - {STRINGS['P2P.TOTAL_ASSET_SELL_1']} - {' '} - {spendingAsset?.toUpperCase()}{' '} - - {STRINGS['P2P.TOTAL_ASSET_SEND_2']} - -
- )} - -
- { - setTotalOrderAmount(e.target.value); - }} - /> -
- -
- - {p2pSide === 'sell' ? ( -
- - {STRINGS['P2P.BUY_ORDER_LIMITS']} - -
- ) : ( -
- - {STRINGS['P2P.SELL_ORDER_LIMITS']} - -
- )} - - {p2pSide === 'sell' ? ( -
- - {STRINGS['P2P.MIN_MAX_ORDER_VALUE_1']} - {' '} - {spendingAsset?.toUpperCase()}{' '} - - {STRINGS['P2P.MIN_MAX_ORDER_VALUE_2']} - {' '} - {spendingAsset?.toUpperCase()}
- ) : ( -
- - {STRINGS['P2P.MIN_MAX_ORDER_VALUE_1']} - {' '} - {buyingAsset?.toUpperCase()}{' '} - - {STRINGS['P2P.MIN_MAX_ORDER_VALUE_3']} - {' '} - {buyingAsset?.toUpperCase()} -
- )} +
+
+
+
+ + {STRINGS['P2P.TYPE']} + + : +
+
+ +
+
+ {priceType === 'static' && ( +
+
+ + {STRINGS['P2P.PRICE_UPPER']} + {' '} + {/* {spendingAsset + ? `(${spendingAsset?.toUpperCase()})` + : ''} */} +
+
+ { + if (!buyingAsset) return; + if (isNaN(e)) return; + if (e >= 0) { + setExchangeRate(e); + } + }} + /> +
+
+ )} -
-
-
- { - setMinOrderValue(e.target.value); - }} - /> + {priceType === 'dynamic' && ( +
+
+ + {STRINGS['P2P.PRICE_UPPER']} + {' '} + {/* {spendingAsset + ? `(${spendingAsset?.toUpperCase()})` + : ''} */} +
+
+ +
+
+ + + {STRINGS['P2P.RATE']} + + + + {' '} + {dynamicRate + ? `$${formatAmount('', dynamicRate)}` + : '-'} + +
+
+ )} +
+
+ + {STRINGS['P2P.SPREAD_PERCENTAGE']} + +
+
+ { + if (isNaN(e)) return; + if (e >= 0) { + setSpread(e); + } + }} + /> +
+
+ + {STRINGS['P2P.PRICE_PROFIT_SPREAD_SET']} + +
+
- {p2pSide === 'sell' && ( -
- {minOrderValue - ? ( - minOrderValue / - formatRate( - exchangeRate || dynamicRate, - spread, - spendingAsset - ) - ).toFixed(4) + - ' ' + - buyingAsset?.toUpperCase() - : ''}{' '} + {(exchangeRate || dynamicRate) && ( +
{'='}
+ )} + {exchangeRate && ( +
+
+ + {STRINGS['P2P.UNIT_PRICE']} + +
+
+ ${formatRate(exchangeRate, spread, spendingAsset)} + {spendingAsset?.toUpperCase()} +
+
+ {p2pSide === 'sell' ? ( + {STRINGS['SIDES.SELL']} + )} + > + {STRINGS.formatString( + STRINGS['P2P.PRICE_ADVERTISE'], + + {STRINGS['SIDES.SELL']} + + )} + + ) : ( + {STRINGS['SIDES.BUY']} + )} + > + {STRINGS.formatString( + STRINGS['P2P.PRICE_ADVERTISE'], + + {STRINGS['SIDES.BUY']} + + )} + + )}{' '} + {/* {buyingAsset ? `${buyingAsset?.toUpperCase()}` : ''} */} +
)} -
-
-
- { - setMaxOrderValue(e.target.value); - }} - /> -
- {p2pSide === 'sell' && ( -
- {maxOrderValue - ? ( - maxOrderValue / - formatRate( - exchangeRate || dynamicRate, - spread, - spendingAsset - ) - ).toFixed(4) + - ' ' + - buyingAsset?.toUpperCase() - : ''}{' '} + + {dynamicRate && ( +
+
+ + {STRINGS['P2P.UNIT_PRICE']} + +
+
+ ${formatRate(dynamicRate, spread, spendingAsset)} + {spendingAsset?.toUpperCase()} +
+
+ {p2pSide === 'sell' ? ( + {STRINGS['SIDES.SELL']} + )} + > + {STRINGS.formatString( + STRINGS['P2P.PRICE_ADVERTISE'], + + {STRINGS['SIDES.SELL']} + + )} + + ) : ( + {STRINGS['SIDES.BUY']} + )} + > + {STRINGS.formatString( + STRINGS['P2P.PRICE_ADVERTISE'], + + {STRINGS['SIDES.BUY']} + + )} + + )}{' '} + {/* {buyingAsset ? `${buyingAsset?.toUpperCase()}` : ''} */} +
)}
-
-
-
-
- {p2pSide === 'sell' ? ( -
-
- - {STRINGS['P2P.PAYMENT_METHODS_SEND_FIAT']} - -
-
- - {STRINGS['P2P.SELECT_PAYMENT_METHODS_1']} - {' '} - {p2p_config?.bank_payment_methods?.length || 0}{' '} - - {STRINGS['P2P.SELECT_PAYMENT_METHODS_2']} - {' '} - {spendingAsset?.toUpperCase()} -
+ )} - {p2p_config?.bank_payment_methods?.map((method) => { - return ( -
-
x.system_name === method.system_name - ) - ? 'whiteTextP2P' - : 'greyTextP2P' - } - onClick={() => { - const newSelected = [...paymentMethods]; + {step === 2 && ( +
+
+
+
+ {p2pSide === 'sell' ? ( +
+
+ + {STRINGS['P2P.TOTAL_AMOUNT']} + +
+
+ + {buyingAsset?.toUpperCase()} + + + {STRINGS.formatString( + STRINGS['P2P.BUY_SELL_DESC'], + STRINGS['SIDES_VALUES.sell'] + )} + +
+
+ ) : ( +
+
+ + {STRINGS['P2P.TOTAL_AMOUNT']} + +
+
+ + {spendingAsset?.toUpperCase()} + + + {STRINGS.formatString( + STRINGS['P2P.BUY_SELL_DESC'], + STRINGS['SIDES_VALUES.buy'] + )} + +
+
+ )} - if ( - newSelected.find( - (x) => x.system_name === method.system_name - ) - ) { - setPaymentMethods( - newSelected.filter( - (x) => x.system_name !== method.system_name - ) - ); - } else { - newSelected.push(method); - setPaymentMethods(newSelected); - setSelectedMethod(method); - setAddMethodDetails(true); +
+ { + setTotalOrderAmount(e.target.value); + }} + suffix={ +
+ + {p2pSide === 'sell' + ? buyingAsset?.toUpperCase() + : spendingAsset?.toUpperCase()} + + +
} - }} - > -
{method.system_name}
- {paymentMethods?.find( - (x) => x.system_name === method.system_name - ) &&
} + />
- {paymentMethods?.find( - (x) => x.system_name === method.system_name - ) && ( -
{ - setSelectedMethod(method); - setAddMethodDetails(true); - }} - className="whiteTextP2P" - style={{ cursor: 'pointer' }} - > - - - {STRINGS['P2P.EDIT_UPPERCASE']} - +
+ +
+ {p2pSide === 'sell' ? ( +
+ + {STRINGS['P2P.BUY_ORDER_LIMITS']} + +
+ ) : ( +
+ + {STRINGS['P2P.SELL_ORDER_LIMITS']}
)} + + {p2pSide === 'sell' ? ( +
+ {spendingAsset?.toUpperCase()}, + STRINGS['P2P.MIN_MAX_ORDER_VALUE_3'] + )} + > + {STRINGS.formatString( + STRINGS['P2P.MIN_MAX_ORDER_VALUE_1'], + {spendingAsset?.toUpperCase()}, + STRINGS['P2P.MIN_MAX_ORDER_VALUE_3'] + )} + {' '} +
+ ) : ( +
+ {buyingAsset?.toUpperCase()}, + STRINGS['P2P.MIN_MAX_ORDER_VALUE_2'] + )} + >{' '} + {STRINGS.formatString( + STRINGS['P2P.MIN_MAX_ORDER_VALUE_1'], + {buyingAsset?.toUpperCase()}, + STRINGS['P2P.MIN_MAX_ORDER_VALUE_2'] + )} +
+ )} + +
+
+
+ { + setMinOrderValue(e.target.value); + }} + suffix={ + p2pSide === 'sell' + ? spendingAsset?.toUpperCase() + : buyingAsset?.toUpperCase() + } + /> +
+ {p2pSide === 'sell' && ( +
+ {minOrderValue + ? ( + minOrderValue / + formatRate( + exchangeRate || dynamicRate, + spread, + spendingAsset + ) + ).toFixed(4) + + ' ' + + buyingAsset?.toUpperCase() + : ''}{' '} +
+ )} +
+ ~ +
+
+ { + setMaxOrderValue(e.target.value); + }} + suffix={ + p2pSide === 'sell' + ? spendingAsset?.toUpperCase() + : buyingAsset?.toUpperCase() + } + /> +
+ {p2pSide === 'sell' && ( +
+ {maxOrderValue + ? ( + maxOrderValue / + formatRate( + exchangeRate || dynamicRate, + spread, + spendingAsset + ) + ).toFixed(4) + + ' ' + + buyingAsset?.toUpperCase() + : ''}{' '} +
+ )} +
+
- ); - })} -
- ) : ( -
-
- - {STRINGS['P2P.PAYMENT_METHODS_SEND_FIAT']} - -
-
- - {STRINGS['P2P.SELECT_PAYMENT_METHODS_1']} - {' '} - {p2p_config?.bank_payment_methods?.length || 0}{' '} - - {STRINGS['P2P.SELECT_PAYMENT_METHODS_2']} - {' '} - {spendingAsset?.toUpperCase()} +
+
+ {p2pSide === 'sell' ? ( +
+
+ + {STRINGS['P2P.PAYMENT_METHODS_RECEIVE_FIAT']} + +
+
+ + {STRINGS['P2P.SELECT_PAYMENT_METHODS_1']} + {' '} + {p2p_config?.bank_payment_methods?.length || 0}{' '} + + {STRINGS['P2P.SELECT_PAYMENT_METHODS_2']} + {' '} + {spendingAsset?.toUpperCase()} +
- {p2p_config?.bank_payment_methods?.map((method) => { - return ( -
-
x.system_name === method.system_name - ) - ? 'whiteTextP2P' - : 'greyTextP2P' - } - onClick={() => { - const newSelected = [...paymentMethods]; + {p2p_config?.bank_payment_methods?.map((method) => { + return ( +
+
+ x.system_name === method.system_name + ) + ? 'whiteTextP2P payment-method' + : 'greyTextP2P payment-method' + } + onClick={() => { + const newSelected = [...paymentMethods]; - if ( - newSelected.find( + if ( + newSelected.find( + (x) => + x.system_name === method.system_name + ) + ) { + setPaymentMethods( + newSelected.filter( + (x) => + x.system_name !== method.system_name + ) + ); + } else { + newSelected.push(method); + setPaymentMethods(newSelected); + setSelectedMethod(method); + setAddMethodDetails(true); + } + }} + > +
{method.system_name}
+ {paymentMethods?.find( + (x) => x.system_name === method.system_name + ) &&
} +
+ {paymentMethods?.find( (x) => x.system_name === method.system_name - ) - ) { - setPaymentMethods( - newSelected.filter( - (x) => x.system_name !== method.system_name - ) - ); - } else { - newSelected.push(method); - setPaymentMethods(newSelected); - } - }} - > -
{method.system_name}
- {paymentMethods?.find( - (x) => x.system_name === method.system_name - ) &&
} + ) && ( +
{ + setSelectedMethod(method); + setAddMethodDetails(true); + setIsEditMode(true); + }} + className="edit-link" + > + + + {STRINGS['P2P.EDIT_UPPERCASE']} + + +
+ )} +
+ ); + })} +
+ ) : ( +
+
+ + {STRINGS['P2P.PAYMENT_METHODS_SEND_FIAT']} +
+
+ + {STRINGS['P2P.SELECT_PAYMENT_METHODS_1']} + {' '} + {p2p_config?.bank_payment_methods?.length || 0}{' '} + + {STRINGS['P2P.SELECT_PAYMENT_METHODS_2']} + {' '} + {spendingAsset?.toUpperCase()} +
+ + {p2p_config?.bank_payment_methods?.map((method) => { + return ( +
+
+ x.system_name === method.system_name + ) + ? 'whiteTextP2P payment-method' + : 'greyTextP2P payment-method' + } + onClick={() => { + const newSelected = [...paymentMethods]; + + if ( + newSelected.find( + (x) => + x.system_name === method.system_name + ) + ) { + setPaymentMethods( + newSelected.filter( + (x) => + x.system_name !== method.system_name + ) + ); + } else { + newSelected.push(method); + setPaymentMethods(newSelected); + setSelectedMethod(method); + setAddMethodDetails(true); + } + }} + > +
{method.system_name}
+ {paymentMethods?.find( + (x) => x.system_name === method.system_name + ) &&
} +
+
+ ); + })}
- ); - })} -
- )} + )} -
-
- - {STRINGS['P2P.REGION']} - -
-
- - {STRINGS['P2P.SELECT_REGION']} - +
+
+ + {STRINGS['P2P.REGION']} + +
+
+ + {STRINGS['P2P.SELECT_REGION']} + +
+ +
+
- -
-
-
- )} + )} - {step === 3 && ( -
-
-
-
- - {STRINGS['P2P.TERMS']} - -
-
- - {STRINGS['P2P.TERMS_CONDITIONS_DEAL']} - -
+ {step === 3 && ( +
+
+
+
+ + {STRINGS['P2P.TERMS']} + +
+
+ + {STRINGS['P2P.TERMS_CONDITIONS_DEAL']} + +
- { - setTerms(e.target.value); - }} - placeholder="Please post within 15 minutes of the deal going" - /> -
-
-
-
-
-
- - {STRINGS['P2P.FIRST_RESPONSE']} - -
-
- - {STRINGS['P2P.CHAT_RESPONSE']} - + { + setTerms(e.target.value); + }} + placeholder={ + STRINGS['P2P.TERMS_AND_CONDITION_DESCRIPTION'] + } + autoFocus={true} + /> +
+
+ {!terms && ( +
+ + + + {STRINGS['P2P.TERMS_ERROR_TEXT']} + + +
+ )} +
+
+
+
+
+ + {STRINGS['P2P.FIRST_RESPONSE']} + +
+
+ + {STRINGS['P2P.CHAT_RESPONSE']} + +
+ { + setAutoResponse(e.target.value); + }} + placeholder={STRINGS['P2P.VISIT_OUR_WEBSITE']} + /> +
+
+ {!autoResponse && terms && ( +
+ + + + {STRINGS['P2P.RESPONSE_ERROR_TEXT']} + + +
+ )} +
+
- { - setAutoResponse(e.target.value); - }} - placeholder="Visit our website" - /> -
+ )}
- )} -
-
- -
- {step !== 1 && ( - +
+ ) : ( + )} - -
+
+ + {STRINGS.formatString( + STRINGS['P2P.ADD_PAYMENT_METHOD_DETAILS'], + isEditMode + ? STRINGS['EDIT_TEXT'] + : STRINGS['DEVELOPERS_TOKEN.ADD_IP'] + )} + +
+ {selectedMethod?.fields?.map((x, index) => { + return ( +
+
{x?.name}:
+ { + if (!selectedMethod.fields[index].value) + selectedMethod.fields[index].value = ''; + selectedMethod.fields[index].value = e.target.value; - } - bodyStyle={{ - marginTop: 60, - }} - className="stake_theme" - visible={addMethodDetails} - footer={null} - onCancel={() => { - setAddMethodDetails(false); - }} - > -
- - {STRINGS['P2P.ADD_PAYMENT_METHOD_DETAILS']} - -
+ const newSelected = [...paymentMethods]; + const Index = newSelected.findIndex( + (x) => x.system_name === selectedMethod.system_name + ); + + newSelected[Index].fields = selectedMethod.fields; + setPaymentMethods(newSelected); + }} + /> +
+ ); + })} - {selectedMethod?.fields?.map((x, index) => { - return ( -
+
- ); - })} - + + {STRINGS['P2P.BACK_UPPER']} + + + +
+
+
+ {!isMobile && (
+ {step !== 1 && ( + + )} -
- + )}
); }; diff --git a/web/src/containers/P2P/P2PPostDealMobile.js b/web/src/containers/P2P/P2PPostDealMobile.js new file mode 100644 index 0000000000..6d1b733c84 --- /dev/null +++ b/web/src/containers/P2P/P2PPostDealMobile.js @@ -0,0 +1,1100 @@ +import React from 'react'; +import { connect } from 'react-redux'; +import { Button, Input, InputNumber, Select, Switch } from 'antd'; +import { + ArrowRightOutlined, + ExclamationCircleFilled, + SyncOutlined, +} from '@ant-design/icons'; + +import withConfig from 'components/ConfigProvider/withConfig'; +import STRINGS from 'config/localizedStrings'; +import { Coin, EditWrapper } from 'components'; +import { COUNTRIES_OPTIONS } from 'utils/countries'; + +const P2pPostDealMobile = ({ + p2p_config, + step, + selectedDealEdit, + p2pSide, + setP2pSide, + currStep, + priceType, + spread, + setSpread, + dynamicRate, + exchangeRate, + formatAmount, + spendingAsset, + formatRate, + setDynamicPair, + getDynamicRate, + buyingAsset, + setExchangeRate, + brokerData, + dynamicPair, + coins, + setBuyingAsset, + setPriceType, + setSpendingAsset, + setDynamicRate, + handleNextStep, + handlePreviousStep, + region, + setRegion, + paymentMethods, + setPaymentMethods, + setSelectedMethod, + totalOrderAmount, + setTotalOrderAmount, + minOrderValue, + setMinOrderValue, + maxOrderValue, + setMaxOrderValue, + setAddMethodDetails, + terms, + setTerms, + autoResponse, + setAutoResponse, + setIsEditMode, +}) => { + return ( +
+ {selectedDealEdit && ( +
+ + + +
+ + + {STRINGS['P2P.UPDATE_DEAL']} + + +
+
+ )} + {step === 1 && ( +
+ + + {STRINGS['P2P.I_WANT_TO_BUY']} + + + + { + if (step !== 1) return; + if (p2p_config.side === 'sell' && !checked) return; + if (p2p_config.side === 'buy' && checked) return; + + if (checked) { + setP2pSide('sell'); + } else { + setP2pSide('buy'); + } + }} + disabled={selectedDealEdit} + /> + + + + {STRINGS['P2P.I_WANT_TO_SELL']} + + +
+ )} + {(step === 2 || step === 3) && ( +
+ {p2pSide === 'sell' ? ( +
+ {buyingAsset?.toUpperCase()} + )} + > + {STRINGS.formatString( + STRINGS['P2P.SELLING'], + {buyingAsset?.toUpperCase()} + )} + +
+ ) : ( +
+ {spendingAsset?.toUpperCase()} + )} + > + {STRINGS.formatString( + STRINGS['P2P.BUYING'], + {spendingAsset?.toUpperCase()} + )} + +
+ )} +
+ )} +
+
+
+ 1 + +
+
+ {STRINGS['P2P.STEP_SET_TYPE_PRICE']} + {step === 1 && ( +
+
+
+
+ {p2pSide === 'sell' ? ( + + {STRINGS['P2P.SELL_UPPER']} + + ) : ( + + {STRINGS['P2P.BUY_UPPER']} + + )} +
+
+ {buyingAsset && ( + + )} + +
+
+ {p2pSide === 'sell' ? ( + + {STRINGS['P2P.CRYPTO_WANT_TO_SELL']} + + ) : ( + + {STRINGS['P2P.CRYPTO_WANT_TO_BUY']} + + )} +
+
+
+ +
+
+
+ {p2pSide === 'sell' ? ( + + {STRINGS['P2P.RECEIVE']} + + ) : ( + + {STRINGS['P2P.SEND_UPPER']} + + )} +
+
+ +
+
+ {p2pSide === 'sell' ? ( + + {STRINGS['P2P.FIAT_CURRENCY_WANT_TO_RECEIVE']} + + ) : ( + + {STRINGS['P2P.FIAT_CURRENCY_WANT_TO_SPEND']} + + )} +
+
+
+
+
+
+
+
+ + {STRINGS['P2P.TYPE']} + + : +
+
+ +
+
+ {priceType === 'static' && ( +
+
+ + {STRINGS['P2P.PRICE_UPPER']} + {' '} + {/* {spendingAsset + ? `(${spendingAsset?.toUpperCase()})` + : ''} */} +
+
+ { + if (!buyingAsset) return; + if (isNaN(e)) return; + if (e >= 0) { + setExchangeRate(e); + } + }} + /> +
+
+ )} + {priceType === 'dynamic' && ( +
+
+ + {STRINGS['P2P.PRICE_UPPER']} + {' '} + {/* {spendingAsset + ? `(${spendingAsset?.toUpperCase()})` + : ''} */} +
+
+ +
+
+ + + {STRINGS['P2P.RATE']} + + + + {' '} + {dynamicRate + ? `$${formatAmount('', dynamicRate)}` + : '-'} + +
+
+ )} +
+
+ + {STRINGS['P2P.SPREAD_PERCENTAGE']} + +
+
+ { + if (isNaN(e)) return; + if (e >= 0) { + setSpread(e); + } + }} + /> +
+
+ + {STRINGS['P2P.PRICE_PROFIT_SPREAD_SET']} + +
+
+
+ {(exchangeRate || dynamicRate) && ( +
{'='}
+ )} + {exchangeRate && ( +
+
+ + {STRINGS['P2P.UNIT_PRICE']} + +
+
+ ${formatRate(exchangeRate, spread, spendingAsset)} + + {spendingAsset?.toUpperCase()} + +
+
+ {p2pSide === 'sell' ? ( + {STRINGS['SIDES.SELL']} + )} + > + {STRINGS.formatString( + STRINGS['P2P.PRICE_ADVERTISE'], + + {STRINGS['SIDES.SELL']} + + )} + + ) : ( + {STRINGS['SIDES.BUY']} + )} + > + {STRINGS.formatString( + STRINGS['P2P.PRICE_ADVERTISE'], + + {STRINGS['SIDES.BUY']} + + )} + + )}{' '} + {/* {buyingAsset ? `${buyingAsset?.toUpperCase()}` : ''} */} +
+
+ )} + {dynamicRate && ( +
+
+ + {STRINGS['P2P.UNIT_PRICE']} + +
+
+ ${formatRate(dynamicRate, spread, spendingAsset)} + + {spendingAsset?.toUpperCase()} + +
+
+ {p2pSide === 'sell' ? ( + {STRINGS['SIDES.SELL']} + )} + > + {STRINGS.formatString( + STRINGS['P2P.PRICE_ADVERTISE'], + + {STRINGS['SIDES.SELL']} + + )} + + ) : ( + {STRINGS['SIDES.BUY']} + )} + > + {STRINGS.formatString( + STRINGS['P2P.PRICE_ADVERTISE'], + + {STRINGS['SIDES.BUY']} + + )} + + )}{' '} + {/* {buyingAsset ? `${buyingAsset?.toUpperCase()}` : ''} */} +
+
+ )} +
+ +
+ )} +
+
+
+
+ + 2 + + +
+
+ + {STRINGS['P2P.STEP_SET_TOTAL_AMOUNT_PAYMENT_METHODS']} + + {step === 2 && ( +
+
+
+
+ {p2pSide === 'sell' ? ( +
+
+ + + {STRINGS['P2P.TOTAL_AMOUNT']?.toUpperCase()} + + +
+
+ + {buyingAsset?.toUpperCase()} + + + {STRINGS.formatString( + STRINGS['P2P.BUY_SELL_DESC'], + STRINGS['SIDES_VALUES.sell'] + )} + +
+
+ ) : ( +
+
+ + + {STRINGS['P2P.TOTAL_AMOUNT']?.toUpperCase()} + + +
+
+ + {spendingAsset?.toUpperCase()} + + + {STRINGS.formatString( + STRINGS['P2P.BUY_SELL_DESC'], + STRINGS['SIDES_VALUES.buy'] + )} + +
+
+ )} +
+ { + setTotalOrderAmount(e.target.value); + }} + suffix={ +
+ + {p2pSide === 'sell' + ? buyingAsset?.toUpperCase() + : spendingAsset?.toUpperCase()} + + + + +
+ } + /> +
+
+ {p2pSide === 'sell' ? ( +
+
+ + + {' '} + {STRINGS['P2P.PAYMENT_METHODS_RECEIVE_FIAT']} + + +
+
+ + {STRINGS['P2P.SELECT_PAYMENT_METHODS_1']} + {' '} + {p2p_config?.bank_payment_methods?.length || 0}{' '} + + {STRINGS['P2P.SELECT_PAYMENT_METHODS_2']} + {' '} + {spendingAsset?.toUpperCase()} +
+ {p2p_config?.bank_payment_methods?.map((method) => { + return ( +
+
x.system_name === method.system_name + ) + ? 'whiteTextP2P payment-method' + : 'greyTextP2P payment-method' + } + onClick={() => { + const newSelected = [...paymentMethods]; + if ( + newSelected.find( + (x) => + x.system_name === method.system_name + ) + ) { + setPaymentMethods( + newSelected.filter( + (x) => + x.system_name !== method.system_name + ) + ); + } else { + newSelected.push(method); + setPaymentMethods(newSelected); + setSelectedMethod(method); + setAddMethodDetails(true); + } + }} + > +
{method.system_name}
+ {paymentMethods?.find( + (x) => x.system_name === method.system_name + ) &&
} +
+ {paymentMethods?.find( + (x) => x.system_name === method.system_name + ) && ( +
{ + setSelectedMethod(method); + setAddMethodDetails(true); + setIsEditMode(true); + }} + className="edit-link" + > + + + {STRINGS['P2P.EDIT_UPPERCASE']} + + +
+ )} +
+ ); + })} +
+ ) : ( +
+
+ + + {STRINGS['P2P.PAYMENT_METHODS_SEND_FIAT']} + + +
+
+ + {STRINGS['P2P.SELECT_PAYMENT_METHODS_1']} + {' '} + {p2p_config?.bank_payment_methods?.length || 0}{' '} + + {STRINGS['P2P.SELECT_PAYMENT_METHODS_2']} + {' '} + {spendingAsset?.toUpperCase()} +
+ {p2p_config?.bank_payment_methods?.map((method) => { + return ( +
+
x.system_name === method.system_name + ) + ? 'whiteTextP2P payment-method' + : 'greyTextP2P payment-method' + } + onClick={() => { + const newSelected = [...paymentMethods]; + if ( + newSelected.find( + (x) => + x.system_name === method.system_name + ) + ) { + setPaymentMethods( + newSelected.filter( + (x) => + x.system_name !== method.system_name + ) + ); + } else { + newSelected.push(method); + setPaymentMethods(newSelected); + setSelectedMethod(method); + setAddMethodDetails(true); + } + }} + > +
{method.system_name}
+ {paymentMethods?.find( + (x) => x.system_name === method.system_name + ) &&
} +
+
+ ); + })} +
+ )} +
+
+
+
+ {p2pSide === 'sell' ? ( +
+ + + {STRINGS['P2P.BUY_ORDER_LIMITS']} + + +
+ ) : ( +
+ + + {STRINGS['P2P.SELL_ORDER_LIMITS']} + + +
+ )} + {p2pSide === 'sell' ? ( +
+ {spendingAsset?.toUpperCase()}, + STRINGS['P2P.MIN_MAX_ORDER_VALUE_3'] + )} + > + {STRINGS.formatString( + STRINGS['P2P.MIN_MAX_ORDER_VALUE_1'], + {spendingAsset?.toUpperCase()}, + STRINGS['P2P.MIN_MAX_ORDER_VALUE_3'] + )} + {' '} +
+ ) : ( +
+ {buyingAsset?.toUpperCase()}, + STRINGS['P2P.MIN_MAX_ORDER_VALUE_2'] + )} + >{' '} + {STRINGS.formatString( + STRINGS['P2P.MIN_MAX_ORDER_VALUE_1'], + {buyingAsset?.toUpperCase()}, + STRINGS['P2P.MIN_MAX_ORDER_VALUE_2'] + )} +
+ )} +
+
+
+ { + setMinOrderValue(e.target.value); + }} + suffix={ + p2pSide === 'sell' + ? spendingAsset?.toUpperCase() + : buyingAsset?.toUpperCase() + } + /> +
+ {p2pSide === 'sell' && ( +
+ {minOrderValue + ? ( + minOrderValue / + formatRate( + exchangeRate || dynamicRate, + spread, + spendingAsset + ) + ).toFixed(4) + + ' ' + + buyingAsset?.toUpperCase() + : ''}{' '} +
+ )} +
+ ~ +
+
+ { + setMaxOrderValue(e.target.value); + }} + suffix={ + p2pSide === 'sell' + ? spendingAsset?.toUpperCase() + : buyingAsset?.toUpperCase() + } + /> +
+ {p2pSide === 'sell' && ( +
+ {maxOrderValue + ? ( + maxOrderValue / + formatRate( + exchangeRate || dynamicRate, + spread, + spendingAsset + ) + ).toFixed(4) + + ' ' + + buyingAsset?.toUpperCase() + : ''}{' '} +
+ )} +
+
+
+
+
+ + + {STRINGS['P2P.REGION']?.toUpperCase()} + + +
+
+ + {STRINGS['P2P.SELECT_REGION']} + +
+ +
+
+
+ + +
+
+ )} +
+
+
+
+ + 3 + +
+
+ + {STRINGS['P2P.STEP_SET_TERMS_AUTO_RESPONSE']} + +
+
+ {step === 3 && ( +
+
+
+
+ + + {STRINGS['P2P.TERMS']} + + +
+
+ + {STRINGS['P2P.TERMS_CONDITIONS_DEAL']} + +
+ { + setTerms(e.target.value); + }} + placeholder={STRINGS['P2P.TERMS_AND_CONDITION_DESCRIPTION']} + autoFocus={true} + /> +
+
+ {!terms && ( +
+ + + + {STRINGS['P2P.TERMS_ERROR_TEXT']} + + +
+ )} +
+
+
+
+
+ + + {STRINGS['P2P.FIRST_RESPONSE']} + + +
+
+ + {STRINGS['P2P.CHAT_RESPONSE']} + +
+ { + setAutoResponse(e.target.value); + }} + placeholder={STRINGS['P2P.VISIT_OUR_WEBSITE']} + /> +
+
+ {!autoResponse && terms && ( +
+ + + + {STRINGS['P2P.RESPONSE_ERROR_TEXT']} + + +
+ )} +
+
+
+ + +
+
+ )} +
+
+ ); +}; + +const mapStateToProps = (state) => ({ + pairs: state.app.pairs, + coins: state.app.coins, + broker: state.app.broker, + constants: state.app.constants, + transaction_limits: state.app.transaction_limits, + p2p_config: state.app.constants.p2p_config, +}); + +export default connect(mapStateToProps)(withConfig(P2pPostDealMobile)); diff --git a/web/src/containers/P2P/P2PProfile.js b/web/src/containers/P2P/P2PProfile.js index 9fa1e1fb47..9f60cc1eca 100644 --- a/web/src/containers/P2P/P2PProfile.js +++ b/web/src/containers/P2P/P2PProfile.js @@ -1,21 +1,16 @@ /* eslint-disable */ import React, { useEffect, useState } from 'react'; import { connect } from 'react-redux'; +import { isMobile } from 'react-device-detect'; +import { Button, message, Rate, Modal, Input, Select } from 'antd'; +import { ClockCircleOutlined } from '@ant-design/icons'; +import moment from 'moment'; -import { IconTitle, EditWrapper } from 'components'; +import './_P2P.scss'; +import classnames from 'classnames'; import STRINGS from 'config/localizedStrings'; import withConfig from 'components/ConfigProvider/withConfig'; -import { - Button, - Checkbox, - message, - Rate, - Modal, - Input, - Radio, - Space, - Select, -} from 'antd'; +import { Dialog, EditWrapper } from 'components'; import { fetchFeedback, fetchP2PProfile, @@ -24,11 +19,7 @@ import { updateP2PPaymentMethod, deleteP2PPaymentMethod, } from './actions/p2pActions'; -import { isMobile } from 'react-device-detect'; -import classnames from 'classnames'; -import moment from 'moment'; -import { CloseOutlined } from '@ant-design/icons'; -import './_P2P.scss'; +import { Loading } from 'containers/DigitalAssets/components/utils'; const P2PProfile = ({ data, @@ -49,9 +40,9 @@ const P2PProfile = ({ p2p_config, }) => { const [myDeals, setMyDeals] = useState([]); - const [checks, setCheks] = useState([]); + // const [checks] = useState([]); const [myProfile, setMyProfile] = useState(); - const [selectedUser, setSelectedUser] = useState(user); + const [selectedUser] = useState(user); const [selectedTab, setSelectedTab] = useState('0'); const [paymentMethods, setPaymentMethods] = useState([]); const [selectedMethod, setSelectedMethod] = useState({ @@ -61,9 +52,11 @@ const P2PProfile = ({ }); const [addMethodDetails, setAddMethodDetails] = useState(); const [myMethods, setMyMethods] = useState([]); - const [displayPaymentAdd, setDisplayPaymentAdd] = useState(false); + // const [displayPaymentAdd, setDisplayPaymentAdd] = useState(false); const [displayNewPayment, setDisplayNewPayment] = useState(false); const [paymentFieldAdd, setPaymentFieldAdd] = useState(false); + const [displayConfirmation, setDisplayConfirmation] = useState(false); + const [isLoading, setIsLoading] = useState(false); const [paymentMethod, setPaymentMethod] = useState({ system_name: null, fields: {}, @@ -82,11 +75,13 @@ const P2PProfile = ({ }); useEffect(() => { + setIsLoading(true); fetchFeedback({ merchant_id: (selectedProfile || selectedUser).id }) .then((res) => { setMyDeals(res.data); }) .catch((err) => err); + setIsLoading(false); fetchP2PProfile({ user_id: (selectedProfile || selectedUser).id }) .then((res) => { @@ -101,6 +96,7 @@ const P2PProfile = ({ .catch((err) => err); setDefaultPaymentMethod(); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [refresh, selectedProfile]); const setDefaultPaymentMethod = () => { @@ -120,25 +116,27 @@ const P2PProfile = ({ }; return (
-
-
+
+
{STRINGS['P2P.DISPLAY_NAME']}
-
- {(selectedProfile || selectedUser).full_name || ( +
+ {(selectedProfile || selectedUser)?.full_name || ( {STRINGS['P2P.ANONYMOUS']} @@ -149,77 +147,47 @@ const P2PProfile = ({
SMS
ID
*/} -
-
-
-
+
+
+
+
{STRINGS['P2P.TOTAL_ORDERS']}
-
- {myProfile?.totalTransactions} times +
+ {myProfile?.totalTransactions} {STRINGS['P2P.TIMES']}
-
-
+
+
{STRINGS['P2P.COMPLETION_RATE']}
-
+
{(myProfile?.completionRate || 0).toFixed(2)}%
-
-
+
+
{STRINGS['P2P.POSITIVE_FEEDBACK']}
-
+
{(myProfile?.positiveFeedbackRate || 0).toFixed(2)}%
@@ -236,19 +204,13 @@ const P2PProfile = ({
-
+
{ setSelectedTab('0'); }} @@ -259,62 +221,54 @@ const P2PProfile = ({
{ setSelectedTab('1'); }} > - Feedback({myDeals.length || 0}) + + {STRINGS['P2P.FEEDBACK']} + + ({myDeals.length || 0})
{selectedTab === '0' && ( -
-
-
-
-
+
+
+
+
+
- {STRINGS['P2P.PAYMENT_METHODS']} + + {STRINGS['P2P.PAYMENT_METHODS']} +
-
+
{STRINGS['P2P.PAYMENT_METHODS_DEC']}
-
+
-
+
{STRINGS['P2P.PAYMENT_METHODS_SEND_FIAT']}
- -
+