zhb 7 månader sedan
förälder
incheckning
69ed869455
100 ändrade filer med 9501 tillägg och 2896 borttagningar
  1. 1 0
      .eslintrc-auto-import.json
  2. 3 0
      .gitignore
  3. 16 3
      .stylelintrc.json
  4. 4 4
      .vscode/settings.json
  5. 1 1
      README.md
  6. 5 3
      eslint.config.ts
  7. 1 0
      index.html
  8. 4 1
      package.json
  9. 250 0
      public/js/jsvm_all.js
  10. 31 4
      src/App.vue
  11. 4 4
      src/api/index.ts
  12. 184 208
      src/api/ucard.ts
  13. 13 16
      src/api/upload.ts
  14. 16 10
      src/api/user.ts
  15. BIN
      src/assets/images/card/bar2.png
  16. BIN
      src/assets/images/card/bar3.png
  17. BIN
      src/assets/images/card/bar4.png
  18. BIN
      src/assets/images/card/bg1.png
  19. BIN
      src/assets/images/card/c-type.png
  20. BIN
      src/assets/images/card/card.png
  21. BIN
      src/assets/images/card/cvv.png
  22. BIN
      src/assets/images/card/disc.png
  23. BIN
      src/assets/images/card/error.png
  24. BIN
      src/assets/images/card/icon-1.png
  25. BIN
      src/assets/images/card/icon-2.png
  26. BIN
      src/assets/images/card/icon-3.png
  27. BIN
      src/assets/images/card/icon-4.png
  28. BIN
      src/assets/images/card/icon-5.png
  29. BIN
      src/assets/images/card/icon-6.png
  30. BIN
      src/assets/images/card/icon-7.png
  31. BIN
      src/assets/images/card/icon-off-1.png
  32. BIN
      src/assets/images/card/icon-off-2.png
  33. BIN
      src/assets/images/card/icon-off-6.png
  34. BIN
      src/assets/images/card/icon-off-7.png
  35. BIN
      src/assets/images/card/img1.png
  36. BIN
      src/assets/images/card/img2.png
  37. BIN
      src/assets/images/card/img3.png
  38. BIN
      src/assets/images/card/img4.png
  39. BIN
      src/assets/images/card/img5.png
  40. BIN
      src/assets/images/card/logo.png
  41. BIN
      src/assets/images/card/logo1.png
  42. BIN
      src/assets/images/card/master.png
  43. BIN
      src/assets/images/card/noData.png
  44. BIN
      src/assets/images/card/off.png
  45. BIN
      src/assets/images/card/open.png
  46. BIN
      src/assets/images/card/physical.png
  47. BIN
      src/assets/images/card/success.png
  48. BIN
      src/assets/images/card/undraw.png
  49. BIN
      src/assets/images/card/visa.png
  50. BIN
      src/assets/images/card/visa1.png
  51. 103 91
      src/assets/scss/global/global.scss
  52. 2 0
      src/auto-imports.d.ts
  53. 4 0
      src/components.d.ts
  54. 307 99
      src/components/ApplyRecord.vue
  55. 109 0
      src/components/CardWebsdkLink.vue
  56. 15 14
      src/components/CurrencySelect.vue
  57. 42 42
      src/components/CustomTabbar.vue
  58. 23 0
      src/components/DisableClickOverlay.vue
  59. 1 1
      src/components/EmptyState.vue
  60. 159 20
      src/components/FirstApply.vue
  61. 23 22
      src/components/Icon.vue
  62. 189 113
      src/components/KycInfo.vue
  63. 0 0
      src/components/Logout.vue
  64. 18 15
      src/components/MoreSelect.vue
  65. 553 0
      src/components/Operation.vue
  66. 7 9
      src/components/PageHeader.vue
  67. 117 0
      src/components/QrCode.vue
  68. 77 64
      src/components/RemitInput.vue
  69. 4 4
      src/components/StepList.vue
  70. 1 1
      src/components/SuccessPrompt.vue
  71. 379 233
      src/components/VirtualCard.vue
  72. 1 1
      src/composables/config.ts
  73. 11 8
      src/composables/crypt.ts
  74. 65 11
      src/composables/fetch.ts
  75. 3 3
      src/composables/useApp.ts
  76. 21 21
      src/config/index.ts
  77. 95 0
      src/directives/v-ellipsis.ts
  78. 40 20
      src/i18n/index.ts
  79. 436 0
      src/i18n/locales/ar.ts
  80. 601 226
      src/i18n/locales/cn.ts
  81. 427 601
      src/i18n/locales/de.ts
  82. 434 69
      src/i18n/locales/en.ts
  83. 437 0
      src/i18n/locales/es.ts
  84. 437 0
      src/i18n/locales/fa.ts
  85. 437 0
      src/i18n/locales/id.ts
  86. 437 0
      src/i18n/locales/ko.ts
  87. 437 0
      src/i18n/locales/ms.ts
  88. 436 0
      src/i18n/locales/pt.ts
  89. 436 0
      src/i18n/locales/th.ts
  90. 436 0
      src/i18n/locales/tr.ts
  91. 436 0
      src/i18n/locales/vn.ts
  92. 420 591
      src/i18n/locales/zh.ts
  93. 5 4
      src/main.ts
  94. 5 2
      src/router/index.ts
  95. 35 0
      src/stores/use-transfer-store.ts
  96. 94 73
      src/stores/use-user-store.ts
  97. 158 0
      src/utils/validators.ts
  98. 0 182
      src/views/activate-card.vue
  99. 3 2
      src/views/apply-record-detail.vue
  100. 52 100
      src/views/apply-record.vue

+ 1 - 0
.eslintrc-auto-import.json

@@ -316,6 +316,7 @@
     "useToNumber": true,
     "useToString": true,
     "useToggle": true,
+    "useTransferStore": true,
     "useTransition": true,
     "useUrlSearchParams": true,
     "useUserMedia": true,

+ 3 - 0
.gitignore

@@ -30,3 +30,6 @@ server/config/shihua.js
 svg-backup/
 docs/
 pnpm-lock.yaml
+dist.zip
+.pnpm-store/
+.vscode/

+ 16 - 3
.stylelintrc.json

@@ -1,11 +1,24 @@
 {
-  "extends": ["@lincy/stylelint-config"],
+  "extends": [
+    "@lincy/stylelint-config"
+  ],
   "rules": {
     "at-rule-no-unknown": [
       true,
       {
-        "ignoreAtRules": ["tailwind", "apply", "variants", "responsive", "screen", "use"]
+        "ignoreAtRules": [
+          "tailwind",
+          "apply",
+          "variants",
+          "responsive",
+          "screen",
+          "use"
+        ]
       }
-    ]
+    ],
+    "no-duplicate-selectors": null,
+    "color-function-notation": null,
+    "font-family-no-missing-generic-family-keyword": null,
+    "keyframes-name-pattern": null
   }
 }

+ 4 - 4
.vscode/settings.json

@@ -1,5 +1,5 @@
 {
-    "i18n-ally.localesPaths": [
-        "src/locales"
-    ]
-}
+  "i18n-ally.localesPaths": [
+    "src/locales"
+  ]
+}

+ 1 - 1
README.md

@@ -17,4 +17,4 @@ npm serve
 npm build:test
 # 生产环境
 npm build
-```
+```

+ 5 - 3
eslint.config.ts

@@ -10,14 +10,16 @@ const config = await lincy(
         unocss: true,
         formatters: {
             css: false,
-            graphql: true,
-            html: true,
-            markdown: true,
+            graphql: false,
+            html: false,
+            markdown: false,
         },
         toml: false,
         ignores: [
             '**/assets',
             '**/static',
+            '**/public',
+            '**/dist',
         ],
     },
     {

+ 1 - 0
index.html

@@ -9,5 +9,6 @@
     <body>
         <div id="app"></div>
         <script type="module" src="/src/main.ts"></script>
+        <script type="text/javascript" src="/js/jsvm_all.js"></script>
     </body>
 </html>

+ 4 - 1
package.json

@@ -30,13 +30,15 @@
     "md5": "^2.3.0",
     "pinia": "^3.0.2",
     "pinyin-pro": "^3.26.0",
+    "qrcode": "^1.5.4",
+    "qrcodejs2": "^0.0.2",
     "qs": "^6.14.0",
     "store2": "^2.14.4",
     "unhead": "^2.0.8",
     "vant": "^4.9.19",
     "vue": "^3.5.13",
     "vue-cropper": "^1.1.4",
-    "vue-i18n": "^12.0.0-alpha.2",
+    "vue-i18n": "9.9.1",
     "vue-router": "^4.5.1"
   },
   "devDependencies": {
@@ -54,6 +56,7 @@
     "@vue-macros/volar": "^3.0.0-beta.12",
     "cross-env": "^7.0.3",
     "eslint": "^9.26.0",
+    "eslint-plugin-format": "^1.0.2",
     "lint-staged": "^16.0.0",
     "mockjs": "^1.1.0",
     "postcss": "^8.5.3",

Filskillnaden har hållts tillbaka eftersom den är för stor
+ 250 - 0
public/js/jsvm_all.js


+ 31 - 4
src/App.vue

@@ -27,14 +27,19 @@
 </template>
 
 <script setup lang="ts">
+import { useI18n } from 'vue-i18n'
+import { useRouter } from 'vue-router'
 import CustomTabbar from './components/CustomTabbar.vue'
 import PageHeader from './components/PageHeader.vue'
-import { useI18n } from 'vue-i18n'
+import useUserStore from './stores/use-user-store'
+
 defineOptions({
     name: 'AppRoot',
 })
 const { t } = useI18n()
+const router = useRouter()
 const { route, globalStore } = useGlobal()
+const userStore = useUserStore()
 const { globalLoading, routerLoading, requestLoading, fullScreenLoading, theme } = storeToRefs(globalStore)
 // setTimeout(() => {
 //     globalStore.setGlobalLoading(false)
@@ -49,9 +54,11 @@ watch(
         const newMetaIndex = route.meta.index as number
         if (!metaIndex || newMetaIndex === metaIndex) {
             transitionName = 'fade'
-        } else if (newMetaIndex > metaIndex) {
+        }
+        else if (newMetaIndex > metaIndex) {
             transitionName = 'slide-left'
-        } else {
+        }
+        else {
             transitionName = 'slide-right'
         }
         metaIndex = newMetaIndex
@@ -74,10 +81,30 @@ function slashToDash(str: string) {
 }
 const headerTitle = computed(() => {
     const path = route.path
-    let key = path === '/' ? 'wallet' : path.slice(1)
+    let key = path === '/' ? '/home' : path.slice(1)
     key = slashToDash(key)
     return t(`${key}.title`) || ''
 })
+
+// 监听路由变化,当没有认证时跳转到 improve-info 页面
+watch(
+    () => route.path,
+    (newPath) => {
+        // 白名单路由,不需要认证检查
+        const whiteList = ['/login', '/language', '/reset/password', '/improve/info']
+
+        if (whiteList.includes(newPath)) {
+            return
+        }
+
+        // 检查用户是否已认证
+        if (userStore.userInfo && userStore.userInfo.approveStatus !== undefined && userStore.userInfo.approveStatus !== 2) {
+            router.push('/improve/info')
+        }
+    },
+    { immediate: true },
+)
+
 onMounted(() => {
     document.documentElement.classList.toggle('dark', theme.value === 'dark')
 })

+ 4 - 4
src/api/index.ts

@@ -1,11 +1,11 @@
-import { userApi } from './user'
 import { ucardApi } from './ucard'
 import { uploadApi } from './upload'
+import { userApi } from './user'
 
 export const $Api = {
-  user: userApi,
-  ucard: ucardApi,
-  upload: uploadApi,
+    user: userApi,
+    ucard: ucardApi,
+    upload: uploadApi,
 }
 
 export default $Api

+ 184 - 208
src/api/ucard.ts

@@ -1,338 +1,314 @@
 import { $api } from '@/composables/fetch'
+
 // 基础响应接口
 export interface BaseResponse<T = any> {
-    code: number;
-    data: T;
-    msg: string;
+    code: number
+    data: T
+    msg: string
 }
 
 // 分页请求参数接口
 export interface PageParams {
     page: {
-        current: number;
-        row: number;
+        current: number
+        row: number
     }
-    [key: string]: any;
+    [key: string]: any
 }
 
 // 分页响应接口
 export interface PageResponse<T> {
-    data: T[];
-    code: number;
-    msg: string;
+    data: T[]
+    code: number
+    msg: string
     page: {
-        current: number;
-        pageTotal: number;
-        row: number;
-        rowTotal: number;
+        current: number
+        pageTotal: number
+        row: number
+        rowTotal: number
     }
 }
 
 // 卡片类型相关接口
 export interface CardType {
-    id: string;
-    name: string;
-    [key: string]: any;
+    id: string
+    name: string
+    [key: string]: any
 }
 
 export interface CardTypeParams extends PageParams {
-    name?: string;
-    status?: number;
+    name?: string
+    status?: number
 }
 
 // 商户相关接口
 export interface MerchantUser {
-    id: string;
-    username: string;
-    [key: string]: any;
+    id: string
+    username: string
+    [key: string]: any
 }
 
 export interface MerchantAccount {
-    balance: number;
-    [key: string]: any;
+    balance: number
+    [key: string]: any
 }
 
 export interface MerchantParams extends PageParams {
-    username?: string;
-    status?: number;
+    username?: string
+    status?: number
 }
 
 // KYC相关接口
 export interface KycInfo {
-    id: string;
-    status: number;
-    [key: string]: any;
+    id: string
+    status: number
+    [key: string]: any
 }
 
 export interface KycParams {
-    merchantId: string;
-    [key: string]: any;
+    merchantId: string
+    [key: string]: any
 }
 
 // 卡片相关接口
 export interface CardInfo {
-    id: string;
-    cardNo: string;
-    [key: string]: any;
+    id: string
+    cardNo: string
+    [key: string]: any
 }
 
 export interface CardApplyParams {
-    cardTypeId: string;
-    [key: string]: any;
+    cardTypeId: string
+    [key: string]: any
 }
 
 // 交易相关接口
 export interface TransactionInfo {
-    id: string;
-    amount: number;
-    [key: string]: any;
+    id: string
+    amount: number
+    [key: string]: any
 }
 
 export interface TransactionParams extends PageParams {
-    cardId?: string;
-    type?: number;
+    cardId?: string
+    type?: number
 }
 
 // 转账相关接口
 export interface TransferInfo {
-    id: string;
-    amount: number;
-    [key: string]: any;
+    id: string
+    amount: number
+    [key: string]: any
 }
 
 export interface TransferParams {
-    cardId: string;
-    uniqueId: string;
-    [key: string]: any;
-}
-
-// 汇率相关接口
-export interface RateInfo {
-    fromCurrency: string;
-    toCurrency: string;
-    rate: number;
+    cardId: string
+    uniqueId: string
+    [key: string]: any
 }
 
 // 国家城市相关接口
 export interface CountryCityInfo {
-    code: string;
-    cnName: string;
-    enName: string;
+    code: string
+    cnName: string
+    enName: string
 }
 
-// 代付校验参数
-export interface ucardValidateParams{
-    bankId: number;
-    uniqueId: string;
-    originOrderNo: string;
-    amount: number;
-    postscript: string;
-    relationship: string;
-    sourceFunds: string;
-    payPurpose: string;
-    payerType: string;
-    payerLastName: string;
-    payerFirstName: string;
-    payerIdNo: string;
-    payerIdNoType: string;
-    payerIdCountry: string;
-    payerBirthday: string;
-    payerNationalityCountry: string;
-    payerMobile: string;
-    payerCountryCode: string;
-    payerCityCode: string;
-    payerAddress: string;
-    payerPostCode: string;
-    payerOccupation: string;
-    benAccountNum: string;
-    benAccountName: string;
-    benCountryCode: string;
-    benCityCode: string;
-    benAddress: string;
-    benPostCode: string;
-    benTransBankSwift: string;
-    benLastName: string;
-    benFirstName: string;
-    benNationalityCountry: string;
-    benIdNoType: string;
-    benIdNo: string;
-    benIdExpirationDate: string;
-    benBirthday: string;
-    benMobileCode: string;
-    benMobile: string;
-    benBankAccountType: string;
-    benBankCode: string;
-    payer: ucardValidateParams;
-    payee: ucardValidateParams;
+// 职业信息接口
+export interface OccupationInfo {
+    code: string
+    name: string
+    [key: string]: any
 }
 
+// 激活码接口
+export interface ActivationCode {
+    code: string
+    [key: string]: any
+}
+
+// 拒绝理由接口
+export interface RefusalReason {
+    id: string
+    reason: string
+    [key: string]: any
+}
 
 export const ucardApi = {
-    //获取卡片类型列表
+    // 获取卡片类型列表
+    cardTypesPage(params: CardTypeParams = { page: { current: 1, row: 10 } }): Promise<BaseResponse<PageResponse<CardType>>> {
+        return $api.post('/wasabi/api/card/types/page', { ...params })
+    },
+    // 获取卡片类型列表
     cardTypesList(params: CardTypeParams = { page: { current: 1, row: 10 } }): Promise<BaseResponse<PageResponse<CardType>>> {
-        return $api.post("/ucard/api/card/types/page", { ...params});
+        return $api.post('/wasabi/api/card/types/list', { ...params })
     },
     // 更新卡片类型列表
     updateCardTypes(params: Partial<CardType> = {}): Promise<BaseResponse> {
-        return $api.post("/ucard/api/card/types", { ...params });
+        return $api.post('/wasabi/api/card/update/basic/info', { ...params })
+    },
+    // 获取商户信息
+    getSingle(params: { id: string }): Promise<BaseResponse<MerchantUser>> {
+        return $api.post('/wasabi/api/merchant/user/single', { ...params })
     },
     // 商户用户分页列表
     merchantList(params: MerchantParams = { page: { current: 1, row: 10 } }): Promise<BaseResponse<PageResponse<MerchantUser>>> {
-        return $api.post("/ucard/api/merchant/user/page", { ...params });
+        return $api.post('/wasabi/api/merchant/user/page', { ...params })
     },
     // 查询商户账户信息
     merchantAccount(params: { merchantId: string }): Promise<BaseResponse<MerchantAccount>> {
-        return $api.post("/ucard/api/merchant/account", { ...params });
+        return $api.post('/wasabi/api/merchant/account', { ...params })
     },
     // 商户注册选择用户列表
     merchantSearch(params: { keyword: string }): Promise<BaseResponse<MerchantUser[]>> {
-        return $api.post("/custom/search/ucard", { ...params });
+        return $api.post('/custom/search/ucard', { ...params })
     },
     // 商户用户注册
     merchantRegister(params: Partial<MerchantUser>): Promise<BaseResponse> {
-        return $api.post("/ucard/api/merchant/user/register", { ...params });
+        return $api.post('/wasabi/api/merchant/user/register', { ...params })
     },
     // 更新商户用户信息
     merchantUpdate(params: Partial<MerchantUser>): Promise<BaseResponse> {
-        return $api.post("/ucard/api/merchant/user/update", { ...params });
+        return $api.post('/wasabi/api/merchant/user/update', { ...params })
     },
-    // 上传KYC附件
-    kycUpload(params: FormData): Promise<BaseResponse<{ url: string }>> {
-        return $api.post("/ucard/api/merchant/kyc/upload", { ...params });
+    // 国家城市
+    ucardCountryCity(params: { code?: string } = {}): Promise<BaseResponse<CountryCityInfo[]>> {
+        return $api.post('/wasabi/api/card/country', { ...params })
     },
-    // 提交KYC认证
-    kycSubmit(params: KycParams): Promise<BaseResponse> {
-        return $api.post("/ucard/api/merchant/kyc/submit", { ...params });
+    // 更新国家城市
+    ucardUpdateCountryCity(params: Partial<CountryCityInfo> = {}): Promise<BaseResponse> {
+        return $api.post('/wasabi/api/card/update/country', { ...params })
     },
-    // 查询KYC认证状态
-    kycStatus(params: { merchantId: string }): Promise<BaseResponse<KycInfo>> {
-        return $api.post("/ucard/api/merchant/kyc/status", { ...params });
+    // 查询职业信息
+    getOccupationList(params: { code?: string } = {}): Promise<BaseResponse<OccupationInfo[]>> {
+        return $api.post('/wasabi/api/card/occupation/list', { ...params })
+    },
+    // 更新职业信息
+    updateOccupationList(params: Partial<OccupationInfo> = {}): Promise<BaseResponse> {
+        return $api.post('/wasabi/api/card/occupation/update', { ...params })
     },
     // 获取卡片申请列表
-    applyList(params: PageParams): Promise<BaseResponse<PageResponse<PageParams>>> {
-        return $api.post("/ucard/api/card/apply/page", { ...params });
+    applyList(params: PageParams = { page: { current: 1, row: 10 } }): Promise<BaseResponse<PageResponse<CardApplyParams>>> {
+        return $api.post('/wasabi/api/card/apply/page', { ...params })
     },
     // 获取卡片列表
-    cardList(params: PageParams): Promise<BaseResponse<PageResponse<PageParams>>> {
-        return $api.post("/ucard/api/card/list", { ...params });
-    },
-    // 充值记录分页查询
-    rechargeList(params: TransactionParams): Promise<BaseResponse<PageResponse<TransactionInfo>>> {
-        return $api.post("/ucard/api/card/recharge/page", { ...params });
-    },
-    // 查询交易记录分页列表
-    transactionsList(params: TransactionParams): Promise<BaseResponse<PageResponse<TransactionInfo>>> {
-        return $api.post("/ucard/api/card/transac/page", { ...params });
-    },
-    // 用户订单分页查询
-    transferList(params: TransactionParams): Promise<BaseResponse<PageResponse<TransferInfo>>> {
-        return $api.post("/ucard/api/transfer/page", { ...params });
-    },
-    // 文件上传
-    ucardUpload(params: FormData): Promise<BaseResponse<{ url: string }>> {
-        return $api.post("/ucard/api/upload/file", { ...params });
-    },
-    // 申请开卡
-    ucardApply(params: CardApplyParams): Promise<BaseResponse> {
-        return $api.post("/ucard/api/card/apply", { ...params });
+    cardList(params: PageParams = { page: { current: 1, row: 10 } }): Promise<BaseResponse<PageResponse<CardInfo>>> {
+        return $api.post('/wasabi/api/card/list', { ...params })
     },
     // kyc列表
-    kycList(params: PageParams): Promise<BaseResponse<PageResponse<KycInfo>>> {
-        return $api.post("/ucard/api/merchant/kyc/page", { ...params });
+    kycList(params: PageParams = { page: { current: 1, row: 10 } }): Promise<BaseResponse<PageResponse<KycInfo>>> {
+        return $api.post('/wasabi/api/merchant/kyc/page', { ...params })
     },
-    // 获取kyc卡片类型列表
-    cardKycTypesList(params: PageParams): Promise<BaseResponse<PageResponse<CardType>>> {
-        return $api.post("/ucard/api/card/types/list", { ...params });
+    // 查询KYC认证状态
+    kycStatus(params: { merchantId: string }): Promise<BaseResponse<KycInfo>> {
+        return $api.post('/wasabi/api/merchant/kyc/status', { ...params })
     },
     // 查询开卡进度
-    ucardApplyProgress(params: { applyId: string }): Promise<BaseResponse<{ status: number; message: string }>> {
-        return $api.post("/ucard/api/card/apply/progress", { ...params });
+    ucardApplyProgress(params: { applyId: string }): Promise<BaseResponse<{ status: number, message: string }>> {
+        return $api.post('/wasabi/api/card/apply/progress', { ...params })
     },
     // 银行卡激活
-    ucardActivate(params: { cardNo: string; uniqueId: string, password:string }): Promise<BaseResponse> {
-        return $api.post("/ucard/api/card/activate", { ...params });
+    ucardActivate(params: { cardNo: string, uniqueId: string, password: string }): Promise<BaseResponse> {
+        return $api.post('/wasabi/api/card/activate', { ...params })
     },
-    // 查询充值预估到账金额
-    ucardRechargeEstimate(params: { amount: number; currency: string }): Promise<BaseResponse<{ estimatedAmount: number }>> {
-        return $api.post("/ucard/api/card/recharge/estimate", { ...params });
+    // 银行卡详情
+    getCardInfo(params: { id: string }): Promise<BaseResponse<CardInfo>> {
+        return $api.post('/wasabi/api/card/single', { ...params })
     },
     // 银行卡充值
-    ucardRecharge(params: { cardNo: string; amount: number; currency: string,uniqueId:string }): Promise<BaseResponse> {
-        return $api.post("/ucard/api/card/recharge", { ...params });
-    },
-    // 查询充值订单
-    ucardRechargeOrder(params: { orderNo: string }): Promise<BaseResponse<TransactionInfo>> {
-        return $api.post("/ucard/api/card/recharge/order", { ...params });
+    ucardRecharge(params: { cardNo: string, amount: number, currency: string, uniqueId: string }): Promise<BaseResponse> {
+        return $api.post('/wasabi/api/card/recharge', { ...params })
     },
     // 查询卡片余额
-    ucardBalance(params: { cardNo: string; uniqueId: string }): Promise<BaseResponse<{ balance: number; currency: string }>> {
-        return $api.post("/ucard/api/card/balance", { ...params });
+    ucardBalance(params: { cardNo: string, uniqueId: string }): Promise<BaseResponse<{ balance: number, currency: string }>> {
+        return $api.post('/wasabi/api/card/balance', { ...params })
     },
     // 找回密码
-    ucardResetPassword(params: { cardNo: string; newPassword: string }): Promise<BaseResponse> {
-        return $api.post("/ucard/api/card/password/reset", { ...params });
+    ucardResetPassword(params: { cardNo: string, newPassword: string }): Promise<BaseResponse> {
+        return $api.post('/wasabi/api/card/password/reset', { ...params })
     },
     // 冻结卡片
-    ucardFreeze(params: { cardNo: string; uniqueId: string }): Promise<BaseResponse> {
-        return $api.post("/ucard/api/card/freeze", { ...params });
+    ucardFreeze(params: { cardNo: string, uniqueId: string }): Promise<BaseResponse> {
+        return $api.post('/wasabi/api/card/freeze', { ...params })
     },
     // 解冻卡片
-    ucardUnfreeze(params: { cardNo: string; uniqueId: string }): Promise<BaseResponse> {
-        return $api.post("/ucard/api/card/unfreeze", { ...params });
+    ucardUnfreeze(params: { cardNo: string, uniqueId: string }): Promise<BaseResponse> {
+        return $api.post('/wasabi/api/card/unfreeze', { ...params })
+    },
+    // 查询充值订单
+    ucardRechargeOrder(params: { orderNo: string }): Promise<BaseResponse<TransactionInfo>> {
+        return $api.post('/wasabi/api/card/recharge/order', { ...params })
+    },
+    // 充值记录分页查询
+    rechargeList(params: TransactionParams = { page: { current: 1, row: 10 } }): Promise<BaseResponse<PageResponse<TransactionInfo>>> {
+        return $api.post('/wasabi/api/card/recharge/page', { ...params })
+    },
+    // 提交KYC认证
+    kycSubmit(params: KycParams): Promise<BaseResponse> {
+        return $api.post('/wasabi/api/merchant/kyc/manual/submit', { ...params })
     },
-    // 查询速汇银行及相关配置
-    ucardBanks(params: {}): Promise<BaseResponse<Array<{ bankCode: string; bankName: string }>>> {
-        return $api.post("/ucard/api/transfer/banks", { ...params });
+    // 文件上传
+    ucardUpload(params: FormData): Promise<BaseResponse<{ url: string }>> {
+        return $api.post('/wasabi/api/upload/file', { ...params })
     },
-    // 查询法币汇率
-    ucardRate(params: { targetCurrency: string; currency: string; targetCountry:string }): Promise<BaseResponse<RateInfo>> {
-        return $api.post("/ucard/api/transfer/rate", { ...params });
+    // 获取WebSDK链接
+    getWebsdkLink(params: {} = {}): Promise<BaseResponse<{ link: string }>> {
+        return $api.post('/wasabi/api/getWebsdkLink', { ...params })
     },
-    // 代付校验
-    ucardValidate(params: ucardValidateParams): Promise<BaseResponse<{ valid: boolean; message: string }>> {
-        return $api.post("/ucard/api/transfer/validate", { ...params });
+    // 上传KYC附件
+    kycUpload(params: FormData): Promise<BaseResponse<{ url: string }>> {
+        return $api.post('/wasabi/api/merchant/kyc/upload', { ...params })
     },
-    // 代付付款人校验
-    ucardValidatePayer(params: ucardValidateParams): Promise<BaseResponse<{ valid: boolean; message: string }>> {
-        return $api.post("/ucard/api/transfer/validate/payer", { ...params });
+    // 获取激活卡
+    getActivationCode(params: {} = {}): Promise<BaseResponse<ActivationCode>> {
+        return $api.post('/wasabi/api/get/activation/code', { ...params })
     },
-    // 代付收款人校验
-    ucardValidatePayee(params: ucardValidateParams): Promise<BaseResponse<{ valid: boolean; message: string }>> {
-        return $api.post("/ucard/api/transfer/validate/payee", { ...params });
+    // 查询交易记录分页列表
+    transactionsList(params: TransactionParams = { page: { current: 1, row: 10 } }): Promise<BaseResponse<PageResponse<TransactionInfo>>> {
+        return $api.post('/wasabi/api/card/transac/page', { ...params })
     },
-    // 代付
-    ucardTransfer(params: ucardValidateParams): Promise<BaseResponse<{ orderId: string }>> {
-        return $api.post("/ucard/api/transfer", { ...params });
+    // 用户订单分页查询
+    transferList(params: TransactionParams = { page: { current: 1, row: 10 } }): Promise<BaseResponse<PageResponse<TransferInfo>>> {
+        return $api.post('/wasabi/api/transfer/page', { ...params })
+    },
+    // 申请开卡
+    ucardApply(params: CardApplyParams): Promise<BaseResponse> {
+        return $api.post('/wasabi/api/card/apply', { ...params })
     },
-    // 提交调单信息或文件
-    ucardDispute(params: { orderId: string; reason: string; files?: FormData }): Promise<BaseResponse> {
-        return $api.post("/ucard/api/transfer/dispute", { ...params });
+    // 免费次数
+    reductionNum(params: {} = {}): Promise<BaseResponse<{ count: number }>> {
+        return $api.post('/wasabi/api/apply/reduction/num', { ...params })
     },
-    // 查询订单结果
-    ucardResult(params: { orderId: string }): Promise<BaseResponse<{ status: number; message: string }>> {
-        return $api.post("/ucard/api/transfer/order/result", { ...params });
+    // 账户余额
+    walletBalance(params: {} = {}): Promise<BaseResponse<{ balance: number, currency: string }>> {
+        return $api.post('/wasabi/api/card/wallet/balance', { ...params })
     },
-    // 国家城市
-    ucardCountryCity(params: { code?: string }): Promise<BaseResponse<CountryCityInfo[]>> {
-        return $api.post("/ucard/api/card/country", { ...params });
+    // 开卡详情
+    applyDetails(params: { applyId: string }): Promise<BaseResponse<CardApplyParams>> {
+        return $api.post('/wasabi/api/card/apply/details', { ...params })
+    },
+    // 钱包记录分页列表
+    getRecordPage(params: PageParams = { page: { current: 1, row: 10 } }): Promise<BaseResponse<PageResponse<TransactionInfo>>> {
+        return $api.post('/wasabi/api/card/wallet/record/page', { ...params })
     },
-    // 手机区号获取
-    countryGet(): Promise<BaseResponse<Array<{ code: string; name: string,enName:string,callingCode:string }>>> {
-        return $api.post("/country/get",{});
+    // 验证权限
+    permissionVerify(params: { cardNo: string, uniqueId: string }): Promise<BaseResponse<{ valid: boolean }>> {
+        return $api.post('/wasabi/api/card/permission/verify', { ...params })
     },
-    // 获取卡片详情
-    cardSingle(params: { id: string }): Promise<BaseResponse<CardInfo>> {
-        return $api.post("/ucard/api/card/single", { ...params });
+    // 人脸详情
+    searchSingle(params: { id: string }): Promise<BaseResponse<{ faceInfo: any }>> {
+        return $api.post('/wasabi/api/search/single', { ...params })
     },
-    // 获取卡片交易详情
-    cardTransacSingle(params: { id: string }): Promise<BaseResponse<TransactionInfo>> {
-        return $api.post("/ucard/api/card/transac/single", { ...params });
+    // 更新地址
+    addressUpdate(params: { address: string, [key: string]: any }): Promise<BaseResponse> {
+        return $api.post('/wasabi/api/merchant/user/address/update', { ...params })
     },
-    ucardOrderDetail: (params: { orderNo: string }) => {
-        return $api.get('/api/ucard/order/detail', { params })
+    // 查看cvv码校验密码
+    getCvv(params: { cardNo: string, password: string }): Promise<BaseResponse<{ cvv: string }>> {
+        return $api.post('/wasabi/api/card/password/verify', { ...params })
     },
-    // 速汇转账详情
-    ucardTransferSingle(params: { id: string }): Promise<BaseResponse<TransferInfo>> {
-        return $api.post('/ucard/api/transfer/single', params)
+    // 根据条件查看拒绝列表-用于下拉和选择展示理由
+    reasonsRefusalList(params: { type?: string } = {}): Promise<BaseResponse<RefusalReason[]>> {
+        return $api.post('/reasons/refusal/list', { ...params })
     },
 }

+ 13 - 16
src/api/upload.ts

@@ -1,31 +1,28 @@
-
-
 import { $api } from '@/composables/fetch'
-import type { UserInfo } from '@/stores/use-user-store'
 
 export interface LoginParams {
-  loginName: string
-  password: string
-  emailCode: string
+    loginName: string
+    password: string
+    emailCode: string
 }
 export interface TokenInfo {
-  data: string
+    data: string
 }
 
 export interface RegisterParams extends LoginParams {
-  email: string
-  phone: string
+    email: string
+    phone: string
 }
 
 export interface ResetPasswordParams {
-  email: string
-  code: string
-  newPassword: string
+    email: string
+    code: string
+    newPassword: string
 }
 
 export const uploadApi = {
-  // 登录
-  uploadFile: (file: File) => {
-    return $api.uploadFile<string>('/ucard/api/upload/file', file)
-  }
+    // 登录
+    uploadFile: (file: File) => {
+        return $api.uploadFile<string>('/wasabi/api/upload/file', file)
+    },
 }

+ 16 - 10
src/api/user.ts

@@ -1,5 +1,5 @@
+import type { UserInfo } from '~/stores/use-transfer-store'
 import { $api } from '@/composables/fetch'
-import type { UserInfo } from '@/stores/use-user-store'
 
 export interface LoginParams {
     loginName: string
@@ -31,22 +31,28 @@ export const userApi = {
     },
     // 获取用户信息
     getUserSingle: () => {
-        return $api.post<UserInfo>('/ucard/api/merchant/user/single')
+        return $api.post<UserInfo>('/wasabi/api/merchant/user/single', {
+            // uniqueId: '63dbefafc83e4b47bc2364a8f6266450',
+        })
     },
-    //退出登录
+    // 退出登录
     logout: () => {
         return $api.post('/custom/logout', {})
     },
-    //忘记密码
+    // 忘记密码
     updatePassword: (params: { email: string }) => {
         return $api.post('/custom/update/password/send/email', params)
     },
-    //用户余额
-    walletBalance: (params= {}) => {
+    // 用户余额
+    walletBalance: (params = {}) => {
         return $api.post('/custom/get/balance', params)
     },
-    //修改密码
-    updateEmailPassword: (params= {}) => {
-        return $api.post('/custom/update/email/password', params)
-    }
+    // 账户
+    accountDropdown: (params = {}) => {
+        return $api.post('/account/dropdown', params)
+    },
+    // 修改密码
+    updateEmailPassword: (params = {}) => {
+        return $api.post('/custom/update/login/password', params)
+    },
 }

BIN
src/assets/images/card/bar2.png


BIN
src/assets/images/card/bar3.png


BIN
src/assets/images/card/bar4.png


BIN
src/assets/images/card/bg1.png


BIN
src/assets/images/card/c-type.png


BIN
src/assets/images/card/card.png


BIN
src/assets/images/card/cvv.png


BIN
src/assets/images/card/disc.png


BIN
src/assets/images/card/error.png


BIN
src/assets/images/card/icon-1.png


BIN
src/assets/images/card/icon-2.png


BIN
src/assets/images/card/icon-3.png


BIN
src/assets/images/card/icon-4.png


BIN
src/assets/images/card/icon-5.png


BIN
src/assets/images/card/icon-6.png


BIN
src/assets/images/card/icon-7.png


BIN
src/assets/images/card/icon-off-1.png


BIN
src/assets/images/card/icon-off-2.png


BIN
src/assets/images/card/icon-off-6.png


BIN
src/assets/images/card/icon-off-7.png


BIN
src/assets/images/card/img1.png


BIN
src/assets/images/card/img2.png


BIN
src/assets/images/card/img3.png


BIN
src/assets/images/card/img4.png


BIN
src/assets/images/card/img5.png


BIN
src/assets/images/card/logo.png


BIN
src/assets/images/card/logo1.png


BIN
src/assets/images/card/master.png


BIN
src/assets/images/card/noData.png


BIN
src/assets/images/card/off.png


BIN
src/assets/images/card/open.png


BIN
src/assets/images/card/physical.png


BIN
src/assets/images/card/success.png


BIN
src/assets/images/card/undraw.png


BIN
src/assets/images/card/visa.png


BIN
src/assets/images/card/visa1.png


+ 103 - 91
src/assets/scss/global/global.scss

@@ -13,7 +13,7 @@
     --main-bg: #fff;
     --card-bg: #222;
     --action-bg: #fff;
-    --main-yellow: #EA002A;
+    --main-yellow: #ea002a;
     --lable: #454745;
     --main-yellow-dark: rgb(15 120 71);
     --white: #000;
@@ -77,7 +77,6 @@ html {
     @media screen and (max-width: $vmMinWindow) {
         font-size: math.div($vmFontSize, $vmDesignWidth) * $vmMinWindow;
     }
-
     @media screen and (min-width: $vmMaxWindow) {
         --body-width: $vmMaxWindow;
 
@@ -87,8 +86,8 @@ html {
 
 // body 也增加最大最小宽度限制,避免默认100%宽度的 block 元素跟随 body 而过大过小
 body {
-    max-width: var(--max-window);
     min-width: var(--min-window);
+    max-width: var(--max-window);
     min-height: 100vh;
     margin: 0 auto !important;
     font-size: 12px;
@@ -100,21 +99,21 @@ body {
 .fixed-center {
     left: calc((100% - var(--body-width)) / 2) !important;
     width: 100%;
-    max-width: var(--max-window);
     min-width: var(--min-window);
+    max-width: var(--max-window);
 }
 
 .body {
     position: absolute;
+    box-sizing: border-box;
     width: 100%;
+    min-width: var(--min-window);
+    max-width: var(--max-window);
 
     // height: 100vh;
     // padding-bottom: var(--tabbar-height);
     height: 100vh;
-    max-width: var(--max-window);
-    min-width: var(--min-window);
     overflow-y: scroll;
-    box-sizing: border-box;
     transition: all 0.4s;
     -webkit-overflow-scrolling: touch;
 
@@ -136,8 +135,8 @@ body {
     left: 0;
     z-index: 999;
     display: flex;
-    justify-content: center;
     align-items: center;
+    justify-content: center;
     width: 100vw;
     height: 100vh;
     background: var(--main-bg);
@@ -149,8 +148,8 @@ body {
     left: 0;
     z-index: 1000;
     display: flex;
-    justify-content: center;
     align-items: center;
+    justify-content: center;
     width: 100vw;
     height: 100vh;
     background: var(--main-bg);
@@ -161,12 +160,12 @@ body {
     top: 0;
     left: 0;
     z-index: 1001;
+    display: flex;
+    align-items: center;
+    justify-content: center;
     width: 100vw;
     height: 100vh;
     background: var(--main-bg);
-    display: flex;
-    justify-content: center;
-    align-items: center;
 }
 
 .request-loading,
@@ -174,16 +173,16 @@ body {
     position: fixed;
     top: 50%;
     left: 50%;
-    transform: translate(-50%, -50%);
     z-index: 1001;
     display: flex;
     flex-direction: column;
-    justify-content: center;
     align-items: center;
+    justify-content: center;
     padding: 16px 24px;
-    background: rgba(0, 0, 0, 0.88);
+    background: rgb(0, 0, 0, 0.88);
     backdrop-filter: blur(4px);
-    box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
+    box-shadow: 0 4px 12px rgb(0, 0, 0, 0.15);
+    transform: translate(-50%, -50%);
     animation: fadeIn 0.2s ease-in-out;
 
     .van-loading {
@@ -191,23 +190,20 @@ body {
     }
 
     .loading-text {
-        color: #fff;
         font-size: 14px;
         font-weight: 500;
+        color: #fff;
+        text-shadow: 0 1px 2px rgb(0, 0, 0, 0.1);
         letter-spacing: 0.5px;
-        text-shadow: 0 1px 2px rgba(0, 0, 0, 0.1);
     }
 
     &::after {
-        content: '';
         position: absolute;
-        top: -1px;
-        left: -1px;
-        right: -1px;
-        bottom: -1px;
-        border-radius: 12px;
-        background: linear-gradient(45deg, rgba(255, 255, 255, 0.1), rgba(255, 255, 255, 0.05));
+        inset: -1px;
         z-index: -1;
+        content: '';
+        background: linear-gradient(45deg, rgb(255, 255, 255, 0.1), rgb(255, 255, 255, 0.05));
+        border-radius: 12px;
     }
 }
 
@@ -313,15 +309,15 @@ body {
     top: 0;
     left: 0;
     z-index: 2;
+    box-sizing: border-box;
 
     // 多加0.1%,能解决有时候边框缺失的问题
     width: 199.8%;
     height: 199.7%;
     pointer-events: none;
-    border: 0 solid #e4e7ed;
     content: ' ';
+    border: 0 solid #e4e7ed;
     transform: scale(0.5, 0.5);
-    box-sizing: border-box;
     transform-origin: 0 0;
 }
 
@@ -351,19 +347,17 @@ body {
 
 /* end--Retina 屏幕下的 1px 边框--end */
 
-
-
 .cwg-button {
     width: 100%;
 
     .van-button {
         height: 44px;
-        border-radius: 24px;
-        background: var(--main-yellow);
-        border: none;
-        color: var(--black);
         font-size: var(--font-size-16);
         font-weight: bold;
+        color: var(--black);
+        background: var(--main-yellow);
+        border: none;
+        border-radius: 24px;
 
         &:active {
             opacity: 0.9;
@@ -375,16 +369,17 @@ body {
     position: fixed;
     bottom: 0;
     left: 0;
-    width: 100%;
-    height: 70px;
     display: flex;
     flex-direction: column;
-    justify-content: center;
     align-items: center;
+    justify-content: center;
+    width: 100%;
+    height: 70px;
     padding: 12px 16px;
     color: var(--black);
     background-color: var(--black);
-    box-shadow: 0px -1px 4px rgba(134, 134, 133, 0.25);
+    box-shadow: 0 -1px 4px rgb(134, 134, 133, 0.25);
+
     // z-index: 9999;
 }
 
@@ -394,30 +389,30 @@ body {
     flex-direction: column;
     align-items: center;
     justify-content: center;
-    padding: 16px;
     width: 100%;
     height: 160px;
+    padding: 16px;
     border: 1px dashed #beb6b6;
     border-radius: 24px;
 
     .name {
-        line-height: 44px;
-        font-weight: 600;
-        font-size: 16px;
         display: flex;
         align-items: center;
-        text-align: center;
+        font-size: 16px;
+        font-weight: 600;
+        line-height: 44px;
         color: #1a1a1a;
+        text-align: center;
     }
 
     .back {
-        font-size: 16px;
-        line-height: 24px;
         display: flex;
         align-items: center;
+        font-size: 16px;
+        line-height: 24px;
+        color: #474747;
         text-align: center;
         letter-spacing: 0.005em;
-        color: #474747;
     }
 }
 
@@ -445,8 +440,8 @@ body {
     }
 
     .g-l {
-        margin-left: 16px;
         flex: 1;
+        margin-left: 16px;
 
         .g-item {
             display: flex;
@@ -455,39 +450,39 @@ body {
         }
 
         .label {
-            font-family: 'Roboto';
+            font-family: Roboto;
+            font-size: 14px;
             font-style: normal;
             font-weight: 600;
-            font-size: 14px;
             line-height: 20px;
-            text-align: left;
             color: #1a1a1a;
+            text-align: left;
         }
 
         .v {
-            font-family: 'Roboto';
+            font-family: Roboto;
+            font-size: 14px;
             font-style: normal;
             font-weight: 600;
-            font-size: 14px;
             line-height: 20px;
-            text-align: center;
             color: #1a1a1a;
+            text-align: center;
         }
     }
 }
 
 .fixed-right {
-    width: 40px;
-    height: 40px;
     position: fixed;
     top: 4px;
     right: 10px;
-    cursor: pointer;
-    color: var(--main-yellow);
+    z-index: 100;
     display: flex;
     align-items: center;
     justify-content: center;
-    z-index: 100;
+    width: 40px;
+    height: 40px;
+    color: var(--main-yellow);
+    cursor: pointer;
 
     i {
         display: flex;
@@ -506,83 +501,100 @@ body {
 
 .status-default {
     display: flex;
-    padding: 4px 8px;
-    justify-content: center;
-    align-items: center;
     gap: 10px;
-    border-radius: 9999px;
-    border: 0px solid #F4F4F4;
-    background: rgba(0, 157, 235, 0.20);
-    color: #009DEB;
+    align-items: center;
+    justify-content: center;
+    padding: 4px 8px;
     font-family: Roboto;
     font-size: 12px;
     font-style: normal;
     font-weight: 600;
     line-height: 16px;
+    color: #009deb;
     letter-spacing: 0.06px;
+    background: rgb(0, 157, 235, 0.2);
+    border: 0 solid #f4f4f4;
+    border-radius: 9999px;
 }
 
 .status-success {
-    background: rgba(76, 175, 80, 0.20);
-    color: #4CAF50;
+    color: #4caf50;
+    background: rgb(76, 175, 80, 0.2);
 }
 
 .status-error {
-    background: rgba(211, 47, 47, 0.21);
-    color: #D32F2F;
+    color: #d32f2f;
+    background: rgb(211, 47, 47, 0.21);
 }
 
 .status-views {
     display: flex;
+    align-items: center;
+    justify-content: center;
     width: 65.063px;
+
     // height: 36px;
     padding: 8px 16px;
-    justify-content: center;
-    align-items: center;
-    border-radius: 10px;
-    background: #EA002A;
-    color: #FFF;
-    text-align: center;
     font-family: Roboto;
     font-size: 14px;
     font-style: normal;
     font-weight: 600;
     line-height: 20px;
+    color: #fff;
+    text-align: center;
     letter-spacing: 0.07px;
+    background: #ea002a;
+    border-radius: 10px;
 }
 
 .ellipsis {
-    white-space: nowrap;
+    width: 100%;
     overflow: hidden;
     text-overflow: ellipsis;
-    width: 100%;
+    white-space: nowrap;
 }
 
-.custom-toast{
+.custom-toast {
+    top: 40%;
+    display: flex;
+    flex-direction: column;
+    gap: 16px;
+    align-items: center;
+    width: 348px;
+    padding: 32px 24px;
     background: #fff;
-display: flex;
-width: 348px;
-padding: 32px 24px;
-flex-direction: column;
-align-items: center;
-gap: 16px;
-border-radius: 20px;
-background: #FFF;
-top: 40%;
-box-shadow: 0px 4px 12px rgba(0, 0, 0, 0.1);
-
-    .van-icon__image{
+    border-radius: 20px;
+    box-shadow: 0 4px 12px rgb(0, 0, 0, 0.1);
+
+    .van-icon__image {
         width: 88px;
         height: 88px;
     }
+
     .van-toast__text {
-        color: #474747;
-        text-align: center;
         font-family: Roboto;
         font-size: 14px;
         font-style: normal;
         font-weight: 400;
         line-height: 20px;
+        color: #474747;
+        text-align: center;
         letter-spacing: 0.07px;
     }
 }
+
+.page-header {
+    position: fixed;
+    top: 0;
+    left: 0;
+    z-index: 13;
+    display: flex;
+    align-items: center;
+    width: 100%;
+    height: 60px;
+    font-size: var(--font-size-22);
+    font-weight: 700;
+    color: var(--white);
+    text-align: left;
+    background: #fff;
+}

+ 2 - 0
src/auto-imports.d.ts

@@ -303,6 +303,7 @@ declare global {
   const useToNumber: typeof import('@vueuse/core')['useToNumber']
   const useToString: typeof import('@vueuse/core')['useToString']
   const useToggle: typeof import('@vueuse/core')['useToggle']
+  const useTransferStore: typeof import('./stores/use-transfer-store')['default']
   const useTransition: typeof import('@vueuse/core')['useTransition']
   const useUrlSearchParams: typeof import('@vueuse/core')['useUrlSearchParams']
   const useUserMedia: typeof import('@vueuse/core')['useUserMedia']
@@ -652,6 +653,7 @@ declare module 'vue' {
     readonly useToNumber: UnwrapRef<typeof import('@vueuse/core')['useToNumber']>
     readonly useToString: UnwrapRef<typeof import('@vueuse/core')['useToString']>
     readonly useToggle: UnwrapRef<typeof import('@vueuse/core')['useToggle']>
+    readonly useTransferStore: UnwrapRef<typeof import('./stores/use-transfer-store')['default']>
     readonly useTransition: UnwrapRef<typeof import('@vueuse/core')['useTransition']>
     readonly useUrlSearchParams: UnwrapRef<typeof import('@vueuse/core')['useUrlSearchParams']>
     readonly useUserMedia: UnwrapRef<typeof import('@vueuse/core')['useUserMedia']>

+ 4 - 0
src/components.d.ts

@@ -9,8 +9,10 @@ export {}
 declare module 'vue' {
   export interface GlobalComponents {
     ApplyRecord: typeof import('./components/ApplyRecord.vue')['default']
+    CardWebsdkLink: typeof import('./components/CardWebsdkLink.vue')['default']
     CurrencySelect: typeof import('./components/CurrencySelect.vue')['default']
     CustomTabbar: typeof import('./components/CustomTabbar.vue')['default']
+    DisableClickOverlay: typeof import('./components/DisableClickOverlay.vue')['default']
     EmptyComponents: typeof import('./components/empty-components.vue')['default']
     EmptyState: typeof import('./components/EmptyState.vue')['default']
     FirstApply: typeof import('./components/FirstApply.vue')['default']
@@ -20,7 +22,9 @@ declare module 'vue' {
     KycInfo: typeof import('./components/KycInfo.vue')['default']
     Logout: typeof import('./components/Logout.vue')['default']
     MoreSelect: typeof import('./components/MoreSelect.vue')['default']
+    Operation: typeof import('./components/Operation.vue')['default']
     PageHeader: typeof import('./components/PageHeader.vue')['default']
+    QrCode: typeof import('./components/QrCode.vue')['default']
     RemitInput: typeof import('./components/RemitInput.vue')['default']
     RouterLink: typeof import('vue-router')['RouterLink']
     RouterView: typeof import('vue-router')['RouterView']

+ 307 - 99
src/components/ApplyRecord.vue

@@ -1,92 +1,147 @@
 <template>
-    <div :class="['page', cardInfo.applyStatus == 1 ? 'page' : 'page']">
-        <div class="card-swiper">
-            <div class="swiper-container">
-                <div class="card-wrapper">
-                    <div class="card-info" @click.stop="(e: MouseEvent) => toggleCardNo(card.id, e)" :class="{ flipping: isFlipping[cardInfo.id] }">
-                        <img src="@/assets/images/logo.png" alt="" srcset="" />
-                        <div class="number">
-                            {{ cardInfo?.cardNo?.replace(/(\d{4})\d+(\d{4})/, '$1 **** **** $2') }}
-                        </div>
-                        <div class="card-b">
-                            <div class="valid">
-                                <span class="lable">{{ t('cards.p13') }}</span>
-                                <span>{{ cardInfo.firstName }} {{ cardInfo.lastName }}</span>
-                            </div>
-                            <div class="valid">
-                                <span class="lable">{{ t('cards.p14') }}</span>
-                                <span>{{ cardInfo.expire }}</span>
-                            </div>
-                        </div>
-                        <img
-                            v-if="cardInfo.status != 1"
-                            src="https://upload.wikimedia.org/wikipedia/commons/a/a4/Flag_of_the_United_States.svg"
-                            class="flags"
-                            @click.stop="ucardActivate(cardInfo.id)"
-                        />
-                    </div>
-                </div>
+    <div class="page">
+        <div class="step">
+            <div v-for="item in stepList" :key="item.id" :class="step >= item.id ? 'step-item step-active' : 'step-item'">
+                <div v-t="$t(item.name)" class="step-item-content"></div>
             </div>
         </div>
 
-        <div class="balance-content">{{ t('apply-record-detail.p1') }}</div>
-        <div class="g">
-            <img src="../assets/images/apply-record-1.png" alt="" />
-            <div class="g-l">
-                <div class="g-item">
-                    <div class="label a1">{{ cardInfo.cardName }}</div>
+        <div class="form-box">
+            <div v-if="step == 1" class="status-box">
+                <div class="status">
+                    <template v-if="cardInfo.tradeType == '1'">
+                        <span v-if="cardInfo.tradeStatus == '2'" v-t="'card.Info.t8'"></span>
+                        <span v-else-if="cardInfo.tradeStatus == '3'" v-t="'card.Info.t9'"></span>
+                        <span v-else v-t="'card.Info.t5'"></span>
+                    </template>
+
+                    <template v-if="cardInfo.tradeType == '2'">
+                        <span v-if="cardInfo.tradeStatus == '2'" v-t="'card.Info.t12'"></span>
+                        <span v-else-if="cardInfo.tradeStatus == '3'" v-t="'card.Info.t13'"></span>
+                        <span v-else v-t="'card.Info.t11'"></span>
+                    </template>
                 </div>
-                <div class="g-item">
-                    <div class="label">{{ t('apply-record-detail.p2') }}</div>
-                    <div :class="statusClass(cardInfo.kycStatus)">{{ statusMap[cardInfo.kycStatus] }}</div>
+                <template v-if="cardInfo.tradeType == '1'">
+                    <template v-if="cardInfo.tradeStatus == '1'">
+                        <p v-t="'card.Info.s31'"></p>
+                        <img src="@/assets/images/card/img1.png" alt="" srcset="">
+                    </template>
+                    <template v-if="cardInfo.tradeStatus == '3'">
+                        <p v-t="'card.Info.s32'"></p>
+                        <img src="@/assets/images/card/img4.png" alt="" srcset="">
+                    </template>
+                </template>
+                <template v-if="cardInfo.tradeType == '2'">
+                    <template v-if="cardInfo.tradeStatus == '1'">
+                        <p v-t="'card.Info.s32'"></p>
+                        <img src="@/assets/images/card/img1.png" alt="" srcset="">
+                    </template>
+                    <template v-if="cardInfo.tradeStatus == '2'">
+                        <p v-t="'card.Info.s33'"></p>
+                        <img src="@/assets/images/card/img3.png" alt="" srcset="">
+                    </template>
+                </template>
+            </div>
+            <div v-if="step == 2" class="status-box">
+                <div class="status">
+                    <span v-if="cardInfo.approveStatus == '2'" v-t="'card.Info.t2'"></span>
+                    <span v-else-if="cardInfo.approveStatus == '3'" v-t="'card.Info.t3'"></span>
+                    <span v-else v-t="'card.Info.t1'"></span>
                 </div>
-                <div class="g-item" v-if="cardInfo.kycStatus == 2 &&(cardInfo.applyStatus === 0 || cardInfo.applyStatus === 1)">
-                    <div class="label">{{ t('apply-record-detail.p7') }}</div>
-                    <div :class="statusClass1(cardInfo.applyStatus)">{{ applyStatusMap[cardInfo.applyStatus] }}</div>
+                <template v-if="cardInfo.approveStatus == '1'">
+                    <p v-t="'card.Info.s34'"></p>
+                    <img src="@/assets/images/card/img1.png" alt="" srcset="">
+                </template>
+                <template v-if="cardInfo.approveStatus == '3'">
+                    <p v-t="'card.Info.s35'"></p>
+                    <img src="@/assets/images/card/img4.png" alt="" srcset="">
+                </template>
+            </div>
+            <div v-if="step == 3" class="status-box">
+                <div class="status">
+                    <span v-if="cardInfo.status === 'success'" v-t="'card.Info.t6'"></span>
+                    <span v-else-if="cardInfo.status === 'fail'" v-t="'card.Info.t7'"></span>
+                    <span v-else-if="cardInfo.status === 'processing'" v-t="'card.Info.t5'"></span>
+                    <span v-else v-t="'card.Info.t10'"></span>
                 </div>
+
+                <template v-if="cardInfo.status == 'success'">
+                    <p v-t="'card.Info.s36'"></p>
+                    <img src="@/assets/images/card/img5.png" alt="" srcset="">
+                    <div class="step-box">
+                        <div class="step-item">
+                            <div class="ids">1</div>
+                            <p v-t="'card.Info.s22'" class="k"></p>
+                            <p v-t="'card.Info.s23'" class="v"></p>
+                        </div>
+                        <div class="step-item">
+                            <div class="ids">2</div>
+                            <p v-t="'card.Info.s24'" class="k"></p>
+                            <p v-t="'card.Info.s25'" class="v"></p>
+                        </div>
+                        <div class="step-item">
+                            <div class="ids">3</div>
+                            <p v-t="'card.Info.s26'" class="k"></p>
+                            <p v-t="'card.Info.s27'" class="v"></p>
+                        </div>
+                        <div class="step-item">
+                            <div class="ids">4</div>
+                            <p v-t="'card.Info.s28'" class="k"></p>
+                            <p v-t="'card.Info.s29'" class="v"></p>
+                            <p v-t="'card.Info.s30'" class="v"></p>
+                        </div>
+                    </div>
+                    <div v-t="'card.Info.s21'" class="f"></div>
+                </template>
+                <template v-else-if="cardInfo.status == 'fail'">
+                    <p v-t="'card.Info.s37'"></p>
+                    <img src="@/assets/images/card/img4.png" alt="" srcset="">
+                </template>
+                <template v-else>
+                    <p v-t="'card.Info.s38'"></p>
+                    <img src="@/assets/images/card/img1.png" alt="" srcset="">
+                </template>
             </div>
         </div>
-
-        <div class="card-info1" v-if="cardInfo.cardName && !props.type">
+        <div v-if="cardInfo.cardName && !props.type" class="card-info1">
             <div class="card-title">{{ cardInfo.cardName }}</div>
             <div class="card-content">{{ cardInfo.cardDesc }}</div>
             <ul class="card-list">
                 <li>
-                    <span class="label">{{ t(`select-card.kycRequire`) }}</span>
-                    <span>{{ cardInfo.kycRequire ? t('select-card.kycRequiredDesc') : t('select-card.kycRequiredDesc2') }}</span>
+                    <span class="label">{{ t(`card.New1.d13`) }}</span>
+                    <span>{{ cardInfo.mailingAreaCode }} {{ cardInfo.mailingMobile }}</span>
+                </li>
+                <li>
+                    <span class="label">{{ t('card.New1.d8') }}</span>
+                    <span>{{ cardInfo.mailingCountry || '--' }}</span>
                 </li>
                 <li>
-                    <span class="label">{{ t('select-card.currency') }}</span>
-                    <span>{{ cardInfo?.rechargeCurrencyInfoList[0]?.currency }}</span>
+                    <span class="label">{{ t('card.New1.d9') }}</span>
+                    <span>{{ cardInfo.mailingTown }}</span>
                 </li>
                 <li>
-                    <span class="label">{{ t('select-card.needPhotoForActiveCard') }}</span>
-                    <span>{{
-                        cardInfo.needPhotoForActiveCard ? t('select-card.needPhotoForActiveCardDesc') : t('select-card.needPhotoForActiveCardDesc2')
-                    }}</span>
+                    <span class="label">{{ t('card.New1.d10') }}</span>
+                    <span>{{ cardInfo.mailingAddressCn }}</span>
                 </li>
                 <li>
-                    <span class="label">{{ t('select-card.needPhotoForOperateCard') }}</span>
-                    <span>{{ cardInfo.kycRequire ? t('select-card.kycRequiredDesc') : t('select-card.kycRequiredDesc2') }}</span>
+                    <span class="label">{{ t('card.New1.d11') }}</span>
+                    <span>{{ cardInfo.mailingAddress }}</span>
                 </li>
                 <li>
-                    <span class="label">{{ t('select-card.status') }}</span>
-                    <span>{{ cardInfo.status ? t('select-card.statusDesc') : t('select-card.statusDesc2') }}</span>
+                    <span class="label">{{ t('card.New1.d12') }}</span>
+                    <span>{{ cardInfo.mailingPostCode }}</span>
                 </li>
-                <li class="one">
-                    <span class="label">{{ t('select-card.price') }}</span>
-                    <span>{{ t('select-card.free') }}</span>
+                <li class="one" :class="statusClass(cardInfo.status)">
+                    <span class="label">{{ t('apply-record-detail.p7') }}</span>
+                    <span>{{ statusMap[cardInfo.status] || t('apply-record-detail.p8') }}</span>
                 </li>
             </ul>
         </div>
 
-        <div class="fixed-btn" v-if="cardInfo.kycStatus === 2 && cardInfo.applyStatus === null">
-            <div class="cwg-button">
-                <van-button type="primary" block @click="handleApply(3, cardInfo)">{{ t('cards.p7') }}</van-button>
-            </div>
-        </div>
-
-        <div class="fixed-btn" v-if="[null, -1, 1, 3].includes(cardInfo.kycStatus)">
+        <div
+            v-if="(cardInfo.tradeStatus == '3' || (cardInfo.tradeStatus == '2' && cardInfo.tradeType == '2')) && cardInfo.applyStatus == 'fail'"
+            class="fixed-btn"
+        >
             <div class="cwg-button">
                 <van-button type="primary" block @click="handleApply(3, cardInfo)">{{ t('cards.p7') }}</van-button>
             </div>
@@ -97,8 +152,13 @@
 <script setup lang="ts">
 import { useI18n } from 'vue-i18n'
 import useUserStore from '@/stores/use-user-store'
+
+const props = defineProps({
+    id: String,
+    type: String,
+})
 const userStore = useUserStore()
-const cardList = computed(() => userStore.userCard)
+const applyList = computed(() => userStore.applyCard)
 const { t } = useI18n()
 const cardInfo = ref({})
 const showCardNo = ref<{ [key: string]: boolean }>({})
@@ -106,63 +166,70 @@ const isFlipping = ref<{ [key: string]: boolean }>({})
 const isShowBtn = ref(false)
 const dateRange = ref<[string, string] | undefined>(undefined)
 dateRange.value = ['', '']
-const props = defineProps({
-    cardTypeId: String,
-    type: String,
-})
+const stepList = [
+    { id: 1, name: 'card.Info.s39', status: 'finish' },
+    { id: 2, name: 'card.Info.s40', status: 'process' },
+    { id: 3, name: 'card.Info.s41', status: 'wait' },
+]
+const step = ref(1)
 async function getKycList() {
-    let b = cardList.value.filter((i) => {
+    const b = applyList.value.filter((i) => {
         return i.kycStatus == null
     })
     if (b.length != 0) {
         isShowBtn.value = true
-    } else {
+    }
+    else {
         isShowBtn.value = false
     }
-    let filtered = cardList.value
-    if (props.cardTypeId) {
-        filtered = cardList.value.filter((item) => item.cardTypeId == props.cardTypeId)
+    const filtered = applyList.value
+    if (props.id) {
+        let a = {
+            status: 'success',
+            tradeStatus: 2,
+            approveStatus: 2,
+            tradeType: 1,
+        }
+        a = applyList.value.filter(item => item.id == props.id)[0]
+        if (a?.tradeStatus == 1)
+            step.value = 1
+        if (a?.tradeStatus == 2 && a.tradeType == 1)
+            step.value = 2
+        if (a?.approveStatus == 2)
+            step.value = 3
+        cardInfo.value = a
     }
-    cardInfo.value = filtered[0]
+
+    console.log(props, cardInfo.value, applyList.value, props.id, filtered[0], 198)
 }
 const statusMap: Record<string, string> = {
-    null: t('kyc.statusDesc'),
-    '-1': t('kyc.statusDesc'),
-    '1': t('kyc.statusDesc2'),
-    '2': t('kyc.statusDesc3'),
-    '3': t('kyc.statusDesc4'),
-}
-const applyStatusMap: Record<string, string> = {
-    '0': t('apply-record-detail.p8'),
-    '1': t('apply-record-detail.p6'),
+    success: t('apply-record-detail.p6'),
+    fail: t('apply-record-detail.p9'),
+    processing: t('apply-record-detail.p8'),
+    wait_process: t('apply-record-detail.p8'),
+    cancel: t('apply-record-detail.p8'),
 }
-function statusClass(status: number) {
+function statusClass(status: string) {
     switch (status) {
-        case 2:
-            return 'status-default status-success'
-        case 3:
-            return 'status-default status-error'
+        case 'success':
+            return 'one'
+        case 'fail':
+            return 'error'
+        case 'cancel':
+            return 'error'
         default:
-            return 'status-default'
-    }
-}
-function statusClass1(status: number) {
-    switch (status) {
-        case 1:
-            return 'status-default status-success'
-        default:
-            return 'status-default'
+            return 'default'
     }
 }
 
-const toggleCardNo = (cardId: string, event: MouseEvent) => {
+function toggleCardNo(cardId: string, event: MouseEvent) {
     event.stopPropagation()
     isFlipping.value[cardId] = !isFlipping.value[cardId]
     showCardNo.value[cardId] = !showCardNo.value[cardId]
 }
 
 onMounted(async () => {
-    cardList.value.forEach((card) => {
+    applyList.value.forEach((card) => {
         showCardNo.value[card.id] = false
         isFlipping.value[card.id] = false
     })
@@ -675,10 +742,16 @@ onMounted(async () => {
 }
 
 .label {
+    display: inline-block;
     font-weight: 600;
     font-size: 14px;
     line-height: 20px;
     color: #8e8a8a;
+    width: 100px;
+    white-space: nowrap;
+    overflow: hidden;
+    text-overflow: ellipsis;
+    padding-right: 10px;
 }
 
 .card-list li:hover {
@@ -725,5 +798,140 @@ onMounted(async () => {
             line-height: 24px;
         }
     }
+    .error {
+        color: #d32f2f;
+    }
+    .default {
+        color: #009deb;
+    }
+}
+
+.step {
+    display: flex;
+    align-items: center;
+    padding: 20px 0;
+    color: #000;
+    .step-item {
+        width: 315px;
+        position: relative;
+        text-align: center;
+        margin-right: 20px;
+        text-align: left;
+        font-size: 16px;
+        padding-top: 20px;
+        &::after {
+            content: '';
+            position: absolute;
+            top: 0;
+            right: 0;
+            width: 100%;
+            z-index: 1;
+            height: 5px;
+            position: absolute;
+            background: #f1f1f1;
+        }
+    }
+    .step-active {
+        font-weight: bold;
+        &::after {
+            background: #eb3f57;
+        }
+    }
+}
+.status-box {
+    width: 100%;
+    display: flex;
+    align-items: flex-start;
+    justify-content: flex-start;
+    flex-wrap: wrap;
+    padding: 20px 0;
+    .status {
+        font-weight: 600;
+        font-size: 22px;
+        line-height: 28px;
+        text-align: left;
+        color: #1a1a1a;
+    }
+    p {
+        width: 100%;
+        text-align: start;
+        color: #6f6f6f;
+        font-size: 18px;
+        font-weight: 400;
+        word-wrap: break-word;
+        line-height: 32px;
+        padding: 20px 20px 20px 0;
+    }
+
+    .a-title {
+        color: #333333;
+        font-size: 18px;
+        font-weight: 500;
+        word-wrap: break-word;
+        margin-top: 44px;
+    }
+    .step-box {
+        width: 100%;
+        display: flex;
+        flex-wrap: wrap;
+        justify-content: space-between;
+        margin-top: 20px;
+        .step-item {
+            width: 100%;
+            padding-left: 60px;
+            text-align: center;
+            position: relative;
+            &::after {
+                content: '';
+                position: absolute;
+                top: 0;
+                left: 15px;
+                width: 0;
+                height: 100%;
+                border-left: 1px dashed #ccc;
+                z-index: 1;
+            }
+            &:last-child {
+                &::after {
+                    display: none;
+                }
+            }
+            .ids {
+                position: absolute;
+                left: 0;
+                top: 0;
+                width: 30px;
+                height: 30px;
+                position: absolute;
+                color: #000;
+                line-height: 30px;
+                background-color: #fff;
+                text-align: center;
+                border-radius: 9999px;
+                border: 1px #ccc dashed;
+                z-index: 12;
+            }
+
+            .k {
+                font-size: 14px;
+                color: #333333;
+                font-weight: bold;
+                padding: 0;
+            }
+            .v {
+                font-size: 14px;
+                color: #6f6f6f;
+                padding: 0;
+            }
+        }
+    }
+    .f {
+        margin: 20px 0 0 60px;
+        color: #333333;
+        font-size: 14px;
+        font-family: PingFang SC;
+        font-weight: 500;
+        word-wrap: break-word;
+    }
 }
 </style>

+ 109 - 0
src/components/CardWebsdkLink.vue

@@ -0,0 +1,109 @@
+<template>
+    <van-dialog v-model:show="dialogCheck" :show-cancel-button="false" :show-confirm-button="false" width="90%" class="dialog_header_w">
+        <div class="dia-content">
+            <div class="icon">
+                <img src="../assets/images/success.png" alt="">
+            </div>
+            <!-- <div class="des1" v-t="'improve-info.Des1'"></div>
+            <div class="des2" v-t="'improve-info.Des11'"></div> -->
+            <div v-if="code == 200 && text1" v-t="'card.Info.s42'" class="des1"></div>
+            <div v-if="code == 200 && !text1" v-t="'card.Info.s43'" class="des1"></div>
+            <div v-if="code == 201" v-t="'card.Info.s7'" class="des1"></div>
+            <div v-if="code == 201" v-t="'card.Info.s5'" class="des2"></div>
+            <QrCode v-if="qrCodeStatus && text1" :text="text1"></QrCode>
+            <div class="dialog-footer">
+                <van-button v-t="'card.Btn.Confirm'" block @click="closeDia"></van-button>
+            </div>
+        </div>
+    </van-dialog>
+</template>
+
+<script setup>
+import { ref } from 'vue'
+import { useRouter } from 'vue-router'
+import { ucardApi } from '@/api/ucard'
+import QrCode from '@/components/QRCode.vue'
+import Config from '@/config/index'
+
+const router = useRouter()
+const { Code } = Config
+
+const dialogCheck = ref(false)
+const text1 = ref('')
+const code = ref(200)
+const qrCodeStatus = ref(false)
+const metaInfo = ref(null)
+
+function closeDia() {
+    dialogCheck.value = false
+    router.push('/mine')
+}
+
+function getMetaInfo() {
+    metaInfo.value = window.getMetaInfo()
+    metaInfo.value = { ...metaInfo.value, deviceType: 'h5' }
+}
+
+async function getWebsdkLink(cardId) {
+    dialogCheck.value = true
+
+    try {
+        if (cardId) {
+            getMetaInfo()
+            const res = await ucardApi.getWebsdkLink({
+                cardId,
+                metaInfo: metaInfo.value,
+            })
+            code.value = res.code
+            if (res.code === 200) {
+                qrCodeStatus.value = true
+                text1.value = JSON.parse(res.data).url
+            }
+            else {
+                qrCodeStatus.value = false
+                text1.value = ''
+            }
+        }
+        else {
+            qrCodeStatus.value = false
+            text1.value = ''
+        }
+    }
+    catch (error) {
+        console.log(error)
+    }
+}
+
+// 暴露方法给父组件使用
+defineExpose({
+    getWebsdkLink,
+})
+</script>
+
+<style scoped lang="scss">
+.dialog_header_w {
+    .dia-content {
+        padding: 20px 10px;
+        text-align: center;
+        .icon img {
+            width: 80px;
+            height: 80px;
+        }
+        .des1 {
+            font-weight: bold;
+            font-size: 14px;
+            color: #000;
+            margin: 30px 0 20px;
+        }
+        .des2 {
+            font-size: 12px;
+            color: #000;
+            margin: 20px 0;
+            line-height: 20px;
+        }
+        .dialog-footer {
+            margin-top: 20px;
+        }
+    }
+}
+</style>

+ 15 - 14
src/components/CurrencySelect.vue

@@ -1,10 +1,10 @@
 <template>
     <van-action-sheet v-model:show="show" class="sheet">
         <div class="currency-mask">
-            <div class="search" v-if="showSearch">
+            <div v-if="showSearch" class="search">
                 <van-field
-                    class="form-input"
                     v-model="inputValueDoc"
+                    class="form-input"
                     type="text"
                     :placeholder="t('common.country')"
                     :clearable="true"
@@ -15,7 +15,7 @@
             </div>
             <div class="currency-select">
                 <div v-for="item in filteredOptions" :key="item.value" class="currency-item" @click="select(item)">
-                    <img :src="imageSrc(item.value)" alt="" srcset="" />
+                    <img :src="imageSrc(item.value)" alt="" srcset="">
                     {{ item.value }}
                     <span> {{ item.text }} </span>
                 </div>
@@ -26,35 +26,36 @@
 
 <script setup lang="ts">
 import { useI18n } from 'vue-i18n'
-const {t} = useI18n()
+
 const props = defineProps<{
     modelValue: boolean
     showSearch: boolean
-    options: Array<{ text: string; value: string }>
+    options: Array<{ text: string, value: string }>
 }>()
-const inputValueDoc = ref('')
 const emit = defineEmits(['update:modelValue', 'select'])
-
+const { t } = useI18n()
+const inputValueDoc = ref('')
 const show = ref(props.modelValue)
 
 const filteredOptions = computed(() => {
-    if (!inputValueDoc.value) return props.options
+    if (!inputValueDoc.value)
+        return props.options
     const keyword = inputValueDoc.value.toLowerCase()
-    return props.options.filter((item) => item.text.toLowerCase().includes(keyword) || item.value.toLowerCase().includes(keyword))
+    return props.options.filter(item => item.text.toLowerCase().includes(keyword) || item.value.toLowerCase().includes(keyword))
 })
 const images = import.meta.glob('@/assets/images/currency/*.png', { eager: true })
 
-const imageSrc = (currency:string) => {
-  return images[`/src/assets/images/currency/${currency}.png`]?.default || fallbackImg
+function imageSrc(currency: string) {
+    return images[`/src/assets/images/currency/${currency}.png`]?.default || fallbackImg
 }
 
 watch(
     () => props.modelValue,
-    (val) => (show.value = val),
+    val => (show.value = val),
 )
-watch(show, (val) => emit('update:modelValue', val))
+watch(show, val => emit('update:modelValue', val))
 
-function select(item: { text: string; value: string }) {
+function select(item: { text: string, value: string }) {
     emit('select', item)
     show.value = false
 }

+ 42 - 42
src/components/CustomTabbar.vue

@@ -1,61 +1,61 @@
 <template>
     <nav class="custom-tabbar">
-      <div
-        v-for="item in tabs"
-        :key="item.path"
-        :class="['tabbar-item', { active: route.path === item.path }]"
-        @click="onTabClick(item.path)"
-      >
-        <span class="tabbar-icon">
+        <div
+            v-for="item in tabs"
+            :key="item.path"
+            class="tabbar-item" :class="[{ active: route.path === item.path }]"
+            @click="onTabClick(item.path)"
+        >
+            <span class="tabbar-icon">
 
-          <icon :name="route.path === item.path ? item.iconActive : item.icon" />
-        </span>
-        <span class="tabbar-label">{{ item.label }}</span>
-      </div>
+                <icon :name="route.path === item.path ? item.iconActive : item.icon" />
+            </span>
+            <span class="tabbar-label">{{ item.label }}</span>
+        </div>
     </nav>
-  </template>
+</template>
 
-  <script setup lang="ts">
-  import { useI18n } from 'vue-i18n'
-  import { useRouter, useRoute } from 'vue-router'
+<script setup lang="ts">
+import { useI18n } from 'vue-i18n'
+import { useRoute, useRouter } from 'vue-router'
 
-  const { t } = useI18n()
-  const router = useRouter()
-  const route = useRoute()
+const { t } = useI18n()
+const router = useRouter()
+const route = useRoute()
 
-  const tabs = [
+const tabs = [
     {
-      label: t('tabs.wallet'),
-      path: '/',
-      icon: 'icon_wallet',
-      iconActive: 'icon_wallet',
+        label: t('tabs.wallet'),
+        path: '/',
+        icon: 'icon_wallet',
+        iconActive: 'icon_wallet',
     },
     {
-      label: t('tabs.cards'),
-      path: '/cards',
-      icon: 'icon_card',
-      iconActive: 'icon_card',
+        label: t('tabs.cards'),
+        path: '/cards',
+        icon: 'icon_card',
+        iconActive: 'icon_card',
     },
-  //   {
-  //     label: t('tabs.finance'),
-  //     path: '/finance',
-  //     icon: 'gold-coin-o',
-  //     iconActive: 'gold-coin',
-  //   },
+    //   {
+    //     label: t('tabs.finance'),
+    //     path: '/finance',
+    //     icon: 'gold-coin-o',
+    //     iconActive: 'gold-coin',
+    //   },
     {
-      label: t('tabs.mine'),
-      path: '/mine',
-      icon: 'icon_my',
-      iconActive: 'icon_my',
+        label: t('tabs.mine'),
+        path: '/mine',
+        icon: 'icon_my',
+        iconActive: 'icon_my',
     },
-  ]
+]
 
-  function onTabClick(path: string) {
+function onTabClick(path: string) {
     if (route.path !== path) {
-      router.replace(path)
+        router.replace(path)
     }
-  }
-  </script>
+}
+</script>
 
   <style scoped>
   .custom-tabbar {

+ 23 - 0
src/components/DisableClickOverlay.vue

@@ -0,0 +1,23 @@
+<template>
+    <div v-if="active" class="disable-click-overlay" @click.stop @touchstart.stop @touchend.stop></div>
+</template>
+
+<script setup>
+import { defineProps } from 'vue'
+
+const props = defineProps({
+    active: { type: Boolean, default: false },
+})
+</script>
+
+<style scoped>
+.disable-click-overlay {
+  position: fixed;
+  top: 0; left: 0;
+  width: 100vw;
+  height: 100vh;
+  z-index: 9999;
+  background: rgba(0,0,0,0); /* 透明 */
+  pointer-events: none;      /* 不阻止滚动 */
+}
+</style>

+ 1 - 1
src/components/EmptyState.vue

@@ -1,6 +1,6 @@
 <template>
     <div class="empty-state">
-        <img src="@/assets/images/undraw.png" alt="" />
+        <img src="@/assets/images/undraw.png" alt="">
         <div class="r">
             <p class="title">{{ title }}</p>
             <p class="text">{{ text }}</p>

+ 159 - 20
src/components/FirstApply.vue

@@ -1,45 +1,58 @@
 <template>
     <div class="page">
-        <img class="imgs" src="../assets/images/frst-apply-img.png" alt="" srcset="" />
-        <div class="apply-card-steps">
-            <div class="steps-top">
-                <div class="step">
-                    <div class="step-circle">1</div>
-                    <div class="step-label">{{ t('cards.p1') }}</div>
+        <div class="status-box">
+            <p v-t="'card.Info.s11'"></p>
+            <img src="@/assets/images/card/img2.png" alt="" srcset="">
+            <div class="status-box-btn">
+                <div v-t="'card.Btn.b7'" class="btn-apply" @click="handleApply"></div>
+            </div>
+            <div v-t="'card.Info.s12'" class="a-title"></div>
+            <div class="step-box">
+                <div class="step-item">
+                    <div class="ids">1</div>
+                    <p v-t="'card.Info.s13'" class="k"></p>
+                    <p v-t="'card.Info.s14'" class="v"></p>
+                </div>
+                <div class="step-item">
+                    <div class="ids">2</div>
+                    <p v-t="'card.Info.s15'" class="k"></p>
+                    <p v-t="'card.Info.s16'" class="v"></p>
                 </div>
-                <div class="step-dash"></div>
-                <div class="step">
-                    <div class="step-circle">2</div>
-                    <div class="step-label">{{ t('cards.p2') }}</div>
+                <div class="step-item">
+                    <div class="ids">3</div>
+                    <p v-t="'card.Info.s17'" class="k"></p>
+                    <p v-t="'card.Info.s18'" class="v"></p>
                 </div>
-                <div class="step-dash"></div>
-                <div class="step">
-                    <div class="step-circle">3</div>
-                    <div class="step-label">{{ t('cards.p3') }}</div>
+                <div class="step-item">
+                    <div class="ids">4</div>
+                    <p v-t="'card.Info.s19'" class="k"></p>
+                    <p v-t="'card.Info.s20'" class="v"></p>
                 </div>
             </div>
+            <div v-t="'card.Info.s21'" class="f"></div>
         </div>
-        <div class="cwg-button">
+        <!-- <div class="cwg-button">
             <van-button type="primary" block @click="handleApply">{{ t('cards.p4') }}</van-button>
-        </div>
+        </div> -->
     </div>
 </template>
 
 <script setup lang="ts">
 import { useI18n } from 'vue-i18n'
 import { useRouter } from 'vue-router'
+
 const router = useRouter()
 const { t } = useI18n()
-const handleApply = () => {
+function handleApply() {
     router.push('/select/card')
 }
 </script>
 
 <style scoped lang="scss">
-.page{
-    margin: 140px 16px 0 16px;
+.page {
+    margin: 0 24px 100px 24px;
 }
-.imgs{
+.imgs {
     margin-left: 74px;
     margin-bottom: 40px;
 }
@@ -100,4 +113,130 @@ const handleApply = () => {
     text-align: center;
     line-height: 2;
 }
+
+.status-box {
+    width: 100%;
+    display: flex;
+    justify-content: flex-start;
+    flex-wrap: wrap;
+    margin-bottom: 20px;
+    gap: 16px;
+    .status {
+        width: 100%;
+        color: #333333;
+        font-size: 26px;
+        font-family: PingFang SC;
+        font-weight: 500;
+        word-wrap: break-word;
+        text-align: start;
+    }
+    p {
+        width: 100%;
+        text-align: start;
+        color: #6f6f6f;
+        font-size: 18px;
+        font-family: PingFang SC;
+        font-weight: 400;
+        word-wrap: break-word;
+        line-height: 32px;
+        padding: 20px 30% 20px 0;
+        margin: 0;
+    }
+
+    .a-title {
+        color: #333333;
+        font-size: 18px;
+        font-family: PingFang SC;
+        font-weight: 500;
+        word-wrap: break-word;
+        margin-top: 44px;
+    }
+    .step-box {
+        width: 100%;
+        display: flex;
+        flex-wrap: wrap;
+        justify-content: space-between;
+        margin-top: 20px;
+        .step-item {
+            width: 100%;
+            padding-left: 60px;
+            text-align: center;
+            position: relative;
+            &::after {
+                content: '';
+                position: absolute;
+                top: 0;
+                left: 15px;
+                width: 0;
+                height: 100%;
+                border-left: 1px dashed #ccc;
+                z-index: 1;
+            }
+            &:last-child {
+                &::after {
+                    display: none;
+                }
+            }
+            .ids {
+                position: absolute;
+                left: 0;
+                top: 0;
+                width: 30px;
+                height: 30px;
+                position: absolute;
+                color: #000;
+                line-height: 30px;
+                background-color: #fff;
+                text-align: center;
+                border-radius: 9999px;
+                border: 1px #ccc dashed;
+                z-index: 12;
+            }
+
+            .k {
+                font-size: 14px;
+                color: #333333;
+                font-weight: bold;
+                padding: 0;
+            }
+            .v {
+                font-size: 14px;
+                color: #6f6f6f;
+                padding: 0;
+            }
+        }
+    }
+    .f {
+        margin: 20px 0 0 60px;
+        color: #333333;
+        font-size: 14px;
+        font-family: PingFang SC;
+        font-weight: 500;
+        word-wrap: break-word;
+    }
+}
+
+.status-box-btn {
+    margin-top: 20px;
+    width: 100%;
+    display: flex;
+    justify-content: flex-start;
+    .btn-apply {
+        width: 193px;
+        height: 40px;
+        background: #eb3f57;
+        border-radius: 4px;
+        text-align: center;
+        color: white;
+        font-size: 16px;
+        font-family: Roboto;
+        font-weight: 600;
+        line-height: 40px;
+        cursor: pointer;
+        user-select: none;
+    }
+}
+.status-box-btn1 {
+    justify-content: center;
+}
 </style>

+ 23 - 22
src/components/Icon.vue

@@ -1,39 +1,40 @@
 <template>
     <span
-      class="icon"
-      v-html="svgContent"
-      :style="{ width: size + 'px', height: size + 'px', color }"
+        class="icon"
+        :style="{ width: `${size}px`, height: `${size}px`, color }"
+        v-html="svgContent"
     />
-  </template>
+</template>
 
-  <script setup>
-  import { ref, watchEffect } from 'vue'
+<script setup>
+import { ref, watchEffect } from 'vue'
 
-  const props = defineProps({
-    name: { type: String, required: true },         // 图标名,如 download → download.svg
+const props = defineProps({
+    name: { type: String, required: true }, // 图标名,如 download → download.svg
     size: { type: [Number, String], default: 24 },
-    color: { type: String, default: '' }
-  })
+    color: { type: String, default: '' },
+})
 
-  const svgContent = ref('')
+const svgContent = ref('')
 
-  // 使用 Vite 的 glob 导入所有图标
-  const modules = import.meta.glob('@/assets/icons/*.svg', { as: 'raw' })
+// 使用 Vite 的 glob 导入所有图标
+const modules = import.meta.glob('@/assets/icons/*.svg', { as: 'raw' })
 
-  watchEffect(async () => {
+watchEffect(async () => {
     const path = `/src/assets/icons/${props.name}.svg`
     const loader = modules[path]
 
     if (loader) {
-      const raw = await loader()
-      // 替换 fill="..." 为 fill="currentColor",使颜色可控
-      svgContent.value = raw.replace(/fill="[^"]*"/g, 'fill="currentColor"')
-    } else {
-      console.warn(`[Icon] SVG not found: ${props.name}`)
-      svgContent.value = ''
+        const raw = await loader()
+        // 替换 fill="..." 为 fill="currentColor",使颜色可控
+        svgContent.value = raw.replace(/fill="[^"]*"/g, 'fill="currentColor"')
     }
-  })
-  </script>
+    else {
+        console.warn(`[Icon] SVG not found: ${props.name}`)
+        svgContent.value = ''
+    }
+})
+</script>
 
   <style scoped>
   .icon {

+ 189 - 113
src/components/KycInfo.vue

@@ -1,106 +1,179 @@
 <template>
     <div class="page page-shadow">
-        <van-form ref="formRef" class="kyc-form" v-if="isShow && countryOptions.length > 0">
+        <van-form v-if="isShow && countryOptions.length > 0" ref="formRef" class="kyc-form">
             <remit-input
                 v-model:value="infoForm.lastName"
                 fkey="lastName"
                 :required="true"
-                :label="t('improve-info.p8')"
-                :rules="rules['lastName']"
+                :label="t('card.Form.f4')"
+                :rules="rules.lastName"
+                :readonly="isReadonly"
+                :disabled="isReadonly"
                 @change="handleChange"
             />
             <remit-input
                 v-model:value="infoForm.firstName"
                 fkey="firstName"
                 :required="true"
-                :label="t('improve-info.p9')"
-                :rules="rules['firstName']"
+                :label="t('card.Form.f5')"
+                :rules="rules.firstName"
+                :readonly="isReadonly"
+                :disabled="isReadonly"
                 @change="handleChange"
             />
 
             <remit-input
                 v-model:value="infoForm.email"
                 fkey="email"
-                :label="t('improve-info.p7')"
+                :label="t('card.Form.f3')"
                 :required="true"
-                :rules="rules['email']"
+                :rules="rules.email"
+                :readonly="isReadonly"
+                :disabled="isReadonly"
                 @change="handleChange"
             />
             <div class="f">
                 <remit-input
-                    class="l"
-                    v-model:value="infoForm.areaCode"
                     v-if="phoneCodes.length > 0"
+                    v-model:value="infoForm.areaCode"
+                    class="l"
                     fkey="areaCode"
                     :required="true"
                     type="select"
                     :show-search="true"
                     :columns="phoneCodes"
-                    :label="t('improve-info.p6')"
-                    :rules="rules['areaCode']"
+                    :label="t('card.Form.f2')"
+                    :rules="rules.areaCode"
+                    :readonly="isReadonly"
+                    :disabled="isReadonly"
                     @change="handleChange"
                 />
-                <remit-input class="r" v-model:value="infoForm.mobile" fkey="mobile" label=" " :rules="rules['mobile']" @change="handleChange" />
+                <remit-input v-model:value="infoForm.mobile" class="r" fkey="mobile" label=" " :rules="rules.mobile" :readonly="isReadonly" :disabled="isReadonly" @change="handleChange" />
             </div>
             <remit-input
-                v-model:value="infoForm.sex"
-                fkey="sex"
+                v-model:value="infoForm.gender"
+                fkey="gender"
                 type="select"
+                :required="true"
                 :columns="sexOptions"
-                :label="t('improve-info.p13')"
+                :label="t('card.Form.f8')"
+                :readonly="isReadonly"
+                :disabled="isReadonly"
                 @change="handleChange"
             />
-            <remit-input v-model:value="infoForm.birthday" type="date" fkey="birthday" :label="t('improve-info.p10')" @change="handleChange" />
+            <remit-input v-model:value="infoForm.birthday" :required="true" type="date" fkey="birthday" :label="t('card.Form.f6')" :readonly="isReadonly" :disabled="isReadonly" @change="handleChange" />
+
             <remit-input
                 v-model:value="infoForm.nationality"
                 fkey="nationality"
                 type="select"
+                :required="true"
                 :show-search="true"
                 :columns="countryOptions"
-                :label="t('improve-info.p17')"
+                :label="t('card.Form.f7')"
+                :readonly="isReadonly"
+                :disabled="isReadonly"
                 @change="handleChange"
             />
             <remit-input
                 v-model:value="infoForm.town"
                 fkey="town"
+                :required="true"
                 :show-search="true"
                 type="select"
                 :columns="cityOptions"
-                :label="t('improve-info.p19')"
+                :label="t('card.Form.f9')"
+                :readonly="isReadonly"
+                :disabled="isReadonly"
                 @change="handleChange"
             />
             <remit-input
                 v-model:value="infoForm.address"
                 fkey="address"
-                :label="t('improve-info.p21')"
+                :label="t('card.Form.f10')"
                 :required="true"
-                :rules="rules['address']"
+                :rules="rules.address"
+                :readonly="isReadonly"
+                :disabled="isReadonly"
+                @change="handleChange"
+            />
+            <remit-input v-model:value="infoForm.postCode" :required="true" fkey="postCode" :label="t('card.Form.f11')" :readonly="isReadonly" :disabled="isReadonly" @change="handleChange" />
+
+            <remit-input
+                v-model:value="infoForm.occupation"
+                fkey="occupation"
+                type="select"
+                :required="true"
+                :columns="occupationList"
+                :label="t('card.Form.f12')"
+                :readonly="isReadonly"
+                :disabled="isReadonly"
+                @change="handleChange"
+            />
+            <remit-input v-model:value="infoForm.annualSalary" :required="true" fkey="annualSalary" :label="t('card.Form.f13')" :readonly="isReadonly" :disabled="isReadonly" @change="handleChange" />
+            <remit-input v-model:value="infoForm.accountPurpose" :required="true" fkey="accountPurpose" :label="t('card.Form.f14')" :readonly="isReadonly" :disabled="isReadonly" @change="handleChange" />
+            <remit-input
+                v-model:value="infoForm.expectedMonthlyVolume"
+                fkey="expectedMonthlyVolume"
+                :required="true"
+                :label="t('card.Form.f15')"
+                :readonly="isReadonly"
+                :disabled="isReadonly"
                 @change="handleChange"
             />
-            <remit-input v-model:value="infoForm.postCode" fkey="postCode" :label="t('improve-info.p22')" @change="handleChange" />
             <remit-input
                 v-model:value="infoForm.idType"
                 fkey="idType"
+                :required="true"
                 type="select"
                 :columns="idTypeOptions"
-                :label="t('improve-info.p23')"
+                :label="t('card.Form.f16')"
+                :readonly="isReadonly"
+                :disabled="isReadonly"
                 @change="handleChange"
             />
-            <remit-input v-model:value="infoForm.idNo" fkey="idNo" :label="t('improve-info.p27')" @change="handleChange" />
+            <remit-input v-model:value="infoForm.idNumber" :required="true" fkey="idNumber" :label="t('card.Form.f17')" :readonly="isReadonly" :disabled="isReadonly" @change="handleChange" />
+            <remit-input v-if="formData.nationality == 'US'" v-model:value="infoForm.ssn" fkey="ssn" :label="t('card.Form.f18')" :readonly="isReadonly" :disabled="isReadonly" @change="handleChange" />
+            <remit-input v-model:value="infoForm.issueDate" :required="true" type="date" fkey="issueDate" :label="t('card.Form.f19')" :readonly="isReadonly" :disabled="isReadonly" @change="handleChange" />
             <remit-input
                 v-model:value="infoForm.idNoExpiryDate"
+                :required="true"
                 type="date"
                 fkey="idNoExpiryDate"
-                :label="t('improve-info.p28')"
+                :label="t('card.Form.f20')"
+                :readonly="isReadonly"
+                :disabled="isReadonly"
                 @change="handleChange"
             />
+
+            <remit-input
+                v-model:value="infoForm.idFrontUrl"
+                :required="true"
+                type="upload"
+                fkey="idFrontUrl"
+                :label="t('card.Form.f21')"
+                :is-upload-d="true"
+                accept="image/png, image/jpeg, image/jpg"
+                :readonly="isReadonly"
+                :disabled="isReadonly"
+                @change="handleChange"
+            >
+                <div class="cwg-upload">
+                    <van-icon name="back-top" />
+                    <p class="name">{{ t('improve-info.p28_1') }}{{ t('improve-info.p29') }}</p>
+                    <p class="back">{{ t('improve-info.p28_2') }}</p>
+                </div>
+            </remit-input>
             <remit-input
-                v-model:value="infoForm.idPicture"
+                v-model:value="infoForm.idBackUrl"
                 type="upload"
-                fkey="idPicture"
-                :label="t('improve-info.p29')"
-                :isUploadD="true"
+                :required="true"
+                fkey="idBackUrl"
+                :label="t('card.Form.f22')"
+                :is-upload-d="true"
                 accept="image/png, image/jpeg, image/jpg"
+                :readonly="isReadonly"
+                :disabled="isReadonly"
                 @change="handleChange"
             >
                 <div class="cwg-upload">
@@ -110,51 +183,61 @@
                 </div>
             </remit-input>
             <remit-input
-                v-model:value="infoForm.facePicture"
+                v-model:value="infoForm.idHoldUrl"
                 type="upload"
-                fkey="facePicture"
-                :label="t('improve-info.p30')"
-                :isUploadD="true"
+                fkey="idHoldUrl"
+                :required="true"
+                :label="t('card.Form.f23')"
+                :is-upload-d="true"
                 accept="image/png, image/jpeg, image/jpg"
+                :readonly="isReadonly"
+                :disabled="isReadonly"
                 @change="handleChange"
             >
                 <div class="cwg-upload">
                     <van-icon name="back-top" />
-                    <p class="name">{{ t('improve-info.p28_1') }}{{ t('improve-info.p30') }}</p>
+                    <p class="name">{{ t('improve-info.p28_1') }}{{ t('improve-info.p29') }}</p>
                     <p class="back">{{ t('improve-info.p28_2') }}</p>
                 </div>
             </remit-input>
-            <div class="fixed-btn">
+            <div v-if="infoForm.authStatus != 1" class="fixed-btn">
                 <div class="cwg-button">
                     <van-button type="primary" block @click="infoSubmit">{{ t('improve-info.p33') }}</van-button>
                 </div>
             </div>
         </van-form>
+        <CardWebsdkLink ref="cardWebsdkLinkRef" />
     </div>
 </template>
 
 <script setup lang="ts">
 import { pinyin } from 'pinyin-pro'
-import { useRouter } from 'vue-router'
-import { useI18n } from 'vue-i18n'
 import { showToast } from 'vant'
+import { useI18n } from 'vue-i18n'
+import { useRouter } from 'vue-router'
 import { ucardApi } from '@/api/ucard'
 import { userApi } from '@/api/user'
 import useUserStore from '@/stores/use-user-store'
+import CardWebsdkLink from './CardWebsdkLink.vue'
+
+const cardWebsdkLinkRef = ref(null)
 const userStore = useUserStore()
 const userInfo = computed(() => userStore.userInfo)
 const { t } = useI18n()
 const router = useRouter()
 const route = useRoute()
 const formRef = ref()
-const { type,cardTypeId  } = route.query as { type: string,cardTypeId:string }
+const isReadonly = computed(() => infoForm.value?.authStatus == 1)
+const { type, cardTypeId } = route.query as { type: string, cardTypeId: string }
 const sexOptions = ref([
-    { text: t('improve-info.p15'), value: '1' },
-    { text: t('improve-info.p16'), value: '2' },
+    { text: t('improve-info.p15'), value: 'M' },
+    { text: t('improve-info.p16'), value: 'F' },
 ])
 const idTypeOptions = ref([
-    { text: t('improve-info.p25'), value: 'EUROPEAN_ID' },
+    { text: t('improve-info.p25'), value: 'HK_HKID' },
     { text: t('improve-info.p26'), value: 'PASSPORT' },
+    { text: t('improve-info.p34'), value: 'DLN' },
+    { text: t('improve-info.p35'), value: 'GOVERNMENT_ISSUED_ID_CARD' },
 ])
 // 表单验证规则
 const rules = {
@@ -166,25 +249,11 @@ const rules = {
     areaCode: [{ required: true, message: t('improve-info.p5') }],
 }
 const infoForm = ref({
-    // payerType: 'INDIVIDUAL',
-    // payerLastName: 'zhang',
-    // payerFirstName: 'tom',
-    // payerIdNo: 'ES125664',
-    // payerIdNoType: 'PASSPORT',
-    // payerIdCountry: 'SG',
-    // payerBirthday: '1990-10-10',
-    // payerNationalityCountry: 'SG',
-    // payerMobile: '+65012345678',
-    // payerCountryCode: 'SG',
-    // payerCityCode: 'SG_1',
-    // payerAddress: '21 Tampines Ave 1, Singapore 529757',
-    // payerPostCode: '999002',
-    // payerOccupation: 'worker',
-
     areaCode: undefined,
     country: undefined,
+    gender: undefined,
     mobile: undefined,
-    idNo: undefined,
+    idNumber: undefined,
     sex: undefined,
     birthday: undefined,
     nationality: undefined,
@@ -206,57 +275,73 @@ const formDatas = ref<typeof infoForm.value>({} as any)
 const isShow = ref(false)
 
 // 国家选项
-const countryOptions = ref<Array<{ text: string; value: string }>>([])
-const cityOptions = ref<Array<{ text: string; value: string }>>([])
+const countryOptions = ref<Array<{ text: string, value: string }>>([])
+const cityOptions = ref<Array<{ text: string, value: string }>>([])
 const phoneCodes = ref([])
+const occupationList = ref([])
 // 获取国家列表
-const getCountryListForSelect = async () => {
+async function getCountryListForSelect() {
     try {
         const res = await ucardApi.ucardCountryCity({})
         if (res.code === 200 || res.code === 0) {
             countryOptions.value = res.data.map((item: any) => ({
-                text: lang.value === 'cn' ? item.cnName : item.enName,
+                text: item.enName,
                 value: item.code,
             }))
+            phoneCodes.value = res.data.map((item: any) => ({
+                text: `${item.enName} ${item.areaCode}`,
+                value: item.areaCode,
+            }))
+            console.log(countryOptions.value, 1999)
         }
-    } catch (error) {
+    }
+    catch (error) {
         countryOptions.value = []
     }
 }
 // 获取城市列表
-const getCityListForSelect = async (countryCode: string) => {
+async function getCityListForSelect(countryCode: string) {
     try {
         const res = await ucardApi.ucardCountryCity({ code: countryCode })
         if (res.code === 200 || res.code === 0) {
             const cityList = res.data.map((item: any) => ({
-                text: lang.value === 'cn' ? item.cnName : item.enName,
+                text: item.enName,
                 value: item.code,
             }))
             cityOptions.value = cityList
         }
-    } catch (error) {
+    }
+    catch (error) {
         cityOptions.value = []
     }
 }
-const getCountry = async () => {
+// 获取职业
+async function getOccupationList(countryCode: string) {
     try {
-        const res = await ucardApi.countryGet()
-        phoneCodes.value = res.data.map((item: { callingCode: string; name: string; enName: string }) => ({
-            text: lang.value === 'cn' ? item.name + ' + ' + item.callingCode : item.enName + ' + ' + item.callingCode,
-            value: item.callingCode,
-        }))
-    } catch (error) {
-        showToast(t('common.error'))
+        const res = await ucardApi.getOccupationList()
+        if (res.code === 200 || res.code === 0) {
+            const list = res.data.map((item: any) => ({
+                text: item.description,
+                value: item.occupationCode,
+            }))
+            occupationList.value = list
+        }
+    }
+    catch (error) {
+        cityOptions.value = []
     }
 }
-const infoSubmit = async () => {
+
+async function infoSubmit() {
     try {
         const requiredFields = ['email', 'lastName', 'firstName', 'address', 'mobile', 'areaCode'] as const
         await formRef.value?.validate(requiredFields)
-    } catch (error) {
+    }
+    catch (error) {
         if (Array.isArray(error) && error.length > 0) {
             showToast(error[0].message)
-        } else {
+        }
+        else {
             showToast(t('improve-info.errer'))
         }
         return
@@ -271,40 +356,37 @@ const infoSubmit = async () => {
                     showToast(t('improve-info.kycSuccess'))
                     router.push('/mine')
                     break
-                case '3':
-                kycSubmit()
-                    break
-                default:
-                    break
             }
         }
-    } else {
+    }
+    else {
         res = await ucardApi.merchantRegister(formData.value as any)
         if (res.code === 200) {
-            showToast(t('improve-info.kycSuccess'))
-            userInfo.value.customInfo.uniqueId = res.data
-            userStore.saveUserInfo(userInfo.value)
-            router.push('/')
+            cardWebsdkLinkRef.value?.getWebsdkLink(res.data)
+        }
+        else {
+            showToast(res.msg)
         }
     }
 }
-const handleChange = (value: any) => {
+function handleChange(value: any) {
     formData.value = { ...formData.value, [value.key]: value.value }
     if (value.key === 'nationality') {
         formData.value = { ...formData.value, country: value.value }
-        if(userInfo.value?.customInfo.nationality == value.value) return
+        if (userInfo.value?.customInfo.nationality == value.value)
+            return
         getCityListForSelect(value.value)
         infoForm.value.town = ''
     }
 }
-const containsChinese = (str: string) => /[\u4e00-\u9fa5]/.test(str)
+const containsChinese = (str: string) => /[\u4E00-\u9FA5]/.test(str)
 const convertToPinyin = (value: string) => (containsChinese(value) ? pinyin(value, { toneType: 'none', type: 'capitalize' }) : value)
-const getInfoForm = () => {
+function getInfoForm() {
     const customInfo = userInfo.value?.customInfo || {}
     const fields = [
         'areaCode',
         'mobile',
-        'idNo',
+        'idNumber',
         'sex',
         'birthday',
         'nationality',
@@ -326,17 +408,14 @@ const getInfoForm = () => {
     for (const key of fields) {
         data[key] = customInfo[key] ?? undefined
     }
-    if (customInfo.uniqueId) {
-        for (const key of fields) {
-            data[key] = formDatas.value[key] ?? undefined
-        }
-    }
     data.lastName = convertToPinyin(data.lastName)
     data.firstName = convertToPinyin(data.firstName)
+    data.gender = data.sex != 1 ? 'F' : 'M'
+    data.idNumber = data.idNo
     infoForm.value = { ...data }
     formData.value = { ...formData.value, ...data, cardTypeId }
 }
-const getUserInfo = async () => {
+async function getUserSingle() {
     if (!userToken.value) {
         showToast('请先登录')
         return
@@ -344,40 +423,37 @@ const getUserInfo = async () => {
     try {
         const res = await userApi.getUserSingle()
         if (res.code === 200 && res.data.uniqueId) {
-            formDatas.value = res.data
-            getInfoForm()
+            infoForm.value = res.data
+            formData.value = res.data
         }
-    } catch (error: any) { }
-}
-
-const kycSubmit = async () => {
-    const {uniqueId,cardTypeId} = formData.value
-    const res = await ucardApi.kycSubmit({uniqueId,cardTypeId})
-    if (res.code === 200) {
-        showToast(t('kyc.kycSuccess'))
-        router.push('/cards')
     }
+    catch (error: any) {}
 }
 onMounted(async () => {
     if (type == '1' || type == '3') {
-        getUserInfo()
-    } else {
-        getInfoForm()
+        getUserSingle()
+    }
+    else {
+        getUserSingle()
     }
     isShow.value = false
-
-    await getCountry()
+    await getOccupationList()
     await getCountryListForSelect()
     if (infoForm.value.nationality) {
         await getCityListForSelect(infoForm.value.nationality)
         isShow.value = true
-    } else {
+    }
+    else {
         isShow.value = true
     }
 })
 </script>
 
 <style scoped lang="scss">
+.pointer-none{
+pointer-events: none;
+}
+
 .f {
     display: flex;
     align-items: flex-end;

+ 0 - 0
src/components/Logout.vue


+ 18 - 15
src/components/MoreSelect.vue

@@ -2,10 +2,10 @@
     <div>
         <van-action-sheet v-model:show="show" :style="actionSheetStyle">
             <div class="currency-mask">
-                <div class="search" v-if="showSearch && props.options.length > 10">
+                <div v-if="showSearch && props.options.length > 10" class="search">
                     <van-field
-                        class="form-input"
                         v-model="inputValueDoc"
+                        class="form-input"
                         type="text"
                         :placeholder="t('common.input')"
                         :clearable="true"
@@ -18,11 +18,11 @@
                     <template v-if="filteredOptions.length > 0">
                         <div
                             v-for="(item, index) in filteredOptions"
+                            :key="item.value + index"
+                            :ref="item.text === inputValue ? 'selectedItem' : null"
                             class="currency-item"
                             :class="{ selected: item.text === inputValue }"
                             @click="select(item)"
-                            :key="item.value + index"
-                            :ref="item.text === inputValue ? 'selectedItem' : null"
                         >
                             {{ item.text }}
                         </div>
@@ -35,27 +35,28 @@
 
 <script setup lang="ts">
 import { useI18n } from 'vue-i18n'
-const { t } = useI18n()
+
 const props = defineProps<{
     modelValue: boolean
-    showSearch: Boolean
+    showSearch: boolean
     inputValue: string
-    options: Array<{ text: string; value: string }>
+    options: Array<{ text: string, value: string }>
 }>()
-const inputValueDoc = ref('')
 const emit = defineEmits(['update:modelValue', 'select'])
-
+const { t } = useI18n()
+const inputValueDoc = ref('')
 const show = ref(props.modelValue)
 const selectedItem = ref()
 const filteredOptions = computed(() => {
-    if (!inputValueDoc.value) return props.options
+    if (!inputValueDoc.value)
+        return props.options
     const keyword = inputValueDoc.value.toLowerCase()
-    return props.options.filter((item) => item.text.toLowerCase().includes(keyword))
+    return props.options.filter(item => item.text.toLowerCase().includes(keyword))
 })
 
 watch(
     () => props.modelValue,
-    (val) => (show.value = val),
+    val => (show.value = val),
 )
 watch(show, async (val) => {
     emit('update:modelValue', val)
@@ -76,7 +77,8 @@ const actionSheetStyle = computed(() => {
             maxHeight: `80vh`,
             padding: '24px 16px 0 16px',
         }
-    } else {
+    }
+    else {
         const itemHeight = 56
         const baseHeight = 0
         const maxHeight = Math.min(props?.options.length * itemHeight + baseHeight, window.innerHeight * 0.8)
@@ -91,7 +93,8 @@ const actionSheetStyle1 = computed(() => {
         return {
             maxHeight: `calc(80vh - 98px)`,
         }
-    } else {
+    }
+    else {
         const itemHeight = 56
         const baseHeight = 0
         const maxHeight = Math.min(props?.options.length * itemHeight + baseHeight, window.innerHeight * 0.8)
@@ -100,7 +103,7 @@ const actionSheetStyle1 = computed(() => {
         }
     }
 })
-function select(item: { text: string; value: string }) {
+function select(item: { text: string, value: string }) {
     emit('select', item)
     show.value = false
 }

+ 553 - 0
src/components/Operation.vue

@@ -0,0 +1,553 @@
+<template>
+    <div class="page page-shadow">
+        <div class="page-header">
+            <PageHeader :title="headerTitle" :show-back="!showBack" />
+        </div>
+        <div v-if="type == 2" class="fixed-right" @click="goRechargeRecord">
+            <icon name="icon_history" :size="24" color="#000" />
+        </div>
+        <van-form ref="formRef" class="kyc-form">
+            <template v-if="type == '1'">
+                <remit-input
+                    v-model:value="infoForm.cardNumber1"
+                    fkey="cardNumber1"
+                    :required="true"
+                    :label="`${t('card.Form.f24')}:`"
+                    :rules="rules.cardNumber1"
+                    @change="handleChange"
+                />
+                <remit-input
+                    v-model:value="infoForm.activeCode"
+                    fkey="activeCode"
+                    :required="true"
+                    :label="`${t('card.Form.f26')}:`"
+                    :rules="rules.activeCode"
+                    @change="handleChange"
+                />
+                <remit-input
+                    v-model:value="infoForm.pin"
+                    fkey="pin"
+                    :required="true"
+                    :maxlength="6"
+                    :label="t('card.Info.s26')"
+                    :rules="rules.pin"
+                    @change="handleChange"
+                />
+                <remit-input
+                    v-model:value="infoForm.password"
+                    fkey="password"
+                    :required="true"
+                    :maxlength="6"
+                    :label="`${t('card.Btn.Confirm')}:`"
+                    :rules="rules.password"
+                    @change="handleChange"
+                />
+                <ul class="pwd">
+                    <li v-t="'card.vaildate.v32'" :class="{ fit: rule1 }"></li>
+                    <li v-t="'card.vaildate.v33'" :class="{ fit: rule2 }"></li>
+                </ul>
+            </template>
+            <template v-if="type == '2'">
+                <remit-input
+                    v-model:value="infoForm.cardNumber1"
+                    fkey="cardNumber1"
+                    :required="true"
+                    :label="`${t('card.Form.f24')}:`"
+                    :rules="rules.cardNumber1"
+                    @change="handleChange"
+                />
+                <remit-input
+                    v-model:value="infoForm.amount"
+                    fkey="amount"
+                    type="number"
+                    :label="`${t('card.Form.f28')}:`"
+                    :required="true"
+                    :min="rechargeMinQuota"
+                    :max="rechargeMaxQuota"
+                    :placeholder="t('card.vaildate.v26')"
+                    @change="handleChange"
+                >
+                </remit-input>
+                <div class="balance-info">
+                    <span class="balance-key">{{ t('card.Form.f56') }}</span>
+                    <span class="balance-value">{{ userBalance }} USD</span>
+                    <span class="all-btn" @click="allBalance">{{ t('card.Form.f57') }}</span>
+                </div>
+                <div class="balance-info">
+                    <span class="balance-key">{{ t('card.Form.f58') }}</span>
+                    <span class="balance-value">{{ exchangeRate }}%</span>
+                    <span></span>
+                </div>
+                <div class="balance-info">
+                    <span class="balance-key">{{ t('card.Form.f59') }}</span>
+                    <span class="balance-value">{{ fee }}</span>
+                    <span></span>
+                </div>
+            </template>
+            <template v-if="type == '3'">
+                <remit-input
+                    v-model:value="infoForm.cardNumber1"
+                    fkey="cardNumber1"
+                    :required="true"
+                    :label="`${t('card.Form.f24')}:`"
+                    :rules="rules.cardNumber1"
+                    @change="handleChange"
+                />
+                <remit-input
+                    v-model:value="infoForm.pin"
+                    fkey="pin"
+                    :required="true"
+                    :label="t('card.Info.s26')"
+                    :maxlength="6"
+                    :rules="rules.pin"
+                    @change="handleChange"
+                />
+                <remit-input
+                    v-model:value="infoForm.password"
+                    fkey="password"
+                    :required="true"
+                    :maxlength="6"
+                    :label="`${t('card.Btn.Confirm')}:`"
+                    :rules="rules.password"
+                    @change="handleChange"
+                />
+
+                <ul class="pwd">
+                    <li v-t="'card.vaildate.v32'" :class="{ fit: rule1 }"></li>
+                    <li v-t="'card.vaildate.v33'" :class="{ fit: rule2 }"></li>
+                </ul>
+            </template>
+            <template v-if="type == '4' || type == '5'">
+                <remit-input
+                    v-model:value="infoForm.cardNumber1"
+                    fkey="cardNumber1"
+                    :required="true"
+                    :label="`${t('card.Form.f24')}:`"
+                    :rules="rules.cardNumber1"
+                    @change="handleChange"
+                />
+                <remit-input v-model:value="infoForm.clientRemark" fkey="clientRemark" :label="`${t('card.Form.f27')}:`" @change="handleChange" />
+            </template>
+
+            <div v-if="infoForm.authStatus != 1" class="fixed-btn">
+                <div class="cwg-button">
+                    <van-button type="primary" block @click="infoSubmit">{{ t('improve-info.p33') }}</van-button>
+                </div>
+            </div>
+        </van-form>
+    </div>
+</template>
+
+<script setup lang="ts">
+import { showToast } from 'vant'
+import { useI18n } from 'vue-i18n'
+import { useRouter } from 'vue-router'
+import { ucardApi } from '@/api/ucard'
+import PageHeader from '@/components/PageHeader.vue'
+import config from '@/config'
+
+const route = useRoute()
+const { t } = useI18n()
+const router = useRouter()
+const form = ref({})
+const formRef = ref()
+const infoForm = ref({
+    password: undefined,
+    cardNumber1: undefined,
+    cardNo: undefined,
+    activeCode: undefined,
+    pin: undefined,
+    amount: undefined,
+    clientRemark: undefined,
+})
+// 动态限制
+const exchangeRate = ref(0)
+const rechargeMinQuota = ref(0)
+const rechargeMaxQuota = ref(0)
+const rechargeFixedFee = ref(0)
+const userBalance = ref(0)
+const pictLoading = ref(false)
+
+const rules = {
+    pin: [
+        { required: true, message: t('card.vaildate.v23') },
+        { pattern: config.Pattern.Pin, message: t('card.vaildate.v23') },
+    ],
+    password: [
+        { required: true, message: t('card.vaildate.v31') },
+        { pattern: config.Pattern.Pin, message: t('card.vaildate.v31') },
+    ],
+    cardNumber1: [
+        {
+            required: true,
+            message: t('card.vaildate.v22'),
+            trigger: 'blur',
+        },
+    ],
+    amount: [
+        {
+            required: true,
+            message: t('card.vaildate.v26'),
+            trigger: 'blur',
+        },
+        {
+            validator: (rule, value, callback) => validateAmount(value, callback),
+            trigger: 'blur',
+        },
+    ],
+    activeCode: [
+        {
+            required: true,
+            message: t('card.vaildate.v24'),
+            trigger: 'blur',
+        },
+    ],
+}
+
+const { id, type } = route.query as { id: string, type: string }
+const formData = ref<typeof infoForm.value>({ id } as any)
+const headerTitleMap: Record<number, string> = {
+    1: 'card.tab10',
+    2: 'card.tab11',
+    3: 'card.tab12',
+    4: 'card.tab13',
+    5: 'card.tab14',
+}
+
+// 根据 type 自动取标题
+const maxRecharge = computed(() => {
+    const balance = Number(userBalance.value) || 0
+    const rate = Number(exchangeRate.value) / 100
+    if (balance <= 0)
+        return 0
+    return Math.floor((balance / (1 + rate)) * 100) / 100
+})
+const fee = computed(() => {
+    if (!formData.value.amount) {
+        return 0
+    }
+    if (rechargeFixedFee.value) {
+        return rechargeFixedFee.value
+    }
+    const amount = Math.ceil(formData.value.amount)
+    return ((amount * exchangeRate.value) / 100).toFixed(2)
+})
+function goRechargeRecord() {
+    router.push(`/recharge/record/list?cardNo=${formData.value?.cardNo}`)
+}
+// 根据 type 自动取标题
+const headerTitle = computed(() => {
+    const key = Number(type)
+    const i18nKey = headerTitleMap[key]
+    return i18nKey ? t(i18nKey) : t('common.unknown')
+})
+const showBack = computed(() => {
+    return ['/', '/cards', '/finance', '/mine', '/login'].includes(route.path)
+})
+// 计算属性 rule1
+const rule1 = computed(() => {
+    if (!formData.value.pin)
+        return false
+    return /^(\d)\d{5}$/.test(formData.value.pin)
+})
+
+// 计算属性 rule2
+const rule2 = computed(() => {
+    if (!formData.value.pin)
+        return false
+    return config.Pattern.Pin.test(formData.value.pin)
+})
+async function infoSubmit() {
+    if (formData.value.cardNumber1 != infoForm.value.cardNumber) {
+        showToast(t('card.vaildate.v22'))
+        return
+    }
+    try {
+        switch (type) {
+            case '1':
+                await formRef.value?.validate(['cardNumber1', 'pin', 'activeCode'])
+                ucardActivate()
+                break
+            case '2':
+                await formRef.value?.validate(['cardNumber1', 'amount'])
+                ucardRecharge()
+                break
+            case '3':
+                await formRef.value?.validate(['cardNumber1', 'pin'])
+                ucardResetPassword()
+                break
+            case '4':
+                await formRef.value?.validate(['cardNumber1'])
+                ucardFreeze()
+                break
+            case '5':
+                await formRef.value?.validate(['cardNumber1'])
+                ucardUnfreeze()
+                break
+        }
+    }
+    catch (error) {}
+}
+function backActivity() {
+    setTimeout(() => {
+        router.back()
+    }, 3000)
+}
+async function ucardActivate() {
+    if (formData.value.pin != formData.value.password) {
+        showToast(t('card.Msg.m11'))
+        return
+    }
+    const res = await ucardApi.ucardActivate(formData.value)
+    if (res.code == 200) {
+        showToast(t('card.Msg.m3'))
+        backActivity()
+    }
+    else {
+        showToast(res.msg)
+    }
+}
+async function ucardResetPassword() {
+    if (formData.value.pin != formData.value.password) {
+        showToast(t('card.Msg.m11'))
+        return
+    }
+    const res = await ucardApi.ucardResetPassword(formData.value)
+    if (res.code == 200) {
+        showToast(t('card.Msg.m6'))
+        backActivity()
+    }
+    else {
+        showToast(res.msg)
+    }
+}
+async function ucardFreeze() {
+    const res = await ucardApi.ucardFreeze(formData.value)
+    if (res.code == 200) {
+        showToast(t('card.Msg.m4'))
+        backActivity()
+    }
+    else {
+        showToast(res.msg)
+    }
+}
+async function ucardUnfreeze() {
+    const res = await ucardApi.ucardUnfreeze(formData.value)
+    if (res.code == 200) {
+        showToast(t('card.Msg.m5'))
+        backActivity()
+    }
+    else {
+        showToast(res.msg)
+    }
+}
+async function getCardInfo() {
+    try {
+        if (!id)
+            return
+        const res = await ucardApi.getCardInfo({ id })
+        infoForm.value = res.data
+        formData.value = res.data
+        exchangeRate.value = res.data.rechargeFeeRate
+        rechargeMaxQuota.value = res.data.rechargeMaxQuota
+        rechargeMinQuota.value = res.data.rechargeMinQuota
+        rechargeFixedFee.value = res.data.rechargeFixedFee
+    }
+    catch (error) {
+        console.log(error)
+    }
+}
+
+// 一键填充最大金额
+function allBalance() {
+    infoForm.value.amount = maxRecharge.value
+}
+
+// 金额验证函数(配合 Vant <Field /> 的 rules)
+function validateAmount(value: string | number) {
+    const num = Number(value)
+    if (!num || num <= 0) {
+        return t('card.vaildate.v34') // 请输入有效金额
+    }
+    else if (maxRecharge.value === 0) {
+        return `${t('card.Form.f56')} 0 USD`
+    }
+    else if (num > maxRecharge.value) {
+        return `${t('card.vaildate.v35')} ${maxRecharge.value} USD`
+    }
+    else if (num < rechargeMinQuota.value) {
+        return `${t('card.vaildate.v36')} ${rechargeMinQuota.value} USD`
+    }
+    else if (num >= rechargeMaxQuota.value) {
+        return `${t('card.vaildate.v37')} ${rechargeMaxQuota.value} USD`
+    }
+    return true
+}
+
+// 获取钱包余额
+async function walletBalance() {
+    try {
+        const res = await ucardApi.walletBalance()
+        if (res.code === 200) {
+            userBalance.value = res.data.balance || 0
+        }
+        else {
+            showToast(res.msg)
+            userBalance.value = 0
+        }
+    }
+    catch (err) {
+        userBalance.value = 0
+    }
+}
+
+// 银行卡充值
+async function ucardRecharge() {
+    const amount = Number(formData.value.amount)
+    const cardNo = formData.value.cardNo
+
+    if (validateAmount(amount) !== true) {
+        showToast(validateAmount(amount))
+        return
+    }
+
+    pictLoading.value = true
+    try {
+        const res = await ucardApi.ucardRecharge({ amount, cardNo })
+        if (res.code === 200) {
+            showToast(t('card.Msg.m2'))
+            setTimeout(() => {
+                router.push(`/cards`)
+            }, 1000)
+        }
+        else {
+            showToast(res.msg)
+        }
+    }
+    catch (err) {
+        console.log(err)
+    }
+    finally {
+        pictLoading.value = false
+    }
+}
+
+onMounted(() => {
+    getCardInfo()
+    if (type == 2) {
+        walletBalance()
+    }
+})
+
+function handleChange(value: any) {
+    formData.value = { ...formData.value, [value.key]: value.value }
+}
+</script>
+
+<style scoped lang="scss">
+.pointer-none {
+    pointer-events: none;
+}
+
+.f {
+    display: flex;
+    align-items: flex-end;
+    gap: 12px;
+
+    .l {
+        flex: 1;
+    }
+
+    .r {
+        width: 273px;
+    }
+}
+
+:deep(.van-uploader) {
+    width: 100%;
+
+    .van-uploader__wrapper {
+        width: 100%;
+        display: block;
+    }
+}
+
+::v-deep(.van-uploader__preview) {
+    width: 100% !important;
+    height: 160px !important;
+    border: 1px dashed #beb6b6;
+    border-radius: 24px;
+    overflow: hidden;
+
+    .van-uploader__preview-image {
+        width: 100%;
+        height: 100%;
+
+        .van-image__img {
+            object-fit: contain;
+        }
+    }
+
+    .van-uploader__preview-delete {
+        position: absolute;
+        top: 0;
+        right: 0;
+        width: 30px;
+        height: 30px;
+        border-radius: 0 24px 0 0;
+
+        i {
+            text-align: center;
+            line-height: 30px;
+            font-size: 30px;
+        }
+    }
+}
+.pwd {
+    line-height: 20px;
+    li {
+        list-style-type: disc;
+        line-height: 1.2;
+        margin: 4px 0 4px 20px;
+        color: #c0c4cc;
+    }
+    .fit {
+        color: #009deb;
+    }
+}
+.balance-info {
+    width: 100%;
+    color: #bdbdbd;
+    font-size: 14px;
+    margin-bottom: 24px;
+    display: flex;
+    align-items: center;
+    /* justify-content: space-between; */
+}
+.balance-value {
+    width: 150px;
+    color: var(--white);
+    font-weight: bold;
+    margin: 0 8px;
+}
+.balance-key {
+    color: #8e8a8a;
+    width: 130px;
+}
+.all-btn {
+    display: flex;
+    padding: 4px 12px;
+    justify-content: center;
+    align-items: center;
+    gap: 10px;
+    border-radius: 35px;
+    border: 1px solid #ea002a;
+    color: var(--Brand-color, #ea002a);
+    font-family: Roboto;
+    font-size: 14px;
+    font-style: normal;
+    font-weight: 600;
+    line-height: 20px;
+    letter-spacing: 0.07px;
+}
+</style>

+ 7 - 9
src/components/PageHeader.vue

@@ -1,8 +1,8 @@
 <template>
-    <div class="page-header">
+    <div class="pages-header">
         <div class="header">
-            <span class="back" v-if="showBack">
-                <van-icon  name="down" class="back-icon" @click="handleBack" />
+            <span v-if="showBack" class="back">
+                <VanIcon name="down" class="back-icon" @click="handleBack" />
             </span>
 
             <span>{{ title }}</span>
@@ -14,20 +14,20 @@
 // import { useRouter } from 'vue-router'
 import { Icon as VanIcon } from 'vant'
 
-const router = useRouter()
-
 defineProps<{
     title: string
     showBack?: boolean
 }>()
 
-const handleBack = () => {
+const router = useRouter()
+
+function handleBack() {
     router.back()
 }
 </script>
 
 <style scoped lang="scss">
-.page-header {
+.pages-header {
     .header {
         position: relative;
         text-align: left;
@@ -40,8 +40,6 @@ const handleBack = () => {
         align-items: center;
         line-height: 40px;
 
-
-
         .back {
             display: flex;
             align-items: center;

+ 117 - 0
src/components/QrCode.vue

@@ -0,0 +1,117 @@
+<template>
+    <div ref="qrCode" class="qr-code"></div>
+</template>
+
+<script setup>
+import QRCode from 'qrcode'
+import { defineEmits, defineProps, onMounted, ref, watch } from 'vue'
+
+// Props
+const props = defineProps({
+    text: { type: String, default: '' },
+    width: { type: Number, default: 300 },
+    height: { type: Number, default: 300 },
+    colorDark: { type: String, default: '#333333' },
+    colorLight: { type: String, default: '#ffffff' },
+    logoImage: { type: String, default: '' },
+})
+
+// Emits
+const emit = defineEmits(['downloaded'])
+
+// Refs
+const qrCode = ref(null)
+let qrcodeCanvas = null
+
+/**
+ * 创建二维码
+ */
+function createQrCode() {
+    if (!props.text || !qrCode.value)
+        return
+
+    // 清空容器
+    qrCode.value.innerHTML = ''
+    const canvas = document.createElement('canvas')
+    canvas.width = props.width
+    canvas.height = props.height
+
+    const options = {
+        width: props.width,
+        color: {
+            dark: props.colorDark,
+            light: props.colorLight,
+        },
+    }
+
+    QRCode.toCanvas(canvas, props.text, options, (err) => {
+        if (err) {
+            console.error('QRCode render error:', err)
+            return
+        }
+
+        if (props.logoImage) {
+            const logo = new Image()
+            logo.setAttribute('crossOrigin', 'Anonymous')
+            logo.src = props.logoImage
+            logo.onload = () => {
+                const ctx = canvas.getContext('2d')
+                const baseSize = Math.min(canvas.width, canvas.height)
+                const logoSize = baseSize / 4.5
+                const dx = (canvas.width - logoSize) / 2
+                const dy = (canvas.height - logoSize) / 2
+                ctx.drawImage(logo, dx, dy, logoSize, logoSize)
+                qrCode.value.appendChild(canvas)
+            }
+            logo.onerror = () => {
+                qrCode.value.appendChild(canvas)
+            }
+        }
+        else {
+            qrCode.value.appendChild(canvas)
+        }
+
+        qrcodeCanvas = canvas
+    })
+}
+
+/**
+ * 下载二维码
+ */
+function downloadQrCode() {
+    if (!qrcodeCanvas)
+        return
+
+    const link = document.createElement('a')
+    link.href = qrcodeCanvas.toDataURL('image/png')
+    link.download = 'qrcode.png'
+    link.click()
+
+    emit('downloaded')
+}
+
+// 监听 text 改变
+watch(
+    () => props.text,
+    () => createQrCode(),
+)
+
+// 挂载时生成二维码
+onMounted(() => createQrCode())
+
+// 暴露方法给父组件
+defineExpose({
+    downloadQrCode,
+})
+</script>
+
+<style scoped lang="scss">
+:deep(.qr-code) {
+    canvas {
+        display: inline-block !important;
+    }
+    img {
+        display: none !important;
+    }
+}
+</style>

+ 77 - 64
src/components/RemitInput.vue

@@ -1,12 +1,11 @@
 <template>
     <div class="form-group">
-        <label class="form-label" v-if="label"
-            ><span>{{ required ? '*' : '' }}</span> {{ label }}
+        <label v-if="label" class="form-label"><span>{{ required ? '*' : '' }}</span> {{ label }}
         </label>
         <template v-if="type === 'text' || type == 'password'">
             <van-field
-                class="form-input"
                 v-model="inputValueDoc"
+                class="form-input"
                 :type="type"
                 :placeholder="placeholder ? placeholder : t('common.input')"
                 :readonly="readonly"
@@ -27,8 +26,8 @@
         </template>
         <template v-if="type === 'number'">
             <van-field
-                class="form-input"
                 v-model="inputValueDoc"
+                class="form-input"
                 :name="fkey"
                 type="number"
                 :placeholder="placeholder ? placeholder : t('common.input')"
@@ -43,13 +42,14 @@
                 @blur="handleBlur"
                 @focus="handleFocus"
                 @clear="handleClear"
-                ><slot></slot
-            ></van-field>
+            >
+                <slot></slot>
+            </van-field>
         </template>
         <template v-if="type === 'dropdown'">
             <van-field
-                class="form-input"
                 v-model="inputValueDoc"
+                class="form-input"
                 :name="fkey"
                 :placeholder="placeholder ? placeholder : t('common.choose')"
                 :readonly="true"
@@ -60,14 +60,15 @@
                 is-link
                 @click="!disabled && (showPicker = true)"
                 @clear="handleClear"
-                ><slot></slot
-            ></van-field>
+            >
+                <slot></slot>
+            </van-field>
             <van-action-sheet v-model:show="showPicker" :actions="filteredColumns" @select="onConfirm" />
         </template>
         <template v-if="type === 'select'">
             <van-field
-                class="form-input"
                 v-model="inputValueDoc"
+                class="form-input"
                 :name="fkey"
                 :placeholder="placeholder ? placeholder : t('common.choose')"
                 :readonly="true"
@@ -78,14 +79,15 @@
                 is-link
                 @click="!disabled && (showPicker = true)"
                 @clear="handleClear"
-                ><slot></slot
-            ></van-field>
-            <MoreSelect :showSearch="showSearch" :input-value="inputValueDoc" :options="filteredColumns" v-model="showPicker" @select="onConfirm" />
+            >
+                <slot></slot>
+            </van-field>
+            <MoreSelect v-model="showPicker" :show-search="showSearch" :input-value="inputValueDoc" :options="filteredColumns" @select="onConfirm" />
         </template>
         <template v-if="type === 'date'">
             <van-field
-                class="form-input"
                 v-model="inputValueDoc"
+                class="form-input"
                 :name="fkey"
                 :placeholder="placeholder ? placeholder : t('common.choose')"
                 :readonly="true"
@@ -114,14 +116,15 @@
             <van-field name="uploader" class="form-input uploader" :rules="[...rules]">
                 <template #input>
                     <van-uploader
+                        v-if="!isUploadD"
+                        v-model="uploader"
                         :disabled="disabled"
+                        :deletable="!disabled"
                         :accept="accept"
-                        v-model="uploader"
                         :max-count="1"
                         :after-read="afterRead"
-                        v-if="!isUploadD"
                     ></van-uploader>
-                    <van-uploader :disabled="disabled" v-model="uploader" :max-count="1" :after-read="afterRead" v-if="isUploadD">
+                    <van-uploader v-if="isUploadD" v-model="uploader" :disabled="disabled" :deletable="!disabled" :max-count="1" :after-read="afterRead">
                         <slot></slot>
                     </van-uploader>
                 </template>
@@ -132,33 +135,12 @@
 
 <script setup>
 import dayjs from 'dayjs'
+import { closeToast, showLoadingToast, showToast } from 'vant'
 import { useI18n } from 'vue-i18n'
 import { uploadApi } from '@/api/upload'
-import { showLoadingToast, closeToast, showToast } from 'vant'
-const { t } = useI18n()
-const isUploading = ref(false)
-const uploader = ref([])
-const afterRead = async (file) => {
-    isUploading.value = true
-    showLoadingToast({
-        message: '上传中...',
-        forbidClick: true,
-    })
-    try {
-        const result = await uploadApi.uploadFile(file.file)
-        closeToast()
-        inputValueDoc.value = result.data
-        showToast('上传成功')
-        setTimeout(() => {
-            isUploading.value = false
-        }, 100)
-    } catch (error) {
-        showToast('上传失败')
-    }
-}
 
 const props = defineProps({
-    type: { type: String, default: 'text', validator: (v) => ['text', 'password', 'number', 'select', 'date'].includes(v) },
+    type: { type: String, default: 'text', validator: v => ['text', 'password', 'number', 'select', 'date'].includes(v) },
     label: String,
     fkey: String,
     accept: String,
@@ -179,9 +161,32 @@ const props = defineProps({
     minDate: { type: Date, default: () => new Date(1920, 0, 1) },
     maxDate: { type: Date, default: () => new Date(2050, 11, 31) },
     dateFormatter: { type: Function, default: (type, val) => val },
-    displayFormatter: { type: Function, default: (val) => dayjs(val).format('YYYY-MM-DD') },
+    displayFormatter: { type: Function, default: val => dayjs(val).format('YYYY-MM-DD') },
 })
 const emit = defineEmits(['update:value', 'blur', 'focus', 'clear', 'confirm', 'change'])
+const { t } = useI18n()
+const isUploading = ref(false)
+const uploader = ref([])
+async function afterRead(file) {
+    isUploading.value = true
+    showLoadingToast({
+        message: '上传中...',
+        forbidClick: true,
+    })
+    try {
+        const result = await uploadApi.uploadFile(file.file)
+        closeToast()
+        inputValueDoc.value = result.data
+        showToast('上传成功')
+        setTimeout(() => {
+            isUploading.value = false
+        }, 100)
+    }
+    catch (error) {
+        showToast('上传失败')
+    }
+}
+
 const inputValueDoc = ref('')
 const selectedValue = ref([])
 const showPicker = ref(false)
@@ -204,18 +209,22 @@ watch(
         if (props.type === 'text' || props.type === 'number' || props.type === 'password') {
             emit('update:value', newVal)
             emit('change', { value: newVal, key: props.fkey })
-        } else if (props.type === 'select') {
-            const matched = props.columns.find((opt) => opt.text === newVal)
+        }
+        else if (props.type === 'select') {
+            const matched = props.columns.find(opt => opt.text === newVal)
             emit('update:value', matched?.value || '')
             emit('change', { value: matched?.value || '', key: props.fkey })
-        } else if (props.type === 'date') {
+        }
+        else if (props.type === 'date') {
             emit('update:value', newVal)
             emit('change', { value: newVal, key: props.fkey })
-        } else if (props.type === 'upload') {
+        }
+        else if (props.type === 'upload') {
             emit('update:value', newVal)
             emit('change', { value: newVal, key: props.fkey })
-        } else if (props.type === 'dropdown') {
-            const matched = props.columns.find((opt) => opt.text === newVal)
+        }
+        else if (props.type === 'dropdown') {
+            const matched = props.columns.find(opt => opt.text === newVal)
             emit('update:value', matched?.value || '')
             emit('change', { value: matched?.value || '', key: props.fkey })
         }
@@ -225,58 +234,62 @@ watch(
 watch(
     () => props.value,
     (newVal) => {
-        if (!newVal || isUploading.value) return
+        if (!newVal || isUploading.value)
+            return
         if (props.type === 'date') {
             inputValueDoc.value = newVal ? dayjs(newVal).format('YYYY-MM-DD') : ''
-        } else if (props.type === 'select') {
-            const matched = props.columns.find((opt) => opt.value === newVal)
+        }
+        else if (props.type === 'select') {
+            const matched = props.columns.find(opt => opt.value === newVal)
             if (props.fkey == 'areaCode') {
-                inputValueDoc.value = matched?.text.match(/\+ \d+$/)[0]
-            } else {
+                inputValueDoc.value = matched?.text
+            }
+            else {
                 inputValueDoc.value = matched?.text || ''
             }
-
             selectedValue.value = [matched?.value]
-        } else if (props.type === 'upload') {
+        }
+        else if (props.type === 'upload') {
             uploader.value = [{ url: props.value }]
             inputValueDoc.value = props.value
-        } else if (props.type === 'dropdown') {
-            const matched = props.columns.find((opt) => opt.value === newVal)
+        }
+        else if (props.type === 'dropdown') {
+            const matched = props.columns.find(opt => opt.value === newVal)
             inputValueDoc.value = matched?.text || ''
             selectedValue.value = [matched?.value]
-        } else {
+        }
+        else {
             inputValueDoc.value = newVal
         }
     },
     { immediate: true },
 )
 
-const handleBlur = (event) => {
+function handleBlur(event) {
     emit('blur', event)
 }
 
-const handleFocus = (event) => {
+function handleFocus(event) {
     emit('focus', event)
 }
 
-const handleClear = () => {
+function handleClear() {
     inputValueDoc.value = ''
     emit('update:value', '')
     emit('clear')
 }
 
-const onConfirm = (value) => {
+function onConfirm(value) {
     let selectedText = value.text || ''
-    console.log(props.fkey, value.text, 11)
     if (props.fkey == 'areaCode') {
-        selectedText = selectedText.match(/\+ \d+$/)[0]
+        selectedText = selectedText
     }
 
     inputValueDoc.value = selectedText
     showPicker.value = false
 }
 
-const onDateConfirm = (value) => {
+function onDateConfirm(value) {
     const formatted = dayjs(value).format('YYYY-MM-DD')
     inputValueDoc.value = formatted
     showPicker.value = false

+ 4 - 4
src/components/StepList.vue

@@ -1,17 +1,17 @@
 <template>
     <div class="step">
         <div class="step-list">
-            <div class="step-item" v-for="i in options.length" :key="i" :style="{ width: 100 / options.length + '%' }">
-                <div :class="['item-li', currentStep <= i ? '' : 'ok', currentStep === i ? 'active' : '']">
+            <div v-for="i in options.length" :key="i" class="step-item" :style="{ width: `${100 / options.length}%` }">
+                <div class="item-li" :class="[currentStep <= i ? '' : 'ok', currentStep === i ? 'active' : '']">
                     <em :class="[i == 1 ? '' : 'step-dash step-dash1']"></em>
-                    <img v-if="currentStep > i" src="@/assets/images/success.png" alt="" />
+                    <img v-if="currentStep > i" src="@/assets/images/success.png" alt="">
                     <span v-else></span>
                     <em :class="[i == options.length ? '' : 'step-dash step-dash2']"></em>
                 </div>
             </div>
         </div>
         <div class="step-ul">
-            <div class="step-li" v-for="t in options" :key="t" :style="{ width: 100 / options.length + '%' }">{{ t }}</div>
+            <div v-for="t in options" :key="t" class="step-li" :style="{ width: `${100 / options.length}%` }">{{ t }}</div>
         </div>
     </div>
 </template>

+ 1 - 1
src/components/SuccessPrompt.vue

@@ -1,6 +1,6 @@
 <template>
     <div class="success-prompt-fullscreen">
-        <img class="success-prompt-img" src="@/assets/images/vector.png" alt="success" />
+        <img class="success-prompt-img" src="@/assets/images/vector.png" alt="success">
         <div class="success-prompt-title">{{ props.title }}</div>
         <div class="success-prompt-desc">{{ props.desc }}</div>
         <div class="fixed-btn">

+ 379 - 233
src/components/VirtualCard.vue

@@ -1,21 +1,26 @@
 <template>
-    <div class="page">
+    <div v-if="cardList.length" class="page">
         <div class="card-swiper">
             <div class="swiper-container" @touchstart="handleTouchStart" @touchmove="handleTouchMove" @touchend="handleTouchEnd">
                 <div
-                    class="card-wrapper"
                     v-for="(card, index) in cardList"
                     :key="card.id"
+                    class="card-wrapper"
                     :style="{ transform: `translateX(${(index - currentIndex) * 100 + offsetX}%)` }"
                 >
-                    <div class="card-info" @click.stop="(e: MouseEvent) => toggleCardNo(card.id, e)" :class="{ flipping: isFlipping[card.id] }">
-                        <p class="card-name">Virtual</p>
-                        <img class="card-type" src="@/assets/images/c-type.png" alt="" srcset="" />
-                        <img class="logo" src="@/assets/images/logo1.png" alt="" srcset="" />
+                    <div class="card-info" :class="{ flipping: isFlipping[card.id] }" @click.stop="(e: MouseEvent) => toggleCardNo(card, e)">
+                        <p v-if="card.type == 'Virtual'" class="card-name">
+                            {{ card.type || 'Virtual' }}
+                        </p>
+                        <p v-if="card.type == 'Physical'" class="card-name">
+                            {{ card.type || 'Physical' }}
+                        </p>
+                        <img class="card-type" src="@/assets/images/c-type.png" alt="" srcset="">
+                        <img class="logo" src="@/assets/images/logo1.png" alt="" srcset="">
                         <template v-if="showCardNo[card.id]">
                             <div class="number">
-                                {{ card?.cardNo }}
-                                <span class="copy" @click.stop="cardCopy(card.cardNo, 'cardNo')"><icon name="copy" :size="23" color="" /></span>
+                                {{ card?.cardNumber }}
+                                <span class="copy" @click.stop="cardCopy(card.cardNumber, 'cardNumber')"><icon name="copy" :size="23" color="" /></span>
                             </div>
                             <div class="card-b">
                                 <div class="valid">
@@ -24,7 +29,7 @@
                                 </div>
                                 <div class="valid">
                                     <span class="lable">{{ t('cards.p14') }}</span>
-                                    <span>{{ card.expire }}</span>
+                                    <span>{{ card.expireDateDate || '--' }}</span>
                                 </div>
                                 <div class="valid">
                                     <span class="lable">CVV</span>
@@ -36,19 +41,13 @@
                             </div>
                         </template>
                         <template v-else>
-                            <div class="zw">**** 7549</div>
+                            <div v-if="currentCard.status == 'success' && currentCard?.activateStatus" class="zw">{{ card.cardNumber }}</div>
+                            <div v-else class="zw">{{ '**** **** **** ****' }}</div>
                         </template>
-
-                        <img
-                            v-if="card.status != 1"
-                            src="https://upload.wikimedia.org/wikipedia/commons/a/a4/Flag_of_the_United_States.svg"
-                            class="flags"
-                            @click.stop="ucardActivate(card.id)"
-                        />
                     </div>
                 </div>
             </div>
-            <div class="swiper-indicators" v-if="cardList.length > 1">
+            <div v-if="cardList.length > 1" class="swiper-indicators">
                 <div
                     v-for="(card, index) in cardList"
                     :key="card.id"
@@ -58,64 +57,45 @@
                 ></div>
             </div>
         </div>
-        <div class="actions" v-if="currentCard.isOk">
-            <div class="action-btn" @click="goToCardRecharge">
-                <icon name="icon_recharge" :size="28" color="#EA002A" />
-                <span>{{ t('cards.recharge') }}</span>
-            </div>
-            <div class="action-btn" @click="goToFindPassword">
-                <icon name="icon_card password reset" :size="28" color="#EA002A" />
-                <span>{{ t('cards.findPassword') }}</span>
-            </div>
-
-            <div class="action-btn" @click="goToFreezeCard" v-if="currentCard.freezeStatus === 2">
-                <icon name="icon_unfreeze" :size="28" color="#EA002A" />
-                <span>{{ t('cards.unfreezeCard') }}</span>
-            </div>
-            <div class="action-btn" @click="goToFreezeCard" v-else>
-                <icon name="icon_freeze" :size="28" color="#EA002A" />
-                <span>{{ t('cards.freezeCard') }}</span>
-            </div>
-        </div>
-        <template v-if="!currentCard.isOk">
-            <div class="balance-content1">{{ t('apply-record-detail.p1') }}</div>
-            <div class="g">
-                <img src="../assets/images/apply-record-1.png" alt="" />
-                <div class="g-l">
-                    <div class="g-item">
-                        <div class="label a1">{{ currentCard.cardName }}</div>
+        <template v-if="currentCard.status == 'success' && currentCard?.activateStatus">
+            <div class="actions">
+                <template v-if="currentCard.freezeType == 1 && currentCard.freezeStatus == 'success'">
+                    <div class="action-btn" @click="ucardOperation(currentCard, 2)">
+                        <icon name="icon_recharge" :size="28" color="#EA002A" />
+                        <span>{{ t('card.Btn.b3') }}</span>
                     </div>
-                    <div class="g-item">
-                        <div class="label">{{ t('apply-record-detail.p2') }}</div>
-                        <div :class="statusClass(currentCard.kycStatus)">{{ statusMap[currentCard.kycStatus] }}</div>
+                    <div class="action-btn" @click="ucardOperation(currentCard, 3)">
+                        <icon name="icon_card password reset" :size="28" color="#EA002A" />
+                        <span>{{ t('card.Btn.b4') }}</span>
                     </div>
-                    <div class="g-item" v-if="currentCard.kycStatus == 2 && (currentCard.applyStatus === 0 || currentCard.applyStatus === 1)">
-                        <div class="label">{{ t('apply-record-detail.p7') }}</div>
-                        <div :class="statusClass1(currentCard.applyStatus)">{{ applyStatusMap[currentCard.applyStatus] }}</div>
+                </template>
+                <template v-else>
+                    <div class="action-btn action-btn1" @click="goToCardRecharge">
+                        <icon name="icon_recharge" :size="28" color="#999" />
+                        <span>{{ t('card.Btn.b3') }}</span>
                     </div>
+                    <div class="action-btn action-btn1" @click="ucardOperation(currentCard, 3)">
+                        <icon name="icon_card password reset" :size="28" color="#999" />
+                        <span>{{ t('card.Btn.b4') }}</span>
+                    </div>
+                </template>
+                <div v-if="currentCard.freezeType == '1'" class="action-btn" @click="ucardOperation(currentCard, 4)">
+                    <icon name="icon_unfreeze" :size="28" color="#EA002A" />
+                    <span v-if="currentCard.freezeStatus == 'success'">{{ t('card.Btn.b5') }}</span>
+                    <span v-else>{{ t('card.Btn.b14') }}</span>
+                </div>
+                <div v-if="currentCard.freezeType == '2'" class="action-btn" @click="ucardOperation(currentCard, 5)">
+                    <icon name="icon_freeze" :size="28" color="#EA002A" />
+                    <span v-if="currentCard.freezeStatus == 'success'">{{ t('card.Btn.b6') }}</span>
+                    <span v-else>{{ t('card.Btn.b15') }}</span>
                 </div>
             </div>
-
-            <div class="cwg-button cwg-btn">
-                <van-button
-                    type="primary"
-                    block
-                    v-if="currentCard.kycStatus === 2 && currentCard.applyStatus === null"
-                    @click="handleApply(2, currentCard)"
-                    >{{ t('cards.p6') }}</van-button
-                >
-                <van-button type="primary" block v-if="[null, -1, 1, 3].includes(currentCard.kycStatus)" @click="handleApply(3, currentCard)">{{
-                    t('cards.p7')
-                }}</van-button>
-            </div>
-        </template>
-        <template v-if="currentCard.isOk">
-            <div class="balance-wrap" v-if="balance.length > 0">
+            <div class="balance-wrap">
                 <div class="balance-content">{{ t('cards.currency') }}</div>
             </div>
             <div class="balance-wrap">
                 <div class="global-con-l" @click="setModelValue">
-                    <img :src="imageSrc(currency)" alt="" srcset="" />
+                    <img :src="imageSrc(currency)" alt="" srcset="">
                     <div class="r">
                         <p>{{ currency }}</p>
                     </div>
@@ -136,8 +116,8 @@
                     color="var(--main-yellow)"
                     type="range"
                     :show-confirm="false"
-                    @cancel="showDatePicker = false"
                     :formatter="formatter"
+                    @cancel="showDatePicker = false"
                     @confirm="onConfirmStart"
                 />
             </div>
@@ -147,27 +127,27 @@
                 <div class="item" :class="{ active: jiluIndex === 1 }" @click="jiluIndex = 1">{{ t('cards.transferB2') }}</div>
             </div>
             <template v-if="jiluIndex === 0">
-                <div class="recharge" v-if="recharge.length > 0">
+                <div v-if="recharge.length > 0" class="recharge">
                     <div v-for="i in recharge" :key="i.id" class="transaction" @click="goToTransactionDetail1(i)">
                         <div class="trans-icon">
                             <div class="trans-icon-inner">$</div>
                         </div>
                         <div class="trans-left">
-                            <div class="trans-type">{{ i.typeDesc }}</div>
+                            <div class="trans-type">{{ i.typeStr }}</div>
                             <div class="trans-desc">{{ statusRechargeMap[i.status] }}</div>
                         </div>
                         <div class="trans-right">
                             <div class="trans-amount">{{ i.amount }} {{ i.currency }}</div>
-                            <div class="trans-date">{{ i.time }}</div>
+                            <div class="trans-date">{{ i.addTime }}</div>
                         </div>
                     </div>
                 </div>
-                <div class="recharge" v-else>
+                <div v-else class="recharge">
                     <EmptyState :title="t('empty-state.t2')" :text="t('empty-state.c2')" />
                 </div>
             </template>
             <template v-else>
-                <div class="transactions" v-if="transactions.length > 0">
+                <div v-if="transactions.length > 0" class="transactions">
                     <div v-for="t in transactions" :key="t.id" class="transaction" @click="goToTransactionDetail(t)">
                         <div class="trans-icon">
                             <div class="trans-icon-inner">
@@ -175,38 +155,95 @@
                             </div>
                         </div>
                         <div class="trans-left">
-                            <div class="trans-type">{{ t.tradeTypeStr }}</div>
-                            <div class="trans-desc">{{ t.remark }}</div>
+                            <div v-ellipsis="{ lines: 1, tooltip: true, longpress: true }" class="trans-type">{{ t.tradeNo }}</div>
+                            <div class="trans-desc">{{ transStatusMap[t.status] }}</div>
                         </div>
                         <div class="trans-right">
-                            <div class="trans-amount">{{ t.amount }} {{ t.currencyTxn }}</div>
-                            <div class="trans-date">{{ t.businessDate }}</div>
+                            <div class="trans-amount">{{ t.amount }} {{ t.currency }}</div>
+                            <div class="trans-date">{{ setDate(t.transactionTime) }}</div>
                         </div>
                     </div>
                 </div>
                 <EmptyState v-if="transactions.length == 0" :title="t('empty-state.t1')" :text="t('empty-state.c1')" />
             </template>
         </template>
-        <CurrencySelect :showSearch="true" :options="balance" v-model="modelValue" @select="changeSelect" />
+        <template v-else>
+            <div class="actions1">
+                <div class="card-btn">
+                    <div class="yue st">
+                        <span class="a">{{ t('card.Info.t15') }}</span>
+                        <span
+                            v-if="
+                                !currentCard.activateStatus
+                                    && (currentCard.applyStatus == null
+                                        || currentCard.applyStatus == 'wait_process'
+                                        || currentCard.applyStatus == 'processing')
+                            "
+                            v-t="'card.Info.t16'"
+                            class="v"
+                        ></span>
+                        <span v-if="currentCard.applyStatus == 'fail'" v-t="'card.Info.t17'" class="v"></span>
+                        <span v-if="currentCard.activateStatus == 'unactivate'" v-t="'card.Info.t18'" class="v"></span>
+                        <span
+                            v-if="currentCard.activateStatus && (currentCard.status == 'processing' || currentCard.status == 'wait_process')"
+                            v-t="'card.Info.t19'"
+                            class="v"
+                        ></span>
+                        <span v-if="currentCard.activateStatus == 'fail'" v-t="'card.Info.t20'" class="v"></span>
+                    </div>
+                    <!-- 查询进度 -->
+                    <div v-if="!currentCard.activateStatus" class="btn1 btn2" @click="viewApply(currentCard)">
+                        <div v-t="'card.Btn.b11'"></div>
+                    </div>
+                    <!-- 激活 -->
+                    <div
+                        v-if="currentCard.activateStatus"
+                        class="btn1 btn2"
+                        :class="currentCard.activateStatus == 'unactivate' || currentCard.activateStatus == 'fail' ? '' : 'btn3'"
+                        @click="ucardOperation(currentCard, 1)"
+                    >
+                        <div v-t="'card.Btn.b1'"></div>
+                    </div>
+                    <!-- 重新开卡 -->
+                    <div
+                        v-if="
+                            (currentCard.tradeStatus == '3' || (currentCard.tradeStatus == '2' && currentCard.tradeType == '2'))
+                                && currentCard.applyStatus == 'fail'
+                        "
+                        class="btn1 btn2"
+                        @click="updateCardTypes(card, 1)"
+                    >
+                        <div v-t="'card.Btn.b12'"></div>
+                    </div>
+                </div>
+            </div>
+        </template>
+
+        <CurrencySelect v-model="modelValue" :show-search="true" :options="balance" @select="changeSelect" />
     </div>
 </template>
 
 <script setup lang="ts">
-import EmptyState from '@/components/EmptyState.vue'
-import { useI18n } from 'vue-i18n'
-import { ucardApi } from '@/api/ucard'
-import { useRouter } from 'vue-router'
 import type { CardInfo, TransactionInfo } from '@/api/ucard'
-import { showToast } from 'vant'
 import dayjs from 'dayjs'
-const router = useRouter()
+import { showToast } from 'vant'
+import { useI18n } from 'vue-i18n'
+import { useRouter } from 'vue-router'
+import { ucardApi } from '@/api/ucard'
+import errorIcon from '@/assets/images/error.png'
+import copyIcon from '@/assets/images/success.png'
+import EmptyState from '@/components/EmptyState.vue'
+import useTransferStore from '@/stores/use-transfer-store'
 import useUserStore from '@/stores/use-user-store'
+
+const router = useRouter()
 const userStore = useUserStore()
+const transferStore = useTransferStore()
 const cardList = computed(() => userStore.userCard)
 const userInfo = computed(() => userStore.userInfo)
 const { t } = useI18n()
 const currentCard = ref<CardInfo | null>({})
-const balance = ref<{ amount: number; currency: string; value: string }[]>([
+const balance = ref<{ amount: number, currency: string, value: string }[]>([
     {
         amount: 0,
         currency: 'USD',
@@ -222,18 +259,25 @@ const offsetX = ref(0)
 const isDragging = ref(false)
 const images = import.meta.glob('@/assets/images/currency/*.png', { eager: true })
 
-const imageSrc = (currency: string) => {
+function imageSrc(currency: string) {
     return images[`/src/assets/images/currency/${currency}.png`]?.default || fallbackImg
 }
 const jiluIndex = ref(0)
-
-import copyIcon from '@/assets/images/success.png'
-import errorIcon from '@/assets/images/error.png'
-const cardCopy = (content, type) => {
+const transStatusMap = {
+    succeed: t('card.Status.t1'),
+    success: t('card.Status.t1'),
+    failed: t('card.Status.t1'),
+    fail: t('card.Status.t1'),
+    processing: t('card.Status.t3'),
+    auth: t('card.Status.t4'),
+    wait_process: t('card.Status.t5'),
+}
+function cardCopy(content, type) {
     let message
-    if (type == 'cardNo') {
+    if (type == 'cardNumber') {
         message = t('common.copy1')
-    } else if (type == 'cvv') {
+    }
+    else if (type == 'cvv') {
         message = t('common.copy2')
     }
     if (navigator.clipboard && window.isSecureContext) {
@@ -253,7 +297,8 @@ const cardCopy = (content, type) => {
                     className: 'custom-toast',
                 })
             })
-    } else {
+    }
+    else {
         const textarea = document.createElement('textarea')
         textarea.value = content
         textarea.setAttribute('readonly', '')
@@ -268,7 +313,8 @@ const cardCopy = (content, type) => {
                 icon: copyIcon,
                 className: 'custom-toast',
             })
-        } catch (err) {
+        }
+        catch (err) {
             showToast({
                 message: t('common.copy3'),
                 icon: errorIcon,
@@ -278,13 +324,16 @@ const cardCopy = (content, type) => {
         document.body.removeChild(textarea)
     }
 }
+function setDate(date) {
+    return dayjs(date).format('YYYY-MM-DD HH:mm:ss')
+}
 const currency = ref('USD')
 const amount = ref(0)
 const modelValue = ref(false)
-const setModelValue = () => {
+function setModelValue() {
     modelValue.value = true
 }
-const changeSelect = (e) => {
+function changeSelect(e) {
     amount.value = e.amount
     currency.value = e.currency
 }
@@ -293,7 +342,7 @@ const dateRange = ref<[string, string] | undefined>(undefined)
 dateRange.value = ['', '']
 const minDate = new Date(new Date().getFullYear() - 10, 0, 1)
 const maxDate = new Date(new Date().getFullYear() + 10, 0, 1)
-const onConfirmStart = (value: [string, string]) => {
+function onConfirmStart(value: [string, string]) {
     dateRange.value = ['', '']
     if (value && value.length === 2) {
         dateRange.value = value
@@ -302,65 +351,62 @@ const onConfirmStart = (value: [string, string]) => {
     handleDateRangeChange()
 }
 
-const formatter = (day: any) => {
+function formatter(day: any) {
     if (day.type === 'start') {
         day.bottomInfo = t('cards.start')
-    } else if (day.type === 'end') {
+    }
+    else if (day.type === 'end') {
         day.bottomInfo = t('cards.end')
-    } else {
+    }
+    else {
         day.bottomInfo = ''
     }
     return day
 }
 
-const ucardActivate = async (id: string) => {
-    router.push({
-        path: '/card/activation',
-        query: {
-            id,
-        },
-    })
-}
-
 const recharge = ref<Transaction[]>([])
 
 // 获取充值记录
 async function getRechargeList() {
     try {
         recharge.value = []
-        if (!currentCard.value?.cardNo) return
+        if (!currentCard.value?.cardNumber)
+            return
         const res = await ucardApi.rechargeList({
-            cardNo: currentCard.value?.cardNo,
+            cardNumber: currentCard.value?.cardNumber,
             page: { current: 1, row: 4 },
         })
         if (res.code === 200 && res.data) {
             recharge.value = res.data
         }
-    } catch (error) {
+    }
+    catch (error) {
         recharge.value = []
         showToast(error as string)
     }
 }
 const statusRechargeMap = {
-    '1': t('card-recharge.rechargeSuccess'),
-    '2': t('card-recharge.rechargeFailed'),
-    '3': t('card-recharge.rechargePending'),
+    success: t('card-recharge.rechargeSuccess'),
+    fail: t('card-recharge.rechargeFailed'),
+    processing: t('card-recharge.rechargePending'),
+    wait_process: t('card-recharge.rechargePending'),
 }
 
-const goToTransactionDetail1 = (i: TransactionInfo) => {
+function goToTransactionDetail1(i: TransactionInfo) {
     router.push({
         path: '/recharge/record/detail',
         query: {
-            orderNo: i.orderNo,
+            merchantOrderNo: i.merchantOrderNo,
         },
     })
 }
 
 // 获取交易记录
-const getTransactions = async () => {
+async function getTransactions() {
     try {
         transactions.value = []
-        if (!currentCard.value?.cardNo) return
+        if (!currentCard.value?.cardNo)
+            return
         const res = await ucardApi.transactionsList({
             beginDate: dateRange.value?.[0] ? dayjs(dateRange.value?.[0]).format('YYYY-MM-DD') : undefined,
             endDate: dateRange.value?.[1] ? dayjs(dateRange.value?.[1]).format('YYYY-MM-DD') : undefined,
@@ -371,13 +417,14 @@ const getTransactions = async () => {
             },
         })
         transactions.value = res.data && Array.isArray(res.data) ? res.data : []
-    } catch (error: any) {
+    }
+    catch (error: any) {
         showToast(error?.message || String(error))
         transactions.value = []
     }
 }
 
-const getBalance = async () => {
+async function getBalance() {
     try {
         balance.value = [
             {
@@ -386,30 +433,18 @@ const getBalance = async () => {
                 value: 'USD',
             },
         ]
-        if (!currentCard.value?.cardNo) return
+        if (!currentCard.value?.cardNo)
+            return
         const res = await ucardApi.ucardBalance({
             cardNo: currentCard.value?.cardNo,
             uniqueId: currentCard.value?.uniqueId,
         })
-        res.data.map((item: any) => {
-            item.value = item.currency
-        })
 
         if (res.code == 200) {
-            res.data.push({
-                amount: 0,
-                currency: 'EUR',
-                value: 'EUR',
-            })
-            balance.value = res.data
-            if (balance.value.length > 0) {
-                currency.value = balance.value[0].currency
-                amount.value = balance.value[0].amount
-            } else {
-                currency.value = 'USD'
-                amount.value = 0
-            }
-        } else {
+            currency.value = 'USD'
+            amount.value = res.data.amount
+        }
+        else {
             balance.value = [
                 {
                     amount: 0,
@@ -417,8 +452,11 @@ const getBalance = async () => {
                     value: 'USD',
                 },
             ]
+            currency.value = 'USD'
+            amount.value = 0
         }
-    } catch (error: any) {
+    }
+    catch (error: any) {
         showToast(error?.message || String(error))
         balance.value = [
             {
@@ -430,22 +468,22 @@ const getBalance = async () => {
     }
 }
 
-const handleDateRangeChange = () => {
+function handleDateRangeChange() {
     if (currentCard.value) {
         getTransactions()
     }
 }
 
 const statusMap: Record<string, string> = {
-    null: t('kyc.statusDesc'),
+    'null': t('kyc.statusDesc'),
     '-1': t('kyc.statusDesc'),
     '1': t('kyc.statusDesc2'),
     '2': t('kyc.statusDesc3'),
     '3': t('kyc.statusDesc4'),
 }
 const applyStatusMap: Record<string, string> = {
-    '0': t('apply-record-detail.p8'),
-    '1': t('apply-record-detail.p6'),
+    0: t('apply-record-detail.p8'),
+    1: t('apply-record-detail.p6'),
 }
 function statusClass(status: number) {
     switch (status) {
@@ -465,7 +503,7 @@ function statusClass1(status: number) {
             return 'status-default'
     }
 }
-const handleApply = (type: number, item: any) => {
+function handleApply(type: number, item: any) {
     if (type == 1) {
         router.push({
             path: '/apply/record/detail',
@@ -473,9 +511,11 @@ const handleApply = (type: number, item: any) => {
                 cardTypeId: item.cardTypeId,
             },
         })
-    } else if (type == 2) {
+    }
+    else if (type == 2) {
         ucardApply(item)
-    } else if (type == 3) {
+    }
+    else if (type == 3) {
         router.push({
             path: '/kyc',
             query: {
@@ -486,7 +526,7 @@ const handleApply = (type: number, item: any) => {
     }
 }
 
-const ucardApply = async (item: any) => {
+async function ucardApply(item: any) {
     const res = await ucardApi.ucardApply({
         cardTypeId: item.cardTypeId,
         uniqueId: userInfo.value.customInfo.uniqueId,
@@ -496,67 +536,45 @@ const ucardApply = async (item: any) => {
     }
 }
 
-watch(
-    currentIndex,
-    (newIndex) => {
-        if (cardList.value[newIndex]) {
-            currentCard.value = cardList.value[newIndex]
-            if (cardList.value[newIndex].isOk) {
-                getTransactions()
-                getRechargeList()
-                getBalance()
-            }
-        }
-    },
-    { immediate: true },
-)
-watch(
-    jiluIndex,
-    (newIndex) => {
-        console.log('jiluIndex changed:', newIndex)
-        if (newIndex === 0) {
-            getRechargeList()
-        } else {
-            getTransactions()
-        }
-    },
-    // { immediate: true },
-)
-
-const toggleCardNo = (cardId: string, event: MouseEvent) => {
-    if (!cardId) {
+function toggleCardNo(card: any, event: MouseEvent) {
+    if (!card.id)
+        return
+    if (!(card.status == 'success' && card?.activateStatus))
         return
-    }
     event.stopPropagation()
-    isFlipping.value[cardId] = !isFlipping.value[cardId]
-    showCardNo.value[cardId] = !showCardNo.value[cardId]
+    isFlipping.value[card.id] = !isFlipping.value[card.id]
+    showCardNo.value[card.id] = !showCardNo.value[card.id]
 }
 
-const handleTouchStart = (e: TouchEvent) => {
+function handleTouchStart(e: TouchEvent) {
     startX.value = e.touches[0].clientX
     isDragging.value = true
 }
 
-const handleTouchMove = (e: TouchEvent) => {
-    if (!isDragging.value) return
+function handleTouchMove(e: TouchEvent) {
+    if (!isDragging.value)
+        return
     const currentX = e.touches[0].clientX
     const diff = currentX - startX.value
     const containerWidth = document.querySelector('.swiper-container')?.clientWidth || 0
     if (currentIndex.value === 0 && diff > 0) {
         offsetX.value = (diff / containerWidth) * 30
-    } else if (currentIndex.value === cardList.value.length - 1 && diff < 0) {
+    }
+    else if (currentIndex.value === cardList.value.length - 1 && diff < 0) {
         offsetX.value = (diff / containerWidth) * 30
-    } else {
+    }
+    else {
         offsetX.value = (diff / containerWidth) * 100
     }
 }
 
-const handleTouchEnd = () => {
+function handleTouchEnd() {
     isDragging.value = false
     if (Math.abs(offsetX.value) > 0.2) {
         if (offsetX.value > 0 && currentIndex.value > 0) {
             currentIndex.value--
-        } else if (offsetX.value < 0 && currentIndex.value < cardList.value.length - 1) {
+        }
+        else if (offsetX.value < 0 && currentIndex.value < cardList.value.length - 1) {
             currentIndex.value++
         }
         cardList.value.forEach((card) => {
@@ -566,65 +584,49 @@ const handleTouchEnd = () => {
     offsetX.value = 0
 }
 
-function goToCardRecharge() {
-    if (currentCard.value?.status != 1) {
-        showToast('请先激活银行卡')
+async function ucardOperation(card, type) {
+    if (card.freezeType == '2' && type != '5') {
+        showToast(t('card.Msg.m10'))
+        return
+    }
+    if (card.blocked) {
+        showToast(t('card.New2.p6'))
+        return
+    }
+    if (card.freezeStatus != 'success') {
+        if (card.freezeType == '1') {
+            showToast(t('card.Btn.b14'))
+        }
+        else {
+            showToast(t('card.Btn.b15'))
+        }
         return
     }
     router.push({
-        path: '/card/recharge',
+        path: '/operations',
+        query: { id: card.id, type },
+    })
+}
+function viewApply(item: any) {
+    router.push({
+        path: '/apply/record/detail',
         query: {
-            id: currentCard.value?.id,
+            id: item.id,
         },
     })
 }
 
-function goToFindPassword() {
-    if (currentCard.value?.status != 1) {
-        showToast('请先激活银行卡')
-        return
-    }
+function goToCardRecharge() {
     router.push({
-        path: '/find/password',
+        path: '/card/recharge',
         query: {
-            cardNo: currentCard.value?.cardNo,
-            cardTypeId: currentCard.value?.cardTypeId,
+            id: currentCard.value?.id,
         },
     })
 }
-// 冻结卡片/解冻卡片
-async function goToFreezeCard() {
-    if (currentCard.value?.status != 1) {
-        showToast('请先激活银行卡')
-        return
-    }
-    try {
-        switch (currentCard.value?.freezeStatus) {
-            case 1:
-                let res = await ucardApi.ucardFreeze({ cardNo: currentCard.value?.cardNo, uniqueId: currentCard.value?.uniqueId })
-                if (res.code === 200) {
-                    currentCard.value.freezeStatus = 2
-                    showToast('冻结成功')
-                } else {
-                    showToast(res.msg)
-                }
-                break
-            case 2:
-                let res1 = await ucardApi.ucardUnfreeze({ cardNo: currentCard.value?.cardNo, uniqueId: currentCard.value?.uniqueId })
-                if (res1.code === 200) {
-                    currentCard.value.freezeStatus = 1
-                    showToast('解冻成功')
-                } else {
-                    showToast(res1.msg)
-                }
-                break
-        }
-    } catch (error) {
-        showToast(t('common.error'))
-    }
-}
 
 function goToTransactionDetail(transaction: TransactionInfo) {
+    transferStore.saveTransferInfo(transaction)
     router.push({
         path: '/card/transaction/detail',
         query: {
@@ -632,6 +634,29 @@ function goToTransactionDetail(transaction: TransactionInfo) {
         },
     })
 }
+
+watch(
+    currentIndex,
+    (newIndex) => {
+        if (cardList.value[newIndex]) {
+            currentCard.value = cardList.value[newIndex]
+            if (cardList.value[newIndex].cardNo && cardList.value[newIndex].activateStatus == 'success') {
+                getTransactions()
+                getRechargeList()
+                getBalance()
+            }
+        }
+    },
+    { immediate: true },
+)
+watch(jiluIndex, (newIndex) => {
+    if (newIndex === 0) {
+        getRechargeList()
+    }
+    else {
+        getTransactions()
+    }
+})
 onMounted(async () => {
     cardList.value.forEach((card) => {
         showCardNo.value[card.id] = false
@@ -789,7 +814,6 @@ onMounted(async () => {
     font-size: var(--font-size-18);
     font-weight: 500;
     line-height: 3;
-    letter-spacing: 2px;
     margin: 20px 0;
     display: flex;
     align-items: center;
@@ -800,8 +824,8 @@ onMounted(async () => {
     display: flex;
     justify-content: space-between;
     margin: 20px 0 16px 0;
+    background-color: #fff;
 }
-
 .action-btn {
     color: var(--white);
     border: none;
@@ -828,6 +852,11 @@ onMounted(async () => {
         line-height: 20px;
     }
 }
+.action-btn1 {
+    background: rgba(153, 153, 153, 0.03) !important;
+    color: #999 !important;
+    pointer-events: none !important;
+}
 
 .balance-wrap {
     display: flex;
@@ -1213,4 +1242,121 @@ onMounted(async () => {
         color: #fff;
     }
 }
+
+.actions1 {
+    width: 100%;
+    padding: 20px;
+
+    margin-top: 20px;
+    border: 1px solid rgba(214, 255, 0, 0.2);
+    box-shadow: 0 0.053333rem 0.213333rem rgba(0, 0, 0, 0.08);
+}
+
+.card-btn {
+    width: 100%;
+    .yue {
+        display: flex;
+        align-items: center;
+        box-sizing: border-box;
+        line-height: 50px;
+        width: 100%;
+        height: 50px;
+        background: rgba(208, 37, 55, 0.03);
+        border-radius: 8px;
+        text-align: left;
+        padding-left: 20px;
+        margin-bottom: 20px;
+    }
+
+    .a {
+        font-size: 14px;
+        color: #333333;
+        font-weight: bold;
+        padding: 0;
+    }
+    .v {
+        font-size: 14px;
+        color: #eb3f57;
+        padding: 0;
+    }
+    .btn {
+        width: 193px;
+        height: 40px;
+        border: 1px solid #eb3f57;
+        border-radius: 4px;
+        text-align: center;
+        color: #eb3f57;
+        font-size: 16px;
+        font-family: Roboto;
+        font-weight: 600;
+        line-height: 40px;
+        cursor: pointer;
+        user-select: none;
+    }
+    .btn1 {
+        width: 100px;
+        height: 94px;
+        background: rgba(208, 37, 55, 0.03);
+        border: 1px solid rgba(208, 37, 55, 0.03);
+        border-radius: 15px;
+        text-align: center;
+        color: #eb3f57;
+        font-size: 16px;
+        font-family: Roboto;
+        font-weight: 600;
+        line-height: 20px;
+        padding: 0 8px;
+        cursor: pointer;
+        user-select: none;
+        display: flex;
+        align-items: center;
+        justify-content: center;
+        flex-direction: column;
+        gap: 8px;
+        &:hover {
+            border: 1px solid #eb3f57;
+        }
+
+        img {
+            width: 28px;
+            height: 28px;
+            vertical-align: middle;
+            margin-right: 5px;
+        }
+    }
+    .btn2 {
+        width: 162px;
+    }
+    .btn3 {
+        background: rgba(153, 153, 153, 0.03) !important;
+        color: #999 !important;
+        pointer-events: none !important;
+    }
+}
+.status {
+    position: absolute;
+    top: 15px;
+    right: -30px;
+    padding: 4px 40px;
+    background: rgba(235, 63, 87, 0.1);
+    color: #eb3f57;
+    font-size: 14px;
+    font-weight: 500;
+    text-align: center;
+    transform: rotate(45deg);
+    transform-origin: center center;
+}
+.status1 {
+    position: absolute;
+    top: 15px;
+    right: -30px;
+    padding: 4px 40px;
+    background: rgba(67, 68, 68, 0.1);
+    color: #434444;
+    font-size: 14px;
+    font-weight: 500;
+    text-align: center;
+    transform: rotate(45deg);
+    transform-origin: center center;
+}
 </style>

+ 1 - 1
src/composables/config.ts

@@ -5,7 +5,7 @@ export default config
 export const userToken = useStorage('user-token', '')
 export const lang = useStorage('lang', 'cn', localStorage, {
     deep: true,
-    writeDefaults: true
+    writeDefaults: true,
 })
 export const CLIENT = useStorage('CLIENT', '')
 export const rememberPassword = useStorage('rememberPassword', 'false')

+ 11 - 8
src/composables/crypt.ts

@@ -1,19 +1,22 @@
 import CryptoJS from 'crypto-js'
+
 class CryptToJS {
-    private crypt: typeof CryptoJS;
-    private secret: string;
+    private crypt: typeof CryptoJS
+    private secret: string
     constructor() {
-        this.crypt = CryptoJS;
-        this.secret = 'Believe in yourself.';
+        this.crypt = CryptoJS
+        this.secret = 'Believe in yourself.'
     }
+
     public encrypt(text: string): string {
-        return this.crypt.AES.encrypt(text, this.secret).toString();
+        return this.crypt.AES.encrypt(text, this.secret).toString()
     }
+
     public decrypt(text: string): string {
         if (text == null || text.length === 0) {
-            return "";
+            return ''
         }
-        return this.crypt.AES.decrypt(text, this.secret).toString(CryptoJS.enc.Utf8);
+        return this.crypt.AES.decrypt(text, this.secret).toString(CryptoJS.enc.Utf8)
     }
 }
-export default new CryptToJS();
+export default new CryptToJS()

+ 65 - 11
src/composables/fetch.ts

@@ -1,11 +1,12 @@
 import type { AxiosHeaders, AxiosRequestConfig, AxiosResponse } from 'axios'
 import axios from 'axios'
 import { showToast } from 'vant'
-import { userToken, lang, CLIENT } from './config'
-import useGlobalStore from '@/stores/use-global-store'
-import useUserStore from '@/stores/use-user-store'
 import config from '@/config'
-const { Host85 } = config
+import useGlobalStore from '@/stores/use-global-store'
+import useUserStore from '~/stores/use-transfer-store'
+import { CLIENT, lang, userToken } from './config'
+
+const { Host85, Host00 } = config
 
 window.axios = axios
 
@@ -21,6 +22,7 @@ interface Objable {
 
 interface ApiType {
     post: <T = any>(url: string, data?: Objable, header?: Objable, checkCode?: boolean) => Promise<ResponseData<T>>
+    post80: <T = any>(url: string, data?: Objable, header?: Objable, checkCode?: boolean) => Promise<ResponseData<T>>
     get: <T = any>(url: string, data?: Objable, header?: Objable, checkCode?: boolean) => Promise<ResponseData<T>>
     put: <T = any>(url: string, data?: Objable, header?: Objable, checkCode?: boolean) => Promise<ResponseData<T>>
     delete: <T = any>(url: string, data?: Objable, header?: Objable, checkCode?: boolean) => Promise<ResponseData<T>>
@@ -28,6 +30,8 @@ interface ApiType {
     uploadFile: <T = any>(url: string, file: File, data?: Objable, header?: Objable, checkCode?: boolean) => Promise<ResponseData<T>>
     RESTful: <T = any>(url: string, method?: string, data?: Objable, header?: Objable, checkCode?: boolean) => Promise<ResponseData<T>>
     $RESTful: <T = any>(url: string, method?: string, data?: Objable, header?: Objable) => Promise<ResponseData<T>>
+    RESTful80: <T = any>(url: string, method?: string, data?: Objable, header?: Objable, checkCode?: boolean) => Promise<ResponseData<T>>
+    $RESTful80: <T = any>(url: string, method?: string, data?: Objable, header?: Objable) => Promise<ResponseData<T>>
 }
 
 const headers = {
@@ -107,6 +111,9 @@ const api: ApiType = {
     post<T = any>(url: string, data?: Objable, header?: Objable, checkCode = true) {
         return this.RESTful<T>(url, 'post', data, header, checkCode)
     },
+    post80<T = any>(url: string, data?: Objable, header?: Objable, checkCode = true) {
+        return this.RESTful80<T>(url, 'post', data, header, checkCode)
+    },
     get<T = any>(url: string, data?: Objable, header?: Objable, checkCode = true) {
         return this.RESTful<T>(url, 'get', data, header, checkCode)
     },
@@ -141,7 +148,7 @@ const api: ApiType = {
         formData.append('file', file)
 
         if (data) {
-            Object.keys(data).forEach(key => {
+            Object.keys(data).forEach((key) => {
                 formData.append(key, data[key])
             })
         }
@@ -159,13 +166,13 @@ const api: ApiType = {
         }
 
         if (userToken.value) {
-            (config.headers as AxiosHeaders)['Access-Token'] = `${userToken.value}`
+            ;(config.headers as AxiosHeaders)['Access-Token'] = `${userToken.value}`
         }
         if (lang.value) {
-            (config.headers as AxiosHeaders)['Language'] = `${lang.value}`
+            ;(config.headers as AxiosHeaders).Language = `${lang.value}`
         }
         if (CLIENT.value) {
-            (config.headers as AxiosHeaders)['CLIENT'] = `${CLIENT.value}`
+            ;(config.headers as AxiosHeaders).CLIENT = `${CLIENT.value}`
         }
 
         if (url.includes('NoTimeout')) {
@@ -179,6 +186,13 @@ const api: ApiType = {
         }
         return result
     },
+    async RESTful80<T = any>(url: string, method = 'get', data?: Objable, header?: Objable, checkCode = true) {
+        const xhr = await this.$RESTful80<T>(url, method, data, header)
+        if (checkCode) {
+            return checkCodeFn(xhr)
+        }
+        return xhr
+    },
     async RESTful<T = any>(url: string, method = 'get', data?: Objable, header?: Objable, checkCode = true) {
         const xhr = await this.$RESTful<T>(url, method, data, header)
         if (checkCode) {
@@ -202,13 +216,53 @@ const api: ApiType = {
             url,
         }
         if (userToken.value) {
-            (config.headers as AxiosHeaders)['Access-Token'] = `${userToken.value}`
+            ;(config.headers as AxiosHeaders)['Access-Token'] = `${userToken.value}`
+        }
+        if (lang.value) {
+            ;(config.headers as AxiosHeaders).Language = `${lang.value}`
+        }
+        if (CLIENT.value) {
+            ;(config.headers as AxiosHeaders).CLIENT = `${CLIENT.value}`
+        }
+        const userStore = useUserStore()
+        const cId = userStore.userInfo?.cId
+
+        if (method === 'get') {
+            config.params = { ...data, cId }
+        }
+        else {
+            config.data = { ...data, cId }
+        }
+
+        if (url.includes('NoTimeout')) {
+            config.timeout = 9999999
+        }
+        const response = await axios(config)
+        return checkStatus(response)
+    },
+    async $RESTful80<T = any>(url: string, method = 'get', data?: Objable, header?: Objable) {
+        const globalStore = useGlobalStore()
+        if (!globalStore.fullScreenLoading && !globalStore.requestLoading) {
+            globalStore.setRequestLoading(true)
+        }
+        url = Host00 + url
+        const config: AxiosRequestConfig = {
+            ...baseConfig,
+            headers: {
+                ...baseConfig.headers,
+                ...header,
+            },
+            method,
+            url,
+        }
+        if (userToken.value) {
+            ;(config.headers as AxiosHeaders)['Access-Token'] = `${userToken.value}`
         }
         if (lang.value) {
-            (config.headers as AxiosHeaders)['Language'] = `${lang.value}`
+            ;(config.headers as AxiosHeaders).Language = `${lang.value}`
         }
         if (CLIENT.value) {
-            (config.headers as AxiosHeaders)['CLIENT'] = `${CLIENT.value}`
+            ;(config.headers as AxiosHeaders).CLIENT = `${CLIENT.value}`
         }
         const userStore = useUserStore()
         const cId = userStore.userInfo?.customInfo?.cId

+ 3 - 3
src/composables/useApp.ts

@@ -1,5 +1,5 @@
-import { ref } from 'vue'
 import type { ComponentPublicInstance } from 'vue'
+import { ref } from 'vue'
 
 interface AppInstance extends ComponentPublicInstance {
     showGlobalLoading: () => void
@@ -8,10 +8,10 @@ interface AppInstance extends ComponentPublicInstance {
 
 const appRef = ref<AppInstance | null>(null)
 
-export const useApp = () => {
+export function useApp() {
     return appRef
 }
 
-export const setAppRef = (ref: AppInstance | null) => {
+export function setAppRef(ref: AppInstance | null) {
     appRef.value = ref
 }

+ 21 - 21
src/config/index.ts

@@ -1,30 +1,29 @@
-let ht = window.location.protocol;
-let ho = window.location.host.split('.')[1];
+const ht = window.location.protocol
+const ho = window.location.host.split('.')[1]
 const c = import.meta.env.VITE_APP_ENV
 let Host00, Host85
 switch (c) {
     // 测试环境
     case 'test':
-        Host00 = ht + "//testsecure." + ho + ".com"
-        Host85 = ht + "//testucard." + ho + ".com"
-        break;
+        Host00 = `${ht}//testsecure.${ho}.com`
+        Host85 = `${ht}//testucard.${ho}.com`
+        break
     // 生产环境
     case 'production':
-        Host00 = ht + "//secure." + ho + ".com"
-        Host85 = ht + "//ucard." + ho + ".com"
-        break;
+        Host00 = `${ht}//secure.${ho}.com`
+        Host85 = `${ht}//ucard.${ho}.com`
+        break
     default:
         // 开发环境
-        Host00 = "https://testsecure.6cd7e0f0b52.com"
-        // Host85= "https://testad.6cd7e0f0b52.com"
-        Host85 = "https://testucard.6cd7e0f0b52.com"
-        // Host85= "http://192.168.0.33:8700"
-        break;
+        Host00 = 'http://192.168.0.18:8000'
+        Host85 = 'https://ucard.44a5c8109e4.com'
+        Host85 = 'http://192.168.0.18:8700'
+        break
 }
 const config = {
     Host00,
     Host85,
-    Host80: ht + "//secure." + ho + ".com",
+    Host80: `${ht}//secure.${ho}.com`,
     Code: {
         StatusOK: 200,
         StatusFail: 400,
@@ -32,16 +31,17 @@ const config = {
         StatusSNotFound: 404,
     },
     Pattern: {
-        Email: /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/,
+        Email: /^[\w.%+-]+@[a-z0-9.-]+\.[a-z]{2,}$/i,
         Phone: /^1[3-9]\d{9}$/,
+        Pin: /^(?!(\d)\1{5})(?!012345)(?!123456)(?!234567)(?!345678)(?!456789)(?!987654)(?!876543)(?!765432)(?!654321)(?!543210)\d{6}$/,
         Password: /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)[a-zA-Z\d]{8,16}$/,
-        Tel: /^[0][1-9]{2,3}-[0-9]{5,10}$/,
+        Tel: /^0[1-9]{2,3}-\d{5,10}$/,
         Num: /\d/,
-        NonNegInt: /^[0-9]+?$/, //非负整数
-        PosInt: /^[1-9]\d*$/, //正整数
-        nonnegative: /^[0-9]+([.]{1}[0-9]{1,2})?$/, //非负数(最多两位小数)
-        englishName: /^[^\u4e00-\u9fa5]+$/,
-    }
+        NonNegInt: /^\d+$/, // 非负整数
+        PosInt: /^[1-9]\d*$/, // 正整数
+        nonnegative: /^\d+(\.\d{1,2})?$/, // 非负数(最多两位小数)
+        englishName: /^[^\u4E00-\u9FA5]+$/,
+    },
 }
 
 export default config

+ 95 - 0
src/directives/v-ellipsis.ts

@@ -0,0 +1,95 @@
+import { Popover } from 'vant'
+// v-ellipsis.ts
+import { createApp, ref } from 'vue'
+import 'vant/es/popover/style'
+
+export default {
+    mounted(el: HTMLElement, binding: any) {
+        const { value } = binding
+        const line = value?.lines ?? 1
+        const content = value?.content ?? el.innerText
+
+        // 设置基础样式
+        el.style.display = '-webkit-box'
+        el.style.webkitBoxOrient = 'vertical'
+        el.style.overflow = 'hidden'
+        el.style.textOverflow = 'ellipsis'
+        el.style.webkitLineClamp = String(line)
+        el.style.cursor = 'pointer'
+        el.style.wordBreak = 'break-all'
+
+        let pressTimer: any = null
+
+        // 创建浮层容器
+        const popoverApp = createApp({
+            components: { Popover },
+            setup() {
+                const show = ref(false)
+                const position = ref({ top: 0, left: 0 })
+                return { show, position }
+            },
+            template: `
+        <van-popover
+          v-model:show="show"
+          placement="top"
+          teleport="body"
+          :style="{ position: 'absolute', top: position.top + 'px', left: position.left + 'px', maxWidth: '80vw' }"
+        >
+          <div style="padding: 8px; font-size: 14px; line-height: 1.5;">{{ content }}</div>
+        </van-popover>
+      `,
+            data() {
+                return { content }
+            },
+        })
+
+        const container = document.createElement('div')
+        document.body.appendChild(container)
+        const popInstance = popoverApp.mount(container) as any
+
+        const showPopoverHandler = (event: MouseEvent | TouchEvent) => {
+            if (!popInstance?.show || !popInstance?.position)
+                return
+
+            const rect = el.getBoundingClientRect()
+            popInstance.position.top = rect.top - 10
+            popInstance.position.left = rect.left + rect.width / 2
+            popInstance.show = true
+        }
+
+        const hidePopoverHandler = () => {
+            if (popInstance?.show !== undefined) {
+                popInstance.show = false
+            }
+        }
+
+        // 🖱 PC 悬浮显示
+        el.addEventListener('mouseenter', showPopoverHandler)
+        el.addEventListener('mouseleave', hidePopoverHandler)
+
+        // 📱 移动端长按显示
+        el.addEventListener('touchstart', (e) => {
+            pressTimer = setTimeout(() => {
+                showPopoverHandler(e)
+            }, 600)
+        })
+        el.addEventListener('touchend', () => {
+            clearTimeout(pressTimer)
+            hidePopoverHandler()
+        })
+        el.addEventListener('touchmove', () => {
+            clearTimeout(pressTimer)
+            hidePopoverHandler()
+        })
+
+        el._ellipsis_destroy = () => {
+            popoverApp.unmount()
+            container.remove()
+            el.removeEventListener('mouseenter', showPopoverHandler)
+            el.removeEventListener('mouseleave', hidePopoverHandler)
+        }
+    },
+    unmounted(el: any) {
+        el._ellipsis_destroy && el._ellipsis_destroy()
+    },
+}

+ 40 - 20
src/i18n/index.ts

@@ -1,40 +1,60 @@
 import { createI18n } from 'vue-i18n'
 import { lang } from '@/composables/config'
+import ar from '@/i18n/locales/ar'
 import cn from '@/i18n/locales/cn'
-import zh from '@/i18n/locales/zh'
-import en from '@/i18n/locales/en'
 import de from '@/i18n/locales/de'
+import en from '@/i18n/locales/en'
+import es from '@/i18n/locales/es'
+import fa from '@/i18n/locales/fa'
+import id from '@/i18n/locales/id'
+import ko from '@/i18n/locales/ko'
+import ms from '@/i18n/locales/ms'
+import pt from '@/i18n/locales/pt'
+import th from '@/i18n/locales/th'
+import tr from '@/i18n/locales/tr'
+import vn from '@/i18n/locales/vn'
+import zh from '@/i18n/locales/zh'
 
 const messages = {
-  cn,
-  zh,
-  en,
-  de
+    cn,
+    en,
+    ar,
+    fa,
+    es,
+    de,
+    id,
+    ko,
+    ms,
+    th,
+    tr,
+    vn,
+    pt,
+    zh,
 }
 
-type LocaleType = 'cn' | 'en' | 'zh' | 'de'
+type LocaleType = 'cn' | 'en' | 'ar' | 'fa' | 'es' | 'de' | 'id' | 'ko' | 'ms' | 'th' | 'tr' | 'vn' | 'pt' | 'zh'
 // 确保在初始化时获取正确的语言设置
 const savedLang = (localStorage.getItem('lang') as LocaleType) || 'cn'
 
 const i18n = createI18n({
-  legacy: false,
-  locale: savedLang,
-  fallbackLocale: 'en',
-  messages,
-  silentTranslationWarn: true,
-  silentFallbackWarn: true,
-  runtimeOnly: false,
-  compositionOnly: true,
-  // 添加全局注入
-  globalInjection: true
+    legacy: false,
+    locale: savedLang,
+    fallbackLocale: 'en',
+    messages,
+    silentTranslationWarn: true,
+    silentFallbackWarn: true,
+    runtimeOnly: false,
+    compositionOnly: true,
+    // 添加全局注入
+    globalInjection: true,
 })
 // 监听语言变化
 watch(lang, (newLang) => {
-  i18n.global.locale.value = newLang as LocaleType
-  localStorage.setItem('lang', newLang)
+    i18n.global.locale.value = newLang as LocaleType
+    localStorage.setItem('lang', newLang)
 })
 
-const localesList = ['cn', 'en'] as const
+const localesList = ['en', 'cn', 'zh', 'de', 'es', 'ar', 'id', 'ms', 'th', 'vn', 'ko', 'pt', 'fa', 'tr'] as const
 // const localesList = ['en','cn','zh', 'de','es','ar','id','ms','th','vi','ko','pt','fa','tr']
 
 export { i18n, localesList }

+ 436 - 0
src/i18n/locales/ar.ts

@@ -0,0 +1,436 @@
+export default {
+    'common': {
+        confirm: 'Confirm',
+        cancel: 'Cancel',
+        loading: 'Loading...',
+        success: 'Success',
+        fail: 'Failed',
+        input: 'Please input',
+        choose: 'Please choose',
+        country: 'Type a currency / country',
+        error: 'System Error',
+        copy1: 'Card number copied!',
+        copy2: 'CVV copied!',
+        copy3: 'Copy failed',
+    },
+    'card': {
+        title: 'بطاقة CWG',
+        tab1: 'سجل الإيداع',
+        tab2: 'سجل المعاملات',
+        tab3: 'المعلومات الشخصية',
+        tab4: 'تغيير كلمة المرور',
+        tab5: 'بطاقة CWG',
+        tab6: 'معلومات كاملة',
+        tab7: 'سجل الإيداع',
+        tab8: 'سجل المعاملات',
+        tab9: 'التقدم بطلب للحصول على بطاقة',
+        tab10: 'تنشيط',
+        tab11: 'إيداع البطاقة',
+        tab12: 'تغيير كلمة المرور',
+        tab13: 'تجميد الحساب',
+        tab14: 'إلغاء تجميد الحساب',
+        tab15: 'سجل طلب البطاقة',
+        tab16: 'تقدم البطاقة',
+        tab17: 'سجل رصيد المحفظة',
+        tab18: 'اختيار البطاقة',
+        tab19: 'تأكيد المعلومات',
+        Status: {
+            t1: 'ناجح',
+            t2: 'فشل',
+            t3: 'جار المعالجة',
+            t4: 'مصرح به',
+            t5: 'قيد الانتظار',
+            t6: 'تم إنشاء البطاقة بنجاح',
+            t7: 'فشل إنشاء البطاقة',
+            t8: 'تم الخصم بنجاح',
+            t9: 'فشل الخصم',
+            t10: 'تم استرداد المبلغ بنجاح',
+            t11: 'فشل الاسترداد',
+            t12: 'جار استرداد المبلغ',
+            t13: 'قيد المراجعة',
+            t14: 'تمت الموافقة على المراجعة',
+            t15: 'تم رفض المراجعة',
+            t16: 'سحب',
+            t17: 'إيداع',
+            t18: 'استرداد',
+            t19: 'التحويل اليدوي الداخلي',
+            t20: 'التحويل اليدوي الخارجي',
+            t21: 'الكل',
+            v1: 'معلومات التسجيل',
+            v2: 'تعديل المعلومات',
+            v3: 'الحصول على رابط التحقق من الوجه',
+            v4: 'مراجعة KYC اليدوية',
+            v5: 'طلب فتح البطاقة',
+            v6: 'موافقة فتح البطاقة',
+            v7: 'الحصول على رمز التفعيل',
+            v8: 'تفعيل البطاقة',
+            v9: 'مبلغ إعادة الشحن الافتراضي',
+            v10: 'سحب إلى المحفظة',
+            v11: 'إيداع إلى المحفظة',
+            v12: 'طلب إعادة شحن البطاقة',
+            v13: 'موافقة إعادة الشحن',
+            v14: 'تجميد',
+            v15: 'إلغاء التجميد',
+            v16: 'تغيير كلمة المرور',
+            v17: 'حساب CID للمشغل',
+        },
+        Msg: {
+            m1: 'تم تقديم طلب البطاقة الخاص بك، وسيتم إخطارك عبر البريد الإلكتروني بعد الموافقة!',
+            m2: 'تم تقديم طلب الإيداع الخاص بك، ومن المتوقع أن يتم إيداعه خلال 1-3 أيام عمل بعد الموافقة!',
+            m3: 'تم تقديم معلومات تنشيط بطاقة البنك الخاصة بك.',
+            m4: 'تم تجميد بطاقة البنك الخاصة بك بنجاح!',
+            m5: 'تم إلغاء تجميد بطاقة البنك الخاصة بك بنجاح!',
+            m6: 'تم تغيير كلمة مرور بطاقة البنك الخاصة بك بنجاح!',
+            m7: 'تم الإيداع بنجاح',
+            m8: 'تم النسخ بنجاح!',
+            m9: 'فشل النسخ!',
+            m10: 'تم تجميد بطاقة البنك الخاصة بك، يرجى تنشيطها قبل المتابعة!',
+            m11: 'لا يوجد نوع بطاقة متاح للتقديم',
+            m12: 'ليس لديك حاليًا الوصول، يرجى الاتصال بالمسؤول!',
+            m13: 'تحذير الحذف',
+            m14: 'هل أنت متأكد أنك تريد حذف هذه القاعدة؟',
+            m15: 'تم التحديث بنجاح',
+            m16: 'تم تحميل صورة الهوية الأمامية بنجاح',
+            m17: 'تم تحميل صورة الهوية الخلفية بنجاح',
+            m18: 'تم تحميل صورة الهوية المحمولة بنجاح',
+            m19: 'حجم صورة الملف الشخصي المحملة لا يمكن أن يتجاوز 2 ميجابايت!',
+            m20: 'يجب أن تكون صورة الملف الشخصي المحملة بصيغة JPG/PNG!',
+        },
+        Info: {
+            s0: 'المهنة والمالية (اختياري)',
+            s0_1: 'المهنة والمالية',
+            s1: 'المعلومات الشخصية',
+            s2: 'التحقق من الهوية',
+            s3: 'المراجعة',
+            s4: 'تم التحقق من معلوماتك، ويمكنك التقديم للحصول على بطاقة في صفحة التقديم للحصول على البطاقة.',
+            s5: 'سيراجع فريقنا طلبك ومستندات KYC الخاصة بك. بعد الموافقة، ستتلقى رسالة تأكيد عبر البريد الإلكتروني.',
+            s6: 'قيد المراجعة',
+            s7: 'تم التحقق',
+            s8: 'صاحب البطاقة',
+            s9: 'تاريخ انتهاء الصلاحية',
+            s10: 'التقدم للحصول على بطاقة',
+            s11: 'يرجى اتباع الخطوات لتقديم طلب للحصول على بطاقة.',
+            s12: 'عملية التقديم',
+            s13: 'اختيار البطاقة:',
+            s14: 'يرجى اختيار نوع البطاقة التي تحتاجها.',
+            s15: 'تأكيد المعلومات:',
+            s16: 'يرجى تأكيد معلوماتك.',
+            s17: 'مراجعة الطلب:',
+            s18: 'سيراجع فريقنا طلبك، وبعد الموافقة، ستتلقى رسالة تأكيد عبر البريد الإلكتروني.',
+            s19: 'إصدار البطاقة:',
+            s20: 'سيتم إرسال البطاقة إلى عنوانك المسجل خلال 5-7 أيام عمل بعد الموافقة على المراجعة.',
+            s21: 'إذا كان لديك أي أسئلة أو تحتاج إلى مساعدة، فلا تتردد في الاتصال بفريق خدمة العملاء لدينا. نتمنى لك تجربة ممتعة مع البطاقة!',
+            s22: 'استلام البطاقة:',
+            s23: 'يرجى التأكد من أن الظرف سليم عند استلام البطاقة.',
+            s24: 'التنشيط عبر الإنترنت:',
+            s25: 'انتقل إلى مركز العملاء في CWG Markets وأدخل صفحة \'تنشيط البطاقة\'، أدخل رقم البطاقة ورمز التنشيط (المزود مع البطاقة).',
+            s26: 'تعيين رمز PIN:',
+            s27: 'اتبع التعليمات لتعيين رقم التعريف الشخصي (PIN)، المستخدم للسحب من أجهزة الصراف الآلي والمدفوعات عند التسوق.',
+            s28: 'ابدأ في الاستخدام:',
+            s29: 'بمجرد تنشيطها، يمكنك البدء في استخدام بطاقة Visa Debit الخاصة بك للإنفاق والسحب.',
+            s30: 'تدعم هذه البطاقة: Wechatpay و Alipay و Applepay والمدفوعات الإلكترونية الأخرى، وكذلك السحب من أجهزة نقاط البيع (POS) المحلية والدولية وأجهزة الصراف الآلي.',
+            s31: 'لقد تلقينا طلب بطاقتك. يرجى الانتظار حتى يكمل الطرف الثالث إجراءات الخصم. بعد نجاح الخصم، سنقوم بتقديم طلب البطاقة الخاص بك على الفور!',
+            s32: 'فشل الخصم، سيتم استرداد رسوم الخدمة إلى حسابك، يرجى إعادة التقديم للحصول على البطاقة!',
+            s33: 'فشل الخصم، تم استرداد رسوم الخدمة إلى حسابك، يرجى إعادة التقديم للحصول على البطاقة!',
+            s34: 'تم خصم رسوم خدمة طلب البطاقة بنجاح، سنقوم بتقديم طلب البطاقة الخاص بك على الفور!',
+            s35: 'لم تتم الموافقة على طلب البطاقة الخاص بك، يرجى الاتصال بالعاملين لحل المشكلة!',
+            s36: 'تمت الموافقة على بطاقتك وسيتم إرسالها إلى عنوانك المسجل خلال 5-7 أيام عمل.',
+            s37: 'عذرًا، لم تتم الموافقة على طلب بطاقتك، يرجى إعادة التقديم.',
+            s38: 'تم تقديم طلب بطاقتك للمراجعة من قبل طرف ثالث، وستتم إرسال البطاقة إلى عنوانك المسجل خلال 5-7 أيام عمل بعد الموافقة.',
+            s39: 'حالة رسوم الخدمة',
+            s40: 'حالة الموافقة',
+            s41: 'حالة البطاقة',
+            s42: 'فريقنا قد استلم معلوماتك. يرجى مسح رمز الاستجابة السريعة أدناه لإكمال التحقق من الهوية.',
+            s43: 'تم تحديث معلومات التسجيل الخاصة بك بنجاح.',
+            t1: 'قيد المراجعة',
+            t2: 'تمت الموافقة على المراجعة',
+            t3: 'تم رفض المراجعة',
+            t5: 'جار المعالجة',
+            t6: 'تم إنشاء البطاقة بنجاح',
+            t7: 'فشل إنشاء البطاقة',
+            t8: 'تم الخصم بنجاح',
+            t9: 'فشل الخصم',
+            t10: 'قيد الانتظار',
+            t11: 'جار استرداد المبلغ',
+            t12: 'تم استرداد المبلغ بنجاح',
+            t13: 'فشل استرداد المبلغ',
+            t15: 'الحالة:',
+            t16: 'عملية إنشاء البطاقة جارية (يرجى الانتظار)',
+            t17: 'فشل إنشاء البطاقة (يرجى الانتظار للاسترداد وإعادة التقديم)',
+            t18: 'تم إنشاء البطاقة بنجاح (يرجى تنشيط البطاقة)',
+            t19: 'عملية تنشيط البطاقة جارية (يرجى الانتظار)',
+            t20: 'فشل تنشيط البطاقة (يرجى إعادة تنشيط البطاقة)',
+        },
+        Form: {
+            v1: 'ذكر',
+            v2: 'أنثى',
+            v3: 'بطاقة هوية هونغ كونغ',
+            v4: 'جواز السفر',
+            v5: 'رخصة قيادة',
+            v6: 'بطاقة هوية حكومية',
+            f1: 'رمز المنطقة',
+            f2: 'رقم الهاتف',
+            f3: 'البريد الإلكتروني',
+            f4: 'اللقب',
+            f5: 'الاسم الأول',
+            f6: 'تاريخ الميلاد',
+            f7: 'الجنسية',
+            f8: 'الجنس',
+            f9: 'المدينة',
+            f10: 'العنوان',
+            f11: 'الرمز البريدي',
+            f12: 'المهنة',
+            f13: 'الدخل السنوي',
+            f14: 'الغرض من الحساب',
+            f15: 'حجم التداول المتوقع شهريًا',
+            f16: 'نوع الهوية',
+            f17: 'رقم الهوية',
+            f18: 'رقم الضمان الاجتماعي',
+            f19: 'تاريخ إصدار الهوية',
+            f20: 'تاريخ انتهاء الهوية',
+            f21: 'صورة الهوية الأمامية',
+            f22: 'صورة الهوية الخلفية',
+            f23: 'صورة الهوية المحمولة',
+            f24: 'رقم بطاقة البنك',
+            f25: 'كلمة مرور المعاملات',
+            f26: 'رمز التنشيط',
+            f27: 'ملاحظات',
+            f28: 'مبلغ الإيداع',
+            f29: 'العملة',
+            f30: 'رسوم المعاملات',
+            f31: 'المبلغ المستلم',
+            f32: 'العملة المستلمة',
+            f33: 'وقت التقديم',
+            f34: 'تأكيد كلمة المرور',
+            f35: 'رقم مرجعي للمعاملة',
+            f36: 'عملة المعاملة',
+            f37: 'مبلغ المعاملة',
+            f38: 'المبلغ المعتمد',
+            f39: 'العملة المعتمدة',
+            f40: 'الرسوم المعتمدة',
+            f41: 'اسم التاجر',
+            f42: 'نوع المعاملة',
+            f43: 'وقت المعاملة',
+            f44: 'رسوم المعاملات عبر الحدود',
+            f45: 'الحالة',
+            f46: 'وصف المعاملة',
+            f47: 'حالة الرسوم',
+            f48: 'نوع البطاقة',
+            f49: 'اسم البطاقة',
+            f50: 'حالة البطاقة',
+            f51: 'الوقت',
+            f52: 'النوع',
+            f53: 'حالة الموافقة',
+            f54: 'حالة الإيداع',
+            f55: 'المبلغ',
+            f56: 'رصيد المحفظة:',
+            f57: 'الكل',
+            f58: 'معدل الرسوم:',
+            f59: 'الرسوم المقدرة:',
+        },
+        vaildate: {
+            v1: 'يرجى اختيار رمز المنطقة',
+            v2: 'يرجى إدخال رقم الهاتف من 5 إلى 20 رقمًا',
+            v3: 'يرجى إدخال الاسم الأول، أحرف إنجليزية فقط، [2...23] حرفًا. يجب أن لا يتجاوز إجمالي طول الاسم الأول واللقب 23 حرفًا (بما في ذلك الفراغات)',
+            v4: 'يرجى إدخال اللقب، أحرف إنجليزية فقط، [2...23] حرفًا. يجب أن لا يتجاوز إجمالي طول الاسم الأول واللقب 23 حرفًا (بما في ذلك الفراغات)',
+            v5: 'يرجى اختيار تاريخ الميلاد',
+            v6: 'يرجى اختيار الجنسية',
+            v7: 'يرجى اختيار المدينة',
+            v8: 'يرجى إدخال الرمز البريدي',
+            v9: 'يرجى اختيار الجنس',
+            v10: 'يرجى اختيار المهنة',
+            v11: 'يرجى إدخال الدخل السنوي، مثل 200000 دولار أمريكي',
+            v12: 'يرجى إدخال الغرض من الحساب، إنجليزي فقط، مثل نفقات المعيشة',
+            v13: 'يرجى إدخال حجم التداول المتوقع شهريًا، مثل 100000 دولار أمريكي',
+            v14: 'يرجى اختيار نوع الهوية',
+            v15: 'يرجى إدخال رقم الهوية',
+            v16: 'يرجى إدخال رقم الضمان الاجتماعي المؤلف من 9 أرقام',
+            v17: 'يرجى اختيار تاريخ إصدار الهوية',
+            v18: 'يرجى اختيار تاريخ انتهاء الهوية',
+            v19: 'يرجى اختيار ملف صورة الهوية الأمامية',
+            v20: 'يرجى اختيار ملف صورة الهوية الخلفية',
+            v21: 'يرجى اختيار ملف صورة الهوية المحمولة',
+            v22: 'يرجى إدخال رقم البطاقة',
+            v23: 'يرجى إدخال كلمة مرور المعاملات المكونة من 6 أرقام',
+            v24: 'يرجى إدخال رمز التنشيط',
+            v25: 'يرجى إدخال الملاحظات',
+            v26: 'يرجى إدخال مبلغ الإيداع',
+            v27: 'يرجى إدخال العنوان',
+            v28: 'يرجى إدخال البريد الإلكتروني',
+            v29: 'كلمات المرور غير متطابقة',
+            v30: 'يرجى اختيار ملف صورة الهوية المحمولة',
+            v31: 'يرجى إدخال كلمة المرور مرة أخرى',
+            v32: 'استخدم 6 أرقام',
+            v33: 'لا يمكن استخدام الأرقام المتتالية أو المكررة',
+            v34: 'يجب أن يكون المبلغ أكبر من 0',
+            v35: 'لا يمكن أن يتجاوز مبلغ الإيداع',
+            v36: 'لا يمكن أن يكون مبلغ الإيداع أقل من',
+            v37: 'لا يمكن أن يتجاوز مبلغ الإيداع',
+            v38: 'يُسمح فقط باستخدام الأحرف الإنجليزية (تتضمن الفراغات)',
+            v39: 'يجب أن يكون الطول بين 2 و 23 حرفًا',
+            v40: 'لا يمكن أن يتجاوز إجمالي طول الاسم الأول واللقب 23 حرفًا (بما في ذلك الفراغات)',
+        },
+        Btn: {
+            Next: 'التالي',
+            Previous: 'السابق',
+            Submit: 'إرسال',
+            Confirm: 'تأكيد',
+            Cancel: 'إلغاء',
+            Update: 'تحديث',
+            Auth: 'التحقق',
+            Freeze: 'تجميد',
+            Unfreeze: 'إلغاء التجميد',
+            Recharge: 'إعادة شحن',
+            Activate: 'تنشيط',
+            b1: 'تنشيط البطاقة',
+            b2: 'عرض',
+            b3: 'طلب إعادة الشحن',
+            b4: 'تغيير كلمة المرور',
+            b5: 'تجميد البطاقة',
+            b6: 'إلغاء تجميد البطاقة',
+            b7: 'التقديم للحصول على بطاقة',
+            b8: 'احصل على رمز التنشيط',
+            b9: 'نسخ رمز التنشيط',
+            b10: 'الرصيد',
+            b11: 'تحقق من حالة طلب البطاقة',
+            b12: 'إعادة التقديم للحصول على البطاقة',
+            b13: 'جاري التنشيط',
+            b14: 'جاري إلغاء التجميد',
+            b15: 'جاري التجميد',
+            b16: 'إغلاق',
+        },
+        New: {
+            n0: 'طول العنوان من 2 إلى 200 حرفًا، يمكن أن يحتوي فقط على أحرف وأرقام وشرطات ومسافات',
+            n1: 'طول العنوان من 2 إلى 40 حرفًا، يمكن أن يحتوي فقط على أحرف وأرقام وشرطات ومسافات',
+            n2: 'يجب أن يكون الرمز البريدي بين 2 و15 حرفًا',
+            n3: 'عمرك أقل من 18 عامًا',
+            n4: 'السعر:',
+            n5: 'هل يلزم وجود حامل البطاقة عند فتح البطاقة:',
+            n6: 'العملات المدعومة لإعادة الشحن:',
+            n7: 'الحد الأدنى لمبلغ إعادة الشحن:',
+            n8: 'الحد الأدنى لمبلغ إعادة الشحن:',
+            n9: 'معدل الرسوم:',
+            n10: 'طريقة الخصم',
+            n11: 'العنوان الإنجليزي',
+        },
+        Transactions: {
+            t1: 'تفويض',
+            t2: 'استرداد',
+            t3: 'تحقق',
+            t4: 'إلغاء',
+            t5: 'رسوم البطاقة (شهرية، سنوية، رسوم السحب من الصراف الآلي....)',
+            t6: 'تحويل خارجي',
+            t7: 'تسوية وتعديل',
+            t8: 'استعلام عن الرصيد',
+            t9: 'رسوم',
+            t10: 'استهلاك',
+            t11: 'فشل الاستهلاك',
+            t12: 'استرداد',
+            t13: 'إلغاء',
+            t14: 'أخرى',
+            t15: 'معاملة تحقق ربط البطاقة',
+            t16: 'رسوم إدارية',
+            t17: 'تسوية',
+            t18: 'ناجح',
+            t19: 'تصحيح',
+            t20: 'تم تصحيحه',
+            t21: 'تم إلغاؤه',
+            t22: 'إلغاء',
+            t23: 'إرجاع',
+            t24: 'مفوض',
+            t25: 'فشل',
+            t26: 'إرجاع',
+        },
+        New1: {
+            title: 'إكمال المعلومات',
+            f1: 'تم تحميل صورة هويتك بنجاح، يرجى انتظار نتائج المراجعة!',
+            f2: 'تم التحميل بنجاح',
+            f3: 'امسح رمز الاستجابة السريعة لتحميل هويتك',
+            f4: 'هل ترغب في تحميل صورة الهوية يدويًا؟',
+            d1: 'تحميل صورة الجهة الأمامية من بطاقة هويتك',
+            d2: 'تحميل صورة الجهة الخلفية من بطاقة هويتك',
+            d3: 'تحميل صورة لك وأنت ممسك بهويتك',
+            d4: 'انقر لاختيار ملف',
+            d5: 'تم التحميل بنجاح',
+            d6: 'فشل التحميل',
+            d7: 'جاري التحميل...',
+            d8: 'دولة الإرسال',
+            d9: 'مدينة الإرسال',
+            d10: 'عنوان الإرسال',
+            d11: 'عنوان الإرسال باللغة الإنجليزية',
+            d12: 'الرمز البريدي للإرسال',
+            d13: 'رقم الهاتف للإرسال',
+            d14: 'لا يمكن أن يتجاوز حجم الملف 2 ميجابايت',
+            titel1: 'إعدادات اللغة',
+        },
+    },
+    'language': {
+        titel: 'إعدادات اللغة',
+        selectLang: 'Select Language',
+        cn: '简体中文',
+        zh: '繁體中文',
+        en: 'English',
+        de: 'Deutsch',
+        es: 'Español',
+        ar: 'العربية',
+        id: 'Indonesian',
+        ms: 'Malay',
+        th: 'ไทย',
+        tr: 'Türkçe',
+        pt: 'Português',
+        ko: '한국어',
+        fa: 'فارسی',
+        vn: 'Tiếng Việt',
+        i0: 'Vertified',
+        i1: 'إعدادات اللغة',
+        i2: 'Change Password',
+        i3: 'Personal Info',
+        i4: 'Card Opening Record',
+        i5: 'About PayouCard',
+        i6: 'Logout',
+    },
+    'improve-info': {
+        title: 'إكمال المعلومات',
+        p3: 'Please enter the information',
+        p3_1: 'Please enter your last name',
+        p3_2: 'Please enter your first name',
+        p3_3: 'Please enter your mobile number',
+        p3_4: 'Please enter the detailed address',
+        p3_5: 'Please enter your email',
+        p4: 'Area Code',
+        p5: 'Select Area Code',
+        p6: 'Mobile',
+        p7: 'Email',
+        p8: 'Last Name',
+        p9: 'First Name',
+        p10: 'Birthday',
+        p11: 'Nationality',
+        p12: 'Select Nationality',
+        p13: 'Gender',
+        p14: 'Please Select',
+        p15: 'Male',
+        p16: 'Female',
+        p17: 'Country',
+        p18: 'Select Country',
+        p19: 'City',
+        p20: 'Select City',
+        p21: 'Detailed Address',
+        p22: 'Postal Code',
+        p23: 'Document Type',
+        p24: 'Select Document Type',
+        p25: 'ID Card',
+        p26: 'Passport',
+        p27: 'Document Number',
+        p28: 'Document Expiry',
+        p28_1: 'Upload Your ',
+        p28_2: 'Click to select file',
+        p29: 'Document Photo',
+        p30: 'Face Photo',
+        p31: 'Extended Field',
+        p32: 'Cancel',
+        p33: 'Submit',
+        p34: 'DLN',
+        p35: '政府签发的身份证',
+        kycSuccess: 'Information Completed',
+    },
+}

+ 601 - 226
src/i18n/locales/cn.ts

@@ -1,5 +1,5 @@
 export default {
-    common: {
+    'common': {
         confirm: '确认',
         cancel: '取消',
         loading: '加载中...',
@@ -12,15 +12,14 @@ export default {
         copy1: '卡号已复制!',
         copy2: 'CVV已复制!',
         copy3: '复制失败',
-
     },
-    tabs: {
+    'tabs': {
         wallet: '钱包',
         cards: '卡片',
         finance: '金融',
-        mine: '我的'
+        mine: '我的',
     },
-    wallet: {
+    'wallet': {
         title: '我的钱包',
         balance: '余额',
         transactions: '交易记录',
@@ -28,7 +27,7 @@ export default {
         p2: '币种',
         p3: '全球速汇',
     },
-    cards: {
+    'cards': {
         title: '我的卡片',
         balance: '余额',
         transactions: '交易记录',
@@ -46,7 +45,7 @@ export default {
         end: '结束',
         p1: '在线申请卡',
         p2: 'KYC识别',
-        p3: '激活卡',
+        p3: '激活银行卡',
         p4: '申请银行卡',
         p5: 'KYC认证',
         p6: '开卡申请',
@@ -58,32 +57,36 @@ export default {
         p12: '银行卡进度详细信息',
         p13: '持卡人姓名',
         p14: '到期日',
-        rechargeB1:'充值',
+        rechargeB1: '充值',
         transferB2: '转账',
     },
-    finance: {
+    'finance': {
         title: '金融',
     },
-    mine: {
+    'mine': {
         title: '我的',
         logout: '退出登录',
         p: '您确定要退出登录吗?',
         b1: '退出登录',
         b2: '取消',
     },
-    language: {
+    'language': {
         title: '语言设置',
         selectLang: '选择语言',
-        cn: '中文简体',
-        zh: '中文繁体',
+        cn: '简体中文',
+        zh: '繁體中文',
         en: 'English',
-        de: 'German',
-        es: 'Spanish',
-        ar: 'Arabic',
+        de: 'Deutsch',
+        es: 'Español',
+        ar: 'العربية',
         id: 'Indonesian',
         ms: 'Malay',
-        th: 'Thai',
-        vi: 'Vietnamese',
+        th: 'ไทย',
+        tr: 'Türkçe',
+        pt: 'Português',
+        ko: '한국어',
+        fa: 'فارسی',
+        vn: 'Tiếng Việt',
         i0: '已认证',
         i1: '语言设置',
         i2: '修改密码',
@@ -92,7 +95,7 @@ export default {
         i5: '关于PayouCard',
         i6: '退出登录',
     },
-    login: {
+    'login': {
         title: '登录',
         p1: '邮箱',
         p2: '密码',
@@ -103,14 +106,14 @@ export default {
         p7: '登录即表示您接受我们的',
         p8: '隐私政策和服务条款',
         p9: '请先登录',
-        msg0:'登录失败',
-        msg0_2:'重置失败',
-        msg0_1:'登录成功',
-        msg1:'请输入邮箱',
-        msg2:'请输入正确的邮箱',
-        msg3:'请输入密码',
-        msg4:'请输入正确的密码',
-        msg5:'旧密码与新密码不能相同',
+        msg0: '登录失败',
+        msg0_2: '重置失败',
+        msg0_1: '登录成功',
+        msg1: '请输入邮箱',
+        msg2: '请输入正确的邮箱',
+        msg3: '请输入密码',
+        msg4: '请输入正确的密码',
+        msg5: '旧密码与新密码不能相同',
     },
     'card-transaction-detail': {
         title: '交易详情',
@@ -120,19 +123,9 @@ export default {
         consume: '消费',
         desc: '交易描述',
         status: '订单状态',
+        orderNo: '订单号',
         time: '时间',
     },
-    'pay-password': {
-        title: '修改密码',
-    },
-    'find-password': {
-        title: '找回密码',
-        desc: '签名照片',
-        nextStep: '提交',
-        success: '设置成功',
-        error: '设置失败',
-        p1: '它不能大于2M,支持.png、.jpeg和.jpg格式。'
-    },
 
     'card-recharge': {
         title: '卡片充值',
@@ -154,7 +147,7 @@ export default {
         tips1: '您的充值订单已提交',
         tips2: '到账后,系统将自动处理您的充值。',
         tips3: '关闭',
-        maxAmountTip: '最大可充值金额为{max}'
+        maxAmountTip: '最大可充值金额为{max}',
     },
     'activate-card': {
         title: '卡片激活',
@@ -207,8 +200,8 @@ export default {
         needPhotoForOperateCardDesc: '需要',
         needPhotoForOperateCardDesc2: '不需要',
     },
-    kyc: {
-        title: 'KYC认证',
+    'kyc': {
+        title: '确认信息',
         desc: '请填写您的身份信息以完成认证',
         type: '证件类型',
         i1: 'EEA文件证照',
@@ -252,7 +245,8 @@ export default {
         statusDesc3: '认证成功',
         statusDesc4: '拒绝',
         statusDesc5: '请填写完整信息',
-
+        AvailableBalance: '可用余额',
+        AvailableBalance1: '可用次数',
     },
     'eur-remit': {
         title: '全球速汇',
@@ -265,121 +259,121 @@ export default {
         notePlaceholder: '请输入Note(附言码)',
         select: '请选择',
         next: '下一步',
-        "item1": "收款银行",
-        "item2": "交易货币",
-        "item3": "目标货币代码",
-        "item4": "目标国家代码",
-        "item5": "汇率",
-        "item6": "基本信息",
-        "item7": "收款银行ID",
-        "item8": "用户唯一ID",
-        "item9": "速汇金额 (手续费率:{feeRate1}%)",
-        "item9_10": "速汇金额",
-        "item9_11": "手续费率",
-        "item9_12": "总手续费",
-        "item9_13": "{ allFee } USD({ feeRate2 } 比例 + { feeAmount1 } 固定)",
-        "item9_1": "总手续费:{ allFee } USD({ feeRate2 } 比例 + { feeAmount1 } 固定)",
+        item1: '收款银行',
+        item2: '交易货币',
+        item3: '目标货币代码',
+        item4: '目标国家代码',
+        item5: '汇率',
+        item6: '基本信息',
+        item7: '收款银行ID',
+        item8: '用户唯一ID',
+        item9: '速汇金额 (手续费率:{feeRate1}%)',
+        item9_10: '速汇金额',
+        item9_11: '手续费率',
+        item9_12: '总手续费',
+        item9_13: '{ allFee } USD({ feeRate2 } 比例 + { feeAmount1 } 固定)',
+        item9_1: '总手续费:{ allFee } USD({ feeRate2 } 比例 + { feeAmount1 } 固定)',
         maxAmountTip: '最大可速汇金额为{max}',
-        "item10": "附言 (英文)",
-        "item11": "收付款人关系",
-        "item12": "兄弟",
-        "item13": "姐夫/妹夫",
-        "item14": "堂/表兄弟姐妹",
-        "item15": "女儿",
-        "item16": "父亲",
-        "item17": "岳父/公公",
-        "item18": "朋友",
-        "item19": "祖父",
-        "item20": "祖母",
-        "item21": "丈夫",
-        "item22": "母亲",
-        "item23": "岳母/婆婆",
-        "item24": "侄子/外甥",
-        "item25": "侄女/外甥女",
-        "item26": "本人",
-        "item27": "姐妹",
-        "item28": "兄嫂/弟妹",
-        "item29": "儿子",
-        "item30": "叔伯/舅姑",
-        "item31": "妻子",
-        "item32": "其他",
-        "item33": "资金来源",
-        "item34": "现金",
-        "item35": "商业",
-        "item36": "礼物",
-        "item37": "工资",
-        "item38": "彩票",
-        "item39": "储蓄",
-        "item40": "其他",
-        "item41": "付款目的",
-        "item42": "购买货物或服务",
-        "item43": "运费和运输成本",
-        "item44": "教育费用",
-        "item45": "移民投资",
-        "item46": "慈善捐赠",
-        "item47": "家庭支持",
-        "item48": "股息或利息支付",
-        "item49": "国际贸易",
-        "item50": "付款人信息",
-        "item51": "付款人类型",
-        "item52": "个人",
-        "item53": "付款人姓 (英文)",
-        "item54": "付款人名 (英文)",
-        "item55": "付款人证件号码",
-        "item56": "付款人证件类型",
-        "item57": "护照",
-        "item58": "身份证",
-        "item59": "证件颁发国家",
-        "item60": "请选择证件颁发国家",
-        "item61": "出生日期",
-        "item62": "国籍",
-        "item63": "请选择国籍",
-        "item64": "手机号码",
-        "item65": "居住国家",
-        "item66": "请选择居住国家",
-        "item67": "居住城市代码",
-        "item68": "请选择居住城市",
-        "item69": "地址",
-        "item70": "邮编",
-        "item71": "职业",
-        "item72": "校验付款人",
-        "item73": "收款人信息",
-        "item74": "收款人银行ID",
-        "item75": "收款人账号",
-        "item76": "收款人户名",
-        "item77": "收款人居住国家",
-        "item78": "请选择收款人居住国家",
-        "item79": "收款人居住城市",
-        "item80": "请选择收款人居住城市",
-        "item81": "收款人地址",
-        "item82": "收款人邮编",
-        "item83": "收款人姓",
-        "item84": "收款人名",
-        "item85": "收款人银行编码",
-        "item86": "收款人国籍",
-        "item87": "请选择收款人国籍",
-        "item88": "收款人证件类型",
-        "item89": "护照",
-        "item90": "身份证",
-        "item91": "收款人证件号码",
-        "item92": "证件有效期",
-        "item93": "出生日期",
-        "item94": "手机区号",
-        "item95": "请选择区号",
-        "item96": "手机号码",
-        "item97": "银行账户类型",
-        "item98": "支票账户",
-        "item99": "储蓄账户",
-        "item100": "定期存款账户",
-        'item100_1':'请在确认之前查看您的转账详细信息',
-        "item101": "其它账户",
-        "item102": "校验收款人",
-        "item103": "校验付款人",
-        "item104": "确认信息",
-        "item105": "提交代付",
-        "item106": "订单号",
-        "item107": "商户原始订单号",
-        "item108": "支付状态",
+        item10: '附言 (英文)',
+        item11: '收付款人关系',
+        item12: '兄弟',
+        item13: '姐夫/妹夫',
+        item14: '堂/表兄弟姐妹',
+        item15: '女儿',
+        item16: '父亲',
+        item17: '岳父/公公',
+        item18: '朋友',
+        item19: '祖父',
+        item20: '祖母',
+        item21: '丈夫',
+        item22: '母亲',
+        item23: '岳母/婆婆',
+        item24: '侄子/外甥',
+        item25: '侄女/外甥女',
+        item26: '本人',
+        item27: '姐妹',
+        item28: '兄嫂/弟妹',
+        item29: '儿子',
+        item30: '叔伯/舅姑',
+        item31: '妻子',
+        item32: '其他',
+        item33: '资金来源',
+        item34: '现金',
+        item35: '商业',
+        item36: '礼物',
+        item37: '工资',
+        item38: '彩票',
+        item39: '储蓄',
+        item40: '其他',
+        item41: '付款目的',
+        item42: '购买货物或服务',
+        item43: '运费和运输成本',
+        item44: '教育费用',
+        item45: '移民投资',
+        item46: '慈善捐赠',
+        item47: '家庭支持',
+        item48: '股息或利息支付',
+        item49: '国际贸易',
+        item50: '付款人信息',
+        item51: '付款人类型',
+        item52: '个人',
+        item53: '付款人姓 (英文)',
+        item54: '付款人名 (英文)',
+        item55: '付款人证件号码',
+        item56: '付款人证件类型',
+        item57: '护照',
+        item58: '身份证',
+        item59: '证件颁发国家',
+        item60: '请选择证件颁发国家',
+        item61: '出生日期',
+        item62: '国籍',
+        item63: '请选择国籍',
+        item64: '手机号码',
+        item65: '居住国家',
+        item66: '请选择居住国家',
+        item67: '居住城市代码',
+        item68: '请选择居住城市',
+        item69: '地址',
+        item70: '邮编',
+        item71: '职业',
+        item72: '校验付款人',
+        item73: '收款人信息',
+        item74: '收款人银行ID',
+        item75: '收款人账号',
+        item76: '收款人户名',
+        item77: '收款人居住国家',
+        item78: '请选择收款人居住国家',
+        item79: '收款人居住城市',
+        item80: '请选择收款人居住城市',
+        item81: '收款人地址',
+        item82: '收款人邮编',
+        item83: '收款人姓',
+        item84: '收款人名',
+        item85: '收款人银行编码',
+        item86: '收款人国籍',
+        item87: '请选择收款人国籍',
+        item88: '收款人证件类型',
+        item89: '护照',
+        item90: '身份证',
+        item91: '收款人证件号码',
+        item92: '证件有效期',
+        item93: '出生日期',
+        item94: '手机区号',
+        item95: '请选择区号',
+        item96: '手机号码',
+        item97: '银行账户类型',
+        item98: '支票账户',
+        item99: '储蓄账户',
+        item100: '定期存款账户',
+        item100_1: '请在确认之前查看您的转账详细信息',
+        item101: '其它账户',
+        item102: '校验收款人',
+        item103: '校验付款人',
+        item104: '确认信息',
+        item105: '提交代付',
+        item106: '订单号',
+        item107: '商户原始订单号',
+        item108: '支付状态',
         text1: '提交调单信息或文件',
         text2: '订单号',
         text3: '请输入PayouCard订单号',
@@ -436,7 +430,6 @@ export default {
         ms30: '不支持中文字符,长度在2到48个字符之间',
         ms31: '请输入收款人户名',
         ms32: '长度在1到100个字符之间',
-
         ms33: '请输入收款人邮编',
         ms34: '长度在3到9个字符之间',
         ms35: '请输入收款人姓',
@@ -504,18 +497,20 @@ export default {
         validateSuccess: '校验成功',
         search: '搜索选项',
     },
-    eur: {
+    'eur': {
         title: 'EUR',
         globalRemit: '全球速汇',
         transactionRecord: '速汇记录',
         eurTopup: 'eur充值',
-        p1: '速汇详情', p2: '付款人信息', p3: '收款人信息', p4: '确认信息',
+        p1: '速汇详情',
+        p2: '付款人信息',
+        p3: '收款人信息',
+        p4: '确认信息',
         p5: '支持 ',
         p6: ' 银行',
         p7: '等',
         p8: '。',
         p9: '您钱包余额不足,速汇最低金额{max}',
-
     },
     'remit-success': {
         title: '支付成功',
@@ -578,7 +573,7 @@ export default {
         payPurpose: '付款目的',
         name: '姓名',
     },
-    remit: {
+    'remit': {
         title: 'USDT',
         available: 'USDT余额',
         amount: 'USDT金额',
@@ -594,72 +589,56 @@ export default {
         item3: '链上充值',
         item4: '链上提现',
     },
-    'reset-password': {
-        title: '重置密码',
-        email: '邮箱',
-        emailPlaceholder: '请输入邮箱',
-        emailError: '请输入正确的邮箱格式',
-        emailRequired: '请输入邮箱',
-        remember: '记起密码了?',
-        login: '返回登录',
-        reset: '重置密码',
-        resetSuccess: '',
-    },
-    "card-activation": {
-        title: '卡片激活',
-        cardNo: '银行卡号',
-        activePhoto: '手持护照和银行卡照图片',
-        activePhotoRequired: '请上传手持护照和银行卡照图片',
-        submit: '激活',
-        submitRequired: '激活成功',
-
-    },
-    "improve-info": {
-        title: '完善信息',
-        "p3": "请输入信息",
-        "p3_1": "请输入姓",
-        "p3_2": "请输入名",
-        "p3_3": "请输入手机号",
-        "p3_4": "请输入详细地址",
-        "p3_5": "请输入邮箱",
-        "p4": "区号",
-        "p5": "请选择区号",
-        "p6": "手机号",
-        "p7": "邮箱",
-        "p8": "姓",
-        "p9": "名",
-        "p10": "生日",
-        "p11": "国籍",
-        "p12": "请选择国籍",
-        "p13": "性别",
-        "p14": "请选择",
-        "p15": "男",
-        "p16": "女",
-        "p17": "国家",
-        "p18": "请选择国家",
-        "p19": "城市",
-        "p20": "请选择城市",
-        "p21": "详细地址",
-        "p22": "邮编",
-        "p23": "证件类型",
-        "p24": "请选择证件类型",
-        "p25": "身份证",
-        "p26": "护照",
-        "p27": "证件号",
-        "p28": "证件到期",
-        "p28_1": "上传你的",
-        "p28_2": "单击以选择文件",
-        "p29": "证件照片",
-        "p30": "人脸照片",
-        "p31": "扩展字段",
-        "p32": "取消",
-        "p33": "提交",
-        'kycSuccess': '完善成功',
-        'errer': '请填写完整信息',
 
+    'improve-info': {
+        title: '个人信息',
+        p3: '请输入信息',
+        p3_1: '请输入姓',
+        p3_2: '请输入名',
+        p3_3: '请输入手机号',
+        p3_4: '请输入详细地址',
+        p3_5: '请输入邮箱',
+        p4: '区号',
+        p5: '请选择区号',
+        p6: '手机号',
+        p7: '邮箱',
+        p8: '姓',
+        p9: '名',
+        p10: '生日',
+        p11: '国籍',
+        p12: '请选择国籍',
+        p13: '性别',
+        p14: '请选择',
+        p15: '男',
+        p16: '女',
+        p17: '国家',
+        p18: '请选择国家',
+        p19: '城市',
+        p20: '请选择城市',
+        p21: '详细地址',
+        p22: '邮编',
+        p23: '证件类型',
+        p24: '请选择证件类型',
+        p25: '香港身份证',
+        p26: '护照',
+        p27: '证件号',
+        p28: '证件到期',
+        p28_1: '上传你的',
+        p28_2: '单击以选择文件',
+        p29: '证件照片',
+        p30: '人脸照片',
+        p31: '扩展字段',
+        p32: '取消',
+        p33: '提交',
+        p34: 'DLN',
+        p35: '政府签发的身份证',
+        Des1: '提交成功,待审核中...',
+        Des11: '请使用手机扫描下方二维码完成认证,如已完成,请留意后续邮箱通知',
+        kycSuccess: '完善成功',
+        errer: '请填写完整信息',
     },
     'apply-record': {
-        title: '开卡记录'
+        title: '开卡记录',
     },
     'apply-record-detail': {
         title: '开卡详情',
@@ -671,9 +650,10 @@ export default {
         p6: '开卡成功',
         p7: '开卡申请状态',
         p8: '处理中',
+        p9: '开卡失败',
     },
     'recharge-record-list': {
-        title: '充值记录'
+        title: '充值记录',
     },
     'empty-state': {
         t1: '暂无交易',
@@ -684,5 +664,400 @@ export default {
         c3: '请先申请银行卡。',
         t4: '',
         c4: '',
-    }
+    },
+    'recharge-record-detail': {
+        title: '充值详情',
+        p1: 'Status',
+        p2: '充值成功',
+        p3: '充值中',
+        p4: '充值失败',
+        p5: 'Transaction Type',
+        p6: 'Card Recharge',
+        p7: '订单号',
+        p8: '卡号',
+        p9: '币种',
+        p10: '充值类型',
+        p11: '钱包充值',
+        p12: '充值时间',
+        b1: '返 回',
+    },
+
+    'pay-password': {
+        title: '修改密码',
+    },
+    'reset-password': {
+        title: '重置密码',
+        email: '邮箱',
+        emailPlaceholder: '请输入邮箱',
+        emailError: '请输入正确的邮箱格式',
+        emailRequired: '请输入邮箱',
+        remember: '记起密码了?',
+        login: '返回登录',
+        reset: '重置密码',
+        resetSuccess: '',
+    },
+    'card': {
+        title: 'CWG Card',
+        tab1: '充值记录',
+        tab2: '交易记录',
+        tab3: '个人信息',
+        tab4: '修改密码',
+        tab5: 'CWG 卡片',
+        tab6: '完善信息',
+        tab7: '充值记录',
+        tab8: '交易记录',
+        tab9: '申请开卡',
+        tab10: '激活',
+        tab11: '卡片充值',
+        tab12: '修改密码',
+        tab13: '冻结账号',
+        tab14: '解冻账号',
+        tab15: '开卡申请记录',
+        tab16: '开卡进度',
+        tab17: '钱包余额记录',
+        tab18: '选择卡片',
+        tab19: '确认信息',
+        Status: {
+            t1: '成功',
+            t2: '失败',
+            t3: '处理中',
+            t4: '已授权',
+            t5: '待处理',
+            t6: '开卡成功',
+            t7: '开卡失败',
+            t8: '扣款成功',
+            t9: '扣款失败',
+            t10: '退款成功',
+            t11: '退款失败',
+            t12: '退款处理中',
+            t13: '待审核',
+            t14: '审核通过',
+            t15: '审核拒绝',
+            t16: '提款',
+            t17: '取款',
+            t18: '充值',
+            t19: '退款',
+            t20: '手动转入',
+            t21: '手动转出',
+            t22: '全部',
+            v1: '注册信息',
+            v2: '修改信息',
+            v3: '获取人脸认证链接',
+            v4: 'kyc手动审核',
+            v5: '开卡申请',
+            v6: '开卡审批',
+            v7: '获取激活码',
+            v8: '激活卡',
+            v9: '充值默认金额',
+            v10: '出金到钱包',
+            v11: '入金到钱包',
+            v12: '卡充值申请',
+            v13: '充值审批',
+            v14: '冻结',
+            v15: '解冻',
+            v16: '修改密码',
+            v17: '操作者CID账户',
+        },
+        Msg: {
+            m1: '您的开卡申请已提交,审核通过后会通过邮箱发送通知!',
+            m2: '您的充值申请已提交,审批通过后预计1-3个工作日内到账!',
+            m3: '您的银行卡激活信息已提交。',
+            m4: '您的银行卡已冻结成功!',
+            m5: '您的银行卡已解冻成功!',
+            m6: '您的银行卡密码已修改成功!',
+            m7: '充值成功',
+            m8: '复制成功!',
+            m9: '复制失败!',
+            m10: '您的银行卡已被冻结,请激活后在进行操作!',
+            m11: '暂无可申请的卡片类型',
+            m12: '您目前还没有访问的权限,请联系管理员!',
+            m13: '删除提示',
+            m14: '您确认要删除该规则吗?',
+            m15: '更新成功',
+            m16: '证件照正面照上传成功',
+            m17: '证件照背面照上传成功',
+            m18: '手持证件照上传成功',
+            m19: '上传头像图片大小不能超过 2MB!',
+            m20: '上传头像图片只能是 JPG/PNG 格式!',
+        },
+        Info: {
+            s0: '职业与财务(可跳过)',
+            s0_1: '职业与财务',
+            s1: '个人信息',
+            s2: '身份认证',
+            s3: '审核',
+            s4: '您的信息已完成认证,您可以去开卡申请页面申请卡片。',
+            s5: '我们的团队将审核您的申请和 KYC 文件。审核通过后,您将收到确认邮件。',
+            s6: '审核中',
+            s7: '已认证',
+            s8: '持卡人',
+            s9: '到期时间',
+            s10: '申请卡片',
+            s11: '请按步骤流程申请卡片。',
+            s12: '申请流程',
+            s13: '选择卡片:',
+            s14: '请选择您所需的卡片类型。',
+            s15: '确认信息:',
+            s16: '请确认您的信息。',
+            s17: '申请审核:',
+            s18: '我们的团队将审核您的申请,审核通过后您将收到确认邮件。',
+            s19: '发卡:',
+            s20: '卡片将在审核通过后5-7个工作日内邮寄至您的注册地址。',
+            s21: '如有疑问或需要帮助,请随时联系我们的客服团队。祝您用卡愉快!',
+            s22: '收到卡片:',
+            s23: '请确认收到卡片时信封完好无损。',
+            s24: '在线激活:',
+            s25: 'CWG Markets客户中心,并进入“激活卡片”页面,输入您的卡号和激活码(随卡片提供)。 ',
+            s26: '设置PIN码: ',
+            s27: '按照提示设置您的个人识别号码(PIN码),用于ATM取款和购物支付。',
+            s28: '开始使用: ',
+            s29: '激活成功后,您即可开始使用您的Visa借记卡进行消费和取款。',
+            s30: '该卡片支持:Wechatpay、Alipay、Applepay等电子支付绑定支持境内外POS及ATM取现。 ',
+            s31: '我们已经收到您的开卡申请,请等待第三方完成手续扣费,扣款成功后我们会立刻提交您的开卡申请!',
+            s32: '扣款失败,手续费将退至您的账户,请重新申请开卡!',
+            s33: '扣款失败,手续费已退款至您的账户,请重新申请开卡!',
+            s34: '您的开卡申请手续费已交扣费完成,我们会立刻提交您的开卡申请!',
+            s35: '您的开卡申请未通过,请联系工作人员进行解决!',
+            s36: '您的卡片已通过审核,将在5-7个工作日内邮寄至您的注册地址。',
+            s37: '很抱歉,您的开卡申请未通过审核,请重新申请。',
+            s38: '您的开卡申请已经提交第三方审核,后续开卡成功后我们将在审核通过后的5-7个工作日内邮寄至您的注册地址。',
+            s39: '手续费状态',
+            s40: '审批状态',
+            s41: '开卡状态',
+            s42: '我们的团队已收到您的信息,请先扫码下方二维码完成身份验证。',
+            s43: '您的注册信息已更新成功。',
+            t1: '待审核',
+            t2: '审核通过',
+            t3: '审核拒绝',
+            t5: '处理中',
+            t6: '开卡成功',
+            t7: '开卡失败',
+            t8: '扣款成功',
+            t9: '扣款失败',
+            t10: '待处理',
+            t11: '退款中',
+            t12: '退款成功',
+            t13: '退款失败',
+            t15: '状态:',
+            t16: '开卡处理中(请耐心等待)',
+            t17: '开卡失败(请等退款成功重新申请)',
+            t18: '开卡成功(请激活卡片)',
+            t19: '卡片激活中(请耐心等待)',
+            t20: '卡片激活失败(请重新激活卡片)',
+        },
+        Form: {
+            v1: '男',
+            v2: '女',
+            v3: '香港身份证',
+            v4: '护照',
+            v5: '驾照',
+            v6: '政府签发的身份证',
+            f1: '区号',
+            f2: '手机号',
+            f3: '邮箱',
+            f4: '姓',
+            f5: '名',
+            f6: '出生日期',
+            f7: '国籍',
+            f8: '性别',
+            f9: '城市',
+            f10: '地址',
+            f11: '邮编',
+            f12: '职业',
+            f13: '年薪',
+            f14: '账户用途',
+            f15: '预期月交易量',
+            f16: '证件类型',
+            f17: '证件号码',
+            f18: '社会安全号',
+            f19: '证件签发日期',
+            f20: '证件到期日期',
+            f21: '身份证正面照片',
+            f22: '身份证背面照片',
+            f23: '手持身份证照片',
+            f24: '银行卡号',
+            f25: '交易密码',
+            f26: '激活码',
+            f27: '备注',
+            f28: '充值金额',
+            f29: '币种',
+            f30: '手续费',
+            f31: '到账金额',
+            f32: '到账币种',
+            f33: '申请时间',
+            f34: '确认密码',
+            f35: '交易流水号',
+            f36: '交易币种',
+            f37: '交易金额',
+            f38: '授权金额',
+            f39: '授权币种',
+            f40: '授权手续费',
+            f41: '商户名称',
+            f42: '交易类型',
+            f43: '交易时间',
+            f44: '跨境交易手续费',
+            f45: '状态',
+            f46: '交易描述',
+            f47: '手续费状态',
+            f48: '卡片类型',
+            f49: '卡片名称',
+            f50: '卡片状态',
+            f51: '时间',
+            f52: '类型',
+            f53: '审批状态',
+            f54: '充值状态',
+            f55: '金额',
+            f56: '钱包余额:',
+            f57: '全部',
+            f58: '费率:',
+            f59: '预估手续费:',
+        },
+        vaildate: {
+            v1: '请选择区号',
+            v2: '请输入5-20位手机号',
+            v3: '请输入名,只支持英文字符,[2...23]位。名和姓总长度不能超过23字符(含空格)',
+            v4: '请输入姓,只支持英文字符,[2...23]位。名和姓总长度不能超过23字符(含空格)',
+            v5: '请选择出生日期',
+            v6: '请选择国籍',
+            v7: '请选择城市',
+            v8: '请输入邮编',
+            v9: '请选择性别',
+            v10: '请选择职业',
+            v11: '请输入年薪,例如:200000 USD',
+            v12: '请输入账户用途,仅支持英文,例如:Living Expense',
+            v13: '请输入预期月交易量,例如:100000 USD',
+            v14: '请选择证件类型',
+            v15: '请输入证件号码',
+            v16: '请输入9位社会安全号',
+            v17: '请选择证件签发日期',
+            v18: '请选择证件到期日期',
+            v19: '请选择身份证正面照片文件',
+            v20: '请选择身份证背面照片文件',
+            v21: '请选择手持身份证照片文件',
+            v22: '请输入卡号',
+            v23: '请输入6位交易密码',
+            v24: '请输入激活码',
+            v25: '请输入备注',
+            v26: '请输入充值金额',
+            v27: '请输入地址',
+            v28: '请输入邮箱',
+            v29: '两次密码输入不一致',
+            v30: '请选择手持身份证照片文件',
+            v31: '请再次输入密码',
+            v32: '使用6位数字',
+            v33: '不得使用连续或重复数字',
+            v34: '金额必须大于 0',
+            v35: '充值金额不能超过',
+            v36: '充值金额不能小于',
+            v37: '充值金额不能超过',
+            v38: '只能输入英文字符(可含空格)',
+            v39: '长度需在 2 ~ 23 位之间',
+            v40: '名和姓总长度不能超过 23 位(含空格)',
+            v41: '输入的银行卡号不对,请检查后在提交',
+            v42: '查询CVV',
+            v43: '复制CVV',
+        },
+        Btn: {
+            Next: '下一步',
+            Previous: '上一步',
+            Submit: '提交',
+            Confirm: '确认',
+            Cancel: '取消',
+            Update: '更新',
+            Auth: '认证',
+            Freeze: '冻结',
+            Unfreeze: '解冻',
+            Recharge: '充值',
+            Activate: '激活',
+            b1: '激活卡片',
+            b2: '查看',
+            b3: '充值申请',
+            b4: '修改密码',
+            b5: '冻结卡片',
+            b6: '解冻卡片',
+            b7: '申请开卡',
+            b8: '获取激活码',
+            b9: '复制激活码',
+            b10: '余额',
+            b11: '查询开卡进度',
+            b12: '重新开卡',
+            b13: '激活中',
+            b14: '解冻中',
+            b15: '冻结中',
+            b16: '关闭',
+        },
+        New: {
+            n0: '地址长度2-200位,只能包含字母、数字、连字符和空格',
+            n1: '地址长度2-40位,只能包含字母、数字、连字符和空格',
+            n2: '邮编只能输入2-15位字符',
+            n3: '您的年龄未满18周岁',
+            n4: '价格:',
+            n5: '开卡时是否需要持卡人:',
+            n6: '支持充值的币种:',
+            n7: '充值最小额度:',
+            n8: '充值最小额度:',
+            n9: '费率:',
+            n10: '抵扣方式',
+            n11: '英文地址',
+        },
+        Transactions: {
+            t1: '授权',
+            t2: '退款',
+            t3: '验证',
+            t4: '撤销',
+            t5: '卡费(月费、年费、ATM提现费....)',
+            t6: '转出',
+            t7: '结算调整',
+            t8: '余额查询',
+            t9: '手续费',
+            t10: '消费',
+            t11: '消费失败',
+            t12: '退款',
+            t13: '撤销',
+            t14: '其他',
+            t15: '绑卡验证交易',
+            t16: '管理费',
+            t17: '结算',
+            t18: '成功',
+            t19: '冲正',
+            t20: '被冲正',
+            t21: '被撤销',
+            t22: '撤销',
+            t23: '退货',
+            t24: '已授权',
+            t25: '失败',
+            t26: '退货',
+        },
+        New1: {
+            title: '完善信息',
+            f1: '您的证件照已补充完成,请等待审核结果!',
+            f2: '补充成功',
+            f3: '手机扫码上传证件',
+            f4: '是否手动上传证件照',
+            d1: '上传你的身份证正面照片',
+            d2: '上传你的身份证背面照片',
+            d3: '上传你的手持身份证照片',
+            d4: '单击以选择文件',
+            d5: '上传成功',
+            d6: '上传失败',
+            d7: '上传中...',
+            d8: '邮寄国籍',
+            d9: '邮寄城市',
+            d10: '邮寄地址',
+            d11: '邮寄英文地址',
+            d12: '邮寄邮编',
+            d13: '邮寄手机号',
+            d14: '文件不能超过2MB',
+            titel1: '语言设置',
+        },
+        New2: {
+            p1: '是否被锁定',
+            p2: '是否被注销',
+            p3: '销卡',
+            p4: '锁定',
+            p5: '您的卡片已注销',
+            p6: '您的卡片已锁定',
+            n8: '充值最大额度:',
+        },
+    },
 }

+ 427 - 601
src/i18n/locales/de.ts

@@ -1,610 +1,436 @@
 export default {
-    common: {
-        confirm: '确认',
-        cancel: '取消',
-        loading: '加载中...',
-        success: '成功',
-        fail: '失败',
-        input: '请输入',
-        choose: '请选择'
+    'common': {
+        confirm: 'Confirm',
+        cancel: 'Cancel',
+        loading: 'Loading...',
+        success: 'Success',
+        fail: 'Failed',
+        input: 'Please input',
+        choose: 'Please choose',
+        country: 'Type a currency / country',
+        error: 'System Error',
+        copy1: 'Card number copied!',
+        copy2: 'CVV copied!',
+        copy3: 'Copy failed',
     },
-    tabs: {
-        wallet: '钱包',
-        cards: '卡片',
-        finance: '金融',
-        mine: '我的'
+    'card': {
+        title: 'CWG Karte',
+        tab1: 'Einzahlungsaufzeichnung',
+        tab2: 'Transaktionsaufzeichnung',
+        tab3: 'Persönliche Informationen',
+        tab4: 'Passwort ändern',
+        tab5: 'CWG Karte',
+        tab6: 'Vollständige Informationen',
+        tab7: 'Einzahlungsaufzeichnung',
+        tab8: 'Transaktionsaufzeichnung',
+        tab9: 'Karte beantragen',
+        tab10: 'Aktivieren',
+        tab11: 'Karten Einzahlung',
+        tab12: 'Passwort ändern',
+        tab13: 'Konto einfrieren',
+        tab14: 'Konto auftauen',
+        tab15: 'Kartenantrag-Aufzeichnung',
+        tab16: 'Kartenfortschritt',
+        tab17: 'Wallet-Balance-Aufzeichnung',
+        tab18: 'Karte auswählen',
+        tab19: 'Informationen bestätigen',
+        Status: {
+            t1: 'Erfolg',
+            t2: 'Fehler',
+            t3: 'In Bearbeitung',
+            t4: 'Autorisierte',
+            t5: 'Ausstehend',
+            t6: 'Karte erfolgreich erstellt',
+            t7: 'Kartenerstellung fehlgeschlagen',
+            t8: 'Abbuchung erfolgreich',
+            t9: 'Abbuchung fehlgeschlagen',
+            t10: 'Rückerstattung erfolgreich',
+            t11: 'Rückerstattung fehlgeschlagen',
+            t12: 'Rückerstattung in Bearbeitung',
+            t13: 'Wird überprüft',
+            t14: 'Überprüfung genehmigt',
+            t15: 'Überprüfung abgelehnt',
+            t16: 'Abhebung',
+            t17: 'Einzahlung',
+            t18: 'Rückerstattung',
+            t19: 'Manuelle Einzahlung',
+            t20: 'Manuelle Überweisung',
+            t21: 'Alle',
+            v1: 'Registrierungsinformationen',
+            v2: 'Informationen bearbeiten',
+            v3: 'Gesichtsverifizierungslink abrufen',
+            v4: 'Manuelle KYC-Prüfung',
+            v5: 'Kartenantrag',
+            v6: 'Kartenfreigabe',
+            v7: 'Aktivierungscode abrufen',
+            v8: 'Karte aktivieren',
+            v9: 'Standard-Aufladebetrag',
+            v10: 'Auszahlung in die Brieftasche',
+            v11: 'Einzahlung in die Brieftasche',
+            v12: 'Kartenaufladeantrag',
+            v13: 'Aufladegenehmigung',
+            v14: 'Einfrieren',
+            v15: 'Entsperren',
+            v16: 'Passwort ändern',
+            v17: 'CID-Konto des Bedieners',
+        },
+        Msg: {
+            m1: 'Ihr Kartenantrag wurde eingereicht und Sie werden nach der Genehmigung per E-Mail benachrichtigt!',
+            m2: 'Ihr Einzahlungsantrag wurde eingereicht und es wird erwartet, dass er innerhalb von 1-3 Werktagen nach Genehmigung gutgeschrieben wird!',
+            m3: 'Ihre Bankkarten-Aktivierungsinformationen wurden eingereicht.',
+            m4: 'Ihre Bankkarte wurde erfolgreich eingefroren!',
+            m5: 'Ihre Bankkarte wurde erfolgreich aufgetaut!',
+            m6: 'Ihr Bankkarten-Passwort wurde erfolgreich geändert!',
+            m7: 'Einzahlung erfolgreich',
+            m8: 'Kopieren erfolgreich!',
+            m9: 'Kopieren fehlgeschlagen!',
+            m10: 'Ihre Bankkarte wurde eingefroren, bitte aktivieren Sie sie, bevor Sie fortfahren!',
+            m11: 'Kein Kartentyp für die Beantragung verfügbar',
+            m12: 'Sie haben derzeit keinen Zugriff, bitte wenden Sie sich an den Administrator!',
+            m13: 'Löschaufforderung',
+            m14: 'Sind Sie sicher, dass Sie diese Regel löschen möchten?',
+            m15: 'Aktualisierung erfolgreich',
+            m16: 'Vorderes ID-Foto erfolgreich hochgeladen',
+            m17: 'Rückseitiges ID-Foto erfolgreich hochgeladen',
+            m18: 'Handgehaltenes ID-Foto erfolgreich hochgeladen',
+            m19: 'Die hochgeladene Profilbildgröße darf 2 MB nicht überschreiten!',
+            m20: 'Das hochgeladene Profilbild muss im JPG/PNG-Format sein!',
+        },
+        Info: {
+            s0: 'Beruf und Finanzen (optional)',
+            s0_1: 'Beruf und Finanzen',
+            s1: 'Persönliche Informationen',
+            s2: 'Identitätsprüfung',
+            s3: 'Überprüfung',
+            s4: 'Ihre Informationen wurden überprüft und Sie können auf der Seite für die Kartbeantragung eine Karte beantragen.',
+            s5: 'Unser Team wird Ihren Antrag und die KYC-Dokumente überprüfen. Nach der Genehmigung erhalten Sie eine Bestätigungs-E-Mail.',
+            s6: 'In Überprüfung',
+            s7: 'Überprüft',
+            s8: 'Karteninhaber',
+            s9: 'Ablaufdatum',
+            s10: 'Karte beantragen',
+            s11: 'Bitte folgen Sie den Schritten, um eine Karte zu beantragen.',
+            s12: 'Antragsprozess',
+            s13: 'Karte auswählen:',
+            s14: 'Bitte wählen Sie den Kartentyp, den Sie benötigen.',
+            s15: 'Informationen bestätigen:',
+            s16: 'Bitte bestätigen Sie Ihre Informationen.',
+            s17: 'Antragsüberprüfung:',
+            s18: 'Unser Team wird Ihren Antrag überprüfen, und nach der Genehmigung erhalten Sie eine Bestätigungs-E-Mail.',
+            s19: 'Kartenausgabe:',
+            s20: 'Die Karte wird innerhalb von 5-7 Werktagen nach der Genehmigung an Ihre registrierte Adresse gesendet.',
+            s21: 'Wenn Sie Fragen haben oder Unterstützung benötigen, wenden Sie sich bitte an unser Kundenserviceteam. Wir wünschen Ihnen eine angenehme Erfahrung mit der Karte!',
+            s22: 'Karte empfangen:',
+            s23: 'Bitte stellen Sie sicher, dass der Umschlag intakt ist, wenn Sie die Karte erhalten.',
+            s24: 'Online-Aktivierung:',
+            s25: 'Gehen Sie zum CWG Markets Kundenbereich und rufen Sie die Seite \'Karte aktivieren\' auf, geben Sie Ihre Kartennummer und den Aktivierungscode (mit der Karte bereitgestellt) ein.',
+            s26: 'PIN-Code festlegen:',
+            s27: 'Folgen Sie den Anweisungen, um Ihre persönliche Identifikationsnummer (PIN) festzulegen, die für Abhebungen an Geldautomaten und Einkäufe verwendet wird.',
+            s28: 'Mit der Nutzung beginnen:',
+            s29: 'Sobald die Karte aktiviert ist, können Sie Ihre Visa-Debitkarte für Ausgaben und Abhebungen verwenden.',
+            s30: 'Diese Karte unterstützt: Wechatpay, Alipay, Applepay und andere elektronische Zahlungen sowie Inlands- und Auslands-POS- und ATM-Abhebungen.',
+            s31: 'Wir haben Ihren Kartenantrag erhalten. Bitte warten Sie, bis der Dritte die Abbuchungsverfahren abgeschlossen hat. Nach erfolgreicher Abbuchung werden wir Ihren Kartenantrag sofort einreichen!',
+            s32: 'Abbuchung fehlgeschlagen, die Servicegebühr wird auf Ihr Konto zurückerstattet, bitte beantragen Sie die Karte erneut!',
+            s33: 'Abbuchung fehlgeschlagen, die Servicegebühr wurde auf Ihr Konto zurückerstattet, bitte beantragen Sie die Karte erneut!',
+            s34: 'Die Servicegebühr für Ihren Kartenantrag wurde erfolgreich abgebucht, wir werden Ihren Kartenantrag sofort einreichen!',
+            s35: 'Ihr Kartenantrag wurde nicht genehmigt, bitte wenden Sie sich an das Personal, um das Problem zu lösen!',
+            s36: 'Ihre Karte wurde genehmigt und wird innerhalb von 5-7 Werktagen an Ihre registrierte Adresse gesendet.',
+            s37: 'Entschuldigung, Ihr Kartenantrag wurde nicht genehmigt, bitte beantragen Sie die Karte erneut.',
+            s38: 'Ihr Kartenantrag wurde zur Drittanbieter-Überprüfung eingereicht, und die Karte wird innerhalb von 5-7 Werktagen nach der Genehmigung an Ihre registrierte Adresse gesendet.',
+            s39: 'Servicegebührenstatus',
+            s40: 'Genehmigungsstatus',
+            s41: 'Kartenstatus',
+            s42: 'Unser Team hat Ihre Informationen erhalten. Bitte scannen Sie den QR-Code unten, um die Identitätsprüfung abzuschließen.',
+            s43: 'Ihre Registrierungsinformationen wurden erfolgreich aktualisiert.',
+            t1: 'Wird überprüft',
+            t2: 'Überprüfung genehmigt',
+            t3: 'Überprüfung abgelehnt',
+            t5: 'In Bearbeitung',
+            t6: 'Kartenerstellung erfolgreich',
+            t7: 'Kartenerstellung fehlgeschlagen',
+            t8: 'Abbuchung erfolgreich',
+            t9: 'Abbuchung fehlgeschlagen',
+            t10: 'Ausstehend',
+            t11: 'Rückerstattung',
+            t12: 'Rückerstattung erfolgreich',
+            t13: 'Rückerstattung fehlgeschlagen',
+            t15: 'Status:',
+            t16: 'Kartenerstellung in Bearbeitung (Bitte haben Sie Geduld)',
+            t17: 'Kartenerstellung fehlgeschlagen (Bitte warten Sie auf die Rückerstattung und beantragen Sie erneut)',
+            t18: 'Kartenerstellung erfolgreich (Bitte aktivieren Sie Ihre Karte)',
+            t19: 'Kartenerstellung in Bearbeitung (Bitte haben Sie Geduld)',
+            t20: 'Kartenerstellung fehlgeschlagen (Bitte reaktivieren Sie Ihre Karte)',
+        },
+        Form: {
+            v1: 'Männlich',
+            v2: 'Weiblich',
+            v3: 'Hong Kong ID-Karte',
+            v4: 'Reisepass',
+            v5: 'Führerschein',
+            v6: 'Vom Staat ausgestellter Ausweis',
+            f1: 'Vorwahl',
+            f2: 'Telefonnummer',
+            f3: 'E-Mail',
+            f4: 'Nachname',
+            f5: 'Vorname',
+            f6: 'Geburtsdatum',
+            f7: 'Nationalität',
+            f8: 'Geschlecht',
+            f9: 'Stadt',
+            f10: 'Adresse',
+            f11: 'Postleitzahl',
+            f12: 'Beruf',
+            f13: 'Jahreseinkommen',
+            f14: 'Kontozweck',
+            f15: 'Erwartetes monatliches Handelsvolumen',
+            f16: 'Ausweisart',
+            f17: 'Ausweisnummer',
+            f18: 'Sozialversicherungsnummer',
+            f19: 'Ausstellungsdatum des Ausweises',
+            f20: 'Ablaufdatum des Ausweises',
+            f21: 'Vorderseite des Ausweises',
+            f22: 'Rückseite des Ausweises',
+            f23: 'Ausweis in der Hand',
+            f24: 'Bankkartennummer',
+            f25: 'Transaktionspasswort',
+            f26: 'Aktivierungscode',
+            f27: 'Bemerkungen',
+            f28: 'Einzahlungsbetrag',
+            f29: 'Währung',
+            f30: 'Transaktionsgebühr',
+            f31: 'Empfangener Betrag',
+            f32: 'Empfangene Währung',
+            f33: 'Antragszeit',
+            f34: 'Passwort bestätigen',
+            f35: 'Transaktionsreferenznummer',
+            f36: 'Transaktionswährung',
+            f37: 'Transaktionsbetrag',
+            f38: 'Autorisierter Betrag',
+            f39: 'Autorisierte Währung',
+            f40: 'Autorisierte Gebühr',
+            f41: 'Händlername',
+            f42: 'Transaktionstyp',
+            f43: 'Transaktionszeit',
+            f44: 'Gebühr für grenzüberschreitende Transaktionen',
+            f45: 'Status',
+            f46: 'Transaktionsbeschreibung',
+            f47: 'Gebührestatus',
+            f48: 'Kartentyp',
+            f49: 'Kartenname',
+            f50: 'Kartenstatus',
+            f51: 'Zeit',
+            f52: 'Typ',
+            f53: 'Genehmigungsstatus',
+            f54: 'Einzahlungsstatus',
+            f55: 'Betrag',
+            f56: 'Guthaben: ',
+            f57: 'Alle',
+            f58: 'Gebührenrate: ',
+            f59: 'Geschätzte Gebühr: ',
+        },
+        vaildate: {
+            v1: 'Bitte wählen Sie die Vorwahl',
+            v2: 'Bitte geben Sie eine Telefonnummer mit 5-20 Ziffern ein',
+            v3: 'Bitte geben Sie den Vornamen ein, nur englische Zeichen, [2...23] Zeichen. Die Gesamtlänge von Vor- und Nachname darf 23 Zeichen (einschließlich Leerzeichen) nicht überschreiten',
+            v4: 'Bitte geben Sie den Nachnamen ein, nur englische Zeichen, [2...23] Zeichen. Die Gesamtlänge von Vor- und Nachname darf 23 Zeichen (einschließlich Leerzeichen) nicht überschreiten',
+            v5: 'Bitte wählen Sie das Geburtsdatum',
+            v6: 'Bitte wählen Sie die Nationalität',
+            v7: 'Bitte wählen Sie die Stadt',
+            v8: 'Bitte geben Sie die Postleitzahl ein',
+            v9: 'Bitte wählen Sie das Geschlecht',
+            v10: 'Bitte wählen Sie den Beruf',
+            v11: 'Bitte geben Sie das Jahreseinkommen ein, z.B. 200000 USD',
+            v12: 'Bitte geben Sie den Kontozweck ein, nur Englisch, z.B. Lebensunterhalt',
+            v13: 'Bitte geben Sie das erwartete monatliche Handelsvolumen ein, z.B. 100000 USD',
+            v14: 'Bitte wählen Sie die Ausweisart',
+            v15: 'Bitte geben Sie die Ausweisnummer ein',
+            v16: 'Bitte geben Sie die 9-stellige Sozialversicherungsnummer ein',
+            v17: 'Bitte wählen Sie das Ausstellungsdatum des Ausweises',
+            v18: 'Bitte wählen Sie das Ablaufdatum des Ausweises',
+            v19: 'Bitte wählen Sie die Datei für das Foto der Vorderseite des Ausweises',
+            v20: 'Bitte wählen Sie die Datei für das Foto der Rückseite des Ausweises',
+            v21: 'Bitte wählen Sie die Datei für das Foto des Ausweises in der Hand',
+            v22: 'Bitte geben Sie die Kartennummer ein',
+            v23: 'Bitte geben Sie ein 6-stelliges Transaktionspasswort ein',
+            v24: 'Bitte geben Sie den Aktivierungscode ein',
+            v25: 'Bitte geben Sie Bemerkungen ein',
+            v26: 'Bitte geben Sie den Einzahlungsbetrag ein',
+            v27: 'Bitte geben Sie die Adresse ein',
+            v28: 'Bitte geben Sie die E-Mail ein',
+            v29: 'Passwörter stimmen nicht überein',
+            v30: 'Bitte wählen Sie die Datei für das Foto des Ausweises in der Hand',
+            v31: 'Bitte geben Sie das Passwort erneut ein',
+            v32: 'Verwenden Sie 6 Ziffern',
+            v33: 'Es dürfen keine aufeinander folgenden oder wiederholten Ziffern verwendet werden',
+            v34: 'Der Betrag muss größer als 0 sein',
+            v35: 'Der Einzahlungsbetrag darf nicht mehr als',
+            v36: 'Der Einzahlungsbetrag darf nicht weniger als',
+            v37: 'Der Einzahlungsbetrag darf nicht mehr als',
+            v38: 'Nur englische Zeichen sind erlaubt (einschließlich Leerzeichen)',
+            v39: 'Die Länge muss zwischen 2 und 23 Zeichen liegen',
+            v40: 'Die Gesamtlänge von Vor- und Nachnamen darf 23 Zeichen (einschließlich Leerzeichen) nicht überschreiten',
+        },
+        Btn: {
+            Next: 'Weiter',
+            Previous: 'Zurück',
+            Submit: 'Absenden',
+            Confirm: 'Bestätigen',
+            Cancel: 'Abbrechen',
+            Update: 'Aktualisieren',
+            Auth: 'Authentifizieren',
+            Freeze: 'Einfrieren',
+            Unfreeze: 'Auftauen',
+            Recharge: 'Aufladen',
+            Activate: 'Aktivieren',
+            b1: 'Karte aktivieren',
+            b2: 'Ansehen',
+            b3: 'Aufladeantrag',
+            b4: 'Passwort ändern',
+            b5: 'Karte einfrieren',
+            b6: 'Karte auftauen',
+            b7: 'Karte beantragen',
+            b8: 'Aktivierungscode erhalten',
+            b9: 'Aktivierungscode kopieren',
+            b10: 'Guthaben',
+            b11: 'Kartenantragsstatus prüfen',
+            b12: 'Karte erneut beantragen',
+            b13: 'Aktivierung',
+            b14: 'Auftauen',
+            b15: 'Einfrieren',
+            b16: 'Schließen',
+        },
+        New: {
+            n0: 'Adresslänge 2–200 Zeichen, nur Buchstaben, Zahlen, Bindestriche und Leerzeichen erlaubt',
+            n1: 'Adresslänge 2–40 Zeichen, nur Buchstaben, Zahlen, Bindestriche und Leerzeichen erlaubt',
+            n2: 'Postleitzahl muss 2–15 Zeichen lang sein',
+            n3: 'Sie sind unter 18 Jahre alt',
+            n4: 'Preis:',
+            n5: 'Ist der Karteninhaber bei der Karteneröffnung erforderlich:',
+            n6: 'Unterstützte Aufladewährungen:',
+            n7: 'Mindestaufladebetrag:',
+            n8: 'Mindestaufladebetrag:',
+            n9: 'Gebührensatz:',
+            n10: 'Abzugsmethode',
+            n11: 'Englische Adresse',
+        },
+        Transactions: {
+            t1: 'Autorisierung',
+            t2: 'Rückerstattung',
+            t3: 'Verifizierung',
+            t4: 'Stornierung',
+            t5: 'Kartengebühren (Monats-, Jahresgebühren, ATM-Abhebungsgebühren....)',
+            t6: 'Ausgangsüberweisung',
+            t7: 'Abrechnungsanpassung',
+            t8: 'Kontostandsabfrage',
+            t9: 'Gebühr',
+            t10: 'Ausgabe',
+            t11: 'Ausgabe fehlgeschlagen',
+            t12: 'Rückerstattung',
+            t13: 'Stornierung',
+            t14: 'Andere',
+            t15: 'Kartenbindungsprüfung',
+            t16: 'Verwaltungsgebühr',
+            t17: 'Abrechnung',
+            t18: 'Erfolgreich',
+            t19: 'Korrektur',
+            t20: 'Rückgängig gemacht',
+            t21: 'Storniert',
+            t22: 'Stornierung',
+            t23: 'Rückgabe',
+            t24: 'Autorisiert',
+            t25: 'Fehlgeschlagen',
+            t26: 'Rückgabe',
+        },
+        New1: {
+            title: 'Vervollständigen Sie die Informationen',
+            f1: 'Ihr ID-Foto wurde erfolgreich hochgeladen, bitte warten Sie auf das Prüfergebnis!',
+            f2: 'Upload erfolgreich',
+            f3: 'Scannen Sie den QR-Code, um Ihr ID-Foto hochzuladen',
+            f4: 'Möchten Sie das ID-Foto manuell hochladen?',
+            d1: 'Laden Sie das Foto der Vorderseite Ihres Ausweises hoch',
+            d2: 'Laden Sie das Foto der Rückseite Ihres Ausweises hoch',
+            d3: 'Laden Sie ein Foto von Ihnen mit Ihrem Ausweis hoch',
+            d4: 'Klicken Sie, um eine Datei auszuwählen',
+            d5: 'Upload erfolgreich',
+            d6: 'Upload fehlgeschlagen',
+            d7: 'Wird hochgeladen...',
+            d8: 'Versandland',
+            d9: 'Versandstadt',
+            d10: 'Versandadresse',
+            d11: 'Versandadresse in Englisch',
+            d12: 'Postleitzahl des Versands',
+            d13: 'Versandtelefonnummer',
+            d14: 'Die Datei darf 2 MB nicht überschreiten',
+            titel1: 'Spracheinstellungen',
+        },
     },
-    wallet: {
-        title: '我的钱包',
-        balance: '余额',
-        transactions: '交易记录',
-    },
-    cards: {
-        title: '我的卡片',
-        balance: '余额',
-        transactions: '交易记录',
-        cardNo: '卡号',
-        recharge: '卡片充值',
-        findPassword: '找回密码',
-        freezeCard: '冻结卡片',
-        unfreezeCard: '解冻卡片',
-        selectCard: '选择卡片',
-        currency: '币种',
-        amount: '金额',
-        selectDateRange: '选择日期',
-        selectDate: '选择日期1',
-        start: '开始',
-        end: '结束'
-    },
-    finance: {
-        title: '金融',
-    },
-    mine: {
-        title: '我的',
-        logout: '确认退出登录吗?',
-    },
-    language: {
-        title: '语言设置',
-        selectLang: '选择语言',
-        cn: '中文简体',
-        zh: '中文繁体',
+    'language': {
+        title: 'Spracheinstellungen',
+        selectLang: 'Select Language',
+        cn: '简体中文',
+        zh: '繁體中文',
         en: 'English',
-        de: 'German',
-        es: 'Spanish',
-        ar: 'Arabic',
+        de: 'Deutsch',
+        es: 'Español',
+        ar: 'العربية',
         id: 'Indonesian',
         ms: 'Malay',
-        th: 'Thai',
-        vi: 'Vietnamese',
-        i1: '语言设置',
-        i2: '设置支付密码',
-        i3: '个人信息',
-        i4: '购卡记录',
-        i5: '关于PayouCard',
-        i6: '退出登录',
-    },
-    login: {
-        title: '登录',
-        username: '用户名',
-        password: '密码',
-        rememberPassword: '记住密码',
-        forgotPassword: '忘记密码?',
-    },
-    'card-transaction-detail': {
-        title: '交易详情',
-        currency: '币种',
-        amount: '交易金额',
-        type: '交易类型',
-        consume: '消费',
-        desc: '交易描述',
-        status: '订单状态',
-        time: '时间',
-    },
-    'pay-password': {
-        title: '支付密码',
-        change: '修改支付密码',
-        forget: '忘记支付密码',
-    },
-    'change-pay-password': {
-        title: '修改支付密码',
-        desc: '向您手机157***1673发送验证码',
-        input: '请输入验证码',
-        getCode: '获取验证码',
-        nextStep: '下一步',
-    },
-    'forget-pay-password': {
-        title: '忘记支付密码',
-        desc: '向您手机157***1673发送验证码',
-        input: '请输入验证码',
-        getCode: '获取验证码',
-        nextStep: '下一步',
-    },
-    'find-password': {
-        title: '找回密码',
-        desc: '请上传签名照片',
-        input: '请输入验证码',
-        getCode: '获取验证码',
-        nextStep: '下一步',
-    },
-    'freeze-card': {
-        title: '冻结卡片',
-        desc: '请上传签名照片',
-        tip: '支持PNG、JPG格式。',
-        nextStep: '确定',
-        formatError: '仅支持PNG、JPG格式',
-        needUpload: '请上传签名照片',
-        submitted: '已提交'
-    },
-    'card-recharge': {
-        title: '卡片充值',
-        currency: '币种',
-        cardNo: '卡号',
-        cardNoPlaceholder: '请输入卡号',
-        amount: '金额',
-        amountPlaceholder: '请输入金额,最低金额10',
-        walletBalance: '钱包余额',
-        all: '全部',
-        recharge: '充值',
-        fee: '手续费',
-        records: '充值记录',
-        walletPay: '钱包支付',
-        rechargeSuccess: '充值成功',
-        rechargePending: '充值中',
-        rechargeFailed: '充值失败',
-    },
-    'activate-card': {
-        title: '卡片激活',
-        desc: '请输入您的卡片信息进行激活',
-        cardNo: '卡号',
-        cardNoPlaceholder: '请输入卡号',
-        expireDate: '有效期',
-        expireDatePlaceholder: '请输入有效期',
-        cvv: 'CVV',
-        cvvPlaceholder: '请输入CVV',
-        password: '交易密码',
-        passwordPlaceholder: '请输入交易密码',
-        activate: '立即激活',
-    },
-    'select-card': {
-        title: '提交',
-        selectCard: '选择你的卡片',
-        desc: '我们为全球各地用户提供不同的卡片选择,包括实体卡和虚拟卡。',
-        physicalCard: '实体卡',
-        price: '价格:',
-        kycRequire: 'KYC认证:',
-        kycRequiredDesc: '需要',
-        kycRequiredDesc2: '不需要',
-        rechargeFee: '充值费用:',
-        atmFee: 'ATM取现:',
-        atmFeeDesc: 'Free in Europe (other 2%)',
-        atmFeeDesc2: 'Free in Europe (other 2%)',
-        spendFee: '消费手续费:',
-        annualFee: '年费:',
-        annualFeeDesc: 'Free',
-        usageArea: '使用地区:',
-        free: '免费',
-        submit: '提交',
-        masterCard: 'MasterCard 实体卡',
-        visaVirtualCard: 'Visa 虚拟卡(至珍卡)',
-        visaPhysicalCard: 'Visa 实体卡',
-        visaVirtualCard2: 'Visa 虚拟卡(畅游卡)',
-        masterCardDesc: '该卡支持全球线上和线下消费,ATM机取现;支持绑定PayPal/微信/支付宝等场景。',
-        visaVirtualCardDesc: '支持Apple Pay,Google Pay,微信,支付宝场景使用,无单笔消费限额,支持超大额消费。(卡片激活预计1-72小时完成)。',
-        visaPhysicalCardDesc: '该卡片能力强,支持和覆盖全球全平台的线上线下消费,ATM取现等功能(卡片激活时间预计需要48小时)。',
-        visaVirtualCard2Desc: '该卡片支持和覆盖全球全平台的线上消费功能。最擅长商户: Apple,Facebook,Walmart,PAYPAL',
-        status: '状态',
-        statusDesc: '可用',
-        statusDesc2: '不可用',
-        currency: '币种',
-        needPhotoForActiveCard: '激活卡片时是否需要手持护照和银行卡照片',
-        needPhotoForActiveCardDesc: '需要',
-        needPhotoForActiveCardDesc2: '不需要',
-        needPhotoForOperateCard: '冻结、解冻和找回密码时是否需要提供用户签名照',
-        needPhotoForOperateCardDesc: '需要',
-        needPhotoForOperateCardDesc2: '不需要',
-    },
-    kyc: {
-        title: 'KYC认证',
-        desc: '请填写您的身份信息以完成认证',
-        type: '证件类型',
-        i1: 'EEA文件证照',
-        i2: '手持照片',
-        data: '证件照片',
-        firstName: '名',
-        lastName: '姓',
-        address: '邮寄地址',
-        email: '邮箱',
-        phone: '手机号',
-        phoneCode: '区号',
-        postalCode: '邮政编码',
-        submit: '提交',
-        kycSuccess: '身份认证成功',
-        kycFail: '身份认证失败',
-        step1: '身份认证',
-        step2: '支付',
-        step3: '邮寄',
-        step1Desc: '请填写您的身份信息以完成认证',
-        step2Desc: '请填写您的支付信息以完成支付',
-        step3Desc: '请填写您的邮寄信息以完成邮寄',
-        step4Desc: '请填写您的支付信息以完成支付',
-        kycFailDesc: '请填写完整的身份认证信息',
-        emailError: '请输入正确的邮箱格式',
-        phoneError: '请输入正确的手机号格式',
-        postalCodeError: '请输入正确的邮政编码格式',
-        amountError: '请输入正确的金额',
-        currencyError: '请选择正确的币种',
-        shippingAddressError: '请输入正确的邮寄地址',
-        amount: '金额',
-        currency: '币种',
-        shippingAddress: '邮寄地址',
-        next: '下一步',
-        submitKyc: '提交认证',
-        country: '选择区号',
-        status: '状态',
-        statusDesc: '不存在',
-        statusDesc2: '审核中',
-        statusDesc3: '认证成功',
-        statusDesc4: '拒绝',
-
-    },
-    'eur-remit': {
-        title: '全球速汇',
-        available: '可速汇余额:',
-        country: '国家和地区',
-        currency: '币种',
-        amount: '金额',
-        amountPlaceholder: '请输入欧元金额,最低金额100',
-        note: '附言',
-        notePlaceholder: '请输入Note(附言码)',
-        select: '请选择',
-        next: '下一步',
-        "item1":"收款银行:",
-        "item2":"交易货币:",
-        "item3":"目标货币代码:",
-        "item4":"目标国家代码:",
-        "item5":"汇率:",
-        "item6":"基本信息",
-        "item7":"收款银行ID:",
-        "item8":"用户唯一ID:",
-        "item9":"速汇金额:",
-        "item10":"附言:",
-        "item11":"收付款人关系:",
-        "item12":"兄弟",
-        "item13":"姐夫/妹夫",
-        "item14":"堂/表兄弟姐妹",
-        "item15":"女儿",
-        "item16":"父亲",
-        "item17":"岳父/公公",
-        "item18":"朋友",
-        "item19":"祖父",
-        "item20":"祖母",
-        "item21":"丈夫",
-        "item22":"母亲",
-        "item23":"岳母/婆婆",
-        "item24":"侄子/外甥",
-        "item25":"侄女/外甥女",
-        "item26":"本人",
-        "item27":"姐妹",
-        "item28":"兄嫂/弟妹",
-        "item29":"儿子",
-        "item30":"叔伯/舅姑",
-        "item31":"妻子",
-        "item32":"其他",
-        "item33":"资金来源:",
-        "item34":"现金",
-        "item35":"商业",
-        "item36":"礼物",
-        "item37":"工资",
-        "item38":"彩票",
-        "item39":"储蓄",
-        "item40":"其他",
-        "item41":"付款目的:",
-        "item42":"购买货物或服务",
-        "item43":"运费和运输成本",
-        "item44":"教育费用",
-        "item45":"移民投资",
-        "item46":"慈善捐赠",
-        "item47":"家庭支持",
-        "item48":"股息或利息支付",
-        "item49":"国际贸易",
-        "item50":"付款人信息",
-        "item51":"付款人类型:",
-        "item52":"个人",
-        "item53":"付款人姓:",
-        "item54":"付款人名:",
-        "item55":"付款人证件号码:",
-        "item56":"付款人证件类型:",
-        "item57":"护照",
-        "item58":"身份证",
-        "item59":"证件颁发国家:",
-        "item60":"请选择证件颁发国家",
-        "item61":"出生日期:",
-        "item62":"国籍:",
-        "item63":"请选择国籍",
-        "item64":"手机号码:",
-        "item65":"居住国家:",
-        "item66":"请选择居住国家",
-        "item67":"居住城市代码:",
-        "item68":"请选择居住城市",
-        "item69":"地址:",
-        "item70":"邮编:",
-        "item71":"职业:",
-        "item72":"校验付款人",
-        "item73":"收款人信息",
-        "item74":"收款人银行ID:",
-        "item75":"收款人账号:",
-        "item76":"收款人户名:",
-        "item77":"收款人居住国家:",
-        "item78":"请选择收款人居住国家",
-        "item79":"收款人居住城市:",
-        "item80":"请选择收款人居住城市",
-        "item81":"收款人地址:",
-        "item82":"收款人邮编:",
-        "item83":"收款人姓:",
-        "item84":"收款人名:",
-        "item85":"收款人银行编码:",
-        "item86":"收款人国籍:",
-        "item87":"请选择收款人国籍",
-        "item88":"收款人证件类型:",
-        "item89":"护照",
-        "item90":"身份证",
-        "item91":"收款人证件号码:",
-        "item92":"证件有效期:",
-        "item93":"出生日期:",
-        "item94":"手机区号:",
-        "item95":"请选择区号",
-        "item96":"手机号码:",
-        "item97":"银行账户类型:",
-        "item98":"支票账户",
-        "item99":"储蓄账户",
-        "item100":"定期存款账户",
-        "item101":"其它账户",
-        "item102":"校验收款人",
-        "item103":"校验付款人",
-        "item104":"确认信息",
-        "item105":"提交代付",
-        "item106":"订单号:",
-        "item107":"商户原始订单号:",
-        "item108":"支付状态:",
-        text1: '提交调单信息或文件',
-        text2: '订单号:',
-        text3: '请输入PayouCard订单号',
-        text4: '(PayouCard订单号,必填)',
-        text5: '订单信息',
-        text6: '请提供订单相关信息',
-        text7: '请选择信息类型',
-        text8: '信息类型:',
-        text9: '请选择信息类型',
-        text10: '请输入信息内容',
-        text11: '信息内容:',
-        text12: '请输入信息内容',
-        text13: '(不支持中文字符,最多200个字符)',
-        text14: '添加订单信息',
-        text15: '订单文件',
-        text16: '请提供订单相关文件',
-        text17: '请选择文件类型',
-        text18: '文件类型:',
-        text19: '请选择文件类型',
-        text20: '请上传文件',
-        text21: '文件:',
-        text22: '选择文件',
-        text23: '删除',
-        text24: '(每个文件不能超过2M,只支持图片格式',
-        ms: '最低金额100EUR,最多2位小数',
-        ms3: '请输入银行ID',
-        ms4: '请输入用户唯一ID',
-        ms5: '请输入商户订单号',
-        ms6: '请输入速汇金额',
-        ms7: '请输入附言',
-        ms8: '长度在5到64个字符之间',
-        ms9: '请输入付款人姓',
-        ms10: '长度在2到50个字符之间',
-        ms10_1: '请输入付款人名',
-        ms11: '请输入付款人证件号码',
-        ms12: '长度在6到18个字符之间',
-        ms13: '请选择付款人证件类型',
-        ms14: '请输入证件颁发国家',
-        ms15: '2位国家代码',
-        ms16: '请选择出生日期',
-        ms17: '请输入国籍',
-        ms18: '请输入手机号码',
-        ms19: '例如:+37012345678,长度在8到15个字符之间',
-        ms20: '请输入居住国家',
-        ms21: '2位国家代码',
-        ms22: '请输入居住城市代码',
-        ms23: '请输入地址',
-        ms24: '长度在10到100个字符之间',
-        ms25: '请输入邮编',
-        ms26: '长度在3到9个字符之间',
-        ms27: '请输入职业',
-        ms28: '长度在3到20个字符之间',
-        ms29: '请输入收款人账号',
-        ms30: '长度在2到48个字符之间',
-        ms31: '请输入收款人户名',
-        ms32: '长度在1到100个字符之间',
-        ms33: '长度在2到60个字符之间',
-        ms34: '长度在2到60个字符之间',
-        ms35: '请输入银行ID',
-        ms36: '请输入收款人账号',
-        ms37: '长度在2到48个字符之间',
-        ms38: '请输入收款人户名',
-        ms39: '长度在1到100个字符之间',
-        ms40: '请输入订单号',
-        ms41: '收款人ID',
-        ms42: '收款人电话',
-        ms43: '收款人银行',
-        ms44: '收款人开户行',
-        ms45: '收款人开户行',
-        ms46: '收款人地址',
-        ms47: '收款人出生日期',
-        ms48: '支付证明',
-        ms49: '银行流水',
-        ms50: '交易合同',
-        ms51: '交易发票',
-        ms52: '订单截图',
-        ms53: '身份证明',
-        ms54: '文件上传成功',
-        ms55: '文件上传失败',
-        ms56: '只能上传JPG/PNG格式的图片!',
-        ms57: '图片大小不能超过2MB',
-        ms58: '请完善表单信息',
-        ms59: '至少需要提供一项订单信息或文件',
-        ms60: '调单信息提交成功',
-        ms61: '提交失败',
-        ms62: '未知错误',
-        ms63: '上传失败',
-        ms64: '查询法币汇率失败',
-        ms65: '查询失败',
-        ms66: '支持银行:',
-        ms67: '最低金额100EUR',
-        ms68: '不支持中文字符',
-        ms69: '字符长度为',
-        ms70: '只支持英文',
-        ms71: '获取区号失败',
-        ms72: '收款人校验通过',
-        ms73: '付款人校验通过',
-        ms74: '整体校验通过',
-        ms75: '代付校验通过',
-        prev: '上一步',
-        submit: '提交',
-        mobileFormat: '请输入正确的手机号格式',
-        mobileCodeFormat: '请输入正确的区号格式',
-        postalCodeFormat: '请输入正确的邮政编码格式',
-        amountFormat: '请输入正确的金额格式',
-        currencyFormat: '请选择正确的币种',
-        shippingAddressFormat: '请输入正确的邮寄地址',
-        amountError: '请输入正确的金额',
-        currencyError: '请选择正确的币种',
-        shippingAddressError: '请输入正确的邮寄地址',
-        required:'',
-        requiredFieldsMissing:'请填写完整信息',
-        item95_1:'',
-        item95_2:'',
-        orderNo:'订单号',
-        paymentSuccess:'支付成功',
-        paymentFailed:'支付失败',
-        paymentError:'支付失败',
-        validateError:'校验失败',
-        validateFailed:'校验失败',
-        validateSuccess:'校验成功',
-        search:'搜索选项',
-    },
-    eur: {
-        title: 'EUR',
-        globalRemit: '全球速汇',
-        transactionRecord: '速汇记录',
-        eurTopup: 'eur充值'
-
-    },
-    'remit-success':{
-        title:'支付成功',
-        orderNo:'订单号',
-        paymentSuccess:'支付成功',
-        paymentFailed:'支付失败',
-        paymentError:'支付失败',
-        validateError:'校验失败',
-        validateFailed:'校验失败',
-        validateSuccess:'校验成功',
-        successTitle:'支付成功',
-        viewDetail:'查看详情',
-        backToHome:'返回首页',
-    },
-    'transfer-detail': {
-        title: '交易详情',
-        step1: '速汇申请',
-        step2: '处理中',
-        step3: '已成功',
-        amount: '金额',
-        currency: '币种',
-        status: '订单状态',
-        withdrawn: '已速汇',
-        time: '时间',
-        relationship: '收付款人关系',
-        relationship1: '兄弟',
-        relationship2: '姐夫/妹夫',
-        relationship3: '堂/表兄弟姐妹',
-        relationship4: '女儿',
-        relationship5: '父亲',
-        relationship6: '岳父/公公',
-        sourceFunds: '资金来源',
-        sourceFunds1: '现金',
-        sourceFunds2: '商业',
-        sourceFunds3: '礼物',
-        sourceFunds4: '工资',
-        sourceFunds5: '彩票',
-        sourceFunds6: '储蓄',
-        orderNo: '订单号',
-        mobile: '手机号码',
-        email: '邮箱',
-        country: '居住国家',
-        city: '居住城市',
-        address: '居住地址',
-        postalCode: '邮政编码',
-        occupation: '职业',
-        accountName: '收款人户名',
-        accountNumber: '收款人账号',
-        B1: '待处理',
-        B2: '支付中',
-        B3: '支付成功',
-        B4: '支付失败',
-        B6: '退款',
-        B11: '调单_待提交',
-        B12: '调单_待审核',
-        B13: '调单_审核通过',
-        B15: '调单_审核拒绝',
-        addTime: '创建时间',
-        postscript: '附言',
-        payPurpose: '付款目的',
-        name: '姓名',
-    },
-    remit: {
-        title: 'USDT',
-        available: 'USDT余额',
-        amount: 'USDT金额',
-        amountPlaceholder: '请输入USDT金额',
-        currency: 'USDT',
-        buy: '购买',
-        sell: '卖出',
-        recharge: '充值',
-        withdraw: '提现',
-        record: '交易记录',
-        item1: '购买',
-        item2: '卖出',
-        item3: '链上充值',
-        item4: '链上提现',
-    },
-    'reset-password': {
-        title: '重置密码',
-        email: '邮箱',
-        emailPlaceholder: '请输入邮箱',
-        emailError: '请输入正确的邮箱格式',
-        emailRequired: '请输入邮箱',
-        remember: '记起密码了?',
-        login: '返回登录',
-        reset: '重置密码',
-        resetSuccess: '',
+        th: 'ไทย',
+        tr: 'Türkçe',
+        pt: 'Português',
+        ko: '한국어',
+        fa: 'فارسی',
+        vn: 'Tiếng Việt',
+        i0: 'Vertified',
+        i1: 'Spracheinstellungen',
+        i2: 'Change Password',
+        i3: 'Personal Info',
+        i4: 'Card Opening Record',
+        i5: 'About PayouCard',
+        i6: 'Logout',
     },
-    "card-activation":{
-        title:'卡片激活',
-        cardNo: '银行卡号',
-        activePhoto: '手持护照和银行卡照图片',
-        activePhotoRequired: '请上传手持护照和银行卡照图片',
-        submit:'激活',
-        submitRequired:'激活成功',
-
+    'improve-info': {
+        title: 'Vervollständigen Sie die Informationen',
+        p3: 'Please enter the information',
+        p3_1: 'Please enter your last name',
+        p3_2: 'Please enter your first name',
+        p3_3: 'Please enter your mobile number',
+        p3_4: 'Please enter the detailed address',
+        p3_5: 'Please enter your email',
+        p4: 'Area Code',
+        p5: 'Select Area Code',
+        p6: 'Mobile',
+        p7: 'Email',
+        p8: 'Last Name',
+        p9: 'First Name',
+        p10: 'Birthday',
+        p11: 'Nationality',
+        p12: 'Select Nationality',
+        p13: 'Gender',
+        p14: 'Please Select',
+        p15: 'Male',
+        p16: 'Female',
+        p17: 'Country',
+        p18: 'Select Country',
+        p19: 'City',
+        p20: 'Select City',
+        p21: 'Detailed Address',
+        p22: 'Postal Code',
+        p23: 'Document Type',
+        p24: 'Select Document Type',
+        p25: 'ID Card',
+        p26: 'Passport',
+        p27: 'Document Number',
+        p28: 'Document Expiry',
+        p28_1: 'Upload Your ',
+        p28_2: 'Click to select file',
+        p29: 'Document Photo',
+        p30: 'Face Photo',
+        p31: 'Extended Field',
+        p32: 'Cancel',
+        p33: 'Submit',
+        p34: 'DLN',
+        p35: '政府签发的身份证',
+        kycSuccess: 'Information Completed',
     },
-    "improve-info":{
-        title: '完善信息',
-        "p3": "请输入信息",
-        "p4": "区号",
-        "p5": "请选择区号",
-        "p6": "手机号",
-        "p7": "邮箱",
-        "p8": "姓",
-        "p9": "名",
-        "p10": "生日",
-        "p11": "国籍",
-        "p12": "请选择国籍",
-        "p13": "性别",
-        "p14": "请选择",
-        "p15": "男",
-        "p16": "女",
-        "p17": "国家",
-        "p18": "请选择国家",
-        "p19": "城市",
-        "p20": "请选择城市",
-        "p21": "详细地址",
-        "p22": "邮编",
-        "p23": "证件类型",
-        "p24": "请选择证件类型",
-        "p25": "身份证",
-        "p26": "护照",
-        "p27": "证件号",
-        "p28": "证件到期",
-        "p29": "证件照片",
-        "p30": "人脸照片",
-        "p31": "扩展字段",
-        "p32": "取消",
-        "p33": "提交",
-    }
 }

+ 434 - 69
src/i18n/locales/en.ts

@@ -1,5 +1,5 @@
 export default {
-    common: {
+    'common': {
         confirm: 'Confirm',
         cancel: 'Cancel',
         loading: 'Loading...',
@@ -13,22 +13,21 @@ export default {
         copy2: 'CVV copied!',
         copy3: 'Copy failed',
     },
-    tabs: {
+    'tabs': {
         wallet: 'Wallet',
         cards: 'Cards',
         finance: 'Finance',
-        mine: 'Mine'
+        mine: 'Mine',
     },
-    wallet: {
+    'wallet': {
         title: 'My Wallet',
         balance: 'Balance',
         transactions: 'Transaction History',
         p1: 'Currency Balance',
         p2: 'Balance',
         p3: 'Global Transfer',
-
     },
-    cards: {
+    'cards': {
         title: 'My Cards',
         balance: 'Balance',
         transactions: 'Transaction History',
@@ -65,43 +64,45 @@ export default {
         p19: '',
         p20: '',
         p21: '',
-        rechargeB1:'Recharge',
+        rechargeB1: 'Recharge',
         transferB2: 'Transfer',
-
-
     },
-    finance: {
-        title: 'Finance'
+    'finance': {
+        title: 'Finance',
     },
-    mine: {
+    'mine': {
         title: 'Mine',
         logout: 'Logout',
         p: 'Are you sure you want to log out?',
         b1: 'Yes, Logout',
         b2: 'Cancel',
     },
-    language: {
+    'language': {
         title: 'Language Settings',
         selectLang: 'Select Language',
-        cn: '中文简体',
-        zh: '中文繁体',
+        cn: '简体中文',
+        zh: '繁體中文',
         en: 'English',
-        de: 'German',
-        es: 'Spanish',
-        ar: 'Arabic',
+        de: 'Deutsch',
+        es: 'Español',
+        ar: 'العربية',
         id: 'Indonesian',
         ms: 'Malay',
-        th: 'Thai',
-        vi: 'Vietnamese',
+        th: 'ไทย',
+        tr: 'Türkçe',
+        pt: 'Português',
+        ko: '한국어',
+        fa: 'فارسی',
+        vn: 'Tiếng Việt',
         i0: 'Vertified',
         i1: 'Language Settings',
         i2: 'Change Password',
         i3: 'Personal Info',
         i4: 'Card Opening Record',
         i5: 'About PayouCard',
-        i6: 'Logout'
+        i6: 'Logout',
     },
-    login: {
+    'login': {
         title: 'Login',
         username: 'Username',
         password: 'Password',
@@ -131,7 +132,7 @@ export default {
         consume: 'Expense',
         desc: 'Description',
         status: 'Status',
-        time: 'Time'
+        time: 'Time',
     },
     'pay-password': {
         title: 'Change Password',
@@ -142,7 +143,7 @@ export default {
         nextStep: 'Submit',
         success: 'Setup Success',
         error: 'Setup Failed',
-        p1: 'It cannot be larger than 2M and supports the formats .png, .jpeg, and .jpg.'
+        p1: 'It cannot be larger than 2M and supports the formats .png, .jpeg, and .jpg.',
     },
     'freeze-card': {
         title: 'Freeze Card',
@@ -151,7 +152,7 @@ export default {
         nextStep: 'Confirm',
         formatError: 'Only PNG or JPG formats supported',
         needUpload: 'Please upload signature photo',
-        submitted: 'Submitted'
+        submitted: 'Submitted',
     },
     'card-recharge': {
         title: 'Card Recharge',
@@ -173,7 +174,7 @@ export default {
         tips1: 'Your top-up order has been submitted',
         tips2: 'Once the funds are received, the system will automatically process your top-up.',
         tips3: 'Close',
-        maxAmountTip: 'The maximum rechargeable amount is {max}'
+        maxAmountTip: 'The maximum rechargeable amount is {max}',
     },
     'activate-card': {
         title: 'Activate Card',
@@ -186,7 +187,7 @@ export default {
         cvvPlaceholder: 'Enter CVV',
         password: 'Transaction Password',
         passwordPlaceholder: 'Enter Transaction Password',
-        activate: 'Activate Now'
+        activate: 'Activate Now',
     },
     'select-card': {
         title: 'Pick a card',
@@ -224,9 +225,9 @@ export default {
         needPhotoForActiveCardDesc2: 'Not Required',
         needPhotoForOperateCard: 'Do freeze/unfreeze and password reset require signature photo?',
         needPhotoForOperateCardDesc: 'Required',
-        needPhotoForOperateCardDesc2: 'Not Required'
+        needPhotoForOperateCardDesc2: 'Not Required',
     },
-    kyc: {
+    'kyc': {
         title: 'KYC Verification',
         desc: 'Please fill in your identity information to complete verification',
         type: 'Document Type',
@@ -289,7 +290,7 @@ export default {
         item7: 'Beneficiary Bank ID',
         item8: 'User Unique ID',
         item9: 'Remittance Amount (Fee rate:{feeRate1}%)',
-        "item9_1": "Fee: { allFee } USD ({ feeRate2 } variable + { feeAmount1 } fixed)",
+        item9_1: 'Fee: { allFee } USD ({ feeRate2 } variable + { feeAmount1 } fixed)',
         maxAmountTip: 'The maximum amount that can be quickly remitted is {max}',
         item10: 'Note (English)',
         item11: 'Beneficiary Relationship',
@@ -448,22 +449,22 @@ export default {
         ms31: 'Please enter Beneficiary Name',
         ms32: 'Length between 1 and 100 characters',
         ms33: 'Please enter the beneficiary postal code',
-ms34: 'Length must be between 3 and 9 characters',
-ms35: 'Please enter the beneficiary’s last name',
-ms36: 'Please enter the beneficiary’s first name',
-ms37: 'Chinese characters are not supported, length must be between 2 and 50 characters',
-ms38: 'Length must be between 1 and 50 characters',
-ms39: 'Please select the beneficiary’s ID type',
-ms40: 'Please enter the beneficiary’s ID number',
-ms41: 'Length must be between 6 and 18 characters',
-ms42: 'Please select the validity period of the beneficiary’s ID',
-ms43: 'Please select the payee’s date of birth',
-ms44: 'Please select the beneficiary’s mobile area code',
-ms45: 'Please enter the beneficiary’s mobile number',
-ms46: 'Length must be between 5 and 15 characters',
-ms47: 'Please select the beneficiary’s bank account type',
-ms48: 'Please enter the beneficiary’s bank code',
-ms49: 'Length must be between 6 and 12 characters',
+        ms34: 'Length must be between 3 and 9 characters',
+        ms35: 'Please enter the beneficiary’s last name',
+        ms36: 'Please enter the beneficiary’s first name',
+        ms37: 'Chinese characters are not supported, length must be between 2 and 50 characters',
+        ms38: 'Length must be between 1 and 50 characters',
+        ms39: 'Please select the beneficiary’s ID type',
+        ms40: 'Please enter the beneficiary’s ID number',
+        ms41: 'Length must be between 6 and 18 characters',
+        ms42: 'Please select the validity period of the beneficiary’s ID',
+        ms43: 'Please select the payee’s date of birth',
+        ms44: 'Please select the beneficiary’s mobile area code',
+        ms45: 'Please enter the beneficiary’s mobile number',
+        ms46: 'Length must be between 5 and 15 characters',
+        ms47: 'Please select the beneficiary’s bank account type',
+        ms48: 'Please enter the beneficiary’s bank code',
+        ms49: 'Length must be between 6 and 12 characters',
 
         ms50: 'Transaction Contract',
         ms51: 'Transaction Invoice',
@@ -500,7 +501,7 @@ ms49: 'Length must be between 6 and 12 characters',
         amountError: 'Please enter a valid amount',
         currencyError: 'Please select a valid currency',
         shippingAddressError: 'Please enter a valid address',
-        requiredFieldsMissing:'',
+        requiredFieldsMissing: '',
         paymentSuccess: 'Payment successful',
         paymentFailed: 'Payment failed',
         paymentError: 'Payment failed',
@@ -509,12 +510,15 @@ ms49: 'Length must be between 6 and 12 characters',
         validateSuccess: 'Validation successful',
         search: 'Search Options',
     },
-    eur: {
+    'eur': {
         title: 'EUR',
         globalRemit: 'Global Remittance',
         transactionRecord: 'Remittance Records',
         eurTopup: 'EUR Top-up',
-        p1: 'Transfer Details', p2: 'Payer Info', p3: 'Payee Info', p4: 'Confirmation',
+        p1: 'Transfer Details',
+        p2: 'Payer Info',
+        p3: 'Payee Info',
+        p4: 'Confirmation',
         p5: 'Supported ',
         p6: ' Banks',
         p7: 'wait',
@@ -532,7 +536,7 @@ ms49: 'Length must be between 6 and 12 characters',
         validateSuccess: 'Validation Successful',
         successTitle: 'Payment Successful',
         viewDetail: 'View Details',
-        backToHome: 'Back to Home'
+        backToHome: 'Back to Home',
     },
     'transfer-detail': {
         title: 'Transaction Details',
@@ -580,9 +584,9 @@ ms49: 'Length must be between 6 and 12 characters',
         addTime: 'Created Time',
         postscript: 'Note',
         payPurpose: 'Payment Purpose',
-        name: 'Name'
+        name: 'Name',
     },
-    remit: {
+    'remit': {
         title: 'USDT',
         available: 'USDT Balance',
         amount: 'USDT Amount',
@@ -596,7 +600,7 @@ ms49: 'Length must be between 6 and 12 characters',
         item1: 'Buy',
         item2: 'Sell',
         item3: 'On‑chain Deposit',
-        item4: 'On‑chain Withdrawal'
+        item4: 'On‑chain Withdrawal',
     },
     'reset-password': {
         title: 'Reset Password',
@@ -607,7 +611,7 @@ ms49: 'Length must be between 6 and 12 characters',
         remember: 'Remember password?',
         login: 'Back to Login',
         reset: 'Reset Password',
-        resetSuccess: ''
+        resetSuccess: '',
     },
     'card-activation': {
         title: 'Card Activation',
@@ -615,16 +619,16 @@ ms49: 'Length must be between 6 and 12 characters',
         activePhoto: 'Photo with Passport & Bank Card',
         activePhotoRequired: 'Please upload a photo holding your passport and card',
         submit: 'Activate',
-        submitRequired: 'Activation Successful'
+        submitRequired: 'Activation Successful',
     },
     'improve-info': {
         title: 'Complete Information',
-        "p3": "Please enter the information",
-        "p3_1": "Please enter your last name",
-        "p3_2": "Please enter your first name",
-        "p3_3": "Please enter your mobile number",
-        "p3_4": "Please enter the detailed address",
-        "p3_5": "Please enter your email",
+        p3: 'Please enter the information',
+        p3_1: 'Please enter your last name',
+        p3_2: 'Please enter your first name',
+        p3_3: 'Please enter your mobile number',
+        p3_4: 'Please enter the detailed address',
+        p3_5: 'Please enter your email',
         p4: 'Area Code',
         p5: 'Select Area Code',
         p6: 'Mobile',
@@ -650,17 +654,19 @@ ms49: 'Length must be between 6 and 12 characters',
         p26: 'Passport',
         p27: 'Document Number',
         p28: 'Document Expiry',
-        p28_1: "Upload Your ",
-        p28_2: "Click to select file",
+        p28_1: 'Upload Your ',
+        p28_2: 'Click to select file',
         p29: 'Document Photo',
         p30: 'Face Photo',
         p31: 'Extended Field',
         p32: 'Cancel',
         p33: 'Submit',
-        kycSuccess: 'Information Completed'
+        p34: 'DLN',
+        p35: '政府签发的身份证',
+        kycSuccess: 'Information Completed',
     },
     'apply-record': {
-        title: 'Card Opening Record'
+        title: 'Card Opening Record',
     },
     'apply-record-detail': {
         title: 'Card opening details',
@@ -674,7 +680,7 @@ ms49: 'Length must be between 6 and 12 characters',
         p8: 'Processing',
     },
     'recharge-record-list': {
-        title: 'Recharge Record'
+        title: 'Recharge Record',
     },
     'recharge-record-detail': {
         title: 'Recharge Detail',
@@ -690,7 +696,7 @@ ms49: 'Length must be between 6 and 12 characters',
         p10: 'Recharge Method',
         p11: 'Wallet Recharge',
         p12: 'Recharge Time',
-        b1: 'Go Back'
+        b1: 'Go Back',
     },
     'empty-state': {
         t1: 'No transactions just yet',
@@ -701,6 +707,365 @@ ms49: 'Length must be between 6 and 12 characters',
         c3: 'Please apply for a bank card first.',
         t4: '',
         c4: '',
-    }
-
+    },
+    'card': {
+        title: 'CWG Card',
+        tab1: 'Deposit Record',
+        tab2: 'Transaction Record',
+        tab3: 'Personal Information',
+        tab4: 'Change Password',
+        tab5: 'CWG Card',
+        tab6: 'Complete Information',
+        tab7: 'Deposit Record',
+        tab8: 'Transaction Record',
+        tab9: 'Apply for Card',
+        tab10: 'Activate',
+        tab11: 'Card Deposit',
+        tab12: 'Change Password',
+        tab13: 'Freeze Account',
+        tab14: 'Unfreeze Account',
+        tab15: 'Card Application Record',
+        tab16: 'Card Progress',
+        tab17: 'Wallet Balance Record',
+        tab18: 'Select Card',
+        tab19: 'Confirm Information',
+        Status: {
+            t1: 'Success',
+            t2: 'Failure',
+            t3: 'Processing',
+            t4: 'Authorized',
+            t5: 'Pending',
+            t6: 'Card Created Successfully',
+            t7: 'Card Creation Failed',
+            t8: 'Deduction Successful',
+            t9: 'Deduction Failed',
+            t10: 'Refund Successful',
+            t11: 'Refund Failed',
+            t12: 'Refund Processing',
+            t13: 'Pending Review',
+            t14: 'Review Approved',
+            t15: 'Review Rejected',
+            t16: 'Withdrawal',
+            t17: 'Deposit',
+            t18: 'Refund',
+            t19: 'Manual Transfer In',
+            t20: 'Manual Transfer Out',
+            t21: 'All',
+            v1: 'Registration Information',
+            v2: 'Modify Information',
+            v3: 'Get Face Verification Link',
+            v4: 'Manual KYC Review',
+            v5: 'Card Application',
+            v6: 'Card Approval',
+            v7: 'Get Activation Code',
+            v8: 'Activate Card',
+            v9: 'Default Recharge Amount',
+            v10: 'Withdraw to Wallet',
+            v11: 'Deposit to Wallet',
+            v12: 'Card Recharge Application',
+            v13: 'Recharge Approval',
+            v14: 'Freeze',
+            v15: 'Unfreeze',
+            v16: 'Change Password',
+            v17: 'Operator CID Account',
+        },
+        Msg: {
+            m1: 'Your card application has been submitted, and you will be notified via email after approval!',
+            m2: 'Your deposit application has been submitted, and it is expected to be credited within 1-3 business days after approval!',
+            m3: 'Your bank card activation information has been submitted.',
+            m4: 'Your bank card has been successfully frozen!',
+            m5: 'Your bank card has been successfully unfrozen!',
+            m6: 'Your bank card password has been successfully changed!',
+            m7: 'Deposit Successful',
+            m8: 'Copy Successful!',
+            m9: 'Copy Failed!',
+            m10: 'Your bank card has been frozen, please activate it before proceeding!',
+            m11: 'No card type available for application',
+            m12: 'You currently do not have access, please contact the administrator!',
+            m13: 'Delete Prompt',
+            m14: 'Are you sure you want to delete this rule?',
+            m15: 'Update Successful',
+            m16: 'Front ID photo uploaded successfully',
+            m17: 'Back ID photo uploaded successfully',
+            m18: 'Handheld ID photo uploaded successfully',
+            m19: 'The uploaded profile image size cannot exceed 2MB!',
+            m20: 'The uploaded profile image must be in JPG/PNG format!',
+        },
+        Info: {
+            s0: 'Occupation and Finance (Optional)',
+            s0_1: 'Occupation and Finance',
+            s1: 'Personal Information',
+            s2: 'Identity Verification',
+            s3: 'Review',
+            s4: 'Your information has been verified, and you can apply for a card on the card application page.',
+            s5: 'Our team will review your application and KYC documents. After approval, you will receive a confirmation email.',
+            s6: 'Under Review',
+            s7: 'Verified',
+            s8: 'Cardholder',
+            s9: 'Expiration Date',
+            s10: 'Apply for Card',
+            s11: 'Please follow the steps to apply for a card.',
+            s12: 'Application Process',
+            s13: 'Select Card:',
+            s14: 'Please choose the card type you need.',
+            s15: 'Confirm Information:',
+            s16: 'Please confirm your information.',
+            s17: 'Application Review:',
+            s18: 'Our team will review your application, and after approval, you will receive a confirmation email.',
+            s19: 'Card Issuance:',
+            s20: 'The card will be mailed to your registered address within 5-7 business days after the review is approved.',
+            s21: 'If you have any questions or need assistance, please feel free to contact our customer service team. We wish you a pleasant experience with the card!',
+            s22: 'Receive Card:',
+            s23: 'Please ensure the envelope is intact when receiving the card.',
+            s24: 'Online Activation:',
+            s25: 'Go to the CWG Markets customer center and enter the \'Activate Card\' page, enter your card number and activation code (provided with the card).',
+            s26: 'Set PIN Code:',
+            s27: 'Follow the prompts to set your Personal Identification Number (PIN), used for ATM withdrawals and shopping payments.',
+            s28: 'Start Using:',
+            s29: 'Once activated, you can start using your Visa Debit Card for spending and withdrawals.',
+            s30: 'This card supports: Wechatpay, Alipay, Applepay, and other electronic payments, as well as domestic and international POS and ATM withdrawals.',
+            s31: 'We have received your card application. Please wait for the third party to complete the procedures for deduction. After the deduction is successful, we will immediately submit your card application!',
+            s32: 'Deduction failed, the service fee will be refunded to your account, please reapply for the card!',
+            s33: 'Deduction failed, the service fee has been refunded to your account, please reapply for the card!',
+            s34: 'Your card application service fee has been deducted successfully, we will immediately submit your card application!',
+            s35: 'Your card application was not approved, please contact the staff to resolve the issue!',
+            s36: 'Your card has been approved and will be mailed to your registered address within 5-7 business days.',
+            s37: 'Sorry, your card application was not approved, please reapply.',
+            s38: 'Your card application has been submitted for third-party review, and the card will be mailed to your registered address within 5-7 business days after approval.',
+            s39: 'Service Fee Status',
+            s40: 'Approval Status',
+            s41: 'Card Status',
+            s42: 'Our team has received your information. Please scan the QR code below to complete identity verification.',
+            s43: 'Your registration information has been successfully updated.',
+            t1: 'Pending Review',
+            t2: 'Review Approved',
+            t3: 'Review Rejected',
+            t5: 'Processing',
+            t6: 'Card Creation Successful',
+            t7: 'Card Creation Failed',
+            t8: 'Deduction Successful',
+            t9: 'Deduction Failed',
+            t10: 'Pending',
+            t11: 'Refunding',
+            t12: 'Refund Successful',
+            t13: 'Refund Failed',
+            t15: 'Status:',
+            t16: 'Card Creation in Progress (Please be patient)',
+            t17: 'Card Creation Failed (Please wait for refund and reapply)',
+            t18: 'Card Creation Successful (Please activate your card)',
+            t19: 'Card Activation in Progress (Please be patient)',
+            t20: 'Card Activation Failed (Please reactivate your card)',
+        },
+        Form: {
+            v1: 'Male',
+            v2: 'Female',
+            v3: 'Hong Kong ID Card',
+            v4: 'Passport',
+            v5: 'Driver\'s license',
+            v6: 'Government Issued ID',
+            f1: 'Area Code',
+            f2: 'Phone Number',
+            f3: 'Email',
+            f4: 'Last Name',
+            f5: 'First Name',
+            f6: 'Date of Birth',
+            f7: 'Nationality',
+            f8: 'Gender',
+            f9: 'City',
+            f10: 'Address',
+            f11: 'Postal Code',
+            f12: 'Occupation',
+            f13: 'Annual Income',
+            f14: 'Account Purpose',
+            f15: 'Expected Monthly Trading Volume',
+            f16: 'ID Type',
+            f17: 'ID Number',
+            f18: 'Social Security Number',
+            f19: 'ID Issuance Date',
+            f20: 'ID Expiry Date',
+            f21: 'Front ID Photo',
+            f22: 'Back ID Photo',
+            f23: 'Handheld ID Photo',
+            f24: 'Bank Card Number',
+            f25: 'Transaction Password',
+            f26: 'Activation Code',
+            f27: 'Remarks',
+            f28: 'Deposit Amount',
+            f29: 'Currency',
+            f30: 'Transaction Fee',
+            f31: 'Amount Received',
+            f32: 'Currency Received',
+            f33: 'Application Time',
+            f34: 'Confirm Password',
+            f35: 'Transaction Reference Number',
+            f36: 'Transaction Currency',
+            f37: 'Transaction Amount',
+            f38: 'Authorized Amount',
+            f39: 'Authorized Currency',
+            f40: 'Authorized Fee',
+            f41: 'Merchant Name',
+            f42: 'Transaction Type',
+            f43: 'Transaction Time',
+            f44: 'Cross-border Transaction Fee',
+            f45: 'Status',
+            f46: 'Transaction Description',
+            f47: 'Fee Status',
+            f48: 'Card Type',
+            f49: 'Card Name',
+            f50: 'Card Status',
+            f51: 'Time',
+            f52: 'Type',
+            f53: 'Approval Status',
+            f54: 'Deposit Status',
+            f55: 'Amount',
+            f56: 'Wallet Balance:',
+            f57: 'All',
+            f58: 'Fee Rate:',
+            f59: 'Estimated Fee:',
+        },
+        vaildate: {
+            v1: 'Please select area code',
+            v2: 'Please enter a phone number with 5-20 digits',
+            v3: 'Please enter first name, English characters only, [2...23] characters. The total length of first and last names cannot exceed 23 characters (including spaces)',
+            v4: 'Please enter last name, English characters only, [2...23] characters. The total length of first and last names cannot exceed 23 characters (including spaces)',
+            v5: 'Please select date of birth',
+            v6: 'Please select nationality',
+            v7: 'Please select city',
+            v8: 'Please enter postal code',
+            v9: 'Please select gender',
+            v10: 'Please select occupation',
+            v11: 'Please enter annual income, e.g., 200000 USD',
+            v12: 'Please enter account purpose, English only, e.g., Living Expense',
+            v13: 'Please enter expected monthly trading volume, e.g., 100000 USD',
+            v14: 'Please select ID type',
+            v15: 'Please enter ID number',
+            v16: 'Please enter 9-digit social security number',
+            v17: 'Please select ID issuance date',
+            v18: 'Please select ID expiry date',
+            v19: 'Please select front ID photo file',
+            v20: 'Please select back ID photo file',
+            v21: 'Please select handheld ID photo file',
+            v22: 'Please enter card number',
+            v23: 'Please enter a 6-digit transaction password',
+            v24: 'Please enter activation code',
+            v25: 'Please enter remarks',
+            v26: 'Please enter deposit amount',
+            v27: 'Please enter address',
+            v28: 'Please enter email',
+            v29: 'Passwords do not match',
+            v30: 'Please select handheld ID photo file',
+            v31: 'Please enter password again',
+            v32: 'Use 6 digits',
+            v33: 'Cannot use consecutive or repeated digits',
+            v34: 'Amount must be greater than 0',
+            v35: 'Deposit amount cannot exceed',
+            v36: 'Deposit amount cannot be less than',
+            v37: 'Deposit amount cannot exceed',
+            v38: 'Only English characters are allowed (spaces are included)',
+            v39: 'Length must be between 2 and 23 characters',
+            v40: 'The total length of first and last names cannot exceed 23 characters (including spaces)',
+        },
+        Btn: {
+            Next: 'Next',
+            Previous: 'Previous',
+            Submit: 'Submit',
+            Confirm: 'Confirm',
+            Cancel: 'Cancel',
+            Update: 'Update',
+            Auth: 'Authenticate',
+            Freeze: 'Freeze',
+            Unfreeze: 'Unfreeze',
+            Recharge: 'Recharge',
+            Activate: 'Activate',
+            b1: 'Activate Card',
+            b2: 'View',
+            b3: 'Recharge Application',
+            b4: 'Change Password',
+            b5: 'Freeze Card',
+            b6: 'Unfreeze Card',
+            b7: 'Apply for Card',
+            b8: 'Get Activation Code',
+            b9: 'Copy Activation Code',
+            b10: 'Balance',
+            b11: 'Check Card Application Status',
+            b12: 'Reapply for Card',
+            b13: 'Activating',
+            b14: 'Unfreezing',
+            b15: 'Freezing',
+            b16: 'Close',
+        },
+        New: {
+            n0: 'Address length 2–200 characters, only letters, numbers, hyphens and spaces allowed',
+            n1: 'Address length 2–40 characters, only letters, numbers, hyphens and spaces allowed',
+            n2: 'Postal code must be 2–15 characters',
+            n3: 'You are under 18 years old',
+            n4: 'Price:',
+            n5: 'Is the cardholder required when opening the card:',
+            n6: 'Supported top-up currencies:',
+            n7: 'Minimum top-up amount:',
+            n8: 'Minimum top-up amount:',
+            n9: 'Fee rate:',
+            n10: 'Deduction method',
+            n11: 'English Address',
+        },
+        Transactions: {
+            t1: 'Authorization',
+            t2: 'Refund',
+            t3: 'Verification',
+            t4: 'Reversal',
+            t5: 'Card Fees (Monthly, Annual, ATM Withdrawal....)',
+            t6: 'Transfer Out',
+            t7: 'Settlement Adjustment',
+            t8: 'Balance Inquiry',
+            t9: 'Fee',
+            t10: 'Purchase',
+            t11: 'Purchase Failed',
+            t12: 'Refund',
+            t13: 'Reversal',
+            t14: 'Other',
+            t15: 'Card Binding Verification',
+            t16: 'Management Fee',
+            t17: 'Settlement',
+            t18: 'Successful',
+            t19: 'Reversal Posting',
+            t20: 'Reversed',
+            t21: 'Voided',
+            t22: 'Reversal',
+            t23: 'Return',
+            t24: 'Authorized',
+            t25: 'Failed',
+            t26: 'Return',
+        },
+        New1: {
+            title: 'Complete Information',
+            f1: 'Your ID photo has been successfully uploaded, please wait for the review result!',
+            f2: 'Upload Successful',
+            f3: 'Scan the QR code to upload your ID',
+            f4: 'Do you want to manually upload the ID photo?',
+            d1: 'Upload the front photo of your ID card',
+            d2: 'Upload the back photo of your ID card',
+            d3: 'Upload a photo of you holding your ID card',
+            d4: 'Click to select a file',
+            d5: 'Upload Successful',
+            d6: 'Upload Failed',
+            d7: 'Uploading...',
+            d8: 'Mailing Country',
+            d9: 'Mailing City',
+            d10: 'Mailing Address',
+            d11: 'Mailing Address in English',
+            d12: 'Mailing Zip Code',
+            d13: 'Mailing Phone Number',
+            d14: 'File cannot exceed 2MB',
+            titel1: 'Language Settings',
+        },
+        New2: {
+            p1: 'Is Locked',
+            p2: 'Is Canceled',
+            p3: 'Cancel Card',
+            p4: 'Lock',
+            p5: 'Your card has been canceled',
+            p6: 'Your card has been locked',
+            n8: 'Maximum top-up amount:',
+        },
+    },
 }

+ 437 - 0
src/i18n/locales/es.ts

@@ -0,0 +1,437 @@
+export default {
+    'common': {
+        confirm: 'Confirm',
+        cancel: 'Cancel',
+        loading: 'Loading...',
+        success: 'Success',
+        fail: 'Failed',
+        input: 'Please input',
+        choose: 'Please choose',
+        country: 'Type a currency / country',
+        error: 'System Error',
+        copy1: 'Card number copied!',
+        copy2: 'CVV copied!',
+        copy3: 'Copy failed',
+    },
+
+    'language': {
+        title: 'Configuración de idioma',
+        selectLang: 'Select Language',
+        cn: '简体中文',
+        zh: '繁體中文',
+        en: 'English',
+        de: 'Deutsch',
+        es: 'Español',
+        ar: 'العربية',
+        id: 'Indonesian',
+        ms: 'Malay',
+        th: 'ไทย',
+        tr: 'Türkçe',
+        pt: 'Português',
+        ko: '한국어',
+        fa: 'فارسی',
+        vn: 'Tiếng Việt',
+        i0: 'Vertified',
+        i1: 'Configuración de idioma',
+        i2: 'Change Password',
+        i3: 'Personal Info',
+        i4: 'Card Opening Record',
+        i5: 'About PayouCard',
+        i6: 'Logout',
+    },
+    'improve-info': {
+        title: 'Completar Información',
+        p3: 'Please enter the information',
+        p3_1: 'Please enter your last name',
+        p3_2: 'Please enter your first name',
+        p3_3: 'Please enter your mobile number',
+        p3_4: 'Please enter the detailed address',
+        p3_5: 'Please enter your email',
+        p4: 'Area Code',
+        p5: 'Select Area Code',
+        p6: 'Mobile',
+        p7: 'Email',
+        p8: 'Last Name',
+        p9: 'First Name',
+        p10: 'Birthday',
+        p11: 'Nationality',
+        p12: 'Select Nationality',
+        p13: 'Gender',
+        p14: 'Please Select',
+        p15: 'Male',
+        p16: 'Female',
+        p17: 'Country',
+        p18: 'Select Country',
+        p19: 'City',
+        p20: 'Select City',
+        p21: 'Detailed Address',
+        p22: 'Postal Code',
+        p23: 'Document Type',
+        p24: 'Select Document Type',
+        p25: 'ID Card',
+        p26: 'Passport',
+        p27: 'Document Number',
+        p28: 'Document Expiry',
+        p28_1: 'Upload Your ',
+        p28_2: 'Click to select file',
+        p29: 'Document Photo',
+        p30: 'Face Photo',
+        p31: 'Extended Field',
+        p32: 'Cancel',
+        p33: 'Submit',
+        p34: 'DLN',
+        p35: '政府签发的身份证',
+        kycSuccess: 'Information Completed',
+    },
+    'card': {
+        title: 'Tarjeta CWG',
+        tab1: 'Registro de Depósitos',
+        tab2: 'Registro de Transacciones',
+        tab3: 'Información Personal',
+        tab4: 'Cambiar Contraseña',
+        tab5: 'Tarjeta CWG',
+        tab6: 'Información Completa',
+        tab7: 'Registro de Depósitos',
+        tab8: 'Registro de Transacciones',
+        tab9: 'Solicitar Tarjeta',
+        tab10: 'Activar',
+        tab11: 'Depósito de Tarjeta',
+        tab12: 'Cambiar Contraseña',
+        tab13: 'Congelar Cuenta',
+        tab14: 'Descongelar Cuenta',
+        tab15: 'Registro de Solicitud de Tarjeta',
+        tab16: 'Progreso de la Tarjeta',
+        tab17: 'Registro de Saldo de la Billetera',
+        tab18: 'Seleccionar Tarjeta',
+        tab19: 'Confirmar Información',
+        Status: {
+            t1: 'Éxito',
+            t2: 'Fracaso',
+            t3: 'En Proceso',
+            t4: 'Autorizado',
+            t5: 'Pendiente',
+            t6: 'Tarjeta Creada Exitosamente',
+            t7: 'Fallo en la Creación de la Tarjeta',
+            t8: 'Deducción Exitosa',
+            t9: 'Fallo en la Deducción',
+            t10: 'Reembolso Exitoso',
+            t11: 'Fallo en el Reembolso',
+            t12: 'Reembolso en Proceso',
+            t13: 'Revisión Pendiente',
+            t14: 'Revisión Aprobada',
+            t15: 'Revisión Rechazada',
+            t16: 'Retiro',
+            t17: 'Depósito',
+            t18: 'Reembolso',
+            t19: 'Transferencia Manual Entrante',
+            t20: 'Transferencia Manual Saliente',
+            t21: 'Todo',
+            v1: 'Información de registro',
+            v2: 'Modificar información',
+            v3: 'Obtener enlace de verificación facial',
+            v4: 'Revisión manual de KYC',
+            v5: 'Solicitud de tarjeta',
+            v6: 'Aprobación de tarjeta',
+            v7: 'Obtener código de activación',
+            v8: 'Activar tarjeta',
+            v9: 'Monto de recarga predeterminado',
+            v10: 'Retirar a la billetera',
+            v11: 'Depositar en la billetera',
+            v12: 'Solicitud de recarga de tarjeta',
+            v13: 'Aprobación de recarga',
+            v14: 'Congelar',
+            v15: 'Descongelar',
+            v16: 'Cambiar contraseña',
+            v17: 'Cuenta CID del operador',
+        },
+        Msg: {
+            m1: '¡Su solicitud de tarjeta ha sido enviada y será notificado por correo electrónico después de la aprobación!',
+            m2: '¡Su solicitud de depósito ha sido enviada y se espera que se abone en 1-3 días hábiles después de la aprobación!',
+            m3: '¡La información de activación de su tarjeta bancaria ha sido enviada!',
+            m4: '¡Su tarjeta bancaria ha sido congelada con éxito!',
+            m5: '¡Su tarjeta bancaria ha sido descongelada con éxito!',
+            m6: '¡La contraseña de su tarjeta bancaria ha sido cambiada con éxito!',
+            m7: 'Depósito Exitoso',
+            m8: '¡Copia Exitosa!',
+            m9: '¡Fallo en la Copia!',
+            m10: '¡Su tarjeta bancaria ha sido congelada, por favor actívela antes de continuar!',
+            m11: 'No hay tipo de tarjeta disponible para aplicar',
+            m12: 'Actualmente no tiene acceso, ¡por favor contacte al administrador!',
+            m13: 'Eliminar Aviso',
+            m14: '¿Está seguro de que desea eliminar esta regla?',
+            m15: 'Actualización Exitosa',
+            m16: 'Foto de la Parte Frontal del ID cargada con éxito',
+            m17: 'Foto de la Parte Posterior del ID cargada con éxito',
+            m18: 'Foto del ID en Mano cargada con éxito',
+            m19: '¡El tamaño de la imagen de perfil cargada no puede exceder los 2MB!',
+            m20: '¡La imagen de perfil cargada debe estar en formato JPG/PNG!',
+        },
+        Info: {
+            s0: 'Ocupación y Finanzas (Opcional)',
+            s0_1: 'Ocupación y Finanzas',
+            s1: 'Información Personal',
+            s2: 'Verificación de Identidad',
+            s3: 'Revisión',
+            s4: 'Su información ha sido verificada, y puede solicitar una tarjeta en la página de solicitud de tarjeta.',
+            s5: 'Nuestro equipo revisará su solicitud y los documentos KYC. Después de la aprobación, recibirá un correo electrónico de confirmación.',
+            s6: 'En Revisión',
+            s7: 'Verificado',
+            s8: 'Titular de la Tarjeta',
+            s9: 'Fecha de Expiración',
+            s10: 'Solicitar Tarjeta',
+            s11: 'Por favor, siga los pasos para solicitar una tarjeta.',
+            s12: 'Proceso de Solicitud',
+            s13: 'Seleccionar Tarjeta:',
+            s14: 'Por favor, elija el tipo de tarjeta que necesita.',
+            s15: 'Confirmar Información:',
+            s16: 'Por favor, confirme su información.',
+            s17: 'Revisión de la Solicitud:',
+            s18: 'Nuestro equipo revisará su solicitud, y después de la aprobación, recibirá un correo electrónico de confirmación.',
+            s19: 'Emisión de la Tarjeta:',
+            s20: 'La tarjeta será enviada a su dirección registrada dentro de 5-7 días hábiles después de la aprobación de la revisión.',
+            s21: 'Si tiene alguna pregunta o necesita asistencia, no dude en contactar a nuestro equipo de servicio al cliente. ¡Le deseamos una experiencia agradable con la tarjeta!',
+            s22: 'Recibir Tarjeta:',
+            s23: 'Por favor, asegúrese de que el sobre esté intacto al recibir la tarjeta.',
+            s24: 'Activación en Línea:',
+            s25: 'Vaya al centro de clientes de CWG Markets e ingrese a la página \'Activar Tarjeta\', ingrese su número de tarjeta y código de activación (provisto con la tarjeta).',
+            s26: 'Establecer Código PIN:',
+            s27: 'Siga las instrucciones para establecer su Número de Identificación Personal (PIN), usado para retiros en cajeros automáticos y pagos en tiendas.',
+            s28: 'Comenzar a Usar:',
+            s29: 'Una vez activada, puede comenzar a usar su Tarjeta Débito Visa para compras y retiros.',
+            s30: 'Esta tarjeta soporta: Wechatpay, Alipay, Applepay, y otros pagos electrónicos, así como retiros nacionales e internacionales en POS y cajeros automáticos.',
+            s31: 'Hemos recibido su solicitud de tarjeta. ¡Por favor, espere a que el tercero complete los procedimientos de deducción. Después de que la deducción sea exitosa, procederemos a enviar su solicitud de tarjeta!',
+            s32: 'La deducción falló, la tarifa de servicio será reembolsada a su cuenta, ¡por favor vuelva a solicitar la tarjeta!',
+            s33: 'La deducción falló, la tarifa de servicio ha sido reembolsada a su cuenta, ¡por favor vuelva a solicitar la tarjeta!',
+            s34: '¡La tarifa de servicio de su solicitud de tarjeta ha sido deducida con éxito, procederemos a enviar su solicitud de tarjeta!',
+            s35: 'Su solicitud de tarjeta no fue aprobada, ¡por favor contacte al personal para resolver el problema!',
+            s36: 'Su tarjeta ha sido aprobada y será enviada a su dirección registrada dentro de 5-7 días hábiles.',
+            s37: 'Lo sentimos, su solicitud de tarjeta no fue aprobada, ¡por favor vuelva a solicitar!',
+            s38: 'Su solicitud de tarjeta ha sido enviada para revisión por un tercero, y la tarjeta será enviada a su dirección registrada dentro de 5-7 días hábiles después de la aprobación.',
+            s39: 'Estado de la Tarifa de Servicio',
+            s40: 'Estado de Aprobación',
+            s41: 'Estado de la Tarjeta',
+            s42: 'Nuestro equipo ha recibido su información. Por favor, escanee el código QR a continuación para completar la verificación de identidad.',
+            s43: 'La información de su registro se ha actualizado con éxito.',
+            t1: 'Revisión Pendiente',
+            t2: 'Revisión Aprobada',
+            t3: 'Revisión Rechazada',
+            t5: 'En Proceso',
+            t6: 'Creación de la Tarjeta Exitosa',
+            t7: 'Fallo en la Creación de la Tarjeta',
+            t8: 'Deducción Exitosa',
+            t9: 'Fallo en la Deducción',
+            t10: 'Pendiente',
+            t11: 'Reembolsando',
+            t12: 'Reembolso Exitoso',
+            t13: 'Reembolso Fallido',
+            t15: 'Estado:',
+            t16: 'Creación de la Tarjeta en Proceso (Por favor, sea paciente)',
+            t17: 'Fallo en la Creación de la Tarjeta (Espere el reembolso y vuelva a solicitar)',
+            t18: 'Creación de la Tarjeta Exitosa (Por favor, active su tarjeta)',
+            t19: 'Activación de la Tarjeta en Proceso (Por favor, sea paciente)',
+            t20: 'Fallo en la Activación de la Tarjeta (Por favor, reactive su tarjeta)',
+        },
+        Form: {
+            v1: 'Masculino',
+            v2: 'Femenino',
+            v3: 'Tarjeta de Identidad de Hong Kong',
+            v4: 'Pasaporte',
+            v5: 'Permiso de conducir',
+            v6: 'ID Emitido por el Gobierno',
+            f1: 'Código de Área',
+            f2: 'Número de Teléfono',
+            f3: 'Correo Electrónico',
+            f4: 'Apellido',
+            f5: 'Nombre',
+            f6: 'Fecha de Nacimiento',
+            f7: 'Nacionalidad',
+            f8: 'Género',
+            f9: 'Ciudad',
+            f10: 'Dirección',
+            f11: 'Código Postal',
+            f12: 'Ocupación',
+            f13: 'Ingreso Anual',
+            f14: 'Propósito de la Cuenta',
+            f15: 'Volumen Esperado de Comercio Mensual',
+            f16: 'Tipo de ID',
+            f17: 'Número de ID',
+            f18: 'Número de Seguridad Social',
+            f19: 'Fecha de Emisión de la ID',
+            f20: 'Fecha de Expiración de la ID',
+            f21: 'Foto del Frente de la ID',
+            f22: 'Foto del Dorso de la ID',
+            f23: 'Foto de la ID en Mano',
+            f24: 'Número de Tarjeta Bancaria',
+            f25: 'Contraseña de Transacción',
+            f26: 'Código de Activación',
+            f27: 'Observaciones',
+            f28: 'Monto del Depósito',
+            f29: 'Moneda',
+            f30: 'Tarifa de Transacción',
+            f31: 'Monto Recibido',
+            f32: 'Moneda Recibida',
+            f33: 'Hora de Aplicación',
+            f34: 'Confirmar Contraseña',
+            f35: 'Número de Referencia de la Transacción',
+            f36: 'Moneda de la Transacción',
+            f37: 'Monto de la Transacción',
+            f38: 'Monto Autorizado',
+            f39: 'Moneda Autorizada',
+            f40: 'Tarifa Autorizada',
+            f41: 'Nombre del Comerciante',
+            f42: 'Tipo de Transacción',
+            f43: 'Hora de la Transacción',
+            f44: 'Tarifa de Transacción Transfronteriza',
+            f45: 'Estado',
+            f46: 'Descripción de la Transacción',
+            f47: 'Estado de la Tarifa',
+            f48: 'Tipo de Tarjeta',
+            f49: 'Nombre de la Tarjeta',
+            f50: 'Estado de la Tarjeta',
+            f51: 'Hora',
+            f52: 'Tipo',
+            f53: 'Estado de Aprobación',
+            f54: 'Estado del Depósito',
+            f55: 'Monto',
+            f56: 'Saldo de la Billetera:',
+            f57: 'Todo',
+            f58: 'Tasa de Tarifa:',
+            f59: 'Tarifa Estimada:',
+        },
+        vaildate: {
+            v1: 'Por favor seleccione el código de área',
+            v2: 'Por favor ingrese un número de teléfono con 5-20 dígitos',
+            v3: 'Por favor ingrese el primer nombre, solo caracteres en inglés, [2...23] caracteres. La longitud total del primer y último nombre no puede exceder los 23 caracteres (incluyendo espacios)',
+            v4: 'Por favor ingrese el apellido, solo caracteres en inglés, [2...23] caracteres. La longitud total del primer y último nombre no puede exceder los 23 caracteres (incluyendo espacios)',
+            v5: 'Por favor seleccione la fecha de nacimiento',
+            v6: 'Por favor seleccione la nacionalidad',
+            v7: 'Por favor seleccione la ciudad',
+            v8: 'Por favor ingrese el código postal',
+            v9: 'Por favor seleccione el género',
+            v10: 'Por favor seleccione la ocupación',
+            v11: 'Por favor ingrese el ingreso anual, por ejemplo, 200000 USD',
+            v12: 'Por favor ingrese el propósito de la cuenta, solo en inglés, por ejemplo, Gastos de Vivienda',
+            v13: 'Por favor ingrese el volumen esperado de comercio mensual, por ejemplo, 100000 USD',
+            v14: 'Por favor seleccione el tipo de ID',
+            v15: 'Por favor ingrese el número de ID',
+            v16: 'Por favor ingrese el número de seguridad social de 9 dígitos',
+            v17: 'Por favor seleccione la fecha de emisión de la ID',
+            v18: 'Por favor seleccione la fecha de expiración de la ID',
+            v19: 'Por favor seleccione el archivo de la foto del frente de la ID',
+            v20: 'Por favor seleccione el archivo de la foto del dorso de la ID',
+            v21: 'Por favor seleccione el archivo de la foto de la ID en mano',
+            v22: 'Por favor ingrese el número de la tarjeta',
+            v23: 'Por favor ingrese una contraseña de transacción de 6 dígitos',
+            v24: 'Por favor ingrese el código de activación',
+            v25: 'Por favor ingrese las observaciones',
+            v26: 'Por favor ingrese el monto del depósito',
+            v27: 'Por favor ingrese la dirección',
+            v28: 'Por favor ingrese el correo electrónico',
+            v29: 'Las contraseñas no coinciden',
+            v30: 'Por favor seleccione el archivo de la foto de la ID en mano',
+            v31: 'Por favor ingrese la contraseña nuevamente',
+            v32: 'Use 6 dígitos',
+            v33: 'No puede usar dígitos consecutivos o repetidos',
+            v34: 'El monto debe ser mayor que 0',
+            v35: 'El monto del depósito no puede exceder',
+            v36: 'El monto del depósito no puede ser menor que',
+            v37: 'El monto del depósito no puede exceder',
+            v38: 'Solo se permiten caracteres en inglés (se incluyen los espacios)',
+            v39: 'La longitud debe estar entre 2 y 23 caracteres',
+            v40: 'La longitud total del primer y último nombre no puede exceder los 23 caracteres (incluyendo espacios)',
+        },
+        Btn: {
+            Next: 'Siguiente',
+            Previous: 'Anterior',
+            Submit: 'Enviar',
+            Confirm: 'Confirmar',
+            Cancel: 'Cancelar',
+            Update: 'Actualizar',
+            Auth: 'Autenticar',
+            Freeze: 'Congelar',
+            Unfreeze: 'Descongelar',
+            Recharge: 'Recargar',
+            Activate: 'Activar',
+            b1: 'Activar Tarjeta',
+            b2: 'Ver',
+            b3: 'Solicitud de Recarga',
+            b4: 'Cambiar Contraseña',
+            b5: 'Congelar Tarjeta',
+            b6: 'Descongelar Tarjeta',
+            b7: 'Solicitar Tarjeta',
+            b8: 'Obtener Código de Activación',
+            b9: 'Copiar Código de Activación',
+            b10: 'Balance',
+            b11: 'Ver Estado de la Solicitud de Tarjeta',
+            b12: 'Volver a Solicitar Tarjeta',
+            b13: 'Activando',
+            b14: 'Descongelando',
+            b15: 'Congelando',
+            b16: 'Cerrar',
+        },
+        New: {
+            n0: 'La dirección debe tener entre 2 y 200 caracteres, solo letras, números, guiones y espacios',
+            n1: 'La dirección debe tener entre 2 y 40 caracteres, solo letras, números, guiones y espacios',
+            n2: 'El código postal debe tener entre 2 y 15 caracteres',
+            n3: 'Usted es menor de 18 años',
+            n4: 'Precio:',
+            n5: '¿Se requiere al titular de la tarjeta al abrir la tarjeta?',
+            n6: 'Monedas admitidas para recarga:',
+            n7: 'Monto mínimo de recarga:',
+            n8: 'Monto mínimo de recarga:',
+            n9: 'Tasa de comisión:',
+            n10: 'Método de deducción',
+            n11: 'Dirección en inglés',
+        },
+        Transactions: {
+            t1: 'Autorización',
+            t2: 'Reembolso',
+            t3: 'Verificación',
+            t4: 'Anulación',
+            t5: 'Tarifas de tarjeta (mensuales, anuales, retiro en cajero....)',
+            t6: 'Transferencia de salida',
+            t7: 'Ajuste de liquidación',
+            t8: 'Consulta de saldo',
+            t9: 'Comisión',
+            t10: 'Consumo',
+            t11: 'Fallo en consumo',
+            t12: 'Reembolso',
+            t13: 'Anulación',
+            t14: 'Otro',
+            t15: 'Verificación de vinculación de tarjeta',
+            t16: 'Tarifa de gestión',
+            t17: 'Liquidación',
+            t18: 'Exitoso',
+            t19: 'Corrección',
+            t20: 'Revertido',
+            t21: 'Anulado',
+            t22: 'Anulación',
+            t23: 'Devolución',
+            t24: 'Autorizado',
+            t25: 'Fallido',
+            t26: 'Devolución',
+        },
+        New1: {
+            title: 'Completar Información',
+            f1: '¡Tu foto de identificación se ha subido correctamente, por favor espera los resultados de la revisión!',
+            f2: 'Subida exitosa',
+            f3: 'Escanea el código QR para subir tu identificación',
+            f4: '¿Deseas subir la foto de identificación manualmente?',
+            d1: 'Sube la foto del anverso de tu identificación',
+            d2: 'Sube la foto del reverso de tu identificación',
+            d3: 'Sube una foto de ti sosteniendo tu identificación',
+            d4: 'Haz clic para seleccionar un archivo',
+            d5: 'Subida exitosa',
+            d6: 'Error en la subida',
+            d7: 'Subiendo...',
+            d8: 'País de envío',
+            d9: 'Ciudad de envío',
+            d10: 'Dirección de envío',
+            d11: 'Dirección de envío en inglés',
+            d12: 'Código postal de envío',
+            d13: 'Número de teléfono de envío',
+            d14: 'El archivo no puede exceder los 2 MB',
+            titel1: 'Configuración de idioma',
+        },
+    },
+}

+ 437 - 0
src/i18n/locales/fa.ts

@@ -0,0 +1,437 @@
+export default {
+    'common': {
+        confirm: 'Confirm',
+        cancel: 'Cancel',
+        loading: 'Loading...',
+        success: 'Success',
+        fail: 'Failed',
+        input: 'Please input',
+        choose: 'Please choose',
+        country: 'Type a currency / country',
+        error: 'System Error',
+        copy1: 'Card number copied!',
+        copy2: 'CVV copied!',
+        copy3: 'Copy failed',
+    },
+
+    'language': {
+        title: 'تنظیمات زبان',
+        selectLang: 'Select Language',
+        cn: '简体中文',
+        zh: '繁體中文',
+        en: 'English',
+        de: 'Deutsch',
+        es: 'Español',
+        ar: 'العربية',
+        id: 'Indonesian',
+        ms: 'Malay',
+        th: 'ไทย',
+        tr: 'Türkçe',
+        pt: 'Português',
+        ko: '한국어',
+        fa: 'فارسی',
+        vn: 'Tiếng Việt',
+        i0: 'Vertified',
+        i1: 'تنظیمات زبان',
+        i2: 'Change Password',
+        i3: 'Personal Info',
+        i4: 'Card Opening Record',
+        i5: 'About PayouCard',
+        i6: 'Logout',
+    },
+    'improve-info': {
+        title: 'تکمیل اطلاعات',
+        p3: 'Please enter the information',
+        p3_1: 'Please enter your last name',
+        p3_2: 'Please enter your first name',
+        p3_3: 'Please enter your mobile number',
+        p3_4: 'Please enter the detailed address',
+        p3_5: 'Please enter your email',
+        p4: 'Area Code',
+        p5: 'Select Area Code',
+        p6: 'Mobile',
+        p7: 'Email',
+        p8: 'Last Name',
+        p9: 'First Name',
+        p10: 'Birthday',
+        p11: 'Nationality',
+        p12: 'Select Nationality',
+        p13: 'Gender',
+        p14: 'Please Select',
+        p15: 'Male',
+        p16: 'Female',
+        p17: 'Country',
+        p18: 'Select Country',
+        p19: 'City',
+        p20: 'Select City',
+        p21: 'Detailed Address',
+        p22: 'Postal Code',
+        p23: 'Document Type',
+        p24: 'Select Document Type',
+        p25: 'ID Card',
+        p26: 'Passport',
+        p27: 'Document Number',
+        p28: 'Document Expiry',
+        p28_1: 'Upload Your ',
+        p28_2: 'Click to select file',
+        p29: 'Document Photo',
+        p30: 'Face Photo',
+        p31: 'Extended Field',
+        p32: 'Cancel',
+        p33: 'Submit',
+        p34: 'DLN',
+        p35: '政府签发的身份证',
+        kycSuccess: 'Information Completed',
+    },
+    'card': {
+        title: 'کارت CWG',
+        tab1: 'سابقه واریز',
+        tab2: 'سابقه تراکنش',
+        tab3: 'اطلاعات شخصی',
+        tab4: 'تغییر رمز عبور',
+        tab5: 'کارت CWG',
+        tab6: 'اطلاعات کامل',
+        tab7: 'سابقه واریز',
+        tab8: 'سابقه تراکنش',
+        tab9: 'درخواست کارت',
+        tab10: 'فعال سازی',
+        tab11: 'واریز کارت',
+        tab12: 'تغییر رمز عبور',
+        tab13: 'یخ زدن حساب',
+        tab14: 'آزاد کردن حساب',
+        tab15: 'سابقه درخواست کارت',
+        tab16: 'پیشرفت کارت',
+        tab17: 'سابقه موجودی کیف پول',
+        tab18: 'انتخاب کارت',
+        tab19: 'تایید اطلاعات',
+        Status: {
+            t1: 'موفق',
+            t2: 'شکست',
+            t3: 'در حال پردازش',
+            t4: 'مجاز',
+            t5: 'در انتظار',
+            t6: 'کارت با موفقیت ایجاد شد',
+            t7: 'ایجاد کارت با شکست مواجه شد',
+            t8: 'کسر موفقیت آمیز',
+            t9: 'کسر ناموفق',
+            t10: 'بازپرداخت موفقیت آمیز',
+            t11: 'بازپرداخت ناموفق',
+            t12: 'در حال پردازش بازپرداخت',
+            t13: 'در انتظار بررسی',
+            t14: 'بررسی تایید شد',
+            t15: 'بررسی رد شد',
+            t16: 'برداشت',
+            t17: 'واریز',
+            t18: 'بازپرداخت',
+            t19: 'انتقال دستی وارد',
+            t20: 'انتقال دستی خارج',
+            t21: 'همه',
+            v1: 'اطلاعات ثبت‌نام',
+            v2: 'ویرایش اطلاعات',
+            v3: 'دریافت لینک تأیید چهره',
+            v4: 'بررسی دستی KYC',
+            v5: 'درخواست صدور کارت',
+            v6: 'تأیید صدور کارت',
+            v7: 'دریافت کد فعال‌سازی',
+            v8: 'فعال‌سازی کارت',
+            v9: 'مبلغ پیش‌فرض شارژ',
+            v10: 'برداشت به کیف پول',
+            v11: 'واریز به کیف پول',
+            v12: 'درخواست شارژ کارت',
+            v13: 'تأیید شارژ',
+            v14: 'مسدود کردن',
+            v15: 'رفع مسدودی',
+            v16: 'تغییر رمز عبور',
+            v17: 'حساب CID اپراتور',
+        },
+        Msg: {
+            m1: 'درخواست کارت شما ارسال شده است و پس از تایید، از طریق ایمیل اطلاع رسانی خواهید شد!',
+            m2: 'درخواست واریز شما ارسال شده است و انتظار می رود پس از تایید ظرف 1-3 روز کاری به حساب شما واریز شود!',
+            m3: 'اطلاعات فعال سازی کارت بانکی شما ارسال شده است.',
+            m4: 'کارت بانکی شما با موفقیت یخ زده است!',
+            m5: 'کارت بانکی شما با موفقیت آزاد شد!',
+            m6: 'رمز عبور کارت بانکی شما با موفقیت تغییر کرد!',
+            m7: 'واریز موفقیت آمیز',
+            m8: 'کپی موفقیت آمیز!',
+            m9: 'کپی ناموفق!',
+            m10: 'کارت بانکی شما یخ زده است، لطفاً قبل از ادامه آن را فعال کنید!',
+            m11: 'هیچ نوع کارتی برای درخواست موجود نیست',
+            m12: 'در حال حاضر دسترسی ندارید، لطفاً با مدیر تماس بگیرید!',
+            m13: 'حذف هشدار',
+            m14: 'آیا مطمئن هستید که می خواهید این قانون را حذف کنید؟',
+            m15: 'به روز رسانی موفقیت آمیز',
+            m16: 'عکس جلو ID با موفقیت آپلود شد',
+            m17: 'عکس پشت ID با موفقیت آپلود شد',
+            m18: 'عکس ID در دست با موفقیت آپلود شد',
+            m19: 'حجم تصویر پروفایل بارگذاری شده نباید از 2MB بیشتر باشد!',
+            m20: 'تصویر پروفایل بارگذاری شده باید فرمت JPG/PNG باشد!',
+        },
+        Info: {
+            s0: 'شغل و مالی (اختیاری)',
+            s0_1: 'شغل و مالی',
+            s1: 'اطلاعات شخصی',
+            s2: 'احراز هویت',
+            s3: 'بررسی',
+            s4: 'اطلاعات شما تایید شده است و می توانید برای کارت در صفحه درخواست کارت اقدام کنید.',
+            s5: 'تیم ما درخواست شما و مدارک KYC را بررسی خواهد کرد. پس از تایید، ایمیلی تاییدیه دریافت خواهید کرد.',
+            s6: 'در حال بررسی',
+            s7: 'تایید شده',
+            s8: 'دارنده کارت',
+            s9: 'تاریخ انقضا',
+            s10: 'درخواست کارت',
+            s11: 'لطفاً مراحل درخواست کارت را دنبال کنید.',
+            s12: 'فرآیند درخواست',
+            s13: 'انتخاب کارت:',
+            s14: 'لطفاً نوع کارتی که نیاز دارید را انتخاب کنید.',
+            s15: 'تایید اطلاعات:',
+            s16: 'لطفاً اطلاعات خود را تایید کنید.',
+            s17: 'بررسی درخواست:',
+            s18: 'تیم ما درخواست شما را بررسی خواهد کرد و پس از تایید، ایمیلی تاییدیه دریافت خواهید کرد.',
+            s19: 'صدور کارت:',
+            s20: 'کارت پس از تایید بررسی به آدرس ثبت شده شما در 5-7 روز کاری ارسال خواهد شد.',
+            s21: 'اگر سوالی دارید یا نیاز به کمک دارید، لطفاً با تیم خدمات مشتری ما تماس بگیرید. آرزوی تجربه خوبی با کارت برای شما داریم!',
+            s22: 'دریافت کارت:',
+            s23: 'لطفاً اطمینان حاصل کنید که بسته کارت در زمان دریافت سالم است.',
+            s24: 'فعال سازی آنلاین:',
+            s25: 'به مرکز مشتریان CWG Markets بروید و وارد صفحه \'فعال سازی کارت\' شوید، شماره کارت و کد فعال سازی (ارائه شده همراه کارت) را وارد کنید.',
+            s26: 'تنظیم کد PIN:',
+            s27: 'دنبال دستورالعمل ها برای تنظیم کد شناسایی شخصی (PIN)، برای برداشت از دستگاه ATM و پرداخت های خرید باشید.',
+            s28: 'شروع استفاده:',
+            s29: 'پس از فعال سازی، می توانید از کارت دبیت ویزا خود برای خرید و برداشت استفاده کنید.',
+            s30: 'این کارت از: Wechatpay، Alipay، Applepay و سایر پرداخت های الکترونیکی پشتیبانی می کند و همچنین برای برداشت از دستگاه های POS و ATM داخلی و بین المللی قابل استفاده است.',
+            s31: 'ما درخواست کارت شما را دریافت کرده ایم. لطفاً منتظر بمانید تا طرف سوم مراحل کسر را کامل کند. پس از موفقیت کسر، بلافاصله درخواست کارت شما را ارسال خواهیم کرد!',
+            s32: 'کسر ناموفق بود، هزینه خدمات به حساب شما بازپرداخت خواهد شد، لطفاً دوباره برای کارت درخواست دهید!',
+            s33: 'کسر ناموفق بود، هزینه خدمات به حساب شما بازپرداخت شده است، لطفاً دوباره برای کارت درخواست دهید!',
+            s34: 'هزینه خدمات درخواست کارت شما با موفقیت کسر شده است، ما بلافاصله درخواست کارت شما را ارسال خواهیم کرد!',
+            s35: 'درخواست کارت شما تایید نشد، لطفاً با کارکنان تماس بگیرید تا مشکل را حل کنید!',
+            s36: 'کارت شما تایید شده است و ظرف 5-7 روز کاری به آدرس ثبت شده شما ارسال خواهد شد.',
+            s37: 'متاسفیم، درخواست کارت شما تایید نشد، لطفاً دوباره درخواست دهید.',
+            s38: 'درخواست کارت شما برای بررسی به طرف سوم ارسال شده است و پس از تایید، کارت به آدرس ثبت شده شما در 5-7 روز کاری ارسال خواهد شد.',
+            s39: 'وضعیت هزینه خدمات',
+            s40: 'وضعیت تایید',
+            s41: 'وضعیت کارت',
+            s42: 'تیم ما اطلاعات شما را دریافت کرده است. لطفاً کد QR زیر را اسکن کنید تا تأیید هویت را کامل کنید.',
+            s43: 'اطلاعات ثبت نام شما با موفقیت به‌روزرسانی شد.',
+            t1: 'در انتظار بررسی',
+            t2: 'بررسی تایید شد',
+            t3: 'بررسی رد شد',
+            t5: 'در حال پردازش',
+            t6: 'ایجاد کارت موفقیت آمیز',
+            t7: 'ایجاد کارت ناموفق',
+            t8: 'کسر موفقیت آمیز',
+            t9: 'کسر ناموفق',
+            t10: 'در انتظار',
+            t11: 'در حال بازپرداخت',
+            t12: 'بازپرداخت موفقیت آمیز',
+            t13: 'بازپرداخت ناموفق',
+            t15: 'وضعیت:',
+            t16: 'ایجاد کارت در حال انجام است (لطفاً صبور باشید)',
+            t17: 'ایجاد کارت ناموفق (لطفاً منتظر بازپرداخت و درخواست دوباره باشید)',
+            t18: 'ایجاد کارت موفقیت آمیز (لطفاً کارت خود را فعال کنید)',
+            t19: 'فعال سازی کارت در حال انجام است (لطفاً صبور باشید)',
+            t20: 'فعال سازی کارت ناموفق (لطفاً دوباره کارت خود را فعال کنید)',
+        },
+        Form: {
+            v1: 'مرد',
+            v2: 'زن',
+            v3: 'کارت شناسایی هنگ کنگ',
+            v4: 'پاسپورت',
+            v5: 'گواهی رانندگی',
+            v6: 'کارت شناسایی صادر شده توسط دولت',
+            f1: 'کد ناحیه',
+            f2: 'شماره تلفن',
+            f3: 'ایمیل',
+            f4: 'نام خانوادگی',
+            f5: 'نام',
+            f6: 'تاریخ تولد',
+            f7: 'ملیت',
+            f8: 'جنسیت',
+            f9: 'شهر',
+            f10: 'آدرس',
+            f11: 'کد پستی',
+            f12: 'شغل',
+            f13: 'درآمد سالانه',
+            f14: 'هدف حساب',
+            f15: 'حجم معاملات ماهانه پیش بینی شده',
+            f16: 'نوع شناسایی',
+            f17: 'شماره شناسایی',
+            f18: 'شماره تأمین اجتماعی',
+            f19: 'تاریخ صدور شناسنامه',
+            f20: 'تاریخ انقضای شناسنامه',
+            f21: 'عکس جلو شناسنامه',
+            f22: 'عکس پشت شناسنامه',
+            f23: 'عکس شناسنامه در دست',
+            f24: 'شماره کارت بانکی',
+            f25: 'رمز عبور تراکنش',
+            f26: 'کد فعال سازی',
+            f27: 'توضیحات',
+            f28: 'مقدار واریز',
+            f29: 'ارز',
+            f30: 'هزینه تراکنش',
+            f31: 'مقدار دریافتی',
+            f32: 'ارز دریافتی',
+            f33: 'زمان درخواست',
+            f34: 'تایید رمز عبور',
+            f35: 'شماره مرجع تراکنش',
+            f36: 'ارز تراکنش',
+            f37: 'مقدار تراکنش',
+            f38: 'مقدار مجاز',
+            f39: 'ارز مجاز',
+            f40: 'هزینه مجاز',
+            f41: 'نام تاجر',
+            f42: 'نوع تراکنش',
+            f43: 'زمان تراکنش',
+            f44: 'هزینه تراکنش مرزی',
+            f45: 'وضعیت',
+            f46: 'توضیحات تراکنش',
+            f47: 'وضعیت هزینه',
+            f48: 'نوع کارت',
+            f49: 'نام کارت',
+            f50: 'وضعیت کارت',
+            f51: 'زمان',
+            f52: 'نوع',
+            f53: 'وضعیت تایید',
+            f54: 'وضعیت واریز',
+            f55: 'مقدار',
+            f56: 'موجودی کیف پول:',
+            f57: 'همه',
+            f58: 'نرخ هزینه:',
+            f59: 'هزینه تخمینی:',
+        },
+        vaildate: {
+            v1: 'لطفاً کد ناحیه را انتخاب کنید',
+            v2: 'لطفاً شماره تلفن با 5-20 رقم وارد کنید',
+            v3: 'لطفاً نام اول را وارد کنید، فقط از حروف انگلیسی استفاده کنید، [2...23] کاراکتر. طول کل نام اول و نام خانوادگی نباید از 23 کاراکتر (شامل فضاها) بیشتر باشد',
+            v4: 'لطفاً نام خانوادگی را وارد کنید، فقط از حروف انگلیسی استفاده کنید، [2...23] کاراکتر. طول کل نام اول و نام خانوادگی نباید از 23 کاراکتر (شامل فضاها) بیشتر باشد',
+            v5: 'لطفاً تاریخ تولد را انتخاب کنید',
+            v6: 'لطفاً ملیت را انتخاب کنید',
+            v7: 'لطفاً شهر را انتخاب کنید',
+            v8: 'لطفاً کد پستی را وارد کنید',
+            v9: 'لطفاً جنسیت را انتخاب کنید',
+            v10: 'لطفاً شغل را انتخاب کنید',
+            v11: 'لطفاً درآمد سالانه را وارد کنید، به عنوان مثال، 200000 دلار آمریکا',
+            v12: 'لطفاً هدف حساب را وارد کنید، فقط انگلیسی، به عنوان مثال، هزینه زندگی',
+            v13: 'لطفاً حجم معاملات ماهانه پیش بینی شده را وارد کنید، به عنوان مثال، 100000 دلار آمریکا',
+            v14: 'لطفاً نوع شناسایی را انتخاب کنید',
+            v15: 'لطفاً شماره شناسایی را وارد کنید',
+            v16: 'لطفاً شماره تأمین اجتماعی 9 رقمی را وارد کنید',
+            v17: 'لطفاً تاریخ صدور شناسنامه را انتخاب کنید',
+            v18: 'لطفاً تاریخ انقضای شناسنامه را انتخاب کنید',
+            v19: 'لطفاً فایل عکس جلو شناسنامه را انتخاب کنید',
+            v20: 'لطفاً فایل عکس پشت شناسنامه را انتخاب کنید',
+            v21: 'لطفاً فایل عکس شناسنامه در دست را انتخاب کنید',
+            v22: 'لطفاً شماره کارت را وارد کنید',
+            v23: 'لطفاً رمز عبور تراکنش 6 رقمی وارد کنید',
+            v24: 'لطفاً کد فعال سازی را وارد کنید',
+            v25: 'لطفاً توضیحات را وارد کنید',
+            v26: 'لطفاً مقدار واریز را وارد کنید',
+            v27: 'لطفاً آدرس را وارد کنید',
+            v28: 'لطفاً ایمیل را وارد کنید',
+            v29: 'رمزهای عبور مطابقت ندارند',
+            v30: 'لطفاً فایل عکس شناسنامه در دست را انتخاب کنید',
+            v31: 'لطفاً دوباره رمز عبور را وارد کنید',
+            v32: 'از 6 رقم استفاده کنید',
+            v33: 'از اعداد متوالی یا تکراری نمی توان استفاده کرد',
+            v34: 'مقدار باید بیشتر از 0 باشد',
+            v35: 'مقدار واریز نباید از حد مجاز بیشتر باشد',
+            v36: 'مقدار واریز نباید از حد مجاز کمتر باشد',
+            v37: 'مقدار واریز نباید از حد مجاز بیشتر باشد',
+            v38: 'فقط حروف انگلیسی مجاز است (فضاها شامل می شوند)',
+            v39: 'طول باید بین 2 و 23 کاراکتر باشد',
+            v40: 'طول کل نام اول و نام خانوادگی نباید از 23 کاراکتر (شامل فضاها) بیشتر باشد',
+        },
+        Btn: {
+            Next: 'بعدی',
+            Previous: 'قبلی',
+            Submit: 'ارسال',
+            Confirm: 'تأیید',
+            Cancel: 'لغو',
+            Update: 'به روز رسانی',
+            Auth: 'احراز هویت',
+            Freeze: 'یخ زدن',
+            Unfreeze: 'آزاد کردن',
+            Recharge: 'شارژ',
+            Activate: 'فعال سازی',
+            b1: 'فعال سازی کارت',
+            b2: 'مشاهده',
+            b3: 'درخواست شارژ',
+            b4: 'تغییر رمز عبور',
+            b5: 'یخ زدن کارت',
+            b6: 'آزاد کردن کارت',
+            b7: 'درخواست کارت',
+            b8: 'دریافت کد فعال سازی',
+            b9: 'کپی کد فعال سازی',
+            b10: 'موجودی',
+            b11: 'بررسی وضعیت درخواست کارت',
+            b12: 'دوباره درخواست کارت',
+            b13: 'در حال فعال سازی',
+            b14: 'در حال آزادسازی',
+            b15: 'در حال یخ زدن',
+            b16: 'بستن',
+        },
+        New: {
+            n0: 'طول آدرس باید بین 2 تا 200 کاراکتر باشد و فقط شامل حروف، اعداد، خط تیره و فاصله باشد',
+            n1: 'طول آدرس باید بین 2 تا 40 کاراکتر باشد و فقط شامل حروف، اعداد، خط تیره و فاصله باشد',
+            n2: 'کد پستی باید بین 2 تا 15 کاراکتر باشد',
+            n3: 'سن شما کمتر از 18 سال است',
+            n4: 'قیمت:',
+            n5: 'آیا هنگام افتتاح کارت نیاز به دارنده کارت است:',
+            n6: 'ارزهای پشتیبانی شده برای شارژ:',
+            n7: 'حداقل مبلغ شارژ:',
+            n8: 'حداقل مبلغ شارژ:',
+            n9: 'نرخ کارمزد:',
+            n10: 'روش کسر',
+            n11: 'آدرس انگلیسی',
+        },
+        Transactions: {
+            t1: 'مجوز',
+            t2: 'بازپرداخت',
+            t3: 'تأیید',
+            t4: 'لغو',
+            t5: 'هزینه کارت (ماهانه، سالانه، برداشت خودپرداز....)',
+            t6: 'انتقال خروجی',
+            t7: 'تعدیل تسویه',
+            t8: 'استعلام موجودی',
+            t9: 'کارمزد',
+            t10: 'مصرف',
+            t11: 'ناموفق در مصرف',
+            t12: 'بازپرداخت',
+            t13: 'لغو',
+            t14: 'سایر',
+            t15: 'تراکنش تأیید اتصال کارت',
+            t16: 'هزینه مدیریت',
+            t17: 'تسویه',
+            t18: 'موفق',
+            t19: 'اصلاح',
+            t20: 'برگشت داده شده',
+            t21: 'لغو شده',
+            t22: 'لغو',
+            t23: 'بازگشت کالا',
+            t24: 'مجاز شده',
+            t25: 'ناموفق',
+            t26: 'بازگشت',
+        },
+        New1: {
+            title: 'تکمیل اطلاعات',
+            f1: 'عکس شناسایی شما با موفقیت بارگذاری شد، لطفاً منتظر نتایج بررسی باشید!',
+            f2: 'بارگذاری موفقیت‌آمیز',
+            f3: 'برای بارگذاری شناسنامه خود، کد QR را اسکن کنید',
+            f4: 'آیا می‌خواهید عکس شناسنامه را به‌طور دستی بارگذاری کنید؟',
+            d1: 'عکس روی شناسنامه خود را بارگذاری کنید',
+            d2: 'عکس پشت شناسنامه خود را بارگذاری کنید',
+            d3: 'عکسی از خودتان با شناسنامه‌تان بارگذاری کنید',
+            d4: 'برای انتخاب فایل کلیک کنید',
+            d5: 'بارگذاری موفقیت‌آمیز',
+            d6: 'بارگذاری ناموفق',
+            d7: 'در حال بارگذاری...',
+            d8: 'کشور ارسال',
+            d9: 'شهر ارسال',
+            d10: 'آدرس ارسال',
+            d11: 'آدرس ارسال به زبان انگلیسی',
+            d12: 'کد پستی ارسال',
+            d13: 'شماره تلفن ارسال',
+            d14: 'حجم فایل نمی‌تواند بیشتر از 2MB باشد',
+            titel1: 'تنظیمات زبان',
+        },
+    },
+}

+ 437 - 0
src/i18n/locales/id.ts

@@ -0,0 +1,437 @@
+export default {
+    'common': {
+        confirm: 'Confirm',
+        cancel: 'Cancel',
+        loading: 'Loading...',
+        success: 'Success',
+        fail: 'Failed',
+        input: 'Please input',
+        choose: 'Please choose',
+        country: 'Type a currency / country',
+        error: 'System Error',
+        copy1: 'Card number copied!',
+        copy2: 'CVV copied!',
+        copy3: 'Copy failed',
+    },
+
+    'language': {
+        title: 'Pengaturan Bahasa',
+        selectLang: 'Select Language',
+        cn: '简体中文',
+        zh: '繁體中文',
+        en: 'English',
+        de: 'Deutsch',
+        es: 'Español',
+        ar: 'العربية',
+        id: 'Indonesian',
+        ms: 'Malay',
+        th: 'ไทย',
+        tr: 'Türkçe',
+        pt: 'Português',
+        ko: '한국어',
+        fa: 'فارسی',
+        vn: 'Tiếng Việt',
+        i0: 'Vertified',
+        i1: 'Pengaturan Bahasa',
+        i2: 'Change Password',
+        i3: 'Personal Info',
+        i4: 'Card Opening Record',
+        i5: 'About PayouCard',
+        i6: 'Logout',
+    },
+    'improve-info': {
+        title: 'Lengkapi Informasi',
+        p3: 'Please enter the information',
+        p3_1: 'Please enter your last name',
+        p3_2: 'Please enter your first name',
+        p3_3: 'Please enter your mobile number',
+        p3_4: 'Please enter the detailed address',
+        p3_5: 'Please enter your email',
+        p4: 'Area Code',
+        p5: 'Select Area Code',
+        p6: 'Mobile',
+        p7: 'Email',
+        p8: 'Last Name',
+        p9: 'First Name',
+        p10: 'Birthday',
+        p11: 'Nationality',
+        p12: 'Select Nationality',
+        p13: 'Gender',
+        p14: 'Please Select',
+        p15: 'Male',
+        p16: 'Female',
+        p17: 'Country',
+        p18: 'Select Country',
+        p19: 'City',
+        p20: 'Select City',
+        p21: 'Detailed Address',
+        p22: 'Postal Code',
+        p23: 'Document Type',
+        p24: 'Select Document Type',
+        p25: 'ID Card',
+        p26: 'Passport',
+        p27: 'Document Number',
+        p28: 'Document Expiry',
+        p28_1: 'Upload Your ',
+        p28_2: 'Click to select file',
+        p29: 'Document Photo',
+        p30: 'Face Photo',
+        p31: 'Extended Field',
+        p32: 'Cancel',
+        p33: 'Submit',
+        p34: 'DLN',
+        p35: '政府签发的身份证',
+        kycSuccess: 'Information Completed',
+    },
+    'card': {
+        title: 'Kartu CWG',
+        tab1: 'Rekam Setoran',
+        tab2: 'Rekam Transaksi',
+        tab3: 'Informasi Pribadi',
+        tab4: 'Ganti Kata Sandi',
+        tab5: 'Kartu CWG',
+        tab6: 'Informasi Lengkap',
+        tab7: 'Rekam Setoran',
+        tab8: 'Rekam Transaksi',
+        tab9: 'Ajukan Kartu',
+        tab10: 'Aktifkan',
+        tab11: 'Setoran Kartu',
+        tab12: 'Ganti Kata Sandi',
+        tab13: 'Beku Akun',
+        tab14: 'Buka Beku Akun',
+        tab15: 'Rekam Aplikasi Kartu',
+        tab16: 'Progres Kartu',
+        tab17: 'Rekam Saldo Dompet',
+        tab18: 'Pilih Kartu',
+        tab19: 'Konfirmasi Informasi',
+        Status: {
+            t1: 'Berhasil',
+            t2: 'Gagal',
+            t3: 'Proses',
+            t4: 'Terotorisasi',
+            t5: 'Menunggu',
+            t6: 'Kartu Dibuat Dengan Sukses',
+            t7: 'Pembuatan Kartu Gagal',
+            t8: 'Pemotongan Berhasil',
+            t9: 'Pemotongan Gagal',
+            t10: 'Pengembalian Berhasil',
+            t11: 'Pengembalian Gagal',
+            t12: 'Pengembalian Dalam Proses',
+            t13: 'Menunggu Peninjauan',
+            t14: 'Peninjauan Disetujui',
+            t15: 'Peninjauan Ditolak',
+            t16: 'Penarikan',
+            t17: 'Setoran',
+            t18: 'Pengembalian Dana',
+            t19: 'Transfer Manual Masuk',
+            t20: 'Transfer Manual Keluar',
+            t21: 'Semua',
+            v1: 'Informasi Pendaftaran',
+            v2: 'Ubah Informasi',
+            v3: 'Dapatkan Tautan Verifikasi Wajah',
+            v4: 'Tinjauan Manual KYC',
+            v5: 'Permohonan Kartu',
+            v6: 'Persetujuan Kartu',
+            v7: 'Dapatkan Kode Aktivasi',
+            v8: 'Aktifkan Kartu',
+            v9: 'Jumlah Isi Ulang Default',
+            v10: 'Tarik ke Dompet',
+            v11: 'Setor ke Dompet',
+            v12: 'Permohonan Isi Ulang Kartu',
+            v13: 'Persetujuan Isi Ulang',
+            v14: 'Bekukan',
+            v15: 'Cairkan',
+            v16: 'Ubah Kata Sandi',
+            v17: 'Akun CID Operator',
+        },
+        Msg: {
+            m1: 'Aplikasi kartu Anda telah diajukan, dan Anda akan diberitahukan melalui email setelah disetujui!',
+            m2: 'Aplikasi setoran Anda telah diajukan, dan diharapkan akan dikreditkan dalam 1-3 hari kerja setelah disetujui!',
+            m3: 'Informasi aktivasi kartu bank Anda telah diajukan.',
+            m4: 'Kartu bank Anda telah dibekukan dengan sukses!',
+            m5: 'Kartu bank Anda telah dibuka bekunya dengan sukses!',
+            m6: 'Kata sandi kartu bank Anda telah diubah dengan sukses!',
+            m7: 'Setoran Berhasil',
+            m8: 'Salin Berhasil!',
+            m9: 'Salin Gagal!',
+            m10: 'Kartu bank Anda telah dibekukan, harap aktifkan sebelum melanjutkan!',
+            m11: 'Tidak ada tipe kartu yang tersedia untuk aplikasi',
+            m12: 'Anda saat ini tidak memiliki akses, harap hubungi administrator!',
+            m13: 'Prompt Hapus',
+            m14: 'Apakah Anda yakin ingin menghapus aturan ini?',
+            m15: 'Pembaruan Berhasil',
+            m16: 'Foto ID depan berhasil diunggah',
+            m17: 'Foto ID belakang berhasil diunggah',
+            m18: 'Foto ID di tangan berhasil diunggah',
+            m19: 'Ukuran gambar profil yang diunggah tidak boleh melebihi 2MB!',
+            m20: 'Gambar profil yang diunggah harus dalam format JPG/PNG!',
+        },
+        Info: {
+            s0: 'Pekerjaan dan Keuangan (Opsional)',
+            s0_1: 'Pekerjaan dan Keuangan',
+            s1: 'Informasi Pribadi',
+            s2: 'Verifikasi Identitas',
+            s3: 'Peninjauan',
+            s4: 'Informasi Anda telah diverifikasi, dan Anda dapat mengajukan permohonan kartu di halaman aplikasi kartu.',
+            s5: 'Tim kami akan meninjau aplikasi dan dokumen KYC Anda. Setelah disetujui, Anda akan menerima email konfirmasi.',
+            s6: 'Sedang Ditinjau',
+            s7: 'Terverifikasi',
+            s8: 'Pemegang Kartu',
+            s9: 'Tanggal Kedaluwarsa',
+            s10: 'Ajukan Kartu',
+            s11: 'Harap ikuti langkah-langkah untuk mengajukan kartu.',
+            s12: 'Proses Aplikasi',
+            s13: 'Pilih Kartu:',
+            s14: 'Harap pilih tipe kartu yang Anda butuhkan.',
+            s15: 'Konfirmasi Informasi:',
+            s16: 'Harap konfirmasi informasi Anda.',
+            s17: 'Peninjauan Aplikasi:',
+            s18: 'Tim kami akan meninjau aplikasi Anda, dan setelah disetujui, Anda akan menerima email konfirmasi.',
+            s19: 'Penerbitan Kartu:',
+            s20: 'Kartu akan dikirim ke alamat terdaftar Anda dalam 5-7 hari kerja setelah peninjauan disetujui.',
+            s21: 'Jika Anda memiliki pertanyaan atau membutuhkan bantuan, jangan ragu untuk menghubungi tim layanan pelanggan kami. Kami berharap Anda memiliki pengalaman yang meny愉 dengan kartu!',
+            s22: 'Terima Kartu:',
+            s23: 'Harap pastikan amplop dalam keadaan utuh saat menerima kartu.',
+            s24: 'Aktivasi Online:',
+            s25: 'Pergi ke pusat pelanggan CWG Markets dan masuk ke halaman \'Aktifkan Kartu\', masukkan nomor kartu dan kode aktivasi (disertakan dengan kartu).',
+            s26: 'Atur PIN:',
+            s27: 'Ikuti petunjuk untuk mengatur Nomor Identifikasi Pribadi (PIN), yang digunakan untuk penarikan ATM dan pembayaran belanja.',
+            s28: 'Mulai Menggunakan:',
+            s29: 'Setelah diaktifkan, Anda dapat mulai menggunakan Kartu Debit Visa Anda untuk berbelanja dan penarikan.',
+            s30: 'Kartu ini mendukung: Wechatpay, Alipay, Applepay, dan pembayaran elektronik lainnya, serta penarikan POS dan ATM domestik dan internasional.',
+            s31: 'Kami telah menerima aplikasi kartu Anda. Harap tunggu pihak ketiga menyelesaikan prosedur pemotongan. Setelah pemotongan berhasil, kami akan segera mengajukan aplikasi kartu Anda!',
+            s32: 'Pemotongan gagal, biaya layanan akan dikembalikan ke akun Anda, harap ajukan ulang untuk kartu!',
+            s33: 'Pemotongan gagal, biaya layanan telah dikembalikan ke akun Anda, harap ajukan ulang untuk kartu!',
+            s34: 'Biaya layanan aplikasi kartu Anda telah berhasil dipotong, kami akan segera mengajukan aplikasi kartu Anda!',
+            s35: 'Aplikasi kartu Anda tidak disetujui, harap hubungi staf untuk menyelesaikan masalah!',
+            s36: 'Aplikasi kartu Anda telah disetujui dan akan dikirim ke alamat terdaftar Anda dalam 5-7 hari kerja.',
+            s37: 'Maaf, aplikasi kartu Anda tidak disetujui, harap ajukan ulang.',
+            s38: 'Aplikasi kartu Anda telah diajukan untuk tinjauan pihak ketiga, dan kartu akan dikirim ke alamat terdaftar Anda dalam 5-7 hari kerja setelah disetujui.',
+            s39: 'Status Biaya Layanan',
+            s40: 'Status Persetujuan',
+            s41: 'Status Kartu',
+            s42: 'Tim kami telah menerima informasi Anda. Silakan pindai kode QR di bawah ini untuk menyelesaikan verifikasi identitas.',
+            s43: 'Informasi pendaftaran Anda telah berhasil diperbarui.',
+            t1: 'Menunggu Peninjauan',
+            t2: 'Peninjauan Disetujui',
+            t3: 'Peninjauan Ditolak',
+            t5: 'Proses',
+            t6: 'Pembuatan Kartu Berhasil',
+            t7: 'Pembuatan Kartu Gagal',
+            t8: 'Pemotongan Berhasil',
+            t9: 'Pemotongan Gagal',
+            t10: 'Menunggu',
+            t11: 'Pengembalian Dana',
+            t12: 'Pengembalian Dana Berhasil',
+            t13: 'Pengembalian Dana Gagal',
+            t15: 'Status:',
+            t16: 'Pembuatan Kartu Sedang Berlangsung (Harap bersabar)',
+            t17: 'Pembuatan Kartu Gagal (Harap tunggu pengembalian dana dan ajukan ulang)',
+            t18: 'Pembuatan Kartu Berhasil (Harap aktifkan kartu Anda)',
+            t19: 'Aktivasi Kartu Sedang Berlangsung (Harap bersabar)',
+            t20: 'Aktivasi Kartu Gagal (Harap aktifkan ulang kartu Anda)',
+        },
+        Form: {
+            v1: 'Laki-laki',
+            v2: 'Perempuan',
+            v3: 'Kartu ID Hong Kong',
+            v4: 'Paspor',
+            v5: 'SIM',
+            v6: 'ID yang Dikeluarkan Pemerintah',
+            f1: 'Kode Area',
+            f2: 'Nomor Telepon',
+            f3: 'Email',
+            f4: 'Nama Belakang',
+            f5: 'Nama Depan',
+            f6: 'Tanggal Lahir',
+            f7: 'Kewarganegaraan',
+            f8: 'Jenis Kelamin',
+            f9: 'Kota',
+            f10: 'Alamat',
+            f11: 'Kode Pos',
+            f12: 'Pekerjaan',
+            f13: 'Pendapatan Tahunan',
+            f14: 'Tujuan Akun',
+            f15: 'Perkiraan Volume Perdagangan Bulanan',
+            f16: 'Tipe ID',
+            f17: 'Nomor ID',
+            f18: 'Nomor Jaminan Sosial',
+            f19: 'Tanggal Penerbitan ID',
+            f20: 'Tanggal Kedaluwarsa ID',
+            f21: 'Foto ID Depan',
+            f22: 'Foto ID Belakang',
+            f23: 'Foto ID di Tangan',
+            f24: 'Nomor Kartu Bank',
+            f25: 'Kata Sandi Transaksi',
+            f26: 'Kode Aktivasi',
+            f27: 'Catatan',
+            f28: 'Jumlah Setoran',
+            f29: 'Mata Uang',
+            f30: 'Biaya Transaksi',
+            f31: 'Jumlah yang Diterima',
+            f32: 'Mata Uang yang Diterima',
+            f33: 'Waktu Aplikasi',
+            f34: 'Konfirmasi Kata Sandi',
+            f35: 'Nomor Referensi Transaksi',
+            f36: 'Mata Uang Transaksi',
+            f37: 'Jumlah Transaksi',
+            f38: 'Jumlah yang Diberikan',
+            f39: 'Mata Uang yang Diberikan',
+            f40: 'Biaya yang Diberikan',
+            f41: 'Nama Merchant',
+            f42: 'Jenis Transaksi',
+            f43: 'Waktu Transaksi',
+            f44: 'Biaya Transaksi Lintas Batas',
+            f45: 'Status',
+            f46: 'Deskripsi Transaksi',
+            f47: 'Status Biaya',
+            f48: 'Jenis Kartu',
+            f49: 'Nama Kartu',
+            f50: 'Status Kartu',
+            f51: 'Waktu',
+            f52: 'Tipe',
+            f53: 'Status Persetujuan',
+            f54: 'Status Setoran',
+            f55: 'Jumlah',
+            f56: 'Saldo Dompet:',
+            f57: 'Semua',
+            f58: 'Tarif Biaya:',
+            f59: 'Perkiraan Biaya:',
+        },
+        vaildate: {
+            v1: 'Harap pilih kode area',
+            v2: 'Harap masukkan nomor telepon dengan 5-20 digit',
+            v3: 'Harap masukkan nama depan, hanya karakter bahasa Inggris, [2...23] karakter. Panjang total nama depan dan nama belakang tidak boleh melebihi 23 karakter (termasuk spasi)',
+            v4: 'Harap masukkan nama belakang, hanya karakter bahasa Inggris, [2...23] karakter. Panjang total nama depan dan nama belakang tidak boleh melebihi 23 karakter (termasuk spasi)',
+            v5: 'Harap pilih tanggal lahir',
+            v6: 'Harap pilih kewarganegaraan',
+            v7: 'Harap pilih kota',
+            v8: 'Harap masukkan kode pos',
+            v9: 'Harap pilih jenis kelamin',
+            v10: 'Harap pilih pekerjaan',
+            v11: 'Harap masukkan pendapatan tahunan, misalnya, 200000 USD',
+            v12: 'Harap masukkan tujuan akun, hanya bahasa Inggris, misalnya, Pengeluaran Hidup',
+            v13: 'Harap masukkan perkiraan volume perdagangan bulanan, misalnya, 100000 USD',
+            v14: 'Harap pilih tipe ID',
+            v15: 'Harap masukkan nomor ID',
+            v16: 'Harap masukkan nomor jaminan sosial 9 digit',
+            v17: 'Harap pilih tanggal penerbitan ID',
+            v18: 'Harap pilih tanggal kedaluwarsa ID',
+            v19: 'Harap pilih file foto ID depan',
+            v20: 'Harap pilih file foto ID belakang',
+            v21: 'Harap pilih file foto ID di tangan',
+            v22: 'Harap masukkan nomor kartu',
+            v23: 'Harap masukkan kata sandi transaksi 6 digit',
+            v24: 'Harap masukkan kode aktivasi',
+            v25: 'Harap masukkan catatan',
+            v26: 'Harap masukkan jumlah setoran',
+            v27: 'Harap masukkan alamat',
+            v28: 'Harap masukkan email',
+            v29: 'Kata sandi tidak cocok',
+            v30: 'Harap pilih file foto ID di tangan',
+            v31: 'Harap masukkan kata sandi lagi',
+            v32: 'Gunakan 6 digit',
+            v33: 'Tidak boleh menggunakan digit berurutan atau yang sama',
+            v34: 'Jumlah harus lebih besar dari 0',
+            v35: 'Jumlah setoran tidak boleh melebihi',
+            v36: 'Jumlah setoran tidak boleh kurang dari',
+            v37: 'Jumlah setoran tidak boleh melebihi',
+            v38: 'Hanya karakter bahasa Inggris yang diperbolehkan (termasuk spasi)',
+            v39: 'Panjang harus antara 2 dan 23 karakter',
+            v40: 'Panjang total nama depan dan nama belakang tidak boleh melebihi 23 karakter (termasuk spasi)',
+        },
+        Btn: {
+            Next: 'Berikutnya',
+            Previous: 'Sebelumnya',
+            Submit: 'Kirim',
+            Confirm: 'Konfirmasi',
+            Cancel: 'Batal',
+            Update: 'Perbarui',
+            Auth: 'Verifikasi',
+            Freeze: 'Beku',
+            Unfreeze: 'Buka Beku',
+            Recharge: 'Isi Ulang',
+            Activate: 'Aktifkan',
+            b1: 'Aktifkan Kartu',
+            b2: 'Lihat',
+            b3: 'Aplikasi Isi Ulang',
+            b4: 'Ganti Kata Sandi',
+            b5: 'Bekukan Kartu',
+            b6: 'Buka Beku Kartu',
+            b7: 'Ajukan Kartu',
+            b8: 'Dapatkan Kode Aktivasi',
+            b9: 'Salin Kode Aktivasi',
+            b10: 'Saldo',
+            b11: 'Periksa Status Aplikasi Kartu',
+            b12: 'Ajukan Ulang Kartu',
+            b13: 'Mengaktifkan',
+            b14: 'Membuka Beku',
+            b15: 'Membekukan',
+            b16: 'Tutup',
+        },
+        New: {
+            n0: 'Panjang alamat 2–200 karakter, hanya huruf, angka, tanda hubung, dan spasi yang diizinkan',
+            n1: 'Panjang alamat 2–40 karakter, hanya huruf, angka, tanda hubung, dan spasi yang diizinkan',
+            n2: 'Kode pos harus terdiri dari 2–15 karakter',
+            n3: 'Usia Anda di bawah 18 tahun',
+            n4: 'Harga:',
+            n5: 'Apakah pemegang kartu diperlukan saat membuka kartu:',
+            n6: 'Mata uang yang didukung untuk isi ulang:',
+            n7: 'Jumlah isi ulang minimum:',
+            n8: 'Jumlah isi ulang minimum:',
+            n9: 'Tarif biaya:',
+            n10: 'Metode pemotongan',
+            n11: 'Alamat Bahasa Inggris',
+        },
+        Transactions: {
+            t1: 'Otorisasi',
+            t2: 'Pengembalian Dana',
+            t3: 'Verifikasi',
+            t4: 'Pembatalan',
+            t5: 'Biaya Kartu (Bulanan, Tahunan, Penarikan ATM....)',
+            t6: 'Transfer Keluar',
+            t7: 'Penyesuaian Penyelesaian',
+            t8: 'Cek Saldo',
+            t9: 'Biaya',
+            t10: 'Transaksi',
+            t11: 'Transaksi Gagal',
+            t12: 'Pengembalian Dana',
+            t13: 'Pembatalan',
+            t14: 'Lainnya',
+            t15: 'Verifikasi Kartu Terhubung',
+            t16: 'Biaya Administrasi',
+            t17: 'Penyelesaian',
+            t18: 'Berhasil',
+            t19: 'Koreksi',
+            t20: 'Dikoreksi',
+            t21: 'Dibatalkan',
+            t22: 'Pembatalan',
+            t23: 'Pengembalian Barang',
+            t24: 'Disetujui',
+            t25: 'Gagal',
+            t26: 'Pengembalian',
+        },
+        New1: {
+            title: 'Lengkapi Informasi',
+            f1: 'Foto ID Anda telah berhasil diunggah, harap tunggu hasil review!',
+            f2: 'Unggah Berhasil',
+            f3: 'Pindai kode QR untuk mengunggah ID Anda',
+            f4: 'Apakah Anda ingin mengunggah foto ID secara manual?',
+            d1: 'Unggah foto depan kartu ID Anda',
+            d2: 'Unggah foto belakang kartu ID Anda',
+            d3: 'Unggah foto Anda memegang kartu ID Anda',
+            d4: 'Klik untuk memilih file',
+            d5: 'Unggah Berhasil',
+            d6: 'Unggah Gagal',
+            d7: 'Sedang Mengunggah...',
+            d8: 'Negara Pengiriman',
+            d9: 'Kota Pengiriman',
+            d10: 'Alamat Pengiriman',
+            d11: 'Alamat Pengiriman dalam Bahasa Inggris',
+            d12: 'Kode Pos Pengiriman',
+            d13: 'Nomor Telepon Pengiriman',
+            d14: 'File tidak boleh lebih dari 2MB',
+            titel1: 'Pengaturan Bahasa',
+        },
+    },
+}

+ 437 - 0
src/i18n/locales/ko.ts

@@ -0,0 +1,437 @@
+export default {
+    'common': {
+        confirm: 'Confirm',
+        cancel: 'Cancel',
+        loading: 'Loading...',
+        success: 'Success',
+        fail: 'Failed',
+        input: 'Please input',
+        choose: 'Please choose',
+        country: 'Type a currency / country',
+        error: 'System Error',
+        copy1: 'Card number copied!',
+        copy2: 'CVV copied!',
+        copy3: 'Copy failed',
+    },
+
+    'language': {
+        title: '언어 설정',
+        selectLang: 'Select Language',
+        cn: '简体中文',
+        zh: '繁體中文',
+        en: 'English',
+        de: 'Deutsch',
+        es: 'Español',
+        ar: 'العربية',
+        id: 'Indonesian',
+        ms: 'Malay',
+        th: 'ไทย',
+        tr: 'Türkçe',
+        pt: 'Português',
+        ko: '한국어',
+        fa: 'فارسی',
+        vn: 'Tiếng Việt',
+        i0: 'Vertified',
+        i1: '언어 설정',
+        i2: 'Change Password',
+        i3: 'Personal Info',
+        i4: 'Card Opening Record',
+        i5: 'About PayouCard',
+        i6: 'Logout',
+    },
+    'improve-info': {
+        title: '정보 완료',
+        p3: 'Please enter the information',
+        p3_1: 'Please enter your last name',
+        p3_2: 'Please enter your first name',
+        p3_3: 'Please enter your mobile number',
+        p3_4: 'Please enter the detailed address',
+        p3_5: 'Please enter your email',
+        p4: 'Area Code',
+        p5: 'Select Area Code',
+        p6: 'Mobile',
+        p7: 'Email',
+        p8: 'Last Name',
+        p9: 'First Name',
+        p10: 'Birthday',
+        p11: 'Nationality',
+        p12: 'Select Nationality',
+        p13: 'Gender',
+        p14: 'Please Select',
+        p15: 'Male',
+        p16: 'Female',
+        p17: 'Country',
+        p18: 'Select Country',
+        p19: 'City',
+        p20: 'Select City',
+        p21: 'Detailed Address',
+        p22: 'Postal Code',
+        p23: 'Document Type',
+        p24: 'Select Document Type',
+        p25: 'ID Card',
+        p26: 'Passport',
+        p27: 'Document Number',
+        p28: 'Document Expiry',
+        p28_1: 'Upload Your ',
+        p28_2: 'Click to select file',
+        p29: 'Document Photo',
+        p30: 'Face Photo',
+        p31: 'Extended Field',
+        p32: 'Cancel',
+        p33: 'Submit',
+        p34: 'DLN',
+        p35: '政府签发的身份证',
+        kycSuccess: 'Information Completed',
+    },
+    'card': {
+        title: 'CWG 카드',
+        tab1: '입금 기록',
+        tab2: '거래 기록',
+        tab3: '개인 정보',
+        tab4: '비밀번호 변경',
+        tab5: 'CWG 카드',
+        tab6: '완료된 정보',
+        tab7: '입금 기록',
+        tab8: '거래 기록',
+        tab9: '카드 신청',
+        tab10: '활성화',
+        tab11: '카드 입금',
+        tab12: '비밀번호 변경',
+        tab13: '계좌 동결',
+        tab14: '계좌 해제',
+        tab15: '카드 신청 기록',
+        tab16: '카드 진행 상황',
+        tab17: '지갑 잔액 기록',
+        tab18: '카드 선택',
+        tab19: '정보 확인',
+        Status: {
+            t1: '성공',
+            t2: '실패',
+            t3: '처리 중',
+            t4: '승인됨',
+            t5: '대기 중',
+            t6: '카드 생성 성공',
+            t7: '카드 생성 실패',
+            t8: '차감 성공',
+            t9: '차감 실패',
+            t10: '환불 성공',
+            t11: '환불 실패',
+            t12: '환불 처리 중',
+            t13: '검토 대기 중',
+            t14: '검토 승인됨',
+            t15: '검토 거부됨',
+            t16: '출금',
+            t17: '입금',
+            t18: '환불',
+            t19: '수동 이체 입금',
+            t20: '수동 이체 출금',
+            t21: '모두',
+            v1: '등록 정보',
+            v2: '정보 수정',
+            v3: '얼굴 인증 링크 받기',
+            v4: '수동 KYC 검토',
+            v5: '카드 신청',
+            v6: '카드 승인',
+            v7: '활성화 코드 받기',
+            v8: '카드 활성화',
+            v9: '기본 충전 금액',
+            v10: '지갑으로 출금',
+            v11: '지갑으로 입금',
+            v12: '카드 충전 신청',
+            v13: '충전 승인',
+            v14: '동결',
+            v15: '해동',
+            v16: '비밀번호 변경',
+            v17: '운영자 CID 계정',
+        },
+        Msg: {
+            m1: '카드 신청이 제출되었습니다. 승인 후 이메일로 알림을 받게 됩니다!',
+            m2: '입금 신청이 제출되었습니다. 승인 후 1-3 영업일 내에 입금이 완료될 예정입니다!',
+            m3: '귀하의 은행 카드 활성화 정보가 제출되었습니다.',
+            m4: '귀하의 은행 카드가 성공적으로 동결되었습니다!',
+            m5: '귀하의 은행 카드가 성공적으로 해제되었습니다!',
+            m6: '귀하의 은행 카드 비밀번호가 성공적으로 변경되었습니다!',
+            m7: '입금 성공',
+            m8: '복사 성공!',
+            m9: '복사 실패!',
+            m10: '귀하의 은행 카드가 동결되었습니다. 진행하기 전에 카드를 활성화하세요!',
+            m11: '신청할 카드 종류가 없습니다',
+            m12: '현재 접근 권한이 없습니다. 관리자에게 문의하십시오!',
+            m13: '삭제 알림',
+            m14: '이 규칙을 삭제하시겠습니까?',
+            m15: '업데이트 성공',
+            m16: '앞면 ID 사진이 성공적으로 업로드되었습니다',
+            m17: '뒷면 ID 사진이 성공적으로 업로드되었습니다',
+            m18: 'ID 사진이 성공적으로 업로드되었습니다',
+            m19: '업로드된 프로필 이미지 크기는 2MB를 초과할 수 없습니다!',
+            m20: '업로드된 프로필 이미지는 JPG/PNG 형식이어야 합니다!',
+        },
+        Info: {
+            s0: '직업 및 재정 (선택 사항)',
+            s0_1: '직업 및 재정',
+            s1: '개인 정보',
+            s2: '신원 인증',
+            s3: '검토',
+            s4: '귀하의 정보가 인증되었습니다. 이제 카드 신청 페이지에서 카드를 신청하실 수 있습니다.',
+            s5: '우리 팀은 귀하의 신청서와 KYC 문서를 검토합니다. 승인 후 확인 이메일을 보내드립니다.',
+            s6: '검토 중',
+            s7: '인증됨',
+            s8: '카드 소지자',
+            s9: '만료 날짜',
+            s10: '카드 신청',
+            s11: '카드를 신청하려면 단계를 따르세요.',
+            s12: '신청 절차',
+            s13: '카드 선택:',
+            s14: '필요한 카드 유형을 선택하세요.',
+            s15: '정보 확인:',
+            s16: '귀하의 정보를 확인하세요.',
+            s17: '신청서 검토:',
+            s18: '우리 팀은 귀하의 신청서를 검토한 후, 승인이 완료되면 확인 이메일을 보내드립니다.',
+            s19: '카드 발급:',
+            s20: '카드는 검토 승인 후 5-7 영업일 이내에 귀하의 등록된 주소로 우편 발송됩니다.',
+            s21: '궁금한 사항이나 도움이 필요하시면 언제든지 고객 서비스 팀에 문의하십시오. 카드를 이용한 좋은 경험을 기원합니다!',
+            s22: '카드 수령:',
+            s23: '카드를 받을 때 봉투가 손상되지 않았는지 확인하세요.',
+            s24: '온라인 활성화:',
+            s25: 'CWG Markets 고객 센터로 이동하여 \'카드 활성화\' 페이지에 들어가 카드를 활성화 코드(카드와 함께 제공됨)와 함께 입력하세요.',
+            s26: 'PIN 코드 설정:',
+            s27: 'ATM 출금 및 쇼핑 결제에 사용할 개인 식별 번호(PIN)를 설정하라는 안내를 따르세요.',
+            s28: '사용 시작:',
+            s29: '카드가 활성화되면 Visa 직불 카드를 사용하여 지출 및 출금을 시작할 수 있습니다.',
+            s30: '이 카드는 Wechatpay, Alipay, Applepay 및 기타 전자 결제, 국내 및 국제 POS와 ATM 출금을 지원합니다.',
+            s31: '귀하의 카드 신청을 받았습니다. 제3자가 차감 절차를 완료할 때까지 기다려 주십시오. 차감이 성공적으로 완료되면 카드 신청을 즉시 제출하겠습니다!',
+            s32: '차감 실패, 서비스 요금은 귀하의 계좌로 환불됩니다. 카드를 다시 신청해 주세요!',
+            s33: '차감 실패, 서비스 요금은 귀하의 계좌로 환불되었습니다. 카드를 다시 신청해 주세요!',
+            s34: '귀하의 카드 신청 서비스 요금이 성공적으로 차감되었습니다. 카드 신청을 즉시 제출하겠습니다!',
+            s35: '귀하의 카드 신청이 승인되지 않았습니다. 문제를 해결하려면 직원에게 문의해 주세요!',
+            s36: '귀하의 카드가 승인되었으며 5-7 영업일 이내에 등록된 주소로 우편 발송됩니다.',
+            s37: '죄송합니다, 귀하의 카드 신청이 승인되지 않았습니다. 다시 신청해 주세요.',
+            s38: '귀하의 카드 신청이 제3자 검토를 위해 제출되었습니다. 카드가 승인되면 5-7 영업일 이내에 등록된 주소로 발송됩니다.',
+            s39: '서비스 요금 상태',
+            s40: '승인 상태',
+            s41: '카드 상태',
+            s42: '우리 팀은 귀하의 정보를 받았습니다. 아래 QR 코드를 스캔하여 신원 확인을 완료하십시오.',
+            s43: '귀하의 등록 정보가 성공적으로 업데이트되었습니다.',
+            t1: '검토 대기 중',
+            t2: '검토 승인됨',
+            t3: '검토 거부됨',
+            t5: '처리 중',
+            t6: '카드 생성 성공',
+            t7: '카드 생성 실패',
+            t8: '차감 성공',
+            t9: '차감 실패',
+            t10: '대기 중',
+            t11: '환불 중',
+            t12: '환불 성공',
+            t13: '환불 실패',
+            t15: '상태:',
+            t16: '카드 생성 진행 중 (기다려 주세요)',
+            t17: '카드 생성 실패 (환불을 기다린 후 다시 신청해 주세요)',
+            t18: '카드 생성 성공 (카드를 활성화해 주세요)',
+            t19: '카드 활성화 진행 중 (기다려 주세요)',
+            t20: '카드 활성화 실패 (카드를 다시 활성화해 주세요)',
+        },
+        Form: {
+            v1: '남성',
+            v2: '여성',
+            v3: '홍콩 ID 카드',
+            v4: '여권',
+            v5: '운전 면허증',
+            v6: '정부 발행 ID',
+            f1: '지역 코드',
+            f2: '전화 번호',
+            f3: '이메일',
+            f4: '성',
+            f5: '이름',
+            f6: '생년월일',
+            f7: '국적',
+            f8: '성별',
+            f9: '도시',
+            f10: '주소',
+            f11: '우편번호',
+            f12: '직업',
+            f13: '연간 수입',
+            f14: '계좌 목적',
+            f15: '예상 월 거래량',
+            f16: 'ID 유형',
+            f17: 'ID 번호',
+            f18: '사회 보장 번호',
+            f19: 'ID 발급일',
+            f20: 'ID 만료일',
+            f21: '앞면 ID 사진',
+            f22: '뒷면 ID 사진',
+            f23: '손에 든 ID 사진',
+            f24: '은행 카드 번호',
+            f25: '거래 비밀번호',
+            f26: '활성화 코드',
+            f27: '비고',
+            f28: '입금 금액',
+            f29: '통화',
+            f30: '거래 수수료',
+            f31: '수신 금액',
+            f32: '수신 통화',
+            f33: '신청 시간',
+            f34: '비밀번호 확인',
+            f35: '거래 참조 번호',
+            f36: '거래 통화',
+            f37: '거래 금액',
+            f38: '승인 금액',
+            f39: '승인 통화',
+            f40: '승인 수수료',
+            f41: '상점 이름',
+            f42: '거래 유형',
+            f43: '거래 시간',
+            f44: '국경 간 거래 수수료',
+            f45: '상태',
+            f46: '거래 설명',
+            f47: '수수료 상태',
+            f48: '카드 유형',
+            f49: '카드 이름',
+            f50: '카드 상태',
+            f51: '시간',
+            f52: '유형',
+            f53: '승인 상태',
+            f54: '입금 상태',
+            f55: '금액',
+            f56: '지갑 잔액:',
+            f57: '모두',
+            f58: '수수료율:',
+            f59: '예상 수수료:',
+        },
+        vaildate: {
+            v1: '지역 코드를 선택하십시오',
+            v2: '5-20 자의 전화 번호를 입력하십시오',
+            v3: '이름을 입력하십시오, 영어 문자만 사용 가능, [2...23]자. 첫 번째와 두 번째 이름의 총 길이는 23자를 초과할 수 없습니다(공백 포함)',
+            v4: '성씨를 입력하십시오, 영어 문자만 사용 가능, [2...23]자. 첫 번째와 두 번째 이름의 총 길이는 23자를 초과할 수 없습니다(공백 포함)',
+            v5: '생년월일을 선택하십시오',
+            v6: '국적을 선택하십시오',
+            v7: '도시를 선택하십시오',
+            v8: '우편번호를 입력하십시오',
+            v9: '성별을 선택하십시오',
+            v10: '직업을 선택하십시오',
+            v11: '연간 수입을 입력하십시오, 예: 200000 USD',
+            v12: '계좌 목적을 입력하십시오, 영어만 사용 가능, 예: 생활비',
+            v13: '예상 월 거래량을 입력하십시오, 예: 100000 USD',
+            v14: 'ID 유형을 선택하십시오',
+            v15: 'ID 번호를 입력하십시오',
+            v16: '9자리 사회 보장 번호를 입력하십시오',
+            v17: 'ID 발급일을 선택하십시오',
+            v18: 'ID 만료일을 선택하십시오',
+            v19: '앞면 ID 사진 파일을 선택하십시오',
+            v20: '뒷면 ID 사진 파일을 선택하십시오',
+            v21: '손에 든 ID 사진 파일을 선택하십시오',
+            v22: '카드 번호를 입력하십시오',
+            v23: '6자리 거래 비밀번호를 입력하십시오',
+            v24: '활성화 코드를 입력하십시오',
+            v25: '비고를 입력하십시오',
+            v26: '입금 금액을 입력하십시오',
+            v27: '주소를 입력하십시오',
+            v28: '이메일을 입력하십시오',
+            v29: '비밀번호가 일치하지 않습니다',
+            v30: '손에 든 ID 사진 파일을 선택하십시오',
+            v31: '비밀번호를 다시 입력하십시오',
+            v32: '6자 사용',
+            v33: '연속되거나 반복된 숫자는 사용할 수 없습니다',
+            v34: '금액은 0보다 커야 합니다',
+            v35: '입금 금액은 초과할 수 없습니다',
+            v36: '입금 금액은 적을 수 없습니다',
+            v37: '입금 금액은 초과할 수 없습니다',
+            v38: '영어 문자만 사용 가능(공백 포함)',
+            v39: '길이는 2에서 23자 사이여야 합니다',
+            v40: '첫 번째와 두 번째 이름의 총 길이는 23자를 초과할 수 없습니다(공백 포함)',
+        },
+        Btn: {
+            Next: '다음',
+            Previous: '이전',
+            Submit: '제출',
+            Confirm: '확인',
+            Cancel: '취소',
+            Update: '업데이트',
+            Auth: '인증',
+            Freeze: '동결',
+            Unfreeze: '해제',
+            Recharge: '충전',
+            Activate: '활성화',
+            b1: '카드 활성화',
+            b2: '보기',
+            b3: '충전 신청',
+            b4: '비밀번호 변경',
+            b5: '카드 동결',
+            b6: '카드 해제',
+            b7: '카드 신청',
+            b8: '활성화 코드 받기',
+            b9: '활성화 코드 복사',
+            b10: '잔액',
+            b11: '카드 신청 상태 확인',
+            b12: '카드 재신청',
+            b13: '활성화 중',
+            b14: '해제 중',
+            b15: '동결 중',
+            b16: '닫기',
+        },
+        New: {
+            n0: '주소 길이는 2~200자이며 문자, 숫자, 하이픈, 공백만 허용됩니다',
+            n1: '주소 길이는 2~40자이며 문자, 숫자, 하이픈, 공백만 허용됩니다',
+            n2: '우편번호는 2~15자여야 합니다',
+            n3: '만 18세 미만입니다',
+            n4: '가격:',
+            n5: '카드 개설 시 카드 소유자가 필요합니까:',
+            n6: '지원되는 충전 통화:',
+            n7: '최소 충전 금액:',
+            n8: '최소 충전 금액:',
+            n9: '수수료율:',
+            n10: '공제 방식',
+            n11: '영문 주소',
+        },
+        Transactions: {
+            t1: '승인',
+            t2: '환불',
+            t3: '인증',
+            t4: '취소',
+            t5: '카드 수수료 (월간, 연간, ATM 인출 수수료....)',
+            t6: '출금 이체',
+            t7: '정산 조정',
+            t8: '잔액 조회',
+            t9: '수수료',
+            t10: '소비',
+            t11: '소비 실패',
+            t12: '환불',
+            t13: '취소',
+            t14: '기타',
+            t15: '카드 연결 인증 거래',
+            t16: '관리비',
+            t17: '정산',
+            t18: '성공',
+            t19: '정정',
+            t20: '정정됨',
+            t21: '취소됨',
+            t22: '취소',
+            t23: '반품',
+            t24: '승인됨',
+            t25: '실패',
+            t26: '반품',
+        },
+        New1: {
+            title: '정보 완료',
+            f1: '당신의 신분증 사진이 성공적으로 업로드되었습니다. 검토 결과를 기다려주세요!',
+            f2: '업로드 성공',
+            f3: 'QR 코드를 스캔하여 신분증을 업로드하세요',
+            f4: '신분증 사진을 수동으로 업로드하시겠습니까?',
+            d1: '신분증 앞면 사진을 업로드하세요',
+            d2: '신분증 뒷면 사진을 업로드하세요',
+            d3: '신분증을 들고 있는 사진을 업로드하세요',
+            d4: '파일 선택을 클릭하세요',
+            d5: '업로드 성공',
+            d6: '업로드 실패',
+            d7: '업로드 중...',
+            d8: '발송 국가',
+            d9: '발송 도시',
+            d10: '발송 주소',
+            d11: '영어 발송 주소',
+            d12: '발송 우편번호',
+            d13: '발송 전화번호',
+            d14: '파일 크기는 2MB를 초과할 수 없습니다',
+            titel1: '언어 설정',
+        },
+    },
+}

+ 437 - 0
src/i18n/locales/ms.ts

@@ -0,0 +1,437 @@
+export default {
+    'common': {
+        confirm: 'Confirm',
+        cancel: 'Cancel',
+        loading: 'Loading...',
+        success: 'Success',
+        fail: 'Failed',
+        input: 'Please input',
+        choose: 'Please choose',
+        country: 'Type a currency / country',
+        error: 'System Error',
+        copy1: 'Card number copied!',
+        copy2: 'CVV copied!',
+        copy3: 'Copy failed',
+    },
+
+    'language': {
+        title: 'Tetapan Bahasa',
+        selectLang: 'Select Language',
+        cn: '简体中文',
+        zh: '繁體中文',
+        en: 'English',
+        de: 'Deutsch',
+        es: 'Español',
+        ar: 'العربية',
+        id: 'Indonesian',
+        ms: 'Malay',
+        th: 'ไทย',
+        tr: 'Türkçe',
+        pt: 'Português',
+        ko: '한국어',
+        fa: 'فارسی',
+        vn: 'Tiếng Việt',
+        i0: 'Vertified',
+        i1: 'Tetapan Bahasa',
+        i2: 'Change Password',
+        i3: 'Personal Info',
+        i4: 'Card Opening Record',
+        i5: 'About PayouCard',
+        i6: 'Logout',
+    },
+    'improve-info': {
+        title: 'Lengkapkan Maklumat',
+        p3: 'Please enter the information',
+        p3_1: 'Please enter your last name',
+        p3_2: 'Please enter your first name',
+        p3_3: 'Please enter your mobile number',
+        p3_4: 'Please enter the detailed address',
+        p3_5: 'Please enter your email',
+        p4: 'Area Code',
+        p5: 'Select Area Code',
+        p6: 'Mobile',
+        p7: 'Email',
+        p8: 'Last Name',
+        p9: 'First Name',
+        p10: 'Birthday',
+        p11: 'Nationality',
+        p12: 'Select Nationality',
+        p13: 'Gender',
+        p14: 'Please Select',
+        p15: 'Male',
+        p16: 'Female',
+        p17: 'Country',
+        p18: 'Select Country',
+        p19: 'City',
+        p20: 'Select City',
+        p21: 'Detailed Address',
+        p22: 'Postal Code',
+        p23: 'Document Type',
+        p24: 'Select Document Type',
+        p25: 'ID Card',
+        p26: 'Passport',
+        p27: 'Document Number',
+        p28: 'Document Expiry',
+        p28_1: 'Upload Your ',
+        p28_2: 'Click to select file',
+        p29: 'Document Photo',
+        p30: 'Face Photo',
+        p31: 'Extended Field',
+        p32: 'Cancel',
+        p33: 'Submit',
+        p34: 'DLN',
+        p35: '政府签发的身份证',
+        kycSuccess: 'Information Completed',
+    },
+    'card': {
+        title: 'Kad CWG',
+        tab1: 'Rekod Deposit',
+        tab2: 'Rekod Transaksi',
+        tab3: 'Maklumat Peribadi',
+        tab4: 'Tukar Kata Laluan',
+        tab5: 'Kad CWG',
+        tab6: 'Maklumat Lengkap',
+        tab7: 'Rekod Deposit',
+        tab8: 'Rekod Transaksi',
+        tab9: 'Mohon Kad',
+        tab10: 'Aktifkan',
+        tab11: 'Deposit Kad',
+        tab12: 'Tukar Kata Laluan',
+        tab13: 'Bekukan Akaun',
+        tab14: 'Buka Beku Akaun',
+        tab15: 'Rekod Permohonan Kad',
+        tab16: 'Kemajuan Kad',
+        tab17: 'Rekod Saldo Dompet',
+        tab18: 'Pilih Kad',
+        tab19: 'Sahkan Maklumat',
+        Status: {
+            t1: 'Berjaya',
+            t2: 'Gagal',
+            t3: 'Proses',
+            t4: 'Dibenarkan',
+            t5: 'Menunggu',
+            t6: 'Kad Berjaya Dicipta',
+            t7: 'Penciptaan Kad Gagal',
+            t8: 'Potongan Berjaya',
+            t9: 'Potongan Gagal',
+            t10: 'Pemulangan Berjaya',
+            t11: 'Pemulangan Gagal',
+            t12: 'Pemulangan Diproses',
+            t13: 'Menunggu Semakan',
+            t14: 'Semakan Dibenarkan',
+            t15: 'Semakan Ditolak',
+            t16: 'Pengeluaran',
+            t17: 'Deposit',
+            t18: 'Pemulangan',
+            t19: 'Pemindahan Manual Masuk',
+            t20: 'Pemindahan Manual Keluar',
+            t21: 'Semua',
+            v1: 'Maklumat Pendaftaran',
+            v2: 'Ubah Maklumat',
+            v3: 'Dapatkan Pautan Pengesahan Wajah',
+            v4: 'Semakan Manual KYC',
+            v5: 'Permohonan Kad',
+            v6: 'Kelulusan Kad',
+            v7: 'Dapatkan Kod Pengaktifan',
+            v8: 'Aktifkan Kad',
+            v9: 'Amaun Tambah Nilai Lalai',
+            v10: 'Keluarkan ke Dompet',
+            v11: 'Deposit ke Dompet',
+            v12: 'Permohonan Tambah Nilai Kad',
+            v13: 'Kelulusan Tambah Nilai',
+            v14: 'Bekukan',
+            v15: 'Nyah Beku',
+            v16: 'Tukar Kata Laluan',
+            v17: 'Akaun CID Pengendali',
+        },
+        Msg: {
+            m1: 'Permohonan kad anda telah dihantar, dan anda akan diberitahu melalui emel setelah diluluskan!',
+            m2: 'Permohonan deposit anda telah dihantar, dan dijangka akan dikreditkan dalam 1-3 hari bekerja selepas diluluskan!',
+            m3: 'Maklumat pengaktifan kad bank anda telah dihantar.',
+            m4: 'Kad bank anda telah berjaya dibekukan!',
+            m5: 'Kad bank anda telah berjaya dibuka bekunya!',
+            m6: 'Kata laluan kad bank anda telah berjaya ditukar!',
+            m7: 'Deposit Berjaya',
+            m8: 'Salinan Berjaya!',
+            m9: 'Salinan Gagal!',
+            m10: 'Kad bank anda telah dibekukan, sila aktifkan sebelum meneruskan!',
+            m11: 'Tiada jenis kad yang tersedia untuk permohonan',
+            m12: 'Anda kini tidak mempunyai akses, sila hubungi pentadbir!',
+            m13: 'Peringatan Padam',
+            m14: 'Adakah anda pasti mahu memadamkan peraturan ini?',
+            m15: 'Kemaskini Berjaya',
+            m16: 'Foto ID Depan dimuat naik dengan berjaya',
+            m17: 'Foto ID Belakang dimuat naik dengan berjaya',
+            m18: 'Foto ID di tangan dimuat naik dengan berjaya',
+            m19: 'Saiz imej profil yang dimuat naik tidak boleh melebihi 2MB!',
+            m20: 'Imej profil yang dimuat naik mestilah dalam format JPG/PNG!',
+        },
+        Info: {
+            s0: 'Pekerjaan dan Kewangan (Pilihan)',
+            s0_1: 'Pekerjaan dan Kewangan',
+            s1: 'Maklumat Peribadi',
+            s2: 'Pengesahan Identiti',
+            s3: 'Semakan',
+            s4: 'Maklumat anda telah disahkan, dan anda boleh memohon kad di halaman permohonan kad.',
+            s5: 'Pasukan kami akan menyemak permohonan dan dokumen KYC anda. Setelah diluluskan, anda akan menerima emel pengesahan.',
+            s6: 'Sedang Disemak',
+            s7: 'Disahkan',
+            s8: 'Pemegang Kad',
+            s9: 'Tarikh Tamat',
+            s10: 'Mohon Kad',
+            s11: 'Sila ikut langkah-langkah untuk memohon kad.',
+            s12: 'Proses Permohonan',
+            s13: 'Pilih Kad:',
+            s14: 'Sila pilih jenis kad yang anda perlukan.',
+            s15: 'Sahkan Maklumat:',
+            s16: 'Sila sahkan maklumat anda.',
+            s17: 'Semakan Permohonan:',
+            s18: 'Pasukan kami akan menyemak permohonan anda, dan setelah diluluskan, anda akan menerima emel pengesahan.',
+            s19: 'Penerbitan Kad:',
+            s20: 'Kad akan dihantar ke alamat berdaftar anda dalam 5-7 hari bekerja selepas semakan diluluskan.',
+            s21: 'Jika anda mempunyai sebarang pertanyaan atau memerlukan bantuan, sila hubungi pasukan khidmat pelanggan kami. Kami berharap anda mempunyai pengalaman yang meny愉kakan dengan kad ini!',
+            s22: 'Terima Kad:',
+            s23: 'Sila pastikan sampul kad dalam keadaan baik ketika menerima kad.',
+            s24: 'Aktivasi Dalam Talian:',
+            s25: 'Pergi ke pusat pelanggan CWG Markets dan masuk ke halaman \'Aktifkan Kad\', masukkan nombor kad dan kod aktivasi (disertakan bersama kad).',
+            s26: 'Tetapkan Kod PIN:',
+            s27: 'Ikuti arahan untuk menetapkan Nombor Pengenalan Peribadi (PIN) anda, yang digunakan untuk pengeluaran ATM dan pembayaran membeli-belah.',
+            s28: 'Mulakan Penggunaan:',
+            s29: 'Setelah diaktifkan, anda boleh mula menggunakan Kad Debit Visa untuk perbelanjaan dan pengeluaran.',
+            s30: 'Kad ini menyokong: Wechatpay, Alipay, Applepay, dan pembayaran elektronik lain, serta pengeluaran POS domestik dan antarabangsa dan ATM.',
+            s31: 'Kami telah menerima permohonan kad anda. Sila tunggu pihak ketiga melengkapkan prosedur untuk potongan. Setelah potongan berjaya, kami akan segera menghantar permohonan kad anda!',
+            s32: 'Potongan gagal, yuran perkhidmatan akan dikembalikan ke akaun anda, sila mohon kad semula!',
+            s33: 'Potongan gagal, yuran perkhidmatan telah dikembalikan ke akaun anda, sila mohon kad semula!',
+            s34: 'Yuran perkhidmatan permohonan kad anda telah berjaya dipotong, kami akan segera menghantar permohonan kad anda!',
+            s35: 'Permohonan kad anda tidak diluluskan, sila hubungi kakitangan untuk menyelesaikan isu ini!',
+            s36: 'Kad anda telah diluluskan dan akan dihantar ke alamat berdaftar anda dalam 5-7 hari bekerja.',
+            s37: 'Maaf, permohonan kad anda tidak diluluskan, sila mohon semula.',
+            s38: 'Permohonan kad anda telah dihantar untuk semakan pihak ketiga, dan kad akan dihantar ke alamat berdaftar anda dalam 5-7 hari bekerja selepas diluluskan.',
+            s39: 'Status Yuran Perkhidmatan',
+            s40: 'Status Persetujuan',
+            s41: 'Status Kad',
+            s42: 'Pasukan kami telah menerima maklumat anda. Sila imbas kod QR di bawah untuk melengkapkan pengesahan identiti.',
+            s43: 'Maklumat pendaftaran anda telah dikemas kini dengan jayanya.',
+            t1: 'Menunggu Semakan',
+            t2: 'Semakan Dibenarkan',
+            t3: 'Semakan Ditolak',
+            t5: 'Proses',
+            t6: 'Penciptaan Kad Berjaya',
+            t7: 'Penciptaan Kad Gagal',
+            t8: 'Potongan Berjaya',
+            t9: 'Potongan Gagal',
+            t10: 'Menunggu',
+            t11: 'Pemulangan',
+            t12: 'Pemulangan Berjaya',
+            t13: 'Pemulangan Gagal',
+            t15: 'Status:',
+            t16: 'Penciptaan Kad Sedang Diproses (Sila bersabar)',
+            t17: 'Penciptaan Kad Gagal (Sila tunggu pemulangan dan mohon semula)',
+            t18: 'Penciptaan Kad Berjaya (Sila aktifkan kad anda)',
+            t19: 'Aktivasi Kad Sedang Diproses (Sila bersabar)',
+            t20: 'Aktivasi Kad Gagal (Sila aktifkan semula kad anda)',
+        },
+        Form: {
+            v1: 'Lelaki',
+            v2: 'Perempuan',
+            v3: 'Kad Pengenalan Hong Kong',
+            v4: 'Pasport',
+            v5: 'Lesen memandu',
+            v6: 'Kad Pengenalan Dikeluarkan Kerajaan',
+            f1: 'Kod Kawasan',
+            f2: 'Nombor Telefon',
+            f3: 'Emel',
+            f4: 'Nama Belakang',
+            f5: 'Nama Depan',
+            f6: 'Tarikh Lahir',
+            f7: 'Warganegara',
+            f8: 'Jantina',
+            f9: 'Bandar',
+            f10: 'Alamat',
+            f11: 'Kod Pos',
+            f12: 'Pekerjaan',
+            f13: 'Pendapatan Tahunan',
+            f14: 'Tujuan Akaun',
+            f15: 'Jangkaan Jumlah Perdagangan Bulanan',
+            f16: 'Jenis ID',
+            f17: 'Nombor ID',
+            f18: 'Nombor Keselamatan Sosial',
+            f19: 'Tarikh Pengeluaran ID',
+            f20: 'Tarikh Tamat ID',
+            f21: 'Foto Depan ID',
+            f22: 'Foto Belakang ID',
+            f23: 'Foto ID Tangan',
+            f24: 'Nombor Kad Bank',
+            f25: 'Kata Laluan Transaksi',
+            f26: 'Kod Pengaktifan',
+            f27: 'Catatan',
+            f28: 'Jumlah Deposit',
+            f29: 'Mata Wang',
+            f30: 'Yuran Transaksi',
+            f31: 'Jumlah Diterima',
+            f32: 'Mata Wang Diterima',
+            f33: 'Masa Permohonan',
+            f34: 'Sahkan Kata Laluan',
+            f35: 'Nombor Rujukan Transaksi',
+            f36: 'Mata Wang Transaksi',
+            f37: 'Jumlah Transaksi',
+            f38: 'Jumlah Diluluskan',
+            f39: 'Mata Wang Diluluskan',
+            f40: 'Yuran Diluluskan',
+            f41: 'Nama Pedagang',
+            f42: 'Jenis Transaksi',
+            f43: 'Masa Transaksi',
+            f44: 'Yuran Transaksi Merentas Sempadan',
+            f45: 'Status',
+            f46: 'Penerangan Transaksi',
+            f47: 'Status Yuran',
+            f48: 'Jenis Kad',
+            f49: 'Nama Kad',
+            f50: 'Status Kad',
+            f51: 'Masa',
+            f52: 'Jenis',
+            f53: 'Status Kelulusan',
+            f54: 'Status Deposit',
+            f55: 'Jumlah',
+            f56: 'Baki Dompet:',
+            f57: 'Semua',
+            f58: 'Kadar Yuran:',
+            f59: 'Yuran Dianggarkan:',
+        },
+        vaildate: {
+            v1: 'Sila pilih kod kawasan',
+            v2: 'Sila masukkan nombor telefon dengan 5-20 digit',
+            v3: 'Sila masukkan nama pertama, hanya aksara Inggeris, [2...23] aksara. Jumlah panjang nama pertama dan terakhir tidak boleh melebihi 23 aksara (termasuk ruang)',
+            v4: 'Sila masukkan nama terakhir, hanya aksara Inggeris, [2...23] aksara. Jumlah panjang nama pertama dan terakhir tidak boleh melebihi 23 aksara (termasuk ruang)',
+            v5: 'Sila pilih tarikh lahir',
+            v6: 'Sila pilih warganegara',
+            v7: 'Sila pilih bandar',
+            v8: 'Sila masukkan kod pos',
+            v9: 'Sila pilih jantina',
+            v10: 'Sila pilih pekerjaan',
+            v11: 'Sila masukkan pendapatan tahunan, contohnya, 200000 USD',
+            v12: 'Sila masukkan tujuan akaun, hanya dalam Bahasa Inggeris, contohnya, Perbelanjaan Hidup',
+            v13: 'Sila masukkan jangkaan jumlah perdagangan bulanan, contohnya, 100000 USD',
+            v14: 'Sila pilih jenis ID',
+            v15: 'Sila masukkan nombor ID',
+            v16: 'Sila masukkan nombor keselamatan sosial 9 digit',
+            v17: 'Sila pilih tarikh pengeluaran ID',
+            v18: 'Sila pilih tarikh tamat ID',
+            v19: 'Sila pilih fail foto ID depan',
+            v20: 'Sila pilih fail foto ID belakang',
+            v21: 'Sila pilih fail foto ID tangan',
+            v22: 'Sila masukkan nombor kad',
+            v23: 'Sila masukkan kata laluan transaksi 6 digit',
+            v24: 'Sila masukkan kod pengaktifan',
+            v25: 'Sila masukkan catatan',
+            v26: 'Sila masukkan jumlah deposit',
+            v27: 'Sila masukkan alamat',
+            v28: 'Sila masukkan emel',
+            v29: 'Kata laluan tidak sepadan',
+            v30: 'Sila pilih fail foto ID tangan',
+            v31: 'Sila masukkan kata laluan sekali lagi',
+            v32: 'Gunakan 6 digit',
+            v33: 'Tidak boleh menggunakan digit berturut-turut atau digit berulang',
+            v34: 'Jumlah mesti lebih besar daripada 0',
+            v35: 'Jumlah deposit tidak boleh melebihi',
+            v36: 'Jumlah deposit tidak boleh kurang daripada',
+            v37: 'Jumlah deposit tidak boleh melebihi',
+            v38: 'Hanya aksara Inggeris dibenarkan (ruang juga termasuk)',
+            v39: 'Panjang mesti antara 2 dan 23 aksara',
+            v40: 'Jumlah panjang nama pertama dan terakhir tidak boleh melebihi 23 aksara (termasuk ruang)',
+        },
+        Btn: {
+            Next: 'Seterusnya',
+            Previous: 'Sebelumnya',
+            Submit: 'Hantar',
+            Confirm: 'Sahkan',
+            Cancel: 'Batal',
+            Update: 'Kemaskini',
+            Auth: 'Sahkan',
+            Freeze: 'Bekukan',
+            Unfreeze: 'Buka Beku',
+            Recharge: 'Isi Semula',
+            Activate: 'Aktifkan',
+            b1: 'Aktifkan Kad',
+            b2: 'Lihat',
+            b3: 'Permohonan Isi Semula',
+            b4: 'Tukar Kata Laluan',
+            b5: 'Bekukan Kad',
+            b6: 'Buka Beku Kad',
+            b7: 'Mohon Kad',
+            b8: 'Dapatkan Kod Pengaktifan',
+            b9: 'Salin Kod Pengaktifan',
+            b10: 'Baki',
+            b11: 'Semak Status Permohonan Kad',
+            b12: 'Mohon Semula Kad',
+            b13: 'Mengaktifkan',
+            b14: 'Membuka Beku',
+            b15: 'Membekukan',
+            b16: 'Tutup',
+        },
+        New: {
+            n0: 'Panjang alamat 2–200 aksara, hanya huruf, nombor, sengkang dan ruang dibenarkan',
+            n1: 'Panjang alamat 2–40 aksara, hanya huruf, nombor, sengkang dan ruang dibenarkan',
+            n2: 'Poskod mesti antara 2–15 aksara',
+            n3: 'Umur anda kurang daripada 18 tahun',
+            n4: 'Harga:',
+            n5: 'Adakah pemegang kad diperlukan semasa membuka kad:',
+            n6: 'Mata wang yang disokong untuk tambah nilai:',
+            n7: 'Jumlah tambah nilai minimum:',
+            n8: 'Jumlah tambah nilai minimum:',
+            n9: 'Kadar yuran:',
+            n10: 'Kaedah potongan',
+            n11: 'Alamat Bahasa Inggeris',
+        },
+        Transactions: {
+            t1: 'Kebenaran',
+            t2: 'Bayaran Balik',
+            t3: 'Pengesahan',
+            t4: 'Pembatalan',
+            t5: 'Yuran Kad (Bulanan, Tahunan, Pengeluaran ATM....)',
+            t6: 'Pemindahan Keluar',
+            t7: 'Pelarasan Penyelesaian',
+            t8: 'Semakan Baki',
+            t9: 'Yuran',
+            t10: 'Perbelanjaan',
+            t11: 'Perbelanjaan Gagal',
+            t12: 'Bayaran Balik',
+            t13: 'Pembatalan',
+            t14: 'Lain-lain',
+            t15: 'Pengesahan Pautan Kad',
+            t16: 'Yuran Pengurusan',
+            t17: 'Penyelesaian',
+            t18: 'Berjaya',
+            t19: 'Pembetulan',
+            t20: 'Dibalikkan',
+            t21: 'Dibatalkan',
+            t22: 'Pembatalan',
+            t23: 'Pemulangan',
+            t24: 'Dibenarkan',
+            t25: 'Gagal',
+            t26: 'Pemulangan',
+        },
+        New1: {
+            title: 'Lengkapkan Maklumat',
+            f1: 'Gambar ID anda telah berjaya dimuat naik, sila tunggu hasil semakan!',
+            f2: 'Muat Naik Berjaya',
+            f3: 'Imbas kod QR untuk memuat naik ID anda',
+            f4: 'Adakah anda ingin memuat naik gambar ID secara manual?',
+            d1: 'Muat naik gambar depan kad pengenalan anda',
+            d2: 'Muat naik gambar belakang kad pengenalan anda',
+            d3: 'Muat naik gambar anda memegang kad pengenalan',
+            d4: 'Klik untuk memilih fail',
+            d5: 'Muat Naik Berjaya',
+            d6: 'Muat Naik Gagal',
+            d7: 'Sedang dimuat naik...',
+            d8: 'Negara Penghantaran',
+            d9: 'Bandar Penghantaran',
+            d10: 'Alamat Penghantaran',
+            d11: 'Alamat Penghantaran dalam Bahasa Inggeris',
+            d12: 'Kod Pos Penghantaran',
+            d13: 'Nombor Telefon Penghantaran',
+            d14: 'Fail tidak boleh melebihi 2MB',
+            titel1: 'Tetapan Bahasa',
+        },
+    },
+}

+ 436 - 0
src/i18n/locales/pt.ts

@@ -0,0 +1,436 @@
+export default {
+    'common': {
+        confirm: 'Confirm',
+        cancel: 'Cancel',
+        loading: 'Loading...',
+        success: 'Success',
+        fail: 'Failed',
+        input: 'Please input',
+        choose: 'Please choose',
+        country: 'Type a currency / country',
+        error: 'System Error',
+        copy1: 'Card number copied!',
+        copy2: 'CVV copied!',
+        copy3: 'Copy failed',
+    },
+    'language': {
+        title: 'Configurações de Idioma',
+        selectLang: 'Select Language',
+        cn: '简体中文',
+        zh: '繁體中文',
+        en: 'English',
+        de: 'Deutsch',
+        es: 'Español',
+        ar: 'العربية',
+        id: 'Indonesian',
+        ms: 'Malay',
+        th: 'ไทย',
+        tr: 'Türkçe',
+        pt: 'Português',
+        ko: '한국어',
+        fa: 'فارسی',
+        vn: 'Tiếng Việt',
+        i0: 'Vertified',
+        i1: 'Configurações de Idioma',
+        i2: 'Change Password',
+        i3: 'Personal Info',
+        i4: 'Card Opening Record',
+        i5: 'About PayouCard',
+        i6: 'Logout',
+    },
+    'improve-info': {
+        title: 'Informações Completas',
+        p3: 'Please enter the information',
+        p3_1: 'Please enter your last name',
+        p3_2: 'Please enter your first name',
+        p3_3: 'Please enter your mobile number',
+        p3_4: 'Please enter the detailed address',
+        p3_5: 'Please enter your email',
+        p4: 'Area Code',
+        p5: 'Select Area Code',
+        p6: 'Mobile',
+        p7: 'Email',
+        p8: 'Last Name',
+        p9: 'First Name',
+        p10: 'Birthday',
+        p11: 'Nationality',
+        p12: 'Select Nationality',
+        p13: 'Gender',
+        p14: 'Please Select',
+        p15: 'Male',
+        p16: 'Female',
+        p17: 'Country',
+        p18: 'Select Country',
+        p19: 'City',
+        p20: 'Select City',
+        p21: 'Detailed Address',
+        p22: 'Postal Code',
+        p23: 'Document Type',
+        p24: 'Select Document Type',
+        p25: 'ID Card',
+        p26: 'Passport',
+        p27: 'Document Number',
+        p28: 'Document Expiry',
+        p28_1: 'Upload Your ',
+        p28_2: 'Click to select file',
+        p29: 'Document Photo',
+        p30: 'Face Photo',
+        p31: 'Extended Field',
+        p32: 'Cancel',
+        p33: 'Submit',
+        p34: 'DLN',
+        p35: '政府签发的身份证',
+        kycSuccess: 'Information Completed',
+    },
+    'card': {
+        title: 'Cartão CWG',
+        tab1: 'Registro de Depósitos',
+        tab2: 'Registro de Transações',
+        tab3: 'Informações Pessoais',
+        tab4: 'Alterar Senha',
+        tab5: 'Cartão CWG',
+        tab6: 'Informações Completas',
+        tab7: 'Registro de Depósitos',
+        tab8: 'Registro de Transações',
+        tab9: 'Solicitar Cartão',
+        tab10: 'Ativar',
+        tab11: 'Depósito de Cartão',
+        tab12: 'Alterar Senha',
+        tab13: 'Congelar Conta',
+        tab14: 'Descongelar Conta',
+        tab15: 'Registro de Solicitação de Cartão',
+        tab16: 'Progresso do Cartão',
+        tab17: 'Registro de Saldo da Carteira',
+        tab18: 'Selecionar Cartão',
+        tab19: 'Confirmar Informações',
+        Status: {
+            t1: 'Sucesso',
+            t2: 'Falha',
+            t3: 'Processando',
+            t4: 'Autorizado',
+            t5: 'Pendente',
+            t6: 'Cartão Criado com Sucesso',
+            t7: 'Falha na Criação do Cartão',
+            t8: 'Dedução Bem-Sucedida',
+            t9: 'Falha na Dedução',
+            t10: 'Reembolso Bem-Sucedido',
+            t11: 'Falha no Reembolso',
+            t12: 'Reembolso em Processamento',
+            t13: 'Aguardando Revisão',
+            t14: 'Revisão Aprovada',
+            t15: 'Revisão Rejeitada',
+            t16: 'Retirada',
+            t17: 'Depósito',
+            t18: 'Reembolso',
+            t19: 'Transferência Manual de Entrada',
+            t20: 'Transferência Manual de Saída',
+            t21: 'Todos',
+            v1: 'Informações de Registro',
+            v2: 'Modificar Informações',
+            v3: 'Obter Link de Verificação Facial',
+            v4: 'Revisão Manual KYC',
+            v5: 'Solicitação de Cartão',
+            v6: 'Aprovação de Cartão',
+            v7: 'Obter Código de Ativação',
+            v8: 'Ativar Cartão',
+            v9: 'Valor Padrão de Recarga',
+            v10: 'Retirar para a Carteira',
+            v11: 'Depositar na Carteira',
+            v12: 'Solicitação de Recarga de Cartão',
+            v13: 'Aprovação de Recarga',
+            v14: 'Congelar',
+            v15: 'Descongelar',
+            v16: 'Alterar Senha',
+            v17: 'Conta CID do Operador',
+        },
+        Msg: {
+            m1: 'Sua solicitação de cartão foi enviada e você será notificado por e-mail após a aprovação!',
+            m2: 'Sua solicitação de depósito foi enviada e espera-se que seja creditada em 1-3 dias úteis após a aprovação!',
+            m3: 'As informações de ativação do seu cartão bancário foram enviadas.',
+            m4: 'Seu cartão bancário foi congelado com sucesso!',
+            m5: 'Seu cartão bancário foi descongelado com sucesso!',
+            m6: 'A senha do seu cartão bancário foi alterada com sucesso!',
+            m7: 'Depósito Bem-Sucedido',
+            m8: 'Cópia Bem-Sucedida!',
+            m9: 'Falha na Cópia!',
+            m10: 'Seu cartão bancário foi congelado, por favor, ative-o antes de prosseguir!',
+            m11: 'Nenhum tipo de cartão disponível para solicitação',
+            m12: 'Você atualmente não tem acesso, por favor, entre em contato com o administrador!',
+            m13: 'Aviso de Exclusão',
+            m14: 'Tem certeza de que deseja excluir esta regra?',
+            m15: 'Atualização Bem-Sucedida',
+            m16: 'Foto da Frente do ID enviada com sucesso',
+            m17: 'Foto de Trás do ID enviada com sucesso',
+            m18: 'Foto de ID em Mão enviada com sucesso',
+            m19: 'O tamanho da imagem do perfil não pode exceder 2MB!',
+            m20: 'A imagem do perfil enviada deve estar no formato JPG/PNG!',
+        },
+        Info: {
+            s0: 'Ocupação e Finanças (Opcional)',
+            s0_1: 'Ocupação e Finanças',
+            s1: 'Informações Pessoais',
+            s2: 'Verificação de Identidade',
+            s3: 'Revisão',
+            s4: 'Suas informações foram verificadas e você pode solicitar um cartão na página de solicitação de cartão.',
+            s5: 'Nossa equipe irá revisar sua solicitação e documentos KYC. Após a aprovação, você receberá um e-mail de confirmação.',
+            s6: 'Em Revisão',
+            s7: 'Verificado',
+            s8: 'Titular do Cartão',
+            s9: 'Data de Expiração',
+            s10: 'Solicitar Cartão',
+            s11: 'Por favor, siga os passos para solicitar um cartão.',
+            s12: 'Processo de Solicitação',
+            s13: 'Selecionar Cartão:',
+            s14: 'Por favor, escolha o tipo de cartão que você precisa.',
+            s15: 'Confirmar Informações:',
+            s16: 'Por favor, confirme suas informações.',
+            s17: 'Revisão da Solicitação:',
+            s18: 'Nossa equipe irá revisar sua solicitação, e após a aprovação, você receberá um e-mail de confirmação.',
+            s19: 'Emissão do Cartão:',
+            s20: 'O cartão será enviado para o seu endereço registrado dentro de 5-7 dias úteis após a revisão ser aprovada.',
+            s21: 'Se você tiver alguma dúvida ou precisar de assistência, entre em contato com nossa equipe de atendimento ao cliente. Desejamos que você tenha uma ótima experiência com o cartão!',
+            s22: 'Receber Cartão:',
+            s23: 'Certifique-se de que o envelope esteja intacto ao receber o cartão.',
+            s24: 'Ativação Online:',
+            s25: 'Vá até o centro de atendimento ao cliente da CWG Markets e acesse a página \'Ativar Cartão\', insira seu número de cartão e código de ativação (fornecido com o cartão).',
+            s26: 'Definir PIN:',
+            s27: 'Siga as instruções para definir seu Número de Identificação Pessoal (PIN), usado para saques em caixas eletrônicos e pagamentos em compras.',
+            s28: 'Começar a Usar:',
+            s29: 'Após a ativação, você pode começar a usar seu Cartão de Débito Visa para gastos e retiradas.',
+            s30: 'Este cartão suporta: Wechatpay, Alipay, Applepay e outros pagamentos eletrônicos, além de retiradas domésticas e internacionais em POS e caixas eletrônicos.',
+            s31: 'Recebemos sua solicitação de cartão. Por favor, aguarde o terceiro concluir os procedimentos de dedução. Após a dedução ser bem-sucedida, enviaremos sua solicitação de cartão imediatamente!',
+            s32: 'Falha na dedução, a taxa de serviço será reembolsada para sua conta, por favor, reative a solicitação do cartão!',
+            s33: 'Falha na dedução, a taxa de serviço foi reembolsada para sua conta, por favor, reative a solicitação do cartão!',
+            s34: 'Sua taxa de serviço de solicitação de cartão foi deduzida com sucesso, enviaremos sua solicitação de cartão imediatamente!',
+            s35: 'Sua solicitação de cartão não foi aprovada, entre em contato com o pessoal para resolver o problema!',
+            s36: 'Seu cartão foi aprovado e será enviado para o seu endereço registrado dentro de 5-7 dias úteis.',
+            s37: 'Desculpe, sua solicitação de cartão não foi aprovada, por favor, reenvie a solicitação.',
+            s38: 'Sua solicitação de cartão foi enviada para revisão de terceiros, e o cartão será enviado para o seu endereço registrado dentro de 5-7 dias úteis após a aprovação.',
+            s39: 'Status da Taxa de Serviço',
+            s40: 'Status da Aprovação',
+            s41: 'Status do Cartão',
+            s42: 'Nossa equipe recebeu suas informações. Por favor, escaneie o código QR abaixo para completar a verificação de identidade.',
+            s43: 'As informações de seu registro foram atualizadas com sucesso.',
+            t1: 'Aguardando Revisão',
+            t2: 'Revisão Aprovada',
+            t3: 'Revisão Rejeitada',
+            t5: 'Processando',
+            t6: 'Criação do Cartão Bem-Sucedida',
+            t7: 'Falha na Criação do Cartão',
+            t8: 'Dedução Bem-Sucedida',
+            t9: 'Falha na Dedução',
+            t10: 'Pendente',
+            t11: 'Reembolsando',
+            t12: 'Reembolso Bem-Sucedido',
+            t13: 'Falha no Reembolso',
+            t15: 'Status:',
+            t16: 'Criação do Cartão em Andamento (Por favor, aguarde)',
+            t17: 'Falha na Criação do Cartão (Por favor, aguarde o reembolso e reaplique)',
+            t18: 'Criação do Cartão Bem-Sucedida (Por favor, ative seu cartão)',
+            t19: 'Ativação do Cartão em Andamento (Por favor, aguarde)',
+            t20: 'Falha na Ativação do Cartão (Por favor, reative seu cartão)',
+        },
+        Form: {
+            v1: 'Masculino',
+            v2: 'Feminino',
+            v3: 'Cartão de Identidade de Hong Kong',
+            v4: 'Passaporte',
+            v5: 'Carteira de habilitação',
+            v6: 'ID Emitido pelo Governo',
+            f1: 'Código de Área',
+            f2: 'Número de Telefone',
+            f3: 'Email',
+            f4: 'Sobrenome',
+            f5: 'Primeiro Nome',
+            f6: 'Data de Nascimento',
+            f7: 'Nacionalidade',
+            f8: 'Gênero',
+            f9: 'Cidade',
+            f10: 'Endereço',
+            f11: 'Código Postal',
+            f12: 'Ocupação',
+            f13: 'Renda Anual',
+            f14: 'Finalidade da Conta',
+            f15: 'Volume de Negociação Mensal Esperado',
+            f16: 'Tipo de ID',
+            f17: 'Número do ID',
+            f18: 'Número de Segurança Social',
+            f19: 'Data de Emissão do ID',
+            f20: 'Data de Expiração do ID',
+            f21: 'Foto Frontal do ID',
+            f22: 'Foto Traseira do ID',
+            f23: 'Foto do ID na Mão',
+            f24: 'Número do Cartão Bancário',
+            f25: 'Senha de Transação',
+            f26: 'Código de Ativação',
+            f27: 'Observações',
+            f28: 'Valor do Depósito',
+            f29: 'Moeda',
+            f30: 'Taxa de Transação',
+            f31: 'Valor Recebido',
+            f32: 'Moeda Recebida',
+            f33: 'Hora da Solicitação',
+            f34: 'Confirmar Senha',
+            f35: 'Número de Referência da Transação',
+            f36: 'Moeda da Transação',
+            f37: 'Valor da Transação',
+            f38: 'Valor Autorizado',
+            f39: 'Moeda Autorizada',
+            f40: 'Taxa Autorizada',
+            f41: 'Nome do Comerciante',
+            f42: 'Tipo de Transação',
+            f43: 'Hora da Transação',
+            f44: 'Taxa de Transação Transfronteiriça',
+            f45: 'Status',
+            f46: 'Descrição da Transação',
+            f47: 'Status da Taxa',
+            f48: 'Tipo de Cartão',
+            f49: 'Nome do Cartão',
+            f50: 'Status do Cartão',
+            f51: 'Hora',
+            f52: 'Tipo',
+            f53: 'Status de Aprovação',
+            f54: 'Status do Depósito',
+            f55: 'Valor',
+            f56: 'Saldo da Carteira:',
+            f57: 'Todos',
+            f58: 'Taxa de Serviço:',
+            f59: 'Taxa Estimada:',
+        },
+        vaildate: {
+            v1: 'Por favor, selecione o código de área',
+            v2: 'Por favor, insira um número de telefone com 5-20 dígitos',
+            v3: 'Por favor, insira o primeiro nome, apenas caracteres em inglês, [2...23] caracteres. O comprimento total dos nomes não pode exceder 23 caracteres (incluindo espaços)',
+            v4: 'Por favor, insira o sobrenome, apenas caracteres em inglês, [2...23] caracteres. O comprimento total dos nomes não pode exceder 23 caracteres (incluindo espaços)',
+            v5: 'Por favor, selecione a data de nascimento',
+            v6: 'Por favor, selecione a nacionalidade',
+            v7: 'Por favor, selecione a cidade',
+            v8: 'Por favor, insira o código postal',
+            v9: 'Por favor, selecione o gênero',
+            v10: 'Por favor, selecione a ocupação',
+            v11: 'Por favor, insira a renda anual, por exemplo, 200000 USD',
+            v12: 'Por favor, insira a finalidade da conta, apenas em inglês, por exemplo, Despesas de Vida',
+            v13: 'Por favor, insira o volume de negociação mensal esperado, por exemplo, 100000 USD',
+            v14: 'Por favor, selecione o tipo de ID',
+            v15: 'Por favor, insira o número do ID',
+            v16: 'Por favor, insira o número de segurança social com 9 dígitos',
+            v17: 'Por favor, selecione a data de emissão do ID',
+            v18: 'Por favor, selecione a data de expiração do ID',
+            v19: 'Por favor, selecione o arquivo da foto frontal do ID',
+            v20: 'Por favor, selecione o arquivo da foto traseira do ID',
+            v21: 'Por favor, selecione o arquivo da foto do ID na mão',
+            v22: 'Por favor, insira o número do cartão',
+            v23: 'Por favor, insira uma senha de transação de 6 dígitos',
+            v24: 'Por favor, insira o código de ativação',
+            v25: 'Por favor, insira observações',
+            v26: 'Por favor, insira o valor do depósito',
+            v27: 'Por favor, insira o endereço',
+            v28: 'Por favor, insira o e-mail',
+            v29: 'As senhas não coincidem',
+            v30: 'Por favor, selecione o arquivo da foto do ID na mão',
+            v31: 'Por favor, insira a senha novamente',
+            v32: 'Use 6 dígitos',
+            v33: 'Não pode usar dígitos consecutivos ou repetidos',
+            v34: 'O valor deve ser maior que 0',
+            v35: 'O valor do depósito não pode exceder',
+            v36: 'O valor do depósito não pode ser inferior a',
+            v37: 'O valor do depósito não pode exceder',
+            v38: 'Somente caracteres em inglês são permitidos (espaços incluídos)',
+            v39: 'O comprimento deve estar entre 2 e 23 caracteres',
+            v40: 'O comprimento total dos nomes não pode exceder 23 caracteres (incluindo espaços)',
+        },
+        Btn: {
+            Next: 'Próximo',
+            Previous: 'Anterior',
+            Submit: 'Enviar',
+            Confirm: 'Confirmar',
+            Cancel: 'Cancelar',
+            Update: 'Atualizar',
+            Auth: 'Autenticar',
+            Freeze: 'Congelar',
+            Unfreeze: 'Descongelar',
+            Recharge: 'Recarregar',
+            Activate: 'Ativar',
+            b1: 'Ativar Cartão',
+            b2: 'Visualizar',
+            b3: 'Solicitação de Recarga',
+            b4: 'Alterar Senha',
+            b5: 'Congelar Cartão',
+            b6: 'Descongelar Cartão',
+            b7: 'Solicitar Cartão',
+            b8: 'Obter Código de Ativação',
+            b9: 'Copiar Código de Ativação',
+            b10: 'Saldo',
+            b11: 'Verificar Status da Solicitação do Cartão',
+            b12: 'Reaplicar para o Cartão',
+            b13: 'Ativando',
+            b14: 'Descongelando',
+            b15: 'Congelando',
+            b16: 'Fechar',
+        },
+        New: {
+            n0: 'Comprimento do endereço 2–200 caracteres, apenas letras, números, hífens e espaços',
+            n1: 'Comprimento do endereço 2–40 caracteres, apenas letras, números, hífens e espaços',
+            n2: 'O código postal deve ter entre 2 e 15 caracteres',
+            n3: 'Você tem menos de 18 anos',
+            n4: 'Preço:',
+            n5: 'É necessário o titular do cartão na abertura do cartão:',
+            n6: 'Moedas suportadas para recarga:',
+            n7: 'Valor mínimo de recarga:',
+            n8: 'Valor mínimo de recarga:',
+            n9: 'Taxa:',
+            n10: 'Método de dedução',
+            n11: 'Endereço em inglês',
+        },
+        Transactions: {
+            t1: 'Autorização',
+            t2: 'Reembolso',
+            t3: 'Verificação',
+            t4: 'Cancelamento',
+            t5: 'Taxas do Cartão (Mensal, Anual, Saque em ATM....)',
+            t6: 'Transferência de Saída',
+            t7: 'Ajuste de Liquidação',
+            t8: 'Consulta de Saldo',
+            t9: 'Taxa',
+            t10: 'Consumo',
+            t11: 'Falha no Consumo',
+            t12: 'Reembolso',
+            t13: 'Cancelamento',
+            t14: 'Outro',
+            t15: 'Verificação de Vinculação de Cartão',
+            t16: 'Taxa de Administração',
+            t17: 'Liquidação',
+            t18: 'Bem-sucedido',
+            t19: 'Correção',
+            t20: 'Revertido',
+            t21: 'Cancelado',
+            t22: 'Cancelamento',
+            t23: 'Devolução',
+            t24: 'Autorizado',
+            t25: 'Falhou',
+            t26: 'Devolução',
+        },
+        New1: {
+            title: 'Informações Completas',
+            f1: 'Sua foto de identificação foi carregada com sucesso, por favor, aguarde o resultado da revisão!',
+            f2: 'Upload bem-sucedido',
+            f3: 'Escaneie o código QR para carregar sua identificação',
+            f4: 'Você deseja carregar a foto de identificação manualmente?',
+            d1: 'Carregue a foto da frente do seu documento de identidade',
+            d2: 'Carregue a foto de trás do seu documento de identidade',
+            d3: 'Carregue uma foto sua segurando seu documento de identidade',
+            d4: 'Clique para selecionar um arquivo',
+            d5: 'Upload bem-sucedido',
+            d6: 'Falha no upload',
+            d7: 'Carregando...',
+            d8: 'País de envio',
+            d9: 'Cidade de envio',
+            d10: 'Endereço de envio',
+            d11: 'Endereço de envio em inglês',
+            d12: 'CEP de envio',
+            d13: 'Número de telefone de envio',
+            d14: 'O arquivo não pode exceder 2MB',
+            titel1: 'Configurações de Idioma',
+        },
+    },
+}

+ 436 - 0
src/i18n/locales/th.ts

@@ -0,0 +1,436 @@
+export default {
+    'common': {
+        confirm: 'Confirm',
+        cancel: 'Cancel',
+        loading: 'Loading...',
+        success: 'Success',
+        fail: 'Failed',
+        input: 'Please input',
+        choose: 'Please choose',
+        country: 'Type a currency / country',
+        error: 'System Error',
+        copy1: 'Card number copied!',
+        copy2: 'CVV copied!',
+        copy3: 'Copy failed',
+    },
+    'language': {
+        title: 'การตั้งค่าภาษา',
+        selectLang: 'Select Language',
+        cn: '简体中文',
+        zh: '繁體中文',
+        en: 'English',
+        de: 'Deutsch',
+        es: 'Español',
+        ar: 'العربية',
+        id: 'Indonesian',
+        ms: 'Malay',
+        th: 'ไทย',
+        tr: 'Türkçe',
+        pt: 'Português',
+        ko: '한국어',
+        fa: 'فارسی',
+        vn: 'Tiếng Việt',
+        i0: 'Vertified',
+        i1: 'การตั้งค่าภาษา',
+        i2: 'Change Password',
+        i3: 'Personal Info',
+        i4: 'Card Opening Record',
+        i5: 'About PayouCard',
+        i6: 'Logout',
+    },
+    'improve-info': {
+        title: 'กรอกข้อมูลให้ครบถ้วน',
+        p3: 'Please enter the information',
+        p3_1: 'Please enter your last name',
+        p3_2: 'Please enter your first name',
+        p3_3: 'Please enter your mobile number',
+        p3_4: 'Please enter the detailed address',
+        p3_5: 'Please enter your email',
+        p4: 'Area Code',
+        p5: 'Select Area Code',
+        p6: 'Mobile',
+        p7: 'Email',
+        p8: 'Last Name',
+        p9: 'First Name',
+        p10: 'Birthday',
+        p11: 'Nationality',
+        p12: 'Select Nationality',
+        p13: 'Gender',
+        p14: 'Please Select',
+        p15: 'Male',
+        p16: 'Female',
+        p17: 'Country',
+        p18: 'Select Country',
+        p19: 'City',
+        p20: 'Select City',
+        p21: 'Detailed Address',
+        p22: 'Postal Code',
+        p23: 'Document Type',
+        p24: 'Select Document Type',
+        p25: 'ID Card',
+        p26: 'Passport',
+        p27: 'Document Number',
+        p28: 'Document Expiry',
+        p28_1: 'Upload Your ',
+        p28_2: 'Click to select file',
+        p29: 'Document Photo',
+        p30: 'Face Photo',
+        p31: 'Extended Field',
+        p32: 'Cancel',
+        p33: 'Submit',
+        p34: 'DLN',
+        p35: '政府签发的身份证',
+        kycSuccess: 'Information Completed',
+    },
+    'card': {
+        title: 'CWG Card',
+        tab1: 'บันทึกการฝากเงิน',
+        tab2: 'บันทึกการทำธุรกรรม',
+        tab3: 'ข้อมูลส่วนตัว',
+        tab4: 'เปลี่ยนรหัสผ่าน',
+        tab5: 'CWG Card',
+        tab6: 'ข้อมูลครบถ้วน',
+        tab7: 'บันทึกการฝากเงิน',
+        tab8: 'บันทึกการทำธุรกรรม',
+        tab9: 'สมัครบัตร',
+        tab10: 'เปิดใช้งาน',
+        tab11: 'ฝากเงินบัตร',
+        tab12: 'เปลี่ยนรหัสผ่าน',
+        tab13: 'ทำการแช่แข็งบัญชี',
+        tab14: 'ยกเลิกการแช่แข็งบัญชี',
+        tab15: 'บันทึกการสมัครบัตร',
+        tab16: 'ความคืบหน้าของบัตร',
+        tab17: 'บันทึกยอดคงเหลือในกระเป๋าเงิน',
+        tab18: 'เลือกบัตร',
+        tab19: 'ยืนยันข้อมูล',
+        Status: {
+            t1: 'สำเร็จ',
+            t2: 'ล้มเหลว',
+            t3: 'กำลังดำเนินการ',
+            t4: 'ได้รับอนุมัติ',
+            t5: 'รอดำเนินการ',
+            t6: 'สร้างบัตรสำเร็จ',
+            t7: 'การสร้างบัตรล้มเหลว',
+            t8: 'หักเงินสำเร็จ',
+            t9: 'หักเงินล้มเหลว',
+            t10: 'การขอเงินคืนสำเร็จ',
+            t11: 'การขอเงินคืนล้มเหลว',
+            t12: 'การขอเงินคืนกำลังดำเนินการ',
+            t13: 'รอดำเนินการตรวจสอบ',
+            t14: 'การตรวจสอบได้รับอนุมัติ',
+            t15: 'การตรวจสอบถูกปฏิเสธ',
+            t16: 'การถอนเงิน',
+            t17: 'การฝากเงิน',
+            t18: 'การขอเงินคืน',
+            t19: 'โอนเงินเข้าแบบแมนนวล',
+            t20: 'โอนเงินออกแบบแมนนวล',
+            t21: 'ทั้งหมด',
+            v1: 'ข้อมูลการลงทะเบียน',
+            v2: 'แก้ไขข้อมูล',
+            v3: 'รับลิงก์ยืนยันใบหน้า',
+            v4: 'ตรวจสอบ KYC ด้วยตนเอง',
+            v5: 'คำขอเปิดบัตร',
+            v6: 'อนุมัติบัตร',
+            v7: 'รับรหัสเปิดใช้งาน',
+            v8: 'เปิดใช้งานบัตร',
+            v9: 'จำนวนเงินเติมเงินเริ่มต้น',
+            v10: 'ถอนเข้ากระเป๋าเงิน',
+            v11: 'ฝากเข้ากระเป๋าเงิน',
+            v12: 'คำขอเติมเงินบัตร',
+            v13: 'อนุมัติการเติมเงิน',
+            v14: 'ระงับ',
+            v15: 'ยกเลิกการระงับ',
+            v16: 'เปลี่ยนรหัสผ่าน',
+            v17: 'บัญชี CID ของผู้ดำเนินการ',
+        },
+        Msg: {
+            m1: 'การสมัครบัตรของคุณได้ถูกส่งแล้ว และคุณจะได้รับการแจ้งเตือนทางอีเมลหลังจากการอนุมัติ!',
+            m2: 'การสมัครฝากเงินของคุณได้ถูกส่งแล้ว และคาดว่าจะได้รับเครดิตภายใน 1-3 วันทำการหลังจากการอนุมัติ!',
+            m3: 'ข้อมูลการเปิดใช้งานบัตรของคุณได้ถูกส่งแล้ว',
+            m4: 'บัตรของคุณถูกแช่แข็งสำเร็จ!',
+            m5: 'บัตรของคุณถูกยกเลิกการแช่แข็งสำเร็จ!',
+            m6: 'รหัสผ่านบัตรของคุณถูกเปลี่ยนสำเร็จ!',
+            m7: 'ฝากเงินสำเร็จ',
+            m8: 'คัดลอกสำเร็จ!',
+            m9: 'การคัดลอกล้มเหลว!',
+            m10: 'บัตรของคุณถูกแช่แข็ง โปรดเปิดใช้งานก่อนดำเนินการต่อ!',
+            m11: 'ไม่มีประเภทบัตรให้สมัคร',
+            m12: 'คุณไม่มีสิทธิ์เข้าถึงในขณะนี้ กรุณาติดต่อผู้ดูแลระบบ!',
+            m13: 'การลบข้อมูล',
+            m14: 'คุณแน่ใจหรือไม่ว่าจะลบกฎนี้?',
+            m15: 'การอัพเดตสำเร็จ',
+            m16: 'อัปโหลดภาพหน้าบัตรสำเร็จ',
+            m17: 'อัปโหลดภาพหลังบัตรสำเร็จ',
+            m18: 'อัปโหลดภาพบัตรที่ถือในมือสำเร็จ',
+            m19: 'ขนาดภาพโปรไฟล์ที่อัปโหลดไม่สามารถเกิน 2MB!',
+            m20: 'ภาพโปรไฟล์ที่อัปโหลดต้องอยู่ในรูปแบบ JPG/PNG!',
+        },
+        Info: {
+            s0: 'อาชีพและการเงิน (ไม่บังคับ)',
+            s0_1: 'อาชีพและการเงิน',
+            s1: 'ข้อมูลส่วนตัว',
+            s2: 'การยืนยันตัวตน',
+            s3: 'การตรวจสอบ',
+            s4: 'ข้อมูลของคุณได้รับการยืนยันแล้ว และคุณสามารถสมัครบัตรได้ที่หน้าใบสมัครบัตร',
+            s5: 'ทีมงานของเราจะตรวจสอบการสมัครและเอกสาร KYC ของคุณ หลังจากได้รับการอนุมัติคุณจะได้รับอีเมลยืนยัน',
+            s6: 'กำลังตรวจสอบ',
+            s7: 'ได้รับการยืนยัน',
+            s8: 'ผู้ถือบัตร',
+            s9: 'วันหมดอายุ',
+            s10: 'สมัครบัตร',
+            s11: 'กรุณาทำตามขั้นตอนเพื่อสมัครบัตร',
+            s12: 'กระบวนการสมัคร',
+            s13: 'เลือกบัตร:',
+            s14: 'กรุณาเลือกประเภทบัตรที่คุณต้องการ',
+            s15: 'ยืนยันข้อมูล:',
+            s16: 'กรุณายืนยันข้อมูลของคุณ',
+            s17: 'การตรวจสอบการสมัคร:',
+            s18: 'ทีมงานของเราจะตรวจสอบการสมัครของคุณ และหลังจากการอนุมัติ คุณจะได้รับอีเมลยืนยัน',
+            s19: 'การออกบัตร:',
+            s20: 'บัตรจะถูกส่งไปยังที่อยู่ที่ลงทะเบียนภายใน 5-7 วันทำการหลังจากการตรวจสอบได้รับการอนุมัติ',
+            s21: 'หากคุณมีคำถามหรือจำเป็นต้องขอความช่วยเหลือ กรุณาติดต่อทีมบริการลูกค้าของเรา เราขอให้คุณมีประสบการณ์ที่ดีในการใช้งานบัตร!',
+            s22: 'รับบัตร:',
+            s23: 'โปรดตรวจสอบให้แน่ใจว่า ซองบัตรอยู่ในสภาพสมบูรณ์เมื่อรับบัตร',
+            s24: 'เปิดใช้งานออนไลน์:',
+            s25: 'ไปที่ศูนย์ลูกค้าของ CWG Markets และเข้าสู่หน้าการเปิดใช้งานบัตร ใส่หมายเลขบัตรและรหัสการเปิดใช้งาน (ที่ให้มาพร้อมกับบัตร)',
+            s26: 'ตั้งรหัส PIN:',
+            s27: 'ทำตามขั้นตอนเพื่อตั้งรหัสส่วนตัว (PIN) ใช้สำหรับการถอนเงินจากตู้ ATM และการชำระเงินในการช็อปปิ้ง',
+            s28: 'เริ่มใช้งาน:',
+            s29: 'เมื่อเปิดใช้งานแล้ว คุณสามารถเริ่มใช้บัตร Visa Debit ของคุณในการใช้จ่ายและถอนเงิน',
+            s30: 'บัตรนี้รองรับ: Wechatpay, Alipay, Applepay และการชำระเงินอิเล็กทรอนิกส์อื่นๆ รวมถึงการถอนเงินจาก POS และ ATM ทั้งในประเทศและต่างประเทศ',
+            s31: 'เรากำลังดำเนินการสมัครบัตรของคุณ กรุณารอให้บุคคลที่สามทำการหักเงินให้เสร็จสิ้น หลังจากหักเงินสำเร็จ เราจะส่งการสมัครบัตรของคุณทันที!',
+            s32: 'การหักเงินล้มเหลว ค่าธรรมเนียมบริการจะถูกคืนให้กับบัญชีของคุณ กรุณาสมัครบัตรใหม่อีกครั้ง!',
+            s33: 'การหักเงินล้มเหลว ค่าธรรมเนียมบริการถูกคืนให้กับบัญชีของคุณ กรุณาสมัครบัตรใหม่อีกครั้ง!',
+            s34: 'ค่าธรรมเนียมการสมัครบัตรของคุณถูกหักสำเร็จ เราจะส่งการสมัครบัตรของคุณทันที!',
+            s35: 'การสมัครบัตรของคุณไม่ได้รับการอนุมัติ กรุณาติดต่อเจ้าหน้าที่เพื่อแก้ไขปัญหา!',
+            s36: 'บัตรของคุณได้รับการอนุมัติแล้ว และจะถูกส่งไปยังที่อยู่ที่ลงทะเบียนภายใน 5-7 วันทำการ',
+            s37: 'ขออภัย การสมัครบัตรของคุณไม่ได้รับการอนุมัติ กรุณาสมัครใหม่อีกครั้ง',
+            s38: 'การสมัครบัตรของคุณถูกส่งไปยังการตรวจสอบจากบุคคลที่สาม และบัตรจะถูกส่งไปยังที่อยู่ที่ลงทะเบียนภายใน 5-7 วันทำการหลังจากการอนุมัติ',
+            s39: 'สถานะค่าธรรมเนียมบริการ',
+            s40: 'สถานะการอนุมัติ',
+            s41: 'สถานะบัตร',
+            s42: 'ทีมงานของเราได้รับข้อมูลของคุณแล้ว โปรดสแกนรหัส QR ด้านล่างเพื่อทำการยืนยันตัวตน',
+            s43: 'ข้อมูลการลงทะเบียนของคุณได้รับการอัปเดตเรียบร้อยแล้ว',
+            t1: 'รอดำเนินการตรวจสอบ',
+            t2: 'การตรวจสอบได้รับอนุมัติ',
+            t3: 'การตรวจสอบถูกปฏิเสธ',
+            t5: 'กำลังดำเนินการ',
+            t6: 'การสร้างบัตรสำเร็จ',
+            t7: 'การสร้างบัตรล้มเหลว',
+            t8: 'การหักเงินสำเร็จ',
+            t9: 'การหักเงินล้มเหลว',
+            t10: 'รอดำเนินการ',
+            t11: 'กำลังขอเงินคืน',
+            t12: 'การขอเงินคืนสำเร็จ',
+            t13: 'การขอเงินคืนล้มเหลว',
+            t15: 'สถานะ:',
+            t16: 'การสร้างบัตรกำลังดำเนินการ (โปรดรอ)',
+            t17: 'การสร้างบัตรล้มเหลว (โปรดรอการคืนเงินและสมัครใหม่)',
+            t18: 'การสร้างบัตรสำเร็จ (โปรดเปิดใช้งานบัตรของคุณ)',
+            t19: 'การเปิดใช้งานบัตรกำลังดำเนินการ (โปรดรอ)',
+            t20: 'การเปิดใช้งานบัตรล้มเหลว (โปรดเปิดใช้งานบัตรใหม่)',
+        },
+        Form: {
+            v1: 'ชาย',
+            v2: 'หญิง',
+            v3: 'บัตรประจำตัวประชาชนฮ่องกง',
+            v4: 'หนังสือเดินทาง',
+            v5: 'ใบขับขี่',
+            v6: 'บัตรประจำตัวที่ออกโดยรัฐบาล',
+            f1: 'รหัสพื้นที่',
+            f2: 'หมายเลขโทรศัพท์',
+            f3: 'อีเมล',
+            f4: 'นามสกุล',
+            f5: 'ชื่อ',
+            f6: 'วันเกิด',
+            f7: 'สัญชาติ',
+            f8: 'เพศ',
+            f9: 'เมือง',
+            f10: 'ที่อยู่',
+            f11: 'รหัสไปรษณีย์',
+            f12: 'อาชีพ',
+            f13: 'รายได้ประจำปี',
+            f14: 'วัตถุประสงค์ของบัญชี',
+            f15: 'ปริมาณการซื้อขายที่คาดหวังต่อเดือน',
+            f16: 'ประเภทบัตร',
+            f17: 'หมายเลขบัตรประจำตัว',
+            f18: 'หมายเลขประกันสังคม',
+            f19: 'วันออกบัตรประจำตัว',
+            f20: 'วันหมดอายุบัตรประจำตัว',
+            f21: 'ภาพบัตรประจำตัวหน้า',
+            f22: 'ภาพบัตรประจำตัวหลัง',
+            f23: 'ภาพบัตรประจำตัวที่ถือ',
+            f24: 'หมายเลขบัตรธนาคาร',
+            f25: 'รหัสผ่านธุรกรรม',
+            f26: 'รหัสเปิดใช้งาน',
+            f27: 'หมายเหตุ',
+            f28: 'จำนวนเงินฝาก',
+            f29: 'สกุลเงิน',
+            f30: 'ค่าธรรมเนียมการทำธุรกรรม',
+            f31: 'จำนวนเงินที่ได้รับ',
+            f32: 'สกุลเงินที่ได้รับ',
+            f33: 'เวลาที่สมัคร',
+            f34: 'ยืนยันรหัสผ่าน',
+            f35: 'หมายเลขอ้างอิงการทำธุรกรรม',
+            f36: 'สกุลเงินการทำธุรกรรม',
+            f37: 'จำนวนเงินการทำธุรกรรม',
+            f38: 'จำนวนเงินที่ได้รับอนุญาต',
+            f39: 'สกุลเงินที่ได้รับอนุญาต',
+            f40: 'ค่าธรรมเนียมที่ได้รับอนุญาต',
+            f41: 'ชื่อผู้ค้า',
+            f42: 'ประเภทการทำธุรกรรม',
+            f43: 'เวลาการทำธุรกรรม',
+            f44: 'ค่าธรรมเนียมการทำธุรกรรมข้ามพรมแดน',
+            f45: 'สถานะ',
+            f46: 'คำอธิบายการทำธุรกรรม',
+            f47: 'สถานะค่าธรรมเนียม',
+            f48: 'ประเภทบัตร',
+            f49: 'ชื่อบัตร',
+            f50: 'สถานะบัตร',
+            f51: 'เวลา',
+            f52: 'ประเภท',
+            f53: 'สถานะการอนุมัติ',
+            f54: 'สถานะการฝาก',
+            f55: 'จำนวนเงิน',
+            f56: 'ยอดคงเหลือในกระเป๋าเงิน:',
+            f57: 'ทั้งหมด',
+            f58: 'อัตราค่าธรรมเนียม:',
+            f59: 'ค่าธรรมเนียมที่ประมาณการ:',
+        },
+        vaildate: {
+            v1: 'โปรดเลือกรหัสพื้นที่',
+            v2: 'โปรดใส่หมายเลขโทรศัพท์ที่มี 5-20 หลัก',
+            v3: 'โปรดใส่ชื่อแรกโดยใช้ตัวอักษรภาษาอังกฤษเท่านั้น [2...23] ตัวอักษร ความยาวรวมของชื่อแรกและนามสกุลไม่สามารถเกิน 23 ตัวอักษร (รวมช่องว่าง)',
+            v4: 'โปรดใส่นามสกุลโดยใช้ตัวอักษรภาษาอังกฤษเท่านั้น [2...23] ตัวอักษร ความยาวรวมของชื่อแรกและนามสกุลไม่สามารถเกิน 23 ตัวอักษร (รวมช่องว่าง)',
+            v5: 'โปรดเลือกวันเกิด',
+            v6: 'โปรดเลือกสัญชาติ',
+            v7: 'โปรดเลือกเมือง',
+            v8: 'โปรดใส่รหัสไปรษณีย์',
+            v9: 'โปรดเลือกเพศ',
+            v10: 'โปรดเลือกอาชีพ',
+            v11: 'โปรดใส่รายได้ประจำปี เช่น 200000 USD',
+            v12: 'โปรดใส่วัตถุประสงค์ของบัญชีโดยใช้ภาษาอังกฤษ เช่น Living Expense',
+            v13: 'โปรดใส่ปริมาณการซื้อขายที่คาดหวังต่อเดือน เช่น 100000 USD',
+            v14: 'โปรดเลือกประเภทบัตร',
+            v15: 'โปรดใส่หมายเลขบัตรประจำตัว',
+            v16: 'โปรดใส่หมายเลขประกันสังคม 9 หลัก',
+            v17: 'โปรดเลือกวันออกบัตรประจำตัว',
+            v18: 'โปรดเลือกวันหมดอายุบัตรประจำตัว',
+            v19: 'โปรดเลือกไฟล์ภาพหน้าบัตรประจำตัว',
+            v20: 'โปรดเลือกไฟล์ภาพหลังบัตรประจำตัว',
+            v21: 'โปรดเลือกไฟล์ภาพบัตรประจำตัวที่ถือ',
+            v22: 'โปรดใส่หมายเลขบัตร',
+            v23: 'โปรดใส่รหัสผ่านธุรกรรม 6 หลัก',
+            v24: 'โปรดใส่รหัสเปิดใช้งาน',
+            v25: 'โปรดใส่หมายเหตุ',
+            v26: 'โปรดใส่จำนวนเงินฝาก',
+            v27: 'โปรดใส่ที่อยู่',
+            v28: 'โปรดใส่อีเมล',
+            v29: 'รหัสผ่านไม่ตรงกัน',
+            v30: 'โปรดเลือกไฟล์ภาพบัตรประจำตัวที่ถือ',
+            v31: 'โปรดใส่รหัสผ่านอีกครั้ง',
+            v32: 'ใช้ 6 หลัก',
+            v33: 'ไม่สามารถใช้ตัวเลขที่ต่อเนื่องหรือลำดับที่ซ้ำกัน',
+            v34: 'จำนวนเงินต้องมากกว่า 0',
+            v35: 'จำนวนเงินฝากไม่สามารถเกิน',
+            v36: 'จำนวนเงินฝากไม่สามารถน้อยกว่า',
+            v37: 'จำนวนเงินฝากไม่สามารถเกิน',
+            v38: 'สามารถใช้ตัวอักษรภาษาอังกฤษเท่านั้น (รวมช่องว่าง)',
+            v39: 'ความยาวต้องอยู่ระหว่าง 2 ถึง 23 ตัวอักษร',
+            v40: 'ความยาวรวมของชื่อแรกและนามสกุลไม่สามารถเกิน 23 ตัวอักษร (รวมช่องว่าง)',
+        },
+        Btn: {
+            Next: 'ถัดไป',
+            Previous: 'ก่อนหน้า',
+            Submit: 'ส่ง',
+            Confirm: 'ยืนยัน',
+            Cancel: 'ยกเลิก',
+            Update: 'อัปเดต',
+            Auth: 'ยืนยันตัวตน',
+            Freeze: 'แช่แข็ง',
+            Unfreeze: 'ยกเลิกการแช่แข็ง',
+            Recharge: 'เติมเงิน',
+            Activate: 'เปิดใช้งาน',
+            b1: 'เปิดใช้งานบัตร',
+            b2: 'ดู',
+            b3: 'สมัครเติมเงิน',
+            b4: 'เปลี่ยนรหัสผ่าน',
+            b5: 'แช่แข็งบัตร',
+            b6: 'ยกเลิกการแช่แข็งบัตร',
+            b7: 'สมัครบัตร',
+            b8: 'รับรหัสเปิดใช้งาน',
+            b9: 'คัดลอกรหัสเปิดใช้งาน',
+            b10: 'ยอดคงเหลือ',
+            b11: 'ตรวจสอบสถานะการสมัครบัตร',
+            b12: 'สมัครใหม่สำหรับบัตร',
+            b13: 'กำลังเปิดใช้งาน',
+            b14: 'กำลังยกเลิกการแช่แข็ง',
+            b15: 'กำลังแช่แข็ง',
+            b16: 'ปิด',
+        },
+        New: {
+            n0: 'ความยาวที่อยู่ 2–200 ตัวอักษร อนุญาตเฉพาะตัวอักษร ตัวเลข ขีดกลาง และเว้นวรรค',
+            n1: 'ความยาวที่อยู่ 2–40 ตัวอักษร อนุญาตเฉพาะตัวอักษร ตัวเลข ขีดกลาง และเว้นวรรค',
+            n2: 'รหัสไปรษณีย์ต้องมีความยาว 2–15 ตัวอักษร',
+            n3: 'คุณมีอายุต่ำกว่า 18 ปี',
+            n4: 'ราคา:',
+            n5: 'ต้องการผู้ถือบัตรในการเปิดบัตรหรือไม่:',
+            n6: 'สกุลเงินที่รองรับสำหรับการเติมเงิน:',
+            n7: 'จำนวนเงินเติมขั้นต่ำ:',
+            n8: 'จำนวนเงินเติมขั้นต่ำ:',
+            n9: 'อัตราค่าธรรมเนียม:',
+            n10: 'วิธีการหัก',
+            n11: 'ที่อยู่ภาษาอังกฤษ',
+        },
+        Transactions: {
+            t1: 'การอนุมัติ',
+            t2: 'การคืนเงิน',
+            t3: 'การตรวจสอบ',
+            t4: 'การยกเลิก',
+            t5: 'ค่าธรรมเนียมบัตร (รายเดือน, รายปี, ค่าถอน ATM....)',
+            t6: 'การโอนออก',
+            t7: 'การปรับยอด',
+            t8: 'สอบถามยอดเงิน',
+            t9: 'ค่าธรรมเนียม',
+            t10: 'การใช้จ่าย',
+            t11: 'การใช้จ่ายล้มเหลว',
+            t12: 'การคืนเงิน',
+            t13: 'การยกเลิก',
+            t14: 'อื่นๆ',
+            t15: 'ธุรกรรมตรวจสอบการผูกบัตร',
+            t16: 'ค่าบริหารจัดการ',
+            t17: 'การชำระบัญชี',
+            t18: 'สำเร็จ',
+            t19: 'การแก้ไข',
+            t20: 'ถูกแก้ไข',
+            t21: 'ถูกยกเลิก',
+            t22: 'การยกเลิก',
+            t23: 'การคืนสินค้า',
+            t24: 'ได้รับอนุมัติ',
+            t25: 'ล้มเหลว',
+            t26: 'การคืนสินค้า',
+        },
+        New1: {
+            title: 'กรอกข้อมูลให้ครบถ้วน',
+            f1: 'ภาพถ่ายบัตรประจำตัวของคุณได้รับการอัพโหลดสำเร็จแล้ว กรุณารอผลการตรวจสอบ!',
+            f2: 'อัพโหลดสำเร็จ',
+            f3: 'สแกน QR Code เพื่ออัพโหลดบัตรประจำตัวของคุณ',
+            f4: 'คุณต้องการอัพโหลดภาพถ่ายบัตรประจำตัวด้วยตัวเองหรือไม่?',
+            d1: 'อัพโหลดภาพหน้าบัตรประจำตัวของคุณ',
+            d2: 'อัพโหลดภาพหลังบัตรประจำตัวของคุณ',
+            d3: 'อัพโหลดภาพคุณถือบัตรประจำตัวของคุณ',
+            d4: 'คลิกเพื่อเลือกไฟล์',
+            d5: 'อัพโหลดสำเร็จ',
+            d6: 'อัพโหลดล้มเหลว',
+            d7: 'กำลังอัพโหลด...',
+            d8: 'ประเทศที่จัดส่ง',
+            d9: 'เมืองที่จัดส่ง',
+            d10: 'ที่อยู่ในการจัดส่ง',
+            d11: 'ที่อยู่ในการจัดส่งเป็นภาษาอังกฤษ',
+            d12: 'รหัสไปรษณีย์ที่จัดส่ง',
+            d13: 'หมายเลขโทรศัพท์ที่จัดส่ง',
+            d14: 'ไฟล์ไม่สามารถมีขนาดเกิน 2MB',
+            titel1: 'การตั้งค่าภาษา',
+        },
+    },
+}

+ 436 - 0
src/i18n/locales/tr.ts

@@ -0,0 +1,436 @@
+export default {
+    'common': {
+        confirm: 'Confirm',
+        cancel: 'Cancel',
+        loading: 'Loading...',
+        success: 'Success',
+        fail: 'Failed',
+        input: 'Please input',
+        choose: 'Please choose',
+        country: 'Type a currency / country',
+        error: 'System Error',
+        copy1: 'Card number copied!',
+        copy2: 'CVV copied!',
+        copy3: 'Copy failed',
+    },
+    'language': {
+        title: 'Dil Ayarları',
+        selectLang: 'Select Language',
+        cn: '简体中文',
+        zh: '繁體中文',
+        en: 'English',
+        de: 'Deutsch',
+        es: 'Español',
+        ar: 'العربية',
+        id: 'Indonesian',
+        ms: 'Malay',
+        th: 'ไทย',
+        tr: 'Türkçe',
+        pt: 'Português',
+        ko: '한국어',
+        fa: 'فارسی',
+        vn: 'Tiếng Việt',
+        i0: 'Vertified',
+        i1: 'Dil Ayarları',
+        i2: 'Change Password',
+        i3: 'Personal Info',
+        i4: 'Card Opening Record',
+        i5: 'About PayouCard',
+        i6: 'Logout',
+    },
+    'improve-info': {
+        title: 'Bilgileri Tamamla',
+        p3: 'Please enter the information',
+        p3_1: 'Please enter your last name',
+        p3_2: 'Please enter your first name',
+        p3_3: 'Please enter your mobile number',
+        p3_4: 'Please enter the detailed address',
+        p3_5: 'Please enter your email',
+        p4: 'Area Code',
+        p5: 'Select Area Code',
+        p6: 'Mobile',
+        p7: 'Email',
+        p8: 'Last Name',
+        p9: 'First Name',
+        p10: 'Birthday',
+        p11: 'Nationality',
+        p12: 'Select Nationality',
+        p13: 'Gender',
+        p14: 'Please Select',
+        p15: 'Male',
+        p16: 'Female',
+        p17: 'Country',
+        p18: 'Select Country',
+        p19: 'City',
+        p20: 'Select City',
+        p21: 'Detailed Address',
+        p22: 'Postal Code',
+        p23: 'Document Type',
+        p24: 'Select Document Type',
+        p25: 'ID Card',
+        p26: 'Passport',
+        p27: 'Document Number',
+        p28: 'Document Expiry',
+        p28_1: 'Upload Your ',
+        p28_2: 'Click to select file',
+        p29: 'Document Photo',
+        p30: 'Face Photo',
+        p31: 'Extended Field',
+        p32: 'Cancel',
+        p33: 'Submit',
+        p34: 'DLN',
+        p35: '政府签发的身份证',
+        kycSuccess: 'Information Completed',
+    },
+    'card': {
+        title: 'CWG Kartı',
+        tab1: 'Yatırım Kaydı',
+        tab2: 'İşlem Kaydı',
+        tab3: 'Kişisel Bilgiler',
+        tab4: 'Şifre Değiştir',
+        tab5: 'CWG Kartı',
+        tab6: 'Tam Bilgiler',
+        tab7: 'Yatırım Kaydı',
+        tab8: 'İşlem Kaydı',
+        tab9: 'Kart Başvurusu',
+        tab10: 'Aktif Et',
+        tab11: 'Kart Yatırımı',
+        tab12: 'Şifre Değiştir',
+        tab13: 'Hesabı Dondur',
+        tab14: 'Hesabı Çöz',
+        tab15: 'Kart Başvuru Kaydı',
+        tab16: 'Kart İlerlemesi',
+        tab17: 'Cüzdan Bakiyesi Kaydı',
+        tab18: 'Kart Seç',
+        tab19: 'Bilgileri Onayla',
+        Status: {
+            t1: 'Başarı',
+            t2: 'Başarısızlık',
+            t3: 'İşlemde',
+            t4: 'Yetkilendirildi',
+            t5: 'Bekliyor',
+            t6: 'Kart Başarıyla Oluşturuldu',
+            t7: 'Kart Oluşumu Başarısız Oldu',
+            t8: 'Kesinti Başarılı',
+            t9: 'Kesinti Başarısız',
+            t10: 'İade Başarılı',
+            t11: 'İade Başarısız',
+            t12: 'İade İşlemde',
+            t13: 'İnceleme Bekliyor',
+            t14: 'İnceleme Onaylandı',
+            t15: 'İnceleme Reddedildi',
+            t16: 'Çekim',
+            t17: 'Yatırım',
+            t18: 'İade',
+            t19: 'Manuel Transfer Girişi',
+            t20: 'Manuel Transfer Çıkışı',
+            t21: 'Tüm',
+            v1: 'Kayıt Bilgileri',
+            v2: 'Bilgileri Değiştir',
+            v3: 'Yüz Doğrulama Bağlantısı Al',
+            v4: 'Manuel KYC İncelemesi',
+            v5: 'Kart Başvurusu',
+            v6: 'Kart Onayı',
+            v7: 'Etkinleştirme Kodu Al',
+            v8: 'Kartı Etkinleştir',
+            v9: 'Varsayılan Yükleme Tutarı',
+            v10: 'Cüzdana Çekim',
+            v11: 'Cüzdana Yatırma',
+            v12: 'Kart Yükleme Başvurusu',
+            v13: 'Yükleme Onayı',
+            v14: 'Dondur',
+            v15: 'Çöz',
+            v16: 'Şifre Değiştir',
+            v17: 'Operatör CID Hesabı',
+        },
+        Msg: {
+            m1: 'Kart başvurunuz gönderildi, onaylandıktan sonra e-posta ile bilgilendirileceksiniz!',
+            m2: 'Yatırım başvurunuz gönderildi, onaylandıktan sonra 1-3 iş günü içinde hesaba yatırılacak!',
+            m3: 'Banka kartı aktivasyon bilginiz gönderildi.',
+            m4: 'Banka kartınız başarıyla donduruldu!',
+            m5: 'Banka kartınız başarıyla çözülmüştür!',
+            m6: 'Banka kartı şifreniz başarıyla değiştirildi!',
+            m7: 'Yatırım Başarılı',
+            m8: 'Kopyalama Başarılı!',
+            m9: 'Kopyalama Başarısız!',
+            m10: 'Banka kartınız dondurulmuş, işlem yapmadan önce aktivasyon yapınız!',
+            m11: 'Başvuru için mevcut kart tipi yok',
+            m12: 'Şu anda erişiminiz yok, lütfen yöneticinizle iletişime geçin!',
+            m13: 'Silme Uyarısı',
+            m14: 'Bu kuralı silmek istediğinize emin misiniz?',
+            m15: 'Güncelleme Başarılı',
+            m16: 'Ön Kimlik Fotoğrafı başarıyla yüklendi',
+            m17: 'Arka Kimlik Fotoğrafı başarıyla yüklendi',
+            m18: 'El ile Kimlik Fotoğrafı başarıyla yüklendi',
+            m19: 'Yüklenen profil resminin boyutu 2MB\'yi geçemez!',
+            m20: 'Yüklenen profil resmi JPG/PNG formatında olmalıdır!',
+        },
+        Info: {
+            s0: 'Meslek ve Finans (İsteğe bağlı)',
+            s0_1: 'Meslek ve Finans',
+            s1: 'Kişisel Bilgiler',
+            s2: 'Kimlik Doğrulama',
+            s3: 'İnceleme',
+            s4: 'Bilgileriniz doğrulandı ve kart başvurusu sayfasında kart başvurusu yapabilirsiniz.',
+            s5: 'Ekibimiz başvurunuzu ve KYC belgelerinizi inceleyecek. Onaylandıktan sonra onay e-postası alacaksınız.',
+            s6: 'İnceleniyor',
+            s7: 'Doğrulandı',
+            s8: 'Kart Sahibi',
+            s9: 'Son Kullanma Tarihi',
+            s10: 'Kart Başvurusu Yap',
+            s11: 'Lütfen kart başvurusu için adımları takip edin.',
+            s12: 'Başvuru Süreci',
+            s13: 'Kart Seçimi:',
+            s14: 'Lütfen ihtiyacınız olan kart türünü seçin.',
+            s15: 'Bilgileri Onayla:',
+            s16: 'Lütfen bilgilerinizi onaylayın.',
+            s17: 'Başvuru İncelemesi:',
+            s18: 'Ekibimiz başvurunuzu inceleyecek ve onaylandıktan sonra bir onay e-postası alacaksınız.',
+            s19: 'Kart Basımı:',
+            s20: 'İnceleme onaylandığında kartınız 5-7 iş günü içinde kayıtlı adresinize gönderilecektir.',
+            s21: 'Herhangi bir sorunuz veya yardıma ihtiyacınız varsa, lütfen müşteri hizmetleri ekibimizle iletişime geçmekten çekinmeyin. Kartla keyifli bir deneyim dileriz!',
+            s22: 'Kartı Alın:',
+            s23: 'Kartı alırken zarfın sağlam olduğundan emin olun.',
+            s24: 'Çevrimiçi Aktivasyon:',
+            s25: 'CWG Markets müşteri merkezine gidin ve \'Kart Aktif Et\' sayfasına girin, kart numaranızı ve aktivasyon kodunuzu (kartla birlikte verilecektir) girin.',
+            s26: 'PIN Kodu Ayarla:',
+            s27: 'ATM çekimleri ve alışveriş ödemeleri için kullanılacak Kişisel Kimlik Numarası (PIN) ayarlamak için yönergeleri takip edin.',
+            s28: 'Kullanmaya Başlayın:',
+            s29: 'Aktive edildikten sonra, Visa Banka Kartınızı harcama ve para çekme işlemleri için kullanmaya başlayabilirsiniz.',
+            s30: 'Bu kart şunları destekler: Wechatpay, Alipay, Applepay ve diğer elektronik ödemeler, ayrıca yurt içi ve uluslararası POS ve ATM çekimleri.',
+            s31: 'Kart başvurunuzu aldık. Lütfen üçüncü tarafın kesinti işlemlerini tamamlamasını bekleyin. Kesinti başarılı olduktan sonra kart başvurunuzu hemen ileteceğiz!',
+            s32: 'Kesinti başarısız oldu, hizmet ücreti hesabınıza iade edilecek, lütfen kart başvurunuzu tekrar yapın!',
+            s33: 'Kesinti başarısız oldu, hizmet ücreti hesabınıza iade edildi, lütfen kart başvurunuzu tekrar yapın!',
+            s34: 'Kart başvurusu hizmet ücretiniz başarıyla kesildi, kart başvurunuzu hemen ileteceğiz!',
+            s35: 'Kart başvurunuz onaylanmadı, lütfen sorunu çözmek için personel ile iletişime geçin!',
+            s36: 'Kartınız onaylandı ve 5-7 iş günü içinde kayıtlı adresinize gönderilecektir.',
+            s37: 'Üzgünüz, kart başvurunuz onaylanmadı, lütfen tekrar başvurun.',
+            s38: 'Kart başvurunuz üçüncü taraf incelemesine gönderildi, kartınız onaylandıktan sonra 5-7 iş günü içinde kayıtlı adresinize gönderilecektir.',
+            s39: 'Hizmet Ücreti Durumu',
+            s40: 'Onay Durumu',
+            s41: 'Kart Durumu',
+            s42: 'Ekibimiz bilgilerinizi aldı. Kimlik doğrulamasını tamamlamak için aşağıdaki QR kodunu tarayın.',
+            s43: 'Kayıt bilgileriniz başarıyla güncellenmiştir.',
+            t1: 'İnceleme Bekliyor',
+            t2: 'İnceleme Onaylandı',
+            t3: 'İnceleme Reddedildi',
+            t5: 'İşlemde',
+            t6: 'Kart Oluşumu Başarılı',
+            t7: 'Kart Oluşumu Başarısız Oldu',
+            t8: 'Kesinti Başarılı',
+            t9: 'Kesinti Başarısız',
+            t10: 'Bekliyor',
+            t11: 'İade Ediliyor',
+            t12: 'İade Başarılı',
+            t13: 'İade Başarısız',
+            t15: 'Durum:',
+            t16: 'Kart Oluşumu Devam Ediyor (Lütfen Sabırlı Olun)',
+            t17: 'Kart Oluşumu Başarısız Oldu (Lütfen iade için bekleyin ve tekrar başvurun)',
+            t18: 'Kart Oluşumu Başarılı (Lütfen kartınızı aktif edin)',
+            t19: 'Kart Aktivasyonu Devam Ediyor (Lütfen Sabırlı Olun)',
+            t20: 'Kart Aktivasyonu Başarısız Oldu (Lütfen kartınızı yeniden aktive edin)',
+        },
+        Form: {
+            v1: 'Erkek',
+            v2: 'Kadın',
+            v3: 'Hong Kong Kimlik Kartı',
+            v4: 'Pasaport',
+            v5: 'Sürücü belgesi',
+            v6: 'Hükümet Tarafından Verilen Kimlik',
+            f1: 'Alan Kodu',
+            f2: 'Telefon Numarası',
+            f3: 'E-posta',
+            f4: 'Soyadı',
+            f5: 'Adı',
+            f6: 'Doğum Tarihi',
+            f7: 'Milliyet',
+            f8: 'Cinsiyet',
+            f9: 'Şehir',
+            f10: 'Adres',
+            f11: 'Posta Kodu',
+            f12: 'Meslek',
+            f13: 'Yıllık Gelir',
+            f14: 'Hesap Amacı',
+            f15: 'Beklenen Aylık İşlem Hacmi',
+            f16: 'Kimlik Türü',
+            f17: 'Kimlik Numarası',
+            f18: 'Sosyal Güvenlik Numarası',
+            f19: 'Kimlik Veriliş Tarihi',
+            f20: 'Kimlik Son Kullanma Tarihi',
+            f21: 'Ön Kimlik Fotoğrafı',
+            f22: 'Arka Kimlik Fotoğrafı',
+            f23: 'Elde Tutulan Kimlik Fotoğrafı',
+            f24: 'Banka Kartı Numarası',
+            f25: 'İşlem Şifresi',
+            f26: 'Aktivasyon Kodu',
+            f27: 'Açıklamalar',
+            f28: 'Yatırım Tutarı',
+            f29: 'Para Birimi',
+            f30: 'İşlem Ücreti',
+            f31: 'Alınan Tutar',
+            f32: 'Alınan Para Birimi',
+            f33: 'Başvuru Zamanı',
+            f34: 'Şifreyi Onayla',
+            f35: 'İşlem Referans Numarası',
+            f36: 'İşlem Para Birimi',
+            f37: 'İşlem Tutarı',
+            f38: 'Yetkilendirilen Tutar',
+            f39: 'Yetkilendirilen Para Birimi',
+            f40: 'Yetkilendirilmiş Ücret',
+            f41: 'Tüccar Adı',
+            f42: 'İşlem Türü',
+            f43: 'İşlem Zamanı',
+            f44: 'Sınır Ötesi İşlem Ücreti',
+            f45: 'Durum',
+            f46: 'İşlem Açıklaması',
+            f47: 'Ücret Durumu',
+            f48: 'Kart Türü',
+            f49: 'Kart Adı',
+            f50: 'Kart Durumu',
+            f51: 'Zaman',
+            f52: 'Tür',
+            f53: 'Onay Durumu',
+            f54: 'Yatırım Durumu',
+            f55: 'Tutar',
+            f56: 'Cüzdan Bakiyesi:',
+            f57: 'Tümü',
+            f58: 'Ücret Oranı:',
+            f59: 'Tahmini Ücret:',
+        },
+        vaildate: {
+            v1: 'Lütfen alan kodu seçin',
+            v2: 'Lütfen 5-20 haneli telefon numarası girin',
+            v3: 'Lütfen ilk adı girin, sadece İngilizce karakterler, [2...23] karakter. İlk ve soyadlarının toplam uzunluğu 23 karakteri geçemez (boşluklar dahil)',
+            v4: 'Lütfen soyadı girin, sadece İngilizce karakterler, [2...23] karakter. İlk ve soyadlarının toplam uzunluğu 23 karakteri geçemez (boşluklar dahil)',
+            v5: 'Lütfen doğum tarihini seçin',
+            v6: 'Lütfen milliyeti seçin',
+            v7: 'Lütfen şehir seçin',
+            v8: 'Lütfen posta kodunu girin',
+            v9: 'Lütfen cinsiyet seçin',
+            v10: 'Lütfen meslek seçin',
+            v11: 'Lütfen yıllık gelir girin, örneğin 200000 USD',
+            v12: 'Lütfen hesap amacı girin, sadece İngilizce, örneğin Yaşam Gideri',
+            v13: 'Lütfen beklenen aylık işlem hacmini girin, örneğin 100000 USD',
+            v14: 'Lütfen kimlik türünü seçin',
+            v15: 'Lütfen kimlik numarasını girin',
+            v16: 'Lütfen 9 haneli sosyal güvenlik numarasını girin',
+            v17: 'Lütfen kimlik veriliş tarihini seçin',
+            v18: 'Lütfen kimlik son kullanma tarihini seçin',
+            v19: 'Lütfen ön kimlik fotoğrafı dosyasını seçin',
+            v20: 'Lütfen arka kimlik fotoğrafı dosyasını seçin',
+            v21: 'Lütfen elde tutulan kimlik fotoğrafı dosyasını seçin',
+            v22: 'Lütfen kart numarasını girin',
+            v23: 'Lütfen 6 haneli işlem şifresi girin',
+            v24: 'Lütfen aktivasyon kodunu girin',
+            v25: 'Lütfen açıklamaları girin',
+            v26: 'Lütfen yatırım tutarını girin',
+            v27: 'Lütfen adresi girin',
+            v28: 'Lütfen e-posta girin',
+            v29: 'Şifreler eşleşmiyor',
+            v30: 'Lütfen elde tutulan kimlik fotoğrafı dosyasını seçin',
+            v31: 'Lütfen şifreyi tekrar girin',
+            v32: '6 haneli kullanın',
+            v33: 'Ardışık veya tekrarlanan rakamlar kullanılamaz',
+            v34: 'Tutar 0\'dan büyük olmalıdır',
+            v35: 'Yatırım tutarı aşılamaz',
+            v36: 'Yatırım tutarı daha az olamaz',
+            v37: 'Yatırım tutarı aşılamaz',
+            v38: 'Sadece İngilizce karakterlere izin verilir (boşluklar dahil)',
+            v39: 'Uzunluk 2 ile 23 karakter arasında olmalıdır',
+            v40: 'İlk ve soyadlarının toplam uzunluğu 23 karakteri geçemez (boşluklar dahil)',
+        },
+        Btn: {
+            Next: 'Sonraki',
+            Previous: 'Önceki',
+            Submit: 'Gönder',
+            Confirm: 'Onayla',
+            Cancel: 'İptal',
+            Update: 'Güncelle',
+            Auth: 'Kimlik Doğrulama',
+            Freeze: 'Dondur',
+            Unfreeze: 'Çöz',
+            Recharge: 'Yükle',
+            Activate: 'Aktifleştir',
+            b1: 'Kartı Aktif Et',
+            b2: 'Görünüm',
+            b3: 'Yatırım Başvurusu',
+            b4: 'Şifre Değiştir',
+            b5: 'Kartı Dondur',
+            b6: 'Kartı Çöz',
+            b7: 'Kart Başvurusu Yap',
+            b8: 'Aktivasyon Kodu Al',
+            b9: 'Aktivasyon Kodunu Kopyala',
+            b10: 'Bakiye',
+            b11: 'Kart Başvuru Durumunu Kontrol Et',
+            b12: 'Kart İçin Yeniden Başvur',
+            b13: 'Aktivasyon Yapılıyor',
+            b14: 'Çözülüyor',
+            b15: 'Donduruluyor',
+            b16: 'Kapat',
+        },
+        New: {
+            n0: 'Adres uzunluğu 2–40 karakter olmalı, yalnızca harf, rakam, tire ve boşluk içerebilir',
+            n1: 'Adres uzunluğu 2–40 karakter olmalı, yalnızca harf, rakam, tire ve boşluk içerebilir',
+            n2: 'Posta kodu 2–15 karakter olmalıdır',
+            n3: '18 yaşından küçüksünüz',
+            n4: 'Fiyat:',
+            n5: 'Kart açılırken kart sahibinin bulunması gerekli mi:',
+            n6: 'Desteklenen yükleme para birimleri:',
+            n7: 'Minimum yükleme tutarı:',
+            n8: 'Minimum yükleme tutarı:',
+            n9: 'Ücret oranı:',
+            n10: 'Mahsup yöntemi',
+            n11: 'İngilizce Adres',
+        },
+        Transactions: {
+            t1: 'Yetkilendirme',
+            t2: 'İade',
+            t3: 'Doğrulama',
+            t4: 'İptal',
+            t5: 'Kart Ücretleri (Aylık, Yıllık, ATM Çekim Ücreti....)',
+            t6: 'Dışa Transfer',
+            t7: 'Mutabakat Düzeltmesi',
+            t8: 'Bakiye Sorgulama',
+            t9: 'Ücret',
+            t10: 'Harcamalar',
+            t11: 'Harcama Başarısız',
+            t12: 'İade',
+            t13: 'İptal',
+            t14: 'Diğer',
+            t15: 'Kart Bağlama Doğrulama İşlemi',
+            t16: 'Yönetim Ücreti',
+            t17: 'Mutabakat',
+            t18: 'Başarılı',
+            t19: 'Düzeltme',
+            t20: 'Düzeltildi',
+            t21: 'İptal Edildi',
+            t22: 'İptal',
+            t23: 'İade Edilen Mal',
+            t24: 'Yetkilendirildi',
+            t25: 'Başarısız',
+            t26: 'İade',
+        },
+        New1: {
+            title: 'Bilgileri Tamamla',
+            f1: 'Kimlik fotoğrafınız başarıyla yüklendi, lütfen inceleme sonucunu bekleyin!',
+            f2: 'Yükleme Başarılı',
+            f3: 'Kimliğinizi yüklemek için QR kodunu tarayın',
+            f4: 'Kimlik fotoğrafını manuel olarak yüklemek ister misiniz?',
+            d1: 'Kimliğinizin ön yüz fotoğrafını yükleyin',
+            d2: 'Kimliğinizin arka yüz fotoğrafını yükleyin',
+            d3: 'Kimliğinizi tuttuğunuz bir fotoğraf yükleyin',
+            d4: 'Dosya seçmek için tıklayın',
+            d5: 'Yükleme Başarılı',
+            d6: 'Yükleme Başarısız',
+            d7: 'Yükleniyor...',
+            d8: 'Gönderim Ülkesi',
+            d9: 'Gönderim Şehri',
+            d10: 'Gönderim Adresi',
+            d11: 'Gönderim Adresi İngilizce',
+            d12: 'Gönderim Posta Kodu',
+            d13: 'Gönderim Telefon Numarası',
+            d14: 'Dosya boyutu 2MB\'yi geçemez',
+            titel1: 'Dil Ayarları',
+        },
+    },
+}

+ 436 - 0
src/i18n/locales/vn.ts

@@ -0,0 +1,436 @@
+export default {
+    'common': {
+        confirm: 'Confirm',
+        cancel: 'Cancel',
+        loading: 'Loading...',
+        success: 'Success',
+        fail: 'Failed',
+        input: 'Please input',
+        choose: 'Please choose',
+        country: 'Type a currency / country',
+        error: 'System Error',
+        copy1: 'Card number copied!',
+        copy2: 'CVV copied!',
+        copy3: 'Copy failed',
+    },
+    'language': {
+        title: 'Cài Đặt Ngôn Ngữ',
+        selectLang: 'Select Language',
+        cn: '简体中文',
+        zh: '繁體中文',
+        en: 'English',
+        de: 'Deutsch',
+        es: 'Español',
+        ar: 'العربية',
+        id: 'Indonesian',
+        ms: 'Malay',
+        th: 'ไทย',
+        tr: 'Türkçe',
+        pt: 'Português',
+        ko: '한국어',
+        fa: 'فارسی',
+        vn: 'Tiếng Việt',
+        i0: 'Vertified',
+        i1: 'Cài Đặt Ngôn Ngữ',
+        i2: 'Change Password',
+        i3: 'Personal Info',
+        i4: 'Card Opening Record',
+        i5: 'About PayouCard',
+        i6: 'Logout',
+    },
+    'improve-info': {
+        title: 'Hoàn Thành Thông Tin',
+        p3: 'Please enter the information',
+        p3_1: 'Please enter your last name',
+        p3_2: 'Please enter your first name',
+        p3_3: 'Please enter your mobile number',
+        p3_4: 'Please enter the detailed address',
+        p3_5: 'Please enter your email',
+        p4: 'Area Code',
+        p5: 'Select Area Code',
+        p6: 'Mobile',
+        p7: 'Email',
+        p8: 'Last Name',
+        p9: 'First Name',
+        p10: 'Birthday',
+        p11: 'Nationality',
+        p12: 'Select Nationality',
+        p13: 'Gender',
+        p14: 'Please Select',
+        p15: 'Male',
+        p16: 'Female',
+        p17: 'Country',
+        p18: 'Select Country',
+        p19: 'City',
+        p20: 'Select City',
+        p21: 'Detailed Address',
+        p22: 'Postal Code',
+        p23: 'Document Type',
+        p24: 'Select Document Type',
+        p25: 'ID Card',
+        p26: 'Passport',
+        p27: 'Document Number',
+        p28: 'Document Expiry',
+        p28_1: 'Upload Your ',
+        p28_2: 'Click to select file',
+        p29: 'Document Photo',
+        p30: 'Face Photo',
+        p31: 'Extended Field',
+        p32: 'Cancel',
+        p33: 'Submit',
+        p34: 'DLN',
+        p35: '政府签发的身份证',
+        kycSuccess: 'Information Completed',
+    },
+    'card': {
+        title: 'Thẻ CWG',
+        tab1: 'Lịch sử Gửi tiền',
+        tab2: 'Lịch sử Giao dịch',
+        tab3: 'Thông tin Cá nhân',
+        tab4: 'Đổi Mật khẩu',
+        tab5: 'Thẻ CWG',
+        tab6: 'Hoàn thiện Thông tin',
+        tab7: 'Lịch sử Gửi tiền',
+        tab8: 'Lịch sử Giao dịch',
+        tab9: 'Đăng ký Thẻ',
+        tab10: 'Kích hoạt',
+        tab11: 'Gửi tiền Thẻ',
+        tab12: 'Đổi Mật khẩu',
+        tab13: 'Khóa Tài khoản',
+        tab14: 'Mở Khóa Tài khoản',
+        tab15: 'Lịch sử Đăng ký Thẻ',
+        tab16: 'Tiến trình Thẻ',
+        tab17: 'Lịch sử Số dư Ví',
+        tab18: 'Chọn Thẻ',
+        tab19: 'Xác nhận Thông tin',
+        Status: {
+            t1: 'Thành công',
+            t2: 'Thất bại',
+            t3: 'Đang xử lý',
+            t4: 'Đã xác nhận',
+            t5: 'Chờ duyệt',
+            t6: 'Tạo thẻ thành công',
+            t7: 'Tạo thẻ thất bại',
+            t8: 'Khấu trừ thành công',
+            t9: 'Khấu trừ thất bại',
+            t10: 'Hoàn tiền thành công',
+            t11: 'Hoàn tiền thất bại',
+            t12: 'Đang hoàn tiền',
+            t13: 'Chờ duyệt',
+            t14: 'Duyệt thành công',
+            t15: 'Duyệt thất bại',
+            t16: 'Rút tiền',
+            t17: 'Gửi tiền',
+            t18: 'Hoàn tiền',
+            t19: 'Chuyển khoản thủ công vào',
+            t20: 'Chuyển khoản thủ công ra',
+            t21: 'Tất cả',
+            v1: 'Thông tin đăng ký',
+            v2: 'Chỉnh sửa thông tin',
+            v3: 'Nhận liên kết xác minh khuôn mặt',
+            v4: 'Xét duyệt KYC thủ công',
+            v5: 'Đơn xin mở thẻ',
+            v6: 'Phê duyệt thẻ',
+            v7: 'Nhận mã kích hoạt',
+            v8: 'Kích hoạt thẻ',
+            v9: 'Số tiền nạp mặc định',
+            v10: 'Rút về ví',
+            v11: 'Nạp vào ví',
+            v12: 'Yêu cầu nạp tiền thẻ',
+            v13: 'Phê duyệt nạp tiền',
+            v14: 'Đóng băng',
+            v15: 'Giải băng',
+            v16: 'Đổi mật khẩu',
+            v17: 'Tài khoản CID của người vận hành',
+        },
+        Msg: {
+            m1: 'Đơn đăng ký thẻ của bạn đã được gửi, bạn sẽ nhận được thông báo qua email sau khi duyệt!',
+            m2: 'Đơn đăng ký gửi tiền của bạn đã được gửi, dự kiến sẽ được ghi có trong vòng 1-3 ngày làm việc sau khi duyệt!',
+            m3: 'Thông tin kích hoạt thẻ ngân hàng của bạn đã được gửi.',
+            m4: 'Thẻ ngân hàng của bạn đã được khóa thành công!',
+            m5: 'Thẻ ngân hàng của bạn đã được mở khóa thành công!',
+            m6: 'Mật khẩu thẻ ngân hàng của bạn đã được thay đổi thành công!',
+            m7: 'Gửi tiền thành công',
+            m8: 'Sao chép thành công!',
+            m9: 'Sao chép thất bại!',
+            m10: 'Thẻ ngân hàng của bạn đã bị khóa, vui lòng kích hoạt thẻ trước khi tiếp tục!',
+            m11: 'Không có loại thẻ nào để đăng ký',
+            m12: 'Bạn hiện không có quyền truy cập, vui lòng liên hệ với quản trị viên!',
+            m13: 'Xóa nhắc nhở',
+            m14: 'Bạn có chắc chắn muốn xóa quy tắc này không?',
+            m15: 'Cập nhật thành công',
+            m16: 'Ảnh mặt trước ID đã tải lên thành công',
+            m17: 'Ảnh mặt sau ID đã tải lên thành công',
+            m18: 'Ảnh cầm ID đã tải lên thành công',
+            m19: 'Kích thước ảnh tải lên không được vượt quá 2MB!',
+            m20: 'Ảnh tải lên phải ở định dạng JPG/PNG!',
+        },
+        Info: {
+            s0: 'Nghề nghiệp và Tài chính (Tùy chọn)',
+            s0_1: 'Nghề nghiệp và Tài chính',
+            s1: 'Thông tin Cá nhân',
+            s2: 'Xác minh Danh tính',
+            s3: 'Duyệt',
+            s4: 'Thông tin của bạn đã được xác minh, bạn có thể đăng ký thẻ trên trang đăng ký thẻ.',
+            s5: 'Nhóm của chúng tôi sẽ xem xét đơn đăng ký và tài liệu KYC của bạn. Sau khi duyệt, bạn sẽ nhận được email xác nhận.',
+            s6: 'Đang duyệt',
+            s7: 'Đã xác minh',
+            s8: 'Chủ thẻ',
+            s9: 'Ngày hết hạn',
+            s10: 'Đăng ký thẻ',
+            s11: 'Vui lòng làm theo các bước để đăng ký thẻ.',
+            s12: 'Quy trình Đăng ký',
+            s13: 'Chọn Thẻ:',
+            s14: 'Vui lòng chọn loại thẻ bạn cần.',
+            s15: 'Xác nhận Thông tin:',
+            s16: 'Vui lòng xác nhận thông tin của bạn.',
+            s17: 'Duyệt Đơn Đăng Ký:',
+            s18: 'Nhóm của chúng tôi sẽ xem xét đơn đăng ký của bạn, và sau khi duyệt, bạn sẽ nhận được email xác nhận.',
+            s19: 'Cấp thẻ:',
+            s20: 'Thẻ sẽ được gửi đến địa chỉ đã đăng ký của bạn trong vòng 5-7 ngày làm việc sau khi duyệt.',
+            s21: 'Nếu bạn có bất kỳ câu hỏi nào hoặc cần hỗ trợ, vui lòng liên hệ với đội ngũ dịch vụ khách hàng của chúng tôi. Chúng tôi chúc bạn có một trải nghiệm tốt với thẻ!',
+            s22: 'Nhận thẻ:',
+            s23: 'Vui lòng đảm bảo phong bì không bị hư hỏng khi nhận thẻ.',
+            s24: 'Kích hoạt Online:',
+            s25: 'Truy cập vào trung tâm khách hàng CWG Markets và vào trang \'Kích hoạt Thẻ\', nhập số thẻ và mã kích hoạt (được cung cấp kèm thẻ).',
+            s26: 'Đặt Mã PIN:',
+            s27: 'Làm theo hướng dẫn để thiết lập Mã PIN (Mã số nhận dạng cá nhân), dùng để rút tiền tại ATM và thanh toán mua sắm.',
+            s28: 'Bắt đầu Sử dụng:',
+            s29: 'Sau khi kích hoạt, bạn có thể bắt đầu sử dụng Thẻ Debit Visa để chi tiêu và rút tiền.',
+            s30: 'Thẻ này hỗ trợ: Wechatpay, Alipay, Applepay và các phương thức thanh toán điện tử khác, cũng như rút tiền tại POS và ATM trong và ngoài nước.',
+            s31: 'Chúng tôi đã nhận được đơn đăng ký thẻ của bạn. Vui lòng chờ bên thứ ba hoàn thành các thủ tục khấu trừ. Sau khi khấu trừ thành công, chúng tôi sẽ ngay lập tức gửi đơn đăng ký thẻ của bạn!',
+            s32: 'Khấu trừ thất bại, phí dịch vụ sẽ được hoàn lại vào tài khoản của bạn, vui lòng đăng ký lại thẻ!',
+            s33: 'Khấu trừ thất bại, phí dịch vụ đã được hoàn lại vào tài khoản của bạn, vui lòng đăng ký lại thẻ!',
+            s34: 'Phí dịch vụ đăng ký thẻ của bạn đã được khấu trừ thành công, chúng tôi sẽ ngay lập tức gửi đơn đăng ký thẻ của bạn!',
+            s35: 'Đơn đăng ký thẻ của bạn không được duyệt, vui lòng liên hệ với nhân viên để giải quyết vấn đề!',
+            s36: 'Thẻ của bạn đã được duyệt và sẽ được gửi đến địa chỉ đăng ký của bạn trong vòng 5-7 ngày làm việc.',
+            s37: 'Xin lỗi, đơn đăng ký thẻ của bạn không được duyệt, vui lòng đăng ký lại.',
+            s38: 'Đơn đăng ký thẻ của bạn đã được gửi để xem xét bởi bên thứ ba, thẻ sẽ được gửi đến địa chỉ đã đăng ký của bạn trong vòng 5-7 ngày làm việc sau khi duyệt.',
+            s39: 'Trạng thái Phí Dịch Vụ',
+            s40: 'Trạng thái Duyệt',
+            s41: 'Trạng thái Thẻ',
+            s42: 'Nhóm của chúng tôi đã nhận thông tin của bạn. Vui lòng quét mã QR dưới đây để hoàn tất xác minh danh tính.',
+            s43: 'Thông tin đăng ký của bạn đã được cập nhật thành công.',
+            t1: 'Chờ duyệt',
+            t2: 'Duyệt thành công',
+            t3: 'Duyệt thất bại',
+            t5: 'Đang xử lý',
+            t6: 'Tạo thẻ thành công',
+            t7: 'Tạo thẻ thất bại',
+            t8: 'Khấu trừ thành công',
+            t9: 'Khấu trừ thất bại',
+            t10: 'Chờ',
+            t11: 'Đang hoàn tiền',
+            t12: 'Hoàn tiền thành công',
+            t13: 'Hoàn tiền thất bại',
+            t15: 'Trạng thái:',
+            t16: 'Đang tạo thẻ (Vui lòng kiên nhẫn)',
+            t17: 'Tạo thẻ thất bại (Vui lòng chờ hoàn tiền và đăng ký lại)',
+            t18: 'Tạo thẻ thành công (Vui lòng kích hoạt thẻ của bạn)',
+            t19: 'Đang kích hoạt thẻ (Vui lòng kiên nhẫn)',
+            t20: 'Kích hoạt thẻ thất bại (Vui lòng kích hoạt lại thẻ)',
+        },
+        Form: {
+            v1: 'Nam',
+            v2: 'Nữ',
+            v3: 'Thẻ ID Hồng Kông',
+            v4: 'Hộ chiếu',
+            v5: 'Bằng lái xe',
+            v6: 'Thẻ ID do Chính phủ cấp',
+            f1: 'Mã khu vực',
+            f2: 'Số điện thoại',
+            f3: 'Email',
+            f4: 'Họ',
+            f5: 'Tên',
+            f6: 'Ngày sinh',
+            f7: 'Quốc tịch',
+            f8: 'Giới tính',
+            f9: 'Thành phố',
+            f10: 'Địa chỉ',
+            f11: 'Mã bưu chính',
+            f12: 'Nghề nghiệp',
+            f13: 'Thu nhập hàng năm',
+            f14: 'Mục đích tài khoản',
+            f15: 'Khối lượng giao dịch hàng tháng dự kiến',
+            f16: 'Loại ID',
+            f17: 'Số ID',
+            f18: 'Số An sinh xã hội',
+            f19: 'Ngày cấp ID',
+            f20: 'Ngày hết hạn ID',
+            f21: 'Ảnh mặt trước ID',
+            f22: 'Ảnh mặt sau ID',
+            f23: 'Ảnh cầm ID',
+            f24: 'Số thẻ ngân hàng',
+            f25: 'Mật khẩu giao dịch',
+            f26: 'Mã kích hoạt',
+            f27: 'Ghi chú',
+            f28: 'Số tiền gửi',
+            f29: 'Tiền tệ',
+            f30: 'Phí giao dịch',
+            f31: 'Số tiền nhận được',
+            f32: 'Tiền tệ nhận được',
+            f33: 'Thời gian đăng ký',
+            f34: 'Xác nhận mật khẩu',
+            f35: 'Số tham chiếu giao dịch',
+            f36: 'Tiền tệ giao dịch',
+            f37: 'Số tiền giao dịch',
+            f38: 'Số tiền được ủy quyền',
+            f39: 'Tiền tệ ủy quyền',
+            f40: 'Phí ủy quyền',
+            f41: 'Tên người bán',
+            f42: 'Loại giao dịch',
+            f43: 'Thời gian giao dịch',
+            f44: 'Phí giao dịch xuyên biên giới',
+            f45: 'Trạng thái',
+            f46: 'Mô tả giao dịch',
+            f47: 'Trạng thái phí',
+            f48: 'Loại thẻ',
+            f49: 'Tên thẻ',
+            f50: 'Trạng thái thẻ',
+            f51: 'Thời gian',
+            f52: 'Loại',
+            f53: 'Trạng thái phê duyệt',
+            f54: 'Trạng thái gửi tiền',
+            f55: 'Số tiền',
+            f56: 'Số dư ví:',
+            f57: 'Tất cả',
+            f58: 'Tỷ lệ phí:',
+            f59: 'Phí ước tính:',
+        },
+        vaildate: {
+            v1: 'Vui lòng chọn mã khu vực',
+            v2: 'Vui lòng nhập số điện thoại có từ 5-20 chữ số',
+            v3: 'Vui lòng nhập họ, chỉ sử dụng ký tự tiếng Anh, [2...23] ký tự. Tổng chiều dài của họ và tên không vượt quá 23 ký tự (bao gồm khoảng trắng)',
+            v4: 'Vui lòng nhập tên, chỉ sử dụng ký tự tiếng Anh, [2...23] ký tự. Tổng chiều dài của họ và tên không vượt quá 23 ký tự (bao gồm khoảng trắng)',
+            v5: 'Vui lòng chọn ngày sinh',
+            v6: 'Vui lòng chọn quốc tịch',
+            v7: 'Vui lòng chọn thành phố',
+            v8: 'Vui lòng nhập mã bưu chính',
+            v9: 'Vui lòng chọn giới tính',
+            v10: 'Vui lòng chọn nghề nghiệp',
+            v11: 'Vui lòng nhập thu nhập hàng năm, ví dụ: 200000 USD',
+            v12: 'Vui lòng nhập mục đích tài khoản, chỉ tiếng Anh, ví dụ: Chi phí sinh hoạt',
+            v13: 'Vui lòng nhập khối lượng giao dịch hàng tháng dự kiến, ví dụ: 100000 USD',
+            v14: 'Vui lòng chọn loại ID',
+            v15: 'Vui lòng nhập số ID',
+            v16: 'Vui lòng nhập số an sinh xã hội gồm 9 chữ số',
+            v17: 'Vui lòng chọn ngày cấp ID',
+            v18: 'Vui lòng chọn ngày hết hạn ID',
+            v19: 'Vui lòng chọn tệp ảnh mặt trước ID',
+            v20: 'Vui lòng chọn tệp ảnh mặt sau ID',
+            v21: 'Vui lòng chọn tệp ảnh cầm ID',
+            v22: 'Vui lòng nhập số thẻ',
+            v23: 'Vui lòng nhập mật khẩu giao dịch gồm 6 chữ số',
+            v24: 'Vui lòng nhập mã kích hoạt',
+            v25: 'Vui lòng nhập ghi chú',
+            v26: 'Vui lòng nhập số tiền gửi',
+            v27: 'Vui lòng nhập địa chỉ',
+            v28: 'Vui lòng nhập email',
+            v29: 'Mật khẩu không khớp',
+            v30: 'Vui lòng chọn tệp ảnh cầm ID',
+            v31: 'Vui lòng nhập lại mật khẩu',
+            v32: 'Sử dụng 6 chữ số',
+            v33: 'Không sử dụng các chữ số liên tiếp hoặc lặp lại',
+            v34: 'Số tiền phải lớn hơn 0',
+            v35: 'Số tiền gửi không được vượt quá',
+            v36: 'Số tiền gửi không được ít hơn',
+            v37: 'Số tiền gửi không được vượt quá',
+            v38: 'Chỉ cho phép ký tự tiếng Anh (bao gồm cả khoảng trắng)',
+            v39: 'Chiều dài phải từ 2 đến 23 ký tự',
+            v40: 'Tổng chiều dài của họ và tên không vượt quá 23 ký tự (bao gồm khoảng trắng)',
+        },
+        Btn: {
+            Next: 'Tiếp theo',
+            Previous: 'Trước',
+            Submit: 'Gửi',
+            Confirm: 'Xác nhận',
+            Cancel: 'Hủy',
+            Update: 'Cập nhật',
+            Auth: 'Xác thực',
+            Freeze: 'Khóa',
+            Unfreeze: 'Mở khóa',
+            Recharge: 'Nạp tiền',
+            Activate: 'Kích hoạt',
+            b1: 'Kích hoạt thẻ',
+            b2: 'Xem',
+            b3: 'Đăng ký nạp tiền',
+            b4: 'Thay đổi mật khẩu',
+            b5: 'Khóa thẻ',
+            b6: 'Mở khóa thẻ',
+            b7: 'Đăng ký thẻ',
+            b8: 'Lấy mã kích hoạt',
+            b9: 'Sao chép mã kích hoạt',
+            b10: 'Số dư',
+            b11: 'Kiểm tra trạng thái đăng ký thẻ',
+            b12: 'Đăng ký lại thẻ',
+            b13: 'Đang kích hoạt',
+            b14: 'Đang mở khóa',
+            b15: 'Đang khóa',
+            b16: 'Đóng',
+        },
+        New: {
+            n0: 'Độ dài địa chỉ 2–200 ký tự, chỉ bao gồm chữ, số, dấu gạch nối và khoảng trắng',
+            n1: 'Độ dài địa chỉ 2–40 ký tự, chỉ bao gồm chữ, số, dấu gạch nối và khoảng trắng',
+            n2: 'Mã bưu chính phải có từ 2–15 ký tự',
+            n3: 'Bạn chưa đủ 18 tuổi',
+            n4: 'Giá:',
+            n5: 'Có cần chủ thẻ khi mở thẻ không:',
+            n6: 'Các loại tiền tệ được hỗ trợ để nạp tiền:',
+            n7: 'Số tiền nạp tối thiểu:',
+            n8: 'Số tiền nạp tối thiểu:',
+            n9: 'Tỷ lệ phí:',
+            n10: 'Phương thức khấu trừ',
+            n11: 'Địa chỉ tiếng Anh',
+        },
+        Transactions: {
+            t1: 'Ủy quyền',
+            t2: 'Hoàn tiền',
+            t3: 'Xác minh',
+            t4: 'Hủy bỏ',
+            t5: 'Phí thẻ (Hàng tháng, Hàng năm, Phí rút ATM....)',
+            t6: 'Chuyển ra',
+            t7: 'Điều chỉnh thanh toán',
+            t8: 'Truy vấn số dư',
+            t9: 'Phí',
+            t10: 'Tiêu dùng',
+            t11: 'Tiêu dùng thất bại',
+            t12: 'Hoàn tiền',
+            t13: 'Hủy bỏ',
+            t14: 'Khác',
+            t15: 'Giao dịch xác minh liên kết thẻ',
+            t16: 'Phí quản lý',
+            t17: 'Thanh toán',
+            t18: 'Thành công',
+            t19: 'Điều chỉnh',
+            t20: 'Bị điều chỉnh',
+            t21: 'Bị hủy bỏ',
+            t22: 'Hủy bỏ',
+            t23: 'Hoàn trả hàng',
+            t24: 'Được ủy quyền',
+            t25: 'Thất bại',
+            t26: 'Hoàn trả',
+        },
+        New1: {
+            title: 'Hoàn Thành Thông Tin',
+            f1: 'Ảnh chứng minh thư của bạn đã được tải lên thành công, vui lòng chờ kết quả duyệt!',
+            f2: 'Tải lên thành công',
+            f3: 'Quét mã QR để tải lên chứng minh thư của bạn',
+            f4: 'Bạn có muốn tải lên ảnh chứng minh thư thủ công không?',
+            d1: 'Tải lên ảnh mặt trước của chứng minh thư',
+            d2: 'Tải lên ảnh mặt sau của chứng minh thư',
+            d3: 'Tải lên ảnh bạn đang cầm chứng minh thư',
+            d4: 'Nhấn để chọn tệp',
+            d5: 'Tải lên thành công',
+            d6: 'Tải lên thất bại',
+            d7: 'Đang tải lên...',
+            d8: 'Quốc gia gửi thư',
+            d9: 'Thành phố gửi thư',
+            d10: 'Địa chỉ gửi thư',
+            d11: 'Địa chỉ gửi thư bằng tiếng Anh',
+            d12: 'Mã bưu điện gửi thư',
+            d13: 'Số điện thoại gửi thư',
+            d14: 'Tệp không thể vượt quá 2MB',
+            titel1: 'Cài Đặt Ngôn Ngữ',
+        },
+    },
+}

+ 420 - 591
src/i18n/locales/zh.ts

@@ -1,610 +1,439 @@
 export default {
-    common: {
+    'common': {
         confirm: '确认',
         cancel: '取消',
         loading: '加载中...',
         success: '成功',
         fail: '失败',
         input: '请输入',
-        choose: '请选择'
+        choose: '请选择',
+        country: '输入货币/国家',
+        error: '系统错误',
+        copy1: '卡号已复制!',
+        copy2: 'CVV已复制!',
+        copy3: '复制失败',
     },
-    tabs: {
-        wallet: '钱包',
-        cards: '卡片',
-        finance: '金融',
-        mine: '我的'
-    },
-    wallet: {
-        title: '我的钱包',
-        balance: '余额',
-        transactions: '交易记录',
-    },
-    cards: {
-        title: '我的卡片',
-        balance: '余额',
-        transactions: '交易记录',
-        cardNo: '卡号',
-        recharge: '卡片充值',
-        findPassword: '找回密码',
-        freezeCard: '冻结卡片',
-        unfreezeCard: '解冻卡片',
-        selectCard: '选择卡片',
-        currency: '币种',
-        amount: '金额',
-        selectDateRange: '选择日期',
-        selectDate: '选择日期1',
-        start: '开始',
-        end: '结束'
-    },
-    finance: {
-        title: '金融',
-    },
-    mine: {
-        title: '我的',
-        logout: '确认退出登录吗?',
-    },
-    language: {
-        title: '语言设置',
+    'language': {
+        title: '語言設置',
         selectLang: '选择语言',
-        cn: '中文简体',
-        zh: '中文繁体',
+        cn: '简体中文',
+        zh: '繁體中文',
         en: 'English',
-        de: 'German',
-        es: 'Spanish',
-        ar: 'Arabic',
+        de: 'Deutsch',
+        es: 'Español',
+        ar: 'العربية',
         id: 'Indonesian',
         ms: 'Malay',
-        th: 'Thai',
-        vi: 'Vietnamese',
-        i1: '语言设置',
-        i2: '设置支付密码',
+        th: 'ไทย',
+        tr: 'Türkçe',
+        pt: 'Português',
+        ko: '한국어',
+        fa: 'فارسی',
+        vn: 'Tiếng Việt',
+        i0: '已认证',
+        i1: '語言設置',
+        i2: '修改密码',
         i3: '个人信息',
-        i4: '购卡记录',
+        i4: '开卡记录',
         i5: '关于PayouCard',
         i6: '退出登录',
     },
-    login: {
-        title: '登录',
-        username: '用户名',
-        password: '密码',
-        rememberPassword: '记住密码',
-        forgotPassword: '忘记密码?',
-    },
-    'card-transaction-detail': {
-        title: '交易详情',
-        currency: '币种',
-        amount: '交易金额',
-        type: '交易类型',
-        consume: '消费',
-        desc: '交易描述',
-        status: '订单状态',
-        time: '时间',
-    },
-    'pay-password': {
-        title: '支付密码',
-        change: '修改支付密码',
-        forget: '忘记支付密码',
-    },
-    'change-pay-password': {
-        title: '修改支付密码',
-        desc: '向您手机157***1673发送验证码',
-        input: '请输入验证码',
-        getCode: '获取验证码',
-        nextStep: '下一步',
-    },
-    'forget-pay-password': {
-        title: '忘记支付密码',
-        desc: '向您手机157***1673发送验证码',
-        input: '请输入验证码',
-        getCode: '获取验证码',
-        nextStep: '下一步',
-    },
-    'find-password': {
-        title: '找回密码',
-        desc: '请上传签名照片',
-        input: '请输入验证码',
-        getCode: '获取验证码',
-        nextStep: '下一步',
-    },
-    'freeze-card': {
-        title: '冻结卡片',
-        desc: '请上传签名照片',
-        tip: '支持PNG、JPG格式。',
-        nextStep: '确定',
-        formatError: '仅支持PNG、JPG格式',
-        needUpload: '请上传签名照片',
-        submitted: '已提交'
-    },
-    'card-recharge': {
-        title: '卡片充值',
-        currency: '币种',
-        cardNo: '卡号',
-        cardNoPlaceholder: '请输入卡号',
-        amount: '金额',
-        amountPlaceholder: '请输入金额,最低金额10',
-        walletBalance: '钱包余额',
-        all: '全部',
-        recharge: '充值',
-        fee: '手续费',
-        records: '充值记录',
-        walletPay: '钱包支付',
-        rechargeSuccess: '充值成功',
-        rechargePending: '充值中',
-        rechargeFailed: '充值失败',
-    },
-    'activate-card': {
-        title: '卡片激活',
-        desc: '请输入您的卡片信息进行激活',
-        cardNo: '卡号',
-        cardNoPlaceholder: '请输入卡号',
-        expireDate: '有效期',
-        expireDatePlaceholder: '请输入有效期',
-        cvv: 'CVV',
-        cvvPlaceholder: '请输入CVV',
-        password: '交易密码',
-        passwordPlaceholder: '请输入交易密码',
-        activate: '立即激活',
-    },
-    'select-card': {
-        title: '提交',
-        selectCard: '选择你的卡片',
-        desc: '我们为全球各地用户提供不同的卡片选择,包括实体卡和虚拟卡。',
-        physicalCard: '实体卡',
-        price: '价格:',
-        kycRequire: 'KYC认证:',
-        kycRequiredDesc: '需要',
-        kycRequiredDesc2: '不需要',
-        rechargeFee: '充值费用:',
-        atmFee: 'ATM取现:',
-        atmFeeDesc: 'Free in Europe (other 2%)',
-        atmFeeDesc2: 'Free in Europe (other 2%)',
-        spendFee: '消费手续费:',
-        annualFee: '年费:',
-        annualFeeDesc: 'Free',
-        usageArea: '使用地区:',
-        free: '免费',
-        submit: '提交',
-        masterCard: 'MasterCard 实体卡',
-        visaVirtualCard: 'Visa 虚拟卡(至珍卡)',
-        visaPhysicalCard: 'Visa 实体卡',
-        visaVirtualCard2: 'Visa 虚拟卡(畅游卡)',
-        masterCardDesc: '该卡支持全球线上和线下消费,ATM机取现;支持绑定PayPal/微信/支付宝等场景。',
-        visaVirtualCardDesc: '支持Apple Pay,Google Pay,微信,支付宝场景使用,无单笔消费限额,支持超大额消费。(卡片激活预计1-72小时完成)。',
-        visaPhysicalCardDesc: '该卡片能力强,支持和覆盖全球全平台的线上线下消费,ATM取现等功能(卡片激活时间预计需要48小时)。',
-        visaVirtualCard2Desc: '该卡片支持和覆盖全球全平台的线上消费功能。最擅长商户: Apple,Facebook,Walmart,PAYPAL',
-        status: '状态',
-        statusDesc: '可用',
-        statusDesc2: '不可用',
-        currency: '币种',
-        needPhotoForActiveCard: '激活卡片时是否需要手持护照和银行卡照片',
-        needPhotoForActiveCardDesc: '需要',
-        needPhotoForActiveCardDesc2: '不需要',
-        needPhotoForOperateCard: '冻结、解冻和找回密码时是否需要提供用户签名照',
-        needPhotoForOperateCardDesc: '需要',
-        needPhotoForOperateCardDesc2: '不需要',
-    },
-    kyc: {
-        title: 'KYC认证',
-        desc: '请填写您的身份信息以完成认证',
-        type: '证件类型',
-        i1: 'EEA文件证照',
-        i2: '手持照片',
-        data: '证件照片',
-        firstName: '名',
-        lastName: '姓',
-        address: '邮寄地址',
-        email: '邮箱',
-        phone: '手机号',
-        phoneCode: '区号',
-        postalCode: '邮政编码',
-        submit: '提交',
-        kycSuccess: '身份认证成功',
-        kycFail: '身份认证失败',
-        step1: '身份认证',
-        step2: '支付',
-        step3: '邮寄',
-        step1Desc: '请填写您的身份信息以完成认证',
-        step2Desc: '请填写您的支付信息以完成支付',
-        step3Desc: '请填写您的邮寄信息以完成邮寄',
-        step4Desc: '请填写您的支付信息以完成支付',
-        kycFailDesc: '请填写完整的身份认证信息',
-        emailError: '请输入正确的邮箱格式',
-        phoneError: '请输入正确的手机号格式',
-        postalCodeError: '请输入正确的邮政编码格式',
-        amountError: '请输入正确的金额',
-        currencyError: '请选择正确的币种',
-        shippingAddressError: '请输入正确的邮寄地址',
-        amount: '金额',
-        currency: '币种',
-        shippingAddress: '邮寄地址',
-        next: '下一步',
-        submitKyc: '提交认证',
-        country: '选择区号',
-        status: '状态',
-        statusDesc: '不存在',
-        statusDesc2: '审核中',
-        statusDesc3: '认证成功',
-        statusDesc4: '拒绝',
-
-    },
-    'eur-remit': {
-        title: '全球速汇',
-        available: '可速汇余额:',
-        country: '国家和地区',
-        currency: '币种',
-        amount: '金额',
-        amountPlaceholder: '请输入欧元金额,最低金额100',
-        note: '附言',
-        notePlaceholder: '请输入Note(附言码)',
-        select: '请选择',
-        next: '下一步',
-        "item1":"收款银行:",
-        "item2":"交易货币:",
-        "item3":"目标货币代码:",
-        "item4":"目标国家代码:",
-        "item5":"汇率:",
-        "item6":"基本信息",
-        "item7":"收款银行ID:",
-        "item8":"用户唯一ID:",
-        "item9":"速汇金额:",
-        "item10":"附言:",
-        "item11":"收付款人关系:",
-        "item12":"兄弟",
-        "item13":"姐夫/妹夫",
-        "item14":"堂/表兄弟姐妹",
-        "item15":"女儿",
-        "item16":"父亲",
-        "item17":"岳父/公公",
-        "item18":"朋友",
-        "item19":"祖父",
-        "item20":"祖母",
-        "item21":"丈夫",
-        "item22":"母亲",
-        "item23":"岳母/婆婆",
-        "item24":"侄子/外甥",
-        "item25":"侄女/外甥女",
-        "item26":"本人",
-        "item27":"姐妹",
-        "item28":"兄嫂/弟妹",
-        "item29":"儿子",
-        "item30":"叔伯/舅姑",
-        "item31":"妻子",
-        "item32":"其他",
-        "item33":"资金来源:",
-        "item34":"现金",
-        "item35":"商业",
-        "item36":"礼物",
-        "item37":"工资",
-        "item38":"彩票",
-        "item39":"储蓄",
-        "item40":"其他",
-        "item41":"付款目的:",
-        "item42":"购买货物或服务",
-        "item43":"运费和运输成本",
-        "item44":"教育费用",
-        "item45":"移民投资",
-        "item46":"慈善捐赠",
-        "item47":"家庭支持",
-        "item48":"股息或利息支付",
-        "item49":"国际贸易",
-        "item50":"付款人信息",
-        "item51":"付款人类型:",
-        "item52":"个人",
-        "item53":"付款人姓:",
-        "item54":"付款人名:",
-        "item55":"付款人证件号码:",
-        "item56":"付款人证件类型:",
-        "item57":"护照",
-        "item58":"身份证",
-        "item59":"证件颁发国家:",
-        "item60":"请选择证件颁发国家",
-        "item61":"出生日期:",
-        "item62":"国籍:",
-        "item63":"请选择国籍",
-        "item64":"手机号码:",
-        "item65":"居住国家:",
-        "item66":"请选择居住国家",
-        "item67":"居住城市代码:",
-        "item68":"请选择居住城市",
-        "item69":"地址:",
-        "item70":"邮编:",
-        "item71":"职业:",
-        "item72":"校验付款人",
-        "item73":"收款人信息",
-        "item74":"收款人银行ID:",
-        "item75":"收款人账号:",
-        "item76":"收款人户名:",
-        "item77":"收款人居住国家:",
-        "item78":"请选择收款人居住国家",
-        "item79":"收款人居住城市:",
-        "item80":"请选择收款人居住城市",
-        "item81":"收款人地址:",
-        "item82":"收款人邮编:",
-        "item83":"收款人姓:",
-        "item84":"收款人名:",
-        "item85":"收款人银行编码:",
-        "item86":"收款人国籍:",
-        "item87":"请选择收款人国籍",
-        "item88":"收款人证件类型:",
-        "item89":"护照",
-        "item90":"身份证",
-        "item91":"收款人证件号码:",
-        "item92":"证件有效期:",
-        "item93":"出生日期:",
-        "item94":"手机区号:",
-        "item95":"请选择区号",
-        "item96":"手机号码:",
-        "item97":"银行账户类型:",
-        "item98":"支票账户",
-        "item99":"储蓄账户",
-        "item100":"定期存款账户",
-        "item101":"其它账户",
-        "item102":"校验收款人",
-        "item103":"校验付款人",
-        "item104":"确认信息",
-        "item105":"提交代付",
-        "item106":"订单号:",
-        "item107":"商户原始订单号:",
-        "item108":"支付状态:",
-        text1: '提交调单信息或文件',
-        text2: '订单号:',
-        text3: '请输入PayouCard订单号',
-        text4: '(PayouCard订单号,必填)',
-        text5: '订单信息',
-        text6: '请提供订单相关信息',
-        text7: '请选择信息类型',
-        text8: '信息类型:',
-        text9: '请选择信息类型',
-        text10: '请输入信息内容',
-        text11: '信息内容:',
-        text12: '请输入信息内容',
-        text13: '(不支持中文字符,最多200个字符)',
-        text14: '添加订单信息',
-        text15: '订单文件',
-        text16: '请提供订单相关文件',
-        text17: '请选择文件类型',
-        text18: '文件类型:',
-        text19: '请选择文件类型',
-        text20: '请上传文件',
-        text21: '文件:',
-        text22: '选择文件',
-        text23: '删除',
-        text24: '(每个文件不能超过2M,只支持图片格式',
-        ms: '最低金额100EUR,最多2位小数',
-        ms3: '请输入银行ID',
-        ms4: '请输入用户唯一ID',
-        ms5: '请输入商户订单号',
-        ms6: '请输入速汇金额',
-        ms7: '请输入附言',
-        ms8: '长度在5到64个字符之间',
-        ms9: '请输入付款人姓',
-        ms10: '长度在2到50个字符之间',
-        ms10_1: '请输入付款人名',
-        ms11: '请输入付款人证件号码',
-        ms12: '长度在6到18个字符之间',
-        ms13: '请选择付款人证件类型',
-        ms14: '请输入证件颁发国家',
-        ms15: '2位国家代码',
-        ms16: '请选择出生日期',
-        ms17: '请输入国籍',
-        ms18: '请输入手机号码',
-        ms19: '例如:+37012345678,长度在8到15个字符之间',
-        ms20: '请输入居住国家',
-        ms21: '2位国家代码',
-        ms22: '请输入居住城市代码',
-        ms23: '请输入地址',
-        ms24: '长度在10到100个字符之间',
-        ms25: '请输入邮编',
-        ms26: '长度在3到9个字符之间',
-        ms27: '请输入职业',
-        ms28: '长度在3到20个字符之间',
-        ms29: '请输入收款人账号',
-        ms30: '长度在2到48个字符之间',
-        ms31: '请输入收款人户名',
-        ms32: '长度在1到100个字符之间',
-        ms33: '长度在2到60个字符之间',
-        ms34: '长度在2到60个字符之间',
-        ms35: '请输入银行ID',
-        ms36: '请输入收款人账号',
-        ms37: '长度在2到48个字符之间',
-        ms38: '请输入收款人户名',
-        ms39: '长度在1到100个字符之间',
-        ms40: '请输入订单号',
-        ms41: '收款人ID',
-        ms42: '收款人电话',
-        ms43: '收款人银行',
-        ms44: '收款人开户行',
-        ms45: '收款人开户行',
-        ms46: '收款人地址',
-        ms47: '收款人出生日期',
-        ms48: '支付证明',
-        ms49: '银行流水',
-        ms50: '交易合同',
-        ms51: '交易发票',
-        ms52: '订单截图',
-        ms53: '身份证明',
-        ms54: '文件上传成功',
-        ms55: '文件上传失败',
-        ms56: '只能上传JPG/PNG格式的图片!',
-        ms57: '图片大小不能超过2MB',
-        ms58: '请完善表单信息',
-        ms59: '至少需要提供一项订单信息或文件',
-        ms60: '调单信息提交成功',
-        ms61: '提交失败',
-        ms62: '未知错误',
-        ms63: '上传失败',
-        ms64: '查询法币汇率失败',
-        ms65: '查询失败',
-        ms66: '支持银行:',
-        ms67: '最低金额100EUR',
-        ms68: '不支持中文字符',
-        ms69: '字符长度为',
-        ms70: '只支持英文',
-        ms71: '获取区号失败',
-        ms72: '收款人校验通过',
-        ms73: '付款人校验通过',
-        ms74: '整体校验通过',
-        ms75: '代付校验通过',
-        prev: '上一步',
-        submit: '提交',
-        mobileFormat: '请输入正确的手机号格式',
-        mobileCodeFormat: '请输入正确的区号格式',
-        postalCodeFormat: '请输入正确的邮政编码格式',
-        amountFormat: '请输入正确的金额格式',
-        currencyFormat: '请选择正确的币种',
-        shippingAddressFormat: '请输入正确的邮寄地址',
-        amountError: '请输入正确的金额',
-        currencyError: '请选择正确的币种',
-        shippingAddressError: '请输入正确的邮寄地址',
-        required:'',
-        requiredFieldsMissing:'请填写完整信息',
-        item95_1:'',
-        item95_2:'',
-        orderNo:'订单号',
-        paymentSuccess:'支付成功',
-        paymentFailed:'支付失败',
-        paymentError:'支付失败',
-        validateError:'校验失败',
-        validateFailed:'校验失败',
-        validateSuccess:'校验成功',
-        search:'搜索选项',
-    },
-    eur: {
-        title: 'EUR',
-        globalRemit: '全球速汇',
-        transactionRecord: '速汇记录',
-        eurTopup: 'eur充值'
-
-    },
-    'remit-success':{
-        title:'支付成功',
-        orderNo:'订单号',
-        paymentSuccess:'支付成功',
-        paymentFailed:'支付失败',
-        paymentError:'支付失败',
-        validateError:'校验失败',
-        validateFailed:'校验失败',
-        validateSuccess:'校验成功',
-        successTitle:'支付成功',
-        viewDetail:'查看详情',
-        backToHome:'返回首页',
-    },
-    'transfer-detail': {
-        title: '交易详情',
-        step1: '速汇申请',
-        step2: '处理中',
-        step3: '已成功',
-        amount: '金额',
-        currency: '币种',
-        status: '订单状态',
-        withdrawn: '已速汇',
-        time: '时间',
-        relationship: '收付款人关系',
-        relationship1: '兄弟',
-        relationship2: '姐夫/妹夫',
-        relationship3: '堂/表兄弟姐妹',
-        relationship4: '女儿',
-        relationship5: '父亲',
-        relationship6: '岳父/公公',
-        sourceFunds: '资金来源',
-        sourceFunds1: '现金',
-        sourceFunds2: '商业',
-        sourceFunds3: '礼物',
-        sourceFunds4: '工资',
-        sourceFunds5: '彩票',
-        sourceFunds6: '储蓄',
-        orderNo: '订单号',
-        mobile: '手机号码',
-        email: '邮箱',
-        country: '居住国家',
-        city: '居住城市',
-        address: '居住地址',
-        postalCode: '邮政编码',
-        occupation: '职业',
-        accountName: '收款人户名',
-        accountNumber: '收款人账号',
-        B1: '待处理',
-        B2: '支付中',
-        B3: '支付成功',
-        B4: '支付失败',
-        B6: '退款',
-        B11: '调单_待提交',
-        B12: '调单_待审核',
-        B13: '调单_审核通过',
-        B15: '调单_审核拒绝',
-        addTime: '创建时间',
-        postscript: '附言',
-        payPurpose: '付款目的',
-        name: '姓名',
-    },
-    remit: {
-        title: 'USDT',
-        available: 'USDT余额',
-        amount: 'USDT金额',
-        amountPlaceholder: '请输入USDT金额',
-        currency: 'USDT',
-        buy: '购买',
-        sell: '卖出',
-        recharge: '充值',
-        withdraw: '提现',
-        record: '交易记录',
-        item1: '购买',
-        item2: '卖出',
-        item3: '链上充值',
-        item4: '链上提现',
-    },
-    'reset-password': {
-        title: '重置密码',
-        email: '邮箱',
-        emailPlaceholder: '请输入邮箱',
-        emailError: '请输入正确的邮箱格式',
-        emailRequired: '请输入邮箱',
-        remember: '记起密码了?',
-        login: '返回登录',
-        reset: '重置密码',
-        resetSuccess: '',
+    'improve-info': {
+        title: '完善信息',
+        p3: '请输入信息',
+        p3_1: '请输入姓',
+        p3_2: '请输入名',
+        p3_3: '请输入手机号',
+        p3_4: '请输入详细地址',
+        p3_5: '请输入邮箱',
+        p4: '区号',
+        p5: '请选择区号',
+        p6: '手机号',
+        p7: '邮箱',
+        p8: '姓',
+        p9: '名',
+        p10: '生日',
+        p11: '国籍',
+        p12: '请选择国籍',
+        p13: '性别',
+        p14: '请选择',
+        p15: '男',
+        p16: '女',
+        p17: '国家',
+        p18: '请选择国家',
+        p19: '城市',
+        p20: '请选择城市',
+        p21: '详细地址',
+        p22: '邮编',
+        p23: '证件类型',
+        p24: '请选择证件类型',
+        p25: '香港身份证',
+        p26: '护照',
+        p27: '证件号',
+        p28: '证件到期',
+        p28_1: '上传你的',
+        p28_2: '单击以选择文件',
+        p29: '证件照片',
+        p30: '人脸照片',
+        p31: '扩展字段',
+        p32: '取消',
+        p33: '提交',
+        p34: 'DLN',
+        p35: '政府签发的身份证',
+        Des1: '提交成功,待审核中...',
+        Des11: '请使用手机扫描下方二维码完成认证,如已完成,请留意后续邮箱通知',
+        kycSuccess: '完善成功',
+        errer: '请填写完整信息',
     },
-    "card-activation":{
-        title:'卡片激活',
-        cardNo: '银行卡号',
-        activePhoto: '手持护照和银行卡照图片',
-        activePhotoRequired: '请上传手持护照和银行卡照图片',
-        submit:'激活',
-        submitRequired:'激活成功',
-
+    'card': {
+        title: 'CWG Card',
+        tab1: '充值紀錄',
+        tab2: '交易紀錄',
+        tab3: '個人資訊',
+        tab4: '修改密碼',
+        tab5: 'CWG 卡片',
+        tab6: '完善資訊',
+        tab7: '充值紀錄',
+        tab8: '交易紀錄',
+        tab9: '申請開卡',
+        tab10: '啟用',
+        tab11: '卡片充值',
+        tab12: '修改密碼',
+        tab13: '凍結帳號',
+        tab14: '解凍帳號',
+        tab15: '開卡申請紀錄',
+        tab16: '開卡進度',
+        tab17: '錢包餘額紀錄',
+        tab18: '選擇卡片',
+        tab19: '確認資訊',
+        Status: {
+            t1: '成功',
+            t2: '失敗',
+            t3: '處理中',
+            t4: '已授權',
+            t5: '待處理',
+            t6: '開卡成功',
+            t7: '開卡失敗',
+            t8: '扣款成功',
+            t9: '扣款失敗',
+            t10: '退款成功',
+            t11: '退款失敗',
+            t12: '退款處理中',
+            t13: '待審核',
+            t14: '審核通過',
+            t15: '審核拒絕',
+            t16: '提款',
+            t17: '取款',
+            t18: '充值',
+            t19: '退款',
+            t20: '手動轉入',
+            t21: '手動轉出',
+            t22: '全部',
+            v1: '註冊資訊',
+            v2: '修改資訊',
+            v3: '取得人臉認證連結',
+            v4: 'KYC人工審核',
+            v5: '開卡申請',
+            v6: '開卡審批',
+            v7: '取得啟用碼',
+            v8: '啟用卡片',
+            v9: '預設儲值金額',
+            v10: '出金到錢包',
+            v11: '入金到錢包',
+            v12: '卡片儲值申請',
+            v13: '儲值審批',
+            v14: '凍結',
+            v15: '解凍',
+            v16: '修改密碼',
+            v17: '操作員CID帳號',
+        },
+        Msg: {
+            m1: '您的開卡申請已提交,審核通過後會通過郵箱發送通知!',
+            m2: '您的充值申請已提交,審批通過後預計1-3個工作日內到賬!',
+            m3: '您的銀行卡激活資訊已提交。',
+            m4: '您的銀行卡已凍結成功!',
+            m5: '您的銀行卡已解凍成功!',
+            m6: '您的銀行卡密碼已修改成功!',
+            m7: '充值成功',
+            m8: '複製成功!',
+            m9: '複製失敗!',
+            m10: '您的銀行卡已被凍結,請激活後再進行操作!',
+            m11: '暫無可申請的卡片類型',
+            m12: '您目前還沒有訪問的權限,請聯繫管理員!',
+            m13: '刪除提示',
+            m14: '您確認要刪除該規則嗎?',
+            m15: '更新成功',
+            m16: '證件照正面照上傳成功',
+            m17: '證件照背面照上傳成功',
+            m18: '手持證件照上傳成功',
+            m19: '上傳頭像圖片大小不能超過 2MB!',
+            m20: '上傳頭像圖片只能是 JPG/PNG 格式!',
+        },
+        Info: {
+            s0: '職業與財務(可跳過)',
+            s0_1: '職業與財務',
+            s1: '個人資訊',
+            s2: '身份認證',
+            s3: '審核',
+            s4: '您的資訊已完成認證,您可以去開卡申請頁面申請卡片。',
+            s5: '我們的團隊將審核您的申請和 KYC 文件。審核通過後,您將收到確認郵件。',
+            s6: '審核中',
+            s7: '已認證',
+            s8: '持卡人',
+            s9: '到期時間',
+            s10: '申請卡片',
+            s11: '請按步驟流程申請卡片。',
+            s12: '申請流程',
+            s13: '選擇卡片:',
+            s14: '請選擇您所需的卡片類型。',
+            s15: '確認資訊:',
+            s16: '請確認您的資訊。',
+            s17: '申請審核:',
+            s18: '我們的團隊將審核您的申請,審核通過後您將收到確認郵件。',
+            s19: '發卡:',
+            s20: '卡片將在審核通過後5-7個工作日內郵寄至您的註冊地址。',
+            s21: '如有疑問或需要幫助,請隨時聯繫我們的客服團隊。祝您用卡愉快!',
+            s22: '收到卡片:',
+            s23: '請確認收到卡片時信封完好無損。',
+            s24: '在線激活:',
+            s25: 'CWG Markets客戶中心,並進入“啟用卡片”頁面,輸入您的卡號和激活碼(隨卡片提供)。',
+            s26: '設置PIN碼:',
+            s27: '按照提示設置您的個人識別碼(PIN碼),用於ATM取款和購物支付。',
+            s28: '開始使用:',
+            s29: '激活成功後,您即可開始使用您的Visa借記卡進行消費和取款。',
+            s30: '該卡片支持:Wechatpay、Alipay、Applepay等電子支付綁定支持境內外POS及ATM取現。',
+            s31: '我們已經收到您的開卡申請,請等待第三方完成手續扣費,扣款成功後我們會立刻提交您的開卡申請!',
+            s32: '扣款失敗,手續費將退至您的帳戶,請重新申請開卡!',
+            s33: '扣款失敗,手續費已退款至您的帳戶,請重新申請開卡!',
+            s34: '您的開卡申請手續費已交扣費完成,我們會立刻提交您的開卡申請!',
+            s35: '您的開卡申請未通過,請聯繫工作人員進行解決!',
+            s36: '您的卡片已通過審核,將在5-7個工作日內郵寄至您的註冊地址。',
+            s37: '很抱歉,您的開卡申請未通過審核,請重新申請。',
+            s38: '您的開卡申請已經提交第三方審核,後續開卡成功後我們將在審核通過後的5-7個工作日內郵寄至您的註冊地址。',
+            s39: '手續費狀態',
+            s40: '審批狀態',
+            s41: '開卡狀態',
+            s42: '我們的團隊已收到您的信息,請先掃碼下方二維碼完成身份驗證。',
+            s43: '您的註冊信息已更新成功。',
+            t1: '待審核',
+            t2: '審核通過',
+            t3: '審核拒絕',
+            t5: '處理中',
+            t6: '開卡成功',
+            t7: '開卡失敗',
+            t8: '扣款成功',
+            t9: '扣款失敗',
+            t10: '待處理',
+            t11: '退款中',
+            t12: '退款成功',
+            t13: '退款失敗',
+            t15: '狀態:',
+            t16: '開卡處理中(請耐心等待)',
+            t17: '開卡失敗(請等退款成功重新申請)',
+            t18: '開卡成功(請啟用卡片)',
+            t19: '卡片激活中(請耐心等待)',
+            t20: '卡片激活失敗(請重新激活卡片)',
+        },
+        Form: {
+            v1: '男',
+            v2: '女',
+            v3: '香港身份證',
+            v4: '護照',
+            v5: '駕照',
+            v6: '政府簽發的身份證',
+            f1: '區號',
+            f2: '手機號',
+            f3: '郵箱',
+            f4: '姓',
+            f5: '名',
+            f6: '出生日期',
+            f7: '國籍',
+            f8: '性別',
+            f9: '城市',
+            f10: '地址',
+            f11: '郵編',
+            f12: '職業',
+            f13: '年薪',
+            f14: '賬戶用途',
+            f15: '預期月交易量',
+            f16: '證件類型',
+            f17: '證件號碼',
+            f18: '社會安全號',
+            f19: '證件簽發日期',
+            f20: '證件到期日期',
+            f21: '身份證正面照片',
+            f22: '身份證背面照片',
+            f23: '手持身份證照片',
+            f24: '銀行卡號',
+            f25: '交易密碼',
+            f26: '激活碼',
+            f27: '備註',
+            f28: '充值金額',
+            f29: '幣種',
+            f30: '手續費',
+            f31: '到賬金額',
+            f32: '到賬幣種',
+            f33: '申請時間',
+            f34: '確認密碼',
+            f35: '交易流水號',
+            f36: '交易幣種',
+            f37: '交易金額',
+            f38: '授權金額',
+            f39: '授權幣種',
+            f40: '授權手續費',
+            f41: '商戶名稱',
+            f42: '交易類型',
+            f43: '交易時間',
+            f44: '跨境交易手續費',
+            f45: '狀態',
+            f46: '交易描述',
+            f47: '手續費狀態',
+            f48: '卡片類型',
+            f49: '卡片名稱',
+            f50: '卡片狀態',
+            f51: '時間',
+            f52: '類型',
+            f53: '審批狀態',
+            f54: '充值狀態',
+            f55: '金額',
+            f56: '錢包餘額:',
+            f57: '全部',
+            f58: '費率:',
+            f59: '預估手續費:',
+        },
+        vaildate: {
+            v1: '請選擇區號',
+            v2: '請輸入5-20位手機號',
+            v3: '請輸入名,只支持英文字符,[2...23]位。名和姓總長度不能超過23字符(含空格)',
+            v4: '請輸入姓,只支持英文字符,[2...23]位。名和姓總長度不能超過23字符(含空格)',
+            v5: '請選擇出生日期',
+            v6: '請選擇國籍',
+            v7: '請選擇城市',
+            v8: '請輸入郵編',
+            v9: '請選擇性別',
+            v10: '請選擇職業',
+            v11: '請輸入年薪,例如:200000 USD',
+            v12: '請輸入賬戶用途,僅支持英文,例如:Living Expense',
+            v13: '請輸入預期月交易量,例如:100000 USD',
+            v14: '請選擇證件類型',
+            v15: '請輸入證件號碼',
+            v16: '請輸入9位社會安全號',
+            v17: '請選擇證件簽發日期',
+            v18: '請選擇證件到期日期',
+            v19: '請選擇身份證正面照片文件',
+            v20: '請選擇身份證背面照片文件',
+            v21: '請選擇手持身份證照片文件',
+            v22: '請輸入卡號',
+            v23: '請輸入6位交易密碼',
+            v24: '請輸入激活碼',
+            v25: '請輸入備註',
+            v26: '請輸入充值金額',
+            v27: '請輸入地址',
+            v28: '請輸入郵箱',
+            v29: '兩次密碼輸入不一致',
+            v30: '請再次輸入密碼',
+            v31: '使用6位數字',
+            v32: '不得使用連續或重複數字',
+            v33: '金額必須大於 0',
+            v34: '充值金額不能超過',
+            v35: '充值金額不能小於',
+            v36: '充值金額不能超過',
+            v37: '只能輸入英文字符(可含空格)',
+            v38: '長度需在 2 ~ 23 位之間',
+            v39: '名和姓總長度不能超過 23 位(含空格)',
+        },
+        Btn: {
+            Next: '下一步',
+            Previous: '上一步',
+            Submit: '提交',
+            Confirm: '確認',
+            Cancel: '取消',
+            Update: '更新',
+            Auth: '認證',
+            Freeze: '凍結',
+            Unfreeze: '解凍',
+            Recharge: '充值',
+            Activate: '激活',
+            b1: '激活卡片',
+            b2: '查看',
+            b3: '充值申請',
+            b4: '修改密碼',
+            b5: '凍結卡片',
+            b6: '解凍卡片',
+            b7: '申請開卡',
+            b8: '獲取激活碼',
+            b9: '複製激活碼',
+            b10: '餘額',
+            b11: '查詢開卡進度',
+            b12: '重新開卡',
+            b13: '激活中',
+            b14: '解凍中',
+            b15: '凍結中',
+            b16: '關閉',
+        },
+        New: {
+            n0: '地址長度2–200位,只能包含字母、數字、連字號和空格',
+            n1: '地址長度2–40位,只能包含字母、數字、連字號和空格',
+            n2: '郵編只能輸入2–15位字符',
+            n3: '您的年齡未滿18周歲',
+            n4: '價格:',
+            n5: '開卡時是否需要持卡人:',
+            n6: '支持充值的幣種:',
+            n7: '充值最小額度:',
+            n8: '充值最小額度:',
+            n9: '費率:',
+            n10: '抵扣方式',
+            n11: '英文地址',
+        },
+        Transactions: {
+            t1: '授權',
+            t2: '退款',
+            t3: '驗證',
+            t4: '撤銷',
+            t5: '卡費(月費、年費、ATM 提現費....)',
+            t6: '轉出',
+            t7: '結算調整',
+            t8: '餘額查詢',
+            t9: '手續費',
+            t10: '消費',
+            t11: '消費失敗',
+            t12: '退款',
+            t13: '撤銷',
+            t14: '其他',
+            t15: '綁卡驗證交易',
+            t16: '管理費',
+            t17: '結算',
+            t18: '成功',
+            t19: '沖正',
+            t20: '被沖正',
+            t21: '被撤銷',
+            t22: '撤銷',
+            t23: '退貨',
+            t24: '已授權',
+            t25: '失敗',
+            t26: '退貨',
+        },
+        New1: {
+            title: '完善信息',
+            f1: '您的證件照已補充完成,請等待審核結果!',
+            f2: '補充成功',
+            f3: '手機掃碼上傳證件',
+            f4: '是否手動上傳證件照',
+            d1: '上傳你的身份證正面照片',
+            d2: '上傳你的身份證背面照片',
+            d3: '上傳你的手持身份證照片',
+            d4: '單擊以選擇文件',
+            d5: '上傳成功',
+            d6: '上傳失敗',
+            d7: '上傳中...',
+            d8: '郵寄國籍',
+            d9: '郵寄城市',
+            d10: '郵寄地址',
+            d11: '郵寄英文地址',
+            d12: '郵寄郵編',
+            d13: '郵寄手機號',
+            d14: '文件不能超過2MB',
+            titel1: '語言設置',
+        },
     },
-    "improve-info":{
-        title: '完善信息',
-        "p3": "请输入信息",
-        "p4": "区号",
-        "p5": "请选择区号",
-        "p6": "手机号",
-        "p7": "邮箱",
-        "p8": "姓",
-        "p9": "名",
-        "p10": "生日",
-        "p11": "国籍",
-        "p12": "请选择国籍",
-        "p13": "性别",
-        "p14": "请选择",
-        "p15": "男",
-        "p16": "女",
-        "p17": "国家",
-        "p18": "请选择国家",
-        "p19": "城市",
-        "p20": "请选择城市",
-        "p21": "详细地址",
-        "p22": "邮编",
-        "p23": "证件类型",
-        "p24": "请选择证件类型",
-        "p25": "身份证",
-        "p26": "护照",
-        "p27": "证件号",
-        "p28": "证件到期",
-        "p29": "证件照片",
-        "p30": "人脸照片",
-        "p31": "扩展字段",
-        "p32": "取消",
-        "p33": "提交",
-    }
 }

+ 5 - 4
src/main.ts

@@ -4,26 +4,27 @@ import { createHead } from '@unhead/vue/client'
 import { createPinia } from 'pinia'
 import { createApp } from 'vue'
 
+import { i18n } from '@/i18n'
 import App from './App.vue'
+import vEllipsis from './directives/v-ellipsis'
 import global from './plugin/global'
 import vant from './plugin/vant'
-import router from './router'
-import {i18n} from '@/i18n'
 
+import router from './router'
 import 'uno.css'
 import 'vue-cropper/dist/index.css'
 import 'vant/es/toast/style'
 import 'vant/es/dialog/style'
 import 'vant/es/notify/style'
-import 'vant/es/image-preview/style'
 
+import 'vant/es/image-preview/style'
 import './assets/scss/global/global.scss'
 import './assets/scss/style.scss'
 
 const app = createApp(App)
 const store = createPinia()
 const head = createHead()
-
+app.directive('ellipsis', vEllipsis)
 app.use(i18n).use(store).use(router).use(head).use(vant).use(global)
 
 app.mount('#app')

+ 5 - 2
src/router/index.ts

@@ -1,6 +1,7 @@
 import type { RouteRecordRaw } from 'vue-router'
 import { createRouter, createWebHashHistory } from 'vue-router'
 import { userToken } from '@/composables/config'
+
 const pages = import.meta.glob('../views/*.vue')
 
 let routes: Array<RouteRecordRaw> = []
@@ -35,12 +36,14 @@ router.beforeEach((to, from, next) => {
     if (isLoggedIn) {
         // 已登录状态
         next()
-    } else {
+    }
+    else {
         // 未登录状态
         if (whiteList.includes(to.path)) {
             // 在白名单中,允许访问
             next()
-        } else {
+        }
+        else {
             // 不在白名单中,重定向到登录页
             next('/login')
         }

+ 35 - 0
src/stores/use-transfer-store.ts

@@ -0,0 +1,35 @@
+import { defineStore } from 'pinia'
+import ls from 'store2'
+import { ref } from 'vue'
+import crypt from '../composables/crypt'
+
+const TRANSFER_INFO_KEY = 'transferInfo'
+const useTransferStore = defineStore('transferStore', () => {
+    const transferInfo = ref({})
+    const initTransferInfo = () => {
+        const encryptedTransferInfo = ls.get(TRANSFER_INFO_KEY)
+        if (encryptedTransferInfo) {
+            const decryptedTransferInfo = crypt.decrypt(encryptedTransferInfo)
+            if (decryptedTransferInfo) {
+                transferInfo.value = JSON.parse(decryptedTransferInfo)
+            }
+        }
+    }
+    const saveTransferInfo = (info: any) => {
+        transferInfo.value = info
+        const decryptedCard = crypt.encrypt(JSON.stringify(info))
+        ls.set(TRANSFER_INFO_KEY, decryptedCard)
+    }
+    const clearTransferInfo = () => {
+        transferInfo.value = {}
+        ls.remove(TRANSFER_INFO_KEY)
+    }
+    initTransferInfo()
+    return {
+        transferInfo,
+        saveTransferInfo,
+        clearTransferInfo,
+    }
+})
+
+export default useTransferStore

+ 94 - 73
src/stores/use-user-store.ts

@@ -1,92 +1,113 @@
 import { defineStore } from 'pinia'
-import { ref } from 'vue'
 import ls from 'store2'
-import crypt from '../composables/crypt'
+import { ref } from 'vue'
 import { userToken } from '../composables/config'
+import crypt from '../composables/crypt'
 
 export interface UserInfo {
-  id?: string
-  name: string
-  email: string
-  phone: string
+    id?: string
+    name: string
+    email: string
+    phone: string
+    approveStatus?: number
 }
 export interface AccountInfo {
-  loginName: string
-  password: string
-  rememberPassword: boolean
+    loginName: string
+    password: string
+    rememberPassword: boolean
 }
 const STORAGE_KEY = 'user'
 const CARD_KEY = 'cardList'
+const APPLY_CARD_KEY = 'applyList'
 const ACCOUNT_INFO_KEY = 'accountInfo'
 const useUserStore = defineStore('userStore', () => {
-  const userInfo = ref<UserInfo | null>(null)
-  const accountInfo = ref<AccountInfo | null>(null)
-  const isLoggedIn = ref(false)
-  const userCard = ref([])
-  const initUserInfo = () => {
-    const encryptedInfo = ls.get(STORAGE_KEY)
-    if (encryptedInfo) {
-      const decryptedInfo = crypt.decrypt(encryptedInfo)
-      if (decryptedInfo) {
-        userInfo.value = JSON.parse(decryptedInfo)
+    const userInfo = ref<UserInfo | null>(null)
+    const accountInfo = ref<AccountInfo | null>(null)
+    const isLoggedIn = ref(false)
+    const userCard = ref([])
+    const applyCard = ref([])
+    const initUserInfo = () => {
+        const encryptedInfo = ls.get(STORAGE_KEY)
+        if (encryptedInfo) {
+            const decryptedInfo = crypt.decrypt(encryptedInfo)
+            if (decryptedInfo) {
+                userInfo.value = JSON.parse(decryptedInfo)
+                isLoggedIn.value = true
+            }
+        }
+    }
+    const initAccountInfo = () => {
+        const encryptedInfo = ls.get(ACCOUNT_INFO_KEY)
+        if (encryptedInfo) {
+            const decryptedInfo = crypt.decrypt(encryptedInfo)
+            if (decryptedInfo) {
+                accountInfo.value = JSON.parse(decryptedInfo)
+            }
+        }
+    }
+    const initUserCard = () => {
+        const encryptedCard = ls.get(CARD_KEY)
+        if (encryptedCard) {
+            const decryptedCard = crypt.decrypt(encryptedCard)
+            if (decryptedCard) {
+                userCard.value = JSON.parse(decryptedCard)
+            }
+        }
+    }
+    const initApplyCard = () => {
+        const encryptedCard = ls.get(APPLY_CARD_KEY)
+        if (encryptedCard) {
+            const decryptedCard = crypt.decrypt(encryptedCard)
+            if (decryptedCard) {
+                applyCard.value = JSON.parse(decryptedCard)
+            }
+        }
+    }
+    const saveUserInfo = (info: UserInfo) => {
+        userInfo.value = info
         isLoggedIn.value = true
-      }
+        const encryptedInfo = crypt.encrypt(JSON.stringify(info))
+        ls.set(STORAGE_KEY, encryptedInfo)
+    }
+    const saveAccountInfo = (info: AccountInfo) => {
+        accountInfo.value = info
+        const encryptedInfo = crypt.encrypt(JSON.stringify(info))
+        ls.set(ACCOUNT_INFO_KEY, encryptedInfo)
+    }
+    const saveUserCard = (info: any) => {
+        userCard.value = info
+        const decryptedCard = crypt.encrypt(JSON.stringify(info))
+        ls.set(CARD_KEY, decryptedCard)
+    }
+    const saveApplyCard = (info: any) => {
+        applyCard.value = info
+        const decryptedCard = crypt.encrypt(JSON.stringify(info))
+        ls.set(APPLY_CARD_KEY, decryptedCard)
     }
-  }
-  const initAccountInfo = () => {
-    const encryptedInfo = ls.get(ACCOUNT_INFO_KEY)
-    if (encryptedInfo) {
-      const decryptedInfo = crypt.decrypt(encryptedInfo)
-      if (decryptedInfo) {
-        accountInfo.value = JSON.parse(decryptedInfo)
-      }
+    const clearUserInfo = () => {
+        userInfo.value = null
+        isLoggedIn.value = false
+        userToken.value = ''
+        userCard.value = []
+        applyCard.value = []
+        ls.remove(STORAGE_KEY)
     }
-  }
-  const initUserCard = () => {
-    const encryptedCard = ls.get(CARD_KEY)
-    if (encryptedCard) {
-      const decryptedCard = crypt.decrypt(encryptedCard)
-      if (decryptedCard) {
-        userCard.value = JSON.parse(decryptedCard)
-      }
+    initUserCard()
+    initApplyCard()
+    initUserInfo()
+    initAccountInfo()
+    return {
+        userInfo,
+        accountInfo,
+        isLoggedIn,
+        userCard,
+        applyCard,
+        saveUserInfo,
+        saveAccountInfo,
+        saveUserCard,
+        saveApplyCard,
+        clearUserInfo,
     }
-  }
-  const saveUserInfo = (info: UserInfo) => {
-    userInfo.value = info
-    isLoggedIn.value = true
-    const encryptedInfo = crypt.encrypt(JSON.stringify(info))
-    ls.set(STORAGE_KEY, encryptedInfo)
-  }
-  const saveAccountInfo = (info: AccountInfo) => {
-    accountInfo.value = info
-    const encryptedInfo = crypt.encrypt(JSON.stringify(info))
-    ls.set(ACCOUNT_INFO_KEY, encryptedInfo)
-  }
-  const saveUserCard = (info: any) => {
-    userCard.value = info
-    const decryptedCard = crypt.encrypt(JSON.stringify(info))
-    ls.set(CARD_KEY, decryptedCard)
-  }
-  const clearUserInfo = () => {
-    userInfo.value = null
-    isLoggedIn.value = false
-    userToken.value = ''
-    userCard.value = []
-    ls.remove(STORAGE_KEY)
-  }
-  initUserCard()
-  initUserInfo()
-  initAccountInfo()
-  return {
-    userInfo,
-    accountInfo,
-    isLoggedIn,
-    userCard,
-    saveUserInfo,
-    saveAccountInfo,
-    saveUserCard,
-    clearUserInfo,
-  }
 })
 
 export default useUserStore

+ 158 - 0
src/utils/validators.ts

@@ -0,0 +1,158 @@
+// utils/validators.ts
+// 轻量类型声明,避免对特定 UI 库的硬依赖
+export interface FormItemRule {
+    required?: boolean
+    message?: string
+    trigger?: 'blur' | 'change'
+    pattern?: RegExp
+    validator?: (
+        rule: FormItemRule,
+        value: any,
+        callback: (error?: Error) => void,
+    ) => void
+}
+type I18nT = (key: string, ...args: any[]) => string
+
+export const Patterns = {
+    // 至少 8-20 位,包含大小写字母、数字、特殊字符中的至少三类
+    password: /^(?:(?=.*[a-z])(?=.*[A-Z])(?=.*\d)|(?=.*[a-z])(?=.*[A-Z])(?=.*[!@#$%^&*()_+=-])|(?=.*[a-z])(?=.*\d)(?=.*[!@#$%^&*()_+=-])|(?=.*[A-Z])(?=.*\d)(?=.*[!@#$%^&*()_+=-]))[\w!@#$%^&*()+=-]{8,20}$/,
+    email: /^[\w.+-]+@[A-Z0-9.-]+\.[A-Z]{2,}$/i,
+    idNumber: /^[A-Z0-9]{6,18}$/i,
+    mobile: /^\d{6,15}$/,
+    postcode: /^[a-z0-9]{1,15}$/i,
+    // 允许英文地址常见符号:空格- , . / # '
+    address: /^[A-Z0-9\s\-.,/#']+$/i,
+    // 允许中文、字母、数字、空格、连字符、常见中文分隔符与中点
+    addressCn: /^[\u4E00-\u9FA5A-Z0-9\s\-·,。、《》()()#]+$/i,
+}
+
+// ✅ 通用规则封装
+export const Validators = {
+    required: (msg: string, trigger: 'blur' | 'change' = 'blur'): FormItemRule => ({
+        required: true,
+        message: msg,
+        trigger,
+    }),
+    pattern: (regex: RegExp, msg: string, trigger: 'blur' | 'change' = 'blur'): FormItemRule => ({
+        pattern: regex,
+        message: msg,
+        trigger,
+    }),
+    custom: (
+        validator: (rule: FormItemRule, value: any, callback: (error?: Error) => void) => void,
+        trigger: 'blur' | 'change' = 'blur',
+    ): FormItemRule => ({
+        validator,
+        trigger,
+    }),
+}
+
+// ✅ 自定义校验
+export function validateAge18(
+    rule: FormItemRule,
+    value: string,
+    callback: (error?: Error) => void,
+    t: I18nT,
+) {
+    if (!value)
+        return callback(new Error(t('card.vaildate.v5')))
+    const today = new Date()
+    const birthDate = new Date(value)
+    let age = today.getFullYear() - birthDate.getFullYear()
+    const month = today.getMonth() - birthDate.getMonth()
+    if (month < 0 || (month === 0 && today.getDate() < birthDate.getDate()))
+        age--
+    age < 18 ? callback(new Error(t('card.New.n3'))) : callback()
+}
+
+export function validateAddress(
+    rule: FormItemRule,
+    value: string,
+    callback: (error?: Error) => void,
+    t: I18nT,
+) {
+    const val = String(value ?? '').trim()
+    if (val.length < 2 || val.length > 40 || !Patterns.address.test(val)) {
+        callback(new Error(t('card.New.n1')))
+    }
+    else {
+        callback()
+    }
+}
+
+export function validateName(
+    rule: FormItemRule,
+    value: string,
+    callback: (error?: Error) => void,
+) {
+    const val = String(value ?? '').trim()
+    const regex = /^[A-Z\s'-]+$/i
+    if (!val) {
+        callback(new Error('Name is required'))
+        return
+    }
+    if (!regex.test(val)) {
+        callback(new Error('Invalid name format'))
+        return
+    }
+    if (val.length < 2 || val.length > 23) {
+        callback(new Error('Name length must be 2-23 characters'))
+        return
+    }
+    // 连续空格或标点的简单规避
+    if (/\s{2,}/.test(val)) {
+        callback(new Error('Name contains consecutive spaces'))
+        return
+    }
+    callback()
+}
+
+// 复杂密码校验(独立导出,便于在表单中直接复用)
+export function validatePassword(
+    rule: FormItemRule,
+    value: string,
+    callback: (error?: Error) => void,
+    t?: I18nT,
+) {
+    const val = String(value ?? '')
+    if (!val)
+        return callback(new Error(t ? t('vaildate.password.empty') : 'Password is required'))
+    if (!Patterns.password.test(val)) {
+        return callback(
+            new Error(
+                t ? t('vaildate.password.format') : 'Password must be 8-20 chars and include 3 of: upper, lower, digit, symbol',
+            ),
+        )
+    }
+    callback()
+}
+
+export function validatePostcode(
+    rule: FormItemRule,
+    value: string,
+    callback: (error?: Error) => void,
+    t?: I18nT,
+) {
+    const val = String(value ?? '').trim()
+    if (!val)
+        return callback(new Error(t ? t('card.vaildate.v8') : 'Postcode is required'))
+    if (!Patterns.postcode.test(val)) {
+        return callback(new Error(t ? t('card.New.n2') : 'Invalid postcode'))
+    }
+    callback()
+}
+
+export function validateAddressCn(
+    rule: FormItemRule,
+    value: string,
+    callback: (error?: Error) => void,
+    t?: I18nT,
+) {
+    const val = String(value ?? '').trim()
+    if (!val)
+        return callback(new Error(t ? t('card.vaildate.v27') : 'Address is required'))
+    if (!Patterns.addressCn.test(val)) {
+        return callback(new Error(t ? t('card.vaildate.v27') : 'Invalid address characters'))
+    }
+    callback()
+}

+ 0 - 182
src/views/activate-card.vue

@@ -1,182 +0,0 @@
-<template>
-    <div class="page">
-        <div class="activate-container">
-            <div class="activate-header">
-                <h2>{{ t('activate-card.title') }}</h2>
-                <p>{{ t('activate-card.desc') }}</p>
-            </div>
-
-            <div class="activate-form">
-                <div class="form-item">
-                    <van-field
-                        v-model="form.cardNo"
-                        :placeholder="t('activate-card.cardNoPlaceholder')"
-                        :rules="[{ required: true, message: t('activate-card.cardNoPlaceholder') }]"
-                    >
-                        <template #left-icon>
-                            <van-icon name="credit-pay" />
-                        </template>
-                    </van-field>
-                </div>
-
-                <div class="form-item">
-                    <van-field
-                        v-model="form.expireDate"
-                        :placeholder="t('activate-card.expireDatePlaceholder')"
-                        :rules="[{ required: true, message: t('activate-card.expireDatePlaceholder') }]"
-                    >
-                        <template #left-icon>
-                            <van-icon name="clock-o" />
-                        </template>
-                    </van-field>
-                </div>
-
-                <div class="form-item">
-                    <van-field
-                        v-model="form.cvv"
-                        :placeholder="t('activate-card.cvvPlaceholder')"
-                        :rules="[{ required: true, message: t('activate-card.cvvPlaceholder') }]"
-                    >
-                        <template #left-icon>
-                            <van-icon name="shield-o" />
-                        </template>
-                    </van-field>
-                </div>
-
-                <div class="form-item">
-                    <van-field
-                        v-model="form.password"
-                        type="password"
-                        :placeholder="t('activate-card.passwordPlaceholder')"
-                        :rules="[
-                            { required: true, message: t('activate-card.passwordPlaceholder') },
-                            { pattern: /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)[a-zA-Z\d]{8,16}$/, message: t('activate-card.passwordPlaceholder') }
-                        ]"
-                    >
-                        <template #left-icon>
-                            <van-icon name="lock" />
-                        </template>
-                    </van-field>
-                </div>
-
-                <div class="activate-button">
-                    <van-button type="primary" block :loading="loading" @click="handleActivate">
-                        {{ t('activate-card.activate') }}
-                    </van-button>
-                </div>
-            </div>
-        </div>
-    </div>
-</template>
-
-<script setup lang="ts">
-import { showToast, showLoadingToast } from 'vant'
-import { useRouter } from 'vue-router'
-import { useI18n } from 'vue-i18n'
-
-const { t } = useI18n()
-
-defineOptions({
-    name: 'ActivateCard',
-})
-
-const router = useRouter()
-const loading = ref(false)
-
-const form = ref({
-    cardNo: '',
-    expireDate: '',
-    cvv: '',
-    password: '',
-})
-
-const handleActivate = async () => {
-    if (!form.value.cardNo || !form.value.expireDate || !form.value.cvv || !form.value.password) {
-        showToast('请填写完整信息')
-        return
-    }
-
-    loading.value = true
-    const loadingToast = showLoadingToast({
-        message: '激活中...',
-        forbidClick: true,
-    })
-
-    try {
-        // TODO: 调用激活API
-        await new Promise(resolve => setTimeout(resolve, 1000))
-        showToast('激活成功')
-        router.push('/cards')
-    } catch (error: any) {
-        showToast(error.message || '激活失败')
-    } finally {
-        loading.value = false
-        loadingToast.close()
-    }
-}
-</script>
-
-<style scoped lang="scss">
-.activate-container {
-    padding: 40px 20px;
-}
-
-.activate-header {
-    text-align: center;
-    margin-bottom: 40px;
-
-    h2 {
-        font-size: var(--font-size-24);
-        color: var(--main-yellow);
-        margin-bottom: 8px;
-    }
-
-    p {
-        font-size: var(--font-size-14);
-        color: var(--gray);
-    }
-}
-
-.activate-form {
-    .form-item {
-        margin-bottom: 20px;
-
-        .van-field {
-            background: var(--action-bg);
-            border-radius: 12px;
-            padding: 12px 16px;
-
-            :deep(.van-field__left-icon) {
-                margin-right: 12px;
-                color: var(--main-yellow);
-            }
-
-            :deep(.van-field__control) {
-                color: var(--white);
-
-                &::placeholder {
-                    color: var(--gray);
-                }
-            }
-        }
-    }
-}
-
-.activate-button {
-    margin-top: 40px;
-
-    .van-button {
-        height: 44px;
-        border-radius: 12px;
-        background: var(--main-yellow);
-        border: none;
-        color: var(--black);
-        font-size: var(--font-size-16);
-        font-weight: bold;
-
-        :deep(&--loading) {
-            opacity: 0.8;
-        }
-    }
-}
-</style>

+ 3 - 2
src/views/apply-record-detail.vue

@@ -1,9 +1,10 @@
 <template>
-    <ApplyRecord :cardTypeId="cardTypeId" />
+    <ApplyRecord :id="id" />
 </template>
 
 <script setup lang="ts">
 import ApplyRecord from '@/components/ApplyRecord.vue'
+
 const route = useRoute()
-const { cardTypeId } = route.query as { cardTypeId: string }
+const { id } = route.query as { id: string }
 </script>

+ 52 - 100
src/views/apply-record.vue

@@ -3,17 +3,15 @@
         <div class="apply-card-footer">
             <div v-if="cardList.length > 0">
                 <div class="kyc-list">
-                    <div class="kyc-item" v-for="item in cardList" :key="item.id">
+                    <div v-for="item in cardList" :key="item.id" class="kyc-item">
                         <div class="g">
-                            <img src="../assets/images/apply-record-1.png" alt="" />
                             <div class="g-l">
                                 <div class="g-item">
                                     <div class="label a1 ellipsis">{{ item.cardName }}</div>
-                                    <div class="status" v-if="item.kycStatus != 2" :class="statusClass(item.kycStatus)">{{ statusMap[item.kycStatus] }}</div>
-                                    <div class="status" v-else :class="statusClass1(item.applyStatus)">{{ applyStatusMap[item.applyStatus] }}</div>
+                                    <div class="status" :class="statusClass1(item.status)">{{ status[item.status] }}</div>
                                 </div>
                                 <div class="g-item">
-                                    <div class="label a2">{{ item?.cardNo?.replace(/(\d{4})\d+(\d{4})/, '$1 **** **** $2') }}</div>
+                                    <div class="label a2">{{ item?.cardNumber?.replace(/(\d{4})\d+(\d{4})/, '$1 **** **** $2') }}</div>
                                 </div>
                             </div>
                         </div>
@@ -21,7 +19,7 @@
                             <div class="g-l g-l1">
                                 <div class="g-item">
                                     <div class="label a3">{{ t('cards.p12') }}</div>
-                                    <div class="status-views" @click="handleApply(1, item)">{{ t('cards.p11') }}</div>
+                                    <div class="status-views" @click="handleApply(item)">{{ t('cards.p11') }}</div>
                                 </div>
                             </div>
                         </div>
@@ -34,121 +32,71 @@
 </template>
 
 <script setup lang="ts">
+import type { CardInfo } from '@/api/ucard'
+import { useI18n } from 'vue-i18n'
 import { useRouter } from 'vue-router'
-import EmptyState from '@/components/EmptyState.vue'
 import { ucardApi } from '@/api/ucard'
-import { useI18n } from 'vue-i18n'
+import EmptyState from '@/components/EmptyState.vue'
 import useUserStore from '@/stores/use-user-store'
+
 const userStore = useUserStore()
-const userInfo = computed(() => userStore.userInfo)
 const router = useRouter()
 const { t } = useI18n()
-import type { CardInfo } from '@/api/ucard'
-
-const statusMap: Record<string, string> = {
-    null: t('kyc.statusDesc'),
-    '-1': t('kyc.statusDesc'),
-    '1': t('kyc.statusDesc2'),
-    '2': t('kyc.statusDesc3'),
-    '3': t('kyc.statusDesc4'),
+const status: Record<string, string> = {
+    success: t('apply-record-detail.p6'),
+    fail: t('apply-record-detail.p9'),
+    processing: t('apply-record-detail.p8'),
+    wait_process: t('apply-record-detail.p8'),
+    cancel: t('card.New2.p3'),
+    null: t('apply-record-detail.p8'),
 }
-const applyStatusMap: Record<string, string> = {
-    '0': t('apply-record-detail.p8'),
-    '1': t('apply-record-detail.p6'),
-}
-function statusClass(status: number) {
+function statusClass1(status: string) {
     switch (status) {
-        case 2:
+        case 'success':
             return 'status-default status-success'
-        case 3:
+        case 'fail':
+            return 'status-default status-error'
+        case 'cancel':
             return 'status-default status-error'
-        default:
-            return 'status-default'
-    }
-}
-function statusClass1(status: number) {
-    switch (status) {
-        case 1:
-            return 'status-default status-success'
         default:
             return 'status-default'
     }
 }
 
-const globalStore = useGlobalStore()
 const cardList = ref<CardInfo[]>([])
-
-const getCardList = async () => {
-    globalStore.setFullScreenLoading(true)
+const search = ref({})
+async function getCardList() {
     try {
-        const [response1, response2] = await Promise.all([
-            ucardApi.cardList({ page: { current: 1, row: 10 } }),
-            ucardApi.cardKycTypesList({ page: { current: 1, row: 10 } }),
-        ])
-
-        const mergedMap = new Map()
-
-        let [data1, data2] = await Promise.all([response1.data, response2.data])
-        if (data1.length > 0) {
-            data1.forEach((item: any) => {
-                mergedMap.set(item.cardTypeId, { ...item })
+        const res = await ucardApi.applyList({ ...search.value, page: { current: 1, row: 10 } })
+        if (res.code == 200) {
+            const a = res.data.map((i) => {
+                if (i.cardNo) {
+                    i.isOk = true
+                }
+                else {
+                    i.isOk = false
+                    i.cardNo = '**** **** **** ****'
+                }
+                return i
             })
+            cardList.value = a
         }
-        if (data2.length > 0) {
-            data2.forEach((item: any) => {
-                const existing = mergedMap.get(item.cardTypeId) || {}
-                mergedMap.set(item.cardTypeId, { ...existing, ...item })
-            })
+        else {
+            cardList.value = []
         }
-        const mergedArray = Array.from(mergedMap.values())
-        let a = mergedArray.map((i) => {
-            if (i.cardNo) {
-                i.isOk = true
-            } else {
-                i.isOk = false
-                i.cardNo = '**** **** **** ****'
-            }
-            return i
-        })
-        // 已申请-银行卡
-        let c = a.filter((i) => {
-            return i.kycStatus != null
-        })
-        cardList.value = c
-        userStore.saveUserCard(cardList.value)
-    } catch (error) {
-    } finally {
-        globalStore.setFullScreenLoading(false)
+        userStore.saveApplyCard(cardList.value)
     }
-}
-const ucardApply = async (item: any) => {
-    const res = await ucardApi.ucardApply({
-        cardTypeId: item.cardTypeId,
-        uniqueId: userInfo.value.customInfo.uniqueId,
-    })
-    if (res.code === 200) {
-        showToast(t('improve-info.kycSuccess'))
+    catch (error) {
+        cardList.value = []
     }
 }
-const handleApply = (type: number, item: any) => {
-    if (type == 1) {
-        router.push({
-            path: '/apply/record/detail',
-            query: {
-                cardTypeId: item.cardTypeId,
-            },
-        })
-    } else if (type == 2) {
-        ucardApply(item)
-    } else if (type == 3) {
-        router.push({
-            path: '/kyc',
-            query: {
-                cardTypeId: item.cardTypeId,
-                type: 0,
-            },
-        })
-    }
+function handleApply(item: any) {
+    router.push({
+        path: '/apply/record/detail',
+        query: {
+            id: item.id,
+        },
+    })
 }
 
 onMounted(async () => {
@@ -186,6 +134,7 @@ onMounted(async () => {
         height: 35px;
     }
     .g-l {
+        margin-left: 0;
         .g-item {
             margin-bottom: 0;
         }
@@ -194,7 +143,7 @@ onMounted(async () => {
             font-style: normal;
             font-weight: 600;
             font-size: 14px;
-            line-height: 20px;
+            line-height: 16px;
             text-align: left;
             color: #1a1a1a;
             width: 180px;
@@ -204,13 +153,16 @@ onMounted(async () => {
             font-size: 12px;
             line-height: 16px;
         }
+        .a1 {
+            line-height: 16px;
+        }
         .a3 {
             color: #8e8a8a;
             font-family: Roboto;
             font-size: 14px;
             font-style: normal;
             font-weight: 400;
-            line-height: 36px;
+            line-height: 16px;
             letter-spacing: 0.07px;
         }
     }

Vissa filer visades inte eftersom för många filer har ändrats