Преглед изворни кода

Merge branch 'admin_dev' into admin_dev_ocr

ljc пре 1 недеља
родитељ
комит
5a08b45211
83 измењених фајлова са 1144 додато и 408 уклоњено
  1. 4 1
      App.vue
  2. 5 3
      components/cwg-complex-search.vue
  3. 1 1
      components/cwg-detail-popup.vue
  4. 4 6
      components/cwg-download.vue
  5. 1 1
      components/cwg-droplist-item.vue
  6. 2 2
      components/cwg-droplist.vue
  7. 14 9
      components/cwg-file-picker-wrapper.vue
  8. 2 2
      components/cwg-language.vue
  9. 8 8
      components/cwg-link.vue
  10. 2 2
      components/cwg-notice.vue
  11. 1 1
      components/cwg-page-wrapper.vue
  12. 11 10
      components/cwg-payment.vue
  13. 1 1
      components/cwg-popup.vue
  14. 2 2
      components/cwg-right-drawer.vue
  15. 1 1
      components/cwg-system.vue
  16. 2 2
      components/cwg-tabel.vue
  17. 7 1
      composables/useAccountOptions.js
  18. 7 1
      composables/useLeftSidebarCollapse.ts
  19. 2 2
      hooks/useAppUpdate.ts
  20. 22 9
      locale/ar.json
  21. 35 5
      locale/cn.json
  22. 22 9
      locale/de.json
  23. 18 7
      locale/en.json
  24. 22 9
      locale/es.json
  25. 28 15
      locale/fa.json
  26. 22 9
      locale/id.json
  27. 20 7
      locale/ko.json
  28. 22 9
      locale/ms.json
  29. 22 9
      locale/pt.json
  30. 23 10
      locale/th.json
  31. 22 9
      locale/tr.json
  32. 18 11
      locale/ug.json
  33. 22 9
      locale/vn.json
  34. 20 7
      locale/zhHant.json
  35. 6 6
      manifest.json
  36. 3 2
      pages/activities/index.vue
  37. 3 3
      pages/analytics/analystViews.vue
  38. 19 3
      pages/analytics/components/List.vue
  39. 2 27
      pages/analytics/news.vue
  40. 26 24
      pages/common/download.vue
  41. 1 1
      pages/common/webview.vue
  42. 22 19
      pages/customer/components/AccountCard.vue
  43. 3 4
      pages/customer/components/AccountList.vue
  44. 5 1
      pages/customer/components/PaymentMethodsList.vue
  45. 3 3
      pages/customer/components/TerminalDialog.vue
  46. 7 2
      pages/customer/dashboard.vue
  47. 4 3
      pages/customer/deposit-select.vue
  48. 6 4
      pages/customer/deposit.vue
  49. 4 2
      pages/customer/trade-history.vue
  50. 1 1
      pages/customer/trade-position.vue
  51. 4 2
      pages/customer/transfer.vue
  52. 3 2
      pages/customer/wallet-transfer.vue
  53. 4 3
      pages/customer/withdrawal-select.vue
  54. 3 2
      pages/customer/withdrawal.vue
  55. 3 1
      pages/follow/components/applySignalDialog.vue
  56. 1 1
      pages/follow/index.vue
  57. 42 9
      pages/follow/trading-center-single.vue
  58. 4 3
      pages/follow/trading-center.vue
  59. 4 4
      pages/follow/trading-management.vue
  60. 3 2
      pages/follow/transfer.vue
  61. 4 3
      pages/ib/agent-transfer.vue
  62. 3 1
      pages/ib/complexReport.vue
  63. 3 3
      pages/ib/customer.vue
  64. 10 4
      pages/ib/index.vue
  65. 3 3
      pages/ib/transfer.vue
  66. 4 3
      pages/ib/withdraw-select.vue
  67. 4 3
      pages/ib/withdraw.vue
  68. 11 11
      pages/login/index.vue
  69. 1 1
      pages/login/regist.vue
  70. 2 2
      pages/login/reset.vue
  71. 1 1
      pages/mine/components/BankInfoTab.vue
  72. 9 3
      pages/mine/components/KycAuthDialog.vue
  73. 4 24
      pages/mine/improveImmediately.vue
  74. 1 1
      static/appUrl/url.json
  75. BIN
      static/res 4/CustomLaunch.zip
  76. 16 1
      static/scss/global/global.scss
  77. 4 4
      static/scss/global/vu.css
  78. 1 0
      uni_modules/uni-combox/components/uni-combox/uni-combox.vue
  79. 1 1
      uni_modules/uni-datetime-picker/components/uni-datetime-picker/time-picker.vue
  80. 1 1
      utils/openExternalUrl.js
  81. 435 0
      utils/useMouseTooltip.js
  82. 24 13
      windows/left-window.vue
  83. 1 1
      windows/top-window.vue

+ 4 - 1
App.vue

@@ -2,7 +2,7 @@
   import { ref, onMounted, nextTick, watch, onUnmounted, getCurrentInstance } from 'vue'
   import { ref, onMounted, nextTick, watch, onUnmounted, getCurrentInstance } from 'vue'
   import { useI18n } from 'vue-i18n'
   import { useI18n } from 'vue-i18n'
   import config from '@/config'
   import config from '@/config'
-
+  import { useMouseTooltip } from '@/utils/useMouseTooltip'
   const { t, locale } = useI18n()
   const { t, locale } = useI18n()
   const { Host80 } = config
   const { Host80 } = config
 
 
@@ -413,11 +413,14 @@
         window.vm = instance.proxy
         window.vm = instance.proxy
       }
       }
     }
     }
+    // 初始化鼠标跟随提示
+    window._destroyTooltip = useMouseTooltip()
     window.addEventListener('hashchange', handleSignupRoute)
     window.addEventListener('hashchange', handleSignupRoute)
     // #endif
     // #endif
   })
   })
   onUnmounted(() => {
   onUnmounted(() => {
     // #ifdef H5
     // #ifdef H5
+    if (window._destroyTooltip) window._destroyTooltip()
     window.removeEventListener('hashchange', handleSignupRoute)
     window.removeEventListener('hashchange', handleSignupRoute)
     // #endif
     // #endif
   })
   })

+ 5 - 3
components/cwg-complex-search.vue

@@ -24,14 +24,14 @@
                             <template v-else-if="field.type === 'daterange'">
                             <template v-else-if="field.type === 'daterange'">
                                 <uni-datetime-picker class="cursor-pointer" :start="dateLimit.start" :end="dateLimit.end"
                                 <uni-datetime-picker class="cursor-pointer" :start="dateLimit.start" :end="dateLimit.end"
                                     v-model="formData[field.key]" type="daterange"
                                     v-model="formData[field.key]" type="daterange"
-                                    :placeholder="field.placeholder || '请选择日期范围'" :startPlaceholder="t('placeholder.Start')" :endPlaceholder="t('placeholder.End')" @change="handleDateChange" />
+                                    :placeholder="field.placeholder || '请选择日期范围'" :startPlaceholder="t('placeholder.Start')" :endPlaceholder="t('placeholder.End')" @change="handleDateChange" :data-tooltip="field.placeholder" data-placement="top"/>
                             </template>
                             </template>
                             <template v-else-if="field.type === 'picker'">
                             <template v-else-if="field.type === 'picker'">
                                 <uni-data-picker class="cursor-pointer" style="min-width: 100px" v-model="formData[field.key]"
                                 <uni-data-picker class="cursor-pointer" style="min-width: 100px" v-model="formData[field.key]"
                                     :localdata="field.options" :popup-title="field.popupTitle || t('State.All')"
                                     :localdata="field.options" :popup-title="field.popupTitle || t('State.All')"
                                     :map="field.map || { value: 'value', text: 'label' }"
                                     :map="field.map || { value: 'value', text: 'label' }"
                                     @change="(e) => field.onChange?.(e)"
                                     @change="(e) => field.onChange?.(e)"
-                                    @nodeclick="(node) => field.onNodeClick?.(node)" />
+                                    @nodeclick="(node) => field.onNodeClick?.(node)" :data-tooltip="field.placeholder" data-placement="top"/>
                             </template>
                             </template>
                             <template v-else-if="field.type === 'number'">
                             <template v-else-if="field.type === 'number'">
                                 <uni-easyinput v-model="formData[field.key]" type="number"
                                 <uni-easyinput v-model="formData[field.key]" type="number"
@@ -55,10 +55,11 @@
                     <uni-datetime-picker class="cursor-pointer" :start="dateLimit.start" :end="dateLimit.end" v-model="formData[dateField.key]"
                     <uni-datetime-picker class="cursor-pointer" :start="dateLimit.start" :end="dateLimit.end" v-model="formData[dateField.key]"
                         :type="dateField.type === 'daterange' ? 'daterange' : 'date'"
                         :type="dateField.type === 'daterange' ? 'daterange' : 'date'"
                         :placeholder="dateField.placeholder || (dateField.type === 'daterange' ? '选择日期范围' : '选择日期')"
                         :placeholder="dateField.placeholder || (dateField.type === 'daterange' ? '选择日期范围' : '选择日期')"
+                                         :startPlaceholder="t('placeholder.Start')" :endPlaceholder="t('placeholder.End')"
                         @change="handleDateChange" />
                         @change="handleDateChange" />
                 </view>
                 </view>
                 <view v-else class="mobile-date-wrapper"></view>
                 <view v-else class="mobile-date-wrapper"></view>
-                <button class="filter-chip" @click="openFilterPopup">
+                <button v-if="nonDateField?.length" class="filter-chip" @click="openFilterPopup">
                     <cwg-icon name="cwg-filter" :size="14" color="#141d22" />
                     <cwg-icon name="cwg-filter" :size="14" color="#141d22" />
                     <text class="filter-label" v-t="'Documentary.tradingCenter.item3'" />
                     <text class="filter-label" v-t="'Documentary.tradingCenter.item3'" />
                 </button>
                 </button>
