zhb пре 4 месеци
родитељ
комит
7e33d401ec
58 измењених фајлова са 1769 додато и 526 уклоњено
  1. 0 3
      App.vue
  2. 3 2
      components/cwg-SuccessPrompt.vue
  3. 0 1
      components/cwg-empty-state.vue
  4. 7 3
      components/cwg-input.vue
  5. 6 11
      components/cwg-load-more-wrapper.vue
  6. 62 0
      components/cwg-page-more-wrapper.vue
  7. 2 0
      components/cwg-page-wrapper.vue
  8. 3 3
      config/index.ts
  9. 8 5
      hooks/useAppUpdate.ts
  10. 69 0
      hooks/useKeyboardScroll.ts
  11. 87 21
      locale/ar.json
  12. 9 5
      locale/cn.json
  13. 88 21
      locale/de.json
  14. 91 28
      locale/en.json
  15. 94 27
      locale/es.json
  16. 91 24
      locale/fa.json
  17. 89 22
      locale/id.json
  18. 1 1
      locale/index.js
  19. 91 24
      locale/ko.json
  20. 92 25
      locale/ms.json
  21. 92 25
      locale/pt.json
  22. 84 17
      locale/th.json
  23. 101 34
      locale/tr.json
  24. 86 19
      locale/vn.json
  25. 94 27
      locale/zhHant.json
  26. 4 2
      main.js
  27. 8 1
      manifest.json
  28. 11 2
      pages.json
  29. 1 1
      pages/apply-record/components/ApplyRecord.vue
  30. 2 1
      pages/card/components/CardHandle.vue
  31. 2 2
      pages/card/components/VirtualCard.vue
  32. 15 1
      pages/card/index.vue
  33. 120 49
      pages/card/operations.vue
  34. 1 1
      pages/card/select.vue
  35. 15 0
      pages/launch/index.vue
  36. 18 1
      pages/mine/cog.vue
  37. 1 1
      pages/mine/components/VerificationRow.vue
  38. 17 3
      pages/mine/index.vue
  39. 19 10
      pages/recharge-record/components/DeductionList.vue
  40. 7 13
      pages/recharge-record/components/RechargeList.vue
  41. 1 9
      pages/recharge-record/components/TransactionList.vue
  42. 2 2
      pages/recharge-record/detail.vue
  43. 7 2
      pages/recharge-record/list.vue
  44. 2 7
      pages/wallet/balance.vue
  45. 1 6
      pages/wallet/components/DynamicForm.vue
  46. 3 4
      pages/wallet/components/GlobalList.vue
  47. 4 4
      pages/wallet/components/VaultodyList.vue
  48. 3 8
      pages/wallet/components/WithdrawList.vue
  49. 1 1
      pages/wallet/global-detail.vue
  50. 24 2
      pages/wallet/global-order.vue
  51. 4 5
      pages/wallet/index.vue
  52. 3 29
      pages/wallet/withdraw-detail.vue
  53. 32 1
      pages/wallet/withdraw.vue
  54. 8 0
      static/scss/global/global.scss
  55. 1 1
      uni_modules/cwg-svg-icon/components/cwg-svg-icon/cwg-svg-icon.vue
  56. 11 9
      utils/dataMap.js
  57. 11 0
      utils/needLoginPages.js
  58. 60 0
      utils/routeInterceptor.js

+ 0 - 3
App.vue

@@ -11,8 +11,6 @@ import {
 	updateRoute
 } from "@/hooks/useRoute";
 import useGlobalStore from "@/stores/use-global-store";