@@ -319,6 +320,7 @@ const ownerPageRoute = ref('')
 
 
 /** 仅字段结构变化时重新初始化(语言切换改 label 不触发) */
 /** 仅字段结构变化时重新初始化(语言切换改 label 不触发) */
 const getFieldsSignature = (fields) => {
 const getFieldsSignature = (fields) => {
+  console.log(fields)
     if (!fields?.length) return ''
     if (!fields?.length) return ''
     return JSON.stringify(
     return JSON.stringify(
         fields.filter(Boolean).map((field) => ({
         fields.filter(Boolean).map((field) => ({

+ 1 - 1
components/cwg-detail-popup.vue

@@ -30,7 +30,7 @@
             </view>
             </view>
         </view>
         </view>
         <template #footer>
         <template #footer>
-            <button class="single-btn default" @click="visible = false" v-t="'Home.msg.item3'" />
+            <button class="single-btn default" @click="visible = false" v-t="'Btn.Close'" />
         </template>
         </template>
     </cwg-popup>
     </cwg-popup>
 </template>
 </template>

+ 4 - 6
components/cwg-download.vue

@@ -1,10 +1,8 @@
 <template>
 <template>
-  <view class="cwg-language">
-    <uni-tooltip :content="t('Downloadpage.item1')" placement="bottom">
-      <view class="pc-header-btn" @click="handleMenuClick">
-        <cwg-icon name="crm-download" color="#97A1C0" :size="20" />
-      </view>
-    </uni-tooltip>
+  <view class="cwg-language cursor-pointer" :data-tooltip="t('Downloadpage.item1')">
+    <view class="pc-header-btn" @click="handleMenuClick">
+      <cwg-icon name="crm-download" color="#97A1C0" :size="20" />
+    </view>
   </view>
   </view>
 
 
 </template>
 </template>

+ 1 - 1
components/cwg-droplist-item.vue

@@ -46,7 +46,7 @@ const handleClick = () => {
 .cwg-droplist-item {
 .cwg-droplist-item {
   display: flex;
   display: flex;
   align-items: center;
   align-items: center;
-  padding: px2rpx(10) px2rpx(20);
+  padding: px2rpx(5) px2rpx(15);
   font-size: px2rpx(14);
   font-size: px2rpx(14);
   line-height: px2rpx(22);
   line-height: px2rpx(22);
   color: var(--bs-emphasis-color);
   color: var(--bs-emphasis-color);

+ 2 - 2
components/cwg-droplist.vue

@@ -14,7 +14,7 @@
             <template v-if="menuList && menuList.length">
             <template v-if="menuList && menuList.length">
               <cwg-droplist-item v-for="(item, index) in menuList" :key="index"
               <cwg-droplist-item v-for="(item, index) in menuList" :key="index"
                 :command="item.command !== undefined ? item.command : (item.value !== undefined ? item.value : item)"
                 :command="item.command !== undefined ? item.command : (item.value !== undefined ? item.value : item)"
-                :disabled="item.disabled" @click="handleMenuClick(item, index)">
+                :disabled="item.disabled" @click="handleMenuClick(item, index)" class="cursor-pointer" :data-tooltip="item.label || item.text || item.title || item">
                 {{ item.label || item.text || item.title || item }}
                 {{ item.label || item.text || item.title || item }}
               </cwg-droplist-item>
               </cwg-droplist-item>
             </template>
             </template>
@@ -254,7 +254,7 @@ defineExpose({
   border: 1px solid var(--bs-border-color);
   border: 1px solid var(--bs-border-color);
   border-radius: px2rpx(4);
   border-radius: px2rpx(4);
   box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
   box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
-  padding: px2rpx(10) 0;
+  padding: px2rpx(5) 0;
   min-width: px2rpx(100);
   min-width: px2rpx(100);
   opacity: 0;
   opacity: 0;
   transform: scaleY(0);
   transform: scaleY(0);

+ 14 - 9
components/cwg-file-picker-wrapper.vue

@@ -16,28 +16,28 @@
 
 
     <!-- 正常模式:宫格上传(完全对齐官方 upload-image 样式) -->
     <!-- 正常模式:宫格上传(完全对齐官方 upload-image 样式) -->
     <view v-else class="uni-file-picker__container">
     <view v-else class="uni-file-picker__container">
-      <view class="file-picker__box cursor-pointer" v-for="(item, index) in innerFileList" :key="index"
-        :style="typeof boxStyle === 'object' ? boxStyle : { cssText: boxStyle }">
-        <view class="file-picker__box-content" :style="borderStyle">
+      <view class="file-picker__box" v-for="(item, index) in innerFileList" :key="index"
+        :style="typeof boxStyle === 'object' ? boxStyle : { cssText: boxStyle }" >
+        <view class="file-picker__box-content " :style="borderStyle" >
           <!-- 图片 -->
           <!-- 图片 -->
-          <image v-if="isImage(item)" class="file-image" :src="item.url || item.path" mode="aspectFill"
+          <image v-if="isImage(item)" class="file-image cursor-pointer" :data-tooltip="tooltipText(item)" :src="item.url || item.path" mode="aspectFill"
             :style="imgStyle" @click.stop="previewFile(item, index)" />
             :style="imgStyle" @click.stop="previewFile(item, index)" />
 
 
           <!-- 视频 → 显示第一帧 + 播放图标 -->
           <!-- 视频 → 显示第一帧 + 播放图标 -->
-          <view v-else-if="isVideo(item)" class="file-cover video-box" @click.stop="previewFile(item, index)">
+          <view v-else-if="isVideo(item)" class="file-cover video-box cursor-pointer" :data-tooltip="tooltipText(item)" @click.stop="previewFile(item, index)">
             <image :src="item.url || item.path" class="file-image" mode="aspectFill" :style="imgStyle" />
             <image :src="item.url || item.path" class="file-image" mode="aspectFill" :style="imgStyle" />
             <view class="video-play-icon">▶</view>
             <view class="video-play-icon">▶</view>
           </view>
           </view>
 
 
           <!-- 其他文件(PDF/Word/Excel) -->
           <!-- 其他文件(PDF/Word/Excel) -->
-          <view v-else class="file-cover file-box" :class="getFileClass(item.name)"
+          <view v-else class="file-cover file-box cursor-pointer" :data-tooltip="tooltipText(item)" :class="getFileClass(item.name)"
             @click.stop="previewFile(item, index)">
             @click.stop="previewFile(item, index)">
             <text class="file-big-icon">{{ getFileIcon(item.name) }}</text>
             <text class="file-big-icon">{{ getFileIcon(item.name) }}</text>
             <text class="file-ext-name">{{ getFileExt(item.name) }}</text>
             <text class="file-ext-name">{{ getFileExt(item.name) }}</text>
           </view>
           </view>
 
 
           <!-- 删除 -->
           <!-- 删除 -->
-          <view v-if="delIcon" class="icon-del-box" @click.stop="deleteFile(index)">
+          <view v-if="delIcon" class="icon-del-box cursor-pointer" :data-tooltip="t('vu.tooltip.t17')" @click.stop="deleteFile(index)">
             <view class="icon-del"></view>
             <view class="icon-del"></view>
             <view class="icon-del rotate"></view>
             <view class="icon-del rotate"></view>
           </view>
           </view>
@@ -57,7 +57,7 @@
 
 
       <!-- 添加按钮 -->
       <!-- 添加按钮 -->
       <view v-if="innerFileList?.length < limit" class="file-picker__box cursor-pointer"
       <view v-if="innerFileList?.length < limit" class="file-picker__box cursor-pointer"
-        :style="typeof boxStyle === 'object' ? boxStyle : { cssText: boxStyle }">
+        :style="typeof boxStyle === 'object' ? boxStyle : { cssText: boxStyle }" :data-tooltip="t('vu.tooltip.t10')" data-placement="top">
         <view class="file-picker__box-content  is-add" :style="borderStyle" @click="handleChoose">
         <view class="file-picker__box-content  is-add" :style="borderStyle" @click="handleChoose">
           <cwg-icon name="icon_add" class="upload-icon" :size="24" />
           <cwg-icon name="icon_add" class="upload-icon" :size="24" />
         </view>
         </view>
@@ -71,8 +71,11 @@
 <script setup>
 <script setup>
 import { ref, watch, nextTick, computed } from 'vue'
 import { ref, watch, nextTick, computed } from 'vue'
 import config from '@/config'
 import config from '@/config'
+import { useI18n } from 'vue-i18n';
 import { userToken } from '@/composables/config'
 import { userToken } from '@/composables/config'
 import copChooseFile from '@/uni_modules/cop-chooseFile/components/cop-chooseFile/cop-chooseFile.vue'
 import copChooseFile from '@/uni_modules/cop-chooseFile/components/cop-chooseFile/cop-chooseFile.vue'
+const { t, locale } = useI18n();
+
 // === Vue3 v-model 标准写法 + 多类型兼容 ===
 // === Vue3 v-model 标准写法 + 多类型兼容 ===
 const props = defineProps({
 const props = defineProps({
   modelValue: {
   modelValue: {
@@ -178,7 +181,9 @@ const boxStyle = computed(() => {
   }
   }
   return 'width:33.3%;height:0;'
   return 'width:33.3%;height:0;'
 })
 })
-
+const tooltipText = (file)=>{
+  return (props.disablePreview || file.status === 'uploading' || file.status === 'error')?'':t('vu.tooltip.t16')
+}
 // ==============================================
 // ==============================================
 // 统一格式化函数(修复递归核心)
 // 统一格式化函数(修复递归核心)
 // ==============================================
 // ==============================================

+ 2 - 2
components/cwg-language.vue

@@ -1,7 +1,7 @@
 <template>
 <template>
-  <view class="cwg-language">
+  <view class="cwg-language" >
     <cwg-dropdown :menu-list="customMenuList" @menuClick="handleMenuClick" showActive :activeKey="lang">
     <cwg-dropdown :menu-list="customMenuList" @menuClick="handleMenuClick" showActive :activeKey="lang">
-      <view class="pc-header-btn">
+      <view class="pc-header-btn cursor-pointer" :data-tooltip="t('vu.tooltip.t101')">
         <cwg-icon name="cwg-lang" :color="iconColor " :size="20" />
         <cwg-icon name="cwg-lang" :color="iconColor " :size="20" />
       </view>
       </view>
     </cwg-dropdown>
     </cwg-dropdown>

+ 8 - 8
components/cwg-link.vue

@@ -1,16 +1,16 @@
 <template>
 <template>
   <!-- #ifdef H5 -->
   <!-- #ifdef H5 -->
   <!-- H5 端:支持普通跳转 / PDF预览 / 文件下载 -->
   <!-- H5 端:支持普通跳转 / PDF预览 / 文件下载 -->
-  <a v-if="isDownload" class="pdf-link" :href="url" :download="downloadName" target="_blank" :title="resolvedTitle">
+  <a v-if="isDownload" class="pdf-link cursor-pointer" :href="url" :download="downloadName" target="_blank" :title="resolvedTitle" :data-tooltip="resolvedTitle" data-placement="top">
     <slot v-if="slots['default']"></slot>
     <slot v-if="slots['default']"></slot>
     <view v-else>{{ t(props.title) || props.title }}</view>
     <view v-else>{{ t(props.title) || props.title }}</view>
   </a>
   </a>
-  <a v-else-if="isHtml" class="pdf-link" :href="url" :target="target || '_blank'" :title="resolvedTitle"
-    rel="noopener noreferrer">
+  <a v-else-if="isHtml" class="pdf-link cursor-pointer" :href="url" :target="target || '_blank'" :title="resolvedTitle"
+    rel="noopener noreferrer" :data-tooltip="resolvedTitle" data-placement="top">
     <slot v-if="slots['default']"></slot>
     <slot v-if="slots['default']"></slot>
     <view v-else>{{ t(props.title) || props.title }}</view>
     <view v-else>{{ t(props.title) || props.title }}</view>
   </a>
   </a>
-  <view v-else class="pdf-link" @click="handleClick">
+  <view v-else class="pdf-link cursor-pointer" @click="handleClick" :data-tooltip="t(props.title) || props.title" data-placement="top">
     <slot v-if="slots['default']"></slot>
     <slot v-if="slots['default']"></slot>
     <view v-else>{{ t(props.title) || props.title }}</view>
     <view v-else>{{ t(props.title) || props.title }}</view>
   </view>
   </view>
@@ -88,22 +88,22 @@ const startDownload = () => {
           filePath: res.tempFilePath,
           filePath: res.tempFilePath,
           fileName: props.downloadName,
           fileName: props.downloadName,
           success: () => {
           success: () => {
-            uni.showToast({ icon: 'none', title: '下载完成' })
+            uni.showToast({ icon: 'none', title: t('mine.p27') })
           }
           }
         })
         })
       } else {
       } else {
-        uni.showToast({ icon: 'none', title: '下载失败' })
+        uni.showToast({ icon: 'none', title: t('mine.p28') })
       }
       }
     },
     },
     fail: () => {
     fail: () => {
       uni.hideLoading()
       uni.hideLoading()
-      uni.showToast({ icon: 'none', title: '下载链接异常' })
+      uni.showToast({ icon: 'none', title: t('mine.p28') })
     }
     }
   })
   })
 }
 }
 </script>
 </script>
 
 
-<style scoped>
+<style scoped lang="scss">
 .pdf-link {
 .pdf-link {
   //width: 100%;
   //width: 100%;
   display: inline-block;
   display: inline-block;

+ 2 - 2
components/cwg-notice.vue

@@ -1,7 +1,7 @@
 <template>
 <template>
     <view class="notice-container">
     <view class="notice-container">
         <cwg-dropdown ref="dropdownRef" :menu-list="[]">
         <cwg-dropdown ref="dropdownRef" :menu-list="[]">
-            <view class="pc-header-btn" :class="{ '!has-dot': isRed }">
+            <view class="pc-header-btn cursor-pointer" :data-tooltip="t('News.Notice')" :class="{ '!has-dot': isRed }">
                 <text v-if="isRed"
                 <text v-if="isRed"
                     class="position-absolute top-0 end-0 p-1 mt-1 me-1 bg-danger border border-3 border-light rounded-circle" />
                     class="position-absolute top-0 end-0 p-1 mt-1 me-1 bg-danger border border-3 border-light rounded-circle" />
                 <cwg-icon name="cwg-bell" color="#97A1C0" :size="20" @click="openNotice" />
                 <cwg-icon name="cwg-bell" color="#97A1C0" :size="20" @click="openNotice" />
@@ -15,7 +15,7 @@
                         <view class="list-group list-group-hover list-group-smooth list-group-unlined">
                         <view class="list-group list-group-hover list-group-smooth list-group-unlined">
                             <view
                             <view
                                 class="list-group-item d-flex justify-content-between align-items-center cursor-pointer"
                                 class="list-group-item d-flex justify-content-between align-items-center cursor-pointer"
-                                v-for="item in list" :key="item.id" @click="goPages(item)">
+                                v-for="item in list" :key="item.id" @click="goPages(item)" :data-tooltip="t('vu.tooltip.t4',{pageName:t('vu.tooltip.t5')})" data-placement="top">
                                 <view class="ms-2 me-auto">
                                 <view class="ms-2 me-auto">
                                     <h6 class="mb-2 position-relative">{{ item.subject
                                     <h6 class="mb-2 position-relative">{{ item.subject
                                         }} <view class="item-badge" v-if="item.read == 0">
                                         }} <view class="item-badge" v-if="item.read == 0">

+ 1 - 1
components/cwg-page-wrapper.vue

@@ -42,7 +42,7 @@
           </cwg-match-media>
           </cwg-match-media>
         </view>
         </view>
       </view>
       </view>
-      <view class="chat-icon" :class="{ 'chat-icon-expanded': isChatIconExpanded, 'chat-icon-hidden': type == 'chat' }"
+      <view class="chat-icon cursor-pointer" :data-tooltip="t('Downloadpage.item16')" :class="{ 'chat-icon-expanded': isChatIconExpanded, 'chat-icon-hidden': type == 'chat' }"
         @click="handleChatIconClick">
         @click="handleChatIconClick">
         <cwg-icon name="chat" color="#fff" />
         <cwg-icon name="chat" color="#fff" />
       </view>
       </view>

+ 11 - 10
components/cwg-payment.vue

@@ -17,25 +17,25 @@
         <view class="right-drawer custom-payment-drawer" v-if="mode === 'customer'">
         <view class="right-drawer custom-payment-drawer" v-if="mode === 'customer'">
           <view class="drawer-header">
           <view class="drawer-header">
             <text class="drawer-title">{{t('vu.item21')}}</text>
             <text class="drawer-title">{{t('vu.item21')}}</text>
-            <switch :checked="!isShow" @change="toggleShow" color="#6c8595" style="transform:scale(0.7)" />
+            <switch class="cursor-pointer" :data-tooltip="!isShow?t('vu.tooltip.t12'):t('vu.tooltip.t11')" :checked="!isShow" @change="toggleShow" color="#6c8595" style="transform:scale(0.7)" />
           </view>
           </view>
           <view class="drawer-content">
           <view class="drawer-content">
             <view class="balance-amount">{{ formattedBalance }} USD</view>
             <view class="balance-amount">{{ formattedBalance }} USD</view>
-            <view class="cursor-pointer" @click="toPaymentHistory">
+            <view class="cursor-pointer cursor-pointer1" @click="toPaymentHistory" :data-tooltip="t('wallet.pendingWithdraw1')" data-placement="top">
               <view class="account-number">${{ formattedPendingWithdrawAmount }}</view>
               <view class="account-number">${{ formattedPendingWithdrawAmount }}</view>
               <view class="account-type" v-t="'wallet.pendingWithdraw1'"></view>
               <view class="account-type" v-t="'wallet.pendingWithdraw1'"></view>
             </view>
             </view>
 
 
           </view>
           </view>
           <view class="drawer-actions">
           <view class="drawer-actions">
-            <button class="action-btn btn btn-outline-danger waves-effect waves-light" @click.stop="goPages(1)" v-t="'wallet.item6'"></button>
-            <button class="action-btn btn btn-outline-danger waves-effect waves-light" @click.stop="goPages(2)" v-t="'wallet.item7'"></button>
+            <button class="action-btn btn btn-outline-danger waves-effect waves-light " :data-tooltip="t('wallet.item6')" data-placement="top" @click.stop="goPages(1)" v-t="'wallet.item6'"></button>
+            <button class="action-btn btn btn-outline-danger waves-effect waves-light " :data-tooltip="t('wallet.item7')" data-placement="top" @click.stop="goPages(2)" v-t="'wallet.item7'"></button>
           </view>
           </view>
         </view>
         </view>
         <view class="right-drawer custom-payment-drawer" v-if="mode === 'ib'">
         <view class="right-drawer custom-payment-drawer" v-if="mode === 'ib'">
           <view class="drawer-header">
           <view class="drawer-header">
             <text class="drawer-title">{{t('vu.item21')}}</text>
             <text class="drawer-title">{{t('vu.item21')}}</text>
-            <switch :checked="!isShow" @change="toggleShow" color="#6c8595" style="transform:scale(0.7)" />
+            <switch class="cursor-pointer" :data-tooltip="!isShow?t('vu.tooltip.t12'):t('vu.tooltip.t11')" :checked="!isShow" @change="toggleShow" color="#6c8595" style="transform:scale(0.7)" />
           </view>
           </view>
           <view class="drawer-content">
           <view class="drawer-content">
             <view class="balance-amount">{{ ibBalance }} USD</view>
             <view class="balance-amount">{{ ibBalance }} USD</view>
@@ -46,22 +46,22 @@
 
 
           </view>
           </view>
           <view class="drawer-actions">
           <view class="drawer-actions">
-            <button class="action-btn btn btn-outline-danger waves-effect waves-light" @click.stop="goIbPages(1)" v-t="'Custom.Index.Withdrawals'"></button>
-            <button class="action-btn btn btn-outline-danger waves-effect waves-light" @click.stop="goIbPages(2)" v-t="'Home.page_ib.item4'"></button>
-            <button class="action-btn btn btn-outline-danger waves-effect waves-light" @click.stop="goIbPages(3)" v-t="'Ib.Transfer.CommissionIssue'"></button>
+            <button class="action-btn btn btn-outline-danger waves-effect waves-light "  @click.stop="goIbPages(1)" v-t="'Custom.Index.Withdrawals'"></button>
+            <button class="action-btn btn btn-outline-danger waves-effect waves-light" :data-tooltip="t('Home.page_ib.item4')" data-placement="top" @click.stop="goIbPages(2)" v-t="'Home.page_ib.item4'"></button>
+            <button class="action-btn btn btn-outline-danger waves-effect waves-light " data-placement="top" :data-tooltip="t('Ib.Transfer.CommissionIssue')" @click.stop="goIbPages(3)" v-t="'Ib.Transfer.CommissionIssue'"></button>
           </view>
           </view>
         </view>
         </view>
         <view class="right-drawer custom-payment-drawer" v-if="mode === 'follow'">
         <view class="right-drawer custom-payment-drawer" v-if="mode === 'follow'">
           <view class="drawer-header">
           <view class="drawer-header">
             <text class="drawer-title">{{t('vu.item21')}}</text>
             <text class="drawer-title">{{t('vu.item21')}}</text>
-            <switch :checked="!isShow" @change="toggleShow" color="#6c8595" style="transform:scale(0.7)" />
+            <switch class="cursor-pointer" :data-tooltip="!isShow?t('vu.tooltip.t12'):t('vu.tooltip.t11')" :checked="!isShow" @change="toggleShow" color="#6c8595" style="transform:scale(0.7)" />
           </view>
           </view>
           <view class="drawer-content">
           <view class="drawer-content">
             <view class="balance-amount">{{ t('Documentary.console.item15') }}{{ followBalance }} USD</view>
             <view class="balance-amount">{{ t('Documentary.console.item15') }}{{ followBalance }} USD</view>
 
 
           </view>
           </view>
           <view class="drawer-actions">
           <view class="drawer-actions">
-            <button class="action-btn btn btn-outline-danger waves-effect waves-light" @click.stop="goFollowPages(1)" v-t="'Documentary.console.item17'"></button>
+            <button class="action-btn btn btn-outline-danger waves-effect waves-light " :data-tooltip="t('Documentary.console.item17')" @click.stop="goFollowPages(1)" v-t="'Documentary.console.item17'"></button>
           </view>
           </view>
         </view>
         </view>
       </template>
       </template>
@@ -349,6 +349,7 @@ onUnmounted(() => {
     }
     }
 
 
     .drawer-actions {
     .drawer-actions {
+      position: relative;
       display: flex;
       display: flex;
       gap: px2rpx(10);
       gap: px2rpx(10);
       padding: 0 px2rpx(16) px2rpx(20);
       padding: 0 px2rpx(16) px2rpx(20);

+ 1 - 1
components/cwg-popup.vue

@@ -5,7 +5,7 @@
             <view class="dialog-header" v-if="title">
             <view class="dialog-header" v-if="title">
                 <text class="dialog-title">{{ title || t('Tips.DeleteAccount') }}</text>
                 <text class="dialog-title">{{ title || t('Tips.DeleteAccount') }}</text>
 
 
-                <uni-icons class="dialog-close1" type="closeempty" size="20" color="#999" @click="closeDialog" />
+                <uni-icons class="dialog-close1 cursor-pointer" :data-tooltip="t('Btn.Close')" type="closeempty" size="20" color="#999" @click="closeDialog" />
             </view>
             </view>
 
 
             <!-- 弹窗内容 -->
             <!-- 弹窗内容 -->

+ 2 - 2
components/cwg-right-drawer.vue

@@ -1,7 +1,7 @@
 <template>
 <template>
     <view class="notice-container">
     <view class="notice-container">
         <cwg-dropdown ref="dropdownRef" :menu-list="[]">
         <cwg-dropdown ref="dropdownRef" :menu-list="[]">
-            <view class="pc-header-btn">
+            <view class="pc-header-btn cursor-pointer" :data-tooltip="t('vu.tooltip.t100')">
                 <cwg-icon name="icon_my" color="#97A1C0" @click="openNotice" />
                 <cwg-icon name="icon_my" color="#97A1C0" @click="openNotice" />
             </view>
             </view>
             <template #btn>
             <template #btn>
@@ -13,7 +13,7 @@
                         <view class="ms-2">
                         <view class="ms-2">
                             <view class="fw-bold text-dark text-ellipsis mb-2">{{ _displayName }}</view>
                             <view class="fw-bold text-dark text-ellipsis mb-2">{{ _displayName }}</view>
                             <view class="text-body d-block lh-sm text-ellipsis mb-2">{{ _email }}</view>
                             <view class="text-body d-block lh-sm text-ellipsis mb-2">{{ _email }}</view>
-                            <text class="cid">CID: <text class="cwg-cursor" @click="copy(_displayCid)">{{ _displayCid
+                            <text class="cid">CID: <text class="cwg-cursor cursor-pointer cursor-pointer1" :data-tooltip="t('vu.tooltip.t102')" @click="copy(_displayCid)">{{ _displayCid
                                     }}</text></text>
                                     }}</text></text>
                         </view>
                         </view>
                     </view>
                     </view>

+ 1 - 1
components/cwg-system.vue

@@ -1,7 +1,7 @@
 <template>
 <template>
   <view class="cwg-system" v-if="systemMenuList.length">
   <view class="cwg-system" v-if="systemMenuList.length">
     <cwg-dropdown :menu-list="systemMenuList" @menuClick="handleMenuClick">
     <cwg-dropdown :menu-list="systemMenuList" @menuClick="handleMenuClick">
-      <view class="pc-header-btn">
+      <view class="pc-header-btn cursor-pointer" :data-tooltip="t('vu.system.title1')">
         <text class="current-system-name">{{ currentSystemName }}</text>
         <text class="current-system-name">{{ currentSystemName }}</text>
         <cwg-icon name="crm-chevron-down" :color="iconColor" darkColor="#000" :size="14" />
         <cwg-icon name="crm-chevron-down" :color="iconColor" darkColor="#000" :size="14" />
       </view>
       </view>

+ 2 - 2
components/cwg-tabel.vue

@@ -11,7 +11,7 @@
                         :style="getHeaderStyle(column)" @click="column.sortable && handleSort(column)">
                         :style="getHeaderStyle(column)" @click="column.sortable && handleSort(column)">
                         <view class="header-content">
                         <view class="header-content">
                             {{ column.label }}
                             {{ column.label }}
-                            <view v-if="column.sortable" class="sort-icon">
+                            <view v-if="column.sortable" class="sort-icon cursor-pointer" :data-tooltip="t('vu.tooltip.t14')">
                                 <uni-icons :type="getSortIcon(column)" :size="14" color="#999" />
                                 <uni-icons :type="getSortIcon(column)" :size="14" color="#999" />
                             </view>
                             </view>
                         </view>
                         </view>
@@ -170,7 +170,7 @@ import useUserStore from "@/stores/use-user-store";
 import { useI18n } from "vue-i18n";
 import { useI18n } from "vue-i18n";
 import { isRouteOnTop } from '@/utils/pageActive'
 import { isRouteOnTop } from '@/utils/pageActive'
 const userStore = useUserStore();
 const userStore = useUserStore();
-const { locale } = useI18n();
+const { t,locale } = useI18n();
 const props = defineProps({
 const props = defineProps({
     /**
     /**
      * 表格列配置(columns 数组中每一项是一个列配置对象)
      * 表格列配置(columns 数组中每一项是一个列配置对象)

+ 7 - 1
composables/useAccountOptions.js

@@ -55,7 +55,13 @@ export function useAccountOptions() {
     }
     }
 
 
     onMounted(() => {
     onMounted(() => {
-        // 缓存没有 → 才请求
+      // console.log('hook useAccountOptions mounted')
+      // console.log(loginOptions?.length)
+        if (loginOptions && loginOptions?.length > 0) {
+            isLoaded.value = true
+            isSuccess.value = true
+            return
+        }
         getDateList()
         getDateList()
     })
     })
 
 

+ 7 - 1
composables/useLeftSidebarCollapse.ts

@@ -1,15 +1,20 @@
 import { ref } from 'vue'
 import { ref } from 'vue'
 
 
 const isCollapsed = ref(false)
 const isCollapsed = ref(false)
+const isCollapsedByToggle = ref(false)
 
 
 function syncCollapsedFromDom() {
 function syncCollapsedFromDom() {
   if (typeof document === 'undefined') return
   if (typeof document === 'undefined') return
   const leftWindow = document.querySelector('uni-left-window')
   const leftWindow = document.querySelector('uni-left-window')
   isCollapsed.value = leftWindow?.classList.contains('collapsed') ?? false
   isCollapsed.value = leftWindow?.classList.contains('collapsed') ?? false
+  isCollapsedByToggle.value = isCollapsed.value
 }
 }
 
 
-function toggleLeftSidebar() {
+function toggleLeftSidebar(isFromToggle = true) {
   isCollapsed.value = !isCollapsed.value
   isCollapsed.value = !isCollapsed.value
+  if (isFromToggle) {
+    isCollapsedByToggle.value = isCollapsed.value
+  }
   const leftWindow = document.querySelector('uni-left-window')
   const leftWindow = document.querySelector('uni-left-window')
   const content = document.querySelector('uni-content')
   const content = document.querySelector('uni-content')
   if (!leftWindow || !content) return
   if (!leftWindow || !content) return
@@ -26,6 +31,7 @@ function toggleLeftSidebar() {
 export function useLeftSidebarCollapse() {
 export function useLeftSidebarCollapse() {
   return {
   return {
     isCollapsed,
     isCollapsed,
+    isCollapsedByToggle,
     toggleLeftSidebar,
     toggleLeftSidebar,
     syncCollapsedFromDom,
     syncCollapsedFromDom,
   }
   }

+ 2 - 2
hooks/useAppUpdate.ts

@@ -212,9 +212,9 @@ function removeStorageSync(key: string): boolean {
 
 
 export function useAppUpdate() {
 export function useAppUpdate() {
   const { t } = useI18n()
   const { t } = useI18n()
-  // const { Host80 } = config
+  const { Host80 } = config
   // 测试环境地址
   // 测试环境地址
-  const Host80 = 'https://secure.44a5c8109e4.com/'
+  // const Host80 = 'https://secure.44a5c8109e4.com/'
   const userStore = useUserStore()
   const userStore = useUserStore()
   const progress = useProgress()
   const progress = useProgress()
 
 

+ 22 - 9
locale/ar.json

@@ -31,8 +31,8 @@
     },
     },
     "Downloadpage": {
     "Downloadpage": {
       "item41": "تنزيل التطبيق",
       "item41": "تنزيل التطبيق",
-      "item42": "تنزيل تطبيق CWG Center",
-      "item43": "CWG Center App، منصة تداول متكاملة. مسح رمز الاستجابة السريعة أو تنزيلها بنقرة واحدة، تحديثات السوق المباشرة، تداول بسيط وفعال، سهولة التشغيل في أي وقت ومن أي مكان، لا تفوت أي فرصة استثمارية."
+      "item42": "قم بتنزيل تطبيق CWG Center",
+      "item43": "قم بإدارة حسابك، والوصول إلى تحليلات السوق، والانضمام إلى مجتمع التداول بالنسخ، كل ذلك في مكان واحد. امسح رمز QR أو انقر لتنزيل التطبيق بنقرة واحدة، مما يجعل إدارة الحساب واتخاذ قرارات التداول أكثر كفاءة وسهولة."
     },
     },
     "tradingCenter": {
     "tradingCenter": {
       "item71": "معادن ثمينة",
       "item71": "معادن ثمينة",
@@ -717,7 +717,8 @@
     "ResetPassword": "إعادة تعيين كلمة مرور التداول",
     "ResetPassword": "إعادة تعيين كلمة مرور التداول",
     "Upload": "تحميل ملفات",
     "Upload": "تحميل ملفات",
     "Search": "بحث",
     "Search": "بحث",
-    "Detail": "التفاصيل"
+    "Detail": "التفاصيل",
+    "Close": "إغلاق"
   },
   },
   "State": {
   "State": {
     "ToCertified": "التحقق بالفيديو",
     "ToCertified": "التحقق بالفيديو",
@@ -737,7 +738,11 @@
     "Complete": "مكتمل",
     "Complete": "مكتمل",
     "Participate": "يشارك",
     "Participate": "يشارك",
     "expireTime": "منتهي الصلاحية",
     "expireTime": "منتهي الصلاحية",
-    "Cancelled": "تم الالغاء"
+    "Cancelled": "تم الالغاء",
+    "Applied": "مطبق",
+    "Granted": "ممنوح",
+    "InTask": "في المهام",
+    "Ended": "منتهي"
   },
   },
   "Downloadpage": {
   "Downloadpage": {
     "item1": "مركز التنزيل",
     "item1": "مركز التنزيل",
@@ -1263,6 +1268,7 @@
       "NoticeItem4": "يتم قبول المستندات الأصلية فقط للتصوير. لا يتم قبول النسخ المطبوعة أو المصورة.",
       "NoticeItem4": "يتم قبول المستندات الأصلية فقط للتصوير. لا يتم قبول النسخ المطبوعة أو المصورة.",
       "NoticeItem5": "يرجى التأكد من أن وثيقة الهوية والوجه داخل الإطار المحدد من قبل النظام، مع صورة واضحة.",
       "NoticeItem5": "يرجى التأكد من أن وثيقة الهوية والوجه داخل الإطار المحدد من قبل النظام، مع صورة واضحة.",
       "NoticeItem6": "يجب إكمال عملية التحقق من قبل صاحب حساب التداول شخصيًا، ويجب أن يطابق الوجه صورة الهوية.",
       "NoticeItem6": "يجب إكمال عملية التحقق من قبل صاحب حساب التداول شخصيًا، ويجب أن يطابق الوجه صورة الهوية.",
+      "NoticeItem7": "يرجى التأكد من أن جهازك لا يستخدم شبكة VPN أو خادم وكيل أو أي أدوات شبكة مماثلة. قد يؤدي استخدام هذه الأدوات إلى عدم عرض رمز الاستجابة السريعة (QR) أو التعرف عليه بشكل صحيح، وقد يؤثر على التحقق من الوجه في عملية KYC. يُنصح بتعطيلها قبل متابعة عملية التحقق.",
       "VideoTitle": "فيديو تجريبي",
       "VideoTitle": "فيديو تجريبي",
       "VideoNotSupported": "المتصفح الخاص بك لا يدعم تشغيل الفيديو."
       "VideoNotSupported": "المتصفح الخاص بك لا يدعم تشغيل الفيديو."
     },
     },
@@ -1392,6 +1398,10 @@
       "AddressDescription": "المستندات التي يمكن استخدامها كإثبات على العنوان:",
       "AddressDescription": "المستندات التي يمكن استخدامها كإثبات على العنوان:",
       "AddressTip": "يرجى التأكد من إضافةعنوان السكن الحالي المتاح. في الخطوة اللاحقة سيُطلب منك تقديم إثبات على صحة العنوان"
       "AddressTip": "يرجى التأكد من إضافةعنوان السكن الحالي المتاح. في الخطوة اللاحقة سيُطلب منك تقديم إثبات على صحة العنوان"
     },
     },
+    "item1": "يرجى تحميل المستندات الإضافية المطلوبة وفقًا لمتطلبات التحقق:",
+    "item2": "1. يجب أن يكون محتوى المستند واضحًا وسهل القراءة، وأن تكون الصفحات كاملة دون أي حجب أو اقتطاع.",
+    "item3": "2. يجب ألا يتجاوز حجم الملف المرفوع 20 ميجابايت.",
+    "item4": "3. يرجى التأكد من أن المستندات المقدمة تتوافق مع متطلبات التحقق لتسهيل إتمام عملية المراجعة بسلاسة.",
     "Label": {
     "Label": {
       "CustomerType": "نوع العميل",
       "CustomerType": "نوع العميل",
       "CustomerType1": "شخصي",
       "CustomerType1": "شخصي",
@@ -1549,7 +1559,7 @@
       "agree25": " (لا توجد متطلبات حصص إضافية، يرجى الرجوع إلى خدمة عملاء CWGلمعرفة التفاصيل)",
       "agree25": " (لا توجد متطلبات حصص إضافية، يرجى الرجوع إلى خدمة عملاء CWGلمعرفة التفاصيل)",
       "PromoCode": "رمز ترويجي",
       "PromoCode": "رمز ترويجي",
       "Channel1": "التحويل البنكي",
       "Channel1": "التحويل البنكي",
-      "Channel2": "China UnionPay",
+      "Channel2": "البنك الالكتروني الصيني",
       "Channel3": "محفظة العملة المشفرة",
       "Channel3": "محفظة العملة المشفرة",
       "Channel4": "المحفظة الإلكترونية",
       "Channel4": "المحفظة الإلكترونية",
       "Tips": "نصائح : لا تقبل ودائع الاموال عن طريق التحويل البنكي من حسابات أخرى غير حسابك الخاص"
       "Tips": "نصائح : لا تقبل ودائع الاموال عن طريق التحويل البنكي من حسابات أخرى غير حسابك الخاص"
@@ -2020,7 +2030,7 @@
       "GoodThings": " Luxury Goods",
       "GoodThings": " Luxury Goods",
       "HouseholdDailyUse": " Household Daily-Use ",
       "HouseholdDailyUse": " Household Daily-Use ",
       "Automobile": " Automobile",
       "Automobile": " Automobile",
-      "Transaction": "Trading",
+      "Transaction": "عملية",
       "BoutiqueRecommendation": " Boutique Recommendation",
       "BoutiqueRecommendation": " Boutique Recommendation",
       "PointsExchanged": "Points redeemed:",
       "PointsExchanged": "Points redeemed:",
       "To": "Deliver to:",
       "To": "Deliver to:",
@@ -2259,7 +2269,8 @@
     "item4": "إذا لم تتمكن من النقر على الزر أعلاه يرجى نسخ الرابط الكامل أدناه ولصقه في شريط عنوان المتصفح الخاص بك ثم اضغط على Enter للذهاب إلى صفحة الدفع وإتمام المعاملة",
     "item4": "إذا لم تتمكن من النقر على الزر أعلاه يرجى نسخ الرابط الكامل أدناه ولصقه في شريط عنوان المتصفح الخاص بك ثم اضغط على Enter للذهاب إلى صفحة الدفع وإتمام المعاملة",
     "Or": "أو",
     "Or": "أو",
     "MarginLevel": "مستوى الهامش",
     "MarginLevel": "مستوى الهامش",
-    "RegDate": "تاريخ التسجيل"
+    "RegDate": "تاريخ التسجيل",
+    "Ali": "ألي باي"
   },
   },
   "AccountType": {
   "AccountType": {
     "ClassicAccount": "الحساب الكلاسيكي",
     "ClassicAccount": "الحساب الكلاسيكي",
@@ -2268,7 +2279,8 @@
     "ProfessionalAccount": "حساب للمحترفين",
     "ProfessionalAccount": "حساب للمحترفين",
     "StandardAccount": "حساب قياسي",
     "StandardAccount": "حساب قياسي",
     "CentAccount": "Cent Account",
     "CentAccount": "Cent Account",
-    "SpeedAccount": "حساب فوري"
+    "SpeedAccount": "حساب فوري",
+    "CommissionAccount": "حساب الحسم"
   },
   },
   "ApplicationDialog": {
   "ApplicationDialog": {
     "Des43": "فشل تطبيق حساب PAMM",
     "Des43": "فشل تطبيق حساب PAMM",
@@ -3141,7 +3153,8 @@
       "item19": "3. يجب أن يكون الحساب نشطًا (يجب إتمام معاملة واحدة على الأقل شهريًا).",
       "item19": "3. يجب أن يكون الحساب نشطًا (يجب إتمام معاملة واحدة على الأقل شهريًا).",
       "item20": "4. تُحسب الفائدة بناءً على رصيد الحساب اليومي، وتُدفع شهريًا بشكل تراكمي.",
       "item20": "4. تُحسب الفائدة بناءً على رصيد الحساب اليومي، وتُدفع شهريًا بشكل تراكمي.",
       "item21": "مثال: إذا كان متوسط الرصيد اليومي للعميل 10,000 دولار خلال فترة النشاط، يمكن للعميل أن يحصل على: فائدة يومية: 10,000 دولار × (4.5% ÷ 365) ≈ 1.23 دولار؛ إجمالي الأرباح خلال 3 أشهر: حوالي 110.7 دولار.",
       "item21": "مثال: إذا كان متوسط الرصيد اليومي للعميل 10,000 دولار خلال فترة النشاط، يمكن للعميل أن يحصل على: فائدة يومية: 10,000 دولار × (4.5% ÷ 365) ≈ 1.23 دولار؛ إجمالي الأرباح خلال 3 أشهر: حوالي 110.7 دولار.",
-      "item22": "5. يمكن للعملاء سحب الأموال في أي وقت، ولن يتم احتساب الفائدة على الجزء المنخفض من الرصيد؛ وسيستمر احتساب الفائدة على المبلغ المتبقي يوميًا."
+      "item22": "5. يمكن للعملاء سحب الأموال في أي وقت، ولن يتم احتساب الفائدة على الجزء المنخفض من الرصيد؛ وسيستمر احتساب الفائدة على المبلغ المتبقي يوميًا.",
+      "itemW2": "مردود نقدي"
     }
     }
   },
   },
   "wallet": {
   "wallet": {

+ 35 - 5
locale/cn.json

@@ -31,8 +31,8 @@
     },
     },
     "Downloadpage": {
     "Downloadpage": {
       "item41": "App 下载",
       "item41": "App 下载",
-      "item42": "CWG Center App 下载",
-      "item43": "CWG Center App,一站式交易平台。扫码或一键即可下载,行情实时更新,交易简单高效,随时随地轻松操作,不错过每一个投资良机。"
+      "item42": "CWG Center APP下载",
+      "item43": "将账户管理、市场分析与跟单社区装进口袋。扫码或点击一键下载APP,让账户管理与交易决策更加高效便捷。"
     },
     },
     "tradingCenter": {
     "tradingCenter": {
       "item71": "贵金属",
       "item71": "贵金属",
@@ -56,14 +56,37 @@
       "item1": "归档账户"
       "item1": "归档账户"
     },
     },
     "Btn": {
     "Btn": {
-      "More": "隐藏",
-      "Hide": "更多"
+      "More": "更多",
+      "Hide": "隐藏"
     },
     },
     "system": {
     "system": {
       "title1": "系统切换",
       "title1": "系统切换",
       "tip1": "获取系统列表失败",
       "tip1": "获取系统列表失败",
       "tip2": "仅支持在H5端切换系统",
       "tip2": "仅支持在H5端切换系统",
       "content": "是否切换系统?"
       "content": "是否切换系统?"
+    },
+    "tooltip": {
+      "t100": "用户信息",
+      "t101": "语言设置",
+      "t102": "复制CID",
+      "t103": "查看详情",
+      "t1": "选择时间",
+      "t2": "复制",
+      "t3": "文件",
+      "t4": "跳转{pageName}页面",
+      "t5": "公告",
+      "t6": "打开链接",
+      "t7": "刷新",
+      "t8": "点击下载",
+      "t9": "支付方式",
+      "t10": "添加",
+      "t11": "隐藏",
+      "t12": "显示",
+      "t13": "查看条款和条件",
+      "t14": "切换筛选",
+      "t15": "数据详情",
+      "t16": "预览",
+      "t17": "删除"
     }
     }
   },
   },
   "common": {
   "common": {
@@ -739,6 +762,7 @@
     "Detail": "详情",
     "Detail": "详情",
     "Confirm": "确认",
     "Confirm": "确认",
     "Cancel": "取消",
     "Cancel": "取消",
+    "Close": "关闭",
     "Submit": "提交",
     "Submit": "提交",
     "Editor": "编辑",
     "Editor": "编辑",
     "Delete": "删除",
     "Delete": "删除",
@@ -1323,6 +1347,7 @@
       "NoticeItem4": "仅接受原件拍摄,不接受打印件或复印件。",
       "NoticeItem4": "仅接受原件拍摄,不接受打印件或复印件。",
       "NoticeItem5": "请确保证件及人脸位于系统规定的取景框内,画面清晰。",
       "NoticeItem5": "请确保证件及人脸位于系统规定的取景框内,画面清晰。",
       "NoticeItem6": "认证操作必须由交易账户持有人本人完成,且人脸需与身份证照片保持一致。",
       "NoticeItem6": "认证操作必须由交易账户持有人本人完成,且人脸需与身份证照片保持一致。",
+      "NoticeItem7": "请确保设备未开启 VPN、代理服务器或类似网络工具。使用上述工具可能导致二维码无法正常显示或识别,并影响 KYC 人脸认证结果,建议关闭后再进行验证。",
       "VideoTitle": "演示视频",
       "VideoTitle": "演示视频",
       "VideoNotSupported": "您的浏览器不支持视频播放。"
       "VideoNotSupported": "您的浏览器不支持视频播放。"
     },
     },
@@ -1453,6 +1478,10 @@
       "AddressDescription": "可以用作地址证明的文件:",
       "AddressDescription": "可以用作地址证明的文件:",
       "AddressTip": "请您确保提供有效的当前居住地址。在随后的步骤中,您将被要求提供地址证明。"
       "AddressTip": "请您确保提供有效的当前居住地址。在随后的步骤中,您将被要求提供地址证明。"
     },
     },
+    "item1": "请根据审核要求上传相关附加文件,文件要求如下:",
+    "item2": "1.文件内容需清晰可读,页面完整无遮挡;",
+    "item3": "2.上传文件大小需小于 20MB;",
+    "item4": "3.请确保所提交文件与审核要求一致,以便顺利完成审核。",
     "Label": {
     "Label": {
       "CustomerType": "客户类型",
       "CustomerType": "客户类型",
       "CustomerType1": "个人",
       "CustomerType1": "个人",
@@ -2338,7 +2367,8 @@
     "StandardAccount": "标准账户",
     "StandardAccount": "标准账户",
     "CentAccount": "美分账户",
     "CentAccount": "美分账户",
     "SpeedAccount": "极速账户",
     "SpeedAccount": "极速账户",
-    "NewSpeedAccount": "极速账户"
+    "NewSpeedAccount": "极速账户",
+    "CommissionAccount": "佣金账号"
   },
   },
   "ApplicationDialog": {
   "ApplicationDialog": {
     "Des43": "申请PAMM账户失败",
     "Des43": "申请PAMM账户失败",

+ 22 - 9
locale/de.json

@@ -31,8 +31,8 @@
     },
     },
     "Downloadpage": {
     "Downloadpage": {
       "item41": "App Download",
       "item41": "App Download",
-      "item42": "CWG Center App Download",
-      "item43": "CWG Center App, eine All-in-One Handelsplattform. Scannen Sie den QR-Code oder laden Sie mit einem Klick herunter, Echtzeitmarktupdates, einfacher und effizienter Handel, einfach überall und jederzeit zu bedienen, verpassen Sie keine Investitionsmöglichkeit."
+      "item42": "Laden Sie die CWG Center App herunter",
+      "item43": "Verwalten Sie Ihr Konto, greifen Sie auf Marktanalysen zu und verbinden Sie sich mit der Copy-Trading-Community – alles an einem Ort. Scannen Sie den QR-Code oder klicken Sie, um die App mit nur einem Klick herunterzuladen und die Kontoverwaltung sowie Handelsentscheidungen effizienter und komfortabler zu gestalten."
     },
     },
     "tradingCenter": {
     "tradingCenter": {
       "item71": "Edelmetalle",
       "item71": "Edelmetalle",
@@ -717,7 +717,8 @@
     "ResetPassword": "Trading-Passwort zurücksetzen",
     "ResetPassword": "Trading-Passwort zurücksetzen",
     "Upload": "Dateien hochladen",
     "Upload": "Dateien hochladen",
     "Search": "Suchen",
     "Search": "Suchen",
-    "Detail": "Details"
+    "Detail": "Details",
+    "Close": "Schließen"
   },
   },
   "State": {
   "State": {
     "ToCertified": "Video-Verifizierung",
     "ToCertified": "Video-Verifizierung",
@@ -737,7 +738,11 @@
     "Complete": " Abgeschlossen ",
     "Complete": " Abgeschlossen ",
     "Participate": "Beteiligen",
     "Participate": "Beteiligen",
     "expireTime": "Abgelaufen",
     "expireTime": "Abgelaufen",
-    "Cancelled": "Storniert"
+    "Cancelled": "Storniert",
+    "Applied": "Beantragt",
+    "Granted": "Vergeben",
+    "InTask": "In Aufgabe",
+    "Ended": "Beendet"
   },
   },
   "Downloadpage": {
   "Downloadpage": {
     "item1": "Download-Center",
     "item1": "Download-Center",
@@ -1263,6 +1268,7 @@
       "NoticeItem4": "Nur Originaldokumente werden für die Aufnahme akzeptiert. Gedruckte Kopien oder Fotokopien werden nicht akzeptiert.",
       "NoticeItem4": "Nur Originaldokumente werden für die Aufnahme akzeptiert. Gedruckte Kopien oder Fotokopien werden nicht akzeptiert.",
       "NoticeItem5": "Bitte stellen Sie sicher, dass das Ausweisdokument und das Gesicht innerhalb des vom System festgelegten Rahmens sind, mit klarem Bild.",
       "NoticeItem5": "Bitte stellen Sie sicher, dass das Ausweisdokument und das Gesicht innerhalb des vom System festgelegten Rahmens sind, mit klarem Bild.",
       "NoticeItem6": "Die Verifizierungsoperation muss persönlich vom Kontoinhaber des Handelskontos durchgeführt werden, und das Gesicht muss mit dem Ausweisfoto übereinstimmen.",
       "NoticeItem6": "Die Verifizierungsoperation muss persönlich vom Kontoinhaber des Handelskontos durchgeführt werden, und das Gesicht muss mit dem Ausweisfoto übereinstimmen.",
+      "NoticeItem7": "Bitte stellen Sie sicher, dass Ihr Gerät kein VPN, keinen Proxy-Server oder ähnliche Netzwerktools verwendet. Die Verwendung solcher Tools kann dazu führen, dass der QR-Code nicht korrekt angezeigt oder erkannt wird und die KYC-Gesichtsverifizierung beeinträchtigt wird. Es wird empfohlen, diese vor der Verifizierung zu deaktivieren.",
       "VideoTitle": "Demo-Video",
       "VideoTitle": "Demo-Video",
       "VideoNotSupported": "Ihr Browser unterstützt keine Videowiedergabe."
       "VideoNotSupported": "Ihr Browser unterstützt keine Videowiedergabe."
     },
     },
@@ -1392,6 +1398,10 @@
       "AddressDescription": "Dokumente, die als Adressnachweis verwendet werden können:",
       "AddressDescription": "Dokumente, die als Adressnachweis verwendet werden können:",
       "AddressTip": "Achten Sie bitte darauf, dass Sie die gültige aktuelle Wohnadresse angeben. Im späteren Schritt werden Sie aufgefordert, einen Adressnachweis zu erbringen."
       "AddressTip": "Achten Sie bitte darauf, dass Sie die gültige aktuelle Wohnadresse angeben. Im späteren Schritt werden Sie aufgefordert, einen Adressnachweis zu erbringen."
     },
     },
+    "item1": "Bitte laden Sie die erforderlichen zusätzlichen Dokumente gemäß den Verifizierungsanforderungen hoch:",
+    "item2": "1. Der Inhalt des Dokuments muss klar und gut lesbar sein; die Seiten müssen vollständig und dürfen weder verdeckt noch abgeschnitten sein.",
+    "item3": "2. Die hochgeladene Datei muss kleiner als 20 MB sein.",
+    "item4": "3. Bitte stellen Sie sicher, dass die eingereichten Dokumente den Verifizierungsanforderungen entsprechen, damit die Prüfung reibungslos abgeschlossen werden kann.",
     "Label": {
     "Label": {
       "CustomerType": "Kundentyp",
       "CustomerType": "Kundentyp",
       "CustomerType1": "Persönlich",
       "CustomerType1": "Persönlich",
@@ -1549,7 +1559,7 @@
       "agree25": "(Es sind keine zusätzlichen Lose erforderlich, bitte wenden Sie sich für Details an den CWG-Kundendienst)",
       "agree25": "(Es sind keine zusätzlichen Lose erforderlich, bitte wenden Sie sich für Details an den CWG-Kundendienst)",
       "PromoCode": "Gutscheincode",
       "PromoCode": "Gutscheincode",
       "Channel1": "Banküberweisung",
       "Channel1": "Banküberweisung",
-      "Channel2": "China UnionPay",
+      "Channel2": "China Online Banking",
       "Channel3": "Kryptowährung Wallet",
       "Channel3": "Kryptowährung Wallet",
       "Channel4": "Elektronische Geldbörse",
       "Channel4": "Elektronische Geldbörse",
       "Tips": "Hinweise: Akzeptieren Sie keine Einzahlungen per Banküberweisung von anderen Konten als Ihrem eigenen."
       "Tips": "Hinweise: Akzeptieren Sie keine Einzahlungen per Banküberweisung von anderen Konten als Ihrem eigenen."
@@ -2020,7 +2030,7 @@
       "GoodThings": " Luxury Goods",
       "GoodThings": " Luxury Goods",
       "HouseholdDailyUse": " Household Daily-Use ",
       "HouseholdDailyUse": " Household Daily-Use ",
       "Automobile": " Automobile",
       "Automobile": " Automobile",
-      "Transaction": "Trading",
+      "Transaction": "Transaktion",
       "BoutiqueRecommendation": " Boutique Recommendation",
       "BoutiqueRecommendation": " Boutique Recommendation",
       "PointsExchanged": "Points redeemed:",
       "PointsExchanged": "Points redeemed:",
       "To": "Deliver to:",
       "To": "Deliver to:",
@@ -2259,7 +2269,8 @@
     "item4": "Wenn Sie nicht auf die obige Schaltfläche klicken können kopieren Sie bitte die vollständige URL unten fügen Sie sie in die Adressleiste Ihres Browsers ein und drücken Sie die Eingabetaste um zur Zahlungsseite zu gelangen und die Transaktion abzuschließen",
     "item4": "Wenn Sie nicht auf die obige Schaltfläche klicken können kopieren Sie bitte die vollständige URL unten fügen Sie sie in die Adressleiste Ihres Browsers ein und drücken Sie die Eingabetaste um zur Zahlungsseite zu gelangen und die Transaktion abzuschließen",
     "Or": "Oder",
     "Or": "Oder",
     "MarginLevel": "Margin Level",
     "MarginLevel": "Margin Level",
-    "RegDate": "Registrierungsdatum"
+    "RegDate": "Registrierungsdatum",
+    "Ali": "Alipay"
   },
   },
   "AccountType": {
   "AccountType": {
     "ClassicAccount": "Klassisches Konto",
     "ClassicAccount": "Klassisches Konto",
@@ -2268,7 +2279,8 @@
     "ProfessionalAccount": "Professionelles Konto",
     "ProfessionalAccount": "Professionelles Konto",
     "StandardAccount": "Standardkonto",
     "StandardAccount": "Standardkonto",
     "CentAccount": "Cent Account",
     "CentAccount": "Cent Account",
-    "SpeedAccount": "Sofortkonto"
+    "SpeedAccount": "Sofortkonto",
+    "CommissionAccount": "Kommissions Konto"
   },
   },
   "ApplicationDialog": {
   "ApplicationDialog": {
     "Des43": "Die Bewerbung für ein PAMM-Konto ist fehlgeschlagen",
     "Des43": "Die Bewerbung für ein PAMM-Konto ist fehlgeschlagen",
@@ -3140,7 +3152,8 @@
       "item19": "3. Das Konto muss aktiv sein (mindestens eine Transaktion pro Monat abschließen).",
       "item19": "3. Das Konto muss aktiv sein (mindestens eine Transaktion pro Monat abschließen).",
       "item20": "4. Zinsen werden basierend auf dem täglichen Kontostand berechnet und monatlich kumulativ ausgezahlt.",
       "item20": "4. Zinsen werden basierend auf dem täglichen Kontostand berechnet und monatlich kumulativ ausgezahlt.",
       "item21": "Beispiel: Wenn der durchschnittliche tägliche Kontostand eines Kunden 10.000 $ beträgt, kann der Kunde während des Aktivitätszeitraums folgende Erträge erzielen: Tägliche Zinsen: 10.000 $ × (4,5 % ÷ 365) ≈ 1,23 $; Gesamterträge über 3 Monate: ca. 110,7 $.",
       "item21": "Beispiel: Wenn der durchschnittliche tägliche Kontostand eines Kunden 10.000 $ beträgt, kann der Kunde während des Aktivitätszeitraums folgende Erträge erzielen: Tägliche Zinsen: 10.000 $ × (4,5 % ÷ 365) ≈ 1,23 $; Gesamterträge über 3 Monate: ca. 110,7 $.",
-      "item22": "5. Kunden können jederzeit Geld abheben. Der verringerte Kontostand wird nicht mehr verzinst; der verbleibende Betrag wird weiterhin täglich verzinst."
+      "item22": "5. Kunden können jederzeit Geld abheben. Der verringerte Kontostand wird nicht mehr verzinst; der verbleibende Betrag wird weiterhin täglich verzinst.",
+      "itemW2": "Cashback"
     }
     }
   },
   },
   "wallet": {
   "wallet": {

+ 18 - 7
locale/en.json

@@ -31,8 +31,8 @@
     },
     },
     "Downloadpage": {
     "Downloadpage": {
       "item41": "App Download",
       "item41": "App Download",
-      "item42": "CWG Center App Download",
-      "item43": "CWG Center App, one-stop trading platform. Scan the QR code or download with one click, real-time market updates, simple and efficient trading, easy to operate anytime, anywhere, never miss any investment opportunity."
+      "item42": "Download the CWG Center App",
+      "item43": "Manage your account, access market analysis, and connect with the copy trading community—all in one place. Scan the QR code or click to download the app with one tap, making account management and trading decisions more efficient and convenient."
     },
     },
     "tradingCenter": {
     "tradingCenter": {
       "item71": "Precious Metals",
       "item71": "Precious Metals",
@@ -755,7 +755,8 @@
     "Upload": "Upload Files",
     "Upload": "Upload Files",
     "Search": "Search",
     "Search": "Search",
     "More": "More",
     "More": "More",
-    "Hide": "Hide"
+    "Hide": "Hide",
+    "Close": "Close"
   },
   },
   "State": {
   "State": {
     "ToCertified": "Video Verification",
     "ToCertified": "Video Verification",
@@ -775,7 +776,11 @@
     "Complete": "Completed",
     "Complete": "Completed",
     "Participate": "Participate",
     "Participate": "Participate",
     "expireTime": "Expired",
     "expireTime": "Expired",
-    "Cancelled": "Cancelled"
+    "Cancelled": "Cancelled",
+    "Applied": "Applied",
+    "Granted": "Granted",
+    "InTask": "In Task",
+    "Ended": "Ended"
   },
   },
   "Downloadpage": {
   "Downloadpage": {
     "item1": "Trading Platform",
     "item1": "Trading Platform",
@@ -1303,6 +1308,7 @@
       "NoticeItem4": "Only original documents are accepted for shooting. Printed copies or photocopies are not accepted.",
       "NoticeItem4": "Only original documents are accepted for shooting. Printed copies or photocopies are not accepted.",
       "NoticeItem5": "Please ensure that the ID document and face are within the system's specified frame, with clear image.",
       "NoticeItem5": "Please ensure that the ID document and face are within the system's specified frame, with clear image.",
       "NoticeItem6": "The verification operation must be completed by the trading account holder personally, and the face must match the ID photo.",
       "NoticeItem6": "The verification operation must be completed by the trading account holder personally, and the face must match the ID photo.",
+      "NoticeItem7": "Please make sure your device is not using a VPN, proxy server, or similar network tools. Using these tools may prevent the QR code from displaying or being recognized properly, and may affect KYC facial verification. It is recommended to disable them before proceeding with verification.",
       "VideoTitle": "Demo Video",
       "VideoTitle": "Demo Video",
       "VideoNotSupported": "Your browser does not support video playback."
       "VideoNotSupported": "Your browser does not support video playback."
     },
     },
@@ -1432,6 +1438,10 @@
       "AddressDescription": "Documents that can be used as proof of address:",
       "AddressDescription": "Documents that can be used as proof of address:",
       "AddressTip": "Kindly make sure you are provided the valid current residential address. At the later step you will be requested to provide a proof of address."
       "AddressTip": "Kindly make sure you are provided the valid current residential address. At the later step you will be requested to provide a proof of address."
     },
     },
+    "item1": "Please upload the required Additional Documents according to the verification requirements:",
+    "item2": "1. The document content must be clear and legible, with complete pages and no obstructions or cropped sections.",
+    "item3": "2. The uploaded file size must be less than 20MB.",
+    "item4": "3. Please ensure that the submitted documents meet the verification requirements to facilitate a smooth review process.",
     "Label": {
     "Label": {
       "CustomerType": "Customer Type",
       "CustomerType": "Customer Type",
       "CustomerType1": "Personal",
       "CustomerType1": "Personal",
@@ -1589,7 +1599,7 @@
       "agree25": "(There is no additional lots requirement, please consult CWG customer service for details)",
       "agree25": "(There is no additional lots requirement, please consult CWG customer service for details)",
       "PromoCode": "Promo Code",
       "PromoCode": "Promo Code",
       "Channel1": "Bank Transfer",
       "Channel1": "Bank Transfer",
-      "Channel2": "China UnionPay",
+      "Channel2": "China Online Banking",
       "Channel3": "Cryptocurrency Wallet",
       "Channel3": "Cryptocurrency Wallet",
       "Channel4": "Electronic Wallet",
       "Channel4": "Electronic Wallet",
       "Tips": "Tips:Not accept deposits by wire transfer from accounts other than your own",
       "Tips": "Tips:Not accept deposits by wire transfer from accounts other than your own",
@@ -2062,7 +2072,7 @@
       "GoodThings": " Luxury Goods",
       "GoodThings": " Luxury Goods",
       "HouseholdDailyUse": " Household Daily-Use ",
       "HouseholdDailyUse": " Household Daily-Use ",
       "Automobile": " Automobile",
       "Automobile": " Automobile",
-      "Transaction": "Trading",
+      "Transaction": "Transaction",
       "BoutiqueRecommendation": " Boutique Recommendation",
       "BoutiqueRecommendation": " Boutique Recommendation",
       "PointsExchanged": "Points redeemed:",
       "PointsExchanged": "Points redeemed:",
       "To": "Deliver to:",
       "To": "Deliver to:",
@@ -2313,7 +2323,8 @@
     "ProfessionalAccount": "Professional Account",
     "ProfessionalAccount": "Professional Account",
     "StandardAccount": "Standard Account",
     "StandardAccount": "Standard Account",
     "CentAccount": "Cent Account",
     "CentAccount": "Cent Account",
-    "SpeedAccount": "Speed Account"
+    "SpeedAccount": "Speed Account",
+    "CommissionAccount": "Commission Account"
   },
   },
   "ApplicationDialog": {
   "ApplicationDialog": {
     "Des43": "PAMM Account Application Failed",
     "Des43": "PAMM Account Application Failed",

+ 22 - 9
locale/es.json

@@ -31,8 +31,8 @@
     },
     },
     "Downloadpage": {
     "Downloadpage": {
       "item41": "Descarga de App",
       "item41": "Descarga de App",
-      "item42": "Descarga de CWG Center App",
-      "item43": "CWG Center App, plataforma de trading todo en uno. Escanee el código QR o descargue con un clic, actualizaciones de mercado en tiempo real, trading simple y eficiente, fácil de operar en cualquier momento y lugar, no pierda ninguna oportunidad de inversión."
+      "item42": "Descargue la aplicación CWG Center",
+      "item43": "Gestione su cuenta, acceda a análisis de mercado y conéctese con la comunidad de copy trading, todo en un solo lugar. Escanee el código QR o haga clic para descargar la aplicación con un solo toque, haciendo que la gestión de cuentas y la toma de decisiones de trading sean más eficientes y convenientes."
     },
     },
     "tradingCenter": {
     "tradingCenter": {
       "item71": "Metales Preciosos",
       "item71": "Metales Preciosos",
@@ -717,7 +717,8 @@
     "ResetPassword": "Restablecer contraseña de operaciones",
     "ResetPassword": "Restablecer contraseña de operaciones",
     "Upload": "Subir archivos",
     "Upload": "Subir archivos",
     "Search": "Buscar",
     "Search": "Buscar",
-    "Detail": "Detalles"
+    "Detail": "Detalles",
+    "Close": "Cerrar"
   },
   },
   "State": {
   "State": {
     "ToCertified": "Verificación por Video",
     "ToCertified": "Verificación por Video",
@@ -737,7 +738,11 @@
     "Complete": "Completado",
     "Complete": "Completado",
     "Participate": "Participar",
     "Participate": "Participar",
     "expireTime": "Vencido",
     "expireTime": "Vencido",
-    "Cancelled": "Cancelado"
+    "Cancelled": "Cancelado",
+    "Applied": "Aplicado",
+    "Granted": "Concedido",
+    "InTask": "En Tarea",
+    "Ended": "Finalizado"
   },
   },
   "Downloadpage": {
   "Downloadpage": {
     "item1": "Descargas",
     "item1": "Descargas",
@@ -1263,6 +1268,7 @@
       "NoticeItem4": "Solo se aceptan documentos originales para la toma. No se aceptan copias impresas o fotocopias.",
       "NoticeItem4": "Solo se aceptan documentos originales para la toma. No se aceptan copias impresas o fotocopias.",
       "NoticeItem5": "Por favor asegúrese de que el documento de identificación y la cara estén dentro del marco especificado por el sistema, con imagen clara.",
       "NoticeItem5": "Por favor asegúrese de que el documento de identificación y la cara estén dentro del marco especificado por el sistema, con imagen clara.",
       "NoticeItem6": "La operación de verificación debe ser completada por el titular de la cuenta de trading personalmente, y la cara debe coincidir con la foto de identificación.",
       "NoticeItem6": "La operación de verificación debe ser completada por el titular de la cuenta de trading personalmente, y la cara debe coincidir con la foto de identificación.",
+      "NoticeItem7": "Por favor, asegúrese de que su dispositivo no esté utilizando una VPN, servidor proxy u otras herramientas de red similares. El uso de estas herramientas puede impedir que el código QR se muestre o se reconozca correctamente y afectar la verificación facial KYC. Se recomienda desactivarlas antes de continuar con la verificación.",
       "VideoTitle": "Video Demostrativo",
       "VideoTitle": "Video Demostrativo",
       "VideoNotSupported": "Su navegador no admite la reproducción de video."
       "VideoNotSupported": "Su navegador no admite la reproducción de video."
     },
     },
@@ -1392,6 +1398,10 @@
       "AddressDescription": "Documents that can be used as proof of address:",
       "AddressDescription": "Documents that can be used as proof of address:",
       "AddressTip": "Asegúrese de que se le proporciona la dirección de residencia actual válida. En el paso posterior se le pedirá un comprobante de domicilio."
       "AddressTip": "Asegúrese de que se le proporciona la dirección de residencia actual válida. En el paso posterior se le pedirá un comprobante de domicilio."
     },
     },
+    "item1": "Por favor, cargue los Documentos Adicionales requeridos de acuerdo con los requisitos de verificación:",
+    "item2": "1. El contenido del documento debe ser claro y legible, con páginas completas y sin obstrucciones ni recortes.",
+    "item3": "2. El tamaño del archivo cargado debe ser inferior a 20 MB.",
+    "item4": "3. Asegúrese de que los documentos enviados cumplan con los requisitos de verificación para facilitar un proceso de revisión sin inconvenientes.",
     "Label": {
     "Label": {
       "CustomerType": "Tipo de cliente",
       "CustomerType": "Tipo de cliente",
       "CustomerType1": "Personal",
       "CustomerType1": "Personal",
@@ -1549,7 +1559,7 @@
       "agree25": "(No hay ningún requisito de lotes adicionales, consulta con el servicio de atención al cliente de CWG para más detalles)",
       "agree25": "(No hay ningún requisito de lotes adicionales, consulta con el servicio de atención al cliente de CWG para más detalles)",
       "PromoCode": "Código promocional",
       "PromoCode": "Código promocional",
       "Channel1": "Transferencia bancaria",
       "Channel1": "Transferencia bancaria",
-      "Channel2": "China UnionPay",
+      "Channel2": "Banca en Línea China",
       "Channel3": "Billetera de criptomonedas",
       "Channel3": "Billetera de criptomonedas",
       "Channel4": "Cartera electrónica",
       "Channel4": "Cartera electrónica",
       "Tips": "Consejos:No aceptes depósitos por transferencia bancaria desde otras cuentas que no sean las tuyas"
       "Tips": "Consejos:No aceptes depósitos por transferencia bancaria desde otras cuentas que no sean las tuyas"
@@ -2020,7 +2030,7 @@
       "GoodThings": " Luxury Goods",
       "GoodThings": " Luxury Goods",
       "HouseholdDailyUse": " Household Daily-Use ",
       "HouseholdDailyUse": " Household Daily-Use ",
       "Automobile": " Automobile",
       "Automobile": " Automobile",
-      "Transaction": "Trading",
+      "Transaction": "Transacción",
       "BoutiqueRecommendation": " Boutique Recommendation",
       "BoutiqueRecommendation": " Boutique Recommendation",
       "PointsExchanged": "Points redeemed:",
       "PointsExchanged": "Points redeemed:",
       "To": "Deliver to:",
       "To": "Deliver to:",
@@ -2259,7 +2269,8 @@
     "item4": "Si no puede hacer clic en el botón de arriba copie la URL completa a continuación péguela en la barra de direcciones de su navegador y presione Enter para ir a la página de pago y completar la transacción",
     "item4": "Si no puede hacer clic en el botón de arriba copie la URL completa a continuación péguela en la barra de direcciones de su navegador y presione Enter para ir a la página de pago y completar la transacción",
     "Or": "O",
     "Or": "O",
     "MarginLevel": "Nivel de Margen",
     "MarginLevel": "Nivel de Margen",
-    "RegDate": "Fecha de Registro"
+    "RegDate": "Fecha de Registro",
+    "Ali": "Alipay"
   },
   },
   "AccountType": {
   "AccountType": {
     "ClassicAccount": "Cuenta clásica",
     "ClassicAccount": "Cuenta clásica",
@@ -2268,7 +2279,8 @@
     "ProfessionalAccount": "Cuenta profesional",
     "ProfessionalAccount": "Cuenta profesional",
     "StandardAccount": "Cuenta Estándar",
     "StandardAccount": "Cuenta Estándar",
     "CentAccount": "Cent Account",
     "CentAccount": "Cent Account",
-    "SpeedAccount": "Cuenta Instantánea"
+    "SpeedAccount": "Cuenta Instantánea",
+    "CommissionAccount": "Cuenta de comisión"
   },
   },
   "ApplicationDialog": {
   "ApplicationDialog": {
     "Des43": "La solicitud de cuenta PAMM ha fallado",
     "Des43": "La solicitud de cuenta PAMM ha fallado",
@@ -3141,7 +3153,8 @@
       "item19": "3. La cuenta debe estar activa (realizar al menos una transacción al mes).",
       "item19": "3. La cuenta debe estar activa (realizar al menos una transacción al mes).",
       "item20": "4. Los intereses se calculan en base al saldo diario de la cuenta y se acumulan mensualmente.",
       "item20": "4. Los intereses se calculan en base al saldo diario de la cuenta y se acumulan mensualmente.",
       "item21": "Ejemplo: Si el saldo diario promedio de un cliente es de $10,000, durante el período del evento puede ganar: Interés diario: $10,000 × (4.5% ÷ 365) ≈ $1.23; Ganancias totales en 3 meses: aproximadamente $110.7.",
       "item21": "Ejemplo: Si el saldo diario promedio de un cliente es de $10,000, durante el período del evento puede ganar: Interés diario: $10,000 × (4.5% ÷ 365) ≈ $1.23; Ganancias totales en 3 meses: aproximadamente $110.7.",
-      "item22": "5. Los clientes pueden retirar fondos en cualquier momento. La parte reducida del saldo ya no generará intereses; el saldo restante continuará ganando intereses diarios."
+      "item22": "5. Los clientes pueden retirar fondos en cualquier momento. La parte reducida del saldo ya no generará intereses; el saldo restante continuará ganando intereses diarios.",
+      "itemW2": "Reembolso"
     }
     }
   },
   },
   "wallet": {
   "wallet": {

+ 28 - 15
locale/fa.json

@@ -31,8 +31,8 @@
     },
     },
     "Downloadpage": {
     "Downloadpage": {
       "item41": "دانلود اپ",
       "item41": "دانلود اپ",
-      "item42": "دانلود CWG Center App",
-      "item43": "CWG Center App، پلتفرم معاملاتی一站式. اسکن کد QR یا دانلود با یک کلیک، به روزرسانی بازار به صورت لحظه‌ای، معامله ساده و کارآمد، آسان در هر زمان و مکان، از هیچ شانس سرمایه‌گذاری‌ای بی‌خبر نمانید."
+      "item42": "اپلیکیشن CWG Center را دانلود کنید",
+      "item43": "حساب خود را مدیریت کنید، به تحلیل‌های بازار دسترسی داشته باشید و به جامعه کپی تریدینگ متصل شوید؛ همه در یک مکان. کد QR را اسکن کنید یا برای دانلود اپلیکیشن با یک کلیک اقدام کنید تا مدیریت حساب و تصمیم‌گیری‌های معاملاتی شما کارآمدتر و آسان‌تر شود."
     },
     },
     "tradingCenter": {
     "tradingCenter": {
       "item71": "فلزات گرانبها",
       "item71": "فلزات گرانبها",
@@ -662,13 +662,13 @@
     "agree1": " من موافقت می‌کنم که ایمیل‌های بازاریابی در مورد محصولات، خدمات، تبلیغات و اخبار از CWG Markets دریافت کنم. متوجه هستم که در هر زمان می‌توانم از دریافت ایمیل‌ها انصراف دهم.",
     "agree1": " من موافقت می‌کنم که ایمیل‌های بازاریابی در مورد محصولات، خدمات، تبلیغات و اخبار از CWG Markets دریافت کنم. متوجه هستم که در هر زمان می‌توانم از دریافت ایمیل‌ها انصراف دهم.",
     "agree2": "من حداقل 18 ساله هستم.",
     "agree2": "من حداقل 18 ساله هستم.",
     "button": "ادامه",
     "button": "ادامه",
-    "agreement1": "لطفاً برای تأیید که تمام اطلاعات مقاله را خوانده، درک کرده و به تمام موارد آن موافقت دارید، دکمه 'ادامه' را بزنید ",
-    "agreement2": "قرارداد مشتری",
-    "agreement3": " و ",
-    "agreement4": "شرایط خدمات",
-    "agreement5": " و شرایط موجود در اسناد زیر را مطالعه کنید: ",
-    "agreement6": "سیاست حفاظت از حریم خصوصی",
-    "agreement7": ".",
+    "agreemnet1": "لطفاً برای تأیید که تمام اطلاعات مقاله را خوانده، درک کرده و به تمام موارد آن موافقت دارید، دکمه 'ادامه' را بزنید ",
+    "agreemnet2": "قرارداد مشتری",
+    "agreemnet3": " و ",
+    "agreemnet4": "شرایط خدمات",
+    "agreemnet5": " و شرایط موجود در اسناد زیر را مطالعه کنید: ",
+    "agreemnet6": "سیاست حفاظت از حریم خصوصی",
+    "agreemnet7": ".",
     "ageRestriction": "بر اساس الزامات مقرراتی، معاملات CFD محدود به افرادی است که 18 سال یا بیشتر دارند. درخواست شما در حال حاضر قابل پیگیری نیست."
     "ageRestriction": "بر اساس الزامات مقرراتی، معاملات CFD محدود به افرادی است که 18 سال یا بیشتر دارند. درخواست شما در حال حاضر قابل پیگیری نیست."
   },
   },
   "placeholder": {
   "placeholder": {
@@ -717,7 +717,8 @@
     "ResetPassword": "تنظیم مجدد رمز عبور تجاری",
     "ResetPassword": "تنظیم مجدد رمز عبور تجاری",
     "Upload": "آپلود فایل‌ها",
     "Upload": "آپلود فایل‌ها",
     "Search": "جستجو",
     "Search": "جستجو",
-    "Detail": "جزئیات"
+    "Detail": "جزئیات",
+    "Close": "بستن"
   },
   },
   "State": {
   "State": {
     "ToCertified": "احراز هویت ویدیویی",
     "ToCertified": "احراز هویت ویدیویی",
@@ -737,7 +738,11 @@
     "Complete": "تکمیل شده",
     "Complete": "تکمیل شده",
     "Participate": "شرکت کنید",
     "Participate": "شرکت کنید",
     "expireTime": "منقضی شده",
     "expireTime": "منقضی شده",
-    "Cancelled": "لغو شده"
+    "Cancelled": "لغو شده",
+    "Applied": "اعمال شد",
+    "Granted": "منحل شد",
+    "InTask": "در تسک",
+    "Ended": "پایان یافت"
   },
   },
   "Downloadpage": {
   "Downloadpage": {
     "item1": "پلتفرم معاملاتی",
     "item1": "پلتفرم معاملاتی",
@@ -1263,6 +1268,7 @@
       "NoticeItem4": "فقط اسناد اصلی برای عکس‌برداری پذیرفته می‌شوند. نسخه‌های چاپی یا فتوکپی پذیرفته نمی‌شوند.",
       "NoticeItem4": "فقط اسناد اصلی برای عکس‌برداری پذیرفته می‌شوند. نسخه‌های چاپی یا فتوکپی پذیرفته نمی‌شوند.",
       "NoticeItem5": "لطفاً اطمینان حاصل کنید که سند هویت و چهره در قاب مشخص شده توسط سیستم قرار دارند، با تصویر واضح.",
       "NoticeItem5": "لطفاً اطمینان حاصل کنید که سند هویت و چهره در قاب مشخص شده توسط سیستم قرار دارند، با تصویر واضح.",
       "NoticeItem6": "عملیات تأیید باید توسط صاحب حساب معاملاتی به صورت شخصی تکمیل شود و چهره باید با عکس هویت مطابقت داشته باشد.",
       "NoticeItem6": "عملیات تأیید باید توسط صاحب حساب معاملاتی به صورت شخصی تکمیل شود و چهره باید با عکس هویت مطابقت داشته باشد.",
+      "NoticeItem7": "لطفاً مطمئن شوید که دستگاه شما از VPN، سرور پروکسی یا ابزارهای شبکه مشابه استفاده نمی‌کند. استفاده از این ابزارها ممکن است باعث شود کد QR به‌درستی نمایش داده یا شناسایی نشود و بر تأیید چهره در فرآیند KYC تأثیر بگذارد. توصیه می‌شود قبل از ادامه تأیید، آن‌ها را غیرفعال کنید.",
       "VideoTitle": "ویدیوی نمایشی",
       "VideoTitle": "ویدیوی نمایشی",
       "VideoNotSupported": "مرورگر شما پخش ویدیو را پشتیبانی نمی‌کند."
       "VideoNotSupported": "مرورگر شما پخش ویدیو را پشتیبانی نمی‌کند."
     },
     },
@@ -1392,6 +1398,10 @@
       "AddressDescription": "اسنادی که می‌توان به عنوان اثبات آدرس استفاده کرد:",
       "AddressDescription": "اسنادی که می‌توان به عنوان اثبات آدرس استفاده کرد:",
       "AddressTip": "لطفاً مطمئن شوید که آدرس اقامت فعلی معتبری را ارائه داده‌اید. در مرحله‌ی بعد از شما خواسته می‌شود که اثبات آدرس ارائه دهید."
       "AddressTip": "لطفاً مطمئن شوید که آدرس اقامت فعلی معتبری را ارائه داده‌اید. در مرحله‌ی بعد از شما خواسته می‌شود که اثبات آدرس ارائه دهید."
     },
     },
+    "item1": "لطفاً اسناد تکمیلی موردنیاز را مطابق با الزامات تأیید هویت بارگذاری کنید:",
+    "item2": "1. محتوای سند باید واضح و خوانا باشد و صفحات به‌صورت کامل و بدون پوشیدگی یا برش ارائه شوند.",
+    "item3": "2. حجم فایل بارگذاری‌شده باید کمتر از 20 مگابایت باشد.",
+    "item4": "3. لطفاً اطمینان حاصل کنید که اسناد ارسالی با الزامات تأیید هویت مطابقت دارند تا فرآیند بررسی به‌صورت روان تکمیل شود.",
     "Label": {
     "Label": {
       "CustomerType": "نوع مشتری",
       "CustomerType": "نوع مشتری",
       "CustomerType1": "شخصی",
       "CustomerType1": "شخصی",
@@ -1549,7 +1559,7 @@
       "agree25": "(نیازی به مقدار لات اضافی نیست، لطفاً برای جزئیات با خدمات مشتری CWG مشورت کنید)",
       "agree25": "(نیازی به مقدار لات اضافی نیست، لطفاً برای جزئیات با خدمات مشتری CWG مشورت کنید)",
       "PromoCode": "کد تبلیغاتی",
       "PromoCode": "کد تبلیغاتی",
       "Channel1": "انتقال بانکی",
       "Channel1": "انتقال بانکی",
-      "Channel2": "China UnionPay",
+      "Channel2": "بانکداری آنلاین چین",
       "Channel3": "کیف پول ارز دیجیتال",
       "Channel3": "کیف پول ارز دیجیتال",
       "Channel4": "کیف پول الکترونیکی",
       "Channel4": "کیف پول الکترونیکی",
       "Tips": "نکات: واریز از حساب‌های دیگر به جز حساب شخصی خود قابل قبول نمی‌باشد"
       "Tips": "نکات: واریز از حساب‌های دیگر به جز حساب شخصی خود قابل قبول نمی‌باشد"
@@ -2259,7 +2269,8 @@
     "item4": "اگر نمی توانید روی دکمه بالا کلیک کنید لطفاً آدرس اینترنتی کامل زیر را کپی کرده و در نوار آدرس مرورگر خود قرار داده و Enter را بزنید تا به صفحه پرداخت رفته و تراکنش را تکمیل کنید",
     "item4": "اگر نمی توانید روی دکمه بالا کلیک کنید لطفاً آدرس اینترنتی کامل زیر را کپی کرده و در نوار آدرس مرورگر خود قرار داده و Enter را بزنید تا به صفحه پرداخت رفته و تراکنش را تکمیل کنید",
     "Or": "یا",
     "Or": "یا",
     "MarginLevel": "سطح مارجین",
     "MarginLevel": "سطح مارجین",
-    "RegDate": "تاریخ ثبت"
+    "RegDate": "تاریخ ثبت",
+    "Ali": "آلی‌پایه"
   },
   },
   "AccountType": {
   "AccountType": {
     "ClassicAccount": "حساب کلاسیک",
     "ClassicAccount": "حساب کلاسیک",
@@ -2268,7 +2279,8 @@
     "ProfessionalAccount": "حساب حرفه‌ای",
     "ProfessionalAccount": "حساب حرفه‌ای",
     "StandardAccount": "حساب استاندارد",
     "StandardAccount": "حساب استاندارد",
     "CentAccount": "Cent Account",
     "CentAccount": "Cent Account",
-    "SpeedAccount": "حساب فوری"
+    "SpeedAccount": "حساب فوری",
+    "CommissionAccount": "حساب الحسم"
   },
   },
   "ApplicationDialog": {
   "ApplicationDialog": {
     "Des43": "درخواست حساب PAMM ناموفق بود",
     "Des43": "درخواست حساب PAMM ناموفق بود",
@@ -3141,7 +3153,8 @@
       "item19": "3. باید یک حساب فعال باشد (باید حداقل یک تراکنش در هر ماه انجام شود).",
       "item19": "3. باید یک حساب فعال باشد (باید حداقل یک تراکنش در هر ماه انجام شود).",
       "item20": "4. سود بر اساس موجودی روزانه حساب محاسبه می‌شود و به صورت ماهانه انباشته و پرداخت می‌شود.",
       "item20": "4. سود بر اساس موجودی روزانه حساب محاسبه می‌شود و به صورت ماهانه انباشته و پرداخت می‌شود.",
       "item21": "مثال: اگر موجودی روزانه یک مشتری $10,000 باشد، در طول مدت فعالیت می‌تواند دریافت کند: سود روزانه: $10,000 × (4.5% ÷ 365) ≈ $1.23؛ مجموع سود 3 ماه: حدوداً $110.7.",
       "item21": "مثال: اگر موجودی روزانه یک مشتری $10,000 باشد، در طول مدت فعالیت می‌تواند دریافت کند: سود روزانه: $10,000 × (4.5% ÷ 365) ≈ $1.23؛ مجموع سود 3 ماه: حدوداً $110.7.",
-      "item22": "5. مشتری می‌تواند هر زمان که بخواهد وجوه را برداشت کند؛ قسمت کاهش یافته موجودی دیگر سود نخواهد داشت و مبلغ باقی‌مانده به صورت روزانه سود خواهد گرفت."
+      "item22": "5. مشتری می‌تواند هر زمان که بخواهد وجوه را برداشت کند؛ قسمت کاهش یافته موجودی دیگر سود نخواهد داشت و مبلغ باقی‌مانده به صورت روزانه سود خواهد گرفت.",
+      "itemW2": "کشبک"
     }
     }
   },
   },
   "wallet": {
   "wallet": {

+ 22 - 9
locale/id.json

@@ -31,8 +31,8 @@
     },
     },
     "Downloadpage": {
     "Downloadpage": {
       "item41": "Unduh App",
       "item41": "Unduh App",
-      "item42": "Unduh CWG Center App",
-      "item43": "CWG Center App, platform trading一站式. Pindai kode QR atau unduh dengan satu klik, pembaruan pasar real-time, trading sederhana dan efisien, mudah dioperasikan kapan saja dan di mana saja, jangan lewatkan kesempatan investasi mana pun."
+      "item42": "Tải xuống ứng dụng CWG Center",
+      "item43": "Kelola akun Anda, akses analisis pasar, dan terhubung dengan komunitas copy trading—semuanya dalam satu aplikasi. Pindai kode QR atau klik untuk mengunduh aplikasi hanya dengan satu sentuhan, sehingga pengelolaan akun dan pengambilan keputusan trading menjadi lebih efisien dan praktis."
     },
     },
     "tradingCenter": {
     "tradingCenter": {
       "item71": "Logam Mulia",
       "item71": "Logam Mulia",
@@ -729,7 +729,8 @@
     "AgainApply": "Ajukan ulang",
     "AgainApply": "Ajukan ulang",
     "ResetPassword": "Atur Ulang Sandi Trading",
     "ResetPassword": "Atur Ulang Sandi Trading",
     "Upload": "Unggah Berkas",
     "Upload": "Unggah Berkas",
-    "Search": "Cari"
+    "Search": "Cari",
+    "Close": "Tutup"
   },
   },
   "State": {
   "State": {
     "ToCertified": "Verifikasi Video",
     "ToCertified": "Verifikasi Video",
@@ -749,7 +750,11 @@
     "Complete": "Selesai",
     "Complete": "Selesai",
     "Participate": "Ikuti",
     "Participate": "Ikuti",
     "expireTime": "Hangus",
     "expireTime": "Hangus",
-    "Cancelled": "Dibatalkan"
+    "Cancelled": "Dibatalkan",
+    "Applied": "Diterapkan",
+    "Granted": "Diberikan",
+    "InTask": "Dalam Tugas",
+    "Ended": "Selesai"
   },
   },
   "Downloadpage": {
   "Downloadpage": {
     "item1": "Pusat Unduhan",
     "item1": "Pusat Unduhan",
@@ -1275,6 +1280,7 @@
       "NoticeItem4": "Hanya dokumen asli yang diterima untuk pengambilan. Salinan cetak atau fotokopi tidak diterima.",
       "NoticeItem4": "Hanya dokumen asli yang diterima untuk pengambilan. Salinan cetak atau fotokopi tidak diterima.",
       "NoticeItem5": "Harap pastikan dokumen identitas dan wajah berada dalam bingkai yang ditentukan sistem, dengan gambar yang jelas.",
       "NoticeItem5": "Harap pastikan dokumen identitas dan wajah berada dalam bingkai yang ditentukan sistem, dengan gambar yang jelas.",
       "NoticeItem6": "Operasi verifikasi harus diselesaikan oleh pemegang akun transaksi secara pribadi, dan wajah harus sesuai dengan foto identitas.",
       "NoticeItem6": "Operasi verifikasi harus diselesaikan oleh pemegang akun transaksi secara pribadi, dan wajah harus sesuai dengan foto identitas.",
+      "NoticeItem7": "Pastikan perangkat Anda tidak menggunakan VPN, server proxy, atau alat jaringan serupa. Penggunaan alat tersebut dapat menyebabkan kode QR tidak ditampilkan atau dikenali dengan benar, serta dapat memengaruhi verifikasi wajah KYC. Disarankan untuk menonaktifkannya sebelum melanjutkan verifikasi.",
       "VideoTitle": "Video Demo",
       "VideoTitle": "Video Demo",
       "VideoNotSupported": "Browser Anda tidak mendukung pemutaran video."
       "VideoNotSupported": "Browser Anda tidak mendukung pemutaran video."
     },
     },
@@ -1404,6 +1410,10 @@
       "AddressDescription": "Documents that can be used as proof of address:",
       "AddressDescription": "Documents that can be used as proof of address:",
       "AddressTip": "Mohon pastikan Anda memberikan alamat tempat tinggal saat ini yang valid. Pada langkah selanjutnya Anda akan diminta untuk memberikan bukti alamat. "
       "AddressTip": "Mohon pastikan Anda memberikan alamat tempat tinggal saat ini yang valid. Pada langkah selanjutnya Anda akan diminta untuk memberikan bukti alamat. "
     },
     },
+    "item1": "Silakan unggah Dokumen Tambahan yang diperlukan sesuai dengan persyaratan verifikasi:",
+    "item2": "1. Isi dokumen harus jelas dan mudah dibaca, dengan halaman yang lengkap tanpa bagian yang tertutup atau terpotong.",
+    "item3": "2. Ukuran file yang diunggah harus kurang dari 20MB.",
+    "item4": "3. Pastikan dokumen yang dikirim sesuai dengan persyaratan verifikasi agar proses peninjauan dapat diselesaikan dengan lancar.",
     "Label": {
     "Label": {
       "CustomerType": "Jenis Pelanggan",
       "CustomerType": "Jenis Pelanggan",
       "CustomerType1": "Pribadi",
       "CustomerType1": "Pribadi",
@@ -1561,7 +1571,7 @@
       "agree25": "(Tidak ada persyaratan lot lainnya, harap hubungi layanan konsumen CWG untuk info lebih detail)",
       "agree25": "(Tidak ada persyaratan lot lainnya, harap hubungi layanan konsumen CWG untuk info lebih detail)",
       "PromoCode": "Kode Promo",
       "PromoCode": "Kode Promo",
       "Channel1": "Transfer Bank",
       "Channel1": "Transfer Bank",
-      "Channel2": "China UnionPay",
+      "Channel2": "Perbankan Online China",
       "Channel3": "Dompet Kripto",
       "Channel3": "Dompet Kripto",
       "Channel4": "Dompet Elektronik",
       "Channel4": "Dompet Elektronik",
       "Tips": "Tip: Tidak menerima setoran transfer bank selain rekening bank milik Anda"
       "Tips": "Tip: Tidak menerima setoran transfer bank selain rekening bank milik Anda"
@@ -2081,7 +2091,7 @@
       "GoodThings": " Luxury Goods",
       "GoodThings": " Luxury Goods",
       "HouseholdDailyUse": " Household Daily-Use ",
       "HouseholdDailyUse": " Household Daily-Use ",
       "Automobile": " Automobile",
       "Automobile": " Automobile",
-      "Transaction": "Trading",
+      "Transaction": "Transaksi",
       "BoutiqueRecommendation": " Boutique Recommendation",
       "BoutiqueRecommendation": " Boutique Recommendation",
       "PointsExchanged": "Points redeemed:",
       "PointsExchanged": "Points redeemed:",
       "To": "Deliver to:",
       "To": "Deliver to:",
@@ -2320,7 +2330,8 @@
     "item4": "Jika Anda tidak dapat mengklik tombol di atas silakan salin URL lengkap di bawah tempelkan ke bilah alamat browser Anda dan tekan Enter untuk pergi ke halaman pembayaran dan menyelesaikan transaksi",
     "item4": "Jika Anda tidak dapat mengklik tombol di atas silakan salin URL lengkap di bawah tempelkan ke bilah alamat browser Anda dan tekan Enter untuk pergi ke halaman pembayaran dan menyelesaikan transaksi",
     "Or": "Atau",
     "Or": "Atau",
     "MarginLevel": "Tingkat Margin",
     "MarginLevel": "Tingkat Margin",
-    "RegDate": "Tanggal Registrasi"
+    "RegDate": "Tanggal Registrasi",
+    "Ali": "Alipay"
   },
   },
   "AccountType": {
   "AccountType": {
     "ClassicAccount": "Akun Klasik",
     "ClassicAccount": "Akun Klasik",
@@ -2329,7 +2340,8 @@
     "ProfessionalAccount": "Akun Profesional",
     "ProfessionalAccount": "Akun Profesional",
     "StandardAccount": "Akun Standar",
     "StandardAccount": "Akun Standar",
     "CentAccount": "Cent Account",
     "CentAccount": "Cent Account",
-    "SpeedAccount": "Akun Instan"
+    "SpeedAccount": "Akun Instan",
+    "CommissionAccount": "Akun Komisi"
   },
   },
   "ApplicationDialog": {
   "ApplicationDialog": {
     "Des43": "Aplikasi Akun PAMM Gagal",
     "Des43": "Aplikasi Akun PAMM Gagal",
@@ -3202,7 +3214,8 @@
       "item19": "3. Akun harus aktif (melakukan setidaknya satu transaksi per bulan).",
       "item19": "3. Akun harus aktif (melakukan setidaknya satu transaksi per bulan).",
       "item20": "4. Bunga dihitung berdasarkan saldo harian akun dan dikumpulkan setiap bulan.",
       "item20": "4. Bunga dihitung berdasarkan saldo harian akun dan dikumpulkan setiap bulan.",
       "item21": "Contoh: Jika saldo harian rata-rata pelanggan adalah $10.000, selama periode acara dapat memperoleh: Bunga harian: $10.000 × (4,5% ÷ 365) ≈ $1,23; Total penghasilan selama 3 bulan: sekitar $110,7.",
       "item21": "Contoh: Jika saldo harian rata-rata pelanggan adalah $10.000, selama periode acara dapat memperoleh: Bunga harian: $10.000 × (4,5% ÷ 365) ≈ $1,23; Total penghasilan selama 3 bulan: sekitar $110,7.",
-      "item22": "5. Pelanggan dapat menarik dana kapan saja. Bagian saldo yang dikurangi tidak akan lagi mendapatkan bunga; sisa saldo akan terus mendapatkan bunga harian."
+      "item22": "5. Pelanggan dapat menarik dana kapan saja. Bagian saldo yang dikurangi tidak akan lagi mendapatkan bunga; sisa saldo akan terus mendapatkan bunga harian.",
+      "itemW2": "Cashback"
     }
     }
   },
   },
   "wallet": {
   "wallet": {

+ 20 - 7
locale/ko.json

@@ -32,7 +32,7 @@
     "Downloadpage": {
     "Downloadpage": {
       "item41": "앱 다운로드",
       "item41": "앱 다운로드",
       "item42": "CWG Center 앱 다운로드",
       "item42": "CWG Center 앱 다운로드",
-      "item43": "CWG Center App, 원스톱 거래 플랫폼. QR 코드를 스캔하거나 한 번 클릭하여 다운로드, 실시간 시장 업데이트, 간단하고 효율적인 거래, 언제 어디서나 쉽게 운영, 어떤 투자 기회도 놓치지 마세요."
+      "item43": "계정을 관리하고, 시장 분석을 확인하며, 카피 트레이딩 커뮤니티와 연결하세요. 이 모든 것을 하나의 앱에서 이용할 수 있습니다. QR 코드를 스캔하거나 클릭하여 앱을 간편하게 다운로드하고, 계정 관리와 거래 의사결정을 더욱 효율적이고 편리하게 만들어 보세요."
     },
     },
     "tradingCenter": {
     "tradingCenter": {
       "item71": "귀금속",
       "item71": "귀금속",
@@ -717,7 +717,8 @@
     "ResetPassword": "거래 비밀번호 재설정",
     "ResetPassword": "거래 비밀번호 재설정",
     "Upload": "파일 업로드",
     "Upload": "파일 업로드",
     "Search": "검색",
     "Search": "검색",
-    "Detail": "세부 정보"
+    "Detail": "세부 정보",
+    "Close": "닫기"
   },
   },
   "State": {
   "State": {
     "ToCertified": "비디오 인증",
     "ToCertified": "비디오 인증",
@@ -737,7 +738,11 @@
     "Complete": "완성됨",
     "Complete": "완성됨",
     "Participate": "참여",
     "Participate": "참여",
     "expireTime": "만료됨",
     "expireTime": "만료됨",
-    "Cancelled": "취소됨"
+    "Cancelled": "취소됨",
+    "Applied": "적용됨",
+    "Granted": "수여됨",
+    "InTask": "태스크 중",
+    "Ended": "종료됨"
   },
   },
   "Downloadpage": {
   "Downloadpage": {
     "item1": "거래 플랫폼",
     "item1": "거래 플랫폼",
@@ -1263,6 +1268,7 @@
       "NoticeItem4": "원본 문서만 촬영이 허용됩니다. 인쇄본이나 복사본은 허용되지 않습니다.",
       "NoticeItem4": "원본 문서만 촬영이 허용됩니다. 인쇄본이나 복사본은 허용되지 않습니다.",
       "NoticeItem5": "신분증과 얼굴이 시스템에서 지정한 프레임 내에 있고 이미지가 선명하도록 하세요.",
       "NoticeItem5": "신분증과 얼굴이 시스템에서 지정한 프레임 내에 있고 이미지가 선명하도록 하세요.",
       "NoticeItem6": "인증 작업은 거래 계좌 소유자 본인이 완료해야 하며, 얼굴은 신분증 사진과 일치해야 합니다.",
       "NoticeItem6": "인증 작업은 거래 계좌 소유자 본인이 완료해야 하며, 얼굴은 신분증 사진과 일치해야 합니다.",
+      "NoticeItem7": "기기가 VPN, 프록시 서버 또는 유사한 네트워크 도구를 사용하지 않는지 확인해 주세요. 이러한 도구를 사용하면 QR 코드가 정상적으로 표시되거나 인식되지 않을 수 있으며 KYC 얼굴 인증에도 영향을 줄 수 있습니다. 인증을 진행하기 전에 해당 기능을 비활성화하는 것을 권장합니다.",
       "VideoTitle": "데모 비디오",
       "VideoTitle": "데모 비디오",
       "VideoNotSupported": "브라우저가 비디오 재생을 지원하지 않습니다."
       "VideoNotSupported": "브라우저가 비디오 재생을 지원하지 않습니다."
     },
     },
@@ -1392,6 +1398,10 @@
       "AddressDescription": "주소 증명으로 사용할 수 있는 문서:",
       "AddressDescription": "주소 증명으로 사용할 수 있는 문서:",
       "AddressTip": "유효한 현재 거주지 주소가 제공되었는지 확인하십시오. 이후 단계에서 주소 증명을 제공해야 합니다."
       "AddressTip": "유효한 현재 거주지 주소가 제공되었는지 확인하십시오. 이후 단계에서 주소 증명을 제공해야 합니다."
     },
     },
+    "item1": "심사 요구 사항에 따라 필요한 추가 서류를 업로드해 주시기 바랍니다.",
+    "item2": "1. 서류 내용이 선명하고 읽기 쉬워야 하며, 페이지가 완전하고 가려지거나 잘린 부분이 없어야 합니다.",
+    "item3": "2. 업로드하는 파일의 크기는 20MB 미만이어야 합니다.",
+    "item4": "3. 심사가 원활하게 진행될 수 있도록 제출한 서류가 심사 요구 사항에 부합하는지 확인해 주시기 바랍니다.",
     "Label": {
     "Label": {
       "CustomerType": "고객 유형",
       "CustomerType": "고객 유형",
       "CustomerType1": "개인의",
       "CustomerType1": "개인의",
@@ -1549,7 +1559,7 @@
       "agree25": "(추가 로트 요구 사항이 없습니다. 자세한 내용은 CWG 고객 서비스에 문의하십시오.)",
       "agree25": "(추가 로트 요구 사항이 없습니다. 자세한 내용은 CWG 고객 서비스에 문의하십시오.)",
       "PromoCode": "프로모션 코드",
       "PromoCode": "프로모션 코드",
       "Channel1": "은행 송금",
       "Channel1": "은행 송금",
-      "Channel2": "중국 유니온페이",
+      "Channel2": "중국 온라인 뱅킹",
       "Channel3": "암호화폐 지갑",
       "Channel3": "암호화폐 지갑",
       "Channel4": "전자 지갑",
       "Channel4": "전자 지갑",
       "Tips": "팁:자신의 계좌가 아닌 다른 계좌에서 전신 송금으로 입금을 받지 마세요."
       "Tips": "팁:자신의 계좌가 아닌 다른 계좌에서 전신 송금으로 입금을 받지 마세요."
@@ -2259,7 +2269,8 @@
     "item4": "위 버튼을 클릭할 수 없는 경우 아래의 전체 URL을 복사하여 브라우저 주소 표시줄에 붙여넣고 Enter 키를 눌러 결제 페이지로 이동하여 거래를 완료하십시오",
     "item4": "위 버튼을 클릭할 수 없는 경우 아래의 전체 URL을 복사하여 브라우저 주소 표시줄에 붙여넣고 Enter 키를 눌러 결제 페이지로 이동하여 거래를 완료하십시오",
     "Or": "또는",
     "Or": "또는",
     "MarginLevel": "마진 레벨",
     "MarginLevel": "마진 레벨",
-    "RegDate": "등록일"
+    "RegDate": "등록일",
+    "Ali": "알리페이"
   },
   },
   "AccountType": {
   "AccountType": {
     "ClassicAccount": "클래식 계정",
     "ClassicAccount": "클래식 계정",
@@ -2268,7 +2279,8 @@
     "ProfessionalAccount": "전문 계정",
     "ProfessionalAccount": "전문 계정",
     "StandardAccount": "표준 계정",
     "StandardAccount": "표준 계정",
     "CentAccount": "Cent Account",
     "CentAccount": "Cent Account",
-    "SpeedAccount": "즉시 계정"
+    "SpeedAccount": "즉시 계정",
+    "CommissionAccount": "수수료 계정"
   },
   },
   "ApplicationDialog": {
   "ApplicationDialog": {
     "Des43": "PAMM 계좌 신청 실패",
     "Des43": "PAMM 계좌 신청 실패",
@@ -3141,7 +3153,8 @@
       "item19": "3. 활성 계정이어야 합니다(매월 최소 한 번의 거래 완료).",
       "item19": "3. 활성 계정이어야 합니다(매월 최소 한 번의 거래 완료).",
       "item20": "4. 이자는 계정의 일일 잔액을 기준으로 계산되며 월별로 누적 지급됩니다.",
       "item20": "4. 이자는 계정의 일일 잔액을 기준으로 계산되며 월별로 누적 지급됩니다.",
       "item21": "예: 고객의 일일 평균 잔액이 $10,000인 경우 이벤트 기간 동안 다음을 받을 수 있습니다: 일일 이자: $10,000 × (4.5% ÷ 365) ≈ $1.23; 3개월 총 수익: 약 $110.7.",
       "item21": "예: 고객의 일일 평균 잔액이 $10,000인 경우 이벤트 기간 동안 다음을 받을 수 있습니다: 일일 이자: $10,000 × (4.5% ÷ 365) ≈ $1.23; 3개월 총 수익: 약 $110.7.",
-      "item22": "5. 고객은 언제든지 자금을 인출할 수 있습니다. 감소한 잔액 부분은 더 이상 이자를 받지 못하며, 남은 금액은 일일 이자를 계속 받습니다."
+      "item22": "5. 고객은 언제든지 자금을 인출할 수 있습니다. 감소한 잔액 부분은 더 이상 이자를 받지 못하며, 남은 금액은 일일 이자를 계속 받습니다.",
+      "itemW2": "캐시백"
     }
     }
   },
   },
   "wallet": {
   "wallet": {

+ 22 - 9
locale/ms.json

@@ -31,8 +31,8 @@
     },
     },
     "Downloadpage": {
     "Downloadpage": {
       "item41": "Muat Turun App",
       "item41": "Muat Turun App",
-      "item42": "Muat Turun CWG Center App",
-      "item43": "CWG Center App, platform perdagangan一站式. Imbas kod QR atau muat turun dengan satu klik, kemas kini pasaran masa nyata, perdagangan mudah dan cekap, mudah dikendalikan bila-bila masa dan di mana-mana, jangan lepaskan sebarang peluang pelaburan."
+      "item42": "Muat Turun Aplikasi CWG Center",
+      "item43": "Urus akaun anda, akses analisis pasaran dan berhubung dengan komuniti copy trading—semuanya dalam satu aplikasi. Imbas kod QR atau klik untuk memuat turun aplikasi dengan satu sentuhan, menjadikan pengurusan akaun dan keputusan dagangan lebih cekap dan mudah."
     },
     },
     "tradingCenter": {
     "tradingCenter": {
       "item71": "Logam Mulia",
       "item71": "Logam Mulia",
@@ -717,7 +717,8 @@
     "ResetPassword": "Set Semula Kata Laluan Perdagangan",
     "ResetPassword": "Set Semula Kata Laluan Perdagangan",
     "Upload": "Muat Naik Fail",
     "Upload": "Muat Naik Fail",
     "Search": "Cari",
     "Search": "Cari",
-    "Detail": "Butiran"
+    "Detail": "Butiran",
+    "Close": "Tutup"
   },
   },
   "State": {
   "State": {
     "ToCertified": "Pengesahan Video",
     "ToCertified": "Pengesahan Video",
@@ -737,7 +738,11 @@
     "Complete": "Lengkap",
     "Complete": "Lengkap",
     "Participate": "Ambil Bahagian",
     "Participate": "Ambil Bahagian",
     "expireTime": "Telah Tamat Tempoh",
     "expireTime": "Telah Tamat Tempoh",
-    "Cancelled": "Dibatalkan"
+    "Cancelled": "Dibatalkan",
+    "Applied": "Diterapkan",
+    "Granted": "Diberi",
+    "InTask": "Dalam Tugas",
+    "Ended": "Tamat"
   },
   },
   "Downloadpage": {
   "Downloadpage": {
     "item1": "Pusat Muat Turun",
     "item1": "Pusat Muat Turun",
@@ -1263,6 +1268,7 @@
       "NoticeItem4": "Hanya dokumen asal diterima untuk pengambilan gambar. Salinan cetak atau fotokopi tidak diterima.",
       "NoticeItem4": "Hanya dokumen asal diterima untuk pengambilan gambar. Salinan cetak atau fotokopi tidak diterima.",
       "NoticeItem5": "Sila pastikan dokumen pengenalan dan wajah berada dalam bingkai yang ditetapkan oleh sistem, dengan imej yang jelas.",
       "NoticeItem5": "Sila pastikan dokumen pengenalan dan wajah berada dalam bingkai yang ditetapkan oleh sistem, dengan imej yang jelas.",
       "NoticeItem6": "Operasi pengesahan mesti diselesaikan oleh pemegang akaun dagangan secara peribadi, dan wajah mesti sepadan dengan foto pengenalan.",
       "NoticeItem6": "Operasi pengesahan mesti diselesaikan oleh pemegang akaun dagangan secara peribadi, dan wajah mesti sepadan dengan foto pengenalan.",
+      "NoticeItem7": "Sila pastikan peranti anda tidak menggunakan VPN, pelayan proksi atau alat rangkaian yang serupa. Penggunaan alat ini boleh menyebabkan kod QR tidak dipaparkan atau tidak dapat dikenali dengan betul serta menjejaskan pengesahan wajah KYC. Anda disarankan untuk mematikannya sebelum meneruskan pengesahan.",
       "VideoTitle": "Video Demo",
       "VideoTitle": "Video Demo",
       "VideoNotSupported": "Pelayar anda tidak menyokong main balik video."
       "VideoNotSupported": "Pelayar anda tidak menyokong main balik video."
     },
     },
@@ -1392,6 +1398,10 @@
       "AddressDescription": "Documents that can be used as proof of address: ",
       "AddressDescription": "Documents that can be used as proof of address: ",
       "AddressTip": "Sila pastikan anda dibekalkan dengan maklumat alamat kediaman yang sah dan terkini. Pada langkah seterusnya, anda akan dipohon untuk membekalkan bukti alamat anda."
       "AddressTip": "Sila pastikan anda dibekalkan dengan maklumat alamat kediaman yang sah dan terkini. Pada langkah seterusnya, anda akan dipohon untuk membekalkan bukti alamat anda."
     },
     },
+    "item1": "Sila muat naik Dokumen Tambahan yang diperlukan mengikut keperluan pengesahan:",
+    "item2": "1. Kandungan dokumen mestilah jelas dan mudah dibaca, dengan halaman yang lengkap serta tidak terlindung atau terpotong.",
+    "item3": "2. Saiz fail yang dimuat naik mestilah kurang daripada 20MB.",
+    "item4": "3. Sila pastikan dokumen yang dihantar memenuhi keperluan pengesahan bagi memastikan proses semakan dapat diselesaikan dengan lancar.",
     "Label": {
     "Label": {
       "CustomerType": "Jenis Pelanggan",
       "CustomerType": "Jenis Pelanggan",
       "CustomerType1": "Peribadi",
       "CustomerType1": "Peribadi",
@@ -1549,7 +1559,7 @@
       "agree25": "(Tidak ada syarat lot tambahan, sila hubungi khidmat pelanggan CWG untuk butiran)",
       "agree25": "(Tidak ada syarat lot tambahan, sila hubungi khidmat pelanggan CWG untuk butiran)",
       "PromoCode": "Kod Promosi",
       "PromoCode": "Kod Promosi",
       "Channel1": "Pindahan Bank",
       "Channel1": "Pindahan Bank",
-      "Channel2": "China UnionPay",
+      "Channel2": "Perbankan Dalam Talian China",
       "Channel3": "Dompet Cryptocurrency",
       "Channel3": "Dompet Cryptocurrency",
       "Channel4": "Dompet Elektronik",
       "Channel4": "Dompet Elektronik",
       "Tips": "Petua: Tidak menerima deposit melalui pemindahan elektronik dari akaun selain daripada akaun anda sendiri"
       "Tips": "Petua: Tidak menerima deposit melalui pemindahan elektronik dari akaun selain daripada akaun anda sendiri"
@@ -2020,7 +2030,7 @@
       "GoodThings": " Luxury Goods",
       "GoodThings": " Luxury Goods",
       "HouseholdDailyUse": " Household Daily-Use ",
       "HouseholdDailyUse": " Household Daily-Use ",
       "Automobile": " Automobile",
       "Automobile": " Automobile",
-      "Transaction": "Trading",
+      "Transaction": "Transaksi",
       "BoutiqueRecommendation": " Boutique Recommendation",
       "BoutiqueRecommendation": " Boutique Recommendation",
       "PointsExchanged": "Points redeemed:",
       "PointsExchanged": "Points redeemed:",
       "To": "Deliver to:",
       "To": "Deliver to:",
@@ -2259,7 +2269,8 @@
     "item4": "Jika anda tidak dapat mengklik butang di atas sila salin URL lengkap di bawah tampalkannya ke dalam bar alamat pelayar anda dan tekan Enter untuk pergi ke halaman pembayaran dan menyelesaikan transaksi",
     "item4": "Jika anda tidak dapat mengklik butang di atas sila salin URL lengkap di bawah tampalkannya ke dalam bar alamat pelayar anda dan tekan Enter untuk pergi ke halaman pembayaran dan menyelesaikan transaksi",
     "Or": "Atau",
     "Or": "Atau",
     "MarginLevel": "Aras Margin",
     "MarginLevel": "Aras Margin",
-    "RegDate": "Tarikh Pendaftaran"
+    "RegDate": "Tarikh Pendaftaran",
+    "Ali": "Alipay"
   },
   },
   "AccountType": {
   "AccountType": {
     "ClassicAccount": "Akaun Klasik",
     "ClassicAccount": "Akaun Klasik",
@@ -2268,7 +2279,8 @@
     "ProfessionalAccount": "Akaun Profesional",
     "ProfessionalAccount": "Akaun Profesional",
     "StandardAccount": "Akaun Standard",
     "StandardAccount": "Akaun Standard",
     "CentAccount": "Cent Account",
     "CentAccount": "Cent Account",
-    "SpeedAccount": "Akaun Segera"
+    "SpeedAccount": "Akaun Segera",
+    "CommissionAccount": "Akaun Komisi"
   },
   },
   "ApplicationDialog": {
   "ApplicationDialog": {
     "Des43": "Permohonan Akaun PAMM Gagal",
     "Des43": "Permohonan Akaun PAMM Gagal",
@@ -3141,7 +3153,8 @@
       "item19": "3. Akaun mesti aktif (melakukan sekurang-kurangnya satu transaksi sebulan).",
       "item19": "3. Akaun mesti aktif (melakukan sekurang-kurangnya satu transaksi sebulan).",
       "item20": "4. Faedah dikira berdasarkan baki harian akaun dan dikumpul setiap bulan.",
       "item20": "4. Faedah dikira berdasarkan baki harian akaun dan dikumpul setiap bulan.",
       "item21": "Contoh: Jika baki harian purata pelanggan ialah $10,000, sepanjang tempoh acara boleh memperoleh: Faedah harian: $10,000 × (4.5% ÷ 365) ≈ $1.23; Jumlah pendapatan selama 3 bulan: kira-kira $110.7.",
       "item21": "Contoh: Jika baki harian purata pelanggan ialah $10,000, sepanjang tempoh acara boleh memperoleh: Faedah harian: $10,000 × (4.5% ÷ 365) ≈ $1.23; Jumlah pendapatan selama 3 bulan: kira-kira $110.7.",
-      "item22": "5. Pelanggan boleh mengeluarkan dana pada bila-bila masa. Bahagian baki yang dikurangkan tidak lagi menerima faedah; baki selebihnya akan terus menerima faedah harian."
+      "item22": "5. Pelanggan boleh mengeluarkan dana pada bila-bila masa. Bahagian baki yang dikurangkan tidak lagi menerima faedah; baki selebihnya akan terus menerima faedah harian.",
+      "itemW2": "Kembalian Tunai"
     }
     }
   },
   },
   "wallet": {
   "wallet": {

+ 22 - 9
locale/pt.json

@@ -31,8 +31,8 @@
     },
     },
     "Downloadpage": {
     "Downloadpage": {
       "item41": "Download do App",
       "item41": "Download do App",
-      "item42": "Download do CWG Center App",
-      "item43": "CWG Center App, plataforma de trading completa. Escaneie o código QR ou baixe com um clique, atualizações de mercado em tempo real, trading simples e eficiente, fácil de operar a qualquer momento e em qualquer lugar, não perca nenhuma oportunidade de investimento."
+      "item42": "Baixe o aplicativo CWG Center",
+      "item43": "Gerencie sua conta, acesse análises de mercado e conecte-se à comunidade de copy trading — tudo em um só lugar. Escaneie o código QR ou clique para baixar o aplicativo com apenas um toque, tornando o gerenciamento da conta e as decisões de negociação mais eficientes e convenientes."
     },
     },
     "tradingCenter": {
     "tradingCenter": {
       "item71": "Metais Preciosos",
       "item71": "Metais Preciosos",
@@ -717,7 +717,8 @@
     "ResetPassword": "Redefinir senha de trading",
     "ResetPassword": "Redefinir senha de trading",
     "Upload": "Enviar Arquivos",
     "Upload": "Enviar Arquivos",
     "Search": "Pesquisar",
     "Search": "Pesquisar",
-    "Detail": "Detalhes"
+    "Detail": "Detalhes",
+    "Close": "Fechar"
   },
   },
   "State": {
   "State": {
     "ToCertified": "Verificação por Vídeo",
     "ToCertified": "Verificação por Vídeo",
@@ -737,7 +738,11 @@
     "Complete": "Concluído",
     "Complete": "Concluído",
     "Participate": "Participar",
     "Participate": "Participar",
     "expireTime": "Expirado",
     "expireTime": "Expirado",
-    "Cancelled": "Cancelado"
+    "Cancelled": "Cancelado",
+    "Applied": "Aplicado",
+    "Granted": "Concedido",
+    "InTask": "Em Tarefa",
+    "Ended": "Encerrado"
   },
   },
   "Downloadpage": {
   "Downloadpage": {
     "item1": "Plataforma de Trading",
     "item1": "Plataforma de Trading",
@@ -1263,6 +1268,7 @@
       "NoticeItem4": "Apenas documentos originais são aceitos para captura. Cópias impressas ou fotocópias não são aceitas.",
       "NoticeItem4": "Apenas documentos originais são aceitos para captura. Cópias impressas ou fotocópias não são aceitas.",
       "NoticeItem5": "Por favor, certifique-se de que o documento de identidade e o rosto estejam dentro do quadro especificado pelo sistema, com imagem clara.",
       "NoticeItem5": "Por favor, certifique-se de que o documento de identidade e o rosto estejam dentro do quadro especificado pelo sistema, com imagem clara.",
       "NoticeItem6": "A operação de verificação deve ser concluída pelo titular da conta de negociação pessoalmente, e o rosto deve corresponder à foto de identidade.",
       "NoticeItem6": "A operação de verificação deve ser concluída pelo titular da conta de negociação pessoalmente, e o rosto deve corresponder à foto de identidade.",
+      "NoticeItem7": "Por favor, certifique-se de que seu dispositivo não esteja usando VPN, servidor proxy ou ferramentas de rede semelhantes. O uso dessas ferramentas pode impedir que o código QR seja exibido ou reconhecido corretamente e pode afetar a verificação facial do KYC. Recomenda-se desativá-las antes de prosseguir com a verificação.",
       "VideoTitle": "Vídeo Demonstrativo",
       "VideoTitle": "Vídeo Demonstrativo",
       "VideoNotSupported": "Seu navegador não suporta reprodução de vídeo."
       "VideoNotSupported": "Seu navegador não suporta reprodução de vídeo."
     },
     },
@@ -1392,6 +1398,10 @@
       "AddressDescription": "Documentos que podem ser usados como comprovante de endereço:",
       "AddressDescription": "Documentos que podem ser usados como comprovante de endereço:",
       "AddressTip": "Por favor, certifique-se de ter fornecido o endereço residencial atual válido. Na etapa posterior, você será solicitado a fornecer um comprovante de endereço."
       "AddressTip": "Por favor, certifique-se de ter fornecido o endereço residencial atual válido. Na etapa posterior, você será solicitado a fornecer um comprovante de endereço."
     },
     },
+    "item1": "Por favor, envie os Documentos Adicionais necessários de acordo com os requisitos de verificação:",
+    "item2": "1. O conteúdo do documento deve estar claro e legível, com as páginas completas e sem obstruções ou cortes.",
+    "item3": "2. O tamanho do arquivo enviado deve ser inferior a 20 MB.",
+    "item4": "3. Certifique-se de que os documentos enviados atendam aos requisitos de verificação para que o processo de análise seja concluído sem problemas.",
     "Label": {
     "Label": {
       "CustomerType": "Tipo de Cliente",
       "CustomerType": "Tipo de Cliente",
       "CustomerType1": "Pessoal",
       "CustomerType1": "Pessoal",
@@ -1549,7 +1559,7 @@
       "agree25": "(Não há exigência de lotes adicionais, consulte o atendimento ao cliente do CWG para obter detalhes)",
       "agree25": "(Não há exigência de lotes adicionais, consulte o atendimento ao cliente do CWG para obter detalhes)",
       "PromoCode": "Código Promocional",
       "PromoCode": "Código Promocional",
       "Channel1": "Transferência Bancária",
       "Channel1": "Transferência Bancária",
-      "Channel2": "China UnionPay",
+      "Channel2": "Bancos Online Chineses",
       "Channel3": "Carteira de criptomoeda",
       "Channel3": "Carteira de criptomoeda",
       "Channel4": "Carteira Eletrônica",
       "Channel4": "Carteira Eletrônica",
       "Tips": "Dicas:Não aceitamos depósitos por transferência bancária de contas que não sejam a sua"
       "Tips": "Dicas:Não aceitamos depósitos por transferência bancária de contas que não sejam a sua"
@@ -2020,7 +2030,7 @@
       "GoodThings": " Bens de Luxo",
       "GoodThings": " Bens de Luxo",
       "HouseholdDailyUse": " Uso Diário Doméstico ",
       "HouseholdDailyUse": " Uso Diário Doméstico ",
       "Automobile": " Automóvel",
       "Automobile": " Automóvel",
-      "Transaction": "Trading",
+      "Transaction": "Transação",
       "BoutiqueRecommendation": " Recomendação de Boutique",
       "BoutiqueRecommendation": " Recomendação de Boutique",
       "PointsExchanged": "Pontos resgatados:",
       "PointsExchanged": "Pontos resgatados:",
       "To": "Entregar para:",
       "To": "Entregar para:",
@@ -2259,7 +2269,8 @@
     "item4": "Se você não conseguir clicar no botão acima copie o URL completo abaixo cole na barra de endereços do seu navegador e pressione Enter para ir para a página de pagamento e concluir a transação",
     "item4": "Se você não conseguir clicar no botão acima copie o URL completo abaixo cole na barra de endereços do seu navegador e pressione Enter para ir para a página de pagamento e concluir a transação",
     "Or": "Ou",
     "Or": "Ou",
     "MarginLevel": "Nível de Margem",
     "MarginLevel": "Nível de Margem",
-    "RegDate": "Data de Registro"
+    "RegDate": "Data de Registro",
+    "Ali": "Alipay"
   },
   },
   "AccountType": {
   "AccountType": {
     "ClassicAccount": "Conta Clássica",
     "ClassicAccount": "Conta Clássica",
@@ -2268,7 +2279,8 @@
     "ProfessionalAccount": "Conta Profissional",
     "ProfessionalAccount": "Conta Profissional",
     "StandardAccount": "Conta Padrão",
     "StandardAccount": "Conta Padrão",
     "CentAccount": "Cent Account",
     "CentAccount": "Cent Account",
-    "SpeedAccount": "Conta Instantânea"
+    "SpeedAccount": "Conta Instantânea",
+    "CommissionAccount": "Conta de Comissão"
   },
   },
   "ApplicationDialog": {
   "ApplicationDialog": {
     "Des43": "A solicitação de conta PAMM falhou",
     "Des43": "A solicitação de conta PAMM falhou",
@@ -3141,7 +3153,8 @@
       "item19": "3. Deve ser uma conta ativa (necessário realizar pelo menos uma transação por mês).",
       "item19": "3. Deve ser uma conta ativa (necessário realizar pelo menos uma transação por mês).",
       "item20": "4. Os juros são calculados com base no saldo diário da conta e acumulados mensalmente.",
       "item20": "4. Os juros são calculados com base no saldo diário da conta e acumulados mensalmente.",
       "item21": "Exemplo: Se o saldo médio diário de um cliente for $10.000, durante o período da atividade ele pode receber: Juros diários: $10.000 × (4,5% ÷ 365) ≈ $1,23; Ganho total em 3 meses: aproximadamente $110,7.",
       "item21": "Exemplo: Se o saldo médio diário de um cliente for $10.000, durante o período da atividade ele pode receber: Juros diários: $10.000 × (4,5% ÷ 365) ≈ $1,23; Ganho total em 3 meses: aproximadamente $110,7.",
-      "item22": "5. O cliente pode retirar fundos a qualquer momento; a parte reduzida do saldo não gerará mais juros, e o valor restante continuará a gerar juros diários."
+      "item22": "5. O cliente pode retirar fundos a qualquer momento; a parte reduzida do saldo não gerará mais juros, e o valor restante continuará a gerar juros diários.",
+      "itemW2": "Cashback"
     }
     }
   },
   },
   "wallet": {
   "wallet": {

+ 23 - 10
locale/th.json

@@ -31,8 +31,8 @@
     },
     },
     "Downloadpage": {
     "Downloadpage": {
       "item41": "ดาวน์โหลดแอป",
       "item41": "ดาวน์โหลดแอป",
-      "item42": "ดาวน์โหลด CWG Center App",
-      "item43": "CWG Center App, แพลตฟอร์มเทรด一站式. สแกน QR Code หรือดาวน์โหลดด้วยคลิกเดียว, อัพเดทตลาดเรียลไทม์, เทรดง่ายและมีประสิทธิภาพ, ใช้งานง่ายทุกเวลาทุกที่, ไม่พลาดโอกาสลงทุนใดๆ."
+      "item42": "ดาวน์โหลดแอป CWG Center",
+      "item43": "จัดการบัญชีของคุณ เข้าถึงบทวิเคราะห์ตลาด และเชื่อมต่อกับชุมชน Copy Trading ได้ในที่เดียว สแกน QR Code หรือคลิกเพื่อดาวน์โหลดแอปได้ในคลิกเดียว ช่วยให้การจัดการบัญชีและการตัดสินใจซื้อขายมีประสิทธิภาพและสะดวกยิ่งขึ้น"
     },
     },
     "tradingCenter": {
     "tradingCenter": {
       "item71": "โลหะมีค่า",
       "item71": "โลหะมีค่า",
@@ -717,7 +717,8 @@
     "ResetPassword": "รีเซ็ตรหัสผ่านการเทรด",
     "ResetPassword": "รีเซ็ตรหัสผ่านการเทรด",
     "Upload": "อัปโหลดไฟล์",
     "Upload": "อัปโหลดไฟล์",
     "Search": "ค้นหา",
     "Search": "ค้นหา",
-    "Detail": "รายละเอียด"
+    "Detail": "รายละเอียด",
+    "Close": "ปิด"
   },
   },
   "State": {
   "State": {
     "ToCertified": "การยืนยันตัวตนด้วยวิดีโอ",
     "ToCertified": "การยืนยันตัวตนด้วยวิดีโอ",
@@ -737,7 +738,11 @@
     "Complete": "เสร็จสมบูรณ์",
     "Complete": "เสร็จสมบูรณ์",
     "Participate": "เข้าร่วม",
     "Participate": "เข้าร่วม",
     "expireTime": "หมดอายุ",
     "expireTime": "หมดอายุ",
-    "Cancelled": "ยกเลิก"
+    "Cancelled": "ยกเลิก",
+    "Applied": "ได้ใช้",
+    "Granted": "ได้รับ",
+    "InTask": "ในภารกิจ",
+    "Ended": "สิ้นสุด"
   },
   },
   "Downloadpage": {
   "Downloadpage": {
     "item1": "ศูนย์ดาวน์โหลด",
     "item1": "ศูนย์ดาวน์โหลด",
@@ -1263,6 +1268,7 @@
       "NoticeItem4": "รับเฉพาะเอกสารต้นฉบับเท่านั้น ไม่รับสำเนาหรือภาพถ่าย",
       "NoticeItem4": "รับเฉพาะเอกสารต้นฉบับเท่านั้น ไม่รับสำเนาหรือภาพถ่าย",
       "NoticeItem5": "กรุณาให้แน่ใจว่าเอกสารประจำตัวและใบหน้าอยู่ในกรอบที่ระบบกำหนด ภาพชัดเจน",
       "NoticeItem5": "กรุณาให้แน่ใจว่าเอกสารประจำตัวและใบหน้าอยู่ในกรอบที่ระบบกำหนด ภาพชัดเจน",
       "NoticeItem6": "การยืนยันตัวตนต้องทำโดยผู้ถือบัญชีเท่านั้น และใบหน้าต้องตรงกับรูปถ่ายในเอกสารประจำตัว",
       "NoticeItem6": "การยืนยันตัวตนต้องทำโดยผู้ถือบัญชีเท่านั้น และใบหน้าต้องตรงกับรูปถ่ายในเอกสารประจำตัว",
+      "NoticeItem7": "กรุณาตรวจสอบว่าอุปกรณ์ของคุณไม่ได้ใช้งาน VPN, เซิร์ฟเวอร์พร็อกซี หรือเครื่องมือเครือข่ายที่คล้ายกัน การใช้เครื่องมือเหล่านี้อาจทำให้ QR code แสดงผลหรือสแกนไม่ได้อย่างถูกต้อง และอาจส่งผลต่อการยืนยันใบหน้า KYC แนะนำให้ปิดก่อนดำเนินการยืนยัน",
       "VideoTitle": "วิดีโอสาธิต",
       "VideoTitle": "วิดีโอสาธิต",
       "VideoNotSupported": "เบราว์เซอร์ของคุณไม่รองรับการเล่นวิดีโอ"
       "VideoNotSupported": "เบราว์เซอร์ของคุณไม่รองรับการเล่นวิดีโอ"
     },
     },
@@ -1392,6 +1398,10 @@
       "AddressDescription": "Documents that can be used as proof of address:",
       "AddressDescription": "Documents that can be used as proof of address:",
       "AddressTip": "กรุณาตรวจสอบให้แน่ใจว่าคุณได้ให้ที่อยู่อาศัยในปัจจุบันที่ถูกต้อง ในขั้นตอนต่อไปคุณจะถูกขอให้แสดงหลักฐานยืนยันที่อยู่"
       "AddressTip": "กรุณาตรวจสอบให้แน่ใจว่าคุณได้ให้ที่อยู่อาศัยในปัจจุบันที่ถูกต้อง ในขั้นตอนต่อไปคุณจะถูกขอให้แสดงหลักฐานยืนยันที่อยู่"
     },
     },
+    "item1": "โปรดอัปโหลดเอกสารเพิ่มเติมตามข้อกำหนดในการตรวจสอบ:",
+    "item2": "1. เนื้อหาในเอกสารต้องชัดเจน อ่านได้ครบถ้วน หน้ากระดาษสมบูรณ์ และไม่มีส่วนใดถูกบดบังหรือถูกตัดออก",
+    "item3": "2. ขนาดไฟล์ที่อัปโหลดต้องน้อยกว่า 20MB",
+    "item4": "3. โปรดตรวจสอบให้แน่ใจว่าเอกสารที่ส่งสอดคล้องกับข้อกำหนดในการตรวจสอบ เพื่อให้การตรวจสอบดำเนินไปอย่างราบรื่น",
     "Label": {
     "Label": {
       "CustomerType": "ประเภทลูกค้า",
       "CustomerType": "ประเภทลูกค้า",
       "CustomerType1": "ส่วนบุคคล",
       "CustomerType1": "ส่วนบุคคล",
@@ -1549,7 +1559,7 @@
       "agree25": "(ไม่มีข้อกำหนดเพิ่มเติมสำหรับล็อต โปรดปรึกษาฝ่ายบริการลูกค้า CWG สำหรับรายละเอียด)",
       "agree25": "(ไม่มีข้อกำหนดเพิ่มเติมสำหรับล็อต โปรดปรึกษาฝ่ายบริการลูกค้า CWG สำหรับรายละเอียด)",
       "PromoCode": "รหัสส่งเสริมการขาย",
       "PromoCode": "รหัสส่งเสริมการขาย",
       "Channel1": "การโอนเงินผ่านธนาคาร",
       "Channel1": "การโอนเงินผ่านธนาคาร",
-      "Channel2": "China UnionPay",
+      "Channel2": "ธนาคารออนไลน์จีน",
       "Channel3": "กระเป๋าเงินดิจิทัล",
       "Channel3": "กระเป๋าเงินดิจิทัล",
       "Channel4": "กระเป๋าเงินอิเล็กทรอนิกส์",
       "Channel4": "กระเป๋าเงินอิเล็กทรอนิกส์",
       "Tips": "เคล็ดลับ: อย่ายอมรับการฝากเงินโดยการโอนเงินจากบัญชีอื่นที่ไม่ใช่ของคุณเอง"
       "Tips": "เคล็ดลับ: อย่ายอมรับการฝากเงินโดยการโอนเงินจากบัญชีอื่นที่ไม่ใช่ของคุณเอง"
@@ -2020,7 +2030,7 @@
       "GoodThings": " Luxury Goods",
       "GoodThings": " Luxury Goods",
       "HouseholdDailyUse": " Household Daily-Use ",
       "HouseholdDailyUse": " Household Daily-Use ",
       "Automobile": " Automobile",
       "Automobile": " Automobile",
-      "Transaction": "Trading",
+      "Transaction": "ธุรกรรม",
       "BoutiqueRecommendation": " Boutique Recommendation",
       "BoutiqueRecommendation": " Boutique Recommendation",
       "PointsExchanged": "Points redeemed:",
       "PointsExchanged": "Points redeemed:",
       "To": "Deliver to:",
       "To": "Deliver to:",
@@ -2258,8 +2268,9 @@
     "item3": "ดำเนินการชำระเงิน",
     "item3": "ดำเนินการชำระเงิน",
     "item4": "หากคุณไม่สามารถคลิกปุ่มด้านบนได้โปรดคัดลอก URL ด้านล่างนี้ทั้งหมดวางลงในแถบที่อยู่ของเบราว์เซอร์ของคุณแล้วกด Enter เพื่อไปที่หน้าชำระเงินและทำรายการให้เสร็จสมบูรณ์",
     "item4": "หากคุณไม่สามารถคลิกปุ่มด้านบนได้โปรดคัดลอก URL ด้านล่างนี้ทั้งหมดวางลงในแถบที่อยู่ของเบราว์เซอร์ของคุณแล้วกด Enter เพื่อไปที่หน้าชำระเงินและทำรายการให้เสร็จสมบูรณ์",
     "Or": "หรือ",
     "Or": "หรือ",
-    "MarginLevel": "ระดับ保证金",
-    "RegDate": "วันที่ลงทะเบียน"
+    "MarginLevel": "ส่วนต่างกำไร",
+    "RegDate": "วันที่ลงทะเบียน",
+    "Ali": "อาลิเพย์"
   },
   },
   "AccountType": {
   "AccountType": {
     "ClassicAccount": "บัญชีคลาสสิก",
     "ClassicAccount": "บัญชีคลาสสิก",
@@ -2268,7 +2279,8 @@
     "ProfessionalAccount": "บัญชีผู้เชี่ยวชาญ",
     "ProfessionalAccount": "บัญชีผู้เชี่ยวชาญ",
     "StandardAccount": "บัญชีมาตรฐาน",
     "StandardAccount": "บัญชีมาตรฐาน",
     "CentAccount": "Cent Account",
     "CentAccount": "Cent Account",
-    "SpeedAccount": "บัญชีทันที"
+    "SpeedAccount": "บัญชีทันที",
+    "CommissionAccount": "บัญชีคืน"
   },
   },
   "ApplicationDialog": {
   "ApplicationDialog": {
     "Des43": "PAMM ของคุณล้มเหลว",
     "Des43": "PAMM ของคุณล้มเหลว",
@@ -3141,7 +3153,8 @@
       "item19": "3. ต้องเป็นบัญชีที่มีการใช้งาน (ในแต่ละเดือนต้องทำธุรกรรมอย่างน้อยหนึ่งรายการ)",
       "item19": "3. ต้องเป็นบัญชีที่มีการใช้งาน (ในแต่ละเดือนต้องทำธุรกรรมอย่างน้อยหนึ่งรายการ)",
       "item20": "4. ดอกเบี้ยจะคำนวณจากยอดเงินในบัญชีรายวัน และสะสมจ่ายรายเดือน",
       "item20": "4. ดอกเบี้ยจะคำนวณจากยอดเงินในบัญชีรายวัน และสะสมจ่ายรายเดือน",
       "item21": "ตัวอย่าง: หากยอดเงินเฉลี่ยรายวันของลูกค้าเป็น $10,000 ในช่วงกิจกรรม ลูกค้าจะได้รับ: ดอกเบี้ยรายวัน: $10,000 × (4.5% ÷ 365) ≈ $1.23; รายได้รวมใน 3 เดือน: ประมาณ $110.7",
       "item21": "ตัวอย่าง: หากยอดเงินเฉลี่ยรายวันของลูกค้าเป็น $10,000 ในช่วงกิจกรรม ลูกค้าจะได้รับ: ดอกเบี้ยรายวัน: $10,000 × (4.5% ÷ 365) ≈ $1.23; รายได้รวมใน 3 เดือน: ประมาณ $110.7",
-      "item22": "5. ลูกค้าสามารถถอนเงินได้ทุกเมื่อ ส่วนยอดเงินที่ลดลงจะไม่ถูกคำนวณดอกเบี้ย; ส่วนที่เหลือจะยังคงคำนวณดอกเบี้ยรายวัน"
+      "item22": "5. ลูกค้าสามารถถอนเงินได้ทุกเมื่อ ส่วนยอดเงินที่ลดลงจะไม่ถูกคำนวณดอกเบี้ย; ส่วนที่เหลือจะยังคงคำนวณดอกเบี้ยรายวัน",
+      "itemW2": "เงินคืน"
     }
     }
   },
   },
   "wallet": {
   "wallet": {

+ 22 - 9
locale/tr.json

@@ -31,8 +31,8 @@
     },
     },
     "Downloadpage": {
     "Downloadpage": {
       "item41": "Uygulama İndirme",
       "item41": "Uygulama İndirme",
-      "item42": "CWG Center App İndirme",
-      "item43": "CWG Center App, tek dükkanlı ticaret platformu. QR kodunu tarayın veya tek tıklamayla indirin, gerçek zamanlı piyasa güncellemeleri, basit ve verimli ticaret, her zaman ve her yerde kolayca çalıştırın, hiçbir yatırım fırsatını kaçırmayın."
+      "item42": "CWG Center Uygulamasını İndirin",
+      "item43": "Hesabınızı yönetin, piyasa analizlerine erişin ve copy trading topluluğuna katılın—hepsi tek bir uygulamada. QR kodunu tarayın veya tek tıklamayla uygulamayı indirin; hesap yönetimini ve işlem kararlarını daha verimli ve daha pratik hale getirin."
     },
     },
     "tradingCenter": {
     "tradingCenter": {
       "item71": "Değerli Metaller",
       "item71": "Değerli Metaller",
@@ -717,7 +717,8 @@
     "ResetPassword": "Ticaret Şifresini Sıfırla",
     "ResetPassword": "Ticaret Şifresini Sıfırla",
     "Upload": "Dosyaları Yükle",
     "Upload": "Dosyaları Yükle",
     "Search": "Ara",
     "Search": "Ara",
-    "Detail": "Detay"
+    "Detail": "Detay",
+    "Close": "Kapat"
   },
   },
   "State": {
   "State": {
     "ToCertified": "Video Doğrulama",
     "ToCertified": "Video Doğrulama",
@@ -737,7 +738,11 @@
     "Complete": "Tamamlandı",
     "Complete": "Tamamlandı",
     "Participate": "Katıl",
     "Participate": "Katıl",
     "expireTime": "Süresi Doldu",
     "expireTime": "Süresi Doldu",
-    "Cancelled": "İptal Edildi"
+    "Cancelled": "İptal Edildi",
+    "Applied": "Uygulandı",
+    "Granted": "Verildi",
+    "InTask": "Görevde",
+    "Ended": "Bitti"
   },
   },
   "Downloadpage": {
   "Downloadpage": {
     "item1": "Ticaret Platformu",
     "item1": "Ticaret Platformu",
@@ -1263,6 +1268,7 @@
       "NoticeItem4": "Çekim için yalnızca orijinal belgeler kabul edilir. Baskı kopyalar veya fotokopiler kabul edilmez.",
       "NoticeItem4": "Çekim için yalnızca orijinal belgeler kabul edilir. Baskı kopyalar veya fotokopiler kabul edilmez.",
       "NoticeItem5": "Lütfen kimlik belgesi ve yüzün sistem tarafından belirtilen çerçeve içinde olduğundan ve görüntünün net olduğundan emin olun.",
       "NoticeItem5": "Lütfen kimlik belgesi ve yüzün sistem tarafından belirtilen çerçeve içinde olduğundan ve görüntünün net olduğundan emin olun.",
       "NoticeItem6": "Doğrulama işlemi işlem hesabı sahibi tarafından kişisel olarak tamamlanmalı ve yüz kimlik fotoğrafıyla eşleşmelidir.",
       "NoticeItem6": "Doğrulama işlemi işlem hesabı sahibi tarafından kişisel olarak tamamlanmalı ve yüz kimlik fotoğrafıyla eşleşmelidir.",
+      "NoticeItem7": "Lütfen cihazınızın VPN, proxy sunucusu veya benzer ağ araçlarını kullanmadığından emin olun. Bu araçların kullanımı QR kodunun doğru şekilde görüntülenmesini veya tanınmasını engelleyebilir ve KYC yüz doğrulama sürecini etkileyebilir. Doğrulama işlemine devam etmeden önce bunları devre dışı bırakmanız önerilir.",
       "VideoTitle": "Demo Video",
       "VideoTitle": "Demo Video",
       "VideoNotSupported": "Tarayıcınız video oynatmayı desteklemiyor."
       "VideoNotSupported": "Tarayıcınız video oynatmayı desteklemiyor."
     },
     },
@@ -1392,6 +1398,10 @@
       "AddressDescription": "Adres kanıtı olarak kullanılabilen belgeler:",
       "AddressDescription": "Adres kanıtı olarak kullanılabilen belgeler:",
       "AddressTip": "Lütfen geçerli güncel ikamet adresi sağladığınızdan emin olun. Daha sonraki aşamada bir adres kanıtı sağlamanız istenecektir."
       "AddressTip": "Lütfen geçerli güncel ikamet adresi sağladığınızdan emin olun. Daha sonraki aşamada bir adres kanıtı sağlamanız istenecektir."
     },
     },
+    "item1": "Lütfen doğrulama gerekliliklerine uygun olarak gerekli Ek Belgeleri yükleyin:",
+    "item2": "1. Belge içeriği net ve okunabilir olmalı, sayfalar eksiksiz olmalı ve herhangi bir kısmı kapatılmamış veya kesilmemiş olmalıdır.",
+    "item3": "2. Yüklenen dosyanın boyutu 20 MB'den küçük olmalıdır.",
+    "item4": "3. İnceleme sürecinin sorunsuz tamamlanabilmesi için gönderilen belgelerin doğrulama gerekliliklerine uygun olduğundan emin olun.",
     "Label": {
     "Label": {
       "CustomerType": "Müşteri Türü",
       "CustomerType": "Müşteri Türü",
       "CustomerType1": "Bireysel",
       "CustomerType1": "Bireysel",
@@ -1549,7 +1559,7 @@
       "agree25": "(Ekstra lot şartı yoktur, ayrıntılar için lütfen CWG müşteri hizmetleri ile iletişime geçin)",
       "agree25": "(Ekstra lot şartı yoktur, ayrıntılar için lütfen CWG müşteri hizmetleri ile iletişime geçin)",
       "PromoCode": "Promosyon Kodu",
       "PromoCode": "Promosyon Kodu",
       "Channel1": "Banka Transferi",
       "Channel1": "Banka Transferi",
-      "Channel2": "China UnionPay",
+      "Channel2": "Çin Online Bankacılığı",
       "Channel3": "Kripto Para Cüzdanı",
       "Channel3": "Kripto Para Cüzdanı",
       "Channel4": "Elektronik Cüzdan",
       "Channel4": "Elektronik Cüzdan",
       "Tips": "İpucu: Başkalarının hesaplarından yapılan havaleleri kabul etmiyoruz."
       "Tips": "İpucu: Başkalarının hesaplarından yapılan havaleleri kabul etmiyoruz."
@@ -2020,7 +2030,7 @@
       "GoodThings": "Lüks Eşyalar",
       "GoodThings": "Lüks Eşyalar",
       "HouseholdDailyUse": "Ev Günlük Kullanım",
       "HouseholdDailyUse": "Ev Günlük Kullanım",
       "Automobile": "Otomobil",
       "Automobile": "Otomobil",
-      "Transaction": "Ticaret",
+      "Transaction": "İşlem",
       "BoutiqueRecommendation": "Butik Tavsiye",
       "BoutiqueRecommendation": "Butik Tavsiye",
       "PointsExchanged": "Değiştirilen Puanlar:",
       "PointsExchanged": "Değiştirilen Puanlar:",
       "To": "Teslimat Adresi:",
       "To": "Teslimat Adresi:",
@@ -2259,7 +2269,8 @@
     "item4": "Yukarıdaki butona tıklayamıyorsanız lütfen aşağıdaki tam URL'yi kopyalayıp tarayıcınızın adres çubuğuna yapıştırın ve ödeme sayfasına gitmek ve işlemi tamamlamak için Enter'a basın",
     "item4": "Yukarıdaki butona tıklayamıyorsanız lütfen aşağıdaki tam URL'yi kopyalayıp tarayıcınızın adres çubuğuna yapıştırın ve ödeme sayfasına gitmek ve işlemi tamamlamak için Enter'a basın",
     "Or": "Veya",
     "Or": "Veya",
     "MarginLevel": "Marj Seviyesi",
     "MarginLevel": "Marj Seviyesi",
-    "RegDate": "Kayıt Tarihi"
+    "RegDate": "Kayıt Tarihi",
+    "Ali": "Alipay"
   },
   },
   "AccountType": {
   "AccountType": {
     "ClassicAccount": "Klasik Hesap",
     "ClassicAccount": "Klasik Hesap",
@@ -2268,7 +2279,8 @@
     "ProfessionalAccount": "Profesyonel Hesap",
     "ProfessionalAccount": "Profesyonel Hesap",
     "StandardAccount": "Standart Hesap",
     "StandardAccount": "Standart Hesap",
     "CentAccount": "Cent Account",
     "CentAccount": "Cent Account",
-    "SpeedAccount": "Anında Hesap"
+    "SpeedAccount": "Anında Hesap",
+    "CommissionAccount": "Komisyon Hesap"
   },
   },
   "ApplicationDialog": {
   "ApplicationDialog": {
     "Des43": "PAMM Hesap Başvurusu Başarısız Oldu",
     "Des43": "PAMM Hesap Başvurusu Başarısız Oldu",
@@ -3141,7 +3153,8 @@
       "item19": "3. Hesabın aktif olması gerekir (her ay en az bir işlem yapılmalıdır).",
       "item19": "3. Hesabın aktif olması gerekir (her ay en az bir işlem yapılmalıdır).",
       "item20": "4. Faiz, günlük hesap bakiyesine göre hesaplanır ve aylık olarak birikir.",
       "item20": "4. Faiz, günlük hesap bakiyesine göre hesaplanır ve aylık olarak birikir.",
       "item21": "Örnek: Bir müşterinin günlük ortalama bakiyesi $10,000 ise, etkinlik süresi boyunca şunları kazanabilir: Günlük faiz: $10,000 × (4.5% ÷ 365) ≈ $1.23; 3 aylık toplam kazanç: yaklaşık $110.7.",
       "item21": "Örnek: Bir müşterinin günlük ortalama bakiyesi $10,000 ise, etkinlik süresi boyunca şunları kazanabilir: Günlük faiz: $10,000 × (4.5% ÷ 365) ≈ $1.23; 3 aylık toplam kazanç: yaklaşık $110.7.",
-      "item22": "5. Müşteri istediği zaman para çekebilir; bakiyede yapılan azalma, faiz kazancı sağlamaz; geri kalan tutar günlük olarak faiz kazanmaya devam eder."
+      "item22": "5. Müşteri istediği zaman para çekebilir; bakiyede yapılan azalma, faiz kazancı sağlamaz; geri kalan tutar günlük olarak faiz kazanmaya devam eder.",
+      "itemW2": "Cashback"
     }
     }
   },
   },
   "wallet": {
   "wallet": {

+ 18 - 11
locale/ug.json

@@ -31,8 +31,8 @@
     },
     },
     "Downloadpage": {
     "Downloadpage": {
       "item41": "App يۈكلەش",
       "item41": "App يۈكلەش",
-      "item42": "CWG Center App يۈكلەش",
-      "item43": "CWG Center App، ھەممە ئىشلەتنى بىر جەرياندەك پلاتفورما. كودى سانلىق ياكى بىر باسما بىلەن تېز يۈكلىگىلى بولىدۇ، پەرقىدەك ۋاقىتتە ئەھۋاللار يېڭىلانىدۇ، سودى تېز ۋە ئاسان، ھەر ۋاقىت ھەر جايدە ئاسانلا ئىشلەتسىڭىز بولىدۇ، سودا ئۈلۈشىدىن خالىغانچە مەغلۇب بولماڭ."
+      "item42": "CWG Center APP نى چۈشۈرۈش",
+      "item43": "ھېساباتىڭىزنى باشقۇرۇش، بازار ئانالىزىغا ئېرىشىش ۋە كۆچۈرۈپ سودا قىلىش (Copy Trading) جەمئىيىتى بىلەن باغلىنىشنىڭ ھەممىسى بىر ئەپتە. QR كودنى سىكاننېرلاڭ ياكى بىر قېتىم بېسىپ APP نى چۈشۈرۈڭ، شۇ ئارقىلىق ھېسابات باشقۇرۇش ۋە سودا قارارلىرىنى چىقىرىشنى تېخىمۇ ئۈنۈملۈك ۋە قولايلىق قىلىڭ."
     },
     },
     "tradingCenter": {
     "tradingCenter": {
       "item71": "ئالىم-ئۈزۈم ماددا",
       "item71": "ئالىم-ئۈزۈم ماددا",
@@ -766,7 +766,8 @@
     "ResetPassword": "سودا پارولىنى قايتا بەلگىلەش",
     "ResetPassword": "سودا پارولىنى قايتا بەلگىلەش",
     "Upload": "ھۆججەت يوللاش",
     "Upload": "ھۆججەت يوللاش",
     "More": "تېخىمۇ كۆپ",
     "More": "تېخىمۇ كۆپ",
-    "Hide": "يوشۇرۇش"
+    "Hide": "يوشۇرۇش",
+    "Close": "ياغلا"
   },
   },
   "State": {
   "State": {
     "ToBeProcessed": "بىر تەرەپ قىلىنىدۇ",
     "ToBeProcessed": "بىر تەرەپ قىلىنىدۇ",
@@ -776,8 +777,8 @@
     "Completed": "تاماملاندى",
     "Completed": "تاماملاندى",
     "Unfinished": "تاماملانمىدى",
     "Unfinished": "تاماملانمىدى",
     "NotApply": "ئىلتىماس قىلىنمىدى",
     "NotApply": "ئىلتىماس قىلىنمىدى",
-    "Applied": "ئىلتىماس قىلىندى",
-    "Granted": "تارقىتىلدى",
+    "Applied": "ئەۋەتتى",
+    "Granted": "بەرىلدى",
     "Refused": "رەت قىلىندى",
     "Refused": "رەت قىلىندى",
     "Normal": "نورمال",
     "Normal": "نورمال",
     "Freeze": "توڭلىتىلدى",
     "Freeze": "توڭلىتىلدى",
@@ -785,11 +786,11 @@
     "Lock": "قۇلۇپلاش",
     "Lock": "قۇلۇپلاش",
     "Again": "قايتا يوللاش",
     "Again": "قايتا يوللاش",
     "Ongoing": "داۋاملىشىۋاتىدۇ",
     "Ongoing": "داۋاملىشىۋاتىدۇ",
-    "InTask": "ۋەزىپە ئىچىدە",
+    "InTask": "مەسىلەدە",
     "Complete": "تاماملاش",
     "Complete": "تاماملاش",
     "Participate": "قاتنىشىش",
     "Participate": "قاتنىشىش",
     "expireTime": "ۋاقتى ئۆتۈپ كەتتى",
     "expireTime": "ۋاقتى ئۆتۈپ كەتتى",
-    "Ended": "ئاخىرلاشتى",
+    "Ended": "تەماملاندى",
     "Cancelled": "بىكار قىلىندى"
     "Cancelled": "بىكار قىلىندى"
   },
   },
   "Downloadpage": {
   "Downloadpage": {
@@ -1321,6 +1322,7 @@
       "NoticeItem4": "پەقەت ئەسلى نۇسخا تارتىلغان سۈرەت قوبۇل قىلىنىدۇ، بېسىلغان ياكى كۆچۈرۈلگەن نۇسخىلار قوبۇل قىلىنمايدۇ.",
       "NoticeItem4": "پەقەت ئەسلى نۇسخا تارتىلغان سۈرەت قوبۇل قىلىنىدۇ، بېسىلغان ياكى كۆچۈرۈلگەن نۇسخىلار قوبۇل قىلىنمايدۇ.",
       "NoticeItem5": "كىملىك ۋە يۈزنىڭ سىستېما بەلگىلىگەن كۆرۈنۈش رامكىسى ئىچىدە بولۇشى ۋە سۈرەتنىڭ ئېنىق بولۇشىغا كاپالەتلىك قىلىڭ.",
       "NoticeItem5": "كىملىك ۋە يۈزنىڭ سىستېما بەلگىلىگەن كۆرۈنۈش رامكىسى ئىچىدە بولۇشى ۋە سۈرەتنىڭ ئېنىق بولۇشىغا كاپالەتلىك قىلىڭ.",
       "NoticeItem6": "دەلىللەش مەشغۇلاتى چوقۇم سودا ھېسابات ئىگىسىنىڭ ئۆزى تەرىپىدىن تاماملىنىشى كېرەك، يۈز كىملىكتىكى سۈرەت بىلەن بىردەك بولۇشى كېرەك.",
       "NoticeItem6": "دەلىللەش مەشغۇلاتى چوقۇم سودا ھېسابات ئىگىسىنىڭ ئۆزى تەرىپىدىن تاماملىنىشى كېرەك، يۈز كىملىكتىكى سۈرەت بىلەن بىردەك بولۇشى كېرەك.",
+      "NoticeItem7": "ئەپاراتىڭىزدا VPN، ۋاكىللىق (Proxy) ياكى شۇنداق تور قوراللىرىنىڭ ئىلگىرىچىلىك بىلەن ئىشلەۋاتقانلىقىغا ئەمىن بولۇڭ. بۇ قوراللار QR كودنىڭ توغرا كۆرۈنمەسلىكىگە ياكى تاپشۇرۇلۇشقا تەسىر قىلىشى، KYC بويىچە چىراي دەلىل تەستىقلىنىشىغا توسقۇنلۇق يارىتىشى مۇمكىن. تەستىقلەشتىن بۇرۇن ئۇلارنى ئۆچۈرۈپ ئىشلەش تەۋسىيە قىلىنىدۇ.",
       "VideoTitle": "نامايان سىن",
       "VideoTitle": "نامايان سىن",
       "VideoNotSupported": "تور كۆرگۈچىڭىز سىن قويۇشنى قوللىمايدۇ。"
       "VideoNotSupported": "تور كۆرگۈچىڭىز سىن قويۇشنى قوللىمايدۇ。"
     },
     },
@@ -1451,6 +1453,10 @@
       "AddressDescription": "ئادرىس دەلىلى سۈپىتىدە ئىشلىتىلىدىغان ھۆججەتلەر:",
       "AddressDescription": "ئادرىس دەلىلى سۈپىتىدە ئىشلىتىلىدىغان ھۆججەتلەر:",
       "AddressTip": "ئېتىبار بىرىپ، ھەقىقىي ۋە ئامالغا ئاسان ئادرېسىڭىزنى تەمىنلەڭ. كېيىنكى قەدەملىرىدە سىزدىن ئادرىس دەلىلى تەلەپ قىلىنىدۇ."
       "AddressTip": "ئېتىبار بىرىپ، ھەقىقىي ۋە ئامالغا ئاسان ئادرېسىڭىزنى تەمىنلەڭ. كېيىنكى قەدەملىرىدە سىزدىن ئادرىس دەلىلى تەلەپ قىلىنىدۇ."
     },
     },
+    "item1": "تەكشۈرۈش تەلىپلىرىگە ئاساسەن مۇناسىۋەتلىك قوشۇمچە ھۆججەتلەرنى يۈكلەڭ:",
+    "item2": "1.ھۆججەت مەزمۇنى ئايدىڭ ۋە ئوقۇلىدىغان بولۇپ، بەتلەر تولۇق، ئۈستى-ئاستى يېپىلمىغان بولسۇن;",
+    "item3": "2.يۈكلەيدىغان ھۆججەت چوڭلۇقى 20MB دىن كىچىك بولسۇن;",
+    "item4": "3.تەمىنلىگەن ھۆججەتلەر تەكشۈرۈش تەلىپلىرىگە ماس كېلىدىغانلىقىغا كاپالەتلىك قىلىڭ، شۇنداق قىلىپ تەكشۈرۈش مۇۋەپپەقىيەتلىك بولىدۇ。",
     "Label": {
     "Label": {
       "CustomerType": "خېرىدار تىپى",
       "CustomerType": "خېرىدار تىپى",
       "CustomerType1": "شەخسى",
       "CustomerType1": "شەخسى",
@@ -1611,7 +1617,7 @@
       "agree25": "(قوشۇمچە لوت سانى تەلەپ قىلىنمايدۇ، تەپسىلات ئۈچۈن CWG Markets خېرىدار مۇلازىمىتى بىلەن ئالاقىلىشىڭ)",
       "agree25": "(قوشۇمچە لوت سانى تەلەپ قىلىنمايدۇ، تەپسىلات ئۈچۈن CWG Markets خېرىدار مۇلازىمىتى بىلەن ئالاقىلىشىڭ)",
       "PromoCode": "ئېتىبار كودى",
       "PromoCode": "ئېتىبار كودى",
       "Channel1": "خەلقئارا پۇل يۆتكەش تۆلىمى",
       "Channel1": "خەلقئارا پۇل يۆتكەش تۆلىمى",
-      "Channel2": "جۇڭگو تور بانكا تۆلىمى",
+      "Channel2": "چىن ئونلاين بانكى",
       "Channel3": "رەقەملىك پۇل",
       "Channel3": "رەقەملىك پۇل",
       "Channel4": "ئېلېكترونلۇق ھەميان",
       "Channel4": "ئېلېكترونلۇق ھەميان",
       "Tips": "ئەسكەرتىش: باشقىلارنىڭ ھېساباتىدىن تېلېگراف ئامانىتى قوبۇل قىلىنمايدۇ",
       "Tips": "ئەسكەرتىش: باشقىلارنىڭ ھېساباتىدىن تېلېگراف ئامانىتى قوبۇل قىلىنمايدۇ",
@@ -2325,7 +2331,7 @@
     "item3": "پۇل تۆلەشكە بېرىش",
     "item3": "پۇل تۆلەشكە بېرىش",
     "item4": "ئەگەر ئۈستىدىكى كۇنۇپكىنى باسالمىسىڭىز، تۆۋەندىكى تولۇق URL ئادرېسىنى كۆچۈرۈپ، تور كۆرگۈچىڭىزنىڭ ئادرېس ستونىغا چاپلاپ Enter كۇنۇپكىسىنى بېسىڭ، پۇل تۆلەش بېتىگە يۆتكىلىپ پۇل تۆلەش مەشغۇلاتىنى قىلىڭ",
     "item4": "ئەگەر ئۈستىدىكى كۇنۇپكىنى باسالمىسىڭىز، تۆۋەندىكى تولۇق URL ئادرېسىنى كۆچۈرۈپ، تور كۆرگۈچىڭىزنىڭ ئادرېس ستونىغا چاپلاپ Enter كۇنۇپكىسىنى بېسىڭ، پۇل تۆلەش بېتىگە يۆتكىلىپ پۇل تۆلەش مەشغۇلاتىنى قىلىڭ",
     "Or": "يەك",
     "Or": "يەك",
-    "MarginLevel": "保证金 دەرىجىسى",
+    "MarginLevel": "دەرىجىسى",
     "RegDate": "تسجيل كۈنى"
     "RegDate": "تسجيل كۈنى"
   },
   },
   "AccountType": {
   "AccountType": {
@@ -2336,7 +2342,8 @@
     "StandardAccount": "ستاندارت ھېسابات",
     "StandardAccount": "ستاندارت ھېسابات",
     "CentAccount": "سېنت ھېسابات",
     "CentAccount": "سېنت ھېسابات",
     "SpeedAccount": "تېز ھېسابات",
     "SpeedAccount": "تېز ھېسابات",
-    "NewSpeedAccount": "تېز ھېسابات"
+    "NewSpeedAccount": "تېز ھېسابات",
+    "CommissionAccount": "ھېسابات كومىسسىيە"
   },
   },
   "ApplicationDialog": {
   "ApplicationDialog": {
     "Des43": "PAMM ھېساباتىغا ئىلتىماس قىلىش مەغلۇب بولدى",
     "Des43": "PAMM ھېساباتىغا ئىلتىماس قىلىش مەغلۇب بولدى",
@@ -3145,7 +3152,7 @@
       "item1_31": "پائالىيەت ۋاقتى:2024-يىل 9-ئاينىڭ 1-كۈنىدىن 2024-يىل 10-ئاينىڭ 31-كۈنىگىچە"
       "item1_31": "پائالىيەت ۋاقتى:2024-يىل 9-ئاينىڭ 1-كۈنىدىن 2024-يىل 10-ئاينىڭ 31-كۈنىگىچە"
     },
     },
     "NewYear24": {
     "NewYear24": {
-      "itemW2": "قايتۇرۇش",
+      "itemW2": "نقد خەۋەر",
       "itemW1": "پۇلغا پايىز",
       "itemW1": "پۇلغا پايىز",
       "item1": "كۈندىلىك كىرىم يېڭى يىل مۇكاپات پىلانى",
       "item1": "كۈندىلىك كىرىم يېڭى يىل مۇكاپات پىلانى",
       "item2": "يىل باشىدا ئامەت، بايلىق ئۆسۈشى! كۈندىلىك كىرىم يېڭى يىل پىلانى، يىللىق پايدىسى 5.5% غىچە، تېخىمۇ بايلىق قوشۇمچە كۇپۇنى بىلەن، كىرىمىڭىزنى يەنە تاغغا كۆتۈرۈڭ!",
       "item2": "يىل باشىدا ئامەت، بايلىق ئۆسۈشى! كۈندىلىك كىرىم يېڭى يىل پىلانى، يىللىق پايدىسى 5.5% غىچە، تېخىمۇ بايلىق قوشۇمچە كۇپۇنى بىلەن، كىرىمىڭىزنى يەنە تاغغا كۆتۈرۈڭ!",

+ 22 - 9
locale/vn.json

@@ -31,8 +31,8 @@
     },
     },
     "Downloadpage": {
     "Downloadpage": {
       "item41": "Tải App",
       "item41": "Tải App",
-      "item42": "Tải CWG Center App",
-      "item43": "CWG Center App, nền tảng giao dịch一站式. Quét mã QR hoặc tải về bằng một cú nhấp, cập nhật thị trường thời gian thực, giao dịch đơn giản và hiệu quả, dễ dàng vận hành bất kỳ lúc nào, bất kỳ đâu, không bỏ lỡ cơ hội đầu tư nào."
+      "item42": "Tải xuống ứng dụng CWG Center",
+      "item43": "Quản lý tài khoản, truy cập phân tích thị trường và kết nối với cộng đồng giao dịch sao chép — tất cả trong một ứng dụng. Quét mã QR hoặc nhấp để tải ứng dụng chỉ với một lần chạm, giúp việc quản lý tài khoản và đưa ra quyết định giao dịch trở nên hiệu quả và thuận tiện hơn."
     },
     },
     "tradingCenter": {
     "tradingCenter": {
       "item71": "Kim loại quý",
       "item71": "Kim loại quý",
@@ -717,7 +717,8 @@
     "ResetPassword": "Đặt lại mật khẩu giao dịch",
     "ResetPassword": "Đặt lại mật khẩu giao dịch",
     "Upload": "Tải lên tập tin",
     "Upload": "Tải lên tập tin",
     "Search": "Tìm kiếm",
     "Search": "Tìm kiếm",
-    "Detail": "Chi Tiết"
+    "Detail": "Chi Tiết",
+    "Close": "Đóng"
   },
   },
   "State": {
   "State": {
     "ToCertified": "Xác minh bằng video",
     "ToCertified": "Xác minh bằng video",
@@ -737,7 +738,11 @@
     "Complete": "Đã hoàn thành",
     "Complete": "Đã hoàn thành",
     "Participate": "Tham gia",
     "Participate": "Tham gia",
     "expireTime": "Đã hết hạn",
     "expireTime": "Đã hết hạn",
-    "Cancelled": "Đã hủy"
+    "Cancelled": "Đã hủy",
+    "Applied": "Đã Áp Dụng",
+    "Granted": "Đã Phát",
+    "InTask": "Trong Nhiệm Vụ",
+    "Ended": "Kết Thúc"
   },
   },
   "Downloadpage": {
   "Downloadpage": {
     "item1": "Trading Platform",
     "item1": "Trading Platform",
@@ -1263,6 +1268,7 @@
       "NoticeItem4": "Chỉ chấp nhận tài liệu gốc để chụp. Bản in hoặc bản sao không được chấp nhận.",
       "NoticeItem4": "Chỉ chấp nhận tài liệu gốc để chụp. Bản in hoặc bản sao không được chấp nhận.",
       "NoticeItem5": "Vui lòng đảm bảo giấy tờ tùy thân và khuôn mặt nằm trong khung quy định của hệ thống, với hình ảnh rõ ràng.",
       "NoticeItem5": "Vui lòng đảm bảo giấy tờ tùy thân và khuôn mặt nằm trong khung quy định của hệ thống, với hình ảnh rõ ràng.",
       "NoticeItem6": "Thao tác xác minh phải được hoàn thành bởi chủ tài khoản giao dịch cá nhân, và khuôn mặt phải khớp với ảnh giấy tờ tùy thân.",
       "NoticeItem6": "Thao tác xác minh phải được hoàn thành bởi chủ tài khoản giao dịch cá nhân, và khuôn mặt phải khớp với ảnh giấy tờ tùy thân.",
+      "NoticeItem7": "Vui lòng đảm bảo thiết bị của bạn không sử dụng VPN, máy chủ proxy hoặc các công cụ mạng tương tự. Việc sử dụng các công cụ này có thể khiến mã QR không hiển thị hoặc không được nhận diện đúng cách, đồng thời ảnh hưởng đến quá trình xác minh khuôn mặt KYC. Khuyến nghị tắt chúng trước khi tiến hành xác minh.",
       "VideoTitle": "Video demo",
       "VideoTitle": "Video demo",
       "VideoNotSupported": "Trình duyệt của bạn không hỗ trợ phát video."
       "VideoNotSupported": "Trình duyệt của bạn không hỗ trợ phát video."
     },
     },
@@ -1392,6 +1398,10 @@
       "AddressDescription": "Giấy tờ có thể sử dụng làm bằng chứng về địa chỉ:",
       "AddressDescription": "Giấy tờ có thể sử dụng làm bằng chứng về địa chỉ:",
       "AddressTip": "Đảm bảo rằng bạn đã cung cấp địa chỉ cư trú hiện tại hợp lệ. Ở bước sau bạn sẽ được yêu cầu cung cấp bằng chứng về địa chỉ."
       "AddressTip": "Đảm bảo rằng bạn đã cung cấp địa chỉ cư trú hiện tại hợp lệ. Ở bước sau bạn sẽ được yêu cầu cung cấp bằng chứng về địa chỉ."
     },
     },
+    "item1": "Vui lòng tải lên các Tài liệu Bổ sung theo yêu cầu xác minh:",
+    "item2": "1.Nội dung tài liệu phải rõ ràng, dễ đọc, các trang đầy đủ và không bị che khuất hoặc cắt xén.",
+    "item3": "2.Kích thước tệp tải lên phải nhỏ hơn 20MB.",
+    "item4": "3.Vui lòng đảm bảo rằng các tài liệu được gửi đáp ứng yêu cầu xác minh để quá trình xét duyệt được hoàn tất thuận lợi.",
     "Label": {
     "Label": {
       "CustomerType": "Kiểu khách hàng",
       "CustomerType": "Kiểu khách hàng",
       "CustomerType1": "Cá nhân",
       "CustomerType1": "Cá nhân",
@@ -1549,7 +1559,7 @@
       "agree25": "(Không có thêm yêu cầu về lô, hãy tham vấn bộ phận dịch vụ khách hàng của CWG Markets để biết thông tin chi tiết)",
       "agree25": "(Không có thêm yêu cầu về lô, hãy tham vấn bộ phận dịch vụ khách hàng của CWG Markets để biết thông tin chi tiết)",
       "PromoCode": "Mã ưu đãi",
       "PromoCode": "Mã ưu đãi",
       "Channel1": "Chuyển khoản qua ngân hàng",
       "Channel1": "Chuyển khoản qua ngân hàng",
-      "Channel2": "China UnionPay",
+      "Channel2": "Ngân hàng Trực tuyến Trung Quốc",
       "Channel3": "Ví tiền điện tử",
       "Channel3": "Ví tiền điện tử",
       "Channel4": "Ví điện tử",
       "Channel4": "Ví điện tử",
       "Tips": "Tips:Không chấp nhận tiền gửi bằng chuyển khoản từ các tài khoản không phải của bạn"
       "Tips": "Tips:Không chấp nhận tiền gửi bằng chuyển khoản từ các tài khoản không phải của bạn"
@@ -2020,7 +2030,7 @@
       "GoodThings": " Luxury Goods",
       "GoodThings": " Luxury Goods",
       "HouseholdDailyUse": " Household Daily-Use ",
       "HouseholdDailyUse": " Household Daily-Use ",
       "Automobile": " Automobile",
       "Automobile": " Automobile",
-      "Transaction": "Trading",
+      "Transaction": "Giao dịch",
       "BoutiqueRecommendation": " Boutique Recommendation",
       "BoutiqueRecommendation": " Boutique Recommendation",
       "PointsExchanged": "Points redeemed:",
       "PointsExchanged": "Points redeemed:",
       "To": "Deliver to:",
       "To": "Deliver to:",
@@ -2260,7 +2270,8 @@
     "item4": "Nếu bạn không thể nhấp vào nút ở trên vui lòng sao chép toàn bộ URL dưới đây dán nó vào thanh địa chỉ của trình duyệt và nhấn Enter để đi đến trang thanh toán và hoàn tất giao dịch",
     "item4": "Nếu bạn không thể nhấp vào nút ở trên vui lòng sao chép toàn bộ URL dưới đây dán nó vào thanh địa chỉ của trình duyệt và nhấn Enter để đi đến trang thanh toán và hoàn tất giao dịch",
     "Or": "Hoặc",
     "Or": "Hoặc",
     "MarginLevel": "Mức Bảo đảm",
     "MarginLevel": "Mức Bảo đảm",
-    "RegDate": "Ngày Đăng Ký"
+    "RegDate": "Ngày Đăng Ký",
+    "Ali": "Alipay"
   },
   },
   "AccountType": {
   "AccountType": {
     "ClassicAccount": "Tài khoản Classic",
     "ClassicAccount": "Tài khoản Classic",
@@ -2269,7 +2280,8 @@
     "ProfessionalAccount": "Tài khoản trả phí",
     "ProfessionalAccount": "Tài khoản trả phí",
     "StandardAccount": "Tài khoản Tiêu chuẩn",
     "StandardAccount": "Tài khoản Tiêu chuẩn",
     "CentAccount": "Cent Account",
     "CentAccount": "Cent Account",
-    "SpeedAccount": "Tài khoản Tức thì"
+    "SpeedAccount": "Tài khoản Tức thì",
+    "CommissionAccount": "Tài khoản Hoa hồng"
   },
   },
   "ApplicationDialog": {
   "ApplicationDialog": {
     "Des43": "Ứng dụng PAMM của bạn đã thất bại",
     "Des43": "Ứng dụng PAMM của bạn đã thất bại",
@@ -3141,7 +3153,8 @@
       "item19": "3. Phải là tài khoản hoạt động (mỗi tháng cần hoàn thành ít nhất một giao dịch).",
       "item19": "3. Phải là tài khoản hoạt động (mỗi tháng cần hoàn thành ít nhất một giao dịch).",
       "item20": "4. Lãi suất được tính dựa trên số dư tài khoản hàng ngày, tích lũy và phát hành hàng tháng.",
       "item20": "4. Lãi suất được tính dựa trên số dư tài khoản hàng ngày, tích lũy và phát hành hàng tháng.",
       "item21": "Ví dụ: Nếu số dư trung bình hàng ngày của khách hàng là $10,000, trong thời gian sự kiện có thể nhận được: Lãi suất hàng ngày: $10,000 × (4.5% ÷ 365) ≈ $1.23; Tổng thu nhập trong 3 tháng: khoảng $110.7.",
       "item21": "Ví dụ: Nếu số dư trung bình hàng ngày của khách hàng là $10,000, trong thời gian sự kiện có thể nhận được: Lãi suất hàng ngày: $10,000 × (4.5% ÷ 365) ≈ $1.23; Tổng thu nhập trong 3 tháng: khoảng $110.7.",
-      "item22": "5. Khách hàng có thể rút tiền bất cứ lúc nào, phần số dư giảm sẽ không được tính lãi; số tiền còn lại tiếp tục tính lãi hàng ngày."
+      "item22": "5. Khách hàng có thể rút tiền bất cứ lúc nào, phần số dư giảm sẽ không được tính lãi; số tiền còn lại tiếp tục tính lãi hàng ngày.",
+      "itemW2": "Hoàn Tiền"
     }
     }
   },
   },
   "wallet": {
   "wallet": {

+ 20 - 7
locale/zhHant.json

@@ -31,8 +31,8 @@
     },
     },
     "Downloadpage": {
     "Downloadpage": {
       "item41": "App 下載",
       "item41": "App 下載",
-      "item42": "CWG Center App 下載",
-      "item43": "CWG Center App,一站式交易平台。掃碼或一鍵即可下載,行情實時更新,交易簡單高效,隨時隨地輕鬆操作,不錯過每一個投資良機。"
+      "item42": "CWG中心APP下載",
+      "item43": "將賬戶管理、市場分析與跟單社區裝進口袋。掃碼或點擊一鍵下載APP,讓賬戶管理與交易決策更加高效便捷。"
     },
     },
     "tradingCenter": {
     "tradingCenter": {
       "item71": "貴金屬",
       "item71": "貴金屬",
@@ -716,7 +716,8 @@
     "ResetPassword": "重置交易密碼",
     "ResetPassword": "重置交易密碼",
     "Upload": "上傳文件",
     "Upload": "上傳文件",
     "Search": "查詢",
     "Search": "查詢",
-    "Detail": "詳情"
+    "Detail": "詳情",
+    "Close": "關閉"
   },
   },
   "State": {
   "State": {
     "ToBeProcessed": "待處理",
     "ToBeProcessed": "待處理",
@@ -736,7 +737,11 @@
     "Complete": "完成",
     "Complete": "完成",
     "Participate": "參與",
     "Participate": "參與",
     "expireTime": "已過期",
     "expireTime": "已過期",
-    "Cancelled": "已取消"
+    "Cancelled": "已取消",
+    "Applied": "已申請",
+    "Granted": "已發放",
+    "InTask": "任務中",
+    "Ended": "已結束"
   },
   },
   "Downloadpage": {
   "Downloadpage": {
     "item1": "下載中心",
     "item1": "下載中心",
@@ -1264,6 +1269,7 @@
       "NoticeItem4": "僅接受原件拍攝,不接受打印件或複印件。",
       "NoticeItem4": "僅接受原件拍攝,不接受打印件或複印件。",
       "NoticeItem5": "請確保證件及人臉位於系統規定的取景框內,畫面清晰。",
       "NoticeItem5": "請確保證件及人臉位於系統規定的取景框內,畫面清晰。",
       "NoticeItem6": "認證操作必須由交易賬戶持有人本人完成,且人臉需與身份證照片保持一致。",
       "NoticeItem6": "認證操作必須由交易賬戶持有人本人完成,且人臉需與身份證照片保持一致。",
+      "NoticeItem7": "請確認設備未開啟 VPN、代理伺服器或類似網路工具。使用上述工具可能導致二維碼無法正常顯示或識別,並影響 KYC 人臉認證結果,建議關閉後再進行驗證。",
       "VideoTitle": "演示視頻",
       "VideoTitle": "演示視頻",
       "VideoNotSupported": "您的瀏覽器不支持視頻播放。"
       "VideoNotSupported": "您的瀏覽器不支持視頻播放。"
     },
     },
@@ -1393,6 +1399,10 @@
       "AddressDescription": "可以用作地址證明的文件:",
       "AddressDescription": "可以用作地址證明的文件:",
       "AddressTip": "請您確保提供有效的當前居住地址。在隨後的步驟中,您將被要求提供地址證明。"
       "AddressTip": "請您確保提供有效的當前居住地址。在隨後的步驟中,您將被要求提供地址證明。"
     },
     },
+    "item1": "請根據審核要求上傳相關附加文件,文件要求如下:",
+    "item2": "1.文件內容需清晰可讀,頁面完整無遮擋;",
+    "item3": "2.上傳檔案大小需小於 20MB;",
+    "item4": "3.請確保所提交文件與審核要求一致,以便順利完成審核。",
     "Label": {
     "Label": {
       "CustomerType": "客戶類型",
       "CustomerType": "客戶類型",
       "CustomerType1": "個人",
       "CustomerType1": "個人",
@@ -2258,7 +2268,8 @@
     "item4": "如果您無法點擊上面的按鈕,請複製下方完整的URL地址,貼上到您的瀏覽器的地址末端然後按回車鍵,跳轉至支付界面進行付款操作",
     "item4": "如果您無法點擊上面的按鈕,請複製下方完整的URL地址,貼上到您的瀏覽器的地址末端然後按回車鍵,跳轉至支付界面進行付款操作",
     "Or": "或",
     "Or": "或",
     "MarginLevel": "爆倉比",
     "MarginLevel": "爆倉比",
-    "RegDate": "註冊日期"
+    "RegDate": "註冊日期",
+    "Ali": "支付寶"
   },
   },
   "AccountType": {
   "AccountType": {
     "ClassicAccount": "經典帳戶",
     "ClassicAccount": "經典帳戶",
@@ -2267,7 +2278,8 @@
     "ProfessionalAccount": "專業帳戶",
     "ProfessionalAccount": "專業帳戶",
     "StandardAccount": "標準帳戶",
     "StandardAccount": "標準帳戶",
     "CentAccount": "美分賬戶",
     "CentAccount": "美分賬戶",
-    "SpeedAccount": "極速帳戶"
+    "SpeedAccount": "極速帳戶",
+    "CommissionAccount": "佣金帳戶"
   },
   },
   "ApplicationDialog": {
   "ApplicationDialog": {
     "Des43": "申請PAMM賬戶失敗",
     "Des43": "申請PAMM賬戶失敗",
@@ -3119,7 +3131,8 @@
       "item19": "3.需為活躍賬戶(每個月需要完成任意一筆交易)",
       "item19": "3.需為活躍賬戶(每個月需要完成任意一筆交易)",
       "item20": "4.利息基於每日賬戶餘額計算,按月累積發放。",
       "item20": "4.利息基於每日賬戶餘額計算,按月累積發放。",
       "item21": "示例:若某客戶日均餘額 $10,000,活動期內可獲得: 每日利息:$10,000 × (4.5% ÷ 365) ≈ $1.23;3個月總收益:約 $110.7。",
       "item21": "示例:若某客戶日均餘額 $10,000,活動期內可獲得: 每日利息:$10,000 × (4.5% ÷ 365) ≈ $1.23;3個月總收益:約 $110.7。",
-      "item22": "5.客戶隨時可提取資金,餘額減少部分將不再計息;剩餘金額繼續按日計息。"
+      "item22": "5.客戶隨時可提取資金,餘額減少部分將不再計息;剩餘金額繼續按日計息。",
+      "itemW2": "返現"
     }
     }
   },
   },
   "wallet": {
   "wallet": {

+ 6 - 6
manifest.json

@@ -2,8 +2,8 @@
     "name" : "CWG Center",
     "name" : "CWG Center",
     "appid" : "__UNI__F1BC8D2",
     "appid" : "__UNI__F1BC8D2",
     "description" : "应用描述",
     "description" : "应用描述",
-    "versionName" : "1.1.2",
-    "versionCode" : 2,
+    "versionName" : "1.1.3",
+    "versionCode" : 3,
     "transformPx" : false,
     "transformPx" : false,
     "app-plus" : {
     "app-plus" : {
         "console" : false,
         "console" : false,
@@ -49,10 +49,10 @@
             "ios" : {
             "ios" : {
                 "UIBackgroundModes" : [ "audio" ],
                 "UIBackgroundModes" : [ "audio" ],
                 "urlschemewhitelist" : [ "baidumap", "iosamap" ],
                 "urlschemewhitelist" : [ "baidumap", "iosamap" ],
-                "privacyDescription": {
-                    "NSPhotoLibraryUsageDescription": "访问相册用于选取图片上传头像、凭证",
-                    "NSCameraUsageDescription": "使用相机拍照上传证件、二维码识别",
-                    "NSMicrophoneUsageDescription": "麦克风用于语音客服通话、语音留言"
+                "privacyDescription" : {
+                    "NSPhotoLibraryUsageDescription" : "访问相册用于选取图片上传头像、凭证",
+                    "NSCameraUsageDescription" : "使用相机拍照上传证件、二维码识别",
+                    "NSMicrophoneUsageDescription" : "麦克风用于语音客服通话、语音留言"
                 },
                 },
                 "NSAppTransportSecurity" : {
                 "NSAppTransportSecurity" : {
                     "NSAllowsArbitraryLoads" : true
                     "NSAllowsArbitraryLoads" : true

+ 3 - 2
pages/activities/index.vue

@@ -849,7 +849,8 @@ const confirm = useConfirm()
 const { t, locale } = useI18n()
 const { t, locale } = useI18n()
 let { Code, Host05 } = Config
 let { Code, Host05 } = Config
 const showPage = ref(false)
 const showPage = ref(false)
-
+import { useFilters } from '@/composables/useFilters'
+const { numberDecimal } = useFilters()
 // 国家列表
 // 国家列表
 const countries = [
 const countries = [
     "DZ", "AO", "BJ", "BW", "BF", "CM", "CG", "CD", "CI", "DJ", "EG", "ET",
     "DZ", "AO", "BJ", "BW", "BF", "CM", "CG", "CD", "CI", "DJ", "EG", "ET",
@@ -1244,7 +1245,7 @@ const getDateList = async () => {
         // loginOptions1.value = res.data
         // loginOptions1.value = res.data
         loginOptions1.value = res.data.map(item => ({
         loginOptions1.value = res.data.map(item => ({
             ...item,
             ...item,
-            label: `${item.login} - ${groupTypeName(item.type)} - ${t('Custom.Deposit.AvailableBalance')}${groupCurrency(item.currency)}${item.balance}`,
+            label: `${item.login} - ${groupTypeName(item.type)} - ${t('Custom.Deposit.AvailableBalance')}${groupCurrency(item.currency)}${numberDecimal(item.balance)}`,
             disable: item.closeFunctions.includes('1')
             disable: item.closeFunctions.includes('1')
         }))
         }))
     } else {
     } else {

+ 3 - 3
pages/analytics/analystViews.vue

@@ -15,7 +15,7 @@
                         <view class="nav nav-underline card-header-tabs" id="myTab" role="tablist">
                         <view class="nav nav-underline card-header-tabs" id="myTab" role="tablist">
                             <view class="nav-item" v-for="item in tabsConfig" :key="item">
                             <view class="nav-item" v-for="item in tabsConfig" :key="item">
                                 <view class="nav-link cursor-pointer" @click="activeTab = item.value"
                                 <view class="nav-link cursor-pointer" @click="activeTab = item.value"
-                                    :class="{ 'active': item.value == activeTab }">{{
+                                    :class="{ 'active': item.value == activeTab }" :data-tooltip="item.text">{{
                                         item.text }}</view>
                                         item.text }}</view>
                             </view>
                             </view>
                         </view>
                         </view>
@@ -82,7 +82,7 @@ watch(activeTab, (val) => {
             endDate: '',
             endDate: '',
             startDate: '',
             startDate: '',
             id: null,
             id: null,
-            pageSize: 18
+            pageSize: 100
         }
         }
     } else {
     } else {
         fetchNewsList.value = newsApi.newsInformationNewsletterList
         fetchNewsList.value = newsApi.newsInformationNewsletterList
@@ -91,7 +91,7 @@ watch(activeTab, (val) => {
             endDate: '',
             endDate: '',
             startDate: '',
             startDate: '',
             id: null,
             id: null,
-            pageSize: 9
+            pageSize: 100
         }
         }
     }
     }
     type.value = tabsConfig.value.find(item => item.value == val).type
     type.value = tabsConfig.value.find(item => item.value == val).type

+ 19 - 3
pages/analytics/components/List.vue

@@ -28,7 +28,7 @@
     <!-- 列表 -->
     <!-- 列表 -->
     <view v-if="list.length > 0" class="list">
     <view v-if="list.length > 0" class="list">
       <view v-for="item in list" :key="item.id" class="col-12 m-b30">
       <view v-for="item in list" :key="item.id" class="col-12 m-b30">
-        <view class="card card-action action-elevate action-border-primary cursor-pointer" @click="handleItemClick(item)">
+        <view class="card card-action action-elevate action-border-primary cursor-pointer" :data-tooltip="t('vu.tooltip.t103')" @click="handleItemClick(item)">
           <view class="row g-0">
           <view class="row g-0">
             <view class="col-md-3" v-if="item.coverImage">
             <view class="col-md-3" v-if="item.coverImage">
               <view class="card-header border-0 p-0 m-2 position-relative overflow-hidden">
               <view class="card-header border-0 p-0 m-2 position-relative overflow-hidden">
@@ -68,12 +68,12 @@
 import { ref, watch, computed } from 'vue'
 import { ref, watch, computed } from 'vue'
 import { useI18n } from 'vue-i18n'
 import { useI18n } from 'vue-i18n'
 import Config from '@/config/index'
 import Config from '@/config/index'
-const { locale } = useI18n()
+const { locale, t } = useI18n()
 
 
 const props = defineProps({
 const props = defineProps({
   fetchData: { type: Function, required: true },
   fetchData: { type: Function, required: true },
   queryParams: { type: Object, default: () => ({}) },
   queryParams: { type: Object, default: () => ({}) },
-  pageSize: { type: Number, default: 10 },
+  pageSize: { type: Number, default: 100 },
   type: { type: Number, default: 0 },
   type: { type: Number, default: 0 },
   immediate: { type: Boolean, default: true },
   immediate: { type: Boolean, default: true },
 })
 })
@@ -90,6 +90,22 @@ const formatDate = (dateStr) => {
   if (!dateStr) return ''
   if (!dateStr) return ''
   return dateStr.slice(0, 10).replace('T', ' ')
   return dateStr.slice(0, 10).replace('T', ' ')
 }
 }
+const currentTitleText = computed(() => {
+  const map = {
+    1: t('News.ViewAnalysis'),
+    2: t('News.NewsInformation'),
+    3: t('News.Announcement'),
+    4: t('News.VideoCommentary'),
+    5: t('News.NewsInformation'),
+    6: t('News.VideoCommentary'),
+    7: t('News.Notice'),
+    8: t('News.TradeIdeas'),
+    9: t('News.FinancialCalendar'),
+    10: t('News.Ebook'),
+    11: t('News.VideoCommentary')
+  }
+  return map[props.type] || ''
+})
 
 
 const load = async () => {
 const load = async () => {
   list.value = []
   list.value = []

+ 2 - 27
pages/analytics/news.vue

@@ -8,31 +8,6 @@
                 </view>
                 </view>
             </view>
             </view>
             <view class="col-row">
             <view class="col-row">
-                <!-- <view class="col-xl-12">
-                    <view class="card">
-
-                        <view class="card-body">
-                            <h6 class="card-title mb-3">Popular Tags </h6>
-                            <view class="d-flex flex-wrap gap-2">
-                                <a href="javascript:void(0);"
-                                    class="badge bg-secondary-subtle text-secondary">#NZD/USD</a>
-                                <a href="javascript:void(0);"
-                                    class="badge bg-secondary-subtle text-secondary">#EUR/USD</a>
-                                <a href="javascript:void(0);"
-                                    class="badge bg-secondary-subtle text-secondary">#XAU/USD</a>
-                                <a href="javascript:void(0);"
-                                    class="badge bg-secondary-subtle text-secondary">#USOIL</a>
-                                <a href="javascript:void(0);" class="badge bg-secondary-subtle text-secondary">#US30</a>
-                                <a href="javascript:void(0);"
-                                    class="badge bg-secondary-subtle text-secondary">#UK100</a>
-                                <a href="javascript:void(0);"
-                                    class="badge bg-secondary-subtle text-secondary">#ADA/USD</a>
-                                <a href="javascript:void(0);"
-                                    class="badge bg-secondary-subtle text-secondary">#ZEC/USD</a>
-                            </view>
-                        </view>
-                    </view>
-                </view> -->
                 <view class="card">
                 <view class="card">
                     <view class="card-header">
                     <view class="card-header">
                         <view class="nav nav-underline card-header-tabs" id="myTab" role="tablist">
                         <view class="nav nav-underline card-header-tabs" id="myTab" role="tablist">
@@ -84,7 +59,7 @@ watch(activeTab, (val) => {
             tag: 3,
             tag: 3,
             endDate: '',
             endDate: '',
             startDate: '',
             startDate: '',
-            id: null, pageSize: 9
+            id: null, pageSize: 100
         }
         }
     } else {
     } else {
         fetchNewsList.value = newsApi.newsEbookList
         fetchNewsList.value = newsApi.newsEbookList
@@ -92,7 +67,7 @@ watch(activeTab, (val) => {
             tag: null,
             tag: null,
             endDate: '',
             endDate: '',
             startDate: '',
             startDate: '',
-            id: null, pageSize: 12
+            id: null, pageSize: 100
         }
         }
     }
     }
     type.value = tabsConfig.value.find(item => item.value == val).type
     type.value = tabsConfig.value.find(item => item.value == val).type

+ 26 - 24
pages/common/download.vue

@@ -1,6 +1,6 @@
 <template>
 <template>
     <cwg-page-wrapper class="create-page" :isHeaderFixed="true">
     <cwg-page-wrapper class="create-page" :isHeaderFixed="true">
-        <view class="container">
+        <view class="container download-container">
             <view
             <view
                 class="app-page-head card-header d-flex gap-3 flex-wrap align-items-center justify-content-between border-0">
                 class="app-page-head card-header d-flex gap-3 flex-wrap align-items-center justify-content-between border-0">
                 <view class="app-page-head mb-0">
                 <view class="app-page-head mb-0">
@@ -15,15 +15,15 @@
                             <view class="nav nav-pills nav-fill card-header-pills">
                             <view class="nav nav-pills nav-fill card-header-pills">
                                 <view class="nav-item">
                                 <view class="nav-item">
                                     <view class="nav-link cursor-pointer" :class="{ 'active': activeName == 'MT4' }"
                                     <view class="nav-link cursor-pointer" :class="{ 'active': activeName == 'MT4' }"
-                                        @click="activeName = 'MT4'">MetaTrader 4</view>
+                                        @click="activeName = 'MT4'" :data-tooltip="'MetaTrader 4'" data-placement="top">MetaTrader 4</view>
                                 </view>
                                 </view>
                                 <view class="nav-item">
                                 <view class="nav-item">
                                     <view class="nav-link cursor-pointer" :class="{ 'active': activeName == 'MT5' }"
                                     <view class="nav-link cursor-pointer" :class="{ 'active': activeName == 'MT5' }"
-                                        @click="activeName = 'MT5'">MetaTrader 5</view>
+                                        @click="activeName = 'MT5'" :data-tooltip="'MetaTrader 5'" data-placement="top">MetaTrader 5</view>
                                 </view>
                                 </view>
                                 <view class="nav-item" v-if="app3">
                                 <view class="nav-item" v-if="app3">
                                     <view class="nav-link cursor-pointer" :class="{ 'active': activeName == 'App' }"
                                     <view class="nav-link cursor-pointer" :class="{ 'active': activeName == 'App' }"
-                                        @click="activeName = 'App'" v-t="'vu.Downloadpage.item41'"></view>
+                                        @click="activeName = 'App'" v-t="'vu.Downloadpage.item41'" :data-tooltip="t('vu.Downloadpage.item41')" data-placement="top"></view>
                                 </view>
                                 </view>
                             </view>
                             </view>
                         </view>
                         </view>
@@ -36,7 +36,7 @@
                                             <p class="mb-5 lh-sm" v-t="'Downloadpage.item3'" />
                                             <p class="mb-5 lh-sm" v-t="'Downloadpage.item3'" />
                                         </view>
                                         </view>
                                         <view class="col-lg-4 mb-5">
                                         <view class="col-lg-4 mb-5">
-                                            <cwg-link type="download"
+                                            <cwg-link type="html"
                                                 :url="config.Host80 + '/mt/cwgmarketssvgltd4setup.exe'"
                                                 :url="config.Host80 + '/mt/cwgmarketssvgltd4setup.exe'"
                                                 downloadName="cwgmarketssvgltd4setup.exe" title="Downloadpage.item4">
                                                 downloadName="cwgmarketssvgltd4setup.exe" title="Downloadpage.item4">
 
 
@@ -70,7 +70,7 @@
                                             </cwg-link>
                                             </cwg-link>
                                         </view>
                                         </view>
                                         <view class="col-lg-4 mb-5">
                                         <view class="col-lg-4 mb-5">
-                                            <cwg-link type="download" class="download-card"
+                                            <cwg-link type="html" class="download-card"
                                                 :url="config.Host80 + '/mt/mt4.zip'" downloadName="mt4.zip"
                                                 :url="config.Host80 + '/mt/mt4.zip'" downloadName="mt4.zip"
                                                 title="Downloadpage.item4-1">
                                                 title="Downloadpage.item4-1">
                                                 <!--                                            <view class="btn btn-danger waves-effect waves-light">-->
                                                 <!--                                            <view class="btn btn-danger waves-effect waves-light">-->
@@ -105,7 +105,7 @@
                                             </cwg-link>
                                             </cwg-link>
                                         </view>
                                         </view>
                                         <view class="col-lg-4 mb-5">
                                         <view class="col-lg-4 mb-5">
-                                            <cwg-link type="download" class="download-card"
+                                            <cwg-link type="html" class="download-card"
                                                 :url="config.Host80 + '/mt/MetaTrader4.pkg'"
                                                 :url="config.Host80 + '/mt/MetaTrader4.pkg'"
                                                 downloadName="MetaTrader4.pkg" title="Downloadpage.item6">
                                                 downloadName="MetaTrader4.pkg" title="Downloadpage.item6">
                                                 <!--                                            <view class="btn btn-danger waves-effect waves-light"><i-->
                                                 <!--                                            <view class="btn btn-danger waves-effect waves-light"><i-->
@@ -171,7 +171,7 @@
                                         </view>
                                         </view>
                                         <h3 class="mb-3 fw-bold" v-t="'Downloadpage.item7'" />
                                         <h3 class="mb-3 fw-bold" v-t="'Downloadpage.item7'" />
                                         <view class="col-lg-6 mb-5">
                                         <view class="col-lg-6 mb-5">
-                                            <cwg-link type="download" class="download-card" :url="mt41"
+                                            <cwg-link type="html" class="download-card" :url="mt41"
                                                 downloadName="MetaTrader4.abb" title="Downloadpage.item9">
                                                 downloadName="MetaTrader4.abb" title="Downloadpage.item9">
                                                 <!--                                            <view class="btn btn-danger waves-effect waves-light"><i-->
                                                 <!--                                            <view class="btn btn-danger waves-effect waves-light"><i-->
                                                 <!--                                              class="fi fi-rr-download"></i> {{-->
                                                 <!--                                              class="fi fi-rr-download"></i> {{-->
@@ -182,7 +182,7 @@
                                                         <view class="col-md-6">
                                                         <view class="col-md-6">
                                                             <view
                                                             <view
                                                                 class="card-header border-0 download-qr-header position-relative">
                                                                 class="card-header border-0 download-qr-header position-relative">
-                                                                <QrCode :text="mt42" :width="qrSize" :height="qrSize" />
+                                                                <QrCode :text="mt41" :width="qrSize" :height="qrSize" />
                                                                 <!-- <image src="/static/images/vu/android.png" alt=""
                                                                 <!-- <image src="/static/images/vu/android.png" alt=""
                                                                 mode="widthFix" class="img-fluid" /> -->
                                                                 mode="widthFix" class="img-fluid" /> -->
                                                             </view>
                                                             </view>
@@ -203,7 +203,7 @@
                                             </cwg-link>
                                             </cwg-link>
                                         </view>
                                         </view>
                                         <view class="col-lg-6 mb-5">
                                         <view class="col-lg-6 mb-5">
-                                            <cwg-link type="download" class="download-card" :url="mt42"
+                                            <cwg-link type="html" class="download-card" :url="mt42"
                                                 downloadName="MetaTrader4.apk" title="Downloadpage.item9">
                                                 downloadName="MetaTrader4.apk" title="Downloadpage.item9">
                                                 <!--                                            <view class="btn btn-danger waves-effect waves-light"><i-->
                                                 <!--                                            <view class="btn btn-danger waves-effect waves-light"><i-->
                                                 <!--                                              class="fi fi-rr-download"></i> {{-->
                                                 <!--                                              class="fi fi-rr-download"></i> {{-->
@@ -234,7 +234,7 @@
                                             </cwg-link>
                                             </cwg-link>
                                         </view>
                                         </view>
                                         <view class="col-lg-6 mb-5">
                                         <view class="col-lg-6 mb-5">
-                                            <cwg-link type="download" class="download-card" :url="mt43"
+                                            <cwg-link type="html" class="download-card" :url="mt43"
                                                 downloadName="MetaTrader4.app" title="Downloadpage.item10">
                                                 downloadName="MetaTrader4.app" title="Downloadpage.item10">
                                                 <!--                                            <view class="btn btn-danger waves-effect waves-light"><i-->
                                                 <!--                                            <view class="btn btn-danger waves-effect waves-light"><i-->
                                                 <!--                                              class="fi fi-rr-download"></i> {{-->
                                                 <!--                                              class="fi fi-rr-download"></i> {{-->
@@ -273,7 +273,7 @@
                                             <p class="mb-5 lh-sm" v-t="'Downloadpage.item3'" />
                                             <p class="mb-5 lh-sm" v-t="'Downloadpage.item3'" />
                                         </view>
                                         </view>
                                         <view class="col-lg-4 mb-5">
                                         <view class="col-lg-4 mb-5">
-                                            <cwg-link type="download" class="download-card"
+                                            <cwg-link type="html" class="download-card"
                                                 :url="config.Host80 + '/mt/cwgmarketssvg5setup.exe'"
                                                 :url="config.Host80 + '/mt/cwgmarketssvg5setup.exe'"
                                                 downloadName="cwgmarketssvg5setup.exe" title="Downloadpage.item4">
                                                 downloadName="cwgmarketssvg5setup.exe" title="Downloadpage.item4">
                                                 <!--                                            <view class="btn btn-danger waves-effect waves-light"><i-->
                                                 <!--                                            <view class="btn btn-danger waves-effect waves-light"><i-->
@@ -307,7 +307,7 @@
                                             </cwg-link>
                                             </cwg-link>
                                         </view>
                                         </view>
                                         <view class="col-lg-4 mb-5">
                                         <view class="col-lg-4 mb-5">
-                                            <cwg-link type="download" class="download-card"
+                                            <cwg-link type="html" class="download-card"
                                                 :url="config.Host80 + '/mt/mt5.zip'" downloadName="mt5.zip"
                                                 :url="config.Host80 + '/mt/mt5.zip'" downloadName="mt5.zip"
                                                 title="Downloadpage.item4-1">
                                                 title="Downloadpage.item4-1">
                                                 <!--                                            <view class="btn btn-danger waves-effect waves-light">-->
                                                 <!--                                            <view class="btn btn-danger waves-effect waves-light">-->
@@ -342,7 +342,7 @@
                                             </cwg-link>
                                             </cwg-link>
                                         </view>
                                         </view>
                                         <view class="col-lg-4 mb-5">
                                         <view class="col-lg-4 mb-5">
-                                            <cwg-link type="download" class="download-card"
+                                            <cwg-link type="html" class="download-card"
                                                 :url="config.Host80 + '/mt/MetaTrader5.pkg'"
                                                 :url="config.Host80 + '/mt/MetaTrader5.pkg'"
                                                 downloadName="MetaTrader5.pkg" title="Downloadpage.item6">
                                                 downloadName="MetaTrader5.pkg" title="Downloadpage.item6">
                                                 <!--                                            <view class="btn btn-danger waves-effect waves-light"><i-->
                                                 <!--                                            <view class="btn btn-danger waves-effect waves-light"><i-->
@@ -409,7 +409,7 @@
                                         </view>
                                         </view>
                                         <h3 class="mb-3 fw-bold" v-t="'Downloadpage.item13'" />
                                         <h3 class="mb-3 fw-bold" v-t="'Downloadpage.item13'" />
                                         <view class="col-lg-6 mb-5">
                                         <view class="col-lg-6 mb-5">
-                                            <cwg-link type="download" class="download-card" :url="mt51"
+                                            <cwg-link type="html" class="download-card" :url="mt51"
                                                 downloadName="MetaTrader5.abb" title="Downloadpage.item14">
                                                 downloadName="MetaTrader5.abb" title="Downloadpage.item14">
                                                 <!--                                            <view class="btn btn-danger waves-effect waves-light"><i-->
                                                 <!--                                            <view class="btn btn-danger waves-effect waves-light"><i-->
                                                 <!--                                              class="fi fi-rr-download"></i> {{-->
                                                 <!--                                              class="fi fi-rr-download"></i> {{-->
@@ -420,7 +420,7 @@
                                                         <view class="col-md-6">
                                                         <view class="col-md-6">
                                                             <view
                                                             <view
                                                                 class="card-header border-0 download-qr-header position-relative">
                                                                 class="card-header border-0 download-qr-header position-relative">
-                                                                <QrCode :text="mt52" :width="qrSize" :height="qrSize" />
+                                                                <QrCode :text="mt51" :width="qrSize" :height="qrSize" />
                                                                 <!-- <image src="/static/images/vu/android.png" alt=""
                                                                 <!-- <image src="/static/images/vu/android.png" alt=""
                                                                 mode="widthFix" class="img-fluid" /> -->
                                                                 mode="widthFix" class="img-fluid" /> -->
                                                             </view>
                                                             </view>
@@ -441,7 +441,7 @@
                                             </cwg-link>
                                             </cwg-link>
                                         </view>
                                         </view>
                                         <view class="col-lg-6 mb-5">
                                         <view class="col-lg-6 mb-5">
-                                            <cwg-link type="download" class="download-card" :url="mt52"
+                                            <cwg-link type="html" class="download-card" :url="mt52"
                                                 downloadName="MetaTrader5.apk" title="Downloadpage.item14">
                                                 downloadName="MetaTrader5.apk" title="Downloadpage.item14">
                                                 <!--                                            <view class="btn btn-danger waves-effect waves-light"><i-->
                                                 <!--                                            <view class="btn btn-danger waves-effect waves-light"><i-->
                                                 <!--                                              class="fi fi-rr-download"></i> {{-->
                                                 <!--                                              class="fi fi-rr-download"></i> {{-->
@@ -472,7 +472,7 @@
                                             </cwg-link>
                                             </cwg-link>
                                         </view>
                                         </view>
                                         <view class="col-lg-6 mb-5">
                                         <view class="col-lg-6 mb-5">
-                                            <cwg-link type="download" class="download-card" :url="mt53"
+                                            <cwg-link type="html" class="download-card" :url="mt53"
                                                 downloadName="MetaTrader5.app" title="Downloadpage.item15">
                                                 downloadName="MetaTrader5.app" title="Downloadpage.item15">
                                                 <!--                                            <view class="btn btn-danger waves-effect waves-light"><i-->
                                                 <!--                                            <view class="btn btn-danger waves-effect waves-light"><i-->
                                                 <!--                                              class="fi fi-rr-download"></i> {{-->
                                                 <!--                                              class="fi fi-rr-download"></i> {{-->
@@ -511,7 +511,7 @@
                                             <p class="mb-5 lh-sm" v-t="'vu.Downloadpage.item43'" />
                                             <p class="mb-5 lh-sm" v-t="'vu.Downloadpage.item43'" />
                                         </view>
                                         </view>
                                         <view class="col-lg-6 mb-5" v-if="app1">
                                         <view class="col-lg-6 mb-5" v-if="app1">
-                                            <cwg-link type="download" class="download-card" :url="app1"
+                                            <cwg-link type="html" class="download-card" :url="app1"
                                                 downloadName="CWG Center.abb" title="CWG Center">
                                                 downloadName="CWG Center.abb" title="CWG Center">
                                                 <!--                                            <view class="btn btn-danger waves-effect waves-light"><i-->
                                                 <!--                                            <view class="btn btn-danger waves-effect waves-light"><i-->
                                                 <!--                                              class="fi fi-rr-download"></i> {{-->
                                                 <!--                                              class="fi fi-rr-download"></i> {{-->
@@ -542,7 +542,7 @@
                                             </cwg-link>
                                             </cwg-link>
                                         </view>
                                         </view>
                                         <view class="col-lg-6 mb-5" v-if="app2">
                                         <view class="col-lg-6 mb-5" v-if="app2">
-                                            <cwg-link type="download" class="download-card" :url="app2"
+                                            <cwg-link type="html" class="download-card" :url="app2"
                                                 downloadName="CWG Center.apk" title="CWG Center">
                                                 downloadName="CWG Center.apk" title="CWG Center">
                                                 <!--                                            <view class="btn btn-danger waves-effect waves-light"><i-->
                                                 <!--                                            <view class="btn btn-danger waves-effect waves-light"><i-->
                                                 <!--                                              class="fi fi-rr-download"></i> {{-->
                                                 <!--                                              class="fi fi-rr-download"></i> {{-->
@@ -572,7 +572,7 @@
                                             </cwg-link>
                                             </cwg-link>
                                         </view>
                                         </view>
                                         <view class="col-lg-6 mb-5" v-if="app3">
                                         <view class="col-lg-6 mb-5" v-if="app3">
-                                            <cwg-link type="download" class="download-card" :url="app3"
+                                            <cwg-link type="html" class="download-card" :url="app3"
                                                 downloadName="CWG Center.app" title="CWG Center">
                                                 downloadName="CWG Center.app" title="CWG Center">
                                                 <!--                                            <view class="btn btn-danger waves-effect waves-light"><i-->
                                                 <!--                                            <view class="btn btn-danger waves-effect waves-light"><i-->
                                                 <!--                                              class="fi fi-rr-download"></i> {{-->
                                                 <!--                                              class="fi fi-rr-download"></i> {{-->
@@ -621,7 +621,7 @@ const { t, locale } = useI18n()
 const activeName = ref('MT4')
 const activeName = ref('MT4')
 const logoImageRef = ref('')  // 保持变量名 logoImage
 const logoImageRef = ref('')  // 保持变量名 logoImage
 const mt41 = ref('https://www.metatrader4.com/en/download#download-block-android?server=CWGMarketsSVGLtd-Demo,CWGMarketsSVGLtd-Live')
 const mt41 = ref('https://www.metatrader4.com/en/download#download-block-android?server=CWGMarketsSVGLtd-Demo,CWGMarketsSVGLtd-Live')
-const mt42 = ref(`${config.Host80}/metatrader/metatrader4.apk`)  // 稍后动态计算
+const mt42 = ref(`${config.Host80}/metatrader/metatrader4.apk`)
 const mt43 = ref('https://apps.apple.com/us/app/metatrader-4/id496212596?server=CWGMarketsSVGLtd-Demo,CWGMarketsSVGLtd-Live')
 const mt43 = ref('https://apps.apple.com/us/app/metatrader-4/id496212596?server=CWGMarketsSVGLtd-Demo,CWGMarketsSVGLtd-Live')
 const mt51 = ref('https://download.metatrader.com/cdn/mobile/mt5/android?server=CWGMarketsSVG-Demo,CWGMarketsSVG-Live')
 const mt51 = ref('https://download.metatrader.com/cdn/mobile/mt5/android?server=CWGMarketsSVG-Demo,CWGMarketsSVG-Live')
 const mt52 = ref(`${config.Host80}/mt/metatrader5.apk`)
 const mt52 = ref(`${config.Host80}/mt/metatrader5.apk`)
@@ -1261,7 +1261,9 @@ onMounted(async () => {
     height: px2rpx(200) !important;
     height: px2rpx(200) !important;
 }
 }
 
 
-:deep(.pdf-link) {
-    width: 100%;
+.download-container {
+    :deep(.pdf-link) {
+        width: 100%;
+    }
 }
 }
 </style>
 </style>

+ 1 - 1
pages/common/webview.vue

@@ -48,7 +48,7 @@ onLoad((options) => {
   console.log('webview 接收参数:', options)
   console.log('webview 接收参数:', options)
 
 
   title.value = options.title || '文件预览'
   title.value = options.title || '文件预览'
-  const realUrl = options.url || ''
+  const realUrl = decodeURIComponent(options.url || '')
   fileType.value = getFileExt(realUrl)
   fileType.value = getFileExt(realUrl)
 
 
   // ✅ 核心修复:PDF 只编码一次,不再二次编码
   // ✅ 核心修复:PDF 只编码一次,不再二次编码

+ 22 - 19
pages/customer/components/AccountCard.vue

@@ -8,7 +8,7 @@
                     </view>
                     </view>
                     <template #content>
                     <template #content>
                         <text>{{ t("Tips.item1")
                         <text>{{ t("Tips.item1")
-                        }}<text style="color: red">{{ account.markDelTime }}</text>{{ t("Tips.item2") }}</text>
+                            }}<text style="color: red">{{ account.markDelTime }}</text>{{ t("Tips.item2") }}</text>
                     </template>
                     </template>
                 </uni-tooltip>
                 </uni-tooltip>
                 <template v-if="account.del != 1">
                 <template v-if="account.del != 1">
@@ -26,8 +26,9 @@
                     <view class="btn-group">
                     <view class="btn-group">
                         <cwg-dropdown ref="dropdownRef" @open="onOpen" @close="onClose" :menu-list="customMenuList"
                         <cwg-dropdown ref="dropdownRef" @open="onOpen" @close="onClose" :menu-list="customMenuList"
                             @menuClick="handleCustomClick">
                             @menuClick="handleCustomClick">
-                            <button class="btn btn-white btn-sm btn-shadow btn-icon waves-effect dropdown-toggle"
-                                type="button">
+                            <button
+                                class="btn btn-white btn-sm btn-shadow btn-icon waves-effect dropdown-toggle  cursor-pointer"
+                                :data-tooltip="t('Btn.More')" type="button">
                                 <cwg-icon name="crm-ellipsis-vertical" :size="18"
                                 <cwg-icon name="crm-ellipsis-vertical" :size="18"
                                     :color="!isDark ? '#6c8595' : '#fff'" />
                                     :color="!isDark ? '#6c8595' : '#fff'" />
                             </button>
                             </button>
@@ -37,11 +38,13 @@
             </view>
             </view>
             <view class="card-body p-3 pt-0">
             <view class="card-body p-3 pt-0">
                 <view class="text-left mb-3">
                 <view class="text-left mb-3">
-                    <h5 class="fw-bold mb-3  cursor-pointer" @click="copy(account.accountNumber)"># {{
-                        account.accountNumber }}</h5>
-                    <h4 class="mb-2 cursor-pointer" @click="copy(account.fwq)">{{ account.fwq }}</h4>
+                    <h5 class="fw-bold mb-3  cursor-pointer" :data-tooltip="`${t('vu.tooltip.t2')}-${account.accountNumber}`" data-placement="top"
+                        @click="copy(account.accountNumber)"># {{
+                            account.accountNumber }}</h5>
+                    <h4 class="mb-2 cursor-pointer" :data-tooltip="`${t('vu.tooltip.t2')}-${account.fwq}`" :data-placement="top"
+                        @click="copy(account.fwq)">{{ account.fwq }}</h4>
                     <template v-for="(label, index) in account.labels" :key="index">
                     <template v-for="(label, index) in account.labels" :key="index">
-                        <text v-if="label" class="badge text-danger1 bg-danger-subtle mx-1">{{ label }}</text>
+                        <text v-if="label" class="badge text-danger1 bg-danger-subtle mx-1 mb-1">{{ label }}</text>
                     </template>
                     </template>
                     <h1 class="mt-2">{{ account.balanceWithSymbol || '0.00' }}</h1>
                     <h1 class="mt-2">{{ account.balanceWithSymbol || '0.00' }}</h1>
                     <!-- <button type="submit" value="Submit" class="btn btn-secondary btn-sm w-75 waves-effect waves-light"
                     <!-- <button type="submit" value="Submit" class="btn btn-secondary btn-sm w-75 waves-effect waves-light"
@@ -165,7 +168,7 @@ const closeFunctionOpen = (code) => {
     if (closeFunctions == null || closeFunctions === "") {
     if (closeFunctions == null || closeFunctions === "") {
         return true;
         return true;
     }
     }
-    console.log(closeFunctions, 12121,String(closeFunctions).indexOf(String(code)) === -1);
+    console.log(closeFunctions, 12121, String(closeFunctions).indexOf(String(code)) === -1);
 
 
     return String(closeFunctions).indexOf(String(code)) === -1;
     return String(closeFunctions).indexOf(String(code)) === -1;
 }
 }
@@ -175,21 +178,21 @@ const circleButtons = ref([
     { key: 'transfer', label: 'Custom.Index.Transfer', icon: 'crm-transfer', action: 'transfer', needDemo: isDemo.value, disabled: !(closeFunctionOpen('5') && closeFunctionOpen('6') && closeFunctionOpen('3')), color: '#6c8595' }
     { key: 'transfer', label: 'Custom.Index.Transfer', icon: 'crm-transfer', action: 'transfer', needDemo: isDemo.value, disabled: !(closeFunctionOpen('5') && closeFunctionOpen('6') && closeFunctionOpen('3')), color: '#6c8595' }
 ])
 ])
 const isAfterJuly28 = () => {
 const isAfterJuly28 = () => {
-  const now = new Date();
-  const july28 = new Date(2025, 6, 28, 0, 0, 0); // 月份从0开始,所以7月是6
-  return now >= july28;
+    const now = new Date();
+    const july28 = new Date(2025, 6, 28, 0, 0, 0); // 月份从0开始,所以7月是6
+    return now >= july28;
 }
 }
 const typeMap = computed(() => ({
 const typeMap = computed(() => ({
-  1: t('AccountType.ClassicAccount'),
-  2: t('AccountType.SeniorAccount'),
-  3: !isAfterJuly28() ? t('AccountType.AgencyAccount') : '',
-  5: t('AccountType.SpeedAccount'),
-  6: t('AccountType.SpeedAccount'),
-  7: t('AccountType.StandardAccount'),
-  8: t('AccountType.CentAccount')
+    1: t('AccountType.ClassicAccount'),
+    2: t('AccountType.SeniorAccount'),
+    3: !isAfterJuly28() ? t('AccountType.AgencyAccount') : '',
+    5: t('AccountType.SpeedAccount'),
+    6: t('AccountType.SpeedAccount'),
+    7: t('AccountType.StandardAccount'),
+    8: t('AccountType.CentAccount')
 }));
 }));
 const fieldList = computed(() => ([
 const fieldList = computed(() => ([
-    { label: t('Custom.PaymentHistory.AccountType'), key: 'type', copyable: false,isEnum:true,enums:typeMap.value },
+    { label: t('Custom.PaymentHistory.AccountType'), key: 'type', copyable: false, isEnum: true, enums: typeMap.value },
     { label: t('Label.Leverage'), key: 'actualLeverage', copyable: false },
     { label: t('Label.Leverage'), key: 'actualLeverage', copyable: false },
     { label: t('Label.FloatingPL'), key: 'floatingPL', copyable: false },
     { label: t('Label.FloatingPL'), key: 'floatingPL', copyable: false },
     { label: t('Label.Balance'), key: 'balanceWithSymbol', copyable: false },
     { label: t('Label.Balance'), key: 'balanceWithSymbol', copyable: false },

+ 3 - 4
pages/customer/components/AccountList.vue

@@ -6,13 +6,12 @@
                 <view class="border-0 card-header">
                 <view class="border-0 card-header">
                     <view class="d-flex flex-wrap gap-3 align-items-center justify-content-between mb-3">
                     <view class="d-flex flex-wrap gap-3 align-items-center justify-content-between mb-3">
                         <h3 class="mb-0" style="align-self: flex-start" v-t="'Custom.Index.AccountList'"></h3>
                         <h3 class="mb-0" style="align-self: flex-start" v-t="'Custom.Index.AccountList'"></h3>
-                        <button type="button" class="btn btn-danger btn-shadow waves-effect"
-                            @click="createAccount">
+                        <view type="button" class="btn btn-danger btn-shadow waves-effect cursor-pointer" @click="createAccount">
                             <view class="d-flex align-items-center">
                             <view class="d-flex align-items-center">
                                 <cwg-icon name="crm-plus" :size="14" color="#fff" />
                                 <cwg-icon name="crm-plus" :size="14" color="#fff" />
                                 <text v-t="'Custom.Index.AddAccount'" />
                                 <text v-t="'Custom.Index.AddAccount'" />
                             </view>
                             </view>
-                        </button>
+                        </view>
                     </view>
                     </view>
                 </view>
                 </view>
             </view>
             </view>
@@ -21,7 +20,7 @@
                     <view class="card">
                     <view class="card">
                         <view class="card-header">
                         <view class="card-header">
                             <view class="nav nav-underline card-header-tabs">
                             <view class="nav nav-underline card-header-tabs">
-                                <view class="nav-item cwg-cursor" v-for="(tab, index) in tabs" :key="index"
+                                <view class="nav-item cwg-cursor cursor-pointer" v-for="(tab, index) in tabs" :key="index"
                                     @click="handleTabClick(tab.value)">
                                     @click="handleTabClick(tab.value)">
                                     <view class="nav-link" :class="{ 'active': tab.value === cativeIndex }">{{ tab.text
                                     <view class="nav-link" :class="{ 'active': tab.value === cativeIndex }">{{ tab.text
                                     }}
                                     }}

+ 5 - 1
pages/customer/components/PaymentMethodsList.vue

@@ -1,6 +1,6 @@
 <template>
 <template>
   <view class="row">
   <view class="row">
-    <view class="col-lg-3 col-sm-12 cursor-pointer mb-2" v-for="item in list" :key="item.id" :class="{ disabled: item.disabled }" @click="handleClick(item)">
+    <view class="col-lg-3 col-sm-12 cursor-pointer mb-2 " :data-tooltip="props.title" v-for="item in list" :key="item.id" :class="{ disabled: item.disabled }" @click="handleClick(item)">
       <view class="card hover">
       <view class="card hover">
         <view class="card-header d-flex justify-content-between align-items-center">
         <view class="card-header d-flex justify-content-between align-items-center">
           <h4 class="card-title mb-0">{{ item.name }}</h4>
           <h4 class="card-title mb-0">{{ item.name }}</h4>
@@ -109,6 +109,10 @@
     list: {
     list: {
       type: Array,
       type: Array,
       default: () => []
       default: () => []
+    },
+    title: {
+      type: String,
+      default: ''
     }
     }
   })
   })
 
 

+ 3 - 3
pages/customer/components/TerminalDialog.vue

@@ -2,7 +2,7 @@
     <cwg-popup :title="t('Shop.Index.Transaction')" :visible="props.visible" :showFooters="false"
     <cwg-popup :title="t('Shop.Index.Transaction')" :visible="props.visible" :showFooters="false"
         @update:visible="$emit('update:visible', $event)">
         @update:visible="$emit('update:visible', $event)">
         <view class="card-list">
         <view class="card-list">
-            <view class="card cursor-pointer" @click="handleWebClick">
+            <view class="card cursor-pointer" @click="handleWebClick" :data-tooltip="t('vu.tooltip.t6')" data-placement="top">
                 <view class="card-icon">
                 <view class="card-icon">
                     <cwg-icon name="cwg-mt" :size="48" color="#fff"  />
                     <cwg-icon name="cwg-mt" :size="48" color="#fff"  />
                 </view>
                 </view>
@@ -14,7 +14,7 @@
                     <cwg-icon name="cwg-arrow" :size="24" />
                     <cwg-icon name="cwg-arrow" :size="24" />
                 </view>
                 </view>
             </view>
             </view>
-            <view class="card cursor-pointer" @click="handleDownloadClick">
+            <view class="card cursor-pointer" @click="handleDownloadClick" :data-tooltip="t('vu.tooltip.t8')" data-placement="top">
                 <view class="card-icon">
                 <view class="card-icon">
                     <cwg-icon name="cwg-mt" :size="48" color="#fff"  />
                     <cwg-icon name="cwg-mt" :size="48" color="#fff"  />
                 </view>
                 </view>
@@ -26,7 +26,7 @@
                     <cwg-icon name="cwg-arrow" :size="24"  />
                     <cwg-icon name="cwg-arrow" :size="24"  />
                 </view>
                 </view>
             </view>
             </view>
-            <view class="card cursor-pointer" @click="handleClick">
+            <view class="card cursor-pointer" @click="handleClick" :data-tooltip="t('vu.tooltip.t4',{pageName:t('Downloadpage.item1')})" data-placement="top">
                 <view class="card-content">
                 <view class="card-content">
                     <text class="card-title" v-t="'vu.item13'"></text>
                     <text class="card-title" v-t="'vu.item13'"></text>
                 </view>
                 </view>

+ 7 - 2
pages/customer/dashboard.vue

@@ -112,7 +112,7 @@
                       <text v-if="chartForm.chartType == 3">{{ t('Custom.Index.WithdrawalsStatistical') }}</text>
                       <text v-if="chartForm.chartType == 3">{{ t('Custom.Index.WithdrawalsStatistical') }}</text>
                       <text v-if="chartForm.chartType == 6">{{ t('Custom.Index.ProfitLoss') }}</text>
                       <text v-if="chartForm.chartType == 6">{{ t('Custom.Index.ProfitLoss') }}</text>
                     </view>
                     </view>
-                    <view class="time cursor-pointer" @click="toReload">
+                    <view class="time cursor-pointer" @click="toReload" :data-tooltip="t('vu.tooltip.t7')" data-placement="top">
                       <cwg-icon name="crm-refresh" :size="16" color="#666" />
                       <cwg-icon name="crm-refresh" :size="16" color="#666" />
                       <text class="crm-cursor"> GMT+3 {{ time }}</text>
                       <text class="crm-cursor"> GMT+3 {{ time }}</text>
                     </view>
                     </view>
@@ -346,6 +346,11 @@
   const getDateList = async () => {
   const getDateList = async () => {
     let res = await customApi.CustomDropdown({ platform: "" })
     let res = await customApi.CustomDropdown({ platform: "" })
     if (res.code == Code.StatusOK) {
     if (res.code == Code.StatusOK) {
+      dropDown.value = res.data || []
+      loginOptions.value = (res.data || []).map(item => ({
+        text: item.login,
+        value: item.login,
+      }))
       loginDataOptions.value = res.data.map(item => ({
       loginDataOptions.value = res.data.map(item => ({
         ...item,
         ...item,
         label: `${item.login}`,
         label: `${item.login}`,
@@ -661,7 +666,7 @@
     loading.value = true
     loading.value = true
     goTime()
     goTime()
     await getData()
     await getData()
-    await getDropDown()
+    // await getDropDown()
     await getDateList()
     await getDateList()
     await getAccountList()
     await getAccountList()
     // #ifdef H5
     // #ifdef H5

+ 4 - 3
pages/customer/deposit-select.vue

@@ -36,7 +36,7 @@
                             <view class="card-body pt-0" v-if="step2 && currentTableData.length > 0">
                             <view class="card-body pt-0" v-if="step2 && currentTableData.length > 0">
                                 <view class="tab-content">
                                 <view class="tab-content">
                                     <view>
                                     <view>
-                                        <PaymentMethodsList :list="currentTableData" @select="isShowStep3" />
+                                        <PaymentMethodsList :title="t('Custom.Deposit.Title2')" :list="currentTableData" @select="isShowStep3" />
                                     </view>
                                     </view>
                                 </view>
                                 </view>
                             </view>
                             </view>
@@ -520,7 +520,8 @@ const router = useRouter()
 import tool from "@/global/tool"
 import tool from "@/global/tool"
 import { object } from 'uview-plus/libs/function/test'
 import { object } from 'uview-plus/libs/function/test'
 // import { createUploadRequest } from "@/lib/upload"
 // import { createUploadRequest } from "@/lib/upload"
-
+import { useFilters } from '@/composables/useFilters'
+const { numberDecimal } = useFilters()
 // 常量
 // 常量
 const countries = [
 const countries = [
     "DZ", "AO", "BJ", "BW", "BF", "CM", "CG", "CD", "CI", "DJ", "EG", "ET", "GA", "GM", "GH", "GN", "KE", "MG", "MW", "ML", "MR", "MA", "MZ", "NA", "NE", "NG", "RW", "SN", "SL", "SO", "ZA", "SS", "SD", "TZ", "TG", "TN", "UG", "ZM", "ZW", "LS", "BH", "IR", "IQ", "IL", "JO", "KW", "LB", "OM", "PS", "QA", "SA", "SY", "TR", "AE", "YE", "AR", "BO", "BR", "CL", "CO", "EC", "GY", "PY", "PE", "SR", "UY", "VE", "BZ", "CR", "SV", "GT", "HN", "NI", "PA", "AU", "CA", "AL", "AD", "AM", "AT", "AZ", "BY", "BE", "BA", "BG", "HR", "CY", "CZ", "DK", "EE", "FI", "FR", "GE", "DE", "GR", "HU", "IS", "IE", "IT", "XK", "LV", "LI", "LT", "LU", "MT", "MD", "MC", "ME", "NL", "MK", "NO", "PL", "PT", "RO", "RU", "SM", "RS", "SK", "SI", "ES", "SE", "CH", "UA", "VA",
     "DZ", "AO", "BJ", "BW", "BF", "CM", "CG", "CD", "CI", "DJ", "EG", "ET", "GA", "GM", "GH", "GN", "KE", "MG", "MW", "ML", "MR", "MA", "MZ", "NA", "NE", "NG", "RW", "SN", "SL", "SO", "ZA", "SS", "SD", "TZ", "TG", "TN", "UG", "ZM", "ZW", "LS", "BH", "IR", "IQ", "IL", "JO", "KW", "LB", "OM", "PS", "QA", "SA", "SY", "TR", "AE", "YE", "AR", "BO", "BR", "CL", "CO", "EC", "GY", "PY", "PE", "SR", "UY", "VE", "BZ", "CR", "SV", "GT", "HN", "NI", "PA", "AU", "CA", "AL", "AD", "AM", "AT", "AZ", "BY", "BE", "BA", "BG", "HR", "CY", "CZ", "DK", "EE", "FI", "FR", "GE", "DE", "GR", "HU", "IS", "IE", "IT", "XK", "LV", "LI", "LT", "LU", "MT", "MD", "MC", "ME", "NL", "MK", "NO", "PL", "PT", "RO", "RU", "SM", "RS", "SK", "SI", "ES", "SE", "CH", "UA", "VA",
@@ -1697,7 +1698,7 @@ const showTable = () => {
 }
 }
 const loginComboxOptions = computed(() => {
 const loginComboxOptions = computed(() => {
     return loginOptions.value.map((item) => ({
     return loginOptions.value.map((item) => ({
-        text: `${item.login} - ${groupTypeName(item.type)} - ${t('Custom.Deposit.AvailableBalance')}${groupCurrency(item.currency)}${item.balance}`,
+        text: `${item.login} - ${groupTypeName(item.type)} - ${t('Custom.Deposit.AvailableBalance')}${groupCurrency(item.currency)}${numberDecimal(item.balance)}`,
         value: item.login,
         value: item.login,
       disable: item.disable,
       disable: item.disable,
     }))
     }))

+ 6 - 4
pages/customer/deposit.vue

@@ -144,7 +144,7 @@
                                                 <text>{{ t('Custom.Deposit.EstimatedAmount') + '(' +
                                                 <text>{{ t('Custom.Deposit.EstimatedAmount') + '(' +
                                                     `${channelData.transformCurrency || channelData.currency}` + ')'
                                                     `${channelData.transformCurrency || channelData.currency}` + ')'
                                                     }}</text>
                                                     }}</text>
-                                                <uni-tooltip placement="right">
+                                                <uni-tooltip placement="top">
                                                     <!-- <view class="help-icon">ⓘ</view> -->
                                                     <!-- <view class="help-icon">ⓘ</view> -->
                                                     <cwg-icon name="icon_about us" :size="16" />
                                                     <cwg-icon name="icon_about us" :size="16" />
                                                     <template #content>
                                                     <template #content>
@@ -162,7 +162,7 @@
                                         <h5 class="mb-3">
                                         <h5 class="mb-3">
                                             <view class="label-with-icon">
                                             <view class="label-with-icon">
                                                 <text>{{ t('Custom.Deposit.PromoCode') }}</text>
                                                 <text>{{ t('Custom.Deposit.PromoCode') }}</text>
-                                                <uni-tooltip placement="right">
+                                                <uni-tooltip placement="top">
                                                     <!-- <view class="help-icon">ⓘ</view> -->
                                                     <!-- <view class="help-icon">ⓘ</view> -->
                                                     <cwg-icon name="icon_about us" :size="16" />
                                                     <cwg-icon name="icon_about us" :size="16" />
                                                     <template #content>
                                                     <template #content>
@@ -413,6 +413,8 @@ import { openExternalUrl } from '@/utils/openExternalUrl'
 import tool from "@/global/tool"
 import tool from "@/global/tool"
 import { userToken } from '@/composables/config'
 import { userToken } from '@/composables/config'
 // import { createUploadRequest } from "@/lib/upload"
 // import { createUploadRequest } from "@/lib/upload"
+import { useFilters } from '@/composables/useFilters'
+const { numberDecimal } = useFilters()
 // 常量
 // 常量
 const countries = [
 const countries = [
     "DZ", "AO", "BJ", "BW", "BF", "CM", "CG", "CD", "CI", "DJ", "EG", "ET", "GA", "GM", "GH", "GN", "KE", "MG", "MW", "ML", "MR", "MA", "MZ", "NA", "NE", "NG", "RW", "SN", "SL", "SO", "ZA", "SS", "SD", "TZ", "TG", "TN", "UG", "ZM", "ZW", "LS", "BH", "IR", "IQ", "IL", "JO", "KW", "LB", "OM", "PS", "QA", "SA", "SY", "TR", "AE", "YE", "AR", "BO", "BR", "CL", "CO", "EC", "GY", "PY", "PE", "SR", "UY", "VE", "BZ", "CR", "SV", "GT", "HN", "NI", "PA", "AU", "CA", "AL", "AD", "AM", "AT", "AZ", "BY", "BE", "BA", "BG", "HR", "CY", "CZ", "DK", "EE", "FI", "FR", "GE", "DE", "GR", "HU", "IS", "IE", "IT", "XK", "LV", "LI", "LT", "LU", "MT", "MD", "MC", "ME", "NL", "MK", "NO", "PL", "PT", "RO", "RU", "SM", "RS", "SK", "SI", "ES", "SE", "CH", "UA", "VA",
     "DZ", "AO", "BJ", "BW", "BF", "CM", "CG", "CD", "CI", "DJ", "EG", "ET", "GA", "GM", "GH", "GN", "KE", "MG", "MW", "ML", "MR", "MA", "MZ", "NA", "NE", "NG", "RW", "SN", "SL", "SO", "ZA", "SS", "SD", "TZ", "TG", "TN", "UG", "ZM", "ZW", "LS", "BH", "IR", "IQ", "IL", "JO", "KW", "LB", "OM", "PS", "QA", "SA", "SY", "TR", "AE", "YE", "AR", "BO", "BR", "CL", "CO", "EC", "GY", "PY", "PE", "SR", "UY", "VE", "BZ", "CR", "SV", "GT", "HN", "NI", "PA", "AU", "CA", "AL", "AD", "AM", "AT", "AZ", "BY", "BE", "BA", "BG", "HR", "CY", "CZ", "DK", "EE", "FI", "FR", "GE", "DE", "GR", "HU", "IS", "IE", "IT", "XK", "LV", "LI", "LT", "LU", "MT", "MD", "MC", "ME", "NL", "MK", "NO", "PL", "PT", "RO", "RU", "SM", "RS", "SK", "SI", "ES", "SE", "CH", "UA", "VA",
@@ -1357,7 +1359,7 @@ const submit = async () => {
                         goPayLink.value = Host80 + '/pay/onchainpay.html?params=' + res.data.result + '&language=' + locale.value
                         goPayLink.value = Host80 + '/pay/onchainpay.html?params=' + res.data.result + '&language=' + locale.value
                         openExternalUrl(goPayLink.value, 'pay')
                         openExternalUrl(goPayLink.value, 'pay')
                     }
                     }
-                    if (res.data.type != 5) {
+                    if (res.data.type != 5 && res.data.type != 10) {
                         dialogCheck.value = true
                         dialogCheck.value = true
                         dialogVisible.value = true
                         dialogVisible.value = true
                     }
                     }
@@ -1629,7 +1631,7 @@ const showTable = (type) => {
 }
 }
 const loginComboxOptions = computed(() => {
 const loginComboxOptions = computed(() => {
     return loginOptions.value.map((item) => ({
     return loginOptions.value.map((item) => ({
-        text: `${item.login} - ${groupTypeName(item.type)} - ${t('Custom.Deposit.AvailableBalance')}${groupCurrency(item.currency)}${item.balance}`,
+        text: `${item.login} - ${groupTypeName(item.type)} - ${t('Custom.Deposit.AvailableBalance')}${groupCurrency(item.currency)}${numberDecimal(item.balance)}`,
         value: item.login
         value: item.login
     }))
     }))
 })
 })

+ 4 - 2
pages/customer/trade-history.vue

@@ -136,7 +136,7 @@ const handleSearch = (params) => {
     Object.assign(search, params)
     Object.assign(search, params)
     search.login = params.login && Number(params.login)
     search.login = params.login && Number(params.login)
     search.platform = loginOptions.find(item => item.value == params.login)?.platform || ''
     search.platform = loginOptions.find(item => item.value == params.login)?.platform || ''
-  let startTime = search.date[0].replace(/-/g, "/").split(" ")[0];
+  let startTime = search?.date?.[0]?.replace(/-/g, '/')?.split(' ')[0] || ''
   let start = new Date(startTime).getTime();
   let start = new Date(startTime).getTime();
   let thresholdDate = new Date("2020/10/01").getTime();
   let thresholdDate = new Date("2020/10/01").getTime();
   let shouldUseSharding =
   let shouldUseSharding =
@@ -212,7 +212,9 @@ onLoad(async (e) => {
     // 此时 loginOptions 一定有值了
     // 此时 loginOptions 一定有值了
     nextTick(() => {
     nextTick(() => {
         // 优先跳转传参,没有就默认第一个
         // 优先跳转传参,没有就默认第一个
-        searchParams.value.login = targetLogin ?? loginOptions?.value?.[0]?.value ?? null
+        searchParams.value.login = targetLogin ?? loginOptions[0]?.value ?? null
+        console.log(searchParams.value,222,loginOptions?.value?.[0]?.value,loginOptions[0]?.value);
+        
         handleSearch(searchParams.value)
         handleSearch(searchParams.value)
     })
     })
 })
 })

+ 1 - 1
pages/customer/trade-position.vue

@@ -203,7 +203,7 @@ onLoad(async (e) => {
         })
         })
     })
     })
     nextTick(() => {
     nextTick(() => {
-        searchParams.value.login = targetLogin ?? loginOptions?.value?.[0]?.value ?? null
+        searchParams.value.login = targetLogin ?? loginOptions[0]?.value ?? null
         handleSearch(searchParams.value)
         handleSearch(searchParams.value)
     })
     })
 })
 })

+ 4 - 2
pages/customer/transfer.vue

@@ -83,6 +83,8 @@ import { isAfterJuly28 } from '@/utils/dateUtils'
 import { customApi } from '@/service/custom'
 import { customApi } from '@/service/custom'
 import { financialApi } from '@/service/financial'
 import { financialApi } from '@/service/financial'
 import { ibApi } from '@/service/ib'
 import { ibApi } from '@/service/ib'
+import { useFilters } from '@/composables/useFilters'
+const { numberDecimal } = useFilters()
 // import ServiceA from "@/service/activity"; // 原注释保留
 // import ServiceA from "@/service/activity"; // 原注释保留
 import useUserStore from '@/stores/use-user-store'
 import useUserStore from '@/stores/use-user-store'
 const userStore = useUserStore()
 const userStore = useUserStore()
@@ -330,7 +332,7 @@ const cancle = () => {
 // 转出账户列表 
 // 转出账户列表 
 const withdrawDisplayList = computed(() => {
 const withdrawDisplayList = computed(() => {
     return loginOptions.value.map(item => ({
     return loginOptions.value.map(item => ({
-        text: `${item.login} - ${groupTypeName(item.type)} - ${t('Custom.Deposit.AvailableBalance')}${groupCurrency(item.currency)}${item.balance}`,
+        text: `${item.login} - ${groupTypeName(item.type)} - ${t('Custom.Deposit.AvailableBalance')}${groupCurrency(item.currency)}${numberDecimal(item.balance)}`,
         value: item.login,
         value: item.login,
         disable: isWithdrawDisabled(item)
         disable: isWithdrawDisabled(item)
     }))
     }))
@@ -344,7 +346,7 @@ const currencyOptions = ref([{ value: 'USD', text: 'USD' }])
 // 转入账户列表 
 // 转入账户列表 
 const depositDisplayList = computed(() => {
 const depositDisplayList = computed(() => {
     return toOptions.value.map(item => ({
     return toOptions.value.map(item => ({
-        text: `${item.login} - ${groupTypeName(item.type)} - ${t('Custom.Deposit.AvailableBalance')}${groupCurrency(item.currency)}${item.balance}`,
+        text: `${item.login} - ${groupTypeName(item.type)} - ${t('Custom.Deposit.AvailableBalance')}${groupCurrency(item.currency)}${numberDecimal(item.balance)}`,
         value: item.login,
         value: item.login,
         disable: isDepositDisabled(item)
         disable: isDepositDisabled(item)
     }))
     }))

+ 3 - 2
pages/customer/wallet-transfer.vue

@@ -65,7 +65,8 @@ import { drawApi } from '@/service/draw'
 import Config from '@/config/index'
 import Config from '@/config/index'
 const { Code } = Config
 const { Code } = Config
 const { t, locale } = useI18n()
 const { t, locale } = useI18n()
-
+import { useFilters } from '@/composables/useFilters'
+const { numberDecimal } = useFilters()
 const loading = ref(false)
 const loading = ref(false)
 const flag = ref(false)
 const flag = ref(false)
 const RES = ref('')
 const RES = ref('')
@@ -99,7 +100,7 @@ function groupCurrency(type) {
 }
 }
 const toOptionsDisplay = computed(() => {
 const toOptionsDisplay = computed(() => {
     return toOptions.value.map(item => ({
     return toOptions.value.map(item => ({
-        text: `${item.login} - ${groupTypeName(item.type)} - ${t('Custom.Deposit.AvailableBalance')}${groupCurrency(item.currency)}${item.balance}`,
+        text: `${item.login} - ${groupTypeName(item.type)} - ${t('Custom.Deposit.AvailableBalance')}${groupCurrency(item.currency)}${numberDecimal(item.balance)}`,
         value: item.login
         value: item.login
     }))
     }))
 })
 })

+ 4 - 3
pages/customer/withdrawal-select.vue

@@ -33,7 +33,7 @@
               <view class="card-body pt-0" v-if="step2 && currentTableData.length > 0">
               <view class="card-body pt-0" v-if="step2 && currentTableData.length > 0">
                 <view class="tab-content">
                 <view class="tab-content">
                   <view>
                   <view>
-                    <PaymentMethodsList :list="currentTableData" @select="isShowStep3" />
+                    <PaymentMethodsList :title="t('Custom.Deposit.Title22')" :list="currentTableData" @select="isShowStep3" />
                   </view>
                   </view>
                 </view>
                 </view>
               </view>
               </view>
@@ -429,7 +429,8 @@ import { useConfirm } from '@/hooks/useConfirm'
 const confirm = useConfirm()
 const confirm = useConfirm()
 // 获取组件实例,用于访问全局挂载的属性和方法(替代 this)
 // 获取组件实例,用于访问全局挂载的属性和方法(替代 this)
 const { proxy } = getCurrentInstance()
 const { proxy } = getCurrentInstance()
-
+import { useFilters } from '@/composables/useFilters'
+const { numberDecimal } = useFilters()
 // -------------------- data --------------------
 // -------------------- data --------------------
 const loginValue = ref("")
 const loginValue = ref("")
 const loginValueDoc = ref("")
 const loginValueDoc = ref("")
@@ -802,7 +803,7 @@ const dialogSuccess = computed(() => dialogCheck.value && dialogVisible.value)
 const dialogError = computed(() => dialogCheck.value && !dialogVisible.value)
 const dialogError = computed(() => dialogCheck.value && !dialogVisible.value)
 const loginComboxOptions = computed(() => {
 const loginComboxOptions = computed(() => {
   return loginOptions.value.map((item, index) => ({
   return loginOptions.value.map((item, index) => ({
-    text: `${item.login} - ${groupTypeName(item.type)} - ${t('Custom.Deposit.AvailableBalance')}${groupCurrency(item.currency)}${item.balance}`,
+    text: `${item.login} - ${groupTypeName(item.type)} - ${t('Custom.Deposit.AvailableBalance')}${groupCurrency(item.currency)}${numberDecimal(item.balance)}`,
     value: item.login,
     value: item.login,
     disable: item.disable,
     disable: item.disable,
   }))
   }))

+ 3 - 2
pages/customer/withdrawal.vue

@@ -686,7 +686,8 @@ const confirm = useConfirm()
 const isZh = computed(() => ['cn', 'zhHant'].includes(locale.value))
 const isZh = computed(() => ['cn', 'zhHant'].includes(locale.value))
 // 获取组件实例,用于访问全局挂载的属性和方法(替代 this)
 // 获取组件实例,用于访问全局挂载的属性和方法(替代 this)
 const { proxy } = getCurrentInstance()
 const { proxy } = getCurrentInstance()
-
+import { useFilters } from '@/composables/useFilters'
+const { numberDecimal } = useFilters()
 // -------------------- data --------------------
 // -------------------- data --------------------
 const loginValue = ref("")
 const loginValue = ref("")
 const loginValueDoc = ref("")
 const loginValueDoc = ref("")
@@ -1063,7 +1064,7 @@ const dialogSuccess = computed(() => dialogCheck.value && dialogVisible.value)
 const dialogError = computed(() => dialogCheck.value && !dialogVisible.value)
 const dialogError = computed(() => dialogCheck.value && !dialogVisible.value)
 const loginComboxOptions = computed(() => {
 const loginComboxOptions = computed(() => {
   return loginOptions.value.map((item, index) => ({
   return loginOptions.value.map((item, index) => ({
-    text: `${item.login} - ${groupTypeName(item.type)} - ${t('Custom.Deposit.AvailableBalance')}${groupCurrency(item.currency)}${item.balance}`,
+    text: `${item.login} - ${groupTypeName(item.type)} - ${t('Custom.Deposit.AvailableBalance')}${groupCurrency(item.currency)}${numberDecimal(item.balance)}`,
     value: item.login
     value: item.login
   }))
   }))
 })
 })

+ 3 - 1
pages/follow/components/applySignalDialog.vue

@@ -181,6 +181,8 @@ import { useI18n } from 'vue-i18n'
 import Config from '@/config/index'
 import Config from '@/config/index'
 import { documentaryApi } from '@/service/documentary'
 import { documentaryApi } from '@/service/documentary'
 import {useFollowEnum} from '@/pages/follow/const/enum'
 import {useFollowEnum} from '@/pages/follow/const/enum'
+import { useFilters } from '@/composables/useFilters'
+const { numberDecimal } = useFilters()
 
 
 const props = defineProps({
 const props = defineProps({
   visible: { type: Boolean, default: false },
   visible: { type: Boolean, default: false },
@@ -222,7 +224,7 @@ const accountTypeOptions = [
 
 
 const loginOptionsData = computed(() => {
 const loginOptionsData = computed(() => {
   return props.loginOptions.map(item => ({
   return props.loginOptions.map(item => ({
-    text: `${item.login} - ${groupTypeName(item.type)} - ${t('Custom.Deposit.AvailableBalance')}${groupCurrency(item.currency)}${item.balance}`,
+    text: `${item.login} - ${groupTypeName(item.type)} - ${t('Custom.Deposit.AvailableBalance')}${groupCurrency(item.currency)}${numberDecimal(item.balance)}`,
     value: item.login,
     value: item.login,
     disable: item.balance < 1000
     disable: item.balance < 1000
   }))
   }))

+ 1 - 1
pages/follow/index.vue

@@ -104,7 +104,7 @@
                     <view class="tit">
                     <view class="tit">
                       <text class="tab h3">{{ t('Documentary.console.item23') }}</text>
                       <text class="tab h3">{{ t('Documentary.console.item23') }}</text>
                     </view>
                     </view>
-                    <view class="num cursor-pointer" @click="toDocumentary1">
+                    <view class="num cursor-pointer" @click="toDocumentary1" :data-tooltip="t('Documentary.TundManagement.item11')" data-placement="top">
                       <cwg-icon name="crm-sz" :size="18" color="#6c8595" />
                       <cwg-icon name="crm-sz" :size="18" color="#6c8595" />
                     </view>
                     </view>
                   </view>
                   </view>

+ 42 - 9
pages/follow/trading-center-single.vue

@@ -38,7 +38,12 @@
               </view>
               </view>
             </view>
             </view>
             <view class="chart-container">
             <view class="chart-container">
-              <cwg-charts type="pie" :chartData="symbolSummaryData" :opts="pieOpts" />
+              <cwg-match-media :max-width="991">
+                <cwg-charts type="pie" :chartData="symbolSummaryData" :opts="pieOpts" ontouch />
+              </cwg-match-media>
+              <cwg-match-media :min-width="991">
+                <cwg-charts type="pie" :chartData="symbolSummaryData" :opts="pieOpts" />
+              </cwg-match-media>
             </view>
             </view>
           </view>
           </view>
         </view>
         </view>
@@ -129,7 +134,12 @@
               </view>
               </view>
             </view>
             </view>
             <view class="chart-container">
             <view class="chart-container">
-              <cwg-charts type="line" :chartData="rankingChartData" :opts="rankingChartOpts" />
+              <cwg-match-media :max-width="991">
+                <cwg-charts type="line" :chartData="rankingChartData" :opts="rankingChartOpts" ontouch />
+              </cwg-match-media>
+              <cwg-match-media :min-width="991">
+                <cwg-charts type="line" :chartData="rankingChartData" :opts="rankingChartOpts" />
+              </cwg-match-media>
             </view>
             </view>
           </view>
           </view>
           <!-- 净值曲线 -->
           <!-- 净值曲线 -->
@@ -140,7 +150,7 @@
               </view>
               </view>
             </view>
             </view>
             <view class="chart-container">
             <view class="chart-container">
-              <cwg-charts type="line" :chartData="equityChartData" />
+              <cwg-charts type="line" :chartData="equityChartData" :opts="equityChartOpts"/>
             </view>
             </view>
           </view>
           </view>
         </view>
         </view>
@@ -194,7 +204,9 @@
   import { useI18n } from 'vue-i18n'
   import { useI18n } from 'vue-i18n'
   import { documentaryApi } from '@/service/documentary'
   import { documentaryApi } from '@/service/documentary'
   import { onLoad, onShow } from '@dcloudio/uni-app'
   import { onLoad, onShow } from '@dcloudio/uni-app'
-
+  import { useWindowWidth } from '@/composables/useWindowWidth'
+  const windowWidth = useWindowWidth(300)
+  const isMobile = computed(() => windowWidth.value <= 991)
   const { t } = useI18n()
   const { t } = useI18n()
 
 
   // --- Params ---
   // --- Params ---
@@ -271,26 +283,47 @@
   const DailyIndex1 = ref<any>({})
   const DailyIndex1 = ref<any>({})
 
 
   const symbolSummaryData = ref<any>({ series: [] })
   const symbolSummaryData = ref<any>({ series: [] })
-  const pieOpts = ref({
+  const pieOpts = computed(()=>({
     color: ['#5470C6', '#91CC75', '#EE6666', '#FAC858', '#73C0DE', '#3BA272'],
     color: ['#5470C6', '#91CC75', '#EE6666', '#FAC858', '#73C0DE', '#3BA272'],
     padding: [5, 5, 5, 5],
     padding: [5, 5, 5, 5],
+    enableScroll: true,
     legend: {
     legend: {
       show: true,
       show: true,
       position: 'left',
       position: 'left',
     },
     },
-  })
+    xAxis: {
+      // disableGrid: true,
+      scrollShow: true,
+      itemCount: isMobile.value?3:4,
+    },
+  }))
 
 
   const rankingChartData = ref<any>({ categories: [], series: [] })
   const rankingChartData = ref<any>({ categories: [], series: [] })
-  const rankingChartOpts = ref({
+  const rankingChartOpts = computed(()=>({
+    enableScroll: true,
     yAxis: {
     yAxis: {
       data: [{
       data: [{
         axisLine: false,
         axisLine: false,
         inverse: false,
         inverse: false,
       }],
       }],
     },
     },
-  })
-  const equityChartData = ref<any>({ categories: [], series: [] })
+    xAxis: {
+      // disableGrid: true,
+      scrollShow: true,
+      itemCount: isMobile.value?3:4,
+    },
+  }))
+
 
 
+  const equityChartData = ref<any>({ categories: [], series: [] })
+  const equityChartOpts = computed(()=>({
+    enableScroll: true,
+    xAxis: {
+      // disableGrid: true,
+      scrollShow: true,
+      itemCount: isMobile.value?3:4,
+    },
+  }))
   const getAccountTypeText = (type: number) => {
   const getAccountTypeText = (type: number) => {
     const map: Record<number, string> = {
     const map: Record<number, string> = {
       1: 'AccountType.ClassicAccount',
       1: 'AccountType.ClassicAccount',

+ 4 - 3
pages/follow/trading-center.vue

@@ -34,7 +34,7 @@
 
 
         <!-- 查看图表 -->
         <!-- 查看图表 -->
         <template #view="{ row }">
         <template #view="{ row }">
-          <view class="action-icon" @click="toView(row)">
+          <view class="action-icon cursor-pointer" @click="toView(row)" :data-tooltip="t('vu.tooltip.t15')">
             <cwg-icon name="crm-chart-area" :size="24" color="#000" />
             <cwg-icon name="crm-chart-area" :size="24" color="#000" />
           </view>
           </view>
         </template>
         </template>
@@ -186,7 +186,8 @@ import { useI18n } from 'vue-i18n'
 import { documentaryApi } from '@/service/documentary'
 import { documentaryApi } from '@/service/documentary'
 import useUserStore from '@/stores/use-user-store'
 import useUserStore from '@/stores/use-user-store'
 import {useFollowEnum} from '@/pages/follow/const/enum'
 import {useFollowEnum} from '@/pages/follow/const/enum'
-
+import { useFilters } from '@/composables/useFilters'
+const { numberDecimal } = useFilters()
 const { t, locale } = useI18n()
 const { t, locale } = useI18n()
 const userStore = useUserStore()
 const userStore = useUserStore()
 const userInfo = computed(() => userStore.userInfo)
 const userInfo = computed(() => userStore.userInfo)
@@ -480,7 +481,7 @@ watch(locale, () => {
 const followLoginOptions = computed(() => {
 const followLoginOptions = computed(() => {
   return dialogFllowLoginData.value.map(item => ({
   return dialogFllowLoginData.value.map(item => ({
     value: item.login,
     value: item.login,
-    text: `${item.login} - ${getAccountTypeText(item.loginType)} - ${t('Custom.Deposit.AvailableBalance')}: $${item.balance || 0}`,
+    text: `${item.login} - ${getAccountTypeText(item.loginType)} - ${t('Custom.Deposit.AvailableBalance')}: $${numberDecimal(item.balance || 0)}`,
   }))
   }))
 })
 })
 
 

+ 4 - 4
pages/follow/trading-management.vue

@@ -29,8 +29,8 @@
                             - {{ item.dealLogin || "--" }}
                             - {{ item.dealLogin || "--" }}
                         </view>
                         </view>
                         <view class="caozuo">
                         <view class="caozuo">
-                            <cwg-icon class="cwg-cursor" @click="dialogFllowDele(item)" name="crm-trash-can" />
-                            <cwg-icon class="cwg-cursor" @click="dialogFllowUpdate(item)" name="cog-outline" />
+                            <cwg-icon class="cwg-cursor cursor-pointer" :data-tooltip="t('Documentary.TundManagement.item28')" name="crm-trash-can" @click="dialogFllowDele(item)" />
+                            <cwg-icon class="cwg-cursor cursor-pointer" :data-tooltip="t('Documentary.TundManagement.item31')" name="cog-outline" @click="dialogFllowUpdate(item)" />
                         </view>
                         </view>
                     </view>
                     </view>
                     <view class="account-grid">
                     <view class="account-grid">
@@ -832,7 +832,7 @@ function groupTypeName(type) {
 }
 }
 
 
 const loginOptions = computed(() => loginOptionsLogin.value.map(item => ({
 const loginOptions = computed(() => loginOptionsLogin.value.map(item => ({
-    text: `${item.login} - ${groupTypeName(item.type)} - ${t('Custom.Deposit.AvailableBalance')}${groupCurrency(item.currency)}${item.balance || 0}`,
+    text: `${item.login} - ${groupTypeName(item.type)} - ${t('Custom.Deposit.AvailableBalance')}${groupCurrency(item.currency)}${numberDecimal(item.balance || 0)}`,
     value: item.login,
     value: item.login,
     disable: item.balance < 1000
     disable: item.balance < 1000
 })))
 })))
@@ -940,7 +940,7 @@ const ApplyFllow = async () => {
             flag.value = false;
             flag.value = false;
         }
         }
     } catch (error) {
     } catch (error) {
-        return false;
+        uni.showToast({title:error.msg, icon: 'none'});
     } finally {
     } finally {
         flag.value = false;
         flag.value = false;
     }
     }

+ 3 - 2
pages/follow/transfer.vue

@@ -57,7 +57,8 @@ import { useI18n } from 'vue-i18n'
 import { customApi } from '@/service/custom'
 import { customApi } from '@/service/custom'
 import { documentaryApi } from '@/service/documentary'
 import { documentaryApi } from '@/service/documentary'
 import Config from '@/config/index'
 import Config from '@/config/index'
-
+import { useFilters } from '@/composables/useFilters'
+const { numberDecimal } = useFilters()
 const { Code } = Config
 const { Code } = Config
 const { t, locale } = useI18n()
 const { t, locale } = useI18n()
 
 
@@ -94,7 +95,7 @@ function groupCurrency(type) {
 }
 }
 const toOptionsDisplay = computed(() => {
 const toOptionsDisplay = computed(() => {
     return toOptions.value.map(item => ({
     return toOptions.value.map(item => ({
-        text: `${item.login} - ${groupTypeName(item.type)} - ${t('Custom.Deposit.AvailableBalance')}${groupCurrency(item.currency)}${item.balance}`,
+        text: `${item.login} - ${groupTypeName(item.type)} - ${t('Custom.Deposit.AvailableBalance')}${groupCurrency(item.currency)}${numberDecimal(item.balance)}`,
         value: item.login
         value: item.login
     }))
     }))
 })
 })

+ 4 - 3
pages/ib/agent-transfer.vue

@@ -152,7 +152,8 @@ const userStore = useUserStore()
 const ibInfo = computed(() => {
 const ibInfo = computed(() => {
     return userStore?.userInfo?.ibInfo || {}
     return userStore?.userInfo?.ibInfo || {}
 })
 })
-
+import { useFilters } from '@/composables/useFilters'
+const { numberDecimal } = useFilters()
 const { Code } = Config
 const { Code } = Config
 const { t, locale } = useI18n()
 const { t, locale } = useI18n()
 
 
@@ -360,7 +361,7 @@ function groupTypeName(type) {
 // 转出账户列表
 // 转出账户列表
 const withdrawDisplayList = computed(() => {
 const withdrawDisplayList = computed(() => {
     return loginOptions.value.map(item => ({
     return loginOptions.value.map(item => ({
-        text: `${item.login} - ${groupTypeName(item.type)} - ${t('Custom.Deposit.AvailableBalance')}${groupCurrency(item.currency)}${item.balance}`,
+        text: `${item.login} - ${groupTypeName(item.type)} - ${t('Custom.Deposit.AvailableBalance')}${groupCurrency(item.currency)}${numberDecimal(item.balance)}`,
         value: item.login,
         value: item.login,
         disable: item.closeFunctions?.indexOf('3') != -1 || item.closeFunctions?.indexOf('5') != -1
         disable: item.closeFunctions?.indexOf('3') != -1 || item.closeFunctions?.indexOf('5') != -1
     }))
     }))
@@ -369,7 +370,7 @@ const withdrawDisplayList = computed(() => {
 // 转入账户列表
 // 转入账户列表
 const depositDisplayList = computed(() => {
 const depositDisplayList = computed(() => {
     return toOptions.value.map(item => ({
     return toOptions.value.map(item => ({
-        text: `${item.login} - ${groupTypeName(item.type)} - ${t('Custom.Deposit.AvailableBalance')}${groupCurrency(item.currency)}${item.balance}`,
+        text: `${item.login} - ${groupTypeName(item.type)} - ${t('Custom.Deposit.AvailableBalance')}${groupCurrency(item.currency)}${numberDecimal(item.balance)}`,
         value: item.login
         value: item.login
     }))
     }))
 })
 })

+ 3 - 1
pages/ib/complexReport.vue

@@ -74,6 +74,7 @@
         // { text: t('AccountType.NewSpeedAccount'), value: 6 },
         // { text: t('AccountType.NewSpeedAccount'), value: 6 },
         { text: t('AccountType.StandardAccount'), value: 7 },
         { text: t('AccountType.StandardAccount'), value: 7 },
         { text: t('AccountType.CentAccount'), value: 8 },
         { text: t('AccountType.CentAccount'), value: 8 },
+        { text: t('AccountType.CommissionAccount'), value: -1 },
       ],
       ],
       defaultValue: 0,
       defaultValue: 0,
       clearable: true
       clearable: true
@@ -112,6 +113,7 @@
         6: t('AccountType.NewSpeedAccount'),
         6: t('AccountType.NewSpeedAccount'),
         7: t('AccountType.StandardAccount'),
         7: t('AccountType.StandardAccount'),
         8: t('AccountType.CentAccount'),
         8: t('AccountType.CentAccount'),
+        '-1': t('AccountType.CommissionAccount'),
       },
       },
     },
     },
     // {
     // {
@@ -225,7 +227,7 @@
     },
     },
     {
     {
       prop: 'customName',
       prop: 'customName',
-      label: '客户姓名',
+      label: t('Documentary.Report.item19'),
       align: 'center',
       align: 'center',
       formatter: ({ row }: any) => row.customName || '--',
       formatter: ({ row }: any) => row.customName || '--',
     },
     },

+ 3 - 3
pages/ib/customer.vue

@@ -39,19 +39,19 @@
                                 @reset="handleReset" />
                                 @reset="handleReset" />
           </view>
           </view>
           <view class="search-tabs">
           <view class="search-tabs">
-            <view class="crm-cursor tab-item" :class="{ active: search.belongsType == 1 }"
+            <view class="crm-cursor tab-item cursor-pointer" :data-tooltip="t('Ib.Custom.Unverified')" :class="{ active: search.belongsType == 1 }"
                   @click="chooseBelongsType(1)">
                   @click="chooseBelongsType(1)">
               {{ t('Ib.Custom.Unverified') }}
               {{ t('Ib.Custom.Unverified') }}
               <view v-if="statistics.unverifiedNum !== undefined" class="count-badge">({{ statistics.unverifiedNum }})
               <view v-if="statistics.unverifiedNum !== undefined" class="count-badge">({{ statistics.unverifiedNum }})
               </view>
               </view>
             </view>
             </view>
-            <view class="crm-cursor tab-item" :class="{ active: search.belongsType == 2 }"
+            <view class="crm-cursor tab-item cursor-pointer" :data-tooltip="t('Ib.Custom.Unverified')" :class="{ active: search.belongsType == 2 }"
                   @click="chooseBelongsType(2)">
                   @click="chooseBelongsType(2)">
               {{ t('Ib.Custom.UnDeposit') }}
               {{ t('Ib.Custom.UnDeposit') }}
               <view v-if="statistics.unDepositNum !== undefined" class="count-badge">({{ statistics.unDepositNum }})
               <view v-if="statistics.unDepositNum !== undefined" class="count-badge">({{ statistics.unDepositNum }})
               </view>
               </view>
             </view>
             </view>
-            <view class="crm-cursor tab-item" :class="{ active: search.belongsType == 3 }"
+            <view class="crm-cursor tab-item cursor-pointer" :data-tooltip="t('Ib.Custom.Unverified')" :class="{ active: search.belongsType == 3 }"
                   @click="chooseBelongsType(3)">
                   @click="chooseBelongsType(3)">
               {{ t('Ib.Custom.Deposited') }}
               {{ t('Ib.Custom.Deposited') }}
               <view v-if="statistics.depositNum !== undefined" class="count-badge">({{ statistics.depositNum }})</view>
               <view v-if="statistics.depositNum !== undefined" class="count-badge">({{ statistics.depositNum }})</view>

+ 10 - 4
pages/ib/index.vue

@@ -54,7 +54,7 @@
 <!--            </view>-->
 <!--            </view>-->
 <!--          </view>-->
 <!--          </view>-->
           <uni-col :xs="24" :sm="24" :md="8" :lg="8" :xl="8">
           <uni-col :xs="24" :sm="24" :md="8" :lg="8" :xl="8">
-          <view class="card position-relative stat-card-clickable" @click="toCustomManagement">
+          <view class="card position-relative stat-card-clickable cursor-pointer" @click="toCustomManagement" :data-tooltip="t('vu.tooltip.t4',{pageName:t('Home.page_ib.item2')})" data-placement="top">
             <view class="card-body d-flex gap-3 align-items-center">
             <view class="card-body d-flex gap-3 align-items-center">
               <view class="clearfix pe-2 text-warning">
               <view class="clearfix pe-2 text-warning">
                 <cwg-icon name="crm-user" :size="50" color="#FDBB1F" />
                 <cwg-icon name="crm-user" :size="50" color="#FDBB1F" />
@@ -67,7 +67,7 @@
           </view>
           </view>
           </uni-col>
           </uni-col>
           <uni-col :xs="24" :sm="24" :md="8" :lg="8" :xl="8">
           <uni-col :xs="24" :sm="24" :md="8" :lg="8" :xl="8">
-          <view class="card position-relative stat-card-clickable" @click="toIbManagement">
+          <view class="card position-relative stat-card-clickable cursor-pointer" @click="toIbManagement" :data-tooltip="t('vu.tooltip.t4',{pageName:t('Ib.Custom.Manage2')})" data-placement="top">
             <view class="card-body d-flex gap-3 align-items-center">
             <view class="card-body d-flex gap-3 align-items-center">
               <view class="clearfix pe-2 text-warning">
               <view class="clearfix pe-2 text-warning">
                 <cwg-icon name="crm-ib" :size="50" color="#FDBB1F" />
                 <cwg-icon name="crm-ib" :size="50" color="#FDBB1F" />
@@ -137,10 +137,10 @@
                 <text class="header-title">{{ t('Ib.Index.MAMList') }}</text>
                 <text class="header-title">{{ t('Ib.Index.MAMList') }}</text>
               </view>
               </view>
               <view class="header-right" v-if="showAddMamAccount">
               <view class="header-right" v-if="showAddMamAccount">
-                <cwg-dropdown :menu-list="addMamAccountMenus" @menuClick="handleAddMamAccountMenuClick">
+                <cwg-droplist :menu-list="addMamAccountMenus" @menuClick="handleAddMamAccountMenuClick">
                   <button type="button" class="btn btn-danger btn-shadow waves-effect add-mam-btn">
                   <button type="button" class="btn btn-danger btn-shadow waves-effect add-mam-btn">
                     <cwg-icon name="icon_add" :size="16" color="#fff" />{{ t('Custom.Index.AddAccount') }}</button>
                     <cwg-icon name="icon_add" :size="16" color="#fff" />{{ t('Custom.Index.AddAccount') }}</button>
-                </cwg-dropdown>
+                </cwg-droplist>
               </view>
               </view>
             </view>
             </view>
 
 
@@ -848,6 +848,12 @@ onMounted(async () => {
 .header-right {
 .header-right {
   display: flex;
   display: flex;
   align-items: center;
   align-items: center;
+  @media screen and (max-width: 991px) {
+    :deep(.cwg-dropdown-menu-container) {
+      right: px2rpx(-20) !important;
+      //max-width: px2rpx(400);
+    }
+  }
 }
 }
 
 
 .action-btn {
 .action-btn {

+ 3 - 3
pages/ib/transfer.vue

@@ -19,7 +19,7 @@
                                     <view class="nav-item" role="presentation" v-for="item in tabsConfig"
                                     <view class="nav-item" role="presentation" v-for="item in tabsConfig"
                                         :key="item.value" @click="activeTab = item.value">
                                         :key="item.value" @click="activeTab = item.value">
                                         <view class="nav-link cursor-pointer"
                                         <view class="nav-link cursor-pointer"
-                                            :class="{ 'active': item.value === activeTab }">{{
+                                            :class="{ 'active': item.value === activeTab }" :data-tooltip="item.text" data-placement="top">{{
                                                 item.text }}</view>
                                                 item.text }}</view>
                                     </view>
                                     </view>
                                 </view>
                                 </view>
@@ -202,7 +202,7 @@ import Config from '@/config/index'
 import useUserStore from '@/stores/use-user-store'
 import useUserStore from '@/stores/use-user-store'
 import BonusAgreementPopup from './components/BonusAgreementPopup.vue'
 import BonusAgreementPopup from './components/BonusAgreementPopup.vue'
 import { useFilters } from '@/composables/useFilters'
 import { useFilters } from '@/composables/useFilters'
-const { numberFormat } = useFilters()
+const { numberFormat, numberDecimal } = useFilters()
 const userStore = useUserStore()
 const userStore = useUserStore()
 import { isAfterJuly28 } from '@/utils/dateUtils'
 import { isAfterJuly28 } from '@/utils/dateUtils'
 const ibInfo = computed(() => {
 const ibInfo = computed(() => {
@@ -444,7 +444,7 @@ function groupTypeName(type) {
 const depositDisplayList = computed(() => {
 const depositDisplayList = computed(() => {
     if (activeTab.value != 3) {
     if (activeTab.value != 3) {
         return toInfo.value.map(item => ({
         return toInfo.value.map(item => ({
-            text: `${item.login} - ${groupTypeName(item.type)} - ${t('Custom.Deposit.AvailableBalance')}${groupCurrency(item.currency)}${item.balance}`,
+            text: `${item.login} - ${groupTypeName(item.type)} - ${t('Custom.Deposit.AvailableBalance')}${groupCurrency(item.currency)}${numberDecimal(item.balance)}`,
             value: item.login,
             value: item.login,
             disable: item.status
             disable: item.status
         }))
         }))

+ 4 - 3
pages/ib/withdraw-select.vue

@@ -29,7 +29,7 @@
                             <view class="card-body pt-0" v-if="currentTableData.length > 0">
                             <view class="card-body pt-0" v-if="currentTableData.length > 0">
                                 <view class="tab-content">
                                 <view class="tab-content">
                                     <view>
                                     <view>
-                                        <PaymentMethodsList :list="currentTableData" @select="isShowStep3" />
+                                        <PaymentMethodsList :title="t('Custom.Deposit.Title22')" :list="currentTableData" @select="isShowStep3" />
                                     </view>
                                     </view>
                                 </view>
                                 </view>
                             </view>
                             </view>
@@ -447,7 +447,8 @@ import CwgCheckConfirmPopup from '../customer/components/WithdrawCheckConfirmPop
 import CwgKycPopup from '../customer/components/KycPopup.vue'
 import CwgKycPopup from '../customer/components/KycPopup.vue'
 import PaymentMethodsList from '../customer/components/PaymentMethodsList.vue'
 import PaymentMethodsList from '../customer/components/PaymentMethodsList.vue'
 import { useI18n } from 'vue-i18n'
 import { useI18n } from 'vue-i18n'
-
+import { useFilters } from '@/composables/useFilters'
+const { numberDecimal } = useFilters()
 const { t, locale } = useI18n()
 const { t, locale } = useI18n()
 const { Code, Host80 } = Config
 const { Code, Host80 } = Config
 import useRouter from '@/hooks/useRouter'
 import useRouter from '@/hooks/useRouter'
@@ -858,7 +859,7 @@ const validateAmount = () => {
 // ---------- 计算属性 ----------
 // ---------- 计算属性 ----------
 const loginComboxOptions = computed(() => {
 const loginComboxOptions = computed(() => {
     return loginOptions.value.map((item, index) => ({
     return loginOptions.value.map((item, index) => ({
-        text: `${item.login} - ${groupTypeName(item.type)} - ${t('Custom.Deposit.AvailableBalance')}${groupCurrency(item.currency)}${item.balance}`,
+        text: `${item.login} - ${groupTypeName(item.type)} - ${t('Custom.Deposit.AvailableBalance')}${groupCurrency(item.currency)}${numberDecimal(item.balance)}`,
         value: item.login
         value: item.login
     }))
     }))
 })
 })

+ 4 - 3
pages/ib/withdraw.vue

@@ -302,7 +302,7 @@
                                             <checkbox-group :value="form.agree2 ? ['1'] : []" @change="onAgree2Change">
                                             <checkbox-group :value="form.agree2 ? ['1'] : []" @change="onAgree2Change">
                                                 <label class="checkbox">
                                                 <label class="checkbox">
                                                     <checkbox value="1" :checked="form.agree2" />
                                                     <checkbox value="1" :checked="form.agree2" />
-                                                    <view class="crm-cursor check-text"
+                                                    <view class="crm-cursor check-text cursor-pointer" :data-tooltip="t('vu.tooltip.t13')"
                                                         style="text-decoration: underline; display: inline-block; margin-left: 10px;color: #333;"
                                                         style="text-decoration: underline; display: inline-block; margin-left: 10px;color: #333;"
                                                         @click.stop="dialogCheckTip = true">
                                                         @click.stop="dialogCheckTip = true">
                                                         {{ t('Custom.Withdraw.Des') }}
                                                         {{ t('Custom.Withdraw.Des') }}
@@ -729,7 +729,8 @@ import CwgCheckConfirmPopup from '../customer/components/WithdrawCheckConfirmPop
 import CwgKycPopup from '../customer/components/KycPopup.vue'
 import CwgKycPopup from '../customer/components/KycPopup.vue'
 import PaymentMethodsList from '../customer/components/PaymentMethodsList.vue'
 import PaymentMethodsList from '../customer/components/PaymentMethodsList.vue'
 import { useI18n } from 'vue-i18n'
 import { useI18n } from 'vue-i18n'
-
+import { useFilters } from '@/composables/useFilters'
+const { numberDecimal } = useFilters()
 const { t, locale } = useI18n()
 const { t, locale } = useI18n()
 const { Code, Host80, Host05 } = Config
 const { Code, Host80, Host05 } = Config
 
 
@@ -1176,7 +1177,7 @@ const validateAmount = () => {
 // ---------- 计算属性 ----------
 // ---------- 计算属性 ----------
 const loginComboxOptions = computed(() => {
 const loginComboxOptions = computed(() => {
     return loginOptions.value.map((item, index) => ({
     return loginOptions.value.map((item, index) => ({
-        text: `${item.login} - ${groupTypeName(item.type)} - ${t('Custom.Deposit.AvailableBalance')}${groupCurrency(item.currency)}${item.balance}`,
+        text: `${item.login} - ${groupTypeName(item.type)} - ${t('Custom.Deposit.AvailableBalance')}${groupCurrency(item.currency)}${numberDecimal(item.balance)}`,
         value: item.login
         value: item.login
     }))
     }))
 })
 })

+ 11 - 11
pages/login/index.vue

@@ -65,8 +65,8 @@
 
 
             </view>
             </view>
             <view class="tab-list">
             <view class="tab-list">
-              <view v-for="tab in tabs" :key="tab.value" class="tab-item" :class="{ active: activeTab === tab.value }"
-                @click="handleClick(tab.value)">
+              <view v-for="tab in tabs" :key="tab.value" class="tab-item cursor-pointer" :class="{ active: activeTab === tab.value }"
+                @click="handleClick(tab.value)" :data-tooltip="tab.text" data-placement="top">
                 <text class="tab-label">{{ tab.text }}</text>
                 <text class="tab-label">{{ tab.text }}</text>
               </view>
               </view>
             </view>
             </view>
@@ -98,22 +98,22 @@
                       :label="t('newSignin.item5')" name="记住我" class="wcg-checkbox"></up-checkbox>
                       :label="t('newSignin.item5')" name="记住我" class="wcg-checkbox"></up-checkbox>
                   </up-checkbox-group>
                   </up-checkbox-group>
                 </view>
                 </view>
-                <navigator url="/pages/login/reset" class="account-tip">
+                <navigator url="/pages/login/reset" class="account-tip cursor-pointer" :data-tooltip="t('signin.forget')" data-placement="top">
                   <text>{{ t('signin.forget') }}</text>
                   <text>{{ t('signin.forget') }}</text>
                 </navigator>
                 </navigator>
               </view>
               </view>
-              <view class="cwg-button">
-                <button type="primary" class="" @click="submit">
+              <view class="cwg-button ">
+                <button type="primary" class="" @click="submit" >
                   {{ t('signin.login') }}
                   {{ t('signin.login') }}
                 </button>
                 </button>
               </view>
               </view>
-              <view @click="activeTab = 2" class="account-tip">
+              <view @click="activeTab = 2" class="account-tip cursor-pointer" :data-tooltip="t('signin.signup')" data-placement="top">
                 {{ t('signin.words') }}
                 {{ t('signin.words') }}
                 <text>{{ t('signin.signup') }}</text>
                 <text>{{ t('signin.signup') }}</text>
               </view>
               </view>
               <view class="des-bottom">
               <view class="des-bottom">
                 <text v-t="'vu.login.agreemnet1'"></text>
                 <text v-t="'vu.login.agreemnet1'"></text>
-                <cwg-link type="pdf" url='pdf/Client_Agreement.pdf' target="_blank" :title="'signup.agreemnet2'"
+                <cwg-link type="pdf" url='pdf/Client_Agreement.pdf'  target="_blank" :title="'signup.agreemnet2'"
                           class="desc-link" />
                           class="desc-link" />
                 <text v-t="'signup.agreemnet3'"></text>
                 <text v-t="'signup.agreemnet3'"></text>
                 <cwg-link type="pdf" url='pdf/Terms&Conditions.pdf' target="_blank" :title="'signup.agreemnet4'"
                 <cwg-link type="pdf" url='pdf/Terms&Conditions.pdf' target="_blank" :title="'signup.agreemnet4'"
@@ -221,12 +221,12 @@
                   </uni-forms-item>
                   </uni-forms-item>
                 </uni-forms>
                 </uni-forms>
               </view>
               </view>
-              <view>
+              <view >
                 <button class="regiset-btn" @click="register">
                 <button class="regiset-btn" @click="register">
                   {{ t('signup.button') }}
                   {{ t('signup.button') }}
                 </button>
                 </button>
               </view>
               </view>
-              <view class="login-link">
+              <view class="login-link cursor-pointer" :data-tooltip="t('newSignup.item17')" data-placement="top">
                 <text>{{ t('newSignup.item16') }}</text>
                 <text>{{ t('newSignup.item16') }}</text>
                 <view class="link" @click="activeTab = 1">{{ t('newSignup.item17') }}</view>
                 <view class="link" @click="activeTab = 1">{{ t('newSignup.item17') }}</view>
               </view>
               </view>
@@ -259,7 +259,7 @@
         </uni-col>
         </uni-col>
       </uni-row>
       </uni-row>
     </view>
     </view>
-    <view class="chat-icon" :class="{ 'chat-icon-expanded': isChatIconExpanded, 'chat-icon-hidden': type == 'chat' }"
+    <view class="chat-icon cursor-pointer" :data-tooltip="t('Downloadpage.item16')" :class="{ 'chat-icon-expanded': isChatIconExpanded, 'chat-icon-hidden': type == 'chat' }"
       @click="handleChatIconClick">
       @click="handleChatIconClick">
       <cwg-icon name="chat" color="#fff" />
       <cwg-icon name="chat" color="#fff" />
     </view>
     </view>
@@ -1317,7 +1317,7 @@ button {
 }
 }
 
 
 .cwg-button {
 .cwg-button {
-  padding: px2rpx(34) 0 !important;
+  margin: px2rpx(34) 0 !important;
 
 
   uni-button {
   uni-button {
     border-radius: px2rpx(8)
     border-radius: px2rpx(8)

+ 1 - 1
pages/login/regist.vue

@@ -193,7 +193,7 @@
         </uni-col>
         </uni-col>
       </uni-row>
       </uni-row>
     </view>
     </view>
-    <view class="chat-icon" :class="{ 'chat-icon-expanded': isChatIconExpanded, 'chat-icon-hidden': type == 'chat' }"
+    <view class="chat-icon cursor-pointer" :data-tooltip="t('Downloadpage.item16')" :class="{ 'chat-icon-expanded': isChatIconExpanded, 'chat-icon-hidden': type == 'chat' }"
       @click="handleChatIconClick">
       @click="handleChatIconClick">
       <cwg-icon name="chat" color="#fff" />
       <cwg-icon name="chat" color="#fff" />
     </view>
     </view>

+ 2 - 2
pages/login/reset.vue

@@ -24,10 +24,10 @@
               <uni-easyinput v-model="email" :placeholder="t('newSignup.item7')" class="custom-input">
               <uni-easyinput v-model="email" :placeholder="t('newSignup.item7')" class="custom-input">
               </uni-easyinput>
               </uni-easyinput>
 
 
-              <view class="reset-button">
+              <view class="reset-button" >
                 <button class="btn btn-danger" @click="handleReset">{{ t('forget.forget') }}</button>
                 <button class="btn btn-danger" @click="handleReset">{{ t('forget.forget') }}</button>
               </view>
               </view>
-              <view class="login-link">
+              <view class="login-link" >
                 <button @click="handleLogin" class="link-text">{{ t('forget.cancel') }}</button>
                 <button @click="handleLogin" class="link-text">{{ t('forget.cancel') }}</button>
               </view>
               </view>
             </view>
             </view>

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

@@ -789,7 +789,7 @@
     }
     }
 
 
     .uni-easyinput__content {
     .uni-easyinput__content {
-      background-color: var(--bs-secondary-bg) !important;
+      //background-color: var(--bs-secondary-bg) !important;
     }
     }
   }
   }
 
 

+ 9 - 3
pages/mine/components/KycAuthDialog.vue

@@ -14,9 +14,9 @@
                     <view class="qrcode-wrapper" v-if="qrCodeUrl">
                     <view class="qrcode-wrapper" v-if="qrCodeUrl">
                         <QrCode v-if="qrCodeUrl" :text="qrCodeUrl"></QrCode>
                         <QrCode v-if="qrCodeUrl" :text="qrCodeUrl"></QrCode>
                         <view class="qrcode-url">
                         <view class="qrcode-url">
-                            <view class="url-text cursor-pointer" @click="openExternalUrl(qrCodeUrl)">{{ qrCodeUrl }}
+                            <view class="url-text cursor-pointer" @click="openExternalUrl(qrCodeUrl)" :data-tooltip="t('vu.tooltip.t6')" data-placement="top">{{ qrCodeUrl }}
                             </view>
                             </view>
-                            <cwg-icon name="copy" class="cursor-pointer" :size="20" @click="copyUrl" />
+                            <cwg-icon name="copy" class="cursor-pointer" :size="20" @click="copyUrl" :data-tooltip="t('vu.tooltip.t2')" data-placement="top"/>
                         </view>
                         </view>
                     </view>
                     </view>
                     <!-- 说明 -->
                     <!-- 说明 -->
@@ -142,7 +142,8 @@ const noticeItems = computed(() => [
     t('PersonalManagement.KYCVerify.NoticeItem3'),
     t('PersonalManagement.KYCVerify.NoticeItem3'),
     t('PersonalManagement.KYCVerify.NoticeItem4'),
     t('PersonalManagement.KYCVerify.NoticeItem4'),
     t('PersonalManagement.KYCVerify.NoticeItem5'),
     t('PersonalManagement.KYCVerify.NoticeItem5'),
-    t('PersonalManagement.KYCVerify.NoticeItem6')
+    t('PersonalManagement.KYCVerify.NoticeItem6'),
+    t('PersonalManagement.KYCVerify.NoticeItem7'),
 ])
 ])
 
 
 // 视频错误处理
 // 视频错误处理
@@ -275,6 +276,11 @@ defineExpose({
                     white-space: nowrap;
                     white-space: nowrap;
                     overflow: hidden;
                     overflow: hidden;
                 }
                 }
+                @media screen and (max-width: 768px) {
+                    .url-text {
+                        max-width: px2rpx(200);
+                    }
+                }
             }
             }
         }
         }
 
 

+ 4 - 24
pages/mine/improveImmediately.vue

@@ -516,36 +516,16 @@
           </uni-row>
           </uni-row>
           <view class="descending">
           <view class="descending">
             <p class="title">
             <p class="title">
-              <span>{{ t('ImproveImmediately.Title.AddressDescription') }}</span>
+              <span>{{ t('ImproveImmediately.item1') }}</span>
             </p>
             </p>
             <p class="des">
             <p class="des">
-              <span class="dian">-</span>
-              <span>{{ t('ImproveImmediately.Content.ProofAddress1') }}</span>
-            </p>
-            <p class="des">
-              <span class="dian">-</span>
-              <span>{{ t('ImproveImmediately.Content.ProofAddress2') }}</span>
-            </p>
-            <p class="des">
-              <span class="dian">-</span>
-              <span>{{ t('ImproveImmediately.Content.ProofAddress3') }}</span>
+              <span>{{ t('ImproveImmediately.item2') }}</span>
             </p>
             </p>
             <p class="des">
             <p class="des">
-              <span class="dian" v-if="['cn', 'zhHant'].indexOf(locale) != -1">·</span>
-              <span class="dian" v-if="locale == 'en'">-</span>
-              <span>{{ t('ImproveImmediately.Content.ProofAddress4') }}</span>
+              <span>{{ t('ImproveImmediately.item3') }}</span>
             </p>
             </p>
             <p class="des">
             <p class="des">
-              <span class="dian">·</span>
-              <span>{{ t('ImproveImmediately.Content.ProofAddress6') }}</span>
-            </p>
-            <p class="des" v-if="locale == 'en'">
-              <span class="dian">·</span>
-              <span>{{ t('ImproveImmediately.Content.ProofAddress7') }}</span>
-            </p>
-            <p class="des" v-if="locale == 'en'">
-              <span class="dian">·</span>
-              <span>{{ t('ImproveImmediately.Content.ProofAddress8') }}</span>
+              <span>{{ t('ImproveImmediately.item4') }}</span>
             </p>
             </p>
           </view>
           </view>
         </view>
         </view>

+ 1 - 1
static/appUrl/url.json

@@ -1,5 +1,5 @@
 {
 {
     "app1": "",
     "app1": "",
-    "app2": "",
+    "app2": "https://secure.cwgbroker.club/wgt/CWGCenter.apk",
     "app3": "https://testflight.apple.com/join/qVWT1jVU"
     "app3": "https://testflight.apple.com/join/qVWT1jVU"
 }
 }

BIN
static/res 4/CustomLaunch.zip


+ 16 - 1
static/scss/global/global.scss

@@ -662,23 +662,35 @@ uni-content {
     padding-left: px2rpx(280) !important;
     padding-left: px2rpx(280) !important;
 }
 }
 
 
+uni-left-window.collapsed:hover {
+  width: px2rpx(280) !important;
+  white-space: nowrap;
+  overflow: hidden;
+}
 uni-left-window.collapsed {
 uni-left-window.collapsed {
     width: px2rpx(64) !important;
     width: px2rpx(64) !important;
     white-space: nowrap;
     white-space: nowrap;
     overflow: hidden;
     overflow: hidden;
+    transition: width 281ms cubic-bezier(0.4, 0, 0.2, 1);
 }
 }
 
 
 uni-content.collapsed {
 uni-content.collapsed {
     padding-left: px2rpx(64) !important;
     padding-left: px2rpx(64) !important;
+    transition: padding-left 281ms cubic-bezier(0.4, 0, 0.2, 1);
 }
 }
 
 
 @media screen and (max-width: 1100px) {
 @media screen and (max-width: 1100px) {
     uni-left-window:not(.collapsed) {
     uni-left-window:not(.collapsed) {
         width: px2rpx(280) !important;
         width: px2rpx(280) !important;
+        transition: width 281ms cubic-bezier(0.4, 0, 0.2, 1);
     }
     }
-
+  uni-left-window:hover {
+    width: px2rpx(280) !important;
+    transition: width 281ms cubic-bezier(0.4, 0, 0.2, 1);
+  }
     uni-left-window.collapsed {
     uni-left-window.collapsed {
         width: px2rpx(64) !important;
         width: px2rpx(64) !important;
+        transition: width 281ms cubic-bezier(0.4, 0, 0.2, 1);
     }
     }
 
 
     uni-content:not(.collapsed) {
     uni-content:not(.collapsed) {
@@ -706,6 +718,9 @@ uni-content.collapsed {
     uni-content.collapsed {
     uni-content.collapsed {
         padding-left: 0 !important;
         padding-left: 0 !important;
     }
     }
+  uni-left-window:hover {
+    width: px2rpx(280) !important;
+  }
 }
 }
 
 
 .search-btn {
 .search-btn {

+ 4 - 4
static/scss/global/vu.css

@@ -17306,14 +17306,14 @@ html[data-bs-theme=dark] .text-bg-light {
 }
 }
 
 
 .btn:not(.dropdown-toggle) {
 .btn:not(.dropdown-toggle) {
-  transform: scale(1.002);
-  transition: all 0.125s ease-in-out;
+  /* transform: scale(1.002);
+  transition: all 0.125s ease-in-out; */
 }
 }
 
 
 .btn[class*=btn-]:active:not(.dropdown-toggle),
 .btn[class*=btn-]:active:not(.dropdown-toggle),
 .btn[class*=btn-].active:not(.dropdown-toggle) {
 .btn[class*=btn-].active:not(.dropdown-toggle) {
-  transform: scale(0.982);
-  transition: all 0.125s ease-in-out;
+  /*transform: scale(0.982);*/
+  /*transition: all 0.125s ease-in-out;*/
 }
 }
 
 
 .btn-icon {
 .btn-icon {

+ 1 - 0
uni_modules/uni-combox/components/uni-combox/uni-combox.vue

@@ -222,6 +222,7 @@ export default {
 }
 }
 
 
 .uni-combox__selector {
 .uni-combox__selector {
+  --bs-bg-opacity:1;
 	/* #ifndef APP-NVUE */
 	/* #ifndef APP-NVUE */
 	box-sizing: border-box;
 	box-sizing: border-box;
 	/* #endif */
 	/* #endif */

+ 1 - 1
uni_modules/uni-datetime-picker/components/uni-datetime-picker/time-picker.vue

@@ -1,5 +1,5 @@
 <template>
 <template>
-	<view class="uni-datetime-picker cursor-pointer">
+	<view class="uni-datetime-picker cursor-pointer" :data-tooltip="t('vu.tooltip.t1')" data-placement="top">
 		<view @click="initTimePicker">
 		<view @click="initTimePicker">
 			<slot>
 			<slot>
 				<view class="uni-datetime-picker-timebox-pointer"
 				<view class="uni-datetime-picker-timebox-pointer"

+ 1 - 1
utils/openExternalUrl.js

@@ -13,7 +13,7 @@ export function openExternalUrl(url, type, options = {}) {
 
 
   if (type === 'pay') {
   if (type === 'pay') {
     // #ifdef APP-PLUS
     // #ifdef APP-PLUS
-    const webviewUrl = `/pages/common/webview?url=${url}&title=${encodeURIComponent(title)}`
+    const webviewUrl = `/pages/common/webview?url=${encodeURIComponent(url)}&title=${encodeURIComponent(title)}`
     uni.navigateTo({ url: webviewUrl })
     uni.navigateTo({ url: webviewUrl })
     // #endif
     // #endif
 
 

+ 435 - 0
utils/useMouseTooltip.js

@@ -0,0 +1,435 @@
+// useMouseTooltip.js
+
+let tooltipEl = null
+let currentTarget = null
+let observer = null
+
+let isInitialized = false
+
+let moveHandler = null
+let overHandler = null
+let outHandler = null
+let pointerDownHandler = null
+
+let rafId = null
+
+let showTimer = null
+let hideTimer = null
+
+let lastMouseX = 0
+let lastMouseY = 0
+
+export function useMouseTooltip() {
+    const PADDING = 16
+    const OFFSET = 15
+
+    const SHOW_DELAY = 300
+    const HIDE_DELAY = 80
+
+    function createTooltip() {
+        if (tooltipEl) return
+
+        tooltipEl = document.createElement('div')
+
+        tooltipEl.className = 'cursor-pointer-tooltip'
+
+        tooltipEl.style.cssText = `
+            position: fixed;
+            z-index: 2147483647;
+            pointer-events: none;
+
+            left: 0;
+            top: 0;
+
+            background: rgba(var(--bs-body-bg-rgb),1);
+            color: var(--bs-emphasis-color);
+
+            border-radius: .5rem;
+            box-shadow: 0 0 10px rgba(0,0,0,.1);
+
+            font-size: .8125rem;
+            line-height: 1.4;
+            padding: .375rem .5rem;
+
+            white-space: nowrap;
+
+            opacity: 0;
+            visibility: hidden;
+
+            transform: scale(.85);
+
+            transition:
+                opacity .18s ease,
+                transform .18s ease;
+
+            will-change:
+                opacity,
+                transform,
+                left,
+                top;
+        `
+
+        document.body.appendChild(tooltipEl)
+    }
+
+    function getTooltipSize() {
+        if (!tooltipEl) {
+            return {
+                width: 0,
+                height: 0
+            }
+        }
+
+        const rect = tooltipEl.getBoundingClientRect()
+
+        return {
+            width: rect.width,
+            height: rect.height
+        }
+    }
+
+    function updatePosition(clientX, clientY) {
+        if (!tooltipEl) return
+
+        const viewportWidth = window.innerWidth
+        const viewportHeight = window.innerHeight
+
+        const { width, height } = getTooltipSize()
+
+        let x = clientX + OFFSET
+        let y = clientY + OFFSET
+
+        if (x + width > viewportWidth - PADDING) {
+            x = clientX - width - OFFSET
+        }
+
+        if (y + height > viewportHeight - PADDING) {
+            y = clientY - height - OFFSET
+        }
+
+        x = Math.max(PADDING, x)
+        y = Math.max(PADDING, y)
+
+        tooltipEl.style.left = `${x}px`
+        tooltipEl.style.top = `${y}px`
+    }
+
+    function disconnectObserver() {
+        if (observer) {
+            observer.disconnect()
+            observer = null
+        }
+    }
+
+    function watchTooltip(target) {
+        disconnectObserver()
+
+        observer = new MutationObserver(() => {
+            if (
+                !tooltipEl ||
+                currentTarget !== target
+            ) {
+                return
+            }
+
+            tooltipEl.textContent =
+                target.dataset.tooltip || ''
+
+            updatePosition(
+                lastMouseX,
+                lastMouseY
+            )
+        })
+
+        observer.observe(target, {
+            attributes: true,
+            attributeFilter: ['data-tooltip']
+        })
+    }
+
+    function forceHideTooltip() {
+        disconnectObserver()
+
+        if (showTimer) {
+            clearTimeout(showTimer)
+            showTimer = null
+        }
+
+        if (hideTimer) {
+            clearTimeout(hideTimer)
+            hideTimer = null
+        }
+
+        currentTarget = null
+
+        if (!tooltipEl) return
+
+        tooltipEl.style.opacity = '0'
+        tooltipEl.style.visibility = 'hidden'
+        tooltipEl.style.transform = 'scale(.85)'
+    }
+
+    function showTooltip(e, target) {
+        const text =
+            target.dataset.tooltip || ''
+
+        if (!text) return
+
+        createTooltip()
+
+        if (hideTimer) {
+            clearTimeout(hideTimer)
+            hideTimer = null
+        }
+
+        if (showTimer) {
+            clearTimeout(showTimer)
+            showTimer = null
+        }
+
+        currentTarget = target
+
+        lastMouseX = e.clientX
+        lastMouseY = e.clientY
+
+        tooltipEl.textContent = text
+
+        watchTooltip(target)
+
+        updatePosition(
+            lastMouseX,
+            lastMouseY
+        )
+
+        tooltipEl.style.opacity = '0'
+        tooltipEl.style.visibility = 'hidden'
+        tooltipEl.style.transform = 'scale(.85)'
+
+        showTimer = setTimeout(() => {
+            if (
+                !currentTarget ||
+                !document.contains(currentTarget)
+            ) {
+                forceHideTooltip()
+                return
+            }
+
+            if (currentTarget !== target) {
+                return
+            }
+
+            tooltipEl.style.visibility =
+                'visible'
+
+            requestAnimationFrame(() => {
+                tooltipEl.style.opacity = '1'
+                tooltipEl.style.transform =
+                    'scale(1)'
+            })
+        }, SHOW_DELAY)
+    }
+
+    function hideTooltip() {
+        if (!tooltipEl) return
+
+        disconnectObserver()
+
+        if (showTimer) {
+            clearTimeout(showTimer)
+            showTimer = null
+        }
+
+        if (hideTimer) {
+            clearTimeout(hideTimer)
+        }
+
+        hideTimer = setTimeout(() => {
+            tooltipEl.style.opacity = '0'
+            tooltipEl.style.transform =
+                'scale(.85)'
+
+            currentTarget = null
+
+            setTimeout(() => {
+                if (
+                    !tooltipEl ||
+                    currentTarget
+                ) {
+                    return
+                }
+
+                tooltipEl.style.visibility =
+                    'hidden'
+            }, 180)
+        }, HIDE_DELAY)
+    }
+
+    function init() {
+        if (isInitialized) return
+
+        isInitialized = true
+
+        moveHandler = (e) => {
+            if (
+                !currentTarget ||
+                !tooltipEl
+            ) {
+                return
+            }
+
+            if (
+                !document.contains(currentTarget)
+            ) {
+                forceHideTooltip()
+                return
+            }
+
+            lastMouseX = e.clientX
+            lastMouseY = e.clientY
+
+            if (rafId) return
+
+            rafId = requestAnimationFrame(() => {
+                rafId = null
+
+                if (
+                    !currentTarget ||
+                    !document.contains(currentTarget)
+                ) {
+                    forceHideTooltip()
+                    return
+                }
+
+                updatePosition(
+                    lastMouseX,
+                    lastMouseY
+                )
+            })
+        }
+
+        overHandler = (e) => {
+            const target =
+                e.target.closest(
+                    '.cursor-pointer'
+                )
+
+            if (!target) return
+
+            if (
+                target === currentTarget
+            ) {
+                return
+            }
+
+            showTooltip(e, target)
+        }
+
+        outHandler = (e) => {
+            const target =
+                e.target.closest(
+                    '.cursor-pointer'
+                )
+
+            if (!target) return
+
+            if (
+                target !== currentTarget
+            ) {
+                return
+            }
+
+            if (
+                e.relatedTarget &&
+                target.contains(
+                    e.relatedTarget
+                )
+            ) {
+                return
+            }
+
+            hideTooltip()
+        }
+
+        pointerDownHandler = () => {
+            forceHideTooltip()
+        }
+
+        document.addEventListener(
+            'mouseover',
+            overHandler,
+            true
+        )
+
+        document.addEventListener(
+            'mouseout',
+            outHandler,
+            true
+        )
+
+        document.addEventListener(
+            'mousemove',
+            moveHandler,
+            true
+        )
+
+        document.addEventListener(
+            'pointerdown',
+            pointerDownHandler,
+            true
+        )
+    }
+
+    function cleanup() {
+        forceHideTooltip()
+
+        if (rafId) {
+            cancelAnimationFrame(rafId)
+            rafId = null
+        }
+
+        if (moveHandler) {
+            document.removeEventListener(
+                'mousemove',
+                moveHandler,
+                true
+            )
+        }
+
+        if (overHandler) {
+            document.removeEventListener(
+                'mouseover',
+                overHandler,
+                true
+            )
+        }
+
+        if (outHandler) {
+            document.removeEventListener(
+                'mouseout',
+                outHandler,
+                true
+            )
+        }
+
+        if (pointerDownHandler) {
+            document.removeEventListener(
+                'pointerdown',
+                pointerDownHandler,
+                true
+            )
+        }
+
+        moveHandler = null
+        overHandler = null
+        outHandler = null
+        pointerDownHandler = null
+
+        currentTarget = null
+
+        isInitialized = false
+    }
+
+    init()
+
+    return cleanup
+}

+ 24 - 13
windows/left-window.vue

@@ -1,6 +1,5 @@
 <template>
 <template>
-  <view class="left-window-root">
-    <view class="cwg-sidebar bg-body" :class="{ 'sidebar-collapsed': isCollapsed, 'dark': isDark }">
+    <view class="cwg-sidebar bg-body" :class="{ 'sidebar-collapsed': isCollapsed, 'dark': isDark }" @mouseenter="handleHoverEnter" @mouseleave="handleHoverLeave">
       <view class="menu-list">
       <view class="menu-list">
       <view class="menu" v-for="(item, index) in menus" :key="item.path + index">
       <view class="menu" v-for="(item, index) in menus" :key="item.path + index">
         <view class="menu-item" @click="handleClick(index)">
         <view class="menu-item" @click="handleClick(index)">
@@ -41,7 +40,6 @@
       </view>
       </view>
     </view>
     </view>
     </view>
     </view>
-  </view>
 </template>
 </template>
 
 
 <script lang="ts" setup>
 <script lang="ts" setup>
@@ -56,12 +54,25 @@ const { userInfo } = storeToRefs(userStore)
 import useGlobalStore from '@/stores/use-global-store'
 import useGlobalStore from '@/stores/use-global-store'
 const globalStore = useGlobalStore()
 const globalStore = useGlobalStore()
 const isDark = computed(() => globalStore.theme === 'dark')
 const isDark = computed(() => globalStore.theme === 'dark')
-const { isCollapsed, syncCollapsedFromDom } = useLeftSidebarCollapse()
+const { isCollapsed, isCollapsedByToggle, syncCollapsedFromDom,toggleLeftSidebar } = useLeftSidebarCollapse()
 
 
 onMounted(() => {
 onMounted(() => {
   syncCollapsedFromDom()
   syncCollapsedFromDom()
 })
 })
 
 
+// 处理侧边栏 hover 展开/折叠
+const handleHoverEnter = () => {
+  if (isCollapsed.value) {
+    toggleLeftSidebar(false)
+  }
+}
+
+const handleHoverLeave = () => {
+  if (!isCollapsed.value && isCollapsedByToggle.value) {
+    toggleLeftSidebar(false)
+  }
+}
+
 // ib按钮展示
 // ib按钮展示
 const ibStatus = computed(() => {
 const ibStatus = computed(() => {
   return userInfo.value?.customInfo?.ibInvalid == 0 && !!userInfo.value?.ibInfo
   return userInfo.value?.customInfo?.ibInvalid == 0 && !!userInfo.value?.ibInfo
@@ -70,11 +81,6 @@ const ibStatus = computed(() => {
 <style scoped lang="scss">
 <style scoped lang="scss">
 @import "@/uni.scss";
 @import "@/uni.scss";
 
 
-.left-window-root {
-  position: relative;
-  width: 100%;
-  height: calc(100vh - 56px);
-}
 
 
 .cwg-sidebar {
 .cwg-sidebar {
   width: 100%;
   width: 100%;
@@ -191,12 +197,17 @@ const ibStatus = computed(() => {
     gap: px2rpx(8);
     gap: px2rpx(8);
   }
   }
 }
 }
-
-.sidebar-collapsed .menu-label,
-.sidebar-collapsed .submenu-box,
-.sidebar-collapsed .chevron-icon {
+.sidebar-collapsed:not(:hover) .menu-label,
+.sidebar-collapsed:not(:hover) .submenu-box,
+.sidebar-collapsed:not(:hover) .chevron-icon {
   display: none;
   display: none;
 }
 }
+.sidebar-collapsed:hover .menu-label,
+.sidebar-collapsed:hover .submenu-box,
+.sidebar-collapsed:hover .chevron-icon {
+  display: block;
+  //display: none;
+}
 
 
 .sidebar-collapsed .fixed {
 .sidebar-collapsed .fixed {
   display: flex;
   display: flex;

+ 1 - 1
windows/top-window.vue

@@ -5,7 +5,7 @@
         @click="openLeftDrawer" />
         @click="openLeftDrawer" />
       <image class="left-img" v-else src="/static/images/vu/logo-full-white.svg" mode="widthFix" alt="logo"
       <image class="left-img" v-else src="/static/images/vu/logo-full-white.svg" mode="widthFix" alt="logo"
         @click="openLeftDrawer" />
         @click="openLeftDrawer" />
-      <div class="cid" v-if="visible"  @click="copy(cId)">{{t('newSignin.item1')}} {{name?(name + ' - '):''}}{{ cId}}</div>
+      <div class="cid cursor-pointer" v-if="visible"  @click="copy(cId)" :data-tooltip="`${t('vu.tooltip.t2')}-${cId}`">{{t('newSignin.item1')}} {{name?(name + ' - '):''}}{{ cId}}</div>
     </div>
     </div>
     <div class="right" v-if="visible">
     <div class="right" v-if="visible">
       <cwg-download />
       <cwg-download />