-import { useAppUpdate } from '@/hooks/useAppUpdate'
-const { checkUpdate } = useAppUpdate()
 
 const globalStore = useGlobalStore()
 onLoad((options) => {
@@ -23,7 +21,6 @@ onShow((options) => {
 })
 onLaunch((options) => {
 	updateRoute();
-	checkUpdate()
 })
 onMounted(() => {
 	const sysInfo = uni.getSystemInfoSync();

+ 3 - 2
components/cwg-SuccessPrompt.vue

@@ -1,6 +1,6 @@
 <template>
   <view class="success-prompt-fullscreen" v-if="props.show">
-    <img class="success-prompt-img" src="/static/images/vector.png" alt="success" />
+    <image mode="widthFix" src="/static/images/vector.png" alt="success" />
     <view class="success-prompt-title">{{ props.title }}</view>
     <view class="success-prompt-desc">{{ props.desc }}</view>
     <view class="fixed-btn">
@@ -67,6 +67,7 @@ const props = withDefaults(
   color: #666;
   text-align: center;
   max-width: px2rpx(620);
-  line-height: px2rpx(44);
+  line-height: px2rpx(30);
+  padding: 0 px2rpx(20);
 }
 </style>

+ 0 - 1
components/cwg-empty-state.vue

@@ -3,7 +3,6 @@
     <image class="img" src="/static/images/undraw.png" alt="" />
     <view class="r">
       <view class="title">{{ t('Documentary.tradingCenter.item131') }}</view>
-      <view class="text">{{ text || t('Documentary.tradingCenter.item131') }}</view>
     </view>
   </view>
 </template>

+ 7 - 3
components/cwg-input.vue

@@ -1,5 +1,5 @@
 <template>
-  <view class="form-group">
+  <view class="form-group" :ref="setItemRef">
     <view v-if="label" class="form-label"><text class="required-mark">{{ required ? "*" : "" }}</text> {{ label }}
     </view>
     <u-form-item :prop="rulesKey">
@@ -134,8 +134,11 @@ const props = defineProps({
     default: (val) => dayjs(val).format("YYYY-MM-DD"),
   },
 });
-console.log(props,'props');
-
+console.log(props, 'props');
+const itemRef = ref(null)
+const setItemRef = el => {
+  if (el) itemRef.value = el
+}
 const emit = defineEmits([
   "update:value",
   "blur",
@@ -485,6 +488,7 @@ function onDateConfirm(event) {
 :deep(.up-icon) {
   color: var(--black1) !important;
 }
+
 :deep(.u-form-item__body__right__message) {
   position: relative;
   top: px2rpx(4);

+ 6 - 11
components/cwg-load-more-wrapper.vue

@@ -1,17 +1,11 @@
 <template>
-    <scroll-view 
-        scroll-y 
-        :lower-threshold="lowerThreshold"
-        :refresher-enabled="refresherEnabled"
-        :refresher-triggered="refresherTriggered"
-        @refresherrefresh="onRefresherRefresh"
-        @refresherrestore="onRefresherRestore"
-        :style="{ height: `calc(100vh - ${statusBarHeight + height +  60}px)` }" 
-        @scrolltolower="emitReachBottom"
-        class="loadmore-wrapper">
+    <scroll-view scroll-y :lower-threshold="lowerThreshold" :refresher-enabled="refresherEnabled"
+        :refresher-triggered="refresherTriggered" @refresherrefresh="onRefresherRefresh"
+        @refresherrestore="onRefresherRestore" :style="{ height: `calc(100vh - ${statusBarHeight + height + 60}px)` }"
+        @scrolltolower="emitReachBottom" class="loadmore-wrapper">
         <slot></slot>
         <view class="loading" v-if="loading">{{ t('common.loading') }}</view>
-        <view class="finished" v-if="finished">{{ t('common.noMore') }}</view>
+        <view class="finished" v-if="finished">{{ t('News.NoMore') }}</view>
     </scroll-view>
 </template>
 
@@ -56,6 +50,7 @@ defineExpose({
 
 <style scoped lang="scss">
 @import "@/uni.scss";
+
 .loadmore-wrapper {
     /* height: calc(100vh - var(--status-bar-height)); */
     width: 100%;

+ 62 - 0
components/cwg-page-more-wrapper.vue

@@ -0,0 +1,62 @@
+<template>
+    <scroll-view 
+        scroll-y 
+        :lower-threshold="lowerThreshold"
+        :refresher-enabled="refresherEnabled"
+        :refresher-triggered="refresherTriggered"
+        @refresherrefresh="onRefresherRefresh"
+        @refresherrestore="onRefresherRestore"
+        :style="{ height: `calc(100vh - ${statusBarHeight + height +  60}px)` }" 
+        class="loadmore-wrapper">
+        <slot></slot>
+        <view class="loading" v-if="loading">{{ t('common.loading') }}</view>
+    </scroll-view>
+</template>
+
+<script setup>
+import { computed, defineEmits, defineProps, ref } from 'vue'
+import useGlobalStore from '@/stores/use-global-store'
+import { useI18n } from 'vue-i18n';
+const { t } = useI18n();
+const globalStore = useGlobalStore()
+const statusBarHeight = computed(() => globalStore.statusBarHeight);
+const props = defineProps({
+    lowerThreshold: { type: Number, default: 200 },
+    loading: { type: Boolean, default: false },
+    refresherEnabled: { type: Boolean, default: false },
+    isScroll: { type: Boolean, default: true },
+    height: { type: Number, default: 0 },
+})
+const emit = defineEmits(['reach-bottom', 'refresh'])
+
+const refresherTriggered = ref(false)
+const onRefresherRefresh = () => {
+    refresherTriggered.value = true
+    emit('refresh')
+}
+
+const onRefresherRestore = () => {
+    refresherTriggered.value = false
+}
+
+defineExpose({
+    stopRefresh: () => {
+        refresherTriggered.value = false
+    }
+})
+</script>
+
+<style scoped lang="scss">
+@import "@/uni.scss";
+.loadmore-wrapper {
+    /* height: calc(100vh - var(--status-bar-height)); */
+    width: 100%;
+    box-sizing: border-box;
+}
+
+.loading {
+    text-align: center;
+    padding: px2rpx(20);
+    color: #888;
+}
+</style>

+ 2 - 0
components/cwg-page-wrapper.vue

@@ -14,6 +14,8 @@ import { ref, onMounted, computed, } from "vue";
 import { onLoad, onShow } from '@dcloudio/uni-app'
 import { updateRoute } from '@/hooks/useRoute'
 import useGlobalStore from '@/stores/use-global-store'
+import { useAppUpdate } from '@/hooks/useAppUpdate'
+const { checkUpdate } = useAppUpdate()
 const props = defineProps({
   isHeaderFixed: {
     type: Boolean,

+ 3 - 3
config/index.ts

@@ -1,9 +1,9 @@
 const config = {
   // Host00: 'https://secure.cwgrd.com',
   // Host85: 'https://ucard.cwgrd.com',
-  Host85: 'http://192.168.0.25:8700',
-  // Host00: "https://ucard.44a5c8109e4.com",
-  // Host85: "https://ucard.44a5c8109e4.com",
+  // Host85: 'http://192.168.0.25:8700',
+  Host00: "https://ucard.44a5c8109e4.com",
+  Host85: "https://ucard.44a5c8109e4.com",
   
   Code: {
     StatusOK: 200,

+ 8 - 5
hooks/useAppUpdate.ts

@@ -3,7 +3,7 @@ import { useI18n } from 'vue-i18n'
 import { useProgress } from './useProgress'
 import useUserStore from '@/stores/use-user-store'
 import { ucardApi } from '@/api/ucard'
-
+import { userToken } from '@/composables/config'
 // ================== 类型声明 ==================
 
 declare const plus: any
@@ -237,6 +237,9 @@ export function useAppUpdate() {
 
         try {
             const equipmentType = getEquipmentType()
+            if (!userToken.value) {
+                return
+            }
             const res: ApiResponse<UpdateInfo> = await ucardApi.getAppVersionDetail({ equipmentType })
 
             if (res.code !== 200 || !res.data) {
@@ -324,7 +327,7 @@ export function useAppUpdate() {
      */
     function doUpdate(update: UpdateInfo): void {
         const platform = getPlatform()
-        
+
         if (platform === 'ios') {
             handleIosUpdate(update)
         } else {
@@ -469,9 +472,9 @@ export function useAppUpdate() {
 
         retryCount++
         console.log(`下载失败,${DOWNLOAD_CONFIG.RETRY_DELAY / 1000}秒后重试 (${retryCount}/${DOWNLOAD_CONFIG.MAX_RETRY})`)
-        
+
         cleanupDownloadTask()
-        
+
         setTimeout(() => {
             if (downloadUrl) {
                 createDownloadTask(downloadUrl)
@@ -657,7 +660,7 @@ export function useAppUpdate() {
             if (stateChangeHandler && downloadTask.removeEventListener) {
                 downloadTask.removeEventListener('statechanged', stateChangeHandler)
             }
-            
+
             // 中止下载
             downloadTask.abort()
         } catch (error) {

+ 69 - 0
hooks/useKeyboardScroll.ts

@@ -0,0 +1,69 @@
+
+import { ref, onMounted, onUnmounted } from 'vue'
+
+export function useKeyboardScroll() {
+  const scrollPosition = ref(0)
+  const keyboardHeight = ref(0)
+
+  let keyboardShowHandler = null
+  let keyboardHideHandler = null
+
+  // 保存当前滚动位置
+  const saveScrollPosition = () => {
+    // 获取当前页面的滚动位置
+    const pages = getCurrentPages()
+    if (pages.length > 0) {
+      scrollPosition.value = pages[pages.length - 1].scrollTop || 0
+    }
+  }
+
+  // 恢复滚动位置
+  const restoreScrollPosition = () => {
+    // 延迟恢复,确保页面布局已更新
+    setTimeout(() => {
+      const pages = getCurrentPages()
+      if (pages.length > 0) {
+        const page = pages[pages.length - 1]
+        if (page && typeof page.setData === 'function') {
+          page.setData({
+            scrollTop: scrollPosition.value
+          })
+        }
+      }
+    }, 100)
+  }
+
+  onMounted(() => {
+    // 监听键盘显示事件
+    keyboardShowHandler = (e) => {
+      keyboardHeight.value = e.height
+      saveScrollPosition()
+    }
+
+    // 监听键盘隐藏事件
+    keyboardHideHandler = () => {
+      keyboardHeight.value = 0
+      restoreScrollPosition()
+    }
+
+    // 绑定事件监听器
+    uni.onKeyboardHeightChange(keyboardShowHandler)
+    uni.onKeyboardHeightChange(keyboardHideHandler)
+  })
+
+  onUnmounted(() => {
+    // 清理事件监听器
+    if (keyboardShowHandler) {
+      uni.offKeyboardHeightChange(keyboardShowHandler)
+    }
+    if (keyboardHideHandler) {
+      uni.offKeyboardHeightChange(keyboardHideHandler)
+    }
+  })
+
+  return {
+    keyboardHeight,
+    scrollPosition,
+    restoreScrollPosition
+  }
+}

+ 87 - 21
locale/ar.json

@@ -2,38 +2,42 @@
   "common": {
     "confirm": "تأكيد",
     "cancel": "إلغاء",
-    "loading": "جار التحميل...",
+    "loading": "جارٍ التحميل...",
+    "noMore": "لا يوجد المزيد",
     "success": "نجاح",
     "fail": "فشل",
     "input": "يرجى الإدخال",
     "choose": "يرجى الاختيار",
-    "country": "أدخل العملة/البلد",
+    "country": "أدخل العملة / الدولة",
     "error": "خطأ في النظام",
     "copy1": "تم نسخ رقم البطاقة!",
     "copy2": "تم نسخ CVV!",
-    "copy3": "فشل النسخ"
+    "copy3": "فشل النسخ",
+    "year": "سنة",
+    "month": "شهر",
+    "day": "يوم"
   },
   "pages": {
     "login": {
       "index": "تسجيل الدخول",
-      "forget": "نسيت",
+      "forget": "نسيت كلمة المرور",
       "regist": "تسجيل",
       "reset": "نسيت كلمة المرور"
     },
     "apply-record": {
-      "index": "سجل طلب البطاقة",
-      "detail": "تفاصيل الطلب",
-      "list": "قائمة سجل الطلبات"
-    },
-    "recharge-record": {
-      "index": "سجل الشحن",
-      "list": "قائمة سجل الشحن",
-      "detail": "تفاصيل سجل الشحن",
+      "index": "سجل فتح البطاقة",
+      "detail": "تفاصيل فتح البطاقة",
+      "list": "قائمة سجل فتح البطاقة",
       "confirmOpen": "هل تريد فتح هذا الرابط؟",
       "open": "فتح",
       "copyPrompt": "تم نسخ الرابط، يرجى فتحه في المتصفح",
       "openFailed": "تعذر فتح الرابط"
     },
+    "recharge-record": {
+      "index": "سجل الشحن",
+      "list": "قائمة سجل الشحن",
+      "detail": "تفاصيل سجل الشحن"
+    },
     "card-transaction-detail": {
       "index": "تفاصيل المعاملة"
     },
@@ -44,7 +48,7 @@
       "select-card": "اختر بطاقة بنكية",
       "operations": "",
       "select": "اختر بطاقة بنكية",
-      "apply": "طلب بطاقة",
+      "apply": "طلب فتح بطاقة",
       "authTip": "يرجى إكمال التحقق من الهوية أولاً"
     },
     "mine": {
@@ -52,14 +56,30 @@
       "language": "إعدادات اللغة",
       "pay-password": "تغيير كلمة المرور",
       "info": "المعلومات الشخصية",
-      "improve": "إكمال الملف الشخصي"
+      "improve": "إكمال المعلومات",
+      "kyc": "توثيق KYC",
+      "cog": "الإعدادات",
+      "help": "الأسئلة الشائعة",
+      "help-detail": "الأسئلة الشائعة",
+      "permission": "إدارة الصلاحيات",
+      "privacy": "سياسة الخصوصية",
+      "clearCache": "مسح التخزين المؤقت",
+      "currentVersion": "الإصدار الحالي",
+      "newVersion": "أحدث إصدار متوفر",
+      "hasNewVersion": "يتوفر إصدار جديد للتحديث",
+      "about": "حول C Pay"
     },
     "wallet": {
       "global-detail": "تفاصيل الطلب",
       "index": "",
       "balance": "سجل رصيد المحفظة",
-      "global-list": "سجل التحويل السريع",
-      "global-order": "CWG التحويل السريع"
+      "global-list": "سجل التحويلات السريعة",
+      "global-order": "التحويل السريع العالمي",
+      "withdraw": "سحب",
+      "vaultody": "شحن",
+      "withdraw-list": "سجل سحب المحفظة",
+      "vaultody-list": "سجل شحن المحفظة",
+      "withdraw-detail": "تفاصيل السحب"
     }
   },
   "tabBar": {
@@ -120,7 +140,50 @@
     "p": "هل أنت متأكد أنك تريد تسجيل الخروج؟",
     "b1": "تسجيل الخروج",
     "b2": "إلغاء",
-    "language": "إعدادات اللغة"
+    "language": "إعدادات اللغة",
+    "p1": "الموقع الجغرافي",
+    "p2": "الوصول إلى معلومات موقعك",
+    "p3": "حول الموقع",
+    "p4": "الكاميرا",
+    "p5": "التقاط الصور ومقاطع الفيديو",
+    "p6": "حول الكاميرا",
+    "p7": "الألبوم",
+    "p8": "الوصول إلى الصور ومقاطع الفيديو",
+    "p9": "حول الألبوم",
+    "p10": "الحافظة",
+    "p11": "قراءة محتوى الحافظة",
+    "p12": "مفعل",
+    "p13": "الذهاب إلى الإعدادات",
+    "p14": "تنبيه: يتطلب استخدام هذه الميزات إذنًا في المرة الأولى. إذا تم الرفض سابقًا، يمكن إعادة التفعيل من إعدادات النظام.",
+    "p15": "سياسة الخصوصية لتطبيق C Pays",
+    "p16": "استخدام الكاميرا",
+    "p17": "استخدام الألبوم",
+    "p18": "استخدام معلومات الموقع",
+    "p19": "حجم ذاكرة التخزين المؤقت",
+    "p20": "مسح ذاكرة التخزين المؤقت",
+    "p21": "تم المسح بنجاح",
+    "p22": "تحديث الإصدار",
+    "p23": "إصدار التطبيق الحالي منخفض جدًا، يرجى التحديث للمتابعة",
+    "p24": "تم العثور على إصدار جديد",
+    "p25": "تم العثور على إصدار جديد {version}، هل تريد التحديث؟",
+    "p26": "جارٍ تنزيل التحديث",
+    "p27": "اكتمل التنزيل",
+    "p28": "فشل التنزيل",
+    "p29": "جارٍ التنزيل",
+    "p30": "اكتمل التنزيل، هل تريد التثبيت؟",
+    "p31": "جارٍ تثبيت التحديث",
+    "p32": "اكتمل التثبيت",
+    "p33": "فشل التثبيت",
+    "p34": "جارٍ التثبيت",
+    "p35": "تحديث",
+    "p36": "تخطي",
+    "p37": "تم التحديث بنجاح",
+    "p38": "سيتم إعادة تشغيل التطبيق لإكمال التحديث",
+    "p39": "متابعة التنزيل",
+    "p40": "تم إيقاف التنزيل",
+    "p41": "تم إيقاف التنزيل بسبب مشكلة في الشبكة، هل تريد المتابعة؟",
+    "p42": "متابعة",
+    "p43": "إلغاء"
   },
   "login": {
     "title": "تسجيل الدخول",
@@ -791,7 +854,7 @@
       "item128": "أرباح وخسائر",
       "item129": "تذكير: ستتم إنهاء الاشتراكات وإغلاق جميع المراكز المفتوحة عندما يكون الرصيد أقل من الأرقام المعينة مسبقًا.",
       "item130": "لا توجد بيانات",
-      "item131": "أكثر من 30%",
+      "item131": "لا توجد بيانات",
       "item132": "أضف إلى المفضلة",
       "item133": "إزالة من المفضلة",
       "item134": "الاشتراك متاح فقط بعد تصفية المراكز.",
@@ -5424,11 +5487,11 @@
         "fieldDescription": "يرجى إدخال دولة إصدار هوية المرسل"
       },
       "receiverNativeFirstName": {
-        "fieldTitle": "الاسم الأول الأصلي",
+        "fieldTitle": "الاسم الأول للمستفيد (كما هو في الهوية الرسمية)",
         "fieldDescription": "يرجى إدخال الاسم الأول الأصلي للمستلم"
       },
       "receiverNativeLastName": {
-        "fieldTitle": "الاسم الأخير الأصلي",
+        "fieldTitle": "اسم العائلة للمستفيد (كما هو في الهوية الرسمية)",
         "fieldDescription": "يرجى إدخال الاسم الأخير الأصلي للمستلم"
       },
       "receiverAccountHolderName": {
@@ -5602,7 +5665,10 @@
     "p4": "يرجى إدخال مبلغ السحب (USDT)",
     "p5": "(الرصيد المتاح {userBalance} USDT)",
     "p6": "لا يمكن أن يتجاوز المبلغ المدخل {userBalance} USDT",
-    "p7": "يرجى إدخال رقم صالح"
+    "p7": "يرجى إدخال رقم صالح",
+    "p8": "عنوان العقد",
+    "p9": "عنوان المرسل",
+    "p10": "وقت الموافقة"
   },
   "Blockchain1": {
     "title": "سجل شحن المحفظة",

+ 9 - 5
locale/cn.json

@@ -74,7 +74,7 @@
       "index": "",
       "balance": "钱包余额记录",
       "global-list": "速汇记录",
-      "global-order": "CWG速汇",
+      "global-order": "全球速汇",
       "withdraw": "提现",
       "vaultody": "充值",
       "withdraw-list": "钱包提现记录",
@@ -223,7 +223,7 @@
   "language": {
     "selectLang": "选择语言",
     "cn": "简体中文",
-    "zh": "繁體中文",
+    "zhHant": "繁體中文",
     "en": "English",
     "de": "Deutsch",
     "es": "Español",
@@ -3113,6 +3113,7 @@
       "s24": "在线激活:",
       "s25": "CWG Markets客户中心,并进入“激活卡片”页面,输入您的卡号和激活码(随卡片提供)。 ",
       "s26": "设置PIN码: ",
+      "s26_1": "确认PIN码: ",
       "s27": "按照提示设置您的个人识别号码(PIN码),用于ATM取款和购物支付。",
       "s28": "开始使用: ",
       "s29": "激活成功后,您即可开始使用您的Visa借记卡进行消费和取款。",
@@ -5440,11 +5441,11 @@
         "fieldDescription": "请输入汇款人证件签发国家"
       },
       "receiverNativeFirstName": {
-        "fieldTitle": "收款人的母语名字",
+        "fieldTitle": "收款人名字 (与身份证一致)",
         "fieldDescription": "请输入收款人的母语名字"
       },
       "receiverNativeLastName": {
-        "fieldTitle": "收款人的母语姓氏",
+        "fieldTitle": "收款人姓氏 (与身份证一致)",
         "fieldDescription": "请输入收款人的母语姓氏"
       },
       "receiverAccountHolderName": {
@@ -5618,7 +5619,10 @@
     "p4": "请输入提现金额(USDT)",
     "p5": "(可用余额{userBalance} USDT)",
     "p6": "输入的金额不能超过 {userBalance} USDT",
-    "p7": "请输入有效数字"
+    "p7": "请输入有效数字",
+    "p8": "合约地址",
+    "p9": "发送方地址",
+    "p10": "审批时间"
   },
   "Blockchain1": {
     "title": "钱包充值记录",

+ 88 - 21
locale/de.json

@@ -3,27 +3,31 @@
     "confirm": "Bestätigen",
     "cancel": "Abbrechen",
     "loading": "Wird geladen...",
+    "noMore": "Keine weiteren Daten",
     "success": "Erfolg",
     "fail": "Fehlgeschlagen",
     "input": "Bitte eingeben",
     "choose": "Bitte auswählen",
-    "country": "Währung/Land eingeben",
+    "country": "Währung / Land eingeben",
     "error": "Systemfehler",
     "copy1": "Kartennummer kopiert!",
     "copy2": "CVV kopiert!",
-    "copy3": "Kopieren fehlgeschlagen"
+    "copy3": "Kopieren fehlgeschlagen",
+    "year": "Jahr",
+    "month": "Monat",
+    "day": "Tag"
   },
   "pages": {
     "login": {
       "index": "Anmelden",
-      "forget": "Vergessen",
+      "forget": "Passwort vergessen",
       "regist": "Registrieren",
       "reset": "Passwort vergessen"
     },
     "apply-record": {
-      "index": "Kartenantragsverlauf",
-      "detail": "Antragsdetails",
-      "list": "Liste der Antragsverläufe",
+      "index": "Kartenantragshistorie",
+      "detail": "Kartenantragsdetails",
+      "list": "Kartenantragshistorie-Liste",
       "confirmOpen": "Diesen Link öffnen?",
       "open": "Öffnen",
       "copyPrompt": "Link kopiert, bitte im Browser öffnen",
@@ -31,8 +35,8 @@
     },
     "recharge-record": {
       "index": "Aufladeverlauf",
-      "list": "Liste der Aufladeverläufe",
-      "detail": "Details des Aufladeverlaufs"
+      "list": "Aufladeverlauf-Liste",
+      "detail": "Aufladeverlaufsdetails"
     },
     "card-transaction-detail": {
       "index": "Transaktionsdetails"
@@ -41,25 +45,41 @@
       "index": "Karten",
       "card-recharge": "Aufladeantrag",
       "activate-card": "Kartenaktivierung",
-      "select-card": "Eine Bankkarte auswählen",
+      "select-card": "Wählen Sie eine Bankkarte",
       "operations": "",
-      "select": "Eine Bankkarte auswählen",
+      "select": "Wählen Sie eine Bankkarte",
       "apply": "Karte beantragen",
-      "authTip": "Bitte zuerst die Identitätsverifizierung abschließen"
+      "authTip": "Bitte zuerst die Identitätsprüfung abschließen"
     },
     "mine": {
       "index": "Meine",
       "language": "Spracheinstellungen",
       "pay-password": "Passwort ändern",
       "info": "Persönliche Informationen",
-      "improve": "Profil vervollständigen"
+      "improve": "Informationen vervollständigen",
+      "kyc": "KYC-Verifizierung",
+      "cog": "Einstellungen",
+      "help": "FAQ",
+      "help-detail": "FAQ",
+      "permission": "Berechtigungsverwaltung",
+      "privacy": "Datenschutzrichtlinie",
+      "clearCache": "Cache leeren",
+      "currentVersion": "Aktuelle Version",
+      "newVersion": "Neueste Version installiert",
+      "hasNewVersion": "Neue Version verfügbar",
+      "about": "Über C Pay"
     },
     "wallet": {
       "global-detail": "Bestelldetails",
       "index": "",
       "balance": "Wallet-Guthabenverlauf",
-      "global-list": "Schnellüberweisungsverlauf",
-      "global-order": "CWG Schnellüberweisung"
+      "global-list": "Sofortüberweisungsverlauf",
+      "global-order": "Globale Sofortüberweisung",
+      "withdraw": "Auszahlung",
+      "vaultody": "Aufladen",
+      "withdraw-list": "Wallet-Auszahlungsverlauf",
+      "vaultody-list": "Wallet-Aufladeverlauf",
+      "withdraw-detail": "Auszahlungsdetails"
     }
   },
   "tabBar": {
@@ -117,10 +137,53 @@
   },
   "mine": {
     "logout": "Abmelden",
-    "p": "Sind Sie sicher, dass Sie sich abmelden möchten?",
+    "p": "Möchten Sie sich wirklich abmelden?",
     "b1": "Abmelden",
     "b2": "Abbrechen",
-    "language": "Spracheinstellungen"
+    "language": "Spracheinstellungen",
+    "p1": "Standort",
+    "p2": "Auf Standortinformationen zugreifen",
+    "p3": "Über den Standort",
+    "p4": "Kamera",
+    "p5": "Fotos und Videos aufnehmen",
+    "p6": "Über die Kamera",
+    "p7": "Album",
+    "p8": "Auf Fotos und Videos zugreifen",
+    "p9": "Über das Album",
+    "p10": "Zwischenablage",
+    "p11": "Zwischenablage lesen",
+    "p12": "Aktiviert",
+    "p13": "Zu den Einstellungen",
+    "p14": "Hinweis: Beim ersten Gebrauch ist eine Berechtigung erforderlich. Falls abgelehnt, kann sie in den Systemeinstellungen erneut aktiviert werden.",
+    "p15": "C Pays App Datenschutzrichtlinie",
+    "p16": "Kameranutzung",
+    "p17": "Albumnutzung",
+    "p18": "Standortnutzung",
+    "p19": "Cache-Größe",
+    "p20": "Cache löschen",
+    "p21": "Erfolgreich gelöscht",
+    "p22": "Versionsupdate",
+    "p23": "Die aktuelle Version ist zu niedrig. Bitte aktualisieren Sie die App.",
+    "p24": "Neue Version gefunden",
+    "p25": "Neue Version {version} gefunden. Jetzt aktualisieren?",
+    "p26": "Update wird heruntergeladen",
+    "p27": "Download abgeschlossen",
+    "p28": "Download fehlgeschlagen",
+    "p29": "Wird heruntergeladen",
+    "p30": "Download abgeschlossen. Jetzt installieren?",
+    "p31": "Update wird installiert",
+    "p32": "Installation abgeschlossen",
+    "p33": "Installation fehlgeschlagen",
+    "p34": "Installation läuft",
+    "p35": "Aktualisieren",
+    "p36": "Überspringen",
+    "p37": "Update erfolgreich",
+    "p38": "Die App wird neu gestartet, um das Update abzuschließen",
+    "p39": "Download fortsetzen",
+    "p40": "Download unterbrochen",
+    "p41": "Der Download wurde wegen Netzwerkproblemen unterbrochen. Fortsetzen?",
+    "p42": "Fortsetzen",
+    "p43": "Abbrechen"
   },
   "login": {
     "title": "Anmelden",
@@ -160,7 +223,7 @@
   "language": {
     "selectLang": "Sprache auswählen",
     "cn": "简体中文",
-    "zh": "繁體中文",
+    "zhHant": "繁體中文",
     "en": "English",
     "de": "Deutsch",
     "es": "Español",
@@ -791,7 +854,7 @@
       "item128": "Gewinne und Verluste",
       "item129": "Erinnerung: Die Abonnements werden beendet und alle offenen Positionen werden geschlossen, wenn das Eigenkapital unter den festgelegten Werten liegt.",
       "item130": "Keine Daten",
-      "item131": "über 30%",
+      "item131": "Keine Daten",
       "item132": "Zu Favoriten hinzufügen",
       "item133": "Aus Favoriten entfernen",
       "item134": "Das Abonnement ist erst nach der Liquidation von Positionen verfügbar.",
@@ -3108,6 +3171,7 @@
       "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:",
+      "s26_1": "PIN-Code bestätigen:",
       "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.",
@@ -5435,11 +5499,11 @@
         "fieldDescription": "Bitte geben Sie das Ausstellungsland des Absenderausweises ein"
       },
       "receiverNativeFirstName": {
-        "fieldTitle": "Geburtsname Vorname",
+        "fieldTitle": "Vorname des Begünstigten (wie auf dem offiziellen Ausweis)",
         "fieldDescription": "Bitte geben Sie den Geburtsvornamen des Empfängers ein"
       },
       "receiverNativeLastName": {
-        "fieldTitle": "Geburtsname Nachname",
+        "fieldTitle": "Nachname des Begünstigten (wie auf dem offiziellen Ausweis)",
         "fieldDescription": "Bitte geben Sie den Geburtsnachnamen des Empfängers ein"
       },
       "receiverAccountHolderName": {
@@ -5613,7 +5677,10 @@
     "p4": "Bitte geben Sie den Auszahlungsbetrag ein (USDT)",
     "p5": "(Verfügbares Guthaben {userBalance} USDT)",
     "p6": "Der eingegebene Betrag darf {userBalance} USDT nicht überschreiten",
-    "p7": "Bitte geben Sie eine gültige Zahl ein"
+    "p7": "Bitte geben Sie eine gültige Zahl ein",
+    "p8": "Vertragsadresse",
+    "p9": "Absenderadresse",
+    "p10": "Genehmigungszeit"
   },
   "Blockchain1": {
     "title": "Wallet-Aufladeverlauf",

+ 91 - 28
locale/en.json

@@ -3,40 +3,40 @@
     "confirm": "Confirm",
     "cancel": "Cancel",
     "loading": "Loading...",
-    "noMore": "No more",
+    "noMore": "No more data",
     "success": "Success",
     "fail": "Failed",
     "input": "Please enter",
     "choose": "Please select",
-    "country": "Enter currency/country",
+    "country": "Enter currency / country",
     "error": "System error",
     "copy1": "Card number copied!",
     "copy2": "CVV copied!",
     "copy3": "Copy failed",
-    "year": "",
-    "month": "",
-    "day": ""
+    "year": "Year",
+    "month": "Month",
+    "day": "Day"
   },
   "pages": {
     "login": {
       "index": "Login",
-      "forget": "Forget",
+      "forget": "Forgot Password",
       "regist": "Register",
-      "reset": "Forgot Password"
+      "reset": "Reset Password"
     },
     "apply-record": {
-      "index": "Card Application Record",
+      "index": "Card Application Records",
       "detail": "Application Details",
       "list": "Application Record List",
-      "confirmOpen": "Open this link?",
+      "confirmOpen": "Do you want to open this link?",
       "open": "Open",
       "copyPrompt": "Link copied, please open it in your browser",
       "openFailed": "Unable to open link"
     },
     "recharge-record": {
-      "index": "Recharge Record",
+      "index": "Recharge Records",
       "list": "Recharge Record List",
-      "detail": "Recharge Record Details"
+      "detail": "Recharge Details"
     },
     "card-transaction-detail": {
       "index": "Transaction Details"
@@ -44,26 +44,42 @@
     "card": {
       "index": "Cards",
       "card-recharge": "Recharge Application",
-      "activate-card": "Card Activation",
+      "activate-card": "Activate Card",
       "select-card": "Select a Bank Card",
-      "operations": "",
+      "operations": "Operations",
       "select": "Select a Bank Card",
       "apply": "Apply for Card",
       "authTip": "Please complete identity verification first"
     },
     "mine": {
-      "index": "Mine",
+      "index": "My Account",
       "language": "Language Settings",
-      "pay-password": "Change Password",
+      "pay-password": "Change Payment Password",
       "info": "Personal Information",
-      "improve": "Complete Profile"
+      "improve": "Complete Information",
+      "kyc": "KYC Verification",
+      "cog": "Settings",
+      "help": "FAQ",
+      "help-detail": "FAQ",
+      "permission": "Permission Management",
+      "privacy": "Privacy Policy",
+      "clearCache": "Clear Cache",
+      "currentVersion": "Current Version",
+      "newVersion": "Already the Latest Version",
+      "hasNewVersion": "New Version Available",
+      "about": "About C Pay"
     },
     "wallet": {
       "global-detail": "Order Details",
-      "index": "",
-      "balance": "Wallet Balance Record",
-      "global-list": "Fast Transfer Record",
-      "global-order": "CWG Fast Transfer"
+      "index": "Wallet",
+      "balance": "Wallet Balance Records",
+      "global-list": "Remittance Records",
+      "global-order": "Global Remittance",
+      "withdraw": "Withdraw",
+      "vaultody": "Deposit",
+      "withdraw-list": "Withdrawal Records",
+      "vaultody-list": "Deposit Records",
+      "withdraw-detail": "Withdrawal Details"
     }
   },
   "tabBar": {
@@ -120,11 +136,54 @@
     "transferB2": "Transfer"
   },
   "mine": {
-    "logout": "Logout",
-    "p": "Are you sure you want to logout?",
-    "b1": "Logout",
+    "logout": "Log out",
+    "p": "Are you sure you want to log out?",
+    "b1": "Log out",
     "b2": "Cancel",
-    "language": "Language Settings"
+    "language": "Language settings",
+    "p1": "Location",
+    "p2": "Access your location information",
+    "p3": "About location",
+    "p4": "Camera",
+    "p5": "Take photos and videos",
+    "p6": "About camera",
+    "p7": "Album",
+    "p8": "Access your photos and videos",
+    "p9": "About album",
+    "p10": "Clipboard",
+    "p11": "Read clipboard content",
+    "p12": "Enabled",
+    "p13": "Go to settings",
+    "p14": "Note: Authorization is required when using related features for the first time. If you previously denied access, you can re-enable it in system settings.",
+    "p15": "C Pays App Privacy Policy",
+    "p16": "Camera usage",
+    "p17": "Album usage",
+    "p18": "Location information usage",
+    "p19": "Cache size",
+    "p20": "Clear cache",
+    "p21": "Cleared successfully",
+    "p22": "Version update",
+    "p23": "The current version is too low. Please update to continue.",
+    "p24": "New version found",
+    "p25": "A new version {version} is available. Update now?",
+    "p26": "Downloading update",
+    "p27": "Download completed",
+    "p28": "Download failed",
+    "p29": "Downloading",
+    "p30": "Download completed. Install now?",
+    "p31": "Installing update",
+    "p32": "Installation completed",
+    "p33": "Installation failed",
+    "p34": "Installing",
+    "p35": "Update",
+    "p36": "Skip",
+    "p37": "Update successful",
+    "p38": "The app will restart to complete the update",
+    "p39": "Continue downloading",
+    "p40": "Download interrupted",
+    "p41": "The download was interrupted due to network issues. Continue downloading?",
+    "p42": "Continue",
+    "p43": "Cancel"
   },
   "login": {
     "title": "Login",
@@ -164,7 +223,7 @@
   "language": {
     "selectLang": "Select Language",
     "cn": "简体中文",
-    "zh": "繁體中文",
+    "zhHant": "繁體中文",
     "en": "English",
     "de": "Deutsch",
     "es": "Español",
@@ -3461,6 +3520,7 @@
       "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:",
+      "s26_1": "Confirm 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.",
@@ -5788,11 +5848,11 @@
         "fieldDescription": "Please enter sender's ID issuing country"
       },
       "receiverNativeFirstName": {
-        "fieldTitle": "Native First Name",
+        "fieldTitle": "Beneficiary's First Name (as on official ID)",
         "fieldDescription": "Please enter receiver's native first name"
       },
       "receiverNativeLastName": {
-        "fieldTitle": "Native Last Name",
+        "fieldTitle": "Beneficiary's Last Name (as on official ID)",
         "fieldDescription": "Please enter receiver's native last name"
       },
       "receiverAccountHolderName": {
@@ -5966,7 +6026,10 @@
     "p4": "Please enter the withdrawal amount (USDT)",
     "p5": "(Available balance {userBalance} USDT)",
     "p6": "The entered amount cannot exceed {userBalance} USDT",
-    "p7": "Please enter a valid number"
+    "p7": "Please enter a valid number",
+    "p8": "Contract Address",
+    "p9": "Sender Address",
+    "p10": "Approval Time"
   },
   "Blockchain1": {
     "title": "Wallet Top-up Records",

+ 94 - 27
locale/es.json

@@ -3,34 +3,38 @@
     "confirm": "Confirmar",
     "cancel": "Cancelar",
     "loading": "Cargando...",
+    "noMore": "No hay más datos",
     "success": "Éxito",
-    "fail": "Falló",
+    "fail": "Error",
     "input": "Por favor ingrese",
     "choose": "Por favor seleccione",
-    "country": "Ingresar moneda / país",
+    "country": "Ingrese moneda / país",
     "error": "Error del sistema",
     "copy1": "¡Número de tarjeta copiado!",
     "copy2": "¡CVV copiado!",
-    "copy3": "Error al copiar"
+    "copy3": "Error al copiar",
+    "year": "Año",
+    "month": "Mes",
+    "day": "Día"
   },
   "pages": {
     "login": {
       "index": "Iniciar sesión",
-      "forget": "Olvidar",
-      "regist": "Registrar",
+      "forget": "Olvidé mi contraseña",
+      "regist": "Registrarse",
       "reset": "Restablecer contraseña"
     },
     "apply-record": {
-      "index": "Registro de tarjetas",
-      "detail": "Detalle de tarjeta",
-      "list": "Lista de registros",
-      "confirmOpen": "¿Abrir este enlace?",
+      "index": "Registros de apertura de tarjeta",
+      "detail": "Detalle de apertura de tarjeta",
+      "list": "Lista de registros de apertura",
+      "confirmOpen": "¿Desea abrir este enlace?",
       "open": "Abrir",
-      "copyPrompt": "Enlace copiado, ábrelo en el navegador",
-      "openFailed": "No se puede abrir el enlace"
+      "copyPrompt": "Enlace copiado, ábralo en el navegador",
+      "openFailed": "No se pudo abrir el enlace"
     },
     "recharge-record": {
-      "index": "Registro de recargas",
+      "index": "Registros de recarga",
       "list": "Lista de recargas",
       "detail": "Detalle de recarga"
     },
@@ -45,21 +49,37 @@
       "operations": "",
       "select": "Seleccionar tarjeta",
       "apply": "Solicitar tarjeta",
-      "authTip": "Complete la verificación de identidad"
+      "authTip": "Complete primero la verificación de identidad"
     },
     "mine": {
       "index": "Mi cuenta",
-      "language": "Idioma",
+      "language": "Configuración de idioma",
       "pay-password": "Cambiar contraseña",
-      "info": "Información Personal",
-      "improve": "Completar Perfil"
+      "info": "Información personal",
+      "improve": "Completar información",
+      "kyc": "Verificación KYC",
+      "cog": "Configuración",
+      "help": "Preguntas frecuentes",
+      "help-detail": "Preguntas frecuentes",
+      "permission": "Gestión de permisos",
+      "privacy": "Política de privacidad",
+      "clearCache": "Borrar caché",
+      "currentVersion": "Versión actual",
+      "newVersion": "Ya es la última versión",
+      "hasNewVersion": "Nueva versión disponible",
+      "about": "Acerca de C Pay"
     },
     "wallet": {
-      "global-detail": "Detalles del Pedido",
+      "global-detail": "Detalle del pedido",
       "index": "",
-      "balance": "Registro de saldo",
-      "global-list": "Registro de transferencias",
-      "global-order": "Transferencia CWG"
+      "balance": "Registros de saldo",
+      "global-list": "Registros de transferencias",
+      "global-order": "Transferencia global",
+      "withdraw": "Retirar",
+      "vaultody": "Recargar",
+      "withdraw-list": "Registros de retiro",
+      "vaultody-list": "Registros de recarga",
+      "withdraw-detail": "Detalle de retiro"
     }
   },
   "tabBar": {
@@ -117,10 +137,53 @@
   },
   "mine": {
     "logout": "Cerrar sesión",
-    "p": "¿Está seguro de cerrar sesión?",
+    "p": "¿Seguro que deseas cerrar sesión?",
     "b1": "Cerrar sesión",
     "b2": "Cancelar",
-    "language": "Idioma"
+    "language": "Configuración de idioma",
+    "p1": "Ubicación",
+    "p2": "Acceder a tu ubicación",
+    "p3": "Acerca de la ubicación",
+    "p4": "Cámara",
+    "p5": "Tomar fotos y videos",
+    "p6": "Acerca de la cámara",
+    "p7": "Álbum",
+    "p8": "Acceder a fotos y videos",
+    "p9": "Acerca del álbum",
+    "p10": "Portapapeles",
+    "p11": "Leer contenido del portapapeles",
+    "p12": "Activado",
+    "p13": "Ir a configuración",
+    "p14": "Nota: Se requiere autorización al usar estas funciones por primera vez.",
+    "p15": "Política de privacidad de C Pays App",
+    "p16": "Uso de la cámara",
+    "p17": "Uso del álbum",
+    "p18": "Uso de la ubicación",
+    "p19": "Tamaño de caché",
+    "p20": "Borrar caché",
+    "p21": "Borrado con éxito",
+    "p22": "Actualización de versión",
+    "p23": "La versión actual es demasiado baja. Actualiza para continuar.",
+    "p24": "Nueva versión encontrada",
+    "p25": "Nueva versión {version} disponible. ¿Actualizar?",
+    "p26": "Descargando actualización",
+    "p27": "Descarga completada",
+    "p28": "Descarga fallida",
+    "p29": "Descargando",
+    "p30": "Descarga completada. ¿Instalar ahora?",
+    "p31": "Instalando actualización",
+    "p32": "Instalación completada",
+    "p33": "Instalación fallida",
+    "p34": "Instalando",
+    "p35": "Actualizar",
+    "p36": "Omitir",
+    "p37": "Actualización exitosa",
+    "p38": "La aplicación se reiniciará para completar la actualización",
+    "p39": "Continuar descarga",
+    "p40": "Descarga interrumpida",
+    "p41": "La descarga se interrumpió por problemas de red. ¿Continuar?",
+    "p42": "Continuar",
+    "p43": "Cancelar"
   },
   "login": {
     "title": "Iniciar sesión",
@@ -160,7 +223,7 @@
   "language": {
     "selectLang": "Seleccionar idioma",
     "cn": "Chino simplificado",
-    "zh": "Chino tradicional",
+    "zhHant": "Chino tradicional",
     "en": "Inglés",
     "de": "Alemán",
     "es": "Español",
@@ -791,7 +854,7 @@
       "item128": "Ganancias y Pérdidas",
       "item129": "Recordatorio: las suscripciones se terminarán y todas las posiciones abiertas se cerrarán cuando el capital sea inferior a las cifras predefinidas.",
       "item130": "Sin datos",
-      "item131": "Más del 30%",
+      "item131": "Sin datos",
       "item132": "Agregar a Favoritos",
       "item133": "Eliminar de Favoritos",
       "item134": "La suscripción solo está disponible después de liquidar posiciones.",
@@ -3109,6 +3172,7 @@
       "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:",
+      "s26_1": "Confirmar 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.",
@@ -5436,11 +5500,11 @@
         "fieldDescription": "Por favor, ingrese el país de emisión de identificación del remitente"
       },
       "receiverNativeFirstName": {
-        "fieldTitle": "Nombre nativo",
+        "fieldTitle": "Nombre del beneficiario (como en el documento oficial)",
         "fieldDescription": "Por favor, ingrese el nombre nativo del destinatario"
       },
       "receiverNativeLastName": {
-        "fieldTitle": "Apellido nativo",
+        "fieldTitle": "Apellido del beneficiario (como en el documento oficial)",
         "fieldDescription": "Por favor, ingrese el apellido nativo del destinatario"
       },
       "receiverAccountHolderName": {
@@ -5614,7 +5678,10 @@
     "p4": "Ingrese el monto del retiro (USDT)",
     "p5": "(Saldo disponible {userBalance} USDT)",
     "p6": "El monto ingresado no puede exceder {userBalance} USDT",
-    "p7": "Por favor ingrese un número válido"
+    "p7": "Por favor ingrese un número válido",
+    "p8": "Dirección del Contrato",
+    "p9": "Dirección del Remitente",
+    "p10": "Tiempo de Aprobación"
   },
   "Blockchain1": {
     "title": "Registros de recarga de billetera",

+ 91 - 24
locale/fa.json

@@ -3,36 +3,40 @@
     "confirm": "تأیید",
     "cancel": "لغو",
     "loading": "در حال بارگذاری...",
+    "noMore": "داده‌ای وجود ندارد",
     "success": "موفق",
     "fail": "ناموفق",
     "input": "لطفاً وارد کنید",
     "choose": "لطفاً انتخاب کنید",
-    "country": "وارد کردن ارز / کشور",
+    "country": "واحد پول / کشور را وارد کنید",
     "error": "خطای سیستم",
     "copy1": "شماره کارت کپی شد!",
     "copy2": "CVV کپی شد!",
-    "copy3": "کپی ناموفق بود"
+    "copy3": "کپی ناموفق بود",
+    "year": "سال",
+    "month": "ماه",
+    "day": "روز"
   },
   "pages": {
     "login": {
       "index": "ورود",
-      "forget": "فراموشی",
+      "forget": "فراموشی رمز عبور",
       "regist": "ثبت‌نام",
-      "reset": "فراموشی رمز عبور"
+      "reset": "بازنشانی رمز عبور"
     },
     "apply-record": {
       "index": "سوابق صدور کارت",
-      "detail": "جزئیات کارت",
-      "list": "لیست سوابق صدور کارت"
+      "detail": "جزئیات صدور کارت",
+      "list": "لیست سوابق صدور کارت",
+      "confirmOpen": "آیا می‌خواهید این لینک را باز کنید؟",
+      "open": "باز کردن",
+      "copyPrompt": "لینک کپی شد، لطفاً در مرورگر باز کنید",
+      "openFailed": "باز کردن لینک ناموفق بود"
     },
     "recharge-record": {
       "index": "سوابق شارژ",
       "list": "لیست شارژها",
-      "detail": "جزئیات شارژ",
-      "confirmOpen": "آیا این لینک را باز کنم؟",
-      "open": "باز کردن",
-      "copyPrompt": "لینک کپی شد، لطفاً در مرورگر باز کنید",
-      "openFailed": "قابل باز کردن لینک نیست"
+      "detail": "جزئیات شارژ"
     },
     "card-transaction-detail": {
       "index": "جزئیات تراکنش"
@@ -41,25 +45,41 @@
       "index": "کارت‌ها",
       "card-recharge": "درخواست شارژ",
       "activate-card": "فعال‌سازی کارت",
-      "select-card": "انتخاب کارت بانکی",
+      "select-card": "انتخاب کارت",
       "operations": "",
       "select": "انتخاب کارت",
-      "apply": "درخواست صدور کارت",
+      "apply": "درخواست کارت",
       "authTip": "لطفاً ابتدا احراز هویت را تکمیل کنید"
     },
     "mine": {
       "index": "حساب من",
-      "language": "تنظیم زبان",
+      "language": "تنظیمات زبان",
       "pay-password": "تغییر رمز عبور",
       "info": "اطلاعات شخصی",
-      "improve": "تکمیل پروفایل"
+      "improve": "تکمیل اطلاعات",
+      "kyc": "احراز هویت KYC",
+      "cog": "تنظیمات",
+      "help": "سؤالات متداول",
+      "help-detail": "سؤالات متداول",
+      "permission": "مدیریت مجوزها",
+      "privacy": "سیاست حفظ حریم خصوصی",
+      "clearCache": "پاک کردن کش",
+      "currentVersion": "نسخه فعلی",
+      "newVersion": "آخرین نسخه است",
+      "hasNewVersion": "نسخه جدید موجود است",
+      "about": "درباره C Pay"
     },
     "wallet": {
       "global-detail": "جزئیات سفارش",
       "index": "",
       "balance": "سوابق موجودی",
-      "global-list": "سوابق حواله",
-      "global-order": "حواله CWG"
+      "global-list": "سوابق انتقال",
+      "global-order": "انتقال جهانی",
+      "withdraw": "برداشت",
+      "vaultody": "شارژ",
+      "withdraw-list": "سوابق برداشت",
+      "vaultody-list": "سوابق شارژ",
+      "withdraw-detail": "جزئیات برداشت"
     }
   },
   "tabBar": {
@@ -116,11 +136,54 @@
     "transferB2": "انتقال"
   },
   "mine": {
-    "logout": "خروج",
+    "logout": "خروج از حساب",
     "p": "آیا مطمئن هستید که می‌خواهید خارج شوید؟",
     "b1": "خروج",
     "b2": "لغو",
-    "language": "زبان"
+    "language": "تنظیمات زبان",
+    "p1": "موقعیت مکانی",
+    "p2": "دسترسی به اطلاعات موقعیت شما",
+    "p3": "درباره موقعیت",
+    "p4": "دوربین",
+    "p5": "گرفتن عکس و ویدیو",
+    "p6": "درباره دوربین",
+    "p7": "آلبوم",
+    "p8": "دسترسی به عکس‌ها و ویدیوها",
+    "p9": "درباره آلبوم",
+    "p10": "کلیپ‌بورد",
+    "p11": "خواندن محتوای کلیپ‌بورد",
+    "p12": "فعال",
+    "p13": "رفتن به تنظیمات",
+    "p14": "توجه: برای اولین استفاده نیاز به مجوز است. در صورت رد شدن، می‌توانید از تنظیمات سیستم فعال کنید.",
+    "p15": "سیاست حفظ حریم خصوصی C Pays App",
+    "p16": "استفاده از دوربین",
+    "p17": "استفاده از آلبوم",
+    "p18": "استفاده از اطلاعات موقعیت",
+    "p19": "حجم کش",
+    "p20": "پاک کردن کش",
+    "p21": "با موفقیت پاک شد",
+    "p22": "به‌روزرسانی نسخه",
+    "p23": "نسخه فعلی بسیار قدیمی است، لطفاً به‌روزرسانی کنید",
+    "p24": "نسخه جدید یافت شد",
+    "p25": "نسخه جدید {version} یافت شد، به‌روزرسانی شود؟",
+    "p26": "در حال دانلود به‌روزرسانی",
+    "p27": "دانلود کامل شد",
+    "p28": "دانلود ناموفق",
+    "p29": "در حال دانلود",
+    "p30": "دانلود کامل شد، نصب شود؟",
+    "p31": "در حال نصب به‌روزرسانی",
+    "p32": "نصب کامل شد",
+    "p33": "نصب ناموفق",
+    "p34": "در حال نصب",
+    "p35": "به‌روزرسانی",
+    "p36": "رد کردن",
+    "p37": "به‌روزرسانی موفق",
+    "p38": "برنامه برای تکمیل به‌روزرسانی مجدداً راه‌اندازی می‌شود",
+    "p39": "ادامه دانلود",
+    "p40": "دانلود متوقف شد",
+    "p41": "دانلود به دلیل مشکل شبکه متوقف شد، ادامه می‌دهید؟",
+    "p42": "ادامه",
+    "p43": "لغو"
   },
   "login": {
     "title": "ورود",
@@ -160,7 +223,7 @@
   "language": {
     "selectLang": "انتخاب زبان",
     "cn": "چینی ساده",
-    "zh": "چینی سنتی",
+    "zhHant": "چینی سنتی",
     "en": "انگلیسی",
     "de": "آلمانی",
     "es": "اسپانیایی",
@@ -791,7 +854,7 @@
       "item128": "سود و زیان",
       "item129": "یادآوری: اشتراک‌ها پس از کاهش حقوق زیر شاخص‌های تنظیم‌شده و تمام موقعیت‌های باز بسته خواهند شد.",
       "item130": "بدون داده",
-      "item131": "بیش از 30%",
+      "item131": "بدون داده",
       "item132": "افزودن به علاقه‌مندی‌ها",
       "item133": "حذف از علاقه‌مندی‌ها",
       "item134": "اشتراک فقط پس از تصفیه پوزیسیونها در دسترس است.",
@@ -3109,6 +3172,7 @@
       "s24": "فعال سازی آنلاین:",
       "s25": "به مرکز مشتریان CWG Markets بروید و وارد صفحه 'فعال سازی کارت' شوید، شماره کارت و کد فعال سازی (ارائه شده همراه کارت) را وارد کنید.",
       "s26": "تنظیم کد PIN:",
+      "s26_1": "تأیید کد PIN:",
       "s27": "دنبال دستورالعمل ها برای تنظیم کد شناسایی شخصی (PIN)، برای برداشت از دستگاه ATM و پرداخت های خرید باشید.",
       "s28": "شروع استفاده:",
       "s29": "پس از فعال سازی، می توانید از کارت دبیت ویزا خود برای خرید و برداشت استفاده کنید.",
@@ -5436,11 +5500,11 @@
         "fieldDescription": "لطفاً کشور صدور سند شناسایی فرستنده را وارد کنید"
       },
       "receiverNativeFirstName": {
-        "fieldTitle": "نام بومی",
+        "fieldTitle": "نام گیرنده (طبق شناسنامه رسمی)",
         "fieldDescription": "لطفاً نام بومی گیرنده را وارد کنید"
       },
       "receiverNativeLastName": {
-        "fieldTitle": "نام خانوادگی بومی",
+        "fieldTitle": "نام خانوادگی گیرنده (طبق شناسنامه رسمی)",
         "fieldDescription": "لطفاً نام خانوادگی بومی گیرنده را وارد کنید"
       },
       "receiverAccountHolderName": {
@@ -5614,7 +5678,10 @@
     "p4": "لطفاً مبلغ برداشت را وارد کنید (USDT)",
     "p5": "(موجودی قابل استفاده {userBalance} USDT)",
     "p6": "مبلغ وارد شده نمی‌تواند بیشتر از {userBalance} USDT باشد",
-    "p7": "لطفاً یک عدد معتبر وارد کنید"
+    "p7": "لطفاً یک عدد معتبر وارد کنید",
+    "p8": "آدرس قرارداد",
+    "p9": "آدرس فرستنده",
+    "p10": "زمان تأیید"
   },
   "Blockchain1": {
     "title": "سوابق شارژ کیف پول",

+ 89 - 22
locale/id.json

@@ -3,6 +3,7 @@
     "confirm": "Konfirmasi",
     "cancel": "Batal",
     "loading": "Memuat...",
+    "noMore": "Tidak ada lagi",
     "success": "Berhasil",
     "fail": "Gagal",
     "input": "Silakan masukkan",
@@ -11,23 +12,26 @@
     "error": "Kesalahan sistem",
     "copy1": "Nomor kartu disalin!",
     "copy2": "CVV disalin!",
-    "copy3": "Gagal menyalin"
+    "copy3": "Gagal menyalin",
+    "year": "Tahun",
+    "month": "Bulan",
+    "day": "Hari"
   },
   "pages": {
     "login": {
       "index": "Masuk",
-      "forget": "Lupa",
+      "forget": "Lupa kata sandi",
       "regist": "Daftar",
-      "reset": "Lupa kata sandi"
+      "reset": "Atur ulang kata sandi"
     },
     "apply-record": {
-      "index": "Riwayat kartu",
-      "detail": "Detail kartu",
-      "list": "Daftar riwayat kartu",
-      "confirmOpen": "Buka tautan ini?",
+      "index": "Riwayat pembuatan kartu",
+      "detail": "Detail pembuatan kartu",
+      "list": "Daftar pembuatan kartu",
+      "confirmOpen": "Apakah Anda ingin membuka tautan ini?",
       "open": "Buka",
       "copyPrompt": "Tautan disalin, silakan buka di browser",
-      "openFailed": "Tidak dapat membuka tautan"
+      "openFailed": "Gagal membuka tautan"
     },
     "recharge-record": {
       "index": "Riwayat isi ulang",
@@ -39,27 +43,43 @@
     },
     "card": {
       "index": "Kartu",
-      "card-recharge": "Permohonan isi ulang",
-      "activate-card": "Aktivasi kartu",
+      "card-recharge": "Permintaan isi ulang",
+      "activate-card": "Aktifkan kartu",
       "select-card": "Pilih kartu",
       "operations": "",
       "select": "Pilih kartu",
       "apply": "Ajukan kartu",
-      "authTip": "Silakan selesaikan verifikasi identitas"
+      "authTip": "Silakan selesaikan verifikasi identitas terlebih dahulu"
     },
     "mine": {
-      "index": "Saya",
+      "index": "Akun saya",
       "language": "Pengaturan bahasa",
       "pay-password": "Ubah kata sandi",
-      "info": "Informasi Pribadi",
-      "improve": "Lengkapi Profil"
+      "info": "Informasi pribadi",
+      "improve": "Lengkapi informasi",
+      "kyc": "Verifikasi KYC",
+      "cog": "Pengaturan",
+      "help": "FAQ",
+      "help-detail": "FAQ",
+      "permission": "Manajemen izin",
+      "privacy": "Kebijakan privasi",
+      "clearCache": "Hapus cache",
+      "currentVersion": "Versi saat ini",
+      "newVersion": "Sudah versi terbaru",
+      "hasNewVersion": "Versi baru tersedia",
+      "about": "Tentang C Pay"
     },
     "wallet": {
-      "global-detail": "Detail Pesanan",
+      "global-detail": "Detail pesanan",
       "index": "",
       "balance": "Riwayat saldo",
       "global-list": "Riwayat transfer",
-      "global-order": "Transfer CWG"
+      "global-order": "Transfer global",
+      "withdraw": "Tarik",
+      "vaultody": "Isi ulang",
+      "withdraw-list": "Riwayat penarikan",
+      "vaultody-list": "Riwayat isi ulang",
+      "withdraw-detail": "Detail penarikan"
     }
   },
   "tabBar": {
@@ -120,7 +140,50 @@
     "p": "Apakah Anda yakin ingin keluar?",
     "b1": "Keluar",
     "b2": "Batal",
-    "language": "Bahasa"
+    "language": "Pengaturan bahasa",
+    "p1": "Lokasi",
+    "p2": "Akses informasi lokasi Anda",
+    "p3": "Tentang lokasi",
+    "p4": "Kamera",
+    "p5": "Ambil foto dan video",
+    "p6": "Tentang kamera",
+    "p7": "Album",
+    "p8": "Akses foto dan video Anda",
+    "p9": "Tentang album",
+    "p10": "Papan klip",
+    "p11": "Baca isi papan klip",
+    "p12": "Aktif",
+    "p13": "Ke pengaturan",
+    "p14": "Catatan: Izin diperlukan saat pertama kali menggunakan fitur ini.",
+    "p15": "Kebijakan Privasi C Pays App",
+    "p16": "Penggunaan kamera",
+    "p17": "Penggunaan album",
+    "p18": "Penggunaan lokasi",
+    "p19": "Ukuran cache",
+    "p20": "Hapus cache",
+    "p21": "Berhasil dihapus",
+    "p22": "Pembaruan versi",
+    "p23": "Versi saat ini terlalu rendah, silakan perbarui",
+    "p24": "Versi baru ditemukan",
+    "p25": "Versi baru {version} ditemukan, perbarui?",
+    "p26": "Mengunduh pembaruan",
+    "p27": "Unduhan selesai",
+    "p28": "Unduhan gagal",
+    "p29": "Mengunduh",
+    "p30": "Unduhan selesai, instal sekarang?",
+    "p31": "Menginstal pembaruan",
+    "p32": "Instalasi selesai",
+    "p33": "Instalasi gagal",
+    "p34": "Menginstal",
+    "p35": "Perbarui",
+    "p36": "Lewati",
+    "p37": "Pembaruan berhasil",
+    "p38": "Aplikasi akan dimulai ulang untuk menyelesaikan pembaruan",
+    "p39": "Lanjutkan unduhan",
+    "p40": "Unduhan terhenti",
+    "p41": "Unduhan terhenti karena masalah jaringan, lanjutkan?",
+    "p42": "Lanjutkan",
+    "p43": "Batal"
   },
   "login": {
     "title": "Masuk",
@@ -160,7 +223,7 @@
   "language": {
     "selectLang": "Pilih bahasa",
     "cn": "China Sederhana",
-    "zh": "China Tradisional",
+    "zhHant": "China Tradisional",
     "en": "Inggris",
     "de": "Jerman",
     "es": "Spanyol",
@@ -744,7 +807,7 @@
       "item128": "Keuntungan dan Kerugian",
       "item129": "Ingat: langganan akan berakhir dan semua posisi terbuka akan ditutup ketika ekuitas lebih rendah dari angka yang telah diatur sebelumnya.",
       "item130": "Tidak ada data",
-      "item131": "Lebih dari 30%",
+      "item131": "Tidak ada data",
       "item132": "Tambahkan ke Favorit",
       "item133": "Hapus dari Favorit",
       "item134": "Langganan hanya tersedia setelah melikuidasi posisi.",
@@ -3109,6 +3172,7 @@
       "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:",
+      "s26_1": "Konfirmasi 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.",
@@ -5436,11 +5500,11 @@
         "fieldDescription": "Harap masukkan negara penerbitan ID pengirim"
       },
       "receiverNativeFirstName": {
-        "fieldTitle": "Nama Depan Asli",
+        "fieldTitle": "Nama Depan Penerima Manfaat (seperti yang tertera di ID resmi)",
         "fieldDescription": "Harap masukkan nama depan asli penerima"
       },
       "receiverNativeLastName": {
-        "fieldTitle": "Nama Belakang Asli",
+        "fieldTitle": "Nama Belakang Penerima Manfaat (seperti yang tertera di ID resmi)",
         "fieldDescription": "Harap masukkan nama belakang asli penerima"
       },
       "receiverAccountHolderName": {
@@ -5614,7 +5678,10 @@
     "p4": "Silakan masukkan jumlah penarikan (USDT)",
     "p5": "(Saldo tersedia {userBalance} USDT)",
     "p6": "Jumlah yang dimasukkan tidak boleh melebihi {userBalance} USDT",
-    "p7": "Silakan masukkan angka yang valid"
+    "p7": "Silakan masukkan angka yang valid",
+    "p8": "Alamat Kontrak",
+    "p9": "Alamat Pengirim",
+    "p10": "Waktu Persetujuan"
   },
   "Blockchain1": {
     "title": "Riwayat Isi Ulang Dompet",

+ 1 - 1
locale/index.js

@@ -14,7 +14,7 @@ import zhHant from "./zhHant.json";
 const localesList = [
   "en",
   "cn",
-  "zh",
+  "zhHant",
   "de",
   "es",
   "ar",

+ 91 - 24
locale/ko.json

@@ -3,6 +3,7 @@
     "confirm": "확인",
     "cancel": "취소",
     "loading": "로딩 중...",
+    "noMore": "더 이상 데이터가 없습니다",
     "success": "성공",
     "fail": "실패",
     "input": "입력하세요",
@@ -11,27 +12,30 @@
     "error": "시스템 오류",
     "copy1": "카드 번호가 복사되었습니다!",
     "copy2": "CVV가 복사되었습니다!",
-    "copy3": "복사 실패"
+    "copy3": "복사 실패",
+    "year": "년",
+    "month": "월",
+    "day": "일"
   },
   "pages": {
     "login": {
       "index": "로그인",
-      "forget": "잊어버림",
+      "forget": "비밀번호 찾기",
       "regist": "회원가입",
-      "reset": "비밀번호 찾기"
+      "reset": "비밀번호 재설정"
     },
     "apply-record": {
-      "index": "카드 발급 기록",
-      "detail": "카드 상세",
-      "list": "카드 발급 목록",
+      "index": "카드 신청 기록",
+      "detail": "신청 상세",
+      "list": "카드 신청 목록",
       "confirmOpen": "이 링크를 열까요?",
       "open": "열기",
-      "copyPrompt": "링크가 복사되었습니다. 브라우저에서 세요",
+      "copyPrompt": "링크가 복사되었습니다. 브라우저에서 열어주세요",
       "openFailed": "링크를 열 수 없습니다"
     },
     "recharge-record": {
       "index": "충전 기록",
-      "list": "충전 목록",
+      "list": "충전 기록 목록",
       "detail": "충전 상세"
     },
     "card-transaction-detail": {
@@ -42,24 +46,40 @@
       "card-recharge": "충전 신청",
       "activate-card": "카드 활성화",
       "select-card": "카드 선택",
-      "operations": "",
+      "operations": "작업",
       "select": "카드 선택",
       "apply": "카드 신청",
-      "authTip": "먼저 신원 인증을 완료세요"
+      "authTip": "먼저 신원 인증을 완료해주세요"
     },
     "mine": {
       "index": "내 정보",
       "language": "언어 설정",
-      "pay-password": "비밀번호 변경",
-      "info": "개인정보",
-      "improve": "프로필 완성"
+      "pay-password": "결제 비밀번호 변경",
+      "info": "개인 정보",
+      "improve": "정보 보완",
+      "kyc": "KYC 인증",
+      "cog": "설정",
+      "help": "자주 묻는 질문",
+      "help-detail": "자주 묻는 질문",
+      "permission": "권한 관리",
+      "privacy": "개인정보 보호정책",
+      "clearCache": "캐시 삭제",
+      "currentVersion": "현재 버전",
+      "newVersion": "최신 버전입니다",
+      "hasNewVersion": "새 버전이 있습니다",
+      "about": "C Pay 소개"
     },
     "wallet": {
-      "global-detail": "주문 세부 정보",
-      "index": "",
-      "balance": "잔액 기록",
+      "global-detail": "주문 세",
+      "index": "지갑",
+      "balance": "지갑 잔액 기록",
       "global-list": "송금 기록",
-      "global-order": "CWG 송금"
+      "global-order": "글로벌 송금",
+      "withdraw": "출금",
+      "vaultody": "입금",
+      "withdraw-list": "출금 기록",
+      "vaultody-list": "입금 기록",
+      "withdraw-detail": "출금 상세"
     }
   },
   "tabBar": {
@@ -117,10 +137,53 @@
   },
   "mine": {
     "logout": "로그아웃",
-    "p": "로그아웃 하시겠습니까?",
+    "p": "로그아웃하시겠습니까?",
     "b1": "로그아웃",
     "b2": "취소",
-    "language": "언어"
+    "language": "언어 설정",
+    "p1": "위치",
+    "p2": "위치 정보 접근",
+    "p3": "위치 정보 안내",
+    "p4": "카메라",
+    "p5": "사진 및 동영상 촬영",
+    "p6": "카메라 안내",
+    "p7": "앨범",
+    "p8": "사진 및 동영상 접근",
+    "p9": "앨범 안내",
+    "p10": "클립보드",
+    "p11": "클립보드 내용 읽기",
+    "p12": "사용 중",
+    "p13": "설정으로 이동",
+    "p14": "안내: 최초 사용 시 권한 허용이 필요합니다.",
+    "p15": "C Pays App 개인정보 처리방침",
+    "p16": "카메라 사용",
+    "p17": "앨범 사용",
+    "p18": "위치 정보 사용",
+    "p19": "캐시 크기",
+    "p20": "캐시 삭제",
+    "p21": "삭제 완료",
+    "p22": "버전 업데이트",
+    "p23": "현재 버전이 너무 낮습니다. 업데이트 후 이용하세요.",
+    "p24": "새 버전 발견",
+    "p25": "새 버전 {version}이 있습니다. 업데이트하시겠습니까?",
+    "p26": "업데이트 다운로드 중",
+    "p27": "다운로드 완료",
+    "p28": "다운로드 실패",
+    "p29": "다운로드 중",
+    "p30": "다운로드 완료, 설치하시겠습니까?",
+    "p31": "업데이트 설치 중",
+    "p32": "설치 완료",
+    "p33": "설치 실패",
+    "p34": "설치 중",
+    "p35": "업데이트",
+    "p36": "건너뛰기",
+    "p37": "업데이트 성공",
+    "p38": "업데이트 완료를 위해 앱이 재시작됩니다",
+    "p39": "다운로드 계속",
+    "p40": "다운로드 중단",
+    "p41": "네트워크 문제로 다운로드가 중단되었습니다. 계속하시겠습니까?",
+    "p42": "계속",
+    "p43": "취소"
   },
   "login": {
     "title": "로그인",
@@ -160,7 +223,7 @@
   "language": {
     "selectLang": "언어 선택",
     "cn": "중국어(간체)",
-    "zh": "중국어(번체)",
+    "zhHant": "중국어(번체)",
     "en": "영어",
     "de": "독일어",
     "es": "스페인어",
@@ -791,7 +854,7 @@
       "item128": "손익",
       "item129": "알림: 자산이 사전 설정 수치보다 낮을 경우 구독이 종료되고 모든 오픈 포지션이 마감됩니다.",
       "item130": "데이터 없음 ",
-      "item131": "30% 이상",
+      "item131": "데이터 없음 ",
       "item132": "즐겨찾기 추가",
       "item133": "즐겨찾기 삭제",
       "item134": "포지션 청산 후에만 구독이 가능합니다.",
@@ -3109,6 +3172,7 @@
       "s24": "온라인 활성화:",
       "s25": "CWG Markets 고객 센터로 이동하여 '카드 활성화' 페이지에 들어가 카드를 활성화 코드(카드와 함께 제공됨)와 함께 입력하세요.",
       "s26": "PIN 코드 설정:",
+      "s26_1": "PIN 코드 확인:",
       "s27": "ATM 출금 및 쇼핑 결제에 사용할 개인 식별 번호(PIN)를 설정하라는 안내를 따르세요.",
       "s28": "사용 시작:",
       "s29": "카드가 활성화되면 Visa 직불 카드를 사용하여 지출 및 출금을 시작할 수 있습니다.",
@@ -5436,11 +5500,11 @@
         "fieldDescription": "송신자의 신분증 발급 국가를 입력해 주세요"
       },
       "receiverNativeFirstName": {
-        "fieldTitle": "본토 이름",
+        "fieldTitle": "수혜자의 이름 (공식 신분증에 기재된 대로)",
         "fieldDescription": "수신자의 본토 이름을 입력해 주세요"
       },
       "receiverNativeLastName": {
-        "fieldTitle": "본토 성",
+        "fieldTitle": "수혜자의 성 (공식 신분증에 기재된 대로)",
         "fieldDescription": "수신자의 본토 성을 입력해 주세요"
       },
       "receiverAccountHolderName": {
@@ -5614,7 +5678,10 @@
     "p4": "출금 금액을 입력하세요 (USDT)",
     "p5": "(사용 가능 잔액 {userBalance} USDT)",
     "p6": "입력한 금액은 {userBalance} USDT를 초과할 수 없습니다",
-    "p7": "유효한 숫자를 입력하세요"
+    "p7": "유효한 숫자를 입력하세요",
+    "p8": "계약 주소",
+    "p9": "발신자 주소",
+    "p10": "승인 시간"
   },
   "Blockchain1": {
     "title": "지갑 충전 기록",

+ 92 - 25
locale/ms.json

@@ -3,35 +3,39 @@
     "confirm": "Sahkan",
     "cancel": "Batal",
     "loading": "Memuatkan...",
+    "noMore": "Tiada lagi",
     "success": "Berjaya",
     "fail": "Gagal",
     "input": "Sila masukkan",
     "choose": "Sila pilih",
     "country": "Masukkan mata wang / negara",
     "error": "Ralat sistem",
-    "copy1": "Nombor kad telah disalin!",
-    "copy2": "CVV telah disalin!",
-    "copy3": "Salin gagal"
+    "copy1": "Nombor kad disalin!",
+    "copy2": "CVV disalin!",
+    "copy3": "Gagal menyalin",
+    "year": "Tahun",
+    "month": "Bulan",
+    "day": "Hari"
   },
   "pages": {
     "login": {
       "index": "Log masuk",
-      "forget": "Lupa",
+      "forget": "Lupa kata laluan",
       "regist": "Daftar",
-      "reset": "Lupa kata laluan"
+      "reset": "Tetapkan semula kata laluan"
     },
     "apply-record": {
       "index": "Rekod permohonan kad",
       "detail": "Butiran permohonan kad",
-      "list": "Senarai rekod permohonan kad",
-      "confirmOpen": "Buka pautan ini?",
+      "list": "Senarai permohonan kad",
+      "confirmOpen": "Adakah anda mahu membuka pautan ini?",
       "open": "Buka",
-      "copyPrompt": "Pautan disalin, sila buka di penyemak imbas",
-      "openFailed": "Tidak dapat membuka pautan"
+      "copyPrompt": "Pautan disalin, sila buka di pelayar",
+      "openFailed": "Gagal membuka pautan"
     },
     "recharge-record": {
       "index": "Rekod tambah nilai",
-      "list": "Senarai rekod tambah nilai",
+      "list": "Senarai tambah nilai",
       "detail": "Butiran tambah nilai"
     },
     "card-transaction-detail": {
@@ -41,25 +45,41 @@
       "index": "Kad",
       "card-recharge": "Permohonan tambah nilai",
       "activate-card": "Aktifkan kad",
-      "select-card": "Pilih kad bank",
+      "select-card": "Pilih kad",
       "operations": "",
-      "select": "Pilih kad bank",
+      "select": "Pilih kad",
       "apply": "Mohon kad",
       "authTip": "Sila lengkapkan pengesahan identiti terlebih dahulu"
     },
     "mine": {
-      "index": "Saya",
+      "index": "Akaun saya",
       "language": "Tetapan bahasa",
-      "pay-password": "Ubah kata laluan",
-      "info": "Maklumat Peribadi",
-      "improve": "Lengkapkan Profil"
+      "pay-password": "Tukar kata laluan",
+      "info": "Maklumat peribadi",
+      "improve": "Lengkapkan maklumat",
+      "kyc": "Pengesahan KYC",
+      "cog": "Tetapan",
+      "help": "Soalan lazim",
+      "help-detail": "Soalan lazim",
+      "permission": "Pengurusan kebenaran",
+      "privacy": "Dasar privasi",
+      "clearCache": "Kosongkan cache",
+      "currentVersion": "Versi semasa",
+      "newVersion": "Versi terkini",
+      "hasNewVersion": "Versi baharu tersedia",
+      "about": "Mengenai C Pay"
     },
     "wallet": {
-      "global-detail": "Butiran Pesanan",
+      "global-detail": "Butiran pesanan",
       "index": "",
-      "balance": "Rekod baki dompet",
+      "balance": "Rekod baki",
       "global-list": "Rekod pemindahan",
-      "global-order": "Pemindahan CWG"
+      "global-order": "Pemindahan global",
+      "withdraw": "Pengeluaran",
+      "vaultody": "Tambah nilai",
+      "withdraw-list": "Rekod pengeluaran",
+      "vaultody-list": "Rekod tambah nilai",
+      "withdraw-detail": "Butiran pengeluaran"
     }
   },
   "tabBar": {
@@ -120,7 +140,50 @@
     "p": "Adakah anda pasti mahu log keluar?",
     "b1": "Log keluar",
     "b2": "Batal",
-    "language": "Tetapan bahasa"
+    "language": "Tetapan bahasa",
+    "p1": "Lokasi",
+    "p2": "Akses maklumat lokasi anda",
+    "p3": "Tentang lokasi",
+    "p4": "Kamera",
+    "p5": "Ambil gambar dan video",
+    "p6": "Tentang kamera",
+    "p7": "Album",
+    "p8": "Akses gambar dan video",
+    "p9": "Tentang album",
+    "p10": "Papan klip",
+    "p11": "Baca kandungan papan klip",
+    "p12": "Diaktifkan",
+    "p13": "Pergi ke tetapan",
+    "p14": "Nota: Kebenaran diperlukan semasa penggunaan pertama.",
+    "p15": "Dasar Privasi C Pays App",
+    "p16": "Penggunaan kamera",
+    "p17": "Penggunaan album",
+    "p18": "Penggunaan lokasi",
+    "p19": "Saiz cache",
+    "p20": "Kosongkan cache",
+    "p21": "Berjaya dikosongkan",
+    "p22": "Kemas kini versi",
+    "p23": "Versi semasa terlalu rendah, sila kemas kini",
+    "p24": "Versi baharu ditemui",
+    "p25": "Versi baharu {version} ditemui, kemas kini?",
+    "p26": "Memuat turun kemas kini",
+    "p27": "Muat turun selesai",
+    "p28": "Muat turun gagal",
+    "p29": "Sedang memuat turun",
+    "p30": "Muat turun selesai, pasang sekarang?",
+    "p31": "Memasang kemas kini",
+    "p32": "Pemasangan selesai",
+    "p33": "Pemasangan gagal",
+    "p34": "Sedang memasang",
+    "p35": "Kemas kini",
+    "p36": "Langkau",
+    "p37": "Kemas kini berjaya",
+    "p38": "Aplikasi akan dimulakan semula untuk melengkapkan kemas kini",
+    "p39": "Teruskan muat turun",
+    "p40": "Muat turun terganggu",
+    "p41": "Muat turun terganggu kerana rangkaian, teruskan?",
+    "p42": "Teruskan",
+    "p43": "Batal"
   },
   "login": {
     "title": "Log masuk",
@@ -160,7 +223,7 @@
   "language": {
     "selectLang": "Pilih bahasa",
     "cn": "Cina Ringkas",
-    "zh": "Cina Tradisional",
+    "zhHant": "Cina Tradisional",
     "en": "English",
     "de": "Deutsch",
     "es": "Español",
@@ -791,7 +854,7 @@
       "item128": "Keuntungan dan Rugi",
       "item129": "Peringatan: Langganan akan ditamatkan dan semua posisi terbuka akan ditutup apabila ekuiti jatuh di bawah angka yang ditetapkan.",
       "item130": "Tiada data",
-      "item131": "lebih daripada 30%",
+      "item131": "Tiada data",
       "item132": "Tambah ke kegemaran",
       "item133": "Alih keluar daripada kegemaran",
       "item134": "Langganan hanya boleh didapati selepas melikuidasi kedudukan.",
@@ -3109,6 +3172,7 @@
       "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:",
+      "s26_1": "Sahkan 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.",
@@ -5436,11 +5500,11 @@
         "fieldDescription": "Sila masukkan negara pengeluaran pengenalan penghantar"
       },
       "receiverNativeFirstName": {
-        "fieldTitle": "Nama Pertama Asal",
+        "fieldTitle": "Nama Pertama Penerima Manfaat (seperti yang tertera pada ID rasmi)",
         "fieldDescription": "Sila masukkan nama pertama asal penerima"
       },
       "receiverNativeLastName": {
-        "fieldTitle": "Nama Akhir Asal",
+        "fieldTitle": "Nama Akhir Penerima Manfaat (seperti yang tertera pada ID rasmi)",
         "fieldDescription": "Sila masukkan nama akhir asal penerima"
       },
       "receiverAccountHolderName": {
@@ -5614,7 +5678,10 @@
     "p4": "Sila masukkan jumlah pengeluaran (USDT)",
     "p5": "(Baki tersedia {userBalance} USDT)",
     "p6": "Jumlah yang dimasukkan tidak boleh melebihi {userBalance} USDT",
-    "p7": "Sila masukkan nombor yang sah"
+    "p7": "Sila masukkan nombor yang sah",
+    "p8": "Alamat Kontrak",
+    "p9": "Alamat Penghantar",
+    "p10": "Masa Kelulusan"
   },
   "Blockchain1": {
     "title": "Rekod Tambah Nilai Dompet",

+ 92 - 25
locale/pt.json

@@ -3,30 +3,34 @@
     "confirm": "Confirmar",
     "cancel": "Cancelar",
     "loading": "Carregando...",
+    "noMore": "Não há mais dados",
     "success": "Sucesso",
     "fail": "Falha",
-    "input": "Por favor, insira",
-    "choose": "Por favor, selecione",
-    "country": "Digite moeda / país",
+    "input": "Por favor insira",
+    "choose": "Por favor selecione",
+    "country": "Inserir moeda / país",
     "error": "Erro do sistema",
     "copy1": "Número do cartão copiado!",
     "copy2": "CVV copiado!",
-    "copy3": "Falha ao copiar"
+    "copy3": "Falha ao copiar",
+    "year": "Ano",
+    "month": "Mês",
+    "day": "Dia"
   },
   "pages": {
     "login": {
       "index": "Entrar",
-      "forget": "Esquecer",
+      "forget": "Esqueci a senha",
       "regist": "Registrar",
-      "reset": "Esqueci a senha"
+      "reset": "Redefinir senha"
     },
     "apply-record": {
-      "index": "Registros de solicitação de cartão",
-      "detail": "Detalhes da solicitação",
-      "list": "Lista de solicitações de cartão",
-      "confirmOpen": "Abrir este link?",
+      "index": "Registros de emissão de cartão",
+      "detail": "Detalhes da emissão",
+      "list": "Lista de registros",
+      "confirmOpen": "Deseja abrir este link?",
       "open": "Abrir",
-      "copyPrompt": "Link copiado, por favor abra no navegador",
+      "copyPrompt": "Link copiado, abra no navegador",
       "openFailed": "Não foi possível abrir o link"
     },
     "recharge-record": {
@@ -41,25 +45,41 @@
       "index": "Cartões",
       "card-recharge": "Solicitação de recarga",
       "activate-card": "Ativar cartão",
-      "select-card": "Selecionar cartão bancário",
+      "select-card": "Selecionar cartão",
       "operations": "",
-      "select": "Selecionar cartão bancário",
+      "select": "Selecionar cartão",
       "apply": "Solicitar cartão",
-      "authTip": "Por favor, conclua a verificação de identidade primeiro"
+      "authTip": "Conclua a verificação de identidade primeiro"
     },
     "mine": {
       "index": "Minha conta",
       "language": "Configurações de idioma",
       "pay-password": "Alterar senha",
-      "info": "Informações Pessoais",
-      "improve": "Completar Perfil"
+      "info": "Informações pessoais",
+      "improve": "Completar informações",
+      "kyc": "Verificação KYC",
+      "cog": "Configurações",
+      "help": "Perguntas frequentes",
+      "help-detail": "Perguntas frequentes",
+      "permission": "Gerenciamento de permissões",
+      "privacy": "Política de privacidade",
+      "clearCache": "Limpar cache",
+      "currentVersion": "Versão atual",
+      "newVersion": "Já é a versão mais recente",
+      "hasNewVersion": "Nova versão disponível",
+      "about": "Sobre o C Pay"
     },
     "wallet": {
-      "global-detail": "Detalhes do Pedido",
+      "global-detail": "Detalhes do pedido",
       "index": "",
       "balance": "Registros de saldo",
-      "global-list": "Registros de remessa",
-      "global-order": "Remessa CWG"
+      "global-list": "Registros de transferência",
+      "global-order": "Transferência global",
+      "withdraw": "Sacar",
+      "vaultody": "Recarregar",
+      "withdraw-list": "Registros de saque",
+      "vaultody-list": "Registros de recarga",
+      "withdraw-detail": "Detalhes do saque"
     }
   },
   "tabBar": {
@@ -120,7 +140,50 @@
     "p": "Tem certeza de que deseja sair?",
     "b1": "Sair",
     "b2": "Cancelar",
-    "language": "Configurações de idioma"
+    "language": "Configurações de idioma",
+    "p1": "Localização",
+    "p2": "Acessar informações de localização",
+    "p3": "Sobre localização",
+    "p4": "Câmera",
+    "p5": "Tirar fotos e vídeos",
+    "p6": "Sobre a câmera",
+    "p7": "Álbum",
+    "p8": "Acessar fotos e vídeos",
+    "p9": "Sobre o álbum",
+    "p10": "Área de transferência",
+    "p11": "Ler conteúdo da área de transferência",
+    "p12": "Ativado",
+    "p13": "Ir para configurações",
+    "p14": "Aviso: Permissão necessária no primeiro uso.",
+    "p15": "Política de Privacidade do C Pays App",
+    "p16": "Uso da câmera",
+    "p17": "Uso do álbum",
+    "p18": "Uso da localização",
+    "p19": "Tamanho do cache",
+    "p20": "Limpar cache",
+    "p21": "Limpeza concluída",
+    "p22": "Atualização de versão",
+    "p23": "A versão atual é muito antiga. Atualize para continuar.",
+    "p24": "Nova versão encontrada",
+    "p25": "Nova versão {version} encontrada. Atualizar?",
+    "p26": "Baixando atualização",
+    "p27": "Download concluído",
+    "p28": "Falha no download",
+    "p29": "Baixando",
+    "p30": "Download concluído. Instalar agora?",
+    "p31": "Instalando atualização",
+    "p32": "Instalação concluída",
+    "p33": "Falha na instalação",
+    "p34": "Instalando",
+    "p35": "Atualizar",
+    "p36": "Pular",
+    "p37": "Atualização bem-sucedida",
+    "p38": "O aplicativo será reiniciado para concluir a atualização",
+    "p39": "Continuar download",
+    "p40": "Download interrompido",
+    "p41": "Download interrompido por problema de rede. Continuar?",
+    "p42": "Continuar",
+    "p43": "Cancelar"
   },
   "login": {
     "title": "Entrar",
@@ -160,7 +223,7 @@
   "language": {
     "selectLang": "Selecionar idioma",
     "cn": "Chinês Simplificado",
-    "zh": "Chinês Tradicional",
+    "zhHant": "Chinês Tradicional",
     "en": "English",
     "de": "Deutsch",
     "es": "Español",
@@ -791,7 +854,7 @@
       "item128": "lucros e perdas",
       "item129": "Lembre-se:as subscrições serão encerradas e todas as posições abertas serão encerradas quando o patrimônio líquido for inferior aos valores predefinidos.",
       "item130": "Sem dados ",
-      "item131": "mais de 30%",
+      "item131": "Sem dados ",
       "item132": "Adicionar aos favoritos",
       "item133": "Remover dos favoritos",
       "item134": "A assinatura só está disponível após a liquidação das posições.",
@@ -3109,6 +3172,7 @@
       "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:",
+      "s26_1": "Confirmar 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.",
@@ -5436,11 +5500,11 @@
         "fieldDescription": "Por favor, insira o país de emissão do documento do remetente"
       },
       "receiverNativeFirstName": {
-        "fieldTitle": "Nome Nativo",
+        "fieldTitle": "Primeiro nome do beneficiário (como está no documento oficial)",
         "fieldDescription": "Por favor, insira o nome nativo do destinatário"
       },
       "receiverNativeLastName": {
-        "fieldTitle": "Sobrenome Nativo",
+        "fieldTitle": "Sobrenome do beneficiário (como está no documento oficial)",
         "fieldDescription": "Por favor, insira o sobrenome nativo do destinatário"
       },
       "receiverAccountHolderName": {
@@ -5614,7 +5678,10 @@
     "p4": "Insira o valor do saque (USDT)",
     "p5": "(Saldo disponível {userBalance} USDT)",
     "p6": "O valor inserido não pode exceder {userBalance} USDT",
-    "p7": "Por favor, insira um número válido"
+    "p7": "Por favor, insira um número válido",
+    "p8": "Endereço do Contrato",
+    "p9": "Endereço do Remetente",
+    "p10": "Tempo de Aprovação"
   },
   "Blockchain1": {
     "title": "Registros de Recarga da Carteira",

+ 84 - 17
locale/th.json

@@ -3,30 +3,34 @@
     "confirm": "ยืนยัน",
     "cancel": "ยกเลิก",
     "loading": "กำลังโหลด...",
+    "noMore": "ไม่มีข้อมูลเพิ่มเติม",
     "success": "สำเร็จ",
     "fail": "ล้มเหลว",
     "input": "กรุณากรอก",
     "choose": "กรุณาเลือก",
-    "country": "กรอกสกุลเงิน / ประเทศ",
+    "country": "ป้อนสกุลเงิน / ประเทศ",
     "error": "ข้อผิดพลาดของระบบ",
     "copy1": "คัดลอกหมายเลขบัตรแล้ว!",
     "copy2": "คัดลอก CVV แล้ว!",
-    "copy3": "คัดลอกไม่สำเร็จ"
+    "copy3": "คัดลอกไม่สำเร็จ",
+    "year": "ปี",
+    "month": "เดือน",
+    "day": "วัน"
   },
   "pages": {
     "login": {
       "index": "เข้าสู่ระบบ",
-      "forget": "ลืม",
+      "forget": "ลืมรหัสผ่าน",
       "regist": "สมัครสมาชิก",
-      "reset": "ลืมรหัสผ่าน"
+      "reset": "รีเซ็ตรหัสผ่าน"
     },
     "apply-record": {
       "index": "ประวัติการสมัครบัตร",
       "detail": "รายละเอียดการสมัครบัตร",
       "list": "รายการสมัครบัตร",
-      "confirmOpen": "ต้องการเปิดลิงก์นี้หรือไม่",
+      "confirmOpen": "คุณต้องการเปิดลิงก์นี้หรือไม่?",
       "open": "เปิด",
-      "copyPrompt": "คัดลอกลิงก์แล้ว โปรดเปิดในเบราว์เซอร์",
+      "copyPrompt": "คัดลอกลิงก์แล้ว กรุณาเปิดในเบราว์เซอร์",
       "openFailed": "ไม่สามารถเปิดลิงก์ได้"
     },
     "recharge-record": {
@@ -39,11 +43,11 @@
     },
     "card": {
       "index": "บัตร",
-      "card-recharge": "คำขอเติมเงิน",
+      "card-recharge": "ขอเติมเงิน",
       "activate-card": "เปิดใช้งานบัตร",
-      "select-card": "เลือกบัตรธนาคาร",
+      "select-card": "เลือกบัตร",
       "operations": "",
-      "select": "เลือกบัตรธนาคาร",
+      "select": "เลือกบัตร",
       "apply": "สมัครบัตร",
       "authTip": "กรุณายืนยันตัวตนก่อน"
     },
@@ -52,14 +56,30 @@
       "language": "ตั้งค่าภาษา",
       "pay-password": "เปลี่ยนรหัสผ่าน",
       "info": "ข้อมูลส่วนตัว",
-      "improve": "เติมเต็มโปรไฟล์"
+      "improve": "กรอกข้อมูลเพิ่มเติม",
+      "kyc": "การยืนยันตัวตน KYC",
+      "cog": "การตั้งค่า",
+      "help": "คำถามที่พบบ่อย",
+      "help-detail": "คำถามที่พบบ่อย",
+      "permission": "การจัดการสิทธิ์",
+      "privacy": "นโยบายความเป็นส่วนตัว",
+      "clearCache": "ล้างแคช",
+      "currentVersion": "เวอร์ชันปัจจุบัน",
+      "newVersion": "เป็นเวอร์ชันล่าสุดแล้ว",
+      "hasNewVersion": "มีเวอร์ชันใหม่",
+      "about": "เกี่ยวกับ C Pay"
     },
     "wallet": {
       "global-detail": "รายละเอียดคำสั่งซื้อ",
       "index": "",
       "balance": "ประวัติยอดเงิน",
       "global-list": "ประวัติการโอน",
-      "global-order": "โอน CWG"
+      "global-order": "โอนเงินระหว่างประเทศ",
+      "withdraw": "ถอนเงิน",
+      "vaultody": "เติมเงิน",
+      "withdraw-list": "ประวัติการถอน",
+      "vaultody-list": "ประวัติการเติม",
+      "withdraw-detail": "รายละเอียดการถอน"
     }
   },
   "tabBar": {
@@ -120,7 +140,50 @@
     "p": "คุณแน่ใจหรือไม่ว่าต้องการออกจากระบบ?",
     "b1": "ออกจากระบบ",
     "b2": "ยกเลิก",
-    "language": "ตั้งค่าภาษา"
+    "language": "การตั้งค่าภาษา",
+    "p1": "ตำแหน่งที่ตั้ง",
+    "p2": "เข้าถึงข้อมูลตำแหน่งของคุณ",
+    "p3": "เกี่ยวกับตำแหน่ง",
+    "p4": "กล้อง",
+    "p5": "ถ่ายภาพและวิดีโอ",
+    "p6": "เกี่ยวกับกล้อง",
+    "p7": "อัลบั้ม",
+    "p8": "เข้าถึงรูปภาพและวิดีโอ",
+    "p9": "เกี่ยวกับอัลบั้ม",
+    "p10": "คลิปบอร์ด",
+    "p11": "อ่านเนื้อหาคลิปบอร์ด",
+    "p12": "เปิดใช้งาน",
+    "p13": "ไปที่การตั้งค่า",
+    "p14": "หมายเหตุ: ต้องขออนุญาตเมื่อใช้งานครั้งแรก",
+    "p15": "นโยบายความเป็นส่วนตัวของ C Pays App",
+    "p16": "การใช้กล้อง",
+    "p17": "การใช้อัลบั้ม",
+    "p18": "การใช้ข้อมูลตำแหน่ง",
+    "p19": "ขนาดแคช",
+    "p20": "ล้างแคช",
+    "p21": "ล้างสำเร็จ",
+    "p22": "อัปเดตเวอร์ชัน",
+    "p23": "เวอร์ชันปัจจุบันต่ำเกินไป กรุณาอัปเดต",
+    "p24": "พบเวอร์ชันใหม่",
+    "p25": "พบเวอร์ชันใหม่ {version} ต้องการอัปเดตหรือไม่?",
+    "p26": "กำลังดาวน์โหลดอัปเดต",
+    "p27": "ดาวน์โหลดเสร็จสิ้น",
+    "p28": "ดาวน์โหลดล้มเหลว",
+    "p29": "กำลังดาวน์โหลด",
+    "p30": "ดาวน์โหลดเสร็จสิ้น ติดตั้งหรือไม่?",
+    "p31": "กำลังติดตั้งอัปเดต",
+    "p32": "ติดตั้งเสร็จสิ้น",
+    "p33": "ติดตั้งล้มเหลว",
+    "p34": "กำลังติดตั้ง",
+    "p35": "อัปเดต",
+    "p36": "ข้าม",
+    "p37": "อัปเดตสำเร็จ",
+    "p38": "แอปจะรีสตาร์ทเพื่อเสร็จสิ้นการอัปเดต",
+    "p39": "ดาวน์โหลดต่อ",
+    "p40": "การดาวน์โหลดถูกขัดจังหวะ",
+    "p41": "การดาวน์โหลดหยุดเนื่องจากเครือข่าย ต้องการดำเนินการต่อหรือไม่?",
+    "p42": "ดำเนินการต่อ",
+    "p43": "ยกเลิก"
   },
   "login": {
     "title": "เข้าสู่ระบบ",
@@ -160,7 +223,7 @@
   "language": {
     "selectLang": "เลือกภาษา",
     "cn": "จีนตัวย่อ",
-    "zh": "จีนตัวเต็ม",
+    "zhHant": "จีนตัวเต็ม",
     "en": "English",
     "de": "Deutsch",
     "es": "Español",
@@ -791,7 +854,7 @@
       "item128": "กำไรและขาดทุน",
       "item129": "เตือน:การสมัครสมาชิกจะถูกยกเลิกและการเปิดตำแหน่งทั้งหมดจะถูกปิดเมื่อเงินทุนต่ำกว่าค่าที่กำหนดล่วงหน้า",
       "item130": "ไม่มีข้อมูล ",
-      "item131": "มากกว่า 30%",
+      "item131": "ไม่มีข้อมูล ",
       "item132": "เพิ่มไปยังรายการโปรด",
       "item133": "ลบออกจากรายการโปรด",
       "item134": "การสมัครสมาชิกมีให้เฉพาะหลังจากที่ขายทิปที่มี",
@@ -3109,6 +3172,7 @@
       "s24": "เปิดใช้งานออนไลน์:",
       "s25": "ไปที่ศูนย์ลูกค้าของ CWG Markets และเข้าสู่หน้าการเปิดใช้งานบัตร ใส่หมายเลขบัตรและรหัสการเปิดใช้งาน (ที่ให้มาพร้อมกับบัตร)",
       "s26": "ตั้งรหัส PIN:",
+      "s26_1": "ยืนยันรหัส PIN:",
       "s27": "ทำตามขั้นตอนเพื่อตั้งรหัสส่วนตัว (PIN) ใช้สำหรับการถอนเงินจากตู้ ATM และการชำระเงินในการช็อปปิ้ง",
       "s28": "เริ่มใช้งาน:",
       "s29": "เมื่อเปิดใช้งานแล้ว คุณสามารถเริ่มใช้บัตร Visa Debit ของคุณในการใช้จ่ายและถอนเงิน",
@@ -5436,11 +5500,11 @@
         "fieldDescription": "กรุณากรอกประเทศที่ออกบัตรผู้ส่ง"
       },
       "receiverNativeFirstName": {
-        "fieldTitle": "ชื่อภาษาแม่",
+        "fieldTitle": "ชื่อของผู้รับประโยชน์ (ตามที่ระบุในบัตรประชาชน)",
         "fieldDescription": "กรุณากรอกชื่อภาษาแม่ของผู้รับ"
       },
       "receiverNativeLastName": {
-        "fieldTitle": "นามสกุลภาษาแม่",
+        "fieldTitle": "นามสกุลของผู้รับประโยชน์ (ตามที่ระบุในบัตรประชาชน)",
         "fieldDescription": "กรุณากรอกนามสกุลภาษาแม่ของผู้รับ"
       },
       "receiverAccountHolderName": {
@@ -5614,7 +5678,10 @@
     "p4": "กรุณากรอกจำนวนเงินที่ถอน (USDT)",
     "p5": "(ยอดคงเหลือที่ใช้ได้ {userBalance} USDT)",
     "p6": "จำนวนเงินที่กรอกต้องไม่เกิน {userBalance} USDT",
-    "p7": "กรุณากรอกตัวเลขที่ถูกต้อง"
+    "p7": "กรุณากรอกตัวเลขที่ถูกต้อง",
+    "p8": "ที่อยู่สัญญา",
+    "p9": "ที่อยู่ผู้ส่ง",
+    "p10": "เวลาอนุมัติ"
   },
   "Blockchain1": {
     "title": "ประวัติการเติมเงินกระเป๋าเงิน",

+ 101 - 34
locale/tr.json

@@ -3,6 +3,7 @@
     "confirm": "Onayla",
     "cancel": "İptal",
     "loading": "Yükleniyor...",
+    "noMore": "Daha fazla yok",
     "success": "Başarılı",
     "fail": "Başarısız",
     "input": "Lütfen girin",
@@ -11,55 +12,74 @@
     "error": "Sistem hatası",
     "copy1": "Kart numarası kopyalandı!",
     "copy2": "CVV kopyalandı!",
-    "copy3": "Kopyalama başarısız"
+    "copy3": "Kopyalama başarısız",
+    "year": "Yıl",
+    "month": "Ay",
+    "day": "Gün"
   },
   "pages": {
     "login": {
-      "index": "Giriş yap",
-      "forget": "Unut",
-      "regist": "Kayıt ol",
-      "reset": "Şifreyi unuttum"
+      "index": "Giriş",
+      "forget": "Şifreyi Unuttum",
+      "regist": "Kayıt Ol",
+      "reset": "Şifre Sıfırla"
     },
     "apply-record": {
-      "index": "Kart başvuru kayıtları",
-      "detail": "Kart başvuru detayları",
-      "list": "Kart başvuru listesi",
-      "confirmOpen": "Bu bağlantı açılsın mı?",
+      "index": "Kart Başvuru Kayıtları",
+      "detail": "Kart Başvuru Detayı",
+      "list": "Kart Başvuru Listesi",
+      "confirmOpen": "Bu bağlantıyı açmak istiyor musunuz?",
       "open": "Aç",
-      "copyPrompt": "Bağlantı kopyalandı, lütfen tarayıcıda açın",
-      "openFailed": "Bağlantı açılamıyor"
+      "copyPrompt": "Bağlantı kopyalandı, tarayıcıda açın",
+      "openFailed": "Bağlantı açılamadı"
     },
     "recharge-record": {
-      "index": "Yükleme kayıtları",
-      "list": "Yükleme listesi",
-      "detail": "Yükleme detayları"
+      "index": "Yükleme Kayıtları",
+      "list": "Yükleme Kayıt Listesi",
+      "detail": "Yükleme Detayı"
     },
     "card-transaction-detail": {
-      "index": "İşlem detayları"
+      "index": "İşlem Detayı"
     },
     "card": {
       "index": "Kartlar",
-      "card-recharge": "Yükleme talebi",
-      "activate-card": "Kartı etkinleştir",
-      "select-card": "Banka kartı seç",
+      "card-recharge": "Yükleme Başvurusu",
+      "activate-card": "Kart Aktivasyonu",
+      "select-card": "Bir Kart Seçin",
       "operations": "",
-      "select": "Banka kartı seç",
-      "apply": "Kart başvurusu",
+      "select": "Bir Kart Seçin",
+      "apply": "Kart Başvurusu",
       "authTip": "Lütfen önce kimlik doğrulamayı tamamlayın"
     },
     "mine": {
       "index": "Hesabım",
-      "language": "Dil ayarları",
-      "pay-password": "Şifre değiştir",
+      "language": "Dil Ayarları",
+      "pay-password": "Şifre Değiştir",
       "info": "Kişisel Bilgiler",
-      "improve": "Profili Tamamla"
+      "improve": "Bilgileri Tamamla",
+      "kyc": "KYC Doğrulama",
+      "cog": "Ayarlar",
+      "help": "Sıkça Sorulan Sorular",
+      "help-detail": "Sıkça Sorulan Sorular",
+      "permission": "İzin Yönetimi",
+      "privacy": "Gizlilik Politikası",
+      "clearCache": "Önbelleği Temizle",
+      "currentVersion": "Mevcut Sürüm",
+      "newVersion": "En Son Sürüm",
+      "hasNewVersion": "Yeni sürüm mevcut",
+      "about": "C Pay Hakkında"
     },
     "wallet": {
-      "global-detail": "Sipariş Detayları",
+      "global-detail": "Sipariş Detayı",
       "index": "",
-      "balance": "Bakiye kayıtları",
-      "global-list": "Havale kayıtları",
-      "global-order": "CWG Havale"
+      "balance": "Bakiye Kayıtları",
+      "global-list": "Havale Kayıtları",
+      "global-order": "Global Havale",
+      "withdraw": "Para Çekme",
+      "vaultody": "Yükleme",
+      "withdraw-list": "Para Çekme Kayıtları",
+      "vaultody-list": "Yükleme Kayıtları",
+      "withdraw-detail": "Para Çekme Detayı"
     }
   },
   "tabBar": {
@@ -117,10 +137,53 @@
   },
   "mine": {
     "logout": "Çıkış yap",
-    "p": "Çıkış yapmak istediğinize emin misiniz?",
+    "p": "Çıkış yapmak istediğinizden emin misiniz?",
     "b1": "Çıkış yap",
     "b2": "İptal",
-    "language": "Dil ayarları"
+    "language": "Dil ayarları",
+    "p1": "Konum",
+    "p2": "Konum bilgilerine eriş",
+    "p3": "Konum hakkında",
+    "p4": "Kamera",
+    "p5": "Fotoğraf ve video çek",
+    "p6": "Kamera hakkında",
+    "p7": "Albüm",
+    "p8": "Fotoğraf ve videolara eriş",
+    "p9": "Albüm hakkında",
+    "p10": "Pano",
+    "p11": "Pano içeriğini oku",
+    "p12": "Etkin",
+    "p13": "Ayarlar",
+    "p14": "Not: İlk kullanımda izin gereklidir.",
+    "p15": "C Pays App Gizlilik Politikası",
+    "p16": "Kamera kullanımı",
+    "p17": "Albüm kullanımı",
+    "p18": "Konum kullanımı",
+    "p19": "Önbellek boyutu",
+    "p20": "Önbelleği temizle",
+    "p21": "Başarıyla temizlendi",
+    "p22": "Sürüm güncellemesi",
+    "p23": "Mevcut sürüm çok düşük, lütfen güncelleyin",
+    "p24": "Yeni sürüm bulundu",
+    "p25": "Yeni sürüm {version} bulundu, güncellensin mi?",
+    "p26": "Güncelleme indiriliyor",
+    "p27": "İndirme tamamlandı",
+    "p28": "İndirme başarısız",
+    "p29": "İndiriliyor",
+    "p30": "İndirme tamamlandı, yüklensin mi?",
+    "p31": "Güncelleme yükleniyor",
+    "p32": "Yükleme tamamlandı",
+    "p33": "Yükleme başarısız",
+    "p34": "Yükleniyor",
+    "p35": "Güncelle",
+    "p36": "Atla",
+    "p37": "Güncelleme başarılı",
+    "p38": "Güncelleme tamamlamak için uygulama yeniden başlatılacak",
+    "p39": "İndirmeye devam et",
+    "p40": "İndirme kesildi",
+    "p41": "Ağ sorunu nedeniyle indirme kesildi, devam edilsin mi?",
+    "p42": "Devam et",
+    "p43": "İptal"
   },
   "login": {
     "title": "Giriş yap",
@@ -160,7 +223,7 @@
   "language": {
     "selectLang": "Dil seç",
     "cn": "Basitleştirilmiş Çince",
-    "zh": "Geleneksel Çince",
+    "zhHant": "Geleneksel Çince",
     "en": "English",
     "de": "Deutsch",
     "es": "Español",
@@ -791,7 +854,7 @@
       "item128": "Kar & Zarar",
       "item129": "Hatırlatma: Envanter, önceden belirlenmiş rakamlardan daha düşük olduğunda abonelikler sona erecek ve tüm açık pozisyonlar kapanacaktır.",
       "item130": "Veri Yok ",
-      "item131": "%30'un üzerinde",
+      "item131": "Veri Yok ",
       "item132": "Favorilere Ekle",
       "item133": "Favorilerden Kaldır",
       "item134": "Abonelik, pozisyonların tasfiyesinden sonra yalnızca kullanılabilir.",
@@ -3109,6 +3172,7 @@
       "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:",
+      "s26_1": "PIN Kodunu Onayla:",
       "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.",
@@ -5436,11 +5500,11 @@
         "fieldDescription": "Lütfen gönderenin kimlik veren ülkesini girin"
       },
       "receiverNativeFirstName": {
-        "fieldTitle": "Yerel Ad",
+        "fieldTitle": "Lehtarın Adı (resmi kimlikteki gibi)",
         "fieldDescription": "Lütfen alıcının yerel adını girin"
       },
       "receiverNativeLastName": {
-        "fieldTitle": "Yerel Soyad",
+        "fieldTitle": "Lehtarın Soyadı (resmi kimlikteki gibi)",
         "fieldDescription": "Lütfen alıcının yerel soyadını girin"
       },
       "receiverAccountHolderName": {
@@ -5614,7 +5678,10 @@
     "p4": "Lütfen çekim tutarını girin (USDT)",
     "p5": "(Kullanılabilir bakiye {userBalance} USDT)",
     "p6": "Girilen tutar {userBalance} USDT'yi aşamaz",
-    "p7": "Lütfen geçerli bir sayı girin"
+    "p7": "Lütfen geçerli bir sayı girin",
+    "p8": "Sözleşme Adresi",
+    "p9": "Gönderen Adresi",
+    "p10": "Onay Zamanı"
   },
   "Blockchain1": {
     "title": "Cüzdan Yükleme Kayıtları",

+ 86 - 19
locale/vn.json

@@ -3,6 +3,7 @@
     "confirm": "Xác nhận",
     "cancel": "Hủy",
     "loading": "Đang tải...",
+    "noMore": "Không còn dữ liệu",
     "success": "Thành công",
     "fail": "Thất bại",
     "input": "Vui lòng nhập",
@@ -11,20 +12,23 @@
     "error": "Lỗi hệ thống",
     "copy1": "Đã sao chép số thẻ!",
     "copy2": "Đã sao chép CVV!",
-    "copy3": "Sao chép thất bại"
+    "copy3": "Sao chép thất bại",
+    "year": "Năm",
+    "month": "Tháng",
+    "day": "Ngày"
   },
   "pages": {
     "login": {
       "index": "Đăng nhập",
-      "forget": "Quên",
+      "forget": "Quên mật khẩu",
       "regist": "Đăng ký",
-      "reset": "Quên mật khẩu"
+      "reset": "Đặt lại mật khẩu"
     },
     "apply-record": {
-      "index": "Lịch sử đăng ký thẻ",
-      "detail": "Chi tiết đăng ký thẻ",
-      "list": "Danh sách đăng ký thẻ",
-      "confirmOpen": "Mở liên kết này?",
+      "index": "Lịch sử mở thẻ",
+      "detail": "Chi tiết mở thẻ",
+      "list": "Danh sách mở thẻ",
+      "confirmOpen": "Bạn có muốn mở liên kết này không?",
       "open": "Mở",
       "copyPrompt": "Đã sao chép liên kết, vui lòng mở trong trình duyệt",
       "openFailed": "Không thể mở liên kết"
@@ -41,25 +45,41 @@
       "index": "Thẻ",
       "card-recharge": "Yêu cầu nạp tiền",
       "activate-card": "Kích hoạt thẻ",
-      "select-card": "Chọn thẻ ngân hàng",
+      "select-card": "Chọn thẻ",
       "operations": "",
-      "select": "Chọn thẻ ngân hàng",
-      "apply": "Đăng ký thẻ",
+      "select": "Chọn thẻ",
+      "apply": "Đăng ký mở thẻ",
       "authTip": "Vui lòng hoàn tất xác minh danh tính trước"
     },
     "mine": {
-      "index": "Tài khoản của tôi",
+      "index": "Tôi",
       "language": "Cài đặt ngôn ngữ",
       "pay-password": "Đổi mật khẩu",
       "info": "Thông tin cá nhân",
-      "improve": "Hoàn thiện hồ sơ"
+      "improve": "Hoàn thiện thông tin",
+      "kyc": "Xác minh KYC",
+      "cog": "Cài đặt",
+      "help": "Câu hỏi thường gặp",
+      "help-detail": "Câu hỏi thường gặp",
+      "permission": "Quản lý quyền",
+      "privacy": "Chính sách bảo mật",
+      "clearCache": "Xóa bộ nhớ đệm",
+      "currentVersion": "Phiên bản hiện tại",
+      "newVersion": "Đã là phiên bản mới nhất",
+      "hasNewVersion": "Có phiên bản mới",
+      "about": "Về C Pay"
     },
     "wallet": {
       "global-detail": "Chi tiết đơn hàng",
       "index": "",
       "balance": "Lịch sử số dư",
       "global-list": "Lịch sử chuyển tiền",
-      "global-order": "Chuyển tiền CWG"
+      "global-order": "Chuyển tiền toàn cầu",
+      "withdraw": "Rút tiền",
+      "vaultody": "Nạp tiền",
+      "withdraw-list": "Lịch sử rút tiền",
+      "vaultody-list": "Lịch sử nạp tiền",
+      "withdraw-detail": "Chi tiết rút tiền"
     }
   },
   "tabBar": {
@@ -120,7 +140,50 @@
     "p": "Bạn có chắc chắn muốn đăng xuất không?",
     "b1": "Đăng xuất",
     "b2": "Hủy",
-    "language": "Cài đặt ngôn ngữ"
+    "language": "Cài đặt ngôn ngữ",
+    "p1": "Vị trí",
+    "p2": "Truy cập thông tin vị trí của bạn",
+    "p3": "Về vị trí",
+    "p4": "Máy ảnh",
+    "p5": "Chụp ảnh và quay video",
+    "p6": "Về máy ảnh",
+    "p7": "Album",
+    "p8": "Truy cập ảnh và video",
+    "p9": "Về album",
+    "p10": "Bảng tạm",
+    "p11": "Đọc nội dung bảng tạm",
+    "p12": "Đã bật",
+    "p13": "Đi tới cài đặt",
+    "p14": "Lưu ý: Cần cấp quyền khi sử dụng lần đầu.",
+    "p15": "Chính sách quyền riêng tư C Pays App",
+    "p16": "Sử dụng máy ảnh",
+    "p17": "Sử dụng album",
+    "p18": "Sử dụng thông tin vị trí",
+    "p19": "Dung lượng bộ nhớ đệm",
+    "p20": "Xóa bộ nhớ đệm",
+    "p21": "Xóa thành công",
+    "p22": "Cập nhật phiên bản",
+    "p23": "Phiên bản hiện tại quá thấp, vui lòng cập nhật",
+    "p24": "Phát hiện phiên bản mới",
+    "p25": "Đã phát hiện phiên bản mới {version}, cập nhật không?",
+    "p26": "Đang tải bản cập nhật",
+    "p27": "Tải xuống hoàn tất",
+    "p28": "Tải xuống thất bại",
+    "p29": "Đang tải xuống",
+    "p30": "Tải xuống hoàn tất, cài đặt ngay?",
+    "p31": "Đang cài đặt cập nhật",
+    "p32": "Cài đặt hoàn tất",
+    "p33": "Cài đặt thất bại",
+    "p34": "Đang cài đặt",
+    "p35": "Cập nhật",
+    "p36": "Bỏ qua",
+    "p37": "Cập nhật thành công",
+    "p38": "Ứng dụng sẽ khởi động lại để hoàn tất cập nhật",
+    "p39": "Tiếp tục tải xuống",
+    "p40": "Tải xuống bị gián đoạn",
+    "p41": "Tải xuống bị gián đoạn do sự cố mạng, tiếp tục?",
+    "p42": "Tiếp tục",
+    "p43": "Hủy"
   },
   "login": {
     "title": "Đăng nhập",
@@ -160,7 +223,7 @@
   "language": {
     "selectLang": "Chọn ngôn ngữ",
     "cn": "Tiếng Trung giản thể",
-    "zh": "Tiếng Trung phồn thể",
+    "zhHant": "Tiếng Trung phồn thể",
     "en": "English",
     "de": "Deutsch",
     "es": "Español",
@@ -791,7 +854,7 @@
       "item128": "Lãi lỗ",
       "item129": "Nhắc nhở: Khi giá trị ròng nhỏ hơn số tiền thiết lập sẽ buộc dừng đăng ký và đóng lệnh",
       "item130": "Không có dữ liệu",
-      "item131": "Trên 30%",
+      "item131": "Không có dữ liệu",
       "item132": "Thêm vào yêu thích",
       "item133": "Xóa khỏi yêu thích",
       "item134": "Đăng ký chỉ có sẵn sau khi thanh lý các vị thế.",
@@ -3108,6 +3171,7 @@
       "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:",
+      "s26_1": "Xác nhận 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.",
@@ -5435,11 +5499,11 @@
         "fieldDescription": "Vui lòng nhập quốc gia cấp giấy tờ người gửi"
       },
       "receiverNativeFirstName": {
-        "fieldTitle": "Tên bản địa",
+        "fieldTitle": "Tên của người thụ hưởng (như trên giấy tờ tùy thân)",
         "fieldDescription": "Vui lòng nhập tên bản địa của người nhận"
       },
       "receiverNativeLastName": {
-        "fieldTitle": "Họ bản địa",
+        "fieldTitle": "Họ của người thụ hưởng (như trên giấy tờ tùy thân)",
         "fieldDescription": "Vui lòng nhập họ bản địa của người nhận"
       },
       "receiverAccountHolderName": {
@@ -5613,7 +5677,10 @@
     "p4": "Vui lòng nhập số tiền rút (USDT)",
     "p5": "(Số dư khả dụng {userBalance} USDT)",
     "p6": "Số tiền nhập không được vượt quá {userBalance} USDT",
-    "p7": "Vui lòng nhập số hợp lệ"
+    "p7": "Vui lòng nhập số hợp lệ",
+    "p8": "Địa chỉ Hợp đồng",
+    "p9": "Địa chỉ Người gửi",
+    "p10": "Thời gian Phê duyệt"
   },
   "Blockchain1": {
     "title": "Lịch sử nạp ví",

+ 94 - 27
locale/zhHant.json

@@ -3,6 +3,7 @@
     "confirm": "確認",
     "cancel": "取消",
     "loading": "載入中...",
+    "noMore": "沒有更多了",
     "success": "成功",
     "fail": "失敗",
     "input": "請輸入",
@@ -11,28 +12,31 @@
     "error": "系統錯誤",
     "copy1": "卡號已複製!",
     "copy2": "CVV 已複製!",
-    "copy3": "複製失敗"
+    "copy3": "複製失敗",
+    "year": "年",
+    "month": "月",
+    "day": "日"
   },
   "pages": {
     "login": {
       "index": "登入",
-      "forget": "忘記",
+      "forget": "忘記密碼",
       "regist": "註冊",
-      "reset": "忘記密碼"
+      "reset": "重設密碼"
     },
     "apply-record": {
-      "index": "開卡錄",
+      "index": "開卡錄",
       "detail": "開卡詳情",
-      "list": "開卡錄列表",
-      "confirmOpen": "是否要打開此連結?",
+      "list": "開卡錄列表",
+      "confirmOpen": "是否打開該連結?",
       "open": "打開",
       "copyPrompt": "連結已複製,請在瀏覽器中打開",
       "openFailed": "無法打開連結"
     },
     "recharge-record": {
-      "index": "充值錄",
-      "list": "充值錄列表",
-      "detail": "充值紀錄詳情"
+      "index": "充值錄",
+      "list": "充值錄列表",
+      "detail": "充值詳情"
     },
     "card-transaction-detail": {
       "index": "交易詳情"
@@ -41,25 +45,41 @@
       "index": "卡片",
       "card-recharge": "充值申請",
       "activate-card": "卡片啟用",
-      "select-card": "選擇銀行卡",
-      "operations": "",
-      "select": "選擇銀行卡",
+      "select-card": "選擇一張銀行卡",
+      "operations": "操作",
+      "select": "選擇一張銀行卡",
       "apply": "申請開卡",
-      "authTip": "請先完成身驗證"
+      "authTip": "請先完成身驗證"
     },
     "mine": {
       "index": "我的",
       "language": "語言設定",
-      "pay-password": "修改密碼",
-      "info": "個人信息",
-      "improve": "完善資訊"
+      "pay-password": "修改支付密碼",
+      "info": "個人資料",
+      "improve": "完善資料",
+      "kyc": "KYC 驗證",
+      "cog": "設定",
+      "help": "常見問題",
+      "help-detail": "常見問題",
+      "permission": "權限管理",
+      "privacy": "隱私政策",
+      "clearCache": "清除快取",
+      "currentVersion": "目前版本",
+      "newVersion": "已是最新版本",
+      "hasNewVersion": "有新版本可更新",
+      "about": "關於 C Pay"
     },
     "wallet": {
       "global-detail": "訂單詳情",
-      "index": "",
-      "balance": "錢包餘額紀錄",
-      "global-list": "速匯紀錄",
-      "global-order": "CWG 速匯"
+      "index": "錢包",
+      "balance": "錢包餘額記錄",
+      "global-list": "速匯記錄",
+      "global-order": "全球速匯",
+      "withdraw": "提現",
+      "vaultody": "充值",
+      "withdraw-list": "提現記錄",
+      "vaultody-list": "充值記錄",
+      "withdraw-detail": "提現詳情"
     }
   },
   "tabBar": {
@@ -117,10 +137,53 @@
   },
   "mine": {
     "logout": "登出",
-    "p": "確定要登出嗎?",
+    "p": "確定要登出嗎?",
     "b1": "登出",
     "b2": "取消",
-    "language": "語言設定"
+    "language": "語言設定",
+    "p1": "地理位置",
+    "p2": "取得您的位置資訊",
+    "p3": "關於位置",
+    "p4": "相機",
+    "p5": "拍攝照片與影片",
+    "p6": "關於相機",
+    "p7": "相簿",
+    "p8": "存取您的照片與影片",
+    "p9": "關於相簿",
+    "p10": "剪貼簿",
+    "p11": "讀取剪貼簿內容",
+    "p12": "已開啟",
+    "p13": "前往設定",
+    "p14": "提示:首次使用相關功能需授權。如曾拒絕,可至系統設定重新開啟。",
+    "p15": "C Pays App 隱私政策",
+    "p16": "相機的使用",
+    "p17": "相簿的使用",
+    "p18": "位置資訊的使用",
+    "p19": "快取大小",
+    "p20": "清除快取",
+    "p21": "清除成功",
+    "p22": "版本更新",
+    "p23": "目前版本過低,請立即更新後繼續使用",
+    "p24": "發現新版本",
+    "p25": "發現新版本 {version},是否更新?",
+    "p26": "正在下載更新",
+    "p27": "下載完成",
+    "p28": "下載失敗",
+    "p29": "下載中",
+    "p30": "下載完成,是否安裝?",
+    "p31": "正在安裝更新",
+    "p32": "安裝完成",
+    "p33": "安裝失敗",
+    "p34": "安裝中",
+    "p35": "更新",
+    "p36": "略過",
+    "p37": "更新成功",
+    "p38": "應用程式將重新啟動以完成更新",
+    "p39": "繼續下載",
+    "p40": "下載中斷",
+    "p41": "因網路異常導致下載中斷,是否繼續下載?",
+    "p42": "繼續",
+    "p43": "取消"
   },
   "login": {
     "title": "登入",
@@ -160,7 +223,7 @@
   "language": {
     "selectLang": "選擇語言",
     "cn": "簡體中文",
-    "zh": "繁體中文",
+    "zhHant": "繁體中文",
     "en": "英文",
     "de": "德文",
     "es": "西班牙文",
@@ -794,7 +857,7 @@
       "item128": "盈虧",
       "item129": "提示:當賬戶淨值低於設定的額度將會終止跟單訂閱並強制平倉",
       "item130": "暫無數據",
-      "item131": "30%以上",
+      "item131": "暫無數據",
       "item132": "收藏",
       "item133": "取消收藏",
       "item134": "必須空倉後才能訂閱",
@@ -3090,6 +3153,7 @@
       "s24": "在線激活:",
       "s25": "CWG Markets客戶中心,並進入“啟用卡片”頁面,輸入您的卡號和激活碼(隨卡片提供)。",
       "s26": "設置PIN碼:",
+      "s26_1": "確認PIN碼:",
       "s27": "按照提示設置您的個人識別碼(PIN碼),用於ATM取款和購物支付。",
       "s28": "開始使用:",
       "s29": "激活成功後,您即可開始使用您的Visa借記卡進行消費和取款。",
@@ -5417,11 +5481,11 @@
         "fieldDescription": "請輸入匯款人證件簽發國"
       },
       "receiverNativeFirstName": {
-        "fieldTitle": "收款人的母語名字",
+        "fieldTitle": "收款人姓名(需與身份證一致)",
         "fieldDescription": "請輸入收款人的母語名字"
       },
       "receiverNativeLastName": {
-        "fieldTitle": "收款人的母語姓氏",
+        "fieldTitle": "收款人姓氏(與身份證一致)",
         "fieldDescription": "請輸入收款人的母語姓氏"
       },
       "receiverAccountHolderName": {
@@ -5595,7 +5659,10 @@
     "p4": "請輸入提現金額(USDT)",
     "p5": "(可用餘額 {userBalance} USDT)",
     "p6": "輸入的金額不能超過 {userBalance} USDT",
-    "p7": "請輸入有效數字"
+    "p7": "請輸入有效數字",
+    "p8": "合約地址",
+    "p9": "發送方地址",
+    "p10": "審批時間"
   },
   "Blockchain1": {
     "title": "錢包充值記錄",

+ 4 - 2
main.js

@@ -3,11 +3,12 @@ import App from "./App";
 import uviewPlus from "uview-plus";
 import { createPinia } from "pinia";
 import { messages } from "./locale/index";
+import { interpolateTemplate } from "./locale/utils";
 import vEllipsis from './directives/v-ellipsis'
 import { createI18n } from "vue-i18n";
-
+import { routeInterceptor } from '@/utils/routeInterceptor.js'
 export const i18n = createI18n({
-  legacy: true,
+  legacy: false,
   allowComposition: true,
   locale: uni.getStorageSync("lang") || "cn",
   messages,
@@ -44,6 +45,7 @@ export function createApp() {
   app.use(uviewPlus);
   app.use(pinia);
   app.use(i18n);
+  // routeInterceptor.install()
   return {
     app,
   };

+ 8 - 1
manifest.json

@@ -2,7 +2,7 @@
     "name" : "C Pays",
     "appid" : "__UNI__60A9455",
     "description" : "应用描述",
-    "versionName" : "1.0.3",
+    "versionName" : "1.0.5",
     "versionCode" : 2,
     "transformPx" : false,
     "app-plus" : {
@@ -17,6 +17,13 @@
             "autoclose" : true,
             "delay" : 0
         },
+        "webview" : {
+            "allow-intent" : true,
+            "allow-cross-origin" : true,
+            "urlschemes" : [ "https://secure.livechatinc.com" ],
+            "disable-web-security" : true
+        },
+        "loglevel" : "debug",
         "modules" : {
             "OAuth" : {},
             "Payment" : {},

+ 11 - 2
pages.json

@@ -10,12 +10,20 @@
 	},
 	"pages": [
 		{
-			"path": "pages/card/index",
+			"path": "pages/launch/index",
 			"style": {
 				"navigationBarTitleText": "",
 				"navigationStyle": "custom"
 			}
 		},
+		{
+			"path": "pages/card/index",
+			"style": {
+				"navigationBarTitleText": "",
+				"navigationStyle": "custom",
+				"enablePullDownRefresh": true
+			}
+		},
 		{
 			"path": "pages/card/operations",
 			"style": {
@@ -175,7 +183,8 @@
 			"path": "pages/wallet/global-order",
 			"style": {
 				"navigationBarTitleText": "",
-				"navigationStyle": "custom"
+				"navigationStyle": "custom",
+				"softinputMode": "adjustResize"
 			}
 		},
 		{

+ 1 - 1
pages/apply-record/components/ApplyRecord.vue

@@ -761,7 +761,7 @@ function handleQrClick(url) {
   width: px2rpx(8);
   height: px2rpx(8);
   border-radius: 50%;
-  background: var(--action-bg);
+  background: var(--gray);
   cursor: pointer;
   transition: all 0.3s ease;
 

+ 2 - 1
pages/card/components/CardHandle.vue

@@ -49,6 +49,7 @@ import { useI18n } from "vue-i18n";
 import { ucardApi } from "@/api/ucard";
 import errorIcon from "/static/images/error.png";
 import copyIcon from "/static/images/success.png";
+import ls from "@/utils/store2";
 const { t } = useI18n();
 const props = defineProps<{
   dialogInfoTradingAdd: boolean;
@@ -116,7 +117,7 @@ function initForm() {
 
 // 初始化定时器
 function initTimer() {
-  const savedTimer = Number(localStorage.getItem("cvvTimer")) || 59;
+  const savedTimer = Number(ls.get("cvvTimer")) || 59;
   if (savedTimer === 59) {
     getCodeString.value = t("newSignup.item11");
   } else {

+ 2 - 2
pages/card/components/VirtualCard.vue

@@ -222,7 +222,7 @@ const images = import.meta.glob("/static/images/currency/*.png", {
 });
 const tabList = ref([
   { name: t("cards.rechargeB1") },
-  { name: t("cards.transferB2") }
+  { name: t("Shop.Index.Transaction") }
 ]);
 
 const handleTabClick = (item, index) => {
@@ -1005,7 +1005,7 @@ onUnmounted(() => {
   width: px2rpx(8);
   height: px2rpx(8);
   border-radius: 50%;
-  background: var(--action-bg);
+  background: var(--gray);
   cursor: pointer;
   transition: all 0.3s ease;
 

+ 15 - 1
pages/card/index.vue

@@ -4,7 +4,11 @@
       <view v-if="typesList.length > 0 && cardList.length > 0" class="add-apply" @click="addApply">{{ t("cards.p10") }}
       </view>
       <FirstApply v-if="cardList.length == 0" />
-      <VirtualCard v-else />
+      <cwg-page-more-wrapper ref="loadMoreWrapperRef" v-else :loading="loading" :finished="finished"
+        :refresher-enabled="true" @refresh="handleRefresh">
+        <VirtualCard />
+      </cwg-page-more-wrapper>
+
     </view>
   </cwg-page-wrapper>
 </template>
@@ -124,7 +128,17 @@ async function mergeLists(list1, list2) {
 function addApply() {
   router.push("/select/card");
 }
+const loadMoreWrapperRef = ref<any>(null);
+const loading = ref(false);
+const finished = ref(false);
 
+const handleRefresh = async () => {
+  await applyList();
+  // 停止下拉刷新动画
+  if (loadMoreWrapperRef.value) {
+    loadMoreWrapperRef.value.stopRefresh();
+  }
+};
 onMounted(() => {
   // 1. 先用本地缓存的卡列表快速渲染,提升首屏速度
   const cachedCards = (cardStore.userCard as any) || [];

+ 120 - 49
pages/card/operations.vue

@@ -7,24 +7,24 @@
     </cwg-header>
 
     <view class="page page-shadow">
-      <u-form ref="formRef" class="kyc-form">
+      <u-form ref="formRef" :rules="rules" :model="infoForm" class="kyc-form">
         <template v-if="type == '1'">
           <cwg-input v-model:value="infoForm.cardNumber1" fkey="cardNumber1" :required="true"
-            :label="`${t('card.Form.f24')}:`" :rules="rules.cardNumber1" @change="handleChange" />
+            :label="`${t('card.Form.f24')}:`" rulesKey="cardNumber1" @change="handleChange" />
           <cwg-input v-model:value="infoForm.activeCode" fkey="activeCode" :required="true"
-            :label="`${t('card.Form.f26')}:`" :rules="rules.activeCode" @change="handleChange" />
+            :label="`${t('card.Form.f26')}:`" rulesKey="activeCode" @change="handleChange" />
           <cwg-input v-model:value="infoForm.pin" fkey="pin" :required="true" :maxlength="6" :label="t('card.Info.s26')"
-            :rules="rules.pin" @change="handleChange" />
+            rulesKey="pin" @change="handleChange" />
           <cwg-input v-model:value="infoForm.password" fkey="password" :required="true" :maxlength="6"
-            :label="`${t('card.Btn.Confirm')}:`" :rules="rules.password" @change="handleChange" />
+            :label="`${t('card.Info.s26_1')}`" rulesKey="password" @change="handleChange" />
           <view class="pwd">
-            <view calss="lis" v-t="'card.vaildate.v32'" :class="{ fit: rule1 }"></view>
-            <view calss="lis" v-t="'card.vaildate.v33'" :class="{ fit: rule2 }"></view>
+            <view class="lis" v-t="'card.vaildate.v32'" :class="{ fit: rule1 }"></view>
+            <view class="lis" v-t="'card.vaildate.v33'" :class="{ fit: rule2 }"></view>
           </view>
         </template>
         <template v-if="type == '2'">
           <cwg-input v-model:value="infoForm.cardNumber1" fkey="cardNumber1" :required="true"
-            :label="`${t('card.Form.f24')}:`" :rules="rules.cardNumber1" @change="handleChange" />
+            :label="`${t('card.Form.f24')}:`" rulesKey="cardNumber1" @change="handleChange" />
           <cwg-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">
@@ -49,20 +49,20 @@
         </template>
         <template v-if="type == '3'">
           <cwg-input v-model:value="infoForm.cardNumber1" fkey="cardNumber1" :required="true"
-            :label="`${t('card.Form.f24')}:`" :rules="rules.cardNumber1" @change="handleChange" />
+            :label="`${t('card.Form.f24')}:`" rulesKey="cardNumber1" @change="handleChange" />
           <cwg-input v-model:value="infoForm.pin" fkey="pin" :required="true" :label="t('card.Info.s26')" :maxlength="6"
-            :rules="rules.pin" @change="handleChange" />
+            rulesKey="pin" @change="handleChange" />
           <cwg-input v-model:value="infoForm.password" fkey="password" :required="true" :maxlength="6"
-            :label="`${t('card.Btn.Confirm')}:`" :rules="rules.password" @change="handleChange" />
+            :label="`${t('card.Info.s26_1')}`" rulesKey="password" @change="handleChange" />
 
           <view class="pwd">
-            <view calss="lis" v-t="'card.vaildate.v32'" :class="{ fit: rule1 }"></view>
-            <view calss="lis" v-t="'card.vaildate.v33'" :class="{ fit: rule2 }"></view>
+            <view class="lis" v-t="'card.vaildate.v32'" :class="{ fit: rule1 }"></view>
+            <view class="lis" v-t="'card.vaildate.v33'" :class="{ fit: rule2 }"></view>
           </view>
         </template>
         <template v-if="type == '4' || type == '5'">
           <cwg-input v-model:value="infoForm.cardNumber1" fkey="cardNumber1" :required="true"
-            :label="`${t('card.Form.f24')}:`" :rules="rules.cardNumber1" @change="handleChange" />
+            :label="`${t('card.Form.f24')}:`" rulesKey="cardNumber1" @change="handleChange" />
           <cwg-input v-model:value="infoForm.clientRemark" fkey="clientRemark" :label="`${t('card.Form.f27')}:`"
             @change="handleChange" />
         </template>
@@ -70,17 +70,20 @@
         <view v-if="infoForm.authStatus != 1" class="fixed-btn">
           <view class="cwg-button">
             <u-button type="primary" block @click="infoSubmit">{{
-              t("card.Btn.Submit")
+              t(btn[type])
               }}</u-button>
           </view>
         </view>
       </u-form>
     </view>
+    <cwg-SuccessPrompt v-model:show="showSuccessPrompt" :title="t(title[type])" :desc="t('card.Msg.m2')"
+      :btn-click="btnClick" />
   </cwg-page-wrapper>
 </template>
 
 <script setup lang="ts">
 
+
 import { ref, onMounted, watch, computed } from "vue";
 import { showToast } from "@/utils/toast";
 import { useI18n } from "vue-i18n";
@@ -88,10 +91,11 @@ import useRouter from "@/hooks/useRouter";
 import { onLoad } from '@dcloudio/uni-app'
 import { ucardApi } from "@/api/ucard";
 import config from "@/config";
+import { Validators } from "@/utils/validators";
 const { t } = useI18n();
 const router = useRouter();
 const form = ref({});
-const formRef = ref();
+const formRef = ref(null);
 const infoForm = ref({
   password: undefined,
   cardNumber1: undefined,
@@ -108,12 +112,23 @@ const title = ref({
   4: t('card.Btn.b5'),
   5: t('card.Btn.b6')
 })
+const btn = ref({
+  1: t('card.Btn.Activate'),
+  2: t('card.Btn.Recharge'),
+  3: t('card.Btn.Submit'),
+  4: t('card.Btn.Freeze'),
+  5: t('card.Btn.Unfreeze')
+})
 const type = ref()
 const id = ref()
 onLoad((options) => {
   id.value = options.id
   type.value = options.type
 })
+const showSuccessPrompt = ref(false);
+const btnClick = () => {
+  router.push('/pages/card/index');
+};
 // 动态限制
 const exchangeRate = ref(0);
 const rechargeMinQuota = ref(0);
@@ -121,14 +136,62 @@ const rechargeMaxQuota = ref(0);
 const rechargeFixedFee = ref(0);
 const userBalance = ref(0);
 const pictLoading = ref(false);
+function validatePin(s) {
+  if (!/^\d{6}$/.test(s)) return false;
+  if (/(.)\1\1/.test(s)) return false;
+  const isSequential = (str) => {
+    let inc = true;
+    let dec = true;
+    for (let i = 1; i < str.length; i++) {
+      if (str[i] - str[i - 1] !== 1) inc = false;
+      if (str[i - 1] - str[i] !== 1) dec = false;
+    }
+    return inc || dec;
+  };
+  if (isSequential(s)) return false;
+  if (/^(\d{2})\1\1$/.test(s)) return false;
+  if (/^(\d{3})\1$/.test(s)) return false;
+  return true;
+}
+
+function validatePina(a: any, b?: any, c?: any) {
+  if (typeof c === "function") {
+    const value = b;
+    const callback = c;
+    const val = String(value ?? "").trim();
+    if (validatePin(val)) {
+      return callback();
+    } else {
+      return callback(new Error(t("card.vaildate.v23")));
+    }
+  }
+
+}
+function validatePassword(a: any, b?: any, c?: any) {
+  if (typeof c === "function") {
+    const value = b;
+    const callback = c;
+    const val = String(value ?? "").trim();
+    if (validatePin(val)) {
+      if (formData.value.pin != formData.value.password) {
+        callback(new Error(t("vaildate.password.same")));
+        return;
+      } else {
+        return callback();
+      }
+    } else {
+      callback(new Error(t("vaildate.password.same")));
+    }
+  }
+}
 const rules = {
   pin: [
-    { required: true, message: t("card.vaildate.v23") },
-    { pattern: config.Pattern.Pin, message: t("card.vaildate.v23") },
+    Validators.required(t("card.vaildate.v23")),
+    Validators.custom(validatePina),
   ],
   password: [
-    { required: true, message: t("card.vaildate.v31") },
-    { pattern: config.Pattern.Pin, message: t("card.vaildate.v31") },
+    Validators.required(t("card.vaildate.v31")),
+    Validators.custom(validatePassword)
   ],
   cardNumber1: [
     {
@@ -186,15 +249,6 @@ const fee = computed(() => {
 function goRechargeRecord() {
   router.push(`/pages/recharge-record/list?cardNo=${formData.value?.cardNo}`);
 }
-// 根据 type 自动取标题
-const headerTitle = computed(() => {
-  const key = Number(type.value);
-  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;
@@ -211,30 +265,36 @@ async function infoSubmit() {
     showToast(t("card.vaildate.v22"));
     return;
   }
+  if (pictLoading.value) {
+    return
+  }
+  pictLoading.value = true;
   try {
     switch (type.value) {
       case "1":
-        await formRef.value?.validate(["cardNumber1", "pin", "activeCode"]);
+        await formRef.value?.validate();
         ucardActivate();
         break;
       case "2":
-        await formRef.value?.validate(["cardNumber1", "amount"]);
+        await formRef.value?.validate();
         ucardRecharge();
         break;
       case "3":
-        await formRef.value?.validate(["cardNumber1", "pin"]);
+        await formRef.value?.validate();
         ucardResetPassword();
         break;
       case "4":
-        await formRef.value?.validate(["cardNumber1"]);
+        await formRef.value?.validate();
         ucardFreeze();
         break;
       case "5":
-        await formRef.value?.validate(["cardNumber1"]);
+        await formRef.value?.validate();
         ucardUnfreeze();
         break;
     }
-  } catch (error) { }
+  } catch (error) {
+    pictLoading.value = false;
+  }
 }
 function backActivity() {
   setTimeout(() => {
@@ -253,12 +313,9 @@ async function ucardActivate() {
   } else {
     showToast(res.msg);
   }
+  pictLoading.value = false;
 }
 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"));
@@ -266,6 +323,7 @@ async function ucardResetPassword() {
   } else {
     showToast(res.msg);
   }
+  pictLoading.value = false;
 }
 async function ucardFreeze() {
   const res = await ucardApi.ucardFreeze(formData.value);
@@ -275,6 +333,7 @@ async function ucardFreeze() {
   } else {
     showToast(res.msg);
   }
+  pictLoading.value = false;
 }
 async function ucardUnfreeze() {
   const res = await ucardApi.ucardUnfreeze(formData.value);
@@ -284,6 +343,7 @@ async function ucardUnfreeze() {
   } else {
     showToast(res.msg);
   }
+  pictLoading.value = false;
 }
 async function getCardInfo() {
   try {
@@ -341,20 +401,15 @@ async function walletBalance() {
 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);
+      // showToast(t("card.Msg.m2"));
+      showSuccessPrompt.value = true;
     } else {
       showToast(res.msg);
     }
@@ -401,15 +456,31 @@ function handleChange(value: any) {
 .pwd {
   line-height: px2rpx(20);
 
-  li {
+  .lis {
     list-style-type: disc;
     line-height: 1.2;
-    margin: px2rpx(4) 0 px2rpx(4) px2rpx(20);
+    margin: px2rpx(4) 0 px2rpx(4) px2rpx(10);
     color: #c0c4cc;
+    position: relative;
+
+    &::after {
+      content: '';
+      position: absolute;
+      left: px2rpx(-6);
+      top: px2rpx(6);
+      width: px2rpx(4);
+      height: px2rpx(4);
+      border-radius: 50%;
+      background: #c0c4cc;
+    }
   }
 
   .fit {
-    color: #009deb;
+    color: var(--main-yellow);
+
+    &::after {
+      background: var(--main-yellow);
+    }
   }
 }
 

+ 1 - 1
pages/card/select.vue

@@ -265,7 +265,7 @@ onMounted(() => {
     width: px2rpx(9);
     height: px2rpx(9);
     border-radius: 50%;
-    background: #ccc;
+    background: var(--gray);
     transition: all 0.3s ease;
 
     &.active {

+ 15 - 0
pages/launch/index.vue

@@ -0,0 +1,15 @@
+<script setup>
+import { onLoad } from '@dcloudio/uni-app'
+import { userToken } from '@/composables/config'
+onLoad(() => {
+    if (!userToken.value) {
+        uni.reLaunch({
+            url: '/pages/login/index'
+        })
+    } else {
+        uni.reLaunch({
+            url: '/pages/card/index'
+        })
+    }
+})
+</script>

+ 18 - 1
pages/mine/cog.vue

@@ -44,7 +44,7 @@
                 <view class="group-item">
                     <cwg-icon color="#000" icon="qchc" />
                     <text class="item-text">{{ t('pages.mine.clearCache') }}</text>
-                    <text class="version item-text">{{ a }}</text>
+                    <text class="version item-text" @click="clearCache">{{ b || a }}</text>
                     <cwg-icon color="#817f7f" icon="chevron-right" />
                 </view>
             </view>
@@ -109,6 +109,7 @@ const { checkUpdate } = useAppUpdate()
 const { t } = useI18n();
 const userStore = useUserStore();
 const router = useRouter();
+const b = ref('')
 const a = computed(() => {
     try {
         const res = uni.getStorageInfoSync();
@@ -135,6 +136,22 @@ async function handleLogout(action: string) {
     }
     showLogoutPopup.value = false;
 }
+
+const clearCache = () => {
+    uni.showModal({
+        title: t('pages.mine.clearCache'),
+        cancelText: t('common.cancel'),
+        confirmText: t('common.confirm'),
+        content: t('mine.p19') + a.value,
+        success: async (e) => {
+            if (e.confirm) {
+                b.value = '0 MB';
+            } else {
+                b.value = '';
+            }
+        }
+    });
+};
 </script>
 
 <style scoped lang="scss">

+ 1 - 1
pages/mine/components/VerificationRow.vue

@@ -262,7 +262,7 @@ const statusClass = computed(() => {
 }
 
 .id-card-image {
-    width: px2rpx(100);
+    width: px2rpx(80);
     height: px2rpx(60);
     border-radius: px2rpx(4);
     overflow: hidden;

+ 17 - 3
pages/mine/index.vue

@@ -34,13 +34,13 @@
 				</view>
 				<view class="group-item" @click="router.push('/pages/wallet/vaultody-list')">
 					<cwg-icon color="#000" icon="qbye" />
-					<text class="item-text">钱包充值记录</text>
+					<text class="item-text">{{ t("pages.wallet.vaultody-list") }}</text>
 					<text class="version item-text"></text>
 					<cwg-icon color="#000" icon="chevron-right" />
 				</view>
 				<view class="group-item" @click="router.push('/pages/wallet/withdraw-list')">
 					<cwg-icon color="#000" icon="qbye" />
-					<text class="item-text">钱包提现记录</text>
+					<text class="item-text">{{ t("pages.wallet.withdraw-list") }}</text>
 					<text class="version item-text"></text>
 					<cwg-icon color="#000" icon="chevron-right" />
 				</view>
@@ -63,10 +63,11 @@
 </template>
 
 <script setup lang="ts">
-import { ref, computed } from "vue";
+import { ref, computed, onMounted } from "vue";
 import { useI18n } from "vue-i18n";
 import useRouter from "@/hooks/useRouter";
 import useUserStore from "@/stores/use-user-store";
+import { ucardApi } from "@/api/ucard";
 const { t } = useI18n();
 const userStore = useUserStore();
 const router = useRouter();
@@ -87,6 +88,19 @@ function openProfile() {
 		router.push('/pages/mine/improve');
 	}
 }
+async function getUserInfo() {
+	try {
+		const res = await ucardApi.getSingle();
+		userStore.saveUserInfo(res.data);
+	} catch (error) {
+		console.log(error, 111);
+	}
+}
+onMounted(() => {
+	if (!userInfo.value?.id) {
+		getUserInfo();
+	}
+});
 </script>
 
 <style scoped lang="scss">

+ 19 - 10
pages/recharge-record/components/DeductionList.vue

@@ -37,7 +37,7 @@
         </view>
       </view>
     </view>
-    <cwg-empty-state v-else :text="t('empty-state.c2')" />
+    <cwg-empty-state v-else />
   </cwg-load-more-wrapper>
 </template>
 
@@ -167,8 +167,24 @@ const fetchRecords = async (isLoadMore = false) => {
       cardNo: props.cardNo,
       type: props.typeIndex || undefined,
       status: props.statusIndex || undefined,
-      beginDate: props.dateFilter ? dayjs(props.dateFilter).format('YYYY-MM-DD') : undefined,
-      endDate: props.dateFilter ? dayjs(props.dateFilter).format('YYYY-MM-DD') : undefined,
+      beginDate: props.dateFilter,
+      endDate: (() => {
+        // 兼容时间戳和日期字符串
+        if (!props.dateFilter) return props.dateFilter;
+        let date = props.dateFilter;
+        if (/^\d+$/.test(String(date))) {
+          // 时间戳
+          return Number(date) + 24 * 60 * 60 * 1000;
+        } else {
+          // 日期字符串
+          const d = new Date(date);
+          if (!isNaN(d.getTime())) {
+            d.setDate(d.getDate() + 1);
+            return d.toISOString().slice(0, 10);
+          }
+          return date;
+        }
+      })(),
       page: { current: page.value, row: pageSize },
     });
     const data = res.code === 200 && Array.isArray(res.data) ? res.data : [];
@@ -348,13 +364,6 @@ defineExpose({
   color: #111827;
 }
 
-.status-badge {
-  display: flex;
-  align-items: center;
-  gap: px2rpx(4);
-  padding: px2rpx(3) px2rpx(2);
-  border-radius: px2rpx(12);
-}
 
 .status-success {
   background-color: #f0fdf4;

+ 7 - 13
pages/recharge-record/components/RechargeList.vue

@@ -22,15 +22,15 @@
                   </text>
                 </view>
               </view>
-              <text class="record-detail">{{ t('global.GlobalOrder.cardNo') }}:{{ record.cardNumber || record.remark ||
+              <text class="record-detail">{{ record.cardNumber || record.remark ||
                 '--' }}</text>
             </view>
           </view>
 
           <view class="record-right">
             <text class="amount-recharge">+{{ Number(record.amount || 0).toFixed(2) }} {{ record.currency || 'USD'
-            }}</text>
-            <text class="fee-text">{{ t('global.GlobalOrder.fee') }} {{ Number(record.fee || 0).toFixed(2) }}</text>
+              }}</text>
+            <text class="fee-text">{{ t('global.p17') }} {{ Number(record.rechargeFee || 0).toFixed(2) }}</text>
           </view>
         </view>
         <view class="record-footer">
@@ -45,7 +45,7 @@
         </view>
       </view>
     </view>
-    <cwg-empty-state v-else :text="t('empty-state.c2')" />
+    <cwg-empty-state v-else />
   </cwg-load-more-wrapper>
 </template>
 
@@ -71,6 +71,8 @@ interface RecordItem extends TransactionInfo {
   cardNumber?: string;
   time?: string;
   rechargeType?: string;
+  rechargeFee?: number;
+  amount?: number;
 }
 
 
@@ -231,7 +233,7 @@ const fetchRecords = async (isLoadMore = false) => {
 
 const goToRechargeDetail = (record: RecordItem) => {
   const amount = Number(record.amount || 0);
-  const fee = Number(record.fee || 0);
+  const fee = Number(record.rechargeFee || 0);
   const normalizedStatus = normalizeStatus(record.status);
 
   const detailPayload = {
@@ -389,14 +391,6 @@ defineExpose({
   color: #111827;
 }
 
-.status-badge {
-  display: flex;
-  align-items: center;
-  gap: px2rpx(4);
-  padding: px2rpx(3) px2rpx(2);
-  border-radius: px2rpx(12);
-}
-
 .status-success {
   background-color: #f0fdf4;
 }

+ 1 - 9
pages/recharge-record/components/TransactionList.vue

@@ -45,7 +45,7 @@
         </view>
       </view>
     </view>
-    <cwg-empty-state v-else :text="t('empty-state.c2')" />
+    <cwg-empty-state v-else />
   </cwg-load-more-wrapper>
 </template>
 
@@ -410,14 +410,6 @@ defineExpose({
   color: #111827;
 }
 
-.status-badge {
-  display: flex;
-  align-items: center;
-  gap: px2rpx(4);
-  padding: px2rpx(3) px2rpx(2);
-  border-radius: px2rpx(12);
-}
-
 .status-success {
   background-color: #f0fdf4;
 }

+ 2 - 2
pages/recharge-record/detail.vue

@@ -6,7 +6,7 @@
           <view class="success-icon-wrapper">
             <image v-if="orderDetail.orderStatus === 'success'" src="/static/images/vector.png" alt=""
               mode="widthFix" />
-            <image v-else-if="orderDetail.orderStatus === 'fail'" src="/static/images/vector2.png" alt=""
+            <image v-else-if="orderDetail.orderStatus === 'failed'" src="/static/images/vector2.png" alt=""
               mode="widthFix" />
             <image v-else src="/static/images/vector3.png" alt="" mode="widthFix" />
           </view>
@@ -204,7 +204,7 @@ const getApproveDesc = () => {
   if (!d) return
   const c = userStore.reasonsOptions
   const a = c[d || '']
-  const b = locale.value == 'cn' || locale.value == 'zh' ? a.content : a.enContent
+  const b = locale.value == 'cn' || locale.value == 'zhHant' ? a.content : a.enContent
   if (!b) {
     reasonsRefusalList()
   }

+ 7 - 2
pages/recharge-record/list.vue

@@ -21,7 +21,7 @@
         <view :class="['tab-item', { 'tab-active': activeTab === 'deduction' }]" @click="activeTab = 'deduction'">
           <cwg-icon class="icons" name="trending-down" :size="18"
             :color="activeTab === 'deduction' ? '#ea002a' : '#9ca3af'" />
-          <view :class="['tab-text', { 'tab-text-active': activeTab === 'deduction' }]">{{ t('card.Status.t26') }}
+          <view :class="['tab-text', { 'tab-text-active': activeTab === 'deduction' }]">{{ t('card.tab20') }}
           </view>
           <view v-if="activeTab === 'deduction'" class="tab-indicator" />
         </view>
@@ -68,7 +68,7 @@
 
         <!-- Deduction Records -->
         <DeductionList v-if="activeTab === 'deduction'" ref="deductionListRef" :cardNo="cardNo"
-          :typeIndex="currentTypeIndex" :statusIndex="statusFilterIndex" :dateFilter="dateFilter"
+          :typeIndex="currentTypeIndex" :statusIndex="statusFilterIndex" :dateFilter="dateFilter1"
           :typeOptions="currentTypeOptions" />
       </view>
     </view>
@@ -121,6 +121,7 @@ console.log(statusOptions, 1212);
 const currentTypeIndex = ref();
 const statusFilterIndex = ref();
 const dateFilter = ref('');
+const dateFilter1 = ref('');
 const pageTitle = computed(() => {
   if (activeTab.value === 'recharge') {
     return t('card.tab7'); // 充值记录
@@ -132,6 +133,9 @@ const pageTitle = computed(() => {
 });
 const show = ref(false)
 const onDateConfirm = (e: any) => {
+  if (activeTab.value == 'deduction') {
+    dateFilter1.value = e.value;
+  }
   dateFilter.value = e.formatted;
 };
 function open() {
@@ -141,6 +145,7 @@ const resetFilters = () => {
   currentTypeIndex.value = undefined;
   statusFilterIndex.value = undefined;
   dateFilter.value = '';
+  dateFilter1.value = '';
 };
 
 

+ 2 - 7
pages/wallet/balance.vue

@@ -10,12 +10,7 @@
                                     <view class="g-l">
                                         <view class="g-item">
                                             <view class="label a1 ellipsis">
-                                                <text v-if="item.type == '1'" v-t="'card.Status.t16'"></text>
-                                                <text v-if="item.type == '2'" v-t="'card.Status.t17'"></text>
-                                                <text v-if="item.type == '3'" v-t="'card.Status.t18'"></text>
-                                                <text v-if="item.type == '4'" v-t="'card.Status.t19'"></text>
-                                                <text v-if="item.type == '5'" v-t="'card.Status.t20'"></text>
-                                                <text v-if="item.type == '6'" v-t="'card.Status.t21'"></text>
+                                                <text> {{ t(walletBalanceTypeMap[item.type]) }}</text>
                                             </view>
                                             <view class="status" :class="statusClass1(item.status)">
                                                 <text v-if="item.status == '2'" v-t="'card.Status.t1'"></text>
@@ -55,7 +50,7 @@ import { onLoad } from '@dcloudio/uni-app'
 import useRouter from "@/hooks/useRouter";
 import { useI18n } from "vue-i18n";
 import { ucardApi } from "@/api/ucard";
-
+import { walletBalanceTypeMap } from '@/utils/dataMap';
 const { t } = useI18n();
 const router = useRouter();
 onLoad((options) => {

+ 1 - 6
pages/wallet/components/DynamicForm.vue

@@ -129,8 +129,6 @@ watch(
   form,
   (val) => {
     Object.assign(props.globalForm, val);
-    console.log(val, 22222);
-
   },
   { deep: true, immediate: true }
 );
@@ -257,9 +255,7 @@ const groupedFields = computed(() => {
 
 
 
-const clearFieldValidate = (e, field) => {
-  console.log(e, field, 212121);
-
+const clearFieldValidate = (field) => {
   nextTick(() => {
     if (formRef.value && formRef.value.validateField) {
       formRef.value.validateField(field.fieldName);
@@ -267,7 +263,6 @@ const clearFieldValidate = (e, field) => {
   });
 };
 const change11 = (e) => {
-  console.log(e, 212121);
   return
 
   nextTick(() => {

+ 3 - 4
pages/wallet/components/GlobalList.vue

@@ -2,8 +2,7 @@
     <cwg-load-more-wrapper ref="loadMoreWrapperRef" :loading="loading" :finished="finished" :height='54'
         :refresher-enabled="true" @reach-bottom="loadMore" @refresh="handleRefresh">
         <view v-if="records.length > 0" class="records-list">
-            <view v-for="record in records" :key="record.id" class="record-card"
-                @click="goToDeductionDetail(record)">
+            <view v-for="record in records" :key="record.id" class="record-card" @click="goToDeductionDetail(record)">
                 <view class="record-main">
                     <view class="record-left">
                         <view class="type-icon deduction-icon">
@@ -69,7 +68,7 @@
                 </view>
             </view>
         </view>
-        <cwg-empty-state v-else :text="t('empty-state.c2')" />
+        <cwg-empty-state v-else />
     </cwg-load-more-wrapper>
 </template>
 
@@ -226,7 +225,7 @@ const fetchRecords = async (isLoadMore = false) => {
             cardNo: props.cardNo,
             payoutCurrency: props.payoutCurrency,
             status: props.statusIndex == 0 ? undefined : props.statusIndex,
-            beginDate: props.dateFilter ? dayjs(props.dateFilter).format('YYYY-MM-DD') : undefined,
+            startDate: props.dateFilter ? dayjs(props.dateFilter).format('YYYY-MM-DD') : undefined,
             endDate: props.dateFilter ? dayjs(props.dateFilter).format('YYYY-MM-DD') : undefined,
             page: { current: page.value, row: pageSize },
         });

+ 4 - 4
pages/wallet/components/VaultodyList.vue

@@ -2,7 +2,7 @@
     <cwg-load-more-wrapper ref="loadMoreWrapperRef" :loading="loading" :finished="finished" :height='54'
         :refresher-enabled="true" @reach-bottom="loadMore" @refresh="handleRefresh">
         <view v-if="records.length > 0" class="records-list">
-            <view v-for="record in records" :key="record.id" class="record-card" @click="goToDeductionDetail(record)">
+            <view v-for="record in records" :key="record.id" class="record-card">
                 <view class="record-main">
                     <view class="record-left">
                         <view class="type-icon deduction-icon">
@@ -50,7 +50,7 @@
                 </view>
             </view>
         </view>
-        <cwg-empty-state v-else :text="t('empty-state.c2')" />
+        <cwg-empty-state v-else />
     </cwg-load-more-wrapper>
 </template>
 
@@ -205,7 +205,7 @@ const fetchRecords = async (isLoadMore = false) => {
             cardNo: props.cardNo,
             payoutCurrency: props.payoutCurrency,
             status: props.statusIndex == 0 ? undefined : props.statusIndex,
-            beginDate: props.dateFilter ? dayjs(props.dateFilter).format('YYYY-MM-DD') : undefined,
+            startDate: props.dateFilter ? dayjs(props.dateFilter).format('YYYY-MM-DD') : undefined,
             endDate: props.dateFilter ? dayjs(props.dateFilter).format('YYYY-MM-DD') : undefined,
             page: { current: page.value, row: pageSize },
         });
@@ -317,7 +317,7 @@ defineExpose({
 
 .record-main {
     display: flex;
-    align-items: flex-start;
+    align-items: center;
     justify-content: space-between;
     padding-bottom: px2rpx(16);
 }

+ 3 - 8
pages/wallet/components/WithdrawList.vue

@@ -44,7 +44,7 @@
                 </view>
             </view>
         </view>
-        <cwg-empty-state v-else :text="t('empty-state.c2')" />
+        <cwg-empty-state v-else />
     </cwg-load-more-wrapper>
 </template>
 
@@ -175,7 +175,7 @@ const getDatePart = (time?: string | number): string => {
 
 const formatOrderNo = (orderNo?: string) => {
     if (!orderNo) return '--';
-    if (orderNo.length <= 20) return orderNo;
+    if (orderNo.length <= 16) return orderNo;
     return orderNo.slice(0, 6) + '...' + orderNo.slice(-4);
 };
 
@@ -200,7 +200,7 @@ const fetchRecords = async (isLoadMore = false) => {
             cardNo: props.cardNo,
             payoutCurrency: props.payoutCurrency,
             transactionStatus: props.statusIndex == 0 ? undefined : props.statusIndex,
-            beginDate: props.dateFilter ? dayjs(props.dateFilter).format('YYYY-MM-DD') : undefined,
+            startDate: props.dateFilter ? dayjs(props.dateFilter).format('YYYY-MM-DD') : undefined,
             endDate: props.dateFilter ? dayjs(props.dateFilter).format('YYYY-MM-DD') : undefined,
             page: { current: page.value, row: pageSize },
         });
@@ -211,17 +211,12 @@ const fetchRecords = async (isLoadMore = false) => {
         } else {
             records.value = data;
         }
-        console.log(records.value, 1112212);
-
-
         if (data.length < pageSize) {
             finished.value = true;
         } else {
             finished.value = false;
         }
     } catch (error: any) {
-        console.log(error, 11111);
-
         if (!isLoadMore) {
             records.value = [];
         }

+ 1 - 1
pages/wallet/global-detail.vue

@@ -124,7 +124,7 @@ const getApproveDesc = () => {
   if (!d) return
   const c = userStore.reasonsOptions
   const a = c[d || '']
-  const b = locale.value == 'cn' || locale.value == 'zh' ? a.content : a.enContent
+  const b = locale.value == 'cn' || locale.value == 'zhHant' ? a.content : a.enContent
   if (!b) {
     reasonsRefusalList()
   }

+ 24 - 2
pages/wallet/global-order.vue

@@ -94,11 +94,13 @@ import { ref, onMounted, watch, computed, nextTick } from "vue";
 import _ from "lodash";
 import DynamicForm from "./components/DynamicForm.vue";
 import { showToast } from "@/utils/toast";
-import { onLoad } from '@dcloudio/uni-app'
+import { onLoad, onUnload } from '@dcloudio/uni-app'
 import useRouter from "@/hooks/useRouter";
 import { useI18n } from "vue-i18n";
 import { ucardApi } from "@/api/ucard";
 import useCardStore from "@/stores/use-card-store";
+import { useKeyboardScroll } from '@/hooks/useKeyboardScroll'
+
 const cardStore = useCardStore();
 import useUserStore from "@/stores/use-user-store";
 const userStore = useUserStore();
@@ -106,6 +108,7 @@ const showSuccessPrompt = ref(false);
 const { t } = useI18n();
 const router = useRouter();
 const currency = ref()
+useKeyboardScroll()
 onLoad((options) => {
   currency.value = options.currency
 })
@@ -230,6 +233,9 @@ const receiverUserListSelect = computed(() => {
 
 // Methods
 const changeLogin = (value: any) => {
+  if (globalForm.value.amount) {
+    globalExchangeRate()
+  }
   globalForm.value.deductionAccount = value.value;
   if (value.value) {
     step2.value = true;
@@ -521,6 +527,8 @@ const setData = async (data: any) => {
         fixedValue = label?.valueId || fixedValue;
         globalForm.value[fieldName + "Value"] = label?.value ?? null;
         globalForm.value[fieldName] = fixedValue;
+        console.log(field, fixedValue, 'select field');
+
       }
       return { ...field, fixedValue };
     })
@@ -700,10 +708,24 @@ const getAccountDropdown = async () => {
     showToast(t('common.error'));
   }
 };
+// 付款账户下拉
+const globalUserDetails = async () => {
+  try {
+    const res = await ucardApi.globalUserDetails();
+    if (res.code === 200) {
+      businessForm.value = res.data;
+    }
+    console.log(res.data);
+
+  } catch (error) {
+    console.error("Error fetching account dropdown:", error);
+    showToast(t('common.error'));
+  }
+};
 
 
 onMounted(async () => {
-  businessForm.value = userStore.userInfo;
+  await globalUserDetails();
   await getAccountDropdown();
   getGlobalCurrenciesDropdown();
   globalReceiverUserList(businessForm.value);

+ 4 - 5
pages/wallet/index.vue

@@ -25,7 +25,7 @@
         </view>
       </view>
       <view class="wallet-page">
-        <view class="global-title">{{ t("wallet1.p3") }}</view>
+        <view class="global-title">{{ t("global.title1") }}</view>
         <view class="global-con">
           <view class="global-con-l">
             <image src="/static/images/currency/USD.png" alt="" srcset="" />
@@ -76,8 +76,7 @@
               </view>
             </view>
           </template>
-          <cwg-empty-state v-if="globalOrdersList.length == 0" :title="t('empty-state.t2')"
-            :text="t('empty-state.c2')" />
+          <cwg-empty-state v-if="globalOrdersList.length == 0" />
         </view>
       </view>
       <cwg-currency-select v-model="modelValue" :show-search="true" :options="globalCurrenciesDropdown"
@@ -369,9 +368,9 @@ onMounted(() => {
   .global-con-r {
     display: flex;
     flex: 1;
-    padding: px2rpx(12);
+    padding: px2rpx(12) px2rpx(8);
     align-items: center;
-    gap: px2rpx(12);
+    gap: px2rpx(6);
     border-radius: px2rpx(12);
     box-shadow: 0px px2rpx(10) px2rpx(30) 0px rgba(5, 0, 1, 0.1);
     color: var(--white);

+ 3 - 29
pages/wallet/withdraw-detail.vue

@@ -96,14 +96,6 @@
           </view>
         </view>
       </view>
-      <view class="content" v-if="complianceStatus">
-        <view>
-          <view class="section-header">
-            <uni-icons type="list" size="18" color="#2563eb" />
-            <text class="section-title">{{ getGroupTitle('submitRfi') }}</text>
-          </view>
-        </view>
-      </view>
       <view class="bottom-actions" v-if="(detailData.transactionStatus == 1 && detailData.transactionStatus != 5)">
         <view class="action-btn cancel-btn" @click="cancelOrder">
           <text class="btn-text">{{ t('global.GlobalOrder.CancelOrder') }}</text>
@@ -130,7 +122,7 @@ const getApproveDesc = () => {
   if (!d) return
   const c = userStore.reasonsOptions
   const a = c[d || '']
-  const b = locale.value == 'cn' || locale.value == 'zh' ? a.content : a.enContent
+  const b = locale.value == 'cn' || locale.value == 'zhHant' ? a.content : a.enContent
   if (!b) {
     reasonsRefusalList()
   }
@@ -138,7 +130,7 @@ const getApproveDesc = () => {
 }
 const formatOrderNo = (orderNo?: string) => {
   if (!orderNo) return '--';
-  if (orderNo.length <= 20) return orderNo;
+  if (orderNo.length <= 16) return orderNo;
   return orderNo.slice(0, 6) + '...' + orderNo.slice(-4);
 };
 
@@ -179,16 +171,6 @@ function pickFields(source, fields = ['content', 'enContent']) {
 }
 
 const cardStore = useCardStore();
-const getGroupTitle = (type) => {
-  const map = {
-    common: "global.GlobalOrder.common",
-    receiver: "global.GlobalOrder.receiver",
-    sender: "global.GlobalOrder.sender",
-    other: "global.GlobalOrder.other",
-    submitRfi: "global.GlobalOrder.submitRfi",
-  };
-  return t(map[type] || type);
-}
 
 // 取消订单
 const cancelOrder = () => {
@@ -206,22 +188,14 @@ const cancelOrder = () => {
             title: t('global.GlobalOrder.CancelOrderSuccess'),
             icon: 'success'
           });
+          detailData.value.transactionStatus = 5;
         }
       }
     }
   });
 };
 
-const isLoading = ref(false) // 接口加载状态
-
 const detailData = ref<any>({})
-const list = ref<Record<string, any[]>>({})
-
-const complianceItems = ref<any[]>([])
-const globalForm = ref<any>({})
-
-const complianceStatus = ref(false)
-
 // 页面加载时,先使用缓存数据渲染,然后获取最新数据
 onLoad((e) => {
   const cachedData = cardStore.orderDetail

+ 32 - 1
pages/wallet/withdraw.vue

@@ -51,6 +51,7 @@ import useUserStore from "@/stores/use-user-store";
 import useRouter from "@/hooks/useRouter";
 import { Validators } from "@/utils/validators";
 import { onLoad } from '@dcloudio/uni-app'
+import ls from "@/utils/store2";
 onLoad((options) => {
     userBalance.value = options.allAmount
 })
@@ -131,7 +132,7 @@ function initForm() {
 }
 // 初始化定时器
 function initTimer() {
-    const savedTimer = Number(localStorage.getItem("cvvTimer")) || 59;
+    const savedTimer = Number(ls.get("cvvTimer")) || 59;
     if (savedTimer === 59) {
         getCodeString.value = t("newSignup.item11");
     } else {
@@ -248,6 +249,36 @@ function handleChange(value: any) {
     if (value.key === "emailCode") {
         form.value.emailCode = value.value;
     }
+    if (value.key === "blockchain") {
+        changeBlockchain(value.value);
+    }
+}
+
+function changeBlockchain(e) {
+    blockchainList.value.forEach(item => {
+        if (item.blockchain === e) {
+            form.value.receivedCurrency = item.alias;
+            form.value.exchangeRate = item.exchangeRate;
+        }
+    });
+    if (form.value.amount) {
+        globalExchangeRate();
+    }
+}
+function globalExchangeRate() {
+    const amount = Number(form.value.amount);
+    formRef.value.validateField(['amount'], (valid) => {
+        if (valid.length > 0) {
+            form.value.receivedAmount = '';
+            return
+        }
+        if (amount && form.value.exchangeRate) {
+            const receivedAmount = parseFloat((amount * form.value.exchangeRate).toFixed(4));
+            form.value.receivedAmount = receivedAmount;
+        } else {
+            form.value.receivedAmount = '';
+        }
+    });
 }
 
 

+ 8 - 0
static/scss/global/global.scss

@@ -565,4 +565,12 @@ body {
     flex-shrink: 0;
     width: px2rpx(14);
     height: px2rpx(14);
+}
+
+.status-badge {
+    display: flex;
+    align-items: center;
+    gap: px2rpx(4);
+    padding: px2rpx(3) px2rpx(8) px2rpx(3) px2rpx(3);
+    border-radius: px2rpx(12);
 }

+ 1 - 1
uni_modules/cwg-svg-icon/components/cwg-svg-icon/cwg-svg-icon.vue

@@ -356,7 +356,7 @@ export default {
 
 .click-helper {
   position: absolute;
-  z-index: 10;
+  z-index: 9;
   top: 0;
   left: 0;
   width: 100%;

+ 11 - 9
utils/dataMap.js

@@ -34,15 +34,17 @@ export const rechargeApproveStatusMap = {
 }
 //   钱包余额记录
 export const walletBalanceTypeMap = {
-  1: 'card.Status.t16',
-  2: 'card.Status.t17',
-  3: 'card.Status.t18',
-  4: 'card.Status.t19',
-  5: 'card.Status.t20',
-  6: 'card.Status.t21',
-  7: 'card.Status.t23',
-  8: 'card.Status.t24',
-  9: 'card.Status.t25'
+  1: "card.Status.t16",
+  2: "card.Status.t17",
+  3: "card.Status.t18",
+  4: "card.Status.t19",
+  5: "card.Status.t20",
+  6: "card.Status.t21",
+  7: "card.Status.t23",
+  8: "card.Status.t24",
+  9: "card.Status.t25",
+  10: "card.Status.t26",
+  11: "card.Status.t27",
 }
 
 // 速汇审批状态

+ 11 - 0
utils/needLoginPages.js

@@ -0,0 +1,11 @@
+// utils/needLoginPages.js
+
+// ⚠️ 注意:必须是 `/pages/...` 形式
+export const needLoginPages = [
+  '/pages/card/index',
+]
+
+// 开发环境下动态获取(可选)
+export function getNeedLoginPages() {
+  return needLoginPages
+}

+ 60 - 0
utils/routeInterceptor.js

@@ -0,0 +1,60 @@
+/**
+ * 路由登录拦截器(黑名单模式)
+ * 适用:大部分页面可访问,少数页面需要登录
+ */
+
+import { userToken } from "@/composables/config";
+import {
+    needLoginPages as _needLoginPages,
+    getNeedLoginPages,
+} from '@/utils/needLoginPages.js'
+
+// 登录页
+const LOGIN_ROUTE = '/pages/login/index'
+
+// 是否开发环境
+const isDev = process.env.NODE_ENV === 'development'
+
+// 拦截器主体
+const routeGuard = {
+    invoke({ url }) {
+        // 1️⃣ 解析纯路径(去掉 query)
+        const path = url.split('?')[0]
+        console.log(path, 222212112);
+
+
+        // 2️⃣ 获取需要登录的页面列表
+        const needLoginPages = isDev
+            ? getNeedLoginPages()
+            : _needLoginPages
+
+        // 3️⃣ 是否命中黑名单
+        const needLogin = needLoginPages.includes(path)
+
+        // 4️⃣ 是否已登录
+        const hasToken = userToken.value
+
+        // 5️⃣ 放行条件
+        if (!needLogin || hasToken) {
+            return true
+        }
+
+        // 6️⃣ 未登录 → 跳登录页
+        uni.navigateTo({
+            url: LOGIN_ROUTE,
+        })
+
+        // ⚠️ 必须 return false
+        return false
+    },
+}
+
+// 对外安装方法
+export const routeInterceptor = {
+    install() {
+        uni.addInterceptor('navigateTo', routeGuard)
+        uni.addInterceptor('redirectTo', routeGuard)
+        uni.addInterceptor('reLaunch', routeGuard)
+        uni.addInterceptor('switchTab', routeGuard)
+    },
+